ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kaXNwbGF5L21zbS9zZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKaW5kZXggMzNkZTU5Ni4uOGJjNTJkNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKQEAgLTIzNyw2ICsyMzcsMTEgQEAKIAkJCQljb250cm9sIHJlZ2lzdGVyLiBOdW1iZXIgb2Ygb2Zmc2V0cyBkZWZpbmVkIHNob3VsZAogCQkJCW1hdGNoIHRoZSBudW1iZXIgb2Ygb2Zmc2V0cyBkZWZpbmVkIGluCiAJCQkJcHJvcGVydHk6IHFjb20sc2RlLXdiLW9mZgorLSBxY29tLHNkZS1yZWctZG1hLW9mZjogICAgICAgICBPZmZzZXQgb2YgdGhlIHJlZ2lzdGVyIGRtYSBoYXJkd2FyZSBibG9jayBmcm9tCisJCQkJInJlZ2RtYV9waHlzIiBkZWZpbmVkIGluIHJlZyBwcm9wZXJ0eS4KKy0gcWNvbSxzZGUtcmVnLWRtYS12ZXJzaW9uOglWZXJzaW9uIG9mIHRoZSByZWcgZG1hIGhhcmR3YXJlIGJsb2NrLgorLSBxY29tLHNkZS1yZWctZG1hLXRyaWdnZXItb2ZmOiBPZmZzZXQgb2YgdGhlIGx1dCBkbWEgdHJpZ2dlciByZWcgZnJvbSAibWRwX3BoeXMiCisJCQkJZGVmaW5lZCBpbiByZWcgcHJvcGVydHkuCiBCdXMgU2NhbGluZyBEYXRhOgogLSBxY29tLG1zbS1idXMsbmFtZToJCVN0cmluZyBwcm9wZXJ0eSBkZXNjcmliaW5nIGNsaWVudCBuYW1lLgogLSBxY29tLG1zbS1idXMsbnVtLWNhc2VzOglUaGlzIGlzIHRoZSBudW1iZXIgb2YgQnVzIFNjYWxpbmcgdXNlIGNhc2VzCkBAIC0yNjgsMTAgKzI3MywxMiBAQAogICAgIGNvbXBhdGlibGUgPSAicWNvbSxzZGUta21zIjsKICAgICByZWcgPSA8MHgwMDkwMDAwMCAweDkwMDAwPiwKICAgICAgICAgICA8MHgwMDliMDAwMCAweDEwNDA+LAotICAgICAgICAgIDwweDAwOWI4MDAwIDB4MTA0MD47CisgICAgICAgICAgPDB4MDA5YjgwMDAgMHgxMDQwPiwKKyAgICAgICAgICA8MHgwYWVhYzAwMCAweDAwZjA+OwogICAgIHJlZy1uYW1lcyA9ICJtZHBfcGh5cyIsCiAgICAgICAidmJpZl9waHlzIiwKLSAgICAgICJ2YmlmX25ydF9waHlzIjsKKyAgICAgICJ2YmlmX25ydF9waHlzIiwKKyAgICAgICJyZWdkbWFfcGh5cyI7CiAgICAgY2xvY2tzID0gPCZjbG9ja19tbXNzIGNsa19tZHNzX2FoYl9jbGs+LAogICAgICAgPCZjbG9ja19tbXNzIGNsa19tZHNzX2F4aV9jbGs+LAogICAgICAgPCZjbG9ja19tbXNzIGNsa19tZHBfY2xrX3NyYz4sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbWVyYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbWVyYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1NDhjYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtZXJhLnR4dApAQCAtMCwwICsxLDEzIEBACisqIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBNU00gQ2FtZXJhCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOgorICAgIC0gInFjb20sY2FtLXJlcS1tZ3IiCistIHFjb20sc2Vuc29yLW1hbnVhbC1wcm9iZSA6IHNwZWNpZnkgaWYgc2Vuc29yIHByb2JlcyBhdCBrZXJuZWwgYm9vdCB0aW1lIG9yIHVzZXIgZHJpdmVuCisKK0V4YW1wbGU6CisKKyAgIHFjb20sY2FtLXJlcS1tZ3IgeworICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxjYW0tcmVxLW1nciI7CisgICAgICAgcWNvbSxzZW5zb3ItbWFudWFsLXByb2JlOworICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sd2NkLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSx3Y2QtcGluY3RybC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkOGI3ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sd2NkLXBpbmN0cmwudHh0CkBAIC0wLDAgKzEsMTM4IEBACitRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gV0NEIEdQSU8gYmxvY2sKKworVGhpcyBiaW5kaW5nIGRlc2NyaWJlcyB0aGUgR1BJTyBibG9jayBmb3VuZCBpbiB0aGUgV0NEOTM0WCBzZXJpZXMgb2YKK2F1ZGlvIGNvZGVjJ3MgZnJvbSBRVEkuCisKKy0gY29tcGF0aWJsZToKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IG11c3QgYmUgInFjb20sd2NkLXBpbmN0cmwiCisKKy0gcWNvbSxudW0tZ3Bpb3M6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHUzMj4KKwlEZWZpbml0aW9uOiBOdW1iZXIgb2YgR1BJTydzIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlcgorCistIGdwaW8tY29udHJvbGxlcjoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBNYXJrIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIEdQSU8gY29udHJvbGxlcgorCistICNncGlvLWNlbGxzOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogTXVzdCBiZSAyOworCQkgICAgdGhlIGZpcnN0IGNlbGwgd2lsbCBiZSB1c2VkIHRvIGRlZmluZSBncGlvIG51bWJlciBhbmQgdGhlCisJCSAgICBzZWNvbmQgZGVub3RlcyB0aGUgZmxhZ3MgZm9yIHRoaXMgZ3BpbworCitQbGVhc2UgcmVmZXIgdG8gLi4vZ3Bpby9ncGlvLnR4dCBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIEdQSU8gYmluZGluZ3MuCisKK1BsZWFzZSByZWZlciB0byBwaW5jdHJsLWJpbmRpbmdzLnR4dCBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgZGV0YWlscyBvZiB0aGUKK2NvbW1vbiBwaW5jdHJsIGJpbmRpbmdzIHVzZWQgYnkgY2xpZW50IGRldmljZXMsIGluY2x1ZGluZyB0aGUgbWVhbmluZyBvZiB0aGUKK3BocmFzZSAicGluIGNvbmZpZ3VyYXRpb24gbm9kZSIuCisKK1RoZSBwaW4gY29uZmlndXJhdGlvbiBub2RlcyBhY3QgYXMgYSBjb250YWluZXIgZm9yIGFuIGFyYml0cmFyeSBudW1iZXIgb2YKK3N1Ym5vZGVzLiBFYWNoIG9mIHRoZXNlIHN1Ym5vZGVzIHJlcHJlc2VudHMgc29tZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIGEKK3BpbiBvciBhIGxpc3Qgb2YgcGlucy4gVGhpcyBjb25maWd1cmF0aW9uIGNhbiBpbmNsdWRlIHRoZQorbXV4IGZ1bmN0aW9uIHRvIHNlbGVjdCBvbiB0aG9zZSBwaW4ocyksIGFuZCB2YXJpb3VzIHBpbiBjb25maWd1cmF0aW9uCitwYXJhbWV0ZXJzLCBhcyBsaXN0ZWQgYmVsb3cuCisKKworU1VCTk9ERVM6CisKK1RoZSBuYW1lIG9mIGVhY2ggc3Vibm9kZSBpcyBub3QgaW1wb3J0YW50OyBhbGwgc3Vibm9kZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKK2FuZCBwcm9jZXNzZWQgcHVyZWx5IGJhc2VkIG9uIHRoZWlyIGNvbnRlbnQuCisKK0VhY2ggc3Vibm9kZSBvbmx5IGFmZmVjdHMgdGhvc2UgcGFyYW1ldGVycyB0aGF0IGFyZSBleHBsaWNpdGx5IGxpc3RlZC4gSW4KK290aGVyIHdvcmRzLCBhIHN1Ym5vZGUgdGhhdCBsaXN0cyBhIG11eCBmdW5jdGlvbiBidXQgbm8gcGluIGNvbmZpZ3VyYXRpb24KK3BhcmFtZXRlcnMgaW1wbGllcyBubyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgcGluIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KK1NpbWlsYXJseSwgYSBwaW4gc3Vibm9kZSB0aGF0IGRlc2NyaWJlcyBhIHB1bGx1cCBwYXJhbWV0ZXIgaW1wbGllcyBubworaW5mb3JtYXRpb24gYWJvdXQgZS5nLiB0aGUgbXV4IGZ1bmN0aW9uLgorCitUaGUgZm9sbG93aW5nIGdlbmVyaWMgcHJvcGVydGllcyBhcyBkZWZpbmVkIGluIHBpbmN0cmwtYmluZGluZ3MudHh0IGFyZSB2YWxpZAordG8gc3BlY2lmeSBpbiBhIHBpbiBjb25maWd1cmF0aW9uIHN1Ym5vZGU6CisKKy0gcGluczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nLWFycmF5PgorCURlZmluaXRpb246IExpc3Qgb2YgZ3BpbyBwaW5zIGFmZmVjdGVkIGJ5IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbgorCQkgICAgdGhpcyBzdWJub2RlLiAgVmFsaWQgcGlucyBhcmU6CisJCSAgICBncGlvMS1ncGlvNSBmb3Igd2NkOTM0MAorCistIGJpYXMtZGlzYWJsZToKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXMgbm8gcHVsbC4KKworLSBiaWFzLXB1bGwtZG93bjoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXMgcHVsbCBkb3duLgorCistIGJpYXMtcHVsbC11cDoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8ZW1wdHk+CisJRGVmaW5pdGlvbjogVGhlIHNwZWNpZmllZCBwaW5zIHNob3VsZCBiZSBjb25maWd1cmVkIGFzIHB1bGwgdXAuCisKKy0gcWNvbSxwdWxsLXVwLXN0cmVuZ3RoOgorCVVzYWdlOiBvcHRpb25hbAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogU3BlY2lmaWVzIHRoZSBzdHJlbmd0aCB0byB1c2UgZm9yIHB1bGwgdXAsIGlmIHNlbGVjdGVkLgorCistIGJpYXMtaGlnaC1pbXBlZGFuY2U6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPG5vbmU+CisJRGVmaW5pdGlvbjogVGhlIHNwZWNpZmllZCBwaW5zIHdpbGwgcHV0IGluIGhpZ2gtWiBtb2RlIGFuZCBkaXNhYmxlZC4KKworLSBpbnB1dC1lbmFibGU6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPG5vbmU+CisJRGVmaW5pdGlvbjogVGhlIHNwZWNpZmllZCBwaW5zIGFyZSBwdXQgaW4gaW5wdXQgbW9kZS4KKworLSBvdXRwdXQtaGlnaDoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gb3V0cHV0IG1vZGUsIGRyaXZlbgorCQkgICAgaGlnaC4KKworLSBvdXRwdXQtbG93OgorCVVzYWdlOiBvcHRpb25hbAorCVZhbHVlIHR5cGU6IDxub25lPgorCURlZmluaXRpb246IFRoZSBzcGVjaWZpZWQgcGlucyBhcmUgY29uZmlndXJlZCBpbiBvdXRwdXQgbW9kZSwgZHJpdmVuCisJCSAgICBsb3cuCisKKy0gcWNvbSxkcml2ZS1zdHJlbmd0aDoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IFNlbGVjdHMgdGhlIGRyaXZlIHN0cmVuZ3RoIGZvciB0aGUgc3BlY2lmaWVkIHBpbnMuCisKK0V4YW1wbGU6CisKKwl3Y2Q6IHdjZF9waW5jdHJsQDUgeworCQljb21wYXRpYmxlID0gInFjb20sd2NkLXBpbmN0bCI7CisJCXFjb20sbnVtLWdwaW9zID0gPDU+CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisKKwkJc3Brcl8xX3djZF9lbl9hY3RpdmU6IHNwa3JfMV93Y2RfZW5fYWN0aXZlIHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvMiI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzIiOworCQkJCW91dHB1dC1oaWdoOworCQkJfTsKKwkJfTsKKworCQlzcGtyXzFfd2NkX2VuX3NsZWVwOiBzcGtyXzFfd2NkX2VuX3NsZWVwIHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvMiI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzIiOworCQkJCWlucHV0LWVuYWJsZTsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLWF1ZGlvLWRldi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbS1hdWRpby1kZXYudHh0CmluZGV4IDY2ZWM5YzUuLmQwODAwZDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLWF1ZGlvLWRldi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20tYXVkaW8tZGV2LnR4dApAQCAtMSw1ICsxLDY2IEBACiBRdWFsY29tbSB0ZWNobm9sb2dpZXMgaW5jIGF1ZGlvIGRldmljZXMgZm9yIEFMU0Egc291bmQgU29DCiAKKyogbXNtLXBjbQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXBjbS1kc3AiCisKKyAtIHFjb20sbXNtLXBjbS1kc3AtaWQgOiBkZXZpY2Ugbm9kZSBpZAorCisqIG1zbS1wY20tbG93LWxhdGVuY3kKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJxY29tLG1zbS1wY20tZHNwIgorCisgLSBxY29tLG1zbS1wY20tZHNwLWlkIDogZGV2aWNlIG5vZGUgaWQKKworICAgT3B0aW9uYWwgcHJvcGVydGllcworCisgICAgICAtIHFjb20sbXNtLXBjbS1sb3ctbGF0ZW5jeSA6IEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyCisgICAgICAgIHRoZSBkZXZpY2Ugbm9kZSBpcyBvZiB0eXBlIGxvdyBsYXRlbmN5LgorCisgICAgICAtIHFjb20sbGF0ZW5jeS1sZXZlbCA6IEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkZXZpY2Ugbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9mIHR5cGUgcmVndWxhciBsb3cgbGF0ZW5jeSBvciB1bHRyYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdyBsYXRlbmN5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgOiByZWd1bGFyIGxvdyBsYXRlbmN5IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsdHJhIDogdWx0cmEgbG93IGxhdGVuY3kgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxsLXBwIDogdWx0cmEgbG93IGxhdGVuY3kgc3RyZWFtIHdpdGggcG9zdC1wcm9jZXNzaW5nIGNhcGFiaWxpdHkKKworKiBtc20tcGNtLWRzcC1ub2lycQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXBjbS1kc3Atbm9pcnEiOworCisgICBPcHRpb25hbCBwcm9wZXJ0aWVzCisKKyAgICAgIC0gcWNvbSxtc20tcGNtLWxvdy1sYXRlbmN5IDogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIKKyAgICAgICAgdGhlIGRldmljZSBub2RlIGlzIG9mIHR5cGUgbG93IGxhdGVuY3kKKworICAgICAgLSBxY29tLGxhdGVuY3ktbGV2ZWwgOiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGV2aWNlIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9mIHR5cGUgbG93IGxhdGVuY3kgb3IgdWx0cmEgbG93IGxhdGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsdHJhIDogdWx0cmEgbG93IGxhdGVuY3kgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGwtcHAgOiB1bHRyYSBsb3cgbGF0ZW5jeSBzdHJlYW0gd2l0aCBwb3N0LXByb2Nlc3NpbmcgY2FwYWJpbGl0eQorKiBtc20tcGNtLXJvdXRpbmcKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJxY29tLG1zbS1wY20tcm91dGluZyIKKworKiBtc20tcGNtLWxwYQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXBjbS1scGEiCisKKyogbXNtLWNvbXByLWRzcAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWNvbXByLWRzcCIKKwogKiBtc20tY29tcHJlc3MtZHNwCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CkBAIC0xNCw4ICs3NSwyNDYwIEBACiAJODkwOSBwdXJwb3NlLklmIHRoZSBBRFNQIHZlcnNpb24gaXMgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGlzCiAJd2UgdXNlIG5ldyBBRFNQIEFQSXMuCiAKKyogbXNtLXZvaXAtZHNwCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tdm9pcC1kc3AiCisKKyogbXNtLXBjbS12b2ljZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXBjbS12b2ljZSIKKyAtIHFjb20sZGVzdHJveS1jdmQgOiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBkZXN0cm95IGN2ZCBhdAorICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmQgb2YgY2FsbCBmb3IgbG93IG1lbW9yeSB0YXJnZXRzCisKKyogbXNtLXZvaWNlLWhvc3QtcGNtCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tdm9pY2UtaG9zdC1wY20iCisKKyogbXNtLXZvaWNlLXN2YworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXZvaWNlLXN2YyIKKworKiBtc20tc3R1Yi1jb2RlYworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXN0dWItY29kZWMiCisKKyogbXNtLWhkbWktZGJhLWNvZGVjLXJ4CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20taGRtaS1kYmEtY29kZWMtcngiCisgLSBxY29tLGRiYS1icmlkZ2UtY2hpcDogU3RyaW5nIGluZm8gdG8gaW5kaWNhdGUgd2hpY2ggYnJpZGdlLWNoaXAKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGZvciBIRE1JIHVzaW5nIERCQS4KKworKiBtc20tZGFpLWZlCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tZGFpLWZlIgorCisqIG1zbS1wY20tYWZlCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tcGNtLWFmZSIKKworKiBtc20tcGNtLWR0bWYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJxY29tLG1zbS1wY20tZHRtZiIKKyAtIHFjb20sbXNtLXBjbS1kdG1mIDogRW5hYmxlIERUTUYgZHJpdmVyIGluIEF1ZGlvLiBEVE1GIGRyaXZlciBpcworICAgdXNlZCBmb3IgZ2VuZXJhdGlvbiBhbmQgZGV0ZWN0aW9uIG9mIERUTUYgdG9uZXMsIHdoZW4gdXNlciBpcyBpbgorICAgYWN0aXZlIHZvaWNlIGNhbGwuIEFQUiBjb21tYW5kcyBhcmUgc2VudCBmcm9tIERUTUYgZHJpdmVyIHRvIEFEU1AuCisKKyogbXNtLWRhaS1zdHViCisKK1tGaXJzdCBMZXZlbCBOb2Rlc10KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJtc20tZGFpLXN0dWIiCisKK1tTZWNvbmQgTGV2ZWwgTm9kZXNdCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tZGFpLXN0dWItZGV2IgorIC0gcWNvbSxtc20tZGFpLXN0dWItZGV2LWlkIDogU3R1YiBkYWkgcG9ydCBJRCB2YWx1ZSBpcyBmcm9tIDAgdG8gMy4KKyAgIFRoaXMgZW5hYmxlcyBzdHViIENQVSBkYWkgaW4gQXVkaW8uIFRoZSBzdHViIGRhaSBpcyB1c2VkIHdoZW4KKyAgIHRoZXJlIGlzIG5vIHJlYWwgYmFja2VuZCBpbiBBdWRpby4KKworKiBtc20tZGFpLXE2LXNwZGlmCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAibXNtLWRhaS1xNi1zcGRpZiIKKworKiBtc20tZGFpLXE2LWhkbWkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGUgOiAibXNtLWRhaS1xNi1oZG1pIgorIC0gcWNvbSxtc20tZGFpLXE2LWRldi1pZCA6IFRoZSBoZG1pIG11bHRpIGNoYW5uZWwgcG9ydCBJRC4KKyAgIEl0IGlzIHBhc3NlZCBvbnRvIHRoZSBkc3AgZnJvbSB0aGUgYXBwcyB0byBmb3JtIGFuIGF1ZGlvCisgICBwYXRoIHRvIHRoZSBIRE1JIGRldmljZS4gQ3VycmVudGx5IHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZQorICAgaXMgOCwgd2hpY2ggaW5kaWNhdGVzIHRoZSByeCBwYXRoIHVzZWQgZm9yIGF1ZGlvIHBsYXliYWNrCisgICBvbiBIRE1JIGRldmljZS4KKworKiBtc20tbHNtLWNsaWVudAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWxzbS1jbGllbnQiCisKKyogbXNtLXBjbS1sb29wYmFjaworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLXBjbS1sb29wYmFjayIKKworKiBtc20tZGFpLXE2CisKK1tGaXJzdCBMZXZlbCBOb2Rlc10KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJtc20tZGFpLXE2IgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgLSBxY29tLGV4dC1zcGstYW1wLXN1cHBseSA6IEV4dGVybmFsIHNwZWFrZXIgYW1wbGlmaWVyIHBvd2VyIHN1cHBseS4KKyAtIHFjb20sZXh0LXNway1hbXAtZ3BpbyA6IEV4dGVybmFsIHNwZWFrZXIgYW1wbGlmaWVyIGVuYWJsZSBzaWduYWwuCisKK1tTZWNvbmQgTGV2ZWwgTm9kZXNdCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tZGFpLXE2LWRldiIKKyAtIHFjb20sbXNtLWRhaS1xNi1kZXYtaWQgOiBUaGUgc2xpbWJ1cyBtdWx0aSBjaGFubmVsIHBvcnQgSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSBpcyBmcm9tIDE2Mzg0IHRvIDE2Mzk3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlQgU0NPIHBvcnQgSUQgdmFsdWUgZnJvbSAxMjI4OCB0byAxMjI4OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUIFByb3h5IHBvcnQgSUQgdmFsdWVzIGZyb20gMjI0IHRvIDIyNSBhbmQgMjQwIHRvCisJCQkgICAgMjQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk0gUnggYW5kIFRYIHBvcnQgSUQgdmFsdWVzIGZyb20gMTIyOTIgdG8gMTIyOTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNhbGwgcmVjb3JkIFJ4IGFuZCBUWCBwb3J0IElEIHZhbHVlcyBmcm9tIDMyNzcxIHRvIDMyNzcyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DYWxsIE11c2ljIERlbGl2ZXJ5IHBvcnQgSUQgaXMgMzI3NzMKKwkJCSAgICBpbmNhbGwgTXVzaWMgMiBEZWxpdmVyeSBwb3J0IElEIGlzIDMyNzcwCisKKyogbXNtLWF1eHBjbQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAicWNvbSxtc20tYXV4cGNtLWRldiIKKworIC0gcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1tb2RlOiAgICAgICAgICAgbW9kZSBpbmZvcm1hdGlvbi4gVGhlIGZpcnN0IHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgOGtoeiBtb2RlLCB0aGUgc2Vjb25kIGlzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTZraHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBmb3IgUENNCisKKyAtIHFjb20sbXNtLWNwdWRhaS1hdXhwY20tc3luYzogICAgICAgICAgIHN5bmMgaW5mb3JtYXRpb24uIFRoZSBmaXJzdCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIDhraHogbW9kZSwgdGhlIHNlY29uZCBpcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2a2h6CisKKyAtIHFjb20sbXNtLWNwdWRhaS1hdXhwY20tZnJhbWU6ICAgICAgICAgIE5vLm9mIGJ5dGVzIHBlciBmcmFtZS4gVGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBmb3IgOGtoeiBtb2RlLCB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBmb3IgMTZraHoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgLSAyNTZCUEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSAxMjhCUEYKKworIC0gcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1xdWFudDogICAgICAgICAgVHlwZSBvZiBxdWFudGl6YXRpb24uIFRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgZm9yIDhraHogbW9kZSwgdGhlIHNlY29uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZm9yIDE2a2h6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gTGluZWFyIHF1YW50aXphdGlvbgorCisgLSBxY29tLG1zbS1jcHVkYWktYXV4cGNtLW51bS1zbG90czogICAgICBOdW1iZXIgb2Ygc2xvdHMgcGVyIG1vZGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc20tY3B1ZGFpLWF1eHBjbS1zbG90LW1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IHZhbHVlIGlzIGZvciA4a2h6IG1vZGUsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIGlzIGZvciAxNmtoei4gTWF4IG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMgc3VwcG9ydGVkIGJ5IERTUCBpcyA0LCBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgNCB3aWxsIGJlIHRydW5jYXRlZCB0byA0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdG8gRFNQLgorCisgLSBxY29tLG1zbS1jcHVkYWktYXV4cGNtLXNsb3QtbWFwcGluZzogICBBcnJheSBvZiBzbG90IG51bWJlcnMgZm9yIG11bHRpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90IHNjZW5hcmlvLiBUaGUgZmlyc3QgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGZvciA4a2h6IG1vZGUsIHRoZSBzZWNvbmQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAxNmtoei4gVGhlIHNpemUgb2YgdGhlIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1udW0tc2xvdHMKKworIC0gcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1kYXRhOiAgICAgICAgICAgRGF0YSBmaWVsZCAtIDAuIFRoZSBmaXJzdCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIDhraHogbW9kZSwgdGhlIHNlY29uZCBpcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2a2h6CisKKyAtIHFjb20sbXNtLWNwdWRhaS1hdXhwY20tcGNtLWNsay1yYXRlOiAgIENsb2NrIHJhdGUgZm9yIHBjbSAtIDIwNDgwMDAuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdmFsdWUgaXMgZm9yIDhraHogbW9kZSwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgaXMgZm9yIDE2S0h6IG1vZGUuIFdoZW4gY2xvY2sKKwkJCQkJICByYXRlIGlzIHNldCB0byB6ZXJvLCB0aGVuIGV4dGVybmFsCisJCQkJCSAgY2xvY2sgaXMgYXNzdW1lZC4KKworIC0gcWNvbSxtc20tYXV4cGNtLWludGVyZmFjZTogICAgICAgICAgICAgbmFtZSBvZiBBVVhQQ00gaW50ZXJmYWNlICJwcmltYXJ5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHByaW1hcnkgQVVYUENNIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZGFyeSIgaW5kaWNhdGVzIHNlY29uZGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVYUENNIGludGVyZmFjZQorT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBwaW5jdHJsLW5hbWVzOgkJCSAgUGluY3RybCBzdGF0ZSBuYW1lcyBmb3IgZWFjaCBwaW4KKwkJCQkJICBncm91cCBjb25maWd1cmF0aW9uLgorLSBwaW5jdHJsLXg6IAkJCQkgIERlZmluZXMgcGluY3RybCBzdGF0ZSBmb3IgZWFjaCBwaW4KKwkJCQkJICBncm91cAorLSBxY29tLG1zbS1jcHVkYWktYWZlLWNsay12ZXI6ICAgICAgICAgICAgSW5kaWNhdGVzIHZlcnNpb24gb2YgQUZFIGNsb2NrCisJCQkJCSAgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIGVuYWJsaW5nCisJCQkJCSAgUENNIGNsb2NrLiBJZiBub3QgZGVmaW5lZCwgc2VsZWN0cworCQkJCQkgIGRlZmF1bHQgQUZFIGNsb2NrIGludGVyZmFjZS4KKworKiBtc20tcGNtLWhvc3RsZXNzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tcGNtLWhvc3RsZXNzIgorCisqIG1zbS1vY21lbS1hdWRpbworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFjb20sbXNtLW9jbWVtLWF1ZGlvIgorCisgLSBxY29tLG1zbV9idXMsbmFtZTogICAgICAgICAgICAgICAgICAgICAgQ2xpZW50IG5hbWUKKworIC0gcWNvbSxtc21fYnVzLG51bV9jYXNlczogICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiB1c2UgY2FzZXMKKworIC0gcWNvbSxtc21fYnVzLGFjdGl2ZV9vbmx5OiAgICAgICAgICAgICAgIENvbnRleHQgZmxhZyBmb3IgcmVxdWVzdHMgaW4gYWN0aXZlCisJCQkJCSAgIG9yIGR1YWwgKGFjdGl2ZSAmIHNsZWVwKSBjb250ZXgKKworIC0gcWNvbSxtc21fYnVzLG51bV9wYXRoczogICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBtYXN0ZXItc2xhdmUgcGFpcnMKKworIC0gcWNvbSxtc21fYnVzLHZlY3RvcnM6ICAgICAgICAgICAgICAgICAgIEFycmF5cyBvZiB1bnNpZ25lZCBpbnRlZ2VycworCQkJCQkgICByZXByZXNlbnRpbmc6CisJCQkJCSAgICAgICBtYXN0ZXItaWQsIHNsYXZlLWlkLCBhcmJpdHJhdGVkCisJCQkJCSAgICAgICBiYW5kd2lkdGgsCisJCQkJCSAgICAgICBpbnN0YW50YW5lb3VzIGJhbmR3aWR0aAorKiB3Y2Q5eHh4X2ludGMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxY29tLHdjZDl4eHgtaXJxIgorCisgLSBpbnRlcnJ1cHQtY29udHJvbGxlciA6ICAgICAgICAgICAgICAgICAgTWFyayB0aGlzIGRldmljZSBub2RlIGFzIGFuCisJCQkJCSAgIGludGVycnVwdCBjb250cm9sbGVyCisKKyAtICNpbnRlcnJ1cHQtY2VsbHMgOiAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgMQorCisgLSBpbnRlcnJ1cHQtcGFyZW50IDogICAgICAgICAgICAgICAgICAgICAgUGFyZW50IGludGVycnVwdCBjb250cm9sbGVyCisKKyAtIHFjb20sZ3Bpby1jb25uZWN0ICAgICAgICAgICAgICAgICAgICAgICBHcGlvIHRoYXQgY29ubmVjdHMgdG8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGNvbnRyb2xsZXIKKworKiBhdWRpby1leHQtY2xrCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicWNvbSxhdWRpby1yZWYtY2xrIgorCisgLSBxY29tLGF1ZGlvLXJlZi1jbGstZ3BpbyAgOiAgICAgICAgICAgICAgIFBNSUMgb3IgQVBRIGdwaW8gdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCB0byBlbmFibGUgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGV4dGVybmFsIGNsb2NrLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgLSBxY29tLG5vZGVfaGFzX3JwbV9jbG9jazogICAgICAgICAgICAgICAgIEJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBpbmRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHJlZi4gY2xvY2sgY2FuIGJlIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGdwaW8gdG9nZ2xlIG9yIEtlcm5lbCBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkgY2FsbC4KKworIC0gY2xvY2stbmFtZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBQTUlDIGNsb2NrIHRoYXQgbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZW5hYmxlZCBmb3IgYXVkaW8gcmVmIGNsb2NrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNsb2NrIGlzIHNldCBhcyBwYXJlbnQuCisKKyAtIGNsb2NrczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhbmRsZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay4KKworKiBhdWRpb19zbGltc2xhdmUKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxY29tLGF1ZGlvLXNsaW1zbGF2ZSIKKworIC0gZWxlbWVudGFsLWFkZHI6ICAgICAgICAgICAgICAgICAgICAgICAgIHNsaW1idXMgc2xhdmUgZW51bWVyYXRpb24gYWRkcmVzcy4KKworKiBtc20tY3BlLWxzbQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWNwZS1sc20iCisgLSBxY29tLG1zbS1jcGUtbHNtLWlkIDogbHNtIGFmZSBwb3J0IElELiBDUEUgbHNtIGRyaXZlciB1c2VzCisgICB0aGlzIHByb3BlcnR5IHRvIGZpbmQgb3V0IHRoZSBpbnB1dCBhZmUgcG9ydCBJRC4gQ3VycmVudGx5CisgICBvbmx5IHN1cHBvcnRlZCB2YWx1ZXMgYXJlIDEgYW5kIDMuCisKKyogd2NkX3VzX2V1cm9fZ3BpbworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWNkYy1waW5jdHJsIgorCisqIG1zbS1kYWktc2xpbQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFjb20sbXNtLWRhaS1zbGltIgorCisgLSBlbGVtZW50YWwtYWRkcjogICAgICAgICAgICAgICAgICAgICAgICAgc2xpbWJ1cyBzbGF2ZSBlbnVtZXJhdGlvbiBhZGRyZXNzLgorCisqIHdjZF9ncGlvX2N0cmwKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxY29tLG1zbS1jZGMtcGluY3RybCIKKworIC0gcWNvbSxjZGMtcnN0LW4tZ3BpbyA6ICAgICAgICAgICAgICAgICAgIFRMTU0gR1BJTyBudW1iZXIKKworIC0gcGluY3RybC1uYW1lczogICAgICAgICAgICAgICAgICAgICAgICAgIFBpbmN0cmwgc3RhdGUgbmFtZXMgZm9yIGVhY2ggcGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgY29uZmlndXJhdGlvbi4KKyAtIHBpbmN0cmwteDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHBpbmN0cmwgc3RhdGUgZm9yIGVhY2ggcGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuCisqIG1zbV9jZGNfcGluY3RybAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFjb20sbXNtLWNkYy1waW5jdHJsIgorCisgLSBwaW5jdHJsLW5hbWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgUGluY3RybCBzdGF0ZSBuYW1lcyBmb3IgZWFjaCBwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCBjb25maWd1cmF0aW9uLgorIC0gcGluY3RybC14OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgcGluY3RybCBzdGF0ZSBmb3IgZWFjaCBwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC4KKworKiB3Y2RfZHNwX2dsaW5rCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicWNvbSx3Y2QtZHNwLWdsaW5rIgorCisqIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFjb20sbXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IgorCiBFeGFtcGxlOgogCisJcWNvbSxtc20tcGNtIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tZHNwIjsKKwkJcWNvbSxtc20tcGNtLWRzcC1pZCA9IDwwPjsKKwl9OworCisJcWNvbSxtc20tcGNtLWxvdy1sYXRlbmN5IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tZHNwIjsKKwkJcWNvbSxtc20tcGNtLWRzcC1pZCA9IDwxPjsKKwkJcWNvbSxtc20tcGNtLWxvdy1sYXRlbmN5OworCX07CisKKyAgICAgICAgcWNvbSxtc20tcGNtLXJvdXRpbmcgeworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLXJvdXRpbmciOworICAgICAgICB9OworCisgICAgICAgIHFjb20sbXNtLXBjbS1scGEgeworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLWxwYSI7CisgICAgICAgIH07CisKKyAgICAgICAgcWNvbSxtc20tY29tcHItZHNwIHsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInFjb20sbXNtLWNvbXByLWRzcCI7CisgICAgICAgIH07CisKICAgICAgICAgcWNvbSxtc20tY29tcHJlc3MtZHNwIHsKICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInFjb20sbXNtLWNvbXByZXNzLWRzcCI7CiAgICAgICAgIH07CisKKyAgICAgICAgcWNvbSxtc20tdm9pcC1kc3AgeworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxtc20tdm9pcC1kc3AiOworICAgICAgICB9OworCisJcWNvbSxtc20tcGNtLXZvaWNlIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tdm9pY2UiOworCQlxY29tLGRlc3Ryb3ktY3ZkOworCX07CisKKyAgICAgICAgcWNvbSxtc20tdm9pY2UtaG9zdC1wY20geworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxtc20tdm9pY2UtaG9zdC1wY20iOworICAgICAgICB9OworCisgICAgICAgIHFjb20sbXNtLXN0dWItY29kZWMgeworICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAicWNvbSxtc20tc3R1Yi1jb2RlYyI7CisgICAgICAgIH07CisKKyAgICAgICAgcWNvbSxtc20tZGFpLWZlIHsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1mZSI7CisgICAgICAgIH07CisKKwlxY29tLG1zbS1wY20tZHRtZiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLWR0bWYiOworCX07CisKKwlxY29tLG1zbS1kYWktc3R1YiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXN0dWIiOworCX07CisKKwlxY29tLG1zbS1kYWktcTYtc3BkaWYgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1zcGRpZiI7CisJfTsKKworCXFjb20sbXNtLWRhaS1xNi1oZG1pIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtaGRtaSI7CisJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8OD47CisJfTsKKworCWRhaV9kcDogcWNvbSxtc20tZGFpLXE2LWRwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtaGRtaSI7CisJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MjQ2MDg+OworCX07CisKKwlxY29tLG1zbS1kYWktcTYgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNiI7CisJCXFjb20sbXNtLWRhaS1xNi1zYi0wLXJ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDE2Mzg0PjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtc2ItMC10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxNjM4NT47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LXNiLTEtcnggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MTYzODY+OworCQl9OworCisJCXFjb20sbXNtLWRhaS1xNi1zYi0xLXR4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDE2Mzg3PjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtc2ItMy1yeCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxNjM5MD47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LXNiLTMtdHggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MTYzOTE+OworCQl9OworCisJCXFjb20sbXNtLWRhaS1xNi1zYi00LXJ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDE2MzkyPjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtc2ItNC10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxNjM5Mz47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LXNiLTUtdHggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MTYzOTU+OworCQl9OworCisJCXFjb20sbXNtLWRhaS1xNi1zYi02LXJ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDE2Mzk2PjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtc2ItNi10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxNjM5Nz47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWJ0LXNjby1yeCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxMjI4OD47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWJ0LXNjby10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxMjI4OT47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWludC1mbS1yeCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxMjI5Mj47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWludC1mbS10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwxMjI5Mz47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWJlLWFmZS1wY20tcnggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MjI0PjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtYmUtYWZlLXBjbS10eCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1kZXYiOworCQkJcWNvbSxtc20tZGFpLXE2LWRldi1pZCA9IDwyMjU+OworCQl9OworCisJCXFjb20sbXNtLWRhaS1xNi1hZmUtcHJveHktcnggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MjQxPjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtYWZlLXByb3h5LXR4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDI0MD47CisJCX07CisKKwkJcWNvbSxtc20tZGFpLXE2LWluY2FsbC1yZWNvcmQtcnggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MzI3NzE+OworCQl9OworCisJCXFjb20sbXNtLWRhaS1xNi1pbmNhbGwtcmVjb3JkLXR4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDMyNzcyPjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtaW5jYWxsLW11c2ljLXJ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiI7CisJCQlxY29tLG1zbS1kYWktcTYtZGV2LWlkID0gPDMyNzczPjsKKwkJfTsKKworCQlxY29tLG1zbS1kYWktcTYtaW5jYWxsLW11c2ljLTItcnggeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IjsKKwkJCXFjb20sbXNtLWRhaS1xNi1kZXYtaWQgPSA8MzI3NzA+OworCQl9OworCX07CisKKwlxY29tLG1zbS1wcmktYXV4cGNtIHsKKwkJcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1tb2RlID0gPDE+LCA8MT47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tc3luYyA9IDwxPiwgPDE+OworCQlxY29tLG1zbS1jcHVkYWktYXV4cGNtLWZyYW1lID0gPDU+LCA8ND47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tcXVhbnQgPSA8Mj4sIDwyPjsKKwkJcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1udW0tc2xvdHMgPSA8ND4sIDw0PjsKKwkJcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1zbG90LW1hcHBpbmcgPSA8MSAwIDAgMD4sIDwxIDMgMCAwPjsKKwkJcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1kYXRhID0gPDA+LCA8MD47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tcGNtLWNsay1yYXRlID0gPDIwNDgwMDA+LCA8MjA0ODAwMD47CisJCXFjb20sbXNtLWF1eHBjbS1pbnRlcmZhY2UgPSAicHJpbWFyeSI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tYXV4cGNtLWRldiI7CisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCIsICJpZGxlIjsKKwkJcGluY3RybC0wID0gPCZwcmlfYXV4X3BjbV9hY3RpdmUgJnByaV9hdXhfcGNtX2Rpbl9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnByaV9hdXhfcGNtX3NsZWVwICZwcmlfYXV4X3BjbV9kaW5fc2xlZXA+OworCX07CisKKyAgICAgICAgcWNvbSxtc20tcGNtLWhvc3RsZXNzIHsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInFjb20sbXNtLXBjbS1ob3N0bGVzcyI7CisgICAgICAgIH07CisKKwlxY29tLG1zbS1vY21lbS1hdWRpbyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tb2NtZW0tYXVkaW8iOworCQlxY29tLG1zbV9idXMsbmFtZSA9ICJhdWRpby1vY21lbSI7CisJCXFjb20sbXNtX2J1cyxudW1fY2FzZXMgPSA8Mj47CisJCXFjb20sbXNtX2J1cyxhY3RpdmVfb25seSA9IDwwPjsKKwkJcWNvbSxtc21fYnVzLG51bV9wYXRocyA9IDwxPjsKKwkJcWNvbSxtc21fYnVzLHZlY3RvcnMgPQorCQkJPDExIDYwNCAwIDA+LAorCQkJPDExIDYwNCAzMjUwNTg1NiAzMjUwNTg1NjA+OworCX07CisKKwl3Y2Q5eHh4X2ludGM6IHdjZDl4eHgtaXJxIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaXJxIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1zbWdwaW8+OworCQlpbnRlcnJ1cHRzID0gPDcyIDA+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAiY2RjLWludCI7CisJfTsKKworCWNsb2NrX2F1ZGlvOiBhdWRpb19leHRfY2xrIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGF1ZGlvLXJlZi1jbGsiOworCQlxY29tLGF1ZGlvLXJlZi1jbGstZ3Bpb3MgPSA8JnBtODk5NF9ncGlvcyAxNSAwPjsKKwkJY2xvY2stbmFtZXMgPSAib3NyX2NsayI7CisJCWNsb2NrcyA9IDwmY2xvY2tfcnBtIGNsa19kaXZfY2xrMT47CisJCXFjb20sbm9kZV9oYXNfcnBtX2Nsb2NrOworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCXBpbmN0cmwtbmFtZXMgPSAic2xlZXAiLCAiYWN0aXZlIjsKKwkJcGluY3RybC0wID0gPCZzcGtyX2kyc19jbGtfc2xlZXA+OworCQlwaW5jdHJsLTEgPSA8JnNwa3JfaTJzX2Nsa19hY3RpdmU+OworCX07CisKKwlhdWRpb19zbGltc2xhdmUgeworCQljb21wYXRpYmxlID0gInFjb20sYXVkaW8tc2xpbXNsYXZlIjsKKwkJZWxlbWVudGFsLWFkZHIgPSBbZmYgZmYgZmYgZmYgMTcgMDJdOworCX07CisKKwltc21fZGFpX3NsaW0geworCQljb21wYXRpYmxlID0gInFjb20sbXNtX2RhaV9zbGltIjsKKwkJZWxlbWVudGFsLWFkZHIgPSBbZmYgZmYgZmYgZmUgMTcgMDJdOworCX07CisKKwl3Y2RfZ3Bpb19jdHJsIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jZGMtcGluY3RybCI7CisJCXFjb20sY2RjLXJzdC1uLWdwaW8gPSA8JnRsbW0gNjQgMD47CisJCXBpbmN0cmwtbmFtZXMgPSAiYXVkX2FjdGl2ZSIsICJhdWRfc2xlZXAiOworCQlwaW5jdHJsLTAgPSA8JmNkY19yZXNldF9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JmNkY19yZXNldF9zbGVlcD47CisJfTsKKworCW1zbV9jZGNfcGluY3RybCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOworCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKKwkJcGluY3RybC0wID0gPCZjZGNfcmVzZXRfYWN0aXZlPjsKKwkJcGluY3RybC0xID0gPCZjZGNfcmVzZXRfc2xlZXA+OworCX07CisKKwl3Y2RfZHNwX2dsaW5rIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjZC1kc3AtZ2xpbmsiOworCX07CisKKwltc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnggeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IjsKKwl9OworCisKKyogTVNNODkxNiBBU29DIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxtc204eDE2LWF1ZGlvLWNvZGVjIgorLSBxY29tLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY2FyZC4KKy0gcWNvbSxtc20tc25kLWNhcmQtaWQgOiBUaGlzIGlkIGlzIHVzZWQgdG8gcmVjb2duaXplIHRoZSBzb3VuZCBjYXJkIG51bWJlcgorLSBxY29tLG1zbS1jb2RlYy10eXBlIDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJlY29nbml6ZSB0aGUgY29kZWMgdHlwZQorICBpbnRlcm5hbCBvciBleHRlcm5hbC4KKy0gcWNvbSxtc20taHMtbWljYmlhcy10eXBlIDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJlY29nbml6ZSB0aGUgaGVhZHNldAorICBtaWNiaWFzIHR5cGUsIGludGVybmFsIG9yIGV4dGVybmFsLgorLSBxY29tLG1zbS1leHQtcGEgOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5mb3JtIG1hY2hpbmUgZHJpdmVyIGFib3V0CisgIHRoZSBjb25uZWN0aW9uIG9mIGV4dGVybmFsIFBBIG92ZXIgYXZhaWxhYmxlIE1JMlMgaW50ZXJmYWNlcywKKyAgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgZ2l2ZW4gdG8gdGhpcyBwcm9wZXJ0eS4KKyAgcHJpbWFyeSAtPiBQcmltYXJ5IE1JMlMgaW50ZXJmYWNlCisgIHNlY29uZGFyeSAtPiBTZWNvbmRhcnkgTUkyUyBpbnRlcmZhY2UKKyAgdGVydGlhcnkgLT4gVGVydGlhcnkgTUkyUyBpbnRlcmZhY2UKKyAgcXVhdGVybmFyeSAtPiBRdWF0ZXJuYXJ5IE1JMlMgaW50ZXJmYWNlCistIHFjb20sbXNtLW1jbGstZnJlcSA6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmZvcm0gbWFjaGluZSBkcml2ZXIgYWJvdXQKK21jbGsgZnJlcXVlbmN5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCBQQS4KKy0gcWNvbSxtc20tbWJoYy1ocGhsLXN3aDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGhlYWRzZXQgSFBITAorc3dpdGNoIHR5cGUgb24gdGFyZ2V0IHR5cGljYWxseSB0aGUgc3dpdGNoIHR5cGUgd2lsbCBiZSBub3JtYWxseSBvcGVuIG9yCitub3JtYWxseSBjbG9zZSwgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgMCBmb3Igbm9ybWFsbHkgY2xvc2UgYW5kIDEgZm9yCitub3JtYWxseSBvcGVuLgorLSAgcWNvbSxtc20tbWJoYy1nbmQtc3doOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaGVhZHNldCBHTkQKK3N3aXRjaCB0eXBlIG9uIHRhcmdldCB0eXBpY2FsbHkgdGhlIHN3aXRjaCB0eXBlIHdpbGwgYmUgbm9ybWFsbHkgb3BlbiBvcgorbm9ybWFsbHkgY2xvc2UsIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IDAgZm9yIG5vcm1hbGx5IGNsb3NlIGFuZCAxIGZvcgorbm9ybWFsbHkgb3Blbi4KKy0gcWNvbSxhdWRpby1yb3V0aW5nIDogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCistIHBpbmN0cmwtbmFtZXMgOiBQaW5jbnRybCBlbnRyaWVzIHRvIGNvbmZpZ3VyZSB0aGUgUERNIGdwaW8gbGluZXMgYW5kCisJCSAgY3Jvc3MgY29ubmVjdGlvbiBzd2l0Y2ggZ3BpbyBhY2NvcmRpbmdseQorLSBwaW5jdHJsLTAgOiBUaGlzIGV4cGxhaW5zIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIFBETSBncGlvIGxpbmVzCistIHBpbmN0cmwtMSA6IFRoaXMgZXhwbGFpbnMgdGhlIHN1c3BlbmQgc3RhdGUgb2YgdGhlIFBETSBncGlvIGxpbmVzCistIHBpbmN0cmwtMiA6IFRoaXMgZXhwbGFpbnMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgY3Jvc3MgY29ubmVjdGlvbgorCSAgICAgIGdwaW8gbGluZXMKKy0gcGluY3RybC0zIDogVGhpcyBleHBsYWlucyB0aGUgc3VzcGVuZCBzdGF0ZSBvZiB0aGUgY3Jvc3MgY29ubmVjdGlvbgorICAgICAgICAgICAgICBncGlvIGxpbmVzCistIHFjb20sdGFwYW4tbWNsay1jbGstZnJlcSA6IFRhcGFuIG1jbGsgRnJlcSBpbiBIei4KKy0gcWNvbSxwcmltLWF1eHBjbS1ncGlvLWNsayAgOiBHUElPIG9uIHdoaWNoIFByaW1hcnkgQVVYUENNIGNsayBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLHByaW0tYXV4cGNtLWdwaW8tc3luYyA6IEdQSU8gb24gd2hpY2ggUHJpbWFyeSBBVVhQQ00gU1lOQyBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLHByaW0tYXV4cGNtLWdwaW8tZGluICA6IEdQSU8gb24gd2hpY2ggUHJpbWFyeSBBVVhQQ00gRElOIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20scHJpbS1hdXhwY20tZ3Bpby1kb3V0IDogR1BJTyBvbiB3aGljaCBQcmltYXJ5IEFVWFBDTSBET1VUIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20scHJpbS1hdXhwY20tZ3Bpby1zZXQgOiBzZXQgb2YgR1BJTyBsaW5lcyB1c2VkIGZvciBQcmltYXJ5IEFVWFBDTSBwb3J0CistIHFjb20sdGFwYW4tY29kZWMtOTMwMjogSW5kaWNhdGVzIHRoYXQgdGhpcyBkZXZpY2Ugbm9kZSBpcyBmb3IgV0NEOTMwMiBhdWRpbworCQkJICAgIGNvZGVjLgorLSBhc29jLXBsYXRmb3JtOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIHBsYXRmb3JtIGRldmljZQorCQkgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKwkJICAgICAgIHRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQkgICAgICAgZ2l2ZW4gaW4gImFzb2MtcGxhdGZvcm0iLgorLSBhc29jLWNwdTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjcHUgZGFpIGRldmljZSBub2RlcworCSAgICB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNwdS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNwdSBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICBjcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorCQkgIHdoZXJlIHRoZSBpZCAoJWQpIGZpZWxkIHJlcHJlc2VudHMgdGhlIGJhY2stZW5kIEFGRSBwb3J0IGlkIHRoYXQKKwkJICB0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkgICAgICBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNvZGVjLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY29kZWMgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgICBjb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICAgIGluICJhc29jLWNvZGVjIi4KKworT3B0aW9uYWwgUHJvcGVydGllczoKKy0gcWNvbSx1cy1ldXJvLWdwaW9zIDogR1BJTyBvbiB3aGljaCBnbmQvbWljIHN3YXAgc2lnbmFsIGlzIGNvbWluZy4KKworRXhhbXBsZToKKworCW1zbV9kaWdfY29kZWM6IHFjb20sbXNtLWludC1jb2RlYyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc21faW50X2NvcmVfY29kZWMiOworCQlxY29tLGRpZy1jZGMtYmFzZS1hZGRyID0gPDB4YzBmMDAwMD47CisJfTsKKworCXNvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbTh4MTYtYXVkaW8tY29kZWMiOworCQlxY29tLG1vZGVsID0gIm1zbTh4MTYtc25kLWNhcmQiOworCQlxY29tLG1zbS1zbmQtY2FyZC1pZCA9IDwwPjsKKwkJcWNvbSxtc20tY29kZWMtdHlwZSA9ICJpbnRlcm5hbCI7CisJCXFjb20sbXNtLWV4dC1wYSA9IDwwPjsKKwkJcWNvbSxtc20tbWNsay1mcmVxID0gPDEyMjg4MDAwPjsKKwkJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwwPjsKKwkJcWNvbSxtc20tbWJoYy1nbmQtc3doID0gPDA+OworCQlxY29tLG1zbS1ocy1taWNiaWFzLXR5cGUgPSAiaW50ZXJuYWwiOworCQlxY29tLGNkYy11cy1ldXJvLWdwaW9zID0gPCZtc21ncGlvIDEyMCAwPjsKKwkJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJCSJSWF9CSUFTIiwgIk1DTEsiLAorCQkJIklOVF9MRE9fSCIsICJNQ0xLIiwKKwkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJIYW5kc2V0IE1pYyIsCisJCQkiTUlDIEJJQVMgSW50ZXJuYWwyIiwgIkhlYWRzZXQgTWljIiwKKwkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJTZWNvbmRhcnkgTWljIiwKKwkJCSJBTUlDMSIsICJNSUMgQklBUyBFeHRlcm5hbCIsCisJCQkiQU1JQzIiLCAiTUlDIEJJQVMgSW50ZXJuYWwyIiwKKwkJCSJBTUlDMyIsICJNSUMgQklBUyBFeHRlcm5hbCI7CisJCXBpbmN0cmwtbmFtZXMgPSAiY2RjX3BkbV9saW5lc19hY3QiLAorCQkJCSJjZGNfcGRtX2xpbmVzX3N1cyIsCisJCQkJImNyb3NzX2Nvbm5fZGV0X2FjdCIsCisJCQkJImNyb3NzX2Nvbm5fZGV0X3N1cyI7CisJCXBpbmN0cmwtMCA9IDwmY2RjX3BkbV9saW5lc19hY3Q+OworCQlwaW5jdHJsLTEgPSA8JmNkY19wZG1fbGluZXNfc3VzPjsKKwkJcGluY3RybC0yID0gPCZjcm9zc19jb25uX2RldF9hY3Q+OworCQlwaW5jdHJsLTMgPSA8JmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXFjb20sdGFwYW4tbWNsay1jbGstZnJlcSA9IDw5NjAwMDAwPjsKKwkJcWNvbSxwcmltLWF1eHBjbS1ncGlvLWNsayAgPSA8Jm1zbV9ncGlvIDYzIDA+OworCQlxY29tLHByaW0tYXV4cGNtLWdwaW8tc3luYyA9IDwmbXNtX2dwaW8gNjQgMD47CisJCXFjb20scHJpbS1hdXhwY20tZ3Bpby1kaW4gID0gPCZtc21fZ3BpbyA2NSAwPjsKKwkJcWNvbSxwcmltLWF1eHBjbS1ncGlvLWRvdXQgPSA8Jm1zbV9ncGlvIDY2IDA+OworCQlxY29tLHByaW0tYXV4cGNtLWdwaW8tc2V0ID0gInByaW0tZ3Bpby1wcmltIjsKKwkJcWNvbSx0YXBhbi1jb2RlYy05MzAyOworCQlhc29jLXBsYXRmb3JtID0gPCZwY20wPiwgPCZwY20xPiwgPCZ2b2lwPiwgPCZ2b2ljZT4sCisJCQkJPCZsb29wYmFjaz4sIDwmY29tcHJlc3M+LCA8Jmhvc3RsZXNzPiwKKwkJCQk8JmFmZT4sIDwmbHNtPiwgPCZyb3V0aW5nPiwgPCZscGE+OworCQlhc29jLXBsYXRmb3JtLW5hbWVzID0gIm1zbS1wY20tZHNwLjAiLCAibXNtLXBjbS1kc3AuMSIsCisJCQkJIm1zbS12b2lwLWRzcCIsICJtc20tcGNtLXZvaWNlIiwgIm1zbS1wY20tbG9vcGJhY2siLAorCQkJCSJtc20tY29tcHJlc3MtZHNwIiwgIm1zbS1wY20taG9zdGxlc3MiLCAibXNtLXBjbS1hZmUiLAorCQkJCSJtc20tbHNtLWNsaWVudCIsICJtc20tcGNtLXJvdXRpbmciLCAibXNtLXBjbS1scGEiOworCQlhc29jLWNwdSA9IDwmZGFpX3ByaV9hdXhwY20+LCA8JmRhaV9oZG1pPiwgPCZkYWlfZHA+LAorCQkJCTwmZGFpX21pMnMwPiwgPCZkYWlfbWkyczE+LCA8JmRhaV9taTJzMj4sIDwmZGFpX21pMnMzPiwKKwkJCQk8JnNiXzBfcng+LCA8JnNiXzBfdHg+LCA8JnNiXzFfcng+LCA8JnNiXzFfdHg+LAorCQkJCTwmc2JfM19yeD4sIDwmc2JfM190eD4sIDwmc2JfNF9yeD4sIDwmc2JfNF90eD4sCisJCQkJPCZidF9zY29fcng+LCA8JmJ0X3Njb190eD4sIDwmaW50X2ZtX3J4PiwgPCZpbnRfZm1fdHg+LAorCQkJCTwmYWZlX3BjbV9yeD4sIDwmYWZlX3BjbV90eD4sIDwmYWZlX3Byb3h5X3J4PiwgPCZhZmVfcHJveHlfdHg+LAorCQkJCTwmaW5jYWxsX3JlY29yZF9yeD4sIDwmaW5jYWxsX3JlY29yZF90eD4sIDwmaW5jYWxsX211c2ljX3J4PiwKKwkJCQk8JmluY2FsbF9tdXNpY18yX3J4PjsKKwkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LWhkbWkuOCIsCisJCQkJIm1zbS1kYWktcTYtZHAuMjQ2MDgiLAorCQkJCSJtc20tZGFpLXE2LW1pMnMuMCIsICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCQkJIm1zbS1kYWktcTYtbWkycy4yIiwgIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2MzkwIiwgIm1zbS1kYWktcTYtZGV2LjE2MzkxIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTIiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xMjI4OCIsICJtc20tZGFpLXE2LWRldi4xMjI4OSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjEyMjkyIiwgIm1zbS1kYWktcTYtZGV2LjEyMjkzIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjI0IiwgIm1zbS1kYWktcTYtZGV2LjIyNSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjI0MSIsICJtc20tZGFpLXE2LWRldi4yNDAiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MSIsICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzczIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcwIjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yj4sIDwmcG04OTE2X3RvbWJha19kaWc+OworCQlhc29jLWNvZGVjLW5hbWVzID0gIm1zbS1zdHViLWNvZGVjLjEiLCAidG9tYmFrX2NvZGVjIjsKKwl9OworCisqIE1TTTg5NzQgQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbXNtODk3NC1hdWRpby10YWlrbyIKKy0gcWNvbSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNhcmQuCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciByZWdpb24ocykgZm9yIE1JMlMvUENNIE1VWAorLSByZWctbmFtZXMgOiBSZWdpc3RlciByZWdpb24gbmFtZShzKSByZWZlcmVuY2VkIGluIHJlZyBhYm92ZQorCSBSZXF1aXJlZCByZWdpc3RlciByZXNvdXJjZSBlbnRyaWVzIGFyZToKKwkgImxwYWlmX3ByaV9tb2RlX211eHNlbCI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgTVVYIHRvIHNlbGVjdCBiZXR3ZWVuCisJCQkJICBQcmltYXJ5IFBDTSBhbmQgUHJpbWFyeSBNSTJTCisJICJscGFpZl9zZWNfbW9kZV9tdXhzZWwiOiBQaHlzaWNhbCBhZGRyZXNzIG9mIE1VWCB0byBzZWxlY3QgYmV0d2VlbgorCQkJCSAgU2Vjb25kYXJ5IFBDTSBhbmQgU2Vjb25kYXJ5IE1JMlMKKwkgImxwYWlmX3RlcnRfbW9kZV9tdXhzZWwiOiBQaHlzaWNhbCBhZGRyZXNzIG9mIE1VWCB0byBzZWxlY3QgYmV0d2VlbgorCQkJCSAgIFByaW1hcnkgUENNIGFuZCBUZXJ0aWFyeSBNSTJTCisJICJscGFpZl9xdWF0X21vZGVfbXV4c2VsIjogUGh5c2ljYWwgYWRkcmVzcyBvZiBNVVggdG8gc2VsZWN0IGJldHdlZW4KKwkJCQkgICBTZWNvbmRhcnkgUENNIGFuZCBRdWFydGVybmFyeSBNSTJTCistIHFjb20sYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzaW5rLAorICB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLgorLSBxY29tLGNkYy1tY2xrLWdwaW9zIDogR1BJTyBvbiB3aGljaCBtY2xrIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20sdGFpa28tbWNsay1jbGstZnJlcSA6IFRhaWtvIG1jbGsgRnJlcSBpbiBIei4gY3VycmVudGx5IG9ubHkgOTYwMDAwMEh6CisJCQkJaXMgc3VwcG9ydGVkLgorLSBxY29tLHByaW0tYXV4cGNtLWdwaW8tY2xrICA6IEdQSU8gb24gd2hpY2ggUHJpbWFyeSBBVVhQQ00gY2xrIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20scHJpbS1hdXhwY20tZ3Bpby1zeW5jIDogR1BJTyBvbiB3aGljaCBQcmltYXJ5IEFVWFBDTSBTWU5DIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20scHJpbS1hdXhwY20tZ3Bpby1kaW4gIDogR1BJTyBvbiB3aGljaCBQcmltYXJ5IEFVWFBDTSBESU4gc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxwcmltLWF1eHBjbS1ncGlvLWRvdXQgOiBHUElPIG9uIHdoaWNoIFByaW1hcnkgQVVYUENNIERPVVQgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxwcmltLWF1eHBjbS1ncGlvLXNldCA6IHNldCBvZiBHUElPIGxpbmVzIHVzZWQgZm9yIFByaW1hcnkgQVVYUENNIHBvcnQKKwkJIFBvc3NpYmxlIFZhbHVlczoKKwkJIHByaW0tZ3Bpby1wcmltIDogUHJpbWFyeSBBVVhQQ00gc2hhcmVzIEdQSU9zIHdpdGggUHJpbWFyeSBNSTJTCisJCSBwcmltLWdwaW8tdGVydCA6IFByaW1hcnkgQVVYUENNIHNoYXJlcyBHUElPcyB3aXRoIFRlcnRpYXJ5IE1JMlMKKy0gcWNvbSxzZWMtYXV4cGNtLWdwaW8tY2xrICA6IEdQSU8gb24gd2hpY2ggU2Vjb25kYXJ5IEFVWFBDTSBjbGsgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxzZWMtYXV4cGNtLWdwaW8tc3luYyA6IEdQSU8gb24gd2hpY2ggU2Vjb25kYXJ5IEFVWFBDTSBTWU5DIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20sc2VjLWF1eHBjbS1ncGlvLWRpbiAgOiBHUElPIG9uIHdoaWNoIFNlY29uZGFyeSBBVVhQQ00gRElOIHNpZ25hbCBpcyBjb21pbmcuCistIHFjb20sc2VjLWF1eHBjbS1ncGlvLWRvdXQgOiBHUElPIG9uIHdoaWNoIFNlY29uZGFyeSBBVVhQQ00gRE9VVCBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLHVzLWV1cm8tZ3Bpb3MgOiBHUElPIG9uIHdoaWNoIGduZC9taWMgc3dhcCBzaWduYWwgaXMgY29taW5nLgorLSBhc29jLXBsYXRmb3JtOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIHBsYXRmb3JtIGRldmljZQorCQkgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKwkJICAgICAgIHRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQkgICAgICAgZ2l2ZW4gaW4gImFzb2MtcGxhdGZvcm0iLgorLSBhc29jLWNwdTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjcHUgZGFpIGRldmljZSBub2RlcworCSAgICB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNwdS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNwdSBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICBjcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorCQkgIHdoZXJlIHRoZSBpZCAoJWQpIGZpZWxkIHJlcHJlc2VudHMgdGhlIGJhY2stZW5kIEFGRSBwb3J0IGlkIHRoYXQKKwkJICB0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkgICAgICBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNvZGVjLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY29kZWMgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgICBjb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICAgIGluICJhc29jLWNvZGVjIi4KK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20saGRtaS1hdWRpby1yeDogc3BlY2lmaWVzIGlmIEhETUkgYXVkaW8gc3VwcG9ydCBpcyBlbmFibGVkIG9yIG5vdC4KKy0gcWNvbSxleHQtdWx0LXNway1hbXAtZ3BpbyA6IEdQSU8gZm9yIGVuYWJsaW5nIG9mIHNwZWFrZXIgcGF0aCBhbXBsaWZpZXIuCisKKy0gcWNvbSxleHQtdWx0LWxvLWFtcC1ncGlvOiBHUElPIHRvIGVuYWJsZSBleHRlcm5hbCB1bHRyYXNvdW5kIGxpbmVvdXQKKwkJCSAgICBhbXBsaWZpZXIuCisKKy0gcWNvbSxoZWFkc2V0LWphY2stdHlwZS1OTzogQWRqdXN0IEdQSU8gbGV2ZWwgYmFzZWQgb24gdGhlIGhlYWRzZXQgamFjayB0eXBlLgorLSBxY29tLHRhcGFuLWNvZGVjLTkzMDI6IEluZGljYXRlcyB0aGF0IHRoaXMgZGV2aWNlIG5vZGUgaXMgZm9yIFdDRDkzMDIgYXVkaW8KKwkJCSAgICBjb2RlYy4KKy0gcWNvbSxtYmhjLWJpYXMtaW50ZXJuYWw6IEZsYWcgdG8gaW5kaWNhdGUgaWYgaW50ZXJuYWwgbWljYmlhcyBzaG91bGQgYmUgdXNlZAorCQkJICAgZm9yIGhlYWRzZXQgZGV0ZWN0aW9uLgorLSBxY29tLGRvY2stcGx1Zy1kZXQtaXJxOiBJbnRlcnJ1cHQgbGluZSB0byBkZXRlY3QgRG9ja2luZy9VbmRvY2tpbmcgb2YgTGlxdWlkCisJCQkgIGRldmljZQorLSBxY29tLGV4dC1zcGstcmVhci1wYW5lbC1pcnE6IEludGVycnVwdCBsaW5lIHRvIGRldGVjdCByZWFyIHBhbmVsIHNwZWFrZXJzCisgICAgICAgICAgICAgIGphY2sgZm9yIERyYWdvbiBCb2FyZC4KKy0gcWNvbSxleHQtc3BrLWZyb250LXBhbmVsLWlycTogSW50ZXJydXB0IGxpbmUgdG8gZGV0ZWN0IGZyb250IHBhbmVsIHNwZWFrZXJzCisgICAgICAgICAgICAgIGphY2sgZm9yIERyYWdvbiBCb2FyZC4KKy0gcWNvbSxleHQtbWljLWZyb250LXBhbmVsLWlycTogSW50ZXJydXB0IGxpbmUgdG8gZGV0ZWN0IGZyb250IHBhbmVsIG1pY3JvcGhvbmUKKyAgICAgICAgICAgICAgamFjayBmb3IgRHJhZ29uIEJvYXJkLgorLSBxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIDogU3RyaW5nIHRvIGluZGljYXRlIHRoZSBqYWNrIHR5cGUgb24gdGhlIGhhcmR3YXJlLgorCQlQb3NzaWJsZSBWYWx1ZXM6CisJCTQtcG9sZS1qYWNrIDogSmFjayBvbiB0aGUgaGFyZHdhcmUgaXMgNC1wb2xlLgorCQk1LXBvbGUtamFjayA6IEphY2sgb24gdGhlIGhhcmR3YXJlIGlzIDUtcG9sZS4KKwkJNi1wb2xlLWphY2sgOiBKYWNrIG9uIHRoZSBoYXJkd2FyZSBpcyA2LXBvbGUuCisKKyogQVBRODA3NCBBU29DIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxhcHE4MDc0LWF1ZGlvLXRhaWtvIgorCitFeGFtcGxlOgorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NzQtYXVkaW8tdGFpa28iOworCXFjb20sbW9kZWwgPSAibXNtODk3NC10YWlrby1zbmQtY2FyZCI7CisKKwlxY29tLGF1ZGlvLXJvdXRpbmcgPQorCQkiUlhfQklBUyIsICJNQ0xLIiwKKwkJIkxET19IIiwgIk1DTEsiLAorCQkiSEVBRFBIT05FIiwgIkxET19IIiwKKwkJIkV4dCBTcGsgQm90dG9tIFBvcyIsICJMSU5FT1VUMSIsCisJCSJFeHQgU3BrIEJvdHRvbSBOZWciLCAiTElORU9VVDMiLAorCQkiRXh0IFNwayBUb3AgUG9zIiwgIkxJTkVPVVQyIiwKKwkJIkV4dCBTcGsgVG9wIE5lZyIsICJMSU5FT1VUNCIsCisJCSJBTUlDMSIsICJNSUMgQklBUzEgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTMSBJbnRlcm5hbDEiLCAiSGFuZHNldCBNaWMiLAorCQkiQU1JQzIiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJIZWFkc2V0IE1pYyIsCisJCSJBTUlDMyIsICJNSUMgQklBUzMgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTMyBJbnRlcm5hbDEiLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiLAorCQkiQU1JQzQiLCAiTUlDIEJJQVMxIEludGVybmFsMiIsCisJCSJNSUMgQklBUzEgSW50ZXJuYWwyIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzIiLAorCQkiRE1JQzMiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAorCQkiRE1JQzQiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAorCQkiRE1JQzUiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzUiLAorCQkiRE1JQzYiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzYiOworCisJcWNvbSxjZGMtbWNsay1ncGlvcyA9IDwmcG04OTQxX2dwaW9zIDE1IDA+OworCXFjb20sdGFpa28tbWNsay1jbGstZnJlcSA9IDw5NjAwMDAwPjsKKwlxY29tLHVzLWV1cm8tZ3Bpb3MgPSA8JnBtODk0MV9ncGlvcyAyMCAwPjsKKworCXFjb20saGRtaS1hdWRpby1yeDsKKwlxY29tLGV4dC11bHQtbG8tYW1wLWdwaW8gPSA8JnBtODk0MV9ncGlvcyA2IDA+OworCisJcWNvbSxleHQtbWNsay1ncGlvICA9IDwmbXNtZ3BpbyA0NyAwPjsKKwlxY29tLGRvY2stcGx1Zy1kZXQtaXJxID0gPCZwbTg4NDFfbXBwcyAyIDA+OworCXFjb20scHJpbS1hdXhwY20tZ3Bpby1jbGsgID0gPCZtc21ncGlvIDY1IDA+OworCXFjb20scHJpbS1hdXhwY20tZ3Bpby1zeW5jID0gPCZtc21ncGlvIDY2IDA+OworCXFjb20scHJpbS1hdXhwY20tZ3Bpby1kaW4gID0gPCZtc21ncGlvIDY3IDA+OworCXFjb20scHJpbS1hdXhwY20tZ3Bpby1kb3V0ID0gPCZtc21ncGlvIDY4IDA+OworCXFjb20scHJpbS1hdXhwY20tZ3Bpby1zZXQgPSAicHJpbS1ncGlvLXByaW0iOworCXFjb20sc2VjLWF1eHBjbS1ncGlvLWNsayAgPSA8Jm1zbWdwaW8gNzkgMD47CisJcWNvbSxzZWMtYXV4cGNtLWdwaW8tc3luYyA9IDwmbXNtZ3BpbyA4MCAwPjsKKwlxY29tLHNlYy1hdXhwY20tZ3Bpby1kaW4gID0gPCZtc21ncGlvIDgxIDA+OworCXFjb20sc2VjLWF1eHBjbS1ncGlvLWRvdXQgPSA8Jm1zbWdwaW8gODIgMD47CisJcWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSA9ICI0LXBvbGUtamFjayI7Cit9OworCisqIG1zbS1kYWktbWkycworCitbRmlyc3QgTGV2ZWwgTm9kZXNdCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAibXNtLWRhaS1taTJzIgorCisgW1NlY29uZCBMZXZlbCBOb2Rlc10KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJxY29tLG1zbS1kYWktcTYtbWkycyIKKyAtIHFjb20sbXNtLWRhaS1xNi1taTJzLWRldi1pZDogTVNNIG9yIE1ETSBjYW4gdXNlIFNsaW1idXMgb3IgSTJTIGludGVyZmFjZSB0bworCQkJCXRyYW5zZmVyIGRhdGEgdG8gKFdDRDlYWFgpIGNvZGVjLgorCQkJCUlmIHNsaW1idXMgaW50ZXJmYWNlIGlzIHVzZWQgdGhlbiAibXNtLWRhaS1xNiIKKwkJCQluZWVkcyB0byBiZSBmaWxsZWQgd2l0aCBjb3JyZWN0IGRhdGEgZm9yCisJCQkJc2xpbWJ1cyBpbnRlcmZhY2UuCisJCQkJVGhlIHNlY3Rpb25zICJtc20tZGFpLW1pMnMiIGlzIHVzZWQgYnkgTURNIG9yCisJCQkJTVNNIHRvIHVzZSBJMlMgaW50ZXJmYWNlIHdpdGggY29kZWMuCisJCQkJVGhpcyBzZWN0aW9uIGlzIHVzZWQgYnkgQ1BVIGRyaXZlciBpbiBBU09DIE1TTQorCQkJCXRvIGNvbmZpZ3VyZSBNSTJTIGludGVyZmFjZS4gTVNNIGludGVybmFsbHkKKwkJCQloYXMgbXVsdGlwbGUgTUkyUyBuYW1lbHkgUHJpbWFyeSwgU2Vjb25kYXJ5LAorCQkJCVRlcnRpYXJ5IGFuZCBRdWF0ZXJuYXJ5IE1JMlMuCisJCQkJVGhleSBhcmUgcmVwcmVzZW50ZWQgd2l0aCBpZCAwLCAxLCAyLCAzCisJCQkJcmVzcGVjdGl2ZWx5LgorCQkJCVRoZSBmaWVsZCAicWNvbSxtc20tZGFpLXE2LW1pMnMtZGV2LWlkIgorCQkJCXJlcHJlc2VudHMgd2hpY2ggb2YgdGhlIE1JMlMgYmxvY2sgaXMgdXNlZC4KKwkJCQlUaGVzZSBNSTJTIGFyZSBjb25uZWN0ZWQgdG8gSTJTIGludGVyZmFjZS4KKworIC0gcWNvbSxtc20tbWkycy1yeC1saW5lczoJRWFjaCBNSTJTIGludGVyZmFjZSBpbiBNU00gaGFzIG9uZSBvciBtb3JlIFNECisJCQkJbGluZXMuIFRoZXNlIGxpbmVzIGFyZSB1c2VkIGZvciBkYXRhIHRyYW5zZmVyCisJCQkJYmV0d2VlbiBjb2RlYyBhbmQgTVNNLgorCQkJCVRoaXMgZWxlbWVudCBpbiBpbmRpY2F0ZXMgd2hpY2ggb3V0cHV0IFJYIGxpbmVzCisJCQkJYXJlIHVzZWQgaW4gdGhlIE1JMlMgaW50ZXJmYWNlLgorCisgLSBxY29tLG1zbS1taTJzLXR4LWxpbmVzOiAgCUVhY2ggTUkyUyBpbnRlcmZhY2UgaW4gTVNNIGhhcyBvbmUgb3IgbW9yZSBTRAorCQkJCWxpbmVzLiBUaGVzZSBsaW5lcyBhcmUgdXNlZCBmb3IgZGF0YSB0cmFuc2ZlcgorCQkJCWJldHdlZW4gY29kZWMgYW5kIE1TTS4KKwkJCQlUaGlzIGVsZW1lbnQgaW4gaW5kaWNhdGVzIHdoaWNoIGlucHV0IFRYIGxpbmVzCisJCQkJYXJlIHVzZWQgaW4gdGhlIE1JMlMgaW50ZXJmYWNlLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIHBpbmN0cmwtbmFtZXM6CQlQaW5jdHJsIHN0YXRlIG5hbWVzIGZvciBlYWNoIHBpbiBncm91cAorCQkJCWNvbmZpZ3VyYXRpb24uCistIHBpbmN0cmwteDogCQkJRGVmaW5lcyBwaW5jdHJsIHN0YXRlIGZvciBlYWNoIHBpbiBncm91cAorCitFeGFtcGxlOgorCitxY29tLG1zbS1kYWktbWkycyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLW1pMnMiOworCQlxY29tLG1zbS1kYWktcTYtbWkycy1wcmltIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LW1pMnMiOworCQkJcWNvbSxtc20tZGFpLXE2LW1pMnMtZGV2LWlkID0gPDA+OworCQkJcWNvbSxtc20tbWkycy1yeC1saW5lcyA9IDwyPjsKKwkJCXFjb20sbXNtLW1pMnMtdHgtbGluZXMgPSA8MT47CisJCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiLCAiaWRsZSI7CisJCQlwaW5jdHJsLTAgPSA8JnRlcnRfbWkyc19hY3RpdmUgJnRlcnRfbWkyc19zZDBfYWN0aXZlPjsKKwkJCXBpbmN0cmwtMSA9IDwmdGVydF9taTJzX3NsZWVwICZ0ZXJ0X21pMnNfc2QwX3NsZWVwPjsKKwkJfTsKK307CisKKyogbXNtLWFkc3AtbG9hZGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlIDogInFjb20sYWRzcC1sb2FkZXIiCisgLSBxY29tLGFkc3Atc3RhdGU6CisJSXQgaXMgcG9zc2libGUgdGhhdCBzb21lIE1TTSB1c2UgUElMIHRvIGxvYWQgdGhlIEFEU1AgaW1hZ2UuIFdoaWxlCisJb3RoZXIgTVNNIG1heSB1c2UgU0JMIHRvIGxvYWQgdGhlIEFEU1AgaW1hZ2UgYXQgYm9vdC4gQXVkaW8gQVBSIG5lZWRzCisJc3RhdGUgb2YgQURTUCB0byByZWdpc3RlciBhbmQgZW5hYmxlIEFQUiB0byBiZSB1c2VkIGZvciBzZW5kaW5nIGNvbW1hbmRzCisJdG8gQURTUC4gc28gYWRzcC1zdGF0ZSByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBBRFNQIHRvIEFEU1AgbG9hZGVyLgorCVZhbHVlIG9mIDAgaW5kaWNhdGVzIEFEU1AgbG9hZGVyIG5lZWRzIHRvIHVzZSBQSUwgYW5kIHZhbHVlIG9mIDIgbWVhbnMKKwlBRFNQIGltYWdlIGlzIGFscmVhZHkgbG9hZGVkIGJ5IFNCTC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHFjb20scHJvYy1pbWctdG8tbG9hZDsKKwlUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGRlZmF1bHQgQURTUAorCWxvYWRpbmcgYnkgUElMLiBCYXNlZCBvbiBzdHJpbmcgaW5wdXQsIGRpZmZlcmVudCBwcm9jIGlzCisJbG9hZGVkLiBSaWdodCBub3cgd2UgYXJlIGFkZGluZyBvcHRpb24gIm1vZGVtIgorCWZvciA4OTE2IHB1cnBvc2UuIERlZmF1bHQgaW1hZ2Ugd2lsbCBiZSAiYWRzcCIgd2hpY2gKKwl3aWxsIGxvYWQgTFBBU1MgUTYgZm9yIG90aGVyIHRhcmdldHMgYXMgZXhwZWN0ZWQuCisJImFkc3AiIG9wdGlvbiBuZWVkIG5vdCBiZSBleHBsaWNpdGx5IG1lbnRpb25lZCBpbgorCURUU0kgZmlsZSwgYXMgaXQgaXMgZGVmYXVsdCBvcHRpb24uCisKK0V4YW1wbGU6CisKK3Fjb20sbXNtLWFkc3AtbG9hZGVyIHsKKwljb21wYXRpYmxlID0gInFjb20sYWRzcC1sb2FkZXIiOworCXFjb20sYWRzcC1zdGF0ZSA9IDwyPjsKKwlxY29tLHByb2MtaW1nLXRvLWxvYWQgPSAibW9kZW0iOworfTsKKworKiBtc20tYXVkaW8taW9uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWF1ZGlvLWlvbiIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHFjb20sc21tdS12ZXJzaW9uOgorCXZlcnNpb24gSUQgdG8gcHJvdmlkZSBpbmZvIHJlZ2FyZGluZyBzbW11IHZlcnNpb24KKwl1c2VkIGluIGNoaXBzZXQuIElmIEFSTSBTTU1VIEhXIC0gdXNlIGlkIHZhbHVlIGFzIDEsCisJSWYgUVNNTVUgSFcgLSB1c2UgaWQgdmFsdWUgYXMgMi4KKworIC0gcWNvbSxzbW11LWVuYWJsZWQ6CisgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBNU00gaGF2ZSBTTU1VIGluIEFEU1AuICBXaGlsZSBvdGhlciBNU00gdXNlCisJbm8gU01NVS4gQXVkaW8gbGliIGludHJvZHVjZSB3cmFwcGVyIGZvciBJT04gQVBJcy4gVGhlIHdyYXBwZXIgbmVlZHMKKyAgICAgICAgcHJlc2VuY2Ugb2YgU01NVSBpbiBBRFNQIHRvIGhhbmRsZSBJT04gQVBJcyBkaWZmZXJlbnRseS4KKyAgICAgICAgUHJlc2VuY2Ugb2YgdGhpcyBwcm9wZXJ0eSBtZWFucyBBRFNQIGhhcyBTTU1VIGluIGl0LgorIC0gaW9tbXVzOgorCUEgcGhhbmRsZSBwYXJzZWQgYnkgc21tdSBkcml2ZXIuIE51bWJlciBvZiBlbnRyaWVzIHdpbGwgdmFyeSBhY3Jvc3MKKwl0YXJnZXRzLgorCitFeGFtcGxlOgorCitxY29tLG1zbS1hdWRpby1pb24geworCWNvbXBhdGlibGUgPSAicWNvbSxtc20tYXVkaW8taW9uOworCXFjb20sc21tdS1lbmFibGVkOworfTsKKworKiBtc20tZGFpLXRkbQorCitbRmlyc3QgTGV2ZWwgTm9kZXNdCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAicWNvbSxtc20tZGFpLXRkbSIKKyAtIHFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtaWQ6IElEIG9mIHRoZSBncm91cCBkZXZpY2UuIFRETSBpbnRlcmZhY2UKKwkJCQlzdXBwb3J0cyB1cCB0byA4IGdyb3VwczoKKwkJCQlQcmltYXJ5IFJYOiAJMzcxMjAKKwkJCQlQcmltYXJ5IFRYOiAJMzcxMjEKKwkJCQlTZWNvbmRhcnkgUlg6IAkzNzEzNgorCQkJCVNlY29uZGFyeSBUWDogCTM3MTM3CisJCQkJVGVydGlhcnkgUlg6IAkzNzE1MgorCQkJCVRlcnRpYXJ5IFRYOiAJMzcxNTMKKwkJCQlRdWF0ZXJuYXJ5IFJYOiAJMzcxNjgKKwkJCQlRdWF0ZXJuYXJ5IFRYOiAJMzcxNjkKKworIC0gcWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1udW0tcG9ydHM6CU51bWJlciBvZiBwb3J0cyBpbgorCQkJCW1zbS1jcHVkYWktdGRtLWdyb3VwLXBvcnQtaWQgYXJyYXkuCisJCQkJTWF4IG51bWJlciBvZiBwb3J0cyBzdXBwb3J0ZWQgYnkgRFNQIGlzIDguCisKKyAtIHFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtcG9ydC1pZDogQXJyYXkgb2YgVERNIHBvcnQgSURzIG9mIHRoZSBncm91cC4KKwkJCQlUaGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgZGV0ZXJtaW5lZCBieQorCQkJCXRoZSB2YWx1ZSBpbiBtc20tY3B1ZGFpLXRkbS1ncm91cC1udW0tcG9ydHMuCisJCQkJRWFjaCBncm91cCBzdXBwb3J0cyB1cCB0byA4IHBvcnRzOgorCQkJCVByaW1hcnkgUlg6IAkzNjg2NCwgMzY4NjYsIDM2ODY4LCAzNjg3MCwKKwkJCQkJCQkJMzY4NzIsIDM2ODc0LCAzNjg3NiwgMzY4NzgKKwkJCQlQcmltYXJ5IFRYOiAJMzY4NjUsIDM2ODY3LCAzNjg2OSwgMzY4NzEsCisJCQkJCQkJCTM2ODczLCAzNjg3NSwgMzY4NzcsIDM2ODc5CisJCQkJU2Vjb25kYXJ5IFJYOiAJMzY4ODAsIDM2ODgyLCAzNjg4NCwgMzY4ODYsCisJCQkJCQkJCTM2ODg4LCAzNjg5MCwgMzY4OTIsIDM2ODk0CisJCQkJU2Vjb25kYXJ5IFRYOgkzNjg4MSwgMzY4ODMsIDM2ODg1LCAzNjg4NywKKwkJCQkJCQkJMzY4ODksIDM2ODkxLCAzNjg5MywgMzY4OTUKKwkJCQlUZXJ0aWFyeSBSWDogCTM2ODk2LCAzNjg5OCwgMzY5MDAsIDM2OTAyLAorCQkJCQkJCQkzNjkwNCwgMzY5MDYsIDM2OTA4LCAzNjkxMAorCQkJCVRlcnRpYXJ5IFRYOiAJMzY4OTcsIDM2ODk5LCAzNjkwMSwgMzY5MDMsCisJCQkJCQkJCTM2OTA1LCAzNjkwNywgMzY5MDksIDM2OTExCisJCQkJUXVhdGVybmFyeSBSWDoJMzY5MTIsIDM2OTE0LCAzNjkxNiwgMzY5MTgsCisJCQkJCQkJCTM2OTIwLCAzNjkyMiwgMzY5MjQsIDM2OTI2CisJCQkJUXVhdGVybmFyeSBUWDoJMzY5MTMsIDM2OTE1LCAzNjkxNywgMzY5MTksCisJCQkJCQkJCTM2OTIxLCAzNjkyMywgMzY5MjUsIDM2OTI3CisKKyAtIHFjb20sbXNtLWNwdWRhaS10ZG0tY2xrLXJhdGU6IENsb2NrIHJhdGUgZm9yIHRkbSAtIDEyMjg4MDAwLgorCQkJCVdoZW4gY2xvY2sgcmF0ZSBpcyBzZXQgdG8gemVybywKKwkJCQl0aGVuIGV4dGVybmFsIGNsb2NrIGlzIGFzc3VtZWQuCisKKyBbU2Vjb25kIExldmVsIE5vZGVzXQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sbXNtLWRhaS1xNi10ZG0iCisgLSBxY29tLG1zbS1kYWktcTYtbWkycy1kZXYtaWQ6IFRETSBwb3J0IElELgorCisgLSBxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtbW9kZTogU3luY2hyb25pemF0aW9uIHNldHRpbmcuCisJCQkJMCAtIFNob3J0IHN5bmMgYml0IG1vZGUKKwkJCQkxIC0gTG9uZyBzeW5jIG1vZGUKKwkJCQkyIC0gU2hvcnQgc3luYyBzbG90IG1vZGUKKworIC0gcWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLXNyYzogU3luY2hyb25pemF0aW9uIHNvdXJjZS4KKwkJCQkwIC0gRXh0ZXJuYWwgc291cmNlCisJCQkJMSAtIEludGVybmFsIHNvdXJjZQorCisgLSBxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtb3V0OiBEYXRhIG91dCBzaWduYWwgdG8gZHJpdmUgd2l0aCBvdGhlciBtYXN0ZXJzLgorCQkJCTAgLSBEaXNhYmxlCisJCQkJMSAtIEVuYWJsZQorCisgLSBxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jOiBJbnZlcnQgdGhlIHN5bmMuCisJCQkJMCAtIE5vcm1hbAorCQkJCTEgLSBJbnZlcnQKKworIC0gcWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLWRlbGF5OiBOdW1iZXIgb2YgYml0IGNsb2NrIHRvIGRlbGF5IGRhdGEKKwkJCQl3aXRoIHJlc3BlY3QgdG8gc3luYyBlZGdlLgorCQkJCTAgLSAwIGJpdCBjbG9jayBjeWNsZQorCQkJCTEgLSAxIGJpdCBjbG9jayBjeWNsZQorCQkJCTIgLSAyIGJpdCBjbG9jayBjeWNsZQorCisgLSBxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtYWxpZ246IEluZGljYXRlIGhvdyBkYXRhIGlzIHBhY2tlZAorCQkJCXdpdGhpbiB0aGUgc2xvdC4gRm9yIGV4YW1wbGUsIDMyIHNsb3Qgd2lkdGggaW4gY2FzZSBvZgorCQkJCXNhbXBsZSBiaXQgd2lkdGggaXMgMjQuCisJCQkJMCAtIE1TQgorCQkJCTEgLSBMU0IKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworIC0gcWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItc3RhcnQtb2Zmc2V0OiBURE0gQ3VzdG9tIGhlYWRlciBzdGFydCBvZmZzZXQKKwkJCQlpbiBieXRlcyBmcm9tIHRoaXMgc3ViLWZyYW1lLiBUaGUgYnl0ZXMgaXMgY291bnRlZCBmcm9tIDAuCisJCQkJMCBpcyBtYXBwZWQgdG8gdGhlIDFzdCBieXRlIGluIG9yIG91dCBvZgorCQkJCXRoZSBkaWdpdGFsIHNlcmlhbCBkYXRhIGxpbmUgdGhpcyBzdWItZnJhbWUgYmVsb25nIHRvLgorCQkJCVN1cHBvcnRlZCB2YWx1ZTogMCwgNCwgOC4KKworIC0gcWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItd2lkdGg6IEhlYWRlciB3aWR0aCBwZXIgZnJhbWUgZm9sbG93ZWQuCisJCQkJMiBieXRlcyBmb3IgTU9TVC9URE0gY2FzZS4KKwkJCQlTdXBwb3J0ZWQgdmFsdWU6IDIuCisKKyAtIHFjb20sbXNtLWNwdWRhaS10ZG0taGVhZGVyLW51bS1mcmFtZS1yZXBlYXQ6IE51bWJlciBvZiBoZWFkZXIgZm9sbG93ZWQuCisJCQkJU3VwcG9ydGVkIHZhbHVlOiA4LgorCisgLSBwaW5jdHJsLW5hbWVzOiBQaW5jdHJsIHN0YXRlIG5hbWVzIGZvciBlYWNoIHBpbiBncm91cAorCQkJCWNvbmZpZ3VyYXRpb24uCisKKyAtIHBpbmN0cmwteDogRGVmaW5lcyBwaW5jdHJsIHN0YXRlIGZvciBlYWNoIHBpbiBncm91cC4KKworRXhhbXBsZToKKworCXFjb20sbXNtLWRhaS10ZG0tcXVhdC1yeCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXRkbSI7CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtaWQgPSA8MzcxNjg+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWdyb3VwLW51bS1wb3J0cyA9IDwxPjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1wb3J0LWlkID0gPDM2OTEyPjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstcmF0ZSA9IDwxMjI4ODAwMD47CisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCIsICJzbGVlcCI7CisJCXBpbmN0cmwtMCA9IDwmcXVhdF90ZG1fYWN0aXZlICZxdWF0X3RkbV9kb3V0X2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmcXVhdF90ZG1fc2xlZXAgJnF1YXRfdGRtX2RvdXRfc2xlZXA+OworCQlkYWlfcXVhdF90ZG1fcnhfMDogcWNvbSxtc20tZGFpLXE2LXRkbS1xdWF0LXJ4LTAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtdGRtIjsKKwkJCXFjb20sbXNtLWNwdWRhaS10ZG0tZGV2LWlkID0gPDM2OTEyPjsKKwkJCXFjb20sbXNtLWNwdWRhaS10ZG0tc3luYy1tb2RlID0gPDA+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLXNyYyA9IDwxPjsKKwkJCXFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1vdXQgPSA8MD47CisJCQlxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jID0gPDA+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLWRlbGF5ID0gPDA+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLWFsaWduID0gPDA+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItc3RhcnQtb2Zmc2V0ID0gPDA+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItd2lkdGggPSA8Mj47CisJCQlxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1udW0tZnJhbWUtcmVwZWF0ID0gPDg+OworCQl9OworCX07CisKKyogTVNNODk5NiBBU29DIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxtc204OTk2LWFzb2Mtc25kLXRvbXRvbSIgZm9yIHRvbXRvbSBjb2RlYyBhbmQKKwkJbm9kZSBpcyAic291bmQiIGFuZCAicWNvbSxtc204OTk2LWFzb2Mtc25kLXRhc2hhIgorCQlmb3IgdGFzaGEgY29kZWMgYW5kIG5vZGUgaXMgInNvdW5kLTkzMzUiCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLHRvbXRvbS1tY2xrLWNsay1mcmVxIDogTUNMSyBmcmVxdWVuY3kgdmFsdWUgZm9yIHRvbXRvbSBjb2RlYworCQkJICAgICAgYW5kIG5vZGUgaXMgInNvdW5kIgorLSBxY29tLHRhc2hhLW1jbGstY2xrLWZyZXEgOiBNQ0xLIGZyZXF1ZW5jeSB2YWx1ZSBmb3IgdGFzaGEgY29kZWMKKwkJCSAgICAgYW5kIG5vZGUgaXMgInNvdW5kLTkzMzUiCistIHFjb20sYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorLSBhc29jLXBsYXRmb3JtOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIHBsYXRmb3JtIGRldmljZQorCQkgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKwkJICAgICAgIHRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQkgICAgICAgZ2l2ZW4gaW4gImFzb2MtcGxhdGZvcm0iLgorLSBhc29jLWNwdTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjcHUgZGFpIGRldmljZSBub2RlcworCSAgICB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNwdS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNwdSBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICBjcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorCQkgIHdoZXJlIHRoZSBpZCAoJWQpIGZpZWxkIHJlcHJlc2VudHMgdGhlIGJhY2stZW5kIEFGRSBwb3J0IGlkIHRoYXQKKwkJICB0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkgICAgICBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNvZGVjLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY29kZWMgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgICBjb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICAgIGluICJhc29jLWNvZGVjIi4KK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20sZXh0LXVsdC1zcGstYW1wLWdwaW8gOiBHUElPIHRvIGVuYWJsZSB1bHRyYXNvdW5kIGVtaXR0ZXIgYW1wLgorLSBxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIDogU3RyaW5nIHRvIGluZGljYXRlIHRoZSBqYWNrIHR5cGUgb24gdGhlIGhhcmR3YXJlLgorCQlQb3NzaWJsZSBWYWx1ZXM6CisJCTQtcG9sZS1qYWNrIDogSmFjayBvbiB0aGUgaGFyZHdhcmUgaXMgNC1wb2xlLgorCQk1LXBvbGUtamFjayA6IEphY2sgb24gdGhlIGhhcmR3YXJlIGlzIDUtcG9sZS4KKwkJNi1wb2xlLWphY2sgOiBKYWNrIG9uIHRoZSBoYXJkd2FyZSBpcyA2LXBvbGUuCistIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KKy0gY2xvY2tzIDogZXh0ZXJuYWwgY2xvY2sgZGVmaW5lZCBmb3IgY29kZWMgY2xvY2suCistIHFjb20saHBoLWVuMS1ncGlvIDogR1BJTyB0byBlbmFibGUgSGlGaSBhbXBsaWZpZXJzLgorLSBxY29tLGhwaC1lbjAtZ3BpbyA6IEdQSU8gdG8gZW5hYmxlIEhpRmkgYXVkaW8gcm91dGUgdG8gaGVhZHNldC4KKy0gcWNvbSx3c2EtbWF4LWRldnMgOiBNYXhpbXVtIG51bWJlciBvZiBXU0E4ODF4IGRldmljZXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0CistIHFjb20sd3NhLWRldnMgOiBMaXN0IG9mIHBoYW5kbGVzIGZvciBhbGwgcG9zc2libGUgV1NBODgxeCBkZXZpY2VzIHN1cHBvcnRlZCBmb3IgdGhlIHRhcmdldAorLSBxY29tLHdzYS1hdXgtZGV2LXByZWZpeCA6IE5hbWUgcHJlZml4IHdpdGggTGVmdC9SaWdodCBjb25maWd1cmF0aW9uIGZvciBXU0E4ODF4IGRldmljZQorCitFeGFtcGxlOgorCisJc291bmQgeworCWNvbXBhdGlibGUgPSAicWNvbSxtc204OTk2LWFzb2Mtc25kIjsKKwlxY29tLG1vZGVsID0gIm1zbTg5OTYtdG9tdG9tLXNuZC1jYXJkIjsKKworCXFjb20sYXVkaW8tcm91dGluZyA9CisJCSJSWF9CSUFTIiwgIk1DTEsiLAorCQkiTERPX0giLCAiTUNMSyIsCisJCSJBSUY0IE1BRCIsICJNQ0xLIiwKKwkJInVsdHJhc291bmQgYW1wIiwgIkxJTkVPVVQxIiwKKwkJInVsdHJhc291bmQgYW1wIiwgIkxJTkVPVVQzIiwKKwkJIkFNSUMxIiwgIk1JQyBCSUFTMSBJbnRlcm5hbDEiLAorCQkiTUlDIEJJQVMxIEludGVybmFsMSIsICJIYW5kc2V0IE1pYyIsCisJCSJBTUlDMiIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkhlYWRzZXQgTWljIiwKKwkJIkFNSUMzIiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiLAorCQkiQU1JQzQiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJBTkNMZWZ0IEhlYWRzZXQgTWljIiwKKwkJIkRNSUMxIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzEgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMxIiwKKwkJIkRNSUMyIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzEgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMyIiwKKwkJIkRNSUMzIiwgIk1JQyBCSUFTMyBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzMgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMzIiwKKwkJIkRNSUM0IiwgIk1JQyBCSUFTMyBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzMgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWM0IiwKKwkJIkRNSUM1IiwgIk1JQyBCSUFTNCBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzQgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWM1IiwKKwkJIkRNSUM2IiwgIk1JQyBCSUFTNCBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzQgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWM2IjsKKworCWNsb2NrLW5hbWVzID0gIm9zcl9jbGsiOworCWNsb2NrcyA9IDwmY2xvY2tfcnBtIGNsa19kaXZfY2xrMT47CisJcWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSA9ICI2LXBvbGUtamFjayI7CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnBjbTI+LCA8JnZvaXA+LCA8JnZvaWNlPiwKKwkJCQk8Jmxvb3BiYWNrPiwgPCZjb21wcmVzcz4sIDwmaG9zdGxlc3M+LAorCQkJCTwmYWZlPiwgPCZsc20+LCA8JnJvdXRpbmc+LCA8JmNwZT4sIDwmY29tcHI+LCA8JmNwZTM+OworCQlhc29jLXBsYXRmb3JtLW5hbWVzID0gIm1zbS1wY20tZHNwLjAiLCAibXNtLXBjbS1kc3AuMSIsICJtc20tcGNtLWRzcC4yIiwKKwkJCQkibXNtLXZvaXAtZHNwIiwgIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsICJtc20tcGNtLWFmZSIsCisJCQkJIm1zbS1sc20tY2xpZW50IiwgIm1zbS1wY20tcm91dGluZyIsICJtc20tY3BlLWxzbSIsCisJCQkJIm1zbS1jb21wci1kc3AiLCAibXNtLWNwZS1sc20uMyI7CisJCWFzb2MtY3B1ID0gPCZkYWlfcHJpX2F1eHBjbT4sIDwmZGFpX3NlY19hdXhwY20+LCA8JmRhaV9oZG1pPiwgPCZkYWlfbWkycz4sCisJCQkJPCZzYl8wX3J4PiwgPCZzYl8wX3R4PiwgPCZzYl8xX3J4PiwgPCZzYl8xX3R4PiwKKwkJCQk8JnNiXzJfcng+LCA8JnNiXzJfdHg+LCA8JnNiXzNfcng+LCA8JnNiXzNfdHg+LAorCQkJCTwmc2JfNF9yeD4sIDwmc2JfNF90eD4sIDwmc2JfNV90eD4sIDwmYWZlX3BjbV9yeD4sCisJCQkJPCZhZmVfcGNtX3R4PiwgPCZhZmVfcHJveHlfcng+LCA8JmFmZV9wcm94eV90eD4sCisJCQkJPCZpbmNhbGxfcmVjb3JkX3J4PiwgPCZpbmNhbGxfcmVjb3JkX3R4PiwKKwkJCQk8JmluY2FsbF9tdXNpY19yeD4sIDwmaW5jYWxsX211c2ljMl9yeD47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLCAibXNtLWRhaS1xNi1hdXhwY20uMiIsCisJCQkJIm1zbS1kYWktcTYtaGRtaS44IiwgIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTAiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MiIsICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwgIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjIyNSIsICJtc20tZGFpLXE2LWRldi4yNDEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yNDAiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MiIsICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcwIjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzIxMT4sIDwmd3NhODgxeF8yMTI+LAorCQkJCTwmd3NhODgxeF8yMTM+LCA8JndzYTg4MXhfMjE0PjsKKwkJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IiwKKwkJCQkJICAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IjsKKwl9OworCisqIE1TTTg5NTIgQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbXNtODk1Mi1hdWRpby1jb2RlYyIKKy0gcWNvbSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNhcmQuCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciByZWdpb24ocykgZm9yIE1JMlMvUENNIE1VWAorLSByZWctbmFtZXMgOiBSZWdpc3RlciByZWdpb24gbmFtZShzKSByZWZlcmVuY2VkIGluIHJlZyBhYm92ZQorCSBSZXF1aXJlZCByZWdpc3RlciByZXNvdXJjZSBlbnRyaWVzIGFyZToKKwkgImNzcl9ncF9pb19tdXhfbWljX2N0bCI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgTVVYIHRoYXQgY29udHJvbHMKKwkJCQljb250cm9scyBMUEEgSUYgdGVydGlhcnksIHF1YWQsIFBDTTAsIERpZ2l0YWwgQ29kZWMKKwkJCQlhbmQgU2Vjb25kYXJ5IFRMTU0gbXV4IHNldHRpbmcgZm9yIG1pYyBwYXRoIG9wZXJhdGlvbi4KKwkgImNzcl9ncF9pb19tdXhfc3Brcl9jdGwiOiBQaHlzaWNhbCBhZGRyZXNzIG9mIE1VWCB0aGF0IGNvbnRyb2xzCisJCQkJSUYgcHJpbWFyeSwgc2Vjb25kYXJ5LCBEaWdpdGFsIENvZGVjIGFuZCBQcmltYXJ5IFRMTU0KKwkJCQlzZXR0aW5nIGZvciBzcGVha2VyIHBhdGggb3BlcmF0aW9uLgorCSAiY3NyX2dwX2lvX2xwYWlmX3ByaV9wY21fcHJpX21vZGVfbXV4c2VsIjogUGh5c2ljYWwgYWRkcmVzcyBvZiBNVVgKKwkJCQl0aGF0IGNvbnRyb2xzIHRoZSBtdXggYmV0d2VlbiBMUEEgSUYgUXVhZCBhbmQgUENNMAorCQkJCXBhdGggdG8gc2Vjb25kYXJ5IFRMTU0KKy0gcWNvbSxtc20taHMtbWljYmlhcy10eXBlIDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJlY29nbml6ZSB0aGUgaGVhZHNldAorICBtaWNiaWFzIHR5cGUsIGludGVybmFsIG9yIGV4dGVybmFsLgorLSBxY29tLG1zbS1leHQtcGEgOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5mb3JtIG1hY2hpbmUgZHJpdmVyIGFib3V0CisgIHRoZSBjb25uZWN0aW9uIG9mIGV4dGVybmFsIFBBIG92ZXIgYXZhaWxhYmxlIE1JMlMgaW50ZXJmYWNlcywKKyAgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgZ2l2ZW4gdG8gdGhpcyBwcm9wZXJ0eS4KKyAgcHJpbWFyeSAtPiBQcmltYXJ5IE1JMlMgaW50ZXJmYWNlCisgIHNlY29uZGFyeSAtPiBTZWNvbmRhcnkgTUkyUyBpbnRlcmZhY2UKKyAgdGVydGlhcnkgLT4gVGVydGlhcnkgTUkyUyBpbnRlcmZhY2UKKyAgcXVhdGVybmFyeSAtPiBRdWF0ZXJuYXJ5IE1JMlMgaW50ZXJmYWNlCistIHFjb20sbXNtLW1iaGMtaHBobC1zd2g6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBoZWFkc2V0IEhQSEwKK3N3aXRjaCB0eXBlIG9uIHRhcmdldCB0eXBpY2FsbHkgdGhlIHN3aXRjaCB0eXBlIHdpbGwgYmUgbm9ybWFsbHkgb3BlbiBvcgorbm9ybWFsbHkgY2xvc2UsIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IDAgZm9yIG5vcm1hbGx5IGNsb3NlIGFuZCAxIGZvcgorbm9ybWFsbHkgb3Blbi4KKy0gIHFjb20sbXNtLW1iaGMtZ25kLXN3aDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGhlYWRzZXQgR05ECitzd2l0Y2ggdHlwZSBvbiB0YXJnZXQgdHlwaWNhbGx5IHRoZSBzd2l0Y2ggdHlwZSB3aWxsIGJlIG5vcm1hbGx5IG9wZW4gb3IKK25vcm1hbGx5IGNsb3NlLCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSAwIGZvciBub3JtYWxseSBjbG9zZSBhbmQgMSBmb3IKK25vcm1hbGx5IG9wZW4uCistIHFjb20sYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorLSBxY29tLG1zbS1ncGlvcyA6IExpc3RzIGRvd24gYWxsIHRoZSBncGlvIHNldHMgdGhhdCBhcmUgc3VwcG9ydGVkLgorLSBxY29tLHBpbmN0cmwtbmFtZXMgOiBMaXN0cyBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZ3BpbyBzZXRzCittZW50aW9uZWQgaW4gcWNvbSxtc20tZ3Bpb3MuCistIHBpbmN0cmwtbmFtZXMgOiBUaGUgY29tYmluYXRpb25zIG9mIGdwaW8gc2V0cyBmcm9tIGFib3ZlIHRoYXQgYXJlIHN1cHBvcnRlZCBpbgordGhlIGZsYXZvci4KKy0gcGluY3RybC0jIDogUGluY3RybCBzdGF0ZXMgYXMgbWVudGlvbmVkIGluIHBpbmN0cmwtbmFtZXMuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20scHJpbS1hdXhwY20tZ3Bpby1jbGsgIDogR1BJTyBvbiB3aGljaCBQcmltYXJ5IEFVWFBDTSBjbGsgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxwcmltLWF1eHBjbS1ncGlvLXN5bmMgOiBHUElPIG9uIHdoaWNoIFByaW1hcnkgQVVYUENNIFNZTkMgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxwcmltLWF1eHBjbS1ncGlvLWRpbiAgOiBHUElPIG9uIHdoaWNoIFByaW1hcnkgQVVYUENNIERJTiBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLHByaW0tYXV4cGNtLWdwaW8tZG91dCA6IEdQSU8gb24gd2hpY2ggUHJpbWFyeSBBVVhQQ00gRE9VVCBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLHByaW0tYXV4cGNtLWdwaW8tc2V0IDogc2V0IG9mIEdQSU8gbGluZXMgdXNlZCBmb3IgUHJpbWFyeSBBVVhQQ00gcG9ydAorLSBxY29tLGNkYy11cy1ldXJvLWdwaW9zIDogR1BJTyBvbiB3aGljaCBnbmQvbWljIHN3YXAgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxtc20tbWljYmlhczEtZXh0LWNhcCA6IEJvb2xlYW4uIEVuYWJsZSBtaWNiaWFzMSBleHRlcm5hbAorY2FwYWNpdG9yIG1vZGUuCistIHFjb20sbXNtLW1pY2JpYXMyLWV4dC1jYXAgOiBCb29sZWFuLiBFbmFibGUgbWljYmlhczIgZXh0ZXJuYWwKK2NhcGFjaXRvciBtb2RlLgorLSBxY29tLG1zbS1zcGstZXh0LXBhIDogR1BJTyB3aGljaCBlbmFibGVzIGV4dGVybmFsIHNwZWFrZXIgcGEuCisKK1RvIENvbmZpZ3VyZSBFeHRlcm5hbCBBdWRpbyBTd2l0Y2gKKy0gcWNvbSxtc20tZXh0LWF1ZGlvLXN3aXRjaCA6IEdQSU8gd2hpY2ggY29udHJvbHMgZXh0ZXJuYWwgc3dpdGNoIHRoYXQgc3dpdGNoZXMKKyAgYXVkaW8gcGF0aCBiZXR3ZWVuIGhlYWRzZXQgYW5kIHNwZWFrZXJzLgorLSBleHQtc3dpdGNoLXZkZC1zdXBwbHkgOiBQb3dlciBzdXBwbHkgdGhhdCBjb250cm9sIGV4dGVybmFsIGF1ZGlvIHN3aXRjaAorLSBxY29tLGV4dC1zd2l0Y2gtdmRkLXZvbHRhZ2UgOiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZvbHRhZ2UgaW4gdVYgdG8gc2V0IGZvcgorICBwb3dlciBzdXBwbHkuCistIHFjb20sZXh0LXN3aXRjaC12ZGQtb3AtbW9kZSA6IE1heG11bSAjIG9mIHVBIGN1cnJlbnQgdGhlIHN3aXRjaCB3aWxsIGRyYXcKKyAgZnJvbSB0aGUgcG93ZXIgc3VwcGx5LgorRXhhbXBsZToKKwlxY29tLG1zbS1leHQtYXVkaW8tc3dpdGNoID0gPCZtc21fZ3BpbyAyIDA+OyAtIGdwaW8gIyBhbmQgYWN0aXZlX3N0YXRlCisJZXh0LXN3aXRjaC12ZGQtc3VwcGx5ID0gPCZwbTg5NTBfbDEzPjsgLSBQb3dlciBSYWlsCisJcWNvbSxleHQtc3dpdGNoLXZkZC12b2x0YWdlID0gPDMwNzUwMDAgMzA3NTAwMD47IC0gTWluLCBNYXggdVYgdm9sdGFnZQorCXFjb20sZXh0LXN3aXRjaC12ZGQtb3AtbW9kZSA9IDw1MDAwPjsgLSBPcGVyYXRpb25hbCBjdXJyZW50IHVBCisJQWRkaXRpb25hbCBuZWVkcyB0byBhZGQgdHdvIGFkZGl0aW9uYWwgcWNvbSxhdWRpby1yb3V0aW5ncworCQkJIkhFQURQSE9ORSIsICJWRERfRVhUX0FVRElPX1NXSVRDSCIKKwkJCSJTUEtfT1VUIiwgIlZERF9FWFRfQVVESU9fU1dJVENIIgorCistIHFjb20sbXNtLW1jbGstZnJlcSA6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmZvcm0gbWFjaGluZSBkcml2ZXIgYWJvdXQKK21jbGsgZnJlcXVlbmN5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCBQQS4KKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKwkJIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCSAgICAgICB0aGUgcGxhdGZvcm0gbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIKKwkJICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKwkgICAgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jcHUtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjcHUgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbi4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisJbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCWNvZGVjIGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCWluICJhc29jLWNvZGVjIi4KKy0gYXNvYy13c2EtY29kZWMtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiB3c2EgY29kZWMgbmFtZXMuIFRoZSBuYW1lcworCQkgIHNob3VsZCBjb21wbHkgd2l0aCB0aGUgd3NhIG5vZGVzIGNvbmZpZ3VyYXRpb25zLgorLSBhc29jLXdzYS1jb2RlYy1wcmVmaXhlczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHdzYSBjb2RlYyBwcmVmaXhlcy4KKy0gbXNtLXZkZC13c2Etc3dpdGNoLXN1cHBseTogV1NBIGNvZGVjIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorLSBxY29tLG1zbS12ZGQtd3NhLXN3aXRjaC12b2x0YWdlOiBXU0EgY29kZWMgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBpbiBtVi4KKy0gcWNvbSxtc20tdmRkLXdzYS1zd2l0Y2gtY3VycmVudDogV1NBIGNvZGVjIG1heCBjdXJyZW50IGxldmVsIGluIG1BLgorCitFeGFtcGxlOgorCSBzb3VuZCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc204OTUyLWF1ZGlvLWNvZGVjIjsKKwkJcWNvbSxtb2RlbCA9ICJtc204OTUyLXNuZC1jYXJkIjsKKwkJcmVnID0gPDB4YzA1MTAwMCAweDQ+LAorCQkgICAgICA8MHhjMDUxMDA0IDB4ND4sCisJCSAgICAgIDwweGMwNTUwMDAgMHg0PjsKKwkJcmVnLW5hbWVzID0gImNzcl9ncF9pb19tdXhfbWljX2N0bCIsCisJCQkgICAgImNzcl9ncF9pb19tdXhfc3Brcl9jdGwiLAorCQkJICAgICJjc3JfZ3BfaW9fbHBhaWZfcHJpX3BjbV9wcmlfbW9kZV9tdXhzZWwiOworCQlxY29tLG1zbS1leHQtcGEgPSAicHJpbWFyeSI7CisJCXFjb20sbXNtLW1jbGstZnJlcSA9IDw5NjAwMDAwPjsKKwkJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwwPjsKKwkJcWNvbSxtc20tbWJoYy1nbmQtc3doID0gPDA+OworCQlxY29tLG1zbS1ocy1taWNiaWFzLXR5cGUgPSAiaW50ZXJuYWwiOworCQlxY29tLG1zbS1taWNiaWFzMS1leHQtY2FwOworCQlxY29tLGF1ZGlvLXJvdXRpbmcgPQorCQkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCQkiU1BLX1JYX0JJQVMiLCAiTUNMSyIsCisJCQkiSU5UX0xET19IIiwgIk1DTEsiLAorCQkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIkhhbmRzZXQgTWljIiwKKwkJCSJNSUMgQklBUyBJbnRlcm5hbDIiLCAiSGVhZHNldCBNaWMiLAorCQkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIlNlY29uZGFyeSBNaWMiLAorCQkJIkFNSUMxIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKKwkJCSJBTUlDMiIsICJNSUMgQklBUyBJbnRlcm5hbDIiLAorCQkJIkFNSUMzIiwgIk1JQyBCSUFTIEV4dGVybmFsIjsKKwkJcWNvbSxtc20tZ3Bpb3MgPQorCQkJInByaV9pMnMiLAorCQkJInVzX2V1X2dwaW8iOworCQlxY29tLHBpbmN0cmwtbmFtZXMgPQorCQkJImFsbF9vZmYiLAorCQkJInByaV9pMnNfYWN0IiwKKwkJCSJ1c19ldV9ncGlvX2FjdCIsCisJCQkicHJpX2kyc191c19ldV9ncGlvX2FjdCI7CisJCXBpbmN0cmwtbmFtZXMgPQorCQkJImFsbF9vZmYiLAorCQkJInByaV9pMnNfYWN0IiwKKwkJCSJ1c19ldV9ncGlvX2FjdCIsCisJCQkicHJpX2kyc191c19ldV9ncGlvX2FjdCI7CisJCXBpbmN0cmwtMCA9IDwmY2RjX3BkbV9saW5lc19zdXMgJmNkY19wZG1fbGluZXNfMl9zdXMgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMSA9IDwmY2RjX3BkbV9saW5lc19hY3QgJmNkY19wZG1fbGluZXNfMl9hY3QgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMiA9IDwmY2RjX3BkbV9saW5lc19zdXMgJmNkY19wZG1fbGluZXNfMl9zdXMgJmNyb3NzX2Nvbm5fZGV0X2FjdD47CisJCXBpbmN0cmwtMyA9IDwmY2RjX3BkbV9saW5lc19hY3QgJmNkY19wZG1fbGluZXNfMl9hY3QgJmNyb3NzX2Nvbm5fZGV0X2FjdD47CisJCXFjb20sY2RjLXVzLWV1cm8tZ3Bpb3MgPSA8Jm1zbV9ncGlvIDYzIDA+OworCQlxY29tLHByaW0tYXV4cGNtLWdwaW8tY2xrICA9IDwmbXNtX2dwaW8gNjMgMD47CisJCXFjb20scHJpbS1hdXhwY20tZ3Bpby1zeW5jID0gPCZtc21fZ3BpbyA2NCAwPjsKKwkJcWNvbSxwcmltLWF1eHBjbS1ncGlvLWRpbiAgPSA8Jm1zbV9ncGlvIDY1IDA+OworCQlxY29tLHByaW0tYXV4cGNtLWdwaW8tZG91dCA9IDwmbXNtX2dwaW8gNjYgMD47CisJCXFjb20scHJpbS1hdXhwY20tZ3Bpby1zZXQgPSAicHJpbS1ncGlvLXByaW0iOworCQlxY29tLHRhcGFuLWNvZGVjLTkzMDI7CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnZvaXA+LCA8JnZvaWNlPiwKKwkJCQk8Jmxvb3BiYWNrPiwgPCZjb21wcmVzcz4sIDwmaG9zdGxlc3M+LAorCQkJCTwmYWZlPiwgPCZsc20+LCA8JnJvdXRpbmc+LCA8JmxwYT47CisJCWFzb2MtcGxhdGZvcm0tbmFtZXMgPSAibXNtLXBjbS1kc3AuMCIsICJtc20tcGNtLWRzcC4xIiwKKwkJCQkibXNtLXZvaXAtZHNwIiwgIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsICJtc20tcGNtLWFmZSIsCisJCQkJIm1zbS1sc20tY2xpZW50IiwgIm1zbS1wY20tcm91dGluZyIsICJtc20tcGNtLWxwYSI7CisJCWFzb2MtY3B1ID0gPCZkYWlfcHJpX2F1eHBjbT4sIDwmZGFpX2hkbWk+LAorCQkJCTwmZGFpX21pMnMwPiwgPCZkYWlfbWkyczE+LCA8JmRhaV9taTJzMj4sIDwmZGFpX21pMnMzPiwKKwkJCQk8JnNiXzBfcng+LCA8JnNiXzBfdHg+LCA8JnNiXzFfcng+LCA8JnNiXzFfdHg+LAorCQkJCTwmc2JfM19yeD4sIDwmc2JfM190eD4sIDwmc2JfNF9yeD4sIDwmc2JfNF90eD4sCisJCQkJPCZidF9zY29fcng+LCA8JmJ0X3Njb190eD4sIDwmaW50X2ZtX3J4PiwgPCZpbnRfZm1fdHg+LAorCQkJCTwmYWZlX3BjbV9yeD4sIDwmYWZlX3BjbV90eD4sIDwmYWZlX3Byb3h5X3J4PiwgPCZhZmVfcHJveHlfdHg+LAorCQkJCTwmaW5jYWxsX3JlY29yZF9yeD4sIDwmaW5jYWxsX3JlY29yZF90eD4sIDwmaW5jYWxsX211c2ljX3J4PiwKKwkJCQk8JmluY2FsbF9tdXNpY18yX3J4PjsKKwkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LWhkbWkuOCIsCisJCQkJIm1zbS1kYWktcTYtbWkycy4wIiwgIm1zbS1kYWktcTYtbWkycy4xIiwKKwkJCQkibXNtLWRhaS1xNi1taTJzLjIiLCAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NCIsICJtc20tZGFpLXE2LWRldi4xNjM4NSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg2IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTAiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MiIsICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjEyMjg4IiwgIm1zbS1kYWktcTYtZGV2LjEyMjg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTIyOTIiLCAibXNtLWRhaS1xNi1kZXYuMTIyOTMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yMjQiLCAibXNtLWRhaS1xNi1kZXYuMjI1IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjQxIiwgIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMzI3NzMiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzAiOworCQlhc29jLWNvZGVjID0gPCZzdHViPiwgPCZwbTg5MTZfdG9tYmFrX2RpZz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSIsICJ0b21iYWtfY29kZWMiOworCQlhc29jLXdzYS1jb2RlYy1uYW1lcyA9ICJ3c2E4ODF4LWkyYy1jb2RlYy44LTAwMGYiOworCQlhc29jLXdzYS1jb2RlYy1wcmVmaXhlcyA9ICJTcGtyTW9ubyI7CisJfTsKKworKiBNU01GQUxDT04gQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbXNtZmFsY29uLWFzb2Mtc25kIgorLSBxY29tLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY2FyZC4KKy0gcWNvbSxtc20taHMtbWljYmlhcy10eXBlIDogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJlY29nbml6ZSB0aGUgaGVhZHNldAorICBtaWNiaWFzIHR5cGUsIGludGVybmFsIG9yIGV4dGVybmFsLgorLSBxY29tLG1zbS1tYmhjLWhwaGwtc3doOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaGVhZHNldCBIUEhMCitzd2l0Y2ggdHlwZSBvbiB0YXJnZXQgdHlwaWNhbGx5IHRoZSBzd2l0Y2ggdHlwZSB3aWxsIGJlIG5vcm1hbGx5IG9wZW4gb3IKK25vcm1hbGx5IGNsb3NlLCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSAwIGZvciBub3JtYWxseSBjbG9zZSBhbmQgMSBmb3IKK25vcm1hbGx5IG9wZW4uCistICBxY29tLG1zbS1tYmhjLWduZC1zd2g6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBoZWFkc2V0IEdORAorc3dpdGNoIHR5cGUgb24gdGFyZ2V0IHR5cGljYWxseSB0aGUgc3dpdGNoIHR5cGUgd2lsbCBiZSBub3JtYWxseSBvcGVuIG9yCitub3JtYWxseSBjbG9zZSwgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgMCBmb3Igbm9ybWFsbHkgY2xvc2UgYW5kIDEgZm9yCitub3JtYWxseSBvcGVuLgorLSBxY29tLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKy0gcWNvbSxtc20tZ3Bpb3MgOiBMaXN0cyBkb3duIGFsbCB0aGUgZ3BpbyBzZXRzIHRoYXQgYXJlIHN1cHBvcnRlZC4KKy0gcWNvbSxwaW5jdHJsLW5hbWVzIDogTGlzdHMgYWxsIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGdwaW8gc2V0cworbWVudGlvbmVkIGluIHFjb20sbXNtLWdwaW9zLgorLSBwaW5jdHJsLW5hbWVzIDogVGhlIGNvbWJpbmF0aW9ucyBvZiBncGlvIHNldHMgZnJvbSBhYm92ZSB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4KK3RoZSBmbGF2b3IuCistIHBpbmN0cmwtIyA6IFBpbmN0cmwgc3RhdGVzIGFzIG1lbnRpb25lZCBpbiBwaW5jdHJsLW5hbWVzLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLGNkYy11cy1ldXJvLWdwaW9zIDogR1BJTyBvbiB3aGljaCBnbmQvbWljIHN3YXAgc2lnbmFsIGlzIGNvbWluZy4KKy0gcWNvbSxtc20tbWljYmlhczEtZXh0LWNhcCA6IEJvb2xlYW4uIEVuYWJsZSBtaWNiaWFzMSBleHRlcm5hbAorY2FwYWNpdG9yIG1vZGUuCistIHFjb20sbXNtLW1pY2JpYXMyLWV4dC1jYXAgOiBCb29sZWFuLiBFbmFibGUgbWljYmlhczIgZXh0ZXJuYWwKK2NhcGFjaXRvciBtb2RlLgorLSBxY29tLG1zbS1zcGstZXh0LXBhIDogR1BJTyB3aGljaCBlbmFibGVzIGV4dGVybmFsIHNwZWFrZXIgcGEuCistIHFjb20sbXNtLW1jbGstZnJlcSA6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmZvcm0gbWFjaGluZSBkcml2ZXIgYWJvdXQKK21jbGsgZnJlcXVlbmN5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCBQQS4KKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKwkJIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCSAgICAgICB0aGUgcGxhdGZvcm0gbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIKKwkJICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKwkgICAgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jcHUtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjcHUgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbi4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisJbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCWNvZGVjIGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCWluICJhc29jLWNvZGVjIi4KKy0gcWNvbSx3c2EtbWF4LWRldnMgOiBNYXhpbXVtIG51bWJlciBvZiBXU0E4ODF4IGRldmljZXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0CistIHFjb20sd3NhLWRldnMgOiBMaXN0IG9mIHBoYW5kbGVzIGZvciBhbGwgcG9zc2libGUgV1NBODgxeCBkZXZpY2VzIHN1cHBvcnRlZCBmb3IgdGhlIHRhcmdldAorLSBxY29tLHdzYS1hdXgtZGV2LXByZWZpeCA6IE5hbWUgcHJlZml4IHdpdGggTGVmdC9SaWdodCBjb25maWd1cmF0aW9uIGZvciBXU0E4ODF4IGRldmljZQorCitFeGFtcGxlOgorCSBzb3VuZCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc21mYWxjb24tYXNvYy1zbmQiOworCQlxY29tLG1vZGVsID0gIm1zbWZhbGNvbi1zbmQtY2FyZCI7CisJCXFjb20sbXNtLW1jbGstZnJlcSA9IDw5NjAwMDAwPjsKKwkJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwwPjsKKwkJcWNvbSxtc20tbWJoYy1nbmQtc3doID0gPDA+OworCQlxY29tLG1zbS1ocy1taWNiaWFzLXR5cGUgPSAiaW50ZXJuYWwiOworCQlxY29tLG1zbS1taWNiaWFzMS1leHQtY2FwOworCQlxY29tLGF1ZGlvLXJvdXRpbmcgPQorCQkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCQkiU1BLX1JYX0JJQVMiLCAiTUNMSyIsCisJCQkiSU5UX0xET19IIiwgIk1DTEsiLAorCQkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIkhhbmRzZXQgTWljIiwKKwkJCSJNSUMgQklBUyBJbnRlcm5hbDIiLCAiSGVhZHNldCBNaWMiLAorCQkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIlNlY29uZGFyeSBNaWMiLAorCQkJIkFNSUMxIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKKwkJCSJBTUlDMiIsICJNSUMgQklBUyBJbnRlcm5hbDIiLAorCQkJIkFNSUMzIiwgIk1JQyBCSUFTIEV4dGVybmFsIjsKKwkJcWNvbSxtc20tZ3Bpb3MgPQorCQkJImludF9wZG0iLAorCQkJInVzX2V1X2dwaW8iOworCQlxY29tLHBpbmN0cmwtbmFtZXMgPQorCQkJImFsbF9vZmYiLAorCQkJImludF9wZG1fYWN0IiwKKwkJCSJ1c19ldV9ncGlvX2FjdCIsCisJCQkiaW50X3BkbV91c19ldV9ncGlvX2FjdCI7CisJCXBpbmN0cmwtbmFtZXMgPQorCQkJImFsbF9vZmYiLAorCQkJImludF9wZG1fYWN0IiwKKwkJCSJ1c19ldV9ncGlvX2FjdCIsCisJCQkiaW50X3BkbV91c19ldV9ncGlvX2FjdCI7CisJCXBpbmN0cmwtMCA9IDwmY2RjX3BkbV9saW5lc19zdXMgJmNkY19wZG1fbGluZXNfMl9zdXMgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMSA9IDwmY2RjX3BkbV9saW5lc19hY3QgJmNkY19wZG1fbGluZXNfMl9hY3QgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMiA9IDwmY2RjX3BkbV9saW5lc19zdXMgJmNkY19wZG1fbGluZXNfMl9zdXMgJmNyb3NzX2Nvbm5fZGV0X2FjdD47CisJCXBpbmN0cmwtMyA9IDwmY2RjX3BkbV9saW5lc19hY3QgJmNkY19wZG1fbGluZXNfMl9hY3QgJmNyb3NzX2Nvbm5fZGV0X2FjdD47CisJCXFjb20sY2RjLXVzLWV1cm8tZ3Bpb3MgPSA8Jm1zbV9ncGlvIDYzIDA+OworCQlhc29jLXBsYXRmb3JtID0gPCZwY20wPiwgPCZwY20xPiwgPCZ2b2lwPiwgPCZ2b2ljZT4sCisJCQkJPCZsb29wYmFjaz4sIDwmY29tcHJlc3M+LCA8Jmhvc3RsZXNzPiwKKwkJCQk8JmFmZT4sIDwmbHNtPiwgPCZyb3V0aW5nPiwgPCZscGE+OworCQlhc29jLXBsYXRmb3JtLW5hbWVzID0gIm1zbS1wY20tZHNwLjAiLCAibXNtLXBjbS1kc3AuMSIsCisJCQkJIm1zbS12b2lwLWRzcCIsICJtc20tcGNtLXZvaWNlIiwgIm1zbS1wY20tbG9vcGJhY2siLAorCQkJCSJtc20tY29tcHJlc3MtZHNwIiwgIm1zbS1wY20taG9zdGxlc3MiLCAibXNtLXBjbS1hZmUiLAorCQkJCSJtc20tbHNtLWNsaWVudCIsICJtc20tcGNtLXJvdXRpbmciLCAibXNtLXBjbS1scGEiOworCQlhc29jLWNwdSA9IDwmZGFpX3ByaV9hdXhwY20+LCA8JmRhaV9oZG1pPiwKKwkJCQk8JmRhaV9taTJzMD4sIDwmZGFpX21pMnMxPiwgPCZkYWlfbWkyczI+LCA8JmRhaV9taTJzMz4sCisJCQkJPCZzYl8wX3J4PiwgPCZzYl8wX3R4PiwgPCZzYl8xX3J4PiwgPCZzYl8xX3R4PiwKKwkJCQk8JnNiXzNfcng+LCA8JnNiXzNfdHg+LCA8JnNiXzRfcng+LCA8JnNiXzRfdHg+LAorCQkJCTwmYnRfc2NvX3J4PiwgPCZidF9zY29fdHg+LCA8JmludF9mbV9yeD4sIDwmaW50X2ZtX3R4PiwKKwkJCQk8JmFmZV9wY21fcng+LCA8JmFmZV9wY21fdHg+LCA8JmFmZV9wcm94eV9yeD4sIDwmYWZlX3Byb3h5X3R4PiwKKwkJCQk8JmluY2FsbF9yZWNvcmRfcng+LCA8JmluY2FsbF9yZWNvcmRfdHg+LCA8JmluY2FsbF9tdXNpY19yeD4sCisJCQkJPCZpbmNhbGxfbXVzaWNfMl9yeD47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLCAibXNtLWRhaS1xNi1oZG1pLjgiLAorCQkJCSJtc20tZGFpLXE2LW1pMnMuMCIsICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCQkJIm1zbS1kYWktcTYtbWkycy4yIiwgIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2MzkwIiwgIm1zbS1kYWktcTYtZGV2LjE2MzkxIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTIiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xMjI4OCIsICJtc20tZGFpLXE2LWRldi4xMjI4OSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjEyMjkyIiwgIm1zbS1kYWktcTYtZGV2LjEyMjkzIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjI0IiwgIm1zbS1kYWktcTYtZGV2LjIyNSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjI0MSIsICJtc20tZGFpLXE2LWRldi4yNDAiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MSIsICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzczIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcwIjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzIxMT4sIDwmd3NhODgxeF8yMTI+LAorCQkJCTwmd3NhODgxeF8yMTM+LCA8JndzYTg4MXhfMjE0PjsKKwkJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IiwKKwkJCQkJICAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IjsKKwl9OworCisqIE1TTTg5NTIgU2xpbWJ1cyBBU29DIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxtc204OTUyLWF1ZGlvLXNsaW1idXMtY29kZWMiCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLHBpbmN0cmwtbmFtZXMgOiBMaXN0cyBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZ3BpbyBzZXRzCittZW50aW9uZWQgaW4gcWNvbSxtc20tZ3Bpb3MuIFNheSB3ZSBoYXZlIDJeTiBjb21iaW5hdGlvbnMgZm9yIE4gR1BJT3MsCit0aGlzIHdvdWxkIGxpc3QgYWxsIHRoZSAyXk4gY29tYmluYXRpb25zLgorLSBwaW5jdHJsLW5hbWVzIDogVGhlIGNvbWJpbmF0aW9ucyBvZiBncGlvIHNldHMgZnJvbSBhYm92ZSB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4KK3RoZSBmbGF2b3IuIFRoaXMgY2FuIGJlIHNvbWV0aW1lcyBzYW1lIGFzIHFjb20sIHBpbmN0cmwtbmFtZXMgaS5lIHdpdGggMl5OCitjb21iaW5hdGlvbnMgb3Igd2lsbCBoYXZlIGxlc3MgaW5jYXNlIGlmIHNvbWUgY29tYmluYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKy0gcGluY3RybC0jIDogUGluY3RybCBzdGF0ZXMgYXMgbWVudGlvbmVkIGluIHBpbmN0cmwtbmFtZXMuCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciByZWdpb24ocykgZm9yIE1JMlMvUENNIE1VWAorLSByZWctbmFtZXMgOiBSZWdpc3RlciByZWdpb24gbmFtZShzKSByZWZlcmVuY2VkIGluIHJlZyBhYm92ZQorCSBSZXF1aXJlZCByZWdpc3RlciByZXNvdXJjZSBlbnRyaWVzIGFyZToKKwkgImNzcl9ncF9pb19tdXhfbWljX2N0bCI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgTVVYIHRoYXQgY29udHJvbHMKKwkJCQljb250cm9scyBMUEEgSUYgdGVydGlhcnksIHF1YWQsIFBDTTAsIERpZ2l0YWwgQ29kZWMKKwkJCQlhbmQgU2Vjb25kYXJ5IFRMTU0gbXV4IHNldHRpbmcgZm9yIG1pYyBwYXRoIG9wZXJhdGlvbi4KKwkgImNzcl9ncF9pb19tdXhfc3Brcl9jdGwiOiBQaHlzaWNhbCBhZGRyZXNzIG9mIE1VWCB0aGF0IGNvbnRyb2xzCisJCQkJSUYgcHJpbWFyeSwgc2Vjb25kYXJ5LCBEaWdpdGFsIENvZGVjIGFuZCBQcmltYXJ5IFRMTU0KKwkJCQlzZXR0aW5nIGZvciBzcGVha2VyIHBhdGggb3BlcmF0aW9uLgorLSBxY29tLGNkYy1tY2xrLWdwaW9zIDogR1BJTyBvbiB3aGljaCBtY2xrIHNpZ25hbCBpcyBjb21pbmcuCistIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KKy0gcWNvbSxhdWRpby1yb3V0aW5nIDogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCisgIEVhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNpbmssCisgIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzb3VyY2UuCisKK09wdGlvbmFsIFByb3BlcnRpZXM6CistIHFjb20sY2RjLXVzLWV1cm8tZ3Bpb3MgOiBHUElPIG9uIHdoaWNoIGduZC9taWMgc3dhcCBzaWduYWwgaXMgY29taW5nLgorLSBxY29tLGNkYy12ZGQtc3Brci1ncGlvcyA6IEdQSU8gd2hpY2ggY29udHJvbHMgUEEgZm9yIFZERCBzcGVha2VyCistIHFjb20saGVhZHNldC1qYWNrLXR5cGUtTkM6IFNldCBpZiB0aGUgaGVhZHNldCBqYWNrIHR5cGUgaXMgTkMgKE5vcm1hbGx5IENsb3NlZCkKKy0gcWNvbSx0b210b20tbWNsay1jbGstZnJlcSA6IFRhcGFuIG1jbGsgRnJlcSBpbiBIei4gY3VycmVudGx5IG9ubHkgOTYwMDAwMEh6CisJCQkJaXMgc3VwcG9ydGVkLgorLSBxY29tLG1zbS1leHQtcGEgOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5mb3JtIG1hY2hpbmUgZHJpdmVyIGFib3V0CisgIHRoZSBjb25uZWN0aW9uIG9mIGV4dGVybmFsIFBBIG92ZXIgYXZhaWxhYmxlIE1JMlMgaW50ZXJmYWNlcywKKyAgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgZ2l2ZW4gdG8gdGhpcyBwcm9wZXJ0eS4KKyAgcHJpbWFyeSAtPiBQcmltYXJ5IE1JMlMgaW50ZXJmYWNlCisgIHNlY29uZGFyeSAtPiBTZWNvbmRhcnkgTUkyUyBpbnRlcmZhY2UKKyAgdGVydGlhcnkgLT4gVGVydGlhcnkgTUkyUyBpbnRlcmZhY2UKKyAgcXVhdGVybmFyeSAtPiBRdWF0ZXJuYXJ5IE1JMlMgaW50ZXJmYWNlCistIHFjb20sbWkycy1hdWRpby1pbnRmOiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5mb3JtIG1hY2hpbmUgZHJpdmVyCisgIGlmIG1pMnMgYmFja2VuZCBkYWlsaW5rIGhhcyB0byBiZSBhZGRlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gcWNvbSxhdXhwY20tYXVkaW8taW50ZjogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZm9ybSBtYWNoaW5lIGRyaXZlcgorICBpZiBhdXhwY20gYmFja2VuZCBkYWlsaW5rIGhhcyB0byBiZSBhZGRlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gcWNvbSxtc20tbWkycy1tYXN0ZXI6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmZvcm0gbWFjaGluZSBkcml2ZXIKKyAgaWYgTVNNIGlzIHRoZSBjbG9jayBtYXN0ZXIgb2YgbWkycy4gMSBtZWFucyBtYXN0ZXIgYW5kIDAgbWVhbnMgc2xhdmUuIFRoZQorICBmaXJzdCBlbnRyeSBpcyBwcmltYXJ5IG1pMnM7IHRoZSBzZWNvbmQgZW50cnkgaXMgc2Vjb25kYXJ5IG1pMnMsIGFuZCBzbyBvbi4KKy0gcmVnOiBUaGlzIHByb3BlcnR5IHByb3ZpZGVzIHRoZSBBVVggUENNL01JMlMgbXV4IHNlbGVjdCByZWdpc3RlciBhZGRyZXNzZXMKKyAgYW5kIHNpemUuCistIHJlZ19uYW1lczogVGhpcyBwcm9wZXJ0eSBwcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgQVVYIFBDTS9NSTJTIG11eCBzZWxlY3QKKyAgcmVnaXN0ZXJzIHNvIHRoZSBtYWNoaW5lIGRyaXZlciBjYW4gcmV0cmlldmUgdGhlIGFkZHJlc3Nlcy4gVGhlIG9yZGVyIG9mIHRoZQorICBuYW1lcyBoYXMgdG8gbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSByZWdpc3RlcnMgaW4gInJlZyIgcHJvcGVydHkuCistIGFzb2MtcGxhdGZvcm06IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gcGxhdGZvcm0gZGV2aWNlCisJCSBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLXBsYXRmb3JtLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgcGxhdGZvcm0gbmFtZXMuIFRoZSBvcmRlciBvZgorCQkgICAgICAgdGhlIHBsYXRmb3JtIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyCisJCSAgICAgICBnaXZlbiBpbiAiYXNvYy1wbGF0Zm9ybSIuCistIGFzb2MtY3B1OiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNwdSBkYWkgZGV2aWNlIG5vZGVzCisJICAgIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtY3B1LW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY3B1IGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQkgIGNwdSBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICBpbiAiYXNvYy1jcHUiLiBUaGUgY3B1IG5hbWVzIGFyZSBpbiB0aGUgZm9ybSBvZiAiJXMuJWQiIGZvcm0sCisJCSAgd2hlcmUgdGhlIGlkICglZCkgZmllbGQgcmVwcmVzZW50cyB0aGUgYmFjay1lbmQgQUZFIHBvcnQgaWQgdGhhdAorCQkgIHRoaXMgQ1BVIGRhaSBpcyBhc3NvY2lhdGVkIHdpdGguCistIGFzb2MtY29kZWM6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY29kZWMgZGFpIGRldmljZQorCSAgICAgIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtY29kZWMtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjb2RlYyBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICAgIGNvZGVjIGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCQkgICAgaW4gImFzb2MtY29kZWMiLgorLSBhc29jLXdzYS1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHdzYSBjb2RlYyBuYW1lcy4gVGhlIG5hbWVzCisJCQlzaG91bGQgY29tcGx5IHdpdGggdGhlIHdzYSBub2RlcyBjb25maWd1cmF0aW9ucy4KKy0gYXNvYy13c2EtY29kZWMtcHJlZml4ZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiB3c2EgY29kZWMgcHJlZml4ZXMuCisKK0V4YW1wbGU6CisJIHNvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NTItYXVkaW8tc2xpbS1jb2RlYyI7CisJCXFjb20sbW9kZWwgPSAibXNtODk1Mi10b210b20tc25kLWNhcmQiOworCQlyZWcgPSA8MHhjMDUxMDAwIDB4ND4sCisJCSAgICAgIDwweGMwNTEwMDQgMHg0PiwKKwkJICAgICAgPDB4YzA1NTAwMCAweDQ+OworCQlyZWctbmFtZXMgPSAiY3NyX2dwX2lvX211eF9taWNfY3RsIiwKKwkJCSAgICAiY3NyX2dwX2lvX211eF9zcGtyX2N0bCIsCisJCQkgICAgImNzcl9ncF9pb19scGFpZl9wcmlfcGNtX3ByaV9tb2RlX211eHNlbCI7CisJCXFjb20sbXNtLWV4dC1wYSA9ICJwcmltYXJ5IjsKKwkJcWNvbSxtaTJzLWF1ZGlvLWludGY7CisJCXFjb20sYXV4cGNtLWF1ZGlvLWludGY7CisJCXFjb20sbXNtLW1pMnMtbWFzdGVyID0gPDE+LCA8MD4sIDwxPiwgPDE+OworCQlyZWcgPSA8MHgxNzExYTAwMCAweDQ+LAorCQkgICAgICA8MHgxNzExYjAwMCAweDQ+LAorCQkgICAgICA8MHgxNzExYzAwMCAweDQ+LAorCQkgICAgICA8MHgxNzExZDAwMCAweDQ+OworCQlyZWctbmFtZXMgPSAibHBhaWZfcHJpX21vZGVfbXV4c2VsIiwKKwkJCSAgICAibHBhaWZfc2VjX21vZGVfbXV4c2VsIiwKKwkJCSAgICAibHBhaWZfdGVydF9tb2RlX211eHNlbCIsCisJCQkgICAgImxwYWlmX3F1YXRfbW9kZV9tdXhzZWwiOworCQlxY29tLG1zbS1tY2xrLWZyZXEgPSA8OTYwMDAwMD47CisJCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MD47CisJCXFjb20sbXNtLW1iaGMtZ25kLXN3aCA9IDwwPjsKKwkJcWNvbSxtc20taHMtbWljYmlhcy10eXBlID0gImludGVybmFsIjsKKwkJcWNvbSxtc20tbWljYmlhczEtZXh0LWNhcDsKKwkJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJCSJSWF9CSUFTIiwgIk1DTEsiLAorCQkJIlNQS19SWF9CSUFTIiwgIk1DTEsiLAorCQkJIklOVF9MRE9fSCIsICJNQ0xLIiwKKwkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJIYW5kc2V0IE1pYyIsCisJCQkiTUlDIEJJQVMgSW50ZXJuYWwyIiwgIkhlYWRzZXQgTWljIiwKKwkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJTZWNvbmRhcnkgTWljIiwKKwkJCSJBTUlDMSIsICJNSUMgQklBUyBFeHRlcm5hbCIsCisJCQkiQU1JQzIiLCAiTUlDIEJJQVMgSW50ZXJuYWwyIiwKKwkJCSJBTUlDMyIsICJNSUMgQklBUyBFeHRlcm5hbCI7CisJCXFjb20sbXNtLWdwaW9zID0KKwkJCSJzbGltIiwKKwkJCSJ1c19ldV9ncGlvIjsKKwkJcWNvbSxwaW5jdHJsLW5hbWVzID0KKwkJCSJhbGxfb2ZmIiwKKwkJCSJzbGltX2FjdCIsCisJCQkidXNfZXVfZ3Bpb19hY3QiLAorCQkJInNsaW1fdXNfZXVfZ3Bpb19hY3QiOworCQlwaW5jdHJsLW5hbWVzID0KKwkJCSJhbGxfb2ZmIiwKKwkJCSJzbGltX2FjdCIsCisJCQkidXNfZXVfZ3Bpb19hY3QiLAorCQkJInNsaW1fdXNfZXVfZ3Bpb19hY3QiOworCQlwaW5jdHJsLTAgPSA8JmNkY19zbGltX2xpbmVzX3N1cyAmY3Jvc3NfY29ubl9kZXRfc3VzPjsKKwkJcGluY3RybC0xID0gPCZjZGNfc2xpbV9saW5lc19hY3QgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMiA9IDwmY2RjX3NsaW1fbGluZXNfc3VzICZjcm9zc19jb25uX2RldF9hY3Q+OworCQlwaW5jdHJsLTMgPSA8JmNkY19zbGltX2xpbmVzX2FjdCAmY3Jvc3NfY29ubl9kZXRfYWN0PjsKKwkJcWNvbSxjZGMtdXMtZXVyby1ncGlvcyA9IDwmbXNtX2dwaW8gNjMgMD47CisJCXFjb20saGVhZHNldC1qYWNrLXR5cGUtTkM7CisJCXFjb20sYXVkaW8tcm91dGluZyA9CisJCQkiUlhfQklBUyIsICJNQ0xLIiwKKwkJCSJMRE9fSCIsICJNQ0xLIiwKKwkJCSJTUEtfT1VUIiwgIk1DTEsiLAorCQkJIkFNSUMxIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMxIEV4dGVybmFsIiwgIkhhbmRzZXQgTWljIiwKKwkJCSJBTUlDMiIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJIZWFkc2V0IE1pYyIsCisJCQkiQU1JQzQiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiLAorCQkJIkFNSUM1IiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkJIkRNSUMxIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMxIEV4dGVybmFsIiwgIkRpZ2l0YWwgTWljMSIsCisJCQkiRE1JQzIiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJCSJNSUMgQklBUzEgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMyIiwKKwkJCSJETUlDMyIsICJNSUMgQklBUzMgRXh0ZXJuYWwiLAorCQkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAorCQkJIkRNSUM0IiwgIk1JQyBCSUFTMyBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMzIEV4dGVybmFsIiwgIkRpZ2l0YWwgTWljNCI7CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnZvaXA+LCA8JnZvaWNlPiwKKwkJCQk8Jmxvb3BiYWNrPiwgPCZjb21wcmVzcz4sIDwmaG9zdGxlc3M+LAorCQkJCTwmYWZlPiwgPCZsc20+LCA8JnJvdXRpbmc+LCA8JmxwYT47CisJCWFzb2MtcGxhdGZvcm0tbmFtZXMgPSAibXNtLXBjbS1kc3AuMCIsICJtc20tcGNtLWRzcC4xIiwKKwkJCQkibXNtLXZvaXAtZHNwIiwgIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsICJtc20tcGNtLWFmZSIsCisJCQkJIm1zbS1sc20tY2xpZW50IiwgIm1zbS1wY20tcm91dGluZyIsICJtc20tcGNtLWxwYSI7CisJCWFzb2MtY3B1ID0gPCZkYWlfaGRtaT4sIDwmZGFpX21pMnMwPiwgPCZkYWlfbWkyczE+LAorCQkJCTwmZGFpX21pMnMyPiwgPCZkYWlfbWkyczM+LCA8JnNiXzBfcng+LCA8JnNiXzBfdHg+LAorCQkJCTwmc2JfMV9yeD4sIDwmc2JfMV90eD4sIDwmc2JfM19yeD4sIDwmc2JfM190eD4sCisJCQkJPCZzYl80X3J4PiwgPCZzYl80X3R4PiwgPCZzYl81X3R4PiwgPCZidF9zY29fcng+LAorCQkJCTwmYnRfc2NvX3R4PiwgPCZpbnRfZm1fcng+LCA8JmludF9mbV90eD4sIDwmYWZlX3BjbV9yeD4sCisJCQkJPCZhZmVfcGNtX3R4PiwgPCZhZmVfcHJveHlfcng+LCA8JmFmZV9wcm94eV90eD4sCisJCQkJPCZpbmNhbGxfcmVjb3JkX3J4PiwgPCZpbmNhbGxfcmVjb3JkX3R4PiwgPCZpbmNhbGxfbXVzaWNfcng+LAorCQkJCTwmaW5jYWxsX211c2ljXzJfcng+OworCQlhc29jLWNwdS1uYW1lcyA9ICJtc20tZGFpLXE2LWhkbWkuOCIsICJtc20tZGFpLXE2LW1pMnMuMCIsCisJCQkJIm1zbS1kYWktcTYtbWkycy4xIiwgIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJCQkibXNtLWRhaS1xNi1taTJzLjMiLCAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NSIsICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwgIm1zbS1kYWktcTYtZGV2LjE2MzkwIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTEiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTIiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MyIsICJtc20tZGFpLXE2LWRldi4xNjM5NSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjEyMjg4IiwgIm1zbS1kYWktcTYtZGV2LjEyMjg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTIyOTIiLCAibXNtLWRhaS1xNi1kZXYuMTIyOTMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yMjQiLCAibXNtLWRhaS1xNi1kZXYuMjI1IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjQxIiwgIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMzI3NzMiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzAiOworCQlhc29jLWNvZGVjID0gPCZzdHViX2NvZGVjPjsKKwkJYXNvYy1jb2RlYy1uYW1lcyA9ICJtc20tc3R1Yi1jb2RlYy4xIjsKKwkJYXNvYy13c2EtY29kZWMtbmFtZXMgPSAid3NhODgxeC4yMDE3MDIxMiI7CisJCWFzb2Mtd3NhLWNvZGVjLXByZWZpeGVzID0gIlNwa3JMZWZ0IjsKKwl9OworCisqIE1ETTk2MDcgQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbWRtOTYwNy1hdWRpby10b210b20iCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KK0VhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNpbmssCit0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLgorLSBxY29tLHRvbXRvbS1tY2xrLWNsay1mcmVxIDogTWFzdGVyIGNsb2NrIHZhbHVlIGdpdmVuIHRvIGNvZGVjLiBTb21lIFdDRDlYWFgKK2NvZGVjIGNhbiBydW4gYXQgZGlmZmVyZW50IG1jbGsgdmFsdWVzLiBNY2xrIHZhbHVlIGNhbiBiZSA5LjZNSHogb3IgMTIuMjg4TUh6LgorLSBwaW5jdHJsLW5hbWVzIDogcGluY3RybCBzdGF0ZSBuYW1lcyBmb3IgZWFjaCBwaW4gZ3JvdXAgY29uZmlndXJhdGlvbi4KKy0gcGluY3RybC14IDogZGVmaW5lcyBwaW5jdHJsIHN0YXRlIGZvciBlYWNoIHBpbiBncm91cAorLSBhc29jLXBsYXRmb3JtOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIHBsYXRmb3JtIGRldmljZQorCQkgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKwkJICAgICAgIHRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQkgICAgICAgZ2l2ZW4gaW4gImFzb2MtcGxhdGZvcm0iLgorLSBhc29jLWNwdTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjcHUgZGFpIGRldmljZSBub2RlcworCSAgICB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNwdS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNwdSBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICBjcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorCQkgIHdoZXJlIHRoZSBpZCAoJWQpIGZpZWxkIHJlcHJlc2VudHMgdGhlIGJhY2stZW5kIEFGRSBwb3J0IGlkIHRoYXQKKwkJICB0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkgICAgICBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNvZGVjLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY29kZWMgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgICBjb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICAgIGluICJhc29jLWNvZGVjIi4KKworRXhhbXBsZToKKworc291bmQgeworCQljb21wYXRpYmxlID0gInFjb20sbWRtOTYwNy1hdWRpby10b210b20iOworCQlxY29tLG1vZGVsID0gIm1kbTk2MDctdG9tdG9tLWkycy1zbmQtY2FyZCI7CisKKwkJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJCSJSWF9CSUFTIiwgIk1DTEsiLAorCQkJIkxET19IIiwgIk1DTEsiLAorCQkJIkFNSUMxIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMxIEV4dGVybmFsIiwgIkhhbmRzZXQgTWljIiwKKwkJCSJBTUlDMiIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJIZWFkc2V0IE1pYyIsCisJCQkiQU1JQzMiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiLAorCQkJIkFNSUM0IiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkJIkRNSUMxIiwgIk1JQyBCSUFTMSBFeHRlcm5hbCIsCisJCQkiTUlDIEJJQVMxIEV4dGVybmFsIiwgIkRpZ2l0YWwgTWljMSIsCisJCQkiRE1JQzMiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJCSJNSUMgQklBUzMgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMzIjsKKworCQlxY29tLHRvbXRvbS1tY2xrLWNsay1mcmVxID0gPDEyMjg4MDAwPjsKKwkJYXNvYy1wbGF0Zm9ybSA9IDwmcGNtMD4sIDwmcGNtMT4sIDwmdm9pcD4sIDwmdm9pY2U+LAorCQkJCTwmbG9vcGJhY2s+LCA8Jmhvc3RsZXNzPiwgPCZhZmU+LCA8JnJvdXRpbmc+LAorCQkJCTwmcGNtX2R0bWY+LCA8Jmhvc3RfcGNtPjsKKwkJYXNvYy1wbGF0Zm9ybS1uYW1lcyA9ICJtc20tcGNtLWRzcC4wIiwgIm1zbS1wY20tZHNwLjEiLAorCQkJCSJtc20tdm9pcC1kc3AiLCAibXNtLXBjbS12b2ljZSIsICJtc20tcGNtLWxvb3BiYWNrIiwKKwkJCQkibXNtLXBjbS1ob3N0bGVzcyIsICJtc20tcGNtLWFmZSIsCisJCQkJIm1zbS1wY20tcm91dGluZyIsICJtc20tcGNtLWR0bWYiLCAibXNtLXZvaWNlLWhvc3QtcGNtIjsKKwkJYXNvYy1jcHUgPSA8JmRhaV9wcmlfYXV4cGNtPiwgPCZtaTJzX3ByaW0+LCA8JmR0bWZfdHg+LAorCQkJCTwmcnhfY2FwdHVyZV90eD4sIDwmcnhfcGxheWJhY2tfcng+LAorCQkJCTwmdHhfY2FwdHVyZV90eD4sIDwmdHhfcGxheWJhY2tfcng+LAorCQkJCTwmYWZlX3BjbV9yeD4sIDwmYWZlX3BjbV90eD4sIDwmYWZlX3Byb3h5X3J4PiwKKwkJCQk8JmFmZV9wcm94eV90eD4sIDwmaW5jYWxsX3JlY29yZF9yeD4sCisJCQkJPCZpbmNhbGxfcmVjb3JkX3R4PiwgPCZpbmNhbGxfbXVzaWNfcng+OworCQlhc29jLWNwdS1uYW1lcyA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwgIm1zbS1kYWktcTYtbWkycy4wIiwKKwkJCQkibXNtLWRhaS1zdHViLWRldi40IiwgIm1zbS1kYWktc3R1Yi1kZXYuNSIsCisJCQkJIm1zbS1kYWktc3R1Yi1kZXYuNiIsICJtc20tZGFpLXN0dWItZGV2LjciLAorCQkJCSJtc20tZGFpLXN0dWItZGV2LjgiLCAibXNtLWRhaS1xNi1kZXYuMjI0IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjI1IiwgIm1zbS1kYWktcTYtZGV2LjI0MSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjI0MCIsICJtc20tZGFpLXE2LWRldi4zMjc3MSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwgIm1zbS1kYWktcTYtZGV2LjMyNzczIjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJfTsKKworKiBNRE1DQUxJRk9STklVTSBBU29DIE1hY2hpbmUgZHJpdmVyCisKKy0gY29tcGF0aWJsZSA6ICJxY29tLG1kbS1hdWRpby10YXNoYSIgZm9yIHRhc2hhIGNvZGVjIGFuZAorICAgICAgICAgICAgICAgIG5vZGUgaXMgInNvdW5kIgorLSBxY29tLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY2FyZC4KKy0gcWNvbSx0YXNoYS1tY2xrLWNsay1mcmVxIDogTUNMSyBmcmVxdWVuY3kgdmFsdWUgZm9yIHRhc2hhIGNvZGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlIGlzICJzb3VuZC05MzM1IgorLSBxY29tLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKyAgICAgICAgICAgICAgICAgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBsYXRmb3JtIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyCisgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKyAgICAgICAgICAgIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtY3B1LW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY3B1IGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorICAgICAgICAgICAgICAgICAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGlkICglZCkgZmllbGQgcmVwcmVzZW50cyB0aGUgYmFjay1lbmQgQUZFIHBvcnQgaWQgdGhhdAorICAgICAgICAgICAgICAgICAgdGhpcyBDUFUgZGFpIGlzIGFzc29jaWF0ZWQgd2l0aC4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisgICAgICAgICAgICAgIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtY29kZWMtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjb2RlYyBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgY29kZWMgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisgICAgICAgICAgICAgICAgICAgIGluICJhc29jLWNvZGVjIi4KK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KKy0gY2xvY2tzIDogZXh0ZXJuYWwgY2xvY2sgZGVmaW5lZCBmb3IgY29kZWMgY2xvY2suCistIHFjb20saHBoLWVuMS1ncGlvIDogR1BJTyB0byBlbmFibGUgSGlGaSBhbXBsaWZpZXJzLgorLSBxY29tLGhwaC1lbjAtZ3BpbyA6IEdQSU8gdG8gZW5hYmxlIEhpRmkgYXVkaW8gcm91dGUgdG8gaGVhZHNldC4KKworRXhhbXBsZToKKworCXNvdW5kIHsKKwljb21wYXRpYmxlID0gInFjb20sbWRtLWF1ZGlvLXRhc2hhIjsKKwlxY29tLG1vZGVsID0gIm1kbS10YXNoYS1pMnMtc25kLWNhcmQiOworCisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCSJMRE9fSCIsICJNQ0xLIiwKKwkJIkFJRjQgTUFEIiwgIk1DTEsiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDEiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDMiLAorCQkiQU1JQzEiLCAiTUlDIEJJQVMxIEludGVybmFsMSIsCisJCSJNSUMgQklBUzEgSW50ZXJuYWwxIiwgIkhhbmRzZXQgTWljIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiSGVhZHNldCBNaWMiLAorCQkiQU1JQzMiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJBTkNSaWdodCBIZWFkc2V0IE1pYyIsCisJCSJBTUlDNCIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzIiLAorCQkiRE1JQzMiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAorCQkiRE1JQzQiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAorCQkiRE1JQzUiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzUiLAorCQkiRE1JQzYiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzYiOworCisJCXFjb20sdGFzaGEtbWNsay1jbGstZnJlcSA9IDwxMjI4ODAwMD47CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnZvaXA+LCA8JnZvaWNlPiwKKwkJCQk8Jmxvb3BiYWNrPiwgPCZob3N0bGVzcz4sIDwmYWZlPiwgPCZyb3V0aW5nPiwKKwkJCQk8JnBjbV9kdG1mPiwgPCZob3N0X3BjbT47CisJCWFzb2MtcGxhdGZvcm0tbmFtZXMgPSAibXNtLXBjbS1kc3AuMCIsICJtc20tcGNtLWRzcC4xIiwKKwkJCQkibXNtLXZvaXAtZHNwIiwgIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1wY20taG9zdGxlc3MiLCAibXNtLXBjbS1hZmUiLAorCQkJCSJtc20tcGNtLXJvdXRpbmciLCAibXNtLXBjbS1kdG1mIiwgIm1zbS12b2ljZS1ob3N0LXBjbSI7CisJCWFzb2MtY3B1ID0gPCZkYWlfcHJpX2F1eHBjbT4sIDwmbWkyc19wcmltPiwgPCZkdG1mX3R4PiwKKwkJCQk8JnJ4X2NhcHR1cmVfdHg+LCA8JnJ4X3BsYXliYWNrX3J4PiwKKwkJCQk8JnR4X2NhcHR1cmVfdHg+LCA8JnR4X3BsYXliYWNrX3J4PiwKKwkJCQk8JmFmZV9wY21fcng+LCA8JmFmZV9wY21fdHg+LCA8JmFmZV9wcm94eV9yeD4sCisJCQkJPCZhZmVfcHJveHlfdHg+LCA8JmluY2FsbF9yZWNvcmRfcng+LAorCQkJCTwmaW5jYWxsX3JlY29yZF90eD4sIDwmaW5jYWxsX211c2ljX3J4PjsKKwkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LW1pMnMuMCIsCisJCQkJIm1zbS1kYWktc3R1Yi1kZXYuNCIsICJtc20tZGFpLXN0dWItZGV2LjUiLAorCQkJCSJtc20tZGFpLXN0dWItZGV2LjYiLCAibXNtLWRhaS1zdHViLWRldi43IiwKKwkJCQkibXNtLWRhaS1zdHViLWRldi44IiwgIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjIyNSIsICJtc20tZGFpLXE2LWRldi4yNDEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yNDAiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MiIsICJtc20tZGFpLXE2LWRldi4zMjc3MyI7CisJCWFzb2MtY29kZWMgPSA8JnN0dWJfY29kZWM+OworCQlhc29jLWNvZGVjLW5hbWVzID0gIm1zbS1zdHViLWNvZGVjLjEiOworCQlxY29tLGF1eC1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJfTsKKworKiBBUFE4MDk2IEF1dG9tb3RpdmUgQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sYXBxODA5Ni1hc29jLXNuZC1hdXRvIiBmb3IgYXV0byBjb2RlYyBhbmQKKwkJbm9kZSBpcyAic291bmQtYXV0byIsCisJCSJxY29tLGFwcTgwOTYtYXNvYy1zbmQtYWRwLWFnYXZlIiBmb3IgYWRwIGFnYXZlIGNvZGVjIGFuZAorCQlub2RlIGlzICJzb3VuZC1hZHAtYWdhdmUiLAorCQkicWNvbSxhcHE4MDk2LWFzb2Mtc25kLWFkcC1tbXhmIiBmb3IgYWRwIG1teGYgY29kZWMgYW5kCisJCW5vZGUgaXMgInNvdW5kLWFkcC1tbXhmIi4KKy0gcWNvbSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNhcmQuCistIGFzb2MtcGxhdGZvcm06IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gcGxhdGZvcm0gZGV2aWNlCisJCW5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCXRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQlnaXZlbiBpbiAiYXNvYy1wbGF0Zm9ybSIuCistIGFzb2MtY3B1OiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNwdSBkYWkgZGV2aWNlIG5vZGVzCisJCXRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtY3B1LW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY3B1IGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQljcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCWluICJhc29jLWNwdSIuIFRoZSBjcHUgbmFtZXMgYXJlIGluIHRoZSBmb3JtIG9mICIlcy4lZCIgZm9ybSwKKwkJd2hlcmUgdGhlIGlkICglZCkgZmllbGQgcmVwcmVzZW50cyB0aGUgYmFjay1lbmQgQUZFIHBvcnQgaWQgdGhhdAorCQl0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkJbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQljb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJaW4gImFzb2MtY29kZWMiLgorCitFeGFtcGxlOgorCisJc291bmQtYXV0byB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxhcHE4MDk2LWFzb2Mtc25kLWF1dG8iOworCQlxY29tLG1vZGVsID0gImFwcTgwOTYtYXV0by1zbmQtY2FyZCI7CisKKwkJYXNvYy1wbGF0Zm9ybSA9IDwmcGNtMD4sIDwmcGNtMT4sIDwmcGNtMj4sIDwmdm9pcD4sIDwmdm9pY2U+LAorCQkJCTwmbG9vcGJhY2s+LCA8JmNvbXByZXNzPiwgPCZob3N0bGVzcz4sCisJCQkJPCZhZmU+LCA8JmxzbT4sIDwmcm91dGluZz4sIDwmY29tcHI+OworCQlhc29jLXBsYXRmb3JtLW5hbWVzID0gIm1zbS1wY20tZHNwLjAiLCAibXNtLXBjbS1kc3AuMSIsCisJCQkJIm1zbS1wY20tZHNwLjIiLCAibXNtLXZvaXAtZHNwIiwKKwkJCQkibXNtLXBjbS12b2ljZSIsICJtc20tcGNtLWxvb3BiYWNrIiwKKwkJCQkibXNtLWNvbXByZXNzLWRzcCIsICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJCQkibXNtLXBjbS1hZmUiLCAibXNtLWxzbS1jbGllbnQiLAorCQkJCSJtc20tcGNtLXJvdXRpbmciLCAibXNtLWNvbXByLWRzcCI7CisJCWFzb2MtY3B1ID0gPCZkYWlfcHJpX2F1eHBjbT4sIDwmZGFpX3NlY19hdXhwY20+LCA8JmRhaV9oZG1pPiwKKwkJCQk8JmRhaV9taTJzPiwgPCZkYWlfbWkyc19xdWF0PiwKKwkJCQk8JmFmZV9wY21fcng+LCA8JmFmZV9wY21fdHg+LAorCQkJCTwmYWZlX3Byb3h5X3J4PiwgPCZhZmVfcHJveHlfdHg+LAorCQkJCTwmaW5jYWxsX3JlY29yZF9yeD4sIDwmaW5jYWxsX3JlY29yZF90eD4sCisJCQkJPCZpbmNhbGxfbXVzaWNfcng+LCA8JmluY2FsbF9tdXNpYzJfcng+LAorCQkJCTwmZGFpX3RlcnRfdGRtX3J4XzA+LCA8JmRhaV90ZXJ0X3RkbV9yeF8xPiwKKwkJCQk8JmRhaV90ZXJ0X3RkbV9yeF8yPiwgPCZkYWlfdGVydF90ZG1fcnhfMz4sCisJCQkJPCZkYWlfdGVydF90ZG1fdHhfMD4sIDwmZGFpX3RlcnRfdGRtX3R4XzE+LAorCQkJCTwmZGFpX3RlcnRfdGRtX3R4XzI+LCA8JmRhaV90ZXJ0X3RkbV90eF8zPiwKKwkJCQk8JmRhaV9xdWF0X3RkbV9yeF8wPiwgPCZkYWlfcXVhdF90ZG1fcnhfMT4sCisJCQkJPCZkYWlfcXVhdF90ZG1fcnhfMj4sIDwmZGFpX3F1YXRfdGRtX3J4XzM+LAorCQkJCTwmZGFpX3F1YXRfdGRtX3R4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8xPiwKKwkJCQk8JmRhaV9xdWF0X3RkbV90eF8yPiwgPCZkYWlfcXVhdF90ZG1fdHhfMz47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLCAibXNtLWRhaS1xNi1hdXhwY20uMiIsCisJCQkJIm1zbS1kYWktcTYtaGRtaS44IiwKKwkJCQkibXNtLWRhaS1xNi1taTJzLjIiLCAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yMjQiLCAibXNtLWRhaS1xNi1kZXYuMjI1IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMjQxIiwgIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMzI3NzMiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzAiLAorCQkJCSJtc20tZGFpLXE2LXRkbS4zNjg5NiIsICJtc20tZGFpLXE2LXRkbS4zNjg5OCIsCisJCQkJIm1zbS1kYWktcTYtdGRtLjM2OTAwIiwgIm1zbS1kYWktcTYtdGRtLjM2OTAyIiwKKwkJCQkibXNtLWRhaS1xNi10ZG0uMzY4OTciLCAibXNtLWRhaS1xNi10ZG0uMzY4OTkiLAorCQkJCSJtc20tZGFpLXE2LXRkbS4zNjkwMSIsICJtc20tZGFpLXE2LXRkbS4zNjkwMyIsCisJCQkJIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwgIm1zbS1kYWktcTYtdGRtLjM2OTE0IiwKKwkJCQkibXNtLWRhaS1xNi10ZG0uMzY5MTYiLCAibXNtLWRhaS1xNi10ZG0uMzY5MTgiLAorCQkJCSJtc20tZGFpLXE2LXRkbS4zNjkxMyIsICJtc20tZGFpLXE2LXRkbS4zNjkxNSIsCisJCQkJIm1zbS1kYWktcTYtdGRtLjM2OTE3IiwgIm1zbS1kYWktcTYtdGRtLjM2OTE5IjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJfTsKKworKiBNU01GQUxDT04gQVNvQyBTbGltYnVzIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxtc21mYWxjb24tYXNvYy1zbmQtdGFzaGEiIGZvciB0YXNoYSBjb2RlYywKKwkJInFjb20sbXNtZmFsY29uLWFzb2Mtc25kLXRhdmlsIiBmb3IgdGF2aWwgY29kZWMuCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLG1zbS1tY2xrLWZyZXEgOiBNQ0xLIGZyZXF1ZW5jeSB2YWx1ZSBmb3IgZXh0ZXJuYWwgY29kZWMKKy0gcWNvbSxtc20tZ3Bpb3MgOiBMaXN0cyBkb3duIGFsbCB0aGUgZ3BpbyBzZXRzIHRoYXQgYXJlIHN1cHBvcnRlZC4KKy0gcWNvbSxwaW5jdHJsLW5hbWVzIDogTGlzdHMgYWxsIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlIGdwaW8gc2V0cworbWVudGlvbmVkIGluIHFjb20sbXNtLWdwaW9zLiBTYXkgd2UgaGF2ZSAyXk4gY29tYmluYXRpb25zIGZvciBOIEdQSU9zLAordGhpcyB3b3VsZCBsaXN0IGFsbCB0aGUgMl5OIGNvbWJpbmF0aW9ucy4KKy0gcGluY3RybC1uYW1lcyA6IFRoZSBjb21iaW5hdGlvbnMgb2YgZ3BpbyBzZXRzIGZyb20gYWJvdmUgdGhhdCBhcmUgc3VwcG9ydGVkIGluCit0aGUgZmxhdm9yLiBUaGlzIGNhbiBiZSBzb21ldGltZXMgc2FtZSBhcyBxY29tLCBwaW5jdHJsLW5hbWVzIGkuZSB3aXRoIDJeTgorY29tYmluYXRpb25zIG9yIHdpbGwgaGF2ZSBsZXNzIGluY2FzZSBpZiBzb21lIGNvbWJpbmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCistIHBpbmN0cmwtIyA6IFBpbmN0cmwgc3RhdGVzIGFzIG1lbnRpb25lZCBpbiBwaW5jdHJsLW5hbWVzLgorLSBxY29tLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKwkJIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCSAgICAgICB0aGUgcGxhdGZvcm0gbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIKKwkJICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKwkgICAgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jcHUtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjcHUgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCQkgIGluICJhc29jLWNwdSIuIFRoZSBjcHUgbmFtZXMgYXJlIGluIHRoZSBmb3JtIG9mICIlcy4lZCIgZm9ybSwKKwkJICB3aGVyZSB0aGUgaWQgKCVkKSBmaWVsZCByZXByZXNlbnRzIHRoZSBiYWNrLWVuZCBBRkUgcG9ydCBpZCB0aGF0CisJCSAgdGhpcyBDUFUgZGFpIGlzIGFzc29jaWF0ZWQgd2l0aC4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisJICAgICAgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQkgICAgY29kZWMgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgICBpbiAiYXNvYy1jb2RlYyIuCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLGNkYy11cy1ldXJvLWdwaW9zIDogR1BJTyBvbiB3aGljaCBnbmQvbWljIHN3YXAgc2lnbmFsIGlzIGNvbWluZy4KKy0gY2xvY2stbmFtZXMgOiBjbG9jayBuYW1lIGRlZmluZWQgZm9yIGV4dGVybmFsIGNsb2NrLgorLSBjbG9ja3MgOiBleHRlcm5hbCBjbG9jayBkZWZpbmVkIGZvciBjb2RlYyBjbG9jay4KKy0gcWNvbSx3c2EtbWF4LWRldnMgOiBNYXhpbXVtIG51bWJlciBvZiBXU0E4ODF4IGRldmljZXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0CistIHFjb20sd3NhLWRldnMgOiBMaXN0IG9mIHBoYW5kbGVzIGZvciBhbGwgcG9zc2libGUgV1NBODgxeCBkZXZpY2VzIHN1cHBvcnRlZCBmb3IgdGhlIHRhcmdldAorLSBxY29tLHdzYS1hdXgtZGV2LXByZWZpeCA6IE5hbWUgcHJlZml4IHdpdGggTGVmdC9SaWdodCBjb25maWd1cmF0aW9uIGZvciBXU0E4ODF4IGRldmljZQorCitFeGFtcGxlOgorCisJc291bmQtOTMzNSB7CisJY29tcGF0aWJsZSA9ICJxY29tLG1zbWZhbGNvbi1hc29jLXNuZC10YXNoYSI7CisJcWNvbSxtb2RlbCA9ICJtc21mYWxjb24tdGFzaGEtc25kLWNhcmQiOworCisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCSJMRE9fSCIsICJNQ0xLIiwKKwkJIkFJRjQgTUFEIiwgIk1DTEsiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDEiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDMiLAorCQkiQU1JQzEiLCAiTUlDIEJJQVMxIEludGVybmFsMSIsCisJCSJNSUMgQklBUzEgSW50ZXJuYWwxIiwgIkhhbmRzZXQgTWljIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiSGVhZHNldCBNaWMiLAorCQkiQU1JQzMiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJBTkNSaWdodCBIZWFkc2V0IE1pYyIsCisJCSJBTUlDNCIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzIiLAorCQkiRE1JQzMiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAorCQkiRE1JQzQiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAorCQkiRE1JQzUiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzUiLAorCQkiRE1JQzYiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzYiOworCisJCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MD47CisJCXFjb20sbXNtLW1iaGMtZ25kLXN3aCA9IDwwPjsKKwkJcWNvbSxtc20tbWNsay1mcmVxID0gPDk2MDAwMDA+OworCQlxY29tLG1zbS1ncGlvcyA9CisJCQkic2xpbSIsCisJCQkidXNfZXVfZ3BpbyI7CisJCXFjb20scGluY3RybC1uYW1lcyA9CisJCQkiYWxsX29mZiIsCisJCQkic2xpbV9hY3QiLAorCQkJInVzX2V1X2dwaW9fYWN0IiwKKwkJCSJzbGltX3VzX2V1X2dwaW9fYWN0IjsKKwkJcGluY3RybC1uYW1lcyA9CisJCQkiYWxsX29mZiIsCisJCQkic2xpbV9hY3QiLAorCQkJInVzX2V1X2dwaW9fYWN0IiwKKwkJCSJzbGltX3VzX2V1X2dwaW9fYWN0IjsKKwkJcGluY3RybC0wID0gPCZjZGNfc2xpbV9saW5lc19zdXMgJmNyb3NzX2Nvbm5fZGV0X3N1cz47CisJCXBpbmN0cmwtMSA9IDwmY2RjX3NsaW1fbGluZXNfYWN0ICZjcm9zc19jb25uX2RldF9zdXM+OworCQlwaW5jdHJsLTIgPSA8JmNkY19zbGltX2xpbmVzX3N1cyAmY3Jvc3NfY29ubl9kZXRfYWN0PjsKKwkJcGluY3RybC0zID0gPCZjZGNfc2xpbV9saW5lc19hY3QgJmNyb3NzX2Nvbm5fZGV0X2FjdD47CisJCXFjb20sY2RjLXVzLWV1cm8tZ3Bpb3MgPSA8Jm1zbV9ncGlvIDYzIDA+OworCQlhc29jLXBsYXRmb3JtID0gPCZwY20wPiwgPCZwY20xPiwgPCZwY20yPiwgPCZ2b2lwPiwgPCZ2b2ljZT4sCisJCQkJPCZsb29wYmFjaz4sIDwmY29tcHJlc3M+LCA8Jmhvc3RsZXNzPiwKKwkJCQk8JmFmZT4sIDwmbHNtPiwgPCZyb3V0aW5nPiwgPCZjcGU+LCA8JmNvbXByPjsKKwkJYXNvYy1wbGF0Zm9ybS1uYW1lcyA9ICJtc20tcGNtLWRzcC4wIiwgIm1zbS1wY20tZHNwLjEiLAorCQkJCSJtc20tcGNtLWRzcC4yIiwgIm1zbS12b2lwLWRzcCIsCisJCQkJIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsCisJCQkJIm1zbS1wY20tYWZlIiwgIm1zbS1sc20tY2xpZW50IiwKKwkJCQkibXNtLXBjbS1yb3V0aW5nIiwgIm1zbS1jcGUtbHNtIiwKKwkJCQkibXNtLWNvbXByLWRzcCI7CisJCWFzb2MtY3B1ID0gPCZkYWlfaGRtaT4sCisJCQkJPCZzYl8wX3J4PiwgPCZzYl8wX3R4PiwgPCZzYl8xX3J4PiwgPCZzYl8xX3R4PiwKKwkJCQk8JnNiXzJfcng+LCA8JnNiXzJfdHg+LCA8JnNiXzNfcng+LCA8JnNiXzNfdHg+LAorCQkJCTwmc2JfNF9yeD4sIDwmc2JfNF90eD4sIDwmc2JfNV90eD4sCisJCQkJPCZhZmVfcGNtX3J4PiwgPCZhZmVfcGNtX3R4PiwgPCZhZmVfcHJveHlfcng+LAorCQkJCTwmYWZlX3Byb3h5X3R4PiwgPCZpbmNhbGxfcmVjb3JkX3J4PiwKKwkJCQk8JmluY2FsbF9yZWNvcmRfdHg+LCA8JmluY2FsbF9tdXNpY19yeD4sCisJCQkJPCZpbmNhbGxfbXVzaWNfMl9yeD4sIDwmc2JfNV9yeD47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtaGRtaS44IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTAiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MiIsICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwgIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjIyNSIsICJtc20tZGFpLXE2LWRldi4yNDEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yNDAiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MiIsICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwgIm1zbS1kYWktcTYtZGV2LjE2Mzk0IjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzIxMT4sIDwmd3NhODgxeF8yMTI+LAorCQkJCTwmd3NhODgxeF8yMTM+LCA8JndzYTg4MXhfMjE0PjsKKwkJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IiwKKwkJCQkJICAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IjsKKwl9OworCisqIE1TTTg5OTggQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbXNtODk5OC1hc29jLXNuZC10YXNoYSIgZm9yIHRhc2hhIGNvZGVjLAorCQkicWNvbSxtc204OTk4LWFzb2Mtc25kLXRhdmlsIiBmb3IgdGF2aWwgY29kZWMuCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLHRhc2hhLW1jbGstY2xrLWZyZXEgOiBNQ0xLIGZyZXF1ZW5jeSB2YWx1ZSBmb3IgdGFzaGEgY29kZWMKKy0gcWNvbSx0YXZpbC1tY2xrLWNsay1mcmVxIDogTUNMSyBmcmVxdWVuY3kgdmFsdWUgZm9yIHRhdmlsIGNvZGVjCistIHFjb20sYXVkaW8tcm91dGluZyA6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorLSBhc29jLXBsYXRmb3JtOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIHBsYXRmb3JtIGRldmljZQorCQkgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1wbGF0Zm9ybS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIHBsYXRmb3JtIG5hbWVzLiBUaGUgb3JkZXIgb2YKKwkJICAgICAgIHRoZSBwbGF0Zm9ybSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlcgorCQkgICAgICAgZ2l2ZW4gaW4gImFzb2MtcGxhdGZvcm0iLgorLSBhc29jLWNwdTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjcHUgZGFpIGRldmljZSBub2RlcworCSAgICB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNwdS1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNwdSBkYWkgbmFtZXMuIFRoZSBvcmRlciBvZiB0aGUKKwkJICBjcHUgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgaW4gImFzb2MtY3B1Ii4gVGhlIGNwdSBuYW1lcyBhcmUgaW4gdGhlIGZvcm0gb2YgIiVzLiVkIiBmb3JtLAorCQkgIHdoZXJlIHRoZSBpZCAoJWQpIGZpZWxkIHJlcHJlc2VudHMgdGhlIGJhY2stZW5kIEFGRSBwb3J0IGlkIHRoYXQKKwkJICB0aGlzIENQVSBkYWkgaXMgYXNzb2NpYXRlZCB3aXRoLgorLSBhc29jLWNvZGVjOiBUaGlzIGlzIHBoYW5kbGUgbGlzdCBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIHRvIGNvZGVjIGRhaSBkZXZpY2UKKwkgICAgICBub2RlcyB0aGF0IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNvdW5kIGNhcmQgZGFpLWxpbmtzLgorLSBhc29jLWNvZGVjLW5hbWVzOiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGxpc3Qgb2YgY29kZWMgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgICBjb2RlYyBkYWkgbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIgZ2l2ZW4KKwkJICAgIGluICJhc29jLWNvZGVjIi4KK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20sbWJoYy1hdWRpby1qYWNrLXR5cGUgOiBTdHJpbmcgdG8gaW5kaWNhdGUgdGhlIGphY2sgdHlwZSBvbiB0aGUgaGFyZHdhcmUuCisJCVBvc3NpYmxlIFZhbHVlczoKKwkJNC1wb2xlLWphY2sgOiBKYWNrIG9uIHRoZSBoYXJkd2FyZSBpcyA0LXBvbGUuCisJCTUtcG9sZS1qYWNrIDogSmFjayBvbiB0aGUgaGFyZHdhcmUgaXMgNS1wb2xlLgorCQk2LXBvbGUtamFjayA6IEphY2sgb24gdGhlIGhhcmR3YXJlIGlzIDYtcG9sZS4KKy0gY2xvY2stbmFtZXMgOiBjbG9jayBuYW1lIGRlZmluZWQgZm9yIGV4dGVybmFsIGNsb2NrLgorLSBjbG9ja3MgOiBleHRlcm5hbCBjbG9jayBkZWZpbmVkIGZvciBjb2RlYyBjbG9jay4KKy0gcWNvbSxocGgtZW4xLWdwaW8gOiBHUElPIHRvIGVuYWJsZSBIaUZpIGFtcGxpZmllcnMuCistIHFjb20saHBoLWVuMC1ncGlvIDogR1BJTyB0byBlbmFibGUgSGlGaSBhdWRpbyByb3V0ZSB0byBoZWFkc2V0LgorLSBxY29tLHdzYS1tYXgtZGV2cyA6IE1heGltdW0gbnVtYmVyIG9mIFdTQTg4MXggZGV2aWNlcyBwcmVzZW50IGluIHRoZSB0YXJnZXQKKy0gcWNvbSx3c2EtZGV2cyA6IExpc3Qgb2YgcGhhbmRsZXMgZm9yIGFsbCBwb3NzaWJsZSBXU0E4ODF4IGRldmljZXMgc3VwcG9ydGVkIGZvciB0aGUgdGFyZ2V0CistIHFjb20sd3NhLWF1eC1kZXYtcHJlZml4IDogTmFtZSBwcmVmaXggd2l0aCBMZWZ0L1JpZ2h0IGNvbmZpZ3VyYXRpb24gZm9yIFdTQTg4MXggZGV2aWNlCistIHFjb20sd2NuLWJ0Zm0gOiBQcm9wZXJ0eSB0byBzcGVjaWZ5IGlmIFdDTiBCVC9GTSBjaGlwIGlzIHVzZWQgZm9yIHRoZSB0YXJnZXQKKworRXhhbXBsZToKKworCXNvdW5kLTkzMzUgeworCWNvbXBhdGlibGUgPSAicWNvbSxtc204OTk4LWFzb2Mtc25kIjsKKwlxY29tLG1vZGVsID0gIm1zbTg5OTgtdGFzaGEtc25kLWNhcmQiOworCisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCSJMRE9fSCIsICJNQ0xLIiwKKwkJIkFJRjQgTUFEIiwgIk1DTEsiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDEiLAorCQkidWx0cmFzb3VuZCBhbXAiLCAiTElORU9VVDMiLAorCQkiQU1JQzEiLCAiTUlDIEJJQVMxIEludGVybmFsMSIsCisJCSJNSUMgQklBUzEgSW50ZXJuYWwxIiwgIkhhbmRzZXQgTWljIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTMiBFeHRlcm5hbCIsCisJCSJNSUMgQklBUzIgRXh0ZXJuYWwiLCAiSGVhZHNldCBNaWMiLAorCQkiQU1JQzMiLCAiTUlDIEJJQVMyIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMiBFeHRlcm5hbCIsICJBTkNSaWdodCBIZWFkc2V0IE1pYyIsCisJCSJBTUlDNCIsICJNSUMgQklBUzIgRXh0ZXJuYWwiLAorCQkiTUlDIEJJQVMyIEV4dGVybmFsIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMxIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMSBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzIiLAorCQkiRE1JQzMiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAorCQkiRE1JQzQiLCAiTUlDIEJJQVMzIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTMyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAorCQkiRE1JQzUiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzUiLAorCQkiRE1JQzYiLCAiTUlDIEJJQVM0IEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTNCBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzYiOworCisJCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MD47CisJCXFjb20sbXNtLW1iaGMtZ25kLXN3aCA9IDwwPjsKKwkJcWNvbSx0YXNoYS1tY2xrLWNsay1mcmVxID0gPDk2MDAwMDA+OworCQlhc29jLXBsYXRmb3JtID0gPCZwY20wPiwgPCZwY20xPiwgPCZwY20yPiwgPCZ2b2lwPiwgPCZ2b2ljZT4sCisJCQkJPCZsb29wYmFjaz4sIDwmY29tcHJlc3M+LCA8Jmhvc3RsZXNzPiwKKwkJCQk8JmFmZT4sIDwmbHNtPiwgPCZyb3V0aW5nPiwgPCZjcGU+LCA8JmNvbXByPjsKKwkJYXNvYy1wbGF0Zm9ybS1uYW1lcyA9ICJtc20tcGNtLWRzcC4wIiwgIm1zbS1wY20tZHNwLjEiLAorCQkJCSJtc20tcGNtLWRzcC4yIiwgIm1zbS12b2lwLWRzcCIsCisJCQkJIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsCisJCQkJIm1zbS1wY20tYWZlIiwgIm1zbS1sc20tY2xpZW50IiwKKwkJCQkibXNtLXBjbS1yb3V0aW5nIiwgIm1zbS1jcGUtbHNtIiwKKwkJCQkibXNtLWNvbXByLWRzcCI7CisJCWFzb2MtY3B1ID0gPCZkYWlfaGRtaT4sCisJCQkJPCZzYl8wX3J4PiwgPCZzYl8wX3R4PiwgPCZzYl8xX3J4PiwgPCZzYl8xX3R4PiwKKwkJCQk8JnNiXzJfcng+LCA8JnNiXzJfdHg+LCA8JnNiXzNfcng+LCA8JnNiXzNfdHg+LAorCQkJCTwmc2JfNF9yeD4sIDwmc2JfNF90eD4sIDwmc2JfNV90eD4sCisJCQkJPCZhZmVfcGNtX3J4PiwgPCZhZmVfcGNtX3R4PiwgPCZhZmVfcHJveHlfcng+LAorCQkJCTwmYWZlX3Byb3h5X3R4PiwgPCZpbmNhbGxfcmVjb3JkX3J4PiwKKwkJCQk8JmluY2FsbF9yZWNvcmRfdHg+LCA8JmluY2FsbF9tdXNpY19yeD4sCisJCQkJPCZpbmNhbGxfbXVzaWNfMl9yeD4sIDwmc2JfNV9yeD47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtaGRtaS44IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTAiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MiIsICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwgIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjIyNSIsICJtc20tZGFpLXE2LWRldi4yNDEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yNDAiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MiIsICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwgIm1zbS1kYWktcTYtZGV2LjE2Mzk0IjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzIxMT4sIDwmd3NhODgxeF8yMTI+LAorCQkJCTwmd3NhODgxeF8yMTM+LCA8JndzYTg4MXhfMjE0PjsKKwkJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IiwKKwkJCQkJICAiU3BrclJpZ2h0IiwgIlNwa3JMZWZ0IjsKKwl9OworCisqIE1TTVNUVUIgQVNvQyBNYWNoaW5lIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sbXNtODk5OC1hc29jLXNuZC1zdHViIiBmb3IgTVNNODk5OCB0YXJnZXQuCisJICAgICAgICJxY29tLG1zbXNrdW5rLWFzb2Mtc25kLXN0dWIiIGZvciBNU01TS1VOSyB0YXJnZXQuCistIHFjb20sbW9kZWwgOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorLSBxY29tLHRhc2hhLW1jbGstY2xrLWZyZXEgOiBNQ0xLIGZyZXF1ZW5jeSB2YWx1ZSBmb3IgdGFzaGEgY29kZWMKKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKwkJIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCSAgICAgICB0aGUgcGxhdGZvcm0gbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIKKwkJICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKwkgICAgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jcHUtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjcHUgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCQkgIGluICJhc29jLWNwdSIuIFRoZSBjcHUgbmFtZXMgYXJlIGluIHRoZSBmb3JtIG9mICIlcy4lZCIgZm9ybSwKKwkJICB3aGVyZSB0aGUgaWQgKCVkKSBmaWVsZCByZXByZXNlbnRzIHRoZSBiYWNrLWVuZCBBRkUgcG9ydCBpZCB0aGF0CisJCSAgdGhpcyBDUFUgZGFpIGlzIGFzc29jaWF0ZWQgd2l0aC4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisJICAgICAgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQkgICAgY29kZWMgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgICBpbiAiYXNvYy1jb2RlYyIuCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLHdzYS1tYXgtZGV2cyA6IE1heGltdW0gbnVtYmVyIG9mIFdTQTg4MXggZGV2aWNlcyBwcmVzZW50IGluIHRoZSB0YXJnZXQKKworRXhhbXBsZToKKworCXNvdW5kX21zbTpzb3VuZC05MzM1IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5OTgtYXNvYy1zbmQtc3R1YiI7CisJCXFjb20sbW9kZWwgPSAibXNtODk5OC1zdHViLXNuZC1jYXJkIjsKKworCQlxY29tLHRhc2hhLW1jbGstY2xrLWZyZXEgPSA8OTYwMDAwMD47CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+OworCQlhc29jLXBsYXRmb3JtLW5hbWVzID0gIm1zbS1wY20tZHNwLjAiOworCQlhc29jLWNwdSA9IDwmc2JfMF9yeD4sIDwmc2JfMF90eD47CisJCWFzb2MtY3B1LW5hbWVzID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg1IjsKKwkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDA+OworCX07CisKKyogV0NEIERTUCBtYW5hZ2VyIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogInFjb20sd2NkLWRzcC1tZ3IiCistIHFjb20sd2RzcC1jb21wb25lbnRzIDogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byB0aGUKKwkJCSBjb21wb25lbnRzIG9mIHRoZSBtYW5hZ2VyIGRyaXZlci4gTWFuYWdlciBkcml2ZXIgd2lsbAorCQkJIHJlZ2lzdGVyIHRvIGNvbXBvbmVudCBmcmFtZXdvcmsgd2l0aCB0aGVzZSBwaGFuZGxlcy4KKy0gcWNvbSxpbWctZmlsZW5hbWUgOiBTdHJpbmcgcHJvcGVydHkgdG8gcHJvdmlkZSB0aGUgZHNwIGltYWdlIGZpbGUgbmFtZSB0aGF0IGlzCisJCSAgICAgdG8gYmUgcmVhZCBmcm9tIGZpbGUgc3lzdGVtIGFuZCBkb3dubG9hZGVkIHRvIGRzcCBtZW1vcnkKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20sd2RzcC1jbXBudC1kZXYtbmFtZSA6IFByb3BlcnR5IHRoYXQgbWFuYWdlciBkcml2ZXIgd2lsbCBwYXJzZSwgYnV0IGRlZmluZWQKKwkJCSAgICAgaW4gdGhlIGNoaWxkJ3MgRFQgZW50cnkgdGhhdCBpcyBnaXZlbiB0byBtYW5hZ2VyIGRyaXZlcgorCQkJICAgICB3aXRoIHBoYW5kbGUuIFRoaXMgcHJvcGVydHkgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtYW5hZ2VyCisJCQkgICAgIGRyaXZlciBpbiBjYXNlIHRoZSBtYW5hZ2VyIGRyaXZlciBjYW5ub3QgbWF0Y2ggY2hpbGQncworCQkJICAgICBvZl9ub2RlIHBvaW50ZXIgdG8gcmVnaXN0ZXJlZCBwaGFuZGxlLgorCitFeGFtcGxlOgorCisJcWNvbSx3Y2QtZHNwLW1nciB7CisJCWNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLW1nciI7CisJCXFjb20sd2RzcC1jb21wb25lbnRzID0gPCZ3Y2Q5MzR4X2NkYyAwPiwKKwkJCQkgICAgICAgPCZ3Y2Rfc3BpXzAgMT4sCisJCQkJICAgICAgIDwmZ2xpbmtfc3BpIDI+OworCQlxY29tLGltZy1maWxlbmFtZSA9ICJjcGVfOTM0MCI7CisJfTsKKworRXhhbXBsZSBvZiBjaGlsZCBub2RlIHRoYXQgd291bGQgaGF2ZSBxY29tLHdkc3AtY21wbnQtZGV2LW5hbWUgcHJvcGVydHkKKworCXdjZDkzNHhfY2RjOiB0YXZpbF9jb2RlYyB7CisJCXFjb20sd2RzcC1jbXBudC1kZXYtbmFtZSA9ICJ0YXZpbF9jb2RlYyI7CisJfTsKKworKiBNU01TS1VOSyBBU29DIE1hY2hpbmUgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAicWNvbSxtc21za3Vuay1hc29jLXNuZC10YXZpbCIKKy0gcWNvbSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNhcmQuCistIHFjb20sdGF2aWwtbWNsay1jbGstZnJlcSA6IE1DTEsgZnJlcXVlbmN5IHZhbHVlIGZvciB0YXZpbCBjb2RlYworLSBxY29tLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKy0gYXNvYy1wbGF0Zm9ybTogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBwbGF0Zm9ybSBkZXZpY2UKKwkJIG5vZGVzIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgc291bmQgY2FyZCBkYWktbGlua3MuCistIGFzb2MtcGxhdGZvcm0tbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBwbGF0Zm9ybSBuYW1lcy4gVGhlIG9yZGVyIG9mCisJCSAgICAgICB0aGUgcGxhdGZvcm0gbmFtZXMgc2hvdWxkIG1hdGNoIHRvIHRoYXQgb2YgdGhlIHBoYW5kbGUgb3JkZXIKKwkJICAgICAgIGdpdmVuIGluICJhc29jLXBsYXRmb3JtIi4KKy0gYXNvYy1jcHU6IFRoaXMgaXMgcGhhbmRsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgdG8gY3B1IGRhaSBkZXZpY2Ugbm9kZXMKKwkgICAgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jcHUtbmFtZXM6IFRoaXMgcHJvcGVydHkgY29udGFpbnMgbGlzdCBvZiBjcHUgZGFpIG5hbWVzLiBUaGUgb3JkZXIgb2YgdGhlCisJCSAgY3B1IGRhaSBuYW1lcyBzaG91bGQgbWF0Y2ggdG8gdGhhdCBvZiB0aGUgcGhhbmRsZSBvcmRlciBnaXZlbgorCQkgIGluICJhc29jLWNwdSIuIFRoZSBjcHUgbmFtZXMgYXJlIGluIHRoZSBmb3JtIG9mICIlcy4lZCIgZm9ybSwKKwkJICB3aGVyZSB0aGUgaWQgKCVkKSBmaWVsZCByZXByZXNlbnRzIHRoZSBiYWNrLWVuZCBBRkUgcG9ydCBpZCB0aGF0CisJCSAgdGhpcyBDUFUgZGFpIGlzIGFzc29jaWF0ZWQgd2l0aC4KKy0gYXNvYy1jb2RlYzogVGhpcyBpcyBwaGFuZGxlIGxpc3QgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyB0byBjb2RlYyBkYWkgZGV2aWNlCisJICAgICAgbm9kZXMgdGhhdCBhcmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzb3VuZCBjYXJkIGRhaS1saW5rcy4KKy0gYXNvYy1jb2RlYy1uYW1lczogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBsaXN0IG9mIGNvZGVjIGRhaSBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZQorCQkgICAgY29kZWMgZGFpIG5hbWVzIHNob3VsZCBtYXRjaCB0byB0aGF0IG9mIHRoZSBwaGFuZGxlIG9yZGVyIGdpdmVuCisJCSAgICBpbiAiYXNvYy1jb2RlYyIuCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIDogU3RyaW5nIHRvIGluZGljYXRlIHRoZSBqYWNrIHR5cGUgb24gdGhlIGhhcmR3YXJlLgorCQlQb3NzaWJsZSBWYWx1ZXM6CisJCTQtcG9sZS1qYWNrIDogSmFjayBvbiB0aGUgaGFyZHdhcmUgaXMgNC1wb2xlLgorCQk1LXBvbGUtamFjayA6IEphY2sgb24gdGhlIGhhcmR3YXJlIGlzIDUtcG9sZS4KKwkJNi1wb2xlLWphY2sgOiBKYWNrIG9uIHRoZSBoYXJkd2FyZSBpcyA2LXBvbGUuCistIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KKy0gY2xvY2tzIDogZXh0ZXJuYWwgY2xvY2sgZGVmaW5lZCBmb3IgY29kZWMgY2xvY2suCistIHFjb20saHBoLWVuMS1ncGlvIDogR1BJTyB0byBlbmFibGUgSGlGaSBhbXBsaWZpZXJzLgorLSBxY29tLGhwaC1lbjAtZ3BpbyA6IEdQSU8gdG8gZW5hYmxlIEhpRmkgYXVkaW8gcm91dGUgdG8gaGVhZHNldC4KKy0gcWNvbSx3c2EtbWF4LWRldnMgOiBNYXhpbXVtIG51bWJlciBvZiBXU0E4ODF4IGRldmljZXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0CistIHFjb20sd3NhLWRldnMgOiBMaXN0IG9mIHBoYW5kbGVzIGZvciBhbGwgcG9zc2libGUgV1NBODgxeCBkZXZpY2VzIHN1cHBvcnRlZCBmb3IgdGhlIHRhcmdldAorLSBxY29tLHdzYS1hdXgtZGV2LXByZWZpeCA6IE5hbWUgcHJlZml4IHdpdGggTGVmdC9SaWdodCBjb25maWd1cmF0aW9uIGZvciBXU0E4ODF4IGRldmljZQorLSBxY29tLHdjbi1idGZtIDogUHJvcGVydHkgdG8gc3BlY2lmeSBpZiBXQ04gQlQvRk0gY2hpcCBpcyB1c2VkIGZvciB0aGUgdGFyZ2V0CisKK0V4YW1wbGU6CisKKwlzb3VuZC10YXZpbCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc21za3Vuay1hc29jLXNuZC10YXZpbCI7CisJCXFjb20sbW9kZWwgPSAibXNtc2t1bmstdGF2aWwtc25kLWNhcmQiOworCQlxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4OworCQlxY29tLHdjbi1idGZtOworCQlxY29tLG1pMnMtYXVkaW8taW50ZjsKKwkJcWNvbSxhdXhwY20tYXVkaW8taW50ZjsKKwkJcWNvbSxtc20tbWkycy1tYXN0ZXIgPSA8MT4sIDwxPiwgPDE+LCA8MT47CisKKwkJcmVnID0gPDB4MTcxMWEwMDAgMHg0PiwKKwkJICAgICAgPDB4MTcxMWIwMDAgMHg0PiwKKwkJICAgICAgPDB4MTcxMWMwMDAgMHg0PiwKKwkJICAgICAgPDB4MTcxMWQwMDAgMHg0PjsKKwkJcmVnLW5hbWVzID0gImxwYWlmX3ByaV9tb2RlX211eHNlbCIsCisJCQkgICAgImxwYWlmX3NlY19tb2RlX211eHNlbCIsCisJCQkgICAgImxwYWlmX3RlcnRfbW9kZV9tdXhzZWwiLAorCQkJICAgICJscGFpZl9xdWF0X21vZGVfbXV4c2VsIjsKKworCQlxY29tLGF1ZGlvLXJvdXRpbmcgPQorCQkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCQkiTUFESU5QVVQiLCAiTUNMSyIsCisJCQkiaGlmaSBhbXAiLCAiTElORU9VVDEiLAorCQkJImhpZmkgYW1wIiwgIkxJTkVPVVQyIiwKKwkJCSJBTUlDMiIsICJNSUMgQklBUzIiLAorCQkJIk1JQyBCSUFTMiIsICJIZWFkc2V0IE1pYyIsCisJCQkiQU1JQzMiLCAiTUlDIEJJQVMyIiwKKwkJCSJNSUMgQklBUzIiLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiLAorCQkJIkFNSUM0IiwgIk1JQyBCSUFTMiIsCisJCQkiTUlDIEJJQVMyIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkJIkFNSUM1IiwgIk1JQyBCSUFTMyIsCisJCQkiTUlDIEJJQVMzIiwgIkhhbmRzZXQgTWljIiwKKwkJCSJETUlDMCIsICJNSUMgQklBUzEiLAorCQkJIk1JQyBCSUFTMSIsICJEaWdpdGFsIE1pYzAiLAorCQkJIkRNSUMxIiwgIk1JQyBCSUFTMSIsCisJCQkiTUlDIEJJQVMxIiwgIkRpZ2l0YWwgTWljMSIsCisJCQkiRE1JQzIiLCAiTUlDIEJJQVMzIiwKKwkJCSJNSUMgQklBUzMiLCAiRGlnaXRhbCBNaWMyIiwKKwkJCSJETUlDMyIsICJNSUMgQklBUzMiLAorCQkJIk1JQyBCSUFTMyIsICJEaWdpdGFsIE1pYzMiLAorCQkJIkRNSUM0IiwgIk1JQyBCSUFTNCIsCisJCQkiTUlDIEJJQVM0IiwgIkRpZ2l0YWwgTWljNCIsCisJCQkiRE1JQzUiLCAiTUlDIEJJQVM0IiwKKwkJCSJNSUMgQklBUzQiLCAiRGlnaXRhbCBNaWM1IiwKKwkJCSJTcGtyTGVmdCBJTiIsICJTUEsxIE9VVCIsCisJCQkiU3BrclJpZ2h0IElOIiwgIlNQSzIgT1VUIjsKKworCQlxY29tLG1zbS1tYmhjLWhwaGwtc3doID0gPDA+OworCQlxY29tLG1zbS1tYmhjLWduZC1zd2ggPSA8MD47CisJCXFjb20saHBoLWVuMC1ncGlvID0gPCZ0YXZpbF9ocGhfZW4wPjsKKwkJcWNvbSxocGgtZW4xLWdwaW8gPSA8JnRhdmlsX2hwaF9lbjE+OworCQlxY29tLHRhdmlsLW1jbGstY2xrLWZyZXEgPSA8OTYwMDAwMD47CisJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnBjbTI+LCA8JnZvaXA+LCA8JnZvaWNlPiwKKwkJCQk8Jmxvb3BiYWNrPiwgPCZjb21wcmVzcz4sIDwmaG9zdGxlc3M+LAorCQkJCTwmYWZlPiwgPCZsc20+LCA8JnJvdXRpbmc+LCA8JmNwZT4sIDwmY29tcHI+LAorCQkJCTwmcGNtX25vaXJxPjsKKwkJYXNvYy1wbGF0Zm9ybS1uYW1lcyA9ICJtc20tcGNtLWRzcC4wIiwgIm1zbS1wY20tZHNwLjEiLAorCQkJCSJtc20tcGNtLWRzcC4yIiwgIm1zbS12b2lwLWRzcCIsCisJCQkJIm1zbS1wY20tdm9pY2UiLCAibXNtLXBjbS1sb29wYmFjayIsCisJCQkJIm1zbS1jb21wcmVzcy1kc3AiLCAibXNtLXBjbS1ob3N0bGVzcyIsCisJCQkJIm1zbS1wY20tYWZlIiwgIm1zbS1sc20tY2xpZW50IiwKKwkJCQkibXNtLXBjbS1yb3V0aW5nIiwgIm1zbS1jcGUtbHNtIiwKKwkJCQkibXNtLWNvbXByLWRzcCIsICJtc20tcGNtLWRzcC1ub2lycSI7CisJCWFzb2MtY3B1ID0gPCZkYWlfaGRtaT4sIDwmZGFpX2RwPiwKKwkJCQk8JmRhaV9taTJzMD4sIDwmZGFpX21pMnMxPiwKKwkJCQk8JmRhaV9taTJzMj4sIDwmZGFpX21pMnMzPiwKKwkJCQk8JmRhaV9wcmlfYXV4cGNtPiwgPCZkYWlfc2VjX2F1eHBjbT4sCisJCQkJPCZkYWlfdGVydF9hdXhwY20+LCA8JmRhaV9xdWF0X2F1eHBjbT4sCisJCQkJPCZzYl8wX3J4PiwgPCZzYl8wX3R4PiwgPCZzYl8xX3J4PiwgPCZzYl8xX3R4PiwKKwkJCQk8JnNiXzJfcng+LCA8JnNiXzJfdHg+LCA8JnNiXzNfcng+LCA8JnNiXzNfdHg+LAorCQkJCTwmc2JfNF9yeD4sIDwmc2JfNF90eD4sIDwmc2JfNV90eD4sCisJCQkJPCZhZmVfcGNtX3J4PiwgPCZhZmVfcGNtX3R4PiwgPCZhZmVfcHJveHlfcng+LAorCQkJCTwmYWZlX3Byb3h5X3R4PiwgPCZpbmNhbGxfcmVjb3JkX3J4PiwKKwkJCQk8JmluY2FsbF9yZWNvcmRfdHg+LCA8JmluY2FsbF9tdXNpY19yeD4sCisJCQkJPCZpbmNhbGxfbXVzaWNfMl9yeD4sIDwmc2JfNV9yeD4sIDwmc2JfNl9yeD4sCisJCQkJPCZzYl83X3J4PiwgPCZzYl83X3R4PiwgPCZzYl84X3R4PiwKKwkJCQk8JnVzYl9hdWRpb19yeD4sIDwmdXNiX2F1ZGlvX3R4PiwKKwkJCQk8JmRhaV9wcmlfdGRtX3J4XzA+LCA8JmRhaV9wcmlfdGRtX3R4XzA+LAorCQkJCTwmZGFpX3NlY190ZG1fcnhfMD4sIDwmZGFpX3NlY190ZG1fdHhfMD4sCisJCQkJPCZkYWlfdGVydF90ZG1fcnhfMD4sIDwmZGFpX3RlcnRfdGRtX3R4XzA+LAorCQkJCTwmZGFpX3F1YXRfdGRtX3J4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8wPjsKKwkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1oZG1pLjgiLCAgIm1zbS1kYWktcTYtZHAuMjQ2MDgiLAorCQkJCSJtc20tZGFpLXE2LW1pMnMuMCIsICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCQkJIm1zbS1kYWktcTYtbWkycy4yIiwgIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJCQkibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKKwkJCQkibXNtLWRhaS1xNi1hdXhwY20uMyIsICJtc20tZGFpLXE2LWF1eHBjbS40IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzODQiLCAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTAiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5MiIsICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwgIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjIyNSIsICJtc20tZGFpLXE2LWRldi4yNDEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4yNDAiLCAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkJCSJtc20tZGFpLXE2LWRldi4zMjc3MiIsICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwgIm1zbS1kYWktcTYtZGV2LjE2Mzk0IiwKKwkJCQkibXNtLWRhaS1xNi1kZXYuMTYzOTYiLCAibXNtLWRhaS1xNi1kZXYuMTYzOTgiLAorCQkJCSJtc20tZGFpLXE2LWRldi4xNjM5OSIsICJtc20tZGFpLXE2LWRldi4xNjQwMSIsCisJCQkJIm1zbS1kYWktcTYtZGV2LjI4NjcyIiwgIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKKwkJCQkibXNtLWRhaS1xNi10ZG0uMzY4NjQiLCAibXNtLWRhaS1xNi10ZG0uMzY4NjUiLAorCQkJCSJtc20tZGFpLXE2LXRkbS4zNjg4MCIsICJtc20tZGFpLXE2LXRkbS4zNjg4MSIsCisJCQkJIm1zbS1kYWktcTYtdGRtLjM2ODk2IiwgIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKKwkJCQkibXNtLWRhaS1xNi10ZG0uMzY5MTIiLCAibXNtLWRhaS1xNi10ZG0uMzY5MTMiOworCQlhc29jLWNvZGVjID0gPCZzdHViX2NvZGVjPiwgPCZleHRfZGlzcF9hdWRpb19jb2RlYz47CisJCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCQkJICAgIm1zbS1leHQtZGlzcC1hdWRpby1jb2RlYy1yeCI7CisJCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzAyMTE+LCA8JndzYTg4MXhfMDIxMj4sCisJCQkJPCZ3c2E4ODF4XzAyMTM+LCA8JndzYTg4MXhfMDIxND47CisJCXFjb20sd3NhLWF1eC1kZXYtcHJlZml4ID0gIlNwa3JMZWZ0IiwgIlNwa3JSaWdodCIsCisJCQkJCSAgIlNwa3JMZWZ0IiwgIlNwa3JSaWdodCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93Y2Qtc3BpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93Y2Qtc3BpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q4MzNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3djZC1zcGkudHh0CkBAIC0wLDAgKzEsMzcgQEAKK1dDRCBhdWRpbyBjb2RlYyBTUEkgZHJpdmVyIHN1cHBvcnQKKworKiB3Y2Rfc3BpCisKK1RoZSB3Y2Rfc3BpIGRldmljZSBjYW4gYmUgYWRkZWQgYXMgY2hpbGQgZGV2aWNlIG5vZGUgdG8gdGhlIGF1ZGlvIGNvZGVjIGRldmljZQorbm9kZSBpZiB0aGUgYXVkaW8gY29kZWMgaGFzIFNQSSBzbGF2ZSBoYXJkd2FyZS4gVGhlIGNvZGVjIGRyaXZlciB1cG9uIHByb2JlIHdpbGwKK2NyZWF0ZSBzcGlfZGV2aWNlIGFuZCBwZXJmb3JtIHNwaV9hZGRfZGV2aWNlLiBOb3RlIHRoYXQgdGhlIFNQSSBmcmFtZXdvcmsgZG9lcworbm90IHBhcnNlIHRoaXMgRFQgbm9kZSBhbmQgaGVuY2UgdGhlIERUIHByb3BlcnRpZXMgZGVmaW5lZCBieSBTUEkgZnJhbWV3b3JrCitjYW5ub3QgYmUgdXNlZCBpbiB3Y2Rfc3BpIGRldmljZSBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiAicWNvbSx3Y2Qtc3BpLXYyIgorCistIHFjb20sbWFzdGVyLWJ1cy1udW0gOiBCdXMgbnVtYmVyIG9mIHRoZSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiBUaGlzCisJCQl3aWxsIGJlIHVzZWQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBTUEkgbWFzdGVyLgorCistIHFjb20sY2hpcC1zZWxlY3QgOiBTcGVjaWZpZXMgdGhlIGNoaXAgc2VsZWN0IG51bWJlciB1c2VkIGZvciBzcGkgZGV2aWNlCisJCSAgICAgcmVnaXN0cmF0aW9uLgorCistIHFjb20sbWF4LWZyZXF1ZW5jeSA6IFNwZWNpZmllcyB0aGUgbWF4IGZyZXF1ZW5jeSBvZiB0aGUgU1BJIGludGVyZmFjZS4KKworLSBxY29tLG1lbS1iYXNlLWFkZHIgOiBEZWZpbmVzIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZyb20gdGhlIFNQSQorCQkgICAgICAgbWVtb3J5IG1hcC4gVGhpcyB3aWxsIGJlIHVzZWQgYXMgYW4gb2Zmc2V0IHRvIHJlYWQKKwkJICAgICAgIGFuZCB3cml0ZSBtZW1vcnkuCisKK0V4YW1wbGU6CisKK3RhdmlsX2NvZGVjIHsKKwl3Y2Rfc3BpXzA6IHdjZF9zcGkgeworCQljb21wYXRpYmxlID0gInFjb20sd2NkLXNwaS12MiI7CisJCXFjb20sbWFzdGVyLWJ1cy1udW0gPSA8MTA+OworCQlxY29tLGNoaXAtc2VsZWN0ID0gPDA+OworCQlxY29tLG1heC1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OworCQlxY29tLG1lbS1iYXNlLWFkZHIgPSA8MHgxMDAwMDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3djZF9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd2NkX2NvZGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE3YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3djZF9jb2RlYy50eHQKQEAgLTAsMCArMSw2NDAgQEAKK1dDRCBhdWRpbyBDT0RFQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sdGFzaGEtc2xpbS1wZ2QiIG9yICJxY29tLHRhc2hhLWkyYy1wZ2QiIGZvciBUYXNoYSBDb2RlYworCQlvciAicWNvbSx0YXZpbC1zbGltLXBnZCIgZm9yIFRhdmlsIENvZGVjCisgLSBlbGVtZW50YWwtYWRkcjogY29kZWMgc2xpbWJ1cyBzbGF2ZSBQR0QgZW51bWVyYXRpb24gYWRkcmVzcy4oNDggYml0cykKKworIC0gcWNvbSxjZGMtcmVzZXQtZ3BpbzogZ3BpbyB1c2VkIGZvciBjb2RlYyBTT0MgcmVzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkLCBpdCBpcyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgdG8gYXRsZWFzdCBoYXZlICJxY29tLHdjZC1yc3Qtbi1ncGlvIiB0byBiZSBkZWZpbmVkLgorIC0gcWNvbSx3Y2QtcnN0LWdwaW8tbm9kZTogUGhhbmRsZSByZWZlcmVuY2UgdG8gdGhlIERUIG5vZGUgaGF2aW5nIGNvZGVjIHJlc2V0IGdwaW8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCB0byBhdGxlYXN0IGRlZmluZSAicWNvbSxjZGMtcmVzZXQtZ3BpbyIgcHJvcGVydHkuCisKKyAtIGNkYy12ZGQtYnVjay1zdXBwbHk6IHBoYW5kbGUgb2YgYnVjayBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1idWNrLXZvbHRhZ2U6IGJ1Y2sgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1idWNrLWN1cnJlbnQ6IGJ1Y2sgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtdHgtaC1zdXBwbHk6IHBoYW5kbGUgb2YgdHgtaCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC10eC1oLXZvbHRhZ2U6IHR4LWggc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC10eC1oLWN1cnJlbnQ6IHR4LWggc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtcngtaC1zdXBwbHk6IHBoYW5kbGUgb2YgcngtaCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1yeC1oLXZvbHRhZ2U6IHJ4LWggc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1yeC1oLWN1cnJlbnQ6IHJ4LWggc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGRweC0xLXN1cHBseTogcGhhbmRsZSBvZiBweC0xIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkcHgtMS12b2x0YWdlOiBweC0xIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGRweC0xLWN1cnJlbnQ6IHB4LTEgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtYS0xcDJ2LXN1cHBseTogcGhhbmRsZSBvZiAxLjJ2IHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkLWEtMXAydi12b2x0YWdlOiAxLjJ2IHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtYS0xcDJ2LWN1cnJlbnQ6IDEuMnYgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGRjeC0xLXN1cHBseTogcGhhbmRsZSBvZiBjeC0xIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkY3gtMS12b2x0YWdlOiBjeC0xIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGRjeC0xLWN1cnJlbnQ6IGN4LTEgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGRjeC0yLXN1cHBseTogcGhhbmRsZSBvZiBjeC0yIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkY3gtMi12b2x0YWdlOiBjeC0yIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGRjeC0yLWN1cnJlbnQ6IGN4LTIgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtYnVja2hlbHBlci1zdXBwbHk6IHBoYW5kbGUgb2YgaGVscGVyIHJlZ3VsYXRvciBzdXBwbHkncworCQkJCWRldmljZSB0cmVlIG5vZGUuIFRoaXMgc3VwcGx5IGlzIGEgaGVscGVyIHJlZ3VsYXRvciBmb3IKKwkJCQljZGMtdmRkLWJ1Y2stc3VwcGx5IHJlZ3VsYXRvci4KKyAtIGNkYy12ZGQtYnVja2hlbHBlci12b2x0YWdlOiBoZWxwZXIgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1idWNraGVscGVyLWN1cnJlbnQ6IGhlbHBlciBzdXBwbHkncyBtYXggY3VycmVudCBpbiBtQS4KKworIC0gcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzOiBMaXN0IG9mIHN1cHBsaWVzIHRvIGJlIGVuYWJsZWQgcHJpb3IgdG8gY29kZWMKKwkJCSAgICAgaGFyZHdhcmUgcHJvYmUuICBTdXBwbGllcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZQorCQkJICAgICBzdGF5IGVuYWJsZWQuCisKKyAtIHFjb20sY2RjLW1pY2JpYXMtbGRvaC12IC0gTERPSCBvdXRwdXQgaW4gdm9sdHMgKHNob3VsZCBiZSAxLjk1IFYgYW5kIDMuMDAgVikuCisKKyAtIHFjb20sY2RjLW1pY2JpYXMtY2ZpbHQxLW12IC0gY2ZpbHQxIG91dHB1dCB2b2x0YWdlIGluIG1pbGxpIHZvbHRzLgorIC0gcWNvbSxjZGMtbWljYmlhcy1jZmlsdDItbXYgLSBjZmlsdDIgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisgLSBxY29tLGNkYy1taWNiaWFzLWNmaWx0My1tdiAtIGNmaWx0MyBvdXRwdXQgdm9sdGFnZSBpbiBtaWxsaSB2b2x0cy4KKyAgIGNmaWx0IHZvbHRhZ2UgY2FuIGJlIHNldCB0byBtYXggb2YgcWNvbSxjZGMtbWljYmlhcy1sZG9oLXYgLSAwLjE1Vi4KKworIC0gcWNvbSxjZGMtbWljYmlhczEtY2ZpbHQtc2VsID0gY2ZpbHQgdG8gdXNlIGZvciBtaWNiaWFzMQorCQkJCSAoc2hvdWxkIGJlIGZyb20gMSB0byAzKS4KKyAtIHFjb20sY2RjLW1pY2JpYXMyLWNmaWx0LXNlbCA9IGNmaWx0IHRvIHVzZSBmb3IgbWljYmlhczIKKwkJCQkgKHNob3VsZCBiZSBmcm9tIDEgdG8gMykuCisgLSBxY29tLGNkYy1taWNiaWFzMy1jZmlsdC1zZWwgPSBjZmlsdCB0byB1c2UgZm9yIG1pY2JpYXMzCisJCQkJIChzaG91bGQgYmUgZnJvbSAxIHRvIDMpLgorIC0gcWNvbSxjZGMtbWljYmlhczQtY2ZpbHQtc2VsID0gY2ZpbHQgdG8gdXNlIGZvciBtaWNiaWFzNAorCQkJCSAoc2hvdWxkIGJlIGZyb20gMSB0byAzKS4KKyAgIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgY29ubmVjdGVkIENGTElUIHRvIE1JQyBCaWFzLgorCisgLSBxY29tLGNkYy1taWNiaWFzMS1leHQtY2FwOiBCb29sZWFuLiBFbmFibGUgbWljYmlhcyAxIGV4dGVybmFsIGNhcGFjaXRvciBtb2RlLgorIC0gcWNvbSxjZGMtbWljYmlhczItZXh0LWNhcDogQm9vbGVhbi4gRW5hYmxlIG1pY2JpYXMgMiBleHRlcm5hbCBjYXBhY2l0b3IgbW9kZS4KKyAtIHFjb20sY2RjLW1pY2JpYXMzLWV4dC1jYXA6IEJvb2xlYW4uIEVuYWJsZSBtaWNiaWFzIDMgZXh0ZXJuYWwgY2FwYWNpdG9yIG1vZGUuCisgLSBxY29tLGNkYy1taWNiaWFzNC1leHQtY2FwOiBCb29sZWFuLiBFbmFibGUgbWljYmlhcyA0IGV4dGVybmFsIGNhcGFjaXRvciBtb2RlLgorIC0gcWNvbSxjZGMtbWNsay1jbGstcmF0ZSAtIFNwZWNpZmllcyB0aGUgbWFzdGVyIGNsb2NrIHJhdGUgaW4gSHogcmVxdWlyZWQgZm9yCisJCQkgICAgY29kZWMuCisgLSBxY29tLGNkYy1zbGltLWlmZC1kZXYgLSBuYW1tZSBvZiB0aGUgY29kZWMgc2xpbSBpbnRlcmZhY2UgZGV2aWNlLgorIC0gcWNvbSxjZGMtc2xpbS1pZmQtZWxlbWVudGFsLWFkZHIgLSBjb2RlYyBzbGltYnVzIHNsYXZlIGludGVyZmFjZSBkZXZpY2UKKwkJCQkgICAgIGVudW1lcmF0aW9uIGFkZHJlc3MuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBjZGMtZG1pYy1zYW1wbGUtcmF0ZTogU3BlY2lmaWVzIHRoZSBzYW1wbGUgcmF0ZSBvZiBkaWdpdGFsIG1pYyBpbiBIWi4gVGhlCisJCQkgdmFsdWVzIGZvciA5LjZNSFogbWNsayBjYW4gYmUgMjQwMDAwMCBIeiwgMzIwMDAwMCBIegorCQkJIGFuZCA0ODAwMDAwIEh6LiAgVGhlIHZhbHVlcyBmb3IgMTIuMjg4TUh6IG1jbGsgY2FuIGJlCisJCQkgMzA3MjIwMCBIeiwgNDA5NjAwMCBIeiBhbmQgNjE0NDAwMCBIei4KKworIC0gcWNvbSxjZGMtbWFkLWRtaWMtcmF0ZTogU3BlY2lmaWVzIHRoZSBzYW1wbGUgcmF0ZSBvZiBkaWdpdGFsIG1pYyBpbiBIWiB0byBiZQorCQkJICAgdXNlZCBieSBNQUQgKE1pY3JvcGhvbmUgQWN0aXZpdHkgRGV0ZWN0aW9uKSBoYXJkd2FyZQorCQkJICAgYmxvY2sgb24gdGhlIGNvZGVjLiBUaGUgdmFsaWQgc2V0IG9mIHZhbHVlcyBhcmUgc2FtZQorCQkJICAgYXMgdGhhdCBvZiBjZGMtZG1pYy1zYW1wbGUtcmF0ZSwgYnV0IHRoaXMgcmF0ZSB3aWxsCisJCQkgICBvbmx5IGJlIHVzZWQgYnkgTUFEIGFuZCBhbGwgb3RoZXIgYXVkaW8gdXNlIGNhc2VzCisJCQkgICBpbnZvbHZpbmcgRE1JQyB3aWxsIHVzZSB0aGUgcmF0ZSBkZWZpbmVkIGJ5CisJCQkgICBjZGMtZG1pYy1zYW1wbGUtcmF0ZS4KKworIC0gcWNvbSxjZGMtZWNwcC1kbWljLXJhdGU6IFNwZWNpZmllcyB0aGUgc2FtcGxlIHJhdGUgb2YgZGlnaXRhbCBtaWMgaW4gSFogdG8gYmUKKwkJCSAgICB1c2VkIGJ5IEVDUFAgKEVjaG8gQ2FuY2VsbGF0aW9uIFBpbmcgUG9uZykgYmxvY2sKKwkJCSAgICBvbiB0aGUgY29kZWMuIFRoZSB2YWxpZCBzZXQgb2YgdmFsdWVzIGFyZSBzYW1lCisJCQkgICAgYXMgdGhhdCBvZiBjZGMtZG1pYy1zYW1wbGUtcmF0ZSwgYnV0IHRoaXMgcmF0ZSB3aWxsCisJCQkgICAgb25seSBiZSB1c2VkIGJ5IEVDUFAgYW5kIGFsbCBvdGhlciBhdWRpbyB1c2UgY2FzZXMKKwkJCSAgICBpbnZvbHZpbmcgRE1JQyB3aWxsIHVzZSB0aGUgcmF0ZSBkZWZpbmVkIGJ5CisJCQkgICAgY2RjLWRtaWMtc2FtcGxlLXJhdGUuCisKKyAtIHFjb20sY2RjLWRtaWMtY2xrLWRydi1zdHJlbmd0aDogU3BlY2lmaWVzIHRoZSBkcml2ZSBzdHJlbmd0aCBmb3IgZGlnaXRhbCBtaWNyb3Bob25lCisJCQkJICAgY2xvY2sgaW4gdGhlIGNvZGVjLiBBY2NlcHRlZCB2YWx1ZXMgYXJlIDIsNCw4IGFuZCAxNi4KKwkJCQkgICBUaGUgY2xvY2sgZHJpdmUgc3RyZW50Z2ggaXMgaW4gdUEuIENvZGVjIGRyaXZlciB3aWxsCisJCQkJICAgY2hvb3NlIGRlZmF1bHQgdmFsdWUgZm9yIHBhcnRpY3VsYXIgY29kZWMgaWYgdGhpcworCQkJCSAgIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgaW4gZGV2aWNlIHRyZWUuCisKKyAtIHFjb20sY2RjLW9uLWRlbWFuZC1zdXBwbGllczogTGlzdCBvZiBzdXBwbGllcyB3aGljaCBjYW4gYmUgZW5hYmxlZAorCQkJCWR5bmFtaWNhbGx5LgorCQkJCVN1cHBsaWVzIGluIHRoaXMgbGlzdCBhcmUgb2ZmIGJ5IGRlZmF1bHQuCisKKy0gcWNvbSxjZGMtY3Atc3VwcGxpZXM6IExpc3Qgb2Ygc3VwcGxpZXMgcmVxdWlyZWQgZm9yIGNvZGVjIGNoYXJnZXB1bXAgZW5hYmxlCisJCQkJU3VwcGxpZXMgaW4gdGhpcyBsaXN0IGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGR5bmFtaWNhbGx5IGFuZAorCQkJCWFyZSBvZmYgYnkgZGVmYXVsdC4KKworIC0gcWNvbSxjZGMtbWljYmlhczItaGVhZHNldC1vbmx5OiBCb29sZWFuLiBBbGxvdyBtaWNiaWFzIDIgb25seSB0byBoZWFkc2V0IG1pYy4KKworIC0gcWNvbSxjZGMtdmFyaWFudDogSW5kaWNhdGVzIGNvZGVjIHZhcmlhbnQsIFdDRDlYWFggaW5kaWNhdGVzIGFsbCBjb2RlY3MgdGlsbCBUYWlrbworCQkJV0NEOTMzMCBpbmRpY2F0ZXMgd2NkOTMzMCBhdWRpbyBjb2RlYworCisgLSBxY29tLGNkYy1taWNiaWFzMS1tdjogbWljYmlhczEgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisJCQkgVGhpcyBpcyB1c2VkIHdoZW4gY2ZpbHQgaXMgbm90IHVzZXIgY29uZmlndXJhYmxlCisJCQkgYW5kIG1pY2JpYXMxIGlzIGRpcmVjdGx5IGNvbnRyb2xsZWQgd2l0aCBhIHJlZ2lzdGVyCisJCQkgd3JpdGUuCisKKyAtIHFjb20sY2RjLW1pY2JpYXMyLW12OiBtaWNiaWFzMiBvdXRwdXQgdm9sdGFnZSBpbiBtaWxsaSB2b2x0cy4KKwkJCSBUaGlzIGlzIHVzZWQgd2hlbiBjZmlsdCBpcyBub3QgdXNlciBjb25maWd1cmFibGUKKwkJCSBhbmQgbWljYmlhczIgaXMgZGlyZWN0bHkgY29udHJvbGxlZCB3aXRoIGEgcmVnaXN0ZXIKKwkJCSB3cml0ZS4KKworIC0gcWNvbSxjZGMtbWljYmlhczMtbXY6IG1pY2JpYXMzIG91dHB1dCB2b2x0YWdlIGluIG1pbGxpIHZvbHRzLgorCQkJIFRoaXMgaXMgdXNlZCB3aGVuIGNmaWx0IGlzIG5vdCB1c2VyIGNvbmZpZ3VyYWJsZQorCQkJIGFuZCBtaWNiaWFzMyBpcyBkaXJlY3RseSBjb250cm9sbGVkIHdpdGggYSByZWdpc3RlcgorCQkJIHdyaXRlLgorCisgLSBxY29tLGNkYy1taWNiaWFzNC1tdjogbWljYmlhczQgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisJCQkgVGhpcyBpcyB1c2VkIHdoZW4gY2ZpbHQgaXMgbm90IHVzZXIgY29uZmlndXJhYmxlCisJCQkgYW5kIG1pY2JpYXM0IGlzIGRpcmVjdGx5IGNvbnRyb2xsZWQgd2l0aCBhIHJlZ2lzdGVyCisJCQkgd3JpdGUuCisKKyAtIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KKyAtIGNsb2NrcyA6IGV4dGVybmFsIGNsb2NrIGRlZmluZWQgZm9yIGNvZGVjIGNsb2NrLgorCitFeGFtcGxlOgorCit0YWlrb19jb2RlYyB7CisJY29tcGF0aWJsZSA9ICJxY29tLHRhaWtvLXNsaW0tcGdkIjsKKwllbGVtZW50YWwtYWRkciA9IFswMCAwMSBBMCAwMCAxNyAwMl07CisKKwlxY29tLGNkYy1yZXNldC1ncGlvID0gPCZtc21ncGlvIDYzIDA+OworCisJY2RjLXZkZC1idWNrLXN1cHBseSA9IDwmcG04OTQxX3MyPjsKKwlxY29tLGNkYy12ZGQtYnVjay12b2x0YWdlID0gPDIxNTAwMDAgMjE1MDAwMD47CisJcWNvbSxjZGMtdmRkLWJ1Y2stY3VycmVudCA9IDw1MDAwMDA+OworCisJY2RjLXZkZC10eC1oLXN1cHBseSA9IDwmcG04OTQxX3MzPjsKKwlxY29tLGNkYy12ZGQtdHgtaC12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJcWNvbSxjZGMtdmRkLXR4LWgtY3VycmVudCA9IDwyMDAwMDA+OworCisJY2RjLXZkZC1yeC1oLXN1cHBseSA9IDwmcG04OTQxX3MzPjsKKwlxY29tLGNkYy12ZGQtcngtaC12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJcWNvbSxjZGMtdmRkLXJ4LWgtY3VycmVudCA9IDwyMDAwMDA+OworCisJY2RjLXZkZHB4LTEtc3VwcGx5ID0gPCZwbTg5NDFfczM+OworCXFjb20sY2RjLXZkZHB4LTEtdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCXFjb20sY2RjLXZkZHB4LTEtY3VycmVudCA9IDw1MDAwPjsKKworCWNkYy12ZGQtYS0xcDJ2LXN1cHBseSA9IDwmcG04OTQxX2wxPjsKKwlxY29tLGNkYy12ZGQtYS0xcDJ2LXZvbHRhZ2UgPSA8MTIyNTAwMCAxMjI1MDAwPjsKKwlxY29tLGNkYy12ZGQtYS0xcDJ2LWN1cnJlbnQgPSA8NTAwMD47CisKKwljZGMtdmRkY3gtMS1zdXBwbHkgPSA8JnBtODk0MV9sMT47CisJcWNvbSxjZGMtdmRkY3gtMS12b2x0YWdlID0gPDEyMjUwMDAgMTIyNTAwMD47CisJcWNvbSxjZGMtdmRkY3gtMS1jdXJyZW50ID0gPDUwMDA+OworCisJY2RjLXZkZGN4LTItc3VwcGx5ID0gPCZwbTg5NDFfbDE+OworCXFjb20sY2RjLXZkZGN4LTItdm9sdGFnZSA9IDwxMjI1MDAwIDEyMjUwMDA+OworCXFjb20sY2RjLXZkZGN4LTItY3VycmVudCA9IDw1MDAwPjsKKworCXFjb20sY2RjLXN0YXRpYy1zdXBwbGllcyA9ICJjZGMtdmRkLWJ1Y2siLAorCQkJCSAgICJjZGMtdmRkLXR4LWgiLAorCQkJCSAgICJjZGMtdmRkLXJ4LWgiLAorCQkJCSAgICJjZGMtdmRkcHgtMSIsCisJCQkJICAgImNkYy12ZGQtYS0xcDJ2IiwKKwkJCQkgICAiY2RjLXZkZGN4LTEiLAorCQkJCSAgICJjZGMtdmRkY3gtMiI7CisKKwljb20sY2RjLW9uLWRlbWFuZC1zdXBwbGllcyA9ICJjZGMtdmRkLXNwa2RydiI7CisKKwlxY29tLGNkYy1taWNiaWFzLWxkb2gtdiA9IDwweDM+OworCXFjb20sY2RjLW1pY2JpYXMtY2ZpbHQxLW12ID0gPDE4MDA+OworCXFjb20sY2RjLW1pY2JpYXMtY2ZpbHQyLW12ID0gPDI3MDA+OworCXFjb20sY2RjLW1pY2JpYXMtY2ZpbHQzLW12ID0gPDE4MDA+OworCXFjb20sY2RjLW1pY2JpYXMxLWNmaWx0LXNlbCA9IDwweDA+OworCXFjb20sY2RjLW1pY2JpYXMyLWNmaWx0LXNlbCA9IDwweDE+OworCXFjb20sY2RjLW1pY2JpYXMzLWNmaWx0LXNlbCA9IDwweDI+OworCXFjb20sY2RjLW1pY2JpYXM0LWNmaWx0LXNlbCA9IDwweDI+OworCXFjb20sY2RjLW1pY2JpYXMxLWV4dC1jYXA7CisJcWNvbSxjZGMtbWljYmlhczItZXh0LWNhcDsKKwlxY29tLGNkYy1taWNiaWFzMy1leHQtY2FwOworCXFjb20sY2RjLW1pY2JpYXM0LWV4dC1jYXA7CisJcWNvbSxjZGMtbWNsay1jbGstcmF0ZSA9IDw5NjAwMDAwPjsKKwlxY29tLGNkYy1zbGltLWlmZCA9ICJ0YWlrby1zbGltLWlmZCI7CisJcWNvbSxjZGMtc2xpbS1pZmQtZWxlbWVudGFsLWFkZHIgPSBbMDAgMDAgQTAgMDAgMTcgMDJdOworCXFjb20sY2RjLWRtaWMtc2FtcGxlLXJhdGUgPSA8NDgwMDAwMD47CisJcWNvbSxjZGMtbWljYmlhczItaGVhZHNldC1vbmx5OworfTsKKworV2NkOXh4eCBhdWRpbyBDT0RFQyBpbiBJMkMgbW9kZQorCisgLSBjb21wYXRpYmxlID0gInFjb20sd2NkOXh4eC1pMmMtZGV2aWNlIjsKKyAtIHJlZzogcmVwcmVzZW50cyB0aGUgc2xhdmUgYWRkcmVzcyBwcm92aWRlZCB0byB0aGUgSTJDIGRyaXZlci4KKyAtIHFjb20sY2RjLXJlc2V0LWdwaW86IGdwaW8gdXNlZCBmb3IgY29kZWMgU09DIHJlc2V0LgorCisgLSBjZGMtdmRkLWJ1Y2stc3VwcGx5OiBwaGFuZGxlIG9mIGJ1Y2sgc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy12ZGQtYnVjay12b2x0YWdlOiBidWNrIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtYnVjay1jdXJyZW50OiBidWNrIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkLXR4LWgtc3VwcGx5OiBwaGFuZGxlIG9mIHR4LWggc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy12ZGQtdHgtaC12b2x0YWdlOiB0eC1oIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtdHgtaC1jdXJyZW50OiB0eC1oIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkLXJ4LWgtc3VwcGx5OiBwaGFuZGxlIG9mIHJ4LWggc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy12ZGQtcngtaC12b2x0YWdlOiByeC1oIHN1cHBseSdzIHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtcngtaC1jdXJyZW50OiByeC1oIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkcHgtMS1zdXBwbHk6IHBoYW5kbGUgb2YgcHgtMSBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZHB4LTEtdm9sdGFnZTogcHgtMSBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkcHgtMS1jdXJyZW50OiBweC0xIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkLWEtMXAydi1zdXBwbHk6IHBoYW5kbGUgb2YgMS4ydiBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1hLTFwMnYtdm9sdGFnZTogMS4ydiBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkLWEtMXAydi1jdXJyZW50OiAxLjJ2IHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkY3gtMS1zdXBwbHk6IHBoYW5kbGUgb2YgY3gtMSBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZGN4LTEtdm9sdGFnZTogY3gtMSBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkY3gtMS1jdXJyZW50OiBjeC0xIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkY3gtMi1zdXBwbHk6IHBoYW5kbGUgb2YgY3gtMiBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZGN4LTItdm9sdGFnZTogY3gtMiBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkY3gtMi1jdXJyZW50OiBjeC0yIHN1cHBseSdzIG1heCBjdXJyZW50IGluIG1BLgorCisgLSBxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXM6IExpc3Qgb2Ygc3VwcGxpZXMgdG8gYmUgZW5hYmxlZCBwcmlvciB0byBjb2RlYworCQkJICAgICBoYXJkd2FyZSBwcm9iZS4gIFN1cHBsaWVzIGluIHRoaXMgbGlzdCB3aWxsIGJlCisJCQkgICAgIHN0YXkgZW5hYmxlZC4KKworIC0gcWNvbSxjZGMtbWljYmlhcy1sZG9oLXYgLSBMRE9IIG91dHB1dCBpbiB2b2x0cyAoc2hvdWxkIGJlIDEuOTUgViBhbmQgMy4wMCBWKS4KKworIC0gcWNvbSxjZGMtbWljYmlhcy1jZmlsdDEtbXYgLSBjZmlsdDEgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisgLSBxY29tLGNkYy1taWNiaWFzLWNmaWx0Mi1tdiAtIGNmaWx0MiBvdXRwdXQgdm9sdGFnZSBpbiBtaWxsaSB2b2x0cy4KKyAtIHFjb20sY2RjLW1pY2JpYXMtY2ZpbHQzLW12IC0gY2ZpbHQzIG91dHB1dCB2b2x0YWdlIGluIG1pbGxpIHZvbHRzLgorICAgY2ZpbHQgdm9sdGFnZSBjYW4gYmUgc2V0IHRvIG1heCBvZiBxY29tLGNkYy1taWNiaWFzLWxkb2gtdiAtIDAuMTVWLgorCisgLSBxY29tLGNkYy1taWNiaWFzMS1jZmlsdC1zZWwgPSBjZmlsdCB0byB1c2UgZm9yIG1pY2JpYXMxCisJCQkJIChzaG91bGQgYmUgZnJvbSAxIHRvIDMpLgorIC0gcWNvbSxjZGMtbWljYmlhczItY2ZpbHQtc2VsID0gY2ZpbHQgdG8gdXNlIGZvciBtaWNiaWFzMgorCQkJCSAoc2hvdWxkIGJlIGZyb20gMSB0byAzKS4KKyAtIHFjb20sY2RjLW1pY2JpYXMzLWNmaWx0LXNlbCA9IGNmaWx0IHRvIHVzZSBmb3IgbWljYmlhczMKKwkJCQkgKHNob3VsZCBiZSBmcm9tIDEgdG8gMykuCisgLSBxY29tLGNkYy1taWNiaWFzNC1jZmlsdC1zZWwgPSBjZmlsdCB0byB1c2UgZm9yIG1pY2JpYXM0CisJCQkJIChzaG91bGQgYmUgZnJvbSAxIHRvIDMpLgorICAgVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBjb25uZWN0ZWQgQ0ZMSVQgdG8gTUlDIEJpYXMuCisKKyAtIHFjb20sY2RjLW1pY2JpYXMxLWV4dC1jYXA6IEJvb2xlYW4uIEVuYWJsZSBtaWNiaWFzIDEgZXh0ZXJuYWwgY2FwYWNpdG9yIG1vZGUuCisgLSBxY29tLGNkYy1taWNiaWFzMi1leHQtY2FwOiBCb29sZWFuLiBFbmFibGUgbWljYmlhcyAyIGV4dGVybmFsIGNhcGFjaXRvciBtb2RlLgorIC0gcWNvbSxjZGMtbWljYmlhczMtZXh0LWNhcDogQm9vbGVhbi4gRW5hYmxlIG1pY2JpYXMgMyBleHRlcm5hbCBjYXBhY2l0b3IgbW9kZS4KKyAtIHFjb20sY2RjLW1pY2JpYXM0LWV4dC1jYXA6IEJvb2xlYW4uIEVuYWJsZSBtaWNiaWFzIDQgZXh0ZXJuYWwgY2FwYWNpdG9yIG1vZGUuCisgLSBxY29tLGNkYy1tY2xrLWNsay1yYXRlIC0gU3BlY2lmaWVzIHRoZSBtYXN0ZXIgY2xvY2sgcmF0ZSBpbiBIeiByZXF1aXJlZCBmb3IKKwkJCSAgICBjb2RlYy4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKworIC0gY2RjLXZkZC1zcGtkcnYtc3VwcGx5OiBwaGFuZGxlIG9mIHNwa2RydiBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1zcGtkcnYtdm9sdGFnZTogc3BrZHJ2IHN1cHBseSB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkLXNwa2Rydi1jdXJyZW50OiBzcGtkcnYgc3VwcGx5IG1heCBjdXJyZW50IGluIG1BLgorCisgLSBjZGMtdmRkLXNwa2Rydi1zdXBwbHk6IHBoYW5kbGUgb2Ygc3BrZHJ2IHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkLXNwa2Rydi12b2x0YWdlOiBzcGtkcnYgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwgbWluIGFuZCBtYXggaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtc3BrZHJ2LWN1cnJlbnQ6IHNwa2RydiBzdXBwbHkgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtc3BrZHJ2LTItc3VwcGx5OiBwaGFuZGxlIG9mIHNwa2RydjIgc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy12ZGQtc3BrZHJ2LTItdm9sdGFnZTogc3BrZHJ2MiBzdXBwbHkgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1zcGtkcnYtMi1jdXJyZW50OiBzcGtkcnYyIHN1cHBseSBtYXggY3VycmVudCBpbiBtQS4KKworIC0gcWNvbSxjZGMtb24tZGVtYW5kLXN1cHBsaWVzOiBMaXN0IG9mIHN1cHBsaWVzIHdoaWNoIGNhbiBiZSBlbmFibGVkCisJCQkJZHluYW1pY2FsbHkuCisJCQkJU3VwcGxpZXMgaW4gdGhpcyBsaXN0IGFyZSBvZmYgYnkgZGVmYXVsdC4KKworRXhhbXBsZToKK2kyY0BmOTkyNTAwMCB7CisJY2VsbC1pbmRleCA9IDwzPjsKKwljb21wYXRpYmxlID0gInFjb20saTJjLXF1cCI7CisJcmVnID0gPDB4Zjk5MjUwMDAgMHgxMDAwPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwlyZWctbmFtZXMgPSAicXVwX3BoeXNfYWRkciI7CisJaW50ZXJydXB0cyA9IDwwIDk3IDA+OworCWludGVycnVwdC1uYW1lcyA9ICJxdXBfZXJyX2ludHIiOworCXFjb20saTJjLWJ1cy1mcmVxID0gPDEwMDAwMD47CisJcWNvbSxpMmMtc3JjLWZyZXEgPSA8MjQwMDAwMDA+OworCisJd2NkOXh4eF9jb2RlY0AwZHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaTJjIjsKKwkJcmVnID0gPDB4MGQ+OworCQlxY29tLGNkYy1yZXNldC1ncGlvID0gPCZtc21ncGlvIDIyIDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3Y2Q5eHh4X2ludGM+OworCQlpbnRlcnJ1cHRzID0gPDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkKKwkJCSAgICAgIDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4PjsKKworCQljZGMtdmRkLWJ1Y2stc3VwcGx5ID0gPCZwbTgwMTlfbDExPjsKKwkJcWNvbSxjZGMtdmRkLWJ1Y2stdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCQlxY29tLGNkYy12ZGQtYnVjay1jdXJyZW50ID0gPDI1MDAwPjsKKworCQljZGMtdmRkLXR4LWgtc3VwcGx5ID0gPCZwbTgwMTlfbDExPjsKKwkJcWNvbSxjZGMtdmRkLXR4LWgtdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCQlxY29tLGNkYy12ZGQtdHgtaC1jdXJyZW50ID0gPDI1MDAwPjsKKworCQljZGMtdmRkLXJ4LWgtc3VwcGx5ID0gPCZwbTgwMTlfbDExPjsKKwkJcWNvbSxjZGMtdmRkLXJ4LWgtdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCQlxY29tLGNkYy12ZGQtcngtaC1jdXJyZW50ID0gPDI1MDAwPjsKKworCQljZGMtdmRkcHgtMS1zdXBwbHkgPSA8JnBtODAxOV9sMTE+OworCQlxY29tLGNkYy12ZGRweC0xLXZvbHRhZ2UgPSA8MTgwMDAwMCAxODAwMDAwPjsKKwkJcWNvbSxjZGMtdmRkcHgtMS1jdXJyZW50ID0gPDEwMDAwPjsKKworCQljZGMtdmRkLWEtMXAydi1zdXBwbHkgPSA8JnBtODAxOV9sOT47CisJCXFjb20sY2RjLXZkZC1hLTFwMnYtdm9sdGFnZSA9IDwxMjAwMDAwIDEyMDAwMDA+OworCQlxY29tLGNkYy12ZGQtYS0xcDJ2LWN1cnJlbnQgPSA8MTAwMDA+OworCisJCWNkYy12ZGRjeC0xLXN1cHBseSA9IDwmcG04MDE5X2w5PjsKKwkJcWNvbSxjZGMtdmRkY3gtMS12b2x0YWdlID0gPDEyMDAwMDAgMTIwMDAwMD47CisJCXFjb20sY2RjLXZkZGN4LTEtY3VycmVudCA9IDwxMDAwMD47CisKKwkJY2RjLXZkZGN4LTItc3VwcGx5ID0gPCZwbTgwMTlfbDk+OworCQlxY29tLGNkYy12ZGRjeC0yLXZvbHRhZ2UgPSA8MTIwMDAwMCAxMjAwMDAwPjsKKwkJcWNvbSxjZGMtdmRkY3gtMi1jdXJyZW50ID0gPDEwMDAwPjsKKworCQlxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMgPSAiY2RjLXZkZC1idWNrIiwKKwkJCQkJICAgImNkYy12ZGQtdHgtaCIsCisJCQkJCSAgICJjZGMtdmRkLXJ4LWgiLAorCQkJCQkgICAiY2RjLXZkZHB4LTEiLAorCQkJCQkgICAiY2RjLXZkZC1hLTFwMnYiLAorCQkJCQkgICAiY2RjLXZkZGN4LTEiLAorCQkJCQkgICAiY2RjLXZkZGN4LTIiOworCisJCWNkYy12ZGQtc3BrZHJ2LXN1cHBseSA9IDwmcG1pODk5NF9ib29zdD47CisJCXFjb20sY2RjLXZkZC1zcGtkcnYtdm9sdGFnZSA9IDw1MDAwMDAwIDUwMDAwMDA+OworCQlxY29tLGNkYy12ZGQtc3BrZHJ2LWN1cnJlbnQgPSA8NjAwMDAwPjsKKworCQljZGMtdmRkLXNwa2Rydi0yLXN1cHBseSA9IDwmcG1pODk5NF9ib29zdD47CisJCXFjb20sY2RjLXZkZC1zcGtkcnYtMi12b2x0YWdlID0gPDUwMDAwMDAgNTAwMDAwMD47CisJCXFjb20sY2RjLXZkZC1zcGtkcnYtMi1jdXJyZW50ID0gPDYwMDAwMD47CisKKwkJcWNvbSxjZGMtb24tZGVtYW5kLXN1cHBsaWVzID0gImNkYy12ZGQtc3BrZHJ2IiwKKwkJCQkJICAgICAgImNkYy12ZGQtc3BrZHJ2LTIiOworCisJCXFjb20sY2RjLW1pY2JpYXMtbGRvaC12ID0gPDB4Mz47CisJCXFjb20sY2RjLW1pY2JpYXMtY2ZpbHQxLW12ID0gPDE4MDA+OworCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0Mi1tdiA9IDwyNzAwPjsKKwkJcWNvbSxjZGMtbWljYmlhcy1jZmlsdDMtbXYgPSA8MTgwMD47CisJCXFjb20sY2RjLW1pY2JpYXMxLWNmaWx0LXNlbCA9IDwweDA+OworCQlxY29tLGNkYy1taWNiaWFzMi1jZmlsdC1zZWwgPSA8MHgxPjsKKwkJcWNvbSxjZGMtbWljYmlhczMtY2ZpbHQtc2VsID0gPDB4Mj47CisJCXFjb20sY2RjLW1pY2JpYXM0LWNmaWx0LXNlbCA9IDwweDI+OworCQlxY29tLGNkYy1tY2xrLWNsay1yYXRlID0gPDEyMjg4MDAwPjsKKwl9OworCisJd2NkOXh4eF9jb2RlY0A3N3sKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaTJjIjsKKwkJcmVnID0gPDB4Nzc+OworCX07CisKKwl3Y2Q5eHh4X2NvZGVjQDY2eworCQljb21wYXRpYmxlID0gInFjb20sd2NkOXh4eC1pMmMiOworCQlyZWcgPSA8MHg2Nj47CisJfTsKKwl3Y2Q5eHh4X2NvZGVjQDU1eworCQljb21wYXRpYmxlID0gInFjb20sd2NkOXh4eC1pMmMiOworCQlyZWcgPSA8MHg1NT47CisJfTsKK307CisKK1RvbWJhayBhdWRpbyBDT0RFQyBpbiBTUE1JIG1vZGUKKworIC0gY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jb2RlYy1jb3JlIiwKKyAtIGNvbXBhdGlibGUgPSAicWNvbSxwbWljLWNvZGVjLWRpZ2l0YWwiCisgLSBjb21wYXRpYmxlID0gInFjb20scG1pYy1jb2RlYy1hbmFsb2ciCisgLSByZWc6IHJlcHJlc2VudHMgdGhlIHNsYXZlIGJhc2UgYWRkcmVzcyBwcm92aWRlZCB0byB0aGUgcGVyaXBoZXJhbC4KKyAtIGludGVycnVwdC1wYXJlbnQgOiBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgorIC0gaW50ZXJydXB0czogTGlzdCBvZiBpbnRlcnJ1cHRzIGluIGdpdmVuIFNQTUkgcGVyaXBoZXJhbC4KKyAtIGludGVycnVwdC1uYW1lczogTmFtZXMgc3BlY2lmaWNlZCB0byBhYm92ZSBsaXN0IG9mIGludGVycnVwdHMgaW4gc2FtZQorCQkgICAgb3JkZXIuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKyAtIGNkYy12ZGRhLWNwLXN1cHBseTogcGhhbmRsZSBvZiBjcCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZGEtY3Atdm9sdGFnZTogY3Agc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZGEtY3AtY3VycmVudDogY3Agc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGRhLXJ4LWgtc3VwcGx5OiBwaGFuZGxlIG9mIHZkZGEtcngtaCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZGEtcngtaC12b2x0YWdlOiB2ZGRhLXJ4LWggc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZGEtcngtaC1jdXJyZW50OiB2ZGRhLXJ4LWggc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGRhLXR4LWgtc3VwcGx5OiBwaGFuZGxlIG9mIHZkZGEtdHgtaCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZGEtdHgtaC12b2x0YWdlOiB2ZGRhLXR4LWggc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZGEtdHgtaC1jdXJyZW50OiB2ZGRhLXR4LWggc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtcHgtc3VwcGx5OiBwaGFuZGxlIG9mIHZkZC1weCBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1weC12b2x0YWdlOiB2ZGQtcHggc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1weC1jdXJyZW50OiB2ZGQtcHggc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtcGEtc3VwcGx5OiBwaGFuZGxlIG9mIHZkZC1wYSBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1wYS12b2x0YWdlOiB2ZGQtcGEgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1wYS1jdXJyZW50OiB2ZGQtcGEgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy12ZGQtbWljLWJpYXMtc3VwcGx5OiBwaGFuZGxlIG9mIG1pYy1iaWFzIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZQorCQkJICAgIG5vZGUuCisgLSBxY29tLGNkYy12ZGQtbWljLWJpYXMtdm9sdGFnZTogbWljLWJpYXMgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heAorCQkJCSAgaW4gbVYuCisgLSBxY29tLGNkYy12ZGQtbWljLWJpYXMtY3VycmVudDogbWljLWJpYXMgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIHFjb20sY2RjLW1jbGstY2xrLXJhdGU6IFNwZWNpZmllcyB0aGUgbWFzdGVyIGNsb2NrIHJhdGUgaW4gSHogcmVxdWlyZWQgZm9yCisJCQkgICAgY29kZWMuCisKKyAtIHFjb20sY2RjLXN0YXRpYy1zdXBwbGllczogTGlzdCBvZiBzdXBwbGllcyB0byBiZSBlbmFibGVkIHByaW9yIHRvIGNvZGVjCisJCQkgICAgIGhhcmR3YXJlIHByb2JlLiAgU3VwcGxpZXMgaW4gdGhpcyBsaXN0IHdpbGwgYmUKKwkJCSAgICAgc3RheSBlbmFibGVkLgorCisgLSBxY29tLGNkYy1vbi1kZW1hbmQtc3VwcGxpZXM6IExpc3Qgb2Ygc3VwcGxpZXMgd2hpY2ggY2FuIGJlIGVuYWJsZWQKKwkJCQlkeW5hbWljYWxseS4KKwkJCQlTdXBwbGllcyBpbiB0aGlzIGxpc3QgYXJlIG9mZiBieSBkZWZhdWx0LgorIC0gcWNvbSxjZGMtbWljYmlhcy1jZmlsdC1tdiA6IE1JQ0JJQVMgdm9sdGFnZSB2YWx1ZQorIC0gcWNvbSxjZGMtYm9vc3Qtdm9sdGFnZTogU3BlY2lmaWVzIHRoZSBhbmFsb2cgYm9vc3Qgb3V0cHV0IHZvbHRhZ2UgdmFsdWUuCisJCQkJVmFsdWUgZnJvbSA0MDAwIHRvIDU1NTAgaW4gbVYgaW4gc3RlcHMgb2YgNTAgbVYgY2FuIGJlIGdpdmVuLgorIC0gcWNvbSxkaWctY2RjLWJhc2UtYWRkcjogU3BlY2lmaWVzIHRoZSBkaWdpdGFsIGNvZGVjIGJhc2UgYWRkcmVzcyBmb3IgTVNNIGRpZ2l0YWwKKwkJCQljb3JlIHJlZ2lzdGVyIHdyaXRlcy4KKworRXhhbXBsZToKKworbXNtX2RpZ19jb2RlYzogcWNvbSxtc20taW50LWNvZGVjIHsKKwljb21wYXRpYmxlID0gInFjb20sbXNtX2ludF9jb3JlX2NvZGVjIjsKKwlxY29tLGRpZy1jZGMtYmFzZS1hZGRyID0gPDB4YzBmMDAwMD47Cit9OworCittc204eDE2X3djZF9jb2RlY0BmMTAwIHsKKwljb21wYXRpYmxlID0gInFjb20sbXNtX2ludF9wbWljX2FuYWxvZ19jb2RlYyI7CisJcmVnID0gPDB4ZjEwMCAweDEwMD47Cit9OworCittc204eDE2X3djZF9jb2RlY0BmMDAweworCWNvbXBhdGlibGUgPSAicWNvbSxtc21faW50X3BtaWNfZGlnaXRhbF9jb2RlYyI7CisJcmVnID0gPDB4ZjAwMCAweDEwMD47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmc3BtaV9idXM+OworCWludGVycnVwdHMgPSA8MHgxIDB4ZjAgMHgwPiwKKwkJICAgICA8MHgxIDB4ZjAgMHgxPiwKKwkJICAgICA8MHgxIDB4ZjAgMHgyPiwKKwkJICAgICA8MHgxIDB4ZjAgMHgzPiwKKwkJICAgICA8MHgxIDB4ZjAgMHg0PiwKKwkJICAgICA8MHgxIDB4ZjAgMHg1PiwKKwkJICAgICA8MHgxIDB4ZjAgMHg2PiwKKwkJICAgICA8MHgxIDB4ZjAgMHg3PjsKKwlpbnRlcnJ1cHQtbmFtZXMgPSAic3BrX2NucF9pbnQiLAorCQkJICAic3BrX2NsaXBfaW50IiwKKwkJCSAgInNwa19vY3BfaW50IiwKKwkJCSAgImluc19yZW1fZGV0MSIsCisJCQkgICJidXRfcmVsX2RldCIsCisJCQkgICJidXRfcHJlc3NfZGV0IiwKKwkJCSAgImluc19yZW1fZGV0IiwKKwkJCSAgIm1iaGNfaW50IjsKKworCWNkYy12ZGRhLWNwLXN1cHBseSA9IDwmcG04OTE2X3M0PjsKKwlxY29tLGNkYy12ZGRhLWNwLXZvbHRhZ2UgPSA8MTgwMDAwMCAyMjAwMDAwPjsKKwlxY29tLGNkYy12ZGRhLWNwLWN1cnJlbnQgPSA8NzcwMDAwPjsKKworCWNkYy12ZGRhLXJ4LWgtc3VwcGx5ID0gPCZwbTg5MTZfbDU+OworCXFjb20sY2RjLXZkZGEtcngtaC12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJcWNvbSxjZGMtdmRkYS1yeC1oLWN1cnJlbnQgPSA8MjAwMDA+OworCisJY2RjLXZkZGEtdHgtaC1zdXBwbHkgPSA8JnBtODkxNl9sNT47CisJcWNvbSxjZGMtdmRkYS10eC1oLXZvbHRhZ2UgPSA8MTgwMDAwMCAxODAwMDAwPjsKKwlxY29tLGNkYy12ZGRhLXR4LWgtY3VycmVudCA9IDwyMDAwMD47CisKKwljZGMtdmRkLXB4LXN1cHBseSA9IDwmcG04OTE2X3M0PjsKKwlxY29tLGNkYy12ZGQtcHgtdm9sdGFnZSA9IDwxODAwMDAwIDIyMDAwMDA+OworCXFjb20sY2RjLXZkZC1weC1jdXJyZW50ID0gPDc3MDAwMD47CisKKwljZGMtdmRkLXBhLXN1cHBseSA9IDwmcG04OTE2X2w1PjsKKwlxY29tLGNkYy12ZGQtcGEtdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCXFjb20sY2RjLXZkZC1wYS1jdXJyZW50ID0gPDUwMDA+OworCisJY2RjLXZkZC1taWMtYmlhcy1zdXBwbHkgPSA8JnBtODkxNl9sMTM+OworCXFjb20sY2RjLXZkZC1taWMtYmlhcy12b2x0YWdlID0gPDMwNzUwMDAgMzA3NTAwMD47CisJcWNvbSxjZGMtdmRkLW1pYy1iaWFzLWN1cnJlbnQgPSA8MjUwMDA+OworCisJcWNvbSxjZGMtbWNsay1jbGstcmF0ZSA9IDw5NjAwMDAwPjsKKworCXFjb20sY2RjLXN0YXRpYy1zdXBwbGllcyA9ICJjZGMtdmRkYS1oIiwKKwkJCQkgICAiY2RjLXZkZC1weCIsCisJCQkJICAgImNkYy12ZGQtcGEiLAorCQkJCSAgICJjZGMtdmRkYS1jcCI7CisKKwlxY29tLGNkYy1vbi1kZW1hbmQtc3VwcGxpZXMgPSAiY2RjLXZkZC1taWMtYmlhcyI7CisJcWNvbSxkaWctY2RjLWJhc2UtYWRkciA9IDwweGMwZjAwMDA+OworfTsKKworVGFzaGEgYXVkaW8gQ09ERUMgaW4gSTJDIG1vZGUKKworIC0gY29tcGF0aWJsZSA9ICJxY29tLHRhc2hhLWkyYy1wZ2QiOworIC0gcmVnOiByZXByZXNlbnRzIHRoZSBzbGF2ZSBhZGRyZXNzIHByb3ZpZGVkIHRvIHRoZSBJMkMgZHJpdmVyLgorIC0gcWNvbSxjZGMtcmVzZXQtZ3BpbzogZ3BpbyB1c2VkIGZvciBjb2RlYyBTT0MgcmVzZXQuCisKKyAtIGNkYy12ZGQtYnVjay1zdXBwbHk6IHBoYW5kbGUgb2YgYnVjayBzdXBwbHkncyByZWd1bGF0b3IgZGV2aWNlIHRyZWUgbm9kZS4KKyAtIHFjb20sY2RjLXZkZC1idWNrLXZvbHRhZ2U6IGJ1Y2sgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZC1idWNrLWN1cnJlbnQ6IGJ1Y2sgc3VwcGx5J3MgbWF4IGN1cnJlbnQgaW4gbUEuCisKKyAtIGNkYy1idWNrLXNpZG8tc3VwcGx5OiBwaGFuZGxlIG9mIHNpZG8gc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy1idWNrLXNpZG8tdm9sdGFnZSA9IHNpZG8gc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLWJ1Y2stc2lkby1jdXJyZW50ID0gc2lkbyBzdXBwbHkncyBtYXggY3VycmVudCBpbiBtQS4KKworIC0gY2RjLXZkZC10eC1oLXN1cHBseTogcGhhbmRsZSBvZiB0eC1oIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkLXR4LWgtdm9sdGFnZTogdHgtaCBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkLXR4LWgtY3VycmVudDogdHgtaCBzdXBwbHkncyBtYXggY3VycmVudCBpbiBtQS4KKworIC0gY2RjLXZkZC1yeC1oLXN1cHBseTogcGhhbmRsZSBvZiByeC1oIHN1cHBseSdzIHJlZ3VsYXRvciBkZXZpY2UgdHJlZSBub2RlLgorIC0gcWNvbSxjZGMtdmRkLXJ4LWgtdm9sdGFnZTogcngtaCBzdXBwbHkncyB2b2x0YWdlIGxldmVsIG1pbiBhbmQgbWF4IGluIG1WLgorIC0gcWNvbSxjZGMtdmRkLXJ4LWgtY3VycmVudDogcngtaCBzdXBwbHkncyBtYXggY3VycmVudCBpbiBtQS4KKworIC0gY2RjLXZkZHB4LTEtc3VwcGx5OiBwaGFuZGxlIG9mIHB4LTEgc3VwcGx5J3MgcmVndWxhdG9yIGRldmljZSB0cmVlIG5vZGUuCisgLSBxY29tLGNkYy12ZGRweC0xLXZvbHRhZ2U6IHB4LTEgc3VwcGx5J3Mgdm9sdGFnZSBsZXZlbCBtaW4gYW5kIG1heCBpbiBtVi4KKyAtIHFjb20sY2RjLXZkZHB4LTEtY3VycmVudDogcHgtMSBzdXBwbHkncyBtYXggY3VycmVudCBpbiBtQS4KKworIC0gcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzOiBMaXN0IG9mIHN1cHBsaWVzIHRvIGJlIGVuYWJsZWQgcHJpb3IgdG8gY29kZWMKKwkJCSAgICAgaGFyZHdhcmUgcHJvYmUuICBTdXBwbGllcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZQorCQkJICAgICBzdGF5IGVuYWJsZWQuCisKKyAtIHFjb20sY2RjLW1pY2JpYXMxLW12IC0gbWljYmlhczEgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisgLSBxY29tLGNkYy1taWNiaWFzMi1tdiAtIG1pY2JpYXMyIG91dHB1dCB2b2x0YWdlIGluIG1pbGxpIHZvbHRzLgorIC0gcWNvbSxjZGMtbWljYmlhczMtbXYgLSBtaWNiaWFzMyBvdXRwdXQgdm9sdGFnZSBpbiBtaWxsaSB2b2x0cy4KKyAtIHFjb20sY2RjLW1pY2JpYXM0LW12IC0gbWljYmlhczQgb3V0cHV0IHZvbHRhZ2UgaW4gbWlsbGkgdm9sdHMuCisKKyAtIHFjb20sY2RjLW1jbGstY2xrLXJhdGUgLSBTcGVjaWZpZXMgdGhlIG1hc3RlciBjbG9jayByYXRlIGluIEh6IHJlcXVpcmVkIGZvcgorCQkJICAgIGNvZGVjLgorCisgLSBxY29tLGNkYy1kbWljLXNhbXBsZS1yYXRlIC0gU3BlY2lmaWVzIGRtaWMgc2FtcGxlIHJhdGUuCisgLSBxY29tLGNkYy12YXJpYW50IC0gU3BlY2lmaWVzIGNvZGVjIHZhcmlhbnQuCisKK0V4YW1wbGU6CitpMmNfMzogaTJjQDc4QjcwMDAgeyAvKiBCTFNQMSBRVVAzICovCisJY29tcGF0aWJsZSA9ICJxY29tLGkyYy1tc20tdjIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCXJlZy1uYW1lcyA9ICJxdXBfcGh5c19hZGRyIjsKKwlyZWcgPSA8MHg3OEI3MDAwIDB4NjAwPjsKKwlpbnRlcnJ1cHQtbmFtZXMgPSAicXVwX2lycSI7CisJaW50ZXJydXB0cyA9IDwwIDk3IDA+OworCWRtYXMgPSA8JmRtYV9ibHNwMSAxMiA2NCAweDIwMDAwMDIwIDB4MjA+LAorCQk8JmRtYV9ibHNwMSAxMyAzMiAweDIwMDAwMDIwIDB4MjA+OworCWRtYS1uYW1lcyA9ICJ0eCIsICJyeCI7CisJcWNvbSxtYXN0ZXItaWQgPSA8ODY+OworCXFjb20sY2xrLWZyZXEtb3V0ID0gPDQwMDAwMD47CisJcWNvbSxjbGstZnJlcS1pbiAgPSA8MTkyMDAwMDA+OworCWNsb2NrLW5hbWVzID0gImlmYWNlX2NsayIsICJjb3JlX2NsayI7CisJY2xvY2tzID0gPCZjbG9ja19nY2MgY2xrX2djY19ibHNwMV9haGJfY2xrPiwKKwkJIDwmY2xvY2tfZ2NjIGNsa19nY2NfYmxzcDFfcXVwM19pMmNfYXBwc19jbGs+OworCXBpbmN0cmwtbmFtZXMgPSAiaTJjX2FjdGl2ZSIsICJpMmNfc2xlZXAiOworCXBpbmN0cmwtMCA9IDwmaTJjXzNfYWN0aXZlPjsKKwlwaW5jdHJsLTEgPSA8JmkyY18zX3NsZWVwPjsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJd2NkOXh4eF9jb2RlY0BkeworCQljb21wYXRpYmxlID0gInFjb20sdGFzaGEtaTJjLXBnZCI7CisJCXJlZyA9IDwweDBkPjsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3Y2Q5eHh4X2ludGM+OworCQlpbnRlcnJ1cHRzID0gPDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYKKwkJCQkgIDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5CisJCQkJICAzMD47CisKKwkJcWNvbSxjZGMtcmVzZXQtZ3BpbyA9IDwmdGxtbV9waW5tdXggOTAgMD47CisKKwkJY2RjLXZkZC1idWNrLXN1cHBseSA9IDwmY29kZWNfYnVja192cmVnPjsKKwkJcWNvbSxjZGMtdmRkLWJ1Y2stdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCQlxY29tLGNkYy12ZGQtYnVjay1jdXJyZW50ID0gPDY1MDAwMD47CisKKwkJY2RjLWJ1Y2stc2lkby1zdXBwbHkgPSA8JmNvZGVjX2J1Y2tfdnJlZz47CisJCXFjb20sY2RjLWJ1Y2stc2lkby12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJCXFjb20sY2RjLWJ1Y2stc2lkby1jdXJyZW50ID0gPDIwMDAwMD47CisKKwkJY2RjLXZkZC10eC1oLXN1cHBseSA9IDwmcG1kY2FsaWZvcm5pdW1fbDY+OworCQlxY29tLGNkYy12ZGQtdHgtaC12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJCXFjb20sY2RjLXZkZC10eC1oLWN1cnJlbnQgPSA8MjUwMDA+OworCisJCWNkYy12ZGQtcngtaC1zdXBwbHkgPSA8JnBtZGNhbGlmb3JuaXVtX2w2PjsKKwkJcWNvbSxjZGMtdmRkLXJ4LWgtdm9sdGFnZSA9IDwxODAwMDAwIDE4MDAwMDA+OworCQlxY29tLGNkYy12ZGQtcngtaC1jdXJyZW50ID0gPDI1MDAwPjsKKworCQljZGMtdmRkcHgtMS1zdXBwbHkgPSA8JnBtZGNhbGlmb3JuaXVtX2w2PjsKKwkJcWNvbSxjZGMtdmRkcHgtMS12b2x0YWdlID0gPDE4MDAwMDAgMTgwMDAwMD47CisJCXFjb20sY2RjLXZkZHB4LTEtY3VycmVudCA9IDwxMDAwMD47CisKKwkJcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzID0gImNkYy12ZGQtYnVjayIsCisJCQkJCSAgICJjZGMtYnVjay1zaWRvIiwKKwkJCQkJICAgImNkYy12ZGQtdHgtaCIsCisJCQkJCSAgICJjZGMtdmRkLXJ4LWgiLAorCQkJCQkgICAiY2RjLXZkZHB4LTEiOworCisJCXFjb20sY2RjLW1pY2JpYXMxLW12ID0gPDE4MDA+OworCQlxY29tLGNkYy1taWNiaWFzMi1tdiA9IDwxODAwPjsKKwkJcWNvbSxjZGMtbWljYmlhczMtbXYgPSA8MTgwMD47CisJCXFjb20sY2RjLW1pY2JpYXM0LW12ID0gPDE4MDA+OworCQlxY29tLGNkYy1tY2xrLWNsay1yYXRlID0gPDEyMjg4MDAwPjsKKwkJcWNvbSxjZGMtZG1pYy1zYW1wbGUtcmF0ZSA9IDw0ODAwMDAwPjsKKworCQlzd3JfbWFzdGVyIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzd3Itd2NkIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXdzYTg4MXhfMTogd3NhODgxeEAyMDE3MDIxMiB7CisJCQkJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgiOworCQkJCXJlZyA9IDwweDAwIDB4MjAxNzAyMTI+OworCQkJCXFjb20sc3Brci1zZC1uLWdwaW8gPSA8JnRsbW1fcGlubXV4IDgwIDA+OworCisJCQkJY2RjLXZkZC1kLXN1cHBseSA9IDwmcG1kY2FsaWZvcm5pdW1fbDY+OworCQkJCXFjb20sY2RjLXZkZC1kLXZvbHRhZ2UgPSA8MTgwMDAwMAorCQkJCQkJCSAgMTgwMDAwMD47CisJCQkJcWNvbSxjZGMtdmRkLWQtY3VycmVudCA9IDwyMDAwPjsKKworCQkJCWNkYy12ZGQtYS1zdXBwbHkgPSA8JnBtZGNhbGlmb3JuaXVtX2w2PjsKKwkJCQlxY29tLGNkYy12ZGQtYS12b2x0YWdlID0gPDE4MDAwMDAKKwkJCQkJCQkgIDE4MDAwMDA+OworCQkJCXFjb20sY2RjLXZkZC1hLWN1cnJlbnQgPSA8MjAwMD47CisKKwkJCQlxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMgPSAiY2RjLXZkZC1kIiwKKwkJCQkJCQkgICAiY2RjLXZkZC1hIjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd3NhODgxeC1hbmFsb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dzYTg4MXgtYW5hbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTdiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dzYTg4MXgtYW5hbG9nLnR4dApAQCAtMCwwICsxLDg4IEBACit3c2E4ODF4IEF1ZGlvIENPREVDCisKK3dzYTg4MXggQXVkaW8gQ09ERUMgY2FuIHN1cHBvcnQgZWl0aGVyIEkyQyBpbnRlcmZhY2Ugb3IgU291bmR3aXJlIGludGVyZmFjZS4KK0luIEFuYWxvZyBtb2RlLCB0aGlzIGNvZGVjIHdpbGwgb3BlcmF0ZSBhcyBJMkMgc2xhdmUgZGV2aWNlIGFuZAoraW50ZXJhY3RzIHdpdGggSTJDIGNvbnRyb2xsZXIgZm9yIHN0YXR1cywgY29udHJvbCBhbmQgaW50ZXJydXB0IG1hbmFnZW1lbnQuCitUaGUgd3NhODgxeCBkZXZpY2Ugbm9kZXMgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBjaGlsZCBub2RlcyB0byBJMkMKK21hc3RlciBkZXZpY2Ugbm9kZSBpbiB0aGUgZGV2aWNldHJlZS4gQ3VycmVudGx5LCB0aGUgYmVsb3cgZGV2aWNldHJlZQorYmluZGluZ3MgYXJlIGZvciBJMkMgbW9kZSBvbmx5IGFuZCBkb2VzIG5vdCBpbmNsdWRlIHNvdW5kd2lyZSBtb2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogInFjb20sd3NhODgxeC1pMmMtY29kZWMiCisgLSByZWcgOiBVbmlxdWUgZGV2aWNlIElEIG9mIEkyQyBzbGF2ZSBkZXZpY2UuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20sbXNtLWdwaW9zIDogTGlzdHMgZG93biBhbGwgdGhlIGdwaW8gc2V0cyB0aGF0IGFyZSBzdXBwb3J0ZWQuCistIHFjb20scGluY3RybC1uYW1lcyA6IExpc3RzIGFsbCB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHRoZSBncGlvIHNldHMKK21lbnRpb25lZCBpbiBxY29tLG1zbS1ncGlvcy4gU2F5IHdlIGhhdmUgMl5OIGNvbWJpbmF0aW9ucyBmb3IgTiBHUElPcywgdGhpcworbGlzdCBhbGwgMl5OIGNvbWJpbmF0aW9ucy4KKy0gcGluY3RybC1uYW1lcyA6IFRoZSBjb21iaW5hdGlvbnMgb2YgZ3BpbyBzZXRzIGZyb20gYWJvdmUgdGhhdCBhcmUgc3VwcG9ydGVkIGluCit0aGUgZmxhdm9yLiBUaGlzIGNhbiBiZSBzb21ldGltZXMgc2FtZSBhcyBxY29tLCBwaW5jdHJsLW5hbWVzIGkuZSB3aXRoIDJeTgorY29tYmluYXRpb25zIG9yIHdpbGwgaGF2ZSBsZXNzIGluY2FzZSBpZiBzb21lIGNvbWJpbmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCistIHBpbmN0cmwtIyA6IFBpbmN0cmwgc3RhdGVzIGFzIG1lbnRpb25lZCBpbiBwaW5jdHJsLW5hbWVzLgorCisqIHdzYV9pbnRjCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicWNvbSx3c2EtaXJxIgorIC0gaW50ZXJydXB0LWNvbnRyb2xsZXIgOiAgICAgICAgICAgICAgICAgIE1hcmsgdGhpcyBkZXZpY2Ugbm9kZSBhcyBhbgorCQkJCQkgICBpbnRlcnJ1cHQgY29udHJvbGxlcgorIC0gI2ludGVycnVwdC1jZWxscyA6ICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSAxCisgLSBpbnRlcnJ1cHQtcGFyZW50IDogICAgICAgICAgICAgICAgICAgICAgUGFyZW50IGludGVycnVwdCBjb250cm9sbGVyCisgLSBpbnRlcnJ1cHRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IG51bWJlciBvbiB0aGUgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAtIGludGVycnVwdC1uYW1lcyA6ICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIGludGVycnVwdCBvbiB0aGUgcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGNvbnRyb2xsZXIKK0V4YW1wbGU6CisKK3dzYTg4MXgtaTJjLWNvZGVjQDBlIHsKKwljb21wYXRpYmxlID0gInFjb20sd3NhODgxeC1pMmMtY29kZWMiOworCXJlZyA9IDwweDBlPjsKKwlxY29tLG1zbS1ncGlvcyA9ICJ3c2FfY2xrIiwKKwkJCSJ3c2FfcmVzZXQiOworCXFjb20scGluY3RybC1uYW1lcyA9ICJhbGxfb2ZmIiwKKwkJCQkid3NhX2NsayIsCisJCQkJIndzYV9hY3RpdmUiLAorCQkJCSJ3c2FfY2xrX2FjdGl2ZSI7CisJcGluY3RybC1uYW1lcyA9ICJhbGxfb2ZmIiwKKwkJCSJ3c2FfY2xrIiwKKwkJCSJ3c2FfYWN0aXZlIiwKKwkJCSJ3c2FfY2xrX2FjdGl2ZSI7CisJcGluY3RybC0wID0gPCZ3c2FfY2xrX29mZiAmd3NhX3N1c3BlbmQ+OworCXBpbmN0cmwtMSA9IDwmd3NhX2Nsa19vbiAmd3NhX3N1c3BlbmQ+OworCXBpbmN0cmwtMiA9IDwmd3NhX2Nsa19vZmYgJndzYV9hY3RpdmU+OworCXBpbmN0cmwtMyA9IDwmd3NhX2Nsa19vbiAmd3NhX2FjdGl2ZT47Cit9OworCit3c2E4ODF4LWkyYy1jb2RlY0A0NCB7CisJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgtaTJjLWNvZGVjIjsKKwlyZWcgPSA8MHg0ND47Cit9OworCit3c2E4ODF4LWkyYy1jb2RlY0AwZiB7CisJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgtaTJjLWNvZGVjIjsKKwlyZWcgPSA8MHgwZj47CisJcWNvbSxtc20tZ3Bpb3MgPSAid3NhX2NsayIsCisJCQkid3NhX3Jlc2V0IjsKKwlxY29tLHBpbmN0cmwtbmFtZXMgPSAiYWxsX29mZiIsCisJCQkJIndzYV9jbGsiLAorCQkJCSJ3c2FfYWN0aXZlIiwKKwkJCQkid3NhX2Nsa19hY3RpdmUiOworCXBpbmN0cmwtbmFtZXMgPSAiYWxsX29mZiIsCisJCQkid3NhX2FjdGl2ZSIsCisJCQkid3NhX2Nsa19hY3RpdmUiOworCXBpbmN0cmwtMCA9IDwmd3NhX2Nsa19vZmYgJndzYV9zdXNwZW5kPjsKKwlwaW5jdHJsLTEgPSA8JndzYV9jbGtfb2ZmICZ3c2FfYWN0aXZlPjsKKwlwaW5jdHJsLTIgPSA8JndzYV9jbGtfb24gJndzYV9hY3RpdmU+OworfTsKKword3NhX2ludGM6IHdzYS1pcnEgeworCWNvbXBhdGlibGUgPSAicWNvbSx3c2EtaXJxIjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1zbV9ncGlvPjsKKwlpbnRlcnJ1cHRzID0gPDk3IDA+OworCWludGVycnVwdC1uYW1lcyA9ICJ3c2EtaW50IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd3NhODgxeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd3NhODgxeC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZWFkNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93c2E4ODF4LnR4dApAQCAtMCwwICsxLDQ1IEBACit3c2E4ODF4IEF1ZGlvIENPREVDCisKK3dzYTg4MXggQXVkaW8gQ09ERUMgY2FuIHN1cHBvcnQgZWl0aGVyIFNvdW5kd2lyZSBpbnRlcmZhY2Ugb3IgSTJDIGludGVyZmFjZS4KK0luIFNvdW5kd2lyZSBtb2RlLCB0aGlzIGNvZGVjIHdpbGwgb3BlcmF0ZSBhcyBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlIGFuZAordXNlcyBzb3VuZHdpcmUgZnJhbWV3b3JrIHRvIGludGVyYWN0IHdpdGggc291bmR3aXJlIG1hc3RlciBjb250cm9sbGVyLgorVGhlIHdzYTg4MXggZGV2aWNlIG5vZGVzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgY2hpbGQgbm9kZXMgdG8gc291bmR3aXJlCittYXN0ZXIgZGV2aWNlIG5vZGUgaW4gdGhlIGRldmljZXRyZWUuIEN1cnJlbnRseSwgdGhlIGJlbG93IGRldmljZXRyZWUKK2JpbmRpbmdzIGFyZSBmb3Igc291bmR3aXJlIG1vZGUgb25seSBhbmQgZG9lcyBub3QgaW5jbHVkZSBJMkMgbW9kZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6ICJxY29tLHdzYTg4MXgiCisgLSByZWcgOiBVbmlxdWUgZGV2aWNlIElEIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UoNDggYml0cykuCisgLSBxY29tLHNwa3Itc2Qtbi1ncGlvIDogc2h1dGRvd24gZ3BpbyBwaW4gdG8ga2VlcCB3c2E4ODF4IGluIGxvdyBwb3dlciBtb2RlLgorIC0gcGluY3RybC1uYW1lcyA6IFBpbmNudHJsIGVudHJpZXMgdG8gY29uZmlndXJlIHRoZSBQRE0gZ3BpbyBsaW5lcyBhbmQKKwkJICBjcm9zcyBjb25uZWN0aW9uIHN3aXRjaCBncGlvIGFjY29yZGluZ2x5CisgLSBwaW5jdHJsLTAgOiBUaGlzIGV4cGxhaW5zIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIHNodXRkb3duIGdwaW8gcGluCisgICAgICAgICAgdG8ga2VlcCB3c2E4ODF4IGluIGxvdyBwb3dlciBtb2RlCisgLSBwaW5jdHJsLTEgOiBUaGlzIGV4cGxhaW5zIHRoZSBzdXNwZW5kIHN0YXRlIG9mIHRoZSBzaHV0ZG93biBncGlvIHBpbgorICAgICAgICAgIHRvIGtlZXAgd3NhODgxeCBpbiBsb3cgcG93ZXIgbW9kZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCitFeGFtcGxlOgorCit3c2E4ODF4QDMyMDAwIHsKKwljb21wYXRpYmxlID0gInFjb20sd3NhODgxeCI7CisJcmVnID0gPDB4MDAgMHgwMzIwMDA+OworCXFjb20sc3Brci1zZC1uLWdwaW8gPSA8JnBtaTg5OTRfZ3Bpb3MgMiAwPjsKKwlwaW5jdHJsLW5hbWVzID0gIndzYV9zcGtyX3NkX2FjdCIsCisJCSJ3c2Ffc3Brcl9zZF9zdXMiOworCXBpbmN0cmwtMCA9IDwmd3NhX3Nwa3Jfc2RfYWN0PjsKKwlwaW5jdHJsLTEgPSA8JndzYV9zcGtyX3NkX3N1cz47Cit9OworCit3c2E4ODF4QDQyMDAwIHsKKwljb21wYXRpYmxlID0gInFjb20sd3NhODgxeCI7CisJcmVnID0gPDB4MDAgMHgwNDIwMDA+OworCXFjb20sc3Brci1zZC1uLWdwaW8gPSA8JnBtaTg5OTRfZ3Bpb3MgMyAwPjsKKwlwaW5jdHJsLW5hbWVzID0gIndzYV9zcGtyX3NkX2FjdCIsCisJCSJ3c2Ffc3Brcl9zZF9zdXMiOworCXBpbmN0cmwtMCA9IDwmd3NhX3Nwa3Jfc2RfYWN0PjsKKwlwaW5jdHJsLTEgPSA8JndzYV9zcGtyX3NkX3N1cz47CisKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmR3aXJlL3N3ci13Y2QtY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmR3aXJlL3N3ci13Y2QtY3RybC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3Y2E5YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZHdpcmUvc3dyLXdjZC1jdHJsLnR4dApAQCAtMCwwICsxLDMxIEBACitRdWFsY29tbSB0ZWNobm9sb2dpZXMgaW5jIFdDRCBDb2RlYyBTb3VuZFdpcmUgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJxY29tLHN3ci13Y2QiCisgLSByZWcgOiBVbmlxdWUgZGV2aWNlIElEKDQ4IGJpdHMpIG9mIFNvdW5kd2lyZSBzbGF2ZSBkZXZpY2Ugbm9kZS4KKwkgSW4gdGhlIGJlbG93IGV4YW1wbGUsIHdzYTg4MXggaXMgc291bmR3aXJlIHNsYXZlIGRldmljZSBmb3IKKwkgd2hpY2ggdGhlIHN3ci1kZXZpZCBpcyA8MHgwIDB4MDMyMDAwPiB3aGVyZSAweDAzIHJlcHJlc2VudHMKKwkgZGV2aWNlIFVuaXF1ZV9JRCwgMHgyMCByZXByZXNlbnRzIFBhcnRfSWQxIGFuZCAweDAwCisJIHJlcHJlc2VudHMgcGFydF9JZDIuCistICNhZGRyZXNzLWNlbGxzID0gPDI+OworLSAjc2l6ZS1jZWxscyA9IDwwPjsKKworT3B0aW9uYWwgcHJvcGVydHk6CisKKyBFeGFtcGxlOgorCXN3cl9tYXN0ZXIgeworCQljb21wYXRpYmxlID0gInFjb20sc3dyLXdjZCI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQl3c2E4ODF4QDMyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSx3c2E4ODF4IjsKKwkJCXJlZyA9IDwweDAwIDB4MDMyMDAwPjsKKwkJfTsKKworCQl3c2E4ODF4QDQyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSx3c2E4ODF4IjsKKwkJCXJlZyA9IDwweDAwIDB4MDQyMDAwPjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbXNrdW5rLWNhbWVyYS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbXNrdW5rLWNhbWVyYS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTdkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtc2t1bmstY2FtZXJhLmR0c2kKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCismc29jIHsKKwlxY29tLGNhbS1yZXEtbWdyIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNhbS1yZXEtbWdyIjsKKwkJc3RhdHVzID0gIm9rIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvY29uZmlncy9tc21za3Vuay1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtNjQvY29uZmlncy9tc21za3Vuay1wZXJmX2RlZmNvbmZpZwppbmRleCA1ZjNkZGEyZS4uOTdmYmFkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jb25maWdzL21zbXNrdW5rLXBlcmZfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvY29uZmlncy9tc21za3Vuay1wZXJmX2RlZmNvbmZpZwpAQCAtMjU4LDcgKzI1OCw2IEBACiBDT05GSUdfUE9XRVJfUkVTRVRfWEdFTkU9eQogQ09ORklHX1BPV0VSX1JFU0VUX1NZU0NPTj15CiBDT05GSUdfTUZEX1NQTUlfUE1JQz15Ci1DT05GSUdfUkVHVUxBVE9SPXkKIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CiBDT05GSUdfUkVHVUxBVE9SX1JQTUg9eQogQ09ORklHX1JFR1VMQVRPUl9TVFVCPXkKQEAgLTI2OSw4ICsyNjgsMTAgQEAKIENPTkZJR19WSURFT19BRFZfREVCVUc9eQogQ09ORklHX1ZJREVPX0ZJWEVEX01JTk9SX1JBTkdFUz15CiBDT05GSUdfVjRMX1BMQVRGT1JNX0RSSVZFUlM9eQotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9BUk1DTENEPXkKK0NPTkZJR19EUk09eQorQ09ORklHX0ZCX1ZJUlRVQUw9eQorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC0zMzUsNyArMzM2LDYgQEAKIENPTkZJR19JT01NVV9URVNUUz15CiBDT05GSUdfUUNPTV9MTENDPXkKIENPTkZJR19RQ09NX01TTVNLVU5LX0xMQ0M9eQotQ09ORklHX1FDT01fU0NNPXkKIENPTkZJR19RQ09NX0VVRD15CiBDT05GSUdfUUNPTV9XQVRDSERPR19WMj15CiBDT05GSUdfUUNPTV9NRU1PUllfRFVNUF9WMj15CkBAIC0zNjksNyArMzY5LDYgQEAKIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19NU0RPU19GUz15CiBDT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CiBDT05GSUdfRUNSWVBUX0ZTPXkKIENPTkZJR19FQ1JZUFRfRlNfTUVTU0FHSU5HPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvY29uZmlncy9tc21za3Vua19kZWZjb25maWcgYi9hcmNoL2FybTY0L2NvbmZpZ3MvbXNtc2t1bmtfZGVmY29uZmlnCmluZGV4IGQ1NzYxNTUuLjRkMmUwMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvY29uZmlncy9tc21za3Vua19kZWZjb25maWcKKysrIGIvYXJjaC9hcm02NC9jb25maWdzL21zbXNrdW5rX2RlZmNvbmZpZwpAQCAtMjY1LDcgKzI2NSw2IEBACiBDT05GSUdfUE9XRVJfUkVTRVRfWEdFTkU9eQogQ09ORklHX1BPV0VSX1JFU0VUX1NZU0NPTj15CiBDT05GSUdfTUZEX1NQTUlfUE1JQz15Ci1DT05GSUdfUkVHVUxBVE9SPXkKIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CiBDT05GSUdfUkVHVUxBVE9SX1JQTUg9eQogQ09ORklHX1JFR1VMQVRPUl9TVFVCPXkKQEAgLTI3Niw4ICsyNzUsMTAgQEAKIENPTkZJR19WSURFT19BRFZfREVCVUc9eQogQ09ORklHX1ZJREVPX0ZJWEVEX01JTk9SX1JBTkdFUz15CiBDT05GSUdfVjRMX1BMQVRGT1JNX0RSSVZFUlM9eQotQ09ORklHX0ZCPXkKK0NPTkZJR19EUk09eQogQ09ORklHX0ZCX1ZJUlRVQUw9eQorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC0zNDYsNyArMzQ3LDYgQEAKIENPTkZJR19JT01NVV9URVNUUz15CiBDT05GSUdfUUNPTV9MTENDPXkKIENPTkZJR19RQ09NX01TTVNLVU5LX0xMQ0M9eQotQ09ORklHX1FDT01fU0NNPXkKIENPTkZJR19RQ09NX0VVRD15CiBDT05GSUdfUUNPTV9XQVRDSERPR19WMj15CiBDT05GSUdfUUNPTV9NRU1PUllfRFVNUF9WMj15CkBAIC0zODEsNyArMzgxLDYgQEAKIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19NU0RPU19GUz15CiBDT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CiBDT05GSUdfRUZJVkFSX0ZTPXkKIENPTkZJR19FQ1JZUFRfRlM9eQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IGNjMTEzMDIuLmNmMDNiZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTU0LDYgKzU0LDggQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc291bmR3aXJlL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3NwbWkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGNmNDAxOTQuLjk4ZGM2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtODAsNiArODAsNyBAQAogb2JqLSQoQ09ORklHX01URCkJCSs9IG10ZC8KIG9iai0kKENPTkZJR19TUEkpCQkrPSBzcGkvCiBvYmotJChDT05GSUdfU1BNSSkJCSs9IHNwbWkvCitvYmotJChDT05GSUdfU09VTkRXSVJFKQkJKz0gc291bmR3aXJlLwogb2JqLSQoQ09ORklHX0hTSSkJCSs9IGhzaS8KIG9iai15CQkJCSs9IG5ldC8KIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9hdG9taWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2F0b21pYy5jCmluZGV4IGIwNjc5YjAuLmE0OThhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2F0b21pYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2F0b21pYy5jCkBAIC0yNCwxMiArMjQsMTAgQEAKIHN0cnVjdCBtc21fY29tbWl0IHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAl1aW50MzJfdCBjcnRjX21hc2s7CisJc3RydWN0IGt0aHJlYWRfd29yayBjb21taXRfd29yazsKIH07CiAKLXN0YXRpYyB2b2lkIGNvbW1pdF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQogLyogYmxvY2sgdW50aWwgc3BlY2lmaWVkIGNydGNzIGFyZSBubyBsb25nZXIgcGVuZGluZyB1cGRhdGUsIGFuZAogICogYXRvbWljYWxseSBtYXJrIHRoZW0gYXMgcGVuZGluZyB1cGRhdGUKICAqLwpAQCAtNjAsMjEgKzU4LDYgQEAKIAlzcGluX3VubG9jaygmcHJpdi0+cGVuZGluZ19jcnRjc19ldmVudC5sb2NrKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtc21fY29tbWl0ICpjb21taXRfaW5pdChzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IG1zbV9jb21taXQgKmMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjKQotCQlyZXR1cm4gTlVMTDsKLQotCWMtPmRldiA9IHN0YXRlLT5kZXY7Ci0JYy0+c3RhdGUgPSBzdGF0ZTsKLQotCUlOSVRfV09SSygmYy0+d29yaywgY29tbWl0X3dvcmtlcik7Ci0KLQlyZXR1cm4gYzsKLX0KLQogc3RhdGljIHZvaWQgY29tbWl0X2Rlc3Ryb3koc3RydWN0IG1zbV9jb21taXQgKmMpCiB7CiAJZW5kX2F0b21pYyhjLT5kZXYtPmRldl9wcml2YXRlLCBjLT5jcnRjX21hc2spOwpAQCAtNDA0LDcgKzM4Nyw3IEBACiAvKiBUaGUgKHBvdGVudGlhbGx5KSBhc3luY2hyb25vdXMgcGFydCBvZiB0aGUgY29tbWl0LiAgQXQgdGhpcyBwb2ludAogICogbm90aGluZyBjYW4gZmFpbCBzaG9ydCBvZiBhcm1hZ2VkZG9uLgogICovCi1zdGF0aWMgdm9pZCBjb21wbGV0ZV9jb21taXQoc3RydWN0IG1zbV9jb21taXQgKmMsIGJvb2wgYXN5bmMpCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9jb21taXQoc3RydWN0IG1zbV9jb21taXQgKmMpCiB7CiAJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlID0gYy0+c3RhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHN0YXRlLT5kZXY7CkBAIC00NDUsOSArNDI4LDc0IEBACiAJY29tbWl0X2Rlc3Ryb3koYyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbW1pdF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgX21zbV9kcm1fY29tbWl0X3dvcmtfY2Ioc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKIHsKLQljb21wbGV0ZV9jb21taXQoY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtc21fY29tbWl0LCB3b3JrKSwgdHJ1ZSk7CisJc3RydWN0IG1zbV9jb21taXQgKmNvbW1pdCA9ICBOVUxMOworCisJaWYgKCF3b3JrKSB7CisJCURSTV9FUlJPUigiJXM6IEludmFsaWQgY29tbWl0IHdvcmsgZGF0YSFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNvbW1pdCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtX2NvbW1pdCwgY29tbWl0X3dvcmspOworCisJY29tcGxldGVfY29tbWl0KGNvbW1pdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2NvbW1pdCAqY29tbWl0X2luaXQoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBtc21fY29tbWl0ICpjID0ga3phbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghYykKKwkJcmV0dXJuIE5VTEw7CisKKwljLT5kZXYgPSBzdGF0ZS0+ZGV2OworCWMtPnN0YXRlID0gc3RhdGU7CisKKwlrdGhyZWFkX2luaXRfd29yaygmYy0+Y29tbWl0X3dvcmssIF9tc21fZHJtX2NvbW1pdF93b3JrX2NiKTsKKworCXJldHVybiBjOworfQorCisvKiBTdGFydCBkaXNwbGF5IHRocmVhZCBmdW5jdGlvbiAqLworc3RhdGljIGludCBtc21fYXRvbWljX2NvbW1pdF9kaXNwYXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUsIHN0cnVjdCBtc21fY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUgPSBOVUxMOworCWludCByZXQgPSAtRUlOVkFMLCBpID0gMCwgaiA9IDA7CisKKwlmb3JfZWFjaF9jcnRjX2luX3N0YXRlKHN0YXRlLCBjcnRjLCBjcnRjX3N0YXRlLCBpKSB7CisJCWZvciAoaiA9IDA7IGogPCBwcml2LT5udW1fY3J0Y3M7IGorKykgeworCQkJaWYgKHByaXYtPmRpc3BfdGhyZWFkW2pdLmNydGNfaWQgPT0KKwkJCQkJCWNydGMtPmJhc2UuaWQpIHsKKwkJCQlpZiAocHJpdi0+ZGlzcF90aHJlYWRbal0udGhyZWFkKSB7CisJCQkJCWt0aHJlYWRfcXVldWVfd29yaygKKwkJCQkJCSZwcml2LT5kaXNwX3RocmVhZFtqXS53b3JrZXIsCisJCQkJCQkJJmNvbW1pdC0+Y29tbWl0X3dvcmspOworCQkJCQkvKiBvbmx5IHJldHVybiB6ZXJvIGlmIHdvcmsgaXMKKwkJCQkJICogcXVldWVkIHN1Y2Nlc3NmdWxseS4KKwkJCQkJICovCisJCQkJCXJldCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJRFJNX0VSUk9SKCIgRXJyb3IgZm9yIGNydGNfaWQ6ICVkXG4iLAorCQkJCQkJcHJpdi0+ZGlzcF90aHJlYWRbal0uY3J0Y19pZCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVyZSB0aGVyZSB3aWxsIGJlIG1vcmUgdGhhbgorCQkgKiBvbmUgY3J0YyBwZXIgY29tbWl0IGN5Y2xlLiBSZW1vdmUgdGhpcyBjaGVjayB0aGVuLgorCQkgKiBDdXJyZW50IGFzc3VtcHRpb24gaXMgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZSBjcnRjCisJCSAqIHBlciBjb21taXQgY3ljbGUuCisJCSAqLworCQlpZiAoaiA8IHByaXYtPm51bV9jcnRjcykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNTQ2LDExICs1OTQsMTcgQEAKIAkgKi8KIAogCWlmIChub25ibG9jaykgewotCQlxdWV1ZV93b3JrKHByaXYtPmF0b21pY193cSwgJmMtPndvcmspOworCQlyZXQgPSBtc21fYXRvbWljX2NvbW1pdF9kaXNwYXRjaChkZXYsIHN0YXRlLCBjKTsKKwkJaWYgKHJldCkgeworCQkJRFJNX0VSUk9SKCIlczogYXRvbWljIGNvbW1pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWRybV9hdG9taWNfc3RhdGVfZnJlZShzdGF0ZSk7CisJCQljb21taXRfZGVzdHJveShjKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCi0JY29tcGxldGVfY29tbWl0KGMsIGZhbHNlKTsKKwljb21wbGV0ZV9jb21taXQoYyk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuYwppbmRleCA1MGQzNGQxNi4uMmI0MTc1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWJvb2wgZW5hYmxlOwogfTsKIAotc3RhdGljIHZvaWQgdmJsYW5rX2N0cmxfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHZibGFua19jdHJsX3dvcmtlcihzdHJ1Y3Qga3RocmVhZF93b3JrICp3b3JrKQogewogCXN0cnVjdCBtc21fdmJsYW5rX2N0cmwgKnZibF9jdHJsID0gY29udGFpbmVyX29mKHdvcmssCiAJCQkJCQlzdHJ1Y3QgbXNtX3ZibGFua19jdHJsLCB3b3JrKTsKQEAgLTIxNiw3ICsyMTYsNyBAQAogCWxpc3RfYWRkX3RhaWwoJnZibF9ldi0+bm9kZSwgJnZibF9jdHJsLT5ldmVudF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2YmxfY3RybC0+bG9jaywgZmxhZ3MpOwogCi0JcXVldWVfd29yayhwcml2LT53cSwgJnZibF9jdHJsLT53b3JrKTsKKwlrdGhyZWFkX3F1ZXVlX3dvcmsoJnByaXYtPmRpc3BfdGhyZWFkW2NydGNfaWRdLndvcmtlciwgJnZibF9jdHJsLT53b3JrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjMwLDE3ICsyMzAsMjcgQEAKIAlzdHJ1Y3QgbXNtX2dwdSAqZ3B1ID0gcHJpdi0+Z3B1OwogCXN0cnVjdCBtc21fdmJsYW5rX2N0cmwgKnZibF9jdHJsID0gJnByaXYtPnZibGFua19jdHJsOwogCXN0cnVjdCB2YmxhbmtfZXZlbnQgKnZibF9ldiwgKnRtcDsKKwlpbnQgaTsKIAogCS8qIFdlIG11c3QgY2FuY2VsIGFuZCBjbGVhbnVwIGFueSBwZW5kaW5nIHZibGFuayBlbmFibGUvZGlzYWJsZQogCSAqIHdvcmsgYmVmb3JlIGRybV9pcnFfdW5pbnN0YWxsKCkgdG8gYXZvaWQgd29yayByZS1lbmFibGluZyBhbgogCSAqIGlycSBhZnRlciB1bmluc3RhbGwgaGFzIGRpc2FibGVkIGl0LgogCSAqLwotCWNhbmNlbF93b3JrX3N5bmMoJnZibF9jdHJsLT53b3JrKTsKKwlrdGhyZWFkX2ZsdXNoX3dvcmsoJnZibF9jdHJsLT53b3JrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmJsX2V2LCB0bXAsICZ2YmxfY3RybC0+ZXZlbnRfbGlzdCwgbm9kZSkgewogCQlsaXN0X2RlbCgmdmJsX2V2LT5ub2RlKTsKIAkJa2ZyZWUodmJsX2V2KTsKIAl9CiAKKwkvKiBjbGVhbiB1cCBkaXNwbGF5IGNvbW1pdCB3b3JrZXIgdGhyZWFkcyAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fY3J0Y3M7IGkrKykgeworCQlpZiAocHJpdi0+ZGlzcF90aHJlYWRbaV0udGhyZWFkKSB7CisJCQlrdGhyZWFkX2ZsdXNoX3dvcmtlcigmcHJpdi0+ZGlzcF90aHJlYWRbaV0ud29ya2VyKTsKKwkJCWt0aHJlYWRfc3RvcChwcml2LT5kaXNwX3RocmVhZFtpXS50aHJlYWQpOworCQkJcHJpdi0+ZGlzcF90aHJlYWRbaV0udGhyZWFkID0gTlVMTDsKKwkJfQorCX0KKwogCW1zbV9nZW1fc2hyaW5rZXJfY2xlYW51cChkZGV2KTsKIAogCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZGV2KTsKQEAgLTI2Myw5ICsyNzMsNiBAQAogCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53cSk7CiAJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d3EpOwogCi0JZmx1c2hfd29ya3F1ZXVlKHByaXYtPmF0b21pY193cSk7Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+YXRvbWljX3dxKTsKLQogCWlmIChrbXMgJiYga21zLT5mdW5jcykKIAkJa21zLT5mdW5jcy0+ZGVzdHJveShrbXMpOwogCkBAIC00MzIsNyArNDM5LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGRldjsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBtc21fa21zICprbXM7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOwogCiAJZGRldiA9IGRybV9kZXZfYWxsb2MoZHJ2LCBkZXYpOwogCWlmICghZGRldikgewpAQCAtNDYyLDEzICs0NjksMTIgQEAKIAkJZ290byBtZHNzX2luaXRfZmFpbDsKIAogCXByaXYtPndxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoIm1zbV9kcm0iLCAwKTsKLQlwcml2LT5hdG9taWNfd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgibXNtOmF0b21pYyIsIDApOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPnBlbmRpbmdfY3J0Y3NfZXZlbnQpOwogCiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmNsaWVudF9ldmVudF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+aW5hY3RpdmVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnZibGFua19jdHJsLmV2ZW50X2xpc3QpOwotCUlOSVRfV09SSygmcHJpdi0+dmJsYW5rX2N0cmwud29yaywgdmJsYW5rX2N0cmxfd29ya2VyKTsKKwlrdGhyZWFkX2luaXRfd29yaygmcHJpdi0+dmJsYW5rX2N0cmwud29yaywgdmJsYW5rX2N0cmxfd29ya2VyKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dmJsYW5rX2N0cmwubG9jayk7CiAKIAlyZXQgPSBzZGVfcG93ZXJfcmVzb3VyY2VfaW5pdChwZGV2LCAmcHJpdi0+cGhhbmRsZSk7CkBAIC01MjksNiArNTM1LDI4IEBACiAJcHJpdi0+a21zID0ga21zOwogCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CiAKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX2NydGNzOyBpKyspIHsKKwkJcHJpdi0+ZGlzcF90aHJlYWRbaV0uY3J0Y19pZCA9IHByaXYtPmNydGNzW2ldLT5iYXNlLmlkOworCQlrdGhyZWFkX2luaXRfd29ya2VyKCZwcml2LT5kaXNwX3RocmVhZFtpXS53b3JrZXIpOworCQlwcml2LT5kaXNwX3RocmVhZFtpXS5kZXYgPSBkZGV2OworCQlwcml2LT5kaXNwX3RocmVhZFtpXS50aHJlYWQgPQorCQkJa3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCisJCQkJJnByaXYtPmRpc3BfdGhyZWFkW2ldLndvcmtlciwKKwkJCQkiY3J0Y19jb21taXQ6JWQiLAorCQkJCXByaXYtPmRpc3BfdGhyZWFkW2ldLmNydGNfaWQpOworCisJCWlmIChJU19FUlIocHJpdi0+ZGlzcF90aHJlYWRbaV0udGhyZWFkKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIGt0aHJlYWRcbiIpOworCQkJcHJpdi0+ZGlzcF90aHJlYWRbaV0udGhyZWFkID0gTlVMTDsKKwkJCS8qIGNsZWFuIHVwIHByZXZpb3VzbHkgY3JlYXRlZCB0aHJlYWRzIGlmIGFueSAqLworCQkJZm9yIChpIC09IDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJa3RocmVhZF9zdG9wKHByaXYtPmRpc3BfdGhyZWFkW2ldLnRocmVhZCk7CisJCQkJcHJpdi0+ZGlzcF90aHJlYWRbaV0udGhyZWFkID0gTlVMTDsKKwkJCX0KKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwogCWlmIChrbXMpIHsKIAkJcmV0ID0ga21zLT5mdW5jcy0+aHdfaW5pdChrbXMpOwogCQlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGU2ZmRlYjkuLjA2ZTliNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2RlX2lvX3V0aWwuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+CkBAIC0xNTQsNyArMTU1LDcgQEAKIH07CiAKIHN0cnVjdCBtc21fdmJsYW5rX2N0cmwgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBrdGhyZWFkX3dvcmsgd29yazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X2xpc3Q7CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKQEAgLTIzNSw2ICsyMzYsMTQgQEAKIAl1OCBkYXRhW107CiB9OwogCisvKiBDb21taXQgdGhyZWFkIHNwZWNpZmljIHN0cnVjdHVyZSAqLworc3RydWN0IG1zbV9kcm1fY29tbWl0IHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXVuc2lnbmVkIGludCBjcnRjX2lkOworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciB3b3JrZXI7Cit9OworCiBzdHJ1Y3QgbXNtX2RybV9wcml2YXRlIHsKIAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CkBAIC0yNzcsNyArMjg2LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGluYWN0aXZlX2xpc3Q7CiAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0b21pY193cTsKIAogCS8qIGNydGNzIHBlbmRpbmcgYXN5bmMgYXRvbWljIHVwZGF0ZXM6ICovCiAJdWludDMyX3QgcGVuZGluZ19jcnRjczsKQEAgLTI5Myw2ICszMDEsOCBAQAogCXVuc2lnbmVkIGludCBudW1fY3J0Y3M7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjc1tNQVhfQ1JUQ1NdOwogCisJc3RydWN0IG1zbV9kcm1fY29tbWl0IGRpc3BfdGhyZWFkW01BWF9DUlRDU107CisKIAl1bnNpZ25lZCBpbnQgbnVtX2VuY29kZXJzOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcnNbTUFYX0VOQ09ERVJTXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5cy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5cy5oCmluZGV4IGE1MmUzOTUuLjdhMTFkYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzLmgKQEAgLTIzNiw2ICsyMzYsOCBAQAogICoJCQlGb3IgQ01EIGVuY29kZXJzLCBWQkxBTksgaXMgZHJpdmVuIGJ5IHRoZSBQUCBSRCBEb25lIElSUQogICogQHBwX3R4X2RvbmVfaXJxX2lkeDoJSVJRIHNpZ25pZnlpbmcgZnJhbWUgdHJhbnNtaXNzaW9uIHRvIHBhbmVsIGNvbXBsZXRlCiAgKiBAaXJxX2NiOglpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqIEBzZXJpYWxpemVfd2FpdDRwcDogc2VyaWFsaXplIHdhaXQ0cHAgZmVhdHVyZSB3YWl0cyBmb3IgcHBfZG9uZSBpbnRlcnJ1cHQKKyAqICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgY3RsX3N0YXJ0IGluc3RlYWQgb2YgYmVmb3JlIG5leHQgZnJhbWUga2lja29mZgogICovCiBzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5c19jbWQgewogCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzIGJhc2U7CkBAIC0yNDMsNiArMjQ1LDcgQEAKIAlpbnQgc3RyZWFtX3NlbDsKIAlpbnQgaXJxX2lkeFtJTlRSX0lEWF9NQVhdOwogCXN0cnVjdCBzZGVfaXJxX2NhbGxiYWNrIGlycV9jYltJTlRSX0lEWF9NQVhdOworCWJvb2wgc2VyaWFsaXplX3dhaXQ0cHA7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfY21kLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzX2NtZC5jCmluZGV4IDZlNTdjN2QuLjViOGVlNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfY21kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5c19jbWQuYwpAQCAtNTkxLDE4ICs1OTEsNiBAQAogCWh3X3Jlcy0+aW50ZnNbY21kX2VuYy0+aW50Zl9pZHggLSBJTlRGXzBdID0gSU5URl9NT0RFX0NNRDsKIH0KIAotc3RhdGljIGludCBzZGVfZW5jb2Rlcl9waHlzX2NtZF93YWl0X2Zvcl9jb21taXRfZG9uZSgKLQkJc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXNfZW5jKQotewotCS8qCi0JICogU2luY2UgY3RsX3N0YXJ0ICJjb21taXRzIiB0aGUgdHJhbnNhY3Rpb24gdG8gaGFyZHdhcmUsIGFuZCB0aGUKLQkgKiB0ZWFyY2hlY2sgYmxvY2sgdGFrZXMgaXQgZnJvbSB0aGVyZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEKLQkgKiBzZXBhcmF0ZSB3YWl0IGZvciBjb21taXR0ZWQsIGEgbGEgd2FpdC1mb3ItdnN5bmMgaW4gdmlkZW8gbW9kZQotCSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX3BoeXNfY21kX3ByZXBhcmVfZm9yX2tpY2tvZmYoCiAJCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYykKIHsKQEAgLTYzMSw2ICs2MTksMjYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgc2RlX2VuY29kZXJfcGh5c19jbWRfd2FpdF9mb3JfY29tbWl0X2RvbmUoCisJCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYykKK3sKKwlzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5c19jbWQgKmNtZF9lbmMgPQorCQkJdG9fc2RlX2VuY29kZXJfcGh5c19jbWQocGh5c19lbmMpOworCisJaWYgKGNtZF9lbmMtPnNlcmlhbGl6ZV93YWl0NHBwKQorCQlzZGVfZW5jb2Rlcl9waHlzX2NtZF9wcmVwYXJlX2Zvcl9raWNrb2ZmKHBoeXNfZW5jKTsKKworCS8qCisJICogZm9sbG93aW5nIHN0YXRlbWVudCBpcyB0cnVlIHNlcmlhbGl6ZV93YWl0NHBwIGlzIGZhbHNlLgorCSAqCisJICogU2luY2UgY3RsX3N0YXJ0ICJjb21taXRzIiB0aGUgdHJhbnNhY3Rpb24gdG8gaGFyZHdhcmUsIGFuZCB0aGUKKwkgKiB0ZWFyY2hlY2sgYmxvY2sgdGFrZXMgaXQgZnJvbSB0aGVyZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEKKwkgKiBzZXBhcmF0ZSB3YWl0IGZvciBjb21taXR0ZWQsIGEgbGEgd2FpdC1mb3ItdnN5bmMgaW4gdmlkZW8gbW9kZQorCSAqLworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX3BoeXNfY21kX2luaXRfb3BzKAogCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5c19vcHMgKm9wcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2F0YWxvZy5jCmluZGV4IDdhZWNlYzAuLjUzMzE0N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NhdGFsb2cuYwpAQCAtMjI3LDYgKzIyNywxMyBAQAogCVZCSUZfUFJPUF9NQVgsCiB9OwogCitlbnVtIHsKKwlSRUdfRE1BX09GRiwKKwlSRUdfRE1BX1ZFUlNJT04sCisJUkVHX0RNQV9UUklHR0VSX09GRiwKKwlSRUdfRE1BX1BST1BfTUFYCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZHRzIHByb3BlcnR5IGRlZmluaXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDA2LDYgKzQxMywxNiBAQAogCQlQUk9QX1RZUEVfVTMyX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2RlX3Byb3BfdHlwZSByZWdfZG1hX3Byb3BbUkVHX0RNQV9QUk9QX01BWF0gPSB7CisJW1JFR19ETUFfT0ZGXSA9ICB7UkVHX0RNQV9PRkYsICJxY29tLHNkZS1yZWctZG1hLW9mZiIsIGZhbHNlLAorCQlQUk9QX1RZUEVfVTMyfSwKKwlbUkVHX0RNQV9WRVJTSU9OXSA9IHtSRUdfRE1BX1ZFUlNJT04sICJxY29tLHNkZS1yZWctZG1hLXZlcnNpb24iLAorCQlmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCisJW1JFR19ETUFfVFJJR0dFUl9PRkZdID0ge1JFR19ETUFfVFJJR0dFUl9PRkYsCisJCSJxY29tLHNkZS1yZWctZG1hLXRyaWdnZXItb2ZmIiwgZmFsc2UsCisJCVBST1BfVFlQRV9VMzJ9LAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHN0YXRpYyBBUEkgbGlzdAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xODgwLDYgKzE4OTcsMzkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgc2RlX3BhcnNlX3JlZ19kbWFfZHQoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJc3RydWN0IHNkZV9tZHNzX2NmZyAqc2RlX2NmZykKK3sKKwl1MzIgdmFsOworCWludCByYyA9IDA7CisJaW50IGkgPSAwOworCisJc2RlX2NmZy0+cmVnX2RtYV9jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJFR19ETUFfUFJPUF9NQVg7IGkrKykgeworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCByZWdfZG1hX3Byb3BbaV0ucHJvcF9uYW1lLAorCQkJCSZ2YWwpOworCQlpZiAocmMpCisJCQlicmVhazsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgUkVHX0RNQV9PRkY6CisJCQlzZGVfY2ZnLT5kbWFfY2ZnLmJhc2UgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfRE1BX1ZFUlNJT046CisJCQlzZGVfY2ZnLT5kbWFfY2ZnLnZlcnNpb24gPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfRE1BX1RSSUdHRVJfT0ZGOgorCQkJc2RlX2NmZy0+ZG1hX2NmZy50cmlnZ2VyX3NlbF9vZmYgPSB2YWw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghcmMgJiYgaSA9PSBSRUdfRE1BX1BST1BfTUFYKQorCQlzZGVfY2ZnLT5yZWdfZG1hX2NvdW50ID0gMTsKKwkvKiByZWcgZG1hIGlzIG9wdGlvbmFsIGZlYXR1cmUgaGVuY2UgcmV0dXJuIDAgKi8KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc2RlX2hhcmR3YXJlX2NhcHMoc3RydWN0IHNkZV9tZHNzX2NmZyAqc2RlX2NmZywgdWludDMyX3QgaHdfcmV2KQogewogCXN3aXRjaCAoaHdfcmV2KSB7CkBAIC0xOTgxLDYgKzIwMzEsMTAgQEAKIAlpZiAocmMpCiAJCWdvdG8gZW5kOwogCisJcmMgPSBzZGVfcGFyc2VfcmVnX2RtYV9kdChucCwgc2RlX2NmZyk7CisJaWYgKHJjKQorCQlnb3RvIGVuZDsKKwogCXNkZV9oYXJkd2FyZV9jYXBzKHNkZV9jZmcsIGh3X3Jldik7CiAKIAlyZXR1cm4gc2RlX2NmZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2F0YWxvZy5oCmluZGV4IDQ0MzY1YjUuLmVmNjlhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NhdGFsb2cuaApAQCAtNTk5LDYgKzU5OSwxOSBAQAogCXN0cnVjdCBzZGVfdmJpZl9keW5hbWljX290X3RibCBkeW5hbWljX290X3JkX3RibDsKIAlzdHJ1Y3Qgc2RlX3ZiaWZfZHluYW1pY19vdF90YmwgZHluYW1pY19vdF93cl90Ymw7CiB9OworLyoqCisgKiBzdHJ1Y3Qgc2RlX3JlZ19kbWFfY2ZnIC0gaW5mb3JtYXRpb24gb2YgbHV0IGRtYSBibG9ja3MKKyAqIEBpZCAgICAgICAgICAgICAgICAgZW51bSBpZGVudGlmeWluZyB0aGlzIGJsb2NrCisgKiBAYmFzZSAgICAgICAgICAgICAgIHJlZ2lzdGVyIG9mZnNldCBvZiB0aGlzIGJsb2NrCisgKiBAZmVhdHVyZXMgICAgICAgICAgIGJpdCBtYXNrIGlkZW50aWZ5aW5nIHN1Yi1ibG9ja3MvZmVhdHVyZXMKKyAqIEB2ZXJzaW9uICAgICAgICAgICAgdmVyc2lvbiBvZiBsdXRkbWEgaHcgYmxvY2sKKyAqIEB0cmlnZ2VyX3NlbF9vZmYgICAgb2Zmc2V0IHRvIHRyaWdnZXIgc2VsZWN0IHJlZ2lzdGVycyBvZiBsdXRkbWEKKyAqLworc3RydWN0IHNkZV9yZWdfZG1hX2NmZyB7CisJU0RFX0hXX0JMS19JTkZPOworCXUzMiB2ZXJzaW9uOworCXUzMiB0cmlnZ2VyX3NlbF9vZmY7Cit9OwogCiAvKioKICAqIHN0cnVjdCBzZGVfbWRzc19jZmcgLSBpbmZvcm1hdGlvbiBvZiBNRFNTIEhXCkBAIC02NjMsNiArNjc2LDkgQEAKIAogCXUzMiB2YmlmX2NvdW50OwogCXN0cnVjdCBzZGVfdmJpZl9jZmcgdmJpZltNQVhfQkxPQ0tTXTsKKworCXUzMiByZWdfZG1hX2NvdW50OworCXN0cnVjdCBzZGVfcmVnX2RtYV9jZmcgZG1hX2NmZzsKIAkvKiBBZGQgYWRkaXRpb25hbCBibG9jayBkYXRhIHN0cnVjdHVyZXMgaGVyZSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3NzcHAuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19zc3BwLmgKaW5kZXggMDhkYzVkMy4uZDcxMDFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3NzcHAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfc3NwcC5oCkBAIC02NCw2ICs2NCwxOCBAQAogCVNERV9TQ0FMRV9GSUxURVJfTUFYCiB9OwogCitlbnVtIHNkZV9od19maWx0ZXJfYWxwYSB7CisJU0RFX1NDQUxFX0FMUEhBX1BJWEVMX1JFUCwKKwlTREVfU0NBTEVfQUxQSEFfQklMCit9OworCitlbnVtIHNkZV9od19maWx0ZXJfeXV2IHsKKwlTREVfU0NBTEVfMkRfNFg0LAorCVNERV9TQ0FMRV8yRF9DSVIsCisJU0RFX1NDQUxFXzFEX1NFUCwKKwlTREVfU0NBTEVfQklMCit9OworCiBzdHJ1Y3Qgc2RlX2h3X3NoYXJwX2NmZyB7CiAJdTMyIHN0cmVuZ3RoOwogCXUzMiBlZGdlX3RocjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3BsYW5lLmMKaW5kZXggY2YyNGZjYi4uNzQ2YzE5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3BsYW5lLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3BsYW5lLmMKQEAgLTYwLDYgKzYwLDkgQEAKICNkZWZpbmUgU0RFX1BMQU5FX0RJUlRZX1NIQVJQRU4JMHg0CiAjZGVmaW5lIFNERV9QTEFORV9ESVJUWV9BTEwJMHhGRkZGRkZGRgogCisjZGVmaW5lIFNERV9RU0VFRDNfREVGQVVMVF9QUkVMT0FEX0ggMHg0CisjZGVmaW5lIFNERV9RU0VFRDNfREVGQVVMVF9QUkVMT0FEX1YgMHgzCisKIC8qKgogICogZW51bSBzZGVfcGxhbmVfcW9zIC0gRGlmZmVyZW50IHFvcyBjb25maWd1cmF0aW9ucyBmb3IgZWFjaCBwaXBlCiAgKgpAQCAtNjE1LDYgKzYxOCw3MyBAQAogCQljb25zdCBzdHJ1Y3Qgc2RlX2Zvcm1hdCAqZm10LAogCQl1aW50MzJfdCBjaHJvbWFfc3Vic21wbF9oLCB1aW50MzJfdCBjaHJvbWFfc3Vic21wbF92KQogeworCXVpbnQzMl90IGRlY2ltYXRlZCwgaTsKKworCWlmICghcHNkZSB8fCAhc2NhbGVfY2ZnIHx8ICFmbXQgfHwgIWNocm9tYV9zdWJzbXBsX2ggfHwKKwkJCSFjaHJvbWFfc3Vic21wbF92KSB7CisJCVNERV9FUlJPUigicHNkZSAlcEsgc2NhbGVfY2ZnICVwSyBmbXQgJXBLIHNtcF9oICVkIHNtcF92ICVkXG4iCisJCQksIHBzZGUsIHNjYWxlX2NmZywgZm10LCBjaHJvbWFfc3Vic21wbF9oLAorCQkJY2hyb21hX3N1YnNtcGxfdik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoc2NhbGVfY2ZnLCAwLCBzaXplb2YoKnNjYWxlX2NmZykpOworCisJZGVjaW1hdGVkID0gREVDSU1BVEVEX0RJTUVOU0lPTihzcmNfdywKKwkJCXBzZGUtPnBpcGVfY2ZnLmhvcnpfZGVjaW1hdGlvbik7CisJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3hbU0RFX1NTUFBfQ09NUF8wXSA9CisJCW11bHRfZnJhYygoMSA8PCBQSEFTRV9TVEVQX1NISUZUKSwgZGVjaW1hdGVkLCBkc3Rfdyk7CisJZGVjaW1hdGVkID0gREVDSU1BVEVEX0RJTUVOU0lPTihzcmNfaCwKKwkJCXBzZGUtPnBpcGVfY2ZnLnZlcnRfZGVjaW1hdGlvbik7CisJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3lbU0RFX1NTUFBfQ09NUF8wXSA9CisJCW11bHRfZnJhYygoMSA8PCBQSEFTRV9TVEVQX1NISUZUKSwgZGVjaW1hdGVkLCBkc3RfaCk7CisKKworCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF95W1NERV9TU1BQX0NPTVBfMV8yXSA9CisJCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF95W1NERV9TU1BQX0NPTVBfMF0gLyBjaHJvbWFfc3Vic21wbF92OworCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF94W1NERV9TU1BQX0NPTVBfMV8yXSA9CisJCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF94W1NERV9TU1BQX0NPTVBfMF0gLyBjaHJvbWFfc3Vic21wbF9oOworCisJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3hbU0RFX1NTUFBfQ09NUF8yXSA9CisJCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF94W1NERV9TU1BQX0NPTVBfMV8yXTsKKwlzY2FsZV9jZmctPnBoYXNlX3N0ZXBfeVtTREVfU1NQUF9DT01QXzJdID0KKwkJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3lbU0RFX1NTUFBfQ09NUF8xXzJdOworCisJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3hbU0RFX1NTUFBfQ09NUF8zXSA9CisJCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF94W1NERV9TU1BQX0NPTVBfMF07CisJc2NhbGVfY2ZnLT5waGFzZV9zdGVwX3lbU0RFX1NTUFBfQ09NUF8zXSA9CisJCXNjYWxlX2NmZy0+cGhhc2Vfc3RlcF95W1NERV9TU1BQX0NPTVBfMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgU0RFX01BWF9QTEFORVM7IGkrKykgeworCQlzY2FsZV9jZmctPnNyY193aWR0aFtpXSA9IERFQ0lNQVRFRF9ESU1FTlNJT04oc3JjX3csCisJCQkJcHNkZS0+cGlwZV9jZmcuaG9yel9kZWNpbWF0aW9uKTsKKwkJc2NhbGVfY2ZnLT5zcmNfaGVpZ2h0W2ldID0gREVDSU1BVEVEX0RJTUVOU0lPTihzcmNfaCwKKwkJCQlwc2RlLT5waXBlX2NmZy52ZXJ0X2RlY2ltYXRpb24pOworCQlpZiAoU0RFX0ZPUk1BVF9JU19ZVVYoZm10KSkKKwkJCXNjYWxlX2NmZy0+c3JjX3dpZHRoW2ldICY9IH4weDE7CisJCWlmIChpID09IFNERV9TU1BQX0NPTVBfMV8yIHx8IGkgPT0gU0RFX1NTUFBfQ09NUF8yKSB7CisJCQlzY2FsZV9jZmctPnNyY193aWR0aFtpXSAvPSBjaHJvbWFfc3Vic21wbF9oOworCQkJc2NhbGVfY2ZnLT5zcmNfaGVpZ2h0W2ldIC89IGNocm9tYV9zdWJzbXBsX3Y7CisJCX0KKwkJc2NhbGVfY2ZnLT5wcmVsb2FkX3hbaV0gPSBTREVfUVNFRUQzX0RFRkFVTFRfUFJFTE9BRF9IOworCQlzY2FsZV9jZmctPnByZWxvYWRfeVtpXSA9IFNERV9RU0VFRDNfREVGQVVMVF9QUkVMT0FEX1Y7CisJCXBzZGUtPnBpeGVsX2V4dC5udW1fZXh0X3B4bHNfdG9wW2ldID0KKwkJCXNjYWxlX2NmZy0+c3JjX2hlaWdodFtpXTsKKwkJcHNkZS0+cGl4ZWxfZXh0Lm51bV9leHRfcHhsc19sZWZ0W2ldID0KKwkJCXNjYWxlX2NmZy0+c3JjX3dpZHRoW2ldOworCX0KKwlpZiAoIShTREVfRk9STUFUX0lTX1lVVihmbXQpKSAmJiAoc3JjX2ggPT0gZHN0X2gpCisJCSYmIChzcmNfdyA9PSBkc3RfdykpCisJCXJldHVybjsKKworCXNjYWxlX2NmZy0+ZHN0X3dpZHRoID0gZHN0X3c7CisJc2NhbGVfY2ZnLT5kc3RfaGVpZ2h0ID0gZHN0X2g7CisJc2NhbGVfY2ZnLT55X3JnYl9maWx0ZXJfY2ZnID0gU0RFX1NDQUxFX0JJTDsKKwlzY2FsZV9jZmctPnV2X2ZpbHRlcl9jZmcgPSBTREVfU0NBTEVfQklMOworCXNjYWxlX2NmZy0+YWxwaGFfZmlsdGVyX2NmZyA9IFNERV9TQ0FMRV9BTFBIQV9CSUw7CisJc2NhbGVfY2ZnLT5sdXRfZmxhZyA9IDA7CisJc2NhbGVfY2ZnLT5ibGVuZF9jZmcgPSAxOworCXNjYWxlX2NmZy0+ZW5hYmxlID0gMTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCmluZGV4IGM0MjJmMTcuLjMwY2I2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCkBAIC0xLDQgKzEsNCBAQAotLyoKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQoQykgMjAxNiBMaW5hcm8gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIEF1dGhvcjogTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4KICAqCkBAIC0yMCwxMiArMjAsNDA3IEBACiAjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKICNpbmNsdWRlICJjb3Jlc2lnaHQtdG1jLmgiCiAKLXN0YXRpYyB2b2lkIHRtY19ldHJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3N0YXRpYyB2b2lkIHRtY19ldHJfc2dfdGJsX2ZyZWUodWludDMyX3QgKnZhZGRyLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBlbnRzKQoreworCXVpbnQzMl90IGkgPSAwLCBwdGVfbiA9IDAsIGxhc3RfcHRlOworCXVpbnQzMl90ICp2aXJ0X3N0X3RibCwgKnZpcnRfcHRlOworCXZvaWQgKnZpcnRfYmxrOworCXBoeXNfYWRkcl90IHBoeXNfcHRlOworCWludCB0b3RhbF9lbnRzID0gRElWX1JPVU5EX1VQKHNpemUsIFBBR0VfU0laRSk7CisJaW50IGVudHNfcGVyX2JsayA9IFBBR0VfU0laRS9zaXplb2YodWludDMyX3QpOworCisJdmlydF9zdF90YmwgPSB2YWRkcjsKKworCXdoaWxlIChpIDwgdG90YWxfZW50cykgeworCQlsYXN0X3B0ZSA9ICgoaSArIGVudHNfcGVyX2JsaykgPiB0b3RhbF9lbnRzKSA/CisJCQkgICB0b3RhbF9lbnRzIDogKGkgKyBlbnRzX3Blcl9ibGspOworCQl3aGlsZSAoaSA8IGxhc3RfcHRlKSB7CisJCQl2aXJ0X3B0ZSA9IHZpcnRfc3RfdGJsICsgcHRlX247CisKKwkJCS8qIERvIG5vdCBnbyBiZXlvbmQgbnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkICovCisJCQlpZiAoaSA9PSBlbnRzKSB7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZpcnRfc3RfdGJsKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXBoeXNfcHRlID0gVE1DX0VUUl9TR19FTlRfVE9fQkxLKCp2aXJ0X3B0ZSk7CisJCQl2aXJ0X2JsayA9IHBoeXNfdG9fdmlydChwaHlzX3B0ZSk7CisKKwkJCWlmICgobGFzdF9wdGUgLSBpKSA+IDEpIHsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdmlydF9ibGspOworCQkJCXB0ZV9uKys7CisJCQl9IGVsc2UgaWYgKGxhc3RfcHRlID09IHRvdGFsX2VudHMpIHsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdmlydF9ibGspOworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2aXJ0X3N0X3RibCk7CisJCQl9IGVsc2UgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2aXJ0X3N0X3RibCk7CisJCQkJdmlydF9zdF90YmwgPSAodWludDMyX3QgKil2aXJ0X2JsazsKKwkJCQlwdGVfbiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRtY19ldHJfc2dfdGJsX2ZsdXNoKHVpbnQzMl90ICp2YWRkciwgdWludDMyX3Qgc2l6ZSkKK3sKKwl1aW50MzJfdCBpID0gMCwgcHRlX24gPSAwLCBsYXN0X3B0ZTsKKwl1aW50MzJfdCAqdmlydF9zdF90YmwsICp2aXJ0X3B0ZTsKKwl2b2lkICp2aXJ0X2JsazsKKwlwaHlzX2FkZHJfdCBwaHlzX3B0ZTsKKwlpbnQgdG90YWxfZW50cyA9IERJVl9ST1VORF9VUChzaXplLCBQQUdFX1NJWkUpOworCWludCBlbnRzX3Blcl9ibGsgPSBQQUdFX1NJWkUvc2l6ZW9mKHVpbnQzMl90KTsKKworCXZpcnRfc3RfdGJsID0gdmFkZHI7CisJZG1hY19mbHVzaF9yYW5nZSgodm9pZCAqKXZpcnRfc3RfdGJsLCAodm9pZCAqKXZpcnRfc3RfdGJsICsgUEFHRV9TSVpFKTsKKworCXdoaWxlIChpIDwgdG90YWxfZW50cykgeworCQlsYXN0X3B0ZSA9ICgoaSArIGVudHNfcGVyX2JsaykgPiB0b3RhbF9lbnRzKSA/CisJCQkgICB0b3RhbF9lbnRzIDogKGkgKyBlbnRzX3Blcl9ibGspOworCQl3aGlsZSAoaSA8IGxhc3RfcHRlKSB7CisJCQl2aXJ0X3B0ZSA9IHZpcnRfc3RfdGJsICsgcHRlX247CisJCQlwaHlzX3B0ZSA9IFRNQ19FVFJfU0dfRU5UX1RPX0JMSygqdmlydF9wdGUpOworCQkJdmlydF9ibGsgPSBwaHlzX3RvX3ZpcnQocGh5c19wdGUpOworCisJCQlkbWFjX2ZsdXNoX3JhbmdlKHZpcnRfYmxrLCB2aXJ0X2JsayArIFBBR0VfU0laRSk7CisKKwkJCWlmICgobGFzdF9wdGUgLSBpKSA+IDEpIHsKKwkJCQlwdGVfbisrOworCQkJfSBlbHNlIGlmIChsYXN0X3B0ZSAhPSB0b3RhbF9lbnRzKSB7CisJCQkJdmlydF9zdF90YmwgPSAodWludDMyX3QgKil2aXJ0X2JsazsKKwkJCQlwdGVfbiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwl9Cit9CisKKy8qCisgKiBTY2F0dGVyIGdhdGhlciB0YWJsZSBsYXlvdXQgaW4gbWVtb3J5OgorICogMS4gVGFibGUgY29udGFpbnMgMzItYml0IGVudHJpZXMKKyAqIDIuIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIHBvaW50cyB0byA0SyBibG9jayBvZiBtZW1vcnkKKyAqIDMuIExhc3QgZW50cnkgaW4gdGhlIHRhYmxlIHBvaW50cyB0byBuZXh0IHRhYmxlCisgKiA0LiAoKikgQmFzZWQgb24gbWVtX3NpemUgcmVxdWVzdGVkLCBpZiB0aGVyZSBpcyBubyBuZWVkIGZvciBuZXh0IGxldmVsIG9mCisgKiAgICB0YWJsZSwgbGFzdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzIGRpcmVjdGx5IHRvIDRLIGJsb2NrIG9mIG1lbW9yeS4KKyAqCisgKgkgICBzZ190YmxfbnVtPTAKKyAqCXwtLS0tLS0tLS0tLS0tLS18PC0tIGRydmRhdGEtPnZhZGRyCisgKgl8ICAgYmxrX251bT0wICAgfAorICoJfC0tLS0tLS0tLS0tLS0tLXwKKyAqCXwgICBibGtfbnVtPTEgICB8CisgKgl8LS0tLS0tLS0tLS0tLS0tfAorICoJfCAgIGJsa19udW09MiAgIHwKKyAqCXwtLS0tLS0tLS0tLS0tLS18CSAgIHNnX3RibF9udW09MQorICoJfCgqKU54dCBUYmwgQWRkcnwtLS0tLS0+fC0tLS0tLS0tLS0tLS0tLXwKKyAqCXwtLS0tLS0tLS0tLS0tLS18ICAgICAgIHwgICBibGtfbnVtPTMgICB8CisgKgkJCQl8LS0tLS0tLS0tLS0tLS0tfAorICoJCQkJfCAgIGJsa19udW09NCAgIHwKKyAqCQkJCXwtLS0tLS0tLS0tLS0tLS18CisgKgkJCQl8ICAgYmxrX251bT01ICAgfAorICoJCQkJfC0tLS0tLS0tLS0tLS0tLXwJICAgc2dfdGJsX251bT0yCisgKgkJCQl8KCopTnh0IFRibCBBZGRyfC0tLS0tLT58LS0tLS0tLS0tLS0tLS0tfAorICoJCQkJfC0tLS0tLS0tLS0tLS0tLXwJfCAgIGJsa19udW09NiAgIHwKKyAqCQkJCQkJCXwtLS0tLS0tLS0tLS0tLS18CisgKgkJCQkJCQl8ICAgYmxrX251bT03ICAgfAorICoJCQkJCQkJfC0tLS0tLS0tLS0tLS0tLXwKKyAqCQkJCQkJCXwgICBibGtfbnVtPTggICB8CisgKgkJCQkJCQl8LS0tLS0tLS0tLS0tLS0tfAorICoJCQkJCQkJfCAgICAgICAgICAgICAgIHxFbmQgb2YKKyAqCQkJCQkJCXwtLS0tLS0tLS0tLS0tLS18LS0tLS0KKyAqCQkJCQkJCQkJIFRhYmxlCisgKiBGb3Igc2ltcGxpY2l0eSBhYm92ZSBkaWFncmFtIGFzc3VtZXMgZm9sbG93aW5nOgorICogYS4gbWVtX3NpemUgPSAzNktCIC0tPiB0b3RhbF9lbnRzID0gOQorICogYi4gZW50c19wZXJfYmxrID0gNAorICovCisKK3N0YXRpYyBpbnQgdG1jX2V0cl9zZ190YmxfYWxsb2Moc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQoreworCWludCByZXQ7CisJdWludDMyX3QgaSA9IDAsIGxhc3RfcHRlOworCXVpbnQzMl90ICp2aXJ0X3BnZGlyLCAqdmlydF9zdF90Ymw7CisJdm9pZCAqdmlydF9wdGU7CisJaW50IHRvdGFsX2VudHMgPSBESVZfUk9VTkRfVVAoZHJ2ZGF0YS0+c2l6ZSwgUEFHRV9TSVpFKTsKKwlpbnQgZW50c19wZXJfYmxrID0gUEFHRV9TSVpFL3NpemVvZih1aW50MzJfdCk7CisKKwl2aXJ0X3BnZGlyID0gKHVpbnQzMl90ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghdmlydF9wZ2RpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2aXJ0X3N0X3RibCA9IHZpcnRfcGdkaXI7CisKKwl3aGlsZSAoaSA8IHRvdGFsX2VudHMpIHsKKwkJbGFzdF9wdGUgPSAoKGkgKyBlbnRzX3Blcl9ibGspID4gdG90YWxfZW50cykgPworCQkJICAgdG90YWxfZW50cyA6IChpICsgZW50c19wZXJfYmxrKTsKKwkJd2hpbGUgKGkgPCBsYXN0X3B0ZSkgeworCQkJdmlydF9wdGUgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWlmICghdmlydF9wdGUpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyOworCQkJfQorCisJCQlpZiAoKGxhc3RfcHRlIC0gaSkgPiAxKSB7CisJCQkJKnZpcnRfc3RfdGJsID0KKwkJCQkgICAgIFRNQ19FVFJfU0dfRU5UKHZpcnRfdG9fcGh5cyh2aXJ0X3B0ZSkpOworCQkJCXZpcnRfc3RfdGJsKys7CisJCQl9IGVsc2UgaWYgKGxhc3RfcHRlID09IHRvdGFsX2VudHMpIHsKKwkJCQkqdmlydF9zdF90YmwgPQorCQkJCSAgICAgVE1DX0VUUl9TR19MU1RfRU5UKHZpcnRfdG9fcGh5cyh2aXJ0X3B0ZSkpOworCQkJfSBlbHNlIHsKKwkJCQkqdmlydF9zdF90YmwgPQorCQkJCSAgICAgVE1DX0VUUl9TR19OWFRfVEJMKHZpcnRfdG9fcGh5cyh2aXJ0X3B0ZSkpOworCQkJCXZpcnRfc3RfdGJsID0gKHVpbnQzMl90ICopdmlydF9wdGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwlkcnZkYXRhLT52YWRkciA9IHZpcnRfcGdkaXI7CisJZHJ2ZGF0YS0+cGFkZHIgPSB2aXJ0X3RvX3BoeXModmlydF9wZ2Rpcik7CisKKwkvKiBGbHVzaCB0aGUgZGNhY2hlIGJlZm9yZSBwcm9jZWVkaW5nICovCisJdG1jX2V0cl9zZ190YmxfZmx1c2goKHVpbnQzMl90ICopZHJ2ZGF0YS0+dmFkZHIsIGRydmRhdGEtPnNpemUpOworCisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICIlczogdGFibGUgc3RhcnRzIGF0ICUjbHgsIHRvdGFsIGVudHJpZXMgJWRcbiIsCisJCV9fZnVuY19fLCAodW5zaWduZWQgbG9uZylkcnZkYXRhLT5wYWRkciwgdG90YWxfZW50cyk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwl0bWNfZXRyX3NnX3RibF9mcmVlKHZpcnRfcGdkaXIsIGRydmRhdGEtPnNpemUsIGkpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUTUMgcmVhZCBsb2dpYyB3aGVuIHNjYXR0ZXIgZ2F0aGVyIGZlYXR1cmUgaXMgZW5hYmxlZDoKKyAqCisgKgkgICBzZ190YmxfbnVtPTAKKyAqCXwtLS0tLS0tLS0tLS0tLS18PC0tIGRydmRhdGEtPnZhZGRyCisgKgl8ICAgYmxrX251bT0wCXwKKyAqCXwgYmxrX251bV9yZWw9NQl8CisgKgl8LS0tLS0tLS0tLS0tLS0tfAorICoJfCAgIGJsa19udW09MQl8CisgKgl8IGJsa19udW1fcmVsPTYJfAorICoJfC0tLS0tLS0tLS0tLS0tLXwKKyAqCXwgICBibGtfbnVtPTIJfAorICoJfCBibGtfbnVtX3JlbD03CXwKKyAqCXwtLS0tLS0tLS0tLS0tLS18CSAgIHNnX3RibF9udW09MQorICoJfCAgTmV4dCBUYWJsZQl8LS0tLS0tPnwtLS0tLS0tLS0tLS0tLS18CisgKgl8ICBBZGRyCQl8CXwgICBibGtfbnVtPTMJfAorICoJfC0tLS0tLS0tLS0tLS0tLXwJfCBibGtfbnVtX3JlbD04CXwKKyAqCQkJCXwtLS0tLS0tLS0tLS0tLS18CisgKgkJICA0ayBCbG9jayBBZGRyCXwgICBibGtfbnVtPTQJfAorICoJCSB8LS0tLS0tLS0tLS0tLS18IGJsa19udW1fcmVsPTAJfAorICoJCSB8CQl8LS0tLS0tLS0tLS0tLS0tfAorICoJCSB8CQl8ICAgYmxrX251bT01CXwKKyAqCQkgfAkJfCBibGtfbnVtX3JlbD0xCXwKKyAqCQkgfAkJfC0tLS0tLS0tLS0tLS0tLXwJICAgc2dfdGJsX251bT0yCisgKgkgfC0tLS0tLS0tLS0tLS0tLXwgICAgICB8ICBOZXh0IFRhYmxlCXwtLS0tLS0+fC0tLS0tLS0tLS0tLS0tLXwKKyAqCSB8CQkgfAl8ICBBZGRyCQl8CXwgICBibGtfbnVtPTYJfAorICoJIHwJCSB8CXwtLS0tLS0tLS0tLS0tLS18CXwgYmxrX251bV9yZWw9MiB8CisgKgkgfCAgICByZWFkX29mZgkgfAkJCQl8LS0tLS0tLS0tLS0tLS0tfAorICoJIHwJCSB8CQkJCXwgICBibGtfbnVtPTcJfAorICoJIHwJCSB8IHBwb3MJCQkJfCBibGtfbnVtX3JlbD0zCXwKKyAqCSB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tCQkJCXwtLS0tLS0tLS0tLS0tLS18CisgKgkgfAkJIHwJCQkJfCAgIGJsa19udW09OAl8CisgKgkgfCAgICBkZWx0YV91cAkgfAkJCQl8IGJsa19udW1fcmVsPTQJfAorICoJIHwJCSB8IFJXUC9kcnZkYXRhLT5idWYJCXwtLS0tLS0tLS0tLS0tLS18CisgKgkgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLQkJfAkJfAorICoJIHwJCSB8ICAgfAkJCQl8CQl8RW5kIG9mCisgKgkgfAkJIHwgICB8CQkJCXwtLS0tLS0tLS0tLS0tLS18LS0tLS0KKyAqCSB8CQkgfCBkcnZkYXRhLT5kZWx0YV9ib3R0b20JCQkgVGFibGUKKyAqCSB8CQkgfCAgIHwKKyAqCSB8X19fX19fX19fX19fX19ffCAgX3xfCisgKgkgICAgICA0SyBCbG9jaworICoKKyAqIEZvciBzaW1wbGljaXR5IGFib3ZlIGRpYWdyYW0gYXNzdW1lcyBmb2xsb3dpbmc6CisgKiBhLiBtZW1fc2l6ZSA9IDM2S0IgLS0+IHRvdGFsX2VudHMgPSA5CisgKiBiLiBlbnRzX3Blcl9ibGsgPSA0CisgKiBjLiBSV1AgaXMgb24gNXRoIGJsb2NrIChibGtfbnVtID0gNSk7IHNvIHdlIGhhdmUgdG8gc3RhcnQgcmVhZGluZyBmcm9tIFJXUAorICogICAgcG9zaXRpb24KKyAqLworCit2b2lkIHRtY19ldHJfc2dfY29tcHV0ZV9yZWFkKHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSwgbG9mZl90ICpwcG9zLAorCQkJICAgICBjaGFyICoqYnVmcHAsIHNpemVfdCAqbGVuKQoreworCXVpbnQzMl90IGkgPSAwLCBibGtfbnVtX3JlbCA9IDAsIHJlYWRfbGVuID0gMDsKKwl1aW50MzJfdCBibGtfbnVtLCBzZ190YmxfbnVtLCBibGtfbnVtX2xvYywgcmVhZF9vZmY7CisJdWludDMyX3QgKnZpcnRfcHRlLCAqdmlydF9zdF90Ymw7CisJdm9pZCAqdmlydF9ibGs7CisJcGh5c19hZGRyX3QgcGh5c19wdGUgPSAwOworCWludCB0b3RhbF9lbnRzID0gRElWX1JPVU5EX1VQKGRydmRhdGEtPnNpemUsIFBBR0VfU0laRSk7CisJaW50IGVudHNfcGVyX2JsayA9IFBBR0VfU0laRS9zaXplb2YodWludDMyX3QpOworCisJLyoKKwkgKiBGaW5kIHJlbGF0aXZlIGJsb2NrIG51bWJlciBmcm9tIHBwb3MgYW5kIHJlYWRpbmcgb2Zmc2V0CisJICogd2l0aGluIGJsb2NrIGFuZCBmaW5kIGFjdHVhbCBibG9jayBudW1iZXIgYmFzZWQgb24gcmVsYXRpdmUKKwkgKiBibG9jayBudW1iZXIKKwkgKi8KKwlpZiAoZHJ2ZGF0YS0+YnVmID09IGRydmRhdGEtPnZhZGRyKSB7CisJCWJsa19udW0gPSAqcHBvcyAvIFBBR0VfU0laRTsKKwkJcmVhZF9vZmYgPSAqcHBvcyAlIFBBR0VfU0laRTsKKwl9IGVsc2UgeworCQlpZiAoKnBwb3MgPCBkcnZkYXRhLT5kZWx0YV9ib3R0b20pIHsKKwkJCXJlYWRfb2ZmID0gUEFHRV9TSVpFIC0gZHJ2ZGF0YS0+ZGVsdGFfYm90dG9tOworCQl9IGVsc2UgeworCQkJYmxrX251bV9yZWwgPSAoKnBwb3MgLyBQQUdFX1NJWkUpICsgMTsKKwkJCXJlYWRfb2ZmID0gKCpwcG9zIC0gZHJ2ZGF0YS0+ZGVsdGFfYm90dG9tKSAlIFBBR0VfU0laRTsKKwkJfQorCisJCWJsa19udW0gPSAoZHJ2ZGF0YS0+c2dfYmxrX251bSArIGJsa19udW1fcmVsKSAlIHRvdGFsX2VudHM7CisJfQorCisJdmlydF9zdF90YmwgPSAodWludDMyX3QgKilkcnZkYXRhLT52YWRkcjsKKworCS8qIENvbXB1dGUgdGFibGUgaW5kZXggYW5kIGJsb2NrIGVudHJ5IGluZGV4IHdpdGhpbiB0aGF0IHRhYmxlICovCisJaWYgKGJsa19udW0gJiYgKGJsa19udW0gPT0gKHRvdGFsX2VudHMgLSAxKSkgJiYKKwkJCSEoYmxrX251bSAlIChlbnRzX3Blcl9ibGsgLSAxKSkpIHsKKwkJc2dfdGJsX251bSA9IGJsa19udW0gLyBlbnRzX3Blcl9ibGs7CisJCWJsa19udW1fbG9jID0gZW50c19wZXJfYmxrIC0gMTsKKwl9IGVsc2UgeworCQlzZ190YmxfbnVtID0gYmxrX251bSAvIChlbnRzX3Blcl9ibGsgLSAxKTsKKwkJYmxrX251bV9sb2MgPSBibGtfbnVtICUgKGVudHNfcGVyX2JsayAtIDEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzZ190YmxfbnVtOyBpKyspIHsKKwkJdmlydF9wdGUgPSB2aXJ0X3N0X3RibCArIChlbnRzX3Blcl9ibGsgLSAxKTsKKwkJcGh5c19wdGUgPSBUTUNfRVRSX1NHX0VOVF9UT19CTEsoKnZpcnRfcHRlKTsKKwkJdmlydF9zdF90YmwgPSAodWludDMyX3QgKilwaHlzX3RvX3ZpcnQocGh5c19wdGUpOworCX0KKworCXZpcnRfcHRlID0gdmlydF9zdF90YmwgKyBibGtfbnVtX2xvYzsKKwlwaHlzX3B0ZSA9IFRNQ19FVFJfU0dfRU5UX1RPX0JMSygqdmlydF9wdGUpOworCXZpcnRfYmxrID0gcGh5c190b192aXJ0KHBoeXNfcHRlKTsKKworCSpidWZwcCA9IHZpcnRfYmxrICsgcmVhZF9vZmY7CisKKwlpZiAoKmxlbiA+IChQQUdFX1NJWkUgLSByZWFkX29mZikpCisJCSpsZW4gPSBQQUdFX1NJWkUgLSByZWFkX29mZjsKKworCS8qCisJICogV2hlbiBidWZmZXIgaXMgd3JhcHBlZCBhcm91bmQgYW5kIHRyeWluZyB0byByZWFkIGxhc3QgcmVsYXRpdmUKKwkgKiBibG9jayAoaS5lLiBkZWx0YV91cCksIGNvbXB1dGUgbGVuIGRpZmZlcmVudGx5CisJICovCisJaWYgKGJsa19udW1fcmVsICYmIChibGtfbnVtID09IGRydmRhdGEtPnNnX2Jsa19udW0pKSB7CisJCXJlYWRfbGVuID0gUEFHRV9TSVpFIC0gZHJ2ZGF0YS0+ZGVsdGFfYm90dG9tIC0gcmVhZF9vZmY7CisJCWlmICgqbGVuID4gcmVhZF9sZW4pCisJCQkqbGVuID0gcmVhZF9sZW47CisJfQorCisJZGV2X2RiZ19yYXRlbGltaXRlZChkcnZkYXRhLT5kZXYsCisJIiVzOiByZWFkIGF0ICVwLCBwaHlzICVwYSBsZW4gJXp1IGJsayAlZCwgcmVsIGJsayAlZCBSV1AgYmxrICVkXG4iLAorCSBfX2Z1bmNfXywgKmJ1ZnBwLCAmcGh5c19wdGUsICpsZW4sIGJsa19udW0sIGJsa19udW1fcmVsLAorCWRydmRhdGEtPnNnX2Jsa19udW0pOworfQorCitzdGF0aWMgdm9pZCB0bWNfZXRyX3NnX21lbV9yZXNldCh1aW50MzJfdCAqdmFkZHIsIHVpbnQzMl90IHNpemUpCit7CisJdWludDMyX3QgaSA9IDAsIHB0ZV9uID0gMCwgbGFzdF9wdGU7CisJdWludDMyX3QgKnZpcnRfc3RfdGJsLCAqdmlydF9wdGU7CisJdm9pZCAqdmlydF9ibGs7CisJcGh5c19hZGRyX3QgcGh5c19wdGU7CisJaW50IHRvdGFsX2VudHMgPSBESVZfUk9VTkRfVVAoc2l6ZSwgUEFHRV9TSVpFKTsKKwlpbnQgZW50c19wZXJfYmxrID0gUEFHRV9TSVpFL3NpemVvZih1aW50MzJfdCk7CisKKwl2aXJ0X3N0X3RibCA9IHZhZGRyOworCisJd2hpbGUgKGkgPCB0b3RhbF9lbnRzKSB7CisJCWxhc3RfcHRlID0gKChpICsgZW50c19wZXJfYmxrKSA+IHRvdGFsX2VudHMpID8KKwkJCSAgIHRvdGFsX2VudHMgOiAoaSArIGVudHNfcGVyX2Jsayk7CisJCXdoaWxlIChpIDwgbGFzdF9wdGUpIHsKKwkJCXZpcnRfcHRlID0gdmlydF9zdF90YmwgKyBwdGVfbjsKKwkJCXBoeXNfcHRlID0gVE1DX0VUUl9TR19FTlRfVE9fQkxLKCp2aXJ0X3B0ZSk7CisJCQl2aXJ0X2JsayA9IHBoeXNfdG9fdmlydChwaHlzX3B0ZSk7CisKKwkJCWlmICgobGFzdF9wdGUgLSBpKSA+IDEpIHsKKwkJCQltZW1zZXQodmlydF9ibGssIDAsIFBBR0VfU0laRSk7CisJCQkJcHRlX24rKzsKKwkJCX0gZWxzZSBpZiAobGFzdF9wdGUgPT0gdG90YWxfZW50cykgeworCQkJCW1lbXNldCh2aXJ0X2JsaywgMCwgUEFHRV9TSVpFKTsKKwkJCX0gZWxzZSB7CisJCQkJdmlydF9zdF90YmwgPSAodWludDMyX3QgKil2aXJ0X2JsazsKKwkJCQlwdGVfbiA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwkvKiBGbHVzaCB0aGUgZGNhY2hlIGJlZm9yZSBwcm9jZWVkaW5nICovCisJdG1jX2V0cl9zZ190YmxfZmx1c2godmFkZHIsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCB0bWNfZXRyX3NnX3J3cF9wb3Moc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhLCB1aW50MzJfdCByd3ApCit7CisJdWludDMyX3QgaSA9IDAsIHB0ZV9uID0gMCwgbGFzdF9wdGU7CisJdWludDMyX3QgKnZpcnRfc3RfdGJsLCAqdmlydF9wdGU7CisJdm9pZCAqdmlydF9ibGs7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXBoeXNfYWRkcl90IHBoeXNfcHRlOworCWludCB0b3RhbF9lbnRzID0gRElWX1JPVU5EX1VQKGRydmRhdGEtPnNpemUsIFBBR0VfU0laRSk7CisJaW50IGVudHNfcGVyX2JsayA9IFBBR0VfU0laRS9zaXplb2YodWludDMyX3QpOworCisJdmlydF9zdF90YmwgPSBkcnZkYXRhLT52YWRkcjsKKworCXdoaWxlIChpIDwgdG90YWxfZW50cykgeworCQlsYXN0X3B0ZSA9ICgoaSArIGVudHNfcGVyX2JsaykgPiB0b3RhbF9lbnRzKSA/CisJCQkgICB0b3RhbF9lbnRzIDogKGkgKyBlbnRzX3Blcl9ibGspOworCQl3aGlsZSAoaSA8IGxhc3RfcHRlKSB7CisJCQl2aXJ0X3B0ZSA9IHZpcnRfc3RfdGJsICsgcHRlX247CisJCQlwaHlzX3B0ZSA9IFRNQ19FVFJfU0dfRU5UX1RPX0JMSygqdmlydF9wdGUpOworCisJCQkvKgorCQkJICogV2hlbiB0aGUgdHJhY2UgYnVmZmVyIGlzIGZ1bGw7IFJXUCBjb3VsZCBiZSBvbiBhbnkKKwkJCSAqIDRLIGJsb2NrIGZyb20gc2NhdHRlciBnYXRoZXIgdGFibGUuIENvbXB1dGUgYmVsb3cgLQorCQkJICogMS4gQmxvY2sgbnVtYmVyIHdoZXJlIFJXUCBpcyBjdXJyZW50bHkgcmVzaWRpbmcKKwkJCSAqIDIuIFJXUCBwb3NpdGlvbiBpbiB0aGF0IDRLIGJsb2NrCisJCQkgKiAzLiBEZWx0YSBvZmZzZXQgZnJvbSBjdXJyZW50IFJXUCBwb3NpdGlvbiB0byBlbmQgb2YKKwkJCSAqICAgIGJsb2NrLgorCQkJICovCisJCQlpZiAocGh5c19wdGUgPD0gcndwICYmIHJ3cCA8IChwaHlzX3B0ZSArIFBBR0VfU0laRSkpIHsKKwkJCQl2aXJ0X2JsayA9IHBoeXNfdG9fdmlydChwaHlzX3B0ZSk7CisJCQkJZHJ2ZGF0YS0+c2dfYmxrX251bSA9IGk7CisJCQkJZHJ2ZGF0YS0+YnVmID0gdmlydF9ibGsgKyByd3AgLSBwaHlzX3B0ZTsKKwkJCQlkcnZkYXRhLT5kZWx0YV9ib3R0b20gPQorCQkJCQlwaHlzX3B0ZSArIFBBR0VfU0laRSAtIHJ3cDsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgobGFzdF9wdGUgLSBpKSA+IDEpIHsKKwkJCQlwdGVfbisrOworCQkJfSBlbHNlIGlmIChpIDwgKHRvdGFsX2VudHMgLSAxKSkgeworCQkJCXZpcnRfYmxrID0gcGh5c190b192aXJ0KHBoeXNfcHRlKTsKKwkJCQl2aXJ0X3N0X3RibCA9ICh1aW50MzJfdCAqKXZpcnRfYmxrOworCQkJCXB0ZV9uID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaSsrOworCQl9CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdG1jX2V0cl9tZW1fcmVzZXQoc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQoreworCWlmIChkcnZkYXRhLT52YWRkcikgeworCQlpZiAoZHJ2ZGF0YS0+bWVtdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykKKwkJCW1lbXNldChkcnZkYXRhLT52YWRkciwgMCwgZHJ2ZGF0YS0+c2l6ZSk7CisJCWVsc2UKKwkJCXRtY19ldHJfc2dfbWVtX3Jlc2V0KCh1aW50MzJfdCAqKWRydmRhdGEtPnZhZGRyLAorCQkJCQkgICAgIGRydmRhdGEtPnNpemUpOworCX0KK30KKwordm9pZCB0bWNfZXRyX2VuYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCiB7CiAJdTMyIGF4aWN0bDsKIAogCS8qIFplcm8gb3V0IHRoZSBtZW1vcnkgdG8gaGVscCB3aXRoIGRlYnVnICovCi0JbWVtc2V0KGRydmRhdGEtPnZhZGRyLCAwLCBkcnZkYXRhLT5zaXplKTsKKwl0bWNfZXRyX21lbV9yZXNldChkcnZkYXRhKTsKIAogCUNTX1VOTE9DSyhkcnZkYXRhLT5iYXNlKTsKIApAQCAtMzgsNyArNDMzLDEwIEBACiAJYXhpY3RsID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVE1DX0FYSUNUTCk7CiAJYXhpY3RsIHw9IFRNQ19BWElDVExfV1JfQlVSU1RfMTY7CiAJd3JpdGVsX3JlbGF4ZWQoYXhpY3RsLCBkcnZkYXRhLT5iYXNlICsgVE1DX0FYSUNUTCk7Ci0JYXhpY3RsICY9IH5UTUNfQVhJQ1RMX1NDVF9HQVRfTU9ERTsKKwlpZiAoZHJ2ZGF0YS0+bWVtdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykKKwkJYXhpY3RsICY9IH5UTUNfQVhJQ1RMX1NDVF9HQVRfTU9ERTsKKwllbHNlCisJCWF4aWN0bCB8PSBUTUNfQVhJQ1RMX1NDVF9HQVRfTU9ERTsKIAl3cml0ZWxfcmVsYXhlZChheGljdGwsIGRydmRhdGEtPmJhc2UgKyBUTUNfQVhJQ1RMKTsKIAlheGljdGwgPSAoYXhpY3RsICYKIAkJICB+KFRNQ19BWElDVExfUFJPVF9DVExfQjAgfCBUTUNfQVhJQ1RMX1BST1RfQ1RMX0IxKSkgfApAQCAtNzgsNiArNDc2LDI2IEBACiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOwogCQlkcnZkYXRhLT5sZW4gPSByd3AgLSBkcnZkYXRhLT5wYWRkcjsKIAl9CisKKwlpZiAoZHJ2ZGF0YS0+bWVtdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykgeworCQkvKiBIb3cgbXVjaCBtZW1vcnkgZG8gd2Ugc3RpbGwgaGF2ZSAqLworCQlpZiAodmFsICYgQklUKDApKQorCQkJZHJ2ZGF0YS0+YnVmID0gZHJ2ZGF0YS0+dmFkZHIgKyByd3AgLSBkcnZkYXRhLT5wYWRkcjsKKwkJZWxzZQorCQkJZHJ2ZGF0YS0+YnVmID0gZHJ2ZGF0YS0+dmFkZHI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVzZXQgdGhlc2UgdmFyaWFibGVzIGJlZm9yZSBjb21wdXRpbmcgc2luY2Ugd2UKKwkJICogcmVseSBvbiB0aGVpciB2YWx1ZXMgZHVyaW5nIHRtYyByZWFkCisJCSAqLworCQlkcnZkYXRhLT5zZ19ibGtfbnVtID0gMDsKKwkJZHJ2ZGF0YS0+ZGVsdGFfYm90dG9tID0gMDsKKworCQlpZiAodmFsICYgQklUKDApKQorCQkJdG1jX2V0cl9zZ19yd3BfcG9zKGRydmRhdGEsIHJ3cCk7CisJCWVsc2UKKwkJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOworCX0KIH0KIAogc3RhdGljIHZvaWQgdG1jX2V0cl9kaXNhYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKQEAgLTk2LDYgKzUxNCw1MiBAQAogCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7CiB9CiAKK3N0YXRpYyBpbnQgdG1jX2V0cl9hbGxvY19tZW0oc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQoreworCWludCByZXQ7CisKKwlpZiAoIWRydmRhdGEtPnZhZGRyKSB7CisJCWlmIChkcnZkYXRhLT5tZW10eXBlID09IFRNQ19FVFJfTUVNX1RZUEVfQ09OVElHKSB7CisJCQlkcnZkYXRhLT52YWRkciA9IGRtYV96YWxsb2NfY29oZXJlbnQoZHJ2ZGF0YS0+ZGV2LAorCQkJCQkJCSAgICAgZHJ2ZGF0YS0+c2l6ZSwKKwkJCQkJCQkgICAgICZkcnZkYXRhLT5wYWRkciwKKwkJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFkcnZkYXRhLT52YWRkcikgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSB0bWNfZXRyX3NnX3RibF9hbGxvYyhkcnZkYXRhKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnI7CisJCX0KKwl9CisJLyoKKwkgKiBOZWVkIHRvIHJlaW5pdGlhbGl6ZSBidWYgZm9yIGVhY2ggdG1jIGVuYWJsZSBzZXNzaW9uIHNpbmNlIGl0IGlzCisJICogZ2V0dGluZyBtb2RpZmllZCBkdXJpbmcgdG1jIGV0ciBkdW1wLgorCSAqLworCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LCAiZXRyIGRkciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRtY19ldHJfZnJlZV9tZW0oc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQoreworCWlmIChkcnZkYXRhLT52YWRkcikgeworCQlpZiAoZHJ2ZGF0YS0+bWVtdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGRydmRhdGEtPmRldiwgZHJ2ZGF0YS0+c2l6ZSwKKwkJCQkJICBkcnZkYXRhLT52YWRkciwgZHJ2ZGF0YS0+cGFkZHIpOworCQllbHNlCisJCQl0bWNfZXRyX3NnX3RibF9mcmVlKCh1aW50MzJfdCAqKWRydmRhdGEtPnZhZGRyLAorCQkJCWRydmRhdGEtPnNpemUsCisJCQkJRElWX1JPVU5EX1VQKGRydmRhdGEtPnNpemUsIFBBR0VfU0laRSkpOworCQlkcnZkYXRhLT52YWRkciA9IDA7CisJCWRydmRhdGEtPnBhZGRyID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdG1jX2VuYWJsZV9ldHJfc2lua19zeXNmcyhzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsIHUzMiBtb2RlKQogewogCWludCByZXQgPSAwOwpAQCAtMTIzLDEwICs1ODcsMjkgQEAKIAkJICogaGVsZC4gIEFzIHN1Y2ggYWxsb2NhdGUgbWVtb3J5IGhlcmUgYW5kIGZyZWUgaXQgaWYgYSBidWZmZXIKIAkJICogaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgKGZyb20gYSBwcmV2aW91cyBzZXNzaW9uKS4KIAkJICovCi0JCXZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRydmRhdGEtPmRldiwgZHJ2ZGF0YS0+c2l6ZSwKLQkJCQkJICAgJnBhZGRyLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF2YWRkcikKLQkJCXJldHVybiAtRU5PTUVNOworCQltdXRleF9sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CisKKwkJLyoKKwkJICogRVRSIEREUiBtZW1vcnkgaXMgbm90IGFsbG9jYXRlZCB1bnRpbCB1c2VyIGVuYWJsZXMKKwkJICogdG1jIGF0IGxlYXN0IG9uY2UuIElmIHVzZXIgc3BlY2lmaWVzIGRpZmZlcmVudCBFVFIKKwkJICogRERSIHNpemUgdGhhbiB0aGUgZGVmYXVsdCBzaXplIG9yIHN3aXRjaGVzIGJldHdlZW4KKwkJICogY29udGlndW91cyBvciBzY2F0dGVyLWdhdGhlciBtZW1vcnkgdHlwZSBhZnRlcgorCQkgKiBlbmFibGluZyB0bWM7IHRoZSBuZXcgc2VsZWN0aW9uIHdpbGwgYmUgaG9ub3JlZCBmcm9tCisJCSAqIG5leHQgdG1jIGVuYWJsZSBzZXNzaW9uLgorCQkgKi8KKwkJaWYgKGRydmRhdGEtPnNpemUgIT0gZHJ2ZGF0YS0+bWVtX3NpemUgfHwKKwkJICAgIGRydmRhdGEtPm1lbXR5cGUgIT0gZHJ2ZGF0YS0+bWVtX3R5cGUpIHsKKwkJCXRtY19ldHJfZnJlZV9tZW0oZHJ2ZGF0YSk7CisJCQlkcnZkYXRhLT5zaXplID0gZHJ2ZGF0YS0+bWVtX3NpemU7CisJCQlkcnZkYXRhLT5tZW10eXBlID0gZHJ2ZGF0YS0+bWVtX3R5cGU7CisJCX0KKwkJcmV0ID0gdG1jX2V0cl9hbGxvY19tZW0oZHJ2ZGF0YSk7CisJCWlmIChyZXQpIHsKKwkJCXBtX3J1bnRpbWVfcHV0KGRydmRhdGEtPmRldik7CisJCQltdXRleF91bmxvY2soJmRydmRhdGEtPm1lbV9sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CiAKIAkJLyogTGV0J3MgdHJ5IGFnYWluICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTU4LDggKzY0MSw2IEBACiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOwogCX0KIAotCW1lbXNldChkcnZkYXRhLT52YWRkciwgMCwgZHJ2ZGF0YS0+c2l6ZSk7Ci0KIAl0bWNfZXRyX2VuYWJsZV9odyhkcnZkYXRhKTsKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKaW5kZXggZDg1MTdkMi4uZjUwMThmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogRGVzY3JpcHRpb246IENvcmVTaWdodCBUcmFjZSBNZW1vcnkgQ29udHJvbGxlciBkcml2ZXIKICAqCkBAIC0xNDIsMTIgKzE0MiwxOSBAQAogCQlsZW4gPSBkcnZkYXRhLT5sZW4gLSAqcHBvczsKIAogCWlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRSKSB7Ci0JCWlmIChidWZwID09IChjaGFyICopKGRydmRhdGEtPnZhZGRyICsgZHJ2ZGF0YS0+c2l6ZSkpCi0JCQlidWZwID0gZHJ2ZGF0YS0+dmFkZHI7Ci0JCWVsc2UgaWYgKGJ1ZnAgPiAoY2hhciAqKShkcnZkYXRhLT52YWRkciArIGRydmRhdGEtPnNpemUpKQotCQkJYnVmcCAtPSBkcnZkYXRhLT5zaXplOwotCQlpZiAoKGJ1ZnAgKyBsZW4pID4gKGNoYXIgKikoZHJ2ZGF0YS0+dmFkZHIgKyBkcnZkYXRhLT5zaXplKSkKLQkJCWxlbiA9IChjaGFyICopKGRydmRhdGEtPnZhZGRyICsgZHJ2ZGF0YS0+c2l6ZSkgLSBidWZwOworCQlpZiAoZHJ2ZGF0YS0+bWVtdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykgeworCQkJaWYgKGJ1ZnAgPT0gKGNoYXIgKikoZHJ2ZGF0YS0+dmFkZHIgKyBkcnZkYXRhLT5zaXplKSkKKwkJCQlidWZwID0gZHJ2ZGF0YS0+dmFkZHI7CisJCQllbHNlIGlmIChidWZwID4gKGNoYXIgKikoZHJ2ZGF0YS0+dmFkZHIgKworCQkJCSBkcnZkYXRhLT5zaXplKSkKKwkJCQlidWZwIC09IGRydmRhdGEtPnNpemU7CisJCQlpZiAoKGJ1ZnAgKyBsZW4pID4gKGNoYXIgKikoZHJ2ZGF0YS0+dmFkZHIgKworCQkJICAgICBkcnZkYXRhLT5zaXplKSkKKwkJCQlsZW4gPSAoY2hhciAqKShkcnZkYXRhLT52YWRkciArIGRydmRhdGEtPnNpemUpIC0KKwkJCQkgICAgICBidWZwOworCQl9IGVsc2UgeworCQkJdG1jX2V0cl9zZ19jb21wdXRlX3JlYWQoZHJ2ZGF0YSwgcHBvcywgJmJ1ZnAsICZsZW4pOworCQl9CiAJfQogCiAJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCBidWZwLCBsZW4pKSB7CkBAIC0yNzMsMTMgKzI4MCw5MCBAQAogfQogc3RhdGljIERFVklDRV9BVFRSX1JXKHRyaWdnZXJfY250cik7CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb3Jlc2lnaHRfdG1jX2F0dHJzW10gPSB7CitzdGF0aWMgc3NpemVfdCBtZW1fc2l6ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gZHJ2ZGF0YS0+bWVtX3NpemU7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJSNseFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgbWVtX3NpemVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwltdXRleF9sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTYsICZ2YWwpKSB7CisJCW11dGV4X3VubG9jaygmZHJ2ZGF0YS0+bWVtX2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcnZkYXRhLT5tZW1fc2l6ZSA9IHZhbDsKKwltdXRleF91bmxvY2soJmRydmRhdGEtPm1lbV9sb2NrKTsKKwlyZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhtZW1fc2l6ZSk7CisKK3N0YXRpYyBzc2l6ZV90IG1lbV90eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCQlzdHJfdG1jX2V0cl9tZW1fdHlwZVtkcnZkYXRhLT5tZW1fdHlwZV0pOworfQorCitzdGF0aWMgc3NpemVfdCBtZW1fdHlwZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJY2hhciBzdHJbMTBdID0gIiI7CisKKwlpZiAoc3RybGVuKGJ1ZikgPj0gMTApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzc2NhbmYoYnVmLCAiJTEwcyIsIHN0cikgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CisJaWYgKCFzdHJjbXAoc3RyLCBzdHJfdG1jX2V0cl9tZW1fdHlwZVtUTUNfRVRSX01FTV9UWVBFX0NPTlRJR10pKQorCQlkcnZkYXRhLT5tZW1fdHlwZSA9IFRNQ19FVFJfTUVNX1RZUEVfQ09OVElHOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCBzdHJfdG1jX2V0cl9tZW1fdHlwZVtUTUNfRVRSX01FTV9UWVBFX1NHXSkpCisJCWRydmRhdGEtPm1lbV90eXBlID0gVE1DX0VUUl9NRU1fVFlQRV9TRzsKKwllbHNlCisJCXNpemUgPSAtRUlOVkFMOworCisJbXV0ZXhfdW5sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CisKKwlyZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhtZW1fdHlwZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb3Jlc2lnaHRfdG1jX2V0Zl9hdHRyc1tdID0gewogCSZkZXZfYXR0cl90cmlnZ2VyX2NudHIuYXR0ciwKIAlOVUxMLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY29yZXNpZ2h0X3RtY19ncm91cCA9IHsKLQkuYXR0cnMgPSBjb3Jlc2lnaHRfdG1jX2F0dHJzLAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvcmVzaWdodF90bWNfZXRyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX21lbV9zaXplLmF0dHIsCisJJmRldl9hdHRyX21lbV90eXBlLmF0dHIsCisJJmRldl9hdHRyX3RyaWdnZXJfY250ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjb3Jlc2lnaHRfdG1jX2V0Zl9ncm91cCA9IHsKKwkuYXR0cnMgPSBjb3Jlc2lnaHRfdG1jX2V0Zl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNvcmVzaWdodF90bWNfZXRyX2dyb3VwID0geworCS5hdHRycyA9IGNvcmVzaWdodF90bWNfZXRyX2F0dHJzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY29yZXNpZ2h0X3RtY19tZ210X2dyb3VwID0gewpAQCAtMjg3LDggKzM3MSwxNCBAQAogCS5uYW1lID0gIm1nbXQiLAogfTsKIAotY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY29yZXNpZ2h0X3RtY19ncm91cHNbXSA9IHsKLQkmY29yZXNpZ2h0X3RtY19ncm91cCwKK2NvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmNvcmVzaWdodF90bWNfZXRmX2dyb3Vwc1tdID0geworCSZjb3Jlc2lnaHRfdG1jX2V0Zl9ncm91cCwKKwkmY29yZXNpZ2h0X3RtY19tZ210X2dyb3VwLAorCU5VTEwsCit9OworCitjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjb3Jlc2lnaHRfdG1jX2V0cl9ncm91cHNbXSA9IHsKKwkmY29yZXNpZ2h0X3RtY19ldHJfZ3JvdXAsCiAJJmNvcmVzaWdodF90bWNfbWdtdF9ncm91cCwKIAlOVUxMLAogfTsKQEAgLTMzMiw2ICs0MjIsNyBAQAogCWRydmRhdGEtPmJhc2UgPSBiYXNlOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRydmRhdGEtPnNwaW5sb2NrKTsKKwltdXRleF9pbml0KCZkcnZkYXRhLT5tZW1fbG9jayk7CiAKIAlkZXZpZCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIENPUkVTSUdIVF9ERVZJRCk7CiAJZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPSBCTVZBTChkZXZpZCwgNiwgNyk7CkBAIC0zNDQsNiArNDM1LDEwIEBACiAJCQkJCQkgICAmZHJ2ZGF0YS0+c2l6ZSk7CiAJCWlmIChyZXQpCiAJCQlkcnZkYXRhLT5zaXplID0gU1pfMU07CisKKwkJZHJ2ZGF0YS0+bWVtX3NpemUgPSBkcnZkYXRhLT5zaXplOworCQlkcnZkYXRhLT5tZW10eXBlICA9IFRNQ19FVFJfTUVNX1RZUEVfQ09OVElHOworCQlkcnZkYXRhLT5tZW1fdHlwZSA9IGRydmRhdGEtPm1lbXR5cGU7CiAJfSBlbHNlIHsKIAkJZHJ2ZGF0YS0+c2l6ZSA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19SU1opICogNDsKIAl9CkBAIC0zNTIsMjAgKzQ0NywyMSBAQAogCiAJZGVzYy5wZGF0YSA9IHBkYXRhOwogCWRlc2MuZGV2ID0gZGV2OwotCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ncm91cHM7Ci0KIAlpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUQikgewogCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQkJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKIAkJZGVzYy5vcHMgPSAmdG1jX2V0Yl9jc19vcHM7CisJCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ldGZfZ3JvdXBzOworCQlkZXNjLnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfQlVGRkVSOwogCX0gZWxzZSBpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUUikgewogCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQkJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKIAkJZGVzYy5vcHMgPSAmdG1jX2V0cl9jc19vcHM7CisJCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ldHJfZ3JvdXBzOworCQlkZXNjLnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfQlVGRkVSOwogCX0gZWxzZSB7CiAJCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LU0lOSzsKLQkJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX0ZJRk87CiAJCWRlc2Mub3BzID0gJnRtY19ldGZfY3Nfb3BzOworCQlkZXNjLmdyb3VwcyA9IGNvcmVzaWdodF90bWNfZXRmX2dyb3VwczsKKwkJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX0ZJRk87CiAJfQogCiAJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmgKaW5kZXggOGJkM2EyYS4uNzI2ZGNkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIF9DT1JFU0lHSFRfVE1DX0gKIAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiAjZGVmaW5lIFRNQ19SU1oJCQkweDAwNAogI2RlZmluZSBUTUNfU1RTCQkJMHgwMGMKQEAgLTcwLDYgKzcxLDEyIEBACiAjZGVmaW5lIFRNQ19GRkNSX1RSSUdPTl9UUklHSU4JQklUKDgpCiAjZGVmaW5lIFRNQ19GRkNSX1NUT1BfT05fRkxVU0gJQklUKDEyKQogCisjZGVmaW5lIFRNQ19FVFJfU0dfRU5UX1RPX0JMSyhwaHlzX3B0ZSkJKCgocGh5c19hZGRyX3QpcGh5c19wdGUgPj4gNCkJXAorCQkJCQkgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgVE1DX0VUUl9TR19FTlQocGh5c19wdGUpCSgoKHBoeXNfcHRlID4+IFBBR0VfU0hJRlQpIDw8IDQpIHwgMHgyKQorI2RlZmluZSBUTUNfRVRSX1NHX05YVF9UQkwocGh5c19wdGUpCSgoKHBoeXNfcHRlID4+IFBBR0VfU0hJRlQpIDw8IDQpIHwgMHgzKQorI2RlZmluZSBUTUNfRVRSX1NHX0xTVF9FTlQocGh5c19wdGUpCSgoKHBoeXNfcHRlID4+IFBBR0VfU0hJRlQpIDw8IDQpIHwgMHgxKQorCiAKIGVudW0gdG1jX2NvbmZpZ190eXBlIHsKIAlUTUNfQ09ORklHX1RZUEVfRVRCLApAQCAtOTAsNiArOTcsMTcgQEAKIAlUTUNfTUVNX0lOVEZfV0lEVEhfMjU2QklUUwk9IDgsCiB9OwogCitlbnVtIHRtY19ldHJfbWVtX3R5cGUgeworCVRNQ19FVFJfTUVNX1RZUEVfQ09OVElHLAorCVRNQ19FVFJfTUVNX1RZUEVfU0csCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0cl90bWNfZXRyX21lbV90eXBlW10gPSB7CisJW1RNQ19FVFJfTUVNX1RZUEVfQ09OVElHXQk9ICJjb250aWciLAorCVtUTUNfRVRSX01FTV9UWVBFX1NHXQkJPSAic2ciLAorfTsKKworCiAvKioKICAqIHN0cnVjdCB0bWNfZHJ2ZGF0YSAtIHNwZWNpZmljcyBhc3NvY2lhdGVkIHRvIGFuIFRNQyBjb21wb25lbnQKICAqIEBiYXNlOgltZW1vcnkgbWFwcGVkIGJhc2UgYWRkcmVzcyBmb3IgdGhpcyBjb21wb25lbnQuCkBAIC0xMjIsNyArMTQwLDEzIEBACiAJbG9jYWxfdAkJCW1vZGU7CiAJZW51bSB0bWNfY29uZmlnX3R5cGUJY29uZmlnX3R5cGU7CiAJZW51bSB0bWNfbWVtX2ludGZfd2lkdGgJbWVtd2lkdGg7CisJc3RydWN0IG11dGV4CQltZW1fbG9jazsKKwl1MzIJCQltZW1fc2l6ZTsKIAl1MzIJCQl0cmlnZ2VyX2NudHI7CisJZW51bSB0bWNfZXRyX21lbV90eXBlCW1lbV90eXBlOworCWVudW0gdG1jX2V0cl9tZW1fdHlwZQltZW10eXBlOworCXUzMgkJCWRlbHRhX2JvdHRvbTsKKwlpbnQJCQlzZ19ibGtfbnVtOwogfTsKIAogLyogR2VuZXJpYyBmdW5jdGlvbnMgKi8KQEAgLTEzOCw2ICsxNjIsOCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBjb3Jlc2lnaHRfb3BzIHRtY19ldGZfY3Nfb3BzOwogCiAvKiBFVFIgZnVuY3Rpb25zICovCit2b2lkIHRtY19ldHJfc2dfY29tcHV0ZV9yZWFkKHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSwgbG9mZl90ICpwcG9zLAorCQkJICAgICBjaGFyICoqYnVmcHAsIHNpemVfdCAqbGVuKTsKIGludCB0bWNfcmVhZF9wcmVwYXJlX2V0cihzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpOwogaW50IHRtY19yZWFkX3VucHJlcGFyZV9ldHIoc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY29yZXNpZ2h0X29wcyB0bWNfZXRyX2NzX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IGM2ZGY2NDQuLjVmNjA4M2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTE2MDcsNiArMTYwNyw4MCBAQAogCSAgaW4gdmFyaW91cyBTVCBNaWNyb2VsZWN0cm9uaWNzIGFuZCBTVC1Fcmljc3NvbiBlbWJlZGRlZAogCSAgTm9tYWRpayBzZXJpZXMuCiAKK2NvbmZpZyBNU01fQ0RDX1BJTkNUUkwKKwl0cmlzdGF0ZSAiTVNNIENvZGVjIFBpbmN0cmwiCisJc2VsZWN0IE1GRF9DT1JFCisJaGVscAorCSAgRW5hYmxlcyBtc20gY29kZWMgcGluY3RybCBkcml2ZXIuIFRoZSBwaW5jdHJsIGRyaXZlcgorCSAgcHJvdmlkZXMgc3VwcG9ydCBmb3IgaGFuZGxpbmcgV0NEIGFuZCBXU0EgTVNNIGdwaW9zLiBUaGlzCisJICBwaW5jdHJsIGRyaXZlciB3aWxsIGhhbmRsZSBXQ0QgYW5kIFdTQSBncGlvcyBwaW5jdHJsIHN0YXRlcy4KKwkgIFRoaXMgZHJpdmVyIGFjdHMgYXMgaW50ZXJmYWNlIGJldHdlZW4gY29kZWMgYW5kIHBpbmN0cmwKKwkgIGZyYW1ld29yay4KKworY29uZmlnIE1TTV9DRENfU1VQUExZCisJdHJpc3RhdGUgIk1TTSBDb2RlYyBQb3dlciBTdXBwbHkiCisJaGVscAorCSAgRW5hYmxlcyBtc20gY29kZWMgcG93ZXIgc3VwcGx5IGRyaXZlci4gVGhlIHBvd2VyIHN1cHBseQorCSAgZHJpdmVyIHByb3ZpZGVzIEFQSSBzdXBwb3J0IGZvciBoYW5kbGluZyBXQ0QgYW5kIFdTQSBjb2RlYworCSAgcG93ZXIgc3VwcGx5IGVuYWJsZSBvciBkaXNhYmxlLiBUaGlzIGRyaXZlciBhY3RzIGFzIGludGVyZmFjZQorCSAgYmV0d2VlbiBjb2RlYyBhbmQgcmVndWxhdG9yIGZyYW1ld29yay4KKworY29uZmlnIFdDRDlYWFhfQ09ERUNfVVRJTAorCXRyaXN0YXRlICJXQ0Q5WFhYIENvZGVjIFV0aWxzIgorCXNlbGVjdCBNRkRfQ09SRQorCWhlbHAKKwkgIFdDRDlYWFggVXRpbCBkcml2ZXIgcHJvdmlkZXMgQVBJcyBmb3IgV0NEIGRyaXZlcnMgdG8gcmVzZXQsCisJICBzdXNwZW5kL3Jlc3VtZSwgcmVnbWFwIGJ1cyBjYWxsYmFjayBmdW5jdGlvbnMgYW5kIHJlYWQvd3JpdGUKKwkgIGZ1bmN0aW9ucy4gVGhpcyBkcml2ZXIgYWxzbyBoaWRlcyB0aGUgdW5kZXJseWluZyBidXMgcmVsYXRlZAorCSAgZnVuY3Rpb25hbGl0aWVzLgorCitjb25maWcgV0NEOTMzMF9DT0RFQworCXRyaXN0YXRlICJXQ0Q5MzMwIENvZGVjIgorCXNlbGVjdCBTTElNQlVTCisJc2VsZWN0IE1GRF9DT1JFCisJc2VsZWN0IFdDRDlYWFhfQ09ERUNfVVRJTAorCXNlbGVjdCBNU01fQ0RDX1NVUFBMWQorCXNlbGVjdCBSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIFdDRDl4eHggY29kZWMgY29yZSBkcml2ZXIuIFRoZSBjb3JlIGRyaXZlciBwcm92aWRlcworCSAgcmVhZC93cml0ZSBjYXBhYmlsaXR5IHRvIHJlZ2lzdGVycyB3aGljaCBhcmUgcGFydCBvZiB0aGUKKwkgIFdDRDkzMzAgY29yZSBhbmQgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8gdXNlIHRoZSBXQ0Q5MzMwIGNvZGVjLgorCSAgVGhlIFdDRDkzMzAgY29kZWMgc3VwcG9ydCBlaXRoZXIgSTJDL0kyUyBvciBTbGltYnVzIGZvcgorCSAgY29udHJvbCBhbmQgZGF0YSBleGNobmFnZSB3aXRoIG1hc3RlciBwcm9jZXNzb3IuCisKK2NvbmZpZyBXQ0Q5MzM1X0NPREVDCisJdHJpc3RhdGUgIldDRDkzMzUgQ29kZWMiCisJc2VsZWN0IFNMSU1CVVMKKwlzZWxlY3QgU09VTkRXSVJFX1dDRF9DVFJMCisJc2VsZWN0IE1GRF9DT1JFCisJc2VsZWN0IFdDRDlYWFhfQ09ERUNfVVRJTAorCXNlbGVjdCBNU01fQ0RDX1NVUFBMWQorCXNlbGVjdCBNU01fQ0RDX1BJTkNUUkwKKwlzZWxlY3QgUkVHTUFQX0FMTE9XX1dSSVRFX0RFQlVHRlMKKwloZWxwCisJICBFbmFibGVzIHRoZSBXQ0Q5eHh4IGNvZGVjIGNvcmUgZHJpdmVyLiBUaGUgY29yZSBkcml2ZXIgcHJvdmlkZXMKKwkgIHJlYWQvd3JpdGUgY2FwYWJpbGl0eSB0byByZWdpc3RlcnMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlCisJICBXQ0Q5MzM1IGNvcmUgYW5kIGdpdmVzIHRoZSBhYmlsaXR5IHRvIHVzZSB0aGUgV0NEOTMzNSBjb2RlYy4KKwkgIFRoZSBXQ0Q5MzM1IGNvZGVjIHN1cHBvcnQgZWl0aGVyIEkyQy9JMlMgb3IgU2xpbWJ1cyBmb3IKKwkgIGNvbnRyb2wgYW5kIGRhdGEgZXhjaG5hZ2Ugd2l0aCBtYXN0ZXIgcHJvY2Vzc29yLgorCitjb25maWcgV0NEOTM0WF9DT0RFQworCXRyaXN0YXRlICJXQ0Q5MzRYIENvZGVjIgorCWRlcGVuZHMgb24gU0xJTUJVUworCXNlbGVjdCBTT1VORFdJUkVfV0NEX0NUUkwKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgV0NEOVhYWF9DT0RFQ19VVElMCisJc2VsZWN0IE1TTV9DRENfU1VQUExZCisJc2VsZWN0IE1TTV9DRENfUElOQ1RSTAorCXNlbGVjdCBSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUworCXNlbGVjdCBQSU5DVFJMX1dDRAorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIFdDRDl4eHggY29kZWMgY29yZSBkcml2ZXIuIFRoZSBjb3JlIGRyaXZlciBwcm92aWRlcworCSAgcmVhZC93cml0ZSBjYXBhYmlsaXR5IHRvIHJlZ2lzdGVycyB3aGljaCBhcmUgcGFydCBvZiB0aGUKKwkgIFdDRDkzNFggY29yZSBhbmQgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8gdXNlIHRoZSBXQ0Q5MzRYIGNvZGVjLgorCSAgVGhlIFdDRDkzNFggY29kZWMgc3VwcG9ydHMgZWl0aGVyIEkyQy9JMlMgb3IgU2xpbWJ1cyBmb3IKKwkgIGNvbnRyb2wgYW5kIGRhdGEgZXhjaGFuZ2Ugd2l0aCBtYXN0ZXIgcHJvY2Vzc29yLgorCiBtZW51ICJNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDk4MzRlNjYuLmNkYWUxN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0yMDQsNiArMjA0LDE1IEBACiBvYmotJChDT05GSUdfTUZEX0RMTjIpCQkrPSBkbG4yLm8KIG9iai0kKENPTkZJR19NRkRfUlQ1MDMzKQkrPSBydDUwMzMubwogb2JqLSQoQ09ORklHX01GRF9TS1k4MTQ1MikJKz0gc2t5ODE0NTIubworb2JqLSQoQ09ORklHX01TTV9DRENfUElOQ1RSTCkJKz0gbXNtLWNkYy1waW5jdHJsLm8KK29iai0kKENPTkZJR19NU01fQ0RDX1NVUFBMWSkgKz0gbXNtLWNkYy1zdXBwbHkubworb2JqLSQoQ09ORklHX1dDRDlYWFhfQ09ERUNfVVRJTCkgKz0gd2NkOXh4eC11dGlscy5vCitvYmotJChDT05GSUdfV0NEOTMzMF9DT0RFQykJKz0gd2NkOXh4eC1jb3JlLm8gd2NkOXh4eC1pcnEubyB3Y2Q5eHh4LXNsaW1zbGF2ZS5vXAorCQkJCQkJd2NkOTMzMC1yZWdtYXAubworb2JqLSQoQ09ORklHX1dDRDkzMzVfQ09ERUMpCSs9IHdjZDl4eHgtY29yZS5vIHdjZDl4eHgtaXJxLm8gd2NkOXh4eC1zbGltc2xhdmUub1wKKwkJCQkJd2NkOTMzNS1yZWdtYXAubyB3Y2Q5MzM1LXRhYmxlcy5vCitvYmotJChDT05GSUdfV0NEOTM0WF9DT0RFQykJKz0gd2NkOXh4eC1jb3JlLm8gd2NkOXh4eC1pcnEubyB3Y2Q5eHh4LXNsaW1zbGF2ZS5vXAorCQkJCQl3Y2Q5MzR4LXJlZ21hcC5vIHdjZDkzNHgtdGFibGVzLm8KIAogaW50ZWwtc29jLXBtaWMtb2JqcwkJOj0gaW50ZWxfc29jX3BtaWNfY29yZS5vIGludGVsX3NvY19wbWljX2NyYy5vCiBpbnRlbC1zb2MtcG1pYy0kKENPTkZJR19JTlRFTF9QTUNfSVBDKQkrPSBpbnRlbF9zb2NfcG1pY19ieHR3Yy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tc20tY2RjLXBpbmN0cmwuYyBiL2RyaXZlcnMvbWZkL21zbS1jZGMtcGluY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZmQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9tc20tY2RjLXBpbmN0cmwuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KKworc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvIHsKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqcGluY3RybF9hY3RpdmU7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnBpbmN0cmxfc2xlZXA7CisJaW50IGdwaW87CisJYm9vbCBzdGF0ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8gKm1zbV9jZGNfcGluY3RybF9nZXRfZ3Bpb2RhdGEoCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvICpncGlvX2RhdGE7CisKKwlpZiAoIW5wKSB7CisJCXByX2VycigiJXM6IGRldmljZSBub2RlIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobnApOworCWlmICghcGRldikgeworCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkZXZpY2Ugbm90IGZvdW5kIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlncGlvX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJaWYgKCFncGlvX2RhdGEpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjYW5ub3QgZmluZCBjZGMgZ3BpbyBpbmZvXG4iLAorCQkJX19mdW5jX18pOworCisJcmV0dXJuIGdwaW9fZGF0YTsKK30KKworLyoKKyAqIG1zbV9jZGNfZ2V0X2dwaW9fc3RhdGU6IHNlbGVjdCBwaW5jdHJsIHNsZWVwIHN0YXRlCisgKiBAbnA6IHBvaW50ZXIgdG8gc3RydWN0IGRldmljZV9ub2RlCisgKgorICogUmV0dXJucyBlcnJvciBjb2RlIGZvciBmYWlsdXJlIGFuZCBHUElPIHZhbHVlIG9uIHN1Y2Nlc3MKKyAqLworaW50IG1zbV9jZGNfZ2V0X2dwaW9fc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8gKmdwaW9fZGF0YTsKKwlpbnQgdmFsdWUgPSAtRUlOVkFMOworCisJZ3Bpb19kYXRhID0gbXNtX2NkY19waW5jdHJsX2dldF9ncGlvZGF0YShucCk7CisJaWYgKCFncGlvX2RhdGEpCisJCXJldHVybiB2YWx1ZTsKKworCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fZGF0YS0+Z3BpbykpCisJCXZhbHVlID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAoZ3Bpb19kYXRhLT5ncGlvKTsKKworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2NkY19nZXRfZ3Bpb19zdGF0ZSk7CisKKy8qCisgKiBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlOiBzZWxlY3QgcGluY3RybCBzbGVlcCBzdGF0ZQorICogQG5wOiBwb2ludGVyIHRvIHN0cnVjdCBkZXZpY2Vfbm9kZQorICoKKyAqIFJldHVybnMgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQorICovCitpbnQgbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOworCisJZ3Bpb19kYXRhID0gbXNtX2NkY19waW5jdHJsX2dldF9ncGlvZGF0YShucCk7CisJaWYgKCFncGlvX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApIHsKKwkJcHJfZXJyKCIlczogcGluY3RybCBzbGVlcCBzdGF0ZSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlncGlvX2RhdGEtPnN0YXRlID0gZmFsc2U7CisKKwlyZXR1cm4gcGluY3RybF9zZWxlY3Rfc3RhdGUoZ3Bpb19kYXRhLT5waW5jdHJsLAorCQkJCSAgICBncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApOworfQorRVhQT1JUX1NZTUJPTChtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKTsKKworLyoKKyAqIG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlOiBzZWxlY3QgcGluY3RybCBhY3RpdmUgc3RhdGUKKyAqIEBucDogcG9pbnRlciB0byBzdHJ1Y3QgZGV2aWNlX25vZGUKKyAqCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworaW50IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvICpncGlvX2RhdGE7CisKKwlncGlvX2RhdGEgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X2dwaW9kYXRhKG5wKTsKKwlpZiAoIWdwaW9fZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWdwaW9fZGF0YS0+cGluY3RybF9hY3RpdmUpIHsKKwkJcHJfZXJyKCIlczogcGluY3RybCBhY3RpdmUgc3RhdGUgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZ3Bpb19kYXRhLT5zdGF0ZSA9IHRydWU7CisKKwlyZXR1cm4gcGluY3RybF9zZWxlY3Rfc3RhdGUoZ3Bpb19kYXRhLT5waW5jdHJsLAorCQkJCSAgICBncGlvX2RhdGEtPnBpbmN0cmxfYWN0aXZlKTsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUpOworCisvKgorICogbXNtX2NkY19waW5jdHJsX2dldF9zdGF0ZTogZ2V0IGN1cnJlbiBwaW5jdHJsIHN0YXRlCisgKiBAbnA6IHBvaW50ZXIgdG8gc3RydWN0IGRldmljZV9ub2RlCisgKgorICogUmV0dXJucyAwIGZvciBzbGVlcCBzdGF0ZSwgMSBmb3IgYWN0aXZlIHN0YXRlCisgKi8KK2Jvb2wgbXNtX2NkY19waW5jdHJsX2dldF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOworCisJZ3Bpb19kYXRhID0gbXNtX2NkY19waW5jdHJsX2dldF9ncGlvZGF0YShucCk7CisJaWYgKCFncGlvX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdwaW9fZGF0YS0+c3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9jZGNfcGluY3RybF9nZXRfc3RhdGUpOworCitzdGF0aWMgaW50IG1zbV9jZGNfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOworCisJZ3Bpb19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8pLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW9fZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlncGlvX2RhdGEtPnBpbmN0cmwgPSBkZXZtX3BpbmN0cmxfZ2V0KCZwZGV2LT5kZXYpOworCWlmIChJU19FUlJfT1JfTlVMTChncGlvX2RhdGEtPnBpbmN0cmwpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDYW5ub3QgZ2V0IGNkYyBncGlvIHBpbmN0cmw6JWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIoZ3Bpb19kYXRhLT5waW5jdHJsKSk7CisJCXJldCA9IFBUUl9FUlIoZ3Bpb19kYXRhLT5waW5jdHJsKTsKKwkJZ290byBlcnJfcGN0cmxfZ2V0OworCX0KKworCWdwaW9fZGF0YS0+cGluY3RybF9hY3RpdmUgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZSgKKwkJCQkJZ3Bpb19kYXRhLT5waW5jdHJsLCAiYXVkX2FjdGl2ZSIpOworCWlmIChJU19FUlJfT1JfTlVMTChncGlvX2RhdGEtPnBpbmN0cmxfYWN0aXZlKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2Fubm90IGdldCBhdWRfYWN0aXZlIHBpbmN0cmwgc3RhdGU6JWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIoZ3Bpb19kYXRhLT5waW5jdHJsX2FjdGl2ZSkpOworCQlyZXQgPSBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybF9hY3RpdmUpOworCQlnb3RvIGVycl9sb29rdXBfc3RhdGU7CisJfQorCisJZ3Bpb19kYXRhLT5waW5jdHJsX3NsZWVwID0gcGluY3RybF9sb29rdXBfc3RhdGUoCisJCQkJCWdwaW9fZGF0YS0+cGluY3RybCwgImF1ZF9zbGVlcCIpOworCWlmIChJU19FUlJfT1JfTlVMTChncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDYW5ub3QgZ2V0IGF1ZF9zbGVlcCBwaW5jdHJsIHN0YXRlOiVsZFxuIiwKKwkJCV9fZnVuY19fLCBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybF9zbGVlcCkpOworCQlyZXQgPSBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybF9zbGVlcCk7CisJCWdvdG8gZXJyX2xvb2t1cF9zdGF0ZTsKKwl9CisKKwkvKiBTZXQgcGluY3RybCBzdGF0ZSB0byBhdWRfc2xlZXAgYnkgZGVmYXVsdCAqLworCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKGdwaW9fZGF0YS0+cGluY3RybCwKKwkJCQkgICBncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzZXQgY2RjIGdwaW8gc2xlZXAgc3RhdGUgZmFpbDogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCWdwaW9fZGF0YS0+Z3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICAgInFjb20sY2RjLXJzdC1uLWdwaW8iLCAwKTsKKwlpZiAoZ3Bpb19pc192YWxpZChncGlvX2RhdGEtPmdwaW8pKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChncGlvX2RhdGEtPmdwaW8sICJNU01fQ0RDX1JFU0VUIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBncGlvICVkXG4iLAorCQkJCV9fZnVuY19fLCBncGlvX2RhdGEtPmdwaW8pOworCQkJZ290byBlcnJfbG9va3VwX3N0YXRlOworCQl9CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGdwaW9fZGF0YSk7CisJcmV0dXJuIDA7CisKK2Vycl9sb29rdXBfc3RhdGU6CisJZGV2bV9waW5jdHJsX3B1dChncGlvX2RhdGEtPnBpbmN0cmwpOworZXJyX3BjdHJsX2dldDoKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGdwaW9fZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fY2RjX3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvICpncGlvX2RhdGE7CisKKwlncGlvX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisKKwlpZiAoZ3Bpb19kYXRhICYmIGdwaW9fZGF0YS0+cGluY3RybCkKKwkJZGV2bV9waW5jdHJsX3B1dChncGlvX2RhdGEtPnBpbmN0cmwpOworCisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBncGlvX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9jZGNfcGluY3RybF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jZGMtcGluY3RybCJ9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2RjX3BpbmN0cmxfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1jZGMtcGluY3RybCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fY2RjX3BpbmN0cmxfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtc21fY2RjX3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9jZGNfcGluY3RybF9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtc21fY2RjX3BpbmN0cmxfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQ09ERUMgcGluIGNvbnRyb2wgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tc20tY2RjLXN1cHBseS5jIGIvZHJpdmVycy9tZmQvbXNtLWNkYy1zdXBwbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM1OGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvbXNtLWNkYy1zdXBwbHkuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNkZWZpbmUgQ09ERUNfRFRfTUFYX1BST1BfU0laRSA0MAorCitzdGF0aWMgaW50IG1zbV9jZGNfZHRfcGFyc2VfdnJlZ19pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3ZyZWcsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19vbmQpCit7CisJY2hhciBwcm9wX25hbWVbQ09ERUNfRFRfTUFYX1BST1BfU0laRV07CisJc3RydWN0IGRldmljZV9ub2RlICpyZWd1bGF0b3Jfbm9kZSA9IE5VTEw7CisJY29uc3QgX19iZTMyICpwcm9wOworCWludCBsZW4sIHJjOworCXUzMiBwcm9wX3ZhbDsKKworCS8qIFBhcnNlIHN1cHBseSBuYW1lICovCisJc25wcmludGYocHJvcF9uYW1lLCBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFLCAiJXMtc3VwcGx5IiwgbmFtZSk7CisKKwlyZWd1bGF0b3Jfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsIDApOworCWlmICghcmVndWxhdG9yX25vZGUpIHsKKwkJZGV2X2VycihkZXYsICIlczogTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCisJCQlfX2Z1bmNfXywgcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwljZGNfdnJlZy0+bmFtZSA9IG5hbWU7CisJY2RjX3ZyZWctPm9uZGVtYW5kID0gaXNfb25kOworCisJLyogUGFyc2Ugc3VwcGx5IC0gdm9sdGFnZSAqLworCXNucHJpbnRmKHByb3BfbmFtZSwgQ09ERUNfRFRfTUFYX1BST1BfU0laRSwgInFjb20sJXMtdm9sdGFnZSIsIG5hbWUpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsICZsZW4pOworCWlmICghcHJvcCB8fCAobGVuICE9ICgyICogc2l6ZW9mKF9fYmUzMikpKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiAlcyAlcyBwcm9wZXJ0eVxuIiwgX19mdW5jX18sCisJCQlwcm9wID8gImludmFsaWQgZm9ybWF0IiA6ICJubyIsIHByb3BfbmFtZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCWNkY192cmVnLT5taW5fdVYgPSBiZTMyX3RvX2NwdXAoJnByb3BbMF0pOworCQljZGNfdnJlZy0+bWF4X3VWID0gYmUzMl90b19jcHVwKCZwcm9wWzFdKTsKKwl9CisKKwkvKiBQYXJzZSBzdXBwbHkgLSBjdXJyZW50ICovCisJc25wcmludGYocHJvcF9uYW1lLCBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFLCAicWNvbSwlcy1jdXJyZW50IiwgbmFtZSk7CisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgJnByb3BfdmFsKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICIlczogTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCisJCQlfX2Z1bmNfXywgcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gZG9uZTsKKwl9CisJY2RjX3ZyZWctPm9wdGltdW1fdUEgPSBwcm9wX3ZhbDsKKworCWRldl9pbmZvKGRldiwgIiVzOiAlczogdm9sPVslZCAlZF11ViwgY3Vycj1bJWRddUEsIG9uZCAlZFxuIiwKKwkJIF9fZnVuY19fLCBjZGNfdnJlZy0+bmFtZSwgY2RjX3ZyZWctPm1pbl91ViwgY2RjX3ZyZWctPm1heF91ViwKKwkJIGNkY192cmVnLT5vcHRpbXVtX3VBLCBjZGNfdnJlZy0+b25kZW1hbmQpOworCitkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fY2RjX3BhcnNlX3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfcmVnLAorCQkJCSAgY29uc3QgY2hhciAqc3VwX2xpc3QsIGludCBzdXBfY250LAorCQkJCSAgYm9vbCBpc19vbmQpCit7CisJaW50IGlkeCwgcmMgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCisJZm9yIChpZHggPSAwOyBpZHggPCBzdXBfY250OyBpZHgrKykgeworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KGRldi0+b2Zfbm9kZSwgc3VwX2xpc3QsIGlkeCwKKwkJCQkJCSAgICZuYW1lKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiByZWFkIHN0cmluZyAlc1slZF0gZXJyb3IgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgc3VwX2xpc3QsIGlkeCwgcmMpOworCQkJZ290byBkb25lOworCQl9CisKKwkJZGV2X2RiZyhkZXYsICIlczogRm91bmQgY2RjIHN1cHBseSAlcyBhcyBwYXJ0IG9mICVzXG4iLAorCQkJX19mdW5jX18sIG5hbWUsIHN1cF9saXN0KTsKKworCQlyYyA9IG1zbV9jZGNfZHRfcGFyc2VfdnJlZ19pbmZvKGRldiwgJmNkY19yZWdbaWR4XSwgbmFtZSwKKwkJCQkJCWlzX29uZCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihkZXYsICIlczogcGFyc2UgJXMgdnJlZyBpbmZvIGZhaWxlZCAoJWQpXG4iLAorCQkJCV9fZnVuY19fLCBuYW1lLCByYyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9jZGNfY2hlY2tfc3VwcGx5X3BhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3ZyZWcsCisJCQkJICAgICAgaW50IG51bV9zdXBwbGllcykKK3sKKwlpZiAoIWRldikgeworCQlwcl9lcnIoIiVzOiBkZXZpY2UgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWNkY192cmVnIHx8IChudW1fc3VwcGxpZXMgPD0gMCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogc3VwcGx5IGNoZWNrIGZhaWxlZDogdnJlZzogJXBLLCBudW1fc3VwcGxpZXM6ICVkXG4iLAorCQkJX19mdW5jX18sIGNkY192cmVnLCBudW1fc3VwcGxpZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXM6CisgKglEaXNhYmxlIGNvZGVjIHN0YXRpYyBzdXBwbGllcworICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCisgKiBAc3VwcGxpZXM6IHBvaW50ZXIgdG8gcmVndWxhdG9yIGJ1bGsgZGF0YQorICogQGNkY192cmVnOiBwb2ludGVyIHRvIHBsYXRmb3JtIHJlZ3VsYXRvciBkYXRhCisgKiBAbnVtX3N1cHBsaWVzOiBudW1iZXIgb2Ygc3VwcGxpZXMKKyAqCisgKiBSZXR1cm4gZXJyb3IgY29kZSBpZiBzdXBwbHkgZGlzYWJsZSBpcyBmYWlsZWQKKyAqLworaW50IG1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCisJCQkJICAgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKKwkJCQkgICAgaW50IG51bV9zdXBwbGllcykKK3sKKwlpbnQgcmMsIGk7CisKKwlpZiAoKCFkZXYpIHx8ICghc3VwcGxpZXMpIHx8ICghY2RjX3ZyZWcpKSB7CisJCXByX2VycigiJXM6IGVpdGhlciBkZXYgb3Igc3VwcGxpZXMgb3IgY2RjX3ZyZWcgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCXJjID0gbXNtX2NkY19jaGVja19zdXBwbHlfcGFyYW0oZGV2LCBjZGNfdnJlZywgbnVtX3N1cHBsaWVzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc3VwcGxpZXM7IGkrKykgeworCQlpZiAoY2RjX3ZyZWdbaV0ub25kZW1hbmQpCisJCQljb250aW51ZTsKKworCQlyYyA9IHJlZ3VsYXRvcl9kaXNhYmxlKHN1cHBsaWVzW2ldLmNvbnN1bWVyKTsKKwkJaWYgKHJjKQorCQkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIGRpc2FibGUgc3VwcGx5ICVzLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHN1cHBsaWVzW2ldLnN1cHBseSwgcmMpOworCQllbHNlCisJCQlkZXZfZGJnKGRldiwgIiVzOiBkaXNhYmxlZCByZWd1bGF0b3IgJXNcbiIsCisJCQkJX19mdW5jX18sIHN1cHBsaWVzW2ldLnN1cHBseSk7CisJfQorCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtc21fY2RjX2Rpc2FibGVfc3RhdGljX3N1cHBsaWVzKTsKKworLyoKKyAqIG1zbV9jZGNfcmVsZWFzZV9zdXBwbGllczoKKyAqCVJlbGVhc2UgY29kZWMgcG93ZXIgc3VwcGxpZXMKKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIGNvZGVjIGRldmljZQorICogQHN1cHBsaWVzOiBwb2ludGVyIHRvIHJlZ3VsYXRvciBidWxrIGRhdGEKKyAqIEBjZGNfdnJlZzogcG9pbnRlciB0byBwbGF0Zm9ybSByZWd1bGF0b3IgZGF0YQorICogQG51bV9zdXBwbGllczogbnVtYmVyIG9mIHN1cHBsaWVzCisgKgorICogUmV0dXJuIGVycm9yIGNvZGUgaWYgc3VwcGx5IGRpc2FibGUgaXMgZmFpbGVkCisgKi8KK2ludCBtc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCisJCQkgICAgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKKwkJCSAgICAgaW50IG51bV9zdXBwbGllcykKK3sKKwlpbnQgcmMgPSAwOworCWludCBpOworCisJaWYgKCghZGV2KSB8fCAoIXN1cHBsaWVzKSB8fCAoIWNkY192cmVnKSkgeworCQlwcl9lcnIoIiVzOiBlaXRoZXIgZGV2IG9yIHN1cHBsaWVzIG9yIGNkY192cmVnIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogaW5wdXQgcGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKwlyYyA9IG1zbV9jZGNfY2hlY2tfc3VwcGx5X3BhcmFtKGRldiwgY2RjX3ZyZWcsIG51bV9zdXBwbGllcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltc21fY2RjX2Rpc2FibGVfc3RhdGljX3N1cHBsaWVzKGRldiwgc3VwcGxpZXMsIGNkY192cmVnLAorCQkJCQludW1fc3VwcGxpZXMpOworCWZvciAoaSA9IDA7IGkgPCBudW1fc3VwcGxpZXM7IGkrKykgeworCQlpZiAocmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKHN1cHBsaWVzW2ldLmNvbnN1bWVyKSA8IDApCisJCQljb250aW51ZTsKKworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc3VwcGxpZXNbaV0uY29uc3VtZXIsIDAsCisJCQkJICAgICAgY2RjX3ZyZWdbaV0ubWF4X3VWKTsKKwkJcmVndWxhdG9yX3NldF9sb2FkKHN1cHBsaWVzW2ldLmNvbnN1bWVyLCAwKTsKKwkJZGV2bV9yZWd1bGF0b3JfcHV0KHN1cHBsaWVzW2ldLmNvbnN1bWVyKTsKKwkJc3VwcGxpZXNbaV0uY29uc3VtZXIgPSBOVUxMOworCX0KKwlkZXZtX2tmcmVlKGRldiwgc3VwcGxpZXMpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMpOworCisvKgorICogbXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzOgorICoJRW5hYmxlIGNvZGVjIHN0YXRpYyBzdXBwbGllcworICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCisgKiBAc3VwcGxpZXM6IHBvaW50ZXIgdG8gcmVndWxhdG9yIGJ1bGsgZGF0YQorICogQGNkY192cmVnOiBwb2ludGVyIHRvIHBsYXRmb3JtIHJlZ3VsYXRvciBkYXRhCisgKiBAbnVtX3N1cHBsaWVzOiBudW1iZXIgb2Ygc3VwcGxpZXMKKyAqCisgKiBSZXR1cm4gZXJyb3IgY29kZSBpZiBzdXBwbHkgZW5hYmxlIGlzIGZhaWxlZAorICovCitpbnQgbXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCisJCQkJICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAorCQkJCSAgIGludCBudW1fc3VwcGxpZXMpCit7CisJaW50IHJjLCBpOworCisJaWYgKCghZGV2KSB8fCAoIXN1cHBsaWVzKSB8fCAoIWNkY192cmVnKSkgeworCQlwcl9lcnIoIiVzOiBlaXRoZXIgZGV2IG9yIHN1cHBsaWVzIG9yIGNkY192cmVnIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogaW5wdXQgcGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKwlyYyA9IG1zbV9jZGNfY2hlY2tfc3VwcGx5X3BhcmFtKGRldiwgY2RjX3ZyZWcsIG51bV9zdXBwbGllcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cHBsaWVzOyBpKyspIHsKKwkJaWYgKGNkY192cmVnW2ldLm9uZGVtYW5kKQorCQkJY29udGludWU7CisKKwkJcmMgPSByZWd1bGF0b3JfZW5hYmxlKHN1cHBsaWVzW2ldLmNvbnN1bWVyKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gZW5hYmxlIHN1cHBseSAlcywgcmM6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBzdXBwbGllc1tpXS5zdXBwbHksIHJjKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJd2hpbGUgKHJjICYmIGktLSkKKwkJaWYgKCFjZGNfdnJlZ1tpXS5vbmRlbWFuZCkKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKHN1cHBsaWVzW2ldLmNvbnN1bWVyKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzKTsKKworLyoKKyAqIG1zbV9jZGNfaW5pdF9zdXBwbGllczoKKyAqCUluaXRpYWxpemUgY29kZWMgc3RhdGljIHN1cHBsaWVzIHdpdGggcmVndWxhdG9yIGdldAorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCisgKiBAc3VwcGxpZXM6IHBvaW50ZXIgdG8gcmVndWxhdG9yIGJ1bGsgZGF0YQorICogQGNkY192cmVnOiBwb2ludGVyIHRvIHBsYXRmb3JtIHJlZ3VsYXRvciBkYXRhCisgKiBAbnVtX3N1cHBsaWVzOiBudW1iZXIgb2Ygc3VwcGxpZXMKKyAqCisgKiBSZXR1cm4gZXJyb3IgY29kZSBpZiBzdXBwbHkgaW5pdCBpcyBmYWlsZWQKKyAqLworaW50IG1zbV9jZGNfaW5pdF9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICoqc3VwcGxpZXMsCisJCQkgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKKwkJCSAgaW50IG51bV9zdXBwbGllcykKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqdnN1cDsKKwlpbnQgcmM7CisJaW50IGk7CisKKwlpZiAoIWRldiB8fCAhY2RjX3ZyZWcpIHsKKwkJcHJfZXJyKCIlczogZGV2aWNlIHBvaW50ZXIgb3IgZGNlX3ZyZWcgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCXJjID0gbXNtX2NkY19jaGVja19zdXBwbHlfcGFyYW0oZGV2LCBjZGNfdnJlZywgbnVtX3N1cHBsaWVzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXZzdXAgPSBkZXZtX2tjYWxsb2MoZGV2LCBudW1fc3VwcGxpZXMsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXZzdXApCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG51bV9zdXBwbGllczsgaSsrKSB7CisJCWlmICghY2RjX3ZyZWdbaV0ubmFtZSkgeworCQkJZGV2X2VycihkZXYsICIlczogc3VwcGx5IG5hbWUgbm90IGRlZmluZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJfc3VwcGx5OworCQl9CisJCXZzdXBbaV0uc3VwcGx5ID0gY2RjX3ZyZWdbaV0ubmFtZTsKKwl9CisKKwlyYyA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwgbnVtX3N1cHBsaWVzLCB2c3VwKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIGdldCBzdXBwbGllcyAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfc3VwcGx5OworCX0KKworCS8qIFNldCB2b2x0YWdlIGFuZCBjdXJyZW50IG9uIHJlZ3VsYXRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cHBsaWVzOyBpKyspIHsKKwkJaWYgKHJlZ3VsYXRvcl9jb3VudF92b2x0YWdlcyh2c3VwW2ldLmNvbnN1bWVyKSA8IDApCisJCQljb250aW51ZTsKKworCQlyYyA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZSh2c3VwW2ldLmNvbnN1bWVyLAorCQkJCQkgICBjZGNfdnJlZ1tpXS5taW5fdVYsCisJCQkJCSAgIGNkY192cmVnW2ldLm1heF91Vik7CisJCWlmIChyYykgeworCQkJZGV2X2VycihkZXYsICIlczogc2V0IHJlZ3VsYXRvciB2b2x0YWdlIGZhaWxlZCBmb3IgJXMsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgdnN1cFtpXS5zdXBwbHksIHJjKTsKKwkJCWdvdG8gZXJyX3NldF9zdXBwbHk7CisJCX0KKwkJcmMgPSByZWd1bGF0b3Jfc2V0X2xvYWQodnN1cFtpXS5jb25zdW1lciwKKwkJCQkJY2RjX3ZyZWdbaV0ub3B0aW11bV91QSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiJXM6IHNldCByZWd1bGF0b3Igb3B0aW11bSBtb2RlIGZhaWxlZCBmb3IgJXMsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgdnN1cFtpXS5zdXBwbHksIHJjKTsKKwkJCWdvdG8gZXJyX3NldF9zdXBwbHk7CisJCX0KKwl9CisKKwkqc3VwcGxpZXMgPSB2c3VwOworCisJcmV0dXJuIDA7CisKK2Vycl9zZXRfc3VwcGx5OgorCWZvciAoaSA9IDA7IGkgPCBudW1fc3VwcGxpZXM7IGkrKykKKwkJZGV2bV9yZWd1bGF0b3JfcHV0KHZzdXBbaV0uY29uc3VtZXIpOworZXJyX3N1cHBseToKKwlkZXZtX2tmcmVlKGRldiwgdnN1cCk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtc21fY2RjX2luaXRfc3VwcGxpZXMpOworCisvKgorICogbXNtX2NkY19nZXRfcG93ZXJfc3VwcGxpZXM6CisgKglHZXQgY29kZWMgcG93ZXIgc3VwcGxpZXMgZnJvbSBkZXZpY2UgdHJlZS4KKyAqCUFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHJlZ3VsYXRvciBkYXRhIGZvcgorICoJYWxsIHBvd2VyIHN1cHBsaWVzLgorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCisgKiBAY2RjX3ZyZWc6IHBvaW50ZXIgdG8gY29kZWMgcmVndWxhdG9yCisgKiBAdG90YWxfbnVtX3N1cHBsaWVzOiB0b3RhbCBudW1iZXIgb2Ygc3VwcGxpZXMgcmVhZCBmcm9tIERUCisgKgorICogUmV0dXJuIGVycm9yIGNvZGUgaWYgc3VwcGx5IGRpc2FibGUgaXMgZmFpbGVkCisgKi8KK2ludCBtc21fY2RjX2dldF9wb3dlcl9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKipjZGNfdnJlZywKKwkJCSAgICAgICBpbnQgKnRvdGFsX251bV9zdXBwbGllcykKK3sKKwljb25zdCBjaGFyICpzdGF0aWNfcHJvcF9uYW1lID0gInFjb20sY2RjLXN0YXRpYy1zdXBwbGllcyI7CisJY29uc3QgY2hhciAqb25kX3Byb3BfbmFtZSA9ICJxY29tLGNkYy1vbi1kZW1hbmQtc3VwcGxpZXMiOworCWNvbnN0IGNoYXIgKmNwX3Byb3BfbmFtZSA9ICJxY29tLGNkYy1jcC1zdXBwbGllcyI7CisJaW50IHN0YXRpY19zdXBfY250ID0gMDsKKwlpbnQgb25kX3N1cF9jbnQgPSAwOworCWludCBjcF9zdXBfY250ID0gMDsKKwlpbnQgbnVtX3N1cHBsaWVzID0gMDsKKwlzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3JlZzsKKwlpbnQgcmM7CisKKwlpZiAoIWRldikgeworCQlwcl9lcnIoIiVzOiBkZXZpY2UgcG9pbnRlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzdGF0aWNfc3VwX2NudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGV2LT5vZl9ub2RlLAorCQkJCQkJICAgc3RhdGljX3Byb3BfbmFtZSk7CisJaWYgKElTX0VSUl9WQUxVRShzdGF0aWNfc3VwX2NudCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogRmFpbGVkIHRvIGdldCBzdGF0aWMgc3VwcGxpZXMoJWQpXG4iLAorCQkJX19mdW5jX18sIHN0YXRpY19zdXBfY250KTsKKwkJcmMgPSBzdGF0aWNfc3VwX2NudDsKKwkJZ290byBlcnJfc3VwcGx5X2NudDsKKwl9CisJb25kX3N1cF9jbnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKGRldi0+b2Zfbm9kZSwgb25kX3Byb3BfbmFtZSk7CisJaWYgKElTX0VSUl9WQUxVRShvbmRfc3VwX2NudCkpCisJCW9uZF9zdXBfY250ID0gMDsKKworCWNwX3N1cF9jbnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAgICAgIGNwX3Byb3BfbmFtZSk7CisJaWYgKElTX0VSUl9WQUxVRShjcF9zdXBfY250KSkKKwkJY3Bfc3VwX2NudCA9IDA7CisKKwludW1fc3VwcGxpZXMgPSBzdGF0aWNfc3VwX2NudCArIG9uZF9zdXBfY250ICsgY3Bfc3VwX2NudDsKKwlpZiAobnVtX3N1cHBsaWVzIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICIlczogc3VwcGx5IGNvdW50IGlzIDAgb3IgbmVnYXRpdmVcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9zdXBwbHlfY250OworCX0KKworCWNkY19yZWcgPSBkZXZtX2tjYWxsb2MoZGV2LCBudW1fc3VwcGxpZXMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZGNfcmVndWxhdG9yKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNkY19yZWcpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW1fYWxsb2M7CisJfQorCisJcmMgPSBtc21fY2RjX3BhcnNlX3N1cHBsaWVzKGRldiwgY2RjX3JlZywgc3RhdGljX3Byb3BfbmFtZSwKKwkJCQkgICAgc3RhdGljX3N1cF9jbnQsIGZhbHNlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIHBhcnNlIHN0YXRpYyBzdXBwbGllcyglZClcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfc3VwOworCX0KKworCXJjID0gbXNtX2NkY19wYXJzZV9zdXBwbGllcyhkZXYsICZjZGNfcmVnW3N0YXRpY19zdXBfY250XSwKKwkJCQkgICAgb25kX3Byb3BfbmFtZSwgb25kX3N1cF9jbnQsCisJCQkJICAgIHRydWUpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gcGFyc2UgZGVtYW5kIHN1cHBsaWVzKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycl9zdXA7CisJfQorCisJcmMgPSBtc21fY2RjX3BhcnNlX3N1cHBsaWVzKGRldiwKKwkJCQkgICAgJmNkY19yZWdbc3RhdGljX3N1cF9jbnQgKyBvbmRfc3VwX2NudF0sCisJCQkJICAgIGNwX3Byb3BfbmFtZSwgY3Bfc3VwX2NudCwgdHJ1ZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBwYXJzZSBjcCBzdXBwbGllcyglZClcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfc3VwOworCX0KKworCSpjZGNfdnJlZyA9IGNkY19yZWc7CisJKnRvdGFsX251bV9zdXBwbGllcyA9IG51bV9zdXBwbGllczsKKworCXJldHVybiAwOworCitlcnJfc3VwOgorCWRldm1fa2ZyZWUoZGV2LCBjZGNfcmVnKTsKK2Vycl9zdXBwbHlfY250OgorZXJyX21lbV9hbGxvYzoKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9jZGNfZ2V0X3Bvd2VyX3N1cHBsaWVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDkzMzAtcmVnbWFwLmMgYi9kcml2ZXJzL21mZC93Y2Q5MzMwLXJlZ21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGVhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93Y2Q5MzMwLXJlZ21hcC5jCkBAIC0wLDAgKzEsOTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5MzMwX3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgIndjZDl4eHgtcmVnbWFwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmVnX2RlZmF1bHQgd2NkOTMzMF9kZWZhdWx0c1tdID0geworCXsgVE9NVE9NX0FfQ0hJUF9DVEwsIFRPTVRPTV9BX0NISVBfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NISVBfU1RBVFVTLCBUT01UT01fQV9DSElQX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DSElQX0lEX0JZVEVfMCwgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzBfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzEsIFRPTVRPTV9BX0NISVBfSURfQllURV8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NISVBfSURfQllURV8yLCBUT01UT01fQV9DSElQX0lEX0JZVEVfMl9fUE9SIH0sCisJeyBUT01UT01fQV9DSElQX0lEX0JZVEVfMywgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0hJUF9JMkNfU0xBVkVfSUQsIFRPTVRPTV9BX0NISVBfSTJDX1NMQVZFX0lEX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NMQVZFX0lEXzEsIFRPTVRPTV9BX1NMQVZFX0lEXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfU0xBVkVfSURfMiwgVE9NVE9NX0FfU0xBVkVfSURfMl9fUE9SIH0sCisJeyBUT01UT01fQV9TTEFWRV9JRF8zLCBUT01UT01fQV9TTEFWRV9JRF8zX19QT1IgfSwKKwl7IFRPTVRPTV9BX1BJTl9DVExfT0UwLCBUT01UT01fQV9QSU5fQ1RMX09FMF9fUE9SIH0sCisJeyBUT01UT01fQV9QSU5fQ1RMX09FMSwgVE9NVE9NX0FfUElOX0NUTF9PRTFfX1BPUiB9LAorCXsgVE9NVE9NX0FfUElOX0NUTF9PRTIsIFRPTVRPTV9BX1BJTl9DVExfT0UyX19QT1IgfSwKKwl7IFRPTVRPTV9BX1BJTl9DVExfREFUQTAsIFRPTVRPTV9BX1BJTl9DVExfREFUQTBfX1BPUiB9LAorCXsgVE9NVE9NX0FfUElOX0NUTF9EQVRBMSwgVE9NVE9NX0FfUElOX0NUTF9EQVRBMV9fUE9SIH0sCisJeyBUT01UT01fQV9QSU5fQ1RMX0RBVEEyLCBUT01UT01fQV9QSU5fQ1RMX0RBVEEyX19QT1IgfSwKKwl7IFRPTVRPTV9BX0hEUklWRV9HRU5FUklDLCBUT01UT01fQV9IRFJJVkVfR0VORVJJQ19fUE9SIH0sCisJeyBUT01UT01fQV9IRFJJVkVfT1ZFUlJJREUsIFRPTVRPTV9BX0hEUklWRV9PVkVSUklERV9fUE9SIH0sCisJeyBUT01UT01fQV9BTkFfQ1NSX1dBSVRfU1RBVEUsIFRPTVRPTV9BX0FOQV9DU1JfV0FJVF9TVEFURV9fUE9SIH0sCisJeyBUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMCwgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDBfX1BPUiB9LAorCXsgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDEsIFRPTVRPTV9BX1BST0NFU1NfTU9OSVRPUl9DVEwxX19QT1IgfSwKKwl7IFRPTVRPTV9BX1BST0NFU1NfTU9OSVRPUl9DVEwyLCBUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMl9fUE9SIH0sCisJeyBUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMywgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDNfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfQ1RMLCBUT01UT01fQV9RRlVTRV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfU1RBVFVTLCBUT01UT01fQV9RRlVTRV9TVEFUVVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQwLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDBfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQxLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDFfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQyLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDJfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQzLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDNfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ0LCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDRfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ1LCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDVfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ2LCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDZfX1BPUiB9LAorCXsgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ3LCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NUTCwgVE9NVE9NX0FfQ0RDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9MRUFLQUdFX0NUTCwgVE9NVE9NX0FfTEVBS0FHRV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjAsIFRPTVRPTV9BX1NWQVNTX01FTV9QVFIwX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX01FTV9QVFIxLCBUT01UT01fQV9TVkFTU19NRU1fUFRSMV9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19NRU1fUFRSMiwgVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjJfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfTUVNX0NUTCwgVE9NVE9NX0FfU1ZBU1NfTUVNX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19NRU1fQkFOSywgVE9NVE9NX0FfU1ZBU1NfTUVNX0JBTktfX1BPUiB9LAorCXsgVE9NVE9NX0FfRE1JQ19CMV9DVEwsIFRPTVRPTV9BX0RNSUNfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0RNSUNfQjJfQ1RMLCBUT01UT01fQV9ETUlDX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMLCBUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX0NQQVJfQ0ZHLCBUT01UT01fQV9TVkFTU19DUEFSX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19CVUZfUkRZX0lOVF9QRVJJT0QsCisJCQkJVE9NVE9NX0FfU1ZBU1NfQlVGX1JEWV9JTlRfUEVSSU9EX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX0NQQVJfV0RPR19DRkcsIFRPTVRPTV9BX1NWQVNTX0NQQVJfV0RPR19DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfQ0ZHLCBUT01UT01fQV9TVkFTU19DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX0NGRywgVE9NVE9NX0FfU1ZBU1NfU1BFX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19TVEFUVVMsIFRPTVRPTV9BX1NWQVNTX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19JTlRfTUFTSywgVE9NVE9NX0FfU1ZBU1NfSU5UX01BU0tfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfSU5UX1NUQVRVUywgVE9NVE9NX0FfU1ZBU1NfSU5UX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19JTlRfQ0xSLCBUT01UT01fQV9TVkFTU19JTlRfQ0xSX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX0RFQlVHLCBUT01UT01fQV9TVkFTU19ERUJVR19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19TUEVfQktVUF9JTlQsIFRPTVRPTV9BX1NWQVNTX1NQRV9CS1VQX0lOVF9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19NRU1fQUNDLCBUT01UT01fQV9TVkFTU19NRU1fQUNDX19QT1IgfSwKKwl7IFRPTVRPTV9BX01FTV9MRUFLQUdFX0NUTCwgVE9NVE9NX0FfTUVNX0xFQUtBR0VfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF9UUkcsIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF9UUkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzAsIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8wX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8xLCBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMV9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMiwgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzMsIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8zX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF80LCBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNF9fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNSwgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzVfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzYsIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF82X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF83LCBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfN19fUE9SIH0sCisJeyBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOCwgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzhfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzksIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF85X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8xMCwgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzEwX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8xMSwgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzExX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMCwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8wX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMSwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMiwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8yX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMywgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8zX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNCwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF80X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNSwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF81X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNiwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF82X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNywgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF83X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfOCwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF84X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfOSwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF85X19QT1IgfSwKKwl7IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMTAsIFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMTBfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xMSwgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xMV9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSX01PREUsIFRPTVRPTV9BX0lOVFJfTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9NQVNLMCwgVE9NVE9NX0FfSU5UUjFfTUFTSzBfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfTUFTSzEsIFRPTVRPTV9BX0lOVFIxX01BU0sxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0lOVFIxX01BU0syLCBUT01UT01fQV9JTlRSMV9NQVNLMl9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9NQVNLMywgVE9NVE9NX0FfSU5UUjFfTUFTSzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfU1RBVFVTMCwgVE9NVE9NX0FfSU5UUjFfU1RBVFVTMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9TVEFUVVMxLCBUT01UT01fQV9JTlRSMV9TVEFUVVMxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0lOVFIxX1NUQVRVUzIsIFRPTVRPTV9BX0lOVFIxX1NUQVRVUzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfU1RBVFVTMywgVE9NVE9NX0FfSU5UUjFfU1RBVFVTM19fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9DTEVBUjAsIFRPTVRPTV9BX0lOVFIxX0NMRUFSMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9DTEVBUjEsIFRPTVRPTV9BX0lOVFIxX0NMRUFSMV9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9DTEVBUjIsIFRPTVRPTV9BX0lOVFIxX0NMRUFSMl9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9DTEVBUjMsIFRPTVRPTV9BX0lOVFIxX0NMRUFSM19fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9MRVZFTDAsIFRPTVRPTV9BX0lOVFIxX0xFVkVMMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9MRVZFTDEsIFRPTVRPTV9BX0lOVFIxX0xFVkVMMV9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9MRVZFTDIsIFRPTVRPTV9BX0lOVFIxX0xFVkVMMl9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9MRVZFTDMsIFRPTVRPTV9BX0lOVFIxX0xFVkVMM19fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9URVNUMCwgVE9NVE9NX0FfSU5UUjFfVEVTVDBfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfVEVTVDEsIFRPTVRPTV9BX0lOVFIxX1RFU1QxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0lOVFIxX1RFU1QyLCBUT01UT01fQV9JTlRSMV9URVNUMl9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9URVNUMywgVE9NVE9NX0FfSU5UUjFfVEVTVDNfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfU0VUMCwgVE9NVE9NX0FfSU5UUjFfU0VUMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMV9TRVQxLCBUT01UT01fQV9JTlRSMV9TRVQxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0lOVFIxX1NFVDIsIFRPTVRPTV9BX0lOVFIxX1NFVDJfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjFfU0VUMywgVE9NVE9NX0FfSU5UUjFfU0VUM19fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMl9NQVNLMCwgVE9NVE9NX0FfSU5UUjJfTUFTSzBfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjJfU1RBVFVTMCwgVE9NVE9NX0FfSU5UUjJfU1RBVFVTMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMl9DTEVBUjAsIFRPTVRPTV9BX0lOVFIyX0NMRUFSMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMl9MRVZFTDAsIFRPTVRPTV9BX0lOVFIyX0xFVkVMMF9fUE9SIH0sCisJeyBUT01UT01fQV9JTlRSMl9URVNUMCwgVE9NVE9NX0FfSU5UUjJfVEVTVDBfX1BPUiB9LAorCXsgVE9NVE9NX0FfSU5UUjJfU0VUMCwgVE9NVE9NX0FfSU5UUjJfU0VUMF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFhfSTJTX1NDS19NT0RFLCBUT01UT01fQV9DRENfVFhfSTJTX1NDS19NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWF9JMlNfV1NfTU9ERSwgVE9NVE9NX0FfQ0RDX1RYX0kyU19XU19NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19ETUlDX0RBVEEwX01PREUsIFRPTVRPTV9BX0NEQ19ETUlDX0RBVEEwX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMF9NT0RFLCBUT01UT01fQV9DRENfRE1JQ19DTEswX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTFfTU9ERSwgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTFfTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfRE1JQ19DTEsxX01PREUsIFRPTVRPTV9BX0NEQ19ETUlDX0NMSzFfTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlhfSTJTX1NDS19NT0RFLCBUT01UT01fQV9DRENfUlhfSTJTX1NDS19NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWF9JMlNfV1NfTU9ERSwgVE9NVE9NX0FfQ0RDX1JYX0kyU19XU19NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19ETUlDX0RBVEEyX01PREUsIFRPTVRPTV9BX0NEQ19ETUlDX0RBVEEyX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMl9NT0RFLCBUT01UT01fQV9DRENfRE1JQ19DTEsyX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lOVFIxX01PREUsIFRPTVRPTV9BX0NEQ19JTlRSMV9NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TQl9OUlpfU0VMX01PREUsIFRPTVRPTV9BX0NEQ19TQl9OUlpfU0VMX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lOVFIyX01PREUsIFRPTVRPTV9BX0NEQ19JTlRSMl9NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SRl9QQV9PTl9NT0RFLCBUT01UT01fQV9DRENfUkZfUEFfT05fTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQk9PU1RfTU9ERSwgVE9NVE9NX0FfQ0RDX0JPT1NUX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0pUQ0tfTU9ERSwgVE9NVE9NX0FfQ0RDX0pUQ0tfTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSlRESV9NT0RFLCBUT01UT01fQV9DRENfSlRESV9NT0RFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19KVE1TX01PREUsIFRPTVRPTV9BX0NEQ19KVE1TX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0pURE9fTU9ERSwgVE9NVE9NX0FfQ0RDX0pURE9fTU9ERV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSlRSU1RfTU9ERSwgVE9NVE9NX0FfQ0RDX0pUUlNUX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0JJU1RfTU9ERV9NT0RFLCBUT01UT01fQV9DRENfQklTVF9NT0RFX01PREVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8xLCBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8yLCBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMSwgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8yLCBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8yX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzMsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNCwgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF81LCBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF81X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzYsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzZfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNywgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfN19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF84LCBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF84X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9QVFIsCisJCQkJVE9NVE9NX0FfQ0RDX01BRF9BVURJT19JSVJfQ1RMX1BUUl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMLAorCQkJCVRPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9WQUxfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8xLCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8yLCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8zLCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF80LCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzRfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF81LCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF82LCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzZfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF83LCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzEsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF8yLCBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMywgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzQsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF80X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF81LCBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNiwgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzZfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzcsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF83X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF84LCBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfOF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwKKwkJCQlUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCwKKwkJCQlUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUFEX0lOUF9TRUwsIFRPTVRPTV9BX0NEQ19NQURfSU5QX1NFTF9fUE9SIH0sCisJeyBUT01UT01fQV9CSUFTX1JFRl9DVEwsIFRPTVRPTV9BX0JJQVNfUkVGX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9CSUFTX0NFTlRSQUxfQkdfQ1RMLCBUT01UT01fQV9CSUFTX0NFTlRSQUxfQkdfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0JJQVNfUFJFQ0hSR19DVEwsIFRPTVRPTV9BX0JJQVNfUFJFQ0hSR19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQklBU19DVVJSX0NUTF8xLCBUT01UT01fQV9CSUFTX0NVUlJfQ1RMXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfQklBU19DVVJSX0NUTF8yLCBUT01UT01fQV9CSUFTX0NVUlJfQ1RMXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQklBU19PU0NfQkdfQ1RMLCBUT01UT01fQV9CSUFTX09TQ19CR19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0xLX0JVRkZfRU4xLCBUT01UT01fQV9DTEtfQlVGRl9FTjFfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0xLX0JVRkZfRU4yLCBUT01UT01fQV9DTEtfQlVGRl9FTjJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfTU9ERV8xLCBUT01UT01fQV9MRE9fTF9NT0RFXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfTU9ERV8yLCBUT01UT01fQV9MRE9fTF9NT0RFXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfQ1RSTF8xLCBUT01UT01fQV9MRE9fTF9DVFJMXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfQ1RSTF8yLCBUT01UT01fQV9MRE9fTF9DVFJMXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfQ1RSTF8zLCBUT01UT01fQV9MRE9fTF9DVFJMXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0xfQ1RSTF80LCBUT01UT01fQV9MRE9fTF9DVFJMXzRfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0hfTU9ERV8xLCBUT01UT01fQV9MRE9fSF9NT0RFXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0hfTU9ERV8yLCBUT01UT01fQV9MRE9fSF9NT0RFXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTERPX0hfTE9PUF9DVEwsIFRPTVRPTV9BX0xET19IX0xPT1BfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0xET19IX0NPTVBfMSwgVE9NVE9NX0FfTERPX0hfQ09NUF8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX0xET19IX0NPTVBfMiwgVE9NVE9NX0FfTERPX0hfQ09NUF8yX19QT1IgfSwKKwl7IFRPTVRPTV9BX0xET19IX0JJQVNfMSwgVE9NVE9NX0FfTERPX0hfQklBU18xX19QT1IgfSwKKwl7IFRPTVRPTV9BX0xET19IX0JJQVNfMiwgVE9NVE9NX0FfTERPX0hfQklBU18yX19QT1IgfSwKKwl7IFRPTVRPTV9BX0xET19IX0JJQVNfMywgVE9NVE9NX0FfTERPX0hfQklBU18zX19QT1IgfSwKKwl7IFRPTVRPTV9BX1ZCQVRfQ0xLLCBUT01UT01fQV9WQkFUX0NMS19fUE9SIH0sCisJeyBUT01UT01fQV9WQkFUX0xPT1AsIFRPTVRPTV9BX1ZCQVRfTE9PUF9fUE9SIH0sCisJeyBUT01UT01fQV9WQkFUX1JFRiwgVE9NVE9NX0FfVkJBVF9SRUZfX1BPUiB9LAorCXsgVE9NVE9NX0FfVkJBVF9BRENfVEVTVCwgVE9NVE9NX0FfVkJBVF9BRENfVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9WQkFUX0ZFLCBUT01UT01fQV9WQkFUX0ZFX19QT1IgfSwKKwl7IFRPTVRPTV9BX1ZCQVRfQklBU18xLCBUT01UT01fQV9WQkFUX0JJQVNfMV9fUE9SIH0sCisJeyBUT01UT01fQV9WQkFUX0JJQVNfMiwgVE9NVE9NX0FfVkJBVF9CSUFTXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfVkJBVF9BRENfREFUQV9NU0IsIFRPTVRPTV9BX1ZCQVRfQURDX0RBVEFfTVNCX19QT1IgfSwKKwl7IFRPTVRPTV9BX1ZCQVRfQURDX0RBVEFfTFNCLCBUT01UT01fQV9WQkFUX0FEQ19EQVRBX0xTQl9fUE9SIH0sCisJeyBUT01UT01fQV9GTExfTlJFRiwgVE9NVE9NX0FfRkxMX05SRUZfX1BPUiB9LAorCXsgVE9NVE9NX0FfRkxMX0tEQ09fVFVORSwgVE9NVE9NX0FfRkxMX0tEQ09fVFVORV9fUE9SIH0sCisJeyBUT01UT01fQV9GTExfTE9DS19USFJFU0gsIFRPTVRPTV9BX0ZMTF9MT0NLX1RIUkVTSF9fUE9SIH0sCisJeyBUT01UT01fQV9GTExfTE9DS19ERVRfQ09VTlQsIFRPTVRPTV9BX0ZMTF9MT0NLX0RFVF9DT1VOVF9fUE9SIH0sCisJeyBUT01UT01fQV9GTExfREFDX1RIUkVTSE9MRCwgVE9NVE9NX0FfRkxMX0RBQ19USFJFU0hPTERfX1BPUiB9LAorCXsgVE9NVE9NX0FfRkxMX1RFU1RfRENPX0ZSRUVSVU4sIFRPTVRPTV9BX0ZMTF9URVNUX0RDT19GUkVFUlVOX19QT1IgfSwKKwl7IFRPTVRPTV9BX0ZMTF9URVNUX0VOQUJMRSwgVE9NVE9NX0FfRkxMX1RFU1RfRU5BQkxFX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9DVEwsIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl9DRklMVF8xX1ZBTCwgVE9NVE9NX0FfTUlDQl9DRklMVF8xX1ZBTF9fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCX0NGSUxUXzFfUFJFQ0hSRywgVE9NVE9NX0FfTUlDQl9DRklMVF8xX1BSRUNIUkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl8xX0NUTCwgVE9NVE9NX0FfTUlDQl8xX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCXzFfSU5UX1JCSUFTLCBUT01UT01fQV9NSUNCXzFfSU5UX1JCSUFTX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfMV9NQkhDLCBUT01UT01fQV9NSUNCXzFfTUJIQ19fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCX0NGSUxUXzJfQ1RMLCBUT01UT01fQV9NSUNCX0NGSUxUXzJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUwsIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUxfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl9DRklMVF8yX1BSRUNIUkcsIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9QUkVDSFJHX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfMl9DVEwsIFRPTVRPTV9BX01JQ0JfMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl8yX0lOVF9SQklBUywgVE9NVE9NX0FfTUlDQl8yX0lOVF9SQklBU19fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCXzJfTUJIQywgVE9NVE9NX0FfTUlDQl8yX01CSENfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl9DRklMVF8zX0NUTCwgVE9NVE9NX0FfTUlDQl9DRklMVF8zX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCX0NGSUxUXzNfVkFMLCBUT01UT01fQV9NSUNCX0NGSUxUXzNfVkFMX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfM19QUkVDSFJHLCBUT01UT01fQV9NSUNCX0NGSUxUXzNfUFJFQ0hSR19fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCXzNfQ1RMLCBUT01UT01fQV9NSUNCXzNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVMsIFRPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl8zX01CSEMsIFRPTVRPTV9BX01JQ0JfM19NQkhDX19QT1IgfSwKKwl7IFRPTVRPTV9BX01JQ0JfNF9DVEwsIFRPTVRPTV9BX01JQ0JfNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUlDQl80X0lOVF9SQklBUywgVE9NVE9NX0FfTUlDQl80X0lOVF9SQklBU19fUE9SIH0sCisJeyBUT01UT01fQV9NSUNCXzRfTUJIQywgVE9NVE9NX0FfTUlDQl80X01CSENfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX0VOLCBUT01UT01fQV9TUEtSX0RSVjJfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX0dBSU4sIFRPTVRPTV9BX1NQS1JfRFJWMl9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMl9EQUNfQ1RMLCBUT01UT01fQV9TUEtSX0RSVjJfREFDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjJfT0NQX0NUTCwgVE9NVE9NX0FfU1BLUl9EUlYyX09DUF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX0NMSVBfREVULCBUT01UT01fQV9TUEtSX0RSVjJfQ0xJUF9ERVRfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19EQUMsIFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfREFDX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUEEsIFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUEFfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19QV1JTVEcsIFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUFdSU1RHX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0xETywgVE9NVE9NX0FfU1BLUl9EUlYyX0JJQVNfTERPX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0lOVCwgVE9NVE9NX0FfU1BLUl9EUlYyX0JJQVNfSU5UX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX1BBLCBUT01UT01fQV9TUEtSX0RSVjJfQklBU19QQV9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjJfU1RBVFVTX09DUCwgVE9NVE9NX0FfU1BLUl9EUlYyX1NUQVRVU19PQ1BfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYyX1NUQVRVU19QQSwgVE9NVE9NX0FfU1BLUl9EUlYyX1NUQVRVU19QQV9fUE9SIH0sCisJeyBUT01UT01fQV9NQkhDX0lOU0VSVF9ERVRFQ1QsIFRPTVRPTV9BX01CSENfSU5TRVJUX0RFVEVDVF9fUE9SIH0sCisJeyBUT01UT01fQV9NQkhDX0lOU0VSVF9ERVRfU1RBVFVTLAorCQkJCVRPTVRPTV9BX01CSENfSU5TRVJUX0RFVF9TVEFUVVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfQ09NX0JJQVMsIFRPTVRPTV9BX1RYX0NPTV9CSUFTX19QT1IgfSwKKwl7IFRPTVRPTV9BX01CSENfSU5TRVJUX0RFVEVDVDIsIFRPTVRPTV9BX01CSENfSU5TRVJUX0RFVEVDVDJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUJIQ19TQ0FMSU5HX01VWF8xLCBUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUJIQ19TQ0FMSU5HX01VWF8yLCBUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUFEX0FOQV9DVFJMLCBUT01UT01fQV9NQURfQU5BX0NUUkxfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzEsIFRPTVRPTV9BX1RYX1NVUF9TV0lUQ0hfQ1RSTF8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYX1NVUF9TV0lUQ0hfQ1RSTF8yLCBUT01UT01fQV9UWF9TVVBfU1dJVENIX0NUUkxfMl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8xX0dBSU4sIFRPTVRPTV9BX1RYXzFfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8xXzJfVEVTVF9FTiwgVE9NVE9NX0FfVFhfMV8yX1RFU1RfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfMl9HQUlOLCBUT01UT01fQV9UWF8yX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfMV8yX0FEQ19JQiwgVE9NVE9NX0FfVFhfMV8yX0FEQ19JQl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8xXzJfQVRFU1RfUkVGQ1RSTCwgVE9NVE9NX0FfVFhfMV8yX0FURVNUX1JFRkNUUkxfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfMV8yX1RFU1RfQ1RMLCBUT01UT01fQV9UWF8xXzJfVEVTVF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfMV8yX1RFU1RfQkxPQ0tfRU4sIFRPTVRPTV9BX1RYXzFfMl9URVNUX0JMT0NLX0VOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzFfMl9UWEZFX0NMS0RJViwgVE9NVE9NX0FfVFhfMV8yX1RYRkVfQ0xLRElWX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzFfMl9TQVJfRVJSX0NIMSwgVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gxX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzFfMl9TQVJfRVJSX0NIMiwgVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gyX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzNfR0FJTiwgVE9NVE9NX0FfVFhfM19HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzNfNF9URVNUX0VOLCBUT01UT01fQV9UWF8zXzRfVEVTVF9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF80X0dBSU4sIFRPTVRPTV9BX1RYXzRfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8zXzRfQURDX0lCLCBUT01UT01fQV9UWF8zXzRfQURDX0lCX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzNfNF9BVEVTVF9SRUZDVFJMLCBUT01UT01fQV9UWF8zXzRfQVRFU1RfUkVGQ1RSTF9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8zXzRfVEVTVF9DVEwsIFRPTVRPTV9BX1RYXzNfNF9URVNUX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9UWF8zXzRfVEVTVF9CTE9DS19FTiwgVE9NVE9NX0FfVFhfM180X1RFU1RfQkxPQ0tfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfM180X1RYRkVfQ0tESVYsIFRPTVRPTV9BX1RYXzNfNF9UWEZFX0NLRElWX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzNfNF9TQVJfRVJSX0NIMywgVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0gzX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzNfNF9TQVJfRVJSX0NINCwgVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0g0X19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzVfR0FJTiwgVE9NVE9NX0FfVFhfNV9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzVfNl9URVNUX0VOLCBUT01UT01fQV9UWF81XzZfVEVTVF9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF82X0dBSU4sIFRPTVRPTV9BX1RYXzZfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9UWF81XzZfQURDX0lCLCBUT01UT01fQV9UWF81XzZfQURDX0lCX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzVfNl9BVEVTVF9SRUZDVFJMLCBUT01UT01fQV9UWF81XzZfQVRFU1RfUkVGQ1RSTF9fUE9SIH0sCisJeyBUT01UT01fQV9UWF81XzZfVEVTVF9DVEwsIFRPTVRPTV9BX1RYXzVfNl9URVNUX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9UWF81XzZfVEVTVF9CTE9DS19FTiwgVE9NVE9NX0FfVFhfNV82X1RFU1RfQkxPQ0tfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfNV82X1RYRkVfQ0tESVYsIFRPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzVfNl9TQVJfRVJSX0NINSwgVE9NVE9NX0FfVFhfNV82X1NBUl9FUlJfQ0g1X19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzVfNl9TQVJfRVJSX0NINiwgVE9NVE9NX0FfVFhfNV82X1NBUl9FUlJfQ0g2X19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzdfTUJIQ19FTiwgVE9NVE9NX0FfVFhfN19NQkhDX0VOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzdfTUJIQ19BVEVTVF9SRUZDVFJMLAorCQkJCVRPTVRPTV9BX1RYXzdfTUJIQ19BVEVTVF9SRUZDVFJMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzdfTUJIQ19BREMsIFRPTVRPTV9BX1RYXzdfTUJIQ19BRENfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfN19NQkhDX1RFU1RfQ1RMLCBUT01UT01fQV9UWF83X01CSENfVEVTVF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfVFhfN19NQkhDX1NBUl9FUlIsIFRPTVRPTV9BX1RYXzdfTUJIQ19TQVJfRVJSX19QT1IgfSwKKwl7IFRPTVRPTV9BX1RYXzdfVFhGRV9DTEtESVYsIFRPTVRPTV9BX1RYXzdfVFhGRV9DTEtESVZfX1BPUiB9LAorCXsgVE9NVE9NX0FfUkNPX0NUUkwsIFRPTVRPTV9BX1JDT19DVFJMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMSwgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwxX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMiwgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwyX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMywgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwzX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JDT19URVNUX0NUUkwsIFRPTVRPTV9BX1JDT19URVNUX0NUUkxfX1BPUiB9LAorCXsgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDEsCisJCQkJVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDFfX1BPUiB9LAorCXsgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDIsCisJCQkJVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQlVDS19NT0RFXzEsIFRPTVRPTV9BX0JVQ0tfTU9ERV8xX19QT1IgfSwKKwl7IFRPTVRPTV9BX0JVQ0tfTU9ERV8yLCBUT01UT01fQV9CVUNLX01PREVfMl9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX01PREVfMywgVE9NVE9NX0FfQlVDS19NT0RFXzNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQlVDS19NT0RFXzQsIFRPTVRPTV9BX0JVQ0tfTU9ERV80X19QT1IgfSwKKwl7IFRPTVRPTV9BX0JVQ0tfTU9ERV81LCBUT01UT01fQV9CVUNLX01PREVfNV9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfVkNMXzEsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMV9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfVkNMXzIsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMl9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfVkNMXzMsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfM19fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzEsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMV9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzIsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMl9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzMsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfM19fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzQsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfNF9fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMSwgVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzIsIFRPTVRPTV9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8yX19QT1IgfSwKKwl7IFRPTVRPTV9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8zLCBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfM19fUE9SIH0sCisJeyBUT01UT01fQV9CVUNLX1RNVVhfQV9ELCBUT01UT01fQV9CVUNLX1RNVVhfQV9EX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9CVUNLUkVGLCBUT01UT01fQV9OQ1BfQlVDS1JFRl9fUE9SIH0sCisJeyBUT01UT01fQV9OQ1BfRU4sIFRPTVRPTV9BX05DUF9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9OQ1BfQ0xLLCBUT01UT01fQV9OQ1BfQ0xLX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9TVEFUSUMsIFRPTVRPTV9BX05DUF9TVEFUSUNfX1BPUiB9LAorCXsgVE9NVE9NX0FfTkNQX1ZUSF9MT1csIFRPTVRPTV9BX05DUF9WVEhfTE9XX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9WVEhfSElHSCwgVE9NVE9NX0FfTkNQX1ZUSF9ISUdIX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9BVEVTVCwgVE9NVE9NX0FfTkNQX0FURVNUX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9EVEVTVCwgVE9NVE9NX0FfTkNQX0RURVNUX19QT1IgfSwKKwl7IFRPTVRPTV9BX05DUF9ETFkxLCBUT01UT01fQV9OQ1BfRExZMV9fUE9SIH0sCisJeyBUT01UT01fQV9OQ1BfRExZMiwgVE9NVE9NX0FfTkNQX0RMWTJfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfQVVYX1NXX0NUTCwgVE9NVE9NX0FfUlhfQVVYX1NXX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTiwgVE9NVE9NX0FfUlhfUEFfQVVYX0lOX0NPTk5fX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfQ09NX1RJTUVSX0RJViwgVE9NVE9NX0FfUlhfQ09NX1RJTUVSX0RJVl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9DT01fT0NQX0NUTCwgVE9NVE9NX0FfUlhfQ09NX09DUF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfQ09NX09DUF9DT1VOVCwgVE9NVE9NX0FfUlhfQ09NX09DUF9DT1VOVF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9DT01fREFDX0NUTCwgVE9NVE9NX0FfUlhfQ09NX0RBQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfQ09NX0JJQVMsIFRPTVRPTV9BX1JYX0NPTV9CSUFTX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9BVVRPX0NIT1AsIFRPTVRPTV9BX1JYX0hQSF9BVVRPX0NIT1BfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX0NIT1BfQ1RMLCBUT01UT01fQV9SWF9IUEhfQ0hPUF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX0JJQVNfUEEsIFRPTVRPTV9BX1JYX0hQSF9CSUFTX1BBX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9CSUFTX0xETywgVE9NVE9NX0FfUlhfSFBIX0JJQVNfTERPX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9CSUFTX0NOUCwgVE9NVE9NX0FfUlhfSFBIX0JJQVNfQ05QX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9CSUFTX1dHX09DUCwgVE9NVE9NX0FfUlhfSFBIX0JJQVNfV0dfT0NQX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMLCBUT01UT01fQV9SWF9IUEhfT0NQX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9IUEhfQ05QX0VOLCBUT01UT01fQV9SWF9IUEhfQ05QX0VOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9DTlBfV0dfQ1RMLCBUT01UT01fQV9SWF9IUEhfQ05QX1dHX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9IUEhfQ05QX1dHX1RJTUUsIFRPTVRPTV9BX1JYX0hQSF9DTlBfV0dfVElNRV9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9IUEhfTF9HQUlOLCBUT01UT01fQV9SWF9IUEhfTF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9MX1RFU1QsIFRPTVRPTV9BX1JYX0hQSF9MX1RFU1RfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX0xfUEFfQ1RMLCBUT01UT01fQV9SWF9IUEhfTF9QQV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX0xfREFDX0NUTCwgVE9NVE9NX0FfUlhfSFBIX0xfREFDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9IUEhfTF9BVEVTVCwgVE9NVE9NX0FfUlhfSFBIX0xfQVRFU1RfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX0xfU1RBVFVTLCBUT01UT01fQV9SWF9IUEhfTF9TVEFUVVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX1JfR0FJTiwgVE9NVE9NX0FfUlhfSFBIX1JfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9IUEhfUl9URVNULCBUT01UT01fQV9SWF9IUEhfUl9URVNUX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9SX1BBX0NUTCwgVE9NVE9NX0FfUlhfSFBIX1JfUEFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9SX0RBQ19DVEwsIFRPTVRPTV9BX1JYX0hQSF9SX0RBQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfSFBIX1JfQVRFU1QsIFRPTVRPTV9BX1JYX0hQSF9SX0FURVNUX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0hQSF9SX1NUQVRVUywgVE9NVE9NX0FfUlhfSFBIX1JfU1RBVFVTX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0VBUl9CSUFTX1BBLCBUT01UT01fQV9SWF9FQVJfQklBU19QQV9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfQklBU19DTUJVRkYsIFRPTVRPTV9BX1JYX0VBUl9CSUFTX0NNQlVGRl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfRU4sIFRPTVRPTV9BX1JYX0VBUl9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfR0FJTiwgVE9NVE9NX0FfUlhfRUFSX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfRUFSX0NNQlVGRiwgVE9NVE9NX0FfUlhfRUFSX0NNQlVGRl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfSUNUTCwgVE9NVE9NX0FfUlhfRUFSX0lDVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfRUFSX0NDT01QLCBUT01UT01fQV9SWF9FQVJfQ0NPTVBfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfRUFSX1ZDTSwgVE9NVE9NX0FfUlhfRUFSX1ZDTV9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfQ05QLCBUT01UT01fQV9SWF9FQVJfQ05QX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0VBUl9EQUNfQ1RMX0FURVNULCBUT01UT01fQV9SWF9FQVJfREFDX0NUTF9BVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9FQVJfU1RBVFVTLCBUT01UT01fQV9SWF9FQVJfU1RBVFVTX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfQklBU19QQSwgVE9NVE9NX0FfUlhfTElORV9CSUFTX1BBX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0JVQ0tfQklBUzEsIFRPTVRPTV9BX1JYX0JVQ0tfQklBUzFfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfQlVDS19CSUFTMiwgVE9NVE9NX0FfUlhfQlVDS19CSUFTMl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FX0NPTSwgVE9NVE9NX0FfUlhfTElORV9DT01fX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV9DTlBfRU4sIFRPTVRPTV9BX1JYX0xJTkVfQ05QX0VOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfQ05QX1dHX0NUTCwgVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfQ05QX1dHX1RJTUUsIFRPTVRPTV9BX1JYX0xJTkVfQ05QX1dHX1RJTUVfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV8xX0dBSU4sIFRPTVRPTV9BX1JYX0xJTkVfMV9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfMV9URVNULCBUT01UT01fQV9SWF9MSU5FXzFfVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FXzFfREFDX0NUTCwgVE9NVE9NX0FfUlhfTElORV8xX0RBQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV8xX1NUQVRVUywgVE9NVE9NX0FfUlhfTElORV8xX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FXzJfR0FJTiwgVE9NVE9NX0FfUlhfTElORV8yX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV8yX1RFU1QsIFRPTVRPTV9BX1JYX0xJTkVfMl9URVNUX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfMl9EQUNfQ1RMLCBUT01UT01fQV9SWF9MSU5FXzJfREFDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FXzJfU1RBVFVTLCBUT01UT01fQV9SWF9MSU5FXzJfU1RBVFVTX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfM19HQUlOLCBUT01UT01fQV9SWF9MSU5FXzNfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FXzNfVEVTVCwgVE9NVE9NX0FfUlhfTElORV8zX1RFU1RfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV8zX0RBQ19DVEwsIFRPTVRPTV9BX1JYX0xJTkVfM19EQUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfM19TVEFUVVMsIFRPTVRPTV9BX1JYX0xJTkVfM19TVEFUVVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV80X0dBSU4sIFRPTVRPTV9BX1JYX0xJTkVfNF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX1JYX0xJTkVfNF9URVNULCBUT01UT01fQV9SWF9MSU5FXzRfVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FXzRfREFDX0NUTCwgVE9NVE9NX0FfUlhfTElORV80X0RBQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfUlhfTElORV80X1NUQVRVUywgVE9NVE9NX0FfUlhfTElORV80X1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9SWF9MSU5FX0NOUF9EQkcsIFRPTVRPTV9BX1JYX0xJTkVfQ05QX0RCR19fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfRU4sIFRPTVRPTV9BX1NQS1JfRFJWMV9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfR0FJTiwgVE9NVE9NX0FfU1BLUl9EUlYxX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYxX0RBQ19DVEwsIFRPTVRPTV9BX1NQS1JfRFJWMV9EQUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMLCBUT01UT01fQV9TUEtSX0RSVjFfT0NQX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfQ0xJUF9ERVQsIFRPTVRPTV9BX1NQS1JfRFJWMV9DTElQX0RFVF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfSUVDLCBUT01UT01fQV9TUEtSX0RSVjFfSUVDX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfREFDLCBUT01UT01fQV9TUEtSX0RSVjFfREJHX0RBQ19fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfREJHX1BBLCBUT01UT01fQV9TUEtSX0RSVjFfREJHX1BBX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUFdSU1RHLCBUT01UT01fQV9TUEtSX0RSVjFfREJHX1BXUlNUR19fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfQklBU19MRE8sIFRPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0xET19fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfQklBU19JTlQsIFRPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0lOVF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSX0RSVjFfQklBU19QQSwgVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfUEFfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19PQ1AsIFRPTVRPTV9BX1NQS1JfRFJWMV9TVEFUVVNfT0NQX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1JfRFJWMV9TVEFUVVNfUEEsIFRPTVRPTV9BX1NQS1JfRFJWMV9TVEFUVVNfUEFfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUjFfUFJPVF9FTiwgVE9NVE9NX0FfU1BLUjFfUFJPVF9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMV9QUk9UX0FEQ19URVNUX0VOLAorCQkJCVRPTVRPTV9BX1NQS1IxX1BST1RfQURDX1RFU1RfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUjFfUFJPVF9BVEVTVCwgVE9NVE9NX0FfU1BLUjFfUFJPVF9BVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMV9QUk9UX0xET19DVFJMLCBUT01UT01fQV9TUEtSMV9QUk9UX0xET19DVFJMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1IxX1BST1RfSVNFTlNFX0NUUkwsCisJCQkJVE9NVE9NX0FfU1BLUjFfUFJPVF9JU0VOU0VfQ1RSTF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMV9QUk9UX1ZTRU5TRV9DVFJMLAorCQkJCVRPTVRPTV9BX1NQS1IxX1BST1RfVlNFTlNFX0NUUkxfX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUjJfUFJPVF9FTiwgVE9NVE9NX0FfU1BLUjJfUFJPVF9FTl9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMl9QUk9UX0FEQ19URVNUX0VOLAorCQkJCVRPTVRPTV9BX1NQS1IyX1BST1RfQURDX1RFU1RfRU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfU1BLUjJfUFJPVF9BVEVTVCwgVE9NVE9NX0FfU1BLUjJfUFJPVF9BVEVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMl9QUk9UX0xET19DVFJMLCBUT01UT01fQV9TUEtSMl9QUk9UX0xET19DVFJMX19QT1IgfSwKKwl7IFRPTVRPTV9BX1NQS1IyX1BST1RfSVNFTlNFX0NUUkwsCisJCQkJVE9NVE9NX0FfU1BLUjJfUFJPVF9JU0VOU0VfQ1RSTF9fUE9SIH0sCisJeyBUT01UT01fQV9TUEtSMl9QUk9UX1ZTRU5TRV9DVFJMLAorCQkJCVRPTVRPTV9BX1NQS1IyX1BST1RfVlNFTlNFX0NUUkxfX1BPUiB9LAorCXsgVE9NVE9NX0FfTUJIQ19IUEgsIFRPTVRPTV9BX01CSENfSFBIX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzFfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMyX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX1NISUZULCBUT01UT01fQV9DRENfQU5DMV9TSElGVF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMl9TSElGVCwgVE9NVE9NX0FfQ0RDX0FOQzJfU0hJRlRfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMl9JSVJfQjFfQ1RMLCBUT01UT01fQV9DRENfQU5DMl9JSVJfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX0lJUl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19BTkMxX0lJUl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMV9JSVJfQjNfQ1RMLCBUT01UT01fQV9DRENfQU5DMV9JSVJfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CM19DVEwsIFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMl9MUEZfQjFfQ1RMLCBUT01UT01fQV9DRENfQU5DMl9MUEZfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzJfTFBGX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfTFBGX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMV9TUEFSRSwgVE9NVE9NX0FfQ0RDX0FOQzFfU1BBUkVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzJfU1BBUkUsIFRPTVRPTV9BX0NEQ19BTkMyX1NQQVJFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX1NNTFBGX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzFfU01MUEZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMyX1NNTFBGX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfU01MUEZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX0RDRkxUX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzFfRENGTFRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMyX0RDRkxUX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfRENGTFRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19BTkMxX0dBSU5fQ1RMLCBUT01UT01fQV9DRENfQU5DMV9HQUlOX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQU5DMl9HQUlOX0NUTCwgVE9NVE9NX0FfQ0RDX0FOQzJfR0FJTl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzFfQjJfQ1RMLCBUT01UT01fQV9DRENfQU5DMV9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0FOQzJfQjJfQ1RMLCBUT01UT01fQV9DRENfQU5DMl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMV9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNF9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYN19WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX1RJTUVSLCBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfVElNRVJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMTBfVk9MX0NUTF9USU1FUiwKKwkJCQlUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX1RJTUVSX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOLCBUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfR0FJTiwgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0dBSU4sIFRPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOLCBUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfR0FJTiwgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0dBSU4sIFRPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOLCBUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfR0FJTl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfR0FJTiwgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU5fX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0dBSU4sIFRPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTiwgVE9NVE9NX0FfQ0RDX1RYMTBfVk9MX0NUTF9HQUlOX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkcsIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGRywgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfQ0ZHLCBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfQ0ZHX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9DRkcsIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGRywgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfQ0ZHLCBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfQ0ZHX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9DRkcsIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGRywgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfQ0ZHLCBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfQ0ZHX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfQ0ZHLCBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgxX01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgyX01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDJfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgzX01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDNfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg0X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDRfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg1X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDVfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg2X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDZfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg3X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDdfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg4X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDhfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg5X01VWF9DVEwsIFRPTVRPTV9BX0NEQ19UWDlfTVVYX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMLCBUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDFfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYMV9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDJfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYMl9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDNfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYM19DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDRfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYNF9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDVfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYNV9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDZfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYNl9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDdfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYN19DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDhfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYOF9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDlfQ0xLX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1RYOV9DTEtfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDEwX0NMS19GU19DVEwsIFRPTVRPTV9BX0NEQ19UWDEwX0NMS19GU19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTCwgVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMLCBUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDNfRE1JQ19DVEwsIFRPTVRPTV9BX0NEQ19UWDNfRE1JQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTCwgVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMLCBUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDZfRE1JQ19DVEwsIFRPTVRPTV9BX0NEQ19UWDZfRE1JQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTCwgVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMLCBUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UWDlfRE1JQ19DVEwsIFRPTVRPTV9BX0NEQ19UWDlfRE1JQ19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1RYMTBfRE1JQ19DVEwsIFRPTVRPTV9BX0NEQ19UWDEwX0RNSUNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMCwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwwX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMSwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMiwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMywgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwzX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNCwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw0X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNSwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNiwgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw2X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNywgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw3X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19ERUJVR19CMV9DVEwsIFRPTVRPTV9BX0NEQ19ERUJVR19CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0RFQlVHX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0RFQlVHX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfREVCVUdfQjNfQ1RMLCBUT01UT01fQV9DRENfREVCVUdfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19ERUJVR19CNF9DVEwsIFRPTVRPTV9BX0NEQ19ERUJVR19CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0RFQlVHX0I1X0NUTCwgVE9NVE9NX0FfQ0RDX0RFQlVHX0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfREVCVUdfQjZfQ1RMLCBUT01UT01fQV9DRENfREVCVUdfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19ERUJVR19CN19DVEwsIFRPTVRPTV9BX0NEQ19ERUJVR19CN19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NSQzFfUERBX0NGRywgVE9NVE9NX0FfQ0RDX1NSQzFfUERBX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfU1JDMl9QREFfQ0ZHLCBUT01UT01fQV9DRENfU1JDMl9QREFfQ0ZHX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUkMxX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1NSQzFfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUkMyX0ZTX0NUTCwgVE9NVE9NX0FfQ0RDX1NSQzJfRlNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDFfQjFfQ1RMLCBUT01UT01fQV9DRENfUlgxX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgyX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX1JYMl9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYM19CMV9DVEwsIFRPTVRPTV9BX0NEQ19SWDNfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDRfQjFfQ1RMLCBUT01UT01fQV9DRENfUlg0X0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg1X0IxX0NUTCwgVE9NVE9NX0FfQ0RDX1JYNV9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNl9CMV9DVEwsIFRPTVRPTV9BX0NEQ19SWDZfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDdfQjFfQ1RMLCBUT01UT01fQV9DRENfUlg3X0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgxX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX1JYMV9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYMl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19SWDJfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDNfQjJfQ1RMLCBUT01UT01fQV9DRENfUlgzX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg0X0IyX0NUTCwgVE9NVE9NX0FfQ0RDX1JYNF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNV9CMl9DVEwsIFRPTVRPTV9BX0NEQ19SWDVfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDZfQjJfQ1RMLCBUT01UT01fQV9DRENfUlg2X0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg3X0IyX0NUTCwgVE9NVE9NX0FfQ0RDX1JYN19CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYMV9CM19DVEwsIFRPTVRPTV9BX0NEQ19SWDFfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDJfQjNfQ1RMLCBUT01UT01fQV9DRENfUlgyX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgzX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX1JYM19CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNF9CM19DVEwsIFRPTVRPTV9BX0NEQ19SWDRfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDVfQjNfQ1RMLCBUT01UT01fQV9DRENfUlg1X0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg2X0IzX0NUTCwgVE9NVE9NX0FfQ0RDX1JYNl9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYN19CM19DVEwsIFRPTVRPTV9BX0NEQ19SWDdfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMLCBUT01UT01fQV9DRENfUlgxX0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgyX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX1JYMl9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYM19CNF9DVEwsIFRPTVRPTV9BX0NEQ19SWDNfQjRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDRfQjRfQ1RMLCBUT01UT01fQV9DRENfUlg0X0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg1X0I0X0NUTCwgVE9NVE9NX0FfQ0RDX1JYNV9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNl9CNF9DVEwsIFRPTVRPTV9BX0NEQ19SWDZfQjRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDdfQjRfQ1RMLCBUT01UT01fQV9DRENfUlg3X0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgxX0I1X0NUTCwgVE9NVE9NX0FfQ0RDX1JYMV9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYMl9CNV9DVEwsIFRPTVRPTV9BX0NEQ19SWDJfQjVfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDNfQjVfQ1RMLCBUT01UT01fQV9DRENfUlgzX0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg0X0I1X0NUTCwgVE9NVE9NX0FfQ0RDX1JYNF9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNV9CNV9DVEwsIFRPTVRPTV9BX0NEQ19SWDVfQjVfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDZfQjVfQ1RMLCBUT01UT01fQV9DRENfUlg2X0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg3X0I1X0NUTCwgVE9NVE9NX0FfQ0RDX1JYN19CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYMV9CNl9DVEwsIFRPTVRPTV9BX0NEQ19SWDFfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDJfQjZfQ1RMLCBUT01UT01fQV9DRENfUlgyX0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgzX0I2X0NUTCwgVE9NVE9NX0FfQ0RDX1JYM19CNl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNF9CNl9DVEwsIFRPTVRPTV9BX0NEQ19SWDRfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDVfQjZfQ1RMLCBUT01UT01fQV9DRENfUlg1X0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg2X0I2X0NUTCwgVE9NVE9NX0FfQ0RDX1JYNl9CNl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYN19CNl9DVEwsIFRPTVRPTV9BX0NEQ19SWDdfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjFfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDJfVk9MX0NUTF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYM19WT0xfQ1RMX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfUlgzX1ZPTF9DVExfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjFfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDVfVk9MX0NUTF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNl9WT0xfQ1RMX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfUlg2X1ZPTF9DVExfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlgxX1ZPTF9DVExfQjJfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IyX0NUTCwKKwkJCQlUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYM19WT0xfQ1RMX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg0X1ZPTF9DVExfQjJfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IyX0NUTCwKKwkJCQlUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYNl9WT0xfQ1RMX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg3X1ZPTF9DVExfQjJfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1ZCQVRfQ0ZHLCBUT01UT01fQV9DRENfVkJBVF9DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDEsIFRPTVRPTV9BX0NEQ19WQkFUX0FEQ19DQUwxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0FEQ19DQUwyLCBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMywgVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUMSwgVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUMV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVkJBVF9QS19FU1QyLCBUT01UT01fQV9DRENfVkJBVF9QS19FU1QyX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDMsIFRPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1ZCQVRfUkZfUFJPQzEsIFRPTVRPTV9BX0NEQ19WQkFUX1JGX1BST0MxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX1JGX1BST0MyLCBUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVkJBVF9UQUMxLCBUT01UT01fQV9DRENfVkJBVF9UQUMxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX1RBQzIsIFRPTVRPTV9BX0NEQ19WQkFUX1RBQzJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDMywgVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDM19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfVkJBVF9UQUM0LCBUT01UT01fQV9DRENfVkJBVF9UQUM0X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEMSwgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEMiwgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQyX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEMywgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQzX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBENCwgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQ0X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0RFQlVHMSwgVE9NVE9NX0FfQ0RDX1ZCQVRfREVCVUcxX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEX01PTiwgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUERfTU9OX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fTU9OX1ZBTCwgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9NT05fVkFMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTEtfQU5DX1JFU0VUX0NUTCwgVE9NVE9NX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTEtfUlhfUkVTRVRfQ1RMLCBUT01UT01fQV9DRENfQ0xLX1JYX1JFU0VUX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IyX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVEwsIFRPTVRPTV9BX0NEQ19DTEtfUlhfSTJTX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVEwsIFRPTVRPTV9BX0NEQ19DTEtfVFhfSTJTX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjFfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IyX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX09USFJfQ1RMLCBUT01UT01fQV9DRENfQ0xLX09USFJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTEtfQU5DX0NMS19FTl9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX0NMS19BTkNfQ0xLX0VOX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DTEtfUlhfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTEtfTUNMS19DVEwsIFRPTVRPTV9BX0NEQ19DTEtfTUNMS19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMS19QRE1fQ1RMLCBUT01UT01fQV9DRENfQ0xLX1BETV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMS19TRF9DVEwsIFRPTVRPTV9BX0NEQ19DTEtfU0RfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NMU0hfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NMU0hfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX0NMU0hfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlMsCisJCQkJVE9NVE9NX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELAorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0RfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9FQVJfVEhTRCwKKwkJCQlUT01UT01fQV9DRENfQ0xTSF9JRExFX0VBUl9USFNEX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELAorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNEX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNELAorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNEX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0tfQUREUiwgVE9NVE9NX0FfQ0RDX0NMU0hfS19BRERSX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0tfREFUQSwgVE9NVE9NX0FfQ0RDX0NMU0hfS19EQVRBX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwKKwkJCQlUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0xfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLAorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX0wsCisJCQkJVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9MX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfVSwKKwkJCQlUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX1VfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9FQVIsIFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfSERfRUFSX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfSERfSFBILCBUT01UT01fQV9DRENfQ0xTSF9WX1BBX0hEX0hQSF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9FQVIsIFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfTUlOX0VBUl9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9IUEgsIFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfTUlOX0hQSF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMV9HQUlOX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMV9DVEwsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjJfQ1RMLCBUT01UT01fQV9DRENfSUlSMV9HQUlOX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMl9HQUlOX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CM19DVEwsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjNfQ1RMLCBUT01UT01fQV9DRENfSUlSMl9HQUlOX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNF9DVEwsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjVfQ1RMLCBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I1X0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNl9DVEwsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjZfQ1RMLCBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I3X0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CN19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CN19DVEwsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjdfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjhfQ1RMLCBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I4X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I4X0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9COF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjFfQ1RMLCBUT01UT01fQV9DRENfSUlSMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfQ1RMLCBUT01UT01fQV9DRENfSUlSMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9USU1FUl9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9USU1FUl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9USU1FUl9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9USU1FUl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwsIFRPTVRPTV9BX0NEQ19JSVIxX0NPRUZfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19JSVIyX0NPRUZfQjFfQ1RMLCBUT01UT01fQV9DRENfSUlSMl9DT0VGX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19JSVIyX0NPRUZfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19UT1BfR0FJTl9VUERBVEUsIFRPTVRPTV9BX0NEQ19UT1BfR0FJTl9VUERBVEVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMLCBUT01UT01fQV9DRENfUEFfUkFNUF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMLCBUT01UT01fQV9DRENfUEFfUkFNUF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMLCBUT01UT01fQV9DRENfUEFfUkFNUF9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjRfQ1RMLCBUT01UT01fQV9DRENfUEFfUkFNUF9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfQjFfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CMV9DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjNfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CM19DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjRfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CNF9DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjVfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjVfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CNV9DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0I1X0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfQjZfQ1RMLCBUT01UT01fQV9DRENfQ09NUDBfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9CNl9DVEwsIFRPTVRPTV9BX0NEQ19DT01QMV9CNl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0I2X0NUTCwgVE9NVE9NX0FfQ0RDX0NPTVAyX0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVUywKKwkJCQlUT01UT01fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDFfU0hVVF9ET1dOX1NUQVRVUywKKwkJCQlUT01UT01fQV9DRENfQ09NUDFfU0hVVF9ET1dOX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDJfU0hVVF9ET1dOX1NUQVRVUywKKwkJCQlUT01UT01fQV9DRENfQ09NUDJfU0hVVF9ET1dOX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09NUDBfRlNfQ0ZHLCBUT01UT01fQV9DRENfQ09NUDBfRlNfQ0ZHX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT01QMV9GU19DRkcsIFRPTVRPTV9BX0NEQ19DT01QMV9GU19DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTVAyX0ZTX0NGRywgVE9NVE9NX0FfQ0RDX0NPTVAyX0ZTX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDFfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDFfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDJfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDJfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDNfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDNfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYM19CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYM19CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fUlg0X0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fUlg0X0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDRfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDRfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYNV9CMV9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYNV9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fUlg1X0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fUlg1X0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDZfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDZfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYNl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYNl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDdfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDdfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1JYN19CM19DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYN19CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fQU5DX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fQU5DX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9BTkNfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9BTkNfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1RYX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1RYX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1RYX0IzX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1RYX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjRfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CMV9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9FUTFfQjNfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9FUTFfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CNF9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9FUTJfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9FUTJfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CM19DVEwsIFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9TUkMxX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fU1JDMV9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fU1JDMV9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1NSQzFfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1NSQzJfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9TUkMyX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9TUkMyX0IyX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fU1JDMl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjJfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjNfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CM19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjRfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjVfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjZfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjdfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CN19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjhfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjlfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjEwX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjExX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMV9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYX1NCX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19DT05OX1JYX1NCX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9DTFNIX0NUTCwgVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NPTk5fTUlTQywgVE9NVE9NX0FfQ0RDX0NPTk5fTUlTQ19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ09OTl9SWDhfQjFfQ1RMLCBUT01UT01fQV9DRENfQ09OTl9SWDhfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQ0xJUF9MRVZFTF9BREpVU1QsCisJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9DTElQX0xFVkVMX0FESlVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9NSU5fQ0xJUF9USFJFU0hPTEQsCisJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9NSU5fQ0xJUF9USFJFU0hPTERfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfVEhSRVNIT0xEX1NUQVRVUywKKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1RIUkVTSE9MRF9TVEFUVVNfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfU0FNUExFX01BUkssCisJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9TQU1QTEVfTUFSS19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CT09TVF9HQVRJTkcsCisJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CT09TVF9HQVRJTkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0IxX0NUTCwKKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQjFfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9DTElQX0xFVkVMX0FESlVTVCwKKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9DTElQX0xFVkVMX0FESlVTVF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfTUlOX0NMSVBfVEhSRVNIT0xELAorCQkJVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX01JTl9DTElQX1RIUkVTSE9MRF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfVEhSRVNIT0xEX1NUQVRVUywKKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9USFJFU0hPTERfU1RBVFVTX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9TQU1QTEVfTUFSSywKKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfU0FNUExFX01BUktfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0JPT1NUX0dBVElORywKKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQk9PU1RfR0FUSU5HX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX0VOX0NUTCwgVE9NVE9NX0FfQ0RDX01CSENfRU5fQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMV9DRkcsIFRPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMV9DRkdfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfRklSX0IyX0NGRywgVE9NVE9NX0FfQ0RDX01CSENfRklSX0IyX0NGR19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMV9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMl9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CM19DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNF9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNV9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I1X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNl9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CMV9TVEFUVVMsIFRPTVRPTV9BX0NEQ19NQkhDX0IxX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CMl9TVEFUVVMsIFRPTVRPTV9BX0NEQ19NQkhDX0IyX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CM19TVEFUVVMsIFRPTVRPTV9BX0NEQ19NQkhDX0IzX1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CNF9TVEFUVVMsIFRPTVRPTV9BX0NEQ19NQkhDX0I0X1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CNV9TVEFUVVMsIFRPTVRPTV9BX0NEQ19NQkhDX0I1X1NUQVRVU19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CMV9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19CMl9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX0IyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxX0NUTCwgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMl9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjJfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjNfQ1RMLCBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IzX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I0X0NUTCwgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNV9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjVfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjZfQ1RMLCBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I2X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I3X0NUTCwgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CN19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9COF9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjhfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMLCBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I5X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMF9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjEwX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMV9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjExX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMl9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjEyX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfTUJIQ19DTEtfQ1RMLCBUT01UT01fQV9DRENfTUJIQ19DTEtfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19NQkhDX0lOVF9DVEwsIFRPTVRPTV9BX0NEQ19NQkhDX0lOVF9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfREVCVUdfQ1RMLCBUT01UT01fQV9DRENfTUJIQ19ERUJVR19DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX01CSENfU1BBUkUsIFRPTVRPTV9BX0NEQ19NQkhDX1NQQVJFX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDhfQjFfQ1RMLCBUT01UT01fQV9DRENfUlg4X0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg4X0IyX0NUTCwgVE9NVE9NX0FfQ0RDX1JYOF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYOF9CM19DVEwsIFRPTVRPTV9BX0NEQ19SWDhfQjNfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDhfQjRfQ1RMLCBUT01UT01fQV9DRENfUlg4X0I0X0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg4X0I1X0NUTCwgVE9NVE9NX0FfQ0RDX1JYOF9CNV9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1JYOF9CNl9DVEwsIFRPTVRPTV9BX0NEQ19SWDhfQjZfQ1RMX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMV9DVEwsCisJCQkJVE9NVE9NX0FfQ0RDX1JYOF9WT0xfQ1RMX0IxX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfUlg4X1ZPTF9DVExfQjJfQ1RMLAorCQkJCVRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMl9DVExfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMCwKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwwX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDEsCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMV9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwyLAorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDJfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMywKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwzX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDQsCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw1LAorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDVfX1BPUiB9LAorCXsgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNiwKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw2X19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDcsCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMN19fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQk9PU1RfTU9ERV9DVEwsIFRPTVRPTV9BX0NEQ19CT09TVF9NT0RFX0NUTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQk9PU1RfVEhSRVNIT0xELCBUT01UT01fQV9DRENfQk9PU1RfVEhSRVNIT0xEX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19CT09TVF9UQVBfU0VMLCBUT01UT01fQV9DRENfQk9PU1RfVEFQX1NFTF9fUE9SIH0sCisJeyBUT01UT01fQV9DRENfQk9PU1RfSE9MRF9USU1FLCBUT01UT01fQV9DRENfQk9PU1RfSE9MRF9USU1FX19QT1IgfSwKKwl7IFRPTVRPTV9BX0NEQ19CT09TVF9UUkdSX0VOLCBUT01UT01fQV9DRENfQk9PU1RfVFJHUl9FTl9fUE9SIH0sCit9OworCitzdGF0aWMgYm9vbCB3Y2Q5MzMwX2lzX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gdG9tdG9tX3JlZ19yZWFkYWJsZVtyZWddOworfQorCitzdGF0aWMgYm9vbCB0b210b21faXNfZGlnaXRhbF9nYWluX3JlZ2lzdGVyKHVuc2lnbmVkIGludCByZWcpCit7CisJYm9vbCBydG4gPSBmYWxzZTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBUT01UT01fQV9DRENfUlgxX1ZPTF9DVExfQjJfQ1RMOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IyX0NUTDoKKwljYXNlIFRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVEw6CisJY2FzZSBUT01UT01fQV9DRENfUlg0X1ZPTF9DVExfQjJfQ1RMOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IyX0NUTDoKKwljYXNlIFRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVEw6CisJY2FzZSBUT01UT01fQV9DRENfUlg3X1ZPTF9DVExfQjJfQ1RMOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1JYOF9WT0xfQ1RMX0IyX0NUTDoKKwljYXNlIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU46CisJY2FzZSBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfR0FJTjoKKwljYXNlIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU46CisJY2FzZSBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfR0FJTjoKKwljYXNlIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOOgorCWNhc2UgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU46CisJY2FzZSBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfR0FJTjoKKwljYXNlIFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTjoKKwkJcnRuID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBydG47Cit9CisKK3N0YXRpYyBib29sIHdjZDkzMzBfaXNfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCisJaWYgKChyZWcgPj0gVE9NVE9NX0FfQ0RDX01CSENfRU5fQ1RMKSB8fCAocmVnIDwgMHgxMDApKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElJUiBDb2VmZiByZWdpc3RlcnMgYXJlIG5vdCBjYWNoZWFibGUgKi8KKwlpZiAoKHJlZyA+PSBUT01UT01fQV9DRENfSUlSMV9DT0VGX0IxX0NUTCkgJiYKKwkJKHJlZyA8PSBUT01UT01fQV9DRENfSUlSMl9DT0VGX0IyX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJLyogQU5DIGZpbHRlciByZWdpc3RlcnMgYXJlIG5vdCBjYWNoZWFibGUgKi8KKwlpZiAoKHJlZyA+PSBUT01UT01fQV9DRENfQU5DMV9JSVJfQjFfQ1RMKSAmJgorCQkocmVnIDw9IFRPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMl9DVEwpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICgocmVnID49IFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CMV9DVEwpICYmCisJCShyZWcgPD0gVE9NVE9NX0FfQ0RDX0FOQzJfTFBGX0IyX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCgocmVnID49IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMCAmJgorCSAgICByZWcgPD0gVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw3KSkgfHwKKwkgICAgKChyZWcgPj0gVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMCkgJiYKKwkgICAgIChyZWcgPD0gVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNykpKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIERpZ2l0YWwgZ2FpbiByZWdpc3RlciBpcyBub3QgY2FjaGVhYmxlIHNvIHdlIGhhdmUgdG8gd3JpdGUKKwkgKiB0aGUgc2V0dGluZyBldmVuIGl0IGlzIHRoZSBzYW1lCisJICovCisJaWYgKHRvbXRvbV9pc19kaWdpdGFsX2dhaW5fcmVnaXN0ZXIocmVnKSkKKwkJcmV0dXJuIHRydWU7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgVE9NVE9NX0FfUlhfSFBIX0xfU1RBVFVTOgorCWNhc2UgVE9NVE9NX0FfUlhfSFBIX1JfU1RBVFVTOgorCWNhc2UgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVUX1NUQVRVUzoKKwljYXNlIFRPTVRPTV9BX1JYX0hQSF9DTlBfRU46CisJY2FzZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX01PTl9WQUw6CisJY2FzZSBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzE6CisJY2FzZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8zOgorCWNhc2UgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNDoKKwljYXNlIFRPTVRPTV9BX0lOVFJfTU9ERToKKwljYXNlIFRPTVRPTV9BX0lOVFIyX01BU0swOgorCWNhc2UgVE9NVE9NX0FfSU5UUjJfU1RBVFVTMDoKKwljYXNlIFRPTVRPTV9BX0lOVFIyX0NMRUFSMDoKKwljYXNlIFRPTVRPTV9TQl9QR0RfUE9SVF9UWF9CQVNFOgorCWNhc2UgVE9NVE9NX1NCX1BHRF9QT1JUX1JYX0JBU0U6CisJY2FzZSBUT01UT01fQV9DRENfQU5DMV9JSVJfQjFfQ1RMOgorCWNhc2UgVE9NVE9NX0FfQ0RDX0FOQzFfR0FJTl9DVEw6CisJY2FzZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfVFJHOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3Y2Q5MzMwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gOCwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gd2NkOTMzMF9kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod2NkOTMzMF9kZWZhdWx0cyksCisJLm1heF9yZWdpc3RlciA9IFdDRDkzMzBfTUFYX1JFR0lTVEVSLAorCS52b2xhdGlsZV9yZWcgPSB3Y2Q5MzMwX2lzX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSB3Y2Q5MzMwX2lzX3JlYWRhYmxlX3JlZ2lzdGVyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDkzMzUtcmVnbWFwLmMgYi9kcml2ZXJzL21mZC93Y2Q5MzM1LXJlZ21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjIzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93Y2Q5MzM1LXJlZ21hcC5jCkBAIC0wLDAgKzEsMTYxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAid2NkOXh4eC1yZWdtYXAuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd2NkOTMzNV8xX3hfZGVmYXVsdHNbXSA9IHsKKwl7IFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFLCAgICAgICAgICAgICAgICAgICAgIDB4MDMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLCAgICAgICAweDFmLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwLCAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMF9JTlBfQ0ZHLCAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDFfSU5QX0NGRywgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgyX0lOUF9DRkcsICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYM19JTlBfQ0ZHLCAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCwgICAgICAgMHgxNCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLLCAgICAgICAgICAgICAgIDB4M2YsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9CSUFTX1ZCR19GSU5FX0FESiwgICAgICAgICAgICAgICAgICAgICAgMHg1NSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAweDJkLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzgsICAgICAgICAgICAgICAgICAgICAgICAgMHg2YywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8xMCwgICAgICAgICAgICAgICAgICAgICAgIDB4NmMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMiwgICAgICAgICAgICAgICAgICAgICAweDc3LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzMsICAgICAgICAgICAgICAgICAgICAgMHg3NywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0lET19TSURPX1RFU1RfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9NQkhDX0ZTTV9ERUJVRywgICAgICAgICAgICAgICAgICAgICAgICAgMHhjMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVFhfMV8yX0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9BVEVTVF9SRUZDVEwsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9UWF81XzZfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSwgICAgICAgICAgICAgICAgICAgIDB4NjcsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzQsICAgICAgICAgICAgICAgICAgICAweDVmLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF85LCAgICAgICAgICAgICAgICAgICAgMHg1MCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzEsICAgICAgICAgICAgICAgIDB4NjUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF80LCAgICAgICAgICAgICAgICAweDQwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9SWF9CSUFTX0hQSF9QQSwgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfUlhfQklBU19IUEhfTE9XUE9XRVIsICAgICAgICAgICAgICAgICAgIDB4NjIsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9IUEhfTF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSFBIX1JfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9IUEhfUkRBQ19MRE9fQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDcsICAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yLCAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdjZDkzMzVfMl8wX2RlZmF1bHRzW10gPSB7CisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwgICAgICAgICAgICAgICAgICAgICAweDA3LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMV9TSFVURE9XTiwgICAgICAgMHgzZiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwgICAgICAgICAgIDB4MDEsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCwgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDBfSU5QX0NGRywgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgxX0lOUF9DRkcsICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMl9JTlBfQ0ZHLCAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDNfSU5QX0NGRywgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QsICAgICAgIDB4MTMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfTUFTSywgICAgICAgICAgICAgICAweGZmLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMLCAgICAgICAgICAgICAgMHg0MCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQklBU19WQkdfRklORV9BREosICAgICAgICAgICAgICAgICAgICAgIDB4YzUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDkyLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHgzNSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0lET19TSURPX0NDTF84LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMTAsICAgICAgICAgICAgICAgICAgICAgICAweDZlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzIsICAgICAgICAgICAgICAgICAgICAgMHg1NSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8zLCAgICAgICAgICAgICAgICAgICAgIDB4NTUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzIsICAgICAgICAgICAgICAgICAgICAgICAweDBmLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9NQkhDX1pERVRfQU5BX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwZiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVFhfMV8yX0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgIDB4MGEsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9BVEVTVF9SRUZDVEwsICAgICAgICAgICAgICAgICAgICAweDBhLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9UWF81XzZfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwYSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSwgICAgICAgICAgICAgICAgICAgIDB4ZWIsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzQsICAgICAgICAgICAgICAgICAgICAweDdmLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF85LCAgICAgICAgICAgICAgICAgICAgMHg2NCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzEsICAgICAgICAgICAgICAgIDB4ZWQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1BBLCAgICAgICAgICAgICAgICAgICAgICAgICAweDlhLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9SWF9CSUFTX0hQSF9MT1dQT1dFUiwgICAgICAgICAgICAgICAgICAgMHg4MiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSFBIX1BBX0NUTDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9MX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9IUEhfUl9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSFBIX1JfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDMzLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDcsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDIwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgMHgyMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgIDB4MjAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDIwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLCAgICAgICAgMHgwYywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSwgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzIsICAgICAgICAgICAgICAweDYwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9EQVRBX0hVQl9OQVRJVkVfRklGT19TWU5DLCAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1RBVFVTLCAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NQRV9TU19UWF9QUF9CVUZfSU5UX1BFUklPRCwgICAgICAgICAgICAweDYwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgzQywgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX1NTX1NWQV9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X01CSENfRlNNX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9GTFlCQUNLX0NUUkxfMSwgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NSwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MjUsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NQTElORV9TUkMwX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9TUExJTkVfU1JDMV9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU1BMSU5FX1NSQzJfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NQTElORV9TUkMzX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAorCXsgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9DVExfUkVQRUFUX1BBVCwgICAgMHgwMCwgIDB4MDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd2NkOTMzNV9kZWZhdWx0c1tdID0geworCS8qIFBhZ2UgIzAgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0UwX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfQllQQVNTLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfTUNMS19DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9SU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsICAgICAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMiwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMywgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0lSQU1fU0hVVERPV04sICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzEsICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzIsICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9JTlRfTUFTSywgICAgICAgICAgICAgICAgICAgICAweDNmIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9JTlRfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NPREVDX1JQTV9JTlRfQ0xFQVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTIsICAgICAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTMsICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QwLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQyLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQzLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ0LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ1LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ2LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ3LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ4LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ5LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMSwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMiwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMywgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1NUQVRVUywgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF9OT05ORUdPLCAgICAweDBkIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8xLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8yLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8zLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0FOQV9XQUlUX1NUQVRFX0NUTCwgICAgICAweENDIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19BQ1RJVkUsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DVEwsICAgICAgICAgICAweDA2IH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9TVEFUVVMsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DVEwsICAgICAgICAgICAweDA2IH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9TVEFUVVMsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DTlRfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DTlRfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9DVEwsICAgICAgICAgICAweDA2IH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9TVEFUVVMsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9DTlRfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9DTlRfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYX0kyU19DVEwsICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19DVEwsICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX0kyU19DTEssICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYNF9JTlBfQ0ZHLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYNV9JTlBfQ0ZHLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYNl9JTlBfQ0ZHLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYN19JTlBfQ0ZHLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMF9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMV9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMl9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYM19JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYNF9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYNV9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYNl9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYN19JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYOF9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYOV9JTlBfQ0ZHLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTBfSU5QX0NGRywgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTNfSU5QX0NGRywgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTRfSU5QX0NGRywgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRywgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfTF9DRkcsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfTF9DRkcsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfUl9DRkcsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQ0xSX0NPTU1JVCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMCwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMSwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMiwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMywgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMwLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMxLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMzLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMCwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMSwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMiwgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMywgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMwLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMxLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMzLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfTEVWRUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzM1X0lOVFJfTEVWRUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfTEVWRUwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfTEVWRUwzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQllQQVNTMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQllQQVNTMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQllQQVNTMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfQllQQVNTMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfU0VUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfU0VUMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfU0VUMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0lOVFJfU0VUMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJLyogUGFnZSAjMSByZWdpc3RlcnMgKi8KKwl7IFdDRDkzMzVfUEFHRTFfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4NzEgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MzQgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MGIgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF80LCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgIDB4NjQgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF83LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF84LCAgICAgICAgICAgICAgICAgICAgIDB4OTQgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMCwgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMSwgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzAsICAgICAgICAgICAgICAgICAgIDB4NmIgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIsICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF80LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF82LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF83LCAgICAgICAgICAgICAgICAgICAgIDB4MzMgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4NDEgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4OTQgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF80LCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF83LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF84LCAgICAgICAgICAgICAgICAgICAgIDB4NWYgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9MX1ZBTF9DVExfMCwgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9MX1ZBTF9DVExfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMSwgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzAsICAgICAgICAgICAgICAgICAgIDB4NmIgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzIsICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgIDB4MzAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF80LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF82LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF83LCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9GTExfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4NDEgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4OTQgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgIDB4NWUgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzksICAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0xfVkFMX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0RTTV9GUkFDX0NUTF8wLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0RTTV9GUkFDX0NUTF8xLCAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgIDB4NmIgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMSwgICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMiwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfNCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NUQVRVU18wLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NUQVRVU18xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfU0JfRkxMX1NUQVRVU18zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwkvKiBQYWdlICMyIHJlZ2lzdGVycyAqLworCXsgV0NEOTMzNV9QQUdFMl9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxX1RSRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyX1RSRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzAsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzQsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzUsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzYsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzcsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzgsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzksICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzEwLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzExLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzEyLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzEzLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE0LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE1LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV80LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV81LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV82LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV83LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV84LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV85LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzAsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzQsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzUsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzYsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzcsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzgsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzksICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEwLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzExLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEyLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEzLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzE0LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzE1LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl80LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl81LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl82LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl83LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl84LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl85LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV9BQ0ssICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl9BQ0ssICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfRUNfQlVGX0lOVF9QRVJJT0QsICAgICAgICAgICAgICAgMHgzYyB9LAorCXsgV0NEOTMzNV9DUEVfU1NfVVNfQlVGX0lOVF9QRVJJT0QsICAgICAgICAgICAgICAgMHg2MCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAorCXsgV0NEOTMzNV9DUEVfU1NfVVNfRUNfTVVYX0NGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfTUFEX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfRE1JQzBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfRE1JQzFfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfRE1JQzJfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfRE1JQ19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQ1BBUl9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfV0RPR19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQkFDS1VQX0lOVCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfQ1BFX09DRF9DRkcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVUywgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF80LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF81LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF82LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF83LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF84LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfUFRSLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfOCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTMzNV9TT0NfTUFEX0lOUF9TRUwsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCS8qIFBhZ2UgIzYgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0U2X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9CSUFTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9DTEtfVE9QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9SQ08sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwIH0sCisJeyBXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfQSwgICAgICAgICAgICAgICAgICAgICAgICAweGI0IH0sCisJeyBXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfRCwgICAgICAgICAgICAgICAgICAgICAgICAweGI0IH0sCisJeyBXQ0Q5MzM1X0FOQV9CVUNLX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9CVUNLX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzM1X0FOQV9SWF9TVVBQTElFUywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9IUEgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9FQVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9MT18xXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9MT18zXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQURfU0VUVVAsICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0FOQV9BTUlDNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsICAgICAgICAgICAgICAgICAgICAgICAgICAweDM5IH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjAsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjEsICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjYsICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NSUNCMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NSUNCMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NSUNCMl9SQU1QLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NSUNCMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0FOQV9NSUNCNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzM1X0FOQV9WQkFEQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0JJQVNfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4IH0sCisJeyBXQ0Q5MzM1X0NMT0NLX1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DVFJMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzM1X1JDT19DVFJMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzM1X1JDT19DQUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19URVNUX0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfT1VUXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfT1VUXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfT1VUXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfT1VUXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JDT19DQUxfT1VUXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAweDg0IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICAweGZlIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzMsICAgICAgICAgICAgICAgICAgICAgICAweGY2IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzQsICAgICAgICAgICAgICAgICAgICAgICAweDU2IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDZjIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDU3IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNCwgICAgICAgICAgICAgICAgICAgICAgICAweDYxIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNSwgICAgICAgICAgICAgICAgICAgICAgICAweDZkIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNiwgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNywgICAgICAgICAgICAgICAgICAgICAgICAweDZmIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfOSwgICAgICAgICAgICAgICAgICAgICAgICAweDZlIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19GSUxURVJfMSwgICAgICAgICAgICAgICAgICAgICAweDkyIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19GSUxURVJfMiwgICAgICAgICAgICAgICAgICAgICAweDU0IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMSwgICAgICAgICAgICAgICAgICAgICAweDc3IH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMSwgICAgICAgICAgICAgICAweDljIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMiwgICAgICAgICAgICAgICAweDgyIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9PVVRfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9PVVRfMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X01CSENfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMyIH0sCisJeyBXQ0Q5MzM1X01CSENfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X01CSENfUExVR19ERVRFQ1RfQ1RMLCAgICAgICAgICAgICAgICAgICAweDY5IH0sCisJeyBXQ0Q5MzM1X01CSENfWkRFVF9SQU1QX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X01CSENfVEVTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOLCAgICAgICAgICAgICAgICAgICAgICAweGZlIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0lCSUFTX0ZFLCAgICAgICAgICAgICAgICAgICAgICAgICAweDU0IH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0JJQVNfQURDLCAgICAgICAgICAgICAgICAgICAgICAgICAweDUxIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDFjIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0FEQ19SRUYsICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0FEQ19TQVIsICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0RFQlVHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0xET0hfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJiIH0sCisJeyBXQ0Q5MzM1X0xET0hfQklBUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY4IH0sCisJeyBXQ0Q5MzM1X0xET0hfU1RCX0xPQURTLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0xET0hfU0xPV1JBTVAsICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwIH0sCisJeyBXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDFhIH0sCisJeyBXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweGE0IH0sCisJeyBXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDFhIH0sCisJeyBXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweDI0IH0sCisJeyBXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDFhIH0sCisJeyBXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweGE0IH0sCisJeyBXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDFhIH0sCisJeyBXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweGE0IH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9BRENfVkNNLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM5IH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9CSUFTX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAweGMwIH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9BRENfSU5UMV9JQiwgICAgICAgICAgICAgICAgICAgICAweDZmIH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9BRENfSU5UMl9JQiwgICAgICAgICAgICAgICAgICAgICAweDRmIH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9DVEwsICAgICAgICAgICAgICAgICAgICAweDJlIH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVEFSVCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzlQNk0sICAgICAgICAgICAgICAweGM3IH0sCisJeyBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzEyUDI4OE0sICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9URVNUX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAweGNjIH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9BRENfSUIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5IH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDM4IH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9URVNUX0JMS19FTiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9UWEZFX0NMS0RJViwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9TQVIxX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzFfMl9TQVIyX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9URVNUX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAweGNjIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9BRENfSUIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5IH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDM4IH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9URVNUX0JMS19FTiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9UWEZFX0NMS0RJViwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9TQVIxX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzNfNF9TQVIyX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9URVNUX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAweGNjIH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9BRENfSUIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5IH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDM4IH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9URVNUX0JMS19FTiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9UWEZFX0NMS0RJViwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9TQVIxX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1RYXzVfNl9TQVIyX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9NT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9NT0RFXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDNhIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9NT0RFXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX1ZDTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDcwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX1ZDTF8yLCAgICAgICAgICAgICAgICAgICAgICAweGEyIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDUxIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF80LCAgICAgICAgICAgICAgICAgICAgICAweDUxIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF81LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9CVUNLX1RNVVhfQV9ELCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9CVUNLX1NXX0RSVl9DTlRMLCAgICAgICAgICAgICAgICAweDc3IH0sCisJeyBXQ0Q5MzM1X0NMQVNTSF9TUEFSRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzIsICAgICAgICAgICAgICAgICAgICAweDQ1IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMsICAgICAgICAgICAgICAgICAgICAweDc0IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzUsICAgICAgICAgICAgICAgICAgICAweDgzIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzYsICAgICAgICAgICAgICAgICAgICAweDk4IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzcsICAgICAgICAgICAgICAgICAgICAweGE5IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzgsICAgICAgICAgICAgICAgICAgICAweDY4IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8yLCAgICAgICAgICAgICAgICAweDUwIH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8zLCAgICAgICAgICAgICAgICAweGE2IH0sCisJeyBXQ0Q5MzM1X0ZMWUJBQ0tfVEVTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JYX0FVWF9TV19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JYX1BBX0FVWF9JTl9DT05OLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1JYX1RJTUVSX0RJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDc0IH0sCisJeyBXQ0Q5MzM1X1JYX09DUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmIH0sCisJeyBXQ0Q5MzM1X1JYX09DUF9DT1VOVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDc3IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRUFSX0RBQywgICAgICAgICAgICAgICAgICAgICAgICAweGEwIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRUFSX0FNUCwgICAgICAgICAgICAgICAgICAgICAgICAweGFhIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xETywgICAgICAgICAgICAgICAgICAgICAgICAweGE5IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNCVUZGX0NOUDIsICAgICAgICAgICAgICAweDhhIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPLCAgICAgICAgICAgICAgICAgICAweDg4IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX0NOUDEsICAgICAgICAgICAgICAgICAgICAgICAweDg2IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX1BBLCAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX1JFRiwgICAgICAgICAgICAgICAgICAgICAweDg4IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX0xETywgICAgICAgICAgICAgICAgICAgICAweDg4IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfU0VMT19EQUNfUEEsICAgICAgICAgICAgICAgICAgICAweGE4IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfQlVDS19SU1QsICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfQlVDS19WUkVGX0VSUkFNUCwgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9FUlJBTVAsICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9CVUZGLCAgICAgICAgICAgICAgICAgICAgICAweGFhIH0sCisJeyBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9NSURfUlNULCAgICAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzM1X0hQSF9MX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0hQSF9SX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0hQSF9DTlBfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweGRhIH0sCisJeyBXQ0Q5MzM1X0hQSF9DTlBfV0dfVElNRSwgICAgICAgICAgICAgICAgICAgICAgICAweDE1IH0sCisJeyBXQ0Q5MzM1X0hQSF9PQ1BfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4IH0sCisJeyBXQ0Q5MzM1X0hQSF9BVVRPX0NIT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyIH0sCisJeyBXQ0Q5MzM1X0hQSF9DSE9QX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzIH0sCisJeyBXQ0Q5MzM1X0hQSF9QQV9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ2IH0sCisJeyBXQ0Q5MzM1X0hQSF9MX1RFU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9MX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SX1RFU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SREFDX0NMS19DVEwxLCAgICAgICAgICAgICAgICAgICAgICAweDk5IH0sCisJeyBXQ0Q5MzM1X0hQSF9SREFDX0NMS19DVEwyLCAgICAgICAgICAgICAgICAgICAgICAweDliIH0sCisJeyBXQ0Q5MzM1X0hQSF9SREFDX0NIT1BfQ0xLX0xQX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SRUZCVUZGX1VIUUFfQ1RMLCAgICAgICAgICAgICAgICAgICAweGE4IH0sCisJeyBXQ0Q5MzM1X0hQSF9SRUZCVUZGX0xQX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0hQSF9SX0RBQ19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0VBUl9FTl9SRUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0VBUl9DTUJVRkYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkIH0sCisJeyBXQ0Q5MzM1X0VBUl9JQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0VBUl9FTl9EQkdfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0VBUl9DTlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzM1X0VBUl9EQUNfQ1RMX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0VBUl9TVEFUVVNfUkVHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0VBUl9PVVRfU0hPUlQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTUlTQywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTE8yX0NPTVBBTkRFUiwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTE8xX0NPTVBBTkRFUiwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQ09NTU9OLCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQllQQVNTX0VOLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQ05QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQ09SRV9PVVRfUFJPRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTERPX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQ09NX1NXQ0FQX1JFRkJVRl9GUkVRLCAgICAgICAgICAweDliIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fQ09NX1BBX0ZSRVEsICAgICAgICAgICAgICAgICAgICAweGIwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fUkVTRVJWRURfUkVHLCAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0NPTTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0NPTTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPM19HQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPM19DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPNF9HQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPNF9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPM19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NFX0xPX0xPNF9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJLyogUGFnZSAjMTAgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0UxMF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX01PREVfMV9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX01PREVfMl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0ZCX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9BX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9CX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GQl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX1NNTFBGX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0RDRkxUX1NISUZUX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9BREFQVF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0FfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMwX0ZCX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMV9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0ZGX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0ZCX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GRl9BX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GRl9CX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GQl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX1NNTFBGX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0RDRkxUX1NISUZUX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9BREFQVF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9DT0VGRl8xX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9DT0VGRl8yX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0JfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19BTkMxX0ZCX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJLyogUGFnZSAjMTEgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0UxMV9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDAsICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDEsICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDMsICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDYsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAweDAwIH0sCisJLyogUGFnZSAjMTIgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0UxMl9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0NSQywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0RMWV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0RFQ0FZX0NUUkwsICAgICAgICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX1BBLCAgICAgICAgICAgICAgICAgICAgICAweDFjIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX1BBLCAgICAgICAgICAgICAgICAgICAgICAweDM5IH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX0hELCAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX0hELCAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0sxX01TQiwgICAgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0sxX0xTQiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0syX01TQiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0syX0xTQiwgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0lETEVfQ1RSTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0lETEVfSFBILCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX0lETEVfRUFSLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX1RFU1QwLCAgICAgICAgICAgICAgICAgICAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX1RFU1QxLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTFNIX09WUl9WUkVGLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfUEFUSF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAweGIyIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ0ZHMSwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ0ZHMiwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAweGIyIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMSwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMiwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMywgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMywgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMywgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMywgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX0FDQ0VTU19DRkcsICAgICAgICAgICAgICAweDBmIH0sCisJeyBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVMsICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAweDBhIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDEsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDMsICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMSwgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMiwgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMywgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzEsICAgICAgICAgICAgICAgICAweDJhIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIsICAgICAgICAgICAgICAgICAweDg2IH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMSwgICAgICAgICAgICAgICAgICAgICAweDcwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMiwgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMywgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDNCwgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQxLCAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQzLCAgICAgICAgICAgICAgICAweDY0IH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQ0LCAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfREVCVUcxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUERfTU9OLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9NT05fVkFMLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMwX1NUX1NSQ19QQVRIX0NUTCwgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMwX1NUX1NSQ19QQVRIX0NGRzEsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwgICAgICAweDA0IH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NGRzEsICAgICAweDAwIH0sCisJLyogUGFnZSAjMTMgcmVnaXN0ZXJzICovCisJeyBXQ0Q5MzM1X1BBR0UxM19QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkc0LCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX0FOQ19DRkcwLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NQTElORV9TUkNfQ0ZHMCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg2X0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMl9DRkcwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcxLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcyLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcwLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcxLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkczLCAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTCwgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMSwgICAgICAweDRiIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQiwgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX01TQiwgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NUQVRVUywgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0IsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0IsICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0JfUkQsICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IyX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I1X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I3X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I4X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwsICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX1RJTUVSX0NUTCwgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9QQVRIX0NUTCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IzX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I0X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I2X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I3X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DVEwsICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX1RJTUVSX0NUTCwgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IxX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzMsICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzUsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzYsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1dSX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1dSX01TQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1JEX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1JEX01TQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX01TQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX01TQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9XUl9NU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9MVVQsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9SRF9NU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9XUl9NU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9MVVQsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9SRF9NU0IsICAgICAgICAgICAgICAweDAwIH0sCisJLyogUGFnZSAjMHg4MCByZWdpc3RlcnMgKi8KKwl7IFdDRDkzMzVfUEFHRTgwX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9CSVNUX01PREVfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9SRl9QQV9PTl9QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JTlRSMV9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JTlRSMl9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9TV1JfREFUQV9QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9TV1JfQ0xLX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMkNfQ0xLX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMkNfREFUQV9QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfUlhfU0QwX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfUlhfU0QxX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfUlhfU0NLX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfUlhfV1NfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfVFhfU0QwX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfVFhfU0QxX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfVFhfU0NLX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9JMlNfVFhfV1NfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDMV9DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDMV9EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDMl9DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDMl9EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDM19DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9ETUlDM19EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9KVERJX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9KVERPX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9KVE1TX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9KVENLX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVExNTV9KVFJTVF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzEsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzIsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMiwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QQURfRFJWQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fU1RBVFVTLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19NRU1fQ1RSTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19CVVNfU0VMLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19KVEFHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8xLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8yLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8zLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKK307CisKKy8qCisgKiB3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaDogVXBkYXRlIHJlZ2lzdGVyIGRlZmF1bHRzIGJhc2VkIG9uIHZlcnNpb24KKyAqIEByZWdtYXA6IGhhbmRsZSB0byB3Y2Q5eHh4IHJlZ21hcAorICogQHZlcnNpb246IHdjZDkzMzUgdmVyc2lvbgorICoKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgb3IgMCBmb3Igc3VjY2VzcworICovCitpbnQgd2NkOTMzNV9yZWdtYXBfcmVnaXN0ZXJfcGF0Y2goc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgdmVyc2lvbikKK3sKKwlpbnQgcmM7CisKKwlpZiAoIXJlZ21hcCkgeworCQlwcl9lcnIoIiVzOiByZWdtYXAgc3RydWN0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSBUQVNIQV9WRVJTSU9OXzFfMDoKKwljYXNlIFRBU0hBX1ZFUlNJT05fMV8xOgorCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgdHJ1ZSk7CisJCXJjID0gcmVnbWFwX211bHRpX3JlZ193cml0ZShyZWdtYXAsIHdjZDkzMzVfMV94X2RlZmF1bHRzLAorCQkJCQkgICAgQVJSQVlfU0laRSh3Y2Q5MzM1XzFfeF9kZWZhdWx0cykpOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIFRBU0hBX1ZFUlNJT05fMl8wOgorCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgdHJ1ZSk7CisJCXJjID0gcmVnbWFwX211bHRpX3JlZ193cml0ZShyZWdtYXAsIHdjZDkzMzVfMl8wX2RlZmF1bHRzLAorCQkJCQkgICAgQVJSQVlfU0laRSh3Y2Q5MzM1XzJfMF9kZWZhdWx0cykpOworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgZmFsc2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiB1bmtub3duIHZlcnNpb246ICVkXG4iLCBfX2Z1bmNfXywgdmVyc2lvbik7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaCk7CisKK3N0YXRpYyBib29sIHdjZDkzMzVfaXNfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXU4IHBnX251bSwgcmVnX29mZnNldDsKKwljb25zdCB1OCAqcmVnX3RibCA9IE5VTEw7CisKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBudW1iZXIgZnJvbSBNU0Igb2YgY29kZWMgcmVnaXN0ZXIuIElmIGl0cyAweDgwLCBhc3NpZ24KKwkgKiB0aGUgY29ycmVzcG9uZGluZyBwYWdlIGluZGV4IFBBR0VfMHg4MC4KKwkgKi8KKwlwZ19udW0gPSByZWcgPj4gMHg4OworCWlmIChwZ19udW0gPT0gMHg4MCkKKwkJcGdfbnVtID0gUEFHRV8wWDgwOworCWVsc2UgaWYgKHBnX251bSA+PSAweEUpCisJCXJldHVybiBmYWxzZTsKKworCXJlZ190YmwgPSB3Y2Q5MzM1X3JlZ1twZ19udW1dOworCXJlZ19vZmZzZXQgPSByZWcgJiAweEZGOworCisJaWYgKHJlZ190YmwpCisJCXJldHVybiByZWdfdGJsW3JlZ19vZmZzZXRdOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCB3Y2Q5MzM1X2lzX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwkvKgorCSAqIHJlZ2lzdGVycyBmcm9tIDB4MDAwIHRvIDB4MEZGIGFyZSB2b2xhdGlsZSBiZWNhdXNlCisJICogdGhpcyBzcGFjZSBjb250YWlucyByZWdpc3RlcnMgcmVsYXRlZCB0byBpbnRlcnJ1cHQKKwkgKiBzdGF0dXMsIG1hc2sgZXRjCisJICovCisJaWYgKHJlZyA8IDB4MTAwKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElJUiBDb2VmZiByZWdpc3RlcnMgYXJlIG5vdCBjYWNoZWFibGUgKi8KKwlpZiAoKHJlZyA+PSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCkgJiYKKwkgICAgKHJlZyA8PSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyZWcgPj0gV0NEOTMzNV9DRENfQU5DMF9JSVJfQ09FRkZfMV9DVEwpICYmCisJICAgIChyZWcgPD0gV0NEOTMzNV9DRENfQU5DMF9GQl9HQUlOX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyZWcgPj0gV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwpICYmCisJICAgIChyZWcgPD0gV0NEOTMzNV9DRENfQU5DMV9GQl9HQUlOX0NUTCkpCisJCXJldHVybiB0cnVlOworCS8qCisJICogQ1BFIGluYm94IGFuZCBvdXRib3ggcmVnaXN0ZXJzIGFyZSB2b2xhdGlsZQorCSAqIHNpbmNlIHRoZXkgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGNvZGVjIGhhcmR3YXJlCisJICogdG8gaW5kaWNhdGUgQ1BFIHN0YXR1cworCSAqLworCWlmIChyZWcgPj0gV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8wICYmCisJICAgIHJlZyA8PSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyX0FDSykKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAocmVnID49IFdDRDkzMzVfUkNPX0NBTF9PVVRfMSAmJgorCSAgICByZWcgPD0gV0NEOTMzNV9SQ09fQ0FMX09VVF81KQorCQlyZXR1cm4gdHJ1ZTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfVFJHOgorCWNhc2UgV0NEOTMzNV9DUEVfU1NfSU5CT1gyX1RSRzoKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wOgorCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzE6CisJY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMjoKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8zOgorCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzA6CisJY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMToKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8yOgorCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzM6CisJY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMDoKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xOgorCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzI6CisJY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMzoKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8wOgorCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzE6CisJY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMjoKKwljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8zOgorCWNhc2UgV0NEOTMzNV9BTkFfQklBUzoKKwljYXNlIFdDRDkzMzVfQU5BX0NMS19UT1A6CisJY2FzZSBXQ0Q5MzM1X0FOQV9SQ086CisJY2FzZSBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MOgorCWNhc2UgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMzoKKwljYXNlIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzI6CisJY2FzZSBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8xOgorCWNhc2UgV0NEOTMzNV9BTkFfTUJIQ19NRUNIOgorCWNhc2UgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVDoKKwljYXNlIFdDRDkzMzVfQU5BX01CSENfWkRFVDoKKwljYXNlIFdDRDkzMzVfQU5BX01JQ0IyOgorCWNhc2UgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVUzoKKwljYXNlIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLOgorCWNhc2UgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSOgorCWNhc2UgV0NEOTMzNV9DUEVfU1NfU1RBVFVTOgorCWNhc2UgV0NEOTMzNV9DUEVfU1NfQkFDS1VQX0lOVDoKKwljYXNlIFdDRDkzMzVfQ1BFX1NTX0NGRzoKKwljYXNlIFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8xOgorCWNhc2UgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8zOgorCWNhc2UgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF80OgorCWNhc2UgV0NEOTMzNV9GTFlCQUNLX0VOOgorCWNhc2UgV0NEOTMzNV9BTkFfUlhfU1VQUExJRVM6CisJY2FzZSBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0w6CisJY2FzZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMjoKKwljYXNlIFdDRDkzMzVfU0lET19TSURPX0NDTF80OgorCWNhc2UgV0NEOTMzNV9EQVRBX0hVQl9OQVRJVkVfRklGT19TVEFUVVM6CisJY2FzZSBXQ0Q5MzM1X01CSENfRlNNX1NUQVRVUzoKKwljYXNlIFdDRDkzMzVfU1BMSU5FX1NSQzBfU1RBVFVTOgorCWNhc2UgV0NEOTMzNV9TUExJTkVfU1JDMV9TVEFUVVM6CisJY2FzZSBXQ0Q5MzM1X1NQTElORV9TUkMyX1NUQVRVUzoKKwljYXNlIFdDRDkzMzVfU1BMSU5FX1NSQzNfU1RBVFVTOgorCWNhc2UgV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8yOgorCWNhc2UgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzg6CisJY2FzZSBXQ0Q5MzM1X0JJQVNfVkJHX0ZJTkVfQURKOgorCWNhc2UgV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQjoKKwljYXNlIFdDRDkzMzVfVkJBRENfQURDX0RPVVRMU0I6CisJY2FzZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9NT05fVkFMOgorCWNhc2UgV0NEOTMzNV9BTkFfQlVDS19DVEw6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0cnVjdCByZWdtYXBfY29uZmlnIHdjZDkzMzVfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSA4LAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSB3Y2Q5MzM1X2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRSh3Y2Q5MzM1X2RlZmF1bHRzKSwKKwkubWF4X3JlZ2lzdGVyID0gV0NEOTMzNV9NQVhfUkVHSVNURVIsCisJLnZvbGF0aWxlX3JlZyA9IHdjZDkzMzVfaXNfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZyA9IHdjZDkzMzVfaXNfcmVhZGFibGVfcmVnaXN0ZXIsCisJLmNhbl9tdWx0aV93cml0ZSA9IHRydWUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOTMzNS10YWJsZXMuYyBiL2RyaXZlcnMvbWZkL3djZDkzMzUtdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMzJlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3djZDkzMzUtdGFibGVzLmMKQEAgLTAsMCArMSwxMzI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmg+CisKKyNkZWZpbmUgV0NEOTMzNV9SRUcocmVnKSAgKChyZWcpICYgMHhGRikKKworY29uc3QgdTggd2NkOTMzNV9wYWdlMF9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UwX1BBR0VfUkVHSVNURVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0NMS19CWVBBU1MpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfTUNMS19DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9ERUVQU0xQXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9JUkFNX1NIVVRET1dOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0xX1NIVVRET1dOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fSU5UX01BU0spXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9TVEFUVVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9DTEVBUildID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQU5BX1dBSVRfU1RBVEVfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19BQ1RJVkUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMV9NT05fU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTFNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fQ05UX01TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fQ05UX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DM19NT05fQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9TVEFUVVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9NU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX0kyU19DTEspXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgwX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgxX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgyX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgzX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg0X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg1X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg2X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg3X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg0X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg3X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxMF9JTlBfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEzX0lOUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxNF9JTlBfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX0xfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9MX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QxX1JfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQ0xSX0NPTU1JVCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX01BU0sxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIxKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjIpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX01BU0sxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfQ0xFQVIxKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjIpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0JZUEFTUzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9CWVBBU1MxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQllQQVNTMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0JZUEFTUzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9TRVQwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfU0VUMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1NFVDIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9TRVQzKV0gPSAxLAorfTsKKworY29uc3QgdTggd2NkOTMzNV9wYWdlMV9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxX1BBR0VfUkVHSVNURVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF82KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzgpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF85KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF82KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfRlJFUV9DVExfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfU1RBVFVTXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF81KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF84KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfTF9WQUxfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF81KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfRlJFUV9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfRkxMX01PREUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1RBVFVTXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfTF9WQUxfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0xfVkFMX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9EU01fRlJBQ19DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9DT05GSUdfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF81KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF82KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF83KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0ZMTF9NT0RFKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfU1RBVFVTXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX1NUQVRVU18yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMyldID0gMSwKK307CisKK2NvbnN0IHU4IHdjZDkzMzVfcGFnZTJfcmVnX3JlYWRhYmxlW1dDRDkzMzVfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9QQUdFMl9QQUdFX1JFR0lTVEVSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzExKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzE0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxX1RSRyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyX1RSRyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzApXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMildID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzMpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV80KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNSldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzYpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV83KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfOCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzkpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzExKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTIpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE0KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTUpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV83KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzgpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzApXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMildID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzMpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl80KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNSldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzYpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl83KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfOCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzkpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMCldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzExKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTIpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMyldID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzE0KV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTUpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl83KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzgpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfOSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV9BQ0spXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfQUNLKV0gPSAwLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19FQ19CVUZfSU5UX1BFUklPRCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfVVNfQlVGX0lOVF9QRVJJT0QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfVVNfRUNfTVVYX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUFEX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9EKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19UWF9QUF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0RNSUMwX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfRE1JQzFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19ETUlDMl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0RNSUNfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TVkFfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19DUEFSX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfV0RPR19DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0JBQ0tVUF9JTlQpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfQ1BFX09DRF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVIpXSA9IDAsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF83KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzgpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF82KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfOCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0lOUF9TRUwpXSA9IDEsCit9OworCitjb25zdCB1OCB3Y2Q5MzM1X3BhZ2U2X3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7CisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTZfUEFHRV9SRUdJU1RFUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQklBUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQ0xLX1RPUCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfUkNPKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfQSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQlVDS19WT1VUX0QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0JVQ0tfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9CVUNLX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfUlhfU1VQUExJRVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0hQSCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfRUFSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9MT18xXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0xPXzNfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUFEX1NFVFVQKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9BTUlDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQU1JQzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0FNSUMzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9BTUlDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQU1JQzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0FNSUM2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfRUxFQ1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfWkRFVCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE4wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfQlROMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE4zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfQlRONSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE42KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01JQ0IxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NSUNCMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUlDQjMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01JQ0I0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9WQkFEQyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9CSUFTX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9CSUFTX1ZCR19GSU5FX0FESildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DTE9DS19URVNUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ1RSTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19DVFJMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19URVNUX0NUUkwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF9PVVRfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMX09VVF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19DQUxfT1VUXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF9PVVRfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMX09VVF81KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX01PREVfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fTU9ERV8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX1ZDTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fVkNMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF80KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF83KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfOCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzkpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF8xMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fRklMVEVSXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0FMX0NPREVfRVhUXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX09VVF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9PVVRfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUJIQ19DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfUExVR19ERVRFQ1RfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfWkRFVF9SQU1QX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX0ZTTV9ERUJVRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX1RFU1RfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0lCSUFTX0ZFKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0JJQVNfQURDKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVkJBRENfQURDX1JFRildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfSU8pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVkJBRENfQURDX1NBUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19ERUJVRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfRE9VVExTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9MRE9IX01PREUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTERPSF9CSUFTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0xET0hfU1RCX0xPQURTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0xET0hfU0xPV1JBTVApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCMV9URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCMl9URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCM19URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCNF9URVNUX0NUTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0FEQ19WQ00pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0JJQVNfQVRFU1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0FEQ19JTlQxX0lCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9BRENfSU5UMl9JQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVEFSVCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzEyUDI4OE0pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX1RFU1RfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX0FEQ19JQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfQVRFU1RfUkVGQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzFfMl9URVNUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfVEVTVF9CTEtfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX1RYRkVfQ0xLRElWKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzFfMl9TQVIxX0VSUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfU0FSMl9FUlIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X1RFU1RfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X0FEQ19JQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfQVRFU1RfUkVGQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzNfNF9URVNUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfVEVTVF9CTEtfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X1RYRkVfQ0xLRElWKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzNfNF9TQVIxX0VSUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfU0FSMl9FUlIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X1RFU1RfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X0FEQ19JQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfQVRFU1RfUkVGQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzVfNl9URVNUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfVEVTVF9CTEtfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X1RYRkVfQ0xLRElWKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzVfNl9TQVIxX0VSUildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfU0FSMl9FUlIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX01PREVfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DTEFTU0hfTU9ERV8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NMQVNTSF9NT0RFXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX1NQQVJFKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfRU4pXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF81KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF84KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzkpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19URVNUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9BVVhfU1dfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX1BBX0FVWF9JTl9DT05OKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX1RJTUVSX0RJVildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9PQ1BfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX09DUF9DT1VOVCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0VBUl9EQUMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19FQVJfQU1QKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xETyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0hQSF9QQSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX0NOUDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19IUEhfTE9XUE9XRVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUEEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUkVGKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX0xETyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX1NFTE9fREFDX1BBKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfQlVDS19SU1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9FUlJBTVApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19GTFlCX01JRF9SU1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX0xfU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfQ05QX0VOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DTlBfV0dfVElNRSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfT0NQX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfQVVUT19DSE9QKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DSE9QX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUEFfQ1RMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUEFfQ1RMMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfTF9FTildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfTF9URVNUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9MX0FURVNUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX0VOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX1RFU1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JfQVRFU1QpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUkRBQ19DSE9QX0NMS19MUF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JFRkJVRkZfVUhRQV9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JfREFDX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfRU5fUkVHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0VBUl9DTUJVRkYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0lDVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0VOX0RCR19DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0NOUCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfREFDX0NUTF9BVEVTVCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfU1RBVFVTX1JFRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfT1VUX1NIT1JUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTUlTQyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0xPMl9DT01QQU5ERVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ09NTU9OKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQllQQVNTX0VOKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ05QKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ09SRV9PVVRfUFJPRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0xET19PVVRfUFJPRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0NPTV9QQV9GUkVRKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fUkVTRVJWRURfUkVHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NFX0xPX0NPTTEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0VfTE9fQ09NMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfR0FJTildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfQ1RSTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzRfR0FJTildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzRfQ1RSTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NFX0xPX0xPNF9TVEFUVVMpXSA9IDEsCit9OworCitjb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMF9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMF9QQUdFX1JFR0lTVEVSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9NT0RFXzJfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZGX1NISUZUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZCX1NISUZUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9BX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9MUEZfRkZfQl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZCX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9TTUxQRl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfRENGTFRfU0hJRlRfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfRkJfR0FJTl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9NT0RFXzFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkZfU0hJRlQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkJfU0hJRlQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0FfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GRl9CX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9MUEZfRkJfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX1NNTFBGX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9EQ0ZMVF9TSElGVF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0FEQVBUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkZfQl9HQUlOX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9GQl9HQUlOX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCit9OworCitjb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMV9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMV9QQUdFX1JFR0lTVEVSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEwyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEw2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEwxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw3KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEwyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEw2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEwxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw3KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM0KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM3KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM3KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzUpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM2KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM3KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCit9OworCitjb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMl9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMl9QQUdFX1JFR0lTVEVSKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0NSQyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9ETFlfQ1RSTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9ERUNBWV9DVFJMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX1BBKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX1BBKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX0hEKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX0hEKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0sxX01TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9LMV9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSzJfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0syX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9JRExFX0NUUkwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9IUEgpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9FQVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfT1ZSX1ZSRUYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfU1RBVFVTKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0FEQ19DQUwyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BLX0VTVDMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1JGX1BST0MyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1RBQzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMzKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBENCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTildID0gMCwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fTU9OX1ZBTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMwX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMxX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMyX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMzX1NUQVRVUyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ0ZHMSldID0gMSwKK307CisKK2NvbnN0IHU4IHdjZDkzMzVfcGFnZTEzX3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7CisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTEzX1BBR0VfUkVHSVNURVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX1NSQ19DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTFNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX01TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TVEFUVVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9DVFJMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCX1JEKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0JfUkQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX1BBVEhfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNV9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjZfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I3X0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9COF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX1RJTUVSX0NUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMV9DVEwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzApXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX1RPUF9DRkcyKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX1RPUF9DRkc1KV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzYpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9XUl9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX0xVVCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9SRF9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9XUl9NU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfTFVUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9SRF9NU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9MVVQpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX0xTQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9XUl9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX01TQildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZSX0NPTVBfTFVUKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9SRF9MU0IpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX01TQildID0gMSwKK307CisKK2NvbnN0IHU4IHdjZDkzMzVfcGFnZV8weDgwX3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7CisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTgwX1BBR0VfUkVHSVNURVIpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9CSVNUX01PREVfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fUkZfUEFfT05fUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSU5UUjFfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSU5UUjJfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fU1dSX0RBVEFfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fU1dSX0NMS19QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyQ19DTEtfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJDX0RBVEFfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1JYX1NEMF9QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9JMlNfUlhfU0QxX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19SWF9TQ0tfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1JYX1dTX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19UWF9TRDBfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1RYX1NEMV9QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9JMlNfVFhfU0NLX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19UWF9XU19QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDMV9DTEtfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzFfREFUQV9QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDMl9DTEtfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzJfREFUQV9QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDM19DTEtfUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzNfREFUQV9QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9KVERJX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0pURE9fUElOQ0ZHKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSlRNU19QSU5DRkcpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9KVENLX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0pUUlNUX1BJTkNGRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMildID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfUEFEX0RSVkNUTCldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9TVEFUVVMpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfTUVNX0NUUkwpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19CVVNfU0VMKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfSlRBRyldID0gMSwKKwlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzEpXSA9IDEsCisJW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8yKV0gPSAxLAorCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfRU5fMyldID0gMSwKK307CisKK2NvbnN0IHU4ICp3Y2Q5MzM1X3JlZ1tXQ0Q5MzM1X05VTV9QQUdFU10gPSB7CisJW1BBR0VfMF0gPSB3Y2Q5MzM1X3BhZ2UwX3JlZ19yZWFkYWJsZSwKKwlbUEFHRV8xXSA9IHdjZDkzMzVfcGFnZTFfcmVnX3JlYWRhYmxlLAorCVtQQUdFXzJdID0gd2NkOTMzNV9wYWdlMl9yZWdfcmVhZGFibGUsCisJW1BBR0VfNl0gPSB3Y2Q5MzM1X3BhZ2U2X3JlZ19yZWFkYWJsZSwKKwlbUEFHRV8xMF0gPSB3Y2Q5MzM1X3BhZ2UxMF9yZWdfcmVhZGFibGUsCisJW1BBR0VfMTFdID0gd2NkOTMzNV9wYWdlMTFfcmVnX3JlYWRhYmxlLAorCVtQQUdFXzEyXSA9IHdjZDkzMzVfcGFnZTEyX3JlZ19yZWFkYWJsZSwKKwlbUEFHRV8xM10gPSB3Y2Q5MzM1X3BhZ2UxM19yZWdfcmVhZGFibGUsCisJW1BBR0VfMFg4MF0gPSB3Y2Q5MzM1X3BhZ2VfMHg4MF9yZWdfcmVhZGFibGUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOTM0eC1yZWdtYXAuYyBiL2RyaXZlcnMvbWZkL3djZDkzNHgtcmVnbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhZjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3djZDkzNHgtcmVnbWFwLmMKQEAgLTAsMCArMSwxOTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAid2NkOXh4eC1yZWdtYXAuaCIKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB3Y2Q5MzR4XzFfMV9kZWZhdWx0c1tdID0geworCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwLCAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0JJQVNfVkJHX0ZJTkVfQURKLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NzUgfSwKKwl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwRSB9LAorCXsgV0NEOTM0WF9FQVJfREFDX0NUTF9BVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQLCAgICAgICAgICAgICAgICAgIDB4MTcgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfTCwgICAgICAgICAgICAgICAweDgxIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTF9SLCAgICAgICAgICAgICAgIDB4ODEgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd2NkOTM0eF9kZWZhdWx0c1tdID0geworCXsgV0NEOTM0WF9QQUdFMF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfQllQQVNTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAgICAgICAgICAgICAgICAgICAgICAgMHgxZiB9LAorCXsgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMSzJfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQ09ERUNfUlBNX0kyU19EU0RfQ0xLX1NFTCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTIsICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMywgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QwLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDEsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDIsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMywgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ0LCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDUsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNiwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ3LCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDgsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMCwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMywgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0LCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTUsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1NUQVRVUywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08sICAgICAgMHgwZCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8yLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTkFfV0FJVF9TVEFURV9DVEwsICAgICAgICAweGNjIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX1NMTlFfV0FJVF9TVEFURV9DVEwsICAgICAgIDB4Y2MgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTFRfRlVOQ19FTiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0dQSU9fQ1RMX09FLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfREFUQSwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDBfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYMV9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfUlgyX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDNfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYNF9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfUlg1X0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDZfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYN19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDFfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMl9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDRfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNV9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDdfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYOF9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDEwX0lOUF9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDE0X0lOUF9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMF9DRkcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfVFgxXzBfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDFfMV9DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfMV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18yX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzNfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfQ0xLU1JDX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfVERNX0NUTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8wLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzAsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8xLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzEsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8yLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8zLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzMsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF80LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV80LCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0RNQV9SRE1BNF9QUlRfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfUkRNQV9TQlRYMF83X0NGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX1JETUFfU0JUWDhfMTFfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8wLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfV0RNQV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX1dETUFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8yLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8zLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfV0RNQV9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV80LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfNCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX1dETUEwX1BSVF9DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0RNQV9XRE1BM19QUlRfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ETUFfV0RNQTRfUFJUMF8zX0NGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRE1BX1dETUE0X1BSVDRfN19DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1BBR0UxX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4NzEgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDM0IH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwYiB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF80LCAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgIDB4NmUgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF83LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfOCwgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzksICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAweDUzIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfTF9WQUxfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMSwgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgMHg2YiB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMSwgICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfNCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHgzMyB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9GUkVRX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUsICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18wLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDQxIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgIDB4NWYgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfTF9WQUxfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfRFNNX0ZSQUNfQ1RMXzEsICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgIDB4NmIgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAweDMwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAorCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4OTQgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgICAweDVlIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9TQl9GTExfTF9WQUxfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEsICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgICAweDZiIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TQl9GTExfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0JfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFMl9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMCwgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzEsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVGTExfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzAsICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8xLCAgICAgICAgIDB4MGYgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfT1ZFUlJJREUsICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLCAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMSwgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzIsICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8zLCAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fNCwgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzUsICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLCAgICAgICAgICAgMHgwNyB9LAorCXsgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9PVkVSUklERV9DVEwsICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfT1ZFUlJJREVfQ1RMMSwgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfVVNfQlVGX0lOVF9QRVJJT0QsICAgICAgICAgICAgICAgIDB4NjAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QsICAgICAgICAweDEzIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAorCXsgV0NEOTM0WF9DUEVfU1NfVVNfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfRE1JQzBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX0RNSUMxX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19ETUlDMl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfRE1JQ19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DUEVfU1NfQkFDS1VQX0lOVCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19DUEVfT0NEX0NGRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEsICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCLCAgICAgICAgICAgICAweDNmIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18xQSwgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMUIsICAgICAgICAgICAgIDB4M2YgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEEsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBCLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18xQSwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMUIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMEEsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBCLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8xQSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMUIsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9NQUlOX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF84LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzQsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF81LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF84LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NPQ19NQURfSU5QX1NFTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFNF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfQ0xSX0NPTU1JVCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfSU5UUl9QSU4xX01BU0sxLCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjAsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX1BJTjJfTUFTSzMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfSU5UUl9QSU4yX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfUElOMl9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX01BU0syLCAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9NQVNLMywgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfU1RBVFVTMiwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX1NUQVRVUzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9DTEVBUjIsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfQ0xFQVIzLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX0xFVkVMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfSU5UUl9MRVZFTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfTEVWRUwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAorCXsgV0NEOTM0WF9JTlRSX0xFVkVMMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzNFhfSU5UUl9CWVBBU1MwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfQllQQVNTMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX0JZUEFTUzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9CWVBBU1MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfU0VUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX1NFVDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSU5UUl9TRVQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfU0VUMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgICAgICAgICAgICAgICAgICAgIDB4N2YgfSwKKwl7IFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX1NUQVRVUywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19DTEVBUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFNV9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfREVWSUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAweDQ5IH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1JFVklTSU9OLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19IX0NPTU1BTkQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfTlVNQkVSX09GX0JZVEVfTVNCLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX05VTUJFUl9PRl9CWVRFX0xTQiwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19NQVNURVJfQUREUkVTU19NU0IsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfTUFTVEVSX0FERFJFU1NfTFNCLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NMQVZFX0FERFJFU1NfTVNCLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TTEFWRV9BRERSRVNTX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfVElNRVIwX0lOVEVSUlVQVF9NU0IsICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMF9JTlRFUlJVUFRfTFNCLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19USU1FUjFfSU5URVJSVVBUX01TQiwgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfVElNRVIxX0lOVEVSUlVQVF9MU0IsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMl9JTlRFUlJVUFRfTVNCLCAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19USU1FUjJfSU5URVJSVVBUX0xTQiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfQ09NTV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0ZSQU1FX0NUUkwsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fMk5EX0RBVEFfQ0gxXzIsICAgICAgICAgICAgIDB4NzcgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NIM180LCAgICAgICAgICAgICAweDc3IH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDUsICAgICAgICAgICAgICAgMHg3MCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TV19FVkVOVF9SRCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1dfRVZFTlRfQ1RSTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMSwgICAgICAgICAgICAgICAgICAgMHgxMiB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzIsICAgICAgICAgICAgICAgICAgIDB4MzQgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX1NFTEVDVF8zLCAgICAgICAgICAgICAgICAgICAweDU1IH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TQU1QTElOR19GUkVRLCAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVkVSU0lPTl9DVEwsICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZFUlNJT05fU0VMLCAgICAgICAgICAweDExIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQV9NU0IsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEFfTFNCLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hCX01TQiwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQl9MU0IsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19SQU1fQ05UUkwsICAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CQU5LLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8wLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV82LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzgsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV85LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0IsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9DLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0UsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9GLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzExLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE0LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xOCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTksICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFBLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFELCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjgsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI5LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJDLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJGLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM4LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zOSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0EsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNCLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0QsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNFLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19UT1BfQ1RSTDEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfVE9QX0NUUkwyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fTVVURV9DVFJMLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19DVFJMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfU1RBVFVTLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0ZTLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19JTl9TRUwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0dQT1VUX0VOQUJMRSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19HUE9VVF9WQUwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9NQVNLLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfU1RBVFVTLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19BTkFfSU5URVJSVVBUX0NMUiwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSVBfVEVTVElORywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRSTCwgICAgICAgICAgICAgICAgMHgwZiB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05ULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVF9NU0IsICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRfTFNCLCAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzAsICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0sxLCAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLMiwgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzMsICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0s0LCAgICAgICAgICAgICAgICAweDFmIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMwLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzIsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMzLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTNCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjAsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIxLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSMiwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjMsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFI0LCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9BTkFfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX0JJQVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9SQ08sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9BTkFfUEFHRTZfU1BBUkUyLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX1BBR0U2X1NQQVJFMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9BTkFfQlVDS19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9IUEgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAorCXsgV0NEOTM0WF9BTkFfRUFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX0xPXzFfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNjIH0sCisJeyBXQ0Q5MzRYX0FOQV9NQURfU0VUVVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9BTkFfQU1JQzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQU5BX0FNSUMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9BTUlDMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9BTkFfQU1JQzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX01CSENfTUVDSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM5IH0sCisJeyBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQU5BX01CSENfQlROMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9BTkFfTUJIQ19CVE4yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQU5BX01CSENfQlROMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwIH0sCisJeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9BTkFfTUJIQ19CVE41LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKKwl7IFdDRDkzNFhfQU5BX01CSENfQlRONiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjcsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MCB9LAorCXsgV0NEOTM0WF9BTkFfTUlDQjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQU5BX01JQ0IyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0FOQV9NSUNCMl9SQU1QLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9BTkFfTUlDQjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQU5BX01JQ0I0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0FOQV9WQkFEQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9CSUFTX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKKwl7IFdDRDkzNFhfQklBU19WQkdfRklORV9BREosICAgICAgICAgICAgICAgICAgICAgICAweDY1IH0sCisJeyBXQ0Q5MzRYX1JDT19DVFJMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NCB9LAorCXsgV0NEOTM0WF9SQ09fQ1RSTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDggfSwKKwl7IFdDRDkzNFhfUkNPX0NBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1JDT19DQUxfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9SQ09fQ0FMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUkNPX1RFU1RfQ1RSTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1JDT19DQUxfT1VUXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9SQ09fQ0FMX09VVF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUkNPX0NBTF9PVVRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1JDT19DQUxfT1VUXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9SQ09fQ0FMX09VVF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lET19NT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZSB9LAorCXsgV0NEOTM0WF9TSURPX01PREVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjYgfSwKKwl7IFdDRDkzNFhfU0lET19NT0RFXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2IH0sCisJeyBXQ0Q5MzRYX1NJRE9fVkNMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURPX1ZDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMgfSwKKwl7IFdDRDkzNFhfU0lET19WQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0NMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NyB9LAorCXsgV0NEOTM0WF9TSURPX0NDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIgfSwKKwl7IFdDRDkzNFhfU0lET19DQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0NMXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MSB9LAorCXsgV0NEOTM0WF9TSURPX0NDTF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQgfSwKKwl7IFdDRDkzNFhfU0lET19DQ0xfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0NMXzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZiB9LAorCXsgV0NEOTM0WF9TSURPX0NDTF84LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmYgfSwKKwl7IFdDRDkzNFhfU0lET19DQ0xfOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlIH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0NMXzEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNiB9LAorCXsgV0NEOTM0WF9TSURPX0ZJTFRFUl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIgfSwKKwl7IFdDRDkzNFhfU0lET19GSUxURVJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0IH0sCisJeyBXQ0Q5MzRYX1NJRE9fRFJJVkVSXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NyB9LAorCXsgV0NEOTM0WF9TSURPX0RSSVZFUl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTUgfSwKKwl7IFdDRDkzNFhfU0lET19EUklWRVJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU1IH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfRVhUXzEsICAgICAgICAgICAgICAgICAgICAgMHg5YyB9LAorCXsgV0NEOTM0WF9TSURPX0NBTF9DT0RFX0VYVF8yLCAgICAgICAgICAgICAgICAgICAgIDB4ODIgfSwKKwl7IFdDRDkzNFhfU0lET19DQUxfQ09ERV9PVVRfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfT1VUXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURPX1RFU1RfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lET19URVNUXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01CSENfQ1RMX0NMSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMCB9LAorCXsgV0NEOTM0WF9NQkhDX0NUTF9BTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUJIQ19DVExfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01CSENfQ1RMX1NQQVJFXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NQkhDX0NUTF9CQ1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUJIQ19TVEFUVVNfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01CSENfVEVTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9WQkFEQ19TVUJCTE9DS19FTiwgICAgICAgICAgICAgICAgICAgICAgIDB4ZGUgfSwKKwl7IFdDRDkzNFhfVkJBRENfSUJJQVNfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4IH0sCisJeyBXQ0Q5MzRYX1ZCQURDX0JJQVNfQURDLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MSB9LAorCXsgV0NEOTM0WF9WQkFEQ19GRV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWMgfSwKKwl7IFdDRDkzNFhfVkJBRENfQURDX1JFRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX1ZCQURDX0FEQ19JTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAorCXsgV0NEOTM0WF9WQkFEQ19BRENfU0FSLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfVkJBRENfREVCVUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0xET0hfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYiB9LAorCXsgV0NEOTM0WF9MRE9IX0JJQVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKKwl7IFdDRDkzNFhfTERPSF9TVEJfTE9BRFMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0xET0hfU0xPV1JBTVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAorCXsgV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKKwl7IFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAorCXsgV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKKwl7IFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAorCXsgV0NEOTM0WF9NSUNCM19URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKKwl7IFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAorCXsgV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKKwl7IFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAorCXsgV0NEOTM0WF9UWF9DT01fQURDX1ZDTSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzkgfSwKKwl7IFdDRDkzNFhfVFhfQ09NX0JJQVNfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAweGMwIH0sCisJeyBXQ0Q5MzRYX1RYX0NPTV9BRENfSU5UMV9JQiwgICAgICAgICAgICAgICAgICAgICAgMHg2ZiB9LAorCXsgV0NEOTM0WF9UWF9DT01fQURDX0lOVDJfSUIsICAgICAgICAgICAgICAgICAgICAgIDB4NGYgfSwKKwl7IFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDJlIH0sCisJeyBXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVEFSVCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNLCAgICAgICAgICAgICAgIDB4YzcgfSwKKwl7IFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX1NUT1BfMTJQMjg4TSwgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX1RYXzFfMl9URVNUX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjYyB9LAorCXsgV0NEOTM0WF9UWF8xXzJfQURDX0lCLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKKwl7IFdDRDkzNFhfVFhfMV8yX0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgICAweDBhIH0sCisJeyBXQ0Q5MzRYX1RYXzFfMl9URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOCB9LAorCXsgV0NEOTM0WF9UWF8xXzJfVEVTVF9CTEtfRU4sICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfVFhfMV8yX1RYRkVfQ0xLRElWLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RYXzFfMl9TQVIxX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UWF8xXzJfU0FSMl9FUlIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVFhfM180X1RFU1RfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAweGNjIH0sCisJeyBXQ0Q5MzRYX1RYXzNfNF9BRENfSUIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSB9LAorCXsgV0NEOTM0WF9UWF8zXzRfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MGEgfSwKKwl7IFdDRDkzNFhfVFhfM180X1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4IH0sCisJeyBXQ0Q5MzRYX1RYXzNfNF9URVNUX0JMS19FTiwgICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9UWF8zXzRfVFhGRV9DTEtESVYsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVFhfM180X1NBUjFfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RYXzNfNF9TQVIyX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEFTU0hfTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfQ0xBU1NIX01PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNhIH0sCisJeyBXQ0Q5MzRYX0NMQVNTSF9NT0RFXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9WQ0xfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKKwl7IFdDRDkzNFhfQ0xBU1NIX0NUUkxfVkNMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDgyIH0sCisJeyBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgzMSB9LAorCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzMsICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF80LCAgICAgICAgICAgICAgICAgICAgICAgMHg1MSB9LAorCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfNSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMQVNTSF9CVUNLX1NXX0RSVl9DTlRMLCAgICAgICAgICAgICAgICAgMHg3NyB9LAorCXsgV0NEOTM0WF9DTEFTU0hfU1BBUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRkxZQkFDS19FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlIH0sCisJeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwYiB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4NDUgfSwKKwl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMywgICAgICAgICAgICAgICAgICAgICAweDc0IH0sCisJeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzQsICAgICAgICAgICAgICAgICAgICAgMHg3ZiB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF81LCAgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKKwl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNiwgICAgICAgICAgICAgICAgICAgICAweDk4IH0sCisJeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzcsICAgICAgICAgICAgICAgICAgICAgMHhhOSB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF84LCAgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKKwl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfOSwgICAgICAgICAgICAgICAgICAgICAweDY0IH0sCisJeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzEsICAgICAgICAgICAgICAgICAgMHhlZCB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8yLCAgICAgICAgICAgICAgICAgIDB4ZjAgfSwKKwl7IFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMywgICAgICAgICAgICAgICAgICAweGE2IH0sCisJeyBXQ0Q5MzRYX0ZMWUJBQ0tfQ1RSTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUlhfQVVYX1NXX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1JYX1BBX0FVWF9JTl9DT05OLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9SWF9USU1FUl9ESVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIgfSwKKwl7IFdDRDkzNFhfUlhfT0NQX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmIH0sCisJeyBXQ0Q5MzRYX1JYX09DUF9DT1VOVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NyB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0VBUl9EQUMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19FQVJfQU1QLCAgICAgICAgICAgICAgICAgICAgICAgICAweGFhIH0sCisJeyBXQ0Q5MzRYX1JYX0JJQVNfSFBIX0xETywgICAgICAgICAgICAgICAgICAgICAgICAgMHhhOSB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0hQSF9QQSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMiwgICAgICAgICAgICAgICAweDhhIH0sCisJeyBXQ0Q5MzRYX1JYX0JJQVNfSFBIX1JEQUNfTERPLCAgICAgICAgICAgICAgICAgICAgMHg4OCB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0hQSF9DTlAxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsICAgICAgICAgICAgICAgICAgICAweDgyIH0sCisJeyBXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX1BBLCAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19SRUYsICAgICAgICAgICAgICAgICAgICAgIDB4ODggfSwKKwl7IFdDRDkzNFhfUlhfQklBU19ESUZGTE9fTERPLCAgICAgICAgICAgICAgICAgICAgICAweDg4IH0sCisJeyBXQ0Q5MzRYX1JYX0JJQVNfU0VMT19EQUNfUEEsICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0JVQ0tfUlNULCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QLCAgICAgICAgICAgICAgICAweDQ0IH0sCisJeyBXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9FUlJBTVAsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9SWF9CSUFTX0ZMWUJfQlVGRiwgICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19GTFlCX01JRF9SU1QsICAgICAgICAgICAgICAgICAgICAweDE0IH0sCisJeyBXQ0Q5MzRYX0hQSF9MX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9IUEhfUl9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfSFBIX0NOUF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCisJeyBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YSB9LAorCXsgV0NEOTM0WF9IUEhfQ05QX1dHX1RJTUUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQgfSwKKwl7IFdDRDkzNFhfSFBIX09DUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4IH0sCisJeyBXQ0Q5MzRYX0hQSF9BVVRPX0NIT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiB9LAorCXsgV0NEOTM0WF9IUEhfQ0hPUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKKwl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ2IH0sCisJeyBXQ0Q5MzRYX0hQSF9QQV9DVEwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAorCXsgV0NEOTM0WF9IUEhfTF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzNFhfSFBIX0xfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzRYX0hQSF9MX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAorCXsgV0NEOTM0WF9IUEhfUl9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKKwl7IFdDRDkzNFhfSFBIX1JfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzRYX0hQSF9SX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCB9LAorCXsgV0NEOTM0WF9IUEhfUkRBQ19DTEtfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgIDB4OTkgfSwKKwl7IFdDRDkzNFhfSFBIX1JEQUNfQ0xLX0NUTDIsICAgICAgICAgICAgICAgICAgICAgICAweDliIH0sCisJeyBXQ0Q5MzRYX0hQSF9SREFDX0xET19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgMHgzMyB9LAorCXsgV0NEOTM0WF9IUEhfUkRBQ19DSE9QX0NMS19MUF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfVUhRQV9DVEwsICAgICAgICAgICAgICAgICAgICAweGE4IH0sCisJeyBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwYSB9LAorCXsgV0NEOTM0WF9IUEhfTF9EQUNfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX1JfREFDX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VBUl9FTl9SRUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAorCXsgV0NEOTM0WF9FQVJfQ01CVUZGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfRUFSX0lDVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzRYX0VBUl9FTl9EQkdfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9FQVJfQ05QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKKwl7IFdDRDkzNFhfRUFSX0RBQ19DVExfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VBUl9TVEFUVVNfUkVHLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9FQVJfRUFSX01JU0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKKwl7IFdDRDkzNFhfRElGRl9MT19NSVNDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0RJRkZfTE9fTE8yX0NPTVBBTkRFUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ESUZGX0xPX0xPMV9DT01QQU5ERVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRElGRl9MT19DT01NT04sICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzRYX0RJRkZfTE9fQllQQVNTX0VOLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ESUZGX0xPX0NOUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfRElGRl9MT19DT1JFX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgICAweGEwIH0sCisJeyBXQ0Q5MzRYX0RJRkZfTE9fTERPX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSwgICAgICAgICAgIDB4OGIgfSwKKwl7IFdDRDkzNFhfRElGRl9MT19DT01fUEFfRlJFUSwgICAgICAgICAgICAgICAgICAgICAweGIwIH0sCisJeyBXQ0Q5MzRYX0RJRkZfTE9fUkVTRVJWRURfUkVHLCAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAorCXsgV0NEOTM0WF9ESUZGX0xPX0xPMV9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRElGRl9MT19MTzFfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0FOQV9ORVdfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfQU5BX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9TTE5RX0FOQV9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9BTkFfTERPX0NPTkZJRywgICAgICAgICAgICAgICAgICAgICAweGVhIH0sCisJeyBXQ0Q5MzRYX1NMTlFfQU5BX0xET19PQ1BfQ09ORklHLCAgICAgICAgICAgICAgICAgMHg5NSB9LAorCXsgV0NEOTM0WF9TTE5RX0FOQV9UWF9MRE9fQ09ORklHLCAgICAgICAgICAgICAgICAgIDB4YjYgfSwKKwl7IFdDRDkzNFhfU0xOUV9BTkFfVFhfRFJWX0NPTkZJRywgICAgICAgICAgICAgICAgICAweDI2IH0sCisJeyBXQ0Q5MzRYX1NMTlFfQU5BX1JYX0NPTkZJR18xLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAorCXsgV0NEOTM0WF9TTE5RX0FOQV9SWF9DT05GSUdfMiwgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9BTkFfUExMX0VOQUJMRVMsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9QUkVTRVQsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9TTE5RX0FOQV9QTExfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19QTExfRU5BQkxFUywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfUExMX1BSRVNFVCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX1BMTF9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19YT19QUkcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfWE9fQ0FQX1hUUCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX1hPX0NBUF9YVE0sICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQk9PU1RfQlNUX0VOX0RMWSwgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCisJeyBXQ0Q5MzRYX0JPT1NUX0NUUkxfSUxJTSwgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YyB9LAorCXsgV0NEOTM0WF9CT09TVF9WT1VUX1NFVFRJTkcsICAgICAgICAgICAgICAgICAgICAgIDB4Y2EgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfVk9VVF9BX1NUQVJUVVAsICAgICAgICAgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9TVEFSVFVQLCAgICAgICAgICAgICAgICAgMHgwZCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTEsICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX0ZSRVEyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01CSENfTkVXX0VMRUNUX1JFTV9DTEFNUF9DVEwsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NQkhDX05FV19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX01CSENfTkVXX1BMVUdfREVURUNUX0NUTCwgICAgICAgICAgICAgICAgMHhlOSB9LAorCXsgV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwsICAgICAgICAgICAgICAgICAgIDB4MGYgfSwKKwl7IFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9SQU1QX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01CSENfTkVXX0ZTTV9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NQkhDX05FV19BRENfUkVTVUxULCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVFhfTkVXX0FNSUNfNF81X1NFTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1ZCQURDX05FV19BRENfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9WQkFEQ19ORVdfQURDX0RPVVRNU0IsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVkJBRENfTkVXX0FEQ19ET1VUTFNCLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVEwsICAgICAgICAgICAgICAgIDB4YTAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19WUkVGX0NUTCwgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfT1ZFUlJJREVfQ1RMLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX01JU0MxLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzEsICAgICAgICAgICAgICAgICAgICAweDIyIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgICAgICAgICAgICAgICAgICAweGZlIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIsICAgICAgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzLCAgICAgICAgICAgICAgICAgIDB4NGUgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCwgICAgICAgICAgICAgICAgICAweDU0IH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MzLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19CSUFTX0xPSElGSSwgICAgICAgICAweDYyIH0sCisJeyBXQ0Q5MzRYX1JYX05FV19JTlRfSFBIX1JEQUNfQklBU19VTFAsICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0xET19MUCwgICAgICAgICAgICAgIDB4MTEgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fVEVTVCwgICAgICAgICAgICAgICAweDBkIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfTERPX0RFQlVHXzEsICAgICAgICAgICAgMHg4NSB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18yLCAgICAgICAgICAgIDB4YjQgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9UWF9MRE9fVEVTVCwgICAgICAgICAgICAweDE2IH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfVFhfRFJWX1RFU1QsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX1RFU1QsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUX1NUQVRVUywgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfREVCVUdfMSwgICAgICAgICAgICAgMHg1MCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX0RFQlVHXzIsICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9DTEtfQ1RSTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUkVTRVJWRURfMSwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzIsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUE9TVF9ESVZfUkVHMCwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzEsICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9SRUZfRElWX1JFRzAsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUkVGX0RJVl9SRUcxLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0ZJTFRFUl9SRUcwLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9GSUxURVJfUkVHMSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTF9WQUwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX01fVkFMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9OX1ZBTCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcwLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BGRF9DUF9EU01fUFJPRywgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9WQ09fUFJPRywgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcxLCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0xET19MT0NLX0NGRywgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9ESUdfTE9DS19ERVRfQ0ZHLCAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUE9TVF9ESVZfUkVHMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzEsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9SRUZfRElWX1JFRzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0ZJTFRFUl9SRUcwLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMSwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUExMX0xfVkFMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9NX1ZBTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTl9WQUwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BGRF9DUF9EU01fUFJPRywgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9WQ09fUFJPRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0xET19MT0NLX0NGRywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9ESUdfTE9DS19ERVRfQ0ZHLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9DTEtfVEVTVDMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfWE9fVEVTVDEsICAgICAgICAgICAgICAgICAgICAweDk4IH0sCisJeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1hPX1RFU1QyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9CT09TVF9JTlRfVkNPTVBfSFlTVCwgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQk9PU1RfSU5UX1ZMT09QX0ZJTFRFUiwgICAgICAgICAgICAgICAgICAweGVmIH0sCisJeyBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX0lERUxUQSwgICAgICAgICAgICAgICAgICAgMHhhOCB9LAorCXsgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JTElNX1NUQVJUVVAsICAgICAgICAgICAgIDB4MTcgfSwKKwl7IFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfTUlOX09OVElNRSwgICAgICAgICAgICAgICAweDVmIH0sCisJeyBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX01BWF9PTlRJTUUsICAgICAgICAgICAgICAgMHg4OCB9LAorCXsgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9USU1JTkcsICAgICAgICAgICAgICAgICAgIDB4MGEgfSwKKwl7IFdDRDkzNFhfQk9PU1RfSU5UX1RNVVhfQV9ELCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0JPT1NUX0lOVF9TV19EUlZfQ05UTCwgICAgICAgICAgICAgICAgICAgMHhmOCB9LAorCXsgV0NEOTM0WF9CT09TVF9JTlRfU1BBUkUxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQk9PU1RfSU5UX1NQQVJFMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX1NUQVRVUywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19JTlRfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX1ZPVVRfU0VUVElOR19BLCAgICAgICAweDY0IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfRCwgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9JTkNfV0FJVCwgICAgICAgICAgICAgIDB4MjQgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfQ1RMLCAgICAgICAgICAweDA5IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0lCTEVFRF9DVEwsICAgICAgICAgICAgMHg3ZCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19JTlRfREVCVUdfQ1BST1ZSX1RFU1QsICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfQ1RMX0EsICAgICAgICAgICAgICAgICAweDE0IH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0NUTF9ELCAgICAgICAgICAgICAgICAgMHgxNCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9USU1FT1VUX1BFUklPRCwgICAgICAgIDB4MzMgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzEsICAgICAweDNmIH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkcyLCAgICAgMHg3NCB9LAorCXsgV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMywgICAgIDB4MzMgfSwKKwl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0hJR0hfQUNDVV9NT0RFX1NFTDEsICAgICAgICAweDFkIH0sCisJeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ISUdIX0FDQ1VfTU9ERV9TRUwyLCAgICAgICAgMHgwYSB9LAorCXsgV0NEOTM0WF9NQkhDX05FV19JTlRfU0xOUV9IUEYsICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKKwl7IFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfUkVGLCAgICAgICAgICAgICAgICAgICAweDI0IH0sCisJeyBXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX0NPTVAsICAgICAgICAgICAgICAgICAgMHg1MCB9LAorCXsgV0NEOTM0WF9NQkhDX05FV19JTlRfU1BBUkVfMiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUEFHRTEwX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9NT0RFXzFfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8yX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0ZGX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9GQl9TSElGVCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfTFBGX0ZGX0FfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9CX0NUTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9MUEZfRkJfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfU01MUEZfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0RDRkxUX1NISUZUX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfRkZfQl9HQUlOX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX0ZCX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9SQ19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfRklGT19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAweDg4IH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX1JDMF9TVEFUVVNfRk1JTl9DTlRSLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNSU5fQ05UUiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzBfUkMwX1NUQVRVU19GTUFYX0NOVFIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMwX1JDMV9TVEFUVVNfRk1BWF9DTlRSLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMV9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfRkZfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX0ZCX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9MUEZfRkZfQV9DVEwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfTFBGX0ZGX0JfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GQl9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9TTUxQRl9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9BREFQVF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9GRl9CX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfRkJfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX1JDX0NPTU1PTl9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9GSUZPX0NPTU1PTl9DVEwsICAgICAgICAgICAgICAgIDB4ODggfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUlOX0NOVFIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX1JDMV9TVEFUVVNfRk1JTl9DTlRSLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQU5DMV9SQzBfU1RBVFVTX0ZNQVhfQ05UUiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0FOQzFfUkMxX1NUQVRVU19GTUFYX0NOVFIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19BTkMxX1NUQVRVU19GSUZPLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgICAweDI1IH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAorCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfVFgyX1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYM19UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAorCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfVFg1X1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAorCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfVFg4X1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsICAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgICAweDAyIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFMTFfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMCwgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDEsICAgICAgICAgICAgICAgICAgICAgMHhkYiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwyLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMywgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDQsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw1LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNiwgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDcsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwwLCAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDIsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwzLCAgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNCwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw2LCAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDMsICAgICAgICAgICAgICAgICAgICAgMHgzNSB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw0LCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDYsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw3LCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMCwgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDEsICAgICAgICAgICAgICAgICAgICAgMHhkYiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwyLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMywgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDQsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw1LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNiwgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDcsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwwLCAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAweGRiIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDIsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwzLCAgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNCwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw2LCAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMsICAgICAgICAgICAgICAgICAgICAgMHgzNSB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw0LCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKKwl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDYsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw3LCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4NjQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgICAweDdlIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4ZmMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfRFNNREVNX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4NjQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgICAweDhmIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgICAweDdlIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4ZmMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzEsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0RTTURFTV9DVEwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDY0IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAgMHg4ZiB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDA0IH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAgMHg3ZSB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweGZjIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHhmYyB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHhmYyB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFMTJfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfQ1JDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX0RMWV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfQ0xTSF9ERUNBWV9DVFJMLCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfUEEsICAgICAgICAgICAgICAgICAgICAgICAweDFjIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX0VBUl9WX1BBLCAgICAgICAgICAgICAgICAgICAgICAgMHgzOSB9LAorCXsgV0NEOTM0WF9DRENfQ0xTSF9IUEhfVl9IRCwgICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfRUFSX1ZfSEQsICAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX0sxX01TQiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfQ0xTSF9LMV9MU0IsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfSzJfTVNCLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX0syX0xTQiwgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAorCXsgV0NEOTM0WF9DRENfQ0xTSF9JRExFX0NUUkwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfSURMRV9IUEgsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfRUFSLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQ0xTSF9URVNUMCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDEsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTFNIX09WUl9WUkVGLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DVEwsICAgICAgICAgICAgICAgICAgICAweGIyIH0sCisJeyBXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHhiMiB9LAorCXsgV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0NGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwzLCAgICAgICAgICAgICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxLCAgICAgICAgICAgICAgICAgICAweGUwIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEtfRVNUMiwgICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDMsICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSwgICAgICAgICAgICAgICAgICAweDJhIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIsICAgICAgICAgICAgICAgICAgMHg4NiB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzEsICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9UQUMyLCAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMywgICAgICAgICAgICAgICAgICAgICAgMHgxOCB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDEsICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMywgICAgICAgICAgICAgICAgIDB4NjQgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDQsICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfREVCVUcxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTiwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQkFOLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMiwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMywgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMiwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRywgICAgICAgICAgICAgICAweDBmIH0sCisJeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVMsICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwsICAgICAgIDB4MDQgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwgICAgICAgMHgwNCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DRkcxLCAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfRklGT19DVEwsICAgICAgICAgICAgICAgICAweGE4IH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfRklGT19DVEwsICAgICAgICAgICAgICAgICAweGE4IH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRklGTywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfUkVGX0hRMF9FQ19SRUZfSFFfUEFUSF9DVEwsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX1JFRl9IUTBfRUNfUkVGX0hRX0NGRzAsICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9FQ19SRUZfSFExX0VDX1JFRl9IUV9QQVRIX0NUTCwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfUkVGX0hRMV9FQ19SRUZfSFFfQ0ZHMCwgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMwX0NMS19SU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMF9DVEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzBfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMwX0ZJRk9fQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZJRk8sICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMxX0NMS19SU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMV9DVEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzFfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMxX0ZJRk9fQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQiwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZJRk8sICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1BBR0UxM19QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMSwgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0VDX1JFRl9IUV9DRkcwLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNV9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYOF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwLCAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMSwgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIsICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczLCAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMCwgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEsICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyLCAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMywgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMywgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLCAgICAgICAgIDB4MGMgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0FTUkNfU0hBUkVfQ09OVFJPTCwgICAgIDB4MGYgfSwKKwl7IFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9HRk1fQ09OVFJPTCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTCwgICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDAsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QxLCAgICAgICAweDRiIH0sCisJeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQiwgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9NU0IsICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU1RBVFVTLCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCwgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCLCAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQiwgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQsICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTVNCX1JELCAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQsICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCwgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMV9DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNF9DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CN19DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwsICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwsICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMLCAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMLCAgICAgICAgICAgICAgIDB4NDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMLCAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IxX0NUTCwgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMl9DVEwsICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX1RPUF9DRkc3LCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX01TQiwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9MVVQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX01TQiwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9XUl9NU0IsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfTFVULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9SRF9NU0IsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfRFNEMF9DRkcyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIgfSwKKwl7IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAorCXsgV0NEOTM0WF9DRENfRFNEMF9DRkc1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfRFNEMV9DRkcxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyIH0sCisJeyBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfRFNEMV9DRkc0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKKwl7IFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKKwl7IFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCisJeyBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUEFHRTE0X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9QVUxTRV9TVVBSX0NUTCwgICAgICAgICAweDA2IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVElNRVIsICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0JXX1NXLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9USFJFU0gsICAgICAgICAgICAgICAgICAweGEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfQ1RSTCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX1RJTUVSMiwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlcxLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMiwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzMsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlc0LCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXNSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMSwgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzIsICAgICAgICAgMHgwNyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlczLCAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXNCwgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzUsICAgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzEsICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlcyLCAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMywgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzQsICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlc1LCAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMSwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzIsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlczLCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXNCwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzUsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9STUFYX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1JTl9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1BIX0RFVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0NMUiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfTUJfU1dfU1RBVEUsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX01BU1RfRElBR19TVEFURSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF83XzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMTVfOCwgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzIzXzE2LCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8zMV8yNCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzlfMzIsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzQwXzQzLCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9DTEtfUlNUX0NUTCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwOSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1BVTFNFX1NVUFJfQ1RMLCAgICAgICAgIDB4MDYgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9USU1FUiwgICAgICAgICAgICAgICAgICAweDAxIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQldfU1csICAgICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1RIUkVTSCwgICAgICAgICAgICAgICAgIDB4YTAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9TVEFUVVMsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19DVFJMLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfVElNRVIyLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzEsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlcyLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMywgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzQsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlc1LCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlcxLCAgICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMiwgICAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzMsICAgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlc0LCAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNSwgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMSwgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzIsICAgICAgIDB4MDcgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlczLCAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXNCwgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzUsICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlcxLCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMiwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzMsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlc0LCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNSwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JNQVhfRElBRywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9STUlOX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUEhfREVULCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ0xSLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9NQl9TV19TVEFURSwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfTUFTVF9ESUFHX1NUQVRFLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzdfMCwgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8xNV84LCAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMjNfMTYsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzMxXzI0LCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8zOV8zMiwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfNDBfNDMsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0NMS19SU1RfQ1RMLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9DVEwsICAgICAgICAgICAgICAgICAgICAweDA5IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUFVMU0VfU1VQUl9DVEwsICAgICAgICAgMHgwNiB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1RJTUVSLCAgICAgICAgICAgICAgICAgIDB4MDEgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9CV19TVywgICAgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfVEhSRVNILCAgICAgICAgICAgICAgICAgMHhhMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1NUQVRVUywgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0NUUkwsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19USU1FUjIsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzIsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlczLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXNCwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzUsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzEsICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcyLCAgICAgICAgIDB4MDcgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlUX0JXMywgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzQsICAgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc1LCAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlcxLCAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMiwgICAgICAgMHgwNyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzMsICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlc0LCAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNSwgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzEsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlcyLCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMywgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzQsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlc1LCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUk1BWF9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JNSU5fRElBRywgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9QSF9ERVQsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DTFIsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX01CX1NXX1NUQVRFLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQVNUX0RJQUdfU1RBVEUsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfN18wLCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzE1XzgsICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8yM18xNiwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMzFfMjQsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzM5XzMyLCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF80MF80MywgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9QVUxTRV9TVVBSX0NUTCwgICAgICAgICAweDA2IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVElNRVIsICAgICAgICAgICAgICAgICAgMHgwMSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0JXX1NXLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9USFJFU0gsICAgICAgICAgICAgICAgICAweGEwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfQ1RSTCwgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX1RJTUVSMiwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlcxLCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMiwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzMsICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlc0LCAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXNSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMSwgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzIsICAgICAgICAgMHgwNyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlczLCAgICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXNCwgICAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzUsICAgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzEsICAgICAgIDB4MDggfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlcyLCAgICAgICAweDA3IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMywgICAgICAgMHgwNSB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzQsICAgICAgIDB4MDUgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlc1LCAgICAgICAweDA1IH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMSwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzIsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlczLCAgICAgICAgICAweDAzIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXNCwgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzUsICAgICAgICAgIDB4MDMgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9STUFYX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1JTl9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1BIX0RFVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0NMUiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfTUJfU1dfU1RBVEUsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX01BU1RfRElBR19TVEFURSwgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF83XzAsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMTVfOCwgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzIzXzE2LCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8zMV8yNCwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzlfMzIsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzQwXzQzLCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfUEFHRTE1X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9TUExJTkVfU1JDMF9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgICAweDIwIH0sCisJeyBXQ0Q5MzRYX1NQTElORV9TUkMxX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfU1BMSU5FX1NSQzJfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9TUExJTkVfU1JDM19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMCwgICAgICAgICAgICAgICAweDExIH0sCisJeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzEsICAgICAgICAgICAgICAgMHgyMCB9LAorCXsgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcyLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMywgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzAsICAgICAgICAgICAgICAgMHgxMSB9LAorCXsgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcxLCAgICAgICAgICAgICAgIDB4MjAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMiwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzMsICAgICAgICAgICAgICAgMHgwOCB9LAorCXsgV0NEOTM0WF9DRENfREVCVUdfU1BMSU5FX1NSQ19ERUJVR19DRkcwLCAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX1NQTElORV9TUkNfREVCVUdfQ0ZHMSwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NEQ19ERUJVR19SQ19SRV9BU1JDX0RFQlVHX0NGRzAsICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DRENfREVCVUdfQU5DMF9SQzBfRklGT19DVEwsICAgICAgICAgICAgIDB4NGMgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX0FOQzBfUkMxX0ZJRk9fQ1RMLCAgICAgICAgICAgICAweDRjIH0sCisJeyBXQ0Q5MzRYX0NEQ19ERUJVR19BTkMxX1JDMF9GSUZPX0NUTCwgICAgICAgICAgICAgMHg0YyB9LAorCXsgV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzFfRklGT19DVEwsICAgICAgICAgICAgIDB4NGMgfSwKKwl7IFdDRDkzNFhfQ0RDX0RFQlVHX0FOQ19SQ19SU1RfREJHX0NOVFIsICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1BBR0U4MF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX0FDQ0VTU19DRkcsICAgICAgICAgICAgICAgICAgICAweDBmIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMyB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX0NYX1ZERCwgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19DWF9WREQsICAgICAgICAgICAgICAgICAgICAweDVjIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERCwgICAgICAgICAgICAgICAgICAgMHg0MCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX01YX1ZERCwgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19NWF9WREQsICAgICAgICAgICAgICAgICAgICAweGI0IH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01YX1ZERCwgICAgICAgICAgICAgICAgICAgMHhhMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NSU5fQ1hfVkRELCAgICAgICAgICAgICAgIDB4MjggfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX01BWF9TVlMyX1NURVAsICAgICAgICAgICAgICAgICAweDA4IH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9DT0RFQ19DUFJfU1dfTU9ERUNITkdfU1RBVFVTLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVJULCAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX0NPREVDX0NQUl9DUFJfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9QQUdFMTI4X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9CSVNUX01PREVfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fUkZfUEFfT05fUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0lOVFIxX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9JTlRSMl9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fU1dSX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX1NXUl9DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9JMlNfMl9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fU0xJTUJVU19EQVRBMV9QSU5DRkcsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9TTElNQlVTX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fSTJDX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0kyQ19EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9JMlNfMF9SWF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fSTJTXzBfVFhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0kyU18wX1NDS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9JMlNfMF9XU19QSU5DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fSTJTXzFfUlhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0kyU18xX1RYX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9JMlNfMV9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fSTJTXzFfV1NfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0RNSUMxX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9ETUlDMV9EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fRE1JQzJfQ0xLX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0RNSUMyX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9ETUlDM19DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0pUQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9HUElPMV9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fR1BJTzJfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0dQSU8zX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9HUElPNF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fU1BJX1NfQ1NOX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX1NQSV9TX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9TUElfU19ET1VUX1BJTkNGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fU1BJX1NfRElOX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0JBX05fUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVExNTV9HUElPMF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RMTU1fSTJTXzJfUlhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9UTE1NX0kyU18yX1dTX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzAsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8xLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMiwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzMsICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV80LCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzIsICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfNCwgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0RSVkNUTF8wLCAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMSwgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fU1RBVFVTLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEsICAgICAgICAgICAgICAgMHgxMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yLCAgICAgICAgICAgICAgIDB4NjAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19NRU1fQ1RSTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfQlVTX1NFTCwgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0pUQUcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl80LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fNSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX0FOQV9EVEVTVF9ESVIsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMCwgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzEsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8yLCAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMywgICAgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzQsICAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1NZU01FTV9DVFJMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19TT0NfU1dfUFdSX1NFUV9ERUxBWSwgICAgICAgICAweDAwIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fTE9XLCAgICAgICAgICAgICAgICAgMHg5NiB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0hJR0gsICAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0xPVywgICAgICAgICAgICAweDUzIH0sCisJeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9TVlNfU1ZTMl9ISUdILCAgICAgICAgICAgMHgwMCB9LAorCXsgV0NEOTM0WF9URVNUX0RFQlVHX1NQSV9TTEFWRV9DSEFSLCAgICAgICAgICAgICAgIDB4MDAgfSwKKwl7IFdDRDkzNFhfVEVTVF9ERUJVR19DT0RFQ19ESUFHUywgICAgICAgICAgICAgICAgICAweDAwIH0sCit9OworCisvKgorICogd2NkOTM0eF9yZWdtYXBfcmVnaXN0ZXJfcGF0Y2g6IFVwZGF0ZSByZWdpc3RlciBkZWZhdWx0cyBiYXNlZCBvbiB2ZXJzaW9uCisgKiBAcmVnbWFwOiBoYW5kbGUgdG8gd2NkOXh4eCByZWdtYXAKKyAqIEB2ZXJzaW9uOiB3Y2Q5MzR4IHZlcnNpb24KKyAqCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIG9yIDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IHdjZDkzNHhfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IHJldmlzaW9uKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIXJlZ21hcCkgeworCQlwcl9lcnIoIiVzOiByZWdtYXAgc3RydWN0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChyZXZpc2lvbikgeworCWNhc2UgVEFWSUxfVkVSU0lPTl8xXzE6CisJY2FzZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8xOgorCWNhc2UgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMToKKwkJcmVnY2FjaGVfY2FjaGVfb25seShyZWdtYXAsIHRydWUpOworCQlyYyA9IHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUocmVnbWFwLCB3Y2Q5MzR4XzFfMV9kZWZhdWx0cywKKwkJCQkJICAgIEFSUkFZX1NJWkUod2NkOTM0eF8xXzFfZGVmYXVsdHMpKTsKKwkJcmVnY2FjaGVfY2FjaGVfb25seShyZWdtYXAsIGZhbHNlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5MzR4X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaCk7CisKK3N0YXRpYyBib29sIHdjZDkzNHhfaXNfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXU4IHBnX251bSwgcmVnX29mZnNldDsKKwljb25zdCB1OCAqcmVnX3RibCA9IE5VTEw7CisKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBudW1iZXIgZnJvbSBNU0Igb2YgY29kZWMgcmVnaXN0ZXIuIElmIGl0cyAweDgwLCBhc3NpZ24KKwkgKiB0aGUgY29ycmVzcG9uZGluZyBwYWdlIGluZGV4IFBBR0VfMHg4MC4KKwkgKi8KKwlwZ19udW0gPSByZWcgPj4gMHg4OworCWlmIChwZ19udW0gPT0gMHg4MCkKKwkJcGdfbnVtID0gV0NEOTM0WF9QQUdFXzBYODA7CisJZWxzZSBpZiAocGdfbnVtID09IDB4NTApCisJCXBnX251bSA9IFdDRDkzNFhfUEFHRV8weDUwOworCWVsc2UgaWYgKHBnX251bSA+IDB4RikKKwkJcmV0dXJuIGZhbHNlOworCisJcmVnX3RibCA9IHdjZDkzNHhfcmVnW3BnX251bV07CisJcmVnX29mZnNldCA9IHJlZyAmIDB4RkY7CisKKwlpZiAocmVnX3RibCAmJiByZWdfdGJsW3JlZ19vZmZzZXRdKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgd2NkOTM0eF9pc192b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJdTggcGdfbnVtLCByZWdfb2Zmc2V0OworCWNvbnN0IHU4ICpyZWdfdGJsID0gTlVMTDsKKworCXBnX251bSA9IHJlZyA+PiAweDg7CisJaWYgKHBnX251bSA9PSAweDgwKQorCQlwZ19udW0gPSBXQ0Q5MzRYX1BBR0VfMFg4MDsKKwllbHNlIGlmIChwZ19udW0gPT0gMHg1MCkKKwkJcGdfbnVtID0gV0NEOTM0WF9QQUdFXzB4NTA7CisJZWxzZSBpZiAocGdfbnVtID4gMHhGKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZWdfdGJsID0gd2NkOTM0eF9yZWdbcGdfbnVtXTsKKwlyZWdfb2Zmc2V0ID0gcmVnICYgMHhGRjsKKworCWlmIChyZWdfdGJsICYmIHJlZ190YmxbcmVnX29mZnNldF0gPT0gV0NEOTM0WF9SRUFEKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElJUiBDb2VmZiByZWdpc3RlcnMgYXJlIG5vdCBjYWNoZWFibGUgKi8KKwlpZiAoKHJlZyA+PSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCkgJiYKKwkgICAgKHJlZyA8PSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyZWcgPj0gV0NEOTM0WF9DRENfQU5DMF9JSVJfQ09FRkZfMV9DVEwpICYmCisJICAgIChyZWcgPD0gV0NEOTM0WF9DRENfQU5DMF9GQl9HQUlOX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyZWcgPj0gV0NEOTM0WF9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwpICYmCisJICAgIChyZWcgPD0gV0NEOTM0WF9DRENfQU5DMV9GQl9HQUlOX0NUTCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKChyZWcgPj0gV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wKSAmJgorCSAgICAocmVnIDw9IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMykpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBOZWVkIHRvIG1hcmsgdm9sYXRpbGUgZm9yIHJlZ2lzdGVycyB0aGF0IGFyZSB3cml0YWJsZSBidXQKKwkgKiBvbmx5IGZldyBiaXRzIGFyZSByZWFkLW9ubHkKKwkgKi8KKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTDoKKwljYXNlIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wOgorCWNhc2UgV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzE6CisJY2FzZSBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTDoKKwljYXNlIFdDRDkzNFhfQ1BFX1NTX1NUQVRVUzoKKwljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEw6CisJY2FzZSBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQOgorCWNhc2UgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfU1RBUlRVUDoKKwljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTDoKKwljYXNlIFdDRDkzNFhfQU5BX01CSENfTUVDSDoKKwljYXNlIFdDRDkzNFhfQU5BX01CSENfRUxFQ1Q6CisJY2FzZSBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQ6CisJY2FzZSBXQ0Q5MzRYX0FOQV9NSUNCMjoKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3Y2Q5MzR4X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gOCwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gd2NkOTM0eF9kZWZhdWx0cywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod2NkOTM0eF9kZWZhdWx0cyksCisJLm1heF9yZWdpc3RlciA9IFdDRDkzNFhfTUFYX1JFR0lTVEVSLAorCS52b2xhdGlsZV9yZWcgPSB3Y2Q5MzR4X2lzX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSB3Y2Q5MzR4X2lzX3JlYWRhYmxlX3JlZ2lzdGVyLAorCS5jYW5fbXVsdGlfd3JpdGUgPSB0cnVlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDkzNHgtdGFibGVzLmMgYi9kcml2ZXJzL21mZC93Y2Q5MzR4LXRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTYzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93Y2Q5MzR4LXRhYmxlcy5jCkBAIC0wLDAgKzEsMjE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KKworI2RlZmluZSBXQ0Q5MzRYX1JFRyhyZWcpICAoKHJlZykgJiAweEZGKQorCitjb25zdCB1OCB3Y2Q5MzR4X3BhZ2UwX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UwX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0JZUEFTUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfR0FURSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEsyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX1JQTV9JMlNfRFNEX0NMS19TRUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUxKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQyKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ1KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDYpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ4KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDkpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTQpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTUpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfTk9OTkVHTyldID0KKwkJCQkJCQkJV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8xKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0FOQV9XQUlUX1NUQVRFX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfU0xOUV9XQUlUX1NUQVRFX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0FMVF9GVU5DX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfT0UpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9HUElPX0NUTF9EQVRBKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9SWDBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlgxX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1JYMl9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9SWDNfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlg0X0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1JYNV9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9SWDZfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlg3X0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMF9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxX0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDJfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYM19JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFg0X0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDVfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNl9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFg3X0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDhfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYOV9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxMF9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxMV9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxNF9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxNV9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfVFgxXzBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMV8xX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU18wX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU18xX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU18yX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU18zX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU19DTEtTUkNfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTX0NPTU1PTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfMF9URE1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfUkRNQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1JETUFfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19SRE1BXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfUkRNQV9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfUkRNQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1JETUFfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19SRE1BXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfUkRNQTRfUFJUX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX1NCVFgwXzdfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1JETUFfU0JUWDhfMTFfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUFfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQV9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUFfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQV9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BMF9QUlRfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUEzX1BSVF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQTRfUFJUMF8zX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BNF9QUlQ0XzdfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCit9OworCitjb25zdCB1OCB3Y2Q5MzR4X3BhZ2UxX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0xfVkFMX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0RTTV9GUkFDX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9GTExfTU9ERSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18xKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0xfVkFMX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9MX1ZBTF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRFNNX0ZSQUNfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9GTExfTU9ERSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18xKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfOSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9MX1ZBTF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9MX1ZBTF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9EU01fRlJBQ19DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9EU01fRlJBQ19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9GTExfTU9ERSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMyldID0gV0NEOTM0WF9SRUFELAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlMl9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMl9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVGTExfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfT1ZFUlJJREUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8zKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fNCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX0RSQU0xX1NIVVRET1dOKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9PVkVSUklERV9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfT1ZFUlJJREVfQ1RMMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1VTX0JVRl9JTlRfUEVSSU9EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1VTX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19NQURfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0RNSUMwX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19ETUlDMV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfRE1JQzJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0RNSUNfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1dET0dfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0JBQ0tVUF9JTlQpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NUQVRVUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19DUEVfT0NEX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMUEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18xQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18wQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzFBKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMUIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBBKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMEIpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8xQSldID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzFCKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fSUlSX0NUTF9QVFIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfSU5QX1NFTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlNF9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFNF9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NMUl9DT01NSVQpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX01BU0swKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX01BU0sxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX01BU0syKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX01BU0szKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMyKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIwKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjEpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMildID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIzKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMl9NQVNLMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMl9TVEFUVVMzKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4yX0NMRUFSMyldID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX01BU0syKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9NQVNLMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfU1RBVFVTMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfU1RBVFVTMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfQ0xFQVIyKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfQ0xFQVIzKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfTEVWRUwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9MRVZFTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0xFVkVMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfTEVWRUwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9CWVBBU1MwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9CWVBBU1MxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9CWVBBU1MyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9CWVBBU1MzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9TRVQwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9TRVQxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9TRVQyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9TRVQzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX01BU0spXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX0NMRUFSKV0gPSBXQ0Q5MzRYX1dSSVRFLAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlNV9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFNV9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfREVWSUNFKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUkVWSVNJT04pXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19IX0NPTU1BTkQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19OVU1CRVJfT0ZfQllURV9NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19OVU1CRVJfT0ZfQllURV9MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19NQVNURVJfQUREUkVTU19NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19NQVNURVJfQUREUkVTU19MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TTEFWRV9BRERSRVNTX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NMQVZFX0FERFJFU1NfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfVElNRVIwX0lOVEVSUlVQVF9NU0IpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMF9JTlRFUlJVUFRfTFNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19USU1FUjFfSU5URVJSVVBUX01TQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfVElNRVIxX0lOVEVSUlVQVF9MU0IpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMl9JTlRFUlJVUFRfTVNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19USU1FUjJfSU5URVJSVVBUX0xTQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfQ09NTV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19GUkFNRV9DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NIMV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NIM180KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NINSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NXX0VWRU5UX1JEKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1dfRVZFTlRfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9TQU1QTElOR19GUkVRKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZFUlNJT05fQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVkVSU0lPTl9TRUwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQV9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEFfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hCX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19SQU1fQ05UUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JBTkspXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfOSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9BKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0UpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xOSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yOSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zOSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RPUF9DVFJMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RPUF9DVFJMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNX01VVEVfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19GUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfSU5fU0VMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfR1BPVVRfRU5BQkxFKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfR1BPVVRfVkFMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9NQVNLKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19BTkFfSU5URVJSVVBUX0NMUildID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JUF9URVNUSU5HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVF9MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMxKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVM0KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjApXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjEpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjIpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjMpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjQpXSA9IFdDRDkzNFhfV1JJVEUsCit9OworCitjb25zdCB1OCB3Y2Q5MzR4X3BhZ2U2X3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0JJQVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfUkNPKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX1BBR0U2X1NQQVJFMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9QQUdFNl9TUEFSRTMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfQlVDS19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfQlVDS19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfSFBIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0VBUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9MT18xXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUFEX1NFVFVQKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0FNSUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0FNSUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0FNSUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0FNSUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfTUVDSCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfWkRFVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8xKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0JUTjApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE4xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfQlROMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0JUTjMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE40KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfQlRONSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0JUTjYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE43KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01JQ0IxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01JQ0IyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01JQ0IyX1JBTVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUlDQjMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUlDQjQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfVkJBREMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CSUFTX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JJQVNfVkJHX0ZJTkVfQURKKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NUUkxfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DVFJMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ0FMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX1RFU1RfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DQUxfT1VUXzEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ0FMX09VVF8yKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTF9PVVRfMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DQUxfT1VUXzQpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ0FMX09VVF81KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19NT0RFXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX01PREVfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTU9ERV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19NT0RFXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX1ZDTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19WQ0xfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fVkNMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF8xMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fRklMVEVSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0ZJTFRFUl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19EUklWRVJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fRFJJVkVSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0RSSVZFUl8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQUxfQ09ERV9FWFRfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfRVhUXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NBTF9DT0RFX09VVF8xKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQUxfQ09ERV9PVVRfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fVEVTVF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19URVNUXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX0NUTF9DTEspXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX0NUTF9BTkEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX0NUTF9TUEFSRV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19DVExfU1BBUkVfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfQ1RMX0JDUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfU1RBVFVTX1NQQVJFXzEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX1RFU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfU1VCQkxPQ0tfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9WQkFEQ19JQklBU19GRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX0JJQVNfQURDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfRkVfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX0FEQ19SRUYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9WQkFEQ19BRENfSU8pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9WQkFEQ19BRENfU0FSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfREVCVUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9MRE9IX01PREUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9MRE9IX0JJQVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9MRE9IX1NUQl9MT0FEUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0xET0hfU0xPV1JBTVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCM19URVNUX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9DT01fQURDX1ZDTSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9CSUFTX0FURVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfQ09NX0FEQ19JTlQxX0lCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfQ09NX0FEQ19JTlQyX0lCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVEFSVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVE9QXzlQNk0pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RPUF8xMlAyODhNKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8xXzJfVEVTVF9FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9BRENfSUIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8xXzJfQVRFU1RfUkVGQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1RFU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1RFU1RfQkxLX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1RYRkVfQ0xLRElWKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1NBUjFfRVJSKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1NBUjJfRVJSKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfM180X1RFU1RfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfQURDX0lCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfM180X0FURVNUX1JFRkNUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9URVNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9URVNUX0JMS19FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9UWEZFX0NMS0RJVildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9TQVIxX0VSUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9TQVIyX0VSUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9NT0RFXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfTU9ERV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX01PREVfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9DVFJMX1ZDTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0NUUkxfVkNMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQlVDS19TV19EUlZfQ05UTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9TUEFSRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX0NUUkxfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVEVTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9BVVhfU1dfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfUEFfQVVYX0lOX0NPTk4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9USU1FUl9ESVYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9PQ1BfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfT0NQX0NPVU5UKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19FQVJfREFDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19FQVJfQU1QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfTERPKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfUEEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfUkRBQ19MRE8pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0hQSF9DTlAxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19QQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX1JFRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX0xETyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfU0VMT19EQUNfUEEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0JVQ0tfUlNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19GTFlCX0VSUkFNUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9CVUZGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19GTFlCX01JRF9SU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUl9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfQ05QX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0NOUF9XR19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfQ05QX1dHX1RJTUUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfT0NQX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9BVVRPX0NIT1ApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfQ0hPUF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUEFfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9QQV9DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0xfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTF9URVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0xfQVRFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUl9FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SX1RFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUl9BVEVTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JEQUNfQ0xLX0NUTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUkRBQ19MRE9fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JFRkJVRkZfVUhRQV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTF9EQUNfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JfREFDX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VBUl9FTl9SRUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfQ01CVUZGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUFSX0lDVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfRU5fREJHX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VBUl9DTlApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfREFDX0NUTF9BVEVTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VBUl9TVEFUVVNfUkVHKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUFSX0VBUl9NSVNDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19NSVNDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19MTzJfQ09NUEFOREVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19MTzFfQ09NUEFOREVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19DT01NT04pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ESUZGX0xPX0JZUEFTU19FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fQ05QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19DT1JFX09VVF9QUk9HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19MRE9fT1VUX1BST0cpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19DT01fUEFfRlJFUSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fUkVTRVJWRURfUkVHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19MTzFfU1RBVFVTXzEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ESUZGX0xPX0xPMV9TVEFUVVNfMildID0gV0NEOTM0WF9SRUFELAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlN19yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTkVXX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfTERPX0NPTkZJRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX0xET19PQ1BfQ09ORklHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfVFhfTERPX0NPTkZJRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1RYX0RSVl9DT05GSUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9SWF9DT05GSUdfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1JYX0NPTkZJR18yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfUExMX0VOQUJMRVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9QTExfUFJFU0VUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfUExMX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfUExMX0VOQUJMRVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX1BMTF9QUkVTRVQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX1BMTF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19YT19QUkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX1hPX0NBUF9YVFApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX1hPX0NBUF9YVE0pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9CU1RfRU5fRExZKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfQ1RSTF9JTElNKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfVk9VVF9TRVRUSU5HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfVk9VVF9BX1NUQVJUVVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19WT1VUX0RfU1RBUlRVUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0VMRUNUX1JFTV9DTEFNUF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19aREVUX1JBTVBfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfRlNNX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0FEQ19SRVNVTFQpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9ORVdfQU1JQ180XzVfU0VMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfTkVXX0FEQ19NT0RFKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfTkVXX0FEQ19ET1VUTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfTkVXX0FEQ19ET1VUTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfVlJFRl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX09WRVJSSURFX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19NSVNDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVI0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0JJQVNfTE9ISUZJKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0JJQVNfVUxQKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0xET19MUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfTERPX1RFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18xKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18yKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1RYX0xET19URVNUKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1RYX0RSVl9URVNUKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX1RFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX1RFU1RfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9ERUJVR18xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9ERUJVR18yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9DTEtfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUkVTRVJWRURfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUkVTRVJWRURfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1JFRl9ESVZfUkVHMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUkVGX0RJVl9SRUcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9GSUxURVJfUkVHMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfRklMVEVSX1JFRzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0xfVkFMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTV9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9OX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1RFU1RfUkVHMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUEZEX0NQX0RTTV9QUk9HKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9WQ09fUFJPRyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9MRE9fTE9DS19DRkcpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0RJR19MT0NLX0RFVF9DRkcpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QT1NUX0RJVl9SRUcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfRklMVEVSX1JFRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9MX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9NX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9OX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1BGRF9DUF9EU01fUFJPRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1ZDT19QUk9HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfTERPX0xPQ0tfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfRElHX0xPQ0tfREVUX0NGRyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfWE9fVEVTVDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9YT19URVNUMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9WQ09NUF9IWVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX1ZMT09QX0ZJTFRFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX0lERUxUQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX0lMSU1fU1RBUlRVUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX01JTl9PTlRJTUUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9NQVhfT05USU1FKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfVElNSU5HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX1RNVVhfQV9EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX1NXX0RSVl9DTlRMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX1NQQVJFMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9TUEFSRTIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfU1BBUkVfMSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfQSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX1ZPVVRfU0VUVElOR19EKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9JTkNfV0FJVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfSUJMRUVEX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX0NQUk9WUl9URVNUKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9DVExfQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0NUTF9EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfVElNRU9VVF9QRVJJT0QpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ISUdIX0FDQ1VfTU9ERV9TRUwxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfSElHSF9BQ0NVX01PREVfU0VMMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfSFBGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfUkVGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfQ09NUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0lOVF9TUEFSRV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisKK307CisKK2NvbnN0IHU4IHdjZDkzNHhfcGFnZTEwX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxMF9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX01PREVfMV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9NT0RFXzJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRkZfU0hJRlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9GQl9TSElGVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9BX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9CX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GQl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9TTUxQRl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9EQ0ZMVF9TSElGVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0NPRUZGXzJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRkZfQV9HQUlOX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9GQl9HQUlOX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX1JDX0NPTU1PTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9GSUZPX0NPTU1PTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9SQzBfU1RBVFVTX0ZNSU5fQ05UUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX1JDMV9TVEFUVVNfRk1JTl9DTlRSKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfUkMwX1NUQVRVU19GTUFYX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNQVhfQ05UUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX1NUQVRVU19GSUZPKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRkZfU0hJRlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9GQl9TSElGVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GRl9BX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GRl9CX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GQl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9TTUxQRl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9EQ0ZMVF9TSElGVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9JSVJfQURBUFRfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRkZfQV9HQUlOX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0ZGX0JfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9GQl9HQUlOX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX1JDX0NPTU1PTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9GSUZPX0NPTU1PTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9SQzBfU1RBVFVTX0ZNSU5fQ05UUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX1JDMV9TVEFUVVNfRk1JTl9DTlRSKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUFYX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9SQzFfU1RBVFVTX0ZNQVhfQ05UUildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX1NUQVRVU19GSUZPKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF8xOTJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIXzE5Ml9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF8xOTJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIXzE5Ml9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlMTFfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7CisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTExX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw2KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDYpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw2KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDYpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9EU01ERU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9EU01ERU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9EU01ERU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0RTTURFTV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9EU01ERU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlMTJfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7CisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTEyX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9DUkMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9ETFlfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0RFQ0FZX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9IUEhfVl9QQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0VBUl9WX1BBKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfSEQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9FQVJfVl9IRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0sxX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0sxX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0syX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0syX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfSFBIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfSURMRV9FQVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9URVNUMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX1RFU1QxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfT1ZSX1ZSRUYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1JGX1BST0MxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQ0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9ERUJVRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTildID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fTU9OX1ZBTCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQkFOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMV9DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ0xLX1JTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX0ZJRk9fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUlOX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUlOX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GSUZPKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1BWF9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1BWF9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX0FDQ0VTU19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NGRzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX1JFRl9IUTBfRUNfUkVGX0hRX1BBVEhfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19SRUZfSFEwX0VDX1JFRl9IUV9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfUkVGX0hRMV9FQ19SRUZfSFFfUEFUSF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX1JFRl9IUTFfRUNfUkVGX0hRX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMwX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GSUZPKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfQ0xLX1JTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMV9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX0ZJRk9fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlMTNfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7CisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTEzX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkc0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NQTElORV9BU1JDX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0VDX1JFRl9IUV9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNV9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYOF9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTBfQ0ZHMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMl9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTNfQ0ZHMCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcwKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfQVNSQ19TSEFSRV9DT05UUk9MKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0dGTV9DT05UUk9MKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTFNCKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9NU0IpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQl9SRCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQl9SRCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNV9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjdfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9COF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I0X0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjVfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I3X0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjhfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMV9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX1RPUF9DRkc3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfTFVUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfTFVUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9XUl9NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfTFVUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX0xTQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9SRF9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfV1JfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9MVVQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfUkRfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX01TQildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QwX0NGRzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMF9DRkc1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMV9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMV9DRkczKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QxX0NGRzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorfTsKKworY29uc3QgdTggd2NkOTM0eF9wYWdlMTRfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7CisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTE0X1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NMS19SU1RfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUFVMU0VfU1VQUl9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVElNRVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0JXX1NXKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9USFJFU0gpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX1RJTUVSMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXNSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1BWF9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9STUlOX0RJQUcpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1BIX0RFVCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19DTFIpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9NQl9TV19TVEFURSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfTUFTVF9ESUFHX1NUQVRFKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF83XzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzE1XzgpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzIzXzE2KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8zMV8yNCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzlfMzIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzQwXzQzKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9DTEtfUlNUX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1BVTFNFX1NVUFJfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1RJTUVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9CV19TVyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfVEhSRVNIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19USU1FUjIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXNSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JNQVhfRElBRyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUk1JTl9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9QSF9ERVQpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ0xSKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfTUJfU1dfU1RBVEUpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX01BU1RfRElBR19TVEFURSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfN18wKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8xNV84KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8yM18xNildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMzFfMjQpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzM5XzMyKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF80MF80MyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfQ0xLX1JTVF9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9QVUxTRV9TVVBSX0NUTCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9USU1FUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfQldfU1cpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1RIUkVTSCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfVElNRVIyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXNCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzMpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXNSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9STUFYX0RJQUcpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JNSU5fRElBRyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUEhfREVUKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0NMUildID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX01CX1NXX1NUQVRFKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQVNUX0RJQUdfU1RBVEUpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzdfMCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMTVfOCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMjNfMTYpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzMxXzI0KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8zOV8zMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfNDBfNDMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NMS19SU1RfQ1RMKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUFVMU0VfU1VQUl9DVEwpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVElNRVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0JXX1NXKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9USFJFU0gpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX1RJTUVSMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlcyKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlc1KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMildID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlczKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzQpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXNSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlcxKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzIpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMyldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlc0KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzUpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1BWF9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9STUlOX0RJQUcpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1BIX0RFVCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19DTFIpXSA9IFdDRDkzNFhfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9NQl9TV19TVEFURSldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfTUFTVF9ESUFHX1NUQVRFKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF83XzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzE1XzgpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzIzXzE2KV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8zMV8yNCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzlfMzIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzQwXzQzKV0gPSBXQ0Q5MzRYX1JFQUQsCit9OworCitjb25zdCB1OCB3Y2Q5MzR4X3BhZ2UxNV9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMTVfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDMF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1BMSU5FX1NSQzFfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NQTElORV9TUkMyX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDM19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzIpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkczKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcyKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19TUExJTkVfU1JDX0RFQlVHX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19TUExJTkVfU1JDX0RFQlVHX0NGRzEpXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19SQ19SRV9BU1JDX0RFQlVHX0NGRzApXSA9CisJCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19BTkMwX1JDMF9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19BTkMwX1JDMV9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19BTkMxX1JDMF9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19BTkMxX1JDMV9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19BTkNfUkNfUlNUX0RCR19DTlRSKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKK307CisKK2NvbnN0IHU4IHdjZDkzNHhfcGFnZV8weDUwX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0geworCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0U4MF9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMCldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzEpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8yKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX0FDQ0VTU19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfTk9NX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlNfQ1hfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfQ1hfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX05PTV9NWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTX01YX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01YX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01JTl9DWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfTUFYX1NWUzJfU1RFUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1dfTU9ERUNITkdfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVJUKV0gPSBXQ0Q5MzRYX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9DUFJfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCit9OworCitjb25zdCB1OCB3Y2Q5MzR4X3BhZ2VfMHg4MF9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFODBfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8xKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMildID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQUNDRVNTX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX05PTV9DWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9OT01fTVhfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19NWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NSU5fQ1hfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX01BWF9TVlMyX1NURVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TV19NT0RFQ0hOR19TVEFSVCldID0gV0NEOTM0WF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQ1BSX1NUQVRVUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxMjhfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fQklTVF9NT0RFX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fUkZfUEFfT05fUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JTlRSMV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0lOVFIyX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fU1dSX0RBVEFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TV1JfQ0xLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzJfU0NLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fU0xJTUJVU19EQVRBMV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TTElNQlVTX0NMS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyQ19DTEtfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMkNfREFUQV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18wX1JYX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzBfVFhfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMF9TQ0tfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMF9XU19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18xX1JYX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzFfVFhfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMV9TQ0tfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMV9XU19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0RNSUMxX0NMS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0RNSUMxX0RBVEFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9ETUlDMl9DTEtfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9ETUlDMl9EQVRBX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fRE1JQzNfQ0xLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0pUQ0tfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9HUElPMV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0dQSU8yX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fR1BJTzNfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9HUElPNF9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NQSV9TX0NTTl9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NQSV9TX0NMS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NQSV9TX0RPVVRfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TUElfU19ESU5fUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9CQV9OX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fR1BJTzBfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMl9SWF9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18yX1dTX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0RSVkNUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfRFJWQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfTUVNX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0JVU19TRUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0pUQUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0FOQV9EVEVTVF9ESVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8wKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8xKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8yKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8zKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV80KV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1NZU01FTV9DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19TT0NfU1dfUFdSX1NFUV9ERUxBWSldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX05PTV9MT1cpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0hJR0gpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfU1ZTX1NWUzJfTE9XKV0gPQorCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKKwlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfU1ZTX1NWUzJfSElHSCldID0KKwkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCisJW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19TUElfU0xBVkVfQ0hBUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAorCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfQ09ERUNfRElBR1MpXSA9IFdDRDkzNFhfUkVBRCwKK307CisKK2NvbnN0IHU4ICogY29uc3Qgd2NkOTM0eF9yZWdbV0NEOTM0WF9OVU1fUEFHRVNdID0geworCVtXQ0Q5MzRYX1BBR0VfMF0gPSB3Y2Q5MzR4X3BhZ2UwX3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV8xXSA9IHdjZDkzNHhfcGFnZTFfcmVnX2FjY2VzcywKKwlbV0NEOTM0WF9QQUdFXzJdID0gd2NkOTM0eF9wYWdlMl9yZWdfYWNjZXNzLAorCVtXQ0Q5MzRYX1BBR0VfNF0gPSB3Y2Q5MzR4X3BhZ2U0X3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV81XSA9IHdjZDkzNHhfcGFnZTVfcmVnX2FjY2VzcywKKwlbV0NEOTM0WF9QQUdFXzZdID0gd2NkOTM0eF9wYWdlNl9yZWdfYWNjZXNzLAorCVtXQ0Q5MzRYX1BBR0VfN10gPSB3Y2Q5MzR4X3BhZ2U3X3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV8xMF0gPSB3Y2Q5MzR4X3BhZ2UxMF9yZWdfYWNjZXNzLAorCVtXQ0Q5MzRYX1BBR0VfMTFdID0gd2NkOTM0eF9wYWdlMTFfcmVnX2FjY2VzcywKKwlbV0NEOTM0WF9QQUdFXzEyXSA9IHdjZDkzNHhfcGFnZTEyX3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV8xM10gPSB3Y2Q5MzR4X3BhZ2UxM19yZWdfYWNjZXNzLAorCVtXQ0Q5MzRYX1BBR0VfMTRdID0gd2NkOTM0eF9wYWdlMTRfcmVnX2FjY2VzcywKKwlbV0NEOTM0WF9QQUdFXzE1XSA9IHdjZDkzNHhfcGFnZTE1X3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV8weDUwXSA9IHdjZDkzNHhfcGFnZV8weDUwX3JlZ19hY2Nlc3MsCisJW1dDRDkzNFhfUEFHRV8wWDgwXSA9IHdjZDkzNHhfcGFnZV8weDgwX3JlZ19hY2Nlc3MsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOXh4eC1jb3JlLmMgYi9kcml2ZXJzL21mZC93Y2Q5eHh4LWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDEyNmRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd2NkOXh4eC1jb3JlLmMKQEAgLTAsMCArMSwxNjkwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1zbGltc2xhdmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtdXRpbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAid2NkOXh4eC1yZWdtYXAuaCIKKworI2RlZmluZSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCAweDgwMAorI2RlZmluZSBXQ0Q5WFhYX1NMSU1fUldfTUFYX1RSSUVTIDMKKyNkZWZpbmUgU0xJTUJVU19QUkVTRU5UX1RJTUVPVVQgMTAwCisKKyNkZWZpbmUgTUFYX1dDRDlYWFhfREVWSUNFCTQKKyNkZWZpbmUgV0NEOVhYWF9JMkNfR1NCSV9TTEFWRV9JRCAiMy0wMDBkIgorI2RlZmluZSBXQ0Q5WFhYX0kyQ19UT1BfU0xBVkVfQUREUgkweDBkCisjZGVmaW5lIFdDRDlYWFhfQU5BTE9HX0kyQ19TTEFWRV9BRERSCTB4NzcKKyNkZWZpbmUgV0NEOVhYWF9ESUdJVEFMMV9JMkNfU0xBVkVfQUREUgkweDY2CisjZGVmaW5lIFdDRDlYWFhfRElHSVRBTDJfSTJDX1NMQVZFX0FERFIJMHg1NQorI2RlZmluZSBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUwJMAorI2RlZmluZSBXQ0Q5WFhYX0kyQ19BTkFMT0cJMQorI2RlZmluZSBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzEJMgorI2RlZmluZSBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzIJMworCisvKgorICogTnVtYmVyIG9mIHJldHVybiB2YWx1ZXMgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgZWFjaAorICogcmVnaXN0cmF0aW9uIG9mIFNsaW1idXMgb2YgSTJDIGJ1cyBmb3IgZWFjaCBjb2RlYworICovCisjZGVmaW5lIE5VTV9XQ0Q5WFhYX1JFR19SRVQJNAorCisjZGVmaW5lIFNMSU1fVVNSX01DX1JFUEVBVF9DSEFOR0VfVkFMVUUgMHgwCisjZGVmaW5lIFNMSU1fUkVQRUFUX1dSSVRFX01BWF9TTElDRSAxNgorI2RlZmluZSBSRUdfQllURVMgMgorI2RlZmluZSBWQUxfQllURVMgMQorI2RlZmluZSBXQ0Q5WFhYX1BBR0VfTlVNKHJlZykgICAgKCgocmVnKSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIFdDRDlYWFhfUEFHRV9TSVpFIDI1NgorCitzdHJ1Y3Qgd2NkOXh4eF9pMmMgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGkyY19tc2cgeGZlcl9tc2dbMl07CisJc3RydWN0IG11dGV4IHhmZXJfbG9jazsKKwlpbnQgbW9kX2lkOworfTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHdjZDl4eHhfYmFzZV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDgsCisJLmNhbl9tdWx0aV93cml0ZSA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOXh4eF9pMmNfYmFzZV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDgsCisJLmNhbl9tdWx0aV93cml0ZSA9IGZhbHNlLAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKK307CisKK3N0YXRpYyB1OCB3Y2Q5eHh4X3BnZF9sYTsKK3N0YXRpYyB1OCB3Y2Q5eHh4X2luZl9sYTsKKworc3RhdGljIGNvbnN0IGludCB3Y2Q5eHh4X2NkY190eXBlc1tdID0geworCVtXQ0Q5WFhYXSA9IFdDRDlYWFgsCisJW1dDRDkzMzBdID0gV0NEOTMzMCwKKwlbV0NEOTMzNV0gPSBXQ0Q5MzM1LAorCVtXQ0Q5MzRYXSA9IFdDRDkzNFgsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3Y2Q5eHh4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHRhc2hhLWkyYy1wZ2QiLAorCSAgLmRhdGEgPSAodm9pZCAqKSZ3Y2Q5eHh4X2NkY190eXBlc1tXQ0Q5MzM1XX0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaTJjIiwKKwkgIC5kYXRhID0gKHZvaWQgKikmd2NkOXh4eF9jZGNfdHlwZXNbV0NEOTMzMF19LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdjZDl4eHhfb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9kZXZpY2VfdXAoc3RydWN0IHNsaW1fZGV2aWNlICpzbGRldik7CitzdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9kZXZpY2VfZG93bihzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsZGV2KTsKKworc3RydWN0IHdjZDl4eHhfaTJjIHdjZDl4eHhfbW9kdWxlc1tNQVhfV0NEOVhYWF9ERVZJQ0VdOworCitzdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1OCB2YWxbV0NEOVhYWF9QQUdFX1NJWkVdOworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKwlpbnQgbiA9IDA7CisJdW5zaWduZWQgaW50IHBhZ2VfbnVtOworCXNpemVfdCBudW1fcmVncyA9IChjb3VudCAvIChSRUdfQllURVMgKyBWQUxfQllURVMpKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsICpidWxrX3JlZzsKKwl1OCAqYnVmOworCisJZGV2ID0gd2NkOXh4eC0+ZGV2OworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChudW1fcmVncyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1bGtfcmVnID0ga3phbGxvYyhudW1fcmVncyAqIChzaXplb2Yoc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCkpLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWxrX3JlZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYgPSAodTggKilkYXRhOworCXJlZyA9ICoodTE2ICopYnVmOworCXBhZ2VfbnVtID0gV0NEOVhYWF9QQUdFX05VTShyZWcpOworCWZvciAoaSA9IDAsIG4gPSAwOyBuIDwgbnVtX3JlZ3M7IGkrKywgbisrKSB7CisJCXJlZyA9ICoodTE2ICopYnVmOworCQlpZiAocGFnZV9udW0gIT0gV0NEOVhYWF9QQUdFX05VTShyZWcpKSB7CisJCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywKKwkJCQkJCSAgICAgIGksIGZhbHNlKTsKKwkJCXBhZ2VfbnVtID0gV0NEOVhYWF9QQUdFX05VTShyZWcpOworCQkJaSA9IDA7CisJCX0KKwkJYnVmICs9IFJFR19CWVRFUzsKKwkJdmFsW2ldID0gKmJ1ZjsKKwkJYnVmICs9IFZBTF9CWVRFUzsKKwkJYnVsa19yZWdbaV0ucmVnID0gcmVnOworCQlidWxrX3JlZ1tpXS5idWYgPSAmdmFsW2ldOworCQlidWxrX3JlZ1tpXS5ieXRlcyA9IDE7CisJfQorCXJldCA9IHdjZDl4eHhfc2xpbV9idWxrX3dyaXRlKHdjZDl4eHgsIGJ1bGtfcmVnLAorCQkJCSAgICAgIGksIGZhbHNlKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgIiVzOiBlcnJvciB3cml0aW5nIGJ1bGsgcmVnc1xuIiwKKwkJCV9fZnVuY19fKTsKKworCWtmcmVlKGJ1bGtfcmVnKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQ6IFJlYWQgc2xpbSBpbnRlcmZhY2UgcmVnaXN0ZXJzCisgKgorICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gd2NkOXh4eCBzdHJ1Y3R1cmUKKyAqIEByZWc6IHJlZ2lzdGVyIGFkZGVyc3MKKyAqCisgKiBSZXR1cm5zIHJlZ2lzdGVyIHZhbHVlIGluIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisJcmV0ID0gd2NkOXh4eC0+cmVhZF9kZXYod2NkOXh4eCwgcmVnLCAxLCAodm9pZCAqKSZ2YWwsCisJCQkJdHJ1ZSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IENvZGVjIHJlYWQgMHgleCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgcmVnKTsKKwllbHNlCisJCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IFJlYWQgMHglMDJ4IGZyb20gMHgleFxuIiwKKwkJCV9fZnVuY19fLCB2YWwsIHJlZyk7CisKKwltdXRleF91bmxvY2soJndjZDl4eHgtPmlvX2xvY2spOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCk7CisKKy8qCisgKiB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGU6IFdyaXRlIHNsaW0gaW50ZXJmYWNlIHJlZ2lzdGVycworICoKKyAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCisgKiBAcmVnOiByZWdpc3RlciBhZGRlcnNzCisgKiBAdmFsOiB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkgICAgIHU4IHZhbCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisJcmV0ID0gd2NkOXh4eC0+d3JpdGVfZGV2KHdjZDl4eHgsIHJlZywgMSwgKHZvaWQgKikmdmFsLCB0cnVlKTsKKwlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiBXcml0ZSAlMDJ4IHRvIDB4JXggcmV0KCVkKVxuIiwKKwkJX19mdW5jX18sIHZhbCwgcmVnLCByZXQpOworCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUpOworCitzdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9yZWFkX2RldmljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCWludCBieXRlcywgdm9pZCAqZGVzdCwgYm9vbCBpbnRlcmZhY2UpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2xpbV9lbGVfYWNjZXNzIG1zZzsKKwlpbnQgc2xpbV9yZWFkX3RyaWVzID0gV0NEOVhYWF9TTElNX1JXX01BWF9UUklFUzsKKworCW1zZy5zdGFydF9vZmZzZXQgPSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIHJlZzsKKwltc2cubnVtX2J5dGVzID0gYnl0ZXM7CisJbXNnLmNvbXAgPSBOVUxMOworCisJaWYgKCF3Y2Q5eHh4LT5kZXZfdXApIHsKKwkJZGV2X2RiZ19yYXRlbGltaXRlZCgKKwkJCXdjZDl4eHgtPmRldiwgIiVzOiBObyByZWFkIGFsbG93ZWQuIGRldl91cCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlICgxKSB7CisJCW11dGV4X2xvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7CisJCXJldCA9IHNsaW1fcmVxdWVzdF92YWxfZWxlbWVudChpbnRlcmZhY2UgPworCQkJICAgICAgIHdjZDl4eHgtPnNsaW1fc2xhdmUgOiB3Y2Q5eHh4LT5zbGltLAorCQkJICAgICAgICZtc2csIGRlc3QsIGJ5dGVzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT54ZmVyX2xvY2spOworCQlpZiAobGlrZWx5KHJldCA9PSAwKSB8fCAoLS1zbGltX3JlYWRfdHJpZXMgPT0gMCkpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOworCX0KKworCWlmIChyZXQpCisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IEVycm9yLCBDb2RlYyByZWFkIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSW50ZXJmYWNlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB3cml0ZSBpcyB0byB0aGUgaW50ZXJmYWNlIG9yIGdlbmVyYWwKKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fd3JpdGVfZGV2aWNlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQl1bnNpZ25lZCBzaG9ydCByZWcsIGludCBieXRlcywgdm9pZCAqc3JjLCBib29sIGludGVyZmFjZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbGltX2VsZV9hY2Nlc3MgbXNnOworCWludCBzbGltX3dyaXRlX3RyaWVzID0gV0NEOVhYWF9TTElNX1JXX01BWF9UUklFUzsKKworCW1zZy5zdGFydF9vZmZzZXQgPSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIHJlZzsKKwltc2cubnVtX2J5dGVzID0gYnl0ZXM7CisJbXNnLmNvbXAgPSBOVUxMOworCisJaWYgKCF3Y2Q5eHh4LT5kZXZfdXApIHsKKwkJZGV2X2RiZ19yYXRlbGltaXRlZCgKKwkJCXdjZDl4eHgtPmRldiwgIiVzOiBObyB3cml0ZSBhbGxvd2VkLiBkZXZfdXAgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3Y2Q5eHh4LT5kZXZfdXApOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT54ZmVyX2xvY2spOworCQlyZXQgPSBzbGltX2NoYW5nZV92YWxfZWxlbWVudChpbnRlcmZhY2UgPworCQkJICAgICAgd2NkOXh4eC0+c2xpbV9zbGF2ZSA6IHdjZDl4eHgtPnNsaW0sCisJCQkgICAgICAmbXNnLCBzcmMsIGJ5dGVzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT54ZmVyX2xvY2spOworCQlpZiAobGlrZWx5KHJldCA9PSAwKSB8fCAoLS1zbGltX3dyaXRlX3RyaWVzID09IDApKQorCQkJYnJlYWs7CisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwl9CisKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBFcnJvciwgQ29kZWMgd3JpdGUgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fZ2V0X2FsbG93ZWRfc2xpY2Uoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJCSAgaW50IGJ5dGVzKQoreworCWludCBhbGxvd2VkX3N6ID0gYnl0ZXM7CisKKwlpZiAobGlrZWx5KGJ5dGVzID09IFNMSU1fUkVQRUFUX1dSSVRFX01BWF9TTElDRSkpCisJCWFsbG93ZWRfc3ogPSAxNjsKKwllbHNlIGlmIChieXRlcyA+PSAxMikKKwkJYWxsb3dlZF9zeiA9IDEyOworCWVsc2UgaWYgKGJ5dGVzID49IDgpCisJCWFsbG93ZWRfc3ogPSA4OworCWVsc2UgaWYgKGJ5dGVzID49IDYpCisJCWFsbG93ZWRfc3ogPSA2OworCWVsc2UgaWYgKGJ5dGVzID49IDQpCisJCWFsbG93ZWRfc3ogPSA0OworCWVsc2UKKwkJYWxsb3dlZF9zeiA9IGJ5dGVzOworCisJcmV0dXJuIGFsbG93ZWRfc3o7Cit9CisKKy8qCisgKiB3Y2Q5eHh4X3NsaW1fd3JpdGVfcmVwZWF0OiBXcml0ZSB0aGUgc2FtZSByZWdpc3RlciB3aXRoIG11bHRpcGxlIHZhbHVlcworICogQHdjZDl4eHg6IGhhbmRsZSB0byB3Y2QgY29yZQorICogQHJlZzogcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQGJ5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byByZWcKKyAqIEBzcmM6IGJ1ZmZlciB3aXRoIGRhdGEgY29udGVudCB0byBiZSB3cml0dGVuIHRvIHJlZworICogVGhpcyBBUEkgd2lsbCB3cml0ZSByZWcgd2l0aCBieXRlcyBmcm9tIHNyYyBpbiBhIHNpbmdsZSBzbGltYnVzCisgKiB0cmFuc2FjdGlvbi4gQWxsIHZhbHVlcyBmcm9tIDEgdG8gMTYgYXJlIHN1cHBvcnRlZCBieSB0aGlzIEFQSS4KKyAqLworaW50IHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCSAgICAgIGludCBieXRlcywgdm9pZCAqc3JjKQoreworCWludCByZXQgPSAwLCBieXRlc190b193cml0ZSA9IGJ5dGVzLCBieXRlc19hbGxvd2VkOworCXN0cnVjdCBzbGltX2VsZV9hY2Nlc3Mgc2xpbV9tc2c7CisKKwltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKKwlpZiAod2NkOXh4eC0+dHlwZSA9PSBXQ0Q5MzM1IHx8IHdjZDl4eHgtPnR5cGUgPT0gV0NEOTM0WCkgeworCQlyZXQgPSB3Y2Q5eHh4X3BhZ2Vfd3JpdGUod2NkOXh4eCwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGRvbmU7CisJfQorCisJc2xpbV9tc2cuc3RhcnRfb2Zmc2V0ID0gV0NEOVhYWF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyByZWc7CisJc2xpbV9tc2cuY29tcCA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkoYnl0ZXMgPiBTTElNX1JFUEVBVF9XUklURV9NQVhfU0xJQ0UpKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHNpemUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBieXRlcyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIXdjZDl4eHgtPmRldl91cCkgeworCQlkZXZfZGJnX3JhdGVsaW1pdGVkKAorCQkJd2NkOXh4eC0+ZGV2LCAiJXM6IE5vIHdyaXRlIGFsbG93ZWQuIGRldl91cCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoYnl0ZXNfdG9fd3JpdGUgPiAwKSB7CisJCWJ5dGVzX2FsbG93ZWQgPSB3Y2Q5eHh4X3NsaW1fZ2V0X2FsbG93ZWRfc2xpY2Uod2NkOXh4eCwKKwkJCQkgICAgICAgYnl0ZXNfdG9fd3JpdGUpOworCisJCXNsaW1fbXNnLm51bV9ieXRlcyA9IGJ5dGVzX2FsbG93ZWQ7CisJCW11dGV4X2xvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7CisJCXJldCA9IHNsaW1fdXNlcl9tc2cod2NkOXh4eC0+c2xpbSwgd2NkOXh4eC0+c2xpbS0+bGFkZHIsCisJCQkJICAgIFNMSU1fTVNHX01UX0RFU1RfUkVGRVJSRURfVVNFUiwKKwkJCQkgICAgU0xJTV9VU1JfTUNfUkVQRUFUX0NIQU5HRV9WQUxVRSwKKwkJCQkgICAgJnNsaW1fbXNnLCBzcmMsIGJ5dGVzX2FsbG93ZWQpOworCQltdXRleF91bmxvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7CisKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogZmFpbGVkLCByZXQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnl0ZXNfdG9fd3JpdGUgPSBieXRlc190b193cml0ZSAtIGJ5dGVzX2FsbG93ZWQ7CisJCXNyYyA9ICgodTggKilzcmMpICsgYnl0ZXNfYWxsb3dlZDsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQpOworCisvKgorICogd2NkOXh4eF9zbGltX3Jlc2VydmVfYnc6IEFQSSB0byByZXNlcnZlIHRoZSBzbGltYnVzIGJhbmR3aWR0aAorICogQHdjZDl4eHg6IEhhbmRsZSB0byB0aGUgd2NkOXh4eCBjb3JlCisgKiBAYndfb3BzOiB2YWx1ZSBvZiB0aGUgYmFuZHdpZHRoIHRoYXQgaXMgcmVxdWVzdGVkCisgKiBAY29tbWl0OiBGbGFnIHRvIGluZGljYXRlIGlmIGJhbmR3aWR0aCBjaGFuZ2UgaXMgdG8gYmUgY29tbWl0dGVkCisgKgkgICAgcmlnaHQgYXdheQorICovCitpbnQgd2NkOXh4eF9zbGltX3Jlc2VydmVfYncoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCXUzMiBid19vcHMsIGJvb2wgY29tbWl0KQoreworCWlmICghd2NkOXh4eCB8fCAhd2NkOXh4eC0+c2xpbSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byAlc1xuIiwKKwkJCV9fZnVuY19fLAorCQkJKCF3Y2Q5eHh4KSA/ICJ3Y2Q5eHh4IiA6ICJzbGltX2RldmljZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gc2xpbV9yZXNlcnZlbXNnX2J3KHdjZDl4eHgtPnNsaW0sIGJ3X29wcywgY29tbWl0KTsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9zbGltX3Jlc2VydmVfYncpOworCisvKgorICogd2NkOXh4eF9zbGltX2J1bGtfd3JpdGU6IEFQSSB0byB3cml0ZSBtdWx0aXBsZSByZWdpc3RlcnMgd2l0aCBvbmUgZGVzY3JpcHRvcgorICogQHdjZDl4eHg6IEhhbmRsZSB0byB0aGUgd2NkOXh4eCBjb3JlCisgKiBAd2NkOXh4eF9yZWdfdmFsOiBzdHJ1Y3R1cmUgaG9sZGluZyByZWdpc3RlciBhbmQgdmFsdWVzIHRvIGJlIHdyaXR0ZW4KKyAqIEBzaXplOiBJbmRpY2F0ZXMgbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvbmUgZGVzY3JpcHRvcgorICogQGlzX2ludGVyZmFjZTogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlZ2lzdGVyIGlzIGZvciBzbGltIGludGVyZmFjZSBvciBmb3IKKyAqCSAgICAgICBnZW5lcmFsIHJlZ2lzdGVycy4KKyAqIEByZXR1cm46IHJldHVybnMgMCBpZiBzdWNjZXNzIG9yIGVycm9yIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIgaW4gY2FzZQorICoJICAgIG9mIGZhaWx1cmUuCisgKi8KK2ludCB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICBzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsICpidWxrX3JlZywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBpc19pbnRlcmZhY2UpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgc2xpbV92YWxfaW5mICptc2dzOworCXVuc2lnbmVkIHNob3J0IHJlZzsKKworCWlmICghYnVsa19yZWcgfHwgIXNpemUgfHwgIXdjZDl4eHgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghd2NkOXh4eC0+ZGV2X3VwKSB7CisJCWRldl9kYmdfcmF0ZWxpbWl0ZWQoCisJCQl3Y2Q5eHh4LT5kZXYsICIlczogTm8gd3JpdGUgYWxsb3dlZC4gZGV2X3VwID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgd2NkOXh4eC0+ZGV2X3VwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXNncyA9IGt6YWxsb2Moc2l6ZSAqIChzaXplb2Yoc3RydWN0IHNsaW1fdmFsX2luZikpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZ3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBtZW1fZmFpbDsKKwl9CisKKwltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKKwlyZWcgPSBidWxrX3JlZy0+cmVnOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbXNnc1tpXS5zdGFydF9vZmZzZXQgPSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCQkJCShidWxrX3JlZy0+cmVnICYgMHhGRik7CisJCW1zZ3NbaV0ubnVtX2J5dGVzID0gYnVsa19yZWctPmJ5dGVzOworCQltc2dzW2ldLndidWYgPSBidWxrX3JlZy0+YnVmOworCQlidWxrX3JlZysrOworCX0KKwlyZXQgPSB3Y2Q5eHh4X3BhZ2Vfd3JpdGUod2NkOXh4eCwgJnJlZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBQYWdlIHdyaXRlIGVycm9yIGZvciByZWc6IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcmVnKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gc2xpbV9idWxrX21zZ193cml0ZShpc19pbnRlcmZhY2UgPworCQkJCSAgd2NkOXh4eC0+c2xpbV9zbGF2ZSA6IHdjZDl4eHgtPnNsaW0sCisJCQkJICBTTElNX01TR19NVF9DT1JFLAorCQkJCSAgU0xJTV9NU0dfTUNfQ0hBTkdFX1ZBTFVFLCBtc2dzLCBzaXplLAorCQkJCSAgTlVMTCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRXJyb3IsIENvZGVjIGJ1bGsgd3JpdGUgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkvKiAxMDAgdXNlYyBzbGVlcCBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKK2VycjoKKwltdXRleF91bmxvY2soJndjZDl4eHgtPmlvX2xvY2spOworCWtmcmVlKG1zZ3MpOworbWVtX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9zbGltX2J1bGtfd3JpdGUpOworCitzdGF0aWMgaW50IHdjZDl4eHhfbnVtX2lycV9yZWdzKGNvbnN0IHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCXJldHVybiAod2NkOXh4eC0+Y29kZWNfdHlwZS0+bnVtX2lycXMgLyA4KSArCisJCSgod2NkOXh4eC0+Y29kZWNfdHlwZS0+bnVtX2lycXMgJSA4KSA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3JlZ21hcF9pbml0X2NhY2hlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCXN0cnVjdCByZWdtYXBfY29uZmlnICpyZWdtYXBfY29uZmlnOworCWludCByYzsKKworCXJlZ21hcF9jb25maWcgPSB3Y2Q5eHh4X2dldF9yZWdtYXBfY29uZmlnKHdjZDl4eHgtPnR5cGUpOworCWlmICghcmVnbWFwX2NvbmZpZykgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgInJlZ21hcCBjb25maWcgaXMgbm90IGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IHJlZ21hcF9yZWluaXRfY2FjaGUod2NkOXh4eC0+cmVnbWFwLCByZWdtYXBfY29uZmlnKTsKKwlpZiAocmMgIT0gMCkgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOkZhaWxlZCB0byByZWluaXQgcmVnaXN0ZXIgY2FjaGU6ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9kZXZpY2VfaW5pdChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9ICZ3Y2Q5eHh4LT5jb3JlX3JlczsKKwlyZWdtYXBfcGF0Y2hfZnB0ciByZWdtYXBfYXBwbHlfcGF0Y2ggPSBOVUxMOworCisJbXV0ZXhfaW5pdCgmd2NkOXh4eC0+aW9fbG9jayk7CisJbXV0ZXhfaW5pdCgmd2NkOXh4eC0+eGZlcl9sb2NrKTsKKworCXJldCA9IHdjZDl4eHhfYnJpbmd1cCh3Y2Q5eHh4LT5kZXYpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnJfYnJpbmdfdXA7CisJfQorCisJd2NkOXh4eC0+Y29kZWNfdHlwZSA9IGRldm1fa3phbGxvYyh3Y2Q5eHh4LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSksIEdGUF9LRVJORUwpOworCWlmICghd2NkOXh4eC0+Y29kZWNfdHlwZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9icmluZ191cDsKKwl9CisJcmV0ID0gd2NkOXh4eF9nZXRfY29kZWNfaW5mbyh3Y2Q5eHh4LT5kZXYpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBmYWlsX2NkY19maWxsOworCX0KKwl3Y2Q5eHh4LT52ZXJzaW9uID0gd2NkOXh4eC0+Y29kZWNfdHlwZS0+dmVyc2lvbjsKKwlpZiAoIXdjZDl4eHgtPmNvZGVjX3R5cGUtPmRldiB8fCAhd2NkOXh4eC0+Y29kZWNfdHlwZS0+c2l6ZSkKKwkJZ290byBmYWlsX2NkY19maWxsOworCisJY29yZV9yZXMtPnBhcmVudCA9IHdjZDl4eHg7CisJY29yZV9yZXMtPmRldiA9IHdjZDl4eHgtPmRldjsKKwljb3JlX3Jlcy0+aW50cl90YWJsZSA9IHdjZDl4eHgtPmNvZGVjX3R5cGUtPmludHJfdGJsOworCWNvcmVfcmVzLT5pbnRyX3RhYmxlX3NpemUgPSB3Y2Q5eHh4LT5jb2RlY190eXBlLT5pbnRyX3RibF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IFdDRDlYWFhfSU5UUl9SRUdfTUFYOyBpKyspCisJCXdjZDl4eHgtPmNvcmVfcmVzLmludHJfcmVnW2ldID0KKwkJCXdjZDl4eHgtPmNvZGVjX3R5cGUtPmludHJfcmVnW2ldOworCisJd2NkOXh4eF9jb3JlX3Jlc19pbml0KCZ3Y2Q5eHh4LT5jb3JlX3JlcywKKwkJCSAgICAgIHdjZDl4eHgtPmNvZGVjX3R5cGUtPm51bV9pcnFzLAorCQkJICAgICAgd2NkOXh4eF9udW1faXJxX3JlZ3Mod2NkOXh4eCksCisJCQkgICAgICB3Y2Q5eHh4LT5yZWdtYXApOworCisJaWYgKHdjZDl4eHhfY29yZV9pcnFfaW5pdCgmd2NkOXh4eC0+Y29yZV9yZXMpKQorCQlnb3RvIGVycjsKKworCXJldCA9IHdjZDl4eHhfcmVnbWFwX2luaXRfY2FjaGUod2NkOXh4eCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOworCisJcmVnbWFwX2FwcGx5X3BhdGNoID0gd2NkOXh4eF9nZXRfcmVnbWFwX3JlZ19wYXRjaCgKKwkJCXdjZDl4eHgtPnR5cGUpOworCWlmIChyZWdtYXBfYXBwbHlfcGF0Y2gpIHsKKwkJcmV0ID0gcmVnbWFwX2FwcGx5X3BhdGNoKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQl3Y2Q5eHh4LT52ZXJzaW9uKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHBhdGNoOiAlZFxuIiwgcmV0KTsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMod2NkOXh4eC0+ZGV2LCAtMSwgd2NkOXh4eC0+Y29kZWNfdHlwZS0+ZGV2LAorCQkJICAgICAgd2NkOXh4eC0+Y29kZWNfdHlwZS0+c2l6ZSwgTlVMTCwgMCwgTlVMTCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBjaGlsZHJlbjogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlyZXQgPSBkZXZpY2VfaW5pdF93YWtldXAod2NkOXh4eC0+ZGV2LCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiRGV2aWNlIHdha2V1cCBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlyZXR1cm4gcmV0OworZXJyX2lycToKKwl3Y2Q5eHh4X2lycV9leGl0KCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7CitmYWlsX2NkY19maWxsOgorCWRldm1fa2ZyZWUod2NkOXh4eC0+ZGV2LCB3Y2Q5eHh4LT5jb2RlY190eXBlKTsKKwl3Y2Q5eHh4LT5jb2RlY190eXBlID0gTlVMTDsKK2VycjoKKwl3Y2Q5eHh4X2JyaW5nZG93bih3Y2Q5eHh4LT5kZXYpOworCXdjZDl4eHhfY29yZV9yZXNfZGVpbml0KCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7CitlcnJfYnJpbmdfdXA6CisJbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+aW9fbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+eGZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2RldmljZV9leGl0KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWRldmljZV9pbml0X3dha2V1cCh3Y2Q5eHh4LT5kZXYsIGZhbHNlKTsKKwl3Y2Q5eHh4X2lycV9leGl0KCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7CisJd2NkOXh4eF9icmluZ2Rvd24od2NkOXh4eC0+ZGV2KTsKKwl3Y2Q5eHh4X3Jlc2V0X2xvdyh3Y2Q5eHh4LT5kZXYpOworCXdjZDl4eHhfY29yZV9yZXNfZGVpbml0KCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7CisJbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+aW9fbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+eGZlcl9sb2NrKTsKKwlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQlzbGltX3JlbW92ZV9kZXZpY2Uod2NkOXh4eC0+c2xpbV9zbGF2ZSk7Cit9CisKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RydWN0IHdjZDl4eHggKmRlYnVnQ29kZWM7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3djZDl4eHhfZGVudDsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BlZWs7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19wb2tlOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG93ZXJfc3RhdGU7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19yZWdfZHVtcDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9kYXRhOworCitzdGF0aWMgaW50IGNvZGVjX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcGFyYW1ldGVycyhjaGFyICpidWYsIGxvbmcgaW50ICpwYXJhbTEsIGludCBudW1fb2ZfcGFyKQoreworCWNoYXIgKnRva2VuOworCWludCBiYXNlLCBjbnQ7CisKKwl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBudW1fb2ZfcGFyOyBjbnQrKykgeworCQlpZiAodG9rZW4gIT0gTlVMTCkgeworCQkJaWYgKCh0b2tlblsxXSA9PSAneCcpIHx8ICh0b2tlblsxXSA9PSAnWCcpKQorCQkJCWJhc2UgPSAxNjsKKwkJCWVsc2UKKwkJCQliYXNlID0gMTA7CisKKwkJCWlmIChrc3RydG91bCh0b2tlbiwgYmFzZSwgJnBhcmFtMVtjbnRdKSAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2NkOXh4eF9zbGltc2xhdmVfcmVnX3Nob3coY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjb3VudCwKKwkJCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGksIHJlZ192YWwsIGxlbjsKKwlzc2l6ZV90IHRvdGFsID0gMDsKKwljaGFyIHRtcF9idWZbMjVdOyAvKiBlYWNoIGxpbmUgaXMgMTIgYnl0ZXMgYnV0IDI1IGZvciBtYXJnaW4gb2YgZXJyb3IgKi8KKworCWZvciAoaSA9IChpbnQpICpwcG9zIC8gMTI7IGkgPD0gU0xJTV9NQVhfUkVHX0FERFI7IGkrKykgeworCQlyZWdfdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoZGVidWdDb2RlYywgaSk7CisJCWxlbiA9IHNucHJpbnRmKHRtcF9idWYsIHNpemVvZih0bXBfYnVmKSwKKwkJCSIweCUuM3g6IDB4JS4yeFxuIiwgaSwgcmVnX3ZhbCk7CisKKwkJaWYgKCh0b3RhbCArIGxlbikgPj0gY291bnQgLSAxKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHVidWYgKyB0b3RhbCksIHRtcF9idWYsIGxlbikpIHsKKwkJCXByX2VycigiJXM6IGZhaWwgdG8gY29weSByZWcgZHVtcFxuIiwgX19mdW5jX18pOworCQkJdG90YWwgPSAtRUZBVUxUOworCQkJZ290byBjb3B5X2VycjsKKwkJfQorCQkqcHBvcyArPSBsZW47CisJCXRvdGFsICs9IGxlbjsKKwl9CisKK2NvcHlfZXJyOgorCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIHNzaXplX3QgY29kZWNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBsYnVmWzhdOworCWNoYXIgKmFjY2Vzc19zdHIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXRfY250OworCisJaWYgKCpwcG9zIDwgMCB8fCAhY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInNsaW1zbGF2ZV9wZWVrIikpIHsKKwkJc25wcmludGYobGJ1Ziwgc2l6ZW9mKGxidWYpLCAiMHgleFxuIiwgcmVhZF9kYXRhKTsKKwkJcmV0X2NudCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9zLCBsYnVmLAorCQkJCQkgICAgICAgc3RybmxlbihsYnVmLCA3KSk7CisJfSBlbHNlIGlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzbGltc2xhdmVfcmVnX2R1bXAiKSkgeworCQlyZXRfY250ID0gd2NkOXh4eF9zbGltc2xhdmVfcmVnX3Nob3codWJ1ZiwgY291bnQsIHBwb3MpOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6ICVzIG5vdCBwZXJtaXR0ZWQgdG8gcmVhZFxuIiwgX19mdW5jX18sIGFjY2Vzc19zdHIpOworCQlyZXRfY250ID0gLUVQRVJNOworCX0KKworCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3NldF9yZXNldF9waW5fc3RhdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSwKKwkJCQkJYm9vbCBhY3RpdmUpCit7CisJaWYgKHdjZDl4eHgtPndjZF9yc3RfbnApIHsKKwkJaWYgKGFjdGl2ZSkKKwkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKAorCQkJCQkJd2NkOXh4eC0+d2NkX3JzdF9ucCk7CisJCWVsc2UKKwkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCisJCQkJCQl3Y2Q5eHh4LT53Y2RfcnN0X25wKTsKKworCQlyZXR1cm47CisJfSBlbHNlIGlmIChncGlvX2lzX3ZhbGlkKHdjZDl4eHgtPnJlc2V0X2dwaW8pKSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dCh3Y2Q5eHh4LT5yZXNldF9ncGlvLAorCQkJCSAgICAgIChhY3RpdmUgPT0gdHJ1ZSA/IDEgOiAwKSk7CisJfQorfQorCitzdGF0aWMgaW50IGNvZGVjX2RlYnVnX3Byb2Nlc3NfY2RjX3Bvd2VyKGNoYXIgKmxidWYpCit7CisJbG9uZyBpbnQgcGFyYW07CisJaW50IHJjOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKKworCWlmICh3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJcHJfZXJyKCIlczogQ09ERUMgaXMgbm90IGluIFNMSU1CVVMgbW9kZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBlcnJvcl9pbnRmOworCX0KKworCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgJnBhcmFtLCAxKTsKKworCWlmIChsaWtlbHkoIXJjKSkgeworCQlwZGF0YSA9IGRlYnVnQ29kZWMtPnNsaW0tPmRldi5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGFyYW0gPT0gMCkgeworCQkJd2NkOXh4eF9zbGltX2RldmljZV9kb3duKGRlYnVnQ29kZWMtPnNsaW0pOworCQkJbXNtX2NkY19kaXNhYmxlX3N0YXRpY19zdXBwbGllcyhkZWJ1Z0NvZGVjLT5kZXYsCisJCQkJCQkJZGVidWdDb2RlYy0+c3VwcGxpZXMsCisJCQkJCQkJcGRhdGEtPnJlZ3VsYXRvciwKKwkJCQkJCQlwZGF0YS0+bnVtX3N1cHBsaWVzKTsKKwkJCXdjZDl4eHhfc2V0X3Jlc2V0X3Bpbl9zdGF0ZShkZWJ1Z0NvZGVjLCBwZGF0YSwgZmFsc2UpOworCQl9IGVsc2UgaWYgKHBhcmFtID09IDEpIHsKKwkJCW1zbV9jZGNfZW5hYmxlX3N0YXRpY19zdXBwbGllcyhkZWJ1Z0NvZGVjLT5kZXYsCisJCQkJCQkgICAgICAgZGVidWdDb2RlYy0+c3VwcGxpZXMsCisJCQkJCQkgICAgICAgcGRhdGEtPnJlZ3VsYXRvciwKKwkJCQkJCSAgICAgICBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJCXdjZDl4eHhfc2V0X3Jlc2V0X3Bpbl9zdGF0ZShkZWJ1Z0NvZGVjLCBwZGF0YSwgZmFsc2UpOworCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQkJd2NkOXh4eF9zZXRfcmVzZXRfcGluX3N0YXRlKGRlYnVnQ29kZWMsIHBkYXRhLCB0cnVlKTsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJCXdjZDl4eHhfc2xpbV9kZXZpY2VfdXAoZGVidWdDb2RlYy0+c2xpbSk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNvbW1hbmQgJWxkXG4iLCBfX2Z1bmNfXywgcGFyYW0pOworCQl9CisJfQorCitlcnJvcl9pbnRmOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgY29kZWNfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCisJY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICphY2Nlc3Nfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIgbGJ1ZlszMl07CisJaW50IHJjOworCWxvbmcgaW50IHBhcmFtWzVdOworCisJaWYgKGNudCA+IHNpemVvZihsYnVmKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBjb3B5X2Zyb21fdXNlcihsYnVmLCB1YnVmLCBjbnQpOworCWlmIChyYykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsYnVmW2NudF0gPSAnXDAnOworCisJaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInNsaW1zbGF2ZV9wb2tlIikpIHsKKwkJLyogd3JpdGUgKi8KKwkJcmMgPSBnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMik7CisJCWlmICgocGFyYW1bMF0gPD0gMHgzRkYpICYmIChwYXJhbVsxXSA8PSAweEZGKSAmJgorCQkJKHJjID09IDApKQorCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKGRlYnVnQ29kZWMsIHBhcmFtWzBdLAorCQkJCXBhcmFtWzFdKTsKKwkJZWxzZQorCQkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic2xpbXNsYXZlX3BlZWsiKSkgeworCQkvKiByZWFkICovCisJCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDEpOworCQlpZiAoKHBhcmFtWzBdIDw9IDB4M0ZGKSAmJiAocmMgPT0gMCkpCisJCQlyZWFkX2RhdGEgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZChkZWJ1Z0NvZGVjLAorCQkJCXBhcmFtWzBdKTsKKwkJZWxzZQorCQkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAicG93ZXJfc3RhdGUiKSkgeworCQlyYyA9IGNvZGVjX2RlYnVnX3Byb2Nlc3NfY2RjX3Bvd2VyKGxidWYpOworCX0KKworCWlmIChyYyA9PSAwKQorCQlyYyA9IGNudDsKKwllbHNlCisJCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGVjX2RlYnVnX29wcyA9IHsKKwkub3BlbiA9IGNvZGVjX2RlYnVnX29wZW4sCisJLndyaXRlID0gY29kZWNfZGVidWdfd3JpdGUsCisJLnJlYWQgPSBjb2RlY19kZWJ1Z19yZWFkCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgd2NkOXh4eF9pMmMgKndjZDl4eHhfaTJjX2dldF9kZXZpY2VfaW5mbyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCQkJCXUxNiByZWcpCit7CisJdTE2IG1hc2sgPSAweDBmMDA7CisJaW50IHZhbHVlID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9pMmMgKndjZDl4eHhfaTJjID0gTlVMTDsKKworCWlmICh3Y2Q5eHh4LT50eXBlID09IFdDRDkzMzUpIHsKKwkJd2NkOXh4eF9pMmMgPSAmd2NkOXh4eF9tb2R1bGVzWzBdOworCX0gZWxzZSB7CisJCXZhbHVlID0gKChyZWcgJiBtYXNrKSA+PiA4KSAmIDB4MDAwZjsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQljYXNlIDA6CisJCQl3Y2Q5eHh4X2kyYyA9ICZ3Y2Q5eHh4X21vZHVsZXNbMF07CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJd2NkOXh4eF9pMmMgPSAmd2NkOXh4eF9tb2R1bGVzWzFdOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXdjZDl4eHhfaTJjID0gJndjZDl4eHhfbW9kdWxlc1syXTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl3Y2Q5eHh4X2kyYyA9ICZ3Y2Q5eHh4X21vZHVsZXNbM107CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHdjZDl4eHhfaTJjOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaTJjX3dyaXRlX2RldmljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdTE2IHJlZywgdTggKnZhbHVlLAorCQkJCXUzMiBieXRlcykKK3sKKworCXN0cnVjdCBpMmNfbXNnICptc2c7CisJaW50IHJldCA9IDA7CisJdTggcmVnX2FkZHIgPSAwOworCXU4IGRhdGFbYnl0ZXMgKyAxXTsKKwlzdHJ1Y3Qgd2NkOXh4eF9pMmMgKndjZDl4eHhfaTJjOworCisJd2NkOXh4eF9pMmMgPSB3Y2Q5eHh4X2kyY19nZXRfZGV2aWNlX2luZm8od2NkOXh4eCwgcmVnKTsKKwlpZiAod2NkOXh4eF9pMmMgPT0gTlVMTCB8fCB3Y2Q5eHh4X2kyYy0+Y2xpZW50ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IGRldmljZSBpbmZvXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJlZ19hZGRyID0gKHU4KXJlZzsKKwltc2cgPSAmd2NkOXh4eF9pMmMtPnhmZXJfbXNnWzBdOworCW1zZy0+YWRkciA9IHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkZHI7CisJbXNnLT5sZW4gPSBieXRlcyArIDE7CisJbXNnLT5mbGFncyA9IDA7CisJZGF0YVswXSA9IHJlZzsKKwlkYXRhWzFdID0gKnZhbHVlOworCW1zZy0+YnVmID0gZGF0YTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIod2NkOXh4eF9pMmMtPmNsaWVudC0+YWRhcHRlciwKKwkJCSAgIHdjZDl4eHhfaTJjLT54ZmVyX21zZywgMSk7CisJLyogVHJ5IGFnYWluIGlmIHRoZSB3cml0ZSBmYWlscyAqLworCWlmIChyZXQgIT0gMSkgeworCQlyZXQgPSBpMmNfdHJhbnNmZXIod2NkOXh4eF9pMmMtPmNsaWVudC0+YWRhcHRlciwKKwkJCQkJCXdjZDl4eHhfaTJjLT54ZmVyX21zZywgMSk7CisJCWlmIChyZXQgIT0gMSkgeworCQkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgdGhlIGRldmljZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXByX2RlYnVnKCJ3cml0ZSBzdWNjZXNzIHJlZ2lzdGVyID0gJXggdmFsID0gJXhcbiIsIHJlZywgZGF0YVsxXSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3Y2Q5eHh4X2kyY19yZWFkX2RldmljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCSAgaW50IGJ5dGVzLCB1bnNpZ25lZCBjaGFyICpkZXN0KQoreworCXN0cnVjdCBpMmNfbXNnICptc2c7CisJaW50IHJldCA9IDA7CisJdTggcmVnX2FkZHIgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2kyYyAqd2NkOXh4eF9pMmM7CisJdTggaSA9IDA7CisKKwl3Y2Q5eHh4X2kyYyA9IHdjZDl4eHhfaTJjX2dldF9kZXZpY2VfaW5mbyh3Y2Q5eHh4LCByZWcpOworCWlmICh3Y2Q5eHh4X2kyYyA9PSBOVUxMIHx8IHdjZDl4eHhfaTJjLT5jbGllbnQgPT0gTlVMTCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgZGV2aWNlIGluZm9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHsKKwkJcmVnX2FkZHIgPSAodTgpcmVnKys7CisJCW1zZyA9ICZ3Y2Q5eHh4X2kyYy0+eGZlcl9tc2dbMF07CisJCW1zZy0+YWRkciA9IHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkZHI7CisJCW1zZy0+bGVuID0gMTsKKwkJbXNnLT5mbGFncyA9IDA7CisJCW1zZy0+YnVmID0gJnJlZ19hZGRyOworCisJCW1zZyA9ICZ3Y2Q5eHh4X2kyYy0+eGZlcl9tc2dbMV07CisJCW1zZy0+YWRkciA9IHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkZHI7CisJCW1zZy0+bGVuID0gMTsKKwkJbXNnLT5mbGFncyA9IEkyQ19NX1JEOworCQltc2ctPmJ1ZiA9IGRlc3QrKzsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkYXB0ZXIsCisJCQkJd2NkOXh4eF9pMmMtPnhmZXJfbXNnLCAyKTsKKworCQkvKiBUcnkgYWdhaW4gaWYgcmVhZCBmYWlscyBmaXJzdCB0aW1lICovCisJCWlmIChyZXQgIT0gMikgeworCQkJcmV0ID0gaTJjX3RyYW5zZmVyKHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkYXB0ZXIsCisJCQkJCSAgIHdjZDl4eHhfaTJjLT54ZmVyX21zZywgMik7CisJCQlpZiAocmV0ICE9IDIpIHsKKwkJCQlwcl9lcnIoImZhaWxlZCB0byByZWFkIHdjZDl4eHggcmVnaXN0ZXJcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB3Y2Q5eHh4X2kyY19yZWFkKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQlpbnQgYnl0ZXMsIHZvaWQgKmRlc3QsIGJvb2wgaW50ZXJmYWNlX3JlZykKK3sKKwlyZXR1cm4gd2NkOXh4eF9pMmNfcmVhZF9kZXZpY2Uod2NkOXh4eCwgcmVnLCBieXRlcywgZGVzdCk7Cit9CisKK2ludCB3Y2Q5eHh4X2kyY193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJIGludCBieXRlcywgdm9pZCAqc3JjLCBib29sIGludGVyZmFjZV9yZWcpCit7CisJcmV0dXJuIHdjZDl4eHhfaTJjX3dyaXRlX2RldmljZSh3Y2Q5eHh4LCByZWcsIHNyYywgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaTJjX2dldF9jbGllbnRfaW5kZXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJaW50ICp3Y2Q5eHhfaW5kZXgpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNsaWVudC0+YWRkcikgeworCWNhc2UgV0NEOVhYWF9JMkNfVE9QX1NMQVZFX0FERFI6CisJCSp3Y2Q5eHhfaW5kZXggPSBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUw7CisJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0FOQUxPR19JMkNfU0xBVkVfQUREUjoKKwkJKndjZDl4eF9pbmRleCA9IFdDRDlYWFhfSTJDX0FOQUxPRzsKKwlicmVhazsKKwljYXNlIFdDRDlYWFhfRElHSVRBTDFfSTJDX1NMQVZFX0FERFI6CisJCSp3Y2Q5eHhfaW5kZXggPSBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzE7CisJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0RJR0lUQUwyX0kyQ19TTEFWRV9BRERSOgorCQkqd2NkOXh4X2luZGV4ID0gV0NEOVhYWF9JMkNfRElHSVRBTF8yOworCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IE5VTEw7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gTlVMTDsKKwlpbnQgdmFsID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd2NkOXh4X2luZGV4ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGludGZfdHlwZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKworCWludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOworCisJcHJfZGVidWcoIiVzOiBpbnRlcmZhY2Ugc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgaW50Zl90eXBlKTsKKwlpZiAoaW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOkNvZGVjIGlzIGRldGVjdGVkIGluIHNsaW1idXMgbW9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmIChpbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJcmV0ID0gd2NkOXh4eF9pMmNfZ2V0X2NsaWVudF9pbmRleChjbGllbnQsICZ3Y2Q5eHhfaW5kZXgpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBJMkMgc2V0IGNvZGVjIEkyQ1xuIgorCQkJCSJjbGllbnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWVsc2UgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpwcm9iZSBmb3Igb3RoZXIgc2xhdmVzXG4iCisJCQkJImRldmljZXMgb2YgY29kZWMgSTJDIHNsYXZlIEFkZHIgPSAleFxuIiwKKwkJCQlfX2Z1bmNfXywgY2xpZW50LT5hZGRyKTsKKwkJCXdjZDl4eHhfbW9kdWxlc1t3Y2Q5eHhfaW5kZXhdLmNsaWVudCA9IGNsaWVudDsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoaW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfUFJPQklORykgeworCQlkZXYgPSAmY2xpZW50LT5kZXY7CisJCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOlBsYXRmb3JtIGRhdGFcbiIKKwkJCQkiZnJvbSBkZXZpY2UgdHJlZVxuIiwgX19mdW5jX18pOworCQkJcGRhdGEgPSB3Y2Q5eHh4X3BvcHVsYXRlX2R0X2RhdGEoJmNsaWVudC0+ZGV2KTsKKwkJCWlmICghcGRhdGEpIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkJIiVzOiBGYWlsIHRvIG9idGFpbiBwZGF0YSBmcm9tIGRldmljZSB0cmVlXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOlBsYXRmb3JtIGRhdGEgZnJvbVxuIgorCQkJCSJib2FyZCBmaWxlXG4iLCBfX2Z1bmNfXyk7CisJCQlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJCX0KKwkJd2NkOXh4eCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eCksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXdjZDl4eHgpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoIXBkYXRhKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJd2NkOXh4eC0+dHlwZSA9IFdDRDlYWFg7CisJCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKSB7CisJCQlvZl9pZCA9IG9mX21hdGNoX2RldmljZSh3Y2Q5eHh4X29mX21hdGNoLCAmY2xpZW50LT5kZXYpOworCQkJaWYgKG9mX2lkKSB7CisJCQkJd2NkOXh4eC0+dHlwZSA9ICooKGludCAqKW9mX2lkLT5kYXRhKTsKKwkJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlczogY29kZWMgdHlwZSBpcyAlZFxuIiwKKwkJCQkJIF9fZnVuY19fLCB3Y2Q5eHh4LT50eXBlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzOiBkZXYub2Zfbm9kZSBpcyBOVUxMLCBkZWZhdWx0IHRvIFdDRDlYWFhcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXdjZDl4eHgtPnR5cGUgPSBXQ0Q5WFhYOworCQl9CisJCXdjZDl4eHgtPnJlZ21hcCA9IHdjZDl4eHhfcmVnbWFwX2luaXQoJmNsaWVudC0+ZGV2LAorCQkJCSZ3Y2Q5eHh4X2kyY19iYXNlX3JlZ21hcF9jb25maWcpOworCQlpZiAoSVNfRVJSKHdjZDl4eHgtPnJlZ21hcCkpIHsKKwkJCXJldCA9IFBUUl9FUlIod2NkOXh4eC0+cmVnbWFwKTsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2NvZGVjOworCQl9CisJCXdjZDl4eHgtPnJlc2V0X2dwaW8gPSBwZGF0YS0+cmVzZXRfZ3BpbzsKKwkJd2NkOXh4eC0+d2NkX3JzdF9ucCA9IHBkYXRhLT53Y2RfcnN0X25wOworCisJCWlmICghd2NkOXh4eC0+d2NkX3JzdF9ucCkgeworCQkJcGRhdGEtPnVzZV9waW5jdHJsID0gZmFsc2U7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBwaW5jdHJsIG5vdCB1c2VkIGZvciByc3RfblxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9jb2RlYzsKKwkJfQorCisJCWlmIChpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCSAgICBJMkNfRlVOQ19JMkMpID09IDApIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY2FuJ3QgdGFsayBJMkM/XG4iKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgd2NkOXh4eCk7CisJCXdjZDl4eHgtPmRldiA9ICZjbGllbnQtPmRldjsKKwkJd2NkOXh4eC0+ZGV2X3VwID0gdHJ1ZTsKKwkJaWYgKGNsaWVudC0+ZGV2Lm9mX25vZGUpCisJCQl3Y2Q5eHh4LT5tY2xrX3JhdGUgPSBwZGF0YS0+bWNsa19yYXRlOworCisJCXdjZDl4eHgtPm51bV9vZl9zdXBwbGllcyA9IHBkYXRhLT5udW1fc3VwcGxpZXM7CisJCXJldCA9IG1zbV9jZGNfaW5pdF9zdXBwbGllcyh3Y2Q5eHh4LT5kZXYsICZ3Y2Q5eHh4LT5zdXBwbGllcywKKwkJCQkJICAgIHBkYXRhLT5yZWd1bGF0b3IsCisJCQkJCSAgICBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKKwkJaWYgKCF3Y2Q5eHh4LT5zdXBwbGllcykgeworCQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogQ2Fubm90IGluaXQgd2NkIHN1cHBsaWVzXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2NvZGVjOworCQl9CisJCXJldCA9IG1zbV9jZGNfZW5hYmxlX3N0YXRpY19zdXBwbGllcyh3Y2Q5eHh4LT5kZXYsCisJCQkJCQkgICAgIHdjZDl4eHgtPnN1cHBsaWVzLAorCQkJCQkJICAgICBwZGF0YS0+cmVndWxhdG9yLAorCQkJCQkJICAgICBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkIHN0YXRpYyBzdXBwbHkgZW5hYmxlIGZhaWxlZCFcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnJfY29kZWM7CisJCX0KKwkJLyogRm9yIFdDRDkzMzUsIGl0IHRha2VzIGFib3V0IDYwMHVzIGZvciB0aGUgVm91dF9BIGFuZAorCQkgKiBWb3V0X0QgdG8gYmUgcmVhZHkgYWZ0ZXIgQlVDS19TSURPIGlzIHBvd2VyZWQgdXBcCisJCSAqIFNZU19SU1RfTiBzaG91bGRuJ3QgYmUgcHVsbGVkIGhpZ2ggZHVyaW5nIHRoaXMgdGltZQorCQkgKi8KKwkJaWYgKHdjZDl4eHgtPnR5cGUgPT0gV0NEOTMzNSkKKwkJCXVzbGVlcF9yYW5nZSg2MDAsIDY1MCk7CisJCWVsc2UKKwkJCXVzbGVlcF9yYW5nZSg1LCAxMCk7CisKKwkJcmV0ID0gd2NkOXh4eF9yZXNldCh3Y2Q5eHh4LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBSZXNldHRpbmcgQ29kZWMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9zdXBwbGllczsKKwkJfQorCisJCXJldCA9IHdjZDl4eHhfaTJjX2dldF9jbGllbnRfaW5kZXgoY2xpZW50LCAmd2NkOXh4X2luZGV4KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcl9lcnIoIiVzOlNldCBjb2RlYyBJMkMgY2xpZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBlcnJfc3VwcGxpZXM7CisJCX0KKworCQl3Y2Q5eHh4X21vZHVsZXNbd2NkOXh4X2luZGV4XS5jbGllbnQgPSBjbGllbnQ7CisJCXdjZDl4eHgtPnJlYWRfZGV2ID0gd2NkOXh4eF9pMmNfcmVhZDsKKwkJd2NkOXh4eC0+d3JpdGVfZGV2ID0gd2NkOXh4eF9pMmNfd3JpdGU7CisJCWlmICghd2NkOXh4eC0+ZGV2LT5vZl9ub2RlKQorCQkJd2NkOXh4eF9hc3NpZ25faXJxKCZ3Y2Q5eHh4LT5jb3JlX3JlcywKKwkJCQkJcGRhdGEtPmlycSwgcGRhdGEtPmlycV9iYXNlKTsKKworCQlyZXQgPSB3Y2Q5eHh4X2RldmljZV9pbml0KHdjZDl4eHgpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBlcnJvciwgaW5pdGlhbGl6aW5nIGRldmljZSBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2RldmljZV9pbml0OworCQl9CisKKwkJcmV0ID0gd2NkOXh4eF9pMmNfcmVhZCh3Y2Q5eHh4LCBXQ0Q5WFhYX0FfQ0hJUF9TVEFUVVMsIDEsCisJCQkJICAgICAgICZ2YWwsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWFkIHRoZSB3Y2Q5eHh4IHN0YXR1cyAoJWQpXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlpZiAodmFsICE9IHdjZDl4eHgtPmNvZGVjX3R5cGUtPmkyY19jaGlwX3N0YXR1cykKKwkJCXByX2VycigiJXM6IHVua25vd24gY2hpcCBzdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHZhbCk7CisKKwkJd2NkOXh4eF9zZXRfaW50Zl90eXBlKFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCXByX2VycigiJXM6IEkyQyBwcm9iZSBpbiB3cm9uZyBzdGF0ZVxuIiwgX19mdW5jX18pOworCisKK2Vycl9kZXZpY2VfaW5pdDoKKwl3Y2Q5eHh4X3Jlc2V0X2xvdyh3Y2Q5eHh4LT5kZXYpOworZXJyX3N1cHBsaWVzOgorCW1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyh3Y2Q5eHh4LT5kZXYsIHdjZDl4eHgtPnN1cHBsaWVzLAorCQkJCSBwZGF0YS0+cmVndWxhdG9yLAorCQkJCSBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKKwlwZGF0YS0+cmVndWxhdG9yID0gTlVMTDsKKwlwZGF0YS0+bnVtX3N1cHBsaWVzID0gMDsKK2Vycl9jb2RlYzoKKwlkZXZtX2tmcmVlKCZjbGllbnQtPmRldiwgd2NkOXh4eCk7CisJZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgTlVMTCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXdjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoJmNsaWVudC0+ZGV2KTsKKwltc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LCB3Y2Q5eHh4LT5zdXBwbGllcywKKwkJCQkgcGRhdGEtPnJlZ3VsYXRvciwKKwkJCQkgcGRhdGEtPm51bV9zdXBwbGllcyk7CisJd2NkOXh4eF9kZXZpY2VfZXhpdCh3Y2Q5eHh4KTsKKwlkZXZfc2V0X2RydmRhdGEoJmNsaWVudC0+ZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2R0X3BhcnNlX3NsaW1faW50ZXJmYWNlX2Rldl9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBzbGltX2RldmljZSAqc2xpbV9pZmQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtc2xpbS1pZmQiLAorCQkJCSAgICAgICZzbGltX2lmZC0+bmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAorCQkJInFjb20sY2RjLXNsaW0taWZkLWRldiIsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwKKwkJCSJxY29tLGNkYy1zbGltLWlmZC1lbGVtZW50YWwtYWRkciIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQlkZXZfZXJyKGRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAorCQkJInFjb20sY2RjLXNsaW0taWZkLWVsZW1lbnRhbC1hZGRyIiwKKwkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmIChwcm9wLT5sZW5ndGggIT0gNikgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgY29kZWMgc2xpbSBpZmQgYWRkci4gYWRkciBsZW5ndGggPSAlZFxuIiwKKwkJCSAgICAgIHByb3AtPmxlbmd0aCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltZW1jcHkoc2xpbV9pZmQtPmVfYWRkciwgcHJvcC0+dmFsdWUsIDYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9zbGltX2dldF9sYWRkcihzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNiLAorCQkJCSAgY29uc3QgdTggKmVfYWRkciwgdTggZV9sZW4sIHU4ICpsYWRkcikKK3sKKwlpbnQgcmV0OworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKworCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoU0xJTUJVU19QUkVTRU5UX1RJTUVPVVQpOworCisJZG8geworCQlyZXQgPSBzbGltX2dldF9sb2dpY2FsX2FkZHIoc2IsIGVfYWRkciwgZV9sZW4sIGxhZGRyKTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwkJLyogR2l2ZSBTTElNQlVTIHRpbWUgdG8gcmVwb3J0IHByZXNlbnQgYW5kIGJlIHJlYWR5LiAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXByX2RlYnVnX3JhdGVsaW1pdGVkKCIlczogcmV0eXJpbmcgZ2V0IGxvZ2ljYWwgYWRkclxuIiwKKwkJCQkgICAgIF9fZnVuY19fKTsKKwl9IHdoaWxlIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fcHJvYmUoc3RydWN0IHNsaW1fZGV2aWNlICpzbGltKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW50Zl90eXBlOworCisJaW50Zl90eXBlID0gd2NkOXh4eF9nZXRfaW50Zl90eXBlKCk7CisKKwlpZiAoIXNsaW0pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykgeworCQlkZXZfZGJnKCZzbGltLT5kZXYsICIlczpDb2RlYyBpcyBkZXRlY3RlZCBpbiBJMkMgbW9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChzbGltLT5kZXYub2Zfbm9kZSkgeworCQlkZXZfaW5mbygmc2xpbS0+ZGV2LCAiUGxhdGZvcm0gZGF0YSBmcm9tIGRldmljZSB0cmVlXG4iKTsKKwkJcGRhdGEgPSB3Y2Q5eHh4X3BvcHVsYXRlX2R0X2RhdGEoJnNsaW0tPmRldik7CisJCWlmICghcGRhdGEpIHsKKwkJCWRldl9lcnIoJnNsaW0tPmRldiwKKwkJCQkiJXM6IEZhaWwgdG8gb2J0YWluIHBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmV0ID0gd2NkOXh4eF9kdF9wYXJzZV9zbGltX2ludGVyZmFjZV9kZXZfaW5mbygmc2xpbS0+ZGV2LAorCQkJCSZwZGF0YS0+c2xpbWJ1c19zbGF2ZV9kZXZpY2UpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzbGltLT5kZXYsICJFcnJvciwgcGFyc2luZyBzbGltIGludGVyZmFjZVxuIik7CisJCQlkZXZtX2tmcmVlKCZzbGltLT5kZXYsIHBkYXRhKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlzbGltLT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJnNsaW0tPmRldiwgIlBsYXRmb3JtIGRhdGEgZnJvbSBib2FyZCBmaWxlXG4iKTsKKwkJcGRhdGEgPSBzbGltLT5kZXYucGxhdGZvcm1fZGF0YTsKKwl9CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnNsaW0tPmRldiwgIkVycm9yLCBubyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJd2NkOXh4eCA9IGRldm1fa3phbGxvYygmc2xpbS0+ZGV2LCBzaXplb2Yoc3RydWN0IHdjZDl4eHgpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghd2NkOXh4eCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFzbGltLT5jdHJsKSB7CisJCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBFcnJvciwgbm8gU0xJTUJVUyBjb250cm9sIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2NvZGVjOworCX0KKwl3Y2Q5eHh4LT50eXBlID0gc2xpbV9nZXRfZGV2aWNlX2lkKHNsaW0pLT5kcml2ZXJfZGF0YTsKKwlkZXZfaW5mbygmc2xpbS0+ZGV2LCAiJXM6IHByb2JpbmcgZm9yIHdjZCB0eXBlOiAlZCwgbmFtZTogJXNcbiIsCisJCSBfX2Z1bmNfXywgd2NkOXh4eC0+dHlwZSwgc2xpbV9nZXRfZGV2aWNlX2lkKHNsaW0pLT5uYW1lKTsKKworCS8qIHdjZDl4eHggbWVtYmVycyBpbml0ICovCisJd2NkOXh4eC0+bXVsdGlfcmVnX3dyaXRlID0gd2NkOXh4eF9zbGltX211bHRpX3JlZ193cml0ZTsKKwl3Y2Q5eHh4LT5zbGltID0gc2xpbTsKKwlzbGltX3NldF9jbGllbnRkYXRhKHNsaW0sIHdjZDl4eHgpOworCXdjZDl4eHgtPnJlc2V0X2dwaW8gPSBwZGF0YS0+cmVzZXRfZ3BpbzsKKwl3Y2Q5eHh4LT5kZXYgPSAmc2xpbS0+ZGV2OworCXdjZDl4eHgtPm1jbGtfcmF0ZSA9IHBkYXRhLT5tY2xrX3JhdGU7CisJd2NkOXh4eC0+ZGV2X3VwID0gdHJ1ZTsKKwl3Y2Q5eHh4LT53Y2RfcnN0X25wID0gcGRhdGEtPndjZF9yc3RfbnA7CisKKwl3Y2Q5eHh4LT5yZWdtYXAgPSB3Y2Q5eHh4X3JlZ21hcF9pbml0KCZzbGltLT5kZXYsCisJCQkJCSAgICAgICZ3Y2Q5eHh4X2Jhc2VfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUih3Y2Q5eHh4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIod2NkOXh4eC0+cmVnbWFwKTsKKwkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2NvZGVjOworCX0KKworCWlmICghd2NkOXh4eC0+d2NkX3JzdF9ucCkgeworCQlwZGF0YS0+dXNlX3BpbmN0cmwgPSBmYWxzZTsKKwkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IHBpbmN0cmwgbm90IHVzZWQgZm9yIHJzdF9uXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9jb2RlYzsKKwl9CisKKwl3Y2Q5eHh4LT5udW1fb2Zfc3VwcGxpZXMgPSBwZGF0YS0+bnVtX3N1cHBsaWVzOworCXJldCA9IG1zbV9jZGNfaW5pdF9zdXBwbGllcygmc2xpbS0+ZGV2LCAmd2NkOXh4eC0+c3VwcGxpZXMsCisJCQkJICAgIHBkYXRhLT5yZWd1bGF0b3IsCisJCQkJICAgIHBkYXRhLT5udW1fc3VwcGxpZXMpOworCWlmICghd2NkOXh4eC0+c3VwcGxpZXMpIHsKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogQ2Fubm90IGluaXQgd2NkIHN1cHBsaWVzXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9jb2RlYzsKKwl9CisJcmV0ID0gbXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzKHdjZDl4eHgtPmRldiwKKwkJCQkJICAgICB3Y2Q5eHh4LT5zdXBwbGllcywKKwkJCQkJICAgICBwZGF0YS0+cmVndWxhdG9yLAorCQkJCQkgICAgIHBkYXRhLT5udW1fc3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkIHN0YXRpYyBzdXBwbHkgZW5hYmxlIGZhaWxlZCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2NvZGVjOworCX0KKworCS8qCisJICogRm9yIFdDRDkzMzUsIGl0IHRha2VzIGFib3V0IDYwMHVzIGZvciB0aGUgVm91dF9BIGFuZAorCSAqIFZvdXRfRCB0byBiZSByZWFkeSBhZnRlciBCVUNLX1NJRE8gaXMgcG93ZXJlZCB1cC4KKwkgKiBTWVNfUlNUX04gc2hvdWxkbid0IGJlIHB1bGxlZCBoaWdoIGR1cmluZyB0aGlzIHRpbWUKKwkgKi8KKwlpZiAod2NkOXh4eC0+dHlwZSA9PSBXQ0Q5MzM1IHx8IHdjZDl4eHgtPnR5cGUgPT0gV0NEOTM0WCkKKwkJdXNsZWVwX3JhbmdlKDYwMCwgNjUwKTsKKwllbHNlCisJCXVzbGVlcF9yYW5nZSg1LCAxMCk7CisKKwlyZXQgPSB3Y2Q5eHh4X3Jlc2V0KCZzbGltLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IFJlc2V0dGluZyBDb2RlYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfc3VwcGxpZXM7CisJfQorCisJcmV0ID0gd2NkOXh4eF9zbGltX2dldF9sYWRkcih3Y2Q5eHh4LT5zbGltLCB3Y2Q5eHh4LT5zbGltLT5lX2FkZHIsCisJCQkJICAgICBBUlJBWV9TSVpFKHdjZDl4eHgtPnNsaW0tPmVfYWRkciksCisJCQkJICAgICAmd2NkOXh4eC0+c2xpbS0+bGFkZHIpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgc2xpbWJ1cyAlcyBsb2dpY2FsIGFkZHJlc3M6ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHdjZDl4eHgtPnNsaW0tPm5hbWUsIHJldCk7CisJCWdvdG8gZXJyX3Jlc2V0OworCX0KKwl3Y2Q5eHh4LT5yZWFkX2RldiA9IHdjZDl4eHhfc2xpbV9yZWFkX2RldmljZTsKKwl3Y2Q5eHh4LT53cml0ZV9kZXYgPSB3Y2Q5eHh4X3NsaW1fd3JpdGVfZGV2aWNlOworCXdjZDl4eHhfcGdkX2xhID0gd2NkOXh4eC0+c2xpbS0+bGFkZHI7CisJd2NkOXh4eC0+c2xpbV9zbGF2ZSA9ICZwZGF0YS0+c2xpbWJ1c19zbGF2ZV9kZXZpY2U7CisJaWYgKCF3Y2Q5eHh4LT5kZXYtPm9mX25vZGUpCisJCXdjZDl4eHhfYXNzaWduX2lycSgmd2NkOXh4eC0+Y29yZV9yZXMsCisJCQkJCXBkYXRhLT5pcnEsIHBkYXRhLT5pcnFfYmFzZSk7CisKKwlyZXQgPSBzbGltX2FkZF9kZXZpY2Uoc2xpbS0+Y3RybCwgd2NkOXh4eC0+c2xpbV9zbGF2ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzbGltLT5kZXYsICIlczogZXJyb3IsIGFkZGluZyBTTElNQlVTIGRldmljZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3Jlc2V0OworCX0KKworCXJldCA9IHdjZDl4eHhfc2xpbV9nZXRfbGFkZHIod2NkOXh4eC0+c2xpbV9zbGF2ZSwKKwkJCQkgICAgIHdjZDl4eHgtPnNsaW1fc2xhdmUtPmVfYWRkciwKKwkJCQkgICAgIEFSUkFZX1NJWkUod2NkOXh4eC0+c2xpbV9zbGF2ZS0+ZV9hZGRyKSwKKwkJCQkgICAgICZ3Y2Q5eHh4LT5zbGltX3NsYXZlLT5sYWRkcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzbGltLT5kZXYsICIlczogZmFpbGVkIHRvIGdldCBzbGltYnVzICVzIGxvZ2ljYWwgYWRkcmVzczogJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgd2NkOXh4eC0+c2xpbS0+bmFtZSwgcmV0KTsKKwkJZ290byBlcnJfc2xpbV9hZGQ7CisJfQorCXdjZDl4eHhfaW5mX2xhID0gd2NkOXh4eC0+c2xpbV9zbGF2ZS0+bGFkZHI7CisJd2NkOXh4eF9zZXRfaW50Zl90eXBlKFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUyk7CisKKwlyZXQgPSB3Y2Q5eHh4X2RldmljZV9pbml0KHdjZDl4eHgpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IGVycm9yLCBpbml0aWFsaXppbmcgZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX3NsaW1fYWRkOworCX0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlkZWJ1Z0NvZGVjID0gd2NkOXh4eDsKKworCWRlYnVnZnNfd2NkOXh4eF9kZW50ID0gZGVidWdmc19jcmVhdGVfZGlyCisJCSgid2NkOXh4eF9jb3JlIiwgMCk7CisJaWYgKCFJU19FUlIoZGVidWdmc193Y2Q5eHh4X2RlbnQpKSB7CisJCWRlYnVnZnNfcGVlayA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInNsaW1zbGF2ZV9wZWVrIiwKKwkJU19JRlJFRyB8IDA0NDQsIGRlYnVnZnNfd2NkOXh4eF9kZW50LAorCQkodm9pZCAqKSAic2xpbXNsYXZlX3BlZWsiLCAmY29kZWNfZGVidWdfb3BzKTsKKworCQlkZWJ1Z2ZzX3Bva2UgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzbGltc2xhdmVfcG9rZSIsCisJCVNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3djZDl4eHhfZGVudCwKKwkJKHZvaWQgKikgInNsaW1zbGF2ZV9wb2tlIiwgJmNvZGVjX2RlYnVnX29wcyk7CisKKwkJZGVidWdmc19wb3dlcl9zdGF0ZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInBvd2VyX3N0YXRlIiwKKwkJU19JRlJFRyB8IDA0NDQsIGRlYnVnZnNfd2NkOXh4eF9kZW50LAorCQkodm9pZCAqKSAicG93ZXJfc3RhdGUiLCAmY29kZWNfZGVidWdfb3BzKTsKKworCQlkZWJ1Z2ZzX3JlZ19kdW1wID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2xpbXNsYXZlX3JlZ19kdW1wIiwKKwkJU19JRlJFRyB8IDA0NDQsIGRlYnVnZnNfd2NkOXh4eF9kZW50LAorCQkodm9pZCAqKSAic2xpbXNsYXZlX3JlZ19kdW1wIiwgJmNvZGVjX2RlYnVnX29wcyk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworCitlcnJfc2xpbV9hZGQ6CisJc2xpbV9yZW1vdmVfZGV2aWNlKHdjZDl4eHgtPnNsaW1fc2xhdmUpOworZXJyX3Jlc2V0OgorCXdjZDl4eHhfcmVzZXRfbG93KHdjZDl4eHgtPmRldik7CitlcnJfc3VwcGxpZXM6CisJbXNtX2NkY19yZWxlYXNlX3N1cHBsaWVzKHdjZDl4eHgtPmRldiwgd2NkOXh4eC0+c3VwcGxpZXMsCisJCQkJIHBkYXRhLT5yZWd1bGF0b3IsCisJCQkJIHBkYXRhLT5udW1fc3VwcGxpZXMpOworZXJyX2NvZGVjOgorCXNsaW1fc2V0X2NsaWVudGRhdGEoc2xpbSwgTlVMTCk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgd2NkOXh4eF9zbGltX3JlbW92ZShzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGVidWdmc193Y2Q5eHh4X2RlbnQpOworI2VuZGlmCisJd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEocGRldik7CisJd2NkOXh4eF9kZWluaXRfc2xpbXNsYXZlKHdjZDl4eHgpOworCXNsaW1fcmVtb3ZlX2RldmljZSh3Y2Q5eHh4LT5zbGltX3NsYXZlKTsKKwltc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LCB3Y2Q5eHh4LT5zdXBwbGllcywKKwkJCQkgcGRhdGEtPnJlZ3VsYXRvciwKKwkJCQkgcGRhdGEtPm51bV9zdXBwbGllcyk7CisJd2NkOXh4eF9kZXZpY2VfZXhpdCh3Y2Q5eHh4KTsKKwlzbGltX3NldF9jbGllbnRkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfZGV2aWNlX3VwKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCisJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IGNvZGVjIGJyaW5nIHVwXG4iLCBfX2Z1bmNfXyk7CisJd2NkOXh4eF9icmluZ3VwKHdjZDl4eHgtPmRldik7CisJcmV0ID0gd2NkOXh4eF9pcnFfaW5pdCh3Y2Q5eHh4X3Jlcyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB3Y2Q5eHhfaXJxX2luaXQgZmFpbGVkIDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCX0gZWxzZSB7CisJCWlmICh3Y2Q5eHh4LT5wb3N0X3Jlc2V0KQorCQkJcmV0ID0gd2NkOXh4eC0+cG9zdF9yZXNldCh3Y2Q5eHh4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fZGV2aWNlX3Jlc2V0KHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEoc2xkZXYpOworCisJaWYgKCF3Y2Q5eHh4KSB7CisJCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfaW5mbyh3Y2Q5eHh4LT5kZXYsICIlczogZGV2aWNlIHJlc2V0LCBkZXZfdXAgPSAlZFxuIiwKKwkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7CisJaWYgKHdjZDl4eHgtPmRldl91cCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB3Y2Q5eHh4X3Jlc2V0KHdjZDl4eHgtPmRldik7CisJaWYgKHJldCkKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogUmVzZXR0aW5nIENvZGVjIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fZGV2aWNlX3VwKHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBzbGltX2dldF9kZXZpY2VkYXRhKHNsZGV2KTsKKworCWlmICghd2NkOXh4eCkgeworCQlwcl9lcnIoIiVzOiB3Y2Q5eHh4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiBzbGltIGRldmljZSB1cCwgZGV2X3VwID0gJWRcbiIsCisJCV9fZnVuY19fLCB3Y2Q5eHh4LT5kZXZfdXApOworCWlmICh3Y2Q5eHh4LT5kZXZfdXApCisJCXJldHVybiAwOworCisJd2NkOXh4eC0+ZGV2X3VwID0gdHJ1ZTsKKwlyZXR1cm4gd2NkOXh4eF9kZXZpY2VfdXAod2NkOXh4eCk7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9zbGltX2RldmljZV9kb3duKHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBzbGltX2dldF9kZXZpY2VkYXRhKHNsZGV2KTsKKworCWlmICghd2NkOXh4eCkgeworCQlwcl9lcnIoIiVzOiB3Y2Q5eHh4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IGRldmljZSBkb3duLCBkZXZfdXAgPSAlZFxuIiwKKwkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7CisJaWYgKCF3Y2Q5eHh4LT5kZXZfdXApCisJCXJldHVybiAwOworCisJd2NkOXh4eC0+ZGV2X3VwID0gZmFsc2U7CisJd2NkOXh4eF9pcnFfZXhpdCgmd2NkOXh4eC0+Y29yZV9yZXMpOworCWlmICh3Y2Q5eHh4LT5kZXZfZG93bikKKwkJd2NkOXh4eC0+ZGV2X2Rvd24od2NkOXh4eCk7CisJd2NkOXh4eF9yZXNldF9sb3cod2NkOXh4eC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fcmVzdW1lKHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBzbGltX2dldF9kZXZpY2VkYXRhKHNsZGV2KTsKKworCXJldHVybiB3Y2Q5eHh4X2NvcmVfcmVzX3Jlc3VtZSgmd2NkOXh4eC0+Y29yZV9yZXMpOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICh3Y2Q5eHh4KQorCQlyZXR1cm4gd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUoJndjZDl4eHgtPmNvcmVfcmVzKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9zdXNwZW5kKHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYsIHBtX21lc3NhZ2VfdCBwbWVzZykKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEoc2xkZXYpOworCisJcmV0dXJuIHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCgmd2NkOXh4eC0+Y29yZV9yZXMsIHBtZXNnKTsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXBtX21lc3NhZ2VfdCBwbWVzZyA9IHswfTsKKworCWlmICh3Y2Q5eHh4KQorCQlyZXR1cm4gd2NkOXh4eF9jb3JlX3Jlc19zdXNwZW5kKCZ3Y2Q5eHh4LT5jb3JlX3JlcywgcG1lc2cpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2xpbV9kZXZpY2VfaWQgd2NkX3NsaW1fZGV2aWNlX2lkW10gPSB7CisJeyJzaXRhci1zbGltIiwgMH0sCisJeyJzaXRhcjFwMS1zbGltIiwgMH0sCisJeyJ0YWJsYS1zbGltIiwgMH0sCisJeyJ0YWJsYTJ4LXNsaW0iLCAwfSwKKwl7InRhaWtvLXNsaW0tcGdkIiwgMH0sCisJeyJ0YXBhbi1zbGltLXBnZCIsIDB9LAorCXsidG9tdG9tLXNsaW0tcGdkIiwgV0NEOTMzMH0sCisJeyJ0YXNoYS1zbGltLXBnZCIsIFdDRDkzMzV9LAorCXsidGF2aWwtc2xpbS1wZ2QiLCBXQ0Q5MzRYfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzbGltX2RyaXZlciB3Y2Rfc2xpbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid2NkLXNsaW0iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHdjZDl4eHhfc2xpbV9wcm9iZSwKKwkucmVtb3ZlID0gd2NkOXh4eF9zbGltX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3Y2Rfc2xpbV9kZXZpY2VfaWQsCisJLnJlc3VtZSA9IHdjZDl4eHhfc2xpbV9yZXN1bWUsCisJLnN1c3BlbmQgPSB3Y2Q5eHh4X3NsaW1fc3VzcGVuZCwKKwkuZGV2aWNlX3VwID0gd2NkOXh4eF9zbGltX2RldmljZV91cCwKKwkucmVzZXRfZGV2aWNlID0gd2NkOXh4eF9zbGltX2RldmljZV9yZXNldCwKKwkuZGV2aWNlX2Rvd24gPSB3Y2Q5eHh4X3NsaW1fZGV2aWNlX2Rvd24sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgd2NkOXh4eF9pZF90YWJsZVtdID0geworCXsid2NkOXh4eC1pMmMiLCBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUx9LAorCXsid2NkOXh4eC1pMmMiLCBXQ0Q5WFhYX0kyQ19BTkFMT0d9LAorCXsid2NkOXh4eC1pMmMiLCBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzF9LAorCXsid2NkOXh4eC1pMmMiLCBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzJ9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgdGFzaGFfaWRfdGFibGVbXSA9IHsKKwl7InRhc2hhLWkyYy1wZ2QiLCBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUx9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgdGFibGFfaWRfdGFibGVbXSA9IHsKKwl7InRhYmxhIHRvcCBsZXZlbCIsIFdDRDlYWFhfSTJDX1RPUF9MRVZFTH0sCisJeyJ0YWJsYSBhbmFsb2ciLCBXQ0Q5WFhYX0kyQ19BTkFMT0d9LAorCXsidGFibGEgZGlnaXRhbDEiLCBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzF9LAorCXsidGFibGEgZGlnaXRhbDIiLCBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzJ9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRhYmxhX2lkX3RhYmxlKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdjZDl4eHhfaTJjX3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IHdjZDl4eHhfaTJjX3N1c3BlbmQsCisJLnJlc3VtZQk9IHdjZDl4eHhfaTJjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0YWJsYV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgICAgICAgICAgICAgICAgID0geworCQkub3duZXIgICAgICAgICAgPSAgICAgICBUSElTX01PRFVMRSwKKwkJLm5hbWUgICAgICAgICAgID0gICAgICAgInRhYmxhLWkyYy1jb3JlIiwKKwkJLnBtCQk9CSZ3Y2Q5eHh4X2kyY19wbV9vcHMsCisJfSwKKwkuaWRfdGFibGUgICAgICAgICAgICAgICA9ICAgICAgIHRhYmxhX2lkX3RhYmxlLAorCS5wcm9iZSAgICAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgICAgICAgICAgPSAgICAgICB3Y2Q5eHh4X2kyY19yZW1vdmUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd2NkOXh4eF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgICAgICAgICAgICAgICAgID0geworCQkub3duZXIgICAgICAgICAgPSAgICAgICBUSElTX01PRFVMRSwKKwkJLm5hbWUgICAgICAgICAgID0gICAgICAgIndjZDl4eHgtaTJjLWNvcmUiLAorCQkucG0JCT0JJndjZDl4eHhfaTJjX3BtX29wcywKKwl9LAorCS5pZF90YWJsZSAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pZF90YWJsZSwKKwkucHJvYmUgICAgICAgICAgICAgICAgICA9ICAgICAgIHdjZDl4eHhfaTJjX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pMmNfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdjZDkzMzVfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCSAgICAgICAgICAgICAgICA9IHsKKwkJLm93bmVyCSAgICAgICAgPSAgICAgICBUSElTX01PRFVMRSwKKwkJLm5hbWUgICAgICAgICAgID0gICAgICAgInRhc2hhLWkyYy1jb3JlIiwKKwkJLnBtCQk9CSZ3Y2Q5eHh4X2kyY19wbV9vcHMsCisJfSwKKwkuaWRfdGFibGUgICAgICAgICAgICAgICA9ICAgICAgIHRhc2hhX2lkX3RhYmxlLAorCS5wcm9iZSAgICAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgICAgICAgICAgPSAgICAgICB3Y2Q5eHh4X2kyY19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3Y2Q5eHh4X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0W05VTV9XQ0Q5WFhYX1JFR19SRVRdID0gezB9OworCWludCBpID0gMDsKKworCXdjZDl4eHhfc2V0X2ludGZfdHlwZShXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1BST0JJTkcpOworCisJcmV0WzBdID0gaTJjX2FkZF9kcml2ZXIoJnRhYmxhX2kyY19kcml2ZXIpOworCWlmIChyZXRbMF0pCisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhZGQgdGhlIHRhYmxhMnggSTJDIGRyaXZlcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0WzBdKTsKKworCXJldFsxXSA9IGkyY19hZGRfZHJpdmVyKCZ3Y2Q5eHh4X2kyY19kcml2ZXIpOworCWlmIChyZXRbMV0pCisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhZGQgdGhlIHdjZDl4eHggSTJDIGRyaXZlcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0WzFdKTsKKworCXJldFsyXSA9IGkyY19hZGRfZHJpdmVyKCZ3Y2Q5MzM1X2kyY19kcml2ZXIpOworCWlmIChyZXRbMl0pCisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhZGQgdGhlIHdjZDkzMzUgSTJDIGRyaXZlcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0WzJdKTsKKworCXJldFszXSA9IHNsaW1fZHJpdmVyX3JlZ2lzdGVyKCZ3Y2Rfc2xpbV9kcml2ZXIpOworCWlmIChyZXRbM10pCisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZWdpc3RlciB3Y2QgU0IgZHJpdmVyOiAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXRbM10pOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9XQ0Q5WFhYX1JFR19SRVQ7IGkrKykgeworCQlpZiAocmV0W2ldKQorCQkJcmV0dXJuIHJldFtpXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHdjZDl4eHhfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3Y2Q5eHh4X2V4aXQodm9pZCkKK3sKKwl3Y2Q5eHh4X3NldF9pbnRmX3R5cGUoV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9QUk9CSU5HKTsKKworCWkyY19kZWxfZHJpdmVyKCZ0YWJsYV9pMmNfZHJpdmVyKTsKKwlpMmNfZGVsX2RyaXZlcigmd2NkOXh4eF9pMmNfZHJpdmVyKTsKKwlpMmNfZGVsX2RyaXZlcigmd2NkOTMzNV9pMmNfZHJpdmVyKTsKKwlzbGltX2RyaXZlcl91bnJlZ2lzdGVyKCZ3Y2Rfc2xpbV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod2NkOXh4eF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb2RlYyBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOXh4eC1pcnEuYyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1MGYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtaXJxLmMKQEAgLTAsMCArMSw3ODUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisKKyNkZWZpbmUgQllURV9CSVRfTUFTSyhucikJCSgxVUwgPDwgKChucikgJSBCSVRTX1BFUl9CWVRFKSkKKyNkZWZpbmUgQklUX0JZVEUobnIpCQkJKChucikgLyBCSVRTX1BFUl9CWVRFKQorCisjZGVmaW5lIFdDRDlYWFhfU1lTVEVNX1JFU1VNRV9USU1FT1VUX01TIDEwMAorCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEJKC0xKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0cnVjdCB3Y2Q5eHh4X2lycV9kcnZfZGF0YSB7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlpbnQgaXJxOworfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHZpcnFfdG9fcGh5aXJxKAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgdmlycSk7CitzdGF0aWMgaW50IHBoeWlycV90b192aXJxKAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2NkOXh4eF9pcnFfZ2V0X3Vwc3RyZWFtX2lycSgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7CitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2lycV9wdXRfdXBzdHJlYW1faXJxKAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKK3N0YXRpYyBpbnQgd2NkOXh4eF9tYXBfaXJxKAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxKTsKKworc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQorCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJbXV0ZXhfbG9jaygmd2NkOXh4eF9yZXMtPmlycV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0KKwkJCWlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWludCBpOworCisJaWYgKChBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKSA+CisJICAgICBXQ0Q5WFhYX01BWF9JUlFfUkVHUykgfHwKKwkgICAgIChBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY2FjaGUpID4KKwkgICAgICBXQ0Q5WFhYX01BWF9JUlFfUkVHUykpIHsKKwkJcHJfZXJyKCIlczogQXJyYXkgU2l6ZSBvdXQgb2YgYm91bmRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKKwkJcHJfZXJyKCIlczogQ29kZWMgY29yZSByZWdtYXAgbm90IGRlZmluZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cik7IGkrKykgeworCQkvKiBJZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIG1hc2sgd3JpdGUgaXQgYmFjaworCQkgKiB0byB0aGUgaGFyZHdhcmUuCisJCSAqLworCQlpZiAod2NkOXh4eF9yZXMtPmlycV9tYXNrc19jdXJbaV0gIT0KKwkJCQkJd2NkOXh4eF9yZXMtPmlycV9tYXNrc19jYWNoZVtpXSkgeworCisJCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2NhY2hlW2ldID0KKwkJCQkJd2NkOXh4eF9yZXMtPmlycV9tYXNrc19jdXJbaV07CisJCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSArIGksCisJCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cltpXSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQorCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7CisJaW50IGJ5dGUgPSBCSVRfQllURSh3Y2Q5eHh4X2lycSk7CisJaW50IHNpemUgPSBBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKTsKKworCWlmICgoYnl0ZSA8IHNpemUpICYmIChieXRlID49IDApKSB7CisJCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW2J5dGVdICY9CisJCQl+KEJZVEVfQklUX01BU0sod2NkOXh4eF9pcnEpKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBBcnJheSBzaXplIGlzICVkIGJ1dCBpbmRleCBpcyAlZDogT3V0IG9mIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIHNpemUsIGJ5dGUpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQorCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7CisJaW50IGJ5dGUgPSBCSVRfQllURSh3Y2Q5eHh4X2lycSk7CisJaW50IHNpemUgPSBBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKTsKKworCWlmICgoYnl0ZSA8IHNpemUpICYmIChieXRlID49IDApKSB7CisJCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW2J5dGVdCisJCQl8PSBCWVRFX0JJVF9NQVNLKHdjZDl4eHhfaXJxKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBBcnJheSBzaXplIGlzICVkIGJ1dCBpbmRleCBpcyAlZDogT3V0IG9mIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIHNpemUsIGJ5dGUpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpbnQgd2NkOXh4eF9pcnEgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0KKwkJCWlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCisJaWYgKHdjZDl4eHhfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd2NkOXh4eF9yZXMgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7CisJcHJfZGVidWcoIiVzOiBJUlFfQUNLIGNhbGxlZCBmb3IgV0NEOVhYWCBJUlE6ICVkXG4iLAorCQkJCV9fZnVuY19fLCB3Y2Q5eHh4X2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCS8qIGRvIG5vdGhpbmcgYnV0IHJlcXVpcmVkIGFzIGxpbnV4IGNhbGxzIGlycV9tYXNrIHdpdGhvdXQgTlVMTCBjaGVjayAqLworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdjZDl4eHhfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAid2NkOXh4eCIsCisJLmlycV9idXNfbG9jayA9IHdjZDl4eHhfaXJxX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sgPSB3Y2Q5eHh4X2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2Rpc2FibGUgPSB3Y2Q5eHh4X2lycV9kaXNhYmxlLAorCS5pcnFfZW5hYmxlID0gd2NkOXh4eF9pcnFfZW5hYmxlLAorCS5pcnFfbWFzayA9IHdjZDl4eHhfaXJxX21hc2ssCisJLmlycV9hY2sgPSB3Y2Q5eHh4X2lycV9hY2ssCit9OworCitib29sIHdjZDl4eHhfbG9ja19zbGVlcCgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwllbnVtIHdjZDl4eHhfcG1fc3RhdGUgb3M7CisKKwkvKgorCSAqIHdjZDl4eHhfe2xvY2svdW5sb2NrfV9zbGVlcCB3aWxsIGJlIGNhbGxlZCBieSB3Y2Q5eHh4X2lycV90aHJlYWQKKwkgKiBhbmQgaXRzIHN1YnJvdXRpbmVzIG9ubHkgbW90bHkuCisJICogYnV0IGJ0bjBfbHByZXNzX2ZuIGlzIG5vdCB3Y2Q5eHh4X2lycV90aHJlYWQncyBzdWJyb3V0aW5lIGFuZAorCSAqIEl0IGNhbiByYWNlIHdpdGggd2NkOXh4eF9pcnFfdGhyZWFkLgorCSAqIFNvIG5lZWQgdG8gZW1icmFjZSB3bG9ja19ob2xkZXJzIHdpdGggbXV0ZXguCisJICoKKwkgKiBJZiBzeXN0ZW0gZGlkbid0IHJlc3VtZSwgd2UgY2FuIHNpbXBseSByZXR1cm4gZmFsc2Ugc28gY29kZWMgZHJpdmVyJ3MKKwkgKiBJUlEgaGFuZGxlciBjYW4gcmV0dXJuIHdpdGhvdXQgaGFuZGxpbmcgSVJRLgorCSAqIEFzIGludGVycnVwdCBsaW5lIGlzIHN0aWxsIGFjdGl2ZSwgY29kZWMgd2lsbCBoYXZlIGFub3RoZXIgSVJRIHRvCisJICogcmV0cnkgc2hvcnRseS4KKwkgKi8KKwltdXRleF9sb2NrKCZ3Y2Q5eHh4X3Jlcy0+cG1fbG9jayk7CisJaWYgKHdjZDl4eHhfcmVzLT53bG9ja19ob2xkZXJzKysgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IGhvbGRpbmcgd2FrZSBsb2NrXG4iLCBfX2Z1bmNfXyk7CisJCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmd2NkOXh4eF9yZXMtPnBtX3Fvc19yZXEsCisJCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOworCQlwbV9zdGF5X2F3YWtlKHdjZDl4eHhfcmVzLT5kZXYpOworCX0KKwltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5wbV9sb2NrKTsKKworCWlmICghd2FpdF9ldmVudF90aW1lb3V0KHdjZDl4eHhfcmVzLT5wbV93cSwKKwkJCQkoKG9zID0gIHdjZDl4eHhfcG1fY21weGNoZyh3Y2Q5eHh4X3JlcywKKwkJCQkJCSAgV0NEOVhYWF9QTV9TTEVFUEFCTEUsCisJCQkJCQkgIFdDRDlYWFhfUE1fQVdBS0UpKSA9PQorCQkJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFIHx8CisJCQkJCShvcyA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSksCisJCQkJbXNlY3NfdG9famlmZmllcygKKwkJCQkJV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMpKSkgeworCQlwcl93YXJuKCIlczogc3lzdGVtIGRpZG4ndCByZXN1bWUgd2l0aGluICVkbXMsIHMgJWQsIHcgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCVdDRDlYWFhfU1lTVEVNX1JFU1VNRV9USU1FT1VUX01TLCB3Y2Q5eHh4X3Jlcy0+cG1fc3RhdGUsCisJCQl3Y2Q5eHh4X3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJCXdjZDl4eHhfdW5sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwl3YWtlX3VwX2FsbCgmd2NkOXh4eF9yZXMtPnBtX3dxKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9sb2NrX3NsZWVwKTsKKwordm9pZCB3Y2Q5eHh4X3VubG9ja19zbGVlcCgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwltdXRleF9sb2NrKCZ3Y2Q5eHh4X3Jlcy0+cG1fbG9jayk7CisJaWYgKC0td2NkOXh4eF9yZXMtPndsb2NrX2hvbGRlcnMgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2luZyB3YWtlIGxvY2sgcG1fc3RhdGUgJWQgLT4gJWRcbiIsCisJCQkgX19mdW5jX18sIHdjZDl4eHhfcmVzLT5wbV9zdGF0ZSwgV0NEOVhYWF9QTV9TTEVFUEFCTEUpOworCQkvKgorCQkgKiBpZiB3Y2Q5eHh4X2xvY2tfc2xlZXAgZmFpbGVkLCBwbV9zdGF0ZSB3b3VsZCBiZSBzdGlsbAorCQkgKiBXQ0Q5WFhYX1BNX0FTTEVFUCwgZG9uJ3Qgb3ZlcndyaXRlCisJCSAqLworCQlpZiAobGlrZWx5KHdjZDl4eHhfcmVzLT5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSkKKwkJCXdjZDl4eHhfcmVzLT5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOworCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJndjZDl4eHhfcmVzLT5wbV9xb3NfcmVxLAorCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKwkJcG1fcmVsYXgod2NkOXh4eF9yZXMtPmRldik7CisJfQorCW11dGV4X3VubG9jaygmd2NkOXh4eF9yZXMtPnBtX2xvY2spOworCXdha2VfdXBfYWxsKCZ3Y2Q5eHh4X3Jlcy0+cG1fd3EpOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3VubG9ja19zbGVlcCk7CisKK3ZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2soc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpCit7CisJbXV0ZXhfbG9jaygmd2NkOXh4eF9yZXMtPm5lc3RlZF9pcnFfbG9jayk7Cit9CisKK3ZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX3VubG9jayhzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworfQorCisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX2Rpc3BhdGNoKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAorCQkJc3RydWN0IGludHJfZGF0YSAqaXJxZGF0YSkKK3sKKwlpbnQgaXJxYml0ID0gaXJxZGF0YS0+aW50cl9udW07CisKKwlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKKwkJcHJfZXJyKCIlczogY29kZWMgY29yZSByZWdtYXAgbm90IGRlZmluZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXJxZGF0YS0+Y2xlYXJfZmlyc3QpIHsKKwkJd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2sod2NkOXh4eF9yZXMpOworCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gKworCQkJCQkgICAgICBCSVRfQllURShpcnFiaXQpLAorCQkJQllURV9CSVRfTUFTSyhpcnFiaXQpKTsKKworCQlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCisJCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCQl3Y2Q5eHh4X3Jlcy0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0NMUl9DT01NSVRdLAorCQkJCTB4MDIpOworCQloYW5kbGVfbmVzdGVkX2lycShwaHlpcnFfdG9fdmlycSh3Y2Q5eHh4X3JlcywgaXJxYml0KSk7CisJCXdjZDl4eHhfbmVzdGVkX2lycV91bmxvY2sod2NkOXh4eF9yZXMpOworCX0gZWxzZSB7CisJCXdjZDl4eHhfbmVzdGVkX2lycV9sb2NrKHdjZDl4eHhfcmVzKTsKKwkJaGFuZGxlX25lc3RlZF9pcnEocGh5aXJxX3RvX3ZpcnEod2NkOXh4eF9yZXMsIGlycWJpdCkpOworCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gKworCQkJCQkgICAgICBCSVRfQllURShpcnFiaXQpLAorCQkJQllURV9CSVRfTUFTSyhpcnFiaXQpKTsKKwkJaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQorCQkJcmVnbWFwX3dyaXRlKHdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXAsCisJCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTFJfQ09NTUlUXSwKKwkJCQkweDAyKTsKKworCQl3Y2Q5eHh4X25lc3RlZF9pcnFfdW5sb2NrKHdjZDl4eHhfcmVzKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCWludCBpOworCXN0cnVjdCBpbnRyX2RhdGEgaXJxZGF0YTsKKwljaGFyIGxpbmVidWZbMTI4XTsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUgKiBIWiwgMSk7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPSBkYXRhOworCWludCBudW1faXJxX3JlZ3MgPSB3Y2Q5eHh4X3Jlcy0+bnVtX2lycV9yZWdzOworCXU4IHN0YXR1c1tudW1faXJxX3JlZ3NdLCBzdGF0dXMxW251bV9pcnFfcmVnc107CisKKwlpZiAodW5saWtlbHkod2NkOXh4eF9sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKSA9PSBmYWxzZSkpIHsKKwkJZGV2X2Vycih3Y2Q5eHh4X3Jlcy0+ZGV2LCAiRmFpbGVkIHRvIGhvbGQgc3VzcGVuZFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKKwkJZGV2X2Vycih3Y2Q5eHh4X3Jlcy0+ZGV2LAorCQkJIiVzOiBDb2RlYyBjb3JlIHJlZ21hcCBub3Qgc3VwcGxpZWRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2Rpc2FibGVfaXJxOworCX0KKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9TVEFUVVNfQkFTRV0sCisJCXN0YXR1cywgbnVtX2lycV9yZWdzKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IHN0YXR1czogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2Rpc2FibGVfaXJxOworCX0KKworCS8qIEFwcGx5IG1hc2tpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2lycV9yZWdzOyBpKyspCisJCXN0YXR1c1tpXSAmPSB+d2NkOXh4eF9yZXMtPmlycV9tYXNrc19jdXJbaV07CisKKwltZW1jcHkoc3RhdHVzMSwgc3RhdHVzLCBzaXplb2Yoc3RhdHVzMSkpOworCisJLyogRmluZCBvdXQgd2hpY2ggaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgYW5kIGNhbGwgdGhhdCBpbnRlcnJ1cHQncworCSAqIGhhbmRsZXIgZnVuY3Rpb24KKwkgKgorCSAqIFNpbmNlIGNvZGVjIGhhcyBvbmx5IG9uZSBoYXJkd2FyZSBpcnEgbGluZSB3aGljaCBpcyBzaGFyZWQgYnkKKwkgKiBjb2RlYydzIGRpZmZlcmVudCBpbnRlcm5hbCBpbnRlcnJ1cHRzLCBzbyBpdCdzIHBvc3NpYmxlIG1hc3RlciBpcnEKKwkgKiBoYW5kbGVyIGRpc3BhdGNoZXMgbXVsdGlwbGUgbmVzdGVkIGlycSBoYW5kbGVycyBhZnRlciBicmVha2luZworCSAqIG9yZGVyLiAgRGlzcGF0Y2ggaW50ZXJydXB0cyBpbiB0aGUgb3JkZXIgdGhhdCBpcyBtYWludGFpbmVkIGJ5CisJICogdGhlIGludGVycnVwdCB0YWJsZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd2NkOXh4eF9yZXMtPmludHJfdGFibGVfc2l6ZTsgaSsrKSB7CisJCWlycWRhdGEgPSB3Y2Q5eHh4X3Jlcy0+aW50cl90YWJsZVtpXTsKKwkJaWYgKHN0YXR1c1tCSVRfQllURShpcnFkYXRhLmludHJfbnVtKV0gJgorCQkJQllURV9CSVRfTUFTSyhpcnFkYXRhLmludHJfbnVtKSkgeworCQkJd2NkOXh4eF9pcnFfZGlzcGF0Y2god2NkOXh4eF9yZXMsICZpcnFkYXRhKTsKKwkJCXN0YXR1czFbQklUX0JZVEUoaXJxZGF0YS5pbnRyX251bSldICY9CisJCQkJCX5CWVRFX0JJVF9NQVNLKGlycWRhdGEuaW50cl9udW0pOworCQl9CisJfQorCisJLyoKKwkgKiBBcyBhIGZhaWxzYWZlIGlmIHVuaGFuZGxlZCBpcnEgaXMgZm91bmQsIGNsZWFyIGl0IHRvIHByZXZlbnQKKwkgKiBpbnRlcnJ1cHQgc3Rvcm0uCisJICogTm90ZSB0aGF0IHdlIGNhbiBzYXkgdGhlcmUgd2FzIGFuIHVuaGFuZGxlZCBpcnEgb25seSB3aGVuIG5vIGlycQorCSAqIGhhbmRsZWQgYnkgbmVzdGVkIGlycSBoYW5kbGVyIHNpbmNlIFRhaWtvIHN1cHBvcnRzIHFkc3AgYXMgaXJxcycKKwkgKiBkZXN0aW5hdGlvbiBmb3IgZmV3IGlycXMuICBUaGVyZWZvcmUgZHJpdmVyIHNob3VsZG4ndCBjbGVhciBwZW5kaW5nCisJICogaXJxcyB3aGVuIGZldyBoYW5kbGVkIHdoaWxlIGZldyBvdGhlcnMgbm90LgorCSAqLworCWlmICh1bmxpa2VseSghbWVtY21wKHN0YXR1cywgc3RhdHVzMSwgc2l6ZW9mKHN0YXR1cykpKSkgeworCQlpZiAoX19yYXRlbGltaXQoJnJhdGVsaW1pdCkpIHsKKwkJCXByX3dhcm4oIiVzOiBVbmhhbmRsZWQgaXJxIGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCQloZXhfZHVtcF90b19idWZmZXIoc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgMTYsIDEsCisJCQkJCSAgIGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgZmFsc2UpOworCQkJcHJfd2FybigiJXM6IHN0YXR1czAgOiAlc1xuIiwgX19mdW5jX18sIGxpbmVidWYpOworCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHN0YXR1czEsIHNpemVvZihzdGF0dXMxKSwgMTYsIDEsCisJCQkJCSAgIGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgZmFsc2UpOworCQkJcHJfd2FybigiJXM6IHN0YXR1czEgOiAlc1xuIiwgX19mdW5jX18sIGxpbmVidWYpOworCQl9CisKKwkJbWVtc2V0KHN0YXR1cywgMHhmZiwgbnVtX2lycV9yZWdzKTsKKworCQlyZXQgPSByZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwLAorCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTEVBUl9CQVNFXSwKKwkJCXN0YXR1cywgbnVtX2lycV9yZWdzKTsKKwkJaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQorCQkJcmVnbWFwX3dyaXRlKHdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXAsCisJCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTFJfQ09NTUlUXSwKKwkJCQkweDAyKTsKKwl9CisJd2NkOXh4eF91bmxvY2tfc2xlZXAod2NkOXh4eF9yZXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworCitlcnJfZGlzYWJsZV9pcnE6CisJCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKKwkJCQkiRGlzYWJsZSBpcnEgJWRcbiIsIHdjZDl4eHhfcmVzLT5pcnEpOworCisJCWRpc2FibGVfaXJxX3dha2Uod2NkOXh4eF9yZXMtPmlycSk7CisJCWRpc2FibGVfaXJxX25vc3luYyh3Y2Q5eHh4X3Jlcy0+aXJxKTsKKwkJd2NkOXh4eF91bmxvY2tfc2xlZXAod2NkOXh4eF9yZXMpOworCQlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3ZvaWQgd2NkOXh4eF9mcmVlX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywKKwkJCWludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJZnJlZV9pcnEocGh5aXJxX3RvX3ZpcnEod2NkOXh4eF9yZXMsIGlycSksIGRhdGEpOworfQorCit2b2lkIHdjZDl4eHhfZW5hYmxlX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSkKK3sKKwlpZiAod2NkOXh4eF9yZXMtPmlycSkKKwkJZW5hYmxlX2lycShwaHlpcnFfdG9fdmlycSh3Y2Q5eHh4X3JlcywgaXJxKSk7Cit9CisKK3ZvaWQgd2NkOXh4eF9kaXNhYmxlX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSkKK3sKKwlpZiAod2NkOXh4eF9yZXMtPmlycSkKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHBoeWlycV90b192aXJxKHdjZDl4eHhfcmVzLCBpcnEpKTsKK30KKwordm9pZCB3Y2Q5eHh4X2Rpc2FibGVfaXJxX3N5bmMoCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSkKK3sKKwlpZiAod2NkOXh4eF9yZXMtPmlycSkKKwkJZGlzYWJsZV9pcnEocGh5aXJxX3RvX3ZpcnEod2NkOXh4eF9yZXMsIGlycSkpOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaXJxX3NldHVwX2Rvd25zdHJlYW1faXJxKAorCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpCit7CisJaW50IGlycSwgdmlycSwgcmV0OworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCB3Y2Q5eHh4X3Jlcy0+bnVtX2lycXM7IGlycSsrKSB7CisJCS8qIE1hcCBPRiBpcnEgKi8KKwkJdmlycSA9IHdjZDl4eHhfbWFwX2lycSh3Y2Q5eHh4X3JlcywgaXJxKTsKKwkJcHJfZGVidWcoIiVzOiBpcnEgJWQgLT4gJWRcbiIsIF9fZnVuY19fLCBpcnEsIHZpcnEpOworCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJCXByX2VycigiJXMsIE5vIGludGVycnVwdCBzcGVjaWZpZXIgZm9yIGlycSAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgaXJxKTsKKwkJCXJldHVybiBOT19JUlE7CisJCX0KKworCQlyZXQgPSBpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCB3Y2Q5eHh4X3Jlcyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgaXJxICVkICglZClcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGlycSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAod2NkOXh4eF9yZXMtPmlycV9sZXZlbF9oaWdoW2lycV0pCisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJndjZDl4eHhfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJCWVsc2UKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmd2NkOXh4eF9pcnFfY2hpcCwKKwkJCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCisJCWlycV9zZXRfbmVzdGVkX3RocmVhZCh2aXJxLCAxKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHdjZDl4eHhfaXJxX2luaXQoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpCit7CisJaW50IGksIHJldDsKKwl1OCBpcnFfbGV2ZWxbd2NkOXh4eF9yZXMtPm51bV9pcnFfcmVnc107CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBub2RlOworCisJbXV0ZXhfaW5pdCgmd2NkOXh4eF9yZXMtPmlycV9sb2NrKTsKKwltdXRleF9pbml0KCZ3Y2Q5eHh4X3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKKworCXBub2RlID0gb2ZfaXJxX2ZpbmRfcGFyZW50KHdjZDl4eHhfcmVzLT5kZXYtPm9mX25vZGUpOworCWlmICh1bmxpa2VseSghcG5vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvbWFpbiA9IGlycV9maW5kX2hvc3QocG5vZGUpOworCWlmICh1bmxpa2VseSghZG9tYWluKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3Y2Q5eHh4X3Jlcy0+ZG9tYWluID0gZG9tYWluOworCisJd2NkOXh4eF9yZXMtPmlycSA9IHdjZDl4eHhfaXJxX2dldF91cHN0cmVhbV9pcnEod2NkOXh4eF9yZXMpOworCWlmICghd2NkOXh4eF9yZXMtPmlycSkgeworCQlwcl93YXJuKCIlczogaXJxIGRyaXZlciBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5pcnFfbG9jayk7CisJCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisJcHJfZGVidWcoIiVzOiBwcm9iZWQgaXJxICVkXG4iLCBfX2Z1bmNfXywgd2NkOXh4eF9yZXMtPmlycSk7CisKKwkvKiBTZXR1cCBkb3duc3RyZWFtIElSUXMgKi8KKwlyZXQgPSB3Y2Q5eHh4X2lycV9zZXR1cF9kb3duc3RyZWFtX2lycSh3Y2Q5eHh4X3Jlcyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0dXAgZG93bnN0cmVhbSBJUlFcbiIsIF9fZnVuY19fKTsKKwkJd2NkOXh4eF9pcnFfcHV0X3Vwc3RyZWFtX2lycSh3Y2Q5eHh4X3Jlcyk7CisJCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5pcnFfbG9jayk7CisJCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEFsbCBvdGhlciB3Y2Q5eHh4IGludGVycnVwdHMgYXJlIGVkZ2UgdHJpZ2dlcmVkICovCisJd2NkOXh4eF9yZXMtPmlycV9sZXZlbF9oaWdoWzBdID0gdHJ1ZTsKKworCS8qIG1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJbWVtc2V0KGlycV9sZXZlbCwgMCwgd2NkOXh4eF9yZXMtPm51bV9pcnFfcmVncyk7CisJZm9yIChpID0gMDsgaSA8IHdjZDl4eHhfcmVzLT5udW1faXJxczsgaSsrKSB7CisJCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW0JJVF9CWVRFKGkpXSB8PSBCWVRFX0JJVF9NQVNLKGkpOworCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2NhY2hlW0JJVF9CWVRFKGkpXSB8PSBCWVRFX0JJVF9NQVNLKGkpOworCQlpcnFfbGV2ZWxbQklUX0JZVEUoaSldIHw9CisJCSAgICB3Y2Q5eHh4X3Jlcy0+aXJxX2xldmVsX2hpZ2hbaV0gPDwgKGkgJSBCSVRTX1BFUl9CWVRFKTsKKwl9CisKKwlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKKwkJZGV2X2Vycih3Y2Q5eHh4X3Jlcy0+ZGV2LAorCQkJIiVzOiBDb2RlYyBjb3JlIHJlZ21hcCBub3QgZGVmaW5lZFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2lycV9pbml0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCB3Y2Q5eHh4X3Jlcy0+bnVtX2lycV9yZWdzOyBpKyspIHsKKwkJLyogSW5pdGlhbGl6ZSBpbnRlcnJ1cHQgbWFzayBhbmQgbGV2ZWwgcmVnaXN0ZXJzICovCisJCXJlZ21hcF93cml0ZSh3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwLAorCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9MRVZFTF9CQVNFXSArIGksCisJCQkJCWlycV9sZXZlbFtpXSk7CisJCXJlZ21hcF93cml0ZSh3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwLAorCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9NQVNLX0JBU0VdICsgaSwKKwkJCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW2ldKTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3Y2Q5eHh4X3Jlcy0+aXJxLCBOVUxMLCB3Y2Q5eHh4X2lycV90aHJlYWQsCisJCQkJICAgSVJRRl9UUklHR0VSX0hJR0ggfCBJUlFGX09ORVNIT1QsCisJCQkJICAgIndjZDl4eHgiLCB3Y2Q5eHh4X3Jlcyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKHdjZDl4eHhfcmVzLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgJWQ6ICVkXG4iLAorCQkJd2NkOXh4eF9yZXMtPmlycSwgcmV0KTsKKwllbHNlIHsKKwkJcmV0ID0gZW5hYmxlX2lycV93YWtlKHdjZDl4eHhfcmVzLT5pcnEpOworCQlpZiAocmV0KQorCQkJZGV2X2Vycih3Y2Q5eHh4X3Jlcy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gc2V0IHdha2UgaW50ZXJydXB0IG9uIElSUSAlZDogJWRcbiIsCisJCQkJd2NkOXh4eF9yZXMtPmlycSwgcmV0KTsKKwkJaWYgKHJldCkKKwkJCWZyZWVfaXJxKHdjZDl4eHhfcmVzLT5pcnEsIHdjZDl4eHhfcmVzKTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfaXJxX2luaXQ7CisKKwlyZXR1cm4gcmV0OworCitmYWlsX2lycV9pbml0OgorCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGluaXQgd2NkOXh4eCBpcnFcbiIsIF9fZnVuY19fKTsKKwl3Y2Q5eHh4X2lycV9wdXRfdXBzdHJlYW1faXJxKHdjZDl4eHhfcmVzKTsKKwltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+aXJxX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCB3Y2Q5eHh4X3JlcXVlc3RfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAorCQkJaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgdmlycTsKKworCXZpcnEgPSBwaHlpcnFfdG9fdmlycSh3Y2Q5eHh4X3JlcywgaXJxKTsKKworCXJldHVybiByZXF1ZXN0X3RocmVhZGVkX2lycSh2aXJxLCBOVUxMLCBoYW5kbGVyLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSAgICBuYW1lLCBkYXRhKTsKK30KKwordm9pZCB3Y2Q5eHh4X2lycV9leGl0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQoreworCWRldl9kYmcod2NkOXh4eF9yZXMtPmRldiwgIiVzOiBDbGVhbmluZyB1cCBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQl3Y2Q5eHh4X3Jlcy0+aXJxKTsKKworCWlmICh3Y2Q5eHh4X3Jlcy0+aXJxKSB7CisJCWRpc2FibGVfaXJxX3dha2Uod2NkOXh4eF9yZXMtPmlycSk7CisJCWZyZWVfaXJxKHdjZDl4eHhfcmVzLT5pcnEsIHdjZDl4eHhfcmVzKTsKKwkJd2NkOXh4eF9yZXMtPmlycSA9IDA7CisJCXdjZDl4eHhfaXJxX3B1dF91cHN0cmVhbV9pcnEod2NkOXh4eF9yZXMpOworCX0KKwltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+aXJxX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworfQorCisjaWZuZGVmIENPTkZJR19PRgorc3RhdGljIGludCBwaHlpcnFfdG9fdmlycSgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywKKwlpbnQgb2Zmc2V0KQoreworCXJldHVybiB3Y2Q5eHh4X3Jlcy0+aXJxX2Jhc2UgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlycV90b19waHlpcnEoCisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCisJaW50IHZpcnEpCit7CisJcmV0dXJuIHZpcnEgLSB3Y2Q5eHh4X3Jlcy0+aXJxX2Jhc2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2NkOXh4eF9pcnFfZ2V0X3Vwc3RyZWFtX2lycSgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwlyZXR1cm4gd2NkOXh4eF9yZXMtPmlycTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfcHV0X3Vwc3RyZWFtX2lycSgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwkvKiBEbyBub3RoaW5nICovCit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9tYXBfaXJxKAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsIGludCBpcnEpCit7CisJcmV0dXJuIHBoeWlycV90b192aXJxKHdjZDl4eHhfY29yZV9yZXMsIGlycSk7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCB3Y2Q5eHh4X2lycV9kcnZfZGF0YSAqCit3Y2Q5eHh4X2lycV9hZGRfZG9tYWluKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKmRhdGEgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBub2RlICVzLCBub2RlIHBhcmVudCAlc1xuIiwgX19mdW5jX18sCisJCSBub2RlLT5uYW1lLCBub2RlLT5wYXJlbnQtPm5hbWUpOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogd2NkOXh4eF9pbnRjIGludGVycnVwdCBjb250cm9sbGVyIHN1cHBvcnRzIE4gdG8gTiBpcnEgbWFwcGluZyB3aXRoCisJICogc2luZ2xlIGNlbGwgYmluZGluZyB3aXRoIGlycSBudW1iZXJzKG9mZnNldHMpIG9ubHkuCisJICogVXNlIGlycV9kb21haW5fc2ltcGxlX29wcyB0aGF0IGhhcyBpcnFfZG9tYWluX3NpbXBsZV9tYXAgYW5kCisJICogaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsLgorCSAqLworCWRhdGEtPmRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBXQ0Q5WFhYX01BWF9OVU1fSVJRUywKKwkJCQkJICAgICAmaXJxX2RvbWFpbl9zaW1wbGVfb3BzLCBkYXRhKTsKKwlpZiAoIWRhdGEtPmRvbWFpbikgeworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKgord2NkOXh4eF9nZXRfaXJxX2Rydl9kKGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisKKwlkb21haW4gPSB3Y2Q5eHh4X3Jlcy0+ZG9tYWluOworCisJaWYgKGRvbWFpbikKKwkJcmV0dXJuIGRvbWFpbi0+aG9zdF9kYXRhOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGh5aXJxX3RvX3ZpcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBvZmZzZXQpCit7CisJc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhICpkYXRhOworCisJZGF0YSA9IHdjZDl4eHhfZ2V0X2lycV9kcnZfZCh3Y2Q5eHh4X3Jlcyk7CisJaWYgKCFkYXRhKSB7CisJCXByX3dhcm4oIiVzOiBub3QgcmVnaXN0ZXJlZCB0byBpbnRlcnJ1cHQgY29udHJvbGxlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChkYXRhLT5kb21haW4sIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgdmlycV90b19waHlpcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCB2aXJxKQoreworCXN0cnVjdCBpcnFfZGF0YSAqaXJxX2RhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKHZpcnEpOworCisJaWYgKHVubGlrZWx5KCFpcnFfZGF0YSkpIHsKKwkJcHJfZXJyKCIlczogaXJxX2RhdGEgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBpcnFfZGF0YS0+aHdpcnE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2NkOXh4eF9pcnFfZ2V0X3Vwc3RyZWFtX2lycSgKKwkJCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKmRhdGE7CisKKwlkYXRhID0gd2NkOXh4eF9nZXRfaXJxX2Rydl9kKHdjZDl4eHhfcmVzKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJfZXJyKCIlczogaW50ZXJydXB0IGNvbnRyb2xsZXIgaXMgbm90IHJlZ2lzdGVyZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIE1ha2Ugc3VyZSBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHJldHVybi4gKi8KKwlybWIoKTsKKwlyZXR1cm4gZGF0YS0+aXJxOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2lycV9wdXRfdXBzdHJlYW1faXJxKAorCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpCit7CisJd2NkOXh4eF9yZXMtPmRvbWFpbiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9tYXBfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxKQoreworCXJldHVybiBvZl9pcnFfdG9fcmVzb3VyY2Uod2NkOXh4eF9yZXMtPmRldi0+b2Zfbm9kZSwgaXJxLCBOVUxMKTsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2lycV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpcnE7CisJc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhICpkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCWludCByZXQgPSAtRUlOVkFMOworCisJaXJxID0gb2ZfZ2V0X25hbWVkX2dwaW8obm9kZSwgInFjb20sZ3Bpby1jb25uZWN0IiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKGlycSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVExNTSBjb25uZWN0IGdwaW8gbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCWlycSA9IGdwaW9fdG9faXJxKGlycSk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBpcnFcbiIpOworCQlyZXR1cm4gaXJxOworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogdmlycSA9ICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKKwlkYXRhID0gd2NkOXh4eF9pcnFfYWRkX2RvbWFpbihub2RlLCBub2RlLT5wYXJlbnQpOworCWlmICghZGF0YSkgeworCQlwcl9lcnIoIiVzOiBpcnFfYWRkX2RvbWFpbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEtPmlycSA9IGlycTsKKworCS8qIE1ha2Ugc3VyZSBpcnEgaXMgc2F2ZWQgYmVmb3JlIHJldHVybi4gKi8KKwl3bWIoKTsKKwlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2lycV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCB3Y2Q5eHh4X2lycV9kcnZfZGF0YSAqZGF0YTsKKworCWRvbWFpbiA9IGlycV9maW5kX2hvc3QocGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICh1bmxpa2VseSghZG9tYWluKSkgeworCQlwcl9lcnIoIiVzOiBkb21haW4gaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEgPSAoc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhICopZG9tYWluLT5ob3N0X2RhdGE7CisJZGF0YS0+aXJxID0gMDsKKworCS8qIE1ha2Ugc3VyZSBpcnEgdmFyaWFibGUgaXMgdXBkYXRlZCBpbiBkYXRhLCBiZWZvcmUgaXJxIHJlbW92YWwuICovCisJd21iKCk7CisJaXJxX2RvbWFpbl9yZW1vdmUoZGF0YS0+ZG9tYWluKTsKKwlrZnJlZShkYXRhKTsKKwlkb21haW4tPmhvc3RfZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sd2NkOXh4eC1pcnEiIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3Y2Q5eHh4X2lycV9kcml2ZXIgPSB7CisJLnByb2JlID0gd2NkOXh4eF9pcnFfcHJvYmUsCisJLnJlbW92ZSA9IHdjZDl4eHhfaXJxX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3Y2Q5eHh4X2ludGMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG9mX21hdGNoKSwKKwl9LAorfTsKKworc3RhdGljIGludCB3Y2Q5eHh4X2lycV9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndjZDl4eHhfaXJxX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwod2NkOXh4eF9pcnFfZHJ2X2luaXQpOworCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2lycV9kcnZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ3Y2Q5eHh4X2lycV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod2NkOXh4eF9pcnFfZHJ2X2V4aXQpOworI2VuZGlmIC8qIENPTkZJR19PRiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOXh4eC1yZWdtYXAuaCBiL2RyaXZlcnMvbWZkL3djZDl4eHgtcmVnbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiOGZjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtcmVnbWFwLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1dDRDlYWFhfUkVHTUFQXworI2RlZmluZSBfV0NEOVhYWF9SRUdNQVBfCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisKK3R5cGVkZWYgaW50ICgqcmVnbWFwX3BhdGNoX2ZwdHIpKHN0cnVjdCByZWdtYXAgKiwgaW50KTsKKworI2lmZGVmIENPTkZJR19XQ0Q5MzRYX0NPREVDCitleHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOTM0eF9yZWdtYXBfY29uZmlnOworZXh0ZXJuIGludCB3Y2Q5MzR4X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCSBpbnQgdmVyc2lvbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19XQ0Q5MzM1X0NPREVDCitleHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOTMzNV9yZWdtYXBfY29uZmlnOworZXh0ZXJuIGludCB3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCSBpbnQgdmVyc2lvbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19XQ0Q5MzMwX0NPREVDCitleHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOTMzMF9yZWdtYXBfY29uZmlnOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlZ21hcF9jb25maWcgKndjZDl4eHhfZ2V0X3JlZ21hcF9jb25maWcoaW50IHR5cGUpCit7CisJc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jb25maWc7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKyNpZmRlZiBDT05GSUdfV0NEOTM0WF9DT0RFQworCWNhc2UgV0NEOTM0WDoKKwkJcmVnbWFwX2NvbmZpZyA9ICZ3Y2Q5MzR4X3JlZ21hcF9jb25maWc7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1dDRDkzMzVfQ09ERUMKKwljYXNlIFdDRDkzMzU6CisJCXJlZ21hcF9jb25maWcgPSAmd2NkOTMzNV9yZWdtYXBfY29uZmlnOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQ0Q5MzMwX0NPREVDCisJY2FzZSBXQ0Q5MzMwOgorCQlyZWdtYXBfY29uZmlnID0gJndjZDkzMzBfcmVnbWFwX2NvbmZpZzsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZWdtYXBfY29uZmlnID0gTlVMTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZWdtYXBfY29uZmlnOworfQorCitzdGF0aWMgaW5saW5lIHJlZ21hcF9wYXRjaF9mcHRyIHdjZDl4eHhfZ2V0X3JlZ21hcF9yZWdfcGF0Y2goaW50IHR5cGUpCit7CisJcmVnbWFwX3BhdGNoX2ZwdHIgYXBwbHlfcGF0Y2g7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKyNpZmRlZiBDT05GSUdfV0NEOTMzNV9DT0RFQworCWNhc2UgV0NEOTMzNToKKwkJYXBwbHlfcGF0Y2ggPSB3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaDsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfV0NEOTM0WF9DT0RFQworCWNhc2UgV0NEOTM0WDoKKwkJYXBwbHlfcGF0Y2ggPSB3Y2Q5MzR4X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlhcHBseV9wYXRjaCA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBhcHBseV9wYXRjaDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5eHh4LXNsaW1zbGF2ZS5jIGIvZHJpdmVycy9tZmQvd2NkOXh4eC1zbGltc2xhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E5MjZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd2NkOXh4eC1zbGltc2xhdmUuYwpAQCAtMCwwICsxLDU2NCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXNsaW1zbGF2ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+CisKK3N0cnVjdCB3Y2Q5eHh4X3NsaW1fc2NoIHsKKwl1MTYgcnhfcG9ydF9jaF9yZWdfYmFzZTsKKwl1MTYgcG9ydF90eF9jZmdfcmVnX2Jhc2U7CisJdTE2IHBvcnRfcnhfY2ZnX3JlZ19iYXNlOworfTsKKworc3RhdGljIHN0cnVjdCB3Y2Q5eHh4X3NsaW1fc2NoIHNoX2NoOworCitzdGF0aWMgaW50IHdjZDl4eHhfYWxsb2Nfc2xpbV9zaF9jaChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCQkgICAgdTggd2NkOXh4eF9wZ2RfbGEsIHUzMiBjbnQsCisJCQkJICAgIHN0cnVjdCB3Y2Q5eHh4X2NoICpjaGFubmVscywgdTMyIHBhdGgpOworCitzdGF0aWMgaW50IHdjZDl4eHhfZGVhbGxvY19zbGltX3NoX2NoKHN0cnVjdCBzbGltX2RldmljZSAqc2xpbSwKKwkJCQkgICAgICB1MzIgY250LCBzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2hhbm5lbHMpOworCitzdGF0aWMgaW50IHdjZDl4eHhfY29uZmlndXJlX3BvcnRzKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWlmICh3Y2Q5eHh4LT5jb2RlY190eXBlLT5zbGltX3NsYXZlX3R5cGUgPT0KKwkgICAgV0NEOVhYWF9TTElNX1NMQVZFX0FERFJfVFlQRV8wKSB7CisJCXNoX2NoLnJ4X3BvcnRfY2hfcmVnX2Jhc2UgPSAweDE4MDsKKwkJc2hfY2gucG9ydF9yeF9jZmdfcmVnX2Jhc2UgPSAweDA0MDsKKwkJc2hfY2gucG9ydF90eF9jZmdfcmVnX2Jhc2UgPSAweDA0MDsKKwl9IGVsc2UgeworCQlzaF9jaC5yeF9wb3J0X2NoX3JlZ19iYXNlID0KKwkJCTB4MTgwIC0gKFRBSUtPX1NCX1BHRF9PRkZTRVRfT0ZfUlhfU0xBVkVfREVWX1BPUlRTICogNCk7CisJCXNoX2NoLnBvcnRfcnhfY2ZnX3JlZ19iYXNlID0KKwkJCTB4MDQwIC0gVEFJS09fU0JfUEdEX09GRlNFVF9PRl9SWF9TTEFWRV9ERVZfUE9SVFM7CisJCXNoX2NoLnBvcnRfdHhfY2ZnX3JlZ19iYXNlID0gMHgwNTA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHdjZDl4eHhfaW5pdF9zbGltc2xhdmUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHU4IHdjZDl4eHhfcGdkX2xhLAorCQkJICAgdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCQkJICAgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQoreworCWludCByZXQgPSAwOworCWludCBpOworCisJcmV0ID0gd2NkOXh4eF9jb25maWd1cmVfcG9ydHMod2NkOXh4eCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0XG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAod2NkOXh4eC0+cnhfY2hzKSB7CisJCXdjZDl4eHgtPm51bV9yeF9wb3J0ID0gcnhfbnVtOworCQlmb3IgKGkgPSAwOyBpIDwgcnhfbnVtOyBpKyspIHsKKwkJCXdjZDl4eHgtPnJ4X2Noc1tpXS5jaF9udW0gPSByeF9zbG90W2ldOworCQkJSU5JVF9MSVNUX0hFQUQoJndjZDl4eHgtPnJ4X2Noc1tpXS5saXN0KTsKKwkJfQorCQlyZXQgPSB3Y2Q5eHh4X2FsbG9jX3NsaW1fc2hfY2god2NkOXh4eCwgd2NkOXh4eF9wZ2RfbGEsCisJCQkJCQl3Y2Q5eHh4LT5udW1fcnhfcG9ydCwKKwkJCQkJCXdjZDl4eHgtPnJ4X2NocywKKwkJCQkJCVNMSU1fU0lOSyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvYyAlZCByeCBzbGltYnVzIGNoYW5uZWxzXG4iLAorCQkJCV9fZnVuY19fLCB3Y2Q5eHh4LT5udW1fcnhfcG9ydCk7CisJCQlrZnJlZSh3Y2Q5eHh4LT5yeF9jaHMpOworCQkJd2NkOXh4eC0+cnhfY2hzID0gTlVMTDsKKwkJCXdjZDl4eHgtPm51bV9yeF9wb3J0ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlZCBzbGltYnVzIHJ4IHBvcnRzXG4iLAorCQkJd2NkOXh4eC0+bnVtX3J4X3BvcnQpOworCX0KKworCWlmICh3Y2Q5eHh4LT50eF9jaHMpIHsKKwkJd2NkOXh4eC0+bnVtX3R4X3BvcnQgPSB0eF9udW07CisJCWZvciAoaSA9IDA7IGkgPCB0eF9udW07IGkrKykgeworCQkJd2NkOXh4eC0+dHhfY2hzW2ldLmNoX251bSA9IHR4X3Nsb3RbaV07CisJCQlJTklUX0xJU1RfSEVBRCgmd2NkOXh4eC0+dHhfY2hzW2ldLmxpc3QpOworCQl9CisJCXJldCA9IHdjZDl4eHhfYWxsb2Nfc2xpbV9zaF9jaCh3Y2Q5eHh4LCB3Y2Q5eHh4X3BnZF9sYSwKKwkJCQkJCXdjZDl4eHgtPm51bV90eF9wb3J0LAorCQkJCQkJd2NkOXh4eC0+dHhfY2hzLAorCQkJCQkJU0xJTV9TUkMpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2MgJWQgdHggc2xpbWJ1cyBjaGFubmVsc1xuIiwKKwkJCQlfX2Z1bmNfXywgd2NkOXh4eC0+bnVtX3R4X3BvcnQpOworCQkJa2ZyZWUod2NkOXh4eC0+dHhfY2hzKTsKKwkJCXdjZDl4eHgtPnR4X2NocyA9IE5VTEw7CisJCQl3Y2Q5eHh4LT5udW1fdHhfcG9ydCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJWQgc2xpbWJ1cyB0eCBwb3J0c1xuIiwKKwkJCXdjZDl4eHgtPm51bV90eF9wb3J0KTsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworaW50IHdjZDl4eHhfZGVpbml0X3NsaW1zbGF2ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpZiAod2NkOXh4eC0+bnVtX3J4X3BvcnQpIHsKKwkJd2NkOXh4eF9kZWFsbG9jX3NsaW1fc2hfY2god2NkOXh4eC0+c2xpbSwKKwkJCQkJd2NkOXh4eC0+bnVtX3J4X3BvcnQsCisJCQkJCXdjZDl4eHgtPnJ4X2Nocyk7CisJCXdjZDl4eHgtPm51bV9yeF9wb3J0ID0gMDsKKwl9CisJaWYgKHdjZDl4eHgtPm51bV90eF9wb3J0KSB7CisJCXdjZDl4eHhfZGVhbGxvY19zbGltX3NoX2NoKHdjZDl4eHgtPnNsaW0sCisJCQkJCXdjZDl4eHgtPm51bV90eF9wb3J0LAorCQkJCQl3Y2Q5eHh4LT50eF9jaHMpOworCQl3Y2Q5eHh4LT5udW1fdHhfcG9ydCA9IDA7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd2NkOXh4eF9hbGxvY19zbGltX3NoX2NoKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJCSAgICB1OCB3Y2Q5eHh4X3BnZF9sYSwgdTMyIGNudCwKKwkJCQkgICAgc3RydWN0IHdjZDl4eHhfY2ggKmNoYW5uZWxzLCB1MzIgcGF0aCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgY2hfaWR4OworCisJLyogVGhlIHNsaW1idXMgY2hhbm5lbCBhbGxvY2F0aW9uIHNlZW0gdGFrZSBsb25nZXIgdGltZQorCSAqIHNvIGRvIHRoZSBhbGxvY2F0aW9uIHVwIGZyb250IHRvIGF2b2lkIGRlbGF5IGluIHN0YXJ0IG9mCisJICogcGxheWJhY2sKKwkgKi8KKwlwcl9kZWJ1ZygiJXM6IHBnZF9sYVslZF1cbiIsIF9fZnVuY19fLCB3Y2Q5eHh4X3BnZF9sYSk7CisJZm9yIChjaF9pZHggPSAwOyBjaF9pZHggPCBjbnQ7IGNoX2lkeCsrKSB7CisJCXJldCA9IHNsaW1fZ2V0X3NsYXZlcG9ydCh3Y2Q5eHh4X3BnZF9sYSwKKwkJCQkJY2hhbm5lbHNbY2hfaWR4XS5wb3J0LAorCQkJCQkmY2hhbm5lbHNbY2hfaWR4XS5zcGgsIHBhdGgpOworCQlwcl9kZWJ1ZygiJXM6IHBnZF9sYVslZF0gY2hhbm5lbHNbJWRdLnBvcnRbJWRdXG4iCisJCQkiY2hhbm5lbHNbJWRdLnNwaFslZF0gcGF0aFslZF1cbiIsCisJCQlfX2Z1bmNfXywgd2NkOXh4eF9wZ2RfbGEsIGNoX2lkeCwKKwkJCWNoYW5uZWxzW2NoX2lkeF0ucG9ydCwKKwkJCWNoX2lkeCwgY2hhbm5lbHNbY2hfaWR4XS5zcGgsIHBhdGgpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogc2xhdmUgcG9ydCBmYWlsdXJlIGlkWyVkXSByZXRbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBjaGFubmVsc1tjaF9pZHhdLmNoX251bSwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmV0ID0gc2xpbV9xdWVyeV9jaCh3Y2Q5eHh4LT5zbGltLAorCQkJCSAgICBjaGFubmVsc1tjaF9pZHhdLmNoX251bSwKKwkJCQkgICAgJmNoYW5uZWxzW2NoX2lkeF0uY2hfaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBzbGltX3F1ZXJ5X2NoIGZhaWxlZCBjaC1udW1bJWRdIHJldFslZF1cbiIsCisJCQkJX19mdW5jX18sIGNoYW5uZWxzW2NoX2lkeF0uY2hfbnVtLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2RlYWxsb2Nfc2xpbV9zaF9jaChzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsaW0sCisJCQl1MzIgY250LCBzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2hhbm5lbHMpCit7CisJaW50IGlkeCA9IDA7CisJaW50IHJldCA9IDA7CisJLyogc2xpbV9kZWFsbG9jX2NoICovCisJZm9yIChpZHggPSAwOyBpZHggPCBjbnQ7IGlkeCsrKSB7CisJCXJldCA9IHNsaW1fZGVhbGxvY19jaChzbGltLCBjaGFubmVsc1tpZHhdLmNoX2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogc2xpbV9kZWFsbG9jX2NoIGZhaWwgcmV0WyVkXSBjaF9oWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0LCBjaGFubmVsc1tpZHhdLmNoX2gpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEVuYWJsZSBzbGltYnVzIHNsYXZlIGRldmljZSBmb3IgUlggcGF0aCAqLworaW50IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3J4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGJpdF93aWR0aCwKKwkJCSAgICB1MTYgKmdycGgpCit7CisJdTggY2hfY250ID0gMDsKKwl1MTYgY2hfaFtTTElNX01BWF9SWF9QT1JUU10gPSB7MH07CisJdTggIHBheWxvYWQgPSAwOworCXUxNiBjb2RlY19wb3J0ID0gMDsKKwlpbnQgcmV0OworCXN0cnVjdCBzbGltX2NoIHByb3A7CisJc3RydWN0IHdjZDl4eHhfY2ggKnJ4OworCWludCBzaXplID0gQVJSQVlfU0laRShjaF9oKTsKKworCS8qIENvbmZpZ3VyZSBzbGF2ZSBpbnRlcmZhY2UgZGV2aWNlICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCB3Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJcGF5bG9hZCB8PSAxIDw8IHJ4LT5zaGlmdDsKKwkJaWYgKGNoX2NudCA8IHNpemUpIHsKKwkJCWNoX2hbY2hfY250XSA9IHJ4LT5jaF9oOworCQkJY2hfY250Kys7CisJCQlwcl9kZWJ1ZygibGlzdCBjaC0+Y2hfaCAlZCBjaC0+c3BoICVkXG4iLAorCQkJCSByeC0+Y2hfaCwgcngtPnNwaCk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBhbGxvY2F0ZWQgY2hhbm5lbCBudW1iZXIgJXUgaXMgb3V0IG9mIG1heCByYW5nYWUgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGNoX2NudCwKKwkJCSAgICAgICBzaXplKTsKKwkJCXJldCA9IEVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXByX2RlYnVnKCIlczogY2hfY250WyVkXSByYXRlPSVkIFdBVEVSX01BUktfVkFMICVkXG4iLAorCQkgX19mdW5jX18sIGNoX2NudCwgcmF0ZSwgV0FURVJfTUFSS19WQUwpOworCS8qIHNsaW1fZGVmaW5lX2NoIGFwaSAqLworCXByb3AucHJvdCA9IFNMSU1fQVVUT19JU087CisJaWYgKChyYXRlID09IDQ0MTAwKSB8fCAocmF0ZSA9PSA4ODIwMCkgfHwgKHJhdGUgPT0gMTc2NDAwKSB8fAorCSAgICAocmF0ZSA9PSAzNTI4MDApKSB7CisJCXByb3AuYmFzZXIgPSBTTElNX1JBVEVfMTEwMjVIWjsKKwkJcHJvcC5yYXRlbSA9IChyYXRlLzExMDI1KTsKKwl9IGVsc2UgeworCQlwcm9wLmJhc2VyID0gU0xJTV9SQVRFXzQwMDBIWjsKKwkJcHJvcC5yYXRlbSA9IChyYXRlLzQwMDApOworCX0KKwlwcm9wLmRhdGFmID0gU0xJTV9DSF9EQVRBRl9OT1RfREVGSU5FRDsKKwlwcm9wLmF1eGYgPSBTTElNX0NIX0FVWEZfTk9UX0FQUExJQ0FCTEU7CisJcHJvcC5zYW1wbGVzemJpdHMgPSBiaXRfd2lkdGg7CisKKwlwcl9kZWJ1ZygiQmVmb3JlIHNsaW1fZGVmaW5lX2NoOlxuIgorCQkgImNoX2NudCAlZCxjaF9oWzBdICVkIGNoX2hbMV0gJWQsIGdycGggJWRcbiIsCisJCSBjaF9jbnQsIGNoX2hbMF0sIGNoX2hbMV0sICpncnBoKTsKKwlyZXQgPSBzbGltX2RlZmluZV9jaCh3Y2Q5eHh4LT5zbGltLCAmcHJvcCwgY2hfaCwgY2hfY250LAorCQkJICAgICB0cnVlLCBncnBoKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBzbGltX2RlZmluZV9jaCBmYWlsZWQgcmV0WyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCB3Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJY29kZWNfcG9ydCA9IHJ4LT5wb3J0OworCQlwcl9kZWJ1ZygiJXM6IGNvZGVjX3BvcnQgJWQgcnggMHglcCwgcGF5bG9hZCAlZFxuIgorCQkJICJzaF9jaC5yeF9wb3J0X2NoX3JlZ19iYXNlMCAweCV4XG4iCisJCQkgInNoX2NoLnBvcnRfcnhfY2ZnX3JlZ19iYXNlIDB4JXhcbiIsCisJCQkgX19mdW5jX18sIGNvZGVjX3BvcnQsIHJ4LCBwYXlsb2FkLAorCQkJIHNoX2NoLnJ4X3BvcnRfY2hfcmVnX2Jhc2UsCisJCQlzaF9jaC5wb3J0X3J4X2NmZ19yZWdfYmFzZSk7CisKKwkJLyogbG9vayBmb3IgdGhlIHZhbGlkIHBvcnQgcmFuZ2UgYW5kIGNob3NlIHRoZQorCQkgKiBwYXlsb2FkIGFjY29yZGluZ2x5CisJCSAqLworCQkvKiB3cml0ZSB0byBpbnRlcmZhY2UgZGV2aWNlICovCisJCXJldCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAorCQkJCVNCX1BHRF9SWF9QT1JUX01VTFRJX0NIQU5ORUxfMCgKKwkJCQlzaF9jaC5yeF9wb3J0X2NoX3JlZ19iYXNlLCBjb2RlY19wb3J0KSwKKwkJCQlwYXlsb2FkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczpJbnRmLWRldiBmYWlsIHJlZ1slZF0gcGF5bG9hZFslZF0gcmV0WyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoCisJCQkJc2hfY2gucnhfcG9ydF9jaF9yZWdfYmFzZSwgY29kZWNfcG9ydCksCisJCQkJcGF5bG9hZCwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qIGNvbmZpZ3VyZSB0aGUgc2xhdmUgcG9ydCBmb3Igd2F0ZXIgbWFyayBhbmQgZW5hYmxlKi8KKwkJcmV0ID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHdjZDl4eHgsCisJCQkJU0JfUEdEX1BPUlRfQ0ZHX0JZVEVfQUREUigKKwkJCQlzaF9jaC5wb3J0X3J4X2NmZ19yZWdfYmFzZSwgY29kZWNfcG9ydCksCisJCQkJV0FURVJfTUFSS19WQUwpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczp3YXRlcm1hcmsgc2V0IGZhaWx1cmUgZm9yIHBvcnRbJWRdIHJldFslZF0iLAorCQkJCV9fZnVuY19fLCBjb2RlY19wb3J0LCByZXQpOworCQl9CisKKwkJcmV0ID0gc2xpbV9jb25uZWN0X3Npbmsod2NkOXh4eC0+c2xpbSwgJnJ4LT5zcGgsIDEsIHJ4LT5jaF9oKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHNsaW1fY29ubmVjdF9zaW5rIGZhaWxlZCByZXRbJWRdXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnJfY2xvc2Vfc2xpbV9zY2g7CisJCX0KKwl9CisJLyogc2xpbV9jb250cm9sX2NoICovCisJcmV0ID0gc2xpbV9jb250cm9sX2NoKHdjZDl4eHgtPnNsaW0sICpncnBoLCBTTElNX0NIX0FDVElWQVRFLAorCQkJICAgICAgdHJ1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogc2xpbV9jb250cm9sX2NoIGZhaWxlZCByZXRbJWRdXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2Nsb3NlX3NsaW1fc2NoOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2Nsb3NlX3NsaW1fc2NoOgorCS8qICByZWxlYXNlIGFsbCBhY3F1aXJlZCBoYW5kbGVzICovCisJd2NkOXh4eF9jbG9zZV9zbGltX3NjaF9yeCh3Y2Q5eHh4LCB3Y2Q5eHh4X2NoX2xpc3QsICpncnBoKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2NmZ19zbGltX3NjaF9yeCk7CisKKy8qIEVuYWJsZSBzbGltYnVzIHNsYXZlIGRldmljZSBmb3IgUlggcGF0aCAqLworaW50IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGJpdF93aWR0aCwKKwkJCSAgICB1MTYgKmdycGgpCit7CisJdTE2IGNoX2NudCA9IDA7CisJdTE2IHBheWxvYWQgPSAwOworCXUxNiBjaF9oW1NMSU1fTUFYX1RYX1BPUlRTXSA9IHswfTsKKwl1MTYgY29kZWNfcG9ydDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqdHg7CisJaW50IHNpemUgPSBBUlJBWV9TSVpFKGNoX2gpOworCisJc3RydWN0IHNsaW1fY2ggcHJvcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodHgsIHdjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQlwYXlsb2FkIHw9IDEgPDwgdHgtPnNoaWZ0OworCQlpZiAoY2hfY250IDwgc2l6ZSkgeworCQkJY2hfaFtjaF9jbnRdID0gdHgtPmNoX2g7CisJCQljaF9jbnQrKzsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IGFsbG9jYXRlZCBjaGFubmVsIG51bWJlciAldSBpcyBvdXQgb2YgbWF4IHJhbmdhZSAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hfY250LAorCQkJICAgICAgIHNpemUpOworCQkJcmV0ID0gRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKiBzbGltX2RlZmluZV9jaCBhcGkgKi8KKwlwcm9wLnByb3QgPSBTTElNX0FVVE9fSVNPOworCXByb3AuYmFzZXIgPSBTTElNX1JBVEVfNDAwMEhaOworCXByb3AuZGF0YWYgPSBTTElNX0NIX0RBVEFGX05PVF9ERUZJTkVEOworCXByb3AuYXV4ZiA9IFNMSU1fQ0hfQVVYRl9OT1RfQVBQTElDQUJMRTsKKwlwcm9wLnJhdGVtID0gKHJhdGUvNDAwMCk7CisJcHJvcC5zYW1wbGVzemJpdHMgPSBiaXRfd2lkdGg7CisJcmV0ID0gc2xpbV9kZWZpbmVfY2god2NkOXh4eC0+c2xpbSwgJnByb3AsIGNoX2gsIGNoX2NudCwKKwkJCSAgICAgdHJ1ZSwgZ3JwaCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogc2xpbV9kZWZpbmVfY2ggZmFpbGVkIHJldFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcHJfZGVidWcoIiVzOiBjaF9jbnRbJWRdIHJhdGVbJWRdIGJpdHdpZHRoWyV1XVxuIiwgX19mdW5jX18sIGNoX2NudCwKKwkJIHJhdGUsIGJpdF93aWR0aCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0eCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCWNvZGVjX3BvcnQgPSB0eC0+cG9ydDsKKwkJcHJfZGVidWcoIiVzOiBjb2RlY19wb3J0ICVkIHR4IDB4JXAsIHBheWxvYWQgMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywgY29kZWNfcG9ydCwgdHgsIHBheWxvYWQpOworCQkvKiB3cml0ZSB0byBpbnRlcmZhY2UgZGV2aWNlICovCisJCXJldCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAorCQkJCVNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMChjb2RlY19wb3J0KSwKKwkJCQlwYXlsb2FkICYgMHgwMEZGKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6SW50Zi1kZXYgZmFpbCByZWdbJWRdIHBheWxvYWRbJWRdIHJldFslZF1cbiIsCisJCQkJX19mdW5jX18sCisJCQkJU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8wKGNvZGVjX3BvcnQpLAorCQkJCXBheWxvYWQsIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBwb3J0cyA4LDkgKi8KKwkJcmV0ID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHdjZDl4eHgsCisJCQkJU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8xKGNvZGVjX3BvcnQpLAorCQkJCShwYXlsb2FkICYgMHhGRjAwKT4+OCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOkludGYtZGV2IGZhaWwgcmVnWyVkXSBwYXlsb2FkWyVkXSByZXRbJWRdXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCVNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMShjb2RlY19wb3J0KSwKKwkJCQlwYXlsb2FkLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogY29uZmlndXJlIHRoZSBzbGF2ZSBwb3J0IGZvciB3YXRlciBtYXJrIGFuZCBlbmFibGUqLworCQlyZXQgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUod2NkOXh4eCwKKwkJCQlTQl9QR0RfUE9SVF9DRkdfQllURV9BRERSKAorCQkJCXNoX2NoLnBvcnRfdHhfY2ZnX3JlZ19iYXNlLCBjb2RlY19wb3J0KSwKKwkJCQlXQVRFUl9NQVJLX1ZBTCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOndhdGVybWFyayBzZXQgZmFpbHVyZSBmb3IgcG9ydFslZF0gcmV0WyVkXSIsCisJCQkJX19mdW5jX18sIGNvZGVjX3BvcnQsIHJldCk7CisJCX0KKworCQlyZXQgPSBzbGltX2Nvbm5lY3Rfc3JjKHdjZDl4eHgtPnNsaW0sIHR4LT5zcGgsIHR4LT5jaF9oKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogc2xpbV9jb25uZWN0X3NyYyBmYWlsZWQgcmV0WyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCS8qIHNsaW1fY29udHJvbF9jaCAqLworCXJldCA9IHNsaW1fY29udHJvbF9jaCh3Y2Q5eHh4LT5zbGltLCAqZ3JwaCwgU0xJTV9DSF9BQ1RJVkFURSwKKwkJCSAgICAgIHRydWUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHNsaW1fY29udHJvbF9jaCBmYWlsZWQgcmV0WyVkXVxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJLyogcmVsZWFzZSBhbGwgYWNxdWlyZWQgaGFuZGxlcyAqLworCXdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfdHgod2NkOXh4eCwgd2NkOXh4eF9jaF9saXN0LCAqZ3JwaCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9jZmdfc2xpbV9zY2hfdHgpOworCitpbnQgd2NkOXh4eF9jbG9zZV9zbGltX3NjaF9yeChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwgdTE2IGdycGgpCit7CisJdTMyIHNwaFtTTElNX01BWF9SWF9QT1JUU10gPSB7MH07CisJaW50IGNoX2NudCA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHhfY2ggKnJ4OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KQorCQlzcGhbY2hfY250KytdID0gcngtPnNwaDsKKworCXByX2RlYnVnKCIlcyBjaF9jaHQgJWQsIHNwaFswXSAlZCBzcGhbMV0gJWRcbiIsIF9fZnVuY19fLCBjaF9jbnQsCisJCXNwaFswXSwgc3BoWzFdKTsKKworCS8qIHNsaW1fY29udHJvbF9jaCAoUkVNT1ZFKSAqLworCXByX2RlYnVnKCIlcyBiZWZvcmUgc2xpbV9jb250cm9sX2NoIGdycGggJWRcbiIsIF9fZnVuY19fLCBncnBoKTsKKwlyZXQgPSBzbGltX2NvbnRyb2xfY2god2NkOXh4eC0+c2xpbSwgZ3JwaCwgU0xJTV9DSF9SRU1PVkUsIHRydWUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHNsaW1fY29udHJvbF9jaCBmYWlsZWQgcmV0WyVkXVxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyOworCX0KK2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3J4KTsKKworaW50IHdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfdHgoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsCisJCQkgICAgICB1MTYgZ3JwaCkKK3sKKwl1MzIgc3BoW1NMSU1fTUFYX1RYX1BPUlRTXSA9IHswfTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2hfY250ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqdHg7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR4LCB3Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpCisJCXNwaFtjaF9jbnQrK10gPSB0eC0+c3BoOworCisJcHJfZGVidWcoIiVzIGNoX2NodCAlZCwgc3BoWzBdICVkIHNwaFsxXSAlZFxuIiwKKwkJX19mdW5jX18sIGNoX2NudCwgc3BoWzBdLCBzcGhbMV0pOworCS8qIHNsaW1fY29udHJvbF9jaCAoUkVNT1ZFKSAqLworCXJldCA9IHNsaW1fY29udHJvbF9jaCh3Y2Q5eHh4LT5zbGltLCBncnBoLCBTTElNX0NIX1JFTU9WRSwgdHJ1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogc2xpbV9jb250cm9sX2NoIGZhaWxlZCByZXRbJWRdXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyOworCX0KK2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KTsKKworaW50IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQodW5zaWduZWQgaW50IGNoX251bSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IChjaF9udW0gLSBCQVNFX0NIX05VTSk7CisJcHJfZGVidWcoIiVzOiBjaF9udW1bJWRdIHNsYXZlIHBvcnRbJWRdXG4iLCBfX2Z1bmNfXywgY2hfbnVtLCByZXQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yOi0gSW52YWxpZCBzbGF2ZSBwb3J0IGZvdW5kID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQpOworCitpbnQgd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqd2NkOXh4eF9jaF9saXN0LCB1MTYgZ3JwaCkKK3sKKwl1MzIgc3BoW1NMSU1fTUFYX1RYX1BPUlRTICsgU0xJTV9NQVhfUlhfUE9SVFNdID0gezB9OworCWludCBjaF9jbnQgPSAwOworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpzbGltX2NoOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbGltX2NoLCB3Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpCisJCXNwaFtjaF9jbnQrK10gPSBzbGltX2NoLT5zcGg7CisKKwkvKiBzbGltX2Rpc2Nvbm5lY3RfcG9ydCAqLworCXJldCA9IHNsaW1fZGlzY29ubmVjdF9wb3J0cyh3Y2Q5eHh4LT5zbGltLCBzcGgsIGNoX2NudCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogc2xpbV9kaXNjb25uZWN0X3BvcnRzIGZhaWxlZCByZXRbJWRdXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBtdXRleCBhY3F1aXJlZCAqLworaW50IHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbih1MzIgcG9ydF9pZCwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpjb2RlY19kYWlfbGlzdCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgJXVcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsCisJCWNvZGVjX2RhaV9saXN0LCBsaXN0KSB7CisJCXByX2RlYnVnKCIlczogY2gtPnBvcnQgJXVcbiIsIF9fZnVuY19fLCBjaC0+cG9ydCk7CisJCWlmIChjaC0+cG9ydCA9PSBwb3J0X2lkKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9yeF92cG9ydF92YWxpZGF0aW9uKTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG11dGV4IGFjcXVpcmVkICovCitpbnQgd2NkOXh4eF90eF92cG9ydF92YWxpZGF0aW9uKHUzMiB0YWJsZSwgdTMyIHBvcnRfaWQsCisJCQkJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmNvZGVjX2RhaSwKKwkJCQl1MzIgbnVtX2NvZGVjX2RhaXMpCit7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCWludCByZXQgPSAwOworCXUzMiBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHZ0YWJsZSA9IHRhYmxlOworCXUzMiBzaXplID0gc2l6ZW9mKHRhYmxlKSAqIEJJVFNfUEVSX0JZVEU7CisKKwlwcl9kZWJ1ZygiJXM6IHZ0YWJsZSAweCVseCBwb3J0X2lkICV1IHNpemUgJWRcbiIsIF9fZnVuY19fLAorCQkgdnRhYmxlLCBwb3J0X2lkLCBzaXplKTsKKwlmb3JfZWFjaF9zZXRfYml0KGluZGV4LCAmdnRhYmxlLCBzaXplKSB7CisJCWlmIChpbmRleCA8IG51bV9jb2RlY19kYWlzKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLAorCQkJCQkmY29kZWNfZGFpW2luZGV4XS53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCWxpc3QpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IGluZGV4ICV1IGNoLT5wb3J0ICV1IHZ0YWJsZSAweCVseFxuIiwKKwkJCQkJCV9fZnVuY19fLCBpbmRleCwgY2gtPnBvcnQsCisJCQkJCQl2dGFibGUpOworCQkJCWlmIChjaC0+cG9ydCA9PSBwb3J0X2lkKSB7CisJCQkJCXByX2VycigiJXM6IFRYJXUgaXMgdXNlZCBieSBBSUYldV9DQVAgTWl4ZXJcbiIsCisJCQkJCQkJX19mdW5jX18sIHBvcnRfaWQgKyAxLAorCQkJCQkJCShpbmRleCArIDEpLzIpOworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGluZGV4ICVkIG9mIGNvZGVjIGRhaSIsCisJCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF90eF92cG9ydF92YWxpZGF0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDl4eHgtdXRpbHMuYyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYyZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd2NkOXh4eC11dGlscy5jCkBAIC0wLDAgKzEsMTE5OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvcGRhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC11dGlscy5oPgorCisjZGVmaW5lIFJFR19CWVRFUyAyCisjZGVmaW5lIFZBTF9CWVRFUyAxCisvKgorICogUGFnZSBSZWdpc3RlciBBZGRyZXNzIHRoYXQgQVBQIFByb2MgdXNlcyB0bworICogYWNjZXNzIFdDRDkzMzUgQ29kZWMgcmVnaXN0ZXJzIGlzIGlkZW50aWZpZWQKKyAqIGFzIDB4MDAKKyAqLworI2RlZmluZSBQQUdFX1JFR19BRERSIDB4MDAKKworc3RhdGljIGVudW0gd2NkOXh4eF9pbnRmX3N0YXR1cyB3Y2Q5eHh4X2ludGYgPSAtMTsKKworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0YXZpbF9kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJxY29tLXdjZC1waW5jdHJsIiwKKwkJLm9mX2NvbXBhdGlibGUgPSAicWNvbSx3Y2QtcGluY3RybCIsCisJfSwKKwl7CisJCS5uYW1lID0gInRhdmlsX2NvZGVjIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0YXNoYV9kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgdG9tdG9tX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gInRvbXRvbV9jb2RlYyIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCXUzMiAqdmFsKQoreworCWludCByYyA9IDA7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgbmFtZSwgdmFsKTsKKwlpZiAocmMpCisJCWRldl9lcnIoZGV2LCAiJXM6IExvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAorCQkJX19mdW5jX18sIG5hbWUsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9kdF9wYXJzZV9taWNiaWFzX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyAqbWIpCit7CisJdTMyIHByb3BfdmFsOworCWludCByYzsKKworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMtbGRvaC12IiwgTlVMTCkpIHsKKwkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKKwkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXMtbGRvaC12IiwKKwkJCQkJCSAgJnByb3BfdmFsKTsKKwkJaWYgKCFyYykKKwkJCW1iLT5sZG9oX3YgID0gICh1OClwcm9wX3ZhbDsKKwl9CisKKwkvKiBNQjEgKi8KKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzLWNmaWx0MS1tdiIsCisJCQkgICAgIE5VTEwpKSB7CisJCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCisJCQkJCQkgICJxY29tLGNkYy1taWNiaWFzLWNmaWx0MS1tdiIsCisJCQkJCQkgICAmcHJvcF92YWwpOworCQlpZiAoIXJjKQorCQkJbWItPmNmaWx0MV9tdiA9IHByb3BfdmFsOworCisJCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCisJCQkJCQkicWNvbSxjZGMtbWljYmlhczEtY2ZpbHQtc2VsIiwKKwkJCQkJCSZwcm9wX3ZhbCk7CisJCWlmICghcmMpCisJCQltYi0+YmlhczFfY2ZpbHRfc2VsID0gKHU4KXByb3BfdmFsOworCisJfSBlbHNlIGlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMxLW12IiwKKwkJCQkgICAgTlVMTCkpIHsKKwkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKKwkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXMxLW12IiwKKwkJCQkJCSAgJnByb3BfdmFsKTsKKwkJaWYgKCFyYykKKwkJCW1iLT5taWNiMV9tdiA9IHByb3BfdmFsOworCX0gZWxzZSB7CisJCWRldl9pbmZvKGRldiwgIiVzOiBNaWNiaWFzMSBEVCBwcm9wZXJ0eSBub3QgZm91bmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJLyogTUIyICovCisJaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhcy1jZmlsdDItbXYiLAorCQkJICAgICBOVUxMKSkgeworCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAorCQkJCQkJICAicWNvbSxjZGMtbWljYmlhcy1jZmlsdDItbXYiLAorCQkJCQkJICAgJnByb3BfdmFsKTsKKwkJaWYgKCFyYykKKwkJCW1iLT5jZmlsdDJfbXYgPSBwcm9wX3ZhbDsKKworCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAorCQkJCQkJInFjb20sY2RjLW1pY2JpYXMyLWNmaWx0LXNlbCIsCisJCQkJCQkmcHJvcF92YWwpOworCQlpZiAoIXJjKQorCQkJbWItPmJpYXMyX2NmaWx0X3NlbCA9ICh1OClwcm9wX3ZhbDsKKworCX0gZWxzZSBpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzMi1tdiIsCisJCQkJICAgIE5VTEwpKSB7CisJCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCisJCQkJCQkgICJxY29tLGNkYy1taWNiaWFzMi1tdiIsCisJCQkJCQkgICZwcm9wX3ZhbCk7CisJCWlmICghcmMpCisJCQltYi0+bWljYjJfbXYgPSBwcm9wX3ZhbDsKKwl9IGVsc2UgeworCQlkZXZfaW5mbyhkZXYsICIlczogTWljYmlhczIgRFQgcHJvcGVydHkgbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCS8qIE1CMyAqLworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQzLW12IiwKKwkJCSAgICAgTlVMTCkpIHsKKwkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKKwkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQzLW12IiwKKwkJCQkJCSAgICZwcm9wX3ZhbCk7CisJCWlmICghcmMpCisJCQltYi0+Y2ZpbHQzX212ID0gcHJvcF92YWw7CisKKwkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKKwkJCQkJCSJxY29tLGNkYy1taWNiaWFzMy1jZmlsdC1zZWwiLAorCQkJCQkJJnByb3BfdmFsKTsKKwkJaWYgKCFyYykKKwkJCW1iLT5iaWFzM19jZmlsdF9zZWwgPSAodTgpcHJvcF92YWw7CisKKwl9IGVsc2UgaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhczMtbXYiLAorCQkJCSAgICBOVUxMKSkgeworCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAorCQkJCQkJICAicWNvbSxjZGMtbWljYmlhczMtbXYiLAorCQkJCQkJICAmcHJvcF92YWwpOworCQlpZiAoIXJjKQorCQkJbWItPm1pY2IzX212ID0gcHJvcF92YWw7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZGV2LCAiJXM6IE1pY2JpYXMzIERUIHByb3BlcnR5IG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwl9CisKKwkvKiBNQjQgKi8KKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzNC1jZmlsdC1zZWwiLAorCQkJICAgICBOVUxMKSkgeworCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAorCQkJCQkJInFjb20sY2RjLW1pY2JpYXM0LWNmaWx0LXNlbCIsCisJCQkJCQkmcHJvcF92YWwpOworCQlpZiAoIXJjKQorCQkJbWItPmJpYXM0X2NmaWx0X3NlbCA9ICh1OClwcm9wX3ZhbDsKKworCX0gZWxzZSBpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzNC1tdiIsCisJCQkJICAgIE5VTEwpKSB7CisJCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCisJCQkJCQkgICJxY29tLGNkYy1taWNiaWFzNC1tdiIsCisJCQkJCQkgICZwcm9wX3ZhbCk7CisJCWlmICghcmMpCisJCQltYi0+bWljYjRfbXYgPSBwcm9wX3ZhbDsKKwl9IGVsc2UgeworCQlkZXZfaW5mbyhkZXYsICIlczogTWljYmlhczQgRFQgcHJvcGVydHkgbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCW1iLT5iaWFzMV9jYXBfbW9kZSA9CisJICAgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzMS1leHQtY2FwIikgPworCSBNSUNCSUFTX0VYVF9CWVBfQ0FQIDogTUlDQklBU19OT19FWFRfQllQX0NBUCk7CisJbWItPmJpYXMyX2NhcF9tb2RlID0KKwkgICAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMyLWV4dC1jYXAiKSA/CisJICAgIE1JQ0JJQVNfRVhUX0JZUF9DQVAgOiBNSUNCSUFTX05PX0VYVF9CWVBfQ0FQKTsKKwltYi0+YmlhczNfY2FwX21vZGUgPQorCSAgIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhczMtZXh0LWNhcCIpID8KKwkgICAgTUlDQklBU19FWFRfQllQX0NBUCA6IE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVApOworCW1iLT5iaWFzNF9jYXBfbW9kZSA9CisJICAgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzNC1leHQtY2FwIikgPworCSAgICBNSUNCSUFTX0VYVF9CWVBfQ0FQIDogTUlDQklBU19OT19FWFRfQllQX0NBUCk7CisKKwltYi0+YmlhczJfaXNfaGVhZHNldF9vbmx5ID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkgICAgICAicWNvbSxjZGMtbWljYmlhczItaGVhZHNldC1vbmx5Iik7CisKKwkvKiBQcmludCBtaWNiaWFzIGluZm8gKi8KKwlkZXZfZGJnKGRldiwgIiVzOiBsZG9oX3YgICV1IGNmaWx0MV9tdiAldSBjZmlsdDJfbXYgJXUgY2ZpbHQzX212ICV1IiwKKwkJX19mdW5jX18sICh1MzIpbWItPmxkb2hfdiwgKHUzMiltYi0+Y2ZpbHQxX212LAorCQkodTMyKW1iLT5jZmlsdDJfbXYsICh1MzIpbWItPmNmaWx0M19tdik7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBtaWNiMV9tdiAldSBtaWNiMl9tdiAldSBtaWNiM19tdiAldSBtaWNiNF9tdiAldSIsCisJCV9fZnVuY19fLCBtYi0+bWljYjFfbXYsIG1iLT5taWNiMl9tdiwKKwkJbWItPm1pY2IzX212LCBtYi0+bWljYjRfbXYpOworCisJZGV2X2RiZyhkZXYsICIlczogYmlhczFfY2ZpbHRfc2VsICV1IGJpYXMyX2NmaWx0X3NlbCAldVxuIiwKKwkJX19mdW5jX18sICh1MzIpbWItPmJpYXMxX2NmaWx0X3NlbCwgKHUzMiltYi0+YmlhczJfY2ZpbHRfc2VsKTsKKworCWRldl9kYmcoZGV2LCAiJXM6IGJpYXMzX2NmaWx0X3NlbCAldSBiaWFzNF9jZmlsdF9zZWwgJXVcbiIsCisJCV9fZnVuY19fLCAodTMyKW1iLT5iaWFzM19jZmlsdF9zZWwsICh1MzIpbWItPmJpYXM0X2NmaWx0X3NlbCk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBiaWFzMV9leHRfY2FwICVkIGJpYXMyX2V4dF9jYXAgJWRcbiIsCisJCV9fZnVuY19fLCBtYi0+YmlhczFfY2FwX21vZGUsIG1iLT5iaWFzMl9jYXBfbW9kZSk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBiaWFzM19leHRfY2FwICVkIGJpYXM0X2V4dF9jYXAgJWRcbiIsCisJCV9fZnVuY19fLCBtYi0+YmlhczNfY2FwX21vZGUsIG1iLT5iaWFzNF9jYXBfbW9kZSk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBiaWFzMl9pc19oZWFkc2V0X29ubHkgJWRcbiIsCisJCV9fZnVuY19fLCBtYi0+YmlhczJfaXNfaGVhZHNldF9vbmx5KTsKK30KKworLyoKKyAqIHdjZDl4eHhfdmFsaWRhdGVfZG1pY19zYW1wbGVfcmF0ZToKKyAqCUdpdmVuIHRoZSBkbWljX3NhbXBsZV9yYXRlIGFuZCBtY2xrIHJhdGUsIHZhbGlkYXRlIHRoZQorICoJZG1pY19zYW1wbGVfcmF0ZS4gSWYgZG1pYyByYXRlIGlzIGZvdW5kIHRvIGJlIGludmFsaWQsCisgKglhc3NpZ24gdGhlIGRtaWMgcmF0ZSBhcyB1bmRlZmluZWQsIHNvIGluZGl2aWR1YWwgY29kZWMKKyAqCWRyaXZlcnMgY2FuIHVzZSB0aGVpciBvd24gZGVmYXVsdHMKKyAqIEBkZXY6IHRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBkbWljIGlzIHRvIGJlIGNvbmZpZ3VyZWQKKyAqIEBkbWljX3NhbXBsZV9yYXRlOiBUaGUgaW5wdXQgZG1pY19zYW1wbGVfcmF0ZQorICogQG1jbGtfcmF0ZTogVGhlIGlucHV0IGNvZGVjIG1jbGsgcmF0ZQorICogQGRtaWNfcmF0ZV90eXBlOiBTdHJpbmcgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgZG1pYyBzYW1wbGUKKyAqCQkgICAgcmF0ZSwgdXNlZCBmb3IgZGVidWcvZXJyb3IgbG9nZ2luZy4KKyAqLworc3RhdGljIHUzMiB3Y2Q5eHh4X3ZhbGlkYXRlX2RtaWNfc2FtcGxlX3JhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MzIgZG1pY19zYW1wbGVfcmF0ZSwgdTMyIG1jbGtfcmF0ZSwKKwkJY29uc3QgY2hhciAqZG1pY19yYXRlX3R5cGUpCit7CisJdTMyIGRpdl9mYWN0b3I7CisKKwlpZiAoZG1pY19zYW1wbGVfcmF0ZSA9PSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEIHx8CisJICAgIG1jbGtfcmF0ZSAlIGRtaWNfc2FtcGxlX3JhdGUgIT0gMCkKKwkJZ290byB1bmRlZmluZWRfcmF0ZTsKKworCWRpdl9mYWN0b3IgPSBtY2xrX3JhdGUgLyBkbWljX3NhbXBsZV9yYXRlOworCisJc3dpdGNoIChkaXZfZmFjdG9yKSB7CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA4OgorCWNhc2UgMTY6CisJCS8qIFZhbGlkIGRtaWMgRElWIGZhY3RvcnMgKi8KKwkJZGV2X2RiZyhkZXYsICIlczogRE1JQ19ESVYgPSAldSwgbWNsa19yYXRlID0gJXVcbiIsCisJCQlfX2Z1bmNfXywgZGl2X2ZhY3RvciwgbWNsa19yYXRlKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQkvKgorCQkgKiBESVYgNiBpcyB2YWxpZCBmb3IgYm90aCA5LjZNSHogYW5kIDEyLjI4OE1IegorCQkgKiBNQ0xLIG9uIFRhdmlsLiBPbGRlciBjb2RlY3Mgc3VwcG9ydCBESVY2IG9ubHkKKwkJICogZm9yIDEyLjI4OE1IeiBNQ0xLLgorCQkgKi8KKwkJaWYgKChtY2xrX3JhdGUgPT0gV0NEOVhYWF9NQ0xLX0NMS185UDZIWikgJiYKKwkJICAgIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm9mX25vZGUsCisJCQkJCSAgICAgInFjb20sdGF2aWwtc2xpbS1wZ2QiKSkpCisJCQlkZXZfZGJnKGRldiwgIiVzOiBETUlDX0RJViA9ICV1LCBtY2xrX3JhdGUgPSAldVxuIiwKKwkJCQlfX2Z1bmNfXywgZGl2X2ZhY3RvciwgbWNsa19yYXRlKTsKKwkJZWxzZSBpZiAobWNsa19yYXRlICE9IFdDRDlYWFhfTUNMS19DTEtfMTJQMjg4TUhaKQorCQkJZ290byB1bmRlZmluZWRfcmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQW55IG90aGVyIERJViBmYWN0b3IgaXMgaW52YWxpZCAqLworCQlnb3RvIHVuZGVmaW5lZF9yYXRlOworCX0KKworCXJldHVybiBkbWljX3NhbXBsZV9yYXRlOworCit1bmRlZmluZWRfcmF0ZToKKwlkZXZfaW5mbyhkZXYsICIlczogSW52YWxpZCAlcyA9ICVkLCBmb3IgbWNsayAlZFxuIiwKKwkJIF9fZnVuY19fLCBkbWljX3JhdGVfdHlwZSwgZG1pY19zYW1wbGVfcmF0ZSwgbWNsa19yYXRlKTsKKwlkbWljX3NhbXBsZV9yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRDsKKworCXJldHVybiBkbWljX3NhbXBsZV9yYXRlOworfQorCisvKgorICogd2NkOXh4eF9wb3B1bGF0ZV9kdF9kYXRhOgorICoJUGFyc2UgZGV2aWNlIHRyZWUgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGNvZGVjIGRldmljZQorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBwbGF0Zm9ybSBkYXRhIHJlc3VsdGluZyBmcm9tIHBhcnNpbmcKKyAqIGRldmljZSB0cmVlLgorICovCitzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqd2NkOXh4eF9wb3B1bGF0ZV9kdF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7CisJdTMyIGRtaWNfc2FtcGxlX3JhdGUgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEOworCXUzMiBtYWRfZG1pY19zYW1wbGVfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQ7CisJdTMyIGVjcHBfZG1pY19zYW1wbGVfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQ7CisJdTMyIGRtaWNfY2xrX2RyaXZlID0gV0NEOVhYWF9ETUlDX0NMS19EUklWRV9VTkRFRklORUQ7CisJdTMyIHByb3BfdmFsOworCWludCByYyA9IDA7CisKKwlpZiAoIWRldiB8fCAhZGV2LT5vZl9ub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X3BkYXRhKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBQYXJzZSBwb3dlciBzdXBwbGllcyAqLworCW1zbV9jZGNfZ2V0X3Bvd2VyX3N1cHBsaWVzKGRldiwgJnBkYXRhLT5yZWd1bGF0b3IsCisJCQkJICAgJnBkYXRhLT5udW1fc3VwcGxpZXMpOworCWlmICghcGRhdGEtPnJlZ3VsYXRvciB8fCAocGRhdGEtPm51bV9zdXBwbGllcyA8PSAwKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBubyBwb3dlciBzdXBwbGllcyBkZWZpbmVkIGZvciBjb2RlY1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBlcnJfcG93ZXJfc3VwOworCX0KKworCS8qIFBhcnNlIG1pY2JpYXMgaW5mbyAqLworCXdjZDl4eHhfZHRfcGFyc2VfbWljYmlhc19pbmZvKGRldiwgJnBkYXRhLT5taWNiaWFzKTsKKworCXBkYXRhLT53Y2RfcnN0X25wID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsCisJCQkJCSAgICAgInFjb20sd2NkLXJzdC1ncGlvLW5vZGUiLCAwKTsKKwlpZiAoIXBkYXRhLT53Y2RfcnN0X25wKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IExvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sd2NkLXJzdC1ncGlvLW5vZGUiLAorCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlnb3RvIGVycl9wYXJzZV9kdF9wcm9wOworCX0KKworCWlmICghKHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LCAicWNvbSxjZGMtbWNsay1jbGstcmF0ZSIsCisJCQkJCSAgICZwcm9wX3ZhbCkpKQorCQlwZGF0YS0+bWNsa19yYXRlID0gcHJvcF92YWw7CisKKwlpZiAocGRhdGEtPm1jbGtfcmF0ZSAhPSBXQ0Q5WFhYX01DTEtfQ0xLXzlQNkhaICYmCisJICAgIHBkYXRhLT5tY2xrX3JhdGUgIT0gV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopIHsKKwkJZGV2X2VycihkZXYsICIlczogSW52YWxpZCBtY2xrX3JhdGUgPSAldVxuIiwgX19mdW5jX18sCisJCQlwZGF0YS0+bWNsa19yYXRlKTsKKwkJZ290byBlcnJfcGFyc2VfZHRfcHJvcDsKKwl9CisKKwlpZiAoISh3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwgInFjb20sY2RjLWRtaWMtc2FtcGxlLXJhdGUiLAorCQkJCQkgICAmcHJvcF92YWwpKSkKKwkJZG1pY19zYW1wbGVfcmF0ZSA9IHByb3BfdmFsOworCisJcGRhdGEtPmRtaWNfc2FtcGxlX3JhdGUgPSB3Y2Q5eHh4X3ZhbGlkYXRlX2RtaWNfc2FtcGxlX3JhdGUoZGV2LAorCQkJCQkJCWRtaWNfc2FtcGxlX3JhdGUsCisJCQkJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQkJCQkiYXVkaW9fZG1pY19yYXRlIik7CisJaWYgKCEod2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsICJxY29tLGNkYy1tYWQtZG1pYy1yYXRlIiwKKwkJCQkJICAgJnByb3BfdmFsKSkpCisJCW1hZF9kbWljX3NhbXBsZV9yYXRlID0gcHJvcF92YWw7CisKKwlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPSB3Y2Q5eHh4X3ZhbGlkYXRlX2RtaWNfc2FtcGxlX3JhdGUoZGV2LAorCQkJCQkJCW1hZF9kbWljX3NhbXBsZV9yYXRlLAorCQkJCQkJCXBkYXRhLT5tY2xrX3JhdGUsCisJCQkJCQkJIm1hZF9kbWljX3JhdGUiKTsKKworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLWVjcHAtZG1pYy1yYXRlIiwgTlVMTCkpIHsKKwkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKKwkJCQkJCSAgInFjb20sY2RjLWVjcHAtZG1pYy1yYXRlIiwKKwkJCQkJCSAgJnByb3BfdmFsKTsKKwkJaWYgKCFyYykKKwkJCWVjcHBfZG1pY19zYW1wbGVfcmF0ZSA9IHByb3BfdmFsOworCX0KKworCXBkYXRhLT5lY3BwX2RtaWNfc2FtcGxlX3JhdGUgPSB3Y2Q5eHh4X3ZhbGlkYXRlX2RtaWNfc2FtcGxlX3JhdGUoZGV2LAorCQkJCQkJCWVjcHBfZG1pY19zYW1wbGVfcmF0ZSwKKwkJCQkJCQlwZGF0YS0+bWNsa19yYXRlLAorCQkJCQkJCSJlY3BwX2RtaWNfcmF0ZSIpOworCisJaWYgKCEob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLAorCQkJCSAgICJxY29tLGNkYy1kbWljLWNsay1kcnYtc3RyZW5ndGgiLAorCQkJCSAgICZwcm9wX3ZhbCkpKSB7CisJCWRtaWNfY2xrX2RyaXZlID0gcHJvcF92YWw7CisKKwkJaWYgKGRtaWNfY2xrX2RyaXZlICE9IDIgJiYgZG1pY19jbGtfZHJpdmUgIT0gNCAmJgorCQkgICAgZG1pY19jbGtfZHJpdmUgIT0gOCAmJiBkbWljX2Nsa19kcml2ZSAhPSAxNikKKwkJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBjZGMtZG1pYy1jbGstZHJ2LXN0cmVuZ3RoICVkXG4iLAorCQkJCWRtaWNfY2xrX2RyaXZlKTsKKwl9CisKKwlwZGF0YS0+ZG1pY19jbGtfZHJ2ID0gZG1pY19jbGtfZHJpdmU7CisKKwlyZXR1cm4gcGRhdGE7CisKK2Vycl9wYXJzZV9kdF9wcm9wOgorCWRldm1fa2ZyZWUoZGV2LCBwZGF0YS0+cmVndWxhdG9yKTsKKwlwZGF0YS0+cmVndWxhdG9yID0gTlVMTDsKKwlwZGF0YS0+bnVtX3N1cHBsaWVzID0gMDsKK2Vycl9wb3dlcl9zdXA6CisJZGV2bV9rZnJlZShkZXYsIHBkYXRhKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9wb3B1bGF0ZV9kdF9kYXRhKTsKKworc3RhdGljIGJvb2wgaXNfd2NkOXh4eF9yZWdfcG93ZXJfZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdTE2IHJyZWcpCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24gKndjZDl4eHhfcHdyOworCisJaWYgKCF3Y2Q5eHh4KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IFdDRDlYWFhfTUFYX1BXUl9SRUdJT05TOyBpKyspIHsKKwkJd2NkOXh4eF9wd3IgPSB3Y2Q5eHh4LT53Y2Q5eHh4X3B3cltpXTsKKwkJaWYgKCF3Y2Q5eHh4X3B3cikKKwkJCWNvbnRpbnVlOworCQlpZiAoKCh3Y2Q5eHh4X3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19taW4gPT0gMCkgJiYKKwkJICAgICAod2NkOXh4eF9wd3ItPnB3cl9jb2xsYXBzZV9yZWdfbWF4ID09IDApKSB8fAorCQkgICAgKHdjZDl4eHhfcHdyLT5wb3dlcl9zdGF0ZSA9PQorCQkgICAgIFdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfUkVNT1ZFKSkKKwkJCXJldCA9IGZhbHNlOworCQllbHNlIGlmICgoKHdjZDl4eHhfcHdyLT5wb3dlcl9zdGF0ZSA9PQorCQkJICAgV0NEX1JFR0lPTl9QT1dFUl9ET1dOKSB8fAorCQkJICAod2NkOXh4eF9wd3ItPnBvd2VyX3N0YXRlID09CisJCQkgICBXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX0JFR0lOKSkgJiYKKwkJCSAocnJlZyA+PSB3Y2Q5eHh4X3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19taW4pICYmCisJCQkgKHJyZWcgPD0gd2NkOXh4eF9wd3ItPnB3cl9jb2xsYXBzZV9yZWdfbWF4KSkKKwkJCXJldCA9IHRydWU7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2Q5eHh4X3BhZ2Vfd3JpdGU6CisgKglSZXRyaWV2ZSBwYWdlIG51bWJlciBmcm9tIHJlZ2lzdGVyIGFuZAorICoJd3JpdGUgdGhhdCBwYWdlIG51bWJlciB0byB0aGUgcGFnZSBhZGRyZXNzLgorICoJQ2FsbGVkIHVuZGVyIGlvX2xvY2sgYWNxdWlzaXRpb24uCisgKgorICogQHdjZDl4eHg6IHBvaW50ZXIgdG8gd2NkOXh4eAorICogQHJlZzogUmVnaXN0ZXIgYWRkcmVzcyBmcm9tIHdoaWNoIHBhZ2UgbnVtYmVyIGlzIHJldHJpZXZlZAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZS4KKyAqLworaW50IHdjZDl4eHhfcGFnZV93cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgKnJlZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBjX3JlZywgcmVnX2FkZHI7CisJdTggcGdfbnVtLCBwcmV2X3BnX251bTsKKworCWlmICh3Y2Q5eHh4LT50eXBlICE9IFdDRDkzMzUgJiYgd2NkOXh4eC0+dHlwZSAhPSBXQ0Q5MzRYKQorCQlyZXR1cm4gcmV0OworCisJY19yZWcgPSAqcmVnOworCXBnX251bSA9IGNfcmVnID4+IDg7CisJcmVnX2FkZHIgPSBjX3JlZyAmIDB4ZmY7CisJaWYgKHdjZDl4eHgtPnByZXZfcGdfdmFsaWQpIHsKKwkJcHJldl9wZ19udW0gPSB3Y2Q5eHh4LT5wcmV2X3BnOworCQlpZiAocHJldl9wZ19udW0gIT0gcGdfbnVtKSB7CisJCQlyZXQgPSB3Y2Q5eHh4LT53cml0ZV9kZXYoCisJCQkJCXdjZDl4eHgsIFBBR0VfUkVHX0FERFIsIDEsCisJCQkJCSh2b2lkICopICZwZ19udW0sIGZhbHNlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXByX2VycigicGFnZSB3cml0ZSBlcnJvciwgcGdfbnVtOiAweCV4XG4iLAorCQkJCQlwZ19udW0pOworCQkJZWxzZSB7CisJCQkJd2NkOXh4eC0+cHJldl9wZyA9IHBnX251bTsKKwkJCQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiBQYWdlIDB4JXggV3JpdGUgdG8gMHgwMFxuIiwKKwkJCQkJX19mdW5jX18sIHBnX251bSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSB3Y2Q5eHh4LT53cml0ZV9kZXYoCisJCQkJd2NkOXh4eCwgUEFHRV9SRUdfQUREUiwgMSwgKHZvaWQgKikgJnBnX251bSwKKwkJCQlmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCJwYWdlIHdyaXRlIGVycm9yLCBwZ19udW06IDB4JXhcbiIsIHBnX251bSk7CisJCWVsc2UgeworCQkJd2NkOXh4eC0+cHJldl9wZyA9IHBnX251bTsKKwkJCXdjZDl4eHgtPnByZXZfcGdfdmFsaWQgPSB0cnVlOworCQkJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogUGFnZSAweCV4IFdyaXRlIHRvIDB4MDBcbiIsCisJCQkJX19mdW5jX18sIHBnX251bSk7CisJCX0KKwl9CisJKnJlZyA9IHJlZ19hZGRyOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfcGFnZV93cml0ZSk7CisKK3N0YXRpYyBpbnQgcmVnbWFwX2J1c19yZWFkKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAorCQkJICAgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIHNob3J0IGNfcmVnLCBycmVnOworCWludCByZXQsIGk7CisKKwlpZiAoIXdjZDl4eHgpIHsKKwkJZGV2X2VycihkZXYsICIlczogd2NkOXh4eCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXJlZyB8fCAhdmFsKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHJlZyBvciB2YWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVnX3NpemUgIT0gUkVHX0JZVEVTKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHJlZ2lzdGVyIHNpemUgJXpkIGJ5dGVzLCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIHJlZ19zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisJY19yZWcgPSAqKHUxNiAqKXJlZzsKKwlycmVnID0gY19yZWc7CisKKwlpZiAoaXNfd2NkOXh4eF9yZWdfcG93ZXJfZG93bih3Y2Q5eHh4LCBycmVnKSkgeworCQlyZXQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgdmFsX3NpemU7IGkrKykKKwkJCSgodTggKil2YWwpW2ldID0gMDsKKwkJZ290byBlcnI7CisJfQorCXJldCA9IHdjZDl4eHhfcGFnZV93cml0ZSh3Y2Q5eHh4LCAmY19yZWcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCXJldCA9IHdjZDl4eHgtPnJlYWRfZGV2KHdjZDl4eHgsIGNfcmVnLCB2YWxfc2l6ZSwgdmFsLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIHJlYWQgZmFpbGVkICglZCksIHJlZzogMHgleCwgc2l6ZTolemRcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBycmVnLCB2YWxfc2l6ZSk7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCB2YWxfc2l6ZTsgaSsrKQorCQkJZGV2X2RiZyhkZXYsICIlczogUmVhZCAweCUwMnggZnJvbSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCAoKHU4ICopdmFsKVtpXSwgcnJlZyArIGkpOworCX0KK2VycjoKKwltdXRleF91bmxvY2soJndjZDl4eHgtPmlvX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWdtYXBfYnVzX2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAorCQkJCSAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAorCQkJCSAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBjX3JlZywgcnJlZzsKKwlpbnQgcmV0LCBpOworCisJaWYgKCF3Y2Q5eHh4KSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFyZWcgfHwgIXZhbCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiByZWcgb3IgdmFsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZWdfc2l6ZSAhPSBSRUdfQllURVMpIHsKKwkJZGV2X2VycihkZXYsICIlczogcmVnaXN0ZXIgc2l6ZSAlemQgYnl0ZXMsIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgcmVnX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisJY19yZWcgPSAqKHUxNiAqKXJlZzsKKwlycmVnID0gY19yZWc7CisKKwlpZiAoaXNfd2NkOXh4eF9yZWdfcG93ZXJfZG93bih3Y2Q5eHh4LCBycmVnKSkgeworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gd2NkOXh4eF9wYWdlX3dyaXRlKHdjZDl4eHgsICZjX3JlZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmFsX3NpemU7IGkrKykKKwkJZGV2X2RiZyhkZXYsICJXcml0ZSAlMDJ4IHRvIDB4JXhcbiIsICgodTggKil2YWwpW2ldLAorCQkJcnJlZyArIGkpOworCisJcmV0ID0gd2NkOXh4eC0+d3JpdGVfZGV2KHdjZDl4eHgsIGNfcmVnLCB2YWxfc2l6ZSwgKHZvaWQgKikgdmFsLAorCQkJCSBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIHdyaXRlIGZhaWxlZCAoJWQpLCByZWc6MHgleCwgc2l6ZTolemRcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBycmVnLCB2YWxfc2l6ZSk7CisKK2VycjoKKwltdXRleF91bmxvY2soJndjZDl4eHgtPmlvX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVnbWFwX2J1c193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCF3Y2Q5eHh4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVdBUk5fT04oY291bnQgPCBSRUdfQllURVMpOworCisJaWYgKGNvdW50ID4gKFJFR19CWVRFUyArIFZBTF9CWVRFUykpIHsKKwkJaWYgKHdjZDl4eHgtPm11bHRpX3JlZ193cml0ZSkKKwkJCXJldHVybiB3Y2Q5eHh4LT5tdWx0aV9yZWdfd3JpdGUod2NkOXh4eCwKKwkJCQkJCQlkYXRhLCBjb3VudCk7CisJfSBlbHNlCisJCXJldHVybiByZWdtYXBfYnVzX2dhdGhlcl93cml0ZShjb250ZXh0LCBkYXRhLCBSRUdfQllURVMsCisJCQkJCSAgICAgICBkYXRhICsgUkVHX0JZVEVTLAorCQkJCQkgICAgICAgY291bnQgLSBSRUdfQllURVMpOworCisJZGV2X2VycihkZXYsICIlczogYnVzIG11bHRpIHJlZyB3cml0ZSBmYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHJlZ21hcF9idXNfY29uZmlnID0geworCS53cml0ZSA9IHJlZ21hcF9idXNfd3JpdGUsCisJLmdhdGhlcl93cml0ZSA9IHJlZ21hcF9idXNfZ2F0aGVyX3dyaXRlLAorCS5yZWFkID0gcmVnbWFwX2J1c19yZWFkLAorCS5yZWdfZm9ybWF0X2VuZGlhbl9kZWZhdWx0ID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCisJLnZhbF9mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKK307CisKKy8qCisgKiB3Y2Q5eHh4X3JlZ21hcF9pbml0OgorICoJSW5pdGlhbGl6ZSB3Y2Q5eHh4IHJlZ2lzdGVyIG1hcAorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQorICogQGNvbmZpZzogcG9pbnRlciB0byByZWdpc3RlciBtYXAgY29uZmlnCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIHJlZ21hcCBzdHJ1Y3R1cmUgZm9yIHN1Y2Nlc3MKKyAqIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdHJ1Y3QgcmVnbWFwICp3Y2Q5eHh4X3JlZ21hcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQoreworCXJldHVybiBkZXZtX3JlZ21hcF9pbml0KGRldiwgJnJlZ21hcF9idXNfY29uZmlnLCBkZXYsIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfcmVnbWFwX2luaXQpOworCisvKgorICogd2NkOXh4eF9yZXNldDoKKyAqCVJlc2V0IHdjZDl4eHggY29kZWMKKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIHdjZCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCWludCByYzsKKwlpbnQgdmFsdWU7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCF3Y2Q5eHh4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghd2NkOXh4eC0+d2NkX3JzdF9ucCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiByZXNldCBncGlvIGRldmljZSBub2RlIG5vdCBzcGVjaWZpZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhbHVlID0gbXNtX2NkY19nZXRfZ3Bpb19zdGF0ZSh3Y2Q5eHh4LT53Y2RfcnN0X25wKTsKKwlpZiAodmFsdWUgPiAwKSB7CisJCXdjZDl4eHgtPmF2b2lkX2NkY19yc3Rsb3cgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUod2NkOXh4eC0+d2NkX3JzdF9ucCk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHdjZCBzbGVlcCBzdGF0ZSByZXF1ZXN0IGZhaWwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogMjBtcyBzbGVlcCByZXF1aXJlZCBhZnRlciBwdWxsaW5nIHRoZSByZXNldCBncGlvIHRvIExPVyAqLworCW1zbGVlcCgyMCk7CisKKwlyYyA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHdjZDl4eHgtPndjZF9yc3RfbnApOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIiVzOiB3Y2QgYWN0aXZlIHN0YXRlIHJlcXVlc3QgZmFpbCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisJbXNsZWVwKDIwKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9yZXNldCk7CisKKy8qCisgKiB3Y2Q5eHh4X3Jlc2V0X2xvdzoKKyAqCVB1bGwgdGhlIHdjZDl4eHggY29kZWMgcmVzZXRfbiB0byBsb3cKKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIHdjZCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfcmVzZXRfbG93KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKwlpbnQgcmM7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKCF3Y2Q5eHh4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghd2NkOXh4eC0+d2NkX3JzdF9ucCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiByZXNldCBncGlvIGRldmljZSBub2RlIG5vdCBzcGVjaWZpZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAod2NkOXh4eC0+YXZvaWRfY2RjX3JzdGxvdykgeworCQl3Y2Q5eHh4LT5hdm9pZF9jZGNfcnN0bG93ID0gMDsKKwkJZGV2X2RiZyhkZXYsICIlczogYXZvaWQgcHVsbCBkb3duIG9mIHJlc2V0IEdQSU9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKHdjZDl4eHgtPndjZF9yc3RfbnApOworCWlmIChyYykKKwkJZGV2X2VycihkZXYsICIlczogd2NkIHNsZWVwIHN0YXRlIHJlcXVlc3QgZmFpbCFcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfcmVzZXRfbG93KTsKKworLyoKKyAqIHdjZDl4eHhfYnJpbmd1cDoKKyAqCVRvZ2dsZSByZXNldCBhbmFsb2cgYW5kIGRpZ2l0YWwgY29yZXMgb2Ygd2NkOXh4eCBjb2RlYworICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgd2NkOXh4eF9icmluZ3VwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKwlpbnQgcmM7CisJY29kZWNfYnJpbmd1cF9mbiBjZGNfYnVwX2ZuOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICghd2NkOXh4eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGNfYnVwX2ZuID0gd2NkOXh4eF9icmluZ3VwX2ZuKHdjZDl4eHgtPnR5cGUpOworCWlmICghY2RjX2J1cF9mbikgeworCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyBicmluZ3VwIGZuIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmMgPSBjZGNfYnVwX2ZuKHdjZDl4eHgpOworCWlmIChyYykKKwkJZGV2X2VycihkZXYsICIlczogQ29kZWMgYnJpbmd1cCBlcnJvciwgcmM6ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9icmluZ3VwKTsKKworLyoKKyAqIHdjZDl4eHhfYnJpbmd1cDoKKyAqCVNldCBhbmFsb2cgYW5kIGRpZ2l0YWwgY29yZXMgb2Ygd2NkOXh4eCBjb2RlYyBpbiByZXNldCBzdGF0ZQorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgd2NkOXh4eF9icmluZ2Rvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCWludCByYzsKKwljb2RlY19icmluZ2Rvd25fZm4gY2RjX2Jkb3duX2ZuOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICghd2NkOXh4eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGNfYmRvd25fZm4gPSB3Y2Q5eHh4X2JyaW5nZG93bl9mbih3Y2Q5eHh4LT50eXBlKTsKKwlpZiAoIWNkY19iZG93bl9mbikgeworCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyBicmluZyBkb3duIGZuIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmMgPSBjZGNfYmRvd25fZm4od2NkOXh4eCk7CisJaWYgKHJjKQorCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyBicmluZyBkb3duIGVycm9yLCByYzogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2JyaW5nZG93bik7CisKKy8qCisgKiB3Y2Q5eHh4X2dldF9jb2RlY19pbmZvOgorICoJRmlsbCBjb2RlYyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBsaWtlIGludGVycnVwdHMsIHZlcnNpb24KKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIHdjZCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfZ2V0X2NvZGVjX2luZm8oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCWludCByYzsKKwljb2RlY190eXBlX2ZuIGNkY190eXBlX2ZuOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKmNpbmZvOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmICghd2NkOXh4eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGNfdHlwZV9mbiA9IHdjZDl4eHhfZ2V0X2NvZGVjX2luZm9fZm4od2NkOXh4eC0+dHlwZSk7CisJaWYgKCFjZGNfdHlwZV9mbikgeworCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyBmaWxsIHR5cGUgZm4gTlVMTCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNpbmZvID0gd2NkOXh4eC0+Y29kZWNfdHlwZTsKKwlpZiAoIWNpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gY2RjX3R5cGVfZm4od2NkOXh4eCwgY2luZm8pOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyB0eXBlIGZpbGwgZmFpbGVkLCByYzolZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKworCX0KKworCXN3aXRjaCAod2NkOXh4eC0+dHlwZSkgeworCWNhc2UgV0NEOTM0WDoKKwkJY2luZm8tPmRldiA9IHRhdmlsX2RldnM7CisJCWNpbmZvLT5zaXplID0gQVJSQVlfU0laRSh0YXZpbF9kZXZzKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1OgorCQljaW5mby0+ZGV2ID0gdGFzaGFfZGV2czsKKwkJY2luZm8tPnNpemUgPSBBUlJBWV9TSVpFKHRhc2hhX2RldnMpOworCQlicmVhazsKKwljYXNlIFdDRDkzMzA6CisJCWNpbmZvLT5kZXYgPSB0b210b21fZGV2czsKKwkJY2luZm8tPnNpemUgPSBBUlJBWV9TSVpFKHRvbXRvbV9kZXZzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2luZm8tPmRldiA9IE5VTEw7CisJCWNpbmZvLT5zaXplID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2dldF9jb2RlY19pbmZvKTsKKworLyoKKyAqIHdjZDl4eHhfY29yZV9pcnFfaW5pdDoKKyAqCUluaXRpYWxpemUgd2NkOXh4eCBjb2RlYyBpcnEgaW5zdGFuY2UKKyAqCisgKiBAd2NkOXh4eF9jb3JlX3JlczogcG9pbnRlciB0byB3Y2QgY29yZSByZXNvdXJjZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgd2NkOXh4eF9jb3JlX2lycV9pbml0KAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXdjZDl4eHhfY29yZV9yZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdjZDl4eHhfY29yZV9yZXMtPmlycSAhPSAxKSB7CisJCXJldCA9IHdjZDl4eHhfaXJxX2luaXQod2NkOXh4eF9jb3JlX3Jlcyk7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIklSUSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfY29yZV9pcnFfaW5pdCk7CisKKy8qCisgKiB3Y2Q5eHh4X2Fzc2lnbl9pcnE6CisgKglBc3NpZ24gaXJxIGFuZCBpcnFfYmFzZSB0byB3Y2Q5eHh4IGNvcmUgcmVzb3VyY2UKKyAqCisgKiBAd2NkOXh4eF9jb3JlX3JlczogcG9pbnRlciB0byB3Y2QgY29yZSByZXNvdXJjZQorICogQGlycTogaXJxIG51bWJlcgorICogQGlycV9iYXNlOiBiYXNlIGlycSBudW1iZXIKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfYXNzaWduX2lycSgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzLAorCXVuc2lnbmVkIGludCBpcnEsCisJdW5zaWduZWQgaW50IGlycV9iYXNlKQoreworCWlmICghd2NkOXh4eF9jb3JlX3JlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3Y2Q5eHh4X2NvcmVfcmVzLT5pcnEgPSBpcnE7CisJd2NkOXh4eF9jb3JlX3Jlcy0+aXJxX2Jhc2UgPSBpcnFfYmFzZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2Fzc2lnbl9pcnEpOworCisvKgorICogd2NkOXh4eF9jb3JlX3Jlc19pbml0OgorICoJSW5pdGlhbGl6ZSB3Y2QgY29yZSByZXNvdXJjZSBpbnN0YW5jZQorICoKKyAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCisgKiBAbnVtX2lycXM6IG51bWJlciBvZiBpcnFzIGZvciB3Y2Q5eHh4IGNvcmUKKyAqIEBudW1faXJxX3JlZ3M6IG51bWJlciBvZiBpcnEgcmVnaXN0ZXJzCisgKiBAd2NkX3JlZ21hcDogcG9pbnRlciB0byB0aGUgd2NkIHJlZ2lzdGVyIG1hcAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgd2NkOXh4eF9jb3JlX3Jlc19pbml0KAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsCisJaW50IG51bV9pcnFzLCBpbnQgbnVtX2lycV9yZWdzLCBzdHJ1Y3QgcmVnbWFwICp3Y2RfcmVnbWFwKQoreworCWlmICghd2NkOXh4eF9jb3JlX3JlcyB8fCAhd2NkX3JlZ21hcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9pbml0KCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKKwl3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzID0gMDsKKwl3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndjZDl4eHhfY29yZV9yZXMtPnBtX3dxKTsKKwlwbV9xb3NfYWRkX3JlcXVlc3QoJndjZDl4eHhfY29yZV9yZXMtPnBtX3Fvc19yZXEsCisJCQkJUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisKKwl3Y2Q5eHh4X2NvcmVfcmVzLT5udW1faXJxcyA9IG51bV9pcnFzOworCXdjZDl4eHhfY29yZV9yZXMtPm51bV9pcnFfcmVncyA9IG51bV9pcnFfcmVnczsKKwl3Y2Q5eHh4X2NvcmVfcmVzLT53Y2RfY29yZV9yZWdtYXAgPSB3Y2RfcmVnbWFwOworCisJcHJfaW5mbygiJXM6IG51bV9pcnFzID0gJWQsIG51bV9pcnFfcmVncyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdjZDl4eHhfY29yZV9yZXMtPm51bV9pcnFzLAorCQkJd2NkOXh4eF9jb3JlX3Jlcy0+bnVtX2lycV9yZWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2NvcmVfcmVzX2luaXQpOworCisvKgorICogd2NkOXh4eF9jb3JlX3Jlc19kZWluaXQ6CisgKglEZWluaXQgd2NkIGNvcmUgcmVzb3VyY2UgaW5zdGFuY2UKKyAqCisgKiBAd2NkOXh4eF9jb3JlX3JlczogcG9pbnRlciB0byB3Y2QgY29yZSByZXNvdXJjZQorICovCit2b2lkIHdjZDl4eHhfY29yZV9yZXNfZGVpbml0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMpCit7CisJaWYgKCF3Y2Q5eHh4X2NvcmVfcmVzKQorCQlyZXR1cm47CisKKwlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJndjZDl4eHhfY29yZV9yZXMtPnBtX3Fvc19yZXEpOworCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2NvcmVfcmVzX2RlaW5pdCk7CisKKy8qCisgKiB3Y2Q5eHh4X3BtX2NtcHhjaGc6CisgKglDaGVjayBvbGQgc3RhdGUgYW5kIGV4Y2hhbmdlIHdpdGggcG0gbmV3IHN0YXRlCisgKglpZiBvbGQgc3RhdGUgbWF0Y2hlcyB3aXRoIGN1cnJlbnQgc3RhdGUKKyAqCisgKiBAd2NkOXh4eF9jb3JlX3JlczogcG9pbnRlciB0byB3Y2QgY29yZSByZXNvdXJjZQorICogQG86IHBtIG9sZCBzdGF0ZQorICogQG46IHBtIG5ldyBzdGF0ZQorICoKKyAqIFJldHVybnMgb2xkIHN0YXRlCisgKi8KK2VudW0gd2NkOXh4eF9wbV9zdGF0ZSB3Y2Q5eHh4X3BtX2NtcHhjaGcoCisJCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsCisJCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBvLAorCQllbnVtIHdjZDl4eHhfcG1fc3RhdGUgbikKK3sKKwllbnVtIHdjZDl4eHhfcG1fc3RhdGUgb2xkOworCisJaWYgKCF3Y2Q5eHh4X2NvcmVfcmVzKQorCQlyZXR1cm4gbzsKKworCW11dGV4X2xvY2soJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOworCW9sZCA9IHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlOworCWlmIChvbGQgPT0gbykKKwkJd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPSBuOworCW11dGV4X3VubG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7CisKKwlyZXR1cm4gb2xkOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3BtX2NtcHhjaGcpOworCisvKgorICogd2NkOXh4eF9jb3JlX3Jlc19zdXNwZW5kOgorICoJU3VzcGVuZCBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2NkOXh4eCBjb3JlCisgKgorICogQHdjZDl4eHhfY29yZV9yZXM6IHBvaW50ZXIgdG8gd2NkIGNvcmUgcmVzb3VyY2UKKyAqIEBwbV9tZXNzYWdlX3Q6IHBtIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZS9idXN5CisgKi8KK2ludCB3Y2Q5eHh4X2NvcmVfcmVzX3N1c3BlbmQoCisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKKwlwbV9tZXNzYWdlX3QgcG1lc2cpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJLyoKKwkgKiBwbV9xb3NfdXBkYXRlX3JlcXVlc3QoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoaXMgc3VzcGVuZCBjaGFpbiBjYWxsCisJICogc3RhcnRlZC4gdGh1cyBzdXNwZW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgbG9jayBpcyBiZWluZyBoZWxkCisJICovCisJbXV0ZXhfbG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7CisJaWYgKHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID09IFdDRDlYWFhfUE1fU0xFRVBBQkxFKSB7CisJCXByX2RlYnVnKCIlczogc3VzcGVuZGluZyBzeXN0ZW0sIHN0YXRlICVkLCB3bG9jayAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCisJCQkgd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJCXdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID0gV0NEOVhYWF9QTV9BU0xFRVA7CisJfSBlbHNlIGlmICh3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSB7CisJCS8qCisJCSAqIHVubG9jayB0byB3YWl0IGZvciBwbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX1NMRUVQQUJMRQorCQkgKiB0aGVuIHNldCB0byBXQ0Q5WFhYX1BNX0FTTEVFUAorCQkgKi8KKwkJcHJfZGVidWcoIiVzOiB3YWl0aW5nIHRvIHN1c3BlbmQgc3lzdGVtLCBzdGF0ZSAlZCwgd2xvY2sgJWRcbiIsCisJCQkgX19mdW5jX18sIHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlLAorCQkJIHdjZDl4eHhfY29yZV9yZXMtPndsb2NrX2hvbGRlcnMpOworCQltdXRleF91bmxvY2soJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOworCQlpZiAoISh3YWl0X2V2ZW50X3RpbWVvdXQod2NkOXh4eF9jb3JlX3Jlcy0+cG1fd3EsCisJCQkJCSB3Y2Q5eHh4X3BtX2NtcHhjaGcod2NkOXh4eF9jb3JlX3JlcywKKwkJCQkJCSAgV0NEOVhYWF9QTV9TTEVFUEFCTEUsCisJCQkJCQkgIFdDRDlYWFhfUE1fQVNMRUVQKSA9PQorCQkJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAorCQkJCQkgSFopKSkgeworCQkJcHJfZGVidWcoIiVzOiBzdXNwZW5kIGZhaWxlZCBzdGF0ZSAlZCwgd2xvY2sgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSwKKwkJCQkgd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IGRvbmUsIHN0YXRlICVkLCB3bG9jayAlZFxuIiwgX19mdW5jX18sCisJCQkJIHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlLAorCQkJCSB3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKKwkJfQorCQltdXRleF9sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKKwl9IGVsc2UgaWYgKHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID09IFdDRDlYWFhfUE1fQVNMRUVQKSB7CisJCXByX3dhcm4oIiVzOiBzeXN0ZW0gaXMgYWxyZWFkeSBzdXNwZW5kZWQsIHN0YXRlICVkLCB3bG9jayAlZG4iLAorCQkJX19mdW5jX18sIHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlLAorCQkJd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJfQorCW11dGV4X3VubG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2NvcmVfcmVzX3N1c3BlbmQpOworCisvKgorICogd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWU6CisgKglSZXN1bWUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdjZDl4eHggY29yZQorICoKKyAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUvYnVzeQorICovCitpbnQgd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUoCisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwltdXRleF9sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKKwlpZiAod2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9BU0xFRVApIHsKKwkJcHJfZGVidWcoIiVzOiByZXN1bWluZyBzeXN0ZW0sIHN0YXRlICVkLCB3bG9jayAlZFxuIiwgX19mdW5jX18sCisJCQkJd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCisJCQkJd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJCXdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID0gV0NEOVhYWF9QTV9TTEVFUEFCTEU7CisJfSBlbHNlIHsKKwkJcHJfd2FybigiJXM6IHN5c3RlbSBpcyBhbHJlYWR5IGF3YWtlLCBzdGF0ZSAlZCB3bG9jayAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCisJCQkJd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7CisJfQorCW11dGV4X3VubG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7CisJd2FrZV91cF9hbGwoJndjZDl4eHhfY29yZV9yZXMtPnBtX3dxKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfY29yZV9yZXNfcmVzdW1lKTsKKworLyoKKyAqIHdjZDl4eHhfZ2V0X2ludGZfdHlwZToKKyAqCUdldCBpbnRlcmZhY2UgdHlwZSBvZiB3Y2Q5eHh4IGNvcmUKKyAqCisgKiBSZXR1cm5zIGludGVyZmFjZSB0eXBlCisgKi8KK2VudW0gd2NkOXh4eF9pbnRmX3N0YXR1cyB3Y2Q5eHh4X2dldF9pbnRmX3R5cGUodm9pZCkKK3sKKwlyZXR1cm4gd2NkOXh4eF9pbnRmOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2dldF9pbnRmX3R5cGUpOworCisvKgorICogd2NkOXh4eF9zZXRfaW50Zl90eXBlOgorICoJU2V0IGludGVyZmFjZSB0eXBlIG9mIHdjZDl4eHggY29yZQorICoKKyAqLwordm9pZCB3Y2Q5eHh4X3NldF9pbnRmX3R5cGUoZW51bSB3Y2Q5eHh4X2ludGZfc3RhdHVzIGludGZfc3RhdHVzKQoreworCXdjZDl4eHhfaW50ZiA9IGludGZfc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NldF9pbnRmX3R5cGUpOworCisvKgorICogd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGU6IHNldCBwb3dlciBzdGF0ZSBmb3IgdGhlIHJlZ2lvbgorICogQHdjZDl4eHg6IGhhbmRsZSB0byB3Y2QgY29yZQorICogQHN0YXRlOiBwb3dlciBzdGF0ZSB0byBiZSBzZXQKKyAqIEByZWdpb246IHJlZ2lvbiBpbmRleAorICoKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgb3IgMCBmb3Igc3VjY2VzcworICovCitpbnQgd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkgICAgZW51bSBjb2RlY19wb3dlcl9zdGF0ZXMgc3RhdGUsCisJCQkgICAgZW51bSB3Y2RfcG93ZXJfcmVnaW9ucyByZWdpb24pCit7CisJaWYgKCF3Y2Q5eHh4KSB7CisJCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHJlZ2lvbiA8IDApIHx8IChyZWdpb24gPj0gV0NEOVhYWF9NQVhfUFdSX1JFR0lPTlMpKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHJlZ2lvbiBpbmRleCAlZCBvdXQgb2YgYm91bmRzXG4iLAorCQkJX19mdW5jX18sIHJlZ2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXdjZDl4eHgtPndjZDl4eHhfcHdyW3JlZ2lvbl0pIHsKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogbWVtb3J5IG5vdCBjcmVhdGVkIGZvciByZWdpb246ICVkXG4iLAorCQkJX19mdW5jX18sIHJlZ2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKKwl3Y2Q5eHh4LT53Y2Q5eHh4X3B3cltyZWdpb25dLT5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUpOworCisvKgorICogd2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZTogR2V0IHBvd2VyIHN0YXRlIG9mIHRoZSByZWdpb24KKyAqIEB3Y2Q5eHh4OiBoYW5kbGUgdG8gd2NkIGNvcmUKKyAqIEByZWdpb246IHJlZ2lvbiBpbmRleAorICoKKyAqIFJldHVybnMgY3VycmVudCBwb3dlciBzdGF0ZSBvZiB0aGUgcmVnaW9uIG9yIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworaW50IHdjZDl4eHhfZ2V0X2N1cnJlbnRfcG93ZXJfc3RhdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJICAgIGVudW0gd2NkX3Bvd2VyX3JlZ2lvbnMgcmVnaW9uKQoreworCWludCBzdGF0ZTsKKworCWlmICghd2NkOXh4eCkgeworCQlwcl9lcnIoIiVzOiB3Y2Q5eHh4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChyZWdpb24gPCAwKSB8fCAocmVnaW9uID49IFdDRDlYWFhfTUFYX1BXUl9SRUdJT05TKSkgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiByZWdpb24gaW5kZXggJWQgb3V0IG9mIGJvdW5kc1xuIiwKKwkJCV9fZnVuY19fLCByZWdpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCF3Y2Q5eHh4LT53Y2Q5eHh4X3B3cltyZWdpb25dKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IG1lbW9yeSBub3QgY3JlYXRlZCBmb3IgcmVnaW9uOiAlZFxuIiwKKwkJCV9fZnVuY19fLCByZWdpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKKwlzdGF0ZSA9IHdjZDl4eHgtPndjZDl4eHhfcHdyW3JlZ2lvbl0tPnBvd2VyX3N0YXRlOworCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7CisKKwlyZXR1cm4gc3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfZ2V0X2N1cnJlbnRfcG93ZXJfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCA0MDdjZjI5Li5mNTEzZWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtNzg2LDYgKzc4Niw3IEBACiBzb3VyY2UgImRyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL21laS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2Mvdm13X3ZtY2kvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9taXNjL3Fjb20vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL21pYy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvZ2Vud3FlL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9lY2hvL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKaW5kZXggNmMyZmRlNy4uN2VhMTdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpAQCAtNTQsNiArNTQsNyBAQAogb2JqLSQoQ09ORklHX0NYTF9CQVNFKQkJKz0gY3hsLwogb2JqLSQoQ09ORklHX1BBTkVMKSAgICAgICAgICAgICArPSBwYW5lbC5vCiBvYmotJChDT05GSUdfVUlEX0NQVVRJTUUpICs9IHVpZF9jcHV0aW1lLm8KK29iai15CQkJCSs9IHFjb20vCiBvYmotJChDT05GSUdfTUVNT1JZX1NUQVRFX1RJTUUpCSs9IG1lbW9yeV9zdGF0ZV90aW1lLm8KIAogbGtkdG0tJChDT05GSUdfTEtEVE0pCQkrPSBsa2R0bV9jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL0tjb25maWcgYi9kcml2ZXJzL21pc2MvcWNvbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9LY29uZmlnCkBAIC0wLDAgKzEsMjAgQEAKK2NvbmZpZyBNU01fUURTUDZWMl9DT0RFQ1MKKwlib29sICJBdWRpbyBRRFNQNlYyIEFQUiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTVNNX1NNRAorCXNlbGVjdCBTTkRfU09DX1FEU1A2VjIKKwloZWxwCisJICBFbmFibGUgQXVkaW8gY29kZWNzIHdpdGggQVBSIElQQyBwcm90b2NvbCBzdXBwb3J0IGJldHdlZW4KKwkgIGFwcGxpY2F0aW9uIHByb2Nlc3NvciBhbmQgUURTUDYgZm9yIEItZmFtaWx5LiBBUFIgaXMKKwkgIHVzZWQgYnkgYXVkaW8gZHJpdmVyIHRvIGNvbmZpZ3VyZSBRRFNQNidzCisJICBBU00sIEFETSBhbmQgQUZFLgorCitjb25maWcgTVNNX1VMVFJBU09VTkQKKwlib29sICJRRFNQNlYyIEhXIFVsdHJhc291bmQgc3VwcG9ydCIKKwlzZWxlY3QgU05EX1NPQ19RRFNQNlYyCisJaGVscAorCSAgRW5hYmxlIEhXIFVsdHJhc291bmQgc3VwcG9ydCBpbiBRRFNQNlYyLgorCSAgUURTUDZWMiBjYW4gc3VwcG9ydCBIVyBlbmNvZGVyICYgZGVjb2RlciBhbmQKKwkgIHVsdHJhc291bmQgcHJvY2Vzc2luZy4gSXQgd2lsbCBlbmFibGUKKwkgIHVsdHJhc291bmQgZGF0YSBwYXRocyBiZXR3ZWVuCisJICBIVyBhbmQgc2VydmljZXMsIGNhbGN1bGF0aW5nIGlucHV0IGV2ZW50cworCSAgdXBvbiB0aGUgdWx0cmFzb3VuZCBkYXRhLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvcWNvbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjBiZGRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLXkJCSs9IHFkc3A2djIvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGExMjNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK29iai0kKENPTkZJR19NU01fUURTUDZWMl9DT0RFQ1MpICs9IGFhY19pbi5vIHFjZWxwX2luLm8gZXZyY19pbi5vIGFtcm5iX2luLm8gZzcxMW1sYXdfaW4ubyBnNzExYWxhd19pbi5vIGF1ZGlvX3V0aWxzLm8KK29iai0kKENPTkZJR19NU01fUURTUDZWMl9DT0RFQ1MpICs9IGF1ZGlvX3dtYS5vIGF1ZGlvX3dtYXByby5vIGF1ZGlvX2FhYy5vIGF1ZGlvX211bHRpX2FhYy5vIGF1ZGlvX2FsYWMubyBhdWRpb19hcGUubyBhdWRpb191dGlsc19haW8ubworb2JqLSQoQ09ORklHX01TTV9RRFNQNlYyX0NPREVDUykgKz0gcTZhdWRpb192Mi5vIHE2YXVkaW9fdjJfYWlvLm8KK29iai0kKENPTkZJR19NU01fUURTUDZWMl9DT0RFQ1MpICs9IGF1ZGlvX2c3MTFtbGF3Lm8gYXVkaW9fZzcxMWFsYXcubworb2JqLSQoQ09ORklHX01TTV9RRFNQNlYyX0NPREVDUykgICs9IGF1ZGlvX21wMy5vIGF1ZGlvX2Ftcm5iLm8gYXVkaW9fYW1yd2IubyBhdWRpb19hbXJ3YnBsdXMubyBhdWRpb19ldnJjLm8gYXVkaW9fcWNlbHAubyBhbXJ3Yl9pbi5vIGF1ZGlvX2h3YWNjX2VmZmVjdHMubworb2JqLSQoQ09ORklHX01TTV9VTFRSQVNPVU5EKSArPSB1bHRyYXNvdW5kLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hYWNfaW4uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYWFjX2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxODc2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYWFjX2luLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FhYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlICJhdWRpb191dGlscy5oIgorCisKKy8qIEJ1ZmZlciB3aXRoIG1ldGEqLworI2RlZmluZSBQQ01fQlVGX1NJWkUJCSg0MDk2ICsgc2l6ZW9mKHN0cnVjdCBtZXRhX2luKSkKKworLyogTWF4aW11bSA1IGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCisjZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgxNTM2K3NpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkgKiA1KSkKKworI2RlZmluZSBBQUNfRk9STUFUX0FEVFMgNjU1MzUKKworc3RhdGljIGxvbmcgYWFjX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgY250ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICplbmNfY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7CisJCXVpbnQzMl90IGFhY19tb2RlID0gQUFDX0VOQ19NT0RFX0FBQ19MQzsKKworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCWFhY19jb25maWcgPSBhdWRpby0+Y29kZWNfY2ZnOworCQkvKiBFTkNPREUgQ0ZHIChhZnRlciBuZXcgc2V0IG9mIEFQSSdzIGFyZSBwdWJsaXNoZWQgKWJoYXJhdGgqLworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOworCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgeworCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhdWRpby0+b3BlbmVkKSB7CisJCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkJcHJfZGVidWcoIiVzOiBzdGFydGluZyBpbiBub25fdHVubmVsIG1vZGUiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLAorCQkJCQlGT1JNQVRfTVBFRzRfQUFDLCBGT1JNQVRfTElORUFSX1BDTSk7CisJCQkJaWYgKHJjIDwgMCkgeworCQkJCQlwcl9lcnIoIiVzOm9wZW4gcmVhZCB3cml0ZSBmYWlsZWRcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gVFVOTkVMX01PREUpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IHN0YXJ0aW5nIGluIHR1bm5lbCBtb2RlIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywKKwkJCQkJCQlGT1JNQVRfTVBFRzRfQUFDKTsKKworCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJcHJfZXJyKCIlczpvcGVuIHJlYWQgZmFpbGVkXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQl9CisKKwkJcHJfZGVidWcoIiVzOnNicl9wc19mbGFnID0gJWQsIHNicl9mbGFnID0gJWRcbiIsIF9fZnVuY19fLAorCQkJYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWcsIGFhY19jb25maWctPnNicl9vbl9mbGFnKTsKKwkJaWYgKGFhY19jb25maWctPnNicl9wc19vbl9mbGFnKQorCQkJYWFjX21vZGUgPSBBQUNfRU5DX01PREVfRUFBQ19QOworCQllbHNlIGlmIChhYWNfY29uZmlnLT5zYnJfb25fZmxhZykKKwkJCWFhY19tb2RlID0gQUFDX0VOQ19NT0RFX0FBQ19QOworCQllbHNlCisJCQlhYWNfbW9kZSA9IEFBQ19FTkNfTU9ERV9BQUNfTEM7CisKKwkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19hYWMoYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiwKKwkJCQkJZW5jX2NmZy0+c2FtcGxlX3JhdGUsCisJCQkJCWVuY19jZmctPmNoYW5uZWxzLAorCQkJCQllbmNfY2ZnLT5iaXRfcmF0ZSwKKwkJCQkJYWFjX21vZGUsCisJCQkJCWVuY19jZmctPnN0cmVhbV9mb3JtYXQpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBtZWRpYSBmb3JtYXQgYmxvY2siLAorCQkJCSJmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhdWRpby0+YWMsCisJCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIiwKKwkJCQkiZmFpbGVkXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIiwKKwkJCSJmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKKwkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IFJ4ZWQgQVVESU9fU1RPUFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJcmMgPSBhdWRpb19pbl9kaXNhYmxlKGF1ZGlvKTsKKwkJaWYgKHJjICA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RvcCBwcm9jZWR1cmUgZmFpbGVkIiwKKwkJCQkicmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICpjZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKmVuY19jZmc7CisKKwkJY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKilhcmc7CisJCWlmIChjZmcgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlciBmb3IgJXNcbiIsCisJCQlfX2Z1bmNfXywgIkFVRElPX0dFVF9BQUNfQ09ORklHIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQoY2ZnLCAwLCBzaXplb2YoKmNmZykpOworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCWlmIChlbmNfY2ZnLT5jaGFubmVscyA9PSBDSF9NT0RFX01PTk8pCisJCQljZmctPmNoYW5uZWxzID0gMTsKKwkJZWxzZQorCQkJY2ZnLT5jaGFubmVscyA9IDI7CisKKwkJY2ZnLT5zYW1wbGVfcmF0ZSA9IGVuY19jZmctPnNhbXBsZV9yYXRlOworCQljZmctPmJpdF9yYXRlID0gZW5jX2NmZy0+Yml0X3JhdGU7CisJCXN3aXRjaCAoZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCkgeworCQljYXNlIDB4MDA6CisJCQljZmctPnN0cmVhbV9mb3JtYXQgPSBBVURJT19BQUNfRk9STUFUX0FEVFM7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJY2ZnLT5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9MT0FTOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjoKKwkJCWNmZy0+c3RyZWFtX2Zvcm1hdCA9IEFVRElPX0FBQ19GT1JNQVRfQURJRjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDB4MDM6CisJCQljZmctPnN0cmVhbV9mb3JtYXQgPSBBVURJT19BQUNfRk9STUFUX1JBVzsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogR2V0LWFhYy1jZmc6IGZvcm1hdD0lZCBzcj0lZCIsCisJCQkiYml0cmF0ZT0lZFxuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCWNmZy0+c3RyZWFtX2Zvcm1hdCwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5iaXRfcmF0ZSk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICpjZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKmVuY19jZmc7CisJCXVpbnQzMl90IG1pbl9iaXRyYXRlLCBtYXhfYml0cmF0ZTsKKworCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyAqKWFyZzsKKwkJaWYgKGNmZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyIGZvciAlc1xuIiwKKwkJCSJBVURJT19TRVRfQUFDX0VOQ19DT05GSUciLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBTZXQtYWFjLWNmZzogc3RyZWFtPSVkXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLT5zdHJlYW1fZm9ybWF0KTsKKworCQlzd2l0Y2ggKGNmZy0+c3RyZWFtX2Zvcm1hdCkgeworCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfQURUUzoKKwkJCWVuY19jZmctPnN0cmVhbV9mb3JtYXQgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9MT0FTOgorCQkJZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCA9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19BQUNfRk9STUFUX0FESUY6CisJCQllbmNfY2ZnLT5zdHJlYW1fZm9ybWF0ID0gMHgwMjsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfUkFXOgorCQkJZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCA9IDB4MDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogdW5zdXBwb3J0ZWQgQUFDIGZvcm1hdCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCWNmZy0+c3RyZWFtX2Zvcm1hdCk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjZmctPmNoYW5uZWxzID09IDEpIHsKKwkJCWNmZy0+Y2hhbm5lbHMgPSBDSF9NT0RFX01PTk87CisJCX0gZWxzZSBpZiAoY2ZnLT5jaGFubmVscyA9PSAyKSB7CisJCQljZmctPmNoYW5uZWxzID0gQ0hfTU9ERV9TVEVSRU87CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCW1pbl9iaXRyYXRlID0gKChjZmctPnNhbXBsZV9yYXRlKSooY2ZnLT5jaGFubmVscykpLzI7CisJCS8qIFRoaXMgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGJhc2VkIG9uIEFBQyBtb2RlLiBCdXQgd2UgY2Fubm90CisJCSAqIGdldCBBQUMgbW9kZSBpbiB0aGlzIHNldGNvbmZpZy4gbWluX2JpdHJhdGUncyBsb2dpY2FsIG1heAorCQkgKiB2YWx1ZSBpcyAyNDAwMC4gU28gaWYgbWluX2JpdHJhdGUgaXMgaGlnaGVyIHRoYW4gMjQwMDAsCisJCSAqIGNob29zZSAyNDAwMC4KKwkJICovCisJCWlmIChtaW5fYml0cmF0ZSA+IDI0MDAwKQorCQkJbWluX2JpdHJhdGUgPSAyNDAwMDsKKwkJbWF4X2JpdHJhdGUgPSA2KihjZmctPnNhbXBsZV9yYXRlKSooY2ZnLT5jaGFubmVscyk7CisJCWlmIChtYXhfYml0cmF0ZSA+IDE5MjAwMCkKKwkJCW1heF9iaXRyYXRlID0gMTkyMDAwOworCQlpZiAoKGNmZy0+Yml0X3JhdGUgPCBtaW5fYml0cmF0ZSkgfHwKKwkJCShjZmctPmJpdF9yYXRlID4gbWF4X2JpdHJhdGUpKSB7CisJCQlwcl9lcnIoIiVzOiBiaXRyYXRlIHBlcm1pc3NpYmxlOiBtYXg9JWQsIG1pbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWF4X2JpdHJhdGUsIG1pbl9iaXRyYXRlKTsKKwkJCXByX2VycigiJXM6IEVSUk9SIGluIHNldHRpbmcgYml0cmF0ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBjZmctPmJpdF9yYXRlKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWVuY19jZmctPnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKKwkJZW5jX2NmZy0+Y2hhbm5lbHMgPSBjZmctPmNoYW5uZWxzOworCQllbmNfY2ZnLT5iaXRfcmF0ZSA9IGNmZy0+Yml0X3JhdGU7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBTZXQtYWFjLWNmZzpTUj0gMHgleCBjaD0weCV4IiwKKwkJCSJiaXRyYXRlPTB4JXgsIGZvcm1hdChhZHRzL3JhdykgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIGVuY19jZmctPnNhbXBsZV9yYXRlLAorCQkJZW5jX2NmZy0+Y2hhbm5lbHMsIGVuY19jZmctPmJpdF9yYXRlLAorCQkJZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BQUNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphdWRpb19hYWNfY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICplbmNfY2ZnOworCisJCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKKwkJYXVkaW9fYWFjX2NmZyA9IGF1ZGlvLT5jb2RlY19jZmc7CisJCWFhY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICopYXJnOworCisJCWlmIChhYWNfY2ZnID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXIgJXNcbiIsCisJCQkJX19mdW5jX18sICJBVURJT19TRVRfQUFDX0NPTkZJRyIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NFVF9BQUNfQ09ORklHOiBzYnJfZmxhZyA9ICVkIHNicl9wc19mbGFnID0gJWRcbiIsCisJCQkgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYWFjX2NmZy0+c2JyX29uX2ZsYWcsCisJCQkgYWFjX2NmZy0+c2JyX3BzX29uX2ZsYWcpOworCQlhdWRpb19hYWNfY2ZnLT5zYnJfb25fZmxhZyA9IGFhY19jZmctPnNicl9vbl9mbGFnOworCQlhdWRpb19hYWNfY2ZnLT5zYnJfcHNfb25fZmxhZyA9IGFhY19jZmctPnNicl9wc19vbl9mbGFnOworCQlpZiAoKGF1ZGlvX2FhY19jZmctPnNicl9vbl9mbGFnID09IDEpIHx8CisJCQkgKGF1ZGlvX2FhY19jZmctPnNicl9wc19vbl9mbGFnID09IDEpKSB7CisJCQlpZiAoZW5jX2NmZy0+c2FtcGxlX3JhdGUgPCAyNDAwMCkgeworCQkJCXByX2VycigiJXM6IEVSUk9SIGluIHNldHRpbmcgc2FtcGxlcmF0ZSA9ICVkIiwKKwkJCQkJIlxuIiwgX19mdW5jX18sIGVuY19jZmctPnNhbXBsZV9yYXRlKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGFhY19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOgorCWNhc2UgQVVESU9fU1RPUDogeworCQlyYyA9IGFhY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOworCisJCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmcpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6QVVESU9fR0VUX0FBQ19FTkNfQ09ORklHIGZhaWxlZC4gcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQUFDX0VOQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQUFDX0VOQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX0VOQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRyBmYWlsZWQuIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BQUNfQ09ORklHOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+Y29kZWNfY2ZnLAorCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BQUNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyBhYWNfY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjX2NmZywgKHZvaWQgKilhcmcsCisJCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19TRVRfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGFhY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmYWFjX2NmZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19DT05GSUcgZmFpbGVkLiByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQ9JWRcbiIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWczMiB7CisJdTMyIGNoYW5uZWxzOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgYml0X3JhdGU7CisJdTMyIHN0cmVhbV9mb3JtYXQ7Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiB7CisJczE2IGZvcm1hdDsKKwl1MTYgYXVkaW9fb2JqZWN0OworCXUxNiBlcF9jb25maWc7ICAgICAgIC8qIDAgfiAzIHVzZWZ1bCBvbmx5IG9iaiA9IEVSTEMgKi8KKwl1MTYgYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJdTE2IGFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwl1MTYgYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCXUxNiBzYnJfb25fZmxhZzsKKwl1MTYgc2JyX3BzX29uX2ZsYWc7CisJdTE2IGR1YWxfbW9ub19tb2RlOworCXUxNiBjaGFubmVsX2NvbmZpZ3VyYXRpb247CisJdTE2IHNhbXBsZV9yYXRlOworfTsKKworZW51bSB7CisJQVVESU9fU0VUX0FBQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiksCisJQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiksCisJQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZzMyKSwKKwlBVURJT19HRVRfQUFDX0VOQ19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzQpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnMzIpCit9OworCitzdGF0aWMgbG9uZyBhYWNfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgTlVMTCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIGNmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZzMyIGNmZ18zMjsKKworCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOworCisJCWNtZCA9IEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRzsKKwkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmNmZyk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczpBVURJT19HRVRfQUFDX0VOQ19DT05GSUdfMzIgZmFpbGVkLiBSYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWNmZ18zMi5jaGFubmVscyA9IGNmZy5jaGFubmVsczsKKwkJY2ZnXzMyLnNhbXBsZV9yYXRlID0gY2ZnLnNhbXBsZV9yYXRlOworCQljZmdfMzIuYml0X3JhdGUgPSBjZmcuYml0X3JhdGU7CisJCWNmZ18zMi5zdHJlYW1fZm9ybWF0ID0gY2ZnLnN0cmVhbV9mb3JtYXQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsIHNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQUFDX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQUFDX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyBjZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWczMiBjZmdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19HRVRfQUFDX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNmZy5jaGFubmVscyA9IGNmZ18zMi5jaGFubmVsczsKKwkJY2ZnLnNhbXBsZV9yYXRlID0gY2ZnXzMyLnNhbXBsZV9yYXRlOworCQljZmcuYml0X3JhdGUgPSBjZmdfMzIuYml0X3JhdGU7CisJCWNmZy5zdHJlYW1fZm9ybWF0ID0gY2ZnXzMyLnN0cmVhbV9mb3JtYXQ7CisJCS8qIFRoZSBjb21tYW5kIHNob3VsZCBiZSBjb252ZXJ0ZWQgZnJvbSAzMiBiaXQgdG8gbm9ybWFsCisJCSAqIGJlZm9yZSB0aGUgc2hhcmVkIGlvY3RsIGlzIGNhbGxlZCBhcyBzaGFyZWQgaW9jdGwKKwkJICogY2FuIHByb2Nlc3Mgb25seSBub3JtYWwgY29tbWFuZHMKKwkJICovCisJCWNtZCA9IEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRzsKKwkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmNmZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19FTkNfQ09ORklHXzMyIGZhaWxlZC4gcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FBQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiBhYWNfY29uZmlnXzMyOworCisJCWFhY19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJYWFjX2NvbmZpZ18zMi5mb3JtYXQgPSBhYWNfY29uZmlnLT5mb3JtYXQ7CisJCWFhY19jb25maWdfMzIuYXVkaW9fb2JqZWN0ID0gYWFjX2NvbmZpZy0+YXVkaW9fb2JqZWN0OworCQlhYWNfY29uZmlnXzMyLmVwX2NvbmZpZyA9IGFhY19jb25maWctPmVwX2NvbmZpZzsKKwkJYWFjX2NvbmZpZ18zMi5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY29uZmlnLT5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NvbmZpZ18zMi5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQorCQkJYWFjX2NvbmZpZy0+YWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnXzMyLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY29uZmlnLT5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jb25maWdfMzIuc2JyX29uX2ZsYWcgPSBhYWNfY29uZmlnLT5zYnJfb25fZmxhZzsKKwkJYWFjX2NvbmZpZ18zMi5zYnJfcHNfb25fZmxhZyA9IGFhY19jb25maWctPnNicl9wc19vbl9mbGFnOworCQlhYWNfY29uZmlnXzMyLmR1YWxfbW9ub19tb2RlID0gYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGU7CisJCWFhY19jb25maWdfMzIuY2hhbm5lbF9jb25maWd1cmF0aW9uID0KKwkJCQlhYWNfY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb247CisJCWFhY19jb25maWdfMzIuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWFjX2NvbmZpZ18zMiwKKwkJCQkgc2l6ZW9mKGFhY19jb25maWdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQUFDX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnIGFhY19jZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZzMyIGFhY19jZmdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWNfY2ZnXzMyLCAodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKGFhY19jZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BQUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlhYWNfY2ZnLmZvcm1hdCA9IGFhY19jZmdfMzIuZm9ybWF0OworCQlhYWNfY2ZnLmF1ZGlvX29iamVjdCA9IGFhY19jZmdfMzIuYXVkaW9fb2JqZWN0OworCQlhYWNfY2ZnLmVwX2NvbmZpZyA9IGFhY19jZmdfMzIuZXBfY29uZmlnOworCQlhYWNfY2ZnLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jZmdfMzIuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jZmcuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jZmdfMzIuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY2ZnLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY2ZnXzMyLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NmZy5zYnJfb25fZmxhZyA9IGFhY19jZmdfMzIuc2JyX29uX2ZsYWc7CisJCWFhY19jZmcuc2JyX3BzX29uX2ZsYWcgPSBhYWNfY2ZnXzMyLnNicl9wc19vbl9mbGFnOworCQlhYWNfY2ZnLmR1YWxfbW9ub19tb2RlID0gYWFjX2NmZ18zMi5kdWFsX21vbm9fbW9kZTsKKwkJYWFjX2NmZy5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPQorCQkJCWFhY19jZmdfMzIuY2hhbm5lbF9jb25maWd1cmF0aW9uOworCQlhYWNfY2ZnLnNhbXBsZV9yYXRlID0gYWFjX2NmZ18zMi5zYW1wbGVfcmF0ZTsKKworCQljbWQgPSBBVURJT19TRVRfQUFDX0NPTkZJRzsKKwkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmFhY19jZmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhYWNfaW5fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGFhY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICphdWRpbyA9IE5VTEw7CisJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7CisJaW50IHJjID0gMDsKKworCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jb2RlciBjb25maWcgcGFyYW0gKi8KKwlhdWRpby0+ZW5jX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcpLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChhdWRpby0+ZW5jX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChhdWRpby0+Y29kZWNfY2ZnID09IE5VTEwpIHsKKwkJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlhYWNfY29uZmlnID0gYXVkaW8tPmNvZGVjX2NmZzsKKworCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKKwltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKKwltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOworCisJLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRywKKwkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCisJICovCisJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUgPSBGUkFNRV9TSVpFOworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKKwlhdWRpby0+bWluX2ZyYW1lX3NpemUgPSAxNTM2OworCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSA1OworCWVuY19jZmctPnNhbXBsZV9yYXRlID0gODAwMDsKKwllbmNfY2ZnLT5jaGFubmVscyA9IDE7CisJZW5jX2NmZy0+Yml0X3JhdGUgPSAxNjAwMDsKKwllbmNfY2ZnLT5zdHJlYW1fZm9ybWF0ID0gMHgwMDsvKiAwOkFEVFMsIDM6UkFXICovCisJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgICA9IDB4MDE7CisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSAgPSBQQ01fQlVGX1NJWkU7CisJYWFjX2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTOworCWFhY19jb25maWctPmF1ZGlvX29iamVjdCA9IEFVRElPX0FBQ19PQkpFQ1RfTEM7CisJYWFjX2NvbmZpZy0+c2JyX29uX2ZsYWcgPSAwOworCWFhY19jb25maWctPnNicl9wc19vbl9mbGFnID0gMDsKKwlhYWNfY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPSAxOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpcTZhc21faW5fY2IsCisJCQkJCQkJKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciIsCisJCQkJImF1ZGlvIGNsaWVudFxuIiwgX19mdW5jX18pOworCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBvcGVuIGFhYyBlbmNvZGVyIGluIHR1bm5lbCBtb2RlICovCisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTVBFRzRfQUFDLAorCQkJCQkJRk9STUFUX0xJTkVBUl9QQ00pOworCisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgT3BlbiBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBOVCBtb2RlIGVuY29kZXIgc3VjY2Vzc1xuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsIEZPUk1BVF9NUEVHNF9BQUMpOworCisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVHVubmVsIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQkvKiByZWdpc3RlciBmb3IgdHggb3ZlcmZsb3cgKHZhbGlkIGZvciB0dW5uZWwgbW9kZSBvbmx5KSAqLworCQlyYyA9IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhhdWRpby0+YWMsIDB4MDEpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFRYIE92ZXJmbG93IHJlZ2lzdHJhdGlvbiIsCisJCQkJImZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7CisJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFVuZXhwZWN0ZWQgbW9kZVxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJcmMgPSAtRUFDQ0VTOworCQlnb3RvIGZhaWw7CisJfQorCWF1ZGlvLT5vcGVuZWQgPSAxOworCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOworCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7CisJYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7CisJYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBhYWNfaW5fY29tcGF0X2lvY3RsOworCWF1ZGlvLT5lbmNfaW9jdGwgPSBhYWNfaW5faW9jdGw7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87CisKKwlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gYWFjX2luX29wZW4sCisJLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAorCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCisJLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBhdWRpb19pbl9jb21wYXRfaW9jdGwKK307CisKK3N0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FhY19pbl9taXNjID0geworCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQk9ICJtc21fYWFjX2luIiwKKwkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWFjX2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYWFjX2luX21pc2MpOworfQorZGV2aWNlX2luaXRjYWxsKGFhY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYW1ybmJfaW4uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYW1ybmJfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY1MDlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hbXJuYl9pbi5jCkBAIC0wLDAgKzEsNDA1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgMjAxNCwgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbXJuYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlICJhdWRpb191dGlscy5oIgorCisvKiBCdWZmZXIgd2l0aCBtZXRhKi8KKyNkZWZpbmUgUENNX0JVRl9TSVpFCQkoNDA5NiArIHNpemVvZihzdHJ1Y3QgbWV0YV9pbikpCisKKy8qIE1heGltdW0gMTAgZnJhbWVzIGluIGJ1ZmZlciB3aXRoIG1ldGEgKi8KKyNkZWZpbmUgRlJBTUVfU0laRQkJKDEgKyAoKDMyK3NpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkgKiAxMCkpCisKK3N0YXRpYyBsb25nIGFtcm5iX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBjbnQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqZW5jX2NmZzsKKworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBkZWZhdWx0IGJ1ZiBhbGxvY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7CisJCWlmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSB7CisJCQlwcl9pbmZvKCIlczpBVURJT19TVEFSVCBhbHJlYWR5IG92ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9faW5fYnVmX2FsbG9jKGF1ZGlvKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlicmVhazsKKwkJfQorCisJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfYW1ybmIoYXVkaW8tPmFjLAorCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYsCisJCQllbmNfY2ZnLT5iYW5kX21vZGUsCisJCQllbmNfY2ZnLT5kdHhfZW5hYmxlKTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBhbXJuYiBtZWRpYSBmb3JtYXQgYmxvY2siLAorCQkJCSJmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhdWRpby0+YWMsCisJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IG1lZGlhIGZvcm1hdCBibG9jayIsCisJCQkJImZhaWxlZFxuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIGVuYWJsZVslZF1cbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQlhdWRpby0+ZW5hYmxlZCk7CisJCXJjID0gYXVkaW9faW5fZW5hYmxlKGF1ZGlvKTsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIiwKKwkJCQkJInJjPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCisJCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLworCQlyYyA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TVE9QOiB7CisJCXByX2RlYnVnKCIlczpBVURJT19TVE9QXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7CisJCWlmIChyYyAgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCIsCisJCQkJInJjPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgKmVuY19jZmc7CisKKwkJY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqKWFyZzsKKwkJaWYgKGNmZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyIGZvciAlc1xuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCSJBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCWlmIChjZmctPmJhbmRfbW9kZSA+IDggfHwKKwkJCSBjZmctPmJhbmRfbW9kZSA8IDEpIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBiYW5kIG1vZGVcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQkvKiBBTVIgTkIgZW5jb2RlciBhY2NlcHRzIHZhbHVlcyBiZXR3ZWVuIDAtNworCQkgKiB3aGlsZSBvcGVubWF4IHByb3ZpZGVzIHZhbHVlIGJldHdlZW4gMS04CisJCSAqIGFzIHBlciBzcGVjCisJCSAqLworCQllbmNfY2ZnLT5iYW5kX21vZGUgPSAoY2ZnLT5iYW5kX21vZGUgLSAxKTsKKwkJZW5jX2NmZy0+ZHR4X2VuYWJsZSA9IChjZmctPmR0eF9lbmFibGUgPyAxIDogMCk7CisJCWVuY19jZmctPmZyYW1lX2Zvcm1hdCA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBiYW5kX21vZGUgPSAweCV4IGR0eF9lbmFibGU9MHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCWVuY19jZmctPmJhbmRfbW9kZSwgZW5jX2NmZy0+ZHR4X2VuYWJsZSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhbXJuYl9pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6CisJY2FzZSBBVURJT19TVE9QOiB7CisJCXJjID0gIGFtcm5iX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIE5VTEwpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQU1STkJfRU5DX0NPTkZJR19WMjogeworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+ZW5jX2NmZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQU1STkJfRU5DX0NPTkZJR19WMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhbXJuYl9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmY2ZnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogQVVESU9fU0VUX0FNUk5CX0VOQ19DT05GSUdfVjIgZmFpbGVkLiByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQ9JWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjJfMzIgeworCXUzMiBiYW5kX21vZGU7CisJdTMyIGR0eF9lbmFibGU7CisJdTMyIGZyYW1lX2Zvcm1hdDsKK307CisKK2VudW0geworCUFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHX1YyXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzIpLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjJfMzIpLAorCUFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzMpLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjJfMzIpCit9OworCitzdGF0aWMgbG9uZyBhbXJuYl9pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOgorCWNhc2UgQVVESU9fU1RPUDogeworCQlyYyA9ICBhbXJuYl9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FNUk5CX0VOQ19DT05GSUdfVjJfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyICphbXJuYl9jb25maWc7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192Ml8zMiBhbXJuYl9jb25maWdfMzI7CisKKwkJbWVtc2V0KCZhbXJuYl9jb25maWdfMzIsIDAsIHNpemVvZihhbXJuYl9jb25maWdfMzIpKTsKKworCQlhbXJuYl9jb25maWcgPQorCQkoc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyICopYXVkaW8tPmVuY19jZmc7CisJCWFtcm5iX2NvbmZpZ18zMi5iYW5kX21vZGUgPSBhbXJuYl9jb25maWctPmJhbmRfbW9kZTsKKwkJYW1ybmJfY29uZmlnXzMyLmR0eF9lbmFibGUgPSBhbXJuYl9jb25maWctPmR0eF9lbmFibGU7CisJCWFtcm5iX2NvbmZpZ18zMi5mcmFtZV9mb3JtYXQgPSBhbXJuYl9jb25maWctPmZyYW1lX2Zvcm1hdDsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYW1ybmJfY29uZmlnXzMyLAorCQkJc2l6ZW9mKGFtcm5iX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHX1YyXzMyIGZhaWxlZCIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192Ml8zMiBjZmdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMl8zMiBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNtZCA9IEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyOworCQlyYyA9IGFtcm5iX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmdfMzIpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyIGZhaWxlZCByYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhbXJuYl9pbl9jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYW1ybmJfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOworCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqZW5jX2NmZzsKKwlpbnQgcmMgPSAwOworCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19pbiksIEdGUF9LRVJORUwpOworCisJaWYgKGF1ZGlvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLworCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmVuY19jZmcgPT0gTlVMTCkgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisKKwltdXRleF9pbml0KCZhdWRpby0+bG9jayk7CisJbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7CisJbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKKworCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCisJICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZworCSAqLworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07CisJYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMzI7CisJYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZiA9IDEwOworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRl9TSVpFOworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7CisJZW5jX2NmZy0+YmFuZF9tb2RlID0gNzsKKwllbmNfY2ZnLT5kdHhfZW5hYmxlID0gMDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDgwMDA7CisJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpcTZhc21faW5fY2IsCisJCQkJKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyIsCisJCQkJImNsaWVudFxuIiwgX19mdW5jX18pOworCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogb3BlbiBhbXJuYiBlbmNvZGVyIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FNUk5CLAorCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWQoYXVkaW8tPmFjLCBGT1JNQVRfQU1STkIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KKwkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24iLAorCQkJCSJmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworCWF1ZGlvLT5vcGVuZWQgPSAxOworCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7CisJYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7CisJYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBhbXJuYl9pbl9jb21wYXRfaW9jdGw7CisJYXVkaW8tPmVuY19pb2N0bCA9IGFtcm5iX2luX2lvY3RsOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOworCisJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogc3VjY2Vzc1xuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGFtcm5iX2luX29wZW4sCisJLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAorCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCisJLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgICA9IGF1ZGlvX2luX2NvbXBhdF9pb2N0bAorfTsKKworc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfaW5fbWlzYyA9IHsKKwkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJPSAibXNtX2Ftcm5iX2luIiwKKwkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1ybmJfaW5faW5pdCh2b2lkKQoreworCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJuYl9pbl9taXNjKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGFtcm5iX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hbXJ3Yl9pbi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hbXJ3Yl9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWE2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2FtcndiX2luLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCAyMDE0LCAyMDE2LTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FtcndiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKKworLyogQnVmZmVyIHdpdGggbWV0YSovCisjZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQorCisvKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCisjZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCg2MStzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpICogMTApKQorCitzdGF0aWMgbG9uZyBhbXJ3Yl9pbl9pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBjbnQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBkZWZhdWx0IGJ1ZiBhbGxvY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7CisJCWlmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSB7CisJCQlwcl9pbmZvKCIlczpBVURJT19TVEFSVCBhbHJlYWR5IG92ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9faW5fYnVmX2FsbG9jKGF1ZGlvKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlicmVhazsKKwkJfQorCisJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfYW1yd2IoYXVkaW8tPmFjLAorCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYsCisJCQllbmNfY2ZnLT5iYW5kX21vZGUsCisJCQllbmNfY2ZnLT5kdHhfZW5hYmxlKTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBhbXJ3YiBtZWRpYSBmb3JtYXQgYmxvY2siLAorCQkJCSJmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhdWRpby0+YWMsCisJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IG1lZGlhIGZvcm1hdCBibG9jayIsCisJCQkJImZhaWxlZFxuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIGVuYWJsZVslZF1cbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQlhdWRpby0+ZW5hYmxlZCk7CisJCXJjID0gYXVkaW9faW5fZW5hYmxlKGF1ZGlvKTsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIiwKKwkJCQkicmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKKwkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCisJCXJjID0gMDsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcHJfZGVidWcoIiVzOkFVRElPX1NUT1BcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSBhdWRpb19pbl9kaXNhYmxlKGF1ZGlvKTsKKwkJaWYgKHJjICA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RvcCBwcm9jZWR1cmUgZmFpbGVkIiwKKwkJCQkicmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKmVuY19jZmc7CisKKwkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOworCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnICopYXJnOworCQlpZiAoY2ZnID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXIgZm9yICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgIkFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjZmctPmJhbmRfbW9kZSA+IDgpIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBiYW5kIG1vZGVcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQkvKiBUb0RvOiBBTVIgV0IgZW5jb2RlciBhY2NlcHRzIHZhbHVlcyBiZXR3ZWVuIDAtOAorCQkgKiB3aGlsZSBvcGVubWF4IHByb3ZpZGVzIHZhbHVlIGJldHdlZW4gOS0xNworCQkgKiBhcyBwZXIgc3BlYworCQkgKi8KKwkJZW5jX2NmZy0+YmFuZF9tb2RlID0gY2ZnLT5iYW5kX21vZGU7CisJCWVuY19jZmctPmR0eF9lbmFibGUgPSAoY2ZnLT5kdHhfZW5hYmxlID8gMSA6IDApOworCQkvKiBDdXJyZW50bHkgRFNQIGRvZXMgbm90IHN1cHBvcnQgZGlmZmVyZW50IGZyYW1lZm9ybWF0ICovCisJCWVuY19jZmctPmZyYW1lX2Zvcm1hdCA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBiYW5kX21vZGUgPSAweCV4IGR0eF9lbmFibGU9MHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCWVuY19jZmctPmJhbmRfbW9kZSwgZW5jX2NmZy0+ZHR4X2VuYWJsZSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhbXJ3Yl9pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBhbXJ3Yl9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FNUldCX0VOQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZykpKQorCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQU1SV0JfRU5DX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsCisJCQkJc2l6ZW9mKGNmZykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FNUldCX0VOQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYW1yd2JfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmNmZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19FTkNfQ09ORklHIGZhaWxlZC4gcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWdfMzIgeworCXUzMiBiYW5kX21vZGU7CisJdTMyIGR0eF9lbmFibGU7CisJdTMyIGZyYW1lX2Zvcm1hdDsKK307CisKK2VudW0geworCUFVRElPX0dFVF9BTVJXQl9FTkNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWdfMzIpLAorCUFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWdfMzIpCit9OworCitzdGF0aWMgbG9uZyBhbXJ3Yl9pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6CisJY2FzZSBBVURJT19TVE9QOiB7CisJCXJjID0gYW1yd2JfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgTlVMTCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BTVJXQl9FTkNfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqYW1yd2JfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWdfMzIgYW1yd2JfY29uZmlnXzMyOworCisJCW1lbXNldCgmYW1yd2JfY29uZmlnXzMyLCAwLCBzaXplb2YoYW1yd2JfY29uZmlnXzMyKSk7CisKKwkJYW1yd2JfY29uZmlnID0KKwkJKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqKWF1ZGlvLT5lbmNfY2ZnOworCQlhbXJ3Yl9jb25maWdfMzIuYmFuZF9tb2RlID0gYW1yd2JfY29uZmlnLT5iYW5kX21vZGU7CisJCWFtcndiX2NvbmZpZ18zMi5kdHhfZW5hYmxlID0gYW1yd2JfY29uZmlnLT5kdHhfZW5hYmxlOworCQlhbXJ3Yl9jb25maWdfMzIuZnJhbWVfZm9ybWF0ID0gYW1yd2JfY29uZmlnLT5mcmFtZV9mb3JtYXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFtcndiX2NvbmZpZ18zMiwKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQU1SV0JfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyBjZmdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY21kID0gQVVESU9fU0VUX0FNUldCX0VOQ19DT05GSUc7CisJCXJjID0gYW1yd2JfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmNmZ18zMik7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19FTkNfQ09ORklHIGZhaWxlZC4gcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhbXJ3Yl9pbl9jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYW1yd2JfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOworCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKwlpbnQgcmMgPSAwOworCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19pbiksIEdGUF9LRVJORUwpOworCisJaWYgKGF1ZGlvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLworCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmVuY19jZmcgPT0gTlVMTCkgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisKKwltdXRleF9pbml0KCZhdWRpby0+bG9jayk7CisJbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7CisJbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKKworCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCisJICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZworCSAqLworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07CisJYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMzI7CisJYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZiA9IDEwOworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRl9TSVpFOworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7CisJZW5jX2NmZy0+YmFuZF9tb2RlID0gODsKKwllbmNfY2ZnLT5kdHhfZW5hYmxlID0gMDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDE2MDAwOworCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKworCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKXE2YXNtX2luX2NiLAorCQkJCSh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCIlczphdWRpb1slcEtdOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyIsCisJCQkiY2xpZW50XG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogb3BlbiBhbXJ3YiBlbmNvZGVyIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FNUldCLAorCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWQoYXVkaW8tPmFjLCBGT1JNQVRfQU1SV0IpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KKwkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24iLAorCQkJCSJmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworCWF1ZGlvLT5vcGVuZWQgPSAxOworCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7CisJYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7CisJYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBhbXJ3Yl9pbl9jb21wYXRfaW9jdGw7CisJYXVkaW8tPmVuY19pb2N0bCA9IGFtcndiX2luX2lvY3RsOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOworCisJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogc3VjY2Vzc1xuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGFtcndiX2luX29wZW4sCisJLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAorCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCisJLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgICA9IGF1ZGlvX2luX2NvbXBhdF9pb2N0bAorfTsKKworc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1yd2JfaW5fbWlzYyA9IHsKKwkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJPSAibXNtX2FtcndiX2luIiwKKwkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1yd2JfaW5faW5pdCh2b2lkKQoreworCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJ3Yl9pbl9taXNjKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGFtcndiX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hYWMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNzFmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWFjLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qIGFhYyBhdWRpbyBvdXRwdXQgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYWFjLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKKyNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19JTlZBTElEIC0xCisjZGVmaW5lIFBDTV9CVUZTWl9NSU5fQUFDCSgoOCoxMDI0KSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfb3V0KSkKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FhY19taXNjOworc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fYWFjX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2RlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKKwkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAorfTsKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlzdHJ1Y3QgYXNtX2FhY19jZmcgYWFjX2NmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOworCQl1aW50MzJfdCBzYnJfcHMgPSAweDAwOworCisJCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLCAwLCAwKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogdHVybiBvbiBib3RoIHNiciBhbmQgcHMgKi8KKwkJcmMgPSBxNmFzbV9lbmFibGVfc2JycHMoYXVkaW8tPmFjLCBzYnJfcHMpOworCQlpZiAocmMgPCAwKQorCQkJcHJfZXJyKCJzYnItcHMgZW5hYmxlIGZhaWxlZFxuIik7CisJCWFhY19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJaWYgKGFhY19jb25maWctPnNicl9wc19vbl9mbGFnKQorCQkJYWFjX2NmZy5hb3QgPSBBQUNfRU5DX01PREVfRUFBQ19QOworCQllbHNlIGlmIChhYWNfY29uZmlnLT5zYnJfb25fZmxhZykKKwkJCWFhY19jZmcuYW90ID0gQUFDX0VOQ19NT0RFX0FBQ19QOworCQllbHNlCisJCQlhYWNfY2ZnLmFvdCA9IEFBQ19FTkNfTU9ERV9BQUNfTEM7CisKKwkJc3dpdGNoIChhYWNfY29uZmlnLT5mb3JtYXQpIHsKKwkJY2FzZSBBVURJT19BQUNfRk9STUFUX0FEVFM6CisJCQlhYWNfY2ZnLmZvcm1hdCA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19BQUNfRk9STUFUX0xPQVM6CisJCQlhYWNfY2ZnLmZvcm1hdCA9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSBBVURJT19BQUNfRk9STUFUX0FESUY6CisJCQlhYWNfY2ZnLmZvcm1hdCA9IDB4MDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBBVURJT19BQUNfRk9STUFUX1JBVzoKKwkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMzsKKwkJfQorCQlhYWNfY2ZnLmVwX2NvbmZpZyA9IGFhY19jb25maWctPmVwX2NvbmZpZzsKKwkJYWFjX2NmZy5zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZSA9CisJCQlhYWNfY29uZmlnLT5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NmZy5zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2UgPQorCQkJYWFjX2NvbmZpZy0+YWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY2ZnLnNwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZSA9CisJCQlhYWNfY29uZmlnLT5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jZmcuY2hfY2ZnID0gYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudDsKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBUVU5ORUxfTU9ERSkgeworCQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSA9IGFhY19jb25maWctPnNhbXBsZV9yYXRlOworCQkJYWFjX2NmZy5jaF9jZmcgPSBhYWNfY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb247CisJCX0gZWxzZSB7CisJCQlhYWNfY2ZnLnNhbXBsZV9yYXRlID0gIGF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlOworCQkJYWFjX2NmZy5jaF9jZmcgPSBhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50OworCQl9CisKKwkJcHJfZGVidWcoIiVzOmZvcm1hdD0leCBhb3Q9JWQgIGNoPSVkIHNyPSVkXG4iLAorCQkJX19mdW5jX18sIGFhY19jZmcuZm9ybWF0LAorCQkJYWFjX2NmZy5hb3QsIGFhY19jZmcuY2hfY2ZnLAorCQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSk7CisKKwkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLworCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoYXVkaW8tPmFjLCAmYWFjX2NmZyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiY21kIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJYXVkaW8tPmVvc19yc3AgPSAwOworCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQlpZiAoIXJjKSB7CisJCQlyYyA9IGVuYWJsZV92b2x1bWVfcmFtcChhdWRpbyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSB2b2x1bWUgcmFtcFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJfQorCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9pbmZvKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCQkJYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOworCQl1aW50MTZfdCBzY2VfbGVmdCA9IDEsIHNjZV9yaWdodCA9IDI7CisKKwkJcHJfZGVidWcoIiVzOiBBVURJT19TRVRfQUFDX0NPTkZJR1xuIiwgX19mdW5jX18pOworCQlhYWNfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqKWFyZzsKKwkJaWYgKGFhY19jb25maWcgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KGF1ZGlvLT5jb2RlY19jZmcsIGFhY19jb25maWcsCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykpOworCQkvKiBQTF9QUiBpcyAwIG9ubHkgbmVlZCB0byBjaGVjayBQTF9TUiAqLworCQlpZiAoYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUgPgorCQkgICAgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUikgeworCQkJcHJfZXJyKCIlczpJbnZhbGlkIGR1YWxfbW9ubyBtb2RlID0lZFxuIiwgX19mdW5jX18sCisJCQlhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSk7CisJCX0gZWxzZSB7CisJCQkvKiBjb252ZXJ0IHRoZSBkYXRhIGZyb20gdXNlciBpbnRvIHNjZV9sZWZ0CisJCQkgKiBhbmQgc2NlX3JpZ2h0IGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucworCQkJICovCisJCQlwcl9kZWJ1ZygiJXM6IG1vZGlmeSBkdWFsX21vbm8gbW9kZSA9JWRcbiIsIF9fZnVuY19fLAorCQkJCSBhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSk7CisJCQlzd2l0Y2ggKGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKSB7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fUExfUFI6CisJCQkJc2NlX2xlZnQgPSAxOworCQkJCXNjZV9yaWdodCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fU0xfU1I6CisJCQkJc2NlX2xlZnQgPSAyOworCQkJCXNjZV9yaWdodCA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fU0xfUFI6CisJCQkJc2NlX2xlZnQgPSAyOworCQkJCXNjZV9yaWdodCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fUExfU1I6CisJCQlkZWZhdWx0OgorCQkJCXNjZV9sZWZ0ID0gMTsKKwkJCQlzY2VfcmlnaHQgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQkJcmMgPSBxNmFzbV9jZmdfZHVhbF9tb25vX2FhYyhhdWRpby0+YWMsCisJCQkJCQlzY2VfbGVmdCwgc2NlX3JpZ2h0KTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlczphc20gY21kIGR1YWxtb25vIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJIF9fZnVuY19fLCByYyk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FBQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmNvZGVjX2NmZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQUFDX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnIGFhY19jb25maWc7CisKKwkJcHJfZGVidWcoIiVzOiBBVURJT19TRVRfQUFDX0NPTkZJR1xuIiwgX19mdW5jX18pOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFhY19jb25maWcsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKGFhY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZhYWNfY29uZmlnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXNbJXBLXTpGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgeworCXMxNiBmb3JtYXQ7CisJdTE2IGF1ZGlvX29iamVjdDsKKwl1MTYgZXBfY29uZmlnOwkvKiAwIH4gMyB1c2VmdWwgb25seSBvYmogPSBFUkxDICovCisJdTE2IGFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCXUxNiBhYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJdTE2IGFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwl1MTYgc2JyX29uX2ZsYWc7CisJdTE2IHNicl9wc19vbl9mbGFnOworCXUxNiBkdWFsX21vbm9fbW9kZTsKKwl1MTYgY2hhbm5lbF9jb25maWd1cmF0aW9uOworCXUxNiBzYW1wbGVfcmF0ZTsKK307CisKK2VudW0geworCUFVRElPX1NFVF9BQUNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIpLAorCUFVRElPX0dFVF9BQUNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIpCit9OworCitzdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQUFDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZzMyIGFhY19jb25maWdfMzI7CisKKwkJYWFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQlhYWNfY29uZmlnXzMyLmZvcm1hdCA9IGFhY19jb25maWctPmZvcm1hdDsKKwkJYWFjX2NvbmZpZ18zMi5hdWRpb19vYmplY3QgPSBhYWNfY29uZmlnLT5hdWRpb19vYmplY3Q7CisJCWFhY19jb25maWdfMzIuZXBfY29uZmlnID0gYWFjX2NvbmZpZy0+ZXBfY29uZmlnOworCQlhYWNfY29uZmlnXzMyLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnXzMyLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQkgYWFjX2NvbmZpZy0+YWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnXzMyLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY29uZmlnLT5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jb25maWdfMzIuc2JyX29uX2ZsYWcgPSBhYWNfY29uZmlnLT5zYnJfb25fZmxhZzsKKwkJYWFjX2NvbmZpZ18zMi5zYnJfcHNfb25fZmxhZyA9IGFhY19jb25maWctPnNicl9wc19vbl9mbGFnOworCQlhYWNfY29uZmlnXzMyLmR1YWxfbW9ub19tb2RlID0gYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGU7CisJCWFhY19jb25maWdfMzIuY2hhbm5lbF9jb25maWd1cmF0aW9uID0KKwkJCQkJYWFjX2NvbmZpZy0+Y2hhbm5lbF9jb25maWd1cmF0aW9uOworCQlhYWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZy0+c2FtcGxlX3JhdGU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFhY19jb25maWdfMzIsCisJCQlzaXplb2YoYWFjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BQUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgYWFjX2NvbmZpZ18zMjsKKworCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NFVF9BQUNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjX2NvbmZpZ18zMiwgKHZvaWQgKilhcmcsCisJCQlzaXplb2YoYWFjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FBQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWFhY19jb25maWcuZm9ybWF0ID0gYWFjX2NvbmZpZ18zMi5mb3JtYXQ7CisJCWFhY19jb25maWcuYXVkaW9fb2JqZWN0ID0gYWFjX2NvbmZpZ18zMi5hdWRpb19vYmplY3Q7CisJCWFhY19jb25maWcuZXBfY29uZmlnID0gYWFjX2NvbmZpZ18zMi5lcF9jb25maWc7CisJCWFhY19jb25maWcuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQorCQkJYWFjX2NvbmZpZ18zMi5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NvbmZpZy5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQorCQkJYWFjX2NvbmZpZ18zMi5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jb25maWcuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWdfMzIuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnLnNicl9vbl9mbGFnID0gYWFjX2NvbmZpZ18zMi5zYnJfb25fZmxhZzsKKwkJYWFjX2NvbmZpZy5zYnJfcHNfb25fZmxhZyA9IGFhY19jb25maWdfMzIuc2JyX3BzX29uX2ZsYWc7CisJCWFhY19jb25maWcuZHVhbF9tb25vX21vZGUgPSBhYWNfY29uZmlnXzMyLmR1YWxfbW9ub19tb2RlOworCQlhYWNfY29uZmlnLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9CisJCQkJYWFjX2NvbmZpZ18zMi5jaGFubmVsX2NvbmZpZ3VyYXRpb247CisJCWFhY19jb25maWcuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlOworCisJCWNtZCA9IEFVRElPX1NFVF9BQUNfQ09ORklHOworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZhYWNfY29uZmlnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlc1slcEtdOkZhaWxlZCBpbiB1dGlsc19pb2N0bDogJWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZyA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLworCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9hYWNfIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWFhY19jb25maWcgPSBhdWRpby0+Y29kZWNfY2ZnOworCisJLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRywKKwkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCisJICovCisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOX0FBQzsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19hYWNfbWlzYzsKKwlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FhY193c19tZ3I7CisJYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUgPSBBVURJT19BQUNfRFVBTF9NT05PX0lOVkFMSUQ7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCisJCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7CisJCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfTVBFRzRfQUFDKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQkvKiBvcGVuIEFBQyBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEKKwkJICogYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCQkgKi8KKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9NUEVHNF9BQUMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9hYWNfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX2FhY19kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczphYWNkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIHJjOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FhY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXVkaW9fb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAorCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKKwkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYWFjX21pc2MgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gIm1zbV9hYWMiLAorCS5mb3BzID0gJmF1ZGlvX2FhY19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fYWFjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fYWFjX21pc2MpOworCisJaWYgKHJldCA9PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fYWFjX21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX2FhY193c19tZ3IucmVmX2NudCA9IDA7CisJbXV0ZXhfaW5pdCgmYXVkaW9fYWFjX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb19hYWNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FsYWMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWxhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjg2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FsYWMuYwpAQCAtMCwwICsxLDQzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbGFjLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbGFjX21pc2M7CitzdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb19hbGFjX3dzX21ncjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWxhY19kZWJ1Z19mb3BzID0geworCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCisJLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjb25maWdfZGVidWdmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAorCQkJCU5VTEwsICh2b2lkICopZGF0YSwgJmF1ZGlvX2FsYWNfZGVidWdfZm9wcyk7Cit9CisKK3N0YXRpYyBpbnQgYWxhY19jaGFubmVsX21hcCh1OCAqY2hhbm5lbF9tYXBwaW5nLCB1aW50MzJfdCBjaGFubmVscyk7CisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJc3RydWN0IGFzbV9hbGFjX2NmZyBhbGFjX2NmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZyAqYWxhY19jb25maWc7CisJCXU4IGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07CisKKwkJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOworCisJCWlmIChhbGFjX2NoYW5uZWxfbWFwKGNoYW5uZWxfbWFwcGluZywKKwkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpKSB7CisJCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGNoYW5uZWwgbWFwIGZhaWxlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCQl9CisKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKKwkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCisJCQkJCTE2LCAvKmJpdHMgcGVyIHNhbXBsZSovCisJCQkJCWZhbHNlLCBmYWxzZSwgY2hhbm5lbF9tYXBwaW5nKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYWxhY19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7CisJCWFsYWNfY2ZnLmZyYW1lX2xlbmd0aCA9IGFsYWNfY29uZmlnLT5mcmFtZUxlbmd0aDsKKwkJYWxhY19jZmcuY29tcGF0aWJsZV92ZXJzaW9uID0gYWxhY19jb25maWctPmNvbXBhdFZlcnNpb247CisJCWFsYWNfY2ZnLmJpdF9kZXB0aCA9IGFsYWNfY29uZmlnLT5iaXREZXB0aDsKKwkJYWxhY19jZmcucGIgPSBhbGFjX2NvbmZpZy0+cGI7CisJCWFsYWNfY2ZnLm1iID0gYWxhY19jb25maWctPm1iOworCQlhbGFjX2NmZy5rYiA9IGFsYWNfY29uZmlnLT5rYjsKKwkJYWxhY19jZmcubnVtX2NoYW5uZWxzID0gYWxhY19jb25maWctPmNoYW5uZWxDb3VudDsKKwkJYWxhY19jZmcubWF4X3J1biA9IGFsYWNfY29uZmlnLT5tYXhSdW47CisJCWFsYWNfY2ZnLm1heF9mcmFtZV9ieXRlcyA9IGFsYWNfY29uZmlnLT5tYXhTaXplOworCQlhbGFjX2NmZy5hdmdfYml0X3JhdGUgPSBhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGU7CisJCWFsYWNfY2ZnLnNhbXBsZV9yYXRlID0gYWxhY19jb25maWctPnNhbXBsZVJhdGU7CisJCWFsYWNfY2ZnLmNoYW5uZWxfbGF5b3V0X3RhZyA9IGFsYWNfY29uZmlnLT5jaGFubmVsTGF5b3V0OworCQlwcl9kZWJ1ZygiJXM6IGZyYW1lX2xlbmd0aCAlZCBjb21wYXRpYmxlX3ZlcnNpb24gJWQgYml0X2RlcHRoICVkIHBiICVkIG1iICVkIGtiICVkIG51bV9jaGFubmVscyAlZCBtYXhfcnVuICVkIG1heF9mcmFtZV9ieXRlcyAlZCBhdmdfYml0X3JhdGUgJWQgc2FtcGxlX3JhdGUgJWQgY2hhbm5lbF9sYXlvdXRfdGFnICVkXG4iLAorCQkJCV9fZnVuY19fLCBhbGFjX2NvbmZpZy0+ZnJhbWVMZW5ndGgsCisJCQkJYWxhY19jb25maWctPmNvbXBhdFZlcnNpb24sCisJCQkJYWxhY19jb25maWctPmJpdERlcHRoLCBhbGFjX2NvbmZpZy0+cGIsCisJCQkJYWxhY19jb25maWctPm1iLCBhbGFjX2NvbmZpZy0+a2IsCisJCQkJYWxhY19jb25maWctPmNoYW5uZWxDb3VudCwgYWxhY19jb25maWctPm1heFJ1biwKKwkJCQlhbGFjX2NvbmZpZy0+bWF4U2l6ZSwKKwkJCQlhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGUsCisJCQkJYWxhY19jb25maWctPnNhbXBsZVJhdGUsCisJCQkJYWxhY19jb25maWctPmNoYW5uZWxMYXlvdXQpOworCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FsYWMoYXVkaW8tPmFjLCAmYWxhY19jZmcsCisJCQkJCQkJYXVkaW8tPmFjLT5zdHJlYW1faWQpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoImNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLCBhdWRpby0+ZW5hYmxlZCk7CisJCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQUxBQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmNvZGVjX2NmZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnKSkpIHsKKwkJCXByX2VycigiJXM6Y29weV90b191c2VyIGZvciBBVURJT19HRVRfQUxBQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BTEFDX0NPTkZJRzogeworCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOmNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUxBQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZ18zMiB7CisJdTMyIGZyYW1lTGVuZ3RoOworCXU4IGNvbXBhdFZlcnNpb247CisJdTggYml0RGVwdGg7CisJdTggcGI7CisJdTggbWI7CisJdTgga2I7CisJdTggY2hhbm5lbENvdW50OworCXUxNiBtYXhSdW47CisJdTMyIG1heFNpemU7CisJdTMyIGF2ZXJhZ2VCaXRSYXRlOworCXUzMiBzYW1wbGVSYXRlOworCXUzMiBjaGFubmVsTGF5b3V0OworfTsKKworZW51bSB7CisJQVVESU9fR0VUX0FMQUNfQ09ORklHXzMyID0gIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnXzMyKSwKKwlBVURJT19TRVRfQUxBQ19DT05GSUdfMzIgPSAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWdfMzIpCit9OworCitzdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BTEFDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICphbGFjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZ18zMiBhbGFjX2NvbmZpZ18zMjsKKworCQltZW1zZXQoJmFsYWNfY29uZmlnXzMyLCAwLCBzaXplb2YoYWxhY19jb25maWdfMzIpKTsKKworCQlhbGFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJYWxhY19jb25maWdfMzIuZnJhbWVMZW5ndGggPSBhbGFjX2NvbmZpZy0+ZnJhbWVMZW5ndGg7CisJCWFsYWNfY29uZmlnXzMyLmNvbXBhdFZlcnNpb24gPQorCQkJCWFsYWNfY29uZmlnLT5jb21wYXRWZXJzaW9uOworCQlhbGFjX2NvbmZpZ18zMi5iaXREZXB0aCA9IGFsYWNfY29uZmlnLT5iaXREZXB0aDsKKwkJYWxhY19jb25maWdfMzIucGIgPSBhbGFjX2NvbmZpZy0+cGI7CisJCWFsYWNfY29uZmlnXzMyLm1iID0gYWxhY19jb25maWctPm1iOworCQlhbGFjX2NvbmZpZ18zMi5rYiA9IGFsYWNfY29uZmlnLT5rYjsKKwkJYWxhY19jb25maWdfMzIuY2hhbm5lbENvdW50ID0gYWxhY19jb25maWctPmNoYW5uZWxDb3VudDsKKwkJYWxhY19jb25maWdfMzIubWF4UnVuID0gYWxhY19jb25maWctPm1heFJ1bjsKKwkJYWxhY19jb25maWdfMzIubWF4U2l6ZSA9IGFsYWNfY29uZmlnLT5tYXhTaXplOworCQlhbGFjX2NvbmZpZ18zMi5hdmVyYWdlQml0UmF0ZSA9IGFsYWNfY29uZmlnLT5hdmVyYWdlQml0UmF0ZTsKKwkJYWxhY19jb25maWdfMzIuc2FtcGxlUmF0ZSA9IGFsYWNfY29uZmlnLT5zYW1wbGVSYXRlOworCQlhbGFjX2NvbmZpZ18zMi5jaGFubmVsTGF5b3V0ID0gYWxhY19jb25maWctPmNoYW5uZWxMYXlvdXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFsYWNfY29uZmlnXzMyLAorCQkJc2l6ZW9mKGFsYWNfY29uZmlnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgR0VUX0FMQUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FMQUNfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWcgKmFsYWNfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnXzMyIGFsYWNfY29uZmlnXzMyOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWxhY19jb25maWdfMzIsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKGFsYWNfY29uZmlnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBTRVRfQUxBQ19DT05GSUdfMzIgZmFpbGVkXG4iCisJCQkJLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlhbGFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJYWxhY19jb25maWctPmZyYW1lTGVuZ3RoID0gYWxhY19jb25maWdfMzIuZnJhbWVMZW5ndGg7CisJCWFsYWNfY29uZmlnLT5jb21wYXRWZXJzaW9uID0KKwkJCQlhbGFjX2NvbmZpZ18zMi5jb21wYXRWZXJzaW9uOworCQlhbGFjX2NvbmZpZy0+Yml0RGVwdGggPSBhbGFjX2NvbmZpZ18zMi5iaXREZXB0aDsKKwkJYWxhY19jb25maWctPnBiID0gYWxhY19jb25maWdfMzIucGI7CisJCWFsYWNfY29uZmlnLT5tYiA9IGFsYWNfY29uZmlnXzMyLm1iOworCQlhbGFjX2NvbmZpZy0+a2IgPSBhbGFjX2NvbmZpZ18zMi5rYjsKKwkJYWxhY19jb25maWctPmNoYW5uZWxDb3VudCA9IGFsYWNfY29uZmlnXzMyLmNoYW5uZWxDb3VudDsKKwkJYWxhY19jb25maWctPm1heFJ1biA9IGFsYWNfY29uZmlnXzMyLm1heFJ1bjsKKwkJYWxhY19jb25maWctPm1heFNpemUgPSBhbGFjX2NvbmZpZ18zMi5tYXhTaXplOworCQlhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGUgPSBhbGFjX2NvbmZpZ18zMi5hdmVyYWdlQml0UmF0ZTsKKwkJYWxhY19jb25maWctPnNhbXBsZVJhdGUgPSBhbGFjX2NvbmZpZ18zMi5zYW1wbGVSYXRlOworCQlhbGFjX2NvbmZpZy0+Y2hhbm5lbExheW91dCA9IGFsYWNfY29uZmlnXzMyLmNoYW5uZWxMYXlvdXQ7CisKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX2FsYWNfIiArIDVdOworCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF1ZGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFhdWRpby0+Y29kZWNfY2ZnKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOworCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX2FsYWNfbWlzYzsKKwlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FsYWNfd3NfbWdyOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAorCQkJCQkgICAgICh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOworCQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisJLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKKwkJCQkJICAgRk9STUFUX0FMQUMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCS8qIG9wZW4gQUxBQyBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfQUxBQyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOworCX0gZWxzZSB7CisJCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKKwkJcmMgPSAtRUFDQ0VTOworCQlnb3RvIGZhaWw7CisJfQorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FsYWNfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsICh2b2lkICopYXVkaW8pOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5kZW50cnkpKQorCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCXByX2RlYnVnKCIlczphbGFjZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpby0+ZmVlZGJhY2ssCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCXJldHVybiByYzsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGFsYWNfY2hhbm5lbF9tYXAodTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMpCit7CisJdTggKmxjaGFubmVsX21hcHBpbmc7CisKKwlsY2hhbm5lbF9tYXBwaW5nID0gY2hhbm5lbF9tYXBwaW5nOworCXByX2RlYnVnKCIlczogIGNoYW5uZWxzIHBhc3NlZDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVscyk7CisJaWYgKGNoYW5uZWxzID09IDEpICB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDIpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSAzKSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA0KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9DUzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDUpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOworCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA2KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTEZFOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNykgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX0NTOworCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfTEZFOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gOCkgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTEM7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUkM7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9SUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s3XSA9IFBDTV9DSEFOTkVMX0xGRTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFUlJPUi51bnN1cHBvcnRlZCBudW1fY2ggPSAldVxuIiwKKwkJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FsYWNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCisJLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FsYWNfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX2FsYWMiLAorCS5mb3BzID0gJmF1ZGlvX2FsYWNfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2FsYWNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbGFjX21pc2MpOworCisJaWYgKHJldCA9PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fYWxhY19taXNjLnRoaXNfZGV2aWNlLCB0cnVlKTsKKwlhdWRpb19hbGFjX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19hbGFjX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb19hbGFjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJuYi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJuYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDA5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2Ftcm5iLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIGFtcm5iIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJuYl9taXNjOworc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fYW1ybmJfd3NfbWdyOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hbXJuYl9kZWJ1Z19mb3BzID0geworCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCisJLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKK307CisjZW5kaWYKKworc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJYXVkaW8tPmVvc19yc3AgPSAwOworCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQlpZiAoIXJjKSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDA7CisJCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCJBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsIGF1ZGlvLT5lbmFibGVkKTsKKwkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCisJCQlhdWRpby0+c3RvcHBlZCA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCisJCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCJBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsIGF1ZGlvLT5lbmFibGVkKTsKKwkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCisJCQlhdWRpby0+c3RvcHBlZCA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyBjb21wYXQgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJfQorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX2Ftcm5iXyIgKyA1XTsKKyNlbmRpZgorCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYXVkaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47CisJYXVkaW8tPm1pc2NkZXZpY2UgPSAmYXVkaW9fYW1ybmJfbWlzYzsKKwlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2Ftcm5iX3dzX21ncjsKKworCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKKwkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisJLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKKwkJCQkJICAgRk9STUFUX0FNUk5CKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfQU1STkIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9hbXJuYl8lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKKwkJCQkJICAgIE5VTEwsICh2b2lkICopYXVkaW8sCisJCQkJCSAgICAmYXVkaW9fYW1ybmJfZGVidWdfZm9wcyk7CisKKwlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQorCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworI2VuZGlmCisJcHJfaW5mbygiJXM6YW1ybmIgZGVjb2RlciBvcGVuIHN1Y2Nlc3MsIHNlc3Npb25faWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gcmM7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1ybmJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCisJLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJuYl9taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJtc21fYW1ybmIiLAorCS5mb3BzID0gJmF1ZGlvX2Ftcm5iX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19hbXJuYl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2Ftcm5iX21pc2MpOworCisJaWYgKHJldCA9PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fYW1ybmJfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7CisJYXVkaW9fYW1ybmJfd3NfbWdyLnJlZl9jbnQgPSAwOworCW11dGV4X2luaXQoJmF1ZGlvX2Ftcm5iX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb19hbXJuYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYW1yd2IuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYW1yd2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVkYjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJ3Yi5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiBhbXJ3YiBhdWRpbyBvdXRwdXQgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1yd2JfbWlzYzsKK3N0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2FtcndiX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1yd2JfZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9OworI2VuZGlmCisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKKwkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHNlc3Npb25pZFslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQkJCWF1ZGlvLT5lbmFibGVkKTsKKwkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCisJCQlhdWRpby0+c3RvcHBlZCA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCisJCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQlhdWRpby0+ZW5hYmxlZCk7CisJCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgY29tcGF0IGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKwljaGFyIG5hbWVbc2l6ZW9mICJtc21fYW1yd2JfIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19hbXJ3Yl9taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fYW1yd2Jfd3NfbWdyOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAorCQkJCQkgICAgICh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCSAgIEZPUk1BVF9BTVJXQik7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKKwl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FNUldCKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fYW1yd2JfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX2FtcndiX2RlYnVnX2ZvcHMpOworCisJaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKKwkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKKyNlbmRpZgorCXByX2luZm8oIiVzOiBBTVJXQiBkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1yd2JfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCisJLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3Yl9taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJtc21fYW1yd2IiLAorCS5mb3BzID0gJmF1ZGlvX2FtcndiX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19hbXJ3Yl9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2FtcndiX21pc2MpOworCisJaWYgKHJldCA9PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fYW1yd2JfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7CisJYXVkaW9fYW1yd2Jfd3NfbWdyLnJlZl9jbnQgPSAwOworCW11dGV4X2luaXQoJmF1ZGlvX2FtcndiX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb19hbXJ3Yl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYW1yd2JwbHVzLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FtcndicGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FtcndicGx1cy5jCkBAIC0wLDAgKzEsMzk3IEBACisvKiBhbXItd2JwbHVzIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYW1yd2JwbHVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3YnBsdXNfbWlzYzsKK3N0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2FtcndicGx1c193c19tZ3I7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FtcndicGx1c19kZWJ1Z19mb3BzID0geworCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCisJLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKK307CitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKK3sKKwlpZiAoYXVkaW8gIT0gTlVMTCkgeworCQljaGFyIG5hbWVbc2l6ZW9mKCJtc21fYW1yd2JwbHVzXyIpICsgNV07CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FtcndicGx1c18lMDR4IiwKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAorCQkJCQkJTlVMTCwgKHZvaWQgKilhdWRpbywKKwkJCQkJCSZhdWRpb19hbXJ3YnBsdXNfZGVidWdfZm9wcyk7CisJCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYXNtX2FtcndicGx1c19jZmcgcTZfYW1yd2JwbHVzX2NmZzsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgKmFtcndicGx1c19kcnZfY29uZmlnOworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlwcl9lcnIoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKKwkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWFtcndicGx1c19kcnZfY29uZmlnID0KKwkJKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MiAqKWF1ZGlvLT5jb2RlY19jZmc7CisKKwkJcTZfYW1yd2JwbHVzX2NmZy5zaXplX2J5dGVzICAgICA9CisJCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZy0+c2l6ZV9ieXRlczsKKwkJcTZfYW1yd2JwbHVzX2NmZy52ZXJzaW9uICAgICAgICA9CisJCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZy0+dmVyc2lvbjsKKwkJcTZfYW1yd2JwbHVzX2NmZy5udW1fY2hhbm5lbHMgICA9CisJCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZy0+bnVtX2NoYW5uZWxzOworCQlxNl9hbXJ3YnBsdXNfY2ZnLmFtcl9iYW5kX21vZGUgID0KKwkJCWFtcndicGx1c19kcnZfY29uZmlnLT5hbXJfYmFuZF9tb2RlOworCQlxNl9hbXJ3YnBsdXNfY2ZnLmFtcl9kdHhfbW9kZSAgID0KKwkJCWFtcndicGx1c19kcnZfY29uZmlnLT5hbXJfZHR4X21vZGU7CisJCXE2X2FtcndicGx1c19jZmcuYW1yX2ZyYW1lX2ZtdCAgPQorCQkJYW1yd2JwbHVzX2Rydl9jb25maWctPmFtcl9mcmFtZV9mbXQ7CisJCXE2X2FtcndicGx1c19jZmcuYW1yX2xzZl9pZHggICAgPQorCQkJYW1yd2JwbHVzX2Rydl9jb25maWctPmFtcl9sc2ZfaWR4OworCisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FtcndicGx1cyhhdWRpby0+YWMsCisJCQkJCQkJJnE2X2FtcndicGx1c19jZmcpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoInE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hbXJ3YisgZmFpbGVkLi4uXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6QVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQU1SV0JQTFVTX0NPTkZJR19WMjogeworCQlpZiAoKGF1ZGlvKSAmJiAoYXJnKSAmJiAoYXVkaW8tPmNvZGVjX2NmZykpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikpKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjIgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl9IGVsc2UgeworCQkJCXByX2VycigiJXM6IHdiKyBjb25maWcgdjIgaW52YWxpZCBwYXJhbWV0ZXJzXG4iCisJCQkJCSwgX19mdW5jX18pOworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FNUldCUExVU19DT05GSUdfVjI6IHsKKwkJaWYgKChhdWRpbykgJiYgKGFyZykgJiYgKGF1ZGlvLT5jb2RlY19jZmcpKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikpKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1SV0JQTFVTX0NPTkZJR19WMiBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCIlczogd2IrIGNvbmZpZyBpbnZhbGlkIHBhcmFtZXRlcnNcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMiB7CisJdTMyIHNpemVfYnl0ZXM7CisJdTMyIHZlcnNpb247CisJdTMyIG51bV9jaGFubmVsczsKKwl1MzIgYW1yX2JhbmRfbW9kZTsKKwl1MzIgYW1yX2R0eF9tb2RlOworCXUzMiBhbXJfZnJhbWVfZm10OworCXUzMiBhbXJfbHNmX2lkeDsKK307CisKK2VudW0geworCUFVRElPX0dFVF9BTVJXQlBMVVNfQ09ORklHX1YyXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzIpLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIpLAorCUFVRElPX1NFVF9BTVJXQlBMVVNfQ09ORklHX1YyXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzMpLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIpCit9OworCitzdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjJfMzI6IHsKKwkJaWYgKGF1ZGlvICYmIGFyZyAmJiAoYXVkaW8tPmNvZGVjX2NmZykpIHsKKwkJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MiAqYW1yd2JwbHVzX2NvbmZpZzsKKwkJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMgorCQkJCQkJYW1yd2JwbHVzX2NvbmZpZ18zMjsKKworCQkJbWVtc2V0KCZhbXJ3YnBsdXNfY29uZmlnXzMyLCAwLAorCQkJCQlzaXplb2YoYW1yd2JwbHVzX2NvbmZpZ18zMikpOworCisJCQlhbXJ3YnBsdXNfY29uZmlnID0KKwkJCQkoc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyICopCisJCQkJYXVkaW8tPmNvZGVjX2NmZzsKKwkJCWFtcndicGx1c19jb25maWdfMzIuc2l6ZV9ieXRlcyA9CisJCQkJCWFtcndicGx1c19jb25maWctPnNpemVfYnl0ZXM7CisJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLnZlcnNpb24gPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT52ZXJzaW9uOworCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5udW1fY2hhbm5lbHMgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5udW1fY2hhbm5lbHM7CisJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9iYW5kX21vZGUgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfYmFuZF9tb2RlOworCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5hbXJfZHR4X21vZGUgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZHR4X21vZGU7CisJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9mcmFtZV9mbXQgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZnJhbWVfZm10OworCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5hbXJfbHNmX2lkeCA9CisJCQkJCWFtcndicGx1c19jb25maWctPmFtcl9sc2ZfaWR4OworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYW1yd2JwbHVzX2NvbmZpZ18zMiwKKwkJCQlzaXplb2YoYW1yd2JwbHVzX2NvbmZpZ18zMikpKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjJfMzIgZmFpbGVkXG4iCisJCQkJCSwgX19mdW5jX18pOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogd2IrIEdldCBjb25maWcgdjIgaW52YWxpZCBwYXJhbWV0ZXJzXG4iCisJCQkJLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FNUldCUExVU19DT05GSUdfVjJfMzI6IHsKKwkJaWYgKChhdWRpbykgJiYgKGFyZykgJiYgKGF1ZGlvLT5jb2RlY19jZmcpKSB7CisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgKmFtcndicGx1c19jb25maWc7CisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIKKwkJCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcndicGx1c19jb25maWdfMzIsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMikpKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1SV0JQTFVTX0NPTkZJR19WMl8zMiBmYWlsZWRcbiIKKwkJCQkJLCBfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhbXJ3YnBsdXNfY29uZmlnID0KKwkJCSAoc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyICopCisJCQkJCQlhdWRpby0+Y29kZWNfY2ZnOworCQkJYW1yd2JwbHVzX2NvbmZpZy0+c2l6ZV9ieXRlcyA9CisJCQkJCWFtcndicGx1c19jb25maWdfMzIuc2l6ZV9ieXRlczsKKwkJCWFtcndicGx1c19jb25maWctPnZlcnNpb24gPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLnZlcnNpb247CisJCQlhbXJ3YnBsdXNfY29uZmlnLT5udW1fY2hhbm5lbHMgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLm51bV9jaGFubmVsczsKKwkJCWFtcndicGx1c19jb25maWctPmFtcl9iYW5kX21vZGUgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9iYW5kX21vZGU7CisJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZHR4X21vZGUgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9kdHhfbW9kZTsKKwkJCWFtcndicGx1c19jb25maWctPmFtcl9mcmFtZV9mbXQgPQorCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9mcmFtZV9mbXQ7CisJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfbHNmX2lkeCA9CisJCQkJCWFtcndicGx1c19jb25maWdfMzIuYW1yX2xzZl9pZHg7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiB3YisgY29uZmlnIGludmFsaWQgcGFyYW1ldGVyc1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYXVkaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdWRpby0+Y29kZWNfY2ZnID0KKwlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19hbXJ3YnBsdXNfbWlzYzsKKwlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FtcndicGx1c193c19tZ3I7CisKKwlhdWRpby0+YWMgPQorCXE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7CisJCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCUZPUk1BVF9BTVJfV0JfUExVUyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiYW1yd2JwbHVzIE5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9BTVJfV0JfUExVUyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2Vycigid2IrIFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoImF1ZGlvX2FtcndicGx1cyBOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwljb25maWdfZGVidWdfZnMoYXVkaW8pOworCXByX2RlYnVnKCIlczogQU1SV0JQTFVTIGRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAorCQlhdWRpby0+ZmVlZGJhY2ssCisJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1yd2JwbHVzX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhdWRpb19vcGVuLAorCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCisJLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAorCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3YnBsdXNfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX2FtcndicGx1cyIsCisJLmZvcHMgPSAmYXVkaW9fYW1yd2JwbHVzX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19hbXJ3YnBsdXNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJ3YnBsdXNfbWlzYyk7CisKKwlpZiAocmV0ID09IDApCisJCWRldmljZV9pbml0X3dha2V1cChhdWRpb19hbXJ3YnBsdXNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7CisJYXVkaW9fYW1yd2JwbHVzX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19hbXJ3YnBsdXNfd3NfbWdyLndzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2FtcndicGx1c19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYXBlLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZGMwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FwZS5jCkBAIC0wLDAgKzEsMzU5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYXBlX21pc2M7CitzdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb19hcGVfd3NfbWdyOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hcGVfZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQlOVUxMLCAodm9pZCAqKWRhdGEsICZhdWRpb19hcGVfZGVidWdfZm9wcyk7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJc3RydWN0IGFzbV9hcGVfY2ZnIGFwZV9jZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyAqYXBlX2NvbmZpZzsKKworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWFwZV9jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJYXBlX2NmZy5jb21wYXRpYmxlX3ZlcnNpb24gPSBhcGVfY29uZmlnLT5jb21wYXRpYmxlVmVyc2lvbjsKKwkJYXBlX2NmZy5jb21wcmVzc2lvbl9sZXZlbCA9IGFwZV9jb25maWctPmNvbXByZXNzaW9uTGV2ZWw7CisJCWFwZV9jZmcuZm9ybWF0X2ZsYWdzID0gYXBlX2NvbmZpZy0+Zm9ybWF0RmxhZ3M7CisJCWFwZV9jZmcuYmxvY2tzX3Blcl9mcmFtZSA9IGFwZV9jb25maWctPmJsb2Nrc1BlckZyYW1lOworCQlhcGVfY2ZnLmZpbmFsX2ZyYW1lX2Jsb2NrcyA9IGFwZV9jb25maWctPmZpbmFsRnJhbWVCbG9ja3M7CisJCWFwZV9jZmcudG90YWxfZnJhbWVzID0gYXBlX2NvbmZpZy0+dG90YWxGcmFtZXM7CisJCWFwZV9jZmcuYml0c19wZXJfc2FtcGxlID0gYXBlX2NvbmZpZy0+Yml0c1BlclNhbXBsZTsKKwkJYXBlX2NmZy5udW1fY2hhbm5lbHMgPSBhcGVfY29uZmlnLT5udW1DaGFubmVsczsKKwkJYXBlX2NmZy5zYW1wbGVfcmF0ZSA9IGFwZV9jb25maWctPnNhbXBsZVJhdGU7CisJCWFwZV9jZmcuc2Vla190YWJsZV9wcmVzZW50ID0gYXBlX2NvbmZpZy0+c2Vla1RhYmxlUHJlc2VudDsKKwkJcHJfZGVidWcoIiVzOiBjb21wYXRpYmxlVmVyc2lvbiAlZCBjb21wcmVzc2lvbkxldmVsICVkIGZvcm1hdEZsYWdzICVkIGJsb2Nrc1BlckZyYW1lICVkIGZpbmFsRnJhbWVCbG9ja3MgJWQgdG90YWxGcmFtZXMgJWQgYml0c1BlclNhbXBsZSAlZCBudW1DaGFubmVscyAlZCBzYW1wbGVSYXRlICVkIHNlZWtUYWJsZVByZXNlbnQgJWRcbiIsCisJCQkJX19mdW5jX18sIGFwZV9jb25maWctPmNvbXBhdGlibGVWZXJzaW9uLAorCQkJCWFwZV9jb25maWctPmNvbXByZXNzaW9uTGV2ZWwsCisJCQkJYXBlX2NvbmZpZy0+Zm9ybWF0RmxhZ3MsCisJCQkJYXBlX2NvbmZpZy0+YmxvY2tzUGVyRnJhbWUsCisJCQkJYXBlX2NvbmZpZy0+ZmluYWxGcmFtZUJsb2NrcywKKwkJCQlhcGVfY29uZmlnLT50b3RhbEZyYW1lcywKKwkJCQlhcGVfY29uZmlnLT5iaXRzUGVyU2FtcGxlLAorCQkJCWFwZV9jb25maWctPm51bUNoYW5uZWxzLAorCQkJCWFwZV9jb25maWctPnNhbXBsZVJhdGUsCisJCQkJYXBlX2NvbmZpZy0+c2Vla1RhYmxlUHJlc2VudCk7CisJCS8qIENvbmZpZ3VyZSBNZWRpYSBmb3JtYXQgYmxvY2sgKi8KKwkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYXBlKGF1ZGlvLT5hYywgJmFwZV9jZmcsCisJCQkJCQkJYXVkaW8tPmFjLT5zdHJlYW1faWQpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoImNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLCBhdWRpby0+ZW5hYmxlZCk7CisJCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQVBFX0NPTkZJRzogeworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+Y29kZWNfY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOmNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FQRV9DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BUEVfQ09ORklHOiB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihhdWRpby0+Y29kZWNfY2ZnLCAodm9pZCAqKWFyZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczpjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FQRV9DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiRmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwgcmMpOworCQlicmVhazsKKwl9CisJfQorCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZ18zMiB7CisJdTE2IGNvbXBhdGlibGVWZXJzaW9uOworCXUxNiBjb21wcmVzc2lvbkxldmVsOworCXUzMiBmb3JtYXRGbGFnczsKKwl1MzIgYmxvY2tzUGVyRnJhbWU7CisJdTMyIGZpbmFsRnJhbWVCbG9ja3M7CisJdTMyIHRvdGFsRnJhbWVzOworCXUxNiBiaXRzUGVyU2FtcGxlOworCXUxNiBudW1DaGFubmVsczsKKwl1MzIgc2FtcGxlUmF0ZTsKKwl1MzIgc2Vla1RhYmxlUHJlc2VudDsKKworfTsKKworZW51bSB7CisJQVVESU9fR0VUX0FQRV9DT05GSUdfMzIgPSAgX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZ18zMiksCisJQVVESU9fU0VUX0FQRV9DT05GSUdfMzIgPSAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZ18zMikKK307CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0FQRV9DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnICphcGVfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWdfMzIgYXBlX2NvbmZpZ18zMjsKKworCQltZW1zZXQoJmFwZV9jb25maWdfMzIsIDAsIHNpemVvZihhcGVfY29uZmlnXzMyKSk7CisKKwkJYXBlX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQlhcGVfY29uZmlnXzMyLmNvbXBhdGlibGVWZXJzaW9uID0gYXBlX2NvbmZpZy0+Y29tcGF0aWJsZVZlcnNpb247CisJCWFwZV9jb25maWdfMzIuY29tcHJlc3Npb25MZXZlbCA9CisJCQkJYXBlX2NvbmZpZy0+Y29tcHJlc3Npb25MZXZlbDsKKwkJYXBlX2NvbmZpZ18zMi5mb3JtYXRGbGFncyA9IGFwZV9jb25maWctPmZvcm1hdEZsYWdzOworCQlhcGVfY29uZmlnXzMyLmJsb2Nrc1BlckZyYW1lID0gYXBlX2NvbmZpZy0+YmxvY2tzUGVyRnJhbWU7CisJCWFwZV9jb25maWdfMzIuZmluYWxGcmFtZUJsb2NrcyA9IGFwZV9jb25maWctPmZpbmFsRnJhbWVCbG9ja3M7CisJCWFwZV9jb25maWdfMzIudG90YWxGcmFtZXMgPSBhcGVfY29uZmlnLT50b3RhbEZyYW1lczsKKwkJYXBlX2NvbmZpZ18zMi5iaXRzUGVyU2FtcGxlID0gYXBlX2NvbmZpZy0+Yml0c1BlclNhbXBsZTsKKwkJYXBlX2NvbmZpZ18zMi5udW1DaGFubmVscyA9IGFwZV9jb25maWctPm51bUNoYW5uZWxzOworCQlhcGVfY29uZmlnXzMyLnNhbXBsZVJhdGUgPSBhcGVfY29uZmlnLT5zYW1wbGVSYXRlOworCQlhcGVfY29uZmlnXzMyLnNlZWtUYWJsZVByZXNlbnQgPSBhcGVfY29uZmlnLT5zZWVrVGFibGVQcmVzZW50OworCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhcGVfY29uZmlnXzMyLAorCQkJc2l6ZW9mKGFwZV9jb25maWdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBHRVRfQVBFX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9BUEVfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyAqYXBlX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnXzMyIGFwZV9jb25maWdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhcGVfY29uZmlnXzMyLCAodm9pZCAqKWFyZywKKwkJCXNpemVvZihhcGVfY29uZmlnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBTRVRfQVBFX0NPTkZJR18zMiBmYWlsZWRcbiIKKwkJCQksIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWFwZV9jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJYXBlX2NvbmZpZy0+Y29tcGF0aWJsZVZlcnNpb24gPSBhcGVfY29uZmlnXzMyLmNvbXBhdGlibGVWZXJzaW9uOworCQlhcGVfY29uZmlnLT5jb21wcmVzc2lvbkxldmVsID0KKwkJCQlhcGVfY29uZmlnXzMyLmNvbXByZXNzaW9uTGV2ZWw7CisJCWFwZV9jb25maWctPmZvcm1hdEZsYWdzID0gYXBlX2NvbmZpZ18zMi5mb3JtYXRGbGFnczsKKwkJYXBlX2NvbmZpZy0+YmxvY2tzUGVyRnJhbWUgPSBhcGVfY29uZmlnXzMyLmJsb2Nrc1BlckZyYW1lOworCQlhcGVfY29uZmlnLT5maW5hbEZyYW1lQmxvY2tzID0gYXBlX2NvbmZpZ18zMi5maW5hbEZyYW1lQmxvY2tzOworCQlhcGVfY29uZmlnLT50b3RhbEZyYW1lcyA9IGFwZV9jb25maWdfMzIudG90YWxGcmFtZXM7CisJCWFwZV9jb25maWctPmJpdHNQZXJTYW1wbGUgPSBhcGVfY29uZmlnXzMyLmJpdHNQZXJTYW1wbGU7CisJCWFwZV9jb25maWctPm51bUNoYW5uZWxzID0gYXBlX2NvbmZpZ18zMi5udW1DaGFubmVsczsKKwkJYXBlX2NvbmZpZy0+c2FtcGxlUmF0ZSA9IGFwZV9jb25maWdfMzIuc2FtcGxlUmF0ZTsKKwkJYXBlX2NvbmZpZy0+c2Vla1RhYmxlUHJlc2VudCA9IGFwZV9jb25maWdfMzIuc2Vla1RhYmxlUHJlc2VudDsKKworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX2FwZV8iICsgNV07CisKKwlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOworCWlmICghYXVkaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJYXVkaW8tPmNvZGVjX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghYXVkaW8tPmNvZGVjX2NmZykgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19hcGVfbWlzYzsKKwlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FwZV93c19tZ3I7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCisJCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7CisJCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfQVBFKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQkvKiBvcGVuIEFQRSBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfQVBFKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fYXBlXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOworCWF1ZGlvLT5kZW50cnkgPSBjb25maWdfZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAodm9pZCAqKWF1ZGlvKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChhdWRpby0+ZGVudHJ5KSkKKwkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKKwlwcl9kZWJ1ZygiJXM6YXBlZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpby0+ZmVlZGJhY2ssCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCXJldHVybiByYzsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hcGVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCisJLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FwZV9taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJtc21fYXBlIiwKKwkuZm9wcyA9ICZhdWRpb19hcGVfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2FwZV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2FwZV9taXNjKTsKKworCWlmIChyZXQgPT0gMCkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX2FwZV9taXNjLnRoaXNfZGV2aWNlLCB0cnVlKTsKKwlhdWRpb19hcGVfd3NfbWdyLnJlZl9jbnQgPSAwOworCW11dGV4X2luaXQoJmF1ZGlvX2FwZV93c19tZ3Iud3NfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwoYXVkaW9fYXBlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19ldnJjLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2V2cmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc2MjMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19ldnJjLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIGV2cmMgYXVkaW8gb3V0cHV0IGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19ldnJjX21pc2M7CitzdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb19ldnJjX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZXZyY19kZWJ1Z19mb3BzID0geworCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCisJLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKK307CisjZW5kaWYKKworc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJYXVkaW8tPmVvc19yc3AgPSAwOworCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQlpZiAoIXJjKSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDA7CisJCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCQkJYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOworCWludCByYyA9IDA7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLworCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9ldnJjXyIgKyA1XTsKKyNlbmRpZgorCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYXVkaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAorCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKKwkgKi8KKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47CisJYXVkaW8tPm1pc2NkZXZpY2UgPSAmYXVkaW9fZXZyY19taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fZXZyY193c19tZ3I7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCisJCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKKwkJCQkJICAgRk9STUFUX0VWUkMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9FVlJDKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fZXZyY18lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKKwkJCQkJICAgIE5VTEwsICh2b2lkICopYXVkaW8sCisJCQkJCSAgICAmYXVkaW9fZXZyY19kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczpkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIHJjOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2V2cmNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZXZyY19taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJtc21fZXZyYyIsCisJLmZvcHMgPSAmYXVkaW9fZXZyY19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fZXZyY19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2V2cmNfbWlzYyk7CisKKwlpZiAocmV0ID09IDApCisJCWRldmljZV9pbml0X3dha2V1cChhdWRpb19ldnJjX21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX2V2cmNfd3NfbWdyLnJlZl9jbnQgPSAwOworCW11dGV4X2luaXQoJmF1ZGlvX2V2cmNfd3NfbWdyLndzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2V2cmNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2c3MTFhbGF3LmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2c3MTFhbGF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmODdlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMWFsYXcuYwpAQCAtMCwwICsxLDM5NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19nNzExX2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZzcxMWFsYXdfbWlzYzsKK3N0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2c3MTFfd3NfbWdyOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19nNzExX2RlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKKwkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJTlVMTCwgKHZvaWQgKilkYXRhLCAmYXVkaW9fZzcxMV9kZWJ1Z19mb3BzKTsKK30KKworc3RhdGljIGludCBnNzExX2NoYW5uZWxfbWFwKHU4ICpjaGFubmVsX21hcHBpbmcsIHVpbnQzMl90IGNoYW5uZWxzKTsKKworc3RhdGljIGxvbmcgYXVkaW9faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlzdHJ1Y3QgYXNtX2c3MTFfZGVjX2NmZyBnNzExX2RlY19jZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICpnNzExX2RlY19jb25maWc7CisJCXU4IGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07CisKKwkJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOworCQltZW1zZXQoJmc3MTFfZGVjX2NmZywgMCwgc2l6ZW9mKGc3MTFfZGVjX2NmZykpOworCisJCWlmIChnNzExX2NoYW5uZWxfbWFwKGNoYW5uZWxfbWFwcGluZywKKwkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpKSB7CisJCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGNoYW5uZWwgbWFwIGZhaWxlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCQl9CisKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKKwkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCisJCQkJCTE2LCAvKmJpdHMgcGVyIHNhbXBsZSovCisJCQkJCWZhbHNlLCBmYWxzZSwgY2hhbm5lbF9tYXBwaW5nKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCQkgX19mdW5jX18sIHJjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlnNzExX2RlY19jb25maWcgPQorCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJZzcxMV9kZWNfY2ZnLnNhbXBsZV9yYXRlID0gZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKKwkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLworCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKGF1ZGlvLT5hYywgJmc3MTFfZGVjX2NmZywKKwkJCQkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IGNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCisJCQkJCSBfX2Z1bmNfXywgYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRzogeworCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IEZhaWxlZCBpbiBhdWRpb19haW9faW9jdGw6ICVkIGNtZD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMsIGNtZCk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuICByYzsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnXzMyIHsKKwl1MzIgc2FtcGxlX3JhdGU7Cit9OworCitlbnVtIHsKKwlBVURJT19TRVRfRzcxMV9ERUNfQ09ORklHXzMyID0gIF9JT1coQVVESU9fSU9DVExfTUFHSUMsCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMiksCisJQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJR18zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIpCit9OworCitzdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOworCisJCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7CisKKwkJZzcxMV9kZWNfY29uZmlnID0KKwkJCShzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7CisJCWc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmc3MTFfZGVjX2NvbmZpZ18zMiwKKwkJCXNpemVvZihnNzExX2RlY19jb25maWdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOworCisJCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnNzExX2RlY19jb25maWdfMzIsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKGc3MTFfZGVjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlnNzExX2RlY19jb25maWcgPQorCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZTsKKworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgaW4gYXVkaW9fYWlvX2NvbXBhdF9pb2N0bDogJWQgY21kPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYywgY21kKTsKKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX2c3MTFfIiArIDVdOworCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmICghYXVkaW8pCisJCXJldHVybiAtRU5PTUVNOworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghYXVkaW8tPmNvZGVjX2NmZykgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19nNzExYWxhd19taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fZzcxMV93c19tZ3I7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCisJCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLyAvKmZvcmFtdDpHNzExX0FMQVcqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfRzcxMV9BTEFXX0ZTKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCS8qIG9wZW4gRzcxMSBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9BTEFXX0ZTKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiAlZCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgbW9kZVxuIiwKKwkJCQlfX2Z1bmNfXywgZmlsZS0+Zl9tb2RlKTsKKwkJcmMgPSAtRUFDQ0VTOworCQlnb3RvIGZhaWw7CisJfQorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2c3MTFfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsICh2b2lkICopYXVkaW8pOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5kZW50cnkpKQorCQlwcl9kZWJ1ZygiJXM6IGRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoIiVzOiBnNzExZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpby0+ZmVlZGJhY2ssCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCXJldHVybiByYzsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGc3MTFfY2hhbm5lbF9tYXAodTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMpCit7CisJdTggKmxjaGFubmVsX21hcHBpbmc7CisKKwlsY2hhbm5lbF9tYXBwaW5nID0gY2hhbm5lbF9tYXBwaW5nOworCXByX2RlYnVnKCIlczogY2hhbm5lbHMgcGFzc2VkOiAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWxzKTsKKwlpZiAoY2hhbm5lbHMgPT0gMSkgIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDMpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDQpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0NTOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNSkgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDYpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOworCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7CisJCWxjaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9MRkU7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA3KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfQ1M7CisJCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9MRkU7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA4KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s2XSA9IFBDTV9DSEFOTkVMX1JTOworCQlsY2hhbm5lbF9tYXBwaW5nWzddID0gUENNX0NIQU5ORUxfTEZFOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEVSUk9SLnVuc3VwcG9ydGVkIG51bV9jaCA9ICV1XG4iLAorCQkJCV9fZnVuY19fLCBjaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZzcxMV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXVkaW9fb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwsCisJLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2c3MTFhbGF3X21pc2MgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gIm1zbV9nNzExYWxhdyIsCisJLmZvcHMgPSAmYXVkaW9fZzcxMV9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fZzcxMWFsYXdfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19nNzExYWxhd19taXNjKTsKKworCWlmIChyZXQgPT0gMCkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX2c3MTFhbGF3X21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX2c3MTFfd3NfbWdyLnJlZl9jbnQgPSAwOworCW11dGV4X2luaXQoJmF1ZGlvX2c3MTFfd3NfbWdyLndzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19nNzExYWxhd19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19nNzExYWxhd19taXNjKTsKKwltdXRleF9kZXN0cm95KCZhdWRpb19nNzExX3dzX21nci53c19sb2NrKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2c3MTFhbGF3X2luaXQpOworX19leGl0Y2FsbChhdWRpb19nNzExYWxhd19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMW1sYXcuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMW1sYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQzNjgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19nNzExbWxhdy5jCkBAIC0wLDAgKzEsMzk2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2c3MTFfZGVjLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19nNzExbWxhd19taXNjOworc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fZzcxMV93c19tZ3I7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2c3MTFfZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY29uZmlnX2RlYnVnZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKKwkJCQlOVUxMLCAodm9pZCAqKWRhdGEsICZhdWRpb19nNzExX2RlYnVnX2ZvcHMpOworfQorCitzdGF0aWMgaW50IGc3MTFfY2hhbm5lbF9tYXAodTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMpOworCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBhc21fZzcxMV9kZWNfY2ZnIGc3MTFfZGVjX2NmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKKwkJdTggY2hhbm5lbF9tYXBwaW5nW1BDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMXTsKKworCQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisJCW1lbXNldCgmZzcxMV9kZWNfY2ZnLCAwLCBzaXplb2YoZzcxMV9kZWNfY2ZnKSk7CisKKwkJaWYgKGc3MTFfY2hhbm5lbF9tYXAoY2hhbm5lbF9tYXBwaW5nLAorCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCkpIHsKKwkJCXByX2VycigiJXM6IHNldHRpbmcgY2hhbm5lbCBtYXAgZmFpbGVkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCX0KKworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjIoYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCwKKwkJCQkJMTYsIC8qYml0cyBwZXIgc2FtcGxlKi8KKwkJCQkJZmFsc2UsIGZhbHNlLCBjaGFubmVsX21hcHBpbmcpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6IHBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgcmMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWc3MTFfZGVjX2NvbmZpZyA9CisJCQkoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQlnNzExX2RlY19jZmcuc2FtcGxlX3JhdGUgPSBnNzExX2RlY19jb25maWctPnNhbXBsZV9yYXRlOworCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2c3MTEoYXVkaW8tPmFjLCAmZzcxMV9kZWNfY2ZnLAorCQkJCQkJCWF1ZGlvLT5hYy0+c3RyZWFtX2lkKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogY21kIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCIlczogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKKwkJCQkJCV9fZnVuY19fLCBhdWRpby0+ZW5hYmxlZCk7CisJCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmNvZGVjX2NmZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOiBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRzogeworCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogRmFpbGVkIGluIGF1ZGlvX2Fpb19pb2N0bDogJWQgY21kPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYywgY21kKTsKKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgeworCXUzMiBzYW1wbGVfcmF0ZTsKK307CisKK2VudW0geworCUFVRElPX1NFVF9HNzExX0RFQ19DT05GSUdfMzIgPSAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnXzMyKSwKKwlBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHXzMyID0gIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMikKK307CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqZzcxMV9kZWNfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMiBnNzExX2RlY19jb25maWdfMzI7CisKKwkJbWVtc2V0KCZnNzExX2RlY19jb25maWdfMzIsIDAsIHNpemVvZihnNzExX2RlY19jb25maWdfMzIpKTsKKworCQlnNzExX2RlY19jb25maWcgPQorCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJZzcxMV9kZWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlID0gZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmZzcxMV9kZWNfY29uZmlnXzMyLAorCQkJc2l6ZW9mKGc3MTFfZGVjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqZzcxMV9kZWNfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMiBnNzExX2RlY19jb25maWdfMzI7CisKKwkJbWVtc2V0KCZnNzExX2RlY19jb25maWdfMzIsIDAsIHNpemVvZihnNzExX2RlY19jb25maWdfMzIpKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmc3MTFfZGVjX2NvbmZpZ18zMiwgKHZvaWQgKilhcmcsCisJCQlzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfRzcxMV9ERUNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlnNzExX2RlY19jb25maWcgPQorCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZTsKKworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgaW4gYXVkaW9fYWlvX2NvbXBhdF9pb2N0bDogJWQgY21kPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYywgY21kKTsKKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX2c3MTFfIiArIDVdOworCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmICghYXVkaW8pCisJCXJldHVybiAtRU5PTUVNOworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghYXVkaW8tPmNvZGVjX2NmZykgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19nNzExbWxhd19taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fZzcxMV93c19tZ3I7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCisJCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWw7CisJfQorCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovIC8qZm9yYW10Okc3MTFfQUxBVyovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCSAgIEZPUk1BVF9HNzExX01MQVdfRlMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJLyogb3BlbiBHNzExIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMSovCisJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9HNzExX01MQVdfRlMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6ICVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sCisJCQkJCWZpbGUtPmZfbW9kZSk7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9nNzExXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOworCWF1ZGlvLT5kZW50cnkgPSBjb25maWdfZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAodm9pZCAqKWF1ZGlvKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChhdWRpby0+ZGVudHJ5KSkKKwkJcHJfZGVidWcoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCXByX2RlYnVnKCIlczogZzcxMWRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8tPmZlZWRiYWNrLAorCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gcmM7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnNzExX2NoYW5uZWxfbWFwKHU4ICpjaGFubmVsX21hcHBpbmcsIHVpbnQzMl90IGNoYW5uZWxzKQoreworCXU4ICpsY2hhbm5lbF9tYXBwaW5nOworCisJbGNoYW5uZWxfbWFwcGluZyA9IGNoYW5uZWxfbWFwcGluZzsKKwlwcl9kZWJ1ZygiJXM6IGNoYW5uZWxzIHBhc3NlZDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVscyk7CisJaWYgKGNoYW5uZWxzID09IDEpICB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDIpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSAzKSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA0KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9DUzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDUpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOworCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA2KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTEZFOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNykgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX0NTOworCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfTEZFOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gOCkgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTEM7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUkM7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9SUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s3XSA9IFBDTV9DSEFOTkVMX0xGRTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFUlJPUi51bnN1cHBvcnRlZCBudW1fY2ggPSAldVxuIiwKKwkJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2c3MTFfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsLAorCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19nNzExbWxhd19taXNjID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJtc21fZzcxMW1sYXciLAorCS5mb3BzID0gJmF1ZGlvX2c3MTFfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2c3MTFtbGF3X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fZzcxMW1sYXdfbWlzYyk7CisKKwlpZiAocmV0ID09IDApCisJCWRldmljZV9pbml0X3dha2V1cChhdWRpb19nNzExbWxhd19taXNjLnRoaXNfZGV2aWNlLCB0cnVlKTsKKwlhdWRpb19nNzExX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19nNzExX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19nNzExbWxhd19leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19nNzExbWxhd19taXNjKTsKKwltdXRleF9kZXN0cm95KCZhdWRpb19nNzExX3dzX21nci53c19sb2NrKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2c3MTFtbGF3X2luaXQpOworX19leGl0Y2FsbChhdWRpb19nNzExbWxhd19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9faHdhY2NfZWZmZWN0cy5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19od2FjY19lZmZlY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNzkyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9faHdhY2NfZWZmZWN0cy5jCkBAIC0wLDAgKzEsNzg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlICJxNmF1ZGlvX2NvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorI2luY2x1ZGUgPHNvdW5kL21zbS1hdWRpby1lZmZlY3RzLXE2LXYyLmg+CisjaW5jbHVkZSA8c291bmQvbXNtLWR0cy1lYWdsZS5oPgorCisjZGVmaW5lIE1BWF9DSEFOTkVMU19TVVBQT1JURUQJCTgKKyNkZWZpbmUgV0FJVF9USU1FRE9VVF9EVVJBVElPTl9TRUNTCTEKKworc3RydWN0IHE2YXVkaW9fZWZmZWN0cyB7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXJlYWRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJd3JpdGVfd2FpdDsKKworCXN0cnVjdCBhdWRpb19jbGllbnQgICAgICAgICAgICAgKmFjOworCXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWcgIGNvbmZpZzsKKworCWF0b21pY190CQkJaW5fY291bnQ7CisJYXRvbWljX3QJCQlvdXRfY291bnQ7CisKKwlpbnQJCQkJb3BlbmVkOworCWludAkJCQlzdGFydGVkOworCWludAkJCQlidWZfYWxsb2M7CisJc3RydWN0IG1zbV9udF9lZmZfYWxsX2NvbmZpZyBhdWRpb19lZmZlY3RzOworfTsKKworc3RhdGljIHZvaWQgYXVkaW9fZWZmZWN0c19pbml0X3BwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgc29mdHZvbCA9IHsKKwkJLnBlcmlvZCA9IFNPRlRfVk9MVU1FX1BFUklPRCwKKwkJLnN0ZXAgPSBTT0ZUX1ZPTFVNRV9TVEVQLAorCQkucmFtcGluZ2N1cnZlID0gU09GVF9WT0xVTUVfQ1VSVkVfTElORUFSLAorCX07CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBudWxsIHRvIGluaXQgcHBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKGFjLT50b3BvbG9neSkgeworCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVI6CisKKwkJcmV0ID0gcTZhc21fc2V0X3NvZnR2b2x1bWVfdjIoYWMsICZzb2Z0dm9sLAorCQkJCQkgICAgICBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUxIFBhcmFtIGZhaWxlZCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXJldCA9IHE2YXNtX3NldF9zb2Z0dm9sdW1lX3YyKGFjLCAmc29mdHZvbCwKKwkJCQkJICAgICAgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMik7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0Vm9sdW1lMiBQYXJhbSBmYWlsZWQgcmV0PSVkXG4iLAorCQkJCSBfX2Z1bmNfXywgcmV0KTsKKworCQltc21fZHRzX2VhZ2xlX2luaXRfbWFzdGVyX21vZHVsZShhYyk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gcTZhc21fc2V0X3NvZnR2b2x1bWVfdjIoYWMsICZzb2Z0dm9sLAorCQkJCQkgICAgICBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdWRpb19lZmZlY3RzX2RlaW5pdF9wcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKK3sKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBudWxsIHRvIGRlaW5pdCBwcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoYWMtPnRvcG9sb2d5KSB7CisJY2FzZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX01BU1RFUjoKKwkJbXNtX2R0c19lYWdsZV9kZWluaXRfbWFzdGVyX21vZHVsZShhYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYXVkaW9fZWZmZWN0c19ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCQkJIHVpbnQzMl90ICpwYXlsb2FkLCAgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzOworCisJaWYgKCFwYXlsb2FkIHx8ICFwcml2KSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGF0YSB0byBoYW5kbGUgZXZlbnRzLCBwYXlsb2FkOiAlcEssIHByaXY6ICVwS1xuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkLCBwcml2KTsKKwkJcmV0dXJuOworCX0KKworCWVmZmVjdHMgPSAoc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqKXByaXY7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6IHsKKwkJYXRvbWljX2luYygmZWZmZWN0cy0+b3V0X2NvdW50KTsKKwkJd2FrZV91cCgmZWZmZWN0cy0+d3JpdGVfd2FpdCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMjogeworCQlhdG9taWNfaW5jKCZlZmZlY3RzLT5pbl9jb3VudCk7CisJCXdha2VfdXAoJmVmZmVjdHMtPnJlYWRfd2FpdCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOiB7CisJCXByX2RlYnVnKCIlczogQVBSX0JBU0lDX1JTUF9SRVNVTFQgQ21kWzB4JXhdIFN0YXR1c1sweCV4XVxuIiwKKwkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCXN3aXRjaCAocGF5bG9hZFswXSkgeworCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI6CisJCQlwcl9kZWJ1ZygiQVNNX1NFU1NJT05fQ01EX1JVTl9WMlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczogUGF5bG9hZCA9IFsweCV4XSBzdGF0WzB4JXhdXG4iLAorCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiBVbmhhbmRsZWQgRXZlbnQgMHgleCB0b2tlbiA9IDB4JXhcbiIsCisJCQkgX19mdW5jX18sIG9wY29kZSwgdG9rZW4pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZWZmZWN0c19zaGFyZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqZWZmZWN0cyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlRcbiIsIF9fZnVuY19fKTsKKworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZV92MihlZmZlY3RzLT5hYywKKwkJCQkJRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCUZPUk1BVF9NVUxUSV9DSEFOTkVMX0xJTkVBUl9QQ00sCisJCQkJCWVmZmVjdHMtPmNvbmZpZy5tZXRhX21vZGVfZW5hYmxlZCwKKwkJCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5iaXRzX3Blcl9zYW1wbGUsCisJCQkJCXRydWUgLypvdmVyd3JpdGUgdG9wb2xvZ3kqLywKKwkJCQkJQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBPcGVuIGZhaWxlZCBmb3IgaHcgYWNjZWxlcmF0ZWQgZWZmZWN0czpyYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBpb2N0bF9mYWlsOworCQl9CisJCWVmZmVjdHMtPm9wZW5lZCA9IDE7CisKKwkJcHJfZGVidWcoIiVzOiBkZWMgYnVmIHNpemU6ICVkLCBudW1fYnVmOiAlZCwgZW5jIGJ1ZiBzaXplOiAlZCwgbnVtX2J1ZjogJWRcbiIsCisJCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuYnVmX3NpemUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fYnVmLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5idWZfc2l6ZSwKKwkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2J1Zik7CisJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvY19jb250aWd1b3VzKElOLCBlZmZlY3RzLT5hYywKKwkJCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5idWZfc2l6ZSwKKwkJCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fYnVmKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogV3JpdGUgYnVmZmVyIEFsbG9jYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gaW9jdGxfZmFpbDsKKwkJfQorCQlhdG9taWNfc2V0KCZlZmZlY3RzLT5pbl9jb3VudCwgZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9idWYpOworCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhPVVQsIGVmZmVjdHMtPmFjLAorCQkJCQllZmZlY3RzLT5jb25maWcuaW5wdXQuYnVmX3NpemUsCisJCQkJCWVmZmVjdHMtPmNvbmZpZy5pbnB1dC5udW1fYnVmKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogUmVhZCBidWZmZXIgQWxsb2NhdGlvbiBmYWlsZWQgcmMgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byByZWFkYnVmX2ZhaWw7CisJCX0KKwkJYXRvbWljX3NldCgmZWZmZWN0cy0+b3V0X2NvdW50LCBlZmZlY3RzLT5jb25maWcub3V0cHV0Lm51bV9idWYpOworCQllZmZlY3RzLT5idWZfYWxsb2MgPSAxOworCisJCXByX2RlYnVnKCIlczogZW5jOiBzYW1wbGVfcmF0ZTogJWQsIG51bV9jaGFubmVsczogJWRcbiIsCisJCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5zYW1wbGVfcmF0ZSwKKwkJCWVmZmVjdHMtPmNvbmZpZy5pbnB1dC5udW1fY2hhbm5lbHMpOworCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShlZmZlY3RzLT5hYywKKwkJCQkJICAgZWZmZWN0cy0+Y29uZmlnLmlucHV0LnNhbXBsZV9yYXRlLAorCQkJCQkgICBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2NoYW5uZWxzKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogcGNtIHJlYWQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBjZmdfZmFpbDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IGRlYzogc2FtcGxlX3JhdGU6ICVkLCBudW1fY2hhbm5lbHM6ICVkLCBiaXRfd2lkdGg6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcub3V0cHV0LnNhbXBsZV9yYXRlLAorCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fY2hhbm5lbHMsCisJCQllZmZlY3RzLT5jb25maWcub3V0cHV0LmJpdHNfcGVyX3NhbXBsZSk7CisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydCgKKwkJCQllZmZlY3RzLT5hYywgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5zYW1wbGVfcmF0ZSwKKwkJCQllZmZlY3RzLT5jb25maWcub3V0cHV0Lm51bV9jaGFubmVscywKKwkJCQllZmZlY3RzLT5jb25maWcub3V0cHV0LmJpdHNfcGVyX3NhbXBsZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IHBjbSB3cml0ZSBmb3JtYXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGNmZ19mYWlsOworCQl9CisKKwkJYXVkaW9fZWZmZWN0c19pbml0X3BwKGVmZmVjdHMtPmFjKTsKKworCQlyYyA9IHE2YXNtX3J1bihlZmZlY3RzLT5hYywgMHgwMCwgMHgwMCwgMHgwMCk7CisJCWlmICghcmMpCisJCQllZmZlY3RzLT5zdGFydGVkID0gMTsKKwkJZWxzZSB7CisJCQllZmZlY3RzLT5zdGFydGVkID0gMDsKKwkJCXByX2VycigiJXM6IEFTTSBydW4gc3RhdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fRUZGRUNUU19XUklURTogeworCQljaGFyICpidWZwdHIgPSBOVUxMOworCQl1aW50MzJfdCBpZHggPSAwOworCQl1aW50MzJfdCBzaXplID0gMDsKKworCQlpZiAoIWVmZmVjdHMtPnN0YXJ0ZWQpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gaW9jdGxfZmFpbDsKKwkJfQorCisJCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGVmZmVjdHMtPndyaXRlX3dhaXQsCisJCQkJCWF0b21pY19yZWFkKCZlZmZlY3RzLT5vdXRfY291bnQpLAorCQkJCQlXQUlUX1RJTUVET1VUX0RVUkFUSU9OX1NFQ1MgKiBIWik7CisJCWlmICghcmMpIHsKKwkJCXByX2VycigiJXM6IHdyaXRlIHdhaXRfZXZlbnRfdGltZW91dFxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBpb2N0bF9mYWlsOworCQl9CisJCWlmICghYXRvbWljX3JlYWQoJmVmZmVjdHMtPm91dF9jb3VudCkpIHsKKwkJCXByX2VycigiJXM6IHBjbSBzdG9wcGVkIG91dF9jb3VudCAwXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIGlvY3RsX2ZhaWw7CisJCX0KKworCQlidWZwdHIgPSBxNmFzbV9pc19jcHVfYnVmX2F2YWlsKElOLCBlZmZlY3RzLT5hYywgJnNpemUsICZpZHgpOworCQlpZiAoYnVmcHRyKSB7CisJCQlpZiAoKGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4gPiBzaXplKSB8fAorCQkJCWNvcHlfZnJvbV91c2VyKGJ1ZnB0ciwgKHZvaWQgKilhcmcsCisJCQkJCWVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4pKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCWdvdG8gaW9jdGxfZmFpbDsKKwkJCX0KKwkJCXJjID0gcTZhc21fd3JpdGUoZWZmZWN0cy0+YWMsCisJCQkJCSBlZmZlY3RzLT5jb25maWcuYnVmX2NmZy5vdXRwdXRfbGVuLAorCQkJCQkgMCwgMCwgTk9fVElNRVNUQU1QKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJZ290byBpb2N0bF9mYWlsOworCQkJfQorCQkJYXRvbWljX2RlYygmZWZmZWN0cy0+b3V0X2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IEFVRElPX0VGRkVDVFNfV1JJVEU6IEJ1ZmZlciBkcm9wcGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19FRkZFQ1RTX1JFQUQ6IHsKKwkJY2hhciAqYnVmcHRyID0gTlVMTDsKKwkJdWludDMyX3QgaWR4ID0gMDsKKwkJdWludDMyX3Qgc2l6ZSA9IDA7CisKKwkJaWYgKCFlZmZlY3RzLT5zdGFydGVkKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIGlvY3RsX2ZhaWw7CisJCX0KKworCQlhdG9taWNfc2V0KCZlZmZlY3RzLT5pbl9jb3VudCwgMCk7CisKKwkJcTZhc21fcmVhZF92MihlZmZlY3RzLT5hYywgZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcuaW5wdXRfbGVuKTsKKwkJLyogUmVhZCBtaWdodCBmYWlsIGluaXRpYWxseSwgZG9uJ3QgZXJyb3Igb3V0ICovCisJCWlmIChyYyA8IDApCisJCQlwcl9lcnIoIiVzOiByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGVmZmVjdHMtPnJlYWRfd2FpdCwKKwkJCQkJYXRvbWljX3JlYWQoJmVmZmVjdHMtPmluX2NvdW50KSwKKwkJCQkJV0FJVF9USU1FRE9VVF9EVVJBVElPTl9TRUNTICogSFopOworCQlpZiAoIXJjKSB7CisJCQlwcl9lcnIoIiVzOiByZWFkIHdhaXRfZXZlbnRfdGltZW91dFxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBpb2N0bF9mYWlsOworCQl9CisJCWlmICghYXRvbWljX3JlYWQoJmVmZmVjdHMtPmluX2NvdW50KSkgeworCQkJcHJfZXJyKCIlczogcGNtIHN0b3BwZWQgaW5fY291bnQgMFxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBpb2N0bF9mYWlsOworCQl9CisKKwkJYnVmcHRyID0gcTZhc21faXNfY3B1X2J1Zl9hdmFpbChPVVQsIGVmZmVjdHMtPmFjLCAmc2l6ZSwgJmlkeCk7CisJCWlmIChidWZwdHIpIHsKKwkJCWlmICghKCh2b2lkICopYXJnKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisJCQl9CisJCQlpZiAoKGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLmlucHV0X2xlbiA+IHNpemUpIHx8CisJCQkJY29weV90b191c2VyKCh2b2lkICopYXJnLCBidWZwdHIsCisJCQkJCSAgZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcuaW5wdXRfbGVuKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlnb3RvIGlvY3RsX2ZhaWw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgZWZmZWN0cyBjb25maWcgbW9kdWxlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQoraW9jdGxfZmFpbDoKKwlyZXR1cm4gcmM7CityZWFkYnVmX2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoSU4sCisJCQkJCWVmZmVjdHMtPmFjKTsKKwlyZXR1cm4gcmM7CitjZmdfZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhJTiwKKwkJCQkJZWZmZWN0cy0+YWMpOworCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKE9VVCwKKwkJCQkJZWZmZWN0cy0+YWMpOworCWVmZmVjdHMtPmJ1Zl9hbGxvYyA9IDA7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19lZmZlY3RzX3NldF9wcF9wYXJhbShzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzLAorCQkJCWxvbmcgKnZhbHVlcykKK3sKKwlpbnQgcmMgPSAwOworCWludCBlZmZlY3RzX21vZHVsZSA9IHZhbHVlc1swXTsKKworCXN3aXRjaCAoZWZmZWN0c19tb2R1bGUpIHsKKwljYXNlIFZJUlRVQUxJWkVSX01PRFVMRToKKwkJcHJfZGVidWcoIiVzOiBWSVJUVUFMSVpFUl9NT0RVTEVcbiIsIF9fZnVuY19fKTsKKwkJaWYgKG1zbV9hdWRpb19lZmZlY3RzX2lzX2VmZm1vZHVsZV9zdXBwX2luX3RvcCgKKwkJCWVmZmVjdHNfbW9kdWxlLCBlZmZlY3RzLT5hYy0+dG9wb2xvZ3kpKQorCQkJbXNtX2F1ZGlvX2VmZmVjdHNfdmlydHVhbGl6ZXJfaGFuZGxlcigKKwkJCQllZmZlY3RzLT5hYywKKwkJCQkmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMudmlydHVhbGl6ZXIpLAorCQkJCShsb25nICopJnZhbHVlc1sxXSk7CisJCWJyZWFrOworCWNhc2UgUkVWRVJCX01PRFVMRToKKwkJcHJfZGVidWcoIiVzOiBSRVZFUkJfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoCisJCQllZmZlY3RzX21vZHVsZSwgZWZmZWN0cy0+YWMtPnRvcG9sb2d5KSkKKwkJCW1zbV9hdWRpb19lZmZlY3RzX3JldmVyYl9oYW5kbGVyKGVmZmVjdHMtPmFjLAorCQkJCSAmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMucmV2ZXJiKSwKKwkJCQkgKGxvbmcgKikmdmFsdWVzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBCQVNTX0JPT1NUX01PRFVMRToKKwkJcHJfZGVidWcoIiVzOiBCQVNTX0JPT1NUX01PRFVMRVxuIiwgX19mdW5jX18pOworCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKAorCQkJZWZmZWN0c19tb2R1bGUsIGVmZmVjdHMtPmFjLT50b3BvbG9neSkpCisJCQltc21fYXVkaW9fZWZmZWN0c19iYXNzX2Jvb3N0X2hhbmRsZXIoCisJCQkJZWZmZWN0cy0+YWMsCisJCQkJJihlZmZlY3RzLT5hdWRpb19lZmZlY3RzLmJhc3NfYm9vc3QpLAorCQkJCShsb25nICopJnZhbHVlc1sxXSk7CisJCWJyZWFrOworCWNhc2UgUEJFX01PRFVMRToKKwkJcHJfZGVidWcoIiVzOiBQQkVfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoCisJCQllZmZlY3RzX21vZHVsZSwgZWZmZWN0cy0+YWMtPnRvcG9sb2d5KSkKKwkJCW1zbV9hdWRpb19lZmZlY3RzX3BiZV9oYW5kbGVyKAorCQkJCWVmZmVjdHMtPmFjLAorCQkJCSYoZWZmZWN0cy0+YXVkaW9fZWZmZWN0cy5wYmUpLAorCQkJCShsb25nICopJnZhbHVlc1sxXSk7CisJCWJyZWFrOworCWNhc2UgRVFfTU9EVUxFOgorCQlwcl9kZWJ1ZygiJXM6IEVRX01PRFVMRVxuIiwgX19mdW5jX18pOworCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKAorCQkJZWZmZWN0c19tb2R1bGUsIGVmZmVjdHMtPmFjLT50b3BvbG9neSkpCisJCQltc21fYXVkaW9fZWZmZWN0c19wb3BsZXNzX2VxX2hhbmRsZXIoCisJCQkJZWZmZWN0cy0+YWMsCisJCQkJJihlZmZlY3RzLT5hdWRpb19lZmZlY3RzLmVxdWFsaXplciksCisJCQkJKGxvbmcgKikmdmFsdWVzWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBTT0ZUX1ZPTFVNRV9NT0RVTEU6CisJCXByX2RlYnVnKCIlczogU0EgUExVUyBWT0xVTUVfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7CisJCW1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyX3YyKGVmZmVjdHMtPmFjLAorCQkJCSYoZWZmZWN0cy0+YXVkaW9fZWZmZWN0cy5zYXBsdXNfdm9sKSwKKwkJCQkobG9uZyAqKSZ2YWx1ZXNbMV0sIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzEpOworCQlicmVhazsKKwljYXNlIFNPRlRfVk9MVU1FMl9NT0RVTEU6CisJCXByX2RlYnVnKCIlczogVE9QT0xPR1kgU1dJVENIIFZPTFVNRSBNT0RVTEVcbiIsCisJCQkgX19mdW5jX18pOworCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKAorCQkJZWZmZWN0c19tb2R1bGUsIGVmZmVjdHMtPmFjLT50b3BvbG9neSkpCisJCQltc21fYXVkaW9fZWZmZWN0c192b2x1bWVfaGFuZGxlcl92MihlZmZlY3RzLT5hYywKKwkJCSAgICAgICYoZWZmZWN0cy0+YXVkaW9fZWZmZWN0cy50b3BvX3N3aXRjaF92b2wpLAorCQkJICAgICAgKGxvbmcgKikmdmFsdWVzWzFdLCBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yKTsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfTU9EVUxFX0VOQUJMRToKKwkJcHJfZGVidWcoIiVzOiBEVFNfRUFHTEVfTU9EVUxFX0VOQUJMRVxuIiwgX19mdW5jX18pOworCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKAorCQkJZWZmZWN0c19tb2R1bGUsIGVmZmVjdHMtPmFjLT50b3BvbG9neSkpIHsKKwkJCS8qCisJCQkgKiBIUFgtPk9GRjogZmlyc3QgZGlzYWJsZSBIUFggYW5kIHRoZW4KKwkJCSAqIGVuYWJsZSBTQSsKKwkJCSAqIEhQWC0+T046IGZpcnN0IGRpc2FibGUgU0ErIGFuZCB0aGVuCisJCQkgKiBlbmFibGUgSFBYCisJCQkgKi8KKwkJCWJvb2wgaHB4X3N0YXRlID0gKGJvb2wpdmFsdWVzWzFdOworCisJCQlpZiAoaHB4X3N0YXRlKQorCQkJCW1zbV9hdWRpb19lZmZlY3RzX2VuYWJsZV9leHRuKGVmZmVjdHMtPmFjLAorCQkJCQkmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMpLAorCQkJCQlmYWxzZSk7CisJCQltc21fZHRzX2VhZ2xlX2VuYWJsZV9hc20oZWZmZWN0cy0+YWMsCisJCQkJaHB4X3N0YXRlLAorCQkJCUFVRFBST0NfTU9EVUxFX0lEX0RUU19IUFhfUFJFTUlYKTsKKwkJCW1zbV9kdHNfZWFnbGVfZW5hYmxlX2FzbShlZmZlY3RzLT5hYywKKwkJCQlocHhfc3RhdGUsCisJCQkJQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QT1NUTUlYKTsKKwkJCWlmICghaHB4X3N0YXRlKQorCQkJCW1zbV9hdWRpb19lZmZlY3RzX2VuYWJsZV9leHRuKGVmZmVjdHMtPmFjLAorCQkJCQkmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMpLAorCQkJCQl0cnVlKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGVmZmVjdHMgY29uZmlnIG1vZHVsZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGxvbmcgYXVkaW9fZWZmZWN0c19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisJbG9uZyBhcmd2YWx1ZXNbTUFYX1BQX1BBUkFNU19TWl0gPSB7MH07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHOiB7CisJCXByX2RlYnVnKCIlczogQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7CisJCW1lbXNldCgmZWZmZWN0cy0+Y29uZmlnLCAwLCBzaXplb2YoZWZmZWN0cy0+Y29uZmlnKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZWZmZWN0cy0+Y29uZmlnLCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2YoZWZmZWN0cy0+Y29uZmlnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHkgZnJvbSB1c2VyIGZvciBBVURJT19TRVRfRUZGRUNUU19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1Zl9zaXplOiAlZCwgbnVtX2J1ZjogJWQsIHNhbXBsZV9yYXRlOiAlZCwgY2hhbm5lbDogJWRcbiIsCisJCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuYnVmX3NpemUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fYnVmLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuc2FtcGxlX3JhdGUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fY2hhbm5lbHMpOworCQlwcl9kZWJ1ZygiJXM6IHJlYWQgYnVmX3NpemU6ICVkLCBudW1fYnVmOiAlZCwgc2FtcGxlX3JhdGU6ICVkLCBjaGFubmVsOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZWZmZWN0cy0+Y29uZmlnLmlucHV0LmJ1Zl9zaXplLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5udW1fYnVmLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5zYW1wbGVfcmF0ZSwKKwkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2NoYW5uZWxzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fRUZGRUNUU19TRVRfQlVGX0xFTjogeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2YoZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcpKSkgeworCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZm9yIEFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU4gZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1ZiBsZW46ICVkLCByZWFkIGJ1ZiBsZW46ICVkXG4iLAorCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcuYnVmX2NmZy5vdXRwdXRfbGVuLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLmlucHV0X2xlbik7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0VGRkVDVFNfR0VUX0JVRl9BVkFJTDogeworCQlzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9hdmFpbCBidWZfYXZhaWw7CisKKwkJYnVmX2F2YWlsLmlucHV0X251bV9hdmFpbCA9IGF0b21pY19yZWFkKCZlZmZlY3RzLT5pbl9jb3VudCk7CisJCWJ1Zl9hdmFpbC5vdXRwdXRfbnVtX2F2YWlsID0gYXRvbWljX3JlYWQoJmVmZmVjdHMtPm91dF9jb3VudCk7CisJCXByX2RlYnVnKCIlczogd3JpdGUgYnVmIGF2YWlsOiAlZCwgcmVhZCBidWYgYXZhaWw6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBidWZfYXZhaWwub3V0cHV0X251bV9hdmFpbCwKKwkJCSBidWZfYXZhaWwuaW5wdXRfbnVtX2F2YWlsKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmJ1Zl9hdmFpbCwKKwkJCQkgICBzaXplb2YoYnVmX2F2YWlsKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmb3IgQVVESU9fRUZGRUNUU19HRVRfTlVNX0JVRl9BVkFJTCBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0VGRkVDVFNfU0VUX1BQX1BBUkFNUzogeworCQlpZiAoY29weV9mcm9tX3VzZXIoYXJndmFsdWVzLCAodm9pZCAqKWFyZywKKwkJCQkgICBNQVhfUFBfUEFSQU1TX1NaKnNpemVvZihsb25nKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHkgZnJvbSB1c2VyIGZvciBwcCBwYXJhbXMgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJjID0gYXVkaW9fZWZmZWN0c19zZXRfcHBfcGFyYW0oZWZmZWN0cywgYXJndmFsdWVzKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogQ2FsbGluZyBzaGFyZWQgaW9jdGxcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSBhdWRpb19lZmZlY3RzX3NoYXJlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwlpZiAocmMpCisJCXByX2VycigiJXM6IGNtZCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18sIGNtZCk7CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9od2FjY19kYXRhX2NvbmZpZzMyIHsKKwlfX3UzMiBidWZfc2l6ZTsKKwlfX3UzMiBudW1fYnVmOworCV9fdTMyIG51bV9jaGFubmVsczsKKwlfX3U4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMU19TVVBQT1JURURdOworCV9fdTMyIHNhbXBsZV9yYXRlOworCV9fdTMyIGJpdHNfcGVyX3NhbXBsZTsKK307CisKK3N0cnVjdCBtc21faHdhY2NfYnVmX2NmZzMyIHsKKwlfX3UzMiBpbnB1dF9sZW47CisJX191MzIgb3V0cHV0X2xlbjsKK307CisKK3N0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsMzIgeworCV9fdTMyIGlucHV0X251bV9hdmFpbDsKKwlfX3UzMiBvdXRwdXRfbnVtX2F2YWlsOworfTsKKworc3RydWN0IG1zbV9od2FjY19lZmZlY3RzX2NvbmZpZzMyIHsKKwlzdHJ1Y3QgbXNtX2h3YWNjX2RhdGFfY29uZmlnMzIgaW5wdXQ7CisJc3RydWN0IG1zbV9od2FjY19kYXRhX2NvbmZpZzMyIG91dHB1dDsKKwlzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9jZmczMiBidWZfY2ZnOworCV9fdTMyIG1ldGFfbW9kZV9lbmFibGVkOworCV9fdTMyIG92ZXJ3cml0ZV90b3BvbG9neTsKKwlfX3MzMiB0b3BvbG9neTsKK307CisKK2VudW0geworCUFVRElPX1NFVF9FRkZFQ1RTX0NPTkZJRzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTksCisJCQkJCSAgc3RydWN0IG1zbV9od2FjY19lZmZlY3RzX2NvbmZpZzMyKSwKKwlBVURJT19FRkZFQ1RTX1NFVF9CVUZfTEVOMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDAsCisJCQkJCSAgIHN0cnVjdCBtc21faHdhY2NfYnVmX2NmZzMyKSwKKwlBVURJT19FRkZFQ1RTX0dFVF9CVUZfQVZBSUwzMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMSwKKwkJCQkJICAgICBzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9hdmFpbDMyKSwKKwlBVURJT19FRkZFQ1RTX1dSSVRFMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDIsIGNvbXBhdF91cHRyX3QpLAorCUFVRElPX0VGRkVDVFNfUkVBRDMyID0gX0lPV1IoQVVESU9fSU9DVExfTUFHSUMsIDEwMywgY29tcGF0X3VwdHJfdCksCisJQVVESU9fRUZGRUNUU19TRVRfUFBfUEFSQU1TMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDQsCisJCQkJCSAgIGNvbXBhdF91cHRyX3QpLAorCUFVRElPX1NUQVJUMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAwLCB1bnNpZ25lZCBpbnQpLAorfTsKKworc3RhdGljIGxvbmcgYXVkaW9fZWZmZWN0c19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2VmZmVjdHMgKmVmZmVjdHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMCwgaTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TRVRfRUZGRUNUU19DT05GSUczMjogeworCQlzdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnMzIgY29uZmlnMzI7CisJCXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWcgKmNvbmZpZyA9ICZlZmZlY3RzLT5jb25maWc7CisKKwkJbWVtc2V0KCZlZmZlY3RzLT5jb25maWcsIDAsIHNpemVvZihlZmZlY3RzLT5jb25maWcpKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWczMiwgKHZvaWQgKilhcmcsCisJCQkJICAgc2l6ZW9mKGNvbmZpZzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmb3IgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQljb25maWctPmlucHV0LmJ1Zl9zaXplID0gY29uZmlnMzIuaW5wdXQuYnVmX3NpemU7CisJCWNvbmZpZy0+aW5wdXQubnVtX2J1ZiA9IGNvbmZpZzMyLmlucHV0Lm51bV9idWY7CisJCWNvbmZpZy0+aW5wdXQubnVtX2NoYW5uZWxzID0gY29uZmlnMzIuaW5wdXQubnVtX2NoYW5uZWxzOworCQljb25maWctPmlucHV0LnNhbXBsZV9yYXRlID0gY29uZmlnMzIuaW5wdXQuc2FtcGxlX3JhdGU7CisJCWNvbmZpZy0+aW5wdXQuYml0c19wZXJfc2FtcGxlID0gY29uZmlnMzIuaW5wdXQuYml0c19wZXJfc2FtcGxlOworCQljb25maWctPmlucHV0LmJ1Zl9zaXplID0gY29uZmlnMzIuaW5wdXQuYnVmX3NpemU7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFNfU1VQUE9SVEVEOyBpKyspCisJCQljb25maWctPmlucHV0LmNoYW5uZWxfbWFwW2ldID0KKwkJCQkJCWNvbmZpZzMyLmlucHV0LmNoYW5uZWxfbWFwW2ldOworCQljb25maWctPm91dHB1dC5idWZfc2l6ZSA9IGNvbmZpZzMyLm91dHB1dC5idWZfc2l6ZTsKKwkJY29uZmlnLT5vdXRwdXQubnVtX2J1ZiA9IGNvbmZpZzMyLm91dHB1dC5udW1fYnVmOworCQljb25maWctPm91dHB1dC5udW1fY2hhbm5lbHMgPSBjb25maWczMi5vdXRwdXQubnVtX2NoYW5uZWxzOworCQljb25maWctPm91dHB1dC5zYW1wbGVfcmF0ZSA9IGNvbmZpZzMyLm91dHB1dC5zYW1wbGVfcmF0ZTsKKwkJY29uZmlnLT5vdXRwdXQuYml0c19wZXJfc2FtcGxlID0KKwkJCQkJIGNvbmZpZzMyLm91dHB1dC5iaXRzX3Blcl9zYW1wbGU7CisJCWNvbmZpZy0+b3V0cHV0LmJ1Zl9zaXplID0gY29uZmlnMzIub3V0cHV0LmJ1Zl9zaXplOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTX1NVUFBPUlRFRDsgaSsrKQorCQkJY29uZmlnLT5vdXRwdXQuY2hhbm5lbF9tYXBbaV0gPQorCQkJCQkJY29uZmlnMzIub3V0cHV0LmNoYW5uZWxfbWFwW2ldOworCQljb25maWctPmJ1Zl9jZmcuaW5wdXRfbGVuID0gY29uZmlnMzIuYnVmX2NmZy5pbnB1dF9sZW47CisJCWNvbmZpZy0+YnVmX2NmZy5vdXRwdXRfbGVuID0gY29uZmlnMzIuYnVmX2NmZy5vdXRwdXRfbGVuOworCQljb25maWctPm1ldGFfbW9kZV9lbmFibGVkID0gY29uZmlnMzIubWV0YV9tb2RlX2VuYWJsZWQ7CisJCWNvbmZpZy0+b3ZlcndyaXRlX3RvcG9sb2d5ID0gY29uZmlnMzIub3ZlcndyaXRlX3RvcG9sb2d5OworCQljb25maWctPnRvcG9sb2d5ID0gY29uZmlnMzIudG9wb2xvZ3k7CisJCXByX2RlYnVnKCIlczogd3JpdGUgYnVmX3NpemU6ICVkLCBudW1fYnVmOiAlZCwgc2FtcGxlX3JhdGU6ICVkLCBjaGFubmVsczogJWRcbiIsCisJCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuYnVmX3NpemUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fYnVmLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuc2FtcGxlX3JhdGUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fY2hhbm5lbHMpOworCQlwcl9kZWJ1ZygiJXM6IHJlYWQgYnVmX3NpemU6ICVkLCBudW1fYnVmOiAlZCwgc2FtcGxlX3JhdGU6ICVkLCBjaGFubmVsczogJWRcbiIsCisJCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5idWZfc2l6ZSwKKwkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2J1ZiwKKwkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQuc2FtcGxlX3JhdGUsCisJCQkgZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9jaGFubmVscyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU4zMjogeworCQlzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9jZmczMiBidWZfY2ZnMzI7CisJCXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWcgKmNvbmZpZyA9ICZlZmZlY3RzLT5jb25maWc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfY2ZnMzIsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihidWZfY2ZnMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZm9yIEFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU4gZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNvbmZpZy0+YnVmX2NmZy5pbnB1dF9sZW4gPSBidWZfY2ZnMzIuaW5wdXRfbGVuOworCQljb25maWctPmJ1Zl9jZmcub3V0cHV0X2xlbiA9IGJ1Zl9jZmczMi5vdXRwdXRfbGVuOworCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1ZiBsZW46ICVkLCByZWFkIGJ1ZiBsZW46ICVkXG4iLAorCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcuYnVmX2NmZy5vdXRwdXRfbGVuLAorCQkJIGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLmlucHV0X2xlbik7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0VGRkVDVFNfR0VUX0JVRl9BVkFJTDMyOiB7CisJCXN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsMzIgYnVmX2F2YWlsOworCisJCW1lbXNldCgmYnVmX2F2YWlsLCAwLCBzaXplb2YoYnVmX2F2YWlsKSk7CisKKwkJYnVmX2F2YWlsLmlucHV0X251bV9hdmFpbCA9IGF0b21pY19yZWFkKCZlZmZlY3RzLT5pbl9jb3VudCk7CisJCWJ1Zl9hdmFpbC5vdXRwdXRfbnVtX2F2YWlsID0gYXRvbWljX3JlYWQoJmVmZmVjdHMtPm91dF9jb3VudCk7CisJCXByX2RlYnVnKCIlczogd3JpdGUgYnVmIGF2YWlsOiAlZCwgcmVhZCBidWYgYXZhaWw6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBidWZfYXZhaWwub3V0cHV0X251bV9hdmFpbCwKKwkJCSBidWZfYXZhaWwuaW5wdXRfbnVtX2F2YWlsKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmJ1Zl9hdmFpbCwKKwkJCQkgICBzaXplb2YoYnVmX2F2YWlsKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmb3IgQVVESU9fRUZGRUNUU19HRVRfTlVNX0JVRl9BVkFJTCBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0VGRkVDVFNfU0VUX1BQX1BBUkFNUzMyOiB7CisJCWxvbmcgYXJndmFsdWVzW01BWF9QUF9QQVJBTVNfU1pdID0gezB9OworCQlpbnQgYXJndmFsdWVzMzJbTUFYX1BQX1BBUkFNU19TWl0gPSB7MH07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFyZ3ZhbHVlczMyLCAodm9pZCAqKWFyZywKKwkJCQkgICBNQVhfUFBfUEFSQU1TX1NaKnNpemVvZihpbnQpKSkgeworCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBwcCBwYXJhbXNcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QUF9QQVJBTVNfU1o7IGkrKykKKwkJCWFyZ3ZhbHVlc1tpXSA9IGFyZ3ZhbHVlczMyW2ldOworCisJCXJjID0gYXVkaW9fZWZmZWN0c19zZXRfcHBfcGFyYW0oZWZmZWN0cywgYXJndmFsdWVzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU1RBUlQzMjogeworCQlyYyA9IGF1ZGlvX2VmZmVjdHNfc2hhcmVkX2lvY3RsKGZpbGUsIEFVRElPX1NUQVJULCBhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19FRkZFQ1RTX1dSSVRFMzI6IHsKKwkJcmMgPSBhdWRpb19lZmZlY3RzX3NoYXJlZF9pb2N0bChmaWxlLCBBVURJT19FRkZFQ1RTX1dSSVRFLCBhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19FRkZFQ1RTX1JFQUQzMjogeworCQlyYyA9IGF1ZGlvX2VmZmVjdHNfc2hhcmVkX2lvY3RsKGZpbGUsIEFVRElPX0VGRkVDVFNfUkVBRCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIGlvY3RsXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGF1ZGlvX2VmZmVjdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAoIWVmZmVjdHMpIHsKKwkJcHJfZXJyKCIlczogZWZmZWN0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlZmZlY3RzLT5vcGVuZWQpIHsKKwkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZWZmZWN0cy0+d3JpdGVfd2FpdCwKKwkJCQkJYXRvbWljX3JlYWQoJmVmZmVjdHMtPm91dF9jb3VudCksCisJCQkJCVdBSVRfVElNRURPVVRfRFVSQVRJT05fU0VDUyAqIEhaKTsKKwkJaWYgKCFyYykKKwkJCXByX2VycigiJXM6IHdyaXRlIHdhaXRfZXZlbnRfdGltZW91dCBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChlZmZlY3RzLT5yZWFkX3dhaXQsCisJCQkJCWF0b21pY19yZWFkKCZlZmZlY3RzLT5pbl9jb3VudCksCisJCQkJCVdBSVRfVElNRURPVVRfRFVSQVRJT05fU0VDUyAqIEhaKTsKKwkJaWYgKCFyYykKKwkJCXByX2VycigiJXM6IHJlYWQgd2FpdF9ldmVudF90aW1lb3V0IGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJjID0gcTZhc21fY21kKGVmZmVjdHMtPmFjLCBDTURfQ0xPU0UpOworCQlpZiAocmMgPCAwKQorCQkJcHJfZXJyKCIlc1slcEtdOkZhaWxlZCB0byBjbG9zZSB0aGUgc2Vzc2lvbiByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgZWZmZWN0cywgcmMpOworCQllZmZlY3RzLT5vcGVuZWQgPSAwOworCQllZmZlY3RzLT5zdGFydGVkID0gMDsKKworCQlhdWRpb19lZmZlY3RzX2RlaW5pdF9wcChlZmZlY3RzLT5hYyk7CisJfQorCisJaWYgKGVmZmVjdHMtPmJ1Zl9hbGxvYykgeworCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhJTiwgZWZmZWN0cy0+YWMpOworCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhPVVQsIGVmZmVjdHMtPmFjKTsKKwl9CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoZWZmZWN0cy0+YWMpOworCisJa2ZyZWUoZWZmZWN0cyk7CisKKwlwcl9kZWJ1ZygiJXM6IGNsb3NlIHNlc3Npb24gc3VjY2Vzc1xuIiwgX19mdW5jX18pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhdWRpb19lZmZlY3RzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqZWZmZWN0czsKKwlpbnQgcmMgPSAwOworCisJZWZmZWN0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2VmZmVjdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVmZmVjdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJZWZmZWN0cy0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCisJCQkJCShhcHBfY2IpYXVkaW9fZWZmZWN0c19ldmVudF9oYW5kbGVyLAorCQkJCQkodm9pZCAqKWVmZmVjdHMpOworCWlmICghZWZmZWN0cy0+YWMpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAorCQkJX19mdW5jX18pOworCQlrZnJlZShlZmZlY3RzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZWZmZWN0cy0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlZmZlY3RzLT53cml0ZV93YWl0KTsKKworCWVmZmVjdHMtPm9wZW5lZCA9IDA7CisJZWZmZWN0cy0+c3RhcnRlZCA9IDA7CisJZWZmZWN0cy0+YnVmX2FsbG9jID0gMDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBlZmZlY3RzOworCXByX2RlYnVnKCIlczogb3BlbiBzZXNzaW9uIHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2VmZmVjdHNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX2VmZmVjdHNfb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2VmZmVjdHNfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19lZmZlY3RzX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gYXVkaW9fZWZmZWN0c19jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2VmZmVjdHNfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX2h3ZWZmZWN0cyIsCisJLmZvcHMgPSAmYXVkaW9fZWZmZWN0c19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fZWZmZWN0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2VmZmVjdHNfbWlzYyk7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb19lZmZlY3RzX2luaXQpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdWRpbyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBlZmZlY3RzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tcDMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fbXAzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxMGM3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fbXAzLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIG1wMyBhdWRpbyBvdXRwdXQgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX21wM19taXNjOworc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fbXAzX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fbXAzX2RlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKKwkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAorfTsKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCisJCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7CisJCWlmICghcmMpIHsKKwkJCXJjID0gZW5hYmxlX3ZvbHVtZV9yYW1wKGF1ZGlvKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIHZvbHVtZSByYW1wXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDA7CisJCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2luZm8oIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uaWRbJWRdZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJCQlhdWRpby0+ZW5hYmxlZCk7CisJCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQorCQkJYXVkaW8tPnN0b3BwZWQgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCisJY2hhciBuYW1lW3NpemVvZiAibXNtX21wM18iICsgNV07CisjZW5kaWYKKwlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOworCisJaWYgKGF1ZGlvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOworCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX21wM19taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fbXAzX3dzX21ncjsKKworCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKKwkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfTVAzKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQkvKiBvcGVuIE1QMyBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEKKwkJICogYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCQkgKi8KKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9NUDMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9tcDNfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX21wM19kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczptcDNkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIHJjOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX21wM19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXVkaW9fb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAorCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19tcDNfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX21wMyIsCisJLmZvcHMgPSAmYXVkaW9fbXAzX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19tcDNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19tcDNfbWlzYyk7CisKKwlpZiAocmV0ID09IDApCisJCWRldmljZV9pbml0X3dha2V1cChhdWRpb19tcDNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7CisJYXVkaW9fbXAzX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19tcDNfd3NfbWdyLndzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX21wM19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fbXVsdGlfYWFjLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX211bHRpX2FhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzNkYzVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tdWx0aV9hYWMuYwpAQCAtMCwwICsxLDUyMyBAQAorLyogYWFjIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9zb2NpbmZvLmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCisKKyNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19JTlZBTElEIC0xCisKKworLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCisjZGVmaW5lIFBDTV9CVUZTWl9NSU5fQUFDTQkoKDgqMTAyNCkgKyBzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCkpCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbXVsdGlhYWNfbWlzYzsKK3N0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX211bHRpYWFjX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2RlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKKwkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAorfTsKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBhc21fYWFjX2NmZyBhYWNfY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7CisJCXVpbnQzMl90IHNicl9wcyA9IDB4MDA7CisKKwkJYWFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IFRVTk5FTF9NT0RFKSB7CisJCQlhYWNfY2ZnLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZy0+c2FtcGxlX3JhdGU7CisJCQlhYWNfY2ZnLmNoX2NmZyA9IGFhY19jb25maWctPmNoYW5uZWxfY29uZmlndXJhdGlvbjsKKwkJfSBlbHNlIHsKKwkJCWFhY19jZmcuc2FtcGxlX3JhdGUgPSAgYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGU7CisJCQlhYWNfY2ZnLmNoX2NmZyA9IGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQ7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX25hdGl2ZShhdWRpby0+YWMsCisJCQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQlhYWNfY2ZnLmNoX2NmZyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIHR1cm4gb24gYm90aCBzYnIgYW5kIHBzICovCisJCXJjID0gcTZhc21fZW5hYmxlX3NicnBzKGF1ZGlvLT5hYywgc2JyX3BzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2Vycigic2JyLXBzIGVuYWJsZSBmYWlsZWRcbiIpOworCQlpZiAoYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWcpCisJCQlhYWNfY2ZnLmFvdCA9IEFBQ19FTkNfTU9ERV9FQUFDX1A7CisJCWVsc2UgaWYgKGFhY19jb25maWctPnNicl9vbl9mbGFnKQorCQkJYWFjX2NmZy5hb3QgPSBBQUNfRU5DX01PREVfQUFDX1A7CisJCWVsc2UKKwkJCWFhY19jZmcuYW90ID0gQUFDX0VOQ19NT0RFX0FBQ19MQzsKKworCQlzd2l0Y2ggKGFhY19jb25maWctPmZvcm1hdCkgeworCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfQURUUzoKKwkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfTE9BUzoKKwkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMTsKKwkJCWJyZWFrOworCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfQURJRjoKKwkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfUkFXOgorCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAzOworCQl9CisJCWFhY19jZmcuZXBfY29uZmlnID0gYWFjX2NvbmZpZy0+ZXBfY29uZmlnOworCQlhYWNfY2ZnLnNlY3Rpb25fZGF0YV9yZXNpbGllbmNlID0KKwkJCWFhY19jb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY2ZnLnNjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZSA9CisJCQlhYWNfY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jZmcuc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlID0KKwkJCWFhY19jb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKworCQlwcl9kZWJ1ZygiJXM6Zm9ybWF0PSV4IGFvdD0lZCAgY2g9JWQgc3I9JWRcbiIsCisJCQlfX2Z1bmNfXywgYWFjX2NmZy5mb3JtYXQsCisJCQlhYWNfY2ZnLmFvdCwgYWFjX2NmZy5jaF9jZmcsCisJCQlhYWNfY2ZnLnNhbXBsZV9yYXRlKTsKKworCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2FhYyhhdWRpby0+YWMsICZhYWNfY2ZnKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJjbWQgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IHE2YXNtX3NldF9lbmNkZWNfY2hhbl9tYXAoYXVkaW8tPmFjLCAyKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogY21kIHNldCBlbmNkZWNfY2hhbl9tYXAgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9pbmZvKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCQkJYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOworCQl1aW50MTZfdCBzY2VfbGVmdCA9IDEsIHNjZV9yaWdodCA9IDI7CisKKwkJaWYgKGFyZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQltZW1jcHkoYXVkaW8tPmNvZGVjX2NmZywgYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpKTsKKwkJYWFjX2NvbmZpZyA9IGF1ZGlvLT5jb2RlY19jZmc7CisJCWlmIChhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSA+CisJCSAgICBBVURJT19BQUNfRFVBTF9NT05PX1BMX1NSKSB7CisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHOiBJbnZhbGlkIGR1YWxfbW9ubyBtb2RlID0lZFxuIiwKKwkJCQkgX19mdW5jX18sIGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNvbnZlcnQgdGhlIGRhdGEgZnJvbSB1c2VyIGludG8gc2NlX2xlZnQKKwkJCSAqIGFuZCBzY2VfcmlnaHQgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zCisJCQkgKi8KKwkJCXByX2RlYnVnKCIlczogQVVESU9fU0VUX0FBQ19DT05GSUc6IG1vZGlmeSBkdWFsX21vbm8gbW9kZSA9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSk7CisJCQlzd2l0Y2ggKGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKSB7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fUExfUFI6CisJCQkJc2NlX2xlZnQgPSAxOworCQkJCXNjZV9yaWdodCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fU0xfU1I6CisJCQkJc2NlX2xlZnQgPSAyOworCQkJCXNjZV9yaWdodCA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fU0xfUFI6CisJCQkJc2NlX2xlZnQgPSAyOworCQkJCXNjZV9yaWdodCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVRElPX0FBQ19EVUFMX01PTk9fUExfU1I6CisJCQlkZWZhdWx0OgorCQkJCXNjZV9sZWZ0ID0gMTsKKwkJCQlzY2VfcmlnaHQgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQkJcmMgPSBxNmFzbV9jZmdfZHVhbF9tb25vX2FhYyhhdWRpby0+YWMsCisJCQkJCQlzY2VfbGVmdCwgc2NlX3JpZ2h0KTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlczogYXNtIGNtZCBkdWFsbW9ubyBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCQkJIF9fZnVuY19fLCByYyk7CisJCX0JCQlicmVhazsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19NSVhfQ09ORklHOgl7CisJCXUzMiAqbWl4X2NvZWZmID0gKHUzMiAqKWFyZzsKKworCQlpZiAoIWFyZykgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbSBmb3IgJXNcbiIsCisJCQkJX19mdW5jX18sICJBVURJT19TRVRfQUFDX01JWF9DT05GSUciKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlcywgQVVESU9fU0VUX0FBQ19NSVhfQ09ORklHIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXMsIHZhbHVlIG9mIGNvZWZmID0gJWQiLAorCQkJCQlfX2Z1bmNfXywgKm1peF9jb2VmZik7CisJCXE2YXNtX2NmZ19hYWNfc2VsX21peF9jb2VmKGF1ZGlvLT5hYywgKm1peF9jb2VmZik7CisJCWlmIChyYyA8IDApCisJCQlwcl9lcnIoIiVzIGFzbSBhYWNfc2VsX21peF9jb2VmIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkgX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQUFDX0NPTkZJRzogeworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+Y29kZWNfY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BQUNfQ09ORklHIGZhaWxlZFxuIgorCQkJCSwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnIGFhY19jb25maWc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWNfY29uZmlnLCAodm9pZCAqKWFyZywKKwkJCXNpemVvZihhYWNfY29uZmlnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWRcbiIKKwkJCQksIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZhYWNfY29uZmlnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQUFDX01JWF9DT05GSUc6CXsKKwkJdTMyIG1peF9jb25maWc7CisKKwkJcHJfZGVidWcoIiVzLCBBVURJT19TRVRfQUFDX01JWF9DT05GSUciLCBfX2Z1bmNfXyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4X2NvbmZpZywgKHZvaWQgKilhcmcsCisJCQlzaXplb2YodTMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX01JWF9DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJm1peF9jb25maWcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcHJfZGVidWcoIkNhbGxpbmcgdXRpbHMgaW9jdGxcbiIpOworCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiB7CisJczE2IGZvcm1hdDsKKwl1MTYgYXVkaW9fb2JqZWN0OworCXUxNiBlcF9jb25maWc7ICAvKiAwIH4gMyB1c2VmdWwgb25seSBvYmogPSBFUkxDICovCisJdTE2IGFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCXUxNiBhYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJdTE2IGFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwl1MTYgc2JyX29uX2ZsYWc7CisJdTE2IHNicl9wc19vbl9mbGFnOworCXUxNiBkdWFsX21vbm9fbW9kZTsKKwl1MTYgY2hhbm5lbF9jb25maWd1cmF0aW9uOworCXUxNiBzYW1wbGVfcmF0ZTsKK307CisKK2VudW0geworCUFVRElPX1NFVF9BQUNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKKwkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiksCisJQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZzMyKSwKK307CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9BQUNfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgYWFjX2NvbmZpZ18zMjsKKworCQltZW1zZXQoJmFhY19jb25maWdfMzIsIDAsIHNpemVvZihhYWNfY29uZmlnXzMyKSk7CisKKwkJYWFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQlhYWNfY29uZmlnXzMyLmZvcm1hdCA9IGFhY19jb25maWctPmZvcm1hdDsKKwkJYWFjX2NvbmZpZ18zMi5hdWRpb19vYmplY3QgPSBhYWNfY29uZmlnLT5hdWRpb19vYmplY3Q7CisJCWFhY19jb25maWdfMzIuZXBfY29uZmlnID0gYWFjX2NvbmZpZy0+ZXBfY29uZmlnOworCQlhYWNfY29uZmlnXzMyLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnXzMyLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jb25maWdfMzIuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NvbmZpZ18zMi5zYnJfb25fZmxhZyA9IGFhY19jb25maWctPnNicl9vbl9mbGFnOworCQlhYWNfY29uZmlnXzMyLnNicl9wc19vbl9mbGFnID0gYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWc7CisJCWFhY19jb25maWdfMzIuZHVhbF9tb25vX21vZGUgPSBhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZTsKKwkJYWFjX2NvbmZpZ18zMi5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPQorCQkJYWFjX2NvbmZpZy0+Y2hhbm5lbF9jb25maWd1cmF0aW9uOworCQlhYWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZy0+c2FtcGxlX3JhdGU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFhY19jb25maWdfMzIsCisJCQlzaXplb2YoYWFjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BQUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NvbmZpZzsKKwkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgYWFjX2NvbmZpZ18zMjsKKworCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NFVF9BQUNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjX2NvbmZpZ18zMiwgKHZvaWQgKilhcmcsCisJCQlzaXplb2YoYWFjX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FBQ19DT05GSUdfMzIgZmFpbGVkIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlhYWNfY29uZmlnLmZvcm1hdCA9IGFhY19jb25maWdfMzIuZm9ybWF0OworCQlhYWNfY29uZmlnLmF1ZGlvX29iamVjdCA9IGFhY19jb25maWdfMzIuYXVkaW9fb2JqZWN0OworCQlhYWNfY29uZmlnLmVwX2NvbmZpZyA9IGFhY19jb25maWdfMzIuZXBfY29uZmlnOworCQlhYWNfY29uZmlnLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWdfMzIuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJCWFhY19jb25maWcuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KKwkJCWFhY19jb25maWdfMzIuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCQlhYWNfY29uZmlnLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9CisJCQlhYWNfY29uZmlnXzMyLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwkJYWFjX2NvbmZpZy5zYnJfb25fZmxhZyA9IGFhY19jb25maWdfMzIuc2JyX29uX2ZsYWc7CisJCWFhY19jb25maWcuc2JyX3BzX29uX2ZsYWcgPSBhYWNfY29uZmlnXzMyLnNicl9wc19vbl9mbGFnOworCQlhYWNfY29uZmlnLmR1YWxfbW9ub19tb2RlID0gYWFjX2NvbmZpZ18zMi5kdWFsX21vbm9fbW9kZTsKKwkJYWFjX2NvbmZpZy5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPQorCQkJCWFhY19jb25maWdfMzIuY2hhbm5lbF9jb25maWd1cmF0aW9uOworCQlhYWNfY29uZmlnLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZTsKKworCQljbWQgPSBBVURJT19TRVRfQUFDX0NPTkZJRzsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmYWFjX2NvbmZpZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0FBQ19NSVhfQ09ORklHOiB7CisJCXUzMiBtaXhfY29uZmlnOworCisJCXByX2RlYnVnKCIlcywgQVVESU9fU0VUX0FBQ19NSVhfQ09ORklHXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4X2NvbmZpZywgKHZvaWQgKilhcmcsCisJCQlzaXplb2YodTMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX01JWF9DT05GSUcgZmFpbGVkXG4iCisJCQkJLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZtaXhfY29uZmlnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlwcl9kZWJ1ZygiQ2FsbGluZyB1dGlscyBpb2N0bFxuIik7CisJCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZyA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLworCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9tdWx0aV9hYWNfIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWFjX2NvbmZpZyA9IGF1ZGlvLT5jb2RlY19jZmc7CisKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU5fQUFDTTsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19tdWx0aWFhY19taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fbXVsdGlhYWNfd3NfbWdyOworCWFhY19jb25maWctPmR1YWxfbW9ub19tb2RlID0gQVVESU9fQUFDX0RVQUxfTU9OT19JTlZBTElEOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAorCQkJCQkgICAgICh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOworCQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfTVBFRzRfTVVMVElfQUFDKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQkvKiBvcGVuIEFBQyBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEKKwkJICogYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCQkgKi8KKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9NUEVHNF9NVUxUSV9BQUMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9tdWx0aV9hYWNfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX2FhY19kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczpBQUMgNS4xIERlY29kZXIgT1BFTiBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsCisJCV9fZnVuY19fLCBhdWRpby0+ZmVlZGJhY2ssIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIHJjOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FhY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXVkaW9fb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAorCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKKwkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbXVsdGlhYWNfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX211bHRpX2FhYyIsCisJLmZvcHMgPSAmYXVkaW9fYWFjX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19hYWNfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19tdWx0aWFhY19taXNjKTsKKworCWlmIChyZXQgPT0gMCkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX211bHRpYWFjX21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX211bHRpYWFjX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19tdWx0aWFhY193c19tZ3Iud3NfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwoYXVkaW9fYWFjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19xY2VscC5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19xY2VscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjUxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3FjZWxwLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIHFjZWxwKHYxM2spIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCisjZGVmaW5lIEZSQU1FX1NJWkVfREVDX1FDRUxQICAoKDMyKSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfaW4pKQorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfbWlzYzsKK3N0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX3FjZWxwX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcWNlbHBfZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9OworI2VuZGlmCisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KKwkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKKwkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCisJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7CisJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHNlc3Npb25pZFslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQkJCWF1ZGlvLT5lbmFibGVkKTsKKwkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCisJCQlhdWRpby0+c3RvcHBlZCA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKwljaGFyIG5hbWVbc2l6ZW9mICJtc21fcWNlbHBfIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCisJICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZworCSAqLworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRV9ERUNfUUNFTFA7CisJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOworCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gODAwMDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19xY2VscF9taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fcWNlbHBfd3NfbWdyOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAorCQkJCQkgICAgICh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCSAgIEZPUk1BVF9WMTNLKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfVjEzSyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOworCX0gZWxzZSB7CisJCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKKwkJcmMgPSAtRUFDQ0VTOworCQlnb3RvIGZhaWw7CisJfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX3FjZWxwXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOworCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAorCQkJCQkgICAgTlVMTCwgKHZvaWQgKilhdWRpbywKKwkJCQkJICAgICZhdWRpb19xY2VscF9kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczpkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcWNlbHBfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF1ZGlvX29wZW4sCisJLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKKwkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX3FjZWxwIiwKKwkuZm9wcyA9ICZhdWRpb19xY2VscF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fcWNlbHBfaW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19xY2VscF9taXNjKTsKKworCWlmIChyZXQgPT0gMCkKKwkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX3FjZWxwX21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX3FjZWxwX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb19xY2VscF93c19tZ3Iud3NfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwoYXVkaW9fcWNlbHBfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlZTlmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHMuYwpAQCAtMCwwICsxLDk1NCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzLmgiCisKKy8qCisgKiBEZWZpbmUgbWF4aW11bSBidWZmZXIgc2l6ZS4gQmVsb3cgdmFsdWVzIGFyZSBjaG9zZW4gY29uc2lkZXJpbmcgdGhlIGhpZ2hlcgorICogdmFsdWVzIHVzZWQgYW1vbmcgYWxsIG5hdGl2ZSBkcml2ZXJzLgorICovCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFCTE1MzYKKyNkZWZpbmUgTUFYX0ZSQU1FUwk1CisjZGVmaW5lIE1FVEFfU0laRQkoc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKQorI2RlZmluZSBNQVhfQlVGRkVSX1NJWkUJKDEgKyAoKE1BWF9GUkFNRV9TSVpFICsgTUVUQV9TSVpFKSAqIE1BWF9GUkFNRVMpKQorCitzdGF0aWMgaW50IGF1ZGlvX2luX3BhdXNlKHN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8pCit7CisJaW50IHJjOworCisJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfUEFVU0UpOworCWlmIChyYyA8IDApCisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogcGF1c2UgY21kIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9faW5fZmx1c2goc3RydWN0IHE2YXVkaW9faW4gICphdWRpbykKK3sKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZmx1c2hcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCS8qIEZsdXNoIGlmIHNlc3Npb24gcnVubmluZyAqLworCWlmIChhdWRpby0+ZW5hYmxlZCkgeworCQkvKiBJbXBsaWNpdGx5IGlzc3VlIGEgcGF1c2UgdG8gdGhlIGVuY29kZXIgYmVmb3JlIGZsdXNoaW5nICovCisJCXJjID0gYXVkaW9faW5fcGF1c2UoYXVkaW8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IHBhdXNlIGNtZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0ZMVVNIKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBmbHVzaCBjbWQgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkvKiAybmQgYXJnOiAwIC0+IHJ1biBpbW1lZGlhdGVseQorCQkgKiAzcmQgYXJnOiAwIC0+IG1zd190cywKKwkJICogNHRoIGFyZzogMCAtPmxzd190cworCQkgKi8KKwkJcTZhc21fcnVuKGF1ZGlvLT5hYywgMHgwMCwgMHgwMCwgMHgwMCk7CisJCXByX2RlYnVnKCJSZXJ1biB0aGUgc2Vzc2lvblxuIik7CisJfQorCWF1ZGlvLT5yZmx1c2ggPSAxOworCWF1ZGlvLT53Zmx1c2ggPSAxOworCW1lbXNldChhdWRpby0+b3V0X2ZyYW1lX2luZm8sIDAsIHNpemVvZihhdWRpby0+b3V0X2ZyYW1lX2luZm8pKTsKKwl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKKwkvKiBnZXQgcmVhZF9sb2NrIHRvIGVuc3VyZSBubyBtb3JlIHdhaXRpbmcgcmVhZCB0aHJlYWQgKi8KKwltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKKwlhdWRpby0+cmZsdXNoID0gMDsKKwltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKKwkvKiBnZXQgd3JpdGVfbG9jayB0byBlbnN1cmUgbm8gbW9yZSB3YWl0aW5nIHdyaXRlIHRocmVhZCAqLworCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlhdWRpby0+d2ZsdXNoID0gMDsKKwltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogaW5fYnl0ZXMgJWRcbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7CisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGluX3NhbXBsZXMgJWRcbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKKwlhdG9taWNfc2V0KCZhdWRpby0+aW5fYnl0ZXMsIDApOworCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9zYW1wbGVzLCAwKTsKKwlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2NvdW50LCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCitpbnQgYXVkaW9faW5fZW5hYmxlKHN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8pCit7CisJaWYgKGF1ZGlvLT5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCS8qIDJuZCBhcmc6IDAgLT4gcnVuIGltbWVkaWF0ZWx5CisJICogM3JkIGFyZzogMCAtPiBtc3dfdHMsCisJICogNHRoIGFyZzogMCAtPmxzd190cworCSAqLworCXJldHVybiBxNmFzbV9ydW4oYXVkaW8tPmFjLCAweDAwLCAweDAwLCAweDAwKTsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCitpbnQgYXVkaW9faW5fZGlzYWJsZShzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIWF1ZGlvLT5zdG9wcGVkKSB7CisJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJYXVkaW8tPm9wZW5lZCA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBpbmJ5dGVzWyVkXSBpbnNhbXBsZXNbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyksCisJCQkJYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKSk7CisKKwkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfQ0xPU0UpOworCQlpZiAocmMgPCAwKQorCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBGYWlsZWQgdG8gY2xvc2UgdGhlIHNlc3Npb24gcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQlyYyk7CisJCWF1ZGlvLT5zdG9wcGVkID0gMTsKKwkJbWVtc2V0KGF1ZGlvLT5vdXRfZnJhbWVfaW5mbywgMCwKKwkJCQlzaXplb2YoYXVkaW8tPm91dF9mcmFtZV9pbmZvKSk7CisJCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOworCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7CisJfQorCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBlbmFibGVkWyVkXVxuIiwgX19mdW5jX18sCisJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdWRpb19pbl9idWZfYWxsb2Moc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGF1ZGlvLT5idWZfYWxsb2MpIHsKKwljYXNlIE5PX0JVRl9BTExPQzoKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKKwkJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhJTiwKKwkJCQlhdWRpby0+YWMsCisJCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUpLAorCQkJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX0lOOworCQl9CisJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhPVVQsIGF1ZGlvLT5hYywKKwkJCQlBTElHTl9CVUZfU0laRShhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSksCisJCQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkIHJjPSVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlhdWRpby0+YnVmX2FsbG9jIHw9IEJVRl9BTExPQ19PVVQ7CisJCWJyZWFrOworCWNhc2UgQlVGX0FMTE9DX0lOOgorCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoT1VULCBhdWRpby0+YWMsCisJCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUpLAorCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQnVmZmVyIEFsbG9jIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJYXVkaW8tPmJ1Zl9hbGxvYyB8PSBCVUZfQUxMT0NfT1VUOworCQlicmVhazsKKwljYXNlIEJVRl9BTExPQ19PVVQ6CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoSU4sIGF1ZGlvLT5hYywKKwkJCQlBTElHTl9CVUZfU0laRShhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSksCisJCQkJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEJ1ZmZlciBBbGxvYyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX0lOOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBidWZbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2FsbG9jKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdWRpb19pbl9zZXRfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlLAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyAqY2ZnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChhdWRpby0+ZmVlZGJhY2sgIT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTm90IHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlIHJlY29yZCBtb2RlXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byByZXQ7CisJfQorCWlmICgoY2ZnLT5idWZmZXJfY291bnQgPiBQQ01fQlVGX0NPVU5UKSB8fAorCQkoY2ZnLT5idWZmZXJfY291bnQgPT0gMSkpCisJCWNmZy0+YnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKKworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IGNmZy0+YnVmZmVyX2NvdW50OworCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplICA9IGNmZy0+YnVmZmVyX3NpemU7CisJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IGNmZy0+Y2hhbm5lbF9jb3VudDsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IGNmZy0+c2FtcGxlX3JhdGU7CisJaWYgKGF1ZGlvLT5vcGVuZWQgJiYgYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoSU4sIGF1ZGlvLT5hYywKKwkJCUFMSUdOX0JVRl9TSVpFKGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplKSwKKwkJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQnVmZmVyIEFsbG9jIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX0lOOworCXJjID0gMDsKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU0VUX0NPTkZJRyAlZCAlZFxuIiwgX19mdW5jX18sCisJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCwKKwkJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplKTsKK3JldDoKKwlyZXR1cm4gcmM7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBsb25nIGF1ZGlvX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fRkxVU0g6IHsKKwkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKKwkJICogdGhhdCBtaWdodCBiZSBibG9ja2VkIGhvbGRpbmcgdGhlIHJlYWRfbG9jay4KKwkJICogV2hpbGUgYXVkaW8tPnN0b3BwZWQgcmVhZCB0aHJlYWRzIHdpbGwgYWx3YXlzCisJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCisJCSAqLworCQlyYyA9IGF1ZGlvX2luX2ZsdXNoKGF1ZGlvKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogRmx1c2ggRmFpbCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCWVsc2UgeyAvKiBSZWdpc3RlciBiYWNrIHRoZSBmbHVzaGVkIHJlYWQgYnVmZmVyIHdpdGggRFNQICovCisJCQlpbnQgY250ID0gMDsKKworCQkJd2hpbGUgKGNudCsrIDwgYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KQorCQkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCisJCQlwcl9kZWJ1ZygicmVnaXN0ZXIgdGhlIHJlYWQgYnVmZmVyXG4iKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19QQVVTRTogeworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fUEFVU0VcbiIsIF9fZnVuY19fLAorCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlpZiAoYXVkaW8tPmVuYWJsZWQpCisJCQlhdWRpb19pbl9wYXVzZShhdWRpbyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJc2l6ZW9mKHUxNikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9TRVNTSU9OX0lEIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2xvbmcgYXVkaW9faW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKKworCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKKwkJc3RhdHMuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOworCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gcmM7CisJfQorCisJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19GTFVTSDoKKwljYXNlIEFVRElPX1BBVVNFOgorCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6CisJCXJjID0gYXVkaW9faW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOworCisJCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7CisJCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplOworCQljZmcuYnVmZmVyX2NvdW50ID0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50OworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCisJCQlyYyA9IC1FRkFVTFQ7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19HRVRfU1RSRUFNX0NPTkZJRyAlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBjZmcuYnVmZmVyX3NpemUsCisJCQkJY2ZnLmJ1ZmZlcl9jb3VudCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfU1RSRUFNX0NPTkZJRyBmYWlsZWRcbiIKKwkJCQksIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCS8qIE1pbmltdW0gc2luZ2xlIGZyYW1lIHNpemUsCisJCSAqIGJ1dCB3aXRoIGluIG1heGltdW0gZnJhbWVzIG51bWJlcgorCQkgKi8KKwkJaWYgKChjZmcuYnVmZmVyX3NpemUgPCAoYXVkaW8tPm1pbl9mcmFtZV9zaXplICsKKwkJCXNpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkpIHx8CisJCQkoY2ZnLmJ1ZmZlcl9jb3VudCA8IEZSQU1FX05VTSkpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjZmcuYnVmZmVyX3NpemUgPiBNQVhfQlVGRkVSX1NJWkUpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gY2ZnLmJ1ZmZlcl9zaXplOworCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBjZmcuYnVmZmVyX2NvdW50OworCQlpZiAoYXVkaW8tPm9wZW5lZCkgeworCQkJcmMgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jKE9VVCwgYXVkaW8tPmFjLAorCQkJCUFMSUdOX0JVRl9TSVpFKGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplKSwKKwkJCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6IHNlc3Npb24gaWQgJWQ6IEJ1ZmZlciBBbGxvYyBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXVkaW8tPmJ1Zl9hbGxvYyB8PSBCVUZfQUxMT0NfT1VUOworCQlyYyA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TRVRfU1RSRUFNX0NPTkZJRyAlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAorCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9CVUZfQ0ZHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZyAgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpICYmCisJCQkhY2ZnLm1ldGFfaW5mb19lbmFibGUpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVzdHJpY3QgdGhlIG51bSBvZiBmcmFtZXMgcGVyIGJ1ZiB0byBjb2luY2lkZSB3aXRoCisJCSAqIGRlZmF1bHQgYnVmIHNpemUKKwkJICovCisJCWlmIChjZmcuZnJhbWVzX3Blcl9idWYgPiBhdWRpby0+bWF4X2ZyYW1lc19wZXJfYnVmKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gY2ZnLm1ldGFfaW5mb19lbmFibGU7CisJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gY2ZnLmZyYW1lc19wZXJfYnVmOworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogU2V0LWJ1Zi1jZmc6IG1ldGFbJWRdIGZyYW1lc3BlcmJ1ZlslZF1cbiIsCisJCQkJX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBjZmcubWV0YV9pbmZvX2VuYWJsZSwKKwkJCQljZmcuZnJhbWVzX3Blcl9idWYpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQlVGX0NGRzogeworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogR2V0LWJ1Zi1jZmc6IG1ldGFbJWRdIGZyYW1lc3BlcmJ1ZlslZF1cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSwKKwkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmKTsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPmJ1Zl9jZmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcpKSkKKwkJCXJjID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogeworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPnBjbV9jZmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZykpKQorCQkJcmMgPSAtRUZBVUxUOworCQlicmVhazsKKworCX0KKwljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhdWRpb19pbl9zZXRfY29uZmlnKGZpbGUsICZjZmcpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJLyogY2FsbCBjb2RlYyBzcGVjaWZpYyBpb2N0bCAqLworCQlyYyA9IGF1ZGlvLT5lbmNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCX0KKwltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzMzIgeworCXUzMiBieXRlX2NvdW50OworCXUzMiBzYW1wbGVfY291bnQ7CisJdTMyIHVudXNlZFsyXTsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIHsKKwl1MzIgYnVmZmVyX3NpemU7CisJdTMyIGJ1ZmZlcl9jb3VudDsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fY29uZmlnMzIgeworCXUzMiBidWZmZXJfc2l6ZTsKKwl1MzIgYnVmZmVyX2NvdW50OworCXUzMiBjaGFubmVsX2NvdW50OworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgdHlwZTsKKwl1MzIgbWV0YV9maWVsZDsKKwl1MzIgYml0czsKKwl1MzIgdW51c2VkWzNdOworfTsKKworc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIgeworCXUzMiBtZXRhX2luZm9fZW5hYmxlOworCXUzMiBmcmFtZXNfcGVyX2J1ZjsKK307CisKK2VudW0geworCUFVRElPX0dFVF9DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCAzLAorCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiksCisJQVVESU9fU0VUX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDQsCisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyKSwKKwlBVURJT19HRVRfU1RBVFNfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA1LAorCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0czMyKSwKKwlBVURJT19TRVRfU1RSRUFNX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDgwLAorCQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIpLAorCUFVRElPX0dFVF9TVFJFQU1fQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywgODEsCisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWczMiksCisJQVVESU9fU0VUX0JVRl9DRkdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5NCwKKwkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyKSwKKwlBVURJT19HRVRfQlVGX0NGR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDkzLAorCQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIpLAorfTsKKworbG9uZyBhdWRpb19pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFNfMzIpIHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdGF0czMyIHN0YXRzXzMyOworCisJCW1lbXNldCgmc3RhdHNfMzIsIDAsIHNpemVvZihzdGF0c18zMikpOworCQlzdGF0c18zMi5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7CisJCXN0YXRzXzMyLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHNfMzIsIHNpemVvZihzdGF0c18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkIGZvciBBVURJT19HRVRfU1RBVFNfMzJcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHJjOworCX0KKworCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fRkxVU0g6CisJY2FzZSBBVURJT19QQVVTRToKKwljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgorCQlyYyA9IGF1ZGlvX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIgY2ZnXzMyOworCisJCW1lbXNldCgmY2ZnXzMyLCAwLCBzaXplb2YoY2ZnXzMyKSk7CisJCWNmZ18zMi5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplOworCQljZmdfMzIuYnVmZmVyX2NvdW50ID0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50OworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLCBzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IENvcHkgdG8gdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fR0VUX1NUUkVBTV9DT05GSUcgJWQgJWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQljZmdfMzIuYnVmZmVyX3NpemUsCisJCQkJY2ZnXzMyLmJ1ZmZlcl9jb3VudCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIGNmZ18zMjsKKwkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQljZmcuYnVmZmVyX3NpemUgPSBjZmdfMzIuYnVmZmVyX3NpemU7CisJCWNmZy5idWZmZXJfY291bnQgPSBjZmdfMzIuYnVmZmVyX2NvdW50OworCQkvKiBNaW5pbXVtIHNpbmdsZSBmcmFtZSBzaXplLAorCQkgKiBidXQgd2l0aCBpbiBtYXhpbXVtIGZyYW1lcyBudW1iZXIKKwkJICovCisJCWlmICgoY2ZnLmJ1ZmZlcl9zaXplIDwgKGF1ZGlvLT5taW5fZnJhbWVfc2l6ZSArCisJCQlzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpKSB8fAorCQkJKGNmZy5idWZmZXJfY291bnQgPCBGUkFNRV9OVU0pKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKKwkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gY2ZnLmJ1ZmZlcl9jb3VudDsKKwkJaWYgKGF1ZGlvLT5vcGVuZWQpIHsKKwkJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhPVVQsIGF1ZGlvLT5hYywKKwkJCQlBTElHTl9CVUZfU0laRShhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSksCisJCQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBzZXNzaW9uIGlkICVkOlxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQkJcHJfZXJyKCJCdWZmZXIgQWxsb2MgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX09VVDsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NFVF9TVFJFQU1fQ09ORklHICVkICVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUsCisJCQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0JVRl9DRkdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIgY2ZnXzMyOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0JVR19DRkdfMzIgZmFpbGVkIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQljZmcubWV0YV9pbmZvX2VuYWJsZSA9IGNmZ18zMi5tZXRhX2luZm9fZW5hYmxlOworCQljZmcuZnJhbWVzX3Blcl9idWYgPSBjZmdfMzIuZnJhbWVzX3Blcl9idWY7CisKKwkJaWYgKChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSAmJgorCQkJIWNmZy5tZXRhX2luZm9fZW5hYmxlKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlc3RyaWN0IHRoZSBudW0gb2YgZnJhbWVzIHBlciBidWYgdG8gY29pbmNpZGUgd2l0aAorCQkgKiBkZWZhdWx0IGJ1ZiBzaXplCisJCSAqLworCQlpZiAoY2ZnLmZyYW1lc19wZXJfYnVmID4gYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZikgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IGNmZy5tZXRhX2luZm9fZW5hYmxlOworCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IGNmZy5mcmFtZXNfcGVyX2J1ZjsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IFNldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLm1ldGFfaW5mb19lbmFibGUsCisJCQljZmcuZnJhbWVzX3Blcl9idWYpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQlVGX0NGR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiBjZmdfMzI7CisKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEdldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAorCQkJX19mdW5jX18sCisJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUsCisJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1Zik7CisJCWNmZ18zMi5tZXRhX2luZm9fZW5hYmxlID0gYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZTsKKwkJY2ZnXzMyLmZyYW1lc19wZXJfYnVmID0gYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWY7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZ18zMiwKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIGNmZ18zMjsKKworCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOworCQljZmdfMzIuYnVmZmVyX3NpemUgPSBhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZTsKKwkJY2ZnXzMyLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudDsKKwkJY2ZnXzMyLmNoYW5uZWxfY291bnQgPSBhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50OworCQljZmdfMzIuc2FtcGxlX3JhdGUgPSBhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZTsKKwkJY2ZnXzMyLnR5cGUgPSBhdWRpby0+cGNtX2NmZy50eXBlOworCQljZmdfMzIubWV0YV9maWVsZCA9IGF1ZGlvLT5wY21fY2ZnLm1ldGFfZmllbGQ7CisJCWNmZ18zMi5iaXRzID0gYXVkaW8tPnBjbV9jZmcuYml0czsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLAorCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19jb25maWczMikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIGNmZ18zMjsKKwkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY2ZnLmJ1ZmZlcl9zaXplID0gY2ZnXzMyLmJ1ZmZlcl9zaXplOworCQljZmcuYnVmZmVyX2NvdW50ID0gY2ZnXzMyLmJ1ZmZlcl9jb3VudDsKKwkJY2ZnLmNoYW5uZWxfY291bnQgPSBjZmdfMzIuY2hhbm5lbF9jb3VudDsKKwkJY2ZnLnNhbXBsZV9yYXRlID0gY2ZnXzMyLnNhbXBsZV9yYXRlOworCQljZmcudHlwZSA9IGNmZ18zMi50eXBlOworCQljZmcubWV0YV9maWVsZCA9IGNmZ18zMi5tZXRhX2ZpZWxkOworCQljZmcuYml0cyA9IGNmZ18zMi5iaXRzOworCQlyYyA9IGF1ZGlvX2luX3NldF9jb25maWcoZmlsZSwgJmNmZyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQkgIC8qIGNhbGwgY29kZWMgc3BlY2lmaWMgaW9jdGwgKi8KKwkJICByYyA9IGF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKK3NzaXplX3QgYXVkaW9faW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IHNpemUgPSAwOworCWludCByYyA9IDA7CisJdWludDMyX3QgaWR4OworCXN0cnVjdCBtZXRhX291dF9kc3AgbWV0YTsKKwl1aW50MzJfdCBieXRlc190b19jb3B5ID0gMDsKKwl1aW50MzJfdCBtZmllbGRfc2l6ZSA9IChhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID09IDApID8gMCA6CisJCShzaXplb2YodW5zaWduZWQgY2hhcikgKworCQkoc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKihhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZikpKTsKKworCW1lbXNldCgmbWV0YSwgMCwgc2l6ZW9mKG1ldGEpKTsKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogcmVhZCAtICV6ZFxuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCWNvdW50KTsKKwlpZiAoYXVkaW8tPnJlc2V0X2V2ZW50KQorCQlyZXR1cm4gLUVORVRSRVNFVDsKKworCWlmICghYXVkaW8tPmVuYWJsZWQpCisJCXJldHVybiAtRUZBVUxUOworCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQlhdWRpby0+cmVhZF93YWl0LAorCQkJKChhdG9taWNfcmVhZCgmYXVkaW8tPm91dF9jb3VudCkgPiAwKSB8fAorCQkJKGF1ZGlvLT5zdG9wcGVkKSB8fAorCQkJIGF1ZGlvLT5yZmx1c2ggfHwgYXVkaW8tPmVvc19yc3AgfHwKKwkJCWF1ZGlvLT5ldmVudF9hYm9ydCkpOworCisJCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKChhdWRpby0+c3RvcHBlZCAmJiAhKGF0b21pY19yZWFkKCZhdWRpby0+b3V0X2NvdW50KSkpIHx8CisJCQlhdWRpby0+cmZsdXNoKSB7CisJCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZHJpdmVyIGluIHN0b3Agc3RhdGUgb3IgZmx1c2gsTm8gbW9yZSBidWYgdG8gcmVhZCIsCisJCQkJX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCXJjID0gMDsvKiBFbmQgb2YgRmlsZSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoYXRvbWljX3JlYWQoJmF1ZGlvLT5vdXRfY291bnQpKSAmJgorCQkJKGF1ZGlvLT5lb3NfcnNwID09IDEpICYmCisJCQkoY291bnQgPj0gKHNpemVvZih1bnNpZ25lZCBjaGFyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgbnVtX29mX2ZyYW1lczsKKworCQkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogZW9zICVkIGF0IG91dHB1dFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW9zX3JzcCk7CisJCQlpZiAoYnVmICE9IHN0YXJ0KQorCQkJCWJyZWFrOworCQkJbnVtX29mX2ZyYW1lcyA9IDB4RkY7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJm51bV9vZl9mcmFtZXMsCisJCQkJCXNpemVvZih1bnNpZ25lZCBjaGFyKSkpIHsKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlidWYgKz0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQkJbWV0YS5mcmFtZV9zaXplID0gMHhGRkZGOworCQkJbWV0YS5lbmNvZGVkX3BjbV9zYW1wbGVzID0gMHhGRkZGOworCQkJbWV0YS5tc3dfdHMgPSAweDAwOworCQkJbWV0YS5sc3dfdHMgPSAweDAwOworCQkJbWV0YS5uZmxhZ3MgPSBBVURfRU9TX1NFVDsKKwkJCWF1ZGlvLT5lb3NfcnNwID0gMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmbWV0YSwgc2l6ZW9mKG1ldGEpKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ1ZiArPSBzaXplb2YobWV0YSk7CisJCQlicmVhazsKKwkJfQorCQlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilxNmFzbV9pc19jcHVfYnVmX2F2YWlsKE9VVCwgYXVkaW8tPmFjLAorCQkJCQkJJnNpemUsICZpZHgpOworCQlpZiAoKGNvdW50ID49IChzaXplICsgbWZpZWxkX3NpemUpKSAmJiBkYXRhKSB7CisJCQlpZiAoYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLAorCQkJCQkmYXVkaW8tPm91dF9mcmFtZV9pbmZvW2lkeF1bMF0sCisJCQkJCXNpemVvZih1bnNpZ25lZCBjaGFyKSkpIHsKKwkJCQkJcmMgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnl0ZXNfdG9fY29weSA9CisJCQkJCShzaXplICsgYXVkaW8tPm91dF9mcmFtZV9pbmZvW2lkeF1bMV0pOworCQkJCS8qIE51bWJlciBvZiBmcmFtZXMgaW5mb3JtYXRpb24gY29waWVkICovCisJCQkJYnVmICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJCQljb3VudCAtPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJCQl9IGVsc2UgeworCQkJCW9mZnNldCA9IGF1ZGlvLT5vdXRfZnJhbWVfaW5mb1tpZHhdWzFdOworCQkJCWJ5dGVzX3RvX2NvcHkgPSBzaXplOworCQkJfQorCisJCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogb2Zmc2V0PSVkIG5yIG9mIGZyYW1lcz0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJCWF1ZGlvLT5vdXRfZnJhbWVfaW5mb1tpZHhdWzFdLAorCQkJCQlhdWRpby0+b3V0X2ZyYW1lX2luZm9baWR4XVswXSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZGF0YVtvZmZzZXRdLCBieXRlc190b19jb3B5KSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvdW50IC09IGJ5dGVzX3RvX2NvcHk7CisJCQlidWYgKz0gYnl0ZXNfdG9fY29weTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogc2hvcnQgcmVhZCBkYXRhWyVwS10gYnl0ZXNhdmFpbFslZF1ieXRlc3JlcXVlc3RbJXpkXVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJZGF0YSwgc2l6ZSwgY291bnQpOworCQl9CisJCWF0b21pY19kZWMoJmF1ZGlvLT5vdXRfY291bnQpOworCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHJlYWQ6ICV6ZCBieXRlc1xuIiwgX19mdW5jX18sCisJCQlhdWRpby0+YWMtPnNlc3Npb24sIChidWYtc3RhcnQpKTsKKwlpZiAoYnVmID4gc3RhcnQpCisJCXJldHVybiBidWYgLSBzdGFydDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZXh0cmFjdF9tZXRhX2luZm8oY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nICptc3dfdHMsCisJCXVuc2lnbmVkIGxvbmcgKmxzd190cywgdW5zaWduZWQgaW50ICpmbGFncykKK3sKKwlzdHJ1Y3QgbWV0YV9pbiAqbWV0YSA9IChzdHJ1Y3QgbWV0YV9pbiAqKWJ1ZjsKKwkqbXN3X3RzID0gbWV0YS0+bnRpbWVzdGFtcC5oaWdocGFydDsKKwkqbHN3X3RzID0gbWV0YS0+bnRpbWVzdGFtcC5sb3dwYXJ0OworCSpmbGFncyA9IG1ldGEtPm5mbGFnczsKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBhdWRpb19pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOworCXNpemVfdCB4ZmVyID0gMDsKKwljaGFyICpjcHlfcHRyOworCWludCByYyA9IDA7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1aW50MzJfdCBzaXplID0gMDsKKwl1aW50MzJfdCBpZHggPSAwOworCXVpbnQzMl90IG5mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBtc3dfdHMgPSAwOworCXVuc2lnbmVkIGxvbmcgbHN3X3RzID0gMDsKKwl1aW50MzJfdCBtZmllbGRfc2l6ZSA9IChhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID09IDApID8gMCA6CisJCQlzaXplb2Yoc3RydWN0IG1ldGFfaW4pOworCisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHRvIHdyaXRlWyV6ZF1cbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBjb3VudCk7CisJaWYgKGF1ZGlvLT5yZXNldF9ldmVudCkKKwkJcmV0dXJuIC1FTkVUUkVTRVQ7CisKKwlpZiAoIWF1ZGlvLT5lbmFibGVkKQorCQlyZXR1cm4gLUVGQVVMVDsKKwltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAorCQkJCSAgICAgKChhdG9taWNfcmVhZCgmYXVkaW8tPmluX2NvdW50KSA+IDApIHx8CisJCQkJICAgICAgKGF1ZGlvLT5zdG9wcGVkKSB8fAorCQkJCSAgICAgIChhdWRpby0+d2ZsdXNoKSB8fCAoYXVkaW8tPmV2ZW50X2Fib3J0KSkpOworCisJCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgeworCQkJcHJfZGVidWcoIiVzOiBzZXNzaW9uIGlkICVkOiBzdG9wIG9yIGZsdXNoXG4iLCBfX2Z1bmNfXywKKwkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCXJjID0gLUVCVVNZOworCQkJYnJlYWs7CisJCX0KKwkJLyogaWYgbm8gUENNIGRhdGEsIG1pZ2h0IGhhdmUgb25seSBlb3MgYnVmZmVyCisJCSAqIHN1Y2ggY2FzZSBkbyBub3QgaG9sZCBjcHUgYnVmZmVyCisJCSAqLworCQlpZiAoKGJ1ZiA9PSBzdGFydCkgJiYgKGNvdW50ID09IG1maWVsZF9zaXplKSkgeworCQkJY2hhciBlb3NfYnVmW3NpemVvZihzdHJ1Y3QgbWV0YV9pbildOworCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KKwkJCWlmIChjb3B5X2Zyb21fdXNlcihlb3NfYnVmLCBidWYsIG1maWVsZF9zaXplKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcworCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCisJCQkgKi8KKwkJCWV4dHJhY3RfbWV0YV9pbmZvKGVvc19idWYsICZtc3dfdHMsICZsc3dfdHMsCisJCQkJCQkmbmZsYWdzKTsKKwkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKKwkJCS8qIHNlbmQgdGhlIEVPUyBhbmQgcmV0dXJuICovCisJCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogc2VuZCBFT1MgMHglOHhcbiIsCisJCQkJX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBuZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopcTZhc21faXNfY3B1X2J1Zl9hdmFpbChJTiwgYXVkaW8tPmFjLAorCQkJCQkJJnNpemUsICZpZHgpOworCQlpZiAoIWRhdGEpIHsKKwkJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBObyBidWYgYXZhaWxhYmxlXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJY29udGludWU7CisJCX0KKwkJY3B5X3B0ciA9IGRhdGE7CisJCWlmIChhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlKSB7CisJCQlpZiAoYnVmID09IHN0YXJ0KSB7CisJCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKKwkJCQkJcmMgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCisJCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCisJCQkJICovCisJCQkJZXh0cmFjdF9tZXRhX2luZm8oY3B5X3B0ciwgJm1zd190cywgJmxzd190cywKKwkJCQkJCSZuZmxhZ3MpOworCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKKwkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGNvbnRpbnVvdXMgYnVmZmVyXG4iLAorCQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQl9CisJCX0KKwkJeGZlciA9IChjb3VudCA+IChhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSkpID8KKwkJCQkoYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUpIDogY291bnQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gcTZhc21fd3JpdGUoYXVkaW8tPmFjLCB4ZmVyLCBtc3dfdHMsIGxzd190cywgMHgwMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWF0b21pY19kZWMoJmF1ZGlvLT5pbl9jb3VudCk7CisJCWNvdW50IC09IHhmZXI7CisJCWJ1ZiArPSB4ZmVyOworCX0KKwltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZW9zX2NvbmRpdGlvbiAweCV4IGJ1ZlsweCVwS10gc3RhcnRbMHglcEtdXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJbmZsYWdzLCBidWYsIHN0YXJ0KTsKKwlpZiAobmZsYWdzICYgQVVEX0VPU19TRVQpIHsKKwkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfRU9TKTsKKwkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogZW9zICVkIGF0IGlucHV0XG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lb3NfcnNwKTsKKwl9CisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IFdyaXR0ZW4gJXpkIEF2YWlsIEJ1ZlslZF0iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgKGJ1ZiAtIHN0YXJ0IC0gbWZpZWxkX3NpemUpLAorCQkJYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9jb3VudCkpOworCWlmICghcmMpIHsKKwkJaWYgKGJ1ZiA+IHN0YXJ0KQorCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdWRpb19pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwcl9pbmZvKCIlczogc2Vzc2lvbiBpZCAlZFxuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCWF1ZGlvX2luX2Rpc2FibGUoYXVkaW8pOworCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOworCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHMuaCBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUxN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlscy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgInE2YXVkaW9fY29tbW9uLmgiCisKKyNkZWZpbmUgRlJBTUVfTlVNCSg4KQorCisjZGVmaW5lIFBDTV9CVUZfQ09VTlQJCSgyKQorCisjZGVmaW5lIEFVRF9FT1NfU0VUICAweDAxCisjZGVmaW5lIFRVTk5FTF9NT0RFICAgICAweDAwMDAKKyNkZWZpbmUgTk9OX1RVTk5FTF9NT0RFIDB4MDAwMQorCisjZGVmaW5lIE5PX0JVRl9BTExPQwkweDAwCisjZGVmaW5lIEJVRl9BTExPQ19JTiAgICAweDAxCisjZGVmaW5lIEJVRl9BTExPQ19PVVQgICAweDAyCisjZGVmaW5lIEJVRl9BTExPQ19JTk9VVCAweDAzCisjZGVmaW5lIEFMSUdOX0JVRl9TSVpFKHNpemUpICgoc2l6ZSArIDQwOTUpICYgKH40MDk1KSkKKworc3RydWN0IHRpbWVzdGFtcCB7CisJdTMyIGxvd3BhcnQ7CisJdTMyIGhpZ2hwYXJ0OworfSBfX3BhY2tlZDsKKworc3RydWN0IG1ldGFfaW4geworCXVuc2lnbmVkIHNob3J0IG9mZnNldDsKKwlzdHJ1Y3QgdGltZXN0YW1wIG50aW1lc3RhbXA7CisJdW5zaWduZWQgaW50IG5mbGFnczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtZXRhX291dF9kc3AgeworCXUzMiBvZmZzZXRfdG9fZnJhbWU7CisJdTMyIGZyYW1lX3NpemU7CisJdTMyIGVuY29kZWRfcGNtX3NhbXBsZXM7CisJdTMyIG1zd190czsKKwl1MzIgbHN3X3RzOworCXUzMiBuZmxhZ3M7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbWV0YV9vdXQgeworCXVuc2lnbmVkIGNoYXIgbnVtX29mX2ZyYW1lczsKKwlzdHJ1Y3QgbWV0YV9vdXRfZHNwIG1ldGFfb3V0X2RzcFtdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHE2YXVkaW9faW4geworCXNwaW5sb2NrX3QJCQlkc3BfbG9jazsKKwlhdG9taWNfdAkJCWluX2J5dGVzOworCWF0b21pY190CQkJaW5fc2FtcGxlczsKKworCXN0cnVjdCBtdXRleAkJCWxvY2s7CisJc3RydWN0IG11dGV4CQkJcmVhZF9sb2NrOworCXN0cnVjdCBtdXRleAkJCXdyaXRlX2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXJlYWRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJd3JpdGVfd2FpdDsKKworCXN0cnVjdCBhdWRpb19jbGllbnQgICAgICAgICAgICAgKmFjOworCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyAgc3RyX2NmZzsKKwl2b2lkCQkJCSplbmNfY2ZnOworCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZyAgICAgICAgYnVmX2NmZzsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZwkJcGNtX2NmZzsKKwl2b2lkCQkJCSpjb2RlY19jZmc7CisKKwkvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZC93cml0ZSAqLworCWF0b21pY190CQkJaW5fY291bnQ7CisJYXRvbWljX3QJCQlvdXRfY291bnQ7CisKKwkvKiBmaXJzdCBpZHg6IG51bSBvZiBmcmFtZXMgcGVyIGJ1Ziwgc2Vjb25kIGlkeDogb2Zmc2V0IHRvIGZyYW1lICovCisJdWludDMyX3QJCQlvdXRfZnJhbWVfaW5mb1tGUkFNRV9OVU1dWzJdOworCWludAkJCQllb3NfcnNwOworCWludAkJCQlvcGVuZWQ7CisJaW50CQkJCWVuYWJsZWQ7CisJaW50CQkJCXN0b3BwZWQ7CisJaW50CQkJCWV2ZW50X2Fib3J0OworCWludAkJCQlmZWVkYmFjazsgLyogRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB1c2VkCisJCQkJCQkgICAqIGluIE5vbiBUdW5uZWwgbW9kZQorCQkJCQkJICAgKi8KKwlpbnQJCQkJcmZsdXNoOworCWludAkJCQl3Zmx1c2g7CisJaW50CQkJCWJ1Zl9hbGxvYzsKKwl1aW50MTZfdAkJCW1pbl9mcmFtZV9zaXplOworCXVpbnQxNl90CQkJbWF4X2ZyYW1lc19wZXJfYnVmOworCWJvb2wJCQkJcmVzZXRfZXZlbnQ7CisJbG9uZyAoKmVuY19pb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlsb25nICgqZW5jX2NvbXBhdF9pb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK307CisKK2ludCBhdWRpb19pbl9lbmFibGUoc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyk7CitpbnQgYXVkaW9faW5fZGlzYWJsZShzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvKTsKK2ludCBhdWRpb19pbl9idWZfYWxsb2Moc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvKTsKK2xvbmcgYXVkaW9faW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitsb25nIGF1ZGlvX2luX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2Vsc2UKKyNkZWZpbmUgYXVkaW9faW5fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorc3NpemVfdCBhdWRpb19pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTsKK3NzaXplX3QgYXVkaW9faW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpOworaW50IGF1ZGlvX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IGF1ZGlvX2luX3NldF9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBtc21fYXVkaW9fY29uZmlnICpjZmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlsc19haW8uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHNfYWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMDYzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHNfYWlvLmMKQEAgLTAsMCArMSwyMTMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKKyNpZmRlZiBDT05GSUdfVVNFX0RFVl9DVFJMX1ZPTFVNRQorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fZGV2X2N0bC5oPgorI2VuZGlmIC8qQ09ORklHX1VTRV9ERVZfQ1RSTF9WT0xVTUUqLworI2lmZGVmIENPTkZJR19ERUJVR19GUworaW50IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgYXVkaW9fYWlvX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7CisJc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOworCWludCBuID0gMDsKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkiZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5mZWVkYmFjayk7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCisJICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KKwkgKiBlbmZvcmNlZAorCSAqLworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAorCQkJInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKKwkJCSJpbnF1ZXVlIGVtcHR5ICVkXG4iLCBsaXN0X2VtcHR5KCZhdWRpby0+aW5fcXVldWUpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAorCQkJIm91dHF1ZXVlIGVtcHR5ICVkXG4iLCBsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSk7CisJYnVmZmVyW25dID0gMDsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKK30KKyNlbmRpZgorCitzdGF0aWMgbG9uZyBhdWRpb19haW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGF1ZGlvX2Fpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpOworI2Vsc2UKKyNkZWZpbmUgYXVkaW9fYWlvX2NvbXBhdF9pb2N0bCBOVUxMCisjZW5kaWYKK2ludCBpbnNlcnRfZW9zX2J1ZihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZSkKK3sKKwlzdHJ1Y3QgZGVjX21ldGFfb3V0ICplb3NfYnVmID0gYnVmX25vZGUtPmt2YWRkcjsKKworCXByX2RlYnVnKCIlc1slcEtdOmluc2VydF9lb3NfYnVmXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCWVvc19idWYtPm51bV9vZl9mcmFtZXMgPSAweEZGRkZGRkZGOworCWVvc19idWYtPm1ldGFfb3V0X2RzcFswXS5vZmZzZXRfdG9fZnJhbWUgPSAweDA7CisJZW9zX2J1Zi0+bWV0YV9vdXRfZHNwWzBdLm5mbGFncyA9IEFVRElPX0RFQ19FT1NfU0VUOworCXJldHVybiBzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCkgKworCQlzaXplb2YoZW9zX2J1Zi0+bWV0YV9vdXRfZHNwWzBdKTsKK30KKworLyogUm91dGluZSB3aGljaCB1cGRhdGVzIHJlYWQgYnVmZmVycyBvZiBkcml2ZXIvZHNwLAorICogZm9yIGZsdXNoIG9wZXJhdGlvbiBhcyBEU1Agb3V0cHV0IG1pZ2h0IG5vdCBoYXZlIHByb3BlcgorICogdmFsdWUgc2V0CisgKi8KK3N0YXRpYyBpbnQgaW5zZXJ0X21ldGFfZGF0YV9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlKQoreworCXN0cnVjdCBkZWNfbWV0YV9vdXQgKm1ldGFfZGF0YSA9IGJ1Zl9ub2RlLT5rdmFkZHI7CisKKwltZXRhX2RhdGEtPm51bV9vZl9mcmFtZXMgPSAweDA7CisJbWV0YV9kYXRhLT5tZXRhX291dF9kc3BbMF0ub2Zmc2V0X3RvX2ZyYW1lID0gMHgwOworCW1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLm5mbGFncyA9IDB4MDsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpICsKKwkJc2l6ZW9mKG1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdKTsKK30KKworc3RhdGljIGludCBhdWRpb19haW9faW9uX2xvb2t1cF92YWRkcihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB2b2lkICphZGRyLAorCQkJCQl1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uICoqcmVnaW9uKQoreworCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uX2VsdDsKKworCWludCBtYXRjaF9jb3VudCA9IDA7CisKKwkqcmVnaW9uID0gTlVMTDsKKworCS8qIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzcyBvciB6ZXJvICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKKwkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKKwkJCWFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgorCQkJYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikgeworCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlIGEgcmVnaXN0ZXJlZAorCQkJICogaW9uIGJ1ZmZlcgorCQkJICovCisKKwkJCW1hdGNoX2NvdW50Kys7CisJCQlpZiAoISpyZWdpb24pCisJCQkJKnJlZ2lvbiA9IHJlZ2lvbl9lbHQ7CisJCX0KKwl9CisKKwlpZiAobWF0Y2hfY291bnQgPiAxKSB7CisJCXByX2VycigiJXNbJXBLXTptdWx0aXBsZSBoaXRzIGZvciB2YWRkciAlcEssIGxlbiAlbGRcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIGFkZHIsIGxlbik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlLAorCQkJCQlsaXN0KSB7CisJCQlpZiAoYWRkciA+PSByZWdpb25fZWx0LT52YWRkciAmJgorCQkJYWRkciA8IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuICYmCisJCQlhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKQorCQkJCXByX2VycigiXHQlc1slcEtdOiVwSywgJWxkIC0tPiAlcEtcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpbywKKwkJCQkJcmVnaW9uX2VsdC0+dmFkZHIsCisJCQkJCXJlZ2lvbl9lbHQtPmxlbiwKKwkJCQkJJnJlZ2lvbl9lbHQtPnBhZGRyKTsKKwkJfQorCX0KKworCXJldHVybiAqcmVnaW9uID8gMCA6IC0xOworfQorCitzdGF0aWMgcGh5c19hZGRyX3QgYXVkaW9fYWlvX2lvbl9maXh1cChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB2b2lkICphZGRyLAorCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwLCB2b2lkICoqa3ZhZGRyKQoreworCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uOworCXBoeXNfYWRkcl90IHBhZGRyOworCWludCByZXQ7CisKKwlyZXQgPSBhdWRpb19haW9faW9uX2xvb2t1cF92YWRkcihhdWRpbywgYWRkciwgbGVuLCAmcmVnaW9uKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXNbJXBLXTpsb29rdXAgKCVwSywgJWxkKSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLCBhZGRyLCBsZW4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJlZl91cCkKKwkJcmVnaW9uLT5yZWZfY250Kys7CisJZWxzZQorCQlyZWdpb24tPnJlZl9jbnQtLTsKKwlwcl9kZWJ1ZygiJXNbJXBLXTpmb3VuZCByZWdpb24gJXBLIHJlZl9jbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIHJlZ2lvbiwgcmVnaW9uLT5yZWZfY250KTsKKwlwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAoYWRkciAtIHJlZ2lvbi0+dmFkZHIpOworCS8qIHByb3ZpZGUga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIG1ldGEgaW5mb3JtYXRpb24gKi8KKwlpZiAoa3ZhZGRyKQorCQkqa3ZhZGRyID0gKHZvaWQgKikgKHJlZ2lvbi0+a3ZhZGRyICsgKGFkZHIgLSByZWdpb24tPnZhZGRyKSk7CisJcmV0dXJuIHBhZGRyOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2Fpb19wYXVzZShzdHJ1Y3QgcTZhdWRpb19haW8gICphdWRpbykKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcHJfZGVidWcoIiVzWyVwS10sIGVuYWJsZWQgPSAlZFxuIiwgX19mdW5jX18sIGF1ZGlvLAorCQkJYXVkaW8tPmVuYWJsZWQpOworCWlmIChhdWRpby0+ZW5hYmxlZCkgeworCQlyYyA9IHE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9QQVVTRSk7CisJCWlmIChyYyA8IDApCisJCQlwcl9lcnIoIiVzWyVwS106IHBhdXNlIGNtZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7CisKKwkJaWYgKHJjID09IDApIHsKKwkJCS8qIFNlbmQgc3VzcGVuZCBvbmx5IGlmIHBhdXNlIHdhcyBzdWNjZXNzZnVsICovCisJCQlyYyA9IHE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9TVVNQRU5EKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlc1slcEtdOiBzdXNwZW5kIGNtZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCQl9IGVsc2UKKwkJCXByX2VycigiJXNbJXBLXTogbm90IHNlbmRpbmcgc3VzcGVuZCBzaW5jZSBwYXVzZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvKTsKKworCX0gZWxzZQorCQlwcl9lcnIoIiVzWyVwS106IERyaXZlciBub3QgZW5hYmxlZFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2FpbyAgKmF1ZGlvKQoreworCWludCByYyA9IDA7CisKKwlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKKwkJLyogSW1wbGljaXRseSBpc3N1ZSBhIHBhdXNlIHRvIHRoZSBkZWNvZGVyIGJlZm9yZSBmbHVzaGluZyBpZgorCQkgKiBpdCBpcyBub3QgaW4gcGF1c2Ugc3RhdGUKKwkJICovCisJCWlmICghKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfUEFVU0UpKSB7CisJCQlyYyA9IGF1ZGlvX2Fpb19wYXVzZShhdWRpbyk7CisJCQlpZiAocmMgPCAwKQorCQkJCXByX2VycigiJXNbJXBLfTogcGF1c2UgY21kIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLAorCQkJCQlyYyk7CisJCQllbHNlCisJCQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfUEFVU0U7CisJCX0KKwkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfRkxVU0gpOworCQlpZiAocmMgPCAwKQorCQkJcHJfZXJyKCIlc1slcEtdOiBmbHVzaCBjbWQgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCQkvKiBOb3QgaW4gc3RvcCBzdGF0ZSwgcmVlbmFibGUgdGhlIHN0cmVhbSAqLworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMCkgeworCQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJCWlmIChyYykKKwkJCQlwcl9lcnIoIiVzWyVwS106YXVkaW8gcmUtZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCWVsc2UgeworCQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19QQVVTRSkKKwkJCQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX1BBVVNFOworCQkJfQorCQl9CisJfQorCXByX2RlYnVnKCIlc1slcEtdOmluX2J5dGVzICVkXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7CisJcHJfZGVidWcoIiVzWyVwS106aW5fc2FtcGxlcyAlZFxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbywgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKSk7CisJYXRvbWljX3NldCgmYXVkaW8tPmluX2J5dGVzLCAwKTsKKwlhdG9taWNfc2V0KCZhdWRpby0+aW5fc2FtcGxlcywgMCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2Fpb19vdXRwb3J0X2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJaW50IHJjOworCisJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfT1VUX0ZMVVNIKTsKKwlpZiAocmMgPCAwKQorCQlwcl9lcnIoIiVzWyVwS306IG91dHB1dCBwb3J0IGZsdXNoIGNtZCBmYWlsZWQgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFdyaXRlIGJ1ZmZlciB0byBEU1AgLyBIYW5kbGUgQWNrIGZyb20gRFNQICovCit2b2lkIGF1ZGlvX2Fpb19hc3luY193cml0ZV9hY2soc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdWludDMyX3QgdG9rZW4sCisJCQkJdWludDMyX3QgKnBheWxvYWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOworCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKnVzZWRfYnVmOworCisJLyogTm8gYWN0aXZlIGZsdXNoIGluIHByb2dyZXNzICovCisJaWYgKGF1ZGlvLT53Zmx1c2gpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpIHsKKwkJcHJfd2FybigiJXM6IGlnbm9yZSB1bmV4cGVjdGVkIGV2ZW50IGZyb20gZHNwXG4iLCBfX2Z1bmNfXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXVzZWRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKKwkJCQkJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSwgbGlzdCk7CisJaWYgKHRva2VuID09IHVzZWRfYnVmLT50b2tlbikgeworCQlsaXN0X2RlbCgmdXNlZF9idWYtPmxpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwkJcHJfZGVidWcoIiVzWyVwS106Y29uc3VtZWQgYnVmZmVyXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlldmVudF9wYXlsb2FkLmFpb19idWYgPSB1c2VkX2J1Zi0+YnVmOworCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfV1JJVEVfRE9ORSwKKwkJCQkJZXZlbnRfcGF5bG9hZCk7CisJCWtmcmVlKHVzZWRfYnVmKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpICYmCisJCQkoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykpIHsKKwkJCXByX2RlYnVnKCIlc1slcEtdOiBsaXN0IGlzIGVtcHR5LCByZWFjaGVkIEVPUyBpbiBUdW5uZWxcbiIsCisJCQkJIF9fZnVuY19fLCBhdWRpbyk7CisJCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzWyVwS106ZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCB1c2VkX2J1Zi0+dG9rZW4sIHRva2VuKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgYXVkaW9fYWlvX2FzeW5jX291dF9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzWyVwS31cbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJLyogRU9TIGZvbGxvd2VkIGJ5IGZsdXNoLCBFT1MgcmVzcG9uc2Ugbm90IGd1cmFudGVlZCwgZnJlZSBFT1MgaS9wCisJICogYnVmZmVyCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworCisJaWYgKGF1ZGlvLT5lb3NfZmxhZyAmJiAoYXVkaW8tPmVvc193cml0ZV9wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIpKSB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBFT1MgZm9sbG93ZWQgYnkgZmx1c2ggcmVjZWl2ZWQsYWNrbm93bGVkZ2UiLAorCQkJImVvcyBpL3AgYnVmZmVyIGltbWVkaWF0ZWx5XG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfV1JJVEVfRE9ORSwKKwkJCQlhdWRpby0+ZW9zX3dyaXRlX3BheWxvYWQpOworCQltZW1zZXQoJmF1ZGlvLT5lb3Nfd3JpdGVfcGF5bG9hZCwgMCwKKwkJCXNpemVvZih1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPm91dF9xdWV1ZSkgeworCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKKwkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsIHBheWxvYWQpOworCQlrZnJlZShidWZfbm9kZSk7CisJCXByX2RlYnVnKCIlc1slcEtdOiBQcm9wYWdhdGUgV1JJVEVfRE9ORSBkdXJpbmcgZmx1c2hcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwl9Cit9CisKK3ZvaWQgYXVkaW9fYWlvX2FzeW5jX2luX2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOworCisJcHJfZGVidWcoIiVzWyVwS11cbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pbl9xdWV1ZSkgeworCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJLyogRm9yY2VmdWxsIHNlbmQgby9wIGVvcyBidWZmZXIgYWZ0ZXIgZmx1c2gsIGlmIG5vIGVvcyByZXNwb25zZQorCQkgKiByZWNlaXZlZCBieSBkc3AgZXZlbiBhZnRlciBzZW5kaW5nIGVvcyBjb21tYW5kCisJCSAqLworCQlpZiAoKGF1ZGlvLT5lb3NfcnNwICE9IDEpICYmIGF1ZGlvLT5lb3NfZmxhZykgeworCQkJcHJfZGVidWcoIiVzWyVwS106IHNlbmQgZW9zIG9uIG8vcCBidWZmZXIgZHVyaW5nIGZsdXNoXG4iLAorCQkJCSBfX2Z1bmNfXywgYXVkaW8pOworCQkJcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKKwkJCXBheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9CisJCQkJCWluc2VydF9lb3NfYnVmKGF1ZGlvLCBidWZfbm9kZSk7CisJCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQl9IGVsc2UgeworCQkJcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKKwkJCXBheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9CisJCQkJCWluc2VydF9tZXRhX2RhdGFfZmx1c2goYXVkaW8sIGJ1Zl9ub2RlKTsKKwkJfQorCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfUkVBRF9ET05FLCBwYXlsb2FkKTsKKwkJa2ZyZWUoYnVmX25vZGUpOworCQlwcl9kZWJ1ZygiJXNbJXBLXTogUHJvcGFnYXRlIFJFQURfRE9ORSBkdXJpbmcgZmx1c2hcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwl9Cit9CisKK2ludCBhdWRpb19haW9fZW5hYmxlKHN0cnVjdCBxNmF1ZGlvX2FpbyAgKmF1ZGlvKQoreworCS8qIDJuZCBhcmc6IDAgLT4gcnVuIGltbWVkaWF0ZWx5CisJICogM3JkIGFyZzogMCAtPiBtc3dfdHMsCisJICogNHRoIGFyZzogMCAtPmxzd190cworCSAqLworCXJldHVybiBxNmFzbV9ydW4oYXVkaW8tPmFjLCAweDAwLCAweDAwLCAweDAwKTsKK30KKworaW50IGF1ZGlvX2Fpb19kaXNhYmxlKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJaW50IHJjID0gMDsKKworCWlmIChhdWRpby0+b3BlbmVkKSB7CisJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJYXVkaW8tPm9wZW5lZCA9IDA7CisJCXByX2RlYnVnKCIlc1slcEtdOiBpbmJ5dGVzWyVkXSBpbnNhbXBsZXNbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSwKKwkJCWF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOworCQkvKiBDbG9zZSB0aGUgc2Vzc2lvbiAqLworCQlyYyA9IHE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9DTE9TRSk7CisJCWlmIChyYyA8IDApCisJCQlwcl9lcnIoIiVzWyVwS106RmFpbGVkIHRvIGNsb3NlIHRoZSBzZXNzaW9uIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCQlhdWRpby0+c3RvcHBlZCA9IDE7CisJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKKwkJd2FrZV91cCgmYXVkaW8tPmNtZF93YWl0KTsKKwl9CisJcHJfZGVidWcoIiVzWyVwS106ZW5hYmxlZFslZF1cbiIsIF9fZnVuY19fLCBhdWRpbywgYXVkaW8tPmVuYWJsZWQpOworCXJldHVybiByYzsKK30KKwordm9pZCBhdWRpb19haW9fcmVzZXRfaW9uX3JlZ2lvbihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKKwkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiwgbGlzdCk7CisJCWxpc3RfZGVsKCZyZWdpb24tPmxpc3QpOworCQltc21fYXVkaW9faW9uX2ZyZWVfbGVnYWN5KGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKKwkJa2ZyZWUocmVnaW9uKTsKKwl9Cit9CisKK3ZvaWQgYXVkaW9fYWlvX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50ICpkcnZfZXZ0OworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7CisJCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCisJCQkJICAgc3RydWN0IGF1ZGlvX2Fpb19ldmVudCwgbGlzdCk7CisJCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKKwkJa2ZyZWUoZHJ2X2V2dCk7CisJfQorCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkgeworCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCisJCQkJICAgc3RydWN0IGF1ZGlvX2Fpb19ldmVudCwgbGlzdCk7CisJCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKKwkJa2ZyZWUoZHJ2X2V2dCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2Fpb191bm1hcF9pb25fcmVnaW9uKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uICpyZWdpb247CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcHJfZGVidWcoIiVzWyVwS106XG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSkgeworCQlyZWdpb24gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uLCBsaXN0KTsKKwkJaWYgKHJlZ2lvbiAhPSBOVUxMKSB7CisJCQlwcl9kZWJ1ZygiJXNbJXBLXTogcGh5X2FkZHJlc3MgPSAweCVwS1xuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8sICZyZWdpb24tPnBhZGRyKTsKKwkJCXJjID0gcTZhc21fbWVtb3J5X3VubWFwKGF1ZGlvLT5hYywKKwkJCQkJCXJlZ2lvbi0+cGFkZHIsIElOKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlc1slcEtdOiBtZW1vcnkgdW5tYXAgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8pOworCQl9CisJfQorfQorCisjaWZkZWYgQ09ORklHX1VTRV9ERVZfQ1RSTF9WT0xVTUUKKworc3RhdGljIHZvaWQgYXVkaW9fYWlvX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKKwkJCXZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gKHN0cnVjdCBxNmF1ZGlvX2FpbyAqKSBwcml2YXRlX2RhdGE7CisJaW50IHJjICA9IDA7CisKKwlzd2l0Y2ggKGV2dF9pZCkgeworCWNhc2UgQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzoKKwkJYXVkaW8tPnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKKwkJcHJfZGVidWcoIiVzWyVwS106IEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcsIHN0cmVhbSB2b2wgJWQsIGVuYWJsZWQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbywgYXVkaW8tPnZvbHVtZSwgYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgeworCQkJaWYgKGF1ZGlvLT5hYykgeworCQkJCXJjID0gcTZhc21fc2V0X3ZvbHVtZShhdWRpby0+YWMsIGF1ZGlvLT52b2x1bWUpOworCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJcHJfZXJyKCIlc1slcEtdOiBTZW5kIFZvbHVtZSBjb21tYW5kIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzWyVwS106RVJST1I6d3JvbmcgZXZlbnRcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCWJyZWFrOworCX0KK30KKworaW50IHJlZ2lzdGVyX3ZvbHVtZV9saXN0ZW5lcihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCWludCByYyAgPSAwOworCisJYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOworCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19QQVVTRTsKKworCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAorCQkJCQlBVURERVZfQ0xOVF9ERUMsCisJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKKwkJCQkJYXVkaW9fYWlvX2xpc3RuZXIsCisJCQkJCSh2b2lkICopYXVkaW8pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlc1slcEtdOiBFdmVudCBsaXN0ZW5lciBmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gLUVBQ0NFUzsKKwl9CisJcmV0dXJuIHJjOworfQordm9pZCB1bnJlZ2lzdGVyX3ZvbHVtZV9saXN0ZW5lcihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0RFQywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKK30KKworaW50IGVuYWJsZV92b2x1bWVfcmFtcChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGFzbV9zb2Z0cGF1c2VfcGFyYW1zIHNvZnRwYXVzZTsKKwlzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zIHNvZnR2b2w7CisKKwlpZiAoYXVkaW8tPmFjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXByX2RlYnVnKCIlc1slcEtdXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCXNvZnRwYXVzZS5lbmFibGUgPSBTT0ZUX1BBVVNFX0VOQUJMRTsKKwlzb2Z0cGF1c2UucGVyaW9kID0gU09GVF9QQVVTRV9QRVJJT0Q7CisJc29mdHBhdXNlLnN0ZXAgPSBTT0ZUX1BBVVNFX1NURVA7CisJc29mdHBhdXNlLnJhbXBpbmdjdXJ2ZSA9IFNPRlRfUEFVU0VfQ1VSVkVfTElORUFSOworCisJc29mdHZvbC5wZXJpb2QgPSBTT0ZUX1ZPTFVNRV9QRVJJT0Q7CisJc29mdHZvbC5zdGVwID0gU09GVF9WT0xVTUVfU1RFUDsKKwlzb2Z0dm9sLnJhbXBpbmdjdXJ2ZSA9IFNPRlRfVk9MVU1FX0NVUlZFX0xJTkVBUjsKKworCWlmIChzb2Z0cGF1c2UucmFtcGluZ2N1cnZlID09IFNPRlRfUEFVU0VfQ1VSVkVfTElORUFSKQorCQlzb2Z0cGF1c2Uuc3RlcCA9IFNPRlRfUEFVU0VfU1RFUF9MSU5FQVI7CisJaWYgKHNvZnR2b2wucmFtcGluZ2N1cnZlID09IFNPRlRfVk9MVU1FX0NVUlZFX0xJTkVBUikKKwkJc29mdHZvbC5zdGVwID0gU09GVF9WT0xVTUVfU1RFUF9MSU5FQVI7CisJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKGF1ZGlvLT5hYywgYXVkaW8tPnZvbHVtZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZW5kIFZvbHVtZSBjb21tYW5kIGZhaWxlZCByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJcmMgPSBxNmFzbV9zZXRfc29mdHBhdXNlKGF1ZGlvLT5hYywgJnNvZnRwYXVzZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRQYXVzZSBQYXJhbSBmYWlsZWQgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCXJjID0gcTZhc21fc2V0X3NvZnR2b2x1bWUoYXVkaW8tPmFjLCAmc29mdHZvbCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJjPSVkXG4iLAorCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCS8qIGRpc2FibGUgbXV0ZSBieSBkZWZhdWx0ICovCisJcmMgPSBxNmFzbV9zZXRfbXV0ZShhdWRpby0+YWMsIDApOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogU2VuZCBtdXRlIGNvbW1hbmQgZmFpbGVkIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNlbHNlIC8qQ09ORklHX1VTRV9ERVZfQ1RSTF9WT0xVTUUqLworaW50IHJlZ2lzdGVyX3ZvbHVtZV9saXN0ZW5lcihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCXJldHVybiAwOy8qIGRvIG5vdGhpbmcgKi8KK30KK3ZvaWQgdW5yZWdpc3Rlcl92b2x1bWVfbGlzdGVuZXIoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKK3sKKwlyZXR1cm47LyogZG8gbm90aGluZyAqLworfQoraW50IGVuYWJsZV92b2x1bWVfcmFtcChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQoreworCXJldHVybiAwOyAvKiBkbyBub3RoaW5nICovCit9CisjZW5kaWYgLypDT05GSUdfVVNFX0RFVl9DVFJMX1ZPTFVNRSovCisKK2ludCBhdWRpb19haW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcHJfZGVidWcoIiVzWyVwS11cbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlhdWRpby0+d2ZsdXNoID0gMTsKKwlpZiAoYXVkaW8tPndha2Vsb2NrX3ZvdGVkICYmCisJCShhdWRpby0+YXVkaW9fd3NfbWdyICE9IE5VTEwpICYmCisJCShhdWRpby0+bWlzY2RldmljZSAhPSBOVUxMKSkgeworCQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmF1ZGlvX3dzX21nci0+d3NfbG9jayk7CisJCWlmICgoYXVkaW8tPmF1ZGlvX3dzX21nci0+cmVmX2NudCA+IDApICYmCisJCQkJKC0tYXVkaW8tPmF1ZGlvX3dzX21nci0+cmVmX2NudCA9PSAwKSkgeworCQkJcG1fcmVsYXgoYXVkaW8tPm1pc2NkZXZpY2UtPnRoaXNfZGV2aWNlKTsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5hdWRpb193c19tZ3ItPndzX2xvY2spOworCX0KKwlpZiAoYXVkaW8tPmVuYWJsZWQpCisJCWF1ZGlvX2Fpb19mbHVzaChhdWRpbyk7CisJYXVkaW8tPndmbHVzaCA9IDA7CisJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKKwlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaChhdWRpbyk7CisJYXVkaW9fYWlvX2Rpc2FibGUoYXVkaW8pOworCWF1ZGlvX2Fpb191bm1hcF9pb25fcmVnaW9uKGF1ZGlvKTsKKwlhdWRpb19haW9fcmVzZXRfaW9uX3JlZ2lvbihhdWRpbyk7CisJbXNtX2F1ZGlvX2lvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKKwlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOworCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKKwlhdWRpb19haW9fcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOworCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKKwltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwltdXRleF9kZXN0cm95KCZhdWRpby0+bG9jayk7CisJbXV0ZXhfZGVzdHJveSgmYXVkaW8tPnJlYWRfbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmYXVkaW8tPndyaXRlX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7CisJdW5yZWdpc3Rlcl92b2x1bWVfbGlzdGVuZXIoYXVkaW8pOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7CisjZW5kaWYKKwlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhdWRpb19haW9fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghYXVkaW8tPmVuYWJsZWQgfHwgYXVkaW8tPmZlZWRiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEJsb2NraW5nIGNsaWVudCBzZW5kcyBtb3JlIGRhdGEgKi8KKwltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfRlNZTkM7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisKKwlwcl9kZWJ1ZygiJXNbJXBLXTpcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisKKwlhdWRpby0+ZW9zX3JzcCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNbJXBLXVdhaXQgZm9yIHdyaXRlIGRvbmUgZnJvbSBEU1BcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCisJCQkJCShsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSkgfHwKKwkJCQkJYXVkaW8tPndmbHVzaCB8fCBhdWRpby0+c3RvcHBlZCk7CisKKwlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQXVkaW8gRmx1c2hlZCBvciBTdG9wcGVkLHRoaXMgaXMgbm90IEVPU1xuIgorCQkJLCBfX2Z1bmNfXywgYXVkaW8pOworCQlhdWRpby0+d2ZsdXNoID0gMDsKKwkJcmMgPSAtRUJVU1k7CisJfQorCisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzWyVwS106IHdhaXQgZXZlbnQgZm9yIGxpc3RfZW1wdHkgZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9FT1MpOworCXByX2RlYnVnKCIlc1slcEtdOiBFT1MgY21kIHNlbnQgdG8gRFNQXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCIlc1slcEtdOiBxNmFzbV9jbWQgZmFpbGVkLCByYyA9ICVkIiwKKwkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCisJcHJfZGVidWcoIiVzWyVwS106IHdhaXQgZm9yIFJFTkRFUkVEX0VPUyBmcm9tIERTUFxuIgorCQksIF9fZnVuY19fLCBhdWRpbyk7CisJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCisJCQkJCShhdWRpby0+ZW9zX3JzcCB8fCBhdWRpby0+d2ZsdXNoIHx8CisJCQkJCWF1ZGlvLT5zdG9wcGVkKSk7CisKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXNbJXBLXTogd2FpdCBldmVudCBmb3IgZW9zX3JzcCBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7CisJCWF1ZGlvLT53Zmx1c2ggPSAwOworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQXVkaW8gRmx1c2hlZCBvciBTdG9wcGVkLHRoaXMgaXMgbm90IEVPU1xuIgorCQkJLCBfX2Z1bmNfXywgYXVkaW8pOworCQlyYyA9IC1FQlVTWTsKKwl9CisKKwlpZiAoYXVkaW8tPmVvc19yc3AgPT0gMSkKKwkJcHJfZGVidWcoIiVzWyVwS106IEVPU1xuIiwgX19mdW5jX18sIGF1ZGlvKTsKKworCitkb25lOgorCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfRlNZTkM7CisJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZW1wdHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydCB8fCBhdWRpby0+cmVzZXRfZXZlbnQ7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2Fpb19wcm9jZXNzX2V2ZW50X3JlcV9jb21tb24oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKKwkJCQkJc3RydWN0IG1zbV9hdWRpb19ldmVudCAqdXNyX2V2dCkKK3sKKwlsb25nIHJjOworCXN0cnVjdCBhdWRpb19haW9fZXZlbnQgKmRydl9ldnQgPSBOVUxMOworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0aW1lb3V0ID0gdXNyX2V2dC0+dGltZW91dF9tczsKKworCWlmICh0aW1lb3V0ID4gMCkgeworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT5ldmVudF93YWl0LAorCQkJCQkJYXVkaW9fYWlvX2V2ZW50c19wZW5kaW5nCisJCQkJCQkoYXVkaW8pLAorCQkJCQkJbXNlY3NfdG9famlmZmllcworCQkJCQkJKHRpbWVvdXQpKTsKKwkJaWYgKHJjID09IDApCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9IGVsc2UgeworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+ZXZlbnRfd2FpdCwKKwkJYXVkaW9fYWlvX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7CisJfQorCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmIChhdWRpby0+cmVzZXRfZXZlbnQpIHsKKwkJYXVkaW8tPnJlc2V0X2V2ZW50ID0gZmFsc2U7CisJCXByX2VycigiSW4gU1NSLCBwb3N0IEVORVRSRVNFVCBlcnJcbiIpOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisKKwlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7CisJCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJjID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgeworCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAorCQkgICBzdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50LCBsaXN0KTsKKwkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOworCX0KKwlpZiAoZHJ2X2V2dCkgeworCQl1c3JfZXZ0LT5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKKwkJdXNyX2V2dC0+ZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7CisJCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlc1slcEtdOlVuZXhwZWN0ZWQgcGF0aFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1dSSVRFX0RPTkUpIHsKKwkJcHJfZGVidWcoIiVzWyVwS106cG9zdGVkIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUgdG8gdXNlclxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbyk7CisJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwkJYXVkaW9fYWlvX2lvbl9maXh1cChhdWRpbywgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyLAorCQlkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2xlbiwgMCwgMCk7CisJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCX0gZWxzZSBpZiAoZHJ2X2V2dC0+ZXZlbnRfdHlwZSA9PSBBVURJT19FVkVOVF9SRUFEX0RPTkUpIHsKKwkJcHJfZGVidWcoIiVzWyVwS106cG9zdGVkIEFVRElPX0VWRU5UX1JFQURfRE9ORSB0byB1c2VyXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7CisJCWF1ZGlvX2Fpb19pb25fZml4dXAoYXVkaW8sIGRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfYWRkciwKKwkJZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9sZW4sIDAsIDApOworCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCX0KKworCS8qIFNvbWUgcmVhZCBidWZmZXIgbWlnaHQgYmUgaGVsZCB1cCBpbiBEU1AscmVsZWFzZSBhbGwKKwkgKiBPbmNlIEVPUyBpbmRpY2F0ZWQKKwkgKi8KKwlpZiAoYXVkaW8tPmVvc19yc3AgJiYgIWxpc3RfZW1wdHkoJmF1ZGlvLT5pbl9xdWV1ZSkpIHsKKwkJcHJfZGVidWcoIiVzWyVwS106U2VuZCBmbHVzaCBjb21tYW5kIHRvIHJlbGVhc2UgcmVhZCBidWZmZXJzIiwKKwkJCSJoZWxkIHVwIGluIERTUFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlhdWRpb19haW9fZmx1c2goYXVkaW8pOworCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2Fpb19wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWxvbmcgcmM7CisJc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpIHsKKwkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxX2NvbW1vbihhdWRpbywgJnVzcl9ldnQpOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKSB7CisJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKK3N0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZjMyIHsKKwljb21wYXRfdXB0cl90IGJ1Zl9hZGRyOworCXUzMiBidWZfbGVuOworCXUzMiBkYXRhX2xlbjsKKwljb21wYXRfdXB0cl90IHByaXZhdGVfZGF0YTsKKwl1MTYgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvMzIgeworCXUzMiBjb2RlY190eXBlOworCXUzMiBjaGFuX2luZm87CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBiaXRfc3RyZWFtX2luZm87CisJdTMyIGJpdF9yYXRlOworCXUzMiB1bnVzZWRbM107Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9lcnJvcl9pbmZvMzIgeworCXUzMiBkZWNfaWQ7CisJdTMyIGVycl9tc2dfaW5kaWNhdG9yOworCXUzMiBlcnJfdHlwZTsKK307CisKK3VuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkMzIgeworCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZjMyIGFpb19idWY7CisJc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1faW5mbzMyIHN0cmVhbV9pbmZvOworCXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8zMiBlcnJvcl9pbmZvOworCXMzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fZXZlbnQzMiB7CisJczMyIGV2ZW50X3R5cGU7CisJczMyIHRpbWVvdXRfbXM7CisJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQzMiBldmVudF9wYXlsb2FkOworfTsKKworc3RhdGljIGxvbmcgYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxX2NvbXBhdChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWxvbmcgcmM7CisJc3RydWN0IG1zbV9hdWRpb19ldmVudDMyIHVzcl9ldnRfMzI7CisJc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0XzMyLCBhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQzMikpKSB7CisJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJdXNyX2V2dC50aW1lb3V0X21zID0gdXNyX2V2dF8zMi50aW1lb3V0X21zOworCisJcmMgPSBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXFfY29tbW9uKGF1ZGlvLCAmdXNyX2V2dCk7CisKKwl1c3JfZXZ0XzMyLmV2ZW50X3R5cGUgPSB1c3JfZXZ0LmV2ZW50X3R5cGU7CisJc3dpdGNoICh1c3JfZXZ0XzMyLmV2ZW50X3R5cGUpIHsKKwljYXNlIEFVRElPX0VWRU5UX1NVU1BFTkQ6CisJY2FzZSBBVURJT19FVkVOVF9SRVNVTUU6CisJY2FzZSBBVURJT19FVkVOVF9XUklURV9ET05FOgorCWNhc2UgQVVESU9fRVZFTlRfUkVBRF9ET05FOgorCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5idWZfYWRkciA9CisJCQlwdHJfdG9fY29tcGF0KHVzcl9ldnQuZXZlbnRfcGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyKTsKKwkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLmFpb19idWYuYnVmX2xlbiA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5idWZfbGVuOworCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbjsKKwkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLmFpb19idWYucHJpdmF0ZV9kYXRhID0KKwkJcHRyX3RvX2NvbXBhdCh1c3JfZXZ0LmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5wcml2YXRlX2RhdGEpOworCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5tZmllbGRfc3ogPQorCQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkLmFpb19idWYubWZpZWxkX3N6OworCQlicmVhazsKKwljYXNlIEFVRElPX0VWRU5UX1NUUkVBTV9JTkZPOgorCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uY29kZWNfdHlwZSA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uY29kZWNfdHlwZTsKKwkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLnN0cmVhbV9pbmZvLmNoYW5faW5mbyA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uY2hhbl9pbmZvOworCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uc2FtcGxlX3JhdGUgPQorCQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkLnN0cmVhbV9pbmZvLnNhbXBsZV9yYXRlOworCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uYml0X3N0cmVhbV9pbmZvID0KKwkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5iaXRfc3RyZWFtX2luZm87CisJCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5iaXRfcmF0ZSA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uYml0X3JhdGU7CisJCWJyZWFrOworCWNhc2UgQVVESU9fRVZFTlRfQklUU1RSRUFNX0VSUk9SX0lORk86CisJCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmRlY19pZCA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuZXJyb3JfaW5mby5kZWNfaWQ7CisJCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmVycl9tc2dfaW5kaWNhdG9yID0KKwkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmVycl9tc2dfaW5kaWNhdG9yOworCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuZXJyb3JfaW5mby5lcnJfdHlwZSA9CisJCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuZXJyb3JfaW5mby5lcnJfdHlwZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiB1bmtub3duIGF1ZGlvIGV2ZW50IHR5cGUgPSAlZCByYyA9ICVsZCIsCisJCQkgX19mdW5jX18sIHVzcl9ldnRfMzIuZXZlbnRfdHlwZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dF8zMiwgc2l6ZW9mKHVzcl9ldnRfMzIpKSkgeworCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2lvbl9jaGVjayhzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQkJCXZvaWQgKnZhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gKnJlZ2lvbl9lbHQ7CisJc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uIHQgPSB7LnZhZGRyID0gdmFkZHIsIC5sZW4gPSBsZW4gfTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlLCBsaXN0KSB7CisJCWlmIChDT05UQUlOUyhyZWdpb25fZWx0LCAmdCkgfHwgQ09OVEFJTlMoJnQsIHJlZ2lvbl9lbHQpIHx8CisJCQlPVkVSTEFQUyhyZWdpb25fZWx0LCAmdCkpIHsKKwkJCXByX2VycigiJXNbJXBLXTpyZWdpb24gKHZhZGRyICVwSyBsZW4gJWxkKSBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24gKHZhZGRyICVwSyBwYWRkciAlcEsgbGVuICVsZClcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLCB2YWRkciwgbGVuLAorCQkJCXJlZ2lvbl9lbHQtPnZhZGRyLAorCQkJCSZyZWdpb25fZWx0LT5wYWRkciwgcmVnaW9uX2VsdC0+bGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2lvbl9hZGQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKKwkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvICppbmZvKQoreworCWlvbl9waHlzX2FkZHJfdCBwYWRkciA9IDA7CisJc2l6ZV90IGxlbiA9IDA7CisJc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uICpyZWdpb247CisJaW50IHJjID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlvbmZsYWc7CisJdm9pZCAqa3ZhZGRyID0gTlVMTDsKKworCXByX2RlYnVnKCIlc1slcEtdOlxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwlyZWdpb24gPSBrbWFsbG9jKHNpemVvZigqcmVnaW9uKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJlZ2lvbikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9pbXBvcnRfbGVnYWN5KCJBdWRpb19EZWNfQ2xpZW50IiwgYXVkaW8tPmNsaWVudCwKKwkJCQkmaGFuZGxlLCBpbmZvLT5mZCwgJmlvbmZsYWcsCisJCQkJMCwgJnBhZGRyLCAmbGVuLCAma3ZhZGRyKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogbXNtIGF1ZGlvIGlvbiBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBpbXBvcnRfZXJyb3I7CisJfQorCisJcmMgPSBhdWRpb19haW9faW9uX2NoZWNrKGF1ZGlvLCBpbmZvLT52YWRkciwgbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19pb25fY2hlY2sgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gaW9uX2Vycm9yOworCX0KKworCXJlZ2lvbi0+aGFuZGxlID0gaGFuZGxlOworCXJlZ2lvbi0+dmFkZHIgPSBpbmZvLT52YWRkcjsKKwlyZWdpb24tPmZkID0gaW5mby0+ZmQ7CisJcmVnaW9uLT5wYWRkciA9IHBhZGRyOworCXJlZ2lvbi0+a3ZhZGRyID0ga3ZhZGRyOworCXJlZ2lvbi0+bGVuID0gbGVuOworCXJlZ2lvbi0+cmVmX2NudCA9IDA7CisJcHJfZGVidWcoIiVzWyVwS106YWRkIHJlZ2lvbiBwYWRkciAlcEsgdmFkZHIgJXBLLCBsZW4gJWx1IGt2YWRkciAlcEtcbiIsCisJCV9fZnVuY19fLCBhdWRpbywKKwkJJnJlZ2lvbi0+cGFkZHIsIHJlZ2lvbi0+dmFkZHIsIHJlZ2lvbi0+bGVuLAorCQlyZWdpb24tPmt2YWRkcik7CisJbGlzdF9hZGRfdGFpbCgmcmVnaW9uLT5saXN0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpOworCXJjID0gcTZhc21fbWVtb3J5X21hcChhdWRpby0+YWMsICBwYWRkciwgSU4sIGxlbiwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzWyVwS106IG1lbW9yeSBtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlnb3RvIG1tYXBfZXJyb3I7CisJfSBlbHNlIHsKKwkJZ290byBlbmQ7CisJfQorbW1hcF9lcnJvcjoKKwlsaXN0X2RlbCgmcmVnaW9uLT5saXN0KTsKK2lvbl9lcnJvcjoKKwltc21fYXVkaW9faW9uX2ZyZWVfbGVnYWN5KGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7CitpbXBvcnRfZXJyb3I6CisJa2ZyZWUocmVnaW9uKTsKK2VuZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2lvbl9yZW1vdmUoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKKwkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvICppbmZvKQoreworCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXByX2RlYnVnKCIlc1slcEtdOmluZm8gZmQgJWQgdmFkZHIgJXBLXG4iLAorCQlfX2Z1bmNfXywgYXVkaW8sIGluZm8tPmZkLCBpbmZvLT52YWRkcik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKKwkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiwgbGlzdCk7CisKKwkJaWYgKChyZWdpb24tPmZkID09IGluZm8tPmZkKSAmJgorCQkJKHJlZ2lvbi0+dmFkZHIgPT0gaW5mby0+dmFkZHIpKSB7CisJCQlpZiAocmVnaW9uLT5yZWZfY250KSB7CisJCQkJcHJfZGVidWcoIiVzWyVwS106cmVnaW9uICVwSyBpbiB1c2UgcmVmX2NudCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLCByZWdpb24sCisJCQkJCXJlZ2lvbi0+cmVmX2NudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcl9kZWJ1ZygiJXNbJXBLXTpyZW1vdmUgcmVnaW9uIGZkICVkIHZhZGRyICVwS1xuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8sIGluZm8tPmZkLCBpbmZvLT52YWRkcik7CisJCQlyYyA9IHE2YXNtX21lbW9yeV91bm1hcChhdWRpby0+YWMsCisJCQkJCQlyZWdpb24tPnBhZGRyLCBJTik7CisJCQlpZiAocmMgPCAwKQorCQkJCXByX2VycigiJXNbJXBLXTogbWVtb3J5IHVubWFwIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKworCQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7CisJCQltc21fYXVkaW9faW9uX2ZyZWVfbGVnYWN5KGF1ZGlvLT5jbGllbnQsCisJCQkJCQkgcmVnaW9uLT5oYW5kbGUpOworCQkJa2ZyZWUocmVnaW9uKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2Fpb19hc3luY193cml0ZShzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQkJCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlKQoreworCWludCByYzsKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKKwlzdHJ1Y3QgYXVkaW9fYWlvX3dyaXRlX3BhcmFtIHBhcmFtOworCisJaWYgKCFhdWRpbyB8fCAhYnVmX25vZGUpIHsKKwkJcHJfZXJyKCIlcyBOVUxMIHBvaW50ZXIgYXVkaW89WzB4JXBLXSwgYnVmX25vZGU9WzB4JXBLXVxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbywgYnVmX25vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzWyVwS106IFNlbmQgd3JpdGUgYnVmZiAlcEsgcGh5ICVwSyBsZW4gJWQgbWV0YV9lbmFibGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIGF1ZGlvLCBidWZfbm9kZSwgJmJ1Zl9ub2RlLT5wYWRkciwKKwkJYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiwKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSk7CisJcHJfZGVidWcoIiVzWyVwS106IGZsYWdzID0gMHgleFxuIiwgX19mdW5jX18sIGF1ZGlvLAorCQlidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubmZsYWdzKTsKKworCWFjID0gYXVkaW8tPmFjOworCS8qIE9mZnNldCB3aXRoICBhcHByb3ByaWF0ZSBtZXRhICovCisJaWYgKGF1ZGlvLT5mZWVkYmFjaykgeworCQkvKiBOb24gVHVubmVsIG1vZGUgKi8KKwkJcGFyYW0ucGFkZHIgPSBidWZfbm9kZS0+cGFkZHIgKyBzaXplb2Yoc3RydWN0IGRlY19tZXRhX2luKTsKKwkJcGFyYW0ubGVuID0gYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAtIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfaW4pOworCX0gZWxzZSB7CisJCS8qIFR1bm5lbCBtb2RlICovCisJCXBhcmFtLnBhZGRyID0gYnVmX25vZGUtPnBhZGRyOworCQlwYXJhbS5sZW4gPSBidWZfbm9kZS0+YnVmLmRhdGFfbGVuOworCX0KKwlwYXJhbS5tc3dfdHMgPSBidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubnRpbWVzdGFtcC5oaWdocGFydDsKKwlwYXJhbS5sc3dfdHMgPSBidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubnRpbWVzdGFtcC5sb3dwYXJ0OworCXBhcmFtLmZsYWdzICA9IGJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbi5uZmxhZ3M7CisJLyogSWYgbm8gbWV0YV9pbmZvIGVuYWxlZCwgaW5kaWNhdGUgbm8gdGltZSBzdGFtcCB2YWxpZCAqLworCWlmICghYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSkKKwkJcGFyYW0uZmxhZ3MgPSAweEZGMDA7CisKKwlpZiAoYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm5mbGFncyAmIEFVRElPX0RFQ19FT0ZfU0VUKQorCQlwYXJhbS5mbGFncyB8PSBBVURJT19ERUNfRU9GX1NFVDsKKworCXBhcmFtLnVpZCA9IGFjLT5zZXNzaW9uOworCS8qIFJlYWQgY29tbWFuZCB3aWxsIHBvcHVsYXRlIHNlc3Npb24gaWQgYXMgdG9rZW4gKi8KKwlidWZfbm9kZS0+dG9rZW4gPSBhYy0+c2Vzc2lvbjsKKwlyYyA9IHE2YXNtX2FzeW5jX3dyaXRlKGFjLCAmcGFyYW0pOworCWlmIChyYyA8IDApCisJCXByX2VycigiJXNbJXBLXTpmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGF1ZGlvX2Fpb19wb3N0X2V2ZW50KHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIGludCB0eXBlLAorCQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50ICplX25vZGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7CisJCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAorCQkJCQlzdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50LCBsaXN0KTsKKwkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7CisJfSBlbHNlIHsKKwkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX2Fpb19ldmVudCksIEdGUF9BVE9NSUMpOworCQlpZiAoIWVfbm9kZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7CisJZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKKworCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fYWlvX2FzeW5jX3JlYWQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKKwkJCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKKwlzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gcGFyYW07CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzWyVwS106IFNlbmQgcmVhZCBidWZmICVwSyBwaHkgJXBLIGxlbiAlZFxuIiwKKwkJX19mdW5jX18sIGF1ZGlvLCBidWZfbm9kZSwKKwkJJmJ1Zl9ub2RlLT5wYWRkciwgYnVmX25vZGUtPmJ1Zi5idWZfbGVuKTsKKwlhYyA9IGF1ZGlvLT5hYzsKKwkvKiBQcm92aWRlIGFkZHJlc3Mgc28gZHJpdmVyIGNhbiBhcHBlbmQgbnIgZnJhbWVzIGluZm9ybWF0aW9uICovCisJcGFyYW0ucGFkZHIgPSBidWZfbm9kZS0+cGFkZHIgKworCQlzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCk7CisJcGFyYW0ubGVuID0gYnVmX25vZGUtPmJ1Zi5idWZfbGVuIC0KKwkJc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpOworCXBhcmFtLnVpZCA9IGFjLT5zZXNzaW9uOworCS8qIFdyaXRlIGNvbW1hbmQgd2lsbCBwb3B1bGF0ZSBzZXNzaW9uX2lkIGFzIHRva2VuICovCisJYnVmX25vZGUtPnRva2VuID0gYWMtPnNlc3Npb247CisJcmMgPSBxNmFzbV9hc3luY19yZWFkKGFjLCAmcGFyYW0pOworCWlmIChyYyA8IDApCisJCXByX2VycigiJXNbJXBLXTpmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2Fpb19idWZfYWRkX3NoYXJlZChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB1MzIgZGlyLAorCQkJCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNbJXBLXTpub2RlICVwSyBkaXIgJXggYnVmX2FkZHIgJXBLIGJ1Zl9sZW4gJWQgZGF0YV9sZW4gJWRcbiIsCisJCSBfX2Z1bmNfXywgYXVkaW8sIGJ1Zl9ub2RlLCBkaXIsIGJ1Zl9ub2RlLT5idWYuYnVmX2FkZHIsCisJCWJ1Zl9ub2RlLT5idWYuYnVmX2xlbiwgYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbik7CisJYnVmX25vZGUtPnBhZGRyID0gYXVkaW9fYWlvX2lvbl9maXh1cChhdWRpbywgYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwKKwkJCQkJCWJ1Zl9ub2RlLT5idWYuYnVmX2xlbiwgMSwKKwkJCQkJCSZidWZfbm9kZS0+a3ZhZGRyKTsKKwlpZiAoZGlyKSB7CisJCS8qIHdyaXRlICovCisJCWlmICghYnVmX25vZGUtPnBhZGRyIHx8CisJCQkoYnVmX25vZGUtPnBhZGRyICYgMHgxKSB8fAorCQkJKCFhdWRpby0+ZmVlZGJhY2sgJiYgIWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pKSB7CisJCQlrZnJlZShidWZfbm9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlleHRyYWN0X21ldGFfb3V0X2luZm8oYXVkaW8sIGJ1Zl9ub2RlLCAxKTsKKwkJLyogTm90IGEgRU9TIGJ1ZmZlciAqLworCQlpZiAoIShidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubmZsYWdzICYgQVVESU9fREVDX0VPU19TRVQpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7CisJCQlyZXQgPSBhdWRpb19haW9fYXN5bmNfd3JpdGUoYXVkaW8sIGJ1Zl9ub2RlKTsKKwkJCS8qIEVPUyBidWZmZXIgaGFuZGxlZCBpbiBkcml2ZXIgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPm91dF9xdWV1ZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIGlmIChidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubmZsYWdzCisJCQkJICAgJiBBVURJT19ERUNfRU9TX1NFVCkgeworCQkJaWYgKCFhdWRpby0+d2ZsdXNoKSB7CisJCQkJcHJfZGVidWcoIiVzWyVwS106U2VuZCBFT1MgY21kIGF0IGkvcFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCQkvKiBEcml2ZXIgd2lsbCBmb3JjZWZ1bGx5IHBvc3Qgd3JpdGVkb25lIGV2ZW50CisJCQkJICogb25jZSBlb3MgYWNrIHJlY2l2ZWQgZnJvbSBEU1AKKwkJCQkgKi8KKwkJCQlhdWRpby0+ZW9zX3dyaXRlX3BheWxvYWQuYWlvX2J1ZiA9CisJCQkJCWJ1Zl9ub2RlLT5idWY7CisJCQkJYXVkaW8tPmVvc19mbGFnID0gMTsKKwkJCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCQkJcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0VPUyk7CisJCQkJa2ZyZWUoYnVmX25vZGUpOworCQkJfSBlbHNlIHsgLyogRmx1c2ggaW4gcHJvZ3Jlc3MsIHNlbmQgYmFjayBpL3AKKwkJCQkgICogRU9TIGJ1ZmZlciBhcyBpcworCQkJCSAgKi8KKwkJCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOworCisJCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKKwkJCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywKKwkJCQkJCUFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCisJCQkJCQlldmVudF9wYXlsb2FkKTsKKwkJCQlrZnJlZShidWZfbm9kZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiByZWFkICovCisJCWlmICghYnVmX25vZGUtPnBhZGRyIHx8CisJCQkoYnVmX25vZGUtPnBhZGRyICYgMHgxKSB8fAorCQkJKGJ1Zl9ub2RlLT5idWYuYnVmX2xlbiA8IFBDTV9CVUZTWl9NSU4pKSB7CisJCQlrZnJlZShidWZfbm9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBObyBFT1MgcmVhY2hlZCAqLworCQlpZiAoIWF1ZGlvLT5lb3NfcnNwKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7CisJCQlyZXQgPSBhdWRpb19haW9fYXN5bmNfcmVhZChhdWRpbywgYnVmX25vZGUpOworCQkJLyogRU9TIGJ1ZmZlciBoYW5kbGVkIGluIGRyaXZlciAqLworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+aW5fcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7CisJCX0KKwkJLyogRU9TIHJlYWNoZWQgYXQgaW5wdXQgc2lkZSBmYWtlIGFsbCB1cGNvbWluZyByZWFkIGJ1ZmZlciB0bworCQkgKiBpbmRpY2F0ZSB0aGUgc2FtZQorCQkgKi8KKwkJZWxzZSB7CisJCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOworCisJCQlldmVudF9wYXlsb2FkLmFpb19idWYgPSBidWZfbm9kZS0+YnVmOworCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuID0KKwkJCQlpbnNlcnRfZW9zX2J1ZihhdWRpbywgYnVmX25vZGUpOworCQkJcHJfZGVidWcoIiVzWyVwS106IHByb3BhZ2F0ZSBSRUFEX0RPTkUgYXMgRU9TIGRvbmVcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCWF1ZGlvX2Fpb19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9SRUFEX0RPTkUsCisJCQkJCWV2ZW50X3BheWxvYWQpOworCQkJa2ZyZWUoYnVmX25vZGUpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBhdWRpb19haW9fYnVmX2FkZF9jb21wYXQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdTMyIGRpciwKKwkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOworCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZjMyIGFpb19idWZfMzI7CisKKwlidWZfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpidWZfbm9kZSksIEdGUF9LRVJORUwpOworCisJaWYgKCFidWZfbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFpb19idWZfMzIsIGFyZywgc2l6ZW9mKGFpb19idWZfMzIpKSkgeworCQlrZnJlZShidWZfbm9kZSk7CisJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyID0gY29tcGF0X3B0cihhaW9fYnVmXzMyLmJ1Zl9hZGRyKTsKKwlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4gPSBhaW9fYnVmXzMyLmJ1Zl9sZW47CisJYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiA9IGFpb19idWZfMzIuZGF0YV9sZW47CisJYnVmX25vZGUtPmJ1Zi5wcml2YXRlX2RhdGEgPSBjb21wYXRfcHRyKGFpb19idWZfMzIucHJpdmF0ZV9kYXRhKTsKKwlidWZfbm9kZS0+YnVmLm1maWVsZF9zeiA9IGFpb19idWZfMzIubWZpZWxkX3N6OworCisJcmV0dXJuIGF1ZGlvX2Fpb19idWZfYWRkX3NoYXJlZChhdWRpbywgZGlyLCBidWZfbm9kZSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhdWRpb19haW9fYnVmX2FkZChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB1MzIgZGlyLAorCQkJCXZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGU7CisKKwlidWZfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpidWZfbm9kZSksIEdGUF9LRVJORUwpOworCisJaWYgKCFidWZfbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5idWYsIGFyZywgc2l6ZW9mKGJ1Zl9ub2RlLT5idWYpKSkgeworCQlrZnJlZShidWZfbm9kZSk7CisJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gYXVkaW9fYWlvX2J1Zl9hZGRfc2hhcmVkKGF1ZGlvLCBkaXIsIGJ1Zl9ub2RlKTsKK30KKwordm9pZCBhdWRpb19haW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCit7CisJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpIHsKKwkJLyogSWYgZnN5bmMgaXMgaW4gcHJvZ3Jlc3MsIG1ha2Ugc3VyZQorCQkgKiByZXR1cm4gdmFsdWUgb2YgZnN5bmMgaW5kaWNhdGVzCisJCSAqIGFib3J0IGR1ZSB0byBmbHVzaAorCQkgKi8KKwkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpIHsKKwkJCXByX2RlYnVnKCIlc1slcEtdOmZzeW5jIGluIHByb2dyZXNzXG4iLAorCQkJCSBfX2Z1bmNfXywgYXVkaW8pOworCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKKwkJfSBlbHNlCisJCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkKKwkJCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoKGF1ZGlvKTsKKwl9Cit9CisKK2ludCBhdWRpb19haW9fb3BlbihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBpOworCXN0cnVjdCBhdWRpb19haW9fZXZlbnQgKmVfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKworCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCisJICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZworCSAqLworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07CisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSAyOworCisJLyogT25seSBBSU8gaW50ZXJmYWNlICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCXByX2RlYnVnKCIlc1slcEtdOnNldCB0byBhaW8gaW50ZXJmYWNlXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19BSU9fSU5URjsKKwkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoID0gYXVkaW9fYWlvX2FzeW5jX291dF9mbHVzaDsKKwkJYXVkaW8tPmRydl9vcHMuaW5fZmx1c2ggPSBhdWRpb19haW9fYXN5bmNfaW5fZmx1c2g7CisJCXE2YXNtX3NldF9pb19tb2RlKGF1ZGlvLT5hYywgQVNZTkNfSU9fTU9ERSk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlc1slcEtdOlNJTyBpbnRlcmZhY2Ugbm90IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEluaXRpYWxpemUgYWxsIGxvY2tzIG9mIGF1ZGlvIGluc3RhbmNlICovCisJbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmNtZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+b3V0X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmluX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7CisKKwlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOworCWF1ZGlvLT5vcGVuZWQgPSAxOworCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOworCWF1ZGlvLT5jb2RlY19pb2N0bCA9IGF1ZGlvX2Fpb19pb2N0bDsKKwlhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsID0gYXVkaW9fYWlvX2NvbXBhdF9pb2N0bDsKKwlmb3IgKGkgPSAwOyBpIDwgQVVESU9fRVZFTlRfTlVNOyBpKyspIHsKKwkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX2Fpb19ldmVudCksIEdGUF9LRVJORUwpOworCQlpZiAoZV9ub2RlKQorCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOworCQllbHNlIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKwlhdWRpby0+Y2xpZW50ID0gbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKCJBdWRpb19EZWNfQ2xpZW50Iik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5jbGllbnQpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCXByX2RlYnVnKCJJb24gY2xpZW50IGNyZWF0ZSBpbiBhdWRpb19haW9fb3BlbiAlcEsiLCBhdWRpby0+Y2xpZW50KTsKKworCXJjID0gcmVnaXN0ZXJfdm9sdW1lX2xpc3RlbmVyKGF1ZGlvKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGlvbl9jbGVhbnVwOworCisJcmV0dXJuIDA7Citpb25fY2xlYW51cDoKKwltc21fYXVkaW9faW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOworCWF1ZGlvLT5jbGllbnQgPSBOVUxMOworY2xlYW51cDoKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKKwkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCisJCQkJICAgc3RydWN0IGF1ZGlvX2Fpb19ldmVudCwgbGlzdCk7CisJCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOworCQlrZnJlZShlX25vZGUpOworCX0KK2ZhaWw6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19haW9fc2hhcmVkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX0FCT1JUX0dFVF9FVkVOVDogeworCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOworCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX09VVFBPUlRfRkxVU0g6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fT1VUUE9SVF9GTFVTSFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7CisJCXJjID0gYXVkaW9fYWlvX291dHBvcnRfZmx1c2goYXVkaW8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzWyVwS106IEFVRElPX09VVFBPUlRfRkxVU0ggZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpbyk7CisJCQlyYyA9IC1FSU5UUjsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TVE9QOiB7CisJCXByX2RlYnVnKCIlc1slcEtdOiBBVURJT19TVE9QIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlhdWRpby0+c3RvcHBlZCA9IDE7CisJCXJjID0gYXVkaW9fYWlvX2ZsdXNoKGF1ZGlvKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlc1slcEtdOkF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfUEFVU0U7CisJCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKSB7CisJCQlwcl9kZWJ1ZygiJXNbJXBLXSBXYWtpbmcgdXAgdGhlIGF1ZGlvX2Fpb19mc3luY1xuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fUEFVU0U6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fUEFVU0UgJWxkXG4iLCBfX2Z1bmNfXywgYXVkaW8sIGFyZyk7CisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJaWYgKGFyZyA9PSAxKSB7CisJCQlyYyA9IGF1ZGlvX2Fpb19wYXVzZShhdWRpbyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlc1slcEtdOiBwYXVzZSBGQUlMRUQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOworCQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJCWJyZWFrOworCQkJfQorCQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfUEFVU0U7CisJCX0gZWxzZSBpZiAoYXJnID09IDApIHsKKwkJCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX1BBVVNFKSB7CisJCQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJCQlpZiAocmMpCisJCQkJCXByX2VycigiJXNbJXBLXTogYXVkaW8gZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCQllbHNlIHsKKwkJCQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX1BBVVNFOworCQkJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19GTFVTSDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fRkxVU0ggc2Vzc2lvbmlkWyVkXVxuIiwgX19mdW5jX18sCisJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlhdWRpby0+cmZsdXNoID0gMTsKKwkJYXVkaW8tPndmbHVzaCA9IDE7CisJCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKSB7CisJCQlwcl9kZWJ1ZygiJXNbJXBLXSBXYWtpbmcgdXAgdGhlIGF1ZGlvX2Fpb19mc3luY1xuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8pOworCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOworCQl9CisJCS8qIEZsdXNoIERTUCAqLworCQlyYyA9IGF1ZGlvX2Fpb19mbHVzaChhdWRpbyk7CisJCS8qIEZsdXNoIGlucHV0IC8gT3V0cHV0IGJ1ZmZlciBpbiBzb2Z0d2FyZSovCisJCWF1ZGlvX2Fpb19pb3BvcnRfcmVzZXQoYXVkaW8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzWyVwS106QVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCXJjID0gLUVJTlRSOworCQl9IGVsc2UgeworCQkJYXVkaW8tPnJmbHVzaCA9IDA7CisJCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykKKwkJCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7CisJCQllbHNlCisJCQkJYXVkaW8tPndmbHVzaCA9IDA7CisKKwkJfQorCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDogeworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+YWMtPnNlc3Npb24sCisJCQlzaXplb2YodTE2KSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1NFU1NJT05fSUQgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fUE1fQVdBS0U6IHsKKwkJaWYgKChhdWRpby0+YXVkaW9fd3NfbWdyID09ICBOVUxMKSB8fAorCQkJCShhdWRpby0+bWlzY2RldmljZSA9PSBOVUxMKSkgeworCQkJcHJfZXJyKCIlc1slcEtdOiBpbnZhbGlkIHdzX21nciBvciBtaXNjZGV2aWNlIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCXJjID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX1BNX0FXQUtFXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmICghYXVkaW8tPndha2Vsb2NrX3ZvdGVkKSB7CisJCQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSB0cnVlOworCQkJbXV0ZXhfbG9jaygmYXVkaW8tPmF1ZGlvX3dzX21nci0+d3NfbG9jayk7CisJCQlpZiAoYXVkaW8tPmF1ZGlvX3dzX21nci0+cmVmX2NudCsrID09IDApCisJCQkJcG1fc3RheV9hd2FrZShhdWRpby0+bWlzY2RldmljZS0+dGhpc19kZXZpY2UpOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+YXVkaW9fd3NfbWdyLT53c19sb2NrKTsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fUE1fUkVMQVg6IHsKKwkJaWYgKChhdWRpby0+YXVkaW9fd3NfbWdyID09ICBOVUxMKSB8fAorCQkJCShhdWRpby0+bWlzY2RldmljZSA9PSBOVUxMKSkgeworCQkJcHJfZXJyKCIlc1slcEtdOiBpbnZhbGlkIHdzX21nciBvciBtaXNjZGV2aWNlIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvKTsKKwkJCXJjID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX1BNX1JFTEFYXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmIChhdWRpby0+d2FrZWxvY2tfdm90ZWQpIHsKKwkJCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCQkJbXV0ZXhfbG9jaygmYXVkaW8tPmF1ZGlvX3dzX21nci0+d3NfbG9jayk7CisJCQlpZiAoKGF1ZGlvLT5hdWRpb193c19tZ3ItPnJlZl9jbnQgPiAwKSAmJgorCQkJCQkoLS1hdWRpby0+YXVkaW9fd3NfbWdyLT5yZWZfY250ID09IDApKSB7CisJCQkJcG1fcmVsYXgoYXVkaW8tPm1pc2NkZXZpY2UtPnRoaXNfZGV2aWNlKTsKKwkJCX0KKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmF1ZGlvX3dzX21nci0+d3NfbG9jayk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gIC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKKworCit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2Fpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fQUJPUlRfR0VUX0VWRU5UOgorCWNhc2UgQVVESU9fT1VUUE9SVF9GTFVTSDoKKwljYXNlIEFVRElPX1NUT1A6CisJY2FzZSBBVURJT19QQVVTRToKKwljYXNlIEFVRElPX0ZMVVNIOgorCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6CisJY2FzZSBBVURJT19QTV9BV0FLRToKKwljYXNlIEFVRElPX1BNX1JFTEFYOgorCQlyYyA9IGF1ZGlvX2Fpb19zaGFyZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKwljYXNlIEFVRElPX0dFVF9TVEFUUzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOworCQl1aW50NjRfdCB0aW1lc3RhbXA7CisKKwkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RhdHMpKTsKKwkJc3RhdHMuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOworCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOworCQlyYyA9IHE2YXNtX2dldF9zZXNzaW9uX3RpbWUoYXVkaW8tPmFjLCAmdGltZXN0YW1wKTsKKwkJaWYgKHJjID49IDApCisJCQltZW1jcHkoJnN0YXRzLnVudXNlZFswXSwgJnRpbWVzdGFtcCwgc2l6ZW9mKHRpbWVzdGFtcCkpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aW1lc3RhbXBcbiIpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2ZybV91c2VyIGZvciBBVURJT19HRVRfU1RBVFMgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfRVZFTlQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fR0VUX0VWRU5UXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgeworCQkJcmMgPSBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCisJCQkJCQkodm9pZCBfX3VzZXIgKilhcmcpOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOworCQl9IGVsc2UKKwkJCXJjID0gLUVCVVNZOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19BU1lOQ19XUklURTogeworCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKQorCQkJcmMgPSAtRUJVU1k7CisJCWVsc2UgeworCQkJaWYgKGF1ZGlvLT5lbmFibGVkKQorCQkJCXJjID0gYXVkaW9fYWlvX2J1Zl9hZGQoYXVkaW8sIDEsCisJCQkJCQkodm9pZCBfX3VzZXIgKilhcmcpOworCQkJZWxzZQorCQkJCXJjID0gLUVQRVJNOworCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19BU1lOQ19SRUFEOiB7CisJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQlpZiAoYXVkaW8tPmZlZWRiYWNrKQorCQkJcmMgPSBhdWRpb19haW9fYnVmX2FkZChhdWRpbywgMCwKKwkJCQkJKHZvaWQgX191c2VyICopYXJnKTsKKwkJZWxzZQorCQkJcmMgPSAtRVBFUk07CisJCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKKworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7CisJCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplOworCQljZmcuYnVmZmVyX2NvdW50ID0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50OworCQlwcl9kZWJ1ZygiJXNbJXBLXTpHRVQgU1RSRUFNIENGRyAlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBhdWRpbywgY2ZnLmJ1ZmZlcl9zaXplLCBjZmcuYnVmZmVyX2NvdW50KTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7CisKKwkJcHJfZGVidWcoIiVzWyVwS106U0VUIFNUUkVBTSBDT05GSUdcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigKKwkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfU1RSRUFNX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7CisJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKKwkJcmMgPSAwOworCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7CisKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPnBjbV9jZmcsIHNpemVvZihjZmcpKSkgeworCQkJcHJfZXJyKAorCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOworCisJCXByX2VycigiJXNbJXBLXTpBVURJT19TRVRfQ09ORklHXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0NPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXVkaW8tPmZlZWRiYWNrICE9IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJcHJfZXJyKCIlc1slcEtdOk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iLAorCQkJCSBfX2Z1bmNfXywgYXVkaW8pOworCQkJcmMgPSAtRUFDQ0VTOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX0NPVU5UKSB8fAorCQkJKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCisJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKKworCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKKwkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47CisKKwkJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gY29uZmlnLmJ1ZmZlcl9jb3VudDsKKwkJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBjb25maWcuYnVmZmVyX3NpemU7CisJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKKwkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisJCXJjID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9CVUZfQ0ZHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZyAgY2ZnOworCisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigKKwkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19HRVRfQlVGIENPTkZJRyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpICYmCisJCQkhY2ZnLm1ldGFfaW5mb19lbmFibGUpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gY2ZnLm1ldGFfaW5mb19lbmFibGU7CisJCXByX2RlYnVnKCIlc1slcEtdOnNlc3Npb24gaWQgJWQ6IFNldC1idWYtY2ZnOiBtZXRhWyVkXSIsCisJCQkJX19mdW5jX18sIGF1ZGlvLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLm1ldGFfaW5mb19lbmFibGUpOworCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0JVRl9DRkc6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106c2Vzc2lvbiBpZCAlZDogR2V0LWJ1Zi1jZmc6IG1ldGFbJWRdIGZyYW1lc3BlcmJ1ZlslZF1cbiIsCisJCQkgX19mdW5jX18sIGF1ZGlvLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlLAorCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYpOworCisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5idWZfY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9CVUZfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1JFR0lTVEVSX0lPTjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIGluZm87CisKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fUkVHSVNURVJfSU9OXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgKilhcmcsIHNpemVvZihpbmZvKSkpIHsKKwkJCXByX2VycigKKwkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19SRUdJU1RFUl9JT04gZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQkJcmMgPSBhdWRpb19haW9faW9uX2FkZChhdWRpbywgJmluZm8pOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19ERVJFR0lTVEVSX0lPTjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIGluZm87CisKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlwcl9kZWJ1ZygiJXNbJXBLXTpBVURJT19ERVJFR0lTVEVSX0lPTlxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCAqKWFyZywgc2l6ZW9mKGluZm8pKSkgeworCQkJcHJfZXJyKAorCQkJCSIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX0RFUkVHSVNURVJfSU9OIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKKwkJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwkJCXJjID0gYXVkaW9fYWlvX2lvbl9yZW1vdmUoYXVkaW8sICZpbmZvKTsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAgLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIgeworCXUzMiBidWZmZXJfc2l6ZTsKKwl1MzIgYnVmZmVyX2NvdW50OworfTsKKworc3RydWN0IG1zbV9hdWRpb19zdGF0czMyIHsKKwl1MzIgYnl0ZV9jb3VudDsKKwl1MzIgc2FtcGxlX2NvdW50OworCXUzMiB1bnVzZWRbMl07Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIHsKKwl1MzIgYnVmZmVyX3NpemU7CisJdTMyIGJ1ZmZlcl9jb3VudDsKKwl1MzIgY2hhbm5lbF9jb3VudDsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIHR5cGU7CisJdTMyIG1ldGFfZmllbGQ7CisJdTMyIGJpdHM7CisJdTMyIHVudXNlZFszXTsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyIHsKKwl1MzIgbWV0YV9pbmZvX2VuYWJsZTsKKwl1MzIgZnJhbWVzX3Blcl9idWY7Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvMzIgeworCWludCBmZDsKKwljb21wYXRfdXB0cl90IHZhZGRyOworfTsKKworZW51bSB7CisJQVVESU9fR0VUX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDMsCisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyKSwKKwlBVURJT19TRVRfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgNCwKKwkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnMzIpLAorCUFVRElPX0dFVF9TVEFUU18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDUsCisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzMzIpLAorCUFVRElPX0dFVF9FVkVOVF8zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDEzLAorCQkJc3RydWN0IG1zbV9hdWRpb19ldmVudDMyKSwKKwlBVURJT19BU1lOQ19XUklURV8zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDE3LAorCQkJc3RydWN0IG1zbV9hdWRpb19haW9fYnVmMzIpLAorCUFVRElPX0FTWU5DX1JFQURfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxOCwKKwkJCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZjMyKSwKKwlBVURJT19TRVRfU1RSRUFNX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDgwLAorCQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIpLAorCUFVRElPX0dFVF9TVFJFQU1fQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywgODEsCisJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWczMiksCisJQVVESU9fR0VUX0JVRl9DRkdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MywKKwkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyKSwKKwlBVURJT19TRVRfQlVGX0NGR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk0LAorCQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIpLAorCUFVRElPX1JFR0lTVEVSX0lPTl8zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk3LAorCQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbzMyKSwKKwlBVURJT19ERVJFR0lTVEVSX0lPTl8zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk4LAorCQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbzMyKSwKK307CisKK3N0YXRpYyBsb25nIGF1ZGlvX2Fpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fQUJPUlRfR0VUX0VWRU5UOgorCWNhc2UgQVVESU9fT1VUUE9SVF9GTFVTSDoKKwljYXNlIEFVRElPX1NUT1A6CisJY2FzZSBBVURJT19QQVVTRToKKwljYXNlIEFVRElPX0ZMVVNIOgorCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6CisJY2FzZSBBVURJT19QTV9BV0FLRToKKwljYXNlIEFVRElPX1BNX1JFTEFYOgorCQlyYyA9IGF1ZGlvX2Fpb19zaGFyZWRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKwljYXNlIEFVRElPX0dFVF9TVEFUU18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzMzIgc3RhdHM7CisJCXVpbnQ2NF90IHRpbWVzdGFtcDsKKworCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19zdGF0czMyKSk7CisJCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKKwkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKKwkJcmMgPSBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lKGF1ZGlvLT5hYywgJnRpbWVzdGFtcCk7CisJCWlmIChyYyA+PSAwKQorCQkJbWVtY3B5KCZzdGF0cy51bnVzZWRbMF0sICZ0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApKTsKKwkJZWxzZQorCQkJcHJfZGVidWcoIkVycm9yIHdoaWxlIGdldHRpbmcgdGltZXN0YW1wXG4iKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkgeworCQkJcHJfZXJyKAorCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfU1RBVFNfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfRVZFTlRfMzI6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fR0VUX0VWRU5UXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgeworCQkJcmMgPSBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXFfY29tcGF0KGF1ZGlvLAorCQkJCQkJKHZvaWQgX191c2VyICopYXJnKTsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKKwkJfSBlbHNlCisJCQlyYyA9IC1FQlVTWTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fQVNZTkNfV1JJVEVfMzI6IHsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykKKwkJCXJjID0gLUVCVVNZOworCQllbHNlIHsKKwkJCWlmIChhdWRpby0+ZW5hYmxlZCkKKwkJCQlyYyA9IGF1ZGlvX2Fpb19idWZfYWRkX2NvbXBhdChhdWRpbywgMSwKKwkJCQkJCSh2b2lkIF9fdXNlciAqKWFyZyk7CisJCQllbHNlCisJCQkJcmMgPSAtRVBFUk07CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0FTWU5DX1JFQURfMzI6IHsKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7CisJCWlmIChhdWRpby0+ZmVlZGJhY2spCisJCQlyYyA9IGF1ZGlvX2Fpb19idWZfYWRkX2NvbXBhdChhdWRpbywgMCwKKwkJCQkJKHZvaWQgX191c2VyICopYXJnKTsKKwkJZWxzZQorCQkJcmMgPSAtRVBFUk07CisJCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7CisJCWJyZWFrOworCX0KKworCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIgY2ZnOworCisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKKwkJY2ZnLmJ1ZmZlcl9zaXplID0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemU7CisJCWNmZy5idWZmZXJfY291bnQgPSBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQ7CisJCXByX2RlYnVnKCIlc1slcEtdOkdFVCBTVFJFQU0gQ0ZHICVkICVkXG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCBjZmcuYnVmZmVyX3NpemUsIGNmZy5idWZmZXJfY291bnQpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1NUUkVBTV9DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIgY2ZnXzMyOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOworCisJCXByX2RlYnVnKCIlc1slcEtdOlNFVCBTVFJFQU0gQ09ORklHXG4iLCBfX2Z1bmNfXywgYXVkaW8pOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1NUUkVBTV9DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJY2ZnLmJ1ZmZlcl9zaXplID0gY2ZnXzMyLmJ1ZmZlcl9zaXplOworCQljZmcuYnVmZmVyX2NvdW50ID0gY2ZnXzMyLmJ1ZmZlcl9jb3VudDsKKworCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7CisJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKKwkJcmMgPSAwOworCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIGNmZ18zMjsKKworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCW1lbXNldCgmY2ZnXzMyLCAwLCBzaXplb2YoY2ZnXzMyKSk7CisJCWNmZ18zMi5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplOworCQljZmdfMzIuYnVmZmVyX2NvdW50ID0gYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50OworCQljZmdfMzIuY2hhbm5lbF9jb3VudCA9IGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQ7CisJCWNmZ18zMi5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlOworCQljZmdfMzIudHlwZSA9IGF1ZGlvLT5wY21fY2ZnLnR5cGU7CisJCWNmZ18zMi5tZXRhX2ZpZWxkID0gYXVkaW8tPnBjbV9jZmcubWV0YV9maWVsZDsKKwkJY2ZnXzMyLmJpdHMgPSBhdWRpby0+cGNtX2NmZy5iaXRzOworCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsIHNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQ09ORklHXzMyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIGNvbmZpZ18zMjsKKworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisKKwkJaWYgKGF1ZGlvLT5mZWVkYmFjayAhPSBOT05fVFVOTkVMX01PREUpIHsKKwkJCXByX2VycigiJXNbJXBLXTpOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIiwKKwkJCQkgX19mdW5jX18sIGF1ZGlvKTsKKwkJCXJjID0gLUVBQ0NFUzsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZXJyKCIlc1slcEtdOkFVRElPX1NFVF9DT05GSUdcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnXzMyLCAodm9pZCAqKWFyZywKKwkJCQkJc2l6ZW9mKGNvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCQljb25maWcuYnVmZmVyX3NpemUgPSBjb25maWdfMzIuYnVmZmVyX3NpemU7CisJCWNvbmZpZy5idWZmZXJfY291bnQgPSBjb25maWdfMzIuYnVmZmVyX2NvdW50OworCQljb25maWcuY2hhbm5lbF9jb3VudCA9IGNvbmZpZ18zMi5jaGFubmVsX2NvdW50OworCQljb25maWcuc2FtcGxlX3JhdGUgPSBjb25maWdfMzIuc2FtcGxlX3JhdGU7CisJCWNvbmZpZy50eXBlID0gY29uZmlnXzMyLnR5cGU7CisJCWNvbmZpZy5tZXRhX2ZpZWxkID0gY29uZmlnXzMyLm1ldGFfZmllbGQ7CisJCWNvbmZpZy5iaXRzID0gY29uZmlnXzMyLmJpdHM7CisKKwkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9DT1VOVCkgfHwKKwkJCShjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQorCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7CisKKwkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCisJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOworCisJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IGNvbmZpZy5idWZmZXJfY291bnQ7CisJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gY29uZmlnLmJ1ZmZlcl9zaXplOworCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gY29uZmlnLmNoYW5uZWxfY291bnQ7CisJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworCQlyYyA9IDA7CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfQlVGX0NGR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiBjZmdfMzI7CisKKwkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJY2ZnLm1ldGFfaW5mb19lbmFibGUgPSBjZmdfMzIubWV0YV9pbmZvX2VuYWJsZTsKKwkJY2ZnLmZyYW1lc19wZXJfYnVmID0gY2ZnXzMyLmZyYW1lc19wZXJfYnVmOworCisJCWlmICgoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgJiYKKwkJCSFjZmcubWV0YV9pbmZvX2VuYWJsZSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSBjZmcubWV0YV9pbmZvX2VuYWJsZTsKKwkJcHJfZGVidWcoIiVzWyVwS106c2Vzc2lvbiBpZCAlZDogU2V0LWJ1Zi1jZmc6IG1ldGFbJWRdIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBjZmcubWV0YV9pbmZvX2VuYWJsZSk7CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfQlVGX0NGR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiBjZmdfMzI7CisKKwkJcHJfZGVidWcoIiVzWyVwS106c2Vzc2lvbiBpZCAlZDogR2V0LWJ1Zi1jZmc6IG1ldGFbJWRdIGZyYW1lc3BlcmJ1ZlslZF1cbiIsCisJCQkgX19mdW5jX18sIGF1ZGlvLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlLAorCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYpOworCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7CisJCW1lbXNldCgmY2ZnXzMyLCAwLCBzaXplb2YoY2ZnXzMyKSk7CisJCWNmZ18zMi5tZXRhX2luZm9fZW5hYmxlID0gYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZTsKKwkJY2ZnXzMyLmZyYW1lc19wZXJfYnVmID0gYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWY7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQlVGX0NGR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19SRUdJU1RFUl9JT05fMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbzMyIGluZm9fMzI7CisJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKKworCQlwcl9kZWJ1ZygiJXNbJXBLXTpBVURJT19SRUdJU1RFUl9JT05cbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvXzMyLCAodm9pZCAqKWFyZywgc2l6ZW9mKGluZm9fMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1JFR0lTVEVSX0lPTl8zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJaW5mby5mZCA9IGluZm9fMzIuZmQ7CisJCQlpbmZvLnZhZGRyID0gY29tcGF0X3B0cihpbmZvXzMyLnZhZGRyKTsKKwkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQkJcmMgPSBhdWRpb19haW9faW9uX2FkZChhdWRpbywgJmluZm8pOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19ERVJFR0lTVEVSX0lPTl8zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvMzIgaW5mb18zMjsKKwkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyBpbmZvOworCisJCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKKwkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fREVSRUdJU1RFUl9JT05cbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mb18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihpbmZvXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvcglBVURJT19ERVJFR0lTVEVSX0lPTl8zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJaW5mby5mZCA9IGluZm9fMzIuZmQ7CisJCQlpbmZvLnZhZGRyID0gY29tcGF0X3B0cihpbmZvXzMyLnZhZGRyKTsKKwkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOworCQkJcmMgPSBhdWRpb19haW9faW9uX3JlbW92ZShhdWRpbywgJmluZm8pOworCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7CisJCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOworCQl9CisJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9ICAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fdXRpbHNfYWlvLmggYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzc0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5oCkBAIC0wLDAgKzEsMjMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlICJxNmF1ZGlvX2NvbW1vbi5oIgorCisjZGVmaW5lIFRVTk5FTF9NT0RFICAgICAweDAwMDAKKyNkZWZpbmUgTk9OX1RVTk5FTF9NT0RFIDB4MDAwMQorCisjZGVmaW5lIEFEUlZfU1RBVFVTX0FJT19JTlRGIDB4MDAwMDAwMDEgLyogQUlPIGludGVyZmFjZSAqLworI2RlZmluZSBBRFJWX1NUQVRVU19GU1lOQyAweDAwMDAwMDA4CisjZGVmaW5lIEFEUlZfU1RBVFVTX1BBVVNFIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVVESU9fREVDX0VPU19TRVQgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVVESU9fREVDX0VPRl9TRVQgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVVESU9fRVZFTlRfTlVNCQkxMAorCisjZGVmaW5lIF9fQ09OVEFJTlMociwgdiwgbCkgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXR5cGVvZihyKSBfX3IgPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXR5cGVvZih2KSBfX3YgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCByZXMgPSAoKF9fdiA+PSBfX3ItPnZhZGRyKSAmJiAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoX19lIDw9IF9fci0+dmFkZHIgKyBfX3ItPmxlbikpOyAgICAgICAgICAgICAgICBcCisJcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIENPTlRBSU5TKHIxLCByMikgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXR5cGVvZihyMikgX19yMiA9IHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fQ09OVEFJTlMocjEsIF9fcjItPnZhZGRyLCBfX3IyLT5sZW4pOyAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBJTl9SQU5HRShyLCB2KSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YocikgX19yID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YodikgX192diA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgcmVzID0gKChfX3Z2ID49IF9fci0+dmFkZHIpICYmICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKF9fdnYgPCAoX19yLT52YWRkciArIF9fci0+bGVuKSkpOyAgICAgICAgICAgICAgXAorCXJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YocjEpIF9fcjEgPSByMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YocjIpIF9fcjIgPSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YoX19yMi0+dmFkZHIpIF9fdiA9IF9fcjItPnZhZGRyOyAgICAgICAgICAgICAgICAgIFwKKwl0eXBlb2YoX192KSBfX2UgPSBfX3YgKyBfX3IyLT5sZW4gLSAxOyAgICAgICAgICAgICAgICAgIFwKKwlpbnQgcmVzID0gKElOX1JBTkdFKF9fcjEsIF9fdikgfHwgSU5fUkFOR0UoX19yMSwgX19lKSk7IFwKKwlyZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKK3N0cnVjdCB0aW1lc3RhbXAgeworCXUzMiBsb3dwYXJ0OworCXUzMiBoaWdocGFydDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtZXRhX291dF9kc3AgeworCXUzMiBvZmZzZXRfdG9fZnJhbWU7CisJdTMyIGZyYW1lX3NpemU7CisJdTMyIGVuY29kZWRfcGNtX3NhbXBsZXM7CisJdTMyIG1zd190czsKKwl1MzIgbHN3X3RzOworCXUzMiBuZmxhZ3M7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZGVjX21ldGFfaW4geworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMThdOworCXVuc2lnbmVkIHNob3J0IG9mZnNldDsKKwlzdHJ1Y3QgdGltZXN0YW1wIG50aW1lc3RhbXA7CisJdW5zaWduZWQgaW50IG5mbGFnczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkZWNfbWV0YV9vdXQgeworCXVuc2lnbmVkIGludCByZXNlcnZlZFs3XTsKKwl1bnNpZ25lZCBpbnQgbnVtX29mX2ZyYW1lczsKKwlzdHJ1Y3QgbWV0YV9vdXRfZHNwIG1ldGFfb3V0X2RzcFtdOworfSBfX3BhY2tlZDsKKworLyogR2VuZXJhbCBtZXRhIGZpZWxkIHRvIHN0b3JlIG1ldGEgaW5mbyBsb2NhbGx5ICovCit1bmlvbiAgbWV0YV9kYXRhIHsKKwlzdHJ1Y3QgZGVjX21ldGFfb3V0IG1ldGFfb3V0OworCXN0cnVjdCBkZWNfbWV0YV9pbiBtZXRhX2luOworfSBfX3BhY2tlZDsKKworLyogcGVyIGRldmljZSB3YWtldXAgc291cmNlIG1hbmFnZXIgKi8KK3N0cnVjdCB3c19tZ3IgeworCXN0cnVjdCBtdXRleCAgICAgICB3c19sb2NrOworCXVpbnQzMl90ICAgICAgICAgICByZWZfY250OworfTsKKworI2RlZmluZSBQQ01fQlVGX0NPVU5UICAgICAgICAgICAoMikKKy8qIEJ1ZmZlciB3aXRoIG1ldGEgKi8KKyNkZWZpbmUgUENNX0JVRlNaX01JTiAgICAgICAgICAgKCg0KjEwMjQpICsgc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpKQorCisvKiBGUkFNRV9OVU0gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBGUkFNRV9OVU0gICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgRlJBTUVfU0laRQkoKDQqMTUzNikgKyBzaXplb2Yoc3RydWN0IGRlY19tZXRhX2luKSkKKworc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKKwlpbnQgZmQ7CisJdm9pZCAqdmFkZHI7CisJcGh5c19hZGRyX3QgcGFkZHI7CisJdm9pZCAqa3ZhZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGludCByZWZfY250OworfTsKKworc3RydWN0IGF1ZGlvX2Fpb19ldmVudCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBldmVudF90eXBlOworCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Cit9OworCitzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIGJ1ZjsKKwl1bnNpZ25lZCBsb25nIHBhZGRyOworCXVpbnQzMl90IHRva2VuOworCXZvaWQgICAgICAgICAgICAqa3ZhZGRyOworCXVuaW9uIG1ldGFfZGF0YSBtZXRhX2luZm87Cit9OworCitzdHJ1Y3QgcTZhdWRpb19haW87CitzdHJ1Y3QgYXVkaW9fYWlvX2Rydl9vcGVyYXRpb25zIHsKKwl2b2lkICgqb3V0X2ZsdXNoKShzdHJ1Y3QgcTZhdWRpb19haW8gKik7CisJdm9pZCAoKmluX2ZsdXNoKShzdHJ1Y3QgcTZhdWRpb19haW8gKik7Cit9OworCitzdHJ1Y3QgcTZhdWRpb19haW8geworCWF0b21pY190IGluX2J5dGVzOworCWF0b21pY190IGluX3NhbXBsZXM7CisKKwlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgc3RyX2NmZzsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgICAgICAgIGJ1Zl9jZmc7CisJc3RydWN0IG1zbV9hdWRpb19jb25maWcgcGNtX2NmZzsKKwl2b2lkICpjb2RlY19jZmc7CisKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKKworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7CisJc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7CisJc3RydWN0IG11dGV4IGdldF9ldmVudF9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IGNtZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKKwlzcGlubG9ja190IGRzcF9sb2NrOworCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKKworCXN0cnVjdCBtaXNjZGV2aWNlICptaXNjZGV2aWNlOworCXVpbnQzMl90IHdha2Vsb2NrX3ZvdGVkOworCXN0cnVjdCB3c19tZ3IgKmF1ZGlvX3dzX21ncjsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKyNlbmRpZgorCXN0cnVjdCBsaXN0X2hlYWQgb3V0X3F1ZXVlOyAgICAgLyogcXVldWUgdG8gcmV0YWluIG91dHB1dCBidWZmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCBpbl9xdWV1ZTsgICAgICAvKiBxdWV1ZSB0byByZXRhaW4gaW5wdXQgYnVmZmVycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgaW9uX3JlZ2lvbl9xdWV1ZTsgICAgIC8qIHByb3RlY3RlZCBieSBsb2NrICovCisJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgYXVkaW9fYWlvX2Rydl9vcGVyYXRpb25zIGRydl9vcHM7CisJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZW9zX3dyaXRlX3BheWxvYWQ7CisJdWludDMyX3QgZGV2aWNlX2V2ZW50czsKKwl1aW50MTZfdCB2b2x1bWU7CisJdWludDMyX3QgZHJ2X3N0YXR1czsKKwlpbnQgZXZlbnRfYWJvcnQ7CisJaW50IGVvc19yc3A7CisJaW50IGVvc19mbGFnOworCWludCBvcGVuZWQ7CisJaW50IGVuYWJsZWQ7CisJaW50IHN0b3BwZWQ7CisJaW50IGZlZWRiYWNrOworCWludCByZmx1c2g7ICAgICAgICAgICAgIC8qIFJlYWQgIGZsdXNoICovCisJaW50IHdmbHVzaDsgICAgICAgICAgICAgLyogV3JpdGUgZmx1c2ggKi8KKwlib29sIHJlc2V0X2V2ZW50OworCWxvbmcgKCpjb2RlY19pb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlsb25nICgqY29kZWNfY29tcGF0X2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworfTsKKwordm9pZCBhdWRpb19haW9fYXN5bmNfd3JpdGVfYWNrKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIHVpbnQzMl90IHRva2VuLAorCQkJCXVpbnQzMl90ICpwYXlsb2FkKTsKKwordm9pZCBhdWRpb19haW9fYXN5bmNfcmVhZF9hY2soc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdWludDMyX3QgdG9rZW4sCisJCQl1aW50MzJfdCAqcGF5bG9hZCk7CisKK2ludCBpbnNlcnRfZW9zX2J1ZihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAorCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZSk7CisKK3ZvaWQgZXh0cmFjdF9tZXRhX291dF9pbmZvKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCisJCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlLCBpbnQgZGlyKTsKKworaW50IGF1ZGlvX2Fpb19vcGVuKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBhdWRpb19haW9fZW5hYmxlKHN0cnVjdCBxNmF1ZGlvX2FpbyAgKmF1ZGlvKTsKK3ZvaWQgYXVkaW9fYWlvX3Bvc3RfZXZlbnQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgaW50IHR5cGUsCisJCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOworaW50IGF1ZGlvX2Fpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBhdWRpb19haW9fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKTsKK3ZvaWQgYXVkaW9fYWlvX2FzeW5jX291dF9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKTsKK3ZvaWQgYXVkaW9fYWlvX2FzeW5jX2luX2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pOwordm9pZCBhdWRpb19haW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pOworaW50IGVuYWJsZV92b2x1bWVfcmFtcChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK2ludCBhdWRpb19haW9fZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Citzc2l6ZV90IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3dtYS5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb193bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzUzMzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb193bWEuYwpAQCAtMCwwICsxLDM0NSBAQAorLyogd21hIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3dtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hX21pc2M7CitzdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb193bWFfd3NfbWdyOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb193bWFfZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9OworI2VuZGlmCisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJc3RydWN0IGFzbV93bWFfY2ZnIHdtYV9jZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiAqd21hX2NvbmZpZzsKKworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdtYV9jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJd21hX2NmZy5mb3JtYXRfdGFnID0gd21hX2NvbmZpZy0+Zm9ybWF0X3RhZzsKKwkJd21hX2NmZy5jaF9jZmcgPSB3bWFfY29uZmlnLT5udW1jaGFubmVsczsKKwkJd21hX2NmZy5zYW1wbGVfcmF0ZSA9ICB3bWFfY29uZmlnLT5zYW1wbGluZ3JhdGU7CisJCXdtYV9jZmcuYXZnX2J5dGVzX3Blcl9zZWMgPSB3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKKwkJd21hX2NmZy5ibG9ja19hbGlnbiA9IHdtYV9jb25maWctPmJsb2NrX2FsaWduOworCQl3bWFfY2ZnLnZhbGlkX2JpdHNfcGVyX3NhbXBsZSA9CisJCQkJd21hX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlOworCQl3bWFfY2ZnLmNoX21hc2sgPSAgd21hX2NvbmZpZy0+Y2hhbm5lbG1hc2s7CisJCXdtYV9jZmcuZW5jb2RlX29wdCA9IHdtYV9jb25maWctPmVuY29kZW9wdDsKKwkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLworCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWEoYXVkaW8tPmFjLCAmd21hX2NmZywKKwkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiY21kIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKKwkJYXVkaW8tPmVvc19yc3AgPSAwOworCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOworCQlpZiAoIXJjKSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDA7CisJCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCJBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsIGF1ZGlvLT5lbmFibGVkKTsKKwkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCisJCQlhdWRpby0+c3RvcHBlZCA9IDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9XTUFfQ09ORklHX1YyOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyKSkpIHsKKwkJCXByX2VycigiJXM6Y29weV90b191c2VyIGZvciBBVURJT19TRVRfV01BX0NPTkZJR19WMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX1dNQV9DT05GSUdfVjI6IHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGF1ZGlvLT5jb2RlY19jZmcsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MikpKSB7CisJCQlwcl9lcnIoIiVzOmNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfV01BX0NPTkZJR19WMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7CisJCWJyZWFrOworCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyIHsKKwl1MTYgZm9ybWF0X3RhZzsKKwl1MTYgbnVtY2hhbm5lbHM7CisJdTMyIHNhbXBsaW5ncmF0ZTsKKwl1MzIgYXZnYnl0ZXNwZXJzZWNvbmQ7CisJdTE2IGJsb2NrX2FsaWduOworCXUxNiB2YWxpZGJpdHNwZXJzYW1wbGU7CisJdTMyIGNoYW5uZWxtYXNrOworCXUxNiBlbmNvZGVvcHQ7Cit9OworCitlbnVtIHsKKwlBVURJT19HRVRfV01BX0NPTkZJR19WMl8zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsyKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyKSwKKwlBVURJT19TRVRfV01BX0NPTkZJR19WMl8zMiA9ICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyKQorfTsKKworc3RhdGljIGxvbmcgYXVkaW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfV01BX0NPTkZJR19WMl8zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIgKndtYV9jb25maWc7CisJCXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192Ml8zMiB3bWFfY29uZmlnXzMyOworCisJCW1lbXNldCgmd21hX2NvbmZpZ18zMiwgMCwgc2l6ZW9mKHdtYV9jb25maWdfMzIpKTsKKworCQl3bWFfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiAqKWF1ZGlvLT5jb2RlY19jZmc7CisJCXdtYV9jb25maWdfMzIuZm9ybWF0X3RhZyA9IHdtYV9jb25maWctPmZvcm1hdF90YWc7CisJCXdtYV9jb25maWdfMzIubnVtY2hhbm5lbHMgPSB3bWFfY29uZmlnLT5udW1jaGFubmVsczsKKwkJd21hX2NvbmZpZ18zMi5zYW1wbGluZ3JhdGUgPSB3bWFfY29uZmlnLT5zYW1wbGluZ3JhdGU7CisJCXdtYV9jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQgPSB3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKKwkJd21hX2NvbmZpZ18zMi5ibG9ja19hbGlnbiA9IHdtYV9jb25maWctPmJsb2NrX2FsaWduOworCQl3bWFfY29uZmlnXzMyLnZhbGlkYml0c3BlcnNhbXBsZSA9CisJCQkJCXdtYV9jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZTsKKwkJd21hX2NvbmZpZ18zMi5jaGFubmVsbWFzayA9IHdtYV9jb25maWctPmNoYW5uZWxtYXNrOworCQl3bWFfY29uZmlnXzMyLmVuY29kZW9wdCA9IHdtYV9jb25maWctPmVuY29kZW9wdDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJndtYV9jb25maWdfMzIsCisJCQlzaXplb2Yod21hX2NvbmZpZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEdFVF9XTUFfQ09ORklHX1YyXzMyIGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX1dNQV9DT05GSUdfVjJfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyICp3bWFfY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjJfMzIgd21hX2NvbmZpZ18zMjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJndtYV9jb25maWdfMzIsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKHdtYV9jb25maWdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIFNFVF9XTUFfQ09ORklHX1YyXzMyIGZhaWxlZFxuIgorCQkJCSwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJd21hX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIgKilhdWRpby0+Y29kZWNfY2ZnOworCQl3bWFfY29uZmlnLT5mb3JtYXRfdGFnID0gd21hX2NvbmZpZ18zMi5mb3JtYXRfdGFnOworCQl3bWFfY29uZmlnLT5udW1jaGFubmVscyA9IHdtYV9jb25maWdfMzIubnVtY2hhbm5lbHM7CisJCXdtYV9jb25maWctPnNhbXBsaW5ncmF0ZSA9IHdtYV9jb25maWdfMzIuc2FtcGxpbmdyYXRlOworCQl3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZCA9IHdtYV9jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQ7CisJCXdtYV9jb25maWctPmJsb2NrX2FsaWduID0gd21hX2NvbmZpZ18zMi5ibG9ja19hbGlnbjsKKwkJd21hX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlID0KKwkJCQl3bWFfY29uZmlnXzMyLnZhbGlkYml0c3BlcnNhbXBsZTsKKwkJd21hX2NvbmZpZy0+Y2hhbm5lbG1hc2sgPSB3bWFfY29uZmlnXzMyLmNoYW5uZWxtYXNrOworCQl3bWFfY29uZmlnLT5lbmNvZGVvcHQgPSB3bWFfY29uZmlnXzMyLmVuY29kZW9wdDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiRmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwgcmMpOworCQlicmVhazsKKwl9CisJfQorCXJldHVybiByYzsKK30KKyNlbHNlCisjZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOworCWludCByYyA9IDA7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLworCWNoYXIgbmFtZVtzaXplb2YgIm1zbV93bWFfIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOworCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX3dtYV9taXNjOworCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOworCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fd21hX3dzX21ncjsKKworCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKKwkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKKwkJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWw7CisJfQorCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCisJCQkJCSAgIEZPUk1BVF9XTUFfVjkpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7CisJCS8qIG9wZW4gV01BIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMSovCisJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKwkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9XTUFfVjkpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV93bWFfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX3dtYV9kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczp3bWFkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJcmV0dXJuIHJjOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOworCWtmcmVlKGF1ZGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3dtYV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXVkaW9fb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAorCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKKwkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hX21pc2MgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gIm1zbV93bWEiLAorCS5mb3BzID0gJmF1ZGlvX3dtYV9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fd21hX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fd21hX21pc2MpOworCisJaWYgKHJldCA9PSAwKQorCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fd21hX21pc2MudGhpc19kZXZpY2UsIHRydWUpOworCWF1ZGlvX3dtYV93c19tZ3IucmVmX2NudCA9IDA7CisJbXV0ZXhfaW5pdCgmYXVkaW9fd21hX3dzX21nci53c19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChhdWRpb193bWFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3dtYXByby5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb193bWFwcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2I5ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb193bWFwcm8uYwpAQCAtMCwwICsxLDQxOCBAQAorLyogd21hcHJvIGF1ZGlvIG91dHB1dCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3dtYXByby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hcHJvX21pc2M7CitzdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb193bWFwcm9fd3NfbWdyOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb193bWFwcm9fZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAorCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCit9OworI2VuZGlmCisKK3N0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJc3RydWN0IGFzbV93bWFwcm9fY2ZnIHdtYXByb19jZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZyAqd21hcHJvX2NvbmZpZzsKKworCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLworCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjIoYXVkaW8tPmFjLAorCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCwKKwkJCQkJMTYsIC8qIGJpdHMgcGVyIHNhbXBsZSAqLworCQkJCQl0cnVlLCAvKiB1c2UgZGVmYXVsdCBjaGFubmVsIG1hcCAqLworCQkJCQl0cnVlLCAvKiB1c2UgYmFjayBjaGFubmVsIG1hcCBmbGF2b3IgKi8KKwkJCQkJTlVMTCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdtYXByb19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnICopCisJCQkJYXVkaW8tPmNvZGVjX2NmZzsKKwkJaWYgKCh3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWcgPT0gMHgxNjIpIHx8CisJCSh3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWcgPT0gMHgxNjMpIHx8CisJCSh3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWcgPT0gMHgxNjYpIHx8CisJCSh3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWcgPT0gMHgxNjcpKSB7CisJCQl3bWFwcm9fY2ZnLmZvcm1hdF90YWcgPSB3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWc7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOkFVRElPX1NUQVJUIGZhaWxlZDogZm9ybWF0dGFnID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHdtYXByb19jb25maWctPmZvcm1hdHRhZyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAod21hcHJvX2NvbmZpZy0+bnVtY2hhbm5lbHMgPiAwKSB7CisJCQl3bWFwcm9fY2ZnLmNoX2NmZyA9IHdtYXByb19jb25maWctPm51bWNoYW5uZWxzOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczpBVURJT19TVEFSVCBmYWlsZWQ6IGNoYW5uZWxzID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHdtYXByb19jb25maWctPm51bWNoYW5uZWxzKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh3bWFwcm9fY29uZmlnLT5zYW1wbGluZ3JhdGUgPiAwKSB7CisJCQl3bWFwcm9fY2ZnLnNhbXBsZV9yYXRlID0gd21hcHJvX2NvbmZpZy0+c2FtcGxpbmdyYXRlOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczpBVURJT19TVEFSVCBmYWlsZWQ6IHNhbXBsZV9yYXRlID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHdtYXByb19jb25maWctPnNhbXBsaW5ncmF0ZSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQl3bWFwcm9fY2ZnLmF2Z19ieXRlc19wZXJfc2VjID0KKwkJCQl3bWFwcm9fY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKKwkJaWYgKCh3bWFwcm9fY29uZmlnLT5hc2ZwYWNrZXRsZW5ndGggPD0gMTMzNzYpIHx8CisJCSh3bWFwcm9fY29uZmlnLT5hc2ZwYWNrZXRsZW5ndGggPiAwKSkgeworCQkJd21hcHJvX2NmZy5ibG9ja19hbGlnbiA9CisJCQkJd21hcHJvX2NvbmZpZy0+YXNmcGFja2V0bGVuZ3RoOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczpBVURJT19TVEFSVCBmYWlsZWQ6IGJsb2NrX2FsaWduID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHdtYXByb19jb25maWctPmFzZnBhY2tldGxlbmd0aCk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHdtYXByb19jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZSA9PSAxNikgfHwKKwkJCSh3bWFwcm9fY29uZmlnLT52YWxpZGJpdHNwZXJzYW1wbGUgPT0gMjQpKSB7CisJCQl3bWFwcm9fY2ZnLnZhbGlkX2JpdHNfcGVyX3NhbXBsZSA9CisJCQkJd21hcHJvX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczpBVURJT19TVEFSVCBmYWlsZWQ6IGJpdHNwZXJzYW1wbGUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgd21hcHJvX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXdtYXByb19jZmcuY2hfbWFzayA9IHdtYXByb19jb25maWctPmNoYW5uZWxtYXNrOworCQl3bWFwcm9fY2ZnLmVuY29kZV9vcHQgPSB3bWFwcm9fY29uZmlnLT5lbmNvZGVvcHQ7CisJCXdtYXByb19jZmcuYWR2X2VuY29kZV9vcHQgPQorCQkJCXdtYXByb19jb25maWctPmFkdmFuY2VkZW5jb2Rlb3B0OworCQl3bWFwcm9fY2ZnLmFkdl9lbmNvZGVfb3B0MiA9CisJCQkJd21hcHJvX2NvbmZpZy0+YWR2YW5jZWRlbmNvZGVvcHQyOworCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCisJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3dtYXBybyhhdWRpby0+YWMsICZ3bWFwcm9fY2ZnLAorCQkJCWF1ZGlvLT5hYy0+c3RyZWFtX2lkKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJjbWQgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOworCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoIkFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwgYXVkaW8tPmVuYWJsZWQpOworCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKKwkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX0dFVF9XTUFQUk9fQ09ORklHOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCisJCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9XTUFQUk9fQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX1dNQVBST19DT05GSUc6IHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGF1ZGlvLT5jb2RlY19jZmcsICh2b2lkICopYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1dNQVBST19DT05GSUdfVjIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDogeworCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKKwkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIkZhaWxlZCBpbiB1dGlsc19pb2N0bDogJWRcbiIsIHJjKTsKKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKK3N0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZzMyIHsKKwl1MTYgYXJtZGF0YXJlcXRocjsKKwl1OCAgdmFsaWRiaXRzcGVyc2FtcGxlOworCXU4ICBudW1jaGFubmVsczsKKwl1MTYgZm9ybWF0dGFnOworCXUzMiBzYW1wbGluZ3JhdGU7CisJdTMyIGF2Z2J5dGVzcGVyc2Vjb25kOworCXUxNiBhc2ZwYWNrZXRsZW5ndGg7CisJdTMyIGNoYW5uZWxtYXNrOworCXUxNiBlbmNvZGVvcHQ7CisJdTE2IGFkdmFuY2VkZW5jb2Rlb3B0OworCXUzMiBhZHZhbmNlZGVuY29kZW9wdDI7Cit9OworCitlbnVtIHsKKwlBVURJT19HRVRfV01BUFJPX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZzMyKSwKKwlBVURJT19TRVRfV01BUFJPX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZzMyKQorfTsKKworc3RhdGljIGxvbmcgYXVkaW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fR0VUX1dNQVBST19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnICp3bWFwcm9fY29uZmlnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMiB3bWFwcm9fY29uZmlnXzMyOworCisJCW1lbXNldCgmd21hcHJvX2NvbmZpZ18zMiwgMCwgc2l6ZW9mKHdtYXByb19jb25maWdfMzIpKTsKKworCQl3bWFwcm9fY29uZmlnID0KKwkJCShzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOworCQl3bWFwcm9fY29uZmlnXzMyLmFybWRhdGFyZXF0aHIgPSB3bWFwcm9fY29uZmlnLT5hcm1kYXRhcmVxdGhyOworCQl3bWFwcm9fY29uZmlnXzMyLnZhbGlkYml0c3BlcnNhbXBsZSA9CisJCQkJCXdtYXByb19jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZTsKKwkJd21hcHJvX2NvbmZpZ18zMi5udW1jaGFubmVscyA9IHdtYXByb19jb25maWctPm51bWNoYW5uZWxzOworCQl3bWFwcm9fY29uZmlnXzMyLmZvcm1hdHRhZyA9IHdtYXByb19jb25maWctPmZvcm1hdHRhZzsKKwkJd21hcHJvX2NvbmZpZ18zMi5zYW1wbGluZ3JhdGUgPSB3bWFwcm9fY29uZmlnLT5zYW1wbGluZ3JhdGU7CisJCXdtYXByb19jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQgPQorCQkJCQl3bWFwcm9fY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKKwkJd21hcHJvX2NvbmZpZ18zMi5hc2ZwYWNrZXRsZW5ndGggPQorCQkJCQl3bWFwcm9fY29uZmlnLT5hc2ZwYWNrZXRsZW5ndGg7CisJCXdtYXByb19jb25maWdfMzIuY2hhbm5lbG1hc2sgPSB3bWFwcm9fY29uZmlnLT5jaGFubmVsbWFzazsKKwkJd21hcHJvX2NvbmZpZ18zMi5lbmNvZGVvcHQgPSB3bWFwcm9fY29uZmlnLT5lbmNvZGVvcHQ7CisJCXdtYXByb19jb25maWdfMzIuYWR2YW5jZWRlbmNvZGVvcHQgPQorCQkJCQl3bWFwcm9fY29uZmlnLT5hZHZhbmNlZGVuY29kZW9wdDsKKwkJd21hcHJvX2NvbmZpZ18zMi5hZHZhbmNlZGVuY29kZW9wdDIgPQorCQkJCQl3bWFwcm9fY29uZmlnLT5hZHZhbmNlZGVuY29kZW9wdDI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJndtYXByb19jb25maWdfMzIsCisJCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1dNQVBST19DT05GSUdfVjJfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfV01BUFJPX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcgKndtYXByb19jb25maWc7CisJCXN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZzMyIHdtYXByb19jb25maWdfMzI7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3bWFwcm9fY29uZmlnXzMyLCAodm9pZCAqKWFyZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMikpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1dNQVBST19DT05GR19WMl8zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJd21hcHJvX2NvbmZpZyA9CisJCQkoc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKKwkJd21hcHJvX2NvbmZpZy0+YXJtZGF0YXJlcXRociA9IHdtYXByb19jb25maWdfMzIuYXJtZGF0YXJlcXRocjsKKwkJd21hcHJvX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlID0KKwkJCQkJd21hcHJvX2NvbmZpZ18zMi52YWxpZGJpdHNwZXJzYW1wbGU7CisJCXdtYXByb19jb25maWctPm51bWNoYW5uZWxzID0gd21hcHJvX2NvbmZpZ18zMi5udW1jaGFubmVsczsKKwkJd21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnID0gd21hcHJvX2NvbmZpZ18zMi5mb3JtYXR0YWc7CisJCXdtYXByb19jb25maWctPnNhbXBsaW5ncmF0ZSA9IHdtYXByb19jb25maWdfMzIuc2FtcGxpbmdyYXRlOworCQl3bWFwcm9fY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZCA9CisJCQkJCXdtYXByb19jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQ7CisJCXdtYXByb19jb25maWctPmFzZnBhY2tldGxlbmd0aCA9CisJCQkJCXdtYXByb19jb25maWdfMzIuYXNmcGFja2V0bGVuZ3RoOworCQl3bWFwcm9fY29uZmlnLT5jaGFubmVsbWFzayA9IHdtYXByb19jb25maWdfMzIuY2hhbm5lbG1hc2s7CisJCXdtYXByb19jb25maWctPmVuY29kZW9wdCA9IHdtYXByb19jb25maWdfMzIuZW5jb2Rlb3B0OworCQl3bWFwcm9fY29uZmlnLT5hZHZhbmNlZGVuY29kZW9wdCA9CisJCQkJCXdtYXByb19jb25maWdfMzIuYWR2YW5jZWRlbmNvZGVvcHQ7CisJCXdtYXByb19jb25maWctPmFkdmFuY2VkZW5jb2Rlb3B0MiA9CisJCQkJCXdtYXByb19jb25maWdfMzIuYWR2YW5jZWRlbmNvZGVvcHQyOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TVEFSVDogeworCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiRmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwgcmMpOworCQlicmVhazsKKwl9CisJfQorCXJldHVybiByYzsKK30KKyNlbHNlCisjZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOworCWludCByYyA9IDA7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLworCWNoYXIgbmFtZVtzaXplb2YgIm1zbV93bWFwcm9fIiArIDVdOworI2VuZGlmCisJYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47CisJYXVkaW8tPm1pc2NkZXZpY2UgPSAmYXVkaW9fd21hcHJvX21pc2M7CisJYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7CisJYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb193bWFwcm9fd3NfbWdyOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAorCQkJCQkgICAgICh2b2lkICopYXVkaW8pOworCisJaWYgKCFhdWRpby0+YWMpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOworCQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCQkgICBGT1JNQVRfV01BX1YxMFBSTyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJLyogb3BlbiBXTUEgZGVjb2RlciwgZXhwZWN0ZWQgZnJhbWVzIGlzIGFsd2F5cyAxKi8KKwkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKKwl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX1dNQV9WMTBQUk8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV93bWFwcm9fJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCisJCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAorCQkJCQkgICAgJmF1ZGlvX3dtYXByb19kZWJ1Z19mb3BzKTsKKworCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCisJCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7CisjZW5kaWYKKwlwcl9pbmZvKCIlczp3bWFwcm8gZGVjb2RlciBvcGVuIHN1Y2Nlc3MsIHNlc3Npb25faWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gcmM7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7CisJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fd21hcHJvX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhdWRpb19vcGVuLAorCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCisJLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAorCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb193bWFwcm9fbWlzYyA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNtX3dtYXBybyIsCisJLmZvcHMgPSAmYXVkaW9fd21hcHJvX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb193bWFwcm9faW5pdCh2b2lkKQoreworCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb193bWFwcm9fbWlzYyk7CisKKwlpZiAocmV0ID09IDApCisJCWRldmljZV9pbml0X3dha2V1cChhdWRpb193bWFwcm9fbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7CisJYXVkaW9fd21hcHJvX3dzX21nci5yZWZfY250ID0gMDsKKwltdXRleF9pbml0KCZhdWRpb193bWFwcm9fd3NfbWdyLndzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworZGV2aWNlX2luaXRjYWxsKGF1ZGlvX3dtYXByb19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZXZyY19pbi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9ldnJjX2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwMjcxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZXZyY19pbi5jCkBAIC0wLDAgKzEsNDEwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fcWNwLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzLmgiCisKKy8qIEJ1ZmZlciB3aXRoIG1ldGEqLworI2RlZmluZSBQQ01fQlVGX1NJWkUJCSg0MDk2ICsgc2l6ZW9mKHN0cnVjdCBtZXRhX2luKSkKKworLyogTWF4aW11bSAxMCBmcmFtZXMgaW4gYnVmZmVyIHdpdGggbWV0YSAqLworI2RlZmluZSBGUkFNRV9TSVpFCQkoMSArICgoMjMrc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKKworc3RhdGljIGxvbmcgZXZyY19pbl9pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBjbnQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnICplbmNfY2ZnOworCisJCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGRlZmF1bHQgYnVmIGFsbG9jWyVkXVxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2FsbG9jKTsKKwkJaWYgKGF1ZGlvLT5lbmFibGVkID09IDEpIHsKKwkJCXByX2luZm8oIiVzOkFVRElPX1NUQVJUIGFscmVhZHkgb3ZlclxuIiwgX19mdW5jX18pOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhdWRpb19pbl9idWZfYWxsb2MoYXVkaW8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmF0ZV9tb2R1bGF0aW9uX2NtZCBzZXQgdG8gemVybworCQkgKiBjdXJyZW50bHkgbm90IGNvbmZpZ3VyYWJsZSBmcm9tIHVzZXIgc3BhY2UKKwkJICovCisJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfZXZyYyhhdWRpby0+YWMsCisJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiwKKwkJCWVuY19jZmctPm1pbl9iaXRfcmF0ZSwKKwkJCWVuY19jZmctPm1heF9iaXRfcmF0ZSwgMCk7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgZXZyYyBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYXVkaW8tPmFjLAorCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RBUlQgZW5hYmxlWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7CisJCXJjID0gYXVkaW9faW5fZW5hYmxlKGF1ZGlvKTsKKwkJaWYgKCFyYykgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCisJCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLworCQlyYyA9IDA7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TVE9QOiB7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVE9QXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlyYyA9IGF1ZGlvX2luX2Rpc2FibGUoYXVkaW8pOworCQlpZiAocmMgIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdG9wIHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyAqY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKworCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJCWNmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyAqKWFyZzsKKwkJaWYgKGNmZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyIGZvciAlc1xuIiwKKwkJCQkJX19mdW5jX18sICJBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY2ZnLT5taW5fYml0X3JhdGUgPiA0IHx8CisJCQkgY2ZnLT5taW5fYml0X3JhdGUgPCAxIHx8CisJCQkgKGNmZy0+bWluX2JpdF9yYXRlID09IDIpKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGludmFsaWQgbWluIGJpdHJhdGVcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNmZy0+bWF4X2JpdF9yYXRlID4gNCB8fAorCQkJIGNmZy0+bWF4X2JpdF9yYXRlIDwgMSB8fAorCQkJIChjZmctPm1heF9iaXRfcmF0ZSA9PSAyKSkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBpbnZhbGlkIG1heCBiaXRyYXRlXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZW5jX2NmZy0+bWluX2JpdF9yYXRlID0gY2ZnLT5taW5fYml0X3JhdGU7CisJCWVuY19jZmctPm1heF9iaXRfcmF0ZSA9IGNmZy0+bWF4X2JpdF9yYXRlOworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogbWluX2JpdF9yYXRlPSAweCV4IG1heF9iaXRfcmF0ZT0weCV4XG4iLAorCQkJX19mdW5jX18sCisJCQlhdWRpby0+YWMtPnNlc3Npb24sIGVuY19jZmctPm1pbl9iaXRfcmF0ZSwKKwkJCWVuY19jZmctPm1heF9iaXRfcmF0ZSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBldnJjX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBldnJjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRVZSQ19FTkNfQ09ORklHIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gZXZyY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHIGZhaWxlZC4gcmM9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWczMiB7CisJdTMyIGNkbWFfcmF0ZTsKKwl1MzIgbWluX2JpdF9yYXRlOworCXUzMiBtYXhfYml0X3JhdGU7Cit9OworCitlbnVtIHsKKwlBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHXzMyID0gIF9JT1coQVVESU9fSU9DVExfTUFHSUMsCisJCTIsIHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnMzIpLAorCUFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUdfMzIgPSAgX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkJMywgc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWczMikKK307CisKK3N0YXRpYyBsb25nIGV2cmNfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBldnJjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWczMiBjZmdfMzI7CisJCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnICplbmNfY2ZnOworCisJCW1lbXNldCgmY2ZnXzMyLCAwLCBzaXplb2YoY2ZnXzMyKSk7CisKKwkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOworCQljZmdfMzIuY2RtYV9yYXRlID0gZW5jX2NmZy0+Y2RtYV9yYXRlOworCQljZmdfMzIubWluX2JpdF9yYXRlID0gZW5jX2NmZy0+bWluX2JpdF9yYXRlOworCQljZmdfMzIubWF4X2JpdF9yYXRlID0gZW5jX2NmZy0+bWF4X2JpdF9yYXRlOworCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsCisJCQlzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0VWUkNfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZzMyIGNmZ18zMjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKikgYXJnLAorCQkJCXNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNmZy5jZG1hX3JhdGUgPSBjZmdfMzIuY2RtYV9yYXRlOworCQljZmcubWluX2JpdF9yYXRlID0gY2ZnXzMyLm1pbl9iaXRfcmF0ZTsKKwkJY2ZnLm1heF9iaXRfcmF0ZSA9IGNmZ18zMi5tYXhfYml0X3JhdGU7CisJCWNtZCA9IEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUc7CisJCXJjID0gZXZyY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHIGZhaWxlZC4gcmM9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgZXZyY19pbl9jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgZXZyY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICphdWRpbyA9IE5VTEw7CisJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgKmVuY19jZmc7CisJaW50IHJjID0gMDsKKworCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jb2RlciBjb25maWcgcGFyYW0gKi8KKwlhdWRpby0+ZW5jX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYXVkaW8tPmVuY19jZmcgPT0gTlVMTCkgeworCQlrZnJlZShhdWRpbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7CisJbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7CisKKwkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAorCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKKwkgKi8KKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7CisJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOworCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDIzOworCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSAxMDsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZfU0laRTsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOworCWVuY19jZmctPm1pbl9iaXRfcmF0ZSA9IDQ7CisJZW5jX2NmZy0+bWF4X2JpdF9yYXRlID0gNDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDgwMDA7CisJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYilxNmFzbV9pbl9jYiwKKwkJCQkodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBvcGVuIGV2cmMgZW5jb2RlciBpbiBUL05UIG1vZGUgKi8KKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9FVlJDLAorCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IE5UIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywgRk9STUFUX0VWUkMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCS8qIHJlZ2lzdGVyIGZvciB0eCBvdmVyZmxvdyAodmFsaWQgZm9yIHR1bm5lbCBtb2RlIG9ubHkpICovCisJCXJjID0gcTZhc21fcmVnX3R4X292ZXJmbG93KGF1ZGlvLT5hYywgMHgwMSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVFggT3ZlcmZsb3cgcmVnaXN0cmF0aW9uIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBUIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlhdWRpby0+b3BlbmVkID0gMTsKKwlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOworCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOworCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gZXZyY19pbl9jb21wYXRfaW9jdGw7CisJYXVkaW8tPmVuY19pb2N0bCA9IGV2cmNfaW5faW9jdGw7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87CisKKwlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZXZyY19pbl9vcGVuLAorCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKKwkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAorCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pbl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsICAgPSBhdWRpb19pbl9jb21wYXRfaW9jdGwKK307CisKK3N0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2V2cmNfaW5fbWlzYyA9IHsKKwkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJPSAibXNtX2V2cmNfaW4iLAorCS5mb3BzCT0gJmF1ZGlvX2luX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBldnJjX2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fZXZyY19pbl9taXNjKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGV2cmNfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFhbGF3X2luLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFhbGF3X2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4YzBhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZzcxMWFsYXdfaW4uYwpAQCAtMCwwICsxLDM4MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2c3MTEuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKKworLyogQnVmZmVyIHdpdGggbWV0YSovCisjZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQorCisvKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCisjZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgzMjArc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKK3N0YXRpYyBsb25nIGc3MTFfaW5faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgY250ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKworCQllbmNfY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICopYXVkaW8tPmVuY19jZmc7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBkZWZhdWx0IGJ1ZiBhbGxvY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7CisJCWlmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGUgJWQiLCBfX2Z1bmNfXywgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOworCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX2c3MTEoYXVkaW8tPmFjLAorCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYsCisJCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgZzcxMSBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKGF1ZGlvLT5hYywKKwkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKKwkJcmMgPSBhdWRpb19pbl9lbmFibGUoYXVkaW8pOworCQlpZiAoIXJjKSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlhdWRpby0+ZW5hYmxlZCA9IDA7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKKwkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCisJCXJjID0gMDsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUT1BcbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7CisJCWlmIChyYyAgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAorCQkJCQlyYyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICpjZmc7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOworCisJCWVuY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKKworCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhcmc7CisJCWlmIChjZmcgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNmZy0+c2FtcGxlX3JhdGUgIT0gODAwMCAmJgorCQkJIGNmZy0+c2FtcGxlX3JhdGUgIT0gMTYwMDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBzYW1wbGUgcmF0ZVxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IGNmZy0+c2FtcGxlX3JhdGU7CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBzYW1wbGVfcmF0ZT0gMHgleCIsCisJCQlfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyBnNzExX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUc6IHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpKSkgeworCQkJcHJfZXJyKAorCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfZzcxMV9FTkNfQ09ORklHIGZhaWxlZCIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsCisJCQkJc2l6ZW9mKGNmZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJRyBmYWlsZWQiLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gZzcxMV9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczpBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIHsKKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKK307CisKK2VudW0geworCUFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyKSwKKwlBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMikKK307CisKK3N0YXRpYyBsb25nIGc3MTFfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMiBjZmdfMzI7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgKmVuY19jZmc7CisKKwkJZW5jX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyICopYXVkaW8tPmVuY19jZmc7CisJCWNmZ18zMi5zYW1wbGVfcmF0ZSA9IGVuY19jZmctPnNhbXBsZV9yYXRlOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLAorCQkJc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHXzMyOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgY2ZnXzMyOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIGNmZzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKikgYXJnLAorCQkJCXNpemVvZihjZmdfMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNmZy5zYW1wbGVfcmF0ZSA9IGNmZ18zMi5zYW1wbGVfcmF0ZTsKKwkJY21kID0gQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJRzsKKwkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9HNzExX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiByYzsKK30KKyNlbHNlCisjZGVmaW5lIGc3MTFfaW5fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGc3MTFfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOworCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOworCWludCByYyA9IDA7CisKKwlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2luKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYXVkaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLworCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChhdWRpby0+ZW5jX2NmZyA9PSBOVUxMKSB7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKKworCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKKwltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKKwltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOworCisJLyoKKwkgKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAorCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKKwkgKi8KKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7CisJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOworCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDMyMDsKKwlhdWRpby0+bWF4X2ZyYW1lc19wZXJfYnVmID0gMTA7CisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGX1NJWkU7CisJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKKwllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IDE7CisJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSA4MDAwOworCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOworCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKKwlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOworCisJYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpcTZhc21faW5fY2IsCisJCQkJKHZvaWQgKilhdWRpbyk7CisKKwlpZiAoIWF1ZGlvLT5hYykgeworCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJCWtmcmVlKGF1ZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogb3BlbiBnNzExIGVuY29kZXIgaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9BTEFXX0ZTLAorCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCisJCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOworCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsIEZPUk1BVF9HNzExX0FMQVdfRlMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KKwkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlhdWRpby0+b3BlbmVkID0gMTsKKwlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOworCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOworCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gZzcxMV9pbl9jb21wYXRfaW9jdGw7CisJYXVkaW8tPmVuY19pb2N0bCA9IGc3MTFfaW5faW9jdGw7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87CisKKwlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKKwlrZnJlZShhdWRpby0+ZW5jX2NmZyk7CisJa2ZyZWUoYXVkaW8pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZzcxMV9pbl9vcGVuLAorCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKKwkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAorCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pbl9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gYXVkaW9faW5fY29tcGF0X2lvY3RsLAorI2VuZGlmCit9OworCitzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19nNzExYWxhd19pbl9taXNjID0geworCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQk9ICJtc21fZzcxMWFsYXdfaW4iLAorCS5mb3BzCT0gJmF1ZGlvX2luX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnNzExYWxhd19pbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2c3MTFhbGF3X2luX21pc2MpOworfQorCitkZXZpY2VfaW5pdGNhbGwoZzcxMWFsYXdfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFtbGF3X2luLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFtbGF3X2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyYzQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZzcxMW1sYXdfaW4uYwpAQCAtMCwwICsxLDM4NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2c3MTEuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKKworI2lmZGVmIENPTkZJR19DT01QQVQKKyN1bmRlZiBQUk9DX0FERAorI2VuZGlmCisvKiBCdWZmZXIgd2l0aCBtZXRhKi8KKyNkZWZpbmUgUENNX0JVRl9TSVpFCQkoNDA5NiArIHNpemVvZihzdHJ1Y3QgbWV0YV9pbikpCisKKy8qIE1heGltdW0gMTAgZnJhbWVzIGluIGJ1ZmZlciB3aXRoIG1ldGEgKi8KKyNkZWZpbmUgRlJBTUVfU0laRQkJKDEgKyAoKDMyMCtzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpICogMTApKQorc3RhdGljIGxvbmcgZzcxMV9pbl9pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBjbnQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOworCisJCWVuY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGRlZmF1bHQgYnVmIGFsbG9jWyVkXVxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2FsbG9jKTsKKwkJaWYgKGF1ZGlvLT5lbmFibGVkID09IDEpIHsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gYXVkaW9faW5fYnVmX2FsbG9jKGF1ZGlvKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZSAlZCIsIF9fZnVuY19fLCBlbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7CisJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfZzcxMShhdWRpby0+YWMsCisJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiwKKwkJCWVuY19jZmctPnNhbXBsZV9yYXRlKTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBnNzExIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7CisJCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYXVkaW8tPmFjLAorCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOworCisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIGVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOworCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKGNudCsrIDwgYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KQorCQkJcTZhc21fcmVhZChhdWRpby0+YWMpOyAvKiBQdXNoIGJ1ZmZlciB0byBEU1AgKi8KKwkJcmMgPSAwOworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU1RPUDogeworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RPUFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJcmMgPSBhdWRpb19pbl9kaXNhYmxlKGF1ZGlvKTsKKwkJaWYgKHJjICA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RvcCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJCXJjKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUc6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKmNmZzsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKmVuY19jZmc7CisKKwkJZW5jX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyAqKWF1ZGlvLT5lbmNfY2ZnOworCisJCWNmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyAqKWFyZzsKKwkJaWYgKGNmZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY2ZnLT5zYW1wbGVfcmF0ZSAhPSA4MDAwICYmCisJCQkgY2ZnLT5zYW1wbGVfcmF0ZSAhPSAxNjAwMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBpbnZhbGlkIHNhbXBsZSByYXRlXG4iLAorCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWVuY19jZmctPnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHNhbXBsZV9yYXRlPSAweCV4IiwKKwkJCV9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBlbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBsb25nIGc3MTFfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOgorCWNhc2UgQVVESU9fU1RPUDogeworCQlyYyA9IGc3MTFfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJRzogeworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+ZW5jX2NmZywKKwkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9nNzExX0VOQ19DT05GSUcgZmFpbGVkIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJRzogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigKKwkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHIGZhaWxlZCIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX0dFVF9HNzExX0VOQ19DT05GSUcgZmFpbGVkLiBSYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgeworCXVpbnQzMl90IHNhbXBsZV9yYXRlOworfTsKKworZW51bSB7CisJQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIpLAorCUFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyKQorfTsKKworc3RhdGljIGxvbmcgZzcxMV9pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOgorCWNhc2UgQVVESU9fU1RPUDogeworCQlyYyA9IGc3MTFfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIGNmZ18zMjsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMiAqZW5jX2NmZzsKKworCQllbmNfY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgKilhdWRpby0+ZW5jX2NmZzsKKwkJY2ZnXzMyLnNhbXBsZV9yYXRlID0gZW5jX2NmZy0+c2FtcGxlX3JhdGU7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsCisJCQlzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMiBjZmdfMzI7CisJCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKSBhcmcsCisJCQkJc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY2ZnLnNhbXBsZV9yYXRlID0gY2ZnXzMyLnNhbXBsZV9yYXRlOworCQljbWQgPSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHOworCQlyYyA9IGc3MTFfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmNmZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJRyBmYWlsZWQuIHJjPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FTk9JT0NUTENNRDsKKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgZzcxMV9pbl9jb21wYXRfaW9jdGwgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgZzcxMV9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICphdWRpbyA9IE5VTEw7CisJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKmVuY19jZmc7CisJaW50IHJjID0gMDsKKworCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGVuY29kZXIgY29uZmlnIHBhcmFtICovCisJYXVkaW8tPmVuY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGF1ZGlvLT5lbmNfY2ZnID09IE5VTEwpIHsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOworCisJbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7CisKKwkvKgorCSAqIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCisJICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZworCSAqLworCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07CisJYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMzIwOworCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSAxMDsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZfU0laRTsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOworCWVuY19jZmctPnNhbXBsZV9yYXRlID0gODAwMDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDgwMDA7CisJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYilxNmFzbV9pbl9jYiwKKwkJCQkodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBvcGVuIGc3MTEgZW5jb2RlciBpbiBUL05UIG1vZGUgKi8KKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOworCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9HNzExX01MQVdfRlMsCisJCQkJCUZPUk1BVF9MSU5FQVJfUENNKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywgRk9STUFUX0c3MTFfTUxBV19GUyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQkvKiByZWdpc3RlciBmb3IgdHggb3ZlcmZsb3cgKHZhbGlkIGZvciB0dW5uZWwgbW9kZSBvbmx5KSAqLworCQlyYyA9IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhhdWRpby0+YWMsIDB4MDEpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFRYIE92ZXJmbG93IHJlZ2lzdHJhdGlvbiBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBmYWlsOworCX0KKworCWF1ZGlvLT5vcGVuZWQgPSAxOworCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOworCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7CisJYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7CisJYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBnNzExX2luX2NvbXBhdF9pb2N0bDsKKwlhdWRpby0+ZW5jX2lvY3RsID0gZzcxMV9pbl9pb2N0bDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKKworCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCXJldHVybiAwOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19pbl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBnNzExX2luX29wZW4sCisJLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAorCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCisJLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2luX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsICAgPSBhdWRpb19pbl9jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2c3MTFtbGF3X2luX21pc2MgPSB7CisJLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lCT0gIm1zbV9nNzExbWxhd19pbiIsCisJLmZvcHMJPSAmYXVkaW9faW5fZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGc3MTFtbGF3X2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fZzcxMW1sYXdfaW5fbWlzYyk7Cit9CisKK2RldmljZV9pbml0Y2FsbChnNzExbWxhd19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcTZhdWRpb19jb21tb24uaCBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcTZhdWRpb19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWI4OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xNmF1ZGlvX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKworLyogRm9yIERlY29kZXJzICovCisjaWZuZGVmIF9fUTZfQVVESU9fQ09NTU9OX0hfXworI2RlZmluZSBfX1E2X0FVRElPX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+CisKKwordm9pZCBxNl9hdWRpb19jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAorCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7CisKK3ZvaWQgYXVkaW9fYWlvX2NiKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCQl1aW50MzJfdCAqcGF5bG9hZCwgIHZvaWQgKmF1ZGlvKTsKKworCisvKiBGb3IgRW5jb2RlcnMgKi8KK3ZvaWQgcTZhc21faW5fY2IodWludDMyX3Qgb3Bjb2RlLCB1aW50MzJfdCB0b2tlbiwKKwkJdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpOworCit2b2lkICBhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyh2b2lkICphdWRpbywKKwkJdWludDMyX3QgdG9rZW4sCXVpbnQzMl90ICpwYXlsb2FkKTsKKworI2VuZGlmIC8qX19RNl9BVURJT19DT01NT05fSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcTZhdWRpb192Mi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xNmF1ZGlvX3YyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNTE2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcTZhdWRpb192Mi5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKKwordm9pZCBxNmFzbV9pbl9jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAorCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IHE2YXVkaW9faW4gKilwcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgb3Bjb2RlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOgorCQlhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbywgdG9rZW4sIHBheWxvYWQpOworCQlicmVhazsKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6CisJCWF0b21pY19pbmMoJmF1ZGlvLT5pbl9jb3VudCk7CisJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1M6CisJCWF1ZGlvLT5lb3NfcnNwID0gMTsKKwkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7CisJCWJyZWFrOworCWNhc2UgQVNNX1NUUkVBTV9DTURSU1BfR0VUX1BQX1BBUkFNU19WMjoKKwkJYnJlYWs7CisJY2FzZSBBU01fU0VTU0lPTl9FVkVOVFhfT1ZFUkZMT1c6CisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQVNNX1NFU1NJT05fRVZFTlRfVFhfT1ZFUkZMT1dcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNFVF9FVkVOVFM6CisJCXByX2RlYnVnKCIlczpyZWNlaXZlZCBSRVNFVCBFVkVOVFNcbiIsIF9fZnVuY19fKTsKKwkJYXVkaW8tPmVuYWJsZWQgPSAwOworCQlhdWRpby0+c3RvcHBlZCA9IDE7CisJCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7CisJCWF1ZGlvLT5yZXNldF9ldmVudCA9IHRydWU7CisJCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOworCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBJZ25vcmUgb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworfQorCit2b2lkICBhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyh2b2lkICpwcml2LAorCXVpbnQzMl90IHRva2VuLAl1aW50MzJfdCAqcGF5bG9hZCkKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IHE2YXVkaW9faW4gKilwcml2OworCXVpbnQzMl90IGluZGV4OworCisJaW5kZXggPSBxNmFzbV9nZXRfYnVmX2luZGV4X2Zyb21fdG9rZW4odG9rZW4pOworCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBpbmRleD0lZCBuciBmcmFtZXM9JWQgb2Zmc2V0WyVkXVxuIiwKKwkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHRva2VuLCBwYXlsb2FkWzldLAorCQkJcGF5bG9hZFs1XSk7CisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHRpbWVtc3c9JWQgbHN3PSVkXG4iLCBfX2Z1bmNfXywKKwkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgcGF5bG9hZFs3XSwgcGF5bG9hZFs2XSk7CisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHVmbGFncz0weCU4eCB1aWQ9MHglOHhcbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBwYXlsb2FkWzhdLCBwYXlsb2FkWzEwXSk7CisJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGVuY19mcmFtZXNvdGFsX3NpemU9MHglOHhcbiIsIF9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBwYXlsb2FkWzRdKTsKKworCS8qIEVuc3VyZSB0aGUgaW5kZXggaXMgd2l0aGluIG1heCBhcnJheSBzaXplOiBGUkFNRV9OVU0gKi8KKwlpZiAoaW5kZXggPj0gRlJBTUVfTlVNKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaW5kZXggJWRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJYXVkaW8tPm91dF9mcmFtZV9pbmZvW2luZGV4XVswXSA9IHBheWxvYWRbOV07CisJYXVkaW8tPm91dF9mcmFtZV9pbmZvW2luZGV4XVsxXSA9IHBheWxvYWRbNV07CisKKwkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KKwlhdG9taWNfYWRkKHBheWxvYWRbNF0sICZhdWRpby0+aW5fYnl0ZXMpOworCWF0b21pY19hZGQocGF5bG9hZFs5XSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKKworCWlmIChhdG9taWNfcmVhZCgmYXVkaW8tPm91dF9jb3VudCkgPD0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KSB7CisJCWF0b21pY19pbmMoJmF1ZGlvLT5vdXRfY291bnQpOworCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjJfYWlvLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjJfYWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcTZhdWRpb192Ml9haW8uYwpAQCAtMCwwICsxLDIyMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgorCit2b2lkIHE2X2F1ZGlvX2NiKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCXVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSAoc3RydWN0IHE2YXVkaW9fYWlvICopcHJpdjsKKworCXByX2RlYnVnKCIlczpvcGNvZGUgPSAleCB0b2tlbiA9IDB4JXhcbiIsIF9fZnVuY19fLCBvcGNvZGUsIHRva2VuKTsKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORV9WMjoKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMjoKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1JFTkRFUkVEX0VPUzoKKwljYXNlIEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOgorCWNhc2UgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTToKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1NSX0NNX0NIQU5HRV9OT1RJRlk6CisJY2FzZSBBU01fREFUQV9FVkVOVF9FTkNfU1JfQ01fQ0hBTkdFX05PVElGWToKKwljYXNlIFJFU0VUX0VWRU5UUzoKKwkJYXVkaW9fYWlvX2NiKG9wY29kZSwgdG9rZW4sIHBheWxvYWQsIGF1ZGlvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOlVuaGFuZGxlZCBldmVudCA9IDB4JTh4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGF1ZGlvX2Fpb19jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAorCQl1aW50MzJfdCAqcGF5bG9hZCwgIHZvaWQgKnByaXYvKnN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8qLykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gKHN0cnVjdCBxNmF1ZGlvX2FpbyAqKXByaXY7CisJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZV9wYXlsb2FkOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6CisJCXByX2RlYnVnKCIlc1slcEtdOkFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkUgdG9rZW4gPSAweCV4XG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCB0b2tlbik7CisJCWF1ZGlvX2Fpb19hc3luY193cml0ZV9hY2soYXVkaW8sIHRva2VuLCBwYXlsb2FkKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6CisJCXByX2RlYnVnKCIlc1slcEtdOkFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSB0b2tlbiA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIHRva2VuKTsKKwkJYXVkaW9fYWlvX2FzeW5jX3JlYWRfYWNrKGF1ZGlvLCB0b2tlbiwgcGF5bG9hZCk7CisJCWJyZWFrOworCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgorCQkvKiBFT1MgSGFuZGxlICovCisJCXByX2RlYnVnKCIlc1slcEtdOkFTTV9EQVRBX0NNRFJTUF9FT1NcbiIsIF9fZnVuY19fLCBhdWRpbyk7CisJCWlmIChhdWRpby0+ZmVlZGJhY2spIHsgLyogTm9uLVR1bm5lbCBtb2RlICovCisJCQlhdWRpby0+ZW9zX3JzcCA9IDE7CisJCQkvKiBwcm9wYWdhdGUgaW5wdXQgRU9TIGkvcCBidWZmZXIsCisJCQkgKiBhZnRlciByZWNlaXZpbmcgRFNQIGFja25vd2xlZGdtZW50CisJCQkgKi8KKwkJCWlmIChhdWRpby0+ZW9zX2ZsYWcgJiYKKwkJCQkoYXVkaW8tPmVvc193cml0ZV9wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIpKSB7CisJCQkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sCisJCQkJCQlBVURJT19FVkVOVF9XUklURV9ET05FLAorCQkJCQkJYXVkaW8tPmVvc193cml0ZV9wYXlsb2FkKTsKKwkJCQltZW1zZXQoJmF1ZGlvLT5lb3Nfd3JpdGVfcGF5bG9hZCwgMCwKKwkJCQkJc2l6ZW9mKHVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkKSk7CisJCQkJYXVkaW8tPmVvc19mbGFnID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsgLyogVHVubmVsIG1vZGUgKi8KKwkJCWF1ZGlvLT5lb3NfcnNwID0gMTsKKwkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKKwkJCXdha2VfdXAoJmF1ZGlvLT5jbWRfd2FpdCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjoKKwljYXNlIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU06CisJCXByX2RlYnVnKCIlc1slcEtdOnBheWxvYWQwWyV4XSBwYXlsb2ExZFsleF1vcGNvZGU9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgYXVkaW8sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIG9wY29kZSk7CisJCWJyZWFrOworCWNhc2UgQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWToKKwljYXNlIEFTTV9EQVRBX0VWRU5UX0VOQ19TUl9DTV9DSEFOR0VfTk9USUZZOgorCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSwgcGF5bG9hZFswXS1zciA9ICVkLCBwYXlsb2FkWzFdLWNobCA9ICVkLCBwYXlsb2FkWzJdID0gJWQsIHBheWxvYWRbM10gPSAlZFxuIiwKKwkJCQkJIF9fZnVuY19fLCBhdWRpbywgcGF5bG9hZFswXSwKKwkJCQkJIHBheWxvYWRbMV0sIHBheWxvYWRbMl0sIHBheWxvYWRbM10pOworCisJCXByX2RlYnVnKCIlc1slcEtdOiBBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZLCBzcihwcmV2KSA9ICVkLCBjaGwocHJldikgPSAlZCwiLAorCQlfX2Z1bmNfXywgYXVkaW8sIGF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAorCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKworCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IHBheWxvYWRbMF07CisJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSBwYXlsb2FkWzFdICYgMHhGRkZGOworCQllX3BheWxvYWQuc3RyZWFtX2luZm8uY2hhbl9pbmZvID0gYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudDsKKwkJZV9wYXlsb2FkLnN0cmVhbV9pbmZvLnNhbXBsZV9yYXRlID0gYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGU7CisJCWF1ZGlvX2Fpb19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9TVFJFQU1fSU5GTywgZV9wYXlsb2FkKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNFVF9FVkVOVFM6CisJCXByX2VycigiJXM6IFJlY2VpdmVkIG9wY29kZToweCV4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKKwkJYXVkaW8tPnN0b3BwZWQgPSAxOworCQlhdWRpby0+cmVzZXRfZXZlbnQgPSB0cnVlOworCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBleHRyYWN0X21ldGFfb3V0X2luZm8oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKKwkJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGUsIGludCBkaXIpCit7CisJc3RydWN0IGRlY19tZXRhX291dCAqbWV0YV9kYXRhID0gYnVmX25vZGUtPmt2YWRkcjsKKwl1aW50MzJfdCB0ZW1wOworCisJaWYgKGRpcikgeyAvKiBpbnB1dCBidWZmZXIgLSBXcml0ZSAqLworCQlpZiAoYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSkKKwkJCW1lbWNweSgmYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLAorCQkJKGNoYXIgKilidWZfbm9kZS0+a3ZhZGRyLCBzaXplb2Yoc3RydWN0IGRlY19tZXRhX2luKSk7CisJCWVsc2UKKwkJCW1lbXNldCgmYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLAorCQkJMCwgc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9pbikpOworCQlwcl9kZWJ1ZygiJXNbJXBLXTppL3A6IG1zd190cyAlZCBsc3dfdHMgJWQgbmZsYWdzIDB4JTh4XG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLAorCQkJYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm50aW1lc3RhbXAuaGlnaHBhcnQsCisJCQlidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubnRpbWVzdGFtcC5sb3dwYXJ0LAorCQkJYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm5mbGFncyk7CisJfSBlbHNlIHsgLyogb3V0cHV0IGJ1ZmZlciAtIFJlYWQgKi8KKwkJbWVtY3B5KChjaGFyICopYnVmX25vZGUtPmt2YWRkciwKKwkJCSZidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfb3V0LAorCQkJc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpKTsKKwkJbWV0YV9kYXRhLT5tZXRhX291dF9kc3BbMF0ubmZsYWdzID0gMHgwMDAwMDAwMDsKKwkJdGVtcCA9IG1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLm1zd190czsKKwkJbWV0YV9kYXRhLT5tZXRhX291dF9kc3BbMF0ubXN3X3RzID0KKwkJCQltZXRhX2RhdGEtPm1ldGFfb3V0X2RzcFswXS5sc3dfdHM7CisJCW1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLmxzd190cyA9IHRlbXA7CisKKwkJcHJfZGVidWcoIiVzWyVwS106by9wOiBtc3dfdHMgJWQgbHN3X3RzICVkIG5mbGFncyAweCU4eCwgbnVtX2ZyYW1lcyA9ICVkXG4iLAorCQlfX2Z1bmNfXywgYXVkaW8sCisJCSgoc3RydWN0IGRlY19tZXRhX291dCAqKWJ1Zl9ub2RlLT5rdmFkZHIpLT4KKwkJCW1ldGFfb3V0X2RzcFswXS5tc3dfdHMsCisJCSgoc3RydWN0IGRlY19tZXRhX291dCAqKWJ1Zl9ub2RlLT5rdmFkZHIpLT4KKwkJCW1ldGFfb3V0X2RzcFswXS5sc3dfdHMsCisJCSgoc3RydWN0IGRlY19tZXRhX291dCAqKWJ1Zl9ub2RlLT5rdmFkZHIpLT4KKwkJCW1ldGFfb3V0X2RzcFswXS5uZmxhZ3MsCisJCSgoc3RydWN0IGRlY19tZXRhX291dCAqKWJ1Zl9ub2RlLT5rdmFkZHIpLT5udW1fb2ZfZnJhbWVzKTsKKwl9Cit9CisKKy8qIFJlYWQgYnVmZmVyIGZyb20gRFNQIC8gSGFuZGxlIEFjayBmcm9tIERTUCAqLwordm9pZCBhdWRpb19haW9fYXN5bmNfcmVhZF9hY2soc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdWludDMyX3QgdG9rZW4sCisJCQl1aW50MzJfdCAqcGF5bG9hZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIGV2ZW50X3BheWxvYWQ7CisJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqZmlsbGVkX2J1ZjsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogTm8gYWN0aXZlIGZsdXNoIGluIHByb2dyZXNzICovCisJaWYgKGF1ZGlvLT5yZmx1c2gpCisJCXJldHVybjsKKworCS8qIFN0YXRpc3RpY3Mgb2YgcmVhZCAqLworCWF0b21pY19hZGQocGF5bG9hZFs0XSwgJmF1ZGlvLT5pbl9ieXRlcyk7CisJYXRvbWljX2FkZChwYXlsb2FkWzldLCAmYXVkaW8tPmluX3NhbXBsZXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZhdWRpby0+aW5fcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworCQlwcl93YXJuKCIlcyB1bmV4cGVjdGVkIGFjayBmcm9tIGRzcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWZpbGxlZF9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+aW5fcXVldWUsCisJCQkJCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUsIGxpc3QpOworCisJcHJfZGVidWcoIiVzIHRva2VuOiAweFsleF0sIGZpbGxlZF9idWYtPnRva2VuOiAweFsleF0iLAorCQkJCSBfX2Z1bmNfXywgdG9rZW4sIGZpbGxlZF9idWYtPnRva2VuKTsKKwlpZiAodG9rZW4gPT0gKGZpbGxlZF9idWYtPnRva2VuKSkgeworCQlsaXN0X2RlbCgmZmlsbGVkX2J1Zi0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOworCQlldmVudF9wYXlsb2FkLmFpb19idWYgPSBmaWxsZWRfYnVmLT5idWY7CisJCS8qIFJlYWQgZG9uZSBCdWZmZXIgZHVlIHRvIGZsdXNoL25vcm1hbCBjb25kaXRpb24KKwkJICogYWZ0ZXIgRU9TIGV2ZW50LCBzbyBhcHBlbmQgRU9TIGJ1ZmZlcgorCQkgKi8KKwkJaWYgKGF1ZGlvLT5lb3NfcnNwID09IDB4MSkgeworCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuID0KKwkJCWluc2VydF9lb3NfYnVmKGF1ZGlvLCBmaWxsZWRfYnVmKTsKKwkJCS8qIFJlc2V0IGZsYWcgYmFjayB0byBpbmRpY2F0ZSBlb3MgaW50aW1hdGVkICovCisJCQlhdWRpby0+ZW9zX3JzcCA9IDA7CisJCX0gZWxzZSB7CisJCQlmaWxsZWRfYnVmLT5tZXRhX2luZm8ubWV0YV9vdXQubnVtX29mX2ZyYW1lcworCQkJCQkJCSA9IHBheWxvYWRbOV07CisJCQlldmVudF9wYXlsb2FkLmFpb19idWYuZGF0YV9sZW4gPSBwYXlsb2FkWzRdCisJCQkJICsgcGF5bG9hZFs1XSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfb3V0KTsKKwkJCXByX2RlYnVnKCIlc1slcEtdOm5yIG9mIGZyYW1lcyAweCU4eCBsZW49JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLAorCQkJCWZpbGxlZF9idWYtPm1ldGFfaW5mby5tZXRhX291dC5udW1fb2ZfZnJhbWVzLAorCQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbik7CisJCQlleHRyYWN0X21ldGFfb3V0X2luZm8oYXVkaW8sIGZpbGxlZF9idWYsIDApOworCQkJYXVkaW8tPmVvc19yc3AgPSAwOworCQl9CisJCXByX2RlYnVnKCIlcywgcG9zdGluZyByZWFkIGRvbmUgdG8gdGhlIGFwcCBoZXJlXG4iLCBfX2Z1bmNfXyk7CisJCWF1ZGlvX2Fpb19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9SRUFEX0RPTkUsCisJCQkJCWV2ZW50X3BheWxvYWQpOworCQlrZnJlZShmaWxsZWRfYnVmKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzWyVwS106ZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAorCQkJX19mdW5jX18sIGF1ZGlvLCBmaWxsZWRfYnVmLT50b2tlbiwgdG9rZW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3FjZWxwX2luLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3FjZWxwX2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NTIwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcWNlbHBfaW4uYwpAQCAtMCwwICsxLDQxMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3FjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlICJhdWRpb191dGlscy5oIgorCisvKiBCdWZmZXIgd2l0aCBtZXRhKi8KKyNkZWZpbmUgUENNX0JVRl9TSVpFCQkoNDA5NiArIHNpemVvZihzdHJ1Y3QgbWV0YV9pbikpCisKKy8qIE1heGltdW0gMTAgZnJhbWVzIGluIGJ1ZmZlciB3aXRoIG1ldGEgKi8KKyNkZWZpbmUgRlJBTUVfU0laRQkJKDEgKyAoKDM1K3NpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkgKiAxMCkpCisKK3N0YXRpYyBsb25nIHFjZWxwX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisJaW50IGNudCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fU1RBUlQ6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnICplbmNfY2ZnOworCisJCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGRlZmF1bHQgYnVmIGFsbG9jWyVkXVxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2FsbG9jKTsKKwkJaWYgKGF1ZGlvLT5lbmFibGVkID09IDEpIHsKKwkJCXByX2luZm8oIiVzOkFVRElPX1NUQVJUIGFscmVhZHkgb3ZlclxuIiwgX19mdW5jX18pOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBhdWRpb19pbl9idWZfYWxsb2MoYXVkaW8pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmVkdWNlZF9yYXRlX2xldmVsLCByYXRlX21vZHVsYXRpb25fY21kIHNldCB0byB6ZXJvCisJCSAqIGN1cnJlbnRseSBub3QgY29uZmlndXJhYmxlIGZyb20gdXNlciBzcGFjZQorCQkgKi8KKwkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19xY2VscChhdWRpby0+YWMsCisJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiwKKwkJCWVuY19jZmctPm1pbl9iaXRfcmF0ZSwKKwkJCWVuY19jZmctPm1heF9iaXRfcmF0ZSwgMCwgMCk7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgcWNlbHAgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgeworCQkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKGF1ZGlvLT5hYywKKwkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKKwkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKKworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIGVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOworCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7CisJCWlmICghcmMpIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1ZGlvLT5lbmFibGVkID0gMDsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKGNudCsrIDwgYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KQorCQkJcTZhc21fcmVhZChhdWRpby0+YWMpOyAvKiBQdXNoIGJ1ZmZlciB0byBEU1AgKi8KKwkJcmMgPSAwOworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU1RPUDogeworCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RPUFxuIiwgX19mdW5jX18sCisJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJcmMgPSBhdWRpb19pbl9kaXNhYmxlKGF1ZGlvKTsKKwkJaWYgKHJjICA8IDApIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RvcCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCisJCQkJCXJjKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyAqY2ZnOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgKmVuY19jZmc7CisKKwkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOworCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnICopYXJnOworCQlpZiAoY2ZnID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjZmctPm1pbl9iaXRfcmF0ZSA+IDQgfHwKKwkJCSBjZmctPm1pbl9iaXRfcmF0ZSA8IDEpIHsKKwkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBtaW4gYml0cmF0ZVxuIiwKKwkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY2ZnLT5tYXhfYml0X3JhdGUgPiA0IHx8CisJCQkgY2ZnLT5tYXhfYml0X3JhdGUgPCAxKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGludmFsaWQgbWF4IGJpdHJhdGVcbiIsCisJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZW5jX2NmZy0+Y2RtYV9yYXRlID0gY2ZnLT5jZG1hX3JhdGU7CisJCWVuY19jZmctPm1pbl9iaXRfcmF0ZSA9IGNmZy0+bWluX2JpdF9yYXRlOworCQllbmNfY2ZnLT5tYXhfYml0X3JhdGUgPSBjZmctPm1heF9iaXRfcmF0ZTsKKwkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IG1pbl9iaXRfcmF0ZT0gMHgleCBtYXhfYml0X3JhdGU9MHgleFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBlbmNfY2ZnLT5taW5fYml0X3JhdGUsCisJCQllbmNfY2ZnLT5tYXhfYml0X3JhdGUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGxvbmcgcWNlbHBfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NUQVJUOgorCWNhc2UgQVVESU9fU1RPUDogeworCQlyYyA9IHFjZWxwX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5lbmNfY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZykpKSB7CisJCQlwcl9lcnIoCisJCQkJIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHIGZhaWxlZCIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHOiB7CisJCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyBjZmc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywKKwkJCQlzaXplb2YoY2ZnKSkpIHsKKwkJCXByX2VycigKKwkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJRyBmYWlsZWQiLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gcWNlbHBfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmNmZyk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6QVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUcgZmFpbGVkLiBSYz0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWczMiB7CisJdTMyIGNkbWFfcmF0ZTsKKwl1MzIgbWluX2JpdF9yYXRlOworCXUzMiBtYXhfYml0X3JhdGU7Cit9OworCitlbnVtIHsKKwlBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCisJCTAsIHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZzMyKSwKKwlBVURJT19HRVRfUUNFTFBfRU5DX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCisJCTEsIHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZzMyKQorfTsKKworc3RhdGljIGxvbmcgcWNlbHBfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19TVEFSVDoKKwljYXNlIEFVRElPX1NUT1A6IHsKKwkJcmMgPSBxY2VscF9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJT19HRVRfUUNFTFBfRU5DX0NPTkZJR18zMjogeworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWczMiBjZmdfMzI7CisJCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyAqZW5jX2NmZzsKKworCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOworCisJCWVuY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnICopYXVkaW8tPmVuY19jZmc7CisJCWNmZ18zMi5jZG1hX3JhdGUgPSBlbmNfY2ZnLT5jZG1hX3JhdGU7CisJCWNmZ18zMi5taW5fYml0X3JhdGUgPSBlbmNfY2ZnLT5taW5fYml0X3JhdGU7CisJCWNmZ18zMi5tYXhfYml0X3JhdGUgPSBlbmNfY2ZnLT5tYXhfYml0X3JhdGU7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsCisJCQlzaXplb2YoY2ZnXzMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKK30KKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUdfMzI6IHsKKwkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnMzIgY2ZnXzMyOworCQlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgY2ZnOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKSBhcmcsCisJCQkJc2l6ZW9mKGNmZ18zMikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNmZy5jZG1hX3JhdGUgPSBjZmdfMzIuY2RtYV9yYXRlOworCQljZmcubWluX2JpdF9yYXRlID0gY2ZnXzMyLm1pbl9iaXRfcmF0ZTsKKwkJY2ZnLm1heF9iaXRfcmF0ZSA9IGNmZ18zMi5tYXhfYml0X3JhdGU7CisJCWNtZCA9IEFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHOworCQlyYyA9IHFjZWxwX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHIGZhaWxlZC4gcmM9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgcWNlbHBfaW5fY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHFjZWxwX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvID0gTlVMTDsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgKmVuY19jZmc7CisJaW50IHJjID0gMDsKKworCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKKworCWlmIChhdWRpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jb2RlciBjb25maWcgcGFyYW0gKi8KKwlhdWRpby0+ZW5jX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGF1ZGlvLT5lbmNfY2ZnID09IE5VTEwpIHsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOworCisJbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOworCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7CisKKwkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAorCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKKwkgKi8KKwlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7CisJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOworCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDM1OworCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSAxMDsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZfU0laRTsKKwlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOworCWVuY19jZmctPm1pbl9iaXRfcmF0ZSA9IDQ7CisJZW5jX2NmZy0+bWF4X2JpdF9yYXRlID0gNDsKKwlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKKwlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IDgwMDA7CisJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7CisJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOworCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7CisKKwlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYilxNmFzbV9pbl9jYiwKKwkJCQkodm9pZCAqKWF1ZGlvKTsKKworCWlmICghYXVkaW8tPmFjKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKKwkJa2ZyZWUoYXVkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBvcGVuIHFjZWxwIGVuY29kZXIgaW4gVC9OVCBtb2RlICovCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKKwkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfVjEzSywKKwkJCQkJRk9STUFUX0xJTkVBUl9QQ00pOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IE5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IE5UIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7CisJCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywgRk9STUFUX1YxM0spOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KKwkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBUIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKKwkJCQlhdWRpby0+YWMtPnNlc3Npb24pOworCQlyYyA9IC1FQUNDRVM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlhdWRpby0+b3BlbmVkID0gMTsKKwlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKKwlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOworCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOworCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gcWNlbHBfaW5fY29tcGF0X2lvY3RsOworCWF1ZGlvLT5lbmNfaW9jdGwgPSBxY2VscF9pbl9pb2N0bDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKKworCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOworCXJldHVybiAwOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOworCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKKwlrZnJlZShhdWRpbyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19pbl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBxY2VscF9pbl9vcGVuLAorCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKKwkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAorCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pbl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsICAgPSBhdWRpb19pbl9jb21wYXRfaW9jdGwKK307CisKK3N0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX3FjZWxwX2luX21pc2MgPSB7CisJLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lCT0gIm1zbV9xY2VscF9pbiIsCisJLmZvcHMJPSAmYXVkaW9faW5fZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHFjZWxwX2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fcWNlbHBfaW5fbWlzYyk7Cit9CisKK2RldmljZV9pbml0Y2FsbChxY2VscF9pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY2MTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorY2NmbGFncy15IDo9IC1JJChzcmMpLy4uCitvYmotJChDT05GSUdfTVNNX1VMVFJBU09VTkQpICs9IHVzZi5vIHVzZmNkZXYubyBxNnVzbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9xNnVzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGYzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uYwpAQCAtMCwwICsxLDE0NjcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3VzLmg+CisjaW5jbHVkZSAicTZ1c20uaCIKKworI2RlZmluZSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0wgMworCisjZGVmaW5lIE1FTV80S19PRkZTRVQgNDA5NQorI2RlZmluZSBNRU1fNEtfTUFTSyAweGZmZmZmMDAwCisKKyNkZWZpbmUgVVNNX1NFU1NJT05fTUFYIDB4MDIgLyogYURTUDpVU00gbGltaXQgKi8KKworI2RlZmluZSBSRUFERE9ORV9JRFhfU1RBVFVTICAgICAwCisKKyNkZWZpbmUgV1JJVEVET05FX0lEWF9TVEFUVVMgICAgMAorCisvKiBTdGFuZGFyZCB0aW1lb3V0IGluIHRoZSBhc3luY2hyb25vdXMgb3BzICovCisjZGVmaW5lIFE2VVNNX1RJTUVPVVRfSklGRklFUwkoMSpIWikgLyogMSBzZWMgKi8KKworc3RhdGljIERFRklORV9NVVRFWChzZXNzaW9uX2xvY2spOworCitzdGF0aWMgc3RydWN0IHVzX2NsaWVudCAqc2Vzc2lvbltVU01fU0VTU0lPTl9NQVhdOworc3RhdGljIGludDMyX3QgcTZ1c21fbW1hcGNhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOworc3RhdGljIGludDMyX3QgcTZ1c21fY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdik7CitzdGF0aWMgdm9pZCBxNnVzbV9hZGRfaGRyKHN0cnVjdCB1c19jbGllbnQgKnVzYywgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCSAgdWludDMyX3QgcGt0X3NpemUsIGJvb2wgY21kX2ZsZyk7CisKK3N0cnVjdCB1c21fbW1hcCB7CisJYXRvbWljX3QgcmVmX2NudDsKKwlhdG9taWNfdCBjbWRfc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY21kX3dhaXQ7CisJdm9pZCAqYXByOworCWludCBtZW1faGFuZGxlOworfTsKKworc3RhdGljIHN0cnVjdCB1c21fbW1hcCB0aGlzX21tYXA7CisKK3N0YXRpYyB2b2lkIHE2dXNtX2FkZF9tbWFwaGRyKHN0cnVjdCBhcHJfaGRyICpoZHIsCisJCQkgICAgICB1aW50MzJfdCBwa3Rfc2l6ZSwgYm9vbCBjbWRfZmxnLCB1MzIgdG9rZW4pCit7CisJaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCSAgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJaGRyLT5zcmNfcG9ydCA9IDA7CisJaGRyLT5kZXN0X3BvcnQgPSAwOworCWlmIChjbWRfZmxnKSB7CisJCWhkci0+dG9rZW4gPSB0b2tlbjsKKwkJYXRvbWljX3NldCgmdGhpc19tbWFwLmNtZF9zdGF0ZSwgMSk7CisJfQorCWhkci0+cGt0X3NpemUgID0gcGt0X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgcTZ1c21fbWVtb3J5X21hcChwaHlzX2FkZHJfdCBidWZfYWRkLCBpbnQgZGlyLCB1aW50MzJfdCBidWZzeiwKKwkJdWludDMyX3QgYnVmY250LCB1aW50MzJfdCBzZXNzaW9uLCB1aW50MzJfdCAqbWVtX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfbWFwX3JlZ2lvbiBtZW1fcmVnaW9uX21hcDsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcTZ1c21fYWRkX21tYXBoZHIoJm1lbV9yZWdpb25fbWFwLmhkciwKKwkJCSAgc2l6ZW9mKHN0cnVjdCB1c21fY21kX21lbW9yeV9tYXBfcmVnaW9uKSwgdHJ1ZSwKKwkJCSAgKChzZXNzaW9uIDw8IDgpIHwgZGlyKSk7CisKKwltZW1fcmVnaW9uX21hcC5oZHIub3Bjb2RlID0gVVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT047CisJbWVtX3JlZ2lvbl9tYXAubWVtcG9vbF9pZCA9IEFEU1BfTUVNT1JZX01BUF9TSE1FTThfNEtfUE9PTDsKKworCW1lbV9yZWdpb25fbWFwLm51bV9yZWdpb25zID0gMTsKKwltZW1fcmVnaW9uX21hcC5mbGFncyA9IDA7CisKKwltZW1fcmVnaW9uX21hcC5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGQpOworCW1lbV9yZWdpb25fbWFwLnNobV9hZGRyX21zdyA9CisJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkKTsKKwltZW1fcmVnaW9uX21hcC5tZW1fc2l6ZV9ieXRlcyA9IGJ1ZnN6ICogYnVmY250OworCisJcmMgPSBhcHJfc2VuZF9wa3QodGhpc19tbWFwLmFwciwgKHVpbnQzMl90ICopICZtZW1fcmVnaW9uX21hcCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtZW1fbWFwIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIG1lbV9yZWdpb25fbWFwLmhkci5vcGNvZGUsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfbW1hcC5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJnRoaXNfbW1hcC5jbWRfc3RhdGUpID09IDApLAorCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7CisJaWYgKCFyYykgeworCQlyYyA9IC1FVElNRTsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfbWFwXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJKm1lbV9oYW5kbGUgPSB0aGlzX21tYXAubWVtX2hhbmRsZTsKKwkJcmMgPSAwOworCX0KK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2dXNtX21lbW9yeV91bm1hcChwaHlzX2FkZHJfdCBidWZfYWRkLCBpbnQgZGlyLCB1aW50MzJfdCBzZXNzaW9uLAorCQkJdWludDMyX3QgbWVtX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfdW5tYXBfcmVnaW9uIG1lbV91bm1hcDsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcTZ1c21fYWRkX21tYXBoZHIoJm1lbV91bm1hcC5oZHIsCisJCQkgIHNpemVvZihzdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfdW5tYXBfcmVnaW9uKSwgdHJ1ZSwKKwkJCSAgKChzZXNzaW9uIDw8IDgpIHwgZGlyKSk7CisJbWVtX3VubWFwLmhkci5vcGNvZGUgPSBVU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OOworCW1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSA9IG1lbV9oYW5kbGU7CisKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX21tYXAuYXByLCAodWludDMyX3QgKikgJm1lbV91bm1hcCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtZW1fdW5tYXAgb3BbMHgleF0gcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIG1lbV91bm1hcC5oZHIub3Bjb2RlLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19tbWFwLmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmdGhpc19tbWFwLmNtZF9zdGF0ZSkgPT0gMCksCisJCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gLUVUSU1FOworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeV91bm1hcFxuIiwgX19mdW5jX18pOworCX0gZWxzZQorCQlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcTZ1c21fc2Vzc2lvbl9hbGxvYyhzdHJ1Y3QgdXNfY2xpZW50ICp1c2MpCit7CisJaW50IGluZCA9IDA7CisKKwltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOworCWZvciAoaW5kID0gMDsgaW5kIDwgVVNNX1NFU1NJT05fTUFYOyArK2luZCkgeworCQlpZiAoIXNlc3Npb25baW5kXSkgeworCQkJc2Vzc2lvbltpbmRdID0gdXNjOworCQkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOworCQkJKytpbmQ7IC8qIHNlc3Npb24gaWQ6IDAgcmVzZXJ2ZWQgKi8KKwkJCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF0gd2FzIGFsbG9jYXRlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBpbmQpOworCQkJcmV0dXJuIGluZDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHE2dXNtX3Nlc3Npb25fZnJlZShzdHJ1Y3QgdXNfY2xpZW50ICp1c2MpCit7CisJLyogU2Vzc2lvbiBpbmRleCB3YXMgaW5jcmVtZW50ZWQgZHVyaW5nIGFsbG9jYXRpb24gKi8KKwl1aW50MTZfdCBpbmQgPSAodWludDE2X3QpdXNjLT5zZXNzaW9uIC0gMTsKKworCXByX2RlYnVnKCIlczogdG8gZnJlZSBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGluZCk7CisJaWYgKGluZCA8IFVTTV9TRVNTSU9OX01BWCkgeworCQltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOworCQlzZXNzaW9uW2luZF0gPSBOVUxMOworCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IHE2dXNtX3VzX2NsaWVudF9idWZfZnJlZSh1bnNpZ25lZCBpbnQgZGlyLAorCQkJICAgICBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MpCit7CisJc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwKKwkgICAgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdXNjLT5jbWRfbG9jayk7CisJcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKKwlpZiAocG9ydCA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwb3J0LT5kYXRhID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBxNnVzbV9tZW1vcnlfdW5tYXAocG9ydC0+cGh5cywgZGlyLCB1c2MtPnNlc3Npb24sCisJCQkJKigodWludDMyX3QgKilwb3J0LT5leHQpKTsKKwlwcl9kZWJ1ZygiJXM6IGRhdGFbJXBLXXBoeXNbJWxseF1bJXBLXVxuIiwgX19mdW5jX18sCisJCSAodm9pZCAqKXBvcnQtPmRhdGEsICh1NjQpcG9ydC0+cGh5cywgKHZvaWQgKikmcG9ydC0+cGh5cyk7CisKKwltc21fYXVkaW9faW9uX2ZyZWUocG9ydC0+Y2xpZW50LCBwb3J0LT5oYW5kbGUpOworCisJcG9ydC0+ZGF0YSA9IE5VTEw7CisJcG9ydC0+cGh5cyA9IDA7CisJcG9ydC0+YnVmX3NpemUgPSAwOworCXBvcnQtPmJ1Zl9jbnQgPSAwOworCXBvcnQtPmNsaWVudCA9IE5VTEw7CisJcG9ydC0+aGFuZGxlID0gTlVMTDsKKworCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZ1c21fdXNfcGFyYW1fYnVmX2ZyZWUodW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCB1c19jbGllbnQgKnVzYykKK3sKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0OworCWludCByYyA9IDA7CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fAorCQkoKGRpciAhPSBJTikgJiYgKGRpciAhPSBPVVQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwlwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOworCWlmIChwb3J0ID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBvcnQtPnBhcmFtX2J1ZiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gcTZ1c21fbWVtb3J5X3VubWFwKHBvcnQtPnBhcmFtX3BoeXMsIGRpciwgdXNjLT5zZXNzaW9uLAorCQkJCSooKHVpbnQzMl90ICopcG9ydC0+cGFyYW1fYnVmX21lbV9oYW5kbGUpKTsKKwlwcl9kZWJ1ZygiJXM6IGRhdGFbJXBLXXBoeXNbJWxseF1bJXBLXVxuIiwgX19mdW5jX18sCisJCSAodm9pZCAqKXBvcnQtPnBhcmFtX2J1ZiwgKHU2NClwb3J0LT5wYXJhbV9waHlzLAorCQkgKHZvaWQgKikmcG9ydC0+cGFyYW1fcGh5cyk7CisKKwltc21fYXVkaW9faW9uX2ZyZWUocG9ydC0+cGFyYW1fY2xpZW50LCBwb3J0LT5wYXJhbV9oYW5kbGUpOworCisJcG9ydC0+cGFyYW1fYnVmID0gTlVMTDsKKwlwb3J0LT5wYXJhbV9waHlzID0gMDsKKwlwb3J0LT5wYXJhbV9idWZfc2l6ZSA9IDA7CisJcG9ydC0+cGFyYW1fY2xpZW50ID0gTlVMTDsKKwlwb3J0LT5wYXJhbV9oYW5kbGUgPSBOVUxMOworCisJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcTZ1c21fdXNfY2xpZW50X2ZyZWUoc3RydWN0IHVzX2NsaWVudCAqdXNjKQoreworCWludCBsb29wY250ID0gMDsKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0OworCXVpbnQzMl90ICpwX21lbV9oYW5kbGUgPSBOVUxMOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwKKwkgICAgISh1c2MtPnNlc3Npb24pKQorCQlyZXR1cm47CisKKwlmb3IgKGxvb3BjbnQgPSAwOyBsb29wY250IDw9IE9VVDsgKytsb29wY250KSB7CisJCXBvcnQgPSAmdXNjLT5wb3J0W2xvb3BjbnRdOworCQlpZiAocG9ydC0+ZGF0YSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXByX2RlYnVnKCIlczogbG9vcGNudCA9ICVkXG4iLCBfX2Z1bmNfXywgbG9vcGNudCk7CisJCXE2dXNtX3VzX2NsaWVudF9idWZfZnJlZShsb29wY250LCB1c2MpOworCQlxNnVzbV91c19wYXJhbV9idWZfZnJlZShsb29wY250LCB1c2MpOworCX0KKwlxNnVzbV9zZXNzaW9uX2ZyZWUodXNjKTsKKwlhcHJfZGVyZWdpc3Rlcih1c2MtPmFwcik7CisKKwlwcl9kZWJ1ZygiJXM6IEFQUiBEZS1SZWdpc3RlclxuIiwgX19mdW5jX18pOworCisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX21tYXAucmVmX2NudCkgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBBUFIgQ29tbW9uIFBvcnQgQWxyZWFkeSBDbG9zZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWF0b21pY19kZWMoJnRoaXNfbW1hcC5yZWZfY250KTsKKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfbW1hcC5yZWZfY250KSA9PSAwKSB7CisJCWFwcl9kZXJlZ2lzdGVyKHRoaXNfbW1hcC5hcHIpOworCQlwcl9kZWJ1ZygiJXM6IEFQUiBEZS1SZWdpc3RlciBjb21tb24gcG9ydFxuIiwgX19mdW5jX18pOworCX0KKworZG9uZToKKwlwX21lbV9oYW5kbGUgPSAodWludDMyX3QgKil1c2MtPnBvcnRbSU5dLmV4dDsKKwlrZnJlZShwX21lbV9oYW5kbGUpOworCWtmcmVlKHVzYyk7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworfQorCitzdHJ1Y3QgdXNfY2xpZW50ICpxNnVzbV91c19jbGllbnRfYWxsb2MoCisJdm9pZCAoKmNiKSh1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90ICosIHZvaWQgKiksCisJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgdXNfY2xpZW50ICp1c2M7CisJdWludDMyX3QgKnBfbWVtX2hhbmRsZSA9IE5VTEw7CisJaW50IG47CisJaW50IGxjbnQgPSAwOworCisJdXNjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICh1c2MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwX21lbV9oYW5kbGUgPSBremFsbG9jKHNpemVvZih1aW50MzJfdCkgKiA0LCBHRlBfS0VSTkVMKTsKKwlpZiAocF9tZW1faGFuZGxlID09IE5VTEwpIHsKKwkJa2ZyZWUodXNjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbiA9IHE2dXNtX3Nlc3Npb25fYWxsb2ModXNjKTsKKwlpZiAobiA8PSAwKQorCQlnb3RvIGZhaWxfc2Vzc2lvbjsKKwl1c2MtPnNlc3Npb24gPSBuOworCXVzYy0+Y2IgPSBjYjsKKwl1c2MtPnByaXYgPSBwcml2OworCXVzYy0+YXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIlVTTSIsCisJCQkJKGFwcl9mbilxNnVzbV9jYWxsYmFjaywKKwkJCQkoKHVzYy0+c2Vzc2lvbikgPDwgOCB8IDB4MDAwMSksCisJCQkJdXNjKTsKKworCWlmICh1c2MtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFJlZ2lzdHJhdGlvbiB3aXRoIEFQUiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIHRoZSBjb21tb24gcG9ydCB3aXRoIEFQUlxuIiwgX19mdW5jX18pOworCWlmIChhdG9taWNfcmVhZCgmdGhpc19tbWFwLnJlZl9jbnQpID09IDApIHsKKwkJdGhpc19tbWFwLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJVU00iLAorCQkJCQkgICAgIChhcHJfZm4pcTZ1c21fbW1hcGNhbGxiYWNrLAorCQkJCQkgICAgIDB4MEZGRkZGRkZGLCAmdGhpc19tbWFwKTsKKwkJaWYgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVVNNIHBvcnQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlhdG9taWNfaW5jKCZ0aGlzX21tYXAucmVmX2NudCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdXNjLT5jbWRfd2FpdCk7CisJbXV0ZXhfaW5pdCgmdXNjLT5jbWRfbG9jayk7CisJZm9yIChsY250ID0gMDsgbGNudCA8PSBPVVQ7ICsrbGNudCkgeworCQltdXRleF9pbml0KCZ1c2MtPnBvcnRbbGNudF0ubG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZ1c2MtPnBvcnRbbGNudF0uZHNwX2xvY2spOworCQl1c2MtPnBvcnRbbGNudF0uZXh0ID0gKHZvaWQgKilwX21lbV9oYW5kbGUrKzsKKwkJdXNjLT5wb3J0W2xjbnRdLnBhcmFtX2J1Zl9tZW1faGFuZGxlID0gKHZvaWQgKilwX21lbV9oYW5kbGUrKzsKKwkJcHJfZXJyKCIlczogdXNjLT5wb3J0WyVkXS5leHQ9JXBLO1xuIiwKKwkJICAgICAgIF9fZnVuY19fLCBsY250LCB1c2MtPnBvcnRbbGNudF0uZXh0KTsKKwl9CisJYXRvbWljX3NldCgmdXNjLT5jbWRfc3RhdGUsIDApOworCisJcmV0dXJuIHVzYzsKK2ZhaWw6CisJa2ZyZWUocF9tZW1faGFuZGxlKTsKKwlxNnVzbV91c19jbGllbnRfZnJlZSh1c2MpOworCXJldHVybiBOVUxMOworZmFpbF9zZXNzaW9uOgorCWtmcmVlKHBfbWVtX2hhbmRsZSk7CisJa2ZyZWUodXNjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHE2dXNtX3VzX2NsaWVudF9idWZfYWxsb2ModW5zaWduZWQgaW50IGRpciwKKwkJCSAgICAgIHN0cnVjdCB1c19jbGllbnQgKnVzYywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZzeiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBidWZjbnQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGJ1ZnN6KmJ1ZmNudDsKKwlzaXplX3QgbGVuOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwKKwkgICAgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkgfHwgKHNpemUgPT0gMCkgfHwKKwkgICAgKHVzYy0+c2Vzc2lvbiA8PSAwIHx8IHVzYy0+c2Vzc2lvbiA+IFVTTV9TRVNTSU9OX01BWCkpIHsKKwkJcHJfZXJyKCIlczogd3JvbmcgcGFyYW1ldGVyczogc2l6ZT0lZDsgYnVmY250PSVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHNpemUsIGJ1ZmNudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnVzYy0+Y21kX2xvY2spOworCisJcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKKworCS8qIFRoZSBzaXplIHRvIGFsbG9jYXRlIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA0SyBieXRlcyAqLworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ1bHRyYXNvdW5kX2NsaWVudCIsCisJCSZwb3J0LT5jbGllbnQsICZwb3J0LT5oYW5kbGUsCisJCXNpemUsICZwb3J0LT5waHlzLAorCQkmbGVuLCAmcG9ydC0+ZGF0YSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogVVMgSU9OIGFsbG9jYXRpb24gZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9ydC0+YnVmX2NudCA9IGJ1ZmNudDsKKwlwb3J0LT5idWZfc2l6ZSA9IGJ1ZnN6OworCXByX2RlYnVnKCIlczogZGF0YVslcEtdOyBwaHlzWyVsbHhdOyBbJXBLXVxuIiwgX19mdW5jX18sCisJCSAodm9pZCAqKXBvcnQtPmRhdGEsCisJCSAodTY0KXBvcnQtPnBoeXMsCisJCSAodm9pZCAqKSZwb3J0LT5waHlzKTsKKworCXJjID0gcTZ1c21fbWVtb3J5X21hcChwb3J0LT5waHlzLCBkaXIsIHNpemUsIDEsIHVzYy0+c2Vzc2lvbiwKKwkJCQkodWludDMyX3QgKilwb3J0LT5leHQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ01EIE1lbW9yeV9tYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7CisJCXE2dXNtX3VzX2NsaWVudF9idWZfZnJlZShkaXIsIHVzYyk7CisJCXE2dXNtX3VzX3BhcmFtX2J1Zl9mcmVlKGRpciwgdXNjKTsKKwl9IGVsc2UgeworCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgcTZ1c21fdXNfcGFyYW1fYnVmX2FsbG9jKHVuc2lnbmVkIGludCBkaXIsCisJCQlzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCQl1bnNpZ25lZCBpbnQgYnVmc3opCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGJ1ZnN6OworCXNpemVfdCBsZW47CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fAorCQkoKGRpciAhPSBJTikgJiYgKGRpciAhPSBPVVQpKSB8fAorCQkodXNjLT5zZXNzaW9uIDw9IDAgfHwgdXNjLT5zZXNzaW9uID4gVVNNX1NFU1NJT05fTUFYKSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBwYXJhbWV0ZXJzOiBkaXJlY3Rpb249JWQsIGJ1ZnN6PSVkXG4iLAorCQkJX19mdW5jX18sIGRpciwgYnVmc3opOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKworCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07CisKKwlpZiAoYnVmc3ogPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IGJ1ZnN6PTAsIGdldC9zZXQgcGFyYW0gY29tbWFuZHMgYXJlIGZvcmJpZGRlblxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcG9ydC0+cGFyYW1fYnVmID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFRoZSBzaXplIHRvIGFsbG9jYXRlIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA0SyBieXRlcyAqLworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ1bHRyYXNvdW5kX2NsaWVudCIsCisJCSZwb3J0LT5wYXJhbV9jbGllbnQsICZwb3J0LT5wYXJhbV9oYW5kbGUsCisJCXNpemUsICZwb3J0LT5wYXJhbV9waHlzLAorCQkmbGVuLCAmcG9ydC0+cGFyYW1fYnVmKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBVUyBJT04gYWxsb2NhdGlvbiBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwb3J0LT5wYXJhbV9idWZfc2l6ZSA9IGJ1ZnN6OworCXByX2RlYnVnKCIlczogcGFyYW1fYnVmWyVwS107IHBhcmFtX3BoeXNbJWxseF07IFslcEtdXG4iLCBfX2Z1bmNfXywKKwkJICh2b2lkICopcG9ydC0+cGFyYW1fYnVmLAorCQkgKHU2NClwb3J0LT5wYXJhbV9waHlzLAorCQkgKHZvaWQgKikmcG9ydC0+cGFyYW1fcGh5cyk7CisKKwlyYyA9IHE2dXNtX21lbW9yeV9tYXAocG9ydC0+cGFyYW1fcGh5cywgKElOIHwgT1VUKSwgc2l6ZSwgMSwKKwkJCXVzYy0+c2Vzc2lvbiwgKHVpbnQzMl90ICopcG9ydC0+cGFyYW1fYnVmX21lbV9oYW5kbGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ01EIE1lbW9yeV9tYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7CisJCXE2dXNtX3VzX2NsaWVudF9idWZfZnJlZShkaXIsIHVzYyk7CisJCXE2dXNtX3VzX3BhcmFtX2J1Zl9mcmVlKGRpciwgdXNjKTsKKwl9IGVsc2UgeworCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50MzJfdCBxNnVzbV9tbWFwY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKK3sKKwl1aW50MzJfdCB0b2tlbjsKKwl1aW50MzJfdCAqcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7CisKKwlwcl9kZWJ1ZygiJXM6IHB0cjBbMHgleF07IHB0cjFbMHgleF07IG9wY29kZVsweCV4XVxuIiwKKwkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLCBkYXRhLT5vcGNvZGUpOworCXByX2RlYnVnKCIlczogdG9rZW5bMHgleF07IHBheWxvYWRfc2l6ZVslZF07IHNyY1slZF07IGRlc3RbJWRdO1xuIiwKKwkJIF9fZnVuY19fLCBkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLAorCQkgZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7CisKKwlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7CisJCS8qIHN0YXR1cyBmaWVsZCBjaGVjayAqLworCQlpZiAocGF5bG9hZFsxXSkgeworCQkJcHJfZXJyKCIlczogd3JvbmcgcmVzcG9uc2VbJWRdIG9uIGNtZCBbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwYXlsb2FkWzFdLCBwYXlsb2FkWzBdKTsKKwkJfSBlbHNlIHsKKwkJCXRva2VuID0gZGF0YS0+dG9rZW47CisJCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKKwkJCWNhc2UgVVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTjoKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfbW1hcC5jbWRfc3RhdGUpKSB7CisJCQkJCWF0b21pY19zZXQoJnRoaXNfbW1hcC5jbWRfc3RhdGUsIDApOworCQkJCQl3YWtlX3VwKCZ0aGlzX21tYXAuY21kX3dhaXQpOworCQkJCX0KKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSBVU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTjoKKwkJCQkvKiBGb3IgTUVNX01BUCwgYWRkaXRpb25hbCBhbnN3ZXIgaXMgd2FpdGVkLCAqLworCQkJCS8qIHRoZXJmb3JlLCBubyB3YWtlLXVwIGhlcmUgKi8KKwkJCQlwcl9kZWJ1ZygiJXM6IGNtZFsweCV4XTsgcmVzdWx0WzB4JXhdXG4iLAorCQkJCQkgX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9kZWJ1ZygiJXM6IHdyb25nIGNvbW1hbmRbMHgleF1cbiIsCisJCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZGF0YS0+b3Bjb2RlID09IFVTTV9DTURSU1BfU0hBUkVEX01FTV9NQVBfUkVHSU9OKSB7CisJCQl0aGlzX21tYXAubWVtX2hhbmRsZSA9IHBheWxvYWRbMF07CisJCQlwcl9kZWJ1ZygiJXM6IG1lbW9yeSBtYXAgaGFuZGxlID0gMHgleCIsCisJCQkJX19mdW5jX18sIHBheWxvYWRbMF0pOworCQkJaWYgKGF0b21pY19yZWFkKCZ0aGlzX21tYXAuY21kX3N0YXRlKSkgeworCQkJCWF0b21pY19zZXQoJnRoaXNfbW1hcC5jbWRfc3RhdGUsIDApOworCQkJCXdha2VfdXAoJnRoaXNfbW1hcC5jbWRfd2FpdCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludDMyX3QgcTZ1c21fY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgdXNfY2xpZW50ICp1c2MgPSAoc3RydWN0IHVzX2NsaWVudCAqKXByaXY7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisJdWludDMyX3QgKnBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOworCXVpbnQzMl90IHRva2VuID0gZGF0YS0+dG9rZW47CisJdWludDMyX3Qgb3Bjb2RlID0gUTZVU01fRVZFTlRfVU5ERUY7CisKKwlpZiAodXNjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50IGluZm8gaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7CisJCS8qIHN0YXR1cyBmaWVsZCBjaGVjayAqLworCQlpZiAocGF5bG9hZFsxXSkgeworCQkJcHJfZXJyKCIlczogd3JvbmcgcmVzcG9uc2VbJWRdIG9uIGNtZCBbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwYXlsb2FkWzFdLCBwYXlsb2FkWzBdKTsKKwkJCWlmICh1c2MtPmNiKQorCQkJCXVzYy0+Y2IoZGF0YS0+b3Bjb2RlLCB0b2tlbiwKKwkJCQkJKHVpbnQzMl90ICopZGF0YS0+cGF5bG9hZCwgdXNjLT5wcml2KTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAocGF5bG9hZFswXSkgeworCQkJY2FzZSBVU01fU0VTU0lPTl9DTURfUlVOOgorCQkJY2FzZSBVU01fU1RSRUFNX0NNRF9DTE9TRToKKwkJCQlpZiAodG9rZW4gIT0gdXNjLT5zZXNzaW9uKSB7CisJCQkJCXByX2VycigiJXM6IHdyb25nIHRva2VuWyVkXSIsCisJCQkJCSAgICAgICBfX2Z1bmNfXywgdG9rZW4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIFVTTV9TVFJFQU1fQ01EX09QRU5fUkVBRDoKKwkJCWNhc2UgVVNNX1NUUkVBTV9DTURfT1BFTl9XUklURToKKwkJCWNhc2UgVVNNX1NUUkVBTV9DTURfU0VUX0VOQ19QQVJBTToKKwkJCWNhc2UgVVNNX0RBVEFfQ01EX01FRElBX0ZPUk1BVF9VUERBVEU6CisJCQljYXNlIFVTTV9TRVNTSU9OX0NNRF9TSUdOQUxfREVURUNUX01PREU6CisJCQljYXNlIFVTTV9TVFJFQU1fQ01EX1NFVF9QQVJBTToKKwkJCWNhc2UgVVNNX1NUUkVBTV9DTURfR0VUX1BBUkFNOgorCQkJCWlmIChhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpKSB7CisJCQkJCWF0b21pY19zZXQoJnVzYy0+Y21kX3N0YXRlLCAwKTsKKwkJCQkJd2FrZV91cCgmdXNjLT5jbWRfd2FpdCk7CisJCQkJfQorCQkJCWlmICh1c2MtPmNiKQorCQkJCQl1c2MtPmNiKGRhdGEtPm9wY29kZSwgdG9rZW4sCisJCQkJCQkodWludDMyX3QgKilkYXRhLT5wYXlsb2FkLAorCQkJCQkJdXNjLT5wcml2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChkYXRhLT5vcGNvZGUpIHsKKwljYXNlIFJFU0VUX0VWRU5UUzogeworCQlwcl9lcnIoIiVzOiBSZXNldCBldmVudCBpcyByZWNlaXZlZDogJWQgJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJZGF0YS0+cmVzZXRfZXZlbnQsCisJCQkJZGF0YS0+cmVzZXRfcHJvYyk7CisKKwkJb3Bjb2RlID0gUkVTRVRfRVZFTlRTOworCisJCWFwcl9yZXNldCh0aGlzX21tYXAuYXByKTsKKwkJdGhpc19tbWFwLmFwciA9IE5VTEw7CisKKwkJYXByX3Jlc2V0KHVzYy0+YXByKTsKKwkJdXNjLT5hcHIgPSBOVUxMOworCisJCWJyZWFrOworCX0KKworCisJY2FzZSBVU01fREFUQV9FVkVOVF9SRUFEX0RPTkU6IHsKKwkJc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9ICZ1c2MtPnBvcnRbT1VUXTsKKworCQlvcGNvZGUgPSBRNlVTTV9FVkVOVF9SRUFEX0RPTkU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJaWYgKHBheWxvYWRbUkVBRERPTkVfSURYX1NUQVRVU10pIHsKKwkJCXByX2VycigiJXM6IHdyb25nIFJFQURET05FWyVkXTsgdG9rZW5bJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgIHBheWxvYWRbUkVBRERPTkVfSURYX1NUQVRVU10sCisJCQkgICAgICAgdG9rZW4pOworCQkJdG9rZW4gPSBVU01fV1JPTkdfVE9LRU47CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKKwkJCQkJICAgICAgIGRzcF9mbGFncyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwb3J0LT5leHBlY3RlZF90b2tlbiAhPSB0b2tlbikgeworCQkJdTMyIGNwdV9idWYgPSBwb3J0LT5jcHVfYnVmOworCisJCQlwcl9lcnIoIiVzOiBleHBlY3RlZFslZF0gIT0gdG9rZW5bJWRdXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0LT5leHBlY3RlZF90b2tlbiwgdG9rZW4pOworCQkJcHJfZGVidWcoIiVzOiBkc3BfYnVmPSVkOyBjcHVfYnVmPSVkO1xuIiwKKwkJCQlfX2Z1bmNfXywgICBwb3J0LT5kc3BfYnVmLCBjcHVfYnVmKTsKKworCQkJdG9rZW4gPSBVU01fV1JPTkdfVE9LRU47CisJCQkvKiBUbyBwcmV2ZW50IGRhdGEgaGFuZGxlIGNvbnRpbml1ZSAqLworCQkJcG9ydC0+ZXhwZWN0ZWRfdG9rZW4gPSBVU01fV1JPTkdfVE9LRU47CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKKwkJCQkJICAgICAgIGRzcF9mbGFncyk7CisJCQlicmVhazsKKwkJfSAvKiBwb3J0LT5leHBlY3RlZF90b2tlbiAhPSBkYXRhLT50b2tlbiAqLworCisJCXBvcnQtPmV4cGVjdGVkX3Rva2VuID0gdG9rZW4gKyAxOworCQlpZiAocG9ydC0+ZXhwZWN0ZWRfdG9rZW4gPT0gcG9ydC0+YnVmX2NudCkKKwkJCXBvcnQtPmV4cGVjdGVkX3Rva2VuID0gMDsKKworCQkvKiBnYXAgc3VwcG9ydCAqLworCQlpZiAocG9ydC0+ZXhwZWN0ZWRfdG9rZW4gIT0gcG9ydC0+Y3B1X2J1ZikgeworCQkJcG9ydC0+ZHNwX2J1ZiA9IHBvcnQtPmV4cGVjdGVkX3Rva2VuOworCQkJdG9rZW4gPSBwb3J0LT5kc3BfYnVmOyAvKiBmb3IgY2FsbGJhY2sgKi8KKwkJfSBlbHNlCisJCQlwb3J0LT5kc3BfYnVmID0gdG9rZW47CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCWJyZWFrOworCX0gLyogY2FzZSBVU01fREFUQV9FVkVOVF9SRUFEX0RPTkUgKi8KKworCWNhc2UgVVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORTogeworCQlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gJnVzYy0+cG9ydFtJTl07CisKKwkJb3Bjb2RlID0gUTZVU01fRVZFTlRfV1JJVEVfRE9ORTsKKwkJaWYgKHBheWxvYWRbV1JJVEVET05FX0lEWF9TVEFUVVNdKSB7CisJCQlwcl9lcnIoIiVzOiB3cm9uZyBXUklURURPTkVfSURYX1NUQVRVU1slZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgcGF5bG9hZFtXUklURURPTkVfSURYX1NUQVRVU10pOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCXBvcnQtPmRzcF9idWYgPSB0b2tlbiArIDE7CisJCWlmIChwb3J0LT5kc3BfYnVmID09IHBvcnQtPmJ1Zl9jbnQpCisJCQlwb3J0LT5kc3BfYnVmID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwkJYnJlYWs7CisJfSAvKiBjYXNlIFVTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkUgKi8KKworCWNhc2UgVVNNX1NFU1NJT05fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQ6IHsKKwkJcHJfZGVidWcoIiVzOiBVUyBkZXRlY3QgcmVzdWx0OiByZXN1bHQ9JWQiLAorCQkJIF9fZnVuY19fLAorCQkJIHBheWxvYWRbMF0pOworCQlvcGNvZGUgPSBRNlVTTV9FVkVOVF9TSUdOQUxfREVURUNUX1JFU1VMVDsKKworCQlicmVhazsKKwl9IC8qIGNhc2UgVVNNX1NFU1NJT05fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQgKi8KKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCisJfSAvKiBzd2l0Y2ggKi8KKworCWlmICh1c2MtPmNiKQorCQl1c2MtPmNiKG9wY29kZSwgdG9rZW4sCisJCQlkYXRhLT5wYXlsb2FkLCB1c2MtPnByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IHE2dXNtX2dldF92aXJ0dWFsX2FkZHJlc3MoaW50IGRpciwKKwkJCQkgICBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bXMpCit7CisJdWludDMyX3QgcmV0ID0gMHhmZmZmZmZmZjsKKworCWlmICh2bXMgJiYgKHVzYyAhPSBOVUxMKSAmJiAoKGRpciA9PSBJTikgfHwgKGRpciA9PSBPVVQpKSkgeworCQlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOworCQlpbnQgc2l6ZSA9IFBBR0VfQUxJR04ocG9ydC0+YnVmX3NpemUgKiBwb3J0LT5idWZfY250KTsKKwkJc3RydWN0IGF1ZGlvX2J1ZmZlciBhYjsKKworCQlhYi5waHlzID0gcG9ydC0+cGh5czsKKwkJYWIuZGF0YSA9IHBvcnQtPmRhdGE7CisJCWFiLnVzZWQgPSAxOworCQlhYi5zaXplID0gc2l6ZTsKKwkJYWIuYWN0dWFsX3NpemUgPSBzaXplOworCQlhYi5oYW5kbGUgPSBwb3J0LT5oYW5kbGU7CisJCWFiLmNsaWVudCA9IHBvcnQtPmNsaWVudDsKKworCQlyZXQgPSBtc21fYXVkaW9faW9uX21tYXAoJmFiLCB2bXMpOworCisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHE2dXNtX2FkZF9oZHIoc3RydWN0IHVzX2NsaWVudCAqdXNjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJICB1aW50MzJfdCBwa3Rfc2l6ZSwgYm9vbCBjbWRfZmxnKQoreworCW11dGV4X2xvY2soJnVzYy0+Y21kX2xvY2spOworCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkgICAgICAgQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCisJCQkJICAgICAgIEFQUl9QS1RfVkVSKTsKKwloZHItPnNyY19zdmMgPSAoKHN0cnVjdCBhcHJfc3ZjICopdXNjLT5hcHIpLT5pZDsKKwloZHItPnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJaGRyLT5kZXN0X3N2YyA9IEFQUl9TVkNfVVNNOworCWhkci0+ZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJaGRyLT5zcmNfcG9ydCA9ICh1c2MtPnNlc3Npb24gPDwgOCkgfCAweDAwMDE7CisJaGRyLT5kZXN0X3BvcnQgPSAodXNjLT5zZXNzaW9uIDw8IDgpIHwgMHgwMDAxOworCWlmIChjbWRfZmxnKSB7CisJCWhkci0+dG9rZW4gPSB1c2MtPnNlc3Npb247CisJCWF0b21pY19zZXQoJnVzYy0+Y21kX3N0YXRlLCAxKTsKKwl9CisJaGRyLT5wa3Rfc2l6ZSAgPSBwa3Rfc2l6ZTsKKwltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOworfQorCitzdGF0aWMgdWludDMyX3QgcTZ1c21fZXh0MmludF9mb3JtYXQodWludDMyX3QgZXh0X2Zvcm1hdCkKK3sKKwl1aW50MzJfdCBpbnRfZm9ybWF0ID0gSU5WQUxJRF9GT1JNQVQ7CisKKwlzd2l0Y2ggKGV4dF9mb3JtYXQpIHsKKwljYXNlIEZPUk1BVF9VU1BTX0VQT1M6CisJCWludF9mb3JtYXQgPSBVU19QT0lOVF9FUE9TX0ZPUk1BVF9WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVVNSQVc6CisJCWludF9mb3JtYXQgPSBVU19SQVdfRk9STUFUX1YyOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9VU1BST1g6CisJCWludF9mb3JtYXQgPSBVU19QUk9YX0ZPUk1BVF9WNDsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVVNHRVNfU1lOQzoKKwkJaW50X2Zvcm1hdCA9IFVTX0dFU19TWU5DX0ZPUk1BVDsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVVNSQVdfU1lOQzoKKwkJaW50X2Zvcm1hdCA9IFVTX1JBV19TWU5DX0ZPUk1BVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgZXh0X2Zvcm1hdCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpbnRfZm9ybWF0OworfQorCitpbnQgcTZ1c21fb3Blbl9yZWFkKHN0cnVjdCB1c19jbGllbnQgKnVzYywKKwkJICAgIHVpbnQzMl90IGZvcm1hdCkKK3sKKwl1aW50MzJfdCBpbnRfZm9ybWF0ID0gSU5WQUxJRF9GT1JNQVQ7CisJaW50IHJjID0gMHgwMDsKKwlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkIG9wZW47CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50IG9yIGl0cyBhcHIgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIHVzYy0+c2Vzc2lvbik7CisKKwlxNnVzbV9hZGRfaGRyKHVzYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIHRydWUpOworCW9wZW4uaGRyLm9wY29kZSA9IFVTTV9TVFJFQU1fQ01EX09QRU5fUkVBRDsKKwlvcGVuLnNyY19lbmRwb2ludCA9IDA7IC8qIEFGRSAqLworCW9wZW4ucHJlX3Byb2NfdG9wID0gMDsgLyogTm8gcHJlcHJvY2Vzc2luZyByZXF1aXJlZCAqLworCisJaW50X2Zvcm1hdCA9IHE2dXNtX2V4dDJpbnRfZm9ybWF0KGZvcm1hdCk7CisJaWYgKGludF9mb3JtYXQgPT0gSU5WQUxJRF9GT1JNQVQpCisJCXJldHVybiAtRUlOVkFMOworCisJb3Blbi51TW9kZSA9IFNUUkVBTV9QUklPUklUWV9OT1JNQUw7CisJb3Blbi5mb3JtYXQgPSBpbnRfZm9ybWF0OworCisJcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBvcGVuIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKKwkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOworCWlmICghcmMpIHsKKwkJcmMgPSAtRVRJTUU7CisJCXByX2VycigiJXM6IHRpbWVvdXQsIHdhaXRlZCBmb3IgT1BFTl9SRUFEIHJjWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfSBlbHNlCisJCXJjID0gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworCitpbnQgcTZ1c21fZW5jX2NmZ19ibGsoc3RydWN0IHVzX2NsaWVudCAqdXNjLCBzdHJ1Y3QgdXNfZW5jZGVjX2NmZyAqdXNfY2ZnKQoreworCXVpbnQzMl90IGludF9mb3JtYXQgPSBJTlZBTElEX0ZPUk1BVDsKKwlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NmZ19ibGsgIGVuY19jZmdfb2JqOworCXN0cnVjdCB1c21fc3RyZWFtX2NtZF9lbmNkZWNfY2ZnX2JsayAgKmVuY19jZmcgPSAmZW5jX2NmZ19vYmo7CisJaW50IHJjID0gMDsKKwl1aW50MzJfdCB0b3RhbF9jZmdfc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NmZ19ibGspOworCXVpbnQzMl90IHJvdW5kX3BhcmFtc19zaXplID0gMDsKKwl1aW50OF90ICBpc19hbGxvY2F0ZWQgPSAwOworCisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNfY2ZnID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IHdyb25nIGlucHV0IiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbnRfZm9ybWF0ID0gcTZ1c21fZXh0MmludF9mb3JtYXQodXNfY2ZnLT5mb3JtYXRfaWQpOworCWlmIChpbnRfZm9ybWF0ID09IElOVkFMSURfRk9STUFUKSB7CisJCXByX2VycigiJXM6IHdyb25nIGlucHV0IGZvcm1hdFslZF0iLAorCQkgICAgICAgX19mdW5jX18sIHVzX2NmZy0+Zm9ybWF0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJhbnNwYXJlbnQgY29uZmlndXJhdGlvbiBkYXRhIGlzIGFmdGVyIGVuY19jZmcgKi8KKwkvKiBJbnRlZ2VyIG51bWJlciBvZiB1MzJzIGlzIHJlcXVpcmVkICovCisJcm91bmRfcGFyYW1zX3NpemUgPSAoKHVzX2NmZy0+cGFyYW1zX3NpemUgKyAzKS80KSAqIDQ7CisJaWYgKHJvdW5kX3BhcmFtc19zaXplID4gVVNNX01BWF9DRkdfREFUQV9TSVpFKSB7CisJCS8qIER5bmFtaWMgYWxsb2NhdGVkIGVuY2RlY19jZmdfYmxrIGlzIHJlcXVpcmVkICovCisJCS8qIHN0YXRpYyBwYXJ0IHVzZSAqLworCQlyb3VuZF9wYXJhbXNfc2l6ZSAtPSBVU01fTUFYX0NGR19EQVRBX1NJWkU7CisJCXRvdGFsX2NmZ19zaXplICs9IHJvdW5kX3BhcmFtc19zaXplOworCQllbmNfY2ZnID0ga3phbGxvYyh0b3RhbF9jZmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlbmNfY2ZnID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGVuY19jZmdbJWRdIGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB0b3RhbF9jZmdfc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpc19hbGxvY2F0ZWQgPSAxOworCX0gZWxzZQorCQlyb3VuZF9wYXJhbXNfc2l6ZSA9IDA7CisKKwlxNnVzbV9hZGRfaGRyKHVzYywgJmVuY19jZmctPmhkciwgdG90YWxfY2ZnX3NpemUsIHRydWUpOworCisJZW5jX2NmZy0+aGRyLm9wY29kZSA9IFVTTV9TVFJFQU1fQ01EX1NFVF9FTkNfUEFSQU07CisJZW5jX2NmZy0+cGFyYW1faWQgPSBVU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLOworCWVuY19jZmctPnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzbV9lbmNvZGVfY2ZnX2JsaykrCisJCQkJcm91bmRfcGFyYW1zX3NpemU7CisJZW5jX2NmZy0+ZW5jX2Jsay5mcmFtZXNfcGVyX2J1ZiA9IDE7CisJZW5jX2NmZy0+ZW5jX2Jsay5mb3JtYXRfaWQgPSBpbnRfZm9ybWF0OworCWVuY19jZmctPmVuY19ibGsuY2ZnX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzbV9jZmdfY29tbW9uKSsKKwkJCQkgICAgVVNNX01BWF9DRkdfREFUQV9TSVpFICsKKwkJCQkgICAgcm91bmRfcGFyYW1zX3NpemU7CisJbWVtY3B5KCYoZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uKSwgJih1c19jZmctPmNmZ19jb21tb24pLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHVzbV9jZmdfY29tbW9uKSk7CisKKwkvKiBUcmFuc3BhcmVudCBkYXRhIGNvcHkgKi8KKwltZW1jcHkoZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YSwgdXNfY2ZnLT5wYXJhbXMsCisJICAgICAgIHVzX2NmZy0+cGFyYW1zX3NpemUpOworCXByX2RlYnVnKCIlczogY2ZnX3NpemVbJWRdLCBwYXJhbXNfc2l6ZVslZF1cbiIsCisJCV9fZnVuY19fLAorCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19zaXplLAorCQl1c19jZmctPnBhcmFtc19zaXplKTsKKwlwcl9kZWJ1ZygiJXM6IHBhcmFtc1slZCwlZCwlZCwlZCwgJWQsJWQsJWQsJWRdXG4iLAorCQlfX2Z1bmNfXywKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVswXSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVsxXSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVsyXSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVszXSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVs0XSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVs1XSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVs2XSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay50cmFuc3BfZGF0YVs3XQorCSAgICAgICApOworCXByX2RlYnVnKCIlczogc3JhdGU6JWQsIGNoPSVkLCBicHM9ICVkO1xuIiwKKwkJX19mdW5jX18sIGVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5zYW1wbGVfcmF0ZSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmNoX2NmZywKKwkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmJpdHNfcGVyX3NhbXBsZSk7CisJcHJfZGVidWcoImRtYXA6WzB4JXgsMHgleCwweCV4LDB4JXgsMHgleCwweCV4LDB4JXgsMHgleF07IGRldl9pZD0weCV4XG4iLAorCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbMF0sCisJCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kYXRhX21hcFsxXSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRhdGFfbWFwWzJdLAorCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbM10sCisJCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kYXRhX21hcFs0XSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRhdGFfbWFwWzVdLAorCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbNl0sCisJCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kYXRhX21hcFs3XSwKKwkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRldl9pZCk7CisKKwlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopIGVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczpDb21hbW5kIG9wZW4gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKKwkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOworCWlmICghcmMpIHsKKwkJcmMgPSAtRVRJTUU7CisJCXByX2VycigiJXM6IHRpbWVvdXQgb3Bjb2RlWzB4JXhdXG4iLAorCQkgICAgICAgX19mdW5jX18sIGVuY19jZmctPmhkci5vcGNvZGUpOworCX0gZWxzZQorCQlyYyA9IDA7CisKK2ZhaWxfY21kOgorCWlmIChpc19hbGxvY2F0ZWQgPT0gMSkKKwkJa2ZyZWUoZW5jX2NmZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNnVzbV9kZWNfY2ZnX2JsayhzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHN0cnVjdCB1c19lbmNkZWNfY2ZnICp1c19jZmcpCit7CisKKwl1aW50MzJfdCBpbnRfZm9ybWF0ID0gSU5WQUxJRF9GT1JNQVQ7CisJc3RydWN0IHVzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X3VwZGF0ZSBkZWNfY2ZnX29iajsKKwlzdHJ1Y3QgdXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfdXBkYXRlICpkZWNfY2ZnID0gJmRlY19jZmdfb2JqOworCisJaW50IHJjID0gMDsKKwl1aW50MzJfdCB0b3RhbF9jZmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfdXBkYXRlKTsKKwl1aW50MzJfdCByb3VuZF9wYXJhbXNfc2l6ZSA9IDA7CisJdWludDhfdCAgaXNfYWxsb2NhdGVkID0gMDsKKworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzX2NmZyA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW50X2Zvcm1hdCA9IHE2dXNtX2V4dDJpbnRfZm9ybWF0KHVzX2NmZy0+Zm9ybWF0X2lkKTsKKwlpZiAoaW50X2Zvcm1hdCA9PSBJTlZBTElEX0ZPUk1BVCkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dCBmb3JtYXRbJWRdIiwKKwkJICAgICAgIF9fZnVuY19fLCB1c19jZmctPmZvcm1hdF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyYW5zcGFyZW50IGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBhZnRlciBlbmNfY2ZnICovCisJLyogSW50ZWdlciBudW1iZXIgb2YgdTMycyBpcyByZXF1aXJlZCAqLworCXJvdW5kX3BhcmFtc19zaXplID0gKCh1c19jZmctPnBhcmFtc19zaXplICsgMykvNCkgKiA0OworCWlmIChyb3VuZF9wYXJhbXNfc2l6ZSA+IFVTTV9NQVhfQ0ZHX0RBVEFfU0laRSkgeworCQkvKiBEeW5hbWljIGFsbG9jYXRlZCBlbmNkZWNfY2ZnX2JsayBpcyByZXF1aXJlZCAqLworCQkvKiBzdGF0aWMgcGFydCB1c2UgKi8KKwkJcm91bmRfcGFyYW1zX3NpemUgLT0gVVNNX01BWF9DRkdfREFUQV9TSVpFOworCQl0b3RhbF9jZmdfc2l6ZSArPSByb3VuZF9wYXJhbXNfc2l6ZTsKKwkJZGVjX2NmZyA9IGt6YWxsb2ModG90YWxfY2ZnX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZGVjX2NmZyA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOmRlY19jZmdbJWRdIGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB0b3RhbF9jZmdfc2l6ZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpc19hbGxvY2F0ZWQgPSAxOworCX0gZWxzZSB7IC8qIHN0YXRpYyB0cmFuc3BfZGF0YSBpcyBlbm91Z2ggKi8KKwkJcm91bmRfcGFyYW1zX3NpemUgPSAwOworCX0KKworCXE2dXNtX2FkZF9oZHIodXNjLCAmZGVjX2NmZy0+aGRyLCB0b3RhbF9jZmdfc2l6ZSwgdHJ1ZSk7CisKKwlkZWNfY2ZnLT5oZHIub3Bjb2RlID0gVVNNX0RBVEFfQ01EX01FRElBX0ZPUk1BVF9VUERBVEU7CisJZGVjX2NmZy0+Zm9ybWF0X2lkID0gaW50X2Zvcm1hdDsKKwlkZWNfY2ZnLT5jZmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdXNtX2NmZ19jb21tb24pICsKKwkJCSAgICBVU01fTUFYX0NGR19EQVRBX1NJWkUgKworCQkJICAgIHJvdW5kX3BhcmFtc19zaXplOworCW1lbWNweSgmKGRlY19jZmctPmNmZ19jb21tb24pLCAmKHVzX2NmZy0+Y2ZnX2NvbW1vbiksCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdXNtX2NmZ19jb21tb24pKTsKKwkvKiBUcmFuc3BhcmVudCBkYXRhIGNvcHkgKi8KKwltZW1jcHkoZGVjX2NmZy0+dHJhbnNwX2RhdGEsIHVzX2NmZy0+cGFyYW1zLCB1c19jZmctPnBhcmFtc19zaXplKTsKKwlwcl9kZWJ1ZygiJXM6IGNmZ19zaXplWyVkXSwgcGFyYW1zX3NpemVbJWRdOyBwYXJhbWJ5dGVzWyVkLCVkLCVkLCVkXVxuIiwKKwkJX19mdW5jX18sCisJCWRlY19jZmctPmNmZ19zaXplLAorCQl1c19jZmctPnBhcmFtc19zaXplLAorCQlkZWNfY2ZnLT50cmFuc3BfZGF0YVswXSwKKwkJZGVjX2NmZy0+dHJhbnNwX2RhdGFbMV0sCisJCWRlY19jZmctPnRyYW5zcF9kYXRhWzJdLAorCQlkZWNfY2ZnLT50cmFuc3BfZGF0YVszXQorCSAgICAgICApOworCisJcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSBkZWNfY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6Q29tYW1uZCBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZ1c2MtPmNtZF9zdGF0ZSkgPT0gMCksCisJCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gLUVUSU1FOworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBkZWNfY2ZnLT5oZHIub3Bjb2RlKTsKKwl9IGVsc2UKKwkJcmMgPSAwOworCitmYWlsX2NtZDoKKwlpZiAoaXNfYWxsb2NhdGVkID09IDEpCisJCWtmcmVlKGRlY19jZmcpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcTZ1c21fb3Blbl93cml0ZShzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCSAgICAgdWludDMyX3QgZm9ybWF0KQoreworCWludCByYyA9IDA7CisJdWludDMyX3QgaW50X2Zvcm1hdCA9IElOVkFMSURfRk9STUFUOworCXN0cnVjdCB1c21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlIG9wZW47CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF0iLCBfX2Z1bmNfXywgdXNjLT5zZXNzaW9uKTsKKworCXE2dXNtX2FkZF9oZHIodXNjLCAmb3Blbi5oZHIsIHNpemVvZihvcGVuKSwgdHJ1ZSk7CisJb3Blbi5oZHIub3Bjb2RlID0gVVNNX1NUUkVBTV9DTURfT1BFTl9XUklURTsKKworCWludF9mb3JtYXQgPSBxNnVzbV9leHQyaW50X2Zvcm1hdChmb3JtYXQpOworCWlmIChpbnRfZm9ybWF0ID09IElOVkFMSURfRk9STUFUKSB7CisJCXByX2VycigiJXM6IHdyb25nIGZvcm1hdFslZF0iLCBfX2Z1bmNfXywgZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3Blbi5mb3JtYXQgPSBpbnRfZm9ybWF0OworCisJcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOm9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIG9wZW4uaGRyLm9wY29kZSwgcmMpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpID09IDApLAorCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7CisJaWYgKCFyYykgeworCQlyYyA9IC1FVElNRTsKKwkJcHJfZXJyKCIlczp0aW1lb3V0LiB3YWl0ZWQgZm9yIE9QRU5fV1JJVFIgcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UKKwkJcmMgPSAwOworCitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNnVzbV9ydW4oc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCBmbGFncywKKwkgICAgICB1aW50MzJfdCBtc3dfdHMsIHVpbnQzMl90IGxzd190cykKK3sKKwlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfcnVuIHJ1bjsKKwlpbnQgcmMgPSAwOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcTZ1c21fYWRkX2hkcih1c2MsICZydW4uaGRyLCBzaXplb2YocnVuKSwgdHJ1ZSk7CisKKwlydW4uaGRyLm9wY29kZSA9IFVTTV9TRVNTSU9OX0NNRF9SVU47CisJcnVuLmZsYWdzICAgID0gZmxhZ3M7CisJcnVuLm1zd190cyAgID0gbXN3X3RzOworCXJ1bi5sc3dfdHMgICA9IGxzd190czsKKworCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJnJ1bik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21tbWFuZCBydW4gZmFpbGVkWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpID09IDApLAorCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7CisJaWYgKCFyYykgeworCQlyYyA9IC1FVElNRTsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBydW4gc3VjY2VzcyByY1slZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCX0gZWxzZQorCQlyYyA9IDA7CisKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworCisKK2ludCBxNnVzbV9yZWFkKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3QgcmVhZF9pbmQpCit7CisJc3RydWN0IHVzbV9zdHJlYW1fY21kX3JlYWQgcmVhZDsKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXUzMiByZWFkX2NvdW50ZXIgPSAwOworCXUzMiBsb29wX2luZCA9IDA7CisJdTY0IGJ1Zl9hZGRyID0gMDsKKworCWlmICgodXNjID09IE5VTEwpIHx8ICh1c2MtPmFwciA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBvcnQgPSAmdXNjLT5wb3J0W09VVF07CisKKwlpZiAocmVhZF9pbmQgPiBwb3J0LT5idWZfY250KSB7CisJCXByX2VycigiJXM6IHdyb25nIHJlYWRfaW5kWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZWFkX2luZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVhZF9pbmQgPT0gcG9ydC0+Y3B1X2J1ZikgeworCQlwcl9lcnIoIiVzOiBubyBmcmVlIHJlZ2lvblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVhZF9pbmQgPiBwb3J0LT5jcHVfYnVmKSB7IC8qIDEgcmFuZ2UgKi8KKwkJcmVhZF9jb3VudGVyID0gcmVhZF9pbmQgLSBwb3J0LT5jcHVfYnVmOworCX0gZWxzZSB7IC8qIDIgcmFuZ2VzICovCisJCXJlYWRfY291bnRlciA9IChwb3J0LT5idWZfY250IC0gcG9ydC0+Y3B1X2J1ZikgKyByZWFkX2luZDsKKwl9CisKKwlxNnVzbV9hZGRfaGRyKHVzYywgJnJlYWQuaGRyLCBzaXplb2YocmVhZCksIGZhbHNlKTsKKworCXJlYWQuaGRyLm9wY29kZSA9IFVTTV9EQVRBX0NNRF9SRUFEOworCXJlYWQuYnVmX3NpemUgPSBwb3J0LT5idWZfc2l6ZTsKKwlidWZfYWRkciA9ICh1NjQpKHBvcnQtPnBoeXMpICsgcG9ydC0+YnVmX3NpemUgKiAocG9ydC0+Y3B1X2J1Zik7CisJcmVhZC5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKKwlyZWFkLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKKwlyZWFkLm1lbV9tYXBfaGFuZGxlID0gKigodWludDMyX3QgKikocG9ydC0+ZXh0KSk7CisKKwlmb3IgKGxvb3BfaW5kID0gMDsgbG9vcF9pbmQgPCByZWFkX2NvdW50ZXI7ICsrbG9vcF9pbmQpIHsKKwkJdTMyIHRlbXBfY3B1X2J1ZiA9IHBvcnQtPmNwdV9idWY7CisKKwkJYnVmX2FkZHIgPSAodTY0KShwb3J0LT5waHlzKSArCisJCQkJcG9ydC0+YnVmX3NpemUgKiAocG9ydC0+Y3B1X2J1Zik7CisJCXJlYWQuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcik7CisJCXJlYWQuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX2FkZHIpOworCQlyZWFkLnNlcV9pZCA9IHBvcnQtPmNwdV9idWY7CisJCXJlYWQuaGRyLnRva2VuID0gcG9ydC0+Y3B1X2J1ZjsKKwkJcmVhZC5jb3VudGVyID0gMTsKKworCQkrKyhwb3J0LT5jcHVfYnVmKTsKKwkJaWYgKHBvcnQtPmNwdV9idWYgPT0gcG9ydC0+YnVmX2NudCkKKwkJCXBvcnQtPmNwdV9idWYgPSAwOworCisJCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJnJlYWQpOworCisJCWlmIChyYyA8IDApIHsKKwkJCXBvcnQtPmNwdV9idWYgPSB0ZW1wX2NwdV9idWY7CisKKwkJCXByX2VycigiJXM6cmVhZCBvcFsweCV4XXJjWyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmVhZC5oZHIub3Bjb2RlLCByYyk7CisJCQlicmVhazsKKwkJfQorCisJCXJjID0gMDsKKwl9IC8qIGJ1ZnMgbG9vcCAqLworCisJcmV0dXJuIHJjOworfQorCitpbnQgcTZ1c21fd3JpdGUoc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCB3cml0ZV9pbmQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfd3JpdGUgY21kX3dyaXRlOworCXN0cnVjdCB1c19wb3J0X2RhdGEgKnBvcnQgPSBOVUxMOworCXUzMiBjdXJyZW50X2RzcF9idWYgPSAwOworCXU2NCBidWZfYWRkciA9IDA7CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwb3J0ID0gJnVzYy0+cG9ydFtJTl07CisKKwljdXJyZW50X2RzcF9idWYgPSBwb3J0LT5kc3BfYnVmOworCS8qIGZyZWUgcmVnaW9uLCBjYXVzZWQgYnkgbmV3IGRzcF9idWYgcmVwb3J0IGZyb20gRFNQLCAqLworCS8qIGNhbiBiZSBvbmx5IGV4dGVuZGVkICovCisJaWYgKHBvcnQtPmNwdV9idWYgPj0gY3VycmVudF9kc3BfYnVmKSB7CisJCS8qIDIgLXBhcnQgZnJlZSByZWdpb24sIGluY2x1ZGluZyBlbXB0eSBidWZmZXIgKi8KKwkJaWYgKCh3cml0ZV9pbmQgPD0gcG9ydC0+Y3B1X2J1ZikgICYmCisJCSAgICAod3JpdGVfaW5kID4gY3VycmVudF9kc3BfYnVmKSkgeworCQkJcHJfZXJyKCIlczogd3Jvbmcgd19pbmRbJWRdOyBkX2J1Zj0lZDsgY19idWY9JWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHdyaXRlX2luZCwKKwkJCSAgICAgICBjdXJyZW50X2RzcF9idWYsIHBvcnQtPmNwdV9idWYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKiAxIC1wYXJ0IGZyZWUgcmVnaW9uICovCisJCWlmICgod3JpdGVfaW5kIDw9IHBvcnQtPmNwdV9idWYpICB8fAorCQkgICAgKHdyaXRlX2luZCA+IGN1cnJlbnRfZHNwX2J1ZikpIHsKKwkJCXByX2VycigiJXM6IHdyb25nIHdfaW5kWyVkXTsgZF9idWY9JWQ7IGNfYnVmPSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB3cml0ZV9pbmQsCisJCQkgICAgICAgY3VycmVudF9kc3BfYnVmLCBwb3J0LT5jcHVfYnVmKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcTZ1c21fYWRkX2hkcih1c2MsICZjbWRfd3JpdGUuaGRyLCBzaXplb2YoY21kX3dyaXRlKSwgZmFsc2UpOworCisJY21kX3dyaXRlLmhkci5vcGNvZGUgPSBVU01fREFUQV9DTURfV1JJVEU7CisJY21kX3dyaXRlLmJ1Zl9zaXplID0gcG9ydC0+YnVmX3NpemU7CisJYnVmX2FkZHIgPSAodTY0KShwb3J0LT5waHlzKSArIHBvcnQtPmJ1Zl9zaXplICogKHBvcnQtPmNwdV9idWYpOworCWNtZF93cml0ZS5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKKwljbWRfd3JpdGUuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX2FkZHIpOworCWNtZF93cml0ZS5tZW1fbWFwX2hhbmRsZSA9ICooKHVpbnQzMl90ICopKHBvcnQtPmV4dCkpOworCWNtZF93cml0ZS5yZXMwID0gMDsKKwljbWRfd3JpdGUucmVzMSA9IDA7CisJY21kX3dyaXRlLnJlczIgPSAwOworCisJd2hpbGUgKHBvcnQtPmNwdV9idWYgIT0gd3JpdGVfaW5kKSB7CisJCXUzMiB0ZW1wX2NwdV9idWYgPSBwb3J0LT5jcHVfYnVmOworCisJCWJ1Zl9hZGRyID0gKHU2NCkocG9ydC0+cGh5cykgKworCQkJCXBvcnQtPmJ1Zl9zaXplICogKHBvcnQtPmNwdV9idWYpOworCQljbWRfd3JpdGUuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcik7CisJCWNtZF93cml0ZS5idWZfYWRkcl9tc3cgPQorCQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKKwkJY21kX3dyaXRlLnNlcV9pZCA9IHBvcnQtPmNwdV9idWY7CisJCWNtZF93cml0ZS5oZHIudG9rZW4gPSBwb3J0LT5jcHVfYnVmOworCisJCSsrKHBvcnQtPmNwdV9idWYpOworCQlpZiAocG9ydC0+Y3B1X2J1ZiA9PSBwb3J0LT5idWZfY250KQorCQkJcG9ydC0+Y3B1X2J1ZiA9IDA7CisKKwkJcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSAmY21kX3dyaXRlKTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlwb3J0LT5jcHVfYnVmID0gdGVtcF9jcHVfYnVmOworCQkJcHJfZXJyKCIlczp3cml0ZSBvcFsweCV4XTtyY1slZF07Y3B1X2J1ZlslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sIGNtZF93cml0ZS5oZHIub3Bjb2RlLAorCQkJICAgICAgIHJjLCBwb3J0LT5jcHVfYnVmKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworYm9vbCBxNnVzbV9pc193cml0ZV9idWZfZnVsbChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHVpbnQzMl90ICpmcmVlX3JlZ2lvbikKK3sKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwl1MzIgY3B1X2J1ZiA9IDA7CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAhZnJlZV9yZWdpb24pIHsKKwkJcHJfZXJyKCIlczogaW5wdXQgZGF0YSB3cm9uZ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXBvcnQgPSAmdXNjLT5wb3J0W0lOXTsKKwljcHVfYnVmID0gcG9ydC0+Y3B1X2J1ZiArIDE7CisJaWYgKGNwdV9idWYgPT0gcG9ydC0+YnVmX2NudCkKKwkJY3B1X2J1ZiA9IDA7CisKKwkqZnJlZV9yZWdpb24gPSBwb3J0LT5kc3BfYnVmOworCisJcmV0dXJuIGNwdV9idWYgPT0gKmZyZWVfcmVnaW9uOworfQorCitpbnQgcTZ1c21fY21kKHN0cnVjdCB1c19jbGllbnQgKnVzYywgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJaW50IHJjID0gMDsKKwlhdG9taWNfdCAqc3RhdGU7CisKKwlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlxNnVzbV9hZGRfaGRyKHVzYywgJmhkciwgc2l6ZW9mKGhkciksIHRydWUpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDTURfQ0xPU0U6CisJCWhkci5vcGNvZGUgPSBVU01fU1RSRUFNX0NNRF9DTE9TRTsKKwkJc3RhdGUgPSAmdXNjLT5jbWRfc3RhdGU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczpJbnZhbGlkIGZvcm1hdFslZF1cbiIsIF9fZnVuY19fLCBjbWQpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJmhkcik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXywgaGRyLm9wY29kZSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsIChhdG9taWNfcmVhZChzdGF0ZSkgPT0gMCksCisJCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gLUVUSU1FOworCQlwcl9lcnIoIiVzOnRpbWVvdXQuIHdhaXRlZCBmb3IgcmVzcG9uc2Ugb3Bjb2RlWzB4JXhdXG4iLAorCQkgICAgICAgX19mdW5jX18sIGhkci5vcGNvZGUpOworCX0gZWxzZQorCQlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNnVzbV9zZXRfdXNfZGV0ZWN0aW9uKHN0cnVjdCB1c19jbGllbnQgKnVzYywKKwkJCSAgIHN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8gKmRldGVjdF9pbmZvLAorCQkJICAgdWludDE2X3QgZGV0ZWN0X2luZm9fc2l6ZSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwKKwkgICAgKGRldGVjdF9pbmZvX3NpemUgPT0gMCkgfHwKKwkgICAgKGRldGVjdF9pbmZvID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IHdyb25nIGlucHV0OiB1c2M9MHglcEssIGluZl9zaXplPSVkOyBpbmZvPTB4JXBLIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgdXNjLAorCQkgICAgICAgZGV0ZWN0X2luZm9fc2l6ZSwKKwkJICAgICAgIGRldGVjdF9pbmZvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcTZ1c21fYWRkX2hkcih1c2MsICZkZXRlY3RfaW5mby0+aGRyLCBkZXRlY3RfaW5mb19zaXplLCB0cnVlKTsKKworCWRldGVjdF9pbmZvLT5oZHIub3Bjb2RlID0gVVNNX1NFU1NJT05fQ01EX1NJR05BTF9ERVRFQ1RfTU9ERTsKKworCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKilkZXRlY3RfaW5mbyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOkNvbWFtbmQgc2lnbmFsIGRldGVjdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZ1c2MtPmNtZF9zdGF0ZSkgPT0gMCksCisJCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gLUVUSU1FOworCQlwcl9lcnIoIiVzOiBDTURfU0lHTkFMX0RFVEVDVF9NT0RFOiB0aW1lb3V0PSVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIFE2VVNNX1RJTUVPVVRfSklGRklFUyk7CisJfSBlbHNlCisJCXJjID0gMDsKKworCXJldHVybiByYzsKK30KKworaW50IHE2dXNtX3NldF91c19zdHJlYW1fcGFyYW0oaW50IGRpciwgc3RydWN0IHVzX2NsaWVudCAqdXNjLAorCQl1aW50MzJfdCBtb2R1bGVfaWQsIHVpbnQzMl90IHBhcmFtX2lkLCB1aW50MzJfdCBidWZfc2l6ZSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCB1c21fc3RyZWFtX2NtZF9zZXRfcGFyYW0gY21kX3NldF9wYXJhbTsKKwlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKworCWlmICgodXNjID09IE5VTEwpIHx8ICh1c2MtPmFwciA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07CisKKwlxNnVzbV9hZGRfaGRyKHVzYywgJmNtZF9zZXRfcGFyYW0uaGRyLCBzaXplb2YoY21kX3NldF9wYXJhbSksIHRydWUpOworCisJY21kX3NldF9wYXJhbS5oZHIub3Bjb2RlID0gVVNNX1NUUkVBTV9DTURfU0VUX1BBUkFNOworCWNtZF9zZXRfcGFyYW0uYnVmX3NpemUgPSBidWZfc2l6ZTsKKwljbWRfc2V0X3BhcmFtLmJ1Zl9hZGRyX21zdyA9CisJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhwb3J0LT5wYXJhbV9waHlzKTsKKwljbWRfc2V0X3BhcmFtLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMocG9ydC0+cGFyYW1fcGh5cyk7CisJY21kX3NldF9wYXJhbS5tZW1fbWFwX2hhbmRsZSA9CisJCQkqKCh1aW50MzJfdCAqKShwb3J0LT5wYXJhbV9idWZfbWVtX2hhbmRsZSkpOworCWNtZF9zZXRfcGFyYW0ubW9kdWxlX2lkID0gbW9kdWxlX2lkOworCWNtZF9zZXRfcGFyYW0ucGFyYW1faWQgPSBwYXJhbV9pZDsKKwljbWRfc2V0X3BhcmFtLmhkci50b2tlbiA9IDA7CisKKwlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopICZjbWRfc2V0X3BhcmFtKTsKKworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczp3cml0ZSBvcFsweCV4XTtyY1slZF1cbiIsCisJCQlfX2Z1bmNfXywgY21kX3NldF9wYXJhbS5oZHIub3Bjb2RlLCByYyk7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKKwkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOworCWlmICghcmMpIHsKKwkJcmMgPSAtRVRJTUU7CisJCXByX2VycigiJXM6IENNRF9TRVRfUEFSQU06IHRpbWVvdXQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKKwl9IGVsc2UKKwkJcmMgPSAwOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcTZ1c21fZ2V0X3VzX3N0cmVhbV9wYXJhbShpbnQgZGlyLCBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCXVpbnQzMl90IG1vZHVsZV9pZCwgdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IGJ1Zl9zaXplKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHVzbV9zdHJlYW1fY21kX2dldF9wYXJhbSBjbWRfZ2V0X3BhcmFtOworCXN0cnVjdCB1c19wb3J0X2RhdGEgKnBvcnQgPSBOVUxMOworCisJaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKKworCXE2dXNtX2FkZF9oZHIodXNjLCAmY21kX2dldF9wYXJhbS5oZHIsIHNpemVvZihjbWRfZ2V0X3BhcmFtKSwgdHJ1ZSk7CisKKwljbWRfZ2V0X3BhcmFtLmhkci5vcGNvZGUgPSBVU01fU1RSRUFNX0NNRF9HRVRfUEFSQU07CisJY21kX2dldF9wYXJhbS5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCWNtZF9nZXRfcGFyYW0uYnVmX2FkZHJfbXN3ID0KKwkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKHBvcnQtPnBhcmFtX3BoeXMpOworCWNtZF9nZXRfcGFyYW0uYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhwb3J0LT5wYXJhbV9waHlzKTsKKwljbWRfZ2V0X3BhcmFtLm1lbV9tYXBfaGFuZGxlID0KKwkJCSooKHVpbnQzMl90ICopKHBvcnQtPnBhcmFtX2J1Zl9tZW1faGFuZGxlKSk7CisJY21kX2dldF9wYXJhbS5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJY21kX2dldF9wYXJhbS5wYXJhbV9pZCA9IHBhcmFtX2lkOworCWNtZF9nZXRfcGFyYW0uaGRyLnRva2VuID0gMDsKKworCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJmNtZF9nZXRfcGFyYW0pOworCisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOndyaXRlIG9wWzB4JXhdO3JjWyVkXVxuIiwKKwkJCV9fZnVuY19fLCBjbWRfZ2V0X3BhcmFtLmhkci5vcGNvZGUsIHJjKTsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpID09IDApLAorCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7CisJaWYgKCFyYykgeworCQlyYyA9IC1FVElNRTsKKwkJcHJfZXJyKCIlczogQ01EX0dFVF9QQVJBTTogdGltZW91dD0lZFxuIiwKKwkJCV9fZnVuY19fLCBRNlVTTV9USU1FT1VUX0pJRkZJRVMpOworCX0gZWxzZQorCQlyYyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHE2dXNtX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGlzX21tYXAuY21kX3dhaXQpOworCW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc2Vzc2lvbikpOworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwocTZ1c21faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uaCBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9xNnVzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWQxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uaApAQCAtMCwwICsxLDEzMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9fUTZfVVNNX0hfXworI2RlZmluZSBfX1E2X1VTTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3VzLmg+CisKKyNkZWZpbmUgUTZVU01fRVZFTlRfVU5ERUYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBRNlVTTV9FVkVOVF9SRUFEX0RPTkUgICAgICAgICAgICAxCisjZGVmaW5lIFE2VVNNX0VWRU5UX1dSSVRFX0RPTkUgICAgICAgICAgIDIKKyNkZWZpbmUgUTZVU01fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQgMworCisvKiBjeWNsaWMgYnVmZmVyIHdpdGggMSBnYXAgc3VwcG9ydCAqLworI2RlZmluZSBVU01fTUlOX0JVRl9DTlQgMworCisjZGVmaW5lIEZPUk1BVF9VU1BTX0VQT1MJMHgwMDAwMDAwMAorI2RlZmluZSBGT1JNQVRfVVNSQVcJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRk9STUFUX1VTUFJPWAkJMHgwMDAwMDAwMgorI2RlZmluZSBGT1JNQVRfVVNHRVNfU1lOQwkweDAwMDAwMDAzCisjZGVmaW5lIEZPUk1BVF9VU1JBV19TWU5DCTB4MDAwMDAwMDQKKyNkZWZpbmUgSU5WQUxJRF9GT1JNQVQJCTB4ZmZmZmZmZmYKKworI2RlZmluZSBJTgkJCTB4MDAwCisjZGVmaW5lIE9VVAkJCTB4MDAxCisKKyNkZWZpbmUgVVNNX1dST05HX1RPS0VOCQkweGZmZmZmZmZmCisjZGVmaW5lIFVTTV9VTkRFRl9UT0tFTgkJMHhmZmZmZmZmZQorCisjZGVmaW5lIENNRF9DTE9TRQkJMHgwMDA0CisKKy8qIGJpdCAwOjEgcmVwcmVzZW50cyBwcmlvcml0eSBvZiBzdHJlYW0gKi8KKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX05PUk1BTAkweDAwMDAKKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX0xPVwkweDAwMDEKKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX0hJR0gJMHgwMDAyCisKKy8qIGJpdCA0IHJlcHJlc2VudHMgTUVUQSBlbmFibGUgb2YgZW5jb2RlZCBkYXRhIGJ1ZmZlciAqLworI2RlZmluZSBCVUZGRVJfTUVUQV9FTkFCTEUJMHgwMDEwCisKK3N0cnVjdCB1c19wb3J0X2RhdGEgeworCWRtYV9hZGRyX3QJcGh5czsKKwkvKiBjeWNsaWMgcmVnaW9uIG9mIGJ1ZmZlcnMgd2l0aCAxIGdhcCAqLworCXZvaWQJCSpkYXRhOworCS8qIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSByZWdpb24gKi8KKwl1aW50MzJfdAlidWZfY250OworCS8qIHNpemUgb2YgYnVmZmVyICovCisJc2l6ZV90CQlidWZfc2l6ZTsKKwkvKiB3cml0ZSBpbmRleCAqLworCXVpbnQzMl90CWRzcF9idWY7CisJLyogcmVhZCBpbmRleCAqLworCXVpbnQzMl90CWNwdV9idWY7CisJLyogZXhwZWN0ZWQgdG9rZW4gZnJvbSBkc3AgKi8KKwl1aW50MzJfdAlleHBlY3RlZF90b2tlbjsKKwkvKiByZWFkIG9yIHdyaXRlIGxvY2tzICovCisJc3RydWN0IG11dGV4CWxvY2s7CisJc3BpbmxvY2tfdAlkc3BfbG9jazsKKwkvKiBJT04gbWVtb3J5IGhhbmRsZSAqLworCXN0cnVjdCAgICAgIGlvbl9oYW5kbGUgKmhhbmRsZTsKKwkvKiBJT04gbWVtb3J5IGNsaWVudCAqLworCXN0cnVjdCAgICAgIGlvbl9jbGllbnQgKmNsaWVudDsKKwkvKiBleHRlbmRlZCBwYXJhbWV0ZXJzLCByZWxhdGVkIHRvIHE2IHZhcmlhbnRzICovCisJdm9pZAkJKmV4dDsKKwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHBhcmFtZXRlciBidWZmZXIgKi8KKwlkbWFfYWRkcl90CXBhcmFtX3BoeXM7CisJLyogYnVmZmVyIHdoaWNoIHN0b3JlcyB0aGUgcGFyYW1ldGVyIGRhdGEgKi8KKwl2b2lkCQkqcGFyYW1fYnVmOworCS8qIHNpemUgb2YgcGFyYW1ldGVyIGJ1ZmZlciAqLworCXVpbnQzMl90CXBhcmFtX2J1Zl9zaXplOworCS8qIHBhcmFtZXRlciBidWZmZXIgbWVtb3J5IGhhbmRsZSAqLworCXZvaWQJCSpwYXJhbV9idWZfbWVtX2hhbmRsZTsKKwkvKiBJT04gbWVtb3J5IGhhbmRsZSBmb3IgcGFyYW1ldGVyIGJ1ZmZlciAqLworCXN0cnVjdCAgICAgIGlvbl9oYW5kbGUgKnBhcmFtX2hhbmRsZTsKKwkvKiBJT04gbWVtb3J5IGNsaWVudCBmb3IgcGFyYW1ldGVyIGJ1ZmZlciAqLworCXN0cnVjdCAgICAgIGlvbl9jbGllbnQgKnBhcmFtX2NsaWVudDsKK307CisKK3N0cnVjdCB1c19jbGllbnQgeworCWludAkJCXNlc3Npb247CisJLyogaWR4OjEgb3V0IHBvcnQsIDA6IGluIHBvcnQqLworCXN0cnVjdCB1c19wb3J0X2RhdGEJcG9ydFsyXTsKKworCXN0cnVjdCBhcHJfc3ZjCQkqYXByOworCXN0cnVjdCBtdXRleAkJY21kX2xvY2s7CisKKwlhdG9taWNfdAkJY21kX3N0YXRlOworCWF0b21pY190CQllb3Nfc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY21kX3dhaXQ7CisKKwl2b2lkICgqY2IpKHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QgKiwgdm9pZCAqKTsKKwl2b2lkCQkJKnByaXY7Cit9OworCitpbnQgcTZ1c21fcnVuKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3QgZmxhZ3MsCisJICAgICAgdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMpOworaW50IHE2dXNtX2NtZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIGludCBjbWQpOworaW50IHE2dXNtX3VzX2NsaWVudF9idWZfYWxsb2ModW5zaWduZWQgaW50IGRpciwgc3RydWN0IHVzX2NsaWVudCAqdXNjLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZnN6LCB1bnNpZ25lZCBpbnQgYnVmY250KTsKK2ludCBxNnVzbV91c19wYXJhbV9idWZfYWxsb2ModW5zaWduZWQgaW50IGRpciwgc3RydWN0IHVzX2NsaWVudCAqdXNjLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZnN6KTsKK2ludCBxNnVzbV9lbmNfY2ZnX2JsayhzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHN0cnVjdCB1c19lbmNkZWNfY2ZnICp1c19jZmcpOworaW50IHE2dXNtX2RlY19jZmdfYmxrKHN0cnVjdCB1c19jbGllbnQgKnVzYywgc3RydWN0IHVzX2VuY2RlY19jZmcgKnVzX2NmZyk7CitpbnQgcTZ1c21fcmVhZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHVpbnQzMl90IHJlYWRfaW5kKTsKK3N0cnVjdCB1c19jbGllbnQgKnE2dXNtX3VzX2NsaWVudF9hbGxvYygKKwl2b2lkICgqY2IpKHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QgKiwgdm9pZCAqKSwKKwl2b2lkICpwcml2KTsKK2ludCBxNnVzbV9vcGVuX3JlYWQoc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCBmb3JtYXQpOwordm9pZCBxNnVzbV91c19jbGllbnRfZnJlZShzdHJ1Y3QgdXNfY2xpZW50ICp1c2MpOwordWludDMyX3QgcTZ1c21fZ2V0X3ZpcnR1YWxfYWRkcmVzcyhpbnQgZGlyLCBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCQkJICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bXMpOworaW50IHE2dXNtX29wZW5fd3JpdGUoc3RydWN0IHVzX2NsaWVudCAqdXNjLCAgdWludDMyX3QgZm9ybWF0KTsKK2ludCBxNnVzbV93cml0ZShzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHVpbnQzMl90IHdyaXRlX2luZCk7Citib29sIHE2dXNtX2lzX3dyaXRlX2J1Zl9mdWxsKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3QgKmZyZWVfcmVnaW9uKTsKK2ludCBxNnVzbV9zZXRfdXNfZGV0ZWN0aW9uKHN0cnVjdCB1c19jbGllbnQgKnVzYywKKwkJCSAgIHN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8gKmRldGVjdF9pbmZvLAorCQkJICAgdWludDE2X3QgZGV0ZWN0X2luZm9fc2l6ZSk7CitpbnQgcTZ1c21fc2V0X3VzX3N0cmVhbV9wYXJhbShpbnQgZGlyLCBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCisJCXVpbnQzMl90IG1vZHVsZV9pZCwgdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IGJ1Zl9zaXplKTsKK2ludCBxNnVzbV9nZXRfdXNfc3RyZWFtX3BhcmFtKGludCBkaXIsIHN0cnVjdCB1c19jbGllbnQgKnVzYywKKwkJdWludDMyX3QgbW9kdWxlX2lkLCB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgYnVmX3NpemUpOworCisjZW5kaWYgLyogX19RNl9VU01fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2NGRjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2YuYwpAQCAtMCwwICsxLDI0NjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgorI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3VzZi5oPgorI2luY2x1ZGUgInE2dXNtLmgiCisjaW5jbHVkZSAidXNmY2Rldi5oIgorCisvKiBUaGUgZHJpdmVyIHZlcnNpb24qLworI2RlZmluZSBEUlZfVkVSU0lPTiAiMS43LjEiCisjZGVmaW5lIFVTRl9WRVJTSU9OX0lEIDB4MDE3MQorCisvKiBTdGFuZGFyZCB0aW1lb3V0IGluIHRoZSBhc3luY2hyb25vdXMgb3BzICovCisjZGVmaW5lIFVTRl9USU1FT1VUX0pJRkZJRVMgKDEqSFopIC8qIDEgc2VjICovCisKKy8qIFVuZGVmaW5lZCBVU0YgZGV2aWNlICovCisjZGVmaW5lIFVTRl9VTkRFRl9ERVZfSUQgMHhmZmZmCisKKy8qIFRYIG1lbW9yeSBtYXBwaW5nIGZsYWcgKi8KKyNkZWZpbmUgVVNGX1ZNX1JFQUQgMQorLyogUlggbWVtb3J5IG1hcHBpbmcgZmxhZyAqLworI2RlZmluZSBVU0ZfVk1fV1JJVEUgMgorCisvKiBOdW1iZXIgb2YgZXZlbnRzLCBjb3BpZWQgZnJvbSB0aGUgdXNlciBzcGFjZSB0byBrZXJuZWwgb25lICovCisjZGVmaW5lIFVTRl9FVkVOVFNfUE9SVElPTl9TSVpFIDIwCisKKy8qIEluZGV4ZXMgaW4gcmFuZ2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUlOX0lORCAwCisjZGVmaW5lIE1BWF9JTkQgMQorCisvKiBUaGUgY29vcmRpbmF0ZXMgaW5kZXhlcyAqLworI2RlZmluZSBYX0lORCAwCisjZGVmaW5lIFlfSU5EIDEKKyNkZWZpbmUgWl9JTkQgMgorCisvKiBTaGFyZWQgbWVtb3J5IGxpbWl0cyAqLworLyogbWF4X2J1Zl9zaXplID0gKHBvcnRfc2l6ZSg2NTUzNSoyKSAqIHBvcnRfbnVtKDgpICogZ3JvdXBfc2l6ZSgzKSAqLworI2RlZmluZSBVU0ZfTUFYX0JVRl9TSVpFIDMxNDU2ODAKKyNkZWZpbmUgVVNGX01BWF9CVUZfTlVNICAzMgorCisvKiBtYXggc2l6ZSBmb3IgYnVmZmVyIHNldCBmcm9tIHVzZXIgc3BhY2UgKi8KKyNkZWZpbmUgVVNGX01BWF9VU0VSX0JVRl9TSVpFIDEwMDAwMAorCisvKiBQbGFjZSBmb3Igb3ByZWF0aW9uIHJlc3VsdCwgcmVjZWl2ZWQgZnJvbSBRRFNQNiAqLworI2RlZmluZSBBUFJfUkVTVUxUX0lORCAxCisKKy8qIFBsYWNlIGZvciBVUyBkZXRlY3Rpb24gcmVzdWx0LCByZWNlaXZlZCBmcm9tIFFEU1A2ICovCisjZGVmaW5lIEFQUl9VU19ERVRFQ1RfUkVTVUxUX0lORCAwCisKKyNkZWZpbmUgQklUU19JTl9CWVRFIDgKKworLyogVGltZSB0byBzdGF5IGF3YWtlIGFmdGVyIHR4IHJlYWQgZXZlbnQgKGUuZy4sIHByb3hpbWl0eSkgKi8KKyNkZWZpbmUgU1RBWV9BV0FLRV9BRlRFUl9SRUFEX01TRUNTIDMwMDAKKworLyogVGhlIGRyaXZlciBzdGF0ZXMgKi8KK2VudW0gdXNmX3N0YXRlX3R5cGUgeworCVVTRl9JRExFX1NUQVRFLAorCVVTRl9PUEVORURfU1RBVEUsCisJVVNGX0NPTkZJR1VSRURfU1RBVEUsCisJVVNGX1dPUktfU1RBVEUsCisJVVNGX0FEU1BfUkVTVEFSVF9TVEFURSwKKwlVU0ZfRVJST1JfU1RBVEUKK307CisKKy8qIFRoZSBVUyBkZXRlY3Rpb24gc3RhdHVzIHVwb24gRlcvSFcgYmFzZWQgVVMgZGV0ZWN0aW9uIHJlc3VsdHMgKi8KK2VudW0gdXNmX3VzX2RldGVjdF90eXBlIHsKKwlVU0ZfVVNfREVURUNUX1VOREVGLAorCVVTRl9VU19ERVRFQ1RfWUVTLAorCVVTRl9VU19ERVRFQ1RfTk8KK307CisKK3N0cnVjdCB1c2ZfeHhfdHlwZSB7CisJLyogTmFtZSBvZiB0aGUgY2xpZW50IC0gZXZlbnQgY2FsY3VsYXRvciAqLworCWNoYXIgY2xpZW50X25hbWVbVVNGX01BWF9DTElFTlRfTkFNRV9TSVpFXTsKKwkvKiBUaGUgZHJpdmVyIHN0YXRlIGluIFRYIG9yIFJYIGRpcmVjdGlvbiAqLworCWVudW0gdXNmX3N0YXRlX3R5cGUgdXNmX3N0YXRlOworCS8qIHdhaXQgZm9yIHE2IGV2ZW50cyBtZWNoYW5pc20gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCS8qIElGIHdpdGggcTZ1c20gaW5mbyAqLworCXN0cnVjdCB1c19jbGllbnQgKnVzYzsKKwkvKiBRNjpVU00nIEVuY29kZXIvZGVjb2RlciBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHVzX2VuY2RlY19jZmcgZW5jZGVjX2NmZzsKKwkvKiBTaGFyZWQgYnVmZmVyICh3aXRoIFE2OlVTTSkgc2l6ZSAqLworCXVpbnQzMl90IGJ1ZmZlcl9zaXplOworCS8qIE51bWJlciBvZiB0aGUgc2hhcmVkIGJ1ZmZlcnMgKHdpdGggUTY6VVNNKSAqLworCXVpbnQzMl90IGJ1ZmZlcl9jb3VudDsKKwkvKiBTaGFyZWQgbWVtb3J5IChDeWNsaWMgYnVmZmVyIHdpdGggMSBnYXApIGNvbnRyb2wgKi8KKwl1aW50MzJfdCBuZXdfcmVnaW9uOworCXVpbnQzMl90IHByZXZfcmVnaW9uOworCS8qIFE2OlVTTSdzIGV2ZW50cyBoYW5kbGVyICovCisJdm9pZCAoKmNiKSh1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90ICosIHZvaWQgKik7CisJLyogVVMgZGV0ZWN0aW9uIHJlc3VsdCAqLworCWVudW0gdXNmX3VzX2RldGVjdF90eXBlIHVzX2RldGVjdF90eXBlOworCS8qIFVzZXIncyB1cGRhdGUgaW5mbyBpc24ndCBhY2NlcHRhYmxlICovCisJdTggdXNlcl91cGRfaW5mb19uYTsKK307CisKK3N0cnVjdCB1c2ZfdHlwZSB7CisJLyogVFggZGV2aWNlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uICYgY29udHJvbCAqLworCXN0cnVjdCB1c2ZfeHhfdHlwZSB1c2ZfdHg7CisJLyogUlggZGV2aWNlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uICYgY29udHJvbCAqLworCXN0cnVjdCB1c2ZfeHhfdHlwZSB1c2Zfcng7CisJLyogSW5kZXggaW50byB0aGUgb3BlbmVkIGRldmljZSBjb250YWluZXIgKi8KKwkvKiBUbyBwcmV2ZW50IG11dHVhbCB1c2FnZSBvZiB0aGUgc2FtZSBkZXZpY2UgKi8KKwl1aW50MTZfdCBkZXZfaW5kOworCS8qIEV2ZW50IHR5cGVzLCBzdXBwb3J0ZWQgYnkgZGV2aWNlICovCisJdWludDE2X3QgZXZlbnRfdHlwZXM7CisJLyogIFRoZSBpbnB1dCBkZXZpY2VzIGFyZSAiaW5wdXQiIG1vZHVsZSByZWdpc3RlcmVkIGNsaWVudHMgKi8KKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9pZnNbVVNGX01BWF9FVkVOVF9JTkRdOworCS8qIEJpdG1hcCBvZiB0eXBlcyBvZiBldmVudHMsIGNvbmZsaWN0aW5nIHRvIFVTRidzIG9uZXMgKi8KKwl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF90eXBlczsKKwkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIGZyb20gZGV2cywgY29uZmxpY3Rpbmcgd2l0aCBVU0YgKi8KKwl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF9maWx0ZXJzOworCS8qIFRoZSByZXF1ZXN0ZWQgYnV0dG9ucyBiaXRtYXAgKi8KKwl1aW50MTZfdCByZXFfYnV0dG9uc19iaXRtYXA7CisJLyogTXV0ZXggZm9yIGV4Y2x1c2l2ZSBvcGVyYXRpb25zIChhbGwgcHVibGljIEFQSXMpICovCisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKworc3RydWN0IHVzZl9pbnB1dF9kZXZfdHlwZSB7CisJLyogSW5wdXQgZXZlbnQgdHlwZSwgc3VwcG9ydGVkIGJ5IHRoZSBpbnB1dCBkZXZpY2UgKi8KKwl1aW50MTZfdCBldmVudF90eXBlOworCS8qIElucHV0IGRldmljZSBuYW1lICovCisJY29uc3QgY2hhciAqaW5wdXRfZGV2X25hbWU7CisJLyogSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiAqLworCWludCAoKnByZXBhcmVfZGV2KSh1aW50MTZfdCwgc3RydWN0IHVzZl90eXBlICosCisJCQkgICAgc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSAqLAorCQkJICAgY29uc3QgY2hhciAqKTsKKwkvKiBJbnB1dCBldmVudCBub3RpZmljYXRpb24gZnVuY3Rpb24gKi8KKwl2b2lkICgqbm90aWZ5X2V2ZW50KShzdHJ1Y3QgdXNmX3R5cGUgKiwKKwkJCSAgICAgdWludDE2X3QsCisJCQkgICAgIHN0cnVjdCB1c2ZfZXZlbnRfdHlwZSAqCisJCQkgICAgICk7Cit9OworCisKKy8qIFRoZSBNQVggbnVtYmVyIG9mIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyAqLworI2RlZmluZSBNQVhfREVWU19OVU1CRVIJMQorCisvKgorICogY29kZSBmb3IgYSBzcGVjaWFsIGJ1dHRvbiB0aGF0IGlzIHVzZWQgdG8gc2hvdy9oaWRlIGEKKyAqIGhvdmVyaW5nIGN1cnNvciBpbiB0aGUgaW5wdXQgZnJhbWV3b3JrLiBNdXN0IGJlIGluCisgKiBzeW5jIHdpdGggdGhlIGJ1dHRvbiBjb2RlIGRlZmluaXRpb24gaW4gdGhlIGZyYW1ld29yaworICogKEV2ZW50SHViLmgpCisgKi8KKyNkZWZpbmUgQlROX1VTRl9IT1ZFUklOR19DVVJTT1IgICAgICAgICAweDIzMAorCisvKiBTdXBwb3J0ZWQgYnV0dG9ucyBjb250YWluZXIgKi8KK3N0YXRpYyBjb25zdCBpbnQgc19idXR0b25fbWFwW10gPSB7CisJQlROX1NUWUxVUywKKwlCVE5fU1RZTFVTMiwKKwlCVE5fVE9PTF9QRU4sCisJQlROX1RPT0xfUlVCQkVSLAorCUJUTl9UT09MX0ZJTkdFUiwKKwlCVE5fVVNGX0hPVkVSSU5HX0NVUlNPUgorfTsKKworLyogVGhlIG9wZW5lZCBkZXZpY2VzIGNvbnRhaW5lciAqLworc3RhdGljIGludCBzX29wZW5lZF9kZXZzW01BWF9ERVZTX05VTUJFUl07CisKK3N0YXRpYyBzdHJ1Y3Qgd2FrZXVwX3NvdXJjZSB1c2Zfd2FrZXVwX3NvdXJjZTsKKworI2RlZmluZSBVU0ZfTkFNRV9QUkVGSVggInVzZl8iCisjZGVmaW5lIFVTRl9OQU1FX1BSRUZJWF9TSVpFIDQKKworCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqYWxsb2NhdGVfZGV2KHVpbnQxNl90IGluZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbl9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKworCWlmIChpbl9kZXYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQkvKiBDb21tb24gcGFydCBjb25maWd1cmF0aW9uICovCisJCWluX2Rldi0+bmFtZSA9IG5hbWU7CisJCWluX2Rldi0+cGh5cyA9IE5VTEw7CisJCWluX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCQlpbl9kZXYtPmlkLnZlbmRvciAgPSAweDAwMDE7CisJCWluX2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwkJaW5fZGV2LT5pZC52ZXJzaW9uID0gVVNGX1ZFUlNJT05fSUQ7CisJfQorCXJldHVybiBpbl9kZXY7Cit9CisKK3N0YXRpYyBpbnQgcHJlcGFyZV90c2NfaW5wdXRfZGV2aWNlKHVpbnQxNl90IGluZCwKKwkJCQlzdHJ1Y3QgdXNmX3R5cGUgKnVzZl9pbmZvLAorCQkJCXN0cnVjdCB1c19pbnB1dF9pbmZvX3R5cGUgKmlucHV0X2luZm8sCisJCQkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpbnQgbnVtX2J1dHRvbnMgPSBtaW4oQVJSQVlfU0laRShzX2J1dHRvbl9tYXApLAorCQlzaXplb2YoaW5wdXRfaW5mby0+cmVxX2J1dHRvbnNfYml0bWFwKSAqCisJCUJJVFNfSU5fQllURSk7CisJdWludDE2X3QgbWF4X2J1dHRvbnNfYml0bWFwID0gKCgxIDw8IEFSUkFZX1NJWkUoc19idXR0b25fbWFwKSkgLSAxKTsKKworCXN0cnVjdCBpbnB1dF9kZXYgKmluX2RldiA9IGFsbG9jYXRlX2RldihpbmQsIG5hbWUpOworCisJaWYgKGluX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChpbnB1dF9pbmZvLT5yZXFfYnV0dG9uc19iaXRtYXAgPiBtYXhfYnV0dG9uc19iaXRtYXApIHsKKwkJcHJfZXJyKCIlczogUmVxdWVzdGVkIGJ1dHRvbnNbJWRdIGV4Y2VlZHMgbWF4IGJ1dHRvbnMgYXZhaWxhYmxlWyVkXVxuIiwKKwkJX19mdW5jX18sCisJCWlucHV0X2luZm8tPnJlcV9idXR0b25zX2JpdG1hcCwKKwkJbWF4X2J1dHRvbnNfYml0bWFwKTsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5fZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdXNmX2luZm8tPmlucHV0X2lmc1tpbmRdID0gaW5fZGV2OworCXVzZl9pbmZvLT5yZXFfYnV0dG9uc19iaXRtYXAgPQorCQlpbnB1dF9pbmZvLT5yZXFfYnV0dG9uc19iaXRtYXA7CisJaW5fZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOworCWluX2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnV0dG9uczsgaSsrKQorCQlpZiAoaW5wdXRfaW5mby0+cmVxX2J1dHRvbnNfYml0bWFwICYgKDEgPDwgaSkpCisJCQlpbl9kZXYtPmtleWJpdFtCSVRfV09SRChzX2J1dHRvbl9tYXBbaV0pXSB8PQorCQkJQklUX01BU0soc19idXR0b25fbWFwW2ldKTsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGluX2RldiwgQUJTX1gsCisJCQkgICAgIGlucHV0X2luZm8tPnRzY194X2RpbVtNSU5fSU5EXSwKKwkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3hfZGltW01BWF9JTkRdLAorCQkJICAgICAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbl9kZXYsIEFCU19ZLAorCQkJICAgICBpbnB1dF9pbmZvLT50c2NfeV9kaW1bTUlOX0lORF0sCisJCQkgICAgIGlucHV0X2luZm8tPnRzY195X2RpbVtNQVhfSU5EXSwKKwkJCSAgICAgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5fZGV2LCBBQlNfRElTVEFOQ0UsCisJCQkgICAgIGlucHV0X2luZm8tPnRzY196X2RpbVtNSU5fSU5EXSwKKwkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3pfZGltW01BWF9JTkRdLAorCQkJICAgICAwLCAwKTsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGluX2RldiwgQUJTX1BSRVNTVVJFLAorCQkJICAgICBpbnB1dF9pbmZvLT50c2NfcHJlc3N1cmVbTUlOX0lORF0sCisJCQkgICAgIGlucHV0X2luZm8tPnRzY19wcmVzc3VyZVtNQVhfSU5EXSwKKwkJCSAgICAgMCwgMCk7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbl9kZXYsIEFCU19USUxUX1gsCisJCQkgICAgIGlucHV0X2luZm8tPnRzY194X3RpbHRbTUlOX0lORF0sCisJCQkgICAgIGlucHV0X2luZm8tPnRzY194X3RpbHRbTUFYX0lORF0sCisJCQkgICAgIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGluX2RldiwgQUJTX1RJTFRfWSwKKwkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3lfdGlsdFtNSU5fSU5EXSwKKwkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3lfdGlsdFtNQVhfSU5EXSwKKwkJCSAgICAgMCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmVwYXJlX21vdXNlX2lucHV0X2RldmljZSh1aW50MTZfdCBpbmQsIHN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCisJCQlzdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlICppbnB1dF9pbmZvLAorCQkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbl9kZXYgPSBhbGxvY2F0ZV9kZXYoaW5kLCBuYW1lKTsKKworCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2ZfaW5mby0+aW5wdXRfaWZzW2luZF0gPSBpbl9kZXY7CisJaW5fZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVMKTsKKworCWluX2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9NT1VTRSldID0gQklUX01BU0soQlROX0xFRlQpIHwKKwkJCQkJCUJJVF9NQVNLKEJUTl9SSUdIVCkgfAorCQkJCQkJQklUX01BU0soQlROX01JRERMRSk7CisJaW5fZGV2LT5yZWxiaXRbMF0gPSAgQklUX01BU0soUkVMX1gpIHwKKwkJCQlCSVRfTUFTSyhSRUxfWSkgfAorCQkJCUJJVF9NQVNLKFJFTF9aKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXBhcmVfa2V5Ym9hcmRfaW5wdXRfZGV2aWNlKAorCQkJCQl1aW50MTZfdCBpbmQsCisJCQkJCXN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCisJCQkJCXN0cnVjdCB1c19pbnB1dF9pbmZvX3R5cGUgKmlucHV0X2luZm8sCisJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5fZGV2ID0gYWxsb2NhdGVfZGV2KGluZCwgbmFtZSk7CisKKwlpZiAoaW5fZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdXNmX2luZm8tPmlucHV0X2lmc1tpbmRdID0gaW5fZGV2OworCWluX2Rldi0+ZXZiaXRbMF0gfD0gQklUX01BU0soRVZfS0VZKTsKKwkvKiBBbGwga2V5cyBhcmUgcGVybWl0dGVkICovCisJbWVtc2V0KGluX2Rldi0+a2V5Yml0LCAweGZmLCBzaXplb2YoaW5fZGV2LT5rZXliaXQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub3RpZnlfdHNjX2V2ZW50KHN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCisJCQkgICAgIHVpbnQxNl90IGlmX2luZCwKKwkJCSAgICAgc3RydWN0IHVzZl9ldmVudF90eXBlICpldmVudCkKKworeworCWludCBpID0gMDsKKwlpbnQgbnVtX2J1dHRvbnMgPSBtaW4oQVJSQVlfU0laRShzX2J1dHRvbl9tYXApLAorCQlzaXplb2YodXNmX2luZm8tPnJlcV9idXR0b25zX2JpdG1hcCkgKgorCQlCSVRTX0lOX0JZVEUpOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfaWYgPSB1c2ZfaW5mby0+aW5wdXRfaWZzW2lmX2luZF07CisJc3RydWN0IHBvaW50X2V2ZW50X3R5cGUgKnBlID0gJihldmVudC0+ZXZlbnRfZGF0YS5wb2ludF9ldmVudCk7CisKKwlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2lmLCBBQlNfWCwgcGUtPmNvb3JkaW5hdGVzW1hfSU5EXSk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pZiwgQUJTX1ksIHBlLT5jb29yZGluYXRlc1tZX0lORF0pOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaWYsIEFCU19ESVNUQU5DRSwgcGUtPmNvb3JkaW5hdGVzW1pfSU5EXSk7CisKKwlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2lmLCBBQlNfVElMVF9YLCBwZS0+aW5jbGluYXRpb25zW1hfSU5EXSk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pZiwgQUJTX1RJTFRfWSwgcGUtPmluY2xpbmF0aW9uc1tZX0lORF0pOworCisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pZiwgQUJTX1BSRVNTVVJFLCBwZS0+cHJlc3N1cmUpOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfaWYsIEJUTl9UT1VDSCwgISEocGUtPnByZXNzdXJlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1dHRvbnM7IGkrKykgeworCQl1aW50MTZfdCBtYXNrID0gKDEgPDwgaSksCisJCWJ0bl9zdGF0ZSA9ICEhKHBlLT5idXR0b25zX3N0YXRlX2JpdG1hcCAmIG1hc2spOworCQlpZiAodXNmX2luZm8tPnJlcV9idXR0b25zX2JpdG1hcCAmIG1hc2spCisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2lmLCBzX2J1dHRvbl9tYXBbaV0sIGJ0bl9zdGF0ZSk7CisJfQorCisJaW5wdXRfc3luYyhpbnB1dF9pZik7CisKKwlwcl9kZWJ1ZygiJXM6IFRTQyBldmVudDogeHl6WyVkOyVkOyVkXSwgaW5jbFslZDslZF0sIHByZXNzdXJlWyVkXSwgYnV0dG9uc1slZF1cbiIsCisJCSBfX2Z1bmNfXywKKwkJIHBlLT5jb29yZGluYXRlc1tYX0lORF0sCisJCSBwZS0+Y29vcmRpbmF0ZXNbWV9JTkRdLAorCQkgcGUtPmNvb3JkaW5hdGVzW1pfSU5EXSwKKwkJIHBlLT5pbmNsaW5hdGlvbnNbWF9JTkRdLAorCQkgcGUtPmluY2xpbmF0aW9uc1tZX0lORF0sCisJCSBwZS0+cHJlc3N1cmUsCisJCSBwZS0+YnV0dG9uc19zdGF0ZV9iaXRtYXApOworfQorCitzdGF0aWMgdm9pZCBub3RpZnlfbW91c2VfZXZlbnQoc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKKwkJCSAgICAgICB1aW50MTZfdCBpZl9pbmQsCisJCQkgICAgICAgc3RydWN0IHVzZl9ldmVudF90eXBlICpldmVudCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9pZiA9IHVzZl9pbmZvLT5pbnB1dF9pZnNbaWZfaW5kXTsKKwlzdHJ1Y3QgbW91c2VfZXZlbnRfdHlwZSAqbWUgPSAmKGV2ZW50LT5ldmVudF9kYXRhLm1vdXNlX2V2ZW50KTsKKworCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfaWYsIFJFTF9YLCBtZS0+cmVsc1tYX0lORF0pOworCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfaWYsIFJFTF9ZLCBtZS0+cmVsc1tZX0lORF0pOworCWlucHV0X3JlcG9ydF9yZWwoaW5wdXRfaWYsIFJFTF9aLCBtZS0+cmVsc1taX0lORF0pOworCisJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9pZiwgQlROX0xFRlQsCisJCQkgbWUtPmJ1dHRvbnNfc3RhdGVzICYgVVNGX0JVVFRPTl9MRUZUX01BU0spOworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfaWYsIEJUTl9NSURETEUsCisJCQkgbWUtPmJ1dHRvbnNfc3RhdGVzICYgVVNGX0JVVFRPTl9NSURETEVfTUFTSyk7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9pZiwgQlROX1JJR0hULAorCQkJIG1lLT5idXR0b25zX3N0YXRlcyAmIFVTRl9CVVRUT05fUklHSFRfTUFTSyk7CisKKwlpbnB1dF9zeW5jKGlucHV0X2lmKTsKKworCXByX2RlYnVnKCIlczogbW91c2UgZXZlbnQ6IGR4WyVkXSwgZHlbJWRdLCBidXR0b25zX3N0YXRlc1slZF1cbiIsCisJCSBfX2Z1bmNfXywgbWUtPnJlbHNbWF9JTkRdLAorCQkgbWUtPnJlbHNbWV9JTkRdLCBtZS0+YnV0dG9uc19zdGF0ZXMpOworfQorCitzdGF0aWMgdm9pZCBub3RpZnlfa2V5X2V2ZW50KHN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCisJCQkgICAgIHVpbnQxNl90IGlmX2luZCwKKwkJCSAgICAgc3RydWN0IHVzZl9ldmVudF90eXBlICpldmVudCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9pZiA9IHVzZl9pbmZvLT5pbnB1dF9pZnNbaWZfaW5kXTsKKwlzdHJ1Y3Qga2V5X2V2ZW50X3R5cGUgKmtlID0gJihldmVudC0+ZXZlbnRfZGF0YS5rZXlfZXZlbnQpOworCisJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9pZiwga2UtPmtleSwga2UtPmtleV9zdGF0ZSk7CisJaW5wdXRfc3luYyhpbnB1dF9pZik7CisJcHJfZGVidWcoIiVzOiBrZXkgZXZlbnQ6IGtleVslZF0sIHN0YXRlWyVkXVxuIiwKKwkJIF9fZnVuY19fLAorCQkga2UtPmtleSwKKwkJIGtlLT5rZXlfc3RhdGUpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNmX2lucHV0X2Rldl90eXBlIHNfdXNmX2lucHV0X2RldnNbXSA9IHsKKwl7VVNGX1RTQ19FVkVOVCwgInVzZl90c2MiLAorCQlwcmVwYXJlX3RzY19pbnB1dF9kZXZpY2UsIG5vdGlmeV90c2NfZXZlbnR9LAorCXtVU0ZfVFNDX1BUUl9FVkVOVCwgInVzZl90c2NfcHRyIiwKKwkJcHJlcGFyZV90c2NfaW5wdXRfZGV2aWNlLCBub3RpZnlfdHNjX2V2ZW50fSwKKwl7VVNGX01PVVNFX0VWRU5ULCAidXNmX21vdXNlIiwKKwkJcHJlcGFyZV9tb3VzZV9pbnB1dF9kZXZpY2UsIG5vdGlmeV9tb3VzZV9ldmVudH0sCisJe1VTRl9LRVlCT0FSRF9FVkVOVCwgInVzZl9rYiIsCisJCXByZXBhcmVfa2V5Ym9hcmRfaW5wdXRfZGV2aWNlLCBub3RpZnlfa2V5X2V2ZW50fSwKKwl7VVNGX1RTQ19FWFRfRVZFTlQsICJ1c2ZfdHNjX2V4dCIsCisJCXByZXBhcmVfdHNjX2lucHV0X2RldmljZSwgbm90aWZ5X3RzY19ldmVudH0sCit9OworCitzdGF0aWMgdm9pZCB1c2ZfcnhfY2IodWludDMyX3Qgb3Bjb2RlLCB1aW50MzJfdCB0b2tlbiwKKwkJICAgICAgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAoc3RydWN0IHVzZl94eF90eXBlICopIHByaXY7CisKKwlpZiAodXNmX3h4ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdGhlIHByaXZhdGUgZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgUTZVU01fRVZFTlRfV1JJVEVfRE9ORToKKwkJd2FrZV91cCgmdXNmX3h4LT53YWl0KTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU0VUX0VWRU5UUzoKKwkJcHJfZXJyKCIlczogcmVjZWl2ZWQgUkVTRVRfRVZFTlRTXG4iLCBfX2Z1bmNfXyk7CisJCXVzZl94eC0+dXNmX3N0YXRlID0gVVNGX0FEU1BfUkVTVEFSVF9TVEFURTsKKwkJd2FrZV91cCgmdXNmX3h4LT53YWl0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVzZl90eF9jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAorCQkgICAgICB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9IChzdHJ1Y3QgdXNmX3h4X3R5cGUgKikgcHJpdjsKKworCWlmICh1c2ZfeHggPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB0aGUgcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBRNlVTTV9FVkVOVF9SRUFEX0RPTkU6CisJCXByX2RlYnVnKCIlczogYWNxdWlyaW5nICVkIG1zZWMgd2FrZSBsb2NrXG4iLCBfX2Z1bmNfXywKKwkJCQlTVEFZX0FXQUtFX0FGVEVSX1JFQURfTVNFQ1MpOworCQlfX3BtX3dha2V1cF9ldmVudCgmdXNmX3dha2V1cF9zb3VyY2UsCisJCQkJICBTVEFZX0FXQUtFX0FGVEVSX1JFQURfTVNFQ1MpOworCQlpZiAodG9rZW4gPT0gVVNNX1dST05HX1RPS0VOKQorCQkJdXNmX3h4LT51c2Zfc3RhdGUgPSBVU0ZfRVJST1JfU1RBVEU7CisJCXVzZl94eC0+bmV3X3JlZ2lvbiA9IHRva2VuOworCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOworCQlicmVhazsKKworCWNhc2UgUTZVU01fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQ6CisJCXVzZl94eC0+dXNfZGV0ZWN0X3R5cGUgPSAocGF5bG9hZFtBUFJfVVNfREVURUNUX1JFU1VMVF9JTkRdKSA/CisJCQkJCVVTRl9VU19ERVRFQ1RfWUVTIDoKKwkJCQkJVVNGX1VTX0RFVEVDVF9OTzsKKworCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOworCQlicmVhazsKKworCWNhc2UgQVBSX0JBU0lDX1JTUF9SRVNVTFQ6CisJCWlmIChwYXlsb2FkW0FQUl9SRVNVTFRfSU5EXSkgeworCQkJdXNmX3h4LT51c2Zfc3RhdGUgPSBVU0ZfRVJST1JfU1RBVEU7CisJCQl1c2ZfeHgtPm5ld19yZWdpb24gPSBVU01fV1JPTkdfVE9LRU47CisJCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSRVNFVF9FVkVOVFM6CisJCXByX2VycigiJXM6IHJlY2VpdmVkIFJFU0VUX0VWRU5UU1xuIiwgX19mdW5jX18pOworCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9BRFNQX1JFU1RBUlRfU1RBVEU7CisJCXdha2VfdXAoJnVzZl94eC0+d2FpdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3h4KHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4KQoreworCWlmICh1c2ZfeHggIT0gTlVMTCkgeworCQlpZiAodXNmX3h4LT51c2MpIHsKKwkJCXE2dXNtX3VzX2NsaWVudF9mcmVlKHVzZl94eC0+dXNjKTsKKwkJCXVzZl94eC0+dXNjID0gTlVMTDsKKwkJfQorCisJCWlmICh1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zICE9IE5VTEwpIHsKKwkJCWtmcmVlKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMpOworCQkJdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVzZl9kaXNhYmxlKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4KQoreworCWlmICh1c2ZfeHggIT0gTlVMTCkgeworCQlpZiAoKHVzZl94eC0+dXNmX3N0YXRlICE9IFVTRl9JRExFX1NUQVRFKSAmJgorCQkgICAgKHVzZl94eC0+dXNmX3N0YXRlICE9IFVTRl9PUEVORURfU1RBVEUpKSB7CisJCQkodm9pZClxNnVzbV9jbWQodXNmX3h4LT51c2MsIENNRF9DTE9TRSk7CisJCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9PUEVORURfU1RBVEU7CisJCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOworCQl9CisJCXJlbGVhc2VfeHgodXNmX3h4KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3h4KHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LCBzdHJ1Y3QgdXNfeHhfaW5mb190eXBlICpjb25maWcpCit7CisJaW50IHJjID0gMDsKKwl1aW50MTZfdCBkYXRhX21hcF9zaXplID0gMDsKKwl1aW50MTZfdCBtaW5fbWFwX3NpemUgPSAwOworCisJaWYgKCh1c2ZfeHggPT0gTlVMTCkgfHwKKwkgICAgKGNvbmZpZyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGNvbmZpZy0+YnVmX3NpemUgPT0gMCkgfHwKKwkgICAgKGNvbmZpZy0+YnVmX3NpemUgPiBVU0ZfTUFYX0JVRl9TSVpFKSB8fAorCSAgICAoY29uZmlnLT5idWZfbnVtID09IDApIHx8CisJICAgIChjb25maWctPmJ1Zl9udW0gPiBVU0ZfTUFYX0JVRl9OVU0pKSB7CisJCXByX2VycigiJXM6IHdyb25nIHBhcmFtczogYnVmX3NpemU9JWQ7IGJ1Zl9udW09JWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY29uZmlnLT5idWZfc2l6ZSwgY29uZmlnLT5idWZfbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YV9tYXBfc2l6ZSA9IHNpemVvZih1c2ZfeHgtPmVuY2RlY19jZmcuY2ZnX2NvbW1vbi5kYXRhX21hcCk7CisJbWluX21hcF9zaXplID0gbWluKGRhdGFfbWFwX3NpemUsIGNvbmZpZy0+cG9ydF9jbnQpOworCisJaWYgKGNvbmZpZy0+Y2xpZW50X25hbWUgIT0gTlVMTCkgeworCQlpZiAoc3RybmNweV9mcm9tX3VzZXIodXNmX3h4LT5jbGllbnRfbmFtZSwKKwkJCQkgICAgICAoY2hhciBfX3VzZXIgKiljb25maWctPmNsaWVudF9uYW1lLAorCQkJCSAgICAgIHNpemVvZih1c2ZfeHgtPmNsaWVudF9uYW1lKSAtIDEpIDwgMCkgeworCQkJcHJfZXJyKCIlczogZ2V0IGNsaWVudCBuYW1lIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG5hbWU9JXM7IGJ1Zl9zaXplOiVkOyBkZXZfaWQ6MHgleDsgc2FtcGxlX3JhdGU6JWRcbiIsCisJCV9fZnVuY19fLCB1c2ZfeHgtPmNsaWVudF9uYW1lLCBjb25maWctPmJ1Zl9zaXplLAorCQljb25maWctPmRldl9pZCwgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGJ1Zl9udW06JWQ7IGZvcm1hdDolZDsgcG9ydF9jbnQ6JWQ7IGRhdGFfc2l6ZT0lZFxuIiwKKwkJX19mdW5jX18sIGNvbmZpZy0+YnVmX251bSwgY29uZmlnLT5zdHJlYW1fZm9ybWF0LAorCQljb25maWctPnBvcnRfY250LCBjb25maWctPnBhcmFtc19kYXRhX3NpemUpOworCisJcHJfZGVidWcoIiVzOiBpZFswXT0lZCwgaWRbMV09JWQsIGlkWzJdPSVkLCBpZFszXT0lZCwgaWRbNF09JWQsXG4iLAorCQlfX2Z1bmNfXywKKwkJY29uZmlnLT5wb3J0X2lkWzBdLAorCQljb25maWctPnBvcnRfaWRbMV0sCisJCWNvbmZpZy0+cG9ydF9pZFsyXSwKKwkJY29uZmlnLT5wb3J0X2lkWzNdLAorCQljb25maWctPnBvcnRfaWRbNF0pOworCisJcHJfZGVidWcoImlkWzVdPSVkLCBpZFs2XT0lZCwgaWRbN109JWRcbiIsCisJCWNvbmZpZy0+cG9ydF9pZFs1XSwKKwkJY29uZmlnLT5wb3J0X2lkWzZdLAorCQljb25maWctPnBvcnRfaWRbN10pOworCisJLyogcTZ1c20gYWxsb2NhdGlvbiAmIGNvbmZpZ3VyYXRpb24gKi8KKwl1c2ZfeHgtPmJ1ZmZlcl9zaXplID0gY29uZmlnLT5idWZfc2l6ZTsKKwl1c2ZfeHgtPmJ1ZmZlcl9jb3VudCA9IGNvbmZpZy0+YnVmX251bTsKKwl1c2ZfeHgtPmVuY2RlY19jZmcuY2ZnX2NvbW1vbi5iaXRzX3Blcl9zYW1wbGUgPQorCQkJCWNvbmZpZy0+Yml0c19wZXJfc2FtcGxlOworCXVzZl94eC0+ZW5jZGVjX2NmZy5jZmdfY29tbW9uLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKwkvKiBBRkUgcG9ydCBlLmcuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8xX1JYICovCisJdXNmX3h4LT5lbmNkZWNfY2ZnLmNmZ19jb21tb24uZGV2X2lkID0gY29uZmlnLT5kZXZfaWQ7CisKKwl1c2ZfeHgtPmVuY2RlY19jZmcuY2ZnX2NvbW1vbi5jaF9jZmcgPSBjb25maWctPnBvcnRfY250OworCW1lbWNweSgodm9pZCAqKSZ1c2ZfeHgtPmVuY2RlY19jZmcuY2ZnX2NvbW1vbi5kYXRhX21hcCwKKwkgICAgICAgKHZvaWQgKiljb25maWctPnBvcnRfaWQsCisJICAgICAgIG1pbl9tYXBfc2l6ZSk7CisKKwl1c2ZfeHgtPmVuY2RlY19jZmcuZm9ybWF0X2lkID0gY29uZmlnLT5zdHJlYW1fZm9ybWF0OworCXVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXNfc2l6ZSA9IGNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZTsKKwl1c2ZfeHgtPnVzZXJfdXBkX2luZm9fbmEgPSAxOyAvKiBpdCdzIHVzZWQgaW4gVVNfR0VUX1RYX1VQREFURSAqLworCisJaWYgKGNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZSA+IDApIHsgLyogdHJhbnNwYXJlbnQgZGF0YSBjb3B5ICovCisJCXVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMgPSBremFsbG9jKGNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZSwKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJLyogRmFsc2UgbWVtb3J5IGxlYWsgaGVyZSAtIHBvaW50ZXIgaW4gcGFja2VkIHN0cnVjdAorCQkgKiBpcyB1bmRldGVjdGVkIGJ5IGttZW1sZWFrIHRvb2wKKwkJICovCisJCWttZW1sZWFrX2lnbm9yZSh1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zKTsKKwkJaWYgKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogcGFyYW1zIG1lbW9yeSBhbGxvY1slZF0gZmFpbHVyZVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQljb25maWctPnBhcmFtc19kYXRhX3NpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcmMgPSBjb3B5X2Zyb21fdXNlcih1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zLAorCQkJCSAgICAodWludDhfdCBfX3VzZXIgKiljb25maWctPnBhcmFtc19kYXRhLAorCQkJCSAgICBjb25maWctPnBhcmFtc19kYXRhX3NpemUpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IHRyYW5zcGFyZW50IGRhdGEgY29weSBmYWlsdXJlXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWtmcmVlKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMpOworCQkJdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyA9IE5VTEw7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IHBhcmFtc19zaXplWyVkXTsgcGFyYW1zWyVkLCVkLCVkLCVkLCAlZF1cbiIsCisJCQkgX19mdW5jX18sCisJCQkgY29uZmlnLT5wYXJhbXNfZGF0YV9zaXplLAorCQkJIHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXNbMF0sCisJCQkgdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtc1sxXSwKKwkJCSB1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zWzJdLAorCQkJIHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXNbM10sCisJCQkgdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtc1s0XQorCQkJKTsKKwl9CisKKwl1c2ZfeHgtPnVzYyA9IHE2dXNtX3VzX2NsaWVudF9hbGxvYyh1c2ZfeHgtPmNiLCAodm9pZCAqKXVzZl94eCk7CisJaWYgKCF1c2ZfeHgtPnVzYykgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcTZ1c20gY2xpZW50XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIHVzZl9tYXRjaCh1aW50MTZfdCBldmVudF90eXBlX2luZCwgc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCWJvb2wgcmMgPSBmYWxzZTsKKworCXJjID0gKGV2ZW50X3R5cGVfaW5kIDwgTUFYX0VWRU5UX1RZUEVfTlVNKSAmJgorCQkoKGRldi0+bmFtZSA9PSBOVUxMKSB8fAorCQlzdHJjbXAoZGV2LT5uYW1lLCBVU0ZfTkFNRV9QUkVGSVgpKTsKKwlwcl9kZWJ1ZygiJXM6IG5hbWU9WyVzXTsgcmM9JWRcbiIsCisJCSBfX2Z1bmNfXywgZGV2LT5uYW1lLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIHVzZl9yZWdpc3Rlcl9jb25mbGljdGluZ19ldmVudHModWludDE2X3QgZXZlbnRfdHlwZXMpCit7CisJYm9vbCByYyA9IHRydWU7CisJdWludDE2X3QgaW5kID0gMDsKKwl1aW50MTZfdCBtYXNrID0gMTsKKworCWZvciAoaW5kID0gMDsgaW5kIDwgTUFYX0VWRU5UX1RZUEVfTlVNOyArK2luZCkgeworCQlpZiAoZXZlbnRfdHlwZXMgJiBtYXNrKSB7CisJCQlyYyA9IHVzZmNkZXZfcmVnaXN0ZXIoaW5kLCB1c2ZfbWF0Y2gpOworCQkJaWYgKCFyYykKKwkJCQlicmVhazsKKwkJfQorCQltYXNrID0gbWFzayA8PCAxOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgdXNmX3VucmVnaXN0ZXJfY29uZmxpY3RpbmdfZXZlbnRzKHVpbnQxNl90IGV2ZW50X3R5cGVzKQoreworCXVpbnQxNl90IGluZCA9IDA7CisJdWludDE2X3QgbWFzayA9IDE7CisKKwlmb3IgKGluZCA9IDA7IGluZCA8IE1BWF9FVkVOVF9UWVBFX05VTTsgKytpbmQpIHsKKwkJaWYgKGV2ZW50X3R5cGVzICYgbWFzaykKKwkJCXVzZmNkZXZfdW5yZWdpc3RlcihpbmQpOworCQltYXNrID0gbWFzayA8PCAxOworCX0KK30KKworc3RhdGljIHZvaWQgdXNmX3NldF9ldmVudF9maWx0ZXJzKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1aW50MTZfdCBldmVudF9maWx0ZXJzKQoreworCXVpbnQxNl90IGluZCA9IDA7CisJdWludDE2X3QgbWFzayA9IDE7CisKKwlpZiAodXNmLT5jb25mbGljdGluZ19ldmVudF9maWx0ZXJzICE9IGV2ZW50X2ZpbHRlcnMpIHsKKwkJZm9yIChpbmQgPSAwOyBpbmQgPCBNQVhfRVZFTlRfVFlQRV9OVU07ICsraW5kKSB7CisJCQlpZiAodXNmLT5jb25mbGljdGluZ19ldmVudF90eXBlcyAmIG1hc2spCisJCQkJdXNmY2Rldl9zZXRfZmlsdGVyKGluZCwgZXZlbnRfZmlsdGVycyZtYXNrKTsKKwkJCW1hc2sgPSBtYXNrIDw8IDE7CisJCX0KKwkJdXNmLT5jb25mbGljdGluZ19ldmVudF9maWx0ZXJzID0gZXZlbnRfZmlsdGVyczsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfaW5wdXRfZGV2aWNlKHN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCisJCQkJIHN0cnVjdCB1c19pbnB1dF9pbmZvX3R5cGUgKmlucHV0X2luZm8pCit7CisJaW50IHJjID0gMDsKKwlib29sIHJldCA9IHRydWU7CisJdWludDE2X3QgaW5kID0gMDsKKworCWlmICgodXNmX2luZm8gPT0gTlVMTCkgfHwKKwkgICAgKGlucHV0X2luZm8gPT0gTlVMTCkgfHwKKwkgICAgIShpbnB1dF9pbmZvLT5ldmVudF90eXBlcyAmIFVTRl9BTExfRVZFTlRTKSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dCBwYXJhbWV0ZXIocylcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpbmQgPSAwOyBpbmQgPCBVU0ZfTUFYX0VWRU5UX0lORDsgKytpbmQpIHsKKwkJaWYgKHVzZl9pbmZvLT5pbnB1dF9pZnNbaW5kXSAhPSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBpbnB1dF9pZlslZF0gaXMgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsCisJCQkJX19mdW5jX18sIGluZCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoKGlucHV0X2luZm8tPmV2ZW50X3R5cGVzICYKKwkJCXNfdXNmX2lucHV0X2RldnNbaW5kXS5ldmVudF90eXBlKSAmJgorCQkgICAgIHNfdXNmX2lucHV0X2RldnNbaW5kXS5wcmVwYXJlX2RldikgeworCQkJcmMgPSAoKnNfdXNmX2lucHV0X2RldnNbaW5kXS5wcmVwYXJlX2RldikoCisJCQkJaW5kLAorCQkJCXVzZl9pbmZvLAorCQkJCWlucHV0X2luZm8sCisJCQkJc191c2ZfaW5wdXRfZGV2c1tpbmRdLmlucHV0X2Rldl9uYW1lKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCXJjID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHVzZl9pbmZvLT5pbnB1dF9pZnNbaW5kXSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcl9lcnIoIiVzOiBpbnB1dF9yZWdfZGV2KCkgZmFpbGVkOyByYz0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCQlpbnB1dF9mcmVlX2RldmljZSh1c2ZfaW5mby0+aW5wdXRfaWZzW2luZF0pOworCQkJCXVzZl9pbmZvLT5pbnB1dF9pZnNbaW5kXSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXVzZl9pbmZvLT5ldmVudF90eXBlcyB8PQorCQkJCQlzX3VzZl9pbnB1dF9kZXZzW2luZF0uZXZlbnRfdHlwZTsKKwkJCQlwcl9kZWJ1ZygiJXM6IGlucHV0IGRldmljZVslc10gd2FzIHJlZ2lzdGVyZWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzX3VzZl9pbnB1dF9kZXZzW2luZF0uaW5wdXRfZGV2X25hbWUpOworCQkJfQorCQl9IC8qIHN1cHBvcnRlZCBldmVudCAqLworCX0gLyogZXZlbnQgdHlwZXMgbG9vcCAqLworCisJcmV0ID0gdXNmX3JlZ2lzdGVyX2NvbmZsaWN0aW5nX2V2ZW50cygKKwkJCWlucHV0X2luZm8tPmNvbmZsaWN0aW5nX2V2ZW50X3R5cGVzKTsKKwlpZiAocmV0KQorCQl1c2ZfaW5mby0+Y29uZmxpY3RpbmdfZXZlbnRfdHlwZXMgPQorCQkJaW5wdXRfaW5mby0+Y29uZmxpY3RpbmdfZXZlbnRfdHlwZXM7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBoYW5kbGVfaW5wdXRfZXZlbnQoc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKKwkJCSAgICAgICB1aW50MTZfdCBldmVudF9jb3VudGVyLAorCQkJICAgICAgIHN0cnVjdCB1c2ZfZXZlbnRfdHlwZSBfX3VzZXIgKmV2ZW50KQoreworCXVpbnQxNl90IGluZCA9IDA7CisJdWludDE2X3QgZXZlbnRzX251bSA9IDA7CisJc3RydWN0IHVzZl9ldmVudF90eXBlIHVzZl9ldmVudHNbVVNGX0VWRU5UU19QT1JUSU9OX1NJWkVdOworCWludCByYyA9IDA7CisKKwlpZiAoKHVzZl9pbmZvID09IE5VTEwpIHx8CisJICAgIChldmVudCA9PSBOVUxMKSB8fCAoIWV2ZW50X2NvdW50ZXIpKSB7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoZXZlbnRfY291bnRlciA+IDApIHsKKwkJaWYgKGV2ZW50X2NvdW50ZXIgPiBVU0ZfRVZFTlRTX1BPUlRJT05fU0laRSkgeworCQkJZXZlbnRzX251bSA9IFVTRl9FVkVOVFNfUE9SVElPTl9TSVpFOworCQkJZXZlbnRfY291bnRlciAtPSBVU0ZfRVZFTlRTX1BPUlRJT05fU0laRTsKKwkJfSBlbHNlIHsKKwkJCWV2ZW50c19udW0gPSBldmVudF9jb3VudGVyOworCQkJZXZlbnRfY291bnRlciA9IDA7CisJCX0KKwkJcmMgPSBjb3B5X2Zyb21fdXNlcih1c2ZfZXZlbnRzLAorCQkJCShzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgX191c2VyICopZXZlbnQsCisJCQkJZXZlbnRzX251bSAqIHNpemVvZihzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUpKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF9yeF9pbmZvIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGluZCA9IDA7IGluZCA8IGV2ZW50c19udW07ICsraW5kKSB7CisJCQlzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgKnBfZXZlbnQgPSAmdXNmX2V2ZW50c1tpbmRdOworCQkJdWludDE2X3QgaWZfaW5kID0gcF9ldmVudC0+ZXZlbnRfdHlwZV9pbmQ7CisKKwkJCWlmICgoaWZfaW5kID49IFVTRl9NQVhfRVZFTlRfSU5EKSB8fAorCQkJICAgICh1c2ZfaW5mby0+aW5wdXRfaWZzW2lmX2luZF0gPT0gTlVMTCkpCisJCQkJY29udGludWU7IC8qIGV2ZW50IGlzbid0IHN1cHBvcnRlZCAqLworCisJCQlpZiAoc191c2ZfaW5wdXRfZGV2c1tpZl9pbmRdLm5vdGlmeV9ldmVudCkKKwkJCQkoKnNfdXNmX2lucHV0X2RldnNbaWZfaW5kXS5ub3RpZnlfZXZlbnQpKAorCQkJCQkJCQl1c2ZfaW5mbywKKwkJCQkJCQkJaWZfaW5kLAorCQkJCQkJCQlwX2V2ZW50KTsKKwkJfSAvKiBsb29wIGluIHRoZSBwb3J0aW9uICovCisJfSAvKiBhbGwgZXZlbnRzIGxvb3AgKi8KK30KKworc3RhdGljIGludCB1c2Zfc3RhcnRfdHgoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgpCit7CisJaW50IHJjID0gcTZ1c21fcnVuKHVzZl94eC0+dXNjLCAwLCAwLCAwKTsKKworCXByX2RlYnVnKCIlczogdHg6IHE2dXNtX3J1bjsgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJaWYgKCFyYykgeworCQlpZiAodXNmX3h4LT5idWZmZXJfY291bnQgPj0gVVNNX01JTl9CVUZfQ05UKSB7CisJCQkvKiBzdXBwbHkgYWxsIGJ1ZmZlcnMgKi8KKwkJCXJjID0gcTZ1c21fcmVhZCh1c2ZfeHgtPnVzYywKKwkJCQkJdXNmX3h4LT5idWZmZXJfY291bnQpOworCQkJcHJfZGVidWcoIiVzOiBxNnVzbV9yZWFkWyVkXVxuIiwKKwkJCQkgX19mdW5jX18sIHJjKTsKKworCQkJaWYgKHJjKQorCQkJCXByX2VycigiJXM6IGJ1ZiByZWFkIGZhaWxlZCIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWVsc2UKKwkJCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9CisJCQkJCVVTRl9XT1JLX1NUQVRFOworCQl9IGVsc2UKKwkJCXVzZl94eC0+dXNmX3N0YXRlID0KKwkJCQlVU0ZfV09SS19TVEFURTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9IC8qIHVzZl9zdGFydF90eCAqLworCitzdGF0aWMgaW50IHVzZl9zdGFydF9yeChzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCkKK3sKKwlpbnQgcmMgPSBxNnVzbV9ydW4odXNmX3h4LT51c2MsIDAsIDAsIDApOworCisJcHJfZGVidWcoIiVzOiByeDogcTZ1c21fcnVuOyByYz0lZFxuIiwKKwkJIF9fZnVuY19fLCByYyk7CisJaWYgKCFyYykKKwkJdXNmX3h4LT51c2Zfc3RhdGUgPSBVU0ZfV09SS19TVEFURTsKKworCXJldHVybiByYzsKK30gLyogdXNmX3N0YXJ0X3J4ICovCisKK3N0YXRpYyBpbnQgX191c2Zfc2V0X3VzX2RldGVjdGlvbihzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwKKwkJCQkgIHN0cnVjdCB1c19kZXRlY3RfaW5mb190eXBlICpkZXRlY3RfaW5mbykKK3sKKwl1aW50MzJfdCB0aW1lb3V0ID0gMDsKKwlzdHJ1Y3QgdXNtX3Nlc3Npb25fY21kX2RldGVjdF9pbmZvICpwX2FsbG9jYXRlZF9tZW1vcnkgPSBOVUxMOworCXN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8gdXNtX2RldGVjdF9pbmZvOworCXN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8gKnBfdXNtX2RldGVjdF9pbmZvID0KKwkJCQkJCSZ1c21fZGV0ZWN0X2luZm87CisJdWludDMyX3QgZGV0ZWN0X2luZm9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdXNtX3Nlc3Npb25fY21kX2RldGVjdF9pbmZvKTsKKwlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICAmdXNmLT51c2ZfdHg7CisJaW50IHJjID0gMDsKKworCWlmIChkZXRlY3RfaW5mby0+dXNfZGV0ZWN0b3IgIT0gVVNfREVURUNUX0ZXKSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGRldGVjdG9yOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBkZXRlY3RfaW5mby0+dXNfZGV0ZWN0b3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YV9zaXplICE9IDApICYmCisJICAgIChkZXRlY3RfaW5mby0+cGFyYW1zX2RhdGEgIT0gTlVMTCkpIHsKKwkJdWludDhfdCAqcF9kYXRhID0gTlVMTDsKKworCQlkZXRlY3RfaW5mb19zaXplICs9IGRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YV9zaXplOworCQkgcF9hbGxvY2F0ZWRfbWVtb3J5ID0ga3phbGxvYyhkZXRlY3RfaW5mb19zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBfYWxsb2NhdGVkX21lbW9yeSA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBkZXRlY3RfaW5mb1slZF0gYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGRldGVjdF9pbmZvX3NpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcF91c21fZGV0ZWN0X2luZm8gPSBwX2FsbG9jYXRlZF9tZW1vcnk7CisJCXBfZGF0YSA9ICh1aW50OF90ICopcF91c21fZGV0ZWN0X2luZm8gKworCQkJc2l6ZW9mKHN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8pOworCisJCXJjID0gY29weV9mcm9tX3VzZXIocF9kYXRhLAorCQkJKHVpbnQ4X3QgX191c2VyICopKGRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YSksCisJCQlkZXRlY3RfaW5mby0+cGFyYW1zX2RhdGFfc2l6ZSk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogY29weSBwYXJhbXMgZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJa2ZyZWUocF9hbGxvY2F0ZWRfbWVtb3J5KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXBfdXNtX2RldGVjdF9pbmZvLT5hbGdvcml0aG1fY2ZnX3NpemUgPQorCQkJCWRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YV9zaXplOworCX0gZWxzZQorCQl1c21fZGV0ZWN0X2luZm8uYWxnb3JpdGhtX2NmZ19zaXplID0gMDsKKworCXBfdXNtX2RldGVjdF9pbmZvLT5kZXRlY3RfbW9kZSA9IGRldGVjdF9pbmZvLT51c19kZXRlY3RfbW9kZTsKKwlwX3VzbV9kZXRlY3RfaW5mby0+c2tpcF9pbnRlcnZhbCA9IGRldGVjdF9pbmZvLT5za2lwX3RpbWU7CisKKwl1c2ZfeHgtPnVzX2RldGVjdF90eXBlID0gVVNGX1VTX0RFVEVDVF9VTkRFRjsKKworCXJjID0gcTZ1c21fc2V0X3VzX2RldGVjdGlvbih1c2ZfeHgtPnVzYywKKwkJCQkgICAgcF91c21fZGV0ZWN0X2luZm8sCisJCQkJICAgIGRldGVjdF9pbmZvX3NpemUpOworCWlmIChyYyB8fCAoZGV0ZWN0X2luZm8tPmRldGVjdF90aW1lb3V0ID09IFVTRl9OT19XQUlUX1RJTUVPVVQpKSB7CisJCWtmcmVlKHBfYWxsb2NhdGVkX21lbW9yeSk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBHZXQgVVMgZGV0ZWN0aW9uIHJlc3VsdCAqLworCWlmIChkZXRlY3RfaW5mby0+ZGV0ZWN0X3RpbWVvdXQgPT0gVVNGX0lORklOSVRJVkVfVElNRU9VVCkgeworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1c2ZfeHgtPndhaXQsCisJCQkJCQkodXNmX3h4LT51c19kZXRlY3RfdHlwZSAhPQorCQkJCQkJVVNGX1VTX0RFVEVDVF9VTkRFRikgfHwKKwkJCQkJCSh1c2ZfeHgtPnVzZl9zdGF0ZSA9PQorCQkJCQkJVVNGX0FEU1BfUkVTVEFSVF9TVEFURSkpOworCX0gZWxzZSB7CisJCWlmIChkZXRlY3RfaW5mby0+ZGV0ZWN0X3RpbWVvdXQgPT0gVVNGX0RFRkFVTFRfVElNRU9VVCkKKwkJCXRpbWVvdXQgPSBVU0ZfVElNRU9VVF9KSUZGSUVTOworCQllbHNlCisJCQl0aW1lb3V0ID0gZGV0ZWN0X2luZm8tPmRldGVjdF90aW1lb3V0ICogSFo7CisJfQorCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodXNmX3h4LT53YWl0LAorCQkJCQkodXNmX3h4LT51c19kZXRlY3RfdHlwZSAhPQorCQkJCQlVU0ZfVVNfREVURUNUX1VOREVGKSB8fAorCQkJCQkodXNmX3h4LT51c2Zfc3RhdGUgPT0KKwkJCQkJVVNGX0FEU1BfUkVTVEFSVF9TVEFURSksIHRpbWVvdXQpOworCisJLyogSW4gdGhlIGNhc2Ugb2YgYURTUCByZXN0YXJ0LCAibm8gVVMiIGlzIGFzc3VtZWQgKi8KKwlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX0FEU1BfUkVTVEFSVF9TVEFURSkKKwkJcmMgPSAtRUZBVUxUOworCisJLyogSW4gdGhlIGNhc2Ugb2YgdGltZW91dCwgIm5vIFVTIiBpcyBhc3N1bWVkICovCisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCIlczogR2V0dGluZyBVUyBkZXRlY3Rpb24gZmFpbGVkIHJjWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJZWxzZSB7CisJCXVzZi0+dXNmX3J4LnVzX2RldGVjdF90eXBlID0gdXNmLT51c2ZfdHgudXNfZGV0ZWN0X3R5cGU7CisJCWRldGVjdF9pbmZvLT5pc191cyA9CisJCQkodXNmX3h4LT51c19kZXRlY3RfdHlwZSA9PSBVU0ZfVVNfREVURUNUX1lFUyk7CisJfQorCisJa2ZyZWUocF9hbGxvY2F0ZWRfbWVtb3J5KTsKKworCXJldHVybiByYzsKK30gLyogX191c2Zfc2V0X3VzX2RldGVjdGlvbiAqLworCitzdGF0aWMgaW50IHVzZl9zZXRfdXNfZGV0ZWN0aW9uKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNfZGV0ZWN0X2luZm9fdHlwZSBkZXRlY3RfaW5mbzsKKworCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZkZXRlY3RfaW5mbywKKwkJCQkoc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUgX191c2VyICopIGFyZywKKwkJCQlzaXplb2YoZGV0ZWN0X2luZm8pKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IGRldGVjdF9pbmZvIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoZGV0ZWN0X2luZm8ucGFyYW1zX2RhdGFfc2l6ZSA+IFVTRl9NQVhfVVNFUl9CVUZfU0laRSkgeworCQlwcl9lcnIoIiVzOiB1c2VyIGJ1ZmZlciBzaXplIGV4Y2VlZHMgbWF4aW11bVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBfX3VzZl9zZXRfdXNfZGV0ZWN0aW9uKHVzZiwgJmRldGVjdF9pbmZvKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldCB1cyBkZXRlY3Rpb24gZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICZkZXRlY3RfaW5mbywKKwkJCSAgc2l6ZW9mKGRldGVjdF9pbmZvKSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgZGV0ZWN0X2luZm8gdG8gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiB1c2Zfc2V0X3VzX2RldGVjdGlvbiAqLworCitzdGF0aWMgaW50IF9fdXNmX3NldF90eF9pbmZvKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLAorCQkJICAgICBzdHJ1Y3QgdXNfdHhfaW5mb190eXBlICpjb25maWdfdHgpCit7CisJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAgJnVzZi0+dXNmX3R4OworCWludCByYyA9IDA7CisKKwl1c2ZfeHgtPm5ld19yZWdpb24gPSBVU01fVU5ERUZfVE9LRU47CisJdXNmX3h4LT5wcmV2X3JlZ2lvbiA9IFVTTV9VTkRFRl9UT0tFTjsKKwl1c2ZfeHgtPmNiID0gdXNmX3R4X2NiOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdXNmX3h4LT53YWl0KTsKKworCWlmIChjb25maWdfdHgtPnVzX3h4X2luZm8uY2xpZW50X25hbWUgIT0gTlVMTCkgeworCQlpbnQgcmVzID0gc3RybmNweV9mcm9tX3VzZXIoCisJCQl1c2ZfeHgtPmNsaWVudF9uYW1lLAorCQkJKGNoYXIgX191c2VyICopKGNvbmZpZ190eC0+dXNfeHhfaW5mby5jbGllbnRfbmFtZSksCisJCQlzaXplb2YodXNmX3h4LT5jbGllbnRfbmFtZSktMSk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBnZXQgY2xpZW50IG5hbWUgZmFpbGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmMgPSBjb25maWdfeHgodXNmX3h4LCAmKGNvbmZpZ190eC0+dXNfeHhfaW5mbykpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBxNnVzbV9vcGVuX3JlYWQodXNmX3h4LT51c2MsCisJCQkgICAgIHVzZl94eC0+ZW5jZGVjX2NmZy5mb3JtYXRfaWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBxNnVzbV91c19jbGllbnRfYnVmX2FsbG9jKE9VVCwgdXNmX3h4LT51c2MsCisJCQkJICAgICAgIHVzZl94eC0+YnVmZmVyX3NpemUsCisJCQkJICAgICAgIHVzZl94eC0+YnVmZmVyX2NvdW50KTsKKwlpZiAocmMpIHsKKwkJKHZvaWQpcTZ1c21fY21kKHVzZl94eC0+dXNjLCBDTURfQ0xPU0UpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBxNnVzbV91c19wYXJhbV9idWZfYWxsb2MoT1VULCB1c2ZfeHgtPnVzYywKKwkJCWNvbmZpZ190eC0+dXNfeHhfaW5mby5tYXhfZ2V0X3NldF9wYXJhbV9idWZfc2l6ZSk7CisJaWYgKHJjKSB7CisJCSh2b2lkKXE2dXNtX2NtZCh1c2ZfeHgtPnVzYywgQ01EX0NMT1NFKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gcTZ1c21fZW5jX2NmZ19ibGsodXNmX3h4LT51c2MsCisJCQkgICAgICAgJnVzZl94eC0+ZW5jZGVjX2NmZyk7CisJaWYgKCFyYyAmJgorCSAgICAgKGNvbmZpZ190eC0+aW5wdXRfaW5mby5ldmVudF90eXBlcyAhPSBVU0ZfTk9fRVZFTlQpKSB7CisJCXJjID0gcmVnaXN0ZXJfaW5wdXRfZGV2aWNlKHVzZiwKKwkJCQkJICAgJihjb25maWdfdHgtPmlucHV0X2luZm8pKTsKKwl9CisKKwlpZiAocmMpCisJCSh2b2lkKXE2dXNtX2NtZCh1c2ZfeHgtPnVzYywgQ01EX0NMT1NFKTsKKwllbHNlCisJCXVzZl94eC0+dXNmX3N0YXRlID0gVVNGX0NPTkZJR1VSRURfU1RBVEU7CisKKwlyZXR1cm4gcmM7Cit9IC8qIF9fdXNmX3NldF90eF9pbmZvICovCisKK3N0YXRpYyBpbnQgdXNmX3NldF90eF9pbmZvKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlIGNvbmZpZ190eDsKKworCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZjb25maWdfdHgsCisJCQkgICAgKHN0cnVjdCB1c190eF9pbmZvX3R5cGUgX191c2VyICopIGFyZywKKwkJCSAgICBzaXplb2YoY29uZmlnX3R4KSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSBjb25maWdfdHggZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjb25maWdfdHgudXNfeHhfaW5mby5wYXJhbXNfZGF0YV9zaXplID4gVVNGX01BWF9VU0VSX0JVRl9TSVpFKSB7CisJCXByX2VycigiJXM6IHVzZXIgYnVmZmVyIHNpemUgZXhjZWVkcyBtYXhpbXVtXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gX191c2Zfc2V0X3R4X2luZm8odXNmLCAmY29uZmlnX3R4KTsKK30gLyogdXNmX3NldF90eF9pbmZvICovCisKK3N0YXRpYyBpbnQgX191c2Zfc2V0X3J4X2luZm8oc3RydWN0IHVzZl90eXBlICp1c2YsCisJCQkgICAgIHN0cnVjdCB1c19yeF9pbmZvX3R5cGUgKmNvbmZpZ19yeCkKK3sKKwlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICAmdXNmLT51c2Zfcng7CisJaW50IHJjID0gMDsKKworCXVzZl94eC0+bmV3X3JlZ2lvbiA9IFVTTV9VTkRFRl9UT0tFTjsKKwl1c2ZfeHgtPnByZXZfcmVnaW9uID0gVVNNX1VOREVGX1RPS0VOOworCisJdXNmX3h4LT5jYiA9IHVzZl9yeF9jYjsKKworCXJjID0gY29uZmlnX3h4KHVzZl94eCwgJihjb25maWdfcngtPnVzX3h4X2luZm8pKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcTZ1c21fb3Blbl93cml0ZSh1c2ZfeHgtPnVzYywKKwkJCSAgICAgIHVzZl94eC0+ZW5jZGVjX2NmZy5mb3JtYXRfaWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBxNnVzbV91c19jbGllbnRfYnVmX2FsbG9jKAorCQkJCUlOLAorCQkJCXVzZl94eC0+dXNjLAorCQkJCXVzZl94eC0+YnVmZmVyX3NpemUsCisJCQkJdXNmX3h4LT5idWZmZXJfY291bnQpOworCWlmIChyYykgeworCQkodm9pZClxNnVzbV9jbWQodXNmX3h4LT51c2MsIENNRF9DTE9TRSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHE2dXNtX3VzX3BhcmFtX2J1Zl9hbGxvYyhJTiwgdXNmX3h4LT51c2MsCisJCQljb25maWdfcngtPnVzX3h4X2luZm8ubWF4X2dldF9zZXRfcGFyYW1fYnVmX3NpemUpOworCWlmIChyYykgeworCQkodm9pZClxNnVzbV9jbWQodXNmX3h4LT51c2MsIENNRF9DTE9TRSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHE2dXNtX2RlY19jZmdfYmxrKHVzZl94eC0+dXNjLAorCQkJICAgICAgICZ1c2ZfeHgtPmVuY2RlY19jZmcpOworCWlmIChyYykKKwkJKHZvaWQpcTZ1c21fY21kKHVzZl94eC0+dXNjLCBDTURfQ0xPU0UpOworCWVsc2UgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c2ZfeHgtPndhaXQpOworCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9DT05GSUdVUkVEX1NUQVRFOworCX0KKworCXJldHVybiByYzsKK30gLyogX191c2Zfc2V0X3J4X2luZm8gKi8KKworc3RhdGljIGludCB1c2Zfc2V0X3J4X2luZm8oc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c19yeF9pbmZvX3R5cGUgY29uZmlnX3J4OworCisJaW50IHJjID0gY29weV9mcm9tX3VzZXIoJmNvbmZpZ19yeCwKKwkJCQkoc3RydWN0IHVzX3J4X2luZm9fdHlwZSBfX3VzZXIgKikgYXJnLAorCQkJCXNpemVvZihjb25maWdfcngpKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IGNvbmZpZ19yeCBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGNvbmZpZ19yeC51c194eF9pbmZvLnBhcmFtc19kYXRhX3NpemUgPiBVU0ZfTUFYX1VTRVJfQlVGX1NJWkUpIHsKKwkJcHJfZXJyKCIlczogdXNlciBidWZmZXIgc2l6ZSBleGNlZWRzIG1heGltdW1cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBfX3VzZl9zZXRfcnhfaW5mbyh1c2YsICZjb25maWdfcngpOworfSAvKiB1c2Zfc2V0X3J4X2luZm8gKi8KKworc3RhdGljIGludCBfX3VzZl9nZXRfdHhfdXBkYXRlKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLAorCQkJc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUgKnVwZF90eF9pbmZvKQoreworCXVuc2lnbmVkIGxvbmcgcHJldl9qaWZmaWVzID0gMDsKKwl1aW50MzJfdCB0aW1lb3V0ID0gMDsKKwlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICAmdXNmLT51c2ZfdHg7CisJaW50IHJjID0gMDsKKworCWlmICghdXNmX3h4LT51c2VyX3VwZF9pbmZvX25hKSB7CisJCXVzZl9zZXRfZXZlbnRfZmlsdGVycyh1c2YsIHVwZF90eF9pbmZvLT5ldmVudF9maWx0ZXJzKTsKKwkJaGFuZGxlX2lucHV0X2V2ZW50KHVzZiwKKwkJCQkgICB1cGRfdHhfaW5mby0+ZXZlbnRfY291bnRlciwKKwkJCQkgICB1cGRfdHhfaW5mby0+ZXZlbnQpOworCisJCS8qIFJlbGVhc2UgYXZhaWxhYmxlIHJlZ2lvbnMgKi8KKwkJcmMgPSBxNnVzbV9yZWFkKHVzZl94eC0+dXNjLAorCQkJCXVwZF90eF9pbmZvLT5mcmVlX3JlZ2lvbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9IGVsc2UKKwkJdXNmX3h4LT51c2VyX3VwZF9pbmZvX25hID0gMDsKKworCS8qIEdldCBkYXRhIHJlYWR5IHJlZ2lvbnMgKi8KKwlpZiAodXBkX3R4X2luZm8tPnRpbWVvdXQgPT0gVVNGX0lORklOSVRJVkVfVElNRU9VVCkgeworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1c2ZfeHgtPndhaXQsCisJCQkgICAodXNmX3h4LT5wcmV2X3JlZ2lvbiAhPQorCQkJICAgIHVzZl94eC0+bmV3X3JlZ2lvbikgfHwKKwkJCSAgICh1c2ZfeHgtPnVzZl9zdGF0ZSAhPQorCQkJICAgIFVTRl9XT1JLX1NUQVRFKSk7CisJfSBlbHNlIHsKKwkJaWYgKHVwZF90eF9pbmZvLT50aW1lb3V0ID09IFVTRl9OT19XQUlUX1RJTUVPVVQpCisJCQlyYyA9ICh1c2ZfeHgtPnByZXZfcmVnaW9uICE9IHVzZl94eC0+bmV3X3JlZ2lvbik7CisJCWVsc2UgeworCQkJcHJldl9qaWZmaWVzID0gamlmZmllczsKKwkJCWlmICh1cGRfdHhfaW5mby0+dGltZW91dCA9PSBVU0ZfREVGQVVMVF9USU1FT1VUKSB7CisJCQkJdGltZW91dCA9IFVTRl9USU1FT1VUX0pJRkZJRVM7CisJCQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoCisJCQkJCQl1c2ZfeHgtPndhaXQsCisJCQkJCQkodXNmX3h4LT5wcmV2X3JlZ2lvbiAhPQorCQkJCQkJIHVzZl94eC0+bmV3X3JlZ2lvbikgfHwKKwkJCQkJCSh1c2ZfeHgtPnVzZl9zdGF0ZSAhPQorCQkJCQkJIFVTRl9XT1JLX1NUQVRFKSwKKwkJCQkJCXRpbWVvdXQpOworCQkJfSBlbHNlIHsKKwkJCQl0aW1lb3V0ID0gdXBkX3R4X2luZm8tPnRpbWVvdXQgKiBIWjsKKwkJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCQkJdXNmX3h4LT53YWl0LAorCQkJCQkJKHVzZl94eC0+cHJldl9yZWdpb24gIT0KKwkJCQkJCSB1c2ZfeHgtPm5ld19yZWdpb24pIHx8CisJCQkJCQkodXNmX3h4LT51c2Zfc3RhdGUgIT0KKwkJCQkJCSBVU0ZfV09SS19TVEFURSksCisJCQkJCQl0aW1lb3V0KTsKKwkJCX0KKwkJfQorCQlpZiAoIXJjKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHRpbWVvdXQuIHByZXZfaj0lbHU7IGo9JWx1XG4iLAorCQkJCV9fZnVuY19fLCBwcmV2X2ppZmZpZXMsIGppZmZpZXMpOworCQkJcHJfZGVidWcoIiVzOiB0aW1lb3V0LiBwcmV2PSVkOyBuZXc9JWRcbiIsCisJCQkJX19mdW5jX18sIHVzZl94eC0+cHJldl9yZWdpb24sCisJCQkJdXNmX3h4LT5uZXdfcmVnaW9uKTsKKwkJCXByX2RlYnVnKCIlczogdGltZW91dC4gZnJlZV9yZWdpb249JWQ7XG4iLAorCQkJCV9fZnVuY19fLCB1cGRfdHhfaW5mby0+ZnJlZV9yZWdpb24pOworCQkJaWYgKHVzZl94eC0+cHJldl9yZWdpb24gPT0KKwkJCSAgICB1c2ZfeHgtPm5ld19yZWdpb24pIHsKKwkJCQlwcl9lcnIoIiVzOnJlYWQgZGF0YTogdGltZW91dFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18pOworCQkJCXJldHVybiAtRVRJTUU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKHVzZl94eC0+dXNmX3N0YXRlICE9IFVTRl9XT1JLX1NUQVRFKSB8fAorCSAgICAocmMgPT0gLUVSRVNUQVJUU1lTKSkgeworCQlwcl9lcnIoIiVzOiBHZXQgcmVhZHkgcmVnaW9uIGZhaWx1cmU7IHN0YXRlWyVkXTsgcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHVzZl94eC0+dXNmX3N0YXRlLCByYyk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJdXBkX3R4X2luZm8tPnJlYWR5X3JlZ2lvbiA9IHVzZl94eC0+bmV3X3JlZ2lvbjsKKwl1c2ZfeHgtPnByZXZfcmVnaW9uID0gdXBkX3R4X2luZm8tPnJlYWR5X3JlZ2lvbjsKKworCWlmICh1cGRfdHhfaW5mby0+cmVhZHlfcmVnaW9uID09IFVTTV9XUk9OR19UT0tFTikgeworCQlwcl9lcnIoIiVzOiBUWCBwYXRoIGNvcnJ1cHRlZDsgcHJldj0lZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB1c2ZfeHgtPnByZXZfcmVnaW9uKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIHJjOworfSAvKiBfX3VzZl9nZXRfdHhfdXBkYXRlICovCisKK3N0YXRpYyBpbnQgdXNmX2dldF90eF91cGRhdGUoc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlIHVwZF90eF9pbmZvOworCisJaW50IHJjID0gY29weV9mcm9tX3VzZXIoJnVwZF90eF9pbmZvLAorCQkJCShzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZSBfX3VzZXIgKikgYXJnLAorCQkJCXNpemVvZih1cGRfdHhfaW5mbykpOworCisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF90eF9pbmZvIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IF9fdXNmX2dldF90eF91cGRhdGUodXNmLCAmdXBkX3R4X2luZm8pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogZ2V0IHR4IHVwZGF0ZSBmYWlsZWQ7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgJnVwZF90eF9pbmZvLAorCQkJICBzaXplb2YodXBkX3R4X2luZm8pKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB1cGRfdHhfaW5mbyB0byB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJjID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9IC8qIHVzZl9nZXRfdHhfdXBkYXRlICovCisKK3N0YXRpYyBpbnQgX191c2Zfc2V0X3J4X3VwZGF0ZShzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwKKwkJCSAgICAgICBzdHJ1Y3QgdXNfcnhfdXBkYXRlX2luZm9fdHlwZSAqdXBkX3J4X2luZm8pCit7CisJaW50IHJjID0gMDsKKworCS8qIFNlbmQgYXZhaWxhYmxlIGRhdGEgcmVnaW9ucyAqLworCWlmICh1cGRfcnhfaW5mby0+cmVhZHlfcmVnaW9uICE9CisJICAgIHVzZl94eC0+YnVmZmVyX2NvdW50KSB7CisJCXJjID0gcTZ1c21fd3JpdGUoCisJCQl1c2ZfeHgtPnVzYywKKwkJCXVwZF9yeF9pbmZvLT5yZWFkeV9yZWdpb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IGZyZWUgcmVnaW9ucyAqLworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KAorCQl1c2ZfeHgtPndhaXQsCisJCSFxNnVzbV9pc193cml0ZV9idWZfZnVsbCgKKwkJCXVzZl94eC0+dXNjLAorCQkJJih1cGRfcnhfaW5mby0+ZnJlZV9yZWdpb24pKSB8fAorCQkodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX0lETEVfU1RBVEUpLAorCQlVU0ZfVElNRU9VVF9KSUZGSUVTKTsKKworCWlmICghcmMpIHsKKwkJcmMgPSAtRVRJTUU7CisJCXByX2VycigiJXM6dGltZW91dC4gd2FpdCBmb3Igd3JpdGUgYnVmIG5vdCBmdWxsXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCX0gZWxzZSB7CisJCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSAhPQorCQkgICAgVVNGX1dPUktfU1RBVEUpIHsKKwkJCXByX2VycigiJXM6IFJYOiBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmMgPSAtRUlOVFI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9IC8qIF9fdXNmX3NldF9yeF91cGRhdGUgKi8KKworc3RhdGljIGludCB1c2Zfc2V0X3J4X3VwZGF0ZShzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHVzX3J4X3VwZGF0ZV9pbmZvX3R5cGUgdXBkX3J4X2luZm87CisKKwlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmdXBkX3J4X2luZm8sCisJCQkJKHN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlIF9fdXNlciAqKSBhcmcsCisJCQkJc2l6ZW9mKHVwZF9yeF9pbmZvKSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB1cGRfcnhfaW5mbyBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBfX3VzZl9zZXRfcnhfdXBkYXRlKHVzZl94eCwgJnVwZF9yeF9pbmZvKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldCByeCB1cGRhdGUgZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkmdXBkX3J4X2luZm8sCisJCQlzaXplb2YodXBkX3J4X2luZm8pKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSByeF9pbmZvIHRvIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByYzsKK30gLyogdXNmX3NldF9yeF91cGRhdGUgKi8KKworc3RhdGljIHZvaWQgdXNmX3JlbGVhc2VfaW5wdXQoc3RydWN0IHVzZl90eXBlICp1c2YpCit7CisJdWludDE2X3QgaW5kID0gMDsKKworCXVzZl91bnJlZ2lzdGVyX2NvbmZsaWN0aW5nX2V2ZW50cygKKwkJCQkJdXNmLT5jb25mbGljdGluZ19ldmVudF90eXBlcyk7CisJdXNmLT5jb25mbGljdGluZ19ldmVudF90eXBlcyA9IDA7CisJZm9yIChpbmQgPSAwOyBpbmQgPCBVU0ZfTUFYX0VWRU5UX0lORDsgKytpbmQpIHsKKwkJaWYgKHVzZi0+aW5wdXRfaWZzW2luZF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh1c2YtPmlucHV0X2lmc1tpbmRdKTsKKwkJdXNmLT5pbnB1dF9pZnNbaW5kXSA9IE5VTEw7CisJCXByX2RlYnVnKCIlcyBpbnB1dF91bnJlZ2lzdGVyX2RldmljZVslc11cbiIsCisJCQkgX19mdW5jX18sCisJCQkgc191c2ZfaW5wdXRfZGV2c1tpbmRdLmlucHV0X2Rldl9uYW1lKTsKKwl9Cit9IC8qIHVzZl9yZWxlYXNlX2lucHV0ICovCisKK3N0YXRpYyBpbnQgdXNmX3N0b3BfdHgoc3RydWN0IHVzZl90eXBlICp1c2YpCit7CisJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAgJnVzZi0+dXNmX3R4OworCisJdXNmX3JlbGVhc2VfaW5wdXQodXNmKTsKKwl1c2ZfZGlzYWJsZSh1c2ZfeHgpOworCisJcmV0dXJuIDA7Cit9IC8qIHVzZl9zdG9wX3R4ICovCisKK3N0YXRpYyBpbnQgX191c2ZfZ2V0X3ZlcnNpb24oc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlICp2ZXJzaW9uX2luZm8pCit7CisJaW50IHJjID0gMDsKKworCWlmICh2ZXJzaW9uX2luZm8tPmJ1Zl9zaXplIDwgc2l6ZW9mKERSVl9WRVJTSU9OKSkgeworCQlwcl9lcnIoIiVzOiBidWZfc2l6ZSAoJWQpIDwgdmVyc2lvbiBzdHJpbmcgc2l6ZSAoJXp1KVxuIiwKKwkJCV9fZnVuY19fLCB2ZXJzaW9uX2luZm8tPmJ1Zl9zaXplLCBzaXplb2YoRFJWX1ZFUlNJT04pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHZlcnNpb25faW5mby0+cGJ1ZiksCisJCQkgIERSVl9WRVJTSU9OLAorCQkJICBzaXplb2YoRFJWX1ZFUlNJT04pKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB0byB2ZXJzaW9uX2luZm8ucGJ1ZjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiBfX3VzZl9nZXRfdmVyc2lvbiAqLworCitzdGF0aWMgaW50IHVzZl9nZXRfdmVyc2lvbih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUgdmVyc2lvbl9pbmZvOworCisJaW50IHJjID0gY29weV9mcm9tX3VzZXIoJnZlcnNpb25faW5mbywKKwkJCQkoc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlIF9fdXNlciAqKSBhcmcsCisJCQkJc2l6ZW9mKHZlcnNpb25faW5mbykpOworCisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgdmVyc2lvbl9pbmZvIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IF9fdXNmX2dldF92ZXJzaW9uKCZ2ZXJzaW9uX2luZm8pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogZ2V0IHZlcnNpb24gZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICZ2ZXJzaW9uX2luZm8sCisJCQkgIHNpemVvZih2ZXJzaW9uX2luZm8pKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB2ZXJzaW9uX2luZm8gdG8gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiB1c2ZfZ2V0X3ZlcnNpb24gKi8KKworc3RhdGljIGludCBfX3VzZl9zZXRfc3RyZWFtX3BhcmFtKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LAorCQkJCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSAqc2V0X3N0cmVhbV9wYXJhbSwKKwkJCQlpbnQgZGlyKQoreworCXN0cnVjdCB1c19jbGllbnQgKnVzYyA9IHVzZl94eC0+dXNjOworCXN0cnVjdCB1c19wb3J0X2RhdGEgKnBvcnQ7CisJaW50IHJjID0gMDsKKworCWlmICh1c2MgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB1c2MgaXMgbnVsbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKKwlpZiAocG9ydCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHBvcnQgaXMgbnVsbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHBvcnQtPnBhcmFtX2J1ZiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHBhcmFtZXRlciBidWZmZXIgaXMgbnVsbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplID4gcG9ydC0+cGFyYW1fYnVmX3NpemUpIHsKKwkJcHJfZXJyKCIlczogYnVmX3NpemUgKCVkKSA+IG1heGltdW0gYnVmIHNpemUgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBzZXRfc3RyZWFtX3BhcmFtLT5idWZfc2l6ZSwKKwkJCXBvcnQtPnBhcmFtX2J1Zl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplID09IDApIHsKKwkJcHJfZXJyKCIlczogYnVmX3NpemUgaXMgMFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGNvcHlfZnJvbV91c2VyKHBvcnQtPnBhcmFtX2J1ZiwKKwkJCSh1aW50OF90IF9fdXNlciAqKSBzZXRfc3RyZWFtX3BhcmFtLT5wYnVmLAorCQkJc2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IHBhcmFtIGJ1ZiBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBxNnVzbV9zZXRfdXNfc3RyZWFtX3BhcmFtKGRpciwgdXNjLCBzZXRfc3RyZWFtX3BhcmFtLT5tb2R1bGVfaWQsCisJCQkJCXNldF9zdHJlYW1fcGFyYW0tPnBhcmFtX2lkLAorCQkJCQlzZXRfc3RyZWFtX3BhcmFtLT5idWZfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IHE2dXNtX3NldF91c19zdHJlYW1fcGFyYW0gZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB1c2Zfc2V0X3N0cmVhbV9wYXJhbShzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZywgaW50IGRpcikKK3sKKwlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUgc2V0X3N0cmVhbV9wYXJhbTsKKwlpbnQgcmMgPSAwOworCisJcmMgPSBjb3B5X2Zyb21fdXNlcigmc2V0X3N0cmVhbV9wYXJhbSwKKwkJCShzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUgX191c2VyICopIGFyZywKKwkJCXNpemVvZihzZXRfc3RyZWFtX3BhcmFtKSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSBzZXRfc3RyZWFtX3BhcmFtIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gX191c2Zfc2V0X3N0cmVhbV9wYXJhbSh1c2ZfeHgsICZzZXRfc3RyZWFtX3BhcmFtLCBkaXIpOworfSAvKiB1c2Zfc2V0X3N0cmVhbV9wYXJhbSAqLworCitzdGF0aWMgaW50IF9fdXNmX2dldF9zdHJlYW1fcGFyYW0oc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlICpnZXRfc3RyZWFtX3BhcmFtLAorCQkJCWludCBkaXIpCit7CisJc3RydWN0IHVzX2NsaWVudCAqdXNjID0gdXNmX3h4LT51c2M7CisJc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydDsKKwlpbnQgcmMgPSAwOworCisJaWYgKHVzYyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHVzX2NsaWVudCBpcyBudWxsXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOworCisJaWYgKHBvcnQtPnBhcmFtX2J1ZiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHBhcmFtZXRlciBidWZmZXIgaXMgbnVsbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGdldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplID4gcG9ydC0+cGFyYW1fYnVmX3NpemUpIHsKKwkJcHJfZXJyKCIlczogYnVmX3NpemUgKCVkKSA+IG1heGltdW0gYnVmIHNpemUgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBnZXRfc3RyZWFtX3BhcmFtLT5idWZfc2l6ZSwKKwkJCXBvcnQtPnBhcmFtX2J1Zl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGdldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplID09IDApIHsKKwkJcHJfZXJyKCIlczogYnVmX3NpemUgaXMgMFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IHE2dXNtX2dldF91c19zdHJlYW1fcGFyYW0oZGlyLCB1c2MsIGdldF9zdHJlYW1fcGFyYW0tPm1vZHVsZV9pZCwKKwkJCQkJZ2V0X3N0cmVhbV9wYXJhbS0+cGFyYW1faWQsCisJCQkJCWdldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogcTZ1c21fZ2V0X3VzX3N0cmVhbV9wYXJhbSBmYWlsZWQ7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBjb3B5X3RvX3VzZXIoKHVpbnQ4X3QgX191c2VyICopIGdldF9zdHJlYW1fcGFyYW0tPnBidWYsCisJCQlwb3J0LT5wYXJhbV9idWYsCisJCQlnZXRfc3RyZWFtX3BhcmFtLT5idWZfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgcGFyYW0gYnVmIHRvIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVzZl9nZXRfc3RyZWFtX3BhcmFtKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgZGlyKQoreworCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBnZXRfc3RyZWFtX3BhcmFtOworCWludCByYyA9IDA7CisKKwlyYyA9IGNvcHlfZnJvbV91c2VyKCZnZXRfc3RyZWFtX3BhcmFtLAorCQkJKHN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBfX3VzZXIgKikgYXJnLAorCQkJc2l6ZW9mKGdldF9zdHJlYW1fcGFyYW0pKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IGdldF9zdHJlYW1fcGFyYW0gZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBfX3VzZl9nZXRfc3RyZWFtX3BhcmFtKHVzZl94eCwgJmdldF9zdHJlYW1fcGFyYW0sIGRpcik7Cit9IC8qIHVzZl9nZXRfc3RyZWFtX3BhcmFtICovCisKK3N0YXRpYyBsb25nIF9fdXNmX2lvY3RsKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLAorCQl1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKworCWludCByYyA9IDA7CisJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSBOVUxMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFVTX1NUQVJUX1RYOiB7CisJCXVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKwkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9DT05GSUdVUkVEX1NUQVRFKQorCQkJcmMgPSB1c2Zfc3RhcnRfdHgodXNmX3h4KTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzdGFydF90eDogd3Jvbmcgc3RhdGVbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgIHVzZl94eC0+dXNmX3N0YXRlKTsKKwkJCXJldHVybiAtRUJBREZEOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVVNfU1RBUlRfUlg6IHsKKwkJdXNmX3h4ID0gJnVzZi0+dXNmX3J4OworCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX0NPTkZJR1VSRURfU1RBVEUpCisJCQlyYyA9IHVzZl9zdGFydF9yeCh1c2ZfeHgpOworCQllbHNlIHsKKwkJCXByX2VycigiJXM6IHN0YXJ0X3J4OiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkJX19mdW5jX18sCisJCQkJdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBVU19TRVRfVFhfSU5GTzogeworCQl1c2ZfeHggPSAmdXNmLT51c2ZfdHg7CisJCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfT1BFTkVEX1NUQVRFKQorCQkJcmMgPSB1c2Zfc2V0X3R4X2luZm8odXNmLCBhcmcpOworCQllbHNlIHsKKwkJCXByX2VycigiJXM6IHNldF90eF9pbmZvOiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKworCQlicmVhazsKKwl9IC8qIFVTX1NFVF9UWF9JTkZPICovCisKKwljYXNlIFVTX1NFVF9SWF9JTkZPOiB7CisJCXVzZl94eCA9ICZ1c2YtPnVzZl9yeDsKKwkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9PUEVORURfU1RBVEUpCisJCQlyYyA9IHVzZl9zZXRfcnhfaW5mbyh1c2YsIGFyZyk7CisJCWVsc2UgeworCQkJcHJfZXJyKCIlczogc2V0X3J4X2luZm86IHdyb25nIHN0YXRlWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQl1c2ZfeHgtPnVzZl9zdGF0ZSk7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQorCisJCWJyZWFrOworCX0gLyogVVNfU0VUX1JYX0lORk8gKi8KKworCWNhc2UgVVNfR0VUX1RYX1VQREFURTogeworCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKworCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCisJCQlyYyA9IHVzZl9nZXRfdHhfdXBkYXRlKHVzZiwgYXJnKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBnZXRfdHhfdXBkYXRlOiB3cm9uZyBzdGF0ZVslZF1cbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHVzZl94eC0+dXNmX3N0YXRlKTsKKwkJCXJjID0gLUVCQURGRDsKKwkJfQorCQlicmVhazsKKwl9IC8qIFVTX0dFVF9UWF9VUERBVEUgKi8KKworCWNhc2UgVVNfU0VUX1JYX1VQREFURTogeworCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl9yeDsKKworCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCisJCQlyYyA9IHVzZl9zZXRfcnhfdXBkYXRlKHVzZl94eCwgYXJnKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzZXRfcnhfdXBkYXRlOiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmMgPSAtRUJBREZEOworCQl9CisJCWJyZWFrOworCX0gLyogVVNfU0VUX1JYX1VQREFURSAqLworCisJY2FzZSBVU19TVE9QX1RYOiB7CisJCXVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKwkJaWYgKCh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfV09SS19TVEFURSkKKwkJCXx8ICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfQURTUF9SRVNUQVJUX1NUQVRFKSkKKwkJCXJjID0gdXNmX3N0b3BfdHgodXNmKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzdG9wX3R4OiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBVU19TVE9QX1RYICovCisKKwljYXNlIFVTX1NUT1BfUlg6IHsKKwkJdXNmX3h4ID0gJnVzZi0+dXNmX3J4OworCQlpZiAoKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9XT1JLX1NUQVRFKQorCQkJfHwgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9BRFNQX1JFU1RBUlRfU1RBVEUpKQorCQkJdXNmX2Rpc2FibGUodXNmX3h4KTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzdG9wX3J4OiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBVU19TVE9QX1JYICovCisKKwljYXNlIFVTX1NFVF9ERVRFQ1RJT046IHsKKwkJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAmdXNmLT51c2ZfdHg7CisKKwkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9XT1JLX1NUQVRFKQorCQkJcmMgPSB1c2Zfc2V0X3VzX2RldGVjdGlvbih1c2YsIGFyZyk7CisJCWVsc2UgeworCQkJcHJfZXJyKCIlczogc2V0IHVzIGRldGVjdGlvbjogd3Jvbmcgc3RhdGVbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgIHVzZl94eC0+dXNmX3N0YXRlKTsKKwkJCXJjID0gLUVCQURGRDsKKwkJfQorCQlicmVhazsKKwl9IC8qIFVTX1NFVF9ERVRFQ1RJT04gKi8KKworCWNhc2UgVVNfR0VUX1ZFUlNJT046IHsKKwkJcmMgPSB1c2ZfZ2V0X3ZlcnNpb24oYXJnKTsKKwkJYnJlYWs7CisJfSAvKiBVU19HRVRfVkVSU0lPTiAqLworCisJY2FzZSBVU19TRVRfVFhfU1RSRUFNX1BBUkFNOiB7CisJCXJjID0gdXNmX3NldF9zdHJlYW1fcGFyYW0oJnVzZi0+dXNmX3R4LCBhcmcsIE9VVCk7CisJCWJyZWFrOworCX0gLyogVVNfU0VUX1RYX1NUUkVBTV9QQVJBTSAqLworCisJY2FzZSBVU19HRVRfVFhfU1RSRUFNX1BBUkFNOiB7CisJCXJjID0gdXNmX2dldF9zdHJlYW1fcGFyYW0oJnVzZi0+dXNmX3R4LCBhcmcsIE9VVCk7CisJCWJyZWFrOworCX0gLyogVVNfR0VUX1RYX1NUUkVBTV9QQVJBTSAqLworCisJY2FzZSBVU19TRVRfUlhfU1RSRUFNX1BBUkFNOiB7CisJCXJjID0gdXNmX3NldF9zdHJlYW1fcGFyYW0oJnVzZi0+dXNmX3J4LCBhcmcsIElOKTsKKwkJYnJlYWs7CisJfSAvKiBVU19TRVRfUlhfU1RSRUFNX1BBUkFNICovCisKKwljYXNlIFVTX0dFVF9SWF9TVFJFQU1fUEFSQU06IHsKKwkJcmMgPSB1c2ZfZ2V0X3N0cmVhbV9wYXJhbSgmdXNmLT51c2ZfcngsIGFyZywgSU4pOworCQlicmVhazsKKwl9IC8qIFVTX0dFVF9SWF9TVFJFQU1fUEFSQU0gKi8KKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIElPQ1RMIGNvbW1hbmQgWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgY21kKTsKKwkJcmMgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgJiYKKwkgICAgKChjbWQgPT0gVVNfU0VUX1RYX0lORk8pIHx8CisJICAgICAoY21kID09IFVTX1NFVF9SWF9JTkZPKSkpCisJCXJlbGVhc2VfeHgodXNmX3h4KTsKKworCXJldHVybiByYzsKK30gLyogX191c2ZfaW9jdGwgKi8KKworc3RhdGljIGxvbmcgdXNmX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNmX3R5cGUgKnVzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJbXV0ZXhfbG9jaygmdXNmLT5tdXRleCk7CisJcmMgPSBfX3VzZl9pb2N0bCh1c2YsIGNtZCwgYXJnKTsKKwltdXRleF91bmxvY2soJnVzZi0+bXV0ZXgpOworCisJcmV0dXJuIHJjOworfSAvKiB1c2ZfaW9jdGwgKi8KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworI2RlZmluZSBVU19TRVRfVFhfSU5GTzMyICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDAsIFwKKwkJCQlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlMzIpCisjZGVmaW5lIFVTX0dFVF9UWF9VUERBVEUzMiBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDIsIFwKKwkJCQlzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZTMyKQorI2RlZmluZSBVU19TRVRfUlhfSU5GTzMyICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDMsIFwKKwkJCQlzdHJ1Y3QgdXNfcnhfaW5mb190eXBlMzIpCisjZGVmaW5lIFVTX1NFVF9SWF9VUERBVEUzMiBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDQsIFwKKwkJCQlzdHJ1Y3QgdXNfcnhfdXBkYXRlX2luZm9fdHlwZTMyKQorI2RlZmluZSBVU19TRVRfREVURUNUSU9OMzIgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCA4LCBcCisJCQkJc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUzMikKKyNkZWZpbmUgVVNfR0VUX1ZFUlNJT04zMiAgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCA5LCBcCisJCQkJc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlMzIpCisjZGVmaW5lIFVTX1NFVF9UWF9TVFJFQU1fUEFSQU0zMiAgIF9JT1coVVNGX0lPQ1RMX01BR0lDLCAxMCwgXAorCQkJCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZTMyKQorI2RlZmluZSBVU19HRVRfVFhfU1RSRUFNX1BBUkFNMzIgIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgMTEsIFwKKwkJCQlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMikKKyNkZWZpbmUgVVNfU0VUX1JYX1NUUkVBTV9QQVJBTTMyICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEyLCBcCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIpCisjZGVmaW5lIFVTX0dFVF9SWF9TVFJFQU1fUEFSQU0zMiAgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCAxMywgXAorCQkJCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZTMyKQorCisvKiBJbmZvIHN0cnVjdHVyZSBjb21tb24gZm9yIFRYIGFuZCBSWCAqLworc3RydWN0IHVzX3h4X2luZm9fdHlwZTMyIHsKKy8qIElucHV0OiAgZ2VuZXJhbCBpbmZvICovCisvKiBOYW1lIG9mIHRoZSBjbGllbnQgLSBldmVudCBjYWxjdWxhdG9yLCBwdHIgdG8gY2hhciAqLworCWNvbnN0IGNvbXBhdF91cHRyX3QgY2xpZW50X25hbWU7CisvKiBTZWxlY3RlZCBkZXZpY2UgaWRlbnRpZmljYXRpb24sIGFjY2VwdGVkIGluIHRoZSBrZXJuZWwncyBDQUQgKi8KKwl1aW50MzJfdCBkZXZfaWQ7CisvKiAwIC0gcG9pbnRfZXBvcyB0eXBlOyAoZS5nLiAxIC0gZ3JfbW1yZCkgKi8KKwl1aW50MzJfdCBzdHJlYW1fZm9ybWF0OworLyogUmVxdWlyZWQgc2FtcGxlIHJhdGUgaW4gSHogKi8KKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKy8qIFNpemUgb2YgYSBidWZmZXIgKGJ5dGVzKSBmb3IgVVMgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBtb2R1bGUgYW5kIFVTRiAqLworCXVpbnQzMl90IGJ1Zl9zaXplOworLyogTnVtYmVyIG9mIHRoZSBidWZmZXJzIGZvciB0aGUgVVMgZGF0YSB0cmFuc2ZlciAqLworCXVpbnQxNl90IGJ1Zl9udW07CisvKiBOdW1iZXIgb2YgdGhlIG1pY3JvcGhvbmVzIChUWCkgb3Igc3BlYWtlcnMoUlgpICovCisJdWludDE2X3QgcG9ydF9jbnQ7CisvKiBNaWNyb3Bob25lcyhUWCkgb3Igc3BlYWtlcnMoUlgpIGluZGV4ZXMgaW4gdGhlaXIgZW51bWVyYXRpb24gKi8KKwl1aW50OF90ICBwb3J0X2lkW1VTRl9NQVhfUE9SVF9OVU1dOworLyogQml0cyBwZXIgc2FtcGxlIDE2IG9yIDMyICovCisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlOworLyogSW5wdXQ6ICBUcmFuc3BhcmVudCBpbmZvIGZvciBlbmNvZGVyIGluIHRoZSBMUEFTUyAqLworLyogUGFyYW1ldGVycyBkYXRhIHNpemUgaW4gYnl0ZXMgKi8KKwl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOworLyogUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycywgcHRyIHRvIHVpbnQ4X3QgKi8KKwljb21wYXRfdXB0cl90IHBhcmFtc19kYXRhOworLyogTWF4IHNpemUgb2YgYnVmZmVyIGZvciBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgKi8KKwl1aW50MzJfdCBtYXhfZ2V0X3NldF9wYXJhbV9idWZfc2l6ZTsKK307CisKK3N0cnVjdCB1c190eF9pbmZvX3R5cGUzMiB7CisvKiBDb21tb24gaW5mby4gVGhpcyBzdHJ1Y3QgaW5jbHVkZXMgcHRyIGFuZCB0aGVyZWZvcmUgdGhlIDMyIHZlcnNpb24gKi8KKwlzdHJ1Y3QgdXNfeHhfaW5mb190eXBlMzIgdXNfeHhfaW5mbzsKKy8qIEluZm8gc3BlY2lmaWMgZm9yIFRYLiBUaGlzIHN0cnVjdCBkb2Vzbid0IGluY2x1ZGUgbG9uZyBvciBwdHIKKyAqIGFuZCB0aGVyZWZvcmUgbm8gMzIgdmVyc2lvbgorICovCisJc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSBpbnB1dF9pbmZvOworfTsKKworc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUzMiB7CisvKiBJbnB1dCAgZ2VuZXJhbDogKi8KKy8qIE51bWJlciBvZiBjYWxjdWxhdGVkIGV2ZW50cyAqLworCXVpbnQxNl90IGV2ZW50X2NvdW50ZXI7CisvKiBDYWxjdWxhdGVkIGV2ZW50cyBvciBOVUxMLCBwdHIgdG8gc3RydWN0IHVzZl9ldmVudF90eXBlICovCisJY29tcGF0X3VwdHJfdCBldmVudDsKKy8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLworLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLworCXVpbnQzMl90IGZyZWVfcmVnaW9uOworLyogVGltZSAoc2VjKSB0byB3YWl0IGZvciBkYXRhIG9yIHNwZWNpYWwgdmFsdWVzOiAqLworLyogVVNGX05PX1dBSVRfVElNRU9VVCwgVVNGX0lORklOSVRJVkVfVElNRU9VVCwgVVNGX0RFRkFVTFRfVElNRU9VVCAqLworCXVpbnQzMl90IHRpbWVvdXQ7CisvKiBFdmVudHMgKGZyb20gY29uZmxpY3RpbmcgZGV2cykgdG8gYmUgZGlzYWJsZWQvZW5hYmxlZCAqLworCXVpbnQxNl90IGV2ZW50X2ZpbHRlcnM7CisKKy8qIElucHV0ICB0cmFuc3BhcmVudCBkYXRhOiAqLworLyogUGFyYW1ldGVycyBzaXplICovCisJdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMsIHB0ciB0byB1aW50OF90ICovCisJY29tcGF0X3VwdHJfdCBwYXJhbXNfZGF0YTsKKy8qIE91dHB1dCBwYXJhbWV0ZXJzOiAqLworLyogUG9pbnRlciAod3JpdGUgaW5kZXgpIHRvIHRoZSBlbmQgb2YgcmVhZHkgVVMgZGF0YSByZWdpb24gKi8KKy8qIGluIHRoZSBzaGFyZWQgbWVtb3J5ICovCisJdWludDMyX3QgcmVhZHlfcmVnaW9uOworfTsKKworc3RydWN0IHVzX3J4X2luZm9fdHlwZTMyIHsKKwkvKiBDb21tb24gaW5mbyAqLworCXN0cnVjdCB1c194eF9pbmZvX3R5cGUzMiB1c194eF9pbmZvOworCS8qIEluZm8gc3BlY2lmaWMgZm9yIFJYKi8KK307CisKK3N0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlMzIgeworLyogSW5wdXQgIGdlbmVyYWw6ICovCisvKiBQb2ludGVyICh3cml0ZSBpbmRleCkgdG8gdGhlIGVuZCBvZiByZWFkeSBVUyBkYXRhIHJlZ2lvbiAqLworLyogaW4gdGhlIHNoYXJlZCBtZW1vcnkgKi8KKwl1aW50MzJfdCByZWFkeV9yZWdpb247CisvKiBJbnB1dCAgdHJhbnNwYXJlbnQgZGF0YTogKi8KKy8qIFBhcmFtZXRlcnMgc2l6ZSAqLworCXVpbnQxNl90IHBhcmFtc19kYXRhX3NpemU7CisvKiBwUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycywgcHRyIHRvIHVpbnQ4X3QgKi8KKwljb21wYXRfdXB0cl90IHBhcmFtc19kYXRhOworLyogT3V0cHV0IHBhcmFtZXRlcnM6ICovCisvKiBQb2ludGVyIChyZWFkIGluZGV4KSB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSByZWdpb24gKi8KKy8qIGluIHRoZSBzaGFyZWQgVVMgZGF0YSBtZW1vcnkgKi8KKwl1aW50MzJfdCBmcmVlX3JlZ2lvbjsKK307CisKK3N0cnVjdCB1c19kZXRlY3RfaW5mb190eXBlMzIgeworLyogVVMgZGV0ZWN0aW9uIHBsYWNlIChIV3xGVykgKi8KKy8qIE5BIGluIHRoZSBBY3RpdmUgYW5kIE9GRiBzdGF0ZXMgKi8KKwllbnVtIHVzX2RldGVjdF9wbGFjZV9lbnVtIHVzX2RldGVjdG9yOworLyogVVMgZGV0ZWN0aW9uIG1vZGUgKi8KKwllbnVtIHVzX2RldGVjdF9tb2RlX2VudW0gIHVzX2RldGVjdF9tb2RlOworLyogVVMgZGF0YSBkcm9wcGVkIGR1cmluZyB0aGlzIHRpbWUgKG1zZWMpICovCisJdWludDMyX3Qgc2tpcF90aW1lOworLyogVHJhbnNwYXJlbnQgZGF0YSBzaXplICovCisJdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIHRyYW5zcGFyZW50IGRhdGEsIHB0ciB0byB1aW50OF90ICovCisJY29tcGF0X3VwdHJfdCBwYXJhbXNfZGF0YTsKKy8qIFRpbWUgKHNlYykgdG8gd2FpdCBmb3IgVVMgcHJlc2VuY2UgZXZlbnQgKi8KKwl1aW50MzJfdCBkZXRlY3RfdGltZW91dDsKKy8qIE91dCBwYXJhbWV0ZXI6IFVTIHByZXNlbmNlICovCisJYm9vbCBpc191czsKK307CisKK3N0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZTMyIHsKKy8qIFNpemUgb2YgbWVtb3J5IGZvciB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KKwl1aW50MTZfdCBidWZfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBmb3IgdGhlIHZlcnNpb24gc3RyaW5nLCBwdHIgdG8gY2hhciAqLworCWNvbXBhdF91cHRyX3QgcGJ1ZjsKK307CisKK3N0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZTMyIHsKKy8qIElkIG9mIG1vZHVsZSAqLworCXVpbnQzMl90IG1vZHVsZV9pZDsKKy8qIElkIG9mIHBhcmFtZXRlciAqLworCXVpbnQzMl90IHBhcmFtX2lkOworLyogU2l6ZSBvZiBtZW1vcnkgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIgKi8KKwl1aW50MzJfdCBidWZfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvZiB0aGUgcGFyYW1ldGVyIGJ1ZmZlciAqLworCWNvbXBhdF91cHRyX3QgcGJ1ZjsKK307CisKK3N0YXRpYyB2b2lkIHVzZl9jb21wYXRfeHhfaW5mb190eXBlKHN0cnVjdCB1c194eF9pbmZvX3R5cGUzMiAqdXNfeHhfaW5mbzMyLAorCQkJCSAgIHN0cnVjdCB1c194eF9pbmZvX3R5cGUgKnVzX3h4X2luZm8pCit7CisJaW50IGkgPSAwOworCisJdXNfeHhfaW5mby0+Y2xpZW50X25hbWUgPSBjb21wYXRfcHRyKHVzX3h4X2luZm8zMi0+Y2xpZW50X25hbWUpOworCXVzX3h4X2luZm8tPmRldl9pZCA9IHVzX3h4X2luZm8zMi0+ZGV2X2lkOworCXVzX3h4X2luZm8tPnN0cmVhbV9mb3JtYXQgPSB1c194eF9pbmZvMzItPnN0cmVhbV9mb3JtYXQ7CisJdXNfeHhfaW5mby0+c2FtcGxlX3JhdGUgPSB1c194eF9pbmZvMzItPnNhbXBsZV9yYXRlOworCXVzX3h4X2luZm8tPmJ1Zl9zaXplID0gdXNfeHhfaW5mbzMyLT5idWZfc2l6ZTsKKwl1c194eF9pbmZvLT5idWZfbnVtID0gdXNfeHhfaW5mbzMyLT5idWZfbnVtOworCXVzX3h4X2luZm8tPnBvcnRfY250ID0gdXNfeHhfaW5mbzMyLT5wb3J0X2NudDsKKwlmb3IgKGkgPSAwOyBpIDwgVVNGX01BWF9QT1JUX05VTTsgaSsrKQorCQl1c194eF9pbmZvLT5wb3J0X2lkW2ldID0gdXNfeHhfaW5mbzMyLT5wb3J0X2lkW2ldOworCXVzX3h4X2luZm8tPmJpdHNfcGVyX3NhbXBsZSA9IHVzX3h4X2luZm8zMi0+Yml0c19wZXJfc2FtcGxlOworCXVzX3h4X2luZm8tPnBhcmFtc19kYXRhX3NpemUgPSB1c194eF9pbmZvMzItPnBhcmFtc19kYXRhX3NpemU7CisJdXNfeHhfaW5mby0+cGFyYW1zX2RhdGEgPSBjb21wYXRfcHRyKHVzX3h4X2luZm8zMi0+cGFyYW1zX2RhdGEpOworCXVzX3h4X2luZm8tPm1heF9nZXRfc2V0X3BhcmFtX2J1Zl9zaXplID0KKwkJCSAgICB1c194eF9pbmZvMzItPm1heF9nZXRfc2V0X3BhcmFtX2J1Zl9zaXplOworfQorCitzdGF0aWMgaW50IHVzZl9zZXRfdHhfaW5mbzMyKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlMzIgY29uZmlnX3R4MzI7CisJc3RydWN0IHVzX3R4X2luZm9fdHlwZSBjb25maWdfdHg7CisKKwlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmY29uZmlnX3R4MzIsCisJCQkgICAgKHN0cnVjdCB1c190eF9pbmZvX3R5cGUzMiBfX3VzZXIgKikgYXJnLAorCQkJICAgIHNpemVvZihjb25maWdfdHgzMikpOworCisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgY29uZmlnX3R4IGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJbWVtc2V0KCZjb25maWdfdHgsIDAsIHNpemVvZihjb25maWdfdHgpKTsKKwl1c2ZfY29tcGF0X3h4X2luZm9fdHlwZSgmKGNvbmZpZ190eDMyLnVzX3h4X2luZm8pLAorCQkJCSYoY29uZmlnX3R4LnVzX3h4X2luZm8pKTsKKwljb25maWdfdHguaW5wdXRfaW5mbyA9IGNvbmZpZ190eDMyLmlucHV0X2luZm87CisKKwlyZXR1cm4gX191c2Zfc2V0X3R4X2luZm8odXNmLCAmY29uZmlnX3R4KTsKK30gLyogdXNmX3NldF90eF9pbmZvIDMyKi8KKworc3RhdGljIGludCB1c2Zfc2V0X3J4X2luZm8zMihzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHVzX3J4X2luZm9fdHlwZTMyIGNvbmZpZ19yeDMyOworCXN0cnVjdCB1c19yeF9pbmZvX3R5cGUgY29uZmlnX3J4OworCisJaW50IHJjID0gY29weV9mcm9tX3VzZXIoJmNvbmZpZ19yeDMyLAorCQkJCShzdHJ1Y3QgdXNfcnhfaW5mb190eXBlMzIgX191c2VyICopIGFyZywKKwkJCQlzaXplb2YoY29uZmlnX3J4MzIpKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IGNvbmZpZ19yeCBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCW1lbXNldCgmY29uZmlnX3J4LCAwLCBzaXplb2YoY29uZmlnX3J4KSk7CisJdXNmX2NvbXBhdF94eF9pbmZvX3R5cGUoJihjb25maWdfcngzMi51c194eF9pbmZvKSwKKwkJCQkmKGNvbmZpZ19yeC51c194eF9pbmZvKSk7CisKKwlyZXR1cm4gX191c2Zfc2V0X3J4X2luZm8odXNmLCAmY29uZmlnX3J4KTsKK30gLyogdXNmX3NldF9yeF9pbmZvMzIgKi8KKworc3RhdGljIGludCB1c2ZfZ2V0X3R4X3VwZGF0ZTMyKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZTMyIHVwZF90eF9pbmZvMzI7CisJc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUgdXBkX3R4X2luZm87CisKKwlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmdXBkX3R4X2luZm8zMiwKKwkJCQkoc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUzMiBfX3VzZXIgKikgYXJnLAorCQkJCXNpemVvZih1cGRfdHhfaW5mbzMyKSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB1cGRfdHhfaW5mbzMyIGZyb20gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltZW1zZXQoJnVwZF90eF9pbmZvLCAwLCBzaXplb2YodXBkX3R4X2luZm8pKTsKKwl1cGRfdHhfaW5mby5ldmVudF9jb3VudGVyID0gdXBkX3R4X2luZm8zMi5ldmVudF9jb3VudGVyOworCXVwZF90eF9pbmZvLmV2ZW50ID0gY29tcGF0X3B0cih1cGRfdHhfaW5mbzMyLmV2ZW50KTsKKwl1cGRfdHhfaW5mby5mcmVlX3JlZ2lvbiA9IHVwZF90eF9pbmZvMzIuZnJlZV9yZWdpb247CisJdXBkX3R4X2luZm8udGltZW91dCA9IHVwZF90eF9pbmZvMzIudGltZW91dDsKKwl1cGRfdHhfaW5mby5ldmVudF9maWx0ZXJzID0gdXBkX3R4X2luZm8zMi5ldmVudF9maWx0ZXJzOworCXVwZF90eF9pbmZvLnBhcmFtc19kYXRhX3NpemUgPSB1cGRfdHhfaW5mbzMyLnBhcmFtc19kYXRhX3NpemU7CisJdXBkX3R4X2luZm8ucGFyYW1zX2RhdGEgPSBjb21wYXRfcHRyKHVwZF90eF9pbmZvMzIucGFyYW1zX2RhdGEpOworCXVwZF90eF9pbmZvLnJlYWR5X3JlZ2lvbiA9IHVwZF90eF9pbmZvMzIucmVhZHlfcmVnaW9uOworCisJcmMgPSBfX3VzZl9nZXRfdHhfdXBkYXRlKHVzZiwgJnVwZF90eF9pbmZvKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGdldCB0eCB1cGRhdGUgZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBVcGRhdGUgb25seSB0aGUgZmllbGRzIHRoYXQgd2VyZSBjaGFuZ2VkICovCisJdXBkX3R4X2luZm8zMi5yZWFkeV9yZWdpb24gPSB1cGRfdHhfaW5mby5yZWFkeV9yZWdpb247CisKKwlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ1cGRfdHhfaW5mbzMyLAorCQkJICBzaXplb2YodXBkX3R4X2luZm8zMikpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF90eF9pbmZvMzIgdG8gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiB1c2ZfZ2V0X3R4X3VwZGF0ZSAqLworCitzdGF0aWMgaW50IHVzZl9zZXRfcnhfdXBkYXRlMzIoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlMzIgdXBkX3J4X2luZm8zMjsKKwlzdHJ1Y3QgdXNfcnhfdXBkYXRlX2luZm9fdHlwZSB1cGRfcnhfaW5mbzsKKworCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZ1cGRfcnhfaW5mbzMyLAorCQkJCShzdHJ1Y3QgdXNfcnhfdXBkYXRlX2luZm9fdHlwZTMyIF9fdXNlciAqKSBhcmcsCisJCQkJc2l6ZW9mKHVwZF9yeF9pbmZvMzIpKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF9yeF9pbmZvMzIgZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1lbXNldCgmdXBkX3J4X2luZm8sIDAsIHNpemVvZih1cGRfcnhfaW5mbykpOworCXVwZF9yeF9pbmZvLnJlYWR5X3JlZ2lvbiA9IHVwZF9yeF9pbmZvMzIucmVhZHlfcmVnaW9uOworCXVwZF9yeF9pbmZvLnBhcmFtc19kYXRhX3NpemUgPSB1cGRfcnhfaW5mbzMyLnBhcmFtc19kYXRhX3NpemU7CisJdXBkX3J4X2luZm8ucGFyYW1zX2RhdGEgPSBjb21wYXRfcHRyKHVwZF9yeF9pbmZvMzIucGFyYW1zX2RhdGEpOworCXVwZF9yeF9pbmZvLmZyZWVfcmVnaW9uID0gdXBkX3J4X2luZm8zMi5mcmVlX3JlZ2lvbjsKKworCXJjID0gX191c2Zfc2V0X3J4X3VwZGF0ZSh1c2ZfeHgsICZ1cGRfcnhfaW5mbyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBzZXQgcnggdXBkYXRlIGZhaWxlZDsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogVXBkYXRlIG9ubHkgdGhlIGZpZWxkcyB0aGF0IHdlcmUgY2hhbmdlZCAqLworCXVwZF9yeF9pbmZvMzIuZnJlZV9yZWdpb24gPSB1cGRfcnhfaW5mby5mcmVlX3JlZ2lvbjsKKworCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCSZ1cGRfcnhfaW5mbzMyLAorCQkJc2l6ZW9mKHVwZF9yeF9pbmZvMzIpKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSByeF9pbmZvMzIgdG8gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiB1c2Zfc2V0X3J4X3VwZGF0ZTMyICovCisKK3N0YXRpYyBpbnQgdXNmX3NldF91c19kZXRlY3Rpb24zMihzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUzMiBkZXRlY3RfaW5mbzMyOworCXN0cnVjdCB1c19kZXRlY3RfaW5mb190eXBlIGRldGVjdF9pbmZvOworCisJaW50IHJjID0gY29weV9mcm9tX3VzZXIoJmRldGVjdF9pbmZvMzIsCisJCQkJKHN0cnVjdCB1c19kZXRlY3RfaW5mb190eXBlMzIgX191c2VyICopIGFyZywKKwkJCQlzaXplb2YoZGV0ZWN0X2luZm8zMikpOworCisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgZGV0ZWN0X2luZm8zMiBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGRldGVjdF9pbmZvMzIucGFyYW1zX2RhdGFfc2l6ZSA+IFVTRl9NQVhfVVNFUl9CVUZfU0laRSkgeworCQlwcl9lcnIoIiVzOiB1c2VyIGJ1ZmZlciBzaXplIGV4Y2VlZHMgbWF4aW11bVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWVtc2V0KCZkZXRlY3RfaW5mbywgMCwgc2l6ZW9mKGRldGVjdF9pbmZvKSk7CisJZGV0ZWN0X2luZm8udXNfZGV0ZWN0b3IgPSBkZXRlY3RfaW5mbzMyLnVzX2RldGVjdG9yOworCWRldGVjdF9pbmZvLnVzX2RldGVjdF9tb2RlID0gZGV0ZWN0X2luZm8zMi51c19kZXRlY3RfbW9kZTsKKwlkZXRlY3RfaW5mby5za2lwX3RpbWUgPSBkZXRlY3RfaW5mbzMyLnNraXBfdGltZTsKKwlkZXRlY3RfaW5mby5wYXJhbXNfZGF0YV9zaXplID0gZGV0ZWN0X2luZm8zMi5wYXJhbXNfZGF0YV9zaXplOworCWRldGVjdF9pbmZvLnBhcmFtc19kYXRhID0gY29tcGF0X3B0cihkZXRlY3RfaW5mbzMyLnBhcmFtc19kYXRhKTsKKwlkZXRlY3RfaW5mby5kZXRlY3RfdGltZW91dCA9IGRldGVjdF9pbmZvMzIuZGV0ZWN0X3RpbWVvdXQ7CisJZGV0ZWN0X2luZm8uaXNfdXMgPSBkZXRlY3RfaW5mbzMyLmlzX3VzOworCisJcmMgPSBfX3VzZl9zZXRfdXNfZGV0ZWN0aW9uKHVzZiwgJmRldGVjdF9pbmZvKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldCB1cyBkZXRlY3Rpb24gZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBVcGRhdGUgb25seSB0aGUgZmllbGRzIHRoYXQgd2VyZSBjaGFuZ2VkICovCisJZGV0ZWN0X2luZm8zMi5pc191cyA9IGRldGVjdF9pbmZvLmlzX3VzOworCisJcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAorCQkJICAmZGV0ZWN0X2luZm8zMiwKKwkJCSAgc2l6ZW9mKGRldGVjdF9pbmZvMzIpKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSBkZXRlY3RfaW5mbzMyIHRvIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByYzsKK30gLyogdXNmX3NldF91c19kZXRlY3Rpb24zMiAqLworCitzdGF0aWMgaW50IHVzZl9nZXRfdmVyc2lvbjMyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZTMyIHZlcnNpb25faW5mbzMyOworCXN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZSB2ZXJzaW9uX2luZm87CisKKwlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmdmVyc2lvbl9pbmZvMzIsCisJCQkJKHN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZTMyIF9fdXNlciAqKSBhcmcsCisJCQkJc2l6ZW9mKHZlcnNpb25faW5mbzMyKSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSB2ZXJzaW9uX2luZm8zMiBmcm9tIHVzZXI7IHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWVtc2V0KCZ2ZXJzaW9uX2luZm8sIDAsIHNpemVvZih2ZXJzaW9uX2luZm8pKTsKKwl2ZXJzaW9uX2luZm8uYnVmX3NpemUgPSB2ZXJzaW9uX2luZm8zMi5idWZfc2l6ZTsKKwl2ZXJzaW9uX2luZm8ucGJ1ZiA9IGNvbXBhdF9wdHIodmVyc2lvbl9pbmZvMzIucGJ1Zik7CisKKwlyYyA9IF9fdXNmX2dldF92ZXJzaW9uKCZ2ZXJzaW9uX2luZm8pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogZ2V0IHZlcnNpb24gZmFpbGVkOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBOb25lIG9mIHRoZSBmaWVsZHMgd2VyZSBjaGFuZ2VkICovCisKKwlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICZ2ZXJzaW9uX2luZm8zMiwKKwkJCSAgc2l6ZW9mKHZlcnNpb25faW5mbzMyKSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGNvcHkgdmVyc2lvbl9pbmZvMzIgdG8gdXNlcjsgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfSAvKiB1c2ZfZ2V0X3ZlcnNpb24zMiAqLworCitzdGF0aWMgaW50IHVzZl9zZXRfc3RyZWFtX3BhcmFtMzIoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcsIGludCBkaXIpCit7CisJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIgc2V0X3N0cmVhbV9wYXJhbTMyOworCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBzZXRfc3RyZWFtX3BhcmFtOworCWludCByYyA9IDA7CisKKwlyYyA9IGNvcHlfZnJvbV91c2VyKCZzZXRfc3RyZWFtX3BhcmFtMzIsCisJCQkoc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIgX191c2VyICopIGFyZywKKwkJCXNpemVvZihzZXRfc3RyZWFtX3BhcmFtMzIpKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IHNldF9zdHJlYW1fcGFyYW0gZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1lbXNldCgmc2V0X3N0cmVhbV9wYXJhbSwgMCwgc2l6ZW9mKHNldF9zdHJlYW1fcGFyYW0pKTsKKwlzZXRfc3RyZWFtX3BhcmFtLm1vZHVsZV9pZCA9IHNldF9zdHJlYW1fcGFyYW0zMi5tb2R1bGVfaWQ7CisJc2V0X3N0cmVhbV9wYXJhbS5wYXJhbV9pZCA9IHNldF9zdHJlYW1fcGFyYW0zMi5wYXJhbV9pZDsKKwlzZXRfc3RyZWFtX3BhcmFtLmJ1Zl9zaXplID0gc2V0X3N0cmVhbV9wYXJhbTMyLmJ1Zl9zaXplOworCXNldF9zdHJlYW1fcGFyYW0ucGJ1ZiA9IGNvbXBhdF9wdHIoc2V0X3N0cmVhbV9wYXJhbTMyLnBidWYpOworCisJcmV0dXJuIF9fdXNmX3NldF9zdHJlYW1fcGFyYW0odXNmX3h4LCAmc2V0X3N0cmVhbV9wYXJhbSwgZGlyKTsKK30gLyogdXNmX3NldF9zdHJlYW1fcGFyYW0zMiAqLworCitzdGF0aWMgaW50IHVzZl9nZXRfc3RyZWFtX3BhcmFtMzIoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcsIGludCBkaXIpCit7CisJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIgZ2V0X3N0cmVhbV9wYXJhbTMyOworCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBnZXRfc3RyZWFtX3BhcmFtOworCWludCByYyA9IDA7CisKKwlyYyA9IGNvcHlfZnJvbV91c2VyKCZnZXRfc3RyZWFtX3BhcmFtMzIsCisJCQkoc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIgX191c2VyICopIGFyZywKKwkJCXNpemVvZihnZXRfc3RyZWFtX3BhcmFtMzIpKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBjb3B5IGdldF9zdHJlYW1fcGFyYW0gZnJvbSB1c2VyOyByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1lbXNldCgmZ2V0X3N0cmVhbV9wYXJhbSwgMCwgc2l6ZW9mKGdldF9zdHJlYW1fcGFyYW0pKTsKKwlnZXRfc3RyZWFtX3BhcmFtLm1vZHVsZV9pZCA9IGdldF9zdHJlYW1fcGFyYW0zMi5tb2R1bGVfaWQ7CisJZ2V0X3N0cmVhbV9wYXJhbS5wYXJhbV9pZCA9IGdldF9zdHJlYW1fcGFyYW0zMi5wYXJhbV9pZDsKKwlnZXRfc3RyZWFtX3BhcmFtLmJ1Zl9zaXplID0gZ2V0X3N0cmVhbV9wYXJhbTMyLmJ1Zl9zaXplOworCWdldF9zdHJlYW1fcGFyYW0ucGJ1ZiA9IGNvbXBhdF9wdHIoZ2V0X3N0cmVhbV9wYXJhbTMyLnBidWYpOworCisJcmV0dXJuIF9fdXNmX2dldF9zdHJlYW1fcGFyYW0odXNmX3h4LCAmZ2V0X3N0cmVhbV9wYXJhbSwgZGlyKTsKK30gLyogdXNmX2dldF9zdHJlYW1fcGFyYW0zMiAqLworCitzdGF0aWMgbG9uZyBfX3VzZl9jb21wYXRfaW9jdGwoc3RydWN0IHVzZl90eXBlICp1c2YsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSBOVUxMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFVTX1NUQVJUX1RYOgorCWNhc2UgVVNfU1RBUlRfUlg6CisJY2FzZSBVU19TVE9QX1RYOgorCWNhc2UgVVNfU1RPUF9SWDogeworCQlyZXR1cm4gX191c2ZfaW9jdGwodXNmLCBjbWQsIGFyZyk7CisJfQorCisJY2FzZSBVU19TRVRfVFhfSU5GTzMyOiB7CisJCXVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKwkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9PUEVORURfU1RBVEUpCisJCQlyYyA9IHVzZl9zZXRfdHhfaW5mbzMyKHVzZiwgYXJnKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzZXRfdHhfaW5mbzMyOiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKworCQlicmVhazsKKwl9IC8qIFVTX1NFVF9UWF9JTkZPMzIgKi8KKworCWNhc2UgVVNfU0VUX1JYX0lORk8zMjogeworCQl1c2ZfeHggPSAmdXNmLT51c2Zfcng7CisJCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfT1BFTkVEX1NUQVRFKQorCQkJcmMgPSB1c2Zfc2V0X3J4X2luZm8zMih1c2YsIGFyZyk7CisJCWVsc2UgeworCQkJcHJfZXJyKCIlczogc2V0X3J4X2luZm8zMjogd3Jvbmcgc3RhdGVbJWRdXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXVzZl94eC0+dXNmX3N0YXRlKTsKKwkJCXJldHVybiAtRUJBREZEOworCQl9CisKKwkJYnJlYWs7CisJfSAvKiBVU19TRVRfUlhfSU5GTzMyICovCisKKwljYXNlIFVTX0dFVF9UWF9VUERBVEUzMjogeworCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKworCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCisJCQlyYyA9IHVzZl9nZXRfdHhfdXBkYXRlMzIodXNmLCBhcmcpOworCQllbHNlIHsKKwkJCXByX2VycigiJXM6IGdldF90eF91cGRhdGUzMjogd3Jvbmcgc3RhdGVbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLAorCQkJICAgICAgIHVzZl94eC0+dXNmX3N0YXRlKTsKKwkJCXJjID0gLUVCQURGRDsKKwkJfQorCQlicmVhazsKKwl9IC8qIFVTX0dFVF9UWF9VUERBVEUzMiAqLworCisJY2FzZSBVU19TRVRfUlhfVVBEQVRFMzI6IHsKKwkJc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAmdXNmLT51c2Zfcng7CisKKwkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9XT1JLX1NUQVRFKQorCQkJcmMgPSB1c2Zfc2V0X3J4X3VwZGF0ZTMyKHVzZl94eCwgYXJnKTsKKwkJZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBzZXRfcnhfdXBkYXRlOiB3cm9uZyBzdGF0ZVslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sCisJCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOworCQkJcmMgPSAtRUJBREZEOworCQl9CisJCWJyZWFrOworCX0gLyogVVNfU0VUX1JYX1VQREFURTMyICovCisKKwljYXNlIFVTX1NFVF9ERVRFQ1RJT04zMjogeworCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl90eDsKKworCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCisJCQlyYyA9IHVzZl9zZXRfdXNfZGV0ZWN0aW9uMzIodXNmLCBhcmcpOworCQllbHNlIHsKKwkJCXByX2VycigiJXM6IHNldCB1cyBkZXRlY3Rpb246IHdyb25nIHN0YXRlWyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywKKwkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7CisJCQlyYyA9IC1FQkFERkQ7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBVU19TRVRfREVURUNUSU9OMzIgKi8KKworCWNhc2UgVVNfR0VUX1ZFUlNJT04zMjogeworCQlyYyA9IHVzZl9nZXRfdmVyc2lvbjMyKGFyZyk7CisJCWJyZWFrOworCX0gLyogVVNfR0VUX1ZFUlNJT04zMiAqLworCisJY2FzZSBVU19TRVRfVFhfU1RSRUFNX1BBUkFNMzI6IHsKKwkJcmMgPSB1c2Zfc2V0X3N0cmVhbV9wYXJhbTMyKCZ1c2YtPnVzZl90eCwgYXJnLCBPVVQpOworCQlicmVhazsKKwl9IC8qIFVTX1NFVF9UWF9TVFJFQU1fUEFSQU0zMiAqLworCisJY2FzZSBVU19HRVRfVFhfU1RSRUFNX1BBUkFNMzI6IHsKKwkJcmMgPSB1c2ZfZ2V0X3N0cmVhbV9wYXJhbTMyKCZ1c2YtPnVzZl90eCwgYXJnLCBPVVQpOworCQlicmVhazsKKwl9IC8qIFVTX0dFVF9UWF9TVFJFQU1fUEFSQU0zMiAqLworCisJY2FzZSBVU19TRVRfUlhfU1RSRUFNX1BBUkFNMzI6IHsKKwkJcmMgPSB1c2Zfc2V0X3N0cmVhbV9wYXJhbTMyKCZ1c2YtPnVzZl9yeCwgYXJnLCBJTik7CisJCWJyZWFrOworCX0gLyogVVNfU0VUX1JYX1NUUkVBTV9QQVJBTTMyICovCisKKwljYXNlIFVTX0dFVF9SWF9TVFJFQU1fUEFSQU0zMjogeworCQlyYyA9IHVzZl9nZXRfc3RyZWFtX3BhcmFtMzIoJnVzZi0+dXNmX3J4LCBhcmcsIElOKTsKKwkJYnJlYWs7CisJfSAvKiBVU19HRVRfUlhfU1RSRUFNX1BBUkFNMzIgKi8KKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIElPQ1RMIGNvbW1hbmQgWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLAorCQkgICAgICAgY21kKTsKKwkJcmMgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgJiYKKwkgICAgKChjbWQgPT0gVVNfU0VUX1RYX0lORk8pIHx8CisJICAgICAoY21kID09IFVTX1NFVF9SWF9JTkZPKSkpCisJCXJlbGVhc2VfeHgodXNmX3h4KTsKKworCXJldHVybiByYzsKK30gLyogX191c2ZfY29tcGF0X2lvY3RsICovCisKK3N0YXRpYyBsb25nIHVzZl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c2ZfdHlwZSAqdXNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwltdXRleF9sb2NrKCZ1c2YtPm11dGV4KTsKKwlyYyA9IF9fdXNmX2NvbXBhdF9pb2N0bCh1c2YsIGNtZCwgYXJnKTsKKwltdXRleF91bmxvY2soJnVzZi0+bXV0ZXgpOworCisJcmV0dXJuIHJjOworfSAvKiB1c2ZfY29tcGF0X2lvY3RsICovCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCitzdGF0aWMgaW50IHVzZl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtcykKK3sKKwlzdHJ1Y3QgdXNmX3R5cGUgKnVzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZGlyID0gT1VUOworCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gJnVzZi0+dXNmX3R4OworCWludCByYyA9IDA7CisKKwltdXRleF9sb2NrKCZ1c2YtPm11dGV4KTsKKwlpZiAodm1zLT52bV9mbGFncyAmIFVTRl9WTV9XUklURSkgeyAvKiBSWCBidWYgbWFwcGluZyAqLworCQlkaXIgPSBJTjsKKwkJdXNmX3h4ID0gJnVzZi0+dXNmX3J4OworCX0KKwlyYyA9IHE2dXNtX2dldF92aXJ0dWFsX2FkZHJlc3MoZGlyLCB1c2ZfeHgtPnVzYywgdm1zKTsKKwltdXRleF91bmxvY2soJnVzZi0+bXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdWludDE2X3QgYWRkX29wZW5lZF9kZXYoaW50IG1pbm9yKQoreworCXVpbnQxNl90IGluZCA9IDA7CisKKwlmb3IgKGluZCA9IDA7IGluZCA8IE1BWF9ERVZTX05VTUJFUjsgKytpbmQpIHsKKwkJaWYgKG1pbm9yID09IHNfb3BlbmVkX2RldnNbaW5kXSkgeworCQkJcHJfZXJyKCIlczogZGV2aWNlICVkIGlzIGFscmVhZHkgb3BlbmVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBtaW5vcik7CisJCQlyZXR1cm4gVVNGX1VOREVGX0RFVl9JRDsKKwkJfQorCisJCWlmIChzX29wZW5lZF9kZXZzW2luZF0gPT0gMCkgeworCQkJc19vcGVuZWRfZGV2c1tpbmRdID0gbWlub3I7CisJCQlwcl9kZWJ1ZygiJXM6IGRldmljZSAlZCBpcyBhZGRlZDsgaW5kPSVkXG4iLAorCQkJCV9fZnVuY19fLCBtaW5vciwgaW5kKTsKKwkJCXJldHVybiBpbmQ7CisJCX0KKwl9CisKKwlwcl9lcnIoIiVzOiB0aGVyZSBpcyBubyBwbGFjZSBmb3IgZGV2aWNlICVkXG4iLAorCSAgICAgICBfX2Z1bmNfXywgbWlub3IpOworCXJldHVybiBVU0ZfVU5ERUZfREVWX0lEOworfQorCitzdGF0aWMgaW50IHVzZl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2ZfdHlwZSAqdXNmID0gIE5VTEw7CisJdWludDE2X3QgZGV2X2luZCA9IDA7CisJaW50IG1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CisKKwlkZXZfaW5kID0gYWRkX29wZW5lZF9kZXYobWlub3IpOworCWlmIChkZXZfaW5kID09IFVTRl9VTkRFRl9ERVZfSUQpCisJCXJldHVybiAtRUJVU1k7CisKKwl1c2YgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNmX3R5cGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd2FrZXVwX3NvdXJjZV9pbml0KCZ1c2Zfd2FrZXVwX3NvdXJjZSwgInVzZiIpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdXNmOworCXVzZi0+ZGV2X2luZCA9IGRldl9pbmQ7CisKKwl1c2YtPnVzZl90eC51c2Zfc3RhdGUgPSBVU0ZfT1BFTkVEX1NUQVRFOworCXVzZi0+dXNmX3J4LnVzZl9zdGF0ZSA9IFVTRl9PUEVORURfU1RBVEU7CisKKwl1c2YtPnVzZl90eC51c19kZXRlY3RfdHlwZSA9IFVTRl9VU19ERVRFQ1RfVU5ERUY7CisJdXNmLT51c2ZfcngudXNfZGV0ZWN0X3R5cGUgPSBVU0ZfVVNfREVURUNUX1VOREVGOworCisJbXV0ZXhfaW5pdCgmdXNmLT5tdXRleCk7CisKKwlwcl9kZWJ1ZygiJXM6dXNmIGluIG9wZW5cbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2ZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNmX3R5cGUgKnVzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlczogcmVsZWFzZSBlbnRyeVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmdXNmLT5tdXRleCk7CisJdXNmX3JlbGVhc2VfaW5wdXQodXNmKTsKKworCXVzZl9kaXNhYmxlKCZ1c2YtPnVzZl90eCk7CisJdXNmX2Rpc2FibGUoJnVzZi0+dXNmX3J4KTsKKworCXNfb3BlbmVkX2RldnNbdXNmLT5kZXZfaW5kXSA9IDA7CisKKwl3YWtldXBfc291cmNlX3RyYXNoKCZ1c2Zfd2FrZXVwX3NvdXJjZSk7CisJbXV0ZXhfdW5sb2NrKCZ1c2YtPm11dGV4KTsKKwltdXRleF9kZXN0cm95KCZ1c2YtPm11dGV4KTsKKwlrZnJlZSh1c2YpOworCXByX2RlYnVnKCIlczogcmVsZWFzZSBleGl0XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBsb25nIHVzZl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNmX2ZvcHMgPSB7CisJLm93bmVyICAgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgICAgICAgICA9IHVzZl9vcGVuLAorCS5yZWxlYXNlICAgICAgICAgICAgICAgID0gdXNmX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gdXNmX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gdXNmX2NvbXBhdF9pb2N0bCwKKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisJLm1tYXAgICAgICAgICAgICAgICAgICAgPSB1c2ZfbW1hcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1c2ZfbWlzY1tNQVhfREVWU19OVU1CRVJdID0geworCXsKKwkJLm1pbm9yICA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkJLm5hbWUgICA9ICJ1c2YxIiwKKwkJLmZvcHMgICA9ICZ1c2ZfZm9wcywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNmX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCXVpbnQxNl90IGluZCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IFVTRiBTVyB2ZXJzaW9uICVzLlxuIiwgX19mdW5jX18sIERSVl9WRVJTSU9OKTsKKwlwcl9kZWJ1ZygiJXM6IE1heCAlZCBkZXZzIHJlZ2lzdHJhdGlvblxuIiwgX19mdW5jX18sIE1BWF9ERVZTX05VTUJFUik7CisKKwlmb3IgKGluZCA9IDA7IGluZCA8IE1BWF9ERVZTX05VTUJFUjsgKytpbmQpIHsKKwkJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ1c2ZfbWlzY1tpbmRdKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBtaXNjX3JlZ2lzdGVyKCkgZmFpbGVkIGluZD0lZDsgcmMgPSAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgaW5kLCByYyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworZGV2aWNlX2luaXRjYWxsKHVzZl9pbml0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJVbHRyYXNvdW5kIGZyYW1ld29yayBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2ZjZGV2LmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGFhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5jCkBAIC0wLDAgKzEsNDIyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L210Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlICJ1c2ZjZGV2LmgiCisKKyNkZWZpbmUgVU5ERUZfSUQgICAgMHhmZmZmZmZmZgorI2RlZmluZSBTTE9UX0NNRF9JRCAwCisjZGVmaW5lIE1BWF9SRVRSSUVTIDEwCisKK2VudW0gdXNkZXZfZXZlbnRfc3RhdHVzIHsKKwlVU0ZDREVWX0VWRU5UX0VOQUJMRUQsCisJVVNGQ0RFVl9FVkVOVF9ESVNBQkxJTkcsCisJVVNGQ0RFVl9FVkVOVF9ESVNBQkxFRCwKK307CisKK3N0cnVjdCB1c2ZjZGV2X2V2ZW50IHsKKwlib29sICgqbWF0Y2hfY2IpKHVpbnQxNl90LCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOworCWJvb2wgcmVnaXN0ZXJlZF9ldmVudDsKKwlib29sIGludGVybGVhdmVkOworCWVudW0gdXNkZXZfZXZlbnRfc3RhdHVzIGV2ZW50X3N0YXR1czsKK307CitzdGF0aWMgc3RydWN0IHVzZmNkZXZfZXZlbnQgc191c2ZjZGV2X2V2ZW50c1tNQVhfRVZFTlRfVFlQRV9OVU1dOworCitzdHJ1Y3QgdXNmY2Rldl9pbnB1dF9jb21tYW5kIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY29kZTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7Cit9OworCitzdGF0aWMgbG9uZyAgc191c2ZfcGlkOworCitzdGF0aWMgYm9vbCB1c2ZjZGV2X2ZpbHRlcihzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsCisJCQkgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpOworc3RhdGljIGJvb2wgdXNmY2Rldl9tYXRjaChzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwKKwkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOworc3RhdGljIGludCB1c2ZjZGV2X2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsCisJCQkJc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIHVzZmNkZXZfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlucHV0X2RldmljZV9pZCB1c2ZjX3RzY19pZHNbXSA9IHsKKwl7CisJCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8CisJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfS0VZQklUIHwKKwkJCUlOUFVUX0RFVklDRV9JRF9NQVRDSF9BQlNCSVQsCisJCS5ldmJpdCA9IHsgQklUX01BU0soRVZfQUJTKSB8IEJJVF9NQVNLKEVWX0tFWSkgfSwKKwkJLmtleWJpdCA9IHsgW0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKSB9LAorCQkvKiBhc3N1bXB0aW9uOiBBQlNfWCAmIEFCU19ZIGFyZSBpbiB0aGUgc2FtZSBsb25nICovCisJCS5hYnNiaXQgPSB7IFtCSVRfV09SRChBQlNfWCldID0gQklUX01BU0soQUJTX1gpIHwKKwkJCQkJCUJJVF9NQVNLKEFCU19ZKSB9LAorCX0sCisJeworCQkuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQgfAorCQkJSU5QVVRfREVWSUNFX0lEX01BVENIX0tFWUJJVCB8CisJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfQUJTQklULAorCQkuZXZiaXQgPSB7IEJJVF9NQVNLKEVWX0FCUykgfCBCSVRfTUFTSyhFVl9LRVkpIH0sCisJCS5rZXliaXQgPSB7IFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCkgfSwKKwkJLyogYXNzdW1wdGlvbjogTVRfLi5fWCAmIE1UXy4uX1kgYXJlIGluIHRoZSBzYW1lIGxvbmcgKi8KKwkJLmFic2JpdCA9IHsgW0JJVF9XT1JEKEFCU19NVF9QT1NJVElPTl9YKV0gPQorCQkJQklUX01BU0soQUJTX01UX1BPU0lUSU9OX1gpIHwKKwkJCUJJVF9NQVNLKEFCU19NVF9QT1NJVElPTl9ZKSB9LAorCX0sCisJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlucHV0LCB1c2ZjX3RzY19pZHMpOworCitzdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZXIgc191c2ZjX2hhbmRsZXJzW01BWF9FVkVOVF9UWVBFX05VTV0gPSB7CisJeyAvKiBUU0MgaGFuZGxlciAqLworCQkuZmlsdGVyICAgICAgICAgPSB1c2ZjZGV2X2ZpbHRlciwKKwkJLm1hdGNoICAgICAgICAgID0gdXNmY2Rldl9tYXRjaCwKKwkJLmNvbm5lY3QgICAgICAgID0gdXNmY2Rldl9jb25uZWN0LAorCQkuZGlzY29ubmVjdCAgICAgPSB1c2ZjZGV2X2Rpc2Nvbm5lY3QsCisJCS8qIC5taW5vciBjYW4gYmUgdXNlZCBhcyBpbmRleCBpbiB0aGUgY29udGFpbmVyLCAqLworCQkvKiAgYmVjYXVzZSAuZm9wcyBpc24ndCBzdXBwb3J0ZWQgKi8KKwkJLm1pbm9yICAgICAgICAgID0gVFNDX0VWRU5UX1RZUEVfSU5ELAorCQkubmFtZSAgICAgICAgICAgPSAidXNmY190c2NfaGFuZGxlciIsCisJCS5pZF90YWJsZSAgICAgICA9IHVzZmNfdHNjX2lkcywKKwl9LAorfTsKKworLyoKKyAqIEZvciBlYWNoIGV2ZW50IHR5cGUsIHRoZXJlIGFyZSBhIG51bWJlciBjb25mbGljdGluZyBkZXZpY2VzIChoYW5kbGVzKQorICogVGhlIGZpcnN0IHJlZ2lzdGVyZWQgZGV2aWNlIChwcmltYXJ5KSBpcyByZWFsIFRTQyBkZXZpY2U7IGl0J3MgbWFuZGF0b3J5CisgKiBPcHRpb25hbGx5LCBsYXRlciByZWdpc3RlcmVkIGRldmljZXMgYXJlIHNpbXVsYXRlZCBvbmVzLgorICogVGhleSBhcmUgZHluYW1pY2FsbHkgbWFuYWdlZAorICogVGhlIHByaW1hcnkgZGV2aWNlJ3MgaGFuZGxlcyBhcmUgc3RvcmVkIGluIHRoZSBiZWxvdyBzdGF0aWMgYXJyYXkKKyAqLworc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGUgc191c2ZjX3ByaW1hcnlfaGFuZGxlc1tNQVhfRVZFTlRfVFlQRV9OVU1dID0geworCXsgLyogVFNDIGhhbmRsZSAqLworCQkuaGFuZGxlcgk9ICZzX3VzZmNfaGFuZGxlcnNbVFNDX0VWRU5UX1RZUEVfSU5EXSwKKwkJLm5hbWUJCT0gInVzZmNfdHNjX2hhbmRsZSIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNmY2Rldl9pbnB1dF9jb21tYW5kIGluaXRpYWxfY2xlYXJfY21kc1tdID0geworCXtFVl9BQlMsIEFCU19QUkVTU1VSRSwgICAgICAgICAgICAgICAwfSwKKwl7RVZfS0VZLCBCVE5fVE9VQ0gsICAgICAgICAgICAgICAgICAgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHVzZmNkZXZfaW5wdXRfY29tbWFuZCBzbG90X2NsZWFyX2NtZHNbXSA9IHsKKwl7RVZfQUJTLCBBQlNfTVRfU0xPVCwgICAgICAgICAgICAgICAwfSwKKwl7RVZfQUJTLCBBQlNfTVRfVFJBQ0tJTkdfSUQsIFVOREVGX0lEfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNmY2Rldl9pbnB1dF9jb21tYW5kIG5vX2ZpbHRlcl9jbWRzW10gPSB7CisJe0VWX0FCUywgQUJTX01UX1NMT1QsICAgICAgICAgICAgICAgMH0sCisJe0VWX0FCUywgQUJTX01UX1RSQUNLSU5HX0lELCBVTkRFRl9JRH0sCisJe0VWX1NZTiwgU1lOX1JFUE9SVCwgICAgICAgICAgICAgICAgMH0sCit9OworCitzdGF0aWMgYm9vbCB1c2ZjZGV2X21hdGNoKHN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyLCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJYm9vbCByYyA9IGZhbHNlOworCWludCBpbmQgPSBoYW5kbGVyLT5taW5vcjsKKworCXByX2RlYnVnKCIlczogbmFtZT1bJXNdOyBpbmQ9JWRcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUsIGluZCk7CisKKwlpZiAoc191c2ZjZGV2X2V2ZW50c1tpbmRdLnJlZ2lzdGVyZWRfZXZlbnQgJiYKKwkJc191c2ZjZGV2X2V2ZW50c1tpbmRdLm1hdGNoX2NiKSB7CisJCXJjID0gKCpzX3VzZmNkZXZfZXZlbnRzW2luZF0ubWF0Y2hfY2IpKCh1aW50MTZfdClpbmQsIGRldik7CisJCXByX2RlYnVnKCIlczogWyVzXTsgcmM9JWRcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUsIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVzZmNkZXZfY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwgc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQgPSAwOworCXVpbnQxNl90IGluZCA9IGhhbmRsZXItPm1pbm9yOworCXN0cnVjdCBpbnB1dF9oYW5kbGUgKnVzZmNfaGFuZGxlID0gTlVMTDsKKworCWlmIChzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2luZF0uZGV2ID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBwcmltYXJ5IGRldmljZTsgaW5kPSVkXG4iLAorCQkJX19mdW5jX18sCisJCQlpbmQpOworCQl1c2ZjX2hhbmRsZSA9ICZzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2luZF07CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBzZWNvbmRhcnkgZGV2aWNlOyBpbmQ9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWluZCk7CisJCXVzZmNfaGFuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2hhbmRsZSksCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXVzZmNfaGFuZGxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdXNmY19oYW5kbGUtPmhhbmRsZXIgPSAmc191c2ZjX2hhbmRsZXJzW2luZF07CisJCXVzZmNfaGFuZGxlLT5uYW1lID0gc191c2ZjX3ByaW1hcnlfaGFuZGxlc1tpbmRdLm5hbWU7CisJfQorCXVzZmNfaGFuZGxlLT5kZXYgPSBkZXY7CisJcmV0ID0gaW5wdXRfcmVnaXN0ZXJfaGFuZGxlKHVzZmNfaGFuZGxlKTsKKwlwcl9kZWJ1ZygiJXM6IG5hbWU9WyVzXTsgaW5kPSVkOyBkZXY9MHglcEtcbiIsCisJCSBfX2Z1bmNfXywKKwkJZGV2LT5uYW1lLAorCQlpbmQsCisJCXVzZmNfaGFuZGxlLT5kZXYpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IGlucHV0X3JlZ2lzdGVyX2hhbmRsZVslZF0gZmFpbGVkOiByZXQ9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWluZCwKKwkJCXJldCk7CisJZWxzZSB7CisJCXJldCA9IGlucHV0X29wZW5fZGV2aWNlKHVzZmNfaGFuZGxlKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogaW5wdXRfb3Blbl9kZXZpY2VbJWRdIGZhaWxlZDogcmV0PSVkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWluZCwKKwkJCQlyZXQpOworCQkJaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGUodXNmY19oYW5kbGUpOworCQl9IGVsc2UKKwkJCXByX2RlYnVnKCIlczogZGV2aWNlWyVkXSBpcyBvcGVuZWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJaW5kKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1c2ZjZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlKQoreworCWludCBpbmQgPSBoYW5kbGUtPmhhbmRsZXItPm1pbm9yOworCisJaW5wdXRfY2xvc2VfZGV2aWNlKGhhbmRsZSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGUoaGFuZGxlKTsKKwlwcl9kZWJ1ZygiJXM6IGhhbmRsZVslZF0sIG5hbWU9WyVzXSBpcyBkaXNjb25uZWN0ZWRcbiIsCisJCV9fZnVuY19fLAorCQlpbmQsCisJCWhhbmRsZS0+ZGV2LT5uYW1lKTsKKwlpZiAoc191c2ZjX3ByaW1hcnlfaGFuZGxlc1tpbmRdLmRldiA9PSBoYW5kbGUtPmRldikKKwkJc191c2ZjX3ByaW1hcnlfaGFuZGxlc1tpbmRdLmRldiA9IE5VTEw7CisJZWxzZQorCQlrZnJlZShoYW5kbGUpOworfQorCitzdGF0aWMgYm9vbCB1c2ZjZGV2X2ZpbHRlcihzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsCisJCQl1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKK3sKKwl1aW50MTZfdCBpID0gMDsKKwl1aW50MTZfdCBpbmQgPSAodWludDE2X3QpaGFuZGxlLT5oYW5kbGVyLT5taW5vcjsKKwlib29sIHJjID0gKHNfdXNmY2Rldl9ldmVudHNbaW5kXS5ldmVudF9zdGF0dXMgIT0gVVNGQ0RFVl9FVkVOVF9FTkFCTEVEKTsKKworCWlmIChzX3VzZl9waWQgPT0gc3lzX2dldHBpZCgpKSB7CisJCS8qIFBhc3MgZXZlbnRzIGZyb20gdXNmY2RldiBkcml2ZXIgKi8KKwkJcmMgPSBmYWxzZTsKKwkJcHJfZGVidWcoIiVzOiBldmVudF90eXBlPSVkOyB0eXBlPSVkOyBjb2RlPSVkOyB2YWw9JWQiLAorCQkJX19mdW5jX18sCisJCQlpbmQsCisJCQl0eXBlLAorCQkJY29kZSwKKwkJCXZhbHVlKTsKKwl9IGVsc2UgaWYgKHNfdXNmY2Rldl9ldmVudHNbaW5kXS5ldmVudF9zdGF0dXMgPT0KKwkJCQkJCVVTRkNERVZfRVZFTlRfRElTQUJMSU5HKSB7CisJCXVpbnQzMl90IHVfdmFsdWUgPSB2YWx1ZTsKKworCQlzX3VzZmNkZXZfZXZlbnRzW2luZF0uaW50ZXJsZWF2ZWQgPSB0cnVlOworCQkvKiBQYXNzIGV2ZW50cyBmb3IgZnJlZWluZyBzbG90cyBmcm9tIFRTQyBkcml2ZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobm9fZmlsdGVyX2NtZHMpOyArK2kpIHsKKwkJCWlmICgobm9fZmlsdGVyX2NtZHNbaV0udHlwZSA9PSB0eXBlKSAmJgorCQkJICAgIChub19maWx0ZXJfY21kc1tpXS5jb2RlID09IGNvZGUpICYmCisJCQkgICAgKG5vX2ZpbHRlcl9jbWRzW2ldLnZhbHVlIDw9IHVfdmFsdWUpKSB7CisJCQkJcmMgPSBmYWxzZTsKKwkJCQlwcl9kZWJ1ZygiJXM6IG5vX2ZpbHRlcl9jbWRzWyVkXTsgJWQiLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJaSwKKwkJCQkJbm9fZmlsdGVyX2NtZHNbaV0udmFsdWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitib29sIHVzZmNkZXZfcmVnaXN0ZXIoCisJdWludDE2X3QgZXZlbnRfdHlwZV9pbmQsCisJYm9vbCAoKm1hdGNoX2NiKSh1aW50MTZfdCwgc3RydWN0IGlucHV0X2RldiAqZGV2KSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlib29sIHJjID0gZmFsc2U7CisKKwlpZiAoKGV2ZW50X3R5cGVfaW5kID49IE1BWF9FVkVOVF9UWVBFX05VTSkgfHwgIW1hdGNoX2NiKSB7CisJCXByX2VycigiJXM6IHdyb25nIGlucHV0OiBldmVudF90eXBlX2luZD0lZDsgbWF0Y2hfY2I9MHglcEtcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kLAorCQkJbWF0Y2hfY2IpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLnJlZ2lzdGVyZWRfZXZlbnQpIHsKKwkJcHJfaW5mbygiJXM6IGhhbmRsZXJbJWRdIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCA9IHRydWU7CisJc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ubWF0Y2hfY2IgPSBtYXRjaF9jYjsKKwlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5ldmVudF9zdGF0dXMgPSBVU0ZDREVWX0VWRU5UX0VOQUJMRUQ7CisJcmV0ID0gaW5wdXRfcmVnaXN0ZXJfaGFuZGxlcigmc191c2ZjX2hhbmRsZXJzW2V2ZW50X3R5cGVfaW5kXSk7CisJaWYgKCFyZXQpIHsKKwkJcmMgPSB0cnVlOworCQlwcl9kZWJ1ZygiJXM6IGhhbmRsZXJbJWRdIHdhcyByZWdpc3RlcmVkXG4iLAorCQkJX19mdW5jX18sCisJCQlldmVudF90eXBlX2luZCk7CisJfSBlbHNlIHsKKwkJc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCA9IGZhbHNlOworCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5tYXRjaF9jYiA9IE5VTEw7CisJCXByX2VycigiJXM6IGhhbmRsZXJbJWRdIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6IHJldD0lZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZXZlbnRfdHlwZV9pbmQsCisJCQlyZXQpOworCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCB1c2ZjZGV2X3VucmVnaXN0ZXIodWludDE2X3QgZXZlbnRfdHlwZV9pbmQpCit7CisJaWYgKGV2ZW50X3R5cGVfaW5kID49IE1BWF9FVkVOVF9UWVBFX05VTSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dDogZXZlbnRfdHlwZV9pbmQ9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZXIoJnNfdXNmY19oYW5kbGVyc1tldmVudF90eXBlX2luZF0pOworCQlwcl9kZWJ1ZygiJXM6IGhhbmRsZXJbJWRdIHdhcyB1bnJlZ2lzdGVyZWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kKTsKKwkJc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCA9IGZhbHNlOworCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5tYXRjaF9jYiA9IE5VTEw7CisJCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmV2ZW50X3N0YXR1cyA9CisJCQkJCQkJVVNGQ0RFVl9FVkVOVF9FTkFCTEVEOworCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXNmY2Rldl9zZW5kX2NtZCgKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJc3RydWN0IHVzZmNkZXZfaW5wdXRfY29tbWFuZCBjbWQpCit7CisJaW5wdXRfZXZlbnQoZGV2LCBjbWQudHlwZSwgY21kLmNvZGUsIGNtZC52YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZmNkZXZfY2xlYW5fZGV2KHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IE5VTEw7CisJaW50IGk7CisJaW50IGo7CisJaW50IHJldHJpZXMgPSAwOworCisJaWYgKGV2ZW50X3R5cGVfaW5kID49IE1BWF9FVkVOVF9UWVBFX05VTSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dDogZXZlbnRfdHlwZV9pbmQ9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kKTsKKwkJcmV0dXJuOworCX0KKwkvKiBPbmx5IHByaW1hcnkgZGV2aWNlIG11c3QgZXhpc3QgKi8KKwlkZXYgPSBzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2V2ZW50X3R5cGVfaW5kXS5kZXY7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5VTEwgcHJpbWFyeSBkZXZpY2VcbiIsCisJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRpYWxfY2xlYXJfY21kcyk7IGkrKykKKwkJdXNmY2Rldl9zZW5kX2NtZChkZXYsIGluaXRpYWxfY2xlYXJfY21kc1tpXSk7CisJaW5wdXRfc3luYyhkZXYpOworCisJLyogU2VuZCBjb21tYW5kcyB0byBmcmVlIGFsbCBzbG90cyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm10LT5udW1fc2xvdHM7IGkrKykgeworCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5pbnRlcmxlYXZlZCA9IGZhbHNlOworCQlpZiAoaW5wdXRfbXRfZ2V0X3ZhbHVlKCZkZXYtPm10LT5zbG90c1tpXSwKKwkJCQkJQUJTX01UX1RSQUNLSU5HX0lEKSA8IDApIHsKKwkJCXByX2RlYnVnKCIlczogc2tpcHBpbmcgc2xvdCAlZCIsCisJCQkJX19mdW5jX18sIGkpOworCQkJY29udGludWU7CisJCX0KKwkJc2xvdF9jbGVhcl9jbWRzW1NMT1RfQ01EX0lEXS52YWx1ZSA9IGk7CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHNsb3RfY2xlYXJfY21kcyk7IGorKykKKwkJCXVzZmNkZXZfc2VuZF9jbWQoZGV2LCBzbG90X2NsZWFyX2NtZHNbal0pOworCisJCWlmIChzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5pbnRlcmxlYXZlZCkgeworCQkJcHJfZGVidWcoIiVzOiBpbnRlcmxlYXZlZCglZCk6IHNsb3QoJWQpIiwKKwkJCQlfX2Z1bmNfXywgaSwgZGV2LT5tdC0+c2xvdCk7CisJCQlpZiAocmV0cmllcysrIDwgTUFYX1JFVFJJRVMpIHsKKwkJCQktLWk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwcl93YXJuKCIlczogaW5kZXgoJWQpIHJlYWNoZWQgbWF4IHJldGlyZXMiLAorCQkJCV9fZnVuY19fLCBpKTsKKwkJfQorCisJCXJldHJpZXMgPSAwOworCQlpbnB1dF9zeW5jKGRldik7CisJfQorfQorCitib29sIHVzZmNkZXZfc2V0X2ZpbHRlcih1aW50MTZfdCBldmVudF90eXBlX2luZCwgYm9vbCBmaWx0ZXIpCit7CisJYm9vbCByYyA9IHRydWU7CisKKwlpZiAoZXZlbnRfdHlwZV9pbmQgPj0gTUFYX0VWRU5UX1RZUEVfTlVNKSB7CisJCXByX2VycigiJXM6IHdyb25nIGlucHV0OiBldmVudF90eXBlX2luZD0lZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJZXZlbnRfdHlwZV9pbmQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLnJlZ2lzdGVyZWRfZXZlbnQpIHsKKworCQlwcl9kZWJ1ZygiJXM6IGV2ZW50X3R5cGVbJWRdOyBmaWx0ZXI9JWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kLAorCQkJZmlsdGVyCisJCQkpOworCQlpZiAoZmlsdGVyKSB7CisJCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5ldmVudF9zdGF0dXMgPQorCQkJCQkJVVNGQ0RFVl9FVkVOVF9ESVNBQkxJTkc7CisJCQlzX3VzZl9waWQgPSBzeXNfZ2V0cGlkKCk7CisJCQl1c2ZjZGV2X2NsZWFuX2RldihldmVudF90eXBlX2luZCk7CisJCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5ldmVudF9zdGF0dXMgPQorCQkJCQkJVVNGQ0RFVl9FVkVOVF9ESVNBQkxFRDsKKwkJfSBlbHNlCisJCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5ldmVudF9zdGF0dXMgPQorCQkJCQkJVVNGQ0RFVl9FVkVOVF9FTkFCTEVEOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGV2ZW50X3R5cGVbJWRdIGlzbid0IHJlZ2lzdGVyZWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWV2ZW50X3R5cGVfaW5kKTsKKwkJcmMgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVzZmNkZXZfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwodXNmY2Rldl9pbml0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJIYW5kbGUgb2YgZXZlbnRzIGZyb20gZGV2aWNlcywgY29uZmxpY3Rpbmcgd2l0aCBVU0YiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2ZjZGV2LmggYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjYyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpZm5kZWYgX19VU0ZDREVWX0hfXworI2RlZmluZSBfX1VTRkNERVZfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisvKiBUU0MgZXZlbnQgdHlwZSBpbmRleCBpbiB0aGUgY29udGFpbmVycyBvZiB0aGUgaGFuZGxlcnMgJiBoYW5kbGVzICovCisjZGVmaW5lIFRTQ19FVkVOVF9UWVBFX0lORCAwCisvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIGV2ZW50IHR5cGVzIHRvIGJlIGZpbHRlcmVkICovCisjZGVmaW5lIE1BWF9FVkVOVF9UWVBFX05VTSAxCisKK2Jvb2wgdXNmY2Rldl9yZWdpc3RlcigKKwl1aW50MTZfdCBldmVudF90eXBlX2luZCwKKwlib29sICgqbWF0Y2hfY2IpKHVpbnQxNl90LCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpKTsKK3ZvaWQgdXNmY2Rldl91bnJlZ2lzdGVyKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kKTsKK2Jvb2wgdXNmY2Rldl9zZXRfZmlsdGVyKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kLCBib29sIGZpbHRlcik7CisjZW5kaWYgLyogX19VU0ZDREVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vZ3NpL2dzaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vZ3NpL2dzaS5jCmluZGV4IGE2MTdjOWUuLmYzMmQzZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2dzaS9nc2kuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9nc2kvZ3NpLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtMzYyLDggKzM2MiwxMyBAQAogCW5vdGlmeS0+Y2hhbl91c2VyX2RhdGEgPSBjaF9jdHgtPnByb3BzLmNoYW5fdXNlcl9kYXRhOwogCW5vdGlmeS0+ZXZ0X2lkID0gZXZ0LT5jb2RlOwogCW5vdGlmeS0+Ynl0ZXNfeGZlcmVkID0gZXZ0LT5sZW47Ci0JaWYgKGNhbGxiYWNrKQorCWlmIChjYWxsYmFjaykgeworCQlpZiAoYXRvbWljX3JlYWQoJmNoX2N0eC0+cG9sbF9tb2RlKSkgeworCQkJR1NJRVJSKCJDYWxsaW5nIGNsaWVudCBjYWxsYmFjayBpbiBwb2xsaW5nIG1vZGVcbiIpOworCQkJV0FSTl9PTigxKTsKKwkJfQogCQljaF9jdHgtPnByb3BzLnhmZXJfY2Iobm90aWZ5KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGdzaV9wcm9jZXNzX2V2dF9yZShzdHJ1Y3QgZ3NpX2V2dF9jdHggKmN0eCwKQEAgLTQ1OSwxMiArNDY0LDEyIEBACiAJCQljdHgtPnJpbmcucnAgPSBycDsKIAkJCXdoaWxlIChjdHgtPnJpbmcucnBfbG9jYWwgIT0gcnApIHsKIAkJCQkrK2NudHI7Ci0JCQkJZ3NpX3Byb2Nlc3NfZXZ0X3JlKGN0eCwgJm5vdGlmeSwgdHJ1ZSk7CiAJCQkJaWYgKGN0eC0+cHJvcHMuZXhjbHVzaXZlICYmCiAJCQkJCWF0b21pY19yZWFkKCZjdHgtPmNoYW4tPnBvbGxfbW9kZSkpIHsKIAkJCQkJY250ciA9IDA7CiAJCQkJCWJyZWFrOwogCQkJCX0KKwkJCQlnc2lfcHJvY2Vzc19ldnRfcmUoY3R4LCAmbm90aWZ5LCB0cnVlKTsKIAkJCX0KIAkJCWdzaV9yaW5nX2V2dF9kb29yYmVsbChjdHgpOwogCQkJaWYgKGNudHIgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vS2NvbmZpZyBiL2RyaXZlcnMvc29jL3Fjb20vS2NvbmZpZwppbmRleCA2YzI3MDk5Li5mYTExOWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL0tjb25maWcKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9LY29uZmlnCkBAIC01MTAsMyArNTEwLDEyIEBACiAJaGVscAogCQlUaGlzIGRyaXZlciBnZXRzIHRoZSBRNiBvdXQgb2YgcG93ZXIgY29sbGFwc2VkIHN0YXRlIGFuZAogCQlleHBvc2VzIGlvY3RsIGNvbnRyb2wgdG8gcmVhZCBhdnRpbWVyIHRpY2suCisKK2NvbmZpZyBXQ0RfRFNQX0dMSU5LCisJdHJpc3RhdGUgIldDRCBEU1AgR0xJTksgRHJpdmVyIgorCWRlcGVuZHMgb24gTVNNX0dMSU5LCisJZGVmYXVsdCB5IGlmIFNORF9TT0NfV0NEOTM0WD15CisJaGVscAorCSAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZHJpdmVyIHdoaWNoIHByb3ZpZGVzIGNvbW11bmljYXRpb24gaW50ZXJmYWNlCisJICAgYmV0d2VlbiBNU00gYW5kIFdDRCBEU1Agb3ZlciBnbGluayB0cmFuc3BvcnQgcHJvdG9jb2wuIFRoaXMgZHJpdmVyCisJICAgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgaW50ZXJmYWNlIHZpYSBjaGFyIGRldmljZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vTWFrZWZpbGUgYi9kcml2ZXJzL3NvYy9xY29tL01ha2VmaWxlCmluZGV4IDg1MzQyZDEuLjk0M2VmZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9NYWtlZmlsZQpAQCAtNDIsNiArNDIsNyBAQAogb2JqLSQoQ09ORklHX01TTV9JUENfUk9VVEVSX0dMSU5LX1hQUlQpICs9IGlwY19yb3V0ZXJfZ2xpbmtfeHBydC5vCiBvYmotJChDT05GSUdfTVNNX1FNSV9JTlRFUkZBQ0UpICs9IHFtaV9pbnRlcmZhY2Uubwogb2JqLSQoQ09ORklHX01TTV9HTElOS19QS1QpICs9IG1zbV9nbGlua19wa3Qubworb2JqLXkJCQkrPQlxZHNwNnYyLwogb2JqLSQoQ09ORklHX01TTV9TWVNURU1fSEVBTFRIX01PTklUT1IpCSs9CXN5c3RlbV9oZWFsdGhfbW9uaXRvcl92MDEubwogb2JqLSQoQ09ORklHX01TTV9TWVNURU1fSEVBTFRIX01PTklUT1IpCSs9CXN5c3RlbV9oZWFsdGhfbW9uaXRvci5vCiBvYmotJChDT05GSUdfTVNNX1NZU01PTl9HTElOS19DT01NKSArPSBzeXNtb24tZ2xpbmsubyBzeXNtb24tcW1pLm8KQEAgLTU4LDMgKzU5LDQgQEAKICAgICAgICBvYmoteSArPSByYW1kdW1wLm8KIGVuZGlmCiBvYmotJChDT05GSUdfUUNPTV9DT01NQU5EX0RCKSArPSBjbWQtZGIubworb2JqLSQoQ09ORklHX1dDRF9EU1BfR0xJTkspICs9IHdjZC1kc3AtZ2xpbmsubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL01ha2VmaWxlIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTA1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACitvYmotJChDT05GSUdfTVNNX1FEU1A2X0FQUlYyKSArPSBhcHIubyBhcHJfdjIubyBhcHJfdGFsLm8gdm9pY2Vfc3ZjLm8KK29iai0kKENPTkZJR19NU01fUURTUDZfQVBSVjMpICs9IGFwci5vIGFwcl92My5vIGFwcl90YWwubyB2b2ljZV9zdmMubworb2JqLSQoQ09ORklHX01TTV9RRFNQNl9BUFJWMl9HTElOSykgKz0gYXByLm8gYXByX3YyLm8gYXByX3RhbF9nbGluay5vIHZvaWNlX3N2Yy5vCitvYmotJChDT05GSUdfTVNNX1FEU1A2X0FQUlYzX0dMSU5LKSArPSBhcHIubyBhcHJfdjMubyBhcHJfdGFsX2dsaW5rLm8gdm9pY2Vfc3ZjLm8KK29iai0kKENPTkZJR19TTkRfU09DX01TTV9RRFNQNlYyX0lOVEYpICs9IG1zbV9hdWRpb19pb24ubworb2JqLSQoQ09ORklHX01TTV9BRFNQX0xPQURFUikgKz0gYWRzcC1sb2FkZXIubworb2JqLSQoQ09ORklHX01TTV9RRFNQNl9TU1IpICs9IGF1ZGlvX3Nzci5vCitvYmotJChDT05GSUdfTVNNX1FEU1A2X1BEUikgKz0gYXVkaW9fcGRyLm8KK29iai0kKENPTkZJR19NU01fUURTUDZfTk9USUZJRVIpICs9IGF1ZGlvX25vdGlmaWVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hZHNwLWxvYWRlci5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fkc3AtbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkZTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hZHNwLWxvYWRlci5jCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3N1YnN5c3RlbV9yZXN0YXJ0Lmg+CisKKyNkZWZpbmUgUTZfUElMX0dFVF9ERUxBWV9NUyAxMDAKKyNkZWZpbmUgQk9PVF9DTUQgMQorI2RlZmluZSBJTUFHRV9VTkxPQURfQ01EIDAKKworc3RhdGljIHNzaXplX3QgYWRzcF9ib290X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisKK3N0cnVjdCBhZHNwX2xvYWRlcl9wcml2YXRlIHsKKwl2b2lkICpwaWxfaDsKKwlzdHJ1Y3Qga29iamVjdCAqYm9vdF9hZHNwX29iajsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3VwOworfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBhZHNwX2Jvb3RfYXR0cmlidXRlID0KKwlfX0FUVFIoYm9vdCwgMDIyMCwgTlVMTCwgYWRzcF9ib290X3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHJzW10gPSB7CisJJmFkc3BfYm9vdF9hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFkc3BfcHJpdmF0ZTsKK3N0YXRpYyB2b2lkIGFkc3BfbG9hZGVyX3VubG9hZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworc3RhdGljIHZvaWQgYWRzcF9sb2FkZXJfZG8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKworCXN0cnVjdCBhZHNwX2xvYWRlcl9wcml2YXRlICpwcml2ID0gTlVMTDsKKworCWNvbnN0IGNoYXIgKmFkc3BfZHQgPSAicWNvbSxhZHNwLXN0YXRlIjsKKwlpbnQgcmMgPSAwOworCXUzMiBhZHNwX3N0YXRlOworCWNvbnN0IGNoYXIgKmltZ19uYW1lOworCisJaWYgKCFwZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBQbGF0Zm9ybSBkZXZpY2UgbnVsbFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IERldmljZSB0cmVlIGluZm9ybWF0aW9uIG1pc3NpbmdcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIGFkc3BfZHQsICZhZHNwX3N0YXRlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBBRFNQIHN0YXRlID0gJXhcbiIsIF9fZnVuY19fLCBhZHNwX3N0YXRlKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJxY29tLHByb2MtaW1nLXRvLWxvYWQiLAorCQkJCQkmaW1nX25hbWUpOworCisJaWYgKHJjKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogbG9hZGluZyBkZWZhdWx0IGltYWdlIEFEU1BcbiIsIF9fZnVuY19fKTsKKwkJZ290byBsb2FkX2Fkc3A7CisJfQorCWlmICghc3RyY21wKGltZ19uYW1lLCAibW9kZW0iKSkgeworCQkvKiBhZHNwX3N0YXRlIGFsd2F5cyByZXR1cm5zICIwIi4gU28gbG9hZCBtb2RlbSBpbWFnZSBiYXNlZCBvbgorCQkgKiBhcHJfbW9kZW1fc3RhdGUgdG8gcHJldmVudCBsb2FkaW5nIG9mIGltYWdlIHR3aWNlCisJCSAqLworCQlhZHNwX3N0YXRlID0gYXByX2dldF9tb2RlbV9zdGF0ZSgpOworCQlpZiAoYWRzcF9zdGF0ZSA9PSBBUFJfU1VCU1lTX0RPV04pIHsKKwkJCXByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkJCWlmICghcHJpdikgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiICVzOiBQcml2YXRlIGRhdGEgZ2V0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJcHJpdi0+cGlsX2ggPSBzdWJzeXN0ZW1fZ2V0KCJtb2RlbSIpOworCQkJaWYgKElTX0VSUihwcml2LT5waWxfaCkpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcGlsIGdldCBmYWlsZWQsXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQkvKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBBRFNQIGluIEFQUiBkcml2ZXIgKi8KKwkJCWFwcl9zZXRfbW9kZW1fc3RhdGUoQVBSX1NVQlNZU19MT0FERUQpOworCQl9IGVsc2UgaWYgKGFkc3Bfc3RhdGUgPT0gQVBSX1NVQlNZU19MT0FERUQpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogTURTUCBzdGF0ZSA9ICV4XG4iLCBfX2Z1bmNfXywgYWRzcF9zdGF0ZSk7CisJCX0KKworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUTYvTURTUCBpbWFnZSBpcyBsb2FkZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KK2xvYWRfYWRzcDoKKwl7CisJCWFkc3Bfc3RhdGUgPSBhcHJfZ2V0X3E2X3N0YXRlKCk7CisJCWlmIChhZHNwX3N0YXRlID09IEFQUl9TVUJTWVNfRE9XTikgeworCQkJcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCQkJaWYgKCFwcml2KSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIgJXM6IFByaXZhdGUgZGF0YSBnZXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQlwcml2LT5waWxfaCA9IHN1YnN5c3RlbV9nZXQoImFkc3AiKTsKKwkJCWlmIChJU19FUlIocHJpdi0+cGlsX2gpKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHBpbCBnZXQgZmFpbGVkLFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJLyogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgQURTUCBpbiBBUFIgZHJpdmVyICovCisJCQlhcHJfc2V0X3E2X3N0YXRlKEFQUl9TVUJTWVNfTE9BREVEKTsKKwkJfSBlbHNlIGlmIChhZHNwX3N0YXRlID09IEFQUl9TVUJTWVNfTE9BREVEKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkiJXM6IEFEU1Agc3RhdGUgPSAleFxuIiwgX19mdW5jX18sIGFkc3Bfc3RhdGUpOworCQl9CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IFE2L0FEU1AgaW1hZ2UgaXMgbG9hZGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CitmYWlsOgorCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBRNiBpbWFnZSBsb2FkaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGFkc3BfYm9vdF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlpbnQgYm9vdCA9IDA7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkdSIsICZib290KSAhPSAxKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWFkIGJvb3QgaW5mbyBmcm9tIHN0cmluZ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYm9vdCA9PSBCT09UX0NNRCkgeworCQlwcl9kZWJ1ZygiJXM6IGdvaW5nIHRvIGNhbGwgYWRzcF9sb2FkZXJfZG9cbiIsIF9fZnVuY19fKTsKKwkJYWRzcF9sb2FkZXJfZG8oYWRzcF9wcml2YXRlKTsKKwl9IGVsc2UgaWYgKGJvb3QgPT0gSU1BR0VfVU5MT0FEX0NNRCkgeworCQlwcl9kZWJ1ZygiJXM6IGdvaW5nIHRvIGNhbGwgYWRzcF91bmxvYWRlclxuIiwgX19mdW5jX18pOworCQlhZHNwX2xvYWRlcl91bmxvYWQoYWRzcF9wcml2YXRlKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBhZHNwX2xvYWRlcl91bmxvYWQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWRzcF9sb2FkZXJfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisKKwlwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKworCWlmIChwcml2LT5waWxfaCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogY2FsbGluZyBzdWJzeXN0ZW0gcHV0XG4iLCBfX2Z1bmNfXyk7CisJCXN1YnN5c3RlbV9wdXQocHJpdi0+cGlsX2gpOworCQlwcml2LT5waWxfaCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGFkc3BfbG9hZGVyX2luaXRfc3lzZnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgYWRzcF9sb2FkZXJfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisKKwlhZHNwX3ByaXZhdGUgPSBOVUxMOworCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwcml2LT5waWxfaCA9IE5VTEw7CisJcHJpdi0+Ym9vdF9hZHNwX29iaiA9IE5VTEw7CisJcHJpdi0+YXR0cl9ncm91cCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZigqKHByaXYtPmF0dHJfZ3JvdXApKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPmF0dHJfZ3JvdXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJcHJpdi0+YXR0cl9ncm91cC0+YXR0cnMgPSBhdHRyczsKKworCXByaXYtPmJvb3RfYWRzcF9vYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJib290X2Fkc3AiLCBrZXJuZWxfa29iaik7CisJaWYgKCFwcml2LT5ib290X2Fkc3Bfb2JqKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzeXNmcyBjcmVhdGUgYW5kIGFkZCBmYWlsZWRcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cChwcml2LT5ib290X2Fkc3Bfb2JqLCBwcml2LT5hdHRyX2dyb3VwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzeXNmcyBjcmVhdGUgZ3JvdXAgZmFpbGVkICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlhZHNwX3ByaXZhdGUgPSBwZGV2OworCisJcmV0dXJuIDA7CisKK2Vycm9yX3JldHVybjoKKworCWlmIChwcml2LT5ib290X2Fkc3Bfb2JqKSB7CisJCWtvYmplY3RfZGVsKHByaXYtPmJvb3RfYWRzcF9vYmopOworCQlwcml2LT5ib290X2Fkc3Bfb2JqID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkc3BfbG9hZGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhZHNwX2xvYWRlcl9wcml2YXRlICpwcml2ID0gTlVMTDsKKworCXByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghcHJpdikKKwkJcmV0dXJuIDA7CisKKwlpZiAocHJpdi0+cGlsX2gpIHsKKwkJc3Vic3lzdGVtX3B1dChwcml2LT5waWxfaCk7CisJCXByaXYtPnBpbF9oID0gTlVMTDsKKwl9CisKKwlpZiAocHJpdi0+Ym9vdF9hZHNwX29iaikgeworCQlzeXNmc19yZW1vdmVfZ3JvdXAocHJpdi0+Ym9vdF9hZHNwX29iaiwgcHJpdi0+YXR0cl9ncm91cCk7CisJCWtvYmplY3RfZGVsKHByaXYtPmJvb3RfYWRzcF9vYmopOworCQlwcml2LT5ib290X2Fkc3Bfb2JqID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHNwX2xvYWRlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSBhZHNwX2xvYWRlcl9pbml0X3N5c2ZzKHBkZXYpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBFcnJvciBpbiBpbml0aW5nIHN5c2ZzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFkc3BfbG9hZGVyX2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGFkc3AtbG9hZGVyIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFkc3BfbG9hZGVyX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWRzcF9sb2FkZXJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkc3AtbG9hZGVyIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFkc3BfbG9hZGVyX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gYWRzcF9sb2FkZXJfcHJvYmUsCisJLnJlbW92ZSA9IGFkc3BfbG9hZGVyX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkc3BfbG9hZGVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhZHNwX2xvYWRlcl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRzcF9sb2FkZXJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZHNwX2xvYWRlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFkc3BfbG9hZGVyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHNwX2xvYWRlcl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFNQIExvYWRlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNjOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwci5jCkBAIC0wLDAgKzEsOTcwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCwgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fcmVzdGFydC5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHJfdGFsLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXBjX2xvZ2dpbmcuaD4KKworI2RlZmluZSBBUFJfUEtUX0lQQ19MT0dfUEFHRV9DTlQgMgorCitzdGF0aWMgc3RydWN0IGFwcl9xNiBxNjsKK3N0YXRpYyBzdHJ1Y3QgYXByX2NsaWVudCBjbGllbnRbQVBSX0RFU1RfTUFYXVtBUFJfQ0xJRU5UX01BWF07CitzdGF0aWMgdm9pZCAqYXByX3BrdF9jdHg7CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgZHNwX3dhaXQ7CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgbW9kZW1fd2FpdDsKK3N0YXRpYyBib29sIGlzX21vZGVtX3VwOworc3RhdGljIGJvb2wgaXNfaW5pdGlhbF9ib290OworLyogU3Vic3lzdGVtIHJlc3RhcnQ6IFFEU1A2IGRhdGEsIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphcHJfcmVzZXRfd29ya3F1ZXVlOworc3RhdGljIHZvaWQgYXByX3Jlc2V0X2RlcmVnaXN0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIGRpc3BhdGNoX2V2ZW50KHVuc2lnbmVkIGxvbmcgY29kZSwgdWludDE2X3QgcHJvYyk7CitzdHJ1Y3QgYXByX3Jlc2V0X3dvcmsgeworCXZvaWQgKmhhbmRsZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKK3N0YXRpYyBib29sIGFwcl9jZl9kZWJ1ZzsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYXByX2RlYnVnOworc3RhdGljIHNzaXplX3QgYXByX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBjbWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdWJ1ZiwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJYXByX2NmX2RlYnVnID0gKGNtZCA9PSAnMScpID8gdHJ1ZSA6IGZhbHNlOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXByX2RlYnVnX29wcyA9IHsKKwkud3JpdGUgPSBhcHJfZGVidWdfd3JpdGUsCit9OworI2VuZGlmCisKKyNkZWZpbmUgQVBSX1BLVF9JTkZPKHguLi4pIFwKK2RvIHsgXAorCWlmIChhcHJfcGt0X2N0eCkgXAorCQlpcGNfbG9nX3N0cmluZyhhcHJfcGt0X2N0eCwgIjxBUFI+OiAieCk7IFwKK30gd2hpbGUgKDApCisKKworc3RydWN0IGFwcl9zdmNfdGFibGUgeworCWNoYXIgbmFtZVs2NF07CisJaW50IGlkeDsKKwlpbnQgaWQ7CisJaW50IGNsaWVudF9pZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXByX3N2Y190YWJsZSBzdmNfdGJsX3Fkc3A2W10gPSB7CisJeworCQkubmFtZSA9ICJBRkUiLAorCQkuaWR4ID0gMCwKKwkJLmlkID0gQVBSX1NWQ19BRkUsCisJCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAorCX0sCisJeworCQkubmFtZSA9ICJBU00iLAorCQkuaWR4ID0gMSwKKwkJLmlkID0gQVBSX1NWQ19BU00sCisJCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAorCX0sCisJeworCQkubmFtZSA9ICJBRE0iLAorCQkuaWR4ID0gMiwKKwkJLmlkID0gQVBSX1NWQ19BRE0sCisJCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAorCX0sCisJeworCQkubmFtZSA9ICJDT1JFIiwKKwkJLmlkeCA9IDMsCisJCS5pZCA9IEFQUl9TVkNfQURTUF9DT1JFLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKKwl9LAorCXsKKwkJLm5hbWUgPSAiVEVTVCIsCisJCS5pZHggPSA0LAorCQkuaWQgPSBBUFJfU1ZDX1RFU1RfQ0xJRU5ULAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVZNIiwKKwkJLmlkeCA9IDUsCisJCS5pZCA9IEFQUl9TVkNfQURTUF9NVk0sCisJCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAorCX0sCisJeworCQkubmFtZSA9ICJDVlMiLAorCQkuaWR4ID0gNiwKKwkJLmlkID0gQVBSX1NWQ19BRFNQX0NWUywKKwkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfQVVESU8sCisJfSwKKwl7CisJCS5uYW1lID0gIkNWUCIsCisJCS5pZHggPSA3LAorCQkuaWQgPSBBUFJfU1ZDX0FEU1BfQ1ZQLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNNIiwKKwkJLmlkeCA9IDgsCisJCS5pZCA9IEFQUl9TVkNfVVNNLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKKwl9LAorCXsKKwkJLm5hbWUgPSAiVklEQyIsCisJCS5pZHggPSA5LAorCQkuaWQgPSBBUFJfU1ZDX1ZJREMsCisJfSwKKwl7CisJCS5uYW1lID0gIkxTTSIsCisJCS5pZHggPSAxMCwKKwkJLmlkID0gQVBSX1NWQ19MU00sCisJCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFwcl9zdmNfdGFibGUgc3ZjX3RibF92b2ljZVtdID0geworCXsKKwkJLm5hbWUgPSAiVlNNIiwKKwkJLmlkeCA9IDAsCisJCS5pZCA9IEFQUl9TVkNfVlNNLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVlBNIiwKKwkJLmlkeCA9IDEsCisJCS5pZCA9IEFQUl9TVkNfVlBNLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVZTIiwKKwkJLmlkeCA9IDIsCisJCS5pZCA9IEFQUl9TVkNfTVZTLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVZNIiwKKwkJLmlkeCA9IDMsCisJCS5pZCA9IEFQUl9TVkNfTVZNLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQ1ZTIiwKKwkJLmlkeCA9IDQsCisJCS5pZCA9IEFQUl9TVkNfQ1ZTLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQ1ZQIiwKKwkJLmlkeCA9IDUsCisJCS5pZCA9IEFQUl9TVkNfQ1ZQLAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU1JEIiwKKwkJLmlkeCA9IDYsCisJCS5pZCA9IEFQUl9TVkNfU1JELAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVEVTVCIsCisJCS5pZHggPSA3LAorCQkuaWQgPSBBUFJfU1ZDX1RFU1RfQ0xJRU5ULAorCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9WT0lDRSwKKwl9LAorfTsKKworZW51bSBhcHJfc3Vic3lzX3N0YXRlIGFwcl9nZXRfbW9kZW1fc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnE2Lm1vZGVtX3N0YXRlKTsKK30KKwordm9pZCBhcHJfc2V0X21vZGVtX3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSkKK3sKKwlhdG9taWNfc2V0KCZxNi5tb2RlbV9zdGF0ZSwgc3RhdGUpOworfQorCitlbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2NtcHhjaGdfbW9kZW1fc3RhdGUoZW51bSBhcHJfc3Vic3lzX3N0YXRlIHByZXYsCisJCQkJCSAgICAgIGVudW0gYXByX3N1YnN5c19zdGF0ZSBuZXcpCit7CisJcmV0dXJuIGF0b21pY19jbXB4Y2hnKCZxNi5tb2RlbV9zdGF0ZSwgcHJldiwgbmV3KTsKK30KKworc3RhdGljIHZvaWQgYXByX21vZGVtX2Rvd24odW5zaWduZWQgbG9uZyBvcGNvZGUpCit7CisJYXByX3NldF9tb2RlbV9zdGF0ZShBUFJfU1VCU1lTX0RPV04pOworCWRpc3BhdGNoX2V2ZW50KG9wY29kZSwgQVBSX0RFU1RfTU9ERU0pOworfQorCitzdGF0aWMgdm9pZCBhcHJfbW9kZW1fdXAodm9pZCkKK3sKKwlpZiAoYXByX2NtcHhjaGdfbW9kZW1fc3RhdGUoQVBSX1NVQlNZU19ET1dOLCBBUFJfU1VCU1lTX1VQKSA9PQorCQkJCQkJCUFQUl9TVUJTWVNfRE9XTikKKwkJd2FrZV91cCgmbW9kZW1fd2FpdCk7CisJaXNfbW9kZW1fdXAgPSAxOworfQorCitlbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9xNl9zdGF0ZSh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmcTYucTZfc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTChhcHJfZ2V0X3E2X3N0YXRlKTsKKworaW50IGFwcl9zZXRfcTZfc3RhdGUoZW51bSBhcHJfc3Vic3lzX3N0YXRlIHN0YXRlKQoreworCXByX2RlYnVnKCIlczogc2V0dGluZyBhZHNwIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCWlmIChzdGF0ZSA8IEFQUl9TVUJTWVNfRE9XTiB8fCBzdGF0ZSA+IEFQUl9TVUJTWVNfTE9BREVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhdG9taWNfc2V0KCZxNi5xNl9zdGF0ZSwgc3RhdGUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhcHJfc2V0X3E2X3N0YXRlKTsKKworZW51bSBhcHJfc3Vic3lzX3N0YXRlIGFwcl9jbXB4Y2hnX3E2X3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBwcmV2LAorCQkJCQkgICBlbnVtIGFwcl9zdWJzeXNfc3RhdGUgbmV3KQoreworCXJldHVybiBhdG9taWNfY21weGNoZygmcTYucTZfc3RhdGUsIHByZXYsIG5ldyk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcl9hZHNwX2Rvd24odW5zaWduZWQgbG9uZyBvcGNvZGUpCit7CisJYXByX3NldF9xNl9zdGF0ZShBUFJfU1VCU1lTX0RPV04pOworCWRpc3BhdGNoX2V2ZW50KG9wY29kZSwgQVBSX0RFU1RfUURTUDYpOworfQorCitzdGF0aWMgdm9pZCBhcHJfYWRzcF91cCh2b2lkKQoreworCWlmIChhcHJfY21weGNoZ19xNl9zdGF0ZShBUFJfU1VCU1lTX0RPV04sIEFQUl9TVUJTWVNfTE9BREVEKSA9PQorCQkJCQkJCUFQUl9TVUJTWVNfRE9XTikKKwkJd2FrZV91cCgmZHNwX3dhaXQpOworfQorCitpbnQgYXByX3dhaXRfZm9yX2RldmljZV91cChpbnQgZGVzdF9pZCkKK3sKKwlpbnQgcmMgPSAtMTsKKworCWlmIChkZXN0X2lkID09IEFQUl9ERVNUX01PREVNKQorCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG1vZGVtX3dhaXQsCisJCQkJICAgIChhcHJfZ2V0X21vZGVtX3N0YXRlKCkgPT0gQVBSX1NVQlNZU19VUCksCisJCQkJICAgICgxICogSFopKTsKKwllbHNlIGlmIChkZXN0X2lkID09IEFQUl9ERVNUX1FEU1A2KQorCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRzcF93YWl0LAorCQkJCSAgICAoYXByX2dldF9xNl9zdGF0ZSgpID09IEFQUl9TVUJTWVNfVVApLAorCQkJCSAgICAoMSAqIEhaKSk7CisJZWxzZQorCQlwcl9lcnIoIiVzOiB1bmtub3duIGRlc3RfaWQgJWRcbiIsIF9fZnVuY19fLCBkZXN0X2lkKTsKKwkvKiByZXR1cm5zIGxlZnQgdGltZSAqLworCXJldHVybiByYzsKK30KKworaW50IGFwcl9sb2FkX2Fkc3BfaW1hZ2Uodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJbXV0ZXhfbG9jaygmcTYubG9jayk7CisJaWYgKGFwcl9nZXRfcTZfc3RhdGUoKSA9PSBBUFJfU1VCU1lTX1VQKSB7CisJCXE2LnBpbCA9IHN1YnN5c3RlbV9nZXQoImFkc3AiKTsKKwkJaWYgKElTX0VSUihxNi5waWwpKSB7CisJCQlyYyA9IFBUUl9FUlIocTYucGlsKTsKKwkJCXByX2VycigiQVBSOiBVbmFibGUgdG8gbG9hZCBxNiBpbWFnZSwgZXJyb3I6JWRcbiIsIHJjKTsKKwkJfSBlbHNlIHsKKwkJCWFwcl9zZXRfcTZfc3RhdGUoQVBSX1NVQlNZU19MT0FERUQpOworCQkJcHJfZGVidWcoIkFQUjogSW1hZ2UgaXMgbG9hZGVkLCBzdGF0ZWRcbiIpOworCQl9CisJfSBlbHNlIGlmIChhcHJfZ2V0X3E2X3N0YXRlKCkgPT0gQVBSX1NVQlNZU19MT0FERUQpIHsKKwkJcHJfZGVidWcoIkFQUjogcTYgaW1hZ2UgYWxyZWFkeSBsb2FkZWRcbiIpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJBUFI6IGNhbm5vdCBsb2FkIHN0YXRlICVkXG4iLCBhcHJfZ2V0X3E2X3N0YXRlKCkpOworCX0KKwltdXRleF91bmxvY2soJnE2LmxvY2spOworCXJldHVybiByYzsKK30KKworc3RydWN0IGFwcl9jbGllbnQgKmFwcl9nZXRfY2xpZW50KGludCBkZXN0X2lkLCBpbnQgY2xpZW50X2lkKQoreworCXJldHVybiAmY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF07Cit9CisKK2ludCBhcHJfc2VuZF9wa3Qodm9pZCAqaGFuZGxlLCB1aW50MzJfdCAqYnVmKQoreworCXN0cnVjdCBhcHJfc3ZjICpzdmMgPSBoYW5kbGU7CisJc3RydWN0IGFwcl9jbGllbnQgKmNsbnQ7CisJc3RydWN0IGFwcl9oZHIgKmhkcjsKKwl1aW50MTZfdCBkZXN0X2lkOworCXVpbnQxNl90IGNsaWVudF9pZDsKKwl1aW50MTZfdCB3X2xlbjsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaGFuZGxlIHx8ICFidWYpIHsKKwkJcHJfZXJyKCJBUFI6IFdyb25nIHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHN2Yy0+bmVlZF9yZXNldCkgeworCQlwcl9lcnIoImFwcjogc2VuZF9wa3Qgc2VydmljZSBuZWVkIHJlc2V0XG4iKTsKKwkJcmV0dXJuIC1FTkVUUkVTRVQ7CisJfQorCisJaWYgKChzdmMtPmRlc3RfaWQgPT0gQVBSX0RFU1RfUURTUDYpICYmCisJICAgIChhcHJfZ2V0X3E2X3N0YXRlKCkgIT0gQVBSX1NVQlNZU19MT0FERUQpKSB7CisJCXByX2VycigiJXM6IFN0aWxsIGRzcCBpcyBub3QgVXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTkVUUkVTRVQ7CisJfSBlbHNlIGlmICgoc3ZjLT5kZXN0X2lkID09IEFQUl9ERVNUX01PREVNKSAmJgorCQkgICAoYXByX2dldF9tb2RlbV9zdGF0ZSgpID09IEFQUl9TVUJTWVNfRE9XTikpIHsKKwkJcHJfZXJyKCJhcHI6IFN0aWxsIE1vZGVtIGlzIG5vdCBVcFxuIik7CisJCXJldHVybiAtRU5FVFJFU0VUOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdmMtPndfbG9jaywgZmxhZ3MpOworCWRlc3RfaWQgPSBzdmMtPmRlc3RfaWQ7CisJY2xpZW50X2lkID0gc3ZjLT5jbGllbnRfaWQ7CisJY2xudCA9ICZjbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXTsKKworCWlmICghY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlKSB7CisJCXByX2VycigiQVBSOiBTdGlsbCBzZXJ2aWNlIGlzIG5vdCB5ZXQgb3BlbmVkXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZjLT53X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWhkciA9IChzdHJ1Y3QgYXByX2hkciAqKWJ1ZjsKKworCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwloZHItPnNyY19zdmMgPSBzdmMtPmlkOworCWhkci0+ZGVzdF9kb21haW4gPSBzdmMtPmRlc3RfZG9tYWluOworCWhkci0+ZGVzdF9zdmMgPSBzdmMtPmlkOworCisJaWYgKHVubGlrZWx5KGFwcl9jZl9kZWJ1ZykpIHsKKwkJQVBSX1BLVF9JTkZPKAorCQkiVHg6IHNyY19hZGRyWzB4JVhdIGRlc3RfYWRkclsweCVYXSBvcGNvZGVbMHglWF0gdG9rZW5bMHglWF0iLAorCQkoaGRyLT5zcmNfZG9tYWluIDw8IDgpIHwgaGRyLT5zcmNfc3ZjLAorCQkoaGRyLT5kZXN0X2RvbWFpbiA8PCA4KSB8IGhkci0+ZGVzdF9zdmMsIGhkci0+b3Bjb2RlLAorCQloZHItPnRva2VuKTsKKwl9CisKKwlyYyA9IGFwcl90YWxfd3JpdGUoY2xudC0+aGFuZGxlLCBidWYsCisJCQkoc3RydWN0IGFwcl9wa3RfcHJpdiAqKSZzdmMtPnBrdF9vd25lciwKKwkJCWhkci0+cGt0X3NpemUpOworCWlmIChyYyA+PSAwKSB7CisJCXdfbGVuID0gcmM7CisJCWlmICh3X2xlbiAhPSBoZHItPnBrdF9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gd3JpdGUgd2hvbGUgQVBSIHBrdCBzdWNjZXNzZnVsbHk6ICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBXcml0ZSBBUFIgcGt0IGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZjLT53X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworaW50IGFwcl9wa3RfY29uZmlnKHZvaWQgKmhhbmRsZSwgc3RydWN0IGFwcl9wa3RfY2ZnICpjZmcpCit7CisJc3RydWN0IGFwcl9zdmMgKnN2YyA9IChzdHJ1Y3QgYXByX3N2YyAqKWhhbmRsZTsKKwl1aW50MTZfdCBkZXN0X2lkOworCXVpbnQxNl90IGNsaWVudF9pZDsKKwlzdHJ1Y3QgYXByX2NsaWVudCAqY2xudDsKKworCWlmICghaGFuZGxlKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdmMtPm5lZWRfcmVzZXQpIHsKKwkJcHJfZXJyKCIlczogc2VydmljZSBuZWVkIHJlc2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5FVFJFU0VUOworCX0KKworCXN2Yy0+cGt0X293bmVyID0gY2ZnLT5wa3Rfb3duZXI7CisJZGVzdF9pZCA9IHN2Yy0+ZGVzdF9pZDsKKwljbGllbnRfaWQgPSBzdmMtPmNsaWVudF9pZDsKKwljbG50ID0gJmNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdOworCisJcmV0dXJuIGFwcl90YWxfcnhfaW50ZW50c19jb25maWcoY2xudC0+aGFuZGxlLAorCQljZmctPmludGVudHMubnVtX29mX2ludGVudHMsIGNmZy0+aW50ZW50cy5zaXplKTsKK30KKworc3RydWN0IGFwcl9zdmMgKmFwcl9yZWdpc3RlcihjaGFyICpkZXN0LCBjaGFyICpzdmNfbmFtZSwgYXByX2ZuIHN2Y19mbiwKKwkJCQl1aW50MzJfdCBzcmNfcG9ydCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgYXByX2NsaWVudCAqY2xudDsKKwlpbnQgY2xpZW50X2lkID0gMDsKKwlpbnQgc3ZjX2lkeCA9IDA7CisJaW50IHN2Y19pZCA9IDA7CisJaW50IGRlc3RfaWQgPSAwOworCWludCBkb21haW5faWQgPSAwOworCWludCB0ZW1wX3BvcnQgPSAwOworCXN0cnVjdCBhcHJfc3ZjICpzdmMgPSBOVUxMOworCWludCByYyA9IDA7CisJYm9vbCBjYW5fb3Blbl9jaGFubmVsID0gdHJ1ZTsKKworCWlmICghZGVzdCB8fCAhc3ZjX25hbWUgfHwgIXN2Y19mbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXN0cmNtcChkZXN0LCAiQURTUCIpKQorCQlkb21haW5faWQgPSBBUFJfRE9NQUlOX0FEU1A7CisJZWxzZSBpZiAoIXN0cmNtcChkZXN0LCAiTU9ERU0iKSkgeworCQkvKiBEb24ndCByZXF1ZXN0IGZvciBTTUQgY2hhbm5lbHMgaWYgZGVzdGluYXRpb24gaXMgTU9ERU0sCisJCSAqIGFzIHRoZXNlIGNoYW5uZWxzIGFyZSBubyBsb25nZXIgdXNlZCBhbmQgdGhlc2UgY2xpZW50cworCQkgKiBhcmUgdG8gbGlzdGVuIG9ubHkgZm9yIE1PREVNIFNTUiBldmVudHMKKwkJICovCisJCWNhbl9vcGVuX2NoYW5uZWwgPSBmYWxzZTsKKwkJZG9tYWluX2lkID0gQVBSX0RPTUFJTl9NT0RFTTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIkFQUjogd3JvbmcgZGVzdGluYXRpb25cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJZGVzdF9pZCA9IGFwcl9nZXRfZGVzdF9pZChkZXN0KTsKKworCWlmIChkZXN0X2lkID09IEFQUl9ERVNUX1FEU1A2KSB7CisJCWlmIChhcHJfZ2V0X3E2X3N0YXRlKCkgIT0gQVBSX1NVQlNZU19MT0FERUQpIHsKKwkJCXByX2VycigiJXM6IGFkc3Agbm90IHVwXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IGFkc3AgVXBcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKGRlc3RfaWQgPT0gQVBSX0RFU1RfTU9ERU0pIHsKKwkJaWYgKGFwcl9nZXRfbW9kZW1fc3RhdGUoKSA9PSBBUFJfU1VCU1lTX0RPV04pIHsKKwkJCWlmIChpc19tb2RlbV91cCkgeworCQkJCXByX2VycigiJXM6IG1vZGVtIHNodXRkb3duIGR1ZSB0byBTU1IsIHJldCIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXByX2RlYnVnKCIlczogV2FpdCBmb3IgbW9kZW0gdG8gYm9vdHVwXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IGFwcl93YWl0X2Zvcl9kZXZpY2VfdXAoQVBSX0RFU1RfTU9ERU0pOworCQkJaWYgKHJjID09IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBNb2RlbSBpcyBub3QgVXBcbiIsIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlwcl9kZWJ1ZygiJXM6IG1vZGVtIFVwXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJaWYgKGFwcl9nZXRfc3ZjKHN2Y19uYW1lLCBkb21haW5faWQsICZjbGllbnRfaWQsICZzdmNfaWR4LCAmc3ZjX2lkKSkgeworCQlwcl9lcnIoIiVzOiBhcHJfZ2V0X3N2YyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWNsbnQgPSAmY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF07CisJbXV0ZXhfbG9jaygmY2xudC0+bV9sb2NrKTsKKwlpZiAoIWNsbnQtPmhhbmRsZSAmJiBjYW5fb3Blbl9jaGFubmVsKSB7CisJCWNsbnQtPmhhbmRsZSA9IGFwcl90YWxfb3BlbihjbGllbnRfaWQsIGRlc3RfaWQsCisJCQkJQVBSX0RMX1NNRCwgYXByX2NiX2Z1bmMsIE5VTEwpOworCQlpZiAoIWNsbnQtPmhhbmRsZSkgeworCQkJc3ZjID0gTlVMTDsKKwkJCXByX2VycigiQVBSOiBVbmFibGUgdG8gb3BlbiBoYW5kbGVcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZjbG50LT5tX2xvY2spOworCQkJZ290byBkb25lOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY2xudC0+bV9sb2NrKTsKKwlzdmMgPSAmY2xudC0+c3ZjW3N2Y19pZHhdOworCW11dGV4X2xvY2soJnN2Yy0+bV9sb2NrKTsKKwljbG50LT5pZCA9IGNsaWVudF9pZDsKKwlpZiAoc3ZjLT5uZWVkX3Jlc2V0KSB7CisJCW11dGV4X3VubG9jaygmc3ZjLT5tX2xvY2spOworCQlwcl9lcnIoIkFQUjogU2VydmljZSBuZWVkcyByZXNldFxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJc3ZjLT5pZCA9IHN2Y19pZDsKKwlzdmMtPmRlc3RfaWQgPSBkZXN0X2lkOworCXN2Yy0+Y2xpZW50X2lkID0gY2xpZW50X2lkOworCXN2Yy0+ZGVzdF9kb21haW4gPSBkb21haW5faWQ7CisJc3ZjLT5wa3Rfb3duZXIgPSBBUFJfUEtUX09XTkVSX0RSSVZFUjsKKworCWlmIChzcmNfcG9ydCAhPSAweEZGRkZGRkZGKSB7CisJCXRlbXBfcG9ydCA9ICgoc3JjX3BvcnQgPj4gOCkgKiA4KSArIChzcmNfcG9ydCAmIDB4RkYpOworCQlwcl9kZWJ1ZygicG9ydCA9ICVkIHRfcG9ydCA9ICVkXG4iLCBzcmNfcG9ydCwgdGVtcF9wb3J0KTsKKwkJaWYgKHRlbXBfcG9ydCA+PSBBUFJfTUFYX1BPUlRTIHx8IHRlbXBfcG9ydCA8IDApIHsKKwkJCXByX2VycigiQVBSOiB0ZW1wX3BvcnQgb3V0IG9mIGJvdW5kc1xuIik7CisJCQltdXRleF91bmxvY2soJnN2Yy0+bV9sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICghc3ZjLT5wb3J0X2NudCAmJiAhc3ZjLT5zdmNfY250KQorCQkJY2xudC0+c3ZjX2NudCsrOworCQlzdmMtPnBvcnRfY250Kys7CisJCXN2Yy0+cG9ydF9mblt0ZW1wX3BvcnRdID0gc3ZjX2ZuOworCQlzdmMtPnBvcnRfcHJpdlt0ZW1wX3BvcnRdID0gcHJpdjsKKwl9IGVsc2UgeworCQlpZiAoIXN2Yy0+Zm4pIHsKKwkJCWlmICghc3ZjLT5wb3J0X2NudCAmJiAhc3ZjLT5zdmNfY250KQorCQkJCWNsbnQtPnN2Y19jbnQrKzsKKwkJCXN2Yy0+Zm4gPSBzdmNfZm47CisJCQlpZiAoc3ZjLT5wb3J0X2NudCkKKwkJCQlzdmMtPnN2Y19jbnQrKzsKKwkJCXN2Yy0+cHJpdiA9IHByaXY7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnN2Yy0+bV9sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHN2YzsKK30KKworCit2b2lkIGFwcl9jYl9mdW5jKHZvaWQgKmJ1ZiwgaW50IGxlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgYXByX2NsaWVudF9kYXRhIGRhdGE7CisJc3RydWN0IGFwcl9jbGllbnQgKmFwcl9jbGllbnQ7CisJc3RydWN0IGFwcl9zdmMgKmNfc3ZjOworCXN0cnVjdCBhcHJfaGRyICpoZHI7CisJdWludDE2X3QgaGRyX3NpemU7CisJdWludDE2X3QgbXNnX3R5cGU7CisJdWludDE2X3QgdmVyOworCXVpbnQxNl90IHNyYzsKKwl1aW50MTZfdCBzdmM7CisJdWludDE2X3QgY2xudDsKKwlpbnQgaTsKKwlpbnQgdGVtcF9wb3J0ID0gMDsKKwl1aW50MzJfdCAqcHRyOworCisJcHJfZGVidWcoIkFQUjI6IGxlbiA9ICVkXG4iLCBsZW4pOworCXB0ciA9IGJ1ZjsKKwlwcl9kZWJ1ZygiXG4qKioqKioqKioqKioqKioqKlxuIik7CisJZm9yIChpID0gMDsgaSA8IGxlbi80OyBpKyspCisJCXByX2RlYnVnKCIleCAgIiwgcHRyW2ldKTsKKwlwcl9kZWJ1ZygiXG4iKTsKKwlwcl9kZWJ1ZygiXG4qKioqKioqKioqKioqKioqKlxuIik7CisKKwlpZiAoIWJ1ZiB8fCBsZW4gPD0gQVBSX0hEUl9TSVpFKSB7CisJCXByX2VycigiQVBSOiBJbXByb3BlciBhcHIgcGt0IHJlY2VpdmVkOiVwSyAlZFxuIiwgYnVmLCBsZW4pOworCQlyZXR1cm47CisJfQorCWhkciA9IGJ1ZjsKKworCXZlciA9IGhkci0+aGRyX2ZpZWxkOworCXZlciA9ICh2ZXIgJiAweDAwMEYpOworCWlmICh2ZXIgPiBBUFJfUEtUX1ZFUiArIDEpIHsKKwkJcHJfZXJyKCJBUFI6IFdyb25nIHZlcnNpb246ICVkXG4iLCB2ZXIpOworCQlyZXR1cm47CisJfQorCisJaGRyX3NpemUgPSBoZHItPmhkcl9maWVsZDsKKwloZHJfc2l6ZSA9ICgoaGRyX3NpemUgJiAweDAwRjApID4+IDB4NCkgKiA0OworCWlmIChoZHJfc2l6ZSA8IEFQUl9IRFJfU0laRSkgeworCQlwcl9lcnIoIkFQUjogV3JvbmcgaGRyIHNpemU6JWRcbiIsIGhkcl9zaXplKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChoZHItPnBrdF9zaXplIDwgQVBSX0hEUl9TSVpFKSB7CisJCXByX2VycigiQVBSOiBXcm9uZyBwYWtldCBzaXplXG4iKTsKKwkJcmV0dXJuOworCX0KKwltc2dfdHlwZSA9IGhkci0+aGRyX2ZpZWxkOworCW1zZ190eXBlID0gKG1zZ190eXBlID4+IDB4MDgpICYgMHgwMDAzOworCWlmIChtc2dfdHlwZSA+PSBBUFJfTVNHX1RZUEVfTUFYICYmIG1zZ190eXBlICE9IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7CisJCXByX2VycigiQVBSOiBXcm9uZyBtZXNzYWdlIHR5cGU6ICVkXG4iLCBtc2dfdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaGRyLT5zcmNfZG9tYWluID49IEFQUl9ET01BSU5fTUFYIHx8CisJCWhkci0+ZGVzdF9kb21haW4gPj0gQVBSX0RPTUFJTl9NQVggfHwKKwkJaGRyLT5zcmNfc3ZjID49IEFQUl9TVkNfTUFYIHx8CisJCWhkci0+ZGVzdF9zdmMgPj0gQVBSX1NWQ19NQVgpIHsKKwkJcHJfZXJyKCJBUFI6IFdyb25nIEFQUiBoZWFkZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJc3ZjID0gaGRyLT5kZXN0X3N2YzsKKwlpZiAoaGRyLT5zcmNfZG9tYWluID09IEFQUl9ET01BSU5fTU9ERU0pIHsKKwkJaWYgKHN2YyA9PSBBUFJfU1ZDX01WUyB8fCBzdmMgPT0gQVBSX1NWQ19NVk0gfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX0NWUyB8fCBzdmMgPT0gQVBSX1NWQ19DVlAgfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX1RFU1RfQ0xJRU5UKQorCQkJY2xudCA9IEFQUl9DTElFTlRfVk9JQ0U7CisJCWVsc2UgeworCQkJcHJfZXJyKCJBUFI6IFdyb25nIHN2YyA6JWRcbiIsIHN2Yyk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGhkci0+c3JjX2RvbWFpbiA9PSBBUFJfRE9NQUlOX0FEU1ApIHsKKwkJaWYgKHN2YyA9PSBBUFJfU1ZDX0FGRSB8fCBzdmMgPT0gQVBSX1NWQ19BU00gfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX1ZTTSB8fCBzdmMgPT0gQVBSX1NWQ19WUE0gfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX0FETSB8fCBzdmMgPT0gQVBSX1NWQ19BRFNQX0NPUkUgfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX1VTTSB8fAorCQkgICAgc3ZjID09IEFQUl9TVkNfVEVTVF9DTElFTlQgfHwgc3ZjID09IEFQUl9TVkNfQURTUF9NVk0gfHwKKwkJICAgIHN2YyA9PSBBUFJfU1ZDX0FEU1BfQ1ZTIHx8IHN2YyA9PSBBUFJfU1ZDX0FEU1BfQ1ZQIHx8CisJCSAgICBzdmMgPT0gQVBSX1NWQ19MU00pCisJCQljbG50ID0gQVBSX0NMSUVOVF9BVURJTzsKKwkJZWxzZSBpZiAoc3ZjID09IEFQUl9TVkNfVklEQykKKwkJCWNsbnQgPSBBUFJfQ0xJRU5UX0FVRElPOworCQllbHNlIHsKKwkJCXByX2VycigiQVBSOiBXcm9uZyBzdmMgOiVkXG4iLCBzdmMpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJBUFI6IFBrdCBmcm9tIHdyb25nIHNvdXJjZTogJWRcbiIsIGhkci0+c3JjX2RvbWFpbik7CisJCXJldHVybjsKKwl9CisKKwlzcmMgPSBhcHJfZ2V0X2RhdGFfc3JjKGhkcik7CisJaWYgKHNyYyA9PSBBUFJfREVTVF9NQVgpCisJCXJldHVybjsKKworCXByX2RlYnVnKCJzcmMgPSVkIGNsbnQgPSAlZFxuIiwgc3JjLCBjbG50KTsKKwlhcHJfY2xpZW50ID0gJmNsaWVudFtzcmNdW2NsbnRdOworCWZvciAoaSA9IDA7IGkgPCBBUFJfU1ZDX01BWDsgaSsrKQorCQlpZiAoYXByX2NsaWVudC0+c3ZjW2ldLmlkID09IHN2YykgeworCQkJcHJfZGVidWcoIiVkXG4iLCBhcHJfY2xpZW50LT5zdmNbaV0uaWQpOworCQkJY19zdmMgPSAmYXByX2NsaWVudC0+c3ZjW2ldOworCQkJYnJlYWs7CisJCX0KKworCWlmIChpID09IEFQUl9TVkNfTUFYKSB7CisJCXByX2VycigiQVBSOiBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcl9kZWJ1Zygic3ZjX2lkeCA9ICVkXG4iLCBpKTsKKwlwcl9kZWJ1ZygiJXggJXggJXggJXBLICVwS1xuIiwgY19zdmMtPmlkLCBjX3N2Yy0+ZGVzdF9pZCwKKwkJIGNfc3ZjLT5jbGllbnRfaWQsIGNfc3ZjLT5mbiwgY19zdmMtPnByaXYpOworCWRhdGEucGF5bG9hZF9zaXplID0gaGRyLT5wa3Rfc2l6ZSAtIGhkcl9zaXplOworCWRhdGEub3Bjb2RlID0gaGRyLT5vcGNvZGU7CisJZGF0YS5zcmMgPSBzcmM7CisJZGF0YS5zcmNfcG9ydCA9IGhkci0+c3JjX3BvcnQ7CisJZGF0YS5kZXN0X3BvcnQgPSBoZHItPmRlc3RfcG9ydDsKKwlkYXRhLnRva2VuID0gaGRyLT50b2tlbjsKKwlkYXRhLm1zZ190eXBlID0gbXNnX3R5cGU7CisJZGF0YS5wYXlsb2FkID0gTlVMTDsKKwlpZiAoZGF0YS5wYXlsb2FkX3NpemUgPiAwKQorCQlkYXRhLnBheWxvYWQgPSAoY2hhciAqKWhkciArIGhkcl9zaXplOworCisJaWYgKHVubGlrZWx5KGFwcl9jZl9kZWJ1ZykpIHsKKwkJaWYgKGhkci0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUICYmIGRhdGEucGF5bG9hZCkgeworCQkJdWludDMyX3QgKnB0ciA9IGRhdGEucGF5bG9hZDsKKworCQkJQVBSX1BLVF9JTkZPKAorCQkJIlJ4OiBzcmNfYWRkclsweCVYXSBkZXN0X2FkZHJbMHglWF0gb3Bjb2RlWzB4JVhdIHRva2VuWzB4JVhdIHJjWzB4JVhdIiwKKwkJCShoZHItPnNyY19kb21haW4gPDwgOCkgfCBoZHItPnNyY19zdmMsCisJCQkoaGRyLT5kZXN0X2RvbWFpbiA8PCA4KSB8IGhkci0+ZGVzdF9zdmMsCisJCQloZHItPm9wY29kZSwgaGRyLT50b2tlbiwgcHRyWzFdKTsKKwkJfSBlbHNlIHsKKwkJCUFQUl9QS1RfSU5GTygKKwkJCSJSeDogc3JjX2FkZHJbMHglWF0gZGVzdF9hZGRyWzB4JVhdIG9wY29kZVsweCVYXSB0b2tlblsweCVYXSIsCisJCQkoaGRyLT5zcmNfZG9tYWluIDw8IDgpIHwgaGRyLT5zcmNfc3ZjLAorCQkJKGhkci0+ZGVzdF9kb21haW4gPDwgOCkgfCBoZHItPmRlc3Rfc3ZjLCBoZHItPm9wY29kZSwKKwkJCWhkci0+dG9rZW4pOworCQl9CisJfQorCisJdGVtcF9wb3J0ID0gKChkYXRhLmRlc3RfcG9ydCA+PiA4KSAqIDgpICsgKGRhdGEuZGVzdF9wb3J0ICYgMHhGRik7CisJcHJfZGVidWcoInBvcnQgPSAlZCB0X3BvcnQgPSAlZFxuIiwgZGF0YS5zcmNfcG9ydCwgdGVtcF9wb3J0KTsKKwlpZiAoY19zdmMtPnBvcnRfY250ICYmIGNfc3ZjLT5wb3J0X2ZuW3RlbXBfcG9ydF0pCisJCWNfc3ZjLT5wb3J0X2ZuW3RlbXBfcG9ydF0oJmRhdGEsICBjX3N2Yy0+cG9ydF9wcml2W3RlbXBfcG9ydF0pOworCWVsc2UgaWYgKGNfc3ZjLT5mbikKKwkJY19zdmMtPmZuKCZkYXRhLCBjX3N2Yy0+cHJpdik7CisJZWxzZQorCQlwcl9lcnIoIkFQUjogUnhlZCBhIHBhY2tldCBmb3IgTlVMTCBjYWxsYmFja1xuIik7Cit9CisKK2ludCBhcHJfZ2V0X3N2Yyhjb25zdCBjaGFyICpzdmNfbmFtZSwgaW50IGRvbWFpbl9pZCwgaW50ICpjbGllbnRfaWQsCisJCWludCAqc3ZjX2lkeCwgaW50ICpzdmNfaWQpCit7CisJaW50IGk7CisJaW50IHNpemU7CisJc3RydWN0IGFwcl9zdmNfdGFibGUgKnRibDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkb21haW5faWQgPT0gQVBSX0RPTUFJTl9BRFNQKSB7CisJCXRibCA9IChzdHJ1Y3QgYXByX3N2Y190YWJsZSAqKSZzdmNfdGJsX3Fkc3A2OworCQlzaXplID0gQVJSQVlfU0laRShzdmNfdGJsX3Fkc3A2KTsKKwl9IGVsc2UgeworCQl0YmwgPSAoc3RydWN0IGFwcl9zdmNfdGFibGUgKikmc3ZjX3RibF92b2ljZTsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUoc3ZjX3RibF92b2ljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoIXN0cmNtcChzdmNfbmFtZSwgdGJsW2ldLm5hbWUpKSB7CisJCQkqY2xpZW50X2lkID0gdGJsW2ldLmNsaWVudF9pZDsKKwkJCSpzdmNfaWR4ID0gdGJsW2ldLmlkeDsKKwkJCSpzdmNfaWQgPSB0YmxbaV0uaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXByX2RlYnVnKCIlczogc3ZjX25hbWUgPSAlcyBjX2lkID0gJWQgZG9tYWluX2lkID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgc3ZjX25hbWUsICpjbGllbnRfaWQsIGRvbWFpbl9pZCk7CisJaWYgKGkgPT0gc2l6ZSkgeworCQlwcl9lcnIoIiVzOiBBUFI6IFdyb25nIHN2YyBuYW1lICVzXG4iLCBfX2Z1bmNfXywgc3ZjX25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwcl9yZXNldF9kZXJlZ2lzdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXByX3N2YyAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgYXByX3Jlc2V0X3dvcmsgKmFwcl9yZXNldCA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFwcl9yZXNldF93b3JrLCB3b3JrKTsKKworCWhhbmRsZSA9IGFwcl9yZXNldC0+aGFuZGxlOworCXByX2RlYnVnKCIlczpoYW5kbGVbJXBLXVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisJYXByX2RlcmVnaXN0ZXIoaGFuZGxlKTsKKwlrZnJlZShhcHJfcmVzZXQpOworfQorCitpbnQgYXByX2RlcmVnaXN0ZXIodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhcHJfc3ZjICpzdmMgPSBoYW5kbGU7CisJc3RydWN0IGFwcl9jbGllbnQgKmNsbnQ7CisJdWludDE2X3QgZGVzdF9pZDsKKwl1aW50MTZfdCBjbGllbnRfaWQ7CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZzdmMtPm1fbG9jayk7CisJZGVzdF9pZCA9IHN2Yy0+ZGVzdF9pZDsKKwljbGllbnRfaWQgPSBzdmMtPmNsaWVudF9pZDsKKwljbG50ID0gJmNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdOworCisJaWYgKHN2Yy0+cG9ydF9jbnQgPiAwIHx8IHN2Yy0+c3ZjX2NudCA+IDApIHsKKwkJaWYgKHN2Yy0+cG9ydF9jbnQpCisJCQlzdmMtPnBvcnRfY250LS07CisJCWVsc2UgaWYgKHN2Yy0+c3ZjX2NudCkKKwkJCXN2Yy0+c3ZjX2NudC0tOworCQlpZiAoIXN2Yy0+cG9ydF9jbnQgJiYgIXN2Yy0+c3ZjX2NudCkgeworCQkJY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uc3ZjX2NudC0tOworCQkJc3ZjLT5uZWVkX3Jlc2V0ID0gMHgwOworCQl9CisJfSBlbHNlIGlmIChjbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXS5zdmNfY250ID4gMCkgeworCQljbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXS5zdmNfY250LS07CisJCWlmICghY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uc3ZjX2NudCkgeworCQkJc3ZjLT5uZWVkX3Jlc2V0ID0gMHgwOworCQkJcHJfZGVidWcoIiVzOiBzZXJ2aWNlIGlzIHJlc2V0ICVwS1xuIiwgX19mdW5jX18sIHN2Yyk7CisJCX0KKwl9CisKKwlpZiAoIXN2Yy0+cG9ydF9jbnQgJiYgIXN2Yy0+c3ZjX2NudCkgeworCQlzdmMtPnByaXYgPSBOVUxMOworCQlzdmMtPmlkID0gMDsKKwkJc3ZjLT5mbiA9IE5VTEw7CisJCXN2Yy0+ZGVzdF9pZCA9IDA7CisJCXN2Yy0+Y2xpZW50X2lkID0gMDsKKwkJc3ZjLT5uZWVkX3Jlc2V0ID0gMHgwOworCX0KKwlpZiAoY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlICYmCisJICAgICFjbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXS5zdmNfY250KSB7CisJCWFwcl90YWxfY2xvc2UoY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlKTsKKwkJY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzdmMtPm1fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhcHJfcmVzZXQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhcHJfcmVzZXRfd29yayAqYXByX3Jlc2V0X3dvcmtlciA9IE5VTEw7CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuOworCXByX2RlYnVnKCIlczogaGFuZGxlWyVwS11cbiIsIF9fZnVuY19fLCBoYW5kbGUpOworCisJaWYgKGFwcl9yZXNldF93b3JrcXVldWUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBhcHJfcmVzZXRfd29ya3F1ZXVlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWFwcl9yZXNldF93b3JrZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXByX3Jlc2V0X3dvcmspLAorCQkJCQkJCUdGUF9BVE9NSUMpOworCisJaWYgKGFwcl9yZXNldF93b3JrZXIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBtZW0gZmFpbHVyZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJYXByX3Jlc2V0X3dvcmtlci0+aGFuZGxlID0gaGFuZGxlOworCUlOSVRfV09SSygmYXByX3Jlc2V0X3dvcmtlci0+d29yaywgYXByX3Jlc2V0X2RlcmVnaXN0ZXIpOworCXF1ZXVlX3dvcmsoYXByX3Jlc2V0X3dvcmtxdWV1ZSwgJmFwcl9yZXNldF93b3JrZXItPndvcmspOworfQorCisvKiBEaXNwYXRjaCB0aGUgUmVzZXQgZXZlbnRzIHRvIE1vZGVtIGFuZCBhdWRpbyBjbGllbnRzICovCitzdGF0aWMgdm9pZCBkaXNwYXRjaF9ldmVudCh1bnNpZ25lZCBsb25nIGNvZGUsIHVpbnQxNl90IHByb2MpCit7CisJc3RydWN0IGFwcl9jbGllbnQgKmFwcl9jbGllbnQ7CisJc3RydWN0IGFwcl9jbGllbnRfZGF0YSBkYXRhOworCXN0cnVjdCBhcHJfc3ZjICpzdmM7CisJdWludDE2X3QgY2xudDsKKwlpbnQgaSwgajsKKworCWRhdGEub3Bjb2RlID0gUkVTRVRfRVZFTlRTOworCWRhdGEucmVzZXRfZXZlbnQgPSBjb2RlOworCisJLyogU2VydmljZSBkb21haW4gY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBwcm9jZXNzb3IgKi8KKwlkYXRhLnJlc2V0X3Byb2MgPSBhcHJfZ2V0X3Jlc2V0X2RvbWFpbihwcm9jKTsKKworCWNsbnQgPSBBUFJfQ0xJRU5UX0FVRElPOworCWFwcl9jbGllbnQgPSAmY2xpZW50W3Byb2NdW2NsbnRdOworCWZvciAoaSA9IDA7IGkgPCBBUFJfU1ZDX01BWDsgaSsrKSB7CisJCW11dGV4X2xvY2soJmFwcl9jbGllbnQtPnN2Y1tpXS5tX2xvY2spOworCQlpZiAoYXByX2NsaWVudC0+c3ZjW2ldLmZuKSB7CisJCQlhcHJfY2xpZW50LT5zdmNbaV0ubmVlZF9yZXNldCA9IDB4MTsKKwkJCWFwcl9jbGllbnQtPnN2Y1tpXS5mbigmZGF0YSwgYXByX2NsaWVudC0+c3ZjW2ldLnByaXYpOworCQl9CisJCWlmIChhcHJfY2xpZW50LT5zdmNbaV0ucG9ydF9jbnQpIHsKKwkJCXN2YyA9ICYoYXByX2NsaWVudC0+c3ZjW2ldKTsKKwkJCXN2Yy0+bmVlZF9yZXNldCA9IDB4MTsKKwkJCWZvciAoaiA9IDA7IGogPCBBUFJfTUFYX1BPUlRTOyBqKyspCisJCQkJaWYgKHN2Yy0+cG9ydF9mbltqXSkKKwkJCQkJc3ZjLT5wb3J0X2ZuW2pdKCZkYXRhLAorCQkJCQkJc3ZjLT5wb3J0X3ByaXZbal0pOworCQl9CisJCW11dGV4X3VubG9jaygmYXByX2NsaWVudC0+c3ZjW2ldLm1fbG9jayk7CisJfQorCisJY2xudCA9IEFQUl9DTElFTlRfVk9JQ0U7CisJYXByX2NsaWVudCA9ICZjbGllbnRbcHJvY11bY2xudF07CisJZm9yIChpID0gMDsgaSA8IEFQUl9TVkNfTUFYOyBpKyspIHsKKwkJbXV0ZXhfbG9jaygmYXByX2NsaWVudC0+c3ZjW2ldLm1fbG9jayk7CisJCWlmIChhcHJfY2xpZW50LT5zdmNbaV0uZm4pIHsKKwkJCWFwcl9jbGllbnQtPnN2Y1tpXS5uZWVkX3Jlc2V0ID0gMHgxOworCQkJYXByX2NsaWVudC0+c3ZjW2ldLmZuKCZkYXRhLCBhcHJfY2xpZW50LT5zdmNbaV0ucHJpdik7CisJCX0KKwkJaWYgKGFwcl9jbGllbnQtPnN2Y1tpXS5wb3J0X2NudCkgeworCQkJc3ZjID0gJihhcHJfY2xpZW50LT5zdmNbaV0pOworCQkJc3ZjLT5uZWVkX3Jlc2V0ID0gMHgxOworCQkJZm9yIChqID0gMDsgaiA8IEFQUl9NQVhfUE9SVFM7IGorKykKKwkJCQlpZiAoc3ZjLT5wb3J0X2ZuW2pdKQorCQkJCQlzdmMtPnBvcnRfZm5bal0oJmRhdGEsCisJCQkJCQlzdmMtPnBvcnRfcHJpdltqXSk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhcHJfY2xpZW50LT5zdmNbaV0ubV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXByX25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhdWRpb19ub3RpZmllcl9jYl9kYXRhICpjYl9kYXRhID0gZGF0YTsKKworCWlmIChjYl9kYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQ2FsbGJhY2sgZGF0YSBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiBTZXJ2aWNlIG9wY29kZSAweCVseCwgZG9tYWluICVkXG4iLAorCQlfX2Z1bmNfXywgb3Bjb2RlLCBjYl9kYXRhLT5kb21haW4pOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjoKKwkJLyoKKwkJICogVXNlIGZsYWcgdG8gaWdub3JlIGRvd24gbm90aWZpY2F0aW9ucyBkdXJpbmcKKwkJICogaW5pdGlhbCBib290LiBUaGVyZSBpcyBubyBiZW5lZml0IGZyb20gZXJyb3IKKwkJICogcmVjb3Zlcnkgbm90aWZpY2F0aW9ucyBkdXJpbmcgaW5pdGlhbCBib290CisJCSAqIHVwIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgZG93bi4KKwkJICovCisJCWlmIChpc19pbml0aWFsX2Jvb3QpCisJCQlicmVhazsKKwkJaWYgKGNiX2RhdGEtPmRvbWFpbiA9PSBBVURJT19OT1RJRklFUl9NT0RFTV9ET01BSU4pCisJCQlhcHJfbW9kZW1fZG93bihvcGNvZGUpOworCQllbHNlCisJCQlhcHJfYWRzcF9kb3duKG9wY29kZSk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKKwkJaXNfaW5pdGlhbF9ib290ID0gZmFsc2U7CisJCWlmIChjYl9kYXRhLT5kb21haW4gPT0gQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOKQorCQkJYXByX21vZGVtX3VwKCk7CisJCWVsc2UKKwkJCWFwcl9hZHNwX3VwKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK2RvbmU6CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXJ2aWNlX25iID0geworCS5ub3RpZmllcl9jYWxsICA9IGFwcl9ub3RpZmllcl9zZXJ2aWNlX2NiLAorCS5wcmlvcml0eSA9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcHJfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCBrOworCisJZm9yIChpID0gMDsgaSA8IEFQUl9ERVNUX01BWDsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgQVBSX0NMSUVOVF9NQVg7IGorKykgeworCQkJbXV0ZXhfaW5pdCgmY2xpZW50W2ldW2pdLm1fbG9jayk7CisJCQlmb3IgKGsgPSAwOyBrIDwgQVBSX1NWQ19NQVg7IGsrKykgeworCQkJCW11dGV4X2luaXQoJmNsaWVudFtpXVtqXS5zdmNba10ubV9sb2NrKTsKKwkJCQlzcGluX2xvY2tfaW5pdCgmY2xpZW50W2ldW2pdLnN2Y1trXS53X2xvY2spOworCQkJfQorCQl9CisJYXByX3NldF9zdWJzeXNfc3RhdGUoKTsKKwltdXRleF9pbml0KCZxNi5sb2NrKTsKKwlhcHJfcmVzZXRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImFwcl9kcml2ZXIiKTsKKwlpZiAoIWFwcl9yZXNldF93b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCisJYXByX3BrdF9jdHggPSBpcGNfbG9nX2NvbnRleHRfY3JlYXRlKEFQUl9QS1RfSVBDX0xPR19QQUdFX0NOVCwKKwkJCQkJCSJhcHIiLCAwKTsKKwlpZiAoIWFwcl9wa3RfY3R4KQorCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gY3JlYXRlIGlwYyBsb2cgY29udGV4dFxuIiwgX19mdW5jX18pOworCisJaXNfaW5pdGlhbF9ib290ID0gdHJ1ZTsKKwlzdWJzeXNfbm90aWZfcmVnaXN0ZXIoImFwcl9hZHNwIiwgQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU4sCisJCQkgICAgICAmc2VydmljZV9uYik7CisJc3Vic3lzX25vdGlmX3JlZ2lzdGVyKCJhcHJfbW9kZW0iLCBBVURJT19OT1RJRklFUl9NT0RFTV9ET01BSU4sCisJCQkgICAgICAmc2VydmljZV9uYik7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChhcHJfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFwcl9sYXRlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRzcF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtb2RlbV93YWl0KTsKKworCXJldHVybiByZXQ7Cit9CitsYXRlX2luaXRjYWxsKGFwcl9sYXRlX2luaXQpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IF9faW5pdCBhcHJfZGVidWdfaW5pdCh2b2lkKQoreworCWRlYnVnZnNfYXByX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZmlsZSgibXNtX2Fwcl9kZWJ1ZyIsCisJCQkJCQkgU19JRlJFRyB8IDA0NDQsIE5VTEwsIE5VTEwsCisJCQkJCQkgJmFwcl9kZWJ1Z19vcHMpOworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKGFwcl9kZWJ1Z19pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl90YWwuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHJfdGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyOTZmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3RhbC5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgMjAxMy0yMDE0LCAyMDE2LTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgorCitzdGF0aWMgY2hhciAqc3ZjX25hbWVzW0FQUl9ERVNUX01BWF1bQVBSX0NMSUVOVF9NQVhdID0geworCXsKKwkJImFwcl9hdWRpb19zdmMiLAorCQkiYXByX3ZvaWNlX3N2YyIsCisJfSwKKwl7CisJCSJhcHJfYXVkaW9fc3ZjIiwKKwkJImFwcl92b2ljZV9zdmMiLAorCX0sCit9OworCitzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgYXByX3N2Y19jaFtBUFJfRExfTUFYXVtBUFJfREVTVF9NQVhdW0FQUl9DTElFTlRfTUFYXTsKKworaW50IF9fYXByX3RhbF93cml0ZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBhcHJfcGt0X3ByaXYgKnBrdF9wcml2LCBpbnQgbGVuKQoreworCWludCB3X2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFwcl9jaC0+d19sb2NrLCBmbGFncyk7CisJaWYgKHNtZF93cml0ZV9hdmFpbChhcHJfY2gtPmNoKSA8IGxlbikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPndfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwl3X2xlbiA9IHNtZF93cml0ZShhcHJfY2gtPmNoLCBkYXRhLCBsZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcl9jaC0+d19sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiYXByX3RhbDp3X2xlbiA9ICVkXG4iLCB3X2xlbik7CisKKwlpZiAod19sZW4gIT0gbGVuKSB7CisJCXByX2VycigiYXByX3RhbDogRXJyb3IgaW4gd3JpdGVcbiIpOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisJcmV0dXJuIHdfbGVuOworfQorCitpbnQgYXByX3RhbF93cml0ZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBhcHJfcGt0X3ByaXYgKnBrdF9wcml2LCBpbnQgbGVuKQoreworCWludCByYyA9IDAsIHJldHJpZXMgPSAwOworCisJaWYgKCFhcHJfY2gtPmNoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvIHsKKwkJaWYgKHJjID09IC1FQUdBSU4pCisJCQl1ZGVsYXkoNTApOworCisJCXJjID0gX19hcHJfdGFsX3dyaXRlKGFwcl9jaCwgZGF0YSwgcGt0X3ByaXYsIGxlbik7CisJfSB3aGlsZSAocmMgPT0gLUVBR0FJTiAmJiByZXRyaWVzKysgPCAzMDApOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCXByX2VycigiYXByX3RhbDogVElNRU9VVCBmb3Igd3JpdGVcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBhcHJfdGFsX25vdGlmeSh2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2ggPSBwcml2OworCWludCBsZW4sIHJfbGVuLCBzejsKKwlpbnQgcGt0X2NudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCJldmVudCA9ICVkXG4iLCBldmVudCk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU01EX0VWRU5UX0RBVEE6CisJCXBrdF9jbnQgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXByX2NoLT5sb2NrLCBmbGFncyk7CitjaGVja19wZW5kaW5nOgorCQlsZW4gPSBzbWRfcmVhZF9hdmFpbChhcHJfY2gtPmNoKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXByX2VycigiYXByX3RhbDogSW52YWxpZCBSZWFkIEV2ZW50IDolZFxuIiwgbGVuKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcl9jaC0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXN6ID0gc21kX2N1cl9wYWNrZXRfc2l6ZShhcHJfY2gtPmNoKTsKKwkJaWYgKHN6IDwgMCkgeworCQkJcHJfZGVidWcoInBrdCBzaXplIGlzIHplcm9cbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXByX2NoLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFsZW4gJiYgIXN6ICYmICFwa3RfY250KQorCQkJZ290byBjaGVja193cml0ZV9hdmFpbDsKKwkJaWYgKCFsZW4pIHsKKwkJCXByX2RlYnVnKCJsZW4gPSAlZCBwa3RfY250ID0gJWRcbiIsIGxlbiwgcGt0X2NudCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlyX2xlbiA9IHNtZF9yZWFkX2Zyb21fY2IoYXByX2NoLT5jaCwgYXByX2NoLT5kYXRhLCBsZW4pOworCQlpZiAobGVuICE9IHJfbGVuKSB7CisJCQlwcl9lcnIoImFwcl90YWw6IEludmFsaWQgUmVhZFxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlwa3RfY250Kys7CisJCXByX2RlYnVnKCIlZCAlZCAlZFxuIiwgbGVuLCBzeiwgcGt0X2NudCk7CisJCWlmIChhcHJfY2gtPmZ1bmMpCisJCQlhcHJfY2gtPmZ1bmMoYXByX2NoLT5kYXRhLCByX2xlbiwgYXByX2NoLT5wcml2KTsKKwkJZ290byBjaGVja19wZW5kaW5nOworY2hlY2tfd3JpdGVfYXZhaWw6CisJCWlmIChzbWRfd3JpdGVfYXZhaWwoYXByX2NoLT5jaCkpCisJCQl3YWtlX3VwKCZhcHJfY2gtPndhaXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTTURfRVZFTlRfT1BFTjoKKwkJcHJfZGVidWcoImFwcl90YWw6IFNNRF9FVkVOVF9PUEVOXG4iKTsKKwkJYXByX2NoLT5zbWRfc3RhdGUgPSAxOworCQl3YWtlX3VwKCZhcHJfY2gtPndhaXQpOworCQlicmVhazsKKwljYXNlIFNNRF9FVkVOVF9DTE9TRToKKwkJcHJfZGVidWcoImFwcl90YWw6IFNNRF9FVkVOVF9DTE9TRVxuIik7CisJCWJyZWFrOworCX0KK30KKworaW50IGFwcl90YWxfcnhfaW50ZW50c19jb25maWcoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gsCisJCQlpbnQgbnVtX29mX2ludGVudHMsIHVpbnQzMl90IHNpemUpCit7CisJLyogUnggaW50ZW50cyBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIGZvciBHbGluaworCSAqIGJ1dCBub3QgZm9yIFNNRC4gTm8tb3AgZm9yIHRoaXMgZnVuY3Rpb24uCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX3RhbF9vcGVuKHVpbnQzMl90IGNsbnQsIHVpbnQzMl90IGRlc3QsCisJCQkJdWludDMyX3QgZGwsIGFwcl9zdmNfY2JfZm4gZnVuYywgdm9pZCAqcHJpdikKK3sKKwlpbnQgcmM7CisKKwlpZiAoKGNsbnQgPj0gQVBSX0NMSUVOVF9NQVgpIHx8IChkZXN0ID49IEFQUl9ERVNUX01BWCkgfHwKKwkJCQkJCShkbCA+PSBBUFJfRExfTUFYKSkgeworCQlwcl9lcnIoImFwcl90YWw6IEludmFsaWQgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmNoKSB7CisJCXByX2VycigiYXByX3RhbDogVGhpcyBjaGFubmVsIGFscmVkYXkgb3BlbmVuZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW11dGV4X2xvY2soJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLm1fbG9jayk7CisJaWYgKCFhcHJfc3ZjX2NoW2RsXVtkZXN0XVtjbG50XS5kZXN0X3N0YXRlKSB7CisJCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmRlc3QsCisJCQlhcHJfc3ZjX2NoW2RsXVtkZXN0XVtjbG50XS5kZXN0X3N0YXRlLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoQVBSX09QRU5fVElNRU9VVF9NUykpOworCQlpZiAocmMgPT0gMCkgeworCQkJcHJfZXJyKCJhcHJfdGFsOm9wZW4gdGltZW91dFxuIik7CisJCQltdXRleF91bmxvY2soJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLm1fbG9jayk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwcl9kZWJ1ZygiYXByX3RhbDpXYWtldXAgZG9uZVxuIik7CisJCWFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmRlc3Rfc3RhdGUgPSAwOworCX0KKwlyYyA9IHNtZF9uYW1lZF9vcGVuX29uX2VkZ2Uoc3ZjX25hbWVzW2Rlc3RdW2NsbnRdLCBkZXN0LAorCQkJJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmNoLAorCQkJJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLAorCQkJYXByX3RhbF9ub3RpZnkpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCJhcHJfdGFsOiBzbWRfb3BlbiBmYWlsZWQgJXNcbiIsCisJCQkJCXN2Y19uYW1lc1tkZXN0XVtjbG50XSk7CisJCW11dGV4X3VubG9jaygmYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF0ubV9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLndhaXQsCisJCShhcHJfc3ZjX2NoW2RsXVtkZXN0XVtjbG50XS5zbWRfc3RhdGUgPT0gMSksIDUgKiBIWik7CisJaWYgKHJjID09IDApIHsKKwkJcHJfZXJyKCJhcHJfdGFsOlRJTUVPVVQgZm9yIE9QRU4gZXZlbnRcbiIpOworCQltdXRleF91bmxvY2soJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLm1fbG9jayk7CisJCWFwcl90YWxfY2xvc2UoJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21kX2Rpc2FibGVfcmVhZF9pbnRyKGFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmNoKTsKKworCWlmICghYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF0uZGVzdF9zdGF0ZSkgeworCQlhcHJfc3ZjX2NoW2RsXVtkZXN0XVtjbG50XS5kZXN0X3N0YXRlID0gMTsKKwkJcHJfZGVidWcoImFwcl90YWw6V2FpdGluZyBmb3IgYXByIHN2YyBpbml0XG4iKTsKKwkJbXNsZWVwKDIwMCk7CisJCXByX2RlYnVnKCJhcHJfdGFsOmFwciBzdmMgaW5pdCBkb25lXG4iKTsKKwl9CisJYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF0uc21kX3N0YXRlID0gMDsKKworCWFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLmZ1bmMgPSBmdW5jOworCWFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdLnByaXYgPSBwcml2OworCW11dGV4X3VubG9jaygmYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF0ubV9sb2NrKTsKKworCXJldHVybiAmYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF07Cit9CisKK2ludCBhcHJfdGFsX2Nsb3NlKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoKQoreworCWludCByOworCisJaWYgKCFhcHJfY2gtPmNoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmFwcl9jaC0+bV9sb2NrKTsKKwlyID0gc21kX2Nsb3NlKGFwcl9jaC0+Y2gpOworCWFwcl9jaC0+Y2ggPSBOVUxMOworCWFwcl9jaC0+ZnVuYyA9IE5VTEw7CisJYXByX2NoLT5wcml2ID0gTlVMTDsKKwltdXRleF91bmxvY2soJmFwcl9jaC0+bV9sb2NrKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBhcHJfc21kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGRlc3Q7CisJaW50IGNsbnQ7CisKKwlpZiAocGRldi0+aWQgPT0gQVBSX0RFU1RfTU9ERU0pIHsKKwkJcHJfaW5mbygiYXByX3RhbDpNb2RlbSBJcyBVcFxuIik7CisJCWRlc3QgPSBBUFJfREVTVF9NT0RFTTsKKwkJaWYgKCFzdHJjbXAocGRldi0+bmFtZSwgImFwcl9hdWRpb19zdmMiKSkKKwkJCWNsbnQgPSBBUFJfQ0xJRU5UX0FVRElPOworCQllbHNlCisJCQljbG50ID0gQVBSX0NMSUVOVF9WT0lDRTsKKwkJYXByX3N2Y19jaFtBUFJfRExfU01EXVtkZXN0XVtjbG50XS5kZXN0X3N0YXRlID0gMTsKKwkJd2FrZV91cCgmYXByX3N2Y19jaFtBUFJfRExfU01EXVtkZXN0XVtjbG50XS5kZXN0KTsKKwl9IGVsc2UgaWYgKHBkZXYtPmlkID09IEFQUl9ERVNUX1FEU1A2KSB7CisJCXByX2luZm8oImFwcl90YWw6UTYgSXMgVXBcbiIpOworCQlkZXN0ID0gQVBSX0RFU1RfUURTUDY7CisJCWNsbnQgPSBBUFJfQ0xJRU5UX0FVRElPOworCQlhcHJfc3ZjX2NoW0FQUl9ETF9TTURdW2Rlc3RdW2NsbnRdLmRlc3Rfc3RhdGUgPSAxOworCQl3YWtlX3VwKCZhcHJfc3ZjX2NoW0FQUl9ETF9TTURdW2Rlc3RdW2NsbnRdLmRlc3QpOworCX0gZWxzZQorCQlwcl9lcnIoImFwcl90YWw6SW52YWxpZCBEZXN0IElkOiAlZFxuIiwgcGRldi0+aWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFwcl9xNl9kcml2ZXIgPSB7CisJLnByb2JlID0gYXByX3NtZF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcHJfYXVkaW9fc3ZjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFwcl9tb2RlbV9kcml2ZXIgPSB7CisJLnByb2JlID0gYXByX3NtZF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcHJfdm9pY2Vfc3ZjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFwcl90YWxfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCBrOworCisJZm9yIChpID0gMDsgaSA8IEFQUl9ETF9NQVg7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEFQUl9ERVNUX01BWDsgaisrKQorCQkJZm9yIChrID0gMDsgayA8IEFQUl9DTElFTlRfTUFYOyBrKyspIHsKKwkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcHJfc3ZjX2NoW2ldW2pdW2tdLndhaXQpOworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFwcl9zdmNfY2hbaV1bal1ba10uZGVzdCk7CisJCQkJc3Bpbl9sb2NrX2luaXQoJmFwcl9zdmNfY2hbaV1bal1ba10ubG9jayk7CisJCQkJc3Bpbl9sb2NrX2luaXQoJmFwcl9zdmNfY2hbaV1bal1ba10ud19sb2NrKTsKKwkJCQltdXRleF9pbml0KCZhcHJfc3ZjX2NoW2ldW2pdW2tdLm1fbG9jayk7CisJCQl9CisJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhcHJfcTZfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFwcl9tb2RlbV9kcml2ZXIpOworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKGFwcl90YWxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3RhbF9nbGluay5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl90YWxfZ2xpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJlZDllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl90YWxfZ2xpbmsuYwpAQCAtMCwwICsxLDUxNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9zbWQuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9nbGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgorCisjZGVmaW5lIEFQUl9NQVhJTVVNX05VTV9PRl9SRVRSSUVTIDIKKworc3RydWN0IGFwcl90eF9idWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYXByX3BrdF9wcml2IHBrdF9wcml2OworCWNoYXIgYnVmW0FQUl9NQVhfQlVGXTsKK307CisKK3N0cnVjdCBhcHJfYnVmX2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdHJ1Y3QgbGlua19zdGF0ZSB7CisJdWludDMyX3QgZGVzdDsKKwl2b2lkICpoYW5kbGU7CisJZW51bSBnbGlua19saW5rX3N0YXRlIGxpbmtfc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGlua19zdGF0ZSBsaW5rX3N0YXRlW0FQUl9ERVNUX01BWF07CitzdGF0aWMgc3RydWN0IGFwcl9idWZfbGlzdCBidWZfbGlzdDsKKworc3RhdGljIGNoYXIgKnN2Y19uYW1lc1tBUFJfREVTVF9NQVhdW0FQUl9DTElFTlRfTUFYXSA9IHsKKwl7CisJCSJhcHJfYXVkaW9fc3ZjIiwKKwkJImFwcl92b2ljZV9zdmMiLAorCX0sCisJeworCQkiYXByX2F1ZGlvX3N2YyIsCisJCSJhcHJfdm9pY2Vfc3ZjIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhcHJfc3ZjX2NoX2RldgorCWFwcl9zdmNfY2hbQVBSX0RMX01BWF1bQVBSX0RFU1RfTUFYXVtBUFJfQ0xJRU5UX01BWF07CisKK3N0YXRpYyBzdHJ1Y3QgYXByX3R4X2J1ZiAqYXByX2dldF9mcmVlX2J1ZihpbnQgbGVuKQoreworCXN0cnVjdCBhcHJfdHhfYnVmICp0eF9idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsZW4gPiBBUFJfTUFYX0JVRikgeworCQlwcl9lcnIoIiVzOiBidWYgdG9vIGxhcmdlIFslZF1cbiIsIF9fZnVuY19fLCBsZW4pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnVmX2xpc3QubG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZidWZfbGlzdC5saXN0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWZfbGlzdC5sb2NrLCBmbGFncyk7CisJCXByX2VycigiJXM6IE5vIGJ1ZiBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJdHhfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYnVmX2xpc3QubGlzdCwgc3RydWN0IGFwcl90eF9idWYsIGxpc3QpOworCWxpc3RfZGVsKCZ0eF9idWYtPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1Zl9saXN0LmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB0eF9idWY7Cit9CisKK3N0YXRpYyB2b2lkIGFwcl9idWZfYWRkX3RhaWwoY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBhcHJfdHhfYnVmICpsaXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJ1Zl9saXN0LmxvY2ssIGZsYWdzKTsKKwlsaXN0ID0gY29udGFpbmVyX29mKCh2b2lkICopYnVmLCBzdHJ1Y3QgYXByX3R4X2J1ZiwgYnVmKTsKKwlsaXN0X2FkZF90YWlsKCZsaXN0LT5saXN0LCAmYnVmX2xpc3QubGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVmX2xpc3QubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fYXByX3RhbF93cml0ZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwgdm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBhcHJfcGt0X3ByaXYgKnBrdF9wcml2LCBpbnQgbGVuKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcHJfY2gtPndfbG9jaywgZmxhZ3MpOworCXJjID0gZ2xpbmtfdHgoYXByX2NoLT5oYW5kbGUsIHBrdF9wcml2LCBkYXRhLCBsZW4sCisJCQlHTElOS19UWF9SRVFfSU5URU5UIHwgR0xJTktfVFhfQVRPTUlDKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPndfbG9jaywgZmxhZ3MpOworCisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBnbGlua190eCBmYWlsZWQsIHJjWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwllbHNlCisJCXJjID0gbGVuOworCisJcmV0dXJuIHJjOworfQorCitpbnQgYXByX3RhbF93cml0ZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwgdm9pZCAqZGF0YSwKKwkJICBzdHJ1Y3QgYXByX3BrdF9wcml2ICpwa3RfcHJpdiwgaW50IGxlbikKK3sKKwlpbnQgcmMgPSAwLCByZXRyaWVzID0gMDsKKwl2b2lkICpwa3RfZGF0YSA9IE5VTEw7CisJc3RydWN0IGFwcl90eF9idWYgKnR4X2J1ZjsKKwlzdHJ1Y3QgYXByX3BrdF9wcml2ICpwa3RfcHJpdl9wdHIgPSBwa3RfcHJpdjsKKworCWlmICghYXByX2NoLT5oYW5kbGUgfHwgIXBrdF9wcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwa3RfcHJpdi0+cGt0X293bmVyID09IEFQUl9QS1RfT1dORVJfRFJJVkVSKSB7CisJCXR4X2J1ZiA9IGFwcl9nZXRfZnJlZV9idWYobGVuKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKHR4X2J1ZikpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQltZW1jcHkodHhfYnVmLT5idWYsIGRhdGEsIGxlbik7CisJCW1lbWNweSgmdHhfYnVmLT5wa3RfcHJpdiwgcGt0X3ByaXYsIHNpemVvZih0eF9idWYtPnBrdF9wcml2KSk7CisJCXBrdF9wcml2X3B0ciA9ICZ0eF9idWYtPnBrdF9wcml2OworCQlwa3RfZGF0YSA9IHR4X2J1Zi0+YnVmOworCX0gZWxzZSB7CisJCXBrdF9kYXRhID0gZGF0YTsKKwl9CisKKwlkbyB7CisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJdWRlbGF5KDUwKTsKKworCQlyYyA9IF9fYXByX3RhbF93cml0ZShhcHJfY2gsIHBrdF9kYXRhLCBwa3RfcHJpdl9wdHIsIGxlbik7CisJfSB3aGlsZSAocmMgPT0gLUVBR0FJTiAmJiByZXRyaWVzKysgPCBBUFJfTUFYSU1VTV9OVU1fT0ZfUkVUUklFUyk7CisKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBzZW5kIHRoZSBwYWNrZXQsIHJjOiVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlpZiAocGt0X3ByaXYtPnBrdF9vd25lciA9PSBBUFJfUEtUX09XTkVSX0RSSVZFUikKKwkJCWFwcl9idWZfYWRkX3RhaWwocGt0X2RhdGEpOworCX0KK2V4aXQ6CisJcmV0dXJuIHJjOworfQorCit2b2lkIGFwcl90YWxfbm90aWZ5X3J4KHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwgY29uc3Qgdm9pZCAqcGt0X3ByaXYsCisJCSAgICAgICBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoID0gKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqKXByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYXByX2NoIHx8ICFwdHIpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBhcHJfY2ggb3IgcHRyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IFJ4IHBhY2tldCByZWNlaXZlZFxuIiwgX19mdW5jX18pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFwcl9jaC0+cl9sb2NrLCBmbGFncyk7CisJaWYgKGFwcl9jaC0+ZnVuYykKKwkJYXByX2NoLT5mdW5jKCh2b2lkICopcHRyLCBzaXplLCAodm9pZCAqKXBrdF9wcml2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJfY2gtPnJfbG9jaywgZmxhZ3MpOworCWdsaW5rX3J4X2RvbmUoYXByX2NoLT5oYW5kbGUsIHB0ciwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcl90YWxfbm90aWZ5X3R4X2Fib3J0KHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKKwkJCQkgICAgY29uc3Qgdm9pZCAqcGt0X3ByaXYpCit7CisJc3RydWN0IGFwcl9wa3RfcHJpdiAqYXByX3BrdF9wcml2X3B0ciA9CisJCQkJKHN0cnVjdCBhcHJfcGt0X3ByaXYgKilwa3RfcHJpdjsKKwlzdHJ1Y3QgYXByX3R4X2J1ZiAqbGlzdF9ub2RlOworCisJaWYgKCFhcHJfcGt0X3ByaXZfcHRyKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGt0X3ByaXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCIlczogdHhfYWJvcnQgcmVjZWl2ZWQgZm9yIGFwcl9wa3RfcHJpdl9wdHI6JXBLXG4iLAorCQkgX19mdW5jX18sIGFwcl9wa3RfcHJpdl9wdHIpOworCisJaWYgKGFwcl9wa3RfcHJpdl9wdHItPnBrdF9vd25lciA9PSBBUFJfUEtUX09XTkVSX0RSSVZFUikgeworCQlsaXN0X25vZGUgPSBjb250YWluZXJfb2YoYXByX3BrdF9wcml2X3B0ciwKKwkJCQkJIHN0cnVjdCBhcHJfdHhfYnVmLCBwa3RfcHJpdik7CisJCWFwcl9idWZfYWRkX3RhaWwobGlzdF9ub2RlLT5idWYpOworCX0KK30KKwordm9pZCBhcHJfdGFsX25vdGlmeV90eF9kb25lKHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKKwkJCSAgICBjb25zdCB2b2lkICpwa3RfcHJpdiwgY29uc3Qgdm9pZCAqcHRyKQoreworCXN0cnVjdCBhcHJfcGt0X3ByaXYgKmFwcl9wa3RfcHJpdiA9IChzdHJ1Y3QgYXByX3BrdF9wcml2ICopcGt0X3ByaXY7CisKKwlpZiAoIXBrdF9wcml2IHx8ICFwdHIpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwa3RfcHJpdiBvciBwdHJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCIlczogdHhfZG9uZSByZWNlaXZlZFxuIiwgX19mdW5jX18pOworCisJaWYgKGFwcl9wa3RfcHJpdi0+cGt0X293bmVyID09IEFQUl9QS1RfT1dORVJfRFJJVkVSKQorCQlhcHJfYnVmX2FkZF90YWlsKHB0cik7Cit9CisKK2Jvb2wgYXByX3RhbF9ub3RpZnlfcnhfaW50ZW50X3JlcSh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCisJCQkJICBzaXplX3QgcmVxX3NpemUpCit7CisJc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2ggPSAoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICopcHJpdjsKKworCWlmICghYXByX2NoKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgYXByX2NoXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcl9lcnIoIiVzOiBObyByeCBpbnRlbnRzIHF1ZXVlZCwgdW5hYmxlIHRvIHJlY2VpdmVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGFwcl90YWxfbm90aWZ5X3JlbW90ZV9yeF9pbnRlbnQodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAorCQkJCQkgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2ggPSAoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICopcHJpdjsKKworCWlmICghYXByX2NoKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgYXByX2NoXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmYXIgZW5kIGhhcyBxdWV1ZWQgYXQgbGVhc3Qgb25lIGludGVudAorCSAqIGJlZm9yZSB3ZSBhdHRtcHQgYW55IElQQy4gQSBzaW1wbGUgYm9vbCBmbGFnIGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mCisJICogYSBjb3VudGVyLCBhcyB0aGUgZmFyIGVuZCBpcyByZXF1aXJlZCB0byBndWFyYW50ZWUgaW50ZW50CisJICogYXZhaWxhYmlsaXR5IGZvciBhbGwgdXNlIGNhc2VzIG9uY2UgdGhlIGNoYW5uZWwgaXMgZnVsbHkgb3BlbmVkLgorCSAqLworCXByX2RlYnVnKCIlczogcmVtb3RlIHF1ZXVlZCBhbiBpbnRlbnRcbiIsIF9fZnVuY19fKTsKKwlhcHJfY2gtPmlmX3JlbW90ZV9pbnRlbnRfcmVhZHkgPSB0cnVlOworfQorCit2b2lkIGFwcl90YWxfbm90aWZ5X3N0YXRlKHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoID0gKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqKXByaXY7CisKKwlpZiAoIWFwcl9jaCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGFwcl9jaFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJYXByX2NoLT5jaGFubmVsX3N0YXRlID0gZXZlbnQ7CisJcHJfaW5mbygiJXM6IENoYW5uZWwgc3RhdGVbJWRdXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJaWYgKGV2ZW50ID09IEdMSU5LX0NPTk5FQ1RFRCkKKwkJd2FrZV91cCgmYXByX2NoLT53YWl0KTsKK30KKworaW50IGFwcl90YWxfcnhfaW50ZW50c19jb25maWcoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gsCisJCQkgICAgICBpbnQgbnVtX29mX2ludGVudHMsIHVpbnQzMl90IHNpemUpCit7CisJaW50IGk7CisJaW50IHJjOworCisJaWYgKCFhcHJfY2ggfHwgIW51bV9vZl9pbnRlbnRzIHx8ICFzaXplKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfaW50ZW50czsgaSsrKSB7CisJCXJjID0gZ2xpbmtfcXVldWVfcnhfaW50ZW50KGFwcl9jaC0+aGFuZGxlLCBhcHJfY2gsIHNpemUpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBxdWV1ZSByeCBpbnRlbnQsIGl0ZXJhdGlvblslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX3RhbF9vcGVuKHVpbnQzMl90IGNsbnQsIHVpbnQzMl90IGRlc3QsIHVpbnQzMl90IGRsLAorCQkJCSAgICBhcHJfc3ZjX2NiX2ZuIGZ1bmMsIHZvaWQgKnByaXYpCit7CisJaW50IHJjOworCXN0cnVjdCBnbGlua19vcGVuX2NvbmZpZyBvcGVuX2NmZzsKKwlzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaDsKKworCWlmICgoY2xudCA+PSBBUFJfQ0xJRU5UX01BWCkgfHwgKGRlc3QgPj0gQVBSX0RFU1RfTUFYKSB8fAorCSAgICAoZGwgPj0gQVBSX0RMX01BWCkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMsIGNsbnQ6JWQsIGRlc3Q6JWQsIGRsOiVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNsbnQsIGRlc3QsIGRsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYXByX2NoID0gJmFwcl9zdmNfY2hbZGxdW2Rlc3RdW2NsbnRdOworCW11dGV4X2xvY2soJmFwcl9jaC0+bV9sb2NrKTsKKwlpZiAoYXByX2NoLT5oYW5kbGUpIHsKKwkJcHJfZXJyKCIlczogVGhpcyBjaGFubmVsIGlzIGFscmVhZHkgb3BlbmVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAobGlua19zdGF0ZVtkZXN0XS5saW5rX3N0YXRlICE9IEdMSU5LX0xJTktfU1RBVEVfVVApIHsKKwkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQobGlua19zdGF0ZVtkZXN0XS53YWl0LAorCQkJbGlua19zdGF0ZVtkZXN0XS5saW5rX3N0YXRlID09IEdMSU5LX0xJTktfU1RBVEVfVVAsCisJCQltc2Vjc190b19qaWZmaWVzKEFQUl9PUEVOX1RJTUVPVVRfTVMpKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCXByX2VycigiJXM6IE9wZW4gdGltZW91dCwgZGVzdDolZFxuIiwgX19mdW5jX18sIGRlc3QpOworCQkJcmMgPSAtRVRJTUVET1VUOworCQkJZ290byB1bmxvY2s7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBXYWtldXAgZG9uZSwgZGVzdDolZFxuIiwgX19mdW5jX18sIGRlc3QpOworCX0KKworCW1lbXNldCgmb3Blbl9jZmcsIDAsIHNpemVvZihzdHJ1Y3QgZ2xpbmtfb3Blbl9jb25maWcpKTsKKwlvcGVuX2NmZy5vcHRpb25zID0gR0xJTktfT1BUX0lOSVRJQUxfWFBPUlQ7CisJaWYgKGRlc3QgPT0gQVBSX0RFU1RfTU9ERU0pCisJCW9wZW5fY2ZnLmVkZ2UgPSAibXBzcyI7CisJZWxzZQorCQlvcGVuX2NmZy5lZGdlID0gImxwYXNzIjsKKworCW9wZW5fY2ZnLm5hbWUgPSBzdmNfbmFtZXNbZGVzdF1bY2xudF07CisJb3Blbl9jZmcubm90aWZ5X3J4ID0gYXByX3RhbF9ub3RpZnlfcng7CisJb3Blbl9jZmcubm90aWZ5X3R4X2RvbmUgPSBhcHJfdGFsX25vdGlmeV90eF9kb25lOworCW9wZW5fY2ZnLm5vdGlmeV9zdGF0ZSA9IGFwcl90YWxfbm90aWZ5X3N0YXRlOworCW9wZW5fY2ZnLm5vdGlmeV9yeF9pbnRlbnRfcmVxID0gYXByX3RhbF9ub3RpZnlfcnhfaW50ZW50X3JlcTsKKwlvcGVuX2NmZy5ub3RpZnlfcmVtb3RlX3J4X2ludGVudCA9IGFwcl90YWxfbm90aWZ5X3JlbW90ZV9yeF9pbnRlbnQ7CisJb3Blbl9jZmcubm90aWZ5X3R4X2Fib3J0ID0gYXByX3RhbF9ub3RpZnlfdHhfYWJvcnQ7CisJb3Blbl9jZmcucHJpdiA9IGFwcl9jaDsKKwlvcGVuX2NmZy50cmFuc3BvcnQgPSAic21lbSI7CisKKwlhcHJfY2gtPmNoYW5uZWxfc3RhdGUgPSBHTElOS19SRU1PVEVfRElTQ09OTkVDVEVEOworCWFwcl9jaC0+aGFuZGxlID0gZ2xpbmtfb3Blbigmb3Blbl9jZmcpOworCWlmIChJU19FUlJfT1JfTlVMTChhcHJfY2gtPmhhbmRsZSkpIHsKKwkJcHJfZXJyKCIlczogZ2xpbmtfb3BlbiBmYWlsZWQgJXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgc3ZjX25hbWVzW2Rlc3RdW2NsbnRdKTsKKwkJYXByX2NoLT5oYW5kbGUgPSBOVUxMOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFwcl9jaC0+d2FpdCwKKwkJKGFwcl9jaC0+Y2hhbm5lbF9zdGF0ZSA9PSBHTElOS19DT05ORUNURUQpLCA1ICogSFopOworCWlmIChyYyA9PSAwKSB7CisJCXByX2VycigiJXM6IFRJTUVPVVQgZm9yIE9QRU4gZXZlbnRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGNsb3NlX2xpbms7CisJfQorCisJLyoKKwkgKiBSZW1vdGUgaW50ZW50IGlzIG5vdCByZXF1aXJlZCBmb3IgR0xJTksgPC0tPiBTTUQgSVBDLCBzbyB0aGlzIGlzCisJICogZGVzaWduZWQgbm90IHRvIGZhaWwgdGhlIG9wZW4gY2FsbC4KKwkgKi8KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhcHJfY2gtPndhaXQsCisJCWFwcl9jaC0+aWZfcmVtb3RlX2ludGVudF9yZWFkeSwgNSAqIEhaKTsKKwlpZiAocmMgPT0gMCkKKwkJcHJfZXJyKCIlczogVElNRU9VVCBmb3IgcmVtb3RlIGludGVudCByZWFkaW5lc3NcbiIsIF9fZnVuY19fKTsKKworCXJjID0gYXByX3RhbF9yeF9pbnRlbnRzX2NvbmZpZyhhcHJfY2gsIEFQUl9ERUZBVUxUX05VTV9PRl9JTlRFTlRTLAorCQkJCSAgICAgICBBUFJfTUFYX0JVRik7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBxdWV1ZSBpbnRlbnRzXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gY2xvc2VfbGluazsKKwl9CisKKwlhcHJfY2gtPmZ1bmMgPSBmdW5jOworCWFwcl9jaC0+cHJpdiA9IHByaXY7CisKK2Nsb3NlX2xpbms6CisJaWYgKHJjKSB7CisJCWdsaW5rX2Nsb3NlKGFwcl9jaC0+aGFuZGxlKTsKKwkJYXByX2NoLT5oYW5kbGUgPSBOVUxMOworCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJmFwcl9jaC0+bV9sb2NrKTsKKworCXJldHVybiByYyA/IE5VTEwgOiBhcHJfY2g7Cit9CisKK2ludCBhcHJfdGFsX2Nsb3NlKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoKQoreworCWludCByYzsKKworCWlmICghYXByX2NoIHx8ICFhcHJfY2gtPmhhbmRsZSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltdXRleF9sb2NrKCZhcHJfY2gtPm1fbG9jayk7CisJcmMgPSBnbGlua19jbG9zZShhcHJfY2gtPmhhbmRsZSk7CisJYXByX2NoLT5oYW5kbGUgPSBOVUxMOworCWFwcl9jaC0+ZnVuYyA9IE5VTEw7CisJYXByX2NoLT5wcml2ID0gTlVMTDsKKwlhcHJfY2gtPmlmX3JlbW90ZV9pbnRlbnRfcmVhZHkgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmFwcl9jaC0+bV9sb2NrKTsKK2V4aXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBhcHJfdGFsX2xpbmtfc3RhdGVfY2Ioc3RydWN0IGdsaW5rX2xpbmtfc3RhdGVfY2JfaW5mbyAqY2JfaW5mbywKKwkJCQkgIHZvaWQgKnByaXYpCit7CisJdWludDMyX3QgZGVzdDsKKworCWlmICghY2JfaW5mbykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNiX2luZm9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghc3RyY21wKGNiX2luZm8tPmVkZ2UsICJtcHNzIikpCisJCWRlc3QgPSBBUFJfREVTVF9NT0RFTTsKKwllbHNlIGlmICghc3RyY21wKGNiX2luZm8tPmVkZ2UsICJscGFzcyIpKQorCQlkZXN0ID0gQVBSX0RFU1RfUURTUDY7CisJZWxzZSB7CisJCXByX2VycigiJXM6VW5rbm93biBlZGdlWyVzXVxuIiwgX19mdW5jX18sIGNiX2luZm8tPmVkZ2UpOworCQlyZXR1cm47CisJfQorCisJcHJfaW5mbygiJXM6IGVkZ2VbJXNdIGxpbmsgc3RhdGVbJWRdXG4iLCBfX2Z1bmNfXywgY2JfaW5mby0+ZWRnZSwKKwkJY2JfaW5mby0+bGlua19zdGF0ZSk7CisKKwlsaW5rX3N0YXRlW2Rlc3RdLmxpbmtfc3RhdGUgPSBjYl9pbmZvLT5saW5rX3N0YXRlOworCWlmIChsaW5rX3N0YXRlW2Rlc3RdLmxpbmtfc3RhdGUgPT0gR0xJTktfTElOS19TVEFURV9VUCkKKwkJd2FrZV91cCgmbGlua19zdGF0ZVtkZXN0XS53YWl0KTsKK30KKworc3RhdGljIHN0cnVjdCBnbGlua19saW5rX2luZm8gbXBzc19saW5rX2luZm8gPSB7CisJLnRyYW5zcG9ydCA9ICJzbWVtIiwKKwkuZWRnZSA9ICJtcHNzIiwKKwkuZ2xpbmtfbGlua19zdGF0ZV9ub3RpZl9jYiA9IGFwcl90YWxfbGlua19zdGF0ZV9jYiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2xpbmtfbGlua19pbmZvIGxwYXNzX2xpbmtfaW5mbyA9IHsKKwkudHJhbnNwb3J0ID0gInNtZW0iLAorCS5lZGdlID0gImxwYXNzIiwKKwkuZ2xpbmtfbGlua19zdGF0ZV9ub3RpZl9jYiA9IGFwcl90YWxfbGlua19zdGF0ZV9jYiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFwcl90YWxfaW5pdCh2b2lkKQoreworCWludCBpLCBqLCBrOworCXN0cnVjdCBhcHJfdHhfYnVmICpidWY7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKworCWZvciAoaSA9IDA7IGkgPCBBUFJfRExfTUFYOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFQUl9ERVNUX01BWDsgaisrKSB7CisJCQlmb3IgKGsgPSAwOyBrIDwgQVBSX0NMSUVOVF9NQVg7IGsrKykgeworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFwcl9zdmNfY2hbaV1bal1ba10ud2FpdCk7CisJCQkJc3Bpbl9sb2NrX2luaXQoJmFwcl9zdmNfY2hbaV1bal1ba10ud19sb2NrKTsKKwkJCQlzcGluX2xvY2tfaW5pdCgmYXByX3N2Y19jaFtpXVtqXVtrXS5yX2xvY2spOworCQkJCW11dGV4X2luaXQoJmFwcl9zdmNfY2hbaV1bal1ba10ubV9sb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUFJfREVTVF9NQVg7IGkrKykKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbGlua19zdGF0ZVtpXS53YWl0KTsKKworCXNwaW5fbG9ja19pbml0KCZidWZfbGlzdC5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYnVmX2xpc3QubGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFQUl9OVU1fT0ZfVFhfQlVGOyBpKyspIHsKKwkJYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwcl90eF9idWYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSB0eCBidWZcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gdHhfYnVmX2FsbG9jX2ZhaWw7CisJCX0KKworCQlJTklUX0xJU1RfSEVBRCgmYnVmLT5saXN0KTsKKwkJc3Bpbl9sb2NrKCZidWZfbGlzdC5sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmYnVmX2xpc3QubGlzdCk7CisJCXNwaW5fdW5sb2NrKCZidWZfbGlzdC5sb2NrKTsKKwl9CisKKwlsaW5rX3N0YXRlW0FQUl9ERVNUX01PREVNXS5saW5rX3N0YXRlID0gR0xJTktfTElOS19TVEFURV9ET1dOOworCWxpbmtfc3RhdGVbQVBSX0RFU1RfTU9ERU1dLmhhbmRsZSA9CisJCWdsaW5rX3JlZ2lzdGVyX2xpbmtfc3RhdGVfY2IoJm1wc3NfbGlua19pbmZvLCBOVUxMKTsKKwlpZiAoIWxpbmtfc3RhdGVbQVBSX0RFU1RfTU9ERU1dLmhhbmRsZSkKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIG1wc3MgbGluayBzdGF0ZVxuIiwgX19mdW5jX18pOworCisJbGlua19zdGF0ZVtBUFJfREVTVF9RRFNQNl0ubGlua19zdGF0ZSA9IEdMSU5LX0xJTktfU1RBVEVfRE9XTjsKKwlsaW5rX3N0YXRlW0FQUl9ERVNUX1FEU1A2XS5oYW5kbGUgPQorCQlnbGlua19yZWdpc3Rlcl9saW5rX3N0YXRlX2NiKCZscGFzc19saW5rX2luZm8sIE5VTEwpOworCWlmICghbGlua19zdGF0ZVtBUFJfREVTVF9RRFNQNl0uaGFuZGxlKQorCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgbHBhc3MgbGluayBzdGF0ZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7CisKK3R4X2J1Zl9hbGxvY19mYWlsOgorCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZidWZfbGlzdC5saXN0KSB7CisJCWJ1ZiA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXByX3R4X2J1ZiwgbGlzdCk7CisJCWxpc3RfZGVsKCZidWYtPmxpc3QpOworCQlrZnJlZShidWYpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KK2RldmljZV9pbml0Y2FsbChhcHJfdGFsX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl92Mi5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl92Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGYzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3YyLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwcl90YWwuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaD4KKworZW51bSBhcHJfc3Vic3lzX3N0YXRlIGFwcl9nZXRfc3Vic3lzX3N0YXRlKHZvaWQpCit7CisJcmV0dXJuIGFwcl9nZXRfcTZfc3RhdGUoKTsKK30KKwordm9pZCBhcHJfc2V0X3N1YnN5c19zdGF0ZSh2b2lkKQoreworCWFwcl9zZXRfcTZfc3RhdGUoQVBSX1NVQlNZU19ET1dOKTsKKwlhcHJfc2V0X21vZGVtX3N0YXRlKEFQUl9TVUJTWVNfVVApOworfQorCit1aW50MTZfdCBhcHJfZ2V0X2RhdGFfc3JjKHN0cnVjdCBhcHJfaGRyICpoZHIpCit7CisJaWYgKGhkci0+c3JjX2RvbWFpbiA9PSBBUFJfRE9NQUlOX01PREVNKQorCQlyZXR1cm4gQVBSX0RFU1RfTU9ERU07CisJZWxzZSBpZiAoaGRyLT5zcmNfZG9tYWluID09IEFQUl9ET01BSU5fQURTUCkKKwkJcmV0dXJuIEFQUl9ERVNUX1FEU1A2OworCisJcHJfZXJyKCJBUFI6IFBrdCBmcm9tIHdyb25nIHNvdXJjZTogJWRcbiIsIGhkci0+c3JjX2RvbWFpbik7CisJcmV0dXJuIEFQUl9ERVNUX01BWDsJCS8qUkVUVVJOIElOVkFMSUQgVkFMVUUqLworfQorCitpbnQgYXByX2dldF9kZXN0X2lkKGNoYXIgKmRlc3QpCit7CisJaWYgKCFzdHJjbXAoZGVzdCwgIkFEU1AiKSkKKwkJcmV0dXJuIEFQUl9ERVNUX1FEU1A2OworCWVsc2UKKwkJcmV0dXJuIEFQUl9ERVNUX01PREVNOworfQorCit2b2lkIHN1YnN5c19ub3RpZl9yZWdpc3RlcihjaGFyICpjbGllbnRfbmFtZSwgaW50IGRvbWFpbiwKKwkJCSAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJaW50IHJldDsKKworCXJldCA9IGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyKGNsaWVudF9uYW1lLCBkb21haW4sIG5iKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogQXVkaW8gbm90aWZpZXIgcmVnaXN0ZXIgZmFpbGVkIGZvciBkb21haW4gJWQgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZG9tYWluLCByZXQpOworfQorCit1aW50MTZfdCBhcHJfZ2V0X3Jlc2V0X2RvbWFpbih1aW50MTZfdCBwcm9jKQoreworCXJldHVybiBwcm9jOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl92My5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl92My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmM1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3YzLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHJfdGFsLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmg+CisKKyNkZWZpbmUgREVTVF9JRCBBUFJfREVTVF9NT0RFTQorCitlbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9zdWJzeXNfc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gYXByX2dldF9tb2RlbV9zdGF0ZSgpOworfQorCit2b2lkIGFwcl9zZXRfc3Vic3lzX3N0YXRlKHZvaWQpCit7CisJYXByX3NldF9tb2RlbV9zdGF0ZShBUFJfU1VCU1lTX0RPV04pOworfQorCit1aW50MTZfdCBhcHJfZ2V0X2RhdGFfc3JjKHN0cnVjdCBhcHJfaGRyICpoZHIpCit7CisJcmV0dXJuIERFU1RfSUQ7Cit9CisKK2ludCBhcHJfZ2V0X2Rlc3RfaWQoY2hhciAqZGVzdCkKK3sKKwlyZXR1cm4gREVTVF9JRDsKK30KKwordm9pZCBzdWJzeXNfbm90aWZfcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUsIGludCBkb21haW4sCisJCQkgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWludCByZXQ7CisKKwlpZiAoZG9tYWluICE9IEFVRElPX05PVElGSUVSX01PREVNX0RPTUFJTikgeworCQlwcl9kZWJ1ZygiJXM6IFVudXNlZCBkb21haW4gJWQgbm90IHJlZ2lzdGVyaW5nIHdpdGggbm90aWZpZXJcbiIsCisJCQkgX19mdW5jX18sIGRvbWFpbik7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3RlcihjbGllbnRfbmFtZSwgZG9tYWluLCBuYik7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCBmb3IgZG9tYWluICVkIHJldCA9ICVkXG4iLAorCQkJX19mdW5jX18sIGRvbWFpbiwgcmV0KTsKK30KKwordWludDE2X3QgYXByX2dldF9yZXNldF9kb21haW4odWludDE2X3QgcHJvYykKK3sKKwlyZXR1cm4gQVBSX0RFU1RfUURTUDY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTllOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuYwpAQCAtMCwwICsxLDYzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX3Bkci5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fc3NyLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NjbS5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3N1YnN5c3RlbV9ub3RpZi5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NlcnZpY2Utbm90aWZpZXIuaD4KKworLyogQXVkaW8gc3RhdGVzIGludGVybmFsIHRvIG5vdGlmaWVyLiBDbGllbnQgKi8KKy8qIHVzZWQgc3RhdGVzIGRlZmluZWQgaW4gYXVkaW9fbm90aWZpZXIuaCAqLworLyogZm9yIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTiAmIFVQICovCisjZGVmaW5lIE5PX1NFUlZJQ0UgLTIKKyNkZWZpbmUgVU5JTklUX1NFUlZJQ0UgLTEKKworLyoKKyAqIFVzZWQgZm9yIGVhY2ggY2xpZW50IHJlZ2lzdGVyZWQgd2l0aCBhdWRpbyBub3RpZmllcgorICovCitzdHJ1Y3QgY2xpZW50X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7CisJLyogTm90aWZpZXIgYmxvY2sgZ2l2ZW4gYnkgY2xpZW50ICovCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICAgKm5iOworCWNoYXIgICAgICAgICAgICAgICAgICAgIGNsaWVudF9uYW1lWzIwXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlOworCWludCAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjsKK307CisKKy8qCisgKiBVc2VkIGZvciBlYWNoIHNlcnZpY2UgYW5kIGRvbWFpbiBjb21iaW5hdGlvbgorICogVHJhY2tzIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSB1bmRlcmx5aW5nCisgKiBzZXJ2aWNlLgorICovCitzdHJ1Y3Qgc2VydmljZV9pbmZvIHsKKwljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMjBdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluX2lkOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGFuZGxlOworCS8qIE5vdGlmaWVyIGJsb2NrIHJlZ2lzdGVyZWQgdG8gc2VydmljZSAqLworCXN0cnVjdCBub3RpZmllcl9ibG9jayAgICAgICAgICAgKm5iOworCS8qIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gcmVnaXN0ZXIgYW5kIGRlcmVnaXN0ZXIgc2VydmljZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29mX2NsaWVudHM7CisJLyogTGlzdCBvZiBhbGwgY2xpZW50cyByZWdpc3RlcmVkIHRvIHRoZSBzZXJ2aWNlIGFuZCBkb21haW4gKi8KKwlzdHJ1Y3Qgc3JjdV9ub3RpZmllcl9oZWFkICAgICAgIGNsaWVudF9uYl9saXN0OworfTsKKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3Nzcl9hZHNwX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9zc3JfbW9kZW1fY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3Bkcl9hZHNwX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcl9zc3JfYWRzcF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSBhdWRpb19ub3RpZmVyX3Nzcl9hZHNwX2NiLAorCS5wcmlvcml0eSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyX3Nzcl9tb2RlbV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSBhdWRpb19ub3RpZmVyX3Nzcl9tb2RlbV9jYiwKKwkucHJpb3JpdHkgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcl9wZHJfYWRzcF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSBhdWRpb19ub3RpZmVyX3Bkcl9hZHNwX2NiLAorCS5wcmlvcml0eSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHNlcnZpY2VfaW5mbyBzZXJ2aWNlX2RhdGFbQVVESU9fTk9USUZJRVJfTUFYX1NFUlZJQ0VTXQorCQkJCSAgICAgICBbQVVESU9fTk9USUZJRVJfTUFYX0RPTUFJTlNdID0geworCisJe3sKKwkJLm5hbWUgPSAiU1NSX0FEU1AiLAorCQkuZG9tYWluX2lkID0gQVVESU9fU1NSX0RPTUFJTl9BRFNQLAorCQkuc3RhdGUgPSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV04sCisJCS5uYiA9ICZub3RpZmllcl9zc3JfYWRzcF9uYgorCX0sCisJeworCQkubmFtZSA9ICJTU1JfTU9ERU0iLAorCQkuZG9tYWluX2lkID0gQVVESU9fU1NSX0RPTUFJTl9NT0RFTSwKKwkJLnN0YXRlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOLAorCQkubmIgPSAmbm90aWZpZXJfc3NyX21vZGVtX25iCisJfSB9LAorCisJe3sKKwkJLm5hbWUgPSAiUERSX0FEU1AiLAorCQkuZG9tYWluX2lkID0gQVVESU9fUERSX0RPTUFJTl9BRFNQLAorCQkuc3RhdGUgPSBVTklOSVRfU0VSVklDRSwKKwkJLm5iID0gJm5vdGlmaWVyX3Bkcl9hZHNwX25iCisJfSwKKwl7CS8qIFBEUiBNT0RFTSBzZXJ2aWNlIG5vdCBlbmFibGVkICovCisJCS5uYW1lID0gIklOVkFMSUQiLAorCQkuc3RhdGUgPSBOT19TRVJWSUNFLAorCQkubmIgPSBOVUxMCisJfSB9Cit9OworCisvKiBNYXN0ZXIgbGlzdCBvZiBhbGwgYXVkaW8gbm90aWZpZXIgY2xpZW50cyAqLworc3RydWN0IGxpc3RfaGVhZCAgIGNsaWVudF9saXN0Oworc3RydWN0IG11dGV4ICAgICAgIG5vdGlmaWVyX211dGV4OworCitzdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfZ2V0X2RlZmF1bHRfc2VydmljZShpbnQgZG9tYWluKQoreworCWludCBzZXJ2aWNlID0gTk9fU0VSVklDRTsKKworCS8qIGluaXRpYWwgc2VydmljZSB0byBjb25uZWN0IHBlciBkb21haW4gKi8KKwlzd2l0Y2ggKGRvbWFpbikgeworCWNhc2UgQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU46CisJCXNlcnZpY2UgPSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19OT1RJRklFUl9NT0RFTV9ET01BSU46CisJCXNlcnZpY2UgPSBBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNlcnZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX25vdGlmZXJfZGlzYWJsZV9zZXJ2aWNlKGludCBzZXJ2aWNlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFVRElPX05PVElGSUVSX01BWF9ET01BSU5TOyBpKyspCisJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtpXS5zdGF0ZSA9IE5PX1NFUlZJQ0U7Cit9CisKK3N0YXRpYyBib29sIGF1ZGlvX25vdGlmZXJfaXNfc2VydmljZV9lbmFibGVkKGludCBzZXJ2aWNlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFVRElPX05PVElGSUVSX01BWF9ET01BSU5TOyBpKyspCisJCWlmIChzZXJ2aWNlX2RhdGFbc2VydmljZV1baV0uc3RhdGUgIT0gTk9fU0VSVklDRSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fbm90aWZlcl9pbml0X3NlcnZpY2UoaW50IHNlcnZpY2UpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVVESU9fTk9USUZJRVJfTUFYX0RPTUFJTlM7IGkrKykgeworCQlpZiAoc2VydmljZV9kYXRhW3NlcnZpY2VdW2ldLnN0YXRlID09IFVOSU5JVF9TRVJWSUNFKQorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2ldLnN0YXRlID0KKwkJCQlBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV047CisJfQorfQorCitzdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfcmVnX3NlcnZpY2UoaW50IHNlcnZpY2UsIGludCBkb21haW4pCit7CisJdm9pZCAqaGFuZGxlOworCWludCByZXQgPSAwOworCWludCBjdXJyX3N0YXRlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOOworCisJc3dpdGNoIChzZXJ2aWNlKSB7CisJY2FzZSBBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRToKKwkJaGFuZGxlID0gYXVkaW9fc3NyX3JlZ2lzdGVyKAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uZG9tYWluX2lkLAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmIpOworCQlicmVhazsKKwljYXNlIEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFOgorCQloYW5kbGUgPSBhdWRpb19wZHJfc2VydmljZV9yZWdpc3RlcigKKwkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmRvbWFpbl9pZCwKKwkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5iLCAmY3Vycl9zdGF0ZSk7CisKKwkJaWYgKGN1cnJfc3RhdGUgPT0gU0VSVlJFR19OT1RJRl9TRVJWSUNFX1NUQVRFX1VQX1YwMSkKKwkJCWN1cnJfc3RhdGUgPSBBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQOworCQllbHNlCisJCQljdXJyX3N0YXRlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2VydmljZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKKwkJcHJfZXJyKCIlczogaGFuZGxlIGlzIGluY29ycmVjdCBmb3Igc2VydmljZSAlc1xuIiwKKwkJCV9fZnVuY19fLCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSA9IGN1cnJfc3RhdGU7CisJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlID0gaGFuZGxlOworCisJcHJfaW5mbygiJXM6IHNlcnZpY2UgJXMgaXMgaW4gdXNlXG4iLAorCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSk7CisJcHJfZGVidWcoIiVzOiBzZXJ2aWNlICVzIGhhcyBjdXJyZW50IHN0YXRlICVkLCBoYW5kbGUgMHglcEtcbiIsCisJCV9fZnVuY19fLCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAorCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSwKKwkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX2RlcmVnX3NlcnZpY2UoaW50IHNlcnZpY2UsIGludCBkb21haW4pCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoc2VydmljZSkgeworCWNhc2UgQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U6CisJCXJldCA9IGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyKAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlLAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmIpOworCQlicmVhazsKKwljYXNlIEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFOgorCQlyZXQgPSBhdWRpb19wZHJfc2VydmljZV9kZXJlZ2lzdGVyKAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlLAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2VydmljZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCXByX2VycigiJXM6IGRlcmVnaXN0ZXIgZmFpbGVkIGZvciBzZXJ2aWNlICVzLCByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXByX2RlYnVnKCIlczogc2VydmljZSAlcyB3aXRoIGhhbmRsZSAweCVwSyBkZXJlZ2lzdGVyZWRcbiIsCisJCV9fZnVuY19fLCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAorCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5oYW5kbGUpOworCisJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUgPSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV047CisJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlID0gTlVMTDsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3JlZ19jbGllbnRfc2VydmljZShzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhLAorCQkJCQkgICAgaW50IHNlcnZpY2UpCit7CisJaW50IHJldCA9IDA7CisJaW50IGRvbWFpbiA9IGNsaWVudF9kYXRhLT5kb21haW47CisJc3RydWN0IGF1ZGlvX25vdGlmaWVyX2NiX2RhdGEgZGF0YTsKKworCXN3aXRjaCAoc2VydmljZSkgeworCWNhc2UgQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U6CisJY2FzZSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRToKKwkJaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzID09IDApCisJCQlyZXQgPSBhdWRpb19ub3RpZmVyX3JlZ19zZXJ2aWNlKHNlcnZpY2UsIGRvbWFpbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgc2VydmljZSBmb3IgY2xpZW50ICVzLCBzZXJ2aWNlICVkLCBkb21haW4gJWRcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLCBzZXJ2aWNlLCBkb21haW4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCXByX2VycigiJXM6IHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCBvbiBzZXJ2aWNlICVzIGZvciBjbGllbnQgJXNcbiIsCisJCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwKKwkJCWNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbGllbnRfZGF0YS0+c2VydmljZSA9IHNlcnZpY2U7CisJc3JjdV9ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigKKwkJJnNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmNsaWVudF9uYl9saXN0LAorCQljbGllbnRfZGF0YS0+bmIpOworCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzKys7CisKKwlwcl9kZWJ1ZygiJXM6IHJlZ2lzdGVyZWQgY2xpZW50ICVzIG9uIHNlcnZpY2UgJXMsIGN1cnJlbnQgc3RhdGUgMHgleFxuIiwKKwkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKKwkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwKKwkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUpOworCisJLyoKKwkgKiBQRFIgcmVnaXN0cmF0aW9uIHJldHVybnMgY3VycmVudCBzdGF0ZQorCSAqIEZvcmNlIGNhbGxiYWNrIG9mIGNsaWVudCB3aXRoIGN1cnJlbnQgc3RhdGUgZm9yIFBEUgorCSAqLworCWlmIChjbGllbnRfZGF0YS0+c2VydmljZSA9PSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRSkgeworCQlkYXRhLnNlcnZpY2UgPSBzZXJ2aWNlOworCQlkYXRhLmRvbWFpbiA9IGRvbWFpbjsKKwkJKHZvaWQpY2xpZW50X2RhdGEtPm5iLT5ub3RpZmllcl9jYWxsKGNsaWVudF9kYXRhLT5uYiwKKwkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLnN0YXRlLCAmZGF0YSk7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudChzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhKQoreworCWludCByZXQgPSAwOworCWludCBzZXJ2aWNlOworCWludCBkb21haW4gPSBjbGllbnRfZGF0YS0+ZG9tYWluOworCisJc2VydmljZSA9IGF1ZGlvX25vdGlmZXJfZ2V0X2RlZmF1bHRfc2VydmljZShkb21haW4pOworCWlmIChzZXJ2aWNlIDwgMCkgeworCQlwcl9lcnIoIiVzOiBzZXJ2aWNlICVkIGlzIGluY29ycmVjdFxuIiwgX19mdW5jX18sIHNlcnZpY2UpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogU2VhcmNoIHRocm91Z2ggc2VydmljZXMgdG8gZmluZCBhIHZhbGlkIG9uZSB0byByZWdpc3RlciBjbGllbnQgb24uICovCisJZm9yICg7IHNlcnZpY2UgPj0gMDsgc2VydmljZS0tKSB7CisJCS8qIElmIGEgc2VydmljZSBpcyBub3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IHRvIGNvbWUgdXAuICovCisJCWlmIChzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSA9PSBVTklOSVRfU0VSVklDRSkKKwkJCWdvdG8gZG9uZTsKKwkJLyogU2tpcCB1bnN1cHBvcnRlZCBzZXJ2aWNlIGFuZCBkb21haW4gY29tYmluYXRpb25zLiAqLworCQlpZiAoc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUgPCAwKQorCQkJY29udGludWU7CisJCS8qIE9ubHkgcmVnaXN0ZXIgY2xpZW50cyB3aG8gaGF2ZSBub3QgYWNxdWlyZWQgYSBzZXJ2aWNlLiAqLworCQlpZiAoY2xpZW50X2RhdGEtPnNlcnZpY2UgIT0gTk9fU0VSVklDRSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE9ubHkgcmVnaXN0ZXIgY2xpZW50cywgd2hvIGhhdmUgbm90IGFjcXVpcmVkIGEgc2VydmljZSwgb24KKwkJICogdGhlIGJlc3QgYXZhaWxhYmxlIHNlcnZpY2UgZm9yIHRoZWlyIGRvbWFpbi4gVW5pbml0aWFsaXplZAorCQkgKiBzZXJ2aWNlcyB3aWxsIHRyeSB0byByZWdpc3RlciBhbGwgb2YgdGhlaXIgY2xpZW50cyBhZnRlcgorCQkgKiB0aGV5IGluaXRpYWxpemUgY29ycmVjdGx5IG9yIHdpbGwgZGlzYWJsZSB0aGVpciBzZXJ2aWNlIGFuZAorCQkgKiByZWdpc3RlciBjbGllbnRzIG9uIHRoZSBuZXh0IGJlc3QgYXZhaWFsYWJsZSBzZXJ2aWNlLgorCQkgKi8KKwkJcHJfZGVidWcoIiVzOiByZWdpc3RlciBjbGllbnQgJXMgb24gc2VydmljZSAlcyIsCisJCQkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKKwkJCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lKTsKKworCQlyZXQgPSBhdWRpb19ub3RpZmVyX3JlZ19jbGllbnRfc2VydmljZShjbGllbnRfZGF0YSwgc2VydmljZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCXByX2VycigiJXM6IGNsaWVudCAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIgb24gc2VydmljZSAlcyIsCisJCQkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKKwkJCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lKTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX2RlcmVnX2NsaWVudChzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhKQoreworCWludCByZXQgPSAwOworCWludCBzZXJ2aWNlID0gY2xpZW50X2RhdGEtPnNlcnZpY2U7CisJaW50IGRvbWFpbiA9IGNsaWVudF9kYXRhLT5kb21haW47CisKKwlzd2l0Y2ggKGNsaWVudF9kYXRhLT5zZXJ2aWNlKSB7CisJY2FzZSBBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRToKKwljYXNlIEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFOgorCQlpZiAoc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubnVtX29mX2NsaWVudHMgPT0gMSkKKwkJCXJldCA9IGF1ZGlvX25vdGlmZXJfZGVyZWdfc2VydmljZShzZXJ2aWNlLCBkb21haW4pOworCQlicmVhazsKKwljYXNlIE5PX1NFUlZJQ0U6CisJCWdvdG8gZG9uZTsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgZm9yIGNsaWVudCAlcywgc2VydmljZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjbGllbnRfZGF0YS0+Y2xpZW50X25hbWUsCisJCQljbGllbnRfZGF0YS0+c2VydmljZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJcHJfZXJyKCIlczogZGVyZWdpc3RlciBmYWlsZWQgZm9yIGNsaWVudCAlcyBvbiBzZXJ2aWNlICVzLCByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAorCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IHNyY3Vfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3Rlcigmc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uCisJCQkJCSAgICAgY2xpZW50X25iX2xpc3QsIGNsaWVudF9kYXRhLT5uYik7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCXByX2VycigiJXM6IHNyY3Vfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlciBmYWlsZWQsIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiBkZXJlZ2lzdGVyZWQgY2xpZW50ICVzIG9uIHNlcnZpY2UgJXNcbiIsCisJCV9fZnVuY19fLCBjbGllbnRfZGF0YS0+Y2xpZW50X25hbWUsCisJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5hbWUpOworCisJY2xpZW50X2RhdGEtPnNlcnZpY2UgPSBOT19TRVJWSUNFOworCWlmIChzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5udW1fb2ZfY2xpZW50cyA+IDApCisJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzLS07Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX25vdGlmZXJfcmVnX2FsbF9jbGllbnRzKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmY2xpZW50X2xpc3QpIHsKKwkJY2xpZW50X2RhdGEgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCXN0cnVjdCBjbGllbnRfZGF0YSwgbGlzdCk7CisJCXJldCA9IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudChjbGllbnRfZGF0YSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCXByX2VycigiJXM6IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudCBmYWlsZWQgZm9yIGNsaWVudCAlcywgcmV0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBjbGllbnRfZGF0YS0+Y2xpZW50X25hbWUsCisJCQkJcmV0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9wZHJfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQoreworCXByX2RlYnVnKCIlczogQXVkaW8gUERSIGZyYW1ld29yayBzdGF0ZSAweCVseFxuIiwKKwkJX19mdW5jX18sIG9wY29kZSk7CisJbXV0ZXhfbG9jaygmbm90aWZpZXJfbXV0ZXgpOworCWlmIChvcGNvZGUgPT0gQVVESU9fUERSX0ZSQU1FV09SS19ET1dOKQorCQlhdWRpb19ub3RpZmVyX2Rpc2FibGVfc2VydmljZShBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRSk7CisJZWxzZQorCQlhdWRpb19ub3RpZmVyX2luaXRfc2VydmljZShBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRSk7CisKKwlhdWRpb19ub3RpZmVyX3JlZ19hbGxfY2xpZW50cygpOworCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBkcl9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSBhdWRpb19ub3RpZmVyX3Bkcl9jYWxsYmFjaywKKwkucHJpb3JpdHkgPSAwLAorfTsKKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX2NvbnZlcnRfb3Bjb2RlKHVuc2lnbmVkIGxvbmcgb3Bjb2RlLAorCQkJCQl1bnNpZ25lZCBsb25nICpub3RpZmllcl9vcGNvZGUpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgU1VCU1lTX0JFRk9SRV9TSFVURE9XTjoKKwljYXNlIFNFUlZSRUdfTk9USUZfU0VSVklDRV9TVEFURV9ET1dOX1YwMToKKwkJKm5vdGlmaWVyX29wY29kZSA9IEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjsKKwkJYnJlYWs7CisJY2FzZSBTVUJTWVNfQUZURVJfUE9XRVJVUDoKKwljYXNlIFNFUlZSRUdfTk9USUZfU0VSVklDRV9TVEFURV9VUF9WMDE6CisJCSpub3RpZmllcl9vcGNvZGUgPSBBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXM6IFVudXNlZCBvcGNvZGUgMHglbHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9zZXJ2aWNlX2NiKHVuc2lnbmVkIGxvbmcgb3Bjb2RlLAorCQkJCSAgICBpbnQgc2VydmljZSwgaW50IGRvbWFpbikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIG5vdGlmaWVyX29wY29kZTsKKwlzdHJ1Y3QgYXVkaW9fbm90aWZpZXJfY2JfZGF0YSBkYXRhOworCisJaWYgKGF1ZGlvX25vdGlmZXJfY29udmVydF9vcGNvZGUob3Bjb2RlLCAmbm90aWZpZXJfb3Bjb2RlKSA8IDApCisJCWdvdG8gZG9uZTsKKworCWRhdGEuc2VydmljZSA9IHNlcnZpY2U7CisJZGF0YS5kb21haW4gPSBkb21haW47CisKKwlwcl9kZWJ1ZygiJXM6IHNlcnZpY2UgJXMsIG9wY29kZSAweCVseFxuIiwKKwkJX19mdW5jX18sIHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5hbWUsIG5vdGlmaWVyX29wY29kZSk7CisKKwltdXRleF9sb2NrKCZub3RpZmllcl9tdXRleCk7CisKKwlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSA9IG5vdGlmaWVyX29wY29kZTsKKwlyZXQgPSBzcmN1X25vdGlmaWVyX2NhbGxfY2hhaW4oJnNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLgorCQljbGllbnRfbmJfbGlzdCwgbm90aWZpZXJfb3Bjb2RlLCAmZGF0YSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlwcl9lcnIoIiVzOiBzcmN1X25vdGlmaWVyX2NhbGxfY2hhaW4gcmV0dXJuZWQgJWQsIHNlcnZpY2UgJXMsIG9wY29kZSAweCVseFxuIiwKKwkJCV9fZnVuY19fLCByZXQsIHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5hbWUsCisJCQlub3RpZmllcl9vcGNvZGUpOworCisJbXV0ZXhfdW5sb2NrKCZub3RpZmllcl9tdXRleCk7Citkb25lOgorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9wZHJfYWRzcF9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gYXVkaW9fbm90aWZlcl9zZXJ2aWNlX2NiKG9wY29kZSwKKwkJCQkJQVVESU9fTk9USUZJRVJfUERSX1NFUlZJQ0UsCisJCQkJCUFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOKTsKK30KKworc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3Nzcl9hZHNwX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQoreworCWlmIChvcGNvZGUgPT0gU1VCU1lTX0JFRk9SRV9TSFVURE9XTikKKwkJYXVkaW9fc3NyX3NlbmRfbm1pKGRhdGEpOworCisJcmV0dXJuIGF1ZGlvX25vdGlmZXJfc2VydmljZV9jYihvcGNvZGUsCisJCQkJCUFVRElPX05PVElGSUVSX1NTUl9TRVJWSUNFLAorCQkJCQlBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTik7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9zc3JfbW9kZW1fY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQoreworCXJldHVybiBhdWRpb19ub3RpZmVyX3NlcnZpY2VfY2Iob3Bjb2RlLAorCQkJCQlBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRSwKKwkJCQkJQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOKTsKK30KKworaW50IGF1ZGlvX25vdGlmaWVyX2RlcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJldDI7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhOworCisJaWYgKGNsaWVudF9uYW1lID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50X25hbWUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCW11dGV4X2xvY2soJm5vdGlmaWVyX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmY2xpZW50X2RhdGEtPmxpc3QpIHsKKwkJY2xpZW50X2RhdGEgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGNsaWVudF9kYXRhLAorCQkJCQlsaXN0KTsKKwkJaWYgKCFzdHJjbXAoY2xpZW50X25hbWUsIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSkpIHsKKwkJCXJldDIgPSBhdWRpb19ub3RpZmVyX2RlcmVnX2NsaWVudChjbGllbnRfZGF0YSk7CisJCQlpZiAocmV0MiA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBhdWRpb19ub3RpZmVyX2RlcmVnX2NsaWVudCBmYWlsZWQsIHJldCAlZFxuLCBzZXJ2aWNlICVkLCBkb21haW4gJWQiLAorCQkJCQlfX2Z1bmNfXywgcmV0MiwgY2xpZW50X2RhdGEtPnNlcnZpY2UsCisJCQkJCWNsaWVudF9kYXRhLT5kb21haW4pOworCQkJCXJldCA9IHJldDI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsaXN0X2RlbCgmY2xpZW50X2RhdGEtPmxpc3QpOworCQkJa2ZyZWUoY2xpZW50X2RhdGEpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhdWRpb19ub3RpZmllcl9kZXJlZ2lzdGVyKTsKKworaW50IGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lLCBpbnQgZG9tYWluLAorCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhOworCisJaWYgKGNsaWVudF9uYW1lID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50X25hbWUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChuYiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5vdGlmaWVyIGJsb2NrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWNsaWVudF9kYXRhID0ga21hbGxvYyhzaXplb2YoKmNsaWVudF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudF9kYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwlJTklUX0xJU1RfSEVBRCgmY2xpZW50X2RhdGEtPmxpc3QpOworCWNsaWVudF9kYXRhLT5uYiA9IG5iOworCXN0cmxjcHkoY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLCBjbGllbnRfbmFtZSwKKwkJc2l6ZW9mKGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSkpOworCWNsaWVudF9kYXRhLT5zZXJ2aWNlID0gTk9fU0VSVklDRTsKKwljbGllbnRfZGF0YS0+ZG9tYWluID0gZG9tYWluOworCisJbXV0ZXhfbG9jaygmbm90aWZpZXJfbXV0ZXgpOworCXJldCA9IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudChjbGllbnRfZGF0YSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOworCQlwcl9lcnIoIiVzOiBhdWRpb19ub3RpZmVyX3JlZ19jbGllbnQgZm9yIGNsaWVudCAlcyBmYWlsZWQgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAorCQkJcmV0KTsKKwkJa2ZyZWUoY2xpZW50X2RhdGEpOworCQlnb3RvIGRvbmU7CisJfQorCWxpc3RfYWRkX3RhaWwoJmNsaWVudF9kYXRhLT5saXN0LCAmY2xpZW50X2xpc3QpOworCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhdWRpb19ub3RpZmllcl9yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX25vdGlmaWVyX3N1YnN5c19pbml0KHZvaWQpCit7CisJaW50IGksIGo7CisKKwltdXRleF9pbml0KCZub3RpZmllcl9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNsaWVudF9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVVESU9fTk9USUZJRVJfTUFYX1NFUlZJQ0VTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFVRElPX05PVElGSUVSX01BWF9ET01BSU5TOyBqKyspIHsKKwkJCWlmIChzZXJ2aWNlX2RhdGFbaV1bal0uc3RhdGUgPD0gTk9fU0VSVklDRSkKKwkJCQljb250aW51ZTsKKworCQkJc3JjdV9pbml0X25vdGlmaWVyX2hlYWQoCisJCQkJJnNlcnZpY2VfZGF0YVtpXVtqXS5jbGllbnRfbmJfbGlzdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChhdWRpb19ub3RpZmllcl9zdWJzeXNfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX25vdGlmaWVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYXVkaW9fcGRyX3JlZ2lzdGVyKCZwZHJfbmIpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlwcl9kZWJ1ZygiJXM6IFBEUiByZWdpc3RlciBmYWlsZWQsIHJldCA9ICVkLCBkaXNhYmxlIHNlcnZpY2VcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYXVkaW9fbm90aWZlcl9kaXNhYmxlX3NlcnZpY2UoQVVESU9fTk9USUZJRVJfUERSX1NFUlZJQ0UpOworCX0KKworCS8qIERvIG5vdCByZXR1cm4gZXJyb3Igc2luY2UgUERSIGVuYWJsZW1lbnQgaXMgbm90IGNyaXRpY2FsICovCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChhdWRpb19ub3RpZmllcl9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fbm90aWZpZXJfbGF0ZV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBJZiBwZHIgcmVnaXN0cmF0aW9uIGZhaWxlZCwgcmVnaXN0ZXIgY2xpZW50cyBvbiBuZXh0IHNlcnZpY2UKKwkgKiBEbyBpbiBsYXRlIGluaXQgdG8gZW5zdXJlIHRoYXQgU1NSIHN1YnN5c3RlbSBpcyBpbml0aWFsaXplZAorCSAqLworCWlmICghYXVkaW9fbm90aWZlcl9pc19zZXJ2aWNlX2VuYWJsZWQoQVVESU9fTk9USUZJRVJfUERSX1NFUlZJQ0UpKQorCQlhdWRpb19ub3RpZmVyX3JlZ19hbGxfY2xpZW50cygpOworCisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKGF1ZGlvX25vdGlmaWVyX2xhdGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fcGRyLmMgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fcGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3MGUxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19wZHIuYwpAQCAtMCwwICsxLDE0NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX3Bkci5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NlcnZpY2UtbG9jYXRvci5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NlcnZpY2Utbm90aWZpZXIuaD4KKworc3RhdGljIHN0cnVjdCBwZF9xbWlfY2xpZW50X2RhdGEgYXVkaW9fcGRyX3NlcnZpY2VzW0FVRElPX1BEUl9ET01BSU5fTUFYXSA9IHsKKwl7CS8qIEFVRElPX1BEUl9ET01BSU5fQURTUCAqLworCQkuY2xpZW50X25hbWUgPSAiYXVkaW9fcGRyX2Fkc3AiLAorCQkuc2VydmljZV9uYW1lID0gImF2cy9hdWRpbyIKKwl9Cit9OworCitzdHJ1Y3Qgc3JjdV9ub3RpZmllcl9oZWFkIGF1ZGlvX3Bkcl9jYl9saXN0OworCitzdGF0aWMgaW50IGF1ZGlvX3Bkcl9sb2NhdG9yX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHBkcl9zdGF0ZSA9IEFVRElPX1BEUl9GUkFNRVdPUktfRE9XTjsKKworCWlmIChvcGNvZGUgPT0gTE9DQVRPUl9ET1dOKSB7CisJCXByX2RlYnVnKCIlczogU2VydmljZSAlcyBpcyBkb3duISIsIF9fZnVuY19fLAorCQkJYXVkaW9fcGRyX3NlcnZpY2VzW0FVRElPX1BEUl9ET01BSU5fQURTUF0uCisJCQlzZXJ2aWNlX25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtY3B5KCZhdWRpb19wZHJfc2VydmljZXMsIGRhdGEsCisJCXNpemVvZihhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXSkpOworCWlmIChhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS50b3RhbF9kb21haW5zID09IDEpIHsKKwkJcHJfZGVidWcoIiVzOiBTZXJ2aWNlICVzLCByZXR1cm5lZCB0b3RhbCBkb21haW5zICVkLCAiLAorCQkJX19mdW5jX18sCisJCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS5zZXJ2aWNlX25hbWUsCisJCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS4KKwkJCXRvdGFsX2RvbWFpbnMpOworCQlwZHJfc3RhdGUgPSBBVURJT19QRFJfRlJBTUVXT1JLX1VQOworCQlnb3RvIGRvbmU7CisJfSBlbHNlCisJCXByX2VycigiJXM6IFNlcnZpY2UgJXMgcmV0dXJuZWQgaW52YWxpZCB0b3RhbCBkb21haW5zICVkIiwKKwkJCV9fZnVuY19fLAorCQkJYXVkaW9fcGRyX3NlcnZpY2VzW0FVRElPX1BEUl9ET01BSU5fQURTUF0uc2VydmljZV9uYW1lLAorCQkJYXVkaW9fcGRyX3NlcnZpY2VzW0FVRElPX1BEUl9ET01BSU5fQURTUF0uCisJCQl0b3RhbF9kb21haW5zKTsKK2RvbmU6CisJc3JjdV9ub3RpZmllcl9jYWxsX2NoYWluKCZhdWRpb19wZHJfY2JfbGlzdCwgcGRyX3N0YXRlLCBOVUxMKTsKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGF1ZGlvX3Bkcl9sb2NhdG9yX25iID0geworCS5ub3RpZmllcl9jYWxsID0gYXVkaW9fcGRyX2xvY2F0b3JfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMCwKK307CisKK2ludCBhdWRpb19wZHJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpZiAobmIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBOb3RpZmllciBibG9jayBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gc3JjdV9ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmYXVkaW9fcGRyX2NiX2xpc3QsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0woYXVkaW9fcGRyX3JlZ2lzdGVyKTsKKwordm9pZCAqYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIoaW50IGRvbWFpbl9pZCwKKwkJCQkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgaW50ICpjdXJyX3N0YXRlKQoreworCXZvaWQgKmhhbmRsZTsKKworCWlmICgoZG9tYWluX2lkIDwgMCkgfHwKKwkgICAgKGRvbWFpbl9pZCA+PSBBVURJT19QRFJfRE9NQUlOX01BWCkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzZXJ2aWNlIElEICVkXG4iLCBfX2Z1bmNfXywgZG9tYWluX2lkKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaGFuZGxlID0gc2VydmljZV9ub3RpZl9yZWdpc3Rlcl9ub3RpZmllcigKKwkJYXVkaW9fcGRyX3NlcnZpY2VzW2RvbWFpbl9pZF0uZG9tYWluX2xpc3RbMF0ubmFtZSwKKwkJYXVkaW9fcGRyX3NlcnZpY2VzW2RvbWFpbl9pZF0uZG9tYWluX2xpc3RbMF0uaW5zdGFuY2VfaWQsCisJCW5iLCBjdXJyX3N0YXRlKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZm9yIHNlcnZpY2UgJXMsIGluc3RhbmNlICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlhdWRpb19wZHJfc2VydmljZXNbZG9tYWluX2lkXS5kb21haW5fbGlzdFswXS5uYW1lLAorCQkJYXVkaW9fcGRyX3NlcnZpY2VzW2RvbWFpbl9pZF0uZG9tYWluX2xpc3RbMF0uCisJCQlpbnN0YW5jZV9pZCk7CisJfQorCXJldHVybiBoYW5kbGU7Cit9CitFWFBPUlRfU1lNQk9MKGF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyKTsKKworaW50IGF1ZGlvX3Bkcl9zZXJ2aWNlX2RlcmVnaXN0ZXIodm9pZCAqc2VydmljZV9oYW5kbGUsCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgcmV0OworCisJaWYgKHNlcnZpY2VfaGFuZGxlID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogc2VydmljZSBoYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gc2VydmljZV9ub3RpZl91bnJlZ2lzdGVyX25vdGlmaWVyKAorCQlzZXJ2aWNlX2hhbmRsZSwgbmIpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGRlcmVnaXN0ZXIgc2VydmljZSByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYXVkaW9fcGRyX3NlcnZpY2VfZGVyZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IGF1ZGlvX3Bkcl9zdWJzeXNfaW5pdCh2b2lkKQoreworCXNyY3VfaW5pdF9ub3RpZmllcl9oZWFkKCZhdWRpb19wZHJfY2JfbGlzdCk7CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoYXVkaW9fcGRyX3N1YnN5c19pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fcGRyX2xhdGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfc2VydmljZV9sb2NhdGlvbigKKwkJYXVkaW9fcGRyX3NlcnZpY2VzW0FVRElPX1BEUl9ET01BSU5fQURTUF0uY2xpZW50X25hbWUsCisJCWF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdLnNlcnZpY2VfbmFtZSwKKwkJJmF1ZGlvX3Bkcl9sb2NhdG9yX25iKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJcHJfZXJyKCIlcyBnZXRfc2VydmljZV9sb2NhdGlvbiBmYWlsZWQgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXNyY3Vfbm90aWZpZXJfY2FsbF9jaGFpbigmYXVkaW9fcGRyX2NiX2xpc3QsCisJCQkJCSBBVURJT19QRFJfRlJBTUVXT1JLX0RPV04sIE5VTEwpOworCX0KKworCXJldHVybiByZXQ7Cit9CitsYXRlX2luaXRjYWxsKGF1ZGlvX3Bkcl9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Nzci5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Nzci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NmZiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fc3NyLmMKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NjbS5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3N1YnN5c3RlbV9yZXN0YXJ0Lmg+CisjaW5jbHVkZSA8c29jL3Fjb20vc3Vic3lzdGVtX25vdGlmLmg+CisKKyNkZWZpbmUgU0NNX1E2X05NSV9DTUQgMHgxCisKK3N0YXRpYyBjaGFyICphdWRpb19zc3JfZG9tYWluc1tdID0geworCSJhZHNwIiwKKwkibW9kZW0iCit9OworCit2b2lkICphdWRpb19zc3JfcmVnaXN0ZXIoaW50IGRvbWFpbl9pZCwgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpZiAoKGRvbWFpbl9pZCA8IDApIHx8CisJICAgIChkb21haW5faWQgPj0gQVVESU9fU1NSX0RPTUFJTl9NQVgpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc2VydmljZSBJRCAlZFxuIiwgX19mdW5jX18sIGRvbWFpbl9pZCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiBzdWJzeXNfbm90aWZfcmVnaXN0ZXJfbm90aWZpZXIoCisJCWF1ZGlvX3Nzcl9kb21haW5zW2RvbWFpbl9pZF0sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0woYXVkaW9fc3NyX3JlZ2lzdGVyKTsKKworaW50IGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyKHZvaWQgKmhhbmRsZSwgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gc3Vic3lzX25vdGlmX3VucmVnaXN0ZXJfbm90aWZpZXIoaGFuZGxlLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyKTsKKwordm9pZCBhdWRpb19zc3Jfc2VuZF9ubWkodm9pZCAqc3NyX2NiX2RhdGEpCit7CisJc3RydWN0IG5vdGlmX2RhdGEgKmRhdGEgPSAoc3RydWN0IG5vdGlmX2RhdGEgKilzc3JfY2JfZGF0YTsKKwlzdHJ1Y3Qgc2NtX2Rlc2MgZGVzYzsKKworCWlmIChkYXRhICYmIGRhdGEtPmNyYXNoZWQpIHsKKwkJLyogU2VuZCBOTUkgdG8gUURTUDYgdmlhIGFuIFNDTSBjYWxsLiAqLworCQlpZiAoIWlzX3NjbV9hcm12OCgpKSB7CisJCQlzY21fY2FsbF9hdG9taWMxKFNDTV9TVkNfVVRJTCwKKwkJCQkJIFNDTV9RNl9OTUlfQ01ELCAweDEpOworCQl9IGVsc2UgeworCQkJZGVzYy5hcmdzWzBdID0gMHgxOworCQkJZGVzYy5hcmdpbmZvID0gU0NNX0FSR1MoMSk7CisJCQlzY21fY2FsbDJfYXRvbWljKFNDTV9TSVBfRk5JRChTQ01fU1ZDX1VUSUwsCisJCQkJCSBTQ01fUTZfTk1JX0NNRCksICZkZXNjKTsKKwkJfQorCQkvKiBUaGUgd3JpdGUgc2hvdWxkIGdvIHRocm91Z2ggYmVmb3JlIHE2IGlzIHNodXRkb3duICovCisJCW1iKCk7CisJCXByX2RlYnVnKCIlczogUTYgTk1JIHdhcyBzZW50LlxuIiwgX19mdW5jX18pOworCX0KK30KK0VYUE9SVF9TWU1CT0woYXVkaW9fc3NyX3NlbmRfbm1pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9tc21fYXVkaW9faW9uLmMgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvbXNtX2F1ZGlvX2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjE3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvbXNtX2F1ZGlvX2lvbi5jCkBAIC0wLDAgKzEsOTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3Fjb21faW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vZG1hLWlvbW11Lmg+CisKKyNkZWZpbmUgTVNNX0FVRElPX0lPTl9QUk9CRUQgKDEgPDwgMCkKKworI2RlZmluZSBNU01fQVVESU9fSU9OX1BIWVNfQUREUihhbGxvY19kYXRhKSBcCisJYWxsb2NfZGF0YS0+dGFibGUtPnNnbC0+ZG1hX2FkZHJlc3MKKworI2RlZmluZSBNU01fQVVESU9fSU9OX1ZBX1NUQVJUIDB4MTAwMDAwMDAKKyNkZWZpbmUgTVNNX0FVRElPX0lPTl9WQV9MRU4gMHgwRkZGRkZGRgorCisjZGVmaW5lIE1TTV9BVURJT19TTU1VX1NJRF9PRkZTRVQgMzIKKworc3RydWN0IGFkZHJfcmFuZ2UgeworCWRtYV9hZGRyX3Qgc3RhcnQ7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgY29udGV4dF9iYW5rX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGFkZHJfcmFuZ2UgYWRkcl9yYW5nZTsKK307CisKK3N0cnVjdCBtc21fYXVkaW9faW9uX3ByaXZhdGUgeworCWJvb2wgc21tdV9lbmFibGVkOworCWJvb2wgYXVkaW9oZWFwX2VuYWJsZWQ7CisJc3RydWN0IGRldmljZSAqY2JfZGV2OworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZzsKKwl1OCBkZXZpY2Vfc3RhdHVzOworCXN0cnVjdCBsaXN0X2hlYWQgYWxsb2NfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXggbGlzdF9tdXRleDsKKwl1NjQgc21tdV9zaWRfYml0czsKKwl1MzIgc21tdV92ZXJzaW9uOworfTsKKworc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhIHsKKwlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZjsKKwlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2g7CisJc3RydWN0IHNnX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdGF0aWMgc3RydWN0IG1zbV9hdWRpb19pb25fcHJpdmF0ZSBtc21fYXVkaW9faW9uX2RhdGEgPSB7MCx9OworCitzdGF0aWMgaW50IG1zbV9hdWRpb19pb25fZ2V0X3BoeXMoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCisJCQkJICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKKworc3RhdGljIGludCBtc21fYXVkaW9fZG1hX2J1Zl9tYXAoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCisJCQkJICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKKworc3RhdGljIGludCBtc21fYXVkaW9fZG1hX2J1Zl91bm1hcChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkJCSAgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOworCitzdGF0aWMgdm9pZCBtc21fYXVkaW9faW9uX2FkZF9hbGxvY2F0aW9uKAorCXN0cnVjdCBtc21fYXVkaW9faW9uX3ByaXZhdGUgKm1zbV9hdWRpb19pb25fZGF0YSwKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2FsbG9jX2RhdGEgKmFsbG9jX2RhdGEpCit7CisJLyoKKwkgKiBTaW5jZSB0aGVzZSBBUElzIGNhbiBiZSBpbnZva2VkIGJ5IG11bHRpcGxlCisJICogY2xpZW50cywgdGhlcmUgaXMgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGxpc3QKKwkgKiBvZiBhbGxvY2F0aW9ucyBpcyBhbHdheXMgcHJvdGVjdGVkCisJICovCisJbXV0ZXhfbG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS0+bGlzdF9tdXRleCkpOworCWxpc3RfYWRkX3RhaWwoJihhbGxvY19kYXRhLT5saXN0KSwKKwkJICAgICAgJihtc21fYXVkaW9faW9uX2RhdGEtPmFsbG9jX2xpc3QpKTsKKwltdXRleF91bmxvY2soJihtc21fYXVkaW9faW9uX2RhdGEtPmxpc3RfbXV0ZXgpKTsKK30KKworaW50IG1zbV9hdWRpb19pb25fYWxsb2MoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlvbl9jbGllbnQgKipjbGllbnQsCisJCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmhhbmRsZSwgc2l6ZV90IGJ1ZnN6LAorCQkJaW9uX3BoeXNfYWRkcl90ICpwYWRkciwgc2l6ZV90ICpwYV9sZW4sIHZvaWQgKip2YWRkcikKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZXJyX2lvbl9wdHIgPSAwOworCisJaWYgKChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkID09IHRydWUpICYmCisJICAgICEobXNtX2F1ZGlvX2lvbl9kYXRhLmRldmljZV9zdGF0dXMgJiBNU01fQVVESU9fSU9OX1BST0JFRCkpIHsKKwkJcHJfZGVidWcoIiVzOnByb2JlIGlzIG5vdCBkb25lLCBkZWZlcnJlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisJaWYgKCFuYW1lIHx8ICFjbGllbnQgfHwgIWhhbmRsZSB8fCAhcGFkZHIgfHwgIXZhZGRyCisJCXx8ICFidWZzeiB8fCAhcGFfbGVuKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqY2xpZW50ID0gbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKG5hbWUpOworCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKSgqY2xpZW50KSkpIHsKKwkJcHJfZXJyKCIlczogSU9OIGNyZWF0ZSBjbGllbnQgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwkqaGFuZGxlID0gaW9uX2FsbG9jKCpjbGllbnQsIGJ1ZnN6LCBTWl80SywKKwkJCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKKwkJaWYgKG1zbV9hdWRpb19pb25fZGF0YS5zbW11X2VuYWJsZWQgPT0gdHJ1ZSkgeworCQkJcHJfZGVidWcoInN5c3RlbSBoZWFwIGlzIHVzZWQiKTsKKwkJCW1zbV9hdWRpb19pb25fZGF0YS5hdWRpb2hlYXBfZW5hYmxlZCA9IDA7CisJCQkqaGFuZGxlID0gaW9uX2FsbG9jKCpjbGllbnQsIGJ1ZnN6LCBTWl80SywKKwkJCQkJSU9OX0hFQVAoSU9OX1NZU1RFTV9IRUFQX0lEKSwgMCk7CisJCX0KKwkJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKKwkJCWlmIChJU19FUlIoKHZvaWQgKikoKmhhbmRsZSkpKQorCQkJCWVycl9pb25fcHRyID0gUFRSX0VSUigoaW50ICopKCpoYW5kbGUpKTsKKwkJCXByX2VycigiJXM6SU9OIGFsbG9jIGZhaWwgZXJyIHB0cj0lbGQsIHNtbXVfZW5hYmxlZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBlcnJfaW9uX3B0ciwgbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9pb25fY2xpZW50OworCQl9CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoImF1ZGlvIGhlYXAgaXMgdXNlZCIpOworCQltc21fYXVkaW9faW9uX2RhdGEuYXVkaW9oZWFwX2VuYWJsZWQgPSAxOworCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cygqY2xpZW50LCAqaGFuZGxlLCBwYWRkciwgcGFfbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogSU9OIEdldCBQaHlzaWNhbCBmb3IgQVVESU8gZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfaW9uX2hhbmRsZTsKKwl9CisKKwkqdmFkZHIgPSBpb25fbWFwX2tlcm5lbCgqY2xpZW50LCAqaGFuZGxlKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKikqdmFkZHIpKSB7CisJCXByX2VycigiJXM6IElPTiBtZW1vcnkgbWFwcGluZyBmb3IgQVVESU8gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2lvbl9oYW5kbGU7CisJfQorCXByX2RlYnVnKCIlczogbWFwcGVkIGFkZHJlc3MgPSAlcEssIHNpemU9JXpkXG4iLCBfX2Z1bmNfXywKKwkJKnZhZGRyLCBidWZzeik7CisKKwlpZiAoYnVmc3ogIT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IG1lbXNldCB0byAwICVwSyAlemRcbiIsIF9fZnVuY19fLCAqdmFkZHIsIGJ1ZnN6KTsKKwkJbWVtc2V0KCh2b2lkICopKnZhZGRyLCAwLCBidWZzeik7CisJfQorCisJcmV0dXJuIHJjOworCitlcnJfaW9uX2hhbmRsZToKKwlpb25fZnJlZSgqY2xpZW50LCAqaGFuZGxlKTsKK2Vycl9pb25fY2xpZW50OgorCW1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koKmNsaWVudCk7CisJKmhhbmRsZSA9IE5VTEw7CisJKmNsaWVudCA9IE5VTEw7CitlcnI6CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtc21fYXVkaW9faW9uX2FsbG9jKTsKKworaW50IG1zbV9hdWRpb19pb25faW1wb3J0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpb25fY2xpZW50ICoqY2xpZW50LAorCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKKwkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKKwkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpCit7CisJaW50IHJjID0gMDsKKworCWlmICgobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCA9PSB0cnVlKSAmJgorCSAgICAhKG1zbV9hdWRpb19pb25fZGF0YS5kZXZpY2Vfc3RhdHVzICYgTVNNX0FVRElPX0lPTl9QUk9CRUQpKSB7CisJCXByX2RlYnVnKCIlczpwcm9iZSBpcyBub3QgZG9uZSwgZGVmZXJyZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJaWYgKCFuYW1lIHx8ICFjbGllbnQgfHwgIWhhbmRsZSB8fCAhcGFkZHIgfHwgIXZhZGRyIHx8ICFwYV9sZW4pIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkqY2xpZW50ID0gbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKG5hbWUpOworCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKSgqY2xpZW50KSkpIHsKKwkJcHJfZXJyKCIlczogSU9OIGNyZWF0ZSBjbGllbnQgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIG5hbWUgc2hvdWxkIGJlIGF1ZGlvX2FjZGJfY2xpZW50IG9yIEF1ZGlvX0RlY19DbGllbnQsCisJICogYnVmc3ogc2hvdWxkIGJlIDAgYW5kIGZkIHNob3VsZG4ndCBiZSAwIGFzIG9mIG5vdworCSAqLworCSpoYW5kbGUgPSBpb25faW1wb3J0X2RtYV9idWYoKmNsaWVudCwgZmQpOworCXByX2RlYnVnKCIlczogRE1BIEJ1ZiBuYW1lPSVzLCBmZD0lZCBoYW5kbGU9JXBLXG4iLCBfX2Z1bmNfXywKKwkJCQkJCQluYW1lLCBmZCwgKmhhbmRsZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKKwkJcHJfZXJyKCIlczogaW9uIGltcG9ydCBkbWEgYnVmZmVyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZGVzdHJveV9jbGllbnQ7CisJfQorCisJaWYgKGlvbmZsYWcgIT0gTlVMTCkgeworCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKCpjbGllbnQsICpoYW5kbGUsIGlvbmZsYWcpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnJfaW9uX2hhbmRsZTsKKwkJfQorCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cygqY2xpZW50LCAqaGFuZGxlLCBwYWRkciwgcGFfbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogSU9OIEdldCBQaHlzaWNhbCBmb3IgQVVESU8gZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZXJyX2lvbl9oYW5kbGU7CisJfQorCisJKnZhZGRyID0gaW9uX21hcF9rZXJuZWwoKmNsaWVudCwgKmhhbmRsZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopKnZhZGRyKSkgeworCQlwcl9lcnIoIiVzOiBJT04gbWVtb3J5IG1hcHBpbmcgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvbl9oYW5kbGU7CisJfQorCXByX2RlYnVnKCIlczogbWFwcGVkIGFkZHJlc3MgPSAlcEssIHNpemU9JXpkXG4iLCBfX2Z1bmNfXywKKwkJKnZhZGRyLCBidWZzeik7CisKKwlyZXR1cm4gMDsKKworZXJyX2lvbl9oYW5kbGU6CisJaW9uX2ZyZWUoKmNsaWVudCwgKmhhbmRsZSk7CitlcnJfZGVzdHJveV9jbGllbnQ6CisJbXNtX2F1ZGlvX2lvbl9jbGllbnRfZGVzdHJveSgqY2xpZW50KTsKKwkqY2xpZW50ID0gTlVMTDsKKwkqaGFuZGxlID0gTlVMTDsKK2VycjoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fYXVkaW9faW9uX2ZyZWUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKK3sKKwlpZiAoIWNsaWVudCB8fCAhaGFuZGxlKSB7CisJCXByX2VycigiJXMgSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKQorCQltc21fYXVkaW9fZG1hX2J1Zl91bm1hcChjbGllbnQsIGhhbmRsZSk7CisKKwlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKKworCWlvbl9mcmVlKGNsaWVudCwgaGFuZGxlKTsKKwltc21fYXVkaW9faW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9hdWRpb19pb25fZnJlZSk7CisKK2ludCBtc21fYXVkaW9faW9uX21tYXAoc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIsCisJCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmICogUEFHRV9TSVpFOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJdGFibGUgPSBpb25fc2dfdGFibGUoYWItPmNsaWVudCwgYWItPmhhbmRsZSk7CisKKwlpZiAoSVNfRVJSKHRhYmxlKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHNnX3RhYmxlIGZyb20gaW9uOiAlbGRcbiIsCisJCQlfX2Z1bmNfXywgUFRSX0VSUih0YWJsZSkpOworCQlyZXR1cm4gUFRSX0VSUih0YWJsZSk7CisJfSBlbHNlIGlmICghdGFibGUpIHsKKwkJcHJfZXJyKCIlczogc2dfbGlzdCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHVuY2FjaGVkICovCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgYSBwYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNnIGxpc3QgYmVjYXVzZToKKwkgKiBJZiB0aGUgYWxsb2NhdGlvbiBjYW1lIGZyb20gYSBjYXJ2ZW91dCB3ZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZQorCSAqIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBjYXJ2ZWQgb3V0IG1lbW9yeS4gVGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlCisJICogZnV0dXJlIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIHRoZSBlbHNlIHN0YXRlbWVudC4KKwkgKi8KKwlwYWdlID0gc2dfcGFnZSh0YWJsZS0+c2dsKTsKKwlpZiAocGFnZSkgeworCQlwcl9kZWJ1ZygiJXM6IHBhZ2UgaXMgTk9UIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5uZW50cywgaSkgeworCQkJdW5zaWduZWQgbG9uZyByZW1haW5kZXIgPSB2bWEtPnZtX2VuZCAtIGFkZHI7CisJCQl1bnNpZ25lZCBsb25nIGxlbiA9IHNnLT5sZW5ndGg7CisKKwkJCXBhZ2UgPSBzZ19wYWdlKHNnKTsKKworCQkJaWYgKG9mZnNldCA+PSBsZW4pIHsKKwkJCQlvZmZzZXQgLT0gbGVuOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChvZmZzZXQpIHsKKwkJCQlwYWdlICs9IG9mZnNldCAvIFBBR0VfU0laRTsKKwkJCQlsZW4gLT0gb2Zmc2V0OworCQkJCW9mZnNldCA9IDA7CisJCQl9CisJCQlsZW4gPSBtaW4obGVuLCByZW1haW5kZXIpOworCQkJcHJfZGVidWcoInZtYT0lcEssIGFkZHI9JXggbGVuPSVsZCB2bV9zdGFydD0leCB2bV9lbmQ9JXggdm1fcGFnZV9wcm90PSVsZFxuIiwKKwkJCQl2bWEsICh1bnNpZ25lZCBpbnQpYWRkciwgbGVuLAorCQkJCSh1bnNpZ25lZCBpbnQpdm1hLT52bV9zdGFydCwKKwkJCQkodW5zaWduZWQgaW50KXZtYS0+dm1fZW5kLAorCQkJCSh1bnNpZ25lZCBsb25nIGludCl2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCBhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSwgbGVuLAorCQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCQlhZGRyICs9IGxlbjsKKwkJCWlmIChhZGRyID49IHZtYS0+dm1fZW5kKQorCQkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaW9uX3BoeXNfYWRkcl90IHBoeXNfYWRkcjsKKwkJc2l6ZV90IHBoeXNfbGVuOworCQlzaXplX3QgdmFfbGVuID0gMDsKKworCQlwcl9kZWJ1ZygiJXM6IHBhZ2UgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSBpb25fcGh5cyhhYi0+Y2xpZW50LCBhYi0+aGFuZGxlLCAmcGh5c19hZGRyLCAmcGh5c19sZW4pOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXMgYWRkcmVzcyBmcm9tIElPTiBidWZmZXI6ICVkXG4iCisJCQkJLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcHJfZGVidWcoInBoeXM9JXBLSyBsZW49JXpkXG4iLCAmcGh5c19hZGRyLCBwaHlzX2xlbik7CisJCXByX2RlYnVnKCJ2bWE9JXBLLCB2bV9zdGFydD0leCB2bV9lbmQ9JXggdm1fcGdvZmY9JWxkIHZtX3BhZ2VfcHJvdD0lbGRcbiIsCisJCQl2bWEsICh1bnNpZ25lZCBpbnQpdm1hLT52bV9zdGFydCwKKwkJCSh1bnNpZ25lZCBpbnQpdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYsCisJCQkodW5zaWduZWQgbG9uZyBpbnQpdm1hLT52bV9wYWdlX3Byb3QpOworCQl2YV9sZW4gPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJCWlmICgob2Zmc2V0ID4gcGh5c19sZW4pIHx8ICh2YV9sZW4gPiBwaHlzX2xlbi1vZmZzZXQpKSB7CisJCQlwcl9lcnIoIndyb25nIG9mZnNldCBzaXplICVsZCwgbGVucz0gJXpkLCB2YV9sZW49JXpkXG4iLAorCQkJCW9mZnNldCwgcGh5c19sZW4sIHZhX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXQgPSAgcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQlfX3BoeXNfdG9fcGZuKHBoeXNfYWRkcikgKyB2bWEtPnZtX3Bnb2ZmLAorCQkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7CisJfQorCXJldHVybiAwOworfQorCisKK2Jvb2wgbXNtX2F1ZGlvX2lvbl9pc19zbW11X2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiBtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkOworfQorCisvKiBtb3ZlIHRvIHN0YXRpYyBzZWN0aW9uIGFnYWluICovCitzdHJ1Y3QgaW9uX2NsaWVudCAqbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlvbl9jbGllbnQgKnBjbGllbnQgPSBOVUxMOworCisJcGNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShuYW1lKTsKKwlyZXR1cm4gcGNsaWVudDsKK30KKworCit2b2lkIG1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCkKK3sKKwlwcl9kZWJ1ZygiJXM6IGNsaWVudCA9ICVwSyBzbW11X2VuYWJsZWQgPSAlZFxuIiwgX19mdW5jX18sCisJCWNsaWVudCwgbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCk7CisKKwlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKK30KKworaW50IG1zbV9hdWRpb19pb25faW1wb3J0X2xlZ2FjeShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKKwkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKKwkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpCit7CisJaW50IHJjID0gMDsKKworCWlmICghbmFtZSB8fCAhY2xpZW50IHx8ICFoYW5kbGUgfHwgIXBhZGRyIHx8ICF2YWRkciB8fCAhcGFfbGVuKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCS8qIGNsaWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIGxlZ2FjeSBhbmQgZ2l2ZW4KKwkgKiBuYW1lIHNob3VsZCBiZSBhdWRpb19hY2RiX2NsaWVudCBvciBBdWRpb19EZWNfQ2xpZW50LAorCSAqIGJ1ZnN6IHNob3VsZCBiZSAwIGFuZCBmZCBzaG91bGRuJ3QgYmUgMCBhcyBvZiBub3cKKwkgKi8KKwkqaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGNsaWVudCwgZmQpOworCXByX2RlYnVnKCIlczogRE1BIEJ1ZiBuYW1lPSVzLCBmZD0lZCBoYW5kbGU9JXBLXG4iLCBfX2Z1bmNfXywKKwkJCQkJCQluYW1lLCBmZCwgKmhhbmRsZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopKCpoYW5kbGUpKSkgeworCQlwcl9lcnIoIiVzOiBpb24gaW1wb3J0IGRtYSBidWZmZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChpb25mbGFnICE9IE5VTEwpIHsKKwkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsICpoYW5kbGUsIGlvbmZsYWcpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJfaW9uX2hhbmRsZTsKKwkJfQorCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cyhjbGllbnQsICpoYW5kbGUsIHBhZGRyLCBwYV9sZW4pOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBJT04gR2V0IFBoeXNpY2FsIGZvciBBVURJTyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lvbl9oYW5kbGU7CisJfQorCisJLypOZWVkIHRvIGFkZCBjb25kaXRpb24gU01NVSBlbmFibGUgb3Igbm90ICovCisJKnZhZGRyID0gaW9uX21hcF9rZXJuZWwoY2xpZW50LCAqaGFuZGxlKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKikqdmFkZHIpKSB7CisJCXByX2VycigiJXM6IElPTiBtZW1vcnkgbWFwcGluZyBmb3IgQVVESU8gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfaW9uX2hhbmRsZTsKKwl9CisKKwlpZiAoYnVmc3ogIT0gMCkKKwkJbWVtc2V0KCh2b2lkICopKnZhZGRyLCAwLCBidWZzeik7CisKKwlyZXR1cm4gMDsKKworZXJyX2lvbl9oYW5kbGU6CisJaW9uX2ZyZWUoY2xpZW50LCAqaGFuZGxlKTsKK2VycjoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fYXVkaW9faW9uX2ZyZWVfbGVnYWN5KHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJCQkgICAgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQoreworCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKQorCQltc21fYXVkaW9fZG1hX2J1Zl91bm1hcChjbGllbnQsIGhhbmRsZSk7CisKKwlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKKworCWlvbl9mcmVlKGNsaWVudCwgaGFuZGxlKTsKKwkvKiBubyBjbGllbnRfZGVzdHJvZHkgaW4gbGVnYWN5Ki8KKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9hdWRpb19pb25fY2FjaGVfb3BlcmF0aW9ucyhzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYnVmZiwgaW50IGNhY2hlX29wKQoreworCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7CisJaW50IHJjID0gMDsKKwlpbnQgbXNtX2NhY2hlX29wcyA9IDA7CisKKwlpZiAoIWFidWZmKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zOiAlcEtcbiIsIF9fZnVuY19fLCBhYnVmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGFidWZmLT5jbGllbnQsIGFidWZmLT5oYW5kbGUsCisJCSZpb25mbGFnKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJpb25faGFuZGxlX2dldF9mbGFncyBmYWlsZWQ6ICVkXG4iLCByYyk7CisJCWdvdG8gY2FjaGVfb3BfZmFpbGVkOworCX0KKworCS8qIGhhcyB0byBiZSBDQUNIRUQgKi8KKwlpZiAoSU9OX0lTX0NBQ0hFRChpb25mbGFnKSkgeworCQkvKiBJT05fSU9DX0lOVl9DQUNIRVMgb3IgSU9OX0lPQ19DTEVBTl9DQUNIRVMgKi8KKwkJbXNtX2NhY2hlX29wcyA9IGNhY2hlX29wOworCQlyYyA9IG1zbV9pb25fZG9fY2FjaGVfb3AoYWJ1ZmYtPmNsaWVudCwKKwkJCQlhYnVmZi0+aGFuZGxlLAorCQkJCSh1bnNpZ25lZCBsb25nICopIGFidWZmLT5kYXRhLAorCQkJCSh1bnNpZ25lZCBsb25nKWFidWZmLT5zaXplLAorCQkJCW1zbV9jYWNoZV9vcHMpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiY2FjaGUgb3BlcmF0aW9uIGZhaWxlZCAlZFxuIiwgcmMpOworCQkJZ290byBjYWNoZV9vcF9mYWlsZWQ7CisJCX0KKwl9CitjYWNoZV9vcF9mYWlsZWQ6CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbXNtX2F1ZGlvX2RtYV9idWZfbWFwKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCisJCWlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pCit7CisKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2FsbG9jX2RhdGEgKmFsbG9jX2RhdGE7CisJc3RydWN0IGRldmljZSAqY2JfZGV2OworCWludCByYyA9IDA7CisKKwljYl9kZXYgPSBtc21fYXVkaW9faW9uX2RhdGEuY2JfZGV2OworCisJLyogRGF0YSByZXF1aXJlZCBwZXIgYnVmZmVyIG1hcHBpbmcgKi8KKwlhbGxvY19kYXRhID0ga3phbGxvYyhzaXplb2YoKmFsbG9jX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFsbG9jX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogR2V0IHRoZSBJT04gaGFuZGxlIHNpemUgKi8KKwlpb25faGFuZGxlX2dldF9zaXplKGNsaWVudCwgaGFuZGxlLCBsZW4pOworCisJYWxsb2NfZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWFsbG9jX2RhdGEtPmhhbmRsZSA9IGhhbmRsZTsKKwlhbGxvY19kYXRhLT5sZW4gPSAqbGVuOworCisJLyogR2V0IHRoZSBkbWFfYnVmIGhhbmRsZSBmcm9tIGlvbl9oYW5kbGUgKi8KKwlhbGxvY19kYXRhLT5kbWFfYnVmID0gaW9uX3NoYXJlX2RtYV9idWYoY2xpZW50LCBoYW5kbGUpOworCWlmIChJU19FUlIoYWxsb2NfZGF0YS0+ZG1hX2J1ZikpIHsKKwkJcmMgPSBQVFJfRVJSKGFsbG9jX2RhdGEtPmRtYV9idWYpOworCQlkZXZfZXJyKGNiX2RldiwKKwkJCSIlczogRmFpbCB0byBnZXQgZG1hX2J1ZiBoYW5kbGUsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycl9kbWFfYnVmOworCX0KKworCS8qIEF0dGFjaCB0aGUgZG1hX2J1ZiB0byBjb250ZXh0IGJhbmsgZGV2aWNlICovCisJYWxsb2NfZGF0YS0+YXR0YWNoID0gZG1hX2J1Zl9hdHRhY2goYWxsb2NfZGF0YS0+ZG1hX2J1ZiwKKwkJCQkJICAgIGNiX2Rldik7CisJaWYgKElTX0VSUihhbGxvY19kYXRhLT5hdHRhY2gpKSB7CisJCXJjID0gUFRSX0VSUihhbGxvY19kYXRhLT5hdHRhY2gpOworCQlkZXZfZXJyKGNiX2RldiwKKwkJCSIlczogRmFpbCB0byBhdHRhY2ggZG1hX2J1ZiB0byBDQiwgcmMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZXJyX2F0dGFjaDsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC4KKwkgKiBUaGVyZSBpcyBubyBpbmZvIGFzIHRoaXMgaXMgYSB3cml0ZSBidWZmZXIgb3IKKwkgKiByZWFkIGJ1ZmZlciwgaGVuY2UgdGhlIHJlcXVlc3QgaXMgYmktZGlyZWN0aW9uYWwKKwkgKiB0byBhY2NvbW1vZGF0ZSBib3RoIHJlYWQgYW5kIHdyaXRlIG1hcHBpbmdzLgorCSAqLworCWFsbG9jX2RhdGEtPnRhYmxlID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChhbGxvY19kYXRhLT5hdHRhY2gsCisJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChJU19FUlIoYWxsb2NfZGF0YS0+dGFibGUpKSB7CisJCXJjID0gUFRSX0VSUihhbGxvY19kYXRhLT50YWJsZSk7CisJCWRldl9lcnIoY2JfZGV2LAorCQkJIiVzOiBGYWlsIHRvIG1hcCBhdHRhY2htZW50LCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfbWFwX2F0dGFjaDsKKwl9CisKKwlyYyA9IGRtYV9tYXBfc2coY2JfZGV2LCBhbGxvY19kYXRhLT50YWJsZS0+c2dsLAorCQkJYWxsb2NfZGF0YS0+dGFibGUtPm5lbnRzLAorCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChyYyAhPSBhbGxvY19kYXRhLT50YWJsZS0+bmVudHMpIHsKKwkJZGV2X2VycihjYl9kZXYsCisJCQkiJXM6IEZhaWwgdG8gbWFwIFNHLCByYyA9ICVkLCBuZW50cyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjLCBhbGxvY19kYXRhLT50YWJsZS0+bmVudHMpOworCQlnb3RvIGVycl9tYXBfc2c7CisJfQorCS8qIE1ha2Ugc3VyZSBub3QgdG8gcmV0dXJuIHJjIGZyb20gZG1hX21hcF9zZywgYXMgaXQgY2FuIGJlIG5vbnplcm8gKi8KKwlyYyA9IDA7CisKKwkvKiBwaHlzaWNhbCBhZGRyZXNzIGZyb20gbWFwcGluZyAqLworCSphZGRyID0gTVNNX0FVRElPX0lPTl9QSFlTX0FERFIoYWxsb2NfZGF0YSk7CisKKwltc21fYXVkaW9faW9uX2FkZF9hbGxvY2F0aW9uKCZtc21fYXVkaW9faW9uX2RhdGEsCisJCQkJICAgICBhbGxvY19kYXRhKTsKKwlyZXR1cm4gcmM7CisKK2Vycl9tYXBfc2c6CisJZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGFsbG9jX2RhdGEtPmF0dGFjaCwKKwkJCQkgYWxsb2NfZGF0YS0+dGFibGUsCisJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKK2Vycl9tYXBfYXR0YWNoOgorCWRtYV9idWZfZGV0YWNoKGFsbG9jX2RhdGEtPmRtYV9idWYsCisJCSAgICAgICBhbGxvY19kYXRhLT5hdHRhY2gpOworZXJyX2F0dGFjaDoKKwlkbWFfYnVmX3B1dChhbGxvY19kYXRhLT5kbWFfYnVmKTsKKworZXJyX2RtYV9idWY6CisJa2ZyZWUoYWxsb2NfZGF0YSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1ZGlvX2RtYV9idWZfdW5tYXAoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhICphbGxvY19kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBkZXZpY2UgKmNiX2RldiA9IG1zbV9hdWRpb19pb25fZGF0YS5jYl9kZXY7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJLyoKKwkgKiBUaG91Z2ggbGlzdF9mb3JfZWFjaF9zYWZlIGlzIGRlbGV0ZSBzYWZlLCBsb2NrCisJICogc2hvdWxkIGJlIGV4cGxpY2l0bHkgYWNxdWlyZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24KKwkgKiBvbiBhZGRpbmcgZWxlbWVudHMgdG8gdGhlIGxpc3QuCisJICovCisJbXV0ZXhfbG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS5saXN0X211dGV4KSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJCSAgICAmKG1zbV9hdWRpb19pb25fZGF0YS5hbGxvY19saXN0KSkgeworCisJCWFsbG9jX2RhdGEgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhLAorCQkJCQlsaXN0KTsKKworCQlpZiAoYWxsb2NfZGF0YS0+aGFuZGxlID09IGhhbmRsZSAmJgorCQkgICAgYWxsb2NfZGF0YS0+Y2xpZW50ID09IGNsaWVudCkgeworCQkJZm91bmQgPSB0cnVlOworCQkJZG1hX3VubWFwX3NnKGNiX2RldiwKKwkJCQkgICAgYWxsb2NfZGF0YS0+dGFibGUtPnNnbCwKKwkJCQkgICAgYWxsb2NfZGF0YS0+dGFibGUtPm5lbnRzLAorCQkJCSAgICBETUFfQklESVJFQ1RJT05BTCk7CisKKwkJCWRtYV9idWZfdW5tYXBfYXR0YWNobWVudChhbGxvY19kYXRhLT5hdHRhY2gsCisJCQkJCQkgYWxsb2NfZGF0YS0+dGFibGUsCisJCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCisJCQlkbWFfYnVmX2RldGFjaChhbGxvY19kYXRhLT5kbWFfYnVmLAorCQkJCSAgICAgICBhbGxvY19kYXRhLT5hdHRhY2gpOworCisJCQlkbWFfYnVmX3B1dChhbGxvY19kYXRhLT5kbWFfYnVmKTsKKworCQkJbGlzdF9kZWwoJihhbGxvY19kYXRhLT5saXN0KSk7CisJCQlrZnJlZShhbGxvY19kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS5saXN0X211dGV4KSk7CisKKwlpZiAoIWZvdW5kKSB7CisJCWRldl9lcnIoY2JfZGV2LAorCQkJIiVzOiBjYW5ub3QgZmluZCBhbGxvY2F0aW9uLCBpb25faGFuZGxlICVwSywgaW9uX2NsaWVudCAlcEsiLAorCQkJX19mdW5jX18sIGhhbmRsZSwgY2xpZW50KTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fYXVkaW9faW9uX2dldF9waHlzKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCisJCWlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc21tdV9lbmFibGVkID0gJWRcbiIsIF9fZnVuY19fLAorCQltc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKTsKKworCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKSB7CisJCXJjID0gbXNtX2F1ZGlvX2RtYV9idWZfbWFwKGNsaWVudCwgaGFuZGxlLCBhZGRyLCBsZW4pOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgRE1BIGJ1ZiwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qIEFwcGVuZCB0aGUgU01NVSBTSUQgaW5mb3JtYXRpb24gdG8gdGhlIElPVkEgYWRkcmVzcyAqLworCQkqYWRkciB8PSBtc21fYXVkaW9faW9uX2RhdGEuc21tdV9zaWRfYml0czsKKwl9IGVsc2UgeworCQlyYyA9IGlvbl9waHlzKGNsaWVudCwgaGFuZGxlLCBhZGRyLCBsZW4pOworCX0KKworCXByX2RlYnVnKCJwaHlzPSVwSywgbGVuPSV6ZCwgcmM9JWRcbiIsICYoKmFkZHIpLCAqbGVuLCByYyk7CitlcnI6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9hdWRpb19zbW11X2luaXRfbGVnYWN5KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmc7CisJc3RydWN0IGRldmljZV9ub2RlICpjdHhfbm9kZSA9IE5VTEw7CisJc3RydWN0IGNvbnRleHRfYmFua19pbmZvICpjYjsKKwlpbnQgcmV0OworCXUzMiByZWFkX3ZhbFsyXTsKKworCWNiID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBjb250ZXh0X2JhbmtfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghY2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY3R4X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImlvbW11cyIsIDApOworCWlmICghY3R4X25vZGUpIHsKKwkJZGV2X2VycihkZXYsICIlcyBDb3VsZCBub3QgZmluZCBhbnkgaW9tbXVzIGZvciBhdWRpb1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGN0eF9ub2RlLCAibGFiZWwiLCAmKGNiLT5uYW1lKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIiVzIENvdWxkIG5vdCBmaW5kIGxhYmVsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygibGFiZWwgZm91bmQgOiAlc1xuIiwgY2ItPm5hbWUpOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGN0eF9ub2RlLAorCQkJCSJxY29tLHZpcnR1YWwtYWRkci1wb29sIiwKKwkJCQlyZWFkX3ZhbCwgMik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIiVzIENvdWxkIG5vdCByZWFkIGFkZHIgcG9vbCBmb3IgZ3JvdXAgOiAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltc21fYXVkaW9faW9uX2RhdGEuY2JfZGV2ID0gbXNtX2lvbW11X2dldF9jdHgoY2ItPm5hbWUpOworCWNiLT5hZGRyX3JhbmdlLnN0YXJ0ID0gKGRtYV9hZGRyX3QpIHJlYWRfdmFsWzBdOworCWNiLT5hZGRyX3JhbmdlLnNpemUgPSAoc2l6ZV90KSByZWFkX3ZhbFsxXTsKKwlkZXZfZGJnKGRldiwgIiVzIExlZ2FjeSBpb21tdSB1c2FnZVxuIiwgX19mdW5jX18pOworCW1hcHBpbmcgPSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoCisJCQkJbXNtX2lvbW11X2dldF9idXMobXNtX2F1ZGlvX2lvbl9kYXRhLmNiX2RldiksCisJCQkJCSAgIGNiLT5hZGRyX3JhbmdlLnN0YXJ0LAorCQkJCQkgICBjYi0+YWRkcl9yYW5nZS5zaXplKTsKKwlpZiAoSVNfRVJSKG1hcHBpbmcpKQorCQlyZXR1cm4gUFRSX0VSUihtYXBwaW5nKTsKKworCXJldCA9IGFybV9pb21tdV9hdHRhY2hfZGV2aWNlKG1zbV9hdWRpb19pb25fZGF0YS5jYl9kZXYsIG1hcHBpbmcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlczogQXR0YWNoIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsX2F0dGFjaDsKKwl9CisKKwltc21fYXVkaW9faW9uX2RhdGEubWFwcGluZyA9IG1hcHBpbmc7CisJSU5JVF9MSVNUX0hFQUQoJm1zbV9hdWRpb19pb25fZGF0YS5hbGxvY19saXN0KTsKKwltdXRleF9pbml0KCYobXNtX2F1ZGlvX2lvbl9kYXRhLmxpc3RfbXV0ZXgpKTsKKworCXJldHVybiAwOworCitmYWlsX2F0dGFjaDoKKwlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcHBpbmcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1ZGlvX3NtbXVfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nOworCWludCByZXQ7CisKKwltYXBwaW5nID0gYXJtX2lvbW11X2NyZWF0ZV9tYXBwaW5nKAorCQkJCQltc21faW9tbXVfZ2V0X2J1cyhkZXYpLAorCQkJCQkgICBNU01fQVVESU9fSU9OX1ZBX1NUQVJULAorCQkJCQkgICBNU01fQVVESU9fSU9OX1ZBX0xFTik7CisJaWYgKElTX0VSUihtYXBwaW5nKSkKKwkJcmV0dXJuIFBUUl9FUlIobWFwcGluZyk7CisKKwlyZXQgPSBhcm1faW9tbXVfYXR0YWNoX2RldmljZShkZXYsIG1hcHBpbmcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlczogQXR0YWNoIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsX2F0dGFjaDsKKwl9CisKKwltc21fYXVkaW9faW9uX2RhdGEuY2JfZGV2ID0gZGV2OworCW1zbV9hdWRpb19pb25fZGF0YS5tYXBwaW5nID0gbWFwcGluZzsKKwlJTklUX0xJU1RfSEVBRCgmbXNtX2F1ZGlvX2lvbl9kYXRhLmFsbG9jX2xpc3QpOworCW11dGV4X2luaXQoJihtc21fYXVkaW9faW9uX2RhdGEubGlzdF9tdXRleCkpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfYXR0YWNoOgorCWFybV9pb21tdV9yZWxlYXNlX21hcHBpbmcobWFwcGluZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2F1ZGlvX2lvbl9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tYXVkaW8taW9uIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9hdWRpb19pb25fZHRfbWF0Y2gpOworCisKK3UzMiBtc21fYXVkaW9faW9uX2dldF9zbW11X3NpZF9tb2RlMzIodm9pZCkKK3sKKwlpZiAobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCkKKwkJcmV0dXJuIHVwcGVyXzMyX2JpdHMobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfc2lkX2JpdHMpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3UzMiBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhpb25fcGh5c19hZGRyX3QgcGEpCit7CisJaWYgKHNpemVvZihpb25fcGh5c19hZGRyX3QpID09IHNpemVvZih1MzIpKQorCQlyZXR1cm4gbXNtX2F1ZGlvX2lvbl9nZXRfc21tdV9zaWRfbW9kZTMyKCk7CisJZWxzZQorCQlyZXR1cm4gdXBwZXJfMzJfYml0cyhwYSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1ZGlvX2lvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYyA9IDA7CisJY29uc3QgY2hhciAqbXNtX2F1ZGlvX2lvbl9kdCA9ICJxY29tLHNtbXUtZW5hYmxlZCI7CisJY29uc3QgY2hhciAqbXNtX2F1ZGlvX2lvbl9zbW11ID0gInFjb20sc21tdS12ZXJzaW9uIjsKKwlib29sIHNtbXVfZW5hYmxlZDsKKwllbnVtIGFwcl9zdWJzeXNfc3RhdGUgcTZfc3RhdGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWlmIChkZXYtPm9mX25vZGUgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwKKwkJCSIlczogZGV2aWNlIHRyZWUgaXMgbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCQltc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJc21tdV9lbmFibGVkID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAgICBtc21fYXVkaW9faW9uX2R0KTsKKwltc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkID0gc21tdV9lbmFibGVkOworCisJaWYgKHNtbXVfZW5hYmxlZCkgeworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwKKwkJCQkJbXNtX2F1ZGlvX2lvbl9zbW11LAorCQkJCQkmbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfdmVyc2lvbik7CisJCWlmIChyYykgeworCQkJZGV2X2VycihkZXYsCisJCQkJIiVzOiBxY29tLHNtbXVfdmVyc2lvbiBtaXNzaW5nIGluIERUIG5vZGVcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIHJjOworCQl9CisJCWRldl9kYmcoZGV2LCAiJXM6IFNNTVUgdmVyc2lvbiBpcyAoJWQpIiwgX19mdW5jX18sCisJCQkJbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfdmVyc2lvbik7CisJCXE2X3N0YXRlID0gYXByX2dldF9xNl9zdGF0ZSgpOworCQlpZiAocTZfc3RhdGUgPT0gQVBSX1NVQlNZU19ET1dOKSB7CisJCQlkZXZfZGJnKGRldiwKKwkJCQkiZGVmZXJpbmcgJXMsIGFkc3Bfc3RhdGUgJWRcbiIsCisJCQkJX19mdW5jX18sIHE2X3N0YXRlKTsKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQl9CisJCWRldl9kYmcoZGV2LCAiJXM6IGFkc3AgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlkZXZfZGJnKGRldiwgIiVzOiBTTU1VIGlzICVzXG4iLCBfX2Z1bmNfXywKKwkJKHNtbXVfZW5hYmxlZCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKworCWlmIChzbW11X2VuYWJsZWQpIHsKKwkJdTY0IHNtbXVfc2lkID0gMDsKKwkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBpb21tdXNwZWM7CisKKwkJLyogR2V0IFNNTVUgU0lEIGluZm9ybWF0aW9uIGZyb20gRGV2aWNldHJlZSAqLworCQlyYyA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zfbm9kZSwgImlvbW11cyIsCisJCQkJCQkiI2lvbW11LWNlbGxzIiwgMCwgJmlvbW11c3BlYyk7CisJCWlmIChyYykKKwkJCWRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBnZXQgc21tdSBTSUQsIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWVsc2UKKwkJCXNtbXVfc2lkID0gaW9tbXVzcGVjLmFyZ3NbMF07CisKKwkJbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfc2lkX2JpdHMgPQorCQkJc21tdV9zaWQgPDwgTVNNX0FVRElPX1NNTVVfU0lEX09GRlNFVDsKKworCQlpZiAobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfdmVyc2lvbiA9PSAweDEpIHsKKwkJCXJjID0gbXNtX2F1ZGlvX3NtbXVfaW5pdF9sZWdhY3koZGV2KTsKKwkJfSBlbHNlIGlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV92ZXJzaW9uID09IDB4MikgeworCQkJcmMgPSBtc21fYXVkaW9fc21tdV9pbml0KGRldik7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiBzbW11IHZlcnNpb24gaW52YWxpZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfdmVyc2lvbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKHJjKQorCQkJZGV2X2VycihkZXYsICIlczogc21tdSBpbml0IGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwl9CisKKwlpZiAoIXJjKQorCQltc21fYXVkaW9faW9uX2RhdGEuZGV2aWNlX3N0YXR1cyB8PSBNU01fQVVESU9fSU9OX1BST0JFRDsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fYXVkaW9faW9uX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZzsKKwlzdHJ1Y3QgZGV2aWNlICphdWRpb19jYl9kZXY7CisKKwltYXBwaW5nID0gbXNtX2F1ZGlvX2lvbl9kYXRhLm1hcHBpbmc7CisJYXVkaW9fY2JfZGV2ID0gbXNtX2F1ZGlvX2lvbl9kYXRhLmNiX2RldjsKKworCWlmIChhdWRpb19jYl9kZXYgJiYgbWFwcGluZykgeworCQlhcm1faW9tbXVfZGV0YWNoX2RldmljZShhdWRpb19jYl9kZXYpOworCQlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcHBpbmcpOworCX0KKworCW1zbV9hdWRpb19pb25fZGF0YS5zbW11X2VuYWJsZWQgPSAwOworCW1zbV9hdWRpb19pb25fZGF0YS5kZXZpY2Vfc3RhdHVzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2F1ZGlvX2lvbl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWF1ZGlvLWlvbiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fYXVkaW9faW9uX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX2F1ZGlvX2lvbl9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2F1ZGlvX2lvbl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fYXVkaW9faW9uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fYXVkaW9faW9uX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fYXVkaW9faW9uX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2F1ZGlvX2lvbl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9hdWRpb19pb25fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9hdWRpb19pb25fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTVNNIEF1ZGlvIElPTiBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi92b2ljZV9zdmMuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi92b2ljZV9zdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U4OTkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL3ZvaWNlX3N2Yy5jCkBAIC0wLDAgKzEsNzkyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwcl90YWwuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgorI2luY2x1ZGUgPHNvdW5kL3ZvaWNlX3N2Yy5oPgorCisjZGVmaW5lIE1JTk9SX05VTUJFUiAxCisjZGVmaW5lIEFQUl9NQVhfUkVTUE9OU0UgMTAKKyNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCisKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPj0gKGIpID8gKGEpIDogKGIpKQorCitzdHJ1Y3Qgdm9pY2Vfc3ZjX2RldmljZSB7CisJc3RydWN0IGNkZXYgKmNkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBtYWpvcjsKK307CisKK3N0cnVjdCB2b2ljZV9zdmNfcHJ2dCB7CisJdm9pZCAqYXByX3E2X212bTsKKwl2b2lkICphcHJfcTZfY3ZzOworCXVpbnQxNl90IHJlc3BvbnNlX2NvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgcmVzcG9uc2VfcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzcG9uc2Vfd2FpdDsKKwlzcGlubG9ja190IHJlc3BvbnNlX2xvY2s7Cit9OworCitzdHJ1Y3QgYXByX2RhdGEgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlfX3U4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXByX3Jlc3BvbnNlX2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgdm9pY2Vfc3ZjX2NtZF9yZXNwb25zZSByZXNwOworfTsKKworc3RhdGljIHN0cnVjdCB2b2ljZV9zdmNfZGV2aWNlICp2b2ljZV9zdmNfZGV2Oworc3RhdGljIHN0cnVjdCBjbGFzcyAqdm9pY2Vfc3ZjX2NsYXNzOworc3RhdGljIGJvb2wgcmVnX2R1bW15X3Nlc3M7CitzdGF0aWMgdm9pZCAqZHVtbXlfcTZfbXZtOworc3RhdGljIHZvaWQgKmR1bW15X3E2X2N2czsKK2Rldl90IGRldmljZV9udW07CisKK3N0YXRpYyBpbnQgdm9pY2Vfc3ZjX2R1bW15X3JlZyh2b2lkKTsKK3N0YXRpYyBpbnQzMl90IHFkc3BfZHVtbXlfYXByX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsCisJCQkJCXZvaWQgKnByaXYpOworCitzdGF0aWMgaW50MzJfdCBxZHNwX2Fwcl9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXN0cnVjdCB2b2ljZV9zdmNfcHJ2dCAqcHJ0ZDsKKwlzdHJ1Y3QgYXByX3Jlc3BvbnNlX2xpc3QgKnJlc3BvbnNlX2xpc3Q7CisJdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOworCisJaWYgKChkYXRhID09IE5VTEwpIHx8IChwcml2ID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IGRhdGEgb3IgcHJpdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJ0ZCA9IChzdHJ1Y3Qgdm9pY2Vfc3ZjX3BydnQgKilwcml2OworCWlmIChwcnRkID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGRhdGEtPm9wY29kZSAleFxuIiwgX19mdW5jX18sCisJCSBkYXRhLT5vcGNvZGUpOworCisJaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKKwkJaWYgKGRhdGEtPnJlc2V0X3Byb2MgPT0gQVBSX0RFU1RfUURTUDYpIHsKKwkJCXByX2RlYnVnKCIlczogUmVjZWl2ZWQgQURTUCByZXNldCBldmVudFxuIiwgX19mdW5jX18pOworCisJCQlpZiAocHJ0ZC0+YXByX3E2X212bSAhPSBOVUxMKSB7CisJCQkJYXByX3Jlc2V0KHBydGQtPmFwcl9xNl9tdm0pOworCQkJCXBydGQtPmFwcl9xNl9tdm0gPSBOVUxMOworCQkJfQorCisJCQlpZiAocHJ0ZC0+YXByX3E2X2N2cyAhPSBOVUxMKSB7CisJCQkJYXByX3Jlc2V0KHBydGQtPmFwcl9xNl9jdnMpOworCQkJCXBydGQtPmFwcl9xNl9jdnMgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKGRhdGEtPnJlc2V0X3Byb2MgPT0gQVBSX0RFU1RfTU9ERU0pIHsKKwkJCXByX2RlYnVnKCIlczogUmVjZWl2ZWQgTW9kZW0gcmVzZXQgZXZlbnRcbiIsIF9fZnVuY19fKTsKKwkJfQorCQkvKiBTZXQgdGhlIHJlbWFpbmluZyBtZW1iZXIgdmFyaWFibGVzIHRvIGRlZmF1bHQgdmFsdWVzCisJCSAqIGZvciBSRVNFVF9FVkVOVFMKKwkJICovCisJCWRhdGEtPnBheWxvYWRfc2l6ZSA9IDA7CisJCWRhdGEtPnBheWxvYWQgPSBOVUxMOworCQlkYXRhLT5zcmNfcG9ydCA9IDA7CisJCWRhdGEtPmRlc3RfcG9ydCA9IDA7CisJCWRhdGEtPnRva2VuID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+cmVzcG9uc2VfbG9jaywgc3Bpbl9mbGFncyk7CisKKwlpZiAocHJ0ZC0+cmVzcG9uc2VfY291bnQgPCBBUFJfTUFYX1JFU1BPTlNFKSB7CisJCXJlc3BvbnNlX2xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXByX3Jlc3BvbnNlX2xpc3QpICsKKwkJCQkJZGF0YS0+cGF5bG9hZF9zaXplLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJlc3BvbnNlX2xpc3QgPT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+cmVzcG9uc2VfbG9jaywKKwkJCQkJICAgICAgIHNwaW5fZmxhZ3MpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlyZXNwb25zZV9saXN0LT5yZXNwLnNyY19wb3J0ID0gZGF0YS0+c3JjX3BvcnQ7CisKKwkJLyogUmV2ZXJ0aW5nIHRoZSBiaXQgbWFuaXB1bGF0aW9uIGRvbmUgaW4gdm9pY2Vfc3ZjX3VwZGF0ZV9oZHIKKwkJICogdG8gdGhlIHNyY19wb3J0IHdoaWNoIGlzIHJldHVybmVkIHRvIHVzIGFzIGRlc3RfcG9ydC4KKwkJICovCisJCXJlc3BvbnNlX2xpc3QtPnJlc3AuZGVzdF9wb3J0ID0gKChkYXRhLT5kZXN0X3BvcnQpID4+IDgpOworCQlyZXNwb25zZV9saXN0LT5yZXNwLnRva2VuID0gZGF0YS0+dG9rZW47CisJCXJlc3BvbnNlX2xpc3QtPnJlc3Aub3Bjb2RlID0gZGF0YS0+b3Bjb2RlOworCQlyZXNwb25zZV9saXN0LT5yZXNwLnBheWxvYWRfc2l6ZSA9IGRhdGEtPnBheWxvYWRfc2l6ZTsKKwkJaWYgKGRhdGEtPnBheWxvYWQgIT0gTlVMTCAmJiBkYXRhLT5wYXlsb2FkX3NpemUgPiAwKSB7CisJCQltZW1jcHkocmVzcG9uc2VfbGlzdC0+cmVzcC5wYXlsb2FkLCBkYXRhLT5wYXlsb2FkLAorCQkJICAgICAgIGRhdGEtPnBheWxvYWRfc2l6ZSk7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZyZXNwb25zZV9saXN0LT5saXN0LCAmcHJ0ZC0+cmVzcG9uc2VfcXVldWUpOworCQlwcnRkLT5yZXNwb25zZV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5yZXNwb25zZV9sb2NrLCBzcGluX2ZsYWdzKTsKKworCQl3YWtlX3VwKCZwcnRkLT5yZXNwb25zZV93YWl0KTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5yZXNwb25zZV9sb2NrLCBzcGluX2ZsYWdzKTsKKwkJcHJfZXJyKCIlczogUmVzcG9uc2UgZHJvcHBlZCBzaW5jZSB0aGUgcXVldWUgaXMgZnVsbFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgcWRzcF9kdW1teV9hcHJfY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKK3sKKwkvKiBEbyBOb3RoaW5nICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZvaWNlX3N2Y191cGRhdGVfaGRyKHN0cnVjdCB2b2ljZV9zdmNfY21kX3JlcXVlc3QgKmFwcl9yZXFfZGF0YSwKKwkJCQkgc3RydWN0IGFwcl9kYXRhICphcHJkYXRhKQoreworCisJYXByZGF0YS0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJICAgICAgIEFQUl9IRFJfTEVOKHNpemVvZihzdHJ1Y3QgYXByX2hkcikpLAorCQkJCSAgICAgICBBUFJfUEtUX1ZFUik7CisJLyogQml0IG1hbmlwdWxhdGlvbiBpcyBkb25lIG9uIHNyY19wb3J0IHNvIHRoYXQgYSB1bmlxdWUgSUQgaXMgc2VudC4KKwkgKiBUaGlzIG1hbmlwdWxhdGlvbiBjYW4gYmUgdXNlZCBpbiB0aGUgZnV0dXJlIHdoZXJlIHRoZSBzYW1lIHNlcnZpY2UKKwkgKiBpcyB0cmllZCB0byBvcGVuIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgc3JjX3BvcnQuIEF0IHRoYXQKKwkgKiB0aW1lIDB4MDAwMSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvdGhlciB2YWx1ZXMgZGVwZW5kaW5nIG9uIHRoZQorCSAqIGNvdW50LgorCSAqLworCWFwcmRhdGEtPmhkci5zcmNfcG9ydCA9ICgoYXByX3JlcV9kYXRhLT5zcmNfcG9ydCkgPDwgOCB8IDB4MDAwMSk7CisJYXByZGF0YS0+aGRyLmRlc3RfcG9ydCA9IGFwcl9yZXFfZGF0YS0+ZGVzdF9wb3J0OworCWFwcmRhdGEtPmhkci50b2tlbiA9IGFwcl9yZXFfZGF0YS0+dG9rZW47CisJYXByZGF0YS0+aGRyLm9wY29kZSA9IGFwcl9yZXFfZGF0YS0+b3Bjb2RlOworCWFwcmRhdGEtPmhkci5wa3Rfc2l6ZSAgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCQlhcHJfcmVxX2RhdGEtPnBheWxvYWRfc2l6ZSk7CisJbWVtY3B5KGFwcmRhdGEtPnBheWxvYWQsIGFwcl9yZXFfZGF0YS0+cGF5bG9hZCwKKwkgICAgICAgYXByX3JlcV9kYXRhLT5wYXlsb2FkX3NpemUpOworfQorCitzdGF0aWMgaW50IHZvaWNlX3N2Y19zZW5kX3JlcShzdHJ1Y3Qgdm9pY2Vfc3ZjX2NtZF9yZXF1ZXN0ICphcHJfcmVxdWVzdCwKKwkJCSAgICAgIHN0cnVjdCB2b2ljZV9zdmNfcHJ2dCAqcHJ0ZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgYXByX2RhdGEgKmFwcmRhdGEgPSBOVUxMOworCXVpbnQzMl90IHVzZXJfcGF5bG9hZF9zaXplOworCXVpbnQzMl90IHBheWxvYWRfc2l6ZTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGFwcl9yZXF1ZXN0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogYXByX3JlcXVlc3QgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl1c2VyX3BheWxvYWRfc2l6ZSA9IGFwcl9yZXF1ZXN0LT5wYXlsb2FkX3NpemU7CisJcGF5bG9hZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhcHJfZGF0YSkgKyB1c2VyX3BheWxvYWRfc2l6ZTsKKworCWlmIChwYXlsb2FkX3NpemUgPD0gdXNlcl9wYXlsb2FkX3NpemUpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXlsb2FkIHNpemUgKCAweCV4ICkuXG4iLAorCQkJX19mdW5jX18sIHVzZXJfcGF5bG9hZF9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0gZWxzZSB7CisJCWFwcmRhdGEgPSBrbWFsbG9jKHBheWxvYWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChhcHJkYXRhID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwl2b2ljZV9zdmNfdXBkYXRlX2hkcihhcHJfcmVxdWVzdCwgYXByZGF0YSk7CisKKwlpZiAoIXN0cmNtcChhcHJfcmVxdWVzdC0+c3ZjX25hbWUsIFZPSUNFX1NWQ19DVlNfU1RSKSkgeworCQlhcHJfaGFuZGxlID0gcHJ0ZC0+YXByX3E2X2N2czsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXByX3JlcXVlc3QtPnN2Y19uYW1lLCBWT0lDRV9TVkNfTVZNX1NUUikpIHsKKwkJYXByX2hhbmRsZSA9IHBydGQtPmFwcl9xNl9tdm07CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzZXJ2aWNlICUuKnNcbiIsIF9fZnVuY19fLAorCQkJTUFYX0FQUl9TRVJWSUNFX05BTUVfTEVOLCBhcHJfcmVxdWVzdC0+c3ZjX25hbWUpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2hhbmRsZSwgKHVpbnQzMl90ICopYXByZGF0YSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsIGluIHNlbmRpbmcgcmVxdWVzdCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogYXByIHBhY2tldCBzZW50IHN1Y2Nlc3NmdWxseSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0ID0gMDsKKwl9CisKK2RvbmU6CisJa2ZyZWUoYXByZGF0YSk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgdm9pY2Vfc3ZjX3JlZyhjaGFyICpzdmMsIHVpbnQzMl90IHNyY19wb3J0LAorCQkJIHN0cnVjdCB2b2ljZV9zdmNfcHJ2dCAqcHJ0ZCwgdm9pZCAqKmhhbmRsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKmhhbmRsZSAhPSBOVUxMKSB7CisJCXByX2VycigiJXM6IHN2YyBoYW5kbGUgbm90IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzcmNfcG9ydCA9PSAoQVBSX01BWF9QT1JUUyAtIDEpKSB7CisJCXByX2VycigiJXM6IFNSQyBwb3J0IHJlc2VydmVkIGZvciBkdW1teSBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgX19mdW5jX18sIHN2Yyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkqaGFuZGxlID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwKKwkJCSAgICAgICBzdmMsIHFkc3BfYXByX2NhbGxiYWNrLAorCQkJICAgICAgICgoc3JjX3BvcnQpIDw8IDggfCAweDAwMDEpLAorCQkJICAgICAgIHBydGQpOworCisJaWYgKCpoYW5kbGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3ZjKTsKKworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfQorCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgJXMgc3VjY2Vzc2Z1bFxuIiwKKwkJX19mdW5jX18sIHN2Yyk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc3ZjX2RlcmVnKGNoYXIgKnN2Yywgdm9pZCAqKmhhbmRsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKmhhbmRsZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHN2YyBoYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gYXByX2RlcmVnaXN0ZXIoKmhhbmRsZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZGVyZWdpc3RlciBzZXJ2aWNlICVzOyBlcnJvcjogJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3ZjLCByZXQpOworCisJCWdvdG8gZG9uZTsKKwl9CisJKmhhbmRsZSA9IE5VTEw7CisJcHJfZGVidWcoIiVzOiBkZXJlZ2lzdGVyICVzIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fLCBzdmMpOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZWdfY21kKHN0cnVjdCB2b2ljZV9zdmNfcmVnaXN0ZXIgKmFwcl9yZWdfc3ZjLAorCQkJICAgc3RydWN0IHZvaWNlX3N2Y19wcnZ0ICpwcnRkKQoreworCWludCByZXQgPSAwOworCWNoYXIgKnN2YyA9IE5VTEw7CisJdm9pZCAqKmhhbmRsZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghc3RyY21wKGFwcl9yZWdfc3ZjLT5zdmNfbmFtZSwgVk9JQ0VfU1ZDX01WTV9TVFIpKSB7CisJCXN2YyA9IFZPSUNFX1NWQ19NVk1fU1RSOworCQloYW5kbGUgPSAmcHJ0ZC0+YXByX3E2X212bTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXByX3JlZ19zdmMtPnN2Y19uYW1lLCBWT0lDRV9TVkNfQ1ZTX1NUUikpIHsKKwkJc3ZjID0gVk9JQ0VfU1ZDX0NWU19TVFI7CisJCWhhbmRsZSA9ICZwcnRkLT5hcHJfcTZfY3ZzOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEludmFsaWQgU2VydmljZTogJS4qc1xuIiwgX19mdW5jX18sCisJCQlNQVhfQVBSX1NFUlZJQ0VfTkFNRV9MRU4sIGFwcl9yZWdfc3ZjLT5zdmNfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYXByX3JlZ19zdmMtPnJlZ19mbGFnKSB7CisJCXJldCA9IHZvaWNlX3N2Y19yZWcoc3ZjLCBhcHJfcmVnX3N2Yy0+c3JjX3BvcnQsIHBydGQsCisJCQkJICAgIGhhbmRsZSk7CisJfSBlbHNlIGlmICghYXByX3JlZ19zdmMtPnJlZ19mbGFnKSB7CisJCXJldCA9IHZvaWNlX3N2Y19kZXJlZyhzdmMsIGhhbmRsZSk7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZvaWNlX3N2Y193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgdm9pY2Vfc3ZjX3BydnQgKnBydGQ7CisJc3RydWN0IHZvaWNlX3N2Y193cml0ZV9tc2cgKmRhdGEgPSBOVUxMOworCXVpbnQzMl90IGNtZDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBDaGVjayBpZiBlbm91Z2ggbWVtb3J5IGlzIGFsbG9jYXRlZCB0byBwYXJzZSB0aGUgbWVzc2FnZSB0eXBlLgorCSAqIFdpbGwgY2hlY2sgdGhlcmUgaXMgZW5vdWdoIHRvIGhvbGQgdGhlIHBheWxvYWQgbGF0ZXIuCisJICovCisJaWYgKGNvdW50ID49IHNpemVvZihzdHJ1Y3Qgdm9pY2Vfc3ZjX3dyaXRlX21zZykpIHsKKwkJZGF0YSA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogaW52YWxpZCBkYXRhIHNpemVcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZGF0YSBrbWFsbG9jIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY29weV9mcm9tX3VzZXIoZGF0YSwgYnVmLCBjb3VudCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBkb25lOworCX0KKworCWNtZCA9IGRhdGEtPm1zZ190eXBlOworCXBydGQgPSAoc3RydWN0IHZvaWNlX3N2Y19wcnZ0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocHJ0ZCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHBydGQgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVNHX1JFR0lTVEVSOgorCQkvKgorCQkgKiBDaGVjayB0aGF0IGNvdW50IHJlZmxlY3RzIHRoZSBleHBlY3RlZCBzaXplIHRvIGVuc3VyZQorCQkgKiBzdWZmaWNpZW50IG1lbW9yeSB3YXMgYWxsb2NhdGVkLiBTaW5jZSB2b2ljZV9zdmNfcmVnaXN0ZXIKKwkJICogaGFzIGEgc3RhdGljIHNpemUsIHRoaXMgc2hvdWxkIGJlIGV4YWN0LgorCQkgKi8KKwkJaWYgKGNvdW50ID09IChzaXplb2Yoc3RydWN0IHZvaWNlX3N2Y193cml0ZV9tc2cpICsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgdm9pY2Vfc3ZjX3JlZ2lzdGVyKSkpIHsKKwkJCXJldCA9IHByb2Nlc3NfcmVnX2NtZCgKKwkJCShzdHJ1Y3Qgdm9pY2Vfc3ZjX3JlZ2lzdGVyICopZGF0YS0+cGF5bG9hZCwgcHJ0ZCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgcGF5bG9hZCBzaXplXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCWNhc2UgTVNHX1JFUVVFU1Q6CisJCS8qCisJCSAqIENoZWNrIHRoYXQgY291bnQgcmVmbGVjdHMgdGhlIGV4cGVjdGVkIHNpemUgdG8gZW5zdXJlCisJCSAqIHN1ZmZpY2llbnQgbWVtb3J5IHdhcyBhbGxvY2F0ZWQuIFNpbmNlIHZvaWNlX3N2Y19jbWRfcmVxdWVzdAorCQkgKiBoYXMgYSB2YXJpYWJsZSBzaXplLCBjaGVjayB0aGUgbWluaW11bSB2YWx1ZSBjb3VudCBtdXN0IGJlLgorCQkgKi8KKwkJaWYgKGNvdW50ID49IChzaXplb2Yoc3RydWN0IHZvaWNlX3N2Y193cml0ZV9tc2cpICsKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgdm9pY2Vfc3ZjX2NtZF9yZXF1ZXN0KSkpIHsKKwkJcmV0ID0gdm9pY2Vfc3ZjX3NlbmRfcmVxKAorCQkJKHN0cnVjdCB2b2ljZV9zdmNfY21kX3JlcXVlc3QgKilkYXRhLT5wYXlsb2FkLCBwcnRkKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBjb3VudDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBheWxvYWQgc2l6ZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgY29tbWFuZDogJXVcbiIsIF9fZnVuY19fLCBjbWQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworZG9uZToKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB2b2ljZV9zdmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmFyZywKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9zdmNfcHJ2dCAqcHJ0ZDsKKwlzdHJ1Y3QgYXByX3Jlc3BvbnNlX2xpc3QgKnJlc3A7CisJdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOworCWludCBzaXplOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlwcnRkID0gKHN0cnVjdCB2b2ljZV9zdmNfcHJ2dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocHJ0ZCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHBydGQgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+cmVzcG9uc2VfbG9jaywgc3Bpbl9mbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgmcHJ0ZC0+cmVzcG9uc2VfcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPnJlc3BvbnNlX2xvY2ssIHNwaW5fZmxhZ3MpOworCQlwcl9kZWJ1ZygiJXM6IHdhaXQgZm9yIGEgcmVzcG9uc2VcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwcnRkLT5yZXNwb25zZV93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmcHJ0ZC0+cmVzcG9uc2VfcXVldWUpLAorCQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFJlYWQgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKHJldCA+IDAgJiYgIWxpc3RfZW1wdHkoJnBydGQtPnJlc3BvbnNlX3F1ZXVlKSkgeworCQkJcHJfZGVidWcoIiVzOiBJbnRlcnJ1cHQgcmVjZWl2ZWQgZm9yIHJlc3BvbnNlXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQkJcHJfZGVidWcoIiVzOiBJbnRlcnJ1cHRlZCBieSBTSUdOQUwgJWRcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+cmVzcG9uc2VfbG9jaywgc3Bpbl9mbGFncyk7CisJfQorCisJcmVzcCA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPnJlc3BvbnNlX3F1ZXVlLAorCQkJCXN0cnVjdCBhcHJfcmVzcG9uc2VfbGlzdCwgbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5yZXNwb25zZV9sb2NrLCBzcGluX2ZsYWdzKTsKKworCXNpemUgPSByZXNwLT5yZXNwLnBheWxvYWRfc2l6ZSArCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm9pY2Vfc3ZjX2NtZF9yZXNwb25zZSk7CisKKwlpZiAoY291bnQgPCBzaXplKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGF5bG9hZCBzaXplICV6ZCwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY291bnQsIHNpemUpOworCisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgc2l6ZSkpIHsKKwkJcHJfZXJyKCIlczogQWNjZXNzIGRlbmllZCB0byB3cml0ZVxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjb3B5X3RvX3VzZXIoYXJnLCAmcmVzcC0+cmVzcCwKKwkJCSBzaXplb2Yoc3RydWN0IHZvaWNlX3N2Y19jbWRfcmVzcG9uc2UpICsKKwkJCSByZXNwLT5yZXNwLnBheWxvYWRfc2l6ZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+cmVzcG9uc2VfbG9jaywgc3Bpbl9mbGFncyk7CisKKwlsaXN0X2RlbCgmcmVzcC0+bGlzdCk7CisJcHJ0ZC0+cmVzcG9uc2VfY291bnQtLTsKKwlrZnJlZShyZXNwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPnJlc3BvbnNlX2xvY2ssCisJCQkJc3Bpbl9mbGFncyk7CisKKwlyZXQgPSBjb3VudDsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3N2Y19kdW1teV9yZWcodm9pZCkKK3sKKwl1aW50MzJfdCBzcmNfcG9ydCA9IEFQUl9NQVhfUE9SVFMgLSAxOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJZHVtbXlfcTZfbXZtID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIk1WTSIsCisJCQkJcWRzcF9kdW1teV9hcHJfY2FsbGJhY2ssCisJCQkJc3JjX3BvcnQsCisJCQkJTlVMTCk7CisJaWYgKGR1bW15X3E2X212bSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBkdW1teSBNVk1cbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJZHVtbXlfcTZfY3ZzID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkNWUyIsCisJCQkJcWRzcF9kdW1teV9hcHJfY2FsbGJhY2ssCisJCQkJc3JjX3BvcnQsCisJCQkJTlVMTCk7CisJaWYgKGR1bW15X3E2X2N2cyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBkdW1teSBDVlNcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiAwOworZXJyOgorCWlmIChkdW1teV9xNl9tdm0gIT0gTlVMTCkgeworCQlhcHJfZGVyZWdpc3RlcihkdW1teV9xNl9tdm0pOworCQlkdW1teV9xNl9tdm0gPSBOVUxMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2b2ljZV9zdmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgdm9pY2Vfc3ZjX3BydnQgKnBydGQgPSBOVUxMOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlwcnRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZvaWNlX3N2Y19wcnZ0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocHJ0ZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwcnRkLCAwLCBzaXplb2Yoc3RydWN0IHZvaWNlX3N2Y19wcnZ0KSk7CisJcHJ0ZC0+YXByX3E2X2N2cyA9IE5VTEw7CisJcHJ0ZC0+YXByX3E2X212bSA9IE5VTEw7CisJcHJ0ZC0+cmVzcG9uc2VfY291bnQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZwcnRkLT5yZXNwb25zZV9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+cmVzcG9uc2Vfd2FpdCk7CisJc3Bpbl9sb2NrX2luaXQoJnBydGQtPnJlc3BvbnNlX2xvY2spOworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopcHJ0ZDsKKworCS8qIEN1cnJlbnQgQVBSIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBzZXNzaW9uIGJhc2VkCisJICogbXVsdGlwbGUgc2VydmljZSByZWdpc3RyYXRpb25zLiBUaGUgYXByX2RlcmVnaXN0ZXIoKQorCSAqIGZ1bmN0aW9uIHNldHMgdGhlIGRlc3RpbmF0aW9uIGFuZCBjbGllbnQgSURzIHRvIHplcm8sIGlmCisJICogZGVyZWdpc3RlciBpcyBjYWxsZWQgZm9yIGEgc2luZ2xlIHNlcnZpY2UgaW5zdGFuY2UuCisJICogVG8gYXZvaWQgdGhpcywgcmVnaXN0ZXIgZm9yIGFkZGl0aW9uYWwgc2VydmljZXMuCisJICovCisJaWYgKCFyZWdfZHVtbXlfc2VzcykgeworCQl2b2ljZV9zdmNfZHVtbXlfcmVnKCk7CisJCXJlZ19kdW1teV9zZXNzID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc3ZjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFwcl9yZXNwb25zZV9saXN0ICpyZXNwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHNwaW5fZmxhZ3M7CisJc3RydWN0IHZvaWNlX3N2Y19wcnZ0ICpwcnRkID0gTlVMTDsKKwljaGFyICpzdmNfbmFtZSA9IE5VTEw7CisJdm9pZCAqKmhhbmRsZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCXBydGQgPSAoc3RydWN0IHZvaWNlX3N2Y19wcnZ0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcnRkID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogcHJ0ZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChwcnRkLT5hcHJfcTZfY3ZzICE9IE5VTEwpIHsKKwkJc3ZjX25hbWUgPSBWT0lDRV9TVkNfTVZNX1NUUjsKKwkJaGFuZGxlID0gJnBydGQtPmFwcl9xNl9jdnM7CisJCXJldCA9IHZvaWNlX3N2Y19kZXJlZyhzdmNfbmFtZSwgaGFuZGxlKTsKKwkJaWYgKHJldCkKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBkZXJlZyBDVlMgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCX0KKworCWlmIChwcnRkLT5hcHJfcTZfbXZtICE9IE5VTEwpIHsKKwkJc3ZjX25hbWUgPSBWT0lDRV9TVkNfTVZNX1NUUjsKKwkJaGFuZGxlID0gJnBydGQtPmFwcl9xNl9tdm07CisJCXJldCA9IHZvaWNlX3N2Y19kZXJlZyhzdmNfbmFtZSwgaGFuZGxlKTsKKwkJaWYgKHJldCkKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBkZXJlZyBNVk0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5yZXNwb25zZV9sb2NrLCBzcGluX2ZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcHJ0ZC0+cmVzcG9uc2VfcXVldWUpKSB7CisJCXByX2RlYnVnKCIlczogUmVtb3ZlIGl0ZW0gZnJvbSByZXNwb25zZSBxdWV1ZVxuIiwgX19mdW5jX18pOworCisJCXJlc3AgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5yZXNwb25zZV9xdWV1ZSwKKwkJCQkJc3RydWN0IGFwcl9yZXNwb25zZV9saXN0LCBsaXN0KTsKKwkJbGlzdF9kZWwoJnJlc3AtPmxpc3QpOworCQlwcnRkLT5yZXNwb25zZV9jb3VudC0tOworCQlrZnJlZShyZXNwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5yZXNwb25zZV9sb2NrLCBzcGluX2ZsYWdzKTsKKworCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2b2ljZV9zdmNfZm9wcyA9IHsKKwkub3duZXIgPSAgICAgICAgICAgICAgICBUSElTX01PRFVMRSwKKwkub3BlbiA9ICAgICAgICAgICAgICAgICB2b2ljZV9zdmNfb3BlbiwKKwkucmVhZCA9ICAgICAgICAgICAgICAgICB2b2ljZV9zdmNfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgICAgICAgICB2b2ljZV9zdmNfd3JpdGUsCisJLnJlbGVhc2UgPSAgICAgICAgICAgICAgdm9pY2Vfc3ZjX3JlbGVhc2UsCit9OworCisKK3N0YXRpYyBpbnQgdm9pY2Vfc3ZjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCXZvaWNlX3N2Y19kZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwkJCQkgIHNpemVvZihzdHJ1Y3Qgdm9pY2Vfc3ZjX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdm9pY2Vfc3ZjX2RldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2aWNlX251bSwgMCwgTUlOT1JfTlVNQkVSLAorCQkJCSAgVk9JQ0VfU1ZDX0RSSVZFUl9OQU1FKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvYyBjaHJkZXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBjaHJkZXZfZXJyOworCX0KKworCXZvaWNlX3N2Y19kZXYtPm1ham9yID0gTUFKT1IoZGV2aWNlX251bSk7CisJdm9pY2Vfc3ZjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBWT0lDRV9TVkNfRFJJVkVSX05BTUUpOworCWlmIChJU19FUlIodm9pY2Vfc3ZjX2NsYXNzKSkgeworCQlyZXQgPSBQVFJfRVJSKHZvaWNlX3N2Y19jbGFzcyk7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgY2xhc3M7IGVyciA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXJldCk7CisJCWdvdG8gY2xhc3NfZXJyOworCX0KKworCXZvaWNlX3N2Y19kZXYtPmRldiA9IGRldmljZV9jcmVhdGUodm9pY2Vfc3ZjX2NsYXNzLCBOVUxMLCBkZXZpY2VfbnVtLAorCQkJCQkgICBOVUxMLCBWT0lDRV9TVkNfRFJJVkVSX05BTUUpOworCWlmIChJU19FUlIodm9pY2Vfc3ZjX2Rldi0+ZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHZvaWNlX3N2Y19kZXYtPmRldik7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgZGV2aWNlOyBlcnIgPSAlZFxuIiwgX19mdW5jX18sCisJCQlyZXQpOworCQlnb3RvIGRldl9lcnI7CisJfQorCisJdm9pY2Vfc3ZjX2Rldi0+Y2RldiA9IGNkZXZfYWxsb2MoKTsKKwlpZiAoIXZvaWNlX3N2Y19kZXYtPmNkZXYpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jIGNkZXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjZGV2X2FsbG9jX2VycjsKKwl9CisKKwljZGV2X2luaXQodm9pY2Vfc3ZjX2Rldi0+Y2RldiwgJnZvaWNlX3N2Y19mb3BzKTsKKwlyZXQgPSBjZGV2X2FkZCh2b2ljZV9zdmNfZGV2LT5jZGV2LCBkZXZpY2VfbnVtLCBNSU5PUl9OVU1CRVIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGNocmRldjsgZXJyID0gJWRcbiIsIF9fZnVuY19fLAorCQkJcmV0KTsKKwkJZ290byBhZGRfZXJyOworCX0KKwlwcl9kZWJ1ZygiJXM6IERldmljZSBjcmVhdGVkXG4iLCBfX2Z1bmNfXyk7CisJZ290byBkb25lOworCithZGRfZXJyOgorCWNkZXZfZGVsKHZvaWNlX3N2Y19kZXYtPmNkZXYpOworY2Rldl9hbGxvY19lcnI6CisJZGV2aWNlX2Rlc3Ryb3kodm9pY2Vfc3ZjX2NsYXNzLCBkZXZpY2VfbnVtKTsKK2Rldl9lcnI6CisJY2xhc3NfZGVzdHJveSh2b2ljZV9zdmNfY2xhc3MpOworY2xhc3NfZXJyOgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigwLCBNSU5PUl9OVU1CRVIpOworY2hyZGV2X2VycjoKKwlrZnJlZSh2b2ljZV9zdmNfZGV2KTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zdmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljZGV2X2RlbCh2b2ljZV9zdmNfZGV2LT5jZGV2KTsKKwlrZnJlZSh2b2ljZV9zdmNfZGV2LT5jZGV2KTsKKwlkZXZpY2VfZGVzdHJveSh2b2ljZV9zdmNfY2xhc3MsIGRldmljZV9udW0pOworCWNsYXNzX2Rlc3Ryb3kodm9pY2Vfc3ZjX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oMCwgTUlOT1JfTlVNQkVSKTsKKwlrZnJlZSh2b2ljZV9zdmNfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2b2ljZV9zdmNfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tdm9pY2Utc3ZjIn0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdm9pY2Vfc3ZjX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdm9pY2Vfc3ZjX2RyaXZlciA9IHsKKwkucHJvYmUgICAgICAgICAgPSB2b2ljZV9zdmNfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gdm9pY2Vfc3ZjX3JlbW92ZSwKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAibXNtLXZvaWNlLXN2YyIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdm9pY2Vfc3ZjX29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2b2ljZV9zdmNfaW5pdCh2b2lkKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmdm9pY2Vfc3ZjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2b2ljZV9zdmNfZXhpdCh2b2lkKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZvaWNlX3N2Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2b2ljZV9zdmNfaW5pdCk7Cittb2R1bGVfZXhpdCh2b2ljZV9zdmNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU29jIFFEU1A2djIgVm9pY2UgU2VydmljZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vd2NkLWRzcC1nbGluay5jIGIvZHJpdmVycy9zb2MvcWNvbS93Y2QtZHNwLWdsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5ZjIyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vd2NkLWRzcC1nbGluay5jCkBAIC0wLDAgKzEsMTEwMSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c29jL3Fjb20vZ2xpbmsuaD4KKyNpbmNsdWRlICJzb3VuZC93Y2QtZHNwLWdsaW5rLmgiCisKKyNkZWZpbmUgV0RTUF9HTElOS19EUklWRVJfTkFNRSAid2NkLWRzcC1nbGluayIKKyNkZWZpbmUgV0RTUF9NQVhfV1JJVEVfU0laRSAoNTEyICogMTAyNCkKKyNkZWZpbmUgV0RTUF9NQVhfUkVBRF9TSVpFICg0ICogMTAyNCkKKworI2RlZmluZSBNSU5PUl9OVU1CRVJfQ09VTlQgMQorI2RlZmluZSBXRFNQX0VER0UgIndkc3AiCisjZGVmaW5lIFJFU1BfUVVFVUVfU0laRSAzCisjZGVmaW5lIFFPU19QS1RfU0laRSAxMDI0CisjZGVmaW5lIFRJTUVPVVRfTVMgMTAwMAorCitzdHJ1Y3Qgd2RzcF9nbGlua19kZXYgeworCXN0cnVjdCBjbGFzcyAqY2xzOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2RldiBjZGV2OworCWRldl90IGRldl9udW07Cit9OworCitzdHJ1Y3Qgd2RzcF9nbGlua19yc3BfcXVlIHsKKwkvKiBTaXplIG9mIHZhbGlkIGRhdGEgaW4gYnVmZmVyICovCisJdTMyIGJ1Zl9zaXplOworCisJLyogUmVzcG9uc2UgYnVmZmVyICovCisJdTggYnVmW1dEU1BfTUFYX1JFQURfU0laRV07Cit9OworCitzdHJ1Y3Qgd2RzcF9nbGlua190eF9idWYgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworCisJLyogR2xpbmsgY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaDsKKworCS8qIFR4IGJ1ZmZlciB0byBzZW5kIHRvIGdsaW5rICovCisJdTggYnVmWzBdOworfTsKKworc3RydWN0IHdkc3BfZ2xpbmtfY2ggeworCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OworCisJLyogR2xpbmsgY2hhbm5lbCBoYW5kbGUgKi8KKwl2b2lkICpoYW5kbGU7CisKKwkvKiBDaGFubmVsIHN0YXRlcyBsaWtlIGNvbm5lY3QsIGRpc2Nvbm5lY3QgKi8KKwlpbnQgY2hhbm5lbF9zdGF0ZTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwkvKiBUbyBmcmVlIHVwIHRoZSBjaGFubmVsIG1lbW9yeSAqLworCWJvb2wgZnJlZV9tZW07CisKKwkvKiBHbGluayBsb2NhbCBjaGFubmVsIG9wZW4gd29yayAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBsY2xfY2hfb3Blbl93cms7CisKKwkvKiBHbGluayBsb2NhbCBjaGFubmVsIGNsb3NlIHdvcmsgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGNsX2NoX2Nsc193cms7CisKKwkvKiBXYWl0IGZvciBjaCBjb25uZWN0IHN0YXRlIGJlZm9yZSBzZW5kaW5nIGFueSBjb21tYW5kICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgY2hfY29ubmVjdF93YWl0OworCisJLyoKKwkgKiBHbGluayBjaGFubmVsIGNvbmZpZ3VyYXRpb24uIFRoaXMgaGFzIHRvIGJlIHRoZSBsYXN0CisJICogbWVtYmVyIG9mIHRoZSBzdHJ1Y3V0dXJlIGFzIGl0IGhhcyB2YXJpYWJsZSBzaXplCisJICovCisJc3RydWN0IHdkc3BfZ2xpbmtfY2hfY2ZnIGNoX2NmZzsKK307CisKK3N0cnVjdCB3ZHNwX2dsaW5rX3N0YXRlIHsKKwkvKiBHbGluayBsaW5rIHN0YXRlIGluZm9ybWF0aW9uICovCisJZW51bSBnbGlua19saW5rX3N0YXRlIGxpbmtfc3RhdGU7CisJdm9pZCAqaGFuZGxlOworfTsKKworc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiB7CisJLyogUmVzcG9uZSBidWZmZXIgcmVsYXRlZCAqLworCXU4IHJzcF9jbnQ7CisJc3RydWN0IHdkc3BfZ2xpbmtfcnNwX3F1ZSByc3BbUkVTUF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3QgY29tcGxldGlvbiByc3BfY29tcGxldGU7CisJc3RydWN0IG11dGV4IHJzcF9tdXRleDsKKworCS8qIEdsaW5rIGNoYW5uZWwgcmVsYXRlZCAqLworCXN0cnVjdCBtdXRleCBnbGlua19tdXRleDsKKwlzdHJ1Y3Qgd2RzcF9nbGlua19zdGF0ZSBnbGlua19zdGF0ZTsKKwlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqKmNoOworCXU4IG5vX29mX2NoYW5uZWxzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBjaF9vcGVuX2Nsc193cms7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfcXVldWU7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBsaW5rX3N0YXRlX3dhaXQ7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCitzdGF0aWMgaW50IHdkc3BfZ2xpbmtfY2xvc2VfY2goc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoKTsKK3N0YXRpYyBpbnQgd2RzcF9nbGlua19vcGVuX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaCk7CisKKy8qCisgKiB3ZHNwX2dsaW5rX25vdGlmeV9yeCAtIEdsaW5rIG5vdGlmeSByeCBjYWxsYmFjayBmb3IgcmVzcG9uc2VzCisgKiBoYW5kbGU6ICAgICAgT3BhcXVlIENoYW5uZWwgaGFuZGxlIHJldHVybmVkIGJ5IEdMaW5rCisgKiBwcml2OiAgICAgICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBjaGFubmVsCisgKiBwa3RfcHJpdjogICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBwYWNrZXQKKyAqIHB0cjogICAgICAgICBQb2ludGVyIHRvIHRoZSBSeCBkYXRhCisgKiBzaXplOiAgICAgICAgU2l6ZSBvZiB0aGUgUnggZGF0YQorICovCitzdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX25vdGlmeV9yeCh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCisJCQkJIGNvbnN0IHZvaWQgKnBrdF9wcml2LCBjb25zdCB2b2lkICpwdHIsCisJCQkJIHNpemVfdCBzaXplKQoreworCXU4ICpyeF9idWY7CisJdTggcnNwX2NudDsKKwlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisKKwlpZiAoIXB0ciB8fCAhcHJpdikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNoID0gKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICopcHJpdjsKKwl3cHJpdiA9IGNoLT53cHJpdjsKKwlyeF9idWYgPSAodTggKilwdHI7CisJaWYgKHNpemUgPiBXRFNQX01BWF9SRUFEX1NJWkUpIHsKKwkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IFNpemUgJXpkIGlzIGdyZWF0ZXIgdGhhbiBhbGxvd2VkICVkXG4iLAorCQkJX19mdW5jX18sIHNpemUsIFdEU1BfTUFYX1JFQURfU0laRSk7CisJCXNpemUgPSBXRFNQX01BWF9SRUFEX1NJWkU7CisJfQorCisJbXV0ZXhfbG9jaygmd3ByaXYtPnJzcF9tdXRleCk7CisJcnNwX2NudCA9IHdwcml2LT5yc3BfY250OworCWlmIChyc3BfY250ID49IFJFU1BfUVVFVUVfU0laRSkgeworCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogUmVzcCBRdWV1ZSBpcyBGdWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJzcF9jbnQgPSAwOworCX0KKwlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY29weSBpbnRvIGJ1ZmZlciAlZFxuIiwgX19mdW5jX18sIHJzcF9jbnQpOworCisJbWVtY3B5KHdwcml2LT5yc3BbcnNwX2NudF0uYnVmLCByeF9idWYsIHNpemUpOworCXdwcml2LT5yc3BbcnNwX2NudF0uYnVmX3NpemUgPSBzaXplOworCXdwcml2LT5yc3BfY250ID0gKytyc3BfY250OworCW11dGV4X3VubG9jaygmd3ByaXYtPnJzcF9tdXRleCk7CisKKwlnbGlua19yeF9kb25lKGhhbmRsZSwgcHRyLCB0cnVlKTsKKwljb21wbGV0ZSgmd3ByaXYtPnJzcF9jb21wbGV0ZSk7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX25vdGlmeV90eF9kb25lIC0gR2xpbmsgbm90aWZ5IHR4IGRvbmUgY2FsbGJhY2sgdG8KKyAqIGZyZWUgdHggYnVmZmVyCisgKiBoYW5kbGU6ICAgICAgT3BhcXVlIENoYW5uZWwgaGFuZGxlIHJldHVybmVkIGJ5IEdMaW5rCisgKiBwcml2OiAgICAgICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBjaGFubmVsCisgKiBwa3RfcHJpdjogICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBwYWNrZXQKKyAqIHB0cjogICAgICAgICBQb2ludGVyIHRvIHRoZSBUeCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbm90aWZ5X3R4X2RvbmUodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKnBrdF9wcml2LCBjb25zdCB2b2lkICpwdHIpCit7CisJaWYgKCFwa3RfcHJpdikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCS8qIEZyZWUgdHggcGt0ICovCisJa2ZyZWUocGt0X3ByaXYpOworfQorCisvKgorICogd2RzcF9nbGlua19ub3RpZnlfdHhfYWJvcnQgLSBHbGluayBub3RpZnkgdHggYWJvcnQgY2FsbGJhY2sgdG8KKyAqIGZyZWUgdHggYnVmZmVyCisgKiBoYW5kbGU6ICAgICAgT3BhcXVlIENoYW5uZWwgaGFuZGxlIHJldHVybmVkIGJ5IEdMaW5rCisgKiBwcml2OiAgICAgICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBjaGFubmVsCisgKiBwa3RfcHJpdjogICAgUHJpdmF0ZSBwb2ludGVyIHRvIHRoZSBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgd2RzcF9nbGlua19ub3RpZnlfdHhfYWJvcnQodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAorCQkJCSAgICAgICBjb25zdCB2b2lkICpwa3RfcHJpdikKK3sKKwlpZiAoIXBrdF9wcml2KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyogRnJlZSB0eCBwa3QgKi8KKwlrZnJlZShwa3RfcHJpdik7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX25vdGlmeV9yeF9pbnRlbnRfcmVxIC0gR2xpbmsgbm90aWZ5IHJ4IGludGVudCByZXF1ZXN0IGNhbGxiYWNrCisgKiB0byBxdWV1ZSBidWZmZXIgdG8gcmVjZWl2ZSBmcm9tIHJlbW90ZSBjbGllbnQKKyAqIGhhbmRsZTogICAgICBPcGFxdWUgY2hhbm5lbCBoYW5kbGUgcmV0dXJuZWQgYnkgR0xpbmsKKyAqIHByaXY6ICAgICAgICBQcml2YXRlIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwKKyAqIHJlcV9zaXplOiAgICBTaXplIG9mIGludGVudCB0byBiZSBxdWV1ZWQKKyAqLworc3RhdGljIGJvb2wgd2RzcF9nbGlua19ub3RpZnlfcnhfaW50ZW50X3JlcSh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCisJCQkJCSAgICBzaXplX3QgcmVxX3NpemUpCit7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisJc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoOworCWludCByYyA9IDA7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCWlmICghcHJpdikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAocmVxX3NpemUgPiBXRFNQX01BWF9SRUFEX1NJWkUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCByZXFfc2l6ZSAlemRcbiIsIF9fZnVuY19fLCByZXFfc2l6ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljaCA9IChzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqKXByaXY7CisJd3ByaXYgPSBjaC0+d3ByaXY7CisKKwlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogaW50ZW50IHNpemUgJXpkIHJlcXVlc3RlZCBmb3IgY2ggbmFtZSAlcyIsCisJCSBfX2Z1bmNfXywgcmVxX3NpemUsIGNoLT5jaF9jZmcubmFtZSk7CisKKwltdXRleF9sb2NrKCZjaC0+bXV0ZXgpOworCXJjID0gZ2xpbmtfcXVldWVfcnhfaW50ZW50KGNoLT5oYW5kbGUsIGNoLCByZXFfc2l6ZSk7CisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBxdWV1ZSByeCBpbnRlbnQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQltdXRleF91bmxvY2soJmNoLT5tdXRleCk7CisJCWdvdG8gZG9uZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjaC0+bXV0ZXgpOworCXJldCA9IHRydWU7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfbGNsX2NoX29wZW5fd3JrIC0gV29yayBmdW5jdGlvbiB0byBvcGVuIGNoYW5uZWwgYWdhaW4KKyAqIHdoZW4gbG9jYWwgZGlzY29ubmVjdCBldmVudCBoYXBwZW5zCisgKiB3b3JrOiAgICAgIFdvcmsgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbGNsX2NoX29wZW5fd3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7CisKKwljaCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2RzcF9nbGlua19jaCwKKwkJCSAgbGNsX2NoX29wZW5fd3JrKTsKKworCXdkc3BfZ2xpbmtfb3Blbl9jaChjaCk7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX2xjbF9jaF9jbHNfd3JrIC0gV29yayBmdW5jdGlvbiB0byBjbG9zZSBjaGFubmVsIGxvY2FsbHkKKyAqIHdoZW4gcmVtb3RlIGRpc2Nvbm5lY3QgZXZlbnQgaGFwcGVucworICogd29yazogICAgICBXb3JrIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX2xjbF9jaF9jbHNfd3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7CisKKwljaCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2RzcF9nbGlua19jaCwKKwkJCSAgbGNsX2NoX2Nsc193cmspOworCisJd2RzcF9nbGlua19jbG9zZV9jaChjaCk7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX25vdGlmeV9zdGF0ZSAtIEdsaW5rIGNoYW5uZWwgc3RhdGUgaW5mb3JtYXRpb24gZXZlbnQgY2FsbGJhY2sKKyAqIGhhbmRsZTogICAgICBPcGFxdWUgQ2hhbm5lbCBoYW5kbGUgcmV0dXJuZWQgYnkgR0xpbmsKKyAqIHByaXY6ICAgICAgICBQcml2YXRlIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwKKyAqIGV2ZW50OiAgICAgICBjaGFubmVsIHN0YXRlIGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbm90aWZ5X3N0YXRlKHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OworCXN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICghcHJpdikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNoID0gKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICopcHJpdjsKKwl3cHJpdiA9IGNoLT53cHJpdjsKKworCW11dGV4X2xvY2soJmNoLT5tdXRleCk7CisJY2gtPmNoYW5uZWxfc3RhdGUgPSBldmVudDsKKwlpZiAoZXZlbnQgPT0gR0xJTktfQ09OTkVDVEVEKSB7CisJCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBnbGluayBjaGFubmVsOiAlcyBjb25uZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY2gtPmNoX2NmZy5ub19vZl9pbnRlbnRzOyBpKyspIHsKKwkJCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBpbnRlbnRfc2l6ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQljaC0+Y2hfY2ZnLmludGVudHNfc2l6ZVtpXSk7CisJCQlyZXQgPSBnbGlua19xdWV1ZV9yeF9pbnRlbnQoY2gtPmhhbmRsZSwgY2gsCisJCQkJCQkgICAgY2gtPmNoX2NmZy5pbnRlbnRzX3NpemVbaV0pOworCQkJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQkJCWRldl93YXJuKHdwcml2LT5kZXYsICIlczogRmFpbGVkIHRvIHF1ZXVlIGludGVudCAlZCBvZiBzaXplICVkXG4iLAorCQkJCQkgX19mdW5jX18sIGksCisJCQkJCSBjaC0+Y2hfY2ZnLmludGVudHNfc2l6ZVtpXSk7CisJCX0KKworCQlyZXQgPSBnbGlua19xb3NfbGF0ZW5jeShjaC0+aGFuZGxlLCBjaC0+Y2hfY2ZnLmxhdGVuY3lfaW5fdXMsCisJCQkJCVFPU19QS1RfU0laRSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCWRldl93YXJuKHdwcml2LT5kZXYsICIlczogRmFpbGVkIHRvIHJlcXVlc3QgcW9zICVkIGZvciBjaCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgY2gtPmNoX2NmZy5sYXRlbmN5X2luX3VzLAorCQkJCWNoLT5jaF9jZmcubmFtZSk7CisKKwkJd2FrZV91cCgmY2gtPmNoX2Nvbm5lY3Rfd2FpdCk7CisJCW11dGV4X3VubG9jaygmY2gtPm11dGV4KTsKKwl9IGVsc2UgaWYgKGV2ZW50ID09IEdMSU5LX0xPQ0FMX0RJU0NPTk5FQ1RFRCkgeworCQkvKgorCQkgKiBEb24ndCB1c2UgZGV2X2RiZyBoZXJlIGFzIGRldiBtYXkgbm90IGJlIHZhbGlkIGlmIGNoYW5uZWwKKwkJICogY2xvc2VkIGZyb20gZHJpdmVyIGNsb3NlLgorCQkgKi8KKwkJcHJfZGVidWcoIiVzOiBjaGFubmVsOiAlcyBkaXNjb25uZWN0ZWQgbG9jYWxseVxuIiwKKwkJCSBfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+bXV0ZXgpOworCisJCWlmIChjaC0+ZnJlZV9tZW0pIHsKKwkJCWtmcmVlKGNoKTsKKwkJCWNoID0gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAoZXZlbnQgPT0gR0xJTktfUkVNT1RFX0RJU0NPTk5FQ1RFRCkgeworCQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogcmVtb3RlIGNoYW5uZWw6ICVzIGRpc2Nvbm5lY3RlZCByZW1vdGVseVxuIiwKKwkJCSBfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+bXV0ZXgpOworCQkvKgorCQkgKiBJZiByZW1vdGUgZGlzY29ubmVjdCBoYXBwZW5zLCBsb2NhbCBzaWRlIGFsc28gaGFzCisJCSAqIHRvIGNsb3NlIHRoZSBjaGFubmVsIGFzIHBlciBnbGluayBkZXNpZ24gaW4gYQorCQkgKiBzZXBhcmF0ZSB3b3JrX3F1ZXVlLgorCQkgKi8KKwkJcXVldWVfd29yayh3cHJpdi0+d29ya19xdWV1ZSwgJmNoLT5sY2xfY2hfY2xzX3dyayk7CisJfQorfQorCisvKgorICogd2RzcF9nbGlua19jbG9zZV9jaCAtIEludGVybmFsIGZ1bmN0aW9uIHRvIGNsb3NlIGdsaW5rIGNoYW5uZWwKKyAqIGNoOiAgICAgICBHbGluayBDaGFubmVsIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX2Nsb3NlX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaCkKK3sKKwlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdiA9IGNoLT53cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJndwcml2LT5nbGlua19tdXRleCk7CisJaWYgKGNoLT5oYW5kbGUpIHsKKwkJcmV0ID0gZ2xpbmtfY2xvc2UoY2gtPmhhbmRsZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IGdsaW5rX2Nsb3NlIGlzIGZhaWxlZCwgcmV0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQl9IGVsc2UgeworCQkJY2gtPmhhbmRsZSA9IE5VTEw7CisJCQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY2ggJXMgaXMgY2xvc2VkXG4iLCBfX2Z1bmNfXywKKwkJCQljaC0+Y2hfY2ZnLm5hbWUpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGNoICVzIGlzIGFscmVhZHkgY2xvc2VkXG4iLCBfX2Z1bmNfXywKKwkJCWNoLT5jaF9jZmcubmFtZSk7CisJfQorCW11dGV4X3VubG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKKworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfb3Blbl9jaCAtIEludGVybmFsIGZ1bmN0aW9uIHRvIG9wZW4gZ2xpbmsgY2hhbm5lbAorICogY2g6ICAgICAgIEdsaW5rIENoYW5uZWwgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IHdkc3BfZ2xpbmtfb3Blbl9jaChzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2gpCit7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXYgPSBjaC0+d3ByaXY7CisJc3RydWN0IGdsaW5rX29wZW5fY29uZmlnIG9wZW5fY2ZnOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKKwlpZiAoIWNoLT5oYW5kbGUpIHsKKwkJbWVtc2V0KCZvcGVuX2NmZywgMCwgc2l6ZW9mKG9wZW5fY2ZnKSk7CisJCW9wZW5fY2ZnLm9wdGlvbnMgPSBHTElOS19PUFRfSU5JVElBTF9YUE9SVDsKKwkJb3Blbl9jZmcuZWRnZSA9IFdEU1BfRURHRTsKKwkJb3Blbl9jZmcubm90aWZ5X3J4ID0gd2RzcF9nbGlua19ub3RpZnlfcng7CisJCW9wZW5fY2ZnLm5vdGlmeV90eF9kb25lID0gd2RzcF9nbGlua19ub3RpZnlfdHhfZG9uZTsKKwkJb3Blbl9jZmcubm90aWZ5X3R4X2Fib3J0ID0gd2RzcF9nbGlua19ub3RpZnlfdHhfYWJvcnQ7CisJCW9wZW5fY2ZnLm5vdGlmeV9zdGF0ZSA9IHdkc3BfZ2xpbmtfbm90aWZ5X3N0YXRlOworCQlvcGVuX2NmZy5ub3RpZnlfcnhfaW50ZW50X3JlcSA9IHdkc3BfZ2xpbmtfbm90aWZ5X3J4X2ludGVudF9yZXE7CisJCW9wZW5fY2ZnLnByaXYgPSBjaDsKKwkJb3Blbl9jZmcubmFtZSA9IGNoLT5jaF9jZmcubmFtZTsKKworCQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY2gtPmNoX2NmZy5uYW1lID0gJXMsIGxhdGVuY3lfaW5fdXMgPSAlZCwgaW50ZW50cyA9ICVkXG4iLAorCQkJX19mdW5jX18sIGNoLT5jaF9jZmcubmFtZSwgY2gtPmNoX2NmZy5sYXRlbmN5X2luX3VzLAorCQkJY2gtPmNoX2NmZy5ub19vZl9pbnRlbnRzKTsKKworCQljaC0+aGFuZGxlID0gZ2xpbmtfb3Blbigmb3Blbl9jZmcpOworCQlpZiAoSVNfRVJSX09SX05VTEwoY2gtPmhhbmRsZSkpIHsKKwkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBnbGlua19vcGVuIGZhaWxlZCBmb3IgY2ggJXNcbiIsCisJCQkJX19mdW5jX18sIGNoLT5jaF9jZmcubmFtZSk7CisJCQljaC0+aGFuZGxlID0gTlVMTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogY2ggJXMgaXMgYWxyZWFkeSBvcGVuZWRcbiIsIF9fZnVuY19fLAorCQkJY2gtPmNoX2NmZy5uYW1lKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfY2xvc2VfYWxsX2NoIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2xvc2UgYWxsIGdsaW5rIGNoYW5uZWxzCisgKiB3cHJpdjogICAgICAgV2RzcF9nbGluayBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX2Nsb3NlX2FsbF9jaChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB3cHJpdi0+bm9fb2ZfY2hhbm5lbHM7IGkrKykKKwkJaWYgKHdwcml2LT5jaCAmJiB3cHJpdi0+Y2hbaV0pCisJCQl3ZHNwX2dsaW5rX2Nsb3NlX2NoKHdwcml2LT5jaFtpXSk7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX29wZW5fYWxsX2NoIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gb3BlbiBhbGwgZ2xpbmsgY2hhbm5lbHMKKyAqIHdwcml2OiAgICAgICBXZHNwX2dsaW5rIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgd2RzcF9nbGlua19vcGVuX2FsbF9jaChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdikKK3sKKwlpbnQgcmV0ID0gMCwgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCB3cHJpdi0+bm9fb2ZfY2hhbm5lbHM7IGkrKykgeworCQlpZiAod3ByaXYtPmNoICYmIHdwcml2LT5jaFtpXSkgeworCQkJcmV0ID0gd2RzcF9nbGlua19vcGVuX2NoKHdwcml2LT5jaFtpXSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCQkJZ290byBlcnJfb3BlbjsKKwkJfQorCX0KKwlnb3RvIGRvbmU7CisKK2Vycl9vcGVuOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWlmICh3cHJpdi0+Y2hbaV0pCisJCQl3ZHNwX2dsaW5rX2Nsb3NlX2NoKHdwcml2LT5jaFtqXSk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfY2hfb3Blbl93cSAtIFdvcmsgZnVuY3Rpb24gdG8gb3BlbiBnbGluayBjaGFubmVscworICogd29yazogICAgICBXb3JrIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX2NoX29wZW5fY2xzX3dyayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisKKwl3cHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2RzcF9nbGlua19wcml2LAorCQkJICAgICBjaF9vcGVuX2Nsc193cmspOworCisJaWYgKHdwcml2LT5nbGlua19zdGF0ZS5saW5rX3N0YXRlID09IEdMSU5LX0xJTktfU1RBVEVfRE9XTikgeworCQlkZXZfaW5mbyh3cHJpdi0+ZGV2LCAiJXM6IEdMSU5LX0xJTktfU1RBVEVfRE9XTlxuIiwKKwkJCSBfX2Z1bmNfXyk7CisKKwkJd2RzcF9nbGlua19jbG9zZV9hbGxfY2god3ByaXYpOworCX0gZWxzZSBpZiAod3ByaXYtPmdsaW5rX3N0YXRlLmxpbmtfc3RhdGUgPT0gR0xJTktfTElOS19TVEFURV9VUCkgeworCQlkZXZfaW5mbyh3cHJpdi0+ZGV2LCAiJXM6IEdMSU5LX0xJTktfU1RBVEVfVVBcbiIsCisJCQkgX19mdW5jX18pOworCisJCXdkc3BfZ2xpbmtfb3Blbl9hbGxfY2god3ByaXYpOworCX0KK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfbGlua19zdGF0ZV9jYiAtIEdsaW5rIGxpbmsgc3RhdGUgY2FsbGJhY2sgdG8gaW5mb3JtCisgKiBhYm91dCBsaW5rIHN0YXRlcworICogY2JfaW5mbzogICAgIEdsaW5rIGxpbmsgc3RhdGUgY2FsbGJhY2sgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBwcml2OiAgICAgICAgUHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgbGluayBzdGF0ZSBwYXNzZWQgd2hpbGUgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgd2RzcF9nbGlua19saW5rX3N0YXRlX2NiKHN0cnVjdCBnbGlua19saW5rX3N0YXRlX2NiX2luZm8gKmNiX2luZm8sCisJCQkJICAgICB2b2lkICpwcml2KQoreworCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OworCisJaWYgKCFjYl9pbmZvIHx8ICFwcml2KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1ldGVyc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJd3ByaXYgPSAoc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqKXByaXY7CisKKwltdXRleF9sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOworCXdwcml2LT5nbGlua19zdGF0ZS5saW5rX3N0YXRlID0gY2JfaW5mby0+bGlua19zdGF0ZTsKKwl3YWtlX3VwKCZ3cHJpdi0+bGlua19zdGF0ZV93YWl0KTsKKwltdXRleF91bmxvY2soJndwcml2LT5nbGlua19tdXRleCk7CisKKwlxdWV1ZV93b3JrKHdwcml2LT53b3JrX3F1ZXVlLCAmd3ByaXYtPmNoX29wZW5fY2xzX3dyayk7Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX2NoX2luZm9faW5pdC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gYWxsb2NhdGUgY2hhbm5lbCBtZW1vcnkKKyAqIGFuZCByZWdpc3RlciB3aXRoIGdsaW5rCisgKiB3cHJpdjogICAgIFdkc3BfZ2xpbmsgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiBwa3Q6ICAgICAgIEdsaW5rIHJlZ2lzdHJhdGlvbiBwYWNrZXQgY29udGFpbnMgZ2xpbmsgY2hhbm5lbCBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX2NoX2luZm9faW5pdChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdiwKKwkJCQkgICBzdHJ1Y3Qgd2RzcF9yZWdfcGt0ICpwa3QpCit7CisJaW50IHJldCA9IDAsIGksIGo7CisJc3RydWN0IGdsaW5rX2xpbmtfaW5mbyBsaW5rX2luZm87CisJc3RydWN0IHdkc3BfZ2xpbmtfY2hfY2ZnICpjaF9jZmc7CisJc3RydWN0IHdkc3BfZ2xpbmtfY2ggKipjaDsKKwl1OCBub19vZl9jaGFubmVsczsKKwl1OCAqcGF5bG9hZDsKKwl1MzIgY2hfc2l6ZSwgY2hfY2ZnX3NpemU7CisKKwlwYXlsb2FkID0gKHU4ICopcGt0LT5wYXlsb2FkOworCW5vX29mX2NoYW5uZWxzID0gcGt0LT5ub19vZl9jaGFubmVsczsKKworCWNoID0ga2NhbGxvYyhub19vZl9jaGFubmVscywgc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICopLAorCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghY2gpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBub19vZl9jaGFubmVsczsgaSsrKSB7CisJCWNoX2NmZyA9IChzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcgKilwYXlsb2FkOworCQljaF9jZmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcpICsKKwkJCQkJKHNpemVvZih1MzIpICogY2hfY2ZnLT5ub19vZl9pbnRlbnRzKTsKKwkJY2hfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2RzcF9nbGlua19jaCkgKworCQkJCQkoc2l6ZW9mKHUzMikgKiBjaF9jZmctPm5vX29mX2ludGVudHMpOworCisJCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBjaGFubmVscyA9ICVkLCBjaF9jZmdfc2l6ZSAlZCIsCisJCQkgX19mdW5jX18sIG5vX29mX2NoYW5uZWxzLCBjaF9jZmdfc2l6ZSk7CisKKwkJY2hbaV0gPSBremFsbG9jKGNoX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNoW2ldKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfY2hfbWVtOworCQl9CisJCWNoW2ldLT5jaGFubmVsX3N0YXRlID0gR0xJTktfTE9DQUxfRElTQ09OTkVDVEVEOworCQltZW1jcHkoJmNoW2ldLT5jaF9jZmcsIHBheWxvYWQsIGNoX2NmZ19zaXplKTsKKwkJcGF5bG9hZCArPSBjaF9jZmdfc2l6ZTsKKworCQltdXRleF9pbml0KCZjaFtpXS0+bXV0ZXgpOworCQljaFtpXS0+d3ByaXYgPSB3cHJpdjsKKwkJSU5JVF9XT1JLKCZjaFtpXS0+bGNsX2NoX29wZW5fd3JrLCB3ZHNwX2dsaW5rX2xjbF9jaF9vcGVuX3dyayk7CisJCUlOSVRfV09SSygmY2hbaV0tPmxjbF9jaF9jbHNfd3JrLCB3ZHNwX2dsaW5rX2xjbF9jaF9jbHNfd3JrKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hbaV0tPmNoX2Nvbm5lY3Rfd2FpdCk7CisJfQorCXdwcml2LT5jaCA9IGNoOworCXdwcml2LT5ub19vZl9jaGFubmVscyA9IG5vX29mX2NoYW5uZWxzOworCisJSU5JVF9XT1JLKCZ3cHJpdi0+Y2hfb3Blbl9jbHNfd3JrLCB3ZHNwX2dsaW5rX2NoX29wZW5fY2xzX3dyayk7CisKKwkvKiBSZWdpc3RlciBnbGluayBsaW5rX3N0YXRlIG5vdGlmaWNhdGlvbiAqLworCWxpbmtfaW5mby5nbGlua19saW5rX3N0YXRlX25vdGlmX2NiID0gd2RzcF9nbGlua19saW5rX3N0YXRlX2NiOworCWxpbmtfaW5mby50cmFuc3BvcnQgPSBOVUxMOworCWxpbmtfaW5mby5lZGdlID0gV0RTUF9FREdFOworCisJd3ByaXYtPmdsaW5rX3N0YXRlLmxpbmtfc3RhdGUgPSBHTElOS19MSU5LX1NUQVRFX0RPV047CisJd3ByaXYtPmdsaW5rX3N0YXRlLmhhbmRsZSA9IGdsaW5rX3JlZ2lzdGVyX2xpbmtfc3RhdGVfY2IoJmxpbmtfaW5mbywKKwkJCQkJCQkJIHdwcml2KTsKKwlpZiAoIXdwcml2LT5nbGlua19zdGF0ZS5oYW5kbGUpIHsKKwkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IFVuYWJsZSB0byByZWdpc3RlciB3ZHNwIGxpbmsgc3RhdGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2NoX21lbTsKKwl9CisJZ290byBkb25lOworCitlcnJfY2hfbWVtOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJbXV0ZXhfZGVzdHJveSgmY2hbal0tPm11dGV4KTsKKwkJa2ZyZWUod3ByaXYtPmNoW2pdKTsKKwkJd3ByaXYtPmNoW2pdID0gTlVMTDsKKwl9CisJa2ZyZWUod3ByaXYtPmNoKTsKKwl3cHJpdi0+Y2ggPSBOVUxMOworCXdwcml2LT5ub19vZl9jaGFubmVscyA9IDA7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfdHhfYnVmX3dvcmsgLSBXb3JrIHF1ZXVlIGZ1bmN0aW9uIHRvIHNlbmQgdHggYnVmZmVyIHRvIGdsaW5rCisgKiB3b3JrOiAgICAgV29yayBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgd2RzcF9nbGlua190eF9idWZfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisJc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoOworCXN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiAqdHhfYnVmOworCXN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAqd3BrdDsKKwlzdHJ1Y3Qgd2RzcF9jbWRfcGt0ICpjcGt0OworCWludCByZXQgPSAwOworCisJdHhfYnVmID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiwKKwkJCSAgICAgIHR4X3dvcmspOworCWNoID0gdHhfYnVmLT5jaDsKKwl3cHJpdiA9IGNoLT53cHJpdjsKKwl3cGt0ID0gKHN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAqKXR4X2J1Zi0+YnVmOworCWNwa3QgPSAoc3RydWN0IHdkc3BfY21kX3BrdCAqKXdwa3QtPnBheWxvYWQ7CisJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGNoIG5hbWUgPSAlcywgcGF5bG9hZCBzaXplID0gJWRcbiIsCisJCV9fZnVuY19fLCBjcGt0LT5jaF9uYW1lLCBjcGt0LT5wYXlsb2FkX3NpemUpOworCisJbXV0ZXhfbG9jaygmdHhfYnVmLT5jaC0+bXV0ZXgpOworCWlmIChjaC0+Y2hhbm5lbF9zdGF0ZSA9PSBHTElOS19DT05ORUNURUQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ0eF9idWYtPmNoLT5tdXRleCk7CisJCXJldCA9IGdsaW5rX3R4KGNoLT5oYW5kbGUsIHR4X2J1ZiwKKwkJCSAgICAgICBjcGt0LT5wYXlsb2FkLCBjcGt0LT5wYXlsb2FkX3NpemUsCisJCQkgICAgICAgR0xJTktfVFhfUkVRX0lOVEVOVCk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IGdsaW5rIHR4IGZhaWxlZCwgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQkvKgorCQkJICogSWYgZ2xpbmtfdHgoKSBpcyBmYWlsZWQgdGhlbiBmcmVlIHR4X2J1ZiBoZXJlIGFzCisJCQkgKiB0aGVyZSB3b24ndCBiZSBhbnkgdHhfZG9uZSBub3RpZmljYXRpb24gdG8KKwkJCSAqIGZyZWUgdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJa2ZyZWUodHhfYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCW11dGV4X3VubG9jaygmdHhfYnVmLT5jaC0+bXV0ZXgpOworCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogY2hhbm5lbCAlcyBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlXG4iLAorCQkJX19mdW5jX18sIGNoLT5jaF9jZmcubmFtZSk7CisJCS8qCisJCSAqIEZyZWUgdHhfYnVmIGhlcmUgYXMgdGhlcmUgd29uJ3QgYmUgYW55IHR4X2RvbmUKKwkJICogbm90aWZpY2F0aW9uIGluIHRoaXMgY2FzZSBhbHNvLgorCQkgKi8KKwkJa2ZyZWUodHhfYnVmKTsKKwl9Cit9CisKKy8qCisgKiB3ZHNwX2dsaW5rX3JlYWQgLSBSZWFkIEFQSSB0byBzZW5kIHRoZSBkYXRhIHRvIHVzZXJzcGFjZQorICogZmlsZTogICAgUG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUKKyAqIGJ1ZjogICAgIFBvaW50ZXIgdG8gdGhlIHVzZXJzcGFjZSBidWZmZXIKKyAqIGNvdW50OiAgIE51bWJlciBieXRlcyB0byByZWFkIGZyb20gdGhlIGZpbGUKKyAqIHBwb3M6ICAgIFBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIGludG8gdGhlIGZpbGUKKyAqLworc3RhdGljIHNzaXplX3Qgd2RzcF9nbGlua19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQgPSAwLCByZXQxID0gMDsKKwlzdHJ1Y3Qgd2RzcF9nbGlua19yc3BfcXVlICpyc3A7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisKKwl3cHJpdiA9IChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghd3ByaXYpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb3VudCA+IFdEU1BfTUFYX1JFQURfU0laRSkgeworCQlkZXZfaW5mbyh3cHJpdi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkIGlzIG1vcmUgdGhhbiBXRFNQX01BWF9SRUFEX1NJWkVcbiIsCisJCQlfX2Z1bmNfXywgY291bnQpOworCQljb3VudCA9IFdEU1BfTUFYX1JFQURfU0laRTsKKwl9CisJLyoKKwkgKiBDb21wbGV0ZSBzaWduYWwgaGFzIGdpdmVuIGZyb20gZ2xpbmsgcnggbm90aWZpY2F0aW9uIGNhbGxiYWNrCisJICogb3IgZnJvbSBmbHVzaCBBUEkuIEFsc28gdXNlIGludGVycnVwdGlibGUgd2FpdF9mb3JfY29tcGxldGlvbiBBUEkKKwkgKiB0byBhbGxvdyB0aGUgc3lzdGVtIHRvIGdvIGluIHN1c3BlbmQuCisJICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ3cHJpdi0+cnNwX2NvbXBsZXRlKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwltdXRleF9sb2NrKCZ3cHJpdi0+cnNwX211dGV4KTsKKwlpZiAod3ByaXYtPnJzcF9jbnQpIHsKKwkJd3ByaXYtPnJzcF9jbnQtLTsKKwkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IHJlYWQgZnJvbSBidWZmZXIgJWRcbiIsCisJCQlfX2Z1bmNfXywgd3ByaXYtPnJzcF9jbnQpOworCisJCXJzcCA9ICZ3cHJpdi0+cnNwW3dwcml2LT5yc3BfY250XTsKKwkJaWYgKGNvdW50IDwgcnNwLT5idWZfc2l6ZSkgeworCQkJcmV0MSA9IGNvcHlfdG9fdXNlcihidWYsICZyc3AtPmJ1ZiwgY291bnQpOworCQkJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkICovCisJCQlyZXQgPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCXJldDEgPSBjb3B5X3RvX3VzZXIoYnVmLCAmcnNwLT5idWYsIHJzcC0+YnVmX3NpemUpOworCQkJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkICovCisJCQlyZXQgPSByc3AtPmJ1Zl9zaXplOworCQl9CisKKwkJaWYgKHJldDEpIHsKKwkJCW11dGV4X3VubG9jaygmd3ByaXYtPnJzcF9tdXRleCk7CisJCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogY29weV90b191c2VyIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGlzIHdpbGwgZXhlY3V0ZSBvbmx5IGlmIGZsdXNoIEFQSSBpcyBjYWxsZWQgb3IKKwkJICogc29tZXRoaW5nIHdyb25nIHdpdGggcmVmX2NudAorCQkgKi8KKwkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IHJlc3AgY291bnQgPSAlZFxuIiwgX19mdW5jX18sCisJCQl3cHJpdi0+cnNwX2NudCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCW11dGV4X3VubG9jaygmd3ByaXYtPnJzcF9tdXRleCk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfd3JpdGUgLSBXcml0ZSBBUEkgdG8gcmVjZWl2ZSB0aGUgZGF0YSBmcm9tIHVzZXJzcGFjZQorICogZmlsZTogICAgUG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUKKyAqIGJ1ZjogICAgIFBvaW50ZXIgdG8gdGhlIHVzZXJzcGFjZSBidWZmZXIKKyAqIGNvdW50OiAgIE51bWJlciBieXRlcyB0byByZWFkIGZyb20gdGhlIGZpbGUKKyAqIHBwb3M6ICAgIFBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIGludG8gdGhlIGZpbGUKKyAqLworc3RhdGljIHNzaXplX3Qgd2RzcF9nbGlua193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0ID0gMCwgaSwgdHhfYnVmX3NpemU7CisJc3RydWN0IHdkc3Bfd3JpdGVfcGt0ICp3cGt0OworCXN0cnVjdCB3ZHNwX2NtZF9wa3QgKmNwa3Q7CisJc3RydWN0IHdkc3BfZ2xpbmtfdHhfYnVmICp0eF9idWY7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisKKwl3cHJpdiA9IChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghd3ByaXYpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBjb3VudCA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50KTsKKworCWlmIChjb3VudCA+IFdEU1BfTUFYX1dSSVRFX1NJWkUpIHsKKwkJZGV2X2luZm8od3ByaXYtPmRldiwgIiVzOiBjb3VudCA9ICV6ZCBpcyBtb3JlIHRoYW4gV0RTUF9NQVhfV1JJVEVfU0laRVxuIiwKKwkJCV9fZnVuY19fLCBjb3VudCk7CisJCWNvdW50ID0gV0RTUF9NQVhfV1JJVEVfU0laRTsKKwl9CisKKwl0eF9idWZfc2l6ZSA9IGNvdW50ICsgc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1Zik7CisJdHhfYnVmID0ga3phbGxvYyh0eF9idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eF9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNvcHlfZnJvbV91c2VyKHR4X2J1Zi0+YnVmLCBidWYsIGNvdW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlX2J1ZjsKKwl9CisKKwl3cGt0ID0gKHN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAqKXR4X2J1Zi0+YnVmOworCXN3aXRjaCAod3BrdC0+cGt0X3R5cGUpIHsKKwljYXNlIFdEU1BfUkVHX1BLVDoKKwkJcmV0ID0gd2RzcF9nbGlua19jaF9pbmZvX2luaXQod3ByaXYsCisJCQkJCShzdHJ1Y3Qgd2RzcF9yZWdfcGt0ICopd3BrdC0+cGF5bG9hZCk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBnbGluayByZWdpc3RlciBmYWlsZWQsIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlrZnJlZSh0eF9idWYpOworCQlicmVhazsKKwljYXNlIFdEU1BfUkVBRFlfUEtUOgorCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQod3ByaXYtPmxpbmtfc3RhdGVfd2FpdCwKKwkJCQkJICh3cHJpdi0+Z2xpbmtfc3RhdGUubGlua19zdGF0ZSA9PQorCQkJCQkJCUdMSU5LX0xJTktfU1RBVEVfVVApLAorCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCWlmICghcmV0KSB7CisJCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogTGluayBzdGF0ZSB3YWl0IHRpbWVvdXRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gZnJlZV9idWY7CisJCX0KKwkJcmV0ID0gMDsKKwkJa2ZyZWUodHhfYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBXRFNQX0NNRF9QS1Q6CisJCW11dGV4X2xvY2soJndwcml2LT5nbGlua19tdXRleCk7CisJCWlmICh3cHJpdi0+Z2xpbmtfc3RhdGUubGlua19zdGF0ZSA9PSBHTElOS19MSU5LX1NUQVRFX0RPV04pIHsKKwkJCW11dGV4X3VubG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKKwkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBMaW5rIHN0YXRlIGlzIERvd25cbiIsCisJCQkJX19mdW5jX18pOworCisJCQlyZXQgPSAtRU5FVFJFU0VUOworCQkJZ290byBmcmVlX2J1ZjsKKwkJfQorCQltdXRleF91bmxvY2soJndwcml2LT5nbGlua19tdXRleCk7CisKKwkJY3BrdCA9IChzdHJ1Y3Qgd2RzcF9jbWRfcGt0ICopd3BrdC0+cGF5bG9hZDsKKwkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IHJlcXVlc3RlZCBjaF9uYW1lOiAlc1xuIiwgX19mdW5jX18sCisJCQkgY3BrdC0+Y2hfbmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCB3cHJpdi0+bm9fb2ZfY2hhbm5lbHM7IGkrKykgeworCQkJaWYgKHdwcml2LT5jaCAmJiB3cHJpdi0+Y2hbaV0gJiYKKwkJCQkoIXN0cmNtcChjcGt0LT5jaF9uYW1lLAorCQkJCQkJd3ByaXYtPmNoW2ldLT5jaF9jZmcubmFtZSkpKSB7CisJCQkJdHhfYnVmLT5jaCA9IHdwcml2LT5jaFtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXR4X2J1Zi0+Y2gpIHsKKwkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gZ2V0IGdsaW5rIGNoYW5uZWxcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZnJlZV9idWY7CisJCX0KKworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHhfYnVmLT5jaC0+Y2hfY29ubmVjdF93YWl0LAorCQkJCQkgKHR4X2J1Zi0+Y2gtPmNoYW5uZWxfc3RhdGUgPT0KKwkJCQkJCQlHTElOS19DT05ORUNURUQpLAorCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCWlmICghcmV0KSB7CisJCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogZ2xpbmsgY2hhbm5lbCAlcyBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlICVkXG4iLAorCQkJCV9fZnVuY19fLCB0eF9idWYtPmNoLT5jaF9jZmcubmFtZSwKKwkJCQl0eF9idWYtPmNoLT5jaGFubmVsX3N0YXRlKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCQlnb3RvIGZyZWVfYnVmOworCQl9CisJCXJldCA9IDA7CisKKwkJSU5JVF9XT1JLKCZ0eF9idWYtPnR4X3dvcmssIHdkc3BfZ2xpbmtfdHhfYnVmX3dvcmspOworCQlxdWV1ZV93b3JrKHdwcml2LT53b3JrX3F1ZXVlLCAmdHhfYnVmLT50eF93b3JrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IEludmFsaWQgcGFja2V0IHR5cGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJa2ZyZWUodHhfYnVmKTsKKwkJYnJlYWs7CisJfQorCWdvdG8gZG9uZTsKKworZnJlZV9idWY6CisJa2ZyZWUodHhfYnVmKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2RzcF9nbGlua19vcGVuIC0gT3BlbiBBUEkgdG8gaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEKKyAqIGlub2RlOiAgIFBvaW50ZXIgdG8gdGhlIGlub2RlIHN0cnVjdHVyZQorICogZmlsZTogICAgUG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisJc3RydWN0IHdkc3BfZ2xpbmtfZGV2ICp3ZGV2OworCisJaWYgKCFpbm9kZS0+aV9jZGV2KSB7CisJCXByX2VycigiJXM6IGNkZXYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXdkZXYgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IHdkc3BfZ2xpbmtfZGV2LCBjZGV2KTsKKworCXdwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghd3ByaXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwl3cHJpdi0+ZGV2ID0gd2Rldi0+ZGV2OworCXdwcml2LT53b3JrX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIndkc3BfZ2xpbmtfd3EiKTsKKwlpZiAoIXdwcml2LT53b3JrX3F1ZXVlKSB7CisJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBFcnJvciBjcmVhdGluZyB3ZHNwX2dsaW5rX3dxXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl93cTsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJndwcml2LT5yc3BfY29tcGxldGUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndwcml2LT5saW5rX3N0YXRlX3dhaXQpOworCW11dGV4X2luaXQoJndwcml2LT5yc3BfbXV0ZXgpOworCW11dGV4X2luaXQoJndwcml2LT5nbGlua19tdXRleCk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gd3ByaXY7CisKKwlnb3RvIGRvbmU7CisKK2Vycl93cToKKwlrZnJlZSh3cHJpdik7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfZmx1c2ggLSBGbHVzaCBBUEkgdG8gdW5ibG9jayByZWFkLgorICogZmlsZTogICAgUG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUKKyAqIGlkOiAgICAgIExvY2sgb3duZXIgSUQKKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OworCisJd3ByaXYgPSAoc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXdwcml2KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbXBsZXRlKCZ3cHJpdi0+cnNwX2NvbXBsZXRlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogd2RzcF9nbGlua19yZWxlYXNlIC0gUmVsZWFzZSBBUEkgdG8gY2xlYW4gdXAgcmVzb3VyY2VzLgorICogV2hlbmV2ZXIgYSBmaWxlIHN0cnVjdHVyZSBpcyBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMsCisgKiByZWxlYXNlIHdvbid0IGJlIGludm9rZWQgdW50aWwgYWxsIGNvcGllcyBhcmUgY2xvc2VkCisgKiAoZmlsZS0+Zl9jb3VudC5jb3VudGVyIHNob3VsZCBiZSAwKS4gSWYgd2UgbmVlZCB0byBmbHVzaCBwZW5kaW5nCisgKiBkYXRhIHdoZW4gYW55IGNvcHkgaXMgY2xvc2VkLCB5b3Ugc2hvdWxkIGltcGxlbWVudCB0aGUgZmx1c2ggbWV0aG9kLgorICoKKyAqIGlub2RlOiAgIFBvaW50ZXIgdG8gdGhlIGlub2RlIHN0cnVjdHVyZQorICogZmlsZTogICAgUG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7CisKKwl3cHJpdiA9IChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghd3ByaXYpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh3cHJpdi0+Z2xpbmtfc3RhdGUuaGFuZGxlKQorCQlnbGlua191bnJlZ2lzdGVyX2xpbmtfc3RhdGVfY2Iod3ByaXYtPmdsaW5rX3N0YXRlLmhhbmRsZSk7CisKKwlmbHVzaF93b3JrcXVldWUod3ByaXYtPndvcmtfcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHdwcml2LT53b3JrX3F1ZXVlKTsKKworCS8qCisJICogQ2xlYW4gdXAgZ2xpbmsgY2hhbm5lbCBtZW1vcnkgaW4gY2hhbm5lbCBzdGF0ZQorCSAqIGNhbGxiYWNrIG9ubHkgaWYgY2xvc2UgY2hhbm5lbHMgYXJlIGNhbGxlZCBmcm9tIGhlcmUuCisJICovCisJaWYgKHdwcml2LT5jaCkgeworCQlmb3IgKGkgPSAwOyBpIDwgd3ByaXYtPm5vX29mX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmICh3cHJpdi0+Y2hbaV0pIHsKKwkJCQl3cHJpdi0+Y2hbaV0tPmZyZWVfbWVtID0gdHJ1ZTsKKwkJCQkvKgorCQkJCSAqIENoYW5uZWwgaGFuZGxlIE5VTEwgbWVhbnMgY2hhbm5lbCBpcyBhbHJlYWR5CisJCQkJICogY2xvc2VkLiBGcmVlIHRoZSBjaGFubmVsIG1lbW9yeSBoZXJlIGl0c2VsZi4KKwkJCQkgKi8KKwkJCQlpZiAoIXdwcml2LT5jaFtpXS0+aGFuZGxlKSB7CisJCQkJCWtmcmVlKHdwcml2LT5jaFtpXSk7CisJCQkJCXdwcml2LT5jaFtpXSA9IE5VTEw7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2RzcF9nbGlua19jbG9zZV9jaCh3cHJpdi0+Y2hbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWtmcmVlKHdwcml2LT5jaCk7CisJCXdwcml2LT5jaCA9IE5VTEw7CisJfQorCisJbXV0ZXhfZGVzdHJveSgmd3ByaXYtPmdsaW5rX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZ3cHJpdi0+cnNwX211dGV4KTsKKwlrZnJlZSh3cHJpdik7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHNwX2dsaW5rX2ZvcHMgPSB7CisJLm93bmVyID0gICAgICAgICAgICAgICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICAgICAgICAgICAgICAgd2RzcF9nbGlua19vcGVuLAorCS5yZWFkID0gICAgICAgICAgICAgICAgIHdkc3BfZ2xpbmtfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgICAgICAgICB3ZHNwX2dsaW5rX3dyaXRlLAorCS5mbHVzaCA9ICAgICAgICAgICAgICAgIHdkc3BfZ2xpbmtfZmx1c2gsCisJLnJlbGVhc2UgPSAgICAgICAgICAgICAgd2RzcF9nbGlua19yZWxlYXNlLAorfTsKKworLyoKKyAqIHdkc3BfZ2xpbmtfcHJvYmUgLSBEcml2ZXIgcHJvYmUgdG8gZXhwb3NlIGNoYXIgZGV2aWNlCisgKiBwZGV2OiAgICBQb2ludGVyIHRvIGRldmljZSB0cmVlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgd2RzcF9nbGlua19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHdkc3BfZ2xpbmtfZGV2ICp3ZGV2OworCisJd2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKndkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJndkZXYtPmRldl9udW0sIDAsIE1JTk9SX05VTUJFUl9DT1VOVCwKKwkJCQkgIFdEU1BfR0xJTktfRFJJVkVSX05BTUUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGFsbG9jIGNoYXIgZGV2LCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9jaHJkZXY7CisJfQorCisJd2Rldi0+Y2xzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBXRFNQX0dMSU5LX0RSSVZFUl9OQU1FKTsKKwlpZiAoSVNfRVJSKHdkZXYtPmNscykpIHsKKwkJcmV0ID0gUFRSX0VSUih3ZGV2LT5jbHMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBjbGFzcywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY2xhc3M7CisJfQorCisJd2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh3ZGV2LT5jbHMsIE5VTEwsIHdkZXYtPmRldl9udW0sCisJCQkJICBOVUxMLCBXRFNQX0dMSU5LX0RSSVZFUl9OQU1FKTsKKwlpZiAoSVNfRVJSKHdkZXYtPmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUih3ZGV2LT5kZXYpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2Rldl9jcmVhdGU7CisJfQorCisJY2Rldl9pbml0KCZ3ZGV2LT5jZGV2LCAmd2RzcF9nbGlua19mb3BzKTsKKwlyZXQgPSBjZGV2X2FkZCgmd2Rldi0+Y2Rldiwgd2Rldi0+ZGV2X251bSwgTUlOT1JfTlVNQkVSX0NPVU5UKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byByZWdpc3RlciBjaGFyIGRldiwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY2Rldl9hZGQ7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdkZXYpOworCWdvdG8gZG9uZTsKKworZXJyX2NkZXZfYWRkOgorCWRldmljZV9kZXN0cm95KHdkZXYtPmNscywgd2Rldi0+ZGV2X251bSk7CisKK2Vycl9kZXZfY3JlYXRlOgorCWNsYXNzX2Rlc3Ryb3kod2Rldi0+Y2xzKTsKKworZXJyX2NsYXNzOgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigwLCBNSU5PUl9OVU1CRVJfQ09VTlQpOworCitlcnJfY2hyZGV2OgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgd2Rldik7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdkc3BfZ2xpbmtfcmVtb3ZlIC0gRHJpdmVyIHJlbW92ZSB0byBoYW5kbGUgY2xlYW51cAorICogcGRldjogICAgIFBvaW50ZXIgdG8gZGV2aWNlIHRyZWUgZGF0YS4KKyAqLworc3RhdGljIGludCB3ZHNwX2dsaW5rX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3ZHNwX2dsaW5rX2RldiAqd2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHdkZXYpIHsKKwkJY2Rldl9kZWwoJndkZXYtPmNkZXYpOworCQlkZXZpY2VfZGVzdHJveSh3ZGV2LT5jbHMsIHdkZXYtPmRldl9udW0pOworCQljbGFzc19kZXN0cm95KHdkZXYtPmNscyk7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigwLCBNSU5PUl9OVU1CRVJfQ09VTlQpOworCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdkZXYpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBJbnZhbGlkIGRldmljZSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdkc3BfZ2xpbmtfb2ZfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLWdsaW5rIn0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd2RzcF9nbGlua19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdkc3BfZ2xpbmtfZHJpdmVyID0geworCS5wcm9iZSAgICAgICAgICA9IHdkc3BfZ2xpbmtfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gd2RzcF9nbGlua19yZW1vdmUsCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZSAgID0gV0RTUF9HTElOS19EUklWRVJfTkFNRSwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3ZHNwX2dsaW5rX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdkc3BfZ2xpbmtfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgV0NEX0RTUCBHTElOSyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL0tjb25maWcgYi9kcml2ZXJzL3NvdW5kd2lyZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGEzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvdW5kd2lyZS9LY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgU09VTkRXSVJFIGRyaXZlciBjb25maWd1cmF0aW9uCisjCittZW51Y29uZmlnIFNPVU5EV0lSRQorCWJvb2wgIlNvdW5kd2lyZSBzdXBwb3J0IgorCWhlbHAKKwkgIFNvdW5kd2lyZSBpcyBhIHR3byB3aXJlIGludGVyZmFjZSBmb3IgYXVkaW8gdG8gY29ubmVjdAorCSAgc2ltcGxlIHBlcmlwaGVyYWwgY29tcG9uZW50cyBpbiBtb2JpbGUgZGV2aWNlcy4KKworaWYgU09VTkRXSVJFCitjb25maWcgU09VTkRXSVJFX1dDRF9DVFJMCisJZGVwZW5kcyBvbiBXQ0Q5MzM1X0NPREVDCisJdHJpc3RhdGUgIlFUSSBXQ0QgQ09ERUMgU291bmR3aXJlIGNvbnRyb2xsZXIiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VsZWN0IGRyaXZlciBmb3IgUVRJJ3MgU291bmR3aXJlIE1hc3RlciBDb21wb25lbnQuCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb3VuZHdpcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3NvdW5kd2lyZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FjZmYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb3VuZHdpcmUvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciBrZXJuZWwgc291bmR3aXJlIGZyYW1ld29yay4KKyMKK29iai0kKENPTkZJR19TT1VORFdJUkUpCQkJKz0gc291bmR3aXJlLm8KK29iai0kKENPTkZJR19TT1VORFdJUkVfV0NEX0NUUkwpCSs9IHN3ci13Y2QtY3RybC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvdW5kd2lyZS9zb3VuZHdpcmUuYyBiL2RyaXZlcnMvc291bmR3aXJlL3NvdW5kd2lyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjU1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvdW5kd2lyZS9zb3VuZHdpcmUuYwpAQCAtMCwwICsxLDEwNTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3NvdW5kd2lyZS5oPgorCitzdHJ1Y3QgYm9hcmRpbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHN3cl9ib2FyZGluZm8JYm9hcmRfaW5mbzsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYm9hcmRfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKHN3cl9tYXN0ZXJfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGJvYXJkX2xvY2spOworc3RhdGljIERFRklORV9JRFIobWFzdGVyX2lkcik7CitzdGF0aWMgREVGSU5FX01VVEVYKHN3cl9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBzd3JfZGV2X3R5cGU7CisKKyNkZWZpbmUgU09VTkRXSVJFX05BTUVfU0laRQkzMgorCitzdGF0aWMgdm9pZCBzd3JfbWFzdGVyX3B1dChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQoreworCWlmIChtYXN0ZXIpCisJCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBzd3JfbWFzdGVyICpzd3JfbWFzdGVyX2dldChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQoreworCWlmICghbWFzdGVyIHx8ICFnZXRfZGV2aWNlKCZtYXN0ZXItPmRldikpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXN0ZXI7Cit9CisKK3N0YXRpYyB2b2lkIHN3cl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYgPSB0b19zd3JfZGV2aWNlKGRldik7CisJc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcjsKKworCWlmICghc3dyX2RldikKKwkJcmV0dXJuOworCW1hc3RlciA9IHN3cl9kZXYtPm1hc3RlcjsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuOworCW11dGV4X2xvY2soJm1hc3Rlci0+bWxvY2spOworCWxpc3RfZGVsX2luaXQoJnN3cl9kZXYtPmRldl9saXN0KTsKKwltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOworCXN3cl9tYXN0ZXJfcHV0KHN3cl9kZXYtPm1hc3Rlcik7CisJa2ZyZWUoc3dyX2Rldik7Cit9CisKKy8qKgorICogc3dyX25ld19kZXZpY2UgLSBpbnN0YW50aWF0ZSBhIG5ldyBzb3VuZHdpcmUgZGV2aWNlCisgKiBAbWFzdGVyOiBDb250cm9sbGVyIHRvIHdoaWNoIGRldmljZSBpcyBjb25uZWN0ZWQKKyAqIEBpbmZvOiBEZXNjcmliZXMgdGhlIHNvdW5kd2lyZSBkZXZpY2UKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIENyZWF0ZSBhIHNvdW5kd2lyZSBkZXZpY2UuIEJpbmRpbmcgaXMgaGFuZGxlZCB0aHJvdWdoIGRyaXZlciBtb2RlbAorICogcHJvYmUvcmVtb3ZlIG1ldGhvZHMuIEEgZHJpdmVyIG1heSBiZSBib3VuZCB0byB0aGlzIGRldmljZSB3aGVuCisgKiB0aGUgZnVuY3Rpb24gZ2V0cyByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm5zIGEgc291bmR3aXJlIG5ldyBkZXZpY2Ugb3IgTlVMTAorICovCitzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX25ld19kZXZpY2Uoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgc3RydWN0IHN3cl9ib2FyZGluZm8gY29uc3QgKmluZm8pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyOworCisJaWYgKCFtYXN0ZXIgfHwgIXN3cl9tYXN0ZXJfZ2V0KG1hc3RlcikpIHsKKwkJcHJfZXJyKCIlczogbWFzdGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dyID0ga3phbGxvYyhzaXplb2YoKnN3ciksIEdGUF9LRVJORUwpOworCWlmICghc3dyKSB7CisJCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN3ci0+bWFzdGVyID0gbWFzdGVyOworCXN3ci0+YWRkciA9IGluZm8tPmFkZHI7CisJc3RybGNweShzd3ItPm5hbWUsIGluZm8tPm5hbWUsIHNpemVvZihzd3ItPm5hbWUpKTsKKwlzd3ItPmRldi50eXBlID0gJnN3cl9kZXZfdHlwZTsKKwlzd3ItPmRldi5wYXJlbnQgPSAmbWFzdGVyLT5kZXY7CisJc3dyLT5kZXYuYnVzID0gJnNvdW5kd2lyZV90eXBlOworCXN3ci0+ZGV2LnJlbGVhc2UgPSBzd3JfZGV2X3JlbGVhc2U7CisJc3dyLT5kZXYub2Zfbm9kZSA9IGluZm8tPm9mX25vZGU7CisJbXV0ZXhfbG9jaygmbWFzdGVyLT5tbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmc3dyLT5kZXZfbGlzdCwgJm1hc3Rlci0+ZGV2aWNlcyk7CisJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKKworCWRldl9zZXRfbmFtZSgmc3dyLT5kZXYsICIlcy4lbHgiLCBzd3ItPm5hbWUsIHN3ci0+YWRkcik7CisJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZzd3ItPmRldik7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgImRldmljZSBbJXNdIHJlZ2lzdGVyIGZhaWxlZCBlcnIgJWRcbiIsCisJCQlzd3ItPm5hbWUsIHJlc3VsdCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZGV2X2RiZygmbWFzdGVyLT5kZXYsICJEZXZpY2UgWyVzXSByZWdpc3RlcmVkIHdpdGggYnVzIGlkICVzXG4iLAorCQlzd3ItPm5hbWUsIGRldl9uYW1lKCZzd3ItPmRldikpOworCXJldHVybiBzd3I7CisKK2Vycl9vdXQ6CisJZGV2X2RiZygmbWFzdGVyLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgc3dyIGRldmljZSAlcyBhdCAweCVseCAlZFxuIiwKKwkJc3dyLT5uYW1lLCBzd3ItPmFkZHIsIHJlc3VsdCk7CisJc3dyX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlrZnJlZShzd3IpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzd3JfbmV3X2RldmljZSk7CisKKy8qKgorICogc3dyX3N0YXJ0dXBfZGV2aWNlcyAtIHBlcmZvcm0gYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBmb3IgY2hpbGQgZGV2aWNlcworICoKKyAqIEBzd3JfZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqCisgKiBQZXJmb3JtcyBhbnkgYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBuZWVkZWQgZm9yIGEgc291bmR3aXJlIHNsYXZlIGRldmljZS4KKyAqIFRoaXMgaXMgYSBvcHRpb25hbCBmdW5jdGlvbmFsaXR5IGRlZmluZWQgYnkgc2xhdmUgZGV2aWNlcy4KKyAqIFJlbW92ZXMgdGhlIHNsYXZlIG5vZGUgZnJvbSB0aGUgbGlzdCwgaW4gY2FzZSB0aGVyZSBpcyBhbnkgZmFpbHVyZS4KKyAqLworaW50IHN3cl9zdGFydHVwX2RldmljZXMoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpCit7CisJc3RydWN0IHN3cl9kcml2ZXIgKnN3cl9kcnY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXQgPSAwOworCisJaWYgKCFzd3JfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9ICZzd3JfZGV2LT5kZXY7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dyX2RydiA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghc3dyX2RydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3dyX2Rydi0+c3RhcnR1cCkgeworCQlyZXQgPSBzd3JfZHJ2LT5zdGFydHVwKHN3cl9kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJZGV2X2RiZygmc3dyX2Rldi0+ZGV2LAorCQkJIiVzOiBzdGFydHVwIGNvbXBsZXRlIGZvciBkZXZpY2UgJWx4XG4iLAorCQkJX19mdW5jX18sIHN3cl9kZXYtPmFkZHIpOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9zdGFydHVwX2RldmljZXMpOworCisvKioKKyAqIG9mX3JlZ2lzdGVyX3N3cl9kZXZpY2VzIC0gcmVnaXN0ZXIgY2hpbGQgZGV2aWNlcyBvbiB0byB0aGUgc291bmR3aXJlIGJ1cworICogQG1hc3RlcjogcG9pbnRlciB0byBzb3VuZHdpcmUgbWFzdGVyIGRldmljZQorICoKKyAqIFJlZ2lzdGVycyBhIHNvdW5kd2lyZSBkZXZpY2UgZm9yIGVhY2ggY2hpbGQgbm9kZSBvZiBtYXN0ZXIgbm9kZSB3aGljaCBoYXMKKyAqIGEgInN3ci1kZXZpZCIgcHJvcGVydHkKKyAqCisgKi8KK2ludCBvZl9yZWdpc3Rlcl9zd3JfZGV2aWNlcyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBzd3JfZGV2aWNlICpzd3I7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCisJaWYgKCFtYXN0ZXItPmRldi5vZl9ub2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG1hc3Rlci0+ZGV2Lm9mX25vZGUsIG5vZGUpIHsKKwkJc3RydWN0IHN3cl9ib2FyZGluZm8gaW5mbyA9IHt9OworCQl1NjQgYWRkcjsKKworCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIm9mX3N3cjpyZWdpc3RlciAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKworCQlpZiAob2ZfbW9kYWxpYXNfbm9kZShub2RlLCBpbmZvLm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKSA8IDApIHsKKwkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAib2Zfc3dyOm1vZGFsaWFzIGZhaWx1cmUgJXNcbiIsCisJCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3U2NChub2RlLCAicmVnIiwgJmFkZHIpKSB7CisJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIm9mX3N3cjppbnZhbGlkIHJlZyAlc1xuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaW5mby5hZGRyID0gYWRkcjsKKwkJaW5mby5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisJCXN3ciA9IHN3cl9uZXdfZGV2aWNlKG1hc3RlciwgJmluZm8pOworCQlpZiAoIXN3cikgeworCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJvZl9zd3I6IFJlZ2lzdGVyIGZhaWxlZCAlc1xuIiwKKwkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJb2Zfbm9kZV9wdXQobm9kZSk7CisJCQljb250aW51ZTsKKwkJfQorCQltYXN0ZXItPm51bV9kZXYrKzsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3JlZ2lzdGVyX3N3cl9kZXZpY2VzKTsKKworLyoqCisgKiBzd3JfcG9ydF9yZXNwb25zZSAtIHJlc3BvbnNlIGZyb20gbWFzdGVyIHRvIGZyZWUgdGhlIGNvbXBsZXRlZCB0cmFuc2FjdGlvbgorICogQG1zdHI6IHBvaW50ZXIgdG8gc291bmR3aXJlIG1hc3RlciBkZXZpY2UKKyAqIEB0aWQ6IHRyYW5zYWN0aW9uIGlkIHRoYXQgaW5kaWNhdGVzIHRyYW5zYWN0aW9uIHRvIGJlIGZyZWVkLgorICoKKyAqIE1hc3RlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGZyZWUgdGhlIGNvbXBlbGV0ZWQgdHJhbnNhY3Rpb24gbWVtb3J5CisgKi8KK3ZvaWQgc3dyX3BvcnRfcmVzcG9uc2Uoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHU4IHRpZCkKK3sKKwlzdHJ1Y3Qgc3dyX3BhcmFtcyAqdHhuOworCisJdHhuID0gbXN0ci0+cG9ydF90eG5bdGlkXTsKKworCWlmICh0eG4gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZtc3RyLT5kZXYsICIlczogdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW1zdHItPnBvcnRfdHhuW3RpZF0gPSBOVUxMOworCWtmcmVlKHR4bik7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9wb3J0X3Jlc3BvbnNlKTsKKworLyoqCisgKiBzd3JfcmVtb3ZlX2Zyb21fZ3JvdXAgLSByZW1vdmUgc291bmR3aXJlIHNsYXZlIGRldmljZXMgZnJvbSBncm91cAorICogQGRldjogcG9pbnRlciB0byB0aGUgc291bmR3aXJlIHNsYXZlIGRldmljZQorICogZGV2X251bTogZGV2aWNlIG51bWJlciBvZiB0aGUgc291bmR3aXJlIHNsYXZlIGRldmljZQorICoKKyAqIFJldHVybnMgZXJyb3IgY29kZSBmb3IgZmFpbHVyZSBhbmQgMCBmb3Igc3VjY2VzcworICovCitpbnQgc3dyX3JlbW92ZV9mcm9tX2dyb3VwKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4IGRldl9udW0pCit7CisJc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1hc3RlciA9IGRldi0+bWFzdGVyOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZGV2LT5ncm91cF9pZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWFzdGVyLT5ncl9zaWQgPT0gZGV2X251bSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWFzdGVyLT5yZW1vdmVfZnJvbV9ncm91cCAmJiBtYXN0ZXItPnJlbW92ZV9mcm9tX2dyb3VwKG1hc3RlcikpCisJCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IGZhbGxpbmcgYmFjayB0byBHUk9VUF9OT05FXG4iLAorCQkJX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9yZW1vdmVfZnJvbV9ncm91cCk7CisKKy8qKgorICogc3dyX3NsdmRldl9kYXRhcGF0aF9jb250cm9sIC0gRW5hYmxlcy9EaXNhYmxlcyBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHBhdGgKKyAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQorICogQGRldl9udW06IGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUgYW5kIDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IHN3cl9zbHZkZXZfZGF0YXBhdGhfY29udHJvbChzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLAorCQkJCWJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYXN0ZXIgPSBkZXYtPm1hc3RlcjsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2LT5ncm91cF9pZCkgeworCQkvKiBCcm9hZGNhc3QgKi8KKwkJaWYgKG1hc3Rlci0+Z3Jfc2lkICE9IGRldl9udW0pIHsKKwkJCWlmICghbWFzdGVyLT5ncl9zaWQpCisJCQkJbWFzdGVyLT5ncl9zaWQgPSBkZXZfbnVtOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKG1hc3Rlci0+c2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wpCisJCW1hc3Rlci0+c2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wobWFzdGVyLCBlbmFibGUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9zbHZkZXZfZGF0YXBhdGhfY29udHJvbCk7CisKKy8qKgorICogc3dyX2Nvbm5lY3RfcG9ydCAtIGVuYWJsZSBzb3VuZHdpcmUgc2xhdmUgcG9ydChzKQorICogQGRldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAcG9ydF9pZDogbG9naWNhbCBwb3J0IGlkKHMpIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBudW1fcG9ydDogbnVtYmVyIG9mIHNsYXZlIGRldmljZSBwb3J0cyBuZWVkIHRvIGJlIGVuYWJsZWQKKyAqIEBjaF9tYXNrOiBjaGFubmVscyBmb3IgZWFjaCBwb3J0IHRoYXQgbmVlZHMgdG8gYmUgZW5hYmxlZAorICogQGNoX3JhdGU6IHJhdGUgYXQgd2hpY2ggZWFjaCBwb3J0L2NoYW5uZWxzIG9wZXJhdGUKKyAqIEBudW1fY2g6IG51bWJlciBvZiBjaGFubmVscyBmb3IgZWFjaCBwb3J0CisgKgorICogc291bmR3aXJlIHNsYXZlIGRldmljZSBjYWxsIHN3cl9jb25uZWN0X3BvcnQgQVBJIHRvIGVuYWJsZSBhbGwvc29tZSBvZgorICogaXRzIHBvcnRzIGFuZCBjb3JyZXNwb25kaW5nIGNoYW5uZWxzIGFuZCBjaGFubmVsIHJhdGUuIFRoaXMgQVBJIHdpbGwKKyAqIGNhbGwgbWFzdGVyIGNvbm5lY3RfcG9ydCBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxjdWxhdGUgZnJhbWUgc3RydWN0dXJlCisgKiBhbmQgZW5hYmxlIG1hc3RlciBhbmQgc2xhdmUgcG9ydHMKKyAqLworaW50IHN3cl9jb25uZWN0X3BvcnQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggKnBvcnRfaWQsIHU4IG51bV9wb3J0LAorCQkJdTggKmNoX21hc2ssIHUzMiAqY2hfcmF0ZSwgdTggKm51bV9jaCkKK3sKKwl1OCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3dyX3BhcmFtcyAqdHhuID0gTlVMTDsKKwlzdHJ1Y3Qgc3dyX3BhcmFtcyAqKnRlbXBfdHhuID0gTlVMTDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyID0gZGV2LT5tYXN0ZXI7CisKKwlpZiAoIW1hc3RlcikgeworCQlwcl9lcnIoIiVzOiBNYXN0ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG51bV9wb3J0ID4gU1dSX01BWF9ERVZfUE9SVF9OVU0pIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogbnVtX3BvcnQgJWQgZXhjZWVkcyBtYXggcG9ydCAlZFxuIiwKKwkJCV9fZnVuY19fLCBudW1fcG9ydCwgU1dSX01BWF9ERVZfUE9SVF9OVU0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIGNyZWF0ZSAidHhuIiB0byBhY2NvbW1vZGF0ZSBwb3J0cyBlbmFibGVtZW50IG9mCisJICogZGlmZmVyZW50IHNsYXZlIGRldmljZXMgY2FsbGluZyBzd3JfY29ubmVjdF9wb3J0IGF0IHRoZQorCSAqIHNhbWUgdGltZS4gT25jZSBtYXN0ZXIgcHJvY2VzcyB0aGUgdHhuIGRhdGEsIGl0IGNhbGxzCisJICogc3dyX3BvcnRfcmVzcG9uc2UoKSB0byBmcmVlIHRoZSB0cmFuc2FjdGlvbi4gTWF4aW11bQorCSAqIG9mIDI1NiB0cmFuc2FjdGlvbnMgY2FuIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwl0eG4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3dyX3BhcmFtcyksIEdGUF9LRVJORUwpOworCWlmICghdHhuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2xvY2soJm1hc3Rlci0+bWxvY2spOworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPmxhc3RfdGlkOyBpKyspIHsKKwkJaWYgKG1hc3Rlci0+cG9ydF90eG5baV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBtYXN0ZXItPmxhc3RfdGlkKSB7CisJCWlmIChtYXN0ZXItPmxhc3RfdGlkID09IDI1NSkgeworCQkJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKKwkJCWtmcmVlKHR4bik7CisJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzIE1heCB0aWQgcmVhY2hlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl0ZW1wX3R4biA9IGtyZWFsbG9jKG1hc3Rlci0+cG9ydF90eG4sCisJCQkJKGkgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc3dyX3BhcmFtcyAqKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wX3R4bikgeworCQkJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKKwkJCWtmcmVlKHR4bik7CisJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzIE5vdCBhYmxlIHRvIGFsbG9jYXRlXG4iCisJCQkJIm1hc3RlciBwb3J0IHRyYW5zYWN0aW9uIG1lbW9yeVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltYXN0ZXItPnBvcnRfdHhuID0gdGVtcF90eG47CisJCW1hc3Rlci0+bGFzdF90aWQrKzsKKwl9CisJbWFzdGVyLT5wb3J0X3R4bltpXSA9IHR4bjsKKwltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOworCXR4bi0+dGlkID0gaTsKKworCXR4bi0+ZGV2X2lkID0gZGV2LT5kZXZfbnVtOworCXR4bi0+bnVtX3BvcnQgPSBudW1fcG9ydDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvcnQ7IGkrKykgeworCQl0eG4tPnBvcnRfaWRbaV0gPSBwb3J0X2lkW2ldOworCQl0eG4tPm51bV9jaFtpXSAgPSBudW1fY2hbaV07CisJCXR4bi0+Y2hfcmF0ZVtpXSA9IGNoX3JhdGVbaV07CisJCXR4bi0+Y2hfZW5baV0gICA9IGNoX21hc2tbaV07CisJfQorCXJldCA9IG1hc3Rlci0+Y29ubmVjdF9wb3J0KG1hc3RlciwgdHhuKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzd3JfY29ubmVjdF9wb3J0KTsKKworLyoqCisgKiBzd3JfZGlzY29ubmVjdF9wb3J0IC0gZGlzYWJsZSBzb3VuZHdpcmUgc2xhdmUgcG9ydChzKQorICogQGRldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAcG9ydF9pZDogbG9naWNhbCBwb3J0IGlkKHMpIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBudW1fcG9ydDogbnVtYmVyIG9mIHNsYXZlIGRldmljZSBwb3J0cyBuZWVkIHRvIGJlIGRpc2FibGVkCisgKgorICogc291bmR3aXJlIHNsYXZlIGRldmljZSBjYWxsIHN3cl9kaXNjb25uZWN0X3BvcnQgQVBJIHRvIGRpc2FibGUgYWxsL3NvbWUgb2YKKyAqIGl0cyBwb3J0cy4gVGhpcyBBUEkgd2lsbCBjYWxsIG1hc3RlciBkaXNjb25uZWN0X3BvcnQgY2FsbGJhY2sgZnVuY3Rpb24gdG8KKyAqIGRpc2FibGUgbWFzdGVyIGFuZCBzbGF2ZSBwb3J0IGFuZCAocmUpY29uZmlndXJlIGZyYW1lIHN0cnVjdHVyZQorICovCitpbnQgc3dyX2Rpc2Nvbm5lY3RfcG9ydChzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCAqcG9ydF9pZCwgdTggbnVtX3BvcnQpCit7CisJdTggaSA9IDA7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3dyX3BhcmFtcyAqdHhuID0gTlVMTDsKKwlzdHJ1Y3Qgc3dyX3BhcmFtcyAqKnRlbXBfdHhuID0gTlVMTDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyID0gZGV2LT5tYXN0ZXI7CisKKwlpZiAoIW1hc3RlcikgeworCQlwcl9lcnIoIiVzOiBNYXN0ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobnVtX3BvcnQgPiBTV1JfTUFYX0RFVl9QT1JUX05VTSkgeworCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzOiBudW1fcG9ydCAlZCBleGNlZWRzIG1heCBwb3J0ICVkXG4iLAorCQkJX19mdW5jX18sIG51bV9wb3J0LCBTV1JfTUFYX0RFVl9QT1JUX05VTSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXR4biA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzd3JfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG4pCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfbG9jaygmbWFzdGVyLT5tbG9jayk7CisJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bGFzdF90aWQ7IGkrKykgeworCQlpZiAobWFzdGVyLT5wb3J0X3R4bltpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IG1hc3Rlci0+bGFzdF90aWQpIHsKKwkJaWYgKG1hc3Rlci0+bGFzdF90aWQgPT0gMjU1KSB7CisJCQltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOworCQkJa2ZyZWUodHhuKTsKKwkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXMgTWF4IHRpZCByZWFjaGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXRlbXBfdHhuID0ga3JlYWxsb2MobWFzdGVyLT5wb3J0X3R4biwKKwkJCQkoaSArIDEpICogc2l6ZW9mKHN0cnVjdCBzd3JfcGFyYW1zICopLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXRlbXBfdHhuKSB7CisJCQltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOworCQkJa2ZyZWUodHhuKTsKKwkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXMgTm90IGFibGUgdG8gYWxsb2NhdGVcbiIKKwkJCQkibWFzdGVyIHBvcnQgdHJhbnNhY3Rpb24gbWVtb3J5XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1hc3Rlci0+cG9ydF90eG4gPSB0ZW1wX3R4bjsKKwkJbWFzdGVyLT5sYXN0X3RpZCsrOworCX0KKwltYXN0ZXItPnBvcnRfdHhuW2ldID0gdHhuOworCW11dGV4X3VubG9jaygmbWFzdGVyLT5tbG9jayk7CisJdHhuLT50aWQgPSBpOworCisJdHhuLT5kZXZfaWQgPSBkZXYtPmRldl9udW07CisJdHhuLT5udW1fcG9ydCA9IG51bV9wb3J0OworCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydDsgaSsrKQorCQl0eG4tPnBvcnRfaWRbaV0gPSBwb3J0X2lkW2ldOworCXJldCA9IG1hc3Rlci0+ZGlzY29ubmVjdF9wb3J0KG1hc3RlciwgdHhuKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzd3JfZGlzY29ubmVjdF9wb3J0KTsKKworLyoqCisgKiBzd3JfZ2V0X2xvZ2ljYWxfZGV2X251bSAtIEdldCBzb3VuZHdpcmUgc2xhdmUgbG9naWNhbCBkZXZpY2UgbnVtYmVyCisgKiBAZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBkZXZfaWQ6IHBoeXNpY2FsIGRldmljZSBpZCBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAZGV2X251bTogcG9pbnRlciB0byBsb2dpY2FsIGRldmljZSBudW0gb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQorICoKKyAqIFRoaXMgQVBJIHdpbGwgZ2V0IHRoZSBsb2dpY2FsIGRldmljZSBudW1iZXIgb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQorICovCitpbnQgc3dyX2dldF9sb2dpY2FsX2Rldl9udW0oc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTY0IGRldl9pZCwKKwkJCXU4ICpkZXZfbnVtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIgPSBkZXYtPm1hc3RlcjsKKworCWlmICghbWFzdGVyKSB7CisJCXByX2VycigiJXM6IE1hc3RlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdXRleF9sb2NrKCZtYXN0ZXItPm1sb2NrKTsKKwlyZXQgPSBtYXN0ZXItPmdldF9sb2dpY2FsX2Rldl9udW0obWFzdGVyLCBkZXZfaWQsIGRldl9udW0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgdG8gZ2V0IGxvZ2ljYWwgYWRkciBmb3IgZGV2aWNlICVsbHhcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBkZXZfaWQpOworCX0KKwltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKTsKKworLyoqCisgKiBzd3JfcmVhZCAtIHJlYWQgc291bmR3aXJlIHNsYXZlIGRldmljZSByZWdpc3RlcnMKKyAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQorICogQGRldl9udW06IGxvZ2ljYWwgZGV2aWNlIG51bSBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAcmVnX2FkZHI6IGJhc2UgcmVnaXN0ZXIgYWRkcmVzcyB0aGF0IG5lZWRzIHRvIGJlIHJlYWQKKyAqIEBidWY6IHBvaW50ZXIgdG8gc3RvcmUgdGhlIHZhbHVlcyBvZiByZWdpc3RlcnMgZnJvbSBiYXNlIGFkZHJlc3MKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyCisgKgorICogVGhpcyBBUEkgd2lsbCByZWFkIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBmcm9tCisgKiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKi8KK2ludCBzd3JfcmVhZChzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCisJICAgICB2b2lkICpidWYsIHUzMiBsZW4pCit7CisJc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciA9IGRldi0+bWFzdGVyOworCisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtYXN0ZXItPnJlYWQobWFzdGVyLCBkZXZfbnVtLCByZWdfYWRkciwgYnVmLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChzd3JfcmVhZCk7CisKKy8qKgorICogc3dyX2J1bGtfd3JpdGUgLSB3cml0ZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlIHJlZ2lzdGVycworICogQGRldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAZGV2X251bTogbG9naWNhbCBkZXZpY2UgbnVtIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEByZWdfYWRkcjogcmVnaXN0ZXIgYWRkcmVzcyBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAYnVmOiBjb250YWlucyB2YWx1ZSBvZiByZWdpc3RlciBhZGRyZXNzCisgKiBAbGVuOiBpbmRpY2F0ZXMgbnVtYmVyIG9mIHJlZ2lzdGVycworICoKKyAqIFRoaXMgQVBJIHdpbGwgd3JpdGUgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBhZGRyZXNzIHRvCisgKiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKi8KK2ludCBzd3JfYnVsa193cml0ZShzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLCB2b2lkICpyZWcsCisJCSAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyOworCisJaWYgKCFkZXYgfHwgIWRldi0+bWFzdGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc3RlciA9IGRldi0+bWFzdGVyOworCWlmIChkZXYtPmdyb3VwX2lkKSB7CisJCWlmIChtYXN0ZXItPmdyX3NpZCAhPSBkZXZfbnVtKSB7CisJCQlpZiAoIW1hc3Rlci0+Z3Jfc2lkKQorCQkJCW1hc3Rlci0+Z3Jfc2lkID0gZGV2X251bTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlkZXZfbnVtID0gZGV2LT5ncm91cF9pZDsKKwl9CisJaWYgKG1hc3Rlci0+YnVsa193cml0ZSkKKwkJcmV0dXJuIG1hc3Rlci0+YnVsa193cml0ZShtYXN0ZXIsIGRldl9udW0sIHJlZywgYnVmLCBsZW4pOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorRVhQT1JUX1NZTUJPTChzd3JfYnVsa193cml0ZSk7CisKKy8qKgorICogc3dyX3dyaXRlIC0gd3JpdGUgc291bmR3aXJlIHNsYXZlIGRldmljZSByZWdpc3RlcnMKKyAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQorICogQGRldl9udW06IGxvZ2ljYWwgZGV2aWNlIG51bSBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAcmVnX2FkZHI6IHJlZ2lzdGVyIGFkZHJlc3Mgb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQorICogQGJ1ZjogY29udGFpbnMgdmFsdWUgb2YgcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIFRoaXMgQVBJIHdpbGwgd3JpdGUgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBhZGRyZXNzIHRvCisgKiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKi8KK2ludCBzd3Jfd3JpdGUoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAorCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyID0gZGV2LT5tYXN0ZXI7CisKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2LT5ncm91cF9pZCkgeworCQlpZiAobWFzdGVyLT5ncl9zaWQgIT0gZGV2X251bSkgeworCQkJaWYgKCFtYXN0ZXItPmdyX3NpZCkKKwkJCQltYXN0ZXItPmdyX3NpZCA9IGRldl9udW07CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZGV2X251bSA9IGRldi0+Z3JvdXBfaWQ7CisJfQorCXJldHVybiBtYXN0ZXItPndyaXRlKG1hc3RlciwgZGV2X251bSwgcmVnX2FkZHIsIGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl93cml0ZSk7CisKKy8qKgorICogc3dyX2RldmljZV91cCAtIEZ1bmN0aW9uIHRvIGJyaW5ndXAgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBzd3JfZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFRoaXMgQVBJIHdpbGwgYmUgY2FsbGVkIGJ5IHNvdW5kd2lyZSBtYXN0ZXIgdG8gYnJpbmd1cCB0aGUgc2xhdmUKKyAqIGRldmljZS4KKyAqLworaW50IHN3cl9kZXZpY2VfdXAoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBzd3JfZHJpdmVyICpzZHJ2OworCisJaWYgKCFzd3JfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9ICZzd3JfZGV2LT5kZXY7CisJc2RydiA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghc2RydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2Rydi0+ZGV2aWNlX3VwKQorCQlyZXR1cm4gc2Rydi0+ZGV2aWNlX3VwKHRvX3N3cl9kZXZpY2UoZGV2KSk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0woc3dyX2RldmljZV91cCk7CisKKy8qKgorICogc3dyX2RldmljZV9kb3duIC0gRnVuY3Rpb24gdG8gY2FsbCBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlIGRvd24KKyAqIEBzd3JfZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFRoaXMgQVBJIHdpbGwgYmUgY2FsbGVkIGJ5IHNvdW5kd2lyZSBtYXN0ZXIgdG8gcHV0IHNsYXZlIGRldmljZSBpbgorICogc2h1dGRvd24gc3RhdGUuCisgKi8KK2ludCBzd3JfZGV2aWNlX2Rvd24oc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBzd3JfZHJpdmVyICpzZHJ2OworCisJaWYgKCFzd3JfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9ICZzd3JfZGV2LT5kZXY7CisJc2RydiA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghc2RydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2Rydi0+ZGV2aWNlX2Rvd24pCisJCXJldHVybiBzZHJ2LT5kZXZpY2VfZG93bih0b19zd3JfZGV2aWNlKGRldikpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MKHN3cl9kZXZpY2VfZG93bik7CisKKy8qKgorICogc3dyX3Jlc2V0X2RldmljZSAtIHJlc2V0IHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBzd3JfZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFRoaXMgQVBJIHdpbGwgYmUgY2FsbGVkIGJ5IHNvdW5kd2lyZSBtYXN0ZXIgdG8gcmVzZXQgdGhlIHNsYXZlCisgKiBkZXZpY2Ugd2hlbiB0aGUgc2xhdmUgZGV2aWNlIGlzIG5vdCByZXNwb25kaW5nIG9yIGluIHVuZGVmaW5lZAorICogc3RhdGUKKyAqLworaW50IHN3cl9yZXNldF9kZXZpY2Uoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBzd3JfZHJpdmVyICpzZHJ2OworCisJaWYgKCFzd3JfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9ICZzd3JfZGV2LT5kZXY7CisJc2RydiA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghc2RydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2Rydi0+cmVzZXRfZGV2aWNlKQorCQlyZXR1cm4gc2Rydi0+cmVzZXRfZGV2aWNlKHRvX3N3cl9kZXZpY2UoZGV2KSk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0woc3dyX3Jlc2V0X2RldmljZSk7CisKKy8qKgorICogc3dyX3NldF9kZXZpY2VfZ3JvdXAgLSBBc3NpZ24gZ3JvdXAgaWQgdG8gdGhlIHNsYXZlIGRldmljZXMKKyAqIEBzd3JfZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBpZDogZ3JvdXAgaWQgdG8gYmUgYXNzaWduZWQgdG8gc2xhdmUgZGV2aWNlCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSBzb3VuZHdpcmUgbWFzdGVyIG9yIHNsYXZlCisgKiBkZXZpY2UgdG8gYXNzaWduIGdyb3VwIGlkLgorICovCitpbnQgc3dyX3NldF9kZXZpY2VfZ3JvdXAoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYsIHU4IGlkKQoreworCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXI7CisKKwlpZiAoIXN3cl9kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dyX2Rldi0+Z3JvdXBfaWQgPSBpZDsKKwltYXN0ZXIgPSBzd3JfZGV2LT5tYXN0ZXI7CisJaWYgKCFpZCAmJiBtYXN0ZXIpCisJCW1hc3Rlci0+Z3Jfc2lkID0gMDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzd3Jfc2V0X2RldmljZV9ncm91cCk7CisKK3N0YXRpYyBpbnQgc3dyX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHN3cl9kcml2ZXIgKnNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmICghc2RydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2Rydi0+cHJvYmUpCisJCXJldHVybiBzZHJ2LT5wcm9iZSh0b19zd3JfZGV2aWNlKGRldikpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHN3cl9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3dyX2RyaXZlciAqc2RydiA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKCFzZHJ2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzZHJ2LT5yZW1vdmUpCisJCXJldHVybiBzZHJ2LT5yZW1vdmUodG9fc3dyX2RldmljZShkZXYpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgc3dyX2Rydl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IHN3cl9kcml2ZXIgKnNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmICghc2RydikKKwkJcmV0dXJuOworCisJaWYgKHNkcnYtPnNodXRkb3duKQorCQlzZHJ2LT5zaHV0ZG93bih0b19zd3JfZGV2aWNlKGRldikpOworfQorCisvKioKKyAqIHN3cl9kcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlciBhIHNvdW5kd2lyZSBkcml2ZXIKKyAqIEBkcnY6IHRoZSBkcml2ZXIgdG8gcmVnaXN0ZXIKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICovCitpbnQgc3dyX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJ2KQoreworCWRydi0+ZHJpdmVyLmJ1cyA9ICZzb3VuZHdpcmVfdHlwZTsKKwlpZiAoZHJ2LT5wcm9iZSkKKwkJZHJ2LT5kcml2ZXIucHJvYmUgPSBzd3JfZHJ2X3Byb2JlOworCWlmIChkcnYtPnJlbW92ZSkKKwkJZHJ2LT5kcml2ZXIucmVtb3ZlID0gc3dyX2Rydl9yZW1vdmU7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSBzd3JfZHJ2X3NodXRkb3duOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChzd3JfZHJpdmVyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBzd3JfZHJpdmVyX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGEgc291bmR3aXJlIGRyaXZlcgorICogQGRydjogdGhlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKi8KK3ZvaWQgc3dyX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBzd3JfZHJpdmVyICpkcnYpCit7CisJaWYgKGRydikKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0woc3dyX2RyaXZlcl91bnJlZ2lzdGVyKTsKKworc3RhdGljIHZvaWQgc3dyX21hdGNoX2N0cmxfdG9fYm9hcmRpbmZvKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCisJCQkJc3RydWN0IHN3cl9ib2FyZGluZm8gKmJpKQoreworCXN0cnVjdCBzd3JfZGV2aWNlICpzd3I7CisKKwlpZiAobWFzdGVyLT5idXNfbnVtICE9IGJpLT5idXNfbnVtKSB7CisJCWRldl9kYmcoJm1hc3Rlci0+ZGV2LAorCQkJIiVzOiBtYXN0ZXIjICVkIGFuZCBiaSMgJWQgZG9lcyBub3QgbWF0Y2hcbiIsCisJCQlfX2Z1bmNfXywgbWFzdGVyLT5idXNfbnVtLCBiaS0+YnVzX251bSk7CisJCXJldHVybjsKKwl9CisKKwlzd3IgPSBzd3JfbmV3X2RldmljZShtYXN0ZXIsIGJpKTsKKwlpZiAoIXN3cikKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJjYW4ndCBjcmVhdGUgbmV3IGRldmljZSBmb3IgJXNcbiIsCisJCQliaS0+c3dyX3NsYXZlLT5uYW1lKTsKK30KKworLyoqCisgKiBzd3JfbWFzdGVyX2FkZF9ib2FyZGRldmljZXMgLSBBZGQgZGV2aWNlcyByZWdpc3RlcmVkIGJ5IGJvYXJkIGluZm8KKyAqIEBtYXN0ZXI6IG1hc3RlciB0byB3aGljaCB0aGVzZSBkZXZpY2VzIGFyZSB0byBiZSBhZGRlZCB0by4KKyAqCisgKiBUaGlzIEFQSSBpcyBjYWxsZWQgYnkgbWFzdGVyIHdoZW4gaXQgaXMgdXAgYW5kIHJ1bm5pbmcuIElmIGRldmljZXMKKyAqIG9uIGEgbWFzdGVyIHdlcmUgcmVnaXN0ZXJlZCBiZWZvcmUgbWFzdGVyLCB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQKKyAqIHRoZXkgZ2V0IHByb2JlZCB3aGVuIG1hc3RlciBpcyB1cC4KKyAqLwordm9pZCBzd3JfbWFzdGVyX2FkZF9ib2FyZGRldmljZXMoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgYm9hcmRpbmZvICpiaTsKKworCW11dGV4X2xvY2soJmJvYXJkX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJm1hc3Rlci0+bGlzdCwgJnN3cl9tYXN0ZXJfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiaSwgJmJvYXJkX2xpc3QsIGxpc3QpCisJCXN3cl9tYXRjaF9jdHJsX3RvX2JvYXJkaW5mbyhtYXN0ZXIsICZiaS0+Ym9hcmRfaW5mbyk7CisJbXV0ZXhfdW5sb2NrKCZib2FyZF9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woc3dyX21hc3Rlcl9hZGRfYm9hcmRkZXZpY2VzKTsKKworc3RhdGljIHZvaWQgc3dyX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpCit7CisJaWYgKHN3cikKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnN3ci0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgc3dyX21hc3Rlcl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyID0gdG9fc3dyX21hc3RlcihkZXYpOworCisJa2ZyZWUobWFzdGVyKTsKK30KKworI2RlZmluZSBzd3JfbWFzdGVyX2F0dHJfZ3IgTlVMTAorc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBzd3JfbWFzdGVyX3R5cGUgPSB7CisJLmdyb3VwcyAgICAgPSBzd3JfbWFzdGVyX2F0dHJfZ3IsCisJLnJlbGVhc2UgICAgPSBzd3JfbWFzdGVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9fdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKm51bGwpCit7CisJc3dyX3VucmVnaXN0ZXJfZGV2aWNlKHRvX3N3cl9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3dyX3VucmVnaXN0ZXJfbWFzdGVyIC0gdW5yZWdpc3RlciBzb3VuZHdpcmUgbWFzdGVyIGNvbnRyb2xsZXIKKyAqIEBtYXN0ZXI6IHRoZSBtYXN0ZXIgYmVpbmcgdW5yZWdpc3RlcmVkCisgKgorICogVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IG1hc3RlciBjb250cm9sbGVyIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKiAgbWFzdGVyIGNvbnRyb2xsZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBieSBzd3JfcmVnaXN0ZXJfbWFzdGVyIEFQSS4KKyAqLwordm9pZCBzd3JfdW5yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwlpbnQgZHVtbXk7CisJc3RydWN0IHN3cl9tYXN0ZXIgKm1fY3RybDsKKworCW11dGV4X2xvY2soJnN3cl9sb2NrKTsKKwltX2N0cmwgPSBpZHJfZmluZCgmbWFzdGVyX2lkciwgbWFzdGVyLT5idXNfbnVtKTsKKwltdXRleF91bmxvY2soJnN3cl9sb2NrKTsKKwlpZiAobV9jdHJsICE9IG1hc3RlcikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYm9hcmRfbG9jayk7CisJbGlzdF9kZWwoJm1hc3Rlci0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZib2FyZF9sb2NrKTsKKworCS8qIGZyZWUgYnVzIGlkICovCisJbXV0ZXhfbG9jaygmc3dyX2xvY2spOworCWlkcl9yZW1vdmUoJm1hc3Rlcl9pZHIsIG1hc3Rlci0+YnVzX251bSk7CisJbXV0ZXhfdW5sb2NrKCZzd3JfbG9jayk7CisKKwlkdW1teSA9IGRldmljZV9mb3JfZWFjaF9jaGlsZCgmbWFzdGVyLT5kZXYsIE5VTEwsIF9fdW5yZWdpc3Rlcik7CisJZGV2aWNlX3VucmVnaXN0ZXIoJm1hc3Rlci0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woc3dyX3VucmVnaXN0ZXJfbWFzdGVyKTsKKworLyoqCisgKiBzd3JfcmVnaXN0ZXJfbWFzdGVyIC0gcmVnaXN0ZXIgc291bmR3aXJlIG1hc3RlciBjb250cm9sbGVyCisgKiBAbWFzdGVyOiBtYXN0ZXIgdG8gYmUgcmVnaXN0ZXJlZAorICoKKyAqIFRoaXMgQVBJIHdpbGwgcmVnaXN0ZXIgbWFzdGVyIHdpdGggdGhlIGZyYW1ld29yay4gbWFzdGVyLT5idXNfbnVtCisgKiBpcyB0aGUgZGVzaXJlZCBudW1iZXIgd2l0aCB3aGljaCBzb3VuZHdpcmUgZnJhbWV3b3JrIHJlZ2lzdGVycyB0aGUKKyAqIG1hc3Rlci4KKyAqLworaW50IHN3cl9yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwlpbnQgaWQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwltdXRleF9sb2NrKCZzd3JfbG9jayk7CisJaWQgPSBpZHJfYWxsb2MoJm1hc3Rlcl9pZHIsIG1hc3RlciwgbWFzdGVyLT5idXNfbnVtLAorCQkJbWFzdGVyLT5idXNfbnVtKzEsIEdGUF9LRVJORUwpOworCW11dGV4X3VubG9jaygmc3dyX2xvY2spOworCWlmIChpZCA8IDApCisJCXJldHVybiBpZDsKKwltYXN0ZXItPmJ1c19udW0gPSBpZDsKKworCS8qIENhbid0IHJlZ2lzdGVyIHVudGlsIGRyaXZlciBtb2RlbCBpbml0ICovCisJaWYgKFdBUk5fT04oIXNvdW5kd2lyZV90eXBlLnApKSB7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkZXZfc2V0X25hbWUoJm1hc3Rlci0+ZGV2LCAic3dyJXUiLCBtYXN0ZXItPmJ1c19udW0pOworCW1hc3Rlci0+ZGV2LmJ1cyA9ICZzb3VuZHdpcmVfdHlwZTsKKwltYXN0ZXItPmRldi50eXBlID0gJnN3cl9tYXN0ZXJfdHlwZTsKKwltdXRleF9pbml0KCZtYXN0ZXItPm1sb2NrKTsKKwlzdGF0dXMgPSBkZXZpY2VfcmVnaXN0ZXIoJm1hc3Rlci0+ZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBkb25lOworCisJSU5JVF9MSVNUX0hFQUQoJm1hc3Rlci0+ZGV2aWNlcyk7CisJcHJfZGVidWcoIiVzOiBTV1IgbWFzdGVyIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5ICVzXG4iLAorCQlfX2Z1bmNfXywgZGV2X25hbWUoJm1hc3Rlci0+ZGV2KSk7CisJcmV0dXJuIDA7CisKK2RvbmU6CisJaWRyX3JlbW92ZSgmbWFzdGVyX2lkciwgbWFzdGVyLT5idXNfbnVtKTsKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTChzd3JfcmVnaXN0ZXJfbWFzdGVyKTsKKworI2RlZmluZSBzd3JfZGV2aWNlX2F0dHJfZ3IgTlVMTAorI2RlZmluZSBzd3JfZGV2aWNlX3VldmVudCBOVUxMCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIHN3cl9kZXZfdHlwZSA9IHsKKwkuZ3JvdXBzICAgID0gc3dyX2RldmljZV9hdHRyX2dyLAorCS51ZXZlbnQgICAgPSBzd3JfZGV2aWNlX3VldmVudCwKKwkucmVsZWFzZSAgID0gc3dyX2Rldl9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzd3JfZGV2aWNlX2lkICpzd3JfbWF0Y2goY29uc3Qgc3RydWN0IHN3cl9kZXZpY2VfaWQgKmlkLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KQoreworCXdoaWxlIChpZC0+bmFtZVswXSkgeworCQlpZiAoc3RyY21wKHN3cl9kZXYtPm5hbWUsIGlkLT5uYW1lKSA9PSAwKQorCQkJcmV0dXJuIGlkOworCQlpZCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzd3JfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldjsKKwlzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJ2ID0gdG9fc3dyX2RyaXZlcihkcml2ZXIpOworCisJaWYgKCFkcnYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRldi0+dHlwZSA9PSAmc3dyX2Rldl90eXBlKQorCQlzd3JfZGV2ID0gdG9fc3dyX2RldmljZShkZXYpOworCWVsc2UKKwkJcmV0dXJuIDA7CisJaWYgKGRydi0+aWRfdGFibGUpCisJCXJldHVybiBzd3JfbWF0Y2goZHJ2LT5pZF90YWJsZSwgc3dyX2RldikgIT0gTlVMTDsKKworCWlmIChkcml2ZXItPm5hbWUpCisJCXJldHVybiBzdHJjbXAoc3dyX2Rldi0+bmFtZSwgZHJpdmVyLT5uYW1lKSA9PSAwOworCXJldHVybiAwOworfQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBzd3JfbGVnYWN5X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldiA9IE5VTEw7CisJc3RydWN0IHN3cl9kcml2ZXIgKmRyaXZlcjsKKworCWlmIChkZXYtPnR5cGUgPT0gJnN3cl9kZXZfdHlwZSkKKwkJc3dyX2RldiA9IHRvX3N3cl9kZXZpY2UoZGV2KTsKKworCWlmICghc3dyX2RldiB8fCAhZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJZHJpdmVyID0gdG9fc3dyX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaWYgKCFkcml2ZXItPnN1c3BlbmQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRyaXZlci0+c3VzcGVuZChzd3JfZGV2LCBtZXNnKTsKK30KKworc3RhdGljIGludCBzd3JfbGVnYWN5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYgPSBOVUxMOworCXN0cnVjdCBzd3JfZHJpdmVyICpkcml2ZXI7CisKKwlpZiAoZGV2LT50eXBlID09ICZzd3JfZGV2X3R5cGUpCisJCXN3cl9kZXYgPSB0b19zd3JfZGV2aWNlKGRldik7CisKKwlpZiAoIXN3cl9kZXYgfHwgIWRldi0+ZHJpdmVyKQorCQlyZXR1cm4gMDsKKworCWRyaXZlciA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghZHJpdmVyLT5yZXN1bWUpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRyaXZlci0+cmVzdW1lKHN3cl9kZXYpOworfQorCitzdGF0aWMgaW50IHN3cl9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3N1c3BlbmQoZGV2KTsKKwllbHNlCisJCXJldHVybiBzd3JfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX1NVU1BFTkQpOworfQorCitzdGF0aWMgaW50IHN3cl9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfcmVzdW1lKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3dyX2xlZ2FjeV9yZXN1bWUoZGV2KTsKK30KKyNlbHNlCisjZGVmaW5lIHN3cl9wbV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3dyX3BtX3Jlc3VtZQlOVUxMCisjZW5kaWYgLypDT05GSUdfUE1fU0xFRVAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc291bmR3aXJlX3BtID0geworCS5zdXNwZW5kID0gc3dyX3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IHN3cl9wbV9yZXN1bWUsCisJU0VUX1JVTlRJTUVfUE1fT1BTKAorCQlwbV9nZW5lcmljX3N1c3BlbmQsCisJCXBtX2dlbmVyaWNfcmVzdW1lLAorCQlOVUxMCisJCSkKK307CisKK3N0cnVjdCBkZXZpY2Ugc291bmR3aXJlX2RldiA9IHsKKwkuaW5pdF9uYW1lID0gInNvdW5kd2lyZSIsCit9OworCitzdHJ1Y3QgYnVzX3R5cGUgc291bmR3aXJlX3R5cGUgPSB7CisJLm5hbWUJCT0gInNvdW5kd2lyZSIsCisJLm1hdGNoCQk9IHN3cl9kZXZpY2VfbWF0Y2gsCisJLnBtCQk9ICZzb3VuZHdpcmVfcG0sCit9OworRVhQT1JUX1NZTUJPTChzb3VuZHdpcmVfdHlwZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzb3VuZHdpcmVfZXhpdCh2b2lkKQoreworCWRldmljZV91bnJlZ2lzdGVyKCZzb3VuZHdpcmVfZGV2KTsKKwlidXNfdW5yZWdpc3Rlcigmc291bmR3aXJlX3R5cGUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzb3VuZHdpcmVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBidXNfcmVnaXN0ZXIoJnNvdW5kd2lyZV90eXBlKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZzb3VuZHdpcmVfZGV2KTsKKworCWlmIChyZXR2YWwpCisJCWJ1c191bnJlZ2lzdGVyKCZzb3VuZHdpcmVfdHlwZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorcG9zdGNvcmVfaW5pdGNhbGwoc291bmR3aXJlX2luaXQpOworbW9kdWxlX2V4aXQoc291bmR3aXJlX2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU291bmR3aXJlIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzb3VuZHdpcmUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5jIGIvZHJpdmVycy9zb3VuZHdpcmUvc3dyLXdjZC1jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5ODRmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5jCkBAIC0wLDAgKzEsMTg1MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc291bmR3aXJlLmg+CisjaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3N3ci13Y2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgInN3cm1fcmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAic3dyLXdjZC1jdHJsLmgiCisKKyNkZWZpbmUgU1dSX0JST0FEQ0FTVF9DTURfSUQgICAgICAgICAgICAweDBGCisjZGVmaW5lIFNXUl9BVVRPX1NVU1BFTkRfREVMQVkgICAgICAgICAgMyAvKiBkZWxheSBpbiBzZWMgKi8KKyNkZWZpbmUgU1dSX0RFVl9JRF9NQVNLCQkJMHhGRkZGRkZGRgorI2RlZmluZSBTV1JfUkVHX1ZBTF9QQUNLKGRhdGEsIGRldiwgaWQsIHJlZykJXAorCQkJKChyZWcpIHwgKChpZCkgPDwgMTYpIHwgKChkZXYpIDw8IDIwKSB8ICgoZGF0YSkgPDwgMjQpKQorCisvKiBwbSBydW50aW1lIGF1dG8gc3VzcGVuZCB0aW1lciBpbiBtc2VjcyAqLworc3RhdGljIGludCBhdXRvX3N1c3BlbmRfdGltZXIgPSBTV1JfQVVUT19TVVNQRU5EX0RFTEFZICogMTAwMDsKK21vZHVsZV9wYXJhbShhdXRvX3N1c3BlbmRfdGltZXIsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9fc3VzcGVuZF90aW1lciwgInRpbWVyIGZvciBhdXRvIHN1c3BlbmQiKTsKKworc3RhdGljIHU4IG1zdHJfcG9ydHNbXSA9IHsxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwN307CitzdGF0aWMgdTggbXN0cl9wb3J0X3R5cGVbXSA9IHtTV1JfREFDX1BPUlQsIFNXUl9DT01QX1BPUlQsIFNXUl9CT09TVF9QT1JULAorCQkJICAgICAgU1dSX0RBQ19QT1JULCBTV1JfQ09NUF9QT1JULCBTV1JfQk9PU1RfUE9SVCwKKwkJCSAgICAgIFNXUl9WSVNFTlNFX1BPUlQsIFNXUl9WSVNFTlNFX1BPUlR9OworCitzdHJ1Y3QgdXNlY2FzZSB1Y1tdID0geworCXswLCAwLCAwfSwJCS8qIFVDMDogbm8gcG9ydHMgKi8KKwl7MSwgMSwgMjQwMH0sCQkvKiBVQzE6IFNwa3IgKi8KKwl7MSwgNCwgNjAwfSwJCS8qIFVDMjogQ29tcGFuZGVyICovCisJezEsIDIsIDMwMH0sCQkvKiBVQzM6IFNtYXJ0IEJvb3N0ICovCisJezEsIDIsIDEyMDB9LAkJLyogVUM0OiBWSSBTZW5zZSAqLworCXs0LCA5LCA0NTAwfSwJCS8qIFVDNTogU3BrciArIENvbXAgKyBTQiArIFZJICovCisJezgsIDE4LCA5MDAwfSwJCS8qIFVDNjogMiooU3BrciArIENvbXAgKyBTQiArIFZJKSAqLworCXsyLCAyLCA0ODAwfSwJCS8qIFVDNzogMipTcGtyICovCisJezIsIDUsIDMwMDB9LAkJLyogVUM4OiBTcGtyICsgQ29tcCAqLworCXs0LCAxMCwgNjAwMH0sCQkvKiBVQzk6IDIqKFNwa3IgKyBDb21wKSAqLworCXszLCA3LCAzMzAwfSwJCS8qIFVDMTA6IFNwa3IgKyBDb21wICsgU0IgKi8KKwl7NiwgMTQsIDY2MDB9LAkJLyogVUMxMTogMiooU3BrciArIENvbXAgKyBTQikgKi8KKwl7MiwgMywgMjcwMH0sCQkvKiBVQzEyOiBTcGtyICsgU0IgKi8KKwl7NCwgNiwgNTQwMH0sCQkvKiBVQzEzOiAyKihTcGtyICsgU0IpICovCisJezMsIDUsIDM5MDB9LAkJLyogVUMxNDogU3BrciArIFNCICsgVkkgKi8KKwl7NiwgMTAsIDc4MDB9LAkJLyogVUMxNTogMiooU3BrciArIFNCICsgVkkpICovCisJezIsIDMsIDM2MDB9LAkJLyogVUMxNjogU3BrciArIFZJICovCisJezQsIDYsIDcyMDB9LAkJLyogVUMxNzogMiooU3BrciArIFZJKSAqLworfTsKKyNkZWZpbmUgTUFYX1VTRUNBU0UJQVJSQVlfU0laRSh1YykKKworc3RydWN0IHBvcnRfcGFyYW1zIHBwW01BWF9VU0VDQVNFXVtTV1JfTVNUUl9QT1JUX0xFTl0gPSB7CisJLyogVUMgMCAqLworCXsKKwkJezAsIDAsIDB9LAorCX0sCisJLyogVUMgMSAqLworCXsKKwkJezcsIDEsIDB9LAorCX0sCisJLyogVUMgMiAqLworCXsKKwkJezMxLCAyLCAwfSwKKwl9LAorCS8qIFVDIDMgKi8KKwl7CisJCXs2MywgMTIsIDMxfSwKKwl9LAorCS8qIFVDIDQgKi8KKwl7CisJCXsxNSwgNywgMH0sCisJfSwKKwkvKiBVQyA1ICovCisJeworCQl7NywgMSwgMH0sCisJCXszMSwgMiwgMH0sCisJCXs2MywgMTIsIDMxfSwKKwkJezE1LCA3LCAwfSwKKwl9LAorCS8qIFVDIDYgKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezMxLCAyLCAwfSwKKwkJezYzLCAxMiwgMzF9LAorCQl7MTUsIDcsIDB9LAorCQl7NywgNiwgMH0sCisJCXszMSwgMTgsIDB9LAorCQl7NjMsIDEzLCAzMX0sCisJCXsxNSwgMTAsIDB9LAorCX0sCisJLyogVUMgNyAqLworCXsKKwkJezcsIDEsIDB9LAorCQl7NywgNiwgMH0sCisKKwl9LAorCS8qIFVDIDggKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezMxLCAyLCAwfSwKKwl9LAorCS8qIFVDIDkgKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezMxLCAyLCAwfSwKKwkJezcsIDYsIDB9LAorCQl7MzEsIDE4LCAwfSwKKwl9LAorCS8qIFVDIDEwICovCisJeworCQl7NywgMSwgMH0sCisJCXszMSwgMiwgMH0sCisJCXs2MywgMTIsIDMxfSwKKwl9LAorCS8qIFVDIDExICovCisJeworCQl7NywgMSwgMH0sCisJCXszMSwgMiwgMH0sCisJCXs2MywgMTIsIDMxfSwKKwkJezcsIDYsIDB9LAorCQl7MzEsIDE4LCAwfSwKKwkJezYzLCAxMywgMzF9LAorCX0sCisJLyogVUMgMTIgKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezYzLCAxMiwgMzF9LAorCX0sCisJLyogVUMgMTMgKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezYzLCAxMiwgMzF9LAorCQl7NywgNiwgMH0sCisJCXs2MywgMTMsIDMxfSwKKwl9LAorCS8qIFVDIDE0ICovCisJeworCQl7NywgMSwgMH0sCisJCXs2MywgMTIsIDMxfSwKKwkJezE1LCA3LCAwfSwKKwl9LAorCS8qIFVDIDE1ICovCisJeworCQl7NywgMSwgMH0sCisJCXs2MywgMTIsIDMxfSwKKwkJezE1LCA3LCAwfSwKKwkJezcsIDYsIDB9LAorCQl7NjMsIDEzLCAzMX0sCisJCXsxNSwgMTAsIDB9LAorCX0sCisJLyogVUMgMTYgKi8KKwl7CisJCXs3LCAxLCAwfSwKKwkJezE1LCA3LCAwfSwKKwl9LAorCS8qIFVDIDE3ICovCisJeworCQl7NywgMSwgMH0sCisJCXsxNSwgNywgMH0sCisJCXs3LCA2LCAwfSwKKwkJezE1LCAxMCwgMH0sCisJfSwKK307CisKK2VudW0geworCVNXUl9OT1RfUFJFU0VOVCwgLyogRGV2aWNlIGlzIGRldGFjaGVkL25vdCBwcmVzZW50IG9uIHRoZSBidXMgKi8KKwlTV1JfQVRUQUNIRURfT0ssIC8qIERldmljZSBpcyBhdHRhY2hlZCAqLworCVNXUl9BTEVSVCwgICAgICAgLyogRGV2aWNlIGFsdGVycyBtYXN0ZXIgZm9yIGFueSBpbnRlcnJ1cHRzICovCisJU1dSX1JFU0VSVkVELCAgICAvKiBSZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBTV1JNX01BWF9QT1JUX1JFRyAgICA0MAorI2RlZmluZSBTV1JNX01BWF9JTklUX1JFRyAgICA4CisKKyNkZWZpbmUgU1dSX01TVFJfTUFYX1JFR19BRERSCTB4MTc0MAorI2RlZmluZSBTV1JfTVNUUl9TVEFSVF9SRUdfQUREUgkweDAwCisjZGVmaW5lIFNXUl9NU1RSX01BWF9CVUZfTEVOICAgICAzMgorI2RlZmluZSBCWVRFU19QRVJfTElORSAgICAgICAgICAxMgorI2RlZmluZSBTV1JfTVNUUl9SRF9CVUZfTEVOICAgICAgOAorI2RlZmluZSBTV1JfTVNUUl9XUl9CVUZfTEVOICAgICAgMzIKKworc3RhdGljIHZvaWQgc3dybV9jb3B5X2RhdGFfcG9ydF9jb25maWcoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgICAgICAgdTggaW5hY3RpdmVfYmFuayk7CitzdGF0aWMgc3RydWN0IHN3cl9tc3RyX2N0cmwgKmRiZ3N3cm07CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19zd3JtX2RlbnQ7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19wZWVrOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG9rZTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3JlZ19kdW1wOworc3RhdGljIHVuc2lnbmVkIGludCByZWFkX2RhdGE7CisKK3N0YXRpYyBpbnQgc3dybV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhcmFtZXRlcnMoY2hhciAqYnVmLCB1MzIgKnBhcmFtMSwgaW50IG51bV9vZl9wYXIpCit7CisJY2hhciAqdG9rZW47CisJaW50IGJhc2UsIGNudDsKKworCXRva2VuID0gc3Ryc2VwKCZidWYsICIgIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBudW1fb2ZfcGFyOyBjbnQrKykgeworCQlpZiAodG9rZW4pIHsKKwkJCWlmICgodG9rZW5bMV0gPT0gJ3gnKSB8fCAodG9rZW5bMV0gPT0gJ1gnKSkKKwkJCQliYXNlID0gMTY7CisJCQllbHNlCisJCQkJYmFzZSA9IDEwOworCisJCQlpZiAoa3N0cnRvdTMyKHRva2VuLCBiYXNlLCAmcGFyYW0xW2NudF0pICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRva2VuID0gc3Ryc2VwKCZidWYsICIgIik7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzd3JtX3JlZ19zaG93KGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQsCisJCQkJCSAgbG9mZl90ICpwcG9zKQoreworCWludCBpLCByZWdfdmFsLCBsZW47CisJc3NpemVfdCB0b3RhbCA9IDA7CisJY2hhciB0bXBfYnVmW1NXUl9NU1RSX01BWF9CVUZfTEVOXTsKKworCWlmICghdWJ1ZiB8fCAhcHBvcykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAoKChpbnQpICpwcG9zIC8gQllURVNfUEVSX0xJTkUpICsgU1dSX01TVFJfU1RBUlRfUkVHX0FERFIpOworCQlpIDw9IFNXUl9NU1RSX01BWF9SRUdfQUREUjsgaSArPSA0KSB7CisJCXJlZ192YWwgPSBkYmdzd3JtLT5yZWFkKGRiZ3N3cm0tPmhhbmRsZSwgaSk7CisJCWxlbiA9IHNucHJpbnRmKHRtcF9idWYsIDI1LCAiMHglLjN4OiAweCUuMnhcbiIsIGksIHJlZ192YWwpOworCQlpZiAoKHRvdGFsICsgbGVuKSA+PSBjb3VudCAtIDEpCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodWJ1ZiArIHRvdGFsKSwgdG1wX2J1ZiwgbGVuKSkgeworCQkJcHJfZXJyKCIlczogZmFpbCB0byBjb3B5IHJlZyBkdW1wXG4iLCBfX2Z1bmNfXyk7CisJCQl0b3RhbCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNvcHlfZXJyOworCQl9CisJCSpwcG9zICs9IGxlbjsKKwkJdG90YWwgKz0gbGVuOworCX0KKworY29weV9lcnI6CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgc3NpemVfdCBzd3JtX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgbGJ1ZltTV1JfTVNUUl9SRF9CVUZfTEVOXTsKKwljaGFyICphY2Nlc3Nfc3RyOworCXNzaXplX3QgcmV0X2NudDsKKworCWlmICghY291bnQgfHwgIWZpbGUgfHwgIXBwb3MgfHwgIXVidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNjZXNzX3N0ciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKnBwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzd3JtX3BlZWsiKSkgeworCQlzbnByaW50ZihsYnVmLCBzaXplb2YobGJ1ZiksICIweCV4XG4iLCByZWFkX2RhdGEpOworCQlyZXRfY250ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBwb3MsIGxidWYsCisJCQkJCSAgICAgICBzdHJubGVuKGxidWYsIDcpKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInN3cm1fcmVnX2R1bXAiKSkgeworCQlyZXRfY250ID0gc3dybV9yZWdfc2hvdyh1YnVmLCBjb3VudCwgcHBvcyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogJXMgbm90IHBlcm1pdHRlZCB0byByZWFkXG4iLCBfX2Z1bmNfXywgYWNjZXNzX3N0cik7CisJCXJldF9jbnQgPSAtRVBFUk07CisJfQorCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgc3NpemVfdCBzd3JtX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAorCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBsYnVmW1NXUl9NU1RSX1dSX0JVRl9MRU5dOworCWludCByYzsKKwl1MzIgcGFyYW1bNV07CisJY2hhciAqYWNjZXNzX3N0cjsKKworCWlmICghZmlscCB8fCAhcHBvcyB8fCAhdWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY2Nlc3Nfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmIChjbnQgPiBzaXplb2YobGJ1ZikgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKKwlpZiAocmMpCisJCXJldHVybiAtRUZBVUxUOworCisJbGJ1ZltjbnRdID0gJ1wwJzsKKwlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dybV9wb2tlIikpIHsKKwkJLyogd3JpdGUgKi8KKwkJcmMgPSBnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMik7CisJCWlmICgocGFyYW1bMF0gPD0gU1dSX01TVFJfTUFYX1JFR19BRERSKSAmJgorCQkJKHBhcmFtWzFdIDw9IDB4RkZGRkZGRkYpICYmCisJCQkocmMgPT0gMCkpCisJCQlyYyA9IGRiZ3N3cm0tPndyaXRlKGRiZ3N3cm0tPmhhbmRsZSwgcGFyYW1bMF0sCisJCQkJCSAgICBwYXJhbVsxXSk7CisJCWVsc2UKKwkJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInN3cm1fcGVlayIpKSB7CisJCS8qIHJlYWQgKi8KKwkJcmMgPSBnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMSk7CisJCWlmICgocGFyYW1bMF0gPD0gU1dSX01TVFJfTUFYX1JFR19BRERSKSAmJiAocmMgPT0gMCkpCisJCQlyZWFkX2RhdGEgPSBkYmdzd3JtLT5yZWFkKGRiZ3N3cm0tPmhhbmRsZSwgcGFyYW1bMF0pOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfQorCWlmIChyYyA9PSAwKQorCQlyYyA9IGNudDsKKwllbHNlCisJCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN3cm1fZGVidWdfb3BzID0geworCS5vcGVuID0gc3dybV9kZWJ1Z19vcGVuLAorCS53cml0ZSA9IHN3cm1fZGVidWdfd3JpdGUsCisJLnJlYWQgPSBzd3JtX2RlYnVnX3JlYWQsCit9OworCitzdGF0aWMgaW50IHN3cm1fc2V0X2NoX21hcChzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3dyX21zdHJfcG9ydCAqcGluZm8gPSAoc3RydWN0IHN3cl9tc3RyX3BvcnQgKilkYXRhOworCisJc3dybS0+bXN0cl9wb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN3cl9tc3RyX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3dybS0+bXN0cl9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXN3cm0tPm1zdHJfcG9ydC0+bnVtX3BvcnQgPSBwaW5mby0+bnVtX3BvcnQ7CisJc3dybS0+bXN0cl9wb3J0LT5wb3J0ID0ga3phbGxvYygocGluZm8tPm51bV9wb3J0ICogc2l6ZW9mKHU4KSksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghc3dybS0+bXN0cl9wb3J0LT5wb3J0KSB7CisJCWtmcmVlKHN3cm0tPm1zdHJfcG9ydCk7CisJCXN3cm0tPm1zdHJfcG9ydCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkoc3dybS0+bXN0cl9wb3J0LT5wb3J0LCBwaW5mby0+cG9ydCwgcGluZm8tPm51bV9wb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgc3dybV9pc19wb3J0X2VuKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyKQoreworCXJldHVybiAhIShtc3RyLT5udW1fcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9jbGtfcmVxdWVzdChzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSwgYm9vbCBlbmFibGUpCit7CisJaWYgKCFzd3JtLT5jbGsgfHwgIXN3cm0tPmhhbmRsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZW5hYmxlKSB7CisJCXN3cm0tPmNsayhzd3JtLT5oYW5kbGUsIHRydWUpOworCQlzd3JtLT5zdGF0ZSA9IFNXUl9NU1RSX1VQOworCX0gZWxzZSB7CisJCXN3cm0tPmNsayhzd3JtLT5oYW5kbGUsIGZhbHNlKTsKKwkJc3dybS0+c3RhdGUgPSBTV1JfTVNUUl9ET1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd3JtX2dldF9wb3J0X2NvbmZpZyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQoreworCXUzMiBjaF9yYXRlID0gMDsKKwl1MzIgbnVtX2NoID0gMDsKKwlpbnQgaSwgdWNfaWR4OworCXUzMiBwb3J0Y291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFNXUl9NU1RSX1BPUlRfTEVOOyBpKyspIHsKKwkJaWYgKG1hc3Rlci0+cG9ydFtpXS5wb3J0X2VuKSB7CisJCQljaF9yYXRlICs9IG1hc3Rlci0+cG9ydFtpXS5jaF9yYXRlOworCQkJbnVtX2NoICs9IG1hc3Rlci0+cG9ydFtpXS5udW1fY2g7CisJCQlwb3J0Y291bnQrKzsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1Yyk7IGkrKykgeworCQlpZiAoKHVjW2ldLm51bV9wb3J0ID09IHBvcnRjb3VudCkgJiYKKwkJICAgICh1Y1tpXS5udW1fY2ggPT0gbnVtX2NoKSAmJgorCQkgICAgKHVjW2ldLmNocmF0ZSA9PSBjaF9yYXRlKSkgeworCQkJdWNfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gQVJSQVlfU0laRSh1YykpIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsCisJCQkiJXM6IHVzZWNhc2UgcG9ydDolZCwgbnVtX2NoOiVkLCBjaHJhdGU6JWQgbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18sIG1hc3Rlci0+bnVtX3BvcnQsIG51bV9jaCwgY2hfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgU1dSX01TVFJfUE9SVF9MRU47IGkrKykgeworCQlpZiAobWFzdGVyLT5wb3J0W2ldLnBvcnRfZW4pIHsKKwkJCW1hc3Rlci0+cG9ydFtpXS5zaW50ZXJ2YWwgPSBwcFt1Y19pZHhdW2ldLnNpOworCQkJbWFzdGVyLT5wb3J0W2ldLm9mZnNldDEgPSBwcFt1Y19pZHhdW2ldLm9mZjE7CisJCQltYXN0ZXItPnBvcnRbaV0ub2Zmc2V0MiA9IHBwW3VjX2lkeF1baV0ub2ZmMjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd3JtX2dldF9tYXN0ZXJfcG9ydCh1OCAqbXN0cl9wb3J0X2lkLCB1OCBzbHZfcG9ydF9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTV1JfTVNUUl9QT1JUX0xFTjsgaSsrKSB7CisJCWlmIChtc3RyX3BvcnRzW2ldID09IHNsdl9wb3J0X2lkKSB7CisJCQkqbXN0cl9wb3J0X2lkID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdTMyIHN3cm1fZ2V0X3BhY2tlZF9yZWdfdmFsKHU4ICpjbWRfaWQsIHU4IGNtZF9kYXRhLAorCQkJCSB1OCBkZXZfYWRkciwgdTE2IHJlZ19hZGRyKQoreworCXUzMiB2YWw7CisJdTggaWQgPSAqY21kX2lkOworCisJaWYgKGlkICE9IFNXUl9CUk9BRENBU1RfQ01EX0lEKSB7CisJCWlmIChpZCA8IDE0KQorCQkJaWQgKz0gMTsKKwkJZWxzZQorCQkJaWQgPSAwOworCQkqY21kX2lkID0gaWQ7CisJfQorCXZhbCA9IFNXUl9SRUdfVkFMX1BBQ0soY21kX2RhdGEsIGRldl9hZGRyLCBpZCwgcmVnX2FkZHIpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzd3JtX2NtZF9maWZvX3JkX2NtZChzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSwgaW50ICpjbWRfZGF0YSwKKwkJCQkgdTggZGV2X2FkZHIsIHU4IGNtZF9pZCwgdTE2IHJlZ19hZGRyLAorCQkJCSB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJaW50IHJldCA9IDA7CisKKwl2YWwgPSBzd3JtX2dldF9wYWNrZWRfcmVnX3ZhbCgmc3dybS0+cmNtZF9pZCwgbGVuLCBkZXZfYWRkciwgcmVnX2FkZHIpOworCXJldCA9IHN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DTURfRklGT19SRF9DTUQsIHZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihzd3JtLT5kZXYsICIlczogcmVnIDB4JXggd3JpdGUgZmFpbGVkLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgdmFsLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJKmNtZF9kYXRhID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fQ01EX0ZJRk9fUkRfRklGT19BRERSKTsKKwlkZXZfZGJnKHN3cm0tPmRldiwKKwkJIiVzOiByZWc6IDB4JXgsIGNtZF9pZDogMHgleCwgZGV2X2lkOiAweCV4LCBjbWRfZGF0YTogMHgleFxuIiwKKwkJX19mdW5jX18sIHJlZ19hZGRyLCBjbWRfaWQsIGRldl9hZGRyLCAqY21kX2RhdGEpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9jbWRfZmlmb193cl9jbWQoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0sIHU4IGNtZF9kYXRhLAorCQkJCSB1OCBkZXZfYWRkciwgdTggY21kX2lkLCB1MTYgcmVnX2FkZHIpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY21kX2lkKQorCQl2YWwgPSBzd3JtX2dldF9wYWNrZWRfcmVnX3ZhbCgmc3dybS0+d2NtZF9pZCwgY21kX2RhdGEsCisJCQkJCSAgICAgIGRldl9hZGRyLCByZWdfYWRkcik7CisJZWxzZQorCQl2YWwgPSBzd3JtX2dldF9wYWNrZWRfcmVnX3ZhbCgmY21kX2lkLCBjbWRfZGF0YSwKKwkJCQkJICAgICAgZGV2X2FkZHIsIHJlZ19hZGRyKTsKKworCWRldl9kYmcoc3dybS0+ZGV2LAorCQkiJXM6IHJlZzogMHgleCwgY21kX2lkOiAweCV4LCBkZXZfaWQ6IDB4JXgsIGNtZF9kYXRhOiAweCV4XG4iLAorCQlfX2Z1bmNfXywgcmVnX2FkZHIsIGNtZF9pZCwgZGV2X2FkZHIsIGNtZF9kYXRhKTsKKwlyZXQgPSBzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fQ01EX0ZJRk9fV1JfQ01ELCB2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IHJlZyAweCV4IHdyaXRlIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHZhbCwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCWlmIChjbWRfaWQgPT0gMHhGKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnN3cm0tPmJyb2FkY2FzdCwgKDIgKiBIWi8xMCkpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9yZWFkKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsIHU4IGRldl9udW0sIHUxNiByZWdfYWRkciwKKwkJICAgICB2b2lkICpidWYsIHUzMiBsZW4pCit7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOworCWludCByZXQgPSAwOworCWludCB2YWw7CisJdTggKnJlZ192YWwgPSAodTggKilidWY7CisKKwlpZiAoIXN3cm0pIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogc3dybSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXZfbnVtKQorCQlyZXQgPSBzd3JtX2NtZF9maWZvX3JkX2NtZChzd3JtLCAmdmFsLCBkZXZfbnVtLCAwLCByZWdfYWRkciwKKwkJCQkJICAgbGVuKTsKKwllbHNlCisJCXZhbCA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCByZWdfYWRkcik7CisKKwkqcmVnX3ZhbCA9ICh1OCl2YWw7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmc3dybS0+cGRldi0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3dybV93cml0ZShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCisJCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisJaW50IHJldCA9IDA7CisJdTggcmVnX3ZhbCA9ICoodTggKilidWY7CisKKwlpZiAoIXN3cm0pIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogc3dybSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXZfbnVtKQorCQlyZXQgPSBzd3JtX2NtZF9maWZvX3dyX2NtZChzd3JtLCByZWdfdmFsLCBkZXZfbnVtLCAwLCByZWdfYWRkcik7CisJZWxzZQorCQlyZXQgPSBzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIHJlZ19hZGRyLCByZWdfdmFsKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJnN3cm0tPnBkZXYtPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN3cm1fYnVsa193cml0ZShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBkZXZfbnVtLCB2b2lkICpyZWcsCisJCQkgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOworCWludCByZXQgPSAwOworCWludCBpOworCXUzMiAqdmFsOworCXUzMiAqc3dyX2ZpZm9fcmVnOworCisJaWYgKCFzd3JtIHx8ICFzd3JtLT5oYW5kbGUpIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogc3dybSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRldl9udW0pIHsKKwkJc3dyX2ZpZm9fcmVnID0ga2NhbGxvYyhsZW4sIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzd3JfZmlmb19yZWcpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCQl2YWwgPSBrY2FsbG9jKGxlbiwgc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gbWVtX2ZhaWw7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXZhbFtpXSA9IHN3cm1fZ2V0X3BhY2tlZF9yZWdfdmFsKCZzd3JtLT53Y21kX2lkLAorCQkJCQkJCSAoKHU4ICopYnVmKVtpXSwKKwkJCQkJCQkgZGV2X251bSwKKwkJCQkJCQkgKCh1MTYgKilyZWcpW2ldKTsKKwkJCXN3cl9maWZvX3JlZ1tpXSA9IFNXUk1fQ01EX0ZJRk9fV1JfQ01EOworCQl9CisJCXJldCA9IHN3cm0tPmJ1bGtfd3JpdGUoc3dybS0+aGFuZGxlLCBzd3JfZmlmb19yZWcsIHZhbCwgbGVuKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogYnVsayB3cml0ZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAorCQkJIiVzOiBObyBzdXBwb3J0IG9mIEJ1bGsgd3JpdGUgZm9yIG1hc3RlciByZWdzXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJa2ZyZWUodmFsKTsKK21lbV9mYWlsOgorCWtmcmVlKHN3cl9maWZvX3JlZyk7CitlcnI6CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmc3dybS0+cGRldi0+ZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTggZ2V0X2luYWN0aXZlX2JhbmtfbnVtKHN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtKQoreworCXJldHVybiAoc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX1NUQVRVUykgJgorCQlTV1JNX01DUF9TVEFUVVNfQkFOS19OVU1fTUFTSykgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2Jhbmtfc3dpdGNoKHN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtLCB1OCBiYW5rLAorCQkJCXU4IHJvdywgdTggY29sKQoreworCXN3cm1fY21kX2ZpZm9fd3JfY21kKHN3cm0sICgocm93IDw8IDMpIHwgY29sKSwgMHhGLCAweEYsCisJCQlTV1JTX1NDUF9GUkFNRV9DVFJMX0JBTksoYmFuaykpOworfQorCitzdGF0aWMgc3RydWN0IHN3cl9wb3J0X2luZm8gKnN3cm1fZ2V0X3BvcnQoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQkJICAgdTggcG9ydF9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqcG9ydCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1dSX01TVFJfUE9SVF9MRU47IGkrKykgeworCQlwb3J0ID0gJm1hc3Rlci0+cG9ydFtpXTsKKwkJaWYgKHBvcnQtPnBvcnRfaWQgPT0gcG9ydF9pZCkgeworCQkJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogcG9ydF9pZDogJWQsIGluZGV4OiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgaSk7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHN3cl9wb3J0X2luZm8gKnN3cm1fZ2V0X2F2YWlsX3BvcnQoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqcG9ydCA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1dSX01TVFJfUE9SVF9MRU47IGkrKykgeworCQlwb3J0ID0gJm1hc3Rlci0+cG9ydFtpXTsKKwkJaWYgKHBvcnQtPnBvcnRfZW4pCisJCQljb250aW51ZTsKKworCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBwb3J0X2lkOiAlZCwgaW5kZXg6ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnQtPnBvcnRfaWQsIGkpOworCQlyZXR1cm4gcG9ydDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzd3JfcG9ydF9pbmZvICpzd3JtX2dldF9lbmFibGVkX3BvcnQoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQkJCSAgIHU4IHBvcnRfaWQpCit7CisJaW50IGk7CisJc3RydWN0IHN3cl9wb3J0X2luZm8gKnBvcnQgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFNXUl9NU1RSX1BPUlRfTEVOOyBpKyspIHsKKwkJcG9ydCA9ICZtYXN0ZXItPnBvcnRbaV07CisJCWlmICgocG9ydC0+cG9ydF9pZCA9PSBwb3J0X2lkKSAmJiAocG9ydC0+cG9ydF9lbiA9PSB0cnVlKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBTV1JfTVNUUl9QT1JUX0xFTikKKwkJcG9ydCA9IE5VTEw7CisJcmV0dXJuIHBvcnQ7Cit9CisKK3N0YXRpYyBib29sIHN3cm1fcmVtb3ZlX2Zyb21fZ3JvdXAoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldjsKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisJYm9vbCBpc19yZW1vdmVkID0gZmFsc2U7CisKKwlpZiAoIXN3cm0pCisJCWdvdG8gZW5kOworCisJbXV0ZXhfbG9jaygmc3dybS0+bWxvY2spOworCWlmICgoc3dybS0+bnVtX3J4X2NocyA+IDEpICYmCisJICAgIChzd3JtLT5udW1fcnhfY2hzID09IHN3cm0tPm51bV9jZmdfZGV2cykpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbWFzdGVyLT5kZXZpY2VzLAorCQkJCWRldl9saXN0KSB7CisJCQlzd3JfZGV2LT5ncm91cF9pZCA9IFNXUl9HUk9VUF9OT05FOworCQkJbWFzdGVyLT5ncl9zaWQgPSAwOworCQl9CisJCWlzX3JlbW92ZWQgPSB0cnVlOworCX0KKwltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKKworZW5kOgorCXJldHVybiBpc19yZW1vdmVkOworfQorCitzdGF0aWMgdm9pZCBzd3JtX2NsZWFudXBfZGlzYWJsZWRfZGF0YV9wb3J0cyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAorCQkJCQkgICAgIHU4IGJhbmspCit7CisJdTMyIHZhbHVlOworCXN0cnVjdCBzd3JfcG9ydF9pbmZvICpwb3J0OworCWludCBpOworCWludCBwb3J0X3R5cGU7CisJc3RydWN0IHN3cm1fbXBvcnRzICptcG9ydCwgKm1wb3J0X25leHQgPSBOVUxMOworCWludCBwb3J0X2Rpc2FibGVfY250ID0gMDsKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisKKwlpZiAoIXN3cm0pIHsKKwkJcHJfZXJyKCIlczogc3dybSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBtYXN0ZXIgbnVtX3BvcnQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJbWFzdGVyLT5udW1fcG9ydCk7CisKKwltcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmc3dybS0+bXBvcnRfbGlzdCwKKwkJCQkJc3RydWN0IHN3cm1fbXBvcnRzLAorCQkJCQlsaXN0KTsKKwlpZiAoIW1wb3J0KSB7CisJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGxpc3QgaXMgZW1wdHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9wb3J0OyBpKyspIHsKKwkJcG9ydCA9IHN3cm1fZ2V0X3BvcnQobWFzdGVyLCBtc3RyX3BvcnRzW21wb3J0LT5pZF0pOworCQlpZiAoIXBvcnQgfHwgcG9ydC0+Y2hfZW4pCisJCQlnb3RvIGluY19sb29wOworCisJCXBvcnRfZGlzYWJsZV9jbnQrKzsKKwkJcG9ydF90eXBlID0gbXN0cl9wb3J0X3R5cGVbbXBvcnQtPmlkXTsKKwkJdmFsdWUgPSAoKHBvcnQtPmNoX2VuKQorCQkJCTw8IFNXUk1fRFBfUE9SVF9DVFJMX0VOX0NIQU5fU0hGVCk7CisJCXZhbHVlIHw9ICgocG9ydC0+b2Zmc2V0MikKKwkJCQk8PCBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQyX1NIRlQpOworCQl2YWx1ZSB8PSAoKHBvcnQtPm9mZnNldDEpCisJCQkJPDwgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMV9TSEZUKTsKKwkJdmFsdWUgfD0gcG9ydC0+c2ludGVydmFsOworCisJCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwKKwkJCSAgICBTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LKChtcG9ydC0+aWQrMSksIGJhbmspLAorCQkJICAgIHZhbHVlKTsKKwkJc3dybV9jbWRfZmlmb193cl9jbWQoc3dybSwgMHgwMCwgcG9ydC0+ZGV2X2lkLCAweDAwLAorCQkJCVNXUlNfRFBfQ0hBTk5FTF9FTkFCTEVfQkFOSyhwb3J0X3R5cGUsIGJhbmspKTsKKworCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBtcG9ydCA6JWQsIHJlZzogMHgleCwgdmFsOiAweCV4XG4iLAorCQkJX19mdW5jX18sIG1wb3J0LT5pZCwKKwkJCShTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LKChtcG9ydC0+aWQrMSksIGJhbmspKSwgdmFsdWUpOworCitpbmNfbG9vcDoKKwkJbXBvcnRfbmV4dCA9IGxpc3RfbmV4dF9lbnRyeShtcG9ydCwgbGlzdCk7CisJCWlmIChwb3J0ICYmICFwb3J0LT5jaF9lbikgeworCQkJbGlzdF9kZWwoJm1wb3J0LT5saXN0KTsKKwkJCWtmcmVlKG1wb3J0KTsKKwkJfQorCQlpZiAoIW1wb3J0X25leHQpIHsKKwkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGVuZCBvZiBsaXN0XG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQltcG9ydCA9IG1wb3J0X25leHQ7CisJfQorCW1hc3Rlci0+bnVtX3BvcnQgLT0gcG9ydF9kaXNhYmxlX2NudDsKKworCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6ZGlzYWJsZSBwb3J0czogJWQsIGFjdGl2ZSBwb3J0cyAocmVtKTogJWRcbiIsCisJCV9fZnVuY19fLCBwb3J0X2Rpc2FibGVfY250LCAgbWFzdGVyLT5udW1fcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN3cm1fc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2woc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQkJIGJvb2wgZW5hYmxlKQoreworCXU4IGJhbms7CisJdTMyIHZhbHVlLCBuX2NvbDsKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisJaW50IG1hc2sgPSAoU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1JPV19DVFJMX0JNU0sgfAorCQkgICAgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0NPTF9DVFJMX0JNU0sgfAorCQkgICAgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1NTUF9QRVJJT0RfQk1TSyk7CisJdTggaW5hY3RpdmVfYmFuazsKKworCWlmICghc3dybSkgeworCQlwcl9lcnIoIiVzOiBzd3JtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWJhbmsgPSBnZXRfaW5hY3RpdmVfYmFua19udW0oc3dybSk7CisKKwlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBlbmFibGU6ICVkLCBjZmdfZGV2czogJWRcbiIsCisJCV9fZnVuY19fLCBlbmFibGUsIHN3cm0tPm51bV9jZmdfZGV2cyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIHNldCBSb3cgPSA0OCBhbmQgY29sID0gMTYgKi8KKwkJbl9jb2wgPSBTV1JfTUFYX0NPTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBEbyBub3QgY2hhbmdlIHRvIDQ4eDIgaWYgbnVtYmVyIG9mIGNoYW5uZWxzIGNvbmZpZ3VyZWQKKwkJICogYXMgc3RlcmVvIGFuZCBpZiBkaXNhYmxlIGRhdGFwYXRoIGlzIGNhbGxlZCBmb3IgdGhlCisJCSAqIGZpcnN0IHNsYXZlIGRldmljZQorCQkgKi8KKwkJaWYgKHN3cm0tPm51bV9jZmdfZGV2cyA+IDApCisJCQluX2NvbCA9IFNXUl9NQVhfQ09MOworCQllbHNlCisJCQluX2NvbCA9IFNXUl9NSU5fQ09MOworCisJCS8qCisJCSAqIEFsbCBwb3J0cyBhcmUgYWxyZWFkeSBkaXNhYmxlZCwgbm8gbmVlZCB0byBwZXJmb3JtCisJCSAqIGJhbmstc3dpdGNoIGFuZCBjb3B5IG9wZXJhdGlvbi4gVGhpcyBjYXNlIGNhbiBhcmlzZQorCQkgKiB3aGVuIHNwZWFrZXIgY2hhbm5lbHMgYXJlIGVuYWJsZWQgaW4gc3RlcmVvIG1vZGUgd2l0aAorCQkgKiBCUk9BRENBU1QgYW5kIGRpc2FibGVkIGluIEdST1VQX05PTkUKKwkJICovCisJCWlmIChtYXN0ZXItPm51bV9wb3J0ID09IDApCisJCQlyZXR1cm47CisJfQorCisJdmFsdWUgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0FERFIoYmFuaykpOworCXZhbHVlICY9ICh+bWFzayk7CisJdmFsdWUgfD0gKCgwIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19ST1dfQ1RSTF9TSEZUKSB8CisJCSAgKG5fY29sIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19DT0xfQ1RSTF9TSEZUKSB8CisJCSAgKDAgPDwgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1NTUF9QRVJJT0RfU0hGVCkpOworCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0FERFIoYmFuayksIHZhbHVlKTsKKworCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6IHJlZ2FkZHI6IDB4JXgsIHZhbHVlOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0FERFIoYmFuayksIHZhbHVlKTsKKworCWVuYWJsZV9iYW5rX3N3aXRjaChzd3JtLCBiYW5rLCBTV1JfTUFYX1JPVywgbl9jb2wpOworCisJaW5hY3RpdmVfYmFuayA9IGJhbmsgPyAwIDogMTsKKwlpZiAoZW5hYmxlKQorCQlzd3JtX2NvcHlfZGF0YV9wb3J0X2NvbmZpZyhtYXN0ZXIsIGluYWN0aXZlX2JhbmspOworCWVsc2UKKwkJc3dybV9jbGVhbnVwX2Rpc2FibGVkX2RhdGFfcG9ydHMobWFzdGVyLCBpbmFjdGl2ZV9iYW5rKTsKKworCWlmICghc3dybV9pc19wb3J0X2VuKG1hc3RlcikpIHsKKwkJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogcG1fcnVudGltZSBhdXRvIHN1c3BlbmQgdHJpZ2dlcmVkXG4iLAorCQkJX19mdW5jX18pOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZzd3JtLT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmc3dybS0+cGRldi0+ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN3cm1fYXBwbHlfcG9ydF9jb25maWcoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKK3sKKwl1OCBiYW5rOworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gc3dyX2dldF9jdHJsX2RhdGEobWFzdGVyKTsKKworCWlmICghc3dybSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBzd3IgY29udHJvbGxlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWJhbmsgPSBnZXRfaW5hY3RpdmVfYmFua19udW0oc3dybSk7CisJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogZW50ZXIgYmFuazogJWQgbWFzdGVyX3BvcnRzOiAlZFxuIiwKKwkJX19mdW5jX18sIGJhbmssIG1hc3Rlci0+bnVtX3BvcnQpOworCisKKwlzd3JtX2NtZF9maWZvX3dyX2NtZChzd3JtLCAweDAxLCAweEYsIDB4MDAsCisJCQlTV1JTX1NDUF9IT1NUX0NMS19ESVYyX0NUTF9CQU5LKGJhbmspKTsKKworCXN3cm1fY29weV9kYXRhX3BvcnRfY29uZmlnKG1hc3RlciwgYmFuayk7Cit9CisKK3N0YXRpYyB2b2lkIHN3cm1fY29weV9kYXRhX3BvcnRfY29uZmlnKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsIHU4IGJhbmspCit7CisJdTMyIHZhbHVlOworCXN0cnVjdCBzd3JfcG9ydF9pbmZvICpwb3J0OworCWludCBpOworCWludCBwb3J0X3R5cGU7CisJc3RydWN0IHN3cm1fbXBvcnRzICptcG9ydDsKKwl1MzIgcmVnW1NXUk1fTUFYX1BPUlRfUkVHXTsKKwl1MzIgdmFsW1NXUk1fTUFYX1BPUlRfUkVHXTsKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisKKwlpZiAoIXN3cm0pIHsKKwkJcHJfZXJyKCIlczogc3dybSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBtYXN0ZXIgbnVtX3BvcnQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJbWFzdGVyLT5udW1fcG9ydCk7CisKKwltcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmc3dybS0+bXBvcnRfbGlzdCwKKwkJCQkJc3RydWN0IHN3cm1fbXBvcnRzLAorCQkJCQlsaXN0KTsKKwlpZiAoIW1wb3J0KSB7CisJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGxpc3QgaXMgZW1wdHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fcG9ydDsgaSsrKSB7CisKKwkJcG9ydCA9IHN3cm1fZ2V0X2VuYWJsZWRfcG9ydChtYXN0ZXIsIG1zdHJfcG9ydHNbbXBvcnQtPmlkXSk7CisJCWlmICghcG9ydCkKKwkJCWNvbnRpbnVlOworCQlwb3J0X3R5cGUgPSBtc3RyX3BvcnRfdHlwZVttcG9ydC0+aWRdOworCQlpZiAoIXBvcnQtPmRldl9pZCB8fCAocG9ydC0+ZGV2X2lkID4gbWFzdGVyLT5udW1fZGV2KSkgeworCQkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogaW52YWxpZCBkZXZpY2UgaWQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydC0+ZGV2X2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbHVlID0gKChwb3J0LT5jaF9lbikKKwkJCQk8PCBTV1JNX0RQX1BPUlRfQ1RSTF9FTl9DSEFOX1NIRlQpOworCQl2YWx1ZSB8PSAoKHBvcnQtPm9mZnNldDIpCisJCQkJPDwgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMl9TSEZUKTsKKwkJdmFsdWUgfD0gKChwb3J0LT5vZmZzZXQxKQorCQkJCTw8IFNXUk1fRFBfUE9SVF9DVFJMX09GRlNFVDFfU0hGVCk7CisJCXZhbHVlIHw9IHBvcnQtPnNpbnRlcnZhbDsKKworCQlyZWdbbGVuXSA9IFNXUk1fRFBfUE9SVF9DVFJMX0JBTksoKG1wb3J0LT5pZCsxKSwgYmFuayk7CisJCXZhbFtsZW4rK10gPSB2YWx1ZTsKKworCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBtcG9ydCA6JWQsIHJlZzogMHgleCwgdmFsOiAweCV4XG4iLAorCQkJX19mdW5jX18sIG1wb3J0LT5pZCwKKwkJCShTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LKChtcG9ydC0+aWQrMSksIGJhbmspKSwgdmFsdWUpOworCisJCXJlZ1tsZW5dID0gU1dSTV9DTURfRklGT19XUl9DTUQ7CisJCXZhbFtsZW4rK10gPSBTV1JfUkVHX1ZBTF9QQUNLKHBvcnQtPmNoX2VuLCBwb3J0LT5kZXZfaWQsIDB4MDAsCisJCQkJU1dSU19EUF9DSEFOTkVMX0VOQUJMRV9CQU5LKHBvcnRfdHlwZSwgYmFuaykpOworCisJCXJlZ1tsZW5dID0gU1dSTV9DTURfRklGT19XUl9DTUQ7CisJCXZhbFtsZW4rK10gPSBTV1JfUkVHX1ZBTF9QQUNLKHBvcnQtPnNpbnRlcnZhbCwKKwkJCQlwb3J0LT5kZXZfaWQsIDB4MDAsCisJCQkJU1dSU19EUF9TQU1QTEVfQ09OVFJPTF8xX0JBTksocG9ydF90eXBlLCBiYW5rKSk7CisKKwkJcmVnW2xlbl0gPSBTV1JNX0NNRF9GSUZPX1dSX0NNRDsKKwkJdmFsW2xlbisrXSA9IFNXUl9SRUdfVkFMX1BBQ0socG9ydC0+b2Zmc2V0MSwKKwkJCQlwb3J0LT5kZXZfaWQsIDB4MDAsCisJCQkJU1dSU19EUF9PRkZTRVRfQ09OVFJPTF8xX0JBTksocG9ydF90eXBlLCBiYW5rKSk7CisKKwkJaWYgKHBvcnRfdHlwZSAhPSAwKSB7CisJCQlyZWdbbGVuXSA9IFNXUk1fQ01EX0ZJRk9fV1JfQ01EOworCQkJdmFsW2xlbisrXSA9IFNXUl9SRUdfVkFMX1BBQ0socG9ydC0+b2Zmc2V0MiwKKwkJCQkJcG9ydC0+ZGV2X2lkLCAweDAwLAorCQkJCQlTV1JTX0RQX09GRlNFVF9DT05UUk9MXzJfQkFOSyhwb3J0X3R5cGUsCisJCQkJCQkJCQliYW5rKSk7CisJCX0KKwkJbXBvcnQgPSBsaXN0X25leHRfZW50cnkobXBvcnQsIGxpc3QpOworCQlpZiAoIW1wb3J0KSB7CisJCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBlbmQgb2YgbGlzdFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3dybS0+YnVsa193cml0ZShzd3JtLT5oYW5kbGUsIHJlZywgdmFsLCBsZW4pOworfQorCitzdGF0aWMgaW50IHN3cm1fY29ubmVjdF9wb3J0KHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCisJCQlzdHJ1Y3Qgc3dyX3BhcmFtcyAqcG9ydGluZm8pCit7CisJaW50IGk7CisJc3RydWN0IHN3cl9wb3J0X2luZm8gKnBvcnQ7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOworCXN0cnVjdCBzd3JtX21wb3J0cyAqbXBvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKworCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFwb3J0aW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN3cm0pIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsCisJCQkiJXM6IEludmFsaWQgaGFuZGxlIHRvIHN3ciBjb250cm9sbGVyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZzd3JtLT5tbG9jayk7CisJaWYgKCFzd3JtX2lzX3BvcnRfZW4obWFzdGVyKSkKKwkJcG1fcnVudGltZV9nZXRfc3luYygmc3dybS0+cGRldi0+ZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0aW5mby0+bnVtX3BvcnQ7IGkrKykgeworCQltcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzd3JtX21wb3J0cyksIEdGUF9LRVJORUwpOworCQlpZiAoIW1wb3J0KSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBtZW1fZmFpbDsKKwkJfQorCQlyZXQgPSBzd3JtX2dldF9tYXN0ZXJfcG9ydCgmbXBvcnQtPmlkLAorCQkJCQkJcG9ydGluZm8tPnBvcnRfaWRbaV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsCisJCQkJIiVzOiBtc3RyIHBvcnRpZCBmb3Igc2x2IHBvcnQgJWQgbm90IGZvdW5kXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0aW5mby0+cG9ydF9pZFtpXSk7CisJCQlnb3RvIHBvcnRfZmFpbDsKKwkJfQorCQlwb3J0ID0gc3dybV9nZXRfYXZhaWxfcG9ydChtYXN0ZXIpOworCQlpZiAoIXBvcnQpIHsKKwkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAorCQkJCSIlczogYXZhaWwgcG9ydHMgbm90IGZvdW5kIVxuIiwgX19mdW5jX18pOworCQkJZ290byBwb3J0X2ZhaWw7CisJCX0KKwkJbGlzdF9hZGQoJm1wb3J0LT5saXN0LCAmc3dybS0+bXBvcnRfbGlzdCk7CisJCXBvcnQtPmRldl9pZCA9IHBvcnRpbmZvLT5kZXZfaWQ7CisJCXBvcnQtPnBvcnRfaWQgPSBwb3J0aW5mby0+cG9ydF9pZFtpXTsKKwkJcG9ydC0+bnVtX2NoID0gcG9ydGluZm8tPm51bV9jaFtpXTsKKwkJcG9ydC0+Y2hfcmF0ZSA9IHBvcnRpbmZvLT5jaF9yYXRlW2ldOworCQlwb3J0LT5jaF9lbiA9IHBvcnRpbmZvLT5jaF9lbltpXTsKKwkJcG9ydC0+cG9ydF9lbiA9IHRydWU7CisJCWRldl9kYmcoJm1hc3Rlci0+ZGV2LAorCQkJIiVzOiBtc3RyIHBvcnQgJWQsIHNsdiBwb3J0ICVkIGNoX3JhdGUgJWQgbnVtX2NoICVkXG4iLAorCQkJX19mdW5jX18sIG1wb3J0LT5pZCwgcG9ydC0+cG9ydF9pZCwgcG9ydC0+Y2hfcmF0ZSwKKwkJCXBvcnQtPm51bV9jaCk7CisJfQorCW1hc3Rlci0+bnVtX3BvcnQgKz0gcG9ydGluZm8tPm51bV9wb3J0OworCWlmIChtYXN0ZXItPm51bV9wb3J0ID49IFNXUl9NU1RSX1BPUlRfTEVOKQorCQltYXN0ZXItPm51bV9wb3J0ID0gU1dSX01TVFJfUE9SVF9MRU47CisKKwlzd3JtX2dldF9wb3J0X2NvbmZpZyhtYXN0ZXIpOworCXN3cl9wb3J0X3Jlc3BvbnNlKG1hc3RlciwgcG9ydGluZm8tPnRpZCk7CisJc3dybS0+bnVtX2NmZ19kZXZzICs9IDE7CisJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogY2ZnX2RldnM6ICVkLCByeF9jaHM6ICVkXG4iLAorCQlfX2Z1bmNfXywgc3dybS0+bnVtX2NmZ19kZXZzLCBzd3JtLT5udW1fcnhfY2hzKTsKKwlpZiAoc3dybS0+bnVtX3J4X2NocyA+IDEpIHsKKwkJaWYgKHN3cm0tPm51bV9yeF9jaHMgPT0gc3dybS0+bnVtX2NmZ19kZXZzKQorCQkJc3dybV9hcHBseV9wb3J0X2NvbmZpZyhtYXN0ZXIpOworCX0gZWxzZSB7CisJCXN3cm1fYXBwbHlfcG9ydF9jb25maWcobWFzdGVyKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7CisJcmV0dXJuIDA7CisKK3BvcnRfZmFpbDoKKwlrZnJlZShtcG9ydCk7CittZW1fZmFpbDoKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmc3dybS0+bXBvcnRfbGlzdCkgeworCQltcG9ydCA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc3dybV9tcG9ydHMsIGxpc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgcG9ydGluZm8tPm51bV9wb3J0OyBpKyspIHsKKwkJCWlmIChwb3J0aW5mby0+cG9ydF9pZFtpXSA9PSBtc3RyX3BvcnRzW21wb3J0LT5pZF0pIHsKKwkJCQlwb3J0ID0gc3dybV9nZXRfcG9ydChtYXN0ZXIsCisJCQkJCQlwb3J0aW5mby0+cG9ydF9pZFtpXSk7CisJCQkJaWYgKHBvcnQpCisJCQkJCXBvcnQtPmNoX2VuID0gZmFsc2U7CisJCQkJbGlzdF9kZWwoJm1wb3J0LT5saXN0KTsKKwkJCQlrZnJlZShtcG9ydCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzd3JtX2Rpc2Nvbm5lY3RfcG9ydChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAorCQkJc3RydWN0IHN3cl9wYXJhbXMgKnBvcnRpbmZvKQoreworCWludCBpOworCXN0cnVjdCBzd3JfcG9ydF9pbmZvICpwb3J0OworCXU4IGJhbms7CisJdTMyIHZhbHVlOworCWludCByZXQgPSAwOworCXU4IG1wb3J0X2lkID0gMDsKKwlpbnQgcG9ydF90eXBlID0gMDsKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7CisKKwlpZiAoIXN3cm0pIHsKKwkJZGV2X2VycigmbWFzdGVyLT5kZXYsCisJCQkiJXM6IEludmFsaWQgaGFuZGxlIHRvIHN3ciBjb250cm9sbGVyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBvcnRpbmZvKSB7CisJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IHBvcnRpbmZvIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJnN3cm0tPm1sb2NrKTsKKwliYW5rID0gZ2V0X2luYWN0aXZlX2JhbmtfbnVtKHN3cm0pOworCWZvciAoaSA9IDA7IGkgPCBwb3J0aW5mby0+bnVtX3BvcnQ7IGkrKykgeworCQlyZXQgPSBzd3JtX2dldF9tYXN0ZXJfcG9ydCgmbXBvcnRfaWQsCisJCQkJCQlwb3J0aW5mby0+cG9ydF9pZFtpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKKwkJCQkiJXM6IG1zdHIgcG9ydGlkIGZvciBzbHYgcG9ydCAlZCBub3QgZm91bmRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRpbmZvLT5wb3J0X2lkW2ldKTsKKwkJCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcG9ydCA9IHN3cm1fZ2V0X2VuYWJsZWRfcG9ydChtYXN0ZXIsIHBvcnRpbmZvLT5wb3J0X2lkW2ldKTsKKwkJaWYgKCFwb3J0KSB7CisJCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBwb3J0ICVkIGFscmVhZHkgZGlzYWJsZWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRpbmZvLT5wb3J0X2lkW2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBvcnRfdHlwZSA9IG1zdHJfcG9ydF90eXBlW21wb3J0X2lkXTsKKwkJcG9ydC0+ZGV2X2lkID0gcG9ydGluZm8tPmRldl9pZDsKKwkJcG9ydC0+cG9ydF9lbiA9IGZhbHNlOworCQlwb3J0LT5jaF9lbiA9IDA7CisJCXZhbHVlID0gcG9ydC0+Y2hfZW4gPDwgU1dSTV9EUF9QT1JUX0NUUkxfRU5fQ0hBTl9TSEZUOworCQl2YWx1ZSB8PSAocG9ydC0+b2Zmc2V0MiA8PCBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQyX1NIRlQpOworCQl2YWx1ZSB8PSAocG9ydC0+b2Zmc2V0MSA8PCBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQxX1NIRlQpOworCQl2YWx1ZSB8PSBwb3J0LT5zaW50ZXJ2YWw7CisKKworCQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsCisJCQkgICAgU1dSTV9EUF9QT1JUX0NUUkxfQkFOSygobXBvcnRfaWQrMSksIGJhbmspLAorCQkJICAgIHZhbHVlKTsKKwkJc3dybV9jbWRfZmlmb193cl9jbWQoc3dybSwgMHgwMCwgcG9ydC0+ZGV2X2lkLCAweDAwLAorCQkJCVNXUlNfRFBfQ0hBTk5FTF9FTkFCTEVfQkFOSyhwb3J0X3R5cGUsIGJhbmspKTsKKwl9CisKKwlzd3JfcG9ydF9yZXNwb25zZShtYXN0ZXIsIHBvcnRpbmZvLT50aWQpOworCXN3cm0tPm51bV9jZmdfZGV2cyAtPSAxOworCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IGNmZ19kZXZzOiAlZCwgcnhfY2hzOiAlZCwgYWN0aXZlIHBvcnRzOiAlZFxuIiwKKwkJX19mdW5jX18sIHN3cm0tPm51bV9jZmdfZGV2cywgc3dybS0+bnVtX3J4X2NocywKKwkJbWFzdGVyLT5udW1fcG9ydCk7CisJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd3JtX2NoZWNrX3NsYXZlX2NoYW5nZV9zdGF0dXMoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0sCisJCQkJCWludCBzdGF0dXMsIHU4ICpkZXZudW0pCit7CisJaW50IGk7CisJaW50IG5ld19zdHMgPSBzdGF0dXM7CisJaW50IHJldCA9IFNXUl9OT1RfUFJFU0VOVDsKKworCWlmIChzdGF0dXMgIT0gc3dybS0+c2xhdmVfc3RhdHVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoc3dybS0+bWFzdGVyLm51bV9kZXYgKyAxKTsgaSsrKSB7CisJCQlpZiAoKHN0YXR1cyAmIFNXUk1fTUNQX1NMVl9TVEFUVVNfTUFTSykgIT0KKwkJCSAgICAoc3dybS0+c2xhdmVfc3RhdHVzICYgU1dSTV9NQ1BfU0xWX1NUQVRVU19NQVNLKSkgeworCQkJCXJldCA9IChzdGF0dXMgJiBTV1JNX01DUF9TTFZfU1RBVFVTX01BU0spOworCQkJCSpkZXZudW0gPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RhdHVzID4+PSAyOworCQkJc3dybS0+c2xhdmVfc3RhdHVzID4+PSAyOworCQl9CisJCXN3cm0tPnNsYXZlX3N0YXR1cyA9IG5ld19zdHM7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzd3JfbXN0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gZGV2OworCXUzMiB2YWx1ZSwgaW50cl9zdHM7CisJaW50IHN0YXR1cywgY2hnX3N0cywgaTsKKwl1OCBkZXZudW0gPSAwOworCWludCByZXQgPSBJUlFfSEFORExFRDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnN3cm0tPnBkZXYtPmRldik7CisJaW50cl9zdHMgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9JTlRFUlJVUFRfU1RBVFVTKTsKKwlpbnRyX3N0cyAmPSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfUk1TSzsKKwlmb3IgKGkgPSAwOyBpIDwgU1dSTV9JTlRFUlJVUFRfTUFYOyBpKyspIHsKKwkJdmFsdWUgPSBpbnRyX3N0cyAmICgxIDw8IGkpOworCQlpZiAoIXZhbHVlKQorCQkJY29udGludWU7CisKKwkJc3dybS0+d3JpdGUoc3dybS0+aGFuZGxlLCBTV1JNX0lOVEVSUlVQVF9DTEVBUiwgdmFsdWUpOworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1NMQVZFX1BFTkRfSVJROgorCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1Igc2xhdmUgcGVuZCBpcnFcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX05FV19TTEFWRV9BVFRBQ0hFRDoKKwkJCWRldl9kYmcoc3dybS0+ZGV2LCAiU1dSIG5ldyBzbGF2ZSBhdHRhY2hlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQ0hBTkdFX0VOVU1fU0xBVkVfU1RBVFVTOgorCQkJc3RhdHVzID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX1NMVl9TVEFUVVMpOworCQkJaWYgKHN0YXR1cyA9PSBzd3JtLT5zbGF2ZV9zdGF0dXMpIHsKKwkJCQlkZXZfZGJnKHN3cm0tPmRldiwKKwkJCQkJIiVzOiBObyBjaGFuZ2UgaW4gc2xhdmUgc3RhdHVzOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljaGdfc3RzID0gc3dybV9jaGVja19zbGF2ZV9jaGFuZ2Vfc3RhdHVzKHN3cm0sIHN0YXR1cywKKwkJCQkJCQkJJmRldm51bSk7CisJCQlzd2l0Y2ggKGNoZ19zdHMpIHsKKwkJCWNhc2UgU1dSX05PVF9QUkVTRU5UOgorCQkJCWRldl9kYmcoc3dybS0+ZGV2LCAiZGV2aWNlICVkIGdvdCBkZXRhY2hlZFxuIiwKKwkJCQkJZGV2bnVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1dSX0FUVEFDSEVEX09LOgorCQkJCWRldl9kYmcoc3dybS0+ZGV2LCAiZGV2aWNlICVkIGdvdCBhdHRhY2hlZFxuIiwKKwkJCQkJZGV2bnVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1dSX0FMRVJUOgorCQkJCWRldl9kYmcoc3dybS0+ZGV2LAorCQkJCQkiZGV2aWNlICVkIGhhcyBwZW5kaW5nIGludGVycnVwdFxuIiwKKwkJCQkJZGV2bnVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19NQVNURVJfQ0xBU0hfREVUOgorCQkJZGV2X2Vycl9yYXRlbGltaXRlZChzd3JtLT5kZXYsICJTV1IgYnVzIGNsYXNoIGRldGVjdGVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19SRF9GSUZPX09WRVJGTE9XOgorCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1IgcmVhZCBGSUZPIG92ZXJmbG93XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19SRF9GSUZPX1VOREVSRkxPVzoKKwkJCWRldl9kYmcoc3dybS0+ZGV2LCAiU1dSIHJlYWQgRklGTyB1bmRlcmZsb3dcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1dSX0NNRF9GSUZPX09WRVJGTE9XOgorCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1Igd3JpdGUgRklGTyBvdmVyZmxvd1xuIik7CisJCQlicmVhazsKKwkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQ01EX0VSUk9SOgorCQkJdmFsdWUgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9DTURfRklGT19TVEFUVVMpOworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChzd3JtLT5kZXYsCisJCQkiU1dSIENNRCBlcnJvciwgZmlmbyBzdGF0dXMgMHgleCwgZmx1c2hpbmcgZmlmb1xuIiwKKwkJCQkJICAgIHZhbHVlKTsKKwkJCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DTURfRklGT19DTUQsIDB4MSk7CisJCQlicmVhazsKKwkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfRE9VVF9QT1JUX0NPTExJU0lPTjoKKwkJCWRldl9kYmcoc3dybS0+ZGV2LCAiU1dSIFBvcnQgY29sbGlzaW9uIGRldGVjdGVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19SRUFEX0VOX1JEX1ZBTElEX01JU01BVENIOgorCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1IgcmVhZCBlbmFibGUgdmFsaWQgbWlzbWF0Y2hcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1NQRUNJQUxfQ01EX0lEX0ZJTklTSEVEOgorCQkJY29tcGxldGUoJnN3cm0tPmJyb2FkY2FzdCk7CisJCQlkZXZfZGJnKHN3cm0tPmRldiwgIlNXUiBjbWQgaWQgZmluaXNoZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX05FV19TTEFWRV9BVVRPX0VOVU1fRklOSVNIRUQ6CisJCQlicmVhazsKKwkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQVVUT19FTlVNX0ZBSUxFRDoKKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19BVVRPX0VOVU1fVEFCTEVfSVNfRlVMTDoKKwkJCWJyZWFrOworCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19CVVNfUkVTRVRfRklOSVNIRUQ6CisJCQljb21wbGV0ZSgmc3dybS0+cmVzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0NMS19TVE9QX0ZJTklTSEVEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHN3cm0tPmRldiwgIlNXUiB1bmtub3duIGludGVycnVwdFxuIik7CisJCQlyZXQgPSBJUlFfTk9ORTsKKwkJCWJyZWFrOworCQl9CisJfQorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJnN3cm0tPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJnN3cm0tPnBkZXYtPmRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzd3JtX2dldF9kZXZpY2Vfc3RhdHVzKHN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtLCB1OCBkZXZudW0pCit7CisJdTMyIHZhbDsKKworCXN3cm0tPnNsYXZlX3N0YXR1cyA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX01DUF9TTFZfU1RBVFVTKTsKKwl2YWwgPSAoc3dybS0+c2xhdmVfc3RhdHVzID4+IChkZXZudW0gKiAyKSk7CisJdmFsICY9IFNXUk1fTUNQX1NMVl9TVEFUVVNfTUFTSzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHN3cm1fZ2V0X2xvZ2ljYWxfZGV2X251bShzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciwgdTY0IGRldl9pZCwKKwkJCQl1OCAqZGV2X251bSkKK3sKKwlpbnQgaTsKKwl1NjQgaWQgPSAwOworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gc3dyX2dldF9jdHJsX2RhdGEobXN0cik7CisKKwlpZiAoIXN3cm0pIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gc3dyIGNvbnRyb2xsZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcG1fcnVudGltZV9nZXRfc3luYygmc3dybS0+cGRldi0+ZGV2KTsKKwlmb3IgKGkgPSAxOyBpIDwgKG1zdHItPm51bV9kZXYgKyAxKTsgaSsrKSB7CisJCWlkID0gKCh1NjQpKHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLAorCQkJICAgIFNXUk1fRU5VTUVSQVRPUl9TTEFWRV9ERVZfSURfMihpKSkpIDw8IDMyKTsKKwkJaWQgfD0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsCisJCQkgICAgU1dSTV9FTlVNRVJBVE9SX1NMQVZFX0RFVl9JRF8xKGkpKTsKKwkJaWYgKChpZCAmIFNXUl9ERVZfSURfTUFTSykgPT0gZGV2X2lkKSB7CisJCQlpZiAoc3dybV9nZXRfZGV2aWNlX3N0YXR1cyhzd3JtLCBpKSA9PSAweDAxKSB7CisJCQkJKmRldl9udW0gPSBpOworCQkJCXJldCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRldmljZSBpcyBub3QgcmVhZHlcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQl9CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRldmljZSBpZCAweCVsbHggZG9lcyBub3QgbWF0Y2ggd2l0aCAweCVsbHhcbiIsCisJCV9fZnVuY19fLCBpZCwgZGV2X2lkKTsKK2ZvdW5kOgorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJnN3cm0tPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJnN3cm0tPnBkZXYtPmRldik7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgc3dybV9tYXN0ZXJfaW5pdChzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgdmFsOworCXU4IHJvd19jdHJsID0gU1dSX01BWF9ST1c7CisJdTggY29sX2N0cmwgPSBTV1JfTUlOX0NPTDsKKwl1OCBzc3BfcGVyaW9kID0gMTsKKwl1OCByZXRyeV9jbWRfbnVtID0gMzsKKwl1MzIgcmVnW1NXUk1fTUFYX0lOSVRfUkVHXTsKKwl1MzIgdmFsdWVbU1dSTV9NQVhfSU5JVF9SRUddOworCWludCBsZW4gPSAwOworCisJLyogQ2xlYXIgUm93cyBhbmQgQ29scyAqLworCXZhbCA9ICgocm93X2N0cmwgPDwgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1JPV19DVFJMX1NIRlQpIHwKKwkJKGNvbF9jdHJsIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19DT0xfQ1RSTF9TSEZUKSB8CisJCShzc3BfcGVyaW9kIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19TU1BfUEVSSU9EX1NIRlQpKTsKKworCXJlZ1tsZW5dID0gU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0FERFIoMCk7CisJdmFsdWVbbGVuKytdID0gdmFsOworCisJLyogU2V0IEF1dG8gZW51bWVyYXRpb24gZmxhZyAqLworCXJlZ1tsZW5dID0gU1dSTV9FTlVNRVJBVE9SX0NGR19BRERSOworCXZhbHVlW2xlbisrXSA9IDE7CisKKwkvKiBNYXNrIHNvdW5kd2lyZSBpbnRlcnJ1cHRzICovCisJcmVnW2xlbl0gPSBTV1JNX0lOVEVSUlVQVF9NQVNLX0FERFI7CisJdmFsdWVbbGVuKytdID0gMHgxRkZGRDsKKworCS8qIENvbmZpZ3VyZSBObyBwaW5ncyAqLworCXZhbCA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX01DUF9DRkdfQUREUik7CisJdmFsICY9IH5TV1JNX01DUF9DRkdfTUFYX05VTV9PRl9DTURfTk9fUElOR1NfQk1TSzsKKwl2YWwgfD0gKDB4MWYgPDwgU1dSTV9NQ1BfQ0ZHX01BWF9OVU1fT0ZfQ01EX05PX1BJTkdTX1NIRlQpOworCXJlZ1tsZW5dID0gU1dSTV9NQ1BfQ0ZHX0FERFI7CisJdmFsdWVbbGVuKytdID0gdmFsOworCisJLyogQ29uZmlndXJlIG51bWJlciBvZiByZXRyaWVzIG9mIGEgcmVhZC93cml0ZSBjbWQgKi8KKwl2YWwgPSAocmV0cnlfY21kX251bSA8PCBTV1JNX0NNRF9GSUZPX0NGR19OVU1fT0ZfQ01EX1JFVFJZX1NIRlQpOworCXJlZ1tsZW5dID0gU1dSTV9DTURfRklGT19DRkdfQUREUjsKKwl2YWx1ZVtsZW4rK10gPSB2YWw7CisKKwkvKiBTZXQgSVJRIHRvIFBVTFNFICovCisJcmVnW2xlbl0gPSBTV1JNX0NPTVBfQ0ZHX0FERFI7CisJdmFsdWVbbGVuKytdID0gMHgwMjsKKworCXJlZ1tsZW5dID0gU1dSTV9DT01QX0NGR19BRERSOworCXZhbHVlW2xlbisrXSA9IDB4MDM7CisKKwlyZWdbbGVuXSA9IFNXUk1fSU5URVJSVVBUX0NMRUFSOworCXZhbHVlW2xlbisrXSA9IDB4MDg7CisKKwlzd3JtLT5idWxrX3dyaXRlKHN3cm0tPmhhbmRsZSwgcmVnLCB2YWx1ZSwgbGVuKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtOworCXN0cnVjdCBzd3JfY3RybF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldiwgKnNhZmU7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIHNvdW5kd2lyZSBtYXN0ZXIgZHJpdmVyIHN0cnVjdHVyZSAqLworCXN3cm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3dyX21zdHJfY3RybCksIEdGUF9LRVJORUwpOworCWlmICghc3dybSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW1vcnlfZmFpbDsKKwl9CisJc3dybS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlzd3JtLT5wZGV2ID0gcGRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzd3JtKTsKKwlzd3Jfc2V0X2N0cmxfZGF0YSgmc3dybS0+bWFzdGVyLCBzd3JtKTsKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcGRhdGEgZnJvbSBwYXJlbnQgaXMgTlVMTFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcGRhdGFfZmFpbDsKKwl9CisJc3dybS0+aGFuZGxlID0gKHZvaWQgKilwZGF0YS0+aGFuZGxlOworCWlmICghc3dybS0+aGFuZGxlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5oYW5kbGUgaXMgTlVMTFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcGRhdGFfZmFpbDsKKwl9CisJc3dybS0+cmVhZCA9IHBkYXRhLT5yZWFkOworCWlmICghc3dybS0+cmVhZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogc3dybS0+cmVhZCBpcyBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wZGF0YV9mYWlsOworCX0KKwlzd3JtLT53cml0ZSA9IHBkYXRhLT53cml0ZTsKKwlpZiAoIXN3cm0tPndyaXRlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT53cml0ZSBpcyBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wZGF0YV9mYWlsOworCX0KKwlzd3JtLT5idWxrX3dyaXRlID0gcGRhdGEtPmJ1bGtfd3JpdGU7CisJaWYgKCFzd3JtLT5idWxrX3dyaXRlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5idWxrX3dyaXRlIGlzIE5VTExcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3BkYXRhX2ZhaWw7CisJfQorCXN3cm0tPmNsayA9IHBkYXRhLT5jbGs7CisJaWYgKCFzd3JtLT5jbGspIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHN3cm0tPmNsayBpcyBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wZGF0YV9mYWlsOworCX0KKwlzd3JtLT5yZWdfaXJxID0gcGRhdGEtPnJlZ19pcnE7CisJaWYgKCFzd3JtLT5yZWdfaXJxKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5yZWdfaXJxIGlzIE5VTExcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3BkYXRhX2ZhaWw7CisJfQorCXN3cm0tPm1hc3Rlci5yZWFkID0gc3dybV9yZWFkOworCXN3cm0tPm1hc3Rlci53cml0ZSA9IHN3cm1fd3JpdGU7CisJc3dybS0+bWFzdGVyLmJ1bGtfd3JpdGUgPSBzd3JtX2J1bGtfd3JpdGU7CisJc3dybS0+bWFzdGVyLmdldF9sb2dpY2FsX2Rldl9udW0gPSBzd3JtX2dldF9sb2dpY2FsX2Rldl9udW07CisJc3dybS0+bWFzdGVyLmNvbm5lY3RfcG9ydCA9IHN3cm1fY29ubmVjdF9wb3J0OworCXN3cm0tPm1hc3Rlci5kaXNjb25uZWN0X3BvcnQgPSBzd3JtX2Rpc2Nvbm5lY3RfcG9ydDsKKwlzd3JtLT5tYXN0ZXIuc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wgPSBzd3JtX3NsdmRldl9kYXRhcGF0aF9jb250cm9sOworCXN3cm0tPm1hc3Rlci5yZW1vdmVfZnJvbV9ncm91cCA9IHN3cm1fcmVtb3ZlX2Zyb21fZ3JvdXA7CisJc3dybS0+bWFzdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXN3cm0tPm1hc3Rlci5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN3cm0tPm1hc3Rlci5udW1fcG9ydCA9IDA7CisJc3dybS0+bnVtX2VudW1fc2xhdmVzID0gMDsKKwlzd3JtLT5yY21kX2lkID0gMDsKKwlzd3JtLT53Y21kX2lkID0gMDsKKwlzd3JtLT5zbGF2ZV9zdGF0dXMgPSAwOworCXN3cm0tPm51bV9yeF9jaHMgPSAwOworCXN3cm0tPnN0YXRlID0gU1dSX01TVFJfUkVTVU1FOworCWluaXRfY29tcGxldGlvbigmc3dybS0+cmVzZXQpOworCWluaXRfY29tcGxldGlvbigmc3dybS0+YnJvYWRjYXN0KTsKKwltdXRleF9pbml0KCZzd3JtLT5tbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnN3cm0tPm1wb3J0X2xpc3QpOworCW11dGV4X2luaXQoJnN3cm0tPnJlc2xvY2spOworCisJcmV0ID0gc3dybS0+cmVnX2lycShzd3JtLT5oYW5kbGUsIHN3cl9tc3RyX2ludGVycnVwdCwgc3dybSwKKwkJCSAgICBTV1JfSVJRX1JFR0lTVEVSKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBJUlEgcmVnaXN0ZXIgZmFpbGVkIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9pcnFfZmFpbDsKKwl9CisKKwlyZXQgPSBzd3JfcmVnaXN0ZXJfbWFzdGVyKCZzd3JtLT5tYXN0ZXIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGVycm9yIGFkZGluZyBzd3IgbWFzdGVyXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX21zdHJfZmFpbDsKKwl9CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCW9mX3JlZ2lzdGVyX3N3cl9kZXZpY2VzKCZzd3JtLT5tYXN0ZXIpOworCisJLyogQWRkIGRldmljZXMgcmVnaXN0ZXJlZCB3aXRoIGJvYXJkLWluZm8gYXMgdGhlCisJICogY29udHJvbGxlciB3aWxsIGJlIHVwIG5vdworCSAqLworCXN3cl9tYXN0ZXJfYWRkX2JvYXJkZGV2aWNlcygmc3dybS0+bWFzdGVyKTsKKwltdXRleF9sb2NrKCZzd3JtLT5tbG9jayk7CisJc3dybV9jbGtfcmVxdWVzdChzd3JtLCB0cnVlKTsKKwlyZXQgPSBzd3JtX21hc3Rlcl9pbml0KHN3cm0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlczogRXJyb3IgaW4gbWFzdGVyIEluaXRpYWxpemFpdG9uLCBlcnIgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7CisJCWdvdG8gZXJyX21zdHJfZmFpbDsKKwl9CisKKwkvKiBFbnVtZXJhdGUgc2xhdmUgZGV2aWNlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzd3JfZGV2LCBzYWZlLCAmc3dybS0+bWFzdGVyLmRldmljZXMsCisJCQkJIGRldl9saXN0KSB7CisJCXJldCA9IHN3cl9zdGFydHVwX2RldmljZXMoc3dyX2Rldik7CisJCWlmIChyZXQpCisJCQlsaXN0X2RlbCgmc3dyX2Rldi0+ZGV2X2xpc3QpOworCX0KKwltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKKworCWRiZ3N3cm0gPSBzd3JtOworCWRlYnVnZnNfc3dybV9kZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKCZwZGV2LT5kZXYpLCAwKTsKKwlpZiAoIUlTX0VSUihkZWJ1Z2ZzX3N3cm1fZGVudCkpIHsKKwkJZGVidWdmc19wZWVrID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3dybV9wZWVrIiwKKwkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc19zd3JtX2RlbnQsCisJCQkJKHZvaWQgKikgInN3cm1fcGVlayIsICZzd3JtX2RlYnVnX29wcyk7CisKKwkJZGVidWdmc19wb2tlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3dybV9wb2tlIiwKKwkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc19zd3JtX2RlbnQsCisJCQkJKHZvaWQgKikgInN3cm1fcG9rZSIsICZzd3JtX2RlYnVnX29wcyk7CisKKwkJZGVidWdmc19yZWdfZHVtcCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN3cm1fcmVnX2R1bXAiLAorCQkJCSAgIFNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3N3cm1fZGVudCwKKwkJCQkgICAodm9pZCAqKSAic3dybV9yZWdfZHVtcCIsCisJCQkJICAgJnN3cm1fZGVidWdfb3BzKTsKKwl9CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJnBkZXYtPmRldiwgYXV0b19zdXNwZW5kX3RpbWVyKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworZXJyX21zdHJfZmFpbDoKKwlzd3JtLT5yZWdfaXJxKHN3cm0tPmhhbmRsZSwgc3dyX21zdHJfaW50ZXJydXB0LAorCQkJc3dybSwgU1dSX0lSUV9GUkVFKTsKK2Vycl9pcnFfZmFpbDoKK2Vycl9wZGF0YV9mYWlsOgorCWtmcmVlKHN3cm0pOworZXJyX21lbW9yeV9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc3dybS0+cmVnX2lycShzd3JtLT5oYW5kbGUsIHN3cl9tc3RyX2ludGVycnVwdCwKKwkJCXN3cm0sIFNXUl9JUlFfRlJFRSk7CisJaWYgKHN3cm0tPm1zdHJfcG9ydCkgeworCQlrZnJlZShzd3JtLT5tc3RyX3BvcnQtPnBvcnQpOworCQlzd3JtLT5tc3RyX3BvcnQtPnBvcnQgPSBOVUxMOworCQlrZnJlZShzd3JtLT5tc3RyX3BvcnQpOworCQlzd3JtLT5tc3RyX3BvcnQgPSBOVUxMOworCX0KKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZwZGV2LT5kZXYpOworCXN3cl91bnJlZ2lzdGVyX21hc3Rlcigmc3dybS0+bWFzdGVyKTsKKwltdXRleF9kZXN0cm95KCZzd3JtLT5tbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmc3dybS0+cmVzbG9jayk7CisJa2ZyZWUoc3dybSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3dybV9jbGtfcGF1c2Uoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0pCit7CisJdTMyIHZhbDsKKworCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6IHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKKwlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fSU5URVJSVVBUX01BU0tfQUREUiwgMHgxRkRGRCk7CisJdmFsID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0NGR19BRERSKTsKKwl2YWwgfD0gU1dSTV9NQ1BfQ0ZHX0JVU19DTEtfUEFVU0VfQk1TSzsKKwlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0NGR19BRERSLCB2YWwpOworCXN3cm0tPnN0YXRlID0gU1dSX01TVFJfUEFVU0U7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzd3JtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBwbV9ydW50aW1lOiByZXN1bWUsIHN0YXRlOiVkXG4iLAorCQlfX2Z1bmNfXywgc3dybS0+c3RhdGUpOworCW11dGV4X2xvY2soJnN3cm0tPnJlc2xvY2spOworCWlmICgoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfUEFVU0UpIHx8CisJICAgIChzd3JtLT5zdGF0ZSA9PSBTV1JfTVNUUl9ET1dOKSkgeworCQlpZiAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfRE9XTikgeworCQkJaWYgKHN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgdHJ1ZSkpCisJCQkJZ290byBleGl0OworCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dyX2RldiwgJm1zdHItPmRldmljZXMsIGRldl9saXN0KSB7CisJCQlyZXQgPSBzd3JfZGV2aWNlX3VwKHN3cl9kZXYpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGV2LAorCQkJCQkiJXM6IGZhaWxlZCB0byB3YWtldXAgc3dyIGRldiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOworCQkJCXN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgZmFsc2UpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfQorCQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fQ09NUF9TV19SRVNFVCwgMHgwMSk7CisJCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DT01QX1NXX1JFU0VULCAweDAxKTsKKwkJc3dybV9tYXN0ZXJfaW5pdChzd3JtKTsKKwl9CitleGl0OgorCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZwZGV2LT5kZXYsIGF1dG9fc3VzcGVuZF90aW1lcik7CisJbXV0ZXhfdW5sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN3cm1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBwbV9ydW50aW1lOiBzdXNwZW5kIHN0YXRlOiAlZFxuIiwKKwkJX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKKwltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwlpZiAoKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1JFU1VNRSkgfHwKKwkgICAgKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1VQKSkgeworCQlpZiAoc3dybV9pc19wb3J0X2VuKCZzd3JtLT5tYXN0ZXIpKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzIHBvcnRzIGFyZSBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJc3dybV9jbGtfcGF1c2Uoc3dybSk7CisJCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DT01QX0NGR19BRERSLCAweDAwKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJCXJldCA9IHN3cl9kZXZpY2VfZG93bihzd3JfZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKGRldiwKKwkJCQkJIiVzOiBmYWlsZWQgdG8gc2h1dGRvd24gc3dyIGRldiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfQorCQlzd3JtX2Nsa19yZXF1ZXN0KHN3cm0sIGZhbHNlKTsKKwl9CitleGl0OgorCW11dGV4X3VubG9jaygmc3dybS0+cmVzbG9jayk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBzd3JtX2RldmljZV9kb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBzd3JtIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKKwltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwlpZiAoKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1JFU1VNRSkgfHwKKwkgICAgKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1VQKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN3cl9kZXYsICZtc3RyLT5kZXZpY2VzLCBkZXZfbGlzdCkgeworCQkJcmV0ID0gc3dyX2RldmljZV9kb3duKHN3cl9kZXYpOworCQkJaWYgKHJldCkKKwkJCQlkZXZfZXJyKGRldiwKKwkJCQkJIiVzOiBmYWlsZWQgdG8gc2h1dGRvd24gc3dyIGRldiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOworCQl9CisJCWRldl9kYmcoZGV2LCAiJXM6IFNodXR0aW5nIGRvd24gU1dSTVxuIiwgX19mdW5jX18pOworCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJCXN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgZmFsc2UpOworCX0KKwltdXRleF91bmxvY2soJnN3cm0tPnJlc2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3dybV93Y2Rfbm90aWZ5IC0gcGFyZW50IGRldmljZSBjYW4gbm90aWZ5IHRvIHNvdW5kd2lyZSBtYXN0ZXIgdGhyb3VnaAorICogdGhpcyBmdW5jdGlvbgorICogQHBkZXY6IHBvaW50ZXIgdG8gcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZQorICogQGlkOiBjb21tYW5kIGlkIGZyb20gcGFyZW50IHRvIHRoZSBzb3VuZHdpcmUgbWFzdGVyCisgKiBAZGF0YTogZGF0YSBmcm9tIHBhcmVudCBkZXZpY2UgdG8gc291bmR3aXJlIG1hc3RlcgorICovCitpbnQgc3dybV93Y2Rfbm90aWZ5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHUzMiBpZCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0cjsKKwlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldjsKKworCWlmICghcGRldikgeworCQlwcl9lcnIoIiVzOiBwZGV2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIXN3cm0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHN3cm0gaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXN0ciA9ICZzd3JtLT5tYXN0ZXI7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBTV1JfQ0hfTUFQOgorCQlpZiAoIWRhdGEpIHsKKwkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHN3cm1fc2V0X2NoX21hcChzd3JtLCBkYXRhKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNXUl9ERVZJQ0VfRE9XTjoKKwkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogc3dyIG1hc3RlciBkb3duIGNhbGxlZFxuIiwgX19mdW5jX18pOworCQltdXRleF9sb2NrKCZzd3JtLT5tbG9jayk7CisJCWlmICgoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfUEFVU0UpIHx8CisJCSAgICAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfRE9XTikpCisJCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBTV1IgbWFzdGVyIGlzIGFscmVhZHkgRG93bjogJWRcbiIsCisJCQkJX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKKwkJZWxzZQorCQkJc3dybV9kZXZpY2VfZG93bigmcGRldi0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7CisJCWJyZWFrOworCWNhc2UgU1dSX0RFVklDRV9VUDoKKwkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogc3dyIG1hc3RlciB1cCBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfbG9jaygmc3dybS0+bWxvY2spOworCQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwkJaWYgKChzd3JtLT5zdGF0ZSA9PSBTV1JfTVNUUl9SRVNVTUUpIHx8CisJCSAgICAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfVVApKSB7CisJCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBTV1IgbWFzdGVyIGlzIGFscmVhZHkgVVA6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBzd3JtLT5zdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZwZGV2LT5kZXYpOworCQkJbXV0ZXhfdW5sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CisJCQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dyX2RldiwgJm1zdHItPmRldmljZXMsIGRldl9saXN0KSB7CisJCQkJcmV0ID0gc3dyX3Jlc2V0X2RldmljZShzd3JfZGV2KTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWRldl9lcnIoc3dybS0+ZGV2LAorCQkJCQkJIiVzOiBmYWlsZWQgdG8gcmVzZXQgc3dyIGRldmljZSAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBzd3JfZGV2LT5kZXZfbnVtKTsKKwkJCQkJc3dybV9jbGtfcmVxdWVzdChzd3JtLCBmYWxzZSk7CisJCQkJfQorCQkJfQorCQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmcGRldi0+ZGV2KTsKKwkJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCQl9CisJCW11dGV4X3VubG9jaygmc3dybS0+cmVzbG9jayk7CisJCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOworCQlicmVhazsKKwljYXNlIFNXUl9TRVRfTlVNX1JYX0NIOgorCQlpZiAoIWRhdGEpIHsKKwkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCW11dGV4X2xvY2soJnN3cm0tPm1sb2NrKTsKKwkJCXN3cm0tPm51bV9yeF9jaHMgPSAqKGludCAqKWRhdGE7CisJCQlpZiAoKHN3cm0tPm51bV9yeF9jaHMgPiAxKSAmJiAhc3dybS0+bnVtX2NmZ19kZXZzKSB7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywKKwkJCQkJCSAgICBkZXZfbGlzdCkgeworCQkJCQlyZXQgPSBzd3Jfc2V0X2RldmljZV9ncm91cChzd3JfZGV2LAorCQkJCQkJCQlTV1JfQlJPQURDQVNUKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWRldl9lcnIoc3dybS0+ZGV2LAorCQkJCQkJCSIlczogc2V0IG51bSBjaCBmYWlsZWRcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywKKwkJCQkJCSAgICBkZXZfbGlzdCkgeworCQkJCQlyZXQgPSBzd3Jfc2V0X2RldmljZV9ncm91cChzd3JfZGV2LAorCQkJCQkJCQlTV1JfR1JPVVBfTk9ORSk7CisJCQkJCWlmIChyZXQpCisJCQkJCQlkZXZfZXJyKHN3cm0tPmRldiwKKwkJCQkJCQkiJXM6IHNldCBudW0gY2ggZmFpbGVkXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJCQl9CisJCQl9CisJCQltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBzd3IgbWFzdGVyIHVua25vd24gaWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgaWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc3dybV93Y2Rfbm90aWZ5KTsKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBzd3JtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQgPSAtRUJVU1k7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gc3VzcGVuZCwgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3dybS0+c3RhdGUpOworCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldikgfHwgIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpIHsKKwkJcmV0ID0gc3dybV9ydW50aW1lX3N1c3BlbmQoZGV2KTsKKwkJaWYgKCFyZXQpIHsKKwkJCS8qCisJCQkgKiBTeW5jaHJvbml6ZSBydW50aW1lLXBtIGFuZCBzeXN0ZW0tcG0gc3RhdGVzOgorCQkJICogQXQgdGhpcyBwb2ludCwgd2UgYXJlIGFscmVhZHkgc3VzcGVuZGVkLiBJZgorCQkJICogcnVudGltZS1wbSBzdGlsbCB0aGlua3MgaXRzIGFjdGl2ZSwgdGhlbgorCQkJICogbWFrZSBzdXJlIGl0cyBzdGF0dXMgaXMgaW4gc3luYyB3aXRoIEhXCisJCQkgKiBzdGF0dXMuIFRoZSB0aHJlZSBiZWxvdyBjYWxscyBsZXQgdGhlCisJCQkgKiBydW50aW1lLXBtIGtub3cgdGhhdCB3ZSBhcmUgc3VzcGVuZGVkCisJCQkgKiBhbHJlYWR5IHdpdGhvdXQgcmUtaW52b2tpbmcgdGhlIHN1c3BlbmQKKwkJCSAqIGNhbGxiYWNrCisJCQkgKi8KKwkJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCQl9CisJfQorCWlmIChyZXQgPT0gLUVCVVNZKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBzb21lIGF1ZGlvIHN0cmVhbSBpcyBhY3RpdmUKKwkJICogZHVyaW5nIHN1c3BlbmQuIFdlIGRvbnQgd2FudCB0byByZXR1cm4gc3VzcGVuZCBmYWlsdXJlIGluCisJCSAqIHRoYXQgY2FzZSBzbyB0aGF0IGRpc3BsYXkgYW5kIHJlbGV2YW50IGNvbXBvbmVudHMgY2FuIHN0aWxsCisJCSAqIGdvIHRvIHN1c3BlbmQuCisJCSAqIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgZXJyb3IsIHRoZW4gaXQgc2hvdWxkIGJlIHBhc3NlZC1vbgorCQkgKiB0byBzeXN0ZW0gbGV2ZWwgc3VzcGVuZAorCQkgKi8KKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzd3JtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gcmVzdW1lLCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzd3JtLT5zdGF0ZSk7CisJaWYgKCFwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSB8fCAhcG1fcnVudGltZV9zdXNwZW5kKGRldikpIHsKKwkJcmV0ID0gc3dybV9ydW50aW1lX3Jlc3VtZShkZXYpOworCQlpZiAoIXJldCkgeworCQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCQkJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzd3JtX2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoCisJCXN3cm1fc3VzcGVuZCwKKwkJc3dybV9yZXN1bWUKKwkpCisJU0VUX1JVTlRJTUVfUE1fT1BTKAorCQlzd3JtX3J1bnRpbWVfc3VzcGVuZCwKKwkJc3dybV9ydW50aW1lX3Jlc3VtZSwKKwkJTlVMTAorCSkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN3cm1fZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20sc3dyLXdjZCIsCisJfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3dyX21zdHJfZHJpdmVyID0geworCS5wcm9iZSA9IHN3cm1fcHJvYmUsCisJLnJlbW92ZSA9IHN3cm1fcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gU1dSX1dDRF9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJnN3cm1fZGV2X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc3dybV9kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3dybV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3dyX21zdHJfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChzd3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3dybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN3cl9tc3RyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzd3JtX2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiV0NEIFNvdW5kV2lyZSBDb250cm9sbGVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnN3ci13Y2QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5oIGIvZHJpdmVycy9zb3VuZHdpcmUvc3dyLXdjZC1jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5MjMxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9TV1JfV0NEX0NUUkxfSAorI2RlZmluZSBfU1dSX1dDRF9DVFJMX0gKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oPgorCisjZGVmaW5lIFNXUl9NQVhfUk9XCQkwIC8qIFJvd3MgPSA0OCAqLworI2RlZmluZSBTV1JfTUFYX0NPTAkJNyAvKiBDb2xzID0gMTYgKi8KKyNkZWZpbmUgU1dSX01JTl9DT0wJCTAgLyogQ29scyA9IDIgKi8KKworI2RlZmluZSBTV1JfV0NEX05BTUUJInN3ci13Y2QiCisKKyNkZWZpbmUgU1dSX01TVFJfUE9SVF9MRU4JOCAvKiBOdW1iZXIgb2YgbWFzdGVyIHBvcnRzICovCisKK2VudW0geworCVNXUl9NU1RSX1BBVVNFLAorCVNXUl9NU1RSX1JFU1VNRSwKKwlTV1JfTVNUUl9VUCwKKwlTV1JfTVNUUl9ET1dOLAorfTsKKworZW51bSB7CisJU1dSX0lSUV9GUkVFLAorCVNXUl9JUlFfUkVHSVNURVIsCit9OworCitlbnVtIHsKKwlTV1JfREFDX1BPUlQsCisJU1dSX0NPTVBfUE9SVCwKKwlTV1JfQk9PU1RfUE9SVCwKKwlTV1JfVklTRU5TRV9QT1JULAorfTsKKworc3RydWN0IHVzZWNhc2UgeworCXU4IG51bV9wb3J0OworCXU4IG51bV9jaDsKKwl1MzIgY2hyYXRlOworfTsKKworc3RydWN0IHBvcnRfcGFyYW1zIHsKKwl1OCBzaTsKKwl1OCBvZmYxOworCXU4IG9mZjI7Cit9OworCitzdHJ1Y3Qgc3dybV9tcG9ydHMgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1OCBpZDsKK307CisKK3N0cnVjdCBzd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHsKKwl2b2lkICpoYW5kbGU7IC8qIGhvbGRzIHByaXYgZGF0YSAqLworCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7CisJaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7CisJaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOworCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7CisJaW50ICgqcmVnX2lycSkodm9pZCAqaGFuZGxlLCBpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpKGludCBpcnEsCisJCQl2b2lkICpkYXRhKSwgdm9pZCAqc3dyX2hhbmRsZSwgaW50IHR5cGUpOworfTsKKworc3RydWN0IHN3cl9tc3RyX2N0cmwgeworCXN0cnVjdCBzd3JfbWFzdGVyIG1hc3RlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlc291cmNlICpzdXBwbGllczsKKwlzdHJ1Y3QgY2xrICptY2xrOworCXN0cnVjdCBjb21wbGV0aW9uIHJlc2V0OworCXN0cnVjdCBjb21wbGV0aW9uIGJyb2FkY2FzdDsKKwlzdHJ1Y3QgbXV0ZXggbWxvY2s7CisJc3RydWN0IG11dGV4IHJlc2xvY2s7CisJdTggcmNtZF9pZDsKKwl1OCB3Y21kX2lkOworCXZvaWQgKmhhbmRsZTsgLyogU1dSIE1hc3RlciBoYW5kbGUgZnJvbSBjbGllbnQgZm9yIHJlYWQgYW5kIHdyaXRlcyAqLworCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7CisJaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7CisJaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOworCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7CisJaW50ICgqcmVnX2lycSkodm9pZCAqaGFuZGxlLCBpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpKGludCBpcnEsCisJCQl2b2lkICpkYXRhKSwgdm9pZCAqc3dyX2hhbmRsZSwgaW50IHR5cGUpOworCWludCBpcnE7CisJaW50IG51bV9lbnVtX3NsYXZlczsKKwlpbnQgc2xhdmVfc3RhdHVzOworCXN0cnVjdCBzd3JfbXN0cl9wb3J0ICptc3RyX3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCBtcG9ydF9saXN0OworCWludCBzdGF0ZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCBudW1fcnhfY2hzOworCXU4IG51bV9jZmdfZGV2czsKK307CisKKyNlbmRpZiAvKiBfU1dSX1dDRF9DVFJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL3N3cm1fcmVnaXN0ZXJzLmggYi9kcml2ZXJzL3NvdW5kd2lyZS9zd3JtX3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTIzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NvdW5kd2lyZS9zd3JtX3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMjAzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfU1dSTV9SRUdJU1RFUlNfSAorI2RlZmluZSBfU1dSTV9SRUdJU1RFUlNfSAorCisjZGVmaW5lIFNXUk1fQkFTRV9BRERSRVNTCQkJCTB4MDAKKworI2RlZmluZSBTV1JNX0NPTVBfQ0ZHX0FERFIJCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDAwNCkKKyNkZWZpbmUgU1dSTV9DT01QX0NGR19STVNLCQkJCTB4MworI2RlZmluZSBTV1JNX0NPTVBfQ0ZHX0lSUV9MRVZFTF9PUl9QVUxTRV9CTVNLCQkweDIKKyNkZWZpbmUgU1dSTV9DT01QX0NGR19JUlFfTEVWRUxfT1JfUFVMU0VfU0hGVAkJMHgxCisjZGVmaW5lIFNXUk1fQ09NUF9DRkdfRU5BQkxFX0JNU0sJCQkweDEKKyNkZWZpbmUgU1dSTV9DT01QX0NGR19FTkFCTEVfU0hGVAkJCTB4MAorCisjZGVmaW5lIFNXUk1fQ09NUF9TV19SRVNFVAkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDAwMDgpCisKKyNkZWZpbmUgU1dSTV9DT01QX1BBUkFNUwkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MTAwKQorI2RlZmluZSBTV1JNX0NPTVBfUEFSQU1TX0RPVVRfUE9SVFNfTUFTSwkweDAwMDAwMDFGCisjZGVmaW5lIFNXUk1fQ09NUF9QQVJBTVNfRElOX1BPUlRTX01BU0sJCTB4MDAwMDAzRTAKKyNkZWZpbmUgU1dSTV9DT01QX1BBUkFNU19XUl9GSUZPX0RFUFRICQkweDAwMDA3QzAwCisjZGVmaW5lIFNXUk1fQ09NUF9QQVJBTVNfUkRfRklGT19ERVBUSAkJMHgwMDBGODAwMAorI2RlZmluZSBTV1JNX0NPTVBfUEFSQU1TX0FVVE9fRU5VTV9TTEFWRVMJMHgwMEYwMDAwMAorI2RlZmluZSBTV1JNX0NPTVBfUEFSQU1TX0RBVEFfTEFORVMJCTB4MDcwMDAwMDAKKworCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVUwkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDAyMDApCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19STVNLCQkweDFGRkZECisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1NMQVZFX1BFTkRfSVJRCQkJMHgxCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19ORVdfU0xBVkVfQVRUQUNIRUQJCTB4MgorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQ0hBTkdFX0VOVU1fU0xBVkVfU1RBVFVTCQkweDQKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX01BU1RFUl9DTEFTSF9ERVQJCQkweDgKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JEX0ZJRk9fT1ZFUkZMT1cJCQkweDEwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19SRF9GSUZPX1VOREVSRkxPVwkJCTB4MjAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1dSX0NNRF9GSUZPX09WRVJGTE9XCQkweDQwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19DTURfRVJST1IJCQkJMHg4MAorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfRE9VVF9QT1JUX0NPTExJU0lPTgkJMHgxMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JFQURfRU5fUkRfVkFMSURfTUlTTUFUQ0gJCTB4MjAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19TUEVDSUFMX0NNRF9JRF9GSU5JU0hFRAkJMHg0MDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX05FV19TTEFWRV9BVVRPX0VOVU1fRklOSVNIRUQJMHg4MDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0FVVE9fRU5VTV9GQUlMRUQJCQkweDEwMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0FVVE9fRU5VTV9UQUJMRV9JU19GVUxMCQkweDIwMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0JVU19SRVNFVF9GSU5JU0hFRAkJMHg0MDAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19DTEtfU1RPUF9GSU5JU0hFRAkJCTB4ODAwMAorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfRVJST1JfUE9SVF9URVNUCQkJMHgxMDAwMAorCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQUREUgkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDAyMDQpCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfUk1TSwkJMHgxRkZGRgorCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfU0xBVkVfUEVORF9JUlFfQk1TSwkJCTB4MQorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1NMQVZFX1BFTkRfSVJRX1NIRlQJCQkweDAKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX05FV19TTEFWRV9BVFRBQ0hFRF9CTVNLCQkweDIKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19ORVdfU0xBVkVfQVRUQUNIRURfU0hGVAkJMHgxCisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DSEFOR0VfRU5VTV9TTEFWRV9TVEFUVVNfQk1TSwkweDQKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DSEFOR0VfRU5VTV9TTEFWRV9TVEFUVVNfU0hGVAkweDIKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX01BU1RFUl9DTEFTSF9ERVRfQk1TSwkJMHg4CisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfTUFTVEVSX0NMQVNIX0RFVF9TSEZUCQkweDMKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1JEX0ZJRk9fT1ZFUkZMT1dfQk1TSwkJMHgxMAorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1JEX0ZJRk9fT1ZFUkZMT1dfU0hGVAkJMHg0CisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19SRF9GSUZPX1VOREVSRkxPV19CTVNLCQkweDIwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfUkRfRklGT19VTkRFUkZMT1dfU0hGVAkJMHg1CisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19XUl9DTURfRklGT19PVkVSRkxPV19CTVNLCQkweDQwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfV1JfQ01EX0ZJRk9fT1ZFUkZMT1dfU0hGVAkJMHg2CisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DTURfRVJST1JfQk1TSwkJCTB4ODAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DTURfRVJST1JfU0hGVAkJCTB4NworCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfRE9VVF9QT1JUX0NPTExJU0lPTl9CTVNLCQkweDEwMAorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0RPVVRfUE9SVF9DT0xMSVNJT05fU0hGVAkJMHg4CisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19SRUFEX0VOX1JEX1ZBTElEX01JU01BVENIX0JNU0sJMHgyMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19SRUFEX0VOX1JEX1ZBTElEX01JU01BVENIX1NIRlQJMHg5CisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19TUEVDSUFMX0NNRF9JRF9GSU5JU0hFRF9CTVNLCTB4NDAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfU1BFQ0lBTF9DTURfSURfRklOSVNIRURfU0hGVAkweEEKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX05FV19TTEFWRV9BVVRPX0VOVU1fRklOSVNIRURfQk1TSwkweDgwMAorI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX05FV19TTEFWRV9BVVRPX0VOVU1fRklOSVNIRURfU0hGVAkweEIKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0FVVE9fRU5VTV9GQUlMRURfQk1TSwkJMHgxMDAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQVVUT19FTlVNX0ZBSUxFRF9TSEZUCQkweEMKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0FVVE9fRU5VTV9UQUJMRV9JU19GVUxMX0JNU0sJMHgyMDAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQVVUT19FTlVNX1RBQkxFX0lTX0ZVTExfU0hGVAkweEQKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0JVU19SRVNFVF9GSU5JU0hFRF9CTVNLCQkweDQwMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19CVVNfUkVTRVRfRklOSVNIRURfU0hGVAkJMHhFCisKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DTEtfU1RPUF9GSU5JU0hFRF9CTVNLCQkweDgwMDAKKyNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19DTEtfU1RPUF9GSU5JU0hFRF9TSEZUCQkweEYKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0VSUk9SX1BPUlRfVEVTVF9CTVNLCQkweDEwMDAwCisjZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfRVJST1JfUE9SVF9URVNUX1NIRlQJCTB4MTAKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVgJCQkJCTB4MTEKKworI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9DTEVBUgkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDAyMDgpCisKKyNkZWZpbmUgU1dSTV9DTURfRklGT19XUl9DTUQJCShTV1JNX0JBU0VfQUREUkVTUyArIDB4MDAwMDAzMDApCisjZGVmaW5lIFNXUk1fQ01EX0ZJRk9fV1JfQ01EX01BU0sJMHhGRkZGRkZGRgorI2RlZmluZSBTV1JNX0NNRF9GSUZPX1JEX0NNRAkJKFNXUk1fQkFTRV9BRERSRVNTICsgMHgwMDAwMDMwNCkKKyNkZWZpbmUgU1dSTV9DTURfRklGT19SRF9DTURfTUFTSwkweEZGRkZGRkYKKyNkZWZpbmUgU1dSTV9DTURfRklGT19DTUQJCShTV1JNX0JBU0VfQUREUkVTUyArIDB4MDAwMDAzMDgpCisjZGVmaW5lIFNXUk1fQ01EX0ZJRk9fU1RBVFVTCQkoU1dSTV9CQVNFX0FERFJFU1MgKyAweDAwMDAwMzBDKQorCisjZGVmaW5lIFNXUk1fQ01EX0ZJRk9fU1RBVFVTX1dSX0NNRF9GSUZPX0NOVF9NQVNLCTB4MUYwMAorI2RlZmluZSBTV1JNX0NNRF9GSUZPX1NUQVRVU19SRF9DTURfRklGT19DTlRfTUFTSwkweDdDMDAwMDAKKworI2RlZmluZSBTV1JNX0NNRF9GSUZPX0NGR19BRERSCQkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDAzMTQpCisjZGVmaW5lIFNXUk1fQ01EX0ZJRk9fQ0ZHX05VTV9PRl9DTURfUkVUUllfQk1TSwkJMHg3CisjZGVmaW5lIFNXUk1fQ01EX0ZJRk9fQ0ZHX05VTV9PRl9DTURfUkVUUllfU0hGVAkJMHgwCisKKyNkZWZpbmUgU1dSTV9DTURfRklGT19SRF9GSUZPX0FERFIJKFNXUk1fQkFTRV9BRERSRVNTICsgMHgwMDAwMDMxOCkKKworI2RlZmluZSBTV1JNX0VOVU1FUkFUT1JfQ0ZHX0FERFIJCShTV1JNX0JBU0VfQUREUkVTUysweDAwMDAwNTAwKQorI2RlZmluZSBTV1JNX0VOVU1FUkFUT1JfQ0ZHX0FVVE9fRU5VTV9FTl9CTVNLCQkweDEKKyNkZWZpbmUgU1dSTV9FTlVNRVJBVE9SX0NGR19BVVRPX0VOVU1fRU5fU0hGVAkJMHgwCisKKyNkZWZpbmUgU1dSTV9FTlVNRVJBVE9SX1NMQVZFX0RFVl9JRF8xKG0pICAgKFNXUk1fQkFTRV9BRERSRVNTKzB4NTMwKzB4OCptKQorI2RlZmluZSBTV1JNX0VOVU1FUkFUT1JfU0xBVkVfREVWX0lEXzIobSkgICAoU1dSTV9CQVNFX0FERFJFU1MrMHg1MzQrMHg4Km0pCisKKyNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0FERFIobSkgICAgKFNXUk1fQkFTRV9BRERSRVNTKzB4MTAxQysweDQwKm0pCisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19STVNLCQkJMHgwMGZmMDdmZgorI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfU0hGVAkJCTAKKyNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1NTUF9QRVJJT0RfQk1TSwkweGZmMDAwMAorI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfU1NQX1BFUklPRF9TSEZUCTE2CisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19QSEFTRV9CTVNLCQkweGY4MDAKKyNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1BIQVNFX1NIRlQJCTExCisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19DTEtfRElWX1ZBTFVFX0JNU0sJMHg3MDAKKyNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0NMS19ESVZfVkFMVUVfU0hGVAk4CisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19ST1dfQ1RSTF9CTVNLCQkweEY4CisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19ST1dfQ1RSTF9TSEZUCQkzCisjZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19DT0xfQ1RSTF9CTVNLCQkweDcKKyNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0NPTF9DVFJMX1NIRlQJCTAKKworI2RlZmluZSBTV1JNX01DUF9CVVNfQ1RSTF9BRERSCQkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDEwNDQpCisjZGVmaW5lIFNXUk1fTUNQX0JVU19DVFJMX0JVU19SRVNFVF9CTVNLCQkweDEKKyNkZWZpbmUgU1dSTV9NQ1BfQlVTX0NUUkxfQlVTX1JFU0VUX1NIRlQJCTB4MAorI2RlZmluZSBTV1JNX01DUF9CVVNfQ1RSTF9DTEtfU1RBUlRfQk1TSwkJMHgyCisjZGVmaW5lIFNXUk1fTUNQX0JVU19DVFJMX0NMS19TVEFSVF9TSEZUCQkweDEKKworI2RlZmluZSBTV1JNX01DUF9DRkdfQUREUgkJCShTV1JNX0JBU0VfQUREUkVTUysweDAwMDAxMDQ4KQorI2RlZmluZSBTV1JNX01DUF9DRkdfTUFYX05VTV9PRl9DTURfTk9fUElOR1NfQk1TSwkweDNFMDAwMAorI2RlZmluZSBTV1JNX01DUF9DRkdfTUFYX05VTV9PRl9DTURfTk9fUElOR1NfU0hGVAkweDExCisjZGVmaW5lIFNXUk1fTUNQX0NGR19CVVNfQ0xLX1BBVVNFX0JNU0sJCQkweDAyCisKKyNkZWZpbmUgU1dSTV9NQ1BfU1RBVFVTCQkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MTA0QykKKyNkZWZpbmUgU1dSTV9NQ1BfU1RBVFVTX0JBTktfTlVNX01BU0sJMHgwMQorCisjZGVmaW5lIFNXUk1fTUNQX1NMVl9TVEFUVVMJCShTV1JNX0JBU0VfQUREUkVTUysweDEwOTApCisjZGVmaW5lIFNXUk1fTUNQX1NMVl9TVEFUVVNfTUFTSwkweDAzCisKKyNkZWZpbmUgU1dSTV9EUF9QT1JUX0NUUkxfQkFOSyhuLCBtKQkJKFNXUk1fQkFTRV9BRERSRVNTICsgXAorCQkJCQkJCTB4MDAwMDExMjQgKyBcCisJCQkJCQkJMHgxMDAqKG4tMSkgKyBcCisJCQkJCQkJMHg0MCptKQorI2RlZmluZSBTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LX01BU0sJCTB4RkZGRkZGRkYKKyNkZWZpbmUgU1dSTV9EUF9QT1JUX0NUUkxfRU5fQ0hBTl9NQVNLCQkweEZGMDAwMDAwCisjZGVmaW5lIFNXUk1fRFBfUE9SVF9DVFJMX0VOX0NIQU5fU0hGVAkJMHgxOAorI2RlZmluZSBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQyX1NIRlQJCTB4MTAKKyNkZWZpbmUgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMV9TSEZUCQkweDA4CisjZGVmaW5lIFNXUk1fRFBfUE9SVF9DVFJMX1NBTVBMRV9JTlRFUlZBTAkweDAwCisKKy8qIFNvdW5kd2lyZSBTbGF2ZSBSZWdpc3RlciBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgU1dSU19CQVNFX0FERFJFU1MJCQkweDAwCisKKyNkZWZpbmUgU1dSU19EUF9SRUdfT0ZGU0VUKHBvcnQsIGJhbmspCQkoKDB4MTAwKnBvcnQpKygweDEwKmJhbmspKQorCisjZGVmaW5lIFNXUlNfRFBfQ0hBTk5FTF9FTkFCTEVfQkFOSyhuLCBtKQkoU1dSU19CQVNFX0FERFJFU1MgKyAweDEyMCArIFwKKwkJCQkJCSBTV1JTX0RQX1JFR19PRkZTRVQobiwgbSkpCisjZGVmaW5lIFNXUlNfRFBfU0FNUExFX0NPTlRST0xfMV9CQU5LKG4sIG0pCShTV1JTX0JBU0VfQUREUkVTUyArIDB4MTIyICsgXAorCQkJCQkJIFNXUlNfRFBfUkVHX09GRlNFVChuLCBtKSkKKyNkZWZpbmUgU1dSU19EUF9PRkZTRVRfQ09OVFJPTF8xX0JBTksobiwgbSkJKFNXUlNfQkFTRV9BRERSRVNTICsgMHgxMjQgKyBcCisJCQkJCQkgU1dSU19EUF9SRUdfT0ZGU0VUKG4sIG0pKQorI2RlZmluZSBTV1JTX0RQX09GRlNFVF9DT05UUk9MXzJfQkFOSyhuLCBtKQkoU1dSU19CQVNFX0FERFJFU1MgKyAweDEyNSArIFwKKwkJCQkJCSBTV1JTX0RQX1JFR19PRkZTRVQobiwgbSkpCisjZGVmaW5lIFNXUlNfRFBfSENPTlRST0xfQkFOSyhuLCBtKQkJKFNXUlNfQkFTRV9BRERSRVNTICsgMHgxMjYgKyBcCisJCQkJCQkgU1dSU19EUF9SRUdfT0ZGU0VUKG4sIG0pKQorI2RlZmluZSBTV1JTX0RQX0JMT0NLX0NPTlRST0xfM19CQU5LKG4sIG0pCShTV1JTX0JBU0VfQUREUkVTUyArIDB4MTI3ICsgXAorCQkJCQkJIFNXUlNfRFBfUkVHX09GRlNFVChuLCBtKSkKKyNkZWZpbmUgU1dSU19TQ1BfRlJBTUVfQ1RSTF9CQU5LKG0pCQkoU1dSU19CQVNFX0FERFJFU1MgKyAweDYwICsgXAorCQkJCQkJIDB4MTAqbSkKKyNkZWZpbmUgU1dSU19TQ1BfSE9TVF9DTEtfRElWMl9DVExfQkFOSyhtKQkoU1dSU19CQVNFX0FERFJFU1MgKyAweEUwICsgXAorCQkJCQkJMHgxMCptKQorCisjZW5kaWYgLyogX1NXUk1fUkVHSVNURVJTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxhdWRpby1leHQtY2xrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sYXVkaW8tZXh0LWNsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTgyODYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sYXVkaW8tZXh0LWNsay5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQVVESU9fRVhUX0NMS19ICisjZGVmaW5lIF9fQVVESU9fRVhUX0NMS19ICisKKy8qIEF1ZGlvIEV4dGVybmFsIENsb2NrcyAqLworI2lmZGVmIENPTkZJR19DT01NT05fQ0xLX1FDT00KKyNkZWZpbmUgQVVESU9fUE1JX0NMSwkJMAorI2RlZmluZSBBVURJT19QTUlDX0xOQkJfQ0xLCTEKKyNkZWZpbmUgQVVESU9fQVBfQ0xLCQkyCisjZGVmaW5lIEFVRElPX0FQX0NMSzIJCTMKKyNkZWZpbmUgQVVESU9fTFBBU1NfTUNMSwk0CisjZGVmaW5lIEFVRElPX0xQQVNTX01DTEsyCTUKKyNlbHNlCisjZGVmaW5lIGNsa19hdWRpb19hcF9jbGsgICAgICAgIDB4OWI1NzI3Y2IKKyNkZWZpbmUgY2xrX2F1ZGlvX3BtaV9jbGsgICAgICAgMHhjYmZlNDE2ZAorI2RlZmluZSBjbGtfYXVkaW9fYXBfY2xrMiAgICAgICAweDQ1NGQxZTkxCisjZGVmaW5lIGNsa19hdWRpb19scGFzc19tY2xrICAgIDB4ZjBmMmEyODQKKyNkZWZpbmUgY2xrX2F1ZGlvX3BtaV9sbmJiX2NsayAgIDB4NTczMTIzNDMKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiMThmZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NRkRfQ0RDX1BJTkNUUkxfSF8KKyNkZWZpbmUgX19NRkRfQ0RDX1BJTkNUUkxfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2lmZGVmIENPTkZJR19NU01fQ0RDX1BJTkNUUkwKK2V4dGVybiBpbnQgbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBpbnQgbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gYm9vbCBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIGludCBtc21fY2RjX2dldF9ncGlvX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworCisjZWxzZQoraW50IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXJldHVybiAwOworfQoraW50IG1zbV9jZGNfZ2V0X2dwaW9fc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gMDsKK30KKyMKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21zbS1jZGMtc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L21mZC9tc20tY2RjLXN1cHBseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGY0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tc20tY2RjLXN1cHBseS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ09ERUNfUE9XRVJfU1VQUExZX0hfXworI2RlZmluZSBfX0NPREVDX1BPV0VSX1NVUFBMWV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworc3RydWN0IGNkY19yZWd1bGF0b3IgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG1pbl91VjsKKwlpbnQgbWF4X3VWOworCWludCBvcHRpbXVtX3VBOworCWJvb2wgb25kZW1hbmQ7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworfTsKKworZXh0ZXJuIGludCBtc21fY2RjX2dldF9wb3dlcl9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKipjZGNfdnJlZywKKwkJCQkgICAgICBpbnQgKnRvdGFsX251bV9zdXBwbGllcyk7CitleHRlcm4gaW50IG1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCisJCQkJCXN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKKwkJCQkJaW50IG51bV9zdXBwbGllcyk7CitleHRlcm4gaW50IG1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllcywKKwkJCQkgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAorCQkJCSAgICBpbnQgbnVtX3N1cHBsaWVzKTsKK2V4dGVybiBpbnQgbXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCisJCQkJCSAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAorCQkJCQkgIGludCBudW1fc3VwcGxpZXMpOworZXh0ZXJuIGludCBtc21fY2RjX2luaXRfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqKnN1cHBsaWVzLAorCQkJCSBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3ZyZWcsCisJCQkJIGludCBudW1fc3VwcGxpZXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzM1L3JlZ2lzdGVycy5oIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA0MzBkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDEzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9XQ0Q5MzM1X1JFR0lTVEVSU19ICisjZGVmaW5lIF9XQ0Q5MzM1X1JFR0lTVEVSU19ICisKKyNkZWZpbmUgV0NEOTMzNV9QQUdFX1NJWkUgMjU2CisjZGVmaW5lIFdDRDkzMzVfTlVNX1BBR0VTIDI1NgorCitleHRlcm4gY29uc3QgdTggKndjZDkzMzVfcmVnW1dDRDkzMzVfTlVNX1BBR0VTXTsKKworZW51bSB7CisJUEFHRV8wID0gMCwKKwlQQUdFXzEsCisJUEFHRV8yLAorCVBBR0VfNiA9IDYsCisJUEFHRV8xMCA9IDB4QSwKKwlQQUdFXzExLAorCVBBR0VfMTIsCisJUEFHRV8xMywKKwlQQUdFXzBYODAsCit9OworCisvKiBQYWdlLTAgUmVnaXN0ZXJzICovCisjZGVmaW5lIFdDRDkzMzVfUEFHRTBfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRyAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwgICAgICAgICAgICAgMHgwMDExCisjZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8xICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9ERUVQU0xQXzIgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMyAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfSVJBTV9TSFVURE9XTiAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMV9TSFVURE9XTiAgICAgICAgIDB4MDAxNgorI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzEgICAgICAgMHgwMDE3CisjZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMiAgICAgICAweDAwMTgKKyNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxZAorI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgwMDFlCisjZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAweDAwMWYKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwICAgICAgICAgICAgIDB4MDAyMQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTEgICAgICAgICAgICAgMHgwMDIyCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMiAgICAgICAgICAgICAweDAwMjMKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUzICAgICAgICAgICAgIDB4MDAyNAorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCAgICAgICAgICAgICAgICAgMHgwMDI1CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDAgICAgICAgICAgICAgICAweDAwMjYKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMSAgICAgICAgICAgICAgIDB4MDAyNworI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQwICAgICAgICAgICAgMHgwMDI5CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEgICAgICAgICAgICAweDAwMmEKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMiAgICAgICAgICAgIDB4MDAyYgorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQzICAgICAgICAgICAgMHgwMDJjCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDQgICAgICAgICAgICAweDAwMmQKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNSAgICAgICAgICAgIDB4MDAyZQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ2ICAgICAgICAgICAgMHgwMDJmCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDcgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOCAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ5ICAgICAgICAgICAgMHgwMDMyCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEwICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTEgICAgICAgICAgIDB4MDAzNAorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMiAgICAgICAgICAgMHgwMDM1CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEzICAgICAgICAgICAweDAwMzYKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTQgICAgICAgICAgIDB4MDAzNworI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSAgICAgICAgICAgMHgwMDM4CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTICAgICAgICAgICAgICAweDAwMzkKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfTk9OTkVHTyAgICAgIDB4MDAzYQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8xICAgICAgICAgICAgMHgwMDNiCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIgICAgICAgICAgICAweDAwM2MKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMyAgICAgICAgICAgIDB4MDAzZAorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0FOQV9XQUlUX1NUQVRFX0NUTCAgICAgICAgMHgwMDNlCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSAgICAgICAgICAgICAgICAweDAwM2YKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMV9NT05fQ1RMICAgICAgICAgICAgIDB4MDA0MQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9TVEFUVVMgICAgICAgICAgMHgwMDQyCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NOVF9NU0IgICAgICAgICAweDAwNDMKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMV9NT05fQ05UX0xTQiAgICAgICAgIDB4MDA0NAorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DVEwgICAgICAgICAgICAgMHgwMDQ1CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX1NUQVRVUyAgICAgICAgICAweDAwNDYKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fQ05UX01TQiAgICAgICAgIDB4MDA0NworI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DTlRfTFNCICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NUTCAgICAgICAgICAgICAweDAwNDkKKyNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DM19NT05fU1RBVFVTICAgICAgICAgIDB4MDA0YQorI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9DTlRfTVNCICAgICAgICAgMHgwMDRiCisjZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9MU0IgICAgICAgICAweDAwNGMKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWF9JMlNfQ1RMICAgICAgICAgICAgIDB4MDA1MQorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19DVEwgICAgICAgICAgICAgMHgwMDUyCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfSTJTX0NMSyAgICAgICAgICAgICAgICAweDAwNTMKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDBfSU5QX0NGRyAgICAgICAgICAgIDB4MDA1NAorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMV9JTlBfQ0ZHICAgICAgICAgICAgMHgwMDU1CisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgyX0lOUF9DRkcgICAgICAgICAgICAweDAwNTYKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDNfSU5QX0NGRyAgICAgICAgICAgIDB4MDA1NworI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYNF9JTlBfQ0ZHICAgICAgICAgICAgMHgwMDU4CisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg1X0lOUF9DRkcgICAgICAgICAgICAweDAwNTkKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDZfSU5QX0NGRyAgICAgICAgICAgIDB4MDA1YQorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYN19JTlBfQ0ZHICAgICAgICAgICAgMHgwMDViCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcgICAgICAgICAweDAwNjEKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDFfSU5QX0NGRyAgICAgICAgIDB4MDA2MgorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMl9JTlBfQ0ZHICAgICAgICAgMHgwMDYzCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcgICAgICAgICAweDAwNjQKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDRfSU5QX0NGRyAgICAgICAgIDB4MDA2NQorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYNV9JTlBfQ0ZHICAgICAgICAgMHgwMDY2CisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcgICAgICAgICAweDAwNjcKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDdfSU5QX0NGRyAgICAgICAgIDB4MDA2OAorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYOF9JTlBfQ0ZHICAgICAgICAgMHgwMDY5CisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcgICAgICAgICAweDAwNmEKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEwX0lOUF9DRkcgICAgICAgIDB4MDA2YgorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRyAgICAgICAgMHgwMDZjCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHICAgICAgICAweDAwNmUKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDE0X0lOUF9DRkcgICAgICAgIDB4MDA2ZgorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRyAgICAgICAgMHgwMDcwCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMF9MX0NGRyAgICAgICAweDAwNzEKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX1JfQ0ZHICAgICAgIDB4MDA3MgorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfTF9DRkcgICAgICAgMHgwMDczCisjZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9SX0NGRyAgICAgICAweDAwNzQKKyNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9OQVRJVkVfRklGT19TWU5DICAgICAgICAgICAgICAgIDB4MDA3NQorI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NUQVRVUyAgICAgICAgICAgICAgMHgwMDdECisjZGVmaW5lIFdDRDkzMzVfSU5UUl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODEKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX0NMUl9DT01NSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MgorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDg5CisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX01BU0sxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOGEKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4YgorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDhjCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTEKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfU1RBVFVTMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MgorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkzCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzMgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTQKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5OQorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDlhCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOWIKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5YworI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGExCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX01BU0sxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTIKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhMworI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGE0CisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTkKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfU1RBVFVTMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhYQorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGFiCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMgICAgICAgICAgICAgICAgICAgICAgICAweDAwYWMKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfQ0xFQVIwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiMQorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIyCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjMKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfQ0xFQVIzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNAorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfTEVWRUwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUxCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9MRVZFTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTIKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX0xFVkVMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMworI2RlZmluZSBXQ0Q5MzM1X0lOVFJfTEVWRUwzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGU0CisjZGVmaW5lIFdDRDkzMzVfSU5UUl9CWVBBU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTkKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX0JZUEFTUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlYQorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfQllQQVNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGViCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9CWVBBU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZWMKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1NFVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMQorI2RlZmluZSBXQ0Q5MzM1X0lOVFJfU0VUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYyCisjZGVmaW5lIFdDRDkzMzVfSU5UUl9TRVQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjMKKyNkZWZpbmUgV0NEOTMzNV9JTlRSX1NFVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmNAorCisvKiBQYWdlLTEgUmVnaXN0ZXJzICovCisjZGVmaW5lIFdDRDkzMzVfUEFHRTFfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAyCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNworI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA4CisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF84ICAgICAgICAgICAgICAgICAgICAgICAweDAxMDkKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzkgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwYQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBiCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAweDAxMGMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wICAgICAgICAgICAgICAgICAgIDB4MDEwZAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzEgICAgICAgICAgICAgICAgICAgMHgwMTBlCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAweDAxMGYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMSAgICAgICAgICAgICAgICAgICAgIDB4MDExMAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfQ09ORklHX0NUTF8yICAgICAgICAgICAgICAgICAgICAgMHgwMTExCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAweDAxMTIKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfNCAgICAgICAgICAgICAgICAgICAgIDB4MDExMworI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE0CisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxMTUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDExNgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE3CisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAxMTgKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDExOQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFhCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAweDAxMWIKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExYworI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfRlJFUV9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFkCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAxMWUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDExZgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1NDX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIwCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1NDX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIzCisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI2CisjZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjcKKyNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyOAorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQxCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxNDIKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0MworI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ0CisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAxNDUKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0NgorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ3CisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAweDAxNDgKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzggICAgICAgICAgICAgICAgICAgICAgIDB4MDE0OQorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTRhCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9MX1ZBTF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAweDAxNGIKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDE0YworI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgMHgwMTRkCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMSAgICAgICAgICAgICAgICAgICAweDAxNGUKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMCAgICAgICAgICAgICAgICAgICAgIDB4MDE0ZgorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgMHgwMTUwCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAweDAxNTEKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMyAgICAgICAgICAgICAgICAgICAgIDB4MDE1MgorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgMHgwMTUzCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAweDAxNTQKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NQorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU2CisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAxNTcKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1OAorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU5CisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAweDAxNWEKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1YgorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVjCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxNWQKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1ZQorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVmCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjAKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MQorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTYyCisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjMKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0ZMTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NAorI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY1CisjZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjYKKyNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NworI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY4CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODEKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MgorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTgzCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAxODQKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NQorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg2CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAweDAxODcKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4OAorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF84ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg5CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzkgICAgICAgICAgICAgICAgICAgICAgICAweDAxOGEKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfTF9WQUxfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4YgorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9MX1ZBTF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMThjCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0RTTV9GUkFDX0NUTF8wICAgICAgICAgICAgICAgICAgICAweDAxOGQKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEgICAgICAgICAgICAgICAgICAgIDB4MDE4ZQorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9DT05GSUdfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMThmCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMSAgICAgICAgICAgICAgICAgICAgICAweDAxOTAKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8yICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MQorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9DT05GSUdfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMTkyCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfNCAgICAgICAgICAgICAgICAgICAgICAweDAxOTMKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NAorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk1CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTYKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NworI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk4CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTkKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5YQorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTliCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWMKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5ZAorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTllCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWYKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMAorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWExCisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTIKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMworI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9GTExfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE0CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTUKKyNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNgorI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE3CisjZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1NUQVRVU18zICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTgKKworLyogUGFnZS0yIFJlZ2lzdGVycyAqLworI2RlZmluZSBXQ0Q5MzM1X1BBR0UyX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDgKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwOQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS180ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBhCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzUgICAgICAgICAgICAgICAgICAgICAgICAweDAyMGIKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwYworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS183ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBkCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzggICAgICAgICAgICAgICAgICAgICAgICAweDAyMGUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwZgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEwCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzExICAgICAgICAgICAgICAgICAgICAgICAweDAyMTEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTIgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEzCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzE0ICAgICAgICAgICAgICAgICAgICAgICAweDAyMTQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTUgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfVFJHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE2CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl9UUkcgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTcKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxOAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE5CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxYgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFjCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxZQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFmCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV84ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjAKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIyCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzEyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyNAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjI1CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyNworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjI4CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjkKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyYQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJiCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMmMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV81ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyZAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJlCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMmYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV84ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjMxCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMTAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzIKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjM0CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMTMgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzNgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjM3CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzgKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzOQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjNhCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyM2IKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzYworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjNkCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl82ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyM2UKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzZgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQwCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl85ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0MgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQzCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0NQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQ2CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDcKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0OAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQ5CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNGEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0YgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjRjCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNGQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl82ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0ZQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjRmCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfOCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNTAKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl85ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1MQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjUyCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMTEgICAgICAgICAgICAgICAgICAgICAgICAweDAyNTMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1NAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEzICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjU1CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMTQgICAgICAgICAgICAgICAgICAgICAgICAweDAyNTYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1NworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxX0FDSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjU4CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfQUNLICAgICAgICAgICAgICAgICAgICAgICAweDAyNTkKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfRUNfQlVGX0lOVF9QRVJJT0QgICAgICAgICAgICAgICAgIDB4MDI1YQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19VU19CVUZfSU5UX1BFUklPRCAgICAgICAgICAgICAgICAgMHgwMjViCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QgICAgICAgICAweDAyNWMKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1ZAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19VU19FQ19NVVhfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMjVlCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01BRF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNWYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI2MAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19UWF9QUF9CVUZfSU5UX1BFUklPRCAgICAgICAgICAgICAgMHgwMjYxCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNjIKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfRE1JQzBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI2MworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjY0CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0RNSUMyX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNjUKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfRE1JQ19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI2NgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TVkFfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjY3CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0NQQVJfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNzEKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfV0RPR19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI3MgorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19CQUNLVVBfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjczCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNzQKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfQ1BFX09DRF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDI3NQorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMjc2CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAweDAyNzcKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSICAgICAgICAgICAgICAgIDB4MDI3OAorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjgxCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAyODIKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDI4MworI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMjg0CisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMyAgICAgICAgICAgICAgICAgICAgICAweDAyODUKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF80ICAgICAgICAgICAgICAgICAgICAgIDB4MDI4NgorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgMHgwMjg3CisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNiAgICAgICAgICAgICAgICAgICAgICAweDAyODgKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF83ICAgICAgICAgICAgICAgICAgICAgIDB4MDI4OQorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzggICAgICAgICAgICAgICAgICAgICAgMHgwMjhhCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUiAgICAgICAgICAgICAgICAweDAyOGIKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMICAgICAgICAgICAgICAgIDB4MDI4YworI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjhkCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAyOGUKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4ZgorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkwCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAweDAyOTEKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5MgorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkzCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzEgICAgICAgICAgICAgICAgICAgICAweDAyOTQKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMiAgICAgICAgICAgICAgICAgICAgIDB4MDI5NQorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8zICAgICAgICAgICAgICAgICAgICAgMHgwMjk2CisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzQgICAgICAgICAgICAgICAgICAgICAweDAyOTcKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNSAgICAgICAgICAgICAgICAgICAgIDB4MDI5OAorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF82ICAgICAgICAgICAgICAgICAgICAgMHgwMjk5CisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzcgICAgICAgICAgICAgICAgICAgICAweDAyOWEKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfOCAgICAgICAgICAgICAgICAgICAgIDB4MDI5YgorI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSICAgICAgICAgICAgICAgMHgwMjljCisjZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fSUlSX0NUTF9WQUwgICAgICAgICAgICAgICAweDAyOWQKKyNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0lOUF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5ZQorCisvKiBQYWdlLTYgUmVnaXN0ZXJzICovCisjZGVmaW5lIFdDRDkzMzVfUEFHRTZfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAweDA2MDAKKyNkZWZpbmUgV0NEOTMzNV9BTkFfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMQorI2RlZmluZSBXQ0Q5MzM1X0FOQV9DTEtfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAyCisjZGVmaW5lIFdDRDkzMzVfQU5BX1JDTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDMKKyNkZWZpbmUgV0NEOTMzNV9BTkFfQlVDS19WT1VUX0EgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNAorI2RlZmluZSBXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA1CisjZGVmaW5lIFdDRDkzMzVfQU5BX0JVQ0tfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDYKKyNkZWZpbmUgV0NEOTMzNV9BTkFfQlVDS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNworI2RlZmluZSBXQ0Q5MzM1X0FOQV9SWF9TVVBQTElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA4CisjZGVmaW5lIFdDRDkzMzVfQU5BX0hQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDkKKyNkZWZpbmUgV0NEOTMzNV9BTkFfRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwYQorI2RlZmluZSBXQ0Q5MzM1X0FOQV9MT18xXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBiCisjZGVmaW5lIFdDRDkzMzVfQU5BX0xPXzNfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGMKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUFEX1NFVFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwZAorI2RlZmluZSBXQ0Q5MzM1X0FOQV9BTUlDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBlCisjZGVmaW5lIFdDRDkzMzVfQU5BX0FNSUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGYKKyNkZWZpbmUgV0NEOTMzNV9BTkFfQU1JQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMAorI2RlZmluZSBXQ0Q5MzM1X0FOQV9BTUlDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjExCisjZGVmaW5lIFdDRDkzMzVfQU5BX0FNSUM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTIKKyNkZWZpbmUgV0NEOTMzNV9BTkFfQU1JQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMworI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE0CisjZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTUKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19aREVUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgorI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE3CisjZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzIgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTgKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxOQorI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFhCisjZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlROMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWIKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19CVE4yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxYworI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFkCisjZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlRONCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWUKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19CVE41ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxZgorI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIwCisjZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlRONyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjEKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUlDQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMgorI2RlZmluZSBXQ0Q5MzM1X0FOQV9NSUNCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIzCisjZGVmaW5lIFdDRDkzMzVfQU5BX01JQ0IyX1JBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjQKKyNkZWZpbmUgV0NEOTMzNV9BTkFfTUlDQjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNQorI2RlZmluZSBXQ0Q5MzM1X0FOQV9NSUNCNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI2CisjZGVmaW5lIFdDRDkzMzVfQU5BX1ZCQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjcKKyNkZWZpbmUgV0NEOTMzNV9CSUFTX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyOAorI2RlZmluZSBXQ0Q5MzM1X0JJQVNfVkJHX0ZJTkVfQURKICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI5CisjZGVmaW5lIFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MmQKKyNkZWZpbmUgV0NEOTMzNV9SQ09fQ1RSTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyZQorI2RlZmluZSBXQ0Q5MzM1X1JDT19DVFJMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjJmCisjZGVmaW5lIFdDRDkzMzVfUkNPX0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzAKKyNkZWZpbmUgV0NEOTMzNV9SQ09fQ0FMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzMQorI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjMyCisjZGVmaW5lIFdDRDkzMzVfUkNPX1RFU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzMKKyNkZWZpbmUgV0NEOTMzNV9SQ09fQ0FMX09VVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNAorI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfT1VUXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM1CisjZGVmaW5lIFdDRDkzMzVfUkNPX0NBTF9PVVRfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzYKKyNkZWZpbmUgV0NEOTMzNV9SQ09fQ0FMX09VVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNworI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfT1VUXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM4CisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX01PREVfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2EKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzYgorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNjCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX01PREVfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2QKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fVkNMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzZQorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNmCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX1ZDTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDAKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0MQorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQyCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDMKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NAorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ1CisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDYKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NworI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ4CisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF85ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDkKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzEwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0YQorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19GSUxURVJfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRiCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8yICAgICAgICAgICAgICAgICAgICAgICAweDA2NGMKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0ZAorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRlCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8zICAgICAgICAgICAgICAgICAgICAgICAweDA2NGYKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0FMX0NPREVfRVhUXzEgICAgICAgICAgICAgICAgIDB4MDY1MAorI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMiAgICAgICAgICAgICAgICAgMHgwNjUxCisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX09VVF8xICAgICAgICAgICAgICAgICAweDA2NTIKKyNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0FMX0NPREVfT1VUXzIgICAgICAgICAgICAgICAgIDB4MDY1MworI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU0CisjZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX1RFU1RfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTUKKyNkZWZpbmUgV0NEOTMzNV9NQkhDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1NgorI2RlZmluZSBXQ0Q5MzM1X01CSENfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU3CisjZGVmaW5lIFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDA2NTgKKyNkZWZpbmUgV0NEOTMzNV9NQkhDX1pERVRfQU5BX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1OQorI2RlZmluZSBXQ0Q5MzM1X01CSENfWkRFVF9SQU1QX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVhCisjZGVmaW5lIFdDRDkzMzVfTUJIQ19GU01fREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWIgLyogdjEueCAqLworI2RlZmluZSBXQ0Q5MzM1X01CSENfRlNNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjViIC8qIHYyLjAgKi8KKyNkZWZpbmUgV0NEOTMzNV9NQkhDX1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1YworI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVkCisjZGVmaW5lIFdDRDkzMzVfVkJBRENfSUJJQVNfRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWUKKyNkZWZpbmUgV0NEOTMzNV9WQkFEQ19CSUFTX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1ZgorI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjYwCisjZGVmaW5lIFdDRDkzMzVfVkJBRENfQURDX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjEKKyNkZWZpbmUgV0NEOTMzNV9WQkFEQ19BRENfSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2MgorI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0FEQ19TQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjYzCisjZGVmaW5lIFdDRDkzMzVfVkJBRENfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjQKKyNkZWZpbmUgV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2NQorI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY2CisjZGVmaW5lIFdDRDkzMzVfTERPSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjcKKyNkZWZpbmUgV0NEOTMzNV9MRE9IX0JJQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2OAorI2RlZmluZSBXQ0Q5MzM1X0xET0hfU1RCX0xPQURTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY5CisjZGVmaW5lIFdDRDkzMzVfTERPSF9TTE9XUkFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmEKKyNkZWZpbmUgV0NEOTMzNV9NSUNCMV9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2YgorI2RlZmluZSBXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZjCisjZGVmaW5lIFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmQKKyNkZWZpbmUgV0NEOTMzNV9NSUNCMl9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2ZQorI2RlZmluZSBXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZmCisjZGVmaW5lIFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzAKKyNkZWZpbmUgV0NEOTMzNV9NSUNCM19URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MQorI2RlZmluZSBXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjcyCisjZGVmaW5lIFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzMKKyNkZWZpbmUgV0NEOTMzNV9NSUNCNF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NAorI2RlZmluZSBXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc1CisjZGVmaW5lIFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzYKKyNkZWZpbmUgV0NEOTMzNV9UWF9DT01fQURDX1ZDTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NworI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9CSUFTX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc4CisjZGVmaW5lIFdDRDkzMzVfVFhfQ09NX0FEQ19JTlQxX0lCICAgICAgICAgICAgICAgICAgICAgICAweDA2NzkKKyNkZWZpbmUgV0NEOTMzNV9UWF9DT01fQURDX0lOVDJfSUIgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3YQorI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwNjdiCisjZGVmaW5lIFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX1NUQVJUICAgICAgICAgICAgICAgICAgICAweDA2N2MKKyNkZWZpbmUgV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNICAgICAgICAgICAgICAgIDB4MDY3ZAorI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzEyUDI4OE0gICAgICAgICAgICAgMHgwNjdlCisjZGVmaW5lIFdDRDkzMzVfVFhfMV8yX1RFU1RfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2N2YKKyNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfQURDX0lCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MAorI2RlZmluZSBXQ0Q5MzM1X1RYXzFfMl9BVEVTVF9SRUZDVEwgICAgICAgICAgICAgICAgICAgICAgMHgwNjgxCisjZGVmaW5lIFdDRDkzMzVfVFhfMV8yX1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODIKKyNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfVEVTVF9CTEtfRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MworI2RlZmluZSBXQ0Q5MzM1X1RYXzFfMl9UWEZFX0NMS0RJViAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg0CisjZGVmaW5lIFdDRDkzMzVfVFhfMV8yX1NBUjFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODUKKyNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfU0FSMl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4NgorI2RlZmluZSBXQ0Q5MzM1X1RYXzNfNF9URVNUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg3CisjZGVmaW5lIFdDRDkzMzVfVFhfM180X0FEQ19JQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODgKKyNkZWZpbmUgV0NEOTMzNV9UWF8zXzRfQVRFU1RfUkVGQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MDY4OQorI2RlZmluZSBXQ0Q5MzM1X1RYXzNfNF9URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhhCisjZGVmaW5lIFdDRDkzMzVfVFhfM180X1RFU1RfQkxLX0VOICAgICAgICAgICAgICAgICAgICAgICAweDA2OGIKKyNkZWZpbmUgV0NEOTMzNV9UWF8zXzRfVFhGRV9DTEtESVYgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4YworI2RlZmluZSBXQ0Q5MzM1X1RYXzNfNF9TQVIxX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhkCisjZGVmaW5lIFdDRDkzMzVfVFhfM180X1NBUjJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGUKKyNkZWZpbmUgV0NEOTMzNV9UWF81XzZfVEVTVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4ZgorI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9BRENfSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjkwCisjZGVmaW5lIFdDRDkzMzVfVFhfNV82X0FURVNUX1JFRkNUTCAgICAgICAgICAgICAgICAgICAgICAweDA2OTEKKyNkZWZpbmUgV0NEOTMzNV9UWF81XzZfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5MgorI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9URVNUX0JMS19FTiAgICAgICAgICAgICAgICAgICAgICAgMHgwNjkzCisjZGVmaW5lIFdDRDkzMzVfVFhfNV82X1RYRkVfQ0xLRElWICAgICAgICAgICAgICAgICAgICAgICAweDA2OTQKKyNkZWZpbmUgV0NEOTMzNV9UWF81XzZfU0FSMV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5NQorI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9TQVIyX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk2CisjZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX01PREVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTcKKyNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5OAorI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9NT0RFXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk5CisjZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWEKKyNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQ1RSTF9WQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5YgorI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjljCisjZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWQKKyNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQ1RSTF9DQ0xfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5ZQorI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjlmCisjZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzUgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTAKKyNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQlVDS19UTVVYX0FfRCAgICAgICAgICAgICAgICAgICAgIDB4MDZhMQorI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9CVUNLX1NXX0RSVl9DTlRMICAgICAgICAgICAgICAgICAgMHgwNmEyCisjZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX1NQQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTMKKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhNAorI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgMHgwNmE1CisjZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAweDA2YTYKKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8zICAgICAgICAgICAgICAgICAgICAgIDB4MDZhNworI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzQgICAgICAgICAgICAgICAgICAgICAgMHgwNmE4CisjZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNSAgICAgICAgICAgICAgICAgICAgICAweDA2YTkKKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF82ICAgICAgICAgICAgICAgICAgICAgIDB4MDZhYQorI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzcgICAgICAgICAgICAgICAgICAgICAgMHgwNmFiCisjZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfOCAgICAgICAgICAgICAgICAgICAgICAweDA2YWMKKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF85ICAgICAgICAgICAgICAgICAgICAgIDB4MDZhZAorI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHgwNmFlCisjZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzIgICAgICAgICAgICAgICAgICAweDA2YWYKKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMyAgICAgICAgICAgICAgICAgIDB4MDZiMAorI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF80ICAgICAgICAgICAgICAgICAgMHgwNmIxIC8qIHYxLnggKi8KKyNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiMSAvKiB2Mi4wICovCisjZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjIKKyNkZWZpbmUgV0NEOTMzNV9SWF9BVVhfU1dfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiMworI2RlZmluZSBXQ0Q5MzM1X1JYX1BBX0FVWF9JTl9DT05OICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI0CisjZGVmaW5lIFdDRDkzMzVfUlhfVElNRVJfRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjUKKyNkZWZpbmUgV0NEOTMzNV9SWF9PQ1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiNgorI2RlZmluZSBXQ0Q5MzM1X1JYX09DUF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI3CisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19FQVJfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjgKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0VBUl9BTVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiOQorI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xETyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmJhCisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19IUEhfUEEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YmIKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyICAgICAgICAgICAgICAgIDB4MDZiYworI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPICAgICAgICAgICAgICAgICAgICAgMHgwNmJkCisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19IUEhfQ05QMSAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YmUKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0hQSF9MT1dQT1dFUiAgICAgICAgICAgICAgICAgICAgIDB4MDZiZgorI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX1BBICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMwCisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUkVGICAgICAgICAgICAgICAgICAgICAgICAweDA2YzEKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0RJRkZMT19MRE8gICAgICAgICAgICAgICAgICAgICAgIDB4MDZjMgorI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfU0VMT19EQUNfUEEgICAgICAgICAgICAgICAgICAgICAgMHgwNmMzCisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19CVUNLX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzQKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0JVQ0tfVlJFRl9FUlJBTVAgICAgICAgICAgICAgICAgIDB4MDZjNQorI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9FUlJBTVAgICAgICAgICAgICAgICAgICAgICAgMHgwNmM2CisjZGVmaW5lIFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzcKKyNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0ZMWUJfTUlEX1JTVCAgICAgICAgICAgICAgICAgICAgIDB4MDZjOAorI2RlZmluZSBXQ0Q5MzM1X0hQSF9MX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmM5CisjZGVmaW5lIFdDRDkzMzVfSFBIX1JfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2EKKyNkZWZpbmUgV0NEOTMzNV9IUEhfQ05QX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjYgorI2RlZmluZSBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNjCisjZGVmaW5lIFdDRDkzMzVfSFBIX0NOUF9XR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2QKKyNkZWZpbmUgV0NEOTMzNV9IUEhfT0NQX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjZQorI2RlZmluZSBXQ0Q5MzM1X0hQSF9BVVRPX0NIT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNmCisjZGVmaW5lIFdDRDkzMzVfSFBIX0NIT1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDAKKyNkZWZpbmUgV0NEOTMzNV9IUEhfUEFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMQorI2RlZmluZSBXQ0Q5MzM1X0hQSF9QQV9DVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQyCisjZGVmaW5lIFdDRDkzMzVfSFBIX0xfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDMKKyNkZWZpbmUgV0NEOTMzNV9IUEhfTF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkNAorI2RlZmluZSBXQ0Q5MzM1X0hQSF9MX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ1CisjZGVmaW5lIFdDRDkzMzVfSFBIX1JfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDYKKyNkZWZpbmUgV0NEOTMzNV9IUEhfUl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkNworI2RlZmluZSBXQ0Q5MzM1X0hQSF9SX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ4CisjZGVmaW5lIFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDkKKyNkZWZpbmUgV0NEOTMzNV9IUEhfUkRBQ19DTEtfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkYQorI2RlZmluZSBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRiCisjZGVmaW5lIFdDRDkzMzVfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMICAgICAgICAgICAgICAgICAweDA2ZGMKKyNkZWZpbmUgV0NEOTMzNV9IUEhfUkVGQlVGRl9VSFFBX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MDZkZAorI2RlZmluZSBXQ0Q5MzM1X0hQSF9SRUZCVUZGX0xQX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRlCisjZGVmaW5lIFdDRDkzMzVfSFBIX0xfREFDX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGYKKyNkZWZpbmUgV0NEOTMzNV9IUEhfUl9EQUNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlMAorI2RlZmluZSBXQ0Q5MzM1X0VBUl9FTl9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUxCisjZGVmaW5lIFdDRDkzMzVfRUFSX0NNQlVGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTIKKyNkZWZpbmUgV0NEOTMzNV9FQVJfSUNUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlMworI2RlZmluZSBXQ0Q5MzM1X0VBUl9FTl9EQkdfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU0CisjZGVmaW5lIFdDRDkzMzVfRUFSX0NOUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTUKKyNkZWZpbmUgV0NEOTMzNV9FQVJfREFDX0NUTF9BVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlNgorI2RlZmluZSBXQ0Q5MzM1X0VBUl9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU3CisjZGVmaW5lIFdDRDkzMzVfRUFSX09VVF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTgKKyNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlOQorI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fTE8yX0NPTVBBTkRFUiAgICAgICAgICAgICAgICAgICAgMHgwNmVhCisjZGVmaW5lIFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSICAgICAgICAgICAgICAgICAgICAweDA2ZWIKKyNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0NPTU1PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlYworI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fQllQQVNTX0VOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmVkCisjZGVmaW5lIFdDRDkzMzVfRElGRl9MT19DTlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZWUKKyNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0NPUkVfT1VUX1BST0cgICAgICAgICAgICAgICAgICAgIDB4MDZlZgorI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fTERPX09VVF9QUk9HICAgICAgICAgICAgICAgICAgICAgMHgwNmYwCisjZGVmaW5lIFdDRDkzMzVfRElGRl9MT19DT01fU1dDQVBfUkVGQlVGX0ZSRVEgICAgICAgICAgICAweDA2ZjEKKyNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0NPTV9QQV9GUkVRICAgICAgICAgICAgICAgICAgICAgIDB4MDZmMgorI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fUkVTRVJWRURfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwNmYzCisjZGVmaW5lIFdDRDkzMzVfRElGRl9MT19MTzFfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAweDA2ZjQKKyNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0xPMV9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgIDB4MDZmNQorI2RlZmluZSBXQ0Q5MzM1X1NFX0xPX0NPTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmY2CisjZGVmaW5lIFdDRDkzMzVfU0VfTE9fQ09NMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjcKKyNkZWZpbmUgV0NEOTMzNV9TRV9MT19MTzNfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmOAorI2RlZmluZSBXQ0Q5MzM1X1NFX0xPX0xPM19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmY5CisjZGVmaW5lIFdDRDkzMzVfU0VfTE9fTE80X0dBSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZmEKKyNkZWZpbmUgV0NEOTMzNV9TRV9MT19MTzRfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmYgorI2RlZmluZSBXQ0Q5MzM1X1NFX0xPX0xPM19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmZlCisjZGVmaW5lIFdDRDkzMzVfU0VfTE9fTE80X1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZmYKKworLyogUGFnZS0xMCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0NEOTMzNV9QQUdFMTBfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDB4MGEwMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTAxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMDIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9NT0RFXzJfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEwMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTA0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfRkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAweDBhMDUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9MUEZfRkZfQV9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGEwNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9CX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTA3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZCX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMDgKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9TTUxQRl9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwOQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0RDRkxUX1NISUZUX0NUTCAgICAgICAgICAgICAgICAgMHgwYTBhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9JSVJfQ09FRkZfMV9DVEwgICAgICAgICAgICAgICAgIDB4MGEwYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCAgICAgICAgICAgICAgICAgMHgwYTBkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfRkZfQV9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9GRl9CX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEwZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0ZCX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTEwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMTkKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9NT0RFXzFfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGExYQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMl9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTFiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAweDBhMWMKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9GQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGExZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GRl9BX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTFlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0JfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhMWYKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9MUEZfRkJfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEyMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX1NNTFBGX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTIxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMICAgICAgICAgICAgICAgICAweDBhMjIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9JSVJfQURBUFRfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9DT0VGRl8xX0NUTCAgICAgICAgICAgICAgICAgMHgwYTI0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMICAgICAgICAgICAgICAgICAweDBhMjUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9GRl9BX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0JfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTI3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfRkJfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMjgKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEzMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYTMyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhMzMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzNAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYTM1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhMzYKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGEzNworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYTM4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhMzkKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGEzYQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYTNiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhM2MKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGEzZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYTNlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhNDEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGE0MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYTQzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhNDQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgIDB4MGE0NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYTQ2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBhNDcKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGE0OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYTQ5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBhNGEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgIDB4MGE0YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYTRjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBhNGQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGE1MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYTUyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhNTMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1NAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYTU1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhNTYKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGE1NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYTU4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhNTkKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGE1YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYTViCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhNWMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGE1ZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTYxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhNjIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGE2MworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTY0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhNjUKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGE2NgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYTY3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhNjgKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGE2OQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYTZhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhNmIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGE2YworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYTZkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhNzEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGE3MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYTczCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhNzQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgIDB4MGE3NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYTc2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBhNzcKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGE3OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYTc5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBhN2EKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgIDB4MGE3YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYTdjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBhN2QKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGE4MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYTgyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhODMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4NAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYTg1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhODYKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGE4NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYTg4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhODkKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGE4YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYThiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhOGMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGE4ZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTkxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhOTIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGE5MworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTk0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhOTUKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGE5NgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYTk3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhOTgKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGE5OQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYTlhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhOWIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGE5YworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYTlkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhYTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGFhMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYWEzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhYTQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgIDB4MGFhNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYWE2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBhYTcKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGFhOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYWE5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBhYWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgIDB4MGFhYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYWFjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBhYWQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGFiMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYWIyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhYjMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiNAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYWI1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhYjYKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGFiNworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYWI4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhYjkKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGFiYQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYWJiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhYmMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGFiZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAgMHgwYWMyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgICAweDBhYzMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgIDB4MGFjNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgMHgwYWM3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAweDBhY2EKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgIDB4MGFjYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCAgICAgICAgICAgICAgMHgwYWNlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAweDBhY2YKKworLyogUGFnZS0xMSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0NEOTMzNV9QQUdFMTFfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDB4MGIwMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjAxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiMDIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIwMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjA0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiMDUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIwNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjA3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiMDgKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwwICAgICAgICAgICAgICAgICAgICAgIDB4MGIwOQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwYjBhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDBiMGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwzICAgICAgICAgICAgICAgICAgICAgIDB4MGIwYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwYjBkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDBiMGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEw2ICAgICAgICAgICAgICAgICAgICAgIDB4MGIwZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwYjEwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDBiMTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MGIxMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgwYjEzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDBiMTQKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MGIxNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDUgICAgICAgICAgICAgICAgICAgICAgMHgwYjE2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDBiMTcKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MGIxOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjE5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiMWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIxYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjFjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiMWQKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIxZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjFmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiMjAKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwwICAgICAgICAgICAgICAgICAgICAgIDB4MGIyMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwYjIyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDBiMjMKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwzICAgICAgICAgICAgICAgICAgICAgIDB4MGIyNAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwYjI1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDBiMjYKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEw2ICAgICAgICAgICAgICAgICAgICAgIDB4MGIyNworI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwYjI4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDBiMjkKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MGIyYQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgwYjJiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDBiMmMKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MGIyZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDUgICAgICAgICAgICAgICAgICAgICAgMHgwYjJlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDBiMmYKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjMxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiMzIKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIzMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjM0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiMzUKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjM3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiMzgKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwwICAgICAgICAgICAgICAgICAgICAgIDB4MGIzOQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwYjNhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDBiM2IKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzICAgICAgICAgICAgICAgICAgICAgIDB4MGIzYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwYjNkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDBiM2UKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw2ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwYjQwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiNDEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGI0MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYjQzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiNDQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYjQ2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiNDcKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGI0OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYjQ5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiNGEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGI0YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYjRjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiNGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGI0ZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYjUwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiNTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGI1MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYjU1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiNTYKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGI1NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYjU4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiNTkKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGI1YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYjViCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiNWMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGI1ZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYjVlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiNWYKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGI2MAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYjYxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiNjIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGI2MworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYjY0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiNjUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGI2NgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYjY5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiNmEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGI2YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYjZjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiNmQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGI2ZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYjZmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiNzAKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGI3MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYjcyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiNzMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGI3NAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYjc1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiNzYKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGI3NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYjc4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiNzkKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGI3YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYjdkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiN2UKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGI3ZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYjgwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiODEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGI4MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYjgzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiODQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGI4NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYjg2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiODcKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGI4OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYjhhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBiOGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgIDB4MGI4YworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgMHgwYjhkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAweDBiOGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGI5MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYjkyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBiOTMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MGI5NAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjk1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDBiOTYKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MGI5NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYjk4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBiOTkKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGI5YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYjliCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBiOWMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGI5ZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYjlmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiYTAKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGJhMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYmEyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiYTUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGJhNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYmE3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiYTgKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGJhOQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYmFhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiYWIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGJhYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYmFkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiYWUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGJhZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYmIwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiYjIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGJiMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYmI0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiYjUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGJiNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYmI5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiYmEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGJiYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYmJjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiYmQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGJiZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYmJmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiYzAKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGJjMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYmMyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiYzMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGJjNAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYmM2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBiYzcKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgIDB4MGJjOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgMHgwYmM5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAweDBiY2EKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGJjZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYmNlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBiY2YKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MGJkMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDBiZDIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MGJkMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYmQ0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBiZDUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGJkNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYmQ3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBiZDgKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGJkYQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYmRiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiZGMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGJkZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYmRlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiZTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGJlMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYmUzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiZTQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYmU2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiZTcKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGJlOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYmU5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiZWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGJlYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYmVjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiZWUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGJlZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYmYwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiZjEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGJmMgorCisvKiBQYWdlLTEyIFJlZ2lzdGVycyAqLworI2RlZmluZSBXQ0Q5MzM1X1BBR0UxMl9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgwYzAwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9ETFlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0RFQ0FZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgwYzAzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSFBIX1ZfUEEgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDQKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9FQVJfVl9QQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX0hEICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfRUFSX1ZfSEQgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDcKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9LMV9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0sxX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSzJfTVNCICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9LMl9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0lETEVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9IUEggICAgICAgICAgICAgICAgICAgICAgICAweDBjMGQKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9JRExFX0VBUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX1RFU1QwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMTAKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9PVlJfVlJFRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMxMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfUEFUSF9DVEwgICAgICAgICAgICAgICAgMHgwYzE5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBjMWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NGRzEgICAgICAgICAgICAgICAgICAgIDB4MGMxYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ0ZHMiAgICAgICAgICAgICAgICAgICAgMHgwYzFjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAweDBjMjEKKyNkZWZpbmUgV0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGMyMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMSAgICAgICAgICAgICAgICAgICAgMHgwYzIzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcyICAgICAgICAgICAgICAgICAgICAweDBjMjQKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzAgICAgICAgICAgICAgICAgIDB4MGMyOQorI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMSAgICAgICAgICAgICAgICAgMHgwYzJhCisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8yICAgICAgICAgICAgICAgICAweDBjMmIKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMgICAgICAgICAgICAgICAgIDB4MGMyYworI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMCAgICAgICAgICAgICAgICAgMHgwYzJkCisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8xICAgICAgICAgICAgICAgICAweDBjMmUKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIgICAgICAgICAgICAgICAgIDB4MGMyZgorI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMyAgICAgICAgICAgICAgICAgMHgwYzMwCisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8wICAgICAgICAgICAgICAgICAweDBjMzEKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEgICAgICAgICAgICAgICAgIDB4MGMzMgorI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMiAgICAgICAgICAgICAgICAgMHgwYzMzCisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8zICAgICAgICAgICAgICAgICAweDBjMzQKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzAgICAgICAgICAgICAgICAgIDB4MGMzNQorI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMSAgICAgICAgICAgICAgICAgMHgwYzM2CisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8yICAgICAgICAgICAgICAgICAweDBjMzcKKyNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMgICAgICAgICAgICAgICAgIDB4MGMzOAorI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX0FDQ0VTU19DRkcgICAgICAgICAgICAgICAgMHgwYzM5CisjZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX1NUQVRVUyAgICAgICAgICAgICAweDBjM2EKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGMzZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzNlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSAgICAgICAgICAgICAgICAgICAweDBjM2YKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0FEQ19DQUwyICAgICAgICAgICAgICAgICAgIDB4MGM0MAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDMgICAgICAgICAgICAgICAgICAgMHgwYzQxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxICAgICAgICAgICAgICAgICAgICAweDBjNDIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BLX0VTVDIgICAgICAgICAgICAgICAgICAgIDB4MGM0MworI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMyAgICAgICAgICAgICAgICAgICAgMHgwYzQ0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSAgICAgICAgICAgICAgICAgICAweDBjNDUKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1JGX1BST0MyICAgICAgICAgICAgICAgICAgIDB4MGM0NgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYzQ3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMyICAgICAgICAgICAgICAgICAgICAgICAweDBjNDgKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1RBQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGM0OQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYzRhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDEgICAgICAgICAgICAgICAgICAweDBjNGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMiAgICAgICAgICAgICAgICAgIDB4MGM0YworI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQzICAgICAgICAgICAgICAgICAgMHgwYzRkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDQgICAgICAgICAgICAgICAgICAweDBjNGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSAgICAgICAgICAgICAgICAgICAgIDB4MGM0ZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUERfTU9OICAgICAgICAgICAgICAgMHgwYzUwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwgICAgICAgICAgICAgICAweDBjNTEKKyNkZWZpbmUgV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgIDB4MGM1NQorI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMwX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgwYzU2CisjZGVmaW5lIFdDRDkzMzVfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCAgICAgICAgICAgICAgICAweDBjNmQKKyNkZWZpbmUgV0NEOTMzNV9TUExJTkVfU1JDMV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MGM2ZQorI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgMHgwYzg1CisjZGVmaW5lIFdDRDkzMzVfU1BMSU5FX1NSQzJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAweDBjODYKKyNkZWZpbmUgV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgIDB4MGM5ZAorI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMzX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgwYzllCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMICAgICAgICAweDBjYjUKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DRkcxICAgICAgIDB4MGNiNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCAgICAgICAgMHgwY2I5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ0ZHMSAgICAgICAweDBjYmEKKworLyogUGFnZS0xMyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0NEOTMzNV9QQUdFMTNfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDB4MGQwMAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMCAgICAgICAgICAgICAgMHgwZDAxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxICAgICAgICAgICAgICAweDBkMDIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAgICAgICAgICAgICAgIDB4MGQwMworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMSAgICAgICAgICAgICAgMHgwZDA0CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwICAgICAgICAgICAgICAweDBkMDUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEgICAgICAgICAgICAgIDB4MGQwNgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMCAgICAgICAgICAgICAgMHgwZDA3CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxICAgICAgICAgICAgICAweDBkMDgKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAgICAgICAgICAgICAgIDB4MGQwOQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMSAgICAgICAgICAgICAgMHgwZDBhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNV9DRkcwICAgICAgICAgICAgICAweDBkMGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzEgICAgICAgICAgICAgIDB4MGQwYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMCAgICAgICAgICAgICAgMHgwZDBkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcxICAgICAgICAgICAgICAweDBkMGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzAgICAgICAgICAgICAgIDB4MGQwZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMSAgICAgICAgICAgICAgMHgwZDEwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwICAgICAgICAgICAgICAweDBkMTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEgICAgICAgICAgICAgIDB4MGQxMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwICAgICAgICAgICAgICAgMHgwZDEzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzEgICAgICAgICAgICAgICAweDBkMTQKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMiAgICAgICAgICAgICAgIDB4MGQxNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczICAgICAgICAgICAgICAgMHgwZDE2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzQgICAgICAgICAgICAgICAweDBkMTcKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMCAgICAgICAgIDB4MGQxOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxICAgICAgICAgMHgwZDE5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzAgICAgICAgICAgICAgICAgICAweDBkMWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzAgICAgICAgICAgIDB4MGQxYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgICAgICAgICAgICAgMHgwZDFkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSAgICAgICAgICAgICAweDBkMWUKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwICAgICAgICAgICAgIDB4MGQxZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzEgICAgICAgICAgICAgMHgwZDIwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCAgICAgICAgICAgICAweDBkMjEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxICAgICAgICAgICAgIDB4MGQyMgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzAgICAgICAgICAgICAgMHgwZDIzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSAgICAgICAgICAgICAweDBkMjQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICAgICAgICAgICAgIDB4MGQyNQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzAgICAgICAgICAgICAgMHgwZDI2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCAgICAgICAgICAgICAweDBkMjcKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwICAgICAgICAgICAgIDB4MGQyOAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzAgICAgICAgICAgICAgMHgwZDI5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAgICAgICAgICAgICAweDBkMmIKKyNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTFfQ0ZHMCAgICAgICAgICAgIDB4MGQyYworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMl9DRkcwICAgICAgICAgICAgMHgwZDJkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAgICAgICAgICAgICAweDBkMmUKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMCAgIDB4MGQzMQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcxICAgMHgwZDMyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIgICAweDBkMzMKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMyAgIDB4MGQzNAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcwICAgMHgwZDM1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEgICAweDBkMzYKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMiAgIDB4MGQzNworI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkczICAgMHgwZDM4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCAgICAgICAgICAgICAgICAweDBkM2EKKyNkZWZpbmUgV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxICAgICAgICAgICAgICAgIDB4MGQzYgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIgICAgICAgICAgICAgICAgMHgwZDNjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMyAgICAgICAgICAgICAgICAweDBkM2QKKyNkZWZpbmUgV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCAgICAgICAgICAgIDB4MGQ0MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wgICAgICAgICAgMHgwZDQyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCAgICAgICAgICAgICAweDBkNDMKKyNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9DVEwgICAgICAgICAgICAgICAgIDB4MGQ0OQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMCAgICAgICAgMHgwZDRhCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QxICAgICAgICAweDBkNGIKKyNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9MU0IgICAgIDB4MGQ0YworI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX01TQiAgICAgMHgwZDRkCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU1RBVFVTICAgICAgICAgICAgICAweDBkNGUKKyNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0NUUkwgICAgICAgICAgIDB4MGQ0ZgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0IgICAgICAgMHgwZDUwCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQiAgICAgICAweDBkNTEKKyNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCX1JEICAgIDB4MGQ1MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0JfUkQgICAgMHgwZDUzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQgICAgICAweDBkNTQKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwgICAgICAgICAgIDB4MGQ1NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCAgICAgICAgMHgwZDU2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMICAgICAgICAweDBkNTcKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwgICAgICAgIDB4MGQ1OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCAgICAgICAgMHgwZDU5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMICAgICAgICAweDBkNWEKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNl9DVEwgICAgICAgIDB4MGQ1YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I3X0NUTCAgICAgICAgMHgwZDVjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMICAgICAgICAweDBkNWQKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ1RMICAgICAgICAgICAgICAgIDB4MGQ1ZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX1RJTUVSX0NUTCAgICAgMHgwZDVmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICAgICAgICAweDBkNjAKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgICAgICAgIDB4MGQ2MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9QQVRIX0NUTCAgICAgICAgICAgMHgwZDY1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMICAgICAgICAweDBkNjYKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMl9DVEwgICAgICAgIDB4MGQ2NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IzX0NUTCAgICAgICAgMHgwZDY4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMICAgICAgICAweDBkNjkKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNV9DVEwgICAgICAgIDB4MGQ2YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I2X0NUTCAgICAgICAgMHgwZDZiCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMICAgICAgICAweDBkNmMKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9COF9DVEwgICAgICAgIDB4MGQ2ZAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DVEwgICAgICAgICAgICAgICAgMHgwZDZlCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMICAgICAweDBkNmYKKyNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMV9DVEwgICAgICAgIDB4MGQ3MAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCAgICAgICAgMHgwZDcxCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4MgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDgzCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMyAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkc0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4NQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDg2CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNiAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODcKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkc3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4OAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAgMHgwZDg5CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgICAweDBkOGEKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgIDB4MGQ4YgorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAgMHgwZDhjCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgICAweDBkOGQKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9XUl9MU0IgICAgICAgICAgICAgICAgIDB4MGQ4ZQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX01TQiAgICAgICAgICAgICAgICAgMHgwZDhmCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfTFVUICAgICAgICAgICAgICAgICAgICAweDBkOTAKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9SRF9MU0IgICAgICAgICAgICAgICAgIDB4MGQ5MQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX01TQiAgICAgICAgICAgICAgICAgMHgwZDkyCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAweDBkOTMKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgIDB4MGQ5NAorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgMHgwZDk1CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAweDBkOTYKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgIDB4MGQ5NworI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9XUl9MU0IgICAgICAgICAgICAgICAgMHgwZDk4CisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX01TQiAgICAgICAgICAgICAgICAweDBkOTkKKyNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZSX0NPTVBfTFVUICAgICAgICAgICAgICAgICAgIDB4MGQ5YQorI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9SRF9MU0IgICAgICAgICAgICAgICAgMHgwZDliCisjZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX01TQiAgICAgICAgICAgICAgICAweDBkOWMKKworLyogUGFnZS0weDgwIFJlZ2lzdGVycyAqLworI2RlZmluZSBXQ0Q5MzM1X1BBR0U4MF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdDRDkzMzVfVExNTV9CSVNUX01PREVfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX1JGX1BBX09OX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMgorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSU5UUjFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIFdDRDkzMzVfVExNTV9JTlRSMl9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDQKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX1NXUl9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgIDB4ODAwNQorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fU1dSX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIFdDRDkzMzVfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRyAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyQ19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJDX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgMHg4MDA5CisjZGVmaW5lIFdDRDkzMzVfVExNTV9JMlNfUlhfU0QwX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMGEKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19SWF9TRDFfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAwYgorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJTX1JYX1NDS19QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDBjCisjZGVmaW5lIFdDRDkzMzVfVExNTV9JMlNfUlhfV1NfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAweDgwMGQKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19UWF9TRDBfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAwZQorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJTX1RYX1NEMV9QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDBmCisjZGVmaW5lIFdDRDkzMzVfVExNTV9JMlNfVFhfU0NLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19UWF9XU19QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fRE1JQzFfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIFdDRDkzMzVfVExNTV9ETUlDMV9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMTMKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0RNSUMyX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAxNAorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fRE1JQzJfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDE1CisjZGVmaW5lIFdDRDkzMzVfVExNTV9ETUlDM19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0RNSUMzX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAxNworI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSlRESV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDE4CisjZGVmaW5lIFdDRDkzMzVfVExNTV9KVERPX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMTkKKyNkZWZpbmUgV0NEOTMzNV9UTE1NX0pUTVNfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxYQorI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSlRDS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFiCisjZGVmaW5lIFdDRDkzMzVfVExNTV9KVFJTVF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAweDgwMWMKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMCAgICAgICAgICAgICAgICAgIDB4ODAzMQorI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8xICAgICAgICAgICAgICAgICAgMHg4MDMyCisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzIgICAgICAgICAgICAgICAgICAweDgwMzMKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMyAgICAgICAgICAgICAgICAgIDB4ODAzNAorI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzAgICAgICAgICAgICAgICAgMHg4MDM1CisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSAgICAgICAgICAgICAgICAweDgwMzYKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8yICAgICAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzMgICAgICAgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QQURfRFJWQ1RMICAgICAgICAgICAgICAgICAgICAweDgwMzkKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4ODAzYQorI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEgICAgICAgICAgICAgICAgMHg4MDNiCisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMiAgICAgICAgICAgICAgICAweDgwM2MKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX01FTV9DVFJMICAgICAgICAgICAgICAgICAgICAgIDB4ODAzZAorI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfQlVTX1NFTCAgICAgICAgICAgICAgICAgMHg4MDQxCisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19KVEFHICAgICAgICAgICAgICAgICAgICAweDgwNDIKKyNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzEgICAgICAgICAgICAgICAgICAgIDB4ODA0MworI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfRU5fMiAgICAgICAgICAgICAgICAgICAgMHg4MDQ0CisjZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8zICAgICAgICAgICAgICAgICAgICAweDgwNDUKKyNkZWZpbmUgV0NEOTMzNV9NQVhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBGRgorCisvKiBTTElNQlVTIFNsYXZlIFJlZ2lzdGVycyAqLworI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgICAgICAgICAgICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzAgICAgICAgICAgICAgKDB4MzQpCisjZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19SWF8xICAgICAgICAgICAgICgweDM1KQorI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMCAgICAgICAgICAgICAoMHgzNikKKyNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzEgICAgICAgICAgICAgKDB4MzcpCisjZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9SWF8wICAgICAgICAgICAgICAgICgweDM4KQorI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMSAgICAgICAgICAgICAgICAoMHgzOSkKKyNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzAgICAgICAgICAgICAgICAgKDB4M0EpCisjZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9UWF8xICAgICAgICAgICAgICAgICgweDNCKQorI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwCQkoMHg2MCkKKyNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfU09VUkNFMAkJKDB4NzApCisKKy8qIE1hY3JvcyBmb3IgUGFja2luZyBSZWdpc3RlciBXcml0ZXMgaW50byBhIFUzMiAqLworI2RlZmluZSBUQVNIQV9QQUNLRURfUkVHX1NJWkUgc2l6ZW9mKHUzMikKKworI2RlZmluZSBUQVNIQV9DT0RFQ19QQUNLX0VOVFJZKHJlZywgbWFzaywgdmFsKSAoKHZhbCAmIDB4ZmYpfFwKKwkoKG1hc2sgJiAweGZmKSA8PCA4KXwoKHJlZyAmIDB4ZmZmZikgPDwgMTYpKQorI2RlZmluZSBUQVNIQV9DT0RFQ19VTlBBQ0tfRU5UUlkocGFja2VkLCByZWcsIG1hc2ssIHZhbCkgXAorCWRvIHsgXAorCQkoKHJlZykgPSAoKHBhY2tlZCA+PiAxNikgJiAoMHhmZmZmKSkpOyBcCisJCSgobWFzaykgPSAoKHBhY2tlZCA+PiA4KSAmICgweGZmKSkpOyBcCisJCSgodmFsKSA9ICgocGFja2VkKSAmICgweGZmKSkpOyBcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyNDg3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmgKQEAgLTAsMCArMSwxODQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfV0NEOTM0WF9SRUdJU1RFUlNfSAorI2RlZmluZSBfV0NEOTM0WF9SRUdJU1RFUlNfSAorCisjZGVmaW5lIFdDRDkzNFhfUEFHRV9TSVpFIDI1NgorI2RlZmluZSBXQ0Q5MzRYX05VTV9QQUdFUyAyNTYKKworZXh0ZXJuIGNvbnN0IHU4ICogY29uc3Qgd2NkOTM0eF9yZWdbV0NEOTM0WF9OVU1fUEFHRVNdOworCitlbnVtIHsKKwlXQ0Q5MzRYX1BBR0VfMCA9IDAsCisJV0NEOTM0WF9QQUdFXzEsCisJV0NEOTM0WF9QQUdFXzIsCisJV0NEOTM0WF9QQUdFXzQgPSA0LAorCVdDRDkzNFhfUEFHRV81LAorCVdDRDkzNFhfUEFHRV82LAorCVdDRDkzNFhfUEFHRV83LAorCVdDRDkzNFhfUEFHRV8xMCA9IDB4QSwKKwlXQ0Q5MzRYX1BBR0VfMTEsCisJV0NEOTM0WF9QQUdFXzEyLAorCVdDRDkzNFhfUEFHRV8xMywKKwlXQ0Q5MzRYX1BBR0VfMTQsCisJV0NEOTM0WF9QQUdFXzE1LAorCVdDRDkzNFhfUEFHRV8weDUwLAorCVdDRDkzNFhfUEFHRV8wWDgwLAorfTsKKworZW51bSB7CisJV0NEOTM0WF9XUklURSA9IDAsCisJV0NEOTM0WF9SRUFELAorCVdDRDkzNFhfUkVBRF9XUklURSwKK307CisKKy8qIFBhZ2UtMCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgV0NEOTM0WF9QQUdFMF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLMl9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX1JQTV9JMlNfRFNEX0NMS19TRUwgICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCAgICAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTAgICAgICAgICAgICAgICAweDAwMjEKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUxICAgICAgICAgICAgICAgMHgwMDIyCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMiAgICAgICAgICAgICAgIDB4MDAyMworI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTMgICAgICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwgICAgICAgICAgICAgICAgICAgMHgwMDI1CisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDAgICAgICAgICAgICAgICAgIDB4MDAyNgorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QxICAgICAgICAgICAgICAgICAweDAwMjcKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCAgICAgICAgICAgICAgMHgwMDI5CisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEgICAgICAgICAgICAgIDB4MDAyYQorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQyICAgICAgICAgICAgICAweDAwMmIKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMyAgICAgICAgICAgICAgMHgwMDJjCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDQgICAgICAgICAgICAgIDB4MDAyZAorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ1ICAgICAgICAgICAgICAweDAwMmUKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNiAgICAgICAgICAgICAgMHgwMDJmCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDcgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ4ICAgICAgICAgICAgICAweDAwMzEKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOSAgICAgICAgICAgICAgMHgwMDMyCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEwICAgICAgICAgICAgIDB4MDAzMworI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMSAgICAgICAgICAgICAweDAwMzQKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTIgICAgICAgICAgICAgMHgwMDM1CisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEzICAgICAgICAgICAgIDB4MDAzNgorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNCAgICAgICAgICAgICAweDAwMzcKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTUgICAgICAgICAgICAgMHgwMDM4CisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTICAgICAgICAgICAgICAgIDB4MDAzOQorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF9OT05ORUdPICAgICAgICAweDAwM2EKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMSAgICAgICAgICAgICAgMHgwMDNiCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIgICAgICAgICAgICAgIDB4MDAzYworI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8zICAgICAgICAgICAgICAweDAwM2QKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTkFfV0FJVF9TVEFURV9DVEwgICAgICAgICAgMHgwMDNlCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfU0xOUV9XQUlUX1NUQVRFX0NUTCAgICAgICAgIDB4MDAzZgorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTFRfRlVOQ19FTiAgICAgICAgICAgICAgICAgMHgwMDQxCisjZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfT0UgICAgICAgICAgICAgICAgIDB4MDA0MgorI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0dQSU9fQ1RMX0RBVEEgICAgICAgICAgICAgICAweDAwNDMKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUxCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfUlgxX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MgorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1JYMl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTMKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU0CisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfUlg0X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NQorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1JYNV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTYKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDZfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU3CisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfUlg3X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OAorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMF9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjEKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDFfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDYyCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2MworI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYM19JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjQKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDRfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDY1CisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2NgorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNl9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjcKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDdfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDY4CisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2OQorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYOV9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNmEKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDEwX0lOUF9DRkcgICAgICAgICAgICAgICAgICAgMHgwMDZiCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxMV9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDA2YworI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTNfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAweDAwNmUKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDE0X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgMHgwMDZmCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxNV9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwNzEKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfVFgxXzBfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMDczCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMV8xX0NGRyAgICAgICAgICAgICAgICAgICAgIDB4MDA3NAorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18wX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODEKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfMV9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgyCisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTXzJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MworI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18zX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODQKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfQ0xLU1JDX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwMDg1CisjZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTX0NPTU1PTl9DVEwgICAgICAgICAgICAgICAgICAgIDB4MDA4NgorI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18wX1RETV9DVEwgICAgICAgICAgICAgICAgICAgICAweDAwODcKKyNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDg4CisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MQorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMCAgICAgICAgICAgICAgICAgICAgICAweDAwOTIKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkzCisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5NAorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwOTUKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDk2CisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5NworI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwOTgKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDk5CisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5QQorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMyAgICAgICAgICAgICAgICAgICAgICAweDAwOUIKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDlDCisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5RAorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfNCAgICAgICAgICAgICAgICAgICAgICAweDAwOUUKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDlGCisjZGVmaW5lIFdDRDkzNFhfRE1BX1JETUE0X1BSVF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiMQorI2RlZmluZSBXQ0Q5MzRYX0RNQV9SRE1BX1NCVFgwXzdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwYjkKKyNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9TQlRYOF8xMV9DRkcgICAgICAgICAgICAgICAgICAgICAgMHgwMGJhCisjZGVmaW5lIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMQorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMCAgICAgICAgICAgICAgICAgICAgICAweDAwYzIKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMGMzCisjZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8wICAgICAgICAgICAgICAgICAgICAgIDB4MDBjNAorI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwQzYKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMEM3CisjZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8xICAgICAgICAgICAgICAgICAgICAgIDB4MDBDOAorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwQzkKKyNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQV9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMENCCisjZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8yICAgICAgICAgICAgICAgICAgICAgIDB4MDBDQworI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwQ0QKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMENFCisjZGVmaW5lIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBEMAorI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMyAgICAgICAgICAgICAgICAgICAgICAweDAwRDEKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMEQyCisjZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8zICAgICAgICAgICAgICAgICAgICAgIDB4MDBEMworI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRDUKKyNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMEQ2CisjZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV80ICAgICAgICAgICAgICAgICAgICAgIDB4MDBENworI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfNCAgICAgICAgICAgICAgICAgICAgICAweDAwRDgKKyNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQTBfUFJUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEUxCisjZGVmaW5lIFdDRDkzNFhfRE1BX1dETUEzX1BSVF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBFMgorI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BNF9QUlQwXzNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwRTMKKyNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQTRfUFJUNF83X0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMEU0CisjZGVmaW5lIFdDRDkzNFhfUEFHRTFfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAyCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMworI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA4CisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF84ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMGEKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0xfVkFMX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBiCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwYworI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAweDAxMGQKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0RTTV9GUkFDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgMHgwMTBlCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwZgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxMTAKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTExCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAxMTMKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE0CisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExNQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTYKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE3CisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExOAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTkKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFhCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExYgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMWMKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFkCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9GUkVRX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExZQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMWYKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIwCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjIKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIzCisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9GTExfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjUKKyNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI2CisjZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNworI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjgKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQxCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0MgorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDMKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ0CisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0NQorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDYKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ3CisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0OAorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfOCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDkKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTRhCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9MX1ZBTF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0YgorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfTF9WQUxfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAweDAxNGMKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0RTTV9GUkFDX0NUTF8wICAgICAgICAgICAgICAgICAgICAgMHgwMTRkCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9EU01fRlJBQ19DVExfMSAgICAgICAgICAgICAgICAgICAgIDB4MDE0ZQorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAweDAxNGYKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTUwCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1MQorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAxNTIKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTUzCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NAorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNTUKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU2CisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NworI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNTgKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU5CisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1YQorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNWIKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVjCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1ZAorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNWUKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVmCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MAorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjEKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTYyCisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MworI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfRkxMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjQKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY1CisjZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NgorI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjcKKyNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY4CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MQorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODIKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTgzCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NAorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODUKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg2CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NworI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODgKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg5CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4YQorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9MX1ZBTF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOGIKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfTF9WQUxfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMThjCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0RTTV9GUkFDX0NUTF8wICAgICAgICAgICAgICAgICAgICAgIDB4MDE4ZAorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9EU01fRlJBQ19DVExfMSAgICAgICAgICAgICAgICAgICAgICAweDAxOGUKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMThmCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MAorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTEKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkyCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MworI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTQKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk1CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NgorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTcKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk4CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5OQorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWEKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTliCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5YworI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWQKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTllCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5ZgorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTAKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWExCisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMgorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTMKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfRkxMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE0CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNQorI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTYKKyNkZWZpbmUgV0NEOTM0WF9TQl9GTExfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE3CisjZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NUQVRVU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhOAorI2RlZmluZSBXQ0Q5MzRYX1BBR0UyX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfQ1BFX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMSAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRUZMTF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMCAgICAgICAgICAgIDB4MDIwNQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzEgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF9PVkVSUklERSAgICAgMHgwMjA3CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzAgICAgICAgICAgIDB4MDIwOAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8xICAgICAgICAgICAweDAyMDkKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMiAgICAgICAgICAgMHgwMjBhCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzMgICAgICAgICAgIDB4MDIwYgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl80ICAgICAgICAgICAweDAyMGMKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fNSAgICAgICAgICAgMHgwMjBkCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfRFJBTTFfU0hVVERPV04gICAgICAgICAgICAgIDB4MDIwZQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfQ1RMICAgICAgICAgICAgICAgICAweDAyMGYKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX09WRVJSSURFX0NUTCAgICAgICAgMHgwMjEwCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9PVkVSUklERV9DVEwxICAgICAgIDB4MDIxMQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19VU19CVUZfSU5UX1BFUklPRCAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCAgICAgICAgICAgMHgwMjEzCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19VU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTUKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfTUFEX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE2CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNworI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19ETUlDMF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTgKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfRE1JQzFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE5CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0RNSUMyX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxYQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19ETUlDX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWIKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFjCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1dET0dfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxZAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19CQUNLVVBfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWUKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFmCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0NQRV9PQ0RfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMAorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQSAgICAgICAgICAgICAgICAweDAyMjEKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEIgICAgICAgICAgICAgICAgMHgwMjIyCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzFBICAgICAgICAgICAgICAgIDB4MDIyMworI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18xQiAgICAgICAgICAgICAgICAweDAyMjQKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18wQSAgICAgICAgICAgICAgMHgwMjI1CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEIgICAgICAgICAgICAgIDB4MDIyNgorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzFBICAgICAgICAgICAgICAweDAyMjcKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18xQiAgICAgICAgICAgICAgMHgwMjI4CisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8wQSAgICAgICAgICAgICAgIDB4MDIyOQorI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMEIgICAgICAgICAgICAgICAweDAyMmEKKyNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzFBICAgICAgICAgICAgICAgMHgwMjJiCisjZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8xQiAgICAgICAgICAgICAgIDB4MDIyYworI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyODEKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjgyCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4MworI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAyODQKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjg1CisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4NgorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAweDAyODcKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjg4CisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4OQorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzggICAgICAgICAgICAgICAgICAgICAgICAweDAyOGEKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0lJUl9DVExfUFRSICAgICAgICAgICAgICAgICAgMHgwMjhiCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1ZBTCAgICAgICAgICAgICAgICAgIDB4MDI4YworI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOGQKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjhlCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4ZgorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTAKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkxCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5MgorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTMKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjk0CisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5NQorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAyOTYKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjk3CisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5OAorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAweDAyOTkKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjlhCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzggICAgICAgICAgICAgICAgICAgICAgIDB4MDI5YgorI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSICAgICAgICAgICAgICAgICAweDAyOWMKKyNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCAgICAgICAgICAgICAgICAgMHgwMjlkCisjZGVmaW5lIFdDRDkzNFhfU09DX01BRF9JTlBfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5ZQorI2RlZmluZSBXQ0Q5MzRYX1BBR0U0X1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAxCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9DTFJfQ09NTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMgorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDkKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDBhCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX01BU0syICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwYgorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MGMKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDExCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxMgorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMyICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MTMKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDE0CisjZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxOQorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MWEKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDFiCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxYworI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMl9NQVNLMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjQKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjJfU1RBVFVTMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDJjCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4yX0NMRUFSMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQzNAorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfTUFTSzIgICAgICAgICAgICAgICAgICAgICAweDA0M2IKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX01BU0szICAgICAgICAgICAgICAgICAgICAgMHgwNDNjCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9TVEFUVVMyICAgICAgICAgICAgICAgICAgIDB4MDQ0MworI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfU1RBVFVTMyAgICAgICAgICAgICAgICAgICAweDA0NDQKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX0NMRUFSMiAgICAgICAgICAgICAgICAgICAgMHgwNDRiCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9DTEVBUjMgICAgICAgICAgICAgICAgICAgIDB4MDQ0YworI2RlZmluZSBXQ0Q5MzRYX0lOVFJfTEVWRUwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NjEKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0xFVkVMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDYyCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9MRVZFTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2MworI2RlZmluZSBXQ0Q5MzRYX0lOVFJfTEVWRUwzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NjQKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0JZUEFTUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDY5CisjZGVmaW5lIFdDRDkzNFhfSU5UUl9CWVBBU1MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2YQorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQllQQVNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NmIKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0JZUEFTUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDZjCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9TRVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3MQorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfU0VUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NzIKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX1NFVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDczCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9TRVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3NAorI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDA0YjEKKyNkZWZpbmUgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHgwNGIyCisjZGVmaW5lIFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX0NMRUFSICAgICAgICAgICAgICAgICAgICAgIDB4MDRiMworI2RlZmluZSBXQ0Q5MzRYX1BBR0U1X1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUkVWSVNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0hfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MTEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19OVU1CRVJfT0ZfQllURV9NU0IgICAgICAgICAgICAgICAgMHgwNTEyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfTlVNQkVSX09GX0JZVEVfTFNCICAgICAgICAgICAgICAgIDB4MDUxMworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX01BU1RFUl9BRERSRVNTX01TQiAgICAgICAgICAgICAgICAweDA1MTQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19NQVNURVJfQUREUkVTU19MU0IgICAgICAgICAgICAgICAgMHgwNTE1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU0xBVkVfQUREUkVTU19NU0IgICAgICAgICAgICAgICAgIDB4MDUxNgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NMQVZFX0FERFJFU1NfTFNCICAgICAgICAgICAgICAgICAweDA1MTcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19USU1FUjBfSU5URVJSVVBUX01TQiAgICAgICAgICAgICAgMHgwNTE4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfVElNRVIwX0lOVEVSUlVQVF9MU0IgICAgICAgICAgICAgIDB4MDUxOQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMV9JTlRFUlJVUFRfTVNCICAgICAgICAgICAgICAweDA1MWEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19USU1FUjFfSU5URVJSVVBUX0xTQiAgICAgICAgICAgICAgMHgwNTFiCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfVElNRVIyX0lOVEVSUlVQVF9NU0IgICAgICAgICAgICAgIDB4MDUxYworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMl9JTlRFUlJVUFRfTFNCICAgICAgICAgICAgICAweDA1MWQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19DT01NX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTIwCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfRlJBTUVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU0MgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDFfMiAgICAgICAgICAgICAgICAweDA1NWMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fMk5EX0RBVEFfQ0gzXzQgICAgICAgICAgICAgICAgMHgwNTVkCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NINSAgICAgICAgICAgICAgICAgIDB4MDU1ZQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NXX0VWRU5UX1JEICAgICAgICAgICAgICAgICAgICAgICAweDA1NjEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TV19FVkVOVF9DVFJMICAgICAgICAgICAgICAgICAgICAgMHgwNTYyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX1NFTEVDVF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDU2MworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMiAgICAgICAgICAgICAgICAgICAgICAweDA1NjQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzMgICAgICAgICAgICAgICAgICAgICAgMHgwNTY1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX1NBTVBMSU5HX0ZSRVEgICAgICAgICAgICAgICAgIDB4MDU2NgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WRVJTSU9OX0NUTCAgICAgICAgICAgICAweDA1NjkKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVkVSU0lPTl9TRUwgICAgICAgICAgICAgMHgwNTZhCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hBX01TQiAgICAgICAgICAgICAgIDB4MDU2YgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQV9MU0IgICAgICAgICAgICAgICAweDA1NmMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEJfTVNCICAgICAgICAgICAgICAgMHgwNTZkCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hCX0xTQiAgICAgICAgICAgICAgIDB4MDU2ZQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1JBTV9DTlRSTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NzEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JBTksgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTcyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3MworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xICAgICAgICAgICAgICAgICAgICAgICAweDA1NzQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNTc1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3NgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV80ICAgICAgICAgICAgICAgICAgICAgICAweDA1NzcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwNTc4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3OQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV83ICAgICAgICAgICAgICAgICAgICAgICAweDA1N2EKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwNTdiCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzkgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3YworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9BICAgICAgICAgICAgICAgICAgICAgICAweDA1N2QKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQiAgICAgICAgICAgICAgICAgICAgICAgMHgwNTdlCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0MgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3ZgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9EICAgICAgICAgICAgICAgICAgICAgICAweDA1ODAKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNTgxCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0YgICAgICAgICAgICAgICAgICAgICAgIDB4MDU4MgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMCAgICAgICAgICAgICAgICAgICAgICAweDA1ODMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwNTg0CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzEyICAgICAgICAgICAgICAgICAgICAgIDB4MDU4NQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMyAgICAgICAgICAgICAgICAgICAgICAweDA1ODYKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwNTg3CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE1ICAgICAgICAgICAgICAgICAgICAgIDB4MDU4OAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNiAgICAgICAgICAgICAgICAgICAgICAweDA1ODkKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwNThhCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE4ICAgICAgICAgICAgICAgICAgICAgIDB4MDU4YgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xOSAgICAgICAgICAgICAgICAgICAgICAweDA1OGMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUEgICAgICAgICAgICAgICAgICAgICAgMHgwNThkCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFCICAgICAgICAgICAgICAgICAgICAgIDB4MDU4ZQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQyAgICAgICAgICAgICAgICAgICAgICAweDA1OGYKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUQgICAgICAgICAgICAgICAgICAgICAgMHgwNTkwCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFFICAgICAgICAgICAgICAgICAgICAgIDB4MDU5MQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRiAgICAgICAgICAgICAgICAgICAgICAweDA1OTIKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwNTkzCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIxICAgICAgICAgICAgICAgICAgICAgIDB4MDU5NAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMiAgICAgICAgICAgICAgICAgICAgICAweDA1OTUKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwNTk2CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI0ICAgICAgICAgICAgICAgICAgICAgIDB4MDU5NworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNSAgICAgICAgICAgICAgICAgICAgICAweDA1OTgKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjYgICAgICAgICAgICAgICAgICAgICAgMHgwNTk5CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI3ICAgICAgICAgICAgICAgICAgICAgIDB4MDU5YQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yOCAgICAgICAgICAgICAgICAgICAgICAweDA1OWIKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjkgICAgICAgICAgICAgICAgICAgICAgMHgwNTljCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJBICAgICAgICAgICAgICAgICAgICAgIDB4MDU5ZAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQiAgICAgICAgICAgICAgICAgICAgICAweDA1OWUKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkMgICAgICAgICAgICAgICAgICAgICAgMHgwNTlmCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJEICAgICAgICAgICAgICAgICAgICAgIDB4MDVhMAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRSAgICAgICAgICAgICAgICAgICAgICAweDA1YTEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkYgICAgICAgICAgICAgICAgICAgICAgMHgwNWEyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMwICAgICAgICAgICAgICAgICAgICAgIDB4MDVhMworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMSAgICAgICAgICAgICAgICAgICAgICAweDA1YTQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzIgICAgICAgICAgICAgICAgICAgICAgMHgwNWE1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMzICAgICAgICAgICAgICAgICAgICAgIDB4MDVhNgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNCAgICAgICAgICAgICAgICAgICAgICAweDA1YTcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzUgICAgICAgICAgICAgICAgICAgICAgMHgwNWE4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM2ICAgICAgICAgICAgICAgICAgICAgIDB4MDVhOQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNyAgICAgICAgICAgICAgICAgICAgICAweDA1YWEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzggICAgICAgICAgICAgICAgICAgICAgMHgwNWFiCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM5ICAgICAgICAgICAgICAgICAgICAgIDB4MDVhYworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQSAgICAgICAgICAgICAgICAgICAgICAweDA1YWQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0IgICAgICAgICAgICAgICAgICAgICAgMHgwNWFlCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNDICAgICAgICAgICAgICAgICAgICAgIDB4MDVhZgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRCAgICAgICAgICAgICAgICAgICAgICAweDA1YjAKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0UgICAgICAgICAgICAgICAgICAgICAgMHgwNWIxCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNGICAgICAgICAgICAgICAgICAgICAgIDB4MDViMgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RPUF9DVFJMMSAgICAgICAgICAgICAgICAgICAgICAgICAweDA1YjMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19UT1BfQ1RSTDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNWI0CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDViNQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9NVVRFX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDA1YjYKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0NUUkwgICAgICAgICAgICAgICAgICAgMHgwNWI3CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19TVEFUVVMgICAgICAgICAgICAgICAgIDB4MDViOAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfRlMgICAgICAgICAgICAgICAgICAgICAweDA1YjkKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0lOX1NFTCAgICAgICAgICAgICAgICAgMHgwNWJhCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfR1BPVVRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDViYgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0dQT1VUX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA1YmMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19BTkFfSU5URVJSVVBUX01BU0sgICAgICAgICAgICAgICAgMHgwNWJlCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgIDB4MDViZgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfQ0xSICAgICAgICAgICAgICAgICAweDA1YzAKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JUF9URVNUSU5HICAgICAgICAgICAgICAgICAgICAgICAgMHgwNWMxCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVFJMICAgICAgICAgICAgICAgICAgIDB4MDVlMworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlQgICAgICAgICAgICAgICAgICAgICAweDA1ZTkKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05UX01TQiAgICAgICAgICAgICAgICAgMHgwNWViCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVF9MU0IgICAgICAgICAgICAgICAgIDB4MDVlYworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLMCAgICAgICAgICAgICAgICAgICAweDA1ZjEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzEgICAgICAgICAgICAgICAgICAgMHgwNWYyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0syICAgICAgICAgICAgICAgICAgIDB4MDVmMworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLMyAgICAgICAgICAgICAgICAgICAweDA1ZjQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzQgICAgICAgICAgICAgICAgICAgMHgwNWY1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzAgICAgICAgICAgICAgICAgIDB4MDVmNgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMxICAgICAgICAgICAgICAgICAweDA1ZjcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMiAgICAgICAgICAgICAgICAgMHgwNWY4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzMgICAgICAgICAgICAgICAgIDB4MDVmOQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVM0ICAgICAgICAgICAgICAgICAweDA1ZmEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSMCAgICAgICAgICAgICAgICAgICAgMHgwNWZiCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjEgICAgICAgICAgICAgICAgICAgIDB4MDVmYworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIyICAgICAgICAgICAgICAgICAgICAweDA1ZmQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSMyAgICAgICAgICAgICAgICAgICAgMHgwNWZlCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjQgICAgICAgICAgICAgICAgICAgIDB4MDVmZgorI2RlZmluZSBXQ0Q5MzRYX0FOQV9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDAKKyNkZWZpbmUgV0NEOTM0WF9BTkFfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAxCisjZGVmaW5lIFdDRDkzNFhfQU5BX1JDTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMworI2RlZmluZSBXQ0Q5MzRYX0FOQV9QQUdFNl9TUEFSRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDQKKyNkZWZpbmUgV0NEOTM0WF9BTkFfUEFHRTZfU1BBUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA1CisjZGVmaW5lIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNgorI2RlZmluZSBXQ0Q5MzRYX0FOQV9CVUNLX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDcKKyNkZWZpbmUgV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA4CisjZGVmaW5lIFdDRDkzNFhfQU5BX0hQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwOQorI2RlZmluZSBXQ0Q5MzRYX0FOQV9FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGEKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTE9fMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBiCisjZGVmaW5lIFdDRDkzNFhfQU5BX01BRF9TRVRVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwZAorI2RlZmluZSBXQ0Q5MzRYX0FOQV9BTUlDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGUKKyNkZWZpbmUgV0NEOTM0WF9BTkFfQU1JQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBmCisjZGVmaW5lIFdDRDkzNFhfQU5BX0FNSUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMAorI2RlZmluZSBXQ0Q5MzRYX0FOQV9BTUlDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTEKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19NRUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE0CisjZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxNQorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTYKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE3CisjZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxOAorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTkKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFhCisjZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfQlROMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxYgorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWMKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFkCisjZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfQlRONCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxZQorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWYKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIwCisjZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfQlRONyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMQorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NSUNCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjIKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUlDQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIzCisjZGVmaW5lIFdDRDkzNFhfQU5BX01JQ0IyX1JBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNAorI2RlZmluZSBXQ0Q5MzRYX0FOQV9NSUNCMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjUKKyNkZWZpbmUgV0NEOTM0WF9BTkFfTUlDQjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI2CisjZGVmaW5lIFdDRDkzNFhfQU5BX1ZCQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNworI2RlZmluZSBXQ0Q5MzRYX0JJQVNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjgKKyNkZWZpbmUgV0NEOTM0WF9CSUFTX1ZCR19GSU5FX0FESiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI5CisjZGVmaW5lIFdDRDkzNFhfUkNPX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyZQorI2RlZmluZSBXQ0Q5MzRYX1JDT19DVFJMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MmYKKyNkZWZpbmUgV0NEOTM0WF9SQ09fQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjMwCisjZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzMQorI2RlZmluZSBXQ0Q5MzRYX1JDT19DQUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzIKKyNkZWZpbmUgV0NEOTM0WF9SQ09fVEVTVF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjMzCisjZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF9PVVRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNAorI2RlZmluZSBXQ0Q5MzRYX1JDT19DQUxfT1VUXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzUKKyNkZWZpbmUgV0NEOTM0WF9SQ09fQ0FMX09VVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM2CisjZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF9PVVRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNworI2RlZmluZSBXQ0Q5MzRYX1JDT19DQUxfT1VUXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzgKKyNkZWZpbmUgV0NEOTM0WF9TSURPX01PREVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNhCisjZGVmaW5lIFdDRDkzNFhfU0lET19NT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzYgorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTU9ERV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2MKKyNkZWZpbmUgV0NEOTM0WF9TSURPX01PREVfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNkCisjZGVmaW5lIFdDRDkzNFhfU0lET19WQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzZQorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fVkNMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2YKKyNkZWZpbmUgV0NEOTM0WF9TSURPX1ZDTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQwCisjZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0MQorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDIKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQzCisjZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NAorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDUKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ2CisjZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NworI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDgKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ5CisjZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0YQorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fRklMVEVSXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NGIKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0ZJTFRFUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRjCisjZGVmaW5lIFdDRDkzNFhfU0lET19EUklWRVJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0ZAorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fRFJJVkVSXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NGUKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0RSSVZFUl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRmCisjZGVmaW5lIFdDRDkzNFhfU0lET19DQUxfQ09ERV9FWFRfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1MAorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfRVhUXzIgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTEKKyNkZWZpbmUgV0NEOTM0WF9TSURPX0NBTF9DT0RFX09VVF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjUyCisjZGVmaW5lIFdDRDkzNFhfU0lET19DQUxfQ09ERV9PVVRfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1MworI2RlZmluZSBXQ0Q5MzRYX1NJRE9fVEVTVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTQKKyNkZWZpbmUgV0NEOTM0WF9TSURPX1RFU1RfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU1CisjZGVmaW5lIFdDRDkzNFhfTUJIQ19DVExfQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1NgorI2RlZmluZSBXQ0Q5MzRYX01CSENfQ1RMX0FOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTcKKyNkZWZpbmUgV0NEOTM0WF9NQkhDX0NUTF9TUEFSRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU4CisjZGVmaW5lIFdDRDkzNFhfTUJIQ19DVExfU1BBUkVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1OQorI2RlZmluZSBXQ0Q5MzRYX01CSENfQ1RMX0JDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWEKKyNkZWZpbmUgV0NEOTM0WF9NQkhDX1NUQVRVU19TUEFSRV8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjViCisjZGVmaW5lIFdDRDkzNFhfTUJIQ19URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1YworI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX1NVQkJMT0NLX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWQKKyNkZWZpbmUgV0NEOTM0WF9WQkFEQ19JQklBU19GRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVlCisjZGVmaW5lIFdDRDkzNFhfVkJBRENfQklBU19BREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1ZgorI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX0ZFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjAKKyNkZWZpbmUgV0NEOTM0WF9WQkFEQ19BRENfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjYxCisjZGVmaW5lIFdDRDkzNFhfVkJBRENfQURDX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2MgorI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX0FEQ19TQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjMKKyNkZWZpbmUgV0NEOTM0WF9WQkFEQ19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY0CisjZGVmaW5lIFdDRDkzNFhfTERPSF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2NworI2RlZmluZSBXQ0Q5MzRYX0xET0hfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjgKKyNkZWZpbmUgV0NEOTM0WF9MRE9IX1NUQl9MT0FEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY5CisjZGVmaW5lIFdDRDkzNFhfTERPSF9TTE9XUkFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2YQorI2RlZmluZSBXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmIKKyNkZWZpbmUgV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZjCisjZGVmaW5lIFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2ZAorI2RlZmluZSBXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmUKKyNkZWZpbmUgV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZmCisjZGVmaW5lIFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MAorI2RlZmluZSBXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzEKKyNkZWZpbmUgV0NEOTM0WF9NSUNCM19URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjcyCisjZGVmaW5lIFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MworI2RlZmluZSBXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzQKKyNkZWZpbmUgV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc1CisjZGVmaW5lIFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NgorI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9BRENfVkNNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzcKKyNkZWZpbmUgV0NEOTM0WF9UWF9DT01fQklBU19BVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc4CisjZGVmaW5lIFdDRDkzNFhfVFhfQ09NX0FEQ19JTlQxX0lCICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3OQorI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9BRENfSU5UMl9JQiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2N2EKKyNkZWZpbmUgV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjdiCisjZGVmaW5lIFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MDY3YworI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVE9QXzlQNk0gICAgICAgICAgICAgICAgICAweDA2N2QKKyNkZWZpbmUgV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RPUF8xMlAyODhNICAgICAgICAgICAgICAgMHgwNjdlCisjZGVmaW5lIFdDRDkzNFhfVFhfMV8yX1RFU1RfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3ZgorI2RlZmluZSBXQ0Q5MzRYX1RYXzFfMl9BRENfSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODAKKyNkZWZpbmUgV0NEOTM0WF9UWF8xXzJfQVRFU1RfUkVGQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjgxCisjZGVmaW5lIFdDRDkzNFhfVFhfMV8yX1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MgorI2RlZmluZSBXQ0Q5MzRYX1RYXzFfMl9URVNUX0JMS19FTiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODMKKyNkZWZpbmUgV0NEOTM0WF9UWF8xXzJfVFhGRV9DTEtESVYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg0CisjZGVmaW5lIFdDRDkzNFhfVFhfMV8yX1NBUjFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4NQorI2RlZmluZSBXQ0Q5MzRYX1RYXzFfMl9TQVIyX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODYKKyNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfVEVTVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg3CisjZGVmaW5lIFdDRDkzNFhfVFhfM180X0FEQ19JQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4OAorI2RlZmluZSBXQ0Q5MzRYX1RYXzNfNF9BVEVTVF9SRUZDVEwgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODkKKyNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhhCisjZGVmaW5lIFdDRDkzNFhfVFhfM180X1RFU1RfQkxLX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4YgorI2RlZmluZSBXQ0Q5MzRYX1RYXzNfNF9UWEZFX0NMS0RJViAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGMKKyNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfU0FSMV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhkCisjZGVmaW5lIFdDRDkzNFhfVFhfM180X1NBUjJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4ZQorI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9NT0RFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTcKKyNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk4CisjZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX01PREVfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5OQorI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9DVFJMX1ZDTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWEKKyNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQ1RSTF9WQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjliCisjZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5YworI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWQKKyNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjllCisjZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5ZgorI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTAKKyNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQlVDS19UTVVYX0FfRCAgICAgICAgICAgICAgICAgICAgICAgMHgwNmExCisjZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwgICAgICAgICAgICAgICAgICAgIDB4MDZhMgorI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9TUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTMKKyNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmE0CisjZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhNQorI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTYKKyNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmE3CisjZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhOAorI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzUgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTkKKyNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF82ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmFhCisjZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhYgorI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzggICAgICAgICAgICAgICAgICAgICAgICAweDA2YWMKKyNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF85ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmFkCisjZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgIDB4MDZhZQorI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzIgICAgICAgICAgICAgICAgICAgICAweDA2YWYKKyNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8zICAgICAgICAgICAgICAgICAgICAgMHgwNmIwCisjZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiMQorI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjIKKyNkZWZpbmUgV0NEOTM0WF9SWF9BVVhfU1dfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmIzCisjZGVmaW5lIFdDRDkzNFhfUlhfUEFfQVVYX0lOX0NPTk4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiNAorI2RlZmluZSBXQ0Q5MzRYX1JYX1RJTUVSX0RJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjUKKyNkZWZpbmUgV0NEOTM0WF9SWF9PQ1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI2CisjZGVmaW5lIFdDRDkzNFhfUlhfT0NQX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiNworI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRUFSX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjgKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0VBUl9BTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI5CisjZGVmaW5lIFdDRDkzNFhfUlhfQklBU19IUEhfTERPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiYQorI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfSFBIX1BBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YmIKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyICAgICAgICAgICAgICAgICAgMHgwNmJjCisjZGVmaW5lIFdDRDkzNFhfUlhfQklBU19IUEhfUkRBQ19MRE8gICAgICAgICAgICAgICAgICAgICAgIDB4MDZiZAorI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfSFBIX0NOUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YmUKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0hQSF9MT1dQT1dFUiAgICAgICAgICAgICAgICAgICAgICAgMHgwNmJmCisjZGVmaW5lIFdDRDkzNFhfUlhfQklBU19ESUZGTE9fUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjMAorI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzEKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19MRE8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMyCisjZGVmaW5lIFdDRDkzNFhfUlhfQklBU19TRUxPX0RBQ19QQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjMworI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfQlVDS19SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzQKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0JVQ0tfVlJFRl9FUlJBTVAgICAgICAgICAgICAgICAgICAgMHgwNmM1CisjZGVmaW5lIFdDRDkzNFhfUlhfQklBU19GTFlCX0VSUkFNUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjNgorI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9CVUZGICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzcKKyNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0ZMWUJfTUlEX1JTVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNmM4CisjZGVmaW5lIFdDRDkzNFhfSFBIX0xfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjOQorI2RlZmluZSBXQ0Q5MzRYX0hQSF9SX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2EKKyNkZWZpbmUgV0NEOTM0WF9IUEhfQ05QX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNiCisjZGVmaW5lIFdDRDkzNFhfSFBIX0NOUF9XR19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjYworI2RlZmluZSBXQ0Q5MzRYX0hQSF9DTlBfV0dfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2QKKyNkZWZpbmUgV0NEOTM0WF9IUEhfT0NQX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNlCisjZGVmaW5lIFdDRDkzNFhfSFBIX0FVVE9fQ0hPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjZgorI2RlZmluZSBXQ0Q5MzRYX0hQSF9DSE9QX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDAKKyNkZWZpbmUgV0NEOTM0WF9IUEhfUEFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQxCisjZGVmaW5lIFdDRDkzNFhfSFBIX1BBX0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMgorI2RlZmluZSBXQ0Q5MzRYX0hQSF9MX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDMKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ0CisjZGVmaW5lIFdDRDkzNFhfSFBIX0xfQVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkNQorI2RlZmluZSBXQ0Q5MzRYX0hQSF9SX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDYKKyNkZWZpbmUgV0NEOTM0WF9IUEhfUl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ3CisjZGVmaW5lIFdDRDkzNFhfSFBIX1JfQVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkOAorI2RlZmluZSBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDkKKyNkZWZpbmUgV0NEOTM0WF9IUEhfUkRBQ19DTEtfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRhCisjZGVmaW5lIFdDRDkzNFhfSFBIX1JEQUNfTERPX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkYgorI2RlZmluZSBXQ0Q5MzRYX0hQSF9SREFDX0NIT1BfQ0xLX0xQX0NUTCAgICAgICAgICAgICAgICAgICAweDA2ZGMKKyNkZWZpbmUgV0NEOTM0WF9IUEhfUkVGQlVGRl9VSFFBX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRkCisjZGVmaW5lIFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkZQorI2RlZmluZSBXQ0Q5MzRYX0hQSF9MX0RBQ19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGYKKyNkZWZpbmUgV0NEOTM0WF9IUEhfUl9EQUNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUwCisjZGVmaW5lIFdDRDkzNFhfRUFSX0VOX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlMQorI2RlZmluZSBXQ0Q5MzRYX0VBUl9DTUJVRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTIKKyNkZWZpbmUgV0NEOTM0WF9FQVJfSUNUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUzCisjZGVmaW5lIFdDRDkzNFhfRUFSX0VOX0RCR19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlNAorI2RlZmluZSBXQ0Q5MzRYX0VBUl9DTlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTUKKyNkZWZpbmUgV0NEOTM0WF9FQVJfREFDX0NUTF9BVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU2CisjZGVmaW5lIFdDRDkzNFhfRUFSX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlNworI2RlZmluZSBXQ0Q5MzRYX0VBUl9FQVJfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTgKKyNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU5CisjZGVmaW5lIFdDRDkzNFhfRElGRl9MT19MTzJfQ09NUEFOREVSICAgICAgICAgICAgICAgICAgICAgIDB4MDZlYQorI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fTE8xX0NPTVBBTkRFUiAgICAgICAgICAgICAgICAgICAgICAweDA2ZWIKKyNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0NPTU1PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmVjCisjZGVmaW5lIFdDRDkzNFhfRElGRl9MT19CWVBBU1NfRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlZAorI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fQ05QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZWUKKyNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0NPUkVfT1VUX1BST0cgICAgICAgICAgICAgICAgICAgICAgMHgwNmVmCisjZGVmaW5lIFdDRDkzNFhfRElGRl9MT19MRE9fT1VUX1BST0cgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmMAorI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fQ09NX1NXQ0FQX1JFRkJVRl9GUkVRICAgICAgICAgICAgICAweDA2ZjEKKyNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0NPTV9QQV9GUkVRICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmYyCisjZGVmaW5lIFdDRDkzNFhfRElGRl9MT19SRVNFUlZFRF9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmMworI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fTE8xX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjQKKyNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0xPMV9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNmY1CisjZGVmaW5lIFdDRDkzNFhfQU5BX05FV19QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgIDB4MDcwMAorI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDEKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzAyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwMworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9MRE9fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzA1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfTERPX09DUF9DT05GSUcgICAgICAgICAgICAgICAgICAgIDB4MDcwNgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1RYX0xET19DT05GSUcgICAgICAgICAgICAgICAgICAgICAweDA3MDcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9UWF9EUlZfQ09ORklHICAgICAgICAgICAgICAgICAgICAgMHgwNzA4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfUlhfQ09ORklHXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwOQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1JYX0NPTkZJR18yICAgICAgICAgICAgICAgICAgICAgICAweDA3MGEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9QTExfRU5BQkxFUyAgICAgICAgICAgICAgICAgICAgICAgMHgwNzBiCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfUExMX1BSRVNFVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwYworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAweDA3MGQKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX1BMTF9FTkFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzBlCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19QTExfUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwZgorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfUExMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTAKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzExCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxMgorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTMKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX1hPX1BSRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzE0CisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19YT19DQVBfWFRQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxNQorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfWE9fQ0FQX1hUTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTYKKyNkZWZpbmUgV0NEOTM0WF9CT09TVF9CU1RfRU5fRExZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzE4CisjZGVmaW5lIFdDRDkzNFhfQk9PU1RfQ1RSTF9JTElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxOQorI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX1ZPVVRfU0VUVElORyAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MWEKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19WT1VUX0FfU1RBUlRVUCAgICAgICAgICAgICAgICAgICAgMHgwNzFiCisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX1NUQVJUVVAgICAgICAgICAgICAgICAgICAgIDB4MDcxYworI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMSAgICAgICAgICAgICAgICAgICAgICAweDA3MWQKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIgICAgICAgICAgICAgICAgICAgICAgMHgwNzFlCisjZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfRUxFQ1RfUkVNX0NMQU1QX0NUTCAgICAgICAgICAgICAgIDB4MDcxZgorI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjAKKyNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzIxCisjZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfUExVR19ERVRFQ1RfQ1RMICAgICAgICAgICAgICAgICAgIDB4MDcyMgorI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX1pERVRfQU5BX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDA3MjMKKyNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19aREVUX1JBTVBfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwNzI0CisjZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfRlNNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyNQorI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX0FEQ19SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjYKKyNkZWZpbmUgV0NEOTM0WF9UWF9ORVdfQU1JQ180XzVfU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI3CisjZGVmaW5lIFdDRDkzNFhfVkJBRENfTkVXX0FEQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyZgorI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX05FV19BRENfRE9VVE1TQiAgICAgICAgICAgICAgICAgICAgICAweDA3MzAKKyNkZWZpbmUgV0NEOTM0WF9WQkFEQ19ORVdfQURDX0RPVVRMU0IgICAgICAgICAgICAgICAgICAgICAgMHgwNzMxCisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCAgICAgICAgICAgICAgICAgIDB4MDczMgorI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTCAgICAgICAgICAgICAgICAgICAweDA3MzMKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfTCAgICAgICAgICAgICAgICAgMHgwNzMzCisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19WUkVGX0NUTCAgICAgICAgICAgICAgICAgIDB4MDczNAorI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfT1ZFUlJJREVfQ1RMICAgICAgICAgICAgICAweDA3MzUKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX01JU0MxICAgICAgICAgICAgICAgICAgICAgMHgwNzM2CisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMX1IgICAgICAgICAgICAgICAgIDB4MDczNgorI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MxICAgICAgICAgICAgICAgICAgICAgICAweDA3MzcKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9NSVNDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNzM4CisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDICAgICAgICAgICAgICAgICAgIDB4MDczOQorI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEgICAgICAgICAgICAgICAgICAgICAweDA3M2EKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIyICAgICAgICAgICAgICAgICAgICAgMHgwNzNiCisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMyAgICAgICAgICAgICAgICAgICAgIDB4MDczYworI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjQgICAgICAgICAgICAgICAgICAgICAweDA3M2QKKyNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MyICAgICAgICAgICAgICAgICAgMHgwNzNlCisjZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDMyAgICAgICAgICAgICAgICAgIDB4MDczZgorI2RlZmluZSBXQ0Q5MzRYX1JYX05FV19JTlRfSFBIX1JEQUNfQklBU19MT0hJRkkgICAgICAgICAgICAweDA3NDUKKyNkZWZpbmUgV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0JJQVNfVUxQICAgICAgICAgICAgICAgMHgwNzQ2CisjZGVmaW5lIFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19MRE9fTFAgICAgICAgICAgICAgICAgIDB4MDc0NworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfTERPX1RFU1QgICAgICAgICAgICAgICAgICAweDA3NGIKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18xICAgICAgICAgICAgICAgMHgwNzRjCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fREVCVUdfMiAgICAgICAgICAgICAgIDB4MDc0ZAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfVFhfTERPX1RFU1QgICAgICAgICAgICAgICAweDA3NGUKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1RYX0RSVl9URVNUICAgICAgICAgICAgICAgMHgwNzRmCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUICAgICAgICAgICAgICAgICAgIDB4MDc1MAorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfVEVTVF9TVEFUVVMgICAgICAgICAgICAweDA3NTEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX0RFQlVHXzEgICAgICAgICAgICAgICAgMHgwNzUyCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9ERUJVR18yICAgICAgICAgICAgICAgIDB4MDc1MworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfQ0xLX0NUUkwgICAgICAgICAgICAgICAgICAweDA3NTQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzEgICAgICAgICAgICAgICAgMHgwNzU1CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SRVNFUlZFRF8yICAgICAgICAgICAgICAgIDB4MDc1NgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzAgICAgICAgICAweDA3NTcKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9QT1NUX0RJVl9SRUcxICAgICAgICAgMHgwNzU4CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUkVGX0RJVl9SRUcwICAgICAgICAgIDB4MDc1OQorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1JFRl9ESVZfUkVHMSAgICAgICAgICAweDA3NWEKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9GSUxURVJfUkVHMCAgICAgICAgICAgMHgwNzViCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfRklMVEVSX1JFRzEgICAgICAgICAgIDB4MDc1YworI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0xfVkFMICAgICAgICAgICAgICAgICAweDA3NWQKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9NX1ZBTCAgICAgICAgICAgICAgICAgMHgwNzVlCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTl9WQUwgICAgICAgICAgICAgICAgIDB4MDc1ZgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1RFU1RfUkVHMCAgICAgICAgICAgICAweDA3NjAKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9QRkRfQ1BfRFNNX1BST0cgICAgICAgMHgwNzYxCisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVkNPX1BST0cgICAgICAgICAgICAgIDB4MDc2MgorI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1RFU1RfUkVHMSAgICAgICAgICAgICAweDA3NjMKKyNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9MRE9fTE9DS19DRkcgICAgICAgICAgMHgwNzY0CisjZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfRElHX0xPQ0tfREVUX0NGRyAgICAgIDB4MDc2NQorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzAgICAgICAgICAgICAgICAgICAweDA3NmMKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9QT1NUX0RJVl9SRUcxICAgICAgICAgICAgICAgICAgMHgwNzZkCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcwICAgICAgICAgICAgICAgICAgIDB4MDc2ZQorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1JFRl9ESVZfUkVHMSAgICAgICAgICAgICAgICAgICAweDA3NmYKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMCAgICAgICAgICAgICAgICAgICAgMHgwNzcwCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfRklMVEVSX1JFRzEgICAgICAgICAgICAgICAgICAgIDB4MDc3MQorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9MX1ZBTCAgICAgICAgICAgICAgICAgICAgICAweDA3NzIKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTV9WQUwgICAgICAgICAgICAgICAgICAgICAgMHgwNzczCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfUExMX05fVkFMICAgICAgICAgICAgICAgICAgICAgIDB4MDc3NAorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMCAgICAgICAgICAgICAgICAgICAgICAweDA3NzUKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9QRkRfQ1BfRFNNX1BST0cgICAgICAgICAgICAgICAgMHgwNzc2CisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfVkNPX1BST0cgICAgICAgICAgICAgICAgICAgICAgIDB4MDc3NworI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMSAgICAgICAgICAgICAgICAgICAgICAweDA3NzgKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9MRE9fTE9DS19DRkcgICAgICAgICAgICAgICAgICAgMHgwNzc5CisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfRElHX0xPQ0tfREVUX0NGRyAgICAgICAgICAgICAgIDB4MDc3YQorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMSAgICAgICAgICAgICAgICAgICAgICAweDA3N2IKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9DTEtfVEVTVDIgICAgICAgICAgICAgICAgICAgICAgMHgwNzdjCisjZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QzICAgICAgICAgICAgICAgICAgICAgIDB4MDc3ZAorI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1hPX1RFU1QxICAgICAgICAgICAgICAgICAgICAgICAweDA3N2UKKyNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9YT19URVNUMiAgICAgICAgICAgICAgICAgICAgICAgMHgwNzdmCisjZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX1ZDT01QX0hZU1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDc4NworI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9WTE9PUF9GSUxURVIgICAgICAgICAgICAgICAgICAgICAweDA3ODgKKyNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JREVMVEEgICAgICAgICAgICAgICAgICAgICAgMHgwNzg5CisjZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfSUxJTV9TVEFSVFVQICAgICAgICAgICAgICAgIDB4MDc4YQorI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX01JTl9PTlRJTUUgICAgICAgICAgICAgICAgICAweDA3OGIKKyNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9NQVhfT05USU1FICAgICAgICAgICAgICAgICAgMHgwNzhjCisjZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfVElNSU5HICAgICAgICAgICAgICAgICAgICAgIDB4MDc4ZAorI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9UTVVYX0FfRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA3OGUKKyNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfU1dfRFJWX0NOVEwgICAgICAgICAgICAgICAgICAgICAgMHgwNzhmCisjZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX1NQQVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc5MAorI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9TUEFSRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3OTEKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwNzk2CisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX1NQQVJFXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDc5NworI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfQSAgICAgICAgICAweDA3OTgKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfREVCVUdfVk9VVF9TRVRUSU5HX0QgICAgICAgICAgMHgwNzk5CisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfSU5DX1dBSVQgICAgICAgICAgICAgICAgIDB4MDc5YQorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX0NUTCAgICAgICAgICAgICAweDA3OWIKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9JQkxFRURfQ1RMICAgICAgICAgICAgICAgMHgwNzljCisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX0NQUk9WUl9URVNUICAgICAgICAgICAgIDB4MDc5ZAorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0NUTF9BICAgICAgICAgICAgICAgICAgICAweDA3OWUKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9DVExfRCAgICAgICAgICAgICAgICAgICAgMHgwNzlmCisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfVElNRU9VVF9QRVJJT0QgICAgICAgICAgIDB4MDdhMAorI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkcxICAgICAgICAweDA3YTEKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMiAgICAgICAgMHgwN2EyCisjZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzMgICAgICAgIDB4MDdhMworI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ISUdIX0FDQ1VfTU9ERV9TRUwxICAgICAgICAgICAweDA3YTQKKyNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfSElHSF9BQ0NVX01PREVfU0VMMiAgICAgICAgICAgMHgwN2E1CisjZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfSFBGICAgICAgICAgICAgICAgICAgICAgIDB4MDdhZgorI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX1JFRiAgICAgICAgICAgICAgICAgICAgICAweDA3YjAKKyNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19JTlRfU0xOUV9DT01QICAgICAgICAgICAgICAgICAgICAgMHgwN2IxCisjZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NQQVJFXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDdiMgorI2RlZmluZSBXQ0Q5MzRYX1BBR0UxMF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAweDBhMDAKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTAxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8xX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX01PREVfMl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhMDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9GRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTA0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfRkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9BX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMDYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9MUEZfRkZfQl9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTA3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfTFBGX0ZCX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwOAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX1NNTFBGX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhMDkKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9EQ0ZMVF9TSElGVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTBhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGEwYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9JSVJfQ09FRkZfMl9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTBkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfRkZfQV9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGEwZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMGYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9GQl9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTEwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfUkNfQ09NTU9OX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGExMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0ZJRk9fQ09NTU9OX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMTMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9SQzBfU1RBVFVTX0ZNSU5fQ05UUiAgICAgICAgICAgICAgMHgwYTE0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfUkMxX1NUQVRVU19GTUlOX0NOVFIgICAgICAgICAgICAgIDB4MGExNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX1JDMF9TVEFUVVNfRk1BWF9DTlRSICAgICAgICAgICAgICAweDBhMTYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNQVhfQ05UUiAgICAgICAgICAgICAgMHgwYTE3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4MGExOAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0NMS19SRVNFVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMTkKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTFhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfTU9ERV8yX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGExYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0ZGX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhMWMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9GQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTFkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfTFBGX0ZGX0FfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGExZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GRl9CX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMWYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9MUEZfRkJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTIwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfU01MUEZfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEyMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0RDRkxUX1NISUZUX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMjIKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9JSVJfQURBUFRfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTIzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzFfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9DT0VGRl8yX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMjUKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9GRl9BX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTI2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfRkZfQl9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGEyNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0ZCX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhMjgKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9SQ19DT01NT05fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTI5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfRklGT19DT01NT05fQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX1JDMF9TVEFUVVNfRk1JTl9DTlRSICAgICAgICAgICAgICAweDBhMmMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9SQzFfU1RBVFVTX0ZNSU5fQ05UUiAgICAgICAgICAgICAgMHgwYTJkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUFYX0NOVFIgICAgICAgICAgICAgIDB4MGEyZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX1JDMV9TVEFUVVNfRk1BWF9DTlRSICAgICAgICAgICAgICAweDBhMmYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTMwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhMzIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTMzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhMzUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYTM2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhMzgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTM5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhM2IKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTNjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBhM2UKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTQxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhNDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTQ0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGE0NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhNDYKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTQ3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhNDkKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTRhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhNGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTRkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhNTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTUzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhNTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYTU2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhNTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTU5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhNWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTVjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhNjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTYyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhNjQKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTY1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGE2NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBhNjcKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTY4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBhNmEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTZiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2YworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBhNmQKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTcxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhNzMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTc0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGE3NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhNzYKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTc3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhNzkKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTdhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhN2MKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTdkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhODIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTgzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhODUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYTg2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhODgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTg5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhOGIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYThjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhOTEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTkyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhOTQKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTk1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGE5NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBhOTcKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTk4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBhOWEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTliCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5YworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBhOWQKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWExCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhYTMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWE0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGFhNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhYTYKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWE3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhOAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhYTkKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYWFhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhYWMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYWFkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhYjIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWIzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhYjUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYWI2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhYjgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYWI5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhYmIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAweDBhYzIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgMHgwYWMzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAgIDB4MGFjNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgICAweDBhYzcKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgICAgMHgwYWNhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgIDB4MGFjYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAweDBhY2UKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgICAgMHgwYWNmCisjZGVmaW5lIFdDRDkzNFhfUEFHRTExX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjAyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDMgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDQKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjA1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDYgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDcKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw3ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjA4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAweDBiMGEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjBiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDQgICAgICAgICAgICAgICAgICAgICAgICAweDBiMGQKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjBlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDcgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTAKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjExCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwzICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjE0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDUgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjE3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxOAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTkKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjFhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxYgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDMgICAgICAgICAgICAgICAgICAgICAgICAweDBiMWMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjFkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDYgICAgICAgICAgICAgICAgICAgICAgICAweDBiMWYKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw3ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjIwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzIKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjMzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDQgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzUKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjM2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDcgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzgKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjM5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAweDBiM2IKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwzICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjNjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDUgICAgICAgICAgICAgICAgICAgICAgICAweDBiM2UKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjNmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBiNDEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgICAweDBiNDQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQ1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGI0NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBiNDcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYjQ4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBiNGEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjRiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0YworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBiNGUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjRmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgICAweDBiNTEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgICAgMHgwYjUyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0RTTURFTV9DVEwgICAgICAgICAgICAgICAgIDB4MGI1MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBiNTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjU2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgICAweDBiNTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjU5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGI1YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBiNWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYjVjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBiNWUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjVmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBiNjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjYyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiNjQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYjY1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGI2NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiNjcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjY5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBiNmIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjZjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAweDBiNmUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYjZmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGI3MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBiNzEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjcyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBiNzQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjc1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiNzcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjc4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGI3OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiN2EKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYjdiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiN2UKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjdmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiODEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYjgyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGI4MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiODQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjg1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiODcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjg4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiOGIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjhjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGI4ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiOGUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYjhmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiOTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjkzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiOTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYjk2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGI5NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiOTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjk5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiOWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjljCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5ZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiOWYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYmEwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGJhMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiYTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYmEzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiY2UKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiZDEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYmQyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGJkMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiZDQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQ1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiZDcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQ4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiZGIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYmRjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGJkZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiZGUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYmRmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiZTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmUzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiZTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYmU2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGJlNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiZTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYmU5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiZWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYmVjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiZWYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYmYwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGJmMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiZjIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYmYzCisjZGVmaW5lIFdDRDkzNFhfUEFHRTEyX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9ETFlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzAyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfREVDQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0hQSF9WX1BBICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDQKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9FQVJfVl9QQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfSEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0VBUl9WX0hEICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDcKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9LMV9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSzFfTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0syX01TQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9LMl9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSURMRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfSFBIICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGQKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9JRExFX0VBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX1RFU1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMTAKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9PVlJfVlJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzExCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgIDB4MGMxOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBjMWEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzEgICAgICAgICAgICAgICAgICAgICAgMHgwYzFiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DRkcyICAgICAgICAgICAgICAgICAgICAgIDB4MGMxYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAweDBjMjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYzIyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcxICAgICAgICAgICAgICAgICAgICAgIDB4MGMyMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAweDBjMjQKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYzNkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMzZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDEgICAgICAgICAgICAgICAgICAgICAweDBjM2YKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwyICAgICAgICAgICAgICAgICAgICAgMHgwYzQwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMyAgICAgICAgICAgICAgICAgICAgIDB4MGM0MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEtfRVNUMSAgICAgICAgICAgICAgICAgICAgICAweDBjNDIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDIgICAgICAgICAgICAgICAgICAgICAgMHgwYzQzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QzICAgICAgICAgICAgICAgICAgICAgIDB4MGM0NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzEgICAgICAgICAgICAgICAgICAgICAweDBjNDUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1JGX1BST0MyICAgICAgICAgICAgICAgICAgICAgMHgwYzQ2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9UQUMxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM0NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMiAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNDgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzQ5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9UQUM0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM0YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQxICAgICAgICAgICAgICAgICAgICAweDBjNGIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMiAgICAgICAgICAgICAgICAgICAgMHgwYzRjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDMgICAgICAgICAgICAgICAgICAgIDB4MGM0ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQ0ICAgICAgICAgICAgICAgICAgICAweDBjNGUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0RFQlVHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYzRmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRF9NT04gICAgICAgICAgICAgICAgIDB4MGM1MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9NT05fVkFMICAgICAgICAgICAgICAgICAweDBjNTEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0JBTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzUyCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGM1NQorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNTYKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzU3CisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGM1OAorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAweDBjNTkKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgMHgwYzVhCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgIDB4MGM1YgorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAweDBjNWMKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgMHgwYzVkCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGM2MQorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNjIKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzYzCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGM2NAorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAweDBjNjUKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgMHgwYzY2CisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgIDB4MGM2NworI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAweDBjNjgKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgMHgwYzY5CisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGM2ZAorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNmUKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzZmCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGM3MAorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAweDBjNzEKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgMHgwYzcyCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgIDB4MGM3MworI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAweDBjNzQKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgMHgwYzc1CisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGM3OQorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjN2EKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzdiCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGM3YworI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAweDBjN2QKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgMHgwYzdlCisjZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgIDB4MGM3ZgorI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAweDBjODAKKyNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgMHgwYzgxCisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wICAgICAgICAgICAgICAgICAgIDB4MGM4NQorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMSAgICAgICAgICAgICAgICAgICAweDBjODYKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzIgICAgICAgICAgICAgICAgICAgMHgwYzg3CisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8zICAgICAgICAgICAgICAgICAgIDB4MGM4OAorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMCAgICAgICAgICAgICAgICAgICAweDBjODkKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzEgICAgICAgICAgICAgICAgICAgMHgwYzhhCisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8yICAgICAgICAgICAgICAgICAgIDB4MGM4YgorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMyAgICAgICAgICAgICAgICAgICAweDBjOGMKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzAgICAgICAgICAgICAgICAgICAgMHgwYzhkCisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfQUREUl8xICAgICAgICAgICAgICAgICAgIDB4MGM4ZQorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMiAgICAgICAgICAgICAgICAgICAweDBjOGYKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzMgICAgICAgICAgICAgICAgICAgMHgwYzkwCisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wICAgICAgICAgICAgICAgICAgIDB4MGM5MQorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMSAgICAgICAgICAgICAgICAgICAweDBjOTIKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzIgICAgICAgICAgICAgICAgICAgMHgwYzkzCisjZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8zICAgICAgICAgICAgICAgICAgIDB4MGM5NAorI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX0FDQ0VTU19DRkcgICAgICAgICAgICAgICAgICAweDBjOTUKKyNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfU1RBVFVTICAgICAgICAgICAgICAgMHgwYzk2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMICAgICAgICAgIDB4MGNiNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMwX1NUX1NSQ19QQVRIX0NGRzEgICAgICAgICAweDBjYjYKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DVEwgICAgICAgICAgMHgwY2I5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ0ZHMSAgICAgICAgIDB4MGNiYQorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAweDBjYmQKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2JlCisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNiZgorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAweDBjYzAKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgMHgwY2MxCisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgIDB4MGNjMgorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAweDBjYzMKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgMHgwY2M0CisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgIDB4MGNjNQorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAweDBjYzkKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2NhCisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNjYgorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAweDBjY2MKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgMHgwY2NkCisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgIDB4MGNjZQorI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAweDBjY2YKKyNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgMHgwY2QwCisjZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgIDB4MGNkMQorI2RlZmluZSBXQ0Q5MzRYX0VDX1JFRl9IUTBfRUNfUkVGX0hRX1BBVEhfQ1RMICAgICAgICAgICAgICAweDBjZDUKKyNkZWZpbmUgV0NEOTM0WF9FQ19SRUZfSFEwX0VDX1JFRl9IUV9DRkcwICAgICAgICAgICAgICAgICAgMHgwY2Q2CisjZGVmaW5lIFdDRDkzNFhfRUNfUkVGX0hRMV9FQ19SRUZfSFFfUEFUSF9DVEwgICAgICAgICAgICAgIDB4MGNkZAorI2RlZmluZSBXQ0Q5MzRYX0VDX1JFRl9IUTFfRUNfUkVGX0hRX0NGRzAgICAgICAgICAgICAgICAgICAweDBjZGUKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9DTEtfUlNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwY2U1CisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNlNgorI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjZTcKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9GSUZPX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2U4CisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9MU0IgICAgICAgICAgICAgIDB4MGNlOQorI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTVNCICAgICAgICAgICAgICAweDBjZWEKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX0xTQiAgICAgICAgICAgICAgMHgwY2ViCisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9NU0IgICAgICAgICAgICAgIDB4MGNlYworI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GSUZPICAgICAgICAgICAgICAgICAgICAgICAweDBjZWQKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9DTEtfUlNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwY2YxCisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNmMgorI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjZjMKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9GSUZPX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2Y0CisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9MU0IgICAgICAgICAgICAgIDB4MGNmNQorI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTVNCICAgICAgICAgICAgICAweDBjZjYKKyNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX0xTQiAgICAgICAgICAgICAgMHgwY2Y3CisjZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9NU0IgICAgICAgICAgICAgIDB4MGNmOAorI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GSUZPICAgICAgICAgICAgICAgICAgICAgICAweDBjZjkKKyNkZWZpbmUgV0NEOTM0WF9QQUdFMTNfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgMHgwZDAwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwICAgICAgICAgICAgICAgIDB4MGQwMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMSAgICAgICAgICAgICAgICAweDBkMDIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAgICAgICAgICAgICAgICAgMHgwZDAzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxICAgICAgICAgICAgICAgIDB4MGQwNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCAgICAgICAgICAgICAgICAweDBkMDUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEgICAgICAgICAgICAgICAgMHgwZDA2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwICAgICAgICAgICAgICAgIDB4MGQwNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMSAgICAgICAgICAgICAgICAweDBkMDgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAgICAgICAgICAgICAgICAgMHgwZDA5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxICAgICAgICAgICAgICAgIDB4MGQwYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMCAgICAgICAgICAgICAgICAweDBkMGYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEgICAgICAgICAgICAgICAgMHgwZDEwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwICAgICAgICAgICAgICAgIDB4MGQxMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMSAgICAgICAgICAgICAgICAweDBkMTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCAgICAgICAgICAgICAgICAgMHgwZDEzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzEgICAgICAgICAgICAgICAgIDB4MGQxNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyICAgICAgICAgICAgICAgICAweDBkMTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMyAgICAgICAgICAgICAgICAgMHgwZDE2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzQgICAgICAgICAgICAgICAgIDB4MGQxNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwICAgICAgICAgICAweDBkMTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMSAgICAgICAgICAgMHgwZDE5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzAgICAgICAgICAgICAgICAgICAgIDB4MGQxYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NQTElORV9BU1JDX0NGRzAgICAgICAgICAgICAweDBkMWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9FQ19SRUZfSFFfQ0ZHMCAgICAgICAgICAgICAgMHgwZDFjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQxZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEgICAgICAgICAgICAgICAweDBkMWUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwICAgICAgICAgICAgICAgMHgwZDFmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSAgICAgICAgICAgICAgIDB4MGQyMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzAgICAgICAgICAgICAgICAweDBkMjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxICAgICAgICAgICAgICAgMHgwZDIyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQyMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzEgICAgICAgICAgICAgICAweDBkMjUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICAgICAgICAgICAgICAgMHgwZDI2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQyNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg2X0NGRzAgICAgICAgICAgICAgICAweDBkMjgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwICAgICAgICAgICAgICAgMHgwZDI5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQyYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwICAgICAgICAgICAgICAweDBkMmIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTFfQ0ZHMCAgICAgICAgICAgICAgMHgwZDJjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzAgICAgICAgICAgICAgIDB4MGQyZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwICAgICAgICAgICAgICAweDBkMmUKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMCAgICAgMHgwZDMxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEgICAgIDB4MGQzMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcyICAgICAweDBkMzMKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMyAgICAgMHgwZDM0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzAgICAgIDB4MGQzNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcxICAgICAweDBkMzYKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMiAgICAgMHgwZDM3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMgICAgIDB4MGQzOAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAgICAgICAgICAgICAgICAgICAweDBkM2EKKyNkZWZpbmUgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxICAgICAgICAgICAgICAgICAgMHgwZDNiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMiAgICAgICAgICAgICAgICAgIDB4MGQzYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMgICAgICAgICAgICAgICAgICAweDBkM2QKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCAgICAgICAgICAgICAgMHgwZDQxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCAgICAgICAgICAgIDB4MGQ0MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wgICAgICAgICAgICAgICAweDBkNDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0RTRF9DT05UUk9MICAgICAgICAgICAgICAgMHgwZDQ0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9BU1JDX1NIQVJFX0NPTlRST0wgICAgICAgIDB4MGQ0NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfR0ZNX0NPTlRST0wgICAgICAgICAgICAgICAweDBkNDYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwZDQ5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QwICAgICAgICAgIDB4MGQ0YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMSAgICAgICAgICAweDBkNGIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9MU0IgICAgICAgMHgwZDRjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTVNCICAgICAgIDB4MGQ0ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NUQVRVUyAgICAgICAgICAgICAgICAweDBkNGUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0NUUkwgICAgICAgICAgICAgMHgwZDRmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQiAgICAgICAgIDB4MGQ1MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0IgICAgICAgICAweDBkNTEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCX1JEICAgICAgMHgwZDUyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQl9SRCAgICAgIDB4MGQ1MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTF9SRVBFQVRfUEFUICAgICAgICAweDBkNTQKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwgICAgICAgICAgICAgMHgwZDU1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMICAgICAgICAgIDB4MGQ1NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IyX0NUTCAgICAgICAgICAweDBkNTcKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwgICAgICAgICAgMHgwZDU4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMICAgICAgICAgIDB4MGQ1OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I1X0NUTCAgICAgICAgICAweDBkNWEKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNl9DVEwgICAgICAgICAgMHgwZDViCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjdfQ1RMICAgICAgICAgIDB4MGQ1YworI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I4X0NUTCAgICAgICAgICAweDBkNWQKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ1RMICAgICAgICAgICAgICAgICAgMHgwZDVlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fVElNRVJfQ1RMICAgICAgIDB4MGQ1ZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCAgICAgICAgICAweDBkNjAKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgICAgICAgICAgMHgwZDYxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX1BBVEhfQ1RMICAgICAgICAgICAgIDB4MGQ2NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCAgICAgICAgICAweDBkNjYKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMl9DVEwgICAgICAgICAgMHgwZDY3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMICAgICAgICAgIDB4MGQ2OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I0X0NUTCAgICAgICAgICAweDBkNjkKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNV9DVEwgICAgICAgICAgMHgwZDZhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjZfQ1RMICAgICAgICAgIDB4MGQ2YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I3X0NUTCAgICAgICAgICAweDBkNmMKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9COF9DVEwgICAgICAgICAgMHgwZDZkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NUTCAgICAgICAgICAgICAgICAgIDB4MGQ2ZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX1RJTUVSX0NUTCAgICAgICAweDBkNmYKKyNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMV9DVEwgICAgICAgICAgMHgwZDcwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMICAgICAgICAgIDB4MGQ3MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODEKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDgyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAgICAweDBkODkKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9XUl9NU0IgICAgICAgICAgICAgICAgICAgMHgwZDhhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfTFVUICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAgICAweDBkOGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9SRF9NU0IgICAgICAgICAgICAgICAgICAgMHgwZDhkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTFNCICAgICAgICAgICAgICAgICAgIDB4MGQ4ZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1dSX01TQiAgICAgICAgICAgICAgICAgICAweDBkOGYKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgICAgMHgwZDkwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTFNCICAgICAgICAgICAgICAgICAgIDB4MGQ5MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1JEX01TQiAgICAgICAgICAgICAgICAgICAweDBkOTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTFNCICAgICAgICAgICAgICAgICAgMHgwZDkzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX01TQiAgICAgICAgICAgICAgICAgIDB4MGQ5NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgICAweDBkOTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTFNCICAgICAgICAgICAgICAgICAgMHgwZDk2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX01TQiAgICAgICAgICAgICAgICAgIDB4MGQ5NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9XUl9MU0IgICAgICAgICAgICAgICAgICAweDBkOTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgICAgMHgwZDk5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX0xVVCAgICAgICAgICAgICAgICAgICAgIDB4MGQ5YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9SRF9MU0IgICAgICAgICAgICAgICAgICAweDBkOWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgICAgMHgwZDljCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRiMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYjIKKyNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGIzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRiNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYjUKKyNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMF9DRkc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGI2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRiNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYzEKKyNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMV9DRkcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGMyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYzQKKyNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMV9DRkczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGM1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYzcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgMHgwZGQxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRkMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBkZDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwZGQ0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGRkNQorI2RlZmluZSBXQ0Q5MzRYX1BBR0UxNF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAweDBlMDAKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgMHgwZTAxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGUwMgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUFVMU0VfU1VQUl9DVEwgICAgICAgICAgICAweDBlMDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgMHgwZTA0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9CV19TVyAgICAgICAgICAgICAgICAgICAgIDB4MGUwNQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVEhSRVNIICAgICAgICAgICAgICAgICAgICAweDBlMDYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgwZTA3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0NUUkwgICAgICAgICAgICAgICAgIDB4MGUwOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19USU1FUjIgICAgICAgICAgICAgICAweDBlMGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMSAgICAgICAgICAgMHgwZTBkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzIgICAgICAgICAgIDB4MGUwZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlczICAgICAgICAgICAweDBlMGYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXNCAgICAgICAgICAgMHgwZTEwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzUgICAgICAgICAgIDB4MGUxMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzEgICAgICAgICAgICAweDBlMTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlcyICAgICAgICAgICAgMHgwZTEzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMyAgICAgICAgICAgIDB4MGUxNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzQgICAgICAgICAgICAweDBlMTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlc1ICAgICAgICAgICAgMHgwZTE2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlcxICAgICAgICAgIDB4MGUxNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMiAgICAgICAgICAweDBlMTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzMgICAgICAgICAgMHgwZTE5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlc0ICAgICAgICAgIDB4MGUxYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXNSAgICAgICAgICAweDBlMWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzEgICAgICAgICAgICAgMHgwZTFjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlcyICAgICAgICAgICAgIDB4MGUxZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMyAgICAgICAgICAgICAweDBlMWUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzQgICAgICAgICAgICAgMHgwZTFmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlc1ICAgICAgICAgICAgIDB4MGUyMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1BWF9ESUFHICAgICAgICAgICAgICAgICAweDBlMjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JNSU5fRElBRyAgICAgICAgICAgICAgICAgMHgwZTIyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9QSF9ERVQgICAgICAgICAgICAgICAgICAgIDB4MGUyMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19DTFIgICAgICAgICAgICAgICAgICAweDBlMjQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX01CX1NXX1NUQVRFICAgICAgICAgICAgICAgMHgwZTI1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9NQVNUX0RJQUdfU1RBVEUgICAgICAgICAgIDB4MGUyNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfN18wICAgICAgICAgICAgICAweDBlMjcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzE1XzggICAgICAgICAgICAgMHgwZTI4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8yM18xNiAgICAgICAgICAgIDB4MGUyOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzFfMjQgICAgICAgICAgICAweDBlMmEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzM5XzMyICAgICAgICAgICAgMHgwZTJiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF80MF80MyAgICAgICAgICAgIDB4MGUyYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAweDBlMzEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwZTMyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9QVUxTRV9TVVBSX0NUTCAgICAgICAgICAgIDB4MGUzMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfVElNRVIgICAgICAgICAgICAgICAgICAgICAweDBlMzQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0JXX1NXICAgICAgICAgICAgICAgICAgICAgMHgwZTM1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9USFJFU0ggICAgICAgICAgICAgICAgICAgIDB4MGUzNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDBlMzcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ1RSTCAgICAgICAgICAgICAgICAgMHgwZTM5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX1RJTUVSMiAgICAgICAgICAgICAgIDB4MGUzYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlcxICAgICAgICAgICAweDBlM2QKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMiAgICAgICAgICAgMHgwZTNlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzMgICAgICAgICAgIDB4MGUzZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlc0ICAgICAgICAgICAweDBlNDAKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXNSAgICAgICAgICAgMHgwZTQxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMSAgICAgICAgICAgIDB4MGU0MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzIgICAgICAgICAgICAweDBlNDMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlczICAgICAgICAgICAgMHgwZTQ0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNCAgICAgICAgICAgIDB4MGU0NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzUgICAgICAgICAgICAweDBlNDYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzEgICAgICAgICAgMHgwZTQ3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlcyICAgICAgICAgIDB4MGU0OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMyAgICAgICAgICAweDBlNDkKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzQgICAgICAgICAgMHgwZTRhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlc1ICAgICAgICAgIDB4MGU0YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMSAgICAgICAgICAgICAweDBlNGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzIgICAgICAgICAgICAgMHgwZTRkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlczICAgICAgICAgICAgIDB4MGU0ZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNCAgICAgICAgICAgICAweDBlNGYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzUgICAgICAgICAgICAgMHgwZTUwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9STUFYX0RJQUcgICAgICAgICAgICAgICAgIDB4MGU1MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUk1JTl9ESUFHICAgICAgICAgICAgICAgICAweDBlNTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1BIX0RFVCAgICAgICAgICAgICAgICAgICAgMHgwZTUzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0NMUiAgICAgICAgICAgICAgICAgIDB4MGU1NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfTUJfU1dfU1RBVEUgICAgICAgICAgICAgICAweDBlNTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX01BU1RfRElBR19TVEFURSAgICAgICAgICAgMHgwZTU2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF83XzAgICAgICAgICAgICAgIDB4MGU1NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMTVfOCAgICAgICAgICAgICAweDBlNTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzIzXzE2ICAgICAgICAgICAgMHgwZTU5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8zMV8yNCAgICAgICAgICAgIDB4MGU1YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMzlfMzIgICAgICAgICAgICAweDBlNWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzQwXzQzICAgICAgICAgICAgMHgwZTVjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9DTEtfUlNUX0NUTCAgICAgICAgICAgICAgIDB4MGU2MQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBlNjIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1BVTFNFX1NVUFJfQ1RMICAgICAgICAgICAgMHgwZTYzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9USU1FUiAgICAgICAgICAgICAgICAgICAgIDB4MGU2NAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfQldfU1cgICAgICAgICAgICAgICAgICAgICAweDBlNjUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgMHgwZTY2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MGU2NworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DVFJMICAgICAgICAgICAgICAgICAweDBlNjkKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfVElNRVIyICAgICAgICAgICAgICAgMHgwZTZjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzEgICAgICAgICAgIDB4MGU2ZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlcyICAgICAgICAgICAweDBlNmUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMyAgICAgICAgICAgMHgwZTZmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzQgICAgICAgICAgIDB4MGU3MAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlc1ICAgICAgICAgICAweDBlNzEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcxICAgICAgICAgICAgMHgwZTcyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlUX0JXMiAgICAgICAgICAgIDB4MGU3MworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzMgICAgICAgICAgICAweDBlNzQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc0ICAgICAgICAgICAgMHgwZTc1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlUX0JXNSAgICAgICAgICAgIDB4MGU3NgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMSAgICAgICAgICAweDBlNzcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzIgICAgICAgICAgMHgwZTc4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlczICAgICAgICAgIDB4MGU3OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNCAgICAgICAgICAweDBlN2EKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzUgICAgICAgICAgMHgwZTdiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlcxICAgICAgICAgICAgIDB4MGU3YworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMiAgICAgICAgICAgICAweDBlN2QKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzMgICAgICAgICAgICAgMHgwZTdlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlc0ICAgICAgICAgICAgIDB4MGU3ZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXNSAgICAgICAgICAgICAweDBlODAKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JNQVhfRElBRyAgICAgICAgICAgICAgICAgMHgwZTgxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9STUlOX0RJQUcgICAgICAgICAgICAgICAgIDB4MGU4MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUEhfREVUICAgICAgICAgICAgICAgICAgICAweDBlODMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfQ0xSICAgICAgICAgICAgICAgICAgMHgwZTg0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQl9TV19TVEFURSAgICAgICAgICAgICAgIDB4MGU4NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfTUFTVF9ESUFHX1NUQVRFICAgICAgICAgICAweDBlODYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzdfMCAgICAgICAgICAgICAgMHgwZTg3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8xNV84ICAgICAgICAgICAgIDB4MGU4OAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMjNfMTYgICAgICAgICAgICAweDBlODkKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzMxXzI0ICAgICAgICAgICAgMHgwZThhCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8zOV8zMiAgICAgICAgICAgIDB4MGU4YgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfNDBfNDMgICAgICAgICAgICAweDBlOGMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgMHgwZTkxCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGU5MgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUFVMU0VfU1VQUl9DVEwgICAgICAgICAgICAweDBlOTMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgMHgwZTk0CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9CV19TVyAgICAgICAgICAgICAgICAgICAgIDB4MGU5NQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVEhSRVNIICAgICAgICAgICAgICAgICAgICAweDBlOTYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgwZTk3CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0NUUkwgICAgICAgICAgICAgICAgIDB4MGU5OQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19USU1FUjIgICAgICAgICAgICAgICAweDBlOWMKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMSAgICAgICAgICAgMHgwZTlkCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzIgICAgICAgICAgIDB4MGU5ZQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlczICAgICAgICAgICAweDBlOWYKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXNCAgICAgICAgICAgMHgwZWEwCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzUgICAgICAgICAgIDB4MGVhMQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzEgICAgICAgICAgICAweDBlYTIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlcyICAgICAgICAgICAgMHgwZWEzCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMyAgICAgICAgICAgIDB4MGVhNAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzQgICAgICAgICAgICAweDBlYTUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlc1ICAgICAgICAgICAgMHgwZWE2CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlcxICAgICAgICAgIDB4MGVhNworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMiAgICAgICAgICAweDBlYTgKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzMgICAgICAgICAgMHgwZWE5CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlc0ICAgICAgICAgIDB4MGVhYQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXNSAgICAgICAgICAweDBlYWIKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzEgICAgICAgICAgICAgMHgwZWFjCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlcyICAgICAgICAgICAgIDB4MGVhZAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMyAgICAgICAgICAgICAweDBlYWUKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzQgICAgICAgICAgICAgMHgwZWFmCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlc1ICAgICAgICAgICAgIDB4MGViMAorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1BWF9ESUFHICAgICAgICAgICAgICAgICAweDBlYjEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JNSU5fRElBRyAgICAgICAgICAgICAgICAgMHgwZWIyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9QSF9ERVQgICAgICAgICAgICAgICAgICAgIDB4MGViMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19DTFIgICAgICAgICAgICAgICAgICAweDBlYjQKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX01CX1NXX1NUQVRFICAgICAgICAgICAgICAgMHgwZWI1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9NQVNUX0RJQUdfU1RBVEUgICAgICAgICAgIDB4MGViNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfN18wICAgICAgICAgICAgICAweDBlYjcKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzE1XzggICAgICAgICAgICAgMHgwZWI4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8yM18xNiAgICAgICAgICAgIDB4MGViOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzFfMjQgICAgICAgICAgICAweDBlYmEKKyNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzM5XzMyICAgICAgICAgICAgMHgwZWJiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF80MF80MyAgICAgICAgICAgIDB4MGViYworI2RlZmluZSBXQ0Q5MzRYX1BBR0UxNV9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAweDBmMDAKKyNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgICAgMHgwZjAxCisjZGVmaW5lIFdDRDkzNFhfU1BMSU5FX1NSQzBfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYwMgorI2RlZmluZSBXQ0Q5MzRYX1NQTElORV9TUkMxX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAweDBmMTkKKyNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDMV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjFhCisjZGVmaW5lIFdDRDkzNFhfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMCAgICAgICAgICAgICAgICAgIDB4MGYzMQorI2RlZmluZSBXQ0Q5MzRYX1NQTElORV9TUkMyX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMzIKKyNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgICAgMHgwZjQ5CisjZGVmaW5lIFdDRDkzNFhfU1BMSU5FX1NSQzNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGY0YQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzAgICAgICAgICAgICAgICAgICAweDBmYTEKKyNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcxICAgICAgICAgICAgICAgICAgMHgwZmEyCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMiAgICAgICAgICAgICAgICAgIDB4MGZhMworI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzMgICAgICAgICAgICAgICAgICAweDBmYTQKKyNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcwICAgICAgICAgICAgICAgICAgMHgwZmE1CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMSAgICAgICAgICAgICAgICAgIDB4MGZhNgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzIgICAgICAgICAgICAgICAgICAweDBmYTcKKyNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkczICAgICAgICAgICAgICAgICAgMHgwZmE4CisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX1NQTElORV9TUkNfREVCVUdfQ0ZHMCAgICAgICAgICAgIDB4MGZhOQorI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19TUExJTkVfU1JDX0RFQlVHX0NGRzEgICAgICAgICAgICAweDBmYWEKKyNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfUkNfUkVfQVNSQ19ERUJVR19DRkcwICAgICAgICAgICAgMHgwZmFiCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0FOQzBfUkMwX0ZJRk9fQ1RMICAgICAgICAgICAgICAgIDB4MGZhYworI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19BTkMwX1JDMV9GSUZPX0NUTCAgICAgICAgICAgICAgICAweDBmYWQKKyNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzBfRklGT19DVEwgICAgICAgICAgICAgICAgMHgwZmFlCisjZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0FOQzFfUkMxX0ZJRk9fQ1RMICAgICAgICAgICAgICAgIDB4MGZhZgorI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19BTkNfUkNfUlNUX0RCR19DTlRSICAgICAgICAgICAgICAweDBmYjAKKyNkZWZpbmUgV0NEOTM0WF9QQUdFODBfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMQorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzEgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNAorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDUKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8xICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2CisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNworI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzMgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDgKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8wICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA5CisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwYQorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMGIKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8zICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDBjCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwZAorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzEgICAgICAgICAgICAgICAgICAgICAgICAweDUwMGUKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDBmCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMAorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfQUNDRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg1MDEyCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX05PTV9DWF9WREQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAyMQorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9TVlNfQ1hfVkREICAgICAgICAgICAgICAgICAgICAgICAweDUwMjIKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9DWF9WREQgICAgICAgICAgICAgICAgICAgICAgMHg1MDIzCisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX05PTV9NWF9WREQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAyNAorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9TVlNfTVhfVkREICAgICAgICAgICAgICAgICAgICAgICAweDUwMjUKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NWF9WREQgICAgICAgICAgICAgICAgICAgICAgMHg1MDI2CisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfTUlOX0NYX1ZERCAgICAgICAgICAgICAgICAgIDB4NTAyNworI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9NQVhfU1ZTMl9TVEVQICAgICAgICAgICAgICAgICAgICAweDUwMjgKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDI5CisjZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVRVUyAgICAgICAgICAgICAgIDB4NTAyYQorI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9TV19NT0RFQ0hOR19TVEFSVCAgICAgICAgICAgICAgICAweDUwMmIKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfQ1BSX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHg1MDJjCisjZGVmaW5lIFdDRDkzNFhfUEFHRTEyOF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fQklTVF9NT0RFX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX1JGX1BBX09OX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAyCisjZGVmaW5lIFdDRDkzNFhfVExNTV9JTlRSMV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSU5UUjJfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDQKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX1NXUl9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA1CisjZGVmaW5lIFdDRDkzNFhfVExNTV9TV1JfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzJfU0NLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTFfUElOQ0ZHICAgICAgICAgICAgICAgICAgMHg4MDA4CisjZGVmaW5lIFdDRDkzNFhfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRyAgICAgICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU0xJTUJVU19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAweDgwMGEKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyQ19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBiCisjZGVmaW5lIFdDRDkzNFhfVExNTV9JMkNfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwYworI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzBfUlhfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMGQKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18wX1RYX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBlCisjZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMF9TQ0tfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwZgorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzBfV1NfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18xX1JYX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMV9UWF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzFfU0NLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMTMKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18xX1dTX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIFdDRDkzNFhfVExNTV9ETUlDMV9DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAxNQorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fRE1JQzFfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0RNSUMyX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIFdDRDkzNFhfVExNTV9ETUlDMl9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgIDB4ODAxOAorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fRE1JQzNfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMTkKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0RNSUMzX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgMHg4MDFhCisjZGVmaW5lIFdDRDkzNFhfVExNTV9KVENLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxYgorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fR1BJTzFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMWMKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0dQSU8yX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFkCisjZGVmaW5lIFdDRDkzNFhfVExNTV9HUElPM19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxZQorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fR1BJTzRfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMWYKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX1NQSV9TX0NTTl9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDIwCisjZGVmaW5lIFdDRDkzNFhfVExNTV9TUElfU19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAyMQorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU1BJX1NfRE9VVF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAweDgwMjIKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX1NQSV9TX0RJTl9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDIzCisjZGVmaW5lIFdDRDkzNFhfVExNTV9CQV9OX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyNAorI2RlZmluZSBXQ0Q5MzRYX1RMTU1fR1BJTzBfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMjUKKyNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18yX1JYX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDI2CisjZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMl9XU19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyNworI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8wICAgICAgICAgICAgICAgICAgICAweDgwMzEKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMSAgICAgICAgICAgICAgICAgICAgMHg4MDMyCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzIgICAgICAgICAgICAgICAgICAgIDB4ODAzMworI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8zICAgICAgICAgICAgICAgICAgICAweDgwMzQKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfNCAgICAgICAgICAgICAgICAgICAgMHg4MDM1CisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMCAgICAgICAgICAgICAgICAgIDB4ODAzNgorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzEgICAgICAgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8yICAgICAgICAgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMyAgICAgICAgICAgICAgICAgIDB4ODAzOQorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzQgICAgICAgICAgICAgICAgICAweDgwM2EKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMCAgICAgICAgICAgICAgICAgICAgMHg4MDNiCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QQURfRFJWQ1RMXzEgICAgICAgICAgICAgICAgICAgIDB4ODAzYworI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDgwM2QKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xICAgICAgICAgICAgICAgICAgMHg4MDNlCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMiAgICAgICAgICAgICAgICAgIDB4ODAzZgorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfTUVNX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwNDAKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0JVU19TRUwgICAgICAgICAgICAgICAgICAgMHg4MDQxCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19KVEFHICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MgorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fMSAgICAgICAgICAgICAgICAgICAgICAweDgwNDMKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzIgICAgICAgICAgICAgICAgICAgICAgMHg4MDQ0CisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8zICAgICAgICAgICAgICAgICAgICAgIDB4ODA0NQorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fNCAgICAgICAgICAgICAgICAgICAgICAweDgwNDYKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzUgICAgICAgICAgICAgICAgICAgICAgMHg4MDQ3CisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19BTkFfRFRFU1RfRElSICAgICAgICAgICAgICAgICAgIDB4ODA0YQorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzAgICAgICAgICAgICAgICAweDgwNGIKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8xICAgICAgICAgICAgICAgMHg4MDRjCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMiAgICAgICAgICAgICAgIDB4ODA0ZAorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzMgICAgICAgICAgICAgICAweDgwNGUKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV80ICAgICAgICAgICAgICAgMHg4MDRmCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19TWVNNRU1fQ1RSTCAgICAgICAgICAgICAgICAgICAgIDB4ODA1MAorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfU09DX1NXX1BXUl9TRVFfREVMQVkgICAgICAgICAgICAweDgwNTEKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0xPVyAgICAgICAgICAgICAgICAgICAgMHg4MDUyCisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX05PTV9ISUdIICAgICAgICAgICAgICAgICAgIDB4ODA1MworI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9TVlNfU1ZTMl9MT1cgICAgICAgICAgICAgICAweDgwNTQKKyNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfU1ZTX1NWUzJfSElHSCAgICAgICAgICAgICAgMHg4MDU1CisjZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19TUElfU0xBVkVfQ0hBUiAgICAgICAgICAgICAgICAgIDB4ODA1NgorI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfQ09ERUNfRElBR1MgICAgICAgICAgICAgICAgICAgICAweDgwNTcKKyNkZWZpbmUgV0NEOTM0WF9NQVhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEZGCisKKy8qIFNMSU1CVVMgU2xhdmUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfUlhfRU4wICAgICAgICAgICAgICAgICAgICAgKDB4MzApCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICAgICAgICAgICAgICAgICAgICAgKDB4MzIpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzAgICAgICAgICAgICAgICAgKDB4MzQpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzEgICAgICAgICAgICAgICAgKDB4MzUpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzAgICAgICAgICAgICAgICAgKDB4MzYpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzEgICAgICAgICAgICAgICAgKDB4MzcpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzAgICAgICAgICAgICAgICAgICAgKDB4MzgpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzEgICAgICAgICAgICAgICAgICAgKDB4MzkpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzAgICAgICAgICAgICAgICAgICAgKDB4M0EpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzEgICAgICAgICAgICAgICAgICAgKDB4M0IpCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfUlhfU09VUkNFMCAgICAgICAgICAgICAgICAgKDB4NjApCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfVFhfU09VUkNFMCAgICAgICAgICAgICAgICAgKDB4NzApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU1OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC9LYnVpbGQKQEAgLTAsMCArMSwyIEBACitoZWFkZXIteSArPSB3Y2Q5eHh4X3JlZ2lzdGVycy5oCitoZWFkZXIteSArPSB3Y2Q5MzIwX3JlZ2lzdGVycy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTA3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaApAQCAtMCwwICsxLDQzNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX01GRF9UQUJMQV9DT1JFX0hfXworI2RlZmluZSBfX01GRF9UQUJMQV9DT1JFX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KKworI2RlZmluZSBXQ0Q5WFhYX01BWF9JUlFfUkVHUyA0CisjZGVmaW5lIFdDRDlYWFhfTUFYX05VTV9JUlFTIChXQ0Q5WFhYX01BWF9JUlFfUkVHUyAqIDgpCisjZGVmaW5lIFdDRDlYWFhfU0xJTV9OVU1fUE9SVF9SRUcgMworI2RlZmluZSBUQUJMQV9WRVJTSU9OXzFfMAkwCisjZGVmaW5lIFRBQkxBX1ZFUlNJT05fMV8xCTEKKyNkZWZpbmUgVEFCTEFfVkVSU0lPTl8yXzAJMgorI2RlZmluZSBUQUJMQV9JU18xX1godmVyKSBcCisJKCgodmVyID09IFRBQkxBX1ZFUlNJT05fMV8wKSB8fCAodmVyID09IFRBQkxBX1ZFUlNJT05fMV8xKSkgPyAxIDogMCkKKyNkZWZpbmUgVEFCTEFfSVNfMl8wKHZlcikgKCh2ZXIgPT0gVEFCTEFfVkVSU0lPTl8yXzApID8gMSA6IDApCisKKyNkZWZpbmUgV0NEOVhYWF9TVVBQTFlfQlVDS19OQU1FICJjZGMtdmRkLWJ1Y2siCisKKyNkZWZpbmUgU0lUQVJfVkVSU0lPTl8xUDAgMAorI2RlZmluZSBTSVRBUl9WRVJTSU9OXzFQMSAxCisjZGVmaW5lIFNJVEFSX0lTXzFQMCh2ZXIpIFwKKwkoKHZlciA9PSBTSVRBUl9WRVJTSU9OXzFQMCkgPyAxIDogMCkKKyNkZWZpbmUgU0lUQVJfSVNfMVAxKHZlcikgXAorCSgodmVyID09IFNJVEFSX1ZFUlNJT05fMVAxKSA/IDEgOiAwKQorCisjZGVmaW5lIFRBSUtPX1ZFUlNJT05fMV8wCTEKKyNkZWZpbmUgVEFJS09fSVNfMV8wKHZlcikgXAorCSgodmVyID09IFRBSUtPX1ZFUlNJT05fMV8wKSA/IDEgOiAwKQorCisjZGVmaW5lIFRBUEFOX1ZFUlNJT05fMV8wCTAKKyNkZWZpbmUgVEFQQU5fSVNfMV8wKHZlcikgXAorCSgodmVyID09IFRBUEFOX1ZFUlNJT05fMV8wKSA/IDEgOiAwKQorCisjZGVmaW5lIFRPTVRPTV9WRVJTSU9OXzFfMAkxCisjZGVmaW5lIFRPTVRPTV9JU18xXzAodmVyKSBcCisJKCh2ZXIgPT0gVE9NVE9NX1ZFUlNJT05fMV8wKSA/IDEgOiAwKQorCisjZGVmaW5lIFRBU0hBX1ZFUlNJT05fMV8wICAgICAwCisjZGVmaW5lIFRBU0hBX1ZFUlNJT05fMV8xICAgICAxCisjZGVmaW5lIFRBU0hBX1ZFUlNJT05fMl8wICAgICAyCisKKyNkZWZpbmUgVEFTSEFfSVNfMV8wKHdjZCkgXAorCSgod2NkLT50eXBlID09IFdDRDkzMzUgfHwgd2NkLT50eXBlID09IFdDRDkzMjYpID8gXAorCSgod2NkLT52ZXJzaW9uID09IFRBU0hBX1ZFUlNJT05fMV8wKSA/IDEgOiAwKSA6IDApCisKKyNkZWZpbmUgVEFTSEFfSVNfMV8xKHdjZCkgXAorCSgod2NkLT50eXBlID09IFdDRDkzMzUgfHwgd2NkLT50eXBlID09IFdDRDkzMjYpID8gXAorCSgod2NkLT52ZXJzaW9uID09IFRBU0hBX1ZFUlNJT05fMV8xKSA/IDEgOiAwKSA6IDApCisKKyNkZWZpbmUgVEFTSEFfSVNfMl8wKHdjZCkgXAorCSgod2NkLT50eXBlID09IFdDRDkzMzUgfHwgd2NkLT50eXBlID09IFdDRDkzMjYpID8gXAorCSgod2NkLT52ZXJzaW9uID09IFRBU0hBX1ZFUlNJT05fMl8wKSA/IDEgOiAwKSA6IDApCisKKy8qCisgKiBBcyBmaW5lIHZlcnNpb24gaW5mbyBjYW5ub3QgYmUgcmV0cmlldmVkIGJlZm9yZSB0YXZpbCBwcm9iZS4KKyAqIERlZmluZSB0aHJlZSBjb2Fyc2UgdmVyc2lvbnMgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgYmVmb3JlIHRhdmlsIHByb2JlLgorICovCisjZGVmaW5lIFRBVklMX1ZFUlNJT05fMV8wICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEFWSUxfVkVSU0lPTl8xXzEgICAgICAgICAgICAgMQorI2RlZmluZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8wICAgICAyCisjZGVmaW5lIFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzAgICAgIDMKKyNkZWZpbmUgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMSAgICAgNAorI2RlZmluZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDFfMV8xICAgICA1CisKKyNkZWZpbmUgVEFWSUxfSVNfMV8wKHdjZCkgXAorCSgod2NkLT50eXBlID09IFdDRDkzNFgpID8gXAorCSAoKHdjZC0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OXzFfMCB8fCBcCisJICAgd2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzAgfHwgXAorCSAgIHdjZC0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OX1dDRDkzNDFfMV8wKSA/IDEgOiAwKSA6IDApCisjZGVmaW5lIFRBVklMX0lTXzFfMSh3Y2QpIFwKKwkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKKwkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzEgfHwgXAorCSAgIHdjZC0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8xIHx8IFwKKwkgICB3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMSkgPyAxIDogMCkgOiAwKQorI2RlZmluZSBUQVZJTF9JU19XQ0Q5MzQwXzFfMCh3Y2QpIFwKKwkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKKwkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMCkgPyAxIDogMCkgOiAwKQorI2RlZmluZSBUQVZJTF9JU19XQ0Q5MzQxXzFfMCh3Y2QpIFwKKwkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKKwkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMCkgPyAxIDogMCkgOiAwKQorI2RlZmluZSBUQVZJTF9JU19XQ0Q5MzQwXzFfMSh3Y2QpIFwKKwkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKKwkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMSkgPyAxIDogMCkgOiAwKQorI2RlZmluZSBUQVZJTF9JU19XQ0Q5MzQxXzFfMSh3Y2QpIFwKKwkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKKwkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMSkgPyAxIDogMCkgOiAwKQorCisjZGVmaW5lIElTX0NPREVDX1RZUEUod2NkLCB3Y2R0eXBlKSBcCisJKCh3Y2QtPnR5cGUgPT0gd2NkdHlwZSkgPyB0cnVlIDogZmFsc2UpCisjZGVmaW5lIElTX0NPREVDX1ZFUlNJT04od2NkLCB3Y2R2ZXJzaW9uKSBcCisJKCh3Y2QtPnZlcnNpb24gPT0gd2NkdmVyc2lvbikgPyB0cnVlIDogZmFsc2UpCisKK2VudW0geworCUNEQ19WXzFfMCwKKwlDRENfVl8xXzEsCisJQ0RDX1ZfMl8wLAorfTsKKworZW51bSBjb2RlY192YXJpYW50IHsKKwlXQ0Q5WFhYLAorCVdDRDkzMzAsCisJV0NEOTMzNSwKKwlXQ0Q5MzI2LAorCVdDRDkzNFgsCit9OworCitlbnVtIHdjZDl4eHhfc2xpbV9zbGF2ZV9hZGRyX3R5cGUgeworCVdDRDlYWFhfU0xJTV9TTEFWRV9BRERSX1RZUEVfMCwKKwlXQ0Q5WFhYX1NMSU1fU0xBVkVfQUREUl9UWVBFXzEsCit9OworCitlbnVtIHdjZDl4eHhfcG1fc3RhdGUgeworCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAorCVdDRDlYWFhfUE1fQVdBS0UsCisJV0NEOVhYWF9QTV9BU0xFRVAsCit9OworCitlbnVtIHsKKwlXQ0Q5WFhYX0lOVFJfU1RBVFVTX0JBU0UgPSAwLAorCVdDRDlYWFhfSU5UUl9DTEVBUl9CQVNFLAorCVdDRDlYWFhfSU5UUl9NQVNLX0JBU0UsCisJV0NEOVhYWF9JTlRSX0xFVkVMX0JBU0UsCisJV0NEOVhYWF9JTlRSX0NMUl9DT01NSVQsCisJV0NEOVhYWF9JTlRSX1JFR19NQVgsCit9OworCitlbnVtIHdjZDl4eHhfaW50Zl9zdGF0dXMgeworCVdDRDlYWFhfSU5URVJGQUNFX1RZUEVfUFJPQklORywKKwlXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMsCisJV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMsCit9OworCitlbnVtIHsKKwkvKiBJTlRSX1JFRyAwICovCisJV0NEOVhYWF9JUlFfU0xJTUJVUyA9IDAsCisJV0NEOVhYWF9JUlFfTUJIQ19SRU1PVkFMLAorCVdDRDlYWFhfSVJRX01CSENfU0hPUlRfVEVSTSwKKwlXQ0Q5WFhYX0lSUV9NQkhDX1BSRVNTLAorCVdDRDlYWFhfSVJRX01CSENfUkVMRUFTRSwKKwlXQ0Q5WFhYX0lSUV9NQkhDX1BPVEVOVElBTCwKKwlXQ0Q5WFhYX0lSUV9NQkhDX0lOU0VSVElPTiwKKwlXQ0Q5WFhYX0lSUV9CR19QUkVDSEFSR0UsCisJLyogSU5UUl9SRUcgMSAqLworCVdDRDlYWFhfSVJRX1BBMV9TVEFSVFVQLAorCVdDRDlYWFhfSVJRX1BBMl9TVEFSVFVQLAorCVdDRDlYWFhfSVJRX1BBM19TVEFSVFVQLAorCVdDRDlYWFhfSVJRX1BBNF9TVEFSVFVQLAorCVdDRDkzMDZfSVJRX0hQSF9QQV9PQ1BSX0ZBVUxUID0gV0NEOVhYWF9JUlFfUEE0X1NUQVJUVVAsCisJV0NEOVhYWF9JUlFfUEE1X1NUQVJUVVAsCisJV0NEOVhYWF9JUlFfTUlDQklBUzFfUFJFQ0hBUkdFLAorCVdDRDkzMDZfSVJRX0hQSF9QQV9PQ1BMX0ZBVUxUID0gV0NEOVhYWF9JUlFfTUlDQklBUzFfUFJFQ0hBUkdFLAorCVdDRDlYWFhfSVJRX01JQ0JJQVMyX1BSRUNIQVJHRSwKKwlXQ0Q5WFhYX0lSUV9NSUNCSUFTM19QUkVDSEFSR0UsCisJLyogSU5UUl9SRUcgMiAqLworCVdDRDlYWFhfSVJRX0hQSF9QQV9PQ1BMX0ZBVUxULAorCVdDRDlYWFhfSVJRX0hQSF9QQV9PQ1BSX0ZBVUxULAorCVdDRDlYWFhfSVJRX0VBUl9QQV9PQ1BMX0ZBVUxULAorCVdDRDlYWFhfSVJRX0hQSF9MX1BBX1NUQVJUVVAsCisJV0NEOVhYWF9JUlFfSFBIX1JfUEFfU1RBUlRVUCwKKwlXQ0Q5MzIwX0lSUV9FQVJfUEFfU1RBUlRVUCwKKwlXQ0Q5MzA2X0lSUV9NQkhDX0pBQ0tfU1dJVENIID0gV0NEOTMyMF9JUlFfRUFSX1BBX1NUQVJUVVAsCisJV0NEOTMxMF9OVU1fSVJRUywKKwlXQ0Q5WFhYX0lSUV9SRVNFUlZFRF8wID0gV0NEOTMxMF9OVU1fSVJRUywKKwlXQ0Q5WFhYX0lSUV9SRVNFUlZFRF8xLAorCVdDRDkzMzBfSVJRX1NWQVNTX0VSUl9FWENFUFRJT04gPSBXQ0Q5MzEwX05VTV9JUlFTLAorCVdDRDkzMzBfSVJRX01CSENfSkFDS19TV0lUQ0gsCisJLyogSU5UUl9SRUcgMyAqLworCVdDRDlYWFhfSVJRX01BRF9BVURJTywKKwlXQ0Q5WFhYX0lSUV9NQURfVUxUUkFTT1VORCwKKwlXQ0Q5WFhYX0lSUV9NQURfQkVBQ09OLAorCVdDRDlYWFhfSVJRX1NQRUFLRVJfQ0xJUFBJTkcsCisJV0NEOTMyMF9JUlFfTUJIQ19KQUNLX1NXSVRDSCwKKwlXQ0Q5MzA2X05VTV9JUlFTLAorCVdDRDlYWFhfSVJRX1ZCQVRfTU9OSVRPUl9BVFRBQ0sgPSBXQ0Q5MzA2X05VTV9JUlFTLAorCVdDRDlYWFhfSVJRX1ZCQVRfTU9OSVRPUl9SRUxFQVNFLAorCVdDRDlYWFhfTlVNX0lSUVMsCisJLyogV0NEOTMzMCBJTlRSMV9SRUcgMyovCisJV0NEOTMzMF9JUlFfU1ZBU1NfRU5HSU5FID0gV0NEOVhYWF9JUlFfTUFEX0FVRElPLAorCVdDRDkzMzBfSVJRX01BRF9BVURJTywKKwlXQ0Q5MzMwX0lSUV9NQURfVUxUUkFTT1VORCwKKwlXQ0Q5MzMwX0lSUV9NQURfQkVBQ09OLAorCVdDRDkzMzBfSVJRX1NQRUFLRVIxX0NMSVBQSU5HLAorCVdDRDkzMzBfSVJRX1NQRUFLRVIyX0NMSVBQSU5HLAorCVdDRDkzMzBfSVJRX1ZCQVRfTU9OSVRPUl9BVFRBQ0ssCisJV0NEOTMzMF9JUlFfVkJBVF9NT05JVE9SX1JFTEVBU0UsCisJV0NEOTMzMF9OVU1fSVJRUywKKwlXQ0Q5WFhYX0lSUV9SRVNFUlZFRF8yID0gV0NEOTMzMF9OVU1fSVJRUywKK307CisKK2VudW0geworCVRBQkxBX05VTV9JUlFTID0gV0NEOTMxMF9OVU1fSVJRUywKKwlTSVRBUl9OVU1fSVJRUyA9IFdDRDkzMTBfTlVNX0lSUVMsCisJVEFJS09fTlVNX0lSUVMgPSBXQ0Q5WFhYX05VTV9JUlFTLAorCVRBUEFOX05VTV9JUlFTID0gV0NEOTMwNl9OVU1fSVJRUywKKwlUT01UT01fTlVNX0lSUVMgPSBXQ0Q5MzMwX05VTV9JUlFTLAorfTsKKworc3RydWN0IGludHJfZGF0YSB7CisJaW50IGludHJfbnVtOworCWJvb2wgY2xlYXJfZmlyc3Q7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlIHsKKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJc3RydWN0IG11dGV4IG5lc3RlZF9pcnFfbG9jazsKKworCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBwbV9zdGF0ZTsKKwlzdHJ1Y3QgbXV0ZXggcG1fbG9jazsKKwkvKiBwbV93cSBub3RpZmllcyBjaGFuZ2Ugb2YgcG1fc3RhdGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBwbV93cTsKKwlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgcG1fcW9zX3JlcTsKKwlpbnQgd2xvY2tfaG9sZGVyczsKKworCisJLyogaG9sZHMgdGhlIHRhYmxlIG9mIGludGVycnVwdHMgcGVyIGNvZGVjICovCisJY29uc3Qgc3RydWN0IGludHJfZGF0YSAqaW50cl90YWJsZTsKKwlpbnQgaW50cl90YWJsZV9zaXplOworCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXU4IGlycV9tYXNrc19jdXJbV0NEOVhYWF9NQVhfSVJRX1JFR1NdOworCXU4IGlycV9tYXNrc19jYWNoZVtXQ0Q5WFhYX01BWF9JUlFfUkVHU107CisJYm9vbCBpcnFfbGV2ZWxfaGlnaFtXQ0Q5WFhYX01BWF9OVU1fSVJRU107CisJaW50IG51bV9pcnFzOworCWludCBudW1faXJxX3JlZ3M7CisJdTE2IGludHJfcmVnW1dDRDlYWFhfSU5UUl9SRUdfTUFYXTsKKwlzdHJ1Y3QgcmVnbWFwICp3Y2RfY29yZV9yZWdtYXA7CisKKwkvKiBQb2ludGVyIHRvIHBhcmVudCBjb250YWluZXIgZGF0YSBzdHJ1Y3R1cmUgKi8KKwl2b2lkICpwYXJlbnQ7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKK307CisKKy8qCisgKiBkYXRhIHN0cnVjdHVyZSBmb3IgU2xpbWJ1cyBhbmQgSTJTIGNoYW5uZWwuCisgKiBTb21lIG9mIGZpZWxkcyBhcmUgb25seSB1c2VkIGluIHNtaWxidXMgbW9kZQorICovCitzdHJ1Y3Qgd2NkOXh4eF9jaCB7CisJdTMyIHNwaDsJCS8qIHNoYXJlIGNoYW5uZWwgaGFuZGxlIC0gc2xpbWJ1cyBvbmx5CSovCisJdTMyIGNoX251bTsJCS8qCisJCQkJICogdml0cnVhbCBjaGFubmVsIG51bWJlciwgc3VjaCBhcyAxMjggLTE0NC4KKwkJCQkgKiBhcHBseSBmb3Igc2xpbWJ1cyBvbmx5CisJCQkJICovCisJdTE2IGNoX2g7CQkvKiBjaGFuZWwgaGFuZGxlIC0gc2xpbWJ1cyBvbmx5ICovCisJdTE2IHBvcnQ7CQkvKgorCQkJCSAqIHRhYmxhIHBvcnQgZm9yIFJYIGFuZCBUWAorCQkJCSAqIHN1Y2ggYXMgMC05IGZvciBUWCBhbmQgMTAgLTE2IGZvciBSWAorCQkJCSAqIGFwcGx5IGZvciBib3RoIGkycyBhbmQgc2xpbWJ1cworCQkJCSAqLworCXUxNiBzaGlmdDsJCS8qCisJCQkJICogc2hpZnQgYml0IGZvciBSWCBhbmQgVFgKKwkJCQkgKiBhcHBseSBmb3IgYm90aCBpMnMgYW5kIHNsaW1idXMKKwkJCQkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qCisJCQkJICogY2hhbm5lbCBsaW5rIGxpc3QKKwkJCQkgKiBhcHBseSBmb3IgYm90aCBpMnMgYW5kIHNsaW1idXMKKwkJCQkgKi8KK307CisKK3N0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhIHsKKwl1MzIgcmF0ZTsJCQkJLyogc2FtcGxlIHJhdGUgICAgICAgICAgKi8KKwl1MzIgYml0X3dpZHRoOwkJCQkvKiBzaXQgd2lkdGggMTYsMjQsMzIgICAqLworCXN0cnVjdCBsaXN0X2hlYWQgd2NkOXh4eF9jaF9saXN0OwkvKiBjaGFubmVsIGxpc3QgICAgICAgICAqLworCXUxNiBncnBoOwkJCQkvKiBzbGltYnVzIGdyb3VwIGhhbmRsZSAqLworCXVuc2lnbmVkIGxvbmcgY2hfbWFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkYWlfd2FpdDsKKwlib29sIGJ1c19kb3duX2luX3JlY292ZXJ5OworfTsKKworI2RlZmluZSBXQ0Q5WFhYX0NIKHhwb3J0LCB4c2hpZnQpIFwKKwl7LnBvcnQgPSB4cG9ydCwgLnNoaWZ0ID0geHNoaWZ0fQorCitlbnVtIHdjZDl4eHhfY2hpcGlkX21ham9yIHsKKwlUQUJMQV9NQUpPUiA9IGNwdV90b19sZTE2KDB4MTAwKSwKKwlTSVRBUl9NQUpPUiA9IGNwdV90b19sZTE2KDB4MTAxKSwKKwlUQUlLT19NQUpPUiA9IGNwdV90b19sZTE2KDB4MTAyKSwKKwlUQVBBTl9NQUpPUiA9IGNwdV90b19sZTE2KDB4MTAzKSwKKwlUT01UT01fTUFKT1IgPSBjcHVfdG9fbGUxNigweDEwNSksCisJVEFTSEFfTUFKT1IgPSBjcHVfdG9fbGUxNigweDApLAorCVRBU0hBMlAwX01BSk9SID0gY3B1X3RvX2xlMTYoMHgxMDcpLAorCVRBVklMX01BSk9SID0gY3B1X3RvX2xlMTYoMHgxMDgpLAorfTsKKworZW51bSBjb2RlY19wb3dlcl9zdGF0ZXMgeworCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfUkVNT1ZFLAorCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfQkVHSU4sCisJV0NEX1JFR0lPTl9QT1dFUl9ET1dOLAorfTsKKworZW51bSB3Y2RfcG93ZXJfcmVnaW9ucyB7CisJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSwKKwlXQ0Q5WFhYX01BWF9QV1JfUkVHSU9OUywKK307CisKK3N0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgeworCXUxNiBpZF9tYWpvcjsKKwl1MTYgaWRfbWlub3I7CisJc3RydWN0IG1mZF9jZWxsICpkZXY7CisJaW50IHNpemU7CisJaW50IG51bV9pcnFzOworCWludCB2ZXJzaW9uOyAvKiAtMSB0byByZXRyaWV2ZSB2ZXJzaW9uIGZyb20gY2hpcCB2ZXJzaW9uIHJlZ2lzdGVyICovCisJZW51bSB3Y2Q5eHh4X3NsaW1fc2xhdmVfYWRkcl90eXBlIHNsaW1fc2xhdmVfdHlwZTsKKwl1MTYgaTJjX2NoaXBfc3RhdHVzOworCWNvbnN0IHN0cnVjdCBpbnRyX2RhdGEgKmludHJfdGJsOworCWludCBpbnRyX3RibF9zaXplOworCXUxNiBpbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfUkVHX01BWF07Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24geworCWVudW0gY29kZWNfcG93ZXJfc3RhdGVzIHBvd2VyX3N0YXRlOworCXUxNiBwd3JfY29sbGFwc2VfcmVnX21pbjsKKwl1MTYgcHdyX2NvbGxhcHNlX3JlZ19tYXg7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzbGltX2RldmljZSAqc2xpbTsKKwlzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsaW1fc2xhdmU7CisJc3RydWN0IG11dGV4IGlvX2xvY2s7CisJc3RydWN0IG11dGV4IHhmZXJfbG9jazsKKwl1OCB2ZXJzaW9uOworCisJaW50IHJlc2V0X2dwaW87CisJc3RydWN0IGRldmljZV9ub2RlICp3Y2RfcnN0X25wOworCisJaW50ICgqcmVhZF9kZXYpKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQlpbnQgYnl0ZXMsIHZvaWQgKmRlc3QsIGJvb2wgaW50ZXJmYWNlX3JlZyk7CisJaW50ICgqd3JpdGVfZGV2KShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJaW50IGJ5dGVzLCB2b2lkICpzcmMsIGJvb2wgaW50ZXJmYWNlX3JlZyk7CisJaW50ICgqbXVsdGlfcmVnX3dyaXRlKShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgY291bnQpOworCWludCAoKmRldl9kb3duKShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCk7CisJaW50ICgqcG9zdF9yZXNldCkoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpOworCisJdm9pZCAqc3NyX3ByaXY7CisJYm9vbCBkZXZfdXA7CisKKwl1MzIgbnVtX29mX3N1cHBsaWVzOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllczsKKworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgY29yZV9yZXM7CisKKwl1MTYgaWRfbWlub3I7CisJdTE2IGlkX21ham9yOworCisJLyogU2xpbWJ1cyBvciBJMlMgcG9ydCAqLworCXUzMiBudW1fcnhfcG9ydDsKKwl1MzIgbnVtX3R4X3BvcnQ7CisJc3RydWN0IHdjZDl4eHhfY2ggKnJ4X2NoczsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqdHhfY2hzOworCXUzMiBtY2xrX3JhdGU7CisJZW51bSBjb2RlY192YXJpYW50IHR5cGU7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqY29kZWNfdHlwZTsKKwlib29sIHByZXZfcGdfdmFsaWQ7CisJdTggcHJldl9wZzsKKwl1OCBhdm9pZF9jZGNfcnN0bG93OworCXN0cnVjdCB3Y2Q5eHh4X3Bvd2VyX3JlZ2lvbiAqd2NkOXh4eF9wd3JbV0NEOVhYWF9NQVhfUFdSX1JFR0lPTlNdOworfTsKKworc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCB7CisJdW5zaWduZWQgc2hvcnQgcmVnOyAvKiByZWdpc3RlciBhZGRyZXNzICovCisJdTggKmJ1ZjsgICAgICAgICAgICAvKiBidWZmZXIgdG8gYmUgd3JpdHRlbiB0byByZWcuIGFkZHIgKi8KKwlpbnQgYnl0ZXM7ICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuICovCit9OworCitpbnQgd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZyk7CitpbnQgd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCXU4IHZhbCk7CitpbnQgd2NkOXh4eF9nZXRfbG9naWNhbF9hZGRyZXNzZXModTggKnBnZF9sYSwgdTggKmluZl9sYSk7CitpbnQgd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJICAgICBpbnQgYnl0ZXMsIHZvaWQgKnNyYyk7CitpbnQgd2NkOXh4eF9zbGltX3Jlc2VydmVfYncoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkgICAgdTMyIGJ3X29wcywgYm9vbCBjb21taXQpOworaW50IHdjZDl4eHhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCBlbnVtIGNvZGVjX3Bvd2VyX3N0YXRlcywKKwkJCSAgICBlbnVtIHdjZF9wb3dlcl9yZWdpb25zKTsKK2ludCB3Y2Q5eHh4X2dldF9jdXJyZW50X3Bvd2VyX3N0YXRlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJCSAgICBlbnVtIHdjZF9wb3dlcl9yZWdpb25zKTsKKworaW50IHdjZDl4eHhfcGFnZV93cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgKnJlZyk7CisKK2ludCB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICBzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsICpidWxrX3JlZywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBpbnRlcmZhY2UpOworCitleHRlcm4gaW50IHdjZDl4eHhfY29yZV9yZXNfaW5pdCgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzLAorCWludCBudW1faXJxcywgaW50IG51bV9pcnFfcmVncywgc3RydWN0IHJlZ21hcCAqd2NkX3JlZ21hcCk7CisKK2V4dGVybiB2b2lkIHdjZDl4eHhfY29yZV9yZXNfZGVpbml0KAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMpOworCitleHRlcm4gaW50IHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCgKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzLAorCXBtX21lc3NhZ2VfdCBwbWVzZyk7CisKK2V4dGVybiBpbnQgd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUoCisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3Jlcyk7CisKK2V4dGVybiBpbnQgd2NkOXh4eF9jb3JlX2lycV9pbml0KAorCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMpOworCitleHRlcm4gaW50IHdjZDl4eHhfYXNzaWduX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzLAorCQkJICAgICAgdW5zaWduZWQgaW50IGlycSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBpcnFfYmFzZSk7CisKK2V4dGVybiBlbnVtIHdjZDl4eHhfaW50Zl9zdGF0dXMgd2NkOXh4eF9nZXRfaW50Zl90eXBlKHZvaWQpOworZXh0ZXJuIHZvaWQgd2NkOXh4eF9zZXRfaW50Zl90eXBlKGVudW0gd2NkOXh4eF9pbnRmX3N0YXR1cyk7CisKK2V4dGVybiBlbnVtIHdjZDl4eHhfcG1fc3RhdGUgd2NkOXh4eF9wbV9jbXB4Y2hnKAorCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKKwkJCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBvLAorCQkJZW51bSB3Y2Q5eHh4X3BtX3N0YXRlIG4pOworc3RhdGljIGlubGluZSBpbnQgX19pbml0IHdjZDl4eHhfaXJxX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQoreworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4OGU4NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvcGRhdGEuaApAQCAtMCwwICsxLDE5NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX01GRF9XQ0Q5WFhYX1BEQVRBX0hfXworCisjZGVmaW5lIF9fTUZEX1dDRDlYWFhfUERBVEFfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zbGltYnVzL3NsaW1idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaD4KKworI2RlZmluZSBNSUNCSUFTX0VYVF9CWVBfQ0FQIDB4MDAKKyNkZWZpbmUgTUlDQklBU19OT19FWFRfQllQX0NBUCAweDAxCisKKyNkZWZpbmUgU0lUQVJfTERPSF8xUDk1X1YgMHgwCisjZGVmaW5lIFNJVEFSX0xET0hfMlAzNV9WIDB4MQorI2RlZmluZSBTSVRBUl9MRE9IXzJQNzVfViAweDIKKyNkZWZpbmUgU0lUQVJfTERPSF8yUDg1X1YgMHgzCisKKyNkZWZpbmUgU0lUQVJfQ0ZJTFQxX1NFTCAweDAKKyNkZWZpbmUgU0lUQVJfQ0ZJTFQyX1NFTCAweDEKKyNkZWZpbmUgU0lUQVJfQ0ZJTFQzX1NFTCAweDIKKworI2RlZmluZSBXQ0Q5WFhYX0xET0hfMVA5NV9WIDB4MAorI2RlZmluZSBXQ0Q5WFhYX0xET0hfMlAzNV9WIDB4MQorI2RlZmluZSBXQ0Q5WFhYX0xET0hfMlA3NV9WIDB4MgorI2RlZmluZSBXQ0Q5WFhYX0xET0hfMlA4NV9WIDB4MworI2RlZmluZSBXQ0Q5WFhYX0xET0hfM1AwX1YgMHgzCisKKyNkZWZpbmUgVEFCTEFfTERPSF8xUDk1X1YgMHgwCisjZGVmaW5lIFRBQkxBX0xET0hfMlAzNV9WIDB4MQorI2RlZmluZSBUQUJMQV9MRE9IXzJQNzVfViAweDIKKyNkZWZpbmUgVEFCTEFfTERPSF8yUDg1X1YgMHgzCisKKyNkZWZpbmUgVEFCTEFfQ0ZJTFQxX1NFTCAweDAKKyNkZWZpbmUgVEFCTEFfQ0ZJTFQyX1NFTCAweDEKKyNkZWZpbmUgVEFCTEFfQ0ZJTFQzX1NFTCAweDIKKworI2RlZmluZSBNQVhfQU1JQ19DSEFOTkVMIDcKKworI2RlZmluZSBUQUJMQV9PQ1BfMzAwX01BIDB4MAorI2RlZmluZSBUQUJMQV9PQ1BfMzUwX01BIDB4MgorI2RlZmluZSBUQUJMQV9PQ1BfMzY1X01BIDB4MworI2RlZmluZSBUQUJMQV9PQ1BfMTUwX01BIDB4NAorI2RlZmluZSBUQUJMQV9PQ1BfMTkwX01BIDB4NgorI2RlZmluZSBUQUJMQV9PQ1BfMjIwX01BIDB4NworCisjZGVmaW5lIFRBQkxBX0RDWUNMRV8yNTUgIDB4MAorI2RlZmluZSBUQUJMQV9EQ1lDTEVfNTExICAweDEKKyNkZWZpbmUgVEFCTEFfRENZQ0xFXzc2NyAgMHgyCisjZGVmaW5lIFRBQkxBX0RDWUNMRV8xMDIzIDB4MworI2RlZmluZSBUQUJMQV9EQ1lDTEVfMTI3OSAweDQKKyNkZWZpbmUgVEFCTEFfRENZQ0xFXzE1MzUgMHg1CisjZGVmaW5lIFRBQkxBX0RDWUNMRV8xNzkxIDB4NgorI2RlZmluZSBUQUJMQV9EQ1lDTEVfMjA0NyAweDcKKyNkZWZpbmUgVEFCTEFfRENZQ0xFXzIzMDMgMHg4CisjZGVmaW5lIFRBQkxBX0RDWUNMRV8yNTU5IDB4OQorI2RlZmluZSBUQUJMQV9EQ1lDTEVfMjgxNSAweEEKKyNkZWZpbmUgVEFCTEFfRENZQ0xFXzMwNzEgMHhCCisjZGVmaW5lIFRBQkxBX0RDWUNMRV8zMzI3IDB4QworI2RlZmluZSBUQUJMQV9EQ1lDTEVfMzU4MyAweEQKKyNkZWZpbmUgVEFCTEFfRENZQ0xFXzM4MzkgMHhFCisjZGVmaW5lIFRBQkxBX0RDWUNMRV80MDk1IDB4RgorCisjZGVmaW5lIFdDRDlYWFhfTUNMS19DTEtfMTJQMjg4TUhaIDEyMjg4MDAwCisjZGVmaW5lIFdDRDlYWFhfTUNMS19DTEtfOVA2SFogOTYwMDAwMAorCisvKiBPbmx5IHZhbGlkIGZvciA5LjYgTUh6IG1jbGsgKi8KKyNkZWZpbmUgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzYwMEtIWiA2MDAwMDAKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzJQNE1IWiAyNDAwMDAwCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV8zUDJNSFogMzIwMDAwMAorI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNFA4TUhaIDQ4MDAwMDAKKworLyogT25seSB2YWxpZCBmb3IgMTIuMjg4IE1IeiBtY2xrICovCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV83NjhLSFogNzY4MDAwCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV8yUDA0OE1IWiAyMDQ4MDAwCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV8zUDA3Mk1IWiAzMDcyMDAwCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDA5Nk1IWiA0MDk2MDAwCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV82UDE0NE1IWiA2MTQ0MDAwCisKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCAwCisKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX0NMS19EUklWRV9VTkRFRklORUQgMAorCitzdHJ1Y3Qgd2NkOXh4eF9hbWljIHsKKwkvKmxlZ2FjeSBtb2RlLCB0eGZlX2VuYWJsZSBhbmQgdHhmZV9idWZmIHRha2UgNyBpbnB1dAorCSAqIGVhY2ggYml0IHJlcHJlc2VudCB0aGUgY2hhbm5lbCAvIFRYRkUgbnVtYmVyCisJICogYW5kIG51bWJlcmVkIGFzIGJlbG93CisJICogYml0IDAgPSBjaGFubmVsIDEgLyBUWEZFMV9FTkFCTEUgLyBUWEZFMV9CVUZGCisJICogYml0IDEgPSBjaGFubmVsIDIgLyBUWEZFMl9FTkFCTEUgLyBUWEZFMl9CVUZGCisJICogLi4uCisJICogYml0IDcgPSBjaGFubmVsIDcgLyBUWEZFN19FTkFCTEUgLyBUWEZFN19CVUZGCisJICovCisJdTggbGVnYWN5X21vZGU6TUFYX0FNSUNfQ0hBTk5FTDsKKwl1OCB0eGZlX2VuYWJsZTpNQVhfQU1JQ19DSEFOTkVMOworCXU4IHR4ZmVfYnVmZjpNQVhfQU1JQ19DSEFOTkVMOworCXU4IHVzZV9wZGF0YTpNQVhfQU1JQ19DSEFOTkVMOworfTsKKworLyogRWFjaCBtaWNiaWFzIGNhbiBiZSBhc3NpZ25lZCB0byBvbmUgb2YgdGhyZWUgY2ZpbHRlcnMKKyAqIFZiYXR0X21pbiA+PSAuMTVWICsgbGRvaF92CisgKiBsZG9oX3YgPj0gLjE1diArIGNmaWx0eF9tdgorICogSWYgbGRvaF92ID0gMS45NSAxNjAgbXYgPCBjZmlsdHhfbXYgPCAxODAwIG12CisgKiBJZiBsZG9oX3YgPSAyLjM1IDIwMCBtdiA8IGNmaWx0eF9tdiA8IDIyMDAgbXYKKyAqIElmIGxkb2hfdiA9IDIuNzUgMjQwIG12IDwgY2ZpbHR4X212IDwgMjYwMCBtdgorICogSWYgbGRvaF92ID0gMi44NSAyNTAgbXYgPCBjZmlsdHhfbXYgPCAyNzAwIG12CisgKi8KKworc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nIHsKKwl1OCBsZG9oX3Y7CisJdTMyIGNmaWx0MV9tdjsgLyogaW4gbXYgKi8KKwl1MzIgY2ZpbHQyX212OyAvKiBpbiBtdiAqLworCXUzMiBjZmlsdDNfbXY7IC8qIGluIG12ICovCisJdTMyIG1pY2IxX212OworCXUzMiBtaWNiMl9tdjsKKwl1MzIgbWljYjNfbXY7CisJdTMyIG1pY2I0X212OworCS8qIERpZmZlcmVudCBXQ0Q5eHh4IHNlcmllcyBjb2RlY3MgbWF5IG5vdAorCSAqIGhhdmUgNCBtaWMgYmlhc2VzLiBJZiBhIGNvZGVjIGhhcyBmZXdlcgorCSAqIG1pYyBiaWFzZXMsIHNvbWUgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsCisJICogbm90IGJlIHVzZWQuCisJICovCisJdTggYmlhczFfY2ZpbHRfc2VsOworCXU4IGJpYXMyX2NmaWx0X3NlbDsKKwl1OCBiaWFzM19jZmlsdF9zZWw7CisJdTggYmlhczRfY2ZpbHRfc2VsOworCXU4IGJpYXMxX2NhcF9tb2RlOworCXU4IGJpYXMyX2NhcF9tb2RlOworCXU4IGJpYXMzX2NhcF9tb2RlOworCXU4IGJpYXM0X2NhcF9tb2RlOworCWJvb2wgYmlhczJfaXNfaGVhZHNldF9vbmx5OworfTsKKworc3RydWN0IHdjZDl4eHhfb2NwX3NldHRpbmcgeworCXVuc2lnbmVkIGludAl1c2VfcGRhdGE6MTsgLyogMCAtIHVzZSBzeXMgZGVmYXVsdCBhcyByZWNvbW1lbmRlZCAqLworCXVuc2lnbmVkIGludAludW1fYXR0ZW1wdHM6NDsgLyogdXAgdG8gMTUgYXR0ZW1wdHMgKi8KKwl1bnNpZ25lZCBpbnQJcnVuX3RpbWU6NDsgLyogaW4gZHV0eSBjeWNsZSAqLworCXVuc2lnbmVkIGludAl3YWl0X3RpbWU6NDsgLyogaW4gZHV0eSBjeWNsZSAqLworCXVuc2lnbmVkIGludAlocGhfb2NwX2xpbWl0OjM7IC8qIEhlYWRwaG9uZSBPQ1AgY3VycmVudCBsaW1pdCAqLworfTsKKworI2RlZmluZSBXQ0Q5WFhYX01BWF9SRUdVTEFUT1IJOQorLyoKKyAqICAgICAgZm9ybWF0IDogVEFCTEFfPFBPV0VSX1NVUFBMWV9QSU5fTkFNRT5fQ1VSX01BWAorICoKKyAqICAgICAgPFBPV0VSX1NVUFBMWV9QSU5fTkFNRT4gZnJvbSBUYWJsYSBvYmplY3RpdmUgc3BlYworICovCisKKyNkZWZpbmUgIFdDRDlYWFhfQ0RDX1ZEREFfQ1BfQ1VSX01BWCAgICAgIDUwMDAwMAorI2RlZmluZSAgV0NEOVhYWF9DRENfVkREQV9SWF9DVVJfTUFYICAgICAgMjAwMDAKKyNkZWZpbmUgIFdDRDlYWFhfQ0RDX1ZEREFfVFhfQ1VSX01BWCAgICAgIDIwMDAwCisjZGVmaW5lICBXQ0Q5WFhYX1ZERElPX0NEQ19DVVJfTUFYICAgICAgICA1MDAwCisKKyNkZWZpbmUgIFdDRDlYWFhfVkRERF9DRENfRF9DVVJfTUFYICAgICAgIDUwMDAKKyNkZWZpbmUgIFdDRDlYWFhfVkRERF9DRENfQV9DVVJfTUFYICAgICAgIDUwMDAKKworI2RlZmluZSBXQ0Q5WFhYX1ZERF9TUEtEUlZfTkFNRSAiY2RjLXZkZC1zcGtkcnYiCisjZGVmaW5lIFdDRDlYWFhfVkREX1NQS0RSVjJfTkFNRSAiY2RjLXZkZC1zcGtkcnYtMiIKKworc3RydWN0IHdjZDl4eHhfcmVndWxhdG9yIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBtaW5fdVY7CisJaW50IG1heF91VjsKKwlpbnQgb3B0aW11bV91QTsKKwlib29sIG9uZGVtYW5kOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKK307CisKK3N0cnVjdCB3Y2Q5eHh4X3BkYXRhIHsKKwlpbnQgaXJxOworCWludCBpcnFfYmFzZTsKKwlpbnQgbnVtX2lycXM7CisJaW50IHJlc2V0X2dwaW87CisJc3RydWN0IGRldmljZV9ub2RlICp3Y2RfcnN0X25wOworCXN0cnVjdCB3Y2Q5eHh4X2FtaWMgYW1pY19zZXR0aW5nczsKKwlzdHJ1Y3Qgc2xpbV9kZXZpY2Ugc2xpbWJ1c19zbGF2ZV9kZXZpY2U7CisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nIG1pY2JpYXM7CisJc3RydWN0IHdjZDl4eHhfb2NwX3NldHRpbmcgb2NwOworCXN0cnVjdCBjZGNfcmVndWxhdG9yICpyZWd1bGF0b3I7CisJaW50IG51bV9zdXBwbGllczsKKwl1MzIgbWNsa19yYXRlOworCXUzMiBkbWljX3NhbXBsZV9yYXRlOworCXUzMiBtYWRfZG1pY19zYW1wbGVfcmF0ZTsKKwl1MzIgZWNwcF9kbWljX3NhbXBsZV9yYXRlOworCXUzMiBkbWljX2Nsa19kcnY7CisJdTE2IHVzZV9waW5jdHJsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDkzMzBfcmVnaXN0ZXJzLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDkzMzBfcmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3ZDI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOTMzMF9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDE2MjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgV0NEOTMzMF9SRUdJU1RFUlNfSAorI2RlZmluZSBXQ0Q5MzMwX1JFR0lTVEVSU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFRPTVRPTV9BX0NISVBfQ1RMCQkJKDB4MDAwKQorI2RlZmluZSBUT01UT01fQV9DSElQX0NUTF9fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUT01UT01fQV9DSElQX1NUQVRVUwkJCSgweDAwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0hJUF9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzAJCQkoMHgwMDQpCisjZGVmaW5lIFRPTVRPTV9BX0NISVBfSURfQllURV8wX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NISVBfSURfQllURV8xCQkJKDB4MDA1KQorI2RlZmluZSBUT01UT01fQV9DSElQX0lEX0JZVEVfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DSElQX0lEX0JZVEVfMgkJCSgweDAwNikKKyNkZWZpbmUgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzJfX1BPUgkJCQkoMHgwNSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzMJCQkoMHgwMDcpCisjZGVmaW5lIFRPTVRPTV9BX0NISVBfSURfQllURV8zX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX0NISVBfSTJDX1NMQVZFX0lECQkJKDB4MDA4KQorI2RlZmluZSBUT01UT01fQV9DSElQX0kyQ19TTEFWRV9JRF9fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUT01UT01fQV9TTEFWRV9JRF8xCQkJKDB4MDBDKQorI2RlZmluZSBUT01UT01fQV9TTEFWRV9JRF8xX19QT1IJCQkJKDB4NzcpCisjZGVmaW5lIFRPTVRPTV9BX1NMQVZFX0lEXzIJCQkoMHgwMEQpCisjZGVmaW5lIFRPTVRPTV9BX1NMQVZFX0lEXzJfX1BPUgkJCQkoMHg2NikKKyNkZWZpbmUgVE9NVE9NX0FfU0xBVkVfSURfMwkJCSgweDAwRSkKKyNkZWZpbmUgVE9NVE9NX0FfU0xBVkVfSURfM19fUE9SCQkJCSgweDU1KQorI2RlZmluZSBUT01UT01fQV9QSU5fQ1RMX09FMAkJCSgweDAxMCkKKyNkZWZpbmUgVE9NVE9NX0FfUElOX0NUTF9PRTBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUElOX0NUTF9PRTEJCQkoMHgwMTEpCisjZGVmaW5lIFRPTVRPTV9BX1BJTl9DVExfT0UxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1BJTl9DVExfT0UyCQkJKDB4MDEyKQorI2RlZmluZSBUT01UT01fQV9QSU5fQ1RMX09FMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9QSU5fQ1RMX0RBVEEwCQkJKDB4MDEzKQorI2RlZmluZSBUT01UT01fQV9QSU5fQ1RMX0RBVEEwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1BJTl9DVExfREFUQTEJCQkoMHgwMTQpCisjZGVmaW5lIFRPTVRPTV9BX1BJTl9DVExfREFUQTFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUElOX0NUTF9EQVRBMgkJCSgweDAxNSkKKyNkZWZpbmUgVE9NVE9NX0FfUElOX0NUTF9EQVRBMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9IRFJJVkVfR0VORVJJQwkJCSgweDAxOCkKKyNkZWZpbmUgVE9NVE9NX0FfSERSSVZFX0dFTkVSSUNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfSERSSVZFX09WRVJSSURFCQkJKDB4MDE5KQorI2RlZmluZSBUT01UT01fQV9IRFJJVkVfT1ZFUlJJREVfX1BPUgkJCQkoMHgwOCkKKyNkZWZpbmUgVE9NVE9NX0FfQU5BX0NTUl9XQUlUX1NUQVRFCQkJKDB4MDFDKQorI2RlZmluZSBUT01UT01fQV9BTkFfQ1NSX1dBSVRfU1RBVEVfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDAJCQkoMHgwMjApCisjZGVmaW5lIFRPTVRPTV9BX1BST0NFU1NfTU9OSVRPUl9DVEwwX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX1BST0NFU1NfTU9OSVRPUl9DVEwxCQkJKDB4MDIxKQorI2RlZmluZSBUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMgkJCSgweDAyMikKKyNkZWZpbmUgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDMJCQkoMHgwMjMpCisjZGVmaW5lIFRPTVRPTV9BX1BST0NFU1NfTU9OSVRPUl9DVEwzX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0NUTAkJCSgweDAyOCkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX1NUQVRVUwkJCSgweDAyOSkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMAkJCSgweDAyQSkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMQkJCSgweDAyQikKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMgkJCSgweDAyQykKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMwkJCSgweDAyRCkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNAkJCSgweDAyRSkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ0X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNQkJCSgweDAyRikKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ1X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNgkJCSgweDAzMCkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ2X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNwkJCSgweDAzMSkKKyNkZWZpbmUgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ3X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DVEwJCQkoMHgwMzQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTEVBS0FHRV9DVEwJCQkoMHgwM0MpCisjZGVmaW5lIFRPTVRPTV9BX0xFQUtBR0VfQ1RMX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9QVFIwCQkJKDB4MDQ0KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19NRU1fUFRSMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19NRU1fUFRSMQkJCSgweDA0NSkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjIJCQkoMHgwNDYpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9QVFIyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9DVEwJCQkoMHgwNDgpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfTUVNX0JBTksJCQkoMHgwNDkpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9CQU5LX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0RNSUNfQjFfQ1RMCQkJKDB4MDRBKQorI2RlZmluZSBUT01UT01fQV9ETUlDX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9ETUlDX0IyX0NUTAkJCSgweDA0QikKKyNkZWZpbmUgVE9NVE9NX0FfRE1JQ19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQ0xLUlNUX0NUTAkJCSgweDA0QykKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQ0xLUlNUX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19DUEFSX0NGRwkJCSgweDA0RCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQ1BBUl9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQlVGX1JEWV9JTlRfUEVSSU9ECQkJKDB4MDRFKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19CVUZfUkRZX0lOVF9QRVJJT0RfX1BPUgkJCQkoMHgxNCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQ1BBUl9XRE9HX0NGRwkJCSgweDA0RikKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfQ1BBUl9XRE9HX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19DRkcJCQkoMHgwNTApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX0NGR19fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfQ0ZHCQkJKDB4MDUxKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfQ0ZHX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NUQVRVUwkJCSgweDA1MikKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX0lOVF9NQVNLCQkJKDB4MDUzKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19JTlRfTUFTS19fUE9SCQkJCSgweDNGKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19JTlRfU1RBVFVTCQkJKDB4MDU0KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19JTlRfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX0lOVF9DTFIJCQkoMHgwNTUpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX0lOVF9DTFJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfREVCVUcJCQkoMHgwNTYpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX0RFQlVHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9CS1VQX0lOVAkJCSgweDA1NykKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0JLVVBfSU5UX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9BQ0MJCQkoMHgwNTgpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX01FTV9BQ0NfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTUVNX0xFQUtBR0VfQ1RMCQkJKDB4MDU5KQorI2RlZmluZSBUT01UT01fQV9NRU1fTEVBS0FHRV9DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1RSRwkJCSgweDA1QSkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1RSR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMAkJCSgweDA2MCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzEJCQkoMHgwNjEpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8xX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8yCQkJKDB4MDYyKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMwkJCSgweDA2MykKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzQJCQkoMHgwNjQpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF80X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF81CQkJKDB4MDY1KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNgkJCSgweDA2NikKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzcJCQkoMHgwNjcpCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF83X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF84CQkJKDB4MDY4KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOQkJCSgweDA2OSkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzlfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzEwCQkJKDB4MDZBKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMTBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzExCQkJKDB4MDZCKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMTFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8wCQkJKDB4MDcwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xCQkJKDB4MDcxKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8yCQkJKDB4MDcyKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8zCQkJKDB4MDczKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF80CQkJKDB4MDc0KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzRfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF81CQkJKDB4MDc1KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF82CQkJKDB4MDc2KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF83CQkJKDB4MDc3KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF84CQkJKDB4MDc4KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF85CQkJKDB4MDc5KQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzlfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xMAkJCSgweDA3QSkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzExCQkJKDB4MDdCKQorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzExX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFJfTU9ERQkJCSgweDA5MCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUl9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX01BU0swCQkJKDB4MDk0KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9NQVNLMF9fUE9SCQkJCSgweEZGKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9NQVNLMQkJCSgweDA5NSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTUFTSzFfX1BPUgkJCQkoMHhGRikKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTUFTSzIJCQkoMHgwOTYpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX01BU0syX19QT1IJCQkJKDB4RkYpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX01BU0szCQkJKDB4MDk3KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9NQVNLM19fUE9SCQkJCSgweEZGKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TVEFUVVMwCQkJKDB4MDk4KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TVEFUVVMwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1NUQVRVUzEJCQkoMHgwOTkpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1NUQVRVUzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfU1RBVFVTMgkJCSgweDA5QSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfU1RBVFVTMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TVEFUVVMzCQkJKDB4MDlCKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TVEFUVVMzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0NMRUFSMAkJCSgweDA5QykKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfQ0xFQVIwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0NMRUFSMQkJCSgweDA5RCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfQ0xFQVIxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0NMRUFSMgkJCSgweDA5RSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfQ0xFQVIyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0NMRUFSMwkJCSgweDA5RikKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfQ0xFQVIzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0xFVkVMMAkJCSgweDBBMCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTEVWRUwwX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0xFVkVMMQkJCSgweDBBMSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTEVWRUwxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0xFVkVMMgkJCSgweDBBMikKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTEVWRUwyX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX0xFVkVMMwkJCSgweDBBMykKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfTEVWRUwzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1RFU1QwCQkJKDB4MEE0KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9URVNUMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9URVNUMQkJCSgweDBBNSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfVEVTVDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfVEVTVDIJCQkoMHgwQTYpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1RFU1QyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1RFU1QzCQkJKDB4MEE3KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9URVNUM19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TRVQwCQkJKDB4MEE4KQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TRVQwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1NFVDEJCQkoMHgwQTkpCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIxX1NFVDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfU0VUMgkJCSgweDBBQSkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjFfU0VUMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TRVQzCQkJKDB4MEFCKQorI2RlZmluZSBUT01UT01fQV9JTlRSMV9TRVQzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIyX01BU0swCQkJKDB4MEIwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9NQVNLMF9fUE9SCQkJCSgweEZGKQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9TVEFUVVMwCQkJKDB4MEIyKQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9TVEFUVVMwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIyX0NMRUFSMAkJCSgweDBCNCkKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjJfQ0xFQVIwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIyX0xFVkVMMAkJCSgweDBCNikKKyNkZWZpbmUgVE9NVE9NX0FfSU5UUjJfTEVWRUwwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0lOVFIyX1RFU1QwCQkJKDB4MEI4KQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9URVNUMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9TRVQwCQkJKDB4MEJBKQorI2RlZmluZSBUT01UT01fQV9JTlRSMl9TRVQwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWF9JMlNfU0NLX01PREUJCQkoMHgwQzApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWF9JMlNfU0NLX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYX0kyU19XU19NT0RFCQkJKDB4MEMxKQorI2RlZmluZSBUT01UT01fQV9DRENfVFhfSTJTX1dTX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTBfTU9ERQkJCSgweDBDNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTBfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfRE1JQ19DTEswX01PREUJCQkoMHgwQzUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ETUlDX0NMSzBfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfRE1JQ19EQVRBMV9NT0RFCQkJKDB4MEM2KQorI2RlZmluZSBUT01UT01fQV9DRENfRE1JQ19EQVRBMV9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ETUlDX0NMSzFfTU9ERQkJCSgweDBDNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMV9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWF9JMlNfU0NLX01PREUJCQkoMHgwQzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWF9JMlNfU0NLX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYX0kyU19XU19NT0RFCQkJKDB4MEM5KQorI2RlZmluZSBUT01UT01fQV9DRENfUlhfSTJTX1dTX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTJfTU9ERQkJCSgweDBDQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTJfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfRE1JQ19DTEsyX01PREUJCQkoMHgwQ0IpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ETUlDX0NMSzJfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSU5UUjFfTU9ERQkJCSgweDBDQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lOVFIxX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NCX05SWl9TRUxfTU9ERQkJCSgweDBDRCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NCX05SWl9TRUxfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSU5UUjJfTU9ERQkJCSgweDBDRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lOVFIyX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JGX1BBX09OX01PREUJCQkoMHgwQ0YpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SRl9QQV9PTl9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9NT0RFCQkJKDB4MEQwKQorI2RlZmluZSBUT01UT01fQV9DRENfQk9PU1RfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSlRDS19NT0RFCQkJKDB4MEQxKQorI2RlZmluZSBUT01UT01fQV9DRENfSlRDS19NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19KVERJX01PREUJCQkoMHgwRDIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19KVERJX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0pUTVNfTU9ERQkJCSgweDBEMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0pUTVNfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSlRET19NT0RFCQkJKDB4MEQ0KQorI2RlZmluZSBUT01UT01fQV9DRENfSlRET19NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19KVFJTVF9NT0RFCQkJKDB4MEQ1KQorI2RlZmluZSBUT01UT01fQV9DRENfSlRSU1RfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQklTVF9NT0RFX01PREUJCQkoMHgwRDYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CSVNUX01PREVfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzEJCQkoMHgwRTApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzIJCQkoMHgwRTEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8xCQkJKDB4MEUyKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8xX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzIJCQkoMHgwRTMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMwkJCSgweDBFNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfM19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80CQkJKDB4MEU1KQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzUJCQkoMHgwRTYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNgkJCSgweDBFNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF83CQkJKDB4MEU4KQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF83X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzgJCQkoMHgwRTkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19JSVJfQ1RMX1BUUgkJCSgweDBFQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19JSVJfQ1RMX1BUUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMCQkJKDB4MEVCKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMQkJCSgweDBFQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8xX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMgkJCSgweDBFRCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8yX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMwkJCSgweDBFRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8zX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNAkJCSgweDBFRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF80X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNQkJCSgweDBGMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF81X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNgkJCSgweDBGMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF82X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNwkJCSgweDBGMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF83X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF8xCQkJKDB4MEYzKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMgkJCSgweDBGNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzMJCQkoMHgwRjUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF8zX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF80CQkJKDB4MEY2KQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNQkJCSgweDBGNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzYJCQkoMHgwRjgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF82X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF83CQkJKDB4MEY5KQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfN19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfOAkJCSgweDBGQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fSUlSX0NUTF9QVFIJCQkoMHgwRkIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSX19QT1IJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fSUlSX0NUTF9WQUwJCQkoMHgwRkMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMX19QT1IJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01BRF9JTlBfU0VMCQkJKDB4MEZEKQorI2RlZmluZSBUT01UT01fQV9DRENfTUFEX0lOUF9TRUxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19SRUZfQ1RMCQkJKDB4MTAwKQorI2RlZmluZSBUT01UT01fQV9CSUFTX1JFRl9DVExfX1BPUgkJCQkoMHgxQykKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19DRU5UUkFMX0JHX0NUTAkJCSgweDEwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19DRU5UUkFMX0JHX0NUTF9fUE9SCQkJCSgweDUwKQorI2RlZmluZSBUT01UT01fQV9CSUFTX1BSRUNIUkdfQ1RMCQkJKDB4MTAyKQorI2RlZmluZSBUT01UT01fQV9CSUFTX1BSRUNIUkdfQ1RMX19QT1IJCQkJKDB4MDcpCisjZGVmaW5lIFRPTVRPTV9BX0JJQVNfQ1VSUl9DVExfMQkJCSgweDEwMykKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19DVVJSX0NUTF8xX19QT1IJCQkJKDB4NTIpCisjZGVmaW5lIFRPTVRPTV9BX0JJQVNfQ1VSUl9DVExfMgkJCSgweDEwNCkKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19DVVJSX0NUTF8yX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0JJQVNfT1NDX0JHX0NUTAkJCSgweDEwNSkKKyNkZWZpbmUgVE9NVE9NX0FfQklBU19PU0NfQkdfQ1RMX19QT1IJCQkJKDB4MzYpCisjZGVmaW5lIFRPTVRPTV9BX0NMS19CVUZGX0VOMQkJCSgweDEwOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0xLX0JVRkZfRU4xX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRPTVRPTV9BX0NMS19CVUZGX0VOMgkJCSgweDEwOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0xLX0JVRkZfRU4yX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX01PREVfMQkJCSgweDEwQSkKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfTU9ERV8xX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX01PREVfMgkJCSgweDEwQikKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfTU9ERV8yX19QT1IJCQkJKDB4NTApCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX0NUUkxfMQkJCSgweDEwQykKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfQ1RSTF8xX19QT1IJCQkJKDB4NzApCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX0NUUkxfMgkJCSgweDEwRCkKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfQ1RSTF8yX19QT1IJCQkJKDB4NTUpCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX0NUUkxfMwkJCSgweDEwRSkKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfQ1RSTF8zX19QT1IJCQkJKDB4NTYpCisjZGVmaW5lIFRPTVRPTV9BX0xET19MX0NUUkxfNAkJCSgweDEwRikKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0xfQ1RSTF80X19QT1IJCQkJKDB4NTUpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX01PREVfMQkJCSgweDExMCkKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0hfTU9ERV8xX19QT1IJCQkJKDB4NjUpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX01PREVfMgkJCSgweDExMSkKKyNkZWZpbmUgVE9NVE9NX0FfTERPX0hfTU9ERV8yX19QT1IJCQkJKDB4QTgpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0xPT1BfQ1RMCQkJKDB4MTEyKQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9MT09QX0NUTF9fUE9SCQkJCSgweDZCKQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9DT01QXzEJCQkoMHgxMTMpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0NPTVBfMV9fUE9SCQkJCSgweDg0KQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9DT01QXzIJCQkoMHgxMTQpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0NPTVBfMl9fUE9SCQkJCSgweEUwKQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9CSUFTXzEJCQkoMHgxMTUpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0JJQVNfMV9fUE9SCQkJCSgweDZEKQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9CSUFTXzIJCQkoMHgxMTYpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0JJQVNfMl9fUE9SCQkJCSgweEE1KQorI2RlZmluZSBUT01UT01fQV9MRE9fSF9CSUFTXzMJCQkoMHgxMTcpCisjZGVmaW5lIFRPTVRPTV9BX0xET19IX0JJQVNfM19fUE9SCQkJCSgweDYwKQorI2RlZmluZSBUT01UT01fQV9WQkFUX0NMSwkJCSgweDExOCkKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9DTEtfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9MT09QCQkJKDB4MTE5KQorI2RlZmluZSBUT01UT01fQV9WQkFUX0xPT1BfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9SRUYJCQkoMHgxMUEpCisjZGVmaW5lIFRPTVRPTV9BX1ZCQVRfUkVGX19QT1IJCQkJKDB4MjApCisjZGVmaW5lIFRPTVRPTV9BX1ZCQVRfQURDX1RFU1QJCQkoMHgxMUIpCisjZGVmaW5lIFRPTVRPTV9BX1ZCQVRfQURDX1RFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9GRQkJCSgweDExQykKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9GRV9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9WQkFUX0JJQVNfMQkJCSgweDExRCkKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9CSUFTXzFfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9CSUFTXzIJCQkoMHgxMUUpCisjZGVmaW5lIFRPTVRPTV9BX1ZCQVRfQklBU18yX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1ZCQVRfQURDX0RBVEFfTVNCCQkJKDB4MTFGKQorI2RlZmluZSBUT01UT01fQV9WQkFUX0FEQ19EQVRBX01TQl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9WQkFUX0FEQ19EQVRBX0xTQgkJCSgweDEyMCkKKyNkZWZpbmUgVE9NVE9NX0FfVkJBVF9BRENfREFUQV9MU0JfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfRkxMX05SRUYJCQkoMHgxMjEpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9OUkVGX19QT1IJCQkJKDB4MTIpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9LRENPX1RVTkUJCQkoMHgxMjIpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9LRENPX1RVTkVfX1BPUgkJCQkoMHgwNSkKKyNkZWZpbmUgVE9NVE9NX0FfRkxMX0xPQ0tfVEhSRVNICQkJKDB4MTIzKQorI2RlZmluZSBUT01UT01fQV9GTExfTE9DS19USFJFU0hfX1BPUgkJCQkoMHhDMikKKyNkZWZpbmUgVE9NVE9NX0FfRkxMX0xPQ0tfREVUX0NPVU5UCQkJKDB4MTI0KQorI2RlZmluZSBUT01UT01fQV9GTExfTE9DS19ERVRfQ09VTlRfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVE9NVE9NX0FfRkxMX0RBQ19USFJFU0hPTEQJCQkoMHgxMjUpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9EQUNfVEhSRVNIT0xEX19QT1IJCQkJKDB4QzgpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9URVNUX0RDT19GUkVFUlVOCQkJKDB4MTI2KQorI2RlZmluZSBUT01UT01fQV9GTExfVEVTVF9EQ09fRlJFRVJVTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9GTExfVEVTVF9FTkFCTEUJCQkoMHgxMjcpCisjZGVmaW5lIFRPTVRPTV9BX0ZMTF9URVNUX0VOQUJMRV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzFfQ1RMCQkJKDB4MTI4KQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzFfQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9WQUwJCQkoMHgxMjkpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9WQUxfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8xX1BSRUNIUkcJCQkoMHgxMkEpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9QUkVDSFJHX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfMV9DVEwJCQkoMHgxMkIpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfMV9DVExfX1BPUgkJCQkoMHgxNikKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8xX0lOVF9SQklBUwkJCSgweDEyQykKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8xX0lOVF9SQklBU19fUE9SCQkJCSgweDI0KQorI2RlZmluZSBUT01UT01fQV9NSUNCXzFfTUJIQwkJCSgweDEyRCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8xX01CSENfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8yX0NUTAkJCSgweDEyRSkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8yX0NUTF9fUE9SCQkJCSgweDQxKQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzJfVkFMCQkJKDB4MTJGKQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzJfVkFMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9QUkVDSFJHCQkJKDB4MTMwKQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzJfUFJFQ0hSR19fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUT01UT01fQV9NSUNCXzJfQ1RMCQkJKDB4MTMxKQorI2RlZmluZSBUT01UT01fQV9NSUNCXzJfQ1RMX19QT1IJCQkJKDB4MTYpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfMl9JTlRfUkJJQVMJCQkoMHgxMzIpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfMl9JTlRfUkJJQVNfX1BPUgkJCQkoMHgyNCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8yX01CSEMJCQkoMHgxMzMpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfMl9NQkhDX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfM19DVEwJCQkoMHgxMzQpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfM19DVExfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTAkJCSgweDEzNSkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9NSUNCX0NGSUxUXzNfUFJFQ0hSRwkJCSgweDEzNikKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl9DRklMVF8zX1BSRUNIUkdfX1BPUgkJCQkoMHgzOCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8zX0NUTAkJCSgweDEzNykKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl8zX0NUTF9fUE9SCQkJCSgweDE2KQorI2RlZmluZSBUT01UT01fQV9NSUNCXzNfSU5UX1JCSUFTCQkJKDB4MTM4KQorI2RlZmluZSBUT01UT01fQV9NSUNCXzNfSU5UX1JCSUFTX19QT1IJCQkJKDB4MjQpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfM19NQkhDCQkJKDB4MTM5KQorI2RlZmluZSBUT01UT01fQV9NSUNCXzNfTUJIQ19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9NSUNCXzRfQ1RMCQkJKDB4MTNBKQorI2RlZmluZSBUT01UT01fQV9NSUNCXzRfQ1RMX19QT1IJCQkJKDB4MTYpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfNF9JTlRfUkJJQVMJCQkoMHgxM0IpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfNF9JTlRfUkJJQVNfX1BPUgkJCQkoMHgyNCkKKyNkZWZpbmUgVE9NVE9NX0FfTUlDQl80X01CSEMJCQkoMHgxM0MpCisjZGVmaW5lIFRPTVRPTV9BX01JQ0JfNF9NQkhDX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9FTgkJCSgweDEzRCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX0VOX19QT1IJCQkJKDB4NkYpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9HQUlOCQkJKDB4MTNFKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfREFDX0NUTAkJCSgweDEzRikKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX0RBQ19DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX09DUF9DVEwJCQkoMHgxNDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9PQ1BfQ1RMX19QT1IJCQkJKDB4OTcpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9DTElQX0RFVAkJCSgweDE0MSkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX0NMSVBfREVUX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfREFDCQkJKDB4MTQyKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfREJHX0RBQ19fUE9SCQkJCSgweDA1KQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfREJHX1BBCQkJKDB4MTQzKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfREJHX1BBX19QT1IJCQkJKDB4MTgpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUFdSU1RHCQkJKDB4MTQ0KQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfREJHX1BXUlNUR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfQklBU19MRE8JCQkoMHgxNDUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0xET19fUE9SCQkJCSgweDQ1KQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfQklBU19JTlQJCQkoMHgxNDYpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0lOVF9fUE9SCQkJCSgweEE1KQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjJfQklBU19QQQkJCSgweDE0NykKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX0JJQVNfUEFfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYyX1NUQVRVU19PQ1AJCQkoMHgxNDgpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfT0NQX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfUEEJCQkoMHgxNDkpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfUEFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUCQkJKDB4MTRBKQorI2RlZmluZSBUT01UT01fQV9NQkhDX0lOU0VSVF9ERVRFQ1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVUX1NUQVRVUwkJCSgweDE0QikKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVUX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9UWF9DT01fQklBUwkJCSgweDE0QykKKyNkZWZpbmUgVE9NVE9NX0FfVFhfQ09NX0JJQVNfX1BPUgkJCQkoMHhGMCkKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUMgkJCSgweDE0RCkKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUMl9fUE9SCQkJCSgweEQwKQorI2RlZmluZSBUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzEJCQkoMHgxNEUpCisjZGVmaW5lIFRPTVRPTV9BX01CSENfU0NBTElOR19NVVhfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzIJCQkoMHgxNEYpCisjZGVmaW5lIFRPTVRPTV9BX01CSENfU0NBTElOR19NVVhfMl9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9NQURfQU5BX0NUUkwJCQkoMHgxNTApCisjZGVmaW5lIFRPTVRPTV9BX01BRF9BTkFfQ1RSTF9fUE9SCQkJCSgweEYxKQorI2RlZmluZSBUT01UT01fQV9UWF9TVVBfU1dJVENIX0NUUkxfMQkJCSgweDE1MSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzIJCQkoMHgxNTIpCisjZGVmaW5lIFRPTVRPTV9BX1RYX1NVUF9TV0lUQ0hfQ1RSTF8yX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzFfR0FJTgkJCSgweDE1MykKKyNkZWZpbmUgVE9NVE9NX0FfVFhfMV9HQUlOX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzFfMl9URVNUX0VOCQkJKDB4MTU0KQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfVEVTVF9FTl9fUE9SCQkJCSgweENDKQorI2RlZmluZSBUT01UT01fQV9UWF8yX0dBSU4JCQkoMHgxNTUpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzJfR0FJTl9fUE9SCQkJCSgweDAyKQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfQURDX0lCCQkJKDB4MTU2KQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfQURDX0lCX19QT1IJCQkJKDB4NDQpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzFfMl9BVEVTVF9SRUZDVFJMCQkJKDB4MTU3KQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfQVRFU1RfUkVGQ1RSTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfVEVTVF9DVEwJCQkoMHgxNTgpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzFfMl9URVNUX0NUTF9fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfVEVTVF9CTE9DS19FTgkJCSgweDE1OSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfMV8yX1RFU1RfQkxPQ0tfRU5fX1BPUgkJCQkoMHhGQykKKyNkZWZpbmUgVE9NVE9NX0FfVFhfMV8yX1RYRkVfQ0xLRElWCQkJKDB4MTVBKQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfVFhGRV9DTEtESVZfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gxCQkJKDB4MTVCKQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfU0FSX0VSUl9DSDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gyCQkJKDB4MTVDKQorI2RlZmluZSBUT01UT01fQV9UWF8xXzJfU0FSX0VSUl9DSDJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM19HQUlOCQkJKDB4MTVEKQorI2RlZmluZSBUT01UT01fQV9UWF8zX0dBSU5fX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X1RFU1RfRU4JCQkoMHgxNUUpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9URVNUX0VOX19QT1IJCQkJKDB4Q0MpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzRfR0FJTgkJCSgweDE1RikKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNF9HQUlOX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9BRENfSUIJCQkoMHgxNjApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9BRENfSUJfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X0FURVNUX1JFRkNUUkwJCQkoMHgxNjEpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9BVEVTVF9SRUZDVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9URVNUX0NUTAkJCSgweDE2MikKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X1RFU1RfQ1RMX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzNfNF9URVNUX0JMT0NLX0VOCQkJKDB4MTYzKQorI2RlZmluZSBUT01UT01fQV9UWF8zXzRfVEVTVF9CTE9DS19FTl9fUE9SCQkJCSgweEZDKQorI2RlZmluZSBUT01UT01fQV9UWF8zXzRfVFhGRV9DS0RJVgkJCSgweDE2NCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X1RYRkVfQ0tESVZfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0gzCQkJKDB4MTY1KQorI2RlZmluZSBUT01UT01fQV9UWF8zXzRfU0FSX0VSUl9DSDNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0g0CQkJKDB4MTY2KQorI2RlZmluZSBUT01UT01fQV9UWF8zXzRfU0FSX0VSUl9DSDRfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV9HQUlOCQkJKDB4MTY3KQorI2RlZmluZSBUT01UT01fQV9UWF81X0dBSU5fX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X1RFU1RfRU4JCQkoMHgxNjgpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9URVNUX0VOX19QT1IJCQkJKDB4Q0MpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzZfR0FJTgkJCSgweDE2OSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNl9HQUlOX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9BRENfSUIJCQkoMHgxNkEpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9BRENfSUJfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X0FURVNUX1JFRkNUUkwJCQkoMHgxNkIpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9BVEVTVF9SRUZDVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9URVNUX0NUTAkJCSgweDE2QykKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X1RFU1RfQ1RMX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzVfNl9URVNUX0JMT0NLX0VOCQkJKDB4MTZEKQorI2RlZmluZSBUT01UT01fQV9UWF81XzZfVEVTVF9CTE9DS19FTl9fUE9SCQkJCSgweEZDKQorI2RlZmluZSBUT01UT01fQV9UWF81XzZfVFhGRV9DS0RJVgkJCSgweDE2RSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X1RYRkVfQ0tESVZfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X1NBUl9FUlJfQ0g1CQkJKDB4MTZGKQorI2RlZmluZSBUT01UT01fQV9UWF81XzZfU0FSX0VSUl9DSDVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfNV82X1NBUl9FUlJfQ0g2CQkJKDB4MTcwKQorI2RlZmluZSBUT01UT01fQV9UWF81XzZfU0FSX0VSUl9DSDZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfN19NQkhDX0VOCQkJKDB4MTcxKQorI2RlZmluZSBUT01UT01fQV9UWF83X01CSENfRU5fX1BPUgkJCQkoMHgwQykKKyNkZWZpbmUgVE9NVE9NX0FfVFhfN19NQkhDX0FURVNUX1JFRkNUUkwJCQkoMHgxNzIpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfTUJIQ19BVEVTVF9SRUZDVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfTUJIQ19BREMJCQkoMHgxNzMpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfTUJIQ19BRENfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfN19NQkhDX1RFU1RfQ1RMCQkJKDB4MTc0KQorI2RlZmluZSBUT01UT01fQV9UWF83X01CSENfVEVTVF9DVExfX1BPUgkJCQkoMHgzOCkKKyNkZWZpbmUgVE9NVE9NX0FfVFhfN19NQkhDX1NBUl9FUlIJCQkoMHgxNzUpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfTUJIQ19TQVJfRVJSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfVFhGRV9DTEtESVYJCQkoMHgxNzYpCisjZGVmaW5lIFRPTVRPTV9BX1RYXzdfVFhGRV9DTEtESVZfX1BPUgkJCQkoMHg4QikKKyNkZWZpbmUgVE9NVE9NX0FfUkNPX0NUUkwJCQkoMHgxNzcpCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMQkJCSgweDE3OCkKKyNkZWZpbmUgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMgkJCSgweDE3OSkKKyNkZWZpbmUgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMwkJCSgweDE3QSkKKyNkZWZpbmUgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JDT19URVNUX0NUUkwJCQkoMHgxN0IpCisjZGVmaW5lIFRPTVRPTV9BX1JDT19URVNUX0NUUkxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDEJCQkoMHgxN0MpCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9SRVNVTFQxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9SRVNVTFQyCQkJKDB4MTdEKQorI2RlZmluZSBUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fUkVTVUxUMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9CVUNLX01PREVfMQkJCSgweDE4MSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19NT0RFXzFfX1BPUgkJCQkoMHgyMSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19NT0RFXzIJCQkoMHgxODIpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfTU9ERV8yX19QT1IJCQkJKDB4RkYpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfTU9ERV8zCQkJKDB4MTgzKQorI2RlZmluZSBUT01UT01fQV9CVUNLX01PREVfM19fUE9SCQkJCSgweENFKQorI2RlZmluZSBUT01UT01fQV9CVUNLX01PREVfNAkJCSgweDE4NCkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19NT0RFXzRfX1BPUgkJCQkoMHgzQSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19NT0RFXzUJCQkoMHgxODUpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfTU9ERV81X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMQkJCSgweDE4NikKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8xX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMgkJCSgweDE4NykKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8yX19QT1IJCQkJKDB4QTMpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMwkJCSgweDE4OCkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8zX19QT1IJCQkJKDB4ODIpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMQkJCSgweDE4OSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8xX19QT1IJCQkJKDB4NUIpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMgkJCSgweDE4QSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8yX19QT1IJCQkJKDB4REMpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMwkJCSgweDE4QikKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8zX19QT1IJCQkJKDB4NkEpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfNAkJCSgweDE4QykKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX0NDTF80X19QT1IJCQkJKDB4NTEpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8xCQkJKDB4MThEKQorI2RlZmluZSBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMV9fUE9SCQkJCSgweDUwKQorI2RlZmluZSBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMgkJCSgweDE4RSkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzJfX1BPUgkJCQkoMHg2NCkKKyNkZWZpbmUgVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzMJCQkoMHgxOEYpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8zX19QT1IJCQkJKDB4NzcpCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfVE1VWF9BX0QJCQkoMHgxOTApCisjZGVmaW5lIFRPTVRPTV9BX0JVQ0tfVE1VWF9BX0RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX0JVQ0tSRUYJCQkoMHgxOTEpCisjZGVmaW5lIFRPTVRPTV9BX05DUF9CVUNLUkVGX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX05DUF9FTgkJCSgweDE5MikKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX0VOX19QT1IJCQkJKDB4RkUpCisjZGVmaW5lIFRPTVRPTV9BX05DUF9DTEsJCQkoMHgxOTMpCisjZGVmaW5lIFRPTVRPTV9BX05DUF9DTEtfX1BPUgkJCQkoMHg5NCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX1NUQVRJQwkJCSgweDE5NCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX1NUQVRJQ19fUE9SCQkJCSgweDI4KQorI2RlZmluZSBUT01UT01fQV9OQ1BfVlRIX0xPVwkJCSgweDE5NSkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX1ZUSF9MT1dfX1BPUgkJCQkoMHg4OCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX1ZUSF9ISUdICQkJKDB4MTk2KQorI2RlZmluZSBUT01UT01fQV9OQ1BfVlRIX0hJR0hfX1BPUgkJCQkoMHhBMCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX0FURVNUCQkJKDB4MTk3KQorI2RlZmluZSBUT01UT01fQV9OQ1BfQVRFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX0RURVNUCQkJKDB4MTk4KQorI2RlZmluZSBUT01UT01fQV9OQ1BfRFRFU1RfX1BPUgkJCQkoMHgxMCkKKyNkZWZpbmUgVE9NVE9NX0FfTkNQX0RMWTEJCQkoMHgxOTkpCisjZGVmaW5lIFRPTVRPTV9BX05DUF9ETFkxX19QT1IJCQkJKDB4MDYpCisjZGVmaW5lIFRPTVRPTV9BX05DUF9ETFkyCQkJKDB4MTlBKQorI2RlZmluZSBUT01UT01fQV9OQ1BfRExZMl9fUE9SCQkJCSgweDA2KQorI2RlZmluZSBUT01UT01fQV9SWF9BVVhfU1dfQ1RMCQkJKDB4MTlCKQorI2RlZmluZSBUT01UT01fQV9SWF9BVVhfU1dfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX1BBX0FVWF9JTl9DT05OCQkJKDB4MTlDKQorI2RlZmluZSBUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fVElNRVJfRElWCQkJKDB4MTlFKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fVElNRVJfRElWX19QT1IJCQkJKDB4RTgpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0NPTV9PQ1BfQ1RMCQkJKDB4MTlGKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fT0NQX0NUTF9fUE9SCQkJCSgweDFGKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fT0NQX0NPVU5UCQkJKDB4MUEwKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fT0NQX0NPVU5UX19QT1IJCQkJKDB4NzcpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0NPTV9EQUNfQ1RMCQkJKDB4MUExKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9DT01fQklBUwkJCSgweDFBMikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfQ09NX0JJQVNfX1BPUgkJCQkoMHgyMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0FVVE9fQ0hPUAkJCSgweDFBNCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0FVVE9fQ0hPUF9fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfQ0hPUF9DVEwJCQkoMHgxQTUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9DSE9QX0NUTF9fUE9SCQkJCSgweEE0KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfQklBU19QQQkJCSgweDFBNikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0JJQVNfUEFfX1BPUgkJCQkoMHg3QSkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0JJQVNfTERPCQkJKDB4MUE3KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfQklBU19MRE9fX1BPUgkJCQkoMHg4NykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0JJQVNfQ05QCQkJKDB4MUE4KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfQklBU19DTlBfX1BPUgkJCQkoMHg4QSkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0JJQVNfV0dfT0NQCQkJKDB4MUE5KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfQklBU19XR19PQ1BfX1BPUgkJCQkoMHgyQSkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX09DUF9DVEwJCQkoMHgxQUEpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMX19QT1IJCQkJKDB4NjkpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9DTlBfRU4JCQkoMHgxQUIpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9DTlBfRU5fX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19DVEwJCQkoMHgxQUMpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9DTlBfV0dfQ1RMX19QT1IJCQkJKDB4REEpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9DTlBfV0dfVElNRQkJCSgweDFBRCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19USU1FX19QT1IJCQkJKDB4MTUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9MX0dBSU4JCQkoMHgxQUUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9MX0dBSU5fX1BPUgkJCQkoMHhDMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0xfVEVTVAkJCSgweDFBRikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX0xfVEVTVF9fUE9SCQkJCSgweDAyKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfTF9QQV9DVEwJCQkoMHgxQjApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9MX1BBX0NUTF9fUE9SCQkJCSgweDQyKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfTF9EQUNfQ1RMCQkJKDB4MUIxKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfTF9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9MX0FURVNUCQkJKDB4MUIyKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfTF9BVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfTF9TVEFUVVMJCQkoMHgxQjMpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9MX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfUl9HQUlOCQkJKDB4MUI0KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfUl9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9SX1RFU1QJCQkoMHgxQjUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0hQSF9SX1RFU1RfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX1JfUEFfQ1RMCQkJKDB4MUI2KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfUl9QQV9DVExfX1BPUgkJCQkoMHg0MikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTAkJCSgweDFCNykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfUl9BVEVTVAkJCSgweDFCOCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX1JfQVRFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfSFBIX1JfU1RBVFVTCQkJKDB4MUI5KQorI2RlZmluZSBUT01UT01fQV9SWF9IUEhfUl9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfRUFSX0JJQVNfUEEJCQkoMHgxQkEpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9CSUFTX1BBX19QT1IJCQkJKDB4NzYpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9CSUFTX0NNQlVGRgkJCSgweDFCQikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfRUFSX0JJQVNfQ01CVUZGX19QT1IJCQkJKDB4QTApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9FTgkJCSgweDFCQykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfRUFSX0VOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9HQUlOCQkJKDB4MUJEKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfR0FJTl9fUE9SCQkJCSgweDAyKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfQ01CVUZGCQkJKDB4MUJFKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfQ01CVUZGX19QT1IJCQkJKDB4MDUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9JQ1RMCQkJKDB4MUJGKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfSUNUTF9fUE9SCQkJCSgweDQwKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfQ0NPTVAJCQkoMHgxQzApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9DQ09NUF9fUE9SCQkJCSgweDA4KQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfVkNNCQkJKDB4MUMxKQorI2RlZmluZSBUT01UT01fQV9SWF9FQVJfVkNNX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9DTlAJCQkoMHgxQzIpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9DTlBfX1BPUgkJCQkoMHhDMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfRUFSX0RBQ19DVExfQVRFU1QJCQkoMHgxQzMpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9EQUNfQ1RMX0FURVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9TVEFUVVMJCQkoMHgxQzUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0VBUl9TVEFUVVNfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9CSUFTX1BBCQkJKDB4MUM2KQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FX0JJQVNfUEFfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfQlVDS19CSUFTMQkJCSgweDFDNykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfQlVDS19CSUFTMV9fUE9SCQkJCSgweDQyKQorI2RlZmluZSBUT01UT01fQV9SWF9CVUNLX0JJQVMyCQkJKDB4MUM4KQorI2RlZmluZSBUT01UT01fQV9SWF9CVUNLX0JJQVMyX19QT1IJCQkJKDB4ODQpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfQ09NCQkJKDB4MUM5KQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FX0NPTV9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FX0NOUF9FTgkJCSgweDFDQSkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9DTlBfRU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfQ1RMCQkJKDB4MUNCKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FX0NOUF9XR19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfVElNRQkJCSgweDFDQykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfVElNRV9fUE9SCQkJCSgweDA0KQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzFfR0FJTgkJCSgweDFDRCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8xX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8xX1RFU1QJCQkoMHgxQ0UpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMV9URVNUX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMV9EQUNfQ1RMCQkJKDB4MUNGKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzFfREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzFfU1RBVFVTCQkJKDB4MUQwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzFfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMl9HQUlOCQkJKDB4MUQxKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzJfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzJfVEVTVAkJCSgweDFEMikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8yX1RFU1RfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8yX0RBQ19DVEwJCQkoMHgxRDMpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMl9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMl9TVEFUVVMJCQkoMHgxRDQpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfMl9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8zX0dBSU4JCQkoMHgxRDUpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfM19HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfM19URVNUCQkJKDB4MUQ2KQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzNfVEVTVF9fUE9SCQkJCSgweDAyKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzNfREFDX0NUTAkJCSgweDFENykKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8zX0RBQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8zX1NUQVRVUwkJCSgweDFEOCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV8zX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzRfR0FJTgkJCSgweDFEOSkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV80X0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV80X1RFU1QJCQkoMHgxREEpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfNF9URVNUX19QT1IJCQkJKDB4MDIpCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfNF9EQUNfQ1RMCQkJKDB4MURCKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzRfREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzRfU1RBVFVTCQkJKDB4MURDKQorI2RlZmluZSBUT01UT01fQV9SWF9MSU5FXzRfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1JYX0xJTkVfQ05QX0RCRwkJCSgweDFERCkKKyNkZWZpbmUgVE9NVE9NX0FfUlhfTElORV9DTlBfREJHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9FTgkJCSgweDFERikKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0VOX19QT1IJCQkJKDB4NkYpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9HQUlOCQkJKDB4MUUwKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjFfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjFfREFDX0NUTAkJCSgweDFFMSkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0RBQ19DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX09DUF9DVEwJCQkoMHgxRTIpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMX19QT1IJCQkJKDB4OTcpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9DTElQX0RFVAkJCSgweDFFMykKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0NMSVBfREVUX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9JRUMJCQkoMHgxRTQpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9JRUNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0RCR19EQUMJCQkoMHgxRTUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfREFDX19QT1IJCQkJKDB4MDUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUEEJCQkoMHgxRTYpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUEFfX1BPUgkJCQkoMHgxOCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0RCR19QV1JTVEcJCQkoMHgxRTcpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUFdSU1RHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0xETwkJCSgweDFFOCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfTERPX19QT1IJCQkJKDB4NDUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0lOVAkJCSgweDFFOSkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfSU5UX19QT1IJCQkJKDB4QTUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX1BBCQkJKDB4MUVBKQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjFfQklBU19QQV9fUE9SCQkJCSgweDU1KQorI2RlZmluZSBUT01UT01fQV9TUEtSX0RSVjFfU1RBVFVTX09DUAkJCSgweDFFQikKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19PQ1BfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19QQQkJCSgweDFFQykKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19QQV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSMV9QUk9UX0VOCQkJKDB4MUVEKQorI2RlZmluZSBUT01UT01fQV9TUEtSMV9QUk9UX0VOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IxX1BST1RfQURDX1RFU1RfRU4JCQkoMHgxRUUpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IxX1BST1RfQURDX1RFU1RfRU5fX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjFfUFJPVF9BVEVTVAkJCSgweDFFRikKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjFfUFJPVF9BVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSMV9QUk9UX0xET19DVFJMCQkJKDB4MUYwKQorI2RlZmluZSBUT01UT01fQV9TUEtSMV9QUk9UX0xET19DVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IxX1BST1RfSVNFTlNFX0NUUkwJCQkoMHgxRjEpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IxX1BST1RfSVNFTlNFX0NUUkxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjFfUFJPVF9WU0VOU0VfQ1RSTAkJCSgweDFGMikKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjFfUFJPVF9WU0VOU0VfQ1RSTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSMl9QUk9UX0VOCQkJKDB4MUYzKQorI2RlZmluZSBUT01UT01fQV9TUEtSMl9QUk9UX0VOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IyX1BST1RfQURDX1RFU1RfRU4JCQkoMHgxRjQpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IyX1BST1RfQURDX1RFU1RfRU5fX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjJfUFJPVF9BVEVTVAkJCSgweDFGNSkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjJfUFJPVF9BVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9TUEtSMl9QUk9UX0xET19DVFJMCQkJKDB4MUY2KQorI2RlZmluZSBUT01UT01fQV9TUEtSMl9QUk9UX0xET19DVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IyX1BST1RfSVNFTlNFX0NUUkwJCQkoMHgxRjcpCisjZGVmaW5lIFRPTVRPTV9BX1NQS1IyX1BST1RfSVNFTlNFX0NUUkxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjJfUFJPVF9WU0VOU0VfQ1RSTAkJCSgweDFGOCkKKyNkZWZpbmUgVE9NVE9NX0FfU1BLUjJfUFJPVF9WU0VOU0VfQ1RSTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9NQkhDX0hQSAkJCSgweDFGRSkKKyNkZWZpbmUgVE9NVE9NX0FfTUJIQ19IUEhfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfQjFfQ1RMCQkJKDB4MjAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfQjFfQ1RMCQkJKDB4MjgwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfU0hJRlQJCQkoMHgyMDEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX1NISUZUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX1NISUZUCQkJKDB4MjgxKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9TSElGVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9JSVJfQjFfQ1RMCQkJKDB4MjAyKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9JSVJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CMV9DVEwJCQkoMHgyODIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IyX0NUTAkJCSgweDIwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9JSVJfQjJfQ1RMCQkJKDB4MjgzKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9JSVJfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX0lJUl9CM19DVEwJCQkoMHgyMDQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX0lJUl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IzX0NUTAkJCSgweDI4NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9MUEZfQjFfQ1RMCQkJKDB4MjA2KQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9MUEZfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0xQRl9CMV9DVEwJCQkoMHgyODYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0xQRl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IyX0NUTAkJCSgweDIwNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9MUEZfQjJfQ1RMCQkJKDB4Mjg3KQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9MUEZfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX1NQQVJFCQkJKDB4MjA5KQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9TUEFSRV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9TUEFSRQkJCSgweDI4OSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfU1BBUkVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfU01MUEZfQ1RMCQkJKDB4MjBBKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9TTUxQRl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfU01MUEZfQ1RMCQkJKDB4MjhBKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9TTUxQRl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfRENGTFRfQ1RMCQkJKDB4MjBCKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9EQ0ZMVF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzJfRENGTFRfQ1RMCQkJKDB4MjhCKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9EQ0ZMVF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0FOQzFfR0FJTl9DVEwJCQkoMHgyMEMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX0dBSU5fQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0dBSU5fQ1RMCQkJKDB4MjhDKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9HQUlOX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMV9CMl9DVEwJCQkoMHgyMEQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMxX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQU5DMl9CMl9DVEwJCQkoMHgyOEQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19BTkMyX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfVElNRVIJCQkoMHgyMjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfVElNRVIJCQkoMHgyMjgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDJfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfVElNRVIJCQkoMHgyMzApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfVElNRVIJCQkoMHgyMzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfVElNRVIJCQkoMHgyNDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDVfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfVElNRVIJCQkoMHgyNDgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfVElNRVIJCQkoMHgyNTApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfVElNRVIJCQkoMHgyNTgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDhfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfVElNRVIJCQkoMHgyNjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX1RJTUVSCQkJKDB4MjY4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX1RJTUVSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOCQkJKDB4MjIxKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfR0FJTgkJCSgweDIyOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0dBSU4JCQkoMHgyMzEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOCQkJKDB4MjM5KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfR0FJTgkJCSgweDI0MSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0dBSU4JCQkoMHgyNDkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOCQkJKDB4MjUxKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfR0FJTgkJCSgweDI1OSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0dBSU4JCQkoMHgyNjEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTgkJCSgweDI2OSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMTBfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkcJCQkoMHgyMjIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGRwkJCSgweDIyQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfQ0ZHCQkJKDB4MjMyKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9DRkcJCQkoMHgyM0EpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGRwkJCSgweDI0MikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfQ0ZHCQkJKDB4MjRBKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9DRkcJCQkoMHgyNTIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGRwkJCSgweDI1QSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfQ0ZHCQkJKDB4MjYyKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfQ0ZHCQkJKDB4MjZBKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxX01VWF9DVEwJCQkoMHgyMjMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFgyX01VWF9DVEwJCQkoMHgyMkIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDJfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFgzX01VWF9DVEwJCQkoMHgyMzMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg0X01VWF9DVEwJCQkoMHgyM0IpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg1X01VWF9DVEwJCQkoMHgyNDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDVfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg2X01VWF9DVEwJCQkoMHgyNEIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg3X01VWF9DVEwJCQkoMHgyNTMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg4X01VWF9DVEwJCQkoMHgyNUIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDhfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg5X01VWF9DVEwJCQkoMHgyNjMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfTVVYX0NUTF9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMCQkJKDB4MjZCKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMX19QT1IJCQkJKDB4NDgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDFfQ0xLX0ZTX0NUTAkJCSgweDIyNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMV9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDJfQ0xLX0ZTX0NUTAkJCSgweDIyQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMl9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfQ0xLX0ZTX0NUTAkJCSgweDIzNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYM19DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDRfQ0xLX0ZTX0NUTAkJCSgweDIzQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNF9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDVfQ0xLX0ZTX0NUTAkJCSgweDI0NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNV9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfQ0xLX0ZTX0NUTAkJCSgweDI0QykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNl9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDdfQ0xLX0ZTX0NUTAkJCSgweDI1NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYN19DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDhfQ0xLX0ZTX0NUTAkJCSgweDI1QykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOF9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfQ0xLX0ZTX0NUTAkJCSgweDI2NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYOV9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDEwX0NMS19GU19DVEwJCQkoMHgyNkMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDEwX0NMS19GU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTAkJCSgweDIyNSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMCQkJKDB4MjJEKQorI2RlZmluZSBUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfRE1JQ19DVEwJCQkoMHgyMzUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDNfRE1JQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTAkJCSgweDIzRCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMCQkJKDB4MjQ1KQorI2RlZmluZSBUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfRE1JQ19DVEwJCQkoMHgyNEQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDZfRE1JQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTAkJCSgweDI1NSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMCQkJKDB4MjVEKQorI2RlZmluZSBUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfRE1JQ19DVEwJCQkoMHgyNjUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDlfRE1JQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1RYMTBfRE1JQ19DVEwJCQkoMHgyNkQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UWDEwX0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMAkJCSgweDI3MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMQkJCSgweDI3MSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMgkJCSgweDI3MikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMwkJCSgweDI3MykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNAkJCSgweDI3NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw0X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNQkJCSgweDI3NSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNgkJCSgweDI3NikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw2X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNwkJCSgweDI3NykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw3X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CMV9DVEwJCQkoMHgyNzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RFQlVHX0IyX0NUTAkJCSgweDI3OSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RFQlVHX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfREVCVUdfQjNfQ1RMCQkJKDB4MjdBKQorI2RlZmluZSBUT01UT01fQV9DRENfREVCVUdfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CNF9DVEwJCQkoMHgyN0IpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RFQlVHX0I1X0NUTAkJCSgweDI3QykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0RFQlVHX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfREVCVUdfQjZfQ1RMCQkJKDB4MjdEKQorI2RlZmluZSBUT01UT01fQV9DRENfREVCVUdfQjZfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CN19DVEwJCQkoMHgyN0UpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19ERUJVR19CN19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NSQzFfUERBX0NGRwkJCSgweDJBMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NSQzFfUERBX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfU1JDMl9QREFfQ0ZHCQkJKDB4MkE4KQorI2RlZmluZSBUT01UT01fQV9DRENfU1JDMl9QREFfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUkMxX0ZTX0NUTAkJCSgweDJBMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NSQzFfRlNfQ1RMX19QT1IJCQkJKDB4MUIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUkMyX0ZTX0NUTAkJCSgweDJBOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NSQzJfRlNfQ1RMX19QT1IJCQkJKDB4MUIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfQjFfQ1RMCQkJKDB4MkIwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgxX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX0IxX0NUTAkJCSgweDJCOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYM19CMV9DVEwJCQkoMHgyQzApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfQjFfQ1RMCQkJKDB4MkM4KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg0X0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X0IxX0NUTAkJCSgweDJEMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNl9CMV9DVEwJCQkoMHgyRDgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfQjFfQ1RMCQkJKDB4MkUwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg3X0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgxX0IyX0NUTAkJCSgweDJCMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9CMl9DVEwJCQkoMHgyQjkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDJfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfQjJfQ1RMCQkJKDB4MkMxKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg0X0IyX0NUTAkJCSgweDJDOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9CMl9DVEwJCQkoMHgyRDEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDVfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfQjJfQ1RMCQkJKDB4MkQ5KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg3X0IyX0NUTAkJCSgweDJFMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9CM19DVEwJCQkoMHgyQjIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDJfQjNfQ1RMCQkJKDB4MkJBKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX0IzX0NUTAkJCSgweDJDMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYM19CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9CM19DVEwJCQkoMHgyQ0EpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDVfQjNfQ1RMCQkJKDB4MkQyKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X0IzX0NUTAkJCSgweDJEQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19CM19DVEwJCQkoMHgyRTIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMCQkJKDB4MkIzKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgxX0I0X0NUTF9fUE9SCQkJCSgweDBCKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX0I0X0NUTAkJCSgweDJCQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9CNF9DVExfX1BPUgkJCQkoMHgwQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYM19CNF9DVEwJCQkoMHgyQzMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfQjRfQ1RMX19QT1IJCQkJKDB4MEIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfQjRfQ1RMCQkJKDB4MkNCKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg0X0I0X0NUTF9fUE9SCQkJCSgweDBCKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X0I0X0NUTAkJCSgweDJEMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9CNF9DVExfX1BPUgkJCQkoMHgwQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNl9CNF9DVEwJCQkoMHgyREIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfQjRfQ1RMX19QT1IJCQkJKDB4MEIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfQjRfQ1RMCQkJKDB4MkUzKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg3X0I0X0NUTF9fUE9SCQkJCSgweDBCKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgxX0I1X0NUTAkJCSgweDJCNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9CNV9DVEwJCQkoMHgyQkMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDJfQjVfQ1RMX19QT1IJCQkJKDB4NzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfQjVfQ1RMCQkJKDB4MkM0KQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX0I1X0NUTF9fUE9SCQkJCSgweDc4KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg0X0I1X0NUTAkJCSgweDJDQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9CNV9DVEwJCQkoMHgyRDQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDVfQjVfQ1RMX19QT1IJCQkJKDB4NzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfQjVfQ1RMCQkJKDB4MkRDKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X0I1X0NUTF9fUE9SCQkJCSgweDc4KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg3X0I1X0NUTAkJCSgweDJFNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9CNl9DVEwJCQkoMHgyQjUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDJfQjZfQ1RMCQkJKDB4MkJEKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX0I2X0NUTAkJCSgweDJDNSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYM19CNl9DVExfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9CNl9DVEwJCQkoMHgyQ0QpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDVfQjZfQ1RMCQkJKDB4MkQ1KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X0I2X0NUTAkJCSgweDJERCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNl9CNl9DVExfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19CNl9DVEwJCQkoMHgyRTUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQjYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IxX0NUTAkJCSgweDJCRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX1ZPTF9DVExfQjFfQ1RMCQkJKDB4MkM2KQorI2RlZmluZSBUT01UT01fQV9DRENfUlgzX1ZPTF9DVExfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQ0UpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IxX0NUTAkJCSgweDJENikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X1ZPTF9DVExfQjFfQ1RMCQkJKDB4MkRFKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg2X1ZPTF9DVExfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVEwJCQkoMHgyRTYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTAkJCSgweDJCNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjJfQ1RMCQkJKDB4MkJGKQorI2RlZmluZSBUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVEwJCQkoMHgyQzcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTAkJCSgweDJDRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjJfQ1RMCQkJKDB4MkQ3KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVEwJCQkoMHgyREYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTAkJCSgweDJFNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9DRkcJCQkoMHgyRTgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX0NGR19fUE9SCQkJCSgweDFBKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMQkJCSgweDJFOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDIJCQkoMHgyRUEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX0FEQ19DQUwyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX0FEQ19DQUwzCQkJKDB4MkVCKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMM19fUE9SCQkJCSgweDA0KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9QS19FU1QxCQkJKDB4MkVDKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9QS19FU1QxX19QT1IJCQkJKDB4RTApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDIJCQkoMHgyRUQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDJfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUMwkJCSgweDJFRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUM19fUE9SCQkJCSgweDQwKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMQkJCSgweDJFRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfUkZfUFJPQzFfX1BPUgkJCQkoMHgyQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfUkZfUFJPQzIJCQkoMHgyRjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1JGX1BST0MyX19QT1IJCQkJKDB4ODYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1RBQzEJCQkoMHgyRjEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1RBQzFfX1BPUgkJCQkoMHg3MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDMgkJCSgweDJGMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDMl9fUE9SCQkJCSgweDE4KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9UQUMzCQkJKDB4MkYzKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9UQUMzX19QT1IJCQkJKDB4MTgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1RBQzQJCQkoMHgyRjQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19WQkFUX1RBQzRfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQxCQkJKDB4MkY1KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDFfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQyCQkJKDB4MkY2KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQzCQkJKDB4MkY3KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDNfX1BPUgkJCQkoMHg2NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQ0CQkJKDB4MkY4KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDRfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfREVCVUcxCQkJKDB4MkY5KQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9ERUJVRzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUERfTU9OCQkJKDB4MkZBKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRF9NT05fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9NT05fVkFMCQkJKDB4MkZCKQorI2RlZmluZSBUT01UT01fQV9DRENfVkJBVF9HQUlOX01PTl9WQUxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMCQkJKDB4MzAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19SWF9SRVNFVF9DVEwJCQkoMHgzMDEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfUlhfUkVTRVRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfVFhfUkVTRVRfQjFfQ1RMCQkJKDB4MzAyKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IyX0NUTAkJCSgweDMwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19UWF9SRVNFVF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19SWF9JMlNfQ1RMCQkJKDB4MzA2KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19UWF9JMlNfQ1RMCQkJKDB4MzA3KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IxX0NUTAkJCSgweDMwOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMCQkJKDB4MzA5KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTAkJCSgweDMwQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IyX0NUTAkJCSgweDMwQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfT1RIUl9DVEwJCQkoMHgzMEMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfT1RIUl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19BTkNfQ0xLX0VOX0NUTAkJCSgweDMwRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19BTkNfQ0xLX0VOX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTAkJCSgweDMwRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVEwJCQkoMHgzMTApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfUlhfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfTUNMS19DVEwJCQkoMHgzMTEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfTUNMS19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19QRE1fQ1RMCQkJKDB4MzEyKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xLX1BETV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMS19TRF9DVEwJCQkoMHgzMTMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTEtfU0RfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0IxX0NUTAkJCSgweDMyMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfQjFfQ1RMX19QT1IJCQkJKDB4RTQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0IyX0NUTAkJCSgweDMyMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0IzX0NUTAkJCSgweDMyMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlMJCQkoMHgzMjMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRAkJCSgweDMyNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRF9fUE9SCQkJCSgweDEyKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9JRExFX0VBUl9USFNECQkJKDB4MzI1KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9JRExFX0VBUl9USFNEX19QT1IJCQkJKDB4MEMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNECQkJKDB4MzI2KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRF9fUE9SCQkJKDB4MTgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNECQkJKDB4MzI3KQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9GQ0xLT05MWV9FQVJfVEhTRF9fUE9SCQkJKDB4MjMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0tfQUREUgkJCSgweDMyOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfS19BRERSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0tfREFUQQkJCSgweDMyOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfS19EQVRBX19QT1IJCQkJKDB4QTQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTAkJCSgweDMyQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MX19QT1IJCQkJKDB4RDcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVQkJCSgweDMyQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VX19QT1IJCQkJKDB4MDUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTAkJCSgweDMyQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9MX19QT1IJCQkJKDB4NjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfVQkJCSgweDMyRCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VX19QT1IJCQkJKDB4MDkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfSERfRUFSCQkJKDB4MzJFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9WX1BBX0hEX0VBUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9WX1BBX0hEX0hQSAkJCSgweDMyRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9NSU5fRUFSCQkJKDB4MzMwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9FQVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9NSU5fSFBICQkJKDB4MzMxKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9IUEhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMV9DVEwJCQkoMHgzNDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMCQkJKDB4MzUwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX0IyX0NUTAkJCSgweDM0MSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMl9DVEwJCQkoMHgzNTEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjNfQ1RMCQkJKDB4MzQyKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX0IzX0NUTAkJCSgweDM1MikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNF9DVEwJCQkoMHgzNDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMCQkJKDB4MzUzKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I0X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I1X0NUTAkJCSgweDM0NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNV9DVEwJCQkoMHgzNTQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjVfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjZfQ1RMCQkJKDB4MzQ1KQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I2X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I2X0NUTAkJCSgweDM1NSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CN19DVEwJCQkoMHgzNDYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjdfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjdfQ1RMCQkJKDB4MzU2KQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX0I3X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX0I4X0NUTAkJCSgweDM0NykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9COF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9COF9DVEwJCQkoMHgzNTcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjhfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0NUTAkJCSgweDM0OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0NUTAkJCSgweDM1OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fVElNRVJfQ1RMCQkJKDB4MzQ5KQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9HQUlOX1RJTUVSX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9HQUlOX1RJTUVSX0NUTAkJCSgweDM1OSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9USU1FUl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwJCQkoMHgzNEEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIxX0NPRUZfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0NPRUZfQjFfQ1RMCQkJKDB4MzVBKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMl9DT0VGX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTAkJCSgweDM0QikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVEwJCQkoMHgzNUIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19JSVIyX0NPRUZfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UT1BfR0FJTl9VUERBVEUJCQkoMHgzNjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19UT1BfR0FJTl9VUERBVEVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMCQkJKDB4MzYxKQorI2RlZmluZSBUT01UT01fQV9DRENfUEFfUkFNUF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMCQkJKDB4MzYyKQorI2RlZmluZSBUT01UT01fQV9DRENfUEFfUkFNUF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMCQkJKDB4MzYzKQorI2RlZmluZSBUT01UT01fQV9DRENfUEFfUkFNUF9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjRfQ1RMCQkJKDB4MzY0KQorI2RlZmluZSBUT01UT01fQV9DRENfUEFfUkFNUF9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVEwJCQkoMHgzNjUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX0IxX0NUTAkJCSgweDM2NikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CMV9DVEwJCQkoMHgzNjgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CMV9DVExfX1BPUgkJCQkoMHgzMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IxX0NUTAkJCSgweDM3MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IxX0NUTF9fUE9SCQkJCSgweDMwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjFfQ1RMCQkJKDB4Mzc4KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjFfQ1RMX19QT1IJCQkJKDB4MzApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CMl9DVEwJCQkoMHgzNjkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CMl9DVExfX1BPUgkJCQkoMHhCNSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IyX0NUTAkJCSgweDM3MSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IyX0NUTF9fUE9SCQkJCSgweEI1KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjJfQ1RMCQkJKDB4Mzc5KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjJfQ1RMX19QT1IJCQkJKDB4QjUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CM19DVEwJCQkoMHgzNkEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CM19DVExfX1BPUgkJCQkoMHgyOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IzX0NUTAkJCSgweDM3MikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0IzX0NUTF9fUE9SCQkJCSgweDI4KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjNfQ1RMCQkJKDB4MzdBKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjNfQ1RMX19QT1IJCQkJKDB4MjgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNF9DVEwJCQkoMHgzNkIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNF9DVExfX1BPUgkJCQkoMHgzNykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I0X0NUTAkJCSgweDM3MykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I0X0NUTF9fUE9SCQkJCSgweDM3KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjRfQ1RMCQkJKDB4MzdCKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjRfQ1RMX19QT1IJCQkJKDB4MzcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNV9DVEwJCQkoMHgzNkMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNV9DVExfX1BPUgkJCQkoMHg3RikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I1X0NUTAkJCSgweDM3NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I1X0NUTF9fUE9SCQkJCSgweDdGKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjVfQ1RMCQkJKDB4MzdDKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjVfQ1RMX19QT1IJCQkJKDB4N0YpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNl9DVEwJCQkoMHgzNkQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I2X0NUTAkJCSgweDM3NSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0I2X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjZfQ1RMCQkJKDB4MzdEKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfQjZfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9TSFVUX0RPV05fU1RBVFVTCQkJKDB4MzZFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVU19fUE9SCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMV9TSFVUX0RPV05fU1RBVFVTCQkJKDB4Mzc2KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDFfU0hVVF9ET1dOX1NUQVRVU19fUE9SCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMl9TSFVUX0RPV05fU1RBVFVTCQkJKDB4MzdFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfU0hVVF9ET1dOX1NUQVRVU19fUE9SCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9GU19DRkcJCQkoMHgzNkYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT01QMF9GU19DRkdfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0ZTX0NGRwkJCSgweDM3NykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTVAxX0ZTX0NGR19fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfRlNfQ0ZHCQkJKDB4MzdGKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09NUDJfRlNfQ0ZHX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CMV9DVEwJCQkoMHgzODApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IyX0NUTAkJCSgweDM4MSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDFfQjNfQ1RMCQkJKDB4MzgyKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDFfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CMV9DVEwJCQkoMHgzODMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IyX0NUTAkJCSgweDM4NCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDJfQjNfQ1RMCQkJKDB4Mzg1KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDJfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYM19CMV9DVEwJCQkoMHgzODYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYM19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgzX0IyX0NUTAkJCSgweDM4NykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlgzX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDRfQjFfQ1RMCQkJKDB4Mzg4KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDRfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYNF9CMl9DVEwJCQkoMHgzODkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYNF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg1X0IxX0NUTAkJCSgweDM4QSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg1X0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDVfQjJfQ1RMCQkJKDB4MzhCKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDVfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYNl9CMV9DVEwJCQkoMHgzOEMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYNl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg2X0IyX0NUTAkJCSgweDM4RCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg2X0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDdfQjFfQ1RMCQkJKDB4MzhFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWDdfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYN19CMl9DVEwJCQkoMHgzOEYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1JYN19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IzX0NUTAkJCSgweDM5MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9BTkNfQjFfQ1RMCQkJKDB4MzkxKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9BTkNfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0FOQ19CMl9DVEwJCQkoMHgzOTIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0FOQ19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMCQkJKDB4MzkzKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMCQkJKDB4Mzk0KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjNfQ1RMCQkJKDB4Mzk1KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjRfQ1RMCQkJKDB4Mzk2KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IxX0NUTAkJCSgweDM5NykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTFfQjJfQ1RMCQkJKDB4Mzk4KQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTFfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CM19DVEwJCQkoMHgzOTkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0I0X0NUTAkJCSgweDM5QSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0I0X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTJfQjFfQ1RMCQkJKDB4MzlCKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CMl9DVEwJCQkoMHgzOUMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTAkJCSgweDM5RCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTJfQjRfQ1RMCQkJKDB4MzlFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9FUTJfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1NSQzFfQjFfQ1RMCQkJKDB4MzlGKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9TUkMxX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9TUkMxX0IyX0NUTAkJCSgweDNBMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fU1JDMV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fU1JDMl9CMV9DVEwJCQkoMHgzQTEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1NSQzJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1NSQzJfQjJfQ1RMCQkJKDB4M0EyKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9TUkMyX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMV9DVEwJCQkoMHgzQTMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMl9DVEwJCQkoMHgzQTQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CM19DVEwJCQkoMHgzQTUpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNF9DVEwJCQkoMHgzQTYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I0X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNV9DVEwJCQkoMHgzQTcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNl9DVEwJCQkoMHgzQTgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I2X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CN19DVEwJCQkoMHgzQTkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I3X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COF9DVEwJCQkoMHgzQUEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I4X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COV9DVEwJCQkoMHgzQUIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I5X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMCQkJKDB4M0FDKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxMV9DVEwJCQkoMHgzQUQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlhfU0JfQjFfQ1RMCQkJKDB4M0FFKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlhfU0JfQjJfQ1RMCQkJKDB4M0FGKQorI2RlZmluZSBUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVEwJCQkoMHgzQjApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX0NMU0hfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX01JU0MJCQkoMHgzQjEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DT05OX01JU0NfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg4X0IxX0NUTAkJCSgweDNCMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NPTk5fUlg4X0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVEwJCSgweDNCNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQjFfQ1RMX19QT1IJCQkJKDB4ODEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0NMSVBfTEVWRUxfQURKVVNUCSgweDNCNSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQ0xJUF9MRVZFTF9BREpVU1RfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX01JTl9DTElQX1RIUkVTSE9MRAkoMHgzQjYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX01JTl9DTElQX1RIUkVTSE9MRF9fUE9SCQkoMHhGRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfVEhSRVNIT0xEX1NUQVRVUwkoMHgzQjcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1RIUkVTSE9MRF9TVEFUVVNfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1NBTVBMRV9NQVJLCQkoMHgzQjgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1NBTVBMRV9NQVJLX19QT1IJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQk9PU1RfR0FUSU5HCQkoMHgzQjkpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0JPT1NUX0dBVElOR19fUE9SCQkJKDB4MDQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CMV9DVEwJCSgweDNCQSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0IxX0NUTF9fUE9SCQkJCSgweDgxKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQ0xJUF9MRVZFTF9BREpVU1QJKDB4M0JCKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQ0xJUF9MRVZFTF9BREpVU1RfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9NSU5fQ0xJUF9USFJFU0hPTEQJKDB4M0JDKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfTUlOX0NMSVBfVEhSRVNIT0xEX19QT1IJCSgweEZGKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfVEhSRVNIT0xEX1NUQVRVUwkoMHgzQkQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9USFJFU0hPTERfU1RBVFVTX19QT1IJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfU0FNUExFX01BUksJCSgweDNCRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX1NBTVBMRV9NQVJLX19QT1IJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0JPT1NUX0dBVElORwkoMHgzQkYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CT09TVF9HQVRJTkdfX1BPUgkJCSgweDA0KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19FTl9DVEwJCQkoMHgzQzApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX0VOX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19GSVJfQjFfQ0ZHCQkJKDB4M0MxKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19GSVJfQjFfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMl9DRkcJCQkoMHgzQzIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMl9DRkdfX1BPUgkJCQkoMHgwNikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjFfQ1RMCQkJKDB4M0MzKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMV9DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMCQkJKDB4M0M0KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMl9DVExfX1BPUgkJCQkoMHgwOSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjNfQ1RMCQkJKDB4M0M1KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CM19DVExfX1BPUgkJCQkoMHgxRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjRfQ1RMCQkJKDB4M0M2KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNF9DVExfX1BPUgkJCQkoMHg0NSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMCQkJKDB4M0M3KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNV9DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjZfQ1RMCQkJKDB4M0M4KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNl9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjFfU1RBVFVTCQkJKDB4M0M5KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CMV9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjJfU1RBVFVTCQkJKDB4M0NBKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CMl9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjNfU1RBVFVTCQkJKDB4M0NCKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CM19TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjRfU1RBVFVTCQkJKDB4M0NDKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CNF9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjVfU1RBVFVTCQkJKDB4M0NEKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CNV9TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjFfQ1RMCQkJKDB4M0NFKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CMV9DVExfX1BPUgkJCQkoMHhDMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQjJfQ1RMCQkJKDB4M0NGKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19CMl9DVExfX1BPUgkJCQkoMHg1RCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMV9DVEwJCQkoMHgzRDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjJfQ1RMCQkJKDB4M0QxKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IzX0NUTAkJCSgweDNEMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwJCQkoMHgzRDMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjVfQ1RMCQkJKDB4M0Q0KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I2X0NUTAkJCSgweDNENSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CN19DVEwJCQkoMHgzRDYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjdfQ1RMX19QT1IJCQkJKDB4RkYpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjhfQ1RMCQkJKDB4M0Q3KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I4X0NUTF9fUE9SCQkJCSgweDA3KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I5X0NUTAkJCSgweDNEOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9COV9DVExfX1BPUgkJCQkoMHhGRikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMCQkJKDB4M0Q5KQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMF9DVExfX1BPUgkJCQkoMHg3RikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTFfQ1RMCQkJKDB4M0RBKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTJfQ1RMCQkJKDB4M0RCKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMl9DVExfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQ0xLX0NUTAkJCSgweDNEQykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfQ0xLX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19JTlRfQ1RMCQkJKDB4M0REKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19JTlRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX0RFQlVHX0NUTAkJCSgweDNERSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX01CSENfREVCVUdfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19NQkhDX1NQQVJFCQkJKDB4M0RGKQorI2RlZmluZSBUT01UT01fQV9DRENfTUJIQ19TUEFSRV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X0IxX0NUTAkJCSgweDNFMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYOF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYOF9CMl9DVEwJCQkoMHgzRTEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfQjNfQ1RMCQkJKDB4M0UyKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X0I0X0NUTAkJCSgweDNFMykKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYOF9CNF9DVExfX1BPUgkJCQkoMHgwQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1JYOF9CNV9DVEwJCQkoMHgzRTQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfQjVfQ1RMX19QT1IJCQkJKDB4NzgpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfQjZfQ1RMCQkJKDB4M0U1KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X1ZPTF9DVExfQjFfQ1RMCQkJKDB4M0U2KQorI2RlZmluZSBUT01UT01fQV9DRENfUlg4X1ZPTF9DVExfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMl9DVEwJCQkoMHgzRTcpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMAkJCSgweDNFOCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwxCQkJKDB4M0U5KQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDIJCQkoMHgzRUEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMwkJCSgweDNFQikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMM19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw0CQkJKDB4M0VDKQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw0X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDUJCQkoMHgzRUQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNgkJCSgweDNFRSkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw3CQkJKDB4M0VGKQorI2RlZmluZSBUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw3X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9NT0RFX0NUTAkJCSgweDNGMCkKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0JPT1NUX01PREVfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9USFJFU0hPTEQJCQkoMHgzRjEpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9USFJFU0hPTERfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0JPT1NUX1RBUF9TRUwJCQkoMHgzRjIpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9UQVBfU0VMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9IT0xEX1RJTUUJCQkoMHgzRjMpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9IT0xEX1RJTUVfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVE9NVE9NX0FfQ0RDX0JPT1NUX1RSR1JfRU4JCQkoMHgzRjQpCisjZGVmaW5lIFRPTVRPTV9BX0NEQ19CT09TVF9UUkdSX0VOX19QT1IJCQkJKDB4MDApCisKKy8qIFNMSU1CVVMgU2xhdmUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgICAgICAgICAgICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19SWF8wICAgICAgICAgICAgICgweDM0KQorI2RlZmluZSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzEgICAgICAgICAgICAgKDB4MzUpCisjZGVmaW5lIFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMCAgICAgICAgICAgICAoMHgzNikKKyNkZWZpbmUgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19UWF8xICAgICAgICAgICAgICgweDM3KQorI2RlZmluZSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzAgICAgICAgICAgICAgICAgKDB4MzgpCisjZGVmaW5lIFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMSAgICAgICAgICAgICAgICAoMHgzOSkKKyNkZWZpbmUgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9UWF8wICAgICAgICAgICAgICAgICgweDNBKQorI2RlZmluZSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzEgICAgICAgICAgICAgICAgKDB4M0IpCisjZGVmaW5lIFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwCQkoMHg2MCkKKyNkZWZpbmUgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX1RYX1NPVVJDRTAJCSgweDcwKQorCisvKiBNYWNyb3MgZm9yIFBhY2tpbmcgUmVnaXN0ZXIgV3JpdGVzIGludG8gYSBVMzIgKi8KKyNkZWZpbmUgVE9NVE9NX1BBQ0tFRF9SRUdfU0laRSBzaXplb2YodTMyKQorCisjZGVmaW5lIFRPTVRPTV9DT0RFQ19QQUNLX0VOVFJZKHJlZywgbWFzaywgdmFsKSAoKHZhbCAmIDB4ZmYpfFwKKwkoKG1hc2sgJiAweGZmKSA8PCA4KXwoKHJlZyAmIDB4ZmZmZikgPDwgMTYpKQorI2RlZmluZSBUT01UT01fQ09ERUNfVU5QQUNLX0VOVFJZKHBhY2tlZCwgcmVnLCBtYXNrLCB2YWwpIFwKKwlkbyB7IFwKKwkJKChyZWcpID0gKChwYWNrZWQgPj4gMTYpICYgKDB4ZmZmZikpKTsgXAorCQkoKG1hc2spID0gKChwYWNrZWQgPj4gOCkgJiAoMHhmZikpKTsgXAorCQkoKHZhbCkgPSAoKHBhY2tlZCkgJiAoMHhmZikpKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVE9NVE9NX1NCX1BHRF9QT1JUX1RYX0JBU0UgICAgMHg1MAorI2RlZmluZSBUT01UT01fU0JfUEdEX1BPUlRfUlhfQkFTRSAgICAweDQwCisjZGVmaW5lIFdDRDkzMzBfTUFYX1JFR0lTVEVSIDB4M0ZGCitleHRlcm4gY29uc3QgdTggdG9tdG9tX3JlZ19yZWFkYWJsZVtXQ0Q5MzMwX01BWF9SRUdJU1RFUiArIDFdOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0MjhhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisKKyNpZm5kZWYgX19NRkRfV0NEOVhYWF9JUlFfSAorI2RlZmluZSBfX01GRF9XQ0Q5WFhYX0lSUV9ICitib29sIHdjZDl4eHhfbG9ja19zbGVlcChzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7Cit2b2lkIHdjZDl4eHhfdW5sb2NrX3NsZWVwKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKK3ZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2soc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpOwordm9pZCB3Y2Q5eHh4X25lc3RlZF9pcnFfdW5sb2NrKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKK2ludCB3Y2Q5eHh4X3JlcXVlc3RfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxLAorCQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKTsKKwordm9pZCB3Y2Q5eHh4X2ZyZWVfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAorCQkJaW50IGlycSwgdm9pZCAqZGF0YSk7Cit2b2lkIHdjZDl4eHhfZW5hYmxlX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSk7Cit2b2lkIHdjZDl4eHhfZGlzYWJsZV9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCisJCQlpbnQgaXJxKTsKK3ZvaWQgd2NkOXh4eF9kaXNhYmxlX2lycV9zeW5jKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAorCQkJaW50IGlycSk7CisKK2ludCB3Y2Q5eHh4X2lycV9pbml0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKK3ZvaWQgd2NkOXh4eF9pcnFfZXhpdChzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1zbGltc2xhdmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1zbGltc2xhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZkYjAwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXNsaW1zbGF2ZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fV0NEOTMxMF9TTElNU0xBVkVfSF8KKyNkZWZpbmUgX19XQ0Q5MzEwX1NMSU1TTEFWRV9IXworCisjaW5jbHVkZSA8bGludXgvc2xpbWJ1cy9zbGltYnVzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorCisKKy8qCisgKiAgY2xpZW50IGlzIGV4cGVjdGVkIHRvIGdpdmUgcG9ydCBpZHMgaW4gdGhlIHJhbmdlIG9mCisgKiAgMS0xMCBmb3IgcHJlIFRhaWtvIFR4IHBvcnRzIGFuZCAxLTE2IGZvciBUYWlrbworICogIDEtNyBmb3IgcHJlIFRhaWtvIFJ4IHBvcnRzIGFuZCAxLTE2IGZvciBUYWtvLAorICogIHdlIG5lZWQgdG8gYWRkIG9mZnNldCBmb3IgZ2V0dGluZyB0aGUgYWJzb2x1dGUgc2xhdmUKKyAqICBwb3J0IGlkIGJlZm9yZSBjb25maWd1cmluZyB0aGUgSFcKKyAqLworI2RlZmluZSBUQUJMQV9TQl9QR0RfTUFYX05VTUJFUl9PRl9UWF9TTEFWRV9ERVZfUE9SVFMgMTAKKyNkZWZpbmUgVEFJS09fU0JfUEdEX01BWF9OVU1CRVJfT0ZfVFhfU0xBVkVfREVWX1BPUlRTIDE2CisKKyNkZWZpbmUgU0xJTV9NQVhfVFhfUE9SVFMgVEFJS09fU0JfUEdEX01BWF9OVU1CRVJfT0ZfVFhfU0xBVkVfREVWX1BPUlRTCisKKyNkZWZpbmUgVEFCTEFfU0JfUEdEX09GRlNFVF9PRl9SWF9TTEFWRV9ERVZfUE9SVFMgXAorCVRBQkxBX1NCX1BHRF9NQVhfTlVNQkVSX09GX1RYX1NMQVZFX0RFVl9QT1JUUworI2RlZmluZSBUQUlLT19TQl9QR0RfT0ZGU0VUX09GX1JYX1NMQVZFX0RFVl9QT1JUUyBcCisJVEFJS09fU0JfUEdEX01BWF9OVU1CRVJfT0ZfVFhfU0xBVkVfREVWX1BPUlRTCisKKyNkZWZpbmUgVEFCTEFfU0JfUEdEX01BWF9OVU1CRVJfT0ZfUlhfU0xBVkVfREVWX1BPUlRTIDcKKyNkZWZpbmUgVEFJS09fU0JfUEdEX01BWF9OVU1CRVJfT0ZfUlhfU0xBVkVfREVWX1BPUlRTIDEzCisKKyNkZWZpbmUgU0xJTV9NQVhfUlhfUE9SVFMgVEFJS09fU0JfUEdEX01BWF9OVU1CRVJfT0ZfUlhfU0xBVkVfREVWX1BPUlRTCisKKyNkZWZpbmUgU0xJTV9NQVhfUkVHX0FERFIgKDB4MTgwICsgNCAqIChTTElNX01BWF9SWF9QT1JUUykpCisKKyNkZWZpbmUgVEFCTEFfU0JfUEdEX1JYX1BPUlRfTVVMVElfQ0hBTk5FTF8wX1NUQVJUX1BPUlRfSUQgXAorCVRBQkxBX1NCX1BHRF9PRkZTRVRfT0ZfUlhfU0xBVkVfREVWX1BPUlRTCisjZGVmaW5lIFRBSUtPX1NCX1BHRF9SWF9QT1JUX01VTFRJX0NIQU5ORUxfMF9TVEFSVF9QT1JUX0lEIFwKKwlUQUlLT19TQl9QR0RfT0ZGU0VUX09GX1JYX1NMQVZFX0RFVl9QT1JUUworCisjZGVmaW5lIFRBQkxBX1NCX1BHRF9SWF9QT1JUX01VTFRJX0NIQU5ORUxfMF9FTkRfUE9SVF9JRCAxNgorI2RlZmluZSBUQUlLT19TQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzBfRU5EX1BPUlRfSUQgMzEKKworI2RlZmluZSBUQUJMQV9TQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzFfRU5EX1BPUlRfSUQgOQorI2RlZmluZSBUQUlLT19TQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzFfRU5EX1BPUlRfSUQgMTUKKworLyogYmVsb3cgZGV0YWlscyBhcmUgdGFrZW4gZnJvbSBTTElNQlVTIHNsYXZlIFNXSSAqLworI2RlZmluZSBTQl9QR0RfUE9SVF9CQVNFIDB4MDAwCisKKyNkZWZpbmUgU0JfUEdEX1BPUlRfQ0ZHX0JZVEVfQUREUihvZmZzZXQsIHBvcnRfbnVtKSBcCisJCShTQl9QR0RfUE9SVF9CQVNFICsgb2Zmc2V0ICsgKDEgKiBwb3J0X251bSkpCisKKyNkZWZpbmUgU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8wKHBvcnRfbnVtKSBcCisJCShTQl9QR0RfUE9SVF9CQVNFICsgMHgxMDAgKyA0KnBvcnRfbnVtKQorI2RlZmluZSBTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzBfU1RBUlRfUE9SVF9JRCAgIDAKKyNkZWZpbmUgU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8wX0VORF9QT1JUX0lEICAgICA3CisKKyNkZWZpbmUgU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8xKHBvcnRfbnVtKSBcCisJCShTQl9QR0RfUE9SVF9CQVNFICsgMHgxMDEgKyA0KnBvcnRfbnVtKQorI2RlZmluZSBTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzFfU1RBUlRfUE9SVF9JRCAgIDgKKworI2RlZmluZSBTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAob2Zmc2V0LCBwb3J0X251bSkgXAorCQkoU0JfUEdEX1BPUlRfQkFTRSArIG9mZnNldCArICg0ICogcG9ydF9udW0pKQorCisvKiBzbGF2ZSBwb3J0IHdhdGVyIG1hcmsgbGV2ZWwKKyAqICAgKDA6IDZieXRlcywgMTogOWJ5dGVzLCAyOiAxMiBieXRlcywgMzogMTUgYnl0ZXMpCisgKi8KKyNkZWZpbmUgU0xBVkVfUE9SVF9XQVRFUl9NQVJLXzZCWVRFUyAgMAorI2RlZmluZSBTTEFWRV9QT1JUX1dBVEVSX01BUktfOUJZVEVTICAxCisjZGVmaW5lIFNMQVZFX1BPUlRfV0FURVJfTUFSS18xMkJZVEVTIDIKKyNkZWZpbmUgU0xBVkVfUE9SVF9XQVRFUl9NQVJLXzE1QllURVMgMworI2RlZmluZSBTTEFWRV9QT1JUX1dBVEVSX01BUktfU0hJRlQgMQorI2RlZmluZSBTTEFWRV9QT1JUX0VOQUJMRSAgICAgICAgICAgMQorI2RlZmluZSBTTEFWRV9QT1JUX0RJU0FCTEUgICAgICAgICAgMAorI2RlZmluZSBXQVRFUl9NQVJLX1ZBTCBcCisJKChTTEFWRV9QT1JUX1dBVEVSX01BUktfMTJCWVRFUyA8PCBTTEFWRV9QT1JUX1dBVEVSX01BUktfU0hJRlQpIHwgXAorCSAoU0xBVkVfUE9SVF9FTkFCTEUpKQorI2RlZmluZSBCQVNFX0NIX05VTSAxMjgKKworCitpbnQgd2NkOXh4eF9pbml0X3NsaW1zbGF2ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgIHU4IHdjZDl4eHhfcGdkX2xhLAorCQkJICAgdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCQkJICAgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KTsKKworaW50IHdjZDl4eHhfZGVpbml0X3NsaW1zbGF2ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCk7CisKK2ludCB3Y2Q5eHh4X2NmZ19zbGltX3NjaF9yeChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsCisJCQkgICAgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBiaXRfd2lkdGgsCisJCQkgICAgdTE2ICpncnBoKTsKK2ludCB3Y2Q5eHh4X2NmZ19zbGltX3NjaF90eChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsCisJCQkgICAgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBiaXRfd2lkdGgsCisJCQkJdTE2ICpncnBoKTsKK2ludCB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3J4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqd2NkOXh4eF9jaF9saXN0LCB1MTYgZ3JwaCk7CitpbnQgd2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwgdTE2IGdycGgpOworaW50IHdjZDl4eHhfZ2V0X2NoYW5uZWwoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQl1bnNpZ25lZCBpbnQgKnJ4X2NoLAorCQkJdW5zaWduZWQgaW50ICp0eF9jaCk7CitpbnQgd2NkOXh4eF9nZXRfc2xhdmVfcG9ydCh1bnNpZ25lZCBpbnQgY2hfbnVtKTsKK2ludCB3Y2Q5eHh4X2Rpc2Nvbm5lY3RfcG9ydChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsIHUxNiBncnBoKTsKK2ludCB3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24odTMyIHBvcnRfaWQsCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqY29kZWNfZGFpX2xpc3QpOworaW50IHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbih1MzIgdnRhYmxlLCB1MzIgcG9ydF9pZCwKKwkJCQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqY29kZWNfZGFpLAorCQkJCXUzMiBudW1fY29kZWNfZGFpcyk7CisjZW5kaWYgLyogX19XQ0Q5MzEwX1NMSU1TTEFWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXV0aWxzLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGFjMGFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXV0aWxzLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19XQ0Q5WFhYX1VUSUxTX0hfXworI2RlZmluZSBfX1dDRDlYWFhfVVRJTFNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKworc3RydWN0IHdjZDl4eHhfcGRhdGEgKndjZDl4eHhfcG9wdWxhdGVfZHRfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHdjZDl4eHhfYnJpbmd1cChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHdjZDl4eHhfYnJpbmdkb3duKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdHJ1Y3QgcmVnbWFwICp3Y2Q5eHh4X3JlZ21hcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKTsKK2ludCB3Y2Q5eHh4X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgd2NkOXh4eF9yZXNldF9sb3coc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCB3Y2Q5eHh4X2dldF9jb2RlY19pbmZvKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK3R5cGVkZWYgaW50ICgqY29kZWNfYnJpbmd1cF9mbikoc3RydWN0IHdjZDl4eHggKik7Cit0eXBlZGVmIGludCAoKmNvZGVjX2JyaW5nZG93bl9mbikoc3RydWN0IHdjZDl4eHggKik7Cit0eXBlZGVmIGludCAoKmNvZGVjX3R5cGVfZm4pKHN0cnVjdCB3Y2Q5eHh4ICosCisJCQkgICAgIHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKik7CisKKyNpZmRlZiBDT05GSUdfV0NEOTM0WF9DT0RFQworZXh0ZXJuIGludCB3Y2Q5MzR4X2JyaW5ndXAoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpOworZXh0ZXJuIGludCB3Y2Q5MzR4X2JyaW5nZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCk7CitleHRlcm4gaW50IHdjZDkzNHhfZ2V0X2NvZGVjX2luZm8oc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJICBzdHJ1Y3Qgd2NkOXh4eF9jb2RlY190eXBlICp3Y2RfdHlwZSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19XQ0Q5MzM1X0NPREVDCitleHRlcm4gaW50IHdjZDkzMzVfYnJpbmd1cChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCk7CitleHRlcm4gaW50IHdjZDkzMzVfYnJpbmdkb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KTsKK2V4dGVybiBpbnQgd2NkOTMzNV9nZXRfY29kZWNfaW5mbyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCQkgIHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKndjZF90eXBlKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dDRDkzMzBfQ09ERUMKK2V4dGVybiBpbnQgd2NkOTMzMF9icmluZ3VwKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KTsKK2V4dGVybiBpbnQgd2NkOTMzMF9icmluZ2Rvd24oc3RydWN0IHdjZDl4eHggKndjZDl4eHgpOworZXh0ZXJuIGludCB3Y2Q5MzMwX2dldF9jb2RlY19pbmZvKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJCSAgc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqd2NkX3R5cGUpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY29kZWNfYnJpbmdkb3duX2ZuIHdjZDl4eHhfYnJpbmdkb3duX2ZuKGludCB0eXBlKQoreworCWNvZGVjX2JyaW5nZG93bl9mbiBjZGNfYmRvd25fZm47CisKKwlzd2l0Y2ggKHR5cGUpIHsKKyNpZmRlZiBDT05GSUdfV0NEOTM0WF9DT0RFQworCWNhc2UgV0NEOTM0WDoKKwkJY2RjX2Jkb3duX2ZuID0gd2NkOTM0eF9icmluZ2Rvd247CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1dDRDkzMzVfQ09ERUMKKwljYXNlIFdDRDkzMzU6CisJCWNkY19iZG93bl9mbiA9IHdjZDkzMzVfYnJpbmdkb3duOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQ0Q5MzMwX0NPREVDCisJY2FzZSBXQ0Q5MzMwOgorCQljZGNfYmRvd25fZm4gPSB3Y2Q5MzMwX2JyaW5nZG93bjsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQljZGNfYmRvd25fZm4gPSBOVUxMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2RjX2Jkb3duX2ZuOworfQorCitzdGF0aWMgaW5saW5lIGNvZGVjX2JyaW5ndXBfZm4gd2NkOXh4eF9icmluZ3VwX2ZuKGludCB0eXBlKQoreworCWNvZGVjX2JyaW5ndXBfZm4gY2RjX2J1cF9mbjsKKworCXN3aXRjaCAodHlwZSkgeworI2lmZGVmIENPTkZJR19XQ0Q5MzRYX0NPREVDCisJY2FzZSBXQ0Q5MzRYOgorCQljZGNfYnVwX2ZuID0gd2NkOTM0eF9icmluZ3VwOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQ0Q5MzM1X0NPREVDCisJY2FzZSBXQ0Q5MzM1OgorCQljZGNfYnVwX2ZuID0gd2NkOTMzNV9icmluZ3VwOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQ0Q5MzMwX0NPREVDCisJY2FzZSBXQ0Q5MzMwOgorCQljZGNfYnVwX2ZuID0gd2NkOTMzMF9icmluZ3VwOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWNkY19idXBfZm4gPSBOVUxMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2RjX2J1cF9mbjsKK30KKworc3RhdGljIGlubGluZSBjb2RlY190eXBlX2ZuIHdjZDl4eHhfZ2V0X2NvZGVjX2luZm9fZm4oaW50IHR5cGUpCit7CisJY29kZWNfdHlwZV9mbiBjZGNfdHlwZV9mbjsKKworCXN3aXRjaCAodHlwZSkgeworI2lmZGVmIENPTkZJR19XQ0Q5MzRYX0NPREVDCisJY2FzZSBXQ0Q5MzRYOgorCQljZGNfdHlwZV9mbiA9IHdjZDkzNHhfZ2V0X2NvZGVjX2luZm87CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1dDRDkzMzVfQ09ERUMKKwljYXNlIFdDRDkzMzU6CisJCWNkY190eXBlX2ZuID0gd2NkOTMzNV9nZXRfY29kZWNfaW5mbzsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfV0NEOTMzMF9DT0RFQworCWNhc2UgV0NEOTMzMDoKKwkJY2RjX3R5cGVfZm4gPSB3Y2Q5MzMwX2dldF9jb2RlY19pbmZvOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWNkY190eXBlX2ZuID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNkY190eXBlX2ZuOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zbV9hdWRpb19pb24uaCBiL2luY2x1ZGUvbGludXgvbXNtX2F1ZGlvX2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjFiODgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21zbV9hdWRpb19pb24uaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfTElOVVhfTVNNX0FVRElPX0lPTl9ICisjZGVmaW5lIF9MSU5VWF9NU01fQVVESU9fSU9OX0gKKyNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKworCitpbnQgbXNtX2F1ZGlvX2lvbl9hbGxvYyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW9uX2NsaWVudCAqKmNsaWVudCwKKwkJCXN0cnVjdCBpb25faGFuZGxlICoqaGFuZGxlLCBzaXplX3QgYnVmc3osCisJCQlpb25fcGh5c19hZGRyX3QgKnBhZGRyLCBzaXplX3QgKnBhX2xlbiwgdm9pZCAqKnZhZGRyKTsKKworaW50IG1zbV9hdWRpb19pb25faW1wb3J0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpb25fY2xpZW50ICoqY2xpZW50LAorCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKKwkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKKwkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpOworaW50IG1zbV9hdWRpb19pb25fZnJlZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKTsKK2ludCBtc21fYXVkaW9faW9uX21tYXAoc3RydWN0IGF1ZGlvX2J1ZmZlciAqc3Vic3RyZWFtLAorCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCitib29sIG1zbV9hdWRpb19pb25faXNfc21tdV9hdmFpbGFibGUodm9pZCk7CitpbnQgbXNtX2F1ZGlvX2lvbl9jYWNoZV9vcGVyYXRpb25zKHN0cnVjdCBhdWRpb19idWZmZXIgKmFidWZmLCBpbnQgY2FjaGVfb3ApOworCitzdHJ1Y3QgaW9uX2NsaWVudCAqbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBtc21fYXVkaW9faW9uX2NsaWVudF9kZXN0cm95KHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQpOworaW50IG1zbV9hdWRpb19pb25faW1wb3J0X2xlZ2FjeShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKKwkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKKwkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpOworaW50IG1zbV9hdWRpb19pb25fZnJlZV9sZWdhY3koc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOwordTMyIG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGlvbl9waHlzX2FkZHJfdCBwYSk7CisjZW5kaWYgLyogX0xJTlVYX01TTV9BVURJT19JT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwci5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZGViM2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfX0FQUl9IXworI2RlZmluZSBfX0FQUl9IXworCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fbm90aWYuaD4KKworZW51bSBhcHJfc3Vic3lzX3N0YXRlIHsKKwlBUFJfU1VCU1lTX0RPV04sCisJQVBSX1NVQlNZU19VUCwKKwlBUFJfU1VCU1lTX0xPQURFRCwKK307CisKK3N0cnVjdCBhcHJfcTYgeworCXZvaWQgKnBpbDsKKwlhdG9taWNfdCBxNl9zdGF0ZTsKKwlhdG9taWNfdCBtb2RlbV9zdGF0ZTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKK3N0cnVjdCBhcHJfaGRyIHsKKwl1aW50MTZfdCBoZHJfZmllbGQ7CisJdWludDE2X3QgcGt0X3NpemU7CisJdWludDhfdCBzcmNfc3ZjOworCXVpbnQ4X3Qgc3JjX2RvbWFpbjsKKwl1aW50MTZfdCBzcmNfcG9ydDsKKwl1aW50OF90IGRlc3Rfc3ZjOworCXVpbnQ4X3QgZGVzdF9kb21haW47CisJdWludDE2X3QgZGVzdF9wb3J0OworCXVpbnQzMl90IHRva2VuOworCXVpbnQzMl90IG9wY29kZTsKK307CisKKyNkZWZpbmUgQVBSX0hEUl9MRU4oaGRyX2xlbikgKChoZHJfbGVuKS80KQorI2RlZmluZSBBUFJfUEtUX1NJWkUoaGRyX2xlbiwgcGF5bG9hZF9sZW4pICgoaGRyX2xlbikgKyAocGF5bG9hZF9sZW4pKQorI2RlZmluZSBBUFJfSERSX0ZJRUxEKG1zZ190eXBlLCBoZHJfbGVuLCB2ZXIpXAorCSgoKG1zZ190eXBlICYgMHgzKSA8PCA4KSB8ICgoaGRyX2xlbiAmIDB4RikgPDwgNCkgfCAodmVyICYgMHhGKSkKKworI2RlZmluZSBBUFJfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKQorCisvKiBWZXJzaW9uICovCisjZGVmaW5lIEFQUl9QS1RfVkVSCQkweDAKKworLyogQ29tbWFuZCBhbmQgUmVzcG9uc2UgVHlwZXMgKi8KKyNkZWZpbmUgQVBSX01TR19UWVBFX0VWRU5UCTB4MAorI2RlZmluZSBBUFJfTVNHX1RZUEVfQ01EX1JTUAkweDEKKyNkZWZpbmUgQVBSX01TR19UWVBFX1NFUV9DTUQJMHgyCisjZGVmaW5lIEFQUl9NU0dfVFlQRV9OU0VRX0NNRAkweDMKKyNkZWZpbmUgQVBSX01TR19UWVBFX01BWAkweDA0CisKKy8qIEFQUiBCYXNpYyBSZXNwb25zZSBNZXNzYWdlICovCisjZGVmaW5lIEFQUl9CQVNJQ19SU1BfUkVTVUxUIDB4MDAwMTEwRTgKKyNkZWZpbmUgQVBSX1JTUF9BQ0NFUFRFRCAgICAgMHgwMDAxMDBCRQorCisvKiBEb21haW4gSURzICovCisjZGVmaW5lIEFQUl9ET01BSU5fU0lNCTB4MQorI2RlZmluZSBBUFJfRE9NQUlOX1BDCQkweDIKKyNkZWZpbmUgQVBSX0RPTUFJTl9NT0RFTQkweDMKKyNkZWZpbmUgQVBSX0RPTUFJTl9BRFNQCTB4NAorI2RlZmluZSBBUFJfRE9NQUlOX0FQUFMJMHg1CisjZGVmaW5lIEFQUl9ET01BSU5fTUFYCTB4NgorCisvKiBBRFNQIHNlcnZpY2UgSURzICovCisjZGVmaW5lIEFQUl9TVkNfVEVTVF9DTElFTlQgICAgIDB4MgorI2RlZmluZSBBUFJfU1ZDX0FEU1BfQ09SRQkweDMKKyNkZWZpbmUgQVBSX1NWQ19BRkUJCTB4NAorI2RlZmluZSBBUFJfU1ZDX1ZTTQkJMHg1CisjZGVmaW5lIEFQUl9TVkNfVlBNCQkweDYKKyNkZWZpbmUgQVBSX1NWQ19BU00JCTB4NworI2RlZmluZSBBUFJfU1ZDX0FETQkJMHg4CisjZGVmaW5lIEFQUl9TVkNfQURTUF9NVk0JMHgwOQorI2RlZmluZSBBUFJfU1ZDX0FEU1BfQ1ZTCTB4MEEKKyNkZWZpbmUgQVBSX1NWQ19BRFNQX0NWUAkweDBCCisjZGVmaW5lIEFQUl9TVkNfVVNNCQkweDBDCisjZGVmaW5lIEFQUl9TVkNfTFNNCQkweDBECisjZGVmaW5lIEFQUl9TVkNfVklEQwkJMHgxNgorI2RlZmluZSBBUFJfU1ZDX01BWAkJMHgxNworCisvKiBNb2RlbSBTZXJ2aWNlIElEcyAqLworI2RlZmluZSBBUFJfU1ZDX01WUwkJMHgzCisjZGVmaW5lIEFQUl9TVkNfTVZNCQkweDQKKyNkZWZpbmUgQVBSX1NWQ19DVlMJCTB4NQorI2RlZmluZSBBUFJfU1ZDX0NWUAkJMHg2CisjZGVmaW5lIEFQUl9TVkNfU1JECQkweDcKKworLyogQVBSIFBvcnQgSURzICovCisjZGVmaW5lIEFQUl9NQVhfUE9SVFMJCTB4ODAKKworI2RlZmluZSBBUFJfTkFNRV9NQVgJCTB4NDAKKworI2RlZmluZSBSRVNFVF9FVkVOVFMJCTB4MDAwMTMwRDcKKworI2RlZmluZSBMUEFTU19SRVNUQVJUX0VWRU5UCTB4MTAwMAorI2RlZmluZSBMUEFTU19SRVNUQVJUX1JFQURZCTB4MTAwMQorCitzdHJ1Y3QgYXByX2NsaWVudF9kYXRhIHsKKwl1aW50MTZfdCByZXNldF9ldmVudDsKKwl1aW50MTZfdCByZXNldF9wcm9jOworCXVpbnQxNl90IHBheWxvYWRfc2l6ZTsKKwl1aW50MTZfdCBoZHJfbGVuOworCXVpbnQxNl90IG1zZ190eXBlOworCXVpbnQxNl90IHNyYzsKKwl1aW50MTZfdCBkZXN0X3N2YzsKKwl1aW50MTZfdCBzcmNfcG9ydDsKKwl1aW50MTZfdCBkZXN0X3BvcnQ7CisJdWludDMyX3QgdG9rZW47CisJdWludDMyX3Qgb3Bjb2RlOworCXZvaWQgKnBheWxvYWQ7Cit9OworCit0eXBlZGVmIGludDMyX3QgKCphcHJfZm4pKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOworCitzdHJ1Y3QgYXByX3N2YyB7CisJdWludDE2X3QgaWQ7CisJdWludDE2X3QgZGVzdF9pZDsKKwl1aW50MTZfdCBjbGllbnRfaWQ7CisJdWludDE2X3QgZGVzdF9kb21haW47CisJdWludDhfdCBydmQ7CisJdWludDhfdCBwb3J0X2NudDsKKwl1aW50OF90IHN2Y19jbnQ7CisJdWludDhfdCBuZWVkX3Jlc2V0OworCWFwcl9mbiBwb3J0X2ZuW0FQUl9NQVhfUE9SVFNdOworCXZvaWQgKnBvcnRfcHJpdltBUFJfTUFYX1BPUlRTXTsKKwlhcHJfZm4gZm47CisJdm9pZCAqcHJpdjsKKwlzdHJ1Y3QgbXV0ZXggbV9sb2NrOworCXNwaW5sb2NrX3Qgd19sb2NrOworCXVpbnQ4X3QgcGt0X293bmVyOworfTsKKworc3RydWN0IGFwcl9jbGllbnQgeworCXVpbnQ4X3QgaWQ7CisJdWludDhfdCBzdmNfY250OworCXVpbnQ4X3QgcnZkOworCXN0cnVjdCBtdXRleCBtX2xvY2s7CisJc3RydWN0IGFwcl9zdmNfY2hfZGV2ICpoYW5kbGU7CisJc3RydWN0IGFwcl9zdmMgc3ZjW0FQUl9TVkNfTUFYXTsKK307CisKK3N0cnVjdCBhcHJfcnhfaW50ZW50cyB7CisJaW50IG51bV9vZl9pbnRlbnRzOworCXVpbnQzMl90IHNpemU7Cit9OworCitzdHJ1Y3QgYXByX3BrdF9jZmcgeworCXVpbnQ4X3QgcGt0X293bmVyOworCXN0cnVjdCBhcHJfcnhfaW50ZW50cyBpbnRlbnRzOworfTsKKworaW50IGFwcl9sb2FkX2Fkc3BfaW1hZ2Uodm9pZCk7CitzdHJ1Y3QgYXByX2NsaWVudCAqYXByX2dldF9jbGllbnQoaW50IGRlc3RfaWQsIGludCBjbGllbnRfaWQpOworaW50IGFwcl93YWl0X2Zvcl9kZXZpY2VfdXAoaW50IGRlc3RfaWQpOworaW50IGFwcl9nZXRfc3ZjKGNvbnN0IGNoYXIgKnN2Y19uYW1lLCBpbnQgZGVzdF9pZCwgaW50ICpjbGllbnRfaWQsCisJCWludCAqc3ZjX2lkeCwgaW50ICpzdmNfaWQpOwordm9pZCBhcHJfY2JfZnVuYyh2b2lkICpidWYsIGludCBsZW4sIHZvaWQgKnByaXYpOworc3RydWN0IGFwcl9zdmMgKmFwcl9yZWdpc3RlcihjaGFyICpkZXN0LCBjaGFyICpzdmNfbmFtZSwgYXByX2ZuIHN2Y19mbiwKKwkJCQkJdWludDMyX3Qgc3JjX3BvcnQsIHZvaWQgKnByaXYpOworaW5saW5lIGludCBhcHJfZmlsbF9oZHIodm9pZCAqaGFuZGxlLCB1aW50MzJfdCAqYnVmLCB1aW50MTZfdCBzcmNfcG9ydCwKKwkJCXVpbnQxNl90IG1zZ190eXBlLCB1aW50MTZfdCBkZXN0X3BvcnQsCisJCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3Qgb3Bjb2RlLCB1aW50MTZfdCBsZW4pOworCitpbnQgYXByX3NlbmRfcGt0KHZvaWQgKmhhbmRsZSwgdWludDMyX3QgKmJ1Zik7CitpbnQgYXByX2RlcmVnaXN0ZXIodm9pZCAqaGFuZGxlKTsKK3ZvaWQgc3Vic3lzX25vdGlmX3JlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lLCBpbnQgZG9tYWluLAorCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitpbnQgYXByX2dldF9kZXN0X2lkKGNoYXIgKmRlc3QpOwordWludDE2X3QgYXByX2dldF9kYXRhX3NyYyhzdHJ1Y3QgYXByX2hkciAqaGRyKTsKK3ZvaWQgY2hhbmdlX3E2X3N0YXRlKGludCBzdGF0ZSk7Cit2b2lkIHE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKHZvaWQpOwordm9pZCBhcHJfcmVzZXQodm9pZCAqaGFuZGxlKTsKK2VudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfZ2V0X3N1YnN5c19zdGF0ZSh2b2lkKTsKK2VudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfZ2V0X21vZGVtX3N0YXRlKHZvaWQpOwordm9pZCBhcHJfc2V0X21vZGVtX3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSk7CitlbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9xNl9zdGF0ZSh2b2lkKTsKK2ludCBhcHJfc2V0X3E2X3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSk7Cit2b2lkIGFwcl9zZXRfc3Vic3lzX3N0YXRlKHZvaWQpOworY29uc3QgY2hhciAqYXByX2dldF9scGFzc19zdWJzeXNfbmFtZSh2b2lkKTsKK3VpbnQxNl90IGFwcl9nZXRfcmVzZXRfZG9tYWluKHVpbnQxNl90IHByb2MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByX3RhbC5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl90YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmM5NzdmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl90YWwuaApAQCAtMCwwICsxLDEwOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfX0FQUl9UQUxfSF8KKyNkZWZpbmUgX19BUFJfVEFMX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisvKiBBUFIgQ2xpZW50IElEcyAqLworI2RlZmluZSBBUFJfQ0xJRU5UX0FVRElPCTB4MAorI2RlZmluZSBBUFJfQ0xJRU5UX1ZPSUNFCTB4MQorI2RlZmluZSBBUFJfQ0xJRU5UX01BWAkJMHgyCisKKyNkZWZpbmUgQVBSX0RMX1NNRCAgICAwCisjZGVmaW5lIEFQUl9ETF9NQVggICAgMQorCisjZGVmaW5lIEFQUl9ERVNUX01PREVNIDAKKyNkZWZpbmUgQVBSX0RFU1RfUURTUDYgMQorI2RlZmluZSBBUFJfREVTVF9NQVggICAyCisKKyNpZiBkZWZpbmVkKENPTkZJR19NU01fUURTUDZfQVBSVjJfR0xJTkspIHx8IFwKKwlkZWZpbmVkKENPTkZJR19NU01fUURTUDZfQVBSVjNfR0xJTkspCisjZGVmaW5lIEFQUl9NQVhfQlVGCQkJNTEyCisjZGVmaW5lIEFQUl9OVU1fT0ZfVFhfQlVGCQkzMAorI2Vsc2UKKyNkZWZpbmUgQVBSX01BWF9CVUYJCQk4MDkyCisjZW5kaWYKKworI2RlZmluZSBBUFJfREVGQVVMVF9OVU1fT0ZfSU5URU5UUyAyMAorCisjZGVmaW5lIEFQUl9PUEVOX1RJTUVPVVRfTVMgNTAwMAorCitlbnVtIHsKKwkvKiBJZiBjbGllbnQgc2V0cyB0aGUgcGt0X293bmVyIHRvIEFQUl9QS1RfT1dORVJfRFJJVkVSLCBBUFIKKwkgKiBkcml2ZXIgd2lsbCBhbGxvY2F0ZSBhIGJ1ZmZlciwgd2hlcmUgdGhlIHVzZXIgcGFja2V0IGlzCisJICogY29waWVkIGludG8sIGZvciBlYWNoIGFuZCBldmVyeSBzaW5nbGUgVHggdHJhbnNtaXNzaW9uLgorCSAqIFRoZSBidWZmZXIgaXMgdGhlcmVhZnRlciBwYXNzZWQgdG8gdW5kZXJseWluZyBsaW5rIGxheWVyCisJICogYW5kIGZyZWVkIHVwb24gdGhlIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tIHRoZSBsaW5rIGxheWVyCisJICogdGhhdCB0aGUgcGFja2V0IGhhcyBiZWVuIGNvbnN1bWVkLgorCSAqLworCUFQUl9QS1RfT1dORVJfRFJJVkVSLAorCS8qIElmIGNsaWVudCBzZXRzIHRoZSBwa3Rfb3duZXIgdG8gQVBSX1BLVF9PV05FUl9DTElFTlQsIEFQUgorCSAqIHdpbGwgcGFzcyB0aGUgdXNlciBwYWNrZXQgbWVtb3J5IGFkZHJlc3MgZGlyZWN0bHkgdG8gdW5kZXJseWluZworCSAqIGxpbmsgbGF5ZXIuIEluIHRoaXMgY2FzZSBpdCBpcyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8KKwkgKiBtYWtlIHN1cmUgdGhlIHBhY2tldCBpcyBpbnRhY3QgdW50aWwgYmVpbmcgbm90aWZpZWQgdGhhdCB0aGUKKwkgKiBwYWNrZXQgaGFzIGJlZW4gY29uc3VtZWQuCisJICovCisJQVBSX1BLVF9PV05FUl9DTElFTlQsCit9OworCitzdHJ1Y3QgYXByX3BrdF9wcml2IHsKKwkvKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgQVBSIG92ZXIgR2xpbmsuCisJICogSXQgaXMgaWdub3JlZCBpbiBBUFIgb3ZlciBTTUQgY2FzZXMuCisJICovCisJdWludDhfdCBwa3Rfb3duZXI7Cit9OworCit0eXBlZGVmIHZvaWQgKCphcHJfc3ZjX2NiX2ZuKSh2b2lkICpidWYsIGludCBsZW4sIHZvaWQgKnByaXYpOworc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfdGFsX29wZW4odWludDMyX3Qgc3ZjLCB1aW50MzJfdCBkZXN0LAorCQkJdWludDMyX3QgZGwsIGFwcl9zdmNfY2JfZm4gZnVuYywgdm9pZCAqcHJpdik7CitpbnQgYXByX3RhbF93cml0ZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGFwcl9wa3RfcHJpdiAqcGt0X3ByaXYsIGludCBsZW4pOworaW50IGFwcl90YWxfY2xvc2Uoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gpOworaW50IGFwcl90YWxfcnhfaW50ZW50c19jb25maWcoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gsCisJCWludCBudW1fb2ZfaW50ZW50cywgdWludDMyX3Qgc2l6ZSk7CisKKworI2lmIGRlZmluZWQoQ09ORklHX01TTV9RRFNQNl9BUFJWMl9HTElOSykgfHwgXAorCSBkZWZpbmVkKENPTkZJR19NU01fUURTUDZfQVBSVjNfR0xJTkspCitzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgeworCXZvaWQgICAgICAgICAgICAgICAqaGFuZGxlOworCXNwaW5sb2NrX3QgICAgICAgICB3X2xvY2s7CisJc3BpbmxvY2tfdCAgICAgICAgIHJfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgbV9sb2NrOworCWFwcl9zdmNfY2JfZm4gICAgICBmdW5jOworCXdhaXRfcXVldWVfaGVhZF90ICB3YWl0OworCXZvaWQgICAgICAgICAgICAgICAqcHJpdjsKKwl1bnNpZ25lZCBpbnQgICAgICAgY2hhbm5lbF9zdGF0ZTsKKwlib29sICAgICAgICAgICAgICAgaWZfcmVtb3RlX2ludGVudF9yZWFkeTsKK307CisjZWxzZQorc3RydWN0IGFwcl9zdmNfY2hfZGV2IHsKKwlzdHJ1Y3Qgc21kX2NoYW5uZWwgKmNoOworCXNwaW5sb2NrX3QgICAgICAgICBsb2NrOworCXNwaW5sb2NrX3QgICAgICAgICB3X2xvY2s7CisJc3RydWN0IG11dGV4ICAgICAgIG1fbG9jazsKKwlhcHJfc3ZjX2NiX2ZuICAgICAgZnVuYzsKKwljaGFyICAgICAgICAgICAgICAgZGF0YVtBUFJfTUFYX0JVRl07CisJd2FpdF9xdWV1ZV9oZWFkX3QgIHdhaXQ7CisJdm9pZCAgICAgICAgICAgICAgICpwcml2OworCXVpbnQzMl90ICAgICAgICAgICBzbWRfc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgIGRlc3Q7CisJdWludDMyX3QgICAgICAgICAgIGRlc3Rfc3RhdGU7Cit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl91cy5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl91cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjgwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByX3VzLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfX0FQUl9VU19IX18KKyNkZWZpbmUgX19BUFJfVVNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIFNlc3Npb24gTGV2ZWwgY29tbWFuZHMgKi8KKworI2RlZmluZSBVU01fU0VTU0lPTl9DTURfUlVOCQkJCTB4MDAwMTIzMDYKK3N0cnVjdCB1c21fc3RyZWFtX2NtZF9ydW4geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBmbGFnczsKKwl1MzIgICAgICAgICAgICBtc3dfdHM7CisJdTMyICAgICAgICAgICAgbHN3X3RzOworfSBfX3BhY2tlZDsKKworLyogU3RyZWFtIGxldmVsIGNvbW1hbmRzICovCisjZGVmaW5lIFVTTV9TVFJFQU1fQ01EX09QRU5fUkVBRAkJCTB4MDAwMTIzMDkKK3N0cnVjdCB1c21fc3RyZWFtX2NtZF9vcGVuX3JlYWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICB1TW9kZTsKKwl1MzIgICAgICAgICAgICBzcmNfZW5kcG9pbnQ7CisJdTMyICAgICAgICAgICAgcHJlX3Byb2NfdG9wOworCXUzMiAgICAgICAgICAgIGZvcm1hdDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgVVNNX1NUUkVBTV9DTURfT1BFTl9XUklURQkJCTB4MDAwMTEyNzEKK3N0cnVjdCB1c21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgZm9ybWF0OworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIFVTTV9TVFJFQU1fQ01EX0NMT1NFCQkJCTB4MDAwMTIzMEEKKworI2RlZmluZSBVU01fU1RSRUFNX0NNRF9TRVRfUEFSQU0JCQkweDAwMDEyNzMxCitzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfc2V0X3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgYnVmX2FkZHJfbHN3OworCXUzMiAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKKwl1MzIgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKwl1MzIgICAgICAgICAgICBidWZfc2l6ZTsKKwl1MzIgICAgICAgICAgICBtb2R1bGVfaWQ7CisJdTMyICAgICAgICAgICAgcGFyYW1faWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFVTTV9TVFJFQU1fQ01EX0dFVF9QQVJBTQkJCTB4MDAwMTI3MzIKK3N0cnVjdCB1c21fc3RyZWFtX2NtZF9nZXRfcGFyYW0geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisJdTMyICAgICAgICAgICAgYnVmX2FkZHJfbXN3OworCXUzMiAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworCXUzMiAgICAgICAgICAgIGJ1Zl9zaXplOworCXUzMiAgICAgICAgICAgIG1vZHVsZV9pZDsKKwl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKK30gX19wYWNrZWQ7CisKKy8qIEVuY29kZXIgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBVU01fU1RSRUFNX0NNRF9TRVRfRU5DX1BBUkFNCQkJMHgwMDAxMjMwQgorLyogRGVjb2RlciBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lIFVTTV9EQVRBX0NNRF9NRURJQV9GT1JNQVRfVVBEQVRFCQkweDAwMDExMjcyCisKKy8qIEVuY29kZXIvZGVjb2RlciBjb25maWd1cmF0aW9uIGJsb2NrICovCisjZGVmaW5lIFVTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEsJCQkweDAwMDEyMzBECisKKy8qIE1heCBudW1iZXIgb2Ygc3RhdGljIGxvY2F0ZWQgcG9ydHMgKGJ5dGVzKSAqLworI2RlZmluZSBVU01fTUFYX1BPUlRfTlVNQkVSIDgKKworLyogTWF4IG51bWJlciBvZiBzdGF0aWMgbG9jYXRlZCB0cmFuc3BhcmVudCBkYXRhIChieXRlcykgKi8KKyNkZWZpbmUgVVNNX01BWF9DRkdfREFUQV9TSVpFIDEwMAorCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlcyB1c2VkIGluICBVU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQgKi8KKy8qIGNvbW1vbiBkZWNsYXJhdGlvbnMgKi8KK3N0cnVjdCB1c21fY2ZnX2NvbW1vbiB7CisJdTE2IGNoX2NmZzsKKwl1MTYgYml0c19wZXJfc2FtcGxlOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgZGV2X2lkOworCXU4IGRhdGFfbWFwW1VTTV9NQVhfUE9SVF9OVU1CRVJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHVzX2VuY2RlY19jZmcgeworCXUzMiBmb3JtYXRfaWQ7CisJc3RydWN0IHVzbV9jZmdfY29tbW9uIGNmZ19jb21tb247CisJdTE2IHBhcmFtc19zaXplOworCXU4ICpwYXJhbXM7Cit9IF9fcGFja2VkOworCisvKiBTdGFydC9zdG9wIFVTIHNpZ25hbCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVVNNX1NFU1NJT05fQ01EX1NJR05BTF9ERVRFQ1RfTU9ERQkJMHgwMDAxMjcxOQorCitzdHJ1Y3QgdXNtX3Nlc3Npb25fY21kX2RldGVjdF9pbmZvIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyIGRldGVjdF9tb2RlOworCXUzMiBza2lwX2ludGVydmFsOworCXUzMiBhbGdvcml0aG1fY2ZnX3NpemU7Cit9IF9fcGFja2VkOworCisvKiBVUyBzaWduYWwgZGV0ZWN0aW9uIHJlc3VsdCAqLworI2RlZmluZSBVU01fU0VTU0lPTl9FVkVOVF9TSUdOQUxfREVURUNUX1JFU1VMVAkJMHgwMDAxMjcyMAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIFNlc3Npb24gTGV2ZWwgY29tbWFuZHMgKi8KKyNkZWZpbmUgVVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT04JCTB4MDAwMTI3MjgKK3N0cnVjdCB1c21fY21kX21lbW9yeV9tYXBfcmVnaW9uIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgbWVtcG9vbF9pZDsKKwl1MTYgICAgICAgICAgICBudW1fcmVnaW9uczsKKwl1MzIgICAgICAgICAgICBmbGFnczsKKwl1MzIgICAgICAgICAgICBzaG1fYWRkcl9sc3c7CisJdTMyICAgICAgICAgICAgc2htX2FkZHJfbXN3OworCXUzMiAgICAgICAgICAgIG1lbV9zaXplX2J5dGVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBVU01fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTgkweDAwMDEyNzI5CitzdHJ1Y3QgdXNtX2NtZHJzcF9tZW1vcnlfbWFwX3JlZ2lvbiB7CisJdTMyICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFVTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT04gICAgICAgICAweDAwMDEyNzJBCitzdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfdW5tYXBfcmVnaW9uIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFVTTV9EQVRBX0NNRF9SRUFECQkJMHgwMDAxMjcyNAorc3RydWN0IHVzbV9zdHJlYW1fY21kX3JlYWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisJdTMyICAgICAgICAgICAgYnVmX2FkZHJfbXN3OworCXUzMiAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworCXUzMiAgICAgICAgICAgIGJ1Zl9zaXplOworCXUzMiAgICAgICAgICAgIHNlcV9pZDsKKwl1MzIgICAgICAgICAgICBjb3VudGVyOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBVU01fREFUQV9FVkVOVF9SRUFEX0RPTkUJCTB4MDAwMTI3MjUKKworI2RlZmluZSBVU01fREFUQV9DTURfV1JJVEUJCQkweDAwMDEyNzI2CitzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfd3JpdGUgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisJdTMyICAgICAgICAgICAgYnVmX2FkZHJfbXN3OworCXUzMiAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworCXUzMiAgICAgICAgICAgIGJ1Zl9zaXplOworCXUzMiAgICAgICAgICAgIHNlcV9pZDsKKwl1MzIgICAgICAgICAgICByZXMwOworCXUzMiAgICAgICAgICAgIHJlczE7CisJdTMyICAgICAgICAgICAgcmVzMjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgVVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORQkJMHgwMDAxMjcyNworCitzdHJ1Y3QgdXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfdXBkYXRlIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyIGZvcm1hdF9pZDsKKwkvKiA8Y2ZnX3NpemU+ID0gc2l6ZW9mKHVzbV9jZmdfY29tbW9uKSt8dHJhbnNwX2RhdGF8ICovCisJdTMyIGNmZ19zaXplOworCXN0cnVjdCB1c21fY2ZnX2NvbW1vbiBjZmdfY29tbW9uOworCS8qIFRyYW5zcGFyZW50IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3Igc3BlY2lmaWMgZW5jb2RlciAqLworCXU4ICB0cmFuc3BfZGF0YVtVU01fTUFYX0NGR19EQVRBX1NJWkVdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHVzbV9lbmNvZGVfY2ZnX2JsayB7CisJdTMyIGZyYW1lc19wZXJfYnVmOworCXUzMiBmb3JtYXRfaWQ7CisJLyogPGNmZ19zaXplPiA9IHNpemVvZih1c21fY2ZnX2NvbW1vbikrfHRyYW5zcF9kYXRhfCAqLworCXUzMiBjZmdfc2l6ZTsKKwlzdHJ1Y3QgdXNtX2NmZ19jb21tb24gY2ZnX2NvbW1vbjsKKwkvKiBUcmFuc3BhcmVudCBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHNwZWNpZmljIGVuY29kZXIgKi8KKwl1OCAgdHJhbnNwX2RhdGFbVVNNX01BWF9DRkdfREFUQV9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB1c21fc3RyZWFtX2NtZF9lbmNkZWNfY2ZnX2JsayB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiBwYXJhbV9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKKwlzdHJ1Y3QgdXNtX2VuY29kZV9jZmdfYmxrIGVuY19ibGs7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19BUFJfVVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaCBiL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODdiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fQVVESU9fTk9USUZJRVJfSF8KKyNkZWZpbmUgX19BVURJT19OT1RJRklFUl9IXworCisvKiBTdGF0ZSBvZiB0aGUgbm90aWZpZXIgZG9tYWluICovCitlbnVtIHsKKwlBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV04sCisJQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUAorfTsKKworLyogU2VydmljZSBvcmRlciBkZXRlcm1pbmVzIGNvbm5lY3Rpb24gcHJpb3JpdHkKKyAqIEhpZ2hlc3QgbnVtYmVyIGNvbm5lY3RlZCBmaXJzdAorICovCitlbnVtIHsKKwlBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRSwKKwlBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRSwKKwlBVURJT19OT1RJRklFUl9NQVhfU0VSVklDRVMKK307CisKK2VudW0geworCUFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOLAorCUFVRElPX05PVElGSUVSX01PREVNX0RPTUFJTiwKKwlBVURJT19OT1RJRklFUl9NQVhfRE9NQUlOUworfTsKKworLyogU3RydWN0dXJlIHBvcHVsYXRlZCBpbiB2b2lkICpkYXRhIG9mIG5iIGZ1bmN0aW9uCisgKiBjYWxsYmFjayB1c2VkIGZvciBhdWRpb19ub3RpZmllcl9yZWdpc3RlcgorICovCitzdHJ1Y3QgYXVkaW9fbm90aWZpZXJfY2JfZGF0YSB7CisJaW50IHNlcnZpY2U7CisJaW50IGRvbWFpbjsKK307CisKKyNpZmRlZiBDT05GSUdfTVNNX1FEU1A2X05PVElGSUVSCisKKy8qCisgKiBVc2UgYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgYW55IGF1ZGlvCisgKiBjbGllbnRzIHdobyBuZWVkIHRvIGJlIG5vdGlmaWVkIG9mIGEgcmVtb3RlIHByb2Nlc3MuCisgKiBUaGlzIEFQSSB3aWxsIGRldGVybWluZSBhbmQgcmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoCisgKiB0aGUgYmVzdCBhdmFpbGFibGUgc3Vic3lzdGVtIChTU1Igb3IgUERSKSBmb3IgdGhhdAorICogZG9tYWluIChBZHNwIG9yIE1vZGVtKS4gV2hlbiBhbiBldmVudCBpcyBzZW50IGZyb20gdGhhdAorICogZG9tYWluIHRoZSBub3RpZmllciBibG9jayBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZC4KKyAqCisgKiBjbGllbnRfbmFtZSAtIEEgdW5pcXVlIHVzZXIgbmFtZSBkZWZpbmVkIGJ5IHRoZSBjbGllbnQuCisgKglJZiB0aGUgc2FtZSBuYW1lIGlzIHVzZWQgZm9yIG11bHRpcGxlIGNhbGxzIGVhY2ggd2lsbAorICoJYmUgdHJhY2tlZCAmIGNhbGxlZCBiYWNrIHNlcGFyYXRlbHkgYW5kIGEgc2luZ2xlIGNhbGwKKyAqCXRvIGRlcmVnaXN0ZXIgd2lsbCBkZWxldGUgdGhlbSBhbGwuCisgKiBkb21haW4gLSBEb21haW4gdGhlIGNsaWVudCB3YW50cyB0byBnZXQgZXZlbnRzIGZyb20uCisgKglBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTgorICoJQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOCisgKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgorICoJdG8gYmUgbm90aWZpZWQgb2YgYW4gZXZlbiBvbiB0aGF0IGRvbWFpbi4KKyAqCisgKiAgICAgIG5iX2Z1bmMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKKyAqCQl0aGlzIC0gcG9pbnRlciB0byBvd24gbmIKKyAqCQlvcGNvZGUgLSBldmVudCBmcm9tIHJlZ2lzdGVyZWQgZG9tYWluCisgKgkJCUFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTgorICoJCQlBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQCisgKgkJKmRhdGEgLSBwb2ludGVyIHRvIHN0cnVjdCBhdWRpb19ub3RpZmllcl9jYl9kYXRhCisgKgorICogUmV0dXJuczoJU3VjY2VzczogMAorICoJCUVycm9yOiAtIworICovCitpbnQgYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUsIGludCBkb21haW4sCisJCQkgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKy8qCisgKiBVc2UgYXVkaW9fbm90aWZpZXJfZGVyZWdpc3RlciB0byBkZXJlZ2lzdGVyIHRoZSBjbGllbnRzIGZyb20KKyAqIGFsbCBkb21haW5zIHJlZ2lzdGVyZWQgdXNpbmcgYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIgdGhhdAorICogbWF0Y2ggdGhlIGNsaWVudCBuYW1lLgorICoKKyAqIGNsaWVudF9uYW1lIC0gVW5pcXVlIHVzZXIgbmFtZSB1c2VkIGluIGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyLgorICogUmV0dXJuczoJU3VjY2VzczogMAorICoJCUVycm9yOiAtIworICovCitpbnQgYXVkaW9fbm90aWZpZXJfZGVyZWdpc3RlcihjaGFyICpjbGllbnRfbmFtZSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lLCBpbnQgZG9tYWluLAorCQkJCQkgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1ZGlvX25vdGlmaWVyX2RlcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVNNX1FEU1A2X1BEUiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hdWRpb19wZHIuaCBiL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hdWRpb19wZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmZkMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Bkci5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FVRElPX1BEUl9IXworI2RlZmluZSBfX0FVRElPX1BEUl9IXworCitlbnVtIHsKKwlBVURJT19QRFJfRE9NQUlOX0FEU1AsCisJQVVESU9fUERSX0RPTUFJTl9NQVgKK307CisKK2VudW0geworCUFVRElPX1BEUl9GUkFNRVdPUktfRE9XTiwKKwlBVURJT19QRFJfRlJBTUVXT1JLX1VQCit9OworCisjaWZkZWYgQ09ORklHX01TTV9RRFNQNl9QRFIKKworLyoKKyAqIFVzZSBhdWRpb19wZHJfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgUERSIHN1YnN5c3RlbSB0aGlzCisgKiBzaG91bGQgYmUgZG9uZSBiZWZvcmUgbW9kdWxlIGxhdGUgaW5pdCBvdGhlcndpc2Ugbm90aWZpY2F0aW9uCisgKiBvZiB0aGUgQVVESU9fUERSX0ZSQU1FV09SS19VUCBjYW5ub3QgYmUgZ3VhcmFudGVlZC4KKyAqCisgKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgorICogICAgICAgdG8gYmUgbm90aWZpZWQgb25jZSB0aGUgUERSIGZyYW1ld29yayBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAqICAgICAgIENhbGxiYWNrIHdpbGwgcmVjZWl2ZSBlaXRoZXIgdGhlIEFVRElPX1BEUl9GUkFNRVdPUktfRE9XTgorICogICAgICAgb3IgQVVESU9fUERSX0ZSQU1FV09SS19VUCBpb2N0bCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mCisgKiAgICAgICB0aGUgUERSIGZyYW1ld29yay4KKyAqCisgKiBSZXR1cm5zOiBTdWNjZXNzOiAwCisgKiAgICAgICAgICBGYWlsdXJlOiBFcnJvciBjb2RlCisgKi8KK2ludCBhdWRpb19wZHJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKy8qCisgKiBVc2UgYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgd2l0aCBhIFBEUiBzZXJ2aWNlCisgKiBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIG5iIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aAorICogYXVkaW9fcGRyX3JlZ2lzdGVyIGhhcyBiZWVuIGNhbGxlZCBiYWNrIHdpdGggdGhlCisgKiBBVURJT19QRFJfRlJBTUVXT1JLX1VQIGlvY3RsLgorICoKKyAqIGRvbWFpbl9pZCAtIERvbWFpbiB0byB1c2UsIGV4YW1wbGU6IEFVRElPX1BEUl9BRFNQCisgKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgorICogICAgICAgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBzdGF0ZSBvZiB0aGUgZG9tYWluCisgKiAgICAgICByZXF1ZXN0ZWQuIFRoZSBpb2N0bHMgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGFyZQorICogICAgICAgZGVmaW5lZCBpbiBzZXJ2aWNlLW5vdGlmaWVyLmguCisgKgorICogUmV0dXJuczogU3VjY2VzczogQ2xpZW50IGhhbmRsZQorICogICAgICAgICAgRmFpbHVyZTogUG9pbnRlciBlcnJvciBjb2RlCisgKi8KK3ZvaWQgKmF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyKGludCBkb21haW5faWQsCisJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIGludCAqY3Vycl9zdGF0ZSk7CisKKy8qCisgKiBVc2UgYXVkaW9fcGRyX3NlcnZpY2VfZGVyZWdpc3RlciB0byBkZXJlZ2lzdGVyIHdpdGggYSBQRFIKKyAqIHNlcnZpY2UgdGhhdCB3YXMgcmVnaXN0ZXJlZCB1c2luZyB0aGUgYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIKKyAqIEFQSS4KKyAqCisgKiAqc2VydmljZV9oYW5kbGUgLSBTZXJ2aWNlIGhhbmRsZSByZXR1cm5lZCBieSBhdWRpb19wZHJfc2VydmljZV9yZWdpc3RlcgorICogKm5iIC0gUG9pbnRlciB0byB0aGUgbm90aWZpZXIgYmxvY2suIFVzZWQgaW4gdGhlIGNhbGwgdG8KKyAqICAgICAgIGF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyLgorICoKKyAqIFJldHVybnM6IFN1Y2Nlc3M6IENsaWVudCBoYW5kbGUKKyAqICAgICAgICAgIEZhaWx1cmU6IEVycm9yIGNvZGUKKyAqLworaW50IGF1ZGlvX3Bkcl9zZXJ2aWNlX2RlcmVnaXN0ZXIodm9pZCAqc2VydmljZV9oYW5kbGUsCisJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBhdWRpb19wZHJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyKGludCBkb21haW5faWQsCisJCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQkgICAgICAgaW50ICpjdXJyX3N0YXRlKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdWRpb19wZHJfc2VydmljZV9kZXJlZ2lzdGVyKHZvaWQgKnNlcnZpY2VfaGFuZGxlLAorCQkJCQkgICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19NU01fUURTUDZfUERSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDcwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXVkaW9fc3NyLmgKQEAgLTAsMCArMSw3OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fQVVESU9fU1NSX0hfCisjZGVmaW5lIF9fQVVESU9fU1NSX0hfCisKK2VudW0geworCUFVRElPX1NTUl9ET01BSU5fQURTUCwKKwlBVURJT19TU1JfRE9NQUlOX01PREVNLAorCUFVRElPX1NTUl9ET01BSU5fTUFYCit9OworCisjaWZkZWYgQ09ORklHX01TTV9RRFNQNl9TU1IKKworLyoKKyAqIFVzZSBhdWRpb19zc3JfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgU1NSIHN1YnN5c3RlbQorICoKKyAqIGRvbWFpbl9pZCAtIFNlcnZpY2UgdG8gdXNlLCBleGFtcGxlOiBBVURJT19TU1JfRE9NQUlOX0FEU1AKKyAqICpuYiAtIFBvaW50ZXIgdG8gYSBub3RpZmllciBibG9jay4gUHJvdmlkZSBhIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgICAgICB0byBiZSBub3RpZmllZCBvZiBhbiBldmVudCBmb3IgdGhhdCBzZXJ2aWNlLiBUaGUgaW9jdGxzCisgKiAgICAgICB1c2VkIGJ5IHRoZSBjYWxsYmFjayBhcmUgZGVmaW5lZCBpbiBzdWJzeXN0ZW1fbm90aWYuaC4KKyAqCisgKiBSZXR1cm5zOiBTdWNjZXNzOiBDbGllbnQgaGFuZGxlCisgKiAgICAgICAgICBGYWlsdXJlOiBQb2ludGVyIGVycm9yIGNvZGUKKyAqLwordm9pZCAqYXVkaW9fc3NyX3JlZ2lzdGVyKGludCBkb21haW5faWQsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworCisvKgorICogVXNlIGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIHdpdGggdGhlIFNTUiBzdWJzeXN0ZW0KKyAqCisgKiBoYW5kbGUgLSBIYW5kbGUgcmVjZWl2ZWQgZnJvbSBhdWRpb19zc3JfcmVnaXN0ZXIKKyAqICpuYiAtIFBvaW50ZXIgdG8gYSBub3RpZmllciBibG9jay4gQ2FsbGJhY2sgZnVuY3Rpb24KKyAqICAgICAgIFVzZWQgZnJvbSBhdWRpb19zc3JfcmVnaXN0ZXIuCisgKgorICogUmV0dXJuczogU3VjY2VzczogMAorICogICAgICAgICAgRmFpbHVyZTogRXJyb3IgY29kZQorICovCitpbnQgYXVkaW9fc3NyX2RlcmVnaXN0ZXIodm9pZCAqaGFuZGxlLCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKKworCisvKgorICogVXNlIGF1ZGlvX3Nzcl9zZW5kX25taSB0byBmb3JjZSBhIFJBTSBkdW1wIG9uIEFEU1AKKyAqIGRvd24gZXZlbnQuCisgKgorICogKnNzcl9jYl9kYXRhIC0gKmRhdGEgcmVjZWl2ZWQgZnJvbSBub3RpZmllciBjYWxsYmFjaworICovCit2b2lkIGF1ZGlvX3Nzcl9zZW5kX25taSh2b2lkICpzc3JfY2JfZGF0YSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYXVkaW9fc3NyX3JlZ2lzdGVyKGludCBkb21haW5faWQsCisJCQkJICAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyKHZvaWQgKmhhbmRsZSwgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1ZGlvX3Nzcl9zZW5kX25taSh2b2lkICpzc3JfY2JfZGF0YSkKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19NU01fUURTUDZfU1NSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWNkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfX0RTUF9ERUJVR19IXworI2RlZmluZSBfX0RTUF9ERUJVR19IXworCit0eXBlZGVmIGludCAoKmRzcF9zdGF0ZV9jYikoaW50IHN0YXRlKTsKK2ludCBkc3BfZGVidWdfcmVnaXN0ZXIoZHNwX3N0YXRlX2NiIHB0cik7CisKKyNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIRUQgICAgICAgICAweDAKKyNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIX0RVTVBfRE9ORSAweDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvcnRhYy5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL3J0YWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU0MzNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL3J0YWMuaApAQCAtMCwwICsxLDk4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTMtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX1JUQUNfSF9fCisjZGVmaW5lIF9fUlRBQ19IX18KKworI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorCisvKiBWb2ljZSBNb2RlcyAqLworI2RlZmluZSBSVEFDX0NWUAkJMAorI2RlZmluZSBSVEFDX0NWUwkJMQorI2RlZmluZSBSVEFDX1ZPSUNFX01PREVTCTIKKworI2RlZmluZSBSVEFDX01BWF9BQ1RJVkVfREVWSUNFUwkJNAorI2RlZmluZSBSVEFDX01BWF9BQ1RJVkVfUE9QUAkJOAorCisjZGVmaW5lIERFRkFVTFRfQVBQX1RZUEUJMHgwMDAxMTEzMAorCitlbnVtIHsKKwlBRE1fUlRBQ19DQUwsCisJQVNNX1JUQUNfQ0FMLAorCVZPSUNFX1JUQUNfQ0FMLAorCUFGRV9SVEFDX0NBTCwKKwlNQVhfUlRBQ19CTE9DS1MKK307CisKK3N0cnVjdCBydGFjX2NhbF9tZW1fbWFwX2RhdGEgeworCXVpbnQzMl90CQltYXBfc2l6ZTsKKwl1aW50MzJfdAkJbWFwX2hhbmRsZTsKKwlzdHJ1Y3QgaW9uX2NsaWVudAkqaW9uX2NsaWVudDsKKwlzdHJ1Y3QgaW9uX2hhbmRsZQkqaW9uX2hhbmRsZTsKK307CisKK3N0cnVjdCBydGFjX2NhbF9kYXRhIHsKKwlzaXplX3QJCQlzaXplOworCXZvaWQJCQkqa3ZhZGRyOworCXBoeXNfYWRkcl90CQlwYWRkcjsKK307CisKK3N0cnVjdCBydGFjX2NhbF9ibG9ja19kYXRhIHsKKwlzdHJ1Y3QgcnRhY19jYWxfbWVtX21hcF9kYXRhCW1hcF9kYXRhOworCXN0cnVjdCBydGFjX2NhbF9kYXRhCQljYWxfZGF0YTsKK307CisKK3N0cnVjdCBydGFjX3BvcHBfZGF0YSB7CisJdWludDMyX3QJcG9wcDsKKwl1aW50MzJfdAlwb3BwX3RvcG9sb2d5OworCXVpbnQzMl90CWFwcF90eXBlOworfTsKKworc3RydWN0IHJ0YWNfYWRtX2RhdGEgeworCXVpbnQzMl90CQl0b3BvbG9neV9pZDsKKwl1aW50MzJfdAkJYWZlX3RvcG9sb2d5OworCXVpbnQzMl90CQlhZmVfcG9ydDsKKwl1aW50MzJfdAkJY29wcDsKKwl1aW50MzJfdAkJbnVtX29mX3BvcHA7CisJdWludDMyX3QJCWFwcF90eXBlOworCXVpbnQzMl90CQlhY2RiX2Rldl9pZDsKKwlzdHJ1Y3QgcnRhY19wb3BwX2RhdGEJcG9wcFtSVEFDX01BWF9BQ1RJVkVfUE9QUF07Cit9OworCitzdHJ1Y3QgcnRhY19hZG0geworCXVpbnQzMl90CQkJbnVtX29mX2RldjsKKwlzdHJ1Y3QgcnRhY19hZG1fZGF0YQkJZGV2aWNlW1JUQUNfTUFYX0FDVElWRV9ERVZJQ0VTXTsKK307CisKK3ZvaWQgcnRhY19hZGRfYWRtX2RldmljZSh1MzIgcG9ydF9pZCwgdTMyIGNvcHBfaWQsIHUzMiBwYXRoX2lkLCB1MzIgcG9wcF9pZCwKKwkJCXUzMiBhcHBfdHlwZSwgdTMyIGFjZGJfZGV2X2lkKTsKK3ZvaWQgcnRhY19yZW1vdmVfYWRtX2RldmljZSh1MzIgcG9ydF9pZCwgdTMyIGNvcHBfaWQpOwordm9pZCBydGFjX3JlbW92ZV9wb3BwX2Zyb21fYWRtX2RldmljZXModTMyIHBvcHBfaWQpOwordm9pZCBydGFjX2FkZF92b2ljZSh1MzIgY3ZzX2hhbmRsZSwgdTMyIGN2cF9oYW5kbGUsIHUzMiByeF9hZmVfcG9ydCwKKwl1MzIgdHhfYWZlX3BvcnQsIHUzMiByeF9hY2RiX2lkLCB1MzIgdHhfYWNkYl9pZCwgdTMyIHNlc3Npb25faWQpOwordm9pZCBydGFjX3JlbW92ZV92b2ljZSh1MzIgY3ZzX2hhbmRsZSk7Cit2b2lkIHJ0YWNfc2V0X2FkbV9oYW5kbGUodm9pZCAqaGFuZGxlKTsKK2Jvb2wgcnRhY19tYWtlX2FkbV9jYWxsYmFjayh1aW50MzJfdCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7Cit2b2lkIHJ0YWNfY29weV9hZG1fcGF5bG9hZF90b191c2VyKHZvaWQgKnBheWxvYWQsIHUzMiBwYXlsb2FkX3NpemUpOwordm9pZCBydGFjX3NldF9hc21faGFuZGxlKHUzMiBzZXNzaW9uX2lkLCB2b2lkICpoYW5kbGUpOworYm9vbCBydGFjX21ha2VfYXNtX2NhbGxiYWNrKHUzMiBzZXNzaW9uX2lkLCB1aW50MzJfdCAqcGF5bG9hZCwKKwl1MzIgcGF5bG9hZF9zaXplKTsKK3ZvaWQgcnRhY19jb3B5X2FzbV9wYXlsb2FkX3RvX3VzZXIodm9pZCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7Cit2b2lkIHJ0YWNfc2V0X3ZvaWNlX2hhbmRsZSh1MzIgbW9kZSwgdm9pZCAqaGFuZGxlKTsKK2Jvb2wgcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKHUzMiBtb2RlLCB1aW50MzJfdCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7Cit2b2lkIHJ0YWNfY29weV92b2ljZV9wYXlsb2FkX3RvX3VzZXIodm9pZCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7CitpbnQgcnRhY19jbGVhcl9tYXBwaW5nKHVpbnQzMl90IGNhbF90eXBlKTsKK2Jvb2wgcnRhY19tYWtlX2FmZV9jYWxsYmFjayh1aW50MzJfdCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7Cit2b2lkIHJ0YWNfc2V0X2FmZV9oYW5kbGUodm9pZCAqaGFuZGxlKTsKK3ZvaWQgZ2V0X3J0YWNfYWRtX2RhdGEoc3RydWN0IHJ0YWNfYWRtICphZG1fZGF0YSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi91c2YuaCBiL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi91c2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRiNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL3VzZi5oCkBAIC0wLDAgKzEsMjk4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX1VTRl9IX18KKyNkZWZpbmUgX19VU0ZfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgVVNGX0lPQ1RMX01BR0lDICdVJworCisjZGVmaW5lIFVTX1NFVF9UWF9JTkZPICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDAsIFwKKwkJCQlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlKQorI2RlZmluZSBVU19TVEFSVF9UWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDEpCisjZGVmaW5lIFVTX0dFVF9UWF9VUERBVEUgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCAyLCBcCisJCQkJc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUpCisjZGVmaW5lIFVTX1NFVF9SWF9JTkZPICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDMsIFwKKwkJCQlzdHJ1Y3QgdXNfcnhfaW5mb190eXBlKQorI2RlZmluZSBVU19TRVRfUlhfVVBEQVRFIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgNCwgXAorCQkJCXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlKQorI2RlZmluZSBVU19TVEFSVF9SWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDUpCisKKyNkZWZpbmUgVVNfU1RPUF9UWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDYpCisjZGVmaW5lIFVTX1NUT1BfUlggICAgICBfSU8oVVNGX0lPQ1RMX01BR0lDLCA3KQorCisjZGVmaW5lIFVTX1NFVF9ERVRFQ1RJT04gX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCA4LCBcCisJCQkJc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUpCisKKyNkZWZpbmUgVVNfR0VUX1ZFUlNJT04gIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgOSwgXAorCQkJCXN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZSkKKworI2RlZmluZSBVU19TRVRfVFhfU1RSRUFNX1BBUkFNICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEwLCBcCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQorI2RlZmluZSBVU19HRVRfVFhfU1RSRUFNX1BBUkFNICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDExLCBcCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQorI2RlZmluZSBVU19TRVRfUlhfU1RSRUFNX1BBUkFNICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEyLCBcCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQorI2RlZmluZSBVU19HRVRfUlhfU1RSRUFNX1BBUkFNICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDEzLCBcCisJCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQorCisvKiBTcGVjaWFsIHRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIFVTRl9OT19XQUlUX1RJTUVPVVQJMHgwMDAwMDAwMAorLyogSW5maW5pdGl2ZSAqLworI2RlZmluZSBVU0ZfSU5GSU5JVElWRV9USU1FT1VUCTB4ZmZmZmZmZmYKKy8qIERlZmF1bHQgdmFsdWUsIHVzZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBVU0ZfREVGQVVMVF9USU1FT1VUCTB4ZmZmZmZmZmUKKworLyogVVMgZGV0ZWN0aW9uIHBsYWNlIChIV3xGVykgKi8KK2VudW0gdXNfZGV0ZWN0X3BsYWNlX2VudW0geworLyogVVMgaXMgZGV0ZWN0ZWQgaW4gSFcgKi8KKwlVU19ERVRFQ1RfSFcsCisvKiBVUyBpcyBkZXRlY3RlZCBpbiBGVyAqLworCVVTX0RFVEVDVF9GVworfTsKKworLyogVVMgZGV0ZWN0aW9uIG1vZGUgKi8KK2VudW0gdXNfZGV0ZWN0X21vZGVfZW51bSB7CisvKiBVUyBkZXRlY3Rpb24gaXMgZGlzYWJsZWQgKi8KKwlVU19ERVRFQ1RfRElTQUJMRURfTU9ERSwKKy8qIFVTIGRldGVjdGlvbiBpcyBlbmFibGVkIGluIGNvbnRpbnVlIG1vZGUgKi8KKwlVU19ERVRFQ1RfQ09OVElOVUVfTU9ERSwKKy8qIFVTIGRldGVjdGlvbiBpcyBlbmFibGVkIGluIG9uZSBzaG90IG1vZGUgKi8KKwlVU19ERVRFQ1RfU0hPVF9NT0RFCit9OworCisvKiBFbmNvZGVyIChUWCksIGRlY29kZXIgKFJYKSBzdXBwb3J0ZWQgVVMgZGF0YSBmb3JtYXRzICovCisjZGVmaW5lIFVTRl9QT0lOVF9FUE9TX0ZPUk1BVAkwCisjZGVmaW5lIFVTRl9SQVdfRk9STUFUCQkxCisKKy8qIEluZGV4ZXMgb2YgZXZlbnQgdHlwZXMsIHByb2R1Y2VkIGJ5IHRoZSBjYWxjdWxhdG9ycyAqLworI2RlZmluZSBVU0ZfVFNDX0VWRU5UX0lORCAgICAgIDAKKyNkZWZpbmUgVVNGX1RTQ19QVFJfRVZFTlRfSU5EICAxCisjZGVmaW5lIFVTRl9NT1VTRV9FVkVOVF9JTkQgICAgMgorI2RlZmluZSBVU0ZfS0VZQk9BUkRfRVZFTlRfSU5EIDMKKyNkZWZpbmUgVVNGX1RTQ19FWFRfRVZFTlRfSU5EICA0CisjZGVmaW5lIFVTRl9NQVhfRVZFTlRfSU5EICAgICAgNQorCisvKiBUeXBlcyBvZiBldmVudHMsIHByb2R1Y2VkIGJ5IHRoZSBjYWxjdWxhdG9ycyAqLworI2RlZmluZSBVU0ZfTk9fRVZFTlQgMAorI2RlZmluZSBVU0ZfVFNDX0VWRU5UICAgICAgKDEgPDwgVVNGX1RTQ19FVkVOVF9JTkQpCisjZGVmaW5lIFVTRl9UU0NfUFRSX0VWRU5UICAoMSA8PCBVU0ZfVFNDX1BUUl9FVkVOVF9JTkQpCisjZGVmaW5lIFVTRl9NT1VTRV9FVkVOVCAgICAoMSA8PCBVU0ZfTU9VU0VfRVZFTlRfSU5EKQorI2RlZmluZSBVU0ZfS0VZQk9BUkRfRVZFTlQgKDEgPDwgVVNGX0tFWUJPQVJEX0VWRU5UX0lORCkKKyNkZWZpbmUgVVNGX1RTQ19FWFRfRVZFTlQgICgxIDw8IFVTRl9UU0NfRVhUX0VWRU5UX0lORCkKKyNkZWZpbmUgVVNGX0FMTF9FVkVOVFMgICAgICAgICAoVVNGX1RTQ19FVkVOVCB8XAorCQkJCVVTRl9UU0NfUFRSX0VWRU5UIHxcCisJCQkJVVNGX01PVVNFX0VWRU5UIHxcCisJCQkJVVNGX0tFWUJPQVJEX0VWRU5UIHxcCisJCQkJVVNGX1RTQ19FWFRfRVZFTlQpCisKKy8qIG1pbiwgbWF4IGFycmF5IGRpbWVuc2lvbiAqLworI2RlZmluZSBNSU5fTUFYX0RJTSAyCisKKy8qIGNvb3JkaW5hdGVzICh4LHkseikgYXJyYXkgZGltZW5zaW9uICovCisjZGVmaW5lIENPT1JESU5BVEVTX0RJTSAzCisKKy8qIHRpbHRzICh4LHkpIGFycmF5IGRpbWVuc2lvbiAqLworI2RlZmluZSBUSUxUU19ESU0gMgorCisvKiBNYXggc2l6ZSBvZiB0aGUgY2xpZW50IG5hbWUgKi8KKyNkZWZpbmUgVVNGX01BWF9DTElFTlRfTkFNRV9TSVpFCTIwCisKKy8qIE1heCBudW1iZXIgb2YgdGhlIHBvcnRzIChtaWNzL3NwZWFrZXJzKSAqLworI2RlZmluZSBVU0ZfTUFYX1BPUlRfTlVNICAgICAgICAgICAgICAgIDgKKworLyogSW5mbyBzdHJ1Y3R1cmUgY29tbW9uIGZvciBUWCBhbmQgUlggKi8KK3N0cnVjdCB1c194eF9pbmZvX3R5cGUgeworLyogSW5wdXQ6ICBnZW5lcmFsIGluZm8gKi8KKy8qIE5hbWUgb2YgdGhlIGNsaWVudCAtIGV2ZW50IGNhbGN1bGF0b3IgKi8KKwljb25zdCBjaGFyIF9fdXNlciAqY2xpZW50X25hbWU7CisvKiBTZWxlY3RlZCBkZXZpY2UgaWRlbnRpZmljYXRpb24sIGFjY2VwdGVkIGluIHRoZSBrZXJuZWwncyBDQUQgKi8KKwl1aW50MzJfdCBkZXZfaWQ7CisvKiAwIC0gcG9pbnRfZXBvcyB0eXBlOyAoZS5nLiAxIC0gZ3JfbW1yZCkgKi8KKwl1aW50MzJfdCBzdHJlYW1fZm9ybWF0OworLyogUmVxdWlyZWQgc2FtcGxlIHJhdGUgaW4gSHogKi8KKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKy8qIFNpemUgb2YgYSBidWZmZXIgKGJ5dGVzKSBmb3IgVVMgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBtb2R1bGUgYW5kIFVTRiAqLworCXVpbnQzMl90IGJ1Zl9zaXplOworLyogTnVtYmVyIG9mIHRoZSBidWZmZXJzIGZvciB0aGUgVVMgZGF0YSB0cmFuc2ZlciAqLworCXVpbnQxNl90IGJ1Zl9udW07CisvKiBOdW1iZXIgb2YgdGhlIG1pY3JvcGhvbmVzIChUWCkgb3Igc3BlYWtlcnMoUlgpICovCisJdWludDE2X3QgcG9ydF9jbnQ7CisvKiBNaWNyb3Bob25lcyhUWCkgb3Igc3BlYWtlcnMoUlgpIGluZGV4ZXMgaW4gdGhlaXIgZW51bWVyYXRpb24gKi8KKwl1aW50OF90ICBwb3J0X2lkW1VTRl9NQVhfUE9SVF9OVU1dOworLyogQml0cyBwZXIgc2FtcGxlIDE2IG9yIDMyICovCisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlOworLyogSW5wdXQ6ICBUcmFuc3BhcmVudCBpbmZvIGZvciBlbmNvZGVyIGluIHRoZSBMUEFTUyAqLworLyogUGFyYW1ldGVycyBkYXRhIHNpemUgaW4gYnl0ZXMgKi8KKwl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOworLyogUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyAqLworCXVpbnQ4X3QgX191c2VyICpwYXJhbXNfZGF0YTsKKy8qIE1heCBzaXplIG9mIGJ1ZmZlciBmb3IgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyICovCisJdWludDMyX3QgbWF4X2dldF9zZXRfcGFyYW1fYnVmX3NpemU7Cit9OworCitzdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlIHsKKwkvKiBUb3VjaCBzY3JlZW4gZGltZW5zaW9uczogbWluICYgbWF4O2ZvciBpbnB1dCBtb2R1bGUgKi8KKwlpbnQgdHNjX3hfZGltW01JTl9NQVhfRElNXTsKKwlpbnQgdHNjX3lfZGltW01JTl9NQVhfRElNXTsKKwlpbnQgdHNjX3pfZGltW01JTl9NQVhfRElNXTsKKwkvKiBUb3VjaCBzY3JlZW4gdGlsdCBkaW1lbnNpb25zOiBtaW4gJiBtYXg7Zm9yIGlucHV0IG1vZHVsZSAqLworCWludCB0c2NfeF90aWx0W01JTl9NQVhfRElNXTsKKwlpbnQgdHNjX3lfdGlsdFtNSU5fTUFYX0RJTV07CisJLyogVG91Y2ggc2NyZWVuIHByZXNzdXJlIGxpbWl0czogbWluICYgbWF4OyBmb3IgaW5wdXQgbW9kdWxlICovCisJaW50IHRzY19wcmVzc3VyZVtNSU5fTUFYX0RJTV07CisJLyogVGhlIHJlcXVlc3RlZCBidXR0b25zIGJpdG1hcCAqLworCXVpbnQxNl90IHJlcV9idXR0b25zX2JpdG1hcDsKKwkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIChVU0ZfWF9FVkVOVCksIHByb2R1Y2VkIGJ5IGNhbGN1bGF0b3IgKi8KKwl1aW50MTZfdCBldmVudF90eXBlczsKKwkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIGZyb20gZGV2cywgY29uZmxpY3Rpbmcgd2l0aCBVU0YgKi8KKwl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF90eXBlczsKK307CisKK3N0cnVjdCB1c190eF9pbmZvX3R5cGUgeworCS8qIENvbW1vbiBpbmZvICovCisJc3RydWN0IHVzX3h4X2luZm9fdHlwZSB1c194eF9pbmZvOworCS8qIEluZm8gc3BlY2lmaWMgZm9yIFRYKi8KKwlzdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlIGlucHV0X2luZm87Cit9OworCitzdHJ1Y3QgdXNfcnhfaW5mb190eXBlIHsKKwkvKiBDb21tb24gaW5mbyAqLworCXN0cnVjdCB1c194eF9pbmZvX3R5cGUgdXNfeHhfaW5mbzsKKwkvKiBJbmZvIHNwZWNpZmljIGZvciBSWCovCit9OworCitzdHJ1Y3QgcG9pbnRfZXZlbnRfdHlwZSB7CisvKiBQZW4gY29vcmRpbmF0ZXMgKHgsIHksIHopIGluIHVuaXRzLCBkZWZpbmVkIGJ5IDxjb29yZGluYXRlc190eXBlPiAgKi8KKwlpbnQgY29vcmRpbmF0ZXNbQ09PUkRJTkFURVNfRElNXTsKKwkvKiB7eDt5fSAgaW4gdHJhbnNwYXJlbnQgdW5pdHMgKi8KKwlpbnQgaW5jbGluYXRpb25zW1RJTFRTX0RJTV07CisvKiBbMC0xMDIzXSAoMTBiaXRzKTsgMCAtIHBlbiB1cCAqLworCXVpbnQzMl90IHByZXNzdXJlOworLyogQml0bWFwIGZvciBidXR0b24gc3RhdGUuIDEgLSBkb3duLCAwIC0gdXAgKi8KKwl1aW50MTZfdCBidXR0b25zX3N0YXRlX2JpdG1hcDsKK307CisKKy8qIE1vdXNlIGJ1dHRvbnMsIHN1cHBvcnRlZCBieSBVU0YgKi8KKyNkZWZpbmUgVVNGX0JVVFRPTl9MRUZUX01BU0sgICAxCisjZGVmaW5lIFVTRl9CVVRUT05fTUlERExFX01BU0sgMgorI2RlZmluZSBVU0ZfQlVUVE9OX1JJR0hUX01BU0sgIDQKK3N0cnVjdCBtb3VzZV9ldmVudF90eXBlIHsKKy8qIFRoZSBtb3VzZSByZWxhdGl2ZSBtb3ZlbWVudCAoZFgsIGRZLCBkWikgKi8KKwlpbnQgcmVsc1tDT09SRElOQVRFU19ESU1dOworLyogQml0bWFwIG9mIG1vdXNlIGJ1dHRvbnMgc3RhdGVzOiAxIC0gZG93biwgMCAtIHVwOyAqLworCXVpbnQxNl90IGJ1dHRvbnNfc3RhdGVzOworfTsKKworc3RydWN0IGtleV9ldmVudF90eXBlIHsKKy8qICBDYWxjdWxhdGVkIE1TIGtleS0gc2VlIGlucHV0LmguICovCisJdWludDMyX3Qga2V5OworLyogS2V5Ym9hcmQncyBrZXkgc3RhdGU6IDEgLSBkb3duLCAwIC0gdXA7ICovCisJdWludDhfdCBrZXlfc3RhdGU7Cit9OworCitzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgeworLyogRXZlbnQgc2VxdWVuY2UgbnVtYmVyICovCisJdWludDMyX3Qgc2VxX251bTsKKy8qIEV2ZW50IGdlbmVyYXRpb24gc3lzdGVtIHRpbWUgKi8KKwl1aW50MzJfdCB0aW1lc3RhbXA7CisvKiBEZXN0aW5hdGlvbiBpbnB1dCBldmVudCB0eXBlIGluZGV4IChlLmcuIHRvdWNoIHNjcmVlbiwgbW91c2UsIGtleSkgKi8KKwl1aW50MTZfdCBldmVudF90eXBlX2luZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBwb2ludF9ldmVudF90eXBlIHBvaW50X2V2ZW50OworCQlzdHJ1Y3QgbW91c2VfZXZlbnRfdHlwZSBtb3VzZV9ldmVudDsKKwkJc3RydWN0IGtleV9ldmVudF90eXBlICAga2V5X2V2ZW50OworCX0gZXZlbnRfZGF0YTsKK307CisKK3N0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlIHsKKy8qIElucHV0ICBnZW5lcmFsOiAqLworLyogTnVtYmVyIG9mIGNhbGN1bGF0ZWQgZXZlbnRzICovCisJdWludDE2X3QgZXZlbnRfY291bnRlcjsKKy8qIENhbGN1bGF0ZWQgZXZlbnRzIG9yIE5VTEwgKi8KKwlzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgX191c2VyICpldmVudDsKKy8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLworLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLworCXVpbnQzMl90IGZyZWVfcmVnaW9uOworLyogVGltZSAoc2VjKSB0byB3YWl0IGZvciBkYXRhIG9yIHNwZWNpYWwgdmFsdWVzOiAqLworLyogVVNGX05PX1dBSVRfVElNRU9VVCwgVVNGX0lORklOSVRJVkVfVElNRU9VVCwgVVNGX0RFRkFVTFRfVElNRU9VVCAqLworCXVpbnQzMl90IHRpbWVvdXQ7CisvKiBFdmVudHMgKGZyb20gY29uZmxpY3RpbmcgZGV2cykgdG8gYmUgZGlzYWJsZWQvZW5hYmxlZCAqLworCXVpbnQxNl90IGV2ZW50X2ZpbHRlcnM7CisKKy8qIElucHV0ICB0cmFuc3BhcmVudCBkYXRhOiAqLworLyogUGFyYW1ldGVycyBzaXplICovCisJdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgKi8KKwl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7CisvKiBPdXRwdXQgcGFyYW1ldGVyczogKi8KKy8qIFBvaW50ZXIgKHdyaXRlIGluZGV4KSB0byB0aGUgZW5kIG9mIHJlYWR5IFVTIGRhdGEgcmVnaW9uICovCisvKiBpbiB0aGUgc2hhcmVkIG1lbW9yeSAqLworCXVpbnQzMl90IHJlYWR5X3JlZ2lvbjsKK307CisKK3N0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlIHsKKy8qIElucHV0ICBnZW5lcmFsOiAqLworLyogUG9pbnRlciAod3JpdGUgaW5kZXgpIHRvIHRoZSBlbmQgb2YgcmVhZHkgVVMgZGF0YSByZWdpb24gKi8KKy8qIGluIHRoZSBzaGFyZWQgbWVtb3J5ICovCisJdWludDMyX3QgcmVhZHlfcmVnaW9uOworLyogSW5wdXQgIHRyYW5zcGFyZW50IGRhdGE6ICovCisvKiBQYXJhbWV0ZXJzIHNpemUgKi8KKwl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOworLyogcFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgKi8KKwl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7CisvKiBPdXRwdXQgcGFyYW1ldGVyczogKi8KKy8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLworLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLworCXVpbnQzMl90IGZyZWVfcmVnaW9uOworfTsKKworc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUgeworLyogVVMgZGV0ZWN0aW9uIHBsYWNlIChIV3xGVykgKi8KKy8qIE5BIGluIHRoZSBBY3RpdmUgYW5kIE9GRiBzdGF0ZXMgKi8KKwllbnVtIHVzX2RldGVjdF9wbGFjZV9lbnVtIHVzX2RldGVjdG9yOworLyogVVMgZGV0ZWN0aW9uIG1vZGUgKi8KKwllbnVtIHVzX2RldGVjdF9tb2RlX2VudW0gIHVzX2RldGVjdF9tb2RlOworLyogVVMgZGF0YSBkcm9wcGVkIGR1cmluZyB0aGlzIHRpbWUgKG1zZWMpICovCisJdWludDMyX3Qgc2tpcF90aW1lOworLyogVHJhbnNwYXJlbnQgZGF0YSBzaXplICovCisJdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKKy8qIFBvaW50ZXIgdG8gdGhlIHRyYW5zcGFyZW50IGRhdGEgKi8KKwl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7CisvKiBUaW1lIChzZWMpIHRvIHdhaXQgZm9yIFVTIHByZXNlbmNlIGV2ZW50ICovCisJdWludDMyX3QgZGV0ZWN0X3RpbWVvdXQ7CisvKiBPdXQgcGFyYW1ldGVyOiBVUyBwcmVzZW5jZSAqLworCWJvb2wgaXNfdXM7Cit9OworCitzdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUgeworLyogU2l6ZSBvZiBtZW1vcnkgZm9yIHRoZSB2ZXJzaW9uIHN0cmluZyAqLworCXVpbnQxNl90IGJ1Zl9zaXplOworLyogUG9pbnRlciB0byB0aGUgbWVtb3J5IGZvciB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KKwljaGFyIF9fdXNlciAqcGJ1ZjsKK307CisKK3N0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSB7CisvKiBJZCBvZiBtb2R1bGUgKi8KKwl1aW50MzJfdCBtb2R1bGVfaWQ7CisvKiBJZCBvZiBwYXJhbWV0ZXIgKi8KKwl1aW50MzJfdCBwYXJhbV9pZDsKKy8qIFNpemUgb2YgbWVtb3J5IG9mIHRoZSBwYXJhbWV0ZXIgYnVmZmVyICovCisJdWludDMyX3QgYnVmX3NpemU7CisvKiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIgKi8KKwl1aW50OF90IF9fdXNlciAqcGJ1ZjsKK307CisKKyNlbmRpZiAvKiBfX1VTRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc291bmR3aXJlL3NvdW5kd2lyZS5oIGIvaW5jbHVkZS9saW51eC9zb3VuZHdpcmUvc291bmR3aXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc291bmR3aXJlL3NvdW5kd2lyZS5oCkBAIC0wLDAgKzEsMzEyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9TT1VORFdJUkVfSAorI2RlZmluZSBfTElOVVhfU09VTkRXSVJFX0gKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorCitleHRlcm4gc3RydWN0IGJ1c190eXBlIHNvdW5kd2lyZV90eXBlOworCisvKiBTb3VuZHdpcmUgc3VwcG9ydHMgbWF4LiBvZiA4IGNoYW5uZWxzIHBlciBwb3J0ICovCisjZGVmaW5lIFNXUl9NQVhfQ0hBTk5FTF9OVU0JOAorLyogU291bmR3aXJlIHN1cHBvcnRzIG1heC4gb2YgMTQgcG9ydHMgb24gZWFjaCBkZXZpY2UgKi8KKyNkZWZpbmUgU1dSX01BWF9ERVZfUE9SVF9OVU0JMTQKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNsYXZlIGRldmljZXMgdGhhdCBhIG1hc3RlciBjYW4gY29udHJvbCAqLworI2RlZmluZSBTV1JfTUFYX0RFVl9OVU0JCTExCisvKiBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyBvbiBtYXN0ZXIgc28gdGhhdCBpdCBjYW4gYWNjb21tb2RhdGUgYWxsIHRoZSBwb3J0CisgKiBjb25maWd1cmF0aW9ucyBvZiBhbGwgZGV2aWNlcworICovCisjZGVmaW5lIFNXUl9NQVhfTVNUUl9QT1JUX05VTQkoU1dSX01BWF9ERVZfTlVNICogU1dSX01BWF9ERVZfUE9SVF9OVU0pCisKKy8qIEluZGljYXRlcyBzb3VuZHdpcmUgZGV2aWNlcyBncm91cCBpbmZvcm1hdGlvbiAqLworZW51bSB7CisJU1dSX0dST1VQX05PTkUgPSAwLAorCVNXUl9HUk9VUF8xMiA9IDEyLAorCVNXUl9HUk9VUF8xMyA9IDEzLAorCVNXUl9CUk9BRENBU1QgPSAxNSwKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAtIHJlcHJlc2VudCBzb3VuZHdpcmUgZnJhbWUgc2hhcGUKKyAqIEBkZXZfaWQ6IGxvZ2ljYWwgZGV2aWNlIG51bWJlciBvZiB0aGUgc291bmR3aXJlIHNsYXZlIGRldmljZQorICogQHBvcnRfZW46IGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBvcnQgaXMgZW5hYmxlZAorICogQHBvcnRfaWQ6IGxvZ2ljYWwgcG9ydCBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBvZmZzZXQxOiBzYW1wbGUgb2Zmc2V0IGluZGljYXRpbmcgdGhlIG9mZnNldCBvZiB0aGUgY2hhbm5lbAorICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lCisgKiBAb2Zmc2V0MjogY2hhbm5lbCBvZmZzZXQgaW5kaWNhdGluZyBvZmZzZXQgYmV0d2VlbiB0byBjaGFubmVscworICogQHNpbnRlcnZhbDogc2FtcGxlIGludGVydmFsIGluZGljYXRlcyBzcGFjaW5nIGZyb20gb25lIHNhbXBsZQorICogZXZlbnQgdG8gdGhlIG5leHQKKyAqIEBjaF9lbjogY2hhbm5lbHMgaW4gYSBwb3J0IHRoYXQgbmVlZCB0byBiZSBlbmFibGVkCisgKiBAbnVtX2NoOiBudW1iZXIgb2YgY2hhbm5lbHMgZW5hYmxlZCBpbiBhIHBvcnQKKyAqIEBjaF9yYXRlOiBzYW1wbGluZyByYXRlIG9mIHRoZSBjaGFubmVsIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlCisgKiB0cmFuc2ZlcnJlZAorICoKKyAqIFNvdW5kd2lyZSBmcmFtZSBzaGFwZSBpcyBjcmVhdGVkIGJhc2VkIG9uIHN3cl9wb3J0X2luZm8gc3RydWN0CisgKiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyB7CisJdTggZGV2X2lkOworCXU4IHBvcnRfZW47CisJdTggcG9ydF9pZDsKKwl1OCBvZmZzZXQxOworCXU4IG9mZnNldDI7CisJdTggc2ludGVydmFsOworCXU4IGNoX2VuOworCXU4IG51bV9jaDsKKwl1MzIgY2hfcmF0ZTsKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3dyX3BhcmFtcyAtIHJlcHJlc2VudCB0cmFuc2ZlciBvZiBkYXRhIGZyb20gc291bmR3aXJlIHNsYXZlCisgKiB0byBzb3VuZHdpcmUgbWFzdGVyCisgKiBAdGlkOiB0cmFuc2FjdGlvbiBJRCB0byB0cmFjayBlYWNoIHRyYW5zYWN0aW9uCisgKiBAZGV2X2lkOiBsb2dpY2FsIGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBudW1fcG9ydDogbnVtYmVyIG9mIHBvcnRzIHRoYXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZAorICogQHBvcnRfaWQ6IGFycmF5IG9mIGxvZ2ljYWwgcG9ydCBudW1iZXJzIG9mIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAbnVtX2NoOiBhcnJheSBvZiBudW1iZXIgb2YgY2hhbm5lbHMgZW5hYmxlZAorICogQGNoX3JhdGU6IGFycmF5IG9mIHNhbXBsaW5nIHJhdGUgb2YgZGlmZmVyZW50IGNoYW5uZWxzIHRoYXQgbmVlZCB0bworICogYmUgY29uZmlndXJlZAorICogQGNoX2VuOiBhcnJheSBvZiBjaGFubmVscyBtYXNrIGZvciBhbGwgdGhlIHBvcnRzCisgKi8KK3N0cnVjdCBzd3JfcGFyYW1zIHsKKwl1OCB0aWQ7CisJdTggZGV2X2lkOworCXU4IG51bV9wb3J0OworCXU4IHBvcnRfaWRbU1dSX01BWF9ERVZfUE9SVF9OVU1dOworCXU4IG51bV9jaFtTV1JfTUFYX0RFVl9QT1JUX05VTV07CisJdTMyIGNoX3JhdGVbU1dSX01BWF9ERVZfUE9SVF9OVU1dOworCXU4IGNoX2VuW1NXUl9NQVhfREVWX1BPUlRfTlVNXTsKK307CisKKy8qCisgKiBzdHJ1Y3Qgc3dyX3JlZyAtIHN0cnVjdCB0byBoYW5kbGUgc291bmR3aXJlIHNsYXZlIHJlZ2lzdGVyIHJlYWQvd3JpdGVzCisgKiBAdGlkOiB0cmFuc2FjdGlvbiBpZCBmb3IgcmVnIHJlYWQvd3JpdGVzCisgKiBAZGV2X2lkOiBsb2dpY2FsIGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEByZWdhZGRyOiAxNiBiaXQgcmVnYWRkciBvZiBzb3VuZHdpcmUgc2xhdmUKKyAqIEBidWY6IHZhbHVlIHRvIGJlIHdyaXR0ZW4vcmVhZCB0by9mcm9tIHJlZ2FkZHIKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyIGJ1ZgorICovCitzdHJ1Y3Qgc3dyX3JlZyB7CisJdTggIHRpZDsKKwl1OCAgZGV2X2lkOworCXUzMiByZWdhZGRyOworCXUzMiAqYnVmOworCXUzMiBsZW47Cit9OworCisvKgorICogc3RydWN0IHN3cl9tYXN0ZXIgLSBJbnRlcmZhY2UgdG8gdGhlIHNvdW5kd2lyZSBtYXN0ZXIgY29udHJvbGxlcgorICogQGRldjogZGV2aWNlIGludGVyZmFjZSB0byB0aGlzIGRyaXZlcgorICogQGxpc3Q6IGxpbmsgd2l0aCBvdGhlciBzb3VuZHdpcmUgbWFzdGVyIGNvbnRyb2xsZXJzCisgKiBAYnVzX251bTogYm9hcmQvU29DIHNwZWNpZmljIGlkZW50aWZpZXIgZm9yIGEgc291bmR3aXJlIG1hc3RlcgorICogQG1sb2NrOiBtdXRleCBwcm90ZWN0aW5nIG1hc3RlciBkYXRhIHN0cnVjdHVyZXMKKyAqIEBkZXZpY2VzOiBsaXN0IG9mIGRldmljZXMgb24gdGhpcyBtYXN0ZXIKKyAqIEBwb3J0OiBsb2dpY2FsIHBvcnQgbnVtYmVycyBvZiB0aGUgc291bmR3aXJlIG1hc3Rlci4gVGhpcyBhcnJheQorICogY2FuIGhvbGQgbWF4aW11bSBtYXN0ZXIgcG9ydHMgd2hpY2ggaXMgZXF1YWwgdG8gbnVtYmVyIG9mIHNsYXZlCisgKiBkZXZpY2VzIG11bHRpcGxpZWQgYnkgbnVtYmVyIG9mIHBvcnRzIGluIGVhY2ggc2xhdmUgZGV2aWNlCisgKiBAcG9ydF90eG46IHRhYmxlIG9mIHBvcnQgY29uZmlnIHRyYW5zYWN0aW9ucyB3aXRoIHRyYW5zYWN0aW9uIGlkCisgKiBAcmVnX3R4bjogdGFibGUgb2YgcmVnaXN0ZXIgdHJhbnNhY3Rpb25zIHdpdGggdHJhbnNhY3Rpb24gaWQKKyAqIEBsYXN0X3RpZDogc2l6ZSBvZiB0YWJsZSBwb3J0X3R4biAoY2FuJ3QgZ3JvdyBiZXlvbmQgMjU2IHNpbmNlCisgKiB0aWQgaXMgOCBiaXRzKQorICogQG51bV9wb3J0OiBudW1iZXIgb2YgYWN0aXZlIHBvcnRzIG9uIHNvdW5kd2lyZSBtYXN0ZXIKKyAqIEBncl9zaWQ6IHNsYXZlIGlkIHVzZWQgYnkgdGhlIGdyb3VwIGZvciB3cml0ZSBvcGVyYXRpb25zCisgKiBAY29ubmVjdF9wb3J0OiBjYWxsYmFjayBmb3IgY29uZmlndXJhdGlvbiBvZiBzb3VuZHdpcmUgcG9ydChzKQorICogQGRpc2Nvbm5lY3RfcG9ydDogY2FsbGJhY2sgZm9yIGRpc2FibGUgb2Ygc291bmR3aXJlIHBvcnQocykKKyAqIEByZWFkOiBjYWxsYmFjayBmb3Igc291bmR3aXJlIHNsYXZlIHJlZ2lzdGVyIHJlYWQKKyAqIEB3cml0ZTogY2FsbGJhY2sgZm9yIHNvdW5kd2lyZSBzbGF2ZSByZWdpc3RlciB3cml0ZQorICogQGdldF9sb2dpY2FsX2Rldl9udW06IGNhbGxiYWNrIHRvIGdldCBzb3VuZHdpcmUgc2xhdmUgbG9naWNhbAorICogZGV2aWNlIG51bWJlcgorICovCitzdHJ1Y3Qgc3dyX21hc3RlciB7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBidXNfbnVtOworCXN0cnVjdCBtdXRleCBtbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7CisJc3RydWN0IHN3cl9wb3J0X2luZm8gcG9ydFtTV1JfTUFYX01TVFJfUE9SVF9OVU1dOworCXN0cnVjdCBzd3JfcGFyYW1zICoqcG9ydF90eG47CisJc3RydWN0IHN3cl9yZWcgKipyZWdfdHhuOworCXU4IGxhc3RfdGlkOworCXU4IG51bV9wb3J0OworCXU4IG51bV9kZXY7CisJdTggZ3Jfc2lkOworCWludCAoKmNvbm5lY3RfcG9ydCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHN0cnVjdCBzd3JfcGFyYW1zICp0eG4pOworCWludCAoKmRpc2Nvbm5lY3RfcG9ydCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHN0cnVjdCBzd3JfcGFyYW1zICp0eG4pOworCWludCAoKnJlYWQpKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyLCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCisJCQl2b2lkICpidWYsIHUzMiBsZW4pOworCWludCAoKndyaXRlKShzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAorCQkJY29uc3Qgdm9pZCAqYnVmKTsKKwlpbnQgKCpidWxrX3dyaXRlKShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBkZXZfbnVtLCB2b2lkICpyZWcsCisJCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CisJaW50ICgqZ2V0X2xvZ2ljYWxfZGV2X251bSkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHU2NCBkZXZfaWQsCisJCQkJdTggKmRldl9udW0pOworCXZvaWQgKCpzbHZkZXZfZGF0YXBhdGhfY29udHJvbCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIGJvb2wgZW5hYmxlKTsKKwlib29sICgqcmVtb3ZlX2Zyb21fZ3JvdXApKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyKTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN3cl9tYXN0ZXIgKnRvX3N3cl9tYXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYgPyBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3dyX21hc3RlciwgZGV2KSA6IE5VTEw7Cit9CisKKy8qCisgKiBzdHJ1Y3Qgc3dyX2RldmljZSAtIHJlcHJlc2VudCBhIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBuYW1lOiBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIGRldmljZSwgZGVmaW5lZCBpbiBkZXZpY2V0cmVlCisgKiBiaW5kaW5nIHVuZGVyIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2Ugbm9kZSBhcyBhIGNvbXBhdGlibGUgZmllbGQuCisgKiBAbWFzdGVyOiBzb3VuZHdpcmUgbWFzdGVyIG1hbmFnaW5nIHRoZSBidXMgaG9zdGluZyB0aGlzIGRldmljZQorICogQGRyaXZlcjogRGV2aWNlJ3MgZHJpdmVyLiBQb2ludGVyIHRvIGFjY2VzcyByb3V0aW5lcworICogQGRldl9saXN0OiBsaXN0IG9mIGRldmljZXMgb24gYSBjb250cm9sbGVyCisgKiBAZGV2X251bTogbG9naWNhbCBkZXZpY2UgbnVtYmVyIG9mIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCisgKiBAZGV2OiBkcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZQorICogQGFkZHI6IHJlcHJlc2VudHMgImVhLWFkZHIiIHdoaWNoIGlzIHVuaXF1ZS1pZCBvZiBzb3VuZHdpcmUgc2xhdmUKKyAqIGRldmljZQorICogQGdyb3VwX2lkOiBncm91cCBpZCBzdXBwb3J0ZWQgYnkgdGhlIHNsYXZlIGRldmljZQorICovCitzdHJ1Y3Qgc3dyX2RldmljZSB7CisJY2hhciBuYW1lW1NPVU5EV0lSRV9OQU1FX1NJWkVdOworCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHN3cl9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OworCXU4ICAgICAgICAgICAgICAgZGV2X251bTsKKwlzdHJ1Y3QgZGV2aWNlICAgIGRldjsKKwl1bnNpZ25lZCBsb25nICAgIGFkZHI7CisJdTggZ3JvdXBfaWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzd3JfZGV2aWNlICp0b19zd3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2ID8gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN3cl9kZXZpY2UsIGRldikgOiBOVUxMOworfQorCisvKgorICogc3RydWN0IHN3cl9kcml2ZXIgLSBNYW5hZ2Ugc291bmR3aXJlIHNsYXZlIGRldmljZSBkcml2ZXIKKyAqIEBwcm9iZTogYmluZHMgdGhpcyBkcml2ZXIgdG8gc291bmR3aXJlIGRldmljZQorICogQHJlbW92ZTogdW5iaW5kcyB0aGlzIGRyaXZlciBmcm9tIHNvdW5kd2lyZSBkZXZpY2UKKyAqIEBzaHV0ZG93bjogc3RhbmRhcmQgc2h1dGRvd24gY2FsbGJhY2sgdXNlZCBkdXJpbmcgcG93ZXIgZG93bi9oYWx0CisgKiBAc3VzcGVuZDogc3RhbmRhcmQgc3VzcGVuZCBjYWxsYmFjayB1c2VkIGR1cmluZyBzeXN0ZW0gc3VzcGVuZAorICogQHJlc3VtZTogc3RhbmRhcmQgcmVzdW1lIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSByZXN1bWUKKyAqIEBzdGFydHVwOiBhZGRpdGlvbmFsIGluaXQgb3BlcmF0aW9uIGZvciBzbGF2ZSBkZXZpY2VzCisgKiBAZHJpdmVyOiBzb3VuZHdpcmUgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIGluaXRpYWxpemUgbmFtZSBhbmQKKyAqIG93bmVyIGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlCisgKiBAaWRfdGFibGU6IGxpc3Qgb2Ygc291bmR3aXJlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCisgKi8KK3N0cnVjdCBzd3JfZHJpdmVyIHsKKwlpbnQJKCpwcm9iZSkoc3RydWN0IHN3cl9kZXZpY2UgKnN3cik7CisJaW50CSgqcmVtb3ZlKShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKTsKKwl2b2lkCSgqc2h1dGRvd24pKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOworCWludAkoKnN1c3BlbmQpKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IsIHBtX21lc3NhZ2VfdCBwbWVzZyk7CisJaW50CSgqcmVzdW1lKShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKTsKKwlpbnQJKCpkZXZpY2VfdXApKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOworCWludAkoKmRldmljZV9kb3duKShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKTsKKwlpbnQJKCpyZXNldF9kZXZpY2UpKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOworCWludAkoKnN0YXJ0dXApKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyCQlkcml2ZXI7CisJY29uc3Qgc3RydWN0IHN3cl9kZXZpY2VfaWQJKmlkX3RhYmxlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3dyX2RyaXZlciAqdG9fc3dyX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBkcnYgPyBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3Qgc3dyX2RyaXZlciwgZHJpdmVyKSA6IE5VTEw7Cit9CisKKy8qCisgKiBzdHJ1Y3Qgc3dyX2JvYXJkaW5mbyAtIERlY2xhcmUgYm9hcmQgaW5mbyBmb3Igc291bmR3aXJlIGRldmljZSBicmluZ3VwCisgKiBAbmFtZTogbmFtZSB0byBpbml0aWFsaXplIHN3cl9kZXZpY2UubmFtZQorICogQGJ1c19udW06IGlkZW50aWZpZXMgd2hpY2ggc291bmR3aXJlIG1hc3RlciBwYXJlbnRzIHRoZSBzb3VuZHdpcmUKKyAqIHNsYXZlX2RldmljZQorICogQGFkZHI6IHJlcHJlc2VudHMgImVhLWFkZHIiIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKKyAqIEBvZl9ub2RlOiBwb2ludGVyIHRvIE9wZW5GaXJtd2FyZSBkZXZpY2Ugbm9kZQorICogQHN3cl9zbGF2ZTogZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBzb3VuZHdpcmUKKyAqLworc3RydWN0IHN3cl9ib2FyZGluZm8geworCWNoYXIgICAgICAgICAgICAgICBuYW1lW1NPVU5EV0lSRV9OQU1FX1NJWkVdOworCWludCAgICAgICAgICAgICAgICBidXNfbnVtOworCXU2NAkJICAgYWRkcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJc3RydWN0IHN3cl9kZXZpY2UgICpzd3Jfc2xhdmU7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKnN3cl9nZXRfY3RybF9kYXRhKGNvbnN0IHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCit7CisJcmV0dXJuIG1hc3RlciA/IGRldl9nZXRfZHJ2ZGF0YSgmbWFzdGVyLT5kZXYpIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3cl9zZXRfY3RybF9kYXRhKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZtYXN0ZXItPmRldiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3dyX2dldF9kZXZfZGF0YShjb25zdCBzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYgPyBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KSA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd3Jfc2V0X2Rldl9kYXRhKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgZGF0YSk7Cit9CisKK2V4dGVybiBpbnQgc3dyX3N0YXJ0dXBfZGV2aWNlcyhzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2Rldik7CisKK2V4dGVybiBzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX25ld19kZXZpY2Uoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKKwkJCQlzdHJ1Y3Qgc3dyX2JvYXJkaW5mbyBjb25zdCAqaW5mbyk7CisKK2V4dGVybiBpbnQgb2ZfcmVnaXN0ZXJfc3dyX2RldmljZXMoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3Rlcik7CisKK2V4dGVybiB2b2lkIHN3cl9wb3J0X3Jlc3BvbnNlKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyLCB1OCB0aWQpOworCitleHRlcm4gaW50IHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU2NCBkZXZfaWQsCisJCQl1OCAqZGV2X251bSk7CisKK2V4dGVybiBpbnQgc3dyX3JlYWQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAorCQkJdm9pZCAqYnVmLCB1MzIgbGVuKTsKKworZXh0ZXJuIGludCBzd3Jfd3JpdGUoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAorCQkJY29uc3Qgdm9pZCAqYnVmKTsKKworZXh0ZXJuIGludCBzd3JfYnVsa193cml0ZShzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLCB2b2lkICpyZWdfYWRkciwKKwkJCSAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKKworZXh0ZXJuIGludCBzd3JfY29ubmVjdF9wb3J0KHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4ICpwb3J0X2lkLCB1OCBudW1fcG9ydCwKKwkJCQl1OCAqY2hfbWFzaywgdTMyICpjaF9yYXRlLCB1OCAqbnVtX2NoKTsKKworZXh0ZXJuIGludCBzd3JfZGlzY29ubmVjdF9wb3J0KHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsCisJCQkJdTggKnBvcnRfaWQsIHU4IG51bV9wb3J0KTsKKworZXh0ZXJuIGludCBzd3Jfc2V0X2RldmljZV9ncm91cChzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldiwgdTggaWQpOworCitleHRlcm4gaW50IHN3cl9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHN3cl9kcml2ZXIgKmRydik7CisKK2V4dGVybiB2b2lkIHN3cl9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJ2KTsKKworZXh0ZXJuIGludCBzd3JfYWRkX2RldmljZShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzd3JfZGV2aWNlICpzd3JkZXYpOworZXh0ZXJuIHZvaWQgc3dyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHN3cl9kZXZpY2UgKnN3cik7CisKK2V4dGVybiB2b2lkIHN3cl9tYXN0ZXJfYWRkX2JvYXJkZGV2aWNlcyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKTsKKworZXh0ZXJuIHZvaWQgc3dyX3VucmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpOworCitleHRlcm4gaW50IHN3cl9yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3Rlcik7CisKK2V4dGVybiBpbnQgc3dyX2RldmljZV91cChzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2Rldik7CisKK2V4dGVybiBpbnQgc3dyX2RldmljZV9kb3duKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KTsKKworZXh0ZXJuIGludCBzd3JfcmVzZXRfZGV2aWNlKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KTsKKworZXh0ZXJuIGludCBzd3Jfc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2woc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYsIHU4IGRldl9udW0sCisJCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKK2V4dGVybiBpbnQgc3dyX3JlbW92ZV9mcm9tX2dyb3VwKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4IGRldl9udW0pOworI2VuZGlmIC8qIF9MSU5VWF9TT1VORFdJUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oIGIvaW5jbHVkZS9saW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWI5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NvdW5kd2lyZS9zd3Itd2NkLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NXUl9XQ0RfSAorI2RlZmluZSBfTElOVVhfU1dSX1dDRF9ICisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK2VudW0geworCVNXUl9DSF9NQVAsCisJU1dSX0RFVklDRV9ET1dOLAorCVNXUl9ERVZJQ0VfVVAsCisJU1dSX1NVQlNZU19SRVNUQVJULAorCVNXUl9TRVRfTlVNX1JYX0NILAorfTsKKworc3RydWN0IHN3cl9tc3RyX3BvcnQgeworCWludCBudW1fcG9ydDsKKwl1OCAqcG9ydDsKK307CisKK2V4dGVybiBpbnQgc3dybV93Y2Rfbm90aWZ5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHUzMiBpZCwgdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBfTElOVVhfU1dSX1dDRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9xY29tL2xpcXVpZF9kb2NrLmggYi9pbmNsdWRlL3NvYy9xY29tL2xpcXVpZF9kb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2ODIyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc29jL3Fjb20vbGlxdWlkX2RvY2suaApAQCAtMCwwICsxLDIxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19RQ09NX0xJUVVJRF9ET0NLKQordm9pZCByZWdpc3Rlcl9saXF1aWRfZG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Cit2b2lkIHVucmVnaXN0ZXJfbGlxdWlkX2RvY2tfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9saXF1aWRfZG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9saXF1aWRfZG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikgeyB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWRzcF9lcnIuaCBiL2luY2x1ZGUvc291bmQvYWRzcF9lcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JlOTFkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9hZHNwX2Vyci5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BRFNQX0VSUl9fCisjZGVmaW5lIF9fQURTUF9FUlJfXworCitpbnQgYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSh1MzIgYWRzcF9lcnJvcik7CisKK2NoYXIgKmFkc3BfZXJyX2dldF9lcnJfc3RyKHUzMiBhZHNwX2Vycm9yKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2Fwcl9hdWRpby12Mi5oIGIvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8tdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTJlYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8tdjIuaApAQCAtMCwwICsxLDk5MDEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2lmbmRlZiBfQVBSX0FVRElPX1YyX0hfCisjZGVmaW5lIF9BUFJfQVVESU9fVjJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisKKy8qIHNpemUgb2YgaGVhZGVyIG5lZWRlZCBmb3IgcGFzc2luZyBkYXRhIG91dCBvZiBiYW5kICovCisjZGVmaW5lIEFQUl9DTURfT0JfSERSX1NaICAxMgorCisvKiBzaXplIG9mIGhlYWRlciBuZWVkZWQgZm9yIGdldHRpbmcgZGF0YSAqLworI2RlZmluZSBBUFJfQ01EX0dFVF9IRFJfU1ogMTYKKworc3RydWN0IHBhcmFtX291dGJhbmQgeworCXNpemVfdCAgICAgICBzaXplOworCXZvaWQgICAgICAgICprdmFkZHI7CisJcGh5c19hZGRyX3QgIHBhZGRyOworfTsKKworI2RlZmluZSBBRFNQX0FETV9WRVJTSU9OICAgIDB4MDAwNzAwMDAKKworI2RlZmluZSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgICAgMHgwMDAxMDMyMgorI2RlZmluZSBBRE1fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgMHgwMDAxMDMyMworI2RlZmluZSBBRE1fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUyAweDAwMDEwMzI0CisKKyNkZWZpbmUgQURNX0NNRF9NQVRSSVhfTUFQX1JPVVRJTkdTX1Y1IDB4MDAwMTAzMjUKKyNkZWZpbmUgQURNX0NNRF9TVFJFQU1fREVWSUNFX01BUF9ST1VUSU5HU19WNSAweDAwMDEwMzNECisvKiBFbnVtZXJhdGlvbiBmb3IgYW4gYXVkaW8gUnggbWF0cml4IElELiovCisjZGVmaW5lIEFETV9NQVRSSVhfSURfQVVESU9fUlggICAgICAgICAgICAgIDAKKworI2RlZmluZSBBRE1fTUFUUklYX0lEX0FVRElPX1RYICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQURNX01BVFJJWF9JRF9DT01QUkVTU0VEX0FVRElPX1JYICAgMgorLyogRW51bWVyYXRpb24gZm9yIGFuIGF1ZGlvIFR4IG1hdHJpeCBJRC4qLworI2RlZmluZSBBRE1fTUFUUklYX0lEX0FVRElPWCAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFETV9NQVhfQ09QUFMgNQorCisvKiBtYWtlIHN1cmUgdGhpcyBtYXRjaGVzIHdpdGggbXNtX2F1ZGlvX2NhbGlicmF0aW9uICovCisjZGVmaW5lIFNQX1YyX05VTV9NQVhfU1BLUiAyCisKKy8qIFNlc3Npb24gbWFwIG5vZGUgc3RydWN0dXJlLgorICogSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFyZSBudW1fY29wcHMKKyAqIGVudHJpZXMgb2YgQ09QUCBJRHMuIFRoZSBDT1BQIElEcyBhcmUgMTYgYml0cywgc28KKyAqIHRoZXJlIG1pZ2h0IGJlIGEgcGFkZGluZyAxNi1iaXQgZmllbGQgaWYgbnVtX2NvcHBzCisgKiBpcyBvZGQuCisgKi8KK3N0cnVjdCBhZG1fc2Vzc2lvbl9tYXBfbm9kZV92NSB7CisJdTE2ICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZDsKKwkvKiBIYW5kbGUgb2YgdGhlIEFTTSBzZXNzaW9uIHRvIGJlIHJvdXRlZC4gU3VwcG9ydGVkIHZhbHVlczogMQorCSAqIHRvIDguCisJICovCisKKworCXUxNiAgICAgICAgICAgICAgICAgIG51bV9jb3BwczsKKwkvKiBOdW1iZXIgb2YgQ09QUHMgdG8gd2hpY2ggdGhpcyBzZXNzaW9uIGlzIHRvIGJlIHJvdXRlZC4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIDwgbnVtX2NvcHBzIDw9IEFETV9NQVhfQ09QUFMuCisJICovCit9IF9fcGFja2VkOworCisvKiAgUGF5bG9hZCBvZiB0aGUgI0FETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNSBjb21tYW5kLgorICoJSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFyZSBudW1fc2Vzc2lvbnMgb2YgdGhlIHNlc3Npb24gbWFwCisgKglub2RlIHBheWxvYWQgKGFkbV9zZXNzaW9uX21hcF9ub2RlX3Y1KS4KKyAqLworCitzdHJ1Y3QgYWRtX2NtZF9tYXRyaXhfbWFwX3JvdXRpbmdzX3Y1IHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisKKwl1MzIgICAgICAgICAgICAgICAgICBtYXRyaXhfaWQ7CisJLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1hdHJpeCBJRCBpcyBBdWRpbyBSeCAoMCkgb3IgQXVkaW8gVHgKKwkgKiAoMSkuIFVzZSB0aGUgQURNX01BVFJJWF9JRF9BVURJT19SWCBvciBBRE1fTUFUUklYX0lEX0FVRElPWAorCSAqIG1hY3JvcyB0byBzZXQgdGhpcyBmaWVsZC4KKwkgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBudW1fc2Vzc2lvbnM7CisJLyogTnVtYmVyIG9mIHNlc3Npb25zIGJlaW5nIHVwZGF0ZWQgYnkgdGhpcyBjb21tYW5kIChvcHRpb25hbCkuICovCit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbW1hbmQgYWxsb3dzIGEgY2xpZW50IHRvIG9wZW4gYSBDT1BQL1ZvaWNlIFByb2MuIFRYIG1vZHVsZQorICogYW5kIHNldHMgdXAgdGhlIGRldmljZSBzZXNzaW9uOiBNYXRyaXggLT4gQ09QUCAtPiBBRkUgb24gdGhlIFJYCisgKiBhbmQgQUZFIC0+IENPUFAgLT4gTWF0cml4IG9uIHRoZSBUWC4gVGhpcyBlbmFibGVzIFBDTSBkYXRhIHRvCisgKiBiZSB0cmFuc2ZlcnJlZCB0by9mcm9tIHRoZSBlbmRwb2ludCAoQUZFUG9ydElEKS4KKyAqCisgKiBAcmV0dXJuCisgKiAjQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNSB3aXRoIHRoZSByZXN1bHRpbmcgc3RhdHVzIGFuZCBDT1BQIElELgorICovCisjZGVmaW5lIEFETV9DTURfREVWSUNFX09QRU5fVjUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMjYKKworLyogRGVmaW5pdGlvbiBmb3IgYSBsb3cgbGF0ZW5jeSBzdHJlYW0gc2Vzc2lvbi4gKi8KKyNkZWZpbmUgQURNX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OCQkJMHgyMDAwCisKKy8qIERlZmluaXRpb24gZm9yIGEgdWx0cmEgbG93IGxhdGVuY3kgc3RyZWFtIHNlc3Npb24uICovCisjZGVmaW5lIEFETV9VTFRSQV9MT1dfTEFURU5DWV9ERVZJQ0VfU0VTU0lPTgkJMHg0MDAwCisKKy8qIERlZmluaXRpb24gZm9yIGEgdWx0cmEgbG93IGxhdGVuY3kgd2l0aCBQb3N0IFByb2Nlc3Npbmcgc3RyZWFtIHNlc3Npb24uICovCisjZGVmaW5lIEFETV9VTExfUE9TVF9QUk9DRVNTSU5HX0RFVklDRV9TRVNTSU9OCQkweDgwMDAKKworLyogRGVmaW5pdGlvbiBmb3IgYSBsZWdhY3kgZGV2aWNlIHNlc3Npb24uICovCisjZGVmaW5lIEFETV9MRUdBQ1lfREVWSUNFX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogSW5kaWNhdGVzIHRoYXQgZW5kcG9pbnRfaWRfMiBpcyB0byBiZSBpZ25vcmVkLiovCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX0VORF9QT0lOVF9JRF8yX0lHTk9SRQkJCQkweEZGRkYKKworI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9NT0RFX09GX09QRVJBVElPTl9SWF9QQVRIX0NPUFAJCSAxCisKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5fTU9ERV9PRl9PUEVSQVRJT05YX1BBVEhfTElWRV9DT1BQCQkgMgorCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX01PREVfT0ZfT1BFUkFUSU9OWF9QQVRIX05PTl9MSVZFX0NPUFAJIDMKKworLyogSW5kaWNhdGVzIHRoYXQgYW4gYXVkaW8gQ09QUCBpcyB0byBzZW5kL3JlY2VpdmUgYSBtb25vIFBDTQorICogc3RyZWFtIHRvL2Zyb20KKyAqCUVORF9QT0lOVF9JRF8xLgorICovCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX0NIQU5ORUxfQ09ORklHX01PTk8JCTEKKworLyogSW5kaWNhdGVzIHRoYXQgYW4gYXVkaW8gQ09QUCBpcyB0byBzZW5kL3JlY2VpdmUgYQorICoJc3RlcmVvIFBDTSBzdHJlYW0gdG8vZnJvbSBFTkRfUE9JTlRfSURfMS4KKyAqLworI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9DSEFOTkVMX0NPTkZJR19TVEVSRU8JCTIKKworLyogU2FtcGxlIHJhdGUgaXMgODAwMCBIei4qLworI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9TQU1QTEVfUkFURV84SyA4MDAwCisKKy8qIFNhbXBsZSByYXRlIGlzIDE2MDAwIEh6LiovCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX1NBTVBMRV9SQVRFXzE2SyAxNjAwMAorCisvKiBTYW1wbGUgcmF0ZSBpcyA0ODAwMCBIei4qLworI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9TQU1QTEVfUkFURV80OEsgNDgwMDAKKworLyogRGVmaW5pdGlvbiBmb3IgYSBDT1BQIGxpdmUgaW5wdXQgZmxhZyBiaXRtYXNrLiovCisjZGVmaW5lIEFETV9CSVRfTUFTS19DT1BQX0xJVkVfSU5QVVRfRkxBRyAoMHgwMDAxVSkKKworLyogRGVmaW5pdGlvbiBmb3IgYSBDT1BQIGxpdmUgc2hpZnQgdmFsdWUgYml0bWFzay4qLworI2RlZmluZSBBRE1fU0hJRlRfQ09QUF9MSVZFX0lOUFVUX0ZMQUcJIDAKKworLyogRGVmaW5pdGlvbiBmb3IgdGhlIENPUFAgSUQgYml0bWFzay4qLworI2RlZmluZSBBRE1fQklUX01BU0tfQ09QUF9JRCAgKDB4MDAwMEZGRkZVTCkKKworLyogRGVmaW5pdGlvbiBmb3IgdGhlIENPUFAgSUQgc2hpZnQgdmFsdWUuKi8KKyNkZWZpbmUgQURNX1NISUZUX0NPUFBfSUQJMAorCisvKiBEZWZpbml0aW9uIGZvciB0aGUgc2VydmljZSBJRCBiaXRtYXNrLiovCisjZGVmaW5lIEFETV9CSVRfTUFTS19TRVJWSUNFX0lEICAoMHgwMEZGMDAwMFVMKQorCisvKiBEZWZpbml0aW9uIGZvciB0aGUgc2VydmljZSBJRCBzaGlmdCB2YWx1ZS4qLworI2RlZmluZSBBRE1fU0hJRlRfU0VSVklDRV9JRAkxNgorCisvKiBEZWZpbml0aW9uIGZvciB0aGUgZG9tYWluIElEIGJpdG1hc2suKi8KKyNkZWZpbmUgQURNX0JJVF9NQVNLX0RPTUFJTl9JRCAgICAoMHhGRjAwMDAwMFVMKQorCisvKiBEZWZpbml0aW9uIGZvciB0aGUgZG9tYWluIElEIHNoaWZ0IHZhbHVlLiovCisjZGVmaW5lIEFETV9TSElGVF9ET01BSU5fSUQJMjQKKworLyogQURNIGRldmljZSBvcGVuIGNvbW1hbmQgcGF5bG9hZCBvZiB0aGUKKyAqICNBRE1fQ01EX0RFVklDRV9PUEVOX1Y1IGNvbW1hbmQuCisgKi8KK3N0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1IHsKKwlzdHJ1Y3QgYXByX2hkcgkJaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIGZsYWdzOworLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZAorICogdG8gemVyby4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbW9kZV9vZl9vcGVyYXRpb247CisvKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgQ09QUCBtdXN0IGJlIG9wZW5lZCBvbiB0aGUgVHggb3IgUngKKyAqIHBhdGguIFVzZSB0aGUgQURNX0NNRF9DT1BQX09QRU5fTU9ERV9PRl9PUEVSQVRJT05fKiBtYWNyb3MgZm9yCisgKiBzdXBwb3J0ZWQgdmFsdWVzIGFuZCBpbnRlcnByZXRhdGlvbi4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDB4MSAtLSBSeCBwYXRoIENPUFAKKyAqIC0gMHgyIC0tIFR4IHBhdGggbGl2ZSBDT1BQCisgKiAtIDB4MyAtLSBUeCBwYXRoIG5vbmxpdmUgQ09QUAorICogTGl2ZSBjb25uZWN0aW9ucyBjYXVzZSBzYW1wbGUgZGlzY2FyZGluZyBpbiB0aGUgVHggZGV2aWNlCisgKiBtYXRyaXggaWYgdGhlIGRlc3RpbmF0aW9uIG91dHB1dCBwb3J0cyBkbyBub3QgcHVsbCB0aGVtCisgKiBmYXN0IGVub3VnaC4gTm9ubGl2ZSBjb25uZWN0aW9ucyBxdWV1ZSB0aGUgc2FtcGxlcworICogaW5kZWZpbml0ZWx5LgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBlbmRwb2ludF9pZF8xOworLyogTG9naWNhbCBhbmQgcGh5c2ljYWwgZW5kcG9pbnQgSUQgb2YgdGhlIGF1ZGlvIHBhdGguCisgKiBJZiB0aGUgSUQgaXMgYSB2b2ljZSBwcm9jZXNzb3IgVHggYmxvY2ssIGl0IHJlY2VpdmVzIG5lYXIKKyAqIHNhbXBsZXMuCVN1cHBvcnRlZCB2YWx1ZXM6IEFueSBwc2V1ZG9wb3J0LCBBRkUgUnggcG9ydCwKKyAqIG9yIEFGRSBUeCBwb3J0IEZvciBhIGxpc3Qgb2YgdmFsaWQgSURzLCByZWZlciB0bworICogQHhoeXBlcnJlZntRNCxbUTRdfS4KKyAqIFE0ID0gSGV4YWdvbiBNdWx0aW1lZGlhOiBBRkUgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfaWRfMjsKKy8qIExvZ2ljYWwgYW5kIHBoeXNpY2FsIGVuZHBvaW50IElEIDIgZm9yIGEgdm9pY2UgcHJvY2Vzc29yCisgKiBUeCBibG9jay4KKyAqIFRoaXMgaXMgbm90IGFwcGxpY2FibGUgdG8gYXVkaW8gQ09QUC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIEFGRSBSeCBwb3J0CisgKiAtIDB4RkZGRiAtLSBFbmRwb2ludCAyIGlzIHVuYXZhaWxhYmxlIGFuZCB0aGUgdm9pY2UKKyAqIHByb2Nlc3NvciBUeAorICogYmxvY2sgaWdub3JlcyB0aGlzIGVuZHBvaW50CisgKiBXaGVuIHRoZSB2b2ljZSBwcm9jZXNzb3IgVHggYmxvY2sgaXMgY3JlYXRlZCBvbiB0aGUgYXVkaW8KKyAqIHJlY29yZCBwYXRoLAorICogaXQgY2FuIHJlY2VpdmUgZmFyLWVuZCBzYW1wbGVzIGZyb20gYW4gQUZFIFJ4IHBvcnQgaWYgdGhlCisgKiB2b2ljZSBjYWxsCisgKiBpcyBhY3RpdmUuIFRoZSBJRCBvZiB0aGUgQUZFIHBvcnQgaXMgcHJvdmlkZWQgaW4gdGhpcworICogZmllbGQuCisgKiBGb3IgYSBsaXN0IG9mIHZhbGlkIElEcywgcmVmZXIgQHhoeXBlcnJlZntRNCxbUTRdfS4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgdG9wb2xvZ3lfaWQ7CisvKiBBdWRpbyBDT1BQIHRvcG9sb2d5IElEOyAzMi1iaXQgR1VJRC4gKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGRldl9udW1fY2hhbm5lbDsKKy8qIE51bWJlciBvZiBjaGFubmVscyB0aGUgYXVkaW8gQ09QUCBzZW5kcyB0by9yZWNlaXZlcyBmcm9tCisgKiB0aGUgZW5kcG9pbnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDguCisgKiBUaGUgdmFsdWUgaXMgaWdub3JlZCBmb3IgdGhlIHZvaWNlIHByb2Nlc3NvciBUeCBibG9jaywKKyAqIHdoZXJlIGNoYW5uZWwKKyAqIGNvbmZpZ3VyYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSB0b3BvbG9neSBJRC4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOworLyogQml0IHdpZHRoIChpbiBiaXRzKSB0aGF0IHRoZSBhdWRpbyBDT1BQIHNlbmRzIHRvL3JlY2VpdmVzCisgKiBmcm9tIHRoZQorICogZW5kcG9pbnQuIFRoZSB2YWx1ZSBpcyBpZ25vcmVkIGZvciB0aGUgdm9pY2UgcHJvY2Vzc2luZworICogVHggYmxvY2ssCisgKiB3aGVyZSB0aGUgUENNIHdpZHRoIGlzIDE2IGJpdHMuCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworLyogU2FtcGxpbmcgcmF0ZSBhdCB3aGljaCB0aGUgYXVkaW8gQ09QUC92b2ljZSBwcm9jZXNzb3IKKyAqIFR4IGJsb2NrCisgKiBpbnRlcmZhY2VzIHdpdGggdGhlIGVuZHBvaW50LgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3Igdm9pY2UgcHJvY2Vzc29yIFR4OiA4MDAwLCAxNjAwMCwKKyAqIDQ4MDAwIEh6CisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhdWRpbyBDT1BQOiA+MCBhbmQgPD0xOTIga0h6CisgKi8KKworCXU4ICAgICAgICAgICAgICAgICAgIGRldl9jaGFubmVsX21hcHBpbmdbOF07CisvKiBBcnJheSBvZiBjaGFubmVsIG1hcHBpbmcgb2YgYnVmZmVycyB0aGF0IHRoZSBhdWRpbyBDT1BQCisgKiBzZW5kcyB0byB0aGUgZW5kcG9pbnQuIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbAorICogSSBpbnNpZGUgdGhlIGJ1ZmZlciwgd2hlcmUgMCA8IGkgPCBkZXZfbnVtX2NoYW5uZWwuCisgKiBUaGlzIHZhbHVlIGlzIHJlbGV2YW50IG9ubHkgZm9yIGFuIGF1ZGlvIFJ4IENPUFAuCisgKiBGb3IgdGhlIHZvaWNlIHByb2Nlc3NvciBibG9jayBhbmQgVHggYXVkaW8gYmxvY2ssIHRoaXMgZmllbGQKKyAqIGlzIHNldCB0byB6ZXJvIGFuZCBpcyBpZ25vcmVkLgorICovCit9IF9fcGFja2VkOworCisvKgorICoJVGhpcyBjb21tYW5kIGFsbG93cyB0aGUgY2xpZW50IHRvIGNsb3NlIGEgQ09QUCBhbmQgZGlzY29ubmVjdAorICoJdGhlIGRldmljZSBzZXNzaW9uLgorICovCisjZGVmaW5lIEFETV9DTURfREVWSUNFX0NMT1NFX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMjcKKworLyogU2V0cyBvbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHRvIGEgQ09QUC4gKi8KKyNkZWZpbmUgQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMyOAorCisvKiAgUGF5bG9hZCBvZiB0aGUgI0FETV9DTURfU0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLgorICoJSWYgdGhlIGRhdGFfcGF5bG9hZF9hZGRyX2xzdyBhbmQgZGF0YV9wYXlsb2FkX2FkZHJfbXN3IGVsZW1lbnQKKyAqCWFyZSBOVUxMLCBhIHNlcmllcyBvZiBhZG1fcGFyYW1fZGF0YXN0cnVjdHVyZXMgaW1tZWRpYXRlbHkKKyAqCWZvbGxvd3MsIHdob3NlIHRvdGFsIHNpemUgaXMgZGF0YV9wYXlsb2FkX3NpemUgYnl0ZXMuCisgKi8KK3N0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIJCXBheWxvYWRfYWRkcl9sc3c7CisvKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLworCXUzMgkJcGF5bG9hZF9hZGRyX21zdzsKKy8qIE1TVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuICovCisKKwl1MzIJCW1lbV9tYXBfaGFuZGxlOworLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCisgKiBjb21tYW5kCisgKgorICogSWYgbWVtX21hcF9oYW5kbGUgaXMgemVybyBpbXBsaWVzIHRoZSBtZXNzYWdlIGlzIGluCisgKiB0aGUgcGF5bG9hZAorICovCisKKwl1MzIJCXBheWxvYWRfc2l6ZTsKKy8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhcmlhYmxlIHBheWxvYWQgYWNjb21wYW55aW5nIHRoaXMKKyAqIG1lc3NhZ2Ugb3IKKyAqIGluIHNoYXJlZCBtZW1vcnkuIFRoaXMgaXMgdXNlZCBmb3IgcGFyc2luZyB0aGUgcGFyYW1ldGVyCisgKiBwYXlsb2FkLgorICovCit9IF9fcGFja2VkOworCisvKiAgUGF5bG9hZCBmb3JtYXQgZm9yIENPUFAgcGFyYW1ldGVyIGRhdGEuCisgKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIHBhcmFtX3NpemUgYnl0ZXMKKyAqIG9mIHBhcmFtZXRlcgorICogZGF0YS4KKyAqLworc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IHsKKwl1MzIgICAgICAgICAgICAgICAgICBtb2R1bGVfaWQ7CisJLyogVW5pcXVlIElEIG9mIHRoZSBtb2R1bGUuICovCisJdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7CisJLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCisJdTE2ICAgICAgICAgICAgICAgICAgcGFyYW1fc2l6ZTsKKwkvKiBEYXRhIHNpemUgb2YgdGhlIHBhcmFtX2lkL21vZHVsZV9pZCBjb21iaW5hdGlvbi4KKwkgKiBUaGlzIHZhbHVlIGlzIGEKKwkgKiBtdWx0aXBsZSBvZiA0IGJ5dGVzLgorCSAqLworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzLgorCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4KKwkgKi8KK30gX19wYWNrZWQ7CisKKy8qIHNldCBjdXN0b21pemVkIG1peGluZyBvbiBtYXRyaXggbWl4ZXIgKi8KKyNkZWZpbmUgQURNX0NNRF9TRVRfUFNQRF9NVE1YX1NUUlRSX1BBUkFNU19WNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzNDQKK3N0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJLyogTFNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLworCXUzMgkJcGF5bG9hZF9hZGRyX2xzdzsKKwkvKiBNU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiovCisJdTMyCQlwYXlsb2FkX2FkZHJfbXN3OworCS8qIE1lbW9yeSBtYXAgaGFuZGxlIHJldHVybmVkIGJ5IEFETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAqLworCS8qIGNvbW1hbmQuIElmIG1lbV9tYXBfaGFuZGxlIGlzIHplcm8gaW1wbGllcyB0aGUgbWVzc2FnZSBpcyBpbiAqLworCS8qIHRoZSBwYXlsb2FkICovCisJdTMyCQltZW1fbWFwX2hhbmRsZTsKKwkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGFjY29tcGFueWluZyB0aGlzICovCisJLyogbWVzc2FnZSBvciBpbiBzaGFyZWQgbWVtb3J5LiBUaGlzIGlzIHVzZWQgZm9yIHBhcnNpbmcgdGhlICovCisJLyogcGFyYW1ldGVyIHBheWxvYWQuICovCisJdTMyCQlwYXlsb2FkX3NpemU7CisJdTE2CQlkaXJlY3Rpb247CisJdTE2CQlzZXNzaW9uaWQ7CisJdTE2CQlkZXZpY2VpZDsKKwl1MTYJCXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyogRGVmaW5lZCBzcGVjaWZpY2FsbHkgZm9yIGluLWJhbmQgdXNlLCBpbmNsdWRlcyBwYXJhbXMgKi8KK3N0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJLyogTFNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLworCXUzMiAgICAgICAgICAgICBwYXlsb2FkX2FkZHJfbHN3OworCS8qIE1TVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuKi8KKwl1MzIgICAgICAgICAgICAgcGF5bG9hZF9hZGRyX21zdzsKKwkvKiBNZW1vcnkgbWFwIGhhbmRsZSByZXR1cm5lZCBieSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgKi8KKwkvKiBjb21tYW5kLiBJZiBtZW1fbWFwX2hhbmRsZSBpcyB6ZXJvIGltcGxpZXMgdGhlIG1lc3NhZ2UgaXMgaW4gKi8KKwkvKiB0aGUgcGF5bG9hZCAqLworCXUzMiAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKwkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGFjY29tcGFueWluZyB0aGlzICovCisJLyogbWVzc2FnZSBvciBpbiBzaGFyZWQgbWVtb3J5LiBUaGlzIGlzIHVzZWQgZm9yIHBhcnNpbmcgdGhlICovCisJLyogcGFyYW1ldGVyIHBheWxvYWQuICovCisJdTMyICAgICAgICAgICAgIHBheWxvYWRfc2l6ZTsKKwkvKiBQYXJhbWV0ZXJzIHBhc3NlZCBmb3IgaW4gYmFuZCBwYXlsb2FkICovCisJc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1ICAgICAgICBwYXJhbXM7Cit9IF9fcGFja2VkOworCisvKiBSZXR1cm5zIHRoZSBzdGF0dXMgYW5kIENPUFAgSUQgdG8gYW4gI0FETV9DTURfREVWSUNFX09QRU5fVjUgY29tbWFuZC4KKyAqLworI2RlZmluZSBBRE1fQ01EUlNQX0RFVklDRV9PUEVOX1Y1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMjkKKworLyogIFBheWxvYWQgb2YgdGhlICNBRE1fQ01EUlNQX0RFVklDRV9PUEVOX1Y1IG1lc3NhZ2UsCisgKgl3aGljaCByZXR1cm5zIHRoZQorICoJc3RhdHVzIGFuZCBDT1BQIElEIHRvIGFuICNBRE1fQ01EX0RFVklDRV9PUEVOX1Y1IGNvbW1hbmQuCisgKi8KK3N0cnVjdCBhZG1fY21kX3JzcF9kZXZpY2Vfb3Blbl92NSB7CisJdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOworCS8qIFN0YXR1cyBtZXNzYWdlIChlcnJvciBjb2RlKS4qLworCisJdTE2ICAgICAgICAgICAgICAgICAgY29wcF9pZDsKKwkvKiBDT1BQIElEOiAgU3VwcG9ydGVkIHZhbHVlczogMCA8PSBjb3BwX2lkIDwgQURNX01BWF9DT1BQUyovCisKKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBSZXNlcnZlZC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbW1hbmQgYWxsb3dzIGEgcXVlcnkgb2Ygb25lIENPUFAgcGFyYW1ldGVyLiAqLworI2RlZmluZSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMkEKKworLyogIFBheWxvYWQgYW4gI0FETV9DTURfR0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLiAqLworc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX2xzdzsKKwkvKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiovCisKKwl1MzIgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9tc3c7CisJLyogTVNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLworCisJLyogSWYgdGhlIG1lbV9tYXBfaGFuZGxlIGlzIG5vbiB6ZXJvLAorCSAqIG9uIEFDSywgdGhlIFBhcmFtRGF0YSBwYXlsb2FkcyBiZWdpbiBhdAorCSAqIHRoZSBhZGRyZXNzIHNwZWNpZmllZCAob3V0LW9mLWJhbmQpLgorCSAqLworCisJdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisJLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQKKwkgKiBieSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZC4KKwkgKiBJZiB0aGUgbWVtX21hcF9oYW5kbGUgaXMgMCwgaXQgaW1wbGllcyB0aGF0CisJICogdGhlIEFDSydzIHBheWxvYWQgd2lsbCBjb250YWluIHRoZSBQYXJhbURhdGEgKGluLWJhbmQpLgorCSAqLworCisJdTMyICAgICAgICAgICAgICAgICAgbW9kdWxlX2lkOworCS8qIFVuaXF1ZSBJRCBvZiB0aGUgbW9kdWxlLiAqLworCisJdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7CisJLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBwYXJhbV9tYXhfc2l6ZTsKKwkvKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyCisJICpJRC9tb2R1bGUgSUQgY29tYmluYXRpb24uIFRoaXMKKwkgKiBmaWVsZCBpcyBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCisJICovCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBlbmhhbmNlbWVudHMuCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgorCSAqLworfSBfX3BhY2tlZDsKKworLyogUmV0dXJucyBwYXJhbWV0ZXIgdmFsdWVzCisgKglpbiByZXNwb25zZSB0byBhbiAjQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1IGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgQURNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1Y1CQkweDAwMDEwMzJCCisKKy8qIFBheWxvYWQgb2YgdGhlICNBRE1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjUgbWVzc2FnZSwKKyAqIHdoaWNoIHJldHVybnMgcGFyYW1ldGVyIHZhbHVlcyBpbiByZXNwb25zZQorICogdG8gYW4gI0FETV9DTURfR0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLgorICogSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMKKyAqIHN0cnVjdHVyZSBpcyB0aGUgYWRtX3BhcmFtX2RhdGFfdjUKKyAqIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwcmUvcG9zdHByb2Nlc3NpbmcKKyAqIHBhcmFtZXRlciBkYXRhLiBGb3IgYW4gaW4tYmFuZAorICogc2NlbmFyaW8sIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGRlcGVuZHMKKyAqIG9uIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBhZG1fY21kX3JzcF9nZXRfcHBfcGFyYW1zX3Y1IHsKKwl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJLyogU3RhdHVzIG1lc3NhZ2UgKGVycm9yIGNvZGUpLiovCit9IF9fcGFja2VkOworCisvKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgc29mdCBzdGVwcGluZyB2b2x1bWUgcGFyYW1ldGVycy4gKi8KKworLyoKKyAqIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUworICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUuCisgKi8KKworc3RydWN0IGF1ZHByb2Nfc29mdHZvbHVtZV9wYXJhbXMgeworCXUzMiBwZXJpb2Q7CisJdTMyIHN0ZXA7CisJdTMyIHJhbXBpbmdjdXJ2ZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBJRCBvZiB0aGUgTWVkaWEgRm9ybWF0IENvbnZlcnRlciAoTUZDKSBtb2R1bGUuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAjQVVEUFJPQ19QQVJBTV9JRF9NRkNfT1VUUFVUX01FRElBX0ZPUk1BVAorICogI0FVRFBST0NfQ0hNSVhFUl9QQVJBTV9JRF9DT0VGRgorICovCisjZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX01GQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOTEyCisKKy8qIElEIG9mIHRoZSBPdXRwdXQgTWVkaWEgRm9ybWF0IHBhcmFtZXRlcnMgdXNlZCBieSBBVURQUk9DX01PRFVMRV9JRF9NRkMuCisgKgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfTUZDX09VVFBVVF9NRURJQV9GT1JNQVQgICAgICAgICAgICAweDAwMDEwOTEzCisKKworc3RydWN0IGF1ZHByb2NfbWZjX291dHB1dF9tZWRpYV9mbXQgeworCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgcGFyYW1zOworCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBkYXRhOworCXVpbnQzMl90IHNhbXBsaW5nX3JhdGU7CisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlOworCXVpbnQxNl90IG51bV9jaGFubmVsczsKKwl1aW50MTZfdCBjaGFubmVsX3R5cGVbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkcHJvY192b2x1bWVfY3RybF9tYXN0ZXJfZ2FpbiB7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBwYXJhbXM7CisJc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IGRhdGE7CisJLyogTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG1hc3Rlcl9nYWluOworCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkcHJvY19zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyB7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBwYXJhbXM7CisJc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IGRhdGE7CisvKgorICogUGVyaW9kIGluIG1pbGxpc2Vjb25kcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTUwMDAKKyAqLworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGVyaW9kOworLyoKKyAqIFN0ZXAgaW4gbWljcm9zZWNvbmRzLgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxNTAwMDAwMAorICovCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBzdGVwOworLyoKKyAqIFJhbXBpbmcgY3VydmUgdHlwZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTElORUFSCisgKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfRVhQCisgKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTE9HCisgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHJhbXBpbmdfY3VydmU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkcHJvY19lbmFibGVfcGFyYW1fdCB7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUgcHBfcGFyYW1zOworCS8qCisJICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlIGlzIGVuYWJsZWQuCisJICogVGhpcyBwYXJhbWV0ZXIgaXMgZ2VuZXJpYy9jb21tb24gcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBvcgorCSAqIGRldGVybWluZSB0aGUgc3RhdGUgb2YgYW55IGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlLgorCisJICogQHZhbHVlcyAwIDogRGlzYWJsZSAxOiBFbmFibGUKKwkgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZTsKK307CisKKy8qCisgKiBBbGxvd3MgYSBjbGllbnQgdG8gY29udHJvbCB0aGUgZ2FpbnMgb24gdmFyaW91cyBzZXNzaW9uLXRvLUNPUFAgcGF0aHMuCisgKi8KKyNkZWZpbmUgQURNX0NNRF9NQVRSSVhfUkFNUF9HQUlOU19WNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMkMKKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIHRhcmdldCBnYWluIGluIHRoZQorICoJY3VycmVudCBhZG1fc2Vzc2lvbl9jb3BwX2dhaW5fdjUKKyAqCXN0cnVjdHVyZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbAorICoJdGhlIHNlc3Npb24tdG8tQ09QUCBwYXRocyB0aGF0IGV4aXN0IGZvcgorICoJdGhlIHNwZWNpZmllZCBzZXNzaW9uLgorICovCisjZGVmaW5lIEFETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfQ09QUF9JRF9BTExfQ09OTkVDVEVEX0NPUFBTICAgICAweEZGRkYKKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIHRhcmdldCBnYWluIGlzCisgKiB0byBiZSBpbW1lZGlhdGVseSBhcHBsaWVkIHRvIHRoZQorICogc3BlY2lmaWVkIHNlc3Npb24tdG8tQ09QUCBwYXRoLAorICogd2l0aG91dCBhIHJhbXBpbmcgZmFzaGlvbi4KKyAqLworI2RlZmluZSBBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfRFVSQVRJT05fSU1NRURJQVRFICAgICAgICAgMHgwMDAwCisKKy8qIEVudW1lcmF0aW9uIGZvciBhIGxpbmVhciByYW1waW5nIGN1cnZlLiovCisjZGVmaW5lIEFETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfUkFNUF9DVVJWRV9MSU5FQVIgICAgICAgICAgICAgICAweDAwMDAKKworLyogIFBheWxvYWQgb2YgdGhlICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1Y1IGNvbW1hbmQuCisgKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIG51bV9nYWlucyBvZiB0aGUKKyAqIGFkbV9zZXNzaW9uX2NvcHBfZ2Fpbl92NXN0cnVjdHVyZS4KKyAqLworc3RydWN0IGFkbV9jbWRfbWF0cml4X3JhbXBfZ2FpbnNfdjUgeworCXUzMiAgICAgICAgICAgICAgICAgIG1hdHJpeF9pZDsKKy8qIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggSUQgaXMgQXVkaW8gUnggKDApIG9yIEF1ZGlvIFR4ICgxKS4KKyAqIFVzZSB0aGUgQURNX01BVFJJWF9JRF9BVURJT19SWCBvciAgQURNX01BVFJJWF9JRF9BVURJT1gKKyAqIG1hY3JvcyB0byBzZXQgdGhpcyBmaWVsZC4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2dhaW5zOworCS8qIE51bWJlciBvZiBnYWlucyBiZWluZyBhcHBsaWVkLiAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfZm9yX2FsaWduOworCS8qIFJlc2VydmVkLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uKi8KK30gX19wYWNrZWQ7CisKKy8qICBTZXNzaW9uLXRvLUNPUFAgcGF0aCBnYWluIHN0cnVjdHVyZSwgdXNlZCBieSB0aGUKKyAqCSNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1Y1IGNvbW1hbmQuCisgKglUaGlzIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIHRhcmdldAorICoJZ2FpbiAocGVyIGNoYW5uZWwpIHRoYXQgbXVzdCBiZSBhcHBsaWVkCisgKgl0byBhIHBhcnRpY3VsYXIgc2Vzc2lvbi10by1DT1BQIHBhdGggaW4KKyAqCXRoZSBhdWRpbyBtYXRyaXguIFRoZSBzdHJ1Y3R1cmUgY2FuCisgKglhbHNvIGJlIHVzZWQgdG8gYXBwbHkgdGhlIGdhaW4gZ2xvYmFsbHkKKyAqCXRvIGFsbCBzZXNzaW9uLXRvLUNPUFAgcGF0aHMgdGhhdAorICoJZXhpc3QgZm9yIHRoZSBnaXZlbiBzZXNzaW9uLgorICoJVGhlIGFEU1AgdXNlcyBkZXZpY2UgY2hhbm5lbCBtYXBwaW5nIHRvCisgKglkZXRlcm1pbmUgd2hpY2ggY2hhbm5lbCBnYWlucyB0bworICoJdXNlIGZyb20gdGhpcyBjb21tYW5kLiBGb3IgZXhhbXBsZSwKKyAqCWlmIHRoZSBkZXZpY2UgaXMgY29uZmlndXJlZCBhcyBzdGVyZW8sCisgKgl0aGUgYURTUCB1c2VzIG9ubHkgdGFyZ2V0X2dhaW5fY2hfMSBhbmQKKyAqCXRhcmdldF9nYWluX2NoXzIsIGFuZCBpdCBpZ25vcmVzCisgKgl0aGUgb3RoZXJzLgorICovCitzdHJ1Y3QgYWRtX3Nlc3Npb25fY29wcF9nYWluX3Y1IHsKKwl1MTYgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOworLyogSGFuZGxlIG9mIHRoZSBBU00gc2Vzc2lvbi4KKyAqCVN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOC4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgY29wcF9pZDsKKy8qIEhhbmRsZSBvZiB0aGUgQ09QUC4gR2FpbiB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIFNlc3Npb24gSUQKKyAqIENPUFAgSUQgcGF0aC4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmFtcF9kdXJhdGlvbjsKKy8qIER1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIG9mIHRoZSByYW1wIG92ZXIKKyAqIHdoaWNoIHRhcmdldCBnYWlucyBhcmUKKyAqIHRvIGJlIGFwcGxpZWQuIFVzZQorICogI0FETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfUkFNUF9EVVJBVElPTl9JTU1FRElBVEUKKyAqIHRvIGluZGljYXRlIHRoYXQgZ2FpbiBtdXN0IGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHN0ZXBfZHVyYXRpb247CisvKiBEdXJhdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSBvZiBlYWNoIHN0ZXAgaW4gdGhlIHJhbXAuCisgKiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIHJhbXBfZHVyYXRpb24gaXMgZXF1YWwgdG8KKyAqICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfRFVSQVRJT05fSU1NRURJQVRFLgorICogU3VwcG9ydGVkIHZhbHVlOiAxCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHJhbXBfY3VydmU7CisvKiBUeXBlIG9mIHJhbXBpbmcgY3VydmUuCisgKiBTdXBwb3J0ZWQgdmFsdWU6ICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfQ1VSVkVfTElORUFSCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkX2Zvcl9hbGlnbjsKKwkvKiBSZXNlcnZlZC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMTsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMSBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMjsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMiBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMzsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMyBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNDsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNCBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNTsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNSBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNjsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNiBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNzsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNyBpbiBRMTMgZm9ybWF0OyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfODsKKwkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgOCBpbiBRMTMgZm9ybWF0OyAqLworfSBfX3BhY2tlZDsKKworLyogQWxsb3dzIHRvIHNldCBtdXRlL3VubXV0ZSBvbiB2YXJpb3VzIHNlc3Npb24tdG8tQ09QUCBwYXRocy4KKyAqCUZvciBldmVyeSBzZXNzaW9uLXRvLUNPUFAgcGF0aCAoc3RyZWFtLWRldmljZSBpbnRlcmNvbm5lY3Rpb24pLAorICoJbXV0ZS91bm11dGUgY2FuIGJlIHNldCBpbmRpdmlkdWFsbHkgb24gdGhlIG91dHB1dCBjaGFubmVscy4KKyAqLworI2RlZmluZSBBRE1fQ01EX01BVFJJWF9NVVRFX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzJECisKKy8qIEluZGljYXRlcyB0aGF0IG11dGUvdW5tdXRlIGluIHRoZQorICoJY3VycmVudCBhZG1fc2Vzc2lvbl9jb3BwX211dGVfdjVzdHJ1Y3R1cmUKKyAqCWlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzZXNzaW9uLXRvLUNPUFAKKyAqCXBhdGhzIHRoYXQgZXhpc3QgZm9yIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4KKyAqLworI2RlZmluZSBBRE1fQ01EX01BVFJJWF9NVVRFX0NPUFBfSURfQUxMX0NPTk5FQ1RFRF9DT1BQUyAgICAgMHhGRkZGCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRF9NQVRSSVhfTVVURV9WNSBjb21tYW5kKi8KK3N0cnVjdCBhZG1fY21kX21hdHJpeF9tdXRlX3Y1IHsKKwl1MzIgICAgICAgICAgICAgICAgICBtYXRyaXhfaWQ7CisvKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IElEIGlzIEF1ZGlvIFJ4ICgwKSBvciBBdWRpbyBUeCAoMSkuCisgKiBVc2UgdGhlIEFETV9NQVRSSVhfSURfQVVESU9fUlggb3IgIEFETV9NQVRSSVhfSURfQVVESU9YCisgKiBtYWNyb3MgdG8gc2V0IHRoaXMgZmllbGQuCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQ7CisvKiBIYW5kbGUgb2YgdGhlIEFTTSBzZXNzaW9uLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4LgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBjb3BwX2lkOworLyogSGFuZGxlIG9mIHRoZSBDT1BQLgorICogVXNlIEFETV9DTURfTUFUUklYX01VVEVfQ09QUF9JRF9BTExfQ09OTkVDVEVEX0NPUFBTCisgKiB0byBpbmRpY2F0ZSB0aGF0IG11dGUvdW5tdXRlIG11c3QgYmUgYXBwbGllZCB0bworICogYWxsIHRoZSBDT1BQcyBjb25uZWN0ZWQgdG8gc2Vzc2lvbl9pZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDB4RkZGRiAtLSBBcHBseSBtdXRlL3VubXV0ZSB0byBhbGwgY29ubmVjdGVkIENPUFBzCisgKiAtIE90aGVyIHZhbHVlcyAtLSBWYWxpZCBDT1BQIElECisgKi8KKworCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzE7CisJLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDEgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCisKKwl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF8yOworCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCAyIGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLworCisJdTggICAgICAgICAgICAgICAgICBtdXRlX2ZsYWdfY2hfMzsKKwkvKiBNdXRlIGZsYWcgZm9yIGNoYW5uZWwgMyBpcyBzZXQgdG8gdW5tdXRlICgwKSBvciBtdXRlICgxKS4gKi8KKworCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzQ7CisJLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDQgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCisKKwl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF81OworCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCA1IGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLworCisJdTggICAgICAgICAgICAgICAgICBtdXRlX2ZsYWdfY2hfNjsKKwkvKiBNdXRlIGZsYWcgZm9yIGNoYW5uZWwgNiBpcyBzZXQgdG8gdW5tdXRlICgwKSBvciBtdXRlICgxKS4gKi8KKworCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzc7CisJLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDcgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCisKKwl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF84OworCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCA4IGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLworCisJdTE2ICAgICAgICAgICAgICAgICByYW1wX2R1cmF0aW9uOworLyogUGVyaW9kIChpbiBtaWxsaXNlY29uZHMpIG92ZXIgd2hpY2ggdGhlIHNvZnQgbXV0ZS91bm11dGUgd2lsbCBiZQorICogYXBwbGllZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgKERlZmF1bHQpIHRvIDB4RkZGRgorICogVGhlIGRlZmF1bHQgb2YgMCBtZWFucyBtdXRlL3VubXV0ZSB3aWxsIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfZm9yX2FsaWduOworCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9BQUNfU1RFUkVPX01JWF9DT0VGRl9TRUxFQ1RJT05fRkxBR19WMiAoMHgwMDAxMEREOCkKKworc3RydWN0IGFzbV9hYWNfc3RlcmVvX21peF9jb2VmZl9zZWxlY3Rpb25fcGFyYW1fdjIgeworCXN0cnVjdCBhcHJfaGRyICAgICAgICAgIGhkcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zaXplOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGFhY19zdGVyZW9fbWl4X2NvZWZmX2ZsYWc7Cit9IF9fcGFja2VkOworCisvKiBBbGxvd3MgYSBjbGllbnQgdG8gY29ubmVjdCB0aGUgZGVzaXJlZCBzdHJlYW0gdG8KKyAqIHRoZSBkZXNpcmVkIEFGRSBwb3J0IHRocm91Z2ggdGhlIHN0cmVhbSByb3V0ZXIKKyAqCisgKiBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBjbGllbnQgdG8gY29ubmVjdCBzcGVjaWZpZWQgc2Vzc2lvbiB0bworICogc3BlY2lmaWVkIEFGRSBwb3J0LiBUaGlzIGlzIHVzZWQgZm9yIGNvbXByZXNzZWQgc3RyZWFtcyBvbmx5CisgKiBvcGVuZWQgdXNpbmcgdGhlICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQgb3IKKyAqICNBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfQ09NUFJFU1NFRCBjb21tYW5kLgorICoKKyAqIEBwcmVyZXF1aXNpdGVzCisgKiBTZXNzaW9uIElEIGFuZCBBRkUgUG9ydCBJRCBtdXN0IGJlIHZhbGlkLgorICogI0FTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfQ09NUFJFU1NFRCBvcgorICogI0FTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9DT01QUkVTU0VECisgKiBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyBzZXNzaW9uLgorICovCisKKyNkZWZpbmUgQURNX0NNRF9DT05ORUNUX0FGRV9QT1JUX1Y1CTB4MDAwMTAzMkUKKyNkZWZpbmUgQURNX0NNRF9ESVNDT05ORUNUX0FGRV9QT1JUX1Y1CTB4MDAwMTAzMkYKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgUnggc3RyZWFtIHJvdXRlciBJRC4qLworI2RlZmluZSBBRE1fU1RSVFJfSURfUlggICAgICAgICAgICAgICAgICAgIDAKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgVHggc3RyZWFtIHJvdXRlciBJRC4qLworI2RlZmluZSBBRE1fU1RSVFJfSURYICAgICAgICAgICAgICAgICAgICAxCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRF9DT05ORUNUX0FGRV9QT1JUX1Y1IGNvbW1hbmQuKi8KK3N0cnVjdCBhZG1fY21kX2Nvbm5lY3RfYWZlX3BvcnRfdjUgeworCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7CisJdTggICAgICAgICAgICAgICAgICBtb2RlOworLyogSUQgb2YgdGhlIHN0cmVhbSByb3V0ZXIgKFJYL1RYKS4gVXNlIHRoZQorICogQURNX1NUUlRSX0lEX1JYIG9yIEFETV9TVFJUUl9JRFggbWFjcm9zCisgKiB0byBzZXQgdGhpcyBmaWVsZC4KKyAqLworCisJdTggICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOworCS8qIFNlc3Npb24gSUQgb2YgdGhlIHN0cmVhbSB0byBjb25uZWN0ICovCisKKwl1MTYgICAgICAgICAgICAgICAgIGFmZV9wb3J0X2lkOworCS8qIFBvcnQgSUQgb2YgdGhlIEFGRSBwb3J0IHRvIGNvbm5lY3QgdG8uKi8KKwl1MzIgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKKy8qIE51bWJlciBvZiBkZXZpY2UgY2hhbm5lbHMKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDIoQXVkaW8gU2FtcGxlIFBhY2tldCksCisgKiA4IChIQlIgQXVkaW8gU3RyZWFtIFNhbXBsZSBQYWNrZXQpCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgc2FtcGxpbmdfcmF0ZTsKKy8qIERldmljZSBzYW1wbGluZyByYXRlCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkKKyAqLworfSBfX3BhY2tlZDsKKworCisvKiBhZHNwX2FkbV9hcGkuaCAqLworCisKKy8qIFBvcnQgSUQuIFVwZGF0ZSBhZmVfZ2V0X3BvcnRfaW5kZXgKKyAqIHdoZW4gYSBuZXcgcG9ydCBpcyBhZGRlZCBoZXJlLgorICovCisjZGVmaW5lIFBSSU1BUllfSTJTX1JYIDAKKyNkZWZpbmUgUFJJTUFSWV9JMlNfVFggMQorI2RlZmluZSBTRUNPTkRBUllfSTJTX1JYIDQKKyNkZWZpbmUgU0VDT05EQVJZX0kyU19UWCA1CisjZGVmaW5lIE1JMlNfUlggNgorI2RlZmluZSBNSTJTX1RYIDcKKyNkZWZpbmUgSERNSV9SWCA4CisjZGVmaW5lIFJTVkRfMiA5CisjZGVmaW5lIFJTVkRfMyAxMAorI2RlZmluZSBESUdJX01JQ19UWCAxMQorI2RlZmluZSBWT0lDRTJfUExBWUJBQ0tfVFggMHg4MDAyCisjZGVmaW5lIFZPSUNFX1JFQ09SRF9SWCAweDgwMDMKKyNkZWZpbmUgVk9JQ0VfUkVDT1JEX1RYIDB4ODAwNAorI2RlZmluZSBWT0lDRV9QTEFZQkFDS19UWCAweDgwMDUKKworLyogU2xpbWJ1cyBNdWx0aSBjaGFubmVsIHBvcnQgaWQgcG9vbCAgKi8KKyNkZWZpbmUgU0xJTUJVU18wX1JYCQkweDQwMDAKKyNkZWZpbmUgU0xJTUJVU18wX1RYCQkweDQwMDEKKyNkZWZpbmUgU0xJTUJVU18xX1JYCQkweDQwMDIKKyNkZWZpbmUgU0xJTUJVU18xX1RYCQkweDQwMDMKKyNkZWZpbmUgU0xJTUJVU18yX1JYCQkweDQwMDQKKyNkZWZpbmUgU0xJTUJVU18yX1RYCQkweDQwMDUKKyNkZWZpbmUgU0xJTUJVU18zX1JYCQkweDQwMDYKKyNkZWZpbmUgU0xJTUJVU18zX1RYCQkweDQwMDcKKyNkZWZpbmUgU0xJTUJVU180X1JYCQkweDQwMDgKKyNkZWZpbmUgU0xJTUJVU180X1RYCQkweDQwMDkKKyNkZWZpbmUgU0xJTUJVU181X1JYCQkweDQwMGEKKyNkZWZpbmUgU0xJTUJVU181X1RYCQkweDQwMGIKKyNkZWZpbmUgU0xJTUJVU182X1JYCQkweDQwMGMKKyNkZWZpbmUgU0xJTUJVU182X1RYCQkweDQwMGQKKyNkZWZpbmUgU0xJTUJVU183X1JYCQkweDQwMGUKKyNkZWZpbmUgU0xJTUJVU183X1RYCQkweDQwMGYKKyNkZWZpbmUgU0xJTUJVU184X1JYCQkweDQwMTAKKyNkZWZpbmUgU0xJTUJVU184X1RYCQkweDQwMTEKKyNkZWZpbmUgU0xJTUJVU19QT1JUX0xBU1QJU0xJTUJVU184X1RYCisjZGVmaW5lIElOVF9CVF9TQ09fUlggMHgzMDAwCisjZGVmaW5lIElOVF9CVF9TQ09fVFggMHgzMDAxCisjZGVmaW5lIElOVF9CVF9BMkRQX1JYIDB4MzAwMgorI2RlZmluZSBJTlRfRk1fUlggMHgzMDA0CisjZGVmaW5lIElOVF9GTV9UWCAweDMwMDUKKyNkZWZpbmUgUlRfUFJPWFlfUE9SVF8wMDFfUlgJMHgyMDAwCisjZGVmaW5lIFJUX1BST1hZX1BPUlRfMDAxX1RYCTB4MjAwMQorI2RlZmluZSBESVNQTEFZX1BPUlRfUlgJMHg2MDIwCisKKyNkZWZpbmUgQUZFX1BPUlRfSU5WQUxJRCAweEZGRkYKKyNkZWZpbmUgU0xJTUJVU19JTlZBTElEIEFGRV9QT1JUX0lOVkFMSUQKKworI2RlZmluZSBBRkVfUE9SVF9DTURfU1RBUlQgMHgwMDAxMDBjYQorCisjZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfU1RBUlQgMAorI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX1NUT1AgMQorI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX0xPV19XTSAyCisjZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfSElfV00gMworCisjZGVmaW5lIEFEU1BfQUZFX1ZFUlNJT04gICAgMHgwMDIwMDAwMAorCisvKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgdGhlIGF1ZGlvIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgIEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU0laRQkweEYKKworLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIGludGVybmFsIEJULUZNIHBvcnRzLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9TSVpFCTB4NgorCisvKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgU0xJTWJ1czxzdXA+JnJlZzsKKyAqIDwvc3VwPiBtdWx0aWNoYW5uZWwKKyAqIHBvcnRzLgorICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfUkFOR0VfU0laRQkweEEKKworLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KKyNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU0laRQkweDIKKworLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHBzZXVkb3BvcnRzLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9QU0VVRE9QT1JUX1JBTkdFX1NJWkUJMHg1CisKKy8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgdGhlIGF1ZGlvIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgIEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU1RBUlQJMHgxMDAwCisKKy8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHRoZSBhdWRpbyBpbnRlcmZhY2UuICovCisjZGVmaW5lICBBRkVfUE9SVF9JRF9BVURJT19JRl9QT1JUX1JBTkdFX0VORCBcCisJKEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU1RBUlQgK1wKKwlBRkVfUE9SVF9JRF9BVURJT19JRl9QT1JUX1JBTkdFX1NJWkUgLSAxKQorCisvKiBTdGFydCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KKyNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQJMHgyMDAwCisKKy8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KKyNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfRU5EIFwKKwkoQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9TVEFSVCArXAorCUFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU0laRS0xKQorCisvKiBTdGFydCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIGludGVybmFsIEJULUZNIGRldmljZXMuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0ZNX1JBTkdFX1NUQVJUCTB4MzAwMAorCisvKiBFbmQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBpbnRlcm5hbCBCVC1GTSBkZXZpY2VzLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9FTkQgXAorCShBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9TVEFSVCArXAorCUFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0ZNX1JBTkdFX1NJWkUtMSkKKworLyoJU3RhcnQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBTTElNYnVzIGRldmljZXMuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfUkFOR0VfU1RBUlQJMHg0MDAwCisKKy8qCUVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIFNMSU1idXMgZGV2aWNlcy4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19SQU5HRV9FTkQgXAorCShBRkVfUE9SVF9JRF9TTElNQlVTX1JBTkdFX1NUQVJUICtcCisJQUZFX1BPUlRfSURfU0xJTUJVU19SQU5HRV9TSVpFLTEpCisKKy8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgcHNldWRvcG9ydHMuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1BTRVVET1BPUlRfUkFOR0VfU1RBUlQJMHg4MDAxCisKKy8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHBzZXVkb3BvcnRzLiAgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfUFNFVURPUE9SVF9SQU5HRV9FTkQgXAorCShBRkVfUE9SVF9JRF9QU0VVRE9QT1JUX1JBTkdFX1NUQVJUICtcCisJQUZFX1BPUlRfSURfUFNFVURPUE9SVF9SQU5HRV9TSVpFLTEpCisKKy8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgVERNIGRldmljZXMuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUCTB4OTAwMAorCisvKiBFbmQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBURE0gZGV2aWNlcy4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfRU5EIFwKKwkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQrMHg0MC0xKQorCisvKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgVERNIHBvcnRzLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TSVpFIFwKKwkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfRU5EIC0gXAorCUFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUKzEpCisKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWCAgICAgICAgIDB4MTAwMQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWCAgICAgICAweDEwMDIKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFggICAgICAgMHgxMDAzCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlggICAgICAgIDB4MTAwNAorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYICAgICAgICAweDEwMDUKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYICAgICAgMHgxMDA2CisjZGVmaW5lIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCAgICAgIDB4MTAwNworI2RlZmluZSBBVURJT19QT1JUX0lEX0kyU19SWCAgICAgICAgICAgICAgICAweDEwMDgKKyNkZWZpbmUgQUZFX1BPUlRfSURfRElHSVRBTF9NSUNfVFggICAgICAgICAgMHgxMDA5CisjZGVmaW5lIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYICAgICAgICAgIDB4MTAwQQorI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCAgICAgICAgICAweDEwMEIKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWCAgICAgICAgMHgxMDBDCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFggICAgICAgIDB4MTAwRAorI2RlZmluZSBBRkVfUE9SVF9JRF9NVUxUSUNIQU5fSERNSV9SWCAgICAgICAweDEwMEUKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxICAgMHgxMDEwCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWCAgICAgICAgIDB4MTAxMgorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFggICAgICAgICAweDEwMTMKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlggICAgICAgMHgxMDE0CisjZGVmaW5lIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYICAgICAgIDB4MTAxNQorI2RlZmluZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlggICAgICAgICAweDEwMTYKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYICAgICAgICAgMHgxMDE3CisvKiBJRCBvZiB0aGUgc2VuYXJ5IE1JMlMgUnggcG9ydC4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfUlggICAgICAgICAgMHgxMDE4CisvKiBJRCBvZiB0aGUgc2VuYXJ5IE1JMlMgVHggcG9ydC4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFggICAgICAgICAgMHgxMDE5CisvKiBJRCBvZiB0aGUgSW50ZXJuYWwgMCBNSTJTIFJ4IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwMkUKKy8qIElEIG9mIHRoZSBJbnRlcm5hbCAwIE1JMlMgVHggcG9ydCAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAyRgorLyogSUQgb2YgdGhlIEludGVybmFsIDEgTUkyUyBSeCBwb3J0ICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWCAgICAgICAgICAgICAgICAgMHgxMDMwCisvKiBJRCBvZiB0aGUgSW50ZXJuYWwgMSBNSTJTIFR4IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYICAgICAgICAgICAgICAgICAweDEwMzEKKy8qIElEIG9mIHRoZSBJbnRlcm5hbCAyIE1JMlMgUnggcG9ydCAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlggICAgICAgICAgICAgICAgIDB4MTAzMgorLyogSUQgb2YgdGhlIEludGVybmFsIDIgTUkyUyBUeCBwb3J0ICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWCAgICAgICAgICAgICAgICAgMHgxMDMzCisvKiBJRCBvZiB0aGUgSW50ZXJuYWwgMyBNSTJTIFJ4IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwMzQKKy8qIElEIG9mIHRoZSBJbnRlcm5hbCAzIE1JMlMgVHggcG9ydCAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAzNQorLyogSUQgb2YgdGhlIEludGVybmFsIDQgTUkyUyBSeCBwb3J0ICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWCAgICAgICAgICAgICAgICAgMHgxMDM2CisvKiBJRCBvZiB0aGUgSW50ZXJuYWwgNCBNSTJTIFR4IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYICAgICAgICAgICAgICAgICAweDEwMzcKKy8qIElEIG9mIHRoZSBJbnRlcm5hbCA1IE1JMlMgUnggcG9ydCAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlggICAgICAgICAgICAgICAgIDB4MTAzOAorLyogSUQgb2YgdGhlIEludGVybmFsIDUgTUkyUyBUeCBwb3J0ICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWCAgICAgICAgICAgICAgICAgMHgxMDM5CisvKiBJRCBvZiB0aGUgSW50ZXJuYWwgNiBNSTJTIFJ4IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwM0EKKy8qIElEIG9mIHRoZSBJbnRlcm5hbCA2IE1JMlMgVHggcG9ydCAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAzQgorI2RlZmluZSBBRkVfUE9SVF9JRF9TUERJRl9SWCAgICAgICAgICAgICAgICAweDUwMDAKKyNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfMDAxX1JYICAgMHgyMDAwCisjZGVmaW5lICBBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUXzAwMV9UWCAgIDB4MjAwMQorI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9TQ09fUlggICAgICAweDMwMDAKKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5URVJOQUxfQlRfU0NPX1RYICAgICAgMHgzMDAxCisjZGVmaW5lIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0EyRFBfUlggICAgIDB4MzAwMgorI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9GTV9SWCAgICAgICAgICAweDMwMDQKKyNkZWZpbmUgQUZFX1BPUlRfSURfSU5URVJOQUxfRk1fVFggICAgICAgICAgMHgzMDA1CisvKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCAwLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMF9SWCAgICAgIDB4NDAwMAorLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgMC4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzBfVFggICAgICAweDQwMDEKKy8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDEuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8xX1JYICAgICAgMHg0MDAyCisvKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCAxLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMV9UWCAgICAgIDB4NDAwMworLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgMi4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzJfUlggICAgICAweDQwMDQKKy8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDIuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8yX1RYICAgICAgMHg0MDA1CisvKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCAzLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fM19SWCAgICAgIDB4NDAwNgorLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgMy4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzNfVFggICAgICAweDQwMDcKKy8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDQuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl80X1JYICAgICAgMHg0MDA4CisvKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCA0LiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNF9UWCAgICAgIDB4NDAwOQorLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgNS4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzVfUlggICAgICAweDQwMGEKKy8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDUuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl81X1RYICAgICAgMHg0MDBiCisvKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCA2LiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNl9SWCAgICAgIDB4NDAwYworLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgNi4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzZfVFggICAgICAweDQwMGQKKy8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDcuICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl83X1JYICAgICAgMHg0MDBlCisvKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCA3LiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fN19UWCAgICAgIDB4NDAwZgorLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgOC4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzhfUlggICAgICAweDQwMTAKKy8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDguICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl84X1RYICAgICAgMHg0MDExCisvKiBBRkUgUnggcG9ydCBmb3IgYXVkaW8gb3ZlciBEaXNwbGF5IHBvcnQgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfSERNSV9PVkVSX0RQX1JYICAgICAgICAgICAgICAweDYwMjAKKy8qVVNCIEFGRSBwb3J0ICovCisjZGVmaW5lIEFGRV9QT1JUX0lEX1VTQl9SWCAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIEFGRV9QT1JUX0lEX1VTQl9UWCAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAxCisKKy8qIEdlbmVyaWMgcHNldWRvcG9ydCAxLiAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9QU0VVRE9QT1JUXzAxICAgICAgMHg4MDAxCisvKiBHZW5lcmljIHBzZXVkb3BvcnQgMi4gKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfUFNFVURPUE9SVF8wMiAgICAgIDB4ODAwMgorCisvKiBAeHJlZmxhYmVse2hkcjpBZmVQb3J0SWRQcmltYXJ5QXV4UGNtVHh9CisgKiBQcmltYXJ5IEF1eCBQQ00gVHggcG9ydCBJRC4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCAgICAgIDB4MTAwQgorLyogUHNldWRvcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB2b2ljZSBSeCBwYXRoLgorICogRm9yIHJlY29yZGluZywgdGhlIHZvaWNlIFJ4IHBhdGggc2FtcGxlcyBhcmUgd3JpdHRlbiB0byB0aGlzCisgKiBwb3J0IGFuZCBjb25zdW1lZCBieSB0aGUgYXVkaW8gcGF0aC4KKyAqLworCisjZGVmaW5lIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9SWAkweDgwMDMKKworLyogUHNldWRvcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB2b2ljZSBUeCBwYXRoLgorICogRm9yIHJlY29yZGluZywgdGhlIHZvaWNlIFR4IHBhdGggc2FtcGxlcyBhcmUgd3JpdHRlbiB0byB0aGlzCisgKiBwb3J0IGFuZCBjb25zdW1lZCBieSB0aGUgYXVkaW8gcGF0aC4KKyAqLworCisjZGVmaW5lIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9UWAkweDgwMDQKKy8qIFBzZXVkb3BvcnQgdGhhdCBjb3JyZXNwb25kcyB0byBpbi1jYWxsIHZvaWNlIGRlbGl2ZXJ5IHNhbXBsZXMuCisgKiBEdXJpbmcgaW4tY2FsbCBhdWRpbyBkZWxpdmVyeSwgdGhlIGF1ZGlvIHBhdGggZGVsaXZlcnMgc2FtcGxlcworICogdG8gdGhpcyBwb3J0IGZyb20gd2hlcmUgdGhlIHZvaWNlIHBhdGggZGVsaXZlcnMgdGhlbSBvbiB0aGUKKyAqIFJ4IHBhdGguCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSURfVk9JQ0UyX1BMQVlCQUNLX1RYICAweDgwMDIKKyNkZWZpbmUgQUZFX1BPUlRfSURfVk9JQ0VfUExBWUJBQ0tfVFggICAweDgwMDUKKworI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWCBcCisJKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgwMCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMiBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwNCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMyBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwNikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNSBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwQSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNiBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwQykKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNyBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWCBcCisJKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgwMSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMSBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMiBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwNCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMyBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwNikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNCBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNSBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwQSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNiBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwQykKKyNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNyBcCisJKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYIFwKKwkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQgKyAweDEwKQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yIFwKKwkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWCArIDB4MDQpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMyBcCisJKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlggKyAweDA2KQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81IFwKKwkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWCArIDB4MEEpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNiBcCisJKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlggKyAweDBDKQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYIFwKKwkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQgKyAweDExKQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzEgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yIFwKKwkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCArIDB4MDQpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMyBcCisJKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFggKyAweDA2KQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81IFwKKwkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCArIDB4MEEpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNiBcCisJKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFggKyAweDBDKQorI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzcgXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggXAorCShBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TVEFSVCArIDB4MjApCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xIFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzIgXAorCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggKyAweDA0KQorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMyBcCisJKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCArIDB4MDYpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80IFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzUgXAorCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggKyAweDBBKQorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNiBcCisJKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCArIDB4MEMpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83IFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggXAorCShBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TVEFSVCArIDB4MjEpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xIFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzIgXAorCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggKyAweDA0KQorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMyBcCisJKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWCArIDB4MDYpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80IFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzUgXAorCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggKyAweDBBKQorI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNiBcCisJKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWCArIDB4MEMpCisjZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83IFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCBcCisJKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgzMCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMiBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwNCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMyBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwNikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNSBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwQSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNiBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwQykKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNyBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWCBcCisJKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgzMSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMSBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwMikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMiBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwNCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMyBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwNikKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNCBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwOCkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNSBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwQSkKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNiBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwQykKKyNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNyBcCisJKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwRSkKKworI2RlZmluZSBBRkVfUE9SVF9JRF9JTlZBTElEICAgICAgICAgICAgIDB4RkZGRgorCisjZGVmaW5lIEFBQ19FTkNfTU9ERV9BQUNfTEMgMHgwMgorI2RlZmluZSBBQUNfRU5DX01PREVfQUFDX1AgMHgwNQorI2RlZmluZSBBQUNfRU5DX01PREVfRUFBQ19QIDB4MUQKKworI2RlZmluZSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQgMHgwMDAxMDBjZgorc3RydWN0IGFmZV9wc2V1ZG9wb3J0X3N0YXJ0X2NvbW1hbmQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgcG9ydF9pZDsJCS8qIFBzZXVkbyBQb3J0IDEgPSAweDgwMDAgKi8KKwkJCQkvKiBQc2V1ZG8gUG9ydCAyID0gMHg4MDAxICovCisJCQkJLyogUHNldWRvIFBvcnQgMyA9IDB4ODAwMiAqLworCXUxNiB0aW1pbmc7CQkvKiBGVFJUID0gMCAsIEFWVGltZXIgPSAxLCAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUFNFVURPUE9SVF9DTURfU1RPUCAweDAwMDEwMGQwCitzdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RvcF9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHBvcnRfaWQ7CQkvKiBQc2V1ZG8gUG9ydCAxID0gMHg4MDAwICovCisJCQkJLyogUHNldWRvIFBvcnQgMiA9IDB4ODAwMSAqLworCQkJCS8qIFBzZXVkbyBQb3J0IDMgPSAweDgwMDIgKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQUZFX01PRFVMRV9TSURFVE9ORV9JSVJfRklMVEVSCTB4MDAwMTAyMDIKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0VOQUJMRQkweDAwMDEwMjAzCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0VOQUJMRQorICogcGFyYW1ldGVyLCB3aGljaCBlbmFibGVzIG9yCisgKiBkaXNhYmxlcyBhbnkgbW9kdWxlLgorICogVGhlIGZpeGVkIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgZm91ciBieXRlcy4KKyAqLworCitzdHJ1Y3QgYWZlX21vZF9lbmFibGVfcGFyYW0geworCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZTsKKwkvKiBFbmFibGVzICgxKSBvciBkaXNhYmxlcyAoMCkgdGhlIG1vZHVsZS4gKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KK30gX19wYWNrZWQ7CisKKy8qIElEIG9mIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FGRV9NT0RVTEVfU0lERVRPTkVfSUlSX0ZJTFRFUiBtb2R1bGUuCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NJREVUT05FX0lJUl9GSUxURVJfQ09ORklHCTB4MDAwMTAyMDQKKworc3RydWN0IGFmZV9zaWRldG9uZV9paXJfZmlsdGVyX2NvbmZpZ19wYXJhbXMgeworCXUxNiAgICAgICAgICAgICAgICAgIG51bV9iaXF1YWRfc3RhZ2VzOworLyogTnVtYmVyIG9mIHN0YWdlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IE1pbmltdW0gb2YgNSBhbmQgbWF4aW11bSBvZiAxMAorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBwcmVnYWluOworLyogUHJlZ2FpbiBmb3IgdGhlIGNvbXBlbnNhdGluZyBmaWx0ZXIgcmVzcG9uc2UuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkgbnVtYmVyIGluIFExMyBmb3JtYXQKKyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfTU9EVUxFX0xPT1BCQUNLCTB4MDAwMTAyMDUKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0dBSU5fUEVSX1BBVEgJMHgwMDAxMDIwNgorCisvKiBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0dBSU5fUEVSX1BBVEggcGFyYW1ldGVyLAorICogd2hpY2ggZ2V0cy9zZXRzIGxvb3BiYWNrIGdhaW4gb2YgYSBwb3J0IHRvIGFuIFJ4IHBvcnQuCisgKiBUaGUgVHggcG9ydCBJRCBvZiB0aGUgbG9vcGJhY2sgaXMgcGFydCBvZiB0aGUgc2V0X3BhcmFtIGNvbW1hbmQuCisgKi8KKworLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyIGNvbW1hbmQncworICogY29uZmlndXJhdGlvbi9jYWxpYnJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIEFGRSBwb3J0LgorICovCitzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiB7CisJdTE2IHBvcnRfaWQ7CisvKiBQb3J0IGludGVyZmFjZSBhbmQgZGlyZWN0aW9uIChSeCBvciBUeCkgdG8gc3RhcnQuICovCisKKwl1MTYgcGF5bG9hZF9zaXplOworLyogQWN0dWFsIHNpemUgb2YgdGhlIHBheWxvYWQgaW4gYnl0ZXMuCisgKiBUaGlzIGlzIHVzZWQgZm9yIHBhcnNpbmcgdGhlIHBhcmFtZXRlciBwYXlsb2FkLgorICogU3VwcG9ydGVkIHZhbHVlczogPiAwCisgKi8KKwordTMyIHBheWxvYWRfYWRkcmVzc19sc3c7CisvKiBMU1cgb2YgNjQgYml0IFBheWxvYWQgYWRkcmVzcy4KKyAqIEFkZHJlc3Mgc2hvdWxkIGJlIDMyLWJ5dGUsCisgKiA0a2J5dGUgYWxpZ25lZCBhbmQgbXVzdCBiZSBjb250aWd1b3VzIG1lbW9yeS4KKyAqLworCit1MzIgcGF5bG9hZF9hZGRyZXNzX21zdzsKKy8qIE1TVyBvZiA2NCBiaXQgUGF5bG9hZCBhZGRyZXNzLgorICogSW4gY2FzZSBvZiAzMi1iaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLAorICogdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgorICogSW4gY2FzZSBvZiAzNi1iaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLAorICogYml0LTQgdG8gYml0LTMxIG11c3QgYmUgc2V0IHRvIHplcm8uCisgKiBBZGRyZXNzIHNob3VsZCBiZSAzMi1ieXRlLCA0a2J5dGUgYWxpZ25lZAorICogYW5kIG11c3QgYmUgY29udGlndW91cyBtZW1vcnkuCisgKi8KKwordTMyIG1lbV9tYXBfaGFuZGxlOworLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkKKyAqIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGNvbW1hbmRzLgorICogU3VwcG9ydGVkIFZhbHVlczoKKyAqIC0gTlVMTCAtLSBNZXNzYWdlLiBUaGUgcGFyYW1ldGVyIGRhdGEgaXMgaW4tYmFuZC4KKyAqIC0gTm9uLU5VTEwgLS0gVGhlIHBhcmFtZXRlciBkYXRhIGlzIE91dC1iYW5kLlBvaW50ZXIgdG8KKyAqIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBpbiBzaGFyZWQgbWVtb3J5IG9mIHRoZSBwYXlsb2FkIGRhdGEuCisgKiBBbiBvcHRpb25hbCBmaWVsZCBpcyBhdmFpbGFibGUgaWYgcGFyYW1ldGVyCisgKiBkYXRhIGlzIGluLWJhbmQ6CisgKiBhZmVfcGFyYW1fZGF0YV92MiBwYXJhbV9kYXRhWy4uLl0uCisgKiBGb3IgZGV0YWlsZWQgcGF5bG9hZCBjb250ZW50LCBzZWUgdGhlCisgKiBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHN0cnVjdHVyZS4KKyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyCTB4MDAwMTAwRUYKKworc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgeworCXUzMiBtb2R1bGVfaWQ7CisvKiBJRCBvZiB0aGUgbW9kdWxlIHRvIGJlIGNvbmZpZ3VyZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBWYWxpZCBtb2R1bGUgSUQKKyAqLworCit1MzIgcGFyYW1faWQ7CisvKiBJRCBvZiB0aGUgcGFyYW1ldGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzCisgKiBmb3IgdGhlIG1vZHVsZSBJRC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IFZhbGlkIHBhcmFtZXRlciBJRAorICovCisKK3UxNiBwYXJhbV9zaXplOworLyogQWN0dWFsIHNpemUgb2YgdGhlIGRhdGEgZm9yIHRoZQorICogbW9kdWxlX2lkL3BhcmFtX2lkIHBhaXIuIFRoZSBzaXplIGlzIGEKKyAqIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKKyAqLworCit1MTYgcmVzZXJ2ZWQ7CisvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uCisgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfbG9vcGJhY2tfZ2Fpbl9wZXJfcGF0aF9wYXJhbSB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgIHBkYXRhOworCXUxNiAgICAgICAgICAgICAgICAgIHJ4X3BvcnRfaWQ7CisvKiBSeCBwb3J0IG9mIHRoZSBsb29wYmFjay4gKi8KKwordTE2ICAgICAgICAgICAgICAgICAgZ2FpbjsKKy8qIExvb3BiYWNrIGdhaW4gcGVyIHBhdGggb2YgdGhlIHBvcnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkgbnVtYmVyIGluIFExMyBmb3JtYXQKKyAqLworfSBfX3BhY2tlZDsKKworLyogUGFyYW1ldGVyIElEIHVzZWQgdG8gY29uZmlndXJlIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUKKyAqIGxvb3BiYWNrIHBhdGguIFRoZSBkaWZmZXJlbmNlIHdpdGggcmVzcGVjdCB0byB0aGUgZXhpc3RpbmcKKyAqIEFQSSwgQUZFX1BPUlRfQ01EX0xPT1BCQUNLLCBpcyB0aGF0IGl0IGFsbG93cyBSeCBwb3J0IHRvIGJlCisgKiBjb25maWd1cmVkIGFzIHNvdXJjZSBwb3J0IGluIGxvb3BiYWNrIHBhdGguIFBvcnQtaWQgaW4KKyAqIEFGRV9QT1JUX0NNRF9TRVRfUEFSQU0gY21kIGlzIHRoZSBzb3VyY2UgcG9ydCB3aGljaCBjYW4gYmUKKyAqIFR4IG9yIFJ4IHBvcnQuIEluIGFkZGl0aW9uLCB3ZSBjYW4gY29uZmlndXJlIHRoZSB0eXBlIG9mCisgKiByb3V0aW5nIG1vZGUgdG8gaGFuZGxlIGRpZmZlcmVudCB1c2UgY2FzZXMuCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0NPTkZJRwkweDAwMDEwMjBCCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9MT09QQkFDS19DT05GSUcJMHgxCisKK2VudW0gYWZlX2xvb3BiYWNrX3JvdXRpbmdfbW9kZSB7CisJTEJfTU9ERV9ERUZBVUxUID0gMSwKKwkvKiBSZWd1bGFyIGxvb3BiYWNrIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwlMQl9NT0RFX1NJREVUT05FLAorCS8qIFNpZGV0b25lIGZlZWQgZnJvbSBUeCBzb3VyY2UgdG8gUnggZGVzdGluYXRpb24gcG9ydCAqLworCUxCX01PREVfRUNfUkVGX1ZPSUNFX0FVRElPLAorCS8qIEVjaG8gY2FuY2VsbGVyIHJlZmVyZW5jZSwgdm9pY2UgKyBhdWRpbyArIERUTUYgKi8KKwlMQl9NT0RFX0VDX1JFRl9WT0lDRQorCS8qIEVjaG8gY2FuY2VsbGVyIHJlZmVyZW5jZSwgdm9pY2UgYWxvbmUgKi8KK30gX19wYWNrZWQ7CisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0NPTkZJRyAsCisgKiB3aGljaCBlbmFibGVzL2Rpc2FibGVzIG9uZSBBRkUgbG9vcGJhY2suCisgKi8KK3N0cnVjdCBhZmVfbG9vcGJhY2tfY2ZnX3YxIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgcGRhdGE7CisJdTMyCQlsb29wYmFja19jZmdfbWlub3JfdmVyc2lvbjsKKy8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIFJNQyBtb2R1bGUKKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9MT09QQkFDS19DT05GSUcKKyAqLworCXUxNiAgICAgICAgICAgICAgICAgIGRzdF9wb3J0X2lkOworCS8qIERlc3RpbmF0aW9uIFBvcnQgSWQuICovCisJdTE2ICAgICAgICAgICAgICAgICAgcm91dGluZ19tb2RlOworLyogU3BlY2lmaWVzIGRhdGEgcGF0aCB0eXBlIGZyb20gc3JjIHRvIGRlc3QgcG9ydC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAjTEJfTU9ERV9ERUZBVUxUCisgKiAjTEJfTU9ERV9TSURFVE9ORQorICogI0xCX01PREVfRUNfUkVGX1ZPSUNFX0FVRElPCisgKiAjTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQQorICogI0xCX01PREVfRUNfUkVGX1ZPSUNFCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZTsKKy8qIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSAoMSkgb3IKKyAqIGRpc2FibGUgKDApIGFuIEFGRSBsb29wYmFjay4KKyAqLworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworLyogUmVzZXJ2ZWQgZm9yIDMyLWJpdCBhbGlnbm1lbnQuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gMC4KKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OCTB4MDAwMTAyMDkKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQS1JfUFJPVF9DT05GSUcJMHgwMDAxMDIwYQorI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU1BLUl9QUk9UX0NPTkZJRwkweDEKKyNkZWZpbmUgQUZFX1NQS1JfUFJPVF9FWENVUlNJT05GX0xFTgk1MTIKK3N0cnVjdCBhZmVfc3Brcl9wcm90X2NmZ19wYXJhbV92MSB7CisJdTMyICAgICAgIHNwa3JfcHJvdF9taW5vcl92ZXJzaW9uOworLyoKKyAqIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlCisgKiBzcGVha2VyIHByb3RlY3Rpb24gbW9kdWxlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9TUEtSX1BST1RfQ09ORklHCisgKi8KKworaW50MTZfdCAgICAgICAgd2luX3NpemU7CisvKiBBbmFseXNpcyBhbmQgc3ludGhlc2lzIHdpbmRvdyBzaXplIChuV2luU2l6ZSkuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMDI0LCA1MTIsIDI1NiBzYW1wbGVzCisgKi8KKworaW50MTZfdCAgICAgICAgbWFyZ2luOworLyogQWxsb3dhYmxlIG1hcmdpbiBmb3IgZXhjdXJzaW9uIHByZWRpY3Rpb24sCisgKiBpbiBMMTZRMTUgZm9ybWF0LiBUaGlzIGlzIGEKKyAqIGNvbnRyb2wgcGFyYW1ldGVyIHRvIGFsbG93CisgKiBmb3Igb3ZlcmVzdGltYXRpb24gb2YgcGVhayBleGN1cnNpb24uCisgKi8KKworaW50MTZfdCAgICAgICAgc3Brcl9leGNfbGltaXQ7CisvKiBTcGVha2VyIGV4Y3Vyc2lvbiBsaW1pdCwgaW4gTDE2UTE1IGZvcm1hdC4qLworCitpbnQxNl90ICAgICAgICBzcGtyX3Jlc29uYW5jZV9mcmVxOworLyogUmVzb25hbmNlIGZyZXF1ZW5jeSBvZiB0aGUgc3BlYWtlcjsgdXNlZAorICogdG8gZGVmaW5lIGEgZnJlcXVlbmN5IHJhbmdlCisgKiBmb3Igc2lnbmFsIG1vZGlmaWNhdGlvbi4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDIwMDAgSHoKKyAqLworCitpbnQxNl90ICAgICAgICBsaW1ocmVzaDsKKy8qIFRocmVzaG9sZCBvZiB0aGUgaGFyZCBsaW1pdGVyOyB1c2VkIHRvCisgKiBwcmV2ZW50IG92ZXJzaG9vdGluZyBiZXlvbmQgYQorICogc2lnbmFsIGxldmVsIHRoYXQgd2FzIHNldCBieSB0aGUgbGltaXRlcgorICogcHJpb3IgdG8gc3BlYWtlciBwcm90ZWN0aW9uLgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAzMjc2NworICovCisKK2ludDE2X3QgICAgICAgIGhwZl9jdXRfb2ZmX2ZyZXE7CisvKiBIaWdoIHBhc3MgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMDAsIDIwMCwgMzAwIEh6CisgKi8KKworaW50MTZfdCAgICAgICAgaHBmX2VuYWJsZTsKKy8qIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoaWdoIHBhc3MgZmlsdGVyCisgKiBpcyBlbmFibGVkICgwKSBvciBkaXNhYmxlZCAoMSkuCisgKi8KKworaW50MTZfdCAgICAgICAgcmVzZXJ2ZWQ7CisvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCisKK2ludDMyX3QgICAgICAgIGFtcF9nYWluOworLyogQW1wbGlmaWVyIGdhaW4gaW4gTDMyUTE1IGZvcm1hdC4KKyAqIFRoaXMgaXMgdGhlIFJNUyB2b2x0YWdlIGF0IHRoZQorICogbG91ZHNwZWFrZXIgd2hlbiBhIDBkQkZTIHRvbmUKKyAqIGlzIHBsYXllZCBpbiB0aGUgZGlnaXRhbCBkb21haW4uCisgKi8KKworaW50MTZfdCAgICAgICAgZXhjdXJzaW9uZltBRkVfU1BLUl9QUk9UX0VYQ1VSU0lPTkZfTEVOXTsKKy8qIEFycmF5IG9mIHRoZSBleGN1cnNpb24gdHJhbnNmZXIgZnVuY3Rpb24uCisgKiBUaGUgcGVhayBleGN1cnNpb24gb2YgdGhlCisgKiBsb3Vkc3BlYWtlciBkaWFwaHJhZ20gaXMKKyAqIG1lYXN1cmVkIGluIG1pbGxpbWV0ZXJzIGZvciAxIFZybXMgU2luZQorICogdG9uZSBhdCBhbGwgRkZUIGJpbiBmcmVxdWVuY2llcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IFExNSBmb3JtYXQKKyAqLworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9SRUdJU1RFUl9SVF9QT1JUX0RSSVZFUgkweDAwMDEwMEUwCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1NFUlZJQ0VfQ01EX1JFR0lTVEVSX1JUX1BPUlRfRFJJVkVSCisgKiBjb21tYW5kLCB3aGljaCByZWdpc3RlcnMgYSByZWFsLXRpbWUgcG9ydCBkcml2ZXIKKyAqIHdpdGggdGhlIEFGRSBzZXJ2aWNlLgorICovCitzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3JlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKKy8qIFBvcnQgSUQgd2l0aCB3aGljaCB0aGUgcmVhbC10aW1lIGRyaXZlciBleGNoYW5nZXMgZGF0YQorICogKHJlZ2lzdGVycyBmb3IgZXZlbnRzKS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX1NUQVJUIHRvCisgKiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9FTkQKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfU0VSVklDRV9DTURfVU5SRUdJU1RFUl9SVF9QT1JUX0RSSVZFUgkweDAwMDEwMEUxCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1NFUlZJQ0VfQ01EX1VOUkVHSVNURVJfUlRfUE9SVF9EUklWRVIKKyAqIGNvbW1hbmQsIHdoaWNoIHVucmVnaXN0ZXJzIGEgcmVhbC10aW1lIHBvcnQgZHJpdmVyIGZyb20KKyAqIHRoZSBBRkUgc2VydmljZS4KKyAqLworc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF91bnJlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKKy8qIFBvcnQgSUQgZnJvbSB3aGljaCB0aGUgcmVhbC10aW1lCisgKiBkcml2ZXIgdW5yZWdpc3RlcnMgZm9yIGV2ZW50cy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX1NUQVJUIHRvCisgKiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9FTkQKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgkqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfRVZFTlRfUlRfUFJPWFlfUE9SVF9TVEFUVVMJMHgwMDAxMDEwNQorI2RlZmluZSBBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9TVEFSVAkwCisjZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX1NUT1AJMQorI2RlZmluZSBBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9MT1dfV0FURVJfTUFSSwkyCisjZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0hJR0hfV0FURVJfTUFSSwkzCisjZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0lOVkFMSUQJMHhGRkZGCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTCisgKiBtZXNzYWdlLCB3aGljaCBzZW5kcyBhbiBldmVudCBmcm9tIHRoZSBBRkUgc2VydmljZQorICogdG8gYSByZWdpc3RlcmVkIGNsaWVudC4KKyAqLworc3RydWN0IGFmZV9ldmVudF9ydF9wcm94eV9wb3J0X3N0YXR1cyB7CisJdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKKy8qIFBvcnQgSUQgdG8gd2hpY2ggdGhlIGV2ZW50IGlzIHNlbnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9TVEFSVCB0bworICogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfRU5ECisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGV2ZW50eXBlOworLyogVHlwZSBvZiBldmVudC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9TVEFSVAorICogLSAjQUZFX0VWRU5UWVBFX1JUX1BST1hZX1BPUlRfU1RPUAorICogLSAjQUZFX0VWRU5UWVBFX1JUX1BST1hZX1BPUlRfTE9XX1dBVEVSX01BUksKKyAqIC0gI0FGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0hJR0hfV0FURVJfTUFSSworICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfV1JJVEVfVjIgMHgwMDAxMDBFRAorCitzdHJ1Y3QgYWZlX3BvcnRfZGF0YV9jbWRfcnRfcHJveHlfcG9ydF93cml0ZV92MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7CisvKiBUeCAobWljKSBwcm94eSBwb3J0IElEIHdpdGggd2hpY2ggdGhlIHJlYWwtdGltZQorICogZHJpdmVyIGV4Y2hhbmdlcyBkYXRhLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQgdG8KKyAqICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX0VORAorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBidWZmZXJfYWRkcmVzc19sc3c7CisvKiBMU1cgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKiBkYXRhIGZyb20gdGhlIHJlYWwtdGltZSBzb3VyY2UKKyAqIGRldmljZSBvbiBhIGNsaWVudC4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgYnVmZmVyX2FkZHJlc3NfbXN3OworLyogTVNXIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICogZGF0YSBmcm9tIHRoZSByZWFsLXRpbWUgc291cmNlCisgKiBkZXZpY2Ugb24gYSBjbGllbnQuCisgKi8KKworCXUzMgkJCQkJbWVtX21hcF9oYW5kbGU7CisvKiBBIG1lbW9yeSBtYXAgaGFuZGxlIGVuY2Fwc3VsYXRpbmcgc2hhcmVkIG1lbW9yeQorICogYXR0cmlidXRlcyBpcyByZXR1cm5lZCBpZgorICogQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMKKyAqIGNvbW1hbmQgaXMgc3VjY2Vzc2Z1bC4KKyAqIFN1cHBvcnRlZCBWYWx1ZXM6CisgKiAtIEFueSAzMiBiaXQgdmFsdWUKKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2J5dGVzOworLyogTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGF2YWlsYWJsZQorICogaW4gdGhlIGJ1ZmZlciAoaW5jbHVkaW5nIGFsbAorICogY2hhbm5lbHM6IG51bWJlciBvZiBieXRlcyBwZXIKKyAqIGNoYW5uZWwgPSBhdmFpbGFibGVCeXRlc3VtQ2hhbm5lbHMpLgorICogU3VwcG9ydGVkIHZhbHVlczogPiAwCisgKgorICogVGhpcyBmaWVsZCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBmcmFtZQorICogc2l6ZSBzcGVjaWZpZWQgaW4gdGhlICNBRkVfUE9SVF9BVURJT19JRl9DT05GSUcKKyAqIGNvbW1hbmQgdGhhdCB3YXMgc2VudCB0byBjb25maWd1cmUgdGhpcworICogcG9ydC4KKyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjIJMHgwMDAxMDBFRQorCisvKiAgUGF5bG9hZCBvZiB0aGUKKyAqICNBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjIgY29tbWFuZCwgd2hpY2gKKyAqIGRlbGl2ZXJzIGFuIGVtcHR5IGJ1ZmZlciB0byB0aGUgQUZFIHNlcnZpY2UuIE9uCisgKiBhY2tub3dsZWRnbWVudCwgZGF0YSBpcyBmaWxsZWQgaW4gdGhlIGJ1ZmZlci4KKyAqLworc3RydWN0IGFmZV9wb3J0X2RhdGFfY21kX3J0X3Byb3h5X3BvcnRfcmVhZF92MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7CisvKiBSeCBwcm94eSBwb3J0IElEIHdpdGggd2hpY2ggdGhlIHJlYWwtdGltZQorICogZHJpdmVyIGV4Y2hhbmdlcyBkYXRhLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQgdG8KKyAqICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX0VORAorICogKFRoaXMgbXVzdCBiZSBhbiBSeCAoc3BlYWtlcikgcG9ydC4pCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hZGRyZXNzX2xzdzsKKy8qIExTVyBBZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSBzZW50IGZyb20gdGhlIEFGRQorICogc2VydmljZSB0byBhIHJlYWwtdGltZSBzaW5rIGRldmljZSBvbiB0aGUgY2xpZW50LgorICovCisKKworCXUzMiAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hZGRyZXNzX21zdzsKKy8qIE1TVyBBZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSBzZW50IGZyb20gdGhlIEFGRQorICogc2VydmljZSB0byBhIHJlYWwtdGltZSBzaW5rIGRldmljZSBvbiB0aGUgY2xpZW50LgorICovCisKKwkJdTMyCQkJCW1lbV9tYXBfaGFuZGxlOworLyogQSBtZW1vcnkgbWFwIGhhbmRsZSBlbmNhcHN1bGF0aW5nIHNoYXJlZCBtZW1vcnkgYXR0cmlidXRlcyBpcworICogcmV0dXJuZWQgaWYgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZCBpcworICogc3VjY2Vzc2Z1bC4KKyAqIFN1cHBvcnRlZCBWYWx1ZXM6CisgKiAtIEFueSAzMiBiaXQgdmFsdWUKKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2J5dGVzOworLyogTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIChpbmNsdWRpbmcgYWxsCisgKiBjaGFubmVscykuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKKyAqIFRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byB0aGUgZnJhbWUgc2l6ZSBzcGVjaWZpZWQgaW4gdGhlCisgKiAjQUZFX1BPUlRfQVVESU9fSUZfQ09ORklHIGNvbW1hbmQgdGhhdCB3YXMgc2VudCB0byBjb25maWd1cmUKKyAqIHRoaXMgcG9ydC4KKyAqLworfSBfX3BhY2tlZDsKKworLyogVGhpcyBtb2R1bGUgSUQgaXMgcmVsYXRlZCB0byBkZXZpY2UgY29uZmlndXJpbmcgbGlrZSBJMlMsUENNLAorICogSERNSSwgU0xJTUJ1cyBldGMuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIGZvbGxvd2luZyBwYXJhbWV0ZXIgaWRzLgorICogLSAjQUZFX1BBUkFNX0lEX0kyU19DT05GSUcKKyAqIC0gI0FGRV9QQVJBTV9JRF9QQ01fQ09ORklHCisgKiAtICNBRkVfUEFSQU1fSURfRElHSV9NSUNfQ09ORklHCisgKiAtICNBRkVfUEFSQU1fSURfSERNSV9DT05GSUcKKyAqIC0gI0FGRV9QQVJBTV9JRF9JTlRFUk5BTF9CVF9GTV9DT05GSUcKKyAqIC0gI0FGRV9QQVJBTV9JRF9TTElNQlVTX0NPTkZJRworICogLSAjQUZFX1BBUkFNX0lEX1JUX1BST1hZX0NPTkZJRworICovCisKKyNkZWZpbmUgQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFICAgIDB4MDAwMTAyMEMKKyNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsgICAgICAgICAgIDgwMDAKKyNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLICAgICAgICAgIDE2MDAwCisjZGVmaW5lIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SyAgICAgICAgICA0ODAwMAorI2RlZmluZSBBRkVfUE9SVF9TQU1QTEVfUkFURV85NksgICAgICAgICAgOTYwMDAKKyNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfMTkySyAgICAgICAgIDE5MjAwMAorI2RlZmluZSBBRkVfTElORUFSX1BDTV9EQVRBCQkJCTB4MAorI2RlZmluZSBBRkVfTk9OX0xJTkVBUl9EQVRBCQkJCTB4MQorI2RlZmluZSBBRkVfTElORUFSX1BDTV9EQVRBX1BBQ0tFRF82MDk1OCAweDIKKyNkZWZpbmUgQUZFX05PTl9MSU5FQVJfREFUQV9QQUNLRURfNjA5NTggMHgzCisKKy8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgSTJTIGludGVyZmFjZSAqLworI2RlZmluZSBBRkVfUEFSQU1fSURfSTJTX0NPTkZJRwkweDAwMDEwMjBECisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHCTB4MQorLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIEkyUyBjb25maWd1cmF0aW9uCisgKiBjaGFubmVsX21vZGUgcGFyYW1ldGVyIHRvCisgKiBzZXJpYWwgZGF0YSB3aXJlIG51bWJlciAxLTMgKFNEMykuCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfSTJTX1NEMCAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBRkVfUE9SVF9JMlNfU0QxICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIEFGRV9QT1JUX0kyU19TRDIgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgQUZFX1BPUlRfSTJTX1NEMyAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBBRkVfUE9SVF9JMlNfUVVBRDAxICAgICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIEFGRV9QT1JUX0kyU19RVUFEMjMgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgQUZFX1BPUlRfSTJTXzZDSFMgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBBRkVfUE9SVF9JMlNfOENIUyAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIEFGRV9QT1JUX0kyU19NT05PICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQUZFX1BPUlRfSTJTX1NURVJFTyAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBRkVfUE9SVF9DT05GSUdfSTJTX1dTX1NSQ19FWFRFUk5BTCAgMHgwCisjZGVmaW5lIEFGRV9QT1JUX0NPTkZJR19JMlNfV1NfU1JDX0lOVEVSTkFMICAweDEKKworLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfSTJTX0NPTkZJRworICogY29tbWFuZCdzIChJMlMgY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVyKS4KKyAqLworc3RydWN0IGFmZV9wYXJhbV9pZF9pMnNfY2ZnIHsKKwl1MzIgICAgICAgICAgICAgICAgICBpMnNfY2ZnX21pbm9yX3ZlcnNpb247CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBJMlMKKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKKy8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgorICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0CisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbW9kZTsKKy8qIEkyUyBsaW5lcyBhbmQgbXVsdGljaGFubmVsIG9wZXJhdGlvbi4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfUE9SVF9JMlNfU0QwCisgKiAtICNBRkVfUE9SVF9JMlNfU0QxCisgKiAtICNBRkVfUE9SVF9JMlNfU0QyCisgKiAtICNBRkVfUE9SVF9JMlNfU0QzCisgKiAtICNBRkVfUE9SVF9JMlNfUVVBRDAxCisgKiAtICNBRkVfUE9SVF9JMlNfUVVBRDIzCisgKiAtICNBRkVfUE9SVF9JMlNfNkNIUworICogLSAjQUZFX1BPUlRfSTJTXzhDSFMKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbW9ub19zdGVyZW87CisvKiBTcGVjaWZpZXMgbW9ubyBvciBzdGVyZW8uIFRoaXMgYXBwbGllcyBvbmx5IHdoZW4KKyAqIGEgc2luZ2xlIEkyUyBsaW5lIGlzIHVzZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfSTJTX01PTk8KKyAqIC0gI0FGRV9QT1JUX0kyU19TVEVSRU8KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgd3Nfc3JjOworLyogV29yZCBzZWxlY3Qgc291cmNlOiBpbnRlcm5hbCBvciBleHRlcm5hbC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfUE9SVF9DT05GSUdfSTJTX1dTX1NSQ19FWFRFUk5BTAorICogLSAjQUZFX1BPUlRfQ09ORklHX0kyU19XU19TUkNfSU5URVJOQUwKKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisvKiBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCisgKi8KKworCXUxNgkJCQkJZGF0YV9mb3JtYXQ7CisvKiBkYXRhIGZvcm1hdAorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0xJTkVBUl9QQ01fREFUQQorICogLSAjTk9OX0xJTkVBUl9EQVRBCisgKiAtICNMSU5FQVJfUENNX0RBVEFfUEFDS0VEX0lOXzYwOTU4CisgKiAtICNOT05fTElORUFSX0RBVEFfUEFDS0VEX0lOXzYwOTU4CisgKi8KKwkJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgUENNIGludGVyZmFjZQorICovCisKKyNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1NQRElGX0NPTkZJRyAweDEKKyNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1NQRElGX0NIX1NUQVRVU19DT05GSUcgMHgxCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9TUERJRl9DTEtfQ09ORklHIDB4MQorI2RlZmluZSBBRkVfQ0hfU1RBVFVTX0EgMQorI2RlZmluZSBBRkVfQ0hfU1RBVFVTX0IgMgorCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUERJRl9DT05GSUcgMHgwMDAxMDI0NAorI2RlZmluZSBBRkVfUEFSQU1fSURfQ0hfU1RBVFVTX0NPTkZJRyAweDAwMDEwMjQ1CisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUERJRl9DTEtfQ09ORklHIDB4MDAwMTAyNDYKKworI2RlZmluZSBBRkVfUE9SVF9DTEtfUk9PVF9MUEFQTEwgMHgzCisjZGVmaW5lIEFGRV9QT1JUX0NMS19ST09UX0xQQVE2UExMICAgMHg0CisKK3N0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2ZnIHsKKy8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIFNQRElGCisgKiBjb25maWd1cmF0aW9uIGludGVyZmFjZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfQVBJX1ZFUlNJT05fU1BESUZfQ09ORklHCisgKi8KKwl1MzIJc3BkaWZfY2ZnX21pbm9yX3ZlcnNpb247CisKKy8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMjJfMDVLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zMksKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ0XzFLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzk2SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTc2XzRLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCisgKi8KKwl1MzIJc2FtcGxlX3JhdGU7CisKKy8qIGRhdGEgZm9ybWF0CisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX0xJTkVBUl9QQ01fREFUQQorICogLSAjQUZFX05PTl9MSU5FQVJfREFUQQorICovCisJdTE2CWRhdGFfZm9ybWF0OworLyogTnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgcG9ydAorICogLSBQQ00gLSAxLCBDb21wcmVzc2VkIENhc2UgLSAyCisgKi8KKwl1MTYJbnVtX2NoYW5uZWxzOworLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCXUxNgliaXRfd2lkdGg7CisvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCisJdTE2CXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jaF9zdGF0dXNfY2ZnIHsKKwl1MzIgY2hfc3RhdHVzX2NmZ19taW5vcl92ZXJzaW9uOworLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiBjaGFubmVsCisgKiBzdGF0dXMgY29uZmlndXJhdGlvbi4gQ3VycmVudCBzdXBwb3J0ZWQgdmVyc2lvbiBpcyAxCisgKi8KKworCXUzMiBzdGF0dXNfdHlwZTsKKy8qIEluZGljYXRlIGlmIHRoZSBjaGFubmVsIHN0YXR1cyBpcyBmb3IgY2hhbm5lbCBBIG9yIEIKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfQ0hfU1RBVFVTX0EKKyAqIC0gI0FGRV9DSF9TVEFUVVNfQgorICovCisKKwl1OCBzdGF0dXNfYml0c1syNF07CisvKiBDaGFubmVsIHN0YXR1cyAtIDE5MiBiaXRzIGZvciBjaGFubmVsCisgKiBCeXRlIG9yZGVyaW5nIGFzIGRlZmluZWQgYnkgSUVDNjA5NTgtMworICovCisKKwl1OCBzdGF0dXNfbWFza1syNF07CisvKiBDaGFubmVsIHN0YXR1cyB3aXRoIG1hc2sgYml0cyAxIHdpbGwgYmUgYXBwbGllZC4KKyAqIEJ5dGUgb3JkZXJpbmcgYXMgZGVmaW5lZCBieSBJRUM2MDk1OC0zCisgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2xrX2NmZyB7CisJdTMyIGNsa19jZmdfbWlub3JfdmVyc2lvbjsKKy8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgU1BESUYKKyAqIGludGVyZmFjZSBjbG9jayBjb25maWd1cmF0aW9uLiBDdXJyZW50IHN1cHBvcnRlZCB2ZXJzaW9uCisgKiBpcyAxCisgKi8KKworCXUzMiBjbGtfdmFsdWU7CisvKiBTcGVjaWZpZXMgdGhlIGNsb2NrIGZyZXF1ZW5jeSBpbiBIeiB0byBzZXQKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAwIC0gRGlzYWJsZSB0aGUgY2xvY2sKKyAqIDIgKGJ5cGhhc2UpICogMzIgKDYwOTU4IHN1YmZyYW1lIHNpemUpICogc2FtcGxpbmcgcmF0ZSAqIDIKKyAqIChjaGFubmVscyBBIGFuZCBCKQorICovCisKKwl1MzIgY2xrX3Jvb3Q7CisvKiBTcGVjaWZpZXMgU1BESUYgcm9vdCBjbGsgc291cmNlCisgKiBTdXBwb3J0ZWQgVmFsdWVzOgorICogLSAjQUZFX1BPUlRfQ0xLX1JPT1RfTFBBUExMCisgKiAtICNBRkVfUE9SVF9DTEtfUk9PVF9MUEFRNlBMTAorICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3NwZGlmX2Nsa19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgICAgICAgICAgICAgICAgICAgIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiAgcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgIHBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2xrX2NmZyBjbGtfY2ZnOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcGRpZl9jaHN0YXR1c19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgICAgICAgICAgICAgICAgICAgIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiAgcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgIHBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2hfc3RhdHVzX2NmZyBjaF9zdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3NwZGlmX3BvcnRfY29uZmlnIHsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2NmZyAgICAgICAgICAgIGNmZzsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2NoX3N0YXR1c19jZmcgIGNoX3N0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1BDTV9DT05GSUcgICAgICAgIDB4MDAwMTAyMEUKKyNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1BDTV9DT05GSUcJMHgxCisvKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGF1eGlsaWFyeSBQQ00gc3luY2hyb25pemF0aW9uIHNpZ25hbAorICogcHJvdmlkZWQgYnkgYW4gZXh0ZXJuYWwgc291cmNlLgorICovCisKKyNkZWZpbmUgQUZFX1BPUlRfUENNX1NZTkNfU1JDX0VYVEVSTkFMIDB4MAorLyoJRW51bWVyYXRpb24gZm9yIHRoZSBhdXhpbGlhcnkgUENNIHN5bmNocm9uaXphdGlvbiBzaWduYWwKKyAqIHByb3ZpZGVkIGJ5IGFuIGludGVybmFsIHNvdXJjZS4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9QQ01fU1lOQ19TUkNfSU5URVJOQUwgIDB4MQorLyoJRW51bWVyYXRpb24gZm9yIHRoZSBQQ00gY29uZmlndXJhdGlvbiBhdXhfbW9kZSBwYXJhbWV0ZXIsCisgKiB3aGljaCBjb25maWd1cmVzIHRoZSBhdXhpbGlhcnkgUENNIGludGVyZmFjZSB0byB1c2UKKyAqIHNob3J0IHN5bmNocm9uaXphdGlvbi4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9QQ01fQVVYX01PREVfUENNICAweDAKKy8qCisgKiBFbnVtZXJhdGlvbiBmb3IgdGhlIFBDTSBjb25maWd1cmF0aW9uIGF1eF9tb2RlIHBhcmFtZXRlciwKKyAqIHdoaWNoIGNvbmZpZ3VyZXMgdGhlIGF1eGlsaWFyeSBQQ00gaW50ZXJmYWNlIHRvIHVzZSBsb25nCisgKiBzeW5jaHJvbml6YXRpb24uCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0FVWF9NT0RFX0FVWCAgICAweDEKKy8qCisgKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gZnJhbWUgdG8gOC4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfOCAgMHgwCisvKgorICogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIGZyYW1lIHRvIDE2LgorICovCisjZGVmaW5lIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8xNiAgIDB4MQorCisvKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gZnJhbWUgdG8gMzIuKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzMyIDB4MgorCisvKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gZnJhbWUgdG8gNjQuKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzY0ICAgMHgzCisKKy8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBmcmFtZSB0byAxMjguKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzEyOCAweDQKKworLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIGZyYW1lIHRvIDI1Ni4qLworI2RlZmluZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMjU2IDB4NQorCisvKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24KKyAqIHF1YW50eXBlIHBhcmFtZXRlciB0byBBLWxhdyB3aXRoIG5vIHBhZGRpbmcuCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0FMQVdfTk9QQURESU5HIDB4MAorCisvKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gcXVhbnR5cGUKKyAqIHBhcmFtZXRlciB0byBtdS1sYXcgd2l0aCBubyBwYWRkaW5nLgorICovCisjZGVmaW5lIEFGRV9QT1JUX1BDTV9NVUxBV19OT1BBRERJTkcgMHgxCisvKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gcXVhbnR5cGUKKyAqIHBhcmFtZXRlciB0byBsaW5lYXIgd2l0aCBubyBwYWRkaW5nLgorICovCisjZGVmaW5lIEFGRV9QT1JUX1BDTV9MSU5FQVJfTk9QQURESU5HIDB4MgorLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIHF1YW50eXBlCisgKiBwYXJhbWV0ZXIgdG8gQS1sYXcgd2l0aCBwYWRkaW5nLgorICovCisjZGVmaW5lIEFGRV9QT1JUX1BDTV9BTEFXX1BBRERJTkcgIDB4MworLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIHF1YW50eXBlCisgKiBwYXJhbWV0ZXIgdG8gbXUtbGF3IHdpdGggcGFkZGluZy4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9QQ01fTVVMQVdfUEFERElORyAweDQKKy8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBxdWFudHlwZQorICogcGFyYW1ldGVyIHRvIGxpbmVhciB3aXRoIHBhZGRpbmcuCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfUENNX0xJTkVBUl9QQURESU5HIDB4NQorLyoJRW51bWVyYXRpb24gZm9yIGRpc2FibGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24KKyAqIGN0cmxfZGF0YV9vdXRfZW5hYmxlIHBhcmFtZXRlci4KKyAqIFRoZSBQQ00gYmxvY2sgaXMgdGhlIG9ubHkgbWFzdGVyLgorICovCisjZGVmaW5lIEFGRV9QT1JUX1BDTV9DVFJMX0RBVEFfT0VfRElTQUJMRSAweDAKKy8qCisgKiBFbnVtZXJhdGlvbiBmb3IgZW5hYmxpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uCisgKiBjdHJsX2RhdGFfb3V0X2VuYWJsZSBwYXJhbWV0ZXIuIFRoZSBQQ00gYmxvY2sgc2hhcmVzCisgKiB0aGUgc2lnbmFsIHdpdGggb3RoZXIgbWFzdGVycy4KKyAqLworI2RlZmluZSBBRkVfUE9SVF9QQ01fQ1RSTF9EQVRBX09FX0VOQUJMRSAgMHgxCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX1BDTV9DT05GSUcgY29tbWFuZCdzCisgKiAoUENNIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKS4KKyAqLworCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX3BjbV9jZmcgeworCXUzMiAgICAgICAgICAgICAgICAgIHBjbV9jZmdfbWlub3JfdmVyc2lvbjsKKy8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIEFVWCBQQ00KKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9QQ01fQ09ORklHCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGF1eF9tb2RlOworLyogUENNIHN5bmNocm9uaXphdGlvbiBzZXR0aW5nLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX1BDTV9BVVhfTU9ERV9QQ00KKyAqIC0gI0FGRV9QT1JUX1BDTV9BVVhfTU9ERV9BVVgKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgc3luY19zcmM7CisvKiBTeW5jaHJvbml6YXRpb24gc291cmNlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX1BDTV9TWU5DX1NSQ19FWFRFUk5BTAorICogLSAjQUZFX1BPUlRfUENNX1NZTkNfU1JDX0lOVEVSTkFMCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmc7CisvKiBOdW1iZXIgb2YgYml0cyBwZXIgZnJhbWUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzgKKyAqIC0gI0FGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8xNgorICogLSAjQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzMyCisgKiAtICNBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfNjQKKyAqIC0gI0FGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8xMjgKKyAqIC0gI0FGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8yNTYKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcXVhbnR5cGU7CisvKiBQQ00gcXVhbnRpemF0aW9uIHR5cGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfUENNX0FMQVdfTk9QQURESU5HCisgKiAtICNBRkVfUE9SVF9QQ01fTVVMQVdfTk9QQURESU5HCisgKiAtICNBRkVfUE9SVF9QQ01fTElORUFSX05PUEFERElORworICogLSAjQUZFX1BPUlRfUENNX0FMQVdfUEFERElORworICogLSAjQUZFX1BPUlRfUENNX01VTEFXX1BBRERJTkcKKyAqIC0gI0FGRV9QT1JUX1BDTV9MSU5FQVJfUEFERElORworICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBjdHJsX2RhdGFfb3V0X2VuYWJsZTsKKy8qIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQQ00gYmxvY2sgc2hhcmVzIHRoZSBkYXRhLW91dAorICogc2lnbmFsIHRvIHRoZSBkcml2ZSB3aXRoIG90aGVyIG1hc3RlcnMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfUENNX0NUUkxfREFUQV9PRV9ESVNBQkxFCisgKiAtICNBRkVfUE9SVF9QQ01fQ1RSTF9EQVRBX09FX0VOQUJMRQorICovCisJCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKKy8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgorICogU3VwcG9ydGVkIHZhbHVlczogMTYKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyogTnVtYmVyIG9mIGNoYW5uZWxzLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA0CisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHNsb3RfbnVtYmVyX21hcHBpbmdbNF07CisvKiBTcGVjaWZpZXMgdGhlIHNsb3QgbnVtYmVyIGZvciB0aGUgZWFjaCBjaGFubmVsIGluCisgKiBtdWx0aSBjaGFubmVsIHNjZW5hcmlvLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAzMgorICovCit9IF9fcGFja2VkOworCisvKgorICogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBESUdJIE1JQyBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBBRkVfUEFSQU1fSURfRElHSV9NSUNfQ09ORklHCTB4MDAwMTAyMEYKKy8qICBUaGlzIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgdXNlZCB0byBoYW5kbGUgdGhlIG5ldworICogICBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZyBpbnRlcmZhY2UgaW4gZnV0dXJlIGluIGJhY2t3YXJkCisgKiAgIGNvbXBhdGlibGUgbWFubmVyLgorICovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9ESUdJX01JQ19DT05GSUcgMHgxCisKKy8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBkaWdpdGFsIG1pYyBjb25maWd1cmF0aW9uCisgKiBjaGFubmVsX21vZGUgcGFyYW1ldGVyIHRvIGxlZnQgMC4KKyAqLworCisjZGVmaW5lIEFGRV9QT1JUX0RJR0lfTUlDX01PREVfTEVGVDAgIDB4MQorCisvKkVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBkaWdpdGFsIG1pYyBjb25maWd1cmF0aW9uCisgKiBjaGFubmVsX21vZGUgcGFyYW1ldGVyIHRvIHJpZ2h0IDAuCisgKi8KKworCisjZGVmaW5lIEFGRV9QT1JUX0RJR0lfTUlDX01PREVfUklHSFQwICAweDIKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gbGVmdCAxLgorICovCisKKyNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9MRUZUMSAgMHgzCisKKy8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBkaWdpdGFsIG1pYyBjb25maWd1cmF0aW9uCisgKiBjaGFubmVsX21vZGUgcGFyYW1ldGVyIHRvIHJpZ2h0IDEuCisgKi8KKworI2RlZmluZSBBRkVfUE9SVF9ESUdJX01JQ19NT0RFX1JJR0hUMSAweDQKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gc3RlcmVvIDAuCisgKi8KKyNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9TVEVSRU8wICAweDUKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gc3RlcmVvIDEuCisgKi8KKworCisjZGVmaW5lIEFGRV9QT1JUX0RJR0lfTUlDX01PREVfU1RFUkVPMSAgICAweDYKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KKyAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gcXVhZC4KKyAqLworCisjZGVmaW5lIEFGRV9QT1JUX0RJR0lfTUlDX01PREVfUVVBRCAgICAgMHg3CisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0RJR0lfTUlDX0NPTkZJRyBjb21tYW5kJ3MKKyAqIChESUdJIE1JQyBjb25maWd1cmF0aW9uCisgKiBwYXJhbWV0ZXIpLgorICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX2RpZ2lfbWljX2NmZyB7CisJdTMyICAgICAgICAgICAgICAgICAgZGlnaV9taWNfY2ZnX21pbm9yX3ZlcnNpb247CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBESUdJIE1pYworICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0RJR0lfTUlDX0NPTkZJRworICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7CisvKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2CisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbW9kZTsKKy8qIERpZ2l0YWwgbWljIGFuZCBtdWx0aWNoYW5uZWwgb3BlcmF0aW9uLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfTEVGVDAKKyAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfUklHSFQwCisgKiAtICNBRkVfUE9SVF9ESUdJX01JQ19NT0RFX0xFRlQxCisgKiAtICNBRkVfUE9SVF9ESUdJX01JQ19NT0RFX1JJR0hUMQorICogLSAjQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9TVEVSRU8wCisgKiAtICNBRkVfUE9SVF9ESUdJX01JQ19NT0RFX1NURVJFTzEKKyAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfUVVBRAorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfNDhLCisgKi8KK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgSERNSSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0hETUlfQ09ORklHICAgICAweDAwMDEwMjEwCisKKy8qIFRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgbmV3CisgKiBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZyBpbnRlcmZhY2UgaW4gZnV0dXJlIGluIGJhY2t3YXJkCisgKiBjb21wYXRpYmxlIG1hbm5lci4KKyAqLworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fSERNSV9DT05GSUcgMHgxCisKKy8qIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfSERNSV9DT05GSUcgY29tbWFuZCwKKyAqIHdoaWNoIGNvbmZpZ3VyZXMgYSBtdWx0aWNoYW5uZWwgSERNSSBhdWRpbyBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBhZmVfcGFyYW1faWRfaGRtaV9tdWx0aV9jaGFuX2F1ZGlvX2NmZyB7CisJdTMyICAgICAgICAgICAgICAgICAgaGRtaV9jZmdfbWlub3JfdmVyc2lvbjsKKy8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIEhETUkKKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9IRE1JX0NPTkZJRworICovCisKK3UxNiAgICAgICAgICAgICAgICAgIGRhdGF0eXBlOworLyogZGF0YSB0eXBlCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjTElORUFSX1BDTV9EQVRBCisgKiAtICNOT05fTElORUFSX0RBVEEKKyAqIC0gI0xJTkVBUl9QQ01fREFUQV9QQUNLRURfSU5fNjA5NTgKKyAqIC0gI05PTl9MSU5FQVJfREFUQV9QQUNLRURfSU5fNjA5NTgKKyAqLworCit1MTYgICAgICAgICAgICAgICAgICBjaGFubmVsX2FsbG9jYXRpb247CisvKiBIRE1JIGNoYW5uZWwgYWxsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgcHJvZ3JhbW1pbmcgYW4gSERNSQorICogZnJhbWUuIFRoZSBkZWZhdWx0IGlzIDAgKFN0ZXJlbykuCisgKgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBIRE1JIHN0YW5kYXJkLCBDRUEgODYxLUQKKyAqIChyZWZlciB0byBAeGh5cGVycmVme1MxLFtTMV19KS4gVGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBhbHNvCisgKiBpbmZlcnJlZCBmcm9tIHRoaXMgcGFyYW1ldGVyLgorICovCisKKwordTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisvKiBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCisgKiAtIDIyMDUwLCA0NDEwMCwgMTc2NDAwIGZvciBjb21wcmVzc2VkIHN0cmVhbXMKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOworLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCQl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCit9IF9fcGFja2VkOworCisvKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIEJUIG9yIEZNKFJJVkEpIGludGVyZmFjZSAqLworI2RlZmluZSBBRkVfUEFSQU1fSURfSU5URVJOQUxfQlRfRk1fQ09ORklHICAweDAwMDEwMjExCisKKy8qIFRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgbmV3CisgKiBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZyBpbnRlcmZhY2UgaW4gZnV0dXJlIGluIGJhY2t3YXJkCisgKiBjb21wYXRpYmxlIG1hbm5lci4KKyAqLworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fSU5URVJOQUxfQlRfRk1fQ09ORklHCTB4MQorCisvKiBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0lOVEVSTkFMX0JUX0ZNX0NPTkZJRworICogY29tbWFuZCdzIEJUIHZvaWNlL0JUIGF1ZGlvL0ZNIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX2ludGVybmFsX2J0X2ZtX2NmZyB7CisJdTMyICAgICAgICAgICAgICAgICAgYnRfZm1fY2ZnX21pbm9yX3ZlcnNpb247CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBCVCBhbmQgRk0KKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9JTlRFUk5BTF9CVF9GTV9DT05GSUcKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyogTnVtYmVyIG9mIGNoYW5uZWxzLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAyCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKKy8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgorICogU3VwcG9ydGVkIHZhbHVlczogMTYKKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisvKiBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLIChvbmx5IGZvciBCVFNDTykKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SyAob25seSBmb3IgQlRTQ08pCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsgKEZNIGFuZCBBMkRQKQorICovCit9IF9fcGFja2VkOworCisvKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIFNMSU1CVVMgaW50ZXJmYWNlIHVzaW5nCisgKiBzaGFyZWQgY2hhbm5lbCBhcHByb2FjaC4KKyAqLworCisKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NMSU1CVVNfQ09ORklHICAgIDB4MDAwMTAyMTIKKworLyogVGhpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSBuZXcKKyAqIGFkZGl0aW9ucyB0byB0aGUgY29uZmlnIGludGVyZmFjZSBpbiBmdXR1cmUgaW4gYmFja3dhcmQKKyAqIGNvbXBhdGlibGUgbWFubmVyLgorICovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9TTElNQlVTX0NPTkZJRyAweDEKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgU0xJTWJ1cyBkZXZpY2UgSUQgMS4gKi8KKyNkZWZpbmUgQUZFX1NMSU1CVVNfREVWSUNFXzEgICAgICAgICAgIDB4MAorCisvKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyBTTElNYnVzIGRldmljZSBJRCAyLiAqLworI2RlZmluZSBBRkVfU0xJTUJVU19ERVZJQ0VfMiAgICAgICAgICAweDEKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFNMSU1idXMgZGF0YSBmb3JtYXRzLiAqLworI2RlZmluZSBBRkVfU0JfREFUQV9GT1JNQVRfTk9UX0lORElDQVRFRCAweDAKKworLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgcGVyCisgKiBkZXZpY2UuCisgKi8KKworI2RlZmluZSBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQJMHg4CisKKy8qIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfU0xJTUJVU19DT05GSUcgY29tbWFuZCdzIFNMSU1idXMKKyAqIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCisgKi8KKworc3RydWN0IGFmZV9wYXJhbV9pZF9zbGltYnVzX2NmZyB7CisJdTMyICAgICAgICAgICAgICAgICAgc2JfY2ZnX21pbm9yX3ZlcnNpb247CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBTTElNQlVTCisgKiBjb25maWd1cmF0aW9uIGludGVyZmFjZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfQVBJX1ZFUlNJT05fU0xJTUJVU19DT05GSUcKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgc2xpbWJ1c19kZXZfaWQ7CisvKiBTTElNYnVzIGhhcmR3YXJlIGRldmljZSBJRCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gaGFuZGxlCisgKiBtdWx0aXBsZSBTTElNYnVzIGhhcmR3YXJlIGJsb2Nrcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IC0gI0FGRV9TTElNQlVTX0RFVklDRV8xIC0gI0FGRV9TTElNQlVTX0RFVklDRV8yCisgKi8KKworCisJdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOworLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgZGF0YV9mb3JtYXQ7CisvKiBEYXRhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIFNMSU1idXMgaGFyZHdhcmUuIFRoZSBkZWZhdWx0IGlzCisgKiAwICgjQUZFX1NCX0RBVEFfRk9STUFUX05PVF9JTkRJQ0FURUQpLCB3aGljaCBpbmRpY2F0ZXMgdGhlCisgKiBoYXJkd2FyZSBkb2VzIG5vdCBwZXJmb3JtIGFueSBmb3JtYXQgY29udmVyc2lvbnMgYmVmb3JlIHRoZSBkYXRhCisgKiB0cmFuc2Zlci4KKyAqLworCisKKwl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7CisvKiBOdW1iZXIgb2YgY2hhbm5lbHMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvICNBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQKKyAqLworCisJdTggIHNoYXJlZF9jaF9tYXBwaW5nW0FGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVF07CisvKiBNYXBwaW5nIG9mIHNoYXJlZCBjaGFubmVsIElEcyAoMTI4IHRvIDI1NSkgdG8gd2hpY2ggdGhlCisgKiBtYXN0ZXIgcG9ydCBpcyB0byBiZSBjb25uZWN0ZWQuCisgKiBTaGFyZWRfY2hhbm5lbF9tYXBwaW5nW2ldIHJlcHJlc2VudHMgdGhlIHNoYXJlZCBjaGFubmVsIGFzc2lnbmVkCisgKiBmb3IgYXVkaW8gY2hhbm5lbCBpIGluIG11bHRpY2hhbm5lbCBhdWRpbyBkYXRhLgorICovCisKKwl1MzIgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKyAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzk2SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTkySworICovCit9IF9fcGFja2VkOworCisKKy8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZCBieSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0RFVl9QQVJBTVMgdG8gY29uZmlndXJlCisgKiBVU0IgYXVkaW8gZGV2aWNlIHBhcmFtZXRlci4gSXQgc2hvdWxkIGJlIHVzZWQgd2l0aAorICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1VTQl9BVURJT19ERVZfUEFSQU1TICAgIDB4MDAwMTAyQTUKKworLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyBVU0IgYXVkaW8gIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQUZFX0FQSV9NSU5JT1JfVkVSU0lPTl9VU0JfQVVESU9fQ09ORklHIDB4MQorCisvKiBQYXlsb2FkIG9mIHRoZSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0RFVl9QQVJBTVMgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRS4KKyAqLworc3RydWN0IGFmZV9wYXJhbV9pZF91c2JfYXVkaW9fZGV2X3BhcmFtcyB7CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIFVTQiBhdWRpbyBkZXZpY2UgcGFyYW1ldGVyLgorICogU3VwcG9ydGVkIHZhbHVlczogQUZFX0FQSV9NSU5JT1JfVkVSU0lPTl9VU0JfQVVESU9fQ09ORklHCisgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBjZmdfbWlub3JfdmVyc2lvbjsKKy8qIFRva2VuIG9mIGFjdHVhbCBlbmQgVVNCIGFkdWlvIGRldmljZSAqLworCXUzMiAgICAgICAgICAgICAgICAgIGRldl90b2tlbjsKK30gX19wYWNrZWQ7CisKKy8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZCBieSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0NPTkZJRyB0byBjb25maWd1cmUKKyAqIFVTQiBhdWRpbyBpbnRlcmZhY2UuIEl0IHNob3VsZCBiZSB1c2VkIHdpdGggQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1VTQl9BVURJT19DT05GSUcgICAgMHgwMDAxMDJBNAorCisvKiBQYXlsb2FkIG9mIHRoZSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0NPTkZJRyBwYXJhbWV0ZXIgdXNlZCBieQorICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgorICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX3VzYl9hdWRpb19jZmcgeworLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyBVU0IgYXVkaW8gZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBRkVfQVBJX01JTklPUl9WRVJTSU9OX1VTQl9BVURJT19DT05GSUcKKyAqLworCXUzMiAgICAgICAgICAgICAgICAgIGNmZ19taW5vcl92ZXJzaW9uOworLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCisgKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzExMDI1CisgKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzEySworICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKKyAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfMjIwNTAKKyAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfMjRLCisgKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzMySworICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV80NFAxSworICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKyAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCisgKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzE5MksKKyAqLworCXUzMiAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKKy8qIE51bWJlciBvZiBjaGFubmVscy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgYW5kIDIKKyAqLworCXUxNiAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKKy8qIERhdGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgVVNCLiBUaGUgc3VwcG9ydGVkIHZhbHVlIGlzCisgKiAwICgjQUZFX1VTQl9BVURJT19EQVRBX0ZPUk1BVF9MSU5FQVJfUENNKS4KKyAqLworCXUxNiAgICAgICAgICAgICAgICAgIGRhdGFfZm9ybWF0OworLyogdGhpcyBmaWVsZCBtdXN0IGJlIDAgKi8KKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKy8qIGRldmljZSB0b2tlbiBvZiBhY3R1YWwgZW5kIFVTQiBhZHVpbyBkZXZpY2UgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBkZXZfdG9rZW47Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3VzYl9hdWRpb19kZXZfcGFyYW1fY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgIHBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1faWRfdXNiX2F1ZGlvX2Rldl9wYXJhbXMgdXNiX2RldjsKK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgUmVhbCBUaW1lIFByb3h5IGludGVyZmFjZS4gKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1JUX1BST1hZX0NPTkZJRyAweDAwMDEwMjEzCisKKy8qIFRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgbmV3CisgKiBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZyBpbnRlcmZhY2UgaW4gZnV0dXJlIGluIGJhY2t3YXJkCisgKiBjb21wYXRpYmxlIG1hbm5lci4KKyAqLworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fUlRfUFJPWFlfQ09ORklHIDB4MQorCisvKiAgUGF5bG9hZCBvZiB0aGUgI0FGRV9QQVJBTV9JRF9SVF9QUk9YWV9DT05GSUcKKyAqIGNvbW1hbmQgKHJlYWwtdGltZSBwcm94eSBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKS4KKyAqLworc3RydWN0IGFmZV9wYXJhbV9pZF9ydF9wcm94eV9wb3J0X2NmZyB7CisJdTMyICAgICAgICAgICAgICAgICAgcnRfcHJveHlfY2ZnX21pbm9yX3ZlcnNpb247CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHJ0LXByb3h5CisgKiBjb25maWcgaW50ZXJmYWNlLgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7CisvKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2CisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkOworLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIEFGRQorICogaW50ZXJmYWNlIGFuZCByZWFsLXRpbWUgcG9ydCBpcyBpbnRlcmxlYXZlZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IC0gMCAtLSBOb24taW50ZXJsZWF2ZWQgKHNhbXBsZXMgZnJvbSBlYWNoCisgKiBjaGFubmVsIGFyZSBjb250aWd1b3VzIGluIHRoZSBidWZmZXIpIC0gMSAtLSBJbnRlcmxlYXZlZAorICogKGNvcnJlc3BvbmRpbmcgc2FtcGxlcyBmcm9tIGVhY2ggaW5wdXQgY2hhbm5lbCBhcmUgaW50ZXJsZWF2ZWQKKyAqIHdpdGhpbiB0aGUgYnVmZmVyKQorICovCisKKworCXUxNiAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemU7CisvKiBTaXplIG9mIHRoZSBmcmFtZXMgdGhhdCBhcmUgdXNlZCBmb3IgUENNIGV4Y2hhbmdlcyB3aXRoIHRoaXMKKyAqIHBvcnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAsIGluIGJ5dGVzCisgKiBGb3IgZXhhbXBsZSwgNSBtcyBidWZmZXJzIG9mIDE2IGJpdHMgYW5kIDE2IGtIeiBzdGVyZW8gc2FtcGxlcworICogaXMgNSBtcyAqIDE2IHNhbXBsZXMvbXMgKiAyIGJ5dGVzL3NhbXBsZSAqIDIgY2hhbm5lbHMgPSAzMjAKKyAqIGJ5dGVzLgorICovCisJdTE2ICAgICAgICAgICAgICAgICAgaml0dGVyX2FsbG93YW5jZTsKKy8qIENvbmZpZ3VyZXMgdGhlIGFtb3VudCBvZiBqaXR0ZXIgdGhhdCB0aGUgcG9ydCB3aWxsIGFsbG93LgorICogU3VwcG9ydGVkIHZhbHVlczogPiAwCisgKiBGb3IgZXhhbXBsZSwgaWYgKy8tMTAgbXMgb2Ygaml0dGVyIGlzIGFudGljaXBhdGVkIGluIHRoZSB0aW1pbmcKKyAqIG9mIHNlbmRpbmcgZnJhbWVzIHRvIHRoZSBwb3J0LCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgMTYga0h6CisgKiBtb25vIHdpdGggMTYtYml0IHNhbXBsZXMsIHRoaXMgZmllbGQgaXMgMTAgbXMgKiAxNiBzYW1wbGVzL21zICogMgorICogYnl0ZXMvc2FtcGxlID0gMzIwLgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBsb3dfd2F0ZXJfbWFyazsKKy8qIExvdyB3YXRlcm1hcmsgaW4gYnl0ZXMgKGluY2x1ZGluZyBhbGwgY2hhbm5lbHMpLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMCAtLSBEbyBub3Qgc2VuZCBhbnkgbG93IHdhdGVybWFyayBldmVudHMKKyAqIC0gPiAwIC0tIExvdyB3YXRlcm1hcmsgZm9yIHRyaWdnZXJpbmcgYW4gZXZlbnQKKyAqIElmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gaW50ZXJuYWwgY2lyY3VsYXIgYnVmZmVyIGlzIGxvd2VyCisgKiB0aGFuIHRoaXMgbG93X3dhdGVyX21hcmsgcGFyYW1ldGVyLCBhIExPV19XQVRFUl9NQVJLIGV2ZW50IGlzCisgKiBzZW50IHRvIGFwcGxpY2F0aW9ucyAodmlhIHRoZSAjQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTCisgKiBldmVudCkuCisgKiBVc2Ugb2Ygd2F0ZXJtYXJrIGV2ZW50cyBpcyBvcHRpb25hbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBoaWdoX3dhdGVyX21hcms7CisvKiBIaWdoIHdhdGVybWFyayBpbiBieXRlcyAoaW5jbHVkaW5nIGFsbCBjaGFubmVscykuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAwIC0tIERvIG5vdCBzZW5kIGFueSBoaWdoIHdhdGVybWFyayBldmVudHMKKyAqIC0gPiAwIC0tIEhpZ2ggd2F0ZXJtYXJrIGZvciB0cmlnZ2VyaW5nIGFuIGV2ZW50CisgKiBJZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGludGVybmFsIGNpcmN1bGFyIGJ1ZmZlciBleGNlZWRzCisgKiBUT1RBTF9DSVJDX0JVRl9TSVpFIG1pbnVzIGhpZ2hfd2F0ZXJfbWFyaywgYSBoaWdoIHdhdGVybWFyayBldmVudAorICogaXMgc2VudCB0byBhcHBsaWNhdGlvbnMgKHZpYSB0aGUgI0FGRV9FVkVOVF9SVF9QUk9YWV9QT1JUX1NUQVRVUworICogZXZlbnQpLgorICogVGhlIHVzZSBvZiB3YXRlcm1hcmsgZXZlbnRzIGlzIG9wdGlvbmFsIGFuZCBmb3IgZGVidWdnaW5nCisgKiBwdXJwb3Nlcy4KKyAqLworCisKKwl1MzIJCQkJCXNhbXBsZV9yYXRlOworLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SworICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCisgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyogTnVtYmVyIG9mIGNoYW5uZWxzLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAjQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIEZvciAzMiBiaXQgYWxpZ25tZW50LiAqLworfSBfX3BhY2tlZDsKKworCisvKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQc2V1ZG9wb3J0IGludGVyZmFjZSAqLworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9QU0VVRE9fUE9SVF9DT05GSUcJMHgwMDAxMDIxOQorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIHVzZWQgdG8gaGFuZGxlIGZ1dHVyZSBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZ3VyYXRpb24KKyAqIGludGVyZmFjZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorICovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9QU0VVRE9fUE9SVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgdGltaW5nX21vZGUgcGFyYW1ldGVyIHRvIGZhc3RlciB0aGFuIHJlYWwKKyAqIHRpbWUuCisgKi8KKyNkZWZpbmUgQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfRlRSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisKKy8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSB0aW1pbmdfbW9kZSBwYXJhbWV0ZXIgdG8gcmVhbCB0aW1lIHVzaW5nCisgKiB0aW1lcnMuCisgKi8KKyNkZWZpbmUgQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9QU0VVRE9fUE9SVF9DT05GSUcgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRS4KKyAqLworc3RydWN0IGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcgeworCXUzMiAgICAgICAgICAgICAgICAgIHBzZXVkX3BvcnRfY2ZnX21pbm9yX3ZlcnNpb247CisJLyoKKwkgKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBwc2V1ZG9wb3J0CisJICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCisJICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7CisJLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUgYXQgdmFsdWVzIDE2LCAyNCAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworCS8qIE51bWJlciBvZiBjaGFubmVscyBhdCB2YWx1ZXMgIDEgdG8gOCAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgZGF0YV9mb3JtYXQ7CisJLyogTm9uLWxpbmVhciBkYXRhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBzZXVkb3BvcnQgKGZvciBmdXR1cmUgdXNlKS4KKwkgKiBBdCB2YWx1ZXMgI0FGRV9MSU5FQVJfUENNX0RBVEEKKwkgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHRpbWluZ19tb2RlOworCS8qIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwc2V1ZG9wb3J0IHN5bmNocm9uaXplcyB0byB0aGUgY2xvY2sgb3IKKwkgKiBvcGVyYXRlcyBmYXN0ZXIgdGhhbiByZWFsIHRpbWUuCisJICogYXQgdmFsdWVzCisJICogLSAjQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfRlRSVAorCSAqIC0gI0FGRV9QU0VVRE9QT1JUX1RJTUlOR19NT0RFX1RJTUVSIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCisJdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisJLyogU2FtcGxlIHJhdGUgYXQgd2hpY2ggdGhlIHBzZXVkb3BvcnQgd2lsbCBydW4uCisJICogYXQgdmFsdWVzCisJICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKKwkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zMksKKwkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKwkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV85NksKKwkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLIEB0YWJsZWJ1bGxldGVuZAorCSAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUEFSQU1fSURfVERNX0NPTkZJRwkJMHgwMDAxMDI5RAorCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9URE1fQ09ORklHICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfQklUX01PREUgICAgICAgIDAKKyNkZWZpbmUgQUZFX1BPUlRfVERNX0xPTkdfU1lOQ19NT0RFICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfU0xPVF9NT0RFICAgICAgIDIKKworI2RlZmluZSBBRkVfUE9SVF9URE1fU1lOQ19TUkNfRVhURVJOQUwgICAgICAgICAgMAorI2RlZmluZSBBRkVfUE9SVF9URE1fU1lOQ19TUkNfSU5URVJOQUwgICAgICAgICAgMQorCisjZGVmaW5lIEFGRV9QT1JUX1RETV9DVFJMX0RBVEFfT0VfRElTQUJMRSAgICAgICAwCisjZGVmaW5lIEFGRV9QT1JUX1RETV9DVFJMX0RBVEFfT0VfRU5BQkxFICAgICAgICAxCisKKyNkZWZpbmUgQUZFX1BPUlRfVERNX1NZTkNfTk9STUFMICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUZFX1BPUlRfVERNX1NZTkNfSU5WRVJUICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8wX0JDTEtfQ1lDTEUgICAgMAorI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8xX0JDTEtfQ1lDTEUgICAgMQorI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8yX0JDTEtfQ1lDTEUgICAgMgorCisvKiBQYXlsb2FkIG9mIHRoZSBBRkVfUEFSQU1fSURfVERNX0NPTkZJRyBwYXJhbWV0ZXIgdXNlZCBieQorICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgorICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX3RkbV9jZmcgeworCXUzMgl0ZG1fY2ZnX21pbm9yX3ZlcnNpb247CisJLyogPCBNaW5vciB2ZXJzaW9uIHVzZWQgdG8gdHJhY2sgVERNIGNvbmZpZ3VyYXRpb24uCisJICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX1RETV9DT05GSUcKKwkgKi8KKworCXUzMgludW1fY2hhbm5lbHM7CisJLyogPCBOdW1iZXIgb2YgZW5hYmxlZCBzbG90cyBmb3IgVERNIGZyYW1lLgorCSAqIEB2YWx1ZXMgMSB0byA4CisJICovCisKKwl1MzIJc2FtcGxlX3JhdGU7CisJLyogPCBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgorCSAqIEB2YWx1ZXMKKwkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SworCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SworCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzI0SworCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzMySworCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SyBAdGFibGVidWxsZXRlbmQKKwkgKi8KKworCXUzMgliaXRfd2lkdGg7CisJLyogPCBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KKwkgKiBAdmFsdWVzIDE2LCAyNAorCSAqLworCisJdTE2CWRhdGFfZm9ybWF0OworCS8qIDwgRGF0YSBmb3JtYXQ6IGxpbmVhciBhbmQgY29tcHJlc3NlZAorCSAqIEB2YWx1ZXMKKwkgKiAtICNBRkVfTElORUFSX1BDTV9EQVRBCisJICogLSAjQUZFX05PTl9MSU5FQVJfREFUQSBAdGFibGVidWxsZXRlbmQKKwkgKi8KKworCXUxNglzeW5jX21vZGU7CisJLyogPCBURE0gc3luY2hyb25pemF0aW9uIHNldHRpbmcuCisJICogQHZhbHVlcyAoc2hvcnQsIGxvbmcsIHNsb3QpIHN5bmMgbW9kZQorCSAqIC0gI0FGRV9QT1JUX1RETV9TSE9SVF9TWU5DX0JJVF9NT0RFCisJICogLSAjQUZFX1BPUlRfVERNX0xPTkdfU1lOQ19NT0RFCisJICogLSAjQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfU0xPVF9NT0RFIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCisJdTE2CXN5bmNfc3JjOworCS8qIDwgU3luY2hyb25pemF0aW9uIHNvdXJjZS4KKwkgKiBAdmFsdWVzCisJICogLSAjQUZFX1BPUlRfVERNX1NZTkNfU1JDX0VYVEVSTkFMCisJICogLSAjQUZFX1BPUlRfVERNX1NZTkNfU1JDX0lOVEVSTkFMIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCisJdTE2CW5zbG90c19wZXJfZnJhbWU7CisJLyogPCBOdW1iZXIgb2Ygc2xvdHMgcGVyIGZyYW1lLiBUeXBpY2FsIDogMSwgMiwgNCwgOCwgMTYsIDMyLgorCSAqIEB2YWx1ZXMgMSAtIDMyCisJICovCisKKwl1MTYJY3RybF9kYXRhX291dF9lbmFibGU7CisJLyogPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVERNIGJsb2NrIHNoYXJlcyB0aGUgZGF0YS1vdXQgc2lnbmFsIHRvIHRoZQorCSAqIGRyaXZlIHdpdGggb3RoZXIgbWFzdGVycy4KKwkgKiBAdmFsdWVzCisJICogLSAjQUZFX1BPUlRfVERNX0NUUkxfREFUQV9PRV9ESVNBQkxFCisJICogLSAjQUZFX1BPUlRfVERNX0NUUkxfREFUQV9PRV9FTkFCTEUgQHRhYmxlYnVsbGV0ZW5kCisJICovCisKKwl1MTYJY3RybF9pbnZlcnRfc3luY19wdWxzZTsKKwkvKiA8IFNwZWNpZmllcyB3aGV0aGVyIHRvIGludmVydCB0aGUgc3luYyBvciBub3QuCisJICogQHZhbHVlcworCSAqIC0gI0FGRV9QT1JUX1RETV9TWU5DX05PUk1BTAorCSAqIC0gI0FGRV9QT1JUX1RETV9TWU5DX0lOVkVSVCBAdGFibGVidWxsZXRlbmQKKwkgKi8KKworCXUxNgljdHJsX3N5bmNfZGF0YV9kZWxheTsKKwkvKiA8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdCBjbG9jayB0byBkZWxheSBkYXRhIHdpdGggcmVzcGVjdCB0bworCSAqIHN5bmMgZWRnZS4KKwkgKiBAdmFsdWVzCisJICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMF9CQ0xLX0NZQ0xFCisJICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMV9CQ0xLX0NZQ0xFCisJICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMl9CQ0xLX0NZQ0xFIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCisJdTE2CXNsb3Rfd2lkdGg7CisJLyogPCBTbG90IHdpZHRoIG9mIHRoZSBzbG90IGluIGEgVERNIGZyYW1lLiAgKHNsb3Rfd2lkdGggPj0gYml0X3dpZHRoKQorCSAqIGhhdmUgdG8gYmUgc2F0aXNmaWVkLgorCSAqIEB2YWx1ZXMgMTYsIDI0LCAzMgorCSAqLworCisJdTMyCXNsb3RfbWFzazsKKwkvKiA8IFBvc2l0aW9uIG9mIGFjdGl2ZSBzbG90cy4gIFdoZW4gdGhhdCBiaXQgaXMgc2V0LAorCSAqIHRoYXQgcGFyaWN1bGFyIHNsb3QgaXMgYWN0aXZlLgorCSAqIE51bWJlciBvZiBhY3RpdmUgc2xvdHMgY2FuIGJlIGluZmVycmVkIGJ5IG51bWJlciBvZgorCSAqIGJpdHMgc2V0IGluIHRoZSBtYXNrLiAgT25seSA4IGluZGl2aWR1YWwgYml0cyBjYW4gYmUgZW5hYmxlZC4KKwkgKiBCaXRzIDAuLjMxIGNvcnJlc3BvbmRpbmcgdG8gc2xvdCAwLi4zMQorCSAqIEB2YWx1ZXMgMSB0byAyXjMyIC0gMQorCSAqLworfSBfX3BhY2tlZDsKKworLyogSUQgb2YgVGltZSBEaXZzaW9uIE11bHRpcGxleGluZyAoVERNKSBtb2R1bGUsCisgKiB3aGljaCBpcyB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgQUZFIFRETS4KKyAqCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKyAqIC0gI0FGRV9QT1JUX1RETV9TTE9UX0NPTkZJRworICoKKyAqIFRvIGNvbmZpZ3VyZSB0aGUgVERNIGludGVyZmFjZSwgdGhlIGNsaWVudCBtdXN0IHVzZSB0aGUKKyAqICNBRkVfUE9SVF9DTURfU0VUX1BBUkFNIGNvbW1hbmQsIGFuZCBmaWxsIHRoZSBtb2R1bGUgSUQgd2l0aCB0aGUKKyAqIHJlc3BlY3RpdmUgcGFyYW1ldGVyIElEcyBhcyBsaXN0ZWQgYWJvdmUuCisgKi8KKworI2RlZmluZSBBRkVfTU9EVUxFX1RETQkJMHgwMDAxMDI4QQorCisvKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgI0FGRV9NT0RVTEVfVERNIHRvIGNvbmZpZ3VyZQorICogdGhlIFRETSBzbG90IG1hcHBpbmcuICNBRkVfUE9SVF9DTURfU0VUX1BBUkFNIGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIgSUQuCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1BPUlRfU0xPVF9NQVBQSU5HX0NPTkZJRwkweDAwMDEwMjk3CisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gdXNlZCB0byBoYW5kbGUgZnV0dXJlIGFkZGl0aW9ucyB0byBzbG90IG1hcHBpbmcKKyAqIGNvbmZpZ3VyYXRpb24gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KKyAqLworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU0xPVF9NQVBQSU5HX0NPTkZJRwkweDEKKworLyogRGF0YSBhbGlnbiB0eXBlICAqLworI2RlZmluZSBBRkVfU0xPVF9NQVBQSU5HX0RBVEFfQUxJR05fTVNCCQkwCisjZGVmaW5lIEFGRV9TTE9UX01BUFBJTkdfREFUQV9BTElHTl9MU0IJCTEKKworI2RlZmluZSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElECQkweEZGRkYKKworLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX1BPUlRfU0xPVF9NQVBQSU5HX0NPTkZJRworICogY29tbWFuZCdzIFRETSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KKyAqLworc3RydWN0IGFmZV9wYXJhbV9pZF9zbG90X21hcHBpbmdfY2ZnIHsKKwl1MzIJbWlub3JfdmVyc2lvbjsKKwkvKiA8IE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgVERNIHNsb3QgY29uZmlndXJhdGlvbi4KKwkgKiBAdmFsdWVzICNBRkVfQVBJX1ZFUlNJT05fVERNX1NMT1RfQ09ORklHCisJICovCisKKwl1MTYJbnVtX2NoYW5uZWw7CisJLyogPCBudW1iZXIgb2YgY2hhbm5lbCBvZiB0aGUgYXVkaW8gc2FtcGxlLgorCSAqIEB2YWx1ZXMgMSwgMiwgNCwgNiwgOCBAdGFibGVidWxsZXRlbmQKKwkgKi8KKworCXUxNgliaXR3aWR0aDsKKwkvKiA8IFNsb3QgYml0IHdpZHRoIGZvciBlYWNoIGNoYW5uZWwKKwkgKiBAdmFsdWVzIDE2LCAyNCwgMzIKKwkgKi8KKworCXUzMglkYXRhX2FsaWduX3R5cGU7CisJLyogPCBpbmRpY2F0ZSBob3cgZGF0YSBwYWNrZWQgZnJvbSBzbG90X29mZnNldCBmb3IgMzIgc2xvdCBiaXQgd2lkdGgKKwkgKiBpbiBjYXNlIG9mIHNhbXBsZSBiaXQgd2lkdGggaXMgMjQuCisJICogQHZhbHVlcworCSAqICNBRkVfU0xPVF9NQVBQSU5HX0RBVEFfQUxJR05fTVNCCisJICogI0FGRV9TTE9UX01BUFBJTkdfREFUQV9BTElHTl9MU0IKKwkgKi8KKworCXUxNglvZmZzZXRbQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UXTsKKwkvKiA8IEFycmF5IG9mIHRoZSBzbG90IG1hcHBpbmcgc3RhcnQgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGlzIGZyYW1lLgorCSAqIFRoZSBieXRlcyBpcyBjb3VudGVkIGZyb20gMC4gVGhlIDAgaXMgbWFwcGVkIHRvIHRoZSAxc3QgYnl0ZQorCSAqIGluIG9yIG91dCBvZiB0aGUgZGlnaXRhbCBzZXJpYWwgZGF0YSBsaW5lIHRoaXMgc3ViLWZyYW1lIGJlbG9uZyB0by4KKwkgKiBzbG90X29mZnNldFtdIHNldHRpbmcgaXMgcGVyLWNoYW5uZWwgYmFzZWQuCisJICogVGhlIG1heCBudW0gb2YgY2hhbm5lbCBzdXBwb3J0ZWQgaXMgOC4KKwkgKiBUaGUgdmFsaWQgb2Zmc2V0IHZhbHVlIG11c3QgYWx3YXlzIGJlIGNvbnRpbnVseSBwbGFjZWQgaW4gZnJvbQorCSAqIGluZGV4IDAuCisJICogU2V0IG9mZnNldCBhcyBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEIGZvciBub3QgdXNlZCBhcnJheXMuCisJICogSWYgInNsb3RfYml0d2lkdGhfcGVyX2NoYW5uZWwiIGlzIDMyIGFuZCAic2FtcGxlX2JpdHdpZHRoIiBpcyAyNCwKKwkgKiAiZGF0YV9hbGlnbl90eXBlIiBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyAyNCBiaXQgc2FtcGxlIGRhdGEgaW4KKwkgKiBhbGlnbmluZyB3aXRoIDMyIGJpdCBzbG90IHdpZHRoIHBlci1jaGFubmVsLgorCSAqIEB2YWx1ZXMsIGluIGJ5dGUKKwkgKi8KK30gX19wYWNrZWQ7CisKKy8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZCBieSAjQUZFX01PRFVMRV9URE0gdG8gY29uZmlndXJlCisgKiB0aGUgY3VzdG9tZXIgVERNIGhlYWRlci4gI0FGRV9QT1JUX0NNRF9TRVRfUEFSQU0gY2FuIHVzZSB0aGlzIHBhcmFtZXRlciBJRC4KKyAqLworI2RlZmluZSBBRkVfUEFSQU1fSURfQ1VTVE9NX1RETV9IRUFERVJfQ09ORklHCQkweDAwMDEwMjk4CisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gdXNlZCB0byBoYW5kbGUgZnV0dXJlIGFkZGl0aW9ucyB0byBjdXN0b20gVERNIGhlYWRlcgorICogY29uZmlndXJhdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorICovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DVVNUT01fVERNX0hFQURFUl9DT05GSUcJMHgxCisKKyNkZWZpbmUgQUZFX0NVU1RPTV9URE1fSEVBREVSX1RZUEVfSU5WQUxJRAkJMHgwCisjZGVmaW5lIEFGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0RFRkFVTFQJCTB4MQorI2RlZmluZSBBRkVfQ1VTVE9NX1RETV9IRUFERVJfVFlQRV9FTlRFUlRBSU5NRU5UX01PU1QJMHgyCisKKyNkZWZpbmUgQUZFX0NVU1RPTV9URE1fSEVBREVSX01BWF9DTlQJMHg4CisKKy8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9DVVNUT01fVERNX0hFQURFUl9DT05GSUcgcGFyYW1ldGVyIElEICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX2N1c3RvbV90ZG1faGVhZGVyX2NmZyB7CisJdTMyCW1pbm9yX3ZlcnNpb247CisJLyogPCBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIGN1c3RvbSBURE0gaGVhZGVyIGNvbmZpZ3VyYXRpb24uCisJICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX0NVU1RPTV9URE1fSEVBREVSX0NPTkZJRworCSAqLworCisJdTE2CXN0YXJ0X29mZnNldDsKKwkvKiA8IHRoZSBzbG90IG1hcHBpbmcgc3RhcnQgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhpcyBzdWItZnJhbWUKKwkgKiBUaGUgYnl0ZXMgaXMgY291bnRlZCBmcm9tIDAuIFRoZSAwIGlzIG1hcHBlZCB0byB0aGUgMXN0IGJ5dGUgaW4gb3IKKwkgKiBvdXQgb2YgdGhlIGRpZ2l0YWwgc2VyaWFsIGRhdGEgbGluZSB0aGlzIHN1Yi1mcmFtZSBiZWxvbmcgdG8uCisJICogQHZhbHVlcywgaW4gYnl0ZSwKKwkgKiBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAwLCA0LCA4CisJICovCisKKwl1MTYJaGVhZGVyX3dpZHRoOworCS8qIDwgdGhlIGhlYWRlciB3aWR0aCBwZXItZnJhbWUgZm9sbG93ZWQuCisJICogMiBieXRlcyBmb3IgTU9TVC9URE0gY2FzZQorCSAqIEB2YWx1ZXMsIGluIGJ5dGUKKwkgKiBzdXBwb3J0ZWQgdmFsdWUgaXMgMgorCSAqLworCisJdTE2CWhlYWRlcl90eXBlOworCS8qIDwgSW5kaWNhdGUgd2hhdCBraW5kIG9mIGN1c3RvbSBURE0gaGVhZGVyIGl0IGlzLgorCSAqIEB2YWx1ZXMgI0FGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0lOVkFMSUQgPSAwCisJICogI0FGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0RFRkFVTFQgPSAxICAoZm9yIEFBTiBjaGFubmVsIHBlciBNT1NUKQorCSAqICNBRkVfQ1VTVE9NX1RETV9IRUFERVJfVFlQRV9FTlRFUlRBSU5NRU5UX01PU1QgPSAyCisJICogKGZvciBlbnRlcnRhaW5tZW50IGNoYW5uZWwsIHdoaWNoIHdpbGwgb3ZlcndyaXRlCisJICogQUZFX0FQSV9WRVJTSU9OX1RETV9TQURfSEVBREVSX1RZUEVfREVGQVVMVCBwZXIgTU9TVCkKKwkgKi8KKworCXUxNgludW1fZnJhbWVfcmVwZWF0OworCS8qIDwgbnVtIG9mIGhlYWRlciBmb2xsb3dlZC4KKwkgKiBAdmFsdWVzLCBzdXBwb3J0ZWQgdmFsdWUgaXMgOAorCSAqLworCXUxNgloZWFkZXJbQUZFX0NVU1RPTV9URE1fSEVBREVSX01BWF9DTlRdOworCS8qIDwgU0FEIGhlYWRlciBmb3IgTU9TVC9URE0gY2FzZSBpcyBmb2xsb3dlZCBhcyBwYXlsb2FkIGFzIGJlbG93LgorCSAqIFRoZSBzaXplIG9mIGZvbGxvd2VkIFNBRCBoZWFkZXIgaW4gYnl0ZXMgaXMgbnVtX29mX2ZyYW1lX3JlcGVhdCAqCisJICogaGVhZGVyX3dpZHRoX3Blcl9mcmFtZSwgd2hpY2ggaXMgMiAqIDggPSAxNiBieXRlcyBoZXJlLgorCSAqIHRoZSBzdXBwb3J0ZWQgcGF5bG9hZCBmb3JtYXQgaXMgaW4gdWludDE2X3QgYXMgYmVsb3cKKwkgKiB1aW50MTZfdCBoZWFkZXIwOyBTeW5jSGkgMHgzQyBJbmZvWzRdIC0gQ29kZWNUeXBlIC0+IDB4M0MwMAorCSAqIHVpbnQxNl90IGhlYWRlcjE7IFN5bmNMbyAweEIyIEluZm9bNV0gLSBTYW1wbGVXaWR0aCAtPiAweEIyMTgKKwkgKiB1aW50MTZfdCBoZWFkZXIyOyBEVENQIEluZm8gICAgIEluZm9bNl0gLSB1bnVzZWQgLT4gMHgwCisJICogdWludDE2X3QgaGVhZGVyMzsgRXh0ZW5zaW9uIEluZm9bN10gLSBBU0FELVZhbHVlIC0+IDB4QzAKKwkgKiB1aW50MTZfdCBoZWFkZXI0OyBSZXNlcnZlZCBJbmZvWzBdIC0gTnVtIG9mIGJ5dGVzIGZvbGxvd2luZyAgLT4gMHg3CisJICogdWludDE2X3QgaGVhZGVyNTsgUmVzZXJ2ZWQgSW5mb1sxXSAtIE1lZGlhIFR5cGUgLT4gMHgwCisJICogdWludDE2X3QgaGVhZGVyNjsgUmVzZXJ2ZWQgSW5mb1syXSAtIEJpdHJhdGVba2Jwc10gLSBIaWdoIEJ5dGUgLT4gMHgwCisJICogdWludDE2X3QgaGVhZGVyNzsgUmVzZXJ2ZWQgSW5mb1szXSAtIEJpdHJhdGVba2Jwc10gLSBMb3cgIEJ5dGUgLT4gMHgwCisJICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3Nsb3RfbWFwcGluZ19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyCXBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyCXBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1faWRfc2xvdF9tYXBwaW5nX2NmZwlzbG90X21hcHBpbmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX2N1c3RvbV90ZG1faGVhZGVyX2NvbmZpZ19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIJcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIJcGRhdGE7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcJY3VzdG9tX3RkbV9oZWFkZXI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3RkbV9wb3J0X2NvbmZpZyB7CisJc3RydWN0IGFmZV9wYXJhbV9pZF90ZG1fY2ZnCQkJCXRkbTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3Nsb3RfbWFwcGluZ19jZmcJCXNsb3RfbWFwcGluZzsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2N1c3RvbV90ZG1faGVhZGVyX2NmZwljdXN0b21fdGRtX2hlYWRlcjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0RFVklDRV9IV19ERUxBWSAgICAgMHgwMDAxMDI0MworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fREVWSUNFX0hXX0RFTEFZICAweDEKKworc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZpY2VfaHdfZGVsYXlfY2ZnIHsKKwl1aW50MzJfdCAgICBkZXZpY2VfaHdfZGVsYXlfbWlub3JfdmVyc2lvbjsKKwl1aW50MzJfdCAgICBkZWxheV9pbl91czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NFVF9UT1BPTE9HWSAgICAweDAwMDEwMjVBCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9UT1BPTE9HWV9WMSAweDEKKworc3RydWN0IGFmZV9wYXJhbV9pZF9zZXRfdG9wb2xvZ3lfY2ZnIHsKKwkvKgorCSAqIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgYWZlIHRvcG9sb2d5IGlkIGNvbmZpZ3VyYXRpb24uCisJICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX1RPUE9MT0dZX1YxCisJICovCisJdTMyCQltaW5vcl92ZXJzaW9uOworCS8qCisJICogSWQgb2YgdGhlIHRvcG9sb2d5IGZvciB0aGUgYWZlIHNlc3Npb24uCisJICogQHZhbHVlcyBBbnkgdmFsaWQgQUZFIHRvcG9sb2d5IElECisJICovCisJdTMyCQl0b3BvbG9neV9pZDsKK30gX19wYWNrZWQ7CisKKworLyoKKyAqIEdlbmVyaWMgZW5jb2RlciBtb2R1bGUgSUQuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAjQVZTX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCAoY2Fubm90IGJlIHNldCBydW4gdGltZSkKKyAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9FTkNfQ0ZHX0JMSyAobWF5IGJlIHNldCBydW4gdGltZSkKKyAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9FTkNfQklUUkFURSAobWF5IGJlIHNldCBydW4gdGltZSkKKyAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEIChjYW5ub3QgYmUgc2V0IHJ1biB0aW1lKQorICogT3Bjb2RlIC0gQVZTX01PRFVMRV9JRF9FTkNPREVSCisgKiBBRkUgQ29tbWFuZCBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyIHN1cHBvcnRzIHRoaXMgbW9kdWxlIElELgorICovCisjZGVmaW5lIEFGRV9NT0RVTEVfSURfRU5DT0RFUiAgICAgICAgMHgwMDAxMzIyOQorCisvKiBNYWNybyBmb3IgZGVmaW5pbmcgdGhlIHBhY2tldGl6ZXIgSUQ6IENPUC4gKi8KKyNkZWZpbmUgQUZFX01PRFVMRV9JRF9QQUNLRVRJWkVSX0NPUCAweDAwMDEzMjJBCisKKy8qCisgKiBQYWNrZXRpemVyIHR5cGUgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCisgKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IHJ1bnRpbWUuCisgKi8KKyNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfUEFDS0VUSVpFUl9JRCAweDAwMDEzMjJFCisKKy8qCisgKiBFbmNvZGVyIGNvbmZpZyBibG9jayAgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCisgKiBUaGlzIHBhcmFtZXRlciBtYXkgYmUgc2V0IHJ1bnRpbWUuCisgKi8KKyNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgMHgwMDAxMzIyQworCisvKgorICogRW5jb2RlciBmb3JtYXQgSUQgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCisgKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IHJ1bnRpbWUuCisgKi8KKyNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCAgICAgICAgIDB4MDAwMTMyMkIKKworLyoKKyAqIERhdGEgZm9ybWF0IHRvIHNlbmQgY29tcHJlc3NlZCBkYXRhCisgKiBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCBvdmVyIFNsaW1idXMgbGluZXMuCisgKi8KKyNkZWZpbmUgQUZFX1NCX0RBVEFfRk9STUFUX0dFTkVSSUNfQ09NUFJFU1NFRCAgICAweDMKKworLyoKKyAqIElEIGZvciBBRkUgcG9ydCBtb2R1bGUuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRlZmluZSBwb3J0IHByb3BlcnRpZXMuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKyAqICNBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFCisgKiBUbyBjb25maWd1cmUgdGhlIHBvcnQgcHJvcGVydHksIHRoZSBjbGllbnQgbXVzdCB1c2UgdGhlCisgKiAjQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMiBjb21tYW5kLAorICogYW5kIGZpbGwgdGhlIG1vZHVsZSBJRCB3aXRoIHRoZSByZXNwZWN0aXZlIHBhcmFtZXRlciBJRHMgYXMgbGlzdGVkIGFib3ZlLgorICogQGFwcl9oZHJfZmllbGRzCisgKiBPcGNvZGUgLS0gQUZFX01PRFVMRV9QT1JUCisgKi8KKyNkZWZpbmUgQUZFX01PRFVMRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMmE2CisKKy8qCisgKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgI0FGRV9NT0RVTEVfUE9SVCB0byBzZXQgdGhlIHBvcnQgbWVkaWEgdHlwZS4KKyAqIHBhcmFtZXRlciBJRCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIHVzaW5nI0FGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIgY29tbWFuZC4KKyAqLworI2RlZmluZSBBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFICAgICAgICAgICAgICAweDAwMDEwMmE3CisKKy8qCisgKiBNYWNyb3MgZm9yIGRlZmluaW5nIHRoZSAiZGF0YV9mb3JtYXQiIGZpZWxkIGluIHRoZQorICogI0FGRV9QQVJBTV9JRF9QT1JUX01FRElBX1RZUEUKKyAqLworI2RlZmluZSBBRkVfUE9SVF9EQVRBX0ZPUk1BVF9QQ00gICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQUZFX1BPUlRfREFUQV9GT1JNQVRfR0VORVJJQ19DT01QUkVTU0VEICAgMHgxCisKKy8qCisgKiBNYWNybyBmb3IgZGVmaW5pbmcgdGhlICJtaW5vcl92ZXJzaW9uIiBmaWVsZCBpbiB0aGUKKyAqICNBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFCisgKi8KKyNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1BPUlRfTUVESUFfVFlQRSAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisKKy8qCisgKiBNZWRpYSBmb3JtYXQgSUQgZm9yIFNCQyBlbmNvZGUgY29uZmlndXJhdGlvbi4KKyAqIEBwYXIgU0JDIGVuY29kZSBjb25maWd1cmF0aW9uIChhc21fc2JjX2VuY19jZmdfdCkKKyAqIEB0YWJsZXt3ZWFrX19hc21fX3NiY19fZW5jX19jZmdfX3R9CisgKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJGMgorCisvKiBTQkMgY2hhbm5lbCBNb25vIG1vZGUuKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX01PTk8gICAgICAgICAgICAgICAgICAgICAxCisKKy8qIFNCQyBjaGFubmVsIFN0ZXJlbyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX1NCQ19DSEFOTkVMX01PREVfU1RFUkVPICAgICAgICAgICAgICAgICAgIDIKKworLyogU0JDIGNoYW5uZWwgRHVhbCBNb25vIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9EVUFMX01PTk8gICAgICAgICAgICAgICAgOAorCisvKiBTQkMgY2hhbm5lbCBKb2ludCBTdGVyZW8gbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX0pPSU5UX1NURVJFTyAgICAgICAgICAgICA5CisKKy8qIFNCQyBiaXQgYWxsb2NhdGlvbiBtZXRob2QgPSBsb3VkbmVzcy4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfTE9VRE5FU1MgICAgICAgICAgICAwCisKKy8qIFNCQyBiaXQgYWxsb2NhdGlvbiBtZXRob2QgPSBTTlIuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfU0JDX0FMTE9DQVRJT05fTUVUSE9EX1NOUiAgICAgICAgICAgICAgICAgMQorCisKKy8qCisgKiBQYXlsb2FkIG9mIHRoZSBTQkMgZW5jb2RlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gdGhlCisgKiAjQVNNX01FRElBX0ZNVF9TQkMgbWVkaWEgZm9ybWF0LgorICovCitzdHJ1Y3QgYXNtX3NiY19lbmNfY2ZnX3QgeworCS8qCisJICogTnVtYmVyIG9mIHN1YmJhbmRzLgorCSAqIEB2YWx1ZXMgNCwgOAorCSAqLworCXVpbnQzMl90ICAgIG51bV9zdWJiYW5kczsKKworCS8qCisJICogU2l6ZSBvZiB0aGUgZW5jb2RlZCBibG9jayBpbiBzYW1wbGVzLgorCSAqIEB2YWx1ZXMgNCwgOCwgMTIsIDE2CisJICovCisJdWludDMyX3QgICAgYmxrX2xlbjsKKworCS8qCisJICogTW9kZSB1c2VkIHRvIGFsbG9jYXRlIGJpdHMgYmV0d2VlbiBjaGFubmVscy4KKwkgKiBAdmFsdWVzCisJICogMCAoTmF0aXZlIG1vZGUpCisJICogI0FTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9NT05PCisJICogI0FTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8KKwkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUxfTU9OTworCSAqICNBU01fTUVESUFfRk1UX1NCQ19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPCisJICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUgbnVtYmVyCisJICogb2YgY2hhbm5lbHMgYXQgdGhlIGlucHV0LgorCSAqIElmIHBvc3Rwcm9jZXNzaW5nIG91dHB1dHMgb25lLWNoYW5uZWwgZGF0YSwgTW9ubyBtb2RlIGlzIHVzZWQuIElmCisJICogcG9zdHByb2Nlc3Npbmcgb3V0cHV0cyB0d28tY2hhbm5lbCBkYXRhLCBTdGVyZW8gbW9kZSBpcyB1c2VkLgorCSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KKwkgKi8KKwl1aW50MzJfdCAgICBjaGFubmVsX21vZGU7CisKKwkvKgorCSAqIEVuY29kZXIgYml0IGFsbG9jYXRpb24gbWV0aG9kLgorCSAqIEB2YWx1ZXMKKwkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfTE9VRE5FU1MKKwkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCXVpbnQzMl90ICAgIGFsbG9jX21ldGhvZDsKKworCS8qCisJICogTnVtYmVyIG9mIGVuY29kZWQgYml0cyBwZXIgc2Vjb25kLgorCSAqIEB2YWx1ZXMKKwkgKiBNb25vIGNoYW5uZWwgLS0gTWF4aW11bSBvZiAzMjAga2JwcworCSAqIFN0ZXJlbyBjaGFubmVsIC0tIE1heGltdW0gb2YgNTEyIGticHMgQHRhYmxlYnVsbGV0ZW5kCisJICovCisJdWludDMyX3QgICAgYml0X3JhdGU7CisKKwkvKgorCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisJICogQHZhbHVlcyAwIChOYXRpdmUgbW9kZSksIDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwJm5ic3A7SHoKKwkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQorCSAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgorCSAqIFRoZSBzYW1wbGluZyByYXRlIG11c3Qgbm90IGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcuCisJICovCisJdWludDMyX3QgICAgc2FtcGxlX3JhdGU7Cit9OworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0FPVF9MQyAgICAgICAgICAgIDIKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfQU9UX1NCUiAgICAgICAgICAgNQorI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfUFMgICAgICAgICAgICAyOQorI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRFRTICAwCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX1JBVyAgIDMKKworc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90IHsKKworCS8qIEVuY29kaW5nIHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiovCisJdWludDMyX3QgICAgIGJpdF9yYXRlOworCisJLyoKKwkgKiBFbmNvZGluZyBtb2RlLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9MQworCSAqICNBU01fTUVESUFfRk1UX0FBQ19BT1RfU0JSCisJICogI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9QUworCSAqLworCXVpbnQzMl90ICAgICBlbmNfbW9kZTsKKworCS8qCisJICogQUFDIGZvcm1hdCBmbGFnLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogI0FTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX0FEVFMKKwkgKiAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfUkFXCisJICovCisJdWludDE2X3QgICAgIGFhY19mbXRfZmxhZzsKKworCS8qCisJICogTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGVuY29kZS4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIDAgLSBOYXRpdmUgbW9kZQorCSAqIDEgLSBNb25vCisJICogMiAtIFN0ZXJlbworCSAqIE90aGVyIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4KKwkgKiBAbm90ZTFoYW5nIFRoZSBlQUFDKyBlbmNvZGVyIG1vZGUgc3VwcG9ydHMgb25seSBzdGVyZW8uCisJICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUKKwkgKiBudW1iZXIgb2YgY2hhbm5lbHMgYXQgdGhlIGlucHV0LgorCSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KKwkgKi8KKwl1aW50MTZfdCAgICAgY2hhbm5lbF9jZmc7CisKKwkvKgorCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisJICogU3VwcG9ydGVkIHZhbHVlczogLSAwIC0tIE5hdGl2ZSBtb2RlIC0gRm9yIG90aGVyIHZhbHVlcywKKwkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQorCSAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgorCSAqIFRoZSBzYW1wbGluZyByYXRlIG11c3Qgbm90IGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcuCisJICovCisJdWludDMyX3QgICAgIHNhbXBsZV9yYXRlOworfSBfX3BhY2tlZDsKKworLyogRk1UIElEIGZvciBhcHQtWCBDbGFzc2ljICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQVBUWCAweDAwMDEzMWZmCisKKy8qIEZNVCBJRCBmb3IgYXB0LVggSEQgKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BUFRYX0hEIDB4MDAwMTMyMDAKKworI2RlZmluZSBQQ01fQ0hBTk5FTF9MICAgICAgICAgMQorI2RlZmluZSBQQ01fQ0hBTk5FTF9SICAgICAgICAgMgorI2RlZmluZSBQQ01fQ0hBTk5FTF9DICAgICAgICAgMworCitzdHJ1Y3QgYXNtX2N1c3RvbV9lbmNfY2ZnX2FwdHhfdCB7CisJdWludDMyX3QgICAgc2FtcGxlX3JhdGU7CisJLyogTW9ubyBvciBzdGVyZW8gKi8KKwl1aW50MTZfdCAgICBudW1fY2hhbm5lbHM7CisJdWludDE2X3QgICAgcmVzZXJ2ZWQ7CisJLyogbnVtX2NoID09IDEsIHRoZW4gUENNX0NIQU5ORUxfQywKKwkgKiBudW1fY2ggPT0gMiwgdGhlbiB7UENNX0NIQU5ORUxfTCwgUENNX0NIQU5ORUxfUn0KKwkgKi8KKwl1aW50OF90ICAgICBjaGFubmVsX21hcHBpbmdbOF07CisJdWludDMyX3QgICAgY3VzdG9tX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX2VuY19mbXRfaWRfcGFyYW1fdCB7CisJLyoKKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqICAjQVNNX01FRElBX0ZNVF9TQkMKKwkgKiAgI0FTTV9NRURJQV9GTVRfQUFDX1YyCisJICogQW55IE9wZW5EU1Agc3VwcG9ydGVkIHZhbHVlcworCSAqLworCXVpbnQzMl90ICAgIGZtdF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcG9ydF9tZWRpYV90eXBlX3QgeworCS8qCisJICogTWlub3IgdmVyc2lvbgorCSAqIEB2YWx1ZXMgI0FGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEUuCisJICovCisJdWludDMyX3QgICAgbWlub3JfdmVyc2lvbjsKKworCS8qCisJICogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KKwkgKiBAdmFsdWVzCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzExXzAyNUsKKwkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTJLCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SworCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8yMl8wNUsKKwkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMjRLCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzMySworCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV80NF8xSworCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKKwkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfODhfMksKKwkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE3Nl80SworCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCisJICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzM1Ml84SworCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zODRLCisJICovCisJdWludDMyX3QgICAgc2FtcGxlX3JhdGU7CisKKwkvKgorCSAqIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgorCSAqIEB2YWx1ZXMgMTYsIDI0CisJICovCisJdWludDE2X3QgICAgYml0X3dpZHRoOworCisJLyoKKwkgKiBOdW1iZXIgb2YgY2hhbm5lbHMuCisJICogQHZhbHVlcyAxIHRvICNBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQKKwkgKi8KKwl1aW50MTZfdCAgICBudW1fY2hhbm5lbHM7CisKKwkvKgorCSAqIERhdGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHBvcnQuCisJICogSWYgdGhlIHBvcnQgbWVkaWEgdHlwZSBhbmQgZGV2aWNlIG1lZGlhIHR5cGUgYXJlIGRpZmZlcmVudCwKKwkgKiBpdCBzaWduaWZpZXMgYSBlbmNvZGluZy9kZWNvZGluZyB1c2UgY2FzZQorCSAqIEB2YWx1ZXMKKwkgKiAjQUZFX1BPUlRfREFUQV9GT1JNQVRfUENNCisJICogI0FGRV9QT1JUX0RBVEFfRk9STUFUX0dFTkVSSUNfQ09NUFJFU1NFRAorCSAqLworCXVpbnQxNl90ICAgZGF0YV9mb3JtYXQ7CisKKwkvKlRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4qLworCXVpbnQxNl90ICAgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBhZmVfZW5jX2NvbmZpZ19kYXRhIHsKKwlzdHJ1Y3QgYXNtX3NiY19lbmNfY2ZnX3Qgc2JjX2NvbmZpZzsKKwlzdHJ1Y3QgYXNtX2FhY19lbmNfY2ZnX3YyX3QgYWFjX2NvbmZpZzsKKwlzdHJ1Y3QgYXNtX2N1c3RvbV9lbmNfY2ZnX2FwdHhfdCAgYXB0eF9jb25maWc7Cit9OworCitzdHJ1Y3QgYWZlX2VuY19jb25maWcgeworCXUzMiBmb3JtYXQ7CisJdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSBkYXRhOworfTsKKworc3RydWN0IGFmZV9lbmNfY2ZnX2Jsa19wYXJhbV90IHsKKwl1aW50MzJfdCBlbmNfY2ZnX2Jsa19zaXplOworCS8qCisJICpTaXplIG9mIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYmxvY2sgdGhhdCBmb2xsb3dzIHRoaXMgbWVtYmVyCisJICovCisJdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSBlbmNfYmxrX2NvbmZpZzsKK307CisKKy8qCisgKiBQYXlsb2FkIG9mIHRoZSBBVlNfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEIHBhcmFtZXRlci4KKyAqLworc3RydWN0IGF2c19lbmNfcGFja2V0aXplcl9pZF9wYXJhbV90IHsKKwkvKgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogI0FWU19NT0RVTEVfSURfUEFDS0VUSVpFUl9DT1AKKwkgKiBBbnkgT3BlbkRTUCBzdXBwb3J0ZWQgdmFsdWVzCisJICovCisJdWludDMyX3QgZW5jX3BhY2tldGl6ZXJfaWQ7Cit9OworCit1bmlvbiBhZmVfcG9ydF9jb25maWcgeworCXN0cnVjdCBhZmVfcGFyYW1faWRfcGNtX2NmZyAgICAgICAgICAgICAgIHBjbTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2kyc19jZmcgICAgICAgICAgICAgICBpMnM7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9oZG1pX211bHRpX2NoYW5fYXVkaW9fY2ZnIGhkbWlfbXVsdGlfY2g7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9zbGltYnVzX2NmZyAgICAgICAgICAgc2xpbV9zY2g7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9ydF9wcm94eV9wb3J0X2NmZyAgICAgcnRwcm94eTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2ludGVybmFsX2J0X2ZtX2NmZyAgICBpbnRfYnRfZm07CisJc3RydWN0IGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcgICAgICAgcHNldWRvX3BvcnQ7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZpY2VfaHdfZGVsYXlfY2ZnICAgaHdfZGVsYXk7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jZmcgICAgICAgICAgICAgc3BkaWY7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9zZXRfdG9wb2xvZ3lfY2ZnICAgICAgdG9wb2xvZ3k7CisJc3RydWN0IGFmZV9wYXJhbV9pZF90ZG1fY2ZnICAgICAgICAgICAgICAgdGRtOworCXN0cnVjdCBhZmVfcGFyYW1faWRfdXNiX2F1ZGlvX2NmZyAgICAgICAgIHVzYl9hdWRpbzsKKwlzdHJ1Y3QgYWZlX2VuY19mbXRfaWRfcGFyYW1fdCAgICAgICAgICAgICBlbmNfZm10OworCXN0cnVjdCBhZmVfcG9ydF9tZWRpYV90eXBlX3QgICAgICAgICAgICAgIG1lZGlhX3R5cGU7CisJc3RydWN0IGFmZV9lbmNfY2ZnX2Jsa19wYXJhbV90ICAgICAgICAgICAgZW5jX2Jsa19wYXJhbTsKKwlzdHJ1Y3QgYXZzX2VuY19wYWNrZXRpemVyX2lkX3BhcmFtX3QgICAgICBlbmNfcGt0X2lkX3BhcmFtOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kX25vX3BheWxvYWQgeworCXN0cnVjdCBhcHJfaGRyCQkJaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkcgkJCWhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICBwZGF0YTsKKwl1bmlvbiBhZmVfcG9ydF9jb25maWcgICAgICAgICAgICBwb3J0OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUIDB4MDAwMTAwRTUKKworLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJULiovCitzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdGFydCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7CisvKiBQb3J0IGludGVyZmFjZSBhbmQgZGlyZWN0aW9uIChSeCBvciBUeCkgdG8gc3RhcnQuIEFuIGV2ZW4KKyAqIG51bWJlciByZXByZXNlbnRzIHRoZSBSeCBkaXJlY3Rpb24sIGFuZCBhbiBvZGQgbnVtYmVyIHJlcHJlc2VudHMKKyAqIHRoZSBUeCBkaXJlY3Rpb24uCisgKi8KKworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisvKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLiovCisKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BPUlRfQ01EX0RFVklDRV9TVE9QICAweDAwMDEwMEU2CisKKy8qIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfREVWSUNFX1NUT1AuICovCitzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKKy8qIFBvcnQgaW50ZXJmYWNlIGFuZCBkaXJlY3Rpb24gKFJ4IG9yIFR4KSB0byBzdGFydC4gQW4gZXZlbgorICogbnVtYmVyIHJlcHJlc2VudHMgdGhlIFJ4IGRpcmVjdGlvbiwgYW5kIGFuIG9kZCBudW1iZXIgcmVwcmVzZW50cworICogdGhlIFR4IGRpcmVjdGlvbi4KKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisvKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLiovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIDB4MDAwMTAwRUEKKworLyogIE1lbW9yeSBtYXAgcmVnaW9ucyBjb21tYW5kIHBheWxvYWQgdXNlZCBieSB0aGUKKyAqICNBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAuCisgKiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgY2xpZW50cyB0byBtYXAgbXVsdGlwbGUgc2hhcmVkIG1lbW9yeQorICogcmVnaW9ucyBpbiBhIHNpbmdsZSBjb21tYW5kLiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlCisgKiBudW1fcmVnaW9ucyBvZiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkLgorICovCitzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK3UxNiAgICAgICAgICAgICAgICAgIG1lbV9wb29sX2lkOworLyogVHlwZSBvZiBtZW1vcnkgb24gd2hpY2ggdGhpcyBtZW1vcnkgcmVnaW9uIGlzIG1hcHBlZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBRFNQX01FTU9SWV9NQVBfRUJJX1BPT0wKKyAqIC0gI0FEU1BfTUVNT1JZX01BUF9TTUlfUE9PTAorICogLSAjQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MCisgKiAtIE90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKKyAqCisgKiBUaGUgbWVtb3J5IHBvb2wgSUQgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCisgKiBtZW1vcnkuIENoYXJhY3RlcmlzdGljcyBtYXkgaW5jbHVkZSBhbGlnbm1lbnQgdHlwZSwgcGVybWlzc2lvbnMsCisgKiBldGMuCisgKgorICogQURTUF9NRU1PUllfTUFQX0VCSV9QT09MIGlzIEV4dGVybmFsIEJ1ZmZlciBJbnRlcmZhY2UgdHlwZSBtZW1vcnkKKyAqIEFEU1BfTUVNT1JZX01BUF9TTUlfUE9PTCBpcyBTaGFyZWQgTWVtb3J5IEludGVyZmFjZSB0eXBlIG1lbW9yeQorICogQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MIGlzIHNoYXJlZCBtZW1vcnksIGJ5dGUKKyAqIGFkZHJlc3NhYmxlLCBhbmQgNCBLQiBhbGlnbmVkLgorICovCisKKworCXUxNiAgICAgICAgICAgICAgICAgIG51bV9yZWdpb25zOworLyogTnVtYmVyIG9mIHJlZ2lvbnMgdG8gbWFwLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZsYWc7CisvKiBDb25maWd1cmVzIG9uZSBjb21tb24gcHJvcGVydHkgZm9yIGFsbCB0aGUgcmVnaW9ucyBpbiB0aGUKKyAqIHBheWxvYWQuCisgKgorICogU3VwcG9ydGVkIHZhbHVlczogLSAweDAwMDAwMDAwIHRvIDB4MDAwMDAwMDEKKyAqCisgKiBiMCAtIGJpdCAwIGluZGljYXRlcyBwaHlzaWNhbCBvciB2aXJ0dWFsIG1hcHBpbmcgMCBTaGFyZWQgbWVtb3J5CisgKiBhZGRyZXNzIHByb3ZpZGVkIGluIGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWRpcyBhCisgKiBwaHlzaWNhbCBhZGRyZXNzLiBUaGUgc2hhcmVkIG1lbW9yeSBuZWVkcyB0byBiZSBtYXBwZWQoIGhhcmR3YXJlCisgKiBUTEIgZW50cnkpIGFuZCBhIHNvZnR3YXJlIGVudHJ5IG5lZWRzIHRvIGJlIGFkZGVkIGZvciBpbnRlcm5hbAorICogYm9vayBrZWVwaW5nLgorICoKKyAqIDEgU2hhcmVkIG1lbW9yeSBhZGRyZXNzIHByb3ZpZGVkIGluCisgKiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkaXMgYSB2aXJ0dWFsIGFkZHJlc3MuIFRoZQorICogc2hhcmVkIG1lbW9yeSBtdXN0IG5vdCBiZSBtYXBwZWQgKHNpbmNlIGhhcmR3YXJlIFRMQiBlbnRyeSBpcworICogYWxyZWFkeSBhdmFpbGFibGUpIGJ1dCBhIHNvZnR3YXJlIGVudHJ5IG5lZWRzIHRvIGJlIGFkZGVkIGZvcgorICogaW50ZXJuYWwgYm9vayBrZWVwaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgdHdvIHNlcnZpY2VzIHdpdGggaW4KKyAqIEFEU1AgaXMgY29tbXVuaWNhdGluZyB2aWEgQVBSLiBUaGV5IGNhbiBub3cgZGlyZWN0bHkgY29tbXVuaWNhdGUKKyAqIHZpYSB0aGUgVmlydHVhbCBhZGRyZXNzIGluc3RlYWQgb2YgUGh5c2ljYWwgYWRkcmVzcy4gVGhlIHZpcnR1YWwKKyAqIHJlZ2lvbnMgbXVzdCBiZSBjb250aWd1b3VzLiBudW1fcmVnaW9ucyBtdXN0IGJlIDEgaW4gdGhpcyBjYXNlLgorICoKKyAqIGIzMS1iMSAtIHJlc2VydmVkIGJpdHMuIG11c3QgYmUgc2V0IHRvIHplcm8KKyAqLworCisKK30gX19wYWNrZWQ7CisvKiAgTWFwIHJlZ2lvbiBwYXlsb2FkIHVzZWQgYnkgdGhlCisgKiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2Fkc3RydWN0dXJlLgorICovCitzdHJ1Y3QgYWZlX3NlcnZpY2Vfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCB7CisJdTMyICAgICAgICAgICAgICAgICAgc2htX2FkZHJfbHN3OworLyogbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCBvZiBzdGFydGluZyBhZGRyZXNzIGluIHRoZSBtZW1vcnkKKyAqIHJlZ2lvbiB0byBtYXAuIEl0IG11c3QgYmUgY29udGlndW91cyBtZW1vcnksIGFuZCBpdCBtdXN0IGJlIDQgS0IKKyAqIGFsaWduZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIEFueSAzMiBiaXQgdmFsdWUKKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBzaG1fYWRkcl9tc3c7CisvKiBtb3N0IHNpZ25pZmljYW50IHdvcmQgb2Ygc3RhcnRuZyBhZGRyZXNzIGluIHRoZSBtZW1vcnkgcmVnaW9uCisgKiB0byBtYXAuIEZvciAzMiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0CisgKiB0byB6ZXJvLiBGb3IgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0MzEgdG8gYml0IDQgbXVzdCBiZQorICogc2V0IHRvIHplcm8KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIEZvciAzMiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCB0aGlzIGZpZWxkCisgKiBtdXN0IGJlIHNldCB0byB6ZXJvLiAtIEZvciAzNiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQzMSB0bworICogYml0IDQgbXVzdCBiZSBzZXQgdG8gemVybyAtIEZvciA2NCBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBhbnkKKyAqIDMyIGJpdCB2YWx1ZQorICovCisKKworCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9zaXplX2J5dGVzOworLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWdpb24uIFRoZSBhRFNQIHdpbGwgYWx3YXlzIG1hcCB0aGUKKyAqIHJlZ2lvbnMgYXMgdmlydHVhbCBjb250aWd1b3VzIG1lbW9yeSwgYnV0IHRoZSBtZW1vcnkgc2l6ZSBtdXN0IGJlCisgKiBpbiBtdWx0aXBsZXMgb2YgNCBLQiB0byBhdm9pZCBnYXBzIGluIHRoZSB2aXJ0dWFsbHkgY29udGlndW91cworICogbWFwcGVkIG1lbW9yeS4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIG11bHRpcGxlcyBvZiA0S0IKKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9TRVJWSUNFX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TIDB4MDAwMTAwRUIKK3N0cnVjdCBhZmVfc2VydmljZV9jbWRyc3Bfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyB7CisJdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisvKiBBIG1lbW9yeSBtYXAgaGFuZGxlIGVuY2Fwc3VsYXRpbmcgc2hhcmVkIG1lbW9yeSBhdHRyaWJ1dGVzIGlzCisgKiByZXR1cm5lZCBpZmYgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZCBpcworICogc3VjY2Vzc2Z1bC4gSW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSAsIGEgZ2VuZXJpYyBBUFIgZXJyb3IgcmVzcG9uc2UKKyAqIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgKgorICogU3VwcG9ydGVkIFZhbHVlczogLSBBbnkgMzIgYml0IHZhbHVlCisgKi8KKworfSBfX3BhY2tlZDsKKyNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUyAweDAwMDEwMEVDCisvKiBNZW1vcnkgdW5tYXAgcmVnaW9ucyBjb21tYW5kIHBheWxvYWQgdXNlZCBieSB0aGUKKyAqICNBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIGNsaWVudHMgdG8gdW5tYXAgbXVsdGlwbGUgc2hhcmVkIG1lbW9yeQorICogcmVnaW9ucyBpbiBhIHNpbmdsZSBjb21tYW5kLgorICovCisKKworc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK3UzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkKKyAqIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGNvbW1hbmRzCisgKgorICogU3VwcG9ydGVkIFZhbHVlczoKKyAqIC0gQW55IDMyIGJpdCB2YWx1ZQorICovCit9IF9fcGFja2VkOworCisjZGVmaW5lICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyIDB4MDAwMTAwRjAKKworLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyIGNvbW1hbmQsCisgKiB3aGljaCBxdWVyaWVzIGZvciBvbmUgcG9zdC9wcmVwcm9jZXNzaW5nIHBhcmFtZXRlciBvZiBhCisgKiBzdHJlYW0uCisgKi8KK3N0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyIHsKKwl1MTYgcG9ydF9pZDsKKy8qIFBvcnQgaW50ZXJmYWNlIGFuZCBkaXJlY3Rpb24gKFJ4IG9yIFR4KSB0byBzdGFydC4gKi8KKworCXUxNiBwYXlsb2FkX3NpemU7CisvKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIElEL21vZHVsZSBJRCBjb21iaW5hdGlvbi4KKyAqIFRoaXMgaXMgYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKKyAqLworCisJdTMyIHBheWxvYWRfYWRkcmVzc19sc3c7CisvKiBMU1cgb2YgNjQgYml0IFBheWxvYWQgYWRkcmVzcy4gQWRkcmVzcyBzaG91bGQgYmUgMzItYnl0ZSwKKyAqIDRrYnl0ZSBhbGlnbmVkIGFuZCBtdXN0IGJlIGNvbnRpZyBtZW1vcnkuCisgKi8KKworCisJdTMyIHBheWxvYWRfYWRkcmVzc19tc3c7CisvKiBNU1cgb2YgNjQgYml0IFBheWxvYWQgYWRkcmVzcy4gSW4gY2FzZSBvZiAzMi1iaXQgc2hhcmVkCisgKiBtZW1vcnkgYWRkcmVzcywgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiBJbiBjYXNlIG9mIDM2LWJpdAorICogc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQtNCB0byBiaXQtMzEgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAqIEFkZHJlc3Mgc2hvdWxkIGJlIDMyLWJ5dGUsIDRrYnl0ZSBhbGlnbmVkIGFuZCBtdXN0IGJlIGNvbnRpZ3VvdXMKKyAqIG1lbW9yeS4KKyAqLworCisJdTMyIG1lbV9tYXBfaGFuZGxlOworLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkKKyAqIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGNvbW1hbmRzLgorICogU3VwcG9ydGVkIFZhbHVlczogLSBOVUxMIC0tIE1lc3NhZ2UuIFRoZSBwYXJhbWV0ZXIgZGF0YSBpcworICogaW4tYmFuZC4gLSBOb24tTlVMTCAtLSBUaGUgcGFyYW1ldGVyIGRhdGEgaXMgT3V0LWJhbmQuUG9pbnRlciB0bworICogLSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiBzaGFyZWQgbWVtb3J5IG9mIHRoZSBwYXlsb2FkIGRhdGEuCisgKiBGb3IgZGV0YWlsZWQgcGF5bG9hZCBjb250ZW50LCBzZWUgdGhlIGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIKKyAqIHN0cnVjdHVyZQorICovCisKKworCXUzMiBtb2R1bGVfaWQ7CisvKiBJRCBvZiB0aGUgbW9kdWxlIHRvIGJlIHF1ZXJpZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBWYWxpZCBtb2R1bGUgSUQKKyAqLworCisJdTMyIHBhcmFtX2lkOworLyogSUQgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBxdWVyaWVkLgorICogU3VwcG9ydGVkIHZhbHVlczogVmFsaWQgcGFyYW1ldGVyIElECisgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BPUlRfQ01EUlNQX0dFVF9QQVJBTV9WMiAweDAwMDEwMTA2CisKKy8qIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURSU1BfR0VUX1BBUkFNX1YyIG1lc3NhZ2UsIHdoaWNoCisgKiByZXNwb25kcyB0byBhbiAjQUZFX1BPUlRfQ01EX0dFVF9QQVJBTV9WMiBjb21tYW5kLgorICoKKyAqIEltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqIChhZmVfcG9ydF9wYXJhbV9kYXRhKSBjb250YWluaW5nIHRoZSByZXNwb25zZShhY2tub3dsZWRnbWVudCkKKyAqIHBhcmFtZXRlciBwYXlsb2FkLiBUaGlzIHBheWxvYWQgaXMgaW5jbHVkZWQgZm9yIGFuIGluLWJhbmQKKyAqIHNjZW5hcmlvLiBGb3IgYW4gYWRkcmVzcy9zaGFyZWQgbWVtb3J5LWJhc2VkIHNldCBwYXJhbWV0ZXIsIHRoaXMKKyAqIHBheWxvYWQgaXMgbm90IG5lZWRlZC4KKyAqLworCisKK3N0cnVjdCBhZmVfcG9ydF9jbWRyc3BfZ2V0X3BhcmFtX3YyIHsKKwl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9MUEFTU19DT1JFX1NIQVJFRF9DTE9DS19DT05GSUcJMHgwMDAxMDI4QworI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fTFBBU1NfQ09SRV9TSEFSRURfQ0xLX0NPTkZJRwkweDEKKworLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX0xQQVNTX0NPUkVfU0hBUkVEX0NMT0NLX0NPTkZJRyBwYXJhbWV0ZXIgdXNlZCBieQorICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgorICovCitzdHJ1Y3QgYWZlX3BhcmFtX2lkX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jZmcgeworCXUzMglscGFzc19jb3JlX3NoYXJlZF9jbGtfY2ZnX21pbm9yX3ZlcnNpb247CisvKgorICogTWlub3IgdmVyc2lvbiB1c2VkIGZvciBscGFzcyBjb3JlIHNoYXJlZCBjbG9jayBjb25maWd1cmF0aW9uCisgKiBTdXBwb3J0ZWQgdmFsdWU6IEFGRV9BUElfVkVSU0lPTl9MUEFTU19DT1JFX1NIQVJFRF9DTEtfQ09ORklHCisgKi8KKwl1MzIJZW5hYmxlOworLyoKKyAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBscGFzcyBjb3JlIHNoYXJlZCBjbG9jayBpcworICogZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApLgorICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIJCSAgIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jZmcgY2xrX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qIGFkc3BfYWZlX3NlcnZpY2VfY29tbWFuZHMuaCAqLworCisjZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9FQklfUE9PTCAgICAgIDAKKworI2RlZmluZSBBRFNQX01FTU9SWV9NQVBfU01JX1BPT0wgICAgICAxCisjZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9JTUVNX1BPT0wgICAgICAyCisjZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9TSE1FTThfNEtfUE9PTCAgICAgIDMKKworLyogRGVmaW5pdGlvbiBvZiB2aXJ0dWFsIG1lbW9yeSBmbGFnICovCisjZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9WSVJUVUFMX01FTU9SWSAxCisKKy8qIERlZmluaXRpb24gb2YgcGh5c2ljYWwgbWVtb3J5IGZsYWcgKi8KKyNkZWZpbmUgQURTUF9NRU1PUllfTUFQX1BIWVNJQ0FMX01FTU9SWSAwCisKKyNkZWZpbmUgTlVMTF9QT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBDNjgKKyNkZWZpbmUgTlVMTF9DT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTAzMTIKKyNkZWZpbmUgREVGQVVMVF9DT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTAzMTQKKyNkZWZpbmUgREVGQVVMVF9QT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBCRTQKKyNkZWZpbmUgQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9ERUZBVUxUX1RPUE9MT0dZICAgICAgICAgMHgwMDAxMDc2QgorI2RlZmluZSBDT01QUkVTU19QQVNTVEhST1VHSF9OT05FX1RPUE9MT0dZICAgICAgMHgwMDAxMDc3NAorI2RlZmluZSBWUE1fVFhfU01fRUNOU19DT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEY3MQorI2RlZmluZSBWUE1fVFhfRE1fRkxVRU5DRV9DT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEY3MgorI2RlZmluZSBWUE1fVFhfUU1JQ19GTFVFTkNFX0NPUFBfVE9QT0xPR1kJCTB4MDAwMTBGNzUKKyNkZWZpbmUgVlBNX1RYX0RNX1JGRUNOU19DT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEY4NgorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9EVFNfSFBYCQkweDEwMDE1MDAyCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0FVRElPU1BIRVJFCTB4MTAwMjgwMDAKKworLyogTWVtb3J5IG1hcCByZWdpb25zIGNvbW1hbmQgcGF5bG9hZCB1c2VkIGJ5IHRoZQorICogI0FTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAsI0FETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUworICogY29tbWFuZHMuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIGNsaWVudHMgdG8gbWFwIG11bHRpcGxlIHNoYXJlZCBtZW1vcnkKKyAqIHJlZ2lvbnMgaW4gYSBzaW5nbGUgY29tbWFuZC4gRm9sbG93aW5nIHRoaXMgc3RydWN0dXJlIGFyZQorICogbnVtX3JlZ2lvbnMgb2YgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQuCisgKi8KKworCitzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgICAgICAgbWVtX3Bvb2xfaWQ7CisvKiBUeXBlIG9mIG1lbW9yeSBvbiB3aGljaCB0aGlzIG1lbW9yeSByZWdpb24gaXMgbWFwcGVkLgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IC0gI0FEU1BfTUVNT1JZX01BUF9FQklfUE9PTCAtCisgKiAjQURTUF9NRU1PUllfTUFQX1NNSV9QT09MIC0gI0FEU1BfTUVNT1JZX01BUF9JTUVNX1BPT0wKKyAqICh1bnN1cHBvcnRlZCkgLSAjQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MIC0gT3RoZXIgdmFsdWVzCisgKiBhcmUgcmVzZXJ2ZWQKKyAqCisgKiBUaGUgbWVtb3J5IElEIGltcGxpY2l0bHkgZGVmaW5lcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQorICogbWVtb3J5LiBDaGFyYWN0ZXJpc3RpY3MgbWF5IGluY2x1ZGUgYWxpZ25tZW50IHR5cGUsIHBlcm1pc3Npb25zLAorICogZXRjLgorICoKKyAqIFNITUVNOF80SyBpcyBzaGFyZWQgbWVtb3J5LCBieXRlIGFkZHJlc3NhYmxlLCBhbmQgNCBLQiBhbGlnbmVkLgorICovCisKKworCXUxNiAgICAgICAgICAgICAgICAgIG51bV9yZWdpb25zOworCS8qIE51bWJlciBvZiByZWdpb25zIHRvIG1hcC4qLworCisJdTMyICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmxhZzsKKy8qIENvbmZpZ3VyZXMgb25lIGNvbW1vbiBwcm9wZXJ0eSBmb3IgYWxsIHRoZSByZWdpb25zIGluIHRoZQorICogcGF5bG9hZC4gTm8gdHdvIHJlZ2lvbnMgaW4gdGhlIHNhbWUgbWVtb3J5IG1hcCByZWdpb25zIGNtZCBjYW4KKyAqIGhhdmUgZGlmZmVybnQgcHJvcGVydHkuIFN1cHBvcnRlZCB2YWx1ZXM6IC0gMHgwMDAwMDAwMCB0bworICogMHgwMDAwMDAwMQorICoKKyAqIGIwIC0gYml0IDAgaW5kaWNhdGVzIHBoeXNpY2FsIG9yIHZpcnR1YWwgbWFwcGluZyAwIHNoYXJlZCBtZW1vcnkKKyAqIGFkZHJlc3MgcHJvdmlkZWQgaW4gYXZzX3NoYXJlZF9tYXBfcmVnaW9uc19wYXlsb2FkIGlzIHBoeXNpY2FsCisgKiBhZGRyZXNzLiBUaGUgc2hhcmVkIG1lbW9yeSBuZWVkcyB0byBiZSBtYXBwZWQoIGhhcmR3YXJlIFRMQgorICogZW50cnkpCisgKgorICogYW5kIGEgc29mdHdhcmUgZW50cnkgbmVlZHMgdG8gYmUgYWRkZWQgZm9yIGludGVybmFsIGJvb2sga2VlcGluZy4KKyAqCisgKiAxIFNoYXJlZCBtZW1vcnkgYWRkcmVzcyBwcm92aWRlZCBpbiBNYXlQYXlsb2FkW3VzUmVnaW9uc10gaXMKKyAqIHZpcnR1YWwgYWRkcmVzcy4gVGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBub3QgYmUgbWFwcGVkIChzaW5jZQorICogaGFyZHdhcmUgVExCIGVudHJ5IGlzIGFscmVhZHkgYXZhaWxhYmxlKSBidXQgYSBzb2Z0d2FyZSBlbnRyeQorICogbmVlZHMgdG8gYmUgYWRkZWQgZm9yIGludGVybmFsIGJvb2sga2VlcGluZy4gVGhpcyBjYW4gYmUgdXNlZnVsCisgKiBpZiB0d28gc2VydmljZXMgd2l0aCBpbiBBRFNQIGlzIGNvbW11bmljYXRpbmcgdmlhIEFQUi4gVGhleSBjYW4KKyAqIG5vdyBkaXJlY3RseSBjb21tdW5pY2F0ZSB2aWEgdGhlIFZpcnR1YWwgYWRkcmVzcyBpbnN0ZWFkIG9mCisgKiBQaHlzaWNhbCBhZGRyZXNzLiBUaGUgdmlydHVhbCByZWdpb25zIG11c3QgYmUgY29udGlndW91cy4KKyAqCisgKiBiMzEtYjEgLSByZXNlcnZlZCBiaXRzLiBtdXN0IGJlIHNldCB0byB6ZXJvCisgKi8KKworfSBfX3BhY2tlZDsKKworc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkIHsKKwl1MzIgICAgICAgICAgICAgICAgICBzaG1fYWRkcl9sc3c7CisvKiBsZWFzdCBzaWduaWZpY2FudCB3b3JkIG9mIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CisgKiByZWdpb24gdG8gbWFwLiBJdCBtdXN0IGJlIGNvbnRpZ3VvdXMgbWVtb3J5LCBhbmQgaXQgbXVzdCBiZSA0IEtCCisgKiBhbGlnbmVkLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBzaG1fYWRkcl9tc3c7CisvKiBtb3N0IHNpZ25pZmljYW50IHdvcmQgb2Ygc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKKyAqIHJlZ2lvbiB0byBtYXAuIEZvciAzMiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCB0aGlzIGZpZWxkIG11c3QKKyAqIHRiZSBzZXQgdG8gemVyby4gRm9yIDM2IGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIGJpdDMxIHRvIGJpdCA0CisgKiBtdXN0IGJlIHNldCB0byB6ZXJvCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9zaXplX2J5dGVzOworLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWdpb24uCisgKgorICogVGhlIGFEU1Agd2lsbCBhbHdheXMgbWFwIHRoZSByZWdpb25zIGFzIHZpcnR1YWwgY29udGlndW91cworICogbWVtb3J5LCBidXQgdGhlIG1lbW9yeSBzaXplIG11c3QgYmUgaW4gbXVsdGlwbGVzIG9mIDQgS0IgdG8gYXZvaWQKKyAqIGdhcHMgaW4gdGhlIHZpcnR1YWxseSBjb250aWd1b3VzIG1hcHBlZCBtZW1vcnkuCisgKi8KKworfSBfX3BhY2tlZDsKKworc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIHsKKwlzdHJ1Y3QgYXByX2hkciAgICAgICBoZHI7CisJdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisvKiBtZW1vcnkgbWFwIGhhbmRsZSByZXR1cm5lZCBieSBBU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMKKyAqICwgQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TLCBjb21tYW5kcworICovCisKK30gX19wYWNrZWQ7CisKKy8qIE1lbW9yeSBtYXAgY29tbWFuZCByZXNwb25zZSBwYXlsb2FkIHVzZWQgYnkgdGhlCisgKiAjQVNNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TCisgKiAsI0FETV9DTURSU1BfU0hBUkVEX01FTV9NQVBfUkVHSU9OUworICovCisKKworc3RydWN0IGF2c19jbWRyc3Bfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyB7CisJdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisvKiBBIG1lbW9yeSBtYXAgaGFuZGxlIGVuY2Fwc3VsYXRpbmcgc2hhcmVkIG1lbW9yeSBhdHRyaWJ1dGVzIGlzCisgKiByZXR1cm5lZAorICovCisKK30gX19wYWNrZWQ7CisKKy8qYWRzcF9hdWRpb19tZW1tYXBfYXBpLmgqLworCisvKiBBU00gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBhc21fd21hX2NmZyB7CisJdTE2IGZvcm1hdF90YWc7CisJdTE2IGNoX2NmZzsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIGF2Z19ieXRlc19wZXJfc2VjOworCXUxNiBibG9ja19hbGlnbjsKKwl1MTYgdmFsaWRfYml0c19wZXJfc2FtcGxlOworCXUzMiBjaF9tYXNrOworCXUxNiBlbmNvZGVfb3B0OworCXUxNiBhZHZfZW5jb2RlX29wdDsKKwl1MzIgYWR2X2VuY29kZV9vcHQyOworCXUzMiBkcmNfcGVha19yZWY7CisJdTMyIGRyY19wZWFrX3RhcmdldDsKKwl1MzIgZHJjX2F2ZV9yZWY7CisJdTMyIGRyY19hdmVfdGFyZ2V0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV93bWFwcm9fY2ZnIHsKKwl1MTYgZm9ybWF0X3RhZzsKKwl1MTYgY2hfY2ZnOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgYXZnX2J5dGVzX3Blcl9zZWM7CisJdTE2IGJsb2NrX2FsaWduOworCXUxNiB2YWxpZF9iaXRzX3Blcl9zYW1wbGU7CisJdTMyIGNoX21hc2s7CisJdTE2IGVuY29kZV9vcHQ7CisJdTE2IGFkdl9lbmNvZGVfb3B0OworCXUzMiBhZHZfZW5jb2RlX29wdDI7CisJdTMyIGRyY19wZWFrX3JlZjsKKwl1MzIgZHJjX3BlYWtfdGFyZ2V0OworCXUzMiBkcmNfYXZlX3JlZjsKKwl1MzIgZHJjX2F2ZV90YXJnZXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2FhY19jZmcgeworCXUxNiBmb3JtYXQ7CisJdTE2IGFvdDsKKwl1MTYgZXBfY29uZmlnOworCXUxNiBzZWN0aW9uX2RhdGFfcmVzaWxpZW5jZTsKKwl1MTYgc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlOworCXUxNiBzcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2U7CisJdTE2IGNoX2NmZzsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIHNhbXBsZV9yYXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9hbXJ3YnBsdXNfY2ZnIHsKKwl1MzIgIHNpemVfYnl0ZXM7CisJdTMyICB2ZXJzaW9uOworCXUzMiAgbnVtX2NoYW5uZWxzOworCXUzMiAgYW1yX2JhbmRfbW9kZTsKKwl1MzIgIGFtcl9kdHhfbW9kZTsKKwl1MzIgIGFtcl9mcmFtZV9mbXQ7CisJdTMyICBhbXJfbHNmX2lkeDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fZmxhY19jZmcgeworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgZXh0X3NhbXBsZV9yYXRlOworCXUzMiBtaW5fZnJhbWVfc2l6ZTsKKwl1MzIgbWF4X2ZyYW1lX3NpemU7CisJdTE2IHN0cmVhbV9pbmZvX3ByZXNlbnQ7CisJdTE2IG1pbl9ibGtfc2l6ZTsKKwl1MTYgbWF4X2Jsa19zaXplOworCXUxNiBjaF9jZmc7CisJdTE2IHNhbXBsZV9zaXplOworCXUxNiBtZDVfc3VtOworfTsKKworc3RydWN0IGFzbV9hbGFjX2NmZyB7CisJdTMyIGZyYW1lX2xlbmd0aDsKKwl1OCBjb21wYXRpYmxlX3ZlcnNpb247CisJdTggYml0X2RlcHRoOworCXU4IHBiOworCXU4IG1iOworCXU4IGtiOworCXU4IG51bV9jaGFubmVsczsKKwl1MTYgbWF4X3J1bjsKKwl1MzIgbWF4X2ZyYW1lX2J5dGVzOworCXUzMiBhdmdfYml0X3JhdGU7CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBjaGFubmVsX2xheW91dF90YWc7Cit9OworCitzdHJ1Y3QgYXNtX2c3MTFfZGVjX2NmZyB7CisJdTMyIHNhbXBsZV9yYXRlOworfTsKKworc3RydWN0IGFzbV92b3JiaXNfY2ZnIHsKKwl1MzIgYml0X3N0cmVhbV9mbXQ7Cit9OworCitzdHJ1Y3QgYXNtX2FwZV9jZmcgeworCXUxNiBjb21wYXRpYmxlX3ZlcnNpb247CisJdTE2IGNvbXByZXNzaW9uX2xldmVsOworCXUzMiBmb3JtYXRfZmxhZ3M7CisJdTMyIGJsb2Nrc19wZXJfZnJhbWU7CisJdTMyIGZpbmFsX2ZyYW1lX2Jsb2NrczsKKwl1MzIgdG90YWxfZnJhbWVzOworCXUxNiBiaXRzX3Blcl9zYW1wbGU7CisJdTE2IG51bV9jaGFubmVsczsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIHNlZWtfdGFibGVfcHJlc2VudDsKK307CisKK3N0cnVjdCBhc21fZHNkX2NmZyB7CisJdTE2IG51bV92ZXJzaW9uOworCXUxNiBpc19iaXR3aXNlX2JpZ19lbmRpYW47CisJdTE2IGRzZF9jaGFubmVsX2Jsb2NrX3NpemU7CisJdTE2IG51bV9jaGFubmVsczsKKwl1OCAgY2hhbm5lbF9tYXBwaW5nWzhdOworCXUzMiBkc2RfZGF0YV9yYXRlOworfTsKKworc3RydWN0IGFzbV9zb2Z0cGF1c2VfcGFyYW1zIHsKKwl1MzIgZW5hYmxlOworCXUzMiBwZXJpb2Q7CisJdTMyIHN0ZXA7CisJdTMyIHJhbXBpbmdjdXJ2ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgeworCXUzMiBwZXJpb2Q7CisJdTMyIHN0ZXA7CisJdTMyIHJhbXBpbmdjdXJ2ZTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX0VORF9QT0lOVF9ERVZJQ0VfTUFUUklYICAgICAwCisKKyNkZWZpbmUgUENNX0NIQU5ORUxfTlVMTCAwCisKKy8qIEZyb250IGxlZnQgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfRkwgICAgMQorCisvKiBGcm9udCByaWdodCBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9GUiAgICAyCisKKy8qIEZyb250IGNlbnRlciBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9GQyAgICAzCisKKy8qIExlZnQgc3Vycm91bmQgY2hhbm5lbC4qLworI2RlZmluZSBQQ01fQ0hBTk5FTF9MUyAgIDQKKworLyogUmlnaHQgc3Vycm91bmQgY2hhbm5lbC4qLworI2RlZmluZSBQQ01fQ0hBTk5FTF9SUyAgIDUKKworLyogTG93IGZyZXF1ZW5jeSBlZmZlY3QgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfTEZFICA2CisKKy8qIENlbnRlciBzdXJyb3VuZCBjaGFubmVsOyBSZWFyIGNlbnRlciBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9DUyAgIDcKKworLyogTGVmdCBiYWNrIGNoYW5uZWw7IFJlYXIgbGVmdCBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9MQiAgIDgKKworLyogUmlnaHQgYmFjayBjaGFubmVsOyBSZWFyIHJpZ2h0IGNoYW5uZWwuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX1JCICAgOQorCisvKiBUb3Agc3Vycm91bmQgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxTICAgMTAKKworLyogQ2VudGVyIHZlcnRpY2FsIGhlaWdodCBjaGFubmVsLiovCisjZGVmaW5lIFBDTV9DSEFOTkVMX0NWSCAgMTEKKworLyogTW9ubyBzdXJyb3VuZCBjaGFubmVsLiovCisjZGVmaW5lIFBDTV9DSEFOTkVMX01TICAgMTIKKworLyogRnJvbnQgbGVmdCBvZiBjZW50ZXIuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX0ZMQyAgMTMKKworLyogRnJvbnQgcmlnaHQgb2YgY2VudGVyLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9GUkMgIDE0CisKKy8qIFJlYXIgbGVmdCBvZiBjZW50ZXIuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX1JMQyAgMTUKKworLyogUmVhciByaWdodCBvZiBjZW50ZXIuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX1JSQyAgMTYKKworI2RlZmluZSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCAgOAorCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIgMHgwMDAxMERBNQorCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjMgMHgwMDAxMEREQworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjQgMHgwMDAxMzIwQworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfRVZSQ0JfRlMgMHgwMDAxMEJFRgorCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfRVZSQ1dCX0ZTIDB4MDAwMTBCRjAKKworI2RlZmluZSBBU01fTUFYX0VRX0JBTkRTIDEyCisKKyNkZWZpbmUgQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjIgMHgwMDAxMEQ5OAorCitzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgewordTMyICAgICAgICAgICAgICAgICAgICBmbXRfYmxrX3NpemU7CisJLyogTWVkaWEgZm9ybWF0IGJsb2NrIHNpemUgaW4gYnl0ZXMuKi8KK30gIF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10X2JsazsKKworCXUxNiAgbnVtX2NoYW5uZWxzOworCS8qIE51bWJlciBvZiBjaGFubmVscy4gU3VwcG9ydGVkIHZhbHVlczogMSB0byA4ICovCisJdTE2ICBiaXRzX3Blcl9zYW1wbGU7CisvKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHBlciBjaGFubmVsLiAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAxNiwgMjQgKiBXaGVuIHVzZWQgZm9yIHBsYXliYWNrLCB0aGUgY2xpZW50IG11c3Qgc2VuZCAyNC1iaXQKKyAqIHNhbXBsZXMgcGFja2VkIGluIDMyLWJpdCB3b3Jkcy4gVGhlIDI0LWJpdCBzYW1wbGVzIG11c3QgYmUgcGxhY2VkCisgKiBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCAyNCBiaXRzIG9mIHRoZSAzMi1iaXQgd29yZC4gV2hlbiB1c2VkIGZvcgorICogcmVjb3JkaW5nLCB0aGUgYURTUCBzZW5kcyAyNC1iaXQgc2FtcGxlcyBwYWNrZWQgaW4gMzItYml0IHdvcmRzLgorICogVGhlIDI0LWJpdCBzYW1wbGVzIGFyZSBwbGFjZWQgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMjQgYml0cyBvZgorICogdGhlIDMyLWJpdCB3b3JkLgorICovCisKKworCXUzMiAgc2FtcGxlX3JhdGU7CisvKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kIChpbiBIZXJ0eikuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDQ4MDAwCisgKi8KKworCXUxNiAgaXNfc2lnbmVkOworCS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIHNhbXBsZXMgYXJlIHNpZ25lZCAoMSkuICovCisKKwl1MTYgIHJlc2VydmVkOworCS8qIHJlc2VydmVkIGZpZWxkIGZvciAzMiBiaXQgYWxpZ25tZW50LiBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLworCisJdTggICBjaGFubmVsX21hcHBpbmdbOF07CisvKiBDaGFubmVsIGFycmF5IG9mIHNpemUgOC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNQQ01fQ0hBTk5FTF9MCisgKiAtICNQQ01fQ0hBTk5FTF9SCisgKiAtICNQQ01fQ0hBTk5FTF9DCisgKiAtICNQQ01fQ0hBTk5FTF9MUworICogLSAjUENNX0NIQU5ORUxfUlMKKyAqIC0gI1BDTV9DSEFOTkVMX0xGRQorICogLSAjUENNX0NIQU5ORUxfQ1MKKyAqIC0gI1BDTV9DSEFOTkVMX0xCCisgKiAtICNQQ01fQ0hBTk5FTF9SQgorICogLSAjUENNX0NIQU5ORUxTCisgKiAtICNQQ01fQ0hBTk5FTF9DVkgKKyAqIC0gI1BDTV9DSEFOTkVMX01TCisgKiAtICNQQ01fQ0hBTk5FTF9GTEMKKyAqIC0gI1BDTV9DSEFOTkVMX0ZSQworICogLSAjUENNX0NIQU5ORUxfUkxDCisgKiAtICNQQ01fQ0hBTk5FTF9SUkMKKyAqCisgKiBDaGFubmVsW2ldIG1hcHBpbmcgZGVzY3JpYmVzIGNoYW5uZWwgSS4gRWFjaCBlbGVtZW50IGkgb2YgdGhlCisgKiBhcnJheSBkZXNjcmliZXMgY2hhbm5lbCBJIGluc2lkZSB0aGUgYnVmZmVyIHdoZXJlIDAgQGxlIEkgPAorICogbnVtX2NoYW5uZWxzLiBBbiB1bnVzZWQgY2hhbm5lbCBpcyBzZXQgdG8gemVyby4KKyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YzIHsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7CisvKgorICogTnVtYmVyIG9mIGNoYW5uZWxzCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDgKKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlOworLyoKKyAqIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcGVyIGNoYW5uZWwKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNAorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qCisgKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDQ4MDAwLCA5NjAwMCwxOTIwMDAgSHoKKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgaXNfc2lnbmVkOworLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IFBDTSBzYW1wbGVzIGFyZSBzaWduZWQgKDEpICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBzYW1wbGVfd29yZF9zaXplOworLyoKKyAqIFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEyLDI0LDMyCisgKi8KKworCXVpbnQ4X3QgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKKy8qCisgKiBFYWNoIGVsZW1lbnQsIGksIGluIHRoZSBhcnJheSBkZXNjcmliZXMgY2hhbm5lbCBpIGluc2lkZSB0aGUgYnVmZmVyIHdoZXJlCisgKiAwIDw9IGkgPCBudW1fY2hhbm5lbHMuIFVudXNlZCBjaGFubmVscyBhcmUgc2V0IHRvIDAuCisgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192NCB7CisJdWludDE2X3QgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyoKKyAqIE51bWJlciBvZiBjaGFubmVscworICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4CisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKKy8qCisgKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHBlciBjaGFubmVsCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQsIDMyCisgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworLyoKKyAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDIwMDAgdG8gNDgwMDAsIDk2MDAwLDE5MjAwMCBIegorICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBpc19zaWduZWQ7CisvKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgUENNIHNhbXBsZXMgYXJlIHNpZ25lZCAoMSkgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgIHNhbXBsZV93b3JkX3NpemU7CisvKgorICogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsLgorICogU3VwcG9ydGVkIHZhbHVlczogMTIsMjQsMzIKKyAqLworCisJdWludDhfdCAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nWzhdOworLyoKKyAqIEVhY2ggZWxlbWVudCwgaSwgaW4gdGhlIGFycmF5IGRlc2NyaWJlcyBjaGFubmVsIGkgaW5zaWRlIHRoZSBidWZmZXIgd2hlcmUKKyAqIDAgPD0gaSA8IG51bV9jaGFubmVscy4gVW51c2VkIGNoYW5uZWxzIGFyZSBzZXQgdG8gMC4KKyAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgIGVuZGlhbm5lc3M7CisvKgorICogRmxhZyB0byBpbmRpY2F0ZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgcGNtIHNhbXBsZQorICogU3VwcG9ydGVkIHZhbHVlczogMCAtIExpdHRsZSBlbmRpYW4gKGFsbCBvdGhlciBmb3JtYXRzKQorICogICAgICAgICAgICAgICAgICAgMSAtIEJpZyBlbmRpYW4gKEFJRkYpCisgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICBtb2RlOworLyoKKyAqIE1vZGUgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm8gYWJvdXQgdGhlIHBjbSBpbnB1dCBkYXRhLgorICogU3VwcG9ydGVkIHZhbHVlczogMCAtIERlZmF1bHQgUUZzIChRMTUgZm9yIDE2YiwgUTIzIGZvciBwYWNrZWQgMjRiLAorICogICAgICAgICAgICAgICAgICAgICAgIFEzMSBmb3IgdW5wYWNrZWQgMjRiIG9yIDMyYikKKyAqICAgICAgICAgICAgICAgICAgMTUgLSBmb3IgMTYgYml0CisgKiAgICAgICAgICAgICAgICAgIDIzIC0gZm9yIDI0YiBwYWNrZWQgb3IgOC4yNCBmb3JtYXQKKyAqICAgICAgICAgICAgICAgICAgMzEgLSBmb3IgMjRiIHVucGFja2VkIG9yIDMyYml0CisgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBQYXlsb2FkIG9mIHRoZSBtdWx0aWNoYW5uZWwgUENNIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbgorICogdGhlIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjMgbWVkaWEgZm9ybWF0LgorICovCitzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfcGFyYW1fdjMgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10X2JsazsKKwlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfdjMgcGFyYW07Cit9IF9fcGFja2VkOworCisvKgorICogUGF5bG9hZCBvZiB0aGUgbXVsdGljaGFubmVsIFBDTSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4KKyAqIHRoZSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1Y0IG1lZGlhIGZvcm1hdC4KKyAqLworc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3BhcmFtX3Y0IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdF9ibGs7CisJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3Y0IHBhcmFtOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0geworCXUzMiAgICAgICAgICAgICAgICAgIHBhcmFtX2lkOworCS8qIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBwYXJhbV9zaXplOworLyogRGF0YSBzaXplIG9mIHRoaXMgcGFyYW1ldGVyLCBpbiBieXRlcy4gVGhlIHNpemUgaXMgYSBtdWx0aXBsZQorICogb2YgNCBieXRlcy4KKyAqLworCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIHsKKwl1MzIgICAgICAgICAgICAgICAgICBmcmFtZXNfcGVyX2J1ZjsKKy8qIE51bWJlciBvZiBlbmNvZGVkIGZyYW1lcyB0byBwYWNrIGludG8gZWFjaCBidWZmZXIuCisgKgorICogQG5vdGUxaGFuZyBUaGlzIGlzIG9ubHkgZ3VpZGFuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBhRFNQLiBUaGUKKyAqIG51bWJlciBvZiBlbmNvZGVkIGZyYW1lcyBwdXQgaW50byBlYWNoIGJ1ZmZlciAoc3BlY2lmaWVkIGJ5IHRoZQorICogY2xpZW50KSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBudW1iZXIuCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIGVuY19jZmdfYmxrX3NpemU7CisvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYmxvY2sgdGhhdCBmb2xsb3dzCisgKiB0aGlzIG1lbWJlci4KKyAqLworCit9IF9fcGFja2VkOworCisvKiBAYnJpZWYgRG9sYnkgRGlnaXRhbCBQbHVzIGVuZCBwb2ludCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgYXNtX2RlY19kZHBfZW5kcF9wYXJhbV92MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7CisJaW50IGVuZHBfcGFyYW1fdmFsdWU7Cit9IF9fcGFja2VkOworCisvKgorICogUGF5bG9hZCBvZiB0aGUgbXVsdGljaGFubmVsIFBDTSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbgorICogdGhlIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjQgbWVkaWEgZm9ybWF0LgorICovCisKK3N0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZW5jX2NmZ192NCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtIGVuY2RlYzsKKwlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIGVuY2JsazsKKwl1aW50MTZfdCBudW1fY2hhbm5lbHM7CisJLyoKKwkgKiBOdW1iZXIgb2YgUENNIGNoYW5uZWxzLgorCSAqIEB2YWx1ZXMKKwkgKiAtIDAgLS0gTmF0aXZlIG1vZGUKKwkgKiAtIDEgLS0gOCBjaGFubmVscworCSAqIE5hdGl2ZSBtb2RlIGluZGljYXRlcyB0aGF0IGVuY29kaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdpdGggdGhlIG51bWJlcgorCSAqIG9mIGNoYW5uZWxzIGF0IHRoZSBpbnB1dC4KKwkgKi8KKwl1aW50MTZfdCAgYml0c19wZXJfc2FtcGxlOworCS8qCisJICogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwZXIgY2hhbm5lbC4KKwkgKiBAdmFsdWVzIDE2LCAyNAorCSAqLworCXVpbnQzMl90ICBzYW1wbGVfcmF0ZTsKKwkvKgorCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisJICogQHZhbHVlcyAwLCA4MDAwIHRvIDQ4MDAwIEh6CisJICogQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGUgbmF0aXZlIHNhbXBsaW5nIHJhdGUuIEVuY29kaW5nIGlzCisJICogcGVyZm9ybWVkIGF0IHRoZSBpbnB1dCBzYW1wbGluZyByYXRlLgorCSAqLworCXVpbnQxNl90ICBpc19zaWduZWQ7CisJLyoKKwkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBQQ00gc2FtcGxlcyBhcmUgc2lnbmVkICgxKS4gQ3VycmVudGx5LCBvbmx5CisJICogc2lnbmVkIFBDTSBzYW1wbGVzIGFyZSBzdXBwb3J0ZWQuCisJICovCisJdWludDE2X3QgICAgc2FtcGxlX3dvcmRfc2l6ZTsKKwkvKgorCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwuCisJICogQHZhbHVlcyAxNiwgMjQsIDMyCisJICogMTYtYml0IHNhbXBsZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gMTYtYml0IHdvcmRzOgorCSAqIHNhbXBsZV93b3JkX3NpemUgPSAxLgorCSAqIDI0LWJpdCBzYW1wbGVzIGNhbiBiZSBwbGFjZWQgaW4gMzItYml0IHdvcmRzIG9yIGluIGNvbnNlY3V0aXZlCisJICogMjQtYml0IHdvcmRzLgorCSAqIC0gSWYgc2FtcGxlX3dvcmRfc2l6ZSA9IDMyLCAyNC1iaXQgc2FtcGxlcyBhcmUgcGxhY2VkIGluIHRoZQorCSAqIG1vc3Qgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiBhIDMyLWJpdCB3b3JkLgorCSAqIC0gSWYgc2FtcGxlX3dvcmRfc2l6ZSA9IDI0LCAyNC1iaXQgc2FtcGxlcyBhcmUgcGxhY2VkIGluCisJICogMjQtYml0IHdvcmRzLiBAdGFibGVidWxsZXRlbmQKKwkgKi8KKwl1aW50OF90ICAgY2hhbm5lbF9tYXBwaW5nWzhdOworCS8qCisJICogQ2hhbm5lbCBtYXBwaW5nIGFycmF5IGV4cGVjdGVkIGF0IHRoZSBlbmNvZGVyIG91dHB1dC4KKwkgKiAgQ2hhbm5lbFtpXSBtYXBwaW5nIGRlc2NyaWJlcyBjaGFubmVsIGkgaW5zaWRlIHRoZSBidWZmZXIsIHdoZXJlCisJICogIDAgQGxlIGkgPCBudW1fY2hhbm5lbHMuIEFsbCB2YWxpZCB1c2VkIGNoYW5uZWxzIG11c3QgYmUgcHJlc2VudCBhdAorCSAqICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4KKwkgKiBJZiBOYXRpdmUgbW9kZSBpcyBzZXQgZm9yIHRoZSBjaGFubmVscywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLgorCSAqIEB2YWx1ZXMgU2VlIFNlY3Rpb24gQHhyZWZ7ZG94OlBjbUNoYW5uZWxEZWZzfQorCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgIGVuZGlhbm5lc3M7CisJLyoKKwkgKiBGbGFnIHRvIGluZGljYXRlIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwY20gc2FtcGxlCisJICogU3VwcG9ydGVkIHZhbHVlczogMCAtIExpdHRsZSBlbmRpYW4gKGFsbCBvdGhlciBmb3JtYXRzKQorCSAqICAgICAgICAgICAgICAgICAgIDEgLSBCaWcgZW5kaWFuIChBSUZGKQorCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgIG1vZGU7CisJLyoKKwkgKiBNb2RlIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBwY20gaW5wdXQgZGF0YS4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIC0gRGVmYXVsdCBRRnMgKFExNSBmb3IgMTZiLCBRMjMgZm9yIHBhY2tlZCAyNGIsCisJICogICAgICAgICAgICAgICAgICAgICAgIFEzMSBmb3IgdW5wYWNrZWQgMjRiIG9yIDMyYikKKwkgKiAgICAgICAgICAgICAgICAgIDE1IC0gZm9yIDE2IGJpdAorCSAqICAgICAgICAgICAgICAgICAgMjMgLSBmb3IgMjRiIHBhY2tlZCBvciA4LjI0IGZvcm1hdAorCSAqICAgICAgICAgICAgICAgICAgMzEgLSBmb3IgMjRiIHVucGFja2VkIG9yIDMyYml0CisJICovCit9IF9fcGFja2VkOworCisvKgorICogUGF5bG9hZCBvZiB0aGUgbXVsdGljaGFubmVsIFBDTSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbgorICogdGhlIEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjMgbWVkaWEgZm9ybWF0LgorICovCisKK3N0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZW5jX2NmZ192MyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtIGVuY2RlYzsKKwlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIGVuY2JsazsKKwl1aW50MTZfdCBudW1fY2hhbm5lbHM7CisJLyoKKwkgKiBOdW1iZXIgb2YgUENNIGNoYW5uZWxzLgorCSAqIEB2YWx1ZXMKKwkgKiAtIDAgLS0gTmF0aXZlIG1vZGUKKwkgKiAtIDEgLS0gOCBjaGFubmVscworCSAqIE5hdGl2ZSBtb2RlIGluZGljYXRlcyB0aGF0IGVuY29kaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdpdGggdGhlIG51bWJlcgorCSAqIG9mIGNoYW5uZWxzIGF0IHRoZSBpbnB1dC4KKwkgKi8KKwl1aW50MTZfdCAgYml0c19wZXJfc2FtcGxlOworCS8qCisJICogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwZXIgY2hhbm5lbC4KKwkgKiBAdmFsdWVzIDE2LCAyNAorCSAqLworCXVpbnQzMl90ICBzYW1wbGVfcmF0ZTsKKwkvKgorCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisJICogQHZhbHVlcyAwLCA4MDAwIHRvIDQ4MDAwIEh6CisJICogQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGUgbmF0aXZlIHNhbXBsaW5nIHJhdGUuIEVuY29kaW5nIGlzCisJICogcGVyZm9ybWVkIGF0IHRoZSBpbnB1dCBzYW1wbGluZyByYXRlLgorCSAqLworCXVpbnQxNl90ICBpc19zaWduZWQ7CisJLyoKKwkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBQQ00gc2FtcGxlcyBhcmUgc2lnbmVkICgxKS4gQ3VycmVudGx5LCBvbmx5CisJICogc2lnbmVkIFBDTSBzYW1wbGVzIGFyZSBzdXBwb3J0ZWQuCisJICovCisJdWludDE2X3QgICAgc2FtcGxlX3dvcmRfc2l6ZTsKKwkvKgorCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwuCisJICogQHZhbHVlcyAxNiwgMjQsIDMyCisJICogMTYtYml0IHNhbXBsZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gMTYtYml0IHdvcmRzOgorCSAqIHNhbXBsZV93b3JkX3NpemUgPSAxLgorCSAqIDI0LWJpdCBzYW1wbGVzIGNhbiBiZSBwbGFjZWQgaW4gMzItYml0IHdvcmRzIG9yIGluIGNvbnNlY3V0aXZlCisJICogMjQtYml0IHdvcmRzLgorCSAqIC0gSWYgc2FtcGxlX3dvcmRfc2l6ZSA9IDMyLCAyNC1iaXQgc2FtcGxlcyBhcmUgcGxhY2VkIGluIHRoZQorCSAqIG1vc3Qgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiBhIDMyLWJpdCB3b3JkLgorCSAqIC0gSWYgc2FtcGxlX3dvcmRfc2l6ZSA9IDI0LCAyNC1iaXQgc2FtcGxlcyBhcmUgcGxhY2VkIGluCisJICogMjQtYml0IHdvcmRzLiBAdGFibGVidWxsZXRlbmQKKwkgKi8KKwl1aW50OF90ICAgY2hhbm5lbF9tYXBwaW5nWzhdOworCS8qCisJICogQ2hhbm5lbCBtYXBwaW5nIGFycmF5IGV4cGVjdGVkIGF0IHRoZSBlbmNvZGVyIG91dHB1dC4KKwkgKiAgQ2hhbm5lbFtpXSBtYXBwaW5nIGRlc2NyaWJlcyBjaGFubmVsIGkgaW5zaWRlIHRoZSBidWZmZXIsIHdoZXJlCisJICogIDAgQGxlIGkgPCBudW1fY2hhbm5lbHMuIEFsbCB2YWxpZCB1c2VkIGNoYW5uZWxzIG11c3QgYmUgcHJlc2VudCBhdAorCSAqICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4KKwkgKiBJZiBOYXRpdmUgbW9kZSBpcyBzZXQgZm9yIHRoZSBjaGFubmVscywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLgorCSAqIEB2YWx1ZXMgU2VlIFNlY3Rpb24gQHhyZWZ7ZG94OlBjbUNoYW5uZWxEZWZzfQorCSAqLworfTsKKworLyogQGJyaWVmIE11bHRpY2hhbm5lbCBQQ00gZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB1c2VkCisgKiBpbiB0aGUgI0FTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjIgY29tbWFuZC4KKyAqLworCitzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOworCXVpbnQxNl90ICBudW1fY2hhbm5lbHM7CisvKjwgTnVtYmVyIG9mIFBDTSBjaGFubmVscy4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIDAgLS0gTmF0aXZlIG1vZGUgLSAxIC0tIDggTmF0aXZlIG1vZGUKKyAqIGluZGljYXRlcyB0aGF0IGVuY29kaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdpdGggdGhlIG51bWJlciBvZgorICogY2hhbm5lbHMgYXQgdGhlIGlucHV0LgorICovCisKKwl1aW50MTZfdCAgYml0c19wZXJfc2FtcGxlOworLyo8IE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcGVyIGNoYW5uZWwuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCisJdWludDMyX3QgIHNhbXBsZV9yYXRlOworLyo8IE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQgKGluIEhlcnR6KS4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwLCA4MDAwIHRvIDQ4MDAwIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhlCisgKiBuYXRpdmUgc2FtcGxpbmcgcmF0ZS4gRW5jb2RpbmcgaXMgcGVyZm9ybWVkIGF0IHRoZSBpbnB1dCBzYW1wbGluZworICogcmF0ZS4KKyAqLworCisJdWludDE2X3QgIGlzX3NpZ25lZDsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgc2FtcGxlcyBhcmUgc2lnbmVkICgxKS4gQ3VycmVudGx5LAorICogb25seSBzaWduZWQgc2FtcGxlcyBhcmUgc3VwcG9ydGVkLgorICovCisKKwl1aW50MTZfdCAgcmVzZXJ2ZWQ7CisvKjwgcmVzZXJ2ZWQgZmllbGQgZm9yIDMyIGJpdCBhbGlnbm1lbnQuIG11c3QgYmUgc2V0IHRvIHplcm8uKi8KKworCisJdWludDhfdCAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9NUDMgMHgwMDAxMEJFOQorI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19WMiAweDAwMDEwREE2CisKKy8qIEB4cmVmbGFiZWwKKyAqIHtoZHI6QXNtTWVkaWFGbXREb2xieUFhY30gTWVkaWEgZm9ybWF0IElEIGZvciB0aGUKKyAqIERvbGJ5IEFBQyBkZWNvZGVyLiBUaGlzIGZvcm1hdCBJRCBpcyBiZSB1c2VkIGlmIHRoZSBjbGllbnQgd2FudHMKKyAqIHRvIHVzZSB0aGUgRG9sYnkgQUFDIGRlY29kZXIgdG8gZGVjb2RlIE1QRUcyIGFuZCBNUEVHNCBBQUMKKyAqIGNvbnRlbnRzLgorICovCisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9ET0xCWV9BQUMgMHgwMDAxMEQ4NgorCisvKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGF1ZGlvIGRhdGEgdHJhbnNwb3J0IHN0cmVhbSBBQUMgZm9ybWF0LiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRFRTIDAKKworLyogRW51bWVyYXRpb24gZm9yIGxvdyBvdmVyaGVhZCBhdWRpbyBzdHJlYW0gQUFDIGZvcm1hdC4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfTE9BUyAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgYXVkaW8gZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyAqIEFBQyBmb3JtYXQuCisgKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfQURJRiAgIDIKKworLyogRW51bWVyYXRpb24gZm9yIHRoZSByYXcgQUFDIGZvcm1hdC4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfUkFXICAgIDMKKworI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfTEMgICAgICAgICAgICAgMgorI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfU0JSICAgICAgICAgICAgNQorI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfUFMgICAgICAgICAgICAgMjkKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfQU9UX0JTQUMgICAgICAgICAgIDIyCisKK3N0cnVjdCBhc21fYWFjX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10X2JsazsKKworCQl1MTYgICAgICAgICAgYWFjX2ZtdF9mbGFnOworLyogQml0c3RyZWFtIGZvcm1hdCBvcHRpb24uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfQURUUworICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfTE9BUworICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfQURJRgorICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfUkFXCisgKi8KKworCXUxNiAgICAgICAgICBhdWRpb19vYmp5cGU7CisvKiBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKSBwcmVzZW50IGluIHRoZSBBQUMgc3RyZWFtLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9MQworICogLSAjQVNNX01FRElBX0ZNVF9BQUNfQU9UX1NCUgorICogLSAjQVNNX01FRElBX0ZNVF9BQUNfQU9UX0JTQUMKKyAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9QUworICogLSBPdGhlcndpc2UgLS0gTm90IHN1cHBvcnRlZAorICovCisKKwl1MTYgICAgICAgICAgY2hhbm5lbF9jb25maWc7CisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgcHJlc2VudCBpbiB0aGUgQUFDIHN0cmVhbS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDEgLS0gTW9ubworICogLSAyIC0tIFN0ZXJlbworICogLSA2IC0tIDUuMSBjb250ZW50CisgKi8KKworCXUxNiAgICAgICAgICB0b3RhbF9zaXplX29mX1BDRV9iaXRzOworLyogZ3JlYXRlciBvciBlcXVhbCB0byB6ZXJvLiAqIC1JbiBjYXNlIG9mIFJBVyBmb3JtYXRzIGFuZAorICogY2hhbm5lbCBjb25maWcgPSAwIChQQ0UpLCBjbGllbnQgY2FuIHNlbmQgKiB0aGUgYml0IHN0cmVhbQorICogY29udGFpbmluZyBQQ0UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3RydWN0dXJlICogKGluLWJhbmQpLgorICogLVRoaXMgbnVtYmVyIGRvZXMgbm90IGluY2x1ZGUgYml0cyBpbmNsdWRlZCBmb3IgMzIgYml0IGFsaWdubWVudC4KKyAqIC1JZiB6ZXJvLCB0aGVuIHRoZSBQQ0UgaW5mbyBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUKKyAqIGF1ZGlvIC1iaXQgc3RyZWFtICYgbm90IGluLWJhbmQuCisgKi8KKworCXUzMiAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQgKGluIEhlcnR6KS4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLAorICogNDQxMDAsIDQ4MDAwCisgKgorICogVGhpcyBmaWVsZCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzYW1wbGUgcmF0ZSBvZiB0aGUgQUFDLUxDCisgKiBkZWNvZGVyJ3Mgb3V0cHV0LiAtIEZvciBNUDQgb3IgM0dQIGNvbnRhaW5lcnMsIHRoaXMgaXMgaW5kaWNhdGVkCisgKiBieSB0aGUgc2FtcGxpbmdGcmVxdWVuY3lJbmRleCBmaWVsZCBpbiB0aGUgQXVkaW9TcGVjaWZpY0NvbmZpZworICogZWxlbWVudC4gLSBGb3IgQURUUyBmb3JtYXQsIHRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZQorICogc2FtcGxpbmdGcmVxdWVuY3lJbmRleCBpbiB0aGUgQURUUyBmaXhlZCBoZWFkZXIuIC0gRm9yIEFESUYKKyAqIGZvcm1hdCwgdGhpcyBpcyBpbmRpY2F0ZWQgYnkgdGhlIHNhbXBsaW5nRnJlcXVlbmN5SW5kZXggaW4gdGhlCisgKiBwcm9ncmFtX2NvbmZpZ19lbGVtZW50IHByZXNlbnQgaW4gdGhlIEFESUYgaGVhZGVyLgorICovCisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fYWFjX2VuY19jZmdfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOworCisJdTMyICAgICAgICAgIGJpdF9yYXRlOworCS8qIEVuY29kaW5nIHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAqLworCXUzMiAgICAgICAgICBlbmNfbW9kZTsKKy8qIEVuY29kaW5nIG1vZGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9BQUNfQU9UX0xDCisgKiAtICNBU01fTUVESUFfRk1UX0FBQ19BT1RfU0JSCisgKiAtICNBU01fTUVESUFfRk1UX0FBQ19BT1RfUFMKKyAqLworCXUxNiAgICAgICAgICBhYWNfZm10X2ZsYWc7CisvKiBBQUMgZm9ybWF0IGZsYWcuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfQURUUworICogLSAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfUkFXCisgKi8KKwl1MTYgICAgICAgICAgY2hhbm5lbF9jZmc7CisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gZW5jb2RlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMCAtLSBOYXRpdmUgbW9kZQorICogLSAxIC0tIE1vbm8KKyAqIC0gMiAtLSBTdGVyZW8KKyAqIC0gT3RoZXIgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLgorICogQG5vdGUxaGFuZyBUaGUgZUFBQysgZW5jb2RlciBtb2RlIHN1cHBvcnRzIG9ubHkgc3RlcmVvLgorICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUKKyAqIG51bWJlciBvZiBjaGFubmVscyBhdCB0aGUgaW5wdXQuCisgKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG11c3Qgbm90IGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcuCisgKi8KKworCXUzMiAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIDAgLS0gTmF0aXZlIG1vZGUgLSBGb3Igb3RoZXIgdmFsdWVzLAorICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUKKyAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgorICogVGhlIHNhbXBsaW5nIHJhdGUgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfRzcxMV9BTEFXX0ZTIDB4MDAwMTBCRjcKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMgMHgwMDAxMEMyRQorCitzdHJ1Y3QgYXNtX2c3MTFfZW5jX2NmZ192MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtIGVuY2RlYzsKKwlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIGVuY2JsazsKKworCXUzMiAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qCisgKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kLgorICogU3VwcG9ydGVkIHZhbHVlczogODAwMCwgMTYwMDAgSHoKKyAqLworCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3ZvcmJpc19mbXRfYmxrX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdGJsazsKKwl1MzIgICAgICAgICAgYml0X3N0cmVhbV9mbXQ7CisvKiBCaXQgc3RyZWFtIGZvcm1hdC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gUmF3IGJpdHN0cmVhbQorICogLSAxIC0tIFRyYW5zY29kZWQgYml0c3RyZWFtCisgKgorICogVHJhbnNjb2RlZCBiaXRzdHJlYW0gY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYXMgdGhlIGZpcnN0CisgKiB3b3JkIGluIGVhY2ggZnJhbWUuCisgKi8KKworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9mbGFjX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOworCisJdTE2IGlzX3N0cmVhbV9pbmZvX3ByZXNlbnQ7CisvKiBTcGVjaWZpZXMgd2hldGhlciBzdHJlYW0gaW5mb3JtYXRpb24gaXMgcHJlc2VudCBpbiB0aGUgRkxBQyBmb3JtYXQKKyAqIGJsb2NrLgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gU3RyZWFtIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50IGluIHRoaXMgbWVzc2FnZQorICogLSAxIC0tIFN0cmVhbSBpbmZvcm1hdGlvbiBpcyBwcmVzZW50IGluIHRoaXMgbWVzc2FnZQorICoKKyAqIFdoZW4gc2V0IHRvIDEsIHRoZSBGTEFDIGJpdHN0cmVhbSB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBieSB0aGUKKyAqIGNsaWVudCwgYW5kIG90aGVyIGZpZWxkcyBpbiB0aGUgRkxBQyBmb3JtYXQgYmxvY2sgY2FuIGJlIHJlYWQgYnkgdGhlCisgKiBkZWNvZGVyIHRvIGdldCBtZXRhZGF0YSBzdHJlYW0gaW5mb3JtYXRpb24uCisgKi8KKworCXUxNiBudW1fY2hhbm5lbHM7CisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIGRlY29kaW5nLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAyCisgKi8KKworCXUxNiBtaW5fYmxrX3NpemU7CisvKiBNaW5pbXVtIGJsb2NrIHNpemUgKGluIHNhbXBsZXMpIHVzZWQgaW4gdGhlIHN0cmVhbS4gSXQgbXVzdCBiZSBsZXNzCisgKiB0aGFuIG9yIGVxdWFsIHRvIG1heF9ibGtfc2l6ZS4KKyAqLworCisJdTE2IG1heF9ibGtfc2l6ZTsKKy8qIE1heGltdW0gYmxvY2sgc2l6ZSAoaW4gc2FtcGxlcykgdXNlZCBpbiB0aGUgc3RyZWFtLiBJZiB0aGUKKyAqIG1pbmltdW0gYmxvY2sgc2l6ZSBlcXVhbHMgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSwgYSBmaXhlZCBibG9jaworICogc2l6ZSBzdHJlYW0gaXMgaW1wbGllZC4KKyAqLworCisJdTE2IG1kNV9zdW1bOF07CisvKiBNRDUgc2lnbmF0dXJlIGFycmF5IG9mIHRoZSB1bmVuY29kZWQgYXVkaW8gZGF0YS4gVGhpcyBhbGxvd3MgdGhlCisgKiBkZWNvZGVyIHRvIGRldGVybWluZSBpZiBhbiBlcnJvciBleGlzdHMgaW4gdGhlIGF1ZGlvIGRhdGEsIGV2ZW4gd2hlbgorICogdGhlIGVycm9yIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBpbnZhbGlkIGJpdHN0cmVhbS4KKyAqLworCisJdTMyIHNhbXBsZV9yYXRlOworLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDgwMDAgdG8gNDgwMDAgSHoKKyAqLworCisJdTMyIG1pbl9mcmFtZV9zaXplOworLyogTWluaW11bSBmcmFtZSBzaXplIHVzZWQgaW4gdGhlIHN0cmVhbS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtID4gMCBieXRlcworICogLSAwIC0tIFRoZSB2YWx1ZSBpcyB1bmtub3duCisgKi8KKworCXUzMiBtYXhfZnJhbWVfc2l6ZTsKKy8qIE1heGltdW0gZnJhbWUgc2l6ZSB1c2VkIGluIHRoZSBzdHJlYW0uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLS0gPiAwIGJ5dGVzCisgKiAtLSAwIC4gVGhlIHZhbHVlIGlzIHVua25vd24KKyAqLworCisJdTE2IHNhbXBsZV9zaXplOworLyogQml0cyBwZXIgc2FtcGxlLlN1cHBvcnRlZCB2YWx1ZXM6IDgsIDE2ICovCisKKwl1MTYgcmVzZXJ2ZWQ7CisvKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVybworICovCisKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fYWxhY19mbXRfYmxrX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdGJsazsKKworCXUzMiBmcmFtZV9sZW5ndGg7CisJdTggY29tcGF0aWJsZV92ZXJzaW9uOworCXU4IGJpdF9kZXB0aDsKKwl1OCBwYjsKKwl1OCBtYjsKKwl1OCBrYjsKKwl1OCBudW1fY2hhbm5lbHM7CisJdTE2IG1heF9ydW47CisJdTMyIG1heF9mcmFtZV9ieXRlczsKKwl1MzIgYXZnX2JpdF9yYXRlOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgY2hhbm5lbF9sYXlvdXRfdGFnOworCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2c3MTFfZGVjX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOworCXUzMiBzYW1wbGVfcmF0ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fYXBlX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOworCisJdTE2IGNvbXBhdGlibGVfdmVyc2lvbjsKKwl1MTYgY29tcHJlc3Npb25fbGV2ZWw7CisJdTMyIGZvcm1hdF9mbGFnczsKKwl1MzIgYmxvY2tzX3Blcl9mcmFtZTsKKwl1MzIgZmluYWxfZnJhbWVfYmxvY2tzOworCXUzMiB0b3RhbF9mcmFtZXM7CisJdTE2IGJpdHNfcGVyX3NhbXBsZTsKKwl1MTYgbnVtX2NoYW5uZWxzOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgc2Vla190YWJsZV9wcmVzZW50OworCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2RzZF9mbXRfYmxrX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdGJsazsKKworCXUxNiBudW1fdmVyc2lvbjsKKwl1MTYgaXNfYml0d2lzZV9iaWdfZW5kaWFuOworCXUxNiBkc2RfY2hhbm5lbF9ibG9ja19zaXplOworCXUxNiBudW1fY2hhbm5lbHM7CisJdTggIGNoYW5uZWxfbWFwcGluZ1s4XTsKKwl1MzIgZHNkX2RhdGFfcmF0ZTsKKworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTICAgICAgICAgICAgICAgICAgMHgwMDAxMEJFQgorCisvKiBFbnVtZXJhdGlvbiBmb3IgNC43NSBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01SNDc1ICAgICAgICAgICAgICAgIDAKKworLyogRW51bWVyYXRpb24gZm9yIDUuMTUga2JwcyBBTVItTkIgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV9NUjUxNSAgICAgICAgICAgICAgICAxCisKKy8qIEVudW1lcmF0aW9uIGZvciA1LjkwIGticHMgQU1SLU5CIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfTU1SNTkgICAgICAgICAgICAgICAgMgorCisvKiBFbnVtZXJhdGlvbiBmb3IgNi43MCBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01NUjY3ICAgICAgICAgICAgICAgIDMKKworLyogRW51bWVyYXRpb24gZm9yIDcuNDAga2JwcyBBTVItTkIgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV9NTVI3NCAgICAgICAgICAgICAgICA0CisKKy8qIEVudW1lcmF0aW9uIGZvciA3Ljk1IGticHMgQU1SLU5CIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfTU1SNzk1ICAgICAgICAgICAgICAgNQorCisvKiBFbnVtZXJhdGlvbiBmb3IgMTAuMjAga2JwcyBBTVItTkIgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV9NTVIxMDIgICAgICAgICAgICAgICA2CisKKy8qIEVudW1lcmF0aW9uIGZvciAxMi4yMCBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01NUjEyMiAgICAgICAgICAgICAgIDcKKworLyogRW51bWVyYXRpb24gZm9yIEFNUi1OQiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBtb2RlIG9mZi4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVudW1lcmF0aW9uIGZvciBBTVItTkIgRFRYIG1vZGUgVkFEMS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9WQUQxICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEVudW1lcmF0aW9uIGZvciBBTVItTkIgRFRYIG1vZGUgVkFEMi4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9WQUQyICAgICAgICAgICAgICAgICAgICAyCisKKy8qIEVudW1lcmF0aW9uIGZvciBBTVItTkIgRFRYIG1vZGUgYXV0by4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAzCisKK3N0cnVjdCBhc21fYW1ybmJfZW5jX2NmZyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7CisJc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7CisKKwl1MTYgICAgICAgICAgZW5jX21vZGU7CisvKiBBTVItTkIgZW5jb2RpbmcgcmF0ZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiBVc2UgdGhlIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfKgorICogbWFjcm9zCisgKi8KKworCXUxNiAgICAgICAgICBkdHhfbW9kZTsKKy8qIFNwZWNpZmllcyB3aGV0aGVyIERUWCBtb2RlIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9PRkYKKyAqIC0gI0FTTV9NRURJQV9GTVRfQU1STkJfRlNfRFRYX01PREVfVkFEMQorICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlMgICAgICAgICAgICAgICAgICAweDAwMDEwQkVDCisKKy8qIEVudW1lcmF0aW9uIGZvciA2LjYga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjY2ICAgICAgICAgICAgICAgICAwCisKKy8qIEVudW1lcmF0aW9uIGZvciA4Ljg1IGticHMgQU1SLVdCIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfTVI4ODUgICAgICAgICAgICAgICAgMQorCisvKiBFbnVtZXJhdGlvbiBmb3IgMTIuNjUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjEyNjUgICAgICAgICAgICAgICAyCisKKy8qIEVudW1lcmF0aW9uIGZvciAxNC4yNSBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SMTQyNSAgICAgICAgICAgICAgIDMKKworLyogRW51bWVyYXRpb24gZm9yIDE1Ljg1IGticHMgQU1SLVdCIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfTVIxNTg1ICAgICAgICAgICAgICAgNAorCisvKiBFbnVtZXJhdGlvbiBmb3IgMTguMjUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjE4MjUgICAgICAgICAgICAgICA1CisKKy8qIEVudW1lcmF0aW9uIGZvciAxOS44NSBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SMTk4NSAgICAgICAgICAgICAgIDYKKworLyogRW51bWVyYXRpb24gZm9yIDIzLjA1IGticHMgQU1SLVdCIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfTVIyMzA1ICAgICAgICAgICAgICAgNworCisvKiBFbnVtZXJhdGlvbiBmb3IgMjMuODUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjIzODUgICAgICAgICAgICAgICA4CisKK3N0cnVjdCBhc21fYW1yd2JfZW5jX2NmZyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7CisJc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7CisKKwl1MTYgICAgICAgICAgZW5jX21vZGU7CisvKiBBTVItV0IgZW5jb2RpbmcgcmF0ZS4KKyAqIFN1dXBwb3J0ZWQgdmFsdWVzOgorICogVXNlIHRoZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFXyoKKyAqIG1hY3JvcworICovCisKKwl1MTYgICAgICAgICAgZHR4X21vZGU7CisvKiBTcGVjaWZpZXMgd2hldGhlciBEVFggbW9kZSBpcyBkaXNhYmxlZCBvciBlbmFibGVkLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfQU1STkJfRlNfRFRYX01PREVfT0ZGCisgKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX1ZBRDEKKyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fTUVESUFfRk1UX1YxM0tfRlMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJFRAorCisvKiBFbnVtZXJhdGlvbiBmb3IgMTQuNCBrYnBzIFYxM0sgRW5jb2RpbmcgbW9kZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SMTQ0MCAgICAgICAgICAgICAgICAwCisKKy8qIEVudW1lcmF0aW9uIGZvciAxMi4yIGticHMgVjEzSyBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVIxMjIwICAgICAgICAgICAgICAgIDEKKworLyogRW51bWVyYXRpb24gZm9yIDExLjIga2JwcyBWMTNLIEVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjExMjAgICAgICAgICAgICAgICAgMgorCisvKiBFbnVtZXJhdGlvbiBmb3IgOS4wIGticHMgVjEzSyBFbmNvZGluZyBtb2RlLiAqLworI2RlZmluZSBBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVI5MCAgICAgICAgICAgICAgICAgIDMKKworLyogRW51bWVyYXRpb24gZm9yIDcuMiBrYnBzIFYxM0sgZUVuY29kaW5nIG1vZGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjcyMCAgICAgICAgICAgICAgICAgNAorCisvKiBFbnVtZXJhdGlvbiBmb3IgMS84IHZvY29kZXIgcmF0ZS4qLworI2RlZmluZSBBU01fTUVESUFfRk1UX1ZPQ19PTkVfRUlHSFRIX1JBVEUgICAgICAgICAgMQorCisvKiBFbnVtZXJhdGlvbiBmb3IgMS80IHZvY29kZXIgcmF0ZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9WT0NfT05FX0ZPVVJUSF9SQVRFICAgICAgIDIKKworLyogRW51bWVyYXRpb24gZm9yIDEvMiB2b2NvZGVyIHJhdGUuICovCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfVk9DX0hBTEZfUkFURSAgICAgICAgICAgICAzCisKKy8qIEVudW1lcmF0aW9uIGZvciBmdWxsIHZvY29kZXIgcmF0ZS4gKi8KKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9WT0NfRlVMTF9SQVRFICAgICAgICAgICAgIDQKKworc3RydWN0IGFzbV92MTNrX2VuY19jZmcgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOworCQl1MTYgICAgICAgICAgbWF4X3JhdGU7CisvKiBNYXhpbXVtIGFsbG93ZWQgZW5jb2RlciBmcmFtZSByYXRlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX09ORV9FSUdIVEhfUkFURQorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0ZPVVJUSF9SQVRFCisgKiAtICNBU01fTUVESUFfRk1UX1ZPQ19IQUxGX1JBVEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0ZVTExfUkFURQorICovCisKKwl1MTYgICAgICAgICAgbWluX3JhdGU7CisvKiBNaW5pbXVtIGFsbG93ZWQgZW5jb2RlciBmcmFtZSByYXRlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX09ORV9FSUdIVEhfUkFURQorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0ZPVVJUSF9SQVRFCisgKiAtICNBU01fTUVESUFfRk1UX1ZPQ19IQUxGX1JBVEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0ZVTExfUkFURQorICovCisKKwl1MTYgICAgICAgICAgcmVkdWNlZF9yYXRlX2NtZDsKKy8qIFJlZHVjZWQgcmF0ZSBjb21tYW5kLCB1c2VkIHRvIGNoYW5nZQorICogdGhlIGF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgVjEzSworICogdm9jb2Rlci4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVIxNDQwIChEZWZhdWx0KQorICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SMTIyMAorICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SMTEyMAorICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SOTAKKyAqIC0gI0FTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjcyMAorICovCisKKwl1MTYgICAgICAgICAgcmF0ZV9tb2RfY21kOworLyogUmF0ZSBtb2R1bGF0aW9uIGNvbW1hbmQuIERlZmF1bHQgPSAwLgorICotIElmIGJpdCAwPTEsIHJhdGUgY29udHJvbCBpcyBlbmFibGVkLgorICotIElmIGJpdCAxPTEsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmdWxsIHJhdGUKKyAqCQkJZnJhbWVzIGlzIGxpbWl0ZWQgd2l0aCBudW1iZXJzIHN1cHBsaWVkIGluCisgKgkJCWJpdHMgMiB0byAxMC4KKyAqLSBJZiBiaXQgMT0wLCB0aGUgbWluaW11bSBudW1iZXIgb2Ygbm9uLWZ1bGwgcmF0ZSBmcmFtZXMKKyAqCQkJaW4gYmV0d2VlbiB0d28gZnVsbCByYXRlIGZyYW1lcyBpcyBmb3JjZWQgdG8KKyAqIHRoZSBudW1iZXIgc3VwcGxpZWQgaW4gYml0cyAyIHRvIDEwLiBJbiBib3RoIGNhc2VzLCBpZiBuZWNlc3NhcnksCisgKiBoYWxmIHJhdGUgaXMgdXNlZCB0byBzdWJzdGl0dXRlIGZ1bGwgcmF0ZS4gLSBCaXRzIDE1IHRvIDEwIGFyZQorICogcmVzZXJ2ZWQgYW5kIG11c3QgYWxsIGJlIHNldCB0byB6ZXJvLgorICovCisKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9FVlJDX0ZTICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRUUKKworLyogIEVWUkMgZW5jb2RlciBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB1c2VkIGluIHRoZQorICogI0FTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjIgY29tbWFuZC4KKyAqLworc3RydWN0IGFzbV9ldnJjX2VuY19jZmcgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOworCXUxNiAgICAgICAgICBtYXhfcmF0ZTsKKy8qIE1heGltdW0gYWxsb3dlZCBlbmNvZGVyIGZyYW1lIHJhdGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0VJR0hUSF9SQVRFCisgKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRk9VUlRIX1JBVEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0hBTEZfUkFURQorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfRlVMTF9SQVRFCisgKi8KKworCXUxNiAgICAgICAgICBtaW5fcmF0ZTsKKy8qIE1pbmltdW0gYWxsb3dlZCBlbmNvZGVyIGZyYW1lIHJhdGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0VJR0hUSF9SQVRFCisgKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRk9VUlRIX1JBVEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0hBTEZfUkFURQorICogLSAjQVNNX01FRElBX0ZNVF9WT0NfRlVMTF9SQVRFCisgKi8KKworCXUxNiAgICAgICAgICByYXRlX21vZF9jbWQ7CisvKiBSYXRlIG1vZHVsYXRpb24gY29tbWFuZC4gRGVmYXVsdDogMC4KKyAqIC0gSWYgYml0IDA9MSwgcmF0ZSBjb250cm9sIGlzIGVuYWJsZWQuCisgKiAtIElmIGJpdCAxPTEsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmdWxsIHJhdGUgZnJhbWVzCisgKiBpcyBsaW1pdGVkIHdpdGggbnVtYmVycyBzdXBwbGllZCBpbiBiaXRzIDIgdG8gMTAuCisgKgorICogLSBJZiBiaXQgMT0wLCB0aGUgbWluaW11bSBudW1iZXIgb2Ygbm9uLWZ1bGwgcmF0ZSBmcmFtZXMgaW4KKyAqIGJldHdlZW4gdHdvIGZ1bGwgcmF0ZSBmcmFtZXMgaXMgZm9yY2VkIHRvIHRoZSBudW1iZXIgc3VwcGxpZWQgaW4KKyAqIGJpdHMgMiB0byAxMC4gSW4gYm90aCBjYXNlcywgaWYgbmVjZXNzYXJ5LCBoYWxmIHJhdGUgaXMgdXNlZCB0bworICogc3Vic3RpdHV0ZSBmdWxsIHJhdGUuCisgKgorICogLSBCaXRzIDE1IHRvIDEwIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBhbGwgYmUgc2V0IHRvIHplcm8uCisgKi8KKworCXUxNiAgICAgICAgICByZXNlcnZlZDsKKwkvKiBSZXNlcnZlZC4gQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfV01BX1YxMFBST19WMiAgICAgICAgICAgICAgICAweDAwMDEwREE3CisKK3N0cnVjdCBhc21fd21hcHJvdjEwX2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOworCisJdTE2ICAgICAgICAgIGZtdGFnOworLyogV01BIGZvcm1hdCB0eXBlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMHgxNjIgLS0gV01BIDkgUHJvCisgKiAtIDB4MTYzIC0tIFdNQSA5IFBybyBMb3NzbGVzcworICogLSAweDE2NiAtLSBXTUEgMTAgUHJvCisgKiAtIDB4MTY3IC0tIFdNQSAxMCBQcm8gTG9zc2xlc3MKKyAqLworCisJdTE2ICAgICAgICAgIG51bV9jaGFubmVsczsKKy8qIE51bWJlciBvZiBjaGFubmVscyBlbmNvZGVkIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDgKKyAqLworCisJdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOworLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCAoaW4gSGVydHopLgorICogU3VwcG9ydGVkIHZhbHVlczogMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwKKyAqIDg4MjAwLCA5NjAwMAorICovCisKKwl1MzIgICAgICAgICAgYXZnX2J5dGVzX3Blcl9zZWM7CisvKiBCaXRyYXRlIGV4cHJlc3NlZCBhcyB0aGUgYXZlcmFnZSBieXRlcyBwZXIgc2Vjb25kLgorICogU3VwcG9ydGVkIHZhbHVlczogMjAwMCB0byA5NjAwMAorICovCisKKwl1MTYgICAgICAgICAgYmxrX2FsaWduOworLyogU2l6ZSBvZiB0aGUgYml0c3RyZWFtIHBhY2tldCBzaXplIGluIGJ5dGVzLiBXTUEgUHJvIGZpbGVzCisgKiBoYXZlIGEgcGF5bG9hZCBvZiBvbmUgYmxvY2sgcGVyIGJpdHN0cmVhbSBwYWNrZXQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBAbGUgMTMzNzYKKyAqLworCisJdTE2ICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKKy8qIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgaW4gdGhlIGVuY29kZWQgV01BIHN0cmVhbS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNAorICovCisKKwl1MzIgICAgICAgICAgY2hhbm5lbF9tYXNrOworLyogQml0LXBhY2tlZCBkb3VibGUgd29yZCAoMzItYml0cykgdGhhdCBpbmRpY2F0ZXMgdGhlCisgKiByZWNvbW1lbmRlZCBzcGVha2VyIHBvc2l0aW9ucyBmb3IgZWFjaCBzb3VyY2UgY2hhbm5lbC4KKyAqLworCisJdTE2ICAgICAgICAgIGVuY19vcHRpb25zOworLyogQml0LXBhY2tlZCB3b3JkIHdpdGggdmFsdWVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBjZXJ0YWluCisgKiBmZWF0dXJlcyBvZiB0aGUgYml0c3RyZWFtIGFyZSB1c2VkLgorICogU3VwcG9ydGVkIHZhbHVlczogLSAweDAwMDEgLS0gRU5DT1BUM19QVVJFX0xPU1NMRVNTIC0gMHgwMDA2IC0tCisgKiBFTkNPUFQzX0ZSTV9TSVpFX01PRCAtIDB4MDAzOCAtLSBFTkNPUFQzX1NVQkZSTV9ESVYgLSAweDAwNDAgLS0KKyAqIEVOQ09QVDNfV1JJVEVfRlJBTUVTSVpFX0lOX0hEUiAtIDB4MDA4MCAtLQorICogRU5DT1BUM19HRU5FUkFURV9EUkNfUEFSQU1TIC0gMHgwMTAwIC0tIEVOQ09QVDNfUlRNQklUUworICovCisKKworCXUxNiAgICAgICAgICB1c0FkdmFuY2VkRW5jb2RlT3B0OworCS8qIEFkdmFuY2VkIGVuY29kaW5nIG9wdGlvbi4gICovCisKKwl1MzIgICAgICAgICAgYWR2YW5jZWRfZW5jX29wdGlvbnMyOworCS8qIEFkdmFuY2VkIGVuY29kaW5nIG9wdGlvbiAyLiAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfV01BX1Y5X1YyICAgICAgICAgICAgICAgICAgICAweDAwMDEwREE4CitzdHJ1Y3QgYXNtX3dtYXN0ZHY5X2ZtdF9ibGtfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOworCXUxNiAgICAgICAgICBmbXRhZzsKKy8qIFdNQSBmb3JtYXQgdGFnLgorICogU3VwcG9ydGVkIHZhbHVlczogMHgxNjEgKFdNQSA5IHN0YW5kYXJkKQorICovCisKKwl1MTYgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyogTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzdHJlYW0uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxLCAyCisgKi8KKworCXUzMiAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQgKGluIEhlcnR6KS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDQ4MDAwCisgKi8KKworCXUzMiAgICAgICAgICBhdmdfYnl0ZXNfcGVyX3NlYzsKKwkvKiBCaXRyYXRlIGV4cHJlc3NlZCBhcyB0aGUgYXZlcmFnZSBieXRlcyBwZXIgc2Vjb25kLiAqLworCisJdTE2ICAgICAgICAgIGJsa19hbGlnbjsKKy8qIEJsb2NrIGFsaWduLiBBbGwgV01BIGZpbGVzIHdpdGggYSBtYXhpbXVtIHBhY2tldCBzaXplIG9mCisgKiAxMzM3NiBhcmUgc3VwcG9ydGVkLgorICovCisKKworCXUxNiAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7CisvKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIGluIHRoZSBvdXRwdXQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNgorICovCisKKwl1MzIgICAgICAgICAgY2hhbm5lbF9tYXNrOworLyogQ2hhbm5lbCBtYXNrLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMyAtLSBTdGVyZW8gKGZyb250IGxlZnQvZnJvbnQgcmlnaHQpCisgKiAtIDQgLS0gTW9ubyAoY2VudGVyKQorICovCisKKwl1MTYgICAgICAgICAgZW5jX29wdGlvbnM7CisJLyogT3B0aW9ucyB1c2VkIGR1cmluZyBlbmNvZGluZy4gKi8KKworCXUxNiAgICAgICAgICByZXNlcnZlZDsKKworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fTUVESUFfRk1UX1dNQV9WOCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEQ5MQorCitzdHJ1Y3QgYXNtX3dtYXN0ZHY4X2VuY19jZmcgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOworCXUzMiAgICAgICAgICBiaXRfcmF0ZTsKKwkvKiBFbmNvZGluZyByYXRlIGluIGJpdHMgcGVyIHNlY29uZC4gKi8KKworCXUzMiAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCisgKgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMCAtLSBOYXRpdmUgbW9kZQorICogLSBPdGhlciBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAyMjA1MCwgMzIwMDAsIDQ0MTAwLCBhbmQgNDgwMDAuCisgKgorICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUKKyAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgorICogVGhlIHNhbXBsaW5nIHJhdGUgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KKyAqLworCisJdTE2ICAgICAgICAgIGNoYW5uZWxfY2ZnOworLyogTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGVuY29kZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gTmF0aXZlIG1vZGUKKyAqIC0gMSAtLSBNb25vCisgKiAtIDIgLS0gU3RlcmVvCisgKiAtIE90aGVyIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQorICogbnVtYmVyIG9mIGNoYW5uZWxzIGF0IHRoZSBpbnB1dC4KKyAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KKyAqLworCisJdTE2ICAgICAgICAgIHJlc2VydmVkOworCS8qIFJlc2VydmVkLiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLworCX0gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJfV0JfUExVU19WMiAgICAgICAgICAgICAgIDB4MDAwMTBEQTkKKworc3RydWN0IGFzbV9hbXJ3YnBsdXNfZm10X2Jsa192MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7CisJdTMyICAgICAgICAgIGFtcl9mcmFtZV9mbXQ7CisvKiBBTVIgZnJhbWUgZm9ybWF0LgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gNiAtLSBUcmFuc3BvcnQgSW50ZXJmYWNlIEZvcm1hdCAoVElGKQorICogLSBBbnkgb3RoZXIgdmFsdWUgLS0gRmlsZSBzdG9yYWdlIGZvcm1hdCAoRlNGKQorICoKKyAqIFRJRiBzdHJlYW0gY29udGFpbnMgMi1ieXRlIGhlYWRlciBmb3IgZWFjaCBmcmFtZSB3aXRoaW4gdGhlCisgKiBzdXBlcmZyYW1lLiBGU0Ygc3RyZWFtIGNvbnRhaW5zIG9uZSAyLWJ5dGUgaGVhZGVyIHBlciBzdXBlcmZyYW1lLgorICovCisKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQzMJCQkweDAwMDEwREVFCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfRUFDMwkJCTB4MDAwMTBERUYKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9EVFMgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEODgKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9NUDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBERTkKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9GTEFDICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDMTYKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTEFDICAgICAgICAgICAgICAgICAgIDB4MDAwMTJGMzEKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9WT1JCSVMgICAgICAgICAgICAgICAgIDB4MDAwMTBDMTUKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9BUEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMTJGMzIKKyNkZWZpbmUgQVNNX01FRElBX0ZNVF9EU0QgICAgICAgICAgICAgICAgICAgIDB4MDAwMTJGM0UKKworCisvKiBNZWRpYSBmb3JtYXQgSUQgZm9yIGFkYXB0aXZlIHRyYW5zZm9ybSBhY291c3RpYyBjb2RpbmcuIFRoaXMKKyAqIElEIGlzIHVzZWQgYnkgdGhlICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQgY29tbWFuZAorICogb25seS4KKyAqLworCisjZGVmaW5lIEFTTV9NRURJQV9GTVRfQVRSQUMgICAgICAgICAgICAgICAgICAweDAwMDEwRDg5CisKKy8qIE1lZGlhIGZvcm1hdCBJRCBmb3IgbWV0YWRhdGEtZW5oYW5jZWQgYXVkaW8gdHJhbnNtaXNzaW9uLgorICogVGhpcyBJRCBpcyB1c2VkIGJ5IHRoZSAjQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VECisgKiBjb21tYW5kIG9ubHkuCisgKi8KKworI2RlZmluZSBBU01fTUVESUFfRk1UX01BVCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEQ4QQorCisvKiAgYWRzcF9tZWRpYV9mbXQuaCAqLworCisjZGVmaW5lIEFTTV9EQVRBX0NNRF9XUklURV9WMiAweDAwMDEwREFCCisKK3N0cnVjdCBhc21fZGF0YV9jbWRfd3JpdGVfdjIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisvKiBUaGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuCisgKiA2NCBiaXQgYWRkcmVzcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcworICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9tc3c7CisvKiBUaGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuCisgKiA2NCBiaXQgYWRkcmVzcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcy4KKyAqIC1BZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkZWNvZGVkLgorICogVGhlIGJ1ZmZlciBzaG91bGQgYmUgYWxpZ25lZCB0byBhIDMyIGJ5dGUgYm91bmRhcnkuCisgKiAtSW4gdGhlIGNhc2Ugb2YgMzIgYml0IFNoYXJlZCBtZW1vcnkgYWRkcmVzcywgbXN3IGZpZWxkIG11c3QKKyAqIC1iZSBzZXQgdG8gemVyby4KKyAqIC1JbiB0aGUgY2FzZSBvZiAzNiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQgMzEgdG8gYml0IDQKKyAqIC1vZiBtc3cgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAqLworCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgRFNQIHRocm91Z2gKKyAqIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kCisgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBidWZfc2l6ZTsKKy8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciBmb3IgZGVjb2RpbmcuIFRoZQorICogZmlyc3QgYnl0ZSBzdGFydHMgYXQgYnVmX2FkZHIuCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIHNlcV9pZDsKKwkvKiBPcHRpb25hbCBidWZmZXIgc2VxdWVuY2UgSUQuICovCisKKwl1MzIgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbHN3OworLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCisgKiBmaXJzdCBidWZmZXIgc2FtcGxlLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbXN3OworLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCisgKiBmaXJzdCBidWZmZXIgc2FtcGxlLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBmbGFnczsKKy8qIEJpdGZpZWxkIG9mIGZsYWdzLgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDMxOgorICogLSAxIC0tIFZhbGlkIHRpbWVzdGFtcC4KKyAqIC0gMCAtLSBJbnZhbGlkIHRpbWVzdGFtcC4KKyAqIC0gVXNlICNBU01fQklUX01BU0tJTUVTVEFNUF9WQUxJRF9GTEFHIGFzIHRoZSBiaXRtYXNrIGFuZAorICogI0FTTV9TSElGVElNRVNUQU1QX1ZBTElEX0ZMQUcgYXMgdGhlIHNoaWZ0IHZhbHVlIHRvIHNldCB0aGlzIGJpdC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMDoKKyAqIC0gMSAtLSBMYXN0IGJ1ZmZlci4KKyAqIC0gMCAtLSBOb3QgdGhlIGxhc3QgYnVmZmVyLgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAyOToKKyAqIC0gMSAtLSBDb250aW51ZSB0aGUgdGltZXN0YW1wIGZyb20gdGhlIHByZXZpb3VzIGJ1ZmZlci4KKyAqIC0gMCAtLSBUaW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIG5vdCByZWxhdGVkCisgKiB0byB0aGUgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBidWZmZXIuCisgKiAtIFVzZSAjQVNNX0JJVF9NQVNLU19DT05USU5VRV9GTEFHIGFuZCAjQVNNX1NISUZUU19DT05USU5VRV9GTEFHCisgKiB0byBzZXQgdGhpcyBiaXQuCisgKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDQ6CisgKiAtIDEgLS0gRW5kIG9mIHRoZSBmcmFtZS4KKyAqIC0gMCAtLSBOb3QgdGhlIGVuZCBvZiBmcmFtZSwgb3IgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3Qga25vd24uCisgKiAtIFVzZSAjQVNNX0JJVF9NQVNLX0VPRl9GTEFHIGFzIHRoZSBiaXRtYXNrIGFuZCAjQVNNX1NISUZUX0VPRl9GTEFHCisgKiBhcyB0aGUgc2hpZnQgdmFsdWUgdG8gc2V0IHRoaXMgYml0LgorICoKKyAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBiZSBzZXQgdG8gMC4KKyAqCisgKiBJZiBiaXQgMzE9MCBhbmQgYml0IDI5PTE6IFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbgorICogdGhpcyBidWZmZXIgY29udGludWVzIGZyb20gdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzYW1wbGUgaW4KKyAqIHRoZSBwcmV2aW91cyBidWZmZXIuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJ1ZmZlciAoaS5lLiwgdGhpcworICogaXMgdGhlIGZpcnN0IGJ1ZmZlciBzZW50IGFmdGVyIG9wZW5pbmcgdGhlIHN0cmVhbSBvciBhZnRlciBhCisgKiBmbHVzaCBvcGVyYXRpb24pLCBvciBpZiB0aGUgcHJldmlvdXMgYnVmZmVyIGRvZXMgbm90IGhhdmUgYSB2YWxpZAorICogdGltZXN0YW1wLCB0aGUgc2FtcGxlcyBpbiB0aGUgY3VycmVudCBidWZmZXIgYWxzbyBkbyBub3QgaGF2ZSBhCisgKiB2YWxpZCB0aW1lc3RhbXAuIFRoZXkgYXJlIHBsYXllZCBvdXQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAqCisgKgorICogSWYgYml0IDMxPTAgYW5kIGJpdCAyOT0wOiBObyB0aW1lc3RhbXAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogZmlyc3Qgc2FtcGxlIGluIHRoaXMgYnVmZmVyLiBUaGUgc2FtcGxlcyBhcmUgcGxheWVkIG91dCBhcyBzb29uCisgKiBhcyBwb3NzaWJsZS4KKyAqCisgKgorICogSWYgYml0IDMxPTEgYW5kIGJpdCAyOSBpcyBpZ25vcmVkOiBUaGUgdGltZXN0YW1wIHNwZWNpZmllZCBpbgorICogdGhpcyBwYXlsb2FkIGlzIGhvbm9yZWQuCisgKgorICoKKyAqIElmIGJpdCAzMD0wOiBOb3QgdGhlIGxhc3QgYnVmZmVyIGluIHRoZSBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsCisgKiBpbiByZW1vdmluZyB0cmFpbGluZyBzYW1wbGVzLgorICoKKyAqCisgKiBGb3IgYml0IDQ6IFRoZSBjbGllbnQgY2FuIHNldCB0aGlzIGZsYWcgZm9yIGV2ZXJ5IGJ1ZmZlciBzZW50IGluCisgKiB3aGljaCB0aGUgbGFzdCBieXRlIGlzIHRoZSBlbmQgb2YgYSBmcmFtZS4gSWYgdGhpcyBmbGFnIGlzIHNldCwKKyAqIHRoZSBidWZmZXIgY2FuIGNvbnRhaW4gZGF0YSBmcm9tIG11bHRpcGxlIGZyYW1lcywgYnV0IGl0IHNob3VsZAorICogYWx3YXlzIGVuZCBhdCBhIGZyYW1lIGJvdW5kYXJ5LiBSZXN0cmljdGlvbnMgYWxsb3cgdGhlIGFEU1AgdG8KKyAqIGRldGVjdCBhbiBlbmQgb2YgZnJhbWUgd2l0aG91dCByZXF1aXJpbmcgYWRkaXRpb25hbCBwcm9jZXNzaW5nLgorICovCisKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX0RBVEFfQ01EX1JFQURfVjIgMHgwMDAxMERBQworCitzdHJ1Y3QgYXNtX2RhdGFfY21kX3JlYWRfdjIgeworCXN0cnVjdCBhcHJfaGRyICAgICAgIGhkcjsKKwl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisvKiB0aGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCBtYXBwZWQgYWRkcmVzcworICogYW5kIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzCisgKi8KKworCisJdTMyICAgICAgICAgICAgICAgICAgYnVmX2FkZHJfbXN3OworLyogdGhlIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgc2hvdWxkIGJlIGEgdmFsaWQgbWFwcGVkIGFkZHJlc3MKKyAqIGFuZCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcy4KKyAqIC0gQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHdoZXJlIHRoZSBEU1AgcHV0cyB0aGUgZW5jb2RlZCBkYXRhLAorICogcG90ZW50aWFsbHksIGF0IGFuIG9mZnNldCBzcGVjaWZpZWQgYnkgdGhlIHVPZmZzZXQgZmllbGQgaW4KKyAqIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSBzdHJ1Y3R1cmUuIFRoZSBidWZmZXIgc2hvdWxkIGJlIGFsaWduZWQKKyAqIHRvIGEgMzIgYnl0ZSBib3VuZGFyeS4KKyAqIC0gSW4gdGhlIGNhc2Ugb2YgMzIgYml0IFNoYXJlZCBtZW1vcnkgYWRkcmVzcywgbXN3IGZpZWxkIG11c3QKKyAqIC0gYmUgc2V0IHRvIHplcm8uCisgKiAtIEluIHRoZSBjYXNlIG9mIDM2IGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIGJpdCAzMSB0byBiaXQKKyAqIC0gNCBvZiBtc3cgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAqLworCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgRFNQIHRocm91Z2gKKyAqIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBidWZfc2l6ZTsKKy8qIE51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHRoZSBhRFNQIHRvIHdyaXRlLiBUaGUgYURTUAorICogc3RhcnRzIHdyaXRpbmcgZnJvbSBidWZfYWRkci4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgc2VxX2lkOworCS8qIE9wdGlvbmFsIGJ1ZmZlciBzZXF1ZW5jZSBJRC4gKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX0RBVEFfQ01EX0VPUyAgICAgICAgICAgICAgIDB4MDAwMTBCREIKKyNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TICAgIDB4MDAwMTBDMUMKKyNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfRU9TICAgICAgICAgICAgIDB4MDAwMTBCREQKKworI2RlZmluZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyIDB4MDAwMTBEOTkKK3N0cnVjdCBhc21fZGF0YV9ldmVudF93cml0ZV9kb25lX3YyIHsKKwl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7CisJLyogbHN3IG9mIHRoZSA2NCBiaXQgYWRkcmVzcyAqLworCXUzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKKwkvKiBtc3cgb2YgdGhlIDY0IGJpdCBhZGRyZXNzLiBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBjbGllbnQgaW4KKwkgKiBBU01fREFUQV9DTURfV1JJVEVfVjIgY29tbWFuZC4KKwkgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKwkvKiBtZW1vcnkgbWFwIGhhbmRsZSBpbiB0aGUgQVNNX0RBVEFfQ01EX1dSSVRFX1YyICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7CisvKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUKKyAqIHJlZmVyZW5jZWQgYnVmZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25zdW1lZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IFJlZmVyIHRvIEB4aHlwZXJyZWZ7UTMsW1EzXX0KKyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjIgMHgwMDAxMEQ5QQorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBmcmFtZSBtZXRhZGF0YSBmbGFnIGJpdG1hc2suKi8KKyNkZWZpbmUgQVNNX0JJVF9NQVNLX0ZSQU1FX01FVEFEQVRBX0ZMQUcgKDB4NDAwMDAwMDBVTCkKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgZnJhbWUgbWV0YWRhdGEgZmxhZyBzaGlmdCB2YWx1ZS4gKi8KKyNkZWZpbmUgQVNNX1NISUZUX0ZSQU1FX01FVEFEQVRBX0ZMQUcgMzAKKworc3RydWN0IGFzbV9kYXRhX2V2ZW50X3JlYWRfZG9uZV92MiB7CisJdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOworLyogU3RhdHVzIG1lc3NhZ2UgKGVycm9yIGNvZGUpLgorICogU3VwcG9ydGVkIHZhbHVlczogUmVmZXIgdG8gQHhoeXBlcnJlZntRMyxbUTNdfQorICovCisKK3UzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX2xzdzsKKy8qIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgaXMgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuIDY0IGJpdAorICogYWRkcmVzcyBpcyBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzLgorICovCisKK3UzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKKy8qIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgaXMgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuIDY0IGJpdAorICogYWRkcmVzcyBpcyBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzLgorICoKKyAqIC1TYW1lIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiBBU01fREFUQV9DTURfUkVBRF9WMgorICogLUluIHRoZSBjYXNlIG9mIDMyIGJpdCBTaGFyZWQgbWVtb3J5IGFkZHJlc3MsIG1zdyBmaWVsZCBpcyBzZXQgdG8KKyAqIHplcm8uCisgKiAtSW4gdGhlIGNhc2Ugb2YgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0IDMxIHRvIGJpdCA0CisgKiAtb2YgbXN3IGlzIHNldCB0byB6ZXJvLgorICovCisKK3UzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworLyogbWVtb3J5IG1hcCBoYW5kbGUgaW4gdGhlIEFTTV9EQVRBX0NNRF9SRUFEX1YyICAqLworCit1MzIgICAgICAgICAgICAgICAgICBlbmNfZnJhbWVzb3RhbF9zaXplOworLyogVG90YWwgc2l6ZSBvZiB0aGUgZW5jb2RlZCBmcmFtZXMgaW4gYnl0ZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiA+MAorICovCisKK3UzMiAgICAgICAgICAgICAgICAgIG9mZnNldDsKKy8qIE9mZnNldCAoZnJvbSBidWZfYWRkcikgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpcnN0IGVuY29kZWQKKyAqIGZyYW1lLiBBbGwgZW5jb2RlZCBmcmFtZXMgYXJlIGNvbnNlY3V0aXZlLCBzdGFydGluZyBmcm9tIHRoaXMKKyAqIG9mZnNldC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAorICovCisKK3UzMiAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9sc3c7CisvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgc2Vzc2lvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcyBvZgorICogdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgYnVmZmVyLiBJZiBCaXQgNSBvZiBtb2RlX2ZsYWdzIGZsYWcgb2YKKyAqIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9WMiBpcyAxIHRoZW4gdGhlIDY0IGJpdCB0aW1lc3RhbXAgaXMKKyAqIGFic29sdXRlIGNhcHR1cmUgdGltZSBvdGhlcndpc2UgaXQgaXMgcmVsYXRpdmUgc2Vzc2lvbiB0aW1lLiBUaGUKKyAqIGFic29sdXRlIHRpbWVzdGFtcCBkb2Vzbid0IHJlc2V0IHVubGVzcyB0aGUgc3lzdGVtIGlzIHJlc2V0LgorICovCisKKwordTMyICAgICAgICAgICAgICAgICAgdGltZXN0YW1wX21zdzsKKy8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzIG9mCisgKiB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoZSBidWZmZXIuCisgKi8KKworCit1MzIgICAgICAgICAgICAgICAgICBmbGFnczsKKy8qIEJpdGZpZWxkIG9mIGZsYWdzLiBCaXQgMzAgaW5kaWNhdGVzIHdoZXRoZXIgZnJhbWUgbWV0YWRhdGEgaXMKKyAqIHByZXNlbnQuIElmIGZyYW1lIG1ldGFkYXRhIGlzIHByZXNlbnQsIG51bV9mcmFtZXMgY29uc2VjdXRpdmUKKyAqIGluc3RhbmNlcyBvZiBAeGh5cGVycmVme2hkcjpGcmFtZU1ldGFEYXRhLEZyYW1lIG1ldGFkYXRhfSBzdGFydAorICogYXQgdGhlIGJ1ZmZlciBhZGRyZXNzLgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDMxOgorICogLSAxIC0tIFRpbWVzdGFtcCBpcyB2YWxpZC4KKyAqIC0gMCAtLSBUaW1lc3RhbXAgaXMgaW52YWxpZC4KKyAqIC0gVXNlICNBU01fQklUX01BU0tJTUVTVEFNUF9WQUxJRF9GTEFHIGFuZAorICogI0FTTV9TSElGVElNRVNUQU1QX1ZBTElEX0ZMQUcgdG8gc2V0IHRoaXMgYml0LgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMDoKKyAqIC0gMSAtLSBGcmFtZSBtZXRhZGF0YSBpcyBwcmVzZW50LgorICogLSAwIC0tIEZyYW1lIG1ldGFkYXRhIGlzIGFic2VudC4KKyAqIC0gVXNlICNBU01fQklUX01BU0tfRlJBTUVfTUVUQURBVEFfRkxBRyBhbmQKKyAqICNBU01fU0hJRlRfRlJBTUVfTUVUQURBVEFfRkxBRyB0byBzZXQgdGhpcyBiaXQuCisgKgorICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyB0aGUgYURTUCBzZXRzIHRoZW0gdG8gMC4KKyAqLworCit1MzIgICAgICAgICAgICAgICAgICBudW1fZnJhbWVzOworLyogTnVtYmVyIG9mIGVuY29kZWQgZnJhbWVzIGluIHRoZSBidWZmZXIuICovCisKK3UzMiAgICAgICAgICAgICAgICAgIHNlcV9pZDsKKy8qIE9wdGlvbmFsIGJ1ZmZlciBzZXF1ZW5jZSBJRC4JKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fZGF0YV9yZWFkX2J1Zl9tZXRhZGF0YV92MiB7CisJdTMyICAgICAgICAgIG9mZnNldDsKKy8qIE9mZnNldCBmcm9tIGJ1Zl9hZGRyIGluICNBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfUEFZTE9BRCB0bworICogdGhlIGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1ldGFkYXRhLgorICogU3VwcG9ydGVkIHZhbHVlczogPiAwCisgKi8KKwordTMyICAgICAgICAgIGZybV9zaXplOworLyogU2l6ZSBvZiB0aGUgZW5jb2RlZCBmcmFtZSBpbiBieXRlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAorICovCisKK3UzMiAgICAgICAgICBudW1fZW5jb2RlZF9wY21fc2FtcGxlczsKKy8qIE51bWJlciBvZiBlbmNvZGVkIFBDTSBzYW1wbGVzIChwZXIgY2hhbm5lbCkgaW4gdGhlIGZyYW1lCisgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXRhZGF0YS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAorICovCisKK3UzMiAgICAgICAgICB0aW1lc3RhbXBfbHN3OworLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCisgKiBmaXJzdCBzYW1wbGUgZm9yIHRoaXMgZnJhbWUuCisgKiBJZiBCaXQgNSBvZiBtb2RlX2ZsYWdzIGZsYWcgb2YgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEX1YyIGlzIDEKKyAqIHRoZW4gdGhlIDY0IGJpdCB0aW1lc3RhbXAgaXMgYWJzb2x1dGUgY2FwdHVyZSB0aW1lIG90aGVyd2lzZSBpdAorICogaXMgcmVsYXRpdmUgc2Vzc2lvbiB0aW1lLiBUaGUgYWJzb2x1dGUgdGltZXN0YW1wIGRvZXNuJ3QgcmVzZXQKKyAqIHVubGVzcyB0aGUgc3lzdGVtIGlzIHJlc2V0LgorICovCisKKwordTMyICAgICAgICAgIHRpbWVzdGFtcF9tc3c7CisvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgc2Vzc2lvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcyBvZiB0aGUKKyAqIGZpcnN0IHNhbXBsZSBmb3IgdGhpcyBmcmFtZS4KKyAqLworCit1MzIgICAgICAgICAgZmxhZ3M7CisvKiBGcmFtZSBmbGFncy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMToKKyAqIC0gMSAtLSBUaW1lIHN0YW1wIGlzIHZhbGlkCisgKiAtIDAgLS0gVGltZSBzdGFtcCBpcyBub3QgdmFsaWQKKyAqIC0gQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyB0aGUgYURTUCBzZXRzIHRoZW0gdG8gMC4KKyAqLworfSBfX3BhY2tlZDsKKworLyogTm90aWZpZXMgdGhlIGNsaWVudCBvZiBhIGNoYW5nZSBpbiB0aGUgZGF0YSBzYW1wbGluZyByYXRlIG9yCisgKiBDaGFubmVsIG1vZGUuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGJ5IHRoZSBkZWNvZGVyIHNlcnZpY2UuIFRoZQorICogZXZlbnQgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBtb2RlIGZsYWdzIG9mCisgKiAjQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMiBvcgorICogI0FTTV9TVFJFQU1fQ01EX09QRU5fUkVBRFdSSVRFX1YyLiAtIFRoZSBkZWNvZGVyIGRldGVjdHMgYSBjaGFuZ2UKKyAqIGluIHRoZSBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBudW1iZXIvcG9zaXRpb25pbmcgb2YKKyAqIG91dHB1dCBjaGFubmVscywgb3IgaWYgaXQgaXMgdGhlIGZpcnN0IGZyYW1lIGRlY29kZWQuVGhlIG5ldworICogc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBuZXcgY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzCisgKiBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IGFzeW5jaHJvbm91c2x5LgorICovCisKKyNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSAweDAwMDEwQzY1CisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSBldmVudC4KKyAqIFRoaXMgZXZlbnQgaXMgcmFpc2VkIHdoZW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBib3RoIHRydWU6CisgKiAtIFRoZSBldmVudCBpcyBlbmFibGVkIHRocm91Z2ggdGhlIG1vZGVfZmxhZ3Mgb2YKKyAqICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX1YyIG9yCisgKiAjQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEVfVjIuIC0gVGhlIGRlY29kZXIgZGV0ZWN0cyBhIGNoYW5nZQorICogaW4gZWl0aGVyIHRoZSBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBudW1iZXIvcG9zaXRpb25pbmcKKyAqIG9mIG91dHB1dCBjaGFubmVscywgb3IgaWYgaXQgaXMgdGhlIGZpcnN0IGZyYW1lIGRlY29kZWQuCisgKiBUaGlzIGV2ZW50IGlzIG5vdCByYWlzZWQgKGV2ZW4gaWYgZW5hYmxlZCkgaWYgdGhlIGRlY29kZXIgaXMKKyAqIE1JREksIGJlY2F1c2UKKyAqLworCisKK3N0cnVjdCBhc21fZGF0YV9ldmVudF9zcl9jbV9jaGFuZ2Vfbm90aWZ5IHsKKwl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKKy8qIE5ldyBzYW1wbGluZyByYXRlIChpbiBIZXJ0eikgYWZ0ZXIgZGV0ZWN0aW5nIGEgY2hhbmdlIGluIHRoZQorICogYml0c3RyZWFtLgorICogU3VwcG9ydGVkIHZhbHVlczogMjAwMCB0byA0ODAwMAorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7CisvKiBOZXcgbnVtYmVyIG9mIGNoYW5uZWxzIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUKKyAqIGJpdHN0cmVhbS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAorICovCisKKworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIDAuKi8KKworCXU4ICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKKworfSBfX3BhY2tlZDsKKworLyogTm90aWZpZXMgdGhlIGNsaWVudCBvZiBhIGRhdGEgc2FtcGxpbmcgcmF0ZSBvciBjaGFubmVsIG1vZGUKKyAqIGNoYW5nZS4gVGhpcyBldmVudCBpcyByYWlzZWQgYnkgdGhlIGVuY29kZXIgc2VydmljZS4KKyAqIFRoaXMgZXZlbnQgaXMgcmFpc2VkIHdoZW4gOgorICogLSBOYXRpdmUgbW9kZSBlbmNvZGluZyB3YXMgcmVxdWVzdGVkIGluIHRoZSBlbmNvZGVyCisgKiBjb25maWd1cmF0aW9uIChpLmUuLCB0aGUgY2hhbm5lbCBudW1iZXIgd2FzIDApLCB0aGUgc2FtcGxlIHJhdGUKKyAqIHdhcyAwLCBvciBib3RoIHdlcmUgMC4KKyAqCisgKiAtIFRoZSBpbnB1dCBkYXRhIGZyYW1lIGF0IHRoZSBlbmNvZGVyIGlzIHRoZSBmaXJzdCBvbmUsIG9yIHRoZQorICogc2FtcGxpbmcgcmF0ZS9jaGFubmVsIG1vZGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIGlucHV0CisgKiBkYXRhIGZyYW1lLgorICoKKyAqLworI2RlZmluZSBBU01fREFUQV9FVkVOVF9FTkNfU1JfQ01fQ0hBTkdFX05PVElGWSAweDAwMDEwQkRFCisKK3N0cnVjdCBhc21fZGF0YV9ldmVudF9lbmNfc3JfY21fY2hhbmdlX25vdGlmeSB7CisJdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisvKiBOZXcgc2FtcGxpbmcgcmF0ZSAoaW4gSGVydHopIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUKKyAqIGlucHV0IGRhdGEuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDQ4MDAwCisgKi8KKworCisJdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyogTmV3IG51bWJlciBvZiBjaGFubmVscyBhZnRlciBkZXRlY3RpbmcgYSBjaGFuZ2UgaW4gdGhlIGlucHV0CisgKiBkYXRhLiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDgKKyAqLworCisKKwl1MTYgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7CisvKiBOZXcgYml0cyBwZXIgc2FtcGxlIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUgaW5wdXQKKyAqIGRhdGEuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKyAqLworCisKKwl1OCAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbOF07CisKK30gX19wYWNrZWQ7CisjZGVmaW5lIEFTTV9EQVRBX0NNRF9JRUNfNjA5NThfRlJBTUVfUkFURSAweDAwMDEwRDg3CisKKworLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9EQVRBX0NNRF9JRUNfNjA5NThfRlJBTUVfUkFURSBjb21tYW5kLAorICogd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgSUVDIDYwOTU4IGZyYW1lIHJhdGUgb2YgYSBnaXZlbgorICogcGFja2V0aXplZCBhdWRpbyBzdHJlYW0uCisgKi8KKworc3RydWN0IGFzbV9kYXRhX2NtZF9pZWNfNjA5NThfZnJhbWVfcmF0ZSB7CisJdTMyICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZTsKKy8qIElFQyA2MDk1OCBmcmFtZSByYXRlIG9mIHRoZSBpbmNvbWluZyBJRUMgNjE5MzcgcGFja2V0aXplZCBzdHJlYW0uCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkgdmFsaWQgZnJhbWUgcmF0ZQorICovCit9IF9fcGFja2VkOworCisvKiBhZHNwX2FzbV9kYXRhX2NvbW1hbmRzLmgqLworLyogRGVmaW5pdGlvbiBvZiB0aGUgc3RyZWFtIElEIGJpdG1hc2suKi8KKyNkZWZpbmUgQVNNX0JJVF9NQVNLX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwRkZVTCkKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgc3RyZWFtIElEIHNoaWZ0IHZhbHVlLiovCisjZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fSUQgICAgICAgICAgICAgICAgICAgIDAKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgc2Vzc2lvbiBJRCBiaXRtYXNrLiovCisjZGVmaW5lIEFTTV9CSVRfTUFTS19TRVNTSU9OX0lEICAgICAgICAgICAgICAgICgweDAwMDBGRjAwVUwpCisKKy8qIERlZmluaXRpb24gb2YgdGhlIHNlc3Npb24gSUQgc2hpZnQgdmFsdWUuKi8KKyNkZWZpbmUgQVNNX1NISUZUX1NFU1NJT05fSUQgICAgICAgICAgICAgICAgICAgOAorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBzZXJ2aWNlIElEIGJpdG1hc2suKi8KKyNkZWZpbmUgQVNNX0JJVF9NQVNLX1NFUlZJQ0VfSUQgICAgICAgICAgICAgICAgKDB4MDBGRjAwMDBVTCkKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgc2VydmljZSBJRCBzaGlmdCB2YWx1ZS4qLworI2RlZmluZSBBU01fU0hJRlRfU0VSVklDRV9JRCAgICAgICAgICAgICAgICAgICAxNgorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBkb21haW4gSUQgYml0bWFzay4qLworI2RlZmluZSBBU01fQklUX01BU0tfRE9NQUlOX0lEICAgICAgICAgICAgICAgICgweEZGMDAwMDAwVUwpCisKKy8qIERlZmluaXRpb24gb2YgdGhlIGRvbWFpbiBJRCBzaGlmdCB2YWx1ZS4qLworI2RlZmluZSBBU01fU0hJRlRfRE9NQUlOX0lEICAgICAgICAgICAgICAgICAgICAyNAorCisjZGVmaW5lIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAgICAgICAgICAgICAgIDB4MDAwMTBEOTIKKyNkZWZpbmUgQVNNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TICAgICAweDAwMDEwRDkzCisjZGVmaW5lIEFTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TICAgICAgICAgICAgICAweDAwMDEwRDk0CisKKy8qIGFkc3BfYXNtX3NlcnZpY2VfY29tbWFuZHMuaCAqLworCisjZGVmaW5lIEFTTV9NQVhfU0VTU0lPTl9JRCAgKDE1KQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucy4qLworI2RlZmluZSBBU01fTUFYX05VTV9TRVNTSU9OUyAgICAgICAgICAgICAgICBBU01fTUFYX1NFU1NJT05fSUQKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyBwZXIgc2Vzc2lvbi4qLworI2RlZmluZSBBU01fTUFYX1NUUkVBTVNfUEVSX1NFU1NJT04gKDgpCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjIgICAgICAgICAgICAgICAgICAgMHgwMDAxMERBQQorI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9JTU1FRElBVEUgIDAKKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVElNRV9SVU5fQVRfQUJTT0xVVEVJTUUgMQorI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9SRUxBVElWRUlNRSAyCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SVU5fU1RBUlRJTUVfUlVOX1dJVEhfREVMQVkgICAgIDMKKworI2RlZmluZSBBU01fQklUX01BU0tfUlVOX1NUQVJUSU1FICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1VMKQorCisvKiBCaXQgc2hpZnQgdmFsdWUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdGFydCB0aW1lIGZvciB0aGUKKyAqIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjIgY29tbWFuZC4KKyAqLworI2RlZmluZSBBU01fU0hJRlRfUlVOX1NUQVJUSU1FIDAKK3N0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcnVuX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgICAgICAgZmxhZ3M7CisvKiBTcGVjaWZpZXMgd2hldGhlciB0byBydW4gaW1tZWRpYXRlbHkgb3IgYXQgYSBzcGVjaWZpYworICogcmVuZGVyaW5nIHRpbWUgb3Igd2l0aCBhIHNwZWNpZmllZCBkZWxheS4gUnVuIHdpdGggZGVsYXkgaXMKKyAqIHVzZWZ1bCBmb3IgZGVsYXlpbmcgaW4gY2FzZSBvZiBBU00gbG9vcGJhY2sgb3BlbmVkIHRocm91Z2gKKyAqIEFTTV9TVFJFQU1fQ01EX09QRU5fTE9PUEJBQ0tfVjIuIFVzZSAjQVNNX0JJVF9NQVNLX1JVTl9TVEFSVElNRQorICogYW5kICNBU01fU0hJRlRfUlVOX1NUQVJUSU1FIHRvIHNldCB0aGlzIDItYml0IGZsYWcuCisgKgorICoKKyAqQml0cyAwIGFuZCAxIGNhbiB0YWtlIG9uZSBvZiBmb3VyIHBvc3NpYmxlIHZhbHVlczoKKyAqCisgKi0gI0FTTV9TRVNTSU9OX0NNRF9SVU5fU1RBUlRJTUVfUlVOX0lNTUVESUFURQorICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9BQlNPTFVURUlNRQorICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9SRUxBVElWRUlNRQorICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9XSVRIX0RFTEFZCisgKgorICpBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQ7IGNsaWVudHMgbXVzdCBzZXQgdGhlbSB0byB6ZXJvLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICB0aW1lX2xzdzsKKy8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHRpbWUgaW4gbWljcm9zZWNvbmRzIHVzZWQgdG8gYWxpZ24gdGhlCisgKiBzZXNzaW9uIG9yaWdpbiB0aW1lLiBXaGVuIGJpdHMgMC0xIG9mIGZsYWdzIGlzCisgKiBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUX1JVTl9XSVRIX0RFTEFZLCB0aW1lIGxzdyBpcyB0aGUgbHN3IG9mCisgKiB0aGUgZGVsYXkgaW4gdXMuIEZvciBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUX1JVTl9XSVRIX0RFTEFZLAorICogbWF4aW11bSB2YWx1ZSBvZiB0aGUgNjQgYml0IGRlbGF5IGlzIDE1MCBtcy4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgdGltZV9tc3c7CisvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSB0aW1lIGluIG1pY3Jvc2Vjb25kcyB1c2VkIHRvIGFsaWduIHRoZQorICogc2Vzc2lvbiBvcmlnaW4gdGltZS4gV2hlbiBiaXRzIDAtMSBvZiBmbGFncyBpcworICogQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVF9SVU5fV0lUSF9ERUxBWSwgdGltZSBtc3cgaXMgdGhlIG1zdyBvZgorICogdGhlIGRlbGF5IGluIHVzLiBGb3IgQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVF9SVU5fV0lUSF9ERUxBWSwKKyAqIG1heGltdW0gdmFsdWUgb2YgdGhlIDY0IGJpdCBkZWxheSBpcyAxNTAgbXMuCisgKi8KKworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUEFVU0UgMHgwMDAxMEJEMworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfU1VTUEVORCAweDAwMDEwREVDCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9HRVRfU0VTU0lPTlRJTUVfVjMgMHgwMDAxMEQ5RAorI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SX1JYX1VOREVSRkxPV19FVkVOVFMgMHgwMDAxMEJENQorCitzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX3Jnc3RyX3J4X3VuZGVyZmxvdyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOworLyogU3BlY2lmaWVzIHdoZXRoZXIgYSBjbGllbnQgaXMgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhbiBSeAorICogc2Vzc2lvbiB1bmRlcmZsb3dzLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMCAtLSBEbyBub3Qgc2VuZCB1bmRlcmZsb3cgZXZlbnRzCisgKiAtIDEgLS0gU2VuZCB1bmRlcmZsb3cgZXZlbnRzCisgKi8KKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBSZXNlcnZlZC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9GT1JYX09WRVJGTE9XX0VWRU5UUyAweDAwMDEwQkQ2CisKK3N0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcmVneF9vdmVyZmxvdyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOworLyogU3BlY2lmaWVzIHdoZXRoZXIgYSBjbGllbnQgaXMgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIFR4CisgKiBzZXNzaW9uIG92ZXJmbG93cy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gRG8gbm90IHNlbmQgb3ZlcmZsb3cgZXZlbnRzCisgKiAtIDEgLS0gU2VuZCBvdmVyZmxvdyBldmVudHMKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogUmVzZXJ2ZWQuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4qLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU0VTU0lPTl9FVkVOVF9SWF9VTkRFUkZMT1cgICAgICAgIDB4MDAwMTBDMTcKKyNkZWZpbmUgQVNNX1NFU1NJT05fRVZFTlRYX09WRVJGTE9XICAgICAgICAgICAweDAwMDEwQzE4CisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTlRJTUVfVjMgMHgwMDAxMEQ5RQorCitzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kcnNwX2dldF9zZXNzaW9udGltZV92MyB7CisJdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOworCS8qIFN0YXR1cyBtZXNzYWdlIChlcnJvciBjb2RlKS4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiBSZWZlciB0byBAeGh5cGVycmVme1EzLFtRM119CisJICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBzZXNzaW9udGltZV9sc3c7CisJLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLiovCisKKwl1MzIgICAgICAgICAgICAgICAgICBzZXNzaW9udGltZV9tc3c7CisJLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLiovCisKKwl1MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZXRpbWVfbHN3OworLyogTG93ZXIgMzIgYml0cyBpbiBtaWNybyBzZWNvbmRzIG9mIHRoZSBhYnNvbHV0ZSB0aW1lIGF0IHdoaWNoCisgKiB0aGUgKiBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJvdmUgc2Vzc2lvbiB0aW1lIGdldHMKKyAqIHJlbmRlcmVkICogdG8gaGFyZHdhcmUuIFRoaXMgYWJzb2x1dGUgdGltZSBtYXkgYmUgc2xpZ2h0bHkgaW4gdGhlCisgKiBmdXR1cmUgb3IgcGFzdC4KKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZXRpbWVfbXN3OworLyogVXBwZXIgMzIgYml0cyBpbiBtaWNybyBzZWNvbmRzIG9mIHRoZSBhYnNvbHV0ZSB0aW1lIGF0IHdoaWNoCisgKiB0aGUgKiBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJvdmUgc2Vzc2lvbiB0aW1lIGdldHMKKyAqIHJlbmRlcmVkIHRvICogaGFyZHdhcmUuIFRoaXMgYWJzb2x1dGUgdGltZSBtYXkgYmUgc2xpZ2h0bHkgaW4gdGhlCisgKiBmdXR1cmUgb3IgcGFzdC4KKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9BREpVU1RfU0VTU0lPTl9DTE9DS19WMiAgICAgMHgwMDAxMEQ5RgorCitzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX2FkanVzdF9zZXNzaW9uX2Nsb2NrX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit1MzIgICAgICAgICAgICAgICAgICBhZGp1c3RpbWVfbHN3OworLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgc2lnbmVkIDY0LWJpdCBxdWFudGl0eSB0aGF0IHNwZWNpZmllcyB0aGUKKyAqIGFkanVzdG1lbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgdG8gdGhlIHNlc3Npb24gY2xvY2suCisgKgorICogUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIGFkdmFuY2VtZW50IG9mIHRoZSBzZXNzaW9uIGNsb2NrLgorICogTmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGRlbGF5IG9mIHRoZSBzZXNzaW9uIGNsb2NrLgorICovCisKKworCXUzMiAgICAgICAgICAgICAgICAgIGFkanVzdGltZV9tc3c7CisvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSBzaWduZWQgNjQtYml0IHF1YW50aXR5IHRoYXQgc3BlY2lmaWVzCisgKiB0aGUgYWRqdXN0bWVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyB0byB0aGUgc2Vzc2lvbiBjbG9jay4KKyAqIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBhZHZhbmNlbWVudCBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KKyAqIE5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9BREpVU1RfU0VTU0lPTl9DTE9DS19WMiAgICAweDAwMDEwREEwCisKK3N0cnVjdCBhc21fc2Vzc2lvbl9jbWRyc3BfYWRqdXN0X3Nlc3Npb25fY2xvY2tfdjIgeworCXUzMiAgICAgICAgICAgICAgICAgIHN0YXR1czsKKy8qIFN0YXR1cyBtZXNzYWdlIChlcnJvciBjb2RlKS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IFJlZmVyIHRvIEB4aHlwZXJyZWZ7UTMsW1EzXX0KKyAqIEFuIGVycm9yIG1lYW5zIHRoZSBzZXNzaW9uIGNsb2NrIGlzIG5vdCBhZGp1c3RlZC4gSW4gdGhpcyBjYXNlLAorICogdGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgaXJyZWxldmFudC4KKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBhY3R1YWxfYWRqdXN0aW1lX2xzdzsKKy8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKKyAqIHRoZSBhY3R1YWwgYWRqdXN0bWVudCBpbiBtaWNyb3NlY29uZHMgcGVyZm9ybWVkIGJ5IHRoZSBhRFNQLgorICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgYWR2YW5jZW1lbnQgb2YgdGhlIHNlc3Npb24gY2xvY2suIEEKKyAqIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBhY3R1YWxfYWRqdXN0aW1lX21zdzsKKy8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIHNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKKyAqIHRoZSBhY3R1YWwgYWRqdXN0bWVudCBpbiBtaWNyb3NlY29uZHMgcGVyZm9ybWVkIGJ5IHRoZSBhRFNQLgorICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgYWR2YW5jZW1lbnQgb2YgdGhlIHNlc3Npb24gY2xvY2suIEEKKyAqIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBjbWRfbGF0ZW5jeV9sc3c7CisvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKKyAqIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWNyb3NlY29uZHMgdGFrZW4gdG8gcGVyZm9ybSB0aGUgc2Vzc2lvbgorICogY2xvY2sgYWRqdXN0bWVudC4KKyAqLworCisKKwl1MzIgICAgICAgICAgICAgICAgICBjbWRfbGF0ZW5jeV9tc3c7CisvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKKyAqIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWNyb3NlY29uZHMgdGFrZW4gdG8gcGVyZm9ybSB0aGUgc2Vzc2lvbgorICogY2xvY2sgYWRqdXN0bWVudC4KKyAqLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9HRVRfUEFUSF9ERUxBWV9WMgkgMHgwMDAxMERBRgorI2RlZmluZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1BBVEhfREVMQVlfVjIgMHgwMDAxMERCMAorCitzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kcnNwX2dldF9wYXRoX2RlbGF5X3YyIHsKKwl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7CisvKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkuIFdoZXRoZXIgdGhpcyBnZXQgZGVsYXkgb3BlcmF0aW9uCisgKiBpcyBzdWNjZXNzZnVsIG9yIG5vdC4gRGVsYXkgdmFsdWUgaXMgdmFsaWQgb25seSBpZiBzdGF0dXMgaXMKKyAqIHN1Y2Nlc3MuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBSZWZlciB0byBAeGh5cGVycmVme1E1LFtRNV19CisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X2xzdzsKKwkvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSBhRFNQIGRlbGF5IGluIG1pY3Jvc2Vjb25kcy4gKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X21zdzsKKwkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSBhRFNQIGRlbGF5ICBpbiBtaWNyb3NlY29uZHMuICovCisKK30gX19wYWNrZWQ7CisKKy8qIGFkc3BfYXNtX3Nlc3Npb25fY29tbWFuZC5oKi8KKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMyAgICAgICAweDAwMDEwREIzCisKKyNkZWZpbmUgQVNNX0xPV19MQVRFTkNZX1NUUkVBTV9TRVNTSU9OCQkJCTB4MTAwMDAwMDAKKworI2RlZmluZSBBU01fVUxUUkFfTE9XX0xBVEVOQ1lfU1RSRUFNX1NFU1NJT04JCQkweDIwMDAwMDAwCisKKyNkZWZpbmUgQVNNX1VMTF9QT1NUX1BST0NFU1NJTkdfU1RSRUFNX1NFU1NJT04JCQkweDQwMDAwMDAwCisKKyNkZWZpbmUgQVNNX0xFR0FDWV9TVFJFQU1fU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlX3YzIHsKKwlzdHJ1Y3QgYXByX2hkcgkJCWhkcjsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKKy8qIE1vZGUgZmxhZ3MgdGhhdCBjb25maWd1cmUgdGhlIHN0cmVhbSB0byBub3RpZnkgdGhlIGNsaWVudAorICogd2hlbmV2ZXIgaXQgZGV0ZWN0cyBhbiBTUi9DTSBjaGFuZ2UgYXQgdGhlIGlucHV0IHRvIGl0cyBQT1BQLgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0cyAwIHRvIDE6CisgKiAtIFJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAyOgorICogLSAwIC0tIFNSL0NNIGNoYW5nZSBub3RpZmljYXRpb24gZXZlbnQgaXMgZGlzYWJsZWQuCisgKiAtIDEgLS0gU1IvQ00gY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudCBpcyBlbmFibGVkLgorICogLSBVc2UgI0FTTV9CSVRfTUFTS19TUl9DTV9DSEFOR0VfTk9USUZZX0ZMQUcgYW5kCisgKiAjQVNNX1NISUZUX1NSX0NNX0NIQU5HRV9OT1RJRllfRkxBRyB0byBzZXQgb3IgZ2V0IHRoaXMgYml0LgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMToKKyAqIC0gMCAtLSBTdHJlYW0gdG8gYmUgb3BlbmVkIGluIG9uLUdhcGxlc3MgbW9kZS4KKyAqIC0gMSAtLSBTdHJlYW0gdG8gYmUgb3BlbmVkIGluIEdhcGxlc3MgbW9kZS4gSW4gR2FwbGVzcyBtb2RlLAorICogc3VjY2Vzc2l2ZSBzdHJlYW1zIG11c3QgYmUgb3BlbmVkIHdpdGggc2FtZSBzZXNzaW9uIElEIGJ1dAorICogZGlmZmVyZW50IHN0cmVhbSBJRHMuCisgKgorICogLSBVc2UgI0FTTV9CSVRfTUFTS19HQVBMRVNTX01PREVfRkxBRyBhbmQKKyAqICNBU01fU0hJRlRfR0FQTEVTU19NT0RFX0ZMQUcgdG8gc2V0IG9yIGdldCB0aGlzIGJpdC4KKyAqCisgKgorICogQG5vdGUxaGFuZyBNSURJIGFuZCBEVE1GIHN0cmVhbXMgY2Fubm90IGJlIG9wZW5lZCBpbiBHYXBsZXNzIG1vZGUuCisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICBzaW5rX2VuZHBvaW50eXBlOworLyo8IFNpbmsgcG9pbnQgdHlwZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gRGV2aWNlIG1hdHJpeAorICogLSBPdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgorICoKKyAqIFRoZSBkZXZpY2UgbWF0cml4IGlzIHRoZSBnYXRld2F5IHRvIHRoZSBoYXJkd2FyZSBwb3J0cy4KKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKKy8qPCBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2IGFuZCAyNCBiaXRzIHBlciBzYW1wbGUKKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jb3BvX2lkOworLyo8IFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mCisgKiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLiA8aT5Ob25lPC9pPiBtZWFucyBubyBwb3N0cHJvY2Vzc2luZy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX0RFRkFVTFQKKyAqIC0gI0FTTV9TVFJFQU1fUE9TVFBST0NPUE9fSURfTUNIX1BFQUtfVk9MCisgKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX05PTkUKKyAqCisgKiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIGVuYWJsZWQgdGhyb3VnaCBTZXRQYXJhbXMgZmxhZ3MuCisgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkZWNfZm10X2lkOworLyo8IENvbmZpZ3VyYXRpb24gSUQgb2YgdGhlIGRlY29kZXIgbWVkaWEgZm9ybWF0LgorICoKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyCisgKiAtICNBU01fTUVESUFfRk1UX0FEUENNCisgKiAtICNBU01fTUVESUFfRk1UX01QMworICogLSAjQVNNX01FRElBX0ZNVF9BQUNfVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfRE9MQllfQUFDCisgKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0FNUldCX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0FNUl9XQl9QTFVTX1YyCisgKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ19GUworICogLSAjQVNNX01FRElBX0ZNVF9FVlJDQl9GUworICogLSAjQVNNX01FRElBX0ZNVF9FVlJDV0JfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfU0JDCisgKiAtICNBU01fTUVESUFfRk1UX1dNQV9WMTBQUk9fVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1Y5X1YyCisgKiAtICNBU01fTUVESUFfRk1UX0FDMworICogLSAjQVNNX01FRElBX0ZNVF9FQUMzCisgKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUworICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRlJfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfVk9SQklTCisgKiAtICNBU01fTUVESUFfRk1UX0ZMQUMKKyAqIC0gI0FTTV9NRURJQV9GTVRfQUxBQworICogLSAjQVNNX01FRElBX0ZNVF9BUEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQorICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVMTF9NT0RFX1dSSVRFICAgIDB4MDAwMTBERDkKKworLyogQml0bWFzayBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCisjZGVmaW5lIEFTTV9CSVRfTUFTS19TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURSAweEUwMDAwMDAwVUwKKworLyogQml0bWFzayBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCisjZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURSAyOQorCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVTSF9NT0RFX1JFQUQgIDB4MDAwMTBEREEKKworI2RlZmluZSBBU01fQklUX01BU0tfU1RSRUFNX1BFUkZfRkxBR19QVVNIX01PREVfUkVBRCAweEUwMDAwMDAwVUwKKworI2RlZmluZSBBU01fU0hJRlRfU1RSRUFNX1BFUkZfRkxBR19QVVNIX01PREVfUkVBRCAyOQorCisjZGVmaW5lIEFTTV9EQVRBX0VWRU5UX1dBVEVSTUFSSyAweDAwMDEwRERCCisKK3N0cnVjdCBhc21fc2hhcmVkX3Bvc2l0aW9uX2J1ZmZlciB7CisJdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICBmcmFtZV9jb3VudGVyOworLyogQ291bnRlciB1c2VkIHRvIGhhbmRsZSBpbnRlcnByb2Nlc3NvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzLgorICogV2hlbiBmcmFtZV9jb3VudGVyIGlzIDA6IHJlYWRfaW5kZXgsIHdhbGxfY2xvY2tfdXNfbHN3LCBhbmQKKyAqIHdhbGxfY2xvY2tfdXNfbXN3IGFyZSBpbnZhbGlkLgorICogU3VwcG9ydGVkIHZhbHVlczogPj0gMC4KKyAqLworCisJdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICBpbmRleDsKKy8qIEluZGV4IGluIGJ5dGVzIGZyb20gd2hlcmUgdGhlIGFEU1AgaXMgcmVhZGluZy93cml0aW5nLgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byBjaXJjdWxhciBidWZmZXIgc2l6ZSAtIDEKKyAqLworCisJdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICB3YWxsX2Nsb2NrX3VzX2xzdzsKKy8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCB3YWxsIGNsb2NrIHRpbWUgaW4gbWljcm9zZWNvbmRzIHdoZW4gdGhlCisgKiByZWFkIGluZGV4IHdhcyB1cGRhdGVkLgorICogU3VwcG9ydGVkIHZhbHVlczogPj0gMAorICovCisKKwl2b2xhdGlsZSB1aW50MzJfdCAgICAgICAgICAgICAgIHdhbGxfY2xvY2tfdXNfbXN3OworLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHdhbGwgY2xvY2sgdGltZSBpbiBtaWNyb3NlY29uZHMgd2hlbiB0aGUKKyAqIHJlYWQgaW5kZXggd2FzIHVwZGF0ZWQKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ID49IDAKKyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9zaGFyZWRfd2F0ZXJtYXJrX2xldmVsIHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICB3YXRlcm1hcmtfbGV2ZWxfYnl0ZXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8geworCXN0cnVjdCBhcHJfaGRyICAgICAgICAgIGhkcjsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOworCXVpbnQxNl90ICAgICAgICAgICAgICAgIGVuZHBvaW50X3R5cGU7CisJdWludDE2X3QgICAgICAgICAgICAgICAgdG9wb19iaXRzX3Blcl9zYW1wbGU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgdG9wb19pZDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBmbXRfaWQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgc2hhcmVkX3Bvc19idWZfcGh5X2FkZHJfbHN3OworCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9wb3NfYnVmX3BoeV9hZGRyX21zdzsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9tZW1fcG9vbF9pZDsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9udW1fcmVnaW9uczsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9wcm9wZXJ0eV9mbGFnOworCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9jaXJjX2J1Zl9zdGFydF9waHlfYWRkcl9sc3c7CisJdWludDMyX3QgICAgICAgICAgICAgICAgc2hhcmVkX2NpcmNfYnVmX3N0YXJ0X3BoeV9hZGRyX21zdzsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICBzaGFyZWRfY2lyY19idWZfc2l6ZTsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfY2lyY19idWZfbWVtX3Bvb2xfaWQ7CisJdWludDE2X3QgICAgICAgICAgICAgICAgc2hhcmVkX2NpcmNfYnVmX251bV9yZWdpb25zOworCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9jaXJjX2J1Zl9wcm9wZXJ0eV9mbGFnOworCXVpbnQzMl90ICAgICAgICAgICAgICAgIG51bV93YXRlcm1hcmtfbGV2ZWxzOworCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192MyAgICAgICAgIGZtdDsKKwlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgICAgICAgICAgICBtYXBfcmVnaW9uX3Bvc19idWY7CisJc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICAgICAgICAgICAgbWFwX3JlZ2lvbl9jaXJjX2J1ZjsKKwlzdHJ1Y3QgYXNtX3NoYXJlZF93YXRlcm1hcmtfbGV2ZWwgd2F0ZXJtYXJrWzBdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfVjMgICAgICAgICAgICAgICAgIDB4MDAwMTBEQjQKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgdGltZXN0YW1wIHR5cGUgZmxhZyBiaXRtYXNrICovCisjZGVmaW5lIEFTTV9CSVRfTUFTS0lNRVNUQU1QWVBFX0ZMQUcgICAgICAgICgweDAwMDAwMDIwVUwpCisKKy8qIERlZmluaXRpb24gb2YgdGhlIHRpbWVzdGFtcCB0eXBlIGZsYWcgc2hpZnQgdmFsdWUuICovCisjZGVmaW5lIEFTTV9TSElGVElNRVNUQU1QWVBFX0ZMQUcgNQorCisvKiBSZWxhdGl2ZSB0aW1lc3RhbXAgaXMgaWRlbnRpZmllZCBieSB0aGlzIHZhbHVlLiovCisjZGVmaW5lIEFTTV9SRUxBVElWRUlNRVNUQU1QICAgICAgMAorCisvKiBBYnNvbHV0ZSB0aW1lc3RhbXAgaXMgaWRlbnRpZmllZCBieSB0aGlzIHZhbHVlLiovCisjZGVmaW5lIEFTTV9BQlNPTFVURUlNRVNUQU1QICAgICAgMQorCisvKiBCaXQgdmFsdWUgZm9yIExvdyBMYXRlbmN5IFR4IHN0cmVhbSBzdWJmaWVsZCAqLworI2RlZmluZSBBU01fTE9XX0xBVEVOQ1lfVFhfU1RSRUFNX1NFU1NJT04JCQkxCisKKy8qIEJpdCBzaGlmdCBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCisjZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fUEVSRl9NT0RFX0ZMQUdfSU5fT1BFTl9SRUFEICAgICAgICAgICAgICAyOQorCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkX3YzIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOworLyogTW9kZSBmbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgbWV0YSBpbmZvcm1hdGlvbiBwZXIgZW5jb2RlZAorICogZnJhbWUgaXMgdG8gYmUgcHJvdmlkZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBiaXQgNDoKKyAqCisgKiAtIDAgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFsbCBlbmNvZGVkIGZyYW1lcyBvbmx5OyBpdAorICogZG9lcyBub3QgY29udGFpbiBmcmFtZSBtZXRhZGF0YS4KKyAqCisgKiAtIDEgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFuIGFycmF5IG9mIG1ldGFkYXRhIGFuZAorICogZW5jb2RlZCBmcmFtZXMuCisgKgorICogLSBVc2UgI0FTTV9CSVRfTUFTS19NRVRBX0lORk9fRkxBRyBhcyB0aGUgYml0bWFzayBhbmQKKyAqICNBU01fU0hJRlRfTUVUQV9JTkZPX0ZMQUcgYXMgdGhlIHNoaWZ0IHZhbHVlIGZvciB0aGlzIGJpdC4KKyAqCisgKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDU6CisgKgorICogLSBBU01fUkVMQVRJVkVJTUVTVEFNUCAtLSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjIgd2lsbCBoYXZlCisgKiAtIHJlbGF0aXZlIHRpbWUtc3RhbXAuCisgKiAtIEFTTV9BQlNPTFVURUlNRVNUQU1QIC0tIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMiB3aWxsCisgKiAtIGhhdmUgYWJzb2x1dGUgdGltZS1zdGFtcC4KKyAqCisgKiAtIFVzZSAjQVNNX0JJVF9NQVNLSU1FU1RBTVBZUEVfRkxBRyBhcyB0aGUgYml0bWFzayBhbmQKKyAqICNBU01fU0hJRlRJTUVTVEFNUFlQRV9GTEFHIGFzIHRoZSBzaGlmdCB2YWx1ZSBmb3IgdGhpcyBiaXQuCisgKgorICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgICBzcmNfZW5kcG9pbnR5cGU7CisvKiBTcGVjaWZpZXMgdGhlIGVuZHBvaW50IHByb3ZpZGluZyB0aGUgaW5wdXQgc2FtcGxlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gRGV2aWNlIG1hdHJpeAorICogLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZDsgY2xpZW50cyBtdXN0IHNldCB0aGVtIHRvIHplcm8uCisgKiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHJldHVybmVkLgorICogVGhlIGRldmljZSBtYXRyaXggaXMgdGhlIGdhdGV3YXkgZnJvbSB0aGUgdHVubmVsZWQgVHggcG9ydHMuCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgICAgcHJlcHJvY29wb19pZDsKKy8qIFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mIHByZXByb2Nlc3NpbmcKKyAqIGFsZ29yaXRobXMuIDxpPk5vbmU8L2k+IG1lYW5zIG5vIHByZXByb2Nlc3NpbmcuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX1NUUkVBTV9QUkVQUk9DT1BPX0lEX0RFRkFVTFQKKyAqIC0gI0FTTV9TVFJFQU1fUFJFUFJPQ09QT19JRF9OT05FCisgKgorICogVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSBlbmFibGVkIHRocm91Z2ggU2V0UGFyYW1zIGZsYWdzLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICAgIGVuY19jZmdfaWQ7CisvKiBNZWRpYSBjb25maWd1cmF0aW9uIElEIGZvciBlbmNvZGVkIG91dHB1dC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyCisgKiAtICNBU01fTUVESUFfRk1UX0FBQ19WMgorICogLSAjQVNNX01FRElBX0ZNVF9BTVJOQl9GUworICogLSAjQVNNX01FRElBX0ZNVF9BTVJXQl9GUworICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0VWUkNfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ0JfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ1dCX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX1NCQworICogLSAjQVNNX01FRElBX0ZNVF9HNzExX0FMQVdfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRzcxMV9NTEFXX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0c3MjlBX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0VYQU1QTEUKKyAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1Y4CisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlOworLyogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwcm9jZXNzZWQgYnkgQVNNIG1vZHVsZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiBhbmQgMjQgYml0cyBwZXIgc2FtcGxlCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9QT1BQX09VVFBVVF9TUl9OQVRJVkVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgbWF4aW11bSBzYW1wbGluZyByYXRlIGF0IHRoZSBQT1BQIG91dHB1dC4qLworI2RlZmluZSBBU01fUE9QUF9PVVRQVVRfU1JfTUFYX1JBVEUgICAgICAgICAgICAgNDgwMDAKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURXUklURV9WMiAgICAgICAgMHgwMDAxMEQ4RAorI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURXUklURV9WMiAgICAgICAgMHgwMDAxMEQ4RAorCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkd3JpdGVfdjIgeworCXN0cnVjdCBhcHJfaGRyICAgICAgICAgaGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKKy8qIE1vZGUgZmxhZ3MuCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBiaXQgMjoKKyAqIC0gMCAtLSBTUi9DTSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV2ZW50IGlzIGRpc2FibGVkLgorICogLSAxIC0tIFNSL0NNIGNoYW5nZSBub3RpZmljYXRpb24gZXZlbnQgaXMgZW5hYmxlZC4gVXNlCisgKiAjQVNNX0JJVF9NQVNLX1NSX0NNX0NIQU5HRV9OT1RJRllfRkxBRyBhbmQKKyAqICNBU01fU0hJRlRfU1JfQ01fQ0hBTkdFX05PVElGWV9GTEFHIHRvIHNldCBvcgorICogZ2V0dGluZyB0aGlzIGZsYWcuCisgKgorICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDQ6CisgKiAtIDAgLS0gUmV0dXJuIHJlYWQgZGF0YSBidWZmZXIgY29udGFpbnMgYWxsIGVuY29kZWQgZnJhbWVzIG9ubHk7IGl0CisgKiBkb2VzIG5vdCBjb250YWluIGZyYW1lIG1ldGFkYXRhLgorICogLSAxIC0tIFJldHVybiByZWFkIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFuIGFycmF5IG9mIG1ldGFkYXRhIGFuZAorICogZW5jb2RlZCBmcmFtZXMuCisgKgorICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY29wb19pZDsKKy8qIFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mIHBvc3Rwcm9jZXNzaW5nCisgKiBhbGdvcml0aG1zLiA8aT5Ob25lPC9pPiBtZWFucyBubyBwb3N0cHJvY2Vzc2luZy4KKyAqCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9ERUZBVUxUCisgKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX01DSF9QRUFLX1ZPTAorICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9OT05FCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgICAgZGVjX2ZtdF9pZDsKKy8qIFNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YS4gUENNIGluZGljYXRlcyB0aGF0CisgKiBubyBkZWNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgZS5nLiwgdGhpcyBpcyBhbiBOVCBlbmNvZGVyCisgKiBzZXNzaW9uLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfQURQQ00KKyAqIC0gI0FTTV9NRURJQV9GTVRfTVAzCisgKiAtICNBU01fTUVESUFfRk1UX0FBQ19WMgorICogLSAjQVNNX01FRElBX0ZNVF9ET0xCWV9BQUMKKyAqIC0gI0FTTV9NRURJQV9GTVRfQU1STkJfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfQU1SV0JfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfVjEzS19GUworICogLSAjQVNNX01FRElBX0ZNVF9FVlJDX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0VWUkNCX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0VWUkNXQl9GUworICogLSAjQVNNX01FRElBX0ZNVF9TQkMKKyAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1YxMFBST19WMgorICogLSAjQVNNX01FRElBX0ZNVF9XTUFfVjlfVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfQU1SX1dCX1BMVVNfVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfQUMzCisgKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUworICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICAgIGVuY19jZmdfaWQ7CisvKiBTcGVjaWZpZXMgdGhlIG1lZGlhIHR5cGUgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIHN0cmVhbS4gUENNCisgKiBpbmRpY2F0ZXMgdGhhdCBubyBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgZS5nLiwgdGhpcyBpcyBhbiBOVAorICogZGVjb2RlciBzZXNzaW9uLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIKKyAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX1YyCisgKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX0FNUldCX0ZTCisgKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ19GUworICogLSAjQVNNX01FRElBX0ZNVF9FVlJDQl9GUworICogLSAjQVNNX01FRElBX0ZNVF9FVlJDV0JfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfU0JDCisgKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUworICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQorICogLSAjQVNNX01FRElBX0ZNVF9XTUFfVjgKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7CisvKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2IGFuZCAyNCBiaXRzIHBlciBzYW1wbGUKKyAqLworCisJdTE2ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uKi8KKworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX0xPT1BCQUNLX1YyIDB4MDAwMTBEOEUKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX2xvb3BiYWNrX3YyIHsKKwlzdHJ1Y3QgYXByX2hkciAgICAgICAgIGhkcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG1vZGVfZmxhZ3M7CisvKiBNb2RlIGZsYWdzLgorICogQml0IDAtMzE6IHJlc2VydmVkOyBjbGllbnQgc2hvdWxkIHNldCB0aGVzZSBiaXRzIHRvIDAKKyAqLworCXUxNiAgICAgICAgICAgICAgICAgICAgc3JjX2VuZHBvaW50eXBlOworCS8qIEVuZHBvaW50IHR5cGUuIDAgPSBUeCBNYXRyaXggKi8KKwl1MTYgICAgICAgICAgICAgICAgICAgIHNpbmtfZW5kcG9pbnR5cGU7CisJLyogRW5kcG9pbnQgdHlwZS4gMCA9IFJ4IE1hdHJpeCAqLworCXUzMiAgICAgICAgICAgICAgICAgICAgcG9zdHByb2NvcG9faWQ7CisvKiBQb3N0cHJvY2Vzc29yIHRvcG9sb2d5IElELiBTcGVjaWZpZXMgdGhlIHRvcG9sb2d5IG9mCisgKiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKKy8qIFRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcworICogU3VwcG9ydGVkIHZhbHVlczogMTYgYW5kIDI0IGJpdHMgcGVyIHNhbXBsZQorICovCisJdTE2ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX0NMT1NFICAgICAgICAgICAgIDB4MDAwMTBCQ0QKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfRkxVU0ggICAgICAgICAgICAgMHgwMDAxMEJDRQorCisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfRkxVU0hfUkVBREJVRlMgICAweDAwMDEwQzA5CisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjIgMHgwMDAxMERBMQorCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiB7CisJdTMyICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbHN3OworLyogTFNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4gU3VwcG9ydGVkIHZhbHVlczogYW55LiAqLworCXUzMiAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX21zdzsKKy8qIE1TVyBvZiBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuIFN1cHBvcnRlZCB2YWx1ZXM6IGFueS4KKyAqIC0gTXVzdCBiZSBzZXQgdG8gemVybyBmb3IgaW4tYmFuZCBkYXRhLgorICogLSBJbiB0aGUgY2FzZSBvZiAzMiBiaXQgU2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBtc3cgIGZpZWxkIG11c3QgYmUKKyAqIC0gc2V0IHRvIHplcm8uCisgKiAtIEluIHRoZSBjYXNlIG9mIDM2IGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIGJpdCAzMSB0byBiaXQgNCBvZgorICogbXN3CisgKgorICogLSBtdXN0IGJlIHNldCB0byB6ZXJvLgorICovCisJdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisvKiBTdXBwb3J0ZWQgVmFsdWVzOiBBbnkuCisgKiBtZW1vcnkgbWFwIGhhbmRsZSByZXR1cm5lZCBieSBEU1AgdGhyb3VnaAorICogQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCisgKiBjb21tYW5kLgorICogaWYgbW1oYW5kbGUgaXMgTlVMTCwgdGhlIFBhcmFtRGF0YSBwYXlsb2FkcyBhcmUgd2l0aGluIHRoZQorICogbWVzc2FnZSBwYXlsb2FkIChpbi1iYW5kKS4KKyAqIElmIG1taGFuZGxlIGlzIG5vbi1OVUxMLCB0aGUgUGFyYW1EYXRhIHBheWxvYWRzIGJlZ2luIGF0IHRoZQorICogYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFkZHJlc3MgbXN3IGFuZCBsc3cgKG91dC1vZi1iYW5kKS4KKyAqLworCisJdTMyICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX3NpemU7CisvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGFjY29tcGFueWluZyB0aGUKKyAqIG1lc3NhZ2UsIG9yIGluIHNoYXJlZCBtZW1vcnkuIFRoaXMgZmllbGQgaXMgdXNlZCBmb3IgcGFyc2luZyB0aGUKKyAqIHBhcmFtZXRlciBwYXlsb2FkLgorICovCit9IF9fcGFja2VkOworCisKK3N0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgeworCXUzMiAgICAgICAgICAgICAgICAgIG1vZHVsZV9pZDsKKwkvKiBVbmlxdWUgbW9kdWxlIElELiAqLworCisJdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7CisJLyogVW5pcXVlIHBhcmFtZXRlciBJRC4gKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIHBhcmFtX3NpemU7CisvKiBEYXRhIHNpemUgb2YgdGhlIHBhcmFtX2lkL21vZHVsZV9pZCBjb21iaW5hdGlvbi4gVGhpcyBpcworICogYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLgorICovCisKKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvCisgKiB6ZXJvLgorICovCisKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfR0VUX1BQX1BBUkFNU19WMgkJMHgwMDAxMERBMgorCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZ2V0X3BwX3BhcmFtc192MiB7CisJdTMyICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbHN3OworCS8qIExTVyBvZiB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLworCXUzMiAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX21zdzsKKy8qIE1TVyBvZiB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLgorICogLSBTaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5LCBpZiBzcGVjaWZpZWQsIHNoYWxsIGJlIGxhcmdlIGVub3VnaAorICogdG8gY29udGFpbiB0aGUgd2hvbGUgUGFyYW1EYXRhIHBheWxvYWQsIGluY2x1ZGluZyBNb2R1bGUgSUQsCisgKiBQYXJhbSBJRCwgUGFyYW0gU2l6ZSwgYW5kIFBhcmFtIFZhbHVlcworICogLSBNdXN0IGJlIHNldCB0byB6ZXJvIGZvciBpbi1iYW5kIGRhdGEKKyAqIC0gSW4gdGhlIGNhc2Ugb2YgMzIgYml0IFNoYXJlZCBtZW1vcnkgYWRkcmVzcywgbXN3IGZpZWxkIG11c3QgYmUKKyAqIHNldCB0byB6ZXJvLgorICogLSBJbiB0aGUgY2FzZSBvZiAzNiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQgMzEgdG8gYml0IDQgb2YKKyAqIG1zdyBtdXN0IGJlIHNldCB0byB6ZXJvLgorICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKy8qIFN1cHBvcnRlZCBWYWx1ZXM6IEFueS4KKyAqIG1lbW9yeSBtYXAgaGFuZGxlIHJldHVybmVkIGJ5IERTUCB0aHJvdWdoIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUworICogY29tbWFuZC4KKyAqIGlmIG1taGFuZGxlIGlzIE5VTEwsIHRoZSBQYXJhbURhdGEgcGF5bG9hZHMgaW4gdGhlIEFDSyBhcmUgd2l0aGluIHRoZQorICogbWVzc2FnZSBwYXlsb2FkIChpbi1iYW5kKS4KKyAqIElmIG1taGFuZGxlIGlzIG5vbi1OVUxMLCB0aGUgUGFyYW1EYXRhIHBheWxvYWRzIGluIHRoZSBBQ0sgYmVnaW4gYXQgdGhlCisgKiBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYWRkcmVzcyBtc3cgYW5kIGxzdy4KKyAqIChvdXQtb2YtYmFuZCkuCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgIG1vZHVsZV9pZDsKKy8qIFVuaXF1ZSBtb2R1bGUgSUQuICovCisKKwl1MzIgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKKy8qIFVuaXF1ZSBwYXJhbWV0ZXIgSUQuICovCisKKwl1MTYgICAgICAgICAgICAgICAgICBwYXJhbV9tYXhfc2l6ZTsKKy8qIE1heGltdW0gZGF0YSBzaXplIG9mIHRoZSBtb2R1bGVfaWQvcGFyYW1faWQgY29tYmluYXRpb24uIFRoaXMKKyAqIGlzIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKyAqLworCisKKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKy8qIFJlc2VydmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBDbGllbnRzIG11c3Qgc2V0IHRoaXMKKyAqIGZpZWxkIHRvIHplcm8uCisgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSAweDAwMDEwQzEwCisKKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0VOQ0RFQ19CSVRSQVRFICAgICAweDAwMDEwQzEzCisKK3N0cnVjdCBhc21fYml0cmF0ZV9wYXJhbSB7CisJdTMyICAgICAgICAgICAgICAgICAgYml0cmF0ZTsKKy8qIE1heGltdW0gc3VwcG9ydGVkIGJpdHJhdGUuIE9ubHkgdGhlIEFBQyBlbmNvZGVyIGlzIHN1cHBvcnRlZC4qLworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjIgMHgwMDAxMERBMworI2RlZmluZSBBU01fUEFSQU1fSURfQUFDX1NCUl9QU19GTEFHCQkgMHgwMDAxMEM2MworCisvKiBGbGFnIHRvIHR1cm4gb2ZmIGJvdGggU0JSIGFuZCBQUyBwcm9jZXNzaW5nLCBpZiB0aGV5IGFyZQorICogcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtLgorICovCisKKyNkZWZpbmUgQVNNX0FBQ19TQlJfT0ZGX1BTX09GRiAoMikKKworLyogRmxhZyB0byB0dXJuIG9uIFNCUiBidXQgdHVybiBvZmYgUFMgcHJvY2Vzc2luZyxpZiB0aGV5IGFyZQorICogcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtLgorICovCisKKyNkZWZpbmUgQVNNX0FBQ19TQlJfT05fUFNfT0ZGICAoMSkKKworLyogRmxhZyB0byB0dXJuIG9uIGJvdGggU0JSIGFuZCBQUyBwcm9jZXNzaW5nLCBpZiB0aGV5IGFyZQorICogcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtIChkZWZhdWx0IGJlaGF2aW9yKS4KKyAqLworCisKKyNkZWZpbmUgQVNNX0FBQ19TQlJfT05fUFNfT04gICAoMCkKKworLyogU3RydWN0dXJlIGZvciBhbiBBQUMgU0JSIFBTIHByb2Nlc3NpbmcgZmxhZy4gKi8KKworLyogIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfQUFDX1NCUl9QU19GTEFHIHBhcmFtZXRlciBpbiB0aGUKKyAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCisgKi8KK3N0cnVjdCBhc21fYWFjX3Nicl9wc19mbGFnX3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gIGVuY2RlYzsKKwlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyCWVuY2JsazsKKworCXUzMiAgICAgICAgICAgICAgICAgIHNicl9wc19mbGFnOworLyogQ29udHJvbCBwYXJhbWV0ZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgU0JSL1BTIHByb2Nlc3NpbmcgaW4KKyAqIHRoZSBBQUMgYml0c3RyZWFtLiBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gc2V0IHRoaXMgZmllbGQ6CisgKiAtICNBU01fQUFDX1NCUl9PRkZfUFNfT0ZGIC0tIFR1cm4gb2ZmIGJvdGggU0JSIGFuZCBQUworICogcHJvY2Vzc2luZywgaWYgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtLgorICogLSAjQVNNX0FBQ19TQlJfT05fUFNfT0ZGIC0tIFR1cm4gb24gU0JSIHByb2Nlc3NpbmcsIGJ1dCBub3QgUFMKKyAqIHByb2Nlc3NpbmcsIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbS4KKyAqIC0gI0FTTV9BQUNfU0JSX09OX1BTX09OIC0tIFR1cm4gb24gYm90aCBTQlIgYW5kIFBTIHByb2Nlc3NpbmcsCisgKiBpZiB0aGV5IGFyZSBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0gKGRlZmF1bHQgYmVoYXZpb3IpLgorICogLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnZhbGlkLgorICogQ2hhbmdlcyBhcmUgYXBwbGllZCB0byB0aGUgbmV4dCBkZWNvZGVkIGZyYW1lLgorICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9BQUNfRFVBTF9NT05PX01BUFBJTkcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEM2NAorCisvKglGaXJzdCBzaW5nbGUgY2hhbm5lbCBlbGVtZW50IGluIGEgZHVhbCBtb25vIGJpdHN0cmVhbS4qLworI2RlZmluZSBBU01fQUFDX0RVQUxfTU9OT19NQVBfU0NFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKworLyoJU2Vjb25kIHNpbmdsZSBjaGFubmVsIGVsZW1lbnQgaW4gYSBkdWFsIG1vbm8gYml0c3RyZWFtLiovCisjZGVmaW5lIEFTTV9BQUNfRFVBTF9NT05PX01BUF9TQ0VfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyKQorCisvKiBTdHJ1Y3R1cmUgZm9yIEFBQyBkZWNvZGVyIGR1YWwgbW9ubyBjaGFubmVsIG1hcHBpbmcuICovCisKKworc3RydWN0IGFzbV9hYWNfZHVhbF9tb25vX21hcHBpbmdfcGFyYW0geworCXN0cnVjdCBhcHJfaGRyCQkJCQkJCWhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbQllbmNkZWM7CisJdTE2ICAgIGxlZnRfY2hhbm5lbF9zY2U7CisJdTE2ICAgIHJpZ2h0X2NoYW5uZWxfc2NlOworCit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjIgMHgwMDAxMERBNAorCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRyc3BfZ2V0X3BwX3BhcmFtc192MiB7CisJdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fUEFSQU1fSURfQUMzX0tBUkFPS0VfTU9ERSAweDAwMDEwRDczCisKKy8qIEVudW1lcmF0aW9uIGZvciBib3RoIHZvY2FscyBpbiBhIGthcmFva2Ugc3RyZWFtLiovCisjZGVmaW5lIEFDM19LQVJBT0tFX01PREVfTk9fVk9DQUwgICAgICgwKQorCisvKiBFbnVtZXJhdGlvbiBmb3Igb25seSB0aGUgbGVmdCB2b2NhbCBpbiBhIGthcmFva2Ugc3RyZWFtLiovCisjZGVmaW5lIEFDM19LQVJBT0tFX01PREVfTEVGVF9WT0NBTCAgICgxKQorCisvKiBFbnVtZXJhdGlvbiBmb3Igb25seSB0aGUgcmlnaHQgdm9jYWwgaW4gYSBrYXJhb2tlIHN0cmVhbS4qLworI2RlZmluZSBBQzNfS0FSQU9LRV9NT0RFX1JJR0hUX1ZPQ0FMICgyKQorCisvKiBFbnVtZXJhdGlvbiBmb3IgYm90aCB2b2NhbCBjaGFubmVscyBpbiBhIGthcmFva2Ugc3RyZWFtLiovCisjZGVmaW5lIEFDM19LQVJBT0tFX01PREVfQk9USF9WT0NBTCAgICAgICAgICAgICAoMykKKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19EUkNfTU9ERSAgICAgICAgICAgICAgIDB4MDAwMTBENzQKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgQ3VzdG9tIEFuYWxvZyBtb2RlLiovCisjZGVmaW5lIEFDM19EUkNfTU9ERV9DVVNUT01fQU5BTE9HICAgICAgICAgICAgICAoMCkKKworLyogRW51bWVyYXRpb24gZm9yIHRoZSBDdXN0b20gRGlnaXRhbCBtb2RlLiovCisjZGVmaW5lIEFDM19EUkNfTU9ERV9DVVNUT01fRElHSVRBTCAgICAgICAgICAgICAoMSkKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgTGluZSBPdXQgbW9kZSAobGlnaHQgY29tcHJlc3Npb24pLiovCisjZGVmaW5lIEFDM19EUkNfTU9ERV9MSU5FX09VVCAgKDIpCisKKy8qIEVudW1lcmF0aW9uIGZvciB0aGUgUkYgcmVtb2R1bGF0aW9uIG1vZGUgKGhlYXZ5IGNvbXByZXNzaW9uKS4qLworI2RlZmluZSBBQzNfRFJDX01PREVfUkZfUkVNT0QgICAgICAgICAgICAgICAgICAgICAgICAgKDMpCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9BQzNfRFVBTF9NT05PX01PREUgICAgICAgICAgICAgICAweDAwMDEwRDc1CisKKy8qIEVudW1lcmF0aW9uIGZvciBwbGF5aW5nIGR1YWwgbW9ubyBpbiBzdGVyZW8gbW9kZS4qLworI2RlZmluZSBBQzNfRFVBTF9NT05PX01PREVfU1RFUkVPICAgICAgICAgICAgICAgICAgICAgKDApCisKKy8qIEVudW1lcmF0aW9uIGZvciBwbGF5aW5nIGxlZnQgbW9uby4qLworI2RlZmluZSBBQzNfRFVBTF9NT05PX01PREVfTEVGVF9NT05PICAgICAgICAgICAgICAgICAgKDEpCisKKy8qIEVudW1lcmF0aW9uIGZvciBwbGF5aW5nIHJpZ2h0IG1vbm8uKi8KKyNkZWZpbmUgQUMzX0RVQUxfTU9OT19NT0RFX1JJR0hUX01PTk8gICAgICAgICAgICAgICAgICgyKQorCisvKiBFbnVtZXJhdGlvbiBmb3IgbWl4aW5nIGJvdGggZHVhbCBtb25vIGNoYW5uZWxzIGFuZCBwbGF5aW5nIHRoZW0uKi8KKyNkZWZpbmUgQUMzX0RVQUxfTU9OT19NT0RFX01JWEVEX01PTk8gICAgICAgICgzKQorI2RlZmluZSBBU01fUEFSQU1fSURfQUMzX1NURVJFT19ET1dOTUlYX01PREUgMHgwMDAxMEQ3NgorCisvKiBFbnVtZXJhdGlvbiBmb3IgdXNpbmcgdGhlIERvd25taXggbW9kZSBpbmRpY2F0ZWQgaW4gdGhlIGJpdHN0cmVhbS4gKi8KKworI2RlZmluZSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9BVVRPX0RFVEVDVCAgKDApCisKKy8qIEVudW1lcmF0aW9uIGZvciBTdXJyb3VuZCBDb21wYXRpYmxlIG1vZGUgKHByZXNlcnZlcyB0aGUKKyAqIHN1cnJvdW5kIGluZm9ybWF0aW9uKS4KKyAqLworCisjZGVmaW5lIEFDM19TVEVSRU9fRE9XTk1JWF9NT0RFX0xUX1JUICAgICAgICAoMSkKKy8qIEVudW1lcmF0aW9uIGZvciBNb25vIENvbXBhdGlibGUgbW9kZSAoaWYgdGhlIG91dHB1dCBpcyB0byBiZQorICogZnVydGhlciBkb3dubWl4ZWQgdG8gbW9ubykuCisgKi8KKworI2RlZmluZSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9MT19STyAoMikKKworLyogSUQgb2YgdGhlIEFDMyBQQ00gc2NhbGUgZmFjdG9yIHBhcmFtZXRlciBpbiB0aGUKKyAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19QQ01fU0NBTEVGQUNUT1IgMHgwMDAxMEQ3OAorCisvKiBJRCBvZiB0aGUgQUMzIERSQyBib29zdCBzY2FsZSBmYWN0b3IgcGFyYW1ldGVyIGluIHRoZQorICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfQUMzX0RSQ19CT09TVF9TQ0FMRUZBQ1RPUiAweDAwMDEwRDc5CisKKy8qIElEIG9mIHRoZSBBQzMgRFJDIGN1dCBzY2FsZSBmYWN0b3IgcGFyYW1ldGVyIGluIHRoZQorICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfQUMzX0RSQ19DVVRfU0NBTEVGQUNUT1IgMHgwMDAxMEQ3QQorCisvKiBTdHJ1Y3R1cmUgZm9yIEFDMyBHZW5lcmljIFBhcmFtZXRlci4gKi8KKworLyogIFBheWxvYWQgb2YgdGhlIEFDMyBwYXJhbWV0ZXJzIGluIHRoZQorICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KKyAqLworc3RydWN0IGFzbV9hYzNfZ2VuZXJpY19wYXJhbSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7CisJc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7CisJdTMyICAgICAgICAgICAgICAgICAgZ2VuZXJpY19wYXJhbWV0ZXI7CisvKiBBQzMgZ2VuZXJpYyBwYXJhbWV0ZXIuIFNlbGVjdCBmcm9tIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiBwb3NzaWJsZSB2YWx1ZXMuCisgKgorICogRm9yICNBU01fUEFSQU1fSURfQUMzX0tBUkFPS0VfTU9ERSwgc3VwcG9ydGVkIHZhbHVlcyBhcmU6CisgKiAtIEFDM19LQVJBT0tFX01PREVfTk9fVk9DQUwKKyAqIC0gQUMzX0tBUkFPS0VfTU9ERV9MRUZUX1ZPQ0FMCisgKiAtIEFDM19LQVJBT0tFX01PREVfUklHSFRfVk9DQUwKKyAqIC0gQUMzX0tBUkFPS0VfTU9ERV9CT1RIX1ZPQ0FMCisgKgorICogRm9yICNBU01fUEFSQU1fSURfQUMzX0RSQ19NT0RFLCBzdXBwb3J0ZWQgdmFsdWVzIGFyZToKKyAqIC0gQUMzX0RSQ19NT0RFX0NVU1RPTV9BTkFMT0cKKyAqIC0gQUMzX0RSQ19NT0RFX0NVU1RPTV9ESUdJVEFMCisgKiAtIEFDM19EUkNfTU9ERV9MSU5FX09VVAorICogLSBBQzNfRFJDX01PREVfUkZfUkVNT0QKKyAqCisgKiBGb3IgI0FTTV9QQVJBTV9JRF9BQzNfRFVBTF9NT05PX01PREUsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlOgorICogLSBBQzNfRFVBTF9NT05PX01PREVfU1RFUkVPCisgKiAtIEFDM19EVUFMX01PTk9fTU9ERV9MRUZUX01PTk8KKyAqIC0gQUMzX0RVQUxfTU9OT19NT0RFX1JJR0hUX01PTk8KKyAqIC0gQUMzX0RVQUxfTU9OT19NT0RFX01JWEVEX01PTk8KKyAqCisgKiBGb3IgI0FTTV9QQVJBTV9JRF9BQzNfU1RFUkVPX0RPV05NSVhfTU9ERSwgc3VwcG9ydGVkIHZhbHVlcyBhcmU6CisgKiAtIEFDM19TVEVSRU9fRE9XTk1JWF9NT0RFX0FVVE9fREVURUNUCisgKiAtIEFDM19TVEVSRU9fRE9XTk1JWF9NT0RFX0xUX1JUCisgKiAtIEFDM19TVEVSRU9fRE9XTk1JWF9NT0RFX0xPX1JPCisgKgorICogRm9yICNBU01fUEFSQU1fSURfQUMzX1BDTV9TQ0FMRUZBQ1RPUiwgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAqIDAgdG8gMSBpbiBRMzEgZm9ybWF0LgorICoKKyAqIEZvciAjQVNNX1BBUkFNX0lEX0FDM19EUkNfQk9PU1RfU0NBTEVGQUNUT1IsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlCisgKiAwIHRvIDEgaW4gUTMxIGZvcm1hdC4KKyAqCisgKiBGb3IgI0FTTV9QQVJBTV9JRF9BQzNfRFJDX0NVVF9TQ0FMRUZBQ1RPUiwgc3VwcG9ydGVkIHZhbHVlcyBhcmUKKyAqIDAgdG8gMSBpbiBRMzEgZm9ybWF0LgorICovCit9IF9fcGFja2VkOworCisvKiBFbnVtZXJhdGlvbiBmb3IgUmF3IG1vZGUgKG5vIGRvd25taXhpbmcpLCB3aGljaCBzcGVjaWZpZXMKKyAqIHRoYXQgYWxsIGNoYW5uZWxzIGluIHRoZSBiaXRzdHJlYW0gYXJlIHRvIGJlIHBsYXllZCBvdXQgYXMgaXMKKyAqIHdpdGhvdXQgYW55IGRvd25taXhpbmcuIChEZWZhdWx0KQorICovCisKKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS19SQVcgKC0xKQorCisvKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgY2hhbm5lbCBtYXNrIHRvIDAuIFRoZSA3LjEgbW9kZQorICogKEhvbWUgVGhlYXRlcikgaXMgYXNzaWduZWQuCisgKi8KKworCisjZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfWkVSTyAweDAwMDAKKworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3Igb25lIGNoYW5uZWwgKEhvbWUgVGhlYXRlciwgbW9ubykuCisgKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS18xX0MgMHgwMDA0CisKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHR3byBjaGFubmVscyAoSG9tZSBUaGVhdGVyLCBzdGVyZW8pLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICovCisjZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfMl9MX1IgMHgwMDAzCisKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHRocmVlIGNoYW5uZWxzIChIb21lIFRoZWF0ZXIpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICovCisjZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfM19MX0NfUiAweDAwMDcKKworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgdHdvIGNoYW5uZWxzIChzdGVyZW8pLgorICogLSBTcGVha2VyIGJhY2sgbGVmdAorICogLSBTcGVha2VyIGJhY2sgcmlnaHQKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzJfQmxfQnIgIDB4MDAzMAorCisvKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBmb3VyIGNoYW5uZWxzLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGJhY2sgbGVmdAorICogLSBTcGVha2VyIGJhY2sgcmlnaHQKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzRfTF9SX0JsX0JyIDB4MDAzMworCisvKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBmb3VyIGNoYW5uZWxzIChIb21lIFRoZWF0ZXIpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICogLSBTcGVha2VyIGJhY2sgY2VudGVyCisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS180X0xfUl9DX0JjX0hUIDB4MDEwNworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZml2ZSBjaGFubmVscy4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBiYWNrIGxlZnQKKyAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0CisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS181X0xfQ19SX0JsX0JyICAweDAwMzcKKworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZml2ZSBjaGFubmVscyAoNSBtb2RlLCBIb21lIFRoZWF0ZXIpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICogLSBTcGVha2VyIHNpZGUgbGVmdAorICogLSBTcGVha2VyIHNpZGUgcmlnaHQKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzVfTF9DX1JfU2xfU3JfSFQgICAweDA2MDcKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNpeCBjaGFubmVscyAoNS4xIG1vZGUpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICogLSBTcGVha2VyIGxvdyBmcmVxdWVuY3kKKyAqIC0gU3BlYWtlciBiYWNrIGxlZnQKKyAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0CisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS181RE9UMV9MX0NfUl9CbF9Ccl9TTEYgIDB4MDAzRgorLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3Igc2l4IGNoYW5uZWxzICg1LjEgbW9kZSwgSG9tZSBUaGVhdGVyKS4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5CisgKiAtIFNwZWFrZXIgc2lkZSBsZWZ0CisgKiAtIFNwZWFrZXIgc2lkZSByaWdodAorICovCisjZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNURPVDFfTF9DX1JfU2xfU3JfU0xGX0hUICAweDA2MEYKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNpeCBjaGFubmVscyAoNS4xIG1vZGUsIG5vIExGRSkuCisgKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAorICogLSBTcGVha2VyIGZyb250IHJpZ2h0CisgKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCisgKiAtIFNwZWFrZXIgYmFjayBsZWZ0CisgKiAtIFNwZWFrZXIgYmFjayByaWdodAorICogLSBTcGVha2VyIGJhY2sgY2VudGVyCisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS181RE9UMV9MX0NfUl9CbF9Ccl9CYyAgMHgwMTM3CisvKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBzaXggY2hhbm5lbHMgKDUuMSBtb2RlLCBIb21lIFRoZWF0ZXIsCisgKiBubyBMRkUpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICogLSBTcGVha2VyIGJhY2sgY2VudGVyCisgKiAtIFNwZWFrZXIgc2lkZSBsZWZ0CisgKiAtIFNwZWFrZXIgc2lkZSByaWdodAorICovCisjZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNURPVDFfTF9DX1JfU2xfU3JfQmNfSFQgICAweDA3MDcKKworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3Igc2V2ZW4gY2hhbm5lbHMgKDYuMSBtb2RlKS4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5CisgKiAtIFNwZWFrZXIgYmFjayBsZWZ0CisgKiAtIFNwZWFrZXIgYmFjayByaWdodAorICogLSBTcGVha2VyIGJhY2sgY2VudGVyCisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS182RE9UMV9MX0NfUl9CbF9Ccl9CY19TTEYgICAweDAxM0YKKworLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3Igc2V2ZW4gY2hhbm5lbHMgKDYuMSBtb2RlLCBIb21lCisgKiBUaGVhdGVyKS4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5CisgKiAtIFNwZWFrZXIgYmFjayBjZW50ZXIKKyAqIC0gU3BlYWtlciBzaWRlIGxlZnQKKyAqIC0gU3BlYWtlciBzaWRlIHJpZ2h0CisgKi8KKyNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS182RE9UMV9MX0NfUl9TbF9Tcl9CY19TTEZfSFQgMHgwNzBGCisKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNldmVuIGNoYW5uZWxzICg2LjEgbW9kZSwgbm8gTEZFKS4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBiYWNrIGxlZnQKKyAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0CisgKiAtIFNwZWFrZXIgZnJvbnQgbGVmdCBvZiBjZW50ZXIKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodCBvZiBjZW50ZXIKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzZET1QxX0xfQ19SX0JsX0JyX1NGTE9DX1NGUk9DICAgMHgwMEY3CisKKy8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNldmVuIGNoYW5uZWxzICg2LjEgbW9kZSwgSG9tZQorICogVGhlYXRlciwgbm8gTEZFKS4KKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0CisgKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKKyAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKKyAqIC0gU3BlYWtlciBzaWRlIGxlZnQKKyAqIC0gU3BlYWtlciBzaWRlIHJpZ2h0CisgKiAtIFNwZWFrZXIgZnJvbnQgbGVmdCBvZiBjZW50ZXIKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodCBvZiBjZW50ZXIKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzZET1QxX0xfQ19SX1NsX1NyX1NGTE9DX1NGUk9DX0hUIDB4MDYzNworCisvKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBlaWdodCBjaGFubmVscyAoNy4xIG1vZGUpLgorICogLSBTcGVha2VyIGZyb250IGxlZnQKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodAorICogLSBTcGVha2VyIGZyb250IGNlbnRlcgorICogLSBTcGVha2VyIGJhY2sgbGVmdAorICogLSBTcGVha2VyIGJhY2sgcmlnaHQKKyAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5CisgKiAtIFNwZWFrZXIgZnJvbnQgbGVmdCBvZiBjZW50ZXIKKyAqIC0gU3BlYWtlciBmcm9udCByaWdodCBvZiBjZW50ZXIKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzdET1QxX0xfQ19SX0JsX0JyX1NMRl9TRkxPQ19TRlJPQyBcCisJCQkJCTB4MDBGRgorCisvKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBlaWdodCBjaGFubmVscyAoNy4xIG1vZGUsIEhvbWUgVGhlYXRlcikuCisgKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAorICogLSBTcGVha2VyIGZyb250IHJpZ2h0CisgKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCisgKiAtIFNwZWFrZXIgc2lkZSBsZWZ0CisgKiAtIFNwZWFrZXIgc2lkZSByaWdodAorICogLSBTcGVha2VyIGxvdyBmcmVxdWVuY3kKKyAqIC0gU3BlYWtlciBmcm9udCBsZWZ0IG9mIGNlbnRlcgorICogLSBTcGVha2VyIGZyb250IHJpZ2h0IG9mIGNlbnRlcgorICoKKyAqLworI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzdET1QxX0xfQ19SX1NsX1NyX1NMRl9TRkxPQ19TRlJPQ19IVCBcCisJCQkJCTB4MDYzRgorCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9ERUNfT1VUUFVUX0NIQU5fTUFQICAweDAwMDEwRDgyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGRlY29kZXIgb3V0cHV0IGNoYW5uZWxzLiAqLworI2RlZmluZSBNQVhfQ0hBTl9NQVBfQ0hBTk5FTFMgIDE2CisKKy8qIFN0cnVjdHVyZSBmb3IgZGVjb2RlciBvdXRwdXQgY2hhbm5lbCBtYXBwaW5nLiAqLworCisvKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX0RFQ19PVVRQVVRfQ0hBTl9NQVAgcGFyYW1ldGVyIGluIHRoZQorICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KKyAqLworc3RydWN0IGFzbV9kZWNfb3V0X2NoYW5fbWFwX3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gIGVuY2RlYzsKKwl1MzIgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKKy8qIE51bWJlciBvZiBkZWNvZGVyIG91dHB1dCBjaGFubmVscy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gI01BWF9DSEFOX01BUF9DSEFOTkVMUworICoKKyAqIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgbmF0aXZlIGNoYW5uZWwgbWFwcGluZywgd2hpY2ggaXMgdmFsaWQKKyAqIG9ubHkgZm9yIE5UIG1vZGUuIFRoaXMgbWVhbnMgdGhlIG91dHB1dCBvZiB0aGUgZGVjb2RlciBpcyB0byBiZQorICogcHJlc2VydmVkIGFzIGlzLgorICovCisJdTggICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbTUFYX0NIQU5fTUFQX0NIQU5ORUxTXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VEICAweDAwMDEwRDg0CisKKy8qIEJpdG1hc2sgZm9yIHRoZSBJRUMgNjE5MzcgZW5hYmxlIGZsYWcuKi8KKyNkZWZpbmUgQVNNX0JJVF9NQVNLX0lFQ182MTkzN19TVFJFQU1fRkxBRyAgICgweDAwMDAwMDAxVUwpCisKKy8qIFNoaWZ0IHZhbHVlIGZvciB0aGUgSUVDIDYxOTM3IGVuYWJsZSBmbGFnLiovCisjZGVmaW5lIEFTTV9TSElGVF9JRUNfNjE5MzdfU1RSRUFNX0ZMQUcgIDAKKworLyogQml0bWFzayBmb3IgdGhlIElFQyA2MDk1OCBlbmFibGUgZmxhZy4qLworI2RlZmluZSBBU01fQklUX01BU0tfSUVDXzYwOTU4X1NUUkVBTV9GTEFHICAgKDB4MDAwMDAwMDJVTCkKKworLyogU2hpZnQgdmFsdWUgZm9yIHRoZSBJRUMgNjA5NTggZW5hYmxlIGZsYWcuKi8KKyNkZWZpbmUgQVNNX1NISUZUX0lFQ182MDk1OF9TVFJFQU1fRkxBRyAgIDEKKworLyogUGF5bG9hZCBmb3JtYXQgZm9yIG9wZW4gd3JpdGUgY29tcHJlc3NlZCBjb21tYW5kICovCisKKy8qIFBheWxvYWQgZm9ybWF0IGZvciB0aGUgI0FTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfQ09NUFJFU1NFRAorICogY29tbWFuZCwgd2hpY2ggb3BlbnMgYSBzdHJlYW0gZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBJRCBhbmQgc3RyZWFtIElECisgKiB0byBiZSByZW5kZXJlZCBpbiB0aGUgY29tcHJlc3NlZCBmb3JtYXQuCisgKi8KKworc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fd3JpdGVfY29tcHJlc3NlZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisvKiBNb2RlIGZsYWdzIHRoYXQgY29uZmlndXJlIHRoZSBzdHJlYW0gZm9yIGEgc3BlY2lmaWMgZm9ybWF0LgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gQml0IDAgLS0gSUVDIDYxOTM3IGNvbXBhdGliaWxpdHkKKyAqICAgLSAwIC0tIFN0cmVhbSBpcyBub3QgaW4gSUVDIDYxOTM3IGZvcm1hdAorICogICAtIDEgLS0gU3RyZWFtIGlzIGluIElFQyA2MTkzNyBmb3JtYXQKKyAqIC0gQml0IDEgLS0gSUVDIDYwOTU4IGNvbXBhdGliaWxpdHkKKyAqICAgLSAwIC0tIFN0cmVhbSBpcyBub3QgaW4gSUVDIDYwOTU4IGZvcm1hdAorICogICAtIDEgLS0gU3RyZWFtIGlzIGluIElFQyA2MDk1OCBmb3JtYXQKKyAqIC0gQml0cyAyIHRvIDMxIC0tIDAgKFJlc2VydmVkKQorICoKKyAqIEZvciB0aGUgc2FtZSBzdHJlYW0sIGJpdCAwIGNhbm5vdCBiZSBzZXQgdG8gMCBhbmQgYml0IDEgY2Fubm90CisgKiBiZSBzZXQgdG8gMS4gQSBjb21wcmVzc2VkIHN0cmVhbSBjb25ub3QgaGF2ZSBJRUMgNjA5NTgKKyAqIHBhY2tldGl6YXRpb24gYXBwbGllZCB3aXRob3V0IElFQyA2MTkzNyBwYWNrZXRpemF0aW9uLgorICogQG5vdGUxaGFuZyBDdXJyZW50bHksIElFQyA2MDk1OCBwYWNrZXRpemVkIGlucHV0IHN0cmVhbXMgYXJlIG5vdAorICogc3VwcG9ydGVkLgorICovCisKKworCXUzMiAgICAgICAgICAgICAgICAgICAgZm10X2lkOworLyogU3BlY2lmaWVzIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSBIRE1JIHN0cmVhbSB0byBiZSBvcGVuZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX01FRElBX0ZNVF9BQzMKKyAqIC0gI0FTTV9NRURJQV9GTVRfRUFDMworICogLSAjQVNNX01FRElBX0ZNVF9EVFMKKyAqIC0gI0FTTV9NRURJQV9GTVRfQVRSQUMKKyAqIC0gI0FTTV9NRURJQV9GTVRfTUFUCisgKgorICogQG5vdGUxaGFuZyBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGEgdmFsaWQgbWVkaWEgdHlwZSBldmVuIGlmCisgKiBJRUMgNjE5MzcgcGFja2V0aXphdGlvbiBpcyBub3QgcGVyZm9ybWVkIGJ5IHRoZSBhRFNQLgorICovCisKK30gX19wYWNrZWQ7CisKKworLyogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCB0byBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAqLworI2RlZmluZSBBU01fREFUQV9DTURfUkVNT1ZFX0lOSVRJQUxfU0lMRU5DRSAweDAwMDEwRDY3CisKKy8qIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgdG8gYmUgcmVtb3ZlZCBmcm9tCisgKiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgKi8KKyNkZWZpbmUgQVNNX0RBVEFfQ01EX1JFTU9WRV9UUkFJTElOR19TSUxFTkNFIDB4MDAwMTBENjgKKworc3RydWN0IGFzbV9kYXRhX2NtZF9yZW1vdmVfc2lsZW5jZSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMgludW1fc2FtcGxlc190b19yZW1vdmU7CisJLyogPCBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCB0byBiZSByZW1vdmVkLgorCSAqIEB2YWx1ZXMgMCB0byAoMkBzc2NyezMyfS0xKQorCSAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfQ09NUFJFU1NFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEOTUKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZF9jb21wcmVzc2VkIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOworLyogTW9kZSBmbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgbWV0YSBpbmZvcm1hdGlvbiBwZXIgZW5jb2RlZAorICogZnJhbWUgaXMgdG8gYmUgcHJvdmlkZWQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBiaXQgNDoKKyAqIC0gMCAtLSBSZXR1cm4gZGF0YSBidWZmZXIgY29udGFpbnMgYWxsIGVuY29kZWQgZnJhbWVzIG9ubHk7IGl0IGRvZXMKKyAqICAgICAgbm90IGNvbnRhaW4gZnJhbWUgbWV0YWRhdGEuCisgKiAtIDEgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFuIGFycmF5IG9mIG1ldGFkYXRhIGFuZCBlbmNvZGVkCisgKiAgICAgIGZyYW1lcy4KKyAqIC0gVXNlICNBU01fQklUX01BU0tfTUVUQV9JTkZPX0ZMQUcgdG8gc2V0IHRoZSBiaXRtYXNrIGFuZAorICogI0FTTV9TSElGVF9NRVRBX0lORk9fRkxBRyB0byBzZXQgdGhlIHNoaWZ0IHZhbHVlIGZvciB0aGlzIGJpdC4KKyAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZDsgY2xpZW50cyBtdXN0IHNldCB0aGVtIHRvIHplcm8uCisgKi8KKworCXUzMiAgICAgICAgICAgICAgICAgICAgZnJhbWVzX3Blcl9idWY7CisvKiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBuZWVkIHRvIGJlIHJldHVybmVkIHBlcgorICogcmVhZCBidWZmZXIKKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAorICovCisKK30gX19wYWNrZWQ7CisKKy8qIGFkc3BfYXNtX3N0cmVhbV9jb21tYW5kcy5oKi8KKworCisvKiBhZHNwX2FzbV9hcGkuaCAobm8gY2hhbmdlcykqLworI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX0RFRkFVTFQgXAorCQkJCQkJCQkweDAwMDEwQkU0CisjZGVmaW5lIEFTTV9TVFJFQU1fUE9TVFBST0NPUE9fSURfUEVBS01FVEVSIFwKKwkJCQkJCQkJMHgwMDAxMEQ4MworI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX05PTkUgXAorCQkJCQkJCQkweDAwMDEwQzY4CisjZGVmaW5lIEFTTV9TVFJFQU1fUE9TVFBST0NPUE9fSURfTUNIX1BFQUtfVk9MIFwKKwkJCQkJCQkJMHgwMDAxMEQ4QgorI2RlZmluZSBBU01fU1RSRUFNX1BSRVBST0NPUE9fSURfREVGQVVMVCBcCisJCQlBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX0RFRkFVTFQKKyNkZWZpbmUgQVNNX1NUUkVBTV9QUkVQUk9DT1BPX0lEX05PTkUgXAorCQkJQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9OT05FCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9OT05FX0FVRElPX0NPUFAgXAorCQkJMHgwMDAxMDMxMgorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfU1BFQUtFUl9NT05PX0FVRElPX0NPUFAgXAorCQkJCQkJCQkweDAwMDEwMzEzCisjZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9TUEVBS0VSX1NURVJFT19BVURJT19DT1BQIFwKKwkJCQkJCQkJMHgwMDAxMDMxNAorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfU1BFQUtFUl9TVEVSRU9fSUlSX0FVRElPX0NPUFBcCisJCQkJCQkJCTB4MDAwMTA3MDQKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfTU9OT19BVURJT19DT1BQX01CRFJDVjJcCisJCQkJCQkJCTB4MDAwMTA3MEQKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfU1RFUkVPX0FVRElPX0NPUFBfTUJEUkNWMlwKKwkJCQkJCQkJMHgwMDAxMDcwRQorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfU1BFQUtFUl9TVEVSRU9fSUlSX0FVRElPX0NPUFBfTUJEUkNWMlwKKwkJCQkJCQkJMHgwMDAxMDcwRgorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfU1BFQUtFUl9TVEVSRU9fQVVESU9fQ09QUF9NQkRSQ19WMyBcCisJCQkJCQkJCTB4MTEwMDAwMDAKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfTUNIX1BFQUtfVk9MIFwKKwkJCQkJCQkJMHgwMDAxMDMxQgorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfTUlDX01PTk9fQVVESU9fQ09QUCAgMHgwMDAxMDMxNQorI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfTUlDX1NURVJFT19BVURJT19DT1BQIDB4MDAwMTAzMTYKKyNkZWZpbmUgQVVEUFJPQ19DT1BQT1BPTE9HWV9JRF9NQ0hBTl9JSVJfQVVESU8gICAgICAgICAgIDB4MDAwMTA3MTUKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX0RFRkFVTFRfQVVESU9fQ09QUCAgIDB4MDAwMTBCRTMKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1BFQUtNRVRFUl9BVURJT19DT1BQIDB4MDAwMTAzMTcKKyNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfQUlHICAgMHgwMDAxMDcxNgorI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FJR19FTkFCTEUJCTB4MDAwMTA3MTcKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BSUdfQ09ORklHCQkweDAwMDEwNzE4CisKK3N0cnVjdCBBdWRpb19BaWdQYXJhbSB7CisJdWludDE2X3QJbW9kZTsKKy8qPCBNb2RlIHdvcmQgZm9yIGVuYWJsaW5nIEFJRy9TSUcgbW9kZSAuCisgKiBCeXRlIG9mZnNldDogMAorICovCisJaW50MTZfdAkJc3RhdGljR2FpbkwxNlExMjsKKy8qPCBTdGF0aWMgaW5wdXQgZ2FpbiB3aGVuIGFpZ01vZGUgaXMgc2V0IHRvIDEuCisgKiBCeXRlIG9mZnNldDogMgorICovCisJaW50MTZfdAkJaW5pdGlhbEdhaW5EQkwxNlE3OworLyo8SW5pdGlhbCB2YWx1ZSB0aGF0IHRoZSBhZGFwdGl2ZSBnYWluIHVwZGF0ZSBzdGFydHMgZnJvbSBkQgorICogUTcgQnl0ZSBvZmZzZXQ6IDQKKyAqLworCWludDE2X3QJCWlkZWFsUk1TREJMMTZRNzsKKy8qPEF2ZXJhZ2UgUk1TIGxldmVsIHRoYXQgQUlHIGF0dGVtcHRzIHRvIGFjaGlldmUgUTguNworICogQnl0ZSBvZmZzZXQ6IDYKKyAqLworCWludDMyX3QJCW5vaXNlR2F0ZUwzMjsKKy8qVGhyZXNob2xkIGJlbG93IHdoaWNoIHNpZ25hbCBpcyBjb25zaWRlcmVkIGFzIG5vaXNlIGFuZCBBSUcKKyAqIEJ5dGUgb2Zmc2V0OiA4CisgKi8KKwlpbnQzMl90CQltaW5HYWluTDMyUTE1OworLypNaW5pbXVtIGdhaW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgQUlHIFExNi4xNQorICogQnl0ZSBvZmZzZXQ6IDEyCisgKi8KKwlpbnQzMl90CQltYXhHYWluTDMyUTE1OworLypNYXhpbXVtIGdhaW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgQUlHIFExNi4xNQorICogQnl0ZSBvZmZzZXQ6IDE2CisgKi8KKwl1aW50MzJfdAkJZ2FpbkF0UnRVTDMyUTMxOworLypBdHRhY2svcmVsZWFzZSB0aW1lIGZvciBBSUcgdXBkYXRlIFExLjMxCisgKiBCeXRlIG9mZnNldDogMjAKKyAqLworCXVpbnQzMl90CQlsb25nR2FpbkF0UnRVTDMyUTMxOworLypMb25nIGF0dGFjay9yZWxlYXNlIHRpbWUgd2hpbGUgdXBkYXRpbmcgZ2FpbiBmb3IKKyAqIG5vaXNlL3NpbGVuY2UgUTEuMzEgQnl0ZSBvZmZzZXQ6IDI0CisgKi8KKworCXVpbnQzMl90CQlybXNUYXZVTDMyUTMyOworLyogUk1TIHNtb290aGluZyB0aW1lIGNvbnN0YW50IHVzZWQgZm9yIGxvbmctdGVybSBSTVMgZXN0aW1hdGUKKyAqIFEwLjMyIEJ5dGUgb2Zmc2V0OiAyOAorICovCisKKwl1aW50MzJfdAkJZ2FpblVwZGF0ZVN0YXJ0VGltTXNVTDMyUTA7CisvKiBUaGUgd2FpdGluZyB0aW1lIGJlZm9yZSB3aGljaCBBSUcgc3RhcnRzIHRvIGFwcGx5IGFkYXB0aXZlCisgKiBnYWluIHVwZGF0ZSBRMzIuMCBCeXRlIG9mZnNldDogMzIKKyAqLworCit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQURNX01PRFVMRV9JRF9FQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDNEEKKyNkZWZpbmUgQURNX1BBUkFNX0lEX0VBTlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDNEIKKyNkZWZpbmUgQURNX1BBUkFNX0lEX0VBTlNfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDNEMKKworc3RydWN0IGFkbV9lYW5zX2VuYWJsZSB7CisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOworLyo8IFNwZWNpZmllcyB3aGV0aGVyIEVBTlMgaXMgZGlzYWJsZWQgKDApIG9yIGVuYWJsZWQKKyAqIChub256ZXJvKS4KKyAqIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHNhbXBsaW5nIHJhdGVzIG9mIDgsIDEyLCAxNiwgMjQsIDMyLAorICogYW5kIDQ4IGtIei4gSXQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2FtcGxpbmcgcmF0ZXMgb2YgMTEuMDI1LAorICogMjIuMDUsIG9yIDQ0LjEga0h6LgorICovCisKK30gX19wYWNrZWQ7CisKKworc3RydWN0IGFkbV9lYW5zX3BhcmFtcyB7CisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX21vZGU7CisvKjwgTW9kZSB3b3JkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgc3VibW9kdWxlcy4KKyAqIEJ5dGUgb2Zmc2V0OiAwCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19pbnB1dF9nYWluOworLyo8IFEyLjEzIGlucHV0IGdhaW4gdG8gdGhlIEVBTlMgbW9kdWxlLgorICogQnl0ZSBvZmZzZXQ6IDIKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX291dHB1dF9nYWluOworLyo8IFEyLjEzIG91dHB1dCBnYWluIHRvIHRoZSBFQU5TIG1vZHVsZS4KKyAqIEJ5dGUgb2Zmc2V0OiA0CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc2FyZ2V0X25zOworLyo8IFRhcmdldCBub2lzZSBzdXBwcmVzc2lvbiBsZXZlbCBpbiBkQi4KKyAqIEJ5dGUgb2Zmc2V0OiA2CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19zX2FscGhhOworLyo8IFEzLjEyIG92ZXItc3VidHJhY3Rpb24gZmFjdG9yIGZvciBzdGF0aW9uYXJ5IG5vaXNlCisgKiBzdXBwcmVzc2lvbi4KKyAqIEJ5dGUgb2Zmc2V0OiA4CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uX2FscGhhOworLyogPCBRMy4xMiBvdmVyLXN1YnRyYWN0aW9uIGZhY3RvciBmb3Igbm9uc3RhdGlvbmFyeSBub2lzZQorICogc3VwcHJlc3Npb24uCisgKiBCeXRlIG9mZnNldDogMTAKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX25fYWxwaGFtYXg7CisvKjwgUTMuMTIgbWF4aW11bSBvdmVyLXN1YnRyYWN0aW9uIGZhY3RvciBmb3Igbm9uc3RhdGlvbmFyeQorICogbm9pc2Ugc3VwcHJlc3Npb24uCisgKiBCeXRlIG9mZnNldDogMTIKKyAqLworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19lX2FscGhhOworLyo8IFExNSBzY2FsaW5nIGZhY3RvciBmb3IgZXhjZXNzIG5vaXNlIHN1cHByZXNzaW9uLgorICogQnl0ZSBvZmZzZXQ6IDE0CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uc19zbnJtYXg7CisvKjwgVXBwZXIgYm91bmRhcnkgaW4gZEIgZm9yIFNOUiBlc3RpbWF0aW9uLgorICogQnl0ZSBvZmZzZXQ6IDE2CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19zbnNfYmxvY2s7CisvKjwgUXVhcnRlciBibG9jayBzaXplIGZvciBzdGF0aW9uYXJ5IG5vaXNlIHN1cHByZXNzaW9uLgorICogQnl0ZSBvZmZzZXQ6IDE4CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uc19pOworLyo8IEluaXRpYWxpemF0aW9uIGJsb2NrIHNpemUgZm9yIG5vaXNlIHN1cHByZXNzaW9uLgorICogQnl0ZSBvZmZzZXQ6IDIwCisgKi8KKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbnBfc2NhbGU7CisvKjwgUG93ZXIgc2NhbGUgZmFjdG9yIGZvciBub25zdGF0aW9uYXJ5IG5vaXNlIHVwZGF0ZS4KKyAqIEJ5dGUgb2Zmc2V0OiAyMgorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbl9sYW1iZGE7CisvKjwgU21vb3RoaW5nIGZhY3RvciBmb3IgaGlnaGVyIGxldmVsIG5vbnN0YXRpb25hcnkgbm9pc2UKKyAqIHVwZGF0ZS4KKyAqIEJ5dGUgb2Zmc2V0OiAyNAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbl9sYW1iZGFmOworLyo8IE1lZGl1bSBhdmVyYWdpbmcgZmFjdG9yIGZvciBub2lzZSB1cGRhdGUuCisgKiBCeXRlIG9mZnNldDogMjYKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX2dzX2JpYXM7CisvKjwgQmlhcyBmYWN0b3IgaW4gZEIgZm9yIGdhaW4gY2FsY3VsYXRpb24uCisgKiBCeXRlIG9mZnNldDogMjgKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX2dzX21heDsKKy8qPCBTTlIgbG93ZXIgYm91bmRhcnkgaW4gZEIgZm9yIGFnZ3Jlc3NpdmUgZ2FpbiBjYWxjdWxhdGlvbi4KKyAqIEJ5dGUgb2Zmc2V0OiAzMAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfc19hbHBoYV9oYjsKKy8qPCBRMy4xMiBvdmVyLXN1YnRyYWN0aW9uIGZhY3RvciBmb3IgaGlnaC1iYW5kIHN0YXRpb25hcnkKKyAqIG5vaXNlIHN1cHByZXNzaW9uLgorICogQnl0ZSBvZmZzZXQ6IDMyCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uX2FscGhhbWF4X2hiOworLyo8IFEzLjEyIG1heGltdW0gb3Zlci1zdWJ0cmFjdGlvbiBmYWN0b3IgZm9yIGhpZ2gtYmFuZAorICogbm9uc3RhdGlvbmFyeSBub2lzZSBzdXBwcmVzc2lvbi4KKyAqIEJ5dGUgb2Zmc2V0OiAzNAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfZV9hbHBoYV9oYjsKKy8qPCBRMTUgc2NhbGluZyBmYWN0b3IgZm9yIGhpZ2gtYmFuZCBleGNlc3Mgbm9pc2Ugc3VwcHJlc3Npb24uCisgKiBCeXRlIG9mZnNldDogMzYKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX25fbGFtYmRhMDsKKy8qPCBTbW9vdGhpbmcgZmFjdG9yIGZvciBub25zdGF0aW9uYXJ5IG5vaXNlIHVwZGF0ZSBkdXJpbmcKKyAqIHNwZWVjaCBhY3Rpdml0eS4KKyAqIEJ5dGUgb2Zmc2V0OiAzOAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaDsKKy8qPCBUaHJlc2hvbGQgZm9yIGdlbmVyYXRpbmcgYSBiaW5hcnkgVkFEIGRlY2lzaW9uLgorICogQnl0ZSBvZmZzZXQ6IDQwCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgcHdyX3NjYWxlOworLyo8IEluZGlyZWN0IGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBub2lzZSBsZXZlbCBlc3RpbWF0ZS4KKyAqIEJ5dGUgb2Zmc2V0OiA0MgorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdvdmVyX21heDsKKy8qPCBBdm9pZHMgbWlkLXNwZWVjaCBjbGlwcGluZyBhbmQgcmVsaWFibHkgZGV0ZWN0cyB3ZWFrIHNwZWVjaAorICogYnVyc3RzIGF0IHRoZSBlbmQgb2Ygc3BlZWNoIGFjdGl2aXR5LgorICogQnl0ZSBvZmZzZXQ6IDQ0CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfc25yOworLyo8IENvbnRyb2xzIHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBWQUQuCisgKiBCeXRlIG9mZnNldDogNDYKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBzbnJfZGlmZl9tYXg7CisvKjwgTWF4aW11bSBTTlIgZGlmZmVyZW5jZS4gRGVjcmVhc2luZyB0aGlzIHBhcmFtZXRlciB2YWx1ZSBtYXkKKyAqIGhlbHAgaW4gbWFraW5nIGNvcnJlY3QgZGVjaXNpb25zIGR1cmluZyBhYnJ1cHQgY2hhbmdlczsgaG93ZXZlciwKKyAqIGRlY3JlYXNpbmcgdG9vIG11Y2ggbWF5IGluY3JlYXNlIGZhbHNlIGFsYXJtcyBkdXJpbmcgbG9uZworICogcGF1c2VzL3NpbGVuY2VzLgorICogQnl0ZSBvZmZzZXQ6IDQ4CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgc25yX2RpZmZfbWluOworLyo8IE1pbmltdW0gU05SIGRpZmZlcmVuY2UuIERlY3JlYXNpbmcgdGhpcyBwYXJhbWV0ZXIgdmFsdWUgbWF5CisgKiBoZWxwIGluIG1ha2luZyBjb3JyZWN0IGRlY2lzaW9ucyBkdXJpbmcgYWJydXB0IGNoYW5nZXM7IGhvd2V2ZXIsCisgKiBkZWNyZWFzaW5nIHRvbyBtdWNoIG1heSBpbmNyZWFzZSBmYWxzZSBhbGFybXMgZHVyaW5nIGxvbmcKKyAqIHBhdXNlcy9zaWxlbmNlcy4KKyAqIEJ5dGUgb2Zmc2V0OiA1MAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbGVuZ3RoOworLyo8IERlZmluZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgZm9yIHdoaWNoIGEgbm9pc2UgbGV2ZWwKKyAqIGVzdGltYXRlIGlzIHNldCB0byBhIGZpeGVkIHZhbHVlLgorICogQnl0ZSBvZmZzZXQ6IDUyCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbDsKKy8qPCBEZWZpbmVzIHRoZSB1cHBlciBsaW1pdCBvZiB0aGUgbm9pc2UgbGV2ZWwuCisgKiBCeXRlIG9mZnNldDogNTQKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2JvdW5kOworLyo8IERlZmluZXMgdGhlIGluaXRpYWwgYm91bmRpbmcgdmFsdWUgZm9yIHRoZSBub2lzZSBsZXZlbAorICogZXN0aW1hdGUuIFRoaXMgaXMgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgc2VnbWVudCBkZWZpbmVkIGJ5IHRoZQorICogaW5pdF9sZW5ndGggcGFyYW1ldGVyLgorICogQnl0ZSBvZmZzZXQ6IDU2CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfYm91bmQ7CisvKjwgUmVzZXQgYm91bmRhcnkgZm9yIG5vaXNlIHRyYWNraW5nLgorICogQnl0ZSBvZmZzZXQ6IDU4CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgYXZhcl9zY2FsZTsKKy8qPCBEZWZpbmVzIHRoZSBiaWFzIGZhY3RvciBpbiBub2lzZSBlc3RpbWF0aW9uLgorICogQnl0ZSBvZmZzZXQ6IDYwCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX25jOworLyo8IERlZmluZXMgdGhlIHdpbmRvdyBsZW5ndGggZm9yIG5vaXNlIGVzdGltYXRpb24uCisgKiBCeXRlIG9mZnNldDogNjIKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBzcG93X21pbjsKKy8qPCBEZWZpbmVzIHRoZSBtaW5pbXVtIHNpZ25hbCBwb3dlciByZXF1aXJlZCB0byB1cGRhdGUgdGhlCisgKiBib3VuZGFyaWVzIGZvciB0aGUgbm9pc2UgZmxvb3IgZXN0aW1hdGUuCisgKiBCeXRlIG9mZnNldDogNjQKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX2dzX2Zhc3Q7CisvKjwgRmFzdCBzbW9vdGhpbmcgZmFjdG9yIGZvciBwb3N0cHJvY2Vzc29yIGdhaW4uCisgKiBCeXRlIG9mZnNldDogNjYKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX2dzX21lZDsKKy8qPCBNZWRpdW0gc21vb3RoaW5nIGZhY3RvciBmb3IgcG9zdHByb2Nlc3NvciBnYWluLgorICogQnl0ZSBvZmZzZXQ6IDY4CisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19nc19zbG93OworLyo8IFNsb3cgc21vb3RoaW5nIGZhY3RvciBmb3IgcG9zdHByb2Nlc3NvciBnYWluLgorICogQnl0ZSBvZmZzZXQ6IDcwCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19zd2Jfc2FscGhhOworLyo8IFEzLjEyIHN1cGVyIHdpZGViYW5kIGFnZ3Jlc3NpdmVuZXNzIGZhY3RvciBmb3Igc3RhdGlvbmFyeQorICogbm9pc2Ugc3VwcHJlc3Npb24uCisgKiBCeXRlIG9mZnNldDogNzIKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX3N3Yl9uYWxwaGE7CisvKjwgUTMuMTIgc3VwZXIgd2lkZWJhbmQgYWdncmVzc2l2ZW5lc3MgZmFjdG9yIGZvcgorICogbm9uc3RhdGlvbmFyeSBub2lzZSBzdXBwcmVzc2lvbi4KKyAqIEJ5dGUgb2Zmc2V0OiA3NAorICovCit9IF9fcGFja2VkOworI2RlZmluZSBBRE1fTU9EVUxFX0lEWF9NSUNfR0FJTl9DVFJMICAgMHgwMDAxMEMzNQorCisvKiBAYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMKKyAqIElEIG9mIHRoZSBUeCBtaWMgZ2FpbiBjb250cm9sIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FETV9NT0RVTEVfSURYX01JQ19HQUlOX0NUUkwgbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FkbXhfbWljX2dhaW59CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEWF9NSUNfR0FJTi50ZXh9CisgKi8KKyNkZWZpbmUgQURNX1BBUkFNX0lEWF9NSUNfR0FJTiAgICAgICAweDAwMDEwQzM2CisKKy8qIFN0cnVjdHVyZSBmb3IgYSBUeCBtaWMgZ2FpbiBwYXJhbWV0ZXIgZm9yIHRoZSBtaWMgZ2FpbgorICogY29udHJvbCBtb2R1bGUuCisgKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRFhfTUlDX0dBSU4gcGFyYW1ldGVyIGluIHRoZQorICogVHggTWljIEdhaW4gQ29udHJvbCBtb2R1bGUuCisgKi8KK3N0cnVjdCBhZG14X21pY19nYWluIHsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHR4X21pY19nYWluOworCS8qPCBMaW5lYXIgZ2FpbiBpbiBRMTMgZm9ybWF0LiAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCit9IF9fcGFja2VkOworCisvKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMgKi8KKworLyogQGluZ3JvdXAgYXVkaW9fcHBfbW9kdWxlX2lkcworICogSUQgb2YgdGhlIFJ4IENvZGVjIEdhaW4gQ29udHJvbCBtb2R1bGUuCisgKgorICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSUQ6CisgKiAtICNBRE1fUEFSQU1fSURfUlhfQ09ERUNfR0FJTgorICovCisjZGVmaW5lIEFETV9NT0RVTEVfSURfUlhfQ09ERUNfR0FJTl9DVFJMICAgICAgIDB4MDAwMTBDMzcKKworLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzCisgKiBJRCBvZiB0aGUgUnggY29kZWMgZ2FpbiBjb250cm9sIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FETV9NT0RVTEVfSURfUlhfQ09ERUNfR0FJTl9DVFJMIG1vZHVsZS4KKyAqCisgKiBAbWVzc2FnZXBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX3J4X2NvZGVjX2dhaW59CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEX1JYX0NPREVDX0dBSU4udGV4fQorICovCisjZGVmaW5lIEFETV9QQVJBTV9JRF9SWF9DT0RFQ19HQUlOICAgMHgwMDAxMEMzOAorCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBSeCBjb21tb24gY29kZWMgZ2FpbiBjb250cm9sIG1vZHVsZS4gKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRF9SWF9DT0RFQ19HQUlOIHBhcmFtZXRlcgorICogaW4gdGhlIFJ4IENvZGVjIEdhaW4gQ29udHJvbCBtb2R1bGUuCisgKi8KKworCitzdHJ1Y3QgYWRtX3J4X2NvZGVjX2dhaW4geworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcnhfY29kZWNfZ2FpbjsKKwkvKiBMaW5lYXIgZ2FpbiBpbiBRMTMgZm9ybWF0LiAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLworfSBfX3BhY2tlZDsKKworLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCisKKy8qIEBpbmdyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMKKyAqIElEIG9mIHRoZSBIUEYgVHVuaW5nIEZpbHRlciBtb2R1bGUgb24gdGhlIFR4IHBhdGguCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAtICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0VOQUJMRV9DT05GSUcKKyAqIC0gI0FETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfUFJFX0dBSU4KKyAqIC0gI0FETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfQ09ORklHX1BBUkFNUworICovCisjZGVmaW5lIEFETV9NT0RVTEVfSURfSFBGX0lJUlhfRklMVEVSICAgIDB4MDAwMTBDM0QKKworLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCisvKiBJRCBvZiB0aGUgVHggSFBGIElJUiBmaWx0ZXIgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FETV9NT0RVTEVfSURfSFBGX0lJUlhfRklMVEVSIG1vZHVsZS4KKyAqIEBwYXJzcGFjZSBNZXNzYWdlIHBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX2hwZnhfaWlyX2ZpbHRlcl9lbmFibGVfY2ZnfQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfRU5BQkxFX0NPTkZJRy50ZXh9CisgKi8KKyNkZWZpbmUgQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9FTkFCTEVfQ09ORklHICAgMHgwMDAxMEMzRQorCisvKiBJRCBvZiB0aGUgVHggSFBGIElJUiBmaWx0ZXIgcHJlZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEX0hQRl9JSVJYX0ZJTFRFUiBtb2R1bGUuCisgKiBAcGFyc3BhY2UgTWVzc2FnZSBwYXlsb2FkCisgKiBAc3RydWN0dXJle2FkbV9ocGZ4X2lpcl9maWx0ZXJfcHJlX2dhaW59CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9QUkVfR0FJTi50ZXh9CisgKi8KKyNkZWZpbmUgQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9QUkVfR0FJTiAgIDB4MDAwMTBDM0YKKworLyogSUQgb2YgdGhlIFR4IEhQRiBJSVIgZmlsdGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZQorICogI0FETV9NT0RVTEVfSURfSFBGX0lJUlhfRklMVEVSIG1vZHVsZS4KKyAqIEBwYXJzcGFjZSBNZXNzYWdlIHBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX2hwZnhfaWlyX2ZpbHRlcl9jZmdfcGFyYW1zfQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfQ09ORklHX1BBCisgKiBSQU1TLnRleH0KKyAqLworI2RlZmluZSBBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0NPTkZJR19QQVJBTVMgIDB4MDAwMTBDNDAKKworLyogU3RydWN0dXJlIGZvciBlbmFibGluZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvcgorICogdGhlIEhQRiBJSVIgdHVuaW5nIGZpbHRlciBtb2R1bGUgb24gdGhlIFR4IHBhdGguCisgKi8KKworLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0VOQUJMRV9DT05GSUcKKyAqIHBhcmFtZXRlciBpbiB0aGUgVHggcGF0aCBIUEYgVHVuaW5nIEZpbHRlciBtb2R1bGUuCisgKi8KK3N0cnVjdCBhZG1faHBmeF9paXJfZmlsdGVyX2VuYWJsZV9jZmcgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7CisvKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgSFBGIHR1bmluZyBmaWx0ZXIgaXMgZGlzYWJsZWQgKDApIG9yCisgKiBlbmFibGVkIChub256ZXJvKS4KKyAqLworfSBfX3BhY2tlZDsKKworCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBwcmVnYWluIHBhcmFtZXRlciBmb3IgdGhlIEhQRgorICogSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgorICovCisKKworLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX1BSRV9HQUlOIHBhcmFtZXRlcgorICogaW4gdGhlIFR4IHBhdGggSFBGIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgorICovCitzdHJ1Y3QgYWRtX2hwZnhfaWlyX2ZpbHRlcl9wcmVfZ2FpbiB7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICBwcmVfZ2FpbjsKKwkvKiBMaW5lYXIgZ2FpbiBpbiBRMTMgZm9ybWF0LiAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLworfSBfX3BhY2tlZDsKKworCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IgdGhlCisgKiBIUEYgSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgorICovCisKKworLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0NPTkZJR19QQVJBTVMKKyAqIHBhcmFtZXRlcnMgaW4gdGhlIFR4IHBhdGggSFBGIFR1bmluZyBGaWx0ZXIgbW9kdWxlLiBcbgorICogXG4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHR1bmluZyBmaWx0ZXIgY29lZmZpY2llbnRzIGFzIGZvbGxvd3M6IFxuCisgKiAtIFNlcXVlbmNlIG9mIGludDMyX3QgRmlsdGVyQ29lZmZzLgorICogRWFjaCBiYW5kIGhhcyBmaXZlIGNvZWZmaWNpZW50cywgZWFjaCBpbiBpbnQzMl90IGZvcm1hdCBpbiB0aGUgb3JkZXIgb2YKKyAqIGIwLCBiMSwgYjIsIGExLCBhMi4KKyAqIC0gU2VxdWVuY2Ugb2YgaW50MTZfdCBOdW1TaGlmdEZhY3Rvci4KKyAqIE9uZSBpbnQxNl90IHBlciBiYW5kLiBUaGUgbnVtZXJhdG9yIHNoaWZ0IGZhY3RvciBpcyByZWxhdGVkIHRvIHRoZSBRCisgKiBmYWN0b3Igb2YgdGhlIGZpbHRlciBjb2VmZmljaWVudHMuCisgKiAtIFNlcXVlbmNlIG9mIHVpbnQxNl90IFBhblNldHRpbmcuCisgKiBPbmUgdWludDE2X3QgZm9yIGVhY2ggYmFuZCB0byBpbmRpY2F0ZSBhcHBsaWNhdGlvbiBvZiB0aGUgZmlsdGVyIHRvCisgKiBsZWZ0ICgwKSwgcmlnaHQgKDEpLCBvciBib3RoICgyKSBjaGFubmVscy4KKyAqLworc3RydWN0IGFkbV9ocGZ4X2lpcl9maWx0ZXJfY2ZnX3BhcmFtcyB7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1fYmlxdWFkX3N0YWdlczsKKy8qPCBOdW1iZXIgb2YgYmFuZHMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDIwCisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisvKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzICovCisKKy8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMgKi8KKy8qIElEIG9mIHRoZSBUeCBwYXRoIElJUiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4KKyAqCVRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKyAqCS0gI0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9FTkFCTEVfQ09ORklHCisgKi8KKyNkZWZpbmUgQURNX01PRFVMRV9JRFhfSUlSX0ZJTFRFUiAweDAwMDEwQzQxCisKKy8qIElEIG9mIHRoZSBSeCBwYXRoIElJUiBUdW5pbmcgRmlsdGVyIG1vZHVsZSBmb3IgdGhlIGxlZnQgY2hhbm5lbC4KKyAqCVRoZSBwYXJhbWV0ZXIgSURzIG9mIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBtb2R1bGUKKyAqCSgjQVNNX01PRFVMRV9JRF9JSVJVTklOR19GSUxURVIpIGFyZSB1c2VkIGZvciB0aGUgbGVmdCBJSVIgUnggdHVuaW5nCisgKglmaWx0ZXIuCisgKgorICogUGFuIHBhcmFtZXRlcnMgYXJlIG5vdCByZXF1aXJlZCBmb3IgdGhpcyBwZXItY2hhbm5lbCBJSVIgZmlsdGVyOyB0aGUgcGFuCisgKiBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkIGJ5IHRoaXMgbW9kdWxlLgorICovCisjZGVmaW5lIEFETV9NT0RVTEVfSURfTEVGVF9JSVJVTklOR19GSUxURVIgICAgICAweDAwMDEwNzA1CisKKy8qIElEIG9mIHRoZSB0aGUgUnggcGF0aCBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUgZm9yIHRoZSByaWdodAorICogY2hhbm5lbC4KKyAqIFRoZSBwYXJhbWV0ZXIgSURzIG9mIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBtb2R1bGUKKyAqICgjQVNNX01PRFVMRV9JRF9JSVJVTklOR19GSUxURVIpIGFyZSB1c2VkIGZvciB0aGUgcmlnaHQgSUlSIFJ4CisgKiB0dW5pbmcgZmlsdGVyLgorICoKKyAqIFBhbiBwYXJhbWV0ZXJzIGFyZSBub3QgcmVxdWlyZWQgZm9yIHRoaXMgcGVyLWNoYW5uZWwgSUlSIGZpbHRlcjsKKyAqIHRoZSBwYW4gcGFyYW1ldGVycyBhcmUgaWdub3JlZCBieSB0aGlzIG1vZHVsZS4KKyAqLworI2RlZmluZSBBRE1fTU9EVUxFX0lEX1JJR0hUX0lJUlVOSU5HX0ZJTFRFUiAgICAweDAwMDEwNzA2CisKKy8qIGVuZF9hZGR0b2dyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMgKi8KKworLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCisKKy8qIElEIG9mIHRoZSBUeCBJSVIgZmlsdGVyIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEWF9JSVJfRklMVEVSIG1vZHVsZS4KKyAqIEBwYXJzcGFjZSBNZXNzYWdlIHBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRteF9paXJfZmlsdGVyX2VuYWJsZV9jZmd9CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEWF9JSVJfRklMVEVSX0VOQUJMRV9DT05GSUcudGV4fQorICovCisjZGVmaW5lIEFETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9FTkFCTEVfQ09ORklHICAgMHgwMDAxMEM0MgorCisvKiBJRCBvZiB0aGUgVHggSUlSIGZpbHRlciBwcmVnYWluIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FETV9NT0RVTEVfSURYX0lJUl9GSUxURVIgbW9kdWxlLgorICogQHBhcnNwYWNlIE1lc3NhZ2UgcGF5bG9hZAorICogQHN0cnVjdHVyZXthZG14X2lpcl9maWx0ZXJfcHJlX2dhaW59CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEWF9JSVJfRklMVEVSX1BSRV9HQUlOLnRleH0KKyAqLworI2RlZmluZSBBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfUFJFX0dBSU4gICAgMHgwMDAxMEM0MworCisvKiBJRCBvZiB0aGUgVHggSUlSIGZpbHRlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEWF9JSVJfRklMVEVSIG1vZHVsZS4KKyAqIEBwYXJzcGFjZSBNZXNzYWdlIHBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRteF9paXJfZmlsdGVyX2NmZ19wYXJhbXN9CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEWF9JSVJfRklMVEVSX0NPTkZJR19QQVJBTVMudGV4fQorICovCisjZGVmaW5lIEFETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9DT05GSUdfUEFSQU1TICAgICAweDAwMDEwQzQ0CisKKy8qIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciB0aGUKKyAqIElJUiBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgorICovCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEWF9JSVJfRklMVEVSX0VOQUJMRV9DT05GSUcKKyAqIHBhcmFtZXRlciBpbiB0aGUgVHggUGF0aCBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCisgKi8KKworc3RydWN0IGFkbXhfaWlyX2ZpbHRlcl9lbmFibGVfY2ZnIHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOworLyo8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBpcyBkaXNhYmxlZCAoMCkgb3IKKyAqIGVuYWJsZWQgKG5vbnplcm8pLgorICovCisKK30gX19wYWNrZWQ7CisKKworLyogU3RydWN0dXJlIGZvciB0aGUgcHJlZ2FpbiBwYXJhbWV0ZXIgZm9yIHRoZQorICogSUlSIGZpbHRlciBtb2R1bGUgb24gdGhlIFR4IHBhdGguCisgKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9QUkVfR0FJTgorICogcGFyYW1ldGVyIGluIHRoZSBUeCBQYXRoIElJUiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4KKyAqLworCitzdHJ1Y3QgYWRteF9paXJfZmlsdGVyX3ByZV9nYWluIHsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHByZV9nYWluOworCS8qPCBMaW5lYXIgZ2FpbiBpbiBRMTMgZm9ybWF0LiAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uKi8KK30gX19wYWNrZWQ7CisKKworLyogU3RydWN0dXJlIGZvciB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZQorICogSUlSIGZpbHRlciBtb2R1bGUgb24gdGhlIFR4IHBhdGguCisgKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9DT05GSUdfUEFSQU1TCisgKiBwYXJhbWV0ZXIgaW4gdGhlIFR4IFBhdGggSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlLiBcbgorICoJXG4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBIUEYgSUlSIGZpbHRlciBjb2VmZmljaWVudHMgb24KKyAqIHRoZSBUeCBwYXRoIGFzIGZvbGxvd3M6IFxuCisgKiAtIFNlcXVlbmNlIG9mIGludDMyX3QgdWxGaWx0ZXJDb2VmZnMuIEVhY2ggYmFuZCBoYXMgZml2ZQorICogY29lZmZpY2llbnRzLCBlYWNoIGluIGludDMyX3QgZm9ybWF0IGluIHRoZSBvcmRlciBvZiBiMCwgYjEsIGIyLAorICogYTEsIGEyLgorICogLSBTZXF1ZW5jZSBvZiBpbnQxNl90IHNOdW1TaGlmdEZhY3Rvci4gT25lIGludDE2X3QgcGVyIGJhbmQuIFRoZQorICogbnVtZXJhdG9yIHNoaWZ0IGZhY3RvciBpcyByZWxhdGVkIHRvIHRoZSBRIGZhY3RvciBvZiB0aGUgZmlsdGVyCisgKiBjb2VmZmljaWVudHMuCisgKiAtIFNlcXVlbmNlIG9mIHVpbnQxNl90IHVzUGFuU2V0dGluZy4gT25lIHVpbnQxNl90IGZvciBlYWNoIGJhbmQKKyAqIHRvIGluZGljYXRlIGlmIHRoZSBmaWx0ZXIgaXMgYXBwbGllZCB0byBsZWZ0ICgwKSwgcmlnaHQgKDEpLCBvcgorICogYm90aCAoMikgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBhZG14X2lpcl9maWx0ZXJfY2ZnX3BhcmFtcyB7CisJdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1fYmlxdWFkX3N0YWdlczsKKy8qPCBOdW1iZXIgb2YgYmFuZHMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDIwCisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisvKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzICovCisKKy8qIEBpbmdyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMKKyAqCUlEIG9mIHRoZSBRRW5zZW1ibGUgbW9kdWxlLgorICoJVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgorICoJLSAjQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9FTkFCTEUKKyAqCS0gI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfQkFDS0dBSU4KKyAqCS0gI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfU0VUX05FV19BTkdMRQorICovCisjZGVmaW5lIEFETV9NT0RVTEVfSURfUUVOU0VNQkxFICAgIDB4MDAwMTBDNTkKKworLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCisvKiBJRCBvZiB0aGUgUUVuc2VtYmxlIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEX1FFTlNFTUJMRSBtb2R1bGUuCisgKiBAbWVzc2FnZXBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX3FlbnNlbWJsZV9lbmFibGV9CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9FTkFCTEUudGV4fQorICovCisjZGVmaW5lIEFETV9QQVJBTV9JRF9RRU5TRU1CTEVfRU5BQkxFICAgMHgwMDAxMEM2MAorCisvKiBJRCBvZiB0aGUgUUVuc2VtYmxlIGJhY2sgZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEX1FFTlNFTUJMRSBtb2R1bGUuCisgKiBAbWVzc2FnZXBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX3FlbnNlbWJsZV9wYXJhbV9iYWNrZ2Fpbn0KKyAqIEB0YWJsZXNwYWNlCisgKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BRE1fUEFSQU1fSURfUUVOU0VNQkxFX0JBQ0tHQUlOLnRleH0KKyAqLworI2RlZmluZSBBRE1fUEFSQU1fSURfUUVOU0VNQkxFX0JBQ0tHQUlOICAgMHgwMDAxMEM2MQorCisvKiBJRCBvZiB0aGUgUUVuc2VtYmxlIG5ldyBhbmdsZSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBRE1fTU9EVUxFX0lEX1FFTlNFTUJMRSBtb2R1bGUuCisgKiBAbWVzc2FnZXBheWxvYWQKKyAqIEBzdHJ1Y3R1cmV7YWRtX3FlbnNlbWJsZV9wYXJhbV9zZXRfbmV3X2FuZ2xlfQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfU0VUX05FV19BTkdMRS50ZXh9CisgKi8KKyNkZWZpbmUgQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9TRVRfTkVXX0FOR0xFICAgIDB4MDAwMTBDNjIKKworLyogU3RydWN0dXJlIGZvciBlbmFibGluZyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZQorICogUUVuc2VtYmxlIG1vZHVsZS4KKyAqLworCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9FTkFCTEUKKyAqIHBhcmFtZXRlciB1c2VkIGJ5IHRoZSBRRW5zZW1ibGUgbW9kdWxlLgorICovCitzdHJ1Y3QgYWRtX3FlbnNlbWJsZV9lbmFibGUgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7CisvKjwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFFFbnNlbWJsZSBtb2R1bGUgaXMgZGlzYWJsZWQgKDApIG9yIGVuYWJsZWQKKyAqIChub256ZXJvKS4KKyAqLworfSBfX3BhY2tlZDsKKworCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBiYWNrZ3JvdW5kIGdhaW4gZm9yIHRoZSBRRW5zZW1ibGUgbW9kdWxlLiAqLworCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9CQUNLR0FJTgorICogcGFyYW1ldGVyIHVzZWQgYnkKKyAqIHRoZSBRRW5zZW1ibGUgbW9kdWxlLgorICovCitzdHJ1Y3QgYWRtX3FlbnNlbWJsZV9wYXJhbV9iYWNrZ2FpbiB7CisJaW50MTZfdCAgICAgICAgICAgICAgICAgIGJhY2tfZ2FpbjsKKy8qPCBMaW5lYXIgZ2FpbiBpbiBRMTUgZm9ybWF0LgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAzMjc2NworICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworLyogU3RydWN0dXJlIGZvciBzZXR0aW5nIGEgbmV3IGFuZ2xlIGZvciB0aGUgUUVuc2VtYmxlIG1vZHVsZS4gKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfU0VUX05FV19BTkdMRQorICogcGFyYW1ldGVyIHVzZWQKKyAqIGJ5IHRoZSBRRW5zZW1ibGUgbW9kdWxlLgorICovCitzdHJ1Y3QgYWRtX3FlbnNlbWJsZV9wYXJhbV9zZXRfbmV3X2FuZ2xlIHsKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICBuZXdfYW5nbGU7CisvKjwgTmV3IGFuZ2xlIGluIGRlZ3JlZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDM1OQorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgICB0aW1lX21zOworLyo8IFRyYW5zaXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2V0IHRoZSBuZXcgYW5nbGUuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDMyNzY3CisgKi8KK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBBRE1fQ01EX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUCQkJCTB4MDAwMTAzNDkKKyNkZWZpbmUgQURNX0NNRFJTUF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVAkJCTB4MDAwMTAzNTAKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FTkFCTEUJCQkJCTB4MDAwMTA5MDQKKyAvKgorICAqIFBheWxvYWQgb2YgdGhlIEFETV9DTURfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1QgY29tbWFuZC4KKyAgKi8KK3N0cnVjdCBhZG1fY21kX2dldF9wcF90b3BvX21vZHVsZV9saXN0X3QgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbHN3OworCS8qCisJICogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4KKwkgKgorCSAqCisJICogVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnksIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8KKwkgKiBjb250YWluIHRoZSBlbnRpcmUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCwgaW5jbHVkaW5nIHRoZSBtb2R1bGUgSUQsCisJICogcGFyYW1ldGVyIElELCBwYXJhbWV0ZXIgc2l6ZSwgYW5kIHBhcmFtZXRlciB2YWx1ZXMuCisJICovCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9tc3c7CisJLyoKKwkgKiAgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGFkZHJlc3MuCisJICoKKwkgKiBUaGlzIG1lbW9yeSBtYXAgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBhRFNQIHRocm91Z2ggdGhlCisJICogI0FETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kLgorCSAqCisJICogQHZhbHVlcworCSAqIC0gTm9uLU5VTEwgLS0gT24gYWNrbm93bGVkZ21lbnQsIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcyBiZWdpbiBhdAorCSAqIHRoZSBhZGRyZXNzIHNwZWNpZmllZCAob3V0LW9mLWJhbmQpCisJICogLSBOVUxMIC0tIFRoZSBhY2tub3dsZWRnbWVudCdzIHBheWxvYWQgY29udGFpbnMgdGhlIHBhcmFtZXRlciBkYXRhCisJICogKGluLWJhbmQpIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisJLyoKKwkgKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiB0aGUgbGlzdCBvZiBtb2R1bGVzLiBUaGlzCisJICogZmllbGQgaXMgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLgorCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcGFyYW1fbWF4X3NpemU7CisJLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKgorICogUGF5bG9hZCBvZiB0aGUgQURNX0NNRFJTUF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVCBtZXNzYWdlLCB3aGljaCByZXR1cm5zCisgKiBtb2R1bGUgaWRzIGluIHJlc3BvbnNlIHRvIGFuIEFETV9DTURfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1QgY29tbWFuZC4KKyAqIEltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgYWNrbm93bGVkZ21lbnQgPGI+bW9kdWxlIGlkCisgKiBkYXRhIHZhcmlhYmxlIHBheWxvYWQ8L2I+IGNvbnRhaW5pbmcgdGhlIHByZS9wb3N0cHJvY2Vzc2luZyBtb2R1bGUgaWQKKyAqIHZhbHVlcy4gRm9yIGFuIGluLWJhbmQgc2NlbmFyaW8sIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGRlcGVuZHMgb24gdGhlIHNpemUKKyAqIG9mIHRoZSBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBhZG1fY21kX3JzcF9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdF90IHsKKwkvKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkuICovCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkcHJvY190b3BvbG9neV9tb2R1bGVfaWRfaW5mb190IHsKKwl1aW50MzJfdAludW1fbW9kdWxlczsKK30gX19wYWNrZWQ7CisKKy8qIGVuZF9hZGR0b2dyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMgKi8KKworLyogQGluZ3JvdXAgYXVkaW9fcHBfbW9kdWxlX2lkcworICogSUQgb2YgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZSBwcmUvcG9zdHByb2Nlc3NpbmcgYmxvY2suCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAtICNBU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU4KKyAqIC0gI0FTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTgorICogLSAjQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01VVEVfQ09ORklHCisgKiAtICNBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUworICogLSAjQVNNX1BBUkFNX0lEX1NPRlRfUEFVU0VfUEFSQU1FVEVSUworICogLSAjQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9HQUlOCisgKiAtICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX01VVEUKKyAqLworI2RlZmluZSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMICAgMHgwMDAxMEJGRQorI2RlZmluZSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMiAgMHgwMDAxMDkxMAorI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9WT0xfQ1RSTCBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMCisKKy8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLworLyogSUQgb2YgdGhlIG1hc3RlciBnYWluIHBhcmFtZXRlciB1c2VkIGJ5IHRoZSAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTAorICogbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FzbV92b2x1bWVfY3RybF9tYXN0ZXJfZ2Fpbn0KKyAqIEB0YWJsZXNwYWNlCisgKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU4udGV4fQorICovCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NQVNURVJfR0FJTiAgICAweDAwMDEwQkZGCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU4gQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOCisKKy8qIElEIG9mIHRoZSBsZWZ0L3JpZ2h0IGNoYW5uZWwgZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKKyAqICNBU01fTU9EVUxFX0lEX1ZPTF9DVFJMIG1vZHVsZS4KKyAqIEBtZXNzYWdlcGF5bG9hZAorICogQHN0cnVjdHVyZXthc21fdm9sdW1lX2N0cmxfbHJfY2hhbl9nYWlufQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTi50ZXh9CisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX0xSX0NIQU5ORUxfR0FJTiAgICAgMHgwMDAxMEMwMAorCisvKiBJRCBvZiB0aGUgbXV0ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FTTV9NT0RVTEVfSURfVk9MX0NUUkwgbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZ30KKyAqIEB0YWJsZXNwYWNlCisgKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfVk9MX0NUUkxfTVVURV9DT05GSUcudGV4fQorICovCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NVVRFX0NPTkZJRyAgIDB4MDAwMTBDMDEKKworLyogSUQgb2YgdGhlIHNvZnQgc3RlcHBpbmcgdm9sdW1lIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKKyAqICNBU01fTU9EVUxFX0lEX1ZPTF9DVFJMIG1vZHVsZS4KKyAqIEBtZXNzYWdlcGF5bG9hZAorICogQHN0cnVjdHVyZXthc21fc29mdF9zdGVwX3ZvbHVtZV9wYXJhbXN9CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQVNNX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVQKKyAqIEVSUy50ZXh9CisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVRFUlMgIDB4MDAwMTBDMjkKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9TT0ZUX1ZPTF9TVEVQUElOR19QQVJBTUVURVJTXAorCQkJQVNNX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVRFUlMKKworLyogSUQgb2YgdGhlIHNvZnQgcGF1c2UgcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTAorICogbW9kdWxlLgorICovCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9TT0ZUX1BBVVNFX1BBUkFNRVRFUlMgICAweDAwMDEwRDZBCisKKy8qIElEIG9mIHRoZSBtdWx0aXBsZS1jaGFubmVsIHZvbHVtZSBjb250cm9sIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKKyAqICNBU01fTU9EVUxFX0lEX1ZPTF9DVFJMIG1vZHVsZS4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU4gIDB4MDAwMTA3MTMKKworLyogSUQgb2YgdGhlIG11bHRpcGxlLWNoYW5uZWwgbXV0ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKKyAqICNBU01fTU9EVUxFX0lEX1ZPTF9DVFJMIG1vZHVsZS4KKyAqLworCisjZGVmaW5lIEFTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfTVVURSAgMHgwMDAxMDcxNAorCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBtYXN0ZXIgZ2FpbiBwYXJhbWV0ZXIgZm9yIGEgdm9sdW1lIGNvbnRyb2wKKyAqIG1vZHVsZS4KKyAqLworCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOCisgKiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLgorICovCisKKworCitzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX21hc3Rlcl9nYWluIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07CisJc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgbWFzdGVyX2dhaW47CisJLyogTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCit9IF9fcGFja2VkOworCisKK3N0cnVjdCBhc21fdm9sdW1lX2N0cmxfbHJfY2hhbl9nYWluIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07CisJc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBsX2NoYW5fZ2FpbjsKKwkvKjwgTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdCBmb3IgdGhlIGxlZnQgY2hhbm5lbC4gKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcl9jaGFuX2dhaW47CisJLyo8IExpbmVhciBnYWluIGluIFExMyBmb3JtYXQgZm9yIHRoZSByaWdodCBjaGFubmVsLiovCit9IF9fcGFja2VkOworCisKKy8qIFN0cnVjdHVyZSBmb3IgdGhlIG11dGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIGEKKyAqIHZvbHVtZSBjb250cm9sIG1vZHVsZS4KKyAqLworCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01VVEVfQ09ORklHCisgKiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLgorICovCisKKworc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZyB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOworCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciBtdXRlIGlzIGRpc2FibGVkICgwKSBvciBlbmFibGVkIChub256ZXJvKS4qLworCit9IF9fcGFja2VkOworCisvKgorICogU3VwcG9ydGVkIHBhcmFtZXRlcnMgZm9yIGEgc29mdCBzdGVwcGluZyBsaW5lYXIgcmFtcGluZyBjdXJ2ZS4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fU1ZDX1JBTVBJTkdDVVJWRV9MSU5FQVIgIDAKKworLyoKKyAqIEV4cG9uZW50aWFsIHJhbXBpbmcgY3VydmUuCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfRVhQICAgIDEKKworLyoKKyAqIExvZ2FyaXRobWljIHJhbXBpbmcgY3VydmUuCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTE9HICAgIDIKKworLyogU3RydWN0dXJlIGZvciBob2xkaW5nIHNvZnQgc3RlcHBpbmcgdm9sdW1lIHBhcmFtZXRlcnMuICovCisKKworLyogIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUworICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUuCisgKi8KK3N0cnVjdCBhc21fc29mdF9zdGVwX3ZvbHVtZV9wYXJhbXMgeworCXN0cnVjdCBhcHJfaGRyCWhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICBwZXJpb2Q7CisvKjwgUGVyaW9kIGluIG1pbGxpc2Vjb25kcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTUwMDAKKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBzdGVwOworLyo8IFN0ZXAgaW4gbWljcm9zZWNvbmRzLgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxNTAwMDAwMAorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHJhbXBpbmdfY3VydmU7CisvKjwgUmFtcGluZyBjdXJ2ZSB0eXBlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0xJTkVBUgorICogLSAjQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfRVhQCisgKiAtICNBU01fUEFSQU1fU1ZDX1JBTVBJTkdDVVJWRV9MT0cKKyAqLworfSBfX3BhY2tlZDsKKworCisvKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgc29mdCBwYXVzZSBwYXJhbWV0ZXJzLiAqLworCisKKy8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfU09GVF9QQVVTRV9QQVJBTUVURVJTCisgKiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4KKyAqLworCisKK3N0cnVjdCBhc21fc29mdF9wYXVzZV9wYXJhbXMgeworCXN0cnVjdCBhcHJfaGRyCWhkcjsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciBzb2Z0IHBhdXNlIGlzIGRpc2FibGVkICgwKSBvciBlbmFibGVkCisgKiAobm9uemVybykuCisgKi8KKworCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBlcmlvZDsKKy8qPCBQZXJpb2QgaW4gbWlsbGlzZWNvbmRzLgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxNTAwMAorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHN0ZXA7CisvKjwgU3RlcCBpbiBtaWNyb3NlY29uZHMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDE1MDAwMDAwCisgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcmFtcGluZ19jdXJ2ZTsKKy8qPCBSYW1waW5nIGN1cnZlLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gI0FTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0xJTkVBUgorICogLSAjQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfRVhQCisgKiAtICNBU01fUEFSQU1fU1ZDX1JBTVBJTkdDVVJWRV9MT0cKKyAqLworfSBfX3BhY2tlZDsKKworCisvKiBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscy4qLworI2RlZmluZSBWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgIDgKKworLyogU3RydWN0dXJlIGZvciBob2xkaW5nIG9uZSBjaGFubmVsIHR5cGUgLSBnYWluIHBhaXIuICovCisKKworLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTiBjaGFubmVsCisgKiB0eXBlL2dhaW4gcGFpcnMgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLiBcbiBcbiBUaGlzCisgKiBzdHJ1Y3R1cmUgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKKyAqIGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfZ2FpbiBzdHJ1Y3R1cmUuCisgKi8KKworCitzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX2NoYW5uZWx0eXBlX2dhaW5fcGFpciB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgICBjaGFubmVsdHlwZTsKKwkvKgorCSAqIENoYW5uZWwgdHlwZSBmb3Igd2hpY2ggdGhlIGdhaW4gc2V0dGluZyBpcyB0byBiZSBhcHBsaWVkLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogLSAjUENNX0NIQU5ORUxfTAorCSAqIC0gI1BDTV9DSEFOTkVMX1IKKwkgKiAtICNQQ01fQ0hBTk5FTF9DCisJICogLSAjUENNX0NIQU5ORUxfTFMKKwkgKiAtICNQQ01fQ0hBTk5FTF9SUworCSAqIC0gI1BDTV9DSEFOTkVMX0xGRQorCSAqIC0gI1BDTV9DSEFOTkVMX0NTCisJICogLSAjUENNX0NIQU5ORUxfTEIKKwkgKiAtICNQQ01fQ0hBTk5FTF9SQgorCSAqIC0gI1BDTV9DSEFOTkVMUworCSAqIC0gI1BDTV9DSEFOTkVMX0NWSAorCSAqIC0gI1BDTV9DSEFOTkVMX01TCisJICogLSAjUENNX0NIQU5ORUxfRkxDCisJICogLSAjUENNX0NIQU5ORUxfRlJDCisJICogLSAjUENNX0NIQU5ORUxfUkxDCisJICogLSAjUENNX0NIQU5ORUxfUlJDCisJICovCisKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsKKwkvKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KKworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOworCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLworCisJdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNlcnZlZDM7CisJLyogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGdhaW47CisJLyoKKwkgKiBHYWluIHZhbHVlIGZvciB0aGlzIGNoYW5uZWwgaW4gUTI4IGZvcm1hdC4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkKKwkgKi8KK30gX19wYWNrZWQ7CisKKworLyogU3RydWN0dXJlIGZvciB0aGUgbXVsdGljaGFubmVsIGdhaW4gY29tbWFuZCAqLworCisKKy8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU4KKyAqIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLgorICovCisKKworc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfZ2FpbiB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOworCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKKwkvKgorCSAqIE51bWJlciBvZiBjaGFubmVscyBmb3Igd2hpY2ggZ2FpbiB2YWx1ZXMgYXJlIHByb3ZpZGVkLiBBbnkKKwkgKiBjaGFubmVscyBwcmVzZW50IGluIHRoZSBkYXRhIGZvciB3aGljaCBnYWluIGlzIG5vdCBwcm92aWRlZCBhcmUKKwkgKiBzZXQgdG8gdW5pdHkgZ2Fpbi4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDgKKwkgKi8KKworCXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfY2hhbm5lbHR5cGVfZ2Fpbl9wYWlyCisJCWdhaW5fZGF0YVtWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFNdOworCS8qIEFycmF5IG9mIGNoYW5uZWwgdHlwZS9nYWluIHBhaXJzLiovCit9IF9fcGFja2VkOworCisKKy8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBvbmUgY2hhbm5lbCB0eXBlIC0gbXV0ZSBwYWlyLiAqLworCisKKy8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX01VVEUgY2hhbm5lbAorICogdHlwZS9tdXRlIHNldHRpbmcgcGFpcnMgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLiBcbiBcbgorICogVGhpcyBzdHJ1Y3R1cmUgaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKKyAqIGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfbXV0ZSBzdHJ1Y3R1cmUuCisgKi8KKworCitzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX2NoYW5uZWx5cGVfbXV0ZV9wYWlyIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07CisJc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgY2hhbm5lbHlwZTsKKy8qPCBDaGFubmVsIHR5cGUgZm9yIHdoaWNoIHRoZSBtdXRlIHNldHRpbmcgaXMgdG8gYmUgYXBwbGllZC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtICNQQ01fQ0hBTk5FTF9MCisgKiAtICNQQ01fQ0hBTk5FTF9SCisgKiAtICNQQ01fQ0hBTk5FTF9DCisgKiAtICNQQ01fQ0hBTk5FTF9MUworICogLSAjUENNX0NIQU5ORUxfUlMKKyAqIC0gI1BDTV9DSEFOTkVMX0xGRQorICogLSAjUENNX0NIQU5ORUxfQ1MKKyAqIC0gI1BDTV9DSEFOTkVMX0xCCisgKiAtICNQQ01fQ0hBTk5FTF9SQgorICogLSAjUENNX0NIQU5ORUxTCisgKiAtICNQQ01fQ0hBTk5FTF9DVkgKKyAqIC0gI1BDTV9DSEFOTkVMX01TCisgKiAtICNQQ01fQ0hBTk5FTF9GTEMKKyAqIC0gI1BDTV9DSEFOTkVMX0ZSQworICogLSAjUENNX0NIQU5ORUxfUkxDCisgKiAtICNQQ01fQ0hBTk5FTF9SUkMKKyAqLworCisJdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLworCisJdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLworCisJdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNlcnZlZDM7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBtdXRlOworLyo8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBjaGFubmVsLgorICogU3VwcG9ydGVkIHZhbHVlczoKKyAqIC0gMCA9IFVubXV0ZQorICogLSBOb256ZXJvID0gTXV0ZQorICovCit9IF9fcGFja2VkOworCisKKy8qIFN0cnVjdHVyZSBmb3IgdGhlIG11bHRpY2hhbm5lbCBtdXRlIGNvbW1hbmQgKi8KKworCisvKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfTVVURQorICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUuCisgKi8KKworCitzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX211bHRpY2hhbm5lbF9tdXRlIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07CisJc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworLyo8IE51bWJlciBvZiBjaGFubmVscyBmb3Igd2hpY2ggbXV0ZSBjb25maWd1cmF0aW9uIGlzCisgKiBwcm92aWRlZC4gQW55IGNoYW5uZWxzIHByZXNlbnQgaW4gdGhlIGRhdGEgZm9yIHdoaWNoIG11dGUKKyAqIGNvbmZpZ3VyYXRpb24gaXMgbm90IHByb3ZpZGVkIGFyZSBzZXQgdG8gdW5tdXRlLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4CisgKi8KKworc3RydWN0IGFzbV92b2x1bWVfY3RybF9jaGFubmVseXBlX211dGVfcGFpcgorCQkJCW11dGVfZGF0YVtWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFNdOworCS8qPCBBcnJheSBvZiBjaGFubmVsIHR5cGUvbXV0ZSBzZXR0aW5nIHBhaXJzLiovCit9IF9fcGFja2VkOworLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCisKKy8qIGF1ZGlvX3BwX21vZHVsZV9pZHMKKyAqIElEIG9mIHRoZSBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAtICNBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX0VOQUJMRV9DT05GSUcKKyAqIC0gI0FTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfUFJFX0dBSU4KKyAqIC0gI0FTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfQ09ORklHX1BBUkFNUworICovCisjZGVmaW5lIEFTTV9NT0RVTEVfSURfSUlSVU5JTkdfRklMVEVSICAgMHgwMDAxMEMwMgorCisvKiBAYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMgKi8KKy8qIElEIG9mIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkgdGhlCisgKiAjQVNNX01PRFVMRV9JRF9JSVJVTklOR19GSUxURVIgbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FzbV9paXJ1bmluZ19maWx0ZXJfZW5hYmxlfQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfRU5BQkxFX0NPCisgKiBORklHLnRleH0KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX0VOQUJMRV9DT05GSUcgICAweDAwMDEwQzAzCisKKy8qIElEIG9mIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBwcmVnYWluIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogI0FTTV9NT0RVTEVfSURfSUlSVU5JTkdfRklMVEVSIG1vZHVsZS4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX1BSRV9HQUlOICAweDAwMDEwQzA0CisKKy8qIElEIG9mIHRoZSBJSVIgdHVuaW5nIGZpbHRlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKKyAqICNBU01fTU9EVUxFX0lEX0lJUlVOSU5HX0ZJTFRFUiBtb2R1bGUuCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9DT05GSUdfUEFSQU1TICAweDAwMDEwQzA1CisKKy8qIFN0cnVjdHVyZSBmb3IgYW4gZW5hYmxlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciBhbgorICogSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlLgorICovCisKKworLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX0VOQUJMRV9DT05GSUcKKyAqIHBhcmFtZXRlciB1c2VkIGJ5IHRoZSBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCisgKi8KK3N0cnVjdCBhc21faWlydW5pbmdfZmlsdGVyX2VuYWJsZSB7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgaXMgZGlzYWJsZWQgKDApIG9yCisgKiBlbmFibGVkICgxKS4KKyAqLworfSBfX3BhY2tlZDsKKworLyogU3RydWN0dXJlIGZvciB0aGUgcHJlZ2FpbiBwYXJhbWV0ZXIgZm9yIGFuIElJUiB0dW5pbmcgZmlsdGVyIG1vZHVsZS4gKi8KKworCisvKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9QUkVfR0FJTgorICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCisgKi8KK3N0cnVjdCBhc21faWlydW5pbmdfZmlsdGVyX3ByZWdhaW4geworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcHJlZ2FpbjsKKwkvKjwgTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCit9IF9fcGFja2VkOworCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IgYW4gSUlSIHR1bmluZyBmaWx0ZXIKKyAqIG1vZHVsZS4KKyAqLworCisKKy8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9DT05GSUdfUEFSQU1TCisgKiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIElJUiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4gXG4KKyAqIFxuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBmb2xsb3dlZCBieSB0aGUgSUlSIGZpbHRlciBjb2VmZmljaWVudHM6IFxuCisgKiAtIFNlcXVlbmNlIG9mIGludDMyX3QgRmlsdGVyQ29lZmZzIFxuCisgKiBGaXZlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBiYW5kLiBFYWNoIGNvZWZmaWNpZW50IGlzIGluIGludDMyX3QgZm9ybWF0LCBpbgorICogdGhlIG9yZGVyIG9mIGIwLCBiMSwgYjIsIGExLCBhMi4KKyAqIC0gU2VxdWVuY2Ugb2YgaW50MTZfdCBOdW1TaGlmdEZhY3RvciBcbgorICogT25lIGludDE2X3QgcGVyIGJhbmQuIFRoZSBudW1lcmF0b3Igc2hpZnQgZmFjdG9yIGlzIHJlbGF0ZWQgdG8gdGhlIFEKKyAqIGZhY3RvciBvZiB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cy4KKyAqIC0gU2VxdWVuY2Ugb2YgdWludDE2X3QgUGFuU2V0dGluZyBcbgorICogT25lIHVpbnQxNl90IHBlciBiYW5kLCBpbmRpY2F0aW5nIGlmIHRoZSBmaWx0ZXIgaXMgYXBwbGllZCB0byBsZWZ0ICgwKSwKKyAqIHJpZ2h0ICgxKSwgb3IgYm90aCAoMikgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBhc21faWlyX2ZpbHRlcl9jb25maWdfcGFyYW1zIHsKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG51bV9iaXF1YWRfc3RhZ2VzOworLyo8IE51bWJlciBvZiBiYW5kcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMjAKKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwkvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uKi8KK30gX19wYWNrZWQ7CisKKy8qIGF1ZGlvX3BwX21vZHVsZV9pZHMKKyAqIElEIG9mIHRoZSBNdWx0aWJhbmQgRHluYW1pYyBSYW5nZSBDb250cm9sIChNQkRSQykgbW9kdWxlIG9uIHRoZSBUeC9SeAorICogcGF0aHMuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAtICNBU01fUEFSQU1fSURfTUJEUkNfRU5BQkxFCisgKiAtICNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUworICovCisjZGVmaW5lIEFTTV9NT0RVTEVfSURfTUJEUkMgICAweDAwMDEwQzA2CisKKy8qIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLworLyogSUQgb2YgdGhlIE1CRFJDIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgI0FTTV9NT0RVTEVfSURfTUJEUkMgbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FzbV9tYmRyY19lbmFibGV9CisgKiBAdGFibGVzcGFjZQorICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQVNNX1BBUkFNX0lEX01CRFJDX0VOQUJMRS50ZXh9CisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX01CRFJDX0VOQUJMRSAgIDB4MDAwMTBDMDcKKworLyogSUQgb2YgdGhlIE1CRFJDIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZQorICogI0FTTV9NT0RVTEVfSURfTUJEUkMgbW9kdWxlLgorICogQG1lc3NhZ2VwYXlsb2FkCisgKiBAc3RydWN0dXJle2FzbV9tYmRyY19jb25maWdfcGFyYW1zfQorICogQHRhYmxlc3BhY2UKKyAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FTTV9QQVJBTV9JRF9NQkRSQ19DT05GSUdfUEFSQU1TLnRleH0KKyAqCisgKiBAcGFyc3BhY2UgU3ViLWJhbmQgRFJDIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogQHN0cnVjdHVyZXthc21fc3ViYmFuZF9kcmNfY29uZmlnX3BhcmFtc30KKyAqIEB0YWJsZXNwYWNlCisgKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNU19zdWJiYW5kX0RSQy50ZXh9CisgKgorICogQGtlZXB7Nn0KKyAqIFRvIG9idGFpbiBsZWdhY3kgQURSQyBmcm9tIE1CRFJDLCB1c2UgdGhlIGNhbGlicmF0aW9uIHRvb2wgdG86CisgKgorICogLSBFbmFibGUgTUJEUkMgKEVuYWJsZUZsYWcgPSBUUlVFKQorICogLSBTZXQgbnVtYmVyIG9mIGJhbmRzIHRvIDEgKHVpTnVtQmFuZHMgPSAxKQorICogLSBFbmFibGUgdGhlIGZpcnN0IE1CRFJDIGJhbmQgKERyY01vZGVbMF0gPSBEUkNfRU5BQkxFRCA9IDEpCisgKiAtIENsZWFyIHRoZSBmaXJzdCBiYW5kIG11dGUgZmxhZyAoTXV0ZUZsYWdbMF0gPSAwKQorICogLSBTZXQgdGhlIGZpcnN0IGJhbmQgbWFrZXVwIGdhaW4gdG8gdW5pdHkgKGNvbXBNYWtlVXBHYWluWzBdID0gMHgyMDAwKQorICogLSBVc2UgdGhlIGxlZ2FjeSBBRFJDIHBhcmFtZXRlcnMgdG8gY2FsaWJyYXRlIHRoZSByZXN0IG9mIHRoZSBNQkRSQworICogcGFyYW1ldGVycy4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUyAgMHgwMDAxMEMwOAorCisvKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMgKi8KKworLyogYXVkaW9fcHBfbW9kdWxlX2lkcworICogSUQgb2YgdGhlIE1NQkRSQyBtb2R1bGUgdmVyc2lvbiAyIHByZS9wb3N0cHJvY2Vzc2luZyBibG9jay4KKyAqIFRoaXMgbW9kdWxlIGRpZmZlcnMgZnJvbSB0aGUgb3JpZ2luYWwgTUJEUkMgKCNBU01fTU9EVUxFX0lEX01CRFJDKSBpbgorICogdGhlIGxlbmd0aCBvZiB0aGUgZmlsdGVycyB1c2VkIGluIGVhY2ggc3ViLWJhbmQuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRDoKKyAqIC0gI0FTTV9QQVJBTV9JRF9NQkRSQ19DT05GSUdfUEFSQU1TX0lNUFJPVkVEX0ZJTFRCQU5LX1YyCisgKi8KKyNkZWZpbmUgQVNNX01PRFVMRV9JRF9NQkRSQ1YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwNzBCCisKKy8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLworLyogSUQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZQorICogI0FTTV9NT0RVTEVfSURfTUJEUkNWMiBtb2R1bGUgZm9yIHRoZSBpbXByb3ZlZCBmaWx0ZXIgc3RydWN0dXJlCisgKiBvZiB0aGUgTUJEUkMgdjIgcHJlL3Bvc3Rwcm9jZXNzaW5nIGJsb2NrLgorICogVGhlIHVwZGF0ZSB0byB0aGlzIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGZyb20gdGhlIG9yaWdpbmFsCisgKiBNQkRSQyBpcyB0aGUgbnVtYmVyIG9mIGZpbHRlciBjb2VmZmljaWVudHMgaW4gdGhlIGZpbHRlcgorICogc3RydWN0dXJlLiBUaGUgc2VxdWVuY2UgZm9yIGlzIGFzIGZvbGxvd3M6CisgKiAtIDEgYmFuZCA9IDAgRklSIGNvZWZmaWNpZW50ICsgMSBtdXRlIGZsYWcgKyB1aW50MTZfdCBwYWRkaW5nCisgKiAtIDIgYmFuZHMgPSAxNDEgRklSIGNvZWZmaWNpZW50cyArIDIgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKKyAqIC0gMyBiYW5kcyA9IDE0MSs4MSBGSVIgY29lZmZpY2llbnRzICsgMyBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZworICogLSA0IGJhbmRzID0gMTQxKzgxKzYxIEZJUiBjb2VmZmljaWVudHMgKyA0IG11dGUgZmxhZ3MgKyB1aW50MTZfdAorICogcGFkZGluZworICogLSA1IGJhbmRzID0gMTQxKzgxKzYxKzYxIEZJUiBjb2VmZmljaWVudHMgKyA1IG11dGUgZmxhZ3MgKworICogdWludDE2X3QgcGFkZGluZworICoJVGhpcyBibG9jayB1c2VzIHRoZSBzYW1lIHBhcmFtZXRlciBzdHJ1Y3R1cmUgYXMKKyAqCSNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUy4KKyAqLworI2RlZmluZSBBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNU19JTVBST1ZFRF9GSUxUQkFOS19WMiBcCisJCQkJCQkJCTB4MDAwMTA3MEMKKworI2RlZmluZSBBU01fTU9EVUxFX0lEX01CRFJDVjMJCQkJCTB4MDAwMTA5MEIKKy8qCisgKiBJRCBvZiB0aGUgTU1CRFJDIG1vZHVsZSB2ZXJzaW9uIDMgcHJlL3Bvc3Rwcm9jZXNzaW5nIGJsb2NrLgorICogVGhpcyBtb2R1bGUgZGlmZmVycyBmcm9tIE1CRFJDdjIgKCNBU01fTU9EVUxFX0lEX01CRFJDVjIpIGluCisgKiB0aGF0IGl0IHN1cHBvcnRzIGJvdGggMTYtIGFuZCAyNC1iaXQgZGF0YS4KKyAqIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEOgorICogLSAjQVNNX1BBUkFNX0lEX01CRFJDX0VOQUJMRQorICogLSAjQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVMKKyAqIC0gI0FTTV9QQVJBTV9JRF9NQkRSQ19DT05GSUdfUEFSQU1TX1YzCisgKiAtICNBU01fUEFSQU1fSURfTUJEUkNfRklMVEVSX1hPVkVSX0ZSRVFTCisgKi8KKworLyogU3RydWN0dXJlIGZvciB0aGUgZW5hYmxlIHBhcmFtZXRlciBmb3IgYW4gTUJEUkMgbW9kdWxlLiAqLworCisKKy8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTUJEUkNfRU5BQkxFIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQorICogTUJEUkMgbW9kdWxlLgorICovCitzdHJ1Y3QgYXNtX21iZHJjX2VuYWJsZSB7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciBNQkRSQyBpcyBkaXNhYmxlZCAoMCkgb3IgZW5hYmxlZCAobm9uemVybykuKi8KK30gX19wYWNrZWQ7CisKKy8qIFN0cnVjdHVyZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgYW4gTUJEUkMgbW9kdWxlLiAqLworCisKKy8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUworICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBNQkRSQyBtb2R1bGUuIFxuIFxuIEZvbGxvd2luZyB0aGlzCisgKiBzdHJ1Y3R1cmUgaXMgdGhlIHBheWxvYWQgZm9yIHN1Yi1iYW5kIERSQyBjb25maWd1cmF0aW9uCisgKiBwYXJhbWV0ZXJzIChhc21fc3ViYmFuZF9kcmNfY29uZmlnX3BhcmFtcykuIFRoaXMgc3ViLWJhbmQKKyAqIHN0cnVjdHVyZSBtdXN0IGJlIHJlcGVhdGVkIGZvciBlYWNoIGJhbmQuCisgKi8KKworCitzdHJ1Y3QgYXNtX21iZHJjX2NvbmZpZ19wYXJhbXMgeworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgbnVtX2JhbmRzOworLyo8IE51bWJlciBvZiBiYW5kcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gNQorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGxpbWl0ZXJocmVzaG9sZDsKKy8qPCBUaHJlc2hvbGQgaW4gZGVjaWJlbHMgZm9yIHRoZSBsaW1pdGVyIG91dHB1dC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IC03MiB0byAxOCBcbgorICogUmVjb21tZW5kZWQgdmFsdWU6IDM5OTQgKC0wLjIyIGRiIGluIFEzLjEyIGZvcm1hdCkKKyAqLworCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICBsaW1pdGVyX21ha2V1cF9nYWluOworLyo8IE1ha2V1cCBnYWluIGluIGRlY2liZWxzIGZvciB0aGUgbGltaXRlciBvdXRwdXQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAtNDIgdG8gNDIgXG4KKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAyNTYgKDAgZEIgaW4gUTcuOCBmb3JtYXQpCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgbGltaXRlcl9nYzsKKy8qPCBMaW1pdGVyIGdhaW4gcmVjb3ZlcnkgY29lZmZpY2llbnQuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwLjUgdG8gMC45OSBcbgorICogUmVjb21tZW5kZWQgdmFsdWU6IDMyNDQwICgwLjk5IGluIFExNSBmb3JtYXQpCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgbGltaXRlcl9kZWxheTsKKy8qPCBMaW1pdGVyIGRlbGF5IGluIHNhbXBsZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDEwIFxuCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMjYyICgwLjAwOCBzYW1wbGVzIGluIFExNSBmb3JtYXQpCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgbGltaXRlcl9tYXhfd2FpdDsKKy8qPCBNYXhpbXVtIGxpbWl0ZXIgd2FpdGluZyB0aW1lIGluIHNhbXBsZXMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDEwIFxuCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMjYyICgwLjAwOCBzYW1wbGVzIGluIFExNSBmb3JtYXQpCisgKi8KK30gX19wYWNrZWQ7CisKKy8qIERSQyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBmb3IgZWFjaCBzdWItYmFuZCBvZiBhbiBNQkRSQyBtb2R1bGUuICovCisKKworLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9NQkRSQ19DT05GSUdfUEFSQU1TIERSQworICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBlYWNoIHN1Yi1iYW5kIGluIHRoZSBNQkRSQyBtb2R1bGUuCisgKiBBZnRlciB0aGlzIERSQyBzdHJ1Y3R1cmUgaXMgY29uZmlndXJlZCBmb3IgdmFsaWQgYmFuZHMsIHRoZSBuZXh0CisgKiBNQkRSQyBzZXRwYXJhbXMgZXhwZWN0cyB0aGUgc2VxdWVuY2Ugb2Ygc3ViLWJhbmQgTUJEUkMgZmlsdGVyCisgKiBjb2VmZmljaWVudHMgKHRoZSBsZW5ndGggZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGJhbmRzKSBwbHVzIHRoZQorICogbXV0ZSBmbGFnIGZvciB0aGF0IGJhbmQgcGx1cyB1aW50MTZfdCBwYWRkaW5nLgorICoKKyAqIEBrZWVwezEwfQorICogVGhlIGZpbHRlciBjb2VmZmljaWVudCBhbmQgbXV0ZSBmbGFnIGFyZSBvZiB0eXBlIGludDE2X3Q6CisgKiAtIEZJUiBjb2VmZmljaWVudCA9IGludDE2X3QgZmlyRmlsdGVyCisgKiAtIE11dGUgZmxhZyA9IGludDE2X3QgZk11dGVGbGFnCisgKgorICogVGhlIHNlcXVlbmNlIGlzIGFzIGZvbGxvd3M6CisgKiAtIDEgYmFuZCA9IDAgRklSIGNvZWZmaWNpZW50ICsgMSBtdXRlIGZsYWcgKyB1aW50MTZfdCBwYWRkaW5nCisgKiAtIDIgYmFuZHMgPSA5NyBGSVIgY29lZmZpY2llbnRzICsgMiBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZworICogLSAzIGJhbmRzID0gOTcrMzMgRklSIGNvZWZmaWNpZW50cyArIDMgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKKyAqIC0gNCBiYW5kcyA9IDk3KzMzKzMzIEZJUiBjb2VmZmljaWVudHMgKyA0IG11dGUgZmxhZ3MgKyB1aW50MTZfdCBwYWRkaW5nCisgKiAtIDUgYmFuZHMgPSA5NyszMyszMyszMyBGSVIgY29lZmZpY2llbnRzICsgNSBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZworICoKKyAqIEZvciBpbXByb3ZlZCBmaWx0ZXJiYW5rLCB0aGUgc2VxdWVuY2UgaXMgYXMgZm9sbG93czoKKyAqIC0gMSBiYW5kID0gMCBGSVIgY29lZmZpY2llbnQgKyAxIG11dGUgZmxhZyArIHVpbnQxNl90IHBhZGRpbmcKKyAqIC0gMiBiYW5kcyA9IDE0MSBGSVIgY29lZmZpY2llbnRzICsgMiBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZworICogLSAzIGJhbmRzID0gMTQxKzgxIEZJUiBjb2VmZmljaWVudHMgKyAzIG11dGUgZmxhZ3MgKyB1aW50MTZfdCBwYWRkaW5nCisgKiAtIDQgYmFuZHMgPSAxNDErODErNjEgRklSIGNvZWZmaWNpZW50cyArIDQgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKKyAqIC0gNSBiYW5kcyA9IDE0MSs4MSs2MSs2MSBGSVIgY29lZmZpY2llbnRzICsgNSBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZworICovCitzdHJ1Y3QgYXNtX3N1YmJhbmRfZHJjX2NvbmZpZ19wYXJhbXMgeworCWludDE2X3QgICAgICAgICAgICAgICAgICAgZHJjX3N0ZXJlb19saW5rZWRfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciBhbGwgc3RlcmVvIGNoYW5uZWxzIGhhdmUgdGhlIHNhbWUgYXBwbGllZAorICogZHluYW1pY3MgKDEpIG9yIGlmIHRoZXkgcHJvY2VzcyB0aGVpciBkeW5hbWljcyBpbmRlcGVuZGVudGx5ICgwKS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6CisgKiAtIDAgLS0gTm90IGxpbmtlZAorICogLSAxIC0tIExpbmtlZAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRyY19tb2RlOworLyo8IFNwZWNpZmllcyB3aGV0aGVyIERSQyBtb2RlIGlzIGJ5cGFzc2VkIGZvciBzdWItYmFuZHMuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAwIC0tIERpc2FibGVkCisgKiAtIDEgLS0gRW5hYmxlZAorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRyY19kb3duX3NhbXBsZV9sZXZlbDsKKy8qPCBEUkMgZG93biBzYW1wbGUgbGV2ZWwuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOiBAZ2UgMQorICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRyY19kZWxheTsKKy8qPCBEUkMgZGVsYXkgaW4gc2FtcGxlcy4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTIwMAorICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGRyY19ybXNpbWVfYXZnX2NvbnN0OworLyo8IFJNUyBzaWduYWwgZW5lcmd5IHRpbWUtYXZlcmFnaW5nIGNvbnN0YW50LgorICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAyXjE2LTEKKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBkcmNfbWFrZXVwX2dhaW47CisvKjwgRFJDIG1ha2V1cCBnYWluIGluIGRlY2liZWxzLgorICogU3VwcG9ydGVkIHZhbHVlczogMjU4IHRvIDY0OTE3CisgKi8KKwkvKiBEb3duIGV4cGFuZGVyIHNldHRpbmdzICovCisJaW50MTZfdCAgICAgICAgICAgICAgICAgICBkb3duX2V4cGRyaHJlc2hvbGQ7CisvKjwgRG93biBleHBhbmRlciB0aHJlc2hvbGQuCisgKiBTdXBwb3J0ZWQgUTcgZm9ybWF0IHZhbHVlczogMTMyMCB0byB1cF9jbXBzcmhyZXNob2xkCisgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgZG93bl9leHBkcl9zbG9wZTsKKy8qPCBEb3duIGV4cGFuZGVyIHNsb3BlLgorICogU3VwcG9ydGVkIFE4IGZvcm1hdCB2YWx1ZXM6IC0zMjc2OCB0byAwLgorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRvd25fZXhwZHJfYXR0YWNrOworLyo8IERvd24gZXhwYW5kZXIgYXR0YWNrIGNvbnN0YW50LgorICogU3VwcG9ydGVkIFEzMSBmb3JtYXQgdmFsdWVzOiAxOTY4NDQgdG8gMl4zMS4KKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBkb3duX2V4cGRyX3JlbGVhc2U7CisvKjwgRG93biBleHBhbmRlciByZWxlYXNlIGNvbnN0YW50LgorICogU3VwcG9ydGVkIFEzMSBmb3JtYXQgdmFsdWVzOiAxOTY4NSB0byAyXjMxCisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZG93bl9leHBkcl9oeXN0ZXJlc2lzOworLyo8IERvd24gZXhwYW5kZXIgaHlzdGVyZXNpcyBjb25zdGFudC4KKyAqIFN1cHBvcnRlZCBRMTQgZm9ybWF0IHZhbHVlczogMSB0byAzMjY5MAorICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KKworCWludDMyX3QgICAgICAgICAgICAgICAgICAgZG93bl9leHBkcl9taW5fZ2Fpbl9kYjsKKy8qPCBEb3duIGV4cGFuZGVyIG1pbmltdW0gZ2Fpbi4KKyAqIFN1cHBvcnRlZCBRMjMgZm9ybWF0IHZhbHVlczogLTgwNTMwNjM2OCB0byAwLgorICovCisKKwkvKiBVcCBjb21wcmVzc29yIHNldHRpbmdzICovCisKKwlpbnQxNl90ICAgICAgICAgICAgICAgICAgIHVwX2NtcHNyaHJlc2hvbGQ7CisvKjwgVXAgY29tcHJlc3NvciB0aHJlc2hvbGQuCisgKiBTdXBwb3J0ZWQgUTcgZm9ybWF0IHZhbHVlczogZG93bl9leHBkcmhyZXNob2xkIHRvCisgKiBkb3duX2NtcHNyaHJlc2hvbGQuCisgKi8KKworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgdXBfY21wc3Jfc2xvcGU7CisvKjwgVXAgY29tcHJlc3NvciBzbG9wZS4KKyAqIFN1cHBvcnRlZCBRMTYgZm9ybWF0IHZhbHVlczogMCB0byA2NDg4MS4KKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICB1cF9jbXBzcl9hdHRhY2s7CisvKjwgVXAgY29tcHJlc3NvciBhdHRhY2sgY29uc3RhbnQuCisgKiBTdXBwb3J0ZWQgUTMxIGZvcm1hdCB2YWx1ZXM6IDE5Njg0NCB0byAyXjMxLgorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHVwX2NtcHNyX3JlbGVhc2U7CisvKjwgVXAgY29tcHJlc3NvciByZWxlYXNlIGNvbnN0YW50LgorICogU3VwcG9ydGVkIFEzMSBmb3JtYXQgdmFsdWVzOiAxOTY4NSB0byAyXjMxLgorICovCisKKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHVwX2NtcHNyX2h5c3RlcmVzaXM7CisvKjwgVXAgY29tcHJlc3NvciBoeXN0ZXJlc2lzIGNvbnN0YW50LgorICogU3VwcG9ydGVkIFExNCBmb3JtYXQgdmFsdWVzOiAxIHRvIDMyNjkwLgorICovCisKKwkvKiBEb3duIGNvbXByZXNzb3Igc2V0dGluZ3MgKi8KKworCWludDE2X3QgICAgICAgICAgICAgICAgICAgZG93bl9jbXBzcmhyZXNob2xkOworLyo8IERvd24gY29tcHJlc3NvciB0aHJlc2hvbGQuCisgKiBTdXBwb3J0ZWQgUTcgZm9ybWF0IHZhbHVlczogdXBfY21wc3JocmVzaG9sZCB0byAxMTU2MC4KKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBkb3duX2NtcHNyX3Nsb3BlOworLyo8IERvd24gY29tcHJlc3NvciBzbG9wZS4KKyAqIFN1cHBvcnRlZCBRMTYgZm9ybWF0IHZhbHVlczogMCB0byA2NDg4MS4KKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7CisvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRvd25fY21wc3JfYXR0YWNrOworLyo8IERvd24gY29tcHJlc3NvciBhdHRhY2sgY29uc3RhbnQuCisgKiBTdXBwb3J0ZWQgUTMxIGZvcm1hdCB2YWx1ZXM6IDE5Njg0NCB0byAyXjMxLgorICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRvd25fY21wc3JfcmVsZWFzZTsKKy8qPCBEb3duIGNvbXByZXNzb3IgcmVsZWFzZSBjb25zdGFudC4KKyAqIFN1cHBvcnRlZCBRMzEgZm9ybWF0IHZhbHVlczogMTk2ODUgdG8gMl4zMS4KKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBkb3duX2NtcHNyX2h5c3RlcmVzaXM7CisvKjwgRG93biBjb21wcmVzc29yIGh5c3RlcmVzaXMgY29uc3RhbnQuCisgKiBTdXBwb3J0ZWQgUTE0IHZhbHVlczogMSB0byAzMjY5MC4KKyAqLworCisJdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7CisvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX01PRFVMRV9JRF9FUVVBTElaRVIgICAgICAgICAgICAweDAwMDEwQzI3CisjZGVmaW5lIEFTTV9QQVJBTV9JRF9FUVVBTElaRVJfUEFSQU1FVEVSUyAgMHgwMDAxMEMyOAorCisjZGVmaW5lIEFTTV9NQVhfRVFfQkFORFMgMTIKKworc3RydWN0IGFzbV9lcV9wZXJfYmFuZF9wYXJhbXMgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgYmFuZF9pZHg7CisvKjwgQmFuZCBpbmRleC4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTEKKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBmaWx0ZXJ5cGU7CisvKjwgVHlwZSBvZiBmaWx0ZXIuCisgKiBTdXBwb3J0ZWQgdmFsdWVzOgorICogLSAjQVNNX1BBUkFNX0VRWVBFX05PTkUKKyAqIC0gI0FTTV9QQVJBTV9FUV9CQVNTX0JPT1NUCisgKiAtICNBU01fUEFSQU1fRVFfQkFTU19DVVQKKyAqIC0gI0FTTV9QQVJBTV9FUVJFQkxFX0JPT1NUCisgKiAtICNBU01fUEFSQU1fRVFSRUJMRV9DVVQKKyAqIC0gI0FTTV9QQVJBTV9FUV9CQU5EX0JPT1NUCisgKiAtICNBU01fUEFSQU1fRVFfQkFORF9DVVQKKyAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBjZW50ZXJfZnJlcV9oejsKKwkvKjwgRmlsdGVyIGJhbmQgY2VudGVyIGZyZXF1ZW5jeSBpbiBIZXJ0ei4gKi8KKworCWludDMyX3QgICAgICAgICAgICAgICAgICAgZmlsdGVyX2dhaW47CisvKjwgRmlsdGVyIGJhbmQgaW5pdGlhbCBnYWluLgorICogU3VwcG9ydGVkIHZhbHVlczogKzEyIHRvIC0xMiBkQiBpbiAxIGRCIGluY3JlbWVudHMKKyAqLworCisJaW50MzJfdCAgICAgICAgICAgICAgICAgICBxX2ZhY3RvcjsKKy8qPCBGaWx0ZXIgYmFuZCBxdWFsaXR5IGZhY3RvciBleHByZXNzZWQgYXMgYSBROCBudW1iZXIsIGkuZS4sIGEKKyAqIGZpeGVkLXBvaW50IG51bWJlciB3aXRoIHEgZmFjdG9yIG9mIDguIEZvciBleGFtcGxlLCAzMDAwLygyXjgpLgorICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2VxX3BhcmFtcyB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOworCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKKwkJdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKKy8qPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgZXF1YWxpemVyIG1vZHVsZSBpcyBkaXNhYmxlZCAoMCkgb3IgZW5hYmxlZAorICogKG5vbnplcm8pLgorICovCisKKwkJdWludDMyX3QgICAgICAgICAgICAgICAgICBudW1fYmFuZHM7CisvKjwgTnVtYmVyIG9mIGJhbmRzLgorICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAxMgorICovCisJc3RydWN0IGFzbV9lcV9wZXJfYmFuZF9wYXJhbXMgZXFfYmFuZHNbQVNNX01BWF9FUV9CQU5EU107CisKK30gX19wYWNrZWQ7CisKKy8qCU5vIGVxdWFsaXplciBlZmZlY3QuKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0VRWVBFX05PTkUgICAgICAwCisKKy8qCUJhc3MgYm9vc3QgZXF1YWxpemVyIGVmZmVjdC4qLworI2RlZmluZSBBU01fUEFSQU1fRVFfQkFTU19CT09TVCAgICAgMQorCisvKkJhc3MgY3V0IGVxdWFsaXplciBlZmZlY3QuKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0VRX0JBU1NfQ1VUICAgICAgIDIKKworLyoJVHJlYmxlIGJvb3N0IGVxdWFsaXplciBlZmZlY3QgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0VRUkVCTEVfQk9PU1QgICAzCisKKy8qCVRyZWJsZSBjdXQgZXF1YWxpemVyIGVmZmVjdC4qLworI2RlZmluZSBBU01fUEFSQU1fRVFSRUJMRV9DVVQgICAgIDQKKworLyoJQmFuZCBib29zdCBlcXVhbGl6ZXIgZWZmZWN0LiovCisjZGVmaW5lIEFTTV9QQVJBTV9FUV9CQU5EX0JPT1NUICAgICA1CisKKy8qCUJhbmQgY3V0IGVxdWFsaXplciBlZmZlY3QuKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0VRX0JBTkRfQ1VUICAgICAgIDYKKworLyogVm9pY2UgZ2V0ICYgc2V0IHBhcmFtcyAqLworI2RlZmluZSBWT0lDRV9DTURfU0VUX1BBUkFNCQkJCTB4MDAwMTEzM0QKKyNkZWZpbmUgVk9JQ0VfQ01EX0dFVF9QQVJBTQkJCQkweDAwMDExMzNFCisjZGVmaW5lIFZPSUNFX0VWVF9HRVRfUEFSQU1fQUNLCQkJCTB4MDAwMTEwMDgKKworCisvKiBJRCBvZiB0aGUgQmFzcyBCb29zdCBtb2R1bGUuCisgKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6CisgKiAgLSAjQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX0VOQUJMRQorICogIC0gI0FVRFBST0NfUEFSQU1fSURfQkFTU19CT09TVF9NT0RFCisgKiAgLSAjQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX1NUUkVOR1RICisgKi8KKyNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBMQorLyogSUQgb2YgdGhlIEJhc3MgQm9vc3QgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NULgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQkFTU19CT09TVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QTIKKy8qIElEIG9mIHRoZSBCYXNzIEJvb3N0IG1vZGUgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1QuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBMworLyogSUQgb2YgdGhlIEJhc3MgQm9vc3Qgc3RyZW5ndGggcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1QuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX1NUUkVOR1RIICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBNAorCisvKiBJRCBvZiB0aGUgUEJFIG1vZHVsZS4KKyAqIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfUEJFX0VOQUJMRQorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9QQkVfUEFSQU1fQ09ORklHCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfUEJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMyQQorLyogSUQgb2YgdGhlIEJhc3MgQm9vc3QgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NULgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUEJFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDMkIKKy8qIElEIG9mIHRoZSBCYXNzIEJvb3N0IG1vZGUgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1QuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9QQkVfUEFSQU1fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEM0OQorCisvKiBJRCBvZiB0aGUgVmlydHVhbGl6ZXIgbW9kdWxlLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUKKyAqIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9FTkFCTEUKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfU1RSRU5HVEgKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfT1VUX1RZUEUKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfR0FJTl9BREpVU1QKKyAqLworI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEE1CisvKiBJRCBvZiB0aGUgVmlydHVhbGl6ZXIgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEE2CisvKiBJRCBvZiB0aGUgVmlydHVhbGl6ZXIgc3RyZW5ndGggcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfU1RSRU5HVEggICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QTcKKy8qIElEIG9mIHRoZSBWaXJ0dWFsaXplciBvdXQgdHlwZSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVIuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9PVVRfVFlQRSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBOAorLyogSUQgb2YgdGhlIFZpcnR1YWxpemVyIG91dCB0eXBlIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX0dBSU5fQURKVVNUICAgICAgICAgICAgICAgICAweDAwMDEwOEE5CisKKy8qIElEIG9mIHRoZSBSZXZlcmIgbW9kdWxlLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgKiBwYXJhbWV0ZXIgSURzOgorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfRU5BQkxFCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9NT0RFCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9QUkVTRVQKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX1dFVF9NSVgKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX0dBSU5fQURKVVNUCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0xFVkVMCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0hGX0xFVkVMCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUNBWV9USU1FCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUNBWV9IRl9SQVRJTworICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUkVGTEVDVElPTlNfTEVWRUwKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9MRVZFTAorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVMQVkKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RJRkZVU0lPTgorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVOU0lUWQorICovCisjZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBQQorLyogSUQgb2YgdGhlIFJldmVyYiBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QUIKKy8qIElEIG9mIHRoZSBSZXZlcmIgbW9kZSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX01PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBQworLyogSUQgb2YgdGhlIFJldmVyYiBwcmVzZXQgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9QUkVTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QUQKKy8qIElEIG9mIHRoZSBSZXZlcmIgd2V0IG1peCBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1dFVF9NSVggICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBRQorLyogSUQgb2YgdGhlIFJldmVyYiBnYWluIGFkanVzdCBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0dBSU5fQURKVVNUICAgICAgICAgICAgICAgMHgwMDAxMDhBRgorLyogSUQgb2YgdGhlIFJldmVyYiByb29tIGxldmVsIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUk9PTV9MRVZFTCAgICAgICAgICAgICAgICAweDAwMDEwOEIwCisvKiBJRCBvZiB0aGUgUmV2ZXJiIHJvb20gaGYgbGV2ZWwgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0hGX0xFVkVMICAgICAgICAgICAgIDB4MDAwMTA4QjEKKy8qIElEIG9mIHRoZSBSZXZlcmIgZGVjYXkgdGltZSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX1RJTUUgICAgICAgICAgICAgICAgMHgwMDAxMDhCMgorLyogSUQgb2YgdGhlIFJldmVyYiBkZWNheSBoZiByYXRpbyBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX0hGX1JBVElPICAgICAgICAgICAgMHgwMDAxMDhCMworLyogSUQgb2YgdGhlIFJldmVyYiByZWZsZWN0aW9ucyBsZXZlbCBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMICAgICAgICAgMHgwMDAxMDhCNAorLyogSUQgb2YgdGhlIFJldmVyYiByZWZsZWN0aW9ucyBkZWxheSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZICAgICAgICAgMHgwMDAxMDhCNQorLyogSUQgb2YgdGhlIFJldmVyYiBsZXZlbCBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0xFVkVMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QjYKKy8qIElEIG9mIHRoZSBSZXZlcmIgZGVsYXkgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEI3CisvKiBJRCBvZiB0aGUgUmV2ZXJiIGRpZmZ1c2lvbiBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RJRkZVU0lPTiAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QjgKKy8qIElEIG9mIHRoZSBSZXZlcmIgZGVuc2l0eSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QjkKKworLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIG1vZHVsZS4gVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlCisgKiBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfRU5BQkxFCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX0NPTkZJRworICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9OVU1fQkFORFMKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfQkFORF9MRVZFTFMKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfQkFORF9MRVZFTF9SQU5HRQorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0ZSRVFTCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX1NJTkdMRV9CQU5EX0ZSRVFfUkFOR0UKKyAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfU0lOR0xFX0JBTkRfRlJFUQorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0lOREVYCisgKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX1BSRVNFVF9JRAorICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9OVU1fUFJFU0VUUworICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9HRVRfUFJFU0VUX05BTUUKKyAqLworI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUiAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCQQorLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QkIKKy8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBjb25maWcgcGFyYW1ldGVyIHVzZWQgYnkKKyAqIEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEJDCisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgbnVtYmVyIG9mIGJhbmRzIHBhcmFtZXRlciB1c2VkCisgKiBieSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcworICogdXNlZCBmb3IgZ2V0IHBhcmFtIG9ubHkuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9OVU1fQkFORFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QkQKKy8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBiYW5kIGxldmVscyBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuIFRoaXMgcGFyYW0gSUQgaXMKKyAqIHVzZWQgZm9yIGdldCBwYXJhbSBvbmx5LgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfQkFORF9MRVZFTFMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEJFCisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgYmFuZCBsZXZlbCByYW5nZSBwYXJhbWV0ZXIgdXNlZAorICogYnkgQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuIFRoaXMgcGFyYW0gSUQgaXMKKyAqIHVzZWQgZm9yIGdldCBwYXJhbSBvbmx5LgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfQkFORF9MRVZFTF9SQU5HRSAgICAgICAgICAgICAgICAgICAweDAwMDEwOEJGCisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgYmFuZCBmcmVxdWVuY2llcyBwYXJhbWV0ZXIgdXNlZAorICogYnkgQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuIFRoaXMgcGFyYW0gSUQgaXMKKyAqIHVzZWQgZm9yIGdldCBwYXJhbSBvbmx5LgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfQkFORF9GUkVRUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEMwCisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgc2luZ2xlIGJhbmQgZnJlcXVlbmN5IHJhbmdlCisgKiBwYXJhbWV0ZXIgdXNlZCBieSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4KKyAqICBUaGlzIHBhcmFtIElEIGlzIHVzZWQgZm9yIGdldCBwYXJhbSBvbmx5LgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRSAgICAgICAgICAgICAweDAwMDEwOEMxCisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgc2luZ2xlIGJhbmQgZnJlcXVlbmN5IHBhcmFtZXRlcgorICogdXNlZCBieSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRAorICogaXMgdXNlZCBmb3Igc2V0IHBhcmFtIG9ubHkuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9TSU5HTEVfQkFORF9GUkVRICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QzIKKy8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBiYW5kIGluZGV4IHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX0JBTkRfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhDMworLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIHByZXNldCBpZCBwYXJhbWV0ZXIgdXNlZCBieQorICogQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuIFRoaXMgcGFyYW0gSUQgaXMgdXNlZAorICogZm9yIGdldCBwYXJhbSBvbmx5LgorICovCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfUFJFU0VUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEM0CisvKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgbnVtYmVyIG9mIHByZXNldHMgcGFyYW1ldGVyIHVzZWQKKyAqIGJ5IEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLiBUaGlzIHBhcmFtIElEIGlzIHVzZWQKKyAqIGZvciBnZXQgcGFyYW0gb25seS4KKyAqLworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX05VTV9QUkVTRVRTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhDNQorLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIHByZXNldCBuYW1lIHBhcmFtZXRlciB1c2VkIGJ5CisgKiBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcyB1c2VkCisgKiBmb3IgZ2V0IHBhcmFtIG9ubHkuCisgKi8KKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9QUkVTRVRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QzYKKworLyogU2V0IFE2IHRvcG9sb2dpZXMgKi8KKyNkZWZpbmUgQVNNX0NNRF9BRERfVE9QT0xPR0lFUwkJCQkweDAwMDEwREJFCisjZGVmaW5lIEFETV9DTURfQUREX1RPUE9MT0dJRVMJCQkJMHgwMDAxMDMzNQorI2RlZmluZSBBRkVfQ01EX0FERF9UT1BPTE9HSUVTCQkJCTB4MDAwMTAwZjgKKy8qIHN0cnVjdHVyZSB1c2VkIGZvciBib3RoIGlvY3RscyAqLworc3RydWN0IGNtZF9zZXRfdG9wb2xvZ2llcyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMgkJcGF5bG9hZF9hZGRyX2xzdzsKKwkvKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiovCisJdTMyCQlwYXlsb2FkX2FkZHJfbXN3OworCS8qIE1TVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuKi8KKwl1MzIJCW1lbV9tYXBfaGFuZGxlOworCS8qIE1lbW9yeSBtYXAgaGFuZGxlIHJldHVybmVkIGJ5IG1lbSBtYXAgY29tbWFuZCAqLworCXUzMgkJcGF5bG9hZF9zaXplOworCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhcmlhYmxlIHBheWxvYWQgaW4gc2hhcmVkIG1lbW9yeSAqLworfSBfX3BhY2tlZDsKKworLyogVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgUnggcHJvY2Vzc2luZyBvZiBGZWVkYmFjayBzcGVha2VyIHByb3RlY3Rpb24uCisgKiBJdCBjb250YWlucyB0aGUgZXhjdXJzaW9uIGNvbnRyb2wsIHRoZXJtYWwgcHJvdGVjdGlvbiwKKyAqIGFuYWxvZyBjbGlwIG1hbmFnZXIgZmVhdHVyZXMgaW4gaXQuCisgKiBUaGlzIG1vZHVsZSBpZCB3aWxsIHN1cHBvcnQgZm9sbG93aW5nIHBhcmFtIGlkcy4KKyAqIC0gQUZFX1BBUkFNX0lEX0ZCU1BfTU9ERV9SWF9DRkcKKyAqLworCisjZGVmaW5lIEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1JYIDB4MDAwMTAyMUMKKyNkZWZpbmUgQUZFX01PRFVMRV9GQl9TUEtSX1BST1RfVjJfUlggMHgwMDAxMDI1RgorCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9GQlNQX01PREVfUlhfQ0ZHIDB4MDAwMTAyMUQKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0ZCU1BfUFRPTkVfUkFNUF9DRkcgMHgwMDAxMDI2MAorCitzdHJ1Y3QgYXNtX2Zic3BfbW9kZV9yeF9jZmcgeworCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247CisJdWludDMyX3QgbW9kZTsKK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgbW9kdWxlIHJlcHJlc2VudHMgdGhlIFZJIHByb2Nlc3Npbmcgb2YgZmVlZGJhY2sgc3BlYWtlciBwcm90ZWN0aW9uLgorICogSXQgd2lsbCByZWNlaXZlIFZzZW5zIGFuZCBJc2VucyBmcm9tIGNvZGVjIGFuZCBnZW5lcmF0ZXMgbmVjZXNzYXJ5CisgKiBwYXJhbWV0ZXJzIG5lZWRlZCBieSBSeCBwcm9jZXNzaW5nLgorICogVGhpcyBtb2R1bGUgaWQgd2lsbCBzdXBwb3J0IGZvbGxvd2luZyBwYXJhbSBpZHMuCisgKiAtIEFGRV9QQVJBTV9JRF9TUEtSX0NBTElCX1ZJX1BST0NfQ0ZHCisgKiAtIEFGRV9QQVJBTV9JRF9DQUxJQl9SRVNfQ0ZHCisgKiAtIEFGRV9QQVJBTV9JRF9GRUVEQkFDS19QQVRIX0NGRworICovCisKKyNkZWZpbmUgQUZFX01PRFVMRV9GQl9TUEtSX1BST1RfVklfUFJPQyAweDAwMDEwMjI2CisjZGVmaW5lIEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1ZJX1BST0NfVjIgMHgwMDAxMDI2QQorCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUEtSX0NBTElCX1ZJX1BST0NfQ0ZHIDB4MDAwMTAyMkEKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQS1JfQ0FMSUJfVklfUFJPQ19DRkdfVjIgIDB4MDAwMTAyNkIKKworc3RydWN0IGFzbV9zcGtyX2NhbGliX3ZpX3Byb2NfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IG9wZXJhdGlvbl9tb2RlOworCXVpbnQzMl90IHIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX05VTV9NQVhfU1BLUl07CisJaW50MzJfdCByMF9jYWxpX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOworCWludDE2X3QJdDBfY2FsaV9xNltTUF9WMl9OVU1fTUFYX1NQS1JdOworCXVpbnQzMl90IHF1aWNrX2NhbGliX2ZsYWc7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DQUxJQl9SRVNfQ0ZHIDB4MDAwMTAyMkIKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0NBTElCX1JFU19DRkdfVjIgMHgwMDAxMDI2RQorCitzdHJ1Y3QgYXNtX2NhbGliX3Jlc19jZmcgeworCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247CisJaW50MzJfdAlyMF9jYWxpX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOworCXVpbnQzMl90IHRoX3ZpX2NhX3N0YXRlOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUEFSQU1fSURfRkVFREJBQ0tfUEFUSF9DRkcgMHgwMDAxMDIyQworI2RlZmluZSBBRkVfTU9EVUxFX0ZFRURCQUNLIDB4MDAwMTAyNTcKKworc3RydWN0IGFzbV9mZWVkYmFja19wYXRoX2NmZyB7CisJdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKwlpbnQzMl90CWRzdF9wb3J0aWQ7CisJaW50MzJfdAludW1fY2hhbm5lbHM7CisJaW50MzJfdAljaGFuX2luZm9bNF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9NT0RFX1ZJX1BST0NfQ0ZHIDB4MDAwMTAyMjcKKworc3RydWN0IGFzbV9tb2RlX3ZpX3Byb2NfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IGNhbF9tb2RlOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9USF9WSQkweDAwMDEwMjZBCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9NT0RFX0NGRwkweDAwMDEwMjZCCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fQ0ZHCTB4MDAwMTAyOUYKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX0ZUTV9QQVJBTVMJMHgwMDAxMDJBMAorCitzdHJ1Y3QgYWZlX3NwX3RoX3ZpX21vZGVfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IG9wZXJhdGlvbl9tb2RlOworCS8qCisJICogT3BlcmF0aW9uIG1vZGUgb2YgdGhlcm1hbCBWSSBtb2R1bGUuCisJICogICAwIC0tIE5vcm1hbCBSdW5uaW5nIG1vZGUKKwkgKiAgIDEgLS0gQ2FsaWJyYXRpb24gbW9kZQorCSAqICAgMiAtLSBGVE0gbW9kZQorCSAqLworCXVpbnQzMl90IHIwdDBfc2VsZWN0aW9uX2ZsYWdbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIFNwZWNpZmllcyB3aGljaCBzZXQgb2YgUjAsIFQwIHZhbHVlcyB0aGUgYWxnb3JpdGhtIHdpbGwgdXNlLgorCSAqIFRoaXMgZmllbGQgaXMgdmFsaWQgb25seSBpbiBOb3JtYWwgbW9kZSAob3BlcmF0aW9uX21vZGUgPSAwKS4KKwkgKiAwIC0tIFVzZSBjYWxpYnJhdGVkIFIwLCBUMCB2YWx1ZQorCSAqIDEgLS0gVXNlIHNhZmUgUjAsIFQwIHZhbHVlCisJICovCisJaW50MzJfdCByMF9jYWxpX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogQ2FsaWJyYXRpb24gcG9pbnQgcmVzaXN0YW5jZSBwZXIgZGV2aWNlLiBUaGlzIGZpZWxkIGlzIHZhbGlkCisJICogb25seSBpbiBOb3JtYWwgbW9kZSAob3BlcmF0aW9uX21vZGUgPSAwKS4KKwkgKiB2YWx1ZXMgMzM1NTQ0MzIgdG8gMTA3Mzc0MTgyNCBPaG1zIChpbiBRMjQgZm9ybWF0KQorCSAqLworCWludDE2X3QgdDBfY2FsaV9xNltTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogQ2FsaWJyYXRpb24gcG9pbnQgdGVtcGVyYXR1cmUgcGVyIGRldmljZS4gVGhpcyBmaWVsZCBpcyB2YWxpZAorCSAqIGluIGJvdGggTm9ybWFsIG1vZGUgYW5kIENhbGlicmF0aW9uIG1vZGUuCisJICogdmFsdWVzIC0xOTIwIHRvIDUxMjAgZGVncmVlcyBDIChpbiBRNiBmb3JtYXQpCisJICovCisJdWludDMyX3QgcXVpY2tfY2FsaWJfZmxhZzsKKwkvKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIGNhbGlicmF0aW9uIGlzIHRvIGJlIGRvbmUgaW4gcXVpY2sgbW9kZSBvciBub3QuCisJICogVGhpcyBmaWVsZCBpcyB2YWxpZCBvbmx5IGluIENhbGlicmF0aW9uIG1vZGUgKG9wZXJhdGlvbl9tb2RlID0gMSkuCisJICogMCAtLSBEaXNhYmxlZAorCSAqIDEgLS0gRW5hYmxlZAorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF90aF92aV9mdG1fY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IHdhaXRfdGltZV9tc1tTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogV2FpdCB0aW1lIHRvIGhlYXQgdXAgc3BlYWtlciBiZWZvcmUgY29sbGVjdGluZyBzdGF0aXN0aWNzCisJICogZm9yIGZ0bSBtb2RlIGluIG1zLgorCSAqIHZhbHVlcyAwIHRvIDQyOTQ5NjcyOTUgbXMKKwkgKi8KKwl1aW50MzJfdCBmdG1fdGltZV9tc1tTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogZHVyYXRpb24gZm9yIHdoaWNoIEZUTSBzdGF0aXN0aWNzIGFyZSBjb2xsZWN0ZWQgaW4gbXMuCisJICogdmFsdWVzIDAgdG8gMjAwMCBtcworCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF90aF92aV9mdG1fcGFyYW1zIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCWludDMyX3QgZGNfcmVzX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogREMgcmVzaXN0YW5jZSB2YWx1ZSBpbiBxMjQgZm9ybWF0CisJICogdmFsdWVzIDAgdG8gMjE0NzQ4MzY0NyBPaG1zIChpbiBRMjQgZm9ybWF0KQorCSAqLworCWludDMyX3QgdGVtcF9xMjJbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIHRlbXBlcmF0dXJlIHZhbHVlIGluIHEyMiBmb3JtYXQKKwkgKiB2YWx1ZXMgLTEyNTgyOTEyMCB0byAyMTQ3NDgzNjQ3IGRlZ0MgKGluIFEyMiBmb3JtYXQpCisJICovCisJdWludDMyX3Qgc3RhdHVzW1NQX1YyX05VTV9NQVhfU1BLUl07CisJLyoKKwkgKiBGVE0gcGFja2V0IHN0YXR1cworCSAqIDAgLSBJbmNvcnJlY3Qgb3BlcmF0aW9uIG1vZGUuVGhpcyBzdGF0dXMgaXMgcmV0dXJuZWQKKwkgKiAgICAgd2hlbiBHRVRfUEFSQU0gaXMgY2FsbGVkIGluIG5vbiBGVE0gTW9kZQorCSAqIDEgLSBJbmFjdGl2ZSBtb2RlIC0tIFBvcnQgaXMgbm90IHlldCBzdGFydGVkLgorCSAqIDIgLSBXYWl0IHN0YXRlLiB3YWl0X3RpbWVfbXMgaGFzIG5vdCB5ZXQgZWxhcHNlZAorCSAqIDMgLSBJbiBwcm9ncmVzcyBzdGF0ZS4gZnRtX3RpbWVfbXMgaGFzIG5vdCB5ZXQgZWxhcHNlZC4KKwkgKiA0IC0gU3VjY2Vzcy4KKwkgKiA1IC0gRmFpbGVkLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF90aF92aV9nZXRfcGFyYW0geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX2dldF9wYXJhbV92MiBnZXRfcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7CisJc3RydWN0IGFmZV9zcF90aF92aV9mdG1fcGFyYW1zIHBhcmFtOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF90aF92aV9nZXRfcGFyYW1fcmVzcCB7CisJdWludDMyX3Qgc3RhdHVzOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOworCXN0cnVjdCBhZmVfc3BfdGhfdmlfZnRtX3BhcmFtcyBwYXJhbTsKK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9FWF9WSQkweDAwMDEwMjZGCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9NT0RFX0NGRwkweDAwMDEwMkExCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fQ0ZHCTB4MDAwMTAyQTIKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX0ZUTV9QQVJBTVMJMHgwMDAxMDJBMworCitzdHJ1Y3QgYWZlX3NwX2V4X3ZpX21vZGVfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IG9wZXJhdGlvbl9tb2RlOworCS8qCisJICogT3BlcmF0aW9uIG1vZGUgb2YgRXhjdXJzaW9uIFZJIG1vZHVsZS4KKwkgKiAwIC0gTm9ybWFsIFJ1bm5pbmcgbW9kZQorCSAqIDIgLSBGVE0gbW9kZQorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF9leF92aV9mdG1fY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IHdhaXRfdGltZV9tc1tTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogV2FpdCB0aW1lIHRvIGhlYXQgdXAgc3BlYWtlciBiZWZvcmUgY29sbGVjdGluZyBzdGF0aXN0aWNzCisJICogZm9yIGZ0bSBtb2RlIGluIG1zLgorCSAqIHZhbHVlcyAwIHRvIDQyOTQ5NjcyOTUgbXMKKwkgKi8KKwl1aW50MzJfdCBmdG1fdGltZV9tc1tTUF9WMl9OVU1fTUFYX1NQS1JdOworCS8qCisJICogZHVyYXRpb24gZm9yIHdoaWNoIEZUTSBzdGF0aXN0aWNzIGFyZSBjb2xsZWN0ZWQgaW4gbXMuCisJICogdmFsdWVzIDAgdG8gMjAwMCBtcworCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zcF9leF92aV9mdG1fcGFyYW1zIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCWludDMyX3QgZnJlcV9xMjBbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIFJlc29uYW5jZSBmcmVxdWVuY3kgaW4gcTIwIGZvcm1hdAorCSAqIHZhbHVlcyAwIHRvIDIxNDc0ODM2NDcgSHogKGluIFEyMCBmb3JtYXQpCisJICovCisJaW50MzJfdCByZXNpc19xMjRbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIE1lY2hhbmljYWwgcmVzaXN0YW5jZSBpbiBxMjQgZm9ybWF0CisJICogdmFsdWVzIDAgdG8gMjE0NzQ4MzY0NyBPaG1zIChpbiBRMjQgZm9ybWF0KQorCSAqLworCWludDMyX3QgcW1jdF9xMjRbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIE1lY2hhbmljYWwgUWZhY3RvciBpbiBxMjQgZm9ybWF0CisJICogdmFsdWVzIDAgdG8gMjE0NzQ4MzY0NyAoaW4gUTI0IGZvcm1hdCkKKwkgKi8KKwl1aW50MzJfdCBzdGF0dXNbU1BfVjJfTlVNX01BWF9TUEtSXTsKKwkvKgorCSAqIEZUTSBwYWNrZXQgc3RhdHVzCisJICogMCAtIEluY29ycmVjdCBvcGVyYXRpb24gbW9kZS5UaGlzIHN0YXR1cyBpcyByZXR1cm5lZAorCSAqICAgICAgd2hlbiBHRVRfUEFSQU0gaXMgY2FsbGVkIGluIG5vbiBGVE0gTW9kZS4KKwkgKiAxIC0gSW5hY3RpdmUgbW9kZSAtLSBQb3J0IGlzIG5vdCB5ZXQgc3RhcnRlZC4KKwkgKiAyIC0gV2FpdCBzdGF0ZS4gd2FpdF90aW1lX21zIGhhcyBub3QgeWV0IGVsYXBzZWQKKwkgKiAzIC0gSW4gcHJvZ3Jlc3Mgc3RhdGUuIGZ0bV90aW1lX21zIGhhcyBub3QgeWV0IGVsYXBzZWQuCisJICogNCAtIFN1Y2Nlc3MuCisJICogNSAtIEZhaWxlZC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3BfZXhfdmlfZ2V0X3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9wb3J0X2NtZF9nZXRfcGFyYW1fdjIgZ2V0X3BhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOworCXN0cnVjdCBhZmVfc3BfZXhfdmlfZnRtX3BhcmFtcyBwYXJhbTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3BfZXhfdmlfZ2V0X3BhcmFtX3Jlc3AgeworCXVpbnQzMl90IHN0YXR1czsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3NwX2V4X3ZpX2Z0bV9wYXJhbXMgcGFyYW07Cit9IF9fcGFja2VkOworCit1bmlvbiBhZmVfc3Brcl9wcm90X2NvbmZpZyB7CisJc3RydWN0IGFzbV9mYnNwX21vZGVfcnhfY2ZnIG1vZGVfcnhfY2ZnOworCXN0cnVjdCBhc21fc3Brcl9jYWxpYl92aV9wcm9jX2NmZyB2aV9wcm9jX2NmZzsKKwlzdHJ1Y3QgYXNtX2ZlZWRiYWNrX3BhdGhfY2ZnIGZlZWRiYWNrX3BhdGhfY2ZnOworCXN0cnVjdCBhc21fbW9kZV92aV9wcm9jX2NmZyBtb2RlX3ZpX3Byb2NfY2ZnOworCXN0cnVjdCBhZmVfc3BfdGhfdmlfbW9kZV9jZmcgdGhfdmlfbW9kZV9jZmc7CisJc3RydWN0IGFmZV9zcF90aF92aV9mdG1fY2ZnIHRoX3ZpX2Z0bV9jZmc7CisJc3RydWN0IGFmZV9zcF9leF92aV9tb2RlX2NmZyBleF92aV9tb2RlX2NmZzsKKwlzdHJ1Y3QgYWZlX3NwX2V4X3ZpX2Z0bV9jZmcgZXhfdmlfZnRtX2NmZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3Brcl9wcm90X2NvbmZpZ19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7CisJdW5pb24gYWZlX3Nwa3JfcHJvdF9jb25maWcgcHJvdF9jb25maWc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9nZXRfdmlfY2FsaWIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX2dldF9wYXJhbV92MiBnZXRfcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7CisJc3RydWN0IGFzbV9jYWxpYl9yZXNfY2ZnIHJlc19jZmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9jYWxpYl9nZXRfcmVzcCB7CisJdWludDMyX3Qgc3RhdHVzOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOworCXN0cnVjdCBhc21fY2FsaWJfcmVzX2NmZyByZXNfY2ZnOworfSBfX3BhY2tlZDsKKworCisvKiBTUlMgVFJVTUVESUEgc3RhcnQgKi8KKy8qIHRvcG9sb2d5ICovCisjZGVmaW5lIFNSU19UUlVNRURJQV9UT1BPTE9HWV9JRAkJCTB4MDAwMTBEOTAKKy8qIG1vZHVsZSAqLworI2RlZmluZSBTUlNfVFJVTUVESUFfTU9EVUxFX0lECQkJCTB4MTAwMDUwMTAKKy8qIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNUwkJCQkweDEwMDA1MDExCisjZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfV09XSEQJCQkweDEwMDA1MDEyCisjZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfQ1NIUAkJCTB4MTAwMDUwMTMKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19IUEYJCQkJMHgxMDAwNTAxNAorI2RlZmluZSBTUlNfVFJVTUVESUFfUEFSQU1TX0FFUQkJCQkweDEwMDA1MDE1CisjZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfSEwJCQkJMHgxMDAwNTAxNgorI2RlZmluZSBTUlNfVFJVTUVESUFfUEFSQU1TX0dFUQkJCQkweDEwMDA1MDE3CisKKyNkZWZpbmUgU1JTX0lEX0dMT0JBTAkweDAwMDAwMDAxCisjZGVmaW5lIFNSU19JRF9XT1dIRAkweDAwMDAwMDAyCisjZGVmaW5lIFNSU19JRF9DU0hQCTB4MDAwMDAwMDMKKyNkZWZpbmUgU1JTX0lEX0hQRgkweDAwMDAwMDA0CisjZGVmaW5lIFNSU19JRF9BRVEJMHgwMDAwMDAwNQorI2RlZmluZSBTUlNfSURfSEwJCTB4MDAwMDAwMDYKKyNkZWZpbmUgU1JTX0lEX0dFUQkweDAwMDAwMDA3CisKKyNkZWZpbmUgU1JTX0NNRF9VUExPQUQJCTB4N0ZGRjAwMDAKKyNkZWZpbmUgU1JTX1BBUkFNX09GRlNFVF9NQVNLCTB4M0ZGRjAwMDAKKyNkZWZpbmUgU1JTX1BBUkFNX1ZBTFVFX01BU0sJMHgwMDAwRkZGRgorCitzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwgeworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjI7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHYzOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NDsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjU7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHY2OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NzsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjg7CisJdWludDE2X3QgICAgICAgICAgICAgICAgIHY5OworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQgeworCXVpbnQzMl90CQkJCXYxOworCXVpbnQxNl90CQkJCXYyOworCXVpbnQxNl90CQkJCXYzOworCXVpbnQxNl90CQkJCXY0OworCXVpbnQxNl90CQkJCXY1OworCXVpbnQxNl90CQkJCXY2OworCXVpbnQxNl90CQkJCXY3OworCXVpbnQxNl90CQkJCXY4OworCXVpbnQxNl90CQkJCXZfX19fQTE7CisJdWludDMyX3QJCQkJdjk7CisJdWludDE2X3QJCQkJdjEwOworCXVpbnQxNl90CQkJCXYxMTsKKwl1aW50MzJfdAkJCQl2MTJbMTZdOworCXVpbnQzMl90CXYxM1sxNl07CisJdWludDMyX3QJdjE0WzE2XTsKKwl1aW50MzJfdAl2MTVbMTZdOworCXVpbnQzMl90CXYxNjsKKwl1aW50MTZfdAl2MTc7CisJdWludDE2X3QJdjE4OworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUCB7CisJdWludDMyX3QJCXYxOworCXVpbnQxNl90CQl2MjsKKwl1aW50MTZfdAkJdjM7CisJdWludDE2X3QJCXY0OworCXVpbnQxNl90CQl2NTsKKwl1aW50MTZfdAkJdjY7CisJdWludDE2X3QJCXZfX19fQTE7CisJdWludDMyX3QJCXY3OworCXVpbnQxNl90CQl2ODsKKwl1aW50MTZfdAkJdjk7CisJdWludDMyX3QJCXYxMFsxNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYgeworCXVpbnQzMl90CQl2MTsKKwl1aW50MzJfdAkJdjJbMjZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQUVRIHsKKwl1aW50MzJfdAkJdjE7CisJdWludDE2X3QJCXYyOworCXVpbnQxNl90CQl2MzsKKwl1aW50MTZfdAkJdjQ7CisJdWludDE2X3QJCXZfX19fQTE7CisJdWludDMyX3QJdjVbNzRdOworCXVpbnQzMl90CXY2Wzc0XTsKKwl1aW50MTZfdAl2N1syMDQ4XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMIHsKKwl1aW50MTZfdAkJdjE7CisJdWludDE2X3QJCXYyOworCXVpbnQxNl90CQl2MzsKKwl1aW50MTZfdAkJdl9fX19BMTsKKwlpbnQzMl90CQkJdjQ7CisJdWludDMyX3QJCXY1OworCXVpbnQxNl90CQl2NjsKKwl1aW50MTZfdAkJdl9fX19BMjsKKwl1aW50MzJfdAkJdjc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEgeworCWludDE2X3QJCXYxWzEwXTsKK30gX19wYWNrZWQ7CitzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtcyB7CisJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0xPQkFMCWdsb2JhbDsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRAl3b3doZDsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQCQljc2hwOworCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRgkJaHBmOworCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0FFUQkJYWVxOworCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMCQlobDsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEJCWdlcTsKK30gX19wYWNrZWQ7CisvKiBTUlMgVHJ1TWVkaWEgZW5kICovCisKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FTkFCTEUJCTB4MDAwMTA5MDQKKyNkZWZpbmUgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX1NBX1BMVVMgMHgxMDAwRkZGRgorLyogRFRTIEVhZ2xlICovCisjZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX0RUU19IUFhfUFJFTUlYIDB4MDAwMTA3N0MKKyNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QT1NUTUlYIDB4MDAwMTA3N0IKKyNkZWZpbmUgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0RUU19IUFggMHgwMDAxMERFRAorI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX1BMVVMgIDB4MTAwMTUwMDAKKyNkZWZpbmUgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVIgIDB4MTAwMTUwMDEKK3N0cnVjdCBhc21fZHRzX2VhZ2xlX3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07CisJc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9kdHNfZWFnbGVfcGFyYW1fZ2V0IHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX2dldF9wcF9wYXJhbXNfdjIgcGFyYW07Cit9IF9fcGFja2VkOworCisvKiBMU00gU3BlY2lmaWMgKi8KKyNkZWZpbmUgVldfRkVBVF9ESU0JCQkJCSgzOSkKKworI2RlZmluZSBBUFJWMl9JRFNfU0VSVklDRV9JRF9BRFNQX0xTTV9WCQkJKDB4RCkKKyNkZWZpbmUgQVBSVjJfSURTX0RPTUFJTl9JRF9BRFNQX1YJCQkoMHg0KQorI2RlZmluZSBBUFJWMl9JRFNfRE9NQUlOX0lEX0FQUFNfVgkJCSgweDUpCisKKyNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMJCSgweDAwMDEyQTdGKQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURSU1BfU0hBUkVEX01FTV9NQVBfUkVHSU9OUwkoMHgwMDAxMkE4MCkKKyNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUwkoMHgwMDAxMkE4MSkKKyNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX09QRU5fVFgJCQkJKDB4MDAwMTJBODIpCisjZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9DTE9TRV9UWAkJCSgweDAwMDEyQTg4KQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUwkJCSgweDAwMDEyQTgzKQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMgkJCSgweDAwMDEyQThGKQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURfUkVHSVNURVJfU09VTkRfTU9ERUwJCSgweDAwMDEyQTg0KQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURfREVSRUdJU1RFUl9TT1VORF9NT0RFTAkJKDB4MDAwMTJBODUpCisjZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9TVEFSVAkJCQkoMHgwMDAxMkE4NikKKyNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1NUT1AJCQkJKDB4MDAwMTJBODcpCisjZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9FT0IJCQkJKDB4MDAwMTJBODkpCisjZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9SRUFECQkJCSgweDAwMDEyQThBKQorI2RlZmluZSBMU01fU0VTU0lPTl9DTURfT1BFTl9UWF9WMgkJCSgweDAwMDEyQThCKQorI2RlZmluZSBMU01fQ01EX0FERF9UT1BPTE9HSUVTCQkJCSgweDAwMDEyQThDKQorCisjZGVmaW5lIExTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVMJCSgweDAwMDEyQjAwKQorI2RlZmluZSBMU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTX1YyCQkoMHgwMDAxMkIwMSkKKyNkZWZpbmUgTFNNX0RBVEFfRVZFTlRfUkVBRF9ET05FCQkJKDB4MDAwMTJCMDIpCisjZGVmaW5lIExTTV9EQVRBX0VWRU5UX1NUQVRVUwkJCQkoMHgwMDAxMkIwMykKKworI2RlZmluZSBMU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUAkJCSgweDAwMDEyQzAwKQorI2RlZmluZSBMU01fUEFSQU1fSURfRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRAkJKDB4MDAwMTJDMDEpCisjZGVmaW5lIExTTV9QQVJBTV9JRF9PUEVSQVRJT05fTU9ERQkJCSgweDAwMDEyQzAyKQorI2RlZmluZSBMU01fUEFSQU1fSURfR0FJTgkJCQkoMHgwMDAxMkMwMykKKyNkZWZpbmUgTFNNX1BBUkFNX0lEX0NPTk5FQ1RfVE9fUE9SVAkJCSgweDAwMDEyQzA0KQorI2RlZmluZSBMU01fUEFSQU1fSURfRkVBVFVSRV9DT01QRU5TQVRJT05fREFUQQkJKDB4MDAwMTJDMDcpCisjZGVmaW5lIExTTV9QQVJBTV9JRF9NSU5fQ09ORklERU5DRV9MRVZFTFMJCSgweDAwMDEyQzA3KQorI2RlZmluZSBMU01fTU9EVUxFX0lEX0xBQgkJCQkoMHgwMDAxMkMwOCkKKyNkZWZpbmUgTFNNX1BBUkFNX0lEX0xBQl9FTkFCTEUJCQkJKDB4MDAwMTJDMDkpCisjZGVmaW5lIExTTV9QQVJBTV9JRF9MQUJfQ09ORklHCQkJCSgweDAwMDEyQzBBKQorI2RlZmluZSBMU01fTU9EVUxFX0lEX0ZSQU1FV09SSwkJCQkoMHgwMDAxMkMwRSkKKworLyogSFcgTUFEIHNwZWNpZmljICovCisjZGVmaW5lIEFGRV9NT0RVTEVfSFdfTUFECQkJCSgweDAwMDEwMjMwKQorI2RlZmluZSBBRkVfUEFSQU1fSURfSFdfTUFEX0NGRwkJCQkoMHgwMDAxMDIzMSkKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0hXX01BRF9DVFJMCQkJKDB4MDAwMTAyMzIpCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TTElNQlVTX1NMQVZFX1BPUlRfQ0ZHCQkoMHgwMDAxMDIzMykKKworLyogU1cgTUFEIHNwZWNpZmljICovCisjZGVmaW5lIEFGRV9NT0RVTEVfU1dfTUFECQkJCSgweDAwMDEwMjJEKQorI2RlZmluZSBBRkVfUEFSQU1fSURfU1dfTUFEX0NGRwkJCQkoMHgwMDAxMDIyRSkKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX1NWTV9NT0RFTAkJCQkoMHgwMDAxMDIyRikKKworLyogQ29tbWFuZHMvUGFyYW1zIHRvIHBhc3MgdGhlIGNvZGVjL3NsaW1idXMgZGF0YSB0byBEU1AgKi8KKyNkZWZpbmUgQUZFX1NWQ19DTURfU0VUX1BBUkFNCQkJCSgweDAwMDEwMGYzKQorI2RlZmluZSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHCQkJCSgweDAwMDEwMjM0KQorI2RlZmluZSBBRkVfUEFSQU1fSURfQ0RDX1NMSU1CVVNfU0xBVkVfQ0ZHCQkoMHgwMDAxMDIzNSkKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHCQkJKDB4MDAwMTAyMzYpCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DRENfUkVHX0NGR19JTklUCQkJKDB4MDAwMTAyMzcpCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DRENfUkVHX1BBR0VfQ0ZHICAgICAgICAgICAgICAgICAgICgweDAwMDEwMjk2KQorCisjZGVmaW5lIEFGRV9NQVhfQ0RDX1JFR0lTVEVSU19UT19DT05GSUcJCQkoMjApCisKKy8qIEFBTkMgUG9ydCBDb25maWcgU3BlY2lmaWMgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0FBTkNfUE9SVF9DT05GSUcJCQkoMHgwMDAxMDIxNSkKKyNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0FBTkNfUE9SVF9DT05GSUcJCSgweDEpCisjZGVmaW5lIEFBTkNfVFhfTUlDX1VOVVNFRAkJCQkoMCkKKyNkZWZpbmUgQUFOQ19UWF9WT0lDRV9NSUMJCQkJKDEpCisjZGVmaW5lIEFBTkNfVFhfRVJST1JfTUlDCQkJCSgyKQorI2RlZmluZSBBQU5DX1RYX05PSVNFX01JQwkJCQkoMykKKyNkZWZpbmUgQUZFX1BPUlRfTUFYX0NIQU5ORUxfQ05UCQkJKDgpCisjZGVmaW5lIEFGRV9NT0RVTEVfQUFOQwkJCQkJKDB4MDAwMTAyMTQpCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DRENfQUFOQ19WRVJTSU9OCQkJKDB4MDAwMTAyM0EpCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DRENfQUFOQ19WRVJTSU9OCQkoMHgxKQorI2RlZmluZSBBQU5DX0hXX0JMT0NLX1ZFUlNJT05fMQkJCQkoMSkKKyNkZWZpbmUgQUFOQ19IV19CTE9DS19WRVJTSU9OXzIJCQkJKDIpCisKKy8qQ2xpcCBiYW5rIHNlbGVjdGlvbiovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DTElQX0JBTktfU0VMX0NGRyAweDEKKyNkZWZpbmUgQUZFX0NMSVBfTUFYX0JBTktTCQk0CisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DTElQX0JBTktfU0VMX0NGRyAweDAwMDEwMjQyCisKK3N0cnVjdCBhZmVfcGFyYW1fYWFuY19wb3J0X2NmZyB7CisJLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlJ3MKKwkgKiBzb3VyY2UgcG9ydCBjb25maWd1cmF0aW9uLgorCSAqLworCXVpbnQzMl90IGFhbmNfcG9ydF9jZmdfbWlub3JfdmVyc2lvbjsKKworCS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBUeCBwb3J0LiA4ayAtIDE5MmsqLworCXVpbnQzMl90IHR4X3BvcnRfc2FtcGxlX3JhdGU7CisKKwkvKiBDaGFubmVsIG1hcHBpbmcgZm9yIHRoZSBUeCBwb3J0IHNpZ25hbCBjYXJyeWluZyBOb2lzZSAoWCksCisJICogRXJyb3IgKEUpLCBhbmQgVm9pY2UgKFYpIHNpZ25hbHMuCisJICovCisJdWludDhfdCB0eF9wb3J0X2NoYW5uZWxfbWFwW0FGRV9QT1JUX01BWF9DSEFOTkVMX0NOVF07CisKKwkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgb24gdGhlIHNvdXJjZSBUeCBwb3J0LiAqLworCXVpbnQxNl90IHR4X3BvcnRfbnVtX2NoYW5uZWxzOworCisJLyogUG9ydCBJRCBvZiB0aGUgUnggcGF0aCByZWZlcmVuY2Ugc2lnbmFsLiAqLworCXVpbnQxNl90IHJ4X3BhdGhfcmVmX3BvcnRfaWQ7CisKKwkvKiBTYW1wbGluZyByYXRlIG9mIHRoZSByZWZlcmVuY2UgcG9ydC4gOGsgLSAxOTJrKi8KKwl1aW50MzJfdCByZWZfcG9ydF9zYW1wbGVfcmF0ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbiB7CisJLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlJ3MKKwkgKiBodyB2ZXJzaW9uCisJICovCisJdWludDMyX3QgY2RjX2FhbmNfbWlub3JfdmVyc2lvbjsKKworCS8qIEhXIHZlcnNpb24uICovCisJdWludDMyX3QgYWFuY19od192ZXJzaW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsIHsKKwkvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUncworCSAqIGh3IHZlcnNpb24KKwkgKi8KKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCisJLyogTnVtYmVyIG9mIGJhbmtzIHRvIGJlIHJlYWQgKi8KKwl1aW50MzJfdCBudW1fYmFua3M7CisKKwl1aW50MzJfdCBiYW5rX21hcFtBRkVfQ0xJUF9NQVhfQkFOS1NdOworfSBfX3BhY2tlZDsKKworLyogRVJST1IgQ09ERVMgKi8KKy8qIFN1Y2Nlc3MuIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHdpdGggbm8gZXJyb3JzLiAqLworI2RlZmluZSBBRFNQX0VPSyAgICAgICAgICAweDAwMDAwMDAwCisvKiBHZW5lcmFsIGZhaWx1cmUuICovCisjZGVmaW5lIEFEU1BfRUZBSUxFRCAgICAgIDB4MDAwMDAwMDEKKy8qIEJhZCBvcGVyYXRpb24gcGFyYW1ldGVyLiAqLworI2RlZmluZSBBRFNQX0VCQURQQVJBTSAgICAweDAwMDAwMDAyCisvKiBVbnN1cHBvcnRlZCByb3V0aW5lIG9yIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgQURTUF9FVU5TVVBQT1JURUQgMHgwMDAwMDAwMworLyogVW5zdXBwb3J0ZWQgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQURTUF9FVkVSU0lPTiAgICAgMHgwMDAwMDAwNAorLyogVW5leHBlY3RlZCBwcm9ibGVtIGVuY291bnRlcmVkLiAqLworI2RlZmluZSBBRFNQX0VVTkVYUEVDVEVEICAweDAwMDAwMDA1CisvKiBVbmhhbmRsZWQgcHJvYmxlbSBvY2N1cnJlZC4gKi8KKyNkZWZpbmUgQURTUF9FUEFOSUMgICAgICAgMHgwMDAwMDAwNgorLyogVW5hYmxlIHRvIGFsbG9jYXRlIHJlc291cmNlLiAqLworI2RlZmluZSBBRFNQX0VOT1JFU09VUkNFICAweDAwMDAwMDA3CisvKiBJbnZhbGlkIGhhbmRsZS4gKi8KKyNkZWZpbmUgQURTUF9FSEFORExFICAgICAgMHgwMDAwMDAwOAorLyogT3BlcmF0aW9uIGlzIGFscmVhZHkgcHJvY2Vzc2VkLiAqLworI2RlZmluZSBBRFNQX0VBTFJFQURZICAgICAweDAwMDAwMDA5CisvKiBPcGVyYXRpb24gaXMgbm90IHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQURTUF9FTk9UUkVBRFkgICAgMHgwMDAwMDAwQQorLyogT3BlcmF0aW9uIGlzIHBlbmRpbmcgY29tcGxldGlvbi4gKi8KKyNkZWZpbmUgQURTUF9FUEVORElORyAgICAgMHgwMDAwMDAwQgorLyogT3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBvciBwcm9jZXNzZWQuICovCisjZGVmaW5lIEFEU1BfRUJVU1kgICAgICAgIDB4MDAwMDAwMEMKKy8qIE9wZXJhdGlvbiBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4gKi8KKyNkZWZpbmUgQURTUF9FQUJPUlRFRCAgICAgMHgwMDAwMDAwRAorLyogT3BlcmF0aW9uIHByZWVtcHRlZCBieSBhIGhpZ2hlciBwcmlvcml0eS4gKi8KKyNkZWZpbmUgQURTUF9FUFJFRU1QVEVEICAgMHgwMDAwMDAwRQorLyogT3BlcmF0aW9uIHJlcXVlc3RzIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KKyNkZWZpbmUgQURTUF9FQ09OVElOVUUgICAgMHgwMDAwMDAwRgorLyogT3BlcmF0aW9uIHJlcXVlc3RzIGltbWVkaWF0ZSBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCisjZGVmaW5lIEFEU1BfRUlNTUVESUFURSAgIDB4MDAwMDAwMTAKKy8qIE9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuICovCisjZGVmaW5lIEFEU1BfRU5PVElNUEwgICAgIDB4MDAwMDAwMTEKKy8qIE9wZXJhdGlvbiBuZWVkcyBtb3JlIGRhdGEgb3IgcmVzb3VyY2VzLiAqLworI2RlZmluZSBBRFNQX0VORUVETU9SRSAgICAweDAwMDAwMDEyCisvKiBPcGVyYXRpb24gZG9lcyBub3QgaGF2ZSBtZW1vcnkuICovCisjZGVmaW5lIEFEU1BfRU5PTUVNT1JZICAgIDB4MDAwMDAwMTQKKy8qIEl0ZW0gZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lIEFEU1BfRU5PVEVYSVNUICAgIDB4MDAwMDAwMTUKKy8qIE1heCBjb3VudCBmb3IgYWRzcCBlcnJvciBjb2RlIHNlbnQgdG8gSExPUyovCisjZGVmaW5lIEFEU1BfRVJSX01BWCAgICAgIChBRFNQX0VOT1RFWElTVCArIDEpCisvKiBPcGVyYXRpb24gaXMgZmluaXNoZWQuICovCisjZGVmaW5lIEFEU1BfRVRFUk1JTkFURUQgICAgMHgwMDAxMTE3NAorCisvKmJoYXJhdGgsIGFkc3BfZXJyb3JfY29kZXMuaCAqLworCisvKiBMUEFTUyBjbG9jayBmb3IgSTJTIEludGVyZmFjZSAqLworCisvKiBTdXBwb3J0ZWQgT1NSIGNsb2NrIHZhbHVlcyAqLworI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzEyX1AyODhfTUhaCQkweEJCODAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzExX1AyODk2X01IWgkJMHhBQzQ0MDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS185X1A2MDBfTUhaCQkweDkyN0MwMAorI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzhfUDE5Ml9NSFoJCTB4N0QwMDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfNl9QMTQ0X01IWgkJMHg1REMwMDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS180X1AwOTZfTUhaCQkweDNFODAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzNfUDA3Ml9NSFoJCTB4MkVFMDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfMl9QMDQ4X01IWgkJMHgxRjQwMDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS18xX1A1MzZfTUhaCQkweDE3NzAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzFfUDAyNF9NSFoJCSAweEZBMDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfNzY4X2tIWgkJIDB4QkI4MDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS181MTJfa0haCQkgMHg3RDAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLX0RJU0FCTEUJCSAgICAgMHgwCisKKy8qIFN1cHBvcnRlZCBCaXQgY2xvY2sgdmFsdWVzICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzEyX1AyODhfTUhaCTB4QkI4MDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzExX1AyODk2X01IWgkweEFDNDQwMAorI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS184X1AxOTJfTUhaCQkweDdEMDAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS182X1AxNDRfTUhaCQkweDVEQzAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS180X1AwOTZfTUhaCQkweDNFODAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS18zX1AwNzJfTUhaCQkweDJFRTAwMAorI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS18yX1A4MjI0X01IWgkJMHgyYjExMDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMl9QMDQ4X01IWgkJMHgxRjQwMDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWgkJMHgxNzcwMDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNDExMl9NSFoJCTB4MTU4ODgwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDAyNF9NSFoJCSAweEZBMDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzc2OF9LSFoJCSAweEJCODAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzUxMl9LSFoJCSAweDdEMDAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzI1Nl9LSFoJCSAweDNFODAwCisjZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLX0RJU0FCTEUJCSAgICAgMHgwCisKKy8qIFN1cHBvcnRlZCBMUEFTUyBDTEsgc291cmNlcyAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfU1JDX0VYVEVSTkFMIDAKKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX1NSQ19JTlRFUk5BTCAxCisKKy8qIFN1cHBvcnRlZCBMUEFTUyBDTEsgcm9vdCovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQgMAorCitlbnVtIGFmZV9scGFzc19jbGtfbW9kZSB7CisJUTZBRkVfTFBBU1NfTU9ERV9CT1RIX0lOVkFMSUQsCisJUTZBRkVfTFBBU1NfTU9ERV9DTEsxX1ZBTElELAorCVE2QUZFX0xQQVNTX01PREVfQ0xLMl9WQUxJRCwKKwlRNkFGRV9MUEFTU19NT0RFX0JPVEhfVkFMSUQsCit9IF9fcGFja2VkOworCisvKiBDbG9jayBJRCBFbnVtZXJhdGlvbiBEZWZpbmUuICovCisvKiBDbG9jayBJRCBmb3IgUHJpbWFyeSBJMlMgSUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUFJJX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKy8qIENsb2NrIElEIGZvciBQcmltYXJ5IEkyUyBFQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMQorLyogQ2xvY2sgSUQgZm9yIFNlY29uZGFyeSBJMlMgSUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDIKKy8qIENsb2NrIElEIGZvciBTZWNvbmRhcnkgSTJTIEVCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19NSTJTX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAzCisvKiBDbG9jayBJRCBmb3IgVGVydGlhcnkgSTJTIElCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA0CisvKiBDbG9jayBJRCBmb3IgVGVydGlhcnkgSTJTIEVCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9NSTJTX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA1CisvKiBDbG9jayBJRCBmb3IgUXVhcnRuZXJ5IEkyUyBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNgorLyogQ2xvY2sgSUQgZm9yIFF1YXJ0bmVyeSBJMlMgRUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9NSTJTX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDcKKy8qIENsb2NrIElEIGZvciBTcGVha2VyIEkyUyBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TUEVBS0VSX0kyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAweDEwOAorLyogQ2xvY2sgSUQgZm9yIFNwZWFrZXIgSTJTIEVCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRUFLRVJfSTJTX0VCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTA5CisvKiBDbG9jayBJRCBmb3IgU3BlYWtlciBJMlMgT1NSICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TUEVBS0VSX0kyU19PU1IgICAgICAgICAgICAgICAgICAgICAgICAweDEwQQorCisvKiBDbG9jayBJRCBmb3IgUVVJTkFSWSAgSTJTIElCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1FVSV9NSTJTX0lCSVQJCQkweDEwQgorLyogQ2xvY2sgSUQgZm9yIFFVSU5BUlkgIEkyUyBFQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUlfTUkyU19FQklUCQkJMHgxMEMKKy8qIENsb2NrIElEIGZvciBTRU5BUlkgIEkyUyBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRU5fTUkyU19JQklUCQkJMHgxMEQKKy8qIENsb2NrIElEIGZvciBTRU5BUlkgIEkyUyBFQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRU5fTUkyU19FQklUCQkJMHgxMEUKKy8qIENsb2NrIElEIGZvciBJTlQwIEkyUyBJQklUICAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UMF9NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGCisvKiBDbG9jayBJRCBmb3IgSU5UMSBJMlMgSUJJVCAgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDFfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAweDExMAorLyogQ2xvY2sgSUQgZm9yIElOVDIgSTJTIElCSVQgICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlQyX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMTEKKy8qIENsb2NrIElEIGZvciBJTlQzIEkyUyBJQklUICAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UM19NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTEyCisvKiBDbG9jayBJRCBmb3IgSU5UNCBJMlMgSUJJVCAgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDRfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAweDExMworLyogQ2xvY2sgSUQgZm9yIElOVDUgSTJTIElCSVQgICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlQ1X01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMTQKKy8qIENsb2NrIElEIGZvciBJTlQ2IEkyUyBJQklUICAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UNl9NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTE1CisKKy8qIENsb2NrIElEIGZvciBQcmltYXJ5IFBDTSBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9QUklfUENNX0lCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorLyogQ2xvY2sgSUQgZm9yIFByaW1hcnkgUENNIEVCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9QQ01fRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxCisvKiBDbG9jayBJRCBmb3IgU2Vjb25kYXJ5IFBDTSBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRUNfUENNX0lCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMgorLyogQ2xvY2sgSUQgZm9yIFNlY29uZGFyeSBQQ00gRUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX1BDTV9FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDMKKy8qIENsb2NrIElEIGZvciBUZXJ0aWFyeSBQQ00gSUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfVEVSX1BDTV9JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQKKy8qIENsb2NrIElEIGZvciBUZXJ0aWFyeSBQQ00gRUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfVEVSX1BDTV9FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDUKKy8qIENsb2NrIElEIGZvciBRdWFydGVyeSBQQ00gSUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9QQ01fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDYKKy8qIENsb2NrIElEIGZvciBRdWFydGVyeSBQQ00gRUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9QQ01fRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDcKKworLyoqIENsb2NrIElEIGZvciBQcmltYXJ5IFRETSBJQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9QUklfVERNX0lCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorLyoqIENsb2NrIElEIGZvciBQcmltYXJ5IFRETSBFQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9QUklfVERNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMQorLyoqIENsb2NrIElEIGZvciBTZWNvbmRhcnkgVERNIElCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19URE1fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyCisvKiogQ2xvY2sgSUQgZm9yIFNlY29uZGFyeSBURE0gRUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX1RETV9FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDMKKy8qKiBDbG9jayBJRCBmb3IgVGVydGlhcnkgVERNIElCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9URE1fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA0CisvKiogQ2xvY2sgSUQgZm9yIFRlcnRpYXJ5IFRETSBFQklUICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9URVJfVERNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNQorLyoqIENsb2NrIElEIGZvciBRdWFydGVyeSBURE0gSUJJVCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9URE1fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDYKKy8qKiBDbG9jayBJRCBmb3IgUXVhcnRlcnkgVERNIEVCSVQgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfVERNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA3CisKKy8qIENsb2NrIElEIGZvciBNQ0xLMSAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfTUNMS18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAKKy8qIENsb2NrIElEIGZvciBNQ0xLMiAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfTUNMS18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEKKy8qIENsb2NrIElEIGZvciBNQ0xLMyAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfTUNMS18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDIKKy8qIENsb2NrIElEIGZvciBNQ0xLNCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfTUNMS180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDQKKy8qIENsb2NrIElEIGZvciBJbnRlcm5hbCBEaWdpdGFsIENvZGVjIENvcmUgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVEVSTkFMX0RJR0lUQUxfQ09ERUNfQ09SRSAgICAgICAgICAgIDB4MzAzCisvKiBDbG9jayBJRCBmb3IgSU5UIE1DTEswICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlRfTUNMS18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwNQorLyogQ2xvY2sgSUQgZm9yIElOVCBNQ0xLMSAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UX01DTEtfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDYKKy8qCisgKiBDbG9jayBJRCBmb3Igc291bmR3aXJlIE5QTC4KKyAqIFRoaXMgaXMgdGhlIGNsb2NrIHRvIGJlIHVzZWQgdG8gZW5hYmxlIE5QTCBjbG9jayBmb3IgIGludGVybmFsIFNvdW5kd2lyZS4KKyAqLworI2RlZmluZSBBRkVfQ0xPQ0tfU0VUX0NMT0NLX0lEX1NXUl9OUExfQ0xLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA3CisKKy8qIENsb2NrIElEIGZvciBBSEIgSERNSSBpbnB1dCAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfQUhCX0hETUlfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKworLyogQ2xvY2sgSUQgZm9yIFNQRElGIGNvcmUgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRElGX0NPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwCisKKworLyogQ2xvY2sgYXR0cmlidXRlIGZvciBpbnZhbGlkIHVzZSAocmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlKSAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0lOVkFMSUQJCTB4MAorLyogQ2xvY2sgYXR0cmlidXRlIGZvciBubyBjb3VwbGUgY2FzZSAqLworI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTwkJMHgxCisvKiBDbG9jayBhdHRyaWJ1dGUgZm9yIGRpdmlkZW5kIGNvdXBsZSBjYXNlICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX0RJVklERU5ECTB4MgorLyogQ2xvY2sgYXR0cmlidXRlIGZvciBkaXZpc29yIGNvdXBsZSBjYXNlICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX0RJVklTT1IJMHgzCisvKiBDbG9jayBhdHRyaWJ1dGUgZm9yIGludmVydCBhbmQgbm8gY291cGxlIGNhc2UgKi8KKyNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9JTlZFUlRfQ09VUExFX05PCTB4NAorLyogQ2xvY2sgc2V0IEFQSSB2ZXJzaW9uICovCisjZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19DT05GSUdfQVBJX1ZFUlNJT04JCTB4MQorCitzdHJ1Y3QgYWZlX2Nsa19zZXQgeworCS8qCisJICogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyBjbG9jayBzZXQuCisJICoJQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX0NMT0NLX1NFVAorCSAqLworCXVpbnQzMl90IGNsa19zZXRfbWlub3JfdmVyc2lvbjsKKworCS8qCisJICogQ2xvY2sgSUQKKwkgKglAdmFsdWVzCisJICoJLSAweDEwMCB0byAweDEwQSAtIE1TTTg5OTYKKwkgKgktIDB4MjAwIHRvIDB4MjA3IC0gTVNNODk5NgorCSAqCS0gMHgzMDAgdG8gMHgzMDIgLSBNU004OTk2IEB0YWJsZWJ1bGxldGVuZAorCSAqLworCXVpbnQzMl90IGNsa19pZDsKKworCS8qCisJICogQ2xvY2sgZnJlcXVlbmN5ICAoaW4gSGVydHopIHRvIGJlIHNldC4KKwkgKglAdmFsdWVzCisJICoJLSA+PSAwIGZvciBjbG9jayBmcmVxdWVuY3kgdG8gc2V0IEB0YWJsZWJ1bGxldGVuZAorCSAqLworCXVpbnQzMl90IGNsa19mcmVxX2luX2h6OworCisJLyogVXNlIHRvIHNwZWNpZmljIGRpdmlkZXIgZm9yIHR3byBjbG9ja3MgaWYgbmVlZGVkLgorCSAqCVNldCB0byBRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTyBmb3Igbm8gZGl2aWRlcgorCSAqCXJlbGF0aW9uIGNsb2NrcworCSAqCUB2YWx1ZXMKKwkgKgktICNRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTworCSAqCS0gI1E2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX0RJVklERU5ECisJICoJLSAjUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfRElWSVNPUiBAdGFibGVidWxsZXRlbmQKKwkgKi8KKwl1aW50MTZfdCBjbGtfYXR0cmk7CisKKwkvKgorCSAqIFNwZWNpZmllcyB0aGUgcm9vdCBjbG9jayBzb3VyY2UuCisJICoJQ3VycmVudGx5LCBvbmx5IFE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQgaXMgdmFsaWQKKwkgKglAdmFsdWVzCisJICoJLSAwIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCXVpbnQxNl90IGNsa19yb290OworCisJLyoKKwkgKiBmb3IgZW5hYmxlIGFuZCBkaXNhYmxlIGNsb2NrLgorCSAqCSJjbGtfZnJlcV9pbl9oeiIsICJjbGtfYXR0cmkiLCBhbmQgImNsa19yb290IgorCSAqCWFyZSBpZ25vcmVkIGluIGRpc2FibGUgY2xvY2sgY2FzZS4KKwkgKglAdmFsdWVzoAorCSAqCS0gMCAtLSBEaXNhYmxlZAorCSAqCS0gMSAtLSBFbmFibGVkICBAdGFibGVidWxsZXRlbmQKKwkgKi8KKwl1aW50MzJfdCBlbmFibGU7Cit9OworCitzdHJ1Y3QgYWZlX2Nsa19jZmcgeworLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgSTJTCisgKiBjb25maWd1cmF0aW9uIGludGVyZmFjZS4KKyAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRworICovCisJdTMyICAgICAgICAgICAgICAgICAgaTJzX2NmZ19taW5vcl92ZXJzaW9uOworCisvKiBjbGsgdmFsdWUgMSBpbiBNSHouICovCisJdTMyICAgICAgICAgICAgICAgICAgY2xrX3ZhbDE7CisKKy8qIGNsayB2YWx1ZSAyIGluIE1Iei4gKi8KKwl1MzIgICAgICAgICAgICAgICAgICBjbGtfdmFsMjsKKworLyogY2xrX3NyYworICogI1E2QUZFX0xQQVNTX0NMS19TUkNfRVhURVJOQUwKKyAqICNRNkFGRV9MUEFTU19DTEtfU1JDX0lOVEVSTkFMCisgKi8KKworCXUxNiAgICAgICAgICAgICAgICAgIGNsa19zcmM7CisKKy8qIGNsa19yb290IC0wIGZvciBkZWZhdWx0ICovCisJdTE2ICAgICAgICAgICAgICAgICAgY2xrX3Jvb3Q7CisKKy8qIGNsa19zZXRfbW9kZQorICogI1E2QUZFX0xQQVNTX01PREVfQk9USF9JTlZBTElECisgKiAjUTZBRkVfTFBBU1NfTU9ERV9DTEsxX1ZBTElECisgKiAjUTZBRkVfTFBBU1NfTU9ERV9DTEsyX1ZBTElECisgKiAjUTZBRkVfTFBBU1NfTU9ERV9CT1RIX1ZBTElECisgKi8KKwl1MTYgICAgICAgICAgICAgICAgICBjbGtfc2V0X21vZGU7CisKKy8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgSTJTIGNsayAqLworCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBJMlMgY2xrICovCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9MUEFJRl9DTEtfQ09ORklHCTB4MDAwMTAyMzgKKyNkZWZpbmUgQUZFX01PRFVMRV9DTE9DS19TRVQJCTB4MDAwMTAyOEYKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0NMT0NLX1NFVAkJMHgwMDAxMDI5MAorCitzdHJ1Y3QgYWZlX2xwYXNzX2Nsa19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIJCQkgaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgIHBkYXRhOworCXN0cnVjdCBhZmVfY2xrX2NmZyBjbGtfY2ZnOworfSBfX3BhY2tlZDsKKworZW51bSBhZmVfbHBhc3NfZGlnaXRhbF9jbGtfc3JjIHsKKwlRNkFGRV9MUEFTU19ESUdJVEFMX1JPT1RfSU5WQUxJRCwKKwlRNkFGRV9MUEFTU19ESUdJVEFMX1JPT1RfUFJJX01JMlNfT1NSLAorCVE2QUZFX0xQQVNTX0RJR0lUQUxfUk9PVF9TRUNfTUkyU19PU1IsCisJUTZBRkVfTFBBU1NfRElHSVRBTF9ST09UX1RFUl9NSTJTX09TUiwKKwlRNkFGRV9MUEFTU19ESUdJVEFMX1JPT1RfUVVBRF9NSTJTX09TUiwKKwlRNkFGRV9MUEFTU19ESUdJVEFMX1JPT1RfQ0RDX1JPT1RfQ0xLLAorfSBfX3BhY2tlZDsKKworLyogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBpbnRlcm5hbCBjbGsgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0lOVEVSTkFMX0RJR0lBVExfQ0RDX0NMS19DT05GSUcJMHgwMDAxMDIzOQorCitzdHJ1Y3QgYWZlX2RpZ2l0YWxfY2xrX2NmZyB7CisvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBJMlMKKyAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgorICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHCisgKi8KKwl1MzIgICAgICAgICAgICAgICAgICBpMnNfY2ZnX21pbm9yX3ZlcnNpb247CisKKy8qIGNsayB2YWx1ZSBpbiBNSHouICovCisJdTMyICAgICAgICAgICAgICAgICAgY2xrX3ZhbDsKKworLyoJSU5WQUxJRAorICoJUFJJX01JMlNfT1NSCisgKglTRUNfTUkyU19PU1IKKyAqCVRFUl9NSTJTX09TUgorICoJUVVBRF9NSTJTX09TUgorICoJRElHVF9DRENfUk9PVAorICovCisJdTE2ICAgICAgICAgICAgICAgICAgY2xrX3Jvb3Q7CisKKy8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KKwl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IGFmZV9scGFzc19kaWdpdGFsX2Nsa19jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIJCQkgaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgIHBkYXRhOworCXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnIGNsa19jZmc7Cit9IF9fcGFja2VkOworCisvKgorICogT3Bjb2RlIGZvciBBRkUgdG8gc3RhcnQgRFRNRi4KKyAqLworI2RlZmluZSBBRkVfUE9SVFNfQ01EX0RUTUZfQ1RMCTB4MDAwMTAxMDIKKworLyoqIERUTUYgcGF5bG9hZC4qLworc3RydWN0IGFmZV9kdG1mX2dlbmVyYXRpb25fY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCisJLyoKKwkgKiBEdXJhdGlvbiBvZiB0aGUgRFRNRiB0b25lIGluIG1zLgorCSAqIC0xICAgICAgLT4gY29udGludW91cywKKwkgKiAgMCAgICAgIC0+IGRpc2FibGUKKwkgKi8KKwlpbnQ2NF90ICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOworCisJLyoKKwkgKiBUaGUgRFRNRiBoaWdoIHRvbmUgZnJlcXVlbmN5LgorCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGlnaF9mcmVxOworCisJLyoKKwkgKiBUaGUgRFRNRiBsb3cgdG9uZSBmcmVxdWVuY3kuCisJICovCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBsb3dfZnJlcTsKKworCS8qCisJICogVGhlIERUTUYgdm9sdW1lIHNldHRpbmcKKwkgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGdhaW47CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgcG9ydHMgdG8gZW5hYmxlL2Rpc2FibGUgb24uCisJICovCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1fcG9ydHM7CisKKwkvKgorCSAqIFRoZSBEZXN0aW5hdGlvbiBwb3J0cyAtIGFycmF5ICAuCisJICogRm9yIERUTUYgb24gbXVsdGlwbGUgcG9ydHMsIHBvcnRJZHMgbmVlZHMgdG8KKwkgKiBiZSBwb3B1bGF0ZWQgbnVtUG9ydHMgdGltZXMuCisJICovCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBwb3J0X2lkczsKKworCS8qCisJICogdmFyaWFibGUgZm9yIDMyIGJpdCBhbGlnbm1lbnQgb2YgQVBSIHBhY2tldC4KKwkgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworZW51bSBhZmVfY29uZmlnX3R5cGUgeworCUFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHLAorCUFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRywKKwlBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcsCisJQUZFX0FBTkNfVkVSU0lPTiwKKwlBRkVfQ0RDX0NMSVBfUkVHSVNURVJTX0NPTkZJRywKKwlBRkVfQ0xJUF9CQU5LX1NFTCwKKwlBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHLAorCUFGRV9NQVhfQ09ORklHX1RZUEVTLAorfTsKKworc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQxNl90IHNsaW1idXNfZGV2X2lkOworCXVpbnQxNl90IHNsYXZlX2Rldl9wZ2RfbGE7CisJdWludDE2X3Qgc2xhdmVfZGV2X2ludGZkZXZfbGE7CisJdWludDE2X3QgYml0X3dpZHRoOworCXVpbnQxNl90IGRhdGFfZm9ybWF0OworCXVpbnQxNl90IG51bV9jaGFubmVsczsKKwl1aW50MTZfdCBzbGF2ZV9wb3J0X21hcHBpbmdbQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IGRldmljZV9lbnVtX2FkZHJfbHN3OworCXVpbnQzMl90IGRldmljZV9lbnVtX2FkZHJfbXN3OworCXVpbnQxNl90IHR4X3NsYXZlX3BvcnRfb2Zmc2V0OworCXVpbnQxNl90IHJ4X3NsYXZlX3BvcnRfb2Zmc2V0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZyB7CisJdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKwl1aW50MzJfdCByZWdfbG9naWNhbF9hZGRyOworCXVpbnQzMl90IHJlZ19maWVsZF90eXBlOworCXVpbnQzMl90IHJlZ19maWVsZF9iaXRfbWFzazsKKwl1aW50MTZfdCByZWdfYml0X3dpZHRoOworCXVpbnQxNl90IHJlZ19vZmZzZXRfc2NhbGU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DRENfUkVHX1BBR0VfQ0ZHICAgMQorCitlbnVtIHsKKwlBRkVfQ0RDX1JFR19QQUdFX0FTU0lHTl9QUk9DX0lEXzAgPSAwLAorCUFGRV9DRENfUkVHX1BBR0VfQVNTSUdOX1BST0NfSURfMSwKKwlBRkVfQ0RDX1JFR19QQUdFX0FTU0lHTl9QUk9DX0lEXzIsCisJQUZFX0NEQ19SRUdfUEFHRV9BU1NJR05fUFJPQ19JRF8zLAorfTsKKworc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX3BhZ2VfY2ZnIHsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IGVuYWJsZTsKKwl1aW50MzJfdCBwcm9jX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhIHsKKwl1aW50MzJfdCBudW1fcmVnaXN0ZXJzOworCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmcgKnJlZ19kYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSB7CisJdWludDMyX3QgcGF5bG9hZF9zaXplOworCXVpbnQzMl90IHBheWxvYWRfYWRkcmVzc19sc3c7CisJdWludDMyX3QgcGF5bG9hZF9hZGRyZXNzX21zdzsKKwl1aW50MzJfdCBtZW1fbWFwX2hhbmRsZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3ZjX3BhcmFtX2RhdGEgeworCXVpbnQzMl90IG1vZHVsZV9pZDsKKwl1aW50MzJfdCBwYXJhbV9pZDsKKwl1aW50MTZfdCBwYXJhbV9zaXplOworCXVpbnQxNl90IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wYXJhbV9od19tYWRfY3RybCB7CisJdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKwl1aW50MTZfdCBtYWRfdHlwZTsKKwl1aW50MTZfdCBtYWRfZW5hYmxlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9jbWRfaHdfbWFkX2N0cmwgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2h3X21hZF9jdHJsIHBheWxvYWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX2NtZF9od19tYWRfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1fc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyBzYl9wb3J0X2NmZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfY21kX3N3X21hZF9lbmFibGUgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmdfcGF5bG9hZCB7CisJc3RydWN0IGFmZV9zdmNfcGFyYW1fZGF0YSAgICAgY29tbW9uOworCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmcgIHJlZ19jZmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX2xwYXNzX2Nsa19jb25maWdfY29tbWFuZF92MiB7CisJc3RydWN0IGFwcl9oZHIJCQloZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbQlwYXJhbTsKKwlzdHJ1Y3QgYWZlX3N2Y19wYXJhbV9kYXRhCXBkYXRhOworCXN0cnVjdCBhZmVfY2xrX3NldAkJY2xrX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qCisgKiByZWdfZGF0YSdzIHNpemUgY2FuIGJlIHVwIHRvIEFGRV9NQVhfQ0RDX1JFR0lTVEVSU19UT19DT05GSUcKKyAqLworc3RydWN0IGFmZV9zdmNfY21kX2NkY19yZWdfY2ZnIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX3BheWxvYWQgcmVnX2RhdGFbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3N2Y19jbWRfaW5pdF9jZGNfcmVnX2NmZyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCBhZmVfc3ZjX2NtZF9zZXRfcGFyYW0gcGFyYW07CisJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgaW5pdDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3ZjX2NtZF9zYl9zbGF2ZV9jZmcgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOworCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOworCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnIHNiX3NsYXZlX2NmZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3ZjX2NtZF9jZGNfcmVnX3BhZ2VfY2ZnIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgY2RjX3JlZ19wYWdlX2NmZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfc3ZjX2NtZF9jZGNfYWFuY192ZXJzaW9uIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NkY19hYW5jX3ZlcnNpb24gdmVyc2lvbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X2FhbmNfcGFyYW0geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwl1bmlvbiB7CisJCXN0cnVjdCBhZmVfcGFyYW1fYWFuY19wb3J0X2NmZyBhYW5jX3BvcnRfY2ZnOworCQlzdHJ1Y3QgYWZlX21vZF9lbmFibGVfcGFyYW0gICAgbW9kX2VuYWJsZTsKKwl9IF9fcGFja2VkIGRhdGE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9hYW5jX2FjZGJfdGFibGUgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKK30gX19wYWNrZWQ7CisKKy8qIERvbGJ5IERBUCB0b3BvbG9neSAqLworI2RlZmluZSBET0xCWV9BRE1fQ09QUF9UT1BPTE9HWV9JRAkweDAwMDEwMzNCCisjZGVmaW5lIERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRAkweDEzMDEwMzNCCisKKy8qIFJNUyB2YWx1ZSBmcm9tIERTUCAqLworI2RlZmluZSBSTVNfTU9EVUxFSURfQVBQSV9QQVNTVEhSVSAgMHgxMDAwOTAxMQorI2RlZmluZSBSTVNfUEFSQU1fRklSU1RfU0FNUExFIDB4MTAwMDkwMTIKKyNkZWZpbmUgUk1TX1BBWUxPQURfTEVOIDQKKworLyogQ3VzdG9taXplZCBtaXhpbmcgaW4gbWF0aXggbWl4ZXIgKi8KKyNkZWZpbmUgTVRNWF9NT0RVTEVfSURfREVGQVVMVF9DSE1JWEVSICAweDAwMDEwMzQxCisjZGVmaW5lIERFRkFVTFRfQ0hNSVhFUl9QQVJBTV9JRF9DT0VGRiAgMHgwMDAxMDM0MgorI2RlZmluZSBDVVNUT01fU1RFUkVPX1BBWUxPQURfU0laRQk5CisjZGVmaW5lIENVU1RPTV9TVEVSRU9fQ01EX1BBUkFNX1NJWkUJMjQKKyNkZWZpbmUgQ1VTVE9NX1NURVJFT19OVU1fT1VUX0NICTB4MDAwMgorI2RlZmluZSBDVVNUT01fU1RFUkVPX05VTV9JTl9DSAkJMHgwMDAyCisjZGVmaW5lIENVU1RPTV9TVEVSRU9fSU5ERVhfUEFSQU0JMHgwMDAyCisjZGVmaW5lIFExNF9HQUlOX1pFUk9fUE9JTlRfRklWRQkweDIwMDAKKyNkZWZpbmUgUTE0X0dBSU5fVU5JVFkJCQkweDQwMDAKKworc3RydWN0IGFmZV9zdmNfY21kX3NldF9jbGlwX2Jhbmtfc2VsZWN0aW9uIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NsaXBfYmFua19zZWwgYmFua19zZWw7Cit9IF9fcGFja2VkOworCisvKiBVbHRyYXNvdW5kIHN1cHBvcnRlZCBmb3JtYXRzICovCisjZGVmaW5lIFVTX1BPSU5UX0VQT1NfRk9STUFUX1YyIDB4MDAwMTI3MkQKKyNkZWZpbmUgVVNfUkFXX0ZPUk1BVF9WMiAgICAgICAgMHgwMDAxMjcyQworI2RlZmluZSBVU19QUk9YX0ZPUk1BVF9WNCAgICAgICAweDAwMDEyNzNCCisjZGVmaW5lIFVTX1JBV19TWU5DX0ZPUk1BVCAgICAgIDB4MDAwMTI3MkYKKyNkZWZpbmUgVVNfR0VTX1NZTkNfRk9STUFUICAgICAgMHgwMDAxMjczMAorCisjZGVmaW5lIEFGRV9NT0RVTEVfR1JPVVBfREVWSUNFCTB4MDAwMTAyNTQKKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0dST1VQX0RFVklDRV9DRkcJMHgwMDAxMDI1NQorI2RlZmluZSBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0VOQUJMRSAweDAwMDEwMjU2CisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX01JMlNfUlgJMHgxMTAyCisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0dST1VQX0RFVklDRV9DRkcKKyAqIHBhcmFtZXRlciwgd2hpY2ggY29uZmlndXJlcyBtYXggb2YgOCBBRkUgcG9ydHMKKyAqIGludG8gYSBncm91cC4KKyAqIFRoZSBmaXhlZCBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGlzIHNpeHRlZW4gYnl0ZXMuCisgKi8KK3N0cnVjdCBhZmVfZ3JvdXBfZGV2aWNlX2dyb3VwX2NmZyB7CisJdTMyIG1pbm9yX3ZlcnNpb247CisJdTE2IGdyb3VwX2lkOworCXUxNiBudW1fY2hhbm5lbHM7CisJdTE2IHBvcnRfaWRbOF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fUlggXAorCShBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWCArIDB4MTAwKQorI2RlZmluZSBBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1RYIFwKKwkoQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFggKyAweDEwMCkKKyNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1JYIFwKKwkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWCArIDB4MTAwKQorI2RlZmluZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fVFggXAorCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgxMDApCisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1JYIFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgxMDApCisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1RYIFwKKwkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgxMDApCisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fUlggXAorCShBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCArIDB4MTAwKQorI2RlZmluZSBBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1RYIFwKKwkoQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFggKyAweDEwMCkKKworLyogSUQgb2YgdGhlIHBhcmFtZXRlciB1c2VkIGJ5ICNBRkVfTU9EVUxFX0dST1VQX0RFVklDRSB0byBjb25maWd1cmUgdGhlCisgKiBncm91cCBkZXZpY2UuICNBRkVfU1ZDX0NNRF9TRVRfUEFSQU0gY2FuIHVzZSB0aGlzIHBhcmFtZXRlciBJRC4KKyAqCisgKiBSZXF1aXJlbWVudHM6CisgKiAtIENvbmZpZ3VyZSB0aGUgZ3JvdXAgYmVmb3JlIHRoZSBtZW1iZXIgcG9ydHMgaW4gdGhlIGdyb3VwIGFyZQorICogY29uZmlndXJlZCBhbmQgc3RhcnRlZC4KKyAqIC0gRW5hYmxlIHRoZSBncm91cCBvbmx5IGFmdGVyIGl0IGlzIGNvbmZpZ3VyZWQuCisgKiAtIFN0b3AgYWxsIG1lbWJlciBwb3J0cyBpbiB0aGUgZ3JvdXAgYmVmb3JlIGRpc2FibGluZyB0aGUgZ3JvdXAuCisgKi8KKyNkZWZpbmUgQUZFX1BBUkFNX0lEX0dST1VQX0RFVklDRV9URE1fQ09ORklHCTB4MDAwMTAyOUUKKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiB1c2VkIHRvIGhhbmRsZSBmdXR1cmUgYWRkaXRpb25zIHRvCisgKiBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX1RETV9DT05GSUcgcHJvY2Vzc2luZyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorICovCisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9HUk9VUF9ERVZJQ0VfVERNX0NPTkZJRwkweDEKKworLyogTnVtYmVyIG9mIEFGRSBwb3J0cyBpbiBncm91cCBkZXZpY2UgICovCisjZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfTlVNX1BPUlRTCQkJCQk4CisKKy8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfVERNX0NPTkZJRyBwYXJhbWV0ZXIgSUQKKyAqIHVzZWQgYnkgQUZFX01PRFVMRV9HUk9VUF9ERVZJQ0UuCisgKi8KK3N0cnVjdCBhZmVfcGFyYW1faWRfZ3JvdXBfZGV2aWNlX3RkbV9jZmcgeworCXUzMglncm91cF9kZXZpY2VfY2ZnX21pbm9yX3ZlcnNpb247CisJLyogTWlub3IgdmVyc2lvbiB1c2VkIHRvIHRyYWNrIGdyb3VwIGRldmljZSBjb25maWd1cmF0aW9uLgorCSAqIEB2YWx1ZXMgI0FGRV9BUElfVkVSU0lPTl9HUk9VUF9ERVZJQ0VfVERNX0NPTkZJRworCSAqLworCisJdTE2CWdyb3VwX2lkOworCS8qIElEIGZvciB0aGUgZ3JvdXAgZGV2aWNlLgorCSAqIEB2YWx1ZXMKKwkgKiAtICNBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1JYCisJICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9UWAorCSAqIC0gI0FGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9SWAorCSAqIC0gI0FGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9UWAorCSAqIC0gI0FGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1JYCisJICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fVFgKKwkgKiAtICNBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1JYCisJICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9UWAorCSAqLworCisJdTE2CXJlc2VydmVkOworCS8qIDAgKi8KKworCXUxNglwb3J0X2lkW0FGRV9HUk9VUF9ERVZJQ0VfTlVNX1BPUlRTXTsKKwkvKiBBcnJheSBvZiBtZW1iZXIgcG9ydCBJRHMgb2YgdGhpcyBncm91cC4KKwkgKiBAdmFsdWVzCisJICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlgKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xCisJICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMgorCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzMKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80CisJICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNQorCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzYKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83CisKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWAorCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzEKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yCisJICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMworCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQKKwkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81CisJICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNgorCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzcKKworCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlgKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzIKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzMKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzUKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzYKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcKKworCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFgKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzEKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzIKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzMKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzUKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzYKKwkgKiAtICNBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzcKKworCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWAorCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xCisJICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzIKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMworCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80CisJICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzUKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNgorCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83CisKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFgKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMQorCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yCisJICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzMKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNAorCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81CisJICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzYKKwkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNworCisJICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlgKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xCisJICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMgorCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzMKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80CisJICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNQorCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzYKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83CisKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWAorCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzEKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yCisJICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMworCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQKKwkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81CisJICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNgorCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzcKKwkgKiBAdGFibGVidWxsZXRlbmQKKwkgKi8KKworCXUzMgludW1fY2hhbm5lbHM7CisJLyogTnVtYmVyIG9mIGVuYWJsZWQgc2xvdHMgZm9yIFRETSBmcmFtZS4KKwkgKiBAdmFsdWVzIDEgdG8gOAorCSAqLworCisJdTMyCXNhbXBsZV9yYXRlOworCS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCisJICogQHZhbHVlcworCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCisJICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCisJICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMjRLCisJICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMzJLCisJICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfNDhLIEB0YWJsZWJ1bGxldGVuZAorCSAqLworCisJdTMyCWJpdF93aWR0aDsKKwkvKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KKwkgKiBAdmFsdWVzIDE2LCAyNCwgKDMyKQorCSAqLworCisJdTE2CW5zbG90c19wZXJfZnJhbWU7CisJLyogTnVtYmVyIG9mIHNsb3RzIHBlciBmcmFtZS4gVHlwaWNhbCA6IDEsIDIsIDQsIDgsIDE2LCAzMi4KKwkgKiBAdmFsdWVzIDEgLSAzMgorCSAqLworCisJdTE2CXNsb3Rfd2lkdGg7CisJLyogU2xvdCB3aWR0aCBvZiB0aGUgc2xvdCBpbiBhIFRETSBmcmFtZS4gIChzbG90X3dpZHRoID49IGJpdF93aWR0aCkKKwkgKiBoYXZlIHRvIGJlIHNhdGlzZmllZC4KKwkgKiBAdmFsdWVzIDE2LCAyNCwgMzIKKwkgKi8KKworCXUzMglzbG90X21hc2s7CisJLyogUG9zaXRpb24gb2YgYWN0aXZlIHNsb3RzLiAgV2hlbiB0aGF0IGJpdCBpcyBzZXQsIHRoYXQgcGFyaWN1bGFyCisJICogc2xvdCBpcyBhY3RpdmUuCisJICogTnVtYmVyIG9mIGFjdGl2ZSBzbG90cyBjYW4gYmUgaW5mZXJyZWQgYnkgbnVtYmVyIG9mIGJpdHMgc2V0IGluCisJICogdGhlIG1hc2suICBPbmx5IDggaW5kaXZpZHVhbCBiaXRzIGNhbiBiZSBlbmFibGVkLgorCSAqIEJpdHMgMC4uMzEgY29ycmVzcG9uZGluZyB0byBzbG90IDAuLjMxCisJICogQHZhbHVlcyAxIHRvIDJeMzIgLTEKKwkgKi8KK30gX19wYWNrZWQ7CisKKy8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0dST1VQX0RFVklDRV9FTkFCTEUKKyAqIHBhcmFtZXRlciwgd2hpY2ggZW5hYmxlcyBvcgorICogZGlzYWJsZXMgYW55IG1vZHVsZS4KKyAqIFRoZSBmaXhlZCBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGlzIGZvdXIgYnl0ZXMuCisgKi8KKworc3RydWN0IGFmZV9ncm91cF9kZXZpY2VfZW5hYmxlIHsKKwl1MTYgZ3JvdXBfaWQ7CisJLyogdmFsaWQgdmFsdWUgaXMgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfTUkyU19SWCAqLworCXUxNiBlbmFibGU7CisJLyogRW5hYmxlcyAoMSkgb3IgZGlzYWJsZXMgKDApIHRoZSBtb2R1bGUuICovCit9IF9fcGFja2VkOworCit1bmlvbiBhZmVfcG9ydF9ncm91cF9jb25maWcgeworCXN0cnVjdCBhZmVfZ3JvdXBfZGV2aWNlX2dyb3VwX2NmZyBncm91cF9jZmc7CisJc3RydWN0IGFmZV9ncm91cF9kZXZpY2VfZW5hYmxlIGdyb3VwX2VuYWJsZTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2dyb3VwX2RldmljZV90ZG1fY2ZnIHRkbV9jZmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3BvcnRfZ3JvdXBfY3JlYXRlIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKKwl1bmlvbiBhZmVfcG9ydF9ncm91cF9jb25maWcgZGF0YTsKK30gX19wYWNrZWQ7CisKKy8qIENvbW1hbmQgZm9yIE1hdHJpeCBvciBTdHJlYW0gUm91dGVyICovCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjIgICAgMHgwMDAxMERDRQorLyogTW9kdWxlIGZvciBBVlNZTkMgKi8KKyNkZWZpbmUgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DICAgIDB4MDAwMTBEQzYKKworLyogUGFyYW1ldGVyIHVzZWQgYnkgI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQyB0byBzcGVjaWZ5IHRoZQorICogcmVuZGVyIHdpbmRvdyBzdGFydCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIGEgU2V0CisgKiBjb21tYW5kIChub3QgYSBHZXQgY29tbWFuZCkgaW4gdGhlIFJ4IGRpcmVjdGlvbgorICogKCNBU01fU0VTU0lPTl9DTURfU0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyKS4KKyAqIFJlbmRlciB3aW5kb3cgc3RhcnQgaXMgYSB2YWx1ZSAoc2Vzc2lvbiB0aW1lIG1pbnVzIHRpbWVzdGFtcCwgb3IgU1QtVFMpCisgKiBiZWxvdyB3aGljaCBmcmFtZXMgYXJlIGhlbGQsIGFuZCBhZnRlciB3aGljaCBmcmFtZXMgYXJlIGltbWVkaWF0ZWx5CisgKiByZW5kZXJlZC4KKyAqLworI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9XSU5ET1dfU1RBUlRfVjIgMHgwMDAxMEREMQorCisvKiBQYXJhbWV0ZXIgdXNlZCBieSAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DIHRvIHNwZWNpZnkgdGhlCisgKiByZW5kZXIgd2luZG93IGVuZCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgc3VwcG9ydGVkIG9ubHkgZm9yIGEgU2V0CisgKiBjb21tYW5kIChub3QgYSBHZXQgY29tbWFuZCkgaW4gdGhlIFJ4IGRpcmVjdGlvbgorICogKCNBU01fU0VTU0lPTl9DTURfU0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyKS4gUmVuZGVyIHdpbmRvdyBlbmQgaXMgYSB2YWx1ZQorICogKHNlc3Npb24gdGltZSBtaW51cyB0aW1lc3RhbXApIGFib3ZlIHdoaWNoIGZyYW1lcyBhcmUgZHJvcHBlZCwgYW5kIGJlbG93CisgKiB3aGljaCBmcmFtZXMgYXJlIGltbWVkaWF0ZWx5IHJlbmRlcmVkLgorICovCisjZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX1dJTkRPV19FTkRfVjIgICAweDAwMDEwREQyCisKKy8qIEdlbmVyaWMgcGF5bG9hZCBvZiB0aGUgd2luZG93IHBhcmFtZXRlcnMgaW4gdGhlCisgKiAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DIG1vZHVsZS4KKyAqIFRoaXMgcGF5bG9hZCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgYSBTZXQgY29tbWFuZAorICogKG5vdCBhIEdldCBjb21tYW5kKSBvbiB0aGUgUnggcGF0aC4KKyAqLworc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fd2luZG93X3YyX3QgeworCXUzMiAgICB3aW5kb3dfbHN3OworCS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHJlbmRlciB3aW5kb3cgc3RhcnQgdmFsdWUuICovCisKKwl1MzIgICAgd2luZG93X21zdzsKKwkvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSByZW5kZXIgd2luZG93IHN0YXJ0IHZhbHVlLgorCSAqCisJICogVGhlIDY0LWJpdCBudW1iZXIgZm9ybWVkIGJ5IHdpbmRvd19sc3cgYW5kIHdpbmRvd19tc3cgc3BlY2lmaWVzIGEKKwkgKiBzaWduZWQgNjQtYml0IHdpbmRvdyB2YWx1ZSBpbiBtaWNyb3NlY29uZHMuIFRoZSBzaWduIGV4dGVuc2lvbiBpcworCSAqIG5lY2Vzc2FyeS4gVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKKwkgKiAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX1NUQVJUX1YyCisJICogI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX1dJTkRPV19FTkRfVjIKKwkgKiAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9TVEFUX1dJTkRPV19TVEFSVF9WMgorCSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NUQVRfV0lORE9XX0VORF9WMgorCSAqIFRoZSB2YWx1ZSBkZXBlbmRzIG9uIHdoaWNoIHBhcmFtZXRlciBJRCBpcyB1c2VkLgorCSAqIFRoZSBhRFNQIGhvbm9ycyB0aGUgd2luZG93cyBhdCBhIGdyYW51bGFyaXR5IG9mIDEgbXMuCisJICovCit9OworCitzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX3NldF9tdG14X3N0cnN0cl9wYXJhbXNfdjIgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbHN3OworCS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBkYXRhIHBheWxvYWQgYWRkcmVzcy4gKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbXN3OworCS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBkYXRhIHBheWxvYWQgYWRkcmVzcy4KKwkgKiBJZiB0aGUgYWRkcmVzcyBpcyBub3Qgc2VudCAoTlVMTCksIHRoZSBtZXNzYWdlIGlzIGluIHRoZSBwYXlsb2FkLgorCSAqIElmIHRoZSBhZGRyZXNzIGlzIHNlbnQgKG5vbi1OVUxMKSwgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWRzCisJICogYmVnaW4gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorCSAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKwkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYW4gYWRkcmVzcy4gVGhpcyBtZW1vcnkgbWFwIGhhbmRsZSBpcyByZXR1cm5lZAorCSAqIGJ5IHRoZSBhRFNQIHRocm91Z2ggdGhlICNBU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZC4KKwkgKiB2YWx1ZXMKKwkgKiAtIE5VTEwgLS0gUGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMgYXJlIHdpdGhpbiB0aGUgbWVzc2FnZSBwYXlsb2FkCisJICogKGluLWJhbmQpLgorCSAqIC0gTm9uLU5VTEwgLS0gUGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMgYmVnaW4gYXQgdGhlIGFkZHJlc3Mgc3BlY2lmaWVkCisJICogaW4gdGhlIGRhdGFfcGF5bG9hZF9hZGRyX2xzdyBhbmQgZGF0YV9wYXlsb2FkX2FkZHJfbXN3IGZpZWxkcworCSAqIChvdXQtb2YtYmFuZCkuCisJICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9zaXplOworCS8qIEFjdHVhbCBzaXplIG9mIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGFjY29tcGFueWluZyB0aGUgbWVzc2FnZSwgb3IgaW4KKwkgKiBzaGFyZWQgbWVtb3J5LiBUaGlzIGZpZWxkIGlzIHVzZWQgZm9yIHBhcnNpbmcgdGhlIHBhcmFtZXRlciBwYXlsb2FkLgorCSAqIHZhbHVlcyA+IDAgYnl0ZXMKKwkgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOworCS8qIERpcmVjdGlvbiBvZiB0aGUgZW50aXR5IChtYXRyaXggbWl4ZXIgb3Igc3RyZWFtIHJvdXRlcikgb24gd2hpY2gKKwkgKiB0aGUgcGFyYW1ldGVyIGlzIHRvIGJlIHNldC4KKwkgKiB2YWx1ZXMKKwkgKiAtIDAgLS0gUnggKGZvciBSeCBzdHJlYW0gcm91dGVyIG9yIFJ4IG1hdHJpeCBtaXhlcikKKwkgKiAtIDEgLS0gVHggKGZvciBUeCBzdHJlYW0gcm91dGVyIG9yIFR4IG1hdHJpeCBtaXhlcikKKwkgKi8KK307CisKK3N0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMgeworCXN0cnVjdCBhcHJfaGRyICBoZHI7CisJc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9zZXRfbXRteF9zdHJzdHJfcGFyYW1zX3YyIHBhcmFtOworCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKKwl1MzIgd2luZG93X2xzdzsKKwl1MzIgd2luZG93X21zdzsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX0dFVF9NVE1YX1NUUlRSX1BBUkFNU19WMiAweDAwMDEwRENGCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjIgMHgwMDAxMEREMAorCisjZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fU0VTU0lPTl9USU1FX1YzIDB4MDAwMTJGMEIKKyNkZWZpbmUgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9TVElNRV9UU1RNUF9GTEdfQk1BU0sgKDB4ODAwMDAwMDBVTCkKKworc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9nZXRfbXRteF9zdHJzdHJfcGFyYW1zX3YyIHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX2xzdzsKKwkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgZGF0YSBwYXlsb2FkIGFkZHJlc3MuICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX21zdzsKKwkvKgorCSAqIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBkYXRhIHBheWxvYWQgYWRkcmVzcy4KKwkgKiBJZiB0aGUgYWRkcmVzcyBpcyBub3Qgc2VudCAoTlVMTCksIHRoZSBtZXNzYWdlIGlzIGluIHRoZSBwYXlsb2FkLgorCSAqIElmIHRoZSBhZGRyZXNzIGlzIHNlbnQgKG5vbi1OVUxMKSwgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWRzCisJICogYmVnaW4gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorCSAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKKwkvKgorCSAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzLiBUaGlzIG1lbW9yeSBtYXAgaGFuZGxlIGlzIHJldHVybmVkCisJICogYnkgdGhlIGFEU1AgdGhyb3VnaCB0aGUgI0FTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kLgorCSAqIHZhbHVlcworCSAqIC0gTlVMTCAtLSBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcyBhcmUgd2l0aGluIHRoZSBtZXNzYWdlIHBheWxvYWQKKwkgKiAoaW4tYmFuZCkuCisJICogLSBOb24tTlVMTCAtLSBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcyBiZWdpbiBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQKKwkgKiBpbiB0aGUgZGF0YV9wYXlsb2FkX2FkZHJfbHN3IGFuZCBkYXRhX3BheWxvYWRfYWRkcl9tc3cgZmllbGRzCisJICogKG91dC1vZi1iYW5kKS4KKwkgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjsKKwkvKgorCSAqIERpcmVjdGlvbiBvZiB0aGUgZW50aXR5IChtYXRyaXggbWl4ZXIgb3Igc3RyZWFtIHJvdXRlcikgb24gd2hpY2gKKwkgKiB0aGUgcGFyYW1ldGVyIGlzIHRvIGJlIHNldC4KKwkgKiB2YWx1ZXMKKwkgKiAtIDAgLS0gUnggKGZvciBSeCBzdHJlYW0gcm91dGVyIG9yIFJ4IG1hdHJpeCBtaXhlcikKKwkgKiAtIDEgLS0gVHggKGZvciBUeCBzdHJlYW0gcm91dGVyIG9yIFR4IG1hdHJpeCBtaXhlcikKKwkgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG1vZHVsZV9pZDsKKwkvKiBVbmlxdWUgbW9kdWxlIElELiAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKKwkvKiBVbmlxdWUgcGFyYW1ldGVyIElELiAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBwYXJhbV9tYXhfc2l6ZTsKK307CisKK3N0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3Nlc3Npb25fdGltZV92M190IHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHNlc3Npb25fdGltZV9sc3c7CisJLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHNlc3Npb25fdGltZV9tc3c7CisJLyoKKwkgKiBVcHBlciAzMiBiaXRzIG9mIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMuCisJICogVGhlIDY0LWJpdCBudW1iZXIgZm9ybWVkIGJ5IHNlc3Npb25fdGltZV9sc3cgYW5kIHNlc3Npb25fdGltZV9tc3cKKwkgKiBpcyB0cmVhdGVkIGFzIHNpZ25lZC4KKwkgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfdGltZV9sc3c7CisJLyoKKwkgKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgYWJzb2x1dGUgdGltZSBpbiBtaWNyb3NlY29uZHMuCisJICogVGhpcyBpcyB0aGUgdGltZSB3aGVuIHRoZSBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBzZXNzaW9uX3RpbWVfbHN3IGlzIHJlbmRlcmVkIHRvIHRoZSBoYXJkd2FyZS4gVGhpcyBhYnNvbHV0ZQorCSAqIHRpbWUgY2FuIGJlIHNsaWdodGx5IGluIHRoZSBmdXR1cmUgb3IgcGFzdC4KKwkgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfdGltZV9tc3c7CisJLyoKKwkgKiBVcHBlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgYWJzb2x1dGUgdGltZSBpbiBtaWNyb3NlY29uZHMuCisJICogVGhpcyBpcyB0aGUgdGltZSB3aGVuIHRoZSBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBzZXNzaW9uX3RpbWVfbXN3IGlzIHJlbmRlcmVkIHRvIGhhcmR3YXJlLiBUaGlzIGFic29sdXRlCisJICogdGltZSBjYW4gYmUgc2xpZ2h0bHkgaW4gdGhlIGZ1dHVyZSBvciBwYXN0LiBUaGUgNjQtYml0IG51bWJlcgorCSAqIGZvcm1lZCBieSBhYnNvbHV0ZV90aW1lX2xzdyBhbmQgYWJzb2x1dGVfdGltZV9tc3cgaXMgdHJlYXRlZCBhcworCSAqIHVuc2lnbmVkLgorCSAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wX2xzdzsKKwkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSBsYXN0IHByb2Nlc3NlZCB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHRpbWVfc3RhbXBfbXN3OworCS8qCisJICogVXBwZXIgMzIgYml0cyBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgdGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcy4KKwkgKiBUaGUgNjQtYml0IG51bWJlciBmb3JtZWQgYnkgdGltZV9zdGFtcF9sc3cgYW5kIHRpbWVfc3RhbXBfbHN3CisJICogaXMgdHJlYXRlZCBhcyB1bnNpZ25lZC4KKwkgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJLyoKKwkgKiBLZWVwcyB0cmFjayBvZiBhbnkgYWRkaXRpb25hbCBmbGFncyBuZWVkZWQuCisJICogQHZhbHVlc3tmb3IgYml0IDMxfQorCSAqIC0gMCAtLSBVbmluaXRpYWxpemVkL2ludmFsaWQKKwkgKiAtIDEgLS0gVmFsaWQKKwkgKiBBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQ7IGNsaWVudHMgbXVzdCBzZXQgdGhlbSB0byB6ZXJvLgorCSAqLworfTsKKwordW5pb24gYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9kYXRhX3R5cGUgeworCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3Nlc3Npb25fdGltZV92M190IHNlc3Npb25fdGltZTsKK307CisKK3N0cnVjdCBhc21fbXRteF9zdHJ0cl9nZXRfcGFyYW1zIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9nZXRfbXRteF9zdHJzdHJfcGFyYW1zX3YyIHBhcmFtX2luZm87Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX210bXhfc3RydHJfZ2V0X3BhcmFtc19jbWRyc3AgeworCXVpbnQzMl90IGVycl9jb2RlOworCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgcGFyYW1faW5mbzsKKwl1bmlvbiBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX2RhdGFfdHlwZSBwYXJhbV9kYXRhOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9SRVNBTVBMRVIgMHgwMDAxMDcxOQorCitlbnVtIHsKKwlMRUdBQ1lfUENNID0gMCwKKwlDT01QUkVTU0VEX1BBU1NUSFJPVUdILAorCUNPTVBSRVNTRURfUEFTU1RIUk9VR0hfQ09OVkVSVCwKKwlDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RTRCwKK307CisKKyNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfQ09NUFJFU1NFRF9NVVRFICAgICAgICAgICAgICAgIDB4MDAwMTA3NzAKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9DT01QUkVTU0VEX01VVEUgICAgICAgICAgICAgICAgIDB4MDAwMTA3NzEKKworc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbXV0ZSB7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBjb21tYW5kOworCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBwYXJhbXM7CisJdTMyICAgIG11dGVfb247Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX0NPTVBSRVNTRURfTEFURU5DWSAgICAgICAgICAgICAweDAwMDEwNzZFCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQ09NUFJFU1NFRF9MQVRFTkNZICAgICAgICAgICAgICAweDAwMDEwNzZGCisKK3N0cnVjdCBhZG1fc2V0X2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3kgeworCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgY29tbWFuZDsKKwlzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUgcGFyYW1zOworCXUzMiAgICBsYXRlbmN5OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBWT0lDRVBST0NfTU9EVUxFX0lEX0dFTkVSSUNfVFggICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEVGNgorI2RlZmluZSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VOREZPQ1VTICAgICAgICAgICAgICAgMHgwMDAxMEUzNworI2RlZmluZSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VSQ0VUUkFDS0lORyAgICAgICAgICAgMHgwMDAxMEUzOAorI2RlZmluZSBNQVhfU0VDVE9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlMgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNQVhfUE9MQVJfQUNUSVZJVFlfSU5ESUNBVE9SUyAgICAgICAgICAgICAgICAgICAgICAgMzYwCisKK3N0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSB7CisJdWludDE2X3Qgc3RhcnRfYW5nbGVbTUFYX1NFQ1RPUlNdOworCXVpbnQ4X3QgZW5hYmxlW01BWF9TRUNUT1JTXTsKKwl1aW50MTZfdCBnYWluX3N0ZXA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtIHsKKwl1aW50OF90IHZhZFtNQVhfU0VDVE9SU107CisJdWludDE2X3QgZG9hX3NwZWVjaDsKKwl1aW50MTZfdCBkb2Ffbm9pc2VbTUFYX05PSVNFX1NPVVJDRV9JTkRJQ0FUT1JTXTsKKwl1aW50OF90IHBvbGFyX2FjdGl2aXR5W01BWF9QT0xBUl9BQ1RJVklUWV9JTkRJQ0FUT1JTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgeworCXVpbnQxNl90IHN0YXJ0X2FuZ2xlc1tNQVhfU0VDVE9SU107CisJdWludDhfdCBlbmFibGVzW01BWF9TRUNUT1JTXTsKKwl1aW50MTZfdCBnYWluX3N0ZXA7CisJdWludDE2X3QgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWRtX3NldF9mbHVlbmNlX3NvdW5kZm9jdXNfcGFyYW0geworCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgcGFyYW1zOworCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBkYXRhOworCXN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3Qgc291bmRmb2N1c19kYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QgeworCXVpbnQ4X3QgdmFkW01BWF9TRUNUT1JTXTsKKwl1aW50MTZfdCBkb2Ffc3BlZWNoOworCXVpbnQxNl90IGRvYV9ub2lzZVtNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlNdOworCXVpbnQ4X3QgcG9sYXJfYWN0aXZpdHlbTUFYX1BPTEFSX0FDVElWSVRZX0lORElDQVRPUlNdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9BVURJT1NQSEVSRSAgICAgICAgICAgICAgIDB4MDAwMTA5MTYKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9FTkFCTEUgICAgICAgICAweDAwMDEwOTE3CisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQVVESU9TUEhFUkVfU1RSRU5HVEggICAgICAgMHgwMDAxMDkxOAorI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0NPTkZJR19NT0RFICAgIDB4MDAwMTA5MTkKKworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0NPRUZGU19TVEVSRU9fSU5QVVQgICAgICAgICAweDAwMDEwOTFBCisjZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQVVESU9TUEhFUkVfQ09FRkZTX01VTFRJQ0hBTk5FTF9JTlBVVCAgIDB4MDAwMTA5MUIKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9ERVNJR05fU1RFUkVPX0lOUFVUICAgICAgICAgMHgwMDAxMDkxQworI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0RFU0lHTl9NVUxUSUNIQU5ORUxfSU5QVVQgICAweDAwMDEwOTFECisKKyNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9PUEVSQVRJTkdfSU5QVVRfTUVESUFfSU5GTyAgMHgwMDAxMDkxRQorI2VuZGlmIC8qX0FQUl9BVURJT19WMl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8uaCBiL2luY2x1ZGUvc291bmQvYXByX2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNTY0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvYXByX2F1ZGlvLmgKQEAgLTAsMCArMSwxOTMxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX0FQUl9BVURJT19IXworI2RlZmluZSBfQVBSX0FVRElPX0hfCisKKy8qIEFTTSBvcGNvZGVzIHdpdGhvdXQgQVBSIHBheWxvYWRzKi8KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgorCisvKgorICogQXVkaW8gRnJvbnQgRW5kIChBRkUpCisgKi8KKworLyogUG9ydCBJRC4gVXBkYXRlIGFmZV9nZXRfcG9ydF9pbmRleCB3aGVuIGEgbmV3IHBvcnQgaXMgYWRkZWQgaGVyZS4gKi8KKyNkZWZpbmUgUFJJTUFSWV9JMlNfUlggMAkJLyogaW5kZXggPSAwICovCisjZGVmaW5lIFBSSU1BUllfSTJTX1RYIDEJCS8qIGluZGV4ID0gMSAqLworI2RlZmluZSBQQ01fUlggMgkJCS8qIGluZGV4ID0gMiAqLworI2RlZmluZSBQQ01fVFggMwkJCS8qIGluZGV4ID0gMyAqLworI2RlZmluZSBTRUNPTkRBUllfSTJTX1JYIDQJCS8qIGluZGV4ID0gNCAqLworI2RlZmluZSBTRUNPTkRBUllfSTJTX1RYIDUJCS8qIGluZGV4ID0gNSAqLworI2RlZmluZSBNSTJTX1JYIDYJCQkvKiBpbmRleCA9IDYgKi8KKyNkZWZpbmUgTUkyU19UWCA3CQkJLyogaW5kZXggPSA3ICovCisjZGVmaW5lIEhETUlfUlggOAkJCS8qIGluZGV4ID0gOCAqLworI2RlZmluZSBSU1ZEXzIgOQkJCS8qIGluZGV4ID0gOSAqLworI2RlZmluZSBSU1ZEXzMgMTAJCQkvKiBpbmRleCA9IDEwICovCisjZGVmaW5lIERJR0lfTUlDX1RYIDExCQkJLyogaW5kZXggPSAxMSAqLworI2RlZmluZSBWT0lDRV9SRUNPUkRfUlggMHg4MDAzCQkvKiBpbmRleCA9IDEyICovCisjZGVmaW5lIFZPSUNFX1JFQ09SRF9UWCAweDgwMDQJCS8qIGluZGV4ID0gMTMgKi8KKyNkZWZpbmUgVk9JQ0VfUExBWUJBQ0tfVFggMHg4MDA1CS8qIGluZGV4ID0gMTQgKi8KKworLyogU2xpbWJ1cyBNdWx0aSBjaGFubmVsIHBvcnQgaWQgcG9vbCAgKi8KKyNkZWZpbmUgU0xJTUJVU18wX1JYCQkweDQwMDAJCS8qIGluZGV4ID0gMTUgKi8KKyNkZWZpbmUgU0xJTUJVU18wX1RYCQkweDQwMDEJCS8qIGluZGV4ID0gMTYgKi8KKyNkZWZpbmUgU0xJTUJVU18xX1JYCQkweDQwMDIJCS8qIGluZGV4ID0gMTcgKi8KKyNkZWZpbmUgU0xJTUJVU18xX1RYCQkweDQwMDMJCS8qIGluZGV4ID0gMTggKi8KKyNkZWZpbmUgU0xJTUJVU18yX1JYCQkweDQwMDQKKyNkZWZpbmUgU0xJTUJVU18yX1RYCQkweDQwMDUKKyNkZWZpbmUgU0xJTUJVU18zX1JYCQkweDQwMDYKKyNkZWZpbmUgU0xJTUJVU18zX1RYCQkweDQwMDcKKyNkZWZpbmUgU0xJTUJVU180X1JYCQkweDQwMDgKKyNkZWZpbmUgU0xJTUJVU180X1RYCQkweDQwMDkJCS8qIGluZGV4ID0gMjQgKi8KKworI2RlZmluZSBJTlRfQlRfU0NPX1JYIDB4MzAwMAkJLyogaW5kZXggPSAyNSAqLworI2RlZmluZSBJTlRfQlRfU0NPX1RYIDB4MzAwMQkJLyogaW5kZXggPSAyNiAqLworI2RlZmluZSBJTlRfQlRfQTJEUF9SWCAweDMwMDIJCS8qIGluZGV4ID0gMjcgKi8KKyNkZWZpbmUgSU5UX0ZNX1JYIDB4MzAwNAkJLyogaW5kZXggPSAyOCAqLworI2RlZmluZSBJTlRfRk1fVFggMHgzMDA1CQkvKiBpbmRleCA9IDI5ICovCisjZGVmaW5lIFJUX1BST1hZX1BPUlRfMDAxX1JYCTB4MjAwMCAgICAvKiBpbmRleCA9IDMwICovCisjZGVmaW5lIFJUX1BST1hZX1BPUlRfMDAxX1RYCTB4MjAwMSAgICAvKiBpbmRleCA9IDMxICovCisjZGVmaW5lIFNFQ09OREFSWV9QQ01fUlggMTIJCQkvKiBpbmRleCA9IDMyICovCisjZGVmaW5lIFNFQ09OREFSWV9QQ01fVFggMTMJCQkvKiBpbmRleCA9IDMzICovCisjZGVmaW5lIFBTRVVET1BPUlRfMDEgICAgICAgICAgIDB4ODAwMSAgICAvKiBpbmRleCA9MzQgKi8KKworI2RlZmluZSBBRkVfUE9SVF9JTlZBTElEIDB4RkZGRgorI2RlZmluZSBTTElNQlVTX0VYVFBST0NfUlggQUZFX1BPUlRfSU5WQUxJRAorCisjZGVmaW5lIEFGRV9QT1JUX0NNRF9TVEFSVCAweDAwMDEwMGNhCisKKyNkZWZpbmUgQUZFX0VWRU5UX1JUUE9SVF9TVEFSVCAwCisjZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfU1RPUCAxCisjZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfTE9XX1dNIDIKKyNkZWZpbmUgQUZFX0VWRU5UX1JUUE9SVF9ISV9XTSAzCisKK3N0cnVjdCBhZmVfcG9ydF9zdGFydF9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHBvcnRfaWQ7CisJdTE2IGdhaW47CQkvKiBRMTMgKi8KKwl1MzIgc2FtcGxlX3JhdGU7CS8qIDggLCAxNiwgNDhraHogKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BPUlRfQ01EX1NUT1AgMHgwMDAxMDBjYgorc3RydWN0IGFmZV9wb3J0X3N0b3BfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BPUlRfQ01EX0FQUExZX0dBSU4gMHgwMDAxMDBjYworc3RydWN0IGFmZV9wb3J0X2dhaW5fY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXUxNglnYWluOy8qIFExMyAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9DTURfU0lERVRPTkVfQ1RMIDB4MDAwMTAwY2QKK3N0cnVjdCBhZmVfcG9ydF9zaWRldG9uZV9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHJ4X3BvcnRfaWQ7CQkvKiBQcmltYXJ5IGkycyB0eCA9IDEgKi8KKwkJCQkvKiBQQ00gdHggPSAzICovCisJCQkJLyogU2Vjb25kYXJ5IGkycyB0eCA9IDUgKi8KKwkJCQkvKiBNaTJzIHR4ID0gNyAqLworCQkJCS8qIERpZ2l0YWwgbWljIHR4ID0gMTEgKi8KKwl1MTYgdHhfcG9ydF9pZDsJCS8qIFByaW1hcnkgaTJzIHJ4ID0gMCAqLworCQkJCS8qIFBDTSByeCA9IDIgKi8KKwkJCQkvKiBTZWNvbmRhcnkgaTJzIHJ4ID0gNCAqLworCQkJCS8qIE1pMlMgcnggPSA2ICovCisJCQkJLyogSERNSSByeCA9IDggKi8KKwl1MTYgZ2FpbjsJCS8qIFExMyAqLworCXUxNiBlbmFibGU7CQkvKiAxID0gZW5hYmxlLCAwID0gZGlzYWJsZSAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9DTURfTE9PUEJBQ0sgMHgwMDAxMDBjZQorc3RydWN0IGFmZV9sb29wYmFja19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHR4X3BvcnRfaWQ7CQkvKiBQcmltYXJ5IGkycyByeCA9IDAgKi8KKwkJCQkvKiBQQ00gcnggPSAyICovCisJCQkJLyogU2Vjb25kYXJ5IGkycyByeCA9IDQgKi8KKwkJCQkvKiBNaTJTIHJ4ID0gNiAqLworCQkJCS8qIEhETUkgcnggPSA4ICovCisJdTE2IHJ4X3BvcnRfaWQ7CQkvKiBQcmltYXJ5IGkycyB0eCA9IDEgKi8KKwkJCQkvKiBQQ00gdHggPSAzICovCisJCQkJLyogU2Vjb25kYXJ5IGkycyB0eCA9IDUgKi8KKwkJCQkvKiBNaTJzIHR4ID0gNyAqLworCQkJCS8qIERpZ2l0YWwgbWljIHR4ID0gMTEgKi8KKwl1MTYgbW9kZTsJCS8qIERlZmF1bHQgLTEsIERTUCB3aWxsIGNvbnZlcgorCQkJCSAqIHRoZSB0eCB0byByeCBmb3JtYXQKKwkJCQkgKi8KKwl1MTYgZW5hYmxlOwkJLyogMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BTRVVET1BPUlRfQ01EX1NUQVJUIDB4MDAwMTAwY2YKK3N0cnVjdCBhZmVfcHNldWRvcG9ydF9zdGFydF9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHBvcnRfaWQ7CQkvKiBQc2V1ZG8gUG9ydCAxID0gMHg4MDAwICovCisJCQkJLyogUHNldWRvIFBvcnQgMiA9IDB4ODAwMSAqLworCQkJCS8qIFBzZXVkbyBQb3J0IDMgPSAweDgwMDIgKi8KKwl1MTYgdGltaW5nOwkJLyogRlRSVCA9IDAgLCBBVlRpbWVyID0gMSwgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1BTRVVET1BPUlRfQ01EX1NUT1AgMHgwMDAxMDBkMAorc3RydWN0IGFmZV9wc2V1ZG9wb3J0X3N0b3BfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOwkJLyogUHNldWRvIFBvcnQgMSA9IDB4ODAwMCAqLworCQkJCS8qIFBzZXVkbyBQb3J0IDIgPSAweDgwMDEgKi8KKwkJCQkvKiBQc2V1ZG8gUG9ydCAzID0gMHg4MDAyICovCisJdTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfQ01EX0dFVF9BQ1RJVkVfUE9SVFMgMHgwMDAxMDBkMQorCisKKyNkZWZpbmUgQUZFX0NNRF9HRVRfQUNUSVZFX0hBTkRMRVNfRk9SX1BPUlQgMHgwMDAxMDBkMgorc3RydWN0IGFmZV9nZXRfYWN0aXZlX2hhbmRsZXNfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBPcGNvZGUgZm9yIEFGRSB0byBzdGFydCBEVE1GLgorICovCisjZGVmaW5lIEFGRV9QT1JUU19DTURfRFRNRl9DVEwJMHgwMDAxMDEwMgorCisvKiogRFRNRiBwYXlsb2FkLiovCitzdHJ1Y3QgYWZlX2R0bWZfZ2VuZXJhdGlvbl9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisKKwkvKgorCSAqIER1cmF0aW9uIG9mIHRoZSBEVE1GIHRvbmUgaW4gbXMuCisJICogLTEgICAgICAtPiBjb250aW51b3VzLAorCSAqICAwICAgICAgLT4gZGlzYWJsZQorCSAqLworCWludDY0X3QgICAgICAgICAgICAgICAgICAgZHVyYXRpb25faW5fbXM7CisKKwkvKgorCSAqIFRoZSBEVE1GIGhpZ2ggdG9uZSBmcmVxdWVuY3kuCisJICovCisJdWludDE2X3QgICAgICAgICAgICAgICAgICBoaWdoX2ZyZXE7CisKKwkvKgorCSAqIFRoZSBEVE1GIGxvdyB0b25lIGZyZXF1ZW5jeS4KKwkgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGxvd19mcmVxOworCisJLyoKKwkgKiBUaGUgRFRNRiB2b2x1bWUgc2V0dGluZworCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZ2FpbjsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBwb3J0cyB0byBlbmFibGUvZGlzYWJsZSBvbi4KKwkgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG51bV9wb3J0czsKKworCS8qCisJICogVGhlIERlc3RpbmF0aW9uIHBvcnRzIC0gYXJyYXkgIC4KKwkgKiBGb3IgRFRNRiBvbiBtdWx0aXBsZSBwb3J0cywgcG9ydElkcyBuZWVkcyB0bworCSAqIGJlIHBvcHVsYXRlZCBudW1Qb3J0cyB0aW1lcy4KKwkgKi8KKwl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBvcnRfaWRzOworCisJLyoKKwkgKiB2YXJpYWJsZSBmb3IgMzIgYml0IGFsaWdubWVudCBvZiBBUFIgcGFja2V0LgorCSAqLworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX01PREVfUENNCQkJMHgwCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX01PREVfQVVYCQkJMHgxCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX1NZTkNfRVhUCQkJMHgwCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX1NZTkNfSU5UCQkJMHgxCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX0ZSTV84QlBGCQkJMHgwCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX0ZSTV8xNkJQRgkJCTB4MQorI2RlZmluZSBBRkVfUENNX0NGR19GUk1fMzJCUEYJCQkweDIKKyNkZWZpbmUgQUZFX1BDTV9DRkdfRlJNXzY0QlBGCQkJMHgzCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX0ZSTV8xMjhCUEYJCQkweDQKKyNkZWZpbmUgQUZFX1BDTV9DRkdfRlJNXzI1NkJQRgkJCTB4NQorI2RlZmluZSBBRkVfUENNX0NGR19RVUFOVF9BTEFXX05PUEFECQkweDAKKyNkZWZpbmUgQUZFX1BDTV9DRkdfUVVBTlRfTVVMQVdfTk9QQUQJCTB4MQorI2RlZmluZSBBRkVfUENNX0NGR19RVUFOVF9MSU5FQVJfTk9QQUQJCTB4MgorI2RlZmluZSBBRkVfUENNX0NGR19RVUFOVF9BTEFXX1BBRAkJMHgzCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX1FVQU5UX01VTEFXX1BBRAkJMHg0CisjZGVmaW5lIEFGRV9QQ01fQ0ZHX1FVQU5UX0xJTkVBUl9QQUQJCTB4NQorI2RlZmluZSBBRkVfUENNX0NGR19DREFUQU9FX01BU1RFUgkJMHgwCisjZGVmaW5lIEFGRV9QQ01fQ0ZHX0NEQVRBT0VfU0hBUkUJCTB4MQorCitzdHJ1Y3QgYWZlX3BvcnRfcGNtX2NmZyB7CisJdTE2CW1vZGU7CS8qIFBDTSAoc2hvcnQgc3luYykgPSAwLCBBVVhQQ00gKGxvbmcgc3luYykgPSAxICovCisJdTE2CXN5bmM7CS8qIGV4dGVybmFsID0gMCAsIGludGVybmFsID0gMSAqLworCXUxNglmcmFtZTsJLyogOCBicGYgPSAwICovCisJCQkvKiAxNiBicGYgPSAxICovCisJCQkvKiAzMiBicGYgPSAyICovCisJCQkvKiA2NCBicGYgPSAzICovCisJCQkvKiAxMjggYnBmID0gNCAqLworCQkJLyogMjU2IGJwZiA9IDUgKi8KKwl1MTYgICAgIHF1YW50OworCXUxNglzbG90OwkvKiBTbG90IGZvciBQQ00gc3RyZWFtICwgMCAtIDMxICovCisJdTE2CWRhdGE7CS8qIDAsIFBDTSBibG9jayBpcyB0aGUgb25seSBtYXN0ZXIgKi8KKwkJCS8qIDEsIFBDTSBibG9jayBpcyBzaGFyZXMgdG8gZHJpdmVyIGRhdGEgb3V0IHNpZ25hbCAqLworCQkJLyogICAgb3RoZXIgbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTE2CXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworZW51bSB7CisJQUZFX0kyU19TRDAgPSAxLAorCUFGRV9JMlNfU0QxLAorCUFGRV9JMlNfU0QyLAorCUFGRV9JMlNfU0QzLAorCUFGRV9JMlNfUVVBRDAxLAorCUFGRV9JMlNfUVVBRDIzLAorCUFGRV9JMlNfNkNIUywKKwlBRkVfSTJTXzhDSFMsCit9OworCisjZGVmaW5lIEFGRV9NSTJTX01PTk8gMAorI2RlZmluZSBBRkVfTUkyU19TVEVSRU8gMworI2RlZmluZSBBRkVfTUkyU180Q0hBTk5FTFMgNAorI2RlZmluZSBBRkVfTUkyU182Q0hBTk5FTFMgNgorI2RlZmluZSBBRkVfTUkyU184Q0hBTk5FTFMgOAorCitzdHJ1Y3QgYWZlX3BvcnRfbWkyc19jZmcgeworCXUxNgliaXR3aWR0aDsJLyogMTYsMjQsMzIgKi8KKwl1MTYJbGluZTsJCS8qIENhbGxlZCBDaGFubmVsTW9kZSBpbiBkb2N1bWVudGF0aW9uICovCisJCQkJLyogaTJzX3NkMCA9IDEgKi8KKwkJCQkvKiBpMnNfc2QxID0gMiAqLworCQkJCS8qIGkyc19zZDIgPSAzICovCisJCQkJLyogaTJzX3NkMyA9IDQgKi8KKwkJCQkvKiBpMnNfcXVhZDAxID0gNSAqLworCQkJCS8qIGkyc19xdWFkMjMgPSA2ICovCisJCQkJLyogaTJzXzZjaHMgPSA3ICovCisJCQkJLyogaTJzXzhjaHMgPSA4ICovCisJdTE2CWNoYW5uZWw7CS8qIENhbGxlZCBNb25vU3RlcmVvIGluIGRvY3VtZW50YXRpb24gKi8KKwkJCQkvKiBpMnMgbW9ubyA9IDAgKi8KKwkJCQkvKiBpMnMgbW9ubyByaWdodCA9IDEgKi8KKwkJCQkvKiBpMnMgbW9ubyBsZWZ0ID0gMiAqLworCQkJCS8qIGkycyBzdGVyZW8gPSAzICovCisJdTE2CXdzOwkJLyogMCwgd29yZCBzZWxlY3Qgc2lnbmFsIGZyb20gZXh0ZXJuYWwgc291cmNlICovCisJCQkJLyogMSwgd29yZCBzZWxlY3Qgc2lnbmFsIGZyb20gaW50ZXJuYWwgc291cmNlICovCisJdTE2CWZvcm1hdDsJLyogZG9uJ3QgdG91Y2ggdGhpcyBmaWVsZCBpZiBpdCBpcyBub3QgZm9yICovCisJCQkJLyogQUZFX1BPUlRfQ01EX0kyU19DT05GSUcgb3Bjb2RlICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3BvcnRfaGRtaV9jZmcgeworCXUxNgliaXR3aWR0aDsJLyogMTYsMjQsMzIgKi8KKwl1MTYJY2hhbm5lbF9tb2RlOwkvKiBIRE1JIFN0ZXJlbyA9IDAgKi8KKwkJCQkvKiBIRE1JXzNQb2ludDEgKDQtY2gpID0gMSAqLworCQkJCS8qIEhETUlfNVBvaW50MSAoNi1jaCkgPSAyICovCisJCQkJLyogSERNSV82UG9pbnQxICg4LWNoKSA9IDMgKi8KKwl1MTYJZGF0YV90eXBlOwkvKiBIRE1JX0xpbmVhciA9IDAgKi8KKwkJCQkvKiBIRE1JX25vbl9MaW5lYXIgPSAxICovCit9IF9fcGFja2VkOworCisKK3N0cnVjdCBhZmVfcG9ydF9oZG1pX211bHRpX2NoX2NmZyB7CisJdTE2CWRhdGFfdHlwZTsJCS8qIEhETUlfTGluZWFyID0gMCAqLworCQkJCQkvKiBIRE1JX25vbl9MaW5lYXIgPSAxICovCisJdTE2CWNoYW5uZWxfYWxsb2NhdGlvbjsJLyogVGhlIGRlZmF1bHQgaXMgMCAoU3RlcmVvKSAqLworCXUxNglyZXNlcnZlZDsJCS8qIG11c3QgYmUgc2V0IHRvIDAgKi8KK30gX19wYWNrZWQ7CisKKworLyogU2xpbWJ1cyBEZXZpY2UgSWRzICovCisjZGVmaW5lIEFGRV9TTElNQlVTX0RFVklDRV8xCQkweDAKKyNkZWZpbmUgQUZFX1NMSU1CVVNfREVWSUNFXzIJCTB4MQorI2RlZmluZSBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQJMTYKKworc3RydWN0IGFmZV9wb3J0X3NsaW1idXNfY2ZnIHsKKwl1MTYJc2xpbWJ1c19kZXZfaWQ7CQkvKiBTTElNQlVTIERldmljZSBpZC4qLworCisJdTE2CXNsYXZlX2Rldl9wZ2RfbGE7CS8qIFNsYXZlIHBvcnRlZCBnZW5lcmljIGRldmljZQorCQkJCQkgKiBsb2dpY2FsIGFkZHJlc3MuCisJCQkJCSAqLworCXUxNglzbGF2ZV9kZXZfaW50ZmRldl9sYTsJLyogU2xhdmUgaW50ZXJmYWNlIGRldmljZSBsb2dpY2FsCisJCQkJCSAqIGFkZHJlc3MuCisJCQkJCSAqLworCXUxNgliaXRfd2lkdGg7CQkvKiBiaXQgd2lkdGggb2YgdGhlIHNhbXBsZXMsIDE2LCAyNC4qLworCisJdTE2CWRhdGFfZm9ybWF0OwkJLyogZGF0YSBmb3JtYXQuKi8KKworCXUxNgludW1fY2hhbm5lbHM7CQkvKiBOdW1iZXIgb2YgY2hhbm5lbHMuKi8KKworCS8qIFNsYXZlIHBvcnQgbWFwcGluZyBmb3IgcmVzcGVjdGl2ZSBjaGFubmVscy4qLworCXUxNglzbGF2ZV9wb3J0X21hcHBpbmdbQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UXTsKKworCXUxNglyZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfcG9ydF9zbGltYnVzX3NjaF9jZmcgeworCXUxNglzbGltYnVzX2Rldl9pZDsJCS8qIFNMSU1CVVMgRGV2aWNlIGlkLiovCisJdTE2CWJpdF93aWR0aDsJCS8qIGJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlcywgMTYsIDI0LiovCisJdTE2CWRhdGFfZm9ybWF0OwkJLyogZGF0YSBmb3JtYXQuKi8KKwl1MTYJbnVtX2NoYW5uZWxzOwkJLyogTnVtYmVyIG9mIGNoYW5uZWxzLiovCisJdTE2CXJlc2VydmVkOworCS8qIFNsYXZlIGNoYW5uZWwgIG1hcHBpbmcgZm9yIHJlc3BlY3RpdmUgY2hhbm5lbHMuKi8KKwl1OAlzbGF2ZV9jaF9tYXBwaW5nWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wb3J0X3J0cHJveHlfY2ZnIHsKKwl1MTYJYml0d2lkdGg7CS8qIDE2LDI0LDMyICovCisJdTE2CWludGVybGVhdmVkOyAgICAvKiBpbnRlcmxlYXZlZCA9IDEgKi8KKwkJCQkvKiBOb25pbnRlcmxlYXZlZCA9IDAgKi8KKwl1MTYJZnJhbWVfc3o7CS8qIDVtcyBidWZmZXJzID0gMTYwYnl0ZXMgKi8KKwl1MTYJaml0dGVyOwkJLyogMTBtcyBvZiBqaXR0ZXIgPSAzMjAgKi8KKwl1MTYJbHdfbWFyazsJLyogTG93IHdhdGVybWFyayBpbiBieXRlcyBmb3IgdHJpZ2dlcmluZyBldmVudCovCisJdTE2CWh3X21hcms7CS8qIEhpZ2ggd2F0ZXJtYXJrIGJ5dGVzIGZvciB0cmlnZ2VyaW5nIGV2ZW50Ki8KKwl1MTYJcnN2ZDsKKwlpbnQJbnVtX2NoOwkJLyogMSB0byA4ICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3BvcnRfcHNldWRvX2NmZyB7CisJdTE2IGJpdF93aWR0aDsKKwl1MTYgbnVtX2NoYW5uZWxzOworCXUxNiBkYXRhX2Zvcm1hdDsKKwl1MTYgdGltaW5nX21vZGU7CisJdTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9BVURJT19JRl9DT05GSUcgMHgwMDAxMDBkMworI2RlZmluZSBBRkVfUE9SVF9BVURJT19TTElNX1NDSF9DT05GSUcgMHgwMDAxMDBlNAorI2RlZmluZSBBRkVfUE9SVF9NVUxUSV9DSEFOX0hETUlfQVVESU9fSUZfQ09ORklHCTB4MDAwMTAwRDkKKyNkZWZpbmUgQUZFX1BPUlRfQ01EX0kyU19DT05GSUcJMHgwMDAxMDBFNworCit1bmlvbiBhZmVfcG9ydF9jb25maWcgeworCXN0cnVjdCBhZmVfcG9ydF9wY21fY2ZnICAgICAgICAgICBwY207CisJc3RydWN0IGFmZV9wb3J0X21pMnNfY2ZnICAgICAgICAgIG1pMnM7CisJc3RydWN0IGFmZV9wb3J0X2hkbWlfY2ZnICAgICAgICAgIGhkbWk7CisJc3RydWN0IGFmZV9wb3J0X2hkbWlfbXVsdGlfY2hfY2ZnIGhkbWlfbXVsdGlfY2g7CisJc3RydWN0IGFmZV9wb3J0X3NsaW1idXNfY2ZnCSAgc2xpbWJ1czsKKwlzdHJ1Y3QgYWZlX3BvcnRfc2xpbWJ1c19zY2hfY2ZnCSAgc2xpbV9zY2g7CisJc3RydWN0IGFmZV9wb3J0X3J0cHJveHlfY2ZnICAgICAgIHJ0cHJveHk7CisJc3RydWN0IGFmZV9wb3J0X3BzZXVkb19jZmcgICAgICAgIHBzZXVkbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXVuaW9uIGFmZV9wb3J0X2NvbmZpZyBwb3J0OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfVEVTVF9DT0RFQ19MT09QQkFDS19DVEwgMHgwMDAxMDBkNQorc3RydWN0IGFmZV9jb2RlY19sb29wYmFja19jb21tYW5kIHsKKwl1MTYJcG9ydF9pbmY7CS8qIFByaW1hcnkgaTJzID0gMCAqLworCQkJCS8qIFBDTSA9IDIgKi8KKwkJCQkvKiBTZWNvbmRhcnkgaTJzID0gNCAqLworCQkJCS8qIE1pMnMgPSA2ICovCisJdTE2CWVuYWJsZTsJCS8qIDAsIGRpc2FibGUuIDEsIGVuYWJsZSAqLworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9TSURFVE9ORV9HQUlOCTB4MDAwMTAzMDAKK3N0cnVjdCBhZmVfcGFyYW1fc2lkZXRvbmVfZ2FpbiB7CisJdTE2IGdhaW47CisJdTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUEFSQU1fSURfU0FNUExJTkdfUkFURQkweDAwMDEwMzAxCitzdHJ1Y3QgYWZlX3BhcmFtX3NhbXBsaW5nX3JhdGUgeworCXUzMiBzYW1wbGluZ19yYXRlOworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9DSEFOTkVMUwkJMHgwMDAxMDMwMgorc3RydWN0IGFmZV9wYXJhbV9jaGFubmVscyB7CisJdTE2IGNoYW5uZWxzOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfR0FJTgkweDAwMDEwMzAzCitzdHJ1Y3QgYWZlX3BhcmFtX2xvb3BiYWNrX2dhaW4geworCXUxNiBnYWluOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qIFBhcmFtZXRlciBJRCB1c2VkIHRvIGNvbmZpZ3VyZSBhbmQgZW5hYmxlL2Rpc2FibGUgdGhlIGxvb3BiYWNrIHBhdGguIFRoZQorICogZGlmZmVyZW5jZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGV4aXN0aW5nIEFQSSwgQUZFX1BPUlRfQ01EX0xPT1BCQUNLLCBpcyB0aGF0CisgKiBpdCBhbGxvd3MgUnggcG9ydCB0byBiZSBjb25maWd1cmVkIGFzIHNvdXJjZSBwb3J0IGluIGxvb3BiYWNrIHBhdGguIFBvcnQtaWQKKyAqIGluIEFGRV9QT1JUX0NNRF9TRVRfUEFSQU0gY21kIGlzIHRoZSBzb3VyY2UgcG9ydCB3aGljaCBjYW4gYmUgVHggb3IgUnggcG9ydC4KKyAqIEluIGFkZGl0aW9uLCB3ZSBjYW4gY29uZmlndXJlIHRoZSB0eXBlIG9mIHJvdXRpbmcgbW9kZSB0byBoYW5kbGUgZGlmZmVyZW50CisgKiB1c2UgY2FzZXMuCisgKi8KK2VudW0geworCS8qIFJlZ3VsYXIgbG9vcGJhY2sgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gcG9ydCAqLworCUxCX01PREVfREVGQVVMVCA9IDEsCisJLyogU2lkZXRvbmUgZmVlZCBmcm9tIFR4IHNvdXJjZSB0byBSeCBkZXN0aW5hdGlvbiBwb3J0ICovCisJTEJfTU9ERV9TSURFVE9ORSwKKwkvKiBFY2hvIGNhbmNlbGxlciByZWZlcmVuY2UsIHZvaWNlICsgYXVkaW8gKyBEVE1GICovCisJTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQVVESU8sCisJLyogRWNobyBjYW5jZWxsZXIgcmVmZXJlbmNlLCB2b2ljZSBhbG9uZSAqLworCUxCX01PREVfRUNfUkVGX1ZPSUNFCit9OworCisjZGVmaW5lIEFGRV9QQVJBTV9JRF9MT09QQkFDS19DT05GSUcgMHgwMDAxMDIwQgorI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fTE9PUEJBQ0tfQ09ORklHIDB4MQorc3RydWN0IGFmZV9wYXJhbV9sb29wYmFja19jZmcgeworCS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24KKwkgKiBpbnRlcmZhY2UuCisJICovCisJdWludDMyX3QgbG9vcGJhY2tfY2ZnX21pbm9yX3ZlcnNpb247CisKKwkvKiBEZXN0aW5hdGlvbiBQb3J0IElkLiAqLworCXVpbnQxNl90IGRzdF9wb3J0X2lkOworCisJLyogU3BlY2lmaWVzIGRhdGEgcGF0aCB0eXBlIGZyb20gc3JjIHRvIGRlc3QgcG9ydC4gU3VwcG9ydGVkIHZhbHVlczoKKwkgKiBMQl9NT0RFX0RFRkFVTFQKKwkgKiBMQl9NT0RFX1NJREVUT05FCisJICogTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQVVESU8KKwkgKiBMQl9NT0RFX0VDX1JFRl9WT0lDRQorCSAqLworCXVpbnQxNl90IHJvdXRpbmdfbW9kZTsKKworCS8qIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSAoMSkgb3IgZGlzYWJsZSAoMCkgYW4gQUZFIGxvb3BiYWNrLiAqLworCXVpbnQxNl90IGVuYWJsZTsKKworCS8qIFJlc2VydmVkIGZvciAzMi1iaXQgYWxpZ25tZW50LiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIDAuICovCisJdWludDE2X3QgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9NT0RVTEVfSURfUE9SVF9JTkZPCQkweDAwMDEwMjAwCisvKiBNb2R1bGUgSUQgZm9yIHRoZSBsb29wYmFjay1yZWxhdGVkIHBhcmFtZXRlcnMuICovCisjZGVmaW5lIEFGRV9NT0RVTEVfTE9PUEJBQ0sgICAgICAgICAgIDB4MDAwMTAyMDUKK3N0cnVjdCBhZmVfcGFyYW1fcGF5bG9hZF9iYXNlIHsKKwl1MzIgbW9kdWxlX2lkOworCXUzMiBwYXJhbV9pZDsKKwl1MTYgcGFyYW1fc2l6ZTsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWZlX3BhcmFtX3BheWxvYWQgeworCXN0cnVjdCBhZmVfcGFyYW1fcGF5bG9hZF9iYXNlIGJhc2U7CisJdW5pb24geworCQlzdHJ1Y3QgYWZlX3BhcmFtX3NpZGV0b25lX2dhaW4gc2lkZXRvbmVfZ2FpbjsKKwkJc3RydWN0IGFmZV9wYXJhbV9zYW1wbGluZ19yYXRlIHNhbXBsaW5nX3JhdGU7CisJCXN0cnVjdCBhZmVfcGFyYW1fY2hhbm5lbHMgICAgICBjaGFubmVsczsKKwkJc3RydWN0IGFmZV9wYXJhbV9sb29wYmFja19nYWluIGxvb3BiYWNrX2dhaW47CisJCXN0cnVjdCBhZmVfcGFyYW1fbG9vcGJhY2tfY2ZnIGxvb3BiYWNrX2NmZzsKKwl9IF9fcGFja2VkIHBhcmFtOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNCQkweDAwMDEwMGRjCisKK3N0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IHBvcnRfaWQ7CisJdTE2IHBheWxvYWRfc2l6ZTsKKwl1MzIgcGF5bG9hZF9hZGRyZXNzOworCXN0cnVjdCBhZmVfcGFyYW1fcGF5bG9hZCBwYXlsb2FkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fbm9fcGF5bG9hZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXUxNiBwYXlsb2FkX3NpemU7CisJdTMyIHBheWxvYWRfYWRkcmVzczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX0VWRU5UX0dFVF9BQ1RJVkVfUE9SVFMgMHgwMDAxMDEwMAorc3RydWN0IGFmZV9nZXRfYWN0aXZlX3BvcnRzX3JzcCB7CisJdTE2CW51bV9wb3J0czsKKwl1MTYJcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBBRkVfRVZFTlRfR0VUX0FDVElWRV9IQU5ETEVTIDB4MDAwMTAxMDIKK3N0cnVjdCBhZmVfZ2V0X2FjdGl2ZV9oYW5kbGVzX3JzcCB7CisJdTE2CXBvcnRfaWQ7CisJdTE2CW51bV9oYW5kbGVzOworCXUxNgltb2RlOwkJLyogMCwgdm9pY2UgcnggKi8KKwkJCQkvKiAxLCB2b2ljZSB0eCAqLworCQkJCS8qIDIsIGF1ZGlvIHJ4ICovCisJCQkJLyogMywgYXVkaW8gdHggKi8KKwl1MTYJaGFuZGxlOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfU0VSVklDRV9DTURfTUVNT1JZX01BUCAweDAwMDEwMERFCitzdHJ1Y3QgYWZlX2NtZF9tZW1vcnlfbWFwIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyIHBoeV9hZGRyOworCXUzMiBtZW1fc3o7CisJdTE2IG1lbV9pZDsKKwl1MTYgcnN2ZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX01FTU9SWV9VTk1BUCAweDAwMDEwMERGCitzdHJ1Y3QgYWZlX2NtZF9tZW1vcnlfdW5tYXAgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgcGh5X2FkZHI7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9SRUdfUlRQT1JUIDB4MDAwMTAwRTAKK3N0cnVjdCBhZmVfY21kX3JlZ19ydHBvcnQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgcG9ydF9pZDsKKwl1MTYgcnN2ZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX1VOUkVHX1JUUE9SVCAweDAwMDEwMEUxCitzdHJ1Y3QgYWZlX2NtZF91bnJlZ19ydHBvcnQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgcG9ydF9pZDsKKwl1MTYgcnN2ZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX1JUUE9SVF9XUiAweDAwMDEwMEUyCitzdHJ1Y3QgYWZlX2NtZF9ydHBvcnRfd3IgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgcG9ydF9pZDsKKwl1MTYgcnN2ZDsKKwl1MzIgYnVmX2FkZHI7CisJdTMyIGJ5dGVzX2F2YWlsOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRkVfU0VSVklDRV9DTURfUlRQT1JUX1JEIDB4MDAwMTAwRTMKK3N0cnVjdCBhZmVfY21kX3J0cG9ydF9yZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBwb3J0X2lkOworCXUxNiByc3ZkOworCXUzMiBidWZfYWRkcjsKKwl1MzIgYnl0ZXNfYXZhaWw7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFGRV9FVkVOVF9SVF9QUk9YWV9QT1JUX1NUQVRVUyAweDAwMDEwMTA1CisKKyNkZWZpbmUgQURNX01BWF9DT1BQUyA1CisKKyNkZWZpbmUgQURNX1NFUlZJQ0VfQ01EX0dFVF9DT1BQX0hBTkRMRVMgICAgICAgICAgICAgICAgIDB4MDAwMTAzMDAKK3N0cnVjdCBhZG1fZ2V0X2NvcHBfaGFuZGxlc19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFETV9DTURfTUFUUklYX01BUF9ST1VUSU5HUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzAxCitzdHJ1Y3QgYWRtX3JvdXRpbmdzX3Nlc3Npb24geworCXUxNiBpZDsKKwl1MTYgbnVtX2NvcHBzOworCXUxNiBjb3BwX2lkW0FETV9NQVhfQ09QUFMrMV07IC8qUGFkZGluZyBpZiBudW1Db3BwcyBpcyBvZGQgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZG1fcm91dGluZ3NfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiBwYXRoOyAvKiAwID0gUngsIDEgVHggKi8KKwl1MzIgbnVtX3Nlc3Npb25zOworCXN0cnVjdCBhZG1fcm91dGluZ3Nfc2Vzc2lvbiBzZXNzaW9uWzhdOworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFETV9DTURfTUFUUklYX1JBTVBfR0FJTlMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzAyCitzdHJ1Y3QgYWRtX3JhbXBfZ2FpbiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBzZXNzaW9uX2lkOworCXUxNiBjb3BwX2lkOworCXUxNiBpbml0aWFsX2dhaW47CisJdTE2IGdhaW5faW5jcmVtZW50OworCXUxNiByYW1wX2R1cmF0aW9uOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZG1fcmFtcF9nYWluc19jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyIGlkOworCXUzMiBudW1fZ2FpbnM7CisJc3RydWN0IGFkbV9yYW1wX2dhaW4gZ2FpbnNbQURNX01BWF9DT1BQU107Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMDQKK3N0cnVjdCBhZG1fY29wcF9vcGVuX2NvbW1hbmQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgZmxhZ3M7CisJdTE2IG1vZGU7IC8qIDEtUlgsIDItTGl2ZSBUWCwgMy1Ob24gTGl2ZSBUWCAqLworCXUxNiBlbmRwb2ludF9pZDE7CisJdTE2IGVuZHBvaW50X2lkMjsKKwl1MzIgdG9wb2xvZ3lfaWQ7CisJdTE2IGNoYW5uZWxfY29uZmlnOworCXUxNiByZXNlcnZlZDsKKwl1MzIgcmF0ZTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQURNX0NNRF9DT1BQX0NMT1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMDUKKworI2RlZmluZSBBRE1fQ01EX01VTFRJX0NIQU5ORUxfQ09QUF9PUEVOICAgICAgICAgICAgICAgICAgMHgwMDAxMDMxMAorI2RlZmluZSBBRE1fQ01EX01VTFRJX0NIQU5ORUxfQ09QUF9PUEVOX1YzICAgICAgICAgICAgICAgMHgwMDAxMDMzMworc3RydWN0IGFkbV9tdWx0aV9jaF9jb3BwX29wZW5fY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiBmbGFnczsKKwl1MTYgbW9kZTsgLyogMS1SWCwgMi1MaXZlIFRYLCAzLU5vbiBMaXZlIFRYICovCisJdTE2IGVuZHBvaW50X2lkMTsKKwl1MTYgZW5kcG9pbnRfaWQyOworCXUzMiB0b3BvbG9neV9pZDsKKwl1MTYgY2hhbm5lbF9jb25maWc7CisJdTE2IHJlc2VydmVkOworCXUzMiByYXRlOworCXU4IGRldl9jaGFubmVsX21hcHBpbmdbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWRtX211bHRpX2NoYW5uZWxfY29wcF9vcGVuX3YzIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2IGZsYWdzOworCXUxNiBtb2RlOworCXUxNiBlbmRwb2ludF9pZDE7CisJdTE2IGVuZHBvaW50X2lkMjsKKwl1MzIgdG9wb2xvZ3lfaWQ7CisJdTE2IGNoYW5uZWxfY29uZmlnOworCXUxNiBiaXRfd2lkdGg7CisJdTMyIHJhdGU7CisJdTggIGRldl9jaGFubmVsX21hcHBpbmdbOF07Cit9OworCisjZGVmaW5lIEFETV9DTURfTUVNT1JZX01BUAkJCQkweDAwMDEwQzMwCitzdHJ1Y3QgYWRtX2NtZF9tZW1vcnlfbWFwIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJdTMyCQlidWZfYWRkOworCXUzMgkJYnVmX3NpemU7CisJdTE2CQltZW1wb29sX2lkOworCXUxNgkJcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFETV9DTURfTUVNT1JZX1VOTUFQCQkJCTB4MDAwMTBDMzEKK3N0cnVjdCBhZG1fY21kX21lbW9yeV91bm1hcCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUzMgkJYnVmX2FkZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQURNX0NNRF9NRU1PUllfTUFQX1JFR0lPTlMJCQkweDAwMDEwQzQ3CitzdHJ1Y3QgYWRtX21lbW9yeV9tYXBfcmVnaW9ucyB7CisJdTMyCQlwaHlzOworCXUzMgkJYnVmX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYWRtX2NtZF9tZW1vcnlfbWFwX3JlZ2lvbnMgeworCXN0cnVjdCBhcHJfaGRyCWhkcjsKKwl1MTYJCW1lbXBvb2xfaWQ7CisJdTE2CQlucmVnaW9uczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQURNX0NNRF9NRU1PUllfVU5NQVBfUkVHSU9OUwkJCTB4MDAwMTBDNDgKK3N0cnVjdCBhZG1fbWVtb3J5X3VubWFwX3JlZ2lvbnMgeworCXUzMgkJcGh5czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhZG1fY21kX21lbW9yeV91bm1hcF9yZWdpb25zIHsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJdTE2CQlucmVnaW9uczsKKwl1MTYJCXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBERUZBVUxUX0NPUFBfVE9QT0xPR1kJCQkJMHgwMDAxMGJlMworI2RlZmluZSBERUZBVUxUX1BPUFBfVE9QT0xPR1kJCQkJMHgwMDAxMGJlNAorI2RlZmluZSBWUE1fVFhfU01fRUNOU19DT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEY3MQorI2RlZmluZSBWUE1fVFhfRE1fRkxVRU5DRV9DT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEY3MgorI2RlZmluZSBWUE1fVFhfUU1JQ19GTFVFTkNFX0NPUFBfVE9QT0xPR1kJCTB4MDAwMTBGNzUKKworI2RlZmluZSBMT1dMQVRFTkNZX1BPUFBfVE9QT0xPR1kJCQkweDAwMDEwQzY4CisjZGVmaW5lIExPV0xBVEVOQ1lfQ09QUF9UT1BPTE9HWQkJCTB4MDAwMTAzMTIKKyNkZWZpbmUgUENNX0JJVFNfUEVSX1NBTVBMRQkJCQkxNgorCisjZGVmaW5lIEFTTV9PUEVOX1dSSVRFX1BFUkZfTU9ERV9CSVQJCQkoMTw8MjgpCisjZGVmaW5lIEFTTV9PUEVOX1JFQURfUEVSRl9NT0RFX0JJVAkJCSgxPDwyOSkKKyNkZWZpbmUgQURNX01VTFRJX0NIX0NPUFBfT1BFTl9QRVJGX01PREVfQklUCQkoMTw8MTMpCisKKworI2RlZmluZSBBU01fTUFYX0VRX0JBTkRTIDEyCisKK3N0cnVjdCBhc21fZXFfYmFuZCB7CisJdTMyIGJhbmRfaWR4OyAvKiBUaGUgYmFuZCBpbmRleCwgMCAuLiAxMSAqLworCXUzMiBmaWx0ZXJfdHlwZTsgLyogRmlsdGVyIGJhbmQgdHlwZSAqLworCXUzMiBjZW50ZXJfZnJlcV9oejsgLyogRmlsdGVyIGJhbmQgY2VudGVyIGZyZXF1ZW5jeSAqLworCXUzMiBmaWx0ZXJfZ2FpbjsgLyogRmlsdGVyIGJhbmQgaW5pdGlhbCBnYWluIChkQikgKi8KKwkJCS8qIFJhbmdlIGlzICsxMiBkQiB0byAtMTIgZEIgd2l0aCAxZEIgaW5jcmVtZW50cy4gKi8KKwl1MzIgcV9mYWN0b3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX2VxdWFsaXplcl9wYXJhbXMgeworCXUzMiBlbmFibGU7CisJdTMyIG51bV9iYW5kczsKKwlzdHJ1Y3QgYXNtX2VxX2JhbmQgZXFfYmFuZHNbQVNNX01BWF9FUV9CQU5EU107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX21hc3Rlcl9nYWluX3BhcmFtcyB7CisJdTE2IG1hc3Rlcl9nYWluOworCXUxNiBwYWRkaW5nOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9scmNoYW5uZWxfZ2Fpbl9wYXJhbXMgeworCXUxNiBsZWZ0X2dhaW47CisJdTE2IHJpZ2h0X2dhaW47Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX211dGVfcGFyYW1zIHsKKwl1MzIgbXV0ZWZsYWc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zIHsKKwl1MzIgcGVyaW9kOworCXUzMiBzdGVwOworCXUzMiByYW1waW5nY3VydmU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgeworCXUzMiBlbmFibGU7CisJdTMyIHBlcmlvZDsKKwl1MzIgc3RlcDsKKwl1MzIgcmFtcGluZ2N1cnZlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9wcF9wYXJhbV9kYXRhX2hkciB7CisJdTMyIG1vZHVsZV9pZDsKKwl1MzIgcGFyYW1faWQ7CisJdTE2IHBhcmFtX3NpemU7CisJdTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9wcF9wYXJhbXNfY29tbWFuZCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUzMiAgICAqcGF5bG9hZDsKKwl1MzIJcGF5bG9hZF9zaXplOworCXN0cnVjdCAgYXNtX3BwX3BhcmFtX2RhdGFfaGRyIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRVFVQUxJWkVSX01PRFVMRV9JRAkJMHgwMDAxMGMyNworI2RlZmluZSBFUVVBTElaRVJfUEFSQU1fSUQJCTB4MDAwMTBjMjgKKworI2RlZmluZSBWT0xVTUVfQ09OVFJPTF9NT0RVTEVfSUQJMHgwMDAxMGJmZQorI2RlZmluZSBNQVNURVJfR0FJTl9QQVJBTV9JRAkJMHgwMDAxMGJmZgorI2RlZmluZSBMX1JfQ0hBTk5FTF9HQUlOX1BBUkFNX0lECTB4MDAwMTBjMDAKKyNkZWZpbmUgTVVURV9DT05GSUdfUEFSQU1fSUQgMHgwMDAxMGMwMQorI2RlZmluZSBTT0ZUX1BBVVNFX1BBUkFNX0lEIDB4MDAwMTBENkEKKyNkZWZpbmUgU09GVF9WT0xVTUVfUEFSQU1fSUQgMHgwMDAxMEMyOQorCisjZGVmaW5lIElJUl9GSUxURVJfRU5BQkxFX1BBUkFNX0lEIDB4MDAwMTBjMDMKKyNkZWZpbmUgSUlSX0ZJTFRFUl9QUkVHQUlOX1BBUkFNX0lEIDB4MDAwMTBjMDQKKyNkZWZpbmUgSUlSX0ZJTFRFUl9DT05GSUdfUEFSQU1fSUQgMHgwMDAxMGMwNQorCisjZGVmaW5lIE1CQURSQ19NT0RVTEVfSUQgMHgwMDAxMGMwNgorI2RlZmluZSBNQkFEUkNfRU5BQkxFX1BBUkFNX0lEIDB4MDAwMTBjMDcKKyNkZWZpbmUgTUJBRFJDX0NPTkZJR19QQVJBTV9JRCAweDAwMDEwYzA4CisKKworI2RlZmluZSBBRE1fQ01EX1NFVF9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwNgorI2RlZmluZSBBRE1fQ01EX0dFVF9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwQgorI2RlZmluZSBBRE1fQ01EUlNQX0dFVF9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwQworc3RydWN0IGFkbV9zZXRfcGFyYW1zX2NvbW1hbmQgeworCXN0cnVjdCBhcHJfaGRyCQloZHI7CisJdTMyCQkJcGF5bG9hZDsKKwl1MzIJCQlwYXlsb2FkX3NpemU7Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQURNX0NNRF9UQVBfQ09QUF9QQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMDcKK3N0cnVjdCBhZG1fdGFwX2NvcHBfcGNtX2NvbW1hbmQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKKworLyogUURTUDYgdG8gQ2xpZW50IG1lc3NhZ2VzICovCisjZGVmaW5lIEFETV9TRVJWSUNFX0NNRFJTUF9HRVRfQ09QUF9IQU5ETEVTICAgICAgICAgICAgICAweDAwMDEwMzA4CitzdHJ1Y3QgYWRtX2dldF9jb3BwX2hhbmRsZXNfcmVzcG9uZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiBoYW5kbGVzOworCXUzMiBjb3BwX2lkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBRE1fQ01EUlNQX0NPUFBfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwQQorc3RydWN0IGFkbV9jb3BwX29wZW5fcmVzcG9uZCB7CisJdTMyIHN0YXR1czsKKwl1MTYgY29wcF9pZDsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFETV9DTURSU1BfTVVMVElfQ0hBTk5FTF9DT1BQX09QRU4gICAgICAgICAgICAgICAweDAwMDEwMzExCisjZGVmaW5lIEFETV9DTURSU1BfTVVMVElfQ0hBTk5FTF9DT1BQX09QRU5fVjMgICAgICAgICAgICAweDAwMDEwMzM0CisKKworI2RlZmluZSBBU01fU1RSRUFNX1BSSU9SSVRZX05PUk1BTAkwCisjZGVmaW5lIEFTTV9TVFJFQU1fUFJJT1JJVFlfTE9XCQkxCisjZGVmaW5lIEFTTV9TVFJFQU1fUFJJT1JJVFlfSElHSAkyCisjZGVmaW5lIEFTTV9TVFJFQU1fUFJJT1JJVFlfUkVTRVJWRUQJMworCisjZGVmaW5lIEFTTV9FTkRfUE9JTlRfREVWSUNFX01BVFJJWAkwCisjZGVmaW5lIEFTTV9FTkRfUE9JTlRfU1RSRUFNCQkxCisKKyNkZWZpbmUgQUFDX0VOQ19NT0RFX0FBQ19MQyAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUFDX0VOQ19NT0RFX0FBQ19QICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQUFDX0VOQ19NT0RFX0VBQUNfUCAgICAgICAgICAgIDB4MUQKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9DTE9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJDRAorI2RlZmluZSBBU01fU1RSRUFNX0NNRF9GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJDRQorI2RlZmluZSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJDRgorI2RlZmluZSBBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEMAorI2RlZmluZSBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEMQorI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEMworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfR0VUX1NFU1NJT05fVElNRSAgICAgICAgICAgICAgICAgMHgwMDAxMEJENAorI2RlZmluZSBBU01fREFUQV9DTURfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEQgorI2RlZmluZSBBU01fREFUQV9FVkVOVF9FT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJERAorCisjZGVmaW5lIEFTTV9TRVJWSUNFX0NNRF9HRVRfU1RSRUFNX0hBTkRMRVMgICAgICAgICAgICAgICAweDAwMDEwQzBCCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX0ZMVVNIX1JFQURCVUZTICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzA5CisKKyNkZWZpbmUgQVNNX1NFU1NJT05fRVZFTlRfUlhfVU5ERVJGTE9XCQkJIDB4MDAwMTBDMTcKKyNkZWZpbmUgQVNNX1NFU1NJT05fRVZFTlRfVFhfT1ZFUkZMT1cJCQkgMHgwMDAxMEMxOAorI2RlZmluZSBBU01fU0VSVklDRV9DTURfR0VUX1dBTExDTE9DS19USU1FICAgICAgICAgICAgICAgMHgwMDAxMEMxOQorI2RlZmluZSBBU01fREFUQV9DTURSU1BfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMxQworCisvKiBBU00gRGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIGNvbW1vbiBkZWNsYXJhdGlvbnMgKi8KK3N0cnVjdCBhc21fcGNtX2NmZyB7CisJdTE2IGNoX2NmZzsKKwl1MTYgYml0c19wZXJfc2FtcGxlOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MTYgaXNfc2lnbmVkOworCXUxNiBpbnRlcmxlYXZlZDsKK307CisKKyNkZWZpbmUgUENNX0NIQU5ORUxfTlVMTCAwCisKKy8qIEZyb250IGxlZnQgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfRkwgICAgMQorCisvKiBGcm9udCByaWdodCBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9GUiAgICAyCisKKy8qIEZyb250IGNlbnRlciBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9GQyAgICAzCisKKy8qIExlZnQgc3Vycm91bmQgY2hhbm5lbC4qLworI2RlZmluZSBQQ01fQ0hBTk5FTF9MUyAgIDQKKworLyogUmlnaHQgc3Vycm91bmQgY2hhbm5lbC4qLworI2RlZmluZSBQQ01fQ0hBTk5FTF9SUyAgIDUKKworLyogTG93IGZyZXF1ZW5jeSBlZmZlY3QgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfTEZFICA2CisKKy8qIENlbnRlciBzdXJyb3VuZCBjaGFubmVsOyBSZWFyIGNlbnRlciBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9DUyAgIDcKKworLyogTGVmdCBiYWNrIGNoYW5uZWw7IFJlYXIgbGVmdCBjaGFubmVsLiAqLworI2RlZmluZSBQQ01fQ0hBTk5FTF9MQiAgIDgKKworLyogUmlnaHQgYmFjayBjaGFubmVsOyBSZWFyIHJpZ2h0IGNoYW5uZWwuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX1JCICAgOQorCisvKiBUb3Agc3Vycm91bmQgY2hhbm5lbC4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfVFMgICAxMAorCisvKiBDZW50ZXIgdmVydGljYWwgaGVpZ2h0IGNoYW5uZWwuKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfQ1ZIICAxMQorCisvKiBNb25vIHN1cnJvdW5kIGNoYW5uZWwuKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfTVMgICAxMgorCisvKiBGcm9udCBsZWZ0IG9mIGNlbnRlci4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfRkxDICAxMworCisvKiBGcm9udCByaWdodCBvZiBjZW50ZXIuICovCisjZGVmaW5lIFBDTV9DSEFOTkVMX0ZSQyAgMTQKKworLyogUmVhciBsZWZ0IG9mIGNlbnRlci4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfUkxDICAxNQorCisvKiBSZWFyIHJpZ2h0IG9mIGNlbnRlci4gKi8KKyNkZWZpbmUgUENNX0NIQU5ORUxfUlJDICAxNgorCisjZGVmaW5lIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMICA4CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZAorICogaW4gQVNNX0VOQ0RFQ19ERUNfQ0hBTl9NQVAgY29tbWFuZAorICovCisjZGVmaW5lIE1BWF9DSEFOX01BUF9DSEFOTkVMUyAxNgorLyoKKyAqICBNdWx0aXBsZS1jaGFubmVsIFBDTSBkZWNvZGVyIGZvcm1hdCBibG9jayBzdHJ1Y3R1cmUgdXNlZCBpbiB0aGUKKyAqICAjQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURSBjb21tYW5kLgorICogIFRoZSBkYXRhIG11c3QgYmUgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisgKi8KK3N0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2JsayB7CisKKwl1MTYgbnVtX2NoYW5uZWxzOwkvKgorCQkJCSAqIE51bWJlciBvZiBjaGFubmVscy4KKwkJCQkgKiBTdXBwb3J0ZWQgdmFsdWVzOjEgdG8gOAorCQkJCSAqLworCisJdTE2IGJpdHNfcGVyX3NhbXBsZTsJLyoKKwkJCQkgKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHBlciBjaGFubmVsLgorCQkJCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNCBXaGVuIHVzZWQgZm9yCisJCQkJICogcGxheWJhY2ssIHRoZSBjbGllbnQgbXVzdCBzZW5kIDI0LWJpdAorCQkJCSAqIHNhbXBsZXMgcGFja2VkIGluIDMyLWJpdCB3b3Jkcy4gVGhlCisJCQkJICogMjQtYml0IHNhbXBsZXMgbXVzdCBiZSBwbGFjZWQgaW4gdGhlIG1vc3QKKwkJCQkgKiBzaWduaWZpY2FudCAyNCBiaXRzIG9mIHRoZSAzMi1iaXQgd29yZC4gV2hlbgorCQkJCSAqIHVzZWQgZm9yIHJlY29yZGluZywgdGhlIGFEU1Agc2VuZHMgMjQtYml0CisJCQkJICogc2FtcGxlcyBwYWNrZWQgaW4gMzItYml0IHdvcmRzLiBUaGUgMjQtYml0CisJCQkJICogc2FtcGxlcyBhcmUgcGxhY2VkIGluIHRoZSBtb3N0IHNpZ25pZmljYW50CisJCQkJICogMjQgYml0cyBvZiB0aGUgMzItYml0IHdvcmQuCisJCQkJICovCisKKwl1MzIgc2FtcGxlX3JhdGU7CS8qCisJCQkJICogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZAorCQkJCSAqIChpbiBIZXJ0eikuIFN1cHBvcnRlZCB2YWx1ZXM6CisJCQkJICogMjAwMCB0byA0ODAwMAorCQkJCSAqLworCisJdTE2IGlzX3NpZ25lZDsJCS8qCisJCQkJICogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgc2FtcGxlcworCQkJCSAqIGFyZSBzaWduZWQgKDEpLgorCQkJCSAqLworCisJdTE2IGlzX2ludGVybGVhdmVkOwkvKgorCQkJCSAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhbm5lbHMgYXJlCisJCQkJICogZGUtaW50ZXJsZWF2ZWQgKDApIG9yIGludGVybGVhdmVkICgxKS4KKwkJCQkgKiBJbnRlcmxlYXZlZCBmb3JtYXQgbWVhbnMgY29ycmVzcG9uZGluZworCQkJCSAqIHNhbXBsZXMgZnJvbSB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgYXJlCisJCQkJICogaW50ZXJsZWF2ZWQgd2l0aGluIHRoZSBidWZmZXIuCisJCQkJICogRGUtaW50ZXJsZWF2ZWQgZm9ybWF0IG1lYW5zIHNhbXBsZXMgZnJvbQorCQkJCSAqIGVhY2ggY2hhbm5lbCBhcmUgY29udGlndW91cyBpbiB0aGUgYnVmZmVyLgorCQkJCSAqIFRoZSBzYW1wbGVzIGZyb20gb25lIGNoYW5uZWwgaW1tZWRpYXRlbHkKKwkJCQkgKiBmb2xsb3cgdGhvc2Ugb2YgdGhlIHByZXZpb3VzIGNoYW5uZWwuCisJCQkJICovCisKKwl1OCBjaGFubmVsX21hcHBpbmdbOF07CS8qCisJCQkJICogU3VwcG9ydGVkIHZhbHVlczoKKwkJCQkgKiBQQ01fQ0hBTk5FTF9OVUxMLCBQQ01fQ0hBTk5FTF9GTCwKKwkJCQkgKiBQQ01fQ0hBTk5FTF9GUiwgUENNX0NIQU5ORUxfRkMsCisJCQkJICogUENNX0NIQU5ORUxfTFMsIFBDTV9DSEFOTkVMX1JTLAorCQkJCSAqIFBDTV9DSEFOTkVMX0xGRSwgUENNX0NIQU5ORUxfQ1MsCisJCQkJICogUENNX0NIQU5ORUxfTEIsIFBDTV9DSEFOTkVMX1JCLAorCQkJCSAqIFBDTV9DSEFOTkVMX1RTLCBQQ01fQ0hBTk5FTF9DVkgsCisJCQkJICogUENNX0NIQU5ORUxfTVMsIFBDTV9DSEFOTkVMX0ZMQywKKwkJCQkgKiBQQ01fQ0hBTk5FTF9GUkMsIFBDTV9DSEFOTkVMX1JMQywKKwkJCQkgKiBQQ01fQ0hBTk5FTF9SUkMuCisJCQkJICogQ2hhbm5lbFtpXSBtYXBwaW5nIGRlc2NyaWJlcyBjaGFubmVsIEkuIEVhY2gKKwkJCQkgKiBlbGVtZW50IGkgb2YgdGhlIGFycmF5IGRlc2NyaWJlcyBjaGFubmVsIEkKKwkJCQkgKiBpbnNpZGUgdGhlIGJ1ZmZlciB3aGVyZSAgSSA8IG51bV9jaGFubmVscy4KKwkJCQkgKiBBbiB1bnVzZWQgY2hhbm5lbCBpcyBzZXQgdG8gemVyby4KKwkJCQkgKi8KK307CitzdHJ1Y3QgYXNtX2R0c19lbmNfY2ZnIHsKKwl1aW50MzJfdAlzYW1wbGVfcmF0ZTsKKwkvKgorCSAqIFNhbXBsZXMgYXQgd2hpY2ggaW5wdXQgaXMgdG8gYmUgZW5jb2RlZC4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIDQ0MTAwIC0tIGVuY29kZSBhdCA0NC4xIEtoegorCSAqIDQ4MDAwIC0tIGVuY29kZSBhdCA0OCBLaHoKKwkgKi8KKworCXVpbnQzMl90CW51bV9jaGFubmVsczsKKwkvKgorCSAqIE51bWJlciBvZiBjaGFubmVscyBmb3IgbXVsdGktY2hhbm5lbCBlbmNvZGluZy4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDYKKwkgKi8KKworCXVpbnQ4X3QJCWNoYW5uZWxfbWFwcGluZ1s2XTsKKwkvKgorCSAqIENoYW5uZWwgYXJyYXkgb2Ygc2l6ZSAxNi4gQ2hhbm5lbFtpXSBtYXBwaW5nIGRlc2NyaWJlcyBjaGFubmVsIEkuCisJICogRWFjaCBlbGVtZW50IGkgb2YgdGhlIGFycmF5IGRlc2NyaWJlcyBjaGFubmVsIEkgaW5zaWRlIHRoZSBidWZmZXIKKwkgKiB3aGVyZSBudW1fY2hhbm5lbHMuIEFuIHVudXNlZCBjaGFubmVsIGlzIHNldCB0byB6ZXJvLiBPbmx5IGZpcnN0CisJICogbnVtX2NoYW5uZWxzIGVsZW1lbnRzIGFyZSB2YWxpZAorCSAqCisJICogU3VwcG9ydGVkIHZhbHVlczoKKwkgKiAtICMgUENNX0NIQU5ORUxfTAorCSAqIC0gIyBQQ01fQ0hBTk5FTF9SCisJICogLSAjIFBDTV9DSEFOTkVMX0MKKwkgKiAtICMgUENNX0NIQU5ORUxfTFMKKwkgKiAtICMgUENNX0NIQU5ORUxfUlMKKwkgKiAtICMgUENNX0NIQU5ORUxfTEZFCisJICovCisKK307CitzdHJ1Y3QgYXNtX2FkcGNtX2NmZyB7CisJdTE2IGNoX2NmZzsKKwl1MTYgYml0c19wZXJfc2FtcGxlOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgYmxvY2tfc2l6ZTsKK307CisKK3N0cnVjdCBhc21feWFkcGNtX2NmZyB7CisJdTE2IGNoX2NmZzsKKwl1MTYgYml0c19wZXJfc2FtcGxlOworCXUzMiBzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBhc21fbWlkaV9jZmcgeworCXUzMiBuTW9kZTsKK307CisKK3N0cnVjdCBhc21fd21hX2NmZyB7CisJdTE2IGZvcm1hdF90YWc7CisJdTE2IGNoX2NmZzsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIGF2Z19ieXRlc19wZXJfc2VjOworCXUxNiBibG9ja19hbGlnbjsKKwl1MTYgdmFsaWRfYml0c19wZXJfc2FtcGxlOworCXUzMiBjaF9tYXNrOworCXUxNiBlbmNvZGVfb3B0OworCXUxNiBhZHZfZW5jb2RlX29wdDsKKwl1MzIgYWR2X2VuY29kZV9vcHQyOworCXUzMiBkcmNfcGVha19yZWY7CisJdTMyIGRyY19wZWFrX3RhcmdldDsKKwl1MzIgZHJjX2F2ZV9yZWY7CisJdTMyIGRyY19hdmVfdGFyZ2V0OworfTsKKworc3RydWN0IGFzbV93bWFwcm9fY2ZnIHsKKwl1MTYgZm9ybWF0X3RhZzsKKwl1MTYgY2hfY2ZnOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MzIgYXZnX2J5dGVzX3Blcl9zZWM7CisJdTE2IGJsb2NrX2FsaWduOworCXUxNiB2YWxpZF9iaXRzX3Blcl9zYW1wbGU7CisJdTMyIGNoX21hc2s7CisJdTE2IGVuY29kZV9vcHQ7CisJdTE2IGFkdl9lbmNvZGVfb3B0OworCXUzMiBhZHZfZW5jb2RlX29wdDI7CisJdTMyIGRyY19wZWFrX3JlZjsKKwl1MzIgZHJjX3BlYWtfdGFyZ2V0OworCXUzMiBkcmNfYXZlX3JlZjsKKwl1MzIgZHJjX2F2ZV90YXJnZXQ7Cit9OworCitzdHJ1Y3QgYXNtX2FhY19jZmcgeworCXUxNiBmb3JtYXQ7CisJdTE2IGFvdDsKKwl1MTYgZXBfY29uZmlnOworCXUxNiBzZWN0aW9uX2RhdGFfcmVzaWxpZW5jZTsKKwl1MTYgc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlOworCXUxNiBzcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2U7CisJdTE2IGNoX2NmZzsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIHNhbXBsZV9yYXRlOworfTsKKworc3RydWN0IGFzbV9hbXJ3YnBsdXNfY2ZnIHsKKwl1MzIgIHNpemVfYnl0ZXM7CisJdTMyICB2ZXJzaW9uOworCXUzMiAgbnVtX2NoYW5uZWxzOworCXUzMiAgYW1yX2JhbmRfbW9kZTsKKwl1MzIgIGFtcl9kdHhfbW9kZTsKKwl1MzIgIGFtcl9mcmFtZV9mbXQ7CisJdTMyICBhbXJfbHNmX2lkeDsKK307CisKK3N0cnVjdCBhc21fZmxhY19jZmcgeworCXUxNiBzdHJlYW1faW5mb19wcmVzZW50OworCXUxNiBtaW5fYmxrX3NpemU7CisJdTE2IG1heF9ibGtfc2l6ZTsKKwl1MTYgY2hfY2ZnOworCXUxNiBzYW1wbGVfc2l6ZTsKKwl1MTYgc2FtcGxlX3JhdGU7CisJdTE2IG1kNV9zdW07CisJdTMyIGV4dF9zYW1wbGVfcmF0ZTsKKwl1MzIgbWluX2ZyYW1lX3NpemU7CisJdTMyIG1heF9mcmFtZV9zaXplOworfTsKKworc3RydWN0IGFzbV92b3JiaXNfY2ZnIHsKKwl1MzIgY2hfY2ZnOworCXUzMiBiaXRfcmF0ZTsKKwl1MzIgbWluX2JpdF9yYXRlOworCXUzMiBtYXhfYml0X3JhdGU7CisJdTE2IGJpdF9kZXB0aF9wY21fc2FtcGxlOworCXUxNiBiaXRfc3RyZWFtX2Zvcm1hdDsKK307CisKK3N0cnVjdCBhc21fYWFjX3JlYWRfY2ZnIHsKKwl1MzIgYml0cmF0ZTsKKwl1MzIgZW5jX21vZGU7CisJdTE2IGZvcm1hdDsKKwl1MTYgY2hfY2ZnOworCXUzMiBzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBhc21fYW1ybmJfcmVhZF9jZmcgeworCXUxNiBtb2RlOworCXUxNiBkdHhfbW9kZTsKK307CisKK3N0cnVjdCBhc21fYW1yd2JfcmVhZF9jZmcgeworCXUxNiBtb2RlOworCXUxNiBkdHhfbW9kZTsKK307CisKK3N0cnVjdCBhc21fZXZyY19yZWFkX2NmZyB7CisJdTE2IG1heF9yYXRlOworCXUxNiBtaW5fcmF0ZTsKKwl1MTYgcmF0ZV9tb2R1bGF0aW9uX2NtZDsKKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgYXNtX3FjZWxwMTNfcmVhZF9jZmcgeworCXUxNiBtYXhfcmF0ZTsKKwl1MTYgbWluX3JhdGU7CisJdTE2IHJlZHVjZWRfcmF0ZV9sZXZlbDsKKwl1MTYgcmF0ZV9tb2R1bGF0aW9uX2NtZDsKK307CisKK3N0cnVjdCBhc21fc2JjX3JlYWRfY2ZnIHsKKwl1MzIgc3ViYmFuZDsKKwl1MzIgYmxvY2tfbGVuOworCXUzMiBjaF9tb2RlOworCXUzMiBhbGxvY19tZXRob2Q7CisJdTMyIGJpdF9yYXRlOworCXUzMiBzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBhc21fc2JjX2JpdHJhdGUgeworCXUzMiBiaXRyYXRlOworfTsKKworc3RydWN0IGFzbV9pbW1lZF9kZWNvZGUgeworCXUzMiBtb2RlOworfTsKKworc3RydWN0IGFzbV9zYnJfcHMgeworCXUzMiBlbmFibGU7Cit9OworCitzdHJ1Y3QgYXNtX2R1YWxfbW9ubyB7CisJdTE2IHNjZV9sZWZ0OworCXUxNiBzY2VfcmlnaHQ7Cit9OworCitzdHJ1Y3QgYXNtX2RlY19jaGFuX21hcCB7CisJdTMyIG51bV9jaGFubmVsczsJCQkgIC8qIE51bWJlciBvZiBkZWNvZGVyIG91dHB1dAorCQkJCQkJICAgKiBjaGFubmVscy4gQSB2YWx1ZSBvZiAwCisJCQkJCQkgICAqIGluZGljYXRlcyBuYXRpdmUgY2hhbm5lbAorCQkJCQkJICAgKiBtYXBwaW5nLCB3aGljaCBpcyB2YWxpZAorCQkJCQkJICAgKiBvbmx5IGZvciBOVCBtb2RlLiBUaGlzCisJCQkJCQkgICAqIG1lYW5zIHRoZSBvdXRwdXQgb2YgdGhlCisJCQkJCQkgICAqIGRlY29kZXIgaXMgdG8gYmUgcHJlc2VydmVkCisJCQkJCQkgICAqIGFzIGlzLgorCQkJCQkJICAgKi8KKworCXU4IGNoYW5uZWxfbWFwcGluZ1tNQVhfQ0hBTl9NQVBfQ0hBTk5FTFNdOy8qIENoYW5uZWwgYXJyYXkgb2Ygc2l6ZQorCQkJCQkJICAgKiBudW1fY2hhbm5lbHMuIEl0IGNhbiBncm93CisJCQkJCQkgICAqIHRpbGwgTUFYX0NIQU5fTUFQX0NIQU5ORUxTLgorCQkJCQkJICAgKiBDaGFubmVsW2ldIG1hcHBpbmcKKwkJCQkJCSAgICogZGVzY3JpYmVzIGNoYW5uZWwgSSBpbnNpZGUKKwkJCQkJCSAgICogdGhlIGRlY29kZXIgb3V0cHV0IGJ1ZmZlci4KKwkJCQkJCSAgICogVmFsaWQgY2hhbm5lbCBtYXBwaW5nCisJCQkJCQkgICAqIHZhbHVlcyBhcmUgdG8gYmUgcHJlc2VudCBhdAorCQkJCQkJICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4KKwkJCQkJCSAgICogQWxsIHJlbWFpbmluZyBlbGVtZW50cyBvZgorCQkJCQkJICAgKiB0aGUgYXJyYXkgYXJlIHRvIGJlIGZpbGxlZAorCQkJCQkJICAgKiB3aXRoIFBDTV9DSEFOTkVMX05VTEwuCisJCQkJCQkgICAqLworfTsKKworc3RydWN0IGFzbV9lbmNvZGVfY2ZnX2JsayB7CisJdTMyIGZyYW1lc19wZXJfYnVmOworCXUzMiBmb3JtYXRfaWQ7CisJdTMyIGNmZ19zaXplOworCXVuaW9uIHsKKwkJc3RydWN0IGFzbV9wY21fY2ZnICAgICAgICAgIHBjbTsKKwkJc3RydWN0IGFzbV9hYWNfcmVhZF9jZmcgICAgIGFhYzsKKwkJc3RydWN0IGFzbV9hbXJuYl9yZWFkX2NmZyAgIGFtcm5iOworCQlzdHJ1Y3QgYXNtX2V2cmNfcmVhZF9jZmcgICAgZXZyYzsKKwkJc3RydWN0IGFzbV9xY2VscDEzX3JlYWRfY2ZnIHFjZWxwMTM7CisJCXN0cnVjdCBhc21fc2JjX3JlYWRfY2ZnICAgICBzYmM7CisJCXN0cnVjdCBhc21fYW1yd2JfcmVhZF9jZmcgICBhbXJ3YjsKKwkJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrICAgICAgbXBjbTsKKwkJc3RydWN0IGFzbV9kdHNfZW5jX2NmZyAgICAgIGR0czsKKwl9IF9fcGFja2VkIGNmZzsKK307CisKK3N0cnVjdCBhc21fZnJhbWVfbWV0YV9pbmZvIHsKKwl1MzIgb2Zmc2V0X3RvX2ZyYW1lOworCXUzMiBmcmFtZV9zaXplOworCXUzMiBlbmNvZGVkX3BjbV9zYW1wbGVzOworCXUzMiBtc3dfdHM7CisJdTMyIGxzd190czsKKwl1MzIgbmZsYWdzOworfTsKKworLyogU3RyZWFtIGxldmVsIGNvbW1hbmRzICovCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkNCCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9WMl8xICAgICAgICAgICAgICAgICAgICAweDAwMDEwREIyCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgdU1vZGU7CisJdTMyICAgICAgICAgICAgc3JjX2VuZHBvaW50OworCXUzMiAgICAgICAgICAgIHByZV9wcm9jX3RvcDsKKwl1MzIgICAgICAgICAgICBmb3JtYXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkX3YyXzEgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICB1TW9kZTsKKwl1MzIgICAgICAgICAgICBzcmNfZW5kcG9pbnQ7CisJdTMyICAgICAgICAgICAgcHJlX3Byb2NfdG9wOworCXUzMiAgICAgICAgICAgIGZvcm1hdDsKKwl1MTYgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7CisJdTE2ICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBTdXBwb3J0ZWQgZm9ybWF0cyAqLworI2RlZmluZSBMSU5FQVJfUENNICAgMHgwMDAxMEJFNQorI2RlZmluZSBEVE1GICAgICAgICAgMHgwMDAxMEJFNgorI2RlZmluZSBBRFBDTSAgICAgICAgMHgwMDAxMEJFNworI2RlZmluZSBZQURQQ00gICAgICAgMHgwMDAxMEJFOAorI2RlZmluZSBNUDMgICAgICAgICAgMHgwMDAxMEJFOQorI2RlZmluZSBNUEVHNF9BQUMgICAgMHgwMDAxMEJFQQorI2RlZmluZSBBTVJOQl9GUyAgICAgMHgwMDAxMEJFQgorI2RlZmluZSBBTVJXQl9GUyAgICAgMHgwMDAxMEJFQworI2RlZmluZSBWMTNLX0ZTICAgICAgMHgwMDAxMEJFRAorI2RlZmluZSBFVlJDX0ZTICAgICAgMHgwMDAxMEJFRQorI2RlZmluZSBFVlJDQl9GUyAgICAgMHgwMDAxMEJFRgorI2RlZmluZSBFVlJDV0JfRlMgICAgMHgwMDAxMEJGMAorI2RlZmluZSBNSURJICAgICAgICAgMHgwMDAxMEJGMQorI2RlZmluZSBTQkMgICAgICAgICAgMHgwMDAxMEJGMgorI2RlZmluZSBXTUFfVjEwUFJPICAgMHgwMDAxMEJGMworI2RlZmluZSBXTUFfVjkgICAgICAgMHgwMDAxMEJGNAorI2RlZmluZSBBTVJfV0JfUExVUyAgMHgwMDAxMEJGNQorI2RlZmluZSBBQzNfREVDT0RFUiAgMHgwMDAxMEJGNgorI2RlZmluZSBFQUMzX0RFQ09ERVIgMHgwMDAxMEMzQworI2RlZmluZSBEVFMJMHgwMDAxMEQ4OAorI2RlZmluZSBEVFNfTEJSCTB4MDAwMTBEQkIKKyNkZWZpbmUgTVAyICAgICAgICAgIDB4MDAwMTBEQkUKKyNkZWZpbmUgQVRSQUMJMHgwMDAxMEQ4OQorI2RlZmluZSBNQVQJMHgwMDAxMEQ4QQorI2RlZmluZSBHNzExX0FMQVdfRlMgMHgwMDAxMEJGNworI2RlZmluZSBHNzExX01MQVdfRlMgMHgwMDAxMEJGOAorI2RlZmluZSBHNzExX1BDTV9GUyAgMHgwMDAxMEJGOQorI2RlZmluZSBNUEVHNF9NVUxUSV9BQUMgMHgwMDAxMEQ4NgorI2RlZmluZSBVU19QT0lOVF9FUE9TX0ZPUk1BVCAweDAwMDEyMzEwCisjZGVmaW5lIFVTX1JBV19GT1JNQVQgICAgICAgIDB4MDAwMTEyN0MKKyNkZWZpbmUgVVNfUFJPWF9GT1JNQVQgICAgICAgMHgwMDAxMjcyQgorI2RlZmluZSBNVUxUSV9DSEFOTkVMX1BDTSAgICAweDAwMDEwQzY2CisKKyNkZWZpbmUgQVNNX0VOQ0RFQ19TQkNSQVRFICAgICAgICAgMHgwMDAxMEMxMworI2RlZmluZSBBU01fRU5DREVDX0lNTURJQVRFX0RFQ09ERSAweDAwMDEwQzE0CisjZGVmaW5lIEFTTV9FTkNERUNfQ0ZHX0JMSyAgICAgICAgIDB4MDAwMTBDMkMKKworI2RlZmluZSBBU01fRU5DREVDX1NCQ1JBVEUgICAgICAgICAweDAwMDEwQzEzCisjZGVmaW5lIEFTTV9FTkNERUNfSU1NRElBVEVfREVDT0RFIDB4MDAwMTBDMTQKKyNkZWZpbmUgQVNNX0VOQ0RFQ19DRkdfQkxLICAgICAgICAgMHgwMDAxMEMyQworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9DT01QUkVTU0VEICAgICAgICAgICAgICAgMHgwMDAxMEQ5NQorc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZF9jb21wcmVzc2VkIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgdU1vZGU7CisJdTMyICAgICAgICAgICAgZnJhbWVfcGVyX2J1ZjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCQ0EKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMl8xICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEQjEKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgdU1vZGU7CisJdTE2ICAgICAgICAgICAgc2lua19lbmRwb2ludDsKKwl1MTYgICAgICAgICAgICBzdHJlYW1faGFuZGxlOworCXUzMiAgICAgICAgICAgIHBvc3RfcHJvY190b3A7CisJdTMyICAgICAgICAgICAgZm9ybWF0OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJRUNfNjE5MzdfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIElFQ182MDk1OF9NQVNLCTB4MDAwMDAwMDIKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQJMHgwMDAxMEQ4NAorc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fd3JpdGVfY29tcHJlc3NlZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMglmbGFnczsKKwl1MzIJZm9ybWF0OworfSBfX3BhY2tlZDsKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9UUkFOU0NPREVfTE9PUEJBQ0sgICAgIDB4MDAwMTBEQkEKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3RyYW5zY29kZV9sb29wYmFjayB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90CW1vZGVfZmxhZ3M7CisJLyoKKwkgKiBBbGwgYml0cyBhcmUgcmVzZXJ2ZWQuIENsaWVudHMgbXVzdCBzZXQgdGhlbSB0byB6ZXJvLgorCSAqLworCisJdWludDMyX3QJc3JjX2Zvcm1hdF9pZDsKKwkvKgorCSAqIFNwZWNpZmllcyB0aGUgbWVkaWEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhdWRpbyBzdHJlYW0uCisJICoKKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIC0gI0FTTV9NRURJQV9GTVRfTElORUFSX1BDTQorCSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ00KKwkgKi8KKworCXVpbnQzMl90CXNpbmtfZm9ybWF0X2lkOworCS8qCisJICogU3BlY2lmaWVzIHRoZSBtZWRpYSBmb3JtYXQgb2YgdGhlIG91dHB1dCBzdHJlYW0uCisJICoKKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIC0gI0FTTV9NRURJQV9GTVRfTElORUFSX1BDTQorCSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ00KKwkgKiAtICNBU01fTUVESUFfRk1UX0RUUworCSAqLworCisJdWludDMyX3QJYXVkcHJvY190b3BvX2lkOworCS8qCisJICogUG9zdHByb2Nlc3NpbmcgdG9wb2xvZ3kgSUQsIHdoaWNoIHNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mCisJICogcHJvY2Vzc2luZykgb2YgcG9zdHByb2Nlc3NpbmcgYWxnb3JpdGhtcy4KKwkgKgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0RFRkFVTFQKKwkgKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfUEVBS01FVEVSCisJICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX05PTkUKKwkgKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfTUNIX1BFQUtfVk9MCisJICovCisKKwl1aW50MTZfdAlzcmNfZW5kcG9pbnRfdHlwZTsKKwkvKgorCSAqIFNwZWNpZmllcyB0aGUgc291cmNlIGVuZHBvaW50IHRoYXQgcHJvdmlkZXMgdGhlIGlucHV0IHNhbXBsZXMuCisJICoKKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIC0gMCAtLSBUeCBkZXZpY2UgbWF0cml4IG9yIHN0cmVhbSByb3V0ZXIKKwkgKiAoZ2F0ZXdheSB0byB0aGUgaGFyZHdhcmUgcG9ydHMpCisJICogLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAorCSAqCisJICogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uIE90aGVyd2lzZSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisJICovCisKKwl1aW50MTZfdAlzaW5rX2VuZHBvaW50X3R5cGU7CisJLyoKKwkgKiBTcGVjaWZpZXMgdGhlIHNpbmsgZW5kcG9pbnQgdHlwZS4KKwkgKgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogLSAwIC0tIFJ4IGRldmljZSBtYXRyaXggb3Igc3RyZWFtIHJvdXRlcgorCSAqIChnYXRld2F5IHRvIHRoZSBoYXJkd2FyZSBwb3J0cykKKwkgKiAtIEFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkCisJICoKKwkgKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gT3RoZXJ3aXNlLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KKwkgKi8KKworCXVpbnQxNl90CWJpdHNfcGVyX3NhbXBsZTsKKwkvKgorCSAqIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcHJvY2Vzc2VkIGJ5IHRoZSBBU00gbW9kdWxlcy4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKKwkgKi8KKworCXVpbnQxNl90CXJlc2VydmVkOworCS8qCisJICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgorCSAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIElEIG9mIHRoZSBEVFMgbWl4IExGRSBjaGFubmVsIHRvIGZyb250IGNoYW5uZWxzIHBhcmFtZXRlciBpbiB0aGUKKyAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCisgKiBhc21fZHRzX2dlbmVyaWNfcGFyYW1fdAorICogQVNNX1BBUkFNX0lEX0RUU19NSVhfTEZFX1RPX0ZST05UCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0RUU19NSVhfTEZFX1RPX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwREI2CisKKy8qCisgKiBJRCBvZiB0aGUgRFRTIERSQyByYXRpbyBwYXJhbWV0ZXIgaW4gdGhlCisgKiAjQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kLgorICogYXNtX2R0c19nZW5lcmljX3BhcmFtX3QKKyAqIEFTTV9QQVJBTV9JRF9EVFNfRFJDX1JBVElPCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0RUU19EUkNfUkFUSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEQjcKKworLyoKKyAqIElEIG9mIHRoZSBEVFMgZW5hYmxlIGRpYWxvZyBub3JtYWxpemF0aW9uIHBhcmFtZXRlciBpbiB0aGUKKyAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCisgKgorICogYXNtX2R0c19nZW5lcmljX3BhcmFtX3QKKyAqIEFTTV9QQVJBTV9JRF9EVFNfRU5BQkxFX0RJQUxOT1JNCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0RUU19FTkFCTEVfRElBTE5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEQjgKKworLyoKKyAqIElEIG9mIHRoZSBEVFMgZW5hYmxlIHBhcnNlIFJFVjJBVVggcGFyYW1ldGVyIGluIHRoZQorICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KKyAqIGFzbV9kdHNfZ2VuZXJpY19wYXJhbV90CisgKiBBU01fUEFSQU1fSURfRFRTX0VOQUJMRV9QQVJTRV9SRVYyQVVYCisgKi8KKyNkZWZpbmUgQVNNX1BBUkFNX0lEX0RUU19FTkFCTEVfUEFSU0VfUkVWMkFVWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwREI5CisKK3N0cnVjdCBhc21fZHRzX2dlbmVyaWNfcGFyYW0geworCWludDMyX3QJCWdlbmVyaWNfcGFyYW1ldGVyOworCS8qCisJICogI0FTTV9QQVJBTV9JRF9EVFNfTUlYX0xGRV9UT19GUk9OVDoKKwkgKiAtIGlmIGVuYWJsZWQsIG1peGVzIExGRSBjaGFubmVsIHRvIGZyb250CisJICogd2hpbGUgZG93bm1peGluZyAoaWYgbmVjZXNzYXJ5KQorCSAqIC0gU3VwcG9ydGVkIHZhbHVlczogMS0+IGVuYWJsZSwgMC0+IGRpc2FibGUKKwkgKiAtIERlZmF1bHQ6IGRpc2FibGVkCisJICoKKwkgKiAjQVNNX1BBUkFNX0lEX0RUU19EUkNfUkFUSU86CisJICogLSBwZXJjZW50YWdlIG9mIERSQyByYXRpby4KKwkgKiAtIFN1cHBvcnRlZCB2YWx1ZXM6IDAtMTAwCisJICogLSBEZWZhdWx0OiAwLCBEUkMgaXMgZGlzYWJsZWQuCisJICoKKwkgKiAjQVNNX1BBUkFNX0lEX0RUU19FTkFCTEVfRElBTE5PUk06CisJICogLSBmbGFnIHRvIGVuYWJsZSBkaWFsb2cgbm9ybWFsaXphdGlvbiBwb3N0IHByb2Nlc3NpbmcuCisJICogLSBTdXBwb3J0ZWQgdmFsdWVzOiAxLT4gZW5hYmxlLCAwLT4gZGlzYWJsZS4KKwkgKiAtIERlZmF1bHQ6IGVuYWJsZWQuCisJICoKKwkgKiAjQVNNX1BBUkFNX0lEX0RUU19FTkFCTEVfUEFSU0VfUkVWMkFVWDoKKwkgKiAtIGZsYWcgdG8gZW5hYmxlIHBhcnNpbmcgb2YgcmV2MmF1eCBjaHVuayBpbiB0aGUgYml0c3RyZWFtLgorCSAqIFRoaXMgY2h1bmsgY29udGFpbnMgYnJvYWRjYXN0IG1ldGFkYXRhLgorCSAqIC0gU3VwcG9ydGVkIHZhbHVlczogMS0+IGVuYWJsZSwgMC0+IGRpc2FibGUuCisJICogLSBEZWZhdWx0OiBkaXNhYmxlZC4KKwkgKi8KK307CisKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9kdHNfZGVjX3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgcGFyYW1faWQ7CisJdTMyICAgICAgICAgICAgcGFyYW1fc2l6ZTsKKwlzdHJ1Y3QgYXNtX2R0c19nZW5lcmljX3BhcmFtIGdlbmVyaWNfcGFyYW07Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCQ0MKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZF93cml0ZSB7CisJc3RydWN0IGFwcl9oZHIgICAgIGhkcjsKKwl1MzIgICAgICAgICAgICAgICAgdU1vZGU7CisJdTMyICAgICAgICAgICAgICAgIHBvc3RfcHJvY190b3A7CisJdTMyICAgICAgICAgICAgICAgIHdyaXRlX2Zvcm1hdDsKKwl1MzIgICAgICAgICAgICAgICAgcmVhZF9mb3JtYXQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fTE9PUEJBQ0sJMHgwMDAxMEQ2RQorc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fbG9vcGJhY2sgeworCXN0cnVjdCBhcHJfaGRyICAgICAgICAgaGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKKy8qIE1vZGUgZmxhZ3MuCisgKiBCaXQgMC0zMTogcmVzZXJ2ZWQ7IGNsaWVudCBzaG91bGQgc2V0IHRoZXNlIGJpdHMgdG8gMAorICovCisJdTE2ICAgICAgICAgICAgICAgICAgICBzcmNfZW5kcG9pbnR5cGU7CisJLyogRW5kcG9pbnQgdHlwZS4gMCA9IFR4IE1hdHJpeCAqLworCXUxNiAgICAgICAgICAgICAgICAgICAgc2lua19lbmRwb2ludHlwZTsKKwkvKiBFbmRwb2ludCB0eXBlLiAwID0gUnggTWF0cml4ICovCisJdTMyICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY29wb19pZDsKKy8qIFBvc3Rwcm9jZXNzb3IgdG9wb2xvZ3kgSUQuIFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgb2YKKyAqIHBvc3Rwcm9jZXNzaW5nIGFsZ29yaXRobXMuCisgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQURNX0NNRF9DT05ORUNUX0FGRV9QT1JUIDB4MDAwMTAzMjAKKyNkZWZpbmUgQURNX0NNRF9ESVNDT05ORUNUX0FGRV9QT1JUIDB4MDAwMTAzMjEKKworc3RydWN0IGFkbV9jbWRfY29ubmVjdF9hZmVfcG9ydCB7CisJc3RydWN0IGFwcl9oZHIgICAgIGhkcjsKKwl1OAltb2RlOyAvKm1vZGUgcmVwcmVzZW50IHRoZSBpbnRlcmZhY2UgaXMgZm9yIFJYIG9yIFRYKi8KKwl1OAlzZXNzaW9uX2lkOyAvKkFTTSBzZXNzaW9uIElEKi8KKwl1MTYJYWZlX3BvcnRfaWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFETV9DTURfQ09OTkVDVF9BRkVfUE9SVF9WMiAweDAwMDEwMzMyCisKK3N0cnVjdCBhZG1fY21kX2Nvbm5lY3RfYWZlX3BvcnRfdjIgeworCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7CisJdTgJbW9kZTsgLyptb2RlIHJlcHJlc2VudCB0aGUgaW50ZXJmYWNlIGlzIGZvciBSWCBvciBUWCovCisJdTgJc2Vzc2lvbl9pZDsgLypBU00gc2Vzc2lvbiBJRCovCisJdTE2CWFmZV9wb3J0X2lkOworCXUzMgludW1fY2hhbm5lbHM7CisJdTMyCXNhbXBsaW5nX3JhdGU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gICAgICAgICAgICAgICAgICAweDAwMDEwQzEwCisjZGVmaW5lIEFTTV9TVFJFQU1fQ01EX0dFVF9FTkNERUNfUEFSQU0gICAgICAgICAgICAgICAgICAweDAwMDEwQzExCisjZGVmaW5lIEFTTV9FTkNERUNfQ0ZHX0JMS19JRAkJCQkgMHgwMDAxMEMyQworI2RlZmluZSBBU01fRU5BQkxFX1NCUl9QUwkJCQkgMHgwMDAxMEM2MworI2RlZmluZSBBU01fQ09ORklHVVJFX0RVQUxfTU9OTwkJCSAweDAwMDEwQzY0CitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NmZ19ibGsgeworCXN0cnVjdCBhcHJfaGRyICAgICAgICAgICAgICBoZHI7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2lkOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zaXplOworCXN0cnVjdCBhc21fZW5jb2RlX2NmZ19ibGsgICBlbmNfYmxrOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX2VuY2RlY19zYmNfYml0cmF0ZSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgIHBhcmFtX2lkOworCQlzdHJ1Y3QgYXNtX3NiY19iaXRyYXRlICAgICAgc2JjX2JpdHJhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZW5jZGVjX2ltbWVkX2RlY29kZSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgIHBhcmFtX2lkOworCXUzMiAgICAgICAgICAgIHBhcmFtX3NpemU7CisJc3RydWN0IGFzbV9pbW1lZF9kZWNvZGUgZGVjOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX2VuY2RlY19zYnIgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKKwl1MzIgICAgICAgICAgICBwYXJhbV9zaXplOworCXN0cnVjdCBhc21fc2JyX3BzIHNicl9wczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9lbmNkZWNfZHVhbG1vbm8geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKKwl1MzIgICAgICAgICAgICBwYXJhbV9zaXplOworCXN0cnVjdCBhc21fZHVhbF9tb25vIGNoYW5uZWxfbWFwOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fUEFSQU1fSURfQUFDX1NURVJFT19NSVhfQ09FRkZfU0VMRUNUSU9OX0ZMQUcgICAgICAgIDB4MDAwMTBERDgKKworLyogU3RydWN0dXJlIGZvciBBQUMgZGVjb2RlciBzdGVyZW8gY29lZmZpY2llbnQgc2V0dGluZy4gKi8KKworc3RydWN0IGFzbV9hYWNfc3RlcmVvX21peF9jb2VmZl9zZWxlY3Rpb25fcGFyYW0geworCXN0cnVjdCBhcHJfaGRyCQkJCWhkcjsKKwl1MzIJCQkJCXBhcmFtX2lkOworCXUzMgkJCQkJcGFyYW1fc2l6ZTsKKwl1MzIJCQkJCWFhY19zdGVyZW9fbWl4X2NvZWZmX2ZsYWc7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9FTkNERUNfREVDX0NIQU5fTUFQCQkJCSAweDAwMDEwRDgyCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NoYW5uZWxtYXAgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKKwl1MzIgICAgICAgICAgICBwYXJhbV9zaXplOworCXN0cnVjdCBhc21fZGVjX2NoYW5fbWFwIGNoYW5fbWFwOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU1RSRUFNX0NNRF9BREpVU1RfU0FNUExFUyAgICAgICAgICAgICAgICAgICAweDAwMDEwQzBBCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfYWRqdXN0X3NhbXBsZXMgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgICAgICAgICAgICBuc2FtcGxlczsKKwl1MTYgICAgICAgICAgICByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURfVEFQX1BPUFBfUENNICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRjkKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF90YXBfcG9wcF9wY20geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MTYgICAgICAgICAgICBlbmFibGU7CisJdTE2ICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJdTMyICAgICAgICAgICAgbW9kdWxlX2lkOworfSBfX3BhY2tlZDsKKworLyogIFNlc3Npb24gTGV2ZWwgY29tbWFuZHMgKi8KKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX01FTU9SWV9NQVAJCQkweDAwMDEwQzMyCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfbWVtb3J5X21hcCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUzMgkJYnVmX2FkZDsKKwl1MzIJCWJ1Zl9zaXplOworCXUxNgkJbWVtcG9vbF9pZDsKKwl1MTYJCXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfTUVNT1JZX1VOTUFQCQkJMHgwMDAxMEMzMworc3RydWN0IGFzbV9zdHJlYW1fY21kX21lbW9yeV91bm1hcCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUzMgkJYnVmX2FkZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX01FTU9SWV9NQVBfUkVHSU9OUwkJMHgwMDAxMEM0NQorc3RydWN0IGFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMgeworCXUzMgkJcGh5czsKKwl1MzIJCWJ1Zl9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGFzbV9zdHJlYW1fY21kX21lbW9yeV9tYXBfcmVnaW9ucyB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUxNgkJbWVtcG9vbF9pZDsKKwl1MTYJCW5yZWdpb25zOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfTUVNT1JZX1VOTUFQX1JFR0lPTlMJCTB4MDAwMTBDNDYKK3N0cnVjdCBhc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMgeworCXUzMgkJcGh5czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9tZW1vcnlfdW5tYXBfcmVnaW9ucyB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXUxNgkJbnJlZ2lvbnM7CisJdTE2CQlyZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDIKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9ydW4geworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1MzIgICAgICAgICAgICBmbGFnczsKKwl1MzIgICAgICAgICAgICBtc3dfdHM7CisJdTMyICAgICAgICAgICAgbHN3X3RzOworfSBfX3BhY2tlZDsKKworLyogU2Vzc2lvbiBsZXZlbCBldmVudHMgKi8KKyNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX0ZPUl9SWF9VTkRFUkZMT1dfRVZFTlRTIDB4MDAwMTBCRDUKK3N0cnVjdCBhc21fc3RyZWFtX2NtZF9yZWdfcnhfdW5kZXJmbG93X2V2ZW50IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTE2ICAgICAgICAgICAgZW5hYmxlOworCXUxNiAgICAgICAgICAgIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SX1RYX09WRVJGTE9XX0VWRU5UUyAgMHgwMDAxMEJENgorc3RydWN0IGFzbV9zdHJlYW1fY21kX3JlZ190eF9vdmVyZmxvd19ldmVudCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUxNiAgICAgICAgICAgIGVuYWJsZTsKKwl1MTYgICAgICAgICAgICByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qIERhdGEgUGF0aCBjb21tYW5kcyAqLworI2RlZmluZSBBU01fREFUQV9DTURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEOQorc3RydWN0IGFzbV9zdHJlYW1fY21kX3dyaXRlIHsKKwlzdHJ1Y3QgYXByX2hkciAgICAgaGRyOworCXUzMglidWZfYWRkOworCXUzMglhdmFpbF9ieXRlczsKKwl1MzIJdWlkOworCXUzMgltc3dfdHM7CisJdTMyCWxzd190czsKKwl1MzIJdWZsYWdzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fREFUQV9DTURfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJEQQorc3RydWN0IGFzbV9zdHJlYW1fY21kX3JlYWQgeworCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7CisJdTMyCWJ1Zl9hZGQ7CisJdTMyCWJ1Zl9zaXplOworCXUzMgl1aWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9EQVRBX0NNRF9SRUFEX0NPTVBSRVNTRUQgICAgICAgICAgICAgICAgICAgICAweDAwMDEwREJGCitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfcmVhZF9jb21wcmVzc2VkIHsKKwlzdHJ1Y3QgYXByX2hkciAgICAgaGRyOworCXUzMglidWZfYWRkOworCXUzMglidWZfc2l6ZTsKKwl1MzIJdWlkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fREFUQV9DTURfTUVESUFfRk9STUFUX1VQREFURSAgICAgICAgICAgICAgICAgMHgwMDAxMEJEQworI2RlZmluZSBBU01fREFUQV9FVkVOVF9FTkNfU1JfQ01fTk9USUZZICAgICAgICAgICAgICAgICAgMHgwMDAxMEJERQorc3RydWN0IGFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X3VwZGF0ZSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgIGZvcm1hdDsKKwl1MzIgICAgICAgICAgICBjZmdfc2l6ZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBhc21fcGNtX2NmZyAgICAgICAgIHBjbV9jZmc7CisJCXN0cnVjdCBhc21fYWRwY21fY2ZnICAgICAgIGFkcGNtX2NmZzsKKwkJc3RydWN0IGFzbV95YWRwY21fY2ZnICAgICAgeWFkcGNtX2NmZzsKKwkJc3RydWN0IGFzbV9taWRpX2NmZyAgICAgICAgbWlkaV9jZmc7CisJCXN0cnVjdCBhc21fd21hX2NmZyAgICAgICAgIHdtYV9jZmc7CisJCXN0cnVjdCBhc21fd21hcHJvX2NmZyAgICAgIHdtYXByb19jZmc7CisJCXN0cnVjdCBhc21fYWFjX2NmZyAgICAgICAgIGFhY19jZmc7CisJCXN0cnVjdCBhc21fZmxhY19jZmcgICAgICAgIGZsYWNfY2ZnOworCQlzdHJ1Y3QgYXNtX3ZvcmJpc19jZmcgICAgICB2b3JiaXNfY2ZnOworCQlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGsgbXVsdGlfY2hfcGNtX2NmZzsKKwkJc3RydWN0IGFzbV9hbXJ3YnBsdXNfY2ZnICAgYW1yd2JwbHVzX2NmZzsKKwl9IF9fcGFja2VkIHdyaXRlX2NmZzsKK30gX19wYWNrZWQ7CisKKworLyogQ29tbWFuZCBSZXNwb25zZXMgKi8KKyNkZWZpbmUgQVNNX1NUUkVBTV9DTURSU1BfR0VUX0VOQ0RFQ19QQVJBTSAgICAgICAgICAgICAgIDB4MDAwMTBDMTIKK3N0cnVjdCBhc21fc3RyZWFtX2NtZHJzcF9nZXRfcmVhZHdyaXRlX3BhcmFtIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgc3RhdHVzOworCXUzMiAgICAgICAgICAgIHBhcmFtX2lkOworCXUxNiAgICAgICAgICAgIHBhcmFtX3NpemU7CisJdTE2ICAgICAgICAgICAgcGFkZGluZzsKKwl1bmlvbiB7CisJCXN0cnVjdCBhc21fc2JjX2JpdHJhdGUgICAgICBzYmNfYml0cmF0ZTsKKwkJc3RydWN0IGFzbV9pbW1lZF9kZWNvZGUgYWFjX2RlYzsKKwl9IF9fcGFja2VkIHJlYWRfd3JpdGVfY2ZnOworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTl9USU1FICAgICAgICAgICAgICAweDAwMDEwQkQ4CitzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRyc3BfZ2V0X3Nlc3Npb25fdGltZSB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgICAgICAgICAgICBtc3dfdHM7CisJdTMyICAgICAgICAgICAgbHN3X3RzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJERgorc3RydWN0IGFzbV9kYXRhX2V2ZW50X3dyaXRlX2RvbmUgeworCXUzMglidWZfYWRkOworCXUzMiAgICAgICAgICAgIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRTAKK3N0cnVjdCBhc21fZGF0YV9ldmVudF9yZWFkX2RvbmUgeworCXUzMiAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgICAgICAgICAgICBidWZmZXJfYWRkOworCXUzMiAgICAgICAgICAgIGVuY19mcmFtZV9zaXplOworCXUzMiAgICAgICAgICAgIG9mZnNldDsKKwl1MzIgICAgICAgICAgICBtc3dfdHM7CisJdTMyICAgICAgICAgICAgbHN3X3RzOworCXUzMiAgICAgICAgICAgIGZsYWdzOworCXUzMiAgICAgICAgICAgIG51bV9mcmFtZXM7CisJdTMyICAgICAgICAgICAgaWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9EQVRBX0VWRU5UX1JFQURfQ09NUFJFU1NFRF9ET05FICAgICAgICAgICAgICAweDAwMDEwREMwCitzdHJ1Y3QgYXNtX2RhdGFfZXZlbnRfcmVhZF9jb21wcmVzc2VkX2RvbmUgeworCXUzMiAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgICAgICAgICAgICBidWZmZXJfYWRkOworCXUzMiAgICAgICAgICAgIGVuY19mcmFtZV9zaXplOworCXUzMiAgICAgICAgICAgIG9mZnNldDsKKwl1MzIgICAgICAgICAgICBtc3dfdHM7CisJdTMyICAgICAgICAgICAgbHN3X3RzOworCXUzMiAgICAgICAgICAgIGZsYWdzOworCXUzMiAgICAgICAgICAgIG51bV9mcmFtZXM7CisJdTMyICAgICAgICAgICAgaWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEFTTV9EQVRBX0VWRU5UX1NSX0NNX0NIQU5HRV9OT1RJRlkgICAgICAgICAgICAgICAweDAwMDEwQzY1CitzdHJ1Y3QgYXNtX2RhdGFfZXZlbnRfc3JfY21fY2hhbmdlX25vdGlmeSB7CisJdTMyICAgICAgICAgICAgc2FtcGxlX3JhdGU7CisJdTE2CSAgICAgICAgICAgbm9fb2ZfY2hhbm5lbHM7CisJdTE2ICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJdTggICAgICAgICAgICAgY2hhbm5lbF9tYXBbOF07Cit9IF9fcGFja2VkOworCisvKiBzZXJ2aWNlIGxldmVsIGV2ZW50cyAqLworCisjZGVmaW5lIEFTTV9TRVJWSUNFX0NNRFJTUF9HRVRfU1RSRUFNX0hBTkRMRVMgICAgICAgICAgICAweDAwMDEwQzFCCitzdHJ1Y3QgYXNtX3N2Y19jbWRyc3BfZ2V0X3N0cm1faGFuZGxlcyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXUzMiAgICAgICAgICAgIG51bV9oYW5kbGVzOworCXUzMiAgICAgICAgICAgIHN0cmVhbV9oYW5kbGVzOworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIEFTTV9TRVJWSUNFX0NNRFJTUF9HRVRfV0FMTENMT0NLX1RJTUUgICAgICAgICAgICAweDAwMDEwQzFBCitzdHJ1Y3QgYXNtX3N2Y19jbWRyc3BfZ2V0X3dhbGxjbG9ja190aW1lIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdTMyICAgICAgICAgICAgc3RhdHVzOworCXUzMiAgICAgICAgICAgIG1zd190czsKKwl1MzIgICAgICAgICAgICBsc3dfdHM7Cit9IF9fcGFja2VkOworCisvKiBFcnJvciBjb2RlICovCisjZGVmaW5lIEFEU1BfRU9LICAgICAgICAgIDB4MDAwMDAwMDAgLyogU3VjY2VzcyAvIGNvbXBsZXRlZCAvIG5vIGVycm9ycy4gKi8KKyNkZWZpbmUgQURTUF9FRkFJTEVEICAgICAgMHgwMDAwMDAwMSAvKiBHZW5lcmFsIGZhaWx1cmUuICovCisjZGVmaW5lIEFEU1BfRUJBRFBBUkFNICAgIDB4MDAwMDAwMDIgLyogQmFkIG9wZXJhdGlvbiBwYXJhbWV0ZXIocykuICovCisjZGVmaW5lIEFEU1BfRVVOU1VQUE9SVEVEIDB4MDAwMDAwMDMgLyogVW5zdXBwb3J0ZWQgcm91dGluZS9vcGVyYXRpb24uICovCisjZGVmaW5lIEFEU1BfRVZFUlNJT04gICAgIDB4MDAwMDAwMDQgLyogVW5zdXBwb3J0ZWQgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQURTUF9FVU5FWFBFQ1RFRCAgMHgwMDAwMDAwNSAvKiBVbmV4cGVjdGVkIHByb2JsZW0gZW5jb3VudGVyZWQuICovCisjZGVmaW5lIEFEU1BfRVBBTklDICAgICAgIDB4MDAwMDAwMDYgLyogVW5oYW5kbGVkIHByb2JsZW0gb2NjdXJyZWQuICovCisjZGVmaW5lIEFEU1BfRU5PUkVTT1VSQ0UgIDB4MDAwMDAwMDcgLyogVW5hYmxlIHRvIGFsbG9jYXRlIHJlc291cmNlKHMpLiAqLworI2RlZmluZSBBRFNQX0VIQU5ETEUgICAgICAweDAwMDAwMDA4IC8qIEludmFsaWQgaGFuZGxlLiAqLworI2RlZmluZSBBRFNQX0VBTFJFQURZICAgICAweDAwMDAwMDA5IC8qIE9wZXJhdGlvbiBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQURTUF9FTk9UUkVBRFkgICAgMHgwMDAwMDAwQSAvKiBPcGVyYXRpb24gbm90IHJlYWR5IHRvIGJlIHByb2Nlc3NlZCovCisjZGVmaW5lIEFEU1BfRVBFTkRJTkcgICAgIDB4MDAwMDAwMEIgLyogT3BlcmF0aW9uIGlzIHBlbmRpbmcgY29tcGxldGlvbiovCisjZGVmaW5lIEFEU1BfRUJVU1kgICAgICAgIDB4MDAwMDAwMEMgLyogT3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBvcgorCQkJCSAgICAgICogcHJvY2Vzc2VkLgorCQkJCSAgICAgICovCisjZGVmaW5lIEFEU1BfRUFCT1JURUQgICAgIDB4MDAwMDAwMEQgLyogT3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLiAqLworI2RlZmluZSBBRFNQX0VQUkVFTVBURUQgICAweDAwMDAwMDBFIC8qIE9wZXJhdGlvbiBwcmVlbXB0ZWQgYnkgaGlnaGVyIHByaW9yaXR5Ki8KKyNkZWZpbmUgQURTUF9FQ09OVElOVUUgICAgMHgwMDAwMDAwRiAvKiBPcGVyYXRpb24gcmVxdWVzdHMgaW50ZXJ2ZW50aW9uCisJCQkJICAgICAgKiB0byBjb21wbGV0ZS4KKwkJCQkgICAgICAqLworI2RlZmluZSBBRFNQX0VJTU1FRElBVEUgICAweDAwMDAwMDEwIC8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbW1lZGlhdGUKKwkJCQkgICAgICAqIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4KKwkJCQkgICAgICAqLworI2RlZmluZSBBRFNQX0VOT1RJTVBMICAgICAweDAwMDAwMDExIC8qIE9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuICovCisjZGVmaW5lIEFEU1BfRU5FRURNT1JFICAgIDB4MDAwMDAwMTIgLyogT3BlcmF0aW9uIG5lZWRzIG1vcmUgZGF0YSBvciByZXNvdXJjZXMqLworCisvKiBTUlMgVFJVTUVESUEgR1VJRFMgKi8KKyNkZWZpbmUgU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lEICAgIDB4MDAwMTBEOTAKKyNkZWZpbmUgU1JTX1RSVU1FRElBX01PRFVMRV9JRCAgICAgIDB4MTAwMDUwMTAKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNUyAgICAgICAgIDB4MTAwMDUwMTEKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19XT1dIRCAgIDB4MTAwMDUwMTIKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19DU0hQICAgIDB4MTAwMDUwMTMKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19IUEYgICAgIDB4MTAwMDUwMTQKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19QRVEgICAgIDB4MTAwMDUwMTUKKyNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19ITCAgICAgIDB4MTAwMDUwMTYKKworLyogU1JTIFNUVURJTyBTT1VORCAzRCBHVUlEUyAqLworI2RlZmluZSBTUlNfU1MzRF9UT1BPTE9HWV9JRCAgICAgICAgMHgwMDAxMDcyMAorI2RlZmluZSBTUlNfU1MzRF9NT0RVTEVfSUQgICAgICAgICAgMHgxMDAwNTAyMAorI2RlZmluZSBTUlNfU1MzRF9QQVJBTVMgICAgICAgICAgICAgMHgxMDAwNTAyMQorI2RlZmluZSBTUlNfU1MzRF9QQVJBTVNfQ1RSTCAgICAgICAgMHgxMDAwNTAyMgorI2RlZmluZSBTUlNfU1MzRF9QQVJBTVNfRklMVEVSICAgICAgMHgxMDAwNTAyMworCisvKiBTUlMgQUxTQSBDTUQgTUFTS1MgKi8KKyNkZWZpbmUgU1JTX0NNRF9VUExPQUQgICAgICAgICAgICAgIDB4N0ZGRjAwMDAKKyNkZWZpbmUgU1JTX1BBUkFNX0lOREVYX01BU0sgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU1JTX1BBUkFNX09GRlNFVF9NQVNLICAgICAgIDB4M0ZGRjAwMDAKKyNkZWZpbmUgU1JTX1BBUkFNX1ZBTFVFX01BU0sgICAgICAgIDB4MDAwMEZGRkYKKworLyogU1JTIFRSVU1FRElBIHN0YXJ0ICovCisjZGVmaW5lIFNSU19JRF9HTE9CQUwgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNSU19JRF9XT1dIRCAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNSU19JRF9DU0hQICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFNSU19JRF9IUEYgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNSU19JRF9QRVEgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIFNSU19JRF9ITCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisKK3N0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCB7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHYxOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MjsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjM7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHY0OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NTsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjY7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHY3OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2ODsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1dPV0hEIHsKKwl1aW50MzJfdAkJCQl2MTsKKwl1aW50MTZfdAkJCQl2MjsKKwl1aW50MTZfdAkJCQl2MzsKKwl1aW50MTZfdAkJCQl2NDsKKwl1aW50MTZfdAkJCQl2NTsKKwl1aW50MTZfdAkJCQl2NjsKKwl1aW50MTZfdAkJCQl2NzsKKwl1aW50MTZfdAkJCQl2ODsKKwl1aW50MTZfdAkJCQl2X19fX0ExOworCXVpbnQzMl90CQkJCXY5OworCXVpbnQxNl90CQkJCXYxMDsKKwl1aW50MTZfdAkJCQl2MTE7CisJdWludDMyX3QJCQkJdjEyWzE2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFAgeworCXVpbnQzMl90CQkJCXYxOworCXVpbnQxNl90CQkJCXYyOworCXVpbnQxNl90CQkJCXYzOworCXVpbnQxNl90CQkJCXY0OworCXVpbnQxNl90CQkJCXY1OworCXVpbnQxNl90CQkJCXY2OworCXVpbnQxNl90CQkJCXZfX19fQTE7CisJdWludDMyX3QJCQkJdjc7CisJdWludDE2X3QJCQkJdjg7CisJdWludDE2X3QJCQkJdjk7CisJdWludDMyX3QJCQkJdjEwWzE2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRiB7CisJdWludDMyX3QJCQkJdjE7CisJdWludDMyX3QJCQkJdjJbMjZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfUEVRIHsKKwl1aW50MzJfdAkJCQl2MTsKKwl1aW50MTZfdAkJCQl2MjsKKwl1aW50MTZfdAkJCQl2MzsKKwl1aW50MTZfdAkJCQl2NDsKKwl1aW50MTZfdAkJCQl2X19fX0ExOworCXVpbnQzMl90CQkJCXY1WzI2XTsKKwl1aW50MzJfdAkJCQl2NlsyNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITCB7CisJdWludDE2X3QJCQkJdjE7CisJdWludDE2X3QJCQkJdjI7CisJdWludDE2X3QJCQkJdjM7CisJdWludDE2X3QJCQkJdl9fX19BMTsKKwlpbnQzMl90CQkJCQl2NDsKKwl1aW50MzJfdAkJCQl2NTsKKwl1aW50MTZfdAkJCQl2NjsKKwl1aW50MTZfdAkJCQl2X19fX0EyOworCXVpbnQzMl90CQkJCXY3OworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXMgeworCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTAlnbG9iYWw7CisJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQJd293aGQ7CisJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUAkJY3NocDsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYJCWhwZjsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19QRVEJCXBlcTsKKwlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITAkJaGw7Cit9IF9fcGFja2VkOworCitpbnQgc3JzX3RydW1lZGlhX29wZW4oaW50IHBvcnRfaWQsIGludCBzcnNfdGVjaF9pZCwgdm9pZCAqc3JzX3BhcmFtcyk7CisvKiBTUlMgVHJ1TWVkaWEgZW5kICovCisKKy8qIFNSUyBTdHVkaW8gU291bmQgM0Qgc3RhcnQgKi8KKyNkZWZpbmUgU1JTX0lEX1NTM0RfR0xPQkFMCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1JTX0lEX1NTM0RfQ1RSTAkweDAwMDAwMDAyCisjZGVmaW5lIFNSU19JRF9TUzNEX0ZJTFRFUgkweDAwMDAwMDAzCisKK3N0cnVjdCBzcnNfU1MzRF9wYXJhbXNfR0xPQkFMIHsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjE7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHYyOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MzsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjQ7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHY1OworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NjsKKwl1aW50OF90ICAgICAgICAgICAgICAgICAgdjc7CisJdWludDhfdCAgICAgICAgICAgICAgICAgIHY4OworfSBfX3BhY2tlZDsKKworc3RydWN0IHNyc19TUzNEX2N0cmxfcGFyYW1zIHsKKwl1aW50OF90CQkJCXZbMjM2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfU1MzRF9maWx0ZXJfcGFyYW1zIHsKKwl1aW50OF90CQkJCXZbMjggKyAyNzUyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzcnNfU1MzRF9wYXJhbXMgeworCXN0cnVjdCBzcnNfU1MzRF9wYXJhbXNfR0xPQkFMICAgZ2xvYmFsOworCXN0cnVjdCBzcnNfU1MzRF9jdHJsX3BhcmFtcyAgICAgc3MzZDsKKwlzdHJ1Y3Qgc3JzX1NTM0RfZmlsdGVyX3BhcmFtcyAgIHNzM2RfZjsKK30gX19wYWNrZWQ7CisKK2ludCBzcnNfc3MzZF9vcGVuKGludCBwb3J0X2lkLCBpbnQgc3JzX3RlY2hfaWQsIHZvaWQgKnNyc19wYXJhbXMpOworLyogU1JTIFN0dWRpbyBTb3VuZCAzRCBlbmQgKi8KKyNlbmRpZiAvKl9BUFJfQVVESU9fSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hdWRpb19jYWxfdXRpbHMuaCBiL2luY2x1ZGUvc291bmQvYXVkaW9fY2FsX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YjNiZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvYXVkaW9fY2FsX3V0aWxzLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpZm5kZWYgX0FVRElPX0NBTF9VVElMU19ICisjZGVmaW5lIF9BVURJT19DQUxfVVRJTFNfSAorCisjaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fY2FsaWJyYXRpb24uaD4KKyNpbmNsdWRlICJhdWRpb19jYWxpYnJhdGlvbi5oIgorCitzdHJ1Y3QgY2FsX2RhdGEgeworCXNpemVfdAkJc2l6ZTsKKwl2b2lkCQkqa3ZhZGRyOworCXBoeXNfYWRkcl90CXBhZGRyOworfTsKKworc3RydWN0IG1lbV9tYXBfZGF0YSB7CisJc2l6ZV90CQkJbWFwX3NpemU7CisJaW50MzJfdAkJCXE2bWFwX2hhbmRsZTsKKwlpbnQzMl90CQkJaW9uX21hcF9oYW5kbGU7CisJc3RydWN0IGlvbl9jbGllbnQJKmlvbl9jbGllbnQ7CisJc3RydWN0IGlvbl9oYW5kbGUJKmlvbl9oYW5kbGU7Cit9OworCitzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgeworCXNpemVfdAkJCWNsaWVudF9pbmZvX3NpemU7CisJdm9pZAkJCSpjbGllbnRfaW5mbzsKKwl2b2lkCQkJKmNhbF9pbmZvOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgY2FsX2RhdGEJCWNhbF9kYXRhOworCXN0cnVjdCBtZW1fbWFwX2RhdGEJbWFwX2RhdGE7CisJaW50MzJfdAkJCWJ1ZmZlcl9udW1iZXI7Cit9OworCitzdHJ1Y3QgY2FsX3V0aWxfY2FsbGJhY2tzIHsKKwlpbnQgKCptYXBfY2FsKQorCQkoaW50MzJfdCBjYWxfdHlwZSwgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spOworCWludCAoKnVubWFwX2NhbCkKKwkJKGludDMyX3QgY2FsX3R5cGUsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKKwlib29sICgqbWF0Y2hfYmxvY2spCisJCShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgdm9pZCAqdXNlcl9kYXRhKTsKK307CisKK3N0cnVjdCBjYWxfdHlwZV9pbmZvIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3JlZwkJcmVnOworCXN0cnVjdCBjYWxfdXRpbF9jYWxsYmFja3MJY2FsX3V0aWxfY2FsbGJhY2tzOworfTsKKworc3RydWN0IGNhbF90eXBlX2RhdGEgeworCXN0cnVjdCBjYWxfdHlwZV9pbmZvCQlpbmZvOworCXN0cnVjdCBtdXRleAkJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAkJY2FsX2Jsb2NrczsKK307CisKKworLyogdG8gcmVnaXN0ZXIgJiBkZWdyZWdpc3RlciB3aXRoIGNhbCB1dGlsIGRyaXZlciAqLworaW50IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKGludCBudW1fY2FsX3R5cGVzLAorCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKipjYWxfdHlwZSwKKwkJCXN0cnVjdCBjYWxfdHlwZV9pbmZvICppbmZvKTsKK3ZvaWQgY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKGludCBudW1fY2FsX3R5cGVzLAorCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKipjYWxfdHlwZSk7CisKKy8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGNhbGxiYWNrcyAqLworaW50IGNhbF91dGlsc19hbGxvY19jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKKwkJCXNpemVfdCBjbGllbnRfaW5mb19zaXplLCB2b2lkICpjbGllbnRfaW5mbyk7CitpbnQgY2FsX3V0aWxzX2RlYWxsb2NfY2FsKHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUpOworaW50IGNhbF91dGlsc19zZXRfY2FsKHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUsCisJCQlzaXplX3QgY2xpZW50X2luZm9fc2l6ZSwgdm9pZCAqY2xpZW50X2luZm8pOworCisvKiB1c2UgZm9yIFNTUiAqLwordm9pZCBjYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhpbnQgbnVtX2NhbF90eXBlcywKKwkJCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKipjYWxfdHlwZSk7CisKKworLyogY29tbW9uIG1hdGNoaW5nIGZ1bmN0aW9ucyB1c2VkIHRvIGFkZCBibG9ja3MgKi8KK2Jvb2wgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW0oc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssCisJCQkJCXZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIGNvbW1vbiBtYXRjaGluZyBmdW5jdGlvbnMgdG8gZmluZCBjYWwgYmxvY2tzICovCitzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCisJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUpOworCisvKiBTaXplIG9mIGNhbGlicmF0aW9uIHNwZWNpZmljIGRhdGEgKi8KK3NpemVfdCBnZXRfY2FsX2luZm9fc2l6ZShpbnQzMl90IGNhbF90eXBlKTsKK3NpemVfdCBnZXRfdXNlcl9jYWxfdHlwZV9zaXplKGludDMyX3QgY2FsX3R5cGUpOworCisvKiBWZXJzaW9uIG9mIHRoZSBjYWwgdHlwZSovCitpbnQzMl90IGNhbF91dGlsc19nZXRfY2FsX3R5cGVfdmVyc2lvbih2b2lkICpjYWxfdHlwZV9kYXRhKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hdWRpb19jYWxpYnJhdGlvbi5oIGIvaW5jbHVkZS9zb3VuZC9hdWRpb19jYWxpYnJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZWNmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL2F1ZGlvX2NhbGlicmF0aW9uLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9BVURJT19DQUxJQlJBVElPTl9ICisjZGVmaW5lIF9BVURJT19DQUxJQlJBVElPTl9ICisKKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fY2FsaWJyYXRpb24uaD4KKworLyogVXNlZCBieSBkcml2ZXIgaW4gYnVmZmVyX251bWJlciBmaWVsZCB0byBub3RpZnkgY2xpZW50CisgKiBUbyB1cGRhdGUgYWxsIGJsb2NrcywgZm9yIGV4YW1wbGU6IGZyZWVpbmcgYWxsIG1lbW9yeQorICovCisjZGVmaW5lIEFMTF9DQUxfQkxPQ0tTCQktMQorCisKK3N0cnVjdCBhdWRpb19jYWxfY2FsbGJhY2tzIHsKKwlpbnQgKCphbGxvYykoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7CisJaW50ICgqZGVhbGxvYykoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7CisJaW50ICgqcHJlX2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7CisJaW50ICgqc2V0X2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7CisJaW50ICgqZ2V0X2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7CisJaW50ICgqcG9zdF9jYWwpKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9yZWcgeworCWludDMyX3QJCQkJY2FsX3R5cGU7CisJc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MJY2FsbGJhY2tzOworfTsKKworaW50IGF1ZGlvX2NhbF9yZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKTsKK2ludCBhdWRpb19jYWxfZGVyZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2F1ZGlvX3NsaW1zbGF2ZS5oIGIvaW5jbHVkZS9zb3VuZC9hdWRpb19zbGltc2xhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTZhNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9hdWRpb19zbGltc2xhdmUuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9fQVVESU9fU0xJTVNMQVZFX0hfXworI2RlZmluZSBfX0FVRElPX1NMSU1TTEFWRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBBVURJT19TTElNU0xBVkVfSU9DVExfTkFNRSAiYXVkaW9fc2xpbXNsYXZlIgorI2RlZmluZSBBVURJT19TTElNU0xBVkVfTUFHSUMgJ1MnCisKKyNkZWZpbmUgQVVESU9fU0xJTVNMQVZFX0lPQ1RMX1VOVk9URQlfSU8oQVVESU9fU0xJTVNMQVZFX01BR0lDLCAweDAwKQorI2RlZmluZSBBVURJT19TTElNU0xBVkVfSU9DVExfVk9URQlfSU8oQVVESU9fU0xJTVNMQVZFX01BR0lDLCAweDAxKQorCitlbnVtIHsKKwlBVURJT19TTElNU0xBVkVfVU5WT1RFLAorCUFVRElPX1NMSU1TTEFWRV9WT1RFCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY3BlX2NtaS5oIGIvaW5jbHVkZS9zb3VuZC9jcGVfY21pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmODNlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvY3BlX2NtaS5oCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ1BFX0NNSV9IX18KKyNkZWZpbmUgX19DUEVfQ01JX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBDUEVfQUZFX1BPUlRfMV9UWCAxCisjZGVmaW5lIENQRV9BRkVfUE9SVF8zX1RYIDMKKyNkZWZpbmUgQ1BFX0FGRV9QT1JUX0lEXzJfT1VUIDB4MDIKKyNkZWZpbmUgQ01JX0lOQkFORF9NRVNTQUdFX1NJWkUgMTI3CisKKy8qCisgKiBNdWx0aXBsZSBtYWQgdHlwZXMgY2FuIGJlIHN1cHBvcnRlZCBhdCBvbmNlLgorICogdGhlc2UgdmFsdWVzIGNhbiBiZSBPUidlZCB0byBmb3JtIHRoZSBzZXQgb2YKKyAqIHN1cHBvcnRlZCBtYWQgdHlwZXMKKyAqLworI2RlZmluZSBNQURfVFlQRV9BVURJTyAoMSA8PCAwKQorI2RlZmluZSBNQURfVFlQRV9CRUFDT04gKDEgPDwgMSkKKyNkZWZpbmUgTUFEX1RZUEVfVUxUUkFTTkQgKDEgPDwgMikKKworLyogQ29yZSBzZXJ2aWNlIGNvbW1hbmQgb3Bjb2RlcyAqLworI2RlZmluZSBDUEVfQ09SRV9TVkNfQ01EX1NIQVJFRF9NRU1fQUxMT0MJKDB4MzAwMSkKKyNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0NNRFJTUF9TSEFSRURfTUVNX0FMTE9DCSgweDMwMDIpCisjZGVmaW5lIENQRV9DT1JFX1NWQ19DTURfU0hBUkVEX01FTV9ERUFMTE9DCSgweDMwMDMpCisjZGVmaW5lIENQRV9DT1JFX1NWQ19DTURfRFJBTV9BQ0NFU1NfUkVRCSgweDMwMDQpCisjZGVmaW5lIENQRV9DT1JFX1NWQ19FVkVOVF9TWVNURU1fQk9PVAkJKDB4MzAwNSkKKy8qIGNvcmUgc2VydmljZSBjb21tYW5kIG9wY29kZXMgZm9yIFdDRDkzMzUgKi8KKyNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0NNRF9DRkdfQ0xLX1BMQU4JCSgweDMwMDYpCisjZGVmaW5lIENQRV9DT1JFX1NWQ19DTURfQ0xLX0ZSRVFfUkVRVUVTVAkoMHgzMDA3KQorCisjZGVmaW5lIENQRV9CT09UX1NVQ0NFU1MgMHgwMAorI2RlZmluZSBDUEVfQk9PVF9GQUlMRUQgMHgwMQorCisjZGVmaW5lIENQRV9DT1JFX1ZFUlNJT05fU1lTVEVNX0JPT1RfRVZFTlQgMHgwMQorCisvKiBMU00gU2VydmljZSBjb21tYW5kIG9wY29kZXMgKi8KKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9PUEVOX1RYCQkoMHgyMDAwKQorI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMJCSgweDIwMDEpCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfUkVHSVNURVJfU09VTkRfTU9ERUwgKDB4MjAwMikKKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9ERVJFR0lTVEVSX1NPVU5EX01PREVMICgweDIwMDMpCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfU1RBUlQJCSgweDIwMDQpCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfU1RPUAkJKDB4MjAwNSkKKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjIgKDB4MjAwNikKKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9DTE9TRV9UWAkJKDB4MjAwNykKKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX0FMTE9DCSgweDIwMDgpCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURSU1BfU0hBUkVEX01FTV9BTExPQyAoMHgyMDA5KQorI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fREVBTExPQwkoMHgyMDBBKQorI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX1RYX0JVRkZfT1VUUFVUX0NPTkZJRyAoMHgyMDBmKQorI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX09QRU5fVFhfVjIJCSgweDIwMEQpCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMgkoMHgyMDBFKQorCisvKiBMU00gU2VydmljZSBtb2R1bGUgYW5kIHBhcmFtIElEcyAqLworI2RlZmluZSBDUEVfTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVAJCSgweDAwMDEyQzAwKQorI2RlZmluZSBDUEVfTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVBfVjIJKDB4MDAwMTJDMEQpCisjZGVmaW5lIENQRV9MU01fTU9EVUxFX0ZSQU1FV09SSwkJKDB4MDAwMTJDMEUpCisKKyNkZWZpbmUgQ1BFX0xTTV9QQVJBTV9JRF9FTkRQT0lOVF9ERVRFQ1RfVEhSRVNIT0xEICgweDAwMDEyQzAxKQorI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX09QRVJBVElPTl9NT0RFCQkoMHgwMDAxMkMwMikKKyNkZWZpbmUgQ1BFX0xTTV9QQVJBTV9JRF9HQUlOCQkJKDB4MDAwMTJDMDMpCisjZGVmaW5lIENQRV9MU01fUEFSQU1fSURfQ09OTkVDVF9UT19QT1JUCSgweDAwMDEyQzA0KQorI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX01JTl9DT05GSURFTkNFX0xFVkVMUwkoMHgwMDAxMkMwNykKKworLyogTFNNIExBQiBjb21tYW5kIG9wY29kZXMgKi8KKyNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9FT0IJCTB4MDAwMDIwMEIKKyNkZWZpbmUgQ1BFX0xTTV9NT0RVTEVfSURfTEFCCQkweDAwMDEyQzA4CisvKiB1c2VkIGZvciBlbmFibGUvZGlzYWJsZSBsYWIqLworI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX0xBQl9FTkFCTEUJMHgwMDAxMkMwOQorLyogdXNlZCBmb3IgVCBpbiBMQUIgY29uZmlnIERTUCBpbnRlcm5hbCBidWZmZXIqLworI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX0xBQl9DT05GSUcJMHgwMDAxMkMwQQorI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX1JFR0lTVEVSX1NPVU5EX01PREVMCSgweDAwMDEyQzE0KQorI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX0RFUkVHSVNURVJfU09VTkRfTU9ERUwJKDB4MDAwMTJDMTUpCisjZGVmaW5lIENQRV9MU01fUEFSQU1fSURfTUVESUFfRk1UCQkoMHgwMDAxMkMxRSkKKworLyogQUZFIFNlcnZpY2UgY29tbWFuZCBvcGNvZGVzICovCisjZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfU1RBUlQJCQkoMHgxMDAxKQorI2RlZmluZSBDUEVfQUZFX1BPUlRfQ01EX1NUT1AJCQkoMHgxMDAyKQorI2RlZmluZSBDUEVfQUZFX1BPUlRfQ01EX1NVU1BFTkQJCSgweDEwMDMpCisjZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfUkVTVU1FCQkJKDB4MTAwNCkKKyNkZWZpbmUgQ1BFX0FGRV9QT1JUX0NNRF9TSEFSRURfTUVNX0FMTE9DCSgweDEwMDUpCisjZGVmaW5lIENQRV9BRkVfUE9SVF9DTURSU1BfU0hBUkVEX01FTV9BTExPQwkoMHgxMDA2KQorI2RlZmluZSBDUEVfQUZFX1BPUlRfQ01EX1NIQVJFRF9NRU1fREVBTExPQwkoMHgxMDA3KQorI2RlZmluZSBDUEVfQUZFX1BPUlRfQ01EX0dFTkVSSUNfQ09ORklHCQkoMHgxMDA4KQorI2RlZmluZSBDUEVfQUZFX1NWQ19DTURfTEFCX01PREUJCSgweDEwMDkpCisKKy8qIEFGRSBTZXJ2aWNlIG1vZHVsZSBhbmQgcGFyYW0gSURzICovCisjZGVmaW5lIENQRV9BRkVfQ01EX1NFVF9QQVJBTQkJCSgweDEwMDApCisjZGVmaW5lIENQRV9BRkVfTU9EVUxFX0lEX1NXX01BRAkJKDB4MDAwMTAyMkQpCisjZGVmaW5lIENQRV9BRkVfUEFSQU1fSURfU1dfTUFEX0NGRwkJKDB4MDAwMTAyMkUpCisjZGVmaW5lIENQRV9BRkVfUEFSQU1fSURfU1ZNX01PREVMCQkoMHgwMDAxMDIyRikKKworI2RlZmluZSBDUEVfQUZFX01PRFVMRV9IV19NQUQJCQkoMHgwMDAxMDIzMCkKKyNkZWZpbmUgQ1BFX0FGRV9QQVJBTV9JRF9IV19NQURfQ1RMCQkoMHgwMDAxMDIzMikKKyNkZWZpbmUgQ1BFX0FGRV9QQVJBTV9JRF9IV19NQURfQ0ZHCQkoMHgwMDAxMDIzMSkKKworI2RlZmluZSBDUEVfQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFCSgweDAwMDEwMjBDKQorI2RlZmluZSBDUEVfQUZFX1BBUkFNX0lEX0dFTkVSSUNfUE9SVF9DT05GSUcJKDB4MDAwMTAyNTMpCisKKyNkZWZpbmUgQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFCSgweDAwMDEpCisjZGVmaW5lIENQRV9IRFJfTUFYX1BMRF9TSVpFCSgweDdGKQorCisjZGVmaW5lIENNSV9PQk1fRkxBR19JTl9CQU5ECTAKKyNkZWZpbmUgQ01JX09CTV9GTEFHX09VVF9CQU5ECTEKKworI2RlZmluZSBDTUlfU0hNRU1fQUxMT0NfRkFJTEVEIDB4ZmYKKworLyoKKyAqIEZ1dHVyZSBTZXJ2aWNlIElEJ3MgY2FuIGJlIGFkZGVkIG9uZSBsaW5lCisgKiBiZWZvcmUgdGhlIENNSV9DUEVfU0VSVklDRV9JRF9NQVgKKyAqLworZW51bSB7CisJQ01JX0NQRV9TRVJWSUNFX0lEX01JTiA9IDAsCisJQ01JX0NQRV9DT1JFX1NFUlZJQ0VfSUQsCisJQ01JX0NQRV9BRkVfU0VSVklDRV9JRCwKKwlDTUlfQ1BFX0xTTV9TRVJWSUNFX0lELAorCUNNSV9DUEVfU0VSVklDRV9JRF9NQVgsCit9OworCisjZGVmaW5lIENQRV9MU01fU0VTU0lPTl9JRF9NQVggMgorCisjZGVmaW5lIElTX1ZBTElEX1NFU1NJT05fSUQoc19pZCkgXAorCShzX2lkIDw9IENQRV9MU01fU0VTU0lPTl9JRF9NQVgpCisKKyNkZWZpbmUgSVNfVkFMSURfU0VSVklDRV9JRChzX2lkKSBcCisJKHNfaWQgPiBDTUlfQ1BFX1NFUlZJQ0VfSURfTUlOICYmIFwKKwkgc19pZCA8IENNSV9DUEVfU0VSVklDRV9JRF9NQVgpCisKKyNkZWZpbmUgSVNfVkFMSURfUExEX1NJWkUocF9zaXplKSBcCisJKHBfc2l6ZSA8PSBDUEVfSERSX01BWF9QTERfU0laRSkKKworI2RlZmluZSBDTUlfSERSX1NFVF9PUENPREUoaGRyLCBjbWQpIChoZHItPm9wY29kZSA9IGNtZCkKKworCisjZGVmaW5lIENNSV9IRFJfU0VUKGhkcl9pbmZvLCBtYXNrLCBzaGlmdCwgdmFsdWUpIFwKKwkJKGhkcl9pbmZvID0gKCgoaGRyX2luZm8pICYgfihtYXNrKSkgfCBcCisJCQkoKHZhbHVlIDw8IHNoaWZ0KSAmIG1hc2spKSkKKworI2RlZmluZSBTVkNfSURfU0hJRlQgNAorI2RlZmluZSBTVkNfSURfTUFTSyAoMHgwNyA8PCBTVkNfSURfU0hJRlQpCisKKyNkZWZpbmUgU0VTU0lPTl9JRF9TSElGVCAwCisjZGVmaW5lIFNFU1NJT05fSURfTUFTSyAoMHgwRiA8PCBTRVNTSU9OX0lEX1NISUZUKQorCisjZGVmaW5lIFBBWUxEX1NJWkVfU0hJRlQgMAorI2RlZmluZSBQQVlMRF9TSVpFX01BU0sgKDB4N0YgPDwgUEFZTERfU0laRV9TSElGVCkKKworI2RlZmluZSBPQk1fRkxBR19TSElGVCA3CisjZGVmaW5lIE9CTV9GTEFHX01BU0sgKDEgPDwgT0JNX0ZMQUdfU0hJRlQpCisKKyNkZWZpbmUgVkVSU0lPTl9TSElGVCA3CisjZGVmaW5lIFZFUlNJT05fTUFTSyAoMSA8PCBWRVJTSU9OX1NISUZUKQorCisjZGVmaW5lIENNSV9IRFJfU0VUX1NFUlZJQ0UoaGRyLCBzX2lkKSBcCisJCUNNSV9IRFJfU0VUKGhkci0+aGRyX2luZm8sIFNWQ19JRF9NQVNLLFwKKwkJCSAgICBTVkNfSURfU0hJRlQsIHNfaWQpCisjZGVmaW5lIENNSV9IRFJfR0VUX1NFUlZJQ0UoaGRyKSBcCisJCSgoaGRyLT5oZHJfaW5mbyA+PiBTVkNfSURfU0hJRlQpICYgXAorCQkJKFNWQ19JRF9NQVNLID4+IFNWQ19JRF9TSElGVCkpCisKKworI2RlZmluZSBDTUlfSERSX1NFVF9TRVNTSU9OKGhkciwgc19pZCkgXAorCQlDTUlfSERSX1NFVChoZHItPmhkcl9pbmZvLCBTRVNTSU9OX0lEX01BU0ssXAorCQkJICAgIFNFU1NJT05fSURfU0hJRlQsIHNfaWQpCisKKyNkZWZpbmUgQ01JX0hEUl9HRVRfU0VTU0lPTl9JRChoZHIpIFwKKwkJKChoZHItPmhkcl9pbmZvID4+IFNFU1NJT05fSURfU0hJRlQpICYgXAorCQkJIChTRVNTSU9OX0lEX01BU0sgPj4gU0VTU0lPTl9JRF9TSElGVCkpCisKKyNkZWZpbmUgQ01JX0dFVF9IRUFERVIobXNnKQkoKHN0cnVjdCBjbWlfaGRyICopKG1zZykpCisjZGVmaW5lIENNSV9HRVRfUEFZTE9BRChtc2cpCSgodm9pZCAqKShDTUlfR0VUX0hFQURFUihtc2cpICsgMSkpCisjZGVmaW5lIENNSV9HRVRfT1BDT0RFKG1zZykJKENNSV9HRVRfSEVBREVSKG1zZyktPm9wY29kZSkKKworI2RlZmluZSBDTUlfSERSX1NFVF9WRVJTSU9OKGhkciwgdmVyKSBcCisJCUNNSV9IRFJfU0VUKGhkci0+aGRyX2luZm8sIFZFUlNJT05fTUFTSywgXAorCQkJCVZFUlNJT05fU0hJRlQsIHZlcikKKworI2RlZmluZSBDTUlfSERSX1NFVF9QQVlMT0FEX1NJWkUoaGRyLCBwX3NpemUpIFwKKwkJQ01JX0hEUl9TRVQoaGRyLT5wbGRfaW5mbywgUEFZTERfU0laRV9NQVNLLCBcCisJCQkgICAgUEFZTERfU0laRV9TSElGVCwgcF9zaXplKQorCisjZGVmaW5lIENNSV9IRFJfR0VUX1BBWUxPQURfU0laRShoZHIpIFwKKwkJKChoZHItPnBsZF9pbmZvID4+IFBBWUxEX1NJWkVfU0hJRlQpICYgXAorCQkJKFBBWUxEX1NJWkVfTUFTSyA+PiBQQVlMRF9TSVpFX1NISUZUKSkKKworI2RlZmluZSBDTUlfSERSX1NFVF9PQk0oaGRyLCBvYm1fZmxhZykgXAorCQlDTUlfSERSX1NFVChoZHItPnBsZF9pbmZvLCBPQk1fRkxBR19NQVNLLCBcCisJCQkgICAgT0JNX0ZMQUdfU0hJRlQsIG9ibV9mbGFnKQorCisjZGVmaW5lIENNSV9IRFJfR0VUX09CTV9GTEFHKGhkcikgXAorCSgoaGRyLT5wbGRfaW5mbyA+PiBPQk1fRkxBR19TSElGVCkgJiBcCisJCShPQk1fRkxBR19NQVNLID4+IE9CTV9GTEFHX1NISUZUKSkKKworc3RydWN0IGNtaV9oZHIgeworCS8qCisJICogYml0cyAwOjMgaXMgc2Vzc2lvbiBpZAorCSAqIGJpdHMgNDo2IGlzIHNlcnZpY2UgaWQKKwkgKiBiaXQgNyBpcyB0aGUgdmVyc2lvbiBmbGFnCisJICovCisJdTggaGRyX2luZm87CisKKwkvKgorCSAqIGJpdHMgMDo2IGlzIHBheWxvYWQgc2l6ZSBpbiBjYXNlIG9mIGluLWJhbmQgbWVzc2FnZQorCSAqIGJpdHMgMDo2IGlzIHNpemUgKE9CTSBtZXNzYWdlIHNpemUpCisJICogYml0IDcgaXMgdGhlIE9CTSBmbGFnCisJICovCisJdTggcGxkX2luZm87CisKKwkvKiAxNiBiaXQgY29tbWFuZCBvcGNvZGUgKi8KKwl1MTYgb3Bjb2RlOworfSBfX3BhY2tlZDsKKwordW5pb24gY3BlX2FkZHIgeworCXU2NCBtc3dfbHN3OworCXZvaWQgKmt2YWRkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWlfb2JtIHsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgc2l6ZTsKKwl1bmlvbiBjcGVfYWRkciBkYXRhX3B0cjsKKwl1MzIgbWVtX2hhbmRsZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWlfb2JtX21zZyB7CisJc3RydWN0IGNtaV9oZHIgaGRyOworCXN0cnVjdCBjbWlfb2JtIHBsZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWlfY29yZV9zdmNfZXZlbnRfc3lzdGVtX2Jvb3QgeworCXU4IHN0YXR1czsKKwl1OCB2ZXJzaW9uOworCXUxNiBzZnJfYnVmZl9zaXplOworCXUzMiBzZnJfYnVmZl9hZGRyZXNzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRfc2hhcmVkX21lbV9hbGxvYyB7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZHJzcF9zaGFyZWRfbWVtX2FsbG9jIHsKKwl1MzIgYWRkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWlfY29yZV9zdmNfY21kX2Nsa19mcmVxX3JlcXVlc3QgeworCXUzMiBjbGtfZnJlcTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjbWlfbXNnX3RyYW5zcG9ydCB7CisJdTMyIHNpemU7CisJdTMyIGFkZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY21pX2Jhc2ljX3JzcF9yZXN1bHQgeworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4IHsKKwlzdHJ1Y3QgY21pX2hkcgloZHI7CisJdTE2IGFwcF9pZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTMyIHNhbXBsaW5nX3JhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2xzbV9jbWRfb3Blbl90eF92MiB7CisJc3RydWN0IGNtaV9oZHIgaGRyOworCXUzMiB0b3BvbG9neV9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfY21kX3NobWVtX2FsbG9jIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2NtZHJzcF9zaG1lbV9hbGxvYyB7CisJc3RydWN0IGNtaV9oZHIgaGRyOworCXUzMiBhZGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9jbWRfc2htZW1fZGVhbGxvYyB7CisJc3RydWN0IGNtaV9oZHIJaGRyOworCXUzMiBhZGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9sc21fZXZlbnRfZGV0ZWN0X3YyIHsKKwlzdHJ1Y3QgY21pX2hkcgloZHI7CisJdTggZGV0ZWN0aW9uX3N0YXR1czsKKwl1OCBzaXplOworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2xzbV9wc2l6ZV9yZXMgeworCXUxNiBwYXJhbV9zaXplOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIGNwZV9sc21fcGFyYW1fc2l6ZSB7CisJdTMyIHBhcmFtX3NpemU7CisJc3RydWN0IGNwZV9sc21fcHNpemVfcmVzIHNyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9wYXJhbV9kYXRhIHsKKwl1MzIgbW9kdWxlX2lkOworCXUzMiBwYXJhbV9pZDsKKwl1bmlvbiBjcGVfbHNtX3BhcmFtX3NpemUgcF9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9sc21fcGFyYW1fZXBkX3RocmVzIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXJzaW9uOworCXUzMiBlcGRfYmVnaW47CisJdTMyIGVwZF9lbmQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9nYWluIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXJzaW9uOworCXUxNiBnYWluOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfYWZlX2h3X21hZF9jdHJsIHsKKwlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07CisJdTMyIG1pbm9yX3ZlcnNpb247CisJdTE2IG1hZF90eXBlOworCXUxNiBtYWRfZW5hYmxlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9hZmVfcG9ydF9jZmcgeworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSBwYXJhbTsKKwl1MzIgbWlub3JfdmVyc2lvbjsKKwl1MTYgYml0X3dpZHRoOworCXUxNiBudW1fY2hhbm5lbHM7CisJdTMyIHNhbXBsZV9yYXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9hZmVfY21kX3BvcnRfY2ZnIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJdTggYml0X3dpZHRoOworCXU4IG51bV9jaGFubmVsczsKKwl1MTYgYnVmZmVyX3NpemU7CisJdTMyIHNhbXBsZV9yYXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9hZmVfcGFyYW1zIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9hZmVfaHdfbWFkX2N0cmwgaHdfbWFkX2N0cmw7CisJc3RydWN0IGNwZV9hZmVfcG9ydF9jZmcgcG9ydF9jZmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2FmZV9zdmNfY21kX21vZGUgeworCXN0cnVjdCBjbWlfaGRyIGhkcjsKKwl1OCBtb2RlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9sc21fcGFyYW1fb3Btb2RlIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXJzaW9uOworCXUxNiBtb2RlOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfbHNtX3BhcmFtX2Nvbm5lY3Rwb3J0IHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXJzaW9uOworCXUxNiBhZmVfcG9ydF9pZDsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKgorICogVGhpcyBjYW5ub3QgYmUgc2VudCB0byBDUEUgYXMgaXMsCisgKiBuZWVkIHRvIGFwcGVuZCB0aGUgY29uZl9sZXZlbHMgZHluYW1pY2FsbHkKKyAqLworc3RydWN0IGNwZV9sc21fY29uZl9sZXZlbCB7CisJc3RydWN0IGNtaV9oZHIgaGRyOworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSBwYXJhbTsKKwl1OCBudW1fYWN0aXZlX21vZGVsczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfbHNtX291dHB1dF9mb3JtYXRfY2ZnIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJdTggZm9ybWF0OworCXU4IHBhY2tpbmc7CisJdTggZGF0YV9wYXRoX2V2ZW50czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfbHNtX2xhYl9lbmFibGUgeworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSBwYXJhbTsKKwl1MTYgZW5hYmxlOworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjcGVfbHNtX2NvbnRyb2xfbGFiIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9sc21fbGFiX2VuYWJsZSBsYWJfZW5hYmxlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9sc21fbGFiX2NvbmZpZyB7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXI7CisJdTMyIGxhdGVuY3k7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3BlX2xzbV9sYWJfbGF0ZW5jeV9jb25maWcgeworCXN0cnVjdCBjbWlfaGRyIGhkcjsKKwlzdHJ1Y3QgY3BlX2xzbV9sYWJfY29uZmlnIGxhdGVuY3lfY2ZnOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNwZV9sc21fbWVkaWFfZm10X3BhcmFtIHsKKwlzdHJ1Y3QgY21pX2hkciBoZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOworCXUzMiBtaW5vcl92ZXJzaW9uOworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MTYgbnVtX2NoYW5uZWxzOworCXUxNiBiaXRfd2lkdGg7Cit9IF9fcGFja2VkOworCisKKyNkZWZpbmUgQ1BFX1BBUkFNX0xTTV9MQUJfTEFURU5DWV9TSVpFIChcCisJCQkJc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2xhYl9sYXRlbmN5X2NvbmZpZykgLSBcCisJCQkJc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKyNkZWZpbmUgUEFSQU1fU0laRV9MU01fTEFURU5DWV9TSVpFIChcCisJCQkJCXNpemVvZihzdHJ1Y3QgY3BlX2xzbV9sYWJfY29uZmlnKSAtIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCisjZGVmaW5lIENQRV9QQVJBTV9TSVpFX0xTTV9MQUJfQ09OVFJPTCAoXAorCQkJCXNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jb250cm9sX2xhYikgLSBcCisJCQkJc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKyNkZWZpbmUgUEFSQU1fU0laRV9MU01fQ09OVFJPTF9TSVpFIChzaXplb2Yoc3RydWN0IGNwZV9sc21fbGFiX2VuYWJsZSkgLSBcCisJCQkJCXNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQorI2RlZmluZSBQQVJBTV9TSVpFX0FGRV9IV19NQURfQ1RSTCAoc2l6ZW9mKHN0cnVjdCBjcGVfYWZlX2h3X21hZF9jdHJsKSAtIFwKKwkJCQlzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKKyNkZWZpbmUgUEFSQU1fU0laRV9BRkVfUE9SVF9DRkcgKHNpemVvZihzdHJ1Y3QgY3BlX2FmZV9wb3J0X2NmZykgLSBcCisJCQkJIHNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQorI2RlZmluZSBDUEVfQUZFX1BBUkFNX1BBWUxPQURfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfYWZlX3BhcmFtcykgLSBcCisJCQkJc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKworI2RlZmluZSBPUEVOX0NNRF9QQVlMT0FEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jbWRfb3Blbl90eCkgLSBcCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKyNkZWZpbmUgT1BFTl9WMl9DTURfUEFZTE9BRF9TSVpFIChzaXplb2Yoc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHhfdjIpIC0gXAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCisjZGVmaW5lIFNITUVNX0FMTE9DX0NNRF9QTERfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfY21kX3NobWVtX2FsbG9jKSAtIFwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQorCisjZGVmaW5lIFNITUVNX0RFQUxMT0NfQ01EX1BMRF9TSVpFIChzaXplb2Yoc3RydWN0IGNwZV9jbWRfc2htZW1fZGVhbGxvYykgLSBcCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKyNkZWZpbmUgT1VUX0ZNVF9DRkdfQ01EX1BBWUxPQURfU0laRSAoIFwKKwkJc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX291dHB1dF9mb3JtYXRfY2ZnKSAtIFwKKwkJc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKworI2RlZmluZSBDUEVfQUZFX0NNRF9QT1JUX0NGR19QQVlMT0FEX1NJWkUgXAorCQkoc2l6ZW9mKHN0cnVjdCBjcGVfYWZlX2NtZF9wb3J0X2NmZykgLSBcCisJCSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQorCisjZGVmaW5lIENQRV9BRkVfQ01EX01PREVfUEFZTE9BRF9TSVpFIFwKKwkJKHNpemVvZihzdHJ1Y3QgY3BlX2FmZV9zdmNfY21kX21vZGUpIC0gXAorCQkgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKKyNkZWZpbmUgQ1BFX0NNRF9FUERfVEhSRVNfUExEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9lcGRfdGhyZXMpIC0gXAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQorI2RlZmluZSBDUEVfRVBEX1RIUkVTX1BBUkFNX1NJWkUgKChDUEVfQ01EX0VQRF9USFJFU19QTERfU0laRSkgLSBcCisJCQkJICBzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKKyNkZWZpbmUgQ1BFX0NNRF9PUE1PREVfUExEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9vcG1vZGUpIC0gXAorCQkJCSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQorI2RlZmluZSBDUEVfT1BNT0RFX1BBUkFNX1NJWkUgKChDUEVfQ01EX09QTU9ERV9QTERfU0laRSkgLVwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKKyNkZWZpbmUgQ1BFX0NNRF9DT05ORUNUUE9SVF9QTERfU0laRSBcCisJKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9jb25uZWN0cG9ydCkgLSBcCisJIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCisjZGVmaW5lIENQRV9DT05ORUNUUE9SVF9QQVJBTV9TSVpFICgoQ1BFX0NNRF9DT05ORUNUUE9SVF9QTERfU0laRSkgLSBcCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQorI2RlZmluZSBDUEVfQ01EX0dBSU5fUExEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9nYWluKSAtIFwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQorI2RlZmluZSBDUEVfR0FJTl9QQVJBTV9TSVpFICgoQ1BFX0NNRF9HQUlOX1BMRF9TSVpFKSAtIFwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCisjZGVmaW5lIENQRV9NRURJQV9GTVRfUExEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9tZWRpYV9mbXRfcGFyYW0pIC0gXAorCQkJCXNpemVvZihzdHJ1Y3QgY21pX2hkcikpCisjZGVmaW5lIENQRV9NRURJQV9GTVRfUEFSQU1fU0laRSAoKENQRV9NRURJQV9GTVRfUExEX1NJWkUpIC0gXAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCisjZW5kaWYgLyogX19DUEVfQ01JX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jcGVfY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jcGVfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWY1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL2NwZV9jb3JlLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DUEVfQ09SRV9IX18KKyNkZWZpbmUgX19DUEVfQ09SRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8c291bmQvbHNtX3BhcmFtcy5oPgorCitlbnVtIHsKKwlDTURfSU5JVF9TVEFURSA9IDAsCisJQ01EX1NFTlQsCisJQ01EX1JFU1BfUkNWRCwKK307CisKK2VudW0gd2NkX2NwZV9ldmVudCB7CisJV0NEX0NQRV9QUkVfRU5BQkxFID0gMSwKKwlXQ0RfQ1BFX1BPU1RfRU5BQkxFLAorCVdDRF9DUEVfUFJFX0RJU0FCTEUsCisJV0NEX0NQRV9QT1NUX0RJU0FCTEUsCit9OworCitzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgeworCXU4IHBvcnRfaWQ7CisJdTE2IGJpdF93aWR0aDsKKwl1MTYgbnVtX2NoYW5uZWxzOworCXUzMiBzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBsc21fb3V0X2ZtdF9jZmcgeworCXU4IGZvcm1hdDsKKwl1OCBwYWNrX21vZGU7CisJdTggZGF0YV9wYXRoX2V2ZW50czsKKwl1OCB0cmFuc2Zlcl9tb2RlOworfTsKKworc3RydWN0IGxzbV9od19wYXJhbXMgeworCXUzMiBzYW1wbGVfcmF0ZTsKKwl1MTYgbnVtX2NoczsKKwl1MTYgYml0X3dpZHRoOworfTsKKworc3RydWN0IGNwZV9sc21fc2Vzc2lvbiB7CisJLyogc291bmQgbW9kZWwgcmVsYXRlZCAqLworCXZvaWQgKnNuZF9tb2RlbF9kYXRhOworCXU4ICpjb25mX2xldmVsczsKKwl2b2lkICpjbWlfcmVnX2hhbmRsZTsKKworCS8qIENsaWVudHMgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAqcHJpdl9kOworCisJdm9pZCAoKmV2ZW50X2NiKSh2b2lkICpwcml2X2RhdGEsCisJCQkgIHU4IGRldGVjdF9zdGF0dXMsCisJCQkgIHU4IHNpemUsIHU4ICpwYXlsb2FkKTsKKworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9jb21wOworCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyBhZmVfcG9ydF9jZmc7CisJc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnIGFmZV9vdXRfcG9ydF9jZmc7CisJc3RydWN0IG11dGV4IGxzbV9sb2NrOworCisJdTMyIHNuZF9tb2RlbF9zaXplOworCXUzMiBsc21fbWVtX2hhbmRsZTsKKwl1MTYgY21kX2Vycl9jb2RlOworCXU4IGlkOworCXU4IG51bV9jb25maWRlbmNlX2xldmVsczsKKwl1MTYgYWZlX291dF9wb3J0X2lkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbHNtX2xhYl90aHJlYWQ7CisJYm9vbCBzdGFydGVkOworCisJdTMyIGxhYl9lbmFibGU7CisJc3RydWN0IGxzbV9vdXRfZm10X2NmZyBvdXRfZm10X2NmZzsKKworCWJvb2wgaXNfdG9wb2xvZ3lfdXNlZDsKK307CisKK3N0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgeworCWludCAoKmFmZV9zZXRfcGFyYW1zKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZywKKwkJCSAgICAgICBib29sIGFmZV9tYWRfY3RsKTsKKworCWludCAoKmFmZV9wb3J0X3N0YXJ0KSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7CisKKwlpbnQgKCphZmVfcG9ydF9zdG9wKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7CisKKwlpbnQgKCphZmVfcG9ydF9zdXNwZW5kKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7CisKKwlpbnQgKCphZmVfcG9ydF9yZXN1bWUpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJICAgICAgIHN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqY2ZnKTsKKworCWludCAoKmFmZV9wb3J0X2NtZF9jZmcpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqY2ZnKTsKK307CisKK3N0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgeworCisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKCpsc21fYWxsb2Nfc2Vzc2lvbikKKwkJCSh2b2lkICpjb3JlX2hhbmRsZSwgdm9pZCAqbHNtX3ByaXZfZCwKKwkJCSB2b2lkICgqZXZlbnRfY2IpKHZvaWQgKnByaXZfZGF0YSwKKwkJCQkJICAgdTggZGV0ZWN0X3N0YXR1cywKKwkJCQkJICAgdTggc2l6ZSwgdTggKnBheWxvYWQpKTsKKworCWludCAoKmxzbV9kZWFsbG9jX3Nlc3Npb24pCisJCSh2b2lkICpjb3JlX2hhbmRsZSwgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKKworCWludCAoKmxzbV9vcGVuX3R4KSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICosIHUxNiwgdTE2KTsKKworCWludCAoKmxzbV9jbG9zZV90eCkodm9pZCAqY29yZV9oYW5kbGUsCisJCQkgICAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKik7CisKKwlpbnQgKCpsc21fc2htZW1fYWxsb2MpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKiwgdTMyIHNpemUpOworCisJaW50ICgqbHNtX3NobWVtX2RlYWxsb2MpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKKworCWludCAoKmxzbV9yZWdpc3Rlcl9zbmRfbW9kZWwpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCSAgICAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICosCisJCQkJICAgICAgIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlLCBib29sKTsKKworCWludCAoKmxzbV9kZXJlZ2lzdGVyX3NuZF9tb2RlbCkodm9pZCAqY29yZV9oYW5kbGUsCisJCQkJCSBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICopOworCisJaW50ICgqbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJICAgICAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pOworCisJaW50ICgqbHNtX3N0YXJ0KSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKKworCWludCAoKmxzbV9zdG9wKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICopOworCisJaW50ICgqbHNtX2xhYl9jb250cm9sKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCSAgICAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKKworCWludCAoKmxhYl9jaF9zZXR1cCkodm9pZCAqY29yZV9oYW5kbGUsCisJCQkJICAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkgICBlbnVtIHdjZF9jcGVfZXZlbnQgZXZlbnQpOworCisJaW50ICgqbHNtX3NldF9kYXRhKSh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCQllbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBkZXRlY3RfbW9kZSwKKwkJCWJvb2wgZGV0ZWN0X2ZhaWx1cmUpOworCWludCAoKmxzbV9zZXRfZm10X2NmZykodm9pZCAqY29yZV9oYW5kbGUsCisJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKTsKKwlpbnQgKCpsc21fc2V0X29uZV9wYXJhbSkodm9pZCAqY29yZV9oYW5kbGUsCisJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvLAorCQkJdm9pZCAqZGF0YSwgZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlKTsKKwl2b2lkICgqbHNtX2dldF9zbmRfbW9kZWxfb2Zmc2V0KQorCQkodm9pZCAqY29yZV9oYW5kbGUsIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKiwKKwkJIHNpemVfdCAqb2Zmc2V0KTsKKwlpbnQgKCpsc21fc2V0X21lZGlhX2ZtdF9wYXJhbXMpKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCSAgICAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQkJCSAgICAgICBzdHJ1Y3QgbHNtX2h3X3BhcmFtcyAqcGFyYW0pOworCWludCAoKmxzbV9zZXRfcG9ydCkodm9pZCAqY29yZV9oYW5kbGUsCisJCQkgICAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwgdm9pZCAqZGF0YSk7Cit9OworCitpbnQgd2NkX2NwZV9nZXRfbHNtX29wcyhzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzKTsKK2ludCB3Y2RfY3BlX2dldF9hZmVfb3BzKHN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHMpOwordm9pZCAqd2NkX2NwZV9nZXRfY29yZV9oYW5kbGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jcGVfZXJyLmggYi9pbmNsdWRlL3NvdW5kL2NwZV9lcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU1ODAzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9jcGVfZXJyLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DUEVfRVJSX18KKyNkZWZpbmUgX19DUEVfRVJSX18KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKy8qIEVSUk9SIENPREVTICovCisvKiBTdWNjZXNzLiBUaGUgb3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9ycy4gKi8KKyNkZWZpbmUgQ1BFX0VPSyAgICAgICAgICAweDAwMDAwMDAwCisvKiBHZW5lcmFsIGZhaWx1cmUuICovCisjZGVmaW5lIENQRV9FRkFJTEVEICAgICAgMHgwMDAwMDAwMQorLyogQmFkIG9wZXJhdGlvbiBwYXJhbWV0ZXIuICovCisjZGVmaW5lIENQRV9FQkFEUEFSQU0gICAgMHgwMDAwMDAwMgorLyogVW5zdXBwb3J0ZWQgcm91dGluZSBvciBvcGVyYXRpb24uICovCisjZGVmaW5lIENQRV9FVU5TVVBQT1JURUQgMHgwMDAwMDAwMworLyogVW5zdXBwb3J0ZWQgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQ1BFX0VWRVJTSU9OICAgICAweDAwMDAwMDA0CisvKiBVbmV4cGVjdGVkIHByb2JsZW0gZW5jb3VudGVyZWQuICovCisjZGVmaW5lIENQRV9FVU5FWFBFQ1RFRCAgMHgwMDAwMDAwNQorLyogVW5oYW5kbGVkIHByb2JsZW0gb2NjdXJyZWQuICovCisjZGVmaW5lIENQRV9FUEFOSUMgICAgICAgMHgwMDAwMDAwNgorLyogVW5hYmxlIHRvIGFsbG9jYXRlIHJlc291cmNlLiAqLworI2RlZmluZSBDUEVfRU5PUkVTT1VSQ0UgIDB4MDAwMDAwMDcKKy8qIEludmFsaWQgaGFuZGxlLiAqLworI2RlZmluZSBDUEVfRUhBTkRMRSAgICAgIDB4MDAwMDAwMDgKKy8qIE9wZXJhdGlvbiBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQ1BFX0VBTFJFQURZICAgICAweDAwMDAwMDA5CisvKiBPcGVyYXRpb24gaXMgbm90IHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQ1BFX0VOT1RSRUFEWSAgICAweDAwMDAwMDBBCisvKiBPcGVyYXRpb24gaXMgcGVuZGluZyBjb21wbGV0aW9uLiAqLworI2RlZmluZSBDUEVfRVBFTkRJTkcgICAgIDB4MDAwMDAwMEIKKy8qIE9wZXJhdGlvbiBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgb3IgcHJvY2Vzc2VkLiAqLworI2RlZmluZSBDUEVfRUJVU1kgICAgICAgIDB4MDAwMDAwMEMKKy8qIE9wZXJhdGlvbiBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4gKi8KKyNkZWZpbmUgQ1BFX0VBQk9SVEVEICAgICAweDAwMDAwMDBECisvKiBPcGVyYXRpb24gcHJlZW1wdGVkIGJ5IGEgaGlnaGVyIHByaW9yaXR5LiAqLworI2RlZmluZSBDUEVfRVBSRUVNUFRFRCAgIDB4MDAwMDAwMEUKKy8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCisjZGVmaW5lIENQRV9FQ09OVElOVUUgICAgMHgwMDAwMDAwRgorLyogT3BlcmF0aW9uIHJlcXVlc3RzIGltbWVkaWF0ZSBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCisjZGVmaW5lIENQRV9FSU1NRURJQVRFICAgMHgwMDAwMDAxMAorLyogT3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4gKi8KKyNkZWZpbmUgQ1BFX0VOT1RJTVBMICAgICAweDAwMDAwMDExCisvKiBPcGVyYXRpb24gbmVlZHMgbW9yZSBkYXRhIG9yIHJlc291cmNlcy4gKi8KKyNkZWZpbmUgQ1BFX0VORUVETU9SRSAgICAweDAwMDAwMDEyCisvKiBPcGVyYXRpb24gZG9lcyBub3QgaGF2ZSBtZW1vcnkuICovCisjZGVmaW5lIENQRV9FTk9NRU1PUlkgICAgMHgwMDAwMDAxNAorLyogSXRlbSBkb2VzIG5vdCBleGlzdC4gKi8KKyNkZWZpbmUgQ1BFX0VOT1RFWElTVCAgICAweDAwMDAwMDE1CisvKiBPcGVyYXRpb24gaXMgZmluaXNoZWQuICovCisjZGVmaW5lIENQRV9FVEVSTUlOQVRFRCAgMHgwMDAwMDAxNgorLyogTWF4IGNvdW50IGZvciBhZHNwIGVycm9yIGNvZGUgc2VudCB0byBITE9TKi8KKyNkZWZpbmUgQ1BFX0VSUl9NQVggICAgICAoQ1BFX0VURVJNSU5BVEVEICsgMSkKKworCisvKiBFUlJPUiBTVFJJTkcgKi8KKy8qIFN1Y2Nlc3MuIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHdpdGggbm8gZXJyb3JzLiAqLworI2RlZmluZSBDUEVfRU9LX1NUUiAgICAgICAgICAiQ1BFX0VPSyIKKy8qIEdlbmVyYWwgZmFpbHVyZS4gKi8KKyNkZWZpbmUgQ1BFX0VGQUlMRURfU1RSICAgICAgIkNQRV9FRkFJTEVEIgorLyogQmFkIG9wZXJhdGlvbiBwYXJhbWV0ZXIuICovCisjZGVmaW5lIENQRV9FQkFEUEFSQU1fU1RSICAgICJDUEVfRUJBRFBBUkFNIgorLyogVW5zdXBwb3J0ZWQgcm91dGluZSBvciBvcGVyYXRpb24uICovCisjZGVmaW5lIENQRV9FVU5TVVBQT1JURURfU1RSICJDUEVfRVVOU1VQUE9SVEVEIgorLyogVW5zdXBwb3J0ZWQgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQ1BFX0VWRVJTSU9OX1NUUiAgICAgIkNQRV9FVkVSU0lPTiIKKy8qIFVuZXhwZWN0ZWQgcHJvYmxlbSBlbmNvdW50ZXJlZC4gKi8KKyNkZWZpbmUgQ1BFX0VVTkVYUEVDVEVEX1NUUiAgIkNQRV9FVU5FWFBFQ1RFRCIKKy8qIFVuaGFuZGxlZCBwcm9ibGVtIG9jY3VycmVkLiAqLworI2RlZmluZSBDUEVfRVBBTklDX1NUUiAgICAgICAiQ1BFX0VQQU5JQyIKKy8qIFVuYWJsZSB0byBhbGxvY2F0ZSByZXNvdXJjZS4gKi8KKyNkZWZpbmUgQ1BFX0VOT1JFU09VUkNFX1NUUiAgIkNQRV9FTk9SRVNPVVJDRSIKKy8qIEludmFsaWQgaGFuZGxlLiAqLworI2RlZmluZSBDUEVfRUhBTkRMRV9TVFIgICAgICAiQ1BFX0VIQU5ETEUiCisvKiBPcGVyYXRpb24gaXMgYWxyZWFkeSBwcm9jZXNzZWQuICovCisjZGVmaW5lIENQRV9FQUxSRUFEWV9TVFIgICAgICJDUEVfRUFMUkVBRFkiCisvKiBPcGVyYXRpb24gaXMgbm90IHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQ1BFX0VOT1RSRUFEWV9TVFIgICAgIkNQRV9FTk9UUkVBRFkiCisvKiBPcGVyYXRpb24gaXMgcGVuZGluZyBjb21wbGV0aW9uLiAqLworI2RlZmluZSBDUEVfRVBFTkRJTkdfU1RSICAgICAiQ1BFX0VQRU5ESU5HIgorLyogT3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBvciBwcm9jZXNzZWQuICovCisjZGVmaW5lIENQRV9FQlVTWV9TVFIgICAgICAgICJDUEVfRUJVU1kiCisvKiBPcGVyYXRpb24gYWJvcnRlZCBkdWUgdG8gYW4gZXJyb3IuICovCisjZGVmaW5lIENQRV9FQUJPUlRFRF9TVFIgICAgICJDUEVfRUFCT1JURUQiCisvKiBPcGVyYXRpb24gcHJlZW1wdGVkIGJ5IGEgaGlnaGVyIHByaW9yaXR5LiAqLworI2RlZmluZSBDUEVfRVBSRUVNUFRFRF9TVFIgICAiQ1BFX0VQUkVFTVBURUQiCisvKiBPcGVyYXRpb24gcmVxdWVzdHMgaW50ZXJ2ZW50aW9uIHRvIGNvbXBsZXRlLiAqLworI2RlZmluZSBDUEVfRUNPTlRJTlVFX1NUUiAgICAiQ1BFX0VDT05USU5VRSIKKy8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbW1lZGlhdGUgaW50ZXJ2ZW50aW9uIHRvIGNvbXBsZXRlLiAqLworI2RlZmluZSBDUEVfRUlNTUVESUFURV9TVFIgICAiQ1BFX0VJTU1FRElBVEUiCisvKiBPcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiAqLworI2RlZmluZSBDUEVfRU5PVElNUExfU1RSICAgICAiQ1BFX0VOT1RJTVBMIgorLyogT3BlcmF0aW9uIG5lZWRzIG1vcmUgZGF0YSBvciByZXNvdXJjZXMuICovCisjZGVmaW5lIENQRV9FTkVFRE1PUkVfU1RSICAgICJDUEVfRU5FRURNT1JFIgorLyogT3BlcmF0aW9uIGRvZXMgbm90IGhhdmUgbWVtb3J5LiAqLworI2RlZmluZSBDUEVfRU5PTUVNT1JZX1NUUiAgICAiQ1BFX0VOT01FTU9SWSIKKy8qIEl0ZW0gZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lIENQRV9FTk9URVhJU1RfU1RSICAgICJDUEVfRU5PVEVYSVNUIgorLyogT3BlcmF0aW9uIGlzIGZpbmlzaGVkLiAqLworI2RlZmluZSBDUEVfRVRFUk1JTkFURURfU1RSICAiQ1BFX0VURVJNSU5BVEVEIgorLyogVW5leHBlY3RlZCBlcnJvciBjb2RlLiAqLworI2RlZmluZSBDUEVfRVJSX01BWF9TVFIgICAgICAiQ1BFX0VSUl9NQVgiCisKKworc3RydWN0IGNwZV9lcnJfY29kZSB7CisJaW50ICAgICBsbnhfZXJyX2NvZGU7CisJY2hhciAgICAqY3BlX2Vycl9zdHI7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3BlX2Vycl9jb2RlIGNwZV9lcnJfY29kZV9pbmZvW0NQRV9FUlJfTUFYKzFdID0geworCXsgMCwgQ1BFX0VPS19TVFJ9LAorCXsgLUVOT1RSRUNPVkVSQUJMRSwgQ1BFX0VGQUlMRURfU1RSfSwKKwl7IC1FSU5WQUwsIENQRV9FQkFEUEFSQU1fU1RSfSwKKwl7IC1FT1BOT1RTVVBQLCBDUEVfRVVOU1VQUE9SVEVEX1NUUn0sCisJeyAtRU5PUFJPVE9PUFQsIENQRV9FVkVSU0lPTl9TVFJ9LAorCXsgLUVOT1RSRUNPVkVSQUJMRSwgQ1BFX0VVTkVYUEVDVEVEX1NUUn0sCisJeyAtRU5PVFJFQ09WRVJBQkxFLCBDUEVfRVBBTklDX1NUUn0sCisJeyAtRU5PU1BDLCBDUEVfRU5PUkVTT1VSQ0VfU1RSfSwKKwl7IC1FQkFEUiwgQ1BFX0VIQU5ETEVfU1RSfSwKKwl7IC1FQUxSRUFEWSwgQ1BFX0VBTFJFQURZX1NUUn0sCisJeyAtRVBFUk0sIENQRV9FTk9UUkVBRFlfU1RSfSwKKwl7IC1FSU5QUk9HUkVTUywgQ1BFX0VQRU5ESU5HX1NUUn0sCisJeyAtRUJVU1ksIENQRV9FQlVTWV9TVFJ9LAorCXsgLUVDQU5DRUxFRCwgQ1BFX0VBQk9SVEVEX1NUUn0sCisJeyAtRUFHQUlOLCBDUEVfRVBSRUVNUFRFRF9TVFJ9LAorCXsgLUVBR0FJTiwgQ1BFX0VDT05USU5VRV9TVFJ9LAorCXsgLUVBR0FJTiwgQ1BFX0VJTU1FRElBVEVfU1RSfSwKKwl7IC1FQUdBSU4sIENQRV9FTk9USU1QTF9TVFJ9LAorCXsgLUVOT0RBVEEsIENQRV9FTkVFRE1PUkVfU1RSfSwKKwl7IC1FQURWLCBDUEVfRVJSX01BWF9TVFJ9LAorCXsgLUVOT01FTSwgQ1BFX0VOT01FTU9SWV9TVFJ9LAorCXsgLUVOT0RFViwgQ1BFX0VOT1RFWElTVF9TVFJ9LAorCXsgLUVBRFYsIENQRV9FVEVSTUlOQVRFRF9TVFJ9LAorCXsgLUVBRFYsIENQRV9FUlJfTUFYX1NUUn0sCit9OworCitzdGF0aWMgaW5saW5lIGludCBjcGVfZXJyX2dldF9sbnhfZXJyX2NvZGUodTMyIGNwZV9lcnJvcikKK3sKKwlpZiAoY3BlX2Vycm9yID4gQ1BFX0VSUl9NQVgpCisJCXJldHVybiBjcGVfZXJyX2NvZGVfaW5mb1tDUEVfRVJSX01BWF0ubG54X2Vycl9jb2RlOworCWVsc2UKKwkJcmV0dXJuIGNwZV9lcnJfY29kZV9pbmZvW2NwZV9lcnJvcl0ubG54X2Vycl9jb2RlOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmNwZV9lcnJfZ2V0X2Vycl9zdHIodTMyIGNwZV9lcnJvcikKK3sKKwlpZiAoY3BlX2Vycm9yID4gQ1BFX0VSUl9NQVgpCisJCXJldHVybiBjcGVfZXJyX2NvZGVfaW5mb1tDUEVfRVJSX01BWF0uY3BlX2Vycl9zdHI7CisJZWxzZQorCQlyZXR1cm4gY3BlX2Vycl9jb2RlX2luZm9bY3BlX2Vycm9yXS5jcGVfZXJyX3N0cjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL21zbS1hdWRpby1lZmZlY3RzLXE2LXYyLmggYi9pbmNsdWRlL3NvdW5kL21zbS1hdWRpby1lZmZlY3RzLXE2LXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjMjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfTVNNX0FVRElPX0VGRkVDVFNfSAorI2RlZmluZSBfTVNNX0FVRElPX0VGRkVDVFNfSAorCisjaW5jbHVkZSA8c291bmQvYXVkaW9fZWZmZWN0cy5oPgorCisjZGVmaW5lIE1BWF9QUF9QQVJBTVNfU1ogICAxMjgKKworYm9vbCBtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoaW50IGVmZmVjdF9tb2R1bGUsCisJCQkJCQlpbnQgdG9wb2xvZ3kpOworCitpbnQgbXNtX2F1ZGlvX2VmZmVjdHNfZW5hYmxlX2V4dG4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkgICAgIHN0cnVjdCBtc21fbnRfZWZmX2FsbF9jb25maWcgKmVmZmVjdHMsCisJCQkgICAgIGJvb2wgZmxhZyk7CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c19yZXZlcmJfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkgICAgIHN0cnVjdCByZXZlcmJfcGFyYW1zICpyZXZlcmIsCisJCQkJICAgICBsb25nICp2YWx1ZXMpOworCitpbnQgbXNtX2F1ZGlvX2VmZmVjdHNfYmFzc19ib29zdF9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQlzdHJ1Y3QgYmFzc19ib29zdF9wYXJhbXMgKmJhc3NfYm9vc3QsCisJCQkJCWxvbmcgKnZhbHVlcyk7CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c19wYmVfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJc3RydWN0IHBiZV9wYXJhbXMgKnBiZSwKKwkJCQkJbG9uZyAqdmFsdWVzKTsKKworaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZpcnR1YWxpemVyX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJc3RydWN0IHZpcnR1YWxpemVyX3BhcmFtcyAqdmlydHVhbGl6ZXIsCisJCQkJbG9uZyAqdmFsdWVzKTsKKworaW50IG1zbV9hdWRpb19lZmZlY3RzX3BvcGxlc3NfZXFfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJIHN0cnVjdCBlcV9wYXJhbXMgKmVxLAorCQkJCQkgbG9uZyAqdmFsdWVzKTsKKworaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCSAgICAgc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyAqdm9sLAorCQkJCSAgICAgbG9uZyAqdmFsdWVzKTsKKworaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQlzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zICp2b2wsCisJCQkJCWxvbmcgKnZhbHVlcywgaW50IGluc3RhbmNlKTsKKyNlbmRpZiAvKl9NU01fQVVESU9fRUZGRUNUU19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXNtLWRhaS1xNi12Mi5oIGIvaW5jbHVkZS9zb3VuZC9tc20tZGFpLXE2LXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkNzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvbXNtLWRhaS1xNi12Mi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NU01fREFJX1E2X1BEQVRBX0hfXworCisjZGVmaW5lIF9fTVNNX0RBSV9RNl9QREFUQV9IX18KKworI2RlZmluZSBNU01fTUkyU19TRDAgKDEgPDwgMCkKKyNkZWZpbmUgTVNNX01JMlNfU0QxICgxIDw8IDEpCisjZGVmaW5lIE1TTV9NSTJTX1NEMiAoMSA8PCAyKQorI2RlZmluZSBNU01fTUkyU19TRDMgKDEgPDwgMykKKyNkZWZpbmUgTVNNX01JMlNfQ0FQX1JYIDAKKyNkZWZpbmUgTVNNX01JMlNfQ0FQX1RYIDEKKworI2RlZmluZSBNU01fUFJJTV9NSTJTIDAKKyNkZWZpbmUgTVNNX1NFQ19NSTJTICAxCisjZGVmaW5lIE1TTV9URVJUX01JMlMgMgorI2RlZmluZSBNU01fUVVBVF9NSTJTICAzCisjZGVmaW5lIE1TTV9TRUNfTUkyU19TRDEgIDQKKyNkZWZpbmUgTVNNX1FVSU5fTUkyUyAgNQorI2RlZmluZSBNU01fU0VOQVJZX01JMlMgIDYKKyNkZWZpbmUgTVNNX0lOVDBfTUkyUyAgNworI2RlZmluZSBNU01fSU5UMV9NSTJTICA4CisjZGVmaW5lIE1TTV9JTlQyX01JMlMgIDkKKyNkZWZpbmUgTVNNX0lOVDNfTUkyUyAgMTAKKyNkZWZpbmUgTVNNX0lOVDRfTUkyUyAgMTEKKyNkZWZpbmUgTVNNX0lOVDVfTUkyUyAgMTIKKyNkZWZpbmUgTVNNX0lOVDZfTUkyUyAgMTMKKyNkZWZpbmUgTVNNX01JMlNfTUlOIE1TTV9QUklNX01JMlMKKyNkZWZpbmUgTVNNX01JMlNfTUFYIE1TTV9JTlQ2X01JMlMKKworc3RydWN0IG1zbV9kYWlfYXV4cGNtX2NvbmZpZyB7CisJdTE2IG1vZGU7CisJdTE2IHN5bmM7CisJdTE2IGZyYW1lOworCXUxNiBxdWFudDsKKwl1MTYgbnVtX3Nsb3RzOworCXUxNiAqc2xvdF9tYXBwaW5nOworCXUxNiBkYXRhOworCXUzMiBwY21fY2xrX3JhdGU7Cit9OworCitzdHJ1Y3QgbXNtX2RhaV9hdXhwY21fcGRhdGEgeworCXN0cnVjdCBtc21fZGFpX2F1eHBjbV9jb25maWcgbW9kZV84azsKKwlzdHJ1Y3QgbXNtX2RhaV9hdXhwY21fY29uZmlnIG1vZGVfMTZrOworfTsKKworc3RydWN0IG1zbV9taTJzX3BkYXRhIHsKKwl1MTYgcnhfc2RfbGluZXM7CisJdTE2IHR4X3NkX2xpbmVzOworCXUxNiBpbnRmX2lkOworfTsKKworc3RydWN0IG1zbV9pMnNfZGF0YSB7CisJdTMyIGNhcGFiaWxpdHk7IC8qIFJYIG9yIFRYICovCisJdTE2IHNkX2xpbmVzOworfTsKKworc3RydWN0IG1zbV9kYWlfdGRtX2dyb3VwX2NvbmZpZyB7CisJdTE2IGdyb3VwX2lkOworCXUxNiBudW1fcG9ydHM7CisJdTE2ICpwb3J0X2lkOworCXUzMiBjbGtfcmF0ZTsKK307CisKK3N0cnVjdCBtc21fZGFpX3RkbV9jb25maWcgeworCXUxNiBzeW5jX21vZGU7CisJdTE2IHN5bmNfc3JjOworCXUxNiBkYXRhX291dDsKKwl1MTYgaW52ZXJ0X3N5bmM7CisJdTE2IGRhdGFfZGVsYXk7CisJdTMyIGRhdGFfYWxpZ247CisJdTE2IGhlYWRlcl9zdGFydF9vZmZzZXQ7CisJdTE2IGhlYWRlcl93aWR0aDsKKwl1MTYgaGVhZGVyX251bV9mcmFtZV9yZXBlYXQ7Cit9OworCitzdHJ1Y3QgbXNtX2RhaV90ZG1fcGRhdGEgeworCXN0cnVjdCBtc21fZGFpX3RkbV9ncm91cF9jb25maWcgZ3JvdXBfY29uZmlnOworCXN0cnVjdCBtc21fZGFpX3RkbV9jb25maWcgY29uZmlnOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL21zbS1kdHMtZWFnbGUuaCBiL2luY2x1ZGUvc291bmQvbXNtLWR0cy1lYWdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjAxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL21zbS1kdHMtZWFnbGUuaApAQCAtMCwwICsxLDE0OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NU01fRFRTX0VBR0xFX0hfXworI2RlZmluZSBfX01TTV9EVFNfRUFHTEVfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9kZXZkZXBfcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKK2VudW0geworCURUU19FQUdMRV9JT0NUTF9HRVRfQ0FDSEVfU0laRTMyID0gX0lPUigweEYyLCAwLCBfX3MzMiksCisJRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9TSVpFMzIgPSBfSU9XKDB4RjIsIDEsIF9fczMyKSwKKwlEVFNfRUFHTEVfSU9DVExfR0VUX1BBUkFNMzIgPSBfSU9SKDB4RjIsIDIsIGNvbXBhdF91cHRyX3QpLAorCURUU19FQUdMRV9JT0NUTF9TRVRfUEFSQU0zMiA9IF9JT1coMHhGMiwgMywgY29tcGF0X3VwdHJfdCksCisJRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9CTE9DSzMyID0KKwkJCQlfSU9XKDB4RjIsIDQsIGNvbXBhdF91cHRyX3QpLAorCURUU19FQUdMRV9JT0NUTF9TRVRfQUNUSVZFX0RFVklDRTMyID0KKwkJCQlfSU9XKDB4RjIsIDUsIGNvbXBhdF91cHRyX3QpLAorCURUU19FQUdMRV9JT0NUTF9HRVRfTElDRU5TRTMyID0KKwkJCQlfSU9SKDB4RjIsIDYsIGNvbXBhdF91cHRyX3QpLAorCURUU19FQUdMRV9JT0NUTF9TRVRfTElDRU5TRTMyID0KKwkJCQkgX0lPVygweEYyLCA3LCBjb21wYXRfdXB0cl90KSwKKwlEVFNfRUFHTEVfSU9DVExfU0VORF9MSUNFTlNFMzIgPSBfSU9XKDB4RjIsIDgsIF9fczMyKSwKKwlEVFNfRUFHTEVfSU9DVExfU0VUX1ZPTFVNRV9DT01NQU5EUzMyID0gX0lPVygweEYyLCA5LAorCQkJCQkJICAgICBjb21wYXRfdXB0cl90KSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19EVFNfRUFHTEUKK3ZvaWQgbXNtX2R0c19pb25fbWVtbWFwKHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwb18pOworaW50IG1zbV9kdHNfZWFnbGVfZW5hYmxlX2FzbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdTMyIGVuYWJsZSwgaW50IG1vZHVsZSk7CitpbnQgbXNtX2R0c19lYWdsZV9lbmFibGVfYWRtKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIHUzMiBlbmFibGUpOwordm9pZCBtc21fZHRzX2VhZ2xlX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pOworaW50IG1zbV9kdHNfZWFnbGVfc2V0X3N0cmVhbV9nYWluKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCSAgaW50IGxnYWluLCBpbnQgcmdhaW4pOworaW50IG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FzbShzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKmRlcGQsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgYm9vbCBmb3JfcHJlLCBib29sIGdldCwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkgICAgIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbyk7CitpbnQgbXNtX2R0c19lYWdsZV9oYW5kbGVfYWRtKHN0cnVjdCBkdHNfZWFnbGVfcGFyYW1fZGVzYyAqZGVwZCwgY2hhciAqYnVmLAorCQkJICAgICBib29sIGZvcl9wcmUsIGJvb2wgZ2V0KTsKK2ludCBtc21fZHRzX2VhZ2xlX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2ludCBtc21fZHRzX2VhZ2xlX2lzX2hweF9vbih2b2lkKTsKK2ludCBtc21fZHRzX2VhZ2xlX2luaXRfcHJlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKK2ludCBtc21fZHRzX2VhZ2xlX2RlaW5pdF9wcmUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOworaW50IG1zbV9kdHNfZWFnbGVfaW5pdF9wb3N0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZCk7CitpbnQgbXNtX2R0c19lYWdsZV9kZWluaXRfcG9zdChpbnQgcG9ydF9pZCwgaW50IHRvcG9sb2d5KTsKK2ludCBtc21fZHRzX2VhZ2xlX2luaXRfbWFzdGVyX21vZHVsZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7CitpbnQgbXNtX2R0c19lYWdsZV9kZWluaXRfbWFzdGVyX21vZHVsZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7CitpbnQgbXNtX2R0c19lYWdsZV9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKTsKK3ZvaWQgbXNtX2R0c19lYWdsZV9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKK2ludCBtc21fZHRzX2VhZ2xlX2NvbXBhdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG1zbV9kdHNfaW9uX21lbW1hcChzdHJ1Y3QgcGFyYW1fb3V0YmFuZCAqcG9fKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9lbmFibGVfYXNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgICB1MzIgZW5hYmxlLCBpbnQgbW9kdWxlKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9lbmFibGVfYWRtKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkJCSAgIHUzMiBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2R0c19lYWdsZV9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9zZXRfc3RyZWFtX2dhaW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCQlpbnQgbGdhaW4sIGludCByZ2FpbikKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FzbShzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKmRlcGQsCisJCQkJCSAgIGNoYXIgKmJ1ZiwgYm9vbCBmb3JfcHJlLCBib29sIGdldCwKKwkJCQkJICAgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FkbShzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKmRlcGQsCisJCQkJCSAgIGNoYXIgKmJ1ZiwgYm9vbCBmb3JfcHJlLCBib29sIGdldCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9kdHNfZWFnbGVfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIC1FUEVSTTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9kdHNfZWFnbGVfaXNfaHB4X29uKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBtc21fZHRzX2VhZ2xlX2luaXRfcHJlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9kZWluaXRfcHJlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9pbml0X3Bvc3QoaW50IHBvcnRfaWQsIGludCBjb3BwaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBtc21fZHRzX2VhZ2xlX2RlaW5pdF9wb3N0KGludCBwb3J0X2lkLCBpbnQgdG9wb2xvZ3kpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBtc21fZHRzX2VhZ2xlX2luaXRfbWFzdGVyX21vZHVsZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9kdHNfZWFnbGVfZGVpbml0X21hc3Rlcl9tb2R1bGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBtc21fZHRzX2VhZ2xlX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2R0c19lYWdsZV9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2R0c19lYWdsZV9jb21wYXRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwKKwkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL21zbS1zbGltLWRtYS5oIGIvaW5jbHVkZS9zb3VuZC9tc20tc2xpbS1kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYzOTRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9tc20tc2xpbS1kbWEuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9NU01fU0xJTUJVU19ETUFfSAorI2RlZmluZSBfTVNNX1NMSU1CVVNfRE1BX0gKKworI2luY2x1ZGUgPGxpbnV4L3NsaW1idXMvc2xpbWJ1cy5oPgorCisvKgorICogc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhIC0gRE1BIGRhdGEgZm9yIHNsaW1idXMgZGF0YSB0cmFuc2ZlcgorICoKKyAqIEBzZGV2OiBIYW5kbGUgdG8gdGhlIHNsaW1fZGV2aWNlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqCSAgZGF0YSB0cmFuc2Zlci4KKyAqIEBwaDoJUG9ydCBoYW5kbGUgZm9yIHRoZSBzbGltYnVzIHBvcnRzLgorICogQGRhaV9jaGFubmVsX2N0bDogY2FsbGJhY2sgZnVuY3Rpb24gaW50byB0aGUgQ1BVIGRhaSBkcml2ZXIKKyAqCQkgICAgIHRvIHNldHVwIHRoZSBkYXRhIHBhdGguCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzaGFyZSB0aGUgc2xpbWJ1cyBwb3J0IGhhbmRsZXMgYW5kCisgKiBvdGhlciBkYXRhIHBhdGggc2V0dXAgcmVsYXRlZCBoYW5kbGVzIHdpdGggb3RoZXIgZHJpdmVycy4KKyAqLworc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhIHsKKworCS8qIEhhbmRsZSB0byBzbGltYnVzIGRldmljZSAqLworCXN0cnVjdCBzbGltX2RldmljZSAqc2RldjsKKworCS8qIFBvcnQgSGFuZGxlICovCisJdTMyIHBoOworCisJLyogQ2FsbGJhY2sgZm9yIGRhdGEgY2hhbm5lbCBjb250cm9sICovCisJaW50ICgqZGFpX2NoYW5uZWxfY3RsKShzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgKmRtYV9kYXRhLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBib29sIGVuYWJsZSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcTZhZG0tdjIuaCBiL2luY2x1ZGUvc291bmQvcTZhZG0tdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE0MjlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9xNmFkbS12Mi5oCkBAIC0wLDAgKzEsMTU2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX1E2X0FETV9WMl9IX18KKyNkZWZpbmUgX19RNl9BRE1fVjJfSF9fCisKKworI2RlZmluZSBBRE1fUEFUSF9QTEFZQkFDSyAweDEKKyNkZWZpbmUgQURNX1BBVEhfTElWRV9SRUMgMHgyCisjZGVmaW5lIEFETV9QQVRIX05PTkxJVkVfUkVDIDB4MworI2RlZmluZSBBRE1fUEFUSF9DT01QUkVTU0VEX1JYIDB4NQorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvcnRhYy5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhdWRpby12Mi5oPgorCisjZGVmaW5lIE1BWF9NT0RVTEVTX0lOX1RPUE8gMTYKKyNkZWZpbmUgQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSFwKKwkJKChNQVhfTU9EVUxFU19JTl9UT1BPICsgMSkgKiBzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBBVURfUFJPQ19CTE9DS19TSVpFCTQwOTYKKyNkZWZpbmUgQVVEX1ZPTF9CTE9DS19TSVpFCTQwOTYKKyNkZWZpbmUgQVVESU9fUlhfQ0FMSUJSQVRJT05fU0laRQkoQVVEX1BST0NfQkxPQ0tfU0laRSArIFwKKwkJCQkJCUFVRF9WT0xfQkxPQ0tfU0laRSkKK2VudW0geworCUFETV9DVVNUT01fVE9QX0NBTCA9IDAsCisJQURNX0FVRFBST0NfQ0FMLAorCUFETV9BVURWT0xfQ0FMLAorCUFETV9SVEFDX0lORk9fQ0FMLAorCUFETV9SVEFDX0FQUl9DQUwsCisJQURNX0RUU19FQUdMRSwKKwlBRE1fU1JTX1RSVU1FRElBLAorCUFETV9SVEFDX0FVRFZPTF9DQUwsCisJQURNX01BWF9DQUxfVFlQRVMKK307CisKK2VudW0geworCUFETV9NRU1fTUFQX0lOREVYX1NPVVJDRV9UUkFDS0lORyA9IEFETV9NQVhfQ0FMX1RZUEVTLAorCUFETV9NRU1fTUFQX0lOREVYX01BWAorfTsKKworZW51bSB7CisJQURNX0NMSUVOVF9JRF9ERUZBVUxUID0gMCwKKwlBRE1fQ0xJRU5UX0lEX1NPVVJDRV9UUkFDS0lORywKKwlBRE1fQ0xJRU5UX0lEX01BWCwKK307CisKKyNkZWZpbmUgTUFYX0NPUFBTX1BFUl9QT1JUIDB4OAorI2RlZmluZSBBRE1fTUFYX0NIQU5ORUxTIDgKKworLyogbXVsdGlwbGUgY29wcCBwZXIgc3RyZWFtLiAqLworc3RydWN0IHJvdXRlX3BheWxvYWQgeworCXVuc2lnbmVkIGludCBjb3BwX2lkeFtNQVhfQ09QUFNfUEVSX1BPUlRdOworCXVuc2lnbmVkIGludCBwb3J0X2lkW01BWF9DT1BQU19QRVJfUE9SVF07CisJaW50IGFwcF90eXBlOworCWludCBhY2RiX2Rldl9pZDsKKwlpbnQgc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgc2hvcnQgbnVtX2NvcHBzOworCXVuc2lnbmVkIGludCBzZXNzaW9uX2lkOworfTsKKworaW50IHNyc190cnVtZWRpYV9vcGVuKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIF9fczMyIHNyc190ZWNoX2lkLAorCQkgICAgICB2b2lkICpzcnNfcGFyYW1zKTsKKworaW50IGFkbV9kdHNfZWFnbGVfc2V0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXJhbV9pZCwKKwkJICAgICAgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZSk7CisKK2ludCBhZG1fZHRzX2VhZ2xlX2dldChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgcGFyYW1faWQsCisJCSAgICAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUpOworCit2b2lkIGFkbV9jb3BwX21mY19jZmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGRzdF9zYW1wbGVfcmF0ZSk7CisKK2ludCBhZG1fZ2V0X3BhcmFtcyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCB1aW50MzJfdCBtb2R1bGVfaWQsCisJCSAgIHVpbnQzMl90IHBhcmFtX2lkLCB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoLCBjaGFyICpwYXJhbXMpOworCitpbnQgYWRtX3NlbmRfcGFyYW1zX3Y1KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGNoYXIgKnBhcmFtcywKKwkJCSAgICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpOworCitpbnQgYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBjaGFyICpwYXJhbXMsCisJCQkgICAgICB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKTsKKworaW50IGFkbV9vcGVuKGludCBwb3J0LCBpbnQgcGF0aCwgaW50IHJhdGUsIGludCBtb2RlLCBpbnQgdG9wb2xvZ3ksCisJCQkgICBpbnQgcGVyZl9tb2RlLCB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkgICBpbnQgYXBwX3R5cGUsIGludCBhY2RiZGV2X2lkKTsKKworaW50IGFkbV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKKworaW50IGFkbV91bm1hcF9ydGFjX2Jsb2NrKHVpbnQzMl90ICptZW1fbWFwX2hhbmRsZSk7CisKK2ludCBhZG1fY2xvc2UoaW50IHBvcnQsIGludCB0b3BvbG9neSwgaW50IHBlcmZfbW9kZSk7CisKK2ludCBhZG1fbWF0cml4X21hcChpbnQgcGF0aCwgc3RydWN0IHJvdXRlX3BheWxvYWQgcGF5bG9hZF9tYXAsCisJCSAgIGludCBwZXJmX21vZGUpOworCitpbnQgYWRtX2Nvbm5lY3RfYWZlX3BvcnQoaW50IG1vZGUsIGludCBzZXNzaW9uX2lkLCBpbnQgcG9ydF9pZCk7CisKK3ZvaWQgYWRtX2VjX3JlZl9yeF9pZChpbnQgIHBvcnRfaWQpOworCitpbnQgYWRtX2dldF9sb3dsYXRlbmN5X2NvcHBfaWQoaW50IHBvcnRfaWQpOworCitpbnQgYWRtX3NldF9tdWx0aV9jaF9tYXAoY2hhciAqY2hhbm5lbF9tYXAsIGludCBwYXRoKTsKKworaW50IGFkbV9nZXRfbXVsdGlfY2hfbWFwKGNoYXIgKmNoYW5uZWxfbWFwLCBpbnQgcGF0aCk7CisKK2ludCBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KGludCBwb3J0X2lkKTsKKworaW50IGFkbV9nZXRfZGVmYXVsdF9jb3BwX2lkeChpbnQgcG9ydF9pZCk7CisKK2ludCBhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2Zyb21fY29wcF9pZChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWQpOworCitpbnQgYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKKworaW50IGFkbV9nZXRfaW5kZXhlc19mcm9tX2NvcHBfaWQoaW50IGNvcHBfaWQsIGludCAqcG9ydF9pZHgsIGludCAqY29wcF9pZHgpOworCitpbnQgYWRtX3NldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlbyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCwKKwkJCQkgICAgY2hhciAqcGFyYW1zLCB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKTsKKworaW50IGFkbV9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQzMl90IHBhcmFtX2xlbmd0aCwKKwkJCQljaGFyICpwYXJhbXMpOworCitpbnQgYWRtX3NldF92b2x1bWUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHZvbHVtZSk7CisKK2ludCBhZG1fc2V0X3NvZnR2b2x1bWUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJICAgICAgIHN0cnVjdCBhdWRwcm9jX3NvZnR2b2x1bWVfcGFyYW1zICpzb2Z0dm9sX3BhcmFtKTsKKworaW50IGFkbV9wYXJhbV9lbmFibGUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IG1vZHVsZV9pZCwgIGludCBlbmFibGUpOworCitpbnQgYWRtX3NlbmRfY2FsaWJyYXRpb24oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhdGgsIGludCBwZXJmX21vZGUsCisJCQkgaW50IGNhbF90eXBlLCBjaGFyICpwYXJhbXMsIGludCBzaXplKTsKKworaW50IGFkbV9zZXRfd2FpdF9wYXJhbWV0ZXJzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpOworCitpbnQgYWRtX3Jlc2V0X3dhaXRfcGFyYW1ldGVycyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKKworaW50IGFkbV93YWl0X3RpbWVvdXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHdhaXRfdGltZSk7CisKK2ludCBhZG1fc3RvcmVfY2FsX2RhdGEoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhdGgsIGludCBwZXJmX21vZGUsCisJCSAgICAgICBpbnQgY2FsX3R5cGUsIGNoYXIgKnBhcmFtcywgaW50ICpzaXplKTsKKworaW50IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgYm9vbCBtdXRlX29uKTsKKworaW50IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3koaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGxhdGVuY3kpOworaW50IGFkbV9zZXRfc291bmRfZm9jdXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YSk7CitpbnQgYWRtX2dldF9zb3VuZF9mb2N1cyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSk7CitpbnQgYWRtX2dldF9zb3VyY2VfdHJhY2tpbmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCSAgICBzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpOworI2VuZGlmIC8qIF9fUTZfQURNX1YyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmFmZS12Mi5oIGIvaW5jbHVkZS9zb3VuZC9xNmFmZS12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2U3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3E2YWZlLXYyLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fUTZBRkVfVjJfSF9fCisjZGVmaW5lIF9fUTZBRkVfVjJfSF9fCisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9ydGFjLmg+CisKKyNkZWZpbmUgSU4JCQkweDAwMAorI2RlZmluZSBPVVQJCQkweDAwMQorI2RlZmluZSBNU01fQUZFX01PTk8gICAgICAgIDAKKyNkZWZpbmUgTVNNX0FGRV9DSF9TVEVSRU8gICAxCisjZGVmaW5lIE1TTV9BRkVfTU9OT19SSUdIVCAgMQorI2RlZmluZSBNU01fQUZFX01PTk9fTEVGVCAgIDIKKyNkZWZpbmUgTVNNX0FGRV9TVEVSRU8gICAgICAzCisjZGVmaW5lIE1TTV9BRkVfNENIQU5ORUxTICAgNAorI2RlZmluZSBNU01fQUZFXzZDSEFOTkVMUyAgIDYKKyNkZWZpbmUgTVNNX0FGRV84Q0hBTk5FTFMgICA4CisKKyNkZWZpbmUgTVNNX0FGRV9JMlNfRk9STUFUX0xQQ00JCTAKKyNkZWZpbmUgTVNNX0FGRV9JMlNfRk9STUFUX0NPTVBSCQkxCisjZGVmaW5lIE1TTV9BRkVfSTJTX0ZPUk1BVF9JRUM2MDk1OF9MUENNCTIKKyNkZWZpbmUgTVNNX0FGRV9JMlNfRk9STUFUX0lFQzYwOTU4X0NPTVBSCTMKKworI2RlZmluZSBNU01fQUZFX1BPUlRfVFlQRV9SWCAwCisjZGVmaW5lIE1TTV9BRkVfUE9SVF9UWVBFX1RYIDEKKworI2RlZmluZSBSVF9QUk9YWV9EQUlfMDAxX1JYCTB4RTAKKyNkZWZpbmUgUlRfUFJPWFlfREFJXzAwMV9UWAkweEYwCisjZGVmaW5lIFJUX1BST1hZX0RBSV8wMDJfUlgJMHhGMQorI2RlZmluZSBSVF9QUk9YWV9EQUlfMDAyX1RYCTB4RTEKKyNkZWZpbmUgVklSVFVBTF9JRF9UT19QT1JUSUQodmFsKSAoKHZhbCAmIDB4RikgfCAweDIwMDApCisKKyNkZWZpbmUgQUZFX0NMS19WRVJTSU9OX1YxICAgIDEKKyNkZWZpbmUgQUZFX0NMS19WRVJTSU9OX1YyICAgIDIKKworZW51bSB7CisJLyogSURYIDAtPjQgKi8KKwlJRFhfUFJJTUFSWV9JMlNfUlgsCisJSURYX1BSSU1BUllfSTJTX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWCwKKwlJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFgsCisJSURYX1NFQ09OREFSWV9JMlNfUlgsCisJLyogSURYIDUtPjkgKi8KKwlJRFhfU0VDT05EQVJZX0kyU19UWCwKKwlJRFhfTUkyU19SWCwKKwlJRFhfTUkyU19UWCwKKwlJRFhfSERNSV9SWCwKKwlJRFhfUlNWRF8yLAorCS8qIElEWCAxMC0+MTQgKi8KKwlJRFhfUlNWRF8zLAorCUlEWF9ESUdJX01JQ19UWCwKKwlJRFhfVk9JQ0VfUkVDT1JEX1JYLAorCUlEWF9WT0lDRV9SRUNPUkRfVFgsCisJSURYX1ZPSUNFX1BMQVlCQUNLX1RYLAorCS8qIElEWCAxNS0+MTkgKi8KKwlJRFhfU0xJTUJVU18wX1JYLAorCUlEWF9TTElNQlVTXzBfVFgsCisJSURYX1NMSU1CVVNfMV9SWCwKKwlJRFhfU0xJTUJVU18xX1RYLAorCUlEWF9TTElNQlVTXzJfUlgsCisJLyogSURYIDIwLT4yNCAqLworCUlEWF9TTElNQlVTXzJfVFgsCisJSURYX1NMSU1CVVNfM19SWCwKKwlJRFhfU0xJTUJVU18zX1RYLAorCUlEWF9TTElNQlVTXzRfUlgsCisJSURYX1NMSU1CVVNfNF9UWCwKKwkvKiBJRFggMjUtPjI5ICovCisJSURYX1NMSU1CVVNfNV9SWCwKKwlJRFhfU0xJTUJVU181X1RYLAorCUlEWF9JTlRfQlRfU0NPX1JYLAorCUlEWF9JTlRfQlRfU0NPX1RYLAorCUlEWF9JTlRfQlRfQTJEUF9SWCwKKwkvKiBJRFggMzAtPjM0ICovCisJSURYX0lOVF9GTV9SWCwKKwlJRFhfSU5UX0ZNX1RYLAorCUlEWF9SVF9QUk9YWV9QT1JUXzAwMV9SWCwKKwlJRFhfUlRfUFJPWFlfUE9SVF8wMDFfVFgsCisJSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWCwKKwkvKiBJRFggMzUtPjM5ICovCisJSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCwKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlgsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYLAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYLAorCS8qIElEWCA0MC0+NDQgKi8KKwlJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFgsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlgsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFgsCisJSURYX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkvKiBJRFggNDUtPjQ5ICovCisJSURYX1NMSU1CVVNfNl9SWCwKKwlJRFhfU0xJTUJVU182X1RYLAorCUlEWF9TUERJRl9SWCwKKwlJRFhfR0xPQkFMX0NGRywKKwlJRFhfQVVESU9fUE9SVF9JRF9JMlNfUlgsCisJLyogSURYIDUwLT41MyAqLworCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDEsCisJSURYX0FGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19SWCwKKwlJRFhfQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWCwKKwkvKiBJRFggNTQtPjExNyAqLworCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8wLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8wLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zLAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83LAorCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83LAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzAsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMCwKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzEsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMiwKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yLAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzMsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMywKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80LAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNSwKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81LAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzYsCisJSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNiwKKwlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83LAorCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzcsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8wLAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMCwKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzEsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMiwKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzIsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zLAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMywKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80LAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNSwKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzUsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82LAorCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNiwKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzcsCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8wLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8wLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83LAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83LAorCS8qIElEWCAxMTgtPjEyMSAqLworCUlEWF9TTElNQlVTXzdfUlgsCisJSURYX1NMSU1CVVNfN19UWCwKKwlJRFhfU0xJTUJVU184X1JYLAorCUlEWF9TTElNQlVTXzhfVFgsCisJLyogSURYIDEyMi0+IDEyMyAqLworCUlEWF9BRkVfUE9SVF9JRF9VU0JfUlgsCisJSURYX0FGRV9QT1JUX0lEX1VTQl9UWCwKKwkvKiBJRFggMTI0ICovCisJSURYX0RJU1BMQVlfUE9SVF9SWCwKKwkvKiBJRFggMTI1LT4gMTI4ICovCisJSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWCwKKwlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWCwKKwlJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFgsCisJLyogSURYIDEyOS0+IDE0MiAqLworCUlEWF9BRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCisJSURYX0FGRV9QT1JUX0lEX0lOVDBfTUkyU19UWCwKKwlJRFhfQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYLAorCUlEWF9BRkVfUE9SVF9JRF9JTlQxX01JMlNfVFgsCisJSURYX0FGRV9QT1JUX0lEX0lOVDJfTUkyU19SWCwKKwlJRFhfQUZFX1BPUlRfSURfSU5UMl9NSTJTX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9JTlQzX01JMlNfUlgsCisJSURYX0FGRV9QT1JUX0lEX0lOVDNfTUkyU19UWCwKKwlJRFhfQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYLAorCUlEWF9BRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFgsCisJSURYX0FGRV9QT1JUX0lEX0lOVDVfTUkyU19SWCwKKwlJRFhfQUZFX1BPUlRfSURfSU5UNV9NSTJTX1RYLAorCUlEWF9BRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlgsCisJSURYX0FGRV9QT1JUX0lEX0lOVDZfTUkyU19UWCwKKwlBRkVfTUFYX1BPUlRTCit9OworCitlbnVtIGFmZV9tYWRfdHlwZSB7CisJTUFEX0hXX05PTkUgPSAweDAwLAorCU1BRF9IV19BVURJTyA9IDB4MDEsCisJTUFEX0hXX0JFQUNPTiA9IDB4MDIsCisJTUFEX0hXX1VMVFJBU09VTkQgPSAweDA0LAorCU1BRF9TV19BVURJTyA9IDB4MDUsCit9OworCitlbnVtIGFmZV9jYWxfbW9kZSB7CisJQUZFX0NBTF9NT0RFX0RFRkFVTFQgPSAweDAwLAorCUFGRV9DQUxfTU9ERV9OT05FLAorfTsKKworc3RydWN0IGFmZV9hdWRpb19idWZmZXIgeworCWRtYV9hZGRyX3QgcGh5czsKKwl2b2lkICAgICAgICpkYXRhOworCXVpbnQzMl90ICAgdXNlZDsKKwl1aW50MzJfdCAgIHNpemU7Lyogc2l6ZSBvZiBidWZmZXIgKi8KKwl1aW50MzJfdCAgIGFjdHVhbF9zaXplOyAvKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgRFNQICovCisJc3RydWN0ICAgICAgaW9uX2hhbmRsZSAqaGFuZGxlOworCXN0cnVjdCAgICAgIGlvbl9jbGllbnQgKmNsaWVudDsKK307CisKK3N0cnVjdCBhZmVfYXVkaW9fcG9ydF9kYXRhIHsKKwlzdHJ1Y3QgYWZlX2F1ZGlvX2J1ZmZlciAqYnVmOworCXVpbnQzMl90CSAgICBtYXhfYnVmX2NudDsKKwl1aW50MzJfdAkgICAgZHNwX2J1ZjsKKwl1aW50MzJfdAkgICAgY3B1X2J1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIG1lbV9tYXBfaGFuZGxlOworCXVpbnQzMl90CSAgICB0bXBfaGRsOworCS8qIHJlYWQgb3Igd3JpdGUgbG9ja3MgKi8KKwlzdHJ1Y3QgbXV0ZXgJICAgIGxvY2s7CisJc3BpbmxvY2tfdAkgICAgZHNwX2xvY2s7Cit9OworCitzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCB7CisJYXRvbWljX3QJICAgICAgIGNtZF9zdGF0ZTsKKwkvKiBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBUUyAqLworCXVpbnQzMl90CSAgICAgICB0aW1lX2ZsYWc7CisJdm9pZAkJICAgICAgICpwcml2OworCXVpbnQ2NF90CSAgICAgICB0aW1lX3N0YW1wOworCXN0cnVjdCBtdXRleAkgICAgICAgY21kX2xvY2s7CisJLyogaWR4OjEgb3V0IHBvcnQsIDA6IGluIHBvcnQqLworCXN0cnVjdCBhZmVfYXVkaW9fcG9ydF9kYXRhIHBvcnRbMl07CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICBjbWRfd2FpdDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworfTsKKworc3RydWN0IGFhbmNfZGF0YSB7CisJYm9vbCBhYW5jX2FjdGl2ZTsKKwl1aW50MTZfdCBhYW5jX3J4X3BvcnQ7CisJdWludDE2X3QgYWFuY190eF9wb3J0OworCXVpbnQzMl90IGFhbmNfcnhfcG9ydF9zYW1wbGVfcmF0ZTsKKwl1aW50MzJfdCBhYW5jX3R4X3BvcnRfc2FtcGxlX3JhdGU7Cit9OworCitpbnQgYWZlX29wZW4odTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywgaW50IHJhdGUpOworaW50IGFmZV9jbG9zZShpbnQgcG9ydF9pZCk7CitpbnQgYWZlX2xvb3BiYWNrKHUxNiBlbmFibGUsIHUxNiByeF9wb3J0LCB1MTYgdHhfcG9ydCk7CitpbnQgYWZlX3NpZGV0b25lKHUxNiB0eF9wb3J0X2lkLCB1MTYgcnhfcG9ydF9pZCwgdTE2IGVuYWJsZSwgdWludDE2X3QgZ2Fpbik7CitpbnQgYWZlX2xvb3BiYWNrX2dhaW4odTE2IHBvcnRfaWQsIHUxNiB2b2x1bWUpOworaW50IGFmZV92YWxpZGF0ZV9wb3J0KHUxNiBwb3J0X2lkKTsKK2ludCBhZmVfZ2V0X3BvcnRfaW5kZXgodTE2IHBvcnRfaWQpOworaW50IGFmZV9nZXRfdG9wb2xvZ3koaW50IHBvcnRfaWQpOworaW50IGFmZV9zdGFydF9wc2V1ZG9fcG9ydCh1MTYgcG9ydF9pZCk7CitpbnQgYWZlX3N0b3BfcHNldWRvX3BvcnQodTE2IHBvcnRfaWQpOwordWludDMyX3QgYWZlX3JlcV9tbWFwX2hhbmRsZShzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpOworaW50IGFmZV9tZW1vcnlfbWFwKHBoeXNfYWRkcl90IGRtYV9hZGRyX3AsIHUzMiBkbWFfYnVmX3N6LAorCQlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpOworaW50IGFmZV9jbWRfbWVtb3J5X21hcChwaHlzX2FkZHJfdCBkbWFfYWRkcl9wLCB1MzIgZG1hX2J1Zl9zeik7CitpbnQgYWZlX2NtZF9tZW1vcnlfbWFwX25vd2FpdChpbnQgcG9ydF9pZCwgcGh5c19hZGRyX3QgZG1hX2FkZHJfcCwKKwkJCXUzMiBkbWFfYnVmX3N6KTsKK2ludCBhZmVfY21kX21lbW9yeV91bm1hcCh1MzIgZG1hX2FkZHJfcCk7CitpbnQgYWZlX2NtZF9tZW1vcnlfdW5tYXBfbm93YWl0KHUzMiBkbWFfYWRkcl9wKTsKK3ZvaWQgYWZlX3NldF9kdG1mX2dlbl9yeF9wb3J0aWQodTE2IHJ4X3BvcnRfaWQsIGludCBzZXQpOworaW50IGFmZV9kdG1mX2dlbmVyYXRlX3J4KGludDY0X3QgZHVyYXRpb25faW5fbXMsCisJCQkgdWludDE2X3QgaGlnaF9mcmVxLAorCQkJIHVpbnQxNl90IGxvd19mcmVxLCB1aW50MTZfdCBnYWluKTsKK2ludCBhZmVfcmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCwKKwkJdm9pZCAoKmNiKSh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdiksCisJCXZvaWQgKnByaXZhdGVfZGF0YSk7CitpbnQgYWZlX3VucmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCk7CitpbnQgYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUocGh5c19hZGRyX3QgYnVmX2FkZHJfcCwKKwkJCXUzMiBtZW1fbWFwX2hhbmRsZSwgaW50IGJ5dGVzKTsKK2ludCBhZmVfcnRfcHJveHlfcG9ydF9yZWFkKHBoeXNfYWRkcl90IGJ1Zl9hZGRyX3AsCisJCQl1MzIgbWVtX21hcF9oYW5kbGUsIGludCBieXRlcyk7Cit2b2lkIGFmZV9zZXRfY2FsX21vZGUodTE2IHBvcnRfaWQsIGVudW0gYWZlX2NhbF9tb2RlIGFmZV9jYWxfbW9kZSk7CitpbnQgYWZlX3BvcnRfc3RhcnQodTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywKKwl1MzIgcmF0ZSk7CitpbnQgYWZlX3BvcnRfc3RhcnRfdjIodTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywKKwkJICAgICAgdTMyIHJhdGUsIHUxNiBhZmVfaW5fY2hhbm5lbHMsIHUxNiBhZmVfaW5fYml0X3dpZHRoLAorCQkgICAgICBzdHJ1Y3QgYWZlX2VuY19jb25maWcgKmVuY19jb25maWcpOworaW50IGFmZV9zcGtfcHJvdF9mZWVkX2JhY2tfY2ZnKGludCBzcmNfcG9ydCwgaW50IGRzdF9wb3J0LAorCWludCBsX2NoLCBpbnQgcl9jaCwgdTMyIGVuYWJsZSk7CitpbnQgYWZlX3Nwa19wcm90X2dldF9jYWxpYl9kYXRhKHN0cnVjdCBhZmVfc3Brcl9wcm90X2dldF92aV9jYWxpYiAqY2FsaWIpOworaW50IGFmZV9wb3J0X3N0b3Bfbm93YWl0KGludCBwb3J0X2lkKTsKK2ludCBhZmVfYXBwbHlfZ2Fpbih1MTYgcG9ydF9pZCwgdTE2IGdhaW4pOworaW50IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSh2b2lkKTsKK2ludCBhZmVfZ2V0X3BvcnRfdHlwZSh1MTYgcG9ydF9pZCk7CitpbnQgcTZhZmVfYXVkaW9fY2xpZW50X2J1Zl9hbGxvY19jb250aWd1b3VzKHVuc2lnbmVkIGludCBkaXIsCisJCQlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMsCisJCQl1bnNpZ25lZCBpbnQgYnVmc3osCisJCQl1bnNpZ25lZCBpbnQgYnVmY250KTsKK3N0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICpxNmFmZV9hdWRpb19jbGllbnRfYWxsb2Modm9pZCAqcHJpdik7CitpbnQgcTZhZmVfYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYyk7Cit2b2lkIHE2YWZlX2F1ZGlvX2NsaWVudF9mcmVlKHN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYyk7CisvKiBpZiBwb3J0X2lkIGlzIHZpcnR1YWwsIGNvbnZlcnQgdG8gcGh5c2ljYWwuLgorICogaWYgcG9ydF9pZCBpcyBhbHJlYWR5IHBoeXNpY2FsLCByZXR1cm4gcGh5c2ljYWwKKyAqLworaW50IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHUxNiBwb3J0X2lkKTsKKworaW50IGFmZV9wc2V1ZG9fcG9ydF9zdGFydF9ub3dhaXQodTE2IHBvcnRfaWQpOworaW50IGFmZV9wc2V1ZG9fcG9ydF9zdG9wX25vd2FpdCh1MTYgcG9ydF9pZCk7CitpbnQgYWZlX3NldF9scGFzc19jbG9jayh1MTYgcG9ydF9pZCwgc3RydWN0IGFmZV9jbGtfY2ZnICpjZmcpOworaW50IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIodTE2IHBvcnRfaWQsIHN0cnVjdCBhZmVfY2xrX3NldCAqY2ZnKTsKK2ludCBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoaW50IGluZGV4LCBzdHJ1Y3QgYWZlX2Nsa19zZXQgKmNmZyk7CitpbnQgYWZlX3NldF9kaWdpdGFsX2NvZGVjX2NvcmVfY2xvY2sodTE2IHBvcnRfaWQsCisJCQlzdHJ1Y3QgYWZlX2RpZ2l0YWxfY2xrX2NmZyAqY2ZnKTsKK2ludCBhZmVfc2V0X2xwYXNzX2ludGVybmFsX2RpZ2l0YWxfY29kZWNfY2xvY2sodTE2IHBvcnRfaWQsCisJCQkJc3RydWN0IGFmZV9kaWdpdGFsX2Nsa19jZmcgKmNmZyk7CitpbnQgYWZlX2VuYWJsZV9scGFzc19jb3JlX3NoYXJlZF9jbG9jayh1MTYgcG9ydF9pZCwgdTMyIGVuYWJsZSk7CisKK2ludCBxNmFmZV9jaGVja19vc3JfY2xrX2ZyZXEodTMyIGZyZXEpOworCitpbnQgYWZlX3NlbmRfc3BkaWZfY2xrX2NmZyhzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2Nsa19jZmcgKmNmZywKKwkJdTE2IHBvcnRfaWQpOworaW50IGFmZV9zZW5kX3NwZGlmX2NoX3N0YXR1c19jZmcoc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jaF9zdGF0dXNfY2ZnCisJCSpjaF9zdGF0dXNfY2ZnLAl1MTYgcG9ydF9pZCk7CisKK2ludCBhZmVfc3BkaWZfcG9ydF9zdGFydCh1MTYgcG9ydF9pZCwgc3RydWN0IGFmZV9zcGRpZl9wb3J0X2NvbmZpZyAqc3BkaWZfcG9ydCwKKwkJdTMyIHJhdGUpOworCitpbnQgYWZlX3R1cm5fb25vZmZfaHdfbWFkKHUxNiBtYWRfdHlwZSwgdTE2IG1hZF9lbmFibGUpOworaW50IGFmZV9wb3J0X3NldF9tYWRfdHlwZSh1MTYgcG9ydF9pZCwgZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGUpOworZW51bSBhZmVfbWFkX3R5cGUgYWZlX3BvcnRfZ2V0X21hZF90eXBlKHUxNiBwb3J0X2lkKTsKK2ludCBhZmVfc2V0X2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWdfdHlwZSwgdm9pZCAqY29uZmlnX2RhdGEsCisJCSAgIGludCBhcmcpOwordm9pZCBhZmVfY2xlYXJfY29uZmlnKGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZyk7Citib29sIGFmZV9oYXNfY29uZmlnKGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZyk7CisKK3ZvaWQgYWZlX3NldF9hYW5jX2luZm8oc3RydWN0IGFhbmNfZGF0YSAqYWFuY19pbmZvKTsKK2ludCBhZmVfcG9ydF9ncm91cF9zZXRfcGFyYW0odTE2IGdyb3VwX2lkLAorCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyAqYWZlX2dyb3VwX2NvbmZpZyk7CitpbnQgYWZlX3BvcnRfZ3JvdXBfZW5hYmxlKHUxNiBncm91cF9pZCwKKwl1bmlvbiBhZmVfcG9ydF9ncm91cF9jb25maWcgKmFmZV9ncm91cF9jb25maWcsIHUxNiBlbmFibGUpOworaW50IGFmZV91bm1hcF9ydGFjX2Jsb2NrKHVpbnQzMl90ICptZW1fbWFwX2hhbmRsZSk7CitpbnQgYWZlX21hcF9ydGFjX2Jsb2NrKHN0cnVjdCBydGFjX2NhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spOworaW50IGFmZV9zZW5kX3Nsb3RfbWFwcGluZ19jZmcoCisJc3RydWN0IGFmZV9wYXJhbV9pZF9zbG90X21hcHBpbmdfY2ZnICpzbG90X21hcHBpbmdfY2ZnLAorCXUxNiBwb3J0X2lkKTsKK2ludCBhZmVfc2VuZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcoCisJc3RydWN0IGFmZV9wYXJhbV9pZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcgKmN1c3RvbV90ZG1faGVhZGVyX2NmZywKKwl1MTYgcG9ydF9pZCk7CitpbnQgYWZlX3RkbV9wb3J0X3N0YXJ0KHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX3RkbV9wb3J0X2NvbmZpZyAqdGRtX3BvcnQsCisJCXUzMiByYXRlKTsKKyNlbmRpZiAvKiBfX1E2QUZFX1YyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmFzbS12Mi5oIGIvaW5jbHVkZS9zb3VuZC9xNmFzbS12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjE0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3E2YXNtLXYyLmgKQEAgLTAsMCArMSw2MzcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fUTZfQVNNX1YyX0hfXworI2RlZmluZSBfX1E2X0FTTV9WMl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9ydGFjLmg+CisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKworI2RlZmluZSBJTiAgICAgICAgICAgICAgICAgICAgICAweDAwMAorI2RlZmluZSBPVVQgICAgICAgICAgICAgICAgICAgICAweDAwMQorI2RlZmluZSBDSF9NT0RFX01PTk8gICAgICAgICAgICAweDAwMQorI2RlZmluZSBDSF9NT0RFX1NURVJFTyAgICAgICAgICAweDAwMgorCisjZGVmaW5lIEZPUk1BVF9MSU5FQVJfUENNICAgMHgwMDAwCisjZGVmaW5lIEZPUk1BVF9EVE1GICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZPUk1BVF9BRFBDTQkgICAgMHgwMDAyCisjZGVmaW5lIEZPUk1BVF9ZQURQQ00gICAgICAgMHgwMDAzCisjZGVmaW5lIEZPUk1BVF9NUDMgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZPUk1BVF9NUEVHNF9BQUMgICAgMHgwMDA1CisjZGVmaW5lIEZPUk1BVF9BTVJOQgkgICAgMHgwMDA2CisjZGVmaW5lIEZPUk1BVF9BTVJXQgkgICAgMHgwMDA3CisjZGVmaW5lIEZPUk1BVF9WMTNLCSAgICAweDAwMDgKKyNkZWZpbmUgRk9STUFUX0VWUkMJICAgIDB4MDAwOQorI2RlZmluZSBGT1JNQVRfRVZSQ0IJICAgIDB4MDAwYQorI2RlZmluZSBGT1JNQVRfRVZSQ1dCCSAgICAweDAwMGIKKyNkZWZpbmUgRk9STUFUX01JREkJICAgIDB4MDAwYworI2RlZmluZSBGT1JNQVRfU0JDCSAgICAweDAwMGQKKyNkZWZpbmUgRk9STUFUX1dNQV9WMTBQUk8gICAweDAwMGUKKyNkZWZpbmUgRk9STUFUX1dNQV9WOQkgICAgMHgwMDBmCisjZGVmaW5lIEZPUk1BVF9BTVJfV0JfUExVUyAgMHgwMDEwCisjZGVmaW5lIEZPUk1BVF9NUEVHNF9NVUxUSV9BQUMgMHgwMDExCisjZGVmaW5lIEZPUk1BVF9NVUxUSV9DSEFOTkVMX0xJTkVBUl9QQ00gMHgwMDEyCisjZGVmaW5lIEZPUk1BVF9BQzMgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIEZPUk1BVF9FQUMzICAgICAgICAgMHgwMDE0CisjZGVmaW5lIEZPUk1BVF9NUDIgICAgICAgICAgMHgwMDE1CisjZGVmaW5lIEZPUk1BVF9GTEFDICAgICAgICAgMHgwMDE2CisjZGVmaW5lIEZPUk1BVF9BTEFDICAgICAgICAgMHgwMDE3CisjZGVmaW5lIEZPUk1BVF9WT1JCSVMgICAgICAgMHgwMDE4CisjZGVmaW5lIEZPUk1BVF9BUEUgICAgICAgICAgMHgwMDE5CisjZGVmaW5lIEZPUk1BVF9HNzExX0FMQVdfRlMgMHgwMDFhCisjZGVmaW5lIEZPUk1BVF9HNzExX01MQVdfRlMgMHgwMDFiCisjZGVmaW5lIEZPUk1BVF9EVFMgICAgICAgICAgMHgwMDFjCisjZGVmaW5lIEZPUk1BVF9EU0QgICAgICAgICAgMHgwMDFkCisKKyNkZWZpbmUgRU5DREVDX1NCQ0JJVFJBVEUgICAweDAwMDEKKyNkZWZpbmUgRU5DREVDX0lNTUVESUFURV9ERUNPREUgMHgwMDAyCisjZGVmaW5lIEVOQ0RFQ19DRkdfQkxLICAgICAgICAgIDB4MDAwMworCisjZGVmaW5lIENNRF9QQVVTRSAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ01EX0ZMVVNIICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBDTURfRU9TICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIENNRF9DTE9TRSAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQ01EX09VVF9GTFVTSCAgICAgIDB4MDAwNQorI2RlZmluZSBDTURfU1VTUEVORCAgICAgICAgMHgwMDA2CisKKy8qIGJpdCAwOjEgcmVwcmVzZW50cyBwcmlvcml0eSBvZiBzdHJlYW0gKi8KKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX05PUk1BTAkweDAwMDAKKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX0xPVwkweDAwMDEKKyNkZWZpbmUgU1RSRUFNX1BSSU9SSVRZX0hJR0gJMHgwMDAyCisKKy8qIGJpdCA0IHJlcHJlc2VudHMgTUVUQSBlbmFibGUgb2YgZW5jb2RlZCBkYXRhIGJ1ZmZlciAqLworI2RlZmluZSBCVUZGRVJfTUVUQV9FTkFCTEUJMHgwMDEwCisKKy8qIGJpdCA1IHJlcHJlc2VudHMgdGltZXN0YW1wICovCisvKiBiaXQgNSAtIDAgLS0gQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FIHdpbGwgaGF2ZSByZWxhdGl2ZSB0aW1lLXN0YW1wKi8KKy8qIGJpdCA1IC0gMSAtLSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkUgd2lsbCBoYXZlIGFic29sdXRlIHRpbWUtc3RhbXAqLworI2RlZmluZSBBQlNPTFVURV9USU1FU1RBTVBfRU5BQkxFICAweDAwMjAKKworLyogRW5hYmxlIFNhbXBsZV9SYXRlL0NoYW5uZWxfTW9kZSBub3RpZmljYXRpb24gZXZlbnQgZnJvbSBEZWNvZGVyICovCisjZGVmaW5lIFNSX0NNX05PVElGWV9FTkFCTEUJMHgwMDA0CisKKyNkZWZpbmUgVFVOX1dSSVRFX0lPX01PREUgMHgwMDA4IC8qIHR1bm5lbCByZWFkIHdyaXRlIG1vZGUgKi8KKyNkZWZpbmUgVFVOX1JFQURfSU9fTU9ERSAgMHgwMDA0IC8qIHR1bm5lbCByZWFkIHdyaXRlIG1vZGUgKi8KKyNkZWZpbmUgU1lOQ19JT19NT0RFCTB4MDAwMQorI2RlZmluZSBBU1lOQ19JT19NT0RFCTB4MDAwMgorI2RlZmluZSBDT01QUkVTU0VEX0lPCTB4MDA0MAorI2RlZmluZSBDT01QUkVTU0VEX1NUUkVBTV9JTwkweDAwODAKKyNkZWZpbmUgTlRfTU9ERSAgICAgICAgMHgwNDAwCisKKyNkZWZpbmUgTk9fVElNRVNUQU1QICAgIDB4RkYwMAorI2RlZmluZSBTRVRfVElNRVNUQU1QICAgMHgwMDAwCisKKyNkZWZpbmUgU09GVF9QQVVTRV9FTkFCTEUJMQorI2RlZmluZSBTT0ZUX1BBVVNFX0RJU0FCTEUJMAorCisjZGVmaW5lIEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VECTB4OAorLyogQ29udHJvbCBzZXNzaW9uIGlzIHVzZWQgZm9yIG1hcHBpbmcgY2FsaWJyYXRpb24gbWVtb3J5ICovCisjZGVmaW5lIEFTTV9DT05UUk9MX1NFU1NJT04JKEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEICsgMSkKKworI2RlZmluZSBBU01fU0hJRlRfR0FQTEVTU19NT0RFX0ZMQUcJMzEKKyNkZWZpbmUgQVNNX1NISUZUX0xBU1RfQlVGRkVSX0ZMQUcJMzAKKworI2RlZmluZSBBU01fTElUVExFX0VORElBTiAwCisjZGVmaW5lIEFTTV9CSUdfRU5ESUFOIDEKKworLyogUENNX01FRElBX0ZPUk1BVF9WZXJzaW9uICovCitlbnVtIHsKKwlQQ01fTUVESUFfRk9STUFUX1YyID0gMCwKKwlQQ01fTUVESUFfRk9STUFUX1YzLAorCVBDTV9NRURJQV9GT1JNQVRfVjQsCit9OworCisvKiBQQ00gZm9ybWF0IG1vZGVzIGluIERTUCAqLworZW51bSB7CisJREVGQVVMVF9RRiA9IDAsCisJUTE1ID0gMTUsCisJUTIzID0gMjMsCisJUTMxID0gMzEsCit9OworCisvKiBwYXlsb2FkIHN0cnVjdHVyZSBieXRlcyAqLworI2RlZmluZSBSRUFERE9ORV9JRFhfU1RBVFVTIDAKKyNkZWZpbmUgUkVBRERPTkVfSURYX0JVRkFERF9MU1cgMQorI2RlZmluZSBSRUFERE9ORV9JRFhfQlVGQUREX01TVyAyCisjZGVmaW5lIFJFQURET05FX0lEWF9NRU1NQVBfSERMIDMKKyNkZWZpbmUgUkVBRERPTkVfSURYX1NJWkUgNAorI2RlZmluZSBSRUFERE9ORV9JRFhfT0ZGU0VUIDUKKyNkZWZpbmUgUkVBRERPTkVfSURYX0xTV19UUyA2CisjZGVmaW5lIFJFQURET05FX0lEWF9NU1dfVFMgNworI2RlZmluZSBSRUFERE9ORV9JRFhfRkxBR1MgOAorI2RlZmluZSBSRUFERE9ORV9JRFhfTlVNRlJBTUVTIDkKKyNkZWZpbmUgUkVBRERPTkVfSURYX1NFUV9JRCAxMAorCisjZGVmaW5lIFNPRlRfUEFVU0VfUEVSSU9EICAgICAgIDMwICAgLyogcmFtcCB1cC9kb3duIGZvciAzMG1zICAgICovCisjZGVmaW5lIFNPRlRfUEFVU0VfU1RFUCAgICAgICAgIDAgLyogU3RlcCB2YWx1ZSAwbXMgb3IgMHVzICovCitlbnVtIHsKKwlTT0ZUX1BBVVNFX0NVUlZFX0xJTkVBUiA9IDAsCisJU09GVF9QQVVTRV9DVVJWRV9FWFAsCisJU09GVF9QQVVTRV9DVVJWRV9MT0csCit9OworCisjZGVmaW5lIFNPRlRfVk9MVU1FX1BFUklPRCAgICAgICAzMCAgIC8qIHJhbXAgdXAvZG93biBmb3IgMzBtcyAgICAqLworI2RlZmluZSBTT0ZUX1ZPTFVNRV9TVEVQICAgICAgICAgMCAvKiBTdGVwIHZhbHVlIDBtcyBvciAwdXMgKi8KK2VudW0geworCVNPRlRfVk9MVU1FX0NVUlZFX0xJTkVBUiA9IDAsCisJU09GVF9WT0xVTUVfQ1VSVkVfRVhQLAorCVNPRlRfVk9MVU1FX0NVUlZFX0xPRywKK307CisKKyNkZWZpbmUgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMQkxCisjZGVmaW5lIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzIJMgorCit0eXBlZGVmIHZvaWQgKCphcHBfY2IpKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7CisKK3N0cnVjdCBhdWRpb19idWZmZXIgeworCWRtYV9hZGRyX3QgcGh5czsKKwl2b2lkICAgICAgICpkYXRhOworCXVpbnQzMl90ICAgdXNlZDsKKwl1aW50MzJfdCAgIHNpemU7Lyogc2l6ZSBvZiBidWZmZXIgKi8KKwl1aW50MzJfdCAgIGFjdHVhbF9zaXplOyAvKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgRFNQICovCisJc3RydWN0ICAgICAgaW9uX2hhbmRsZSAqaGFuZGxlOworCXN0cnVjdCAgICAgIGlvbl9jbGllbnQgKmNsaWVudDsKK307CisKK3N0cnVjdCBhdWRpb19haW9fd3JpdGVfcGFyYW0geworCXBoeXNfYWRkcl90ICAgcGFkZHI7CisJdWludDMyX3QgICAgICBsZW47CisJdWludDMyX3QgICAgICB1aWQ7CisJdWludDMyX3QgICAgICBsc3dfdHM7CisJdWludDMyX3QgICAgICBtc3dfdHM7CisJdWludDMyX3QgICAgICBmbGFnczsKKwl1aW50MzJfdCAgICAgIG1ldGFkYXRhX2xlbjsKKwl1aW50MzJfdCAgICAgIGxhc3RfYnVmZmVyOworfTsKKworc3RydWN0IGF1ZGlvX2Fpb19yZWFkX3BhcmFtIHsKKwlwaHlzX2FkZHJfdCAgIHBhZGRyOworCXVpbnQzMl90ICAgICAgbGVuOworCXVpbnQzMl90ICAgICAgdWlkOworCXVpbnQzMl90ICAgICAgZmxhZ3M7LyptZXRhIGRhdGEgZmxhZ3MqLworfTsKKworc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSB7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOworCXVpbnQzMl90CSAgICBtYXhfYnVmX2NudDsKKwl1aW50MzJfdAkgICAgZHNwX2J1ZjsKKwl1aW50MzJfdAkgICAgY3B1X2J1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIG1lbV9tYXBfaGFuZGxlOworCXVpbnQzMl90CSAgICB0bXBfaGRsOworCS8qIHJlYWQgb3Igd3JpdGUgbG9ja3MgKi8KKwlzdHJ1Y3QgbXV0ZXgJICAgIGxvY2s7CisJc3BpbmxvY2tfdAkgICAgZHNwX2xvY2s7Cit9OworCitzdHJ1Y3Qgc2hhcmVkX2lvX2NvbmZpZyB7CisJdWludDMyX3QgZm9ybWF0OworCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKKwl1aW50MzJfdCByYXRlOworCXVpbnQzMl90IGNoYW5uZWxzOworCXVpbnQxNl90IHNhbXBsZV93b3JkX3NpemU7CisJdWludDMyX3QgYnVmc3o7CisJdWludDMyX3QgYnVmY250OworfTsKKworc3RydWN0IGF1ZGlvX2NsaWVudCB7CisJaW50ICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOworCWFwcF9jYgkJICAgICAgIGNiOworCWF0b21pY190CSAgICAgICBjbWRfc3RhdGU7CisJLyogUmVsYXRpdmUgb3IgYWJzb2x1dGUgVFMgKi8KKwlhdG9taWNfdAkgICAgICAgdGltZV9mbGFnOworCWF0b21pY190CSAgICAgICBub3dhaXRfY21kX2NudDsKKwlhdG9taWNfdCAgICAgICAgICAgICAgIG1lbV9zdGF0ZTsKKwl2b2lkCQkgICAgICAgKnByaXY7CisJdWludDMyX3QgICAgICAgICAgICAgICBpb19tb2RlOworCXVpbnQ2NF90CSAgICAgICB0aW1lX3N0YW1wOworCXN0cnVjdCBhcHJfc3ZjICAgICAgICAgKmFwcjsKKwlzdHJ1Y3QgYXByX3N2YyAgICAgICAgICptbWFwX2FwcjsKKwlzdHJ1Y3QgYXByX3N2YyAgICAgICAgICphcHIyOworCXN0cnVjdCBtdXRleAkgICAgICAgY21kX2xvY2s7CisJLyogaWR4OjEgb3V0IHBvcnQsIDA6IGluIHBvcnQqLworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgcG9ydFsyXTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIGNtZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgdGltZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgbWVtX3dhaXQ7CisJaW50ICAgICAgICAgICAgICAgICAgICBwZXJmX21vZGU7CisJaW50CQkJCQkgICBzdHJlYW1faWQ7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludAkJICAgICAgIHRvcG9sb2d5OworCWludAkJICAgICAgIGFwcF90eXBlOworCS8qIGF1ZGlvIGNhY2hlIG9wZXJhdGlvbnMgZnB0ciovCisJaW50ICgqZnB0cl9jYWNoZV9vcHMpKHN0cnVjdCBhdWRpb19idWZmZXIgKmFidWZmLCBpbnQgY2FjaGVfb3ApOworCWF0b21pY190ICAgICAgICAgICAgICAgdW5tYXBfY2Jfc3VjY2VzczsKKwlhdG9taWNfdCAgICAgICAgICAgICAgIHJlc2V0OworCS8qIGhvbGRzIGxhdGVzdCBEU1AgcGlwZWxpbmUgZGVsYXkgKi8KKwl1aW50MzJfdCAgICAgICAgICAgICAgIHBhdGhfZGVsYXk7CisJLyogc2hhcmVkIGlvICovCisJc3RydWN0IGF1ZGlvX2J1ZmZlciBzaGFyZWRfcG9zX2J1ZjsKKwlzdHJ1Y3Qgc2hhcmVkX2lvX2NvbmZpZyBjb25maWc7Cit9OworCit2b2lkIHE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKKworc3RydWN0IGF1ZGlvX2NsaWVudCAqcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKGFwcF9jYiBjYiwgdm9pZCAqcHJpdik7CisKK3N0cnVjdCBhdWRpb19jbGllbnQgKnE2YXNtX2dldF9hdWRpb19jbGllbnQoaW50IHNlc3Npb25faWQpOworCitpbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgZGlyLyogMTpPdXQsMDpJbiAqLywKKwkJCQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQl1bnNpZ25lZCBpbnQgYnVmc3osCisJCQkJdWludDMyX3QgYnVmY250KTsKK2ludCBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpcgorCQkJCS8qIDE6T3V0LDA6SW4gKi8sCisJCQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAorCQkJCXVuc2lnbmVkIGludCBidWZjbnQpOworCitpbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKKworaW50IHE2YXNtX29wZW5fcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0CisJCS8qLCB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUqLyk7CisKK2ludCBxNmFzbV9vcGVuX3JlYWRfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7CisKK2ludCBxNmFzbV9vcGVuX3JlYWRfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7CisKK2ludCBxNmFzbV9vcGVuX3JlYWRfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7CisKK2ludCBxNmFzbV9vcGVuX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQKKwkJLyosIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSovKTsKKworaW50IHE2YXNtX29wZW5fd3JpdGVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7CisKK2ludCBxNmFzbV9vcGVuX3NoYXJlZF9pbyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSBzdHJ1Y3Qgc2hhcmVkX2lvX2NvbmZpZyAqYywgaW50IGRpcik7CisKK2ludCBxNmFzbV9vcGVuX3dyaXRlX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOworCitpbnQgcTZhc21fb3Blbl93cml0ZV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKTsKKworaW50IHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQkgICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBpbnQzMl90IHN0cmVhbV9pZCwKKwkJCSAgICAgICBib29sIGlzX2dhcGxlc3NfbW9kZSk7CisKK2ludCBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50MzJfdCBzdHJlYW1faWQsCisJCQkgICAgICAgYm9vbCBpc19nYXBsZXNzX21vZGUpOworCitpbnQgcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludDMyX3Qgc3RyZWFtX2lkLAorCQkJICAgICAgIGJvb2wgaXNfZ2FwbGVzc19tb2RlKTsKKworaW50IHE2YXNtX29wZW5fd3JpdGVfY29tcHJlc3NlZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJCXVpbnQzMl90IHBhc3N0aHJvdWdoX2ZsYWcpOworCitpbnQgcTZhc21fb3Blbl9yZWFkX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdWludDMyX3QgcmRfZm9ybWF0LAorCQkJdWludDMyX3Qgd3JfZm9ybWF0KTsKKworaW50IHE2YXNtX29wZW5fcmVhZF93cml0ZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmRfZm9ybWF0LAorCQkJICAgICB1aW50MzJfdCB3cl9mb3JtYXQsIGJvb2wgaXNfbWV0YV9kYXRhX21vZGUsCisJCQkgICAgIHVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCBvdmVyd3JpdGVfdG9wb2xvZ3ksCisJCQkgICAgIGludCB0b3BvbG9neSk7CisKK2ludCBxNmFzbV9vcGVuX2xvb3BiYWNrX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlKTsKKworaW50IHE2YXNtX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IG1zd190cywKKwkJCQl1aW50MzJfdCBsc3dfdHMsIHVpbnQzMl90IGZsYWdzKTsKK2ludCBxNmFzbV93cml0ZV9ub2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGxlbiwgdWludDMyX3QgbXN3X3RzLAorCQkJCXVpbnQzMl90IGxzd190cywgdWludDMyX3QgZmxhZ3MpOworCitpbnQgcTZhc21fYXN5bmNfd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSAqcGFyYW0pOworCitpbnQgcTZhc21fYXN5bmNfcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJICBzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gKnBhcmFtKTsKKworaW50IHE2YXNtX3JlYWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOworaW50IHE2YXNtX3JlYWRfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGxlbik7CitpbnQgcTZhc21fcmVhZF9ub2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOworCitpbnQgcTZhc21fbWVtb3J5X21hcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgcGh5c19hZGRyX3QgYnVmX2FkZCwKKwkJCWludCBkaXIsIHVpbnQzMl90IGJ1ZnN6LCB1aW50MzJfdCBidWZjbnQpOworCitpbnQgcTZhc21fbWVtb3J5X3VubWFwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBwaHlzX2FkZHJfdCBidWZfYWRkLAorCQkJCQkJCWludCBkaXIpOworCitzdHJ1Y3QgYXVkaW9fYnVmZmVyICpxNmFzbV9zaGFyZWRfaW9fYnVmKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgZGlyKTsKKworaW50IHE2YXNtX3NoYXJlZF9pb19mcmVlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgZGlyKTsKKworaW50IHE2YXNtX2dldF9zaGFyZWRfcG9zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCAqc2ksIHVpbnQzMl90ICptc3csCisJCQkgdWludDMyX3QgKmxzdyk7CisKK2ludCBxNmFzbV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKKworaW50IHE2YXNtX3VubWFwX3J0YWNfYmxvY2sodWludDMyX3QgKm1lbV9tYXBfaGFuZGxlKTsKKworaW50IHE2YXNtX3NlbmRfY2FsKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKKworaW50IHE2YXNtX3J1bihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCisJCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzKTsKKworaW50IHE2YXNtX3J1bl9ub3dhaXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZsYWdzLAorCQl1aW50MzJfdCBtc3dfdHMsIHVpbnQzMl90IGxzd190cyk7CisKK2ludCBxNmFzbV9zdHJlYW1fcnVuX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCisJCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBzdHJlYW1faWQpOworCitpbnQgcTZhc21fcmVnX3R4X292ZXJmbG93KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBlbmFibGUpOworCitpbnQgcTZhc21fcmVnX3J4X3VuZGVyZmxvdyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDE2X3QgZW5hYmxlKTsKKworaW50IHE2YXNtX2NtZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCk7CisKK2ludCBxNmFzbV9zdHJlYW1fY21kKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kLCB1aW50MzJfdCBzdHJlYW1faWQpOworCitpbnQgcTZhc21fY21kX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCk7CisKK2ludCBxNmFzbV9zdHJlYW1fY21kX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCwKKwkJCSAgICB1aW50MzJfdCBzdHJlYW1faWQpOworCit2b2lkICpxNmFzbV9pc19jcHVfYnVmX2F2YWlsKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXVpbnQzMl90ICpzaXplLCB1aW50MzJfdCAqaWR4KTsKKworaW50IHE2YXNtX2NwdV9idWZfcmVsZWFzZShpbnQgZGlyLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7CisKK3ZvaWQgKnE2YXNtX2lzX2NwdV9idWZfYXZhaWxfbm9sb2NrKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQl1aW50MzJfdCAqc2l6ZSwgdWludDMyX3QgKmlkeCk7CisKK2ludCBxNmFzbV9pc19kc3BfYnVmX2F2YWlsKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKKworLyogRmlsZSBmb3JtYXQgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgdG8gYmUgYWRkZWQgYmVsb3cgKi8KKworaW50IHE2YXNtX2VuY19jZmdfYmxrX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJCXVpbnQzMl90IHNhbXBsZV9yYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCSB1aW50MzJfdCBiaXRfcmF0ZSwKKwkJCSB1aW50MzJfdCBtb2RlLCB1aW50MzJfdCBmb3JtYXQpOworCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfZzcxMShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJCXVpbnQzMl90IHNhbXBsZV9yYXRlKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgYm9vbCB1c2VfYmFja19mbGF2b3IsCisJCQl1OCAqY2hhbm5lbF9tYXApOworCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCSAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJICAgICBib29sIHVzZV9iYWNrX2ZsYXZvciwgdTggKmNoYW5uZWxfbWFwLAorCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCSAgICAgYm9vbCB1c2VfYmFja19mbGF2b3IsIHU4ICpjaGFubmVsX21hcCwKKwkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwgdWludDE2X3QgZW5kaWFubmVzcywKKwkJCSAgICAgdWludDE2X3QgbW9kZSk7CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpOworCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJCSAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCSAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAorCQkJCQkgICAgdWludDE2X3QgZW5kaWFubmVzcywKKwkJCQkJICAgIHVpbnQxNl90IG1vZGUpOworCitpbnQgcTZhc21fc2V0X2VuY2RlY19jaGFuX21hcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJdWludDMyX3QgbnVtX2NoYW5uZWxzKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9uYXRpdmUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscyk7CisKK2ludCBxNmFzbV9lbmFibGVfc2JycHMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCBzYnJfcHMpOworCitpbnQgcTZhc21fY2ZnX2R1YWxfbW9ub19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MTZfdCBzY2VfbGVmdCwgdWludDE2X3Qgc2NlX3JpZ2h0KTsKKworaW50IHE2YXNtX2NmZ19hYWNfc2VsX21peF9jb2VmKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBtaXhfY29lZmYpOworCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcWNlbHAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAorCQl1aW50MTZfdCBtaW5fcmF0ZSwgdWludDE2X3QgbWF4X3JhdGUsCisJCXVpbnQxNl90IHJlZHVjZWRfcmF0ZV9sZXZlbCwgdWludDE2X3QgcmF0ZV9tb2R1bGF0aW9uX2NtZCk7CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19ldnJjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJdWludDE2X3QgbWluX3JhdGUsIHVpbnQxNl90IG1heF9yYXRlLAorCQl1aW50MTZfdCByYXRlX21vZHVsYXRpb25fY21kKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX2Ftcm5iKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJdWludDE2X3QgYmFuZF9tb2RlLCB1aW50MTZfdCBkdHhfZW5hYmxlKTsKKworaW50IHE2YXNtX2VuY19jZmdfYmxrX2FtcndiKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJdWludDE2X3QgYmFuZF9tb2RlLCB1aW50MTZfdCBkdHhfZW5hYmxlKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscyk7CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludCBzdHJlYW1faWQsCisJCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhciAqY2hhbm5lbF9tYXApOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJCSAgIHVpbnQzMl90IHJhdGUsCisJCQkJCQkgICB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJCSAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSAgIGludCBzdHJlYW1faWQsCisJCQkJCQkgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkJICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCQkgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCQkgICB1aW50MzJfdCByYXRlLAorCQkJCQkJICAgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJCQkgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCQkgICBpbnQgc3RyZWFtX2lkLAorCQkJCQkJICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCQkJCSAgIGNoYXIgKmNoYW5uZWxfbWFwLAorCQkJCQkJICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJCSAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCisJCQkJCQkgICB1aW50MTZfdCBtb2RlKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY20oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjIoCisJCQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhciAqY2hhbm5lbF9tYXAsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAorCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJCSAgICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCQkJICAgICBjaGFyICpjaGFubmVsX21hcCwKKwkJCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJICAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAorCQkJCQkgICAgIHVpbnQxNl90IG1vZGUpOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXN0cnVjdCBhc21fYWFjX2NmZyAqY2ZnKTsKKworaW50IHE2YXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfYmxvY2tfYWFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXN0cnVjdCBhc21fYWFjX2NmZyAqY2ZnKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWEoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl2b2lkICpjZmcsIGludCBzdHJlYW1faWQpOworCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3dtYXBybyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXZvaWQgKmNmZywgaW50IHN0cmVhbV9pZCk7CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYW1yd2JwbHVzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9hbXJ3YnBsdXNfY2ZnICpjZmcpOworCitpbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19mbGFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9mbGFjX2NmZyAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hbGFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9hbGFjX2NmZyAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9nNzExX2RlY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCk7CisKK2ludCBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX3ZvcmJpcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXN0cnVjdCBhc21fdm9yYmlzX2NmZyAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hcGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQlzdHJ1Y3QgYXNtX2FwZV9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCk7CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfZHNkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9kc2RfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpOworCitpbnQgcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlpbnQgcGFyYW1faWQsIGludCBwYXJhbV92YWx1ZSk7CisKKy8qIFNlbmQgc3RyZWFtIGJhc2VkIGVuZCBwYXJhbXMgKi8KK2ludCBxNmFzbV9kczFfc2V0X3N0cmVhbV9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHBhcmFtX2lkLAorCQkJCSAgICAgaW50IHBhcmFtX3ZhbHVlLCBpbnQgc3RyZWFtX2lkKTsKKworLyogUFAgc3BlY2lmaWMgKi8KK2ludCBxNmFzbV9lcXVhbGl6ZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHZvaWQgKmVxKTsKKworLyogU2VuZCBWb2x1bWUgQ29tbWFuZCAqLworaW50IHE2YXNtX3NldF92b2x1bWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCB2b2x1bWUpOworCisvKiBTZW5kIFZvbHVtZSBDb21tYW5kICovCitpbnQgcTZhc21fc2V0X3ZvbHVtZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHZvbHVtZSwgaW50IGluc3RhbmNlKTsKKworLyogRFRTIEVhZ2xlIFBhcmFtcyAqLworaW50IHE2YXNtX2R0c19lYWdsZV9zZXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBwYXJhbV9pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbywgaW50IG1faWQpOworaW50IHE2YXNtX2R0c19lYWdsZV9nZXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBwYXJhbV9pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbywgaW50IG1faWQpOworCisvKiBTZXQgU29mdFBhdXNlIFBhcmFtcyAqLworaW50IHE2YXNtX3NldF9zb2Z0cGF1c2Uoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQlzdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgKnBhcmFtKTsKKworLyogU2V0IFNvZnR2b2x1bWUgUGFyYW1zICovCitpbnQgcTZhc21fc2V0X3NvZnR2b2x1bWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQlzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zICpwYXJhbSk7CisKKy8qIFNldCBTb2Z0dm9sdW1lIFBhcmFtcyAqLworaW50IHE2YXNtX3NldF9zb2Z0dm9sdW1lX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgIHN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgKnBhcmFtLCBpbnQgaW5zdGFuY2UpOworCisvKiBTZW5kIGxlZnQtcmlnaHQgY2hhbm5lbCBnYWluICovCitpbnQgcTZhc21fc2V0X2xyZ2FpbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGxlZnRfZ2FpbiwgaW50IHJpZ2h0X2dhaW4pOworCisvKiBTZW5kIG11bHRpIGNoYW5uZWwgZ2FpbiAqLworaW50IHE2YXNtX3NldF9tdWx0aWNoX2dhaW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJICAgdWludDMyX3QgKmdhaW5zLCB1aW50OF90ICpjaF9tYXAsIGJvb2wgdXNlX2RlZmF1bHQpOworCisvKiBFbmFibGUgTXV0ZS91bm11dGUgZmxhZyAqLworaW50IHE2YXNtX3NldF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgbXV0ZWZsYWcpOworCitpbnQgcTZhc21fZ2V0X3Nlc3Npb25fdGltZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDY0X3QgKnRzdGFtcCk7CisKK2ludCBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lX2xlZ2FjeShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDY0X3QgKnRzdGFtcCk7CisKK2ludCBxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBjaGFyICpwYXJhbXMsCisJCQkJICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpOworCisvKiBDbGllbnQgY2FuIHNldCB0aGUgSU8gbW9kZSB0byBlaXRoZXIgQUlPL1NJTyBtb2RlICovCitpbnQgcTZhc21fc2V0X2lvX21vZGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IG1vZGUpOworCisvKiBHZXQgU2VydmljZSBJRCBmb3IgQVBSIGNvbW11bmljYXRpb24gKi8KK2ludCBxNmFzbV9nZXRfYXByX3NlcnZpY2VfaWQoaW50IHNlc3Npb25faWQpOworCisvKiBDb21tb24gZm9ybWF0IGJsb2NrIHdpdGhvdXQgYW55IHBheWxvYWQgKi8KK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCk7CisKKy8qIFNlbmQgdGhlIG1ldGEgZGF0YSB0byByZW1vdmUgaW5pdGlhbCBhbmQgdHJhaWxpbmcgc2lsZW5jZSAqLworaW50IHE2YXNtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBpbml0aWFsX3NhbXBsZXMsCisJCXVpbnQzMl90IHRyYWlsaW5nX3NhbXBsZXMpOworCisvKiBTZW5kIHRoZSBzdHJlYW0gbWV0YSBkYXRhIHRvIHJlbW92ZSBpbml0aWFsIGFuZCB0cmFpbGluZyBzaWxlbmNlICovCitpbnQgcTZhc21fc3RyZWFtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBzdHJlYW1faWQsCisJCXVpbnQzMl90IGluaXRpYWxfc2FtcGxlcywgdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlcyk7CisKK2ludCBxNmFzbV9nZXRfYXNtX3RvcG9sb2d5KGludCBzZXNzaW9uX2lkKTsKK2ludCBxNmFzbV9nZXRfYXNtX2FwcF90eXBlKGludCBzZXNzaW9uX2lkKTsKKworaW50IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl93aW5kb3coc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90ICp3aW5kb3dfcGFyYW0sCisJCXVpbnQzMl90IHBhcmFtX2lkKTsKKworLyogUmV0cmlldmUgdGhlIGN1cnJlbnQgRFNQIHBhdGggZGVsYXkgKi8KK2ludCBxNmFzbV9nZXRfcGF0aF9kZWxheShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgdG8gcmV0cmlldmUgZGF0YSBmcm9tIHRva2VuICovCit1aW50OF90IHE2YXNtX2dldF9idWZfaW5kZXhfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbik7Cit1aW50OF90IHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbik7CisKKyNlbmRpZiAvKiBfX1E2X0FTTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcTZhdWRpby12Mi5oIGIvaW5jbHVkZS9zb3VuZC9xNmF1ZGlvLXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxNGYzMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvcTZhdWRpby12Mi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfUTZfQVVESU9fSF8KKyNkZWZpbmUgX1E2X0FVRElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgorCitlbnVtIHsKKwlMRUdBQ1lfUENNX01PREUgPSAwLAorCUxPV19MQVRFTkNZX1BDTV9NT0RFLAorCVVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFLAorCVVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREUsCit9OworCisKK2ludCBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHUxNiBwb3J0X2lkKTsKKworaW50IHE2YXVkaW9fY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZCh1MTYgcG9ydF9pZCk7CisKK2ludCBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQodTE2IHBvcnRfaWQpOworCitpbnQgcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UodTE2IHBvcnRfaWQpOworCitpbnQgcTZhdWRpb19nZXRfcG9ydF9pZCh1MTYgcG9ydF9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmNvcmUuaCBiL2luY2x1ZGUvc291bmQvcTZjb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4MzA5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvcTZjb3JlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19RNkNPUkVfSF9fCisjZGVmaW5lIF9fUTZDT1JFX0hfXworI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisKKworCisjZGVmaW5lIEFWQ1NfQ01EX0FEU1BfRVZFTlRfR0VUX1NUQVRFCQkweDAwMDEyOTBDCisjZGVmaW5lIEFWQ1NfQ01EUlNQX0FEU1BfRVZFTlRfR0VUX1NUQVRFCTB4MDAwMTI5MEQKKworYm9vbCBxNmNvcmVfaXNfYWRzcF9yZWFkeSh2b2lkKTsKKworI2RlZmluZSBBRFNQX0NNRF9TRVRfRFRTX0VBR0xFX0RBVEFfSUQgMHgwMDAxMjkxOQorI2RlZmluZSBEVFNfRUFHTEVfTElDRU5TRV9JRCAgICAgICAgICAgMHgwMDAyODM0Ngorc3RydWN0IGFkc3BfZHRzX2VhZ2xlIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdWludDMyX3QgaWQ7CisJdWludDMyX3Qgb3ZlcndyaXRlOworCXVpbnQzMl90IHNpemU7CisJY2hhciBkYXRhW107Cit9OworaW50IGNvcmVfZHRzX2VhZ2xlX3NldChpbnQgc2l6ZSwgY2hhciAqZGF0YSk7CitpbnQgY29yZV9kdHNfZWFnbGVfZ2V0KGludCBpZCwgaW50IHNpemUsIGNoYXIgKmRhdGEpOworCisjZGVmaW5lIEFEU1BfQ01EX1NFVF9ET0xCWV9NQU5VRkFDVFVSRVJfSUQgMHgwMDAxMjkxOAorCitzdHJ1Y3QgYWRzcF9kb2xieV9tYW51ZmFjdHVyZXJfaWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlpbnQgbWFudWZhY3R1cmVyX2lkOworfTsKKwordWludDMyX3QgY29yZV9zZXRfZG9sYnlfbWFudWZhY3R1cmVyX2lkKGludCBtYW51ZmFjdHVyZXJfaWQpOworCisvKiBEb2xieSBTdXJyb3VuZDEgTW9kdWxlIExpY2Vuc2UgSUQuIFRoaXMgSUQgaXMgdXNlZCBhcyBhbiBpZGVudGlmaWVyCisgKiBmb3IgRFMxIGxpY2Vuc2UgdmlhIEFEU1AgZ2VuZXJpYyBsaWNlbnNlIG1lY2hhbmlzbS4KKyAqIFBsZWFzZSByZWZlciBBVkNTX0NNRF9TRVRfTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjZGVmaW5lIERPTEJZX0RTMV9MSUNFTlNFX0lECTB4MDAwMDAwMDEKKworI2RlZmluZSBBVkNTX0NNRF9TRVRfTElDRU5TRQkweDAwMDEyOTE5CitzdHJ1Y3QgYXZjc19jbWRfc2V0X2xpY2Vuc2UgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBpZDsgLyoqPCBBIHVuaXF1ZSBJRCB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgbGljZW5zZSAqLworCXVpbnQzMl90IG92ZXJ3cml0ZTsKKwkvKiAwID0gZG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBsaWNlbnNlIHdpdGggdGhpcyBpZC4KKwkgKiAxID0gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGxpY2Vuc2Ugd2l0aCB0aGlzIGlkLgorCSAqLworCXVpbnQzMl90IHNpemU7CisJLyoqPCBTaXplIGluIGJ5dGVzIG9mIHRoZSBsaWNlbnNlIGRhdGEgZm9sbG93aW5nIHRoaXMgaGVhZGVyLiAqLworCS8qIHVpbnQ4X3QqIGRhdGEgLCAgZGF0YSBhbmQgcGFkZGluZyBmb2xsb3dzIHRoaXMgc3RydWN0dXJlCisJICogdG90YWwgcGFja2V0IHNpemUgbmVlZHMgdG8gYmUgbXVsdGlwbGUgb2YgNCBCeXRlcworCSAqLworCit9OworCisjZGVmaW5lIEFWQ1NfQ01EX0dFVF9MSUNFTlNFX1ZBTElEQVRJT05fUkVTVUxUICAgICAgICAweDAwMDEyOTFBCitzdHJ1Y3QgYXZjc19jbWRfZ2V0X2xpY2Vuc2VfdmFsaWRhdGlvbl9yZXN1bHQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBpZDsgLyoqPCBBIHVuaXF1ZSBJRCB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgbGljZW5zZSAqLworfTsKKworI2RlZmluZSBBVkNTX0NNRFJTUF9HRVRfTElDRU5TRV9WQUxJREFUSU9OX1JFU1VMVCAgICAgICAgMHgwMDAxMjkxQgorc3RydWN0IGF2Y3NfY21kcnNwX2dldF9saWNlbnNlX3ZhbGlkYXRpb25fcmVzdWx0IHsKKwl1aW50MzJfdCByZXN1bHQ7CisJLyogQURTUF9FT0sgaWYgdGhlIGxpY2Vuc2UgdmFsaWRhdGlvbiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuCisJICogQURTUF9FTk9URVhJU1QgaWYgdGhlcmUgaXMgbm8gbGljZW5zZSB3aXRoIHRoZSBnaXZlbiBpZC4KKwkgKiBBRFNQX0VOT1RJTVBMIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGEgbGljZW5zZQorCSAqIHdpdGggdGhpcyBpZC4KKwkgKi8KKwl1aW50MzJfdCBzaXplOworCS8qIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgcmVzdWx0IHRoYXQgZm9sbG93cyB0aGlzIHN0cnVjdHVyZSovCit9OworCisvKiBTZXQgUTYgdG9wb2xvZ2llcyAqLworLyoKKyAqCVJlZ2lzdGVycyBjdXN0b20gdG9wb2xvZ2llcyBpbiB0aGUgYURTUCBmb3IKKyAqCXVzZSBpbiBhdWRpbywgdm9pY2UsIEFGRSBhbmQgTFNNLgorICovCisKKworI2RlZmluZSBBVkNTX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEyOTI0CisjZGVmaW5lIEFWQ1NfQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTI5MjUKKyNkZWZpbmUgQVZDU19DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMjkyNgorCisKKyNkZWZpbmUgQVZDU19DTURfUkVHSVNURVJfVE9QT0xPR0lFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMjkyMworCisvKiBUaGUgcGF5bG9hZCBmb3IgdGhlIEFWQ1NfQ01EX1JFR0lTVEVSX1RPUE9MT0dJRVMgY29tbWFuZCAqLworc3RydWN0IGF2Y3NfY21kX3JlZ2lzdGVyX3RvcG9sb2dpZXMgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBheWxvYWRfYWRkcl9sc3c7CisJLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgdG9wb2xvZ3kgYnVmZmVyIGFkZHJlc3MuICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBheWxvYWRfYWRkcl9tc3c7CisJLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgdG9wb2xvZ3kgYnVmZmVyIGFkZHJlc3MuICovCisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOworCS8qIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzLgorCSAqIC1UaGlzIG1lbW9yeSBtYXAgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBhRFNQIHRocm91Z2ggdGhlCisJICogbWVtb3J5IG1hcCBjb21tYW5kLgorCSAqIC1OVUxMIG1lbV9tYXBfaGFuZGxlIGlzIGludGVycHJldGVkIGFzIGluLWJhbmQgcGFyYW1ldGVyCisJICogcGFzc2luZy4KKwkgKiAtQ2xpZW50IGhhcyB0aGUgZmxleGliaWxpdHkgdG8gY2hvb3NlIGluLWJhbmQgb3Igb3V0LW9mLWJhbmQuCisJICogLU91dC1vZi1iYW5kIGlzIHJlY29tbWVuZGVkIGluIHRoaXMgY2FzZS4KKwkgKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplOworCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIHRvcG9sb2d5IGJ1ZmZlci4gKi8KK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBBVkNTX0NNRF9ERVJFR0lTVEVSX1RPUE9MT0dJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTI5MmEKKworLyogVGhlIHBheWxvYWQgZm9yIHRoZSBBVkNTX0NNRF9ERVJFR0lTVEVSX1RPUE9MT0dJRVMgY29tbWFuZCAqLworc3RydWN0IGF2Y3NfY21kX2RlcmVnaXN0ZXJfdG9wb2xvZ2llcyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGF5bG9hZF9hZGRyX2xzdzsKKwkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSB0b3BvbG9neSBidWZmZXIgYWRkcmVzcy4gKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGF5bG9hZF9hZGRyX21zdzsKKwkvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSB0b3BvbG9neSBidWZmZXIgYWRkcmVzcy4gKi8KKworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7CisJLyogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGFkZHJlc3MuCisJICogLVRoaXMgbWVtb3J5IG1hcCBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIGFEU1AgdGhyb3VnaCB0aGUKKwkgKiBtZW1vcnkgbWFwIGNvbW1hbmQuCisJICogLU5VTEwgbWVtX21hcF9oYW5kbGUgaXMgaW50ZXJwcmV0ZWQgYXMgaW4tYmFuZCBwYXJhbWV0ZXIKKwkgKiBwYXNzaW5nLgorCSAqIC1DbGllbnQgaGFzIHRoZSBmbGV4aWJpbGl0eSB0byBjaG9vc2UgaW4tYmFuZCBvciBvdXQtb2YtYmFuZC4KKwkgKiAtT3V0LW9mLWJhbmQgaXMgcmVjb21tZW5kZWQgaW4gdGhpcyBjYXNlLgorCSAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemU7CisJLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgdmFsaWQgZGF0YSBpbiB0aGUgdG9wb2xvZ3kgYnVmZmVyLiAqLworCisJdWludDMyX3QgICAgICAgICAgICAgICAgICBtb2RlOworCS8qIDE6IERlcmVnaXN0ZXIgc2VsZWN0ZWQgdG9wb2xvZ2llcworCSAqIDI6IERlcmVnaXN0ZXIgYWxsIHRvcG9sb2dpZXMKKwkgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVZDU19NT0RFX0RFUkVHSVNURVJfQUxMX0NVU1RPTV9UT1BPTE9HSUVTCTIKKworCitpbnQzMl90IGNvcmVfc2V0X2xpY2Vuc2UodWludDMyX3Qga2V5LCB1aW50MzJfdCBtb2R1bGVfaWQpOworaW50MzJfdCBjb3JlX2dldF9saWNlbnNlX3N0YXR1cyh1aW50MzJfdCBtb2R1bGVfaWQpOworCisjZW5kaWYgLyogX19RNkNPUkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3E2bHNtLmggYi9pbmNsdWRlL3NvdW5kL3E2bHNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNjJkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvcTZsc20uaApAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19RNkxTTV9IX18KKyNkZWZpbmUgX19RNkxTTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvbHNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisKKyNkZWZpbmUgTUFYX05VTV9DT05GSURFTkNFIDIwCisKK3R5cGVkZWYgdm9pZCAoKmxzbV9hcHBfY2IpKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCSAgICAgICB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7CisKK3N0cnVjdCBsc21fc291bmRfbW9kZWwgeworCWRtYV9hZGRyX3QgICAgICBwaHlzOworCXZvaWQJCSpkYXRhOworCXNpemVfdAkJc2l6ZTsgLyogc2l6ZSBvZiBidWZmZXIgKi8KKwl1aW50MzJfdAlhY3R1YWxfc2l6ZTsgLyogYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIGJ5IERTUCAqLworCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKKwl1aW50MzJfdAltZW1fbWFwX2hhbmRsZTsKK307CisKK3N0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MiB7CisJdWludDE2X3Qgc3RhdHVzOworCXVpbnQxNl90IHBheWxvYWRfc2l6ZTsKKwl1aW50OF90ICBjb25maWRlbmNlX3ZhbHVlWzBdOworfTsKKworc3RydWN0IGxzbV9sYWJfYnVmZmVyIHsKKwlkbWFfYWRkcl90IHBoeXM7CisJdm9pZCAqZGF0YTsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOworCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7CisJdWludDMyX3QgbWVtX21hcF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgbHNtX2xhYl9od19wYXJhbXMgeworCXUxNiBzYW1wbGVfcmF0ZTsKKwl1MTYgc2FtcGxlX3NpemU7CisJdTMyIGJ1Zl9zejsKKwl1MzIgcGVyaW9kX2NvdW50OworfTsKKworc3RydWN0IGxzbV9jbGllbnQgeworCWludAkJc2Vzc2lvbjsKKwlsc21fYXBwX2NiCWNiOworCWF0b21pY190CWNtZF9zdGF0ZTsKKwl2b2lkCQkqcHJpdjsKKwlzdHJ1Y3QgYXByX3N2YyAgKmFwcjsKKwlzdHJ1Y3QgYXByX3N2YyAgKm1tYXBfYXByOworCXN0cnVjdCBtdXRleCAgICBjbWRfbG9jazsKKwlzdHJ1Y3QgbHNtX3NvdW5kX21vZGVsIHNvdW5kX21vZGVsOworCXdhaXRfcXVldWVfaGVhZF90IGNtZF93YWl0OworCXVpbnQzMl90CWNtZF9lcnJfY29kZTsKKwl1aW50MTZfdAltb2RlOworCXVpbnQxNl90CWNvbm5lY3RfdG9fcG9ydDsKKwl1aW50OF90CQludW1fY29uZmlkZW5jZV9sZXZlbHM7CisJdWludDhfdAkJKmNvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wJCW9wZW5lZDsKKwlib29sCQlzdGFydGVkOworCWRtYV9hZGRyX3QJbHNtX2NhbF9waHlfYWRkcjsKKwl1aW50MzJfdAlsc21fY2FsX3NpemU7CisJdWludDMyX3QJYXBwX2lkOworCWJvb2wJCWxhYl9lbmFibGU7CisJYm9vbAkJbGFiX3N0YXJ0ZWQ7CisJc3RydWN0IGxzbV9sYWJfYnVmZmVyICpsYWJfYnVmZmVyOworCXN0cnVjdCBsc21fbGFiX2h3X3BhcmFtcyBod19wYXJhbXM7CisJYm9vbAkJdXNlX3RvcG9sb2d5OworfTsKKworc3RydWN0IGxzbV9zdHJlYW1fY21kX29wZW5fdHggeworCXN0cnVjdCBhcHJfaGRyICBoZHI7CisJdWludDE2X3QJYXBwX2lkOworCXVpbnQxNl90CXJlc2VydmVkOworCXVpbnQzMl90CXNhbXBsaW5nX3JhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX3N0cmVhbV9jbWRfb3Blbl90eF92MiB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90CXRvcG9sb2d5X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jdXN0b21fdG9wb2xvZ2llcyB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90IGRhdGFfcGF5bG9hZF9hZGRyX2xzdzsKKwl1aW50MzJfdCBkYXRhX3BheWxvYWRfYWRkcl9tc3c7CisJdWludDMyX3QgbWVtX21hcF9oYW5kbGU7CisJdWludDMyX3QgYnVmZmVyX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX3BhcmFtX3NpemVfcmVzZXJ2ZWQgeworCXVpbnQxNl90IHBhcmFtX3NpemU7CisJdWludDE2X3QgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBsc21fcGFyYW1fc2l6ZSB7CisJdWludDMyX3QgcGFyYW1fc2l6ZTsKKwlzdHJ1Y3QgbHNtX3BhcmFtX3NpemVfcmVzZXJ2ZWQgc3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIHsKKwl1aW50MzJfdAltb2R1bGVfaWQ7CisJdWludDMyX3QJcGFyYW1faWQ7CisJdW5pb24gbHNtX3BhcmFtX3NpemUgcF9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9wYXJhbV9vcF9tb2RlIHsKKwlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIGNvbW1vbjsKKwl1aW50MzJfdAltaW5vcl92ZXJzaW9uOworCXVpbnQxNl90CW1vZGU7CisJdWludDE2X3QJcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX3BhcmFtX2Nvbm5lY3RfdG9fcG9ydCB7CisJc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247CisJdWludDMyX3QJbWlub3JfdmVyc2lvbjsKKwkvKiBBRkUgcG9ydCBpZCB0aGF0IHJlY2VpdmVzIHZvaWNlIHdha2UgdXAgZGF0YSAqLworCXVpbnQxNl90CXBvcnRfaWQ7CisJdWludDE2X3QJcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisKKy8qCisgKiBUaGlzIHBhcmFtIGNhbm5vdCBiZSBzZW50IGluIHRoaXMgZm9ybWF0LgorICogVGhlIGFjdHVhbCBudW1iZXIgb2YgY29uZmlkZW5jZSBsZXZlbCB2YWx1ZXMKKyAqIG5lZWQgdG8gYXBwZW5kZWQgdG8gdGhpcyBwYXJhbSBwYXlsb2FkLgorICovCitzdHJ1Y3QgbHNtX3BhcmFtX21pbl9jb25maWRlbmNlX2xldmVscyB7CisJc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247CisJdWludDhfdAkJbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciB7CisJdWludDMyX3QJZGF0YV9wYXlsb2FkX3NpemU7CisJdWludDMyX3QJZGF0YV9wYXlsb2FkX2FkZHJfbHN3OworCXVpbnQzMl90CWRhdGFfcGF5bG9hZF9hZGRyX21zdzsKKwl1aW50MzJfdAltZW1fbWFwX2hhbmRsZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsc21fY21kX3NldF9wYXJhbXMgeworCXN0cnVjdCBhcHJfaGRyICBtc2dfaGRyOworCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgcGFyYW1faGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtc19jb25mIHsKKwlzdHJ1Y3QgYXByX2hkciAgbXNnX2hkcjsKKwlzdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyIHBhcmFtc19oZHI7CisJc3RydWN0IGxzbV9wYXJhbV9taW5fY29uZmlkZW5jZV9sZXZlbHMJY29uZl9wYXlsb2FkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jbWRfc2V0X29wbW9kZV9jb25uZWN0cG9ydCB7CisJc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7CisJc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOworCXN0cnVjdCBsc21fcGFyYW1fY29ubmVjdF90b19wb3J0CWNvbm5lY3RfdG9fcG9ydDsKKwlzdHJ1Y3QgbHNtX3BhcmFtX29wX21vZGUJCW9wX21vZGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX3BhcmFtX2VwZF90aHJlcyB7CisJc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247CisJdWludDMyX3QJbWlub3JfdmVyc2lvbjsKKwl1aW50MzJfdAllcGRfYmVnaW47CisJdWludDMyX3QJZXBkX2VuZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsc21fY21kX3NldF9lcGRfdGhyZXNob2xkIHsKKwlzdHJ1Y3QgYXByX2hkciBtc2dfaGRyOworCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgcGFyYW1faGRyOworCXN0cnVjdCBsc21fcGFyYW1fZXBkX3RocmVzIGVwZF90aHJlczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsc21fcGFyYW1fZ2FpbiB7CisJc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247CisJdWludDMyX3QJbWlub3JfdmVyc2lvbjsKKwl1aW50MTZfdAlnYWluOworCXVpbnQxNl90CXJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jbWRfc2V0X2dhaW4geworCXN0cnVjdCBhcHJfaGRyIG1zZ19oZHI7CisJc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbV9oZHI7CisJc3RydWN0IGxzbV9wYXJhbV9nYWluIGxzbV9nYWluOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jbWRfcmVnX3NuZF9tb2RlbCB7CisJc3RydWN0IGFwcl9oZHIJaGRyOworCXVpbnQzMl90CW1vZGVsX3NpemU7CisJdWludDMyX3QJbW9kZWxfYWRkcl9sc3c7CisJdWludDMyX3QJbW9kZWxfYWRkcl9tc3c7CisJdWludDMyX3QJbWVtX21hcF9oYW5kbGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX2xhYl9lbmFibGUgeworCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gY29tbW9uOworCXVpbnQxNl90IGVuYWJsZTsKKwl1aW50MTZfdCByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsc21fcGFyYW1zX2xhYl9lbmFibGUgeworCXN0cnVjdCBhcHJfaGRyIG1zZ19oZHI7CisJc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOworCXN0cnVjdCBsc21fbGFiX2VuYWJsZSBsYWJfZW5hYmxlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9sYWJfY29uZmlnIHsKKwlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIGNvbW1vbjsKKwl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQzMl90IHdha2VfdXBfbGF0ZW5jeV9tczsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IGxzbV9wYXJhbXNfbGFiX2NvbmZpZyB7CisJc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7CisJc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOworCXN0cnVjdCBsc21fbGFiX2NvbmZpZyBsYWJfY29uZmlnOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxzbV9jbWRfcmVhZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90IGJ1Zl9hZGRyX2xzdzsKKwl1aW50MzJfdCBidWZfYWRkcl9tc3c7CisJdWludDMyX3QgbWVtX21hcF9oYW5kbGU7CisJdWludDMyX3QgYnVmX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX2NtZF9yZWFkX2RvbmUgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgYnVmX2FkZHJfbHN3OworCXVpbnQzMl90IGJ1Zl9hZGRyX21zdzsKKwl1aW50MzJfdCBtZW1fbWFwX2hhbmRsZTsKKwl1aW50MzJfdCB0b3RhbF9zaXplOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCB0aW1lc3RhbXBfbHN3OworCXVpbnQzMl90IHRpbWVzdGFtcF9tc3c7CisJdWludDMyX3QgZmxhZ3M7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbHNtX2NsaWVudCAqcTZsc21fY2xpZW50X2FsbG9jKGxzbV9hcHBfY2IgY2IsIHZvaWQgKnByaXYpOwordm9pZCBxNmxzbV9jbGllbnRfZnJlZShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKK2ludCBxNmxzbV9vcGVuKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHVpbnQxNl90IGFwcF9pZCk7CitpbnQgcTZsc21fc3RhcnQoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgYm9vbCB3YWl0KTsKK2ludCBxNmxzbV9zdG9wKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIGJvb2wgd2FpdCk7CitpbnQgcTZsc21fc25kX21vZGVsX2J1Zl9hbGxvYyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBzaXplX3QgbGVuLAorCQkJICAgICAgYm9vbCBhbGxvY2F0ZV9tb2R1bGVfZGF0YSk7CitpbnQgcTZsc21fc25kX21vZGVsX2J1Zl9mcmVlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpOworaW50IHE2bHNtX2Nsb3NlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpOworaW50IHE2bHNtX3JlZ2lzdGVyX3NvdW5kX21vZGVsKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgbW9kZSwKKwkJCSAgICAgICBib29sIGRldGVjdGZhaWx1cmUpOworaW50IHE2bHNtX3NldF9kYXRhKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCSAgIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlIG1vZGUsCisJCSAgIGJvb2wgZGV0ZWN0ZmFpbHVyZSk7CitpbnQgcTZsc21fZGVyZWdpc3Rlcl9zb3VuZF9tb2RlbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKK3ZvaWQgc2V0X2xzbV9wb3J0KGludCBsc21fcG9ydCk7CitpbnQgZ2V0X2xzbV9wb3J0KHZvaWQpOworaW50IHE2bHNtX2xhYl9jb250cm9sKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHUzMiBlbmFibGUpOworaW50IHE2bHNtX3N0b3BfbGFiKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpOworaW50IHE2bHNtX3JlYWQoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgc3RydWN0IGxzbV9jbWRfcmVhZCAqcmVhZCk7CitpbnQgcTZsc21fbGFiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBib29sIGFsbG9jKTsKK2ludCBxNmxzbV9zZXRfb25lX3BhcmFtKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8sIHZvaWQgKmRhdGEsCisJCQllbnVtIExTTV9QQVJBTV9UWVBFIHBhcmFtX3R5cGUpOwordm9pZCBxNmxzbV9zbV9zZXRfcGFyYW1fZGF0YShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAorCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8sCisJCXNpemVfdCAqb2Zmc2V0KTsKKyNlbmRpZiAvKiBfX1E2TFNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC92b2ljZV9wYXJhbXMuaCBiL2luY2x1ZGUvc291bmQvdm9pY2VfcGFyYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlM2I5ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvdm9pY2VfcGFyYW1zLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX1ZPSUNFX1BBUkFNU19IX18KKyNkZWZpbmUgX19WT0lDRV9QQVJBTVNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorCitlbnVtIHZvaWNlX2xjaF9tb2RlIHsKKwlWT0lDRV9MQ0hfU1RBUlQgPSAxLAorCVZPSUNFX0xDSF9TVE9QCit9OworCisjZGVmaW5lIFNORFJWX1ZPSUNFX0lPQ1RMX0xDSCBfSU9XKCdVJywgMHgwMCwgZW51bSB2b2ljZV9sY2hfbW9kZSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ZvaWNlX3N2Yy5oIGIvaW5jbHVkZS9zb3VuZC92b2ljZV9zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzUwNTNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC92b2ljZV9zdmMuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9fVk9JQ0VfU1ZDX0hfXworI2RlZmluZSBfX1ZPSUNFX1NWQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBWT0lDRV9TVkNfRFJJVkVSX05BTUUgInZvaWNlX3N2YyIKKworI2RlZmluZSBWT0lDRV9TVkNfTVZNX1NUUiAiTVZNIgorI2RlZmluZSBWT0lDRV9TVkNfQ1ZTX1NUUiAiQ1ZTIgorI2RlZmluZSBNQVhfQVBSX1NFUlZJQ0VfTkFNRV9MRU4gIDY0CisKKyNkZWZpbmUgTVNHX1JFR0lTVEVSIDB4MQorI2RlZmluZSBNU0dfUkVRVUVTVCAgMHgyCisjZGVmaW5lIE1TR19SRVNQT05TRSAweDMKKworc3RydWN0IHZvaWNlX3N2Y193cml0ZV9tc2cgeworCV9fdTMyIG1zZ190eXBlOworCV9fdTggcGF5bG9hZFswXTsKK307CisKK3N0cnVjdCB2b2ljZV9zdmNfcmVnaXN0ZXIgeworCWNoYXIgc3ZjX25hbWVbTUFYX0FQUl9TRVJWSUNFX05BTUVfTEVOXTsKKwlfX3UzMiBzcmNfcG9ydDsKKwlfX3U4IHJlZ19mbGFnOworfTsKKworc3RydWN0IHZvaWNlX3N2Y19jbWRfcmVzcG9uc2UgeworCV9fdTMyIHNyY19wb3J0OworCV9fdTMyIGRlc3RfcG9ydDsKKwlfX3UzMiB0b2tlbjsKKwlfX3UzMiBvcGNvZGU7CisJX191MzIgcGF5bG9hZF9zaXplOworCV9fdTggcGF5bG9hZFswXTsKK307CisKK3N0cnVjdCB2b2ljZV9zdmNfY21kX3JlcXVlc3QgeworCWNoYXIgc3ZjX25hbWVbTUFYX0FQUl9TRVJWSUNFX05BTUVfTEVOXTsKKwlfX3UzMiBzcmNfcG9ydDsKKwlfX3UzMiBkZXN0X3BvcnQ7CisJX191MzIgdG9rZW47CisJX191MzIgb3Bjb2RlOworCV9fdTMyIHBheWxvYWRfc2l6ZTsKKwlfX3U4IHBheWxvYWRbMF07Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvd2NkLWRzcC1tZ3IuaCBiL2luY2x1ZGUvc291bmQvd2NkLWRzcC1tZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmViOWIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC93Y2QtZHNwLW1nci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19XQ0RfRFNQX01HUl9IX18KKyNkZWZpbmUgX19XQ0RfRFNQX01HUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUaGVzZSBlbnVtcyBjb3JyZXNwb25kIHRvIHRoZSBjb21wb25lbnQgdHlwZXMKKyAqIHRoYXQgd2NkLWRzcC1tYW5hZ2VyIGRyaXZlciB3aWxsIHVzZS4gVGhlIG9yZGVyCisgKiBvZiB0aGUgZW51bXMgc3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUKKyAqIG1hbmFnZXIgZHJpdmVyIHdpbGwgcGVyZm9ybSB0aGUgc2VxdWVuY2luZy4KKyAqIENoYW5naW5nIHRoaXMgd2lsbCBjYXVzZSB0aGUgc2VxdWVuY2luZyBvcmRlcgorICogdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLgorICovCitlbnVtIHdkc3BfY21wbnRfdHlwZSB7CisJLyogQ29tcG9uZW50IHRvIGNvbnRyb2wgdGhlIERTUCAqLworCVdEU1BfQ01QTlRfQ09OVFJPTCA9IDAsCisJLyogQ29tcG9uZW50IHRvIHBlcmZvcm0gZGF0YSB0cmFuc2ZlciB0by9mcm9tIERTUCAqLworCVdEU1BfQ01QTlRfVFJBTlNQT1JULAorCS8qIENvbXBvbmVudCB0aGF0IHBlcmZvcm1zIGhpZ2ggbGV2ZWwgSVBDICovCisJV0RTUF9DTVBOVF9JUEMsCisKKwlXRFNQX0NNUE5UX1RZUEVfTUFYLAorfTsKKworZW51bSB3ZHNwX2V2ZW50X3R5cGUgeworCS8qIEluaXRpYWxpemF0aW9uIHJlbGF0ZWQgKi8KKwlXRFNQX0VWRU5UX1BPU1RfSU5JVCwKKworCS8qIEltYWdlIGRvd25sb2FkIHJlbGF0ZWQgKi8KKwlXRFNQX0VWRU5UX1BSRV9ETE9BRF9DT0RFLAorCVdEU1BfRVZFTlRfRExPQURfU0VDVElPTiwKKwlXRFNQX0VWRU5UX1BPU1RfRExPQURfQ09ERSwKKwlXRFNQX0VWRU5UX1BSRV9ETE9BRF9EQVRBLAorCVdEU1BfRVZFTlRfUE9TVF9ETE9BRF9EQVRBLAorCVdEU1BfRVZFTlRfRExPQURfRkFJTEVELAorCisJV0RTUF9FVkVOVF9SRUFEX1NFQ1RJT04sCisKKwkvKiBEU1AgYm9vdCByZWxhdGVkICovCisJV0RTUF9FVkVOVF9QUkVfQk9PVFVQLAorCVdEU1BfRVZFTlRfRE9fQk9PVCwKKwlXRFNQX0VWRU5UX1BPU1RfQk9PVFVQLAorCVdEU1BfRVZFTlRfUFJFX1NIVVRET1dOLAorCVdEU1BfRVZFTlRfRE9fU0hVVERPV04sCisJV0RTUF9FVkVOVF9QT1NUX1NIVVRET1dOLAorCisJLyogSVJRIGhhbmRsaW5nIHJlbGF0ZWQgKi8KKwlXRFNQX0VWRU5UX0lQQzFfSU5UUiwKKworCS8qIFN1c3BlbmQvUmVzdW1lIHJlbGF0ZWQgKi8KKwlXRFNQX0VWRU5UX1NVU1BFTkQsCisJV0RTUF9FVkVOVF9SRVNVTUUsCit9OworCitlbnVtIHdkc3Bfc2lnbmFsIHsKKwkvKiBIYXJkd2FyZSBnZW5lcmF0ZWQgaW50ZXJydXB0cyBzaWduYWxsZWQgdG8gbWFuYWdlciAqLworCVdEU1BfSVBDMV9JTlRSLAorCVdEU1BfRVJSX0lOVFIsCisKKwkvKiBPdGhlciBzaWduYWxzICovCisJV0RTUF9DRENfRE9XTl9TSUdOQUwsCisJV0RTUF9DRENfVVBfU0lHTkFMLAorfTsKKworLyoKKyAqIHdkc3BfY21wbnRfb3BzOiBvcHMvZnVuY3Rpb24gY2FsbGJhY2tzIGZvciBjb21wb25lbnRzCisgKiBAaW5pdDogY2FsbGVkIGJ5IG1hbmFnZXIgZHJpdmVyLCBjb21wb25lbnQgaXMgZXhwZWN0ZWQKKyAqCSAgdG8gaW5pdGlhbGl6ZSBpdHNlbGYgaW4gdGhpcyBjYWxsYmFjaworICogQGRlaW5pdDogY2FsbGVkIGJ5IG1hbmFnZXIgZHJpdmVyLCBjb21wb25lbnQgc2hvdWxkCisgKgkgICAgZGUtaW5pdGlhbGl6ZSBpdHNlbGYgaW4gdGhpcyBjYWxsYmFjaworICogQGV2ZW50X2hhbmRsZXI6IEV2ZW50IGhhbmRsZXIgZm9yIGVhY2ggY29tcG9uZW50LCBjYWxsZWQKKyAqCQkgICBieSB0aGUgbWFuYWdlciBhcyBwZXIgc2VxdWVuY2UKKyAqLworc3RydWN0IHdkc3BfY21wbnRfb3BzIHsKKwlpbnQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKnByaXZfZGF0YSk7CisJaW50ICgqZGVpbml0KShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKnByaXZfZGF0YSk7CisJaW50ICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGRldmljZSAqLCB2b2lkICpwcml2X2RhdGEsCisJCQkgICAgIGVudW0gd2RzcF9ldmVudF90eXBlLCB2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCB3ZHNwX2ltZ19zZWN0aW9uIHsKKwl1MzIgYWRkcjsKKwlzaXplX3Qgc2l6ZTsKKwl1OCAqZGF0YTsKK307CisKK3N0cnVjdCB3ZHNwX2Vycl9zaWduYWxfYXJnIHsKKwlib29sIG1lbV9kdW1wc19lbmFibGVkOworCXUzMiByZW1vdGVfc3RhcnRfYWRkcjsKKwlzaXplX3QgZHVtcF9zaXplOworfTsKKworLyoKKyAqIHdkc3Bfb3BzOiBvcHMvZnVuY3Rpb24gY2FsbGJhY2tzIGZvciBtYW5hZ2VyIGRyaXZlcgorICogQHJlZ2lzdGVyX2NtcG50X29wczogY29tcG9uZW50cyB3aWxsIHVzZSB0aGlzIHRvIHJlZ2lzdGVyCisgKgkJCXRoZWlyIG93biBvcHMgdG8gbWFuYWdlciBkcml2ZXIKKyAqIEBnZXRfZGV2X2Zvcl9jbXBudDogY29tcG9uZW50cyBjYW4gdXNlIHRoaXMgdG8gZ2V0IGhhbmRsZQorICoJCSAgICAgICB0byBzdHJ1Y3QgZGV2aWNlICogb2YgYW55IG90aGVyIGNvbXBvbmVudAorICogQHNpZ25hbF9oYW5kbGVyOiBjYWxsYmFjayB0byBub3RpZnkgbWFuYWdlciBkcml2ZXIgdGhhdCBzaWduYWwKKyAqCQkgICAgaGFzIG9jY3VycmVkLiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0CisgKgkJICAgIGNvbnRleHQgYXMgdGhpcyBjYW4gc2xlZXAKKyAqIEB2b3RlX2Zvcl9kc3A6IG5vdGlmaWVzIG1hbmFnZXIgdGhhdCBkc3Agc2hvdWxkIGJlIGJvb3RlZCB1cAorICogQHN1c3BlbmQ6IG5vdGlmaWVzIG1hbmFnZXIgdGhhdCBvbmUgY29tcG9uZW50IHdhbnRzIHRvIHN1c3BlbmQuCisgKgkgICAgIE1hbmFnZXIgd2lsbCBtYWtlIHN1cmUgdG8gc3VzcGVuZCBhbGwgY29tcG9uZW50cyBpbiBvcmRlcgorICogQHJlc3VtZTogbm90aWZpZXMgbWFuYWdlciB0aGF0IG9uZSBjb21wb25lbnQgd2FudHMgdG8gcmVzdW1lLgorICoJICAgIE1hbmFnZXIgd2lsbCBtYWtlIHN1cmUgdG8gcmVzdW1lIGFsbCBjb21wb25lbnRzIGluIG9yZGVyCisgKi8KKworc3RydWN0IHdkc3BfbWdyX29wcyB7CisJaW50ICgqcmVnaXN0ZXJfY21wbnRfb3BzKShzdHJ1Y3QgZGV2aWNlICp3ZHNwX2RldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQkJICB2b2lkICpwcml2X2RhdGEsCisJCQkJICBzdHJ1Y3Qgd2RzcF9jbXBudF9vcHMgKm9wcyk7CisJc3RydWN0IGRldmljZSAqKCpnZXRfZGV2X2Zvcl9jbXBudCkoc3RydWN0IGRldmljZSAqd2RzcF9kZXYsCisJCQkJCSAgICBlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlKTsKKwlpbnQgKCpzaWduYWxfaGFuZGxlcikoc3RydWN0IGRldmljZSAqd2RzcF9kZXYsCisJCQkgICAgICBlbnVtIHdkc3Bfc2lnbmFsIHNpZ25hbCwgdm9pZCAqYXJnKTsKKwlpbnQgKCp2b3RlX2Zvcl9kc3ApKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2LCBib29sIHZvdGUpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2KTsKK307CisKKyNlbmRpZiAvKiBlbmQgb2YgX19XQ0RfRFNQX01HUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvd2NkLXNwaS5oIGIvaW5jbHVkZS9zb3VuZC93Y2Qtc3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmZjU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvd2NkLXNwaS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1dDRF9TUElfSF9fCisjZGVmaW5lIF9fV0NEX1NQSV9IX18KKworc3RydWN0IHdjZF9zcGlfbXNnIHsKKwkvKgorCSAqIENhbGxlcidzIGJ1ZmZlciBwb2ludGVyIHRoYXQgaG9sZHMgZGF0YSB0bworCSAqIGJlIHRyYW5zbWl0dGVkIGluIGNhc2Ugb2YgZGF0YV93cml0ZSBhbmQKKwkgKiBkYXRhIHRvIGJlIGNvcGllZCB0byBpbiBjYXNlIG9mIGRhdGFfcmVhZC4KKwkgKi8KKwl2b2lkICpkYXRhOworCisJLyogTGVuZ3RoIG9mIGRhdGEgdG8gd3JpdGUvcmVhZCAqLworCXNpemVfdCBsZW47CisKKwkvKgorCSAqIEFkZHJlc3MgaW4gcmVtb3RlIG1lbW9yeSB0byB3cml0ZSB0bworCSAqIG9yIHJlYWQgZnJvbS4KKwkgKi8KKwl1MzIgcmVtb3RlX2FkZHI7CisKKwkvKiBCaXRtYXNrIG9mIGZsYWdzLCBjdXJyZW50bHkgdW51c2VkICovCisJdTMyIGZsYWdzOworfTsKKworI2lmZGVmIENPTkZJR19TTkRfU09DX1dDRF9TUEkKKworaW50IHdjZF9zcGlfZGF0YV93cml0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgd2NkX3NwaV9tc2cgKm1zZyk7CitpbnQgd2NkX3NwaV9kYXRhX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHdjZF9zcGlfbXNnICptc2cpOworCisjZWxzZQorCitpbnQgd2NkX3NwaV9kYXRhX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCB3Y2Rfc3BpX21zZyAqbXNnKQoreworCXJldHVybiAtRU5PREVWOworfQorCitpbnQgd2NkX3NwaV9kYXRhX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHdjZF9zcGlfbXNnICptc2cpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNlbmRpZiAvKiBFbmQgb2YgQ09ORklHX1NORF9TT0NfV0NEX1NQSSAqLworCisjZW5kaWYgLyogRW5kIG9mIF9fV0NEX1NQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vbXNtX2RybV9wcC5oIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKaW5kZXggOWVkM2ExMy4uOTQzOTQwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKQEAgLTEsOCArMSw3IEBACiAjaWZuZGVmIF9NU01fRFJNX1BQX0hfCiAjZGVmaW5lIF9NU01fRFJNX1BQX0hfCiAKLSNpbmNsdWRlIDxkcm0vZHJtLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogLyoqCiAgKiBzdHJ1Y3QgZHJtX21zbV9wY2NfY29lZmYgLSBQQ0MgY29lZmZpY2llbnQgc3RydWN0dXJlIGZvciBlYWNoIGNvbG9yCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuCkBAIC03OSw0ICs3OCw2MCBAQAogCV9fdTMyIHZhbF9yZWdpb247CiB9OwogCisjZGVmaW5lIEdBTVVUXzNEX01PREVfMTcgMQorI2RlZmluZSBHQU1VVF8zRF9NT0RFXzUgMgorI2RlZmluZSBHQU1VVF8zRF9NT0RFXzEzIDMKKworI2RlZmluZSBHQU1VVF8zRF9NT0RFMTdfVEJMX1NaIDEyMjkKKyNkZWZpbmUgR0FNVVRfM0RfTU9ERTVfVEJMX1NaIDMyCisjZGVmaW5lIEdBTVVUXzNEX01PREUxM19UQkxfU1ogNTUwCisjZGVmaW5lIEdBTVVUXzNEX1NDQUxFX09GRl9TWiAxNgorI2RlZmluZSBHQU1VVF8zRF9UQkxfTlVNIDQKKyNkZWZpbmUgR0FNVVRfM0RfU0NBTEVfT0ZGX1RCTF9OVU0gMworI2RlZmluZSBHQU1VVF8zRF9NQVBfRU4gKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX21zbV8zZF9jb2wgLSAzZCBnYW11dCBjb2xvciBjb21wb25lbnQgc3RydWN0dXJlCisgKiBAYzA6IEhvbGRzIGMwIHZhbHVlCisgKiBAYzJfYzE6IEhvbGRzIGMyL2MxIHZhbHVlcworICovCitzdHJ1Y3QgZHJtX21zbV8zZF9jb2wgeworCV9fdTMyIGMwOworCV9fdTMyIGMyX2MxOworfTsKKy8qKgorICogc3RydWN0IGRybV9tc21fM2RfZ2FtdXQgLSAzZCBnYW11dCBmZWF0dXJlIHN0cnVjdHVyZQorICogQGZsYWdzOiBmbGFncyBmb3IgdGhlIGZlYXR1cmUgdmFsdWVzIGFyZToKKyAqICAgICAgICAgMCAtIG5vIG1hcAorICogICAgICAgICBHQU1VVF8zRF9NQVBfRU4gLSBlbmFibGUgbWFwCisgKiBAbW9kZTogbHV0IG1vZGUgY2FuIHRha2UgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAtIEdBTVVUXzNEX01PREVfMTcKKyAqICAgICAgICAtIEdBTVVUXzNEX01PREVfNQorICogICAgICAgIC0gR0FNVVRfM0RfTU9ERV8xMworICogQHNjYWxlX29mZjogU2NhbGUgb2Zmc2V0IHRhYmxlCisgKiBAY29sOiBDb2xvciBjb21wb25lbnQgdGFibGVzCisgKi8KK3N0cnVjdCBkcm1fbXNtXzNkX2dhbXV0IHsKKwlfX3U2NCBmbGFnczsKKwlfX3UzMiBtb2RlOworCV9fdTMyIHNjYWxlX29mZltHQU1VVF8zRF9TQ0FMRV9PRkZfVEJMX05VTV1bR0FNVVRfM0RfU0NBTEVfT0ZGX1NaXTsKKwlzdHJ1Y3QgZHJtX21zbV8zZF9jb2wgY29sW0dBTVVUXzNEX1RCTF9OVU1dW0dBTVVUXzNEX01PREUxN19UQkxfU1pdOworfTsKKworI2RlZmluZSBQR0NfVEJMX0xFTiA1MTIKKyNkZWZpbmUgUEdDXzhCX1JPVU5EICgxIDw8IDApCisvKioKKyAqIHN0cnVjdCBkcm1fbXNtX3BnY19sdXQgLSBwZ2MgbHV0IGZlYXR1cmUgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGZsYWdzIGZvciB0aGUgZmVhdHVlIHZhbHVlcyBjYW4gYmU6CisgKiAgICAgICAgIC0gUEdDXzhCX1JPVU5ECisgKiBAYzA6IGNvbG9yMCBjb21wb25lbnQgbHV0CisgKiBAYzE6IGNvbG9yMSBjb21wb25lbnQgbHV0CisgKiBAYzI6IGNvbG9yMiBjb21wb25lbnQgbHV0CisgKi8KK3N0cnVjdCBkcm1fbXNtX3BnY19sdXQgeworCV9fdTY0IGZsYWdzOworCV9fdTMyIGMwW1BHQ19UQkxfTEVOXTsKKwlfX3UzMiBjMVtQR0NfVEJMX0xFTl07CisJX191MzIgYzJbUEdDX1RCTF9MRU5dOworfTsKICNlbmRpZiAvKiBfTVNNX0RSTV9QUF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKaW5kZXggYWU2ZmEyZi4uM2UyNDQ5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCkBAIC0yMiw2ICsyMiw3IEBACiBoZWFkZXIteSArPSBuZXRmaWx0ZXJfaXB2Ni8KIGhlYWRlci15ICs9IHVzYi8KIGhlYWRlci15ICs9IHdpbWF4LworaGVhZGVyLXkgKz0gbWZkLwogaGVhZGVyLXkgKz0gbXNtX2lwYS5oCiBnZW5oZHIteSArPSB2ZXJzaW9uLmgKIApAQCAtNjIsNiArNjMsNyBAQAogaGVhZGVyLXkgKz0gYXV0b19mczQuaAogaGVhZGVyLXkgKz0gYXV0b19mcy5oCiBoZWFkZXIteSArPSBhdXh2ZWMuaAoraGVhZGVyLXkgKz0gYXZ0aW1lci5oCiBoZWFkZXIteSArPSBheDI1LmgKIGhlYWRlci15ICs9IGIxbGxpLmgKIGhlYWRlci15ICs9IGJheWNvbS5oCkBAIC0yODEsNiArMjgzLDIzIEBACiBoZWFkZXIteSArPSBtcm91dGUuaAogaGVhZGVyLXkgKz0gbXNkb3NfZnMuaAogaGVhZGVyLXkgKz0gbXNnLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpby5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fYWFjLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19hYzMuaAoraGVhZGVyLXkgKz0gbXNtX2F1ZGlvX2Ftcm5iLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19hbXJ3Yi5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fYW1yd2JwbHVzLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19jYWxpYnJhdGlvbi5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fbXZzLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19xY3AuaAoraGVhZGVyLXkgKz0gbXNtX2F1ZGlvX3NiYy5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fdm9pY2VtZW1vLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb193bWEuaAoraGVhZGVyLXkgKz0gbXNtX2F1ZGlvX3dtYXByby5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fYWxhYy5oCitoZWFkZXIteSArPSBtc21fYXVkaW9fYXBlLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19nNzExLmgKK2hlYWRlci15ICs9IG1zbV9hdWRpb19nNzExX2RlYy5oCiBoZWFkZXIteSArPSBtc21faW9uLmgKIGhlYWRlci15ICs9IG1zbV9pcGMuaAogaGVhZGVyLXkgKz0gbXNtX2tnc2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2F2dGltZXIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hdnRpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiNTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9hdnRpbWVyLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVUFQSV9BVlRJTUVSX0gKKyNkZWZpbmUgX1VBUElfQVZUSU1FUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIE1BSk9SX05VTSAxMDAKKworI2RlZmluZSBJT0NUTF9HRVRfQVZUSU1FUl9USUNLIF9JT1IoTUFKT1JfTlVNLCAwLCB1aW50NjRfdCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWZkL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTgxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbWZkL0tidWlsZApAQCAtMCwwICsxLDIgQEAKK2hlYWRlci15ICs9IG1zbS1hZGllLWNvZGVjLmgKK2hlYWRlci15ICs9IHdjZDl4eHgvCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWZkL21zbS1hZGllLWNvZGVjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbWZkL21zbS1hZGllLWNvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1MjNjMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvbXNtLWFkaWUtY29kZWMuaApAQCAtMCwwICsxLDE0NyBAQAorI2lmbmRlZiBfX1VBUElfTUZEX01TTV9BRElFX0NPREVDX0gKKyNkZWZpbmUgX19VQVBJX01GRF9NU01fQURJRV9DT0RFQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBWYWx1ZSBSZXByZXNlbnRzIGEgZW50cnkgKi8KKyNkZWZpbmUgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlkgICAgICAgMHgxCisvKiBWYWx1ZSByZXByZXNlbnRpbmcgYSBkZWxheSB3YWl0ICovCisjZGVmaW5lIEFESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQgICAgICAweDIKKy8qIFZhbHVlIHJlcHJlc2VudGluZyBhIHN0YWdlIHJlYWNoZWQgKi8KKyNkZWZpbmUgQURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCAgIDB4MworCisvKiBUaGlzIHZhbHVlIGlzIHRoZSBzdGF0ZSBhZnRlciB0aGUgY2xpZW50IHNldHMgdGhlIHBhdGggKi8KKyNkZWZpbmUgQURJRV9DT0RFQ19QQVRIX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTAKKworLyogU3RhdGUgdG8gd2hpY2ggY2xpZW50IGFza3MgdGhlIGRydiB0byBwcm9jZWVkIHRvIHdoZXJlIGl0IGNhbgorICogc2V0IHVwIHRoZSBjbG9ja3MgYW5kIDAtZmlsbCBQQ00gYnVmZmVycworICovCisjZGVmaW5lIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisKKy8qIFN0YXRlIHRvIHdoaWNoIGNsaWVudCBhc2tzIHRoZSBkcnYgdG8gcHJvY2VlZCB0byB3aGVyZSBpdCBjYW4KKyAqIHN0YXJ0IHNlbmRpbmcgZGF0YSBhZnRlciBpbnRlcm5hbCBzdGVhZHkgc3RhdGUgZGVsYXkKKyAqLworI2RlZmluZSBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisKKy8qICBDbGllbnQgQXNrcyBhZGllIHRvIHN3aXRjaCBvZmYgdGhlIEFuYWxvZyBwb3J0aW9uIG9mIHRoZQorICogIHRoZSBpbnRlcm5hbCBjb2RlYy4gQWZ0ZXIgdGhlIHVzZSBvZiB0aGlzIHBhdGgKKyAqLworI2RlZmluZSBBRElFX0NPREVDX0FOQUxPR19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc1MAorCisKKy8qIENsaWVudCBBc2tzIGFkaWUgdG8gc3dpdGNoIG9mZiB0aGUgZGlnaXRhbCBwb3J0aW9uIG9mIHRoZQorICogIHRoZSBpbnRlcm5hbCBjb2RlYy4gQWZ0ZXIgc3dpdGNoaW5nIG9mZiB0aGUgYW5hbG9nIHBvcnRpb24uCisgKgorICogIDAtZmlsbCBQQ00gbWF5IG9yIG1heW5vdCBiZSBzZW50IGF0IHRoaXMgcG9pbnQKKyAqCisgKi8KKyNkZWZpbmUgQURJRV9DT0RFQ19ESUdJVEFMX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDAKKworLyogU3RhdGUgdG8gd2hpY2ggY2xpZW50IGFza3MgdGhlIGRydiB0byB3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAqIHRvIHRoZSByZWdpc3RlcnMKKyAqLworI2RlZmluZSBBRElFX0NPREVDX0ZMQVNIX0lNQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKiBQYXRoIHR5cGUgKi8KKyNkZWZpbmUgQURJRV9DT0RFQ19SWCAwCisjZGVmaW5lIEFESUVfQ09ERUNfVFggMQorI2RlZmluZSBBRElFX0NPREVDX0xCIDMKKyNkZWZpbmUgQURJRV9DT0RFQ19NQVggNAorCisjZGVmaW5lIEFESUVfQ09ERUNfUEFDS19FTlRSWShyZWcsIG1hc2ssIHZhbCkgKCh2YWwpfChtYXNrIDw8IDgpfChyZWcgPDwgMTYpKQorCisjZGVmaW5lIEFESUVfQ09ERUNfVU5QQUNLX0VOVFJZKHBhY2tlZCwgcmVnLCBtYXNrLCB2YWwpIFwKKwlkbyB7IFwKKwkJKChyZWcpID0gKChwYWNrZWQgPj4gMTYpICYgKDB4ZmYpKSk7IFwKKwkJKChtYXNrKSA9ICgocGFja2VkID4+IDgpICYgKDB4ZmYpKSk7IFwKKwkJKCh2YWwpID0gKChwYWNrZWQpICYgKDB4ZmYpKSk7IFwKKwl9IHdoaWxlICgwKTsKKworc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgeworCXUzMiB0eXBlOworCXUzMiBhY3Rpb247Cit9OworCitzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgeworCXN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0ICphY3Rpb25zOworCXUzMiBhY3Rpb25fc3o7CisJdTMyIGZyZXFfcGxhbjsKKwl1MzIgb3NyOworCS8qIHUzMiAgVm9sTWFzazsKKwkgKiB1MzIgIFNpZGV0b25lTWFzazsKKwkgKi8KK307CisKK3N0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIHsKKwl1MzIgcGF0aF90eXBlOyAvKiBSWCBvciBUWCAqLworCXUzMiBzZXR0aW5nX3N6OworCXN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSAqc2V0dGluZ3M7Cit9OworCitzdHJ1Y3QgYWRpZV9jb2RlY19yZWdpc3RlciB7CisJdTggcmVnOworCXU4IG1hc2s7CisJdTggdmFsOworfTsKKworc3RydWN0IGFkaWVfY29kZWNfcmVnaXN0ZXJfaW1hZ2UgeworCXN0cnVjdCBhZGllX2NvZGVjX3JlZ2lzdGVyICpyZWdzOworCXUzMiBpbWdfc3o7Cit9OworCitzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoOworCitzdHJ1Y3QgYWRpZV9jb2RlY19hbmNfZGF0YSB7CisJdTMyIHNpemU7CisJdTMyIHdyaXRlc1tdOworfTsKKworc3RydWN0IGFkaWVfY29kZWNfb3BlcmF0aW9ucyB7CisJaW50CSBjb2RlY19pZDsKKwlpbnQgKCpjb2RlY19vcGVuKShzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQlzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICoqcGF0aF9wcHRyKTsKKwlpbnQgKCpjb2RlY19jbG9zZSkoc3RydWN0IGFkaWVfY29kZWNfcGF0aCAqcGF0aF9wdHIpOworCWludCAoKmNvZGVjX3NldHBhdGgpKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnBhdGhfcHRyLAorCQkJCXUzMiBmcmVxX3BsYW4sIHUzMiBvc3IpOworCWludCAoKmNvZGVjX3Byb2NlZWRfc3RhZ2UpKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnBhdGhfcHRyLAorCQkJCQl1MzIgc3RhdGUpOworCXUzMiAoKmNvZGVjX2ZyZXFfc3VwcG9ydGVkKShzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkJdTMyIHJlcXVlc3RlZF9mcmVxKTsKKwlpbnQgKCpjb2RlY19lbmFibGVfc2lkZXRvbmUpKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnJ4X3BhdGhfcHRyLAorCQkJCQl1MzIgZW5hYmxlKTsKKwlpbnQgKCpjb2RlY19lbmFibGVfYW5jKShzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICpyeF9wYXRoX3B0ciwKKwkJdTMyIGVuYWJsZSwgc3RydWN0IGFkaWVfY29kZWNfYW5jX2RhdGEgKmNhbGlicmF0aW9uX3dyaXRlcyk7CisJaW50ICgqY29kZWNfc2V0X2RldmljZV9kaWdpdGFsX3ZvbHVtZSkoCisJCQkJCXN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnBhdGhfcHRyLAorCQkJCQl1MzIgbnVtX2NoYW5uZWxzLAorCQkJCQl1MzIgdm9sX3BlcmNlbnRhZ2UpOworCisJaW50ICgqY29kZWNfc2V0X2RldmljZV9hbmFsb2dfdm9sdW1lKShzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICpwYXRoX3B0ciwKKwkJCQkJCXUzMiBudW1fY2hhbm5lbHMsCisJCQkJCQl1MzIgdm9sdW1lKTsKKwlpbnQgKCpjb2RlY19zZXRfbWFzdGVyX21vZGUpKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnBhdGhfcHRyLAorCQkJCQl1OCBtYXN0ZXIpOworfTsKKworaW50IGFkaWVfY29kZWNfcmVnaXN0ZXJfY29kZWNfb3BlcmF0aW9ucygKKwkJCQljb25zdCBzdHJ1Y3QgYWRpZV9jb2RlY19vcGVyYXRpb25zICpjb2RlY19vcHMpOworaW50IGFkaWVfY29kZWNfb3BlbihzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSAqcHJvZmlsZSwKKwlzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICoqcGF0aF9wcHRyKTsKK2ludCBhZGllX2NvZGVjX3NldHBhdGgoc3RydWN0IGFkaWVfY29kZWNfcGF0aCAqcGF0aF9wdHIsCisJdTMyIGZyZXFfcGxhbiwgdTMyIG9zcik7CitpbnQgYWRpZV9jb2RlY19wcm9jZWVkX3N0YWdlKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnBhdGhfcHRyLCB1MzIgc3RhdGUpOworaW50IGFkaWVfY29kZWNfY2xvc2Uoc3RydWN0IGFkaWVfY29kZWNfcGF0aCAqcGF0aF9wdHIpOwordTMyIGFkaWVfY29kZWNfZnJlcV9zdXBwb3J0ZWQoc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkJCQkJdTMyIHJlcXVlc3RlZF9mcmVxKTsKK2ludCBhZGllX2NvZGVjX2VuYWJsZV9zaWRldG9uZShzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICpyeF9wYXRoX3B0ciwgdTMyIGVuYWJsZSk7CitpbnQgYWRpZV9jb2RlY19lbmFibGVfYW5jKHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKnJ4X3BhdGhfcHRyLCB1MzIgZW5hYmxlLAorCXN0cnVjdCBhZGllX2NvZGVjX2FuY19kYXRhICpjYWxpYnJhdGlvbl93cml0ZXMpOworaW50IGFkaWVfY29kZWNfc2V0X2RldmljZV9kaWdpdGFsX3ZvbHVtZShzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICpwYXRoX3B0ciwKKwkJdTMyIG51bV9jaGFubmVscywgdTMyIHZvbF9wZXJjZW50YWdlIC8qIGluIHBlcmNlbnRhZ2UgKi8pOworCitpbnQgYWRpZV9jb2RlY19zZXRfZGV2aWNlX2FuYWxvZ192b2x1bWUoc3RydWN0IGFkaWVfY29kZWNfcGF0aCAqcGF0aF9wdHIsCisJCXUzMiBudW1fY2hhbm5lbHMsIHUzMiB2b2x1bWUgLyogaW4gcGVyY2VudGFnZSAqLyk7CisKK2ludCBhZGllX2NvZGVjX3NldF9tYXN0ZXJfbW9kZShzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICpwYXRoX3B0ciwgdTggbWFzdGVyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21mZC93Y2Q5eHh4L0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvd2NkOXh4eC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1NTk2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvd2NkOXh4eC9LYnVpbGQKQEAgLTAsMCArMSwyIEBACitoZWFkZXIteSArPSB3Y2Q5eHh4X3JlZ2lzdGVycy5oCitoZWFkZXIteSArPSB3Y2Q5MzIwX3JlZ2lzdGVycy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbWZkL3djZDl4eHgvd2NkOTMyMF9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5MzIwX3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYWI2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbWZkL3djZDl4eHgvd2NkOTMyMF9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDEzOTkgQEAKKyNpZm5kZWYgV0NEOTMyMF9SRUdJU1RFUlNfSAorI2RlZmluZSBXQ0Q5MzIwX1JFR0lTVEVSU19ICisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oPgorCisjZGVmaW5lIFRBSUtPX0FfQ0hJUF9DVEwJCQlXQ0Q5WFhYX0FfQ0hJUF9DVEwKKyNkZWZpbmUgVEFJS09fQV9DSElQX0NUTF9fUE9SCQkJV0NEOVhYWF9BX0NISVBfQ1RMX19QT1IKKyNkZWZpbmUgVEFJS09fQV9DSElQX1NUQVRVUwkJCVdDRDlYWFhfQV9DSElQX1NUQVRVUworI2RlZmluZSBUQUlLT19BX0NISVBfU1RBVFVTX19QT1IJCVdDRDlYWFhfQV9DSElQX1NUQVRVU19fUE9SCisjZGVmaW5lIFRBSUtPX0FfQ0hJUF9JRF9CWVRFXzAJCQlXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzAKKyNkZWZpbmUgVEFJS09fQV9DSElQX0lEX0JZVEVfMF9fUE9SCQlXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzBfX1BPUgorI2RlZmluZSBUQUlLT19BX0NISVBfSURfQllURV8xCQkJV0NEOVhYWF9BX0NISVBfSURfQllURV8xCisjZGVmaW5lIFRBSUtPX0FfQ0hJUF9JRF9CWVRFXzFfX1BPUgkJV0NEOVhYWF9BX0NISVBfSURfQllURV8xX19QT1IKKyNkZWZpbmUgVEFJS09fQV9DSElQX0lEX0JZVEVfMgkJCVdDRDlYWFhfQV9DSElQX0lEX0JZVEVfMgorI2RlZmluZSBUQUlLT19BX0NISVBfSURfQllURV8yX19QT1IJCVdDRDlYWFhfQV9DSElQX0lEX0JZVEVfMl9fUE9SCisjZGVmaW5lIFRBSUtPX0FfQ0hJUF9JRF9CWVRFXzMJCQlXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzMKKyNkZWZpbmUgVEFJS09fQV9DSElQX0lEX0JZVEVfM19fUE9SCQlXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzNfX1BPUgorI2RlZmluZSBUQUlLT19BX0NISVBfVkVSU0lPTgkJCVdDRDlYWFhfQV9DSElQX1ZFUlNJT04KKyNkZWZpbmUgVEFJS09fQV9DSElQX1ZFUlNJT05fX1BPUgkJV0NEOVhYWF9BX0NISVBfVkVSU0lPTl9fUE9SCisjZGVmaW5lIFRBSUtPX0FfU0JfVkVSU0lPTgkJCVdDRDlYWFhfQV9TQl9WRVJTSU9OCisjZGVmaW5lIFRBSUtPX0FfU0JfVkVSU0lPTl9fUE9SCQkJV0NEOVhYWF9BX1NCX1ZFUlNJT05fX1BPUgorI2RlZmluZSBUQUlLT19BX1NMQVZFX0lEXzEJCQlXQ0Q5WFhYX0FfU0xBVkVfSURfMQorI2RlZmluZSBUQUlLT19BX1NMQVZFX0lEXzFfX1BPUgkJCVdDRDlYWFhfQV9TTEFWRV9JRF8xX19QT1IKKyNkZWZpbmUgVEFJS09fQV9TTEFWRV9JRF8yCQkJV0NEOVhYWF9BX1NMQVZFX0lEXzIKKyNkZWZpbmUgVEFJS09fQV9TTEFWRV9JRF8yX19QT1IJCQlXQ0Q5WFhYX0FfU0xBVkVfSURfMl9fUE9SCisjZGVmaW5lIFRBSUtPX0FfU0xBVkVfSURfMwkJCVdDRDlYWFhfQV9TTEFWRV9JRF8zCisjZGVmaW5lIFRBSUtPX0FfU0xBVkVfSURfM19fUE9SCQkJV0NEOVhYWF9BX1NMQVZFX0lEXzNfX1BPUgorI2RlZmluZSBUQUlLT19BX1BJTl9DVExfT0UwCQkJKDB4MDEwKQorI2RlZmluZSBUQUlLT19BX1BJTl9DVExfT0UwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUElOX0NUTF9PRTEJCQkoMHgwMTEpCisjZGVmaW5lIFRBSUtPX0FfUElOX0NUTF9PRTFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9QSU5fQ1RMX0RBVEEwCQkJKDB4MDEyKQorI2RlZmluZSBUQUlLT19BX1BJTl9DVExfREFUQTBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9QSU5fQ1RMX0RBVEExCQkJKDB4MDEzKQorI2RlZmluZSBUQUlLT19BX1BJTl9DVExfREFUQTFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9IRFJJVkVfR0VORVJJQwkJCSgweDAxOCkKKyNkZWZpbmUgVEFJS09fQV9IRFJJVkVfR0VORVJJQ19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0hEUklWRV9PVkVSUklERQkJCSgweDAxOSkKKyNkZWZpbmUgVEFJS09fQV9IRFJJVkVfT1ZFUlJJREVfX1BPUgkJCQkoMHgwOCkKKyNkZWZpbmUgVEFJS09fQV9BTkFfQ1NSX1dBSVRfU1RBVEUJCQkoMHgwMjApCisjZGVmaW5lIFRBSUtPX0FfQU5BX0NTUl9XQUlUX1NUQVRFX19QT1IJCQkJKDB4NDQpCisjZGVmaW5lIFRBSUtPX0FfUFJPQ0VTU19NT05JVE9SX0NUTDAJCQkoMHgwNDApCisjZGVmaW5lIFRBSUtPX0FfUFJPQ0VTU19NT05JVE9SX0NUTDBfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVEFJS09fQV9QUk9DRVNTX01PTklUT1JfQ1RMMQkJCSgweDA0MSkKKyNkZWZpbmUgVEFJS09fQV9QUk9DRVNTX01PTklUT1JfQ1RMMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1BST0NFU1NfTU9OSVRPUl9DVEwyCQkJKDB4MDQyKQorI2RlZmluZSBUQUlLT19BX1BST0NFU1NfTU9OSVRPUl9DVEwyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUFJPQ0VTU19NT05JVE9SX0NUTDMJCQkoMHgwNDMpCisjZGVmaW5lIFRBSUtPX0FfUFJPQ0VTU19NT05JVE9SX0NUTDNfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9DVEwJCQkoMHgwNDgpCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfU1RBVFVTCQkJKDB4MDQ5KQorI2RlZmluZSBUQUlLT19BX1FGVVNFX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1FGVVNFX0RBVEFfT1VUMAkJCSgweDA0QSkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDEJCQkoMHgwNEIpCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfREFUQV9PVVQxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfREFUQV9PVVQyCQkJKDB4MDRDKQorI2RlZmluZSBUQUlLT19BX1FGVVNFX0RBVEFfT1VUMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1FGVVNFX0RBVEFfT1VUMwkJCSgweDA0RCkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDQJCQkoMHgwNEUpCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfREFUQV9PVVQ0X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfREFUQV9PVVQ1CQkJKDB4MDRGKQorI2RlZmluZSBUQUlLT19BX1FGVVNFX0RBVEFfT1VUNV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1FGVVNFX0RBVEFfT1VUNgkJCSgweDA1MCkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9RRlVTRV9EQVRBX09VVDcJCQkoMHgwNTEpCisjZGVmaW5lIFRBSUtPX0FfUUZVU0VfREFUQV9PVVQ3X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NUTAkJCQlXQ0Q5WFhYX0FfQ0RDX0NUTAorI2RlZmluZSBUQUlLT19BX0NEQ19DVExfX1BPUgkJCVdDRDlYWFhfQV9DRENfQ1RMX19QT1IKKyNkZWZpbmUgVEFJS09fQV9MRUFLQUdFX0NUTAkJCVdDRDlYWFhfQV9MRUFLQUdFX0NUTAorI2RlZmluZSBUQUlLT19BX0xFQUtBR0VfQ1RMX19QT1IJCVdDRDlYWFhfQV9MRUFLQUdFX0NUTF9fUE9SCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9NT0RFCQkJKDB4MDkwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTUFTSzAJCQkoMHgwOTQpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9NQVNLMF9fUE9SCQkJCSgweEZGKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTUFTSzEJCQkoMHgwOTUpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9NQVNLMV9fUE9SCQkJCSgweEZGKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTUFTSzIJCQkoMHgwOTYpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9NQVNLMl9fUE9SCQkJCSgweDNGKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTUFTSzMJCQkoMHgwOTcpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9NQVNLM19fUE9SCQkJCSgweDNGKQorI2RlZmluZSBUQUlLT19BX0lOVFJfU1RBVFVTMAkJCSgweDA5OCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1NUQVRVUzBfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1NUQVRVUzEJCQkoMHgwOTkpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9TVEFUVVMxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9TVEFUVVMyCQkJKDB4MDlBKQorI2RlZmluZSBUQUlLT19BX0lOVFJfU1RBVFVTMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfU1RBVFVTMwkJCSgweDA5QikKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1NUQVRVUzNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0NMRUFSMAkJCSgweDA5QykKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0NMRUFSMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfQ0xFQVIxCQkJKDB4MDlEKQorI2RlZmluZSBUQUlLT19BX0lOVFJfQ0xFQVIxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9DTEVBUjIJCQkoMHgwOUUpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9DTEVBUjJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0NMRUFSMwkJCSgweDA5RikKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0NMRUFSM19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTEVWRUwwCQkJKDB4MEEwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTEVWRUwwX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9MRVZFTDEJCQkoMHgwQTEpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9MRVZFTDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0xFVkVMMgkJCSgweDBBMikKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0xFVkVMMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTEVWRUwzCQkJKDB4MEEzKQorI2RlZmluZSBUQUlLT19BX0lOVFJfTEVWRUwzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9URVNUMAkJCSgweDBBNCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1RFU1QwX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9URVNUMQkJCSgweDBBNSkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1RFU1QxX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9URVNUMgkJCSgweDBBNikKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1RFU1QyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9URVNUMwkJCSgweDBBNykKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1RFU1QzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9TRVQwCQkJKDB4MEE4KQorI2RlZmluZSBUQUlLT19BX0lOVFJfU0VUMF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfU0VUMQkJCSgweDBBOSkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1NFVDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX1NFVDIJCQkoMHgwQUEpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9TRVQyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9TRVQzCQkJKDB4MEFCKQorI2RlZmluZSBUQUlLT19BX0lOVFJfU0VUM19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfREVTVE4wCQkJKDB4MEFDKQorI2RlZmluZSBUQUlLT19BX0lOVFJfREVTVE4wX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9ERVNUTjEJCQkoMHgwQUQpCisjZGVmaW5lIFRBSUtPX0FfSU5UUl9ERVNUTjFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0RFU1ROMgkJCSgweDBBRSkKKyNkZWZpbmUgVEFJS09fQV9JTlRSX0RFU1ROMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0lOVFJfREVTVE4zCQkJKDB4MEFGKQorI2RlZmluZSBUQUlLT19BX0lOVFJfREVTVE4zX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYX0kyU19TQ0tfTU9ERQkJCSgweDBDMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfSTJTX1NDS19NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYX0kyU19XU19NT0RFCQkJKDB4MEMxKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF9JMlNfV1NfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19ETUlDX0RBVEEwX01PREUJCQkoMHgwQzQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0RNSUNfREFUQTBfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19ETUlDX0NMSzBfTU9ERQkJCSgweDBDNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfRE1JQ19DTEswX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfRE1JQ19EQVRBMV9NT0RFCQkJKDB4MEM2KQorI2RlZmluZSBUQUlLT19BX0NEQ19ETUlDX0RBVEExX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfRE1JQ19DTEsxX01PREUJCQkoMHgwQzcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0RNSUNfQ0xLMV9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYX0kyU19TQ0tfTU9ERQkJCSgweDBDOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlhfSTJTX1NDS19NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYX0kyU19XU19NT0RFCQkJKDB4MEM5KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWF9JMlNfV1NfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19ETUlDX0RBVEEyX01PREUJCQkoMHgwQ0EpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0RNSUNfREFUQTJfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19ETUlDX0NMSzJfTU9ERQkJCSgweDBDQikKKyNkZWZpbmUgVEFJS09fQV9DRENfRE1JQ19DTEsyX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSU5UUjFfTU9ERQkJCSgweDBDQykKKyNkZWZpbmUgVEFJS09fQV9DRENfSU5UUjFfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TQl9OUlpfU0VMX01PREUJCQkoMHgwQ0QpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NCX05SWl9TRUxfTU9ERV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JTlRSMl9NT0RFCQkJKDB4MENFKQorI2RlZmluZSBUQUlLT19BX0NEQ19JTlRSMl9NT0RFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JGX1BBX09OX01PREUJCQkoMHgwQ0YpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JGX1BBX09OX01PREVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9CSUFTX1JFRl9DVEwJCQkoMHgxMDApCisjZGVmaW5lIFRBSUtPX0FfQklBU19SRUZfQ1RMX19QT1IJCQkJKDB4MUMpCisjZGVmaW5lIFRBSUtPX0FfQklBU19DRU5UUkFMX0JHX0NUTAkJCSgweDEwMSkKKyNkZWZpbmUgVEFJS09fQV9CSUFTX0NFTlRSQUxfQkdfQ1RMX19QT1IJCQkJKDB4NTApCisjZGVmaW5lIFRBSUtPX0FfQklBU19QUkVDSFJHX0NUTAkJCSgweDEwMikKKyNkZWZpbmUgVEFJS09fQV9CSUFTX1BSRUNIUkdfQ1RMX19QT1IJCQkJKDB4MDcpCisjZGVmaW5lIFRBSUtPX0FfQklBU19DVVJSX0NUTF8xCQkJKDB4MTAzKQorI2RlZmluZSBUQUlLT19BX0JJQVNfQ1VSUl9DVExfMV9fUE9SCQkJCSgweDUyKQorI2RlZmluZSBUQUlLT19BX0JJQVNfQ1VSUl9DVExfMgkJCSgweDEwNCkKKyNkZWZpbmUgVEFJS09fQV9CSUFTX0NVUlJfQ1RMXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9CSUFTX09TQ19CR19DVEwJCQkoMHgxMDUpCisjZGVmaW5lIFRBSUtPX0FfQklBU19PU0NfQkdfQ1RMX19QT1IJCQkJKDB4MTYpCisjZGVmaW5lIFRBSUtPX0FfQ0xLX0JVRkZfRU4xCQkJKDB4MTA4KQorI2RlZmluZSBUQUlLT19BX0NMS19CVUZGX0VOMV9fUE9SCQkJCSgweDA0KQorI2RlZmluZSBUQUlLT19BX0NMS19CVUZGX0VOMgkJCSgweDEwOSkKKyNkZWZpbmUgVEFJS09fQV9DTEtfQlVGRl9FTjJfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVEFJS09fQV9MRE9fSF9NT0RFXzEJCQkoMHgxMTApCisjZGVmaW5lIFRBSUtPX0FfTERPX0hfTU9ERV8xX19QT1IJCQkJKDB4NjUpCisjZGVmaW5lIFRBSUtPX0FfTERPX0hfTU9ERV8yCQkJKDB4MTExKQorI2RlZmluZSBUQUlLT19BX0xET19IX01PREVfMl9fUE9SCQkJCSgweEE4KQorI2RlZmluZSBUQUlLT19BX0xET19IX0xPT1BfQ1RMCQkJKDB4MTEyKQorI2RlZmluZSBUQUlLT19BX0xET19IX0xPT1BfQ1RMX19QT1IJCQkJKDB4NkIpCisjZGVmaW5lIFRBSUtPX0FfTERPX0hfQ09NUF8xCQkJKDB4MTEzKQorI2RlZmluZSBUQUlLT19BX0xET19IX0NPTVBfMV9fUE9SCQkJCSgweDg0KQorI2RlZmluZSBUQUlLT19BX0xET19IX0NPTVBfMgkJCSgweDExNCkKKyNkZWZpbmUgVEFJS09fQV9MRE9fSF9DT01QXzJfX1BPUgkJCQkoMHhFMCkKKyNkZWZpbmUgVEFJS09fQV9MRE9fSF9CSUFTXzEJCQkoMHgxMTUpCisjZGVmaW5lIFRBSUtPX0FfTERPX0hfQklBU18xX19QT1IJCQkJKDB4NkQpCisjZGVmaW5lIFRBSUtPX0FfTERPX0hfQklBU18yCQkJKDB4MTE2KQorI2RlZmluZSBUQUlLT19BX0xET19IX0JJQVNfMl9fUE9SCQkJCSgweEE1KQorI2RlZmluZSBUQUlLT19BX0xET19IX0JJQVNfMwkJCSgweDExNykKKyNkZWZpbmUgVEFJS09fQV9MRE9fSF9CSUFTXzNfX1BPUgkJCQkoMHg2MCkKKyNkZWZpbmUgVEFJS09fQV9WQkFUX0NMSwkJCSgweDExOCkKKyNkZWZpbmUgVEFJS09fQV9WQkFUX0NMS19fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfTE9PUAkJCSgweDExOSkKKyNkZWZpbmUgVEFJS09fQV9WQkFUX0xPT1BfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVEFJS09fQV9WQkFUX1JFRgkJCSgweDExQSkKKyNkZWZpbmUgVEFJS09fQV9WQkFUX1JFRl9fUE9SCQkJCSgweDIwKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfQURDX1RFU1QJCQkoMHgxMUIpCisjZGVmaW5lIFRBSUtPX0FfVkJBVF9BRENfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfRkUJCQkoMHgxMUMpCisjZGVmaW5lIFRBSUtPX0FfVkJBVF9GRV9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUQUlLT19BX1ZCQVRfQklBU18xCQkJKDB4MTFEKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfQklBU18xX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfVkJBVF9CSUFTXzIJCQkoMHgxMUUpCisjZGVmaW5lIFRBSUtPX0FfVkJBVF9CSUFTXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9WQkFUX0FEQ19EQVRBX01TQgkJCSgweDExRikKKyNkZWZpbmUgVEFJS09fQV9WQkFUX0FEQ19EQVRBX01TQl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfQURDX0RBVEFfTFNCCQkJKDB4MTIwKQorI2RlZmluZSBUQUlLT19BX1ZCQVRfQURDX0RBVEFfTFNCX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8xX0NUTAkJCSgweDEyOCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzFfQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8xX1ZBTAkJCSgweDEyOSkKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzFfVkFMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8xX1BSRUNIUkcJCQkoMHgxMkEpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8xX1BSRUNIUkdfX1BPUgkJCQkoMHgzOCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzFfQ1RMCQkJKDB4MTJCKQorI2RlZmluZSBUQUlLT19BX01JQ0JfMV9DVExfX1BPUgkJCQkoMHgxNikKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzFfSU5UX1JCSUFTCQkJKDB4MTJDKQorI2RlZmluZSBUQUlLT19BX01JQ0JfMV9JTlRfUkJJQVNfX1BPUgkJCQkoMHgyNCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzFfTUJIQwkJCSgweDEyRCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzFfTUJIQ19fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfMl9DVEwJCQkoMHgxMkUpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8yX0NUTF9fUE9SCQkJCSgweDQwKQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfMl9WQUwJCQkoMHgxMkYpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl9DRklMVF8yX1ZBTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfMl9QUkVDSFJHCQkJKDB4MTMwKQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfMl9QUkVDSFJHX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8yX0NUTAkJCSgweDEzMSkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzJfQ1RMX19QT1IJCQkJKDB4MTYpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8yX0lOVF9SQklBUwkJCSgweDEzMikKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzJfSU5UX1JCSUFTX19QT1IJCQkJKDB4MjQpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8yX01CSEMJCQkoMHgxMzMpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8yX01CSENfX1BPUgkJCQkoMHgwMikKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzNfQ1RMCQkJKDB4MTM0KQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfM19DVExfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzNfVkFMCQkJKDB4MTM1KQorI2RlZmluZSBUQUlLT19BX01JQ0JfQ0ZJTFRfM19WQUxfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzNfUFJFQ0hSRwkJCSgweDEzNikKKyNkZWZpbmUgVEFJS09fQV9NSUNCX0NGSUxUXzNfUFJFQ0hSR19fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUQUlLT19BX01JQ0JfM19DVEwJCQkoMHgxMzcpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8zX0NUTF9fUE9SCQkJCSgweDE2KQorI2RlZmluZSBUQUlLT19BX01JQ0JfM19JTlRfUkJJQVMJCQkoMHgxMzgpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl8zX0lOVF9SQklBU19fUE9SCQkJCSgweDI0KQorI2RlZmluZSBUQUlLT19BX01JQ0JfM19NQkhDCQkJKDB4MTM5KQorI2RlZmluZSBUQUlLT19BX01JQ0JfM19NQkhDX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTUlDQl80X0NUTAkJCSgweDEzRCkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzRfQ1RMX19QT1IJCQkJKDB4MTYpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl80X0lOVF9SQklBUwkJCSgweDEzRSkKKyNkZWZpbmUgVEFJS09fQV9NSUNCXzRfSU5UX1JCSUFTX19QT1IJCQkJKDB4MjQpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl80X01CSEMJCQkoMHgxM0YpCisjZGVmaW5lIFRBSUtPX0FfTUlDQl80X01CSENfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVEFJS09fQV9NQkhDX0lOU0VSVF9ERVRFQ1QJCQkoMHgxNEEpCisjZGVmaW5lIFRBSUtPX0FfTUJIQ19JTlNFUlRfREVURUNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTUJIQ19JTlNFUlRfREVUX1NUQVRVUwkJCSgweDE0QikKKyNkZWZpbmUgVEFJS09fQV9NQkhDX0lOU0VSVF9ERVRfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfVFhfQ09NX0JJQVMJCQkoMHgxNEMpCisjZGVmaW5lIFRBSUtPX0FfVFhfQ09NX0JJQVNfX1BPUgkJCQkoMHhGMCkKKyNkZWZpbmUgVEFJS09fQV9NQkhDX1NDQUxJTkdfTVVYXzEJCQkoMHgxNEUpCisjZGVmaW5lIFRBSUtPX0FfTUJIQ19TQ0FMSU5HX01VWF8xX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTUJIQ19TQ0FMSU5HX01VWF8yCQkJKDB4MTRGKQorI2RlZmluZSBUQUlLT19BX01CSENfU0NBTElOR19NVVhfMl9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUQUlLT19BX01BRF9BTkFfQ1RSTAkJCSgweDE1MCkKKyNkZWZpbmUgVEFJS09fQV9NQURfQU5BX0NUUkxfX1BPUgkJCQkoMHhGMSkKKyNkZWZpbmUgVEFJS09fQV9UWF9TVVBfU1dJVENIX0NUUkxfMQkJCSgweDE1MSkKKyNkZWZpbmUgVEFJS09fQV9UWF9TVVBfU1dJVENIX0NUUkxfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYX1NVUF9TV0lUQ0hfQ1RSTF8yCQkJKDB4MTUyKQorI2RlZmluZSBUQUlLT19BX1RYX1NVUF9TV0lUQ0hfQ1RSTF8yX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX0VOCQkJKDB4MTUzKQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9FTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9URVNUX0VOCQkJKDB4MTU0KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9URVNUX0VOX19QT1IJCQkJKDB4Q0MpCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX0FEQ19DSDEJCQkoMHgxNTUpCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX0FEQ19DSDFfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9UWF8xXzJfQURDX0NIMgkJCSgweDE1NikKKyNkZWZpbmUgVEFJS09fQV9UWF8xXzJfQURDX0NIMl9fUE9SCQkJCSgweDQ0KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9BVEVTVF9SRUZDVFJMCQkJKDB4MTU3KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9BVEVTVF9SRUZDVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX1RFU1RfQ1RMCQkJKDB4MTU4KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9URVNUX0NUTF9fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9URVNUX0JMT0NLX0VOCQkJKDB4MTU5KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9URVNUX0JMT0NLX0VOX19QT1IJCQkJKDB4RkMpCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX1RYRkVfQ0xLRElWCQkJKDB4MTVBKQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9UWEZFX0NMS0RJVl9fUE9SCQkJCSgweDU1KQorI2RlZmluZSBUQUlLT19BX1RYXzFfMl9TQVJfRVJSX0NIMQkJCSgweDE1QikKKyNkZWZpbmUgVEFJS09fQV9UWF8xXzJfU0FSX0VSUl9DSDFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9UWF8xXzJfU0FSX0VSUl9DSDIJCQkoMHgxNUMpCisjZGVmaW5lIFRBSUtPX0FfVFhfMV8yX1NBUl9FUlJfQ0gyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X0VOCQkJKDB4MTVEKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9FTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9URVNUX0VOCQkJKDB4MTVFKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9URVNUX0VOX19QT1IJCQkJKDB4Q0MpCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X0FEQ19DSDMJCQkoMHgxNUYpCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X0FEQ19DSDNfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9UWF8zXzRfQURDX0NINAkJCSgweDE2MCkKKyNkZWZpbmUgVEFJS09fQV9UWF8zXzRfQURDX0NINF9fUE9SCQkJCSgweDQ0KQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9BVEVTVF9SRUZDVFJMCQkJKDB4MTYxKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9BVEVTVF9SRUZDVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X1RFU1RfQ1RMCQkJKDB4MTYyKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9URVNUX0NUTF9fUE9SCQkJCSgweDM4KQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9URVNUX0JMT0NLX0VOCQkJKDB4MTYzKQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9URVNUX0JMT0NLX0VOX19QT1IJCQkJKDB4RkMpCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X1RYRkVfQ0tESVYJCQkoMHgxNjQpCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X1RYRkVfQ0tESVZfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVEFJS09fQV9UWF8zXzRfU0FSX0VSUl9DSDMJCQkoMHgxNjUpCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X1NBUl9FUlJfQ0gzX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfVFhfM180X1NBUl9FUlJfQ0g0CQkJKDB4MTY2KQorI2RlZmluZSBUQUlLT19BX1RYXzNfNF9TQVJfRVJSX0NINF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9FTgkJCSgweDE2NykKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfRU5fX1BPUgkJCQkoMHgxMSkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfVEVTVF9FTgkJCSgweDE2OCkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfVEVTVF9FTl9fUE9SCQkJCSgweENDKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9BRENfQ0g1CQkJKDB4MTY5KQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9BRENfQ0g1X19QT1IJCQkJKDB4NDQpCisjZGVmaW5lIFRBSUtPX0FfVFhfNV82X0FEQ19DSDYJCQkoMHgxNkEpCisjZGVmaW5lIFRBSUtPX0FfVFhfNV82X0FEQ19DSDZfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfQVRFU1RfUkVGQ1RSTAkJCSgweDE2QikKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfQVRFU1RfUkVGQ1RSTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9URVNUX0NUTAkJCSgweDE2QykKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfVEVTVF9DVExfX1BPUgkJCQkoMHgzOCkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfVEVTVF9CTE9DS19FTgkJCSgweDE2RCkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfVEVTVF9CTE9DS19FTl9fUE9SCQkJCSgweEZDKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9UWEZFX0NLRElWCQkJKDB4MTZFKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9UWEZFX0NLRElWX19QT1IJCQkJKDB4NTUpCisjZGVmaW5lIFRBSUtPX0FfVFhfNV82X1NBUl9FUlJfQ0g1CQkJKDB4MTZGKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9TQVJfRVJSX0NINV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1RYXzVfNl9TQVJfRVJSX0NINgkJCSgweDE3MCkKKyNkZWZpbmUgVEFJS09fQV9UWF81XzZfU0FSX0VSUl9DSDZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9UWF83X01CSENfRU4JCQkoMHgxNzEpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX0VOX19QT1IJCQkJKDB4MEMpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX0FURVNUX1JFRkNUUkwJCQkoMHgxNzIpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX0FURVNUX1JFRkNUUkxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9UWF83X01CSENfQURDCQkJKDB4MTczKQorI2RlZmluZSBUQUlLT19BX1RYXzdfTUJIQ19BRENfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9UWF83X01CSENfVEVTVF9DVEwJCQkoMHgxNzQpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX1RFU1RfQ1RMX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX1NBUl9FUlIJCQkoMHgxNzUpCisjZGVmaW5lIFRBSUtPX0FfVFhfN19NQkhDX1NBUl9FUlJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9UWF83X1RYRkVfQ0xLRElWCQkJKDB4MTc2KQorI2RlZmluZSBUQUlLT19BX1RYXzdfVFhGRV9DTEtESVZfX1BPUgkJCQkoMHgwQikKKyNkZWZpbmUgVEFJS09fQV9CVUNLX01PREVfMQkJCSgweDE4MSkKKyNkZWZpbmUgVEFJS09fQV9CVUNLX01PREVfMV9fUE9SCQkJCSgweDIxKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfTU9ERV8yCQkJKDB4MTgyKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfTU9ERV8yX19QT1IJCQkJKDB4RkYpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19NT0RFXzMJCQkoMHgxODMpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19NT0RFXzNfX1BPUgkJCQkoMHhDQykKKyNkZWZpbmUgVEFJS09fQV9CVUNLX01PREVfNAkJCSgweDE4NCkKKyNkZWZpbmUgVEFJS09fQV9CVUNLX01PREVfNF9fUE9SCQkJCSgweDNBKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfTU9ERV81CQkJKDB4MTg1KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfTU9ERV81X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX1ZDTF8xCQkJKDB4MTg2KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9WQ0xfMV9fUE9SCQkJCSgweDQ4KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9WQ0xfMgkJCSgweDE4NykKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfVkNMXzJfX1BPUgkJCQkoMHhBMykKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfVkNMXzMJCQkoMHgxODgpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX1ZDTF8zX19QT1IJCQkJKDB4ODIpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX0NDTF8xCQkJKDB4MTg5KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9DQ0xfMV9fUE9SCQkJCSgweEFCKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9DQ0xfMgkJCSgweDE4QSkKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfQ0NMXzJfX1BPUgkJCQkoMHhEQykKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfQ0NMXzMJCQkoMHgxOEIpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX0NDTF8zX19QT1IJCQkJKDB4NkEpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX0NDTF80CQkJKDB4MThDKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9DQ0xfNF9fUE9SCQkJCSgweDU4KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9QV01fRFJWUl8xCQkJKDB4MThEKQorI2RlZmluZSBUQUlLT19BX0JVQ0tfQ1RSTF9QV01fRFJWUl8xX19QT1IJCQkJKDB4NTApCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX1BXTV9EUlZSXzIJCQkoMHgxOEUpCisjZGVmaW5lIFRBSUtPX0FfQlVDS19DVFJMX1BXTV9EUlZSXzJfX1BPUgkJCQkoMHg2NCkKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMwkJCSgweDE4RikKKyNkZWZpbmUgVEFJS09fQV9CVUNLX0NUUkxfUFdNX0RSVlJfM19fUE9SCQkJCSgweDc3KQorI2RlZmluZSBUQUlLT19BX0JVQ0tfVE1VWF9BX0QJCQkoMHgxOTApCisjZGVmaW5lIFRBSUtPX0FfQlVDS19UTVVYX0FfRF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX05DUF9CVUNLUkVGCQkJKDB4MTkxKQorI2RlZmluZSBUQUlLT19BX05DUF9CVUNLUkVGX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTkNQX0VOCQkJKDB4MTkyKQorI2RlZmluZSBUQUlLT19BX05DUF9FTl9fUE9SCQkJCSgweEZFKQorI2RlZmluZSBUQUlLT19BX05DUF9DTEsJCQkoMHgxOTMpCisjZGVmaW5lIFRBSUtPX0FfTkNQX0NMS19fUE9SCQkJCSgweDk0KQorI2RlZmluZSBUQUlLT19BX05DUF9TVEFUSUMJCQkoMHgxOTQpCisjZGVmaW5lIFRBSUtPX0FfTkNQX1NUQVRJQ19fUE9SCQkJCSgweDI4KQorI2RlZmluZSBUQUlLT19BX05DUF9WVEhfTE9XCQkJKDB4MTk1KQorI2RlZmluZSBUQUlLT19BX05DUF9WVEhfTE9XX19QT1IJCQkJKDB4ODgpCisjZGVmaW5lIFRBSUtPX0FfTkNQX1ZUSF9ISUdICQkJKDB4MTk2KQorI2RlZmluZSBUQUlLT19BX05DUF9WVEhfSElHSF9fUE9SCQkJCSgweEEwKQorI2RlZmluZSBUQUlLT19BX05DUF9BVEVTVAkJCSgweDE5NykKKyNkZWZpbmUgVEFJS09fQV9OQ1BfQVRFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9OQ1BfRFRFU1QJCQkoMHgxOTgpCisjZGVmaW5lIFRBSUtPX0FfTkNQX0RURVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfTkNQX0RMWTEJCQkoMHgxOTkpCisjZGVmaW5lIFRBSUtPX0FfTkNQX0RMWTFfX1BPUgkJCQkoMHgwNikKKyNkZWZpbmUgVEFJS09fQV9OQ1BfRExZMgkJCSgweDE5QSkKKyNkZWZpbmUgVEFJS09fQV9OQ1BfRExZMl9fUE9SCQkJCSgweDA2KQorI2RlZmluZSBUQUlLT19BX1JYX0FVWF9TV19DVEwJCQkoMHgxOUIpCisjZGVmaW5lIFRBSUtPX0FfUlhfQVVYX1NXX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX1BBX0FVWF9JTl9DT05OCQkJKDB4MTlDKQorI2RlZmluZSBUQUlLT19BX1JYX1BBX0FVWF9JTl9DT05OX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfQ09NX1RJTUVSX0RJVgkJCSgweDE5RSkKKyNkZWZpbmUgVEFJS09fQV9SWF9DT01fVElNRVJfRElWX19QT1IJCQkJKDB4RTgpCisjZGVmaW5lIFRBSUtPX0FfUlhfQ09NX09DUF9DVEwJCQkoMHgxOUYpCisjZGVmaW5lIFRBSUtPX0FfUlhfQ09NX09DUF9DVExfX1BPUgkJCQkoMHgxRikKKyNkZWZpbmUgVEFJS09fQV9SWF9DT01fT0NQX0NPVU5UCQkJKDB4MUEwKQorI2RlZmluZSBUQUlLT19BX1JYX0NPTV9PQ1BfQ09VTlRfX1BPUgkJCQkoMHg3NykKKyNkZWZpbmUgVEFJS09fQV9SWF9DT01fREFDX0NUTAkJCSgweDFBMSkKKyNkZWZpbmUgVEFJS09fQV9SWF9DT01fREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0NPTV9CSUFTCQkJKDB4MUEyKQorI2RlZmluZSBUQUlLT19BX1JYX0NPTV9CSUFTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0FVVE9fQ0hPUAkJCSgweDFBNCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQVVUT19DSE9QX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0NIT1BfQ1RMCQkJKDB4MUE1KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9DSE9QX0NUTF9fUE9SCQkJCSgweEI0KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9CSUFTX1BBCQkJKDB4MUE2KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9CSUFTX1BBX19QT1IJCQkJKDB4QUEpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0JJQVNfTERPCQkJKDB4MUE3KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9CSUFTX0xET19fUE9SCQkJCSgweDg3KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9CSUFTX0NOUAkJCSgweDFBOCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQklBU19DTlBfX1BPUgkJCQkoMHg4QSkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQklBU19XR19PQ1AJCQkoMHgxQTkpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0JJQVNfV0dfT0NQX19QT1IJCQkJKDB4MkEpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX09DUF9DVEwJCQkoMHgxQUEpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX09DUF9DVExfX1BPUgkJCQkoMHg2OCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQ05QX0VOCQkJKDB4MUFCKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9DTlBfRU5fX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQ05QX1dHX0NUTAkJCSgweDFBQykKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQ05QX1dHX0NUTF9fUE9SCQkJCSgweERFKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9DTlBfV0dfVElNRQkJCSgweDFBRCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfQ05QX1dHX1RJTUVfX1BPUgkJCQkoMHgyQSkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfTF9HQUlOCQkJKDB4MUFFKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9MX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfTF9URVNUCQkJKDB4MUFGKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9MX1RFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfTF9QQV9DVEwJCQkoMHgxQjApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0xfUEFfQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0xfREFDX0NUTAkJCSgweDFCMSkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfTF9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0xfQVRFU1QJCQkoMHgxQjIpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0xfQVRFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfTF9TVEFUVVMJCQkoMHgxQjMpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX0xfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX1JfR0FJTgkJCSgweDFCNCkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfUl9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX1JfVEVTVAkJCSgweDFCNSkKKyNkZWZpbmUgVEFJS09fQV9SWF9IUEhfUl9URVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX1JfUEFfQ1RMCQkJKDB4MUI2KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9SX1BBX0NUTF9fUE9SCQkJCSgweDQwKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9SX0RBQ19DVEwJCQkoMHgxQjcpCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX1JfREFDX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9SX0FURVNUCQkJKDB4MUI4KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9SX0FURVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfSFBIX1JfU1RBVFVTCQkJKDB4MUI5KQorI2RlZmluZSBUQUlLT19BX1JYX0hQSF9SX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9CSUFTX1BBCQkJKDB4MUJBKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9CSUFTX1BBX19QT1IJCQkJKDB4QTYpCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX0JJQVNfQ01CVUZGCQkJKDB4MUJCKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9CSUFTX0NNQlVGRl9fUE9SCQkJCSgweEEwKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9FTgkJCSgweDFCQykKKyNkZWZpbmUgVEFJS09fQV9SWF9FQVJfRU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9FQVJfR0FJTgkJCSgweDFCRCkKKyNkZWZpbmUgVEFJS09fQV9SWF9FQVJfR0FJTl9fUE9SCQkJCSgweDAyKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9DTUJVRkYJCQkoMHgxQkUpCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX0NNQlVGRl9fUE9SCQkJCSgweDA0KQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9JQ1RMCQkJKDB4MUJGKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9JQ1RMX19QT1IJCQkJKDB4NDApCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX0NDT01QCQkJKDB4MUMwKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9DQ09NUF9fUE9SCQkJCSgweDA4KQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9WQ00JCQkoMHgxQzEpCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX1ZDTV9fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9DTlAJCQkoMHgxQzIpCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX0NOUF9fUE9SCQkJCSgweEYyKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9EQUNfQ1RMX0FURVNUCQkJKDB4MUMzKQorI2RlZmluZSBUQUlLT19BX1JYX0VBUl9EQUNfQ1RMX0FURVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfRUFSX1NUQVRVUwkJCSgweDFDNSkKKyNkZWZpbmUgVEFJS09fQV9SWF9FQVJfU1RBVFVTX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9CSUFTX1BBCQkJKDB4MUM2KQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfQklBU19QQV9fUE9SCQkJCSgweEE4KQorI2RlZmluZSBUQUlLT19BX1JYX0JVQ0tfQklBUzEJCQkoMHgxQzcpCisjZGVmaW5lIFRBSUtPX0FfUlhfQlVDS19CSUFTMV9fUE9SCQkJCSgweDQyKQorI2RlZmluZSBUQUlLT19BX1JYX0JVQ0tfQklBUzIJCQkoMHgxQzgpCisjZGVmaW5lIFRBSUtPX0FfUlhfQlVDS19CSUFTMl9fUE9SCQkJCSgweDg0KQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfQ09NCQkJKDB4MUM5KQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfQ09NX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9DTlBfRU4JCQkoMHgxQ0EpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9DTlBfRU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FX0NOUF9XR19DVEwJCQkoMHgxQ0IpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9DTlBfV0dfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9DTlBfV0dfVElNRQkJCSgweDFDQykKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FX0NOUF9XR19USU1FX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8xX0dBSU4JCQkoMHgxQ0QpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8xX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzFfVEVTVAkJCSgweDFDRSkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzFfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfMV9EQUNfQ1RMCQkJKDB4MUNGKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfMV9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8xX1NUQVRVUwkJCSgweDFEMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzFfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8yX0dBSU4JCQkoMHgxRDEpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8yX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzJfVEVTVAkJCSgweDFEMikKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzJfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfMl9EQUNfQ1RMCQkJKDB4MUQzKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfMl9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8yX1NUQVRVUwkJCSgweDFENCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzJfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8zX0dBSU4JCQkoMHgxRDUpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8zX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzNfVEVTVAkJCSgweDFENikKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzNfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfM19EQUNfQ1RMCQkJKDB4MUQ3KQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfM19EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV8zX1NUQVRVUwkJCSgweDFEOCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzNfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV80X0dBSU4JCQkoMHgxRDkpCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV80X0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzRfVEVTVAkJCSgweDFEQSkKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzRfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfNF9EQUNfQ1RMCQkJKDB4MURCKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfNF9EQUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV80X1NUQVRVUwkJCSgweDFEQykKKyNkZWZpbmUgVEFJS09fQV9SWF9MSU5FXzRfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUlhfTElORV9DTlBfREJHCQkJKDB4MUREKQorI2RlZmluZSBUQUlLT19BX1JYX0xJTkVfQ05QX0RCR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0VOCQkJKDB4MURGKQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0VOX19QT1IJCQkJKDB4NkYpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfR0FJTgkJCSgweDFFMCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfREFDX0NUTAkJCSgweDFFMSkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9EQUNfQ1RMX19QT1IJCQkJKDB4MDQpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfT0NQX0NUTAkJCSgweDFFMikKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9PQ1BfQ1RMX19QT1IJCQkJKDB4OTgpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfQ0xJUF9ERVQJCQkoMHgxRTMpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfQ0xJUF9ERVRfX1BPUgkJCQkoMHg0OCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9JRUMJCQkoMHgxRTQpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfSUVDX19QT1IJCQkJKDB4MjApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfREJHX0RBQwkJCSgweDFFNSkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9EQkdfREFDX19QT1IJCQkJKDB4MDUpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfREJHX1BBCQkJKDB4MUU2KQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0RCR19QQV9fUE9SCQkJCSgweDE4KQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0RCR19QV1JTVEcJCQkoMHgxRTcpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfREJHX1BXUlNUR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0JJQVNfTERPCQkJKDB4MUU4KQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0JJQVNfTERPX19QT1IJCQkJKDB4NDUpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfQklBU19JTlQJCQkoMHgxRTkpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfQklBU19JTlRfX1BPUgkJCQkoMHhBNSkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9CSUFTX1BBCQkJKDB4MUVBKQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX0JJQVNfUEFfX1BPUgkJCQkoMHg1NSkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9TVEFUVVNfT0NQCQkJKDB4MUVCKQorI2RlZmluZSBUQUlLT19BX1NQS1JfRFJWX1NUQVRVU19PQ1BfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX0RSVl9TVEFUVVNfUEEJCQkoMHgxRUMpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9EUlZfU1RBVFVTX1BBX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0VOCQkJKDB4MUVEKQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9FTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9BRENfRU4JCQkoMHgxRUUpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0FEQ19FTl9fUE9SCQkJCSgweDQ0KQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9JU0VOU0VfQklBUwkJCSgweDFFRikKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfSVNFTlNFX0JJQVNfX1BPUgkJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfVlNFTlNFX0JJQVMJCQkoMHgxRjApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX1ZTRU5TRV9CSUFTX19QT1IJCQkJKDB4NDQpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0FEQ19BVEVTVF9SRUZDVFJMCQkJKDB4MUYxKQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9BRENfQVRFU1RfUkVGQ1RSTF9fUE9SCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0FEQ19URVNUX0NUTAkJCSgweDFGMikKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfQURDX1RFU1RfQ1RMX19QT1IJCQkJKDB4MzgpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX1RFU1RfQkxPQ0tfRU4JCQkoMHgxRjMpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX1RFU1RfQkxPQ0tfRU5fX1BPUgkJCQkoMHhGQykKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfQVRFU1QJCQkoMHgxRjQpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0FURVNUX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX1ZfU0FSX0VSUgkJCSgweDFGNSkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfVl9TQVJfRVJSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0lfU0FSX0VSUgkJCSgweDFGNikKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfSV9TQVJfRVJSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX0xET19DVFJMCQkJKDB4MUY3KQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9MRE9fQ1RSTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX1NQS1JfUFJPVF9JU0VOU0VfQ1RSTAkJCSgweDFGOCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfSVNFTlNFX0NUUkxfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9TUEtSX1BST1RfVlNFTlNFX0NUUkwJCQkoMHgxRjkpCisjZGVmaW5lIFRBSUtPX0FfU1BLUl9QUk9UX1ZTRU5TRV9DVFJMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfUkNfT1NDX0ZSRVEJCQkoMHgxRkEpCisjZGVmaW5lIFRBSUtPX0FfUkNfT1NDX0ZSRVFfX1BPUgkJCQkoMHg0NikKKyNkZWZpbmUgVEFJS09fQV9SQ19PU0NfVEVTVAkJCSgweDFGQikKKyNkZWZpbmUgVEFJS09fQV9SQ19PU0NfVEVTVF9fUE9SCQkJCSgweDBBKQorI2RlZmluZSBUQUlLT19BX1JDX09TQ19TVEFUVVMJCQkoMHgxRkMpCisjZGVmaW5lIFRBSUtPX0FfUkNfT1NDX1NUQVRVU19fUE9SCQkJCSgweDE4KQorI2RlZmluZSBUQUlLT19BX1JDX09TQ19UVU5FUgkJCSgweDFGRCkKKyNkZWZpbmUgVEFJS09fQV9SQ19PU0NfVFVORVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9NQkhDX0hQSAkJCSgweDFGRSkKKyNkZWZpbmUgVEFJS09fQV9NQkhDX0hQSF9fUE9SCQkJCSgweDQ0KQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0IxX0NUTAkJCSgweDIwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9CMV9DVEwJCQkoMHgyODApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfU0hJRlQJCQkoMHgyMDEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfU0hJRlRfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9TSElGVAkJCSgweDI4MSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9TSElGVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0lJUl9CMV9DVEwJCQkoMHgyMDIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX0lJUl9CMV9DVEwJCQkoMHgyODIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfSUlSX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0lJUl9CMl9DVEwJCQkoMHgyMDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfSUlSX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX0lJUl9CMl9DVEwJCQkoMHgyODMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfSUlSX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0lJUl9CM19DVEwJCQkoMHgyMDQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfSUlSX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX0lJUl9CM19DVEwJCQkoMHgyODQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfSUlSX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0xQRl9CMV9DVEwJCQkoMHgyMDYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfTFBGX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX0xQRl9CMV9DVEwJCQkoMHgyODYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfTFBGX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0xQRl9CMl9DVEwJCQkoMHgyMDcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfTFBGX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX0xQRl9CMl9DVEwJCQkoMHgyODcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfTFBGX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX1NQQVJFCQkJKDB4MjA5KQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX1NQQVJFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfU1BBUkUJCQkoMHgyODkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfU1BBUkVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMV9TTUxQRl9DVEwJCQkoMHgyMEEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfU01MUEZfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfU01MUEZfQ1RMCQkJKDB4MjhBKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMyX1NNTFBGX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0RDRkxUX0NUTAkJCSgweDIwQikKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMV9EQ0ZMVF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9EQ0ZMVF9DVEwJCQkoMHgyOEIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfRENGTFRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfR0FJTl9DVEwJCQkoMHgyMEMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzFfR0FJTl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9HQUlOX0NUTAkJCSgweDI4QykKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9HQUlOX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19BTkMxX0IyX0NUTAkJCSgweDIwRCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQU5DMl9CMl9DVEwJCQkoMHgyOEQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0FOQzJfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9WT0xfQ1RMX1RJTUVSCQkJKDB4MjIwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDFfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDJfVk9MX0NUTF9USU1FUgkJCSgweDIyOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX1ZPTF9DVExfVElNRVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgzX1ZPTF9DVExfVElNRVIJCQkoMHgyMzApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYM19WT0xfQ1RMX1RJTUVSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9WT0xfQ1RMX1RJTUVSCQkJKDB4MjM4KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDRfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDVfVk9MX0NUTF9USU1FUgkJCSgweDI0MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X1ZPTF9DVExfVElNRVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg2X1ZPTF9DVExfVElNRVIJCQkoMHgyNDgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNl9WT0xfQ1RMX1RJTUVSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19WT0xfQ1RMX1RJTUVSCQkJKDB4MjUwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDdfVk9MX0NUTF9USU1FUl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDhfVk9MX0NUTF9USU1FUgkJCSgweDI1OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X1ZPTF9DVExfVElNRVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg5X1ZPTF9DVExfVElNRVIJCQkoMHgyNjApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOV9WT0xfQ1RMX1RJTUVSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfVk9MX0NUTF9USU1FUgkJCSgweDI2OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgxMF9WT0xfQ1RMX1RJTUVSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9WT0xfQ1RMX0dBSU4JCQkoMHgyMjEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX1ZPTF9DVExfR0FJTgkJCSgweDIyOSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDNfVk9MX0NUTF9HQUlOCQkJKDB4MjMxKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDNfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9WT0xfQ1RMX0dBSU4JCQkoMHgyMzkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X1ZPTF9DVExfR0FJTgkJCSgweDI0MSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDZfVk9MX0NUTF9HQUlOCQkJKDB4MjQ5KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDZfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19WT0xfQ1RMX0dBSU4JCQkoMHgyNTEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19WT0xfQ1RMX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X1ZPTF9DVExfR0FJTgkJCSgweDI1OSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDlfVk9MX0NUTF9HQUlOCQkJKDB4MjYxKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDlfVk9MX0NUTF9HQUlOX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfVk9MX0NUTF9HQUlOCQkJKDB4MjY5KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDFfVk9MX0NUTF9DRkcJCQkoMHgyMjIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDJfVk9MX0NUTF9DRkcJCQkoMHgyMkEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDNfVk9MX0NUTF9DRkcJCQkoMHgyMzIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYM19WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDRfVk9MX0NUTF9DRkcJCQkoMHgyM0EpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDVfVk9MX0NUTF9DRkcJCQkoMHgyNDIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDZfVk9MX0NUTF9DRkcJCQkoMHgyNEEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNl9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDdfVk9MX0NUTF9DRkcJCQkoMHgyNTIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDhfVk9MX0NUTF9DRkcJCQkoMHgyNUEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDlfVk9MX0NUTF9DRkcJCQkoMHgyNjIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOV9WT0xfQ1RMX0NGR19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDEwX1ZPTF9DVExfQ0ZHCQkJKDB4MjZBKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDEwX1ZPTF9DVExfQ0ZHX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9NVVhfQ1RMCQkJKDB4MjIzKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDFfTVVYX0NUTF9fUE9SCQkJCSgweDA4KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDJfTVVYX0NUTAkJCSgweDIyQikKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX01VWF9DVExfX1BPUgkJCQkoMHgwOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgzX01VWF9DVEwJCQkoMHgyMzMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYM19NVVhfQ1RMX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9NVVhfQ1RMCQkJKDB4MjNCKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDRfTVVYX0NUTF9fUE9SCQkJCSgweDA4KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDVfTVVYX0NUTAkJCSgweDI0MykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X01VWF9DVExfX1BPUgkJCQkoMHgwOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg2X01VWF9DVEwJCQkoMHgyNEIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNl9NVVhfQ1RMX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19NVVhfQ1RMCQkJKDB4MjUzKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDdfTVVYX0NUTF9fUE9SCQkJCSgweDA4KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDhfTVVYX0NUTAkJCSgweDI1QikKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X01VWF9DVExfX1BPUgkJCQkoMHgwOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg5X01VWF9DVEwJCQkoMHgyNjMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOV9NVVhfQ1RMX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfTVVYX0NUTAkJCSgweDI2QikKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgxMF9NVVhfQ1RMX19QT1IJCQkJKDB4MDgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9DTEtfRlNfQ1RMCQkJKDB4MjI0KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDFfQ0xLX0ZTX0NUTF9fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDJfQ0xLX0ZTX0NUTAkJCSgweDIyQykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX0NMS19GU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgzX0NMS19GU19DVEwJCQkoMHgyMzQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYM19DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9DTEtfRlNfQ1RMCQkJKDB4MjNDKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDRfQ0xLX0ZTX0NUTF9fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDVfQ0xLX0ZTX0NUTAkJCSgweDI0NCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X0NMS19GU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg2X0NMS19GU19DVEwJCQkoMHgyNEMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNl9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19DTEtfRlNfQ1RMCQkJKDB4MjU0KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDdfQ0xLX0ZTX0NUTF9fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWDhfQ0xLX0ZTX0NUTAkJCSgweDI1QykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X0NMS19GU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg5X0NMS19GU19DVEwJCQkoMHgyNjQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOV9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfQ0xLX0ZTX0NUTAkJCSgweDI2QykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgxMF9DTEtfRlNfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMV9ETUlDX0NUTAkJCSgweDIyNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgxX0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMl9ETUlDX0NUTAkJCSgweDIyRCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgyX0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYM19ETUlDX0NUTAkJCSgweDIzNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFgzX0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNF9ETUlDX0NUTAkJCSgweDIzRCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg0X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNV9ETUlDX0NUTAkJCSgweDI0NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg1X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYNl9ETUlDX0NUTAkJCSgweDI0RCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg2X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYN19ETUlDX0NUTAkJCSgweDI1NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg3X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOF9ETUlDX0NUTAkJCSgweDI1RCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg4X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYOV9ETUlDX0NUTAkJCSgweDI2NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFg5X0RNSUNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfRE1JQ19DVEwJCQkoMHgyNkQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYMTBfRE1JQ19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjFfQ1RMCQkJKDB4Mjc4KQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjJfQ1RMCQkJKDB4Mjc5KQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjNfQ1RMCQkJKDB4MjdBKQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjRfQ1RMCQkJKDB4MjdCKQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjVfQ1RMCQkJKDB4MjdDKQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CNV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjZfQ1RMCQkJKDB4MjdEKQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfREVCVUdfQjdfQ1RMCQkJKDB4MjdFKQorI2RlZmluZSBUQUlLT19BX0NEQ19ERUJVR19CN19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1JDMV9QREFfQ0ZHCQkJKDB4MkEwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUkMxX1BEQV9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1JDMl9QREFfQ0ZHCQkJKDB4MkE4KQorI2RlZmluZSBUQUlLT19BX0NEQ19TUkMyX1BEQV9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1JDMV9GU19DVEwJCQkoMHgyQTEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NSQzFfRlNfQ1RMX19QT1IJCQkJKDB4MUIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NSQzJfRlNfQ1RMCQkJKDB4MkE5KQorI2RlZmluZSBUQUlLT19BX0NEQ19TUkMyX0ZTX0NUTF9fUE9SCQkJCSgweDFCKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfQjFfQ1RMCQkJKDB4MkIwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9CMV9DVEwJCQkoMHgyQjgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgzX0IxX0NUTAkJCSgweDJDMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgzX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfQjFfQ1RMCQkJKDB4MkM4KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9CMV9DVEwJCQkoMHgyRDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg2X0IxX0NUTAkJCSgweDJEOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg2X0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfQjFfQ1RMCQkJKDB4MkUwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9CMl9DVEwJCQkoMHgyQjEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgyX0IyX0NUTAkJCSgweDJCOSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgyX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfQjJfQ1RMCQkJKDB4MkMxKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9CMl9DVEwJCQkoMHgyQzkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg1X0IyX0NUTAkJCSgweDJEMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg1X0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfQjJfQ1RMCQkJKDB4MkQ5KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19CMl9DVEwJCQkoMHgyRTEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgxX0IzX0NUTAkJCSgweDJCMikKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgxX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfQjNfQ1RMCQkJKDB4MkJBKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19CM19DVEwJCQkoMHgyQzIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg0X0IzX0NUTAkJCSgweDJDQSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg0X0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfQjNfQ1RMCQkJKDB4MkQyKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9CM19DVEwJCQkoMHgyREEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg3X0IzX0NUTAkJCSgweDJFMikKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg3X0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfQjRfQ1RMCQkJKDB4MkIzKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9CNF9DVEwJCQkoMHgyQkIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgzX0I0X0NUTAkJCSgweDJDMykKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgzX0I0X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfQjRfQ1RMCQkJKDB4MkNCKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9CNF9DVEwJCQkoMHgyRDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg2X0I0X0NUTAkJCSgweDJEQikKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg2X0I0X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfQjRfQ1RMCQkJKDB4MkUzKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9CNV9DVEwJCQkoMHgyQjQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgyX0I1X0NUTAkJCSgweDJCQykKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgyX0I1X0NUTF9fUE9SCQkJCSgweDc4KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfQjVfQ1RMCQkJKDB4MkM0KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfQjVfQ1RMX19QT1IJCQkJKDB4NzgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9CNV9DVEwJCQkoMHgyQ0MpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg1X0I1X0NUTAkJCSgweDJENCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg1X0I1X0NUTF9fUE9SCQkJCSgweDc4KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfQjVfQ1RMCQkJKDB4MkRDKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfQjVfQ1RMX19QT1IJCQkJKDB4NzgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19CNV9DVEwJCQkoMHgyRTQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19CNV9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgxX0I2X0NUTAkJCSgweDJCNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlgxX0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfQjZfQ1RMCQkJKDB4MkJEKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19CNl9DVEwJCQkoMHgyQzUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19CNl9DVExfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg0X0I2X0NUTAkJCSgweDJDRCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg0X0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfQjZfQ1RMCQkJKDB4MkQ1KQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9CNl9DVEwJCQkoMHgyREQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9CNl9DVExfX1BPUgkJCQkoMHg4MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg3X0I2X0NUTAkJCSgweDJFNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUlg3X0I2X0NUTF9fUE9SCQkJCSgweDgwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQjYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQkUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQzYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVEwJCQkoMHgyQ0UpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfVk9MX0NUTF9CMV9DVEwJCQkoMHgyRDYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfVk9MX0NUTF9CMV9DVEwJCQkoMHgyREUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVEwJCQkoMHgyRTYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19WT0xfQ1RMX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDFfVk9MX0NUTF9CMl9DVEwJCQkoMHgyQjcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDJfVk9MX0NUTF9CMl9DVEwJCQkoMHgyQkYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYMl9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVEwJCQkoMHgyQzcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYM19WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDRfVk9MX0NUTF9CMl9DVEwJCQkoMHgyQ0YpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDVfVk9MX0NUTF9CMl9DVEwJCQkoMHgyRDcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNV9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVEwJCQkoMHgyREYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYNl9WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19SWDdfVk9MX0NUTF9CMl9DVEwJCQkoMHgyRTcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0NGRwkJCSgweDJFOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9DRkdfX1BPUgkJCQkoMHgxQSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9BRENfQ0FMMQkJCSgweDJFOSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9BRENfQ0FMMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0FEQ19DQUwyCQkJKDB4MkVBKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0FEQ19DQUwyX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfQURDX0NBTDMJCQkoMHgyRUIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfQURDX0NBTDNfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9QS19FU1QxCQkJKDB4MkVDKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX1BLX0VTVDFfX1BPUgkJCQkoMHhFMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9QS19FU1QyCQkJKDB4MkVEKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX1BLX0VTVDJfX1BPUgkJCQkoMHgwMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9QS19FU1QzCQkJKDB4MkVFKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX1BLX0VTVDNfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9SRl9QUk9DMQkJCSgweDJFRikKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9SRl9QUk9DMV9fUE9SCQkJCSgweDJBKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX1JGX1BST0MyCQkJKDB4MkYwKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX1JGX1BST0MyX19QT1IJCQkJKDB4ODYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfVEFDMQkJCSgweDJGMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9UQUMxX19QT1IJCQkJKDB4NzApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfVEFDMgkJCSgweDJGMikKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9UQUMyX19QT1IJCQkJKDB4MTgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfVEFDMwkJCSgweDJGMykKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9UQUMzX19QT1IJCQkJKDB4MTgpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfVEFDNAkJCSgweDJGNCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9UQUM0X19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfR0FJTl9VUEQxCQkJKDB4MkY1KQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0dBSU5fVVBEMV9fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0dBSU5fVVBEMgkJCSgweDJGNikKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9HQUlOX1VQRDJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9HQUlOX1VQRDMJCQkoMHgyRjcpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfR0FJTl9VUEQzX19QT1IJCQkJKDB4NjQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfR0FJTl9VUEQ0CQkJKDB4MkY4KQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0dBSU5fVVBENF9fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0RFQlVHMQkJCSgweDJGOSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVkJBVF9ERUJVRzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVEwJCQkoMHgzMDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19SWF9SRVNFVF9DVEwJCQkoMHgzMDEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19SWF9SRVNFVF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1RYX1JFU0VUX0IxX0NUTAkJCSgweDMwMikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1RYX1JFU0VUX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfVFhfUkVTRVRfQjJfQ1RMCQkJKDB4MzAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfVFhfUkVTRVRfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19ETUlDX0IxX0NUTAkJCSgweDMwNCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX0RNSUNfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19ETUlDX0IyX0NUTAkJCSgweDMwNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX0RNSUNfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19SWF9JMlNfQ1RMCQkJKDB4MzA2KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUlhfSTJTX0NUTF9fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfVFhfSTJTX0NUTAkJCSgweDMwNykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1RYX0kyU19DVExfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX09USFJfUkVTRVRfQjFfQ1RMCQkJKDB4MzA4KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMCQkJKDB4MzA5KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1RYX0NMS19FTl9CMV9DVEwJCQkoMHgzMEEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMCQkJKDB4MzBCKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfVFhfQ0xLX0VOX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfT1RIUl9DVEwJCQkoMHgzMEMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19PVEhSX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUkRBQ19DTEtfRU5fQ1RMCQkJKDB4MzBEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUkRBQ19DTEtfRU5fQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19BTkNfQ0xLX0VOX0NUTAkJCSgweDMwRSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX0FOQ19DTEtfRU5fQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19SWF9CMV9DVEwJCQkoMHgzMEYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19SWF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1JYX0IyX0NUTAkJCSgweDMxMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1JYX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfTUNMS19DVEwJCQkoMHgzMTEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMS19NQ0xLX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUERNX0NUTAkJCSgweDMxMikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1BETV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1NEX0NUTAkJCSgweDMxMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xLX1NEX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUE9XRVJfQ1RMCQkJKDB4MzE0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTEtfUE9XRVJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfQjFfQ1RMCQkJKDB4MzIwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0IxX0NUTF9fUE9SCQkJCSgweEU0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0IyX0NUTAkJCSgweDMyMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9CM19DVEwJCQkoMHgzMjIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSUwkJCSgweDMyMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9CVUNLX05DUF9WQVJTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRAkJCSgweDMyNCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9JRExFX0hQSF9USFNEX19QT1IJCQkJKDB4MTIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfSURMRV9FQVJfVEhTRAkJCSgweDMyNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9JRExFX0VBUl9USFNEX19QT1IJCQkJKDB4MEMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QJCQkoMHgzMjYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0RfX1BPUgkJCQkoMHgxOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9GQ0xLT05MWV9FQVJfVEhTRAkJCSgweDMyNykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9GQ0xLT05MWV9FQVJfVEhTRF9fUE9SCQkJCSgweDIzKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0tfQUREUgkJCSgweDMyOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9LX0FERFJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9LX0RBVEEJCQkoMHgzMjkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfS19EQVRBX19QT1IJCQkJKDB4QTQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MCQkJKDB4MzJBKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTF9fUE9SCQkJCSgweEQ3KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVQkJCSgweDMyQikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1VfX1BPUgkJCQkoMHgwNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX0wJCQkoMHgzMkMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9MX19QT1IJCQkJKDB4NjApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VCQkJKDB4MzJEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfVV9fUE9SCQkJCSgweDA5KQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX1ZfUEFfSERfRUFSCQkJKDB4MzJFKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX1ZfUEFfSERfRUFSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEgJCQkoMHgzMkYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ0xTSF9WX1BBX01JTl9FQVIJCQkoMHgzMzApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfVl9QQV9NSU5fRUFSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NMU0hfVl9QQV9NSU5fSFBICQkJKDB4MzMxKQorI2RlZmluZSBUQUlLT19BX0NEQ19DTFNIX1ZfUEFfTUlOX0hQSF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMCQkJKDB4MzQwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CMV9DVEwJCQkoMHgzNTApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0IyX0NUTAkJCSgweDM0MSkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMCQkJKDB4MzUxKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfR0FJTl9CM19DVEwJCQkoMHgzNDIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfR0FJTl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9HQUlOX0IzX0NUTAkJCSgweDM1MikKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9HQUlOX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMCQkJKDB4MzQzKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CNF9DVEwJCQkoMHgzNTMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0I1X0NUTAkJCSgweDM0NCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjVfQ1RMCQkJKDB4MzU0KQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjVfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfR0FJTl9CNl9DVEwJCQkoMHgzNDUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfR0FJTl9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9HQUlOX0I2X0NUTAkJCSgweDM1NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9HQUlOX0I2X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjdfQ1RMCQkJKDB4MzQ2KQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0dBSU5fQjdfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CN19DVEwJCQkoMHgzNTYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfR0FJTl9CN19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0I4X0NUTAkJCSgweDM0NykKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX0I4X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjhfQ1RMCQkJKDB4MzU3KQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fQjhfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfQ1RMCQkJKDB4MzQ4KQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0NUTF9fUE9SCQkJCSgweDQwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0NUTAkJCSgweDM1OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9DVExfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX1RJTUVSX0NUTAkJCSgweDM0OSkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMV9HQUlOX1RJTUVSX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fVElNRVJfQ1RMCQkJKDB4MzU5KQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIyX0dBSU5fVElNRVJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwJCQkoMHgzNEEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9DT0VGX0IxX0NUTAkJCSgweDM1QSkKKyNkZWZpbmUgVEFJS09fQV9DRENfSUlSMl9DT0VGX0IxX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0NPRUZfQjJfQ1RMCQkJKDB4MzRCKQorI2RlZmluZSBUQUlLT19BX0NEQ19JSVIxX0NPRUZfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVEwJCQkoMHgzNUIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVE9QX0dBSU5fVVBEQVRFCQkJKDB4MzYwKQorI2RlZmluZSBUQUlLT19BX0NEQ19UT1BfR0FJTl9VUERBVEVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjFfQ1RMCQkJKDB4MzY4KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CMV9DVExfX1BPUgkJCQkoMHgzMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjFfQ1RMCQkJKDB4MzcwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CMV9DVExfX1BPUgkJCQkoMHgzMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjFfQ1RMCQkJKDB4Mzc4KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CMV9DVExfX1BPUgkJCQkoMHgzMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjJfQ1RMCQkJKDB4MzY5KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CMl9DVExfX1BPUgkJCQkoMHhCNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjJfQ1RMCQkJKDB4MzcxKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CMl9DVExfX1BPUgkJCQkoMHhCNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjJfQ1RMCQkJKDB4Mzc5KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CMl9DVExfX1BPUgkJCQkoMHhCNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjNfQ1RMCQkJKDB4MzZBKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CM19DVExfX1BPUgkJCQkoMHgyOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjNfQ1RMCQkJKDB4MzcyKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CM19DVExfX1BPUgkJCQkoMHgyOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjNfQ1RMCQkJKDB4MzdBKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CM19DVExfX1BPUgkJCQkoMHgyOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjRfQ1RMCQkJKDB4MzZCKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CNF9DVExfX1BPUgkJCQkoMHgzQykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjRfQ1RMCQkJKDB4MzczKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CNF9DVExfX1BPUgkJCQkoMHgzQykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjRfQ1RMCQkJKDB4MzdCKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CNF9DVExfX1BPUgkJCQkoMHgzQykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjVfQ1RMCQkJKDB4MzZDKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CNV9DVExfX1BPUgkJCQkoMHgxRikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjVfQ1RMCQkJKDB4Mzc0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CNV9DVExfX1BPUgkJCQkoMHgxRikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjVfQ1RMCQkJKDB4MzdDKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CNV9DVExfX1BPUgkJCQkoMHgxRikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfQjZfQ1RMCQkJKDB4MzZEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfQjZfQ1RMCQkJKDB4Mzc1KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfQjZfQ1RMCQkJKDB4MzdEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVUwkJCSgweDM2RSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVU19fUE9SCQkJCSgweDAzKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9TSFVUX0RPV05fU1RBVFVTCQkJKDB4Mzc2KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9TSFVUX0RPV05fU1RBVFVTX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTVAyX1NIVVRfRE9XTl9TVEFUVVMJCQkoMHgzN0UpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTVAyX1NIVVRfRE9XTl9TVEFUVVNfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDBfRlNfQ0ZHCQkJKDB4MzZGKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMF9GU19DRkdfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDFfRlNfQ0ZHCQkJKDB4Mzc3KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMV9GU19DRkdfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09NUDJfRlNfQ0ZHCQkJKDB4MzdGKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT01QMl9GU19DRkdfX1BPUgkJCQkoMHgwMykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDFfQjFfQ1RMCQkJKDB4MzgwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDFfQjJfQ1RMCQkJKDB4MzgxKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDFfQjNfQ1RMCQkJKDB4MzgyKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMV9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDJfQjFfQ1RMCQkJKDB4MzgzKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDJfQjJfQ1RMCQkJKDB4Mzg0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDJfQjNfQ1RMCQkJKDB4Mzg1KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYMl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDNfQjFfQ1RMCQkJKDB4Mzg2KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYM19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDNfQjJfQ1RMCQkJKDB4Mzg3KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYM19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDRfQjFfQ1RMCQkJKDB4Mzg4KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDRfQjJfQ1RMCQkJKDB4Mzg5KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDVfQjFfQ1RMCQkJKDB4MzhBKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDVfQjJfQ1RMCQkJKDB4MzhCKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNV9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDZfQjFfQ1RMCQkJKDB4MzhDKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNl9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDZfQjJfQ1RMCQkJKDB4MzhEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYNl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDdfQjFfQ1RMCQkJKDB4MzhFKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYN19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDdfQjJfQ1RMCQkJKDB4MzhGKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYN19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWDdfQjNfQ1RMCQkJKDB4MzkwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYN19CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9BTkNfQjFfQ1RMCQkJKDB4MzkxKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX0FOQ19CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9BTkNfQjJfQ1RMCQkJKDB4MzkyKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX0FOQ19CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9CMV9DVEwJCQkoMHgzOTMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMCQkJKDB4Mzk0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX0IzX0NUTAkJCSgweDM5NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9CNF9DVEwJCQkoMHgzOTYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVExX0IxX0NUTAkJCSgweDM5NykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTFfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVExX0IyX0NUTAkJCSgweDM5OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTFfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVExX0IzX0NUTAkJCSgweDM5OSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTFfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVExX0I0X0NUTAkJCSgweDM5QSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTFfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVEyX0IxX0NUTAkJCSgweDM5QikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVEyX0IyX0NUTAkJCSgweDM5QykKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTJfQjJfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTAkJCSgweDM5RCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTJfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fRVEyX0I0X0NUTAkJCSgweDM5RSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9FUTJfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fU1JDMV9CMV9DVEwJCQkoMHgzOUYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fU1JDMV9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9TUkMxX0IyX0NUTAkJCSgweDNBMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9TUkMxX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1NSQzJfQjFfQ1RMCQkJKDB4M0ExKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1NSQzJfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fU1JDMl9CMl9DVEwJCQkoMHgzQTIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fU1JDMl9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CMV9DVEwJCQkoMHgzQTMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjJfQ1RMCQkJKDB4M0E0KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0IzX0NUTAkJCSgweDNBNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CM19DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CNF9DVEwJCQkoMHgzQTYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjVfQ1RMCQkJKDB4M0E3KQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0I2X0NUTAkJCSgweDNBOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CNl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CN19DVEwJCQkoMHgzQTkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjdfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fVFhfU0JfQjhfQ1RMCQkJKDB4M0FBKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0I4X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0I5X0NUTAkJCSgweDNBQikKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9COV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMCQkJKDB4M0FDKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0IxMF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9UWF9TQl9CMTFfQ1RMCQkJKDB4M0FEKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1RYX1NCX0IxMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9SWF9TQl9CMV9DVEwJCQkoMHgzQUUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fUlhfU0JfQjFfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fUlhfU0JfQjJfQ1RMCQkJKDB4M0FGKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX1JYX1NCX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX0NMU0hfQ1RMCQkJKDB4M0IwKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX0NMU0hfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fTUlTQwkJCSgweDNCMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfQ09OTl9NSVNDX19QT1IJCQkJKDB4MDEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX0NPTk5fTUFECQkJKDB4M0IyKQorI2RlZmluZSBUQUlLT19BX0NEQ19DT05OX01BRF9fUE9SCQkJCSgweDAxKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0VOX0NUTAkJCSgweDNDMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19FTl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19GSVJfQjFfQ0ZHCQkJKDB4M0MxKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0ZJUl9CMV9DRkdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19GSVJfQjJfQ0ZHCQkJKDB4M0MyKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0ZJUl9CMl9DRkdfX1BPUgkJCQkoMHgwNikKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19USU1FUl9CMV9DVEwJCQkoMHgzQzMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVElNRVJfQjFfQ1RMX19QT1IJCQkJKDB4MDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMCQkJKDB4M0M0KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1RJTUVSX0IyX0NUTF9fUE9SCQkJCSgweDA5KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTAkJCSgweDNDNSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19USU1FUl9CM19DVExfX1BPUgkJCQkoMHgxRSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19USU1FUl9CNF9DVEwJCQkoMHgzQzYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVElNRVJfQjRfQ1RMX19QT1IJCQkJKDB4NDUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMCQkJKDB4M0M3KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1RJTUVSX0I1X0NUTF9fUE9SCQkJCSgweDA0KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTAkJCSgweDNDOCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19USU1FUl9CNl9DVExfX1BPUgkJCQkoMHg3OCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19CMV9TVEFUVVMJCQkoMHgzQzkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQjFfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQjJfU1RBVFVTCQkJKDB4M0NBKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0IyX1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0IzX1NUQVRVUwkJCSgweDNDQikKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19CM19TVEFUVVNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19CNF9TVEFUVVMJCQkoMHgzQ0MpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQjRfU1RBVFVTX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQjVfU1RBVFVTCQkJKDB4M0NEKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0I1X1NUQVRVU19fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0IxX0NUTAkJCSgweDNDRSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19CMV9DVExfX1BPUgkJCQkoMHhDMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19CMl9DVEwJCQkoMHgzQ0YpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQjJfQ1RMX19QT1IJCQkJKDB4NUQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CMV9DVEwJCQkoMHgzRDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0IyX0NUTAkJCSgweDNEMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0IyX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjNfQ1RMCQkJKDB4M0QyKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjNfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwJCQkoMHgzRDMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CNF9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0I1X0NUTAkJCSgweDNENCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0I1X0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjZfQ1RMCQkJKDB4M0Q1KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjZfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CN19DVEwJCQkoMHgzRDYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CN19DVExfX1BPUgkJCQkoMHhGRikKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0I4X0NUTAkJCSgweDNENykKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0I4X0NUTF9fUE9SCQkJCSgweDA3KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMCQkJKDB4M0Q4KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMX19QT1IJCQkJKDB4RkYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMCQkJKDB4M0Q5KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjEwX0NUTF9fUE9SCQkJCSgweDdGKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1ZPTFRfQjExX0NUTAkJCSgweDNEQSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0IxMV9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19WT0xUX0IxMl9DVEwJCQkoMHgzREIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfVk9MVF9CMTJfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfQ0xLX0NUTAkJCSgweDNEQykKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19DTEtfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfSU5UX0NUTAkJCSgweDNERCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUJIQ19JTlRfQ1RMX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01CSENfREVCVUdfQ1RMCQkJKDB4M0RFKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX0RFQlVHX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1NQQVJFCQkJKDB4M0RGKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQkhDX1NQQVJFX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9NQUlOX0NUTF8xCQkJKDB4M0UwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfTUFJTl9DVExfMV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfTUFJTl9DVExfMgkJCSgweDNFMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX01BSU5fQ1RMXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF8xCQkJKDB4M0UyKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF8yCQkJKDB4M0UzKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF8zCQkJKDB4M0U0KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF80CQkJKDB4M0U1KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzRfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF81CQkJKDB4M0U2KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzVfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF82CQkJKDB4M0U3KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF83CQkJKDB4M0U4KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0NUTF84CQkJKDB4M0U5KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fQ1RMXzhfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfUFRSCQkJKDB4M0VBKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9QVFJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMCQkJKDB4M0VCKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9WQUxfX1BPUgkJCQkoMHg0MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX1VMVFJfQ1RMXzEJCQkoMHgzRUMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9VTFRSX0NUTF8xX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9VTFRSX0NUTF8yCQkJKDB4M0VEKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfVUxUUl9DVExfMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfVUxUUl9DVExfMwkJCSgweDNFRSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX1VMVFJfQ1RMXzNfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX1VMVFJfQ1RMXzQJCQkoMHgzRUYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9VTFRSX0NUTF80X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9VTFRSX0NUTF81CQkJKDB4M0YwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfVUxUUl9DVExfNV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfVUxUUl9DVExfNgkJCSgweDNGMSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX1VMVFJfQ1RMXzZfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX1VMVFJfQ1RMXzcJCQkoMHgzRjIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9VTFRSX0NUTF83X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzEJCQkoMHgzRjMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzFfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfMgkJCSgweDNGNCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfMl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0NUTF8zCQkJKDB4M0Y1KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0NUTF8zX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzQJCQkoMHgzRjYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzRfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfNQkJCSgweDNGNykKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfNV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0NUTF82CQkJKDB4M0Y4KQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0NUTF82X19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzcJCQkoMHgzRjkpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzdfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfOAkJCSgweDNGQSkKKyNkZWZpbmUgVEFJS09fQV9DRENfTUFEX0JFQUNPTl9DVExfOF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSCQkJKDB4M0ZCKQorI2RlZmluZSBUQUlLT19BX0NEQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fSUlSX0NUTF9WQUwJCQkoMHgzRkMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX01BRF9CRUFDT05fSUlSX0NUTF9WQUxfX1BPUgkJCQkoMHgwMCkKKworLyogVGFpa28gdjIrIHJlZ2lzdGVycyAqLworI2RlZmluZSBUQUlLT19BX0NEQ19UWF8xX0dBSU4JCQkoMHgxNTMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzFfR0FJTl9fUE9SCQkJKDB4MDIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzJfR0FJTgkJCSgweDE1NSkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfMl9HQUlOX19QT1IJCQkoMHgwMikKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfMV8yX0FEQ19JQgkJKDB4MTU2KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF8xXzJfQURDX0lCX19QT1IJCQkoMHg0NCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfM19HQUlOCQkJKDB4MTVEKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF8zX0dBSU5fX1BPUgkJCSgweDAyKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF80X0dBSU4JCQkoMHgxNUYpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzRfR0FJTl9fUE9SCQkJKDB4MDIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzNfNF9BRENfSUIJCSgweDE2MCkKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfM180X0FEQ19JQl9fUE9SCQkJKDB4NDQpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzVfR0FJTgkJCSgweDE2NykKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfNV9HQUlOX19QT1IJCQkoMHgwMikKKyNkZWZpbmUgVEFJS09fQV9DRENfVFhfNl9HQUlOCQkJKDB4MTY5KQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF82X0dBSU5fX1BPUgkJCSgweDAyKQorI2RlZmluZSBUQUlLT19BX0NEQ19UWF81XzZfQURDX0lCCQkoMHgxNkEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1RYXzVfNl9BRENfSUJfX1BPUgkJCSgweDQ0KQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMMAkJKDB4MjcwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMMF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDEJCSgweDI3MSkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDFfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyCQkoMHgyNzIpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyX19QT1IJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMMwkJKDB4MjczKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMM19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDQJCSgweDI3NCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDRfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1CQkoMHgyNzUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1X19QT1IJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMNgkJKDB4Mjc2KQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfVkFMNl9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDcJCSgweDI3NykKKyNkZWZpbmUgVEFJS09fQV9DRENfU1BLUl9DTElQREVUX1ZBTDdfX1BPUgkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfR0FJTl9VUERfTU9OCQkoMHgyRkEpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1ZCQVRfR0FJTl9VUERfTU9OX19QT1IJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0dBSU5fTU9OX1ZBTAkJKDB4MkZCKQorI2RlZmluZSBUQUlLT19BX0NEQ19WQkFUX0dBSU5fTU9OX1ZBTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUEFfUkFNUF9CMV9DVEwJCSgweDM2MSkKKyNkZWZpbmUgVEFJS09fQV9DRENfUEFfUkFNUF9CMV9DVExfX1BPUgkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19QQV9SQU1QX0IyX0NUTAkJKDB4MzYyKQorI2RlZmluZSBUQUlLT19BX0NEQ19QQV9SQU1QX0IyX0NUTF9fUE9SCQkJKDB4MDApCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMCQkoMHgzNjMpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMX19QT1IJCQkoMHgwMCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUEFfUkFNUF9CNF9DVEwJCSgweDM2NCkKKyNkZWZpbmUgVEFJS09fQV9DRENfUEFfUkFNUF9CNF9DVExfX1BPUgkJCSgweDAwKQorI2RlZmluZSBUQUlLT19BX0NEQ19TUEtSX0NMSVBERVRfQjFfQ1RMCQkoMHgzNjUpCisjZGVmaW5lIFRBSUtPX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVExfX1BPUgkJKDB4MDApCisKKy8qIFNMSU1CVVMgU2xhdmUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRBSUtPX1NMSU1fUEdEX1BPUlRfSU5UX0VOMCAgICAgICAgICAgICAgICAgICAgICgweDMwKQorI2RlZmluZSBUQUlLT19TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfUlhfMCAgICAgICAgICAgICAoMHgzNCkKKyNkZWZpbmUgVEFJS09fU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzEgICAgICAgICAgICAgKDB4MzUpCisjZGVmaW5lIFRBSUtPX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19UWF8wICAgICAgICAgICAgICgweDM2KQorI2RlZmluZSBUQUlLT19TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMSAgICAgICAgICAgICAoMHgzNykKKyNkZWZpbmUgVEFJS09fU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzAgICAgICAgICAgICAgICAgKDB4MzgpCisjZGVmaW5lIFRBSUtPX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9SWF8xICAgICAgICAgICAgICAgICgweDM5KQorI2RlZmluZSBUQUlLT19TTElNX1BHRF9QT1JUX0lOVF9DTFJfVFhfMCAgICAgICAgICAgICAgICAoMHgzQSkKKyNkZWZpbmUgVEFJS09fU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzEgICAgICAgICAgICAgICAgKDB4M0IpCisjZGVmaW5lIFRBSUtPX1NMSU1fUEdEX1BPUlRfSU5UX1JYX1NPVVJDRTAJCSgweDYwKQorI2RlZmluZSBUQUlLT19TTElNX1BHRF9QT1JUX0lOVF9UWF9TT1VSQ0UwCQkoMHg3MCkKKworLyogTWFjcm9zIGZvciBQYWNraW5nIFJlZ2lzdGVyIFdyaXRlcyBpbnRvIGEgVTMyICovCisjZGVmaW5lIFRBSUtPX1BBQ0tFRF9SRUdfU0laRSBzaXplb2YodTMyKQorCisjZGVmaW5lIFRBSUtPX0NPREVDX1BBQ0tfRU5UUlkocmVnLCBtYXNrLCB2YWwpICgodmFsICYgMHhmZil8XAorCSgobWFzayAmIDB4ZmYpIDw8IDgpfCgocmVnICYgMHhmZmZmKSA8PCAxNikpCisKKyNkZWZpbmUgVEFJS09fQ09ERUNfVU5QQUNLX0VOVFJZKHBhY2tlZCwgcmVnLCBtYXNrLCB2YWwpIFwKKwlkbyB7IFwKKwkJKChyZWcpID0gKChwYWNrZWQgPj4gMTYpICYgKDB4ZmZmZikpKTsgXAorCQkoKG1hc2spID0gKChwYWNrZWQgPj4gOCkgJiAoMHhmZikpKTsgXAorCQkoKHZhbCkgPSAoKHBhY2tlZCkgJiAoMHhmZikpKTsgXAorCX0gd2hpbGUgKDApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMmNmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMzYxIEBACisjaWZuZGVmIFdDRDlYWFhfQ09ERUNfRElHSVRBTF9ICisKKyNkZWZpbmUgV0NEOVhYWF9DT0RFQ19ESUdJVEFMX0gKKworI2RlZmluZSBXQ0Q5WFhYX0FfQ0hJUF9DVEwJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfQ1RMX19QT1IJCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfU1RBVFVTCQkJKDB4MDEpCisjZGVmaW5lIFdDRDlYWFhfQV9DSElQX1NUQVRVU19fUE9SCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfSURfQllURV8wCQkoMHgwNCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfSURfQllURV8wX19QT1IJCSgweDAwMDAwMDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzEJCSgweDA1KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0hJUF9JRF9CWVRFXzFfX1BPUgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFdDRDlYWFhfQV9DSElQX0lEX0JZVEVfMgkJKDB4MDYpCisjZGVmaW5lIFdDRDlYWFhfQV9DSElQX0lEX0JZVEVfMl9fUE9SCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfSURfQllURV8zCQkoMHgwNykKKyNkZWZpbmUgV0NEOVhYWF9BX0NISVBfSURfQllURV8zX19QT1IJCSgweDAwMDAwMDAxKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0hJUF9WRVJTSU9OCQkJKDB4MDgpCisjZGVmaW5lIFdDRDlYWFhfQV9DSElQX1ZFUlNJT05fX1BPUgkJKDB4MDAwMDAwMjApCisjZGVmaW5lIFdDRDlYWFhfQV9TQl9WRVJTSU9OCQkJKDB4MDkpCisjZGVmaW5lIFdDRDlYWFhfQV9TQl9WRVJTSU9OX19QT1IJCSgweDAwMDAwMDEwKQorI2RlZmluZSBXQ0Q5WFhYX0FfU0xBVkVfSURfMQkJCSgweDBDKQorI2RlZmluZSBXQ0Q5WFhYX0FfU0xBVkVfSURfMV9fUE9SCQkoMHgwMDAwMDA3NykKKyNkZWZpbmUgV0NEOVhYWF9BX1NMQVZFX0lEXzIJCQkoMHgwRCkKKyNkZWZpbmUgV0NEOVhYWF9BX1NMQVZFX0lEXzJfX1BPUgkJKDB4MDAwMDAwNjYpCisjZGVmaW5lIFdDRDlYWFhfQV9TTEFWRV9JRF8zCQkJKDB4MEUpCisjZGVmaW5lIFdDRDlYWFhfQV9TTEFWRV9JRF8zX19QT1IJCSgweDAwMDAwMDU1KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NUTAkJCSgweDgwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NUTF9fUE9SCQkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFdDRDlYWFhfQV9MRUFLQUdFX0NUTAkJCSgweDg4KQorI2RlZmluZSBXQ0Q5WFhYX0FfTEVBS0FHRV9DVExfX1BPUgkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIFdDRDlYWFhfQV9JTlRSX01PREUJCQkoMHg5MCkKKyNkZWZpbmUgV0NEOVhYWF9BX0lOVFJfTUFTSzAJCQkoMHg5NCkKKyNkZWZpbmUgV0NEOVhYWF9BX0lOVFJfU1RBVFVTMAkJCSgweDk4KQorI2RlZmluZSBXQ0Q5WFhYX0FfSU5UUl9DTEVBUjAJCQkoMHg5QykKKyNkZWZpbmUgV0NEOVhYWF9BX0lOVFJfTEVWRUwwCQkJKDB4QTApCisjZGVmaW5lIFdDRDlYWFhfQV9JTlRSX0xFVkVMMQkJCSgweEExKQorI2RlZmluZSBXQ0Q5WFhYX0FfSU5UUl9MRVZFTDIJCQkoMHhBMikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU4JCQkoMHgxQUIpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQ05QX0VOX19QT1IJCSgweDgwKQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9FTgkJCSgweDFBQikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU5fX1BPUgkJKDB4ODApCisjZGVmaW5lIFdDRDlYWFhfQV9CSUFTX0NFTlRSQUxfQkdfQ1RMCQkoMHgxMDEpCisjZGVmaW5lIFdDRDlYWFhfQV9CSUFTX0NFTlRSQUxfQkdfQ1RMX19QT1IJKDB4NTApCisjZGVmaW5lIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjEJCQkoMHgxMDgpCisjZGVmaW5lIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjFfX1BPUgkJKDB4MDQpCisjZGVmaW5lIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjIJCQkoMHgxMDkpCisjZGVmaW5lIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjJfX1BPUgkJKDB4MDIpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9DT01fQklBUwkJCSgweDFBMikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0NPTV9CSUFTX19QT1IJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfUkNfT1NDX0ZSRVEJCQkoMHgxRkEpCisjZGVmaW5lIFdDRDlYWFhfQV9SQ19PU0NfRlJFUV9fUE9SCQkoMHg0NikKKyNkZWZpbmUgV0NEOVhYWF9BX0JJQVNfT1NDX0JHX0NUTAkJKDB4MTA1KQorI2RlZmluZSBXQ0Q5WFhYX0FfQklBU19PU0NfQkdfQ1RMX19QT1IJCSgweDE2KQorI2RlZmluZSBXQ0Q5WFhYX0FfUkNfT1NDX1RFU1QJCQkoMHgxRkIpCisjZGVmaW5lIFdDRDlYWFhfQV9SQ19PU0NfVEVTVF9fUE9SCQkoMHgwQSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTEtfTUNMS19DVEwJCSgweDMxMSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTEtfTUNMS19DVExfX1BPUgkJKDB4MDApCisKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTAkJKDB4M0MwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfRklSX0IxX0NGRwkJKDB4M0MxKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfRklSX0IxX0NGR19fUE9SCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfRklSX0IyX0NGRwkJKDB4M0MyKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfRklSX0IyX0NGR19fUE9SCSgweDA2KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjFfQ1RMCQkoMHgzQzMpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CMV9DVExfX1BPUgkoMHgwMykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0IyX0NUTAkJKDB4M0M0KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMX19QT1IJKDB4MDkpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CM19DVEwJCSgweDNDNSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTF9fUE9SCSgweDFFKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjRfQ1RMCQkoMHgzQzYpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CNF9DVExfX1BPUgkoMHg0NSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0I1X0NUTAkJKDB4M0M3KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMX19QT1IJKDB4MDQpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CNl9DVEwJCSgweDNDOCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTF9fUE9SCSgweDc4KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfU1RBVFVTCQkoMHgzQzkpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9TVEFUVVNfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0IyX1NUQVRVUwkJKDB4M0NBKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQjJfU1RBVFVTX19QT1IJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19CM19TVEFUVVMJCSgweDNDQikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0IzX1NUQVRVU19fUE9SCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQjRfU1RBVFVTCQkoMHgzQ0MpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19CNF9TVEFUVVNfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0I1X1NUQVRVUwkJKDB4M0NEKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQjVfU1RBVFVTX19QT1IJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwJCSgweDNDRSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTF9fUE9SCQkoMHhDMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0IyX0NUTAkJKDB4M0NGKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQjJfQ1RMX19QT1IJCSgweDVEKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMV9DVEwJCSgweDNEMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjFfQ1RMX19QT1IJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IyX0NUTAkJKDB4M0QxKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMl9DVExfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjNfQ1RMCQkoMHgzRDIpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IzX0NUTF9fUE9SCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwJCSgweDNEMykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjRfQ1RMX19QT1IJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I1X0NUTAkJKDB4M0Q0KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNV9DVExfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjZfQ1RMCQkoMHgzRDUpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I2X0NUTF9fUE9SCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CN19DVEwJCSgweDNENikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjdfQ1RMX19QT1IJKDB4RkYpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I4X0NUTAkJKDB4M0Q3KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9COF9DVExfX1BPUgkoMHgwNykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMCQkoMHgzRDgpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I5X0NUTF9fUE9SCSgweEZGKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMCQkoMHgzRDkpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMF9DVExfX1BPUgkoMHg3RikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjExX0NUTAkJKDB4M0RBKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMTFfQ1RMX19QT1IJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMl9DVEwJCSgweDNEQikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjEyX0NUTF9fUE9SCSgweDgwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTAkJKDB4M0RDKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVEwJCSgweDNERCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfTUJIQ19ERUJVR19DVEwJCSgweDNERSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX0RFQlVHX0NUTF9fUE9SCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX01CSENfU1BBUkUJCSgweDNERikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19NQkhDX1NQQVJFX19QT1IJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xCQkoMHgxNEUpCisjZGVmaW5lIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzFfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9PQ1BfQ1RMCQkoMHgxQUEpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTF9fUE9SCQkoMHg2OCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfMV9DVEwJCQkoMHgxMkIpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzFfQ1RMX19QT1IJCSgweDE2KQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8xX0lOVF9SQklBUwkJKDB4MTJDKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8xX0lOVF9SQklBU19fUE9SCQkoMHgyNCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfMV9NQkhDCQkJKDB4MTJEKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8xX01CSENfX1BPUgkJKDB4MDEpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfQ1RMCQkoMHgxMkUpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfQ1RMX19QT1IJCSgweDQwKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8yX1ZBTAkJKDB4MTJGKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8yX1ZBTF9fUE9SCQkoMHg4MCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfMl9QUkVDSFJHCQkoMHgxMzApCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfUFJFQ0hSR19fUE9SCSgweDM4KQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8yX0NUTAkJCSgweDEzMSkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfMl9DVExfX1BPUgkJKDB4MTYpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzJfSU5UX1JCSUFTCQkoMHgxMzIpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzJfSU5UX1JCSUFTX19QT1IJCSgweDI0KQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8yX01CSEMJCQkoMHgxMzMpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzJfTUJIQ19fUE9SCQkoMHgwMikKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfM19DVEwJCSgweDEzNCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfM19DVExfX1BPUgkJKDB4NDApCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzNfVkFMCQkoMHgxMzUpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzNfVkFMX19QT1IJCSgweDgwKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8zX1BSRUNIUkcJCSgweDEzNikKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfM19QUkVDSFJHX19QT1IJKDB4MzgpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzNfQ1RMCQkJKDB4MTM3KQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl8zX0NUTF9fUE9SCQkoMHgxNikKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfM19JTlRfUkJJQVMJCSgweDEzOCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfM19JTlRfUkJJQVNfX1BPUgkJKDB4MjQpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzNfTUJIQwkJCSgweDEzOSkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfM19NQkhDX19QT1IJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl80X0NUTAkJCSgweDEzRCkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfNF9DVExfX1BPUgkJKDB4MTYpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzRfSU5UX1JCSUFTCQkoMHgxM0UpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzRfSU5UX1JCSUFTX19QT1IJCSgweDI0KQorI2RlZmluZSBXQ0Q5WFhYX0FfTUlDQl80X01CSEMJCQkoMHgxM0YpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCXzRfTUJIQ19fUE9SCQkoMHgwMSkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfMV9WQUwJCSgweDEyOSkKKyNkZWZpbmUgV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfMV9WQUxfX1BPUgkJKDB4ODApCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9TVEFUVVMJCSgweDFCMykKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9MX1NUQVRVU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX01CSENfSFBICQkJKDB4MUZFKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUJIQ19IUEhfX1BPUgkJCSgweDQ0KQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19USU1FCQkoMHgxQUQpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQ05QX1dHX1RJTUVfX1BPUgkoMHgyQSkKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX0RBQ19DVEwJCSgweDFCNykKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX0RBQ19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9EQUNfQ1RMCQkoMHgxQjEpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9EQUNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfVFhfN19NQkhDX0VOCQkJKDB4MTcxKQorI2RlZmluZSBXQ0Q5WFhYX0FfVFhfN19NQkhDX0VOX19QT1IJCSgweDBDKQorI2RlZmluZSBXQ0Q5WFhYX0FfUElOX0NUTF9PRTAJCQkoMHgwMTApCisjZGVmaW5lIFdDRDlYWFhfQV9QSU5fQ1RMX09FMF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX1BJTl9DVExfT0UxCQkJKDB4MDExKQorI2RlZmluZSBXQ0Q5WFhYX0FfUElOX0NUTF9PRTFfX1BPUgkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfQ1RMCQkoMHgxMjgpCisjZGVmaW5lIFdDRDlYWFhfQV9MRE9fSF9NT0RFXzEJCQkoMHgxMTApCisjZGVmaW5lIFdDRDlYWFhfQV9MRE9fSF9NT0RFXzFfX1BPUgkJKDB4NjUpCisjZGVmaW5lIFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfQ1RMX19QT1IJCSgweDQwKQorI2RlZmluZSBXQ0Q5WFhYX0FfVFhfN19NQkhDX1RFU1RfQ1RMCQkoMHgxNzQpCisjZGVmaW5lIFdDRDlYWFhfQV9UWF83X01CSENfVEVTVF9DVExfX1BPUgkoMHgzOCkKKyNkZWZpbmUgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMgkJKDB4MTRGKQorI2RlZmluZSBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8yX19QT1IJKDB4ODApCisjZGVmaW5lIFdDRDlYWFhfQV9UWF9DT01fQklBUwkJCSgweDE0QykKKyNkZWZpbmUgV0NEOVhYWF9BX1RYX0NPTV9CSUFTX19QT1IJCSgweEYwKQorCisjZGVmaW5lIFdDRDlYWFhfQV9NQkhDX0lOU0VSVF9ERVRFQ1QJCSgweDE0QSkgLyogVEFJS08gYW5kIGxhdGVyICovCisjZGVmaW5lIFdDRDlYWFhfQV9NQkhDX0lOU0VSVF9ERVRFQ1RfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX01CSENfSU5TRVJUX0RFVF9TVEFUVVMJKDB4MTRCKSAvKiBUQUlLTyBhbmQgbGF0ZXIgKi8KKyNkZWZpbmUgV0NEOVhYWF9BX01CSENfSU5TRVJUX0RFVF9TVEFUVVNfX1BPUgkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTAkJCSgweDE1MCkKKyNkZWZpbmUgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTF9fUE9SCQkoMHhGMSkKKworCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xLX09USFJfQ1RMCQkJKDB4MzBDKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMS19PVEhSX0NUTF9fUE9SCQkJCSgweDAwKQorCisvKiBDbGFzcyBIIHJlbGF0ZWQgY29tbW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19NT0RFXzEJCQkoMHgxODEpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX01PREVfMV9fUE9SCQkJCSgweDIxKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19NT0RFXzIJCQkoMHgxODIpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX01PREVfMl9fUE9SCQkJCSgweEZGKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19NT0RFXzMJCQkoMHgxODMpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX01PREVfM19fUE9SCQkJCSgweENDKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19NT0RFXzQJCQkoMHgxODQpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX01PREVfNF9fUE9SCQkJCSgweDNBKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19NT0RFXzUJCQkoMHgxODUpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX01PREVfNV9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX1ZDTF8xCQkJKDB4MTg2KQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX1ZDTF8xX19QT1IJCQkJKDB4NDgpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfVkNMXzIJCQkoMHgxODcpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfVkNMXzJfX1BPUgkJCQkoMHhBMykKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9WQ0xfMwkJCSgweDE4OCkKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9WQ0xfM19fUE9SCQkJCSgweDgyKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX0NDTF8xCQkJKDB4MTg5KQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX0NDTF8xX19QT1IJCQkJKDB4QUIpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfQ0NMXzIJCQkoMHgxOEEpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfQ0NMXzJfX1BPUgkJCQkoMHhEQykKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9DQ0xfMwkJCSgweDE4QikKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9DQ0xfM19fUE9SCQkJCSgweDZBKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX0NDTF80CQkJKDB4MThDKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19DVFJMX0NDTF80X19QT1IJCQkJKDB4NTgpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfUFdNX0RSVlJfMQkJCSgweDE4RCkKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8xX19QT1IJCQkJKDB4NTApCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfUFdNX0RSVlJfMgkJCSgweDE4RSkKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8yX19QT1IJCQkJKDB4NjQpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX0NUUkxfUFdNX0RSVlJfMwkJCSgweDE4RikKKyNkZWZpbmUgV0NEOVhYWF9BX0JVQ0tfQ1RSTF9QV01fRFJWUl8zX19QT1IJCQkJKDB4NzcpCisjZGVmaW5lIFdDRDlYWFhfQV9CVUNLX1RNVVhfQV9ECQkJKDB4MTkwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQlVDS19UTVVYX0FfRF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfTkNQX0VOCQkJKDB4MTkyKQorI2RlZmluZSBXQ0Q5WFhYX0FfTkNQX0VOX19QT1IJCQkJKDB4RkUpCisjZGVmaW5lIFdDRDlYWFhfQV9OQ1BfU1RBVElDCQkJKDB4MTk0KQorI2RlZmluZSBXQ0Q5WFhYX0FfTkNQX1NUQVRJQ19fUE9SCQkJCSgweDI4KQorI2RlZmluZSBXQ0Q5WFhYX0FfTkNQX0JVQ0tSRUYJCQkoMHgxOTEpCisjZGVmaW5lIFdDRDlYWFhfQV9OQ1BfQlVDS1JFRl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjFfQ1RMCQkJKDB4MzIwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjFfQ1RMX19QT1IJCQkJKDB4RTQpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9CMl9DVEwJCQkoMHgzMjEpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9CMl9DVExfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0IzX0NUTAkJCSgweDMyMikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0IzX0NUTF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSUwkJCSgweDMyMykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlNfX1BPUgkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRAkJCSgweDMyNCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0RfX1BPUgkJCSgweDEyKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9FQVJfVEhTRAkJCSgweDMyNSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfRUFSX1RIU0RfX1BPUgkJCSgweDBDKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QJCQkoMHgzMjYpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRF9fUE9SCQkoMHgxOCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNECQkJKDB4MzI3KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfRUFSX1RIU0RfX1BPUgkJKDB4MjMpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIJCQkoMHgzMjgpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQQkJCSgweDMyOSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQV9fUE9SCQkJCSgweEE0KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MCQkJKDB4MzJBKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MX19QT1IJCQkJKDB4RDcpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UJCQkoMHgzMkIpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1VfX1BPUgkJCQkoMHgwNSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTAkJCSgweDMyQykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTF9fUE9SCQkJCSgweDYwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VCQkJKDB4MzJEKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VX19QT1IJCQkJKDB4MDkpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9WX1BBX0hEX0VBUgkJCSgweDMyRSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX1ZfUEFfSERfRUFSX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9WX1BBX0hEX0hQSAkJCSgweDMyRikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX1ZfUEFfSERfSFBIX19QT1IJCQkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9WX1BBX01JTl9FQVIJCQkoMHgzMzApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9WX1BBX01JTl9FQVJfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX1ZfUEFfTUlOX0hQSAkJCSgweDMzMSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX1ZfUEFfTUlOX0hQSF9fUE9SCQkJCSgweDAwKQorCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfUlgxX0I2X0NUTAkJCSgweDJCNSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19SWDFfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfUlgyX0I2X0NUTAkJCSgweDJCRCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19SWDJfQjZfQ1RMX19QT1IJCQkJKDB4ODApCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9HQUlOCQkJCSgweDFBRSkKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9MX0dBSU5fX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX0dBSU4JCQkJKDB4MUI0KQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX1JfR0FJTl9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX0NIT1BfQ1RMCQkJKDB4MUE1KQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX0NIT1BfQ1RMX19QT1IJCQkJKDB4QjQpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQklBU19QQQkJCSgweDFBNikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9CSUFTX1BBX19QT1IJCQkJKDB4N0EpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9URVNUCQkJCSgweDFBRikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9MX1RFU1RfX1BPUgkJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX1RFU1QJCQkJKDB4MUI1KQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX1JfVEVTVF9fUE9SCQkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NMS19SWF9CMV9DVEwJCQkoMHgzMEYpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xLX1JYX0IxX0NUTF9fUE9SCQkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9OQ1BfQ0xLCQkJCSgweDE5MykKKyNkZWZpbmUgV0NEOVhYWF9BX05DUF9DTEtfX1BPUgkJCQkJKDB4OTQpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQklBU19XR19PQ1AJCQkoMHgxQTkpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQklBU19XR19PQ1BfX1BPUgkJCSgweDJBKQorI2RlZmluZSBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19DVEwJCQkoMHgxQUMpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfQ05QX1dHX0NUTF9fUE9SCQkJKDB4REUpCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9QQV9DVEwJCQkoMHgxQjApCisjZGVmaW5lIFdDRDlYWFhfQV9SWF9IUEhfTF9QQV9DVExfX1BPUgkJCQkoMHg0MikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX1BBX0NUTAkJCSgweDFCNikKKyNkZWZpbmUgV0NEOVhYWF9BX1JYX0hQSF9SX1BBX0NUTF9fUE9SCQkJCSgweDQyKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX0NPTk5fUlgyX0IxX0NUTAkJCSgweDM4MykKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DT05OX1JYMl9CMV9DVExfX1BPUgkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMCQkJKDB4MzYxKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMX19QT1IJCQkoMHgwMCkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IyX0NUTAkJCSgweDM2MikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IyX0NUTF9fUE9SCQkJKDB4MDApCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CM19DVEwJCQkoMHgzNjMpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CM19DVExfX1BPUgkJCSgweDAwKQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjRfQ1RMCQkJKDB4MzY0KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjRfQ1RMX19QT1IJCQkoMHgwMCkKKworI2RlZmluZSBXQ0Q5MzMwX0FfTEVBS0FHRV9DVEwJCQkJKDB4MDNDKQorI2RlZmluZSBXQ0Q5MzMwX0FfTEVBS0FHRV9DVExfX1BPUgkJCQkoMHgwNCkKKyNkZWZpbmUgV0NEOTMzMF9BX0NEQ19DVEwJCQkJKDB4MDM0KQorI2RlZmluZSBXQ0Q5MzMwX0FfQ0RDX0NUTF9fUE9SCQkJCQkoMHgwMCkKKworLyogQ2xhc3MtSCByZWdpc3RlcnMgZm9yIGNvZGVjcyBmcm9tIGFuZCBhYm92ZSBXQ0Q5MzM1ICovCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfUlgwX1JYX1BBVEhfQ0ZHMAkJCSgweEI0MikKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwCQkJKDB4QjU2KQorI2RlZmluZSBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAJCQkoMHhCNkEpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9LMV9NU0IJCQkoMHhDMDgpCisjZGVmaW5lIFdDRDlYWFhfQV9DRENfQ0xTSF9LMV9MU0IJCQkoMHhDMDkpCisjZGVmaW5lIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMJCQkoMHg2MDgpCisjZGVmaW5lIFdDRDlYWFhfQV9BTkFfSFBICQkJCSgweDYwOSkKKyNkZWZpbmUgV0NEOVhYWF9BX0NEQ19DTFNIX0NSQwkJCQkoMHhDMDEpCisjZGVmaW5lIFdDRDlYWFhfRkxZQkFDS19FTgkJCQkoMHg2QTQpCisjZGVmaW5lIFdDRDlYWFhfRkxZQkFDS19WTkVHX0NUUkxfMQkJCSgweDZBNSkKKyNkZWZpbmUgV0NEOVhYWF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8yCQkJKDB4NkFGKQorI2RlZmluZSBXQ0Q5WFhYX1JYX0JJQVNfRkxZQl9CVUZGCQkJKDB4NkM3KQorI2RlZmluZSBXQ0Q5WFhYX0hQSF9MX0VOCQkJCSgweDZEMykKKyNkZWZpbmUgV0NEOVhYWF9IUEhfUl9FTgkJCQkoMHg2RDYpCisjZGVmaW5lIFdDRDlYWFhfSFBIX1JFRkJVRkZfVUhRQV9DVEwJCQkoMHg2REQpCisjZGVmaW5lIFdDRDlYWFhfQ0xBU1NIX0NUUkxfVkNMXzIgICAgICAgICAgICAgICAgICAgICAgICgweDY5QikKKyNkZWZpbmUgV0NEOVhYWF9DRENfQ0xTSF9IUEhfVl9QQQkJCSgweEMwNCkKKyNkZWZpbmUgV0NEOVhYWF9DRENfUlgwX1JYX1BBVEhfU0VDMAkJCSgweEI0OSkKKyNkZWZpbmUgV0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfQ1RMCQkJKDB4QjU1KQorI2RlZmluZSBXQ0Q5WFhYX0NEQ19SWDJfUlhfUEFUSF9DVEwJCQkoMHhCNjkpCisjZGVmaW5lIFdDRDlYWFhfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wJCSgweEQ0MSkKKyNkZWZpbmUgV0NEOVhYWF9DTEFTU0hfQ1RSTF9DQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgKDB4NjlDKQorCisvKiBSWCBHYWluIGNvbnRyb2wgcmVnaXN0ZXJzIG9mIGNvZGVjcyBmcm9tIGFuZCBhYm92ZSBXQ0Q5MzM1ICovCisjZGVmaW5lIFdDRDlYWFhfQ0RDX1JYMV9SWF9WT0xfQ1RMCQkJKDB4QjU5KQorI2RlZmluZSBXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwJCQkoMHhCNUMpCisjZGVmaW5lIFdDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEJCQkoMHhCNUUpCisjZGVmaW5lIFdDRDlYWFhfQ0RDX1JYMl9SWF9WT0xfQ1RMCQkJKDB4QjZEKQorI2RlZmluZSBXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwJCQkoMHhCNzApCisjZGVmaW5lIFdDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEJCQkoMHhCNzIpCisKKy8qIENsYXNzLUggcmVnaXN0ZXJzIGZvciBjb2RlY3MgZnJvbSBhbmQgYWJvdmUgV0NEOTM0WCAqLworI2RlZmluZSBXQ0Q5WFhYX0hQSF9DTlBfV0dfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNmNjKQorI2RlZmluZSBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzQJCQkoMHgwNmE4KQorI2RlZmluZSBXQ0Q5WFhYX0hQSF9ORVdfSU5UX1BBX01JU0MyCQkJKDB4MDczOCkKKyNkZWZpbmUgV0NEOVhYWF9SWF9CSUFTX0hQSF9MT1dQT1dFUgkJCSgweDA2YmYpCisjZGVmaW5lIFdDRDlYWFhfSFBIX1BBX0NUTDEJCQkJKDB4MDZkMSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTI3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qIGluY2x1ZGUvbGludXgvbXNtX2F1ZGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfVUFQSV9MSU5VWF9NU01fQVVESU9fSAorI2RlZmluZSBfVUFQSV9MSU5VWF9NU01fQVVESU9fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiBQQ00gQXVkaW8gKi8KKworI2RlZmluZSBBVURJT19JT0NUTF9NQUdJQyAnYScKKworI2RlZmluZSBBVURJT19TVEFSVCAgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19TVE9QICAgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19GTFVTSCAgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19HRVRfQ09ORklHICAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgMywgXAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZykKKyNkZWZpbmUgQVVESU9fU0VUX0NPTkZJRyAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDQsIFwKKwkJc3RydWN0IG1zbV9hdWRpb19jb25maWcpCisjZGVmaW5lIEFVRElPX0dFVF9TVEFUUyAgICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA1LCBcCisJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMpCisjZGVmaW5lIEFVRElPX0VOQUJMRV9BVURQUCBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9BRFJDICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA3LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9FUSAgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9SWF9JSVIgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9WT0xVTUUgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19QQVVTRSAgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fUExBWV9EVE1GICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEyLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX0dFVF9FVkVOVCAgICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCAxMywgXAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KQorI2RlZmluZSBBVURJT19BQk9SVF9HRVRfRVZFTlQgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTQsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fUkVHSVNURVJfUE1FTSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19ERVJFR0lTVEVSX1BNRU0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fQVNZTkNfV1JJVEUgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTcsIFwKKwkJc3RydWN0IG1zbV9hdWRpb19haW9fYnVmKQorI2RlZmluZSBBVURJT19BU1lOQ19SRUFEIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDE4LCBcCisJCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZikKKyNkZWZpbmUgQVVESU9fU0VUX0lOQ0FMTCBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxOSwgc3RydWN0IG1zbV92b2ljZXJlY19tb2RlKQorI2RlZmluZSBBVURJT19HRVRfTlVNX1NORF9ERVZJQ0UgX0lPUihBVURJT19JT0NUTF9NQUdJQywgMjAsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fR0VUX1NORF9ERVZJQ0VTIF9JT1dSKEFVRElPX0lPQ1RMX01BR0lDLCAyMSwgXAorCQkJCXN0cnVjdCBtc21fc25kX2RldmljZV9saXN0KQorI2RlZmluZSBBVURJT19FTkFCTEVfU05EX0RFVklDRSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAyMiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19ESVNBQkxFX1NORF9ERVZJQ0UgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMjMsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fUk9VVEVfU1RSRUFNIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDI0LCBcCisJCQkJc3RydWN0IG1zbV9hdWRpb19yb3V0ZV9jb25maWcpCisjZGVmaW5lIEFVRElPX0dFVF9QQ01fQ09ORklHIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDMwLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9QQ01fQ09ORklHIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDMxLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NXSVRDSF9ERVZJQ0UgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDMyLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9NVVRFICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDMzLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1VQREFURV9BQ0RCICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDM0LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NUQVJUX1ZPSUNFICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDM1LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NUT1BfVk9JQ0UgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDM2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1JFSU5JVF9BQ0RCICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDM5LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX09VVFBPUlRfRkxVU0ggIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDQwLCB1bnNpZ25lZCBzaG9ydCkKKyNkZWZpbmUgQVVESU9fU0VUX0VSUl9USFJFU0hPTERfVkFMVUUgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgNDEsIFwKKwkJCQkJdW5zaWduZWQgc2hvcnQpCisjZGVmaW5lIEFVRElPX0dFVF9CSVRTVFJFQU1fRVJST1JfSU5GTyBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA0MiwgXAorCQkJICAgICAgIHN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8pCisKKyNkZWZpbmUgQVVESU9fU0VUX1NSU19UUlVNRURJQV9QQVJBTSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA0MywgdW5zaWduZWQgaW50KQorCisvKiBRdWFsY29tbSB0ZWNobm9sb2dpZXMgaW5jIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgQVVESU9fU0VUX1NUUkVBTV9DT05GSUcgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4MCwgXAorCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykKKyNkZWZpbmUgQVVESU9fR0VUX1NUUkVBTV9DT05GSUcgICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA4MSwgXAorCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykKKyNkZWZpbmUgQVVESU9fR0VUX1NFU1NJT05fSUQgX0lPUihBVURJT19JT0NUTF9NQUdJQywgODIsIHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBBVURJT19HRVRfU1RSRUFNX0lORk8gICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA4MywgXAorCQkJICAgICAgIHN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8pCisjZGVmaW5lIEFVRElPX1NFVF9QQU4gICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgODQsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fU0VUX1FDT05DRVJUX1BMVVMgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgODUsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fU0VUX01CQURSQyAgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4NiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19TRVRfVk9MVU1FX1BBVEggICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4NywgXAorCQkJCSAgICAgc3RydWN0IG1zbV92b2xfaW5mbykKKyNkZWZpbmUgQVVESU9fU0VUX01BWF9WT0xfQUxMIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDg4LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX0VOQUJMRV9BVURQUkUgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDg5LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9BR0MgICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDkwLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9OUyAgICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDkxLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9UWF9JSVIgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDkyLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX0dFVF9CVUZfQ0ZHICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDkzLCBcCisJCQkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZykKKyNkZWZpbmUgQVVESU9fU0VUX0JVRl9DRkcgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTQsIFwKKwkJCQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnKQorI2RlZmluZSBBVURJT19TRVRfQUNEQl9CTEsgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTUsICBcCisJCQkJCXN0cnVjdCBtc21fYWNkYl9jbWRfZGV2aWNlKQorI2RlZmluZSBBVURJT19HRVRfQUNEQl9CTEsgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTYsICBcCisJCQkJCXN0cnVjdCBtc21fYWNkYl9jbWRfZGV2aWNlKQorCisjZGVmaW5lIEFVRElPX1JFR0lTVEVSX0lPTiBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5NywgXAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvKQorI2RlZmluZSBBVURJT19ERVJFR0lTVEVSX0lPTiBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5OCwgXAorCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvKQorI2RlZmluZSBBVURJT19TRVRfRUZGRUNUU19DT05GSUcgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5OSwgXAorCQkJCXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWcpCisjZGVmaW5lIEFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU4gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTAwLCBcCisJCQkJc3RydWN0IG1zbV9od2FjY19idWZfY2ZnKQorI2RlZmluZSBBVURJT19FRkZFQ1RTX0dFVF9CVUZfQVZBSUwgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTAxLCBcCisJCQkJc3RydWN0IG1zbV9od2FjY19idWZfYXZhaWwpCisjZGVmaW5lIEFVRElPX0VGRkVDVFNfV1JJVEUgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTAyLCB2b2lkICopCisjZGVmaW5lIEFVRElPX0VGRkVDVFNfUkVBRCBfSU9XUihBVURJT19JT0NUTF9NQUdJQywgMTAzLCB2b2lkICopCisjZGVmaW5lIEFVRElPX0VGRkVDVFNfU0VUX1BQX1BBUkFNUyBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDQsIHZvaWQgKikKKworI2RlZmluZSBBVURJT19QTV9BV0FLRSAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBBVURJT19QTV9SRUxBWCAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwNiwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lCUFVRElPX01BWF9DT01NT05fSU9DVExfTlVNCTEwNworCisKKyNkZWZpbmUgSEFORFNFVF9NSUMJCQkweDAxCisjZGVmaW5lIEhBTkRTRVRfU1BLUgkJCTB4MDIKKyNkZWZpbmUgSEVBRFNFVF9NSUMJCQkweDAzCisjZGVmaW5lIEhFQURTRVRfU1BLUl9NT05PCQkweDA0CisjZGVmaW5lIEhFQURTRVRfU1BLUl9TVEVSRU8JCTB4MDUKKyNkZWZpbmUgU1BLUl9QSE9ORV9NSUMJCQkweDA2CisjZGVmaW5lIFNQS1JfUEhPTkVfTU9OTwkJCTB4MDcKKyNkZWZpbmUgU1BLUl9QSE9ORV9TVEVSRU8JCTB4MDgKKyNkZWZpbmUgQlRfU0NPX01JQwkJCTB4MDkKKyNkZWZpbmUgQlRfU0NPX1NQS1IJCQkweDBBCisjZGVmaW5lIEJUX0EyRFBfU1BLUgkJCTB4MEIKKyNkZWZpbmUgVFRZX0hFQURTRVRfTUlDCQkJMHgwQworI2RlZmluZSBUVFlfSEVBRFNFVF9TUEtSCQkweDBECisKKy8qIERlZmF1bHQgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhICovCisvKiBkZXZpY2Ugc3dpdGNoaW5nIGNvbnRleHQuIE9ubHkgc3VwcG9ydGVkICovCisvKiBmb3Igc3RyZWFtIGRldmljZXMuICovCisvKiBETyBOT1QgVVNFICovCisjZGVmaW5lIERFRkFVTFRfVFgJCQkweDBFCisjZGVmaW5lIERFRkFVTFRfUlgJCQkweDBGCisKKyNkZWZpbmUgQlRfQTJEUF9UWAkJCTB4MTAKKworI2RlZmluZSBIRUFEU0VUX01PTk9fUExVU19TUEtSX01PTk9fUlggICAgICAgICAweDExCisjZGVmaW5lIEhFQURTRVRfTU9OT19QTFVTX1NQS1JfU1RFUkVPX1JYICAgICAgIDB4MTIKKyNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUExVU19TUEtSX01PTk9fUlggICAgICAgMHgxMworI2RlZmluZSBIRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfU1RFUkVPX1JYICAgICAweDE0CisKKyNkZWZpbmUgSTJTX1JYCQkJCTB4MjAKKyNkZWZpbmUgSTJTX1RYCQkJCTB4MjEKKworI2RlZmluZSBBRFJDX0VOQUJMRQkJMHgwMDAxCisjZGVmaW5lIEVRVUFMSVpFUl9FTkFCTEUJMHgwMDAyCisjZGVmaW5lIElJUl9FTkFCTEUJCTB4MDAwNAorI2RlZmluZSBRQ09OQ0VSVF9QTFVTX0VOQUJMRQkweDAwMDgKKyNkZWZpbmUgTUJBRFJDX0VOQUJMRQkJMHgwMDEwCisjZGVmaW5lIFNSU19FTkFCTEUJCTB4MDAyMAorI2RlZmluZSBTUlNfRElTQUJMRQkweDAwNDAKKworI2RlZmluZSBBR0NfRU5BQkxFCQkweDAwMDEKKyNkZWZpbmUgTlNfRU5BQkxFCQkweDAwMDIKKyNkZWZpbmUgVFhfSUlSX0VOQUJMRQkJMHgwMDA0CisjZGVmaW5lIEZMVUVOQ0VfRU5BQkxFCQkweDAwMDgKKworI2RlZmluZSBWT0NfUkVDX1VQTElOSwkJMHgwMAorI2RlZmluZSBWT0NfUkVDX0RPV05MSU5LCTB4MDEKKyNkZWZpbmUgVk9DX1JFQ19CT1RICQkweDAyCisKK3N0cnVjdCBtc21fYXVkaW9fY29uZmlnIHsKKwl1aW50MzJfdCBidWZmZXJfc2l6ZTsKKwl1aW50MzJfdCBidWZmZXJfY291bnQ7CisJdWludDMyX3QgY2hhbm5lbF9jb3VudDsKKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKwl1aW50MzJfdCB0eXBlOworCXVpbnQzMl90IG1ldGFfZmllbGQ7CisJdWludDMyX3QgYml0czsKKwl1aW50MzJfdCB1bnVzZWRbM107Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgeworCXVpbnQzMl90IGJ1ZmZlcl9zaXplOworCXVpbnQzMl90IGJ1ZmZlcl9jb3VudDsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fYnVmX2NmZyB7CisJdWludDMyX3QgbWV0YV9pbmZvX2VuYWJsZTsKKwl1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZjsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fc3RhdHMgeworCXVpbnQzMl90IGJ5dGVfY291bnQ7CisJdWludDMyX3Qgc2FtcGxlX2NvdW50OworCXVpbnQzMl90IHVudXNlZFsyXTsKK307CisKK3N0cnVjdCBtc21fYXVkaW9faW9uX2luZm8geworCWludCBmZDsKKwl2b2lkICp2YWRkcjsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fcG1lbV9pbmZvIHsKKwlpbnQgZmQ7CisJdm9pZCAqdmFkZHI7Cit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYgeworCXZvaWQgKmJ1Zl9hZGRyOworCXVpbnQzMl90IGJ1Zl9sZW47CisJdWludDMyX3QgZGF0YV9sZW47CisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLworfTsKKworLyogQXVkaW8gcm91dGluZyAqLworCisjZGVmaW5lIFNORF9JT0NUTF9NQUdJQyAncycKKworI2RlZmluZSBTTkRfTVVURV9VTk1VVEVEIDAKKyNkZWZpbmUgU05EX01VVEVfTVVURUQgICAxCisKK3N0cnVjdCBtc21fbXV0ZV9pbmZvIHsKKwl1aW50MzJfdCBtdXRlOworCXVpbnQzMl90IHBhdGg7Cit9OworCitzdHJ1Y3QgbXNtX3ZvbF9pbmZvIHsKKwl1aW50MzJfdCB2b2w7CisJdWludDMyX3QgcGF0aDsKK307CisKK3N0cnVjdCBtc21fdm9pY2VyZWNfbW9kZSB7CisJdWludDMyX3QgcmVjX21vZGU7Cit9OworCitzdHJ1Y3QgbXNtX3NuZF9kZXZpY2VfY29uZmlnIHsKKwl1aW50MzJfdCBkZXZpY2U7CisJdWludDMyX3QgZWFyX211dGU7CisJdWludDMyX3QgbWljX211dGU7Cit9OworCisjZGVmaW5lIFNORF9TRVRfREVWSUNFIF9JT1coU05EX0lPQ1RMX01BR0lDLCAyLCBzdHJ1Y3QgbXNtX2RldmljZV9jb25maWcgKikKKworZW51bSBjYWRfZGV2aWNlX3BhdGhfdHlwZSB7CisJQ0FEX0RFVklDRV9QQVRIX1JYLAkvKkZvciBEZWNvZGluZyBzZXNzaW9uKi8KKwlDQURfREVWSUNFX1BBVEhfVFgsCS8qIEZvciBFbmNvZGluZyBzZXNzaW9uKi8KKwlDQURfREVWSUNFX1BBVEhfUlhfVFgsIC8qIEZvciBWb2ljZSBjYWxsICovCisJQ0FEX0RFVklDRV9QQVRIX0xCLAkvKiBGb3IgbG9vcGJhY2sgKEZNIEFuYWxvZykqLworCUNBRF9ERVZJQ0VfUEFUSF9NQVgKK307CisKK3N0cnVjdCBjYWRfZGV2aWNlc190eXBlIHsKKwl1aW50MzJfdCByeF9kZXZpY2U7CisJdWludDMyX3QgdHhfZGV2aWNlOworCWVudW0gY2FkX2RldmljZV9wYXRoX3R5cGUgcGF0aHR5cGU7Cit9OworCitzdHJ1Y3QgbXNtX2NhZF9kZXZpY2VfY29uZmlnIHsKKwlzdHJ1Y3QgY2FkX2RldmljZXNfdHlwZSBkZXZpY2U7CisJdWludDMyX3QgZWFyX211dGU7CisJdWludDMyX3QgbWljX211dGU7Cit9OworCisjZGVmaW5lIENBRF9TRVRfREVWSUNFIF9JT1coU05EX0lPQ1RMX01BR0lDLCAyLCBzdHJ1Y3QgbXNtX2NhZF9kZXZpY2VfY29uZmlnICopCisKKyNkZWZpbmUgU05EX01FVEhPRF9WT0lDRSAwCisjZGVmaW5lIFNORF9NRVRIT0RfTUlESSA0CisKK3N0cnVjdCBtc21fc25kX3ZvbHVtZV9jb25maWcgeworCXVpbnQzMl90IGRldmljZTsKKwl1aW50MzJfdCBtZXRob2Q7CisJdWludDMyX3Qgdm9sdW1lOworfTsKKworI2RlZmluZSBTTkRfU0VUX1ZPTFVNRSBfSU9XKFNORF9JT0NUTF9NQUdJQywgMywgc3RydWN0IG1zbV9zbmRfdm9sdW1lX2NvbmZpZyAqKQorCitzdHJ1Y3QgbXNtX2NhZF92b2x1bWVfY29uZmlnIHsKKwlzdHJ1Y3QgY2FkX2RldmljZXNfdHlwZSBkZXZpY2U7CisJdWludDMyX3QgbWV0aG9kOworCXVpbnQzMl90IHZvbHVtZTsKK307CisKKyNkZWZpbmUgQ0FEX1NFVF9WT0xVTUUgX0lPVyhTTkRfSU9DVExfTUFHSUMsIDMsIHN0cnVjdCBtc21fY2FkX3ZvbHVtZV9jb25maWcgKikKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFNORCBlbmRwb2ludHMgc3VwcG9ydGVkLiAqLworCisjZGVmaW5lIFNORF9HRVRfTlVNX0VORFBPSU5UUyBfSU9SKFNORF9JT0NUTF9NQUdJQywgNCwgdW5zaWduZWQgaW50ICopCisKK3N0cnVjdCBtc21fc25kX2VuZHBvaW50IHsKKwlpbnQgaWQ7IC8qIGlucHV0IGFuZCBvdXRwdXQgKi8KKwljaGFyIG5hbWVbNjRdOyAvKiBvdXRwdXQgb25seSAqLworfTsKKworLyogVGFrZXMgYW4gaW5kZXggYmV0d2VlbiAwIGFuZCBvbmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkKKyAqIFNORF9HRVRfTlVNX0VORFBPSU5UUywgYW5kIHJldHVybnMgdGhlIFNORCBpbmRleCBhbmQgbmFtZSBvZiBhCisgKiBTTkQgZW5kcG9pbnQuICBPbiBpbnB1dCwgdGhlIC5pZCBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZQorICogZW5kcG9pbnQsIGFuZCBvbiBleGl0IGl0IGNvbnRhaW5zIHRoZSBTTkQgaW5kZXgsIHdoaWxlIC5uYW1lIGNvbnRhaW5zCisgKiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LgorICovCisKKyNkZWZpbmUgU05EX0dFVF9FTkRQT0lOVCBfSU9XUihTTkRfSU9DVExfTUFHSUMsIDUsIHN0cnVjdCBtc21fc25kX2VuZHBvaW50ICopCisKKworI2RlZmluZSBTTkRfQVZDX0NUTCBfSU9XKFNORF9JT0NUTF9NQUdJQywgNiwgdW5zaWduZWQgaW50ICopCisjZGVmaW5lIFNORF9BR0NfQ1RMIF9JT1coU05EX0lPQ1RMX01BR0lDLCA3LCB1bnNpZ25lZCBpbnQgKikKKworLypyZXR1cm4gdGhlIG51bWJlciBvZiBDQUQgZW5kcG9pbnRzIHN1cHBvcnRlZC4gKi8KKworI2RlZmluZSBDQURfR0VUX05VTV9FTkRQT0lOVFMgX0lPUihTTkRfSU9DVExfTUFHSUMsIDQsIHVuc2lnbmVkIGludCAqKQorCitzdHJ1Y3QgbXNtX2NhZF9lbmRwb2ludCB7CisJaW50IGlkOyAvKiBpbnB1dCBhbmQgb3V0cHV0ICovCisJY2hhciBuYW1lWzY0XTsgLyogb3V0cHV0IG9ubHkgKi8KK307CisKKy8qIFRha2VzIGFuIGluZGV4IGJldHdlZW4gMCBhbmQgb25lIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgKiBTTkRfR0VUX05VTV9FTkRQT0lOVFMsIGFuZCByZXR1cm5zIHRoZSBDQUQgaW5kZXggYW5kIG5hbWUgb2YgYQorICogQ0FEIGVuZHBvaW50LiAgT24gaW5wdXQsIHRoZSAuaWQgZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUKKyAqIGVuZHBvaW50LCBhbmQgb24gZXhpdCBpdCBjb250YWlucyB0aGUgU05EIGluZGV4LCB3aGlsZSAubmFtZSBjb250YWlucworICogdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbmRwb2ludC4KKyAqLworCisjZGVmaW5lIENBRF9HRVRfRU5EUE9JTlQgX0lPV1IoU05EX0lPQ1RMX01BR0lDLCA1LCBzdHJ1Y3QgbXNtX2NhZF9lbmRwb2ludCAqKQorCitzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgeworCXVpbnQzMl90IHBjbV9mZWVkYmFjazsJLyogMCAtIGRpc2FibGUgPiAwIC0gZW5hYmxlICovCisJdWludDMyX3QgYnVmZmVyX2NvdW50OwkvKiBOdW1iZXIgb2YgYnVmZmVycyB0byBhbGxvY2F0ZSAqLworCXVpbnQzMl90IGJ1ZmZlcl9zaXplOwkvKiBTaXplIG9mIGJ1ZmZlciBmb3IgY2FwdHVyaW5nIG9mCisJCQkJICogUENNIHNhbXBsZXMKKwkJCQkgKi8KK307CisKKyNkZWZpbmUgQVVESU9fRVZFTlRfU1VTUEVORCAwCisjZGVmaW5lIEFVRElPX0VWRU5UX1JFU1VNRSAxCisjZGVmaW5lIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUgMgorI2RlZmluZSBBVURJT19FVkVOVF9SRUFEX0RPTkUgICAzCisjZGVmaW5lIEFVRElPX0VWRU5UX1NUUkVBTV9JTkZPIDQKKyNkZWZpbmUgQVVESU9fRVZFTlRfQklUU1RSRUFNX0VSUk9SX0lORk8gNQorCisjZGVmaW5lIEFVRElPX0NPREVDX1RZUEVfTVAzIDAKKyNkZWZpbmUgQVVESU9fQ09ERUNfVFlQRV9BQUMgMQorCitzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvIHsKKwl1aW50MzJfdCBjb2RlY190eXBlOworCXVpbnQzMl90IGNoYW5faW5mbzsKKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKwl1aW50MzJfdCBiaXRfc3RyZWFtX2luZm87CisJdWludDMyX3QgYml0X3JhdGU7CisJdWludDMyX3QgdW51c2VkWzNdOworfTsKKworc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1fZXJyb3JfaW5mbyB7CisJdWludDMyX3QgZGVjX2lkOworCXVpbnQzMl90IGVycl9tc2dfaW5kaWNhdG9yOworCXVpbnQzMl90IGVycl90eXBlOworfTsKKwordW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgeworCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZiBhaW9fYnVmOworCXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1fZXJyb3JfaW5mbyBlcnJvcl9pbmZvOworCWludCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fZXZlbnQgeworCWludCBldmVudF90eXBlOworCWludCB0aW1lb3V0X21zOworCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIGV2ZW50X3BheWxvYWQ7Cit9OworCisjZGVmaW5lIE1TTV9TTkRERVZfQ0FQX1JYIDB4MQorI2RlZmluZSBNU01fU05EREVWX0NBUF9UWCAweDIKKyNkZWZpbmUgTVNNX1NORERFVl9DQVBfVk9JQ0UgMHg0CisKK3N0cnVjdCBtc21fc25kX2RldmljZV9pbmZvIHsKKwl1aW50MzJfdCBkZXZfaWQ7CisJdWludDMyX3QgZGV2X2NhcDsgLyogYml0bWFzayBkZXNjcmliZSBjYXBhYmlsaXR5IG9mIGRldmljZSAqLworCWNoYXIgZGV2X25hbWVbNjRdOworfTsKKworc3RydWN0IG1zbV9zbmRfZGV2aWNlX2xpc3QgeworCXVpbnQzMl90ICBudW1fZGV2OyAvKiBJbmRpY2F0ZSBudW1iZXIgb2YgZGV2aWNlIGluZm8gdG8gYmUgcmV0cmlldmVkICovCisJc3RydWN0IG1zbV9zbmRfZGV2aWNlX2luZm8gKmxpc3Q7Cit9OworCitzdHJ1Y3QgbXNtX2R0bWZfY29uZmlnIHsKKwl1aW50MTZfdCBwYXRoOworCXVpbnQxNl90IGR0bWZfaGk7CisJdWludDE2X3QgZHRtZl9sb3c7CisJdWludDE2X3QgZHVyYXRpb247CisJdWludDE2X3QgdHhfZ2FpbjsKKwl1aW50MTZfdCByeF9nYWluOworCXVpbnQxNl90IG1peGluZzsKK307CisKKyNkZWZpbmUgQVVESU9fUk9VVEVfU1RSRUFNX1ZPSUNFX1JYIDAKKyNkZWZpbmUgQVVESU9fUk9VVEVfU1RSRUFNX1ZPSUNFX1RYIDEKKyNkZWZpbmUgQVVESU9fUk9VVEVfU1RSRUFNX1BMQVlCQUNLIDIKKyNkZWZpbmUgQVVESU9fUk9VVEVfU1RSRUFNX1JFQyAgICAgIDMKKworc3RydWN0IG1zbV9hdWRpb19yb3V0ZV9jb25maWcgeworCXVpbnQzMl90IHN0cmVhbV90eXBlOworCXVpbnQzMl90IHN0cmVhbV9pZDsKKwl1aW50MzJfdCBkZXZfaWQ7Cit9OworCisjZGVmaW5lIEFVRElPX01BWF9FUV9CQU5EUyAxMgorCitzdHJ1Y3QgbXNtX2F1ZGlvX2VxX2JhbmQgeworCXVpbnQxNl90ICAgICBiYW5kX2lkeDsgLyogVGhlIGJhbmQgaW5kZXgsIDAgLi4gMTEgKi8KKwl1aW50MzJfdCAgICAgZmlsdGVyX3R5cGU7IC8qIEZpbHRlciBiYW5kIHR5cGUgKi8KKwl1aW50MzJfdCAgICAgY2VudGVyX2ZyZXFfaHo7IC8qIEZpbHRlciBiYW5kIGNlbnRlciBmcmVxdWVuY3kgKi8KKwl1aW50MzJfdCAgICAgZmlsdGVyX2dhaW47IC8qIEZpbHRlciBiYW5kIGluaXRpYWwgZ2FpbiAoZEIpICovCisJCQkvKiBSYW5nZSBpcyArMTIgZEIgdG8gLTEyIGRCIHdpdGggMWRCIGluY3JlbWVudHMuICovCisJdWludDMyX3QgICAgIHFfZmFjdG9yOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtc21fYXVkaW9fZXFfc3RyZWFtX2NvbmZpZyB7CisJdWludDMyX3QJZW5hYmxlOyAvKiBOdW1iZXIgb2YgY29uc2VxdXRpdmUgYmFuZHMgc3BlY2lmaWVkICovCisJdWludDMyX3QJbnVtX2JhbmRzOworCXN0cnVjdCBtc21fYXVkaW9fZXFfYmFuZAllcV9iYW5kc1tBVURJT19NQVhfRVFfQkFORFNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtc21fYWNkYl9jbWRfZGV2aWNlIHsKKwl1aW50MzJfdCAgICAgY29tbWFuZF9pZDsKKwl1aW50MzJfdCAgICAgZGV2aWNlX2lkOworCXVpbnQzMl90ICAgICBuZXR3b3JrX2lkOworCXVpbnQzMl90ICAgICBzYW1wbGVfcmF0ZV9pZDsgICAgICAvKiBBY3R1YWwgc2FtcGxlIHJhdGUgdmFsdWUgKi8KKwl1aW50MzJfdCAgICAgaW50ZXJmYWNlX2lkOyAgICAgICAgLyogU2VlIGludGVyZmFjZSBpZCdzIGFib3ZlICovCisJdWludDMyX3QgICAgIGFsZ29yaXRobV9ibG9ja19pZDsgIC8qIFNlZSBlbnVtZXJhdGlvbnMgYWJvdmUgKi8KKwl1aW50MzJfdCAgICAgdG90YWxfYnl0ZXM7ICAgICAgICAgLyogTGVuZ3RoIGluIGJ5dGVzIHVzZWQgYnkgYnVmZmVyICovCisJdWludDMyX3QgICAgICpwaHlzX2J1ZjsgICAgICAgICAgIC8qIFBoeXNpY2FsIEFkZHJlc3Mgb2YgZGF0YSAqLworfTsKKworc3RydWN0IG1zbV9od2FjY19kYXRhX2NvbmZpZyB7CisJX191MzIgYnVmX3NpemU7CisJX191MzIgbnVtX2J1ZjsKKwlfX3UzMiBudW1fY2hhbm5lbHM7CisJX191OCBjaGFubmVsX21hcFs4XTsKKwlfX3UzMiBzYW1wbGVfcmF0ZTsKKwlfX3UzMiBiaXRzX3Blcl9zYW1wbGU7Cit9OworCitzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9jZmcgeworCV9fdTMyIGlucHV0X2xlbjsKKwlfX3UzMiBvdXRwdXRfbGVuOworfTsKKworc3RydWN0IG1zbV9od2FjY19idWZfYXZhaWwgeworCV9fdTMyIGlucHV0X251bV9hdmFpbDsKKwlfX3UzMiBvdXRwdXRfbnVtX2F2YWlsOworfTsKKworc3RydWN0IG1zbV9od2FjY19lZmZlY3RzX2NvbmZpZyB7CisJc3RydWN0IG1zbV9od2FjY19kYXRhX2NvbmZpZyBpbnB1dDsKKwlzdHJ1Y3QgbXNtX2h3YWNjX2RhdGFfY29uZmlnIG91dHB1dDsKKwlzdHJ1Y3QgbXNtX2h3YWNjX2J1Zl9jZmcgYnVmX2NmZzsKKwlfX3UzMiBtZXRhX21vZGVfZW5hYmxlZDsKKwlfX3UzMiBvdmVyd3JpdGVfdG9wb2xvZ3k7CisJX19zMzIgdG9wb2xvZ3k7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYWFjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMWUxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FhYy5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FBQ19ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19BQUNfSAorCisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+CisKKyNkZWZpbmUgQVVESU9fU0VUX0FBQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykKKyNkZWZpbmUgQVVESU9fR0VUX0FBQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykKKworI2RlZmluZSBBVURJT19TRVRfQUFDX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMyksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcpCisKKyNkZWZpbmUgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzQpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnKQorCisjZGVmaW5lIEFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSs1KSwgdWludDMyX3QpCisKKyNkZWZpbmUgQVVESU9fQUFDX0ZPUk1BVF9BRFRTCQktMQorI2RlZmluZQlBVURJT19BQUNfRk9STUFUX1JBVwkJMHgwMDAwCisjZGVmaW5lCUFVRElPX0FBQ19GT1JNQVRfUFNVRURPX1JBVwkweDAwMDEKKyNkZWZpbmUgQVVESU9fQUFDX0ZPUk1BVF9MT0FTCQkweDAwMDIKKyNkZWZpbmUgQVVESU9fQUFDX0ZPUk1BVF9BRElGCQkweDAwMDMKKworI2RlZmluZSBBVURJT19BQUNfT0JKRUNUX0xDCQkweDAwMDIKKyNkZWZpbmUgQVVESU9fQUFDX09CSkVDVF9MVFAJCTB4MDAwNAorI2RlZmluZSBBVURJT19BQUNfT0JKRUNUX0VSTEMJCTB4MDAxMQorI2RlZmluZSBBVURJT19BQUNfT0JKRUNUX0JTQUMJCTB4MDAxNgorCisjZGVmaW5lIEFVRElPX0FBQ19TRUNfREFUQV9SRVNfT04gICAgICAgMHgwMDAxCisjZGVmaW5lIEFVRElPX0FBQ19TRUNfREFUQV9SRVNfT0ZGICAgICAgMHgwMDAwCisKKyNkZWZpbmUgQVVESU9fQUFDX1NDQV9EQVRBX1JFU19PTiAgICAgICAweDAwMDEKKyNkZWZpbmUgQVVESU9fQUFDX1NDQV9EQVRBX1JFU19PRkYgICAgICAweDAwMDAKKworI2RlZmluZSBBVURJT19BQUNfU1BFQ19EQVRBX1JFU19PTiAgICAgIDB4MDAwMQorI2RlZmluZSBBVURJT19BQUNfU1BFQ19EQVRBX1JFU19PRkYgICAgIDB4MDAwMAorCisjZGVmaW5lIEFVRElPX0FBQ19TQlJfT05fRkxBR19PTgkweDAwMDEKKyNkZWZpbmUgQVVESU9fQUFDX1NCUl9PTl9GTEFHX09GRgkweDAwMDAKKworI2RlZmluZSBBVURJT19BQUNfU0JSX1BTX09OX0ZMQUdfT04JMHgwMDAxCisjZGVmaW5lIEFVRElPX0FBQ19TQlJfUFNfT05fRkxBR19PRkYJMHgwMDAwCisKKy8qIFByaW1hcnkgY2hhbm5lbCBvbiBib3RoIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisjZGVmaW5lIEFVRElPX0FBQ19EVUFMX01PTk9fUExfUFIgIDAKKy8qIFNlY29uZGFyeSBjaGFubmVsIG9uIGJvdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9TUiAgMQorLyogUHJpbWFyeSBjaGFubmVsIG9uIHJpZ2h0IGNoYW5uZWwgYW5kIDJuZCBvbiBsZWZ0IGNoYW5uZWwgKi8KKyNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9QUiAgMgorLyogMm5kIGNoYW5uZWwgb24gcmlnaHQgY2hhbm5lbCBhbmQgcHJpbWFyeSBvbiBsZWZ0IGNoYW5uZWwgKi8KKyNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUiAgMworCitzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgeworCXNpZ25lZCBzaG9ydCBmb3JtYXQ7CisJdW5zaWduZWQgc2hvcnQgYXVkaW9fb2JqZWN0OworCXVuc2lnbmVkIHNob3J0IGVwX2NvbmZpZzsJLyogMCB+IDMgdXNlZnVsIG9ubHkgb2JqID0gRVJMQyAqLworCXVuc2lnbmVkIHNob3J0IGFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOworCXVuc2lnbmVkIHNob3J0IGFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBhYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgc2JyX29uX2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgc2JyX3BzX29uX2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgZHVhbF9tb25vX21vZGU7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbF9jb25maWd1cmF0aW9uOworCXVuc2lnbmVkIHNob3J0IHNhbXBsZV9yYXRlOworfTsKKworc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyB7CisJdWludDMyX3QgY2hhbm5lbHM7CisJdWludDMyX3Qgc2FtcGxlX3JhdGU7CisJdWludDMyX3QgYml0X3JhdGU7CisJdWludDMyX3Qgc3RyZWFtX2Zvcm1hdDsKK307CisKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fQUFDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYWMzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FjMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FjMy5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FDM19ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19BQzNfSAorCisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+CisKKyNkZWZpbmUgQVVESU9fU0VUX0FDM19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fR0VUX0FDM19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHVuc2lnbmVkIGludCkKKworI2RlZmluZSBBVURBQzNfREVGX1dPUkRTSVpFIDAKKyNkZWZpbmUgQVVEQUMzX0RFRl9VU0VSX0RPV05NSVhfRkxBRyAweDAKKyNkZWZpbmUgQVVEQUMzX0RFRl9VU0VSX0tBUkFPS0VfRkxBRyAweDAKKyNkZWZpbmUgQVVEQUMzX0RFRl9FUlJPUl9DT05DRUFMTUVOVCAwCisjZGVmaW5lIEFVREFDM19ERUZfTUFYX1JFUEVBVF9DT1VOVCAgMAorCitzdHJ1Y3QgbXNtX2F1ZGlvX2FjM19jb25maWcgeworCXVuc2lnbmVkIHNob3J0CQludW1DaGFuczsKKwl1bnNpZ25lZCBzaG9ydAkJd29yZFNpemU7CisJdW5zaWduZWQgc2hvcnQJCWtDYXBhYmxlTW9kZTsKKwl1bnNpZ25lZCBzaG9ydAkJY29tcE1vZGU7CisJdW5zaWduZWQgc2hvcnQJCW91dExmZU9uOworCXVuc2lnbmVkIHNob3J0CQlvdXRwdXRNb2RlOworCXVuc2lnbmVkIHNob3J0CQlzdGVyZW9Nb2RlOworCXVuc2lnbmVkIHNob3J0CQlkdWFsTW9ub01vZGU7CisJdW5zaWduZWQgc2hvcnQJCWZzQ29kOworCXVuc2lnbmVkIHNob3J0CQlwY21TY2FsZUZhYzsKKwl1bnNpZ25lZCBzaG9ydAkJZHluUm5nU2NhbGVIaTsKKwl1bnNpZ25lZCBzaG9ydAkJZHluUm5nU2NhbGVMb3c7CisJdW5zaWduZWQgc2hvcnQJCXVzZXJfZG93bm1peF9mbGFnOworCXVuc2lnbmVkIHNob3J0CQl1c2VyX2thcmFva2VfZmxhZzsKKwl1bnNpZ25lZCBzaG9ydAkJZG1fYWRkcmVzc19oaWdoOworCXVuc2lnbmVkIHNob3J0CQlkbV9hZGRyZXNzX2xvdzsKKwl1bnNpZ25lZCBzaG9ydAkJa29fYWRkcmVzc19oaWdoOworCXVuc2lnbmVkIHNob3J0CQlrb19hZGRyZXNzX2xvdzsKKwl1bnNpZ25lZCBzaG9ydAkJZXJyb3JfY29uY2VhbG1lbnQ7CisJdW5zaWduZWQgc2hvcnQJCW1heF9yZXBfY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCWNoYW5uZWxfcm91dGluZ19tb2RlWzZdOworfTsKKworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BQzNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbGFjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FsYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc2ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbGFjLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fQUxBQ19ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19BTEFDX0gKKworI2RlZmluZSBBVURJT19HRVRfQUxBQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZykKKyNkZWZpbmUgQVVESU9fU0VUX0FMQUNfQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWcpCisKK3N0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWcgeworCXVpbnQzMl90IGZyYW1lTGVuZ3RoOworCXVpbnQ4X3QgY29tcGF0VmVyc2lvbjsKKwl1aW50OF90IGJpdERlcHRoOworCXVpbnQ4X3QgcGI7IC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KKwl1aW50OF90IG1iOyAvKiBjdXJyZW50bHkgdW51c2VkICovCisJdWludDhfdCBrYjsgLyogY3VycmVudGx5IHVudXNlZCAqLworCXVpbnQ4X3QgY2hhbm5lbENvdW50OworCXVpbnQxNl90IG1heFJ1bjsgLyogY3VycmVudGx5IHVudXNlZCAqLworCXVpbnQzMl90IG1heFNpemU7CisJdWludDMyX3QgYXZlcmFnZUJpdFJhdGU7CisJdWludDMyX3Qgc2FtcGxlUmF0ZTsKKwl1aW50MzJfdCBjaGFubmVsTGF5b3V0OworfTsKKworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BTEFDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1ybmIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1ybmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTlmOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbXJuYi5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FNUk5CX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FNUk5CX0gKKworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorCisjZGVmaW5lIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHX1YyICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzIpLCBcCisJc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyKQorI2RlZmluZSBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMiAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgXAorCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MikKKworc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnIHsKKwl1bnNpZ25lZCBzaG9ydCB2b2ljZW1lbW9lbmN3ZWlnaHQxOworCXVuc2lnbmVkIHNob3J0IHZvaWNlbWVtb2VuY3dlaWdodDI7CisJdW5zaWduZWQgc2hvcnQgdm9pY2VtZW1vZW5jd2VpZ2h0MzsKKwl1bnNpZ25lZCBzaG9ydCB2b2ljZW1lbW9lbmN3ZWlnaHQ0OworCXVuc2lnbmVkIHNob3J0IGR0eF9tb2RlX2VuYWJsZTsgLyogMHhGRkZGIC0gZW5hYmxlLCAwLSBkaXNhYmxlICovCisJdW5zaWduZWQgc2hvcnQgdGVzdF9tb2RlX2VuYWJsZTsgLyogMHhGRkZGIC0gZW5hYmxlLCAwLSBkaXNhYmxlICovCisJdW5zaWduZWQgc2hvcnQgZW5jX21vZGU7IC8qIDAtTVI0NzUsMS1NUjUxNSwyLU1SNTksMy1NUjY3LDQtTVI3NAorCQkJCSAgKiA1LU1SNzk1LCA2LSBNUjEwMiwgNy0gTVIxMjIoZGVmYXVsdCkKKwkJCQkgICovCit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgeworCXVpbnQzMl90IGJhbmRfbW9kZTsKKwl1aW50MzJfdCBkdHhfZW5hYmxlOworCXVpbnQzMl90IGZyYW1lX2Zvcm1hdDsKK307CisjZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX0FNUk5CX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2IuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI0MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbXJ3Yi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FNUldCX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FNUldCX0gKKworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorCisjZGVmaW5lIEFVRElPX0dFVF9BTVJXQl9FTkNfQ09ORklHIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIFwKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcpCisjZGVmaW5lIEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBcCisJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnKQorCitzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgeworCXVpbnQzMl90IGJhbmRfbW9kZTsKKwl1aW50MzJfdCBkdHhfZW5hYmxlOworCXVpbnQzMl90IGZyYW1lX2Zvcm1hdDsKK307CisjZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX0FNUldCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2JwbHVzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FtcndicGx1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FtcndicGx1cy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FNUl9XQl9QTFVTX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FNUl9XQl9QTFVTX0gKKworI2RlZmluZSBBVURJT19HRVRfQU1SV0JQTFVTX0NPTkZJR19WMiAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsyKSwgc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyKQorI2RlZmluZSBBVURJT19TRVRfQU1SV0JQTFVTX0NPTkZJR19WMiAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyKQorCitzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgeworCXVuc2lnbmVkIGludCBzaXplX2J5dGVzOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbHM7CisJdW5zaWduZWQgaW50IGFtcl9iYW5kX21vZGU7CisJdW5zaWduZWQgaW50IGFtcl9kdHhfbW9kZTsKKwl1bnNpZ25lZCBpbnQgYW1yX2ZyYW1lX2ZtdDsKKwl1bnNpZ25lZCBpbnQgYW1yX2xzZl9pZHg7Cit9OworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BTVJfV0JfUExVU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FwZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdkM2JjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hcGUuaApAQCAtMCwwICsxLDI2IEBACisvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBoYXMgYmVlbiB0YWtlbgorICogZnJvbSBNb25rZXkncyBBdWRpbyBTREsgd2l0aCBwZXJtaXNzaW9uCisgKi8KKworI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fQVBFX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FQRV9ICisKKyNkZWZpbmUgQVVESU9fR0VUX0FQRV9DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnKQorI2RlZmluZSBBVURJT19TRVRfQVBFX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcpCisKK3N0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyB7CisJdWludDE2X3QgY29tcGF0aWJsZVZlcnNpb247CisJdWludDE2X3QgY29tcHJlc3Npb25MZXZlbDsKKwl1aW50MzJfdCBmb3JtYXRGbGFnczsKKwl1aW50MzJfdCBibG9ja3NQZXJGcmFtZTsKKwl1aW50MzJfdCBmaW5hbEZyYW1lQmxvY2tzOworCXVpbnQzMl90IHRvdGFsRnJhbWVzOworCXVpbnQxNl90IGJpdHNQZXJTYW1wbGU7CisJdWludDE2X3QgbnVtQ2hhbm5lbHM7CisJdWludDMyX3Qgc2FtcGxlUmF0ZTsKKwl1aW50MzJfdCBzZWVrVGFibGVQcmVzZW50OworfTsKKworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYWYzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2NhbGlicmF0aW9uLmgKQEAgLTAsMCArMSw2OTIgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0NBTElCUkFUSU9OX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0NBTElCUkFUSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBDQUxfSU9DVExfTUFHSUMgJ2EnCisKKyNkZWZpbmUgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjAwLCB2b2lkICopCisjZGVmaW5lIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjAxLCB2b2lkICopCisjZGVmaW5lIEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjAyLCB2b2lkICopCisjZGVmaW5lIEFVRElPX1NFVF9DQUxJQlJBVElPTgkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjAzLCB2b2lkICopCisjZGVmaW5lIEFVRElPX0dFVF9DQUxJQlJBVElPTgkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjA0LCB2b2lkICopCisjZGVmaW5lIEFVRElPX1BPU1RfQ0FMSUJSQVRJT04JCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIwNSwgdm9pZCAqKQorCisvKiBGb3IgUmVhbC1UaW1lIEF1ZGlvIENhbGlicmF0aW9uICovCisjZGVmaW5lIEFVRElPX0dFVF9SVEFDX0FETV9JTkZPCQlfSU9SKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIwNywgdm9pZCAqKQorI2RlZmluZSBBVURJT19HRVRfUlRBQ19WT0lDRV9JTkZPCV9JT1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjA4LCB2b2lkICopCisjZGVmaW5lIEFVRElPX0dFVF9SVEFDX0FETV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIwOSwgdm9pZCAqKQorI2RlZmluZSBBVURJT19TRVRfUlRBQ19BRE1fQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMTAsIHZvaWQgKikKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQVNNX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjExLCB2b2lkICopCisjZGVmaW5lIEFVRElPX1NFVF9SVEFDX0FTTV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIxMiwgdm9pZCAqKQorI2RlZmluZSBBVURJT19HRVRfUlRBQ19DVlNfQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMTMsIHZvaWQgKikKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQ1ZTX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjE0LCB2b2lkICopCisjZGVmaW5lIEFVRElPX0dFVF9SVEFDX0NWUF9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIxNSwgdm9pZCAqKQorI2RlZmluZSBBVURJT19TRVRfUlRBQ19DVlBfQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMTYsIHZvaWQgKikKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQUZFX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCisJCQkJCQkJMjE3LCB2b2lkICopCisjZGVmaW5lIEFVRElPX1NFVF9SVEFDX0FGRV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAorCQkJCQkJCTIxOCwgdm9pZCAqKQorZW51bSB7CisJQ1ZQX1ZPQ19SWF9UT1BPTE9HWV9DQUxfVFlQRSA9IDAsCisJQ1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUxfVFlQRSwKKwlDVlBfVk9DUFJPQ19TVEFUSUNfQ0FMX1RZUEUsCisJQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DQUxfVFlQRSwKKwlDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEUsCisJQ1ZQX1ZPQ0RFVl9DRkdfQ0FMX1RZUEUsCisJQ1ZQX1ZPQ1BST0NfU1RBVElDX0NPTF9DQUxfVFlQRSwKKwlDVlBfVk9DUFJPQ19EWU5BTUlDX0NPTF9DQUxfVFlQRSwKKwlDVlNfVk9DU1RSTV9TVEFUSUNfQ09MX0NBTF9UWVBFLAorCisJQURNX1RPUE9MT0dZX0NBTF9UWVBFLAorCUFETV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAorCUFETV9BVURQUk9DX0NBTF9UWVBFLAorCUFETV9BVURWT0xfQ0FMX1RZUEUsCisKKwlBU01fVE9QT0xPR1lfQ0FMX1RZUEUsCisJQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCisJQVNNX0FVRFNUUk1fQ0FMX1RZUEUsCisKKwlBRkVfQ09NTU9OX1JYX0NBTF9UWVBFLAorCUFGRV9DT01NT05fVFhfQ0FMX1RZUEUsCisJQUZFX0FOQ19DQUxfVFlQRSwKKwlBRkVfQUFOQ19DQUxfVFlQRSwKKwlBRkVfRkJfU1BLUl9QUk9UX0NBTF9UWVBFLAorCUFGRV9IV19ERUxBWV9DQUxfVFlQRSwKKwlBRkVfU0lERVRPTkVfQ0FMX1RZUEUsCisJQUZFX1RPUE9MT0dZX0NBTF9UWVBFLAorCUFGRV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAorCisJTFNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCisJTFNNX1RPUE9MT0dZX0NBTF9UWVBFLAorCUxTTV9DQUxfVFlQRSwKKworCUFETV9SVEFDX0lORk9fQ0FMX1RZUEUsCisJVk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFLAorCUFETV9SVEFDX0FQUl9DQUxfVFlQRSwKKwlBU01fUlRBQ19BUFJfQ0FMX1RZUEUsCisJVk9JQ0VfUlRBQ19BUFJfQ0FMX1RZUEUsCisKKwlNQURfQ0FMX1RZUEUsCisJVUxQX0FGRV9DQUxfVFlQRSwKKwlVTFBfTFNNX0NBTF9UWVBFLAorCisJRFRTX0VBR0xFX0NBTF9UWVBFLAorCUFVRElPX0NPUkVfTUVUQUlORk9fQ0FMX1RZUEUsCisJU1JTX1RSVU1FRElBX0NBTF9UWVBFLAorCisJQ09SRV9DVVNUT01fVE9QT0xPR0lFU19DQUxfVFlQRSwKKwlBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEUsCisKKwlVTFBfTFNNX1RPUE9MT0dZX0lEX0NBTF9UWVBFLAorCUFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEUsCisJQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxfVFlQRSwKKwlNQVhfQ0FMX1RZUEVTLAorfTsKKworI2RlZmluZSBBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF9UWVBFIEFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEUKKyNkZWZpbmUgQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxfVFlQRSBBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF9UWVBFCisKK2VudW0geworCVZFUlNJT05fMF8wLAorfTsKKworZW51bSB7CisJUEVSX1ZPQ09ERVJfQ0FMX0JJVF9NQVNLID0gMHgxMDAwMCwKK307CisKKyNkZWZpbmUgTUFYX0lPQ1RMX0NNRF9TSVpFCTUxMgorCisvKiBjb21tb24gc3RydWN0dXJlcyAqLworCitzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlciB7CisJaW50MzJfdAkJZGF0YV9zaXplOworCWludDMyX3QJCXZlcnNpb247CisJaW50MzJfdAkJY2FsX3R5cGU7CisJaW50MzJfdAkJY2FsX3R5cGVfc2l6ZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIgeworCWludDMyX3QJCXZlcnNpb247CisJaW50MzJfdAkJYnVmZmVyX251bWJlcjsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfZGF0YSB7CisJLyogU2l6ZSBvZiBjYWwgZGF0YSBhdCBtZW1faGFuZGxlIGFsbG9jYXRpb24gb3IgYXQgdmFkZHIgKi8KKwlpbnQzMl90CQljYWxfc2l6ZTsKKwkvKiBJZiBtZW1faGFuZGxlIGlmIHNoYXJlZCBtZW1vcnkgaXMgdXNlZCovCisJaW50MzJfdAkJbWVtX2hhbmRsZTsKKwkvKiBzaXplIG9mIHZpcnR1YWwgbWVtb3J5IGlmIHNoYXJlZCBtZW1vcnkgbm90IHVzZWQgKi8KK307CisKKworLyogQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT04gKi8KK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9hbGxvYyB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2FsbG9jIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hbGxvYwljYWxfdHlwZTsKK307CisKKworLyogQVVESU9fREVBTExPQ0FURV9DQUxJQlJBVElPTiAqLworc3RydWN0IGF1ZGlvX2NhbF90eXBlX2RlYWxsb2MgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9kZWFsbG9jIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9kZWFsbG9jCWNhbF90eXBlOworfTsKKworCisvKiBBVURJT19QUkVQQVJFX0NBTElCUkFUSU9OICovCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfcHJlcGFyZSB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3ByZXBhcmUgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ByZXBhcmUJY2FsX3R5cGU7Cit9OworCisKKy8qIEFVRElPX1BPU1RfQ0FMSUJSQVRJT04gKi8KK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9wb3N0IHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfcG9zdCB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfcG9zdAljYWxfdHlwZTsKK307CisKKy8qQVVESU9fQ09SRV9NRVRBX0lORk8gKi8KKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21ldGFpbmZvIHsKKwl1aW50MzJfdCBuS2V5OworfTsKKworLyogQ2FsIGluZm8gdHlwZXMgKi8KK2VudW0geworCVJYX0RFVklDRSwKKwlUWF9ERVZJQ0UsCisJTUFYX1BBVEhfVFlQRQorfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FkbV90b3AgeworCWludDMyX3QJCXRvcG9sb2d5OworCWludDMyX3QJCWFjZGJfaWQ7CisJLyogUlhfREVWSUNFIG9yIFRYX0RFVklDRSAqLworCWludDMyX3QJCXBhdGg7CisJaW50MzJfdAkJYXBwX3R5cGU7CisJaW50MzJfdAkJc2FtcGxlX3JhdGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkcHJvYyB7CisJaW50MzJfdAkJYWNkYl9pZDsKKwkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCisJaW50MzJfdAkJcGF0aDsKKwlpbnQzMl90CQlhcHBfdHlwZTsKKwlpbnQzMl90CQlzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19hdWR2b2wgeworCWludDMyX3QJCWFjZGJfaWQ7CisJLyogUlhfREVWSUNFIG9yIFRYX0RFVklDRSAqLworCWludDMyX3QJCXBhdGg7CisJaW50MzJfdAkJYXBwX3R5cGU7CisJaW50MzJfdAkJdm9sX2luZGV4OworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZSB7CisJaW50MzJfdAkJYWNkYl9pZDsKKwkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCisJaW50MzJfdAkJcGF0aDsKKwlpbnQzMl90CQlzYW1wbGVfcmF0ZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19hZmVfdG9wIHsKKwlpbnQzMl90CQl0b3BvbG9neTsKKwlpbnQzMl90CQlhY2RiX2lkOworCS8qIFJYX0RFVklDRSBvciBUWF9ERVZJQ0UgKi8KKwlpbnQzMl90CQlwYXRoOworCWludDMyX3QJCXNhbXBsZV9yYXRlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FzbV90b3AgeworCWludDMyX3QJCXRvcG9sb2d5OworCWludDMyX3QJCWFwcF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHN0cm0geworCWludDMyX3QJCWFwcF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FhbmMgeworCWludDMyX3QJCWFjZGJfaWQ7Cit9OworCisjZGVmaW5lIE1BWF9IV19ERUxBWV9FTlRSSUVTCTI1CisKK3N0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZW50cnkgeworCXVpbnQzMl90IHNhbXBsZV9yYXRlOworCXVpbnQzMl90IGRlbGF5X3VzZWM7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2h3X2RlbGF5X2RhdGEgeworCXVpbnQzMl90CQkJCW51bV9lbnRyaWVzOworCXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZW50cnkJCWVudHJ5W01BWF9IV19ERUxBWV9FTlRSSUVTXTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19od19kZWxheSB7CisJaW50MzJfdAkJCQkJYWNkYl9pZDsKKwkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCisJaW50MzJfdAkJCQkJcGF0aDsKKwlpbnQzMl90CQkJCQlwcm9wZXJ0eV90eXBlOworCXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZGF0YQkJZGF0YTsKK307CisKK2VudW0gbXNtX3Nwa3JfcHJvdF9zdGF0ZXMgeworCU1TTV9TUEtSX1BST1RfQ0FMSUJSQVRFRCwKKwlNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTLAorCU1TTV9TUEtSX1BST1RfRElTQUJMRUQsCisJTVNNX1NQS1JfUFJPVF9OT1RfQ0FMSUJSQVRFRCwKKwlNU01fU1BLUl9QUk9UX1BSRV9DQUxJQlJBVEVELAorCU1TTV9TUEtSX1BST1RfSU5fRlRNX01PREUKK307CisjZGVmaW5lIE1TTV9TUEtSX1BST1RfSU5fRlRNX01PREUgTVNNX1NQS1JfUFJPVF9JTl9GVE1fTU9ERQorCitlbnVtIG1zbV9zcGtyX2NvdW50IHsKKwlTUF9WMl9TUEtSXzEsCisJU1BfVjJfU1BLUl8yLAorCVNQX1YyX05VTV9NQVhfU1BLUlMKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19zcGtfcHJvdF9jZmcgeworCWludDMyX3QJCXIwW1NQX1YyX05VTV9NQVhfU1BLUlNdOworCWludDMyX3QJCXQwW1NQX1YyX05VTV9NQVhfU1BLUlNdOworCXVpbnQzMl90CXF1aWNrX2NhbGliX2ZsYWc7CisJdWludDMyX3QJbW9kZTsKKwkvKgorCSAqIDAgLSBTdGFydCBzcGsgcHJvdAorCSAqIDEgLSBTdGFydCBjYWxpYgorCSAqIDIgLSBEaXNhYmxlIHNwayBwcm90CisJICovCit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfdGhfdmlfZnRtX2NmZyB7CisJdWludDMyX3QJd2FpdF90aW1lW1NQX1YyX05VTV9NQVhfU1BLUlNdOworCXVpbnQzMl90CWZ0bV90aW1lW1NQX1YyX05VTV9NQVhfU1BLUlNdOworCXVpbnQzMl90CW1vZGU7CisJLyoKKwkgKiAwIC0gbm9ybWFsIHJ1bm5pbmcgbW9kZQorCSAqIDEgLSBDYWxpYnJhdGlvbgorCSAqIDIgLSBGVE0gbW9kZQorCSAqLworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX2Z0bV9jZmcgeworCXVpbnQzMl90CXdhaXRfdGltZVtTUF9WMl9OVU1fTUFYX1NQS1JTXTsKKwl1aW50MzJfdAlmdG1fdGltZVtTUF9WMl9OVU1fTUFYX1NQS1JTXTsKKwl1aW50MzJfdAltb2RlOworCS8qCisJICogMCAtIG5vcm1hbCBydW5uaW5nIG1vZGUKKwkgKiAyIC0gRlRNIG1vZGUKKwkgKi8KK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19zcF9leF92aV9wYXJhbSB7CisJaW50MzJfdAkJZnJlcV9xMjBbU1BfVjJfTlVNX01BWF9TUEtSU107CisJaW50MzJfdAkJcmVzaXNfcTI0W1NQX1YyX05VTV9NQVhfU1BLUlNdOworCWludDMyX3QJCXFtY3RfcTI0W1NQX1YyX05VTV9NQVhfU1BLUlNdOworCWludDMyX3QJCXN0YXR1c1tTUF9WMl9OVU1fTUFYX1NQS1JTXTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19zcF90aF92aV9wYXJhbSB7CisJaW50MzJfdAkJcl9kY19xMjRbU1BfVjJfTlVNX01BWF9TUEtSU107CisJaW50MzJfdAkJdGVtcF9xMjJbU1BfVjJfTlVNX01BWF9TUEtSU107CisJaW50MzJfdAkJc3RhdHVzW1NQX1YyX05VTV9NQVhfU1BLUlNdOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21zbV9zcGtfcHJvdF9zdGF0dXMgeworCWludDMyX3QJCXIwW1NQX1YyX05VTV9NQVhfU1BLUlNdOworCWludDMyX3QJCXN0YXR1czsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb19zaWRldG9uZSB7CisJdWludDE2X3QJZW5hYmxlOworCXVpbnQxNl90CWdhaW47CisJaW50MzJfdAkJdHhfYWNkYl9pZDsKKwlpbnQzMl90CQlyeF9hY2RiX2lkOworCWludDMyX3QJCW1pZDsKKwlpbnQzMl90CQlwaWQ7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCB7CisJaW50MzJfdAkJdG9wb2xvZ3k7CisJaW50MzJfdAkJYWNkYl9pZDsKKwlpbnQzMl90CQlhcHBfdHlwZTsKK307CisKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbSB7CisJaW50MzJfdAkJYWNkYl9pZDsKKwkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCisJaW50MzJfdAkJcGF0aDsKKwlpbnQzMl90CQlhcHBfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfdG9wIHsKKwlpbnQzMl90CQl0b3BvbG9neTsKKwlpbnQzMl90CQlhY2RiX2lkOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3Byb2MgeworCWludDMyX3QJCXR4X2FjZGJfaWQ7CisJaW50MzJfdAkJcnhfYWNkYl9pZDsKKwlpbnQzMl90CQl0eF9zYW1wbGVfcmF0ZTsKKwlpbnQzMl90CQlyeF9zYW1wbGVfcmF0ZTsKK307CisKK2VudW0geworCURFRkFVTFRfRkVBVFVSRV9TRVQsCisJVk9MX0JPT1NUX0ZFQVRVUkVfU0VULAorfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3ZvbCB7CisJaW50MzJfdAkJdHhfYWNkYl9pZDsKKwlpbnQzMl90CQlyeF9hY2RiX2lkOworCS8qIERFRkFVTFRfIG9yIFZPTF9CT09TVF9GRUFUVVJFX1NFVCAqLworCWludDMyX3QJCWZlYXR1cmVfc2V0OworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY2Rldl9jZmcgeworCWludDMyX3QJCXR4X2FjZGJfaWQ7CisJaW50MzJfdAkJcnhfYWNkYl9pZDsKK307CisKKyNkZWZpbmUgTUFYX1ZPSUNFX0NPTFVNTlMJMjAKKwordW5pb24gYXVkaW9fY2FsX2NvbF9uYSB7CisJdWludDhfdAkJdmFsODsKKwl1aW50MTZfdAl2YWwxNjsKKwl1aW50MzJfdAl2YWwzMjsKKwl1aW50NjRfdAl2YWw2NDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19jYWxfY29sIHsKKwl1aW50MzJfdAkJaWQ7CisJdWludDMyX3QJCXR5cGU7CisJdW5pb24gYXVkaW9fY2FsX2NvbF9uYQluYV92YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19jYWxfY29sX2RhdGEgeworCXVpbnQzMl90CQludW1fY29sdW1uczsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NvbAljb2x1bW5bTUFYX1ZPSUNFX0NPTFVNTlNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wgeworCWludDMyX3QJCQkJdGFibGVfaWQ7CisJaW50MzJfdAkJCQl0eF9hY2RiX2lkOworCWludDMyX3QJCQkJcnhfYWNkYl9pZDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NvbF9kYXRhCWRhdGE7Cit9OworCisvKiBBVURJT19TRVRfQ0FMSUJSQVRJT04gJiAqLworc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfYmFzaWMgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FkbV90b3AgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9hZG1fdG9wIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZG1fdG9wCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX21ldGFpbmZvIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbWV0YWluZm8JY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY29yZV9tZXRhaW5mbyB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJICBoZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX21ldGFpbmZvIGNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHByb2MgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9hdWRwcm9jIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hdWRwcm9jCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHZvbCB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbAljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfYXVkdm9sIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hdWR2b2wJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXNtX3RvcCB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FzbV90b3AJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2FzbV90b3AgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FzbV90b3AJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXVkc3RybSB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHN0cm0JY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2F1ZHN0cm0geworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHN0cm0JY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9hZmUgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FmZQljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9hZmVfdG9wIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcAljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfYWZlX3RvcCB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlX3RvcAljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9hYW5jIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWFuYwljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfYWFuYyB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWFuYwljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9mYl9zcGtfcHJvdF9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3Nwa19wcm90X2NmZwljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfZmJfc3BrX3Byb3RfY2ZnIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3RfY2ZnCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX2Z0bV9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX2Z0bV9jZmcJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3NwX3RoX3ZpX2Z0bV9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9mdG1fY2ZnCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX2Z0bV9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX2Z0bV9jZmcJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3NwX2V4X3ZpX2Z0bV9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF9leF92aV9mdG1fY2ZnCWNhbF90eXBlOworfTsKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV9od19kZWxheSB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5CWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheSB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaHdfZGVsYXkJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc2lkZXRvbmUgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lCQljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfc2lkZXRvbmUgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zaWRldG9uZQkJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfbHNtX3RvcCB7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbV90b3AJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2xzbV90b3AgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2xzbV90b3AJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfbHNtIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9sc20geworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2xzbQljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NfdG9wIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX3RvcAljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdm9jX3RvcCB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jX3RvcAljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV92b2Nwcm9jIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jcHJvYwljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdm9jcHJvYyB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jcHJvYwljYWxfdHlwZTsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfdHlwZV92b2N2b2wgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb192b2N2b2wJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3ZvY3ZvbCB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jdm9sCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY2Rldl9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7CisJc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY2Rldl9jZmcJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3ZvY2Rldl9jZmcgeworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NkZXZfY2ZnCWNhbF90eXBlOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY19jb2wgeworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF92b2NfY29sIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NfY29sCWNhbF90eXBlOworfTsKKworLyogQVVESU9fR0VUX0NBTElCUkFUSU9OICovCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3Rfc3RhdHVzIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCQkJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21zbV9zcGtfcHJvdF9zdGF0dXMJY2FsX2luZm87Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX2ZiX3Nwa19wcm90X3N0YXR1cyB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9mYl9zcGtfcHJvdF9zdGF0dXMJY2FsX3R5cGU7Cit9OworCitzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfdGhfdmlfcGFyYW0geworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCQljYWxfaGRyOworCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJCQljYWxfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfdGhfdmlfcGFyYW0JCWNhbF9pbmZvOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9zcF90aF92aV9wYXJhbSB7CisJc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCQkJaGRyOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9wYXJhbQkJY2FsX3R5cGU7Cit9Oworc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX3BhcmFtIHsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCQkJY2FsX2hkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCQkJY2FsX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX3BhcmFtCQljYWxfaW5mbzsKK307CisKK3N0cnVjdCBhdWRpb19jYWxfc3BfZXhfdmlfcGFyYW0geworCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJCWhkcjsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfZXhfdmlfcGFyYW0JCWNhbF90eXBlOworfTsKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fQ0FMSUJSQVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19nNzExLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGViZDZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19nNzExLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fRzcxMV9ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19HNzExX0gKKworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorCitzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyB7CisJdWludDMyX3Qgc2FtcGxlX3JhdGU7Cit9OworCisjZGVmaW5lIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnKQorCisjZGVmaW5lIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnKQorCisKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fRzcxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTFfZGVjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTFfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3ZTRjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fZzcxMV9kZWMuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9VQVBJX01TTV9BVURJT19HNzExX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0c3MTFfSAorCisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+CisKK3N0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnIHsKKwl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKK307CisKKyNkZWZpbmUgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpCisKKyNkZWZpbmUgQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpCisKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fRzcxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX212cy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19tdnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc2YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19tdnMuaApAQCAtMCwwICsxLDE1NSBAQAorI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fTVZTX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX01WU19ICisKKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KKworI2RlZmluZSBBVURJT19HRVRfTVZTX0NPTkZJRyBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNICsgMCksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fU0VUX01WU19DT05GSUcgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSArIDEpLCB1bnNpZ25lZCBpbnQpCisKKy8qIE1WUyBtb2RlcyAqLworI2RlZmluZSBNVlNfTU9ERV9JUzczMyAweDEgLypRQ0VMUCAxM0sqLworI2RlZmluZSBNVlNfTU9ERV9JUzEyNyAweDIgLypFVlJDLThrKi8KKyNkZWZpbmUgTVZTX01PREVfNEdWX05CIDB4MyAvKkVWUkMtQiovCisjZGVmaW5lIE1WU19NT0RFXzRHVl9XQiAweDQgLypFVlJDLVdCKi8KKyNkZWZpbmUgTVZTX01PREVfQU1SIDB4NQorI2RlZmluZSBNVlNfTU9ERV9FRlIgMHg2CisjZGVmaW5lIE1WU19NT0RFX0ZSIDB4NworI2RlZmluZSBNVlNfTU9ERV9IUiAweDgKKyNkZWZpbmUgTVZTX01PREVfTElORUFSX1BDTSAweDkKKyNkZWZpbmUgTVZTX01PREVfRzcxMSAweEEKKyNkZWZpbmUgTVZTX01PREVfUENNIDB4QworI2RlZmluZSBNVlNfTU9ERV9BTVJfV0IgMHhECisjZGVmaW5lIE1WU19NT0RFX0c3MjlBIDB4RQorI2RlZmluZSBNVlNfTU9ERV9HNzExQSAweEYKKyNkZWZpbmUgTVZTX01PREVfRzcyMiAweDEwCisjZGVmaW5lIE1WU19NT0RFX1BDTV9XQiAweDEyCisKK2VudW0gbXNtX2F1ZGlvX2Ftcl9tb2RlIHsKKwlNVlNfQU1SX01PREVfMDQ3NSwgLyogQU1SIDQuNzUga2JwcyAqLworCU1WU19BTVJfTU9ERV8wNTE1LCAvKiBBTVIgNS4xNSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzA1OTAsIC8qIEFNUiA1LjkwIGticHMgKi8KKwlNVlNfQU1SX01PREVfMDY3MCwgLyogQU1SIDYuNzAga2JwcyAqLworCU1WU19BTVJfTU9ERV8wNzQwLCAvKiBBTVIgNy40MCBrYnBzICovCisJTVZTX0FNUl9NT0RFXzA3OTUsIC8qIEFNUiA3Ljk1IGticHMgKi8KKwlNVlNfQU1SX01PREVfMTAyMCwgLyogQU1SIDEwLjIwIGticHMgKi8KKwlNVlNfQU1SX01PREVfMTIyMCwgLyogQU1SIDEyLjIwIGticHMgKi8KKwlNVlNfQU1SX01PREVfMDY2MCwgLyogQU1SLVdCIDYuNjAga2JwcyAqLworCU1WU19BTVJfTU9ERV8wODg1LCAvKiBBTVItV0IgOC44NSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzEyNjUsIC8qIEFNUi1XQiAxMi42NSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzE0MjUsIC8qIEFNUi1XQiAxNC4yNSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzE1ODUsIC8qIEFNUi1XQiAxNS44NSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzE4MjUsIC8qIEFNUi1XQiAxOC4yNSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzE5ODUsIC8qIEFNUi1XQiAxOS44NSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzIzMDUsIC8qIEFNUi1XQiAyMy4wNSBrYnBzICovCisJTVZTX0FNUl9NT0RFXzIzODUsIC8qIEFNUi1XQiAyMy44NSBrYnBzICovCisJTVZTX0FNUl9NT0RFX1VOREVGCit9OworCisvKiBUaGUgTVZTIFZPQyByYXRlIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgcmF0ZSBvZiBRQ0VMUCAxM0soSVM3MzMpLAorICogRVZSQyhJUzEyNyksIDRHViwgb3IgNEdWLVdCIGZyYW1lLgorICovCitlbnVtIG1zbV9hdWRpb192b2NfcmF0ZSB7CisJCU1WU19WT0NfMF9SQVRFLCAvKiBCbGFuayBmcmFtZSAqLworCQlNVlNfVk9DXzhfUkFURSwgLyogMS84IHJhdGUgICAgKi8KKwkJTVZTX1ZPQ180X1JBVEUsIC8qIDEvNCByYXRlICAgICovCisJCU1WU19WT0NfMl9SQVRFLCAvKiAxLzIgcmF0ZSAgICAqLworCQlNVlNfVk9DXzFfUkFURSwgLyogRnVsbCByYXRlICAgKi8KKwkJTVZTX1ZPQ19FUkFTVVJFLCAvKiBlcmFzdXJlIGZyYW1lICovCisJCU1WU19WT0NfUkFURV9NQVgsCisJCU1WU19WT0NfUkFURV9VTkRFRiA9IE1WU19WT0NfUkFURV9NQVgKK307CisKK2VudW0gbXNtX2F1ZGlvX2Ftcl9mcmFtZV90eXBlIHsKKwlNVlNfQU1SX1NQRUVDSF9HT09ELAkgICAgICAvKiBHb29kIHNwZWVjaCBmcmFtZSAgICAgICAgICAgICAgKi8KKwlNVlNfQU1SX1NQRUVDSF9ERUdSQURFRCwgICAgICAvKiBTcGVlY2ggZGVncmFkZWQgICAgICAgICAgICAgICAgKi8KKwlNVlNfQU1SX09OU0VULAkJICAgICAgLyogT25zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJTVZTX0FNUl9TUEVFQ0hfQkFELAkgICAgICAvKiBDb3JydXB0IHNwZWVjaCBmcmFtZSAoYmFkIENSQykgKi8KKwlNVlNfQU1SX1NJRF9GSVJTVCwJICAgICAgLyogRmlyc3Qgc2lsZW5jZSBkZXNjcmlwdG9yICAgICAgICovCisJTVZTX0FNUl9TSURfVVBEQVRFLAkgICAgICAvKiBDb21mb3J0IG5vaXNlIGZyYW1lICAgICAgICAgICAgKi8KKwlNVlNfQU1SX1NJRF9CQUQsCSAgICAgIC8qIENvcnJ1cHQgU0lEIGZyYW1lIChiYWQgQ1JDKSAgICAqLworCU1WU19BTVJfTk9fREFUQSwJICAgICAgLyogTm90aGluZyB0byB0cmFuc21pdCAgICAgICAgICAgICovCisJTVZTX0FNUl9TUEVFQ0hfTE9TVAkgICAgICAvKiBEb3dubGluayBzcGVlY2ggbG9zdCAgICAgICAgICAgKi8KK307CisKK2VudW0gbXNtX2F1ZGlvX2c3MTFhX21vZGUgeworCU1WU19HNzExQV9NT0RFX01VTEFXLAorCU1WU19HNzExQV9NT0RFX0FMQVcKK307CisKK2VudW0gbXNtX2F1ZGlvX2c3MTFfbW9kZSB7CisJTVZTX0c3MTFfTU9ERV9NVUxBVywKKwlNVlNfRzcxMV9NT0RFX0FMQVcKK307CisKK2VudW0gbXZzX2c3MjJfbW9kZV90eXBlIHsKKwlNVlNfRzcyMl9NT0RFXzAxLAorCU1WU19HNzIyX01PREVfMDIsCisJTVZTX0c3MjJfTU9ERV8wMywKKwlNVlNfRzcyMl9NT0RFX01BWCwKKwlNVlNfRzcyMl9NT0RFX1VOREVGCit9OworCitlbnVtIG1zbV9hdWRpb19nNzExYV9mcmFtZV90eXBlIHsKKwlNVlNfRzcxMUFfU1BFRUNIX0dPT0QsCisJTVZTX0c3MTFBX1NJRCwKKwlNVlNfRzcxMUFfTk9fREFUQSwKKwlNVlNfRzcxMUFfRVJBU1VSRQorfTsKKworZW51bSBtc21fYXVkaW9fZzcyOWFfZnJhbWVfdHlwZSB7CisJTVZTX0c3MjlBX05PX0RBVEEsCisJTVZTX0c3MjlBX1NQRUVDSF9HT09ELAorCU1WU19HNzI5QV9TSUQsCisJTVZTX0c3MjlBX0VSQVNVUkUKK307CisKK3N0cnVjdCBtaW5fbWF4X3JhdGUgeworCXVpbnQzMl90IG1pbl9yYXRlOworCXVpbnQzMl90IG1heF9yYXRlOworfTsKKworc3RydWN0IG1zbV9hdWRpb19tdnNfY29uZmlnIHsKKwl1aW50MzJfdCBtdnNfbW9kZTsKKwl1aW50MzJfdCByYXRlX3R5cGU7CisJc3RydWN0IG1pbl9tYXhfcmF0ZSBtaW5fbWF4X3JhdGU7CisJdWludDMyX3QgZHR4X21vZGU7Cit9OworCisjZGVmaW5lIE1WU19NQVhfVk9DX1BLVF9TSVpFIDY0MAorCitzdHJ1Y3QgZ3NtX2hlYWRlciB7CisJdWludDhfdCBiZmk7CisJdWludDhfdCBzaWQ7CisJdWludDhfdCB0YWY7CisJdWludDhfdCB1Zmk7Cit9OworCitzdHJ1Y3QgcTZfbXNtX2F1ZGlvX212c19mcmFtZSB7CisJdW5pb24geworCXVpbnQzMl90IGZyYW1lX3R5cGU7CisJdWludDMyX3QgcGFja2V0X3JhdGU7CisJc3RydWN0IGdzbV9oZWFkZXIgZ3NtX2ZyYW1lX3R5cGU7CisJfSBoZWFkZXI7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3Qgdm9jX3BrdFtNVlNfTUFYX1ZPQ19QS1RfU0laRV07CisKK307CisKK3N0cnVjdCBtc21fYXVkaW9fbXZzX2ZyYW1lIHsKKwl1aW50MzJfdCBmcmFtZV90eXBlOworCXVpbnQzMl90IGxlbjsKKwl1aW50OF90IHZvY19wa3RbTVZTX01BWF9WT0NfUEtUX1NJWkVdOworCit9OworCisjZGVmaW5lIFE1VjJfTVZTX01BWF9WT0NfUEtUX1NJWkUgMzIwCisKK3N0cnVjdCBxNXYyX21zbV9hdWRpb19tdnNfZnJhbWUgeworCXVpbnQzMl90IGZyYW1lX3R5cGU7CisJdWludDMyX3QgbGVuOworCXVpbnQ4X3Qgdm9jX3BrdFtRNVYyX01WU19NQVhfVk9DX1BLVF9TSVpFXTsKKworfTsKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fTVZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fcWNwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3FjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3FjcC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1FDUF9ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19RQ1BfSAorCisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+CisKKyNkZWZpbmUgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkwLCBzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcpCisKKyNkZWZpbmUgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkxLCBzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcpCisKKyNkZWZpbmUgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAorCTIsIHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnKQorCisjZGVmaW5lIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKKwkzLCBzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZykKKworI2RlZmluZSBDRE1BX1JBVEVfQkxBTksJCTB4MDAKKyNkZWZpbmUgQ0RNQV9SQVRFX0VJR0hUSAkweDAxCisjZGVmaW5lIENETUFfUkFURV9RVUFSVEVSCTB4MDIKKyNkZWZpbmUgQ0RNQV9SQVRFX0hBTEYJCTB4MDMKKyNkZWZpbmUgQ0RNQV9SQVRFX0ZVTEwJCTB4MDQKKyNkZWZpbmUgQ0RNQV9SQVRFX0VSQVNVUkUJMHgwNQorCitzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgeworCXVpbnQzMl90IGNkbWFfcmF0ZTsKKwl1aW50MzJfdCBtaW5fYml0X3JhdGU7CisJdWludDMyX3QgbWF4X2JpdF9yYXRlOworfTsKKworc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgeworCXVpbnQzMl90IGNkbWFfcmF0ZTsKKwl1aW50MzJfdCBtaW5fYml0X3JhdGU7CisJdWludDMyX3QgbWF4X2JpdF9yYXRlOworfTsKKworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19RQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19zYmMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fc2JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3YzYzZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fc2JjLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fU0JDX0gKKyNkZWZpbmUgX1VBUElfTVNNX0FVRElPX1NCQ19ICisKKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KKworI2RlZmluZSBBVURJT19TRVRfU0JDX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fc2JjX2VuY19jb25maWcpCisKKyNkZWZpbmUgQVVESU9fR0VUX1NCQ19FTkNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX3NiY19lbmNfY29uZmlnKQorCisjZGVmaW5lIEFVRElPX1NCQ19CQV9MT1VETkVTUwkJMHgwCisjZGVmaW5lIEFVRElPX1NCQ19CQV9TTlIJCTB4MQorCisjZGVmaW5lIEFVRElPX1NCQ19NT0RFX01PTk8JCTB4MAorI2RlZmluZSBBVURJT19TQkNfTU9ERV9EVUFMCQkweDEKKyNkZWZpbmUgQVVESU9fU0JDX01PREVfU1RFUkVPCQkweDIKKyNkZWZpbmUgQVVESU9fU0JDX01PREVfSlNURVJFTwkJMHgzCisKKyNkZWZpbmUgQVVESU9fU0JDX0JBTkRTXzgJCTB4MQorCisjZGVmaW5lIEFVRElPX1NCQ19CTE9DS1NfNAkJMHgwCisjZGVmaW5lIEFVRElPX1NCQ19CTE9DS1NfOAkJMHgxCisjZGVmaW5lIEFVRElPX1NCQ19CTE9DS1NfMTIJCTB4MgorI2RlZmluZSBBVURJT19TQkNfQkxPQ0tTXzE2CQkweDMKKworc3RydWN0IG1zbV9hdWRpb19zYmNfZW5jX2NvbmZpZyB7CisJdWludDMyX3QgY2hhbm5lbHM7CisJdWludDMyX3Qgc2FtcGxlX3JhdGU7CisJdWludDMyX3QgYml0X2FsbG9jYXRpb247CisJdWludDMyX3QgbnVtYmVyX29mX3N1YmJhbmRzOworCXVpbnQzMl90IG51bWJlcl9vZl9ibG9ja3M7CisJdWludDMyX3QgYml0X3JhdGU7CisJdWludDMyX3QgbW9kZTsKK307CisjZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX1NCQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3ZvaWNlbWVtby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb192b2ljZW1lbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E3YTRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb192b2ljZW1lbW8uaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9VQVBJX01TTV9BVURJT19WT0lDRU1FTU9fSAorI2RlZmluZSBfVUFQSV9NU01fQVVESU9fVk9JQ0VNRU1PX0gKKworI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorCisjZGVmaW5lIEFVRElPX0dFVF9WT0lDRU1FTU9fQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX1NFVF9WT0lDRU1FTU9fQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCB1bnNpZ25lZCBpbnQpCisKKy8qIHJlY190eXBlICovCitlbnVtIHJwY192b2NfcmVjX2Rpcl90eXBlIHsKKwlSUENfVk9DX1JFQ19OT05FLAorCVJQQ19WT0NfUkVDX0ZPUldBUkQsCisJUlBDX1ZPQ19SRUNfUkVWRVJTRSwKKwlSUENfVk9DX1JFQ19CT1RILAorCVJQQ19WT0NfTUFYX1JFQ19UWVBFCit9OworCisvKiBjYXBhYmlsaXR5ICovCitlbnVtIHJwY192b2NfY2FwYWJpbGl0eV90eXBlIHsKKwlSUENfVk9DX0NBUF9JUzczMyA9IDQsCisJUlBDX1ZPQ19DQVBfSVMxMjcgPSA4LAorCVJQQ19WT0NfQ0FQX0FNUiA9IDY0LAorCVJQQ19WT0NfQ0FQXzMyQklUX0RVTU1ZID0gMjE0NzQ4MzY0NworfTsKKworLyogUmF0ZSAqLworZW51bSBycGNfdm9jX3JhdGVfdHlwZSB7CisJUlBDX1ZPQ18wX1JBVEUgPSAwLAorCVJQQ19WT0NfOF9SQVRFLAorCVJQQ19WT0NfNF9SQVRFLAorCVJQQ19WT0NfMl9SQVRFLAorCVJQQ19WT0NfMV9SQVRFLAorCVJQQ19WT0NfRVJBU1VSRSwKKwlSUENfVk9DX0VSUl9SQVRFLAorCVJQQ19WT0NfQU1SX1JBVEVfNDc1ID0gMCwKKwlSUENfVk9DX0FNUl9SQVRFXzUxNSA9IDEsCisJUlBDX1ZPQ19BTVJfUkFURV81OTAgPSAyLAorCVJQQ19WT0NfQU1SX1JBVEVfNjcwID0gMywKKwlSUENfVk9DX0FNUl9SQVRFXzc0MCA9IDQsCisJUlBDX1ZPQ19BTVJfUkFURV83OTUgPSA1LAorCVJQQ19WT0NfQU1SX1JBVEVfMTAyMCA9IDYsCisJUlBDX1ZPQ19BTVJfUkFURV8xMjIwID0gNywKK307CisKKy8qIGZyYW1lX2Zvcm1hdCAqLworZW51bSBycGNfdm9jX3BiX2xlbl9yYXRlX3Zhcl90eXBlIHsKKwlSUENfVk9DX1BCX05BVElWRV9RQ1AgPSAzLAorCVJQQ19WT0NfUEJfQU1SLAorCVJQQ19WT0NfUEJfRVZCCit9OworCitzdHJ1Y3QgbXNtX2F1ZGlvX3ZvaWNlbWVtb19jb25maWcgeworCXVpbnQzMl90IHJlY190eXBlOworCXVpbnQzMl90IHJlY19pbnRlcnZhbF9tczsKKwl1aW50MzJfdCBhdXRvX3N0b3BfbXM7CisJdWludDMyX3QgY2FwYWJpbGl0eTsKKwl1aW50MzJfdCBtYXhfcmF0ZTsKKwl1aW50MzJfdCBtaW5fcmF0ZTsKKwl1aW50MzJfdCBmcmFtZV9mb3JtYXQ7CisJdWludDMyX3QgZHR4X2VuYWJsZTsKKwl1aW50MzJfdCBkYXRhX3JlcV9tczsKK307CisKKyNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fVk9JQ0VNRU1PX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fd21hLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3dtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2ZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3dtYS5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1dNQV9ICisjZGVmaW5lIF9VQVBJX01TTV9BVURJT19XTUFfSAorCisjZGVmaW5lIEFVRElPX0dFVF9XTUFfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQVVESU9fU0VUX1dNQV9DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lIEFVRElPX0dFVF9XTUFfQ09ORklHX1YyICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMiksIHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MikKKyNkZWZpbmUgQVVESU9fU0VUX1dNQV9DT05GSUdfVjIgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKKwkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyKQorCitzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWcgeworCXVuc2lnbmVkIHNob3J0CWFybWRhdGFyZXF0aHI7CisJdW5zaWduZWQgc2hvcnQJY2hhbm5lbHNkZWNvZGVkOworCXVuc2lnbmVkIHNob3J0CXdtYWJ5dGVzcGVyc2VjOworCXVuc2lnbmVkIHNob3J0CXdtYXNhbXBsaW5nZnJlcTsKKwl1bnNpZ25lZCBzaG9ydAl3bWFlbmNvZGVyb3B0czsKK307CisKK3N0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiB7CisJdW5zaWduZWQgc2hvcnQJZm9ybWF0X3RhZzsKKwl1bnNpZ25lZCBzaG9ydAludW1jaGFubmVsczsKKwl1aW50MzJfdAlzYW1wbGluZ3JhdGU7CisJdWludDMyX3QJYXZnYnl0ZXNwZXJzZWNvbmQ7CisJdW5zaWduZWQgc2hvcnQJYmxvY2tfYWxpZ247CisJdW5zaWduZWQgc2hvcnQgIHZhbGlkYml0c3BlcnNhbXBsZTsKKwl1aW50MzJfdAljaGFubmVsbWFzazsKKwl1bnNpZ25lZCBzaG9ydAllbmNvZGVvcHQ7Cit9OworCisjZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX1dNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3dtYXByby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb193bWFwcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNiZjllCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb193bWFwcm8uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9VQVBJX01TTV9BVURJT19XTUFQUk9fSAorI2RlZmluZSBfVUFQSV9NU01fQVVESU9fV01BUFJPX0gKKworI2RlZmluZSBBVURJT19HRVRfV01BUFJPX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAorCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcpCisjZGVmaW5lIEFVRElPX1NFVF9XTUFQUk9fQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCisJICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZykKKworc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnIHsKKwl1bnNpZ25lZCBzaG9ydCAgYXJtZGF0YXJlcXRocjsKKwl1aW50OF90ICAgICAgICAgdmFsaWRiaXRzcGVyc2FtcGxlOworCXVpbnQ4X3QgICAgICAgICBudW1jaGFubmVsczsKKwl1bnNpZ25lZCBzaG9ydCAgZm9ybWF0dGFnOworCXVpbnQzMl90ICAgICAgICBzYW1wbGluZ3JhdGU7CisJdWludDMyX3QgICAgICAgIGF2Z2J5dGVzcGVyc2Vjb25kOworCXVuc2lnbmVkIHNob3J0ICBhc2ZwYWNrZXRsZW5ndGg7CisJdWludDMyX3QgICAgICAgIGNoYW5uZWxtYXNrOworCXVuc2lnbmVkIHNob3J0ICBlbmNvZGVvcHQ7CisJdW5zaWduZWQgc2hvcnQgIGFkdmFuY2VkZW5jb2Rlb3B0OworCXVpbnQzMl90ICAgICAgICBhZHZhbmNlZGVuY29kZW9wdDI7Cit9OworI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19XTUFQUk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQKaW5kZXggOTU3OGQ4Yi4uYjAzNTBmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvS2J1aWxkCkBAIC0xNCwzICsxNCwxMSBAQAogaGVhZGVyLXkgKz0gdGx2LmgKIGhlYWRlci15ICs9IHVzYl9zdHJlYW0uaAogaGVhZGVyLXkgKz0gc25kX3NzdF90b2tlbnMuaAoraGVhZGVyLXkgKz0gbHNtX3BhcmFtcy5oCitoZWFkZXIteSArPSBhdWRpb19zbGltc2xhdmUuaAoraGVhZGVyLXkgKz0gdm9pY2VfcGFyYW1zLmgKK2hlYWRlci15ICs9IGF1ZGlvX2VmZmVjdHMuaAoraGVhZGVyLXkgKz0gdm9pY2Vfc3ZjLmgKK2hlYWRlci15ICs9IGRldmRlcF9wYXJhbXMuaAoraGVhZGVyLXkgKz0gbXNtY2FsLWh3ZGVwLmgKK2hlYWRlci15ICs9IHdjZC1kc3AtZ2xpbmsuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2F1ZGlvX2VmZmVjdHMuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hdWRpb19lZmZlY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzYjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hdWRpb19lZmZlY3RzLmgKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0FVRElPX0VGRkVDVFNfSAorI2RlZmluZSBfQVVESU9fRUZGRUNUU19ICisKKy8qKiBBVURJTyBFRkZFQ1RTICoqLworCisKKy8qIENPTkZJRyBHRVQvU0VUICovCisjZGVmaW5lIENPTkZJR19DQUNIRQkJCTAKKyNkZWZpbmUgQ09ORklHX1NFVAkJCTEKKyNkZWZpbmUgQ09ORklHX0dFVAkJCTIKKworLyogQ09ORklHIEhFQURFUiAqLworLyoKKyAqIE1PRFVMRV9JRCwKKyAqIERFVklDRSwKKyAqIE5VTV9DT01NQU5EUywKKyAqIENPTU1BTkRfSURfMSwKKyAqIENPTkZJR19DQUNIRS9TRVQvR0VULAorICogT0ZGU0VUXzEsCisgKiBMRU5HVEhfMSwKKyAqIFZBTFVFU18xLAorICogLi4uLAorICogLi4uLAorICogQ09NTUFORF9JRF8yLAorICogQ09ORklHX0NBQ0hFL1NFVC9HRVQsCisgKiBPRkZTRVRfMiwKKyAqIExFTkdUSF8yLAorICogVkFMVUVTXzIsCisgKiAuLi4sCisgKiAuLi4sCisgKiBDT01NQU5EX0lEXzMsCisgKiAuLi4KKyAqLworCisKKy8qIENPTkZJRyBQQVJBTSBJRHMgKi8KKyNkZWZpbmUgVklSVFVBTElaRVJfTU9EVUxFCQkweDAwMDAxMDAwCisjZGVmaW5lIFZJUlRVQUxJWkVSX0VOQUJMRQkJMHgwMDAwMTAwMQorI2RlZmluZSBWSVJUVUFMSVpFUl9TVFJFTkdUSAkJMHgwMDAwMTAwMgorI2RlZmluZSBWSVJUVUFMSVpFUl9PVVRfVFlQRQkJMHgwMDAwMTAwMworI2RlZmluZSBWSVJUVUFMSVpFUl9HQUlOX0FESlVTVAkJMHgwMDAwMTAwNAorI2RlZmluZSBWSVJUVUFMSVpFUl9FTkFCTEVfUEFSQU1fTEVOCQkxCisjZGVmaW5lIFZJUlRVQUxJWkVSX1NUUkVOR1RIX1BBUkFNX0xFTgkJMQorI2RlZmluZSBWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9MRU4JCTEKKyNkZWZpbmUgVklSVFVBTElaRVJfR0FJTl9BREpVU1RfUEFSQU1fTEVOCTEKKworI2RlZmluZSBSRVZFUkJfTU9EVUxFCQkJMHgwMDAwMjAwMAorI2RlZmluZSBSRVZFUkJfRU5BQkxFCQkJMHgwMDAwMjAwMQorI2RlZmluZSBSRVZFUkJfTU9ERQkJCTB4MDAwMDIwMDIKKyNkZWZpbmUgUkVWRVJCX1BSRVNFVAkJCTB4MDAwMDIwMDMKKyNkZWZpbmUgUkVWRVJCX1dFVF9NSVgJCQkweDAwMDAyMDA0CisjZGVmaW5lIFJFVkVSQl9HQUlOX0FESlVTVAkJMHgwMDAwMjAwNQorI2RlZmluZSBSRVZFUkJfUk9PTV9MRVZFTAkJMHgwMDAwMjAwNgorI2RlZmluZSBSRVZFUkJfUk9PTV9IRl9MRVZFTAkJMHgwMDAwMjAwNworI2RlZmluZSBSRVZFUkJfREVDQVlfVElNRQkJMHgwMDAwMjAwOAorI2RlZmluZSBSRVZFUkJfREVDQVlfSEZfUkFUSU8JCTB4MDAwMDIwMDkKKyNkZWZpbmUgUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMCTB4MDAwMDIwMGEKKyNkZWZpbmUgUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZCTB4MDAwMDIwMGIKKyNkZWZpbmUgUkVWRVJCX0xFVkVMCQkJMHgwMDAwMjAwYworI2RlZmluZSBSRVZFUkJfREVMQVkJCQkweDAwMDAyMDBkCisjZGVmaW5lIFJFVkVSQl9ESUZGVVNJT04JCTB4MDAwMDIwMGUKKyNkZWZpbmUgUkVWRVJCX0RFTlNJVFkJCQkweDAwMDAyMDBmCisjZGVmaW5lIFJFVkVSQl9FTkFCTEVfUEFSQU1fTEVOCQkJMQorI2RlZmluZSBSRVZFUkJfTU9ERV9QQVJBTV9MRU4JCQkxCisjZGVmaW5lIFJFVkVSQl9QUkVTRVRfUEFSQU1fTEVOCQkJMQorI2RlZmluZSBSRVZFUkJfV0VUX01JWF9QQVJBTV9MRU4JCTEKKyNkZWZpbmUgUkVWRVJCX0dBSU5fQURKVVNUX1BBUkFNX0xFTgkJMQorI2RlZmluZSBSRVZFUkJfUk9PTV9MRVZFTF9QQVJBTV9MRU4JCTEKKyNkZWZpbmUgUkVWRVJCX1JPT01fSEZfTEVWRUxfUEFSQU1fTEVOCQkxCisjZGVmaW5lIFJFVkVSQl9ERUNBWV9USU1FX1BBUkFNX0xFTgkJMQorI2RlZmluZSBSRVZFUkJfREVDQVlfSEZfUkFUSU9fUEFSQU1fTEVOCQkxCisjZGVmaW5lIFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTF9QQVJBTV9MRU4JMQorI2RlZmluZSBSRVZFUkJfUkVGTEVDVElPTlNfREVMQVlfUEFSQU1fTEVOCTEKKyNkZWZpbmUgUkVWRVJCX0xFVkVMX1BBUkFNX0xFTgkJCTEKKyNkZWZpbmUgUkVWRVJCX0RFTEFZX1BBUkFNX0xFTgkJCTEKKyNkZWZpbmUgUkVWRVJCX0RJRkZVU0lPTl9QQVJBTV9MRU4JCTEKKyNkZWZpbmUgUkVWRVJCX0RFTlNJVFlfUEFSQU1fTEVOCQkxCisKKyNkZWZpbmUgQkFTU19CT09TVF9NT0RVTEUJCTB4MDAwMDMwMDAKKyNkZWZpbmUgQkFTU19CT09TVF9FTkFCTEUJCTB4MDAwMDMwMDEKKyNkZWZpbmUgQkFTU19CT09TVF9NT0RFCQkJMHgwMDAwMzAwMgorI2RlZmluZSBCQVNTX0JPT1NUX1NUUkVOR1RICQkweDAwMDAzMDAzCisjZGVmaW5lIEJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX0xFTgkJMQorI2RlZmluZSBCQVNTX0JPT1NUX01PREVfUEFSQU1fTEVOCQkxCisjZGVmaW5lIEJBU1NfQk9PU1RfU1RSRU5HVEhfUEFSQU1fTEVOCQkxCisKKyNkZWZpbmUgRVFfTU9EVUxFCQkJMHgwMDAwNDAwMAorI2RlZmluZSBFUV9FTkFCTEUJCQkweDAwMDA0MDAxCisjZGVmaW5lIEVRX0NPTkZJRwkJCTB4MDAwMDQwMDIKKyNkZWZpbmUgRVFfTlVNX0JBTkRTCQkJMHgwMDAwNDAwMworI2RlZmluZSBFUV9CQU5EX0xFVkVMUwkJCTB4MDAwMDQwMDQKKyNkZWZpbmUgRVFfQkFORF9MRVZFTF9SQU5HRQkJMHgwMDAwNDAwNQorI2RlZmluZSBFUV9CQU5EX0ZSRVFTCQkJMHgwMDAwNDAwNgorI2RlZmluZSBFUV9TSU5HTEVfQkFORF9GUkVRX1JBTkdFCTB4MDAwMDQwMDcKKyNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUQkJMHgwMDAwNDAwOAorI2RlZmluZSBFUV9CQU5EX0lOREVYCQkJMHgwMDAwNDAwOQorI2RlZmluZSBFUV9QUkVTRVRfSUQJCQkweDAwMDA0MDBhCisjZGVmaW5lIEVRX05VTV9QUkVTRVRTCQkJMHgwMDAwNDAwYgorI2RlZmluZSBFUV9QUkVTRVRfTkFNRQkJCTB4MDAwMDQwMGMKKyNkZWZpbmUgRVFfRU5BQkxFX1BBUkFNX0xFTgkJCTEKKyNkZWZpbmUgRVFfQ09ORklHX1BBUkFNX0xFTgkJCTMKKyNkZWZpbmUgRVFfQ09ORklHX1BFUl9CQU5EX1BBUkFNX0xFTgkJNQorI2RlZmluZSBFUV9OVU1fQkFORFNfUEFSQU1fTEVOCQkJMQorI2RlZmluZSBFUV9CQU5EX0xFVkVMU19QQVJBTV9MRU4JCTEzCisjZGVmaW5lIEVRX0JBTkRfTEVWRUxfUkFOR0VfUEFSQU1fTEVOCQkyCisjZGVmaW5lIEVRX0JBTkRfRlJFUVNfUEFSQU1fTEVOCQkJMTMKKyNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRV9QQVJBTV9MRU4JMgorI2RlZmluZSBFUV9TSU5HTEVfQkFORF9GUkVRX1BBUkFNX0xFTgkJMQorI2RlZmluZSBFUV9CQU5EX0lOREVYX1BBUkFNX0xFTgkJCTEKKyNkZWZpbmUgRVFfUFJFU0VUX0lEX1BBUkFNX0xFTgkJCTEKKyNkZWZpbmUgRVFfTlVNX1BSRVNFVFNfUEFSQU1fTEVOCQkxCisjZGVmaW5lIEVRX1BSRVNFVF9OQU1FX1BBUkFNX0xFTgkJMzIKKworI2RlZmluZSBFUV9UWVBFX05PTkUJMAorI2RlZmluZSBFUV9CQVNTX0JPT1NUCTEKKyNkZWZpbmUgRVFfQkFTU19DVVQJMgorI2RlZmluZSBFUV9UUkVCTEVfQk9PU1QJMworI2RlZmluZSBFUV9UUkVCTEVfQ1VUCTQKKyNkZWZpbmUgRVFfQkFORF9CT09TVAk1CisjZGVmaW5lIEVRX0JBTkRfQ1VUCTYKKworI2RlZmluZSBTT0ZUX1ZPTFVNRV9NT0RVTEUJCTB4MDAwMDYwMDAKKyNkZWZpbmUgU09GVF9WT0xVTUVfRU5BQkxFCQkweDAwMDA2MDAxCisjZGVmaW5lIFNPRlRfVk9MVU1FX0dBSU5fMkNICQkweDAwMDA2MDAyCisjZGVmaW5lIFNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSCQkweDAwMDA2MDAzCisjZGVmaW5lIFNPRlRfVk9MVU1FX0VOQUJMRV9QQVJBTV9MRU4JCTEKKyNkZWZpbmUgU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fTEVOCQkyCisjZGVmaW5lIFNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX0xFTgkxCisKKyNkZWZpbmUgU09GVF9WT0xVTUUyX01PRFVMRQkJMHgwMDAwNzAwMAorI2RlZmluZSBTT0ZUX1ZPTFVNRTJfRU5BQkxFCQkweDAwMDA3MDAxCisjZGVmaW5lIFNPRlRfVk9MVU1FMl9HQUlOXzJDSAkJMHgwMDAwNzAwMgorI2RlZmluZSBTT0ZUX1ZPTFVNRTJfR0FJTl9NQVNURVIJMHgwMDAwNzAwMworI2RlZmluZSBTT0ZUX1ZPTFVNRTJfRU5BQkxFX1BBUkFNX0xFTgkJU09GVF9WT0xVTUVfRU5BQkxFX1BBUkFNX0xFTgorI2RlZmluZSBTT0ZUX1ZPTFVNRTJfR0FJTl8yQ0hfUEFSQU1fTEVOCQlTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9MRU4KKyNkZWZpbmUgU09GVF9WT0xVTUUyX0dBSU5fTUFTVEVSX1BBUkFNX0xFTglcCisJCQkJCVNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX0xFTgorCisjZGVmaW5lIFBCRV9DT05GX01PRFVMRV9JRAkweDAwMDEwQzJBCisjZGVmaW5lIFBCRV9DT05GX1BBUkFNX0lECTB4MDAwMTBDNDkKKworI2RlZmluZSBQQkVfTU9EVUxFCQkweDAwMDA4MDAwCisjZGVmaW5lIFBCRV9FTkFCTEUJCTB4MDAwMDgwMDEKKyNkZWZpbmUgUEJFX0NPTkZJRwkJMHgwMDAwODAwMgorI2RlZmluZSBQQkVfRU5BQkxFX1BBUkFNX0xFTgkJMQorI2RlZmluZSBQQkVfQ09ORklHX1BBUkFNX0xFTgkJMjgKKworI2RlZmluZSBDT01NQU5EX1BBWUxPQURfTEVOCTMKKyNkZWZpbmUgQ09NTUFORF9QQVlMT0FEX1NaCShDT01NQU5EX1BBWUxPQURfTEVOICogc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgTUFYX0lOQkFORF9QQVJBTV9TWgk0MDk2CisjZGVmaW5lIFEyN19VTklUWQkJKDEgPDwgMjcpCisjZGVmaW5lIFE4X1VOSVRZCQkoMSA8PCA4KQorI2RlZmluZSBDVVNUT01fT1BFTlNMX1BSRVNFVAkxOAorCisjZGVmaW5lIFZJUlRVQUxJWkVSX0VOQUJMRV9QQVJBTV9TWglcCisJCQkoVklSVFVBTElaRVJfRU5BQkxFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBWSVJUVUFMSVpFUl9TVFJFTkdUSF9QQVJBTV9TWglcCisJCQkoVklSVFVBTElaRVJfU1RSRU5HVEhfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFZJUlRVQUxJWkVSX09VVF9UWVBFX1BBUkFNX1NaCVwKKwkJCShWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgVklSVFVBTElaRVJfR0FJTl9BREpVU1RfUEFSQU1fU1oJXAorCQkJKFZJUlRVQUxJWkVSX0dBSU5fQURKVVNUX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorc3RydWN0IHZpcnR1YWxpemVyX3BhcmFtcyB7CisJdWludDMyX3QgZGV2aWNlOworCXVpbnQzMl90IGVuYWJsZV9mbGFnOworCXVpbnQzMl90IHN0cmVuZ3RoOworCXVpbnQzMl90IG91dF90eXBlOworCWludDMyX3QgZ2Fpbl9hZGp1c3Q7Cit9OworCisjZGVmaW5lIE5VTV9PU0xfUkVWRVJCX1BSRVNFVFNfU1VQUE9SVEVECTYKKyNkZWZpbmUgUkVWRVJCX0VOQUJMRV9QQVJBTV9TWgkJXAorCQkJKFJFVkVSQl9FTkFCTEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9NT0RFX1BBUkFNX1NaCQlcCisJCQkoUkVWRVJCX01PREVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9QUkVTRVRfUEFSQU1fU1oJCVwKKwkJCShSRVZFUkJfUFJFU0VUX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBSRVZFUkJfV0VUX01JWF9QQVJBTV9TWgkJXAorCQkJKFJFVkVSQl9XRVRfTUlYX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBSRVZFUkJfR0FJTl9BREpVU1RfUEFSQU1fU1oJXAorCQkJKFJFVkVSQl9HQUlOX0FESlVTVF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgUkVWRVJCX1JPT01fTEVWRUxfUEFSQU1fU1oJXAorCQkJKFJFVkVSQl9ST09NX0xFVkVMX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBSRVZFUkJfUk9PTV9IRl9MRVZFTF9QQVJBTV9TWglcCisJCQkoUkVWRVJCX1JPT01fSEZfTEVWRUxfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9ERUNBWV9USU1FX1BBUkFNX1NaCVwKKwkJCShSRVZFUkJfREVDQVlfVElNRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgUkVWRVJCX0RFQ0FZX0hGX1JBVElPX1BBUkFNX1NaCVwKKwkJCShSRVZFUkJfREVDQVlfSEZfUkFUSU9fUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTF9QQVJBTV9TWglcCisJCQkoUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBSRVZFUkJfUkVGTEVDVElPTlNfREVMQVlfUEFSQU1fU1oJXAorCQkJKFJFVkVSQl9SRUZMRUNUSU9OU19ERUxBWV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgUkVWRVJCX0xFVkVMX1BBUkFNX1NaCQlcCisJCQkoUkVWRVJCX0xFVkVMX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBSRVZFUkJfREVMQVlfUEFSQU1fU1oJCVwKKwkJCShSRVZFUkJfREVMQVlfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9ESUZGVVNJT05fUEFSQU1fU1oJXAorCQkJKFJFVkVSQl9ESUZGVVNJT05fUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFJFVkVSQl9ERU5TSVRZX1BBUkFNX1NaCQlcCisJCQkoUkVWRVJCX0RFTlNJVFlfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCitzdHJ1Y3QgcmV2ZXJiX3BhcmFtcyB7CisJdWludDMyX3QgZGV2aWNlOworCXVpbnQzMl90IGVuYWJsZV9mbGFnOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgcHJlc2V0OworCXVpbnQzMl90IHdldF9taXg7CisJaW50MzJfdCAgZ2Fpbl9hZGp1c3Q7CisJaW50MzJfdCAgcm9vbV9sZXZlbDsKKwlpbnQzMl90ICByb29tX2hmX2xldmVsOworCXVpbnQzMl90IGRlY2F5X3RpbWU7CisJdWludDMyX3QgZGVjYXlfaGZfcmF0aW87CisJaW50MzJfdCAgcmVmbGVjdGlvbnNfbGV2ZWw7CisJdWludDMyX3QgcmVmbGVjdGlvbnNfZGVsYXk7CisJaW50MzJfdCAgbGV2ZWw7CisJdWludDMyX3QgZGVsYXk7CisJdWludDMyX3QgZGlmZnVzaW9uOworCXVpbnQzMl90IGRlbnNpdHk7Cit9OworCisjZGVmaW5lIEJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaCVwKKwkJCShCQVNTX0JPT1NUX0VOQUJMRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgQkFTU19CT09TVF9NT0RFX1BBUkFNX1NaCVwKKwkJCShCQVNTX0JPT1NUX01PREVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIEJBU1NfQk9PU1RfU1RSRU5HVEhfUEFSQU1fU1oJXAorCQkJKEJBU1NfQk9PU1RfU1RSRU5HVEhfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCitzdHJ1Y3QgYmFzc19ib29zdF9wYXJhbXMgeworCXVpbnQzMl90IGRldmljZTsKKwl1aW50MzJfdCBlbmFibGVfZmxhZzsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IHN0cmVuZ3RoOworfTsKKworCisjZGVmaW5lIE1BWF9FUV9CQU5EUyAxMgorI2RlZmluZSBNQVhfT1NMX0VRX0JBTkRTIDUKKyNkZWZpbmUgRVFfRU5BQkxFX1BBUkFNX1NaCQkJXAorCQkJKEVRX0VOQUJMRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgRVFfQ09ORklHX1BBUkFNX1NaCQkJXAorCQkJKEVRX0NPTkZJR19QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgRVFfQ09ORklHX1BFUl9CQU5EX1BBUkFNX1NaCQlcCisJCQkoRVFfQ09ORklHX1BFUl9CQU5EX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9DT05GSUdfUEFSQU1fTUFYX0xFTgkJCShFUV9DT05GSUdfUEFSQU1fTEVOK1wKKwkJCU1BWF9FUV9CQU5EUypFUV9DT05GSUdfUEVSX0JBTkRfUEFSQU1fTEVOKQorI2RlZmluZSBFUV9DT05GSUdfUEFSQU1fTUFYX1NaCQkJXAorCQkJKEVRX0NPTkZJR19QQVJBTV9NQVhfTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIEVRX05VTV9CQU5EU19QQVJBTV9TWgkJCVwKKwkJCShFUV9OVU1fQkFORFNfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIEVRX0JBTkRfTEVWRUxTX1BBUkFNX1NaCQkJXAorCQkJKEVRX0JBTkRfTEVWRUxTX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9CQU5EX0xFVkVMX1JBTkdFX1BBUkFNX1NaCQlcCisJCQkoRVFfQkFORF9MRVZFTF9SQU5HRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgRVFfQkFORF9GUkVRU19QQVJBTV9TWgkJCVwKKwkJCShFUV9CQU5EX0ZSRVFTX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9TSU5HTEVfQkFORF9GUkVRX1JBTkdFX1BBUkFNX1NaCVwKKwkJCShFUV9TSU5HTEVfQkFORF9GUkVRX1JBTkdFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9TSU5HTEVfQkFORF9GUkVRX1BBUkFNX1NaCQlcCisJCQkoRVFfU0lOR0xFX0JBTkRfRlJFUV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgRVFfQkFORF9JTkRFWF9QQVJBTV9TWgkJCVwKKwkJCShFUV9CQU5EX0lOREVYX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9QUkVTRVRfSURfUEFSQU1fU1oJCQlcCisJCQkoRVFfUFJFU0VUX0lEX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBFUV9OVU1fUFJFU0VUU19QQVJBTV9TWgkJCVwKKwkJCShFUV9OVU1fUFJFU0VUU19QQVJBTV9MRU4qc2l6ZW9mKHVpbnQ4X3QpKQorc3RydWN0IGVxX2NvbmZpZ190IHsKKwlpbnQzMl90IGVxX3ByZWdhaW47CisJaW50MzJfdCBwcmVzZXRfaWQ7CisJdWludDMyX3QgbnVtX2JhbmRzOworfTsKK3N0cnVjdCBlcV9wZXJfYmFuZF9jb25maWdfdCB7CisJaW50MzJfdCBiYW5kX2lkeDsKKwl1aW50MzJfdCBmaWx0ZXJfdHlwZTsKKwl1aW50MzJfdCBmcmVxX21pbGxpaGVydHo7CisJaW50MzJfdCAgZ2Fpbl9taWxsaWJlbHM7CisJdWludDMyX3QgcXVhbGl0eV9mYWN0b3I7Cit9Oworc3RydWN0IGVxX3Blcl9iYW5kX2ZyZXFfcmFuZ2VfdCB7CisJdWludDMyX3QgYmFuZF9pbmRleDsKKwl1aW50MzJfdCBtaW5fZnJlcV9taWxsaWhlcnR6OworCXVpbnQzMl90IG1heF9mcmVxX21pbGxpaGVydHo7Cit9OworCitzdHJ1Y3QgZXFfcGFyYW1zIHsKKwl1aW50MzJfdCBkZXZpY2U7CisJdWludDMyX3QgZW5hYmxlX2ZsYWc7CisJc3RydWN0IGVxX2NvbmZpZ190IGNvbmZpZzsKKwlzdHJ1Y3QgZXFfcGVyX2JhbmRfY29uZmlnX3QgcGVyX2JhbmRfY2ZnW01BWF9FUV9CQU5EU107CisJc3RydWN0IGVxX3Blcl9iYW5kX2ZyZXFfcmFuZ2VfdCBwZXJfYmFuZF9mcmVxX3JhbmdlW01BWF9FUV9CQU5EU107CisJdWludDMyX3QgYmFuZF9pbmRleDsKKwl1aW50MzJfdCBmcmVxX21pbGxpaGVydHo7Cit9OworCisjZGVmaW5lIFBCRV9FTkFCTEVfUEFSQU1fU1oJXAorCQkJKFBCRV9FTkFCTEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCisjZGVmaW5lIFBCRV9DT05GSUdfUEFSQU1fU1oJXAorCQkJKFBCRV9DT05GSUdfUEFSQU1fTEVOKnNpemVvZih1aW50MTZfdCkpCitzdHJ1Y3QgcGJlX2NvbmZpZ190IHsKKwlpbnQxNl90ICByZWFsX2Jhc3NfbWl4OworCWludDE2X3QgIGJhc3NfY29sb3JfY29udHJvbDsKKwl1aW50MTZfdCBtYWluX2NoYWluX2RlbGF5OworCXVpbnQxNl90IHhvdmVyX2ZpbHRlcl9vcmRlcjsKKwl1aW50MTZfdCBiYW5kcGFzc19maWx0ZXJfb3JkZXI7CisJaW50MTZfdCAgZHJjX2RlbGF5OworCXVpbnQxNl90IHJtc190YXY7CisJaW50MTZfdCBleHBfdGhyZXNob2xkOworCXVpbnQxNl90IGV4cF9zbG9wZTsKKwlpbnQxNl90IGNvbXBfdGhyZXNob2xkOworCXVpbnQxNl90IGNvbXBfc2xvcGU7CisJdWludDE2X3QgbWFrZXVwX2dhaW47CisJdWludDMyX3QgY29tcF9hdHRhY2s7CisJdWludDMyX3QgY29tcF9yZWxlYXNlOworCXVpbnQzMl90IGV4cF9hdHRhY2s7CisJdWludDMyX3QgZXhwX3JlbGVhc2U7CisJaW50MTZfdCBsaW1pdGVyX2Jhc3NfdGhyZXNob2xkOworCWludDE2X3QgbGltaXRlcl9oaWdoX3RocmVzaG9sZDsKKwlpbnQxNl90IGxpbWl0ZXJfYmFzc19tYWtldXBfZ2FpbjsKKwlpbnQxNl90IGxpbWl0ZXJfaGlnaF9tYWtldXBfZ2FpbjsKKwlpbnQxNl90IGxpbWl0ZXJfYmFzc19nYzsKKwlpbnQxNl90IGxpbWl0ZXJfaGlnaF9nYzsKKwlpbnQxNl90ICBsaW1pdGVyX2RlbGF5OworCXVpbnQxNl90IHJlc2VydmVkOworCS8qIHBsYWNlIGhvbGRlciBmb3IgZmlsdGVyIGNvZWZmcyB0byBiZSBmb2xsb3dlZCAqLworCWludDMyX3QgcDFMb3dQYXNzQ29lZmZzWzUqMl07CisJaW50MzJfdCBwMUhpZ2hQYXNzQ29lZmZzWzUqMl07CisJaW50MzJfdCBwMUJhbmRQYXNzQ29lZmZzWzUqM107CisJaW50MzJfdCBwMUJhc3NTaGVsZkNvZWZmc1s1XTsKKwlpbnQzMl90IHAxVHJlYmxlU2hlbGZDb2VmZnNbNV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcGJlX3BhcmFtcyB7CisJdWludDMyX3QgZGV2aWNlOworCXVpbnQzMl90IGVuYWJsZV9mbGFnOworCXVpbnQzMl90IGNmZ19sZW47CisJc3RydWN0IHBiZV9jb25maWdfdCBjb25maWc7Cit9OworCisjZGVmaW5lIFNPRlRfVk9MVU1FX0VOQUJMRV9QQVJBTV9TWgkJXAorCQkJKFNPRlRfVk9MVU1FX0VOQUJMRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKKyNkZWZpbmUgU09GVF9WT0xVTUVfR0FJTl9NQVNURVJfUEFSQU1fU1oJXAorCQkJKFNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQorI2RlZmluZSBTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9TWgkJXAorCQkJKFNPRlRfVk9MVU1FX0dBSU5fMkNIX1BBUkFNX0xFTipzaXplb2YodWludDE2X3QpKQorc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyB7CisJdWludDMyX3QgZGV2aWNlOworCXVpbnQzMl90IGVuYWJsZV9mbGFnOworCXVpbnQzMl90IG1hc3Rlcl9nYWluOworCXVpbnQzMl90IGxlZnRfZ2FpbjsKKwl1aW50MzJfdCByaWdodF9nYWluOworfTsKKworc3RydWN0IG1zbV9udF9lZmZfYWxsX2NvbmZpZyB7CisJc3RydWN0IGJhc3NfYm9vc3RfcGFyYW1zIGJhc3NfYm9vc3Q7CisJc3RydWN0IHBiZV9wYXJhbXMgcGJlOworCXN0cnVjdCB2aXJ0dWFsaXplcl9wYXJhbXMgdmlydHVhbGl6ZXI7CisJc3RydWN0IHJldmVyYl9wYXJhbXMgcmV2ZXJiOworCXN0cnVjdCBlcV9wYXJhbXMgZXF1YWxpemVyOworCXN0cnVjdCBzb2Z0X3ZvbHVtZV9wYXJhbXMgc2FwbHVzX3ZvbDsKKwlzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zIHRvcG9fc3dpdGNoX3ZvbDsKK307CisKKyNlbmRpZiAvKl9NU01fQVVESU9fRUZGRUNUU19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9kZXZkZXBfcGFyYW1zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvZGV2ZGVwX3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjFlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvZGV2ZGVwX3BhcmFtcy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfREVWX0RFUF9ICisjZGVmaW5lIF9ERVZfREVQX0gKKworc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgeworCWludDMyX3QgdmVyc2lvbjsKKwlpbnQzMl90IGRldmljZV9pZDsKKwlpbnQzMl90IGJlX2lkOworCWludDMyX3QgcGFyYW1faWQ7CisJaW50MzJfdCBsZW5ndGg7CisJaW50MzJfdCBfX3VzZXIgKmRhdGE7Cit9OworCitzdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZSB7CisJaW50MzJfdCBkbWlkOworCWludDMyX3QgbGljZW5zZV9rZXk7Cit9OworCisjZGVmaW5lIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNXAorCQlfSU9XUignVScsIDB4MTAsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKQorI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9QQVJBTVwKKwkJX0lPUignVScsIDB4MTEsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKQorI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EXAorCQlfSU9XUignVScsIDB4MTMsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKQorI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFXAorCQlfSU9XUignVScsIDB4MTQsIHN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlKQorI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSXAorCQlfSU9SKCdVJywgMHgxNSwgc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEpCisKKyNkZWZpbmUgRFRTX0VBR0xFX01PRFVMRQkJCTB4MDAwMDUwMDAKKyNkZWZpbmUgRFRTX0VBR0xFX01PRFVMRV9FTkFCTEUJCQkweDAwMDA1MDAxCisjZGVmaW5lIEVBR0xFX0RSSVZFUl9JRAkJCQkweEYyCisjZGVmaW5lIERUU19FQUdMRV9JT0NUTF9HRVRfQ0FDSEVfU0laRQkJX0lPUihFQUdMRV9EUklWRVJfSUQsIDAsIGludCkKKyNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9TSVpFCQlfSU9XKEVBR0xFX0RSSVZFUl9JRCwgMSwgaW50KQorI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfR0VUX1BBUkFNCQlfSU9SKEVBR0xFX0RSSVZFUl9JRCwgMiwgdm9pZCopCisjZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRVRfUEFSQU0JCV9JT1coRUFHTEVfRFJJVkVSX0lELCAzLCB2b2lkKikKKyNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9CTE9DSwkJX0lPVyhFQUdMRV9EUklWRVJfSUQsIDQsIHZvaWQqKQorI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfU0VUX0FDVElWRV9ERVZJQ0UJX0lPVyhFQUdMRV9EUklWRVJfSUQsIDUsIHZvaWQqKQorI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfR0VUX0xJQ0VOU0UJCV9JT1IoRUFHTEVfRFJJVkVSX0lELCA2LCB2b2lkKikKKyNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX1NFVF9MSUNFTlNFCQlfSU9XKEVBR0xFX0RSSVZFUl9JRCwgNywgdm9pZCopCisjZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRU5EX0xJQ0VOU0UJCV9JT1coRUFHTEVfRFJJVkVSX0lELCA4LCBpbnQpCisjZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRVRfVk9MVU1FX0NPTU1BTkRTCV9JT1coRUFHTEVfRFJJVkVSX0lELCA5LCB2b2lkKikKKyNkZWZpbmUgRFRTX0VBR0xFX0ZMQUdfSU9DVExfUFJFCQkoMTw8MzApCisjZGVmaW5lIERUU19FQUdMRV9GTEFHX0lPQ1RMX0pVU1RTRVRDQUNIRQkoMTw8MzEpCisjZGVmaW5lIERUU19FQUdMRV9GTEFHX0lPQ1RMX0dFVEZST01DT1JFICAgICAgIERUU19FQUdMRV9GTEFHX0lPQ1RMX0pVU1RTRVRDQUNIRQorI2RlZmluZSBEVFNfRUFHTEVfRkxBR19JT0NUTF9NQVNLCQkofihEVFNfRUFHTEVfRkxBR19JT0NUTF9QUkUgfCBcCisJCQkJCSAgICAgRFRTX0VBR0xFX0ZMQUdfSU9DVExfSlVTVFNFVENBQ0hFKSkKKyNkZWZpbmUgRFRTX0VBR0xFX0ZMQUdfQUxTQV9HRVQJCQkoMTw8MzEpCisKK3N0cnVjdCBkdHNfZWFnbGVfcGFyYW1fZGVzYyB7CisJdWludDMyX3QgaWQ7CisJdWludDMyX3Qgc2l6ZTsKKwlpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBkZXZpY2U7Cit9IF9fcGFja2VkOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9sc21fcGFyYW1zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvbHNtX3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmRjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvbHNtX3BhcmFtcy5oCkBAIC0wLDAgKzEsMTc1IEBACisjaWZuZGVmIF9VQVBJX0xTTV9QQVJBTVNfSF9fCisjZGVmaW5lIF9VQVBJX0xTTV9QQVJBTVNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorCisjZGVmaW5lIFNORFJWX0xTTV9WRVJTSU9OIFNORFJWX1BST1RPQ09MX1ZFUlNJT04oMCwgMSwgMCkKKworI2RlZmluZSBMU01fT1VUX0ZPUk1BVF9QQ00gKDApCisjZGVmaW5lIExTTV9PVVRfRk9STUFUX0FEUENNICgxIDw8IDApCisKKyNkZWZpbmUgTFNNX09VVF9EQVRBX1JBVyAoMCkKKyNkZWZpbmUgTFNNX09VVF9EQVRBX1BBQ0tFRCAoMSkKKworI2RlZmluZSBMU01fT1VUX0RBVEFfRVZFTlRTX0RJU0FCTEVEICgwKQorI2RlZmluZSBMU01fT1VUX0RBVEFfRVZFTlRTX0VOQUJMRUQgKDEpCisKKyNkZWZpbmUgTFNNX09VVF9UUkFOU0ZFUl9NT0RFX1JUICgwKQorI2RlZmluZSBMU01fT1VUX1RSQU5TRkVSX01PREVfRlRSVCAoMSkKKworZW51bSBsc21fYXBwX2lkIHsKKwlMU01fVk9JQ0VfV0FLRVVQX0FQUF9JRCA9IDEsCisJTFNNX1ZPSUNFX1dBS0VVUF9BUFBfSURfVjIgPSAyLAorfTsKKworZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgeworCUxTTV9NT0RFX0tFWVdPUkRfT05MWV9ERVRFQ1RJT04gPSAxLAorCUxTTV9NT0RFX1VTRVJfS0VZV09SRF9ERVRFQ1RJT04KK307CisKK2VudW0gbHNtX3Z3X3N0YXR1cyB7CisJTFNNX1ZPSUNFX1dBS0VVUF9TVEFUVVNfUlVOTklORyA9IDEsCisJTFNNX1ZPSUNFX1dBS0VVUF9TVEFUVVNfREVURUNURUQsCisJTFNNX1ZPSUNFX1dBS0VVUF9TVEFUVVNfRU5EX1NQRUVDSCwKKwlMU01fVk9JQ0VfV0FLRVVQX1NUQVRVU19SRUpFQ1RFRAorfTsKKworZW51bSBMU01fUEFSQU1fVFlQRSB7CisJTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQgPSAwLAorCUxTTV9PUEVSQVRJT05fTU9ERSwKKwlMU01fR0FJTiwKKwlMU01fTUlOX0NPTkZJREVOQ0VfTEVWRUxTLAorCUxTTV9SRUdfU05EX01PREVMLAorCUxTTV9ERVJFR19TTkRfTU9ERUwsCisJTFNNX0NVU1RPTV9QQVJBTVMsCisJLyogZHJpdmVyIGlvY3RsIHdpbGwgcGFyc2Ugb25seSBzbyBtYW55IHBhcmFtcyAqLworCUxTTV9QQVJBTVNfTUFYLAorfTsKKworLyoKKyAqIERhdGEgZm9yIExTTV9FTkRQT0lOVF9ERVRFQ1RfVEhSRVNIT0xEIHBhcmFtX3R5cGUKKyAqIEBlcGRfYmVnaW46IEJlZ2luIHRocmVzaG9sZAorICogQGVwZF9lbmQ6IEVuZCB0aHJlc2hvbGQKKyAqLworc3RydWN0IHNuZF9sc21fZXBfZGV0X3RocmVzIHsKKwlfX3UzMiBlcGRfYmVnaW47CisJX191MzIgZXBkX2VuZDsKK307CisKKy8qCisgKiBEYXRhIGZvciBMU01fT1BFUkFUSU9OX01PREUgcGFyYW1fdHlwZQorICogQG1vZGU6IFRoZSBkZXRlY3Rpb24gbW9kZSB0byBiZSB1c2VkCisgKiBAZGV0ZWN0X2ZhaWx1cmU6IFNldHRpbmcgdG8gZW5hYmxlIGZhaWx1cmUgZGV0ZWN0aW9ucy4KKyAqLworc3RydWN0IHNuZF9sc21fZGV0ZWN0X21vZGUgeworCWVudW0gbHNtX2RldGVjdGlvbl9tb2RlIG1vZGU7CisJYm9vbCBkZXRlY3RfZmFpbHVyZTsKK307CisKKy8qCisgKiBEYXRhIGZvciBMU01fR0FJTiBwYXJhbV90eXBlCisgKiBAZ2FpbjogVGhlIGdhaW4gdG8gYmUgYXBwbGllZCBvbiBMU00KKyAqLworc3RydWN0IHNuZF9sc21fZ2FpbiB7CisJX191MTYgZ2FpbjsKK307CisKKworc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIgeworCV9fdTggX191c2VyICpkYXRhOworCV9fdTggKmNvbmZpZGVuY2VfbGV2ZWw7CisJX191MzIgZGF0YV9zaXplOworCWVudW0gbHNtX2RldGVjdGlvbl9tb2RlIGRldGVjdGlvbl9tb2RlOworCV9fdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Cit9OworCitzdHJ1Y3Qgc25kX2xzbV9zZXNzaW9uX2RhdGEgeworCWVudW0gbHNtX2FwcF9pZCBhcHBfaWQ7Cit9OworCitzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgeworCV9fdTE2IHN0YXR1czsKKwlfX3UxNiBwYXlsb2FkX3NpemU7CisJX191OCBwYXlsb2FkWzBdOworfTsKKworc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyB7CisJX191OCAqY29uZl9sZXZlbDsKKwllbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBkZXRlY3RfbW9kZTsKKwlfX3U4IG51bV9jb25maWRlbmNlX2xldmVsczsKKwlib29sIGRldGVjdF9mYWlsdXJlOworfTsKKworLyoKKyAqIFBhcmFtIGluZm8gZm9yIGVhY2ggcGFyYW1ldGVyIHR5cGUKKyAqIEBtb2R1bGVfaWQ6IE1vZHVsZSB0byB3aGljaCBwYXJhbWV0ZXIgaXMgdG8gYmUgc2V0CisgKiBAcGFyYW1faWQ6IFBhcmFtZXRlciB0aGF0IGlzIHRvIGJlIHNldAorICogQHBhcmFtX3NpemU6IHNpemUgKGluIG51bWJlciBvZiBieXRlcykgZm9yIHRoZSBkYXRhCisgKgkJaW4gcGFyYW1fZGF0YS4KKyAqCQlGb3IgY29uZmlkZW5jZSBsZXZlbHMsIHRoaXMgaXMgbnVtX2NvbmZfbGV2ZWxzCisgKgkJRm9yIFJFR19TTkRfTU9ERUwsIHRoaXMgaXMgc2l6ZSBvZiBzb3VuZCBtb2RlbAorICoJCUZvciBDVVNUT01fUEFSQU1TLCB0aGlzIGlzIHNpemUgb2YgdGhlIGVudGlyZSBibG9iIG9mIGRhdGEKKyAqIEBwYXJhbV9kYXRhOiBEYXRhIGZvciB0aGUgcGFyYW1ldGVyLgorICoJCUZvciBzb21lIHBhcmFtX3R5cGVzIHRoaXMgaXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCwgZXg6IExTTV9HQUlOCisgKgkJRm9yIENPTkZJREVOQ0VfTEVWRUxTLCB0aGlzIGlzIGFycmF5IG9mIGNvbmZpZGVuY2UgbGV2ZWxzCisgKgkJRm9yIFJFR19TTkRfTU9ERUwsIHRoaXMgaXMgdGhlIHNvdW5kIG1vZGVsIGRhdGEKKyAqCQlGb3IgQ1VTVE9NX1BBUkFNUywgdGhpcyBpcyB0aGUgYmxvYiBvZiBjdXN0b20gZGF0YS4KKyAqLworc3RydWN0IGxzbV9wYXJhbXNfaW5mbyB7CisJX191MzIgbW9kdWxlX2lkOworCV9fdTMyIHBhcmFtX2lkOworCV9fdTMyIHBhcmFtX3NpemU7CisJX191OCBfX3VzZXIgKnBhcmFtX2RhdGE7CisJZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlOworfTsKKworLyoKKyAqIERhdGEgcGFzc2VkIHRvIHRoZSBTRVRfUEFSQU1fVjIgSU9DVEwKKyAqIEBudW1fcGFyYW1zOiBOdW1iZXIgb2YgcGFyYW1zIHRoYXQgYXJlIHRvIGJlIHNldAorICoJCXNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIExTTV9QQVJBTVNfTUFYCisgKiBAcGFyYW1zOiBQb2ludHMgdG8gYW4gYXJyYXkgb2YgbHNtX3BhcmFtc19pbmZvCisgKgkgICAgRWFjaCBlbnRyeSBwb2ludHMgdG8gb25lIHBhcmFtZXRlciB0byBzZXQKKyAqIEBkYXRhX3NpemU6IHNpemUgKGluIGJ5dGVzKSBmb3IgcGFyYW1zCisgKgkgICAgICAgc2hvdWxkIGJlIGVxdWFsIHRvCisgKgkgICAgICAgbnVtX3BhcmFtcyAqIHNpemVvZihzdHJ1Y3QgbHNtX3Bhcm1zX2luZm8pCisgKi8KK3N0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgeworCV9fdTggX191c2VyICpwYXJhbXM7CisJX191MzIgbnVtX3BhcmFtczsKKwlfX3UzMiBkYXRhX3NpemU7Cit9OworCisvKgorICogRGF0YSBwYXNzZWQgdG8gTFNNX09VVF9GT1JNQVRfQ0ZHIElPQ1RMCisgKiBAZm9ybWF0OiBUaGUgbWVkaWEgZm9ybWF0IGVudW0KKyAqIEBwYWNraW5nOiBpbmRpY2F0ZXMgdGhlIHBhY2tpbmcgbWV0aG9kIHVzZWQgZm9yIGRhdGEgcGF0aAorICogQGV2ZW50czogaW5kaWNhdGVzIHdoZXRoZXIgZGF0YSBwYXRoIGV2ZW50cyBuZWVkIHRvIGJlIGVuYWJsZWQKKyAqIEB0cmFuc2Zlcl9tb2RlOiBpbmRpY2F0ZXMgd2hldGhlciBGVFJUIG1vZGUgb3IgUlQgbW9kZS4KKyAqLworc3RydWN0IHNuZF9sc21fb3V0cHV0X2Zvcm1hdF9jZmcgeworCV9fdTggZm9ybWF0OworCV9fdTggcGFja2luZzsKKwlfX3U4IGV2ZW50czsKKwlfX3U4IG1vZGU7Cit9OworCisjZGVmaW5lIFNORFJWX0xTTV9ERVJFR19TTkRfTU9ERUwgX0lPVygnVScsIDB4MDEsIGludCkKKyNkZWZpbmUgU05EUlZfTFNNX0VWRU5UX1NUQVRVUwlfSU9XKCdVJywgMHgwMiwgc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKQorI2RlZmluZSBTTkRSVl9MU01fQUJPUlRfRVZFTlQJX0lPVygnVScsIDB4MDMsIGludCkKKyNkZWZpbmUgU05EUlZfTFNNX1NUQVJUCQlfSU9XKCdVJywgMHgwNCwgaW50KQorI2RlZmluZSBTTkRSVl9MU01fU1RPUAkJX0lPVygnVScsIDB4MDUsIGludCkKKyNkZWZpbmUgU05EUlZfTFNNX1NFVF9TRVNTSU9OX0RBVEEgX0lPVygnVScsIDB4MDYsIHN0cnVjdCBzbmRfbHNtX3Nlc3Npb25fZGF0YSkKKyNkZWZpbmUgU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjIgX0lPVygnVScsIDB4MDcsXAorCQkJCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikKKyNkZWZpbmUgU05EUlZfTFNNX0xBQl9DT05UUk9MCV9JT1coJ1UnLCAweDA4LCB1aW50MzJfdCkKKyNkZWZpbmUgU05EUlZfTFNNX1NUT1BfTEFCCV9JTygnVScsIDB4MDkpCisjZGVmaW5lIFNORFJWX0xTTV9TRVRfUEFSQU1TCV9JT1coJ1UnLCAweDBBLCBcCisJCQkJCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMpCisjZGVmaW5lIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNUwlfSU9XKCdVJywgMHgwQiwgXAorCQkJCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zKQorI2RlZmluZSBTTkRSVl9MU01fT1VUX0ZPUk1BVF9DRkcgX0lPVygnVScsIDB4MEMsIFwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2xzbV9vdXRwdXRfZm9ybWF0X2NmZykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvbXNtY2FsLWh3ZGVwLmggYi9pbmNsdWRlL3VhcGkvc291bmQvbXNtY2FsLWh3ZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9zb3VuZC9tc21jYWwtaHdkZXAuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX0NBTElCX0hXREVQX0gKKyNkZWZpbmUgX0NBTElCX0hXREVQX0gKKworI2RlZmluZSBXQ0Q5WFhYX0NPREVDX0hXREVQX05PREUgICAgMTAwMAorZW51bSB3Y2RfY2FsX3R5cGUgeworCVdDRDlYWFhfTUlOX0NBTCwKKwlXQ0Q5WFhYX0FOQ19DQUwgPSBXQ0Q5WFhYX01JTl9DQUwsCisJV0NEOVhYWF9NQURfQ0FMLAorCVdDRDlYWFhfTUJIQ19DQUwsCisJV0NEOVhYWF9WQkFUX0NBTCwKKwlXQ0Q5WFhYX01BWF9DQUwsCit9OworCitzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlciB7CisJX191MzIgc2l6ZTsKKwlfX3U4IF9fdXNlciAqYnVmZmVyOworCWVudW0gd2NkX2NhbF90eXBlIGNhbF90eXBlOworfTsKKworI2RlZmluZSBTTkRSVl9DVExfSU9DVExfSFdERVBfQ0FMX1RZUEUgXAorCV9JT1coJ1UnLCAweDEsIHN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyKQorCisjZW5kaWYgLypfQ0FMSUJfSFdERVBfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvd2NkLWRzcC1nbGluay5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL3djZC1kc3AtZ2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQxMjhkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL3djZC1kc3AtZ2xpbmsuaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIF9XQ0RfRFNQX0dMSU5LX0gKKyNkZWZpbmUgX1dDRF9EU1BfR0xJTktfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBXRFNQX0NIX05BTUVfTUFYX0xFTiA1MAorCitlbnVtIHsKKwlXRFNQX1JFR19QS1QgPSAxLAorCVdEU1BfQ01EX1BLVCwKKwlXRFNQX1JFQURZX1BLVCwKK307CisjZGVmaW5lIFdEU1BfUkVBRFlfUEtUIFdEU1BfUkVBRFlfUEtUCisKKy8qCisgKiBzdHJ1Y3Qgd2RzcF9yZWdfcGt0IC0gIEdsaW5rIGNoYW5uZWwgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvcm1hdAorICogQG5vX29mX2NoYW5uZWxzOiAgIE51bWJlciBvZiBnbGluayBjaGFubmVscyB0byBvcGVuCisgKiBAcGF5bG9hZFswXTogICAgICAgRHluYW1pYyBhcnJheSBjb250YWlucyBhbGwgdGhlIGdsaW5rIGNoYW5uZWxzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCB3ZHNwX3JlZ19wa3QgeworCV9fdTggbm9fb2ZfY2hhbm5lbHM7CisJX191OCBwYXlsb2FkWzBdOworfTsKKworLyoKKyAqIHN0cnVjdCB3ZHNwX2NtZF9wa3QgLSBXRFNQIGNvbW1hbmQgcGFja2V0IGZvcm1hdAorICogQGNoX25hbWU6ICAgICAgICAgTmFtZSBvZiB0aGUgZ2xpbmsgY2hhbm5lbAorICogQHBheWxvYWRfc2l6ZTogICAgU2l6ZSBvZiB0aGUgcGF5bG9hZAorICogQHBheWxvYWRbMF06ICAgICAgQWN0dWFsIGRhdGEgcGF5bG9hZAorICovCitzdHJ1Y3Qgd2RzcF9jbWRfcGt0IHsKKwljaGFyIGNoX25hbWVbV0RTUF9DSF9OQU1FX01BWF9MRU5dOworCV9fdTMyIHBheWxvYWRfc2l6ZTsKKwlfX3U4IHBheWxvYWRbMF07Cit9OworCisvKgorICogc3RydWN0IHdkc3Bfd3JpdGVfcGt0IC0gRm9ybWF0IHRoYXQgdXNlcnNwYWNlIHNlbmQgdGhlIGRhdGEgdG8gZHJpdmVyLgorICogQHBrdF90eXBlOiAgICAgIFR5cGUgb2YgdGhlIHBhY2tldChSRUcgb3IgQ01EIFBLVCkKKyAqIEBwYXlsb2FkWzBdOiAgICBQYXlsb2FkIGlzIGVpdGhlciBjbWQgb3IgcmVnIHBrdCBzdHJ1Y3R1cmUgYmFzZWQgb24gcGt0IHR5cGUKKyAqLworc3RydWN0IHdkc3Bfd3JpdGVfcGt0IHsKKwlfX3U4IHBrdF90eXBlOworCV9fdTggcGF5bG9hZFswXTsKK307CisKKy8qCisgKiBzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcgLSBEZWZpbmVzIHRoZSBnbGluayBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCisgKiBAY2hfbmFtZTogICAgICAgICAgIE5hbWUgb2YgdGhlIGdsaW5rIGNoYW5uZWwKKyAqIEBsYXRlbmN5X2luX3VzOiAgICAgTGF0ZW5jeSBzcGVjaWZpZWQgaW4gbWljcm8gc2Vjb25kcyBmb3IgUU9TCisgKiBAbm9fb2ZfaW50ZW50czogICAgIE51bWJlciBvZiBpbnRlbnRzIHByZXF1ZXVlZAorICogQGludGVudHNfc2l6ZVswXTogICBEeW5hbWljIGFycmF5IHRvIHNwZWNpZnkgc2l6ZSBvZiBlYWNoIGludGVudAorICovCitzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcgeworCWNoYXIgbmFtZVtXRFNQX0NIX05BTUVfTUFYX0xFTl07CisJX191MzIgbGF0ZW5jeV9pbl91czsKKwlfX3UzMiBub19vZl9pbnRlbnRzOworCV9fdTMyIGludGVudHNfc2l6ZVswXTsKK307CisjZW5kaWYgLyogX1dDRF9EU1BfR0xJTktfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwppbmRleCAxODJkOTJlLi4yMmIzMDczIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvS2NvbmZpZwpAQCAtNTQsNiArNTQsNyBAQAogc291cmNlICJzb3VuZC9zb2MvaW1nL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9pbnRlbC9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvbWVkaWF0ZWsvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL21zbS9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvbXhzL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9weGEvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3Fjb20vS2NvbmZpZyIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9NYWtlZmlsZQppbmRleCA5YTMwZjIxLi4xNDY2MDc1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL01ha2VmaWxlCkBAIC0zMSw2ICszMSw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gaW1nLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IGludGVsLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG1lZGlhdGVrLworb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG1zbS8KIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBteHMvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbnVjOTAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG9tYXAvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggYzY3NjY3Yi4uOTY4NWIwMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtODc1LDYgKzg3NSw3MSBAQAogY29uZmlnIFNORF9TT0NfVURBMTM4MAogICAgICAgICB0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19XQ0Q5MzRYX0RTRAorICAgICAgICB0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XQ0Q5MzIwCisgICAgICAgIHRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1dDRDkzMzAKKyAgICAgICAgdHJpc3RhdGUKKwlkZXBlbmRzIG9uIFdDRDkzMzBfQ09ERUMKKworY29uZmlnIFNORF9TT0NfV0NEOTMzNQorICAgICAgICB0cmlzdGF0ZQorCWRlcGVuZHMgb24gV0NEOTMzNV9DT0RFQworCitjb25maWcgU05EX1NPQ19XQ0Q5MzRYCisgICAgICAgIHRyaXN0YXRlCisJZGVwZW5kcyBvbiBXQ0Q5MzRYX0NPREVDCisJc2VsZWN0IFNORF9TT0NfV0NEOVhYWF9WMgorCXNlbGVjdCBBVURJT19FWFRfQ0xLCisJc2VsZWN0IFNORF9TT0NfV0NEX0RTUF9NR1IKKwlzZWxlY3QgU05EX1NPQ19XQ0RfU1BJCisJc2VsZWN0IFNORF9TT0NfV0NEOTM0WF9NQkhDCisgICAgICAgIHNlbGVjdCBTTkRfU09DX1dDRDkzNFhfRFNECisKK2NvbmZpZyBTTkRfU09DX1dDRDkzNFhfTUJIQworICAgICAgICB0cmlzdGF0ZQorCWRlcGVuZHMgb24gU05EX1NPQ19XQ0Q5MzRYCisJc2VsZWN0IFNORF9TT0NfV0NEX01CSEMKKworY29uZmlnIFNORF9TT0NfV1NBODgxWAorICAgICAgICB0cmlzdGF0ZQorCXNlbGVjdCBNU01fQ0RDX1BJTkNUUkwKKwlzZWxlY3QgUkVHTUFQX1NXUgorCitjb25maWcgU05EX1NPQ19XU0E4ODFYX0FOQUxPRworICAgICAgICB0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBTTkRfU09DX1dDRDlYWFgKKwl0cmlzdGF0ZQorCWRlZmF1bHQgeSBpZiBTTkRfU09DX1dDRDkzMjA9eSB8fCBTTkRfU09DX1dDRDkzMzA9eSB8fCBTTkRfU09DX1dDRDkzMzU9eQorCitjb25maWcgU05EX1NPQ19XQ0Q5WFhYX1YyCisJdHJpc3RhdGUKKwlkZWZhdWx0IHkgaWYgU05EX1NPQ19XQ0Q5MzM1PXkKKworY29uZmlnIFNORF9TT0NfV0NEX0NQRQorCXRyaXN0YXRlCisJZGVmYXVsdCB5IGlmIFNORF9TT0NfV0NEOTMzMD15IHx8IFNORF9TT0NfV0NEOTMzNT15CisKK2NvbmZpZyBBVURJT19FWFRfQ0xLCisJdHJpc3RhdGUKKwlkZWZhdWx0IHkgaWYgU05EX1NPQ19XQ0Q5MzM1PXkgfHwgU05EX1NPQ19XQ0Q5MzMwPXkgfHwgU05EX1NPQ19NU004WDE2X1dDRD15CisKK2NvbmZpZyBTTkRfU09DX1dDRF9NQkhDCisJdHJpc3RhdGUKKwlkZWZhdWx0IHkgaWYgKFNORF9TT0NfTVNNODkwOV9XQ0Q9eSB8fCBTTkRfU09DX01TTThYMTZfV0NEPXkgfHwgU05EX1NPQ19XQ0Q5MzM1PXkpICYmIFNORF9TT0NfTURNQ0FMSUZPUk5JVU0hPXkKKworY29uZmlnIFNORF9TT0NfV0NEX0RTUF9NR1IKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XQ0RfU1BJCisJZGVwZW5kcyBvbiBDT05GSUdfU1BJCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfV0wxMjczCiAJdHJpc3RhdGUKIApAQCAtMTA4OSw0ICsxMTU0LDE2IEBACiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRQQTYxMzBBMiBoZWFkcGhvbmUgYW1wbGlmaWVyIgogCWRlcGVuZHMgb24gSTJDCiAKK2NvbmZpZyBTTkRfU09DX01TTV9TVFVCCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfTVNNX0hETUlfQ09ERUNfUlgKKwlib29sICJIRE1JIEF1ZGlvIFBsYXliYWNrIgorCWRlcGVuZHMgb24gRkJfTVNNX01EU1NfSERNSV9QQU5FTCAmJiAoU05EX1NPQ19BUFE4MDg0IHx8IFNORF9TT0NfTVNNODk5NCB8fCBTTkRfU09DX01TTTg5OTYgfHwgU05EX1NPQ19NU004OTk4KQorCWhlbHAKKwlIRE1JIGF1ZGlvIGRyaXZlcnMgc2hvdWxkIGJlIGJ1aWx0IG9ubHkgaWYgdGhlIHBsYXRmb3JtCisgICAgICAgIHN1cHBvcnRzIGhkbWkgcGFuZWwuCisKK3NvdXJjZSAic291bmQvc29jL2NvZGVjcy9tc204eDE2L0tjb25maWciCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IDk1OGNkNDkuLjY0OGJkMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMTU4LDYgKzE1OCwyNyBAQAogc25kLXNvYy10d2w2MDQwLW9ianMgOj0gdHdsNjA0MC5vCiBzbmQtc29jLXVkYTEzNHgtb2JqcyA6PSB1ZGExMzR4Lm8KIHNuZC1zb2MtdWRhMTM4MC1vYmpzIDo9IHVkYTEzODAubworc25kLXNvYy13Y2Q5MzIwLW9ianMgOj0gd2NkOTMyMC5vIHdjZDkzMjAtdGFibGVzLm8KK3NuZC1zb2Mtd2NkOTMzMC1vYmpzIDo9IHdjZDkzMzAubyB3Y2Q5MzMwLXRhYmxlcy5vCitzbmQtc29jLXdjZDkzMzUtb2JqcyA6PSB3Y2Q5MzM1Lm8KK3NuZC1zb2Mtd2NkOTM0eC1vYmpzIDo9IHdjZDkzNHgubworc25kLXNvYy13Y2Q5eHh4LW9ianMgOj0gd2NkOXh4eC1yZXNtZ3IubyB3Y2Q5eHh4LW1iaGMubyB3Y2Q5eHh4LWNvbW1vbi5vIHdjZGNhbC1od2RlcC5vCitzbmQtc29jLXdjZDl4eHgtdjItb2JqcyA6PSB3Y2Q5eHh4LWNvbW1vbi12Mi5vIHdjZDl4eHgtcmVzbWdyLXYyLm8KK2lmZXEgKCQoQ09ORklHX0NPTU1PTl9DTEtfTVNNKSwgeSkKKwlhdWRpby1leHQtY2xvY2stb2JqcyA6PSBhdWRpby1leHQtY2xrLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0NPTU1PTl9DTEtfUUNPTSksIHkpCisJYXVkaW8tZXh0LWNsb2NrLXVwLW9ianMgOj0gYXVkaW8tZXh0LWNsay11cC5vCitlbmRpZgorc25kLXNvYy13Y2QtY3BlLW9ianMgOj0gd2NkX2NwZV9zZXJ2aWNlcy5vIHdjZF9jcGVfY29yZS5vCitzbmQtc29jLXdzYTg4MXgtb2JqcyA6PSB3c2E4ODF4Lm8gd3NhODgxeC10YWJsZXMubyB3c2E4ODF4LXJlZ21hcC5vIHdzYTg4MXgtdGVtcC1zZW5zb3Iubworc25kLXNvYy13Y2QtbWJoYy1vYmpzIDo9IHdjZC1tYmhjLXYyLm8KK3NuZC1zb2Mtd3NhODgxeC1hbmFsb2ctb2JqcyA6PSB3c2E4ODF4LWFuYWxvZy5vIHdzYTg4MXgtdGFibGVzLWFuYWxvZy5vCitzbmQtc29jLXdzYTg4MXgtYW5hbG9nLW9ianMgKz0gd3NhODgxeC1yZWdtYXAtYW5hbG9nLm8gd3NhODgxeC1pcnEubworc25kLXNvYy13Y2QtZHNwLXV0aWxzLW9ianMgOj0gd2NkLWRzcC11dGlscy5vCitzbmQtc29jLXdjZC1kc3AtbWdyLW9ianMgOj0gd2NkLWRzcC1tZ3Iubworc25kLXNvYy13Y2Qtc3BpLW9ianMgOj0gd2NkLXNwaS5vCiBzbmQtc29jLXdsMTI3My1vYmpzIDo9IHdsMTI3My5vCiBzbmQtc29jLXdtLWFkc3Atb2JqcyA6PSB3bV9hZHNwLm8KIHNuZC1zb2Mtd20wMDEwLW9ianMgOj0gd20wMDEwLm8KQEAgLTIxNCw2ICsyMzUsOCBAQAogc25kLXNvYy13bTk3MTItb2JqcyA6PSB3bTk3MTIubwogc25kLXNvYy13bTk3MTMtb2JqcyA6PSB3bTk3MTMubwogc25kLXNvYy13bS1odWJzLW9ianMgOj0gd21faHVicy5vCitzbmQtc29jLW1zbS1zdHViLW9ianMgOj0gbXNtX3N0dWIubworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNX0hETUlfQ09ERUNfUlgpIDo9IG1zbV9oZG1pX2NvZGVjX3J4Lm8KIAogIyBBbXAKIHNuZC1zb2MtbWF4OTg3Ny1vYmpzIDo9IG1heDk4NzcubwpAQCAtMzc5LDcgKzQwMiwyNSBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfVFdMNjA0MCkJKz0gc25kLXNvYy10d2w2MDQwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1VEQTEzNFgpCSs9IHNuZC1zb2MtdWRhMTM0eC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19VREExMzgwKQkrPSBzbmQtc29jLXVkYTEzODAubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEOTMyMCkJKz0gc25kLXNvYy13Y2Q5MzIwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dDRDkzMzApCSs9IHNuZC1zb2Mtd2NkOTMzMC5vCitvYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5MzM1KQkrPSBzbmQtc29jLXdjZDkzMzUubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEOTM0WCkJKz0gd2NkOTM0eC8KK2lmZXEgKCQoQ09ORklHX0NPTU1PTl9DTEtfTVNNKSwgeSkKKwlvYmotJChDT05GSUdfQVVESU9fRVhUX0NMSykJKz0gYXVkaW8tZXh0LWNsb2NrLm8KK2VuZGlmCitpZmVxICgkKENPTkZJR19DT01NT05fQ0xLX1FDT00pLCB5KQorCW9iai0kKENPTkZJR19BVURJT19FWFRfQ0xLKSAgICAgKz0gYXVkaW8tZXh0LWNsb2NrLXVwLm8KK2VuZGlmCitvYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5WFhYKSAgICs9IHNuZC1zb2Mtd2NkOXh4eC5vCitvYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5WFhYX1YyKSArPSBzbmQtc29jLXdjZDl4eHgtdjIubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEX0NQRSkgICArPSBzbmQtc29jLXdjZC1jcGUubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEX01CSEMpICArPSBzbmQtc29jLXdjZC1tYmhjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dTQTg4MVgpCSs9IHNuZC1zb2Mtd3NhODgxeC5vCitvYmotJChDT05GSUdfU05EX1NPQ19XU0E4ODFYX0FOQUxPRykJKz0gc25kLXNvYy13c2E4ODF4LWFuYWxvZy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTDEyNzMpCSs9IHNuZC1zb2Mtd2wxMjczLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dDRF9EU1BfTUdSKQkrPSBzbmQtc29jLXdjZC1kc3AtbWdyLm8gc25kLXNvYy13Y2QtZHNwLXV0aWxzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dDRF9TUEkpICArPSBzbmQtc29jLXdjZC1zcGkubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV00wMDEwKQkrPSBzbmQtc29jLXdtMDAxMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTEyNTBfRVYxKSArPSBzbmQtc29jLXdtMTI1MC1ldjEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV00yMDAwKQkrPSBzbmQtc29jLXdtMjAwMC5vCkBAIC00MzUsOCArNDc2LDEwIEBACiBvYmotJChDT05GSUdfU05EX1NPQ19XTTk3MTMpCSs9IHNuZC1zb2Mtd205NzEzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNX0FEU1ApCSs9IHNuZC1zb2Mtd20tYWRzcC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTV9IVUJTKQkrPSBzbmQtc29jLXdtLWh1YnMubworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNX1NUVUIpICArPSBzbmQtc29jLW1zbS1zdHViLm8KIAogIyBBbXAKIG9iai0kKENPTkZJR19TTkRfU09DX01BWDk4NzcpCSs9IHNuZC1zb2MtbWF4OTg3Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODUwNCkJKz0gc25kLXNvYy1tYXg5ODUwNC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UUEE2MTMwQTIpCSs9IHNuZC1zb2MtdHBhNjEzMGEyLm8KK29iai15ICs9IG1zbTh4MTYvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGVmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuYwpAQCAtMCwwICsxLDU3NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2RyaXZlcnMvY2xrL3Fjb20vY29tbW9uLmgiCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9hdWRpby1leHQtY2xrLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KKworZW51bSBhdWRpb19jbGtfbXV4IHsKKwlBUF9DTEsyLAorCUxQQVNTX01DTEssCisJTFBBU1NfTUNMSzIsCit9OworCitzdHJ1Y3QgcGluY3RybF9pbmZvIHsKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqc2xlZXA7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKmFjdGl2ZTsKK307CisKK3N0cnVjdCBhdWRpb19leHRfYXBfY2xrIHsKKwlib29sIGVuYWJsZWQ7CisJaW50IGdwaW87CisJc3RydWN0IGNsa19maXhlZF9mYWN0b3IgZmFjdDsKK307CisKK3N0cnVjdCBhdWRpb19leHRfcG1pX2NsayB7CisJaW50IGdwaW87CisJc3RydWN0IGNsa19maXhlZF9mYWN0b3IgZmFjdDsKK307CisKK3N0cnVjdCBhdWRpb19leHRfYXBfY2xrMiB7CisJYm9vbCBlbmFibGVkOworCXN0cnVjdCBwaW5jdHJsX2luZm8gcG5jdHJsX2luZm87CisJc3RydWN0IGNsa19maXhlZF9mYWN0b3IgZmFjdDsKK307CisKK3N0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayB7CisJc3RydWN0IHBpbmN0cmxfaW5mbyBwbmN0cmxfaW5mbzsKKwlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBmYWN0OworfTsKKworc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBjbGsyX2NvbmZpZyA9IHsKKwlRNkFGRV9MUEFTU19DTEtfQ09ORklHX0FQSV9WRVJTSU9OLAorCVE2QUZFX0xQQVNTX0NMS19JRF9TUEVBS0VSX0kyU19PU1IsCisJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMTFfUDI4OTZfTUhaLAorCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbHBhc3NfZGVmYXVsdCA9IHsKKwlRNkFGRV9MUEFTU19DTEtfQ09ORklHX0FQSV9WRVJTSU9OLAorCVE2QUZFX0xQQVNTX0NMS19JRF9TUEVBS0VSX0kyU19PU1IsCisJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMTFfUDI4OTZfTUhaLAorCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbHBhc3NfbWNsayA9IHsKKwlRNkFGRV9MUEFTU19DTEtfQ09ORklHX0FQSV9WRVJTSU9OLAorCVE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzEsCisJUTZBRkVfTFBBU1NfT1NSX0NMS18xMV9QMjg5Nl9NSFosCisJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCisJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkwLAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsayAqdG9fYXVkaW9fYXBfY2xrKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXJldHVybiBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrLCBmYWN0Lmh3KTsKK30KKworc3RhdGljIGludCBhdWRpb19leHRfY2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgKmF1ZGlvX2NsayA9IHRvX2F1ZGlvX2FwX2Nsayhodyk7CisKKwlwcl9kZWJ1ZygiJXM6IGdwaW86ICVkXG4iLCBfX2Z1bmNfXywgYXVkaW9fY2xrLT5ncGlvKTsKKwlpZiAoZ3Bpb19pc192YWxpZChhdWRpb19jbGstPmdwaW8pKQorCQlyZXR1cm4gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGF1ZGlvX2Nsay0+Z3BpbywgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2V4dF9jbGtfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBhdWRpb19leHRfYXBfY2xrICphdWRpb19jbGsgPSB0b19hdWRpb19hcF9jbGsoaHcpOworCisJcHJfZGVidWcoIiVzOiBncGlvOiAlZFxuIiwgX19mdW5jX18sIGF1ZGlvX2Nsay0+Z3Bpbyk7CisJaWYgKGdwaW9faXNfdmFsaWQoYXVkaW9fY2xrLT5ncGlvKSkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGF1ZGlvX2Nsay0+Z3BpbywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyICp0b19hdWRpb19hcF9jbGsyKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXJldHVybiBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrMiwgZmFjdC5odyk7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZXh0X2NsazJfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsazIgKmF1ZGlvX2NsazIgPSB0b19hdWRpb19hcF9jbGsyKGh3KTsKKwlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbyA9ICZhdWRpb19jbGsyLT5wbmN0cmxfaW5mbzsKKwlpbnQgcmV0OworCisKKwlpZiAoIXBuY3RybF9pbmZvLT5waW5jdHJsIHx8ICFwbmN0cmxfaW5mby0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAorCQkJCSAgIHBuY3RybF9pbmZvLT5hY3RpdmUpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogYWN0aXZlIHN0YXRlIHNlbGVjdCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljbGsyX2NvbmZpZy5lbmFibGUgPSAxOworCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xrX2NmZyhJRFhfUlNWRF8zLCAmY2xrMl9jb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2V4dF9jbGsyX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsazIgKmF1ZGlvX2NsazIgPSB0b19hdWRpb19hcF9jbGsyKGh3KTsKKwlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbyA9ICZhdWRpb19jbGsyLT5wbmN0cmxfaW5mbzsKKwlpbnQgcmV0OworCisJaWYgKCFwbmN0cmxfaW5mby0+cGluY3RybCB8fCAhcG5jdHJsX2luZm8tPnNsZWVwKQorCQlyZXR1cm47CisKKwlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwbmN0cmxfaW5mby0+cGluY3RybCwKKwkJCQkgICBwbmN0cmxfaW5mby0+c2xlZXApOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IHNsZWVwIHN0YXRlIHNlbGVjdCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJY2xrMl9jb25maWcuZW5hYmxlID0gMDsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoSURYX1JTVkRfMywgJmNsazJfY29uZmlnKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlc2V0IGNsb2NrLCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrICp0b19hdWRpb19scGFzc19tY2xrKAorCQkJCQkJc3RydWN0IGNsa19odyAqaHcpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrLCBmYWN0Lmh3KTsKK30KKworc3RhdGljIGludCBhdWRpb19leHRfbHBhc3NfbWNsa19wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayAqYXVkaW9fbHBhc3NfbWNsayA9IHRvX2F1ZGlvX2xwYXNzX21jbGsoaHcpOworCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2xwYXNzX21jbGstPnBuY3RybF9pbmZvOworCWludCByZXQ7CisKKwlpZiAocG5jdHJsX2luZm8tPnBpbmN0cmwpIHsKKwkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCisJCQkJcG5jdHJsX2luZm8tPmFjdGl2ZSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGFjdGl2ZSBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWxwYXNzX21jbGsuZW5hYmxlID0gMTsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWCwKKwkJCQkmbHBhc3NfbWNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlcyBhZmVfc2V0X2RpZ2l0YWxfY29kZWNfY29yZV9jbG9jayBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdWRpb19leHRfbHBhc3NfbWNsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrICphdWRpb19scGFzc19tY2xrID0gdG9fYXVkaW9fbHBhc3NfbWNsayhodyk7CisJc3RydWN0IHBpbmN0cmxfaW5mbyAqcG5jdHJsX2luZm8gPSAmYXVkaW9fbHBhc3NfbWNsay0+cG5jdHJsX2luZm87CisJaW50IHJldDsKKworCWlmIChwbmN0cmxfaW5mby0+cGluY3RybCkgeworCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwbmN0cmxfaW5mby0+cGluY3RybCwKKwkJCQkJICAgcG5jdHJsX2luZm8tPnNsZWVwKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogYWN0aXZlIHN0YXRlIHNlbGVjdCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWxwYXNzX21jbGsuZW5hYmxlID0gMDsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWCwKKwkJCSZscGFzc19tY2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogYWZlX3NldF9kaWdpdGFsX2NvZGVjX2NvcmVfY2xvY2sgZmFpbGVkLCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2V4dF9scGFzc19tY2xrMl9wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayAqYXVkaW9fbHBhc3NfbWNsazIgPQorCQkJCQl0b19hdWRpb19scGFzc19tY2xrKGh3KTsKKwlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbyA9ICZhdWRpb19scGFzc19tY2xrMi0+cG5jdHJsX2luZm87CisJaW50IHJldDsKKworCWlmIChwbmN0cmxfaW5mby0+cGluY3RybCkgeworCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwbmN0cmxfaW5mby0+cGluY3RybCwKKwkJCQkJICAgcG5jdHJsX2luZm8tPmFjdGl2ZSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGFjdGl2ZSBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWxwYXNzX2RlZmF1bHQuZW5hYmxlID0gMTsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoSURYX1JTVkRfMywgJmxwYXNzX2RlZmF1bHQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2V4dF9scGFzc19tY2xrMl91bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrICphdWRpb19scGFzc19tY2xrMiA9CisJCQkJCXRvX2F1ZGlvX2xwYXNzX21jbGsoaHcpOworCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2xwYXNzX21jbGsyLT5wbmN0cmxfaW5mbzsKKwlpbnQgcmV0OworCisJaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7CisJCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAorCQkJCQkgICBwbmN0cmxfaW5mby0+c2xlZXApOworCQlpZiAocmV0KQorCQkJcHJfZXJyKCIlczogc2xlZXAgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKworCWxwYXNzX2RlZmF1bHQuZW5hYmxlID0gMDsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoSURYX1JTVkRfMywgJmxwYXNzX2RlZmF1bHQpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGF1ZGlvX2V4dF9hcF9jbGtfb3BzID0geworCS5wcmVwYXJlID0gYXVkaW9fZXh0X2Nsa19wcmVwYXJlLAorCS51bnByZXBhcmUgPSBhdWRpb19leHRfY2xrX3VucHJlcGFyZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBhdWRpb19leHRfYXBfY2xrMl9vcHMgPSB7CisJLnByZXBhcmUgPSBhdWRpb19leHRfY2xrMl9wcmVwYXJlLAorCS51bnByZXBhcmUgPSBhdWRpb19leHRfY2xrMl91bnByZXBhcmUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgYXVkaW9fZXh0X2xwYXNzX21jbGtfb3BzID0geworCS5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGtfcHJlcGFyZSwKKwkudW5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGtfdW5wcmVwYXJlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGF1ZGlvX2V4dF9scGFzc19tY2xrMl9vcHMgPSB7CisJLnByZXBhcmUgPSBhdWRpb19leHRfbHBhc3NfbWNsazJfcHJlcGFyZSwKKwkudW5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGsyX3VucHJlcGFyZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZXh0X3BtaV9jbGsgYXVkaW9fcG1pX2NsayA9IHsKKwkuZ3BpbyA9IC1FSU5WQUwsCisJLmZhY3QgPSB7CisJCS5tdWx0ID0gMSwKKwkJLmRpdiA9IDEsCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJhdWRpb19leHRfcG1pX2NsayIsCisJCQkub3BzID0gJmNsa19kdW1teV9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZXh0X3BtaV9jbGsgYXVkaW9fcG1pX2xuYmJfY2xrID0geworCS5ncGlvID0gLUVJTlZBTCwKKwkuZmFjdCA9IHsKKwkJLm11bHQgPSAxLAorCQkuZGl2ID0gMSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImF1ZGlvX2V4dF9wbWlfbG5iYl9jbGsiLAorCQkJLm9wcyA9ICZjbGtfZHVtbXlfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgYXVkaW9fYXBfY2xrID0geworCS5ncGlvID0gLUVJTlZBTCwKKwkuZmFjdCA9IHsKKwkJLm11bHQgPSAxLAorCQkuZGl2ID0gMSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImF1ZGlvX2FwX2NsayIsCisJCQkub3BzID0gJmF1ZGlvX2V4dF9hcF9jbGtfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyIGF1ZGlvX2FwX2NsazIgPSB7CisJLmVuYWJsZWQgPSBmYWxzZSwKKwkucG5jdHJsX2luZm8gPSB7TlVMTH0sCisJLmZhY3QgPSB7CisJCS5tdWx0ID0gMSwKKwkJLmRpdiA9IDEsCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJhdWRpb19hcF9jbGsyIiwKKwkJCS5vcHMgPSAmYXVkaW9fZXh0X2FwX2NsazJfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrIGF1ZGlvX2xwYXNzX21jbGsgPSB7CisJLnBuY3RybF9pbmZvID0ge05VTEx9LAorCS5mYWN0ID0geworCQkubXVsdCA9IDEsCisJCS5kaXYgPSAxLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiYXVkaW9fbHBhc3NfbWNsayIsCisJCQkub3BzID0gJmF1ZGlvX2V4dF9scGFzc19tY2xrX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayBhdWRpb19scGFzc19tY2xrMiA9IHsKKwkucG5jdHJsX2luZm8gPSB7TlVMTH0sCisJLmZhY3QgPSB7CisJCS5tdWx0ID0gMSwKKwkJLmRpdiA9IDEsCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJhdWRpb19scGFzc19tY2xrMiIsCisJCQkub3BzID0gJmF1ZGlvX2V4dF9scGFzc19tY2xrMl9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICphdWRpb19tc21faHdzW10gPSB7CisJJmF1ZGlvX3BtaV9jbGsuZmFjdC5odywKKwkmYXVkaW9fcG1pX2xuYmJfY2xrLmZhY3QuaHcsCisJJmF1ZGlvX2FwX2Nsay5mYWN0Lmh3LAorCSZhdWRpb19hcF9jbGsyLmZhY3QuaHcsCisJJmF1ZGlvX2xwYXNzX21jbGsuZmFjdC5odywKKwkmYXVkaW9fbHBhc3NfbWNsazIuZmFjdC5odywKK307CisKK3N0YXRpYyBpbnQgYXVkaW9fZ2V0X3BpbmN0cmwoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgZW51bSBhdWRpb19jbGtfbXV4IG11eCkKK3sKKwlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbzsKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtdXgpIHsKKwljYXNlIEFQX0NMSzI6CisJCXBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87CisJCWJyZWFrOworCWNhc2UgTFBBU1NfTUNMSzoKKwkJcG5jdHJsX2luZm8gPSAmYXVkaW9fbHBhc3NfbWNsay5wbmN0cmxfaW5mbzsKKwkJYnJlYWs7CisJY2FzZSBMUEFTU19NQ0xLMjoKKwkJcG5jdHJsX2luZm8gPSAmYXVkaW9fbHBhc3NfbWNsazIucG5jdHJsX2luZm87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIE5vdCBhIHZhbGlkIE1VWCBJRDogJWRcbiIsCisJCQlfX2Z1bmNfXywgbXV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87CisKKwlpZiAocG5jdHJsX2luZm8tPnBpbmN0cmwpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGFscmVhZHkgcmVxdWVzdGVkIGJlZm9yZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHBpbmN0cmwpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gZ2V0IHBpbmN0cmwgaGFuZGxlXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG5jdHJsX2luZm8tPnBpbmN0cmwgPSBwaW5jdHJsOworCS8qIGdldCBhbGwgc3RhdGUgaGFuZGxlcyBmcm9tIERldmljZSBUcmVlICovCisJcG5jdHJsX2luZm8tPnNsZWVwID0gcGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybCwgInNsZWVwIik7CisJaWYgKElTX0VSUihwbmN0cmxfaW5mby0+c2xlZXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IHNsZWVwIHBpbnN0YXRlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisJcG5jdHJsX2luZm8tPmFjdGl2ZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKHBpbmN0cmwsICJhY3RpdmUiKTsKKwlpZiAoSVNfRVJSKHBuY3RybF9pbmZvLT5hY3RpdmUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IGFjdGl2ZSBwaW5zdGF0ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCS8qIFJlc2V0IHRoZSBUTE1NIHBpbnMgdG8gYSBkZWZhdWx0IHN0YXRlICovCisJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCisJCQkJICAgcG5jdHJsX2luZm8tPnNsZWVwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBEaXNhYmxlIFRMTU0gcGlucyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZtX3BpbmN0cmxfcHV0KHBuY3RybF9pbmZvLT5waW5jdHJsKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGNsa19ncGlvOworCWludCByZXQ7CisJdTMyIG1jbGtfZnJlcTsKKwlzdHJ1Y3QgY2xrICphdWRpb19jbGs7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLGNvZGVjLW1jbGstY2xrLWZyZXEiLAorCQkJJm1jbGtfZnJlcSk7CisJaWYgKCFyZXQpIHsKKwkJbHBhc3NfbWNsay5jbGtfZnJlcV9pbl9oeiA9IG1jbGtfZnJlcTsKKworCQlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBMUEFTU19NQ0xLKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBQYXJzaW5nIHBpbmN0cmwgJXMgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCAiTFBBU1NfTUNMSyIpOworCQlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBMUEFTU19NQ0xLMik7CisJCWlmIChyZXQpCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUGFyc2luZyBwaW5jdHJsICVzIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIkxQQVNTX01DTEsyIik7CisJfQorCisJY2xrX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAgICJxY29tLGF1ZGlvLXJlZi1jbGstZ3BpbyIsIDApOworCWlmIChjbGtfZ3BpbyA+IDApIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNsa19ncGlvLCAiRVhUX0NMSyIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIlJlcXVlc3QgZXh0IGNsayBncGlvIGZhaWxlZCAlZCwgZXJyOiVkXG4iLAorCQkJCWNsa19ncGlvLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sbm9kZV9oYXNfcnBtX2Nsb2NrIikpIHsKKwkJCWF1ZGlvX3BtaV9jbGsuZ3BpbyA9IGNsa19ncGlvOworCQl9IGVsc2UKKwkJCWF1ZGlvX2FwX2Nsay5ncGlvID0gY2xrX2dwaW87CisKKwl9CisKKwlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBBUF9DTEsyKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUGFyc2luZyBwaW5jdHJsIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKworCWNsa19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2xrX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsa19kYXRhKQorCQlnb3RvIGVycl9ncGlvOworCisJY2xrX2RhdGEtPmNsa19udW0gPSBBUlJBWV9TSVpFKGF1ZGlvX21zbV9od3MpOworCWNsa19kYXRhLT5jbGtzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJY2xrX2RhdGEtPmNsa19udW0gKiBzaXplb2Yoc3RydWN0IGNsayAqKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWNsa19kYXRhLT5jbGtzKQorCQlnb3RvIGVycl9jbGs7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdWRpb19tc21faHdzKTsgaSsrKSB7CisJCWF1ZGlvX2NsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgYXVkaW9fbXNtX2h3c1tpXSk7CisJCWlmIChJU19FUlIoYXVkaW9fY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogYXVkaW8gcmVmIGNsb2NrIGkgPSAlZCByZWdpc3RlciBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGkpOworCQkJcmV0dXJuIFBUUl9FUlIoYXVkaW9fY2xrKTsKKwkJfQorCQljbGtfZGF0YS0+Y2xrc1tpXSA9IGF1ZGlvX2NsazsKKwl9CisKKwlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCW9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBhdWRpbyByZWYgY2xvY2sgcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9ncGlvOworCX0KKworCXJldHVybiAwOworCitlcnJfY2xrOgorCWlmIChjbGtfZGF0YSkKKwkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBjbGtfZGF0YS0+Y2xrcyk7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBjbGtfZGF0YSk7CitlcnJfZ3BpbzoKKwlncGlvX2ZyZWUoY2xrX2dwaW8pOworCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87CisKKwlpZiAoYXVkaW9fcG1pX2Nsay5ncGlvID4gMCkKKwkJZ3Bpb19mcmVlKGF1ZGlvX3BtaV9jbGsuZ3Bpbyk7CisJZWxzZSBpZiAoYXVkaW9fYXBfY2xrLmdwaW8gPiAwKQorCQlncGlvX2ZyZWUoYXVkaW9fYXBfY2xrLmdwaW8pOworCisJaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7CisJCWRldm1fcGluY3RybF9wdXQocG5jdHJsX2luZm8tPnBpbmN0cmwpOworCQlwbmN0cmxfaW5mby0+cGluY3RybCA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF1ZGlvX3JlZl9jbGtfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxhdWRpby1yZWYtY2xrIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdWRpb19yZWZfY2xrX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXVkaW9fcmVmX2Nsa19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXVkaW8tcmVmLWNsayIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhdWRpb19yZWZfY2xrX21hdGNoLAorCX0sCisJLnByb2JlID0gYXVkaW9fcmVmX2Nsa19wcm9iZSwKKwkucmVtb3ZlID0gYXVkaW9fcmVmX2Nsa19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdWRpb19yZWZfY2xrX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1ZGlvX3JlZl9jbGtfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXVkaW8gUmVmIFVwIENsb2NrIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay5jIGIvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3OTVkZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrL21zbS1jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsvbXNtLWNsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svYXVkaW8tZXh0LWNsay5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+CisKK3N0cnVjdCBwaW5jdHJsX2luZm8geworCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOworCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpzbGVlcDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqYWN0aXZlOworfTsKKworc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgeworCWJvb2wgZW5hYmxlZDsKKwlpbnQgZ3BpbzsKKwlzdHJ1Y3QgY2xrIGM7Cit9OworCitzdHJ1Y3QgYXVkaW9fZXh0X3BtaV9jbGsgeworCWludCBncGlvOworCXN0cnVjdCBjbGsgYzsKK307CisKK3N0cnVjdCBhdWRpb19leHRfYXBfY2xrMiB7CisJYm9vbCBlbmFibGVkOworCXN0cnVjdCBwaW5jdHJsX2luZm8gcG5jdHJsX2luZm87CisJc3RydWN0IGNsayBjOworfTsKKworc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBjbGsyX2NvbmZpZyA9IHsKKwlRNkFGRV9MUEFTU19DTEtfQ09ORklHX0FQSV9WRVJTSU9OLAorCVE2QUZFX0xQQVNTX0NMS19JRF9TUEVBS0VSX0kyU19PU1IsCisJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMTFfUDI4OTZfTUhaLAorCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJMCwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgKnRvX2F1ZGlvX2FwX2NsayhzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjbGssIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrLCBjKTsKK30KKworc3RhdGljIGludCBhdWRpb19leHRfY2xrX3ByZXBhcmUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBhdWRpb19leHRfYXBfY2xrICphdWRpb19jbGsgPSB0b19hdWRpb19hcF9jbGsoY2xrKTsKKworCXByX2RlYnVnKCIlczogZ3BpbzogJWRcbiIsIF9fZnVuY19fLCBhdWRpb19jbGstPmdwaW8pOworCWlmIChncGlvX2lzX3ZhbGlkKGF1ZGlvX2Nsay0+Z3BpbykpCisJCXJldHVybiBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYXVkaW9fY2xrLT5ncGlvLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fZXh0X2Nsa191bnByZXBhcmUoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBhdWRpb19leHRfYXBfY2xrICphdWRpb19jbGsgPSB0b19hdWRpb19hcF9jbGsoY2xrKTsKKworCXByX2RlYnVnKCIlczogZ3BpbzogJWRcbiIsIF9fZnVuY19fLCBhdWRpb19jbGstPmdwaW8pOworCWlmIChncGlvX2lzX3ZhbGlkKGF1ZGlvX2Nsay0+Z3BpbykpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChhdWRpb19jbGstPmdwaW8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrMiAqdG9fYXVkaW9fYXBfY2xrMihzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjbGssIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrMiwgYyk7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZXh0X2NsazJfcHJlcGFyZShzdHJ1Y3QgY2xrICpjbGspCit7CisJc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyICphdWRpb19jbGsyID0gdG9fYXVkaW9fYXBfY2xrMihjbGspOworCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2NsazItPnBuY3RybF9pbmZvOworCWludCByZXQ7CisKKworCWlmICghcG5jdHJsX2luZm8tPnBpbmN0cmwgfHwgIXBuY3RybF9pbmZvLT5hY3RpdmUpCisJCXJldHVybiAwOworCisJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCisJCQkJICAgcG5jdHJsX2luZm8tPmFjdGl2ZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBhY3RpdmUgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNsazJfY29uZmlnLmVuYWJsZSA9IDE7CisJcmV0ID0gYWZlX3NldF9scGFzc19jbGtfY2ZnKElEWF9SU1ZEXzMsICZjbGsyX2NvbmZpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjbG9jaywgcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fZXh0X2NsazJfdW5wcmVwYXJlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsazIgKmF1ZGlvX2NsazIgPSB0b19hdWRpb19hcF9jbGsyKGNsayk7CisJc3RydWN0IHBpbmN0cmxfaW5mbyAqcG5jdHJsX2luZm8gPSAmYXVkaW9fY2xrMi0+cG5jdHJsX2luZm87CisJaW50IHJldDsKKworCWlmICghcG5jdHJsX2luZm8tPnBpbmN0cmwgfHwgIXBuY3RybF9pbmZvLT5zbGVlcCkKKwkJcmV0dXJuOworCisJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCisJCQkJICAgcG5jdHJsX2luZm8tPnNsZWVwKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBzbGVlcCBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCWNsazJfY29uZmlnLmVuYWJsZSA9IDA7CisJcmV0ID0gYWZlX3NldF9scGFzc19jbGtfY2ZnKElEWF9SU1ZEXzMsICZjbGsyX2NvbmZpZyk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IGZhaWxlZCB0byByZXNldCBjbG9jaywgcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgYXVkaW9fZXh0X2FwX2Nsa19vcHMgPSB7CisJLnByZXBhcmUgPSBhdWRpb19leHRfY2xrX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IGF1ZGlvX2V4dF9jbGtfdW5wcmVwYXJlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGF1ZGlvX2V4dF9hcF9jbGsyX29wcyA9IHsKKwkucHJlcGFyZSA9IGF1ZGlvX2V4dF9jbGsyX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IGF1ZGlvX2V4dF9jbGsyX3VucHJlcGFyZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZXh0X3BtaV9jbGsgYXVkaW9fcG1pX2NsayA9IHsKKwkuZ3BpbyA9IC1FSU5WQUwsCisJLmMgPSB7CisJCS5kYmdfbmFtZSA9ICJhdWRpb19leHRfcG1pX2NsayIsCisJCS5vcHMgPSAmY2xrX29wc19kdW1teSwKKwkJQ0xLX0lOSVQoYXVkaW9fcG1pX2Nsay5jKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19leHRfcG1pX2NsayBhdWRpb19wbWlfbG5iYl9jbGsgPSB7CisJLmdwaW8gPSAtRUlOVkFMLAorCS5jID0geworCQkuZGJnX25hbWUgPSAiYXVkaW9fZXh0X3BtaV9sbmJiX2NsayIsCisJCS5vcHMgPSAmY2xrX29wc19kdW1teSwKKwkJQ0xLX0lOSVQoYXVkaW9fcG1pX2xuYmJfY2xrLmMpLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgYXVkaW9fYXBfY2xrID0geworCS5ncGlvID0gLUVJTlZBTCwKKwkuYyA9IHsKKwkJLmRiZ19uYW1lID0gImF1ZGlvX2V4dF9hcF9jbGsiLAorCQkub3BzID0gJmF1ZGlvX2V4dF9hcF9jbGtfb3BzLAorCQlDTEtfSU5JVChhdWRpb19hcF9jbGsuYyksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsazIgYXVkaW9fYXBfY2xrMiA9IHsKKwkuYyA9IHsKKwkJLmRiZ19uYW1lID0gImF1ZGlvX2V4dF9hcF9jbGsyIiwKKwkJLm9wcyA9ICZhdWRpb19leHRfYXBfY2xrMl9vcHMsCisJCUNMS19JTklUKGF1ZGlvX2FwX2NsazIuYyksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBhdWRpb19yZWZfY2xvY2tbXSA9IHsKKwlDTEtfTElTVChhdWRpb19hcF9jbGspLAorCUNMS19MSVNUKGF1ZGlvX3BtaV9jbGspLAorCUNMS19MSVNUKGF1ZGlvX3BtaV9sbmJiX2NsayksCisJQ0xLX0xJU1QoYXVkaW9fYXBfY2xrMiksCit9OworCitzdGF0aWMgaW50IGF1ZGlvX2dldF9waW5jdHJsKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBpbmN0cmxfaW5mbyAqcG5jdHJsX2luZm87CisJc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7CisJaW50IHJldDsKKworCXBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87CisKKwlpZiAocG5jdHJsX2luZm8tPnBpbmN0cmwpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGFscmVhZHkgcmVxdWVzdGVkIGJlZm9yZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHBpbmN0cmwpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gZ2V0IHBpbmN0cmwgaGFuZGxlXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG5jdHJsX2luZm8tPnBpbmN0cmwgPSBwaW5jdHJsOworCS8qIGdldCBhbGwgc3RhdGUgaGFuZGxlcyBmcm9tIERldmljZSBUcmVlICovCisJcG5jdHJsX2luZm8tPnNsZWVwID0gcGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybCwgInNsZWVwIik7CisJaWYgKElTX0VSUihwbmN0cmxfaW5mby0+c2xlZXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IHNsZWVwIHBpbnN0YXRlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisJcG5jdHJsX2luZm8tPmFjdGl2ZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKHBpbmN0cmwsICJhY3RpdmUiKTsKKwlpZiAoSVNfRVJSKHBuY3RybF9pbmZvLT5hY3RpdmUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IGFjdGl2ZSBwaW5zdGF0ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCS8qIFJlc2V0IHRoZSBUTE1NIHBpbnMgdG8gYSBkZWZhdWx0IHN0YXRlICovCisJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCisJCQkJICAgcG5jdHJsX2luZm8tPnNsZWVwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBEaXNhYmxlIFRMTU0gcGlucyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZtX3BpbmN0cmxfcHV0KHBuY3RybF9pbmZvLT5waW5jdHJsKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGNsa19ncGlvOworCWludCByZXQ7CisJc3RydWN0IGNsayAqYXVkaW9fY2xrOworCisJY2xrX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAgICJxY29tLGF1ZGlvLXJlZi1jbGstZ3BpbyIsIDApOworCWlmIChjbGtfZ3BpbyA+IDApIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNsa19ncGlvLCAiRVhUX0NMSyIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIlJlcXVlc3QgZXh0IGNsayBncGlvIGZhaWxlZCAlZCwgZXJyOiVkXG4iLAorCQkJCWNsa19ncGlvLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sbm9kZV9oYXNfcnBtX2Nsb2NrIikpIHsKKwkJCWF1ZGlvX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKGF1ZGlvX2NsaykpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IFJQTSBkaXYgY2xrXG4iKTsKKwkJCQlyZXQgPSBQVFJfRVJSKGF1ZGlvX2Nsayk7CisJCQkJZ290byBlcnJfZ3BpbzsKKwkJCX0KKwkJCWF1ZGlvX3BtaV9jbGsuYy5wYXJlbnQgPSBhdWRpb19jbGs7CisJCQlhdWRpb19wbWlfY2xrLmdwaW8gPSBjbGtfZ3BpbzsKKwkJfSBlbHNlCisJCQlhdWRpb19hcF9jbGsuZ3BpbyA9IGNsa19ncGlvOworCisJfSBlbHNlIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sbm9kZV9oYXNfcnBtX2Nsb2NrIikpIHsKKwkJCWF1ZGlvX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKGF1ZGlvX2NsaykpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGxuYmJjbGsyXG4iKTsKKwkJCQlyZXQgPSBQVFJfRVJSKGF1ZGlvX2Nsayk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlhdWRpb19wbWlfbG5iYl9jbGsuYy5wYXJlbnQgPSBhdWRpb19jbGs7CisJCQlhdWRpb19wbWlfbG5iYl9jbGsuZ3BpbyA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2KTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUGFyc2luZyBwaW5jdHJsIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKworCXJldCA9IG9mX21zbV9jbG9ja19yZWdpc3RlcihwZGV2LT5kZXYub2Zfbm9kZSwgYXVkaW9fcmVmX2Nsb2NrLAorCQkJICAgICAgQVJSQVlfU0laRShhdWRpb19yZWZfY2xvY2spKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBhdWRpbyByZWYgY2xvY2sgcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9ncGlvOworCX0KKworCXJldHVybiAwOworCitlcnJfZ3BpbzoKKwlncGlvX2ZyZWUoY2xrX2dwaW8pOworCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87CisKKwlpZiAoYXVkaW9fcG1pX2Nsay5ncGlvID4gMCkKKwkJZ3Bpb19mcmVlKGF1ZGlvX3BtaV9jbGsuZ3Bpbyk7CisJZWxzZSBpZiAoYXVkaW9fYXBfY2xrLmdwaW8gPiAwKQorCQlncGlvX2ZyZWUoYXVkaW9fYXBfY2xrLmdwaW8pOworCisJaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7CisJCWRldm1fcGluY3RybF9wdXQocG5jdHJsX2luZm8tPnBpbmN0cmwpOworCQlwbmN0cmxfaW5mby0+cGluY3RybCA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF1ZGlvX3JlZl9jbGtfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxhdWRpby1yZWYtY2xrIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdWRpb19yZWZfY2xrX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXVkaW9fcmVmX2Nsa19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXVkaW8tcmVmLWNsayIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhdWRpb19yZWZfY2xrX21hdGNoLAorCX0sCisJLnByb2JlID0gYXVkaW9fcmVmX2Nsa19wcm9iZSwKKwkucmVtb3ZlID0gYXVkaW9fcmVmX2Nsa19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdWRpb19yZWZfY2xrX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1ZGlvX3JlZl9jbGtfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXVkaW8gUmVmIENsb2NrIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9tc204eDE2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNWI3YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9LY29uZmlnCkBAIC0wLDAgKzEsMyBAQAorCitjb25maWcgU05EX1NPQ19NU004WDE2X1dDRAorCXRyaXN0YXRlICJNU00gSW50ZXJuYWwgUE1JQyBiYXNlZCBjb2RlYyIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ1MjJmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9tc204eDE2L01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorc25kLXNvYy1tc204OTUyLXdjZC1vYmpzIDo9IG1zbTh4MTYtd2NkLm8gbXNtOHgxNi13Y2QtdGFibGVzLm8gbXNtODl4eC1yZWdtYXAubworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNOFgxNl9XQ0QpICAgICAgKz0gc25kLXNvYy1tc204OTUyLXdjZC5vIG1zbTg5MTYtd2NkLWlycS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtODkxNi13Y2QtaXJxLmMgYi9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtODkxNi13Y2QtaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyMjg0MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204OTE2LXdjZC1pcnEuYwpAQCAtMCwwICsxLDQ0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3BtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAibXNtOHgxNi13Y2QuaCIKKyNpbmNsdWRlICJtc204OTE2LXdjZC1pcnEuaCIKKyNpbmNsdWRlICJtc204eDE2X3djZF9yZWdpc3RlcnMuaCIKKworI2RlZmluZSBNQVhfTlVNX0lSUVMgMTQKKyNkZWZpbmUgTlVNX0lSUV9SRUdTIDIKKyNkZWZpbmUgV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMgNzAwCisKKyNkZWZpbmUgQllURV9CSVRfTUFTSyhucikgKDFVTCA8PCAoKG5yKSAlIEJJVFNfUEVSX0JZVEUpKQorI2RlZmluZSBCSVRfQllURShucikgKChucikgLyBCSVRTX1BFUl9CWVRFKQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkOXh4eF9zcG1pX2lycV9oYW5kbGVyKGludCBsaW51eF9pcnEsIHZvaWQgKmRhdGEpOworCitjaGFyICppcnFfbmFtZXNbTUFYX05VTV9JUlFTXSA9IHsKKwkic3BrX2NucF9pbnQiLAorCSJzcGtfY2xpcF9pbnQiLAorCSJzcGtfb2NwX2ludCIsCisJImluc19yZW1fZGV0MSIsCisJImJ1dF9yZWxfZGV0IiwKKwkiYnV0X3ByZXNzX2RldCIsCisJImluc19yZW1fZGV0IiwKKwkibWJoY19pbnQiLAorCSJlYXJfb2NwX2ludCIsCisJImhwaHJfb2NwX2ludCIsCisJImhwaGxfb2NwX2RldCIsCisJImVhcl9jbnBfaW50IiwKKwkiaHBocl9jbnBfaW50IiwKKwkiaHBobF9jbnBfaW50IgorfTsKKworaW50IG9yZGVyW01BWF9OVU1fSVJRU10gPSB7CisJTVNNODlYWF9JUlFfU1BLUl9DTlAsCisJTVNNODlYWF9JUlFfU1BLUl9DTElQLAorCU1TTTg5WFhfSVJRX1NQS1JfT0NQLAorCU1TTTg5WFhfSVJRX01CSENfSU5TUkVNX0RFVDEsCisJTVNNODlYWF9JUlFfTUJIQ19SRUxFQVNFLAorCU1TTTg5WFhfSVJRX01CSENfUFJFU1MsCisJTVNNODlYWF9JUlFfTUJIQ19JTlNSRU1fREVULAorCU1TTTg5WFhfSVJRX01CSENfSFNfREVULAorCU1TTTg5WFhfSVJRX0VBUl9PQ1AsCisJTVNNODlYWF9JUlFfSFBIUl9PQ1AsCisJTVNNODlYWF9JUlFfSFBITF9PQ1AsCisJTVNNODlYWF9JUlFfRUFSX0NOUCwKKwlNU004OVhYX0lSUV9IUEhSX0NOUCwKKwlNU004OVhYX0lSUV9IUEhMX0NOUCwKK307CisKK2VudW0gd2NkOXh4eF9zcG1pX3BtX3N0YXRlIHsKKwlXQ0Q5WFhYX1BNX1NMRUVQQUJMRSwKKwlXQ0Q5WFhYX1BNX0FXQUtFLAorCVdDRDlYWFhfUE1fQVNMRUVQLAorfTsKKworc3RydWN0IHdjZDl4eHhfc3BtaV9tYXAgeworCXVpbnQ4X3QgaGFuZGxlZFtOVU1fSVJRX1JFR1NdOworCXVpbnQ4X3QgbWFza1tOVU1fSVJRX1JFR1NdOworCWludCBsaW51eGlycVtNQVhfTlVNX0lSUVNdOworCWlycV9oYW5kbGVyX3QgaGFuZGxlcltNQVhfTlVNX0lSUVNdOworCXN0cnVjdCBzcG1pX2RldmljZSAqc3BtaVtOVU1fSVJRX1JFR1NdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWVudW0gd2NkOXh4eF9zcG1pX3BtX3N0YXRlIHBtX3N0YXRlOworCXN0cnVjdCBtdXRleCBwbV9sb2NrOworCS8qIHBtX3dxIG5vdGlmaWVzIGNoYW5nZSBvZiBwbV9zdGF0ZSAqLworCXdhaXRfcXVldWVfaGVhZF90IHBtX3dxOworCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOworCWludCB3bG9ja19ob2xkZXJzOworfTsKKworc3RydWN0IHdjZDl4eHhfc3BtaV9tYXAgbWFwOworCit2b2lkIHdjZDl4eHhfc3BtaV9lbmFibGVfaXJxKGludCBpcnEpCit7CisJcHJfZGVidWcoIiVzOiBpcnFubyA9JWRcbiIsIF9fZnVuY19fLCBpcnEpOworCWlmICgoaXJxID49IDApICYmIChpcnEgPD0gNykpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYXAuY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUiwKKwkJCQkoMHgwMSA8PCBpcnEpLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYXAuY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVCwKKwkJCQkoMHgwMSA8PCBpcnEpLCAoMHgwMSA8PCBpcnEpKTsKKwl9CisJaWYgKChpcnEgPiA3KSAmJiAoaXJxIDw9IDE1KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1hcC5jb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFIsCisJCQkJKDB4MDEgPDwgKGlycSAtIDgpKSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWFwLmNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0VOX1NFVCwKKwkJCQkoMHgwMSA8PCAoaXJxIC0gOCkpLCAoMHgwMSA8PCAoaXJxIC0gOCkpKTsKKwl9CisKKwlpZiAoIShtYXAubWFza1tCSVRfQllURShpcnEpXSAmIChCWVRFX0JJVF9NQVNLKGlycSkpKSkKKwkJcmV0dXJuOworCisJbWFwLm1hc2tbQklUX0JZVEUoaXJxKV0gJj0KKwkJfihCWVRFX0JJVF9NQVNLKGlycSkpOworCisJZW5hYmxlX2lycShtYXAubGludXhpcnFbaXJxXSk7Cit9CisKK3ZvaWQgd2NkOXh4eF9zcG1pX2Rpc2FibGVfaXJxKGludCBpcnEpCit7CisJcHJfZGVidWcoIiVzOiBpcnFubyA9JWRcbiIsIF9fZnVuY19fLCBpcnEpOworCWlmICgoaXJxID49IDApICYmIChpcnEgPD0gNykpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYXAuY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVCwKKwkJCQkoMHgwMSA8PCAoaXJxKSksIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1hcC5jb2RlYywKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfRU5fQ0xSLAorCQkJCSgweDAxIDw8IGlycSksICgweDAxIDw8IGlycSkpOworCX0KKworCWlmICgoaXJxID4gNykgJiYgKGlycSA8PSAxNSkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYXAuY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fU0VULAorCQkJCSgweDAxIDw8IChpcnEgLSA4KSksIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1hcC5jb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFIsCisJCQkJKDB4MDEgPDwgKGlycSAtIDgpKSwgKDB4MDEgPDwgKGlycSAtIDgpKSk7CisJfQorCisJaWYgKG1hcC5tYXNrW0JJVF9CWVRFKGlycSldICYgKEJZVEVfQklUX01BU0soaXJxKSkpCisJCXJldHVybjsKKworCW1hcC5tYXNrW0JJVF9CWVRFKGlycSldIHw9CisJCShCWVRFX0JJVF9NQVNLKGlycSkpOworCisJZGlzYWJsZV9pcnFfbm9zeW5jKG1hcC5saW51eGlycVtpcnFdKTsKK30KKworaW50IHdjZDl4eHhfc3BtaV9yZXF1ZXN0X2lycShpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCisJCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCWlmIChzdHJjbXAobmFtZSwgIm1iaGMgc3cgaW50ciIpKQorCQlpcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcgfAorCQkJSVJRRl9PTkVTSE9UOworCWVsc2UKKwkJaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCUlSUUZfT05FU0hPVCB8IElSUUZfTk9fU1VTUEVORDsKKwlwcl9kZWJ1ZygiJXM6IG5hbWU6JXMgaXJxX2ZsYWdzID0gJWx4XG4iLCBfX2Z1bmNfXywgbmFtZSwgaXJxX2ZsYWdzKTsKKworCXJjID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmbWFwLnNwbWlbQklUX0JZVEUoaXJxKV0tPmRldiwKKwkJCQltYXAubGludXhpcnFbaXJxXSwgTlVMTCwKKwkJCQl3Y2Q5eHh4X3NwbWlfaXJxX2hhbmRsZXIsCisJCQkJaXJxX2ZsYWdzLAorCQkJCW5hbWUsIHByaXYpOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKCZtYXAuc3BtaVtCSVRfQllURShpcnEpXS0+ZGV2LAorCQkJCSJDYW4ndCByZXF1ZXN0ICVkIElSUVxuIiwgaXJxKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJZGV2X2RiZygmbWFwLnNwbWlbQklUX0JZVEUoaXJxKV0tPmRldiwKKwkJCSJpcnEgJWQgbGludXhJUlE6ICVkXG4iLCBpcnEsIG1hcC5saW51eGlycVtpcnFdKTsKKwltYXAubWFza1tCSVRfQllURShpcnEpXSAmPSB+QllURV9CSVRfTUFTSyhpcnEpOworCW1hcC5oYW5kbGVyW2lycV0gPSBoYW5kbGVyOworCWVuYWJsZV9pcnFfd2FrZShtYXAubGludXhpcnFbaXJxXSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3Y2Q5eHh4X3NwbWlfZnJlZV9pcnEoaW50IGlycSwgdm9pZCAqcHJpdikKK3sKKwlkZXZtX2ZyZWVfaXJxKCZtYXAuc3BtaVtCSVRfQllURShpcnEpXS0+ZGV2LCBtYXAubGludXhpcnFbaXJxXSwKKwkJCQkJCXByaXYpOworCW1hcC5tYXNrW0JJVF9CWVRFKGlycSldIHw9IEJZVEVfQklUX01BU0soaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfaXJxX2JpdChpbnQgbGludXhfaXJxKQoreworCWludCBpID0gMDsKKworCWZvciAoOyBpIDwgTUFYX05VTV9JUlFTOyBpKyspCisJCWlmIChtYXAubGludXhpcnFbaV0gPT0gbGludXhfaXJxKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBnZXRfb3JkZXJfaXJxKGludCAgaSkKK3sKKwlyZXR1cm4gb3JkZXJbaV07Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X3NwbWlfaXJxX2hhbmRsZXIoaW50IGxpbnV4X2lycSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaXJxLCBpLCBqOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzW05VTV9JUlFfUkVHU10gPSB7MH07CisKKwlpZiAodW5saWtlbHkod2NkOXh4eF9zcG1pX2xvY2tfc2xlZXAoKSA9PSBmYWxzZSkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gaG9sZCBzdXNwZW5kXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycSA9IGdldF9pcnFfYml0KGxpbnV4X2lycSk7CisJaWYgKGlycSA9PSBNQVhfTlVNX0lSUVMpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXN0YXR1c1tCSVRfQllURShpcnEpXSB8PSBCWVRFX0JJVF9NQVNLKGlycSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9JUlFfUkVHUzsgaSsrKSB7CisJCXN0YXR1c1tpXSB8PSBzbmRfc29jX3JlYWQobWFwLmNvZGVjLAorCQkJCUJJVF9CWVRFKGlycSkgKiAweDEwMCArCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9TVFMpOworCQlzdGF0dXNbaV0gJj0gfm1hcC5tYXNrW2ldOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9JUlFTOyBpKyspIHsKKwkJaiA9IGdldF9vcmRlcl9pcnEoaSk7CisJCWlmICgoc3RhdHVzW0JJVF9CWVRFKGopXSAmIEJZVEVfQklUX01BU0soaikpICYmCisJCQkoKG1hcC5oYW5kbGVkW0JJVF9CWVRFKGopXSAmCisJCQlCWVRFX0JJVF9NQVNLKGopKSA9PSAwKSkgeworCQkJbWFwLmhhbmRsZXJbal0oaXJxLCBkYXRhKTsKKwkJCW1hcC5oYW5kbGVkW0JJVF9CWVRFKGopXSB8PQorCQkJCQlCWVRFX0JJVF9NQVNLKGopOworCQl9CisJfQorCW1hcC5oYW5kbGVkW0JJVF9CWVRFKGlycSldICY9IH5CWVRFX0JJVF9NQVNLKGlycSk7CisJd2NkOXh4eF9zcG1pX3VubG9ja19zbGVlcCgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitlbnVtIHdjZDl4eHhfc3BtaV9wbV9zdGF0ZSB3Y2Q5eHh4X3NwbWlfcG1fY21weGNoZygKKwkJZW51bSB3Y2Q5eHh4X3NwbWlfcG1fc3RhdGUgbywKKwkJZW51bSB3Y2Q5eHh4X3NwbWlfcG1fc3RhdGUgbikKK3sKKwllbnVtIHdjZDl4eHhfc3BtaV9wbV9zdGF0ZSBvbGQ7CisKKwltdXRleF9sb2NrKCZtYXAucG1fbG9jayk7CisJb2xkID0gbWFwLnBtX3N0YXRlOworCWlmIChvbGQgPT0gbykKKwkJbWFwLnBtX3N0YXRlID0gbjsKKwlwcl9kZWJ1ZygiJXM6IG1hcC5wbV9zdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlKTsKKwltdXRleF91bmxvY2soJm1hcC5wbV9sb2NrKTsKKwlyZXR1cm4gb2xkOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NwbWlfcG1fY21weGNoZyk7CisKK2ludCB3Y2Q5eHh4X3NwbWlfc3VzcGVuZChwbV9tZXNzYWdlX3QgcG1lc2cpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJLyoKKwkgKiBwbV9xb3NfdXBkYXRlX3JlcXVlc3QoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoaXMgc3VzcGVuZCBjaGFpbiBjYWxsCisJICogc3RhcnRlZC4gdGh1cyBzdXNwZW5kIGNhbiBiZSBjYWxsZWQgd2hpbGUgbG9jayBpcyBiZWluZyBoZWxkCisJICovCisJbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOworCWlmIChtYXAucG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9TTEVFUEFCTEUpIHsKKwkJcHJfZGVidWcoIiVzOiBzdXNwZW5kaW5nIHN5c3RlbSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLAorCQkJIF9fZnVuY19fLCBtYXAucG1fc3RhdGUsCisJCQkgbWFwLndsb2NrX2hvbGRlcnMpOworCQltYXAucG1fc3RhdGUgPSBXQ0Q5WFhYX1BNX0FTTEVFUDsKKwl9IGVsc2UgaWYgKG1hcC5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSB7CisJCS8qCisJCSAqIHVubG9jayB0byB3YWl0IGZvciBwbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX1NMRUVQQUJMRQorCQkgKiB0aGVuIHNldCB0byBXQ0Q5WFhYX1BNX0FTTEVFUAorCQkgKi8KKwkJcHJfZGVidWcoIiVzOiB3YWl0aW5nIHRvIHN1c3BlbmQgc3lzdGVtLCBzdGF0ZSAlZCwgd2xvY2sgJWRcbiIsCisJCQkgX19mdW5jX18sIG1hcC5wbV9zdGF0ZSwKKwkJCSBtYXAud2xvY2tfaG9sZGVycyk7CisJCW11dGV4X3VubG9jaygmbWFwLnBtX2xvY2spOworCQlpZiAoISh3YWl0X2V2ZW50X3RpbWVvdXQobWFwLnBtX3dxLAorCQkJCQkgd2NkOXh4eF9zcG1pX3BtX2NtcHhjaGcoCisJCQkJCQkJV0NEOVhYWF9QTV9TTEVFUEFCTEUsCisJCQkJCQkJV0NEOVhYWF9QTV9BU0xFRVApID09CisJCQkJCQkJV0NEOVhYWF9QTV9TTEVFUEFCTEUsCisJCQkJCQkJSFopKSkgeworCQkJcHJfZGVidWcoIiVzOiBzdXNwZW5kIGZhaWxlZCBzdGF0ZSAlZCwgd2xvY2sgJWRcbiIsCisJCQkJIF9fZnVuY19fLCBtYXAucG1fc3RhdGUsCisJCQkJIG1hcC53bG9ja19ob2xkZXJzKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogZG9uZSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgbWFwLnBtX3N0YXRlLAorCQkJCSBtYXAud2xvY2tfaG9sZGVycyk7CisJCX0KKwkJbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOworCX0gZWxzZSBpZiAobWFwLnBtX3N0YXRlID09IFdDRDlYWFhfUE1fQVNMRUVQKSB7CisJCXByX3dhcm4oIiVzOiBzeXN0ZW0gaXMgYWxyZWFkeSBzdXNwZW5kZWQsIHN0YXRlICVkLCB3bG9jayAlZG4iLAorCQkJX19mdW5jX18sIG1hcC5wbV9zdGF0ZSwKKwkJCW1hcC53bG9ja19ob2xkZXJzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtYXAucG1fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NwbWlfc3VzcGVuZCk7CisKK2ludCB3Y2Q5eHh4X3NwbWlfcmVzdW1lKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOworCWlmIChtYXAucG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9BU0xFRVApIHsKKwkJcHJfZGVidWcoIiVzOiByZXN1bWluZyBzeXN0ZW0sIHN0YXRlICVkLCB3bG9jayAlZFxuIiwgX19mdW5jX18sCisJCQkJbWFwLnBtX3N0YXRlLAorCQkJCW1hcC53bG9ja19ob2xkZXJzKTsKKwkJbWFwLnBtX3N0YXRlID0gV0NEOVhYWF9QTV9TTEVFUEFCTEU7CisJfSBlbHNlIHsKKwkJcHJfd2FybigiJXM6IHN5c3RlbSBpcyBhbHJlYWR5IGF3YWtlLCBzdGF0ZSAlZCB3bG9jayAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWFwLnBtX3N0YXRlLAorCQkJCW1hcC53bG9ja19ob2xkZXJzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtYXAucG1fbG9jayk7CisJd2FrZV91cF9hbGwoJm1hcC5wbV93cSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NwbWlfcmVzdW1lKTsKKworYm9vbCB3Y2Q5eHh4X3NwbWlfbG9ja19zbGVlcCh2b2lkKQoreworCS8qCisJICogd2NkOXh4eF9zcG1pX3tsb2NrL3VubG9ja31fc2xlZXAgd2lsbCBiZSBjYWxsZWQgYnkKKwkgKiB3Y2Q5eHh4X3NwbWlfaXJxX3RocmVhZAorCSAqIGFuZCBpdHMgc3Vicm91dGluZXMgb25seSBtb3RseS4KKwkgKiBidXQgYnRuMF9scHJlc3NfZm4gaXMgbm90IHdjZDl4eHhfc3BtaV9pcnFfdGhyZWFkJ3Mgc3Vicm91dGluZSBhbmQKKwkgKiBJdCBjYW4gcmFjZSB3aXRoIHdjZDl4eHhfc3BtaV9pcnFfdGhyZWFkLgorCSAqIFNvIG5lZWQgdG8gZW1icmFjZSB3bG9ja19ob2xkZXJzIHdpdGggbXV0ZXguCisJICovCisJbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOworCWlmIChtYXAud2xvY2tfaG9sZGVycysrID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBob2xkaW5nIHdha2UgbG9ja1xuIiwgX19mdW5jX18pOworCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJm1hcC5wbV9xb3NfcmVxLAorCQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKKwkJcG1fc3RheV9hd2FrZSgmbWFwLnNwbWlbMF0tPmRldik7CisJfQorCW11dGV4X3VubG9jaygmbWFwLnBtX2xvY2spOworCXByX2RlYnVnKCIlczogd2FrZSBsb2NrIGNvdW50ZXIgJWRcbiIsIF9fZnVuY19fLAorCQkJbWFwLndsb2NrX2hvbGRlcnMpOworCXByX2RlYnVnKCIlczogbWFwLnBtX3N0YXRlID0gJWRcbiIsIF9fZnVuY19fLCBtYXAucG1fc3RhdGUpOworCisJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQobWFwLnBtX3dxLAorCQkJCSgod2NkOXh4eF9zcG1pX3BtX2NtcHhjaGcoCisJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAorCQkJCQlXQ0Q5WFhYX1BNX0FXQUtFKSkgPT0KKwkJCQkJV0NEOVhYWF9QTV9TTEVFUEFCTEUgfHwKKwkJCQkJKHdjZDl4eHhfc3BtaV9wbV9jbXB4Y2hnKAorCQkJCQkJIFdDRDlYWFhfUE1fU0xFRVBBQkxFLAorCQkJCQkJIFdDRDlYWFhfUE1fQVdBS0UpID09CisJCQkJCQkgV0NEOVhYWF9QTV9BV0FLRSkpLAorCQkJCQltc2Vjc190b19qaWZmaWVzKAorCQkJCQlXQ0Q5WFhYX1NZU1RFTV9SRVNVTUVfVElNRU9VVF9NUykpKSB7CisJCXByX3dhcm4oIiVzOiBzeXN0ZW0gZGlkbid0IHJlc3VtZSB3aXRoaW4gJWRtcywgcyAlZCwgdyAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMsIG1hcC5wbV9zdGF0ZSwKKwkJCW1hcC53bG9ja19ob2xkZXJzKTsKKwkJd2NkOXh4eF9zcG1pX3VubG9ja19zbGVlcCgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXdha2VfdXBfYWxsKCZtYXAucG1fd3EpOworCXByX2RlYnVnKCIlczogbGVhdmluZyBwbV9zdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9zcG1pX2xvY2tfc2xlZXApOworCit2b2lkIHdjZDl4eHhfc3BtaV91bmxvY2tfc2xlZXAodm9pZCkKK3sKKwltdXRleF9sb2NrKCZtYXAucG1fbG9jayk7CisJaWYgKC0tbWFwLndsb2NrX2hvbGRlcnMgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2luZyB3YWtlIGxvY2sgcG1fc3RhdGUgJWQgLT4gJWRcbiIsCisJCQkgX19mdW5jX18sIG1hcC5wbV9zdGF0ZSwgV0NEOVhYWF9QTV9TTEVFUEFCTEUpOworCQkvKgorCQkgKiBpZiB3Y2Q5eHh4X3NwbWlfbG9ja19zbGVlcCBmYWlsZWQsIHBtX3N0YXRlIHdvdWxkIGJlIHN0aWxsCisJCSAqIFdDRDlYWFhfUE1fQVNMRUVQLCBkb24ndCBvdmVyd3JpdGUKKwkJICovCisJCWlmIChsaWtlbHkobWFwLnBtX3N0YXRlID09IFdDRDlYWFhfUE1fQVdBS0UpKQorCQkJbWFwLnBtX3N0YXRlID0gV0NEOVhYWF9QTV9TTEVFUEFCTEU7CisJCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmbWFwLnBtX3Fvc19yZXEsCisJCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOworCQlwbV9yZWxheCgmbWFwLnNwbWlbMF0tPmRldik7CisJfQorCW11dGV4X3VubG9jaygmbWFwLnBtX2xvY2spOworCXByX2RlYnVnKCIlczogd2FrZSBsb2NrIGNvdW50ZXIgJWRcbiIsIF9fZnVuY19fLAorCQkJbWFwLndsb2NrX2hvbGRlcnMpOworCXByX2RlYnVnKCIlczogbWFwLnBtX3N0YXRlID0gJWRcbiIsIF9fZnVuY19fLCBtYXAucG1fc3RhdGUpOworCXdha2VfdXBfYWxsKCZtYXAucG1fd3EpOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NwbWlfdW5sb2NrX3NsZWVwKTsKKwordm9pZCB3Y2Q5eHh4X3NwbWlfc2V0X2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwltYXAuY29kZWMgPSBjb2RlYzsKK30KKwordm9pZCB3Y2Q5eHh4X3NwbWlfc2V0X2RldihzdHJ1Y3Qgc3BtaV9kZXZpY2UgKnNwbWksIGludCBpKQoreworCWlmIChpIDwgTlVNX0lSUV9SRUdTKQorCQltYXAuc3BtaVtpXSA9IHNwbWk7Cit9CisKK2ludCB3Y2Q5eHh4X3NwbWlfaXJxX2luaXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKDsgaSA8IE1BWF9OVU1fSVJRUzsgaSsrKQorCQltYXAubWFza1tCSVRfQllURShpKV0gfD0gQllURV9CSVRfTUFTSyhpKTsKKwltdXRleF9pbml0KCZtYXAucG1fbG9jayk7CisJbWFwLndsb2NrX2hvbGRlcnMgPSAwOworCW1hcC5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1hcC5wbV93cSk7CisJcG1fcW9zX2FkZF9yZXF1ZXN0KCZtYXAucG1fcW9zX3JlcSwKKwkJCQlQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAorCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIk1TTTh4MTYgU1BNSSBJUlEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtODkxNi13Y2QtaXJxLmggYi9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtODkxNi13Y2QtaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2Mjg2NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204OTE2LXdjZC1pcnEuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX1dDRDlYWFhfU1BNSV9JUlFfSF9fCisjZGVmaW5lIF9fV0NEOVhYWF9TUE1JX0lSUV9IX18KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KKworZXh0ZXJuIHZvaWQgd2NkOXh4eF9zcG1pX2VuYWJsZV9pcnEoaW50IGlycSk7CitleHRlcm4gdm9pZCB3Y2Q5eHh4X3NwbWlfZGlzYWJsZV9pcnEoaW50IGlycSk7CitleHRlcm4gaW50IHdjZDl4eHhfc3BtaV9yZXF1ZXN0X2lycShpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdik7CitleHRlcm4gaW50IHdjZDl4eHhfc3BtaV9mcmVlX2lycShpbnQgaXJxLCB2b2lkICpwcml2KTsKK2V4dGVybiB2b2lkIHdjZDl4eHhfc3BtaV9zZXRfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2V4dGVybiB2b2lkIHdjZDl4eHhfc3BtaV9zZXRfZGV2KHN0cnVjdCBzcG1pX2RldmljZSAqc3BtaSwgaW50IGkpOworZXh0ZXJuIGludCB3Y2Q5eHh4X3NwbWlfaXJxX2luaXQodm9pZCk7CitleHRlcm4gaW50IHdjZDl4eHhfc3BtaV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBwbWVzZyk7CitleHRlcm4gaW50IHdjZDl4eHhfc3BtaV9yZXN1bWUodm9pZCk7Citib29sIHdjZDl4eHhfc3BtaV9sb2NrX3NsZWVwKHZvaWQpOwordm9pZCB3Y2Q5eHh4X3NwbWlfdW5sb2NrX3NsZWVwKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204OXh4LXJlZ21hcC5jIGIvc291bmQvc29jL2NvZGVjcy9tc204eDE2L21zbTg5eHgtcmVnbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3Yjc0YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204OXh4LXJlZ21hcC5jCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgIm1zbTh4MTYtd2NkLmgiCisKKy8qCisgKiBEZWZhdWx0IHJlZ2lzdGVyIHJlc2V0IHZhbHVlcyB0aGF0IGFyZSBjb21tb24gYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucworICogYXJlIGRlZmluZWQgaGVyZS4gSWYgYSByZWdpc3RlciByZXNldCB2YWx1ZSBpcyBjaGFuZ2VkIGJhc2VkIG9uIHZlcnNpb24KKyAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCBpbiB2ZXJzaW9uIHNwZWNpZmljCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgc3RydWN0IHJlZ19kZWZhdWx0CisJbXNtODl4eF9jZGNfY29yZV9kZWZhdWx0c1tNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkVdID0geworCXtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9SRVNFVF9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9SRVNFVF9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19ETUlDX0IxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVEwsIDB4MTN9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMLCAweDEzfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9SRVNFVF9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9DVEwsIDB4MDR9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19NQ0xLX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19TRF9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NMS19XU0FfVklfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjRfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjRfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjVfQ1RMLCAweDY4fSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjVfQ1RMLCAweDY4fSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMLCAweDY4fSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfQjZfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UT1BfR0FJTl9VUERBVEUsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1RPUF9DVEwsIDB4MDF9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IxX0NUTCwgMHgzMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjJfQ1RMLCAweEI1fSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT01QMF9CM19DVEwsIDB4Mjh9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I0X0NUTCwgMHgzN30sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjVfQ1RMLCAweDdGfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT01QMF9CNl9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVMsIDB4MDN9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0ZTX0NGRywgMHgwM30sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfREVMQVlfQlVGX0NUTCwgMHgwMn0sCisJe01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjFfQ1RMX0NGRywgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjJfQ1RMX0NGRywgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjNfQ1RMX0NGRywgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IzX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IzX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I0X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I0X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I1X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I1X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I2X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I2X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I3X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I3X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I4X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I4X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVEwsIDB4NDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0lJUjJfQ1RMLCAweDQwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fVElNRVJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IyX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IxX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CM19DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0I0X0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMl9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IzX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0kyU19TRDFfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9USU1FUiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfVElNRVIsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX1RJTUVSLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9USU1FUiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfR0FJTiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfR0FJTiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTiwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9DRkcsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0NGRywgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfQ0ZHLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDFfTVVYX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYM19NVVhfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDRfTVVYX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgxX0NMS19GU19DVEwsIDB4MDN9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYMl9DTEtfRlNfQ1RMLCAweDAzfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDNfQ0xLX0ZTX0NUTCwgMHgwM30sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFg0X0NMS19GU19DVEwsIDB4MDN9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYMV9ETUlDX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfQ0RDX0NPUkVfVFgyX0RNSUNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9DRENfQ09SRV9UWDNfRE1JQ19DVEwsIDB4MDB9LAorCXtNU004OVhYX0NEQ19DT1JFX1RYNF9ETUlDX0NUTCwgMHgwMH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ19kZWZhdWx0CisJbXNtODl4eF9wbWljX2NkY19kZWZhdWx0c1tNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkVdID0geworCXtNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjEsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9UWVBFLCAweDIzfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfU1VCVFlQRSwgMHgwMX0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9SVF9TVFMsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfU0VUX1RZUEUsIDB4RkZ9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfSElHSCwgMHhGRn0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QT0xBUklUWV9MT1csIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9DTFIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfRU5fU0VULCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUiwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9MQVRDSEVEX1NUUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QRU5ESU5HX1NUUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9NSURfU0VMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BSSU9SSVRZLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfR1BJT19NT0RFLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX0NUTF9PRSwgMHgwMX0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfREFUQSwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9TVEFUVVMsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9IRFJJVkVfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfVE9QX0NMS19DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9UWDFfQ1RMLCAweDAyfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTCwgMHgwMn0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX0hQSFJfREFDX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9SWDJfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgzX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYX0xCX0NUTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwxLCAweDdDfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDIsIDB4N0N9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMywgMHg3Q30sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTAsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEExLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMiwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTMsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9ESUdfREVCVUdfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0VOLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfU1BBUkVfMCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzEsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8yLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDEsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwyLCAweDAyfSwKKwl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMywgMHgwNX0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDQsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfVEVTVDEsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfVEVTVF9WQUwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfRElHSVRBTF9UUklNX05VTSwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19ESUdJVEFMX1RSSU1fQ1RSTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04xLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT040LCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9UWVBFLCAweDIzfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9TVUJUWVBFLCAweDA5fSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUlRfU1RTLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfU0VUX1RZUEUsIDB4M0Z9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QT0xBUklUWV9ISUdILCAweDNGfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUE9MQVJJVFlfTE9XLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTEFUQ0hFRF9DTFIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9TRVQsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9MQVRDSEVEX1NUUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BFTkRJTkdfU1RTLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTUlEX1NFTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BSSU9SSVRZLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9WQUwsIDB4MjB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9JTlRfUkJJQVMsIDB4NDl9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwgMHgyMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX0FURVNUX0NUTF8yLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8xLCAweDM1fSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMiwgMHgwOH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIsIDB4OTh9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMV9aREVUTV9DVEwsIDB4MjB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMl9aREVUSF9DVEwsIDB4NDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROM19DVEwsIDB4NjF9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlRONF9DVEwsIDB4ODB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19aREVUX0VMRUNUX1JFU1VMVCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV9FTiwgMHgwM30sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTiwgMHgwM30sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RFU1RfQ1RMXzEsIDB4QkZ9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yLCAweDhDfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfT1BBTVBfQklBUywgMHg2Qn0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RYRkVfQ0xLRElWLCAweDUxfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOLCAweDAyfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRU4sIDB4MjZ9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9DTEssIDB4MjN9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9ERUdMSVRDSCwgMHg1Qn0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHgwOH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0JJQVMsIDB4Mjl9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTCwgMHgyNH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX1RFU1QsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9DTElNX0FERFIsIDB4RDV9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NMT0NLX0RJVklERVIsIDB4RTh9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ1RMLCAweENGfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NPVU5ULCAweDZFfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fQklBU19EQUMsIDB4MTh9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX1BBLCAweDVBfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19MRE9fT0NQLCAweDY5fSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19DTlAsIDB4Mjl9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sIDB4ODB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfQ1RMLCAweERBfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUUsIDB4MTZ9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwsIDB4MjB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1RFU1QsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1BBX0RBQ19DVEwsIDB4MjB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsIDB4MTJ9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0FURVNULCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfU1RBVFVTLCAweDBDfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfU1RBVFVTLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHg4M30sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ0xJUF9ERVQsIDB4OTF9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwgMHgyOX0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9BTkFfQklBU19TRVQsIDB4NER9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwgMHhFMX0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLCAweDFFfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9NSVNDLCAweENCfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9EQkcsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4MDJ9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX09VVFBVVF9WT0xUQUdFLCAweDE0fSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERSwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLCAweDFGfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19TTE9QRV9DT01QX0lQX1pFUk8sIDB4OEN9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1JEU09OX01BWF9EVVRZX0NZQ0xFLCAweEMwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9URVNUMV8xLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9URVNUXzIsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfU0FSX1NUQVRVUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfU1RBVFVTLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19QQlVTX0FERF9DU1IsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1BCVVNfQUREX1NFTCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMSwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMiwgMHgwMX0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMywgMHgwNX0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMNCwgMHgwMH0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1RFU1QxLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfVEVTVF9WQUwsIDB4MDB9LAorCXtNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fTlVNLCAweDA0fSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwxLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwyLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwzLCAweDAwfSwKKwl7TVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkw0LCAweDAwfSwKK307CisKK3N0YXRpYyBib29sIG1zbTg5eHhfY2RjX2NvcmVfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gbXNtODl4eF9jZGNfY29yZV9yZWdfcmVhZGFibGVbcmVnXTsKK30KKworc3RhdGljIGJvb2wgbXNtODl4eF9wbWljX2NkY19yZWFkYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBtc204OXh4X3BtaWNfY2RjX3JlZ19yZWFkYWJsZVtyZWddOworfQorCitzdGF0aWMgYm9vbCBtc204OXh4X2NkY19jb3JlX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgxX0IxX0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX0IxX0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX0I2X0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHOgorCWNhc2UgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9DRkc6CisJY2FzZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEw6CisJY2FzZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMV9DVEw6CisJY2FzZSBNU004OVhYX0NEQ19DT1JFX0NMS19NQ0xLX0NUTDoKKwljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVEw6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFOgorCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVEw6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVDoKKwljYXNlIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzE6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIG1zbTg5eHhfcG1pY19jZGNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04yOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfVFlQRToKKwljYXNlIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1NVQlRZUEU6CisJY2FzZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUlRfU1RTOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1NFVF9UWVBFOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0hJR0g6CisJY2FzZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfTE9XOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfU1RTOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BFTkRJTkdfU1RTOgorCWNhc2UgTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX1NUQVRVUzoKKwljYXNlIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1M6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1M6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMToKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04yOgorCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjM6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfVFlQRToKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfU1VCVFlQRToKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1JUX1NUUzoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1NFVF9UWVBFOgorCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUE9MQVJJVFlfSElHSDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0xPVzoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfU1RTOgorCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUEVORElOR19TVFM6CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19aREVUX0VMRUNUX1JFU1VMVDoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1NUQVRVUzoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX1NUQVRVUzoKKwljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9TQVJfU1RBVFVTOgorCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9TVEFUVVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0cnVjdCByZWdtYXBfY29uZmlnIG1zbTg5eHhfcG1pY19jZGNfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMJPSAxNiwKKwkudmFsX2JpdHMJPSA4LAorCS5tYXhfcmVnaXN0ZXIJPSBNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkUsCisJLmZhc3RfaW8JPSB0cnVlLAorCS5yZWdfZGVmYXVsdHMgPSBtc204OXh4X3BtaWNfY2RjX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShtc204OXh4X3BtaWNfY2RjX2RlZmF1bHRzKSwKKwkucmVhZGFibGVfcmVnID0gbXNtODl4eF9wbWljX2NkY19yZWFkYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IG1zbTg5eHhfcG1pY19jZGNfdm9sYXRpbGVfcmVnLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS5jYW5fbXVsdGlfd3JpdGUgPSB0cnVlLAorCS5sb2NrID0gZW5hYmxlX2RpZ2l0YWxfY2FsbGJhY2ssCisJLnVubG9jayA9IGRpc2FibGVfZGlnaXRhbF9jYWxsYmFjaywKKworfTsKKworc3RydWN0IHJlZ21hcF9jb25maWcgbXNtODl4eF9jZGNfY29yZV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkudmFsX2JpdHMgPSAzMiwKKworCS5tYXhfcmVnaXN0ZXIgPSBNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkUsCisJLnJlZ19kZWZhdWx0cyA9IG1zbTg5eHhfY2RjX2NvcmVfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKG1zbTg5eHhfY2RjX2NvcmVfZGVmYXVsdHMpLAorCS5yZWFkYWJsZV9yZWcgPSBtc204OXh4X2NkY19jb3JlX3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gbXNtODl4eF9jZGNfY29yZV92b2xhdGlsZV9yZWcsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCisJLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCisJLmNhbl9tdWx0aV93cml0ZSA9IHRydWUsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc204eDE2L21zbTh4MTYtd2NkLXRhYmxlcy5jIGIvc291bmQvc29jL2NvZGVjcy9tc204eDE2L21zbTh4MTYtd2NkLXRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Njk2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtOHgxNi13Y2QtdGFibGVzLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJtc204eDE2LXdjZC5oIgorCitjb25zdCB1OCBtc204OXh4X3BtaWNfY2RjX3JlZ19yZWFkYWJsZVtNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkVdID0geworCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1RZUEVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1NVQlRZUEVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9SVF9TVFNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9TRVRfVFlQRV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0hJR0hdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QT0xBUklUWV9MT1ddID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9TRVRdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9DTFJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9MQVRDSEVEX1NUU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BFTkRJTkdfU1RTXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTUlEX1NFTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BSSU9SSVRZXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9HUElPX01PREVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfT0VdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfREFUQV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX1NUQVRVU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfSERSSVZFX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19UT1BfQ0xLX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMV9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMl9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX0hQSFJfREFDX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgzX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlhfTEJfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwzXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEEwXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEExXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEEyXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEEzXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9ESUdfREVCVUdfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8wXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8xXSA9IDEsCisJCVtNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8yXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04zXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9UWVBFXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1NVQlRZUEVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1JUX1NUU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfU0VUX1RZUEVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0hJR0hdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0xPV10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fU0VUXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfU1RTXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QRU5ESU5HX1NUU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTUlEX1NFTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUFJJT1JJVFldID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9WQUxdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzFdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREJOQ19USU1FUl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjBfWkRFVExfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMV9aREVUTV9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4yX1pERVRIX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjNfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlRONF9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFRdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV9FTl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8xXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RYRkVfQ0xLRElWXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU5dID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9DTEtdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0RFR0xJVENIXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkxdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0JJQVNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX1ZDVFJMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9URVNUXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NMT0NLX0RJVklERVJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DT1VOVF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fQklBU19EQUNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfUEFdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfTERPX09DUF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19DTlBdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9FTl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUVdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfVEVTVF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9QQV9EQUNfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1RFU1RdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfUEFfREFDX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0FURVNUXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9TVEFUVVNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX1NUQVRVU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ0xJUF9ERVRdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfQU5BX0JJQVNfU0VUXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfTUlTQ10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9EQkddID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19PVVRQVVRfVk9MVEFHRV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERV0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1JEU09OX01BWF9EVVRZX0NZQ0xFXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX1RFU1QxXzFdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVF8yXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfU0FSX1NUQVRVU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9TVEFUVVNdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfQ1NSXSA9IDEsCisJCVtNU004OVhYX1BNSUNfQU5BTE9HX1BCVVNfQUREX1NFTF0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVExdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9MQVRDSEVEX0NMUl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTEFUQ0hFRF9DTFJdID0gMSwKKwkJW01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0NMSU1fQUREUl0gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTU10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMM10gPSAxLAorCQlbTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTXSA9IDEsCit9OworCitjb25zdCB1OCBtc204OXh4X2NkY19jb3JlX3JlZ19yZWFkYWJsZVtNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkVdID0geworCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfUkVTRVRfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9SRVNFVF9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9JMlNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX1JFU0VUX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1NEX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfV1NBX1ZJX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0IyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0IzX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjRfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CNF9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0I0X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjVfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CNV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0I1X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfQjZfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYMl9CNl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX0I2X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UT1BfR0FJTl9VUERBVEVdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfVE9QX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0RFQlVHX0RFU0VSMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjFfQ1RMX0NGR10gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19CMl9DVExfQ0ZHXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IzX0NUTF9DRkddID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CM19DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I0X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjRfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I1X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjZfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I3X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjdfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9COF9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I4X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fVElNRVJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9USU1FUl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DT0VGX0IyX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IzX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IzX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjFfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMl9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0I0X0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMV9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjJfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IzX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CNF9DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9JMlNfU0QxX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9USU1FUl0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9USU1FUl0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9USU1FUl0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9USU1FUl0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9HQUlOXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0dBSU5dID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfR0FJTl0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9HQUlOXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0NGR10gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9DRkddID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfQ0ZHXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX0NGR10gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfTVVYX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfTVVYX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDNfTVVYX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfTVVYX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfQ0xLX0ZTX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfQ0xLX0ZTX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDNfQ0xLX0ZTX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfQ0xLX0ZTX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfRE1JQ19DVExdID0gMSwKKwkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX0RNSUNfQ1RMXSA9IDEsCisJCVtNU004OVhYX0NEQ19DT1JFX1RYM19ETUlDX0NUTF0gPSAxLAorCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfRE1JQ19DVExdID0gMSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtOHgxNi13Y2QuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2LXdjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTYvbXNtOHgxNi13Y2QuYwpAQCAtMCwwICsxLDYwMjIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3N1YnN5c3RlbV9ub3RpZi5oPgorI2luY2x1ZGUgIi4uLy4uL21zbS9tc21mYWxjb24tY29tbW9uLmgiCisjaW5jbHVkZSAiLi4vd2NkLW1iaGMtdjIuaCIKKyNpbmNsdWRlICJtc204OTE2LXdjZC1pcnEuaCIKKyNpbmNsdWRlICJtc204eDE2LXdjZC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJtc20tY29kZWMiCisjZGVmaW5lIE1TTTg5WFhfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKKyNkZWZpbmUgTVNNODlYWF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAorCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKKworI2RlZmluZSBOVU1fSU5URVJQT0xBVE9SUwkzCisjZGVmaW5lIEJJVFNfUEVSX1JFRwkJOAorI2RlZmluZSBNU004OVhYX1RYX1BPUlRfTlVNQkVSCTQKKworI2RlZmluZSBNU004OVhYX0kyU19NQVNURVJfTU9ERV9NQVNLCTB4MDgKKyNkZWZpbmUgTVNNODlYWF9ESUdJVEFMX0NPREVDX0JBU0VfQUREUgkJMHg3NzFDMDAwCisjZGVmaW5lIFBNSUNfU0xBVkVfSURfMAkJMAorI2RlZmluZSBQTUlDX1NMQVZFX0lEXzEJCTEKKworI2RlZmluZSBQTUlDX01CR19PSwkJMHgyQzA4CisjZGVmaW5lIFBNSUNfTERPN19FTl9DVEwJMHg0NjQ2CisjZGVmaW5lIE1BU0tfTVNCX0JJVAkJMHg4MAorCisjZGVmaW5lIENPREVDX0RUX01BWF9QUk9QX1NJWkUJCQk0MAorI2RlZmluZSBNU004OVhYX0RJR0lUQUxfQ09ERUNfUkVHX1NJWkUJCTB4NDAwCisjZGVmaW5lIE1BWF9PTl9ERU1BTkRfU1VQUExZX05BTUVfTEVOR1RICTY0CisKKyNkZWZpbmUgTUNMS19SQVRFXzlQNk1IWgk5NjAwMDAwCisjZGVmaW5lIE1DTEtfUkFURV8xMlAyODhNSFoJMTIyODgwMDAKKworI2RlZmluZSBCVVNfRE9XTiAxCisKKy8qCisgKjUwIE1pbGxpc2Vjb25kcyBzdWZmaWNpZW50IGZvciBEU1AgYnJpbmcgdXAgaW4gdGhlIG1vZGVtCisgKiBhZnRlciBTdWIgU3lzdGVtIFJlc3RhcnQKKyAqLworI2RlZmluZSBBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMgNTAKKworI2RlZmluZSBIUEhMX1BBX0RJU0FCTEUgKDB4MDEgPDwgMSkKKyNkZWZpbmUgSFBIUl9QQV9ESVNBQkxFICgweDAxIDw8IDIpCisjZGVmaW5lIEVBUl9QQV9ESVNBQkxFICgweDAxIDw8IDMpCisjZGVmaW5lIFNQS1JfUEFfRElTQUJMRSAoMHgwMSA8PCA0KQorCitlbnVtIHsKKwlCT09TVF9TV0lUQ0ggPSAwLAorCUJPT1NUX0FMV0FZUywKKwlCWVBBU1NfQUxXQVlTLAorCUJPT1NUX09OX0ZPUkVWRVIsCit9OworCisjZGVmaW5lIEVBUl9QTUQgMAorI2RlZmluZSBFQVJfUE1VIDEKKyNkZWZpbmUgU1BLX1BNRCAyCisjZGVmaW5lIFNQS19QTVUgMworCisjZGVmaW5lIE1JQ0JJQVNfREVGQVVMVF9WQUwgMTgwMDAwMAorI2RlZmluZSBNSUNCSUFTX01JTl9WQUwgMTYwMDAwMAorI2RlZmluZSBNSUNCSUFTX1NURVBfU0laRSA1MDAwMAorCisjZGVmaW5lIERFRkFVTFRfQk9PU1RfVk9MVEFHRSA1MDAwCisjZGVmaW5lIE1JTl9CT09TVF9WT0xUQUdFIDQwMDAKKyNkZWZpbmUgTUFYX0JPT1NUX1ZPTFRBR0UgNTU1MAorI2RlZmluZSBCT09TVF9WT0xUQUdFX1NURVAgNTAKKworI2RlZmluZSBNU004OVhYX01CSENfQlROX0NPQVJTRV9BREogIDEwMCAvKiBpbiBtViAqLworI2RlZmluZSBNU004OVhYX01CSENfQlROX0ZJTkVfQURKIDEyIC8qIGluIG1WICovCisKKyNkZWZpbmUgVk9MVEFHRV9DT05WRVJURVIodmFsdWUsIG1pbl92YWx1ZSwgc3RlcF9zaXplKVwKKwkoKHZhbHVlIC0gbWluX3ZhbHVlKS9zdGVwX3NpemUpCisKK2VudW0geworCUFJRjFfUEIgPSAwLAorCUFJRjFfQ0FQLAorCUFJRjJfVklGRUVELAorCU5VTV9DT0RFQ19EQUlTLAorfTsKKworZW51bSB7CisJUlhfTUlYMV9JTlBfU0VMX1pFUk8gPSAwLAorCVJYX01JWDFfSU5QX1NFTF9JSVIxLAorCVJYX01JWDFfSU5QX1NFTF9JSVIyLAorCVJYX01JWDFfSU5QX1NFTF9SWDEsCisJUlhfTUlYMV9JTlBfU0VMX1JYMiwKKwlSWF9NSVgxX0lOUF9TRUxfUlgzLAorfTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfZ2FpbiwgMCwgMSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW5hbG9nX2dhaW4sIDAsIDI1LCAxKTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbTh4MTZfd2NkX2kyc19kYWlbXTsKKy8qIEJ5IGRlZmF1bHQgZW5hYmxlIHRoZSBpbnRlcm5hbCBzcGVha2VyIGJvb3N0ICovCitzdGF0aWMgYm9vbCBzcGtyX2Jvb3N0X2VuID0gdHJ1ZTsKKworI2RlZmluZSBNU004OVhYX0FDUVVJUkVfTE9DSyh4KSBcCisJbXV0ZXhfbG9ja19uZXN0ZWQoJngsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKQorCisjZGVmaW5lIE1TTTg5WFhfUkVMRUFTRV9MT0NLKHgpIG11dGV4X3VubG9jaygmeCkKKworCisvKiBDb2RlYyBzdXBwb3J0cyAyIElJUiBmaWx0ZXJzICovCitlbnVtIHsKKwlJSVIxID0gMCwKKwlJSVIyLAorCUlJUl9NQVgsCit9OworCisvKiBDb2RlYyBzdXBwb3J0cyA1IGJhbmRzICovCitlbnVtIHsKKwlCQU5EMSA9IDAsCisJQkFORDIsCisJQkFORDMsCisJQkFORDQsCisJQkFORDUsCisJQkFORF9NQVgsCit9OworCitzdHJ1Y3QgaHBmX3dvcmsgeworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZDsKKwl1MzIgZGVjaW1hdG9yOworCXU4IHR4X2hwZl9jdXRfb2ZfZnJlcTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworfTsKKworc3RhdGljIHN0cnVjdCBocGZfd29yayB0eF9ocGZfd29ya1tOVU1fREVDSU1BVE9SU107CisKK3N0YXRpYyBjaGFyIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVtdW01BWF9PTl9ERU1BTkRfU1VQUExZX05BTUVfTEVOR1RIXSA9IHsKKwkiY2RjLXZkZC1taWMtYmlhcyIsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyByeF9kaWdpdGFsX2dhaW5fcmVnW10gPSB7CisJTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVEwsCisJTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMl9DVEwsCisJTVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMl9DVEwsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9kaWdpdGFsX2dhaW5fcmVnW10gPSB7CisJTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9HQUlOLAorCU1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfR0FJTiwKK307CisKK2VudW0geworCU1TTTg5WFhfU1BNSV9ESUdJVEFMID0gMCwKKwlNU004OVhYX1NQTUlfQU5BTE9HLAorCU1TTTg5WFhfQ09ERUNfQ09SRSwKKwlNQVhfTVNNODlYWF9ERVZJQ0UKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIKKwl3Y2RfbWJoY19yZWdpc3RlcnNbV0NEX01CSENfUkVHX0ZVTkNfTUFYXSA9IHsKKworCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19MX0RFVF9FTiIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEsIDB4ODAsIDcsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19HTkRfREVUX0VOIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMSwgMHg0MCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8xLCAweDIwLCA1LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX0NMQU1QX0NUTCIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEsIDB4MTgsIDMsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEsIDB4MDEsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NUUkwiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweEMwLCA2LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DT01QX0NUUkwiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDIwLCA1LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9QTFVHX1RZUEUiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDEwLCA0LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX1BMVUdfVFlQRSIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDgsIDMsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19TV19IUEhfTFBfMTAwS19UT19HTkQiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDAxLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQyIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDYsIDEsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fRU4iLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwgMHg4MCwgNywgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0lOU1JFTV9EQk5DIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIsIDB4RjAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fREJOQyIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSLCAweDBDLCAyLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfVlJFRiIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4zX0NUTCwgMHgwMywgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0NPTVBfUkVTVUxUIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweDAxLAorCQkJICAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX1NDSE1UX1JFU1VMVCIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19aREVUX0VMRUNUX1JFU1VMVCwgMHgwMiwKKwkJCSAgMSwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxUIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweDA4LAorCQkJICAzLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9TQ0hNVF9SRVNVTFQiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQsIDB4MDQsCisJCQkgIDIsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19PQ1BfRlNNX0VOIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NUTCwgMHgxMCwgNCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9SRVNVTFQiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCwgMHhGRiwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9JU1JDX0NUTCIsCisJCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLCAweDcwLCA0LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfUkVTVUxUIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweEZGLAorCQkJICAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDQl9DVFJMIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIDB4QzAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhGQywgMiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSFJfUEFfRU4iLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sIDB4MTAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1BBX0VOIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLCAweDIwLCA1LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIX1BBX0VOIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLCAweDMwLCA0LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfU1dDSF9MRVZFTF9SRU1PVkUiLAorCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQsCisJCQkgIDB4MTAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19QVUxMRE9XTl9DVFJMIiwKKwkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIDB4MjAsIDUsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BTkNfREVUX0VOIiwKKwkJCSAgMCwgMCwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0ZTTV9TVEFUVVMiLAorCQkJICAwLCAwLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTVVYX0NUTCIsCisJCQkgIDAsIDAsIDAsIDApLAorfTsKKworc3RydWN0IG1zbTh4MTZfd2NkX3NwbWkgeworCXN0cnVjdCBzcG1pX2RldmljZSAqc3BtaTsKKwlpbnQgYmFzZTsKK307CisKKy8qIE11bHRpcGx5IGdhaW5fYWRqIGFuZCBvZmZzZXQgYnkgMTAwMCBhbmQgMTAwIHRvIGF2b2lkIGZsb2F0IGFyaXRobWV0aWMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX2ltcGVkX2lfcmVmIGltcGVkX2lfcmVmW10gPSB7CisJe0lfaDRfVUEsIDgsIDgwMCwgOTAwMCwgMTAwMDB9LAorCXtJX3B0NV9VQSwgMTAsIDEwMCwgOTkwLCA0NjAwfSwKKwl7SV8xNF9VQSwgMTcsIDE0LCAxMDUwLCA3MDB9LAorCXtJX2w0X1VBLCAxMCwgNCwgMTE2NSwgMTEwfSwKKwl7SV8xX1VBLCAwLCAxLCAxMjAwLCA2NX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2ludHIgaW50cl9pZHMgPSB7CisJLm1iaGNfc3dfaW50ciA9ICBNU004OVhYX0lSUV9NQkhDX0hTX0RFVCwKKwkubWJoY19idG5fcHJlc3NfaW50ciA9IE1TTTg5WFhfSVJRX01CSENfUFJFU1MsCisJLm1iaGNfYnRuX3JlbGVhc2VfaW50ciA9IE1TTTg5WFhfSVJRX01CSENfUkVMRUFTRSwKKwkubWJoY19oc19pbnNfaW50ciA9IE1TTTg5WFhfSVJRX01CSENfSU5TUkVNX0RFVDEsCisJLm1iaGNfaHNfcmVtX2ludHIgPSBNU004OVhYX0lSUV9NQkhDX0lOU1JFTV9ERVQsCisJLmhwaF9sZWZ0X29jcCA9IE1TTTg5WFhfSVJRX0hQSExfT0NQLAorCS5ocGhfcmlnaHRfb2NwID0gTVNNODlYWF9JUlFfSFBIUl9PQ1AsCit9OworCitzdGF0aWMgaW50IG1zbV9kaWdjZGNfY2xvY2tfY29udHJvbChib29sIGZsYWcpOworc3RhdGljIGludCBtc204eDE2X3djZF9kdF9wYXJzZV92cmVnX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBtc204eDE2X3djZF9yZWd1bGF0b3IgKnZyZWcsCisJY29uc3QgY2hhciAqdnJlZ19uYW1lLCBib29sIG9uZGVtYW5kKTsKK3N0YXRpYyBzdHJ1Y3QgbXNtOHgxNl93Y2RfcGRhdGEgKm1zbTh4MTZfd2NkX3BvcHVsYXRlX2R0X3BkYXRhKAorCXN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2VuYWJsZV9leHRfbWJfc291cmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkJICAgIGJvb2wgdHVybl9vbik7CitzdGF0aWMgdm9pZCBtc204eDE2X3RyaW1fYnRuX3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2Rfc2V0X21pY2JfdihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2Rfc2V0X2Jvb3N0X3Yoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX3NldF9hdXRvX3plcm9pbmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlib29sIGVuYWJsZSk7CitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9jb25maWd1cmVfY2FwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJYm9vbCBtaWNiaWFzMSwgYm9vbCBtaWNiaWFzMik7CitzdGF0aWMgYm9vbCBtc204eDE2X3djZF91c2VfbWIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKworc3RydWN0IG1zbTh4MTZfd2NkX3NwbWkgbXNtOHgxNl93Y2RfbW9kdWxlc1tNQVhfTVNNODlYWF9ERVZJQ0VdOworCitzdGF0aWMgdm9pZCAqYWRzcF9zdGF0ZV9ub3RpZmllcjsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjICpyZWdpc3RlcmVkX2NvZGVjOworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjICpyZWdpc3RlcmVkX2RpZ2NvZGVjOworCitzdGF0aWMgaW50IGdldF9jb2RlY192ZXJzaW9uKHN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCkKK3sKKwlpZiAobXNtOHgxNl93Y2QtPmNvZGVjX3ZlcnNpb24gPT0gRElBTkdVKQorCQlyZXR1cm4gRElBTkdVOworCWVsc2UgaWYgKG1zbTh4MTZfd2NkLT5jb2RlY192ZXJzaW9uID09IENBSk9OXzJfMCkKKwkJcmV0dXJuIENBSk9OXzJfMDsKKwllbHNlIGlmIChtc204eDE2X3djZC0+Y29kZWNfdmVyc2lvbiA9PSBDQUpPTikKKwkJcmV0dXJuIENBSk9OOworCWVsc2UgaWYgKG1zbTh4MTZfd2NkLT5jb2RlY192ZXJzaW9uID09IENPTkdBKQorCQlyZXR1cm4gQ09OR0E7CisJZWxzZSBpZiAobXNtOHgxNl93Y2QtPnBtaWNfcmV2ID09IFRPTUJBS18yXzApCisJCXJldHVybiBUT01CQUtfMl8wOworCWVsc2UgaWYgKG1zbTh4MTZfd2NkLT5wbWljX3JldiA9PSBUT01CQUtfMV8wKQorCQlyZXR1cm4gVE9NQkFLXzFfMDsKKworCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvZGVjIHZlcnNpb25cbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gVU5TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RpZ2NkY19jbG9ja19jb250cm9sKGJvb2wgZmxhZykKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShyZWdpc3RlcmVkX2NvZGVjLT5jb21wb25lbnQuY2FyZCk7CisKKwlpZiAoZmxhZykgeworCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7CisJCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSA9PSBmYWxzZSkgeworCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7CisJCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAorCQkJCQlBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCisJCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoImZhaWxlZCB0byBlbmFibGUgdGhlIElOVF9NQ0xLMFxuIik7CisJCQkJZ290byBlcnJfbWNsazsKKwkJCX0KKwkJCXByX2VycigiZW5hYmxlZCBkaWdpdGFsIGNvZGVjIGNvcmUgY2xrXG4iKTsKKwkJCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgdHJ1ZSk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBkYXRhLT5kaXNhYmxlX2ludF9tY2xrMF93b3JrLAorCQkJCQkgICAgICA1MCk7CisJCX0KK2Vycl9tY2xrOgorCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hYmxlX2RpZ2l0YWxfY2FsbGJhY2sodm9pZCAqZmxhZykKK3sKKwltc21fZGlnY2RjX2Nsb2NrX2NvbnRyb2wodHJ1ZSk7Cit9CisKK3ZvaWQgZGlzYWJsZV9kaWdpdGFsX2NhbGxiYWNrKHZvaWQgKmZsYWcpCit7CisJbXNtX2RpZ2NkY19jbG9ja19jb250cm9sKGZhbHNlKTsKK30KKworc3RhdGljIGludCBzbmRfc29jX3JlYWRfd3JhcHBlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHUxNiByZWcpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2X3djZCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisKKwlwcl9lcnIoIiVzIHJlZyA9ICV4XG4iLCBfX2Z1bmNfXywgcmVnKTsKKwltdXRleF9sb2NrKCZtc204eDE2X3djZC0+aW9fbG9jayk7CisJaWYgKE1TTTg5WFhfSVNfUE1JQ19DRENfUkVHKHJlZykpCisJCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKTsKKwllbHNlIGlmIChNU004OVhYX0lTX0NEQ19DT1JFX1JFRyhyZWcpKQorCQlyZXQgPSBzbmRfc29jX3JlYWQocmVnaXN0ZXJlZF9kaWdjb2RlYywgcmVnKTsKKwltdXRleF91bmxvY2soJm1zbTh4MTZfd2NkLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY193cml0ZV93cmFwcGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTE2IHJlZywgdTggdmFsKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBtc204eDE2X3djZCAqbXNtOHgxNl93Y2QgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCisJcHJfZXJyKCIlcyByZWcgPSAleFxuIiwgX19mdW5jX18sIHJlZyk7CisJbXV0ZXhfbG9jaygmbXNtOHgxNl93Y2QtPmlvX2xvY2spOworCWlmIChNU004OVhYX0lTX1BNSUNfQ0RDX1JFRyhyZWcpKQorCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisJZWxzZSBpZiAoTVNNODlYWF9JU19DRENfQ09SRV9SRUcocmVnKSkKKwkJcmV0ID0gc25kX3NvY193cml0ZShyZWdpc3RlcmVkX2RpZ2NvZGVjLCByZWcsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZtc204eDE2X3djZC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQl1MTYgcmVnLCB1OCBtYXNrLCB1OCB2YWwpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2X3djZCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisKKwlwcl9lcnIoIiVzIHJlZyA9ICV4XG4iLCBfX2Z1bmNfXywgcmVnKTsKKwltdXRleF9sb2NrKCZtc204eDE2X3djZC0+aW9fbG9jayk7CisJaWYgKE1TTTg5WFhfSVNfUE1JQ19DRENfUkVHKHJlZykpCisJCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgbWFzaywgdmFsKTsKKwllbHNlIGlmIChNU004OVhYX0lTX0NEQ19DT1JFX1JFRyhyZWcpKQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHJlZ2lzdGVyZWRfZGlnY29kZWMsIHJlZywgbWFzaywgdmFsKTsKKwltdXRleF91bmxvY2soJm1zbTh4MTZfd2NkLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9tYmhjX21lYXNfaW1wZWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXMxNiAqaW1wZWRhbmNlX2wsIHMxNiAqaW1wZWRhbmNlX3IpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoKG1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9CT1RIKSB8fAorCQkobXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSEwpKSB7CisJCS8qIEVuYWJsZSBaREVUX0xfTUVBU19FTiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkJMHgwOCwgMHgwOCk7CisJCS8qIFdhaXQgZm9yIDJtcyBmb3IgbWVhc3VyZW1lbnQgdG8gY29tcGxldGUgKi8KKwkJdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOworCQkvKiBSZWFkIExlZnQgaW1wZWRhbmNlIHZhbHVlIGZyb20gUmVzdWx0MSAqLworCQkqaW1wZWRhbmNlX2wgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCk7CisJCS8qIEVuYWJsZSBaREVUX1JfTUVBU19FTiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkJMHgwOCwgMHgwMCk7CisJfQorCWlmICgobXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0JPVEgpIHx8CisJCShtc204eDE2X3djZC0+aW1wZWRfZGV0X3BpbiA9PSBXQ0RfTUJIQ19ERVRfSFBIUikpIHsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkweDA0LCAweDA0KTsKKwkJLyogV2FpdCBmb3IgMm1zIGZvciBtZWFzdXJlbWVudCB0byBjb21wbGV0ZSAqLworCQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjEwMCk7CisJCS8qIFJlYWQgUmlnaHQgaW1wZWRhbmNlIHZhbHVlIGZyb20gUmVzdWx0MSAqLworCQkqaW1wZWRhbmNlX3IgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwKKwkJCQkweDA0LCAweDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfc2V0X3JlZl9jdXJyZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQllbnVtIHdjZF9jdXJyX3JlZiBjdXJyX3JlZikKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2VycigiJXM6IGN1cnJfcmVmOiAlZFxuIiwgX19mdW5jX18sIGN1cnJfcmVmKTsKKworCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPCBDQUpPTikKKwkJcHJfZXJyKCIlczogU2V0dGluZyByZWYgY3VycmVudCBub3QgcmVxdWlyZWRcbiIsIF9fZnVuY19fKTsKKworCW1zbTh4MTZfd2NkLT5pbXBlZF9pX3JlZiA9IGltcGVkX2lfcmVmW2N1cnJfcmVmXTsKKworCXN3aXRjaCAoY3Vycl9yZWYpIHsKKwljYXNlIElfaDRfVUE6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAorCQkJMHgwNywgMHgwMSk7CisJCWJyZWFrOworCWNhc2UgSV9wdDVfVUE6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAorCQkJMHgwNywgMHgwNCk7CisJCWJyZWFrOworCWNhc2UgSV8xNF9VQToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCisJCQkweDA3LCAweDAzKTsKKwkJYnJlYWs7CisJY2FzZSBJX2w0X1VBOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwKKwkJCTB4MDcsIDB4MDEpOworCQlicmVhazsKKwljYXNlIElfMV9VQToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCisJCQkweDA3LCAweDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogTm8gcmVmIGN1cnJlbnQgc2V0XG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGJvb2wgbXNtOHgxNl9hZGpfcmVmX2N1cnJlbnQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlzMTYgKmltcGVkYW5jZV9sLCBzMTYgKmltcGVkYW5jZV9yKQoreworCWludCBpID0gMjsKKwlzMTYgY29tcGFyZV9pbXAgPSAwOworCisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAobXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSFIpCisJCWNvbXBhcmVfaW1wID0gKmltcGVkYW5jZV9yOworCWVsc2UKKwkJY29tcGFyZV9pbXAgPSAqaW1wZWRhbmNlX2w7CisKKwlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpIDwgQ0FKT04pIHsKKwkJcHJfZXJyKCIlczogUmVmZXJlbmNlIGN1cnJlbnQgYWRqdXN0bWVudCBub3QgcmVxdWlyZWRcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJd2hpbGUgKGNvbXBhcmVfaW1wIDwgaW1wZWRfaV9yZWZbaV0ubWluX3ZhbCkgeworCQltc204eDE2X3NldF9yZWZfY3VycmVudChjb2RlYywKKwkJCQkJaW1wZWRfaV9yZWZbKytpXS5jdXJyX3JlZik7CisJCXdjZF9tYmhjX21lYXNfaW1wZWQoY29kZWMsCisJCQkJaW1wZWRhbmNlX2wsIGltcGVkYW5jZV9yKTsKKwkJY29tcGFyZV9pbXAgPSAobXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSFIpCisJCQkJPyAqaW1wZWRhbmNlX3IgOiAqaW1wZWRhbmNlX2w7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgbXNtOHgxNl93Y2Rfc3BrX2V4dF9wYV9jYigKKwkJaW50ICgqY29kZWNfc3BrX2V4dF9wYSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJaW50IGVuYWJsZSksIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2VycigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisJbXNtOHgxNl93Y2QtPmNvZGVjX3Nwa19leHRfcGFfY2IgPSBjb2RlY19zcGtfZXh0X3BhOworfQorCit2b2lkIG1zbTh4MTZfd2NkX2hwaF9jb21wX2NiKAorCWludCAoKmNvZGVjX2hwaF9jb21wX2dwaW8pKGJvb2wgZW5hYmxlKSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZXJyKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKKwltc204eDE2X3djZC0+Y29kZWNfaHBoX2NvbXBfZ3BpbyA9IGNvZGVjX2hwaF9jb21wX2dwaW87Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX2NvbXB1dGVfaW1wZWRhbmNlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgczE2IGwsCisJCQkJczE2IHIsIHVpbnQzMl90ICp6bCwgdWludDMyX3QgKnpyLCBib29sIGhpZ2gpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdWludDMyX3QgcmwgPSAwLCByciA9IDA7CisJc3RydWN0IHdjZF9pbXBlZF9pX3JlZiBSID0gbXNtOHgxNl93Y2QtPmltcGVkX2lfcmVmOworCWludCBjb2RlY192ZXIgPSBnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCk7CisKKwlzd2l0Y2ggKGNvZGVjX3ZlcikgeworCWNhc2UgVE9NQkFLXzFfMDoKKwljYXNlIFRPTUJBS18yXzA6CisJY2FzZSBDT05HQToKKwkJaWYgKGhpZ2gpIHsKKwkJCXByX2VycigiJXM6IFRoaXMgcGx1ZyBoYXMgaGlnaCByYW5nZSBpbXBlZGFuY2VcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJsID0gKHVpbnQzMl90KSgoKDEwMCAqIChsICogNDAwIC0gMjAwKSkvOTYpIC0gMjMwKTsKKwkJCXJyID0gKHVpbnQzMl90KSgoKDEwMCAqIChyICogNDAwIC0gMjAwKSkvOTYpIC0gMjMwKTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IFRoaXMgcGx1ZyBoYXMgbG93IHJhbmdlIGltcGVkYW5jZVxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmwgPSAodWludDMyX3QpKCgoMTAwMCAqIChsICogMiAtIDEpKS8xMTY1KSAtICgxMy8xMCkpOworCQkJcnIgPSAodWludDMyX3QpKCgoMTAwMCAqIChyICogMiAtIDEpKS8xMTY1KSAtICgxMy8xMCkpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0FKT046CisJY2FzZSBDQUpPTl8yXzA6CisJY2FzZSBESUFOR1U6CisJCWlmIChtc204eDE2X3djZC0+aW1wZWRfZGV0X3BpbiA9PSBXQ0RfTUJIQ19ERVRfSFBITCkgeworCQkJcnIgPSAodWludDMyX3QpKCgoREVGQVVMVF9NVUxUSVBMSUVSICogKDEwICogciAtIDUpKSAtCisJCQkgICAoREVGQVVMVF9PRkZTRVQgKiBERUZBVUxUX0dBSU4pKS9ERUZBVUxUX0dBSU4pOworCQkJcmwgPSAodWludDMyX3QpKCgoMTAwMDAgKiAoUi5tdWx0aXBsaWVyICogKDEwICogbCAtIDUpKSkKKwkJCSAgICAgIC0gUi5vZmZzZXQgKiBSLmdhaW5fYWRqKS8oUi5nYWluX2FkaiAqIDEwMCkpOworCQl9IGVsc2UgaWYgKG1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9IUEhSKSB7CisJCQlyciA9ICh1aW50MzJfdCkoKCgxMDAwMCAqIChSLm11bHRpcGxpZXIgKiAoMTAgKiByIC0gNSkpKQorCQkJICAgICAgLSBSLm9mZnNldCAqIFIuZ2Fpbl9hZGopLyhSLmdhaW5fYWRqICogMTAwKSk7CisJCQlybCA9ICh1aW50MzJfdCkoKChERUZBVUxUX01VTFRJUExJRVIgKiAoMTAgKiBsIC0gNSkpLQorCQkJICAgKERFRkFVTFRfT0ZGU0VUICogREVGQVVMVF9HQUlOKSkvREVGQVVMVF9HQUlOKTsKKwkJfSBlbHNlIGlmIChtc204eDE2X3djZC0+aW1wZWRfZGV0X3BpbiA9PSBXQ0RfTUJIQ19ERVRfTk9ORSkgeworCQkJcnIgPSAodWludDMyX3QpKCgoREVGQVVMVF9NVUxUSVBMSUVSICogKDEwICogciAtIDUpKSAtCisJCQkgICAoREVGQVVMVF9PRkZTRVQgKiBERUZBVUxUX0dBSU4pKS9ERUZBVUxUX0dBSU4pOworCQkJcmwgPSAodWludDMyX3QpKCgoREVGQVVMVF9NVUxUSVBMSUVSICogKDEwICogbCAtIDUpKS0KKwkJCSAgIChERUZBVUxUX09GRlNFVCAqIERFRkFVTFRfR0FJTikpL0RFRkFVTFRfR0FJTik7CisJCX0gZWxzZSB7CisJCQlyciA9ICh1aW50MzJfdCkoKCgxMDAwMCAqIChSLm11bHRpcGxpZXIgKiAoMTAgKiByIC0gNSkpKQorCQkJICAgICAgLSBSLm9mZnNldCAqIFIuZ2Fpbl9hZGopLyhSLmdhaW5fYWRqICogMTAwKSk7CisJCQlybCA9ICh1aW50MzJfdCkoKCgxMDAwMCAqIChSLm11bHRpcGxpZXIgKiAoMTAgKiBsIC0gNSkpKQorCQkJICAgICAgLSBSLm9mZnNldCAqIFIuZ2Fpbl9hZGopLyhSLmdhaW5fYWRqICogMTAwKSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogTm8gY29kZWMgbWVudGlvbmVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKwkqemwgPSBybDsKKwkqenIgPSBycjsKK30KKworc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9jYWwgKm1zbTh4MTZfd2NkX2dldF9od2RlcF9md19jYWwoCisJCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJZW51bSB3Y2RfY2FsX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2Q7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzOiBOVUxMIGNvZGVjIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwobXNtOHgxNl93Y2QtPmZ3X2RhdGEsIHR5cGUpOworCWlmICghaHdkZXBfY2FsKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjYWwgbm90IHNlbnQgYnkgJWRcbiIsCisJCQkJX19mdW5jX18sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGh3ZGVwX2NhbDsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9zcG1pX2lycV9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIGludCBpcnEsIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCXdjZDl4eHhfc3BtaV9lbmFibGVfaXJxKGlycSk7CisJZWxzZQorCQl3Y2Q5eHh4X3NwbWlfZGlzYWJsZV9pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl9tYmhjX2Nsa19zZXR1cChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCQkweDA4LCAweDA4KTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCQkJMHgwOCwgMHgwMCk7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl9tYmhjX21hcF9idG5fY29kZV90b19udW0oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBidG5fY29kZTsKKwlpbnQgYnRuOworCisJYnRuX2NvZGUgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTl9SRVNVTFQpOworCisJc3dpdGNoIChidG5fY29kZSkgeworCWNhc2UgMDoKKwkJYnRuID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlidG4gPSAxOworCQlicmVhazsKKwljYXNlIDM6CisJCWJ0biA9IDI7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJYnRuID0gMzsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJYnRuID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnRuID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBidG47Cit9CisKK3N0YXRpYyBib29sIG1zbTh4MTZfc3BtaV9sb2NrX3NsZWVwKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgYm9vbCBsb2NrKQoreworCWlmIChsb2NrKQorCQlyZXR1cm4gd2NkOXh4eF9zcG1pX2xvY2tfc2xlZXAoKTsKKwl3Y2Q5eHh4X3NwbWlfdW5sb2NrX3NsZWVwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG1zbTh4MTZfd2NkX21pY2JfZW5fc3RhdHVzKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgaW50IG1pY2JfbnVtKQoreworCWlmIChtaWNiX251bSA9PSBNSUNfQklBU18xKQorCQlyZXR1cm4gKHNuZF9zb2NfcmVhZF93cmFwcGVyKG1iaGMtPmNvZGVjLAorCQkJCSAgICAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4pICYKKwkJCTB4ODApOworCWlmIChtaWNiX251bSA9PSBNSUNfQklBU18yKQorCQlyZXR1cm4gKHNuZF9zb2NfcmVhZF93cmFwcGVyKG1iaGMtPmNvZGVjLAorCQkJCSAgICAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4pICYKKwkJCTB4ODApOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2RfZW5hYmxlX21hc3Rlcl9iaWFzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVEwsCisJCQkweDMwLCAweDMwKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMLAorCQkJMHgzMCwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX21iaGNfY29tbW9uX21pY2JfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgIGludCBldmVudCwgYm9vbCBlbmFibGUpCit7CisJdTE2IHJlZzsKKwl1OCBtYXNrOworCXU4IHZhbDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE1CSENfQ09NTU9OX01JQ0JfUFJFQ0hBUkdFOgorCQlyZWcgPSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9DVEw7CisJCW1hc2sgPSAweDYwOworCQl2YWwgPSAoZW5hYmxlID8gMHg2MCA6IDB4MDApOworCQlicmVhazsKKwljYXNlIE1CSENfQ09NTU9OX01JQ0JfU0VUX1ZBTDoKKwkJcmVnID0gTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfVkFMOworCQltYXNrID0gMHhGRjsKKwkJdmFsID0gKGVuYWJsZSA/IDB4QzAgOiAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBNQkhDX0NPTU1PTl9NSUNCX1RBSUxfQ1VSUjoKKwkJcmVnID0gTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU47CisJCW1hc2sgPSAweDA0OworCQl2YWwgPSAoZW5hYmxlID8gMHgwNCA6IDB4MDApOworCQlicmVhazsKKwl9OworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgcmVnLCBtYXNrLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9tYmhjX2ludGVybmFsX21pY2JpYXNfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCQkgICBpbnQgbWljYmlhc19udW0sIGJvb2wgZW5hYmxlKQoreworCWlmIChtaWNiaWFzX251bSA9PSAxKSB7CisJCWlmIChlbmFibGUpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTLAorCQkJCTB4MTAsIDB4MTApOworCQllbHNlCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTLAorCQkJCTB4MTAsIDB4MDApOworCX0KK30KKworc3RhdGljIGJvb2wgbXNtOHgxNl93Y2RfbWJoY19ocGhfcGFfb25fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gKHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4pICYKKwkJMHgzMCkgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX21iaGNfcHJvZ3JhbV9idG5fdGhyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgICBzMTYgKmJ0bl9sb3csIHMxNiAqYnRuX2hpZ2gsCisJCQkJCSAgICAgaW50IG51bV9idG4sIGJvb2wgaXNfbWljYmlhcykKK3sKKwlpbnQgaTsKKwl1MzIgY291cnNlLCBmaW5lLCByZWdfdmFsOworCXUxNiByZWdfYWRkciA9IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTDsKKwlzMTYgKmJ0bl92b2x0YWdlOworCisJYnRuX3ZvbHRhZ2UgPSAoKGlzX21pY2JpYXMpID8gYnRuX2hpZ2ggOiBidG5fbG93KTsKKworCWZvciAoaSA9IDA7IGkgPCAgbnVtX2J0bjsgaSsrKSB7CisJCWNvdXJzZSA9IChidG5fdm9sdGFnZVtpXSAvIE1TTTg5WFhfTUJIQ19CVE5fQ09BUlNFX0FESik7CisJCWZpbmUgPSAoKGJ0bl92b2x0YWdlW2ldICUgTVNNODlYWF9NQkhDX0JUTl9DT0FSU0VfQURKKSAvCisJCQkJTVNNODlYWF9NQkhDX0JUTl9GSU5FX0FESik7CisKKwkJcmVnX3ZhbCA9IChjb3Vyc2UgPDwgNSkgfCAoZmluZSA8PCAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCByZWdfYWRkciwgMHhGQywgcmVnX3ZhbCk7CisJCXByX2VycigiJXM6IGNvdXJzZTogJWQgZmluZTogJWQgcmVnX2FkZHI6ICV4IHJlZ192YWw6ICV4XG4iLAorCQkJICBfX2Z1bmNfXywgY291cnNlLCBmaW5lLCByZWdfYWRkciwgcmVnX3ZhbCk7CisJCXJlZ19hZGRyKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdWludDMyX3QgKnpsLAorCQkJCQkgICAgdWludDMyX3QgKnpyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXMxNiBpbXBlZGFuY2VfbCwgaW1wZWRhbmNlX3I7CisJczE2IGltcGVkYW5jZV9sX2ZpeGVkOworCXMxNiByZWcwLCByZWcxLCByZWcyLCByZWczLCByZWc0OworCWJvb2wgaGlnaCA9IGZhbHNlOworCWJvb2wgbWluX3JhbmdlX3VzZWQgPSAgZmFsc2U7CisKKwlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKKwlyZWcwID0gc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREJOQ19USU1FUik7CisJcmVnMSA9IHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMKTsKKwlyZWcyID0gc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yKTsKKwlyZWczID0gc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTik7CisJcmVnNCA9IHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwpOworCisJbXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPSBXQ0RfTUJIQ19ERVRfQk9USDsKKwltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOworCisJLyogZGlzYWJsZSBGU00gYW5kIG1pY2JpYXMgYW5kIGVuYWJsZSBwdWxsdXAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHg4MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCisJCQkweEE1LCAweDI1KTsKKwkvKgorCSAqIEVuYWJsZSBsZWdhY3kgZWxlY3RyaWNhbCBkZXRlY3Rpb24gY3VycmVudCBzb3VyY2VzCisJICogYW5kIGRpc2FibGUgZmFzdCByYW1wIGFuZCBlbmFibGUgbWFudWFsIHN3aXRjaGluZworCSAqIG9mIGV4dHJhIGNhcGFjaXRhbmNlCisJICovCisJcHJfZXJyKCIlczogU2V0dXAgZm9yIGltcGVkYW5jZSBkZXRcbiIsIF9fZnVuY19fKTsKKworCW1zbTh4MTZfc2V0X3JlZl9jdXJyZW50KGNvZGVjLCBJX2g0X1VBKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsCisJCQkweDA2LCAweDAyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREJOQ19USU1FUiwKKwkJCTB4MDIsIDB4MDIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4yX1pERVRIX0NUTCwKKwkJCTB4MDIsIDB4MDApOworCisJcHJfZXJyKCIlczogU3RhcnQgcGVyZm9ybWluZyBpbXBlZGFuY2UgZGV0ZWN0aW9uXG4iLAorCQkgX19mdW5jX18pOworCisJd2NkX21iaGNfbWVhc19pbXBlZChjb2RlYywgJmltcGVkYW5jZV9sLCAmaW1wZWRhbmNlX3IpOworCisJaWYgKGltcGVkYW5jZV9sID4gMiB8fCBpbXBlZGFuY2VfciA+IDIpIHsKKwkJaGlnaCA9IHRydWU7CisJCWlmICghbWJoYy0+bWJoY19jZmctPm1vbm9fc3Rlcm9fZGV0ZWN0aW9uKSB7CisJCQkvKiBTZXQgWkRFVF9DSEcgdG8gMCAgdG8gZGlzY2hhcmdlIHJhbXAgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkJCTB4MDIsIDB4MDApOworCQkJLyogd2FpdCA0MG1zIGZvciB0aGUgZGlzY2hhcmdlIHJhbXAgdG8gY29tcGxldGUgKi8KKwkJCXVzbGVlcF9yYW5nZSg0MDAwMCwgNDAxMDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCQkweDAzLCAweDAwKTsKKwkJCW1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID0gKGltcGVkYW5jZV9sID4gMiAmJgorCQkJCQkJICAgICAgaW1wZWRhbmNlX3IgPiAyKSA/CisJCQkJCQkgICAgICBXQ0RfTUJIQ19ERVRfTk9ORSA6CisJCQkJCQkgICAgICAoKGltcGVkYW5jZV9sID4gMikgPworCQkJCQkJICAgICAgV0NEX01CSENfREVUX0hQSFIgOgorCQkJCQkJICAgICAgV0NEX01CSENfREVUX0hQSEwpOworCQkJaWYgKG1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9OT05FKQorCQkJCWdvdG8gZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPj0gQ0FKT04pIHsKKwkJCQlpZiAoaW1wZWRhbmNlX2wgPT0gNjMgJiYgaW1wZWRhbmNlX3IgPT0gNjMpIHsKKwkJCQkJcHJfZXJyKCIlczogSFBITCBhbmQgSFBIUiBhcmUgZmxvYXRpbmdcbiIsCisJCQkJCQkgX19mdW5jX18pOworCQkJCQltc204eDE2X3djZC0+aW1wZWRfZGV0X3BpbiA9CisJCQkJCQkJV0NEX01CSENfREVUX05PTkU7CisJCQkJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX05PTkU7CisJCQkJfSBlbHNlIGlmIChpbXBlZGFuY2VfbCA9PSA2MworCQkJCQkgICAmJiBpbXBlZGFuY2VfciA8IDYzKSB7CisJCQkJCXByX2VycigiJXM6IE1vbm8gSFMgd2l0aCBIUEhMIGZsb2F0aW5nXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKKwkJCQkJbXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPQorCQkJCQkJCVdDRF9NQkhDX0RFVF9IUEhSOworCQkJCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9NT05POworCQkJCX0gZWxzZSBpZiAoaW1wZWRhbmNlX3IgPT0gNjMgJiYKKwkJCQkJICAgaW1wZWRhbmNlX2wgPCA2MykgeworCQkJCQlwcl9lcnIoIiVzOiBNb25vIEhTIHdpdGggSFBIUiBmbG9hdGluZ1xuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CisJCQkJCW1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID0KKwkJCQkJCQlXQ0RfTUJIQ19ERVRfSFBITDsKKwkJCQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKKwkJCQl9IGVsc2UgaWYgKGltcGVkYW5jZV9sID4gMyAmJiBpbXBlZGFuY2VfciA+IDMgJiYKKwkJCQkJKGltcGVkYW5jZV9sID09IGltcGVkYW5jZV9yKSkgeworCQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsCisJCQkJCTB4MDYsIDB4MDYpOworCQkJCQl3Y2RfbWJoY19tZWFzX2ltcGVkKGNvZGVjLCAmaW1wZWRhbmNlX2wsCisJCQkJCQkJICAgICZpbXBlZGFuY2Vfcik7CisJCQkJCWlmIChpbXBlZGFuY2VfciA9PSBpbXBlZGFuY2VfbCkKKwkJCQkJCXByX2VycigiJXM6IE1vbm8gSGVhZHNldFxuIiwKKwkJCQkJCQkgIF9fZnVuY19fKTsKKwkJCQkJCW1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID0KKwkJCQkJCQlXQ0RfTUJIQ19ERVRfTk9ORTsKKwkJCQkJCW1iaGMtPmhwaF90eXBlID0KKwkJCQkJCQlXQ0RfTUJIQ19IUEhfTU9OTzsKKwkJCQl9IGVsc2UgeworCQkJCQlwcl9lcnIoIiVzOiBTVEVSRU8gaGVhZHNldCBpcyBmb3VuZFxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CisJCQkJCW1zbTh4MTZfd2NkLT5pbXBlZF9kZXRfcGluID0KKwkJCQkJCQlXQ0RfTUJIQ19ERVRfQk9USDsKKwkJCQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfU1RFUkVPOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCW1zbTh4MTZfc2V0X3JlZl9jdXJyZW50KGNvZGVjLCBJX3B0NV9VQSk7CisJbXNtOHgxNl9zZXRfcmVmX2N1cnJlbnQoY29kZWMsIElfMTRfVUEpOworCisJLyogRW5hYmxlIFJBTVBfTCwgUkFNUF9SICYgWkRFVF9DSEcqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCTB4MDMsIDB4MDMpOworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHgwMiwgMHgwMik7CisJLyogd2FpdCBmb3IgNTBtc2VjIGZvciB0aGUgSFcgdG8gYXBwbHkgcmFtcCBvbiBIUEhMIGFuZCBIUEhSICovCisJdXNsZWVwX3JhbmdlKDUwMDAwLCA1MDEwMCk7CisJLyogRW5hYmxlIFpERVRfRElTQ0hHX0NBUF9DVEwgIHRvIGFkZCBleHRyYSBjYXBhY2l0YW5jZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHgwMSwgMHgwMSk7CisJLyogd2FpdCBmb3IgNW1zZWMgZm9yIHRoZSB2b2x0YWdlIHRvIGdldCBzdGFibGUgKi8KKwl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7CisKKworCXdjZF9tYmhjX21lYXNfaW1wZWQoY29kZWMsICZpbXBlZGFuY2VfbCwgJmltcGVkYW5jZV9yKTsKKworCW1pbl9yYW5nZV91c2VkID0gbXNtOHgxNl9hZGpfcmVmX2N1cnJlbnQoY29kZWMsCisJCQkJCQkmaW1wZWRhbmNlX2wsICZpbXBlZGFuY2Vfcik7CisJaWYgKCFtYmhjLT5tYmhjX2NmZy0+bW9ub19zdGVyb19kZXRlY3Rpb24pIHsKKwkJLyogU2V0IFpERVRfQ0hHIHRvIDAgIHRvIGRpc2NoYXJnZSByYW1wICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwKKwkJCQkweDAyLCAweDAwKTsKKwkJLyogd2FpdCBmb3IgNDBtc2VjIGZvciB0aGUgY2FwYWNpdG9yIHRvIGRpc2NoYXJnZSAqLworCQl1c2xlZXBfcmFuZ2UoNDAwMDAsIDQwMTAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCQkweDAzLCAweDAwKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHdlIGFyZSBzZXR0aW5nIHJlZiBjdXJyZW50IHRvIHRoZSBtaW5pbXVuIHJhbmdlIG9yIHRoZSBtZWFzdXJlZAorCSAqIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlLCBzbyBtaW5fcmFuZ2VfdXNlZCBpcyB0cnVlLgorCSAqIElmIHRoZSBoZWFkc2V0IGlzIG1vbm8gaGVhZHNldCB3aXRoIGVpdGhlciBIUEhMIG9yIEhQSFIgZmxvYXRpbmcKKwkgKiB0aGVuIHdlIGhhdmUgYWxyZWFkeSBkb25lIHRoZSBtb25vIHN0ZXJlbyBkZXRlY3Rpb24gYW5kIGRvIG5vdAorCSAqIG5lZWQgdG8gY29udGludWUgZnVydGhlci4KKwkgKi8KKworCWlmICghbWluX3JhbmdlX3VzZWQgfHwKKwkgICAgbXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSEwgfHwKKwkgICAgbXNtOHgxNl93Y2QtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSFIpCisJCWdvdG8gZXhpdDsKKworCisJLyogRGlzYWJsZSBTZXQgWkRFVF9DT05OX1JBTVBfTCBhbmQgZW5hYmxlIFpERVRfQ09OTl9GSVhFRF9MICovCisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjBfWkRFVExfQ1RMLAorCQkJMHgwMiwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjFfWkRFVE1fQ1RMLAorCQkJMHgwMiwgMHgwMik7CisJLyogU2V0IFpERVRfQ0hHIHRvIDAgICovCisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkweDAyLCAweDAwKTsKKwkvKiB3YWl0IGZvciA0MG1zZWMgZm9yIHRoZSBjYXBhY2l0b3IgdG8gZGlzY2hhcmdlICovCisJdXNsZWVwX3JhbmdlKDQwMDAwLCA0MDEwMCk7CisKKwkvKiBTZXQgWkRFVF9DT05OX1JBTVBfUiB0byAwICAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCTB4MDEsIDB4MDApOworCS8qIEVuYWJsZSBaREVUX0xfTUVBU19FTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHgwOCwgMHgwOCk7CisJLyogd2FpdCBmb3IgMm1zZWMgZm9yIHRoZSBIVyB0byBjb21wdXRlIGxlZnQgaW5wZWRhbmNlIHZhbHVlICovCisJdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOworCS8qIFJlYWQgTGVmdCBpbXBlZGFuY2UgdmFsdWUgZnJvbSBSZXN1bHQxICovCisJaW1wZWRhbmNlX2xfZml4ZWQgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUKTsKKwkvKiBEaXNhYmxlIFpERVRfTF9NRUFTX0VOICovCisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCisJCQkweDA4LCAweDAwKTsKKwkvKgorCSAqIEFzc3VtZSBpbXBlZGFuY2VfbCBpcyBMMSwgaW1wZWRhbmNlX2xfZml4ZWQgaXMgTDIuCisJICogSWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgbWV0LCB3ZSBjYW4gdGFrZSB0aGlzCisJICogaGVhZHNldCBhcyBtb25vIG9uZSB3aXRoIGltcGVkYW5jZSBvZiBMMi4KKwkgKiBPdGhlcndpc2UsIHRha2UgaXQgYXMgc3RlcmVvIHdpdGggaW1wZWRhbmNlIG9mIEwxLgorCSAqIENvbmRpdGlvbjoKKwkgKiBhYnNbKEwyLTAuNUwxKS8oTDIrMC41TDEpXSA8IGFicyBbKEwyLUwxKS8oTDIrTDEpXQorCSAqLworCWlmICgoYWJzKGltcGVkYW5jZV9sX2ZpeGVkIC0gaW1wZWRhbmNlX2wvMikgKgorCQkoaW1wZWRhbmNlX2xfZml4ZWQgKyBpbXBlZGFuY2VfbCkpID49CisJCShhYnMoaW1wZWRhbmNlX2xfZml4ZWQgLSBpbXBlZGFuY2VfbCkgKgorCQkoaW1wZWRhbmNlX2xfZml4ZWQgKyBpbXBlZGFuY2VfbC8yKSkpIHsKKwkJcHJfZXJyKCIlczogU1RFUkVPIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX1NURVJFTzsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBNT05PIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKKwkJaW1wZWRhbmNlX2wgPSBpbXBlZGFuY2VfbF9maXhlZDsKKwl9CisJLyogRW5hYmxlIFpERVRfQ0hHICAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHgwMiwgMHgwMik7CisJLyogd2FpdCBmb3IgMTBtc2VjIGZvciB0aGUgY2FwYWNpdG9yIHRvIGNoYXJnZSAqLworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCTB4MDIsIDB4MDIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4xX1pERVRNX0NUTCwKKwkJCTB4MDIsIDB4MDApOworCS8qIFNldCBaREVUX0NIRyB0byAwICB0byBkaXNjaGFyZ2UgSFBITCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAorCQkJMHgwMiwgMHgwMCk7CisJLyogd2FpdCBmb3IgNDBtc2VjIGZvciB0aGUgY2FwYWNpdG9yIHRvIGRpc2NoYXJnZSAqLworCXVzbGVlcF9yYW5nZSg0MDAwMCwgNDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKKwkJCTB4MDIsIDB4MDApOworCitleGl0OgorCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsIHJlZzQpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIHJlZzMpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMLCByZWcxKTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSLCByZWcwKTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIHJlZzIpOworCW1zbTh4MTZfd2NkX2NvbXB1dGVfaW1wZWRhbmNlKGNvZGVjLCBpbXBlZGFuY2VfbCwgaW1wZWRhbmNlX3IsCisJCQkJICAgICAgemwsIHpyLCBoaWdoKTsKKworCXByX2VycigiJXM6IFJMICVkIG9obSwgUlIgJWQgb2htXG4iLCBfX2Z1bmNfXywgKnpsLCAqenIpOworCXByX2VycigiJXM6IEltcGVkYW5jZSBkZXRlY3Rpb24gY29tcGxldGVkXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCisJCQkJICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaywKKwkJCQkgICAgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9CisJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGVuYWJsZSkKKwkJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZtc204eDE2X3djZC0+bm90aWZpZXIsCisJCQkJCQkJbmJsb2NrKTsKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigKKwkJCSZtc204eDE2X3djZC0+bm90aWZpZXIsCW5ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfcmVxdWVzdF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiB3Y2Q5eHh4X3NwbWlfcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCBuYW1lLCBkYXRhKTsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9mcmVlX2lycShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gd2NkOXh4eF9zcG1pX2ZyZWVfaXJxKGlycSwgZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgbWJoY19jYiA9IHsKKwkuZW5hYmxlX21iX3NvdXJjZSA9IG1zbTh4MTZfd2NkX2VuYWJsZV9leHRfbWJfc291cmNlLAorCS50cmltX2J0bl9yZWcgPSBtc204eDE2X3RyaW1fYnRuX3JlZywKKwkuY29tcHV0ZV9pbXBlZGFuY2UgPSBtc204eDE2X3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlLAorCS5zZXRfbWljYmlhc192YWx1ZSA9IG1zbTh4MTZfd2NkX3NldF9taWNiX3YsCisJLnNldF9hdXRvX3plcm9pbmcgPSBtc204eDE2X3djZF9zZXRfYXV0b196ZXJvaW5nLAorCS5nZXRfaHdkZXBfZndfY2FsID0gbXNtOHgxNl93Y2RfZ2V0X2h3ZGVwX2Z3X2NhbCwKKwkuc2V0X2NhcF9tb2RlID0gbXNtOHgxNl93Y2RfY29uZmlndXJlX2NhcCwKKwkucmVnaXN0ZXJfbm90aWZpZXIgPSBtc204eDE2X3JlZ2lzdGVyX25vdGlmaWVyLAorCS5yZXF1ZXN0X2lycSA9IG1zbTh4MTZfd2NkX3JlcXVlc3RfaXJxLAorCS5pcnFfY29udHJvbCA9IHdjZDl4eHhfc3BtaV9pcnFfY29udHJvbCwKKwkuZnJlZV9pcnEgPSBtc204eDE2X3djZF9mcmVlX2lycSwKKwkuY2xrX3NldHVwID0gbXNtOHgxNl9tYmhjX2Nsa19zZXR1cCwKKwkubWFwX2J0bl9jb2RlX3RvX251bSA9IG1zbTh4MTZfbWJoY19tYXBfYnRuX2NvZGVfdG9fbnVtLAorCS5sb2NrX3NsZWVwID0gbXNtOHgxNl9zcG1pX2xvY2tfc2xlZXAsCisJLm1pY2JpYXNfZW5hYmxlX3N0YXR1cyA9IG1zbTh4MTZfd2NkX21pY2JfZW5fc3RhdHVzLAorCS5tYmhjX2JpYXMgPSBtc204eDE2X3djZF9lbmFibGVfbWFzdGVyX2JpYXMsCisJLm1iaGNfY29tbW9uX21pY2JfY3RybCA9IG1zbTh4MTZfd2NkX21iaGNfY29tbW9uX21pY2JfY3RybCwKKwkubWljYl9pbnRlcm5hbCA9IG1zbTh4MTZfd2NkX21iaGNfaW50ZXJuYWxfbWljYmlhc19jdHJsLAorCS5ocGhfcGFfb25fc3RhdHVzID0gbXNtOHgxNl93Y2RfbWJoY19ocGhfcGFfb25fc3RhdHVzLAorCS5zZXRfYnRuX3RociA9IG1zbTh4MTZfd2NkX21iaGNfcHJvZ3JhbV9idG5fdGhyLAorCS5leHRuX3VzZV9tYiA9IG1zbTh4MTZfd2NkX3VzZV9tYiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCB3Y2RfaW1wZWRfdmFsW10gPSB7NCwgOCwgMTIsIDEzLCAxNiwKKwkJCQkJMjAsIDI0LCAyOCwgMzIsCisJCQkJCTM2LCA0MCwgNDQsIDQ4fTsKKwordm9pZCBtc204eDE2X25vdGlmaWVyX2NhbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgY29uc3QgZW51bSB3Y2Rfbm90aWZ5X2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZXJyKCIlczogbm90aWZpZXIgY2FsbCBldmVudCAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZtc204eDE2X3djZC0+bm90aWZpZXIsIGV2ZW50LAorCQkJCSAgICAgJm1zbTh4MTZfd2NkLT5tYmhjKTsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2RfYm9vc3Rfb24oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXU4IGRlc3QgPSAweDAwOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisKKwlpZiAoKGRlc3QgJiBNQVNLX01TQl9CSVQpID09IDApIHsKKwkJcHJfZXJyKCJQTUlDIE1CRyBub3QgT04sIGVuYWJsZSBjb2RlYyBod19lbiBNQiBiaXQgYWdhaW5cbiIpOworCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMLCAweDMwKTsKKwkJLyogQWxsb3cgMW1zIGZvciBQTUlDIE1CRyBzdGF0ZSB0byBiZSB1cGRhdGVkICovCisJCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDMsCisJCTB4MEYsIDB4MEYpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLAorCQkweEE1KTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMywKKwkJMHgwRik7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTCwKKwkJMHgzMCk7CisJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA8IENBSk9OXzJfMCkgeworCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsCisJCQkweDgyKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsCisJCQkweEEyKTsKKwl9CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwKKwkJMHg2OSwgMHg2OSk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0RCRywKKwkJMHgwMSwgMHgwMSk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NMT1BFX0NPTVBfSVBfWkVSTywKKwkJMHg4OCwgMHg4OCk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwKKwkJMHgwMywgMHgwMyk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwKKwkJMHhFMSwgMHhFMSk7CisJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA8IENBSk9OXzJfMCkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCQkweDIwLCAweDIwKTsKKwkJdXNsZWVwX3JhbmdlKENPREVDX0RFTEFZXzFfTVMsIENPREVDX0RFTEFZXzFfMV9NUyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAorCQkJMHhERiwgMHhERik7CisJCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAorCQkJMHg0MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCTB4MjAsIDB4MjApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwKKwkJCTB4ODAsIDB4ODApOworCQl1c2xlZXBfcmFuZ2UoNTAwLCA1MTApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwKKwkJCTB4NDAsIDB4NDApOworCQl1c2xlZXBfcmFuZ2UoNTAwLCA1MTApOworCX0KK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2RfYm9vc3Rfb2ZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAorCQkweERGLCAweDVGKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJMHgyMCwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX2J5cGFzc19vbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpIDwgQ0FKT05fMl8wKSB7CisJCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywKKwkJCTB4QTUpOworCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMsCisJCQkweDA3KTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERSwKKwkJCTB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAorCQkJMHgwMSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUsCisJCQkweDQwLCAweDQwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERSwKKwkJCTB4ODAsIDB4ODApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwKKwkJCTB4REYsIDB4REYpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCTB4MjAsIDB4MjApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAorCQkJMHgyMCwgMHgyMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9ieXBhc3Nfb2ZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPCBDQUpPTl8yXzApIHsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVEwsCisJCQkweDgwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERSwKKwkJCTB4ODAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAorCQkJMHgwMiwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUsCisJCQkweDQwLCAweDAwKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAorCQkJMHgyMCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCTB4MjAsIDB4MDApOworCX0KK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2RfYm9vc3RfbW9kZV9zZXF1ZW5jZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWludCBmbGFnKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGZsYWcgPT0gRUFSX1BNVSkgeworCQlzd2l0Y2ggKG1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24pIHsKKwkJY2FzZSBCT09TVF9TV0lUQ0g6CisJCQlpZiAobXNtOHgxNl93Y2QtPmVhcl9wYV9ib29zdF9zZXQpIHsKKwkJCQltc204eDE2X3djZF9ib29zdF9vZmYoY29kZWMpOworCQkJCW1zbTh4MTZfd2NkX2J5cGFzc19vbihjb2RlYyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCT09TVF9BTFdBWVM6CisJCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJCQlicmVhazsKKwkJY2FzZSBCWVBBU1NfQUxXQVlTOgorCQkJbXNtOHgxNl93Y2RfYnlwYXNzX29uKGNvZGVjKTsKKwkJCWJyZWFrOworCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6CisJCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6IGludmFsaWQgYm9vc3Qgb3B0aW9uOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCQltc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChmbGFnID09IEVBUl9QTUQpIHsKKwkJc3dpdGNoIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKSB7CisJCWNhc2UgQk9PU1RfU1dJVENIOgorCQkJaWYgKG1zbTh4MTZfd2NkLT5lYXJfcGFfYm9vc3Rfc2V0KQorCQkJCW1zbTh4MTZfd2NkX2J5cGFzc19vZmYoY29kZWMpOworCQkJYnJlYWs7CisJCWNhc2UgQk9PU1RfQUxXQVlTOgorCQkJbXNtOHgxNl93Y2RfYm9vc3Rfb2ZmKGNvZGVjKTsKKwkJCS8qIDgwbXMgZm9yIEVBUiBib29zdCB0byBzZXR0bGUgZG93biAqLworCQkJbXNsZWVwKDgwKTsKKwkJCWJyZWFrOworCQljYXNlIEJZUEFTU19BTFdBWVM6CisJCQkvKiBub3RoaW5nIHRvIGRvIGFzIGJ5cGFzcyBvbiBhbHdheXMgKi8KKwkJCWJyZWFrOworCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6CisJCQkvKiBub3RoaW5nIHRvIGRvIGFzIGJvb3N0IG9uIGZvcmV2ZXIgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogaW52YWxpZCBib29zdCBvcHRpb246ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCW1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24pOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGZsYWcgPT0gU1BLX1BNVSkgeworCQlzd2l0Y2ggKG1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24pIHsKKwkJY2FzZSBCT09TVF9TV0lUQ0g6CisJCQlpZiAobXNtOHgxNl93Y2QtPnNwa19ib29zdF9zZXQpIHsKKwkJCQltc204eDE2X3djZF9ieXBhc3Nfb2ZmKGNvZGVjKTsKKwkJCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCT09TVF9BTFdBWVM6CisJCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJCQlicmVhazsKKwkJY2FzZSBCWVBBU1NfQUxXQVlTOgorCQkJbXNtOHgxNl93Y2RfYnlwYXNzX29uKGNvZGVjKTsKKwkJCWJyZWFrOworCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6CisJCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6IGludmFsaWQgYm9vc3Qgb3B0aW9uOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCQltc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChmbGFnID09IFNQS19QTUQpIHsKKwkJc3dpdGNoIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKSB7CisJCWNhc2UgQk9PU1RfU1dJVENIOgorCQkJaWYgKG1zbTh4MTZfd2NkLT5zcGtfYm9vc3Rfc2V0KSB7CisJCQkJbXNtOHgxNl93Y2RfYm9vc3Rfb2ZmKGNvZGVjKTsKKwkJCQkvKgorCQkJCSAqIEFkZCA0MCBtcyBzbGVlcCBmb3IgdGhlIHNwaworCQkJCSAqIGJvb3N0IHRvIHNldHRsZSBkb3duCisJCQkJICovCisJCQkJbXNsZWVwKDQwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJPT1NUX0FMV0FZUzoKKwkJCW1zbTh4MTZfd2NkX2Jvb3N0X29mZihjb2RlYyk7CisJCQkvKgorCQkJICogQWRkIDQwIG1zIHNsZWVwIGZvciB0aGUgc3BrCisJCQkgKiBib29zdCB0byBzZXR0bGUgZG93bgorCQkJICovCisJCQltc2xlZXAoNDApOworCQkJYnJlYWs7CisJCWNhc2UgQllQQVNTX0FMV0FZUzoKKwkJCS8qIG5vdGhpbmcgdG8gZG8gYXMgYnlwYXNzIG9uIGFsd2F5cyAqLworCQkJYnJlYWs7CisJCWNhc2UgQk9PU1RfT05fRk9SRVZFUjoKKwkJCS8qIG5vdGhpbmcgdG8gZG8gYXMgYm9vc3Qgb24gZm9yZXZlciAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9kdF9wYXJzZV92cmVnX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBtc204eDE2X3djZF9yZWd1bGF0b3IgKnZyZWcsIGNvbnN0IGNoYXIgKnZyZWdfbmFtZSwKKwlib29sIG9uZGVtYW5kKQoreworCWludCBsZW4sIHJldCA9IDA7CisJY29uc3QgX19iZTMyICpwcm9wOworCWNoYXIgcHJvcF9uYW1lW0NPREVDX0RUX01BWF9QUk9QX1NJWkVdOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcmVnbm9kZSA9IE5VTEw7CisJdTMyIHByb3BfdmFsOworCisJc25wcmludGYocHJvcF9uYW1lLCBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFLCAiJXMtc3VwcGx5IiwKKwkJdnJlZ19uYW1lKTsKKwlyZWdub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgMCk7CisKKwlpZiAoIXJlZ25vZGUpIHsKKwkJZGV2X2VycihkZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkXG4iLAorCQkJcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldl9lcnIoZGV2LCAiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzXG4iLAorCQlwcm9wX25hbWUsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKworCXZyZWctPm5hbWUgPSB2cmVnX25hbWU7CisJdnJlZy0+b25kZW1hbmQgPSBvbmRlbWFuZDsKKworCXNucHJpbnRmKHByb3BfbmFtZSwgQ09ERUNfRFRfTUFYX1BST1BfU0laRSwKKwkJInFjb20sJXMtdm9sdGFnZSIsIHZyZWdfbmFtZSk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgJmxlbik7CisKKwlpZiAoIXByb3AgfHwgKGxlbiAhPSAoMiAqIHNpemVvZihfX2JlMzIpKSkpIHsKKwkJZGV2X2VycihkZXYsICIlcyAlcyBwcm9wZXJ0eVxuIiwKKwkJCXByb3AgPyAiaW52YWxpZCBmb3JtYXQiIDogIm5vIiwgcHJvcF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZyZWctPm1pbl91diA9IGJlMzJfdG9fY3B1cCgmcHJvcFswXSk7CisJdnJlZy0+bWF4X3V2ID0gYmUzMl90b19jcHVwKCZwcm9wWzFdKTsKKworCXNucHJpbnRmKHByb3BfbmFtZSwgQ09ERUNfRFRfTUFYX1BST1BfU0laRSwKKwkJInFjb20sJXMtY3VycmVudCIsIHZyZWdfbmFtZSk7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgJnByb3BfdmFsKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCisJCQlwcm9wX25hbWUsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXZyZWctPm9wdGltdW1fdWEgPSBwcm9wX3ZhbDsKKworCWRldl9lcnIoZGV2LCAiJXM6IHZvbD1bJWQgJWRddVYsIGN1cnI9WyVkXXVBLCBvbmQgJWRcblxuIiwgdnJlZy0+bmFtZSwKKwkJIHZyZWctPm1pbl91diwgdnJlZy0+bWF4X3V2LCB2cmVnLT5vcHRpbXVtX3VhLCB2cmVnLT5vbmRlbWFuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX2R0X3BhcnNlX2Jvb3N0X2luZm8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZF9wcml2ID0KKwkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY29uc3QgY2hhciAqcHJvcF9uYW1lID0gInFjb20sY2RjLWJvb3N0LXZvbHRhZ2UiOworCWludCBib29zdF92b2x0YWdlLCByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjb2RlYy0+ZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsCisJCQkmYm9vc3Rfdm9sdGFnZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkXG4iLAorCQkJcHJvcF9uYW1lLCBjb2RlYy0+ZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlib29zdF92b2x0YWdlID0gREVGQVVMVF9CT09TVF9WT0xUQUdFOworCX0KKwlpZiAoYm9vc3Rfdm9sdGFnZSA8IE1JTl9CT09TVF9WT0xUQUdFIHx8CisJCQlib29zdF92b2x0YWdlID4gTUFYX0JPT1NUX1ZPTFRBR0UpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJJbmNvcnJlY3QgYm9vc3Qgdm9sdGFnZS4gUmV2ZXJ0aW5nIHRvIGRlZmF1bHRcbiIpOworCQlib29zdF92b2x0YWdlID0gREVGQVVMVF9CT09TVF9WT0xUQUdFOworCX0KKworCW1zbTh4MTZfd2NkX3ByaXYtPmJvb3N0X3ZvbHRhZ2UgPQorCQlWT0xUQUdFX0NPTlZFUlRFUihib29zdF92b2x0YWdlLCBNSU5fQk9PU1RfVk9MVEFHRSwKKwkJCQlCT09TVF9WT0xUQUdFX1NURVApOworCWRldl9lcnIoY29kZWMtPmRldiwgIkJvb3N0IHZvbHRhZ2UgdmFsdWUgaXM6ICVkXG4iLAorCQkJYm9vc3Rfdm9sdGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX2R0X3BhcnNlX21pY2JpYXNfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXMpCit7CisJY29uc3QgY2hhciAqcHJvcF9uYW1lID0gInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQtbXYiOworCWludCByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwKKwkJCSZtaWNiaWFzLT5jZmlsdDFfbXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKKwkJCXByb3BfbmFtZSwgZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQltaWNiaWFzLT5jZmlsdDFfbXYgPSBNSUNCSUFTX0RFRkFVTFRfVkFMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBtc204eDE2X3djZF9wZGF0YSAqbXNtOHgxNl93Y2RfcG9wdWxhdGVfZHRfcGRhdGEoCisJCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3BkYXRhICpwZGF0YTsKKwlpbnQgcmV0LCBzdGF0aWNfY250LCBvbmRfY250LCBpZHgsIGk7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqc3RhdGljX3Byb3BfbmFtZSA9ICJxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMiOworCWNvbnN0IGNoYXIgKm9uZF9wcm9wX25hbWUgPSAicWNvbSxjZGMtb24tZGVtYW5kLXN1cHBsaWVzIjsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiBOVUxMOworCisJc3RhdGljX2NudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGV2LT5vZl9ub2RlLCBzdGF0aWNfcHJvcF9uYW1lKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHN0YXRpY19jbnQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgc3RhdGljIHN1cHBsaWVzICVkXG4iLCBfX2Z1bmNfXywKKwkJCXN0YXRpY19jbnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBPbi1kZW1hbmQgc3VwcGx5IGxpc3QgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkgKi8KKwlvbmRfY250ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhkZXYtPm9mX25vZGUsIG9uZF9wcm9wX25hbWUpOworCWlmIChJU19FUlJfVkFMVUUob25kX2NudCkpCisJCW9uZF9jbnQgPSAwOworCisJV0FSTl9PTihzdGF0aWNfY250IDw9IDAgfHwgb25kX2NudCA8IDApOworCWlmICgoc3RhdGljX2NudCArIG9uZF9jbnQpID4gQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBOdW0gb2Ygc3VwcGxpZXMgJXUgPiBtYXggc3VwcG9ydGVkICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywgKHN0YXRpY19jbnQgKyBvbmRfY250KSwKKwkJCQkJQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgc3RhdGljX2NudDsgaWR4KyspIHsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLAorCQkJCQkJICAgIHN0YXRpY19wcm9wX25hbWUsIGlkeCwKKwkJCQkJCSAgICAmbmFtZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiJXM6IG9mIHJlYWQgc3RyaW5nICVzIGlkeCAlZCBlcnJvciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc3RhdGljX3Byb3BfbmFtZSwgaWR4LCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKworCQlkZXZfZXJyKGRldiwgIiVzOiBGb3VuZCBzdGF0aWMgY2RjIHN1cHBseSAlc1xuIiwgX19mdW5jX18sCisJCQluYW1lKTsKKwkJcmV0ID0gbXNtOHgxNl93Y2RfZHRfcGFyc2VfdnJlZ19pbmZvKGRldiwKKwkJCQkJCSZwZGF0YS0+cmVndWxhdG9yW2lkeF0sCisJCQkJCQluYW1lLCBmYWxzZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiJXM6ZXJyIHBhcnNpbmcgdnJlZyBmb3IgJXMgaWR4ICVkXG4iLAorCQkJCV9fZnVuY19fLCBuYW1lLCBpZHgpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgb25kX2NudDsgaSsrLCBpZHgrKykgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChkZXYtPm9mX25vZGUsIG9uZF9wcm9wX25hbWUsCisJCQkJCQkgICAgaSwgJm5hbWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiBlcnIgcGFyc2luZyBvbl9kZW1hbmQgZm9yICVzIGlkeCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgb25kX3Byb3BfbmFtZSwgaSk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWRldl9lcnIoZGV2LCAiJXM6IEZvdW5kIG9uLWRlbWFuZCBjZGMgc3VwcGx5ICVzXG4iLCBfX2Z1bmNfXywKKwkJCW5hbWUpOworCQlyZXQgPSBtc204eDE2X3djZF9kdF9wYXJzZV92cmVnX2luZm8oZGV2LAorCQkJCQkJJnBkYXRhLT5yZWd1bGF0b3JbaWR4XSwKKwkJCQkJCW5hbWUsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiBlcnIgcGFyc2luZyB2cmVnIG9uX2RlbWFuZCBmb3IgJXMgaWR4ICVkXG4iLAorCQkJCV9fZnVuY19fLCBuYW1lLCBpZHgpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJbXNtOHgxNl93Y2RfZHRfcGFyc2VfbWljYmlhc19pbmZvKGRldiwgJnBkYXRhLT5taWNiaWFzKTsKKwlyZXR1cm4gcGRhdGE7CitlcnI6CisJZGV2bV9rZnJlZShkZXYsIHBkYXRhKTsKKwlkZXZfZXJyKGRldiwgIiVzOiBGYWlsZWQgdG8gcG9wdWxhdGUgRFQgZGF0YSByZXQgPSAlZFxuIiwKKwkJX19mdW5jX18sIHJldCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX29uX2RlbWFuZF9zdXBwbHkoCisJCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgb25fZGVtYW5kX3N1cHBseSAqc3VwcGx5OworCisJaWYgKHctPnNoaWZ0ID49IE9OX0RFTUFORF9TVVBQTElFU19NQVgpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGVycm9yIGluZGV4ID4gTUFYIERlbWFuZCBzdXBwbGllcyIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogc3VwcGx5OiAlcyBldmVudDogJWQgcmVmOiAlZFxuIiwKKwkJX19mdW5jX18sIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0sIGV2ZW50LAorCQlhdG9taWNfcmVhZCgmbXNtOHgxNl93Y2QtPm9uX2RlbWFuZF9saXN0W3ctPnNoaWZ0XS5yZWYpKTsKKworCXN1cHBseSA9ICZtc204eDE2X3djZC0+b25fZGVtYW5kX2xpc3Rbdy0+c2hpZnRdOworCVdBUk5fT05DRSghc3VwcGx5LT5zdXBwbHksICIlcyBpc24ndCBkZWZpbmVkXG4iLAorCQkgIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0pOworCWlmICghc3VwcGx5LT5zdXBwbHkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGVyciBzdXBwbHkgbm90IHByZXNlbnQgb25kIGZvciAlZCIsCisJCQlfX2Z1bmNfXywgdy0+c2hpZnQpOworCQlnb3RvIG91dDsKKwl9CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmIChhdG9taWNfaW5jX3JldHVybigmc3VwcGx5LT5yZWYpID09IDEpCisJCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN1cHBseS0+c3VwcGx5KTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gZW5hYmxlICVzXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCW9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKGF0b21pY19yZWFkKCZzdXBwbHktPnJlZikgPT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6ICVzIHN1cHBseSBoYXMgYmVlbiBkaXNhYmxlZC5cbiIsCisJCQkJIF9fZnVuY19fLCBvbl9kZW1hbmRfc3VwcGx5X25hbWVbdy0+c2hpZnRdKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmc3VwcGx5LT5yZWYpID09IDApCisJCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShzdXBwbHktPnN1cHBseSk7CisJCQlpZiAocmV0KQorCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSAlc1xuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCW9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfY2xvY2tfYmxvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkJaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOworCWlmIChlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVEwsIDB4MDEsIDB4MDEpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMLCAweDAzLCAweDAzKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVEwsIDB4MzAsIDB4MzApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTCwgMHg4MCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19UT1BfQ0xLX0NUTCwgMHgwQywgMHgwQyk7CisJCWlmIChwZGF0YS0+bWNsa19mcmVxID09IE1DTEtfUkFURV8xMlAyODhNSFopCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9UT1BfQ1RMLCAweDAxLCAweDAwKTsKKwkJZWxzZSBpZiAocGRhdGEtPm1jbGtfZnJlcSA9PSBNQ0xLX1JBVEVfOVA2TUhaKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfVE9QX0NUTCwgMHgwMSwgMHgwMSk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1RPUF9DTEtfQ1RMLCAweDBDLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVEwsIDB4MDMsIDB4MDApOworCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9jaGFyZ2VfcHVtcChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2Nsb2NrX2Jsb2NrKGNvZGVjLCAxKTsKKwkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJFQVIgQ1AiKSkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAorCQkJCQkweDgwLCAweDgwKTsKKwkJCW1zbTh4MTZfd2NkX2Jvb3N0X21vZGVfc2VxdWVuY2UoY29kZWMsIEVBUl9QTVUpOworCQl9IGVsc2UgaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA9PSBESUFOR1UpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAorCQkJCQkweDgwLCAweDgwKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAorCQkJCQkweEMwLCAweEMwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJdXNsZWVwX3JhbmdlKENPREVDX0RFTEFZXzFfTVMsIENPREVDX0RFTEFZXzFfMV9NUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKKwkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJFQVIgQ1AiKSkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAorCQkJCQkweDgwLCAweDAwKTsKKwkJCWlmIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uICE9IEJPT1NUX0FMV0FZUykgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOiBib29zdF9vcHRpb246JWQsIHRlYXIgZG93biBlYXJcbiIsCisJCQkJCV9fZnVuY19fLCBtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKTsKKwkJCQltc204eDE2X3djZF9ib29zdF9tb2RlX3NlcXVlbmNlKGNvZGVjLCBFQVJfUE1EKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBSZXNldCBwYSBzZWxlY3QgYml0IGZyb20gZWFyIHRvIGhwaCBhZnRlciBlYXIgcGEKKwkJCSAqIGlzIGRpc2FibGVkIGFuZCBIUEggREFDIGRpc2FibGUgdG8gcmVkdWNlIGVhcgorCQkJICogdHVybiBvZmYgcG9wIGFuZCBhdm9pZCBIUEggcG9wIGluIGNvbmN1cnJlbmN5CisJCQkgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsIDB4ODAsIDB4MDApOworCQl9IGVsc2UgeworCQkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA8IERJQU5HVSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCQkJMHg0MCwgMHgwMCk7CisJCQlpZiAobXNtOHgxNl93Y2QtPnJ4X2JpYXNfY291bnQgPT0gMCkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKKwkJCQkJMHg4MCwgMHgwMCk7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogcnhfYmlhc19jb3VudCA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPnJ4X2JpYXNfY291bnQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9lYXJfcGFfYm9vc3RfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkobXNtOHgxNl93Y2QtPmVhcl9wYV9ib29zdF9zZXQgPyAxIDogMCk7CisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1zbTh4MTZfd2NkLT5lYXJfcGFfYm9vc3Rfc2V0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPmVhcl9wYV9ib29zdF9zZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2Vhcl9wYV9ib29zdF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0KKwkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAorCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCW1zbTh4MTZfd2NkLT5lYXJfcGFfYm9vc3Rfc2V0ID0KKwkJKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gdHJ1ZSA6IGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1OCBlYXJfcGFfZ2FpbjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCWVhcl9wYV9nYWluID0gc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwpOworCisJZWFyX3BhX2dhaW4gPSAoZWFyX3BhX2dhaW4gPj4gNSkgJiAweDE7CisKKwlpZiAoZWFyX3BhX2dhaW4gPT0gMHgwMCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJfSBlbHNlIGlmIChlYXJfcGFfZ2FpbiA9PSAweDAxKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwl9IGVsc2UgIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEVSUk9SOiBVbnN1cHBvcnRlZCBFYXIgR2FpbiA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgZWFyX3BhX2dhaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVhcl9wYV9nYWluOworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlYXJfcGFfZ2FpbiA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBlYXJfcGFfZ2Fpbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfbG9vcGJhY2tfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCisJcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gcGRhdGEtPmxiX21vZGU7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfbG9vcGJhY2tfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCisJcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAwOgorCQlwZGF0YS0+bGJfbW9kZSA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIDE6CisJCXBkYXRhLT5sYl9tb2RlID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfcGFfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggZWFyX3BhX2dhaW47CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAwOgorCQllYXJfcGFfZ2FpbiA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZWFyX3BhX2dhaW4gPSAweDIwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKKwkJCSAgICAweDIwLCBlYXJfcGFfZ2Fpbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfaHBoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKG1zbTh4MTZfd2NkLT5ocGhfbW9kZSA9PSBOT1JNQUxfTU9ERSkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJfSBlbHNlIGlmIChtc204eDE2X3djZC0+aHBoX21vZGUgPT0gSEQyX01PREUpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCX0gZWxzZSAgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRVJST1I6IERlZmF1bHQgSFBIIE1vZGU9ICVkXG4iLAorCQkJX19mdW5jX18sIG1zbTh4MTZfd2NkLT5ocGhfbW9kZSk7CisJfQorCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1zbTh4MTZfd2NkLT5ocGhfbW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCW1zbTh4MTZfd2NkLT5ocGhfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfaHBoX21vZGVfc2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAorCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMDoKKwkJbXNtOHgxNl93Y2QtPmhwaF9tb2RlID0gTk9STUFMX01PREU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA+PSBESUFOR1UpCisJCQltc204eDE2X3djZC0+aHBoX21vZGUgPSBIRDJfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNtOHgxNl93Y2QtPmhwaF9tb2RlID0gTk9STUFMX01PREU7CisJCWJyZWFrOworCX0KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbXNtOHgxNl93Y2QtPmhwaF9tb2RlX3NldCA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPmhwaF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9ib29zdF9vcHRpb25fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKG1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24gPT0gQk9PU1RfU1dJVENIKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwl9IGVsc2UgaWYgKG1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24gPT0gQk9PU1RfQUxXQVlTKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwl9IGVsc2UgaWYgKG1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24gPT0gQllQQVNTX0FMV0FZUykgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJfSBlbHNlIGlmIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uID09IEJPT1NUX09OX0ZPUkVWRVIpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzOworCX0gZWxzZSAgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRVJST1I6IFVuc3VwcG9ydGVkIEJvb3N0IG9wdGlvbj0gJWRcbiIsCisJCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uID0gJWRcbiIsIF9fZnVuY19fLAorCQkJbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfYm9vc3Rfb3B0aW9uX3NldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDA6CisJCW1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24gPSBCT09TVF9TV0lUQ0g7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbiA9IEJPT1NUX0FMV0FZUzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uID0gQllQQVNTX0FMV0FZUzsKKwkJbXNtOHgxNl93Y2RfYnlwYXNzX29uKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uID0gQk9PU1RfT05fRk9SRVZFUjsKKwkJbXNtOHgxNl93Y2RfYm9vc3Rfb24oY29kZWMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAorCQkJCQltc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uX3NldCA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfZXh0X3Nwa19ib29zdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAobXNtOHgxNl93Y2QtPmV4dF9zcGtfYm9vc3Rfc2V0ID09IGZhbHNlKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbXNtOHgxNl93Y2QtPmV4dF9zcGtfYm9vc3Rfc2V0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIG1zbTh4MTZfd2NkLT5leHRfc3BrX2Jvb3N0X3NldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfZXh0X3Nwa19ib29zdF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAwOgorCQltc204eDE2X3djZC0+ZXh0X3Nwa19ib29zdF9zZXQgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltc204eDE2X3djZC0+ZXh0X3Nwa19ib29zdF9zZXQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1zbTh4MTZfd2NkLT5zcGtfYm9vc3Rfc2V0ID0gJWRcbiIsCisJCV9fZnVuY19fLCBtc204eDE2X3djZC0+c3BrX2Jvb3N0X3NldCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkoc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQkgICAgKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVEwgKyA2NCAqIGlpcl9pZHgpKSAmCisJCSgxIDw8IGJhbmRfaWR4KSkgIT0gMDsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCisJCWlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJLyogTWFzayBmaXJzdCA1IGJpdHMsIDYtOCBhcmUgcmVzZXJ2ZWQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ1RMICsgNjQgKiBpaXJfaWR4KSwKKwkJCSAgICAoMSA8PCBiYW5kX2lkeCksICh2YWx1ZSA8PCBiYW5kX2lkeCkpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkgIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkoKHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NUTCArIDY0ICogaWlyX2lkeCkpICYKKwkgICgxIDw8IGJhbmRfaWR4KSkgIT0gMCkpOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdWludDMyX3QgZ2V0X2lpcl9iYW5kX2NvZWZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICBpbnQgaWlyX2lkeCwgaW50IGJhbmRfaWR4LAorCQkJCSAgIGludCBjb2VmZl9pZHgpCit7CisJdWludDMyX3QgdmFsdWUgPSAwOworCisJLyogQWRkcmVzcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBpZiByZWFkaW5nICovCisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMICsgNjQgKiBpaXJfaWR4KSwKKwkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQorCQkqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IyX0NUTCArIDY0ICogaWlyX2lkeCkpOworCisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMICsgNjQgKiBpaXJfaWR4KSwKKwkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQorCQkqIHNpemVvZih1aW50MzJfdCkgKyAxKSAmIDB4N0YpOworCisJdmFsdWUgfD0gKHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMICsgNjQgKiBpaXJfaWR4KSkgPDwgOCk7CisKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwgKyA2NCAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDIpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwgKyA2NCAqIGlpcl9pZHgpKSA8PCAxNik7CisKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwgKyA2NCAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDMpICYgMHg3Rik7CisKKwkvKiBNYXNrIGJpdHMgdG9wIDIgYml0cyBzaW5jZSB0aGV5IGFyZSByZXNlcnZlZCAqLworCXZhbHVlIHw9ICgoc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMCisJCSsgNjQgKiBpaXJfaWR4KSkgJiAweDNmKSA8PCAyNCk7CisKKwlyZXR1cm4gdmFsdWU7CisKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPQorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAyKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgNCk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSUlSICMlZCBiYW5kICMlZCBiMCA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIxID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjIgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGEyID0gMHgleFxuIiwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10sCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2lpcl9iYW5kX2NvZWZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQlpbnQgaWlyX2lkeCwgaW50IGJhbmRfaWR4LAorCQkJCXVpbnQzMl90IHZhbHVlKQoreworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IyX0NUTCArIDY0ICogaWlyX2lkeCksCisJCSh2YWx1ZSAmIDB4RkYpKTsKKworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IyX0NUTCArIDY0ICogaWlyX2lkeCksCisJCSh2YWx1ZSA+PiA4KSAmIDB4RkYpOworCisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMICsgNjQgKiBpaXJfaWR4KSwKKwkJKHZhbHVlID4+IDE2KSAmIDB4RkYpOworCisJLyogTWFzayB0b3AgMiBiaXRzLCA3LTggYXJlIHJlc2VydmVkICovCisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMICsgNjQgKiBpaXJfaWR4KSwKKwkJKHZhbHVlID4+IDI0KSAmIDB4M0YpOworCit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCisJLyogTWFzayB0b3AgYml0IGl0IGlzIHJlc2VydmVkICovCisJLyogVXBkYXRlcyBhZGRyIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggQjIgd3JpdGUgKi8KKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwgKyA2NCAqIGlpcl9pZHgpLAorCQkoYmFuZF9pZHggKiBCQU5EX01BWCAqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7CisKKworCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCQkgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCSAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0pOworCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCQkgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCSAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDEpLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDIpLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb21wYW5kZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBjb21wX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCByeF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1zbTh4MTZfd2NkLT5jb21wWyVkXV9lbmFibGVkWyVkXSA9ICVkXG4iLAorCQkJX19mdW5jX18sIGNvbXBfaWR4LCByeF9pZHgsCisJCQltc204eDE2X3djZC0+Y29tcF9lbmFibGVkW3J4X2lkeF0pOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc204eDE2X3djZC0+Y29tcF9lbmFibGVkW3J4X2lkeF07CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb21wYW5kZXJfc2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBjb21wX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCByeF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAorCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA+PSBESUFOR1UpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCW1zbTh4MTZfd2NkLT5jb21wX2VuYWJsZWRbcnhfaWR4XSA9IDA7CisJCWVsc2UKKwkJCW1zbTh4MTZfd2NkLT5jb21wX2VuYWJsZWRbcnhfaWR4XSA9IGNvbXBfaWR4OworCX0KKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtc204eDE2X3djZC0+Y29tcFslZF1fZW5hYmxlZFslZF0gPSAlZFxuIiwKKwkJX19mdW5jX18sIGNvbXBfaWR4LCByeF9pZHgsCisJCW1zbTh4MTZfd2NkLT5jb21wX2VuYWJsZWRbcnhfaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc204eDE2X3djZF9sb29wYmFja19tb2RlX2N0cmxfdGV4dFtdID0geworCQkiRElTQUJMRSIsICJFTkFCTEUifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtOHgxNl93Y2RfbG9vcGJhY2tfbW9kZV9jdGxfZW51bVtdID0geworCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbTh4MTZfd2NkX2xvb3BiYWNrX21vZGVfY3RybF90ZXh0KSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNtOHgxNl93Y2RfZWFyX3BhX2Jvb3N0X2N0cmxfdGV4dFtdID0geworCQkiRElTQUJMRSIsICJFTkFCTEUifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtOHgxNl93Y2RfZWFyX3BhX2Jvb3N0X2N0bF9lbnVtW10gPSB7CisJCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgbXNtOHgxNl93Y2RfZWFyX3BhX2Jvb3N0X2N0cmxfdGV4dCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zbTh4MTZfd2NkX2Vhcl9wYV9nYWluX3RleHRbXSA9IHsKKwkJIlBPU18xUDVfREIiLCAiUE9TXzZfREIifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtOHgxNl93Y2RfZWFyX3BhX2dhaW5fZW51bVtdID0geworCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbTh4MTZfd2NkX2Vhcl9wYV9nYWluX3RleHQpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc204eDE2X3djZF9ib29zdF9vcHRpb25fY3RybF90ZXh0W10gPSB7CisJCSJCT09TVF9TV0lUQ0giLCAiQk9PU1RfQUxXQVlTIiwgIkJZUEFTU19BTFdBWVMiLAorCQkiQk9PU1RfT05fRk9SRVZFUiJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc204eDE2X3djZF9ib29zdF9vcHRpb25fY3RsX2VudW1bXSA9IHsKKwkJU09DX0VOVU1fU0lOR0xFX0VYVCg0LCBtc204eDE2X3djZF9ib29zdF9vcHRpb25fY3RybF90ZXh0KSwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zbTh4MTZfd2NkX3Nwa19ib29zdF9jdHJsX3RleHRbXSA9IHsKKwkJIkRJU0FCTEUiLCAiRU5BQkxFIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbTh4MTZfd2NkX3Nwa19ib29zdF9jdGxfZW51bVtdID0geworCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbTh4MTZfd2NkX3Nwa19ib29zdF9jdHJsX3RleHQpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc204eDE2X3djZF9leHRfc3BrX2Jvb3N0X2N0cmxfdGV4dFtdID0geworCQkiRElTQUJMRSIsICJFTkFCTEUifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtOHgxNl93Y2RfZXh0X3Nwa19ib29zdF9jdGxfZW51bVtdID0geworCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbTh4MTZfd2NkX2V4dF9zcGtfYm9vc3RfY3RybF90ZXh0KSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNtOHgxNl93Y2RfaHBoX21vZGVfY3RybF90ZXh0W10gPSB7CisJCSJOT1JNQUwiLCAiSEQyIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbTh4MTZfd2NkX2hwaF9tb2RlX2N0bF9lbnVtW10gPSB7CisJCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShtc204eDE2X3djZF9ocGhfbW9kZV9jdHJsX3RleHQpLAorCQkJbXNtOHgxNl93Y2RfaHBoX21vZGVfY3RybF90ZXh0KSwKK307CisKKy8qY3V0IG9mIGZyZXF1ZW5jeSBmb3IgaGlnaCBwYXNzIGZpbHRlciovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNmX3RleHRbXSA9IHsKKwkiTUlOXzNEQl80SHoiLCAiTUlOXzNEQl83NUh6IiwgIk1JTl8zREJfMTUwSHoiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX3J4bWl4MV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9SWDFfQjRfQ1RMLCAwLCAzLCBjZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTCwgMCwgMywgY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfcnhtaXgzX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1JYM19CNF9DVEwsIDAsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtOHgxNl93Y2Rfc25kX2NvbnRyb2xzW10gPSB7CisKKwlTT0NfRU5VTV9FWFQoIlJYIEhQSCBNb2RlIiwgbXNtOHgxNl93Y2RfaHBoX21vZGVfY3RsX2VudW1bMF0sCisJCW1zbTh4MTZfd2NkX2hwaF9tb2RlX2dldCwgbXNtOHgxNl93Y2RfaHBoX21vZGVfc2V0KSwKKworCVNPQ19FTlVNX0VYVCgiQm9vc3QgT3B0aW9uIiwgbXNtOHgxNl93Y2RfYm9vc3Rfb3B0aW9uX2N0bF9lbnVtWzBdLAorCQltc204eDE2X3djZF9ib29zdF9vcHRpb25fZ2V0LCBtc204eDE2X3djZF9ib29zdF9vcHRpb25fc2V0KSwKKworCVNPQ19FTlVNX0VYVCgiRUFSIFBBIEJvb3N0IiwgbXNtOHgxNl93Y2RfZWFyX3BhX2Jvb3N0X2N0bF9lbnVtWzBdLAorCQltc204eDE2X3djZF9lYXJfcGFfYm9vc3RfZ2V0LCBtc204eDE2X3djZF9lYXJfcGFfYm9vc3Rfc2V0KSwKKworCVNPQ19FTlVNX0VYVCgiRUFSIFBBIEdhaW4iLCBtc204eDE2X3djZF9lYXJfcGFfZ2Fpbl9lbnVtWzBdLAorCQltc204eDE2X3djZF9wYV9nYWluX2dldCwgbXNtOHgxNl93Y2RfcGFfZ2Fpbl9wdXQpLAorCisJU09DX0VOVU1fRVhUKCJFeHQgU3BrIEJvb3N0IiwgbXNtOHgxNl93Y2RfZXh0X3Nwa19ib29zdF9jdGxfZW51bVswXSwKKwkJbXNtOHgxNl93Y2RfZXh0X3Nwa19ib29zdF9nZXQsIG1zbTh4MTZfd2NkX2V4dF9zcGtfYm9vc3Rfc2V0KSwKKworCVNPQ19FTlVNX0VYVCgiTE9PUEJBQ0sgTW9kZSIsIG1zbTh4MTZfd2NkX2xvb3BiYWNrX21vZGVfY3RsX2VudW1bMF0sCisJCW1zbTh4MTZfd2NkX2xvb3BiYWNrX21vZGVfZ2V0LCBtc204eDE2X3djZF9sb29wYmFja19tb2RlX3B1dCksCisKKwlTT0NfU0lOR0xFX1RMVigiQURDMSBWb2x1bWUiLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4sIDMsCisJCQkJCTgsIDAsIGFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDMiBWb2x1bWUiLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzJfRU4sIDMsCisJCQkJCTgsIDAsIGFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDMyBWb2x1bWUiLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU4sIDMsCisJCQkJCTgsIDAsIGFuYWxvZ19nYWluKSwKKworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDEgRGlnaXRhbCBWb2x1bWUiLAorCQkJICBNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IyX0NUTCwKKwkJCTAsICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDIgRGlnaXRhbCBWb2x1bWUiLAorCQkJICBNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IyX0NUTCwKKwkJCTAsICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgRGlnaXRhbCBWb2x1bWUiLAorCQkJICBNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IyX0NUTCwKKwkJCTAsICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzEgVm9sdW1lIiwKKwkJCSAgTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9HQUlOLAorCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzIgVm9sdW1lIiwKKwkJCSAgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOLAorCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAxIFZvbHVtZSIsCisJCQkgIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTCwKKwkJCTAsICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDIgVm9sdW1lIiwKKwkJCSAgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjJfQ1RMLAorCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMyBWb2x1bWUiLAorCQkJICBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CM19DVEwsCisJCQkwLCAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlA0IFZvbHVtZSIsCisJCQkgIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I0X0NUTCwKKwkJCTAsICAtODQsCTQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIyIElOUDEgVm9sdW1lIiwKKwkJCSAgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjFfQ1RMLAorCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfRU5VTSgiVFgxIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMV9lbnVtKSwKKwlTT0NfRU5VTSgiVFgyIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMl9lbnVtKSwKKworCVNPQ19TSU5HTEUoIlRYMSBIUEYgU3dpdGNoIiwKKwkJTVNNODlYWF9DRENfQ09SRV9UWDFfTVVYX0NUTCwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiVFgyIEhQRiBTd2l0Y2giLAorCQlNU004OVhYX0NEQ19DT1JFX1RYMl9NVVhfQ1RMLCAzLCAxLCAwKSwKKworCVNPQ19TSU5HTEUoIlJYMSBIUEYgU3dpdGNoIiwKKwkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDIgSFBGIFN3aXRjaCIsCisJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTCwgMiwgMSwgMCksCisJU09DX1NJTkdMRSgiUlgzIEhQRiBTd2l0Y2giLAorCQlNU004OVhYX0NEQ19DT1JFX1JYM19CNV9DVEwsIDIsIDEsIDApLAorCisJU09DX0VOVU0oIlJYMSBIUEYgY3V0IG9mZiIsIGNmX3J4bWl4MV9lbnVtKSwKKwlTT0NfRU5VTSgiUlgyIEhQRiBjdXQgb2ZmIiwgY2ZfcnhtaXgyX2VudW0pLAorCVNPQ19FTlVNKCJSWDMgSFBGIGN1dCBvZmYiLCBjZl9yeG1peDNfZW51bSksCisKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDEiLCBJSVIxLCBCQU5EMSwgMSwgMCwKKwltc204eDE2X3djZF9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQyIiwgSUlSMSwgQkFORDIsIDEsIDAsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMyIsIElJUjEsIEJBTkQzLCAxLCAwLAorCW1zbTh4MTZfd2NkX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDQiLCBJSVIxLCBCQU5ENCwgMSwgMCwKKwltc204eDE2X3djZF9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQ1IiwgSUlSMSwgQkFORDUsIDEsIDAsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIyIEVuYWJsZSBCYW5kMSIsIElJUjIsIEJBTkQxLCAxLCAwLAorCW1zbTh4MTZfd2NkX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMiBFbmFibGUgQmFuZDIiLCBJSVIyLCBCQU5EMiwgMSwgMCwKKwltc204eDE2X3djZF9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQzIiwgSUlSMiwgQkFORDMsIDEsIDAsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIyIEVuYWJsZSBCYW5kNCIsIElJUjIsIEJBTkQ0LCAxLCAwLAorCW1zbTh4MTZfd2NkX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMiBFbmFibGUgQmFuZDUiLCBJSVIyLCBCQU5ENSwgMSwgMCwKKwltc204eDE2X3djZF9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMSIsIElJUjEsIEJBTkQxLCAyNTUsIDAsIDUsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDIiLCBJSVIxLCBCQU5EMiwgMjU1LCAwLCA1LAorCW1zbTh4MTZfd2NkX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQzIiwgSUlSMSwgQkFORDMsIDI1NSwgMCwgNSwKKwltc204eDE2X3djZF9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAyNTUsIDAsIDUsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDUiLCBJSVIxLCBCQU5ENSwgMjU1LCAwLCA1LAorCW1zbTh4MTZfd2NkX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQxIiwgSUlSMiwgQkFORDEsIDI1NSwgMCwgNSwKKwltc204eDE2X3djZF9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMiBCYW5kMiIsIElJUjIsIEJBTkQyLCAyNTUsIDAsIDUsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjIgQmFuZDMiLCBJSVIyLCBCQU5EMywgMjU1LCAwLCA1LAorCW1zbTh4MTZfd2NkX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKKwltc204eDE2X3djZF9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQ0IiwgSUlSMiwgQkFORDQsIDI1NSwgMCwgNSwKKwltc204eDE2X3djZF9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsCisJbXNtOHgxNl93Y2RfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMiBCYW5kNSIsIElJUjIsIEJBTkQ1LCAyNTUsIDAsIDUsCisJbXNtOHgxNl93Y2RfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAorCW1zbTh4MTZfd2NkX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDAgUlgxIiwgQ09NUEFOREVSXzEsIE1TTTg5WFhfUlgxLCAxLCAwLAorCW1zbTh4MTZfd2NkX2NvbXBhbmRlcl9nZXQsIG1zbTh4MTZfd2NkX2NvbXBhbmRlcl9zZXQpLAorCisJU09DX1NJTkdMRV9FWFQoIkNPTVAwIFJYMiIsIENPTVBBTkRFUl8xLCBNU004OVhYX1JYMiwgMSwgMCwKKwltc204eDE2X3djZF9jb21wYW5kZXJfZ2V0LCBtc204eDE2X3djZF9jb21wYW5kZXJfc2V0KSwKK307CisKK3N0YXRpYyBpbnQgdG9tYmFrX2hwaF9pbXBlZGFuY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQ7CisJdWludDMyX3QgemwsIHpyOworCWJvb2wgaHBocjsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1jOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwltYyA9IChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCisJaHBociA9IG1jLT5zaGlmdDsKKwlyZXQgPSB3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKCZwcml2LT5tYmhjLCAmemwsICZ6cik7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGdldCBtYmhjIGltcGVkIiwgX19mdW5jX18pOworCXByX2VycigiJXM6IHpsICV1LCB6ciAldVxuIiwgX19mdW5jX18sIHpsLCB6cik7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBocGhyID8genIgOiB6bDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW1wZWRhbmNlX2RldGVjdF9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJIUEhMIEltcGVkYW5jZSIsIDAsIDAsIFVJTlRfTUFYLCAwLAorCQkJdG9tYmFrX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKKwlTT0NfU0lOR0xFX0VYVCgiSFBIUiBJbXBlZGFuY2UiLCAwLCAxLCBVSU5UX01BWCwgMCwKKwkJCXRvbWJha19ocGhfaW1wZWRhbmNlX2dldCwgTlVMTCksCit9OworCitzdGF0aWMgaW50IHRvbWJha19nZXRfaHBoX3R5cGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7CisKKwlpZiAoIXByaXYpIHsKKwkJcHJfZXJyKCIlczogbXNtOHgxNi13Y2QgcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYmhjID0gJnByaXYtPm1iaGM7CisJaWYgKCFtYmhjKSB7CisJCXByX2VycigiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHUzMikgbWJoYy0+aHBoX3R5cGU7CisJcHJfZXJyKCIlczogaHBoX3R5cGUgPSAldVxuIiwgX19mdW5jX18sIG1iaGMtPmhwaF90eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkhQSCBUeXBlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCisJdG9tYmFrX2dldF9ocGhfdHlwZSwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X21peDFfdGV4dFtdID0geworCSJaRVJPIiwgIklJUjEiLCAiSUlSMiIsICJSWDEiLCAiUlgyIiwgIlJYMyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfbWl4Ml90ZXh0W10gPSB7CisJIlpFUk8iLCAiSUlSMSIsICJJSVIyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWNfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBREMxIiwgIkFEQzIiLCAiQURDMyIsICJETUlDMSIsICJETUlDMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVjM19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRNSUMzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWM0X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiRE1JQzQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkYzJfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJJTlAyIiwgIklOUDMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dF9zcGtfdGV4dFtdID0geworCSJPZmYiLCAiT24iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYV9zcGtfdGV4dFtdID0geworCSJaRVJPIiwgIldTQSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmRhYzJfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWDIiLCAiUlgxIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaXJfaW5wMV90ZXh0W10gPSB7CisJIlpFUk8iLCAiREVDMSIsICJERUMyIiwgIlJYMSIsICJSWDIiLCAiUlgzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGMyX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsCisJCUFSUkFZX1NJWkUoYWRjMl9tdXhfdGV4dCksIGFkYzJfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGV4dF9zcGtfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNORF9TT0NfTk9QTSwgMCwKKwkJQVJSQVlfU0laRShleHRfc3BrX3RleHQpLCBleHRfc3BrX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdzYV9zcGtfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNORF9TT0NfTk9QTSwgMCwKKwkJQVJSQVlfU0laRSh3c2Ffc3BrX3RleHQpLCB3c2Ffc3BrX3RleHQpOworCisvKiBSWDEgTUlYMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXgxX2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjFfQ1RMLAorCQkwLCA2LCByeF9taXgxX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X21peDFfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMV9DVEwsCisJCTMsIDYsIHJ4X21peDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfbWl4MV9pbnAzX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IyX0NUTCwKKwkJMCwgNiwgcnhfbWl4MV90ZXh0KTsKKworLyogUlgxIE1JWDIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfbWl4Ml9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IzX0NUTCwKKwkJMCwgMywgcnhfbWl4Ml90ZXh0KTsKKworLyogUlgyIE1JWDEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcngyX21peDFfaW5wMV9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVEwsCisJCTAsIDYsIHJ4X21peDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcngyX21peDFfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVEwsCisJCTMsIDYsIHJ4X21peDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcngyX21peDFfaW5wM19jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVEwsCisJCTAsIDYsIHJ4X21peDFfdGV4dCk7CisKKy8qIFJYMiBNSVgyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4Ml9taXgyX2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjNfQ1RMLAorCQkwLCAzLCByeF9taXgyX3RleHQpOworCisvKiBSWDMgTUlYMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDNfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTCwKKwkJMCwgNiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDNfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTCwKKwkJMywgNiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDNfbWl4MV9pbnAzX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTCwKKwkJMCwgNiwgcnhfbWl4MV90ZXh0KTsKKworLyogREVDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRlYzFfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjFfQ1RMLAorCQkwLCA2LCBkZWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRlYzJfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjFfQ1RMLAorCQkzLCA2LCBkZWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRlYzNfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYM19NVVhfQ1RMLCAwLAorCQkJCUFSUkFZX1NJWkUoZGVjM19tdXhfdGV4dCksIGRlYzNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRlYzRfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMLCAwLAorCQkJCUFSUkFZX1NJWkUoZGVjNF9tdXhfdGV4dCksIGRlYzRfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJkYWMyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fSFBIUl9EQUNfQ1RMLAorCQkwLCAzLCByZGFjMl9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMV9pbnAxX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVEwsCisJCTAsIDYsIGlpcl9pbnAxX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjJfaW5wMV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMLAorCQkwLCA2LCBpaXJfaW5wMV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9zcGtfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJFeHQgU3BrIFN3aXRjaCBNdXgiLCBleHRfc3BrX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfbWl4MV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgxIE1JWDEgSU5QMSBNdXgiLCByeF9taXgxX2lucDFfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9taXgxX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDEgTUlYMSBJTlAyIE11eCIsIHJ4X21peDFfaW5wMl9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peDFfaW5wM19tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMSBNSVgxIElOUDMgTXV4IiwgcnhfbWl4MV9pbnAzX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngyX21peDFfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMiBNSVgxIElOUDEgTXV4IiwgcngyX21peDFfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4Ml9taXgxX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDIgTUlYMSBJTlAyIE11eCIsIHJ4Ml9taXgxX2lucDJfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDJfbWl4MV9pbnAzX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgyIE1JWDEgSU5QMyBNdXgiLCByeDJfbWl4MV9pbnAzX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngzX21peDFfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMyBNSVgxIElOUDEgTXV4IiwgcngzX21peDFfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4M19taXgxX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDMgTUlYMSBJTlAyIE11eCIsIHJ4M19taXgxX2lucDJfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDNfbWl4MV9pbnAzX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgzIE1JWDEgSU5QMyBNdXgiLCByeDNfbWl4MV9pbnAzX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngxX21peDJfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMSBNSVgyIElOUDEgTXV4IiwgcnhfbWl4Ml9pbnAxX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngyX21peDJfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMiBNSVgyIElOUDEgTXV4IiwgcngyX21peDJfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X2FkYzJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBREMyIE1VWCBNdXgiLCBhZGMyX2VudW0pOworCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX3B1dF9kZWNfZW51bShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0KKwkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdyA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IGRlY19tdXgsIGRlY2ltYXRvcjsKKwljaGFyICpkZWNfbmFtZSA9IE5VTEw7CisJY2hhciAqd2lkZ2V0X25hbWUgPSBOVUxMOworCWNoYXIgKnRlbXA7CisJdTE2IHR4X211eF9jdGxfcmVnOworCXU4IGFkY19kbWljX3NlbCA9IDB4MDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpkZWNfbnVtOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5pdGVtcykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBlbnVtIHZhbHVlOiAlZFxuIiwKKwkJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRlY19tdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJd2lkZ2V0X25hbWUgPSBrc3RybmR1cCh3LT5uYW1lLCAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWRnZXRfbmFtZSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZmFpbGVkIHRvIGNvcHkgc3RyaW5nXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdGVtcCA9IHdpZGdldF9uYW1lOworCisJZGVjX25hbWUgPSBzdHJzZXAoJndpZGdldF9uYW1lLCAiICIpOworCXdpZGdldF9uYW1lID0gdGVtcDsKKwlpZiAoIWRlY19uYW1lKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGRlY2ltYXRvciA9ICVzXG4iLAorCQkJX19mdW5jX18sIHctPm5hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGVjX251bSA9IHN0cnBicmsoZGVjX25hbWUsICIxMiIpOworCWlmIChkZWNfbnVtID09IE5VTEwpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgREVDIHNlbGVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGtzdHJ0b3VpbnQoZGVjX251bSwgMTAsICZkZWNpbWF0b3IpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGRlY2ltYXRvciA9ICVzXG4iLAorCQkJX19mdW5jX18sIGRlY19uYW1lKTsKKwkJcmV0ID0gIC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9lcnIody0+ZGFwbS0+ZGV2LCAiJXMoKTogd2lkZ2V0ID0gJXMgZGVjaW1hdG9yID0gJXUgZGVjX211eCA9ICV1XG4iCisJCSwgX19mdW5jX18sIHctPm5hbWUsIGRlY2ltYXRvciwgZGVjX211eCk7CisKKwlzd2l0Y2ggKGRlY2ltYXRvcikgeworCWNhc2UgMToKKwljYXNlIDI6CisJCWlmICgoZGVjX211eCA9PSA0KSB8fCAoZGVjX211eCA9PSA1KSkKKwkJCWFkY19kbWljX3NlbCA9IDB4MTsKKwkJZWxzZQorCQkJYWRjX2RtaWNfc2VsID0gMHgwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBEZWNpbWF0b3IgPSAldVxuIiwKKwkJCV9fZnVuY19fLCBkZWNpbWF0b3IpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl0eF9tdXhfY3RsX3JlZyA9CisJCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwgKyAzMiAqIChkZWNpbWF0b3IgLSAxKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MSwgYWRjX2RtaWNfc2VsKTsKKworCXJldCA9IHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUoa2NvbnRyb2wsIHVjb250cm9sKTsKKworb3V0OgorCWtmcmVlKHdpZGdldF9uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE1TTTg5WFhfREVDX0VOVU0oeG5hbWUsIHhlbnVtKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fZW51bV9kb3VibGUsIFwKKwkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAorCS5wdXQgPSBtc204eDE2X3djZF9wdXRfZGVjX2VudW0sIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkZWMxX211eCA9CisJTVNNODlYWF9ERUNfRU5VTSgiREVDMSBNVVggTXV4IiwgZGVjMV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkZWMyX211eCA9CisJTVNNODlYWF9ERUNfRU5VTSgiREVDMiBNVVggTXV4IiwgZGVjMl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkZWMzX211eCA9CisJU09DX0RBUE1fRU5VTSgiREVDMyBNVVggTXV4IiwgZGVjM19tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkZWM0X211eCA9CisJU09DX0RBUE1fRU5VTSgiREVDNCBNVVggTXV4IiwgZGVjNF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByZGFjMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJEQUMyIE1VWCBNdXgiLCByZGFjMl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIxX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIxIElOUDEgTXV4IiwgaWlyMV9pbnAxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlYXJfdGV4dFtdID0geworCSJaRVJPIiwgIlN3aXRjaCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGVhcl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCBBUlJBWV9TSVpFKGVhcl90ZXh0KSwgZWFyX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZWFyX3BhX211eFtdID0geworCVNPQ19EQVBNX0VOVU0oIkVBUl9TIiwgZWFyX2VudW0pCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd3NhX3Nwa19tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJXU0EgU3BrIFN3aXRjaCIsIHdzYV9zcGtfZW51bSkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIyX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIyIElOUDEgTXV4IiwgaWlyMl9pbnAxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBocGhfdGV4dFtdID0geworCSJaRVJPIiwgIlN3aXRjaCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwaF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCBBUlJBWV9TSVpFKGhwaF90ZXh0KSwgaHBoX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBobF9tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJIUEhMIiwgaHBoX2VudW0pCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBocl9tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJIUEhSIiwgaHBoX2VudW0pCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3Brcl9tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJTUEsiLCBocGhfZW51bSkKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbG9fdGV4dFtdID0geworCSJaRVJPIiwgIlN3aXRjaCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxvX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUoaHBoX3RleHQpLCBocGhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb19tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJMSU5FX09VVCIsIGxvX2VudW0pCit9OworCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfYWRjX2Jsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIGludCBlbmFibGUpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKndjZDh4MTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmIChlbmFibGUpIHsKKwkJd2NkOHgxNi0+YWRjX2NvdW50Kys7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkgICAgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMLAorCQkJCSAgICAweDIwLCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCSAgICBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCQkJICAgIDB4MTAsIDB4MTApOworCX0gZWxzZSB7CisJCXdjZDh4MTYtPmFkY19jb3VudC0tOworCQlpZiAoIXdjZDh4MTYtPmFkY19jb3VudCkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCSAgICBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCQkJICAgIDB4MTAsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCSAgICBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsCisJCQkJCSAgICAweDIwLCAweDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9hZGMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJdTE2IGFkY19yZWc7CisJdTggaW5pdF9iaXRfc2hpZnQ7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCWFkY19yZWcgPSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yOworCisJaWYgKHctPnJlZyA9PSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4pCisJCWluaXRfYml0X3NoaWZ0ID0gNTsKKwllbHNlIGlmICgody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTikgfHwKKwkJICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOKSkKKwkJaW5pdF9iaXRfc2hpZnQgPSA0OworCWVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IsIGludmFsaWQgYWRjIHJlZ2lzdGVyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2FkY19ibG9jayhjb2RlYywgMSk7CisJCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfQ1RMLCAweDAyLCAweDAyKTsKKwkJLyoKKwkJICogQWRkIGRlbGF5IG9mIDEwIG1zIHRvIGdpdmUgc3VmZmljaWVudCB0aW1lIGZvciB0aGUgdm9sdGFnZQorCQkgKiB0byBzaG9vdCB1cCBhbmQgc2V0dGxlIHNvIHRoYXQgdGhlIHR4ZmUgaW5pdCBkb2VzIG5vdAorCQkgKiBoYXBwZW4gd2hlbiB0aGUgaW5wdXQgdm9sdGFnZSBpcyBjaGFuZ2luZyB0b28gbXVjaC4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAwMTApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlhZGNfcmVnLCAxIDw8IGluaXRfYml0X3NoaWZ0LAorCQkJMSA8PCBpbml0X2JpdF9zaGlmdCk7CisJCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMV9DVEwsCisJCQkJMHgwMywgMHgwMCk7CisJCWVsc2UgaWYgKCh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOKSB8fAorCQkJKHctPnJlZyA9PSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU4pKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMl9DVEwsCisJCQkJMHgwMywgMHgwMCk7CisJCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyoKKwkJICogQWRkIGRlbGF5IG9mIDEyIG1zIGJlZm9yZSBkZWFzc2VydGluZyB0aGUgaW5pdAorCQkgKiB0byByZWR1Y2UgdGhlIHR4IHBvcAorCQkgKi8KKwl1c2xlZXBfcmFuZ2UoMTIwMDAsIDEyMDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJYWRjX3JlZywgMSA8PCBpbml0X2JpdF9zaGlmdCwgMHgwMCk7CisJCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2FkY19ibG9jayhjb2RlYywgMCk7CisJCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfQ1RMLCAweDAyLCAweDAwKTsKKwkJaWYgKHctPnJlZyA9PSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4pCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgxX0NUTCwKKwkJCQkweDAzLCAweDAyKTsKKwkJZWxzZSBpZiAoKHctPnJlZyA9PSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzJfRU4pIHx8CisJCQkody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfM19FTikpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTCwKKwkJCQkweDAzLCAweDAyKTsKKworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3Nwa19wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgxMCwgMHgxMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLCAweDAxLCAweDAxKTsKKwkJc3dpdGNoIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKSB7CisJCWNhc2UgQk9PU1RfU1dJVENIOgorCQkJaWYgKCFtc204eDE2X3djZC0+c3BrX2Jvb3N0X3NldCkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EQUNfQ1RMLAorCQkJCQkweDEwLCAweDEwKTsKKwkJCWJyZWFrOworCQljYXNlIEJPT1NUX0FMV0FZUzoKKwkJY2FzZSBCT09TVF9PTl9GT1JFVkVSOgorCQkJYnJlYWs7CisJCWNhc2UgQllQQVNTX0FMV0FZUzoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwKKwkJCQkweDEwLCAweDEwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogaW52YWxpZCBib29zdCBvcHRpb246ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCW1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24pOworCQkJYnJlYWs7CisJCX0KKwkJdXNsZWVwX3JhbmdlKENPREVDX0RFTEFZXzFfTVMsIENPREVDX0RFTEFZXzFfMV9NUyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLCAweEUwLCAweEUwKTsKKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSAhPSBUT01CQUtfMV8wKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwgMHgwMSwgMHgwMSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKKwkJc3dpdGNoIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKSB7CisJCWNhc2UgQk9PU1RfU1dJVENIOgorCQkJaWYgKG1zbTh4MTZfd2NkLT5zcGtfYm9vc3Rfc2V0KQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCisJCQkJCTB4RUYsIDB4RUYpOworCQkJZWxzZQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsCisJCQkJCTB4MTAsIDB4MDApOworCQkJYnJlYWs7CisJCWNhc2UgQk9PU1RfQUxXQVlTOgorCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCisJCQkJMHhFRiwgMHhFRik7CisJCQlicmVhazsKKwkJY2FzZSBCWVBBU1NfQUxXQVlTOgorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EQUNfQ1RMLCAweDEwLCAweDAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogaW52YWxpZCBib29zdCBvcHRpb246ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCW1zbTh4MTZfd2NkLT5ib29zdF9vcHRpb24pOworCQkJYnJlYWs7CisJCX0KKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCB3LT5yZWcsIDB4ODAsIDB4ODApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEwsIDB4MDEsIDB4MDEpOworCQltc204eDE2X3djZC0+bXV0ZV9tYXNrIHw9IFNQS1JfUEFfRElTQUJMRTsKKwkJLyoKKwkJICogQWRkIDEgbXMgc2xlZXAgZm9yIHRoZSBtdXRlIHRvIHRha2UgZWZmZWN0CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MTAsIDB4MTApOworCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpIDwgQ0FKT05fMl8wKQorCQkJbXNtOHgxNl93Y2RfYm9vc3RfbW9kZV9zZXF1ZW5jZShjb2RlYywgU1BLX1BNRCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgdy0+cmVnLCAweDgwLCAweDAwKTsKKwkJc3dpdGNoIChtc204eDE2X3djZC0+Ym9vc3Rfb3B0aW9uKSB7CisJCWNhc2UgQk9PU1RfU1dJVENIOgorCQkJaWYgKG1zbTh4MTZfd2NkLT5zcGtfYm9vc3Rfc2V0KQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCisJCQkJCTB4RUYsIDB4NjkpOworCQkJYnJlYWs7CisJCWNhc2UgQk9PU1RfQUxXQVlTOgorCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCisJCQkJMHhFRiwgMHg2OSk7CisJCQlicmVhazsKKwkJY2FzZSBCWVBBU1NfQUxXQVlTOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwsIDB4RTAsIDB4MDApOworCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwsIDB4MDEsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgxMCwgMHgwMCk7CisJCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgIT0gVE9NQkFLXzFfMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsIDB4MDEsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MTAsIDB4MDApOworCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpID49IENBSk9OXzJfMCkKKwkJCW1zbTh4MTZfd2NkX2Jvb3N0X21vZGVfc2VxdWVuY2UoY29kZWMsIFNQS19QTUQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2RpZ19jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgZXZlbnQgJWQgdy0+bmFtZSAlc1xuIiwgX19mdW5jX18sCisJCQlldmVudCwgdy0+bmFtZSk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9jbG9ja19ibG9jayhjb2RlYywgMSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgdy0+cmVnLCAweDgwLCAweDgwKTsKKwkJbXNtOHgxNl93Y2RfYm9vc3RfbW9kZV9zZXF1ZW5jZShjb2RlYywgU1BLX1BNVSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlpZiAobXNtOHgxNl93Y2QtPnJ4X2JpYXNfY291bnQgPT0gMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAorCQkJCQkweDgwLCAweDAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2RtaWMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTggIGRtaWNfY2xrX2VuOworCXUxNiBkbWljX2Nsa19yZWc7CisJczMyICpkbWljX2Nsa19jbnQ7CisJdW5zaWduZWQgaW50IGRtaWM7CisJaW50IHJldDsKKwljaGFyICpkZWNfbnVtID0gc3RycGJyayh3LT5uYW1lLCAiMTIiKTsKKworCWlmIChkZWNfbnVtID09IE5VTEwpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgRE1JQ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBrc3RydG91aW50KGRlY19udW0sIDEwLCAmZG1pYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIERNSUMgbGluZSBvbiB0aGUgY29kZWNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkbWljKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJZG1pY19jbGtfZW4gPSAweDAxOworCQlkbWljX2Nsa19jbnQgPSAmKG1zbTh4MTZfd2NkLT5kbWljXzFfMl9jbGtfY250KTsKKwkJZG1pY19jbGtfcmVnID0gTVNNODlYWF9DRENfQ09SRV9DTEtfRE1JQ19CMV9DVEw7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlcygpIGV2ZW50ICVkIERNSUMlZCBkbWljXzFfMl9jbGtfY250ICVkXG4iLAorCQkJX19mdW5jX18sIGV2ZW50LCAgZG1pYywgKmRtaWNfY2xrX2NudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgU2VsZWN0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkoKmRtaWNfY2xrX2NudCkrKzsKKwkJaWYgKCpkbWljX2Nsa19jbnQgPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJCTB4MEUsIDB4MDIpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJCWRtaWNfY2xrX2VuLCBkbWljX2Nsa19lbik7CisJCX0KKwkJaWYgKGRtaWMgPT0gMSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMLCAweDA3LCAweDAxKTsKKwkJaWYgKGRtaWMgPT0gMikKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfQ0RDX0NPUkVfVFgyX0RNSUNfQ1RMLCAweDA3LCAweDAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCSgqZG1pY19jbGtfY250KS0tOworCQlpZiAoKmRtaWNfY2xrX2NudCAgPT0gMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgZG1pY19jbGtfcmVnLAorCQkJCQlkbWljX2Nsa19lbiwgMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgbXNtOHgxNl93Y2RfdXNlX21iKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPCBDQUpPTikKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX3NldF9hdXRvX3plcm9pbmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPCBDT05HQSkgeworCQlpZiAoZW5hYmxlKQorCQkJLyoKKwkJCSAqIFNldCBhdXRvemVyb2luZyBmb3Igc3BlY2lhbCBoZWFkc2V0IGRldGVjdGlvbiBhbmQKKwkJCSAqIGJ1dHRvbnMgdG8gd29yay4KKwkJCSAqLworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAorCQkJCTB4MTgsIDB4MTApOworCQllbHNlCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCisJCQkJMHgxOCwgMHgwMCk7CisKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBBdXRvIFplcm9pbmcgaXMgbm90IHJlcXVpcmVkIGZyb20gQ09OR0FcbiIsCisJCQkJX19mdW5jX18pOworCX0KK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl90cmltX2J0bl9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA9PSBUT01CQUtfMV8wKSB7CisJCXByX2VycigiJXM6IFRoaXMgZGV2aWNlIG5lZWRzIHRvIGJlIHRyaW1tZWRcbiIsIF9fZnVuY19fKTsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSB0cmltIHZhbHVlIGZvciBlYWNoIGRldmljZSB1c2VkCisJCSAqIHRpbGwgaXMgY29tZXMgaW4gcHJvZHVjdGlvbiBieSBoYXJkd2FyZSB0ZWFtCisJCSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLAorCQkJCTB4QTUsIDB4QTUpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwyLAorCQkJCTB4RkYsIDB4MzApOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IFRoaXMgZGV2aWNlIGlzIHRyaW1tZWQgYXQgQVRFXG4iLCBfX2Z1bmNfXyk7CisJfQorfQorc3RhdGljIGludCBtc204eDE2X3djZF9lbmFibGVfZXh0X21iX3NvdXJjZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCisJCQkJCSAgICBib29sIHR1cm5fb24pCit7CisJaW50IHJldCA9IDA7CisJc3RhdGljIGludCBjb3VudDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIHR1cm5fb246ICVkIGNvdW50OiAlZFxuIiwgX19mdW5jX18sIHR1cm5fb24sCisJCQljb3VudCk7CisJaWYgKHR1cm5fb24pIHsKKwkJaWYgKCFjb3VudCkgeworCQkJcmV0ID0gc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwKKwkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQl9CisJCWNvdW50Kys7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50ID4gMCkKKwkJCWNvdW50LS07CisJCWlmICghY291bnQpIHsKKwkJCXJldCA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLAorCQkJCSJNSUNCSUFTX1JFR1VMQVRPUiIpOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAorCQkJX19mdW5jX18sIHR1cm5fb24gPyAiZW5hYmxlIiA6ICJkaXNhYmxlZCIpOworCWVsc2UKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6ICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAorCQkJIF9fZnVuY19fLCB0dXJuX29uID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9CisJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTE2IG1pY2JfaW50X3JlZzsKKwljaGFyICppbnRlcm5hbDFfdGV4dCA9ICJJbnRlcm5hbDEiOworCWNoYXIgKmludGVybmFsMl90ZXh0ID0gIkludGVybmFsMiI7CisJY2hhciAqaW50ZXJuYWwzX3RleHQgPSAiSW50ZXJuYWwzIjsKKwljaGFyICpleHRlcm5hbDJfdGV4dCA9ICJFeHRlcm5hbDIiOworCWNoYXIgKmV4dGVybmFsX3RleHQgPSAiRXh0ZXJuYWwiOworCWJvb2wgbWljYmlhczI7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwlzd2l0Y2ggKHctPnJlZykgeworCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU46CisJY2FzZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTjoKKwkJbWljYl9pbnRfcmVnID0gTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEVycm9yLCBpbnZhbGlkIG1pY2JpYXMgcmVnaXN0ZXIgMHgleFxuIiwKKwkJCV9fZnVuY19fLCB3LT5yZWcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltaWNiaWFzMiA9IChzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4pICYgMHg4MCk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsMV90ZXh0LCBzdHJsZW4ody0+bmFtZSkpKSB7CisJCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpID49IENBSk9OKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzIsCisJCQkJCTB4MDIsIDB4MDIpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCW1pY2JfaW50X3JlZywgMHg4MCwgMHg4MCk7CisJCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDJfdGV4dCwgc3RybGVuKHctPm5hbWUpKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCW1pY2JfaW50X3JlZywgMHgxMCwgMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJdy0+cmVnLCAweDYwLCAweDAwKTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsM190ZXh0LCBzdHJsZW4ody0+bmFtZSkpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJbWljYl9pbnRfcmVnLCAweDIsIDB4Mik7CisJCS8qCisJCSAqIHVwZGF0ZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMgorCQkgKiBmb3IgZXh0ZXJuYWwgYmlhcyBvbmx5LCBub3QgZm9yIGV4dGVybmFsMi4KKwkJICovCisJCX0gZWxzZSBpZiAoIXN0cm5zdHIody0+bmFtZSwgZXh0ZXJuYWwyX3RleHQsIHN0cmxlbih3LT5uYW1lKSkgJiYKKwkJCQkJc3RybnN0cih3LT5uYW1lLCBleHRlcm5hbF90ZXh0LAorCQkJCQkJc3RybGVuKHctPm5hbWUpKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMiwKKwkJCQkJMHgwMiwgMHgwMik7CisJCX0KKwkJaWYgKCFzdHJuc3RyKHctPm5hbWUsIGV4dGVybmFsX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sIDB4MDUsIDB4MDQpOworCQlpZiAody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOKQorCQkJbXNtOHgxNl93Y2RfY29uZmlndXJlX2NhcChjb2RlYywgdHJ1ZSwgbWljYmlhczIpOworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpIDw9IFRPTUJBS18yXzApCisJCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKKwkJaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwxX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQltaWNiX2ludF9yZWcsIDB4NDAsIDB4NDApOworCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwyX3RleHQsICBzdHJsZW4ody0+bmFtZSkpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJIG1pY2JfaW50X3JlZywgMHgwOCwgMHgwOCk7CisJCQltc204eDE2X25vdGlmaWVyX2NhbGwoY29kZWMsCisJCQkJCVdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTik7CisJCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDNfdGV4dCwgMzApKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJIG1pY2JfaW50X3JlZywgMHgwMSwgMHgwMSk7CisJCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBleHRlcm5hbDJfdGV4dCwgc3RybGVuKHctPm5hbWUpKSkgeworCQkJbXNtOHgxNl9ub3RpZmllcl9jYWxsKGNvZGVjLAorCQkJCQlXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT04pOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDFfdGV4dCwgc3RybGVuKHctPm5hbWUpKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCW1pY2JfaW50X3JlZywgMHhDMCwgMHg0MCk7CisJCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDJfdGV4dCwgc3RybGVuKHctPm5hbWUpKSkgeworCQkJbXNtOHgxNl9ub3RpZmllcl9jYWxsKGNvZGVjLAorCQkJCVdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkYpOworCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwzX3RleHQsIDMwKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCW1pY2JfaW50X3JlZywgMHgyLCAweDApOworCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgZXh0ZXJuYWwyX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKKwkJCS8qCisJCQkgKiBzZW5kIG1pY2JpYXMgdHVybiBvZmYgZXZlbnQgdG8gbWJoYyBkcml2ZXIgYW5kIHRoZW4KKwkJCSAqIGJyZWFrLCBhcyBubyBuZWVkIHRvIHNldCBNSUNCXzFfRU4gcmVnaXN0ZXIuCisJCQkgKi8KKwkJCW1zbTh4MTZfbm90aWZpZXJfY2FsbChjb2RlYywKKwkJCQkJV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRik7CisJCQlicmVhazsKKwkJfQorCQlpZiAody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOKQorCQkJbXNtOHgxNl93Y2RfY29uZmlndXJlX2NhcChjb2RlYywgZmFsc2UsIG1pY2JpYXMyKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0eF9ocGZfY29ybmVyX2ZyZXFfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmhwZl9kZWxheWVkX3dvcms7CisJc3RydWN0IGhwZl93b3JrICpocGZfd29yazsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2Q7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXUxNiB0eF9tdXhfY3RsX3JlZzsKKwl1OCBocGZfY3V0X29mX2ZyZXE7CisKKwlocGZfZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCWhwZl93b3JrID0gY29udGFpbmVyX29mKGhwZl9kZWxheWVkX3dvcmssIHN0cnVjdCBocGZfd29yaywgZHdvcmspOworCW1zbTh4MTZfd2NkID0gaHBmX3dvcmstPm1zbTh4MTZfd2NkOworCWNvZGVjID0gaHBmX3dvcmstPm1zbTh4MTZfd2NkLT5jb2RlYzsKKwlocGZfY3V0X29mX2ZyZXEgPSBocGZfd29yay0+dHhfaHBmX2N1dF9vZl9mcmVxOworCisJdHhfbXV4X2N0bF9yZWcgPSBNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMICsKKwkJCShocGZfd29yay0+ZGVjaW1hdG9yIC0gMSkgKiAzMjsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzKCk6IGRlY2ltYXRvciAldSBocGZfY3V0X29mX2ZyZXEgMHgleFxuIiwKKwkJIF9fZnVuY19fLCBocGZfd29yay0+ZGVjaW1hdG9yLCAodW5zaWduZWQgaW50KWhwZl9jdXRfb2ZfZnJlcSk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9UWEZFX0NMS0RJViwgMHhGRiwgMHg1MSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCXR4X211eF9jdGxfcmVnLCAweDMwLCBocGZfY3V0X29mX2ZyZXEgPDwgNCk7Cit9CisKKworI2RlZmluZSAgVFhfTVVYX0NUTF9DVVRfT0ZGX0ZSRVFfTUFTSwkweDMwCisjZGVmaW5lICBDRl9NSU5fM0RCXzRIWgkJCTB4MAorI2RlZmluZSAgQ0ZfTUlOXzNEQl83NUhaCQkweDEKKyNkZWZpbmUgIENGX01JTl8zREJfMTUwSFoJCTB4MgorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX3NldF9paXJfZ2FpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IHZhbHVlID0gMCwgcmVnOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAody0+c2hpZnQgPT0gMCkKKwkJCXJlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTDsKKwkJZWxzZSBpZiAody0+c2hpZnQgPT0gMSkKKwkJCXJlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IxX0NUTDsKKwkJdmFsdWUgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywgcmVnKTsKKwkJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZXZlbnQgPSAlZCBub3QgZXhwZWN0ZWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9kZWMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCXVuc2lnbmVkIGludCBkZWNpbWF0b3I7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY2hhciAqZGVjX25hbWUgPSBOVUxMOworCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKKwljaGFyICp0ZW1wOworCWludCByZXQgPSAwLCBpOworCXUxNiBkZWNfcmVzZXRfcmVnLCB0eF92b2xfY3RsX3JlZywgdHhfbXV4X2N0bF9yZWc7CisJdTggZGVjX2hwZl9jdXRfb2ZfZnJlcTsKKwlpbnQgb2Zmc2V0OworCWNoYXIgKmRlY19udW07CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJd2lkZ2V0X25hbWUgPSBrc3RybmR1cCh3LT5uYW1lLCAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWRnZXRfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJdGVtcCA9IHdpZGdldF9uYW1lOworCisJZGVjX25hbWUgPSBzdHJzZXAoJndpZGdldF9uYW1lLCAiICIpOworCXdpZGdldF9uYW1lID0gdGVtcDsKKwlpZiAoIWRlY19uYW1lKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwgX19mdW5jX18sIHctPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkZWNfbnVtID0gc3RycGJyayhkZWNfbmFtZSwgIjEyMzQiKTsKKwlpZiAoZGVjX251bSA9PSBOVUxMKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERlY2ltYXRvclxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBrc3RydG91aW50KGRlY19udW0sIDEwLCAmZGVjaW1hdG9yKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsIF9fZnVuY19fLCBkZWNfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9lcnIoY29kZWMtPmRldiwKKwkJIiVzKCk6IHdpZGdldCA9ICVzIGRlY19uYW1lID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAorCQl3LT5uYW1lLCBkZWNfbmFtZSwgZGVjaW1hdG9yKTsKKworCWlmICh3LT5yZWcgPT0gTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTCkgeworCQlkZWNfcmVzZXRfcmVnID0gTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfUkVTRVRfQjFfQ1RMOworCQlvZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciwgaW5jb3JyZWN0IGRlY1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl0eF92b2xfY3RsX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHICsKKwkJCSAzMiAqIChkZWNpbWF0b3IgLSAxKTsKKwl0eF9tdXhfY3RsX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwgKworCQkJICAzMiAqIChkZWNpbWF0b3IgLSAxKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoZGVjaW1hdG9yID09IDMgfHwgZGVjaW1hdG9yID09IDQpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX0NMS19XU0FfVklfQjFfQ1RMLAorCQkJCTB4RkYsIDB4NSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9UWDFfRE1JQ19DVEwgKworCQkJCQkoZGVjaW1hdG9yIC0gMSkgKiAweDIwLCAweDcsIDB4Mik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9UWDFfRE1JQ19DVEwgKworCQkJCQkoZGVjaW1hdG9yIC0gMSkgKiAweDIwLCAweDcsIDB4Mik7CisJCX0KKwkJLyogRW5hYmxlYWJsZSBUWCBkaWdpdGFsIG11dGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMSk7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fREVDSU1BVE9SUzsgaSsrKSB7CisJCQlpZiAoZGVjaW1hdG9yID09IGkgKyAxKQorCQkJCW1zbTh4MTZfd2NkLT5kZWNfYWN0aXZlW2ldID0gdHJ1ZTsKKwkJfQorCisJCWRlY19ocGZfY3V0X29mX2ZyZXEgPQorCQkJc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsIHR4X211eF9jdGxfcmVnKTsKKworCQlkZWNfaHBmX2N1dF9vZl9mcmVxID0gKGRlY19ocGZfY3V0X29mX2ZyZXEgJiAweDMwKSA+PiA0OworCisJCXR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9jdXRfb2ZfZnJlcSA9CisJCQlkZWNfaHBmX2N1dF9vZl9mcmVxOworCisJCWlmIChkZWNfaHBmX2N1dF9vZl9mcmVxICE9IENGX01JTl8zREJfMTUwSFopIHsKKworCQkJLyogc2V0IGN1dCBvZiBmcmVxIHRvIENGX01JTl8zREJfMTUwSFogKDB4MSk7ICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDMwLAorCQkJCQkgICAgQ0ZfTUlOXzNEQl8xNTBIWiA8PCA0KTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVFhGRV9DTEtESVYsCisJCQkJMHhGRiwgMHg0Mik7CisKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qIGVuYWJsZSBIUEYgKi8KKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCB0eF9tdXhfY3RsX3JlZywgMHgwOCwgMHgwMCk7CisKKwkJaWYgKHR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9jdXRfb2ZfZnJlcSAhPQorCQkJCUNGX01JTl8zREJfMTUwSFopIHsKKworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0eF9ocGZfd29ya1tkZWNpbWF0b3IgLSAxXS5kd29yaywKKwkJCQkJbXNlY3NfdG9famlmZmllcygzMDApKTsKKwkJfQorCQkvKiBhcHBseSB0aGUgZGlnaXRhbCBnYWluIGFmdGVyIHRoZSBkZWNpbWF0b3IgaXMgZW5hYmxlZCovCisJCWlmICgody0+c2hpZnQpIDwgQVJSQVlfU0laRSh0eF9kaWdpdGFsX2dhaW5fcmVnKSkKKwkJCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJCQkgIHR4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnQgKyBvZmZzZXRdLAorCQkJCSAgc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQkJICB0eF9kaWdpdGFsX2dhaW5fcmVnW3ctPnNoaWZ0ICsgb2Zmc2V0XSkKKwkJCQkgICk7CisJCWlmIChwZGF0YS0+bGJfbW9kZSkgeworCQkJcHJfZXJyKCIlczogbG9vcGJhY2sgbW9kZSB1bm11dGUgdGhlIERFQ1xuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJdHhfdm9sX2N0bF9yZWcsIDB4MDEsIDB4MDApOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgdHhfdm9sX2N0bF9yZWcsIDB4MDEsIDB4MDEpOworCQltc2xlZXAoMjApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDA4LCAweDA4KTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0eF9ocGZfd29ya1tkZWNpbWF0b3IgLSAxXS5kd29yayk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlkZWNfcmVzZXRfcmVnLCAxIDw8IHctPnNoaWZ0LCAxIDw8IHctPnNoaWZ0KTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJZGVjX3Jlc2V0X3JlZywgMSA8PCB3LT5zaGlmdCwgMHgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJdHhfbXV4X2N0bF9yZWcsIDB4MDgsIDB4MDgpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQl0eF9tdXhfY3RsX3JlZywgMHgzMCwKKwkJCSh0eF9ocGZfd29ya1tkZWNpbWF0b3IgLSAxXS50eF9ocGZfY3V0X29mX2ZyZXEpIDw8IDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQl0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMCk7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fREVDSU1BVE9SUzsgaSsrKSB7CisJCQlpZiAoZGVjaW1hdG9yID09IGkgKyAxKQorCQkJCW1zbTh4MTZfd2NkLT5kZWNfYWN0aXZlW2ldID0gZmFsc2U7CisJCX0KKwkJaWYgKGRlY2ltYXRvciA9PSAzIHx8IGRlY2ltYXRvciA9PSA0KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfV1NBX1ZJX0IxX0NUTCwKKwkJCQkweEZGLCAweDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMICsKKwkJCQkJKGRlY2ltYXRvciAtIDEpICogMHgyMCwgMHg3LCAweDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMICsKKwkJCQkJKGRlY2ltYXRvciAtIDEpICogMHgyMCwgMHg3LCAweDApOworCQl9CisJCWJyZWFrOworCX0KK291dDoKKwlrZnJlZSh3aWRnZXRfbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc204OXh4X3djZF9jb2RlY19lbmFibGVfdmRkX3Nwa3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJaWYgKCFtc204eDE2X3djZC0+ZXh0X3Nwa19ib29zdF9zZXQpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGV4dF9ib29zdCBub3Qgc3VwcG9ydGVkL2Rpc2FibGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmIChtc204eDE2X3djZC0+c3BrZHJ2X3JlZykgeworCQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShtc204eDE2X3djZC0+c3BrZHJ2X3JlZyk7CisJCQlpZiAocmV0KQorCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzIEZhaWxlZCB0byBlbmFibGUgc3BrZHJ2IHJlZyAlc1xuIiwKKwkJCQkJX19mdW5jX18sIE1TTTg5WFhfVkREX1NQS0RSVl9OQU1FKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKG1zbTh4MTZfd2NkLT5zcGtkcnZfcmVnKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShtc204eDE2X3djZC0+c3BrZHJ2X3JlZyk7CisJCQlpZiAocmV0KQorCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBzcGtkcnZfcmVnICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgTVNNODlYWF9WRERfU1BLRFJWX05BTUUpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb2RlY19jb25maWdfY29tcGFuZGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJaW50IGludGVycF9uLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgc2hpZnQgJWQsIGVuYWJsZWQgJWRcbiIsCisJCV9fZnVuY19fLCBldmVudCwgaW50ZXJwX24sCisJCW1zbTh4MTZfd2NkLT5jb21wX2VuYWJsZWRbaW50ZXJwX25dKTsKKworCS8qIGNvbXBhbmRlciBpcyBub3QgZW5hYmxlZCAqLworCWlmICghbXNtOHgxNl93Y2QtPmNvbXBfZW5hYmxlZFtpbnRlcnBfbl0pCisJCXJldHVybiAwOworCisJc3dpdGNoIChtc204eDE2X3djZC0+Y29tcF9lbmFibGVkW2ludGVycF9uXSkgeworCWNhc2UgQ09NUEFOREVSXzE6CisJCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCQkvKiBFbmFibGUgQ29tcGFuZGVyIENsb2NrICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVEwsIDB4MEYsIDB4MDkpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IyX0NUTCwgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMV9DVEwsCisJCQkJMSA8PCBpbnRlcnBfbiwgMSA8PCBpbnRlcnBfbik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CM19DVEwsIDB4RkYsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjJfQ1RMLCAweEYwLCAweDUwKTsKKwkJCS8qIGFkZCBzbGVlcCBmb3IgY29tcGFuZGVyIHRvIHNldHRsZSAqLworCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMLCAweEZGLCAweDI4KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IyX0NUTCwgMHhGMCwgMHhCMCk7CisKKwkJCS8qIEVuYWJsZSBDb21wYW5kZXIgR1BJTyAqLworCQkJaWYgKG1zbTh4MTZfd2NkLT5jb2RlY19ocGhfY29tcF9ncGlvKQorCQkJCW1zbTh4MTZfd2NkLT5jb2RlY19ocGhfY29tcF9ncGlvKDEpOworCQl9IGVsc2UgaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7CisJCQkvKiBEaXNhYmxlIENvbXBhbmRlciBHUElPICovCisJCQlpZiAobXNtOHgxNl93Y2QtPmNvZGVjX2hwaF9jb21wX2dwaW8pCisJCQkJbXNtOHgxNl93Y2QtPmNvZGVjX2hwaF9jb21wX2dwaW8oMCk7CisKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IyX0NUTCwgMHgwRiwgMHgwNSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMV9DVEwsCisJCQkJMSA8PCBpbnRlcnBfbiwgMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMLCAweDAxLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBjb21wYW5kZXIgJWRcbiIsIF9fZnVuY19fLAorCQkJCW1zbTh4MTZfd2NkLT5jb21wX2VuYWJsZWRbaW50ZXJwX25dKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCQkgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQltc204eDE2X3djZF9jb2RlY19jb25maWdfY29tcGFuZGVyKGNvZGVjLCB3LT5zaGlmdCwgZXZlbnQpOworCQkvKiBhcHBseSB0aGUgZGlnaXRhbCBnYWluIGFmdGVyIHRoZSBpbnRlcnBvbGF0b3IgaXMgZW5hYmxlZCovCisJCWlmICgody0+c2hpZnQpIDwgQVJSQVlfU0laRShyeF9kaWdpdGFsX2dhaW5fcmVnKSkKKwkJCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJCQkgIHJ4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnRdLAorCQkJCSAgc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQkJICByeF9kaWdpdGFsX2dhaW5fcmVnW3ctPnNoaWZ0XSkKKwkJCQkgICk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQltc204eDE2X3djZF9jb2RlY19jb25maWdfY29tcGFuZGVyKGNvZGVjLCB3LT5zaGlmdCwgZXZlbnQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9SRVNFVF9DVEwsCisJCQkxIDw8IHctPnNoaWZ0LCAxIDw8IHctPnNoaWZ0KTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfUkVTRVRfQ1RMLAorCQkJMSA8PCB3LT5zaGlmdCwgMHgwKTsKKwkJLyoKKwkJICogZGlzYWJsZSB0aGUgbXV0ZSBlbmFibGVkIGR1cmluZyB0aGUgUE1EIG9mIHRoaXMgZGV2aWNlCisJCSAqLworCQlpZiAoKHctPnNoaWZ0ID09IDApICYmCisJCQkobXNtOHgxNl93Y2QtPm11dGVfbWFzayAmIEhQSExfUEFfRElTQUJMRSkpIHsKKwkJCXByX2VycigiZGlzYWJsaW5nIEhQSEwgbXV0ZVxuIik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPj0gQ0FKT04pCisJCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX0NOUCwKKwkJCQkJMHhGMCwgMHgyMCk7CisJCQltc204eDE2X3djZC0+bXV0ZV9tYXNrICY9IH4oSFBITF9QQV9ESVNBQkxFKTsKKwkJfSBlbHNlIGlmICgody0+c2hpZnQgPT0gMSkgJiYKKwkJCQkobXNtOHgxNl93Y2QtPm11dGVfbWFzayAmIEhQSFJfUEFfRElTQUJMRSkpIHsKKwkJCXByX2VycigiZGlzYWJsaW5nIEhQSFIgbXV0ZVxuIik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJCWlmIChnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCkgPj0gQ0FKT04pCisJCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX0NOUCwKKwkJCQkJMHhGMCwgMHgyMCk7CisJCQltc204eDE2X3djZC0+bXV0ZV9tYXNrICY9IH4oSFBIUl9QQV9ESVNBQkxFKTsKKwkJfSBlbHNlIGlmICgody0+c2hpZnQgPT0gMikgJiYKKwkJCQkobXNtOHgxNl93Y2QtPm11dGVfbWFzayAmIFNQS1JfUEFfRElTQUJMRSkpIHsKKwkJCXByX2VycigiZGlzYWJsaW5nIFNQS1IgbXV0ZVxuIik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJCW1zbTh4MTZfd2NkLT5tdXRlX21hc2sgJj0gfihTUEtSX1BBX0RJU0FCTEUpOworCQl9IGVsc2UgaWYgKCh3LT5zaGlmdCA9PSAwKSAmJgorCQkJCShtc204eDE2X3djZC0+bXV0ZV9tYXNrICYgRUFSX1BBX0RJU0FCTEUpKSB7CisJCQlwcl9lcnIoImRpc2FibGluZyBFQVIgbXV0ZVxuIik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJCW1zbTh4MTZfd2NkLT5tdXRlX21hc2sgJj0gfihFQVJfUEFfRElTQUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIHJlZ2lzdGVyIGFkZHJlc3MgaXMgdGhlIHNhbWUgYXMgb3RoZXIgY29kZWMgc28gaXQgY2FuIHVzZSByZXNtZ3IgKi8KK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3J4X2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQltc204eDE2X3djZC0+cnhfYmlhc19jb3VudCsrOworCQlpZiAobXNtOHgxNl93Y2QtPnJ4X2JpYXNfY291bnQgPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywKKwkJCQkJMHg4MCwgMHg4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDLAorCQkJCQkweDAxLCAweDAxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJbXNtOHgxNl93Y2QtPnJ4X2JpYXNfY291bnQtLTsKKwkJaWYgKG1zbTh4MTZfd2NkLT5yeF9iaWFzX2NvdW50ID09IDApIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fQklBU19EQUMsCisJCQkJCTB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywKKwkJCQkJMHg4MCwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIHJ4X2JpYXNfY291bnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBtc204eDE2X3djZC0+cnhfYmlhc19jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB3Y2RfZ2V0X2ltcGVkYW5jZV92YWx1ZSh1aW50MzJfdCBpbXBlZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdjZF9pbXBlZF92YWwpIC0gMTsgaSsrKSB7CisJCWlmIChpbXBlZCA+PSB3Y2RfaW1wZWRfdmFsW2ldICYmCisJCQlpbXBlZCA8IHdjZF9pbXBlZF92YWxbaSArIDFdKQorCQkJYnJlYWs7CisJfQorCisJcHJfZXJyKCIlczogc2VsZWN0ZWQgaW1wZWRhbmNlIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgd2NkX2ltcGVkX3ZhbFtpXSk7CisJcmV0dXJuIHdjZF9pbXBlZF92YWxbaV07Cit9CisKK3ZvaWQgd2NkX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQl1aW50MzJfdCBpbXBlZCwgYm9vbCBzZXRfZ2FpbikKK3sKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgY29kZWNfdmVyc2lvbjsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPQorCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdmFsdWUgPSB3Y2RfZ2V0X2ltcGVkYW5jZV92YWx1ZShpbXBlZCk7CisKKwlpZiAodmFsdWUgPCB3Y2RfaW1wZWRfdmFsWzBdKSB7CisJCXByX2VycigiJXMsIGRldGVjdGVkIGltcGVkYW5jZSBpcyBsZXNzIHRoYW4gNCBPaG1cbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICh2YWx1ZSA+PSB3Y2RfaW1wZWRfdmFsW0FSUkFZX1NJWkUod2NkX2ltcGVkX3ZhbCkgLSAxXSkgeworCQlwcl9lcnIoIiVzLCBpbnZhbGlkIGltcGVkLCBncmVhdGVyIHRoYW4gNDggT2htXG4gPSAlZFxuIiwKKwkJCV9fZnVuY19fLCB2YWx1ZSk7CisJCXJldHVybjsKKwl9CisKKwljb2RlY192ZXJzaW9uID0gZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpOworCisJaWYgKHNldF9nYWluKSB7CisJCXN3aXRjaCAoY29kZWNfdmVyc2lvbikgeworCQljYXNlIFRPTUJBS18xXzA6CisJCWNhc2UgVE9NQkFLXzJfMDoKKwkJY2FzZSBDT05HQToKKwkJCS8qCisJCQkgKiBGb3IgMzJPaG0gbG9hZCBhbmQgaGlnaGVyIGxvYWRzLCBTZXQgMHgxOUUKKwkJCSAqIGJpdCA1IHRvIDEgKFBPU182X0RCX0RJKS4gRm9yIGxvYWRzIGxvd2VyCisJCQkgKiB0aGFuIDMyT2htIChzdWNoIGFzIDE2T2htIGxvYWQpLCBTZXQgMHgxOUUKKwkJCSAqIGJpdCA1IHRvIDAgKFBPU18xUDVfREJfREkpCisJCQkgKi8KKwkJCWlmICh2YWx1ZSA+PSAzMikKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKKwkJCQkJMHgyMCwgMHgyMCk7CisJCQllbHNlCisJCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsCisJCQkJCTB4MjAsIDB4MDApOworCQkJYnJlYWs7CisJCWNhc2UgQ0FKT046CisJCWNhc2UgQ0FKT05fMl8wOgorCQljYXNlIERJQU5HVToKKwkJCWlmICh2YWx1ZSA+PSAxMykgeworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAorCQkJCQkweDIwLCAweDIwKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX1ZDVFJMLAorCQkJCQkweDA3LCAweDA3KTsKKwkJCX0gZWxzZSB7CisJCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsCisJCQkJCTB4MjAsIDB4MDApOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwsCisJCQkJCTB4MDcsIDB4MDQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsCisJCQkweDIwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwsCisJCQkweDA3LCAweDA0KTsKKwl9CisKKwlwcl9lcnIoIiVzOiBFeGl0XG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfaHBobF9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwl1aW50MzJfdCBpbXBlZGwsIGltcGVkcjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCXJldCA9IHdjZF9tYmhjX2dldF9pbXBlZGFuY2UoJm1zbTh4MTZfd2NkLT5tYmhjLAorCQkJJmltcGVkbCwgJmltcGVkcik7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA+IENBSk9OKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9FTiwKKwkJCQkweDA4LCAweDA4KTsKKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA9PSBDQUpPTiB8fAorCQkJZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpID09IENBSk9OXzJfMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfVEVTVCwKKwkJCQkweDgwLCAweDgwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1RFU1QsCisJCQkJMHg4MCwgMHg4MCk7CisJCX0KKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA+IENBSk9OKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9FTiwKKwkJCQkweDA4LCAweDAwKTsKKwkJaWYgKG1zbTh4MTZfd2NkLT5ocGhfbW9kZSA9PSBIRDJfTU9ERSkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0IzX0NUTCwgMHgxQywgMHgxNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjRfQ1RMLCAweDE4LCAweDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVEwsIDB4ODAsIDB4ODApOworCQl9CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfUEFfREFDX0NUTCwgMHgwMiwgMHgwMik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMSwgMHgwMSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgwMiwgMHgwMik7CisJCWlmICghcmV0KQorCQkJd2NkX2ltcGVkX2NvbmZpZyhjb2RlYywgaW1wZWRsLCB0cnVlKTsKKwkJZWxzZQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGdldCBtYmhjIGltcGVkYW5jZSAlZFxuIiwKKwkJCQlyZXQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9QQV9EQUNfQ1RMLCAweDAyLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdjZF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCwgZmFsc2UpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDIsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsIDB4MDEsIDB4MDApOworCQlpZiAobXNtOHgxNl93Y2QtPmhwaF9tb2RlID09IEhEMl9NT0RFKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjNfQ1RMLCAweDFDLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwsIDB4MTgsIDB4RkYpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0IzX0NUTCwgMHg4MCwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2xvX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgxMCwgMHgxMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fRU5fQ1RMLCAweDIwLCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4ODAsIDB4ODApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0RBQ19DVEwsIDB4MDgsIDB4MDgpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0RBQ19DVEwsIDB4NDAsIDB4NDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDgwLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDA4LCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4NDAsIDB4NDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHg4MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHg0MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHgwOCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fRU5fQ1RMLCAweDgwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4NDAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTCwgMHgyMCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgxMCwgMHgwMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9ocGhyX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmIChtc204eDE2X3djZC0+aHBoX21vZGUgPT0gSEQyX01PREUpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVEwsIDB4MUMsIDB4MTQpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTCwgMHgxOCwgMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjNfQ1RMLCAweDgwLCAweDgwKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1BBX0RBQ19DVEwsIDB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsIDB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDEsIDB4MDEpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMLCAweDAyLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgwMSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMiwgMHgwMCk7CisJCWlmIChtc204eDE2X3djZC0+aHBoX21vZGUgPT0gSEQyX01PREUpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVEwsIDB4MUMsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTCwgMHgxOCwgMHhGRik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjNfQ1RMLCAweDgwLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfaHBoX3BhX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogJXMgZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAody0+c2hpZnQgPT0gNSkKKwkJCW1zbTh4MTZfbm90aWZpZXJfY2FsbChjb2RlYywKKwkJCQkJV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09OKTsKKwkJZWxzZSBpZiAody0+c2hpZnQgPT0gNCkKKwkJCW1zbTh4MTZfbm90aWZpZXJfY2FsbChjb2RlYywKKwkJCQkJV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09OKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHgyMCwgMHgyMCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKwkJaWYgKHctPnNoaWZ0ID09IDUpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QsIDB4MDQsIDB4MDQpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTCwgMHgwMSwgMHgwMCk7CisJCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gNCkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVCwgMHgwNCwgMHgwNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICh3LT5zaGlmdCA9PSA1KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjZfQ1RMLCAweDAxLCAweDAxKTsKKwkJCW1zbGVlcCgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9URVNULCAweDA0LCAweDAwKTsKKwkJCW1zbTh4MTZfd2NkLT5tdXRlX21hc2sgfD0gSFBITF9QQV9ESVNBQkxFOworCQkJbXNtOHgxNl9ub3RpZmllcl9jYWxsKGNvZGVjLAorCQkJCQlXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT0ZGKTsKKwkJfSBlbHNlIGlmICh3LT5zaGlmdCA9PSA0KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMLCAweDAxLCAweDAxKTsKKwkJCW1zbGVlcCgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9URVNULCAweDA0LCAweDAwKTsKKwkJCW1zbTh4MTZfd2NkLT5tdXRlX21hc2sgfD0gSFBIUl9QQV9ESVNBQkxFOworCQkJbXNtOHgxNl9ub3RpZmllcl9jYWxsKGNvZGVjLAorCQkJCQlXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGKTsKKwkJfQorCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpID49IENBSk9OKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19DTlAsCisJCQkJMHhGMCwgMHgzMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICh3LT5zaGlmdCA9PSA1KSB7CisJCQljbGVhcl9iaXQoV0NEX01CSENfSFBITF9QQV9PRkZfQUNLLAorCQkJCSZtc204eDE2X3djZC0+bWJoYy5ocGhfcGFfZGFjX3N0YXRlKTsKKwkJCW1zbTh4MTZfbm90aWZpZXJfY2FsbChjb2RlYywKKwkJCQkJV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYpOworCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDQpIHsKKwkJCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhSX1BBX09GRl9BQ0ssCisJCQkJJm1zbTh4MTZfd2NkLT5tYmhjLmhwaF9wYV9kYWNfc3RhdGUpOworCQkJbXNtOHgxNl9ub3RpZmllcl9jYWxsKGNvZGVjLAorCQkJCQlXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRik7CisJCX0KKwkJdXNsZWVwX3JhbmdlKDQwMDAsIDQxMDApOworCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKKworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IHNsZWVwIDEwIG1zIGFmdGVyICVzIFBBIGRpc2FibGUuXG4iLCBfX2Z1bmNfXywKKwkJCXctPm5hbWUpOworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMTAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKKwl7IlJYX0kyU19DTEsiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKKwl7IkkyUyBSWDEiLCBOVUxMLCAiUlhfSTJTX0NMSyJ9LAorCXsiSTJTIFJYMiIsIE5VTEwsICJSWF9JMlNfQ0xLIn0sCisJeyJJMlMgUlgzIiwgTlVMTCwgIlJYX0kyU19DTEsifSwKKworCXsiSTJTIFRYMSIsIE5VTEwsICJUWF9JMlNfQ0xLIn0sCisJeyJJMlMgVFgyIiwgTlVMTCwgIlRYX0kyU19DTEsifSwKKwl7IkFJRjIgVkkiLCBOVUxMLCAiVFhfSTJTX0NMSyJ9LAorCisJeyJJMlMgVFgxIiwgTlVMTCwgIkRFQzEgTVVYIn0sCisJeyJJMlMgVFgyIiwgTlVMTCwgIkRFQzIgTVVYIn0sCisJeyJBSUYyIFZJIiwgTlVMTCwgIkRFQzMgTVVYIn0sCisJeyJBSUYyIFZJIiwgTlVMTCwgIkRFQzQgTVVYIn0sCisKKwkvKiBSREFDIENvbm5lY3Rpb25zICovCisJeyJIUEhSIERBQyIsIE5VTEwsICJSREFDMiBNVVgifSwKKwl7IlJEQUMyIE1VWCIsICJSWDEiLCAiUlgxIENIQUlOIn0sCisJeyJSREFDMiBNVVgiLCAiUlgyIiwgIlJYMiBDSEFJTiJ9LAorCisJLyogV1NBICovCisJeyJXU0FfU1BLIE9VVCIsIE5VTEwsICJXU0EgU3BrIFN3aXRjaCJ9LAorCXsiV1NBIFNwayBTd2l0Y2giLCAiV1NBIiwgIkVBUiBQQSJ9LAorCisJLyogRWFycGllY2UgKFJYIE1JWDEpICovCisJeyJFQVIiLCBOVUxMLCAiRUFSX1MifSwKKwl7IkVBUl9TIiwgIlN3aXRjaCIsICJFQVIgUEEifSwKKwl7IkVBUiBQQSIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJFQVIgUEEiLCBOVUxMLCAiSFBITCBEQUMifSwKKwl7IkVBUiBQQSIsIE5VTEwsICJIUEhSIERBQyJ9LAorCXsiRUFSIFBBIiwgTlVMTCwgIkVBUiBDUCJ9LAorCisJLyogSGVhZHNldCAoUlggTUlYMSBhbmQgUlggTUlYMikgKi8KKwl7IkhFQURQSE9ORSIsIE5VTEwsICJIUEhMIFBBIn0sCisJeyJIRUFEUEhPTkUiLCBOVUxMLCAiSFBIUiBQQSJ9LAorCisJeyJFeHQgU3BrIiwgTlVMTCwgIkV4dCBTcGsgU3dpdGNoIn0sCisJeyJFeHQgU3BrIFN3aXRjaCIsICJPbiIsICJIUEhMIFBBIn0sCisJeyJFeHQgU3BrIFN3aXRjaCIsICJPbiIsICJIUEhSIFBBIn0sCisKKwl7IkhQSEwgUEEiLCBOVUxMLCAiSFBITCJ9LAorCXsiSFBIUiBQQSIsIE5VTEwsICJIUEhSIn0sCisJeyJIUEhMIiwgIlN3aXRjaCIsICJIUEhMIERBQyJ9LAorCXsiSFBIUiIsICJTd2l0Y2giLCAiSFBIUiBEQUMifSwKKwl7IkhQSEwgUEEiLCBOVUxMLCAiQ1AifSwKKwl7IkhQSEwgUEEiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiSFBIUiBQQSIsIE5VTEwsICJDUCJ9LAorCXsiSFBIUiBQQSIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJIUEhMIERBQyIsIE5VTEwsICJSWDEgQ0hBSU4ifSwKKworCXsiU1BLX09VVCIsIE5VTEwsICJTUEsgUEEifSwKKwl7IlNQSyBQQSIsIE5VTEwsICJTUEtfUlhfQklBUyJ9LAorCXsiU1BLIFBBIiwgTlVMTCwgIlNQSyJ9LAorCXsiU1BLIiwgIlN3aXRjaCIsICJTUEsgREFDIn0sCisJeyJTUEsgREFDIiwgTlVMTCwgIlJYMyBDSEFJTiJ9LAorCXsiU1BLIERBQyIsIE5VTEwsICJWRERfU1BLRFJWIn0sCisKKwkvKiBsaW5lb3V0ICovCisJeyJMSU5FT1VUIiwgTlVMTCwgIkxJTkVPVVQgUEEifSwKKwl7IkxJTkVPVVQgUEEiLCBOVUxMLCAiU1BLX1JYX0JJQVMifSwKKwl7IkxJTkVPVVQgUEEiLCBOVUxMLCAiTElORV9PVVQifSwKKwl7IkxJTkVfT1VUIiwgIlN3aXRjaCIsICJMSU5FT1VUIERBQyJ9LAorCXsiTElORU9VVCBEQUMiLCBOVUxMLCAiUlgzIENIQUlOIn0sCisKKwkvKiBsaW5lb3V0IHRvIFdTQSAqLworCXsiV1NBX1NQSyBPVVQiLCBOVUxMLCAiTElORU9VVCBQQSJ9LAorCisJeyJSWDEgQ0hBSU4iLCBOVUxMLCAiUlgxIENMSyJ9LAorCXsiUlgyIENIQUlOIiwgTlVMTCwgIlJYMiBDTEsifSwKKwl7IlJYMyBDSEFJTiIsIE5VTEwsICJSWDMgQ0xLIn0sCisJeyJSWDEgQ0hBSU4iLCBOVUxMLCAiUlgxIE1JWDIifSwKKwl7IlJYMiBDSEFJTiIsIE5VTEwsICJSWDIgTUlYMiJ9LAorCXsiUlgzIENIQUlOIiwgTlVMTCwgIlJYMyBNSVgxIn0sCisKKwl7IlJYMSBNSVgxIiwgTlVMTCwgIlJYMSBNSVgxIElOUDEifSwKKwl7IlJYMSBNSVgxIiwgTlVMTCwgIlJYMSBNSVgxIElOUDIifSwKKwl7IlJYMSBNSVgxIiwgTlVMTCwgIlJYMSBNSVgxIElOUDMifSwKKwl7IlJYMiBNSVgxIiwgTlVMTCwgIlJYMiBNSVgxIElOUDEifSwKKwl7IlJYMiBNSVgxIiwgTlVMTCwgIlJYMiBNSVgxIElOUDIifSwKKwl7IlJYMyBNSVgxIiwgTlVMTCwgIlJYMyBNSVgxIElOUDEifSwKKwl7IlJYMyBNSVgxIiwgTlVMTCwgIlJYMyBNSVgxIElOUDIifSwKKwl7IlJYMSBNSVgyIiwgTlVMTCwgIlJYMSBNSVgxIn0sCisJeyJSWDEgTUlYMiIsIE5VTEwsICJSWDEgTUlYMiBJTlAxIn0sCisJeyJSWDIgTUlYMiIsIE5VTEwsICJSWDIgTUlYMSJ9LAorCXsiUlgyIE1JWDIiLCBOVUxMLCAiUlgyIE1JWDIgSU5QMSJ9LAorCisJeyJSWDEgTUlYMSBJTlAxIiwgIlJYMSIsICJJMlMgUlgxIn0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIlJYMiIsICJJMlMgUlgyIn0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIlJYMyIsICJJMlMgUlgzIn0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgxIE1JWDEgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlgxIiwgIkkyUyBSWDEifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlgyIiwgIkkyUyBSWDIifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlgzIiwgIkkyUyBSWDMifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDEgTUlYMSBJTlAyIiwgIklJUjIiLCAiSUlSMiJ9LAorCXsiUlgxIE1JWDEgSU5QMyIsICJSWDEiLCAiSTJTIFJYMSJ9LAorCXsiUlgxIE1JWDEgSU5QMyIsICJSWDIiLCAiSTJTIFJYMiJ9LAorCXsiUlgxIE1JWDEgSU5QMyIsICJSWDMiLCAiSTJTIFJYMyJ9LAorCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYMSIsICJJMlMgUlgxIn0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYMiIsICJJMlMgUlgyIn0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYMyIsICJJMlMgUlgzIn0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgyIE1JWDEgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiUlgxIiwgIkkyUyBSWDEifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiUlgyIiwgIkkyUyBSWDIifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiUlgzIiwgIkkyUyBSWDMifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDIgTUlYMSBJTlAyIiwgIklJUjIiLCAiSUlSMiJ9LAorCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYMSIsICJJMlMgUlgxIn0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYMiIsICJJMlMgUlgyIn0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYMyIsICJJMlMgUlgzIn0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgzIE1JWDEgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiUlgxIiwgIkkyUyBSWDEifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiUlgyIiwgIkkyUyBSWDIifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiUlgzIiwgIkkyUyBSWDMifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDMgTUlYMSBJTlAyIiwgIklJUjIiLCAiSUlSMiJ9LAorCisJeyJSWDEgTUlYMiBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgyIE1JWDIgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMSBNSVgyIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDIgTUlYMiBJTlAxIiwgIklJUjIiLCAiSUlSMiJ9LAorCisJLyogRGVjaW1hdG9yIElucHV0cyAqLworCXsiREVDMSBNVVgiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRFQzEgTVVYIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJERUMxIE1VWCIsICJBREMxIiwgIkFEQzEifSwKKwl7IkRFQzEgTVVYIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiREVDMSBNVVgiLCAiQURDMyIsICJBREMzIn0sCisJeyJERUMxIE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAorCisJeyJERUMyIE1VWCIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiREVDMiBNVVgiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRFQzIgTVVYIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiREVDMiBNVVgiLCAiQURDMiIsICJBREMyIn0sCisJeyJERUMyIE1VWCIsICJBREMzIiwgIkFEQzMifSwKKwl7IkRFQzIgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCisKKwl7IkRFQzMgTVVYIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJERUM0IE1VWCIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiREVDMyBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKKwl7IkRFQzQgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCisJLyogQURDIENvbm5lY3Rpb25zICovCisJeyJBREMyIiwgTlVMTCwgIkFEQzIgTVVYIn0sCisJeyJBREMzIiwgTlVMTCwgIkFEQzIgTVVYIn0sCisJeyJBREMyIE1VWCIsICJJTlAyIiwgIkFEQzJfSU5QMiJ9LAorCXsiQURDMiBNVVgiLCAiSU5QMyIsICJBREMyX0lOUDMifSwKKworCXsiQURDMSIsIE5VTEwsICJBTUlDMSJ9LAorCXsiQURDMl9JTlAyIiwgTlVMTCwgIkFNSUMyIn0sCisJeyJBREMyX0lOUDMiLCBOVUxMLCAiQU1JQzMifSwKKworCS8qIFRPRE86IEZpeCB0aGlzICovCisJeyJJSVIxIiwgTlVMTCwgIklJUjEgSU5QMSBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMSIsICJERUMxIE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUMyIiwgIkRFQzIgTVVYIn0sCisJeyJJSVIyIiwgTlVMTCwgIklJUjIgSU5QMSBNVVgifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiREVDMSIsICJERUMxIE1VWCJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJERUMyIiwgIkRFQzIgTVVYIn0sCisJeyJNSUMgQklBUyBJbnRlcm5hbDEiLCBOVUxMLCAiSU5UX0xET19IIn0sCisJeyJNSUMgQklBUyBJbnRlcm5hbDIiLCBOVUxMLCAiSU5UX0xET19IIn0sCisJeyJNSUMgQklBUyBFeHRlcm5hbCIsIE5VTEwsICJJTlRfTERPX0gifSwKKwl7Ik1JQyBCSUFTIEV4dGVybmFsMiIsIE5VTEwsICJJTlRfTERPX0gifSwKKwl7Ik1JQyBCSUFTIEludGVybmFsMSIsIE5VTEwsICJNSUNCSUFTX1JFR1VMQVRPUiJ9LAorCXsiTUlDIEJJQVMgSW50ZXJuYWwyIiwgTlVMTCwgIk1JQ0JJQVNfUkVHVUxBVE9SIn0sCisJeyJNSUMgQklBUyBFeHRlcm5hbCIsIE5VTEwsICJNSUNCSUFTX1JFR1VMQVRPUiJ9LAorCXsiTUlDIEJJQVMgRXh0ZXJuYWwyIiwgTlVMTCwgIk1JQ0JJQVNfUkVHVUxBVE9SIn0sCit9OworCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9CisJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisKKwlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwgIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwKKwkJX19mdW5jX18sCisJCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCS8qCisJICogSWYgc3RhdHVzX21hc2sgaXMgQlVfRE9XTiBpdCBtZWFucyBTU1IgaXMgbm90IGNvbXBsZXRlLgorCSAqIFNvIHJldHVuIGVycm9yLgorCSAqLworCWlmICh0ZXN0X2JpdChCVVNfRE9XTiwgJm1zbTh4MTZfd2NkLT5zdGF0dXNfbWFzaykpIHsKKwkJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsICJFcnJvciwgRGV2aWNlIGlzIG5vdCB1cCBwb3N0IFNTUlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2Rfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LAorCQkiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Cit9CisKK2ludCBtc204eDE2X3djZF9tY2xrX2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgaW50IG1jbGtfZW5hYmxlLCBib29sIGRhcG0pCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWNsa19lbmFibGUgPSAldSwgZGFwbSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbWNsa19lbmFibGUsIGRhcG0pOworCWlmIChtY2xrX2VuYWJsZSkgeworCQltc204eDE2X3djZC0+aW50X21jbGswX2VuYWJsZWQgPSB0cnVlOworCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfY2xvY2tfYmxvY2soY29kZWMsIDEpOworCX0gZWxzZSB7CisJCWlmICghbXNtOHgxNl93Y2QtPmludF9tY2xrMF9lbmFibGVkKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJFcnJvciwgTUNMSyBhbHJlYWR5IGRpYWJsZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbXNtOHgxNl93Y2QtPmludF9tY2xrMF9lbmFibGVkID0gZmFsc2U7CisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9jbG9ja19ibG9jayhjb2RlYywgMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2Rfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQl1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCisJCQkJdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQorCit7CisJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2dldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgdW5zaWduZWQgaW50ICp0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKKwkJCQkgdW5zaWduZWQgaW50ICpyeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKKworeworCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9zZXRfaW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJdTggcnhfZnNfcmF0ZV9yZWdfdmFsLCB1MzIgc2FtcGxlX3JhdGUpCit7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGRhaS0+Y29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwsIDB4RjAsIHJ4X2ZzX3JhdGVfcmVnX3ZhbCk7CisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGRhaS0+Y29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CNV9DVEwsIDB4RjAsIHJ4X2ZzX3JhdGVfcmVnX3ZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2Rfc2V0X2RlY2ltYXRvcl9yYXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCXU4IHR4X2ZzX3JhdGVfcmVnX3ZhbCwgdTMyIHNhbXBsZV9yYXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwl1OCB0eF9mc19yYXRlLCByeF9mc19yYXRlLCByeF9jbGtfZnNfcmF0ZTsKKwlpbnQgcmV0OworCisJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsCisJCSIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWQgZm9ybWF0ICVkXG4iLAorCQlfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQlwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSwgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwkJdHhfZnNfcmF0ZSA9IDB4MDA7CisJCXJ4X2ZzX3JhdGUgPSAweDAwOworCQlyeF9jbGtfZnNfcmF0ZSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMTYwMDA6CisJCXR4X2ZzX3JhdGUgPSAweDIwOworCQlyeF9mc19yYXRlID0gMHgyMDsKKwkJcnhfY2xrX2ZzX3JhdGUgPSAweDAxOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQl0eF9mc19yYXRlID0gMHg0MDsKKwkJcnhfZnNfcmF0ZSA9IDB4NDA7CisJCXJ4X2Nsa19mc19yYXRlID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJdHhfZnNfcmF0ZSA9IDB4NjA7CisJCXJ4X2ZzX3JhdGUgPSAweDYwOworCQlyeF9jbGtfZnNfcmF0ZSA9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXR4X2ZzX3JhdGUgPSAweDgwOworCQlyeF9mc19yYXRlID0gMHg4MDsKKwkJcnhfY2xrX2ZzX3JhdGUgPSAweDA0OworCQlicmVhazsKKwljYXNlIDE5MjAwMDoKKwkJdHhfZnNfcmF0ZSA9IDB4QTA7CisJCXJ4X2ZzX3JhdGUgPSAweEEwOworCQlyeF9jbGtfZnNfcmF0ZSA9IDB4MDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWRcbiIsIF9fZnVuY19fLAorCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihkYWktPmNvZGVjLAorCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTCwgMHgwRiwgcnhfY2xrX2ZzX3JhdGUpOworCisJc3dpdGNoIChzdWJzdHJlYW0tPnN0cmVhbSkgeworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgorCQlyZXQgPSBtc204eDE2X3djZF9zZXRfZGVjaW1hdG9yX3JhdGUoZGFpLCB0eF9mc19yYXRlLAorCQkJCQkgICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwKKwkJCQkiJXM6IHNldCBkZWNpbWF0b3IgcmF0ZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKKwkJcmV0ID0gbXNtOHgxNl93Y2Rfc2V0X2ludGVycG9sYXRvcl9yYXRlKGRhaSwgcnhfZnNfcmF0ZSwKKwkJCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwKKwkJCQkiJXM6IHNldCBkZWNpbWF0b3IgcmF0ZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLCBfX2Z1bmNfXywKKwkJCXN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGRhaS0+Y29kZWMsCisJCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTCwgMHgyMCwgMHgyMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihkYWktPmNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVEwsIDB4MjAsIDB4MDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwgIiVzOiB3cm9uZyBmb3JtYXQgc2VsZWN0ZWRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbTh4MTZfd2NkX2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gTlVMTDsKKwl1MTYgdHhfdm9sX2N0bF9yZWcgPSAwOworCXU4IGRlY2ltYXRvciA9IDAsIGk7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkOworCisJcHJfZXJyKCIlczogRGlnaXRhbCBNdXRlIHZhbCA9ICVkXG4iLCBfX2Z1bmNfXywgbXV0ZSk7CisKKwlpZiAoIWRhaSB8fCAhZGFpLT5jb2RlYykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29kZWMgPSBkYWktPmNvZGVjOworCW1zbTh4MTZfd2NkID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoKGRhaS0+aWQgIT0gQUlGMV9DQVApICYmIChkYWktPmlkICE9IEFJRjJfVklGRUVEKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm90IGNhcHR1cmUgdXNlIGNhc2Ugc2tpcFxuIiwKKwkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRlID0gKG11dGUpID8gMSA6IDA7CisJaWYgKCFtdXRlKSB7CisJCS8qCisJCSAqIDE1IG1zIGlzIGFuIGVtcGVyaWNhbCB2YWx1ZSBmb3IgdGhlIG11dGUgdGltZQorCQkgKiB0aGF0IHdhcyBhcnJpdmVkIGJ5IGNoZWNraW5nIHRoZSBwb3AgbGV2ZWwKKwkJICogdG8gYmUgaW5hdWRpYmxlCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTUwMDAsIDE1MDEwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RFQ0lNQVRPUlM7IGkrKykgeworCQlpZiAobXNtOHgxNl93Y2QtPmRlY19hY3RpdmVbaV0pCisJCQlkZWNpbWF0b3IgPSBpICsgMTsKKwkJaWYgKGRlY2ltYXRvciAmJiBkZWNpbWF0b3IgPD0gTlVNX0RFQ0lNQVRPUlMpIHsKKwkJCXByX2VycigiJXM6IE11dGUgPSAlZCBEZWNpbWF0b3IgPSAlZCIsIF9fZnVuY19fLAorCQkJCQltdXRlLCBkZWNpbWF0b3IpOworCQkJdHhfdm9sX2N0bF9yZWcgPSBNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0NGRyArCisJCQkJMzIgKiAoZGVjaW1hdG9yIC0gMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJdHhfdm9sX2N0bF9yZWcsIDB4MDEsIG11dGUpOworCQl9CisJCWRlY2ltYXRvciA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc204eDE2X3djZF9kYWlfb3BzID0geworCS5zdGFydHVwID0gbXNtOHgxNl93Y2Rfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBtc204eDE2X3djZF9zaHV0ZG93biwKKwkuaHdfcGFyYW1zID0gbXNtOHgxNl93Y2RfaHdfcGFyYW1zLAorCS5zZXRfc3lzY2xrID0gbXNtOHgxNl93Y2Rfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQgPSBtc204eDE2X3djZF9zZXRfZGFpX2ZtdCwKKwkuc2V0X2NoYW5uZWxfbWFwID0gbXNtOHgxNl93Y2Rfc2V0X2NoYW5uZWxfbWFwLAorCS5nZXRfY2hhbm5lbF9tYXAgPSBtc204eDE2X3djZF9nZXRfY2hhbm5lbF9tYXAsCisJLmRpZ2l0YWxfbXV0ZSA9IG1zbTh4MTZfd2NkX2RpZ2l0YWxfbXV0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbTh4MTZfd2NkX2kyc19kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gIm1zbTh4MTZfd2NkX2kyc19yeDEiLAorCQkuaWQgPSBBSUYxX1BCLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBQbGF5YmFjayIsCisJCQkucmF0ZXMgPSBNU004OVhYX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBNU004OVhYX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMywKKwkJfSwKKwkJLm9wcyA9ICZtc204eDE2X3djZF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJtc204eDE2X3djZF9pMnNfdHgxIiwKKwkJLmlkID0gQUlGMV9DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBNU004OVhYX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBNU004OVhYX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJfSwKKwkJLm9wcyA9ICZtc204eDE2X3djZF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJjYWpvbl92aWZlZWRiYWNrIiwKKwkJLmlkID0gQUlGMl9WSUZFRUQsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZJZmVlZCIsCisJCQkucmF0ZXMgPSBNU004OVhYX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBNU004OVhYX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlX21pbiA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZtc204eDE2X3djZF9kYWlfb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9yeF9jaGFpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBQTVU6U2xlZXBpbmcgMjBtcyBhZnRlciBkaXNhYmxpbmcgbXV0ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogUE1EOlNsZWVwaW5nIDIwbXMgYWZ0ZXIgZGlzYWJsaW5nIG11dGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgdy0+cmVnLAorCQkJICAgIDEgPDwgdy0+c2hpZnQsIDB4MDApOworCQltc2xlZXAoMjApOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2xvX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEwsIDB4MDEsIDB4MDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMLCAweDAxLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3Nwa19leHRfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6ICVzIGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGVuYWJsZSBleHRlcm5hbCBzcGVha2VyIFBBXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChtc204eDE2X3djZC0+Y29kZWNfc3BrX2V4dF9wYV9jYikKKwkJCW1zbTh4MTZfd2NkLT5jb2RlY19zcGtfZXh0X3BhX2NiKGNvZGVjLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBlbmFibGUgZXh0ZXJuYWwgc3BlYWtlciBQQVxuIiwgX19mdW5jX18pOworCQlpZiAobXNtOHgxNl93Y2QtPmNvZGVjX3Nwa19leHRfcGFfY2IpCisJCQltc204eDE2X3djZC0+Y29kZWNfc3BrX2V4dF9wYV9jYihjb2RlYywgMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfZWFyX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogU2xlZXBpbmcgMjBtcyBhZnRlciBzZWxlY3QgRUFSIFBBXG4iLAorCQkJX19mdW5jX18pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsIDB4ODAsIDB4ODApOworCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24obXNtOHgxNl93Y2QpIDwgQ09OR0EpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhGRiwgMHgyQSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IFNsZWVwaW5nIDIwbXMgYWZ0ZXIgZW5hYmxpbmcgRUFSIFBBXG4iLAorCQkJX19mdW5jX18pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLCAweDQwLCAweDQwKTsKKwkJdXNsZWVwX3JhbmdlKDcwMDAsIDcxMDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwsIDB4MDEsIDB4MDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwsIDB4MDEsIDB4MDEpOworCQltc2xlZXAoMjApOworCQltc204eDE2X3djZC0+bXV0ZV9tYXNrIHw9IEVBUl9QQV9ESVNBQkxFOworCQlpZiAobXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbiA9PSBCT09TVF9BTFdBWVMpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IGJvb3N0X29wdGlvbjolZCwgdGVhciBkb3duIGVhclxuIiwKKwkJCQlfX2Z1bmNfXywgbXNtOHgxNl93Y2QtPmJvb3N0X29wdGlvbik7CisJCQltc204eDE2X3djZF9ib29zdF9tb2RlX3NlcXVlbmNlKGNvZGVjLCBFQVJfUE1EKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBTbGVlcGluZyA3bXMgYWZ0ZXIgZGlzYWJsaW5nIEVBUiBQQVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwgMHg0MCwgMHgwMCk7CisJCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKwkJaWYgKGdldF9jb2RlY192ZXJzaW9uKG1zbTh4MTZfd2NkKSA8IENPTkdBKQorCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUUsIDB4RkYsIDB4MTYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc204eDE2X3djZF9kYXBtX3dpZGdldHNbXSA9IHsKKwkvKlJYIHN0dWZmICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiV1NBX1NQSyBPVVQiKSwKKworCVNORF9TT0NfREFQTV9QR0FfRSgiRUFSIFBBIiwgU05EX1NPQ19OT1BNLAorCQkJMCwgMCwgTlVMTCwgMCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2Vhcl9wYSwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJFQVJfUyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJZWFyX3BhX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJXU0EgU3BrIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJd3NhX3Nwa19tdXgpLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTigiSTJTIFJYMSIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9BSUZfSU4oIkkyUyBSWDIiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJJMlMgUlgzIiwgIkFJRjEgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSU5UX0xET19IIiwgU05EX1NPQ19OT1BNLCAxLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfc3BrX2V4dF9wYSksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIRUFEUEhPTkUiKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSEwgUEEiLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sCisJCTUsIDAsIE5VTEwsIDAsCisJCW1zbTh4MTZfd2NkX2hwaF9wYV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJIUEhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlocGhsX211eCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiSFBITCBEQUMiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwsIDMsIDAsIE5VTEwsCisJCTAsIG1zbTh4MTZfd2NkX2hwaGxfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSFIgUEEiLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sCisJCTQsIDAsIE5VTEwsIDAsCisJCW1zbTh4MTZfd2NkX2hwaF9wYV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJIUEhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlocGhyX211eCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiSFBIUiBEQUMiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1BBX0RBQ19DVEwsIDMsIDAsIE5VTEwsCisJCTAsIG1zbTh4MTZfd2NkX2hwaHJfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJTUEsiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXNwa3JfbXV4KSwKKworCVNORF9TT0NfREFQTV9EQUMoIlNQSyBEQUMiLCBOVUxMLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgNywgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJMSU5FX09VVCIsCisJCVNORF9TT0NfTk9QTSwgMCwgMCwgbG9fbXV4KSwKKworCVNORF9TT0NfREFQTV9EQUNfRSgiTElORU9VVCBEQUMiLCBOVUxMLAorCQlTTkRfU09DX05PUE0sIDAsIDAsIG1zbTh4MTZfd2NkX2xvX2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogU3BlYWtlciAqLworCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS19PVVQiKSwKKworCS8qIExpbmVvdXQgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUIiksCisKKwlTTkRfU09DX0RBUE1fUEdBX0UoIlNQSyBQQSIsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAorCQkJNiwgMCwgTlVMTCwgMCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3Nwa19wYSwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9QR0FfRSgiTElORU9VVCBQQSIsIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fRU5fQ1RMLAorCQkJNSwgMCwgTlVMTCwgMCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2xvX3BhLAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIlZERF9TUEtEUlYiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgbXNtODl4eF93Y2RfY29kZWNfZW5hYmxlX3ZkZF9zcGtyLAorCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkV4dCBTcGsgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZXh0X3Nwa19tdXgpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWDEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWDIgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlgxIE1JWDIiLAorCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMV9DVEwsIE1TTTg5WFhfUlgxLCAwLCBOVUxMLAorCQkwLCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWDIgTUlYMiIsCisJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IxX0NUTCwgTVNNODlYWF9SWDIsIDAsIE5VTEwsCisJCTAsIG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYMyBNSVgxIiwKKwkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMLCBNU004OVhYX1JYMywgMCwgTlVMTCwKKwkJMCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYMSBDTEsiLCBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCTAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYMiBDTEsiLCBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCTEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYMyBDTEsiLCBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCTIsIDAsIG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9kaWdfY2xrLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYMSBDSEFJTiIsIE1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTCwgMCwgMCwKKwkJTlVMTCwgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3J4X2NoYWluLAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWDIgQ0hBSU4iLCBNU004OVhYX0NEQ19DT1JFX1JYMl9CNl9DVEwsIDAsIDAsCisJCU5VTEwsIDAsCisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9yeF9jaGFpbiwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlgzIENIQUlOIiwgTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMLCAwLCAwLAorCQlOVUxMLCAwLAorCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfcnhfY2hhaW4sCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4MV9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlgxIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X21peDFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMSBNSVgxIElOUDMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9taXgxX2lucDNfbXV4KSwKKworCVNORF9TT0NfREFQTV9NVVgoIlJYMiBNSVgxIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDJfbWl4MV9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlgyIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4Ml9taXgxX2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDIgTUlYMSBJTlAzIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcngyX21peDFfaW5wM19tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWCgiUlgzIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4M19taXgxX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDMgTUlYMSBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcngzX21peDFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMyBNSVgxIElOUDMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDNfbWl4MV9pbnAzX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDEgTUlYMiBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcngxX21peDJfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMiBNSVgyIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDJfbWl4Ml9pbnAxX211eCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTX1JFR1VMQVRPUiIsIFNORF9TT0NfTk9QTSwKKwkJT05fREVNQU5EX01JQ0JJQVMsIDAsCisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9vbl9kZW1hbmRfc3VwcGx5LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJDUCIsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOLCAwLCAwLAorCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfY2hhcmdlX3B1bXAsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkVBUiBDUCIsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOLCA0LCAwLAorCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfY2hhcmdlX3B1bXAsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFlfUygiUlhfQklBUyIsIDEsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX3J4X2JpYXMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFlfUygiU1BLX1JYX0JJQVMiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9yeF9iaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwkvKiBUWCAqLworCisJU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJDRENfQ09OTiIsIC0yLCBNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX0NUTCwKKwkJMiwgMCwgTlVMTCwgMCksCisKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzEiKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBJbnRlcm5hbDEiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwgNywgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBJbnRlcm5hbDIiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwgNywgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBJbnRlcm5hbDMiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwgNywgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzEiLCBOVUxMLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4sIDcsIDAsCisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9hZGMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzJfSU5QMiIsCisJCU5VTEwsIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTiwgNywgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDMl9JTlAzIiwKKwkJTlVMTCwgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOLCA3LCAwLAorCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFEQzIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiQURDMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJBREMyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2FkYzJfbXV4KSwKKworCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTIEV4dGVybmFsIiwKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sIDcsIDAsCisJCW1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9taWNiaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBFeHRlcm5hbDIiLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwgNywgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzMiKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDMSBNVVgiLAorCQlNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCAwLCAwLAorCQkmZGVjMV9tdXgsIG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJERUMyIE1VWCIsCisJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDEsIDAsCisJCSZkZWMyX211eCwgbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzMgTVVYIiwKKwkJTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgMiwgMCwKKwkJJmRlYzNfbXV4LCBtc204eDE2X3djZF9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDNCBNVVgiLAorCQlNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCAzLCAwLAorCQkmZGVjNF9tdXgsIG1zbTh4MTZfd2NkX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWCgiUkRBQzIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmRhYzJfbXV4KSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzIiKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJMlMgVFgxIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkkyUyBUWDIiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAorCQkwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiSTJTIFRYMyIsICJBSUYxIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCisJCTAsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjIgVkkiLCAiVklmZWVkIiwgMCwgU05EX1NPQ19OT1BNLAorCQkwLCAwKSwKKwkvKiBEaWdpdGFsIE1pYyBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMxIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQltc204eDE2X3djZF9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQzMiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQzQiKSwKKworCS8qIFNpZGV0b25lICovCisJU05EX1NPQ19EQVBNX01VWCgiSUlSMSBJTlAxIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjFfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiSUlSMSIsIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1NEX0NUTCwgMCwgMCwgTlVMTCwgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfc2V0X2lpcl9nYWluLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJU05EX1NPQ19EQVBNX01VWCgiSUlSMiBJTlAxIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjJfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiSUlSMiIsIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1NEX0NUTCwgMSwgMCwgTlVMTCwgMCwKKwkJbXNtOHgxNl93Y2RfY29kZWNfc2V0X2lpcl9nYWluLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUlhfSTJTX0NMSyIsCisJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVEwsCTQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlRYX0kyU19DTEsiLAorCQlNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMLCA0LCAwLAorCQlOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNtOHgxNl93Y2RfcmVnX21hc2tfdmFsIG1zbTh4MTZfd2NkX3JlZ19kZWZhdWx0c1tdID0geworCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgwMyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVCwgMHg4MiksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9PQ1BfQ1RMLCAweEUxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNtOHgxNl93Y2RfcmVnX21hc2tfdmFsIG1zbTh4MTZfd2NkX3JlZ19kZWZhdWx0c18yXzBbXSA9IHsKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTUywgMHhBNSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDMsIDB4MEYpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9PUEFNUF9CSUFTLCAweDRGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRkJDVFJMLCAweDI4KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsIDB4NjkpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0RCRywgMHgwMSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLCAweDVGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TTE9QRV9DT01QX0lQX1pFUk8sIDB4ODgpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1MsIDB4QTUpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMsIDB4MEYpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4ODIpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgwMyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9PQ1BfQ1RMLCAweEUxKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVEwsIDB4ODApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtc204eDE2X3djZF9yZWdfbWFza192YWwgbXNtODkwOV93Y2RfcmVnX2RlZmF1bHRzW10gPSB7CisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MsIDB4QTUpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLCAweEE1KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfT1BBTVBfQklBUywgMHg0QyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHgyOCksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLCAweDY5KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9EQkcsIDB4MDEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1NVQlRZUEUsIDB4MEEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgwMyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9PQ1BfQ1RMLCAweEUxKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVEwsIDB4ODApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtc204eDE2X3djZF9yZWdfbWFza192YWwgY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tdID0geworCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTLCAweEE1KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywgMHhBNSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVMsIDB4NEMpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4ODIpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkwsIDB4QTgpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTCwgMHhBNCksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9BTkFfQklBU19TRVQsIDB4NDEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwgMHg2OSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHLCAweDAxKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX09DUF9DVEwsIDB4RTEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgwMyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfUEEsIDB4RkEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTCwgMHg4MCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zbTh4MTZfd2NkX3JlZ19tYXNrX3ZhbCBjYWpvbjJwMF93Y2RfcmVnX2RlZmF1bHRzW10gPSB7CisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MsIDB4QTUpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLCAweEE1KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfT1BBTVBfQklBUywgMHg0QyksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVCwgMHhBMiksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHhBOCksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX1ZDVFJMLCAweEE0KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0FOQV9CSUFTX1NFVCwgMHg0MSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLCAweDY5KSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9EQkcsIDB4MDEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwgMHhFMSksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EQUNfQ1RMLCAweDAzKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfU1RBVFVTLCAweDEwKSwKKwlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERSwgMHgxOCksCisJTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfUEEsIDB4RkEpLAorCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTCwgMHg4MCksCit9OworCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF91cGRhdGVfcmVnX2RlZmF1bHRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl1MzIgaSwgdmVyc2lvbjsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2QgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXZlcnNpb24gPSBnZXRfY29kZWNfdmVyc2lvbihtc204eDE2X3djZCk7CisJaWYgKHZlcnNpb24gPT0gVE9NQkFLXzFfMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc204eDE2X3djZF9yZWdfZGVmYXVsdHMpOyBpKyspCisJCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCQkJbXNtOHgxNl93Y2RfcmVnX2RlZmF1bHRzW2ldLnJlZywKKwkJCQltc204eDE2X3djZF9yZWdfZGVmYXVsdHNbaV0udmFsKTsKKwl9IGVsc2UgaWYgKHZlcnNpb24gPT0gVE9NQkFLXzJfMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc204eDE2X3djZF9yZWdfZGVmYXVsdHNfMl8wKTsgaSsrKQorCQkJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkJCW1zbTh4MTZfd2NkX3JlZ19kZWZhdWx0c18yXzBbaV0ucmVnLAorCQkJCW1zbTh4MTZfd2NkX3JlZ19kZWZhdWx0c18yXzBbaV0udmFsKTsKKwl9IGVsc2UgaWYgKHZlcnNpb24gPT0gQ09OR0EpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtODkwOV93Y2RfcmVnX2RlZmF1bHRzKTsgaSsrKQorCQkJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQkJCW1zbTg5MDlfd2NkX3JlZ19kZWZhdWx0c1tpXS5yZWcsCisJCQkJbXNtODkwOV93Y2RfcmVnX2RlZmF1bHRzW2ldLnZhbCk7CisJfSBlbHNlIGlmICh2ZXJzaW9uID09IENBSk9OKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNham9uX3djZF9yZWdfZGVmYXVsdHMpOyBpKyspCisJCQlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCQkJY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tpXS5yZWcsCisJCQkJY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tpXS52YWwpOworCX0gZWxzZSBpZiAodmVyc2lvbiA9PSBDQUpPTl8yXzAgfHwgdmVyc2lvbiA9PSBESUFOR1UpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2Fqb24ycDBfd2NkX3JlZ19kZWZhdWx0cyk7IGkrKykKKwkJCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJCQljYWpvbjJwMF93Y2RfcmVnX2RlZmF1bHRzW2ldLnJlZywKKwkJCQljYWpvbjJwMF93Y2RfcmVnX2RlZmF1bHRzW2ldLnZhbCk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zbTh4MTZfd2NkX3JlZ19tYXNrX3ZhbAorCW1zbTh4MTZfd2NkX2NvZGVjX3JlZ19pbml0X3ZhbFtdID0geworCisJLyogSW5pdGlhbGl6ZSBjdXJyZW50IHRocmVzaG9sZCB0byAzNTBNQQorCSAqIG51bWJlciBvZiB3YWl0IGFuZCBydW4gY3ljbGVzIHRvIDQwOTYKKwkgKi8KKwl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NUTCwgMHhGRiwgMHgxMn0sCisJe01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DT1VOVCwgMHhGRiwgMHhGRn0sCit9OworCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9jb2RlY19pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc204eDE2X3djZF9jb2RlY19yZWdfaW5pdF92YWwpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCSAgICBtc204eDE2X3djZF9jb2RlY19yZWdfaW5pdF92YWxbaV0ucmVnLAorCQkJICAgIG1zbTh4MTZfd2NkX2NvZGVjX3JlZ19pbml0X3ZhbFtpXS5tYXNrLAorCQkJICAgIG1zbTh4MTZfd2NkX2NvZGVjX3JlZ19pbml0X3ZhbFtpXS52YWwpOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2JyaW5ndXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTUywKKwkJMHhBNSk7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0LCAweDAxKTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywKKwkJMHhBNSk7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDQsIDB4MDEpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTUywKKwkJMHhBNSk7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0LCAweDAwKTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywKKwkJMHhBNSk7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDQsIDB4MDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqd2NkOHgxNl93Y2RfY29kZWNfZmluZF9yZWd1bGF0b3IoCisJCQkJY29uc3Qgc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2LAorCQkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtOHgxNi0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKKwkJaWYgKG1zbTh4MTYtPnN1cHBsaWVzW2ldLnN1cHBseSAmJgorCQkgICAgIXN0cmNtcChtc204eDE2LT5zdXBwbGllc1tpXS5zdXBwbHksIG5hbWUpKQorCQkJcmV0dXJuIG1zbTh4MTYtPnN1cHBsaWVzW2ldLmNvbnN1bWVyOworCX0KKworCWRldl9lcnIobXNtOHgxNi0+ZGV2LCAiRXJyb3I6IHJlZ3VsYXRvciBub3QgZm91bmQ6JXNcbiIKKwkJCQksIG5hbWUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2RldmljZV9kb3duKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkX3ByaXYgPQorCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7CisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGRldmljZSBkb3duIVxuIiwgX19mdW5jX18pOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOLCAweDMpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOLCAweDMpOworCWlmIChtc204eDE2X3djZF9wcml2LT5ib29zdF9vcHRpb24gPT0gQk9PU1RfT05fRk9SRVZFUikgeworCQlpZiAoKHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwpCisJCSYgMHg4MCkgPT0gMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX01DTEtfQ1RMLAkweDAxLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMLCAweDAzLCAweDAzKTsKKwkJCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTCwgMHgzMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVEwsIDB4ODAsIDB4ODApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19UT1BfQ0xLX0NUTCwKKwkJCQkweDBDLCAweDBDKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCisJCQkJMHg4NCwgMHg4NCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMLAorCQkJCTB4MTAsIDB4MTApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLAorCQkJCTB4MUYsIDB4MUYpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDLAorCQkJCTB4OTAsIDB4OTApOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKKwkJCQkweEZGLCAweEZGKTsKKwkJCXVzbGVlcF9yYW5nZSgyMCwgMjEpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLAorCQkJCTB4RkYsIDB4RkYpOworCQkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAorCQkJCTB4RTksIDB4RTkpOworCQl9CisJfQorCW1zbTh4MTZfd2NkX2Jvb3N0X29mZihjb2RlYyk7CisJbXNtOHgxNl93Y2RfcHJpdi0+aHBoX21vZGUgPSBOT1JNQUxfTU9ERTsKKwlmb3IgKGkgPSAwOyBpIDwgTVNNODlYWF9SWF9NQVg7IGkrKykKKwkJbXNtOHgxNl93Y2RfcHJpdi0+Y29tcF9lbmFibGVkW2ldID0gQ09NUEFOREVSX05PTkU7CisKKwkvKiA0MG1zIHRvIGFsbG93IGJvb3N0IHRvIGRpc2NoYXJnZSAqLworCW1zbGVlcCg0MCk7CisJLyogRGlzYWJsZSBQQSB0byBhdm9pZCBwb3AgZHVyaW5nIGNvZGVjIGJyaW5nIHVwICovCisJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sCisJCQkweDMwLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAorCQkJMHg4MCwgMHgwMCk7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwsIDB4MjApOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywKKwkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMLCAweDIwKTsKKwlzbmRfc29jX3dyaXRlX3dyYXBwZXIoY29kZWMsCisJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwgMHgxMik7CisJc25kX3NvY193cml0ZV93cmFwcGVyKGNvZGVjLAorCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHg5Myk7CisKKwltc204eDE2X3djZF9icmluZ3VwKGNvZGVjKTsKKwlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKKwlzZXRfYml0KEJVU19ET1dOLCAmbXNtOHgxNl93Y2RfcHJpdi0+c3RhdHVzX21hc2spOworCXNuZF9zb2NfY2FyZF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvZGVjLT5jb21wb25lbnQuY2FyZCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfZGV2aWNlX3VwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2RfcHJpdiA9CisJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGRldmljZSB1cCFcbiIsIF9fZnVuY19fKTsKKworCWNsZWFyX2JpdChCVVNfRE9XTiwgJm1zbTh4MTZfd2NkX3ByaXYtPnN0YXR1c19tYXNrKTsKKworCXNuZF9zb2NfY2FyZF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvZGVjLT5jb21wb25lbnQuY2FyZCwgMSk7CisJLyogZGVsYXkgaXMgcmVxdWlyZWQgdG8gbWFrZSBzdXJlIHNvdW5kIGNhcmQgc3RhdGUgdXBkYXRlZCAqLworCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKworCW1zbTh4MTZfd2NkX2NvZGVjX2luaXRfcmVnKGNvZGVjKTsKKwltc204eDE2X3djZF91cGRhdGVfcmVnX2RlZmF1bHRzKGNvZGVjKTsKKworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVCwKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfRU5fU0VUX19QT1IpOworCXNuZF9zb2Nfd3JpdGVfd3JhcHBlcihjb2RlYywgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUiwKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfRU5fQ0xSX19QT1IpOworCisJbXNtOHgxNl93Y2Rfc2V0X2Jvb3N0X3YoY29kZWMpOworCisJbXNtOHgxNl93Y2Rfc2V0X21pY2Jfdihjb2RlYyk7CisJaWYgKG1zbTh4MTZfd2NkX3ByaXYtPmJvb3N0X29wdGlvbiA9PSBCT09TVF9PTl9GT1JFVkVSKQorCQltc204eDE2X3djZF9ib29zdF9vbihjb2RlYyk7CisJZWxzZSBpZiAobXNtOHgxNl93Y2RfcHJpdi0+Ym9vc3Rfb3B0aW9uID09IEJZUEFTU19BTFdBWVMpCisJCW1zbTh4MTZfd2NkX2J5cGFzc19vbihjb2RlYyk7CisKKwltc204eDE2X3djZF9jb25maWd1cmVfY2FwKGNvZGVjLCBmYWxzZSwgZmFsc2UpOworCXdjZF9tYmhjX3N0b3AoJm1zbTh4MTZfd2NkX3ByaXYtPm1iaGMpOworCXdjZF9tYmhjX2RlaW5pdCgmbXNtOHgxNl93Y2RfcHJpdi0+bWJoYyk7CisJcmV0ID0gd2NkX21iaGNfaW5pdCgmbXNtOHgxNl93Y2RfcHJpdi0+bWJoYywgY29kZWMsICZtYmhjX2NiLCAmaW50cl9pZHMsCisJCQl3Y2RfbWJoY19yZWdpc3RlcnMsIHRydWUpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtYmhjIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwllbHNlCisJCXdjZF9tYmhjX3N0YXJ0KCZtc204eDE2X3djZF9wcml2LT5tYmhjLAorCQkJbXNtOHgxNl93Y2RfcHJpdi0+bWJoYy5tYmhjX2NmZyk7CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkc3Bfc3RhdGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkJCSAgICAgICB2b2lkICpwcml2KQoreworCWJvb2wgdGltZWRvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJaWYgKHZhbHVlID09IFNVQlNZU19CRUZPUkVfU0hVVERPV04pCisJCW1zbTh4MTZfd2NkX2RldmljZV9kb3duKHJlZ2lzdGVyZWRfY29kZWMpOworCWVsc2UgaWYgKHZhbHVlID09IFNVQlNZU19BRlRFUl9QT1dFUlVQKSB7CisKKwkJZGV2X2VycihyZWdpc3RlcmVkX2NvZGVjLT5kZXYsCisJCQkiQURTUCBpcyBhYm91dCB0byBwb3dlciB1cC4gYnJpbmcgdXAgY29kZWNcbiIpOworCisJCWlmICghcTZjb3JlX2lzX2Fkc3BfcmVhZHkoKSkgeworCQkJZGV2X2VycihyZWdpc3RlcmVkX2NvZGVjLT5kZXYsCisJCQkJIkFEU1AgaXNuJ3QgcmVhZHlcbiIpOworCQkJdGltZW91dCA9IGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMpOworCQkJd2hpbGUgKCEodGltZWRvdXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSkgeworCQkJCWlmICghcTZjb3JlX2lzX2Fkc3BfcmVhZHkoKSkgeworCQkJCQlkZXZfZXJyKHJlZ2lzdGVyZWRfY29kZWMtPmRldiwKKwkJCQkJCSJBRFNQIGlzbid0IHJlYWR5XG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZXZfZXJyKHJlZ2lzdGVyZWRfY29kZWMtPmRldiwKKwkJCQkJCSJBRFNQIGlzIHJlYWR5XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZGV2X2VycihyZWdpc3RlcmVkX2NvZGVjLT5kZXYsCisJCQkJIiVzOiBEU1AgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKKwkJfQorCisJCW1zbTh4MTZfd2NkX2RldmljZV91cChyZWdpc3RlcmVkX2NvZGVjKTsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhZHNwX3N0YXRlX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gYWRzcF9zdGF0ZV9jYWxsYmFjaywKKwkucHJpb3JpdHkgPSAtSU5UX01BWCwKK307CisKK2ludCBtc204eDE2X3djZF9oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkX3ByaXYgPQorCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJldHVybiB3Y2RfbWJoY19zdGFydCgmbXNtOHgxNl93Y2RfcHJpdi0+bWJoYywgbWJoY19jZmcpOworfQorRVhQT1JUX1NZTUJPTChtc204eDE2X3djZF9oc19kZXRlY3QpOworCit2b2lkIG1zbTh4MTZfd2NkX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiAqbXNtOHgxNl93Y2RfcHJpdiA9CisJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJd2NkX21iaGNfc3RvcCgmbXNtOHgxNl93Y2RfcHJpdi0+bWJoYyk7Cit9CitFWFBPUlRfU1lNQk9MKG1zbTh4MTZfd2NkX2hzX2RldGVjdF9leGl0KTsKKwordm9pZCBtc204eDE2X3VwZGF0ZV9pbnRfc3BrX2Jvb3N0KGJvb2wgZW5hYmxlKQoreworCXByX2VycigiJXM6IGVuYWJsZSA9ICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwlzcGtyX2Jvb3N0X2VuID0gZW5hYmxlOworfQorRVhQT1JUX1NZTUJPTChtc204eDE2X3VwZGF0ZV9pbnRfc3BrX2Jvb3N0KTsKKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2Rfc2V0X21pY2JfdihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisKKwlzdHJ1Y3QgbXNtOHgxNl93Y2QgKm1zbTh4MTYgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCXN0cnVjdCBtc204eDE2X3djZF9wZGF0YSAqcGRhdGEgPSBtc204eDE2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJdTggcmVnX3ZhbDsKKworCXJlZ192YWwgPSBWT0xUQUdFX0NPTlZFUlRFUihwZGF0YS0+bWljYmlhcy5jZmlsdDFfbXYsIE1JQ0JJQVNfTUlOX1ZBTCwKKwkJCU1JQ0JJQVNfU1RFUF9TSVpFKTsKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJjZmlsdDFfbXYgJWQgcmVnX3ZhbCAleFxuIiwKKwkJCSh1MzIpcGRhdGEtPm1pY2JpYXMuY2ZpbHQxX212LCByZWdfdmFsKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX1ZBTCwKKwkJCTB4RjgsIChyZWdfdmFsIDw8IDMpKTsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxNl93Y2Rfc2V0X2Jvb3N0X3Yoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc204eDE2X3djZF9wcml2ICptc204eDE2X3djZF9wcml2ID0KKwkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19PVVRQVVRfVk9MVEFHRSwKKwkJCTB4MUYsIG1zbTh4MTZfd2NkX3ByaXYtPmJvb3N0X3ZvbHRhZ2UpOworfQorCitzdGF0aWMgdm9pZCBtc204eDE2X3djZF9jb25maWd1cmVfY2FwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJYm9vbCBtaWNiaWFzMSwgYm9vbCBtaWNiaWFzMikKK3sKKworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7CisKKwlwcl9lcnIoIlxuICVzOiBtaWNiaWFzMSAleCBtaWNiaWFzMiA9ICVkXG4iLCBfX2Z1bmNfXywgbWljYmlhczEsCisJCQltaWNiaWFzMik7CisJaWYgKG1pY2JpYXMxICYmIG1pY2JpYXMyKSB7CisJCWlmICgocGRhdGEtPm1pY2JpYXMxX2NhcF9tb2RlCisJCSAgICAgPT0gTUlDQklBU19FWFRfQllQX0NBUCkgfHwKKwkJICAgIChwZGF0YS0+bWljYmlhczJfY2FwX21vZGUKKwkJICAgICA9PSBNSUNCSUFTX0VYVF9CWVBfQ0FQKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwKKwkJCQkweDQwLCAoTUlDQklBU19FWFRfQllQX0NBUCA8PCA2KSk7CisJCWVsc2UKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHNfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwKKwkJCQkweDQwLCAoTUlDQklBU19OT19FWFRfQllQX0NBUCA8PCA2KSk7CisJfSBlbHNlIGlmIChtaWNiaWFzMikgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sCisJCQkJMHg0MCwgKHBkYXRhLT5taWNiaWFzMl9jYXBfbW9kZSA8PCA2KSk7CisJfSBlbHNlIGlmIChtaWNiaWFzMSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzX3dyYXBwZXIoY29kZWMsCisJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sCisJCQkJMHg0MCwgKHBkYXRhLT5taWNiaWFzMV9jYXBfbW9kZSA8PCA2KSk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0c193cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOLAorCQkJCTB4NDAsIDB4MDApOworCX0KK30KKworc3RhdGljIGludCBtc204OXh4X2RpZ2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZWdpc3RlcmVkX2RpZ2NvZGVjID0gY29kZWM7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1zbTg5eHhfZGlnY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204eDE2X3djZF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkX3ByaXY7CisJaW50IGksIHJldDsKKworCWRldl9lcnIoY29kZWMtPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCW1zbTh4MTZfd2NkX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtOHgxNl93Y2RfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghbXNtOHgxNl93Y2RfcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RFQ0lNQVRPUlM7IGkrKykgeworCQl0eF9ocGZfd29ya1tpXS5tc204eDE2X3djZCA9IG1zbTh4MTZfd2NkX3ByaXY7CisJCXR4X2hwZl93b3JrW2ldLmRlY2ltYXRvciA9IGkgKyAxOworCQlJTklUX0RFTEFZRURfV09SSygmdHhfaHBmX3dvcmtbaV0uZHdvcmssCisJCQl0eF9ocGZfY29ybmVyX2ZyZXFfY2FsbGJhY2spOworCX0KKworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CisJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgbXNtOHgxNl93Y2RfcHJpdik7CisJbXNtOHgxNl93Y2RfcHJpdi0+Y29kZWMgPSBjb2RlYzsKKworCW1zbTh4MTZfd2NkX3ByaXYtPnNwa2Rydl9yZWcgPQorCQl3Y2Q4eDE2X3djZF9jb2RlY19maW5kX3JlZ3VsYXRvcihjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQlNU004OVhYX1ZERF9TUEtEUlZfTkFNRSk7CisJbXNtOHgxNl93Y2RfcHJpdi0+cG1pY19yZXYgPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjEpOworCW1zbTh4MTZfd2NkX3ByaXYtPmNvZGVjX3ZlcnNpb24gPSBzbmRfc29jX3JlYWRfd3JhcHBlcihjb2RlYywKKwkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9TVUJUWVBFKTsKKwlpZiAobXNtOHgxNl93Y2RfcHJpdi0+Y29kZWNfdmVyc2lvbiA9PSBDT05HQSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyA6Q29uZ2EgUkVWOiAlZFxuIiwgX19mdW5jX18sCisJCQkJbXNtOHgxNl93Y2RfcHJpdi0+Y29kZWNfdmVyc2lvbik7CisJCW1zbTh4MTZfd2NkX3ByaXYtPmV4dF9zcGtfYm9vc3Rfc2V0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyA6UE1JQyBSRVY6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJbXNtOHgxNl93Y2RfcHJpdi0+cG1pY19yZXYpOworCQlpZiAobXNtOHgxNl93Y2RfcHJpdi0+cG1pY19yZXYgPT0gVE9NQkFLXzFfMCAmJgorCQkJbXNtOHgxNl93Y2RfcHJpdi0+Y29kZWNfdmVyc2lvbiA9PSBDQUpPTl8yXzApIHsKKwkJCW1zbTh4MTZfd2NkX3ByaXYtPmNvZGVjX3ZlcnNpb24gPSBESUFOR1U7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyA6IERpYW5ndSBkZXRlY3RlZFxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJfSBlbHNlIGlmIChtc204eDE2X3djZF9wcml2LT5wbWljX3JldiA9PSBUT01CQUtfMV8wICYmCisJCQkoc25kX3NvY19yZWFkX3dyYXBwZXIoY29kZWMsCisJCQkJIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCkKKwkJCSAmIDB4ODApKSB7CisJCQltc204eDE2X3djZF9wcml2LT5jb2RlY192ZXJzaW9uID0gQ0FKT047CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyA6IENham9uIGRldGVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSBpZiAobXNtOHgxNl93Y2RfcHJpdi0+cG1pY19yZXYgPT0gVE9NQkFLXzJfMCAmJgorCQkJKHNuZF9zb2NfcmVhZF93cmFwcGVyKGNvZGVjLAorCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCkKKwkJCSAmIDB4ODApKSB7CisJCQltc204eDE2X3djZF9wcml2LT5jb2RlY192ZXJzaW9uID0gQ0FKT05fMl8wOworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgOiBDYWpvbiAyLjAgZGV0ZWN0ZWRcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCX0KKwl9CisJLyoKKwkgKiBzZXQgdG8gZGVmYXVsdCBib29zdCBvcHRpb24gQk9PU1RfU1dJVENILCB1c2VyIG1peGVyIHBhdGggY2FuIGNoYW5nZQorCSAqIGl0IHRvIEJPT1NUX0FMV0FZUyBvciBCT09TVF9CWVBBU1MgYmFzZWQgb24gc29sdXRpb24gY2hvc2VuLgorCSAqLworCW1zbTh4MTZfd2NkX3ByaXYtPmJvb3N0X29wdGlvbiA9IEJPT1NUX1NXSVRDSDsKKwltc204eDE2X3djZF9wcml2LT5ocGhfbW9kZSA9IE5PUk1BTF9NT0RFOworCisJZm9yIChpID0gMDsgaSA8IE1TTTg5WFhfUlhfTUFYOyBpKyspCisJCW1zbTh4MTZfd2NkX3ByaXYtPmNvbXBfZW5hYmxlZFtpXSA9IENPTVBBTkRFUl9OT05FOworCisJbXNtOHgxNl93Y2RfZHRfcGFyc2VfYm9vc3RfaW5mbyhjb2RlYyk7CisJbXNtOHgxNl93Y2Rfc2V0X2Jvb3N0X3YoY29kZWMpOworCisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHMsCisJCQkJICAgQVJSQVlfU0laRShpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzKSk7CisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGhwaF90eXBlX2RldGVjdF9jb250cm9scywKKwkJCQkgIEFSUkFZX1NJWkUoaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzKSk7CisKKwltc204eDE2X3djZF9icmluZ3VwKGNvZGVjKTsKKwltc204eDE2X3djZF9jb2RlY19pbml0X3JlZyhjb2RlYyk7CisJbXNtOHgxNl93Y2RfdXBkYXRlX3JlZ19kZWZhdWx0cyhjb2RlYyk7CisKKwl3Y2Q5eHh4X3NwbWlfc2V0X2NvZGVjKGNvZGVjKTsKKworCW1zbTh4MTZfd2NkX3ByaXYtPm9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9NSUNCSUFTXS5zdXBwbHkgPQorCQkJCXdjZDh4MTZfd2NkX2NvZGVjX2ZpbmRfcmVndWxhdG9yKAorCQkJCWNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW09OX0RFTUFORF9NSUNCSUFTXSk7CisJYXRvbWljX3NldCgmbXNtOHgxNl93Y2RfcHJpdi0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdLnJlZiwgMCk7CisKKwlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJm1zbTh4MTZfd2NkX3ByaXYtPm5vdGlmaWVyKTsKKworCW1zbTh4MTZfd2NkX3ByaXYtPmZ3X2RhdGEgPSBremFsbG9jKHNpemVvZigqKG1zbTh4MTZfd2NkX3ByaXYtPmZ3X2RhdGEpKQorCQkJLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbTh4MTZfd2NkX3ByaXYtPmZ3X2RhdGEpIHsKKwkJa2ZyZWUobXNtOHgxNl93Y2RfcHJpdik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNldF9iaXQoV0NEOVhYWF9NQkhDX0NBTCwgbXNtOHgxNl93Y2RfcHJpdi0+ZndfZGF0YS0+Y2FsX2JpdCk7CisJcmV0ID0gd2NkX2NhbF9jcmVhdGVfaHdkZXAobXNtOHgxNl93Y2RfcHJpdi0+ZndfZGF0YSwKKwkJCVdDRDlYWFhfQ09ERUNfSFdERVBfTk9ERSwgY29kZWMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIGh3ZGVwIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWtmcmVlKG1zbTh4MTZfd2NkX3ByaXYtPmZ3X2RhdGEpOworCQlrZnJlZShtc204eDE2X3djZF9wcml2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3Y2RfbWJoY19pbml0KCZtc204eDE2X3djZF9wcml2LT5tYmhjLCBjb2RlYywgJm1iaGNfY2IsICZpbnRyX2lkcywKKwkJICAgICAgd2NkX21iaGNfcmVnaXN0ZXJzLCB0cnVlKTsKKworCW1zbTh4MTZfd2NkX3ByaXYtPmludF9tY2xrMF9lbmFibGVkID0gZmFsc2U7CisJbXNtOHgxNl93Y2RfcHJpdi0+Y2xvY2tfYWN0aXZlID0gZmFsc2U7CisJbXNtOHgxNl93Y2RfcHJpdi0+Y29uZmlnX21vZGVfYWN0aXZlID0gZmFsc2U7CisKKwkvKlVwZGF0ZSBzcGVha2VyIGJvb3N0IGNvbmZpZ3VyYXRpb24qLworCW1zbTh4MTZfd2NkX3ByaXYtPnNwa19ib29zdF9zZXQgPSBzcGtyX2Jvb3N0X2VuOworCXByX2VycigiJXM6IHNwZWFrZXIgYm9vc3QgY29uZmlndXJlZCA9ICVkXG4iLAorCQkJX19mdW5jX18sIG1zbTh4MTZfd2NkX3ByaXYtPnNwa19ib29zdF9zZXQpOworCisJLyogU2V0IGluaXRpYWwgTUlDQklBUyB2b2x0YWdlIGxldmVsICovCisJbXNtOHgxNl93Y2Rfc2V0X21pY2Jfdihjb2RlYyk7CisKKwkvKiBTZXQgaW5pdGlhbCBjYXAgbW9kZSAqLworCW1zbTh4MTZfd2NkX2NvbmZpZ3VyZV9jYXAoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisJcmVnaXN0ZXJlZF9jb2RlYyA9IGNvZGVjOworCWFkc3Bfc3RhdGVfbm90aWZpZXIgPQorCSAgICBzdWJzeXNfbm90aWZfcmVnaXN0ZXJfbm90aWZpZXIoImFkc3AiLAorCQkJCQkgICAmYWRzcF9zdGF0ZV9ub3RpZmllcl9ibG9jayk7CisJaWYgKCFhZHNwX3N0YXRlX25vdGlmaWVyKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBhZHNwIHN0YXRlIG5vdGlmaWVyXG4iKTsKKwkJa2ZyZWUobXNtOHgxNl93Y2RfcHJpdi0+ZndfZGF0YSk7CisJCWtmcmVlKG1zbTh4MTZfd2NkX3ByaXYpOworCQlyZWdpc3RlcmVkX2NvZGVjID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2NvZGVjX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkX3ByaXYgKm1zbTh4MTZfd2NkX3ByaXYgPQorCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2QgKm1zbTh4MTZfd2NkOworCisJbXNtOHgxNl93Y2QgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCW1zbTh4MTZfd2NkX3ByaXYtPnNwa2Rydl9yZWcgPSBOVUxMOworCW1zbTh4MTZfd2NkX3ByaXYtPm9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9NSUNCSUFTXS5zdXBwbHkgPSBOVUxMOworCWF0b21pY19zZXQoJm1zbTh4MTZfd2NkX3ByaXYtPm9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9NSUNCSUFTXS5yZWYsIDApOworCWtmcmVlKG1zbTh4MTZfd2NkX3ByaXYtPmZ3X2RhdGEpOworCWtmcmVlKG1zbTh4MTZfd2NkX3ByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxNl93Y2RfZW5hYmxlX3N0YXRpY19zdXBwbGllc190b19vcHRpbXVtKAorCQkJCXN0cnVjdCBtc204eDE2X3djZCAqbXNtOHgxNiwKKwkJCQlzdHJ1Y3QgbXNtOHgxNl93Y2RfcGRhdGEgKnBkYXRhKQoreworCWludCBpOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG1zbTh4MTYtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7CisJCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kKQorCQkJY29udGludWU7CisJCWlmIChyZWd1bGF0b3JfY291bnRfdm9sdGFnZXMobXNtOHgxNi0+c3VwcGxpZXNbaV0uY29uc3VtZXIpIDw9CisJCQkwKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKG1zbTh4MTYtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLAorCQkJcGRhdGEtPnJlZ3VsYXRvcltpXS5taW5fdXYsCisJCQlwZGF0YS0+cmVndWxhdG9yW2ldLm1heF91dik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIobXNtOHgxNi0+ZGV2LAorCQkJCSJTZXR0aW5nIHZvbHQgZmFpbGVkIGZvciByZWd1bGF0b3IgJXMgZXJyICVkXG4iLAorCQkJCW1zbTh4MTYtPnN1cHBsaWVzW2ldLnN1cHBseSwgcmV0KTsKKwkJfQorCisJCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZChtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ub3B0aW11bV91YSk7CisJCWRldl9lcnIobXNtOHgxNi0+ZGV2LCAiUmVndWxhdG9yICVzIHNldCBvcHRpbXVtIG1vZGVcbiIsCisJCQkgbXNtOHgxNi0+c3VwcGxpZXNbaV0uc3VwcGx5KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2Rpc2FibGVfc3RhdGljX3N1cHBsaWVzX3RvX29wdGltdW0oCisJCQlzdHJ1Y3QgbXNtOHgxNl93Y2QgKm1zbTh4MTYsCisJCQlzdHJ1Y3QgbXNtOHgxNl93Y2RfcGRhdGEgKnBkYXRhKQoreworCWludCBpOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG1zbTh4MTYtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7CisJCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kKQorCQkJY29udGludWU7CisJCWlmIChyZWd1bGF0b3JfY291bnRfdm9sdGFnZXMobXNtOHgxNi0+c3VwcGxpZXNbaV0uY29uc3VtZXIpIDw9CisJCQkwKQorCQkJY29udGludWU7CisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lciwgMCwKKwkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWF4X3V2KTsKKwkJcmVndWxhdG9yX3NldF9sb2FkKG1zbTh4MTYtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLCAwKTsKKwkJZGV2X2Vycihtc204eDE2LT5kZXYsICJSZWd1bGF0b3IgJXMgc2V0IG9wdGltdW0gbW9kZVxuIiwKKwkJCQkgbXNtOHgxNi0+c3VwcGxpZXNbaV0uc3VwcGx5KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXNtOHgxNl93Y2Rfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCXN0cnVjdCBtc204eDE2X3djZCAqbXNtOHgxNiA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJc3RydWN0IG1zbTh4MTZfd2NkX3BkYXRhICptc204eDE2X3BkYXRhID0gbXNtOHgxNi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKKwlwcl9lcnIoIiVzOiBtY2xrIGNudCA9ICVkLCBtY2xrX2VuYWJsZWQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSwKKwkJCWF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQpKTsKKwlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkgPT0gdHJ1ZSkgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoCisJCQkJJnBkYXRhLT5kaXNhYmxlX2ludF9tY2xrMF93b3JrKTsKKwkJbXV0ZXhfbG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuZW5hYmxlID0gMDsKKwkJYWZlX3NldF9scGFzc19jbG9ja192MihBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCisJCQkJICAgICAgICZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOworCQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKKwkJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7CisJfQorCW1zbTh4MTZfd2NkX2Rpc2FibGVfc3RhdGljX3N1cHBsaWVzX3RvX29wdGltdW0obXNtOHgxNiwgbXNtOHgxNl9wZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtc204eDE2X3djZF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2QgKm1zbTh4MTYgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCXN0cnVjdCBtc204eDE2X3djZF9wZGF0YSAqbXNtOHgxNl9wZGF0YSA9IG1zbTh4MTYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7CisJbXNtOHgxNl93Y2RfZW5hYmxlX3N0YXRpY19zdXBwbGllc190b19vcHRpbXVtKG1zbTh4MTYsIG1zbTh4MTZfcGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ21hcCAqbXNtODl4eF9wbWljX2NkY19yZWdtYXA7CitzdGF0aWMgc3RydWN0IHJlZ21hcCAqbXNtODl4eF9wbWljX2NkY19nZXRfcmVnbWFwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbXNtODl4eF9wbWljX2NkY19yZWdtYXA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9tc204eDE2X3djZCA9IHsKKwkucHJvYmUJPSBtc204eDE2X3djZF9jb2RlY19wcm9iZSwKKwkucmVtb3ZlCT0gbXNtOHgxNl93Y2RfY29kZWNfcmVtb3ZlLAorCisJLnN1c3BlbmQgPSBtc204eDE2X3djZF9zdXNwZW5kLAorCS5yZXN1bWUgPSBtc204eDE2X3djZF9yZXN1bWUsCisKKwkuY29udHJvbHMgPSBtc204eDE2X3djZF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobXNtOHgxNl93Y2Rfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gbXNtOHgxNl93Y2RfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtc204eDE2X3djZF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCS5nZXRfcmVnbWFwID0gbXNtODl4eF9wbWljX2NkY19nZXRfcmVnbWFwLAorfTsKKworc3RhdGljIGludCBtc204eDE2X3djZF9pbml0X3N1cHBsaWVzKHN0cnVjdCBtc204eDE2X3djZCAqbXNtOHgxNiwKKwkJCQlzdHJ1Y3QgbXNtOHgxNl93Y2RfcGRhdGEgKnBkYXRhKQoreworCWludCByZXQ7CisJaW50IGk7CisKKwltc204eDE2LT5zdXBwbGllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSAqCisJCQkJICAgQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbTh4MTYtPnN1cHBsaWVzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCW1zbTh4MTYtPm51bV9vZl9zdXBwbGllcyA9IDA7CisKKwlpZiAoQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSA+IE1BWF9SRUdVTEFUT1IpIHsKKwkJZGV2X2Vycihtc204eDE2LT5kZXYsICIlczogQXJyYXkgU2l6ZSBvdXQgb2YgYm91bmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5yZWd1bGF0b3IpOyBpKyspIHsKKwkJaWYgKHBkYXRhLT5yZWd1bGF0b3JbaV0ubmFtZSkgeworCQkJbXNtOHgxNi0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gcGRhdGEtPnJlZ3VsYXRvcltpXS5uYW1lOworCQkJbXNtOHgxNi0+bnVtX29mX3N1cHBsaWVzKys7CisJCX0KKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQobXNtOHgxNi0+ZGV2LCBtc204eDE2LT5udW1fb2Zfc3VwcGxpZXMsCisJCQkJIG1zbTh4MTYtPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihtc204eDE2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBsaWVzOiBlcnIgPSAlZFxuIiwKKwkJCQkJCQlyZXQpOworCQlnb3RvIGVycl9zdXBwbGllczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtOHgxNi0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKKwkJaWYgKHJlZ3VsYXRvcl9jb3VudF92b2x0YWdlcyhtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lcikgPD0KKwkJCTApCisJCQljb250aW51ZTsKKworCQlyZXQgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UobXNtOHgxNi0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCisJCQlwZGF0YS0+cmVndWxhdG9yW2ldLm1pbl91diwKKwkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWF4X3V2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtc204eDE2LT5kZXYsICJTZXR0aW5nIHJlZ3VsYXRvciB2b2x0YWdlIGZhaWxlZCBmb3IgcmVndWxhdG9yICVzIGVyciA9ICVkXG4iLAorCQkJCW1zbTh4MTYtPnN1cHBsaWVzW2ldLnN1cHBseSwgcmV0KTsKKwkJCWdvdG8gZXJyX2dldDsKKwkJfQorCisJCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZChtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ub3B0aW11bV91YSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKG1zbTh4MTYtPmRldiwgIlNldHRpbmcgcmVndWxhdG9yIG9wdGltdW0gbW9kZSBmYWlsZWQgZm9yIHJlZ3VsYXRvciAlcyBlcnIgPSAlZFxuIiwKKwkJCQltc204eDE2LT5zdXBwbGllc1tpXS5zdXBwbHksIHJldCk7CisJCQlnb3RvIGVycl9nZXQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKKworZXJyX2dldDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKG1zbTh4MTYtPm51bV9vZl9zdXBwbGllcywgbXNtOHgxNi0+c3VwcGxpZXMpOworZXJyX3N1cHBsaWVzOgorCWtmcmVlKG1zbTh4MTYtPnN1cHBsaWVzKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTh4MTZfd2NkX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMoc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2LAorCQkJCQkgIHN0cnVjdCBtc204eDE2X3djZF9wZGF0YSAqcGRhdGEpCit7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtOHgxNi0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKKwkJaWYgKHBkYXRhLT5yZWd1bGF0b3JbaV0ub25kZW1hbmQpCisJCQljb250aW51ZTsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lcik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIobXNtOHgxNi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwKKwkJCSAgICAgICBtc204eDE2LT5zdXBwbGllc1tpXS5zdXBwbHkpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2X2Vycihtc204eDE2LT5kZXYsICJFbmFibGVkIHJlZ3VsYXRvciAlc1xuIiwKKwkJCQkgbXNtOHgxNi0+c3VwcGxpZXNbaV0uc3VwcGx5KTsKKwl9CisKKwl3aGlsZSAocmV0ICYmIC0taSkKKwkJaWYgKCFwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kKQorCQkJcmVndWxhdG9yX2Rpc2FibGUobXNtOHgxNi0+c3VwcGxpZXNbaV0uY29uc3VtZXIpOworCisJcmV0dXJuIHJldDsKK30KKworCisKK3N0YXRpYyB2b2lkIG1zbTh4MTZfd2NkX2Rpc2FibGVfc3VwcGxpZXMoc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2LAorCQkJCSAgICAgc3RydWN0IG1zbTh4MTZfd2NkX3BkYXRhICpwZGF0YSkKK3sKKwlpbnQgaTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUobXNtOHgxNi0+bnVtX29mX3N1cHBsaWVzLAorCQkJCSAgICBtc204eDE2LT5zdXBwbGllcyk7CisJZm9yIChpID0gMDsgaSA8IG1zbTh4MTYtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7CisJCWlmIChyZWd1bGF0b3JfY291bnRfdm9sdGFnZXMobXNtOHgxNi0+c3VwcGxpZXNbaV0uY29uc3VtZXIpIDw9CisJCQkwKQorCQkJY29udGludWU7CisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShtc204eDE2LT5zdXBwbGllc1tpXS5jb25zdW1lciwgMCwKKwkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWF4X3V2KTsKKwkJcmVndWxhdG9yX3NldF9sb2FkKG1zbTh4MTYtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLCAwKTsKKwl9CisJcmVndWxhdG9yX2J1bGtfZnJlZShtc204eDE2LT5udW1fb2Zfc3VwcGxpZXMsIG1zbTh4MTYtPnN1cHBsaWVzKTsKKwlrZnJlZShtc204eDE2LT5zdXBwbGllcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9jb2RlY19kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJtc20tY29kZWMtcngiLAorCQkucGxheWJhY2sgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLworCQkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJfSwKKwl9LAorCXsKKwkJLm5hbWUgPSAibXNtLWNvZGVjLXR4IiwKKwkJLmNhcHR1cmUgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLworCQkJLnN0cmVhbV9uYW1lID0gIlJlY29yZCIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICptc204OXh4X2NvZGVjX3JlZ21hcDsKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICptc204OXh4X2NvZGVjX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBtc204OXh4X2NvZGVjX3JlZ21hcDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfbXNtODl4eF9jb2RlYyA9IHsKKwkucHJvYmUJPSBtc204OXh4X2RpZ2NvZGVjX3Byb2JlLAorCS5yZW1vdmUJPSBtc204OXh4X2RpZ2NvZGVjX3JlbW92ZSwKKwkuZ2V0X3JlZ21hcCA9IG1zbTg5eHhfY29kZWNfZ2V0X3JlZ21hcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbTg5eHhfY29kZWNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWNvZGVjLWNvcmUiLAorCSAgLmRhdGEgPSAibXNtX2NvZGVjIn0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtaWMtY29kZWMtZGlnaXRhbCIsCisJICAuZGF0YSA9ICJwbWljLWRpZ2l0YWwtY29kZWMifSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG1pYy1jb2RlYy1hbmFsb2ciLAorCSAgLmRhdGEgPSAicG1pYy1hbmFsb2ctY29kZWMifSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc204OXh4X2NvZGVjX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBtc204eDE2X3djZCAqdGVtcF84OXh4Oworc3RhdGljIGludCBtc204OXh4X2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2ID0gTlVMTDsKKwlzdHJ1Y3QgbXNtOHgxNl93Y2RfcGRhdGEgKnBkYXRhOworCWludCBhZHNwX3N0YXRlOworCXN0YXRpYyBpbnQgZGV2X3JlZ2lzdGVyZWRfY250OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCWNvbnN0IGNoYXIgKmFkZHJfcHJvcF9uYW1lID0gInFjb20sZGlnLWNkYy1iYXNlLWFkZHIiOworCXUzMiBkaWdfY2RjX2FkZHI7CisJY2hhciBfX2lvbWVtICpkaWdfYmFzZTsKKworCWFkc3Bfc3RhdGUgPSBhcHJfZ2V0X3N1YnN5c19zdGF0ZSgpOworCWlmIChhZHNwX3N0YXRlICE9IEFQUl9TVUJTWVNfTE9BREVEKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkFkc3AgaXMgbm90IGxvYWRlZCB5ZXQgJWRcbiIsCisJCQkJYWRzcF9zdGF0ZSk7CisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCX0KKworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtc204OXh4X2NvZGVjX29mX21hdGNoLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoJWQpOiVzXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIChjaGFyICopbWF0Y2gtPmRhdGEpOworCisJaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJwbWljLWRpZ2l0YWwtY29kZWMiKSkgeworCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgdHJ1ZSk7CisKKwkJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCisJCQkJX19mdW5jX18pOworCQkJcGRhdGEgPSBtc204eDE2X3djZF9wb3B1bGF0ZV9kdF9wZGF0YSgmcGRldi0+ZGV2KTsKKwkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZyb20gYm9hcmQgZmlsZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQl9CisJCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZhaWxlZCB0byBwb3B1bGF0ZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIHJ0bjsKKwkJfQorCQltc204eDE2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbTh4MTZfd2NkKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChtc204eDE2ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIHJ0bjsKKwkJfQorCisJCW1zbTh4MTYtPmRldiA9ICZwZGV2LT5kZXY7CisJCXJldCA9IG1zbTh4MTZfd2NkX2luaXRfc3VwcGxpZXMobXNtOHgxNiwgcGRhdGEpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbCB0byBlbmFibGUgQ29kZWMgc3VwcGxpZXNcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnJfY29kZWM7CisJCX0KKworCQlyZXQgPSBtc204eDE2X3djZF9lbmFibGVfc3RhdGljX3N1cHBsaWVzKG1zbTh4MTYsIHBkYXRhKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogRmFpbCB0byBlbmFibGUgQ29kZWMgcHJlLXJlc2V0IHN1cHBsaWVzXG4iLAorCQkJCSAgIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2NvZGVjOworCQl9CisJCXVzbGVlcF9yYW5nZSg1LCA2KTsKKworCQltdXRleF9pbml0KCZtc204eDE2LT5pb19sb2NrKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG1zbTh4MTYpOworCQl0ZW1wXzg5eHggPSBtc204eDE2OworCQlkZXZfcmVnaXN0ZXJlZF9jbnQrKzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJwbWljLWFuYWxvZy1jb2RlYyIpKSB7CisJCWlmICh3Y2Q5eHh4X3NwbWlfaXJxX2luaXQoKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogaXJxIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogaXJxIGluaXRpYWxpemF0aW9uIHBhc3NlZFxuIiwgX19mdW5jX18pOworCQl9CisJCWRldl9yZWdpc3RlcmVkX2NudCsrOworCX0gZWxzZSBpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgIm1zbS1jb2RlYyIpKSB7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBhZGRyX3Byb3BfbmFtZSwKKwkJCQkJCQkmZGlnX2NkY19hZGRyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNvdWxkIG5vdCBmaW5kICVzIGVudHJ5IGluIGR0XG4iLAorCQkJCQlfX2Z1bmNfXywgYWRkcl9wcm9wX25hbWUpOworCQkJZGlnX2NkY19hZGRyID0gTVNNODlYWF9ESUdJVEFMX0NPREVDX0JBU0VfQUREUjsKKwkJfQorCQlkaWdfYmFzZSA9IGlvcmVtYXAoZGlnX2NkY19hZGRyLAorCQkJCSBNU004OVhYX0RJR0lUQUxfQ09ERUNfUkVHX1NJWkUpOworCQlpZiAoZGlnX2Jhc2UgPT0gTlVMTCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1zbTg5eHhfY29kZWNfcmVnbWFwID0KKwkJCWRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwgTlVMTCwKKwkJCQlkaWdfYmFzZSwgJm1zbTg5eHhfY2RjX2NvcmVfcmVnbWFwX2NvbmZpZyk7CisJCXNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldiwgJnNvY19tc204OXh4X2NvZGVjLAorCQkJCW1zbV9jb2RlY19kYWlzLCBBUlJBWV9TSVpFKG1zbV9jb2RlY19kYWlzKSk7CisJCWRldl9yZWdpc3RlcmVkX2NudCsrOworCX0KKworCWlmICgoZGV2X3JlZ2lzdGVyZWRfY250ID09IE1BWF9NU004OVhYX0RFVklDRSkgJiYgKCFyZXQpKSB7CisJCW1zbTg5eHhfcG1pY19jZGNfcmVnbWFwID0KKwkJCWRldm1fcmVnbWFwX2luaXRfc3BtaV9leHQoCisJCQkJKHN0cnVjdCBzcG1pX2RldmljZSAqKSAmcGRldi0+ZGV2LnBhcmVudCwKKwkJCQkmbXNtODl4eF9wbWljX2NkY19yZWdtYXBfY29uZmlnKTsKKwkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyh0ZW1wXzg5eHgtPmRldiwKKwkJCQkmc29jX2NvZGVjX2Rldl9tc204eDE2X3djZCwKKwkJCQltc204eDE2X3djZF9pMnNfZGFpLAorCQkJCUFSUkFZX1NJWkUobXNtOHgxNl93Y2RfaTJzX2RhaSkpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6c25kX3NvY19yZWdpc3Rlcl9jb2RlYyBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnJfc3VwcGxpZXM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK2Vycl9zdXBwbGllczoKKwltc204eDE2X3djZF9kaXNhYmxlX3N1cHBsaWVzKG1zbTh4MTYsIHBkYXRhKTsKK2Vycl9jb2RlYzoKKwlrZnJlZShtc204eDE2KTsKK3J0bjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTg5eHhfY29kZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbTh4MTZfd2NkICptc204eDE2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJbXV0ZXhfZGVzdHJveSgmbXNtOHgxNi0+aW9fbG9jayk7CisJa2ZyZWUobXNtOHgxNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NvZGVjX2RyaXZlciA9IHsKKwkuZHJpdmVyICAgICAgICAgICAgICAgICA9IHsKKwkJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJCS5uYW1lICAgICAgICAgICA9IERSVl9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXNtODl4eF9jb2RlY19vZl9tYXRjaCkKKwl9LAorCS5wcm9iZSAgICAgICAgICAgICAgICAgID0gbXNtODl4eF9jb2RlY19wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgICAgICAgICA9IG1zbTg5eHhfY29kZWNfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXNtX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiTVNNODl4eCBBdWRpbyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2LXdjZC5oIGIvc291bmQvc29jL2NvZGVjcy9tc204eDE2L21zbTh4MTYtd2NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlYmFiMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2LXdjZC5oCkBAIC0wLDAgKzEsMzE1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBNU004WDE2X1dDRF9ICisjZGVmaW5lIE1TTThYMTZfV0NEX0gKKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgIi4uL3djZC1tYmhjLXYyLmgiCisjaW5jbHVkZSAiLi4vd2NkY2FsLWh3ZGVwLmgiCisjaW5jbHVkZSAibXNtOHgxNl93Y2RfcmVnaXN0ZXJzLmgiCisKKyNkZWZpbmUgTUlDQklBU19FWFRfQllQX0NBUCAweDAwCisjZGVmaW5lIE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVAgMHgwMQorCisjZGVmaW5lIE1TTTg5WFhfTlVNX0lSUV9SRUdTCTIKKyNkZWZpbmUgTUFYX1JFR1VMQVRPUgkJCQk3CisjZGVmaW5lIE1TTTg5WFhfUkVHX1ZBTChyZWcsIHZhbCkJCXtyZWcsIDAsIHZhbH0KKyNkZWZpbmUgTVNNOFgxNl9UT01CQUtfTFBBU1NfQVVESU9fQ09SRV9ESUdfQ09ERUNfQ0xLX1NFTAkweEZFMDNCMDA0CisjZGVmaW5lIE1TTThYMTZfVE9NQkFLX0xQQVNTX0RJR0NPREVDX0NNRF9SQ0dSCQkJMHgwMTgxQzA5QworI2RlZmluZSBNU004WDE2X1RPTUJBS19MUEFTU19ESUdDT0RFQ19DRkdfUkNHUgkJCTB4MDE4MUMwQTAKKyNkZWZpbmUgTVNNOFgxNl9UT01CQUtfTFBBU1NfRElHQ09ERUNfTQkJCQkweDAxODFDMEE0CisjZGVmaW5lIE1TTThYMTZfVE9NQkFLX0xQQVNTX0RJR0NPREVDX04JCQkJMHgwMTgxQzBBOAorI2RlZmluZSBNU004WDE2X1RPTUJBS19MUEFTU19ESUdDT0RFQ19ECQkJCTB4MDE4MUMwQUMKKyNkZWZpbmUgTVNNOFgxNl9UT01CQUtfTFBBU1NfRElHQ09ERUNfQ0JDUgkJCTB4MDE4MUMwQjAKKyNkZWZpbmUgTVNNOFgxNl9UT01CQUtfTFBBU1NfRElHQ09ERUNfQUhCX0NCQ1IJCQkweDAxODFDMEI0CisKKyNkZWZpbmUgTVNNOFgxNl9DT0RFQ19OQU1FICJtc204eDE2X3djZF9jb2RlYyIKKworI2RlZmluZSBNU004OVhYX0lTX0NEQ19DT1JFX1JFRyhyZWcpIFwKKwkoKChyZWcgPj0gMHgwMCkgJiYgKHJlZyA8PSAweDNGRikpID8gMSA6IDApCisjZGVmaW5lIE1TTTg5WFhfSVNfUE1JQ19DRENfUkVHKHJlZykgXAorCSgoKHJlZyA+PSAweEYwMDApICYmIChyZWcgPD0gMHhGMUZGKSkgPyAxIDogMCkKKy8qCisgKiBNQ0xLIGFjdGl2aXR5IGluZGljYXRvcnMgZHVyaW5nIHN1c3BlbmQgYW5kIHJlc3VtZSBjYWxsCisgKi8KKyNkZWZpbmUgTUNMS19TVVNfRElTCTEKKyNkZWZpbmUgTUNMS19TVVNfUlNDCTIKKyNkZWZpbmUgTUNMS19TVVNfTk9fQUNUCTMKKworI2RlZmluZSBOVU1fREVDSU1BVE9SUwk0CisjZGVmaW5lIE1TTTg5WFhfVkREX1NQS0RSVl9OQU1FICJjZGMtdmRkLXNwa2RydiIKKworI2RlZmluZSBERUZBVUxUX01VTFRJUExJRVIgODAwCisjZGVmaW5lIERFRkFVTFRfR0FJTiA5CisjZGVmaW5lIERFRkFVTFRfT0ZGU0VUIDEwMAorCitleHRlcm4gY29uc3QgdTggbXNtODl4eF9wbWljX2NkY19yZWdfcmVhZGFibGVbTVNNODlYWF9QTUlDX0NEQ19DQUNIRV9TSVpFXTsKK2V4dGVybiBjb25zdCB1OCBtc204OXh4X2NkY19jb3JlX3JlZ19yZWFkYWJsZVtNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkVdOworZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIG1zbTg5eHhfY2RjX2NvcmVfcmVnbWFwX2NvbmZpZzsKK2V4dGVybiBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtc204OXh4X3BtaWNfY2RjX3JlZ21hcF9jb25maWc7CisKK2VudW0gY29kZWNfdmVyc2lvbnMgeworCVRPTUJBS18xXzAsCisJVE9NQkFLXzJfMCwKKwlDT05HQSwKKwlDQUpPTiwKKwlDQUpPTl8yXzAsCisJRElBTkdVLAorCVVOU1VQUE9SVEVELAorfTsKKworLyogU3VwcG9ydCBkaWZmZXJlbnQgaHBoIG1vZGVzICovCitlbnVtIHsKKwlOT1JNQUxfTU9ERSA9IDAsCisJSEQyX01PREUsCit9OworCisvKiBDb2RlYyBzdXBwb3J0cyAxIGNvbXBhbmRlciAqLworZW51bSB7CisJQ09NUEFOREVSX05PTkUgPSAwLAorCUNPTVBBTkRFUl8xLCAvKiBIUEhML1IgKi8KKwlDT01QQU5ERVJfTUFYLAorfTsKKworZW51bSB3Y2RfY3Vycl9yZWYgeworCUlfaDRfVUEgPSAwLAorCUlfcHQ1X1VBLAorCUlfMTRfVUEsCisJSV9sNF9VQSwKKwlJXzFfVUEsCit9OworCitlbnVtIHdjZF9tYmhjX2ltcF9kZXRfcGluIHsKKwlXQ0RfTUJIQ19ERVRfTk9ORSA9IDAsCisJV0NEX01CSENfREVUX0hQSEwsCisJV0NEX01CSENfREVUX0hQSFIsCisJV0NEX01CSENfREVUX0JPVEgsCit9OworCisKKy8qIEVhY2ggbWljYmlhcyBjYW4gYmUgYXNzaWduZWQgdG8gb25lIG9mIHRocmVlIGNmaWx0ZXJzCisgKiBWYmF0dF9taW4gPj0gLjE1ViArIGxkb2hfdgorICogbGRvaF92ID49IC4xNXYgKyBjZmlsdHhfbXYKKyAqIElmIGxkb2hfdiA9IDEuOTUgMTYwIG12IDwgY2ZpbHR4X212IDwgMTgwMCBtdgorICogSWYgbGRvaF92ID0gMi4zNSAyMDAgbXYgPCBjZmlsdHhfbXYgPCAyMjAwIG12CisgKiBJZiBsZG9oX3YgPSAyLjc1IDI0MCBtdiA8IGNmaWx0eF9tdiA8IDI2MDAgbXYKKyAqIElmIGxkb2hfdiA9IDIuODUgMjUwIG12IDwgY2ZpbHR4X212IDwgMjcwMCBtdgorICovCisKK3N0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyB7CisJdTggbGRvaF92OworCXUzMiBjZmlsdDFfbXY7IC8qIGluIG12ICovCisJdTMyIGNmaWx0Ml9tdjsgLyogaW4gbXYgKi8KKwl1MzIgY2ZpbHQzX212OyAvKiBpbiBtdiAqLworCS8qIERpZmZlcmVudCBXQ0Q5eHh4IHNlcmllcyBjb2RlY3MgbWF5IG5vdAorCSAqIGhhdmUgNCBtaWMgYmlhc2VzLiBJZiBhIGNvZGVjIGhhcyBmZXdlcgorCSAqIG1pYyBiaWFzZXMsIHNvbWUgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsCisJICogbm90IGJlIHVzZWQuCisJICovCisJdTggYmlhczFfY2ZpbHRfc2VsOworCXU4IGJpYXMyX2NmaWx0X3NlbDsKKwl1OCBiaWFzM19jZmlsdF9zZWw7CisJdTggYmlhczRfY2ZpbHRfc2VsOworCXU4IGJpYXMxX2NhcF9tb2RlOworCXU4IGJpYXMyX2NhcF9tb2RlOworCXU4IGJpYXMzX2NhcF9tb2RlOworCXU4IGJpYXM0X2NhcF9tb2RlOworCWJvb2wgYmlhczJfaXNfaGVhZHNldF9vbmx5OworfTsKKworZW51bSBtc204eDE2X3djZF9waWRfY3VycmVudCB7CisJTVNNODlYWF9QSURfTUlDXzJQNV9VQSwKKwlNU004OVhYX1BJRF9NSUNfNV9VQSwKKwlNU004OVhYX1BJRF9NSUNfMTBfVUEsCisJTVNNODlYWF9QSURfTUlDXzIwX1VBLAorfTsKKworc3RydWN0IG1zbTh4MTZfd2NkX3JlZ19tYXNrX3ZhbCB7CisJdTE2CXJlZzsKKwl1OAltYXNrOworCXU4CXZhbDsKK307CisKK2VudW0gbXNtOHgxNl93Y2RfbWJoY19hbmFsb2dfcHdyX2NmZyB7CisJTVNNODlYWF9BTkFMT0dfUFdSX0NPTExBUFNFRCA9IDAsCisJTVNNODlYWF9BTkFMT0dfUFdSX09OLAorCU1TTTg5WFhfTlVNX0FOQUxPR19QV1JfQ09ORklHUywKK307CisKKy8qIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IEkyUyBwb3J0ICovCitlbnVtIHsKKwlNU004OVhYX1JYMSA9IDAsCisJTVNNODlYWF9SWDIsCisJTVNNODlYWF9SWDMsCisJTVNNODlYWF9SWF9NQVgsCit9OworCitlbnVtIHsKKwlNU004OVhYX1RYMSA9IDAsCisJTVNNODlYWF9UWDIsCisJTVNNODlYWF9UWDMsCisJTVNNODlYWF9UWDQsCisJTVNNODlYWF9UWF9NQVgsCit9OworCitlbnVtIHsKKwkvKiBJTlRSX1JFRyAwIC0gRGlnaXRhbCBQZXJpcGggKi8KKwlNU004OVhYX0lSUV9TUEtSX0NOUCA9IDAsCisJTVNNODlYWF9JUlFfU1BLUl9DTElQLAorCU1TTTg5WFhfSVJRX1NQS1JfT0NQLAorCU1TTTg5WFhfSVJRX01CSENfSU5TUkVNX0RFVDEsCisJTVNNODlYWF9JUlFfTUJIQ19SRUxFQVNFLAorCU1TTTg5WFhfSVJRX01CSENfUFJFU1MsCisJTVNNODlYWF9JUlFfTUJIQ19JTlNSRU1fREVULAorCU1TTTg5WFhfSVJRX01CSENfSFNfREVULAorCS8qIElOVFJfUkVHIDEgLSBBbmFsb2cgUGVyaXBoICovCisJTVNNODlYWF9JUlFfRUFSX09DUCwKKwlNU004OVhYX0lSUV9IUEhSX09DUCwKKwlNU004OVhYX0lSUV9IUEhMX09DUCwKKwlNU004OVhYX0lSUV9FQVJfQ05QLAorCU1TTTg5WFhfSVJRX0hQSFJfQ05QLAorCU1TTTg5WFhfSVJRX0hQSExfQ05QLAorCU1TTTg5WFhfTlVNX0lSUVMsCit9OworCitlbnVtIHsKKwlPTl9ERU1BTkRfTUlDQklBUyA9IDAsCisJT05fREVNQU5EX1NQS0RSViwKKwlPTl9ERU1BTkRfU1VQUExJRVNfTUFYLAorfTsKKworLyoKKyAqIFRoZSBkZWxheSBsaXN0IGlzIHBlciBjb2RlYyBIVyBzcGVjaWZpY2F0aW9uLgorICogUGxlYXNlIGFkZCBkZWxheSBpbiB0aGUgbGlzdCBpbiB0aGUgZnV0dXJlIGluc3RlYWQKKyAqIG9mIG1hZ2ljIG51bWJlcgorICovCitlbnVtIHsKKwlDT0RFQ19ERUxBWV8xX01TID0gMTAwMCwKKwlDT0RFQ19ERUxBWV8xXzFfTVMgID0gMTEwMCwKK307CisKK3N0cnVjdCBtc204eDE2X3djZF9yZWd1bGF0b3IgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG1pbl91djsKKwlpbnQgbWF4X3V2OworCWludCBvcHRpbXVtX3VhOworCWJvb2wgb25kZW1hbmQ7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworfTsKKworc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgeworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKwlhdG9taWNfdCByZWY7Cit9OworCitzdHJ1Y3Qgd2NkX2ltcGVkX2lfcmVmIHsKKwllbnVtIHdjZF9jdXJyX3JlZiBjdXJyX3JlZjsKKwlpbnQgbWluX3ZhbDsKKwlpbnQgbXVsdGlwbGllcjsKKwlpbnQgZ2Fpbl9hZGo7CisJaW50IG9mZnNldDsKK307CisKK3N0cnVjdCBtc204eDE2X3djZF9wZGF0YSB7CisJaW50IGlycTsKKwlpbnQgaXJxX2Jhc2U7CisJaW50IG51bV9pcnFzOworCWludCByZXNldF9ncGlvOworCXZvaWQgKm1zbTh4MTZfd2NkX2FoYl9iYXNlX3ZhZGRyOworCXN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyBtaWNiaWFzOworCXN0cnVjdCBtc204eDE2X3djZF9yZWd1bGF0b3IgcmVndWxhdG9yW01BWF9SRUdVTEFUT1JdOworCXUzMiBtY2xrX3JhdGU7CisJdTMyIGlzX2xwYXNzOworfTsKKworZW51bSBtc204eDE2X3djZF9taWNiaWFzX251bSB7CisJTVNNODlYWF9NSUNCSUFTMSA9IDAsCit9OworCitzdHJ1Y3QgbXNtOHgxNl93Y2QgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwl1OCB2ZXJzaW9uOworCisJaW50IHJlc2V0X2dwaW87CisJaW50ICgqcmVhZF9kZXYpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCXVuc2lnbmVkIHNob3J0IHJlZyk7CisJaW50ICgqd3JpdGVfZGV2KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgdW5zaWduZWQgc2hvcnQgcmVnLCB1OCB2YWwpOworCisJdTMyIG51bV9vZl9zdXBwbGllczsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXM7CisKKwl1OCBpZGJ5dGVbNF07CisKKwlpbnQgbnVtX2lycXM7CisJdTMyIG1jbGtfcmF0ZTsKK307CisKK3N0cnVjdCBtc204eDE2X3djZF9wcml2IHsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdTE2IHBtaWNfcmV2OworCXUxNiBjb2RlY192ZXJzaW9uOworCXUzMiBib29zdF92b2x0YWdlOworCXUzMiBhZGNfY291bnQ7CisJdTMyIHJ4X2JpYXNfY291bnQ7CisJczMyIGRtaWNfMV8yX2Nsa19jbnQ7CisJdTMyIG11dGVfbWFzazsKKwlib29sIGludF9tY2xrMF9lbmFibGVkOworCWJvb2wgY2xvY2tfYWN0aXZlOworCWJvb2wgY29uZmlnX21vZGVfYWN0aXZlOworCXUxNiBib29zdF9vcHRpb247CisJLyogbW9kZSB0byBzZWxlY3QgaGQyICovCisJdTMyIGhwaF9tb2RlOworCS8qIGNvbXBhbmRlciB1c2VkIGZvciBlYWNoIHJ4IGNoYWluICovCisJdTMyIGNvbXBfZW5hYmxlZFtNU004OVhYX1JYX01BWF07CisJYm9vbCBzcGtfYm9vc3Rfc2V0OworCWJvb2wgZWFyX3BhX2Jvb3N0X3NldDsKKwlib29sIGV4dF9zcGtfYm9vc3Rfc2V0OworCWJvb2wgZGVjX2FjdGl2ZVtOVU1fREVDSU1BVE9SU107CisJc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgb25fZGVtYW5kX2xpc3RbT05fREVNQU5EX1NVUFBMSUVTX01BWF07CisJc3RydWN0IHJlZ3VsYXRvciAqc3BrZHJ2X3JlZzsKKwkvKiBtYmhjIG1vZHVsZSAqLworCXN0cnVjdCB3Y2RfbWJoYyBtYmhjOworCS8qIGNhbCBpbmZvIGZvciBjb2RlYyAqLworCXN0cnVjdCBmd19pbmZvICpmd19kYXRhOworCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG5vdGlmaWVyOworCWludCAoKmNvZGVjX3Nwa19leHRfcGFfY2IpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSk7CisJaW50ICgqY29kZWNfaHBoX2NvbXBfZ3BpbykoYm9vbCBlbmFibGUpOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7CisJc3RydWN0IHdjZF9pbXBlZF9pX3JlZiBpbXBlZF9pX3JlZjsKKwllbnVtIHdjZF9tYmhjX2ltcF9kZXRfcGluIGltcGVkX2RldF9waW47Cit9OworCitleHRlcm4gaW50IG1zbTh4MTZfd2NkX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1jbGtfZW5hYmxlLAorCQkJICAgICBib29sIGRhcG0pOworCitleHRlcm4gaW50IG1zbTh4MTZfd2NkX2hzX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCSAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZyk7CisKK2V4dGVybiB2b2lkIG1zbTh4MTZfd2NkX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CisKK2V4dGVybiB2b2lkIG1zbTh4MTZfdXBkYXRlX2ludF9zcGtfYm9vc3QoYm9vbCBlbmFibGUpOworCitleHRlcm4gdm9pZCBtc204eDE2X3djZF9zcGtfZXh0X3BhX2NiKAorCQlpbnQgKCpjb2RlY19zcGtfZXh0X3BhKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCWludCBlbmFibGUpLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworCitleHRlcm4gdm9pZCBtc204eDE2X3djZF9ocGhfY29tcF9jYigKKwkJaW50ICgqY29kZWNfaHBoX2NvbXBfZ3BpbykoYm9vbCBlbmFibGUpLAorCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCBlbmFibGVfZGlnaXRhbF9jYWxsYmFjayh2b2lkICpmbGFnKTsKK3ZvaWQgZGlzYWJsZV9kaWdpdGFsX2NhbGxiYWNrKHZvaWQgKmZsYWcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2X3djZF9yZWdpc3RlcnMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2X3djZF9yZWdpc3RlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzI2ZWYzOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxNi9tc204eDE2X3djZF9yZWdpc3RlcnMuaApAQCAtMCwwICsxLDU4NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgTVNNOFgxNl9XQ0RfUkVHSVNURVJTX0gKKyNkZWZpbmUgTVNNOFgxNl9XQ0RfUkVHSVNURVJTX0gKKworI2RlZmluZSBDRENfRElHX0JBU0UJCTB4RjAwMAorI2RlZmluZSBDRENfQU5BX0JBU0UJCTB4RjEwMAorCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1JFVklTSU9OMQkJKENEQ19ESUdfQkFTRSsweDAwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjIJCShDRENfRElHX0JBU0UrMHgwMDEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1JFVklTSU9OMl9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfVFlQRQkJKENEQ19ESUdfQkFTRSsweDAwNCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfVFlQRV9fUE9SCQkoMHgyMykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfU1VCVFlQRQkJKENEQ19ESUdfQkFTRSsweDAwNSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfU1VCVFlQRV9fUE9SCQkoMHgwMSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1JUX1NUUwkJKENEQ19ESUdfQkFTRSsweDAxMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1JUX1NUU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1NFVF9UWVBFCQkoQ0RDX0RJR19CQVNFKzB4MDExKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfU0VUX1RZUEVfX1BPUgkJKDB4RkYpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QT0xBUklUWV9ISUdICQkoQ0RDX0RJR19CQVNFKzB4MDEyKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfSElHSF9fUE9SCQkoMHhGRikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0xPVwkJKENEQ19ESUdfQkFTRSsweDAxMykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0xPV19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfQ0xSCQkoQ0RDX0RJR19CQVNFKzB4MDE0KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9DTFJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9TRVQJCShDRENfRElHX0JBU0UrMHgwMTUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9TRVRfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9DTFIJCShDRENfRElHX0JBU0UrMHgwMTYpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9DTFJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9MQVRDSEVEX1NUUwkJKENEQ19ESUdfQkFTRSsweDAxOCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfU1RTX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUEVORElOR19TVFMJCShDRENfRElHX0JBU0UrMHgwMTkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QRU5ESU5HX1NUU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX01JRF9TRUwJCShDRENfRElHX0JBU0UrMHgwMUEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9NSURfU0VMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUFJJT1JJVFkJCShDRENfRElHX0JBU0UrMHgwMUIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QUklPUklUWV9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfR1BJT19NT0RFCQkoQ0RDX0RJR19CQVNFKzB4MDQwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9HUElPX01PREVfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfT0UJCShDRENfRElHX0JBU0UrMHgwNDEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfT0VfX1BPUgkJKDB4MDEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfREFUQQkJKENEQ19ESUdfQkFTRSsweDA0MikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX0NUTF9EQVRBX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QSU5fU1RBVFVTCQkoQ0RDX0RJR19CQVNFKzB4MDQzKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QSU5fU1RBVFVTX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9IRFJJVkVfQ1RMCQkoQ0RDX0RJR19CQVNFKzB4MDQ0KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9IRFJJVkVfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTAkJKENEQ19ESUdfQkFTRSsweDA0NikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JTVF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19UT1BfQ0xLX0NUTAkJKENEQ19ESUdfQkFTRSsweDA0OCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1RPUF9DTEtfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwJCShDRENfRElHX0JBU0UrMHgwNDkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMCQkoQ0RDX0RJR19CQVNFKzB4MDRBKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMV9DVEwJCShDRENfRElHX0JBU0UrMHgwNTApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMV9DVExfX1BPUgkJKDB4MDIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMl9DVEwJCShDRENfRElHX0JBU0UrMHgwNTEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMl9DVExfX1BPUgkJKDB4MDIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX0hQSFJfREFDX0NUTAkoQ0RDX0RJR19CQVNFKzB4MDUyKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9IUEhSX0RBQ19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYMV9DVEwJCShDRENfRElHX0JBU0UrMHgwNTMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYMV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYMl9DVEwJCShDRENfRElHX0JBU0UrMHgwNTQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYM19DVEwJCShDRENfRElHX0JBU0UrMHgwNTUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYX0xCX0NUTAkoQ0RDX0RJR19CQVNFKzB4MDU2KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9SWF9MQl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwxCQkoQ0RDX0RJR19CQVNFKzB4MDU4KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMV9fUE9SCQkoMHg3QykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDIJCShDRENfRElHX0JBU0UrMHgwNTkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwyX19QT1IJCSgweDdDKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMwkJKENEQ19ESUdfQkFTRSsweDA1QSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDNfX1BPUgkJKDB4N0MpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTAJCShDRENfRElHX0JBU0UrMHgwNUIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTBfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTEJCShDRENfRElHX0JBU0UrMHgwNUMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTFfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTIJCShDRENfRElHX0JBU0UrMHgwNUQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTMJCShDRENfRElHX0JBU0UrMHgwNUUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTNfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RJR19ERUJVR19DVEwJCShDRENfRElHX0JBU0UrMHgwNjgpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RJR19ERUJVR19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0RJR19ERUJVR19FTgkJKENEQ19ESUdfQkFTRSsweDA2OSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0VOX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8wCQkoQ0RDX0RJR19CQVNFKzB4MDcwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8wX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8xCQkoQ0RDX0RJR19CQVNFKzB4MDcxKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8xX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8yCQkoQ0RDX0RJR19CQVNFKzB4MDcyKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8yX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTCQkoQ0RDX0RJR19CQVNFKzB4MEQwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwxCQkoQ0RDX0RJR19CQVNFKzB4MEQ4KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwxX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwyCQkoQ0RDX0RJR19CQVNFKzB4MEQ5KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwyX19QT1IJCSgweDAxKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwzCQkoQ0RDX0RJR19CQVNFKzB4MERBKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwzX19QT1IJCSgweDA1KQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0CQkoQ0RDX0RJR19CQVNFKzB4MERCKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0X19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfVEVTVDEJCShDRENfRElHX0JBU0UrMHgwRTApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9URVNUMV9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1RFU1RfVkFMCQkoQ0RDX0RJR19CQVNFKzB4MEUxKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfVEVTVF9WQUxfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1RSSU1fTlVNCQkoQ0RDX0RJR19CQVNFKzB4MEYwKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9UUklNX05VTV9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfVFJJTV9DVFJMCQkoQ0RDX0RJR19CQVNFKzB4MEYxKQorI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9UUklNX0NUUkxfX1BPUgkJKDB4MDApCisKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjEJCShDRENfQU5BX0JBU0UrMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjFfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04yCQkoQ0RDX0FOQV9CQVNFKzB4MDEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04yX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMwkJKENEQ19BTkFfQkFTRSsweDAyKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OM19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjQJCShDRENfQU5BX0JBU0UrMHgwMykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjRfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfVFlQRQkJKENEQ19BTkFfQkFTRSsweDA0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1RZUEVfX1BPUgkJKDB4MjMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfU1VCVFlQRQkJKENEQ19BTkFfQkFTRSsweDA1KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1NVQlRZUEVfX1BPUgkJKDB4MDkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1JUX1NUUwkJKENEQ19BTkFfQkFTRSsweDEwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9SVF9TVFNfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1NFVF9UWVBFCQkoQ0RDX0FOQV9CQVNFKzB4MTEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1NFVF9UWVBFX19QT1IJCSgweDNGKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QT0xBUklUWV9ISUdICQkoQ0RDX0FOQV9CQVNFKzB4MTIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0hJR0hfX1BPUgkJKDB4M0YpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0xPVwkJKENEQ19BTkFfQkFTRSsweDEzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QT0xBUklUWV9MT1dfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfQ0xSCQkoQ0RDX0FOQV9CQVNFKzB4MTQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfQ0xSX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9TRVQJCShDRENfQU5BX0JBU0UrMHgxNSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fU0VUX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFIJCShDRENfQU5BX0JBU0UrMHgxNikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fQ0xSX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9MQVRDSEVEX1NUUwkJKENEQ19BTkFfQkFTRSsweDE4KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9MQVRDSEVEX1NUU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUEVORElOR19TVFMJCShDRENfQU5BX0JBU0UrMHgxOSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUEVORElOR19TVFNfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX01JRF9TRUwJCShDRENfQU5BX0JBU0UrMHgxQSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTUlEX1NFTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUFJJT1JJVFkJCShDRENfQU5BX0JBU0UrMHgxQikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUFJJT1JJVFlfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOCQkoQ0RDX0FOQV9CQVNFKzB4NDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9WQUwJCShDRENfQU5BX0JBU0UrMHg0MSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfVkFMX19QT1IJCSgweDIwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9DVEwJCShDRENfQU5BX0JBU0UrMHg0MikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9JTlRfUkJJQVMJCShDRENfQU5BX0JBU0UrMHg0MykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTX19QT1IJCSgweDQ5KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTgkJKENEQ19BTkFfQkFTRSsweDQ0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTl9fUE9SCQkoMHgyMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzIJCShDRENfQU5BX0JBU0UrMHg0NSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4NDYpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8xCQkoQ0RDX0FOQV9CQVNFKzB4NDcpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzFfX1BPUgkJKDB4MzUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIJCShDRENfQU5BX0JBU0UrMHg1MCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMl9fUE9SCQkoMHgwOCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwJCShDRENfQU5BX0JBU0UrMHg1MSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSCQkoQ0RDX0FOQV9CQVNFKzB4NTIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSX19QT1IJCSgweDk4KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwJKENEQ19BTkFfQkFTRSsweDUzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4xX1pERVRNX0NUTAkoQ0RDX0FOQV9CQVNFKzB4NTQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4xX1pERVRNX0NUTF9fUE9SCQkoMHgyMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMCShDRENfQU5BX0JBU0UrMHg1NSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMX19QT1IJCSgweDQwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROM19DVEwJCShDRENfQU5BX0JBU0UrMHg1NikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjNfQ1RMX19QT1IJCSgweDYxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlRONF9DVEwJCShDRENfQU5BX0JBU0UrMHg1NykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjRfQ1RMX19QT1IJCSgweDgwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVAkJKENEQ19BTkFfQkFTRSsweDU4KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxUCShDRENfQU5BX0JBU0UrMHg1OSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxUX19QT1IJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV9FTgkJKENEQ19BTkFfQkFTRSsweDYwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU5fX1BPUgkJKDB4MDMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTgkJKENEQ19BTkFfQkFTRSsweDYxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzJfRU5fX1BPUgkJKDB4MDMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RFU1RfQ1RMXzEJCShDRENfQU5BX0JBU0UrMHg2MikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVEVTVF9DVExfMV9fUE9SCQkoMHhCRikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVEVTVF9DVExfMgkJKENEQ19BTkFfQkFTRSsweDYzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yX19QT1IJCSgweDhDKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVEwJCShDRENfQU5BX0JBU0UrMHg2NCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9PUEFNUF9CSUFTCQkoQ0RDX0FOQV9CQVNFKzB4NjUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVNfX1BPUgkJKDB4NkIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RYRkVfQ0xLRElWCQkoQ0RDX0FOQV9CQVNFKzB4NjYpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RYRkVfQ0xLRElWX19QT1IJCSgweDUxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU4JCShDRENfQU5BX0JBU0UrMHg2NykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOX19QT1IJCSgweDAyKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9FTgkJKENEQ19BTkFfQkFTRSsweDgwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9FTl9fUE9SCQkoMHgyNikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xLCQkoQ0RDX0FOQV9CQVNFKzB4ODEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0NMS19fUE9SCQkoMHgyMykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfREVHTElUQ0gJCShDRENfQU5BX0JBU0UrMHg4MikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfREVHTElUQ0hfX1BPUgkJKDB4NUIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTAkJKENEQ19BTkFfQkFTRSsweDgzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkxfX1BPUgkJKDB4MDgpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0JJQVMJCShDRENfQU5BX0JBU0UrMHg4NCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQklBU19fUE9SCQkoMHgyOSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwJCShDRENfQU5BX0JBU0UrMHg4NSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkxfX1BPUgkJKDB4MjQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX1RFU1QJCShDRENfQU5BX0JBU0UrMHg4NikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVEVTVF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xJTV9BRERSCQkoQ0RDX0FOQV9CQVNFKzB4ODcpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0NMSU1fQUREUl9fUE9SCQkoMHhENSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DTE9DS19ESVZJREVSCQkoQ0RDX0FOQV9CQVNFKzB4OTApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ0xPQ0tfRElWSURFUl9fUE9SCQkoMHhFOCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NUTAkJKENEQ19BTkFfQkFTRSsweDkxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ1RMX19QT1IJCSgweENGKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ09VTlQJCShDRENfQU5BX0JBU0UrMHg5MikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NPVU5UX19QT1IJCSgweDZFKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQwkJKENEQ19BTkFfQkFTRSsweDkzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQ19fUE9SCQkoMHgxOCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19QQQkJKENEQ19BTkFfQkFTRSsweDk0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX1BBX19QT1IJCSgweDVBKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX0xET19PQ1AJKENEQ19BTkFfQkFTRSsweDk1KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX0xET19PQ1BfX1BPUgkJKDB4NjkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfQ05QCQkoQ0RDX0FOQV9CQVNFKzB4OTYpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfQ05QX19QT1IJCSgweDI5KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4JCShDRENfQU5BX0JBU0UrMHg5NykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOX19QT1IJCSgweDgwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4OTgpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9XR19DVExfX1BPUgkJKDB4REEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9XR19USU1FCQkoQ0RDX0FOQV9CQVNFKzB4OTkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9XR19USU1FX19QT1IJCSgweDE2KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QJCShDRENfQU5BX0JBU0UrMHg5QSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9URVNUX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwJKENEQ19BTkFfQkFTRSsweDlCKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVExfX1BPUgkJKDB4MjApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVAkJKENEQ19BTkFfQkFTRSsweDlDKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1RFU1RfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfUEFfREFDX0NUTAkoQ0RDX0FOQV9CQVNFKzB4OUQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfUEFfREFDX0NUTF9fUE9SCQkoMHgyMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4OUUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTF9fX1BPUgkJKDB4MTIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQVRFU1QJCShDRENfQU5BX0JBU0UrMHg5RikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9BVEVTVF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfU1RBVFVTCQkoQ0RDX0FOQV9CQVNFKzB4QTApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1NUQVRVU19fUE9SCQkoMHgwQykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfU1RBVFVTCQkoQ0RDX0FOQV9CQVNFKzB4QTEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX1NUQVRVU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4QUMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwJCShDRENfQU5BX0JBU0UrMHhBRCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9SWF9MT19FTl9DVExfX1BPUgkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwJCShDRENfQU5BX0JBU0UrMHhCMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVExfX1BPUgkJKDB4ODMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ0xJUF9ERVQJCShDRENfQU5BX0JBU0UrMHhCMSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DTElQX0RFVF9fUE9SCQkoMHg5MSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwJCShDRENfQU5BX0JBU0UrMHhCMikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVExfX1BPUgkJKDB4MjkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9BTkFfQklBU19TRVQJCShDRENfQU5BX0JBU0UrMHhCMykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0FOQV9CSUFTX1NFVF9fUE9SCQkoMHg0RCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX09DUF9DVEwJCShDRENfQU5BX0JBU0UrMHhCNCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX09DUF9DVExfX1BPUgkJKDB4RTEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4QjUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMX19QT1IJCSgweDFFKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX01JU0MJCShDRENfQU5BX0JBU0UrMHhCNikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9NSVNDX19QT1IJCSgweENCKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0RCRwkJKENEQ19BTkFfQkFTRSsweEI3KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0RCR19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19DVVJSRU5UX0xJTUlUCQkoQ0RDX0FOQV9CQVNFKzB4QzApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVF9fUE9SCQkoMHgwMikKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19PVVRQVVRfVk9MVEFHRQkJKENEQ19BTkFfQkFTRSsweEMxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX09VVFBVVF9WT0xUQUdFX19QT1IJCSgweDE0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFCQkoQ0RDX0FOQV9CQVNFKzB4QzIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREVfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4QzMpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMX19QT1IJCSgweDFGKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NMT1BFX0NPTVBfSVBfWkVSTwkJKENEQ19BTkFfQkFTRSsweEM0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NMT1BFX0NPTVBfSVBfWkVST19fUE9SCQkoMHg4QykKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRFNPTl9NQVhfRFVUWV9DWUNMRQkoQ0RDX0FOQV9CQVNFKzB4QzUpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkRTT05fTUFYX0RVVFlfQ1lDTEVfX1BPUgkJKDB4QzApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVDFfMQkJKENEQ19BTkFfQkFTRSsweEM2KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX1RFU1QxXzFfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVF8yCQkoQ0RDX0FOQV9CQVNFKzB4QzcpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVF8yX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfU0FSX1NUQVRVUwkJKENEQ19BTkFfQkFTRSsweEM4KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfU0FSX1NUQVRVU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9TVEFUVVMJCShDRENfQU5BX0JBU0UrMHhDOSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9TVEFUVVNfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfQ1NSCQkoQ0RDX0FOQV9CQVNFKzB4Q0UpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfQ1NSX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BCVVNfQUREX1NFTAkJKENEQ19BTkFfQkFTRSsweENGKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BCVVNfQUREX1NFTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTCQkoQ0RDX0FOQV9CQVNFKzB4RDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTU19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwxCQkoQ0RDX0FOQV9CQVNFKzB4RDgpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMV9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwyCQkoQ0RDX0FOQV9CQVNFKzB4RDkpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMl9fUE9SCQkoMHgwMSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzCQkoQ0RDX0FOQV9CQVNFKzB4REEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMM19fUE9SCQkoMHgwNSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEw0CQkoQ0RDX0FOQV9CQVNFKzB4REIpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMNF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfVEVTVDEJCShDRENfQU5BX0JBU0UrMHhFMCkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfVEVTVDFfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1RFU1RfVkFMCQkoQ0RDX0FOQV9CQVNFKzB4RTEpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1RFU1RfVkFMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fTlVNCQkoQ0RDX0FOQV9CQVNFKzB4RjApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9OVU1fX1BPUgkJKDB4MDQpCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMQkJKENEQ19BTkFfQkFTRSsweEYxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fQ1RSTDFfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMgkJKENEQ19BTkFfQkFTRSsweEYyKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fQ1RSTDJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMwkJKENEQ19BTkFfQkFTRSsweEYzKQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fQ1RSTDNfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMNAkJKENEQ19BTkFfQkFTRSsweEY0KQorI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RSSU1fQ1RSTDRfX1BPUgkJKDB4MDApCisKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0NEQ19OVU1fUkVHSVNURVJTIFwKKwkJKE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMNCsxKQorI2RlZmluZSBNU004OVhYX1BNSUNfQ0RDX01BWF9SRUdJU1RFUiBcCisJCShNU004OVhYX1BNSUNfQ0RDX05VTV9SRUdJU1RFUlMtMSkKKyNkZWZpbmUgTVNNODlYWF9QTUlDX0NEQ19DQUNIRV9TSVpFIFwKKwkJTVNNODlYWF9QTUlDX0NEQ19OVU1fUkVHSVNURVJTCisKKworI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19SWF9SRVNFVF9DVEwJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19SWF9SRVNFVF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX1JFU0VUX0IxX0NUTAkJKDB4MDQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX1JFU0VUX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfRE1JQ19CMV9DVEwJCSgweDA4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19ETUlDX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTAkJKDB4MEMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVExfX1BPUgkJKDB4MTMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0kyU19DVEwJCSgweDEwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMX19QT1IJCSgweDEzKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX1JFU0VUX0IxX0NUTAkJKDB4MTQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX09USFJfUkVTRVRfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMCQkoMHgxOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9DVEwJCSgweDFDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX0NUTF9fUE9SCQkoMHgwNCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMCQkoMHgyMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19NQ0xLX0NUTAkJKDB4MjQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX01DTEtfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMCQkoMHgyOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUERNX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfU0RfQ1RMCQkoMHgyQykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfU0RfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19XU0FfVklfQjFfQ1RMCQkoMHgzMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfV1NBX1ZJX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMCQkoMHgzNCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVEwJCSgweDQwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTAkJKDB4NjApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMCQkoMHg4MCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVEwJCSgweDQ0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IyX0NUTAkJKDB4NjQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IyX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMCQkoMHg4NCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVEwJCSgweDQ4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTAkJKDB4NjgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMCQkoMHg4OCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwJCSgweDRDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTAkJKDB4NkMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMCQkoMHg4QykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwJCSgweDUwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVExfX1BPUgkJKDB4NjgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTAkJKDB4NzApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTF9fUE9SCQkoMHg2OCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMCQkoMHg5MCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMX19QT1IJCSgweDY4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwJCSgweDU0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTAkJKDB4NzQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMCQkoMHg5NCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IxX0NUTAkJKDB4NTgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgxX1ZPTF9DVExfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IxX0NUTAkJKDB4NzgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IxX0NUTAkJKDB4OTgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IyX0NUTAkJKDB4NUMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgxX1ZPTF9DVExfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IyX0NUTAkJKDB4N0MpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IyX0NUTAkJKDB4OUMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RPUF9HQUlOX1VQREFURQkJKDB4QTApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVE9QX0dBSU5fVVBEQVRFX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RPUF9DVEwJCSgweEE0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RPUF9DVExfX1BPUgkJCSgweDAxKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IxX0NUTAkJKDB4QjApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjFfQ1RMX19QT1IJCSgweDMwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IyX0NUTAkJKDB4QjQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjJfQ1RMX19QT1IJCSgweEI1KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IzX0NUTAkJKDB4QjgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMX19QT1IJCSgweDI4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I0X0NUTAkJKDB4QkMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjRfQ1RMX19QT1IJCSgweDM3KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I1X0NUTAkJKDB4QzApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjVfQ1RMX19QT1IJCSgweDdGKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I2X0NUTAkJKDB4QzQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjZfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVMJCSgweEM4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVNfX1BPUgkJKDB4MDMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfRlNfQ0ZHCQkoMHhDQykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9GU19DRkdfX1BPUgkJKDB4MDMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfREVMQVlfQlVGX0NUTAkJKDB4RDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfREVMQVlfQlVGX0NUTF9fUE9SCQkoMHgwMikKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjFfQ1RMCQkoMHhFMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0RFU0VSMl9DVEwJCSgweEU0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0RFU0VSMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjFfQ1RMX0NGRwkJKDB4RTgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IyX0NUTF9DRkcJCSgweEVDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IyX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfQ0ZHCQkoMHhGMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTAkJKDB4MTAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CMV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IxX0NUTAkJKDB4MTQwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IyX0NUTAkJKDB4MTA0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IyX0NUTAkJKDB4MTQ0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IzX0NUTAkJKDB4MTA4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IzX0NUTAkJKDB4MTQ4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I0X0NUTAkJKDB4MTBDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I0X0NUTAkJKDB4MTRDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I1X0NUTAkJKDB4MTEwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I1X0NUTAkJKDB4MTUwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I2X0NUTAkJKDB4MTE0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I2X0NUTAkJKDB4MTU0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I3X0NUTAkJKDB4MTE4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CN19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I3X0NUTAkJKDB4MTU4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CN19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I4X0NUTAkJKDB4MTFDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9COF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I4X0NUTAkJKDB4MTVDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9COF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVEwJCSgweDEyMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0NUTF9fUE9SCQkoMHg0MCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NUTAkJKDB4MTYwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfQ1RMX19QT1IJCSgweDQwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9USU1FUl9DVEwJCSgweDEyNCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fVElNRVJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9USU1FUl9DVEwJCSgweDE2NCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwJCSgweDEyOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMV9DVEwJCSgweDE2OCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwJCSgweDEyQykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMl9DVEwJCSgweDE2QykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IxX0NUTAkJKDB4MTgwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMl9DVEwJCSgweDE4NCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjNfQ1RMCQkoMHgxODgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTAkJKDB4MThDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMl9DVEwJCSgweDE5MCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjNfQ1RMCQkoMHgxOTQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTAkJKDB4MTk4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMl9DVEwJCSgweDE5QykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMl9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMV9DVEwJCSgweDFBMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IxX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVEwJCSgweDFBOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMCQkoMHgxQUMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IzX0NUTAkJKDB4MUIwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IzX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CNF9DVEwJCSgweDFCNCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CNF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMCQkoMHgxQjgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IyX0NUTAkJKDB4MUJDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IyX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CM19DVEwJCSgweDFDMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CM19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMCQkoMHgxQzQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfSTJTX1NEMV9DVEwJCSgweDFDOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0kyU19TRDFfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX1RJTUVSCQkoMHgyODApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfVElNRVJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfVElNRVIJCSgweDJBMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9USU1FUl9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9USU1FUgkJKDB4MkMwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX1RJTUVSX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX1RJTUVSCQkoMHgyRTApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfVElNRVJfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTgkJKDB4Mjg0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfR0FJTgkJKDB4MkE0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfR0FJTgkJKDB4MkM0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTgkJKDB4MkU0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHCQkoMHgyODgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0NGRwkJKDB4MkE4KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0NGR19fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9DRkcJCSgweDJDOCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9DRkdfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfQ0ZHCQkoMHgyRTgpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfQ0ZHX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMCQkoMHgyOEMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVEwJCSgweDJBQykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfTVVYX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfTVVYX0NUTAkJKDB4MkNDKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19NVVhfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMCQkoMHgyRUMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X01VWF9DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX0NMS19GU19DVEwJCSgweDI5MCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfQ0xLX0ZTX0NUTF9fUE9SCQkoMHgwMykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfQ0xLX0ZTX0NUTAkJKDB4MkIwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9DTEtfRlNfQ1RMX19QT1IJCSgweDAzKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19DTEtfRlNfQ1RMCQkoMHgyRDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgzX0NMS19GU19DVExfX1BPUgkJKDB4MDMpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X0NMS19GU19DVEwJCSgweDJGMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfQ0xLX0ZTX0NUTF9fUE9SCQkoMHgwMykKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfRE1JQ19DVEwJCSgweDI5NCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfRE1JQ19DVExfX1BPUgkJKDB4MDApCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX0RNSUNfQ1RMCQkoMHgyQjQpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX0RNSUNfQ1RMX19QT1IJCSgweDAwKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19ETUlDX0NUTAkJKDB4MkQ0KQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19ETUlDX0NUTF9fUE9SCQkoMHgwMCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfRE1JQ19DVEwJCSgweDJGNCkKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfRE1JQ19DVExfX1BPUgkJKDB4MDApCisKKyNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9OVU1fUkVHSVNURVJTIFwKKwkJKE1TTTg5WFhfQ0RDX0NPUkVfVFg0X0RNSUNfQ1RMKzEpCisjZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfTUFYX1JFR0lTVEVSIFwKKwkJKE1TTTg5WFhfQ0RDX0NPUkVfTlVNX1JFR0lTVEVSUy0xKQorI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkUgXAorCQlNU004OVhYX0NEQ19DT1JFX05VTV9SRUdJU1RFUlMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21faGRtaV9jb2RlY19yeC5jIGIvc291bmQvc29jL2NvZGVjcy9tc21faGRtaV9jb2RlY19yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21zbV9oZG1pX2NvZGVjX3J4LmMKQEAgLTAsMCArMSw0OTQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fZXh0X2Rpc3BsYXkuaD4KKworI2RlZmluZSBNU01fRVhUX0RJU1BfUENNX1JBVEVTCVNORFJWX1BDTV9SQVRFXzQ4MDAwCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBleHRfZGlzcF9hdWRpb190eXBlX3RleHRbXSA9IHsiTm9uZSIsICJIRE1JIiwgIkRQIn07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3BfYXVkaW9fdHlwZSwgZXh0X2Rpc3BfYXVkaW9fdHlwZV90ZXh0KTsKKworc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpleHRfZGlzcF9jb3JlX3BkZXY7CisJc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19vcHMgZXh0X2Rpc3Bfb3BzOworCWludCBjYWJsZV9zdGF0dXM7Cit9OworCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9lZGlkX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGE7CisJc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19lZGlkX2JsayBlZGlkX2JsazsKKwlpbnQgcmM7CisKKwljb2RlY19kYXRhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIWNvZGVjX2RhdGEpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNvZGVjX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfYXVkaW9fZWRpZF9ibGspIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGdldF9hdWRpb19lZGlkX2JsaygpIGlzIE5VTExcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKwkJdWluZm8tPmNvdW50ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuZ2V0X2F1ZGlvX2VkaWRfYmxrKAorCQkJCWNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwgJmVkaWRfYmxrKTsKKworCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkgeworCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CisJCXVpbmZvLT5jb3VudCA9IGVkaWRfYmxrLmF1ZGlvX2RhdGFfYmxrX3NpemUgKworCQkJZWRpZF9ibGsuc3BrX2FsbG9jX2RhdGFfYmxrX3NpemU7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNvdW50OiAlZFxuIiwgX19mdW5jX18sIHVpbmZvLT5jb3VudCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2VkaWRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKSB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOworCXN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fZWRpZF9ibGsgZWRpZF9ibGs7CisJaW50IHJjOworCisJY29kZWNfZGF0YSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWlmICghY29kZWNfZGF0YSB8fCAhY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmdldF9hdWRpb19lZGlkX2JsaykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWNfZGF0YSBvciBnZXRfYXVkaW9fZWRpZF9ibGsoKSBpcyBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfYXVkaW9fZWRpZF9ibGsoCisJCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYsICZlZGlkX2Jsayk7CisJaWYgKCFJU19FUlJfVkFMVUUocmMpKSB7CisJCW1lbWNweSh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKKwkJICAgICAgIGVkaWRfYmxrLmF1ZGlvX2RhdGFfYmxrLAorCQkgICAgICAgZWRpZF9ibGsuYXVkaW9fZGF0YV9ibGtfc2l6ZSk7CisJCW1lbWNweSgodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKworCQkgICAgICAgZWRpZF9ibGsuYXVkaW9fZGF0YV9ibGtfc2l6ZSksCisJCSAgICAgICBlZGlkX2Jsay5zcGtfYWxsb2NfZGF0YV9ibGssCisJCSAgICAgICBlZGlkX2Jsay5zcGtfYWxsb2NfZGF0YV9ibGtfc2l6ZSk7CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGRhdGFfYmxrX3NpemU6JWQsIHNwa19hbGxvY19kYXRhX2Jsa19zaXplOiVkXG4iLAorCQkJX19mdW5jX18sIGVkaWRfYmxrLmF1ZGlvX2RhdGFfYmxrX3NpemUsCisJCQllZGlkX2Jsay5zcGtfYWxsb2NfZGF0YV9ibGtfc2l6ZSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb190eXBlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOworCWVudW0gbXNtX2V4dF9kaXNwX2NhYmxlX3N0YXRlIGNhYmxlX3N0YXRlOworCWVudW0gbXNtX2V4dF9kaXNwX3R5cGUgZGlzcF90eXBlOworCWludCByYzsKKworCWNvZGVjX2RhdGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpZiAoIWNvZGVjX2RhdGEgfHwKKwkgICAgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfYXVkaW9fZWRpZF9ibGsgfHwKKwkgICAgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfaW50Zl9pZCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWNfZGF0YSwgZ2V0X2F1ZGlvX2VkaWRfYmxrKCkgb3IgZ2V0X2ludGZfaWQgaXMgTlVMTFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FibGVfc3RhdGUgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuY2FibGVfc3RhdHVzKAorCQkJCSAgIGNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwgMSk7CisJaWYgKElTX0VSUl9WQUxVRShjYWJsZV9zdGF0ZSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEVycm9yIHJldHJpZXZpbmcgY2FibGUgc3RhdGUgZnJvbSBleHRfZGlzcCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIGNhYmxlX3N0YXRlKTsKKwkJcmMgPSBjYWJsZV9zdGF0ZTsKKwkJZ290byBkb25lOworCX0KKworCWNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cyA9IGNhYmxlX3N0YXRlOworCWlmIChjYWJsZV9zdGF0ZSA9PSBFWFRfRElTUExBWV9DQUJMRV9ESVNDT05ORUNUKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBEaXNwbGF5IGNhYmxlIGRpc2Nvbm5lY3RlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlyYyA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkaXNwX3R5cGUgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuZ2V0X2ludGZfaWQoCisJCQkJCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYpOworCWlmICghSVNfRVJSX1ZBTFVFKGRpc3BfdHlwZSkpIHsKKwkJc3dpdGNoIChkaXNwX3R5cGUpIHsKKwkJY2FzZSBFWFRfRElTUExBWV9UWVBFX0RQOgorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRVhUX0RJU1BMQVlfVFlQRV9IRE1JOgorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkaXNwX3R5cGU6JWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGRpc3BfdHlwZSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc3BsYXkgdHlwZTogJWRcbiIsCisJCQlfX2Z1bmNfXywgZGlzcF90eXBlKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IgcmV0cmlldmluZyBkaXNwX3R5cGUgZnJvbSBleHRfZGlzcCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIGRpc3BfdHlwZSk7CisJCXJjID0gZGlzcF90eXBlOworCX0KKworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fZXh0X2Rpc3BfY29kZWNfcnhfY29udHJvbHNbXSA9IHsKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8CisJCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKKwkJLmlmYWNlICA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkJLm5hbWUgICA9ICJIRE1JIEVESUQiLAorCQkuaW5mbyAgID0gbXNtX2V4dF9kaXNwX2VkaWRfY3RsX2luZm8sCisJCS5nZXQgICAgPSBtc21fZXh0X2Rpc3BfZWRpZF9nZXQsCisJfSwKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8CisJCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKKwkJLmlmYWNlICA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkJLm5hbWUgICA9ICJEaXNwbGF5IFBvcnQgRURJRCIsCisJCS5pbmZvICAgPSBtc21fZXh0X2Rpc3BfZWRpZF9jdGxfaW5mbywKKwkJLmdldCAgICA9IG1zbV9leHRfZGlzcF9lZGlkX2dldCwKKwl9LAorCVNPQ19FTlVNX0VYVCgiRXh0ZXJuYWwgRGlzcGxheSBUeXBlIiwgZXh0X2Rpc3BfYXVkaW9fdHlwZSwKKwkJICAgICBtc21fZXh0X2Rpc3BfYXVkaW9fdHlwZV9nZXQsIE5VTEwpLAorfTsKKworc3RhdGljIGludCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGFpX3N0YXJ0dXAoCisJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGEgPQorCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+Y29kZWMtPmRldik7CisKKwlpZiAoIWNvZGVjX2RhdGEgfHwgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5jYWJsZV9zdGF0dXMpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgY29kZWNfZGF0YSBvciBjYWJsZV9zdGF0dXMgaXMgbnVsbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzID0KKwkJY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmNhYmxlX3N0YXR1cygKKwkJY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2LCAxKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cykpIHsKKwkJZGV2X2VycihkYWktPmRldiwKKwkJCSIlcygpIGV4dCBkaXNwIGNvcmUgaXMgbm90IHJlYWR5IChyZXQgdmFsID0gJWQpXG4iLAorCQkJX19mdW5jX18sIGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cyk7CisJCXJldCA9IGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1czsKKwl9IGVsc2UgaWYgKCFjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMpIHsKKwkJZGV2X2VycihkYWktPmRldiwKKwkJCSIlcygpIGV4dCBkaXNwIGNhYmxlIGlzIG5vdCBjb25uZWN0ZWQgKHJldCB2YWwgPSAlZClcbiIsCisJCQlfX2Z1bmNfXywgY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfaHdfcGFyYW1zKAorCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXUzMiBjaGFubmVsX2FsbG9jYXRpb24gPSAwOworCXUzMiBsZXZlbF9zaGlmdCAgPSAwOyAvKiAwZEIgKi8KKwlib29sIGRvd25fbWl4ID0gMDsKKwl1MzIgbnVtX2NoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX3NldHVwX3BhcmFtcyBhdWRpb19zZXR1cF9wYXJhbXMgPSB7MH07CisKKwlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGEgPQorCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+Y29kZWMtPmRldik7CisKKwlpZiAoIWNvZGVjX2RhdGEgfHwgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5hdWRpb19pbmZvX3NldHVwKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogY29kZWNfZGF0YSBvciBhdWRpb19pbmZvX3NldHVwIGlzIG51bGxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJU19FUlJfVkFMVUUoY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzKSkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGRhaS0+ZGV2LAorCQkJIiVzKCkgZXh0IGRpc3AgY29yZSBpcyBub3QgcmVhZHkgKHJldCB2YWwgPSAlZClcbiIsCisJCQlfX2Z1bmNfXywgY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzKTsKKwkJcmV0dXJuIGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1czsKKwl9IGVsc2UgaWYgKCFjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChkYWktPmRldiwKKwkJCSIlcygpIGV4dCBkaXNwIGNhYmxlIGlzIG5vdCBjb25uZWN0ZWQgKHJldCB2YWwgPSAlZClcbiIsCisJCQlfX2Z1bmNfXywgY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLypyZWZlciB0byBIRE1JIHNwZWMgQ0VBLTg2MS1FOiBUYWJsZSAyOCBBdWRpbyBJbmZvRnJhbWUgRGF0YSBCeXRlIDQqLworCXN3aXRjaCAobnVtX2NoYW5uZWxzKSB7CisJY2FzZSAyOgorCQljaGFubmVsX2FsbG9jYXRpb24gID0gMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQljaGFubmVsX2FsbG9jYXRpb24gID0gMHgwMjsvKmRlZmF1bHQgdG8gRkwvRlIvRkMqLworCQlhdWRpb19zZXR1cF9wYXJhbXMuc2FtcGxlX3ByZXNlbnQgPSAweDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJY2hhbm5lbF9hbGxvY2F0aW9uICA9IDB4MDY7LypkZWZhdWx0IHRvIEZML0ZSL0ZDL1JDKi8KKwkJYXVkaW9fc2V0dXBfcGFyYW1zLnNhbXBsZV9wcmVzZW50ID0gMHg3OworCQlicmVhazsKKwljYXNlIDU6CisJCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAweDBBOy8qZGVmYXVsdCB0byBGTC9GUi9GQy9SUi9STCovCisJCWF1ZGlvX3NldHVwX3BhcmFtcy5zYW1wbGVfcHJlc2VudCA9IDB4NzsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQljaGFubmVsX2FsbG9jYXRpb24gID0gMHgwQjsKKwkJYXVkaW9fc2V0dXBfcGFyYW1zLnNhbXBsZV9wcmVzZW50ID0gMHg3OworCQlicmVhazsKKwljYXNlIDc6CisJCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAweDEyOy8qZGVmYXVsdCB0byBGTC9GUi9GQy9STC9SUi9SUkMvUkxDKi8KKwkJYXVkaW9fc2V0dXBfcGFyYW1zLnNhbXBsZV9wcmVzZW50ID0gMHhmOworCQlicmVhazsKKwljYXNlIDg6CisJCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAweDEzOworCQlhdWRpb19zZXR1cF9wYXJhbXMuc2FtcGxlX3ByZXNlbnQgPSAweGY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJpbnZhbGlkIENoYW5uZWxzID0gJXVcbiIsIG51bV9jaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZGFpLT5kZXYsCisJCSIlcygpIG51bV9jaCAldSAgc2FtcGxlcmF0ZSAldSBjaGFubmVsX2FsbG9jYXRpb24gPSAldVxuIiwKKwkJX19mdW5jX18sIG51bV9jaGFubmVscywgcGFyYW1zX3JhdGUocGFyYW1zKSwKKwkJY2hhbm5lbF9hbGxvY2F0aW9uKTsKKworCWF1ZGlvX3NldHVwX3BhcmFtcy5zYW1wbGVfcmF0ZV9oeiA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJYXVkaW9fc2V0dXBfcGFyYW1zLm51bV9vZl9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKwlhdWRpb19zZXR1cF9wYXJhbXMuY2hhbm5lbF9hbGxvY2F0aW9uID0gY2hhbm5lbF9hbGxvY2F0aW9uOworCWF1ZGlvX3NldHVwX3BhcmFtcy5sZXZlbF9zaGlmdCA9IGxldmVsX3NoaWZ0OworCWF1ZGlvX3NldHVwX3BhcmFtcy5kb3duX21peCA9IGRvd25fbWl4OworCisJcmMgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuYXVkaW9faW5mb19zZXR1cCgKKwkJCWNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwgJmF1ZGlvX3NldHVwX3BhcmFtcyk7CisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChkYWktPmRldiwKKwkJCSIlcygpIGV4dCBkaXNwIGNvcmUgaXMgbm90IHJlYWR5LCByYzogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9zaHV0ZG93bigKKwkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByYzsKKworCXN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGF0YSAqY29kZWNfZGF0YSA9CisJCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYy0+ZGV2KTsKKworCWlmICghY29kZWNfZGF0YSB8fCAhY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLnRlYXJkb3duX2RvbmUgfHwKKwkgICAgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5jYWJsZV9zdGF0dXMpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBjb2RlYyBkYXRhIG9yIHRlYXJkb3duX2RvbmUgb3IgY2FibGVfc3RhdHVzIGlzIG51bGxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IGNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5jYWJsZV9zdGF0dXMoCisJCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYsIDApOworCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsCisJCQkiJXM6IGV4dCBkaXNwIGNvcmUgaGFkIHByb2JsZW1zIHJlbGVhc2luZyBhdWRpbyBmbGFnXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy50ZWFyZG93bl9kb25lKAorCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYpOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZV9wYXJlbnQgPSBOVUxMOworCisJY29kZWNfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGF0YSksCisJCUdGUF9LRVJORUwpOworCisJaWYgKCFjb2RlY19kYXRhKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzKCk6IGZhaWwgdG8gYWxsb2NhdGUgZGFpIGRhdGFcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZl9ub2RlX3BhcmVudCA9IG9mX2dldF9wYXJlbnQoY29kZWMtPmRldi0+b2Zfbm9kZSk7CisJaWYgKCFvZl9ub2RlX3BhcmVudCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcygpOiBQYXJlbnQgZGV2aWNlIHRyZWUgbm9kZSBub3QgZm91bmRcbiIsCisJCQkJX19mdW5jX18pOworCQlrZnJlZShjb2RlY19kYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShvZl9ub2RlX3BhcmVudCk7CisJaWYgKCFjb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMoKTogY2FuJ3QgZ2V0IHBhcmVudCBwZGV2XG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKGNvZGVjX2RhdGEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobXNtX2V4dF9kaXNwX3JlZ2lzdGVyX2F1ZGlvX2NvZGVjKGNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwKKwkJCQkmY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcygpOiBjYW4ndCByZWdpc3RlciB3aXRoIGV4dCBkaXNwIGNvcmUiLAorCQkJCV9fZnVuY19fKTsKKwkJa2ZyZWUoY29kZWNfZGF0YSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LCBjb2RlY19kYXRhKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzKCk6IHJlZ2lzdGVyZWQgJXMgd2l0aCBleHQgZGlzcCBjb3JlXG4iLAorCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGF0YSAqY29kZWNfZGF0YTsKKworCWNvZGVjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7CisJa2ZyZWUoY29kZWNfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgICA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfc3RhcnR1cCwKKwkuaHdfcGFyYW1zID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9od19wYXJhbXMsCisJLnNodXRkb3duICA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfc2h1dGRvd24KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlzW10gPSB7CisJeworCQkubmFtZSA9ICJtc21faGRtaV9hdWRpb19jb2RlY19yeF9kYWkiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSERNSSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gNDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlcyA9IE1TTV9FWFRfRElTUF9QQ01fUkFURVMsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCQkub3BzID0gJm1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJtc21fZHBfYXVkaW9fY29kZWNfcnhfZGFpIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gNDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCX0sCisJCS5vcHMgPSAmbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3NvY19kcml2ZXIgPSB7CisJLnByb2JlID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3Byb2JlLAorCS5yZW1vdmUgPSAgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3JlbW92ZSwKKwkuY29udHJvbHMgPSBtc21fZXh0X2Rpc3BfY29kZWNfcnhfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobXNtX2V4dF9kaXNwX2NvZGVjX3J4X2NvbnRyb2xzKSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3BsYXRfcHJvYmUoCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoKTogZGV2IG5hbWUgJXNcbiIsIF9fZnVuY19fLAorCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LAorCQkmbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3NvY19kcml2ZXIsCisJCW1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlzLAorCQlBUlJBWV9TSVpFKG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlzKSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3BsYXRfcmVtb3ZlKAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3BsYXRfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wbGF0X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kcml2ZXIpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0IGRpc3AgY29kZWMgZHJpdmVyIGVycjolZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJfQorCisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQobXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTVNNIEV4dGVybmFsIERpc3BsYXkgQXVkaW8gQ09ERUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zdHViLmMgYi9zb3VuZC9zb2MvY29kZWNzL21zbV9zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlNTVhZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3N0dWIuYwpAQCAtMCwwICsxLDg4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworLyogQSBkdW1teSBkcml2ZXIgdXNlZnVsIG9ubHkgdG8gYWR2ZXJ0aXNlIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9zdHViX2RhaXNbXSA9IHsKKwl7CisJCS5uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLnBsYXliYWNrID0geyAvKiBTdXBwb3J0IG1heGltdW0gcmFuZ2UgKi8KKwkJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCX0sCisJfSwKKwl7CisJCS5uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLmNhcHR1cmUgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLworCQkJLnN0cmVhbV9uYW1lID0gIlJlY29yZCIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19tc21fc3R1YiA9IHt9OworCitzdGF0aWMgaW50IG1zbV9zdHViX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LAorCSZzb2NfbXNtX3N0dWIsIG1zbV9zdHViX2RhaXMsIEFSUkFZX1NJWkUobXNtX3N0dWJfZGFpcykpOworfQorCitzdGF0aWMgaW50IG1zbV9zdHViX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fc3R1Yl9jb2RlY19kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tc3R1Yi1jb2RlYyIsIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9zdHViX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tc3R1Yi1jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fc3R1Yl9jb2RlY19kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1zbV9zdHViX2Rldl9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3N0dWJfZGV2X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9zdHViX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fc3R1Yl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXNtX3N0dWJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fc3R1Yl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9zdHViX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtc21fc3R1Yl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIE1TTSBDT0RFQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLWRzcC1tZ3IuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLWRzcC1tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTEzMDFkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLW1nci5jCkBAIC0wLDAgKzEsMTE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8c29jL3Fjb20vcmFtZHVtcC5oPgorI2luY2x1ZGUgPHNvdW5kL3djZC1kc3AtbWdyLmg+CisjaW5jbHVkZSAid2NkLWRzcC11dGlscy5oIgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGNoYXIgKndkc3BfZ2V0X2NtcG50X3R5cGVfc3RyaW5nKGVudW0gd2RzcF9jbXBudF90eXBlKTsKKworLyogQ29tcG9uZW50IHJlbGF0ZWQgbWFjcm9zICovCisjZGVmaW5lIFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCB4KSAoJih3ZHNwLT5jbXBudHNbeF0pKQorI2RlZmluZSBXRFNQX0dFVF9DTVBOVF9UWVBFX1NUUih4KSB3ZHNwX2dldF9jbXBudF90eXBlX3N0cmluZyh4KQorCisvKgorICogVGhlc2UgI2RlZmluZXMgaW5kaWNhdGUgdGhlIGJpdCBudW1iZXIgaW4gc3RhdHVzIGZpZWxkCisgKiBmb3IgZWFjaCBvZiB0aGUgc3RhdHVzLiBJZiBiaXQgaXMgc2V0LCBpdCBpbmRpY2F0ZXMKKyAqIHRoZSBzdGF0dXMgYXMgZG9uZSwgZWxzZSBpZiBiaXQgaXMgbm90IHNldCwgaXQgaW5kaWNhdGVzCisgKiB0aGUgc3RhdHVzIGlzIGVpdGhlciBmYWlsZWQgb3Igbm90IGRvbmUuCisgKi8KKyNkZWZpbmUgV0RTUF9TVEFUVVNfSU5JVElBTElaRUQgICBCSVQoMCkKKyNkZWZpbmUgV0RTUF9TVEFUVVNfQ09ERV9ETE9BREVEICBCSVQoMSkKKyNkZWZpbmUgV0RTUF9TVEFUVVNfREFUQV9ETE9BREVEICBCSVQoMikKKyNkZWZpbmUgV0RTUF9TVEFUVVNfQk9PVEVEICAgICAgICBCSVQoMykKKworLyogSGVscGVyIG1hY3JvcyBmb3IgcHJpbnRpbmcgd2RzcCBtZXNzYWdlcyAqLworI2RlZmluZSBXRFNQX0VSUih3ZHNwLCBmbXQsIC4uLikJCVwKKwlkZXZfZXJyKHdkc3AtPm1kZXYsICIlczogIiBmbXQgIlxuIiwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisjZGVmaW5lIFdEU1BfREJHKHdkc3AsIGZtdCwgLi4uKQlcCisJZGV2X2RiZyh3ZHNwLT5tZGV2LCAiJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQorCisvKiBIZWxwZXIgbWFjcm9zIGZvciBsb2NraW5nICovCisjZGVmaW5lIFdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgbG9jaykgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJV0RTUF9EQkcod2RzcCwgIm11dGV4X2xvY2soJXMpIiwgICAgICAgIFwKKwkJIF9fc3RyaW5naWZ5XzEobG9jaykpOyAgICAgICAgICBcCisJbXV0ZXhfbG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBXRFNQX01HUl9NVVRFWF9VTkxPQ0sod2RzcCwgbG9jaykgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVdEU1BfREJHKHdkc3AsICJtdXRleF91bmxvY2soJXMpIiwgICAgICBcCisJCSBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICAgICAgXAorCW11dGV4X3VubG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIEhlbHBlciBtYWNyb3MgZm9yIHVzaW5nIHN0YXR1cyBtYXNrICovCisjZGVmaW5lIFdEU1BfU0VUX1NUQVRVUyh3ZHNwLCBzdGF0ZSkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJd2RzcC0+c3RhdHVzIHw9IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlXRFNQX0RCRyh3ZHNwLCAic2V0IDB4JWx4LCBuZXdfc3RhdGUgPSAweCV4IiwgXAorCQkgc3RhdGUsIHdkc3AtPnN0YXR1cyk7ICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBzdGF0ZSkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl3ZHNwLT5zdGF0dXMgJj0gKH5zdGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisJV0RTUF9EQkcod2RzcCwgImNsZWFyIDB4JWx4LCBuZXdfc3RhdGUgPSAweCV4IiwgXAorCQkgc3RhdGUsIHdkc3AtPnN0YXR1cyk7ICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBzdGF0ZSkgKHdkc3AtPnN0YXR1cyAmIHN0YXRlKQorCisvKiBTU1IgcmVsYXRlIHN0YXR1cyBtYWNyb3MgKi8KKyNkZWZpbmUgV0RTUF9TU1JfU1RBVFVTX1dEU1BfUkVBRFkgICAgQklUKDApCisjZGVmaW5lIFdEU1BfU1NSX1NUQVRVU19DRENfUkVBRFkgICAgIEJJVCgxKQorI2RlZmluZSBXRFNQX1NTUl9TVEFUVVNfUkVBRFkgICAgICAgICBcCisJKFdEU1BfU1NSX1NUQVRVU19XRFNQX1JFQURZIHwgV0RTUF9TU1JfU1RBVFVTX0NEQ19SRUFEWSkKKyNkZWZpbmUgV0RTUF9TU1JfUkVBRFlfV0FJVF9USU1FT1VUICAgKDEwICogSFopCisKK2VudW0gd2RzcF9zc3JfdHlwZSB7CisKKwkvKiBJbml0IHZhbHVlLCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm8gU1NSIGluIHByb2dyZXNzICovCisJV0RTUF9TU1JfVFlQRV9OT19TU1IgPSAwLAorCisJLyoKKwkgKiBJbmRpY2F0ZXMgV0RTUCBjcmFzaGVkLiBUaGUgbWFuYWdlciBkcml2ZXIgaW50ZXJuYWxseQorCSAqIGRlY2lkZXMgd2hlbiB0byBwZXJmb3JtIFdEU1AgcmVzdGFydCBiYXNlZCBvbiB0aGUKKwkgKiB1c2VycyBvZiB3ZHNwLiBIZW5jZSB0aGVyZSBpcyBubyBleHBsaWNpdCBXRFNQX1VQLgorCSAqLworCVdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOLAorCisJLyogSW5kaWNhdGVzIGNvZGVjIGhhcmR3YXJlIGlzIGRvd24gKi8KKwlXRFNQX1NTUl9UWVBFX0NEQ19ET1dOLAorCisJLyogSW5kaWNhdGVzIGNvZGVjIGhhcmR3YXJlIGlzIHVwLCB0cmlnZ2VyIHRvIHJlc3RhcnQgV0RTUCAqLworCVdEU1BfU1NSX1RZUEVfQ0RDX1VQLAorfTsKKworc3RydWN0IHdkc3BfY21wbnQgeworCisJLyogT0Ygbm9kZSBvZiB0aGUgcGhhbmRsZSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwkvKgorCSAqIENoaWxkIGNvbXBvbmVudCdzIGRldl9uYW1lLCBzaG91bGQgYmUgc2V0IGluIERUIGZvciB0aGUgY2hpbGQncworCSAqIHBoYW5kbGUgaWYgY2hpbGQncyBkZXYtPm9mX25vZGUgZG9lcyBub3QgbWF0Y2ggdGhlIHBoYW5kbGUtPm9mX25vZGUKKwkgKi8KKwljb25zdCBjaGFyICpjZGV2X25hbWU7CisKKwkvKiBDaGlsZCBjb21wb25lbnQncyBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBkZXZpY2UgKmNkZXY7CisKKwkvKiBQcml2YXRlIGRhdGEgdGhhdCBjb21wb25lbnQgbWF5IHdhbnQgYmFjayBvbiBjYWxsYmFja3MgKi8KKwl2b2lkICpwcml2X2RhdGE7CisKKwkvKiBDaGlsZCBvcHMgKi8KKwlzdHJ1Y3Qgd2RzcF9jbXBudF9vcHMgKm9wczsKK307CisKK3N0cnVjdCB3ZHNwX3JhbWR1bXBfZGF0YSB7CisKKwkvKiBSYW1kdW1wIGRldmljZSAqLworCXZvaWQgKnJkX2RldjsKKworCS8qIERNQSBhZGRyZXNzIG9mIHRoZSBkdW1wICovCisJZG1hX2FkZHJfdCByZF9hZGRyOworCisJLyogVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBkdW1wICovCisJdm9pZCAqcmRfdl9hZGRyOworCisJLyogRGF0YSBwcm92aWRlZCB0aHJvdWdoIGVycm9yIGludGVycnVwdCAqLworCXN0cnVjdCB3ZHNwX2Vycl9zaWduYWxfYXJnIGVycl9kYXRhOworfTsKKworc3RydWN0IHdkc3BfbWdyX3ByaXYgeworCisJLyogTWFuYWdlciBkcml2ZXIncyBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZGV2aWNlICptZGV2OworCisJLyogTWF0Y2ggc3RydWN0IGZvciBjb21wb25lbnQgZnJhbWV3b3JrICovCisJc3RydWN0IGNvbXBvbmVudF9tYXRjaCAqbWF0Y2g7CisKKwkvKiBNYW5hZ2VyJ3Mgb3BzL2Z1bmN0aW9uIGNhbGxiYWNrcyAqLworCXN0cnVjdCB3ZHNwX21ncl9vcHMgKm9wczsKKworCS8qIEFycmF5IHRvIHN0b3JlIGluZm9ybWF0aW9uIGZvciBhbGwgZXhwZWN0ZWQgY29tcG9uZW50cyAqLworCXN0cnVjdCB3ZHNwX2NtcG50IGNtcG50c1tXRFNQX0NNUE5UX1RZUEVfTUFYXTsKKworCS8qIFRoZSBmaWxlbmFtZSBvZiBpbWFnZSB0byBiZSBkb3dubG9hZGVkICovCisJY29uc3QgY2hhciAqaW1nX2ZuYW1lOworCisJLyogS2VlcHMgdHJhY2sgb2YgY3VycmVudCBzdGF0ZSBvZiBtYW5hZ2VyIGRyaXZlciAqLworCXUzMiBzdGF0dXM7CisKKwkvKiBXb3JrIHRvIGxvYWQgdGhlIGZpcm13YXJlIGltYWdlIGFmdGVyIGNvbXBvbmVudCBiaW5kaW5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IGxvYWRfZndfd29yazsKKworCS8qIExpc3Qgb2Ygc2VnbWVudHMgaW4gaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgKnNlZ19saXN0OworCisJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBpbWFnZSBpbiBtZW1vcnkgKi8KKwl1MzIgYmFzZV9hZGRyOworCisJLyogSW5zdGFuY2VzIHVzaW5nIGRzcCAqLworCWludCBkc3BfdXNlcnM7CisKKwkvKiBMb2NrIGZvciBzZXJpYWxpemluZyBvcHMgY2FsbGVkIGJ5IGNvbXBvbmVudHMgKi8KKwlzdHJ1Y3QgbXV0ZXggYXBpX211dGV4OworCisJc3RydWN0IHdkc3BfcmFtZHVtcF9kYXRhIGR1bXBfZGF0YTsKKworCS8qIFNTUiByZWxhdGVkICovCisJZW51bSB3ZHNwX3Nzcl90eXBlIHNzcl90eXBlOworCXN0cnVjdCBtdXRleCBzc3JfbXV0ZXg7CisJc3RydWN0IHdvcmtfc3RydWN0IHNzcl93b3JrOworCXUxNiByZWFkeV9zdGF0dXM7CisJc3RydWN0IGNvbXBsZXRpb24gcmVhZHlfY29tcGw7Cit9OworCitzdGF0aWMgY2hhciAqd2RzcF9nZXRfc3NyX3R5cGVfc3RyaW5nKGVudW0gd2RzcF9zc3JfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgV0RTUF9TU1JfVFlQRV9OT19TU1I6CisJCXJldHVybiAiTk9fU1NSIjsKKwljYXNlIFdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOOgorCQlyZXR1cm4gIldEU1BfRE9XTiI7CisJY2FzZSBXRFNQX1NTUl9UWVBFX0NEQ19ET1dOOgorCQlyZXR1cm4gIkNEQ19ET1dOIjsKKwljYXNlIFdEU1BfU1NSX1RZUEVfQ0RDX1VQOgorCQlyZXR1cm4gIkNEQ19VUCI7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzc3JfdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCB0eXBlKTsKKwkJcmV0dXJuICJJbnZhbGlkIjsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICp3ZHNwX2dldF9jbXBudF90eXBlX3N0cmluZyhlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgV0RTUF9DTVBOVF9DT05UUk9MOgorCQlyZXR1cm4gImNvbnRyb2wiOworCWNhc2UgV0RTUF9DTVBOVF9JUEM6CisJCXJldHVybiAiaXBjIjsKKwljYXNlIFdEU1BfQ01QTlRfVFJBTlNQT1JUOgorCQlyZXR1cm4gInRyYW5zcG9ydCI7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb21wb25lbnQgdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCB0eXBlKTsKKwkJcmV0dXJuICJJbnZhbGlkIjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fd2RzcF9jbHJfcmVhZHlfbG9ja2VkKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLAorCQkJCSAgICB1MTYgdmFsdWUpCit7CisJd2RzcC0+cmVhZHlfc3RhdHVzICY9IH4odmFsdWUpOworCVdEU1BfREJHKHdkc3AsICJyZWFkeV9zdGF0dXMgPSAweCV4Iiwgd2RzcC0+cmVhZHlfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX193ZHNwX3NldF9yZWFkeV9sb2NrZWQoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AsCisJCQkJICAgIHUxNiB2YWx1ZSwgYm9vbCBtYXJrX2NvbXBsZXRlKQoreworCXdkc3AtPnJlYWR5X3N0YXR1cyB8PSB2YWx1ZTsKKwlXRFNQX0RCRyh3ZHNwLCAicmVhZHlfc3RhdHVzID0gMHgleCIsIHdkc3AtPnJlYWR5X3N0YXR1cyk7CisKKwlpZiAobWFya19jb21wbGV0ZSAmJgorCSAgICB3ZHNwLT5yZWFkeV9zdGF0dXMgPT0gV0RTUF9TU1JfU1RBVFVTX1JFQURZKSB7CisJCVdEU1BfREJHKHdkc3AsICJtYXJraW5nIHJlYWR5IGNvbXBsZXRpb24iKTsKKwkJY29tcGxldGUoJndkc3AtPnJlYWR5X2NvbXBsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdkc3BfYnJvYWRjYXN0X2V2ZW50X3Vwc2VxKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLAorCQkJCSAgICAgICBlbnVtIHdkc3BfZXZlbnRfdHlwZSBldmVudCwKKwkJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0RTUF9DTVBOVF9UWVBFX01BWDsgaSsrKSB7CisJCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIGkpOworCQlpZiAoY21wbnQgJiYgY21wbnQtPm9wcyAmJiBjbXBudC0+b3BzLT5ldmVudF9oYW5kbGVyKQorCQkJY21wbnQtPm9wcy0+ZXZlbnRfaGFuZGxlcihjbXBudC0+Y2RldiwgY21wbnQtPnByaXZfZGF0YSwKKwkJCQkJCSAgZXZlbnQsIGRhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcShzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKKwkJCQkJIGVudW0gd2RzcF9ldmVudF90eXBlIGV2ZW50LAorCQkJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSBXRFNQX0NNUE5UX1RZUEVfTUFYIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgaSk7CisJCWlmIChjbXBudCAmJiBjbXBudC0+b3BzICYmIGNtcG50LT5vcHMtPmV2ZW50X2hhbmRsZXIpCisJCQljbXBudC0+b3BzLT5ldmVudF9oYW5kbGVyKGNtcG50LT5jZGV2LCBjbXBudC0+cHJpdl9kYXRhLAorCQkJCQkJICBldmVudCwgZGF0YSk7CisJfQorfQorCitzdGF0aWMgaW50IHdkc3BfdW5pY2FzdF9ldmVudChzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKKwkJCSAgICAgIGVudW0gd2RzcF9jbXBudF90eXBlIHR5cGUsCisJCQkgICAgICBlbnVtIHdkc3BfZXZlbnRfdHlwZSBldmVudCwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OworCWludCByZXQ7CisKKwljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCB0eXBlKTsKKwlpZiAoY21wbnQgJiYgY21wbnQtPm9wcyAmJiBjbXBudC0+b3BzLT5ldmVudF9oYW5kbGVyKSB7CisJCXJldCA9IGNtcG50LT5vcHMtPmV2ZW50X2hhbmRsZXIoY21wbnQtPmNkZXYsIGNtcG50LT5wcml2X2RhdGEsCisJCQkJCQlldmVudCwgZGF0YSk7CisJfSBlbHNlIHsKKwkJV0RTUF9FUlIod2RzcCwgIm5vdCB2YWxpZCBldmVudF9oYW5kbGVyIGZvciAlcyIsCisJCQkgV0RTUF9HRVRfQ01QTlRfVFlQRV9TVFIodHlwZSkpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdkc3BfZGVpbml0X2NvbXBvbmVudHMoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCit7CisJc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OworCWludCBpOworCisJZm9yIChpID0gV0RTUF9DTVBOVF9UWVBFX01BWCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIGkpOworCQlpZiAoY21wbnQgJiYgY21wbnQtPm9wcyAmJiBjbXBudC0+b3BzLT5kZWluaXQpCisJCQljbXBudC0+b3BzLT5kZWluaXQoY21wbnQtPmNkZXYsIGNtcG50LT5wcml2X2RhdGEpOworCX0KK30KKworc3RhdGljIGludCB3ZHNwX2luaXRfY29tcG9uZW50cyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKK3sKKwlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQ7CisJaW50IGZhaWxfaWR4ID0gV0RTUF9DTVBOVF9UWVBFX01BWDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBXRFNQX0NNUE5UX1RZUEVfTUFYOyBpKyspIHsKKworCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKKworCQkvKiBJbml0IGlzIGFsbG93ZWQgdG8gYmUgTlVMTCAqLworCQlpZiAoIWNtcG50LT5vcHMgfHwgIWNtcG50LT5vcHMtPmluaXQpCisJCQljb250aW51ZTsKKwkJcmV0ID0gY21wbnQtPm9wcy0+aW5pdChjbXBudC0+Y2RldiwgY21wbnQtPnByaXZfZGF0YSk7CisJCWlmIChyZXQpIHsKKwkJCVdEU1BfRVJSKHdkc3AsICJJbml0IGZhaWxlZCAoJWQpIGZvciBjb21wb25lbnQgJXMiLAorCQkJCSByZXQsIFdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKGkpKTsKKwkJCQlmYWlsX2lkeCA9IGk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmFpbF9pZHggPCBXRFNQX0NNUE5UX1RZUEVfTUFYKSB7CisJCS8qIFVuZG8gaW5pdCBmb3IgYWxyZWFkeSBpbml0aWFsaXplZCBjb21wb25lbnRzICovCisJCWZvciAoaSA9IGZhaWxfaWR4IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKKworCQkJaWYgKGNtcG50LT5vcHMgJiYgY21wbnQtPm9wcy0+ZGVpbml0KQorCQkJCWNtcG50LT5vcHMtPmRlaW5pdChjbXBudC0+Y2RldiwKKwkJCQkJCSAgIGNtcG50LT5wcml2X2RhdGEpOworCQl9CisJfSBlbHNlIHsKKwkJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLCBXRFNQX0VWRU5UX1BPU1RfSU5JVCwgTlVMTCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3ZHNwX2xvYWRfZWFjaF9zZWdtZW50KHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLAorCQkJCSAgc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZykKK3sKKwlzdHJ1Y3Qgd2RzcF9pbWdfc2VjdGlvbiBpbWdfc2VjdGlvbjsKKwlpbnQgcmV0OworCisJV0RTUF9EQkcod2RzcCwKKwkJICJiYXNlX2FkZHIgMHgleCwgc3BsaXRfZm5hbWUgJXMsIGxvYWRfYWRkciAweCV4LCBzaXplIDB4JXp4IiwKKwkJIHdkc3AtPmJhc2VfYWRkciwgc2VnLT5zcGxpdF9mbmFtZSwgc2VnLT5sb2FkX2FkZHIsIHNlZy0+c2l6ZSk7CisKKwlpZiAoc2VnLT5sb2FkX2FkZHIgPCB3ZHNwLT5iYXNlX2FkZHIpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkludmFsaWQgYWRkciAweCV4LCBiYXNlX2FkZHIgPSAweCV4IiwKKwkJCSBzZWctPmxvYWRfYWRkciwgd2RzcC0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW1nX3NlY3Rpb24uYWRkciA9IHNlZy0+bG9hZF9hZGRyIC0gd2RzcC0+YmFzZV9hZGRyOworCWltZ19zZWN0aW9uLnNpemUgPSBzZWctPnNpemU7CisJaW1nX3NlY3Rpb24uZGF0YSA9IHNlZy0+ZGF0YTsKKworCXJldCA9IHdkc3BfdW5pY2FzdF9ldmVudCh3ZHNwLCBXRFNQX0NNUE5UX1RSQU5TUE9SVCwKKwkJCQkgV0RTUF9FVkVOVF9ETE9BRF9TRUNUSU9OLAorCQkJCSAmaW1nX3NlY3Rpb24pOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJV0RTUF9FUlIod2RzcCwKKwkJCSAiRmFpbGVkLCBlcnIgPSAlZCBmb3IgYmFzZV9hZGRyID0gMHgleCBzcGxpdF9mbmFtZSA9ICVzLCBsb2FkX2FkZHIgPSAweCV4LCBzaXplID0gMHglengiLAorCQkJIHJldCwgd2RzcC0+YmFzZV9hZGRyLCBzZWctPnNwbGl0X2ZuYW1lLAorCQkJIHNlZy0+bG9hZF9hZGRyLCBzZWctPnNpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9kb3dubG9hZF9zZWdtZW50cyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKKwkJCQkgIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCB3ZHNwX2NtcG50ICpjdGw7CisJc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZyA9IE5VTEw7CisJZW51bSB3ZHNwX2V2ZW50X3R5cGUgcHJlLCBwb3N0OworCWxvbmcgc3RhdHVzOworCWludCByZXQ7CisKKwljdGwgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgV0RTUF9DTVBOVF9DT05UUk9MKTsKKworCWlmICh0eXBlID09IFdEU1BfRUxGX0ZMQUdfUkUpIHsKKwkJcHJlID0gV0RTUF9FVkVOVF9QUkVfRExPQURfQ09ERTsKKwkJcG9zdCA9IFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9DT0RFOworCQlzdGF0dXMgPSBXRFNQX1NUQVRVU19DT0RFX0RMT0FERUQ7CisJfSBlbHNlIGlmICh0eXBlID09IFdEU1BfRUxGX0ZMQUdfV1JJVEUpIHsKKwkJcHJlID0gV0RTUF9FVkVOVF9QUkVfRExPQURfREFUQTsKKwkJcG9zdCA9IFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9EQVRBOworCQlzdGF0dXMgPSBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQ7CisJfSBlbHNlIHsKKwkJV0RTUF9FUlIod2RzcCwgIkludmFsaWQgdHlwZSAldSIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB3ZHNwX2dldF9zZWdtZW50X2xpc3QoY3RsLT5jZGV2LCB3ZHNwLT5pbWdfZm5hbWUsCisJCQkJICAgIHR5cGUsIHdkc3AtPnNlZ19saXN0LCAmd2RzcC0+YmFzZV9hZGRyKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkgfHwKKwkgICAgbGlzdF9lbXB0eSh3ZHNwLT5zZWdfbGlzdCkpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkVycm9yICVkIHRvIGdldCBpbWFnZSBzZWdtZW50cyBmb3IgdHlwZSAlZCIsCisJCQkgcmV0LCB0eXBlKTsKKwkJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLCBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRCwKKwkJCQkJICAgICBOVUxMKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIE5vdGlmeSBhbGwgY29tcG9uZW50cyB0aGF0IGltYWdlIGlzIGFib3V0IHRvIGJlIGRvd25sb2FkZWQgKi8KKwl3ZHNwX2Jyb2FkY2FzdF9ldmVudF91cHNlcSh3ZHNwLCBwcmUsIE5VTEwpOworCisJLyogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBzZWdtZW50cyBhbmQgZG93bmxvYWQgb25lIGJ5IG9uZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnLCB3ZHNwLT5zZWdfbGlzdCwgbGlzdCkgeworCQlyZXQgPSB3ZHNwX2xvYWRfZWFjaF9zZWdtZW50KHdkc3AsIHNlZyk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLAorCQkJCQkJICAgICBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRCwKKwkJCQkJCSAgICAgTlVMTCk7CisJCQlnb3RvIGRsb2FkX2Vycm9yOworCQl9CisJfQorCisJV0RTUF9TRVRfU1RBVFVTKHdkc3AsIHN0YXR1cyk7CisKKwkvKiBOb3RpZnkgYWxsIGNvbXBvbmVudHMgdGhhdCBpbWFnZSBpcyBkb3dubG9hZGVkICovCisJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLCBwb3N0LCBOVUxMKTsKKworZGxvYWRfZXJyb3I6CisJd2RzcF9mbHVzaF9zZWdtZW50X2xpc3Qod2RzcC0+c2VnX2xpc3QpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkc3BfaW5pdF9hbmRfZGxvYWRfY29kZV9zZWN0aW9ucyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKK3sKKwlpbnQgcmV0OworCWJvb2wgaXNfaW5pdGlhbGl6ZWQ7CisKKwlpc19pbml0aWFsaXplZCA9IFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19JTklUSUFMSVpFRCk7CisKKwlpZiAoIWlzX2luaXRpYWxpemVkKSB7CisJCS8qIENvbXBvbmVudHMgYXJlIG5vdCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlbSAqLworCQlyZXQgPSB3ZHNwX2luaXRfY29tcG9uZW50cyh3ZHNwKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlXRFNQX0VSUih3ZHNwLCAiSU5JVCBmYWlsZWQsIGVyciA9ICVkIiwgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlXRFNQX1NFVF9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfSU5JVElBTElaRUQpOworCX0KKworCS8qIERvd25sb2FkIHRoZSByZWFkLWV4ZWN1dGUgc2VjdGlvbnMgb2YgaW1hZ2UgKi8KKwlyZXQgPSB3ZHNwX2Rvd25sb2FkX3NlZ21lbnRzKHdkc3AsIFdEU1BfRUxGX0ZMQUdfUkUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlXRFNQX0VSUih3ZHNwLCAiRXJyb3IgJWQgdG8gZG93bmxvYWQgY29kZSBzZWN0aW9ucyIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdkc3BfbG9hZF9md19pbWFnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7CisJaW50IHJldDsKKworCXdkc3AgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdkc3BfbWdyX3ByaXYsIGxvYWRfZndfd29yayk7CisJaWYgKCF3ZHNwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZV9kYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSB3ZHNwX2luaXRfYW5kX2Rsb2FkX2NvZGVfc2VjdGlvbnMod2RzcCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlXRFNQX0VSUih3ZHNwLCAiZGxvYWQgY29kZSBzZWN0aW9ucyBmYWlsZWQsIGVyciA9ICVkIiwgcmV0KTsKK30KKworc3RhdGljIGludCB3ZHNwX2VuYWJsZV9kc3Aoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCit7CisJaW50IHJldDsKKworCS8qIE1ha2Ugc3VyZSB3ZHNwIGlzIGluIGdvb2Qgc3RhdGUgKi8KKwlpZiAoIVdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19DT0RFX0RMT0FERUQpKSB7CisJCVdEU1BfRVJSKHdkc3AsICJXRFNQIGluIGludmFsaWQgc3RhdGUgMHgleCIsIHdkc3AtPnN0YXR1cyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBEb3dubG9hZCB0aGUgcmVhZC13cml0ZSBzZWN0aW9ucyBvZiBpbWFnZSAqLworCXJldCA9IHdkc3BfZG93bmxvYWRfc2VnbWVudHMod2RzcCwgV0RTUF9FTEZfRkxBR19XUklURSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCVdEU1BfRVJSKHdkc3AsICJEYXRhIHNlY3Rpb24gZG93bmxvYWQgZmFpbGVkLCBlcnIgPSAlZCIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3ZHNwX2Jyb2FkY2FzdF9ldmVudF91cHNlcSh3ZHNwLCBXRFNQX0VWRU5UX1BSRV9CT09UVVAsIE5VTEwpOworCisJcmV0ID0gd2RzcF91bmljYXN0X2V2ZW50KHdkc3AsIFdEU1BfQ01QTlRfQ09OVFJPTCwKKwkJCQkgV0RTUF9FVkVOVF9ET19CT09ULCBOVUxMKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkZhaWxlZCB0byBib290IGRzcCwgZXJyID0gJWQiLCByZXQpOworCQlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQpOworCQlnb3RvIGRvbmU7CisJfQorCisJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLCBXRFNQX0VWRU5UX1BPU1RfQk9PVFVQLCBOVUxMKTsKKwlXRFNQX1NFVF9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfQk9PVEVEKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3ZHNwX2Rpc2FibGVfZHNwKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwKQoreworCWludCByZXQ7CisKKwlXRFNQX01HUl9NVVRFWF9MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7CisKKwkvKgorCSAqIElmIERpc2FibGUgaGFwcGVuZWQgd2hpbGUgU1NSIGlzIGluIHByb2dyZXNzLCB0aGVuIHNldCB0aGUgU1NSCisJICogcmVhZHkgc3RhdHVzIGluZGljYXRpbmcgV0RTUCBpcyBub3cgcmVhZHkuIElnbm9yZSB0aGUgZGlzYWJsZQorCSAqIGV2ZW50IGhlcmUgYW5kIGxldCB0aGUgU1NSIGhhbmRsZXIgZ28gdGhyb3VnaCBzaHV0ZG93bi4KKwkgKi8KKwlpZiAod2RzcC0+c3NyX3R5cGUgIT0gV0RTUF9TU1JfVFlQRV9OT19TU1IpIHsKKwkJX193ZHNwX3NldF9yZWFkeV9sb2NrZWQod2RzcCwgV0RTUF9TU1JfU1RBVFVTX1dEU1BfUkVBRFksIHRydWUpOworCQlXRFNQX01HUl9NVVRFWF9VTkxPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7CisKKwkvKiBNYWtlIHN1cmUgd2RzcCBpcyBpbiBnb29kIHN0YXRlICovCisJaWYgKCFXRFNQX1NUQVRVU19JU19TRVQod2RzcCwgV0RTUF9TVEFUVVNfQk9PVEVEKSkgeworCQlXRFNQX0VSUih3ZHNwLCAid2RzcCBpbiBpbnZhbGlkIHN0YXRlIDB4JXgiLCB3ZHNwLT5zdGF0dXMpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLCBXRFNQX0VWRU5UX1BSRV9TSFVURE9XTiwgTlVMTCk7CisJcmV0ID0gd2RzcF91bmljYXN0X2V2ZW50KHdkc3AsIFdEU1BfQ01QTlRfQ09OVFJPTCwKKwkJCQkgV0RTUF9FVkVOVF9ET19TSFVURE9XTiwgTlVMTCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgdG8gc2h1dGRvd24gZHNwLCBlcnIgPSAlZCIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3ZHNwX2Jyb2FkY2FzdF9ldmVudF9kb3duc2VxKHdkc3AsIFdEU1BfRVZFTlRfUE9TVF9TSFVURE9XTiwgTlVMTCk7CisJV0RTUF9DTEVBUl9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfQk9PVEVEKTsKKworCS8qIERhdGEgc2VjdGlvbnMgYXJlIHRvIGJlIGRvd25sb2FkZWQgcGVyIGJvb3QgKi8KKwlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkc3BfcmVnaXN0ZXJfY21wbnRfb3BzKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQkJICAgdm9pZCAqcHJpdl9kYXRhLAorCQkJCSAgIHN0cnVjdCB3ZHNwX2NtcG50X29wcyAqb3BzKQoreworCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOworCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKKwlpbnQgaSwgcmV0OworCisJaWYgKCF3ZHNwX2RldiB8fCAhY2RldiB8fCAhb3BzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOworCisJV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IFdEU1BfQ01QTlRfVFlQRV9NQVg7IGkrKykgeworCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKKwkJaWYgKChjZGV2LT5vZl9ub2RlICYmIGNkZXYtPm9mX25vZGUgPT0gY21wbnQtPm5wKSB8fAorCQkgICAgKGNtcG50LT5jZGV2X25hbWUgJiYKKwkJICAgICAhc3RyY21wKGRldl9uYW1lKGNkZXYpLCBjbXBudC0+Y2Rldl9uYW1lKSkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gV0RTUF9DTVBOVF9UWVBFX01BWCkgeworCQlXRFNQX0VSUih3ZHNwLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCBkZXYgJXMiLAorCQkJIGRldl9uYW1lKGNkZXYpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWNtcG50LT5jZGV2ID0gY2RldjsKKwljbXBudC0+b3BzID0gb3BzOworCWNtcG50LT5wcml2X2RhdGEgPSBwcml2X2RhdGE7Citkb25lOgorCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZSAqd2RzcF9nZXRfZGV2X2Zvcl9jbXBudChzdHJ1Y3QgZGV2aWNlICp3ZHNwX2RldiwKKwkJCQkJICAgICBlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlKQoreworCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOworCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKKworCWlmICghd2RzcF9kZXYgfHwgdHlwZSA+PSBXRFNQX0NNUE5UX1RZUEVfTUFYKQorCQlyZXR1cm4gTlVMTDsKKworCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOworCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIHR5cGUpOworCisJcmV0dXJuIGNtcG50LT5jZGV2OworfQorCitzdGF0aWMgdm9pZCB3ZHNwX2NvbGxlY3RfcmFtZHVtcHMoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCit7CisJc3RydWN0IHdkc3BfaW1nX3NlY3Rpb24gaW1nX3NlY3Rpb247CisJc3RydWN0IHdkc3BfZXJyX3NpZ25hbF9hcmcgKmRhdGEgPSAmd2RzcC0+ZHVtcF9kYXRhLmVycl9kYXRhOworCXN0cnVjdCByYW1kdW1wX3NlZ21lbnQgcmRfc2VnOworCWludCByZXQgPSAwOworCisJaWYgKHdkc3AtPnNzcl90eXBlICE9IFdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOIHx8CisJICAgICFkYXRhLT5tZW1fZHVtcHNfZW5hYmxlZCkgeworCQlXRFNQX0RCRyh3ZHNwLCAiY2Fubm90IGR1bXAgbWVtb3J5LCBzc3JfdHlwZSAlcywgZHVtcHMgJXMiLAorCQkJIHdkc3BfZ2V0X3Nzcl90eXBlX3N0cmluZyh3ZHNwLT5zc3JfdHlwZSksCisJCQkgIShkYXRhLT5tZW1fZHVtcHNfZW5hYmxlZCkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChkYXRhLT5kdW1wX3NpemUgPT0gMCB8fAorCSAgICBkYXRhLT5yZW1vdGVfc3RhcnRfYWRkciA8IHdkc3AtPmJhc2VfYWRkcikgeworCQlXRFNQX0VSUih3ZHNwLCAiSW52YWxpZCBzdGFydCBhZGRyIDB4JXggb3IgZHVtcF9zaXplIDB4JXp4IiwKKwkJCSBkYXRhLT5yZW1vdGVfc3RhcnRfYWRkciwgZGF0YS0+ZHVtcF9zaXplKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICghd2RzcC0+ZHVtcF9kYXRhLnJkX2RldikgeworCQlXRFNQX0VSUih3ZHNwLCAiUmFtZHVtcCBkZXZpY2UgaXMgbm90IHNldHVwIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlXRFNQX0RCRyh3ZHNwLCAiYmFzZV9hZGRyIDB4JXgsIGR1bXBfc3RhcnRfYWRkciAweCV4LCBkdW1wX3NpemUgMHglengiLAorCQkgd2RzcC0+YmFzZV9hZGRyLCBkYXRhLT5yZW1vdGVfc3RhcnRfYWRkciwgZGF0YS0+ZHVtcF9zaXplKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZHVtcHMgKi8KKwl3ZHNwLT5kdW1wX2RhdGEucmRfdl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHdkc3AtPm1kZXYsCisJCQkJCQkgICAgICAgZGF0YS0+ZHVtcF9zaXplLAorCQkJCQkJICAgICAgICZ3ZHNwLT5kdW1wX2RhdGEucmRfYWRkciwKKwkJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkc3AtPmR1bXBfZGF0YS5yZF92X2FkZHIpCisJCWdvdG8gZG9uZTsKKworCWltZ19zZWN0aW9uLmFkZHIgPSBkYXRhLT5yZW1vdGVfc3RhcnRfYWRkciAtIHdkc3AtPmJhc2VfYWRkcjsKKwlpbWdfc2VjdGlvbi5zaXplID0gZGF0YS0+ZHVtcF9zaXplOworCWltZ19zZWN0aW9uLmRhdGEgPSB3ZHNwLT5kdW1wX2RhdGEucmRfdl9hZGRyOworCisJcmV0ID0gd2RzcF91bmljYXN0X2V2ZW50KHdkc3AsIFdEU1BfQ01QTlRfVFJBTlNQT1JULAorCQkJCSBXRFNQX0VWRU5UX1JFQURfU0VDVElPTiwKKwkJCQkgJmltZ19zZWN0aW9uKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkZhaWxlZCB0byByZWFkIGR1bXBzLCBzaXplIDB4JXp4IGF0IGFkZHIgMHgleCIsCisJCQkgaW1nX3NlY3Rpb24uc2l6ZSwgaW1nX3NlY3Rpb24uYWRkcik7CisJCWdvdG8gZXJyX3JlYWRfZHVtcHM7CisJfQorCisJcmRfc2VnLmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgd2RzcC0+ZHVtcF9kYXRhLnJkX3ZfYWRkcjsKKwlyZF9zZWcuc2l6ZSA9IGltZ19zZWN0aW9uLnNpemU7CisJcmRfc2VnLnZfYWRkcmVzcyA9IHdkc3AtPmR1bXBfZGF0YS5yZF92X2FkZHI7CisKKwlyZXQgPSBkb19yYW1kdW1wKHdkc3AtPmR1bXBfZGF0YS5yZF9kZXYsICZyZF9zZWcsIDEpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJV0RTUF9FUlIod2RzcCwgImRvX3JhbWR1bXAgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCByZXQpOworCitlcnJfcmVhZF9kdW1wczoKKwlkbWFfZnJlZV9jb2hlcmVudCh3ZHNwLT5tZGV2LCBkYXRhLT5kdW1wX3NpemUsCisJCQkgIHdkc3AtPmR1bXBfZGF0YS5yZF92X2FkZHIsIHdkc3AtPmR1bXBfZGF0YS5yZF9hZGRyKTsKK2RvbmU6CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3ZHNwX3Nzcl93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcDsKKwlpbnQgcmV0OworCisJd2RzcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiwgc3NyX3dvcmspOworCWlmICghd2RzcCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOworCisJLyogSXNzdWUgcmFtZHVtcHMgYW5kIHNodXRkb3duIG9ubHkgaWYgRFNQIGlzIGN1cnJlbnRseSBib290ZWQgKi8KKwlpZiAoV0RTUF9TVEFUVVNfSVNfU0VUKHdkc3AsIFdEU1BfU1RBVFVTX0JPT1RFRCkpIHsKKwkJd2RzcF9jb2xsZWN0X3JhbWR1bXBzKHdkc3ApOworCQlyZXQgPSB3ZHNwX3VuaWNhc3RfZXZlbnQod2RzcCwgV0RTUF9DTVBOVF9DT05UUk9MLAorCQkJCQkgV0RTUF9FVkVOVF9ET19TSFVURE9XTiwgTlVMTCk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgV0RTUCBzaHV0ZG93biwgZXJyID0gJWQiLCByZXQpOworCisJCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QT1NUX1NIVVRET1dOLAorCQkJCQkgICAgIE5VTEwpOworCQlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19CT09URUQpOworCX0KKworCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2RzcC0+cmVhZHlfY29tcGwsCisJCQkJCSAgV0RTUF9TU1JfUkVBRFlfV0FJVF9USU1FT1VUKTsKKwlXRFNQX01HUl9NVVRFWF9MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7CisJaWYgKHJldCA9PSAwKSB7CisJCVdEU1BfRVJSKHdkc3AsICJ3YWl0X2Zvcl9yZWFkeSB0aW1lZCBvdXQsIHN0YXR1cyA9IDB4JXgiLAorCQkJIHdkc3AtPnJlYWR5X3N0YXR1cyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBEYXRhIHNlY3Rpb25zIGFyZSB0byBkb3dubG9hZGVkIHBlciBXRFNQIGJvb3QgKi8KKwlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQpOworCisJLyoKKwkgKiBFdmVuIHRob3VnaCBjb2RlIHNlY3Rpb24gY291bGQgcG9zc2libGUgYmUgcmV0YWluZWQgb24gRFNQCisJICogY3Jhc2gsIGdvIGFoZWFkIGFuZCBzdGlsbCByZS1kb3dubG9hZCBqdXN0IHRvIGF2b2lkIGFueQorCSAqIG1lbW9yeSBjb3JydXB0aW9uIGZyb20gcHJldmlvdXMgY3Jhc2guCisJICovCisJV0RTUF9DTEVBUl9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfQ09ERV9ETE9BREVEKTsKKworCS8qIElmIGNvZGVjIHJlc3RhcnRlZCwgdGhlbiBhbGwgY29tcG9uZW50cyBtdXN0IGJlIHJlLWluaXRpYWxpemVkICovCisJaWYgKHdkc3AtPnNzcl90eXBlID09IFdEU1BfU1NSX1RZUEVfQ0RDX1VQKSB7CisJCXdkc3BfZGVpbml0X2NvbXBvbmVudHMod2RzcCk7CisJCVdEU1BfQ0xFQVJfU1RBVFVTKHdkc3AsIFdEU1BfU1RBVFVTX0lOSVRJQUxJWkVEKTsKKwl9CisKKwlyZXQgPSB3ZHNwX2luaXRfYW5kX2Rsb2FkX2NvZGVfc2VjdGlvbnMod2RzcCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgdG8gZGxvYWQgY29kZSBzZWN0aW9ucyBlcnIgPSAlZCIsCisJCQkgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFNTUiBoYW5kbGluZyBpcyBmaW5pc2hlZCwgbWFyayBTU1IgdHlwZSBhcyBOT19TU1IgKi8KKwl3ZHNwLT5zc3JfdHlwZSA9IFdEU1BfU1NSX1RZUEVfTk9fU1NSOworZG9uZToKKwlXRFNQX01HUl9NVVRFWF9VTkxPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKK30KKworc3RhdGljIGludCB3ZHNwX3Nzcl9oYW5kbGVyKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLCB2b2lkICphcmcsCisJCQkgICAgZW51bSB3ZHNwX3Nzcl90eXBlIHNzcl90eXBlKQoreworCWVudW0gd2RzcF9zc3JfdHlwZSBjdXJyZW50X3Nzcl90eXBlOworCXN0cnVjdCB3ZHNwX2Vycl9zaWduYWxfYXJnICplcnJfZGF0YTsKKworCVdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKKworCWN1cnJlbnRfc3NyX3R5cGUgPSB3ZHNwLT5zc3JfdHlwZTsKKwlXRFNQX0RCRyh3ZHNwLCAiQ3VycmVudCBzc3JfdHlwZSAlcywgaGFuZGxpbmcgc3NyX3R5cGUgJXMiLAorCQkgd2RzcF9nZXRfc3NyX3R5cGVfc3RyaW5nKGN1cnJlbnRfc3NyX3R5cGUpLAorCQkgd2RzcF9nZXRfc3NyX3R5cGVfc3RyaW5nKHNzcl90eXBlKSk7CisJd2RzcC0+c3NyX3R5cGUgPSBzc3JfdHlwZTsKKworCWlmIChhcmcpIHsKKwkJZXJyX2RhdGEgPSAoc3RydWN0IHdkc3BfZXJyX3NpZ25hbF9hcmcgKikgYXJnOworCQltZW1jcHkoJndkc3AtPmR1bXBfZGF0YS5lcnJfZGF0YSwgZXJyX2RhdGEsCisJCSAgICAgICBzaXplb2YoKmVycl9kYXRhKSk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZ3ZHNwLT5kdW1wX2RhdGEuZXJyX2RhdGEsIDAsCisJCSAgICAgICBzaXplb2Yod2RzcC0+ZHVtcF9kYXRhLmVycl9kYXRhKSk7CisJfQorCisJc3dpdGNoIChzc3JfdHlwZSkgeworCisJY2FzZSBXRFNQX1NTUl9UWVBFX1dEU1BfRE9XTjoKKwkJX193ZHNwX2Nscl9yZWFkeV9sb2NrZWQod2RzcCwgV0RTUF9TU1JfU1RBVFVTX1dEU1BfUkVBRFkpOworCQl3ZHNwX2Jyb2FkY2FzdF9ldmVudF9kb3duc2VxKHdkc3AsIFdEU1BfRVZFTlRfUFJFX1NIVVRET1dOLAorCQkJCQkgICAgIE5VTEwpOworCQlzY2hlZHVsZV93b3JrKCZ3ZHNwLT5zc3Jfd29yayk7CisJCWJyZWFrOworCisJY2FzZSBXRFNQX1NTUl9UWVBFX0NEQ19ET1dOOgorCQlfX3dkc3BfY2xyX3JlYWR5X2xvY2tlZCh3ZHNwLCBXRFNQX1NTUl9TVEFUVVNfQ0RDX1JFQURZKTsKKwkJLyoKKwkJICogSWYgRFNQIGlzIGJvb3RlZCB3aGVuIENEQ19ET1dOIGlzIHJlY2VpdmVkLCBpdCBuZWVkcworCQkgKiB0byBiZSBzaHV0ZG93bi4KKwkJICovCisJCWlmIChXRFNQX1NUQVRVU19JU19TRVQod2RzcCwgV0RTUF9TVEFUVVNfQk9PVEVEKSkgeworCQkJX193ZHNwX2Nscl9yZWFkeV9sb2NrZWQod2RzcCwKKwkJCQkJCVdEU1BfU1NSX1NUQVRVU19XRFNQX1JFQURZKTsKKwkJCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwKKwkJCQkJCSAgICAgV0RTUF9FVkVOVF9QUkVfU0hVVERPV04sCisJCQkJCQkgICAgIE5VTEwpOworCQl9CisKKwkJc2NoZWR1bGVfd29yaygmd2RzcC0+c3NyX3dvcmspOworCQlicmVhazsKKworCWNhc2UgV0RTUF9TU1JfVFlQRV9DRENfVVA6CisJCV9fd2RzcF9zZXRfcmVhZHlfbG9ja2VkKHdkc3AsIFdEU1BfU1NSX1NUQVRVU19DRENfUkVBRFksIHRydWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdEU1BfRVJSKHdkc3AsICJ1bmRlZmluZWQgc3NyX3R5cGUgJWRcbiIsIHNzcl90eXBlKTsKKwkJLyogUmV2ZXJ0IGJhY2sgdGhlIHNzcl90eXBlIGZvciB1bmRlZmluZWQgZXZlbnRzICovCisJCXdkc3AtPnNzcl90eXBlID0gY3VycmVudF9zc3JfdHlwZTsKKwkJYnJlYWs7CisJfQorCisJV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZHNwX3NpZ25hbF9oYW5kbGVyKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2LAorCQkJICAgICAgIGVudW0gd2RzcF9zaWduYWwgc2lnbmFsLCB2b2lkICphcmcpCit7CisJc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7CisJaW50IHJldDsKKworCWlmICghd2RzcF9kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJd2RzcCA9IGRldl9nZXRfZHJ2ZGF0YSh3ZHNwX2Rldik7CisJV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOworCisJV0RTUF9EQkcod2RzcCwgIlJhaXNlZCBzaWduYWwgJWQiLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFdEU1BfSVBDMV9JTlRSOgorCQlyZXQgPSB3ZHNwX3VuaWNhc3RfZXZlbnQod2RzcCwgV0RTUF9DTVBOVF9JUEMsCisJCQkJCSBXRFNQX0VWRU5UX0lQQzFfSU5UUiwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgV0RTUF9FUlJfSU5UUjoKKwkJcmV0ID0gd2RzcF9zc3JfaGFuZGxlcih3ZHNwLCBhcmcsIFdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBXRFNQX0NEQ19ET1dOX1NJR05BTDoKKwkJcmV0ID0gd2RzcF9zc3JfaGFuZGxlcih3ZHNwLCBhcmcsIFdEU1BfU1NSX1RZUEVfQ0RDX0RPV04pOworCQlicmVhazsKKwljYXNlIFdEU1BfQ0RDX1VQX1NJR05BTDoKKwkJcmV0ID0gd2RzcF9zc3JfaGFuZGxlcih3ZHNwLCBhcmcsIFdEU1BfU1NSX1RZUEVfQ0RDX1VQKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlXRFNQX0VSUih3ZHNwLCAiaGFuZGxpbmcgc2lnbmFsICVkIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkJCSBzaWduYWwsIHJldCk7CisJV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPmFwaV9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkc3Bfdm90ZV9mb3JfZHNwKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2LAorCQkJICAgICBib29sIHZvdGUpCit7CisJc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXdkc3BfZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOworCisJV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOworCVdEU1BfREJHKHdkc3AsICJyZXF1ZXN0ICVzLCBjdXJyZW50IHVzZXJzID0gJWQiLAorCQkgdm90ZSA/ICJlbmFibGUiIDogImRpc2FibGUiLCB3ZHNwLT5kc3BfdXNlcnMpOworCisJaWYgKHZvdGUpIHsKKwkJd2RzcC0+ZHNwX3VzZXJzKys7CisJCWlmICh3ZHNwLT5kc3BfdXNlcnMgPT0gMSkKKwkJCXJldCA9IHdkc3BfZW5hYmxlX2RzcCh3ZHNwKTsKKwl9IGVsc2UgeworCQlpZiAod2RzcC0+ZHNwX3VzZXJzID09IDApCisJCQlnb3RvIGRvbmU7CisKKwkJd2RzcC0+ZHNwX3VzZXJzLS07CisJCWlmICh3ZHNwLT5kc3BfdXNlcnMgPT0gMCkKKwkJCXJldCA9IHdkc3BfZGlzYWJsZV9kc3Aod2RzcCk7CisJfQorCisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlXRFNQX0RCRyh3ZHNwLCAid2RzcCAlcyBmYWlsZWQsIGVyciA9ICVkIiwKKwkJCSB2b3RlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIsIHJldCk7CisKK2RvbmU6CisJV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPmFwaV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3ZHNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqd2RzcF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9yZXN1bWUoc3RydWN0IGRldmljZSAqd2RzcF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2RzcF9tZ3Jfb3BzIHdkc3Bfb3BzID0geworCS5yZWdpc3Rlcl9jbXBudF9vcHMgPSB3ZHNwX3JlZ2lzdGVyX2NtcG50X29wcywKKwkuZ2V0X2Rldl9mb3JfY21wbnQgPSB3ZHNwX2dldF9kZXZfZm9yX2NtcG50LAorCS5zaWduYWxfaGFuZGxlciA9IHdkc3Bfc2lnbmFsX2hhbmRsZXIsCisJLnZvdGVfZm9yX2RzcCA9IHdkc3Bfdm90ZV9mb3JfZHNwLAorCS5zdXNwZW5kID0gd2RzcF9zdXNwZW5kLAorCS5yZXN1bWUgPSB3ZHNwX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgd2RzcF9tZ3JfY29tcGFyZV9vZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdkc3BfY21wbnQgKmNtcG50ID0gZGF0YTsKKworCS8qCisJICogRmlyc3QgdHJ5IHRvIG1hdGNoIGJhc2VkIG9uIG9mX25vZGUsIGlmIG9mX25vZGUgaXMgbm90CisJICogcHJlc2VudCwgdHJ5IHRvIG1hdGNoIG9uIHRoZSBkZXZfbmFtZQorCSAqLworCXJldHVybiAoKGRldi0+b2Zfbm9kZSAmJiBkZXYtPm9mX25vZGUgPT0gY21wbnQtPm5wKSB8fAorCQkoY21wbnQtPmNkZXZfbmFtZSAmJgorCQkgIXN0cmNtcChkZXZfbmFtZShkZXYpLCBjbXBudC0+Y2Rldl9uYW1lKSkpOworfQorCitzdGF0aWMgaW50IHdkc3BfbWdyX2JpbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OworCWludCByZXQsIGlkeDsKKworCXdkc3AtPm9wcyA9ICZ3ZHNwX29wczsKKworCS8qIFNldHVwIHJhbWR1bXAgZGV2aWNlICovCisJd2RzcC0+ZHVtcF9kYXRhLnJkX2RldiA9IGNyZWF0ZV9yYW1kdW1wX2RldmljZSgid2RzcCIsIGRldik7CisJaWYgKCF3ZHNwLT5kdW1wX2RhdGEucmRfZGV2KQorCQlkZXZfaW5mbyhkZXYsICIlczogY3JlYXRlX3JhbWR1bXBfZGV2aWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJcmV0ID0gY29tcG9uZW50X2JpbmRfYWxsKGRldiwgd2RzcC0+b3BzKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCVdEU1BfRVJSKHdkc3AsICJjb21wb25lbnRfYmluZF9hbGwgZmFpbGVkICVkXG4iLCByZXQpOworCisJLyogTWFrZSBzdXJlIGFsbCBjb21wb25lbnRzIHJlZ2lzdGVyZWQgb3BzICovCisJZm9yIChpZHggPSAwOyBpZHggPCBXRFNQX0NNUE5UX1RZUEVfTUFYOyBpZHgrKykgeworCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpZHgpOworCQlpZiAoIWNtcG50LT5jZGV2IHx8ICFjbXBudC0+b3BzKSB7CisJCQlXRFNQX0VSUih3ZHNwLCAiJXMgZGlkIG5vdCByZWdpc3RlciBvcHNcbiIsCisJCQkJIFdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKGlkeCkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgd2RzcC0+b3BzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogU2NoZWR1bGUgdGhlIHdvcmsgdG8gZG93bmxvYWQgaW1hZ2UgaWYgYmluZGluZyB3YXMgc3VjY2Vzc2Z1bC4gKi8KKwlpZiAoIXJldCkKKwkJc2NoZWR1bGVfd29yaygmd2RzcC0+bG9hZF9md193b3JrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdkc3BfbWdyX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQ7CisJaW50IGlkeDsKKworCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgd2RzcC0+b3BzKTsKKworCWlmICh3ZHNwLT5kdW1wX2RhdGEucmRfZGV2KSB7CisJCWRlc3Ryb3lfcmFtZHVtcF9kZXZpY2Uod2RzcC0+ZHVtcF9kYXRhLnJkX2Rldik7CisJCXdkc3AtPmR1bXBfZGF0YS5yZF9kZXYgPSBOVUxMOworCX0KKworCS8qIENsZWFyIGFsbCBzdGF0dXMgYml0cyAqLworCXdkc3AtPnN0YXR1cyA9IDB4MDA7CisKKwkvKiBjbGVhbiB1cCB0aGUgY29tcG9uZW50cyAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgV0RTUF9DTVBOVF9UWVBFX01BWDsgaWR4KyspIHsKKwkJY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgaWR4KTsKKwkJY21wbnQtPmNkZXYgPSBOVUxMOworCQljbXBudC0+b3BzID0gTlVMTDsKKwkJY21wbnQtPnByaXZfZGF0YSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbXBvbmVudF9tYXN0ZXJfb3BzIHdkc3BfbWFzdGVyX29wcyA9IHsKKwkuYmluZCA9IHdkc3BfbWdyX2JpbmQsCisJLnVuYmluZCA9IHdkc3BfbWdyX3VuYmluZCwKK307CisKK3N0YXRpYyB2b2lkICp3ZHNwX21ncl9wYXJzZV9waGFuZGxlKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLAorCQkJCSAgICBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRldmljZSAqbWRldiA9IHdkc3AtPm1kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQgPSBOVUxMOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgcGFyZ3M7CisJdTMyIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfZml4ZWRfYXJncyhtZGV2LT5vZl9ub2RlLAorCQkJCQkgICAgICAicWNvbSx3ZHNwLWNvbXBvbmVudHMiLCAxLAorCQkJCQkgICAgICBpbmRleCwgJnBhcmdzKTsKKwlpZiAocmV0KSB7CisJCVdEU1BfRVJSKHdkc3AsICJwYXJzZV9waGFuZGxlIGF0IGluZGV4ICVkIGZhaWxlZCAlZCIsCisJCQkgaW5kZXgsIHJldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCW5wID0gcGFyZ3MubnA7CisJdmFsdWUgPSBwYXJncy5hcmdzWzBdOworCisJaWYgKHZhbHVlID49IFdEU1BfQ01QTlRfVFlQRV9NQVgpIHsKKwkJV0RTUF9FUlIod2RzcCwgImludmFsaWQgcGhhbmRsZV9hcmcgdG8gb2Zfbm9kZSAlcyIsIG5wLT5uYW1lKTsKKwkJZ290byBkb25lOworCX0KKworCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIHZhbHVlKTsKKwlpZiAoY21wbnQtPm5wIHx8IGNtcG50LT5jZGV2X25hbWUpIHsKKwkJV0RTUF9FUlIod2RzcCwgImNtcG50ICVkIGFscmVhZHkgYWRkZWQiLCB2YWx1ZSk7CisJCWNtcG50ID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKworCWNtcG50LT5ucCA9IG5wOworCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAicWNvbSx3ZHNwLWNtcG50LWRldi1uYW1lIiwKKwkJCQkmY21wbnQtPmNkZXZfbmFtZSk7Citkb25lOgorCW9mX25vZGVfcHV0KG5wKTsKKwlyZXR1cm4gY21wbnQ7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9tZ3JfcGFyc2VfZHRfZW50cmllcyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3ZHNwLT5tZGV2OworCXZvaWQgKm1hdGNoX2RhdGE7CisJaW50IHBoX2lkeCwgcmV0OworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoZGV2LT5vZl9ub2RlLCAicWNvbSxpbWctZmlsZW5hbWUiLAorCQkJCSAgICAgICZ3ZHNwLT5pbWdfZm5hbWUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlXRFNQX0VSUih3ZHNwLCAiUmVhZGluZyBwcm9wZXJ0eSAlcyBmYWlsZWQsIGVycm9yID0gJWQiLAorCQkJICJxY29tLGltZy1maWxlbmFtZSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gb2ZfY291bnRfcGhhbmRsZV93aXRoX2FyZ3MoZGV2LT5vZl9ub2RlLAorCQkJCQkgInFjb20sd2RzcC1jb21wb25lbnRzIiwKKwkJCQkJIE5VTEwpOworCWlmIChyZXQgPT0gLUVOT0VOVCkgeworCQlXRFNQX0VSUih3ZHNwLCAiUHJvcGVydHkgJXMgbm90IGRlZmluZWQgaW4gRFQiLAorCQkJICJxY29tLHdkc3AtY29tcG9uZW50cyIpOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChyZXQgIT0gV0RTUF9DTVBOVF9UWVBFX01BWCAqIDIpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkludmFsaWQgcGhhbmRsZSArIGFyZyBjb3VudCAlZCwgZXhwZWN0ZWQgJWQiLAorCQkJIHJldCwgV0RTUF9DTVBOVF9UWVBFX01BWCAqIDIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gMDsKKworCWZvciAocGhfaWR4ID0gMDsgcGhfaWR4IDwgV0RTUF9DTVBOVF9UWVBFX01BWDsgcGhfaWR4KyspIHsKKworCQltYXRjaF9kYXRhID0gd2RzcF9tZ3JfcGFyc2VfcGhhbmRsZSh3ZHNwLCBwaF9pZHgpOworCQlpZiAoIW1hdGNoX2RhdGEpIHsKKwkJCVdEU1BfRVJSKHdkc3AsICJjb21wb25lbnQgbm90IGZvdW5kIGF0IGlkeCAlZCIsIHBoX2lkeCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJY29tcG9uZW50X21hdGNoX2FkZChkZXYsICZ3ZHNwLT5tYXRjaCwKKwkJCQkgICAgd2RzcF9tZ3JfY29tcGFyZV9vZiwgbWF0Y2hfZGF0YSk7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9tZ3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcDsKKwlzdHJ1Y3QgZGV2aWNlICptZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgcmV0OworCisJd2RzcCA9IGRldm1fa3phbGxvYyhtZGV2LCBzaXplb2YoKndkc3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkc3ApCisJCXJldHVybiAtRU5PTUVNOworCXdkc3AtPm1kZXYgPSBtZGV2OworCXdkc3AtPnNlZ19saXN0ID0gZGV2bV9remFsbG9jKG1kZXYsIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkc3AtPnNlZ19saXN0KSB7CisJCWRldm1fa2ZyZWUobWRldiwgd2RzcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHdkc3BfbWdyX3BhcnNlX2R0X2VudHJpZXMod2RzcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZHRfcGFyc2U7CisKKwlJTklUX1dPUksoJndkc3AtPmxvYWRfZndfd29yaywgd2RzcF9sb2FkX2Z3X2ltYWdlKTsKKwlJTklUX0xJU1RfSEVBRCh3ZHNwLT5zZWdfbGlzdCk7CisJbXV0ZXhfaW5pdCgmd2RzcC0+YXBpX211dGV4KTsKKwltdXRleF9pbml0KCZ3ZHNwLT5zc3JfbXV0ZXgpOworCXdkc3AtPnNzcl90eXBlID0gV0RTUF9TU1JfVFlQRV9OT19TU1I7CisJd2RzcC0+cmVhZHlfc3RhdHVzID0gV0RTUF9TU1JfU1RBVFVTX1JFQURZOworCUlOSVRfV09SSygmd2RzcC0+c3NyX3dvcmssIHdkc3Bfc3NyX3dvcmtfZm4pOworCWluaXRfY29tcGxldGlvbigmd2RzcC0+cmVhZHlfY29tcGwpOworCWFyY2hfc2V0dXBfZG1hX29wcyh3ZHNwLT5tZGV2LCAwLCAwLCBOVUxMLCAwKTsKKwlkZXZfc2V0X2RydmRhdGEobWRldiwgd2RzcCk7CisKKwlyZXQgPSBjb21wb25lbnRfbWFzdGVyX2FkZF93aXRoX21hdGNoKG1kZXYsICZ3ZHNwX21hc3Rlcl9vcHMsCisJCQkJCSAgICAgIHdkc3AtPm1hdGNoKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJV0RTUF9FUlIod2RzcCwgIkZhaWxlZCB0byBhZGQgbWFzdGVyLCBlcnIgPSAlZCIsIHJldCk7CisJCWdvdG8gZXJyX21hc3Rlcl9hZGQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9tYXN0ZXJfYWRkOgorCW11dGV4X2Rlc3Ryb3koJndkc3AtPmFwaV9tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmd2RzcC0+c3NyX211dGV4KTsKK2Vycl9kdF9wYXJzZToKKwlkZXZtX2tmcmVlKG1kZXYsIHdkc3AtPnNlZ19saXN0KTsKKwlkZXZtX2tmcmVlKG1kZXYsIHdkc3ApOworCWRldl9zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9tZ3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqbWRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AgPSBkZXZfZ2V0X2RydmRhdGEobWRldik7CisKKwljb21wb25lbnRfbWFzdGVyX2RlbChtZGV2LCAmd2RzcF9tYXN0ZXJfb3BzKTsKKworCW11dGV4X2Rlc3Ryb3koJndkc3AtPmFwaV9tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmd2RzcC0+c3NyX211dGV4KTsKKwlkZXZtX2tmcmVlKG1kZXYsIHdkc3AtPnNlZ19saXN0KTsKKwlkZXZtX2tmcmVlKG1kZXYsIHdkc3ApOworCWRldl9zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd2RzcF9tZ3JfZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLW1nciIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdkc3BfbWdyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3Y2QtZHNwLW1nciIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIod2RzcF9tZ3JfZHRfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gd2RzcF9tZ3JfcHJvYmUsCisJLnJlbW92ZSA9IHdkc3BfbWdyX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdkc3BfbWdyX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiV0NEIERTUCBtYW5hZ2VyIGRyaXZlciIpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd2RzcF9tZ3JfZHRfbWF0Y2gpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA0ODkxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlICJ3Y2QtZHNwLXV0aWxzLmgiCisKK3N0YXRpYyBib29sIHdkc3BfaXNfdmFsaWRfZWxmX2hkcihjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICplaGRyLAorCQkJCSAgc2l6ZV90IGZ3X3NpemUpCit7CisJaWYgKGZ3X3NpemUgPCBzaXplb2YoKmVoZHIpKSB7CisJCXByX2VycigiJXM6IEZpcm13YXJlIHRvbyBzbWFsbFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVsZl9jaGVja19mYWlsOworCX0KKworCWlmIChtZW1jbXAoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKSB7CisJCXByX2VycigiJXM6IE5vdCBhbiBFTEYgZmlsZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVsZl9jaGVja19mYWlsOworCX0KKworCWlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKSB7CisJCXByX2VycigiJXM6IE5vdCBhbiBleGVjdXRhYmxlIGltYWdlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZWxmX2NoZWNrX2ZhaWw7CisJfQorCisJaWYgKGVoZHItPmVfcGhudW0gPT0gMCkgeworCQlwcl9lcnIoIiVzOiBubyBzZWdtZW50cyB0byBsb2FkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZWxmX2NoZWNrX2ZhaWw7CisJfQorCisJaWYgKHNpemVvZihzdHJ1Y3QgZWxmMzJfcGhkcikgKiBlaGRyLT5lX3BobnVtICsKKwkgICAgc2l6ZW9mKHN0cnVjdCBlbGYzMl9oZHIpID4gZndfc2l6ZSkgeworCQlwcl9lcnIoIiVzOiBUb28gc21hbGwgTURUIGZpbGVcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlbGZfY2hlY2tfZmFpbDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKKworZWxmX2NoZWNrX2ZhaWw6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHdkc3BfYWRkX3NlZ21lbnRfdG9fbGlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIGNvbnN0IGNoYXIgKmltZ19mbmFtZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGVsZjMyX3BoZHIgKnBoZHIsCisJCQkJICAgIGludCBwaGRyX2lkeCwKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqc2VnX2xpc3QpCit7CisJc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZzsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERvIG5vdCBsb2FkIHNlZ21lbnRzIHdpdGggemVybyBzaXplICovCisJaWYgKHBoZHItPnBfZmlsZXN6ID09IDAgfHwgcGhkci0+cF9tZW1zeiA9PSAwKQorCQlnb3RvIGRvbmU7CisKKwlzZWcgPSBremFsbG9jKHNpemVvZigqc2VnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZWcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCXNucHJpbnRmKHNlZy0+c3BsaXRfZm5hbWUsIHNpemVvZihzZWctPnNwbGl0X2ZuYW1lKSwKKwkJICIlcy5iJTAyZCIsIGltZ19mbmFtZSwgcGhkcl9pZHgpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnNlZy0+c3BsaXRfZncsIHNlZy0+c3BsaXRfZm5hbWUsIGRldik7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGZpcm13YXJlICVzIG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fLCBzZWctPnNwbGl0X2ZuYW1lKTsKKwkJZ290byBiYWRfc2VnOworCX0KKworCXNlZy0+bG9hZF9hZGRyID0gcGhkci0+cF9wYWRkcjsKKwlzZWctPnNpemUgPSBwaGRyLT5wX2ZpbGVzejsKKwlzZWctPmRhdGEgPSAodTggKikgc2VnLT5zcGxpdF9mdy0+ZGF0YTsKKworCWxpc3RfYWRkX3RhaWwoJnNlZy0+bGlzdCwgc2VnX2xpc3QpOworZG9uZToKKwlyZXR1cm4gcmV0OworYmFkX3NlZzoKKwlrZnJlZShzZWcpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3ZHNwX2ZsdXNoX3NlZ21lbnRfbGlzdDogRmx1c2ggdGhlIGxpc3Qgb2Ygc2VnbWVudHMKKyAqIEBzZWdfbGlzdDogTGlzdCBvZiBzZWdtZW50cyB0byBiZSBmbHVzaGVkCisgKiBUaGlzIEFQSSB3aWxsIHRyYXZlcnNlIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc2VnbWVudHMgcHJvdmlkZWQgaW4KKyAqIHNlZ19saXN0LCByZWxlYXNlIHRoZSBmaXJtd2FyZSBmb3IgZWFjaCBzZWdtZW50IGFuZCBkZWxldGUgdGhlCisgKiBzZWdtZW50IGZyb20gdGhlIGxpc3QuCisgKi8KK3ZvaWQgd2RzcF9mbHVzaF9zZWdtZW50X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqc2VnX2xpc3QpCit7CisJc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VnLCBuZXh0LCBzZWdfbGlzdCwgbGlzdCkgeworCQlyZWxlYXNlX2Zpcm13YXJlKHNlZy0+c3BsaXRfZncpOworCQlsaXN0X2RlbCgmc2VnLT5saXN0KTsKKwkJa2ZyZWUoc2VnKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHdkc3BfZmx1c2hfc2VnbWVudF9saXN0KTsKKworLyoKKyAqIHdkc3BfZ2V0X3NlZ21lbnRfbGlzdDogR2V0IHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBzZWdtZW50cworICogQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIG9mIGNhbGxlcgorICogQGltZ19mbmFtZTogSW1hZ2UgbmFtZSBmb3IgdGhlIG1kdCBhbmQgc3BsaXQgZmlybXdhcmUgZmlsZXMKKyAqIEBzZWdtZW50X3R5cGU6IFJlcXVlc3RlZCBzZWdtZW50IHR5cGUsIHNob3VsZCBiZSBlaXRoZXIKKyAqCQkgIFdEU1BfRUxGX0ZMQUdfUkUgb3IgV0RTUF9FTEZfRkxBR19XUklURQorICogQHNlZ19saXN0OiBBbiBpbml0aWFsaXplZCBoZWFkIGZvciBsaXN0IG9mIHNlZ21lbnRlZCB0byBiZSByZXR1cm5lZAorICogQGVudHJ5X3BvaW50OiBQb2ludGVyIHRvIHJldHVybiB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGltYWdlCisgKiBUaGlzIEFQSSB3aWxsIHBhcnNlIHRoZSBtZHQgZmlsZSBmb3IgaW1nX2ZuYW1lIGFuZCBjcmVhdGUKKyAqIGFuIHN0cnVjdCB3ZHNwX2ltZ19zZWdtZW50IGZvciBlYWNoIHNlZ21lbnQgdGhhdCBtYXRjaGVzIHNlZ21lbnRfdHlwZQorICogYW5kIGFkZCB0aGlzIHN0cnVjdHVyZSB0byBsaXN0IHBvaW50ZWQgYnkgc2VnX2xpc3QKKyAqLworaW50IHdkc3BfZ2V0X3NlZ21lbnRfbGlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIGNvbnN0IGNoYXIgKmltZ19mbmFtZSwKKwkJCSAgdW5zaWduZWQgaW50IHNlZ21lbnRfdHlwZSwKKwkJCSAgc3RydWN0IGxpc3RfaGVhZCAqc2VnX2xpc3QsCisJCQkgIHUzMiAqZW50cnlfcG9pbnQpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICplaGRyOworCWNvbnN0IHN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCWNvbnN0IHU4ICplbGZfcHRyOworCWNoYXIgbWR0X25hbWVbV0RTUF9JTUdfTkFNRV9MRU5fTUFYXTsKKwlpbnQgcmV0LCBwaGRyX2lkeDsKKwlib29sIHNlZ21lbnRfbWF0Y2g7CisKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRUlOVkFMOworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRldmljZSBoYW5kbGVcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICghaW1nX2ZuYW1lIHx8ICFzZWdfbGlzdCB8fCAhZW50cnlfcG9pbnQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihkZXYsICIlczogSW52YWxpZCBpbnB1dCBwYXJhbXNcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc2VnbWVudF90eXBlICE9IFdEU1BfRUxGX0ZMQUdfUkUgJiYKKwkgICAgc2VnbWVudF90eXBlICE9IFdEU1BfRUxGX0ZMQUdfV1JJVEUpIHsKKwkJZGV2X2VycihkZXYsICIlczogSW52YWxpZCByZXF1ZXN0IGZvciBzZWdtZW50X3R5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2VnbWVudF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXNucHJpbnRmKG1kdF9uYW1lLCBzaXplb2YobWR0X25hbWUpLCAiJXMubWR0IiwgaW1nX2ZuYW1lKTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbWR0X25hbWUsIGRldik7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGZpcm13YXJlICVzIG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fLCBtZHRfbmFtZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllaGRyID0gKHN0cnVjdCBlbGYzMl9oZHIgKikgZnctPmRhdGE7CisJKmVudHJ5X3BvaW50ID0gZWhkci0+ZV9lbnRyeTsKKwlpZiAoIXdkc3BfaXNfdmFsaWRfZWxmX2hkcihlaGRyLCBmdy0+c2l6ZSkpIHsKKwkJZGV2X2VycihkZXYsICIlczogZncgbWR0ICVzIGlzIGludmFsaWRcbiIsCisJCQlfX2Z1bmNfXywgbWR0X25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGJhZF9lbGY7CisJfQorCisJZWxmX3B0ciA9IGZ3LT5kYXRhICsgc2l6ZW9mKCplaGRyKTsKKwlmb3IgKHBoZHJfaWR4ID0gMDsgcGhkcl9pZHggPCBlaGRyLT5lX3BobnVtOyBwaGRyX2lkeCsrKSB7CisJCXBoZHIgPSAoc3RydWN0IGVsZjMyX3BoZHIgKikgZWxmX3B0cjsKKwkJc2VnbWVudF9tYXRjaCA9IGZhbHNlOworCisJCXN3aXRjaCAoc2VnbWVudF90eXBlKSB7CisJCWNhc2UgV0RTUF9FTEZfRkxBR19SRToKKwkJCS8qCisJCQkgKiBGbGFnIGNhbiBiZSBSRUFEIG9yIEVYRUNVVEUgb3IgYm90aCBidXQKKwkJCSAqIFdSSVRFIGZsYWcgc2hvdWxkIG5vdCBiZSBzZXQuCisJCQkgKi8KKwkJCWlmICgocGhkci0+cF9mbGFncyAmIHNlZ21lbnRfdHlwZSkgJiYKKwkJCSAgICAhKHBoZHItPnBfZmxhZ3MgJiBXRFNQX0VMRl9GTEFHX1dSSVRFKSkKKwkJCQlzZWdtZW50X21hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIFdEU1BfRUxGX0ZMQUdfV1JJVEU6CisJCQkvKgorCQkJICogSWYgV1JJVEUgZmxhZyBpcyBzZXQsIG90aGVyIGZsYWdzIGRvIG5vdAorCQkJICogbWF0dGVyLgorCQkJICovCisJCQlpZiAocGhkci0+cF9mbGFncyAmIHNlZ21lbnRfdHlwZSkKKwkJCQlzZWdtZW50X21hdGNoID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNlZ21lbnRfbWF0Y2gpIHsKKwkJCXJldCA9IHdkc3BfYWRkX3NlZ21lbnRfdG9fbGlzdChkZXYsIGltZ19mbmFtZSwgcGhkciwKKwkJCQkJCSAgICAgICBwaGRyX2lkeCwgc2VnX2xpc3QpOworCQkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQkJd2RzcF9mbHVzaF9zZWdtZW50X2xpc3Qoc2VnX2xpc3QpOworCQkJCWdvdG8gYmFkX2VsZjsKKwkJCX0KKwkJfQorCQllbGZfcHRyID0gZWxmX3B0ciArIHNpemVvZigqcGhkcik7CisJfQorCitiYWRfZWxmOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3ZHNwX2dldF9zZWdtZW50X2xpc3QpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMwYTFjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19XQ0RfRFNQX1VUSUxTX0hfXworI2RlZmluZSBfX1dDRF9EU1BfVVRJTFNfSF9fCisKKyNkZWZpbmUgV0RTUF9JTUdfTkFNRV9MRU5fTUFYICAgIDY0CisKKyNkZWZpbmUgV0RTUF9FTEZfRkxBR19FWEVDVVRFICAgICgxIDw8IDApCisjZGVmaW5lIFdEU1BfRUxGX0ZMQUdfV1JJVEUgICAgICAoMSA8PCAxKQorI2RlZmluZSBXRFNQX0VMRl9GTEFHX1JFQUQgICAgICAgKDEgPDwgMikKKworI2RlZmluZSBXRFNQX0VMRl9GTEFHX1JFIChXRFNQX0VMRl9GTEFHX1JFQUQgfCBXRFNQX0VMRl9GTEFHX0VYRUNVVEUpCisKK3N0cnVjdCB3ZHNwX2ltZ19zZWdtZW50IHsKKworCS8qIEZpcm13YXJlIGZvciB0aGUgc2xpdCBpbWFnZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqc3BsaXRfZnc7CisKKwkvKiBOYW1lIG9mIHRoZSBzcGxpdCBmaXJtd2FyZSBmaWxlICovCisJY2hhciBzcGxpdF9mbmFtZVtXRFNQX0lNR19OQU1FX0xFTl9NQVhdOworCisJLyogQWRkcmVzcyB3aGVyZSB0aGUgc2VnbWVudCBpcyB0byBiZSBsb2FkZWQgKi8KKwl1MzIgbG9hZF9hZGRyOworCisJLyogQnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEgdG8gYmUgbG9hZGVkICovCisJdTggKmRhdGE7CisKKwkvKiBTaXplIG9mIHRoZSBkYXRhIHRvIGJlIGxvYWRlZCAqLworCXNpemVfdCBzaXplOworCisJLyogTGlzdCBub2RlIHBvaW50aW5nIHRvIG5leHQgc2VnbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK2ludCB3ZHNwX2dldF9zZWdtZW50X2xpc3Qoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppbWdfZm5hbWUsCisJCQkgIHVuc2lnbmVkIGludCBzZWdtZW50X3R5cGUsIHN0cnVjdCBsaXN0X2hlYWQgKnNlZ19saXN0LAorCQkJICB1MzIgKmVudHJ5X3BvaW50KTsKK3ZvaWQgd2RzcF9mbHVzaF9zZWdtZW50X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqc2VnX2xpc3QpOworCisjZW5kaWYgLyogX19XQ0RfRFNQX1VUSUxTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy12Mi5jIGIvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTQzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLmMKQEAgLTAsMCArMSwyNjA2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlICJ3Y2QtbWJoYy12Mi5oIgorI2luY2x1ZGUgIndjZGNhbC1od2RlcC5oIgorCisjZGVmaW5lIFdDRF9NQkhDX0pBQ0tfTUFTSyAoU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX09DX0hQSEwgfCBcCisJCQkgICBTTkRfSkFDS19PQ19IUEhSIHwgU05EX0pBQ0tfTElORU9VVCB8IFwKKwkJCSAgIFNORF9KQUNLX01FQ0hBTklDQUwgfCBTTkRfSkFDS19NSUNST1BIT05FMiB8IFwKKwkJCSAgIFNORF9KQUNLX1VOU1VQUE9SVEVEKQorCisjZGVmaW5lIFdDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0sgKFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBcCisJCQkJICBTTkRfSkFDS19CVE5fMiB8IFNORF9KQUNLX0JUTl8zIHwgXAorCQkJCSAgU05EX0pBQ0tfQlROXzQgfCBTTkRfSkFDS19CVE5fNSkKKyNkZWZpbmUgT0NQX0FUVEVNUFQgMjAKKyNkZWZpbmUgSFNfREVURUNUX1BMVUdfVElNRV9NUyAoMyAqIDEwMDApCisjZGVmaW5lIFNQRUNJQUxfSFNfREVURUNUX1RJTUVfTVMgKDIgKiAxMDAwKQorI2RlZmluZSBNQkhDX0JVVFRPTl9QUkVTU19USFJFU0hPTERfTUlOIDI1MAorI2RlZmluZSBHTkRfTUlDX1NXQVBfVEhSRVNIT0xEIDQKKyNkZWZpbmUgV0NEX0ZBS0VfUkVNT1ZBTF9NSU5fUEVSSU9EX01TIDEwMAorI2RlZmluZSBIU19WUkVGX01JTl9WQUwgMTQwMAorI2RlZmluZSBGV19SRUFEX0FUVEVNUFRTIDE1CisjZGVmaW5lIEZXX1JFQURfVElNRU9VVCA0MDAwMDAwCisjZGVmaW5lIEZBS0VfUkVNX1JFVFJZX0FUVEVNUFRTIDMKKyNkZWZpbmUgTUFYX0lNUEVEIDYwMDAwCisKKyNkZWZpbmUgV0NEX01CSENfQlROX1BSRVNTX0NPTVBMX1RJTUVPVVRfTVMgIDUwCisjZGVmaW5lIEFOQ19ERVRFQ1RfUkVUUllfQ05UIDcKKyNkZWZpbmUgV0NEX01CSENfU1BMX0hTX0NOVCAgMQorCitzdGF0aWMgaW50IGRldF9leHRuX2NhYmxlX2VuOworbW9kdWxlX3BhcmFtKGRldF9leHRuX2NhYmxlX2VuLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkZXRfZXh0bl9jYWJsZV9lbiwgImVuYWJsZS9kaXNhYmxlIGV4dG4gY2FibGUgZGV0ZWN0Iik7CisKK2VudW0gd2NkX21iaGNfY3NfbWJfZW5fZmxhZyB7CisJV0NEX01CSENfRU5fQ1MgPSAwLAorCVdDRF9NQkhDX0VOX01CLAorCVdDRF9NQkhDX0VOX1BVTExVUCwKKwlXQ0RfTUJIQ19FTl9OT05FLAorfTsKKworc3RhdGljIHZvaWQgd2NkX21iaGNfamFja19yZXBvcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIGludCBzdGF0dXMsIGludCBtYXNrKQoreworCXNuZF9zb2NfamFja19yZXBvcnQoamFjaywgc3RhdHVzLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgX19ocGhvY3Bfb2ZmX3JlcG9ydChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHUzMiBqYWNrX3N0YXR1cywKKwkJCQlpbnQgaXJxKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNsZWFyIG9jcCBzdGF0dXMgJXhcbiIsCisJCV9fZnVuY19fLCBqYWNrX3N0YXR1cyk7CisKKwlpZiAobWJoYy0+aHBoX3N0YXR1cyAmIGphY2tfc3RhdHVzKSB7CisJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfmphY2tfc3RhdHVzOworCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAorCQkJCSAgICAgbWJoYy0+aHBoX3N0YXR1cywgV0NEX01CSENfSkFDS19NQVNLKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX09DUF9GU01fRU4sIDApOworCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfT0NQX0ZTTV9FTiwgMSk7CisJCS8qCisJCSAqIHJlc2V0IHJldHJ5IGNvdW50ZXIgYXMgUEEgaXMgdHVybmVkIG9mZiBzaWduaWZ5aW5nCisJCSAqIHN0YXJ0IG9mIG5ldyBPQ1AgZGV0ZWN0aW9uIHNlc3Npb24KKwkJICovCisJCWlmIChtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKQorCQkJbWJoYy0+aHBobG9jcF9jbnQgPSAwOworCQllbHNlCisJCQltYmhjLT5ocGhyb2NwX2NudCA9IDA7CisJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKGNvZGVjLCBpcnEsIHRydWUpOworCX0KK30KKworc3RhdGljIHZvaWQgaHBocm9jcF9vZmZfcmVwb3J0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdTMyIGphY2tfc3RhdHVzKQoreworCV9faHBob2NwX29mZl9yZXBvcnQobWJoYywgU05EX0pBQ0tfT0NfSFBIUiwKKwkJCSAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwaGxvY3Bfb2ZmX3JlcG9ydChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHUzMiBqYWNrX3N0YXR1cykKK3sKKwlfX2hwaG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwsCisJCQkgICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9wcm9ncmFtX2hzX3ZyZWYoc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCXN0cnVjdCB3Y2RfbWJoY19wbHVnX3R5cGVfY2ZnICpwbHVnX3R5cGVfY2ZnOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXUzMiByZWdfdmFsOworCisJcGx1Z190eXBlX2NmZyA9IFdDRF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisJcmVnX3ZhbCA9ICgocGx1Z190eXBlX2NmZy0+dl9oc19tYXggLSBIU19WUkVGX01JTl9WQUwpIC8gMTAwKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiByZWdfdmFsICA9ICV4XG4iLCBfX2Z1bmNfXywgcmVnX3ZhbCk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hTX1ZSRUYsIHJlZ192YWwpOworfQorCitzdGF0aWMgdm9pZCB3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKGNvbnN0IHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgYm9vbCBtaWNiaWFzKQoreworCXN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2RldDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXMxNiAqYnRuX2xvdywgKmJ0bl9oaWdoOworCisJaWYgKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9PSBOVUxMKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXM6IGNhbGlicmF0aW9uIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJYnRuX2RldCA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCWJ0bl9sb3cgPSBidG5fZGV0LT5fdl9idG5fbG93OworCWJ0bl9oaWdoID0gKCh2b2lkICopJmJ0bl9kZXQtPl92X2J0bl9sb3cpICsKKwkJCShzaXplb2YoYnRuX2RldC0+X3ZfYnRuX2xvd1swXSkgKiBidG5fZGV0LT5udW1fYnRuKTsKKworCW1iaGMtPm1iaGNfY2ItPnNldF9idG5fdGhyKGNvZGVjLCBidG5fbG93LCBidG5faGlnaCwgYnRuX2RldC0+bnVtX2J0biwKKwkJCQkgICBtaWNiaWFzKTsKK30KKworc3RhdGljIHZvaWQgd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMoY29uc3Qgc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCWNvbnN0IGVudW0gd2NkX21iaGNfY3NfbWJfZW5fZmxhZyBjc19tYl9lbikKK3sKKworCS8qCisJICogU29tZSBjb2RlY3MgaGFuZGxlIG1pY2JpYXMvcHVsbHVwIGVuYWJsZW1lbnQgaW4gY29kZWMKKwkgKiBkcml2ZXJzIGl0c2VsZiBhbmQgbWljYmlhcyBpcyBub3QgbmVlZGVkIGZvciByZWd1bGFyCisJICogcGx1ZyB0eXBlIGRldGVjdGlvbi4gU28gaWYgbWljYmlhc19jb250cm9sIGNhbGxiYWNrIGZ1bmN0aW9uCisJICogaXMgZGVmaW5lZCwganVzdCByZXR1cm4uCisJICovCisJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQorCQlyZXR1cm47CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyLCBjc19tYl9lbjogJWRcbiIsIF9fZnVuY19fLCBjc19tYl9lbik7CisKKwlzd2l0Y2ggKGNzX21iX2VuKSB7CisJY2FzZSBXQ0RfTUJIQ19FTl9DUzoKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01JQ0JfQ1RSTCwgMCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDMpOworCQkvKiBQcm9ncmFtIEJ1dHRvbiB0aHJlc2hvbGQgcmVnaXN0ZXJzIGFzIHBlciBDUyAqLworCQl3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKG1iaGMsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0RfTUJIQ19FTl9NQjoKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDEpOworCisJCS8qIERpc2FibGUgUFVMTF9VUF9FTiAmIGVuYWJsZSBNSUNCSUFTICovCisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NSUNCX0NUUkwsIDIpOworCQkvKiBQcm9ncmFtIEJ1dHRvbiB0aHJlc2hvbGQgcmVnaXN0ZXJzIGFzIHBlciBNSUNCSUFTICovCisJCXdjZF9wcm9ncmFtX2J0bl90aHJlc2hvbGQobWJoYywgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgV0NEX01CSENfRU5fUFVMTFVQOgorCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAzKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NSUNCX0NUUkwsIDEpOworCQkvKiBQcm9ncmFtIEJ1dHRvbiB0aHJlc2hvbGQgcmVnaXN0ZXJzIGFzIHBlciBNSUNCSUFTICovCisJCXdjZF9wcm9ncmFtX2J0bl90aHJlc2hvbGQobWJoYywgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgV0NEX01CSENfRU5fTk9ORToKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDEpOworCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIHBhcmFtZXRlciIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBleGl0XG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp3Y2RfbWJoY19nZXRfZXZlbnRfc3RyaW5nKGludCBldmVudCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PRkY6CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGKTsKKwljYXNlIFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY6CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRik7CisJY2FzZSBXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTjoKKwkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTik7CisJY2FzZSBXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT046CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09OKTsKKwljYXNlIFdDRF9FVkVOVF9QUkVfSFBITF9QQV9PTjoKKwkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT04pOworCWNhc2UgV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkY6CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYpOworCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09OOgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PTik7CisJY2FzZSBXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRjoKKwkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRik7CisJY2FzZSBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGOgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkYpOworCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09GRjoKKwkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT0ZGKTsKKwljYXNlIFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OOgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OKTsKKwljYXNlIFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT046CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BSRV9EQVBNX01JQ0JJQVNfMl9PTik7CisJY2FzZSBXQ0RfRVZFTlRfUE9TVF9EQVBNX01JQ0JJQVNfMl9PRkY6CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGKTsKKwljYXNlIFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT0ZGOgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT0ZGKTsKKwljYXNlIFdDRF9FVkVOVF9PQ1BfT0ZGOgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9PQ1BfT0ZGKTsKKwljYXNlIFdDRF9FVkVOVF9PQ1BfT046CisJCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX09DUF9PTik7CisJY2FzZSBXQ0RfRVZFTlRfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9JTlZBTElEKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2NkX2V2ZW50X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZF9tYmhjICptYmhjID0gKHN0cnVjdCB3Y2RfbWJoYyAqKWRhdGE7CisJZW51bSB3Y2Rfbm90aWZ5X2V2ZW50IGV2ZW50ID0gKGVudW0gd2NkX25vdGlmeV9ldmVudCl2YWw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJYm9vbCBtaWNiaWFzMiA9IGZhbHNlOworCWJvb2wgbWljYmlhczEgPSBmYWxzZTsKKwl1OCBmc21fZW4gPSAwOworCisJcHJfZGVidWcoIiVzOiBldmVudCAlcyAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJIHdjZF9tYmhjX2dldF9ldmVudF9zdHJpbmcoZXZlbnQpLCBldmVudCk7CisJaWYgKG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cykgeworCQltaWNiaWFzMiA9IG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cyhtYmhjLAorCQkJCQkJCQlNSUNfQklBU18yKTsKKwkJbWljYmlhczEgPSBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMobWJoYywKKwkJCQkJCQkJTUlDX0JJQVNfMSk7CisJfQorCXN3aXRjaCAoZXZlbnQpIHsKKwkvKiBNSUNCSUFTIHVzYWdlIGNoYW5nZSAqLworCWNhc2UgV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT046CisJCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IHRydWU7CisJCXByX2RlYnVnKCIlczogaXNfY2FwdHVyZTogJWRcbiIsIF9fZnVuY19fLAorCQkJICBtYmhjLT5pc19oc19yZWNvcmRpbmcpOworCQlicmVhazsKKwljYXNlIFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTjoKKwkJaWYgKCFtYmhjLT5taWNiaWFzX2VuYWJsZSkKKwkJCWdvdG8gb3V0X21pY2JfZW47CisJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwpIHsKKwkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybChjb2RlYywKKwkJCQkJTUJIQ19DT01NT05fTUlDQl9QUkVDSEFSR0UsCisJCQkJCXRydWUpOworCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAorCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1NFVF9WQUwsCisJCQkJCXRydWUpOworCQkJLyoKKwkJCSAqIFNwZWNpYWwgaGVhZHNldCBuZWVkcyBNSUNCSUFTIGFzIDIuN1Ygc28gd2FpdCBmb3IKKwkJCSAqIDUwIG1zZWMgZm9yIHRoZSBNSUNCSUFTIHRvIHJlYWNoIDIuNyB2b2x0cy4KKwkJCSAqLworCQkJbXNsZWVwKDUwKTsKKwkJfQorCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZykKKwkJCW1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcoY29kZWMsIHRydWUpOworCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKQorCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAorCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1BSRUNIQVJHRSwKKwkJCQkJZmFsc2UpOworb3V0X21pY2JfZW46CisJCS8qIERpc2FibGUgY3VycmVudCBzb3VyY2UgaWYgbWljYmlhcyBlbmFibGVkICovCisJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkgeworCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOworCQkJaWYgKGZzbV9lbikKKwkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLAorCQkJCQkJCSAwKTsKKwkJfSBlbHNlIHsKKwkJCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IHRydWU7CisJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisJCX0KKwkJLyogY29uZmlndXJlIGNhcCBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIG1pY2JpYXMgaXMgZW5hYmxlZCAqLworCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGOgorCQkvKgorCQkgKiBCZWZvcmUgTUlDQklBU18yIGlzIHR1cm5lZCBvZmYsIGlmIEZTTSBpcyBlbmFibGVkLAorCQkgKiBtYWtlIHN1cmUgY3VycmVudCBzb3VyY2UgaXMgZW5hYmxlZCBzbyBhcyB0byBkZXRlY3QKKwkJICogYnV0dG9uIHByZXNzL3JlbGVhc2UgZXZlbnRzCisJCSAqLworCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wgJiYKKwkJICAgICFtYmhjLT5taWNiaWFzX2VuYWJsZSkgeworCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOworCQkJaWYgKGZzbV9lbikKKwkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLAorCQkJCQkJCSAzKTsKKwkJfQorCQlicmVhazsKKwkvKiBNSUNCSUFTIHVzYWdlIGNoYW5nZSAqLworCWNhc2UgV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGOgorCQltYmhjLT5pc19oc19yZWNvcmRpbmcgPSBmYWxzZTsKKwkJcHJfZGVidWcoIiVzOiBpc19jYXB0dXJlOiAlZFxuIiwgX19mdW5jX18sCisJCQkgIG1iaGMtPmlzX2hzX3JlY29yZGluZyk7CisJCWJyZWFrOworCWNhc2UgV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRjoKKwkJaWYgKCFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKKwkJCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IGZhbHNlOworCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcpCisJCQltYmhjLT5tYmhjX2NiLT5zZXRfYXV0b196ZXJvaW5nKGNvZGVjLCBmYWxzZSk7CisJCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSAmJiAhbWJoYy0+bWljYmlhc19lbmFibGUpCisJCQltYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZShjb2RlYyk7CisJCS8qIEVuYWJsZSBQVUxMIFVQIGlmIFBBJ3MgYXJlIGVuYWJsZWQgKi8KKwkJaWYgKCh0ZXN0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhMLCAmbWJoYy0+ZXZlbnRfc3RhdGUpKSB8fAorCQkJCSh0ZXN0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhSLAorCQkJCQkgICZtYmhjLT5ldmVudF9zdGF0ZSkpKQorCQkJLyogZW5hYmxlIHB1bGx1cCBhbmQgY3MsIGRpc2FibGUgbWIgKi8KKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX1BVTExVUCk7CisJCWVsc2UKKwkJCS8qIGVuYWJsZSBjdXJyZW50IHNvdXJjZSBhbmQgZGlzYWJsZSBtYiwgcHVsbHVwKi8KKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX0NTKTsKKworCQkvKiBjb25maWd1cmUgY2FwIHNldHRpbmdzIHByb3Blcmx5IHdoZW4gbWljYmlhcyBpcyBkaXNhYmxlZCAqLworCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIFdDRF9FVkVOVF9QUkVfSFBITF9QQV9PRkY6CisJCW11dGV4X2xvY2soJm1iaGMtPmhwaGxfcGFfbG9jayk7CisJCWJyZWFrOworCWNhc2UgV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkY6CisJCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhMX1BBX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKKwkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBTTkRfSkFDS19PQ19IUEhMKQorCQkJaHBobG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwpOworCQljbGVhcl9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBITCwgJm1iaGMtPmV2ZW50X3N0YXRlKTsKKwkJLyogY2hlY2sgaWYgbWljYmlhcyBpcyBlbmFibGVkICovCisJCWlmIChtaWNiaWFzMikKKwkJCS8qIERpc2FibGUgY3MsIHB1bGx1cCAmIGVuYWJsZSBtaWNiaWFzICovCisJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisJCWVsc2UKKwkJCS8qIERpc2FibGUgbWljYmlhcywgcHVsbHVwICYgZW5hYmxlIGNzICovCisJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9DUyk7CisJCW11dGV4X3VubG9jaygmbWJoYy0+aHBobF9wYV9sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGOgorCQltdXRleF9sb2NrKCZtYmhjLT5ocGhyX3BhX2xvY2spOworCQlicmVhazsKKwljYXNlIFdDRF9FVkVOVF9QT1NUX0hQSFJfUEFfT0ZGOgorCQljbGVhcl9iaXQoV0NEX01CSENfSFBIUl9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCWlmIChtYmhjLT5ocGhfc3RhdHVzICYgU05EX0pBQ0tfT0NfSFBIUikKKwkJCWhwaHJvY3Bfb2ZmX3JlcG9ydChtYmhjLCBTTkRfSkFDS19PQ19IUEhSKTsKKwkJY2xlYXJfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSFIsICZtYmhjLT5ldmVudF9zdGF0ZSk7CisJCS8qIGNoZWNrIGlmIG1pY2JpYXMgaXMgZW5hYmxlZCAqLworCQlpZiAobWljYmlhczIpCisJCQkvKiBEaXNhYmxlIGNzLCBwdWxsdXAgJiBlbmFibGUgbWljYmlhcyAqLworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTUIpOworCQllbHNlCisJCQkvKiBEaXNhYmxlIG1pY2JpYXMsIHB1bGx1cCAmIGVuYWJsZSBjcyAqLworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fQ1MpOworCQltdXRleF91bmxvY2soJm1iaGMtPmhwaHJfcGFfbG9jayk7CisJCWJyZWFrOworCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09OOgorCQlzZXRfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSEwsICZtYmhjLT5ldmVudF9zdGF0ZSk7CisJCS8qIGNoZWNrIGlmIG1pY2JpYXMgaXMgZW5hYmxlZCAqLworCQlpZiAobWljYmlhczIpCisJCQkvKiBEaXNhYmxlIGNzLCBwdWxsdXAgJiBlbmFibGUgbWljYmlhcyAqLworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTUIpOworCQllbHNlCisJCQkvKiBEaXNhYmxlIG1pY2JpYXMsIGVuYWJsZSBwdWxsdXAgJiBjcyAqLworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fUFVMTFVQKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT046CisJCXNldF9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBIUiwgJm1iaGMtPmV2ZW50X3N0YXRlKTsKKwkJLyogY2hlY2sgaWYgbWljYmlhcyBpcyBlbmFibGVkICovCisJCWlmIChtaWNiaWFzMikKKwkJCS8qIERpc2FibGUgY3MsIHB1bGx1cCAmIGVuYWJsZSBtaWNiaWFzICovCisJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisJCWVsc2UKKwkJCS8qIERpc2FibGUgbWljYmlhcywgZW5hYmxlIHB1bGx1cCAmIGNzICovCisJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9QVUxMVVApOworCQlicmVhazsKKwljYXNlIFdDRF9FVkVOVF9PQ1BfT0ZGOgorCQltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChtYmhjLT5jb2RlYywKKwkJCQkJICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKKwkJCQkJICAgZmFsc2UpOworCQlicmVhazsKKwljYXNlIFdDRF9FVkVOVF9PQ1BfT046CisJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAorCQkJCQkgICBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwLAorCQkJCQkgICB0cnVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZF9jYW5jZWxfYnRuX3dvcmsoc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCWludCByOworCisJciA9IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWJoYy0+bWJoY19idG5fZHdvcmspOworCS8qCisJICogaWYgc2NoZWR1bGVkIG1iaGMubWJoY19idG5fZHdvcmsgaXMgY2FuY2VsZWQgZnJvbSBoZXJlLAorCSAqIHdlIGhhdmUgdG8gdW5sb2NrIGZyb20gaGVyZSBpbnN0ZWFkIGJ0bl93b3JrCisJICovCisJaWYgKHIpCisJCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOworCXJldHVybiByOworfQorCitzdGF0aWMgYm9vbCB3Y2Rfc3djaF9sZXZlbF9yZW1vdmUoc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCXUxNiByZXN1bHQyID0gMDsKKworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX1NXQ0hfTEVWRUxfUkVNT1ZFLCByZXN1bHQyKTsKKwlyZXR1cm4gKHJlc3VsdDIpID8gdHJ1ZSA6IGZhbHNlOworfQorCisvKiBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIGludGVycnVwdCBjb250ZXh0IHRoYXQgaG9sZCBzdXNwZW5kICovCitzdGF0aWMgdm9pZCB3Y2Rfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCQkgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXByX2RlYnVnKCIlczogc2NoZWR1bGluZyBjb3JyZWN0X3N3Y2hfcGx1Z1xuIiwgX19mdW5jX18pOworCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOworCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSBmYWxzZTsKKwltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIHRydWUpOworCXNjaGVkdWxlX3dvcmsod29yayk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkJIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcl9kZWJ1ZygiJXM6IENhbmNlbGluZyBjb3JyZWN0X3BsdWdfc3djaFxuIiwgX19mdW5jX18pOworCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSB0cnVlOworCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7CisJaWYgKGNhbmNlbF93b3JrX3N5bmMod29yaykpIHsKKwkJcHJfZGVidWcoIiVzOiBjb3JyZWN0X3BsdWdfc3djaCBpcyBjYW5jZWxlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOworCX0KKwlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKK30KKworc3RhdGljIHZvaWQgd2NkX21iaGNfY2xyX2FuZF90dXJub25faHBoX3BhZGFjKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKKwlib29sIHBhX3R1cm5lZF9vbiA9IGZhbHNlOworCXU4IHdnX3RpbWUgPSAwOworCisJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFBIX0NOUF9XR19USU1FLCB3Z190aW1lKTsKKwl3Z190aW1lICs9IDE7CisKKwltdXRleF9sb2NrKCZtYmhjLT5ocGhyX3BhX2xvY2spOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEX01CSENfSFBIUl9QQV9PRkZfQUNLLAorCQkJICAgICAgICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKSkgeworCQlwcl9kZWJ1ZygiJXM6IEhQSFIgY2xlYXIgZmxhZyBhbmQgZW5hYmxlIFBBXG4iLCBfX2Z1bmNfXyk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19IUEhSX1BBX0VOLCAxKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSFJfT0NQX0RFVF9FTiwgMSk7CisJCXBhX3R1cm5lZF9vbiA9IHRydWU7CisJfQorCW11dGV4X3VubG9jaygmbWJoYy0+aHBocl9wYV9sb2NrKTsKKwltdXRleF9sb2NrKCZtYmhjLT5ocGhsX3BhX2xvY2spOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEX01CSENfSFBITF9QQV9PRkZfQUNLLAorCQkJICAgICAgICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKSkgeworCQlwcl9kZWJ1ZygiJXM6IEhQSEwgY2xlYXIgZmxhZyBhbmQgZW5hYmxlIFBBXG4iLCBfX2Z1bmNfXyk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19IUEhMX1BBX0VOLCAxKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSExfT0NQX0RFVF9FTiwgMSk7CisJCXBhX3R1cm5lZF9vbiA9IHRydWU7CisJfQorCW11dGV4X3VubG9jaygmbWJoYy0+aHBobF9wYV9sb2NrKTsKKworCWlmIChwYV90dXJuZWRfb24pIHsKKwkJcHJfZGVidWcoIiVzOiBQQSB3YXMgdHVybmVkIG9uIGJ5IE1CSEMgYW5kIG5vdCBieSBEQVBNXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJdXNsZWVwX3JhbmdlKHdnX3RpbWUgKiAxMDAwLCB3Z190aW1lICogMTAwMCArIDUwKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHdjZF9tYmhjX2lzX2hwaF9wYV9vbihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJYm9vbCBocGhfcGFfb24gPSBmYWxzZTsKKworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hQSF9QQV9FTiwgaHBoX3BhX29uKTsKKworCXJldHVybiAoaHBoX3BhX29uKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgd2NkX21iaGNfc2V0X2FuZF90dXJub2ZmX2hwaF9wYWRhYyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJdTggd2dfdGltZSA9IDA7CisKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUsIHdnX3RpbWUpOworCXdnX3RpbWUgKz0gMTsKKworCS8qIElmIGhlYWRwaG9uZSBQQSBpcyBvbiwgY2hlY2sgaWYgdXNlcnNwYWNlIHJlY2VpdmVzCisJICogcmVtb3ZhbCBldmVudCB0byBzeW5jLXVwIFBBJ3Mgc3RhdGUKKwkgKi8KKwlpZiAod2NkX21iaGNfaXNfaHBoX3BhX29uKG1iaGMpKSB7CisJCXByX2RlYnVnKCIlcyBQQSBpcyBvbiwgc2V0dGluZyBQQV9PRkZfQUNLXG4iLCBfX2Z1bmNfXyk7CisJCXNldF9iaXQoV0NEX01CSENfSFBITF9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCXNldF9iaXQoV0NEX01CSENfSFBIUl9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19IUEhMX09DUF9ERVRfRU4sIDApOworCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBIUl9PQ1BfREVUX0VOLCAwKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXMgUEEgaXMgb2ZmXG4iLCBfX2Z1bmNfXyk7CisJfQorCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19IUEhfUEFfRU4sIDApOworCXVzbGVlcF9yYW5nZSh3Z190aW1lICogMTAwMCwgd2dfdGltZSAqIDEwMDAgKyA1MCk7Cit9CisKK2ludCB3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdWludDMyX3QgKnpsLAorCQkJdWludDMyX3QgKnpyKQoreworCSp6bCA9IG1iaGMtPnpsOworCSp6ciA9IG1iaGMtPnpyOworCisJaWYgKCp6bCAmJiAqenIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9tYmhjX2hzX2VsZWNfaXJxKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgaW50IGlycV90eXBlLAorCQkJCSBib29sIGVuYWJsZSkKK3sKKwlpbnQgaXJxOworCisJV0NEX01CSENfUlNDX0FTU0VSVF9MT0NLRUQobWJoYyk7CisKKwlpZiAoaXJxX3R5cGUgPT0gV0NEX01CSENfRUxFQ19IU19JTlMpCisJCWlycSA9IG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyOworCWVsc2UgaWYgKGlycV90eXBlID09IFdDRF9NQkhDX0VMRUNfSFNfUkVNKQorCQlpcnEgPSBtYmhjLT5pbnRyX2lkcy0+bWJoY19oc19yZW1faW50cjsKKwllbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBpcnFfdHlwZTogJWQsIGVuYWJsZTogJWRcbiIsCisJCQlfX2Z1bmNfXywgaXJxX3R5cGUsIGVuYWJsZSk7CisJCXJldHVybjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGlycTogJWQsIGVuYWJsZTogJWQsIGludHJfc3RhdHVzOiVsdVxuIiwKKwkJIF9fZnVuY19fLCBpcnEsIGVuYWJsZSwgbWJoYy0+aW50cl9zdGF0dXMpOworCWlmICgodGVzdF9iaXQoaXJxX3R5cGUsICZtYmhjLT5pbnRyX3N0YXR1cykpICE9IGVuYWJsZSkgeworCQltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChtYmhjLT5jb2RlYywgaXJxLCBlbmFibGUpOworCQlpZiAoZW5hYmxlKQorCQkJc2V0X2JpdChpcnFfdHlwZSwgJm1iaGMtPmludHJfc3RhdHVzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KGlycV90eXBlLCAmbWJoYy0+aW50cl9zdGF0dXMpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkX21iaGNfcmVwb3J0X3BsdWcoc3RydWN0IHdjZF9tYmhjICptYmhjLCBpbnQgaW5zZXJ0aW9uLAorCQkJCWVudW0gc25kX2phY2tfdHlwZXMgamFja190eXBlKQoreworCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOworCisJcHJfZGVidWcoIiVzOiBlbnRlciBpbnNlcnRpb24gJWQgaHBoX3N0YXR1cyAleFxuIiwKKwkJIF9fZnVuY19fLCBpbnNlcnRpb24sIG1iaGMtPmhwaF9zdGF0dXMpOworCWlmICghaW5zZXJ0aW9uKSB7CisJCS8qIFJlcG9ydCByZW1vdmFsICovCisJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfmphY2tfdHlwZTsKKwkJLyoKKwkJICogY2FuY2VsIHBvc3NpYmx5IHNjaGVkdWxlZCBidG4gd29yayBhbmQKKwkJICogcmVwb3J0IHJlbGVhc2UgaWYgd2UgcmVwb3J0ZWQgYnV0dG9uIHByZXNzCisJCSAqLworCQlpZiAod2NkX2NhbmNlbF9idG5fd29yayhtYmhjKSkgeworCQkJcHJfZGVidWcoIiVzOiBidXR0b24gcHJlc3MgaXMgY2FuY2VsZWRcbiIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIGlmIChtYmhjLT5idXR0b25zX3ByZXNzZWQpIHsKKwkJCXByX2RlYnVnKCIlczogcmVsZWFzZSBvZiBidXR0b24gcHJlc3MlZFxuIiwKKwkJCQkgX19mdW5jX18sIGphY2tfdHlwZSk7CisJCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+YnV0dG9uX2phY2ssIDAsCisJCQkJCSAgICBtYmhjLT5idXR0b25zX3ByZXNzZWQpOworCQkJbWJoYy0+YnV0dG9uc19wcmVzc2VkICY9CisJCQkJfldDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0s7CisJCX0KKworCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKKwkJCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCgKKwkJCQkJCW1iaGMtPmNvZGVjLCBNSUNfQklBU18yLAorCQkJCQkJTUlDQl9ESVNBQkxFKTsKKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQorCQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMoCisJCQkJCQltYmhjLT5jb2RlYywKKwkJCQkJCU1JQ19CSUFTXzIsIGZhbHNlKTsKKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSkgeworCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKG1iaGMtPmNvZGVjKTsKKwkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAwKTsKKwkJCX0KKwkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7CisJCX0KKworCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOworCQltYmhjLT56bCA9IG1iaGMtPnpyID0gMDsKKwkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgcmVtb3ZhbCAlZCgleClcbiIsIF9fZnVuY19fLAorCQkJIGphY2tfdHlwZSwgbWJoYy0+aHBoX3N0YXR1cyk7CisJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCisJCQkJbWJoYy0+aHBoX3N0YXR1cywgV0NEX01CSENfSkFDS19NQVNLKTsKKwkJd2NkX21iaGNfc2V0X2FuZF90dXJub2ZmX2hwaF9wYWRhYyhtYmhjKTsKKwkJaHBocm9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSFIpOworCQlocGhsb2NwX29mZl9yZXBvcnQobWJoYywgU05EX0pBQ0tfT0NfSFBITCk7CisJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX05PTkU7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVwb3J0IHJlbW92YWwgb2YgY3VycmVudCBqYWNrIHR5cGUuCisJCSAqIEhlYWRwaG9uZSB0byBoZWFkc2V0IHNob3VsZG4ndCByZXBvcnQgaGVhZHBob25lCisJCSAqIHJlbW92YWwuCisJCSAqLworCQlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlICYmCisJCSAgICAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hJR0hfSFBIIHx8CisJCSAgICBqYWNrX3R5cGUgPT0gU05EX0pBQ0tfTElORU9VVCkgJiYKKwkJICAgIChtYmhjLT5ocGhfc3RhdHVzICYmIG1iaGMtPmhwaF9zdGF0dXMgIT0gamFja190eXBlKSkgeworCisJCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKKwkJCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wpCisJCQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKAorCQkJCQkJbWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsCisJCQkJCQlNSUNCX0RJU0FCTEUpOworCQkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQorCQkJCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKAorCQkJCQkJbWJoYy0+Y29kZWMsCisJCQkJCQlNSUNfQklBU18yLCBmYWxzZSk7CisJCQkJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKSB7CisJCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAorCQkJCQkJCW1iaGMtPmNvZGVjKTsKKwkJCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKAorCQkJCQkJCVdDRF9NQkhDX01JQ0JfQ1RSTCwgMCk7CisJCQkJfQorCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7CisJCQl9CisJCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOworCQkJbWJoYy0+emwgPSBtYmhjLT56ciA9IDA7CisJCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyByZW1vdmFsICgleClcbiIsCisJCQkJIF9fZnVuY19fLCBtYmhjLT5ocGhfc3RhdHVzKTsKKwkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCisJCQkJCSAgICAwLCBXQ0RfTUJIQ19KQUNLX01BU0spOworCisJCQlpZiAobWJoYy0+aHBoX3N0YXR1cyA9PSBTTkRfSkFDS19MSU5FT1VUKSB7CisKKwkJCQlwcl9kZWJ1ZygiJXM6IEVuYWJsZSBtaWNiaWFzXG4iLCBfX2Z1bmNfXyk7CisJCQkJLyogRGlzYWJsZSBjdXJyZW50IHNvdXJjZSBhbmQgZW5hYmxlIG1pY2JpYXMgKi8KKwkJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisJCQkJcHJfZGVidWcoIiVzOiBzZXQgdXAgZWxlYyByZW1vdmFsIGRldGVjdGlvblxuIiwKKwkJCQkJICBfX2Z1bmNfXyk7CisJCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKAorCQkJCQkJV0NEX01CSENfRUxFQ1RfREVURUNUSU9OX1RZUEUsCisJCQkJCQkwKTsKKwkJCQl1c2xlZXBfcmFuZ2UoMjAwLCAyMTApOworCQkJCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsCisJCQkJCQkgICAgIFdDRF9NQkhDX0VMRUNfSFNfUkVNLAorCQkJCQkJICAgICB0cnVlKTsKKwkJCX0KKwkJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfihTTkRfSkFDS19IRUFEU0VUIHwKKwkJCQkJCVNORF9KQUNLX0xJTkVPVVQgfAorCQkJCQkJU05EX0pBQ0tfQU5DX0hFQURQSE9ORSB8CisJCQkJCQlTTkRfSkFDS19VTlNVUFBPUlRFRCk7CisJCX0KKworCQlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hFQURTRVQgJiYKKwkJCWphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEUEhPTkUpCisJCQltYmhjLT5ocGhfc3RhdHVzICY9IH5TTkRfSkFDS19IRUFEU0VUOworCisJCS8qIFJlcG9ydCBpbnNlcnRpb24gKi8KKwkJaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEUEhPTkUpCisJCQltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU7CisJCWVsc2UgaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19VTlNVUFBPUlRFRCkKKwkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUDsKKwkJZWxzZSBpZiAoamFja190eXBlID09IFNORF9KQUNLX0hFQURTRVQpIHsKKwkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX0hFQURTRVQ7CisJCQltYmhjLT5qaWZmaWVzX2F0cmVwb3J0ID0gamlmZmllczsKKwkJfSBlbHNlIGlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfTElORU9VVCkgeworCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gTUJIQ19QTFVHX1RZUEVfSElHSF9IUEg7CisJCX0gZWxzZSBpZiAoamFja190eXBlID09IFNORF9KQUNLX0FOQ19IRUFEUEhPTkUpCisJCQltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9BTkNfSEVBRFBIT05FOworCisJCWlmIChtYmhjLT5pbXBlZGFuY2VfZGV0ZWN0ICYmCisJCQltYmhjLT5tYmhjX2NiLT5jb21wdXRlX2ltcGVkYW5jZSAmJgorCQkJKG1iaGMtPm1iaGNfY2ZnLT5saW5laW5fdGggIT0gMCkpIHsKKwkJCW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlKG1iaGMsCisJCQkJCSZtYmhjLT56bCwgJm1iaGMtPnpyKTsKKwkJCWlmICgobWJoYy0+emwgPiBtYmhjLT5tYmhjX2NmZy0+bGluZWluX3RoICYmCisJCQkJbWJoYy0+emwgPCBNQVhfSU1QRUQpICYmCisJCQkJKG1iaGMtPnpyID4gbWJoYy0+bWJoY19jZmctPmxpbmVpbl90aCAmJgorCQkJCSBtYmhjLT56ciA8IE1BWF9JTVBFRCkgJiYKKwkJCQkoamFja190eXBlID09IFNORF9KQUNLX0hFQURQSE9ORSkpIHsKKwkJCQlqYWNrX3R5cGUgPSBTTkRfSkFDS19MSU5FT1VUOworCQkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOworCQkJCWlmIChtYmhjLT5ocGhfc3RhdHVzKSB7CisJCQkJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfihTTkRfSkFDS19IRUFEU0VUIHwKKwkJCQkJCQlTTkRfSkFDS19MSU5FT1VUIHwKKwkJCQkJCQlTTkRfSkFDS19VTlNVUFBPUlRFRCk7CisJCQkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsCisJCQkJCQkJJm1iaGMtPmhlYWRzZXRfamFjaywKKwkJCQkJCQltYmhjLT5ocGhfc3RhdHVzLAorCQkJCQkJCVdDRF9NQkhDX0pBQ0tfTUFTSyk7CisJCQkJfQorCQkJCXByX2RlYnVnKCIlczogTWFya2luZyBqYWNrIHR5cGUgYXMgU05EX0pBQ0tfTElORU9VVFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCX0KKworCQltYmhjLT5ocGhfc3RhdHVzIHw9IGphY2tfdHlwZTsKKworCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBpbnNlcnRpb24gJWQoJXgpXG4iLCBfX2Z1bmNfXywKKwkJCSBqYWNrX3R5cGUsIG1iaGMtPmhwaF9zdGF0dXMpOworCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAorCQkJCSAgICAobWJoYy0+aHBoX3N0YXR1cyB8IFNORF9KQUNLX01FQ0hBTklDQUwpLAorCQkJCSAgICBXQ0RfTUJIQ19KQUNLX01BU0spOworCQl3Y2RfbWJoY19jbHJfYW5kX3R1cm5vbl9ocGhfcGFkYWMobWJoYyk7CisJfQorCXByX2RlYnVnKCIlczogbGVhdmUgaHBoX3N0YXR1cyAleFxuIiwgX19mdW5jX18sIG1iaGMtPmhwaF9zdGF0dXMpOworfQorCitzdGF0aWMgYm9vbCB3Y2RfbWJoY19kZXRlY3RfYW5jX3BsdWdfdHlwZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJYm9vbCBhbmNfbWljX2ZvdW5kID0gZmFsc2U7CisJdTE2IHZhbCwgaHNfY29tcF9yZXMsIGJ0bl9zdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgcmV0cnkgPSAwOworCWludCB2YWxpZF9wbHVnX2NudCA9IDAsIGludmFsaWRfcGx1Z19jbnQgPSAwOworCWludCBidG5fc3RhdHVzX2NudCA9IDA7CisJYm9vbCBpc19jaGVja19idG5fcHJlc3MgPSBmYWxzZTsKKworCisJaWYgKG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcyA8IE1JQ19CSUFTXzEgfHwKKwkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzID4gTUlDX0JJQVNfNCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKKwkJcmV0dXJuIGZhbHNlOworCisJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCB2YWwpOworCisJaWYgKHZhbCkKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7CisKKwltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbChtYmhjLT5jb2RlYywKKwkJCQkJICAgIG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcywKKwkJCQkJICAgIE1JQ0JfRU5BQkxFKTsKKwlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTVVYX0NUTCwgMHgyKTsKKwlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQU5DX0RFVF9FTiwgMSk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7CisJLyoKKwkgKiB3YWl0IGZvciBidXR0b24gZGVib3VuY2UgdGltZSAyMG1zLiBJZiA0LXBvbGUgcGx1ZyBpcyBpbnNlcnRlZAorCSAqIGludG8gNS1wb2xlIGphY2ssIHRoZW4gdGhlcmUgd2lsbCBiZSBhIGJ1dHRvbiBwcmVzcyBpbnRlcnJ1cHQKKwkgKiBkdXJpbmcgYW5jIHBsdWcgZGV0ZWN0aW9uLiBJbiB0aGF0IGNhc2UgdGhvdWdoIEhzX2NvbXBfcmVzIGlzIDAsCisJICogaXQgc2hvdWxkIG5vdCBiZSBkZWNsYXJlZCBhcyBBTkMgcGx1ZyB0eXBlCisJICovCisJdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7CisKKwkvKgorCSAqIEFmdGVyIGVuYWJsaW5nIEZTTSwgdG8gaGFuZGxlIHNsb3cgaW5zZXJ0aW9uIHNjZW5hcmlvcywKKwkgKiBjaGVjayBoc19jb21wX3Jlc3VsdCBmb3IgZmV3IHRpbWVzIHRvIHNlZSBpZiB0aGUgSU4zIHZvbHRhZ2UKKwkgKiBpcyBiZWxvdyB0aGUgVnJlZgorCSAqLworCWRvIHsKKwkJaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggbGV2ZWwgaXMgbG93XG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBSZXRyeSBhdHRlbXB0ICVsdVxuIiwgX19mdW5jX18sIHJldHJ5ICsgMSk7CisJCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7CisKKwkJaWYgKCFoc19jb21wX3JlcykgeworCQkJdmFsaWRfcGx1Z19jbnQrKzsKKwkJCWlzX2NoZWNrX2J0bl9wcmVzcyA9IHRydWU7CisJCX0gZWxzZQorCQkJaW52YWxpZF9wbHVnX2NudCsrOworCQkvKiBXYWl0IDFtcyBiZWZvcmUgdGFraW5nIGFub3RoZXIgcmVhZGluZyAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisKKwkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX1NUQVRVUywgYnRuX3N0YXR1cyk7CisJCWlmIChidG5fc3RhdHVzKQorCQkJYnRuX3N0YXR1c19jbnQrKzsKKworCQlyZXRyeSsrOworCX0gd2hpbGUgKHJldHJ5IDwgQU5DX0RFVEVDVF9SRVRSWV9DTlQpOworCisJcHJfZGVidWcoIiVzOiB2YWxpZDogJWQsIGludmFsaWQ6ICVkLCBidG5fc3RhdHVzX2NudDogJWRcbiIsCisJCSBfX2Z1bmNfXywgdmFsaWRfcGx1Z19jbnQsIGludmFsaWRfcGx1Z19jbnQsIGJ0bl9zdGF0dXNfY250KTsKKworCS8qIGRlY2lzaW9uIGxvZ2ljICovCisJaWYgKCh2YWxpZF9wbHVnX2NudCA+IGludmFsaWRfcGx1Z19jbnQpICYmIGlzX2NoZWNrX2J0bl9wcmVzcyAmJgorCSAgICAoYnRuX3N0YXR1c19jbnQgPT0gMCkpCisJCWFuY19taWNfZm91bmQgPSB0cnVlOworZXhpdDoKKwlpZiAoIXZhbCkKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7CisKKwlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQU5DX0RFVF9FTiwgMCk7CisKKwltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbChtYmhjLT5jb2RlYywKKwkJCQkJICAgIG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcywKKwkJCQkJICAgIE1JQ0JfRElTQUJMRSk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01VWF9DVEwsIDB4MCk7CisJcHJfZGVidWcoIiVzOiBhbmMgbWljICVzZm91bmRcbiIsIF9fZnVuY19fLAorCQkgYW5jX21pY19mb3VuZCA/ICIiIDogIm5vdCAiKTsKKwlyZXR1cm4gYW5jX21pY19mb3VuZDsKK30KKworc3RhdGljIHZvaWQgd2NkX21iaGNfZmluZF9wbHVnX2FuZF9yZXBvcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCQkgZW51bSB3Y2RfbWJoY19wbHVnX3R5cGUgcGx1Z190eXBlKQoreworCWJvb2wgYW5jX21pY19mb3VuZCA9IGZhbHNlOworCWVudW0gc25kX2phY2tfdHlwZXMgamFja190eXBlOworCisJcHJfZGVidWcoIiVzOiBlbnRlciBjdXJyZW50X3BsdWcoJWQpIG5ld19wbHVnKCVkKVxuIiwKKwkJIF9fZnVuY19fLCBtYmhjLT5jdXJyZW50X3BsdWcsIHBsdWdfdHlwZSk7CisKKwlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKKworCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gcGx1Z190eXBlKSB7CisJCXByX2RlYnVnKCIlczogY2FibGUgYWxyZWFkeSByZXBvcnRlZCwgZXhpdFxuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpIHsKKwkJLyoKKwkJICogTm90aGluZyB3YXMgcmVwb3J0ZWQgcHJldmlvdXNseQorCQkgKiByZXBvcnQgYSBoZWFkcGhvbmUgb3IgdW5zdXBwb3J0ZWQKKwkJICovCisJCXdjZF9tYmhjX3JlcG9ydF9wbHVnKG1iaGMsIDEsIFNORF9KQUNLX0hFQURQSE9ORSk7CisJfSBlbHNlIGlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQKSB7CisJCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKQorCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMCwgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKQorCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMCwgU05EX0pBQ0tfSEVBRFNFVCk7CisJCXdjZF9tYmhjX3JlcG9ydF9wbHVnKG1iaGMsIDEsIFNORF9KQUNLX1VOU1VQUE9SVEVEKTsKKwl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSB7CisJCWlmIChtYmhjLT5tYmhjX2NmZy0+ZW5hYmxlX2FuY19taWNfZGV0ZWN0KQorCQkJYW5jX21pY19mb3VuZCA9IHdjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlKG1iaGMpOworCisJCWphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURTRVQ7CisJCWlmIChhbmNfbWljX2ZvdW5kKQorCQkJamFja190eXBlID0gU05EX0pBQ0tfQU5DX0hFQURQSE9ORTsKKworCQkvKgorCQkgKiBJZiBIZWFkcGhvbmUgd2FzIHJlcG9ydGVkIHByZXZpb3VzbHksIHRoaXMgd2lsbAorCQkgKiBvbmx5IHJlcG9ydCB0aGUgbWljIGxpbmUKKwkJICovCisJCXdjZF9tYmhjX3JlcG9ydF9wbHVnKG1iaGMsIDEsIGphY2tfdHlwZSk7CisJfSBlbHNlIGlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSElHSF9IUEgpIHsKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kZXRlY3RfZXh0bl9jYWJsZSkgeworCQkJLyogSGlnaCBpbXBlZGFuY2UgZGV2aWNlIGZvdW5kLiBSZXBvcnQgYXMgTElORU9VVCAqLworCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfTElORU9VVCk7CisJCQlwcl9kZWJ1ZygiJXM6IHNldHVwIG1pYyB0cmlnZ2VyIGZvciBmdXJ0aGVyIGRldGVjdGlvblxuIiwKKwkJCQkgX19mdW5jX18pOworCisJCQkvKiBEaXNhYmxlIEhXIEZTTSBhbmQgY3VycmVudCBzb3VyY2UgKi8KKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOworCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMCk7CisJCQkvKiBTZXR1cCBmb3IgaW5zZXJ0aW9uIGRldGVjdGlvbiAqLworCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX0RFVEVDVElPTl9UWVBFLAorCQkJCQkJIDEpOworCQkJLyoKKwkJCSAqIEVuYWJsZSBIUEhMIHRyaWdnZXIgYW5kIE1JQyBTY2htaXR0IHRyaWdnZXJzCisJCQkgKiBhbmQgcmVxdWVzdCBmb3IgZWxlYyBpbnNlcnRpb24gaW50ZXJydXB0cworCQkJICovCisJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywKKwkJCQkJCSAzKTsKKwkJCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsIFdDRF9NQkhDX0VMRUNfSFNfSU5TLAorCQkJCQkgICAgIHRydWUpOworCQl9IGVsc2UgeworCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfTElORU9VVCk7CisJCX0KKwl9IGVsc2UgeworCQlXQVJOKDEsICJVbmV4cGVjdGVkIGN1cnJlbnQgcGx1Z190eXBlICVkLCBwbHVnX3R5cGUgJWRcbiIsCisJCSAgICAgbWJoYy0+Y3VycmVudF9wbHVnLCBwbHVnX3R5cGUpOworCX0KK2V4aXQ6CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworfQorCisvKiBUbyBkZXRlcm1pbmUgaWYgY3Jvc3MgY29ubmVjdGlvbiBvY2N1cnJlZCAqLworc3RhdGljIGludCB3Y2RfY2hlY2tfY3Jvc3NfY29ubihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJdTE2IHN3YXBfcmVzID0gMDsKKwllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9OT05FOworCXMxNiByZWcxID0gMDsKKwlib29sIGhwaGxfc2NoX3JlcyA9IDAsIGhwaHJfc2NoX3JlcyA9IDA7CisKKwlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7CisJCXByX2RlYnVnKCIlczogU3dpdGNoIGxldmVsIGlzIGxvd1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBQQSBpcyBlbmFibGVkLCBkb250IGNoZWNrIGZvciBjcm9zcy1jb25uZWN0aW9uICovCisJaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wYV9vbl9zdGF0dXMpCisJCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKG1iaGMtPmNvZGVjKSkKKwkJCXJldHVybiBmYWxzZTsKKworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIHJlZzEpOworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGNyb3NzIGNvbm5lY3Rpb24sCisJICogTWljYmlhcyBhbmQgc2NobWl0dCB0cmlnZ2VyIChIUEhMLUhQSFIpCisJICogbmVlZHMgdG8gYmUgZW5hYmxlZC4gRm9yIHNvbWUgY29kZWNzIGxpa2Ugd2NkOTMzNSwKKwkgKiBwdWxsLXVwIHdpbGwgYWxyZWFkeSBiZSBlbmFibGVkIHdoZW4gdGhpcyBmdW5jdGlvbgorCSAqIGlzIGNhbGxlZCBmb3IgY3Jvc3MtY29ubmVjdGlvbiBpZGVudGlmaWNhdGlvbi4gTm8KKwkgKiBuZWVkIHRvIGVuYWJsZSBtaWNiaWFzIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIDIpOworCisJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRUxFQ1RfUkVTVUxULCBzd2FwX3Jlcyk7CisJcHJfZGVidWcoIiVzOiBzd2FwX3JlcyV4XG4iLCBfX2Z1bmNfXywgc3dhcF9yZXMpOworCisJLyoKKwkgKiBSZWFkIHJlZyBocGhsIGFuZCBocGhyIHNjaG1pdHQgcmVzdWx0IHdpdGggY3Jvc3MgY29ubmVjdGlvbgorCSAqIGJpdC4gVGhlc2UgYml0cyB3aWxsIGJvdGggYmUgIjAiIGluIGNhc2Ugb2YgY3Jvc3MgY29ubmVjdGlvbgorCSAqIG90aGVyd2lzZSwgdGhleSBzdGF5IGF0IDEKKwkgKi8KKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2hfcmVzKTsKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhSX1NDSE1UX1JFU1VMVCwgaHBocl9zY2hfcmVzKTsKKwlpZiAoIShocGhsX3NjaF9yZXMgfHwgaHBocl9zY2hfcmVzKSkgeworCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7CisJCXByX2RlYnVnKCIlczogQ3Jvc3MgY29ubmVjdGlvbiBpZGVudGlmaWVkXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBObyBDcm9zcyBjb25uZWN0aW9uIGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJLyogRGlzYWJsZSBzY2htaXR0IHRyaWdnZXIgYW5kIHJlc3RvcmUgbWljYmlhcyAqLworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCByZWcxKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlLCBwbHVnIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgIHBsdWdfdHlwZSk7CisKKwlyZXR1cm4gKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCB3Y2RfaXNfc3BlY2lhbF9oZWFkc2V0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlpbnQgZGVsYXkgPSAwLCByYzsKKwlib29sIHJldCA9IGZhbHNlOworCXUxNiBoc19jb21wX3JlczsKKwlib29sIGlzX3NwbF9ocyA9IGZhbHNlOworCisJLyoKKwkgKiBJbmNyZWFzZSBtaWNiaWFzIHRvIDIuN1YgdG8gZGV0ZWN0IGhlYWRzZXRzIHdpdGgKKwkgKiB0aHJlc2hvbGQgb24gbWljcm9waG9uZQorCSAqLworCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCAmJgorCSAgICAhbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykgeworCQlwcl9kZWJ1ZygiJXM6IGNhbGxiYWNrIGZuIG1pY2JfY3RybF90aHJfbWljIG5vdCBkZWZpbmVkXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykgeworCQlyYyA9IG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMoY29kZWMsCisJCQkJCQkJTUlDX0JJQVNfMiwgdHJ1ZSk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogTWljYmlhcyBjb250cm9sIGZvciB0aHIgbWljIGZhaWxlZCwgcmM6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisKKwlwcl9kZWJ1ZygiJXM6IHNwZWNpYWwgaGVhZHNldCwgc3RhcnQgcmVnaXN0ZXIgd3JpdGVzXG4iLCBfX2Z1bmNfXyk7CisKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXMpOworCXdoaWxlICghaXNfc3BsX2hzKSAgeworCQlpZiAobWJoYy0+aHNfZGV0ZWN0X3dvcmtfc3RvcCkgeworCQkJcHJfZGVidWcoIiVzOiBzdG9wIHJlcXVlc3RlZDogJWRcbiIsIF9fZnVuY19fLAorCQkJCQltYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKTsKKwkJCWJyZWFrOworCQl9CisJCWRlbGF5ID0gZGVsYXkgKyA1MDsKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybCkgeworCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAorCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1BSRUNIQVJHRSwKKwkJCQkJdHJ1ZSk7CisJCQltYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwoY29kZWMsCisJCQkJCU1CSENfQ09NTU9OX01JQ0JfU0VUX1ZBTCwKKwkJCQkJdHJ1ZSk7CisJCX0KKwkJLyogV2FpdCBmb3IgNTBtc2VjIGZvciBNSUNCSUFTIHRvIHNldHRsZSBkb3duICovCisJCW1zbGVlcCg1MCk7CisJCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfYXV0b196ZXJvaW5nKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZyhjb2RlYywgdHJ1ZSk7CisJCS8qIFdhaXQgZm9yIDUwbXNlYyBmb3IgRlNNIHRvIHVwZGF0ZSByZXN1bHQgdmFsdWVzICovCisJCW1zbGVlcCg1MCk7CisJCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7CisJCWlmICghKGhzX2NvbXBfcmVzKSkgeworCQkJcHJfZGVidWcoIiVzOiBTcGVjaWFsIGhlYWRzZXQgZGV0ZWN0ZWQgaW4gJWQgbXNlY3NcbiIsCisJCQkJCV9fZnVuY19fLCAoZGVsYXkgKiAyKSk7CisJCQlpc19zcGxfaHMgPSB0cnVlOworCQl9CisJCWlmIChkZWxheSA9PSBTUEVDSUFMX0hTX0RFVEVDVF9USU1FX01TKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFNwbCBoZWFkc2V0IGRpZCBub3QgZ2V0IGRldGVjdCBpbiA0IHNlY1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGlzX3NwbF9ocykgeworCQlwcl9kZWJ1ZygiJXM6IEhlYWRzZXQgd2l0aCB0aHJlc2hvbGQgZm91bmRcbiIsICBfX2Z1bmNfXyk7CisJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gdHJ1ZTsKKwkJcmV0ID0gdHJ1ZTsKKwl9CisJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybCkKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAorCQkJCU1CSENfQ09NTU9OX01JQ0JfUFJFQ0hBUkdFLAorCQkJCWZhbHNlKTsKKwlpZiAobWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUgJiYgIW1iaGMtPm1pY2JpYXNfZW5hYmxlKQorCQltYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZShjb2RlYyk7CisJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcpCisJCW1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcoY29kZWMsIGZhbHNlKTsKKworCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljICYmCisJICAgICFtYmhjLT5taWNiaWFzX2VuYWJsZSkKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYyhjb2RlYywgTUlDX0JJQVNfMiwKKwkJCQkJCSAgICAgIGZhbHNlKTsKKworCXByX2RlYnVnKCIlczogbGVhdmUsIG1pY2JfZW5hYmxlOiAlZFxuIiwgX19mdW5jX18sCisJCSAgbWJoYy0+bWljYmlhc19lbmFibGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9tYmhjX3VwZGF0ZV9mc21fc291cmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkgICAgICAgZW51bSB3Y2RfbWJoY19wbHVnX3R5cGUgcGx1Z190eXBlKQoreworCWJvb2wgbWljYmlhczI7CisKKwltaWNiaWFzMiA9IG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cyhtYmhjLAorCQkJCQkJCU1JQ19CSUFTXzIpOworCXN3aXRjaCAocGx1Z190eXBlKSB7CisJY2FzZSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU6CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDMpOworCQlicmVhazsKKwljYXNlIE1CSENfUExVR19UWVBFX0hFQURTRVQ6CisJY2FzZSBNQkhDX1BMVUdfVFlQRV9BTkNfSEVBRFBIT05FOgorCQlpZiAoIW1iaGMtPmlzX2hzX3JlY29yZGluZyAmJiAhbWljYmlhczIpCisJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMCk7CisJCWJyZWFrOworCisJfTsKK30KKworc3RhdGljIHZvaWQgd2NkX2VuYWJsZV9tYmhjX3N1cHBseShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCisJCQllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCS8qCisJICogRG8gbm90IGRpc2FibGUgbWljYmlhcyBpZiByZWNvcmRpbmcgaXMgZ29pbmcgb24gb3IKKwkgKiBoZWFkc2V0IGlzIGluc2VydGVkIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBleHRuCisJICogY2FibGUuIElmIGhlYWRzZXQgaGFzIGJlZW4gZGV0ZWN0ZWQgY3VycmVudCBzb3VyY2UKKwkgKiBuZWVkcyB0byBiZSBrZXB0IGVuYWJsZWQgZm9yIGJ1dHRvbiBkZXRlY3Rpb24gdG8gd29yay4KKwkgKiBJZiB0aGUgYWNjZXNzb3J5IHR5cGUgaXMgaW52YWxpZCBvciB1bnN1cHBvcnRlZCwgd2UKKwkgKiBkb250IG5lZWQgdG8gZW5hYmxlIGVpdGhlciBvZiB0aGVtLgorCSAqLworCWlmIChkZXRfZXh0bl9jYWJsZV9lbiAmJiBtYmhjLT5pc19leHRuX2NhYmxlICYmCisJCW1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+ZXh0bl91c2VfbWIgJiYKKwkJbWJoYy0+bWJoY19jYi0+ZXh0bl91c2VfbWIoY29kZWMpKSB7CisJCWlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FIHx8CisJCSAgICBwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkKKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKKwl9IGVsc2UgeworCQlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURTRVQpIHsKKwkJCWlmIChtYmhjLT5pc19oc19yZWNvcmRpbmcgfHwgbWJoYy0+bWljYmlhc19lbmFibGUpCisJCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKKwkJCQkJCQlXQ0RfTUJIQ19FTl9NQik7CisJCQllbHNlIGlmICgodGVzdF9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBITCwKKwkJCQkJCSZtYmhjLT5ldmVudF9zdGF0ZSkpIHx8CisJCQkJICh0ZXN0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhSLAorCQkJCQkJJm1iaGMtPmV2ZW50X3N0YXRlKSkpCisJCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKKwkJCQkJCQlXQ0RfTUJIQ19FTl9QVUxMVVApOworCQkJZWxzZQorCQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsCisJCQkJCQkJV0NEX01CSENfRU5fQ1MpOworCQl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpIHsKKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX0NTKTsKKwkJfSBlbHNlIHsKKwkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX05PTkUpOworCQl9CisJfQorfQorCitzdGF0aWMgYm9vbCB3Y2RfbWJoY19jaGVja19mb3Jfc3BsX2hlYWRzZXQoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCQkgICBpbnQgKnNwbF9oc19jbnQpCit7CisJdTE2IGhzX2NvbXBfcmVzXzFfOHYgPSAwLCBoc19jb21wX3Jlc18yXzd2ID0gMDsKKwlib29sIHNwbF9ocyA9IGZhbHNlOworCisJaWYgKCFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBSZWFkIGJhY2sgaHNfY29tcF9yZXMgQCAxLjh2IE1pY2JpYXMgKi8KKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXNfMV84dik7CisJaWYgKCFoc19jb21wX3Jlc18xXzh2KSB7CisJCXNwbF9ocyA9IGZhbHNlOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogQnVtcCB1cCBNQjIgdG8gMi43diAqLworCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCisJCQkJbWJoYy0+bWJoY19jZmctPm1iaGNfbWljYmlhcywgdHJ1ZSk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7CisKKwkvKiBSZWFkIGJhY2sgSFNfQ09NUF9SRVNVTFQgKi8KKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXNfMl83dik7CisJaWYgKCFoc19jb21wX3Jlc18yXzd2ICYmIGhzX2NvbXBfcmVzXzFfOHYpCisJCXNwbF9ocyA9IHRydWU7CisKKwlpZiAoc3BsX2hzICYmIHNwbF9oc19jbnQpCisJCSpzcGxfaHNfY250ICs9IDE7CisKKwkvKiBNQjIgYmFjayB0byAxLjh2ICovCisJaWYgKCpzcGxfaHNfY250ICE9IFdDRF9NQkhDX1NQTF9IU19DTlQpIHsKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYyhtYmhjLT5jb2RlYywKKwkJCQltYmhjLT5tYmhjX2NmZy0+bWJoY19taWNiaWFzLCBmYWxzZSk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOworCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7CisJfQorCisJaWYgKHNwbF9ocykKKwkJcHJfZGVidWcoIiVzOiBEZXRlY3RlZCBzcGVjaWFsIEhTICglZClcbiIsIF9fZnVuY19fLCBzcGxfaHMpOworCitleGl0OgorCXJldHVybiBzcGxfaHM7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jb3JyZWN0X3N3Y2hfcGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdjZF9tYmhjICptYmhjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9JTlZBTElEOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MTYgaHNfY29tcF9yZXMgPSAwLCBocGhsX3NjaCA9IDAsIG1pY19zY2ggPSAwLCBidG5fcmVzdWx0ID0gMDsKKwlib29sIHdya19jb21wbGV0ZSA9IGZhbHNlOworCWludCBwdF9nbmRfbWljX3N3YXBfY250ID0gMDsKKwlpbnQgbm9fZ25kX21pY19zd2FwX2NudCA9IDA7CisJYm9vbCBpc19wYV9vbiA9IGZhbHNlLCBzcGxfaHMgPSBmYWxzZTsKKwlib29sIG1pY2JpYXMyID0gZmFsc2U7CisJYm9vbCBtaWNiaWFzMSA9IGZhbHNlOworCWludCByZXQgPSAwOworCWludCByYywgc3BsX2hzX2NvdW50ID0gMDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCW1iaGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdjZF9tYmhjLCBjb3JyZWN0X3BsdWdfc3djaCk7CisJY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCS8qCisJICogRW5hYmxlIG1pY2JpYXMvcHVsbHVwIGZvciBkZXRlY3Rpb24gaW4gY29ycmVjdCB3b3JrLgorCSAqIFRoaXMgd29yayB3aWxsIGdldCBzY2hlZHVsZWQgZnJvbSBkZXRlY3RfcGx1Z190eXBlIHdoaWNoCisJICogd2lsbCBhbHJlYWR5IHJlcXVlc3QgZm9yIHB1bGx1cC9taWNiaWFzLiBJZiB0aGUgcHVsbHVwL21pY2JpYXMKKwkgKiBpcyBoYW5kbGVkIHdpdGggcmVmLWNvdW50cyBieSBpbmRpdmlkdWFsIGNvZGVjIGRyaXZlcnMsIHRoZXJlIGlzCisJICogbm8gbmVlZCB0byBlbmFiYWxlIG1pY2JpYXMvcHVsbHVwIGhlcmUKKwkgKi8KKworCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKKworCisJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApIHsKKwkJbWJoYy0+Y3VycmVudF9wbHVnID0gTUJIQ19QTFVHX1RZUEVfTk9ORTsKKwkJZ290byBjb3JyZWN0X3BsdWdfdHlwZTsKKwl9CisKKwkvKiBFbmFibGUgSFcgRlNNICovCisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7CisJLyoKKwkgKiBDaGVjayBmb3IgYW55IGJ1dHRvbiBwcmVzcyBpbnRlcnJ1cHRzIGJlZm9yZSBzdGFydGluZyAzLXNlYworCSAqIGxvb3AuCisJICovCisJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iaGMtPmJ0bl9wcmVzc19jb21wbCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoV0NEX01CSENfQlROX1BSRVNTX0NPTVBMX1RJTUVPVVRfTVMpKTsKKworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0JUTl9SRVNVTFQsIGJ0bl9yZXN1bHQpOworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7CisKKwlpZiAoIXJjKSB7CisJCXByX2RlYnVnKCIlcyBObyBidG4gcHJlc3MgaW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisJCWlmICghYnRuX3Jlc3VsdCAmJiAhaHNfY29tcF9yZXMpCisJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOworCQllbHNlIGlmICghYnRuX3Jlc3VsdCAmJiBoc19jb21wX3JlcykKKwkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOworCQllbHNlCisJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9JTlZBTElEOworCX0gZWxzZSB7CisJCWlmICghYnRuX3Jlc3VsdCAmJiAhaHNfY29tcF9yZXMpCisJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU7CisJCWVsc2UKKwkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0lOVkFMSUQ7CisJfQorCisJcHJfZGVidWcoIiVzOiBWYWxpZCBwbHVnIGZvdW5kLCBwbHVnIHR5cGUgaXMgJWRcbiIsCisJCQkgX19mdW5jX18sIHBsdWdfdHlwZSk7CisJaWYgKChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCB8fAorCSAgICAgcGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSkgJiYKKwkgICAgKCF3Y2Rfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpKSB7CisJCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOworCQl3Y2RfbWJoY19maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOworCQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOworCX0KKworY29ycmVjdF9wbHVnX3R5cGU6CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSFNfREVURUNUX1BMVUdfVElNRV9NUyk7CisJd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKKwkJCQkJCVdDRF9NQkhDX0VOX05PTkUpOworCQkJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlKSB7CisJCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKKwkJCQkJbWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsIGZhbHNlKTsKKwkJCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUpCisJCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAorCQkJCQkJCW1iaGMtPmNvZGVjKTsKKwkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOworCQkJfQorCQkJZ290byBleGl0OworCQl9CisJCWlmIChtYmhjLT5idG5fcHJlc3NfaW50cikgeworCQkJd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKKwkJCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7CisJCX0KKwkJLyogVG9nZ2xlIEZTTSAqLworCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7CisKKwkJLyogYWxsb3cgc29tZXRpbWUgYW5kIHJlLWNoZWNrIHN0b3AgcmVxdWVzdGVkIGFnYWluICovCisJCW1zbGVlcCgyMCk7CisJCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOworCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKKwkJCQkJCVdDRF9NQkhDX0VOX05PTkUpOworCQkJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlKSB7CisJCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKKwkJCQkJbWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsIGZhbHNlKTsKKwkJCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUpCisJCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAorCQkJCQkJCW1iaGMtPmNvZGVjKTsKKwkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOworCQkJfQorCQkJZ290byBleGl0OworCQl9CisJCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7CisKKwkJcHJfZGVidWcoIiVzOiBoc19jb21wX3JlczogJXhcbiIsIF9fZnVuY19fLCBoc19jb21wX3Jlcyk7CisJCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKQorCQkJaXNfcGFfb24gPSBtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKGNvZGVjKTsKKworCQkvKgorCQkgKiBpbnN0ZWFkIG9mIGhvZ2dpbmcgc3lzdGVtIGJ5IGNvbnRpbmVvdXMgcG9sbGluZywgd2FpdCBmb3IKKwkJICogc29tZXRpbWUgYW5kIHJlLWNoZWNrIHN0b3AgcmVxdWVzdCBhZ2Fpbi4KKwkJICovCisJCW1zbGVlcCgxODApOworCQlpZiAoaHNfY29tcF9yZXMgJiYgKHNwbF9oc19jb3VudCA8IFdDRF9NQkhDX1NQTF9IU19DTlQpKSB7CisJCQlzcGxfaHMgPSB3Y2RfbWJoY19jaGVja19mb3Jfc3BsX2hlYWRzZXQobWJoYywKKwkJCQkJCQkJJnNwbF9oc19jb3VudCk7CisKKwkJCWlmIChzcGxfaHNfY291bnQgPT0gV0NEX01CSENfU1BMX0hTX0NOVCkgeworCQkJCWhzX2NvbXBfcmVzID0gMDsKKwkJCQlzcGxfaHMgPSB0cnVlOworCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmICgoIWhzX2NvbXBfcmVzKSAmJiAoIWlzX3BhX29uKSkgeworCQkJLyogQ2hlY2sgZm9yIGNyb3NzIGNvbm5lY3Rpb24qLworCQkJcmV0ID0gd2NkX2NoZWNrX2Nyb3NzX2Nvbm4obWJoYyk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChyZXQgPiAwKSB7CisJCQkJcHRfZ25kX21pY19zd2FwX2NudCsrOworCQkJCW5vX2duZF9taWNfc3dhcF9jbnQgPSAwOworCQkJCWlmIChwdF9nbmRfbWljX3N3YXBfY250IDwKKwkJCQkJCUdORF9NSUNfU1dBUF9USFJFU0hPTEQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChwdF9nbmRfbWljX3N3YXBfY250ID4KKwkJCQkJCUdORF9NSUNfU1dBUF9USFJFU0hPTEQpIHsKKwkJCQkJLyoKKwkJCQkJICogVGhpcyBpcyBkdWUgdG8gR05EL01JQyBzd2l0Y2ggZGlkbid0CisJCQkJCSAqIHdvcmssICBSZXBvcnQgdW5zdXBwb3J0ZWQgcGx1Zy4KKwkJCQkJICovCisJCQkJCXByX2RlYnVnKCIlczogc3dpdGNoIGRpZCBub3Qgd29ya1xuIiwKKwkJCQkJCSAgX19mdW5jX18pOworCQkJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7CisJCQkJCWdvdG8gcmVwb3J0OworCQkJCX0gZWxzZSB7CisJCQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5vX2duZF9taWNfc3dhcF9jbnQrKzsKKwkJCQlwdF9nbmRfbWljX3N3YXBfY250ID0gMDsKKwkJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOworCQkJCWlmICgobm9fZ25kX21pY19zd2FwX2NudCA8CisJCQkJICAgIEdORF9NSUNfU1dBUF9USFJFU0hPTEQpICYmCisJCQkJICAgIChzcGxfaHNfY291bnQgIT0gV0NEX01CSENfU1BMX0hTX0NOVCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJbm9fZ25kX21pY19zd2FwX2NudCA9IDA7CisJCQkJfQorCQkJfQorCQkJaWYgKChwdF9nbmRfbWljX3N3YXBfY250ID09IEdORF9NSUNfU1dBUF9USFJFU0hPTEQpICYmCisJCQkJKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApKSB7CisJCQkJLyoKKwkJCQkgKiBpZiBzd2l0Y2ggaXMgdG9nZ2xlZCwgY2hlY2sgYWdhaW4sCisJCQkJICogb3RoZXJ3aXNlIHJlcG9ydCB1bnN1cHBvcnRlZCBwbHVnCisJCQkJICovCisJCQkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5zd2FwX2duZF9taWMgJiYKKwkJCQkJbWJoYy0+bWJoY19jZmctPnN3YXBfZ25kX21pYyhjb2RlYykpIHsKKwkJCQkJcHJfZGVidWcoIiVzOiBVU19FVSBncGlvIHByZXNlbnQsZmxpcCBzd2l0Y2hcbiIKKwkJCQkJCSwgX19mdW5jX18pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2gpOworCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19NSUNfU0NITVRfUkVTVUxULCBtaWNfc2NoKTsKKwkJaWYgKGhzX2NvbXBfcmVzICYmICEoaHBobF9zY2ggfHwgbWljX3NjaCkpIHsKKwkJCXByX2RlYnVnKCIlczogY2FibGUgaXMgZXh0ZW5zaW9uIGNhYmxlXG4iLCBfX2Z1bmNfXyk7CisJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9ISUdIX0hQSDsKKwkJCXdya19jb21wbGV0ZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IGNhYmxlIG1pZ2h0IGJlIGhlYWRzZXQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJcGx1Z190eXBlKTsKKwkJCWlmICghKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApKSB7CisJCQkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVDsKKwkJCQkvKgorCQkJCSAqIFJlcG9ydCBoZWFkc2V0IG9ubHkgaWYgbm90IGFscmVhZHkgcmVwb3J0ZWQKKwkJCQkgKiBhbmQgaWYgdGhlcmUgaXMgbm90IGJ1dHRvbiBwcmVzcyB3aXRob3V0CisJCQkJICogcmVsZWFzZQorCQkJCSAqLworCQkJCWlmICgoKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPQorCQkJCSAgICAgIE1CSENfUExVR19UWVBFX0hFQURTRVQpICYmCisJCQkJICAgICAobWJoYy0+Y3VycmVudF9wbHVnICE9CisJCQkJICAgICAgTUJIQ19QTFVHX1RZUEVfQU5DX0hFQURQSE9ORSkpICYmCisJCQkJICAgICF3Y2Rfc3djaF9sZXZlbF9yZW1vdmUobWJoYykgJiYKKwkJCQkgICAgIW1iaGMtPmJ0bl9wcmVzc19pbnRyKSB7CisJCQkJCXByX2RlYnVnKCIlczogY2FibGUgaXMgJXNoZWFkc2V0XG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQkoKHNwbF9oc19jb3VudCA9PQorCQkJCQkJCVdDRF9NQkhDX1NQTF9IU19DTlQpID8KKwkJCQkJCQkic3BlY2lhbCAiOiIiKSk7CisJCQkJCWdvdG8gcmVwb3J0OworCQkJCX0KKwkJCX0KKwkJCXdya19jb21wbGV0ZSA9IGZhbHNlOworCQl9CisJfQorCWlmICghd3JrX2NvbXBsZXRlICYmIG1iaGMtPmJ0bl9wcmVzc19pbnRyKSB7CisJCXByX2RlYnVnKCIlczogQ2FuIGJlIHNsb3cgaW5zZXJ0aW9uIG9mIGhlYWRwaG9uZVxuIiwgX19mdW5jX18pOworCQl3Y2RfY2FuY2VsX2J0bl93b3JrKG1iaGMpOworCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU7CisJfQorCS8qCisJICogSWYgcGx1Z190eWUgaXMgaGVhZHNldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIGVpdGhlciBpbgorCSAqIGRldGVjdF9wbHVnLXR5cGUgb3IgaW4gYWJvdmUgd2hpbGUgbG9vcCwgbm8gbmVlZCB0byByZXBvcnQgYWdhaW4KKwkgKi8KKwlpZiAoIXdya19jb21wbGV0ZSAmJiAoKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSB8fAorCSAgICAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkUpKSkgeworCQlwcl9kZWJ1ZygiJXM6IHBsdWdfdHlwZToweCV4IGFscmVhZHkgcmVwb3J0ZWRcbiIsCisJCQkgX19mdW5jX18sIG1iaGMtPmN1cnJlbnRfcGx1Zyk7CisJCWdvdG8gZW5hYmxlX3N1cHBseTsKKwl9CisKKwlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hJR0hfSFBIICYmCisJCSghZGV0X2V4dG5fY2FibGVfZW4pKSB7CisJCWlmICh3Y2RfaXNfc3BlY2lhbF9oZWFkc2V0KG1iaGMpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFNwZWNpYWwgaGVhZHNldCBmb3VuZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHBsdWdfdHlwZSk7CisJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOworCQkJZ290byByZXBvcnQ7CisJCX0KKwl9CisKK3JlcG9ydDoKKwlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7CisJCXByX2RlYnVnKCIlczogU3dpdGNoIGxldmVsIGlzIGxvd1xuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCWlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQICYmIG1iaGMtPmJ0bl9wcmVzc19pbnRyKSB7CisJCXByX2RlYnVnKCIlczogaW5zZXJ0aW9uIG9mIGhlYWRwaG9uZSB3aXRoIHN3YXBcbiIsIF9fZnVuY19fKTsKKwkJd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKKwkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FOworCX0KKwlwcl9kZWJ1ZygiJXM6IFZhbGlkIHBsdWcgZm91bmQsIHBsdWcgdHlwZSAlZCB3cmtfY21wdCAlZCBidG5faW50ciAlZFxuIiwKKwkJCV9fZnVuY19fLCBwbHVnX3R5cGUsIHdya19jb21wbGV0ZSwKKwkJCW1iaGMtPmJ0bl9wcmVzc19pbnRyKTsKKwlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKKwl3Y2RfbWJoY19maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOworCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7CitlbmFibGVfc3VwcGx5OgorCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKKwkJd2NkX21iaGNfdXBkYXRlX2ZzbV9zb3VyY2UobWJoYywgcGx1Z190eXBlKTsKKwllbHNlCisJCXdjZF9lbmFibGVfbWJoY19zdXBwbHkobWJoYywgcGx1Z190eXBlKTsKK2V4aXQ6CisJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sICYmCisJICAgICFtYmhjLT5taWNiaWFzX2VuYWJsZSkKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2woY29kZWMsIE1JQ19CSUFTXzIsCisJCQkJCQkgICAgTUlDQl9ESVNBQkxFKTsKKwlpZiAobWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKSB7CisJCW1pY2JpYXMxID0gbWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKG1iaGMsCisJCQkJCQkJCU1JQ19CSUFTXzEpOworCQltaWNiaWFzMiA9IG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cyhtYmhjLAorCQkJCQkJCQlNSUNfQklBU18yKTsKKwl9CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlICYmCisJICAgICgocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSkgfHwKKwkgICAgIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkpICYmCisJICAgICFtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7CisJCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOworCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX1JFTSwgdHJ1ZSk7CisJCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7CisJfQorCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfY2FwX21vZGUpCisJCW1iaGMtPm1iaGNfY2ItPnNldF9jYXBfbW9kZShjb2RlYywgbWljYmlhczEsIG1pY2JpYXMyKTsKKworCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcHVsbF9kb3duX2N0cmwpCisJCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybChjb2RlYywgdHJ1ZSk7CisKKwltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIGZhbHNlKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2RfbWJoY19kZXRlY3RfcGx1Z190eXBlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGU7CisJYm9vbCBtaWNiaWFzMSA9IGZhbHNlOworCWludCBjcm9zc19jb25uOworCWludCB0cnkgPSAwOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOworCisJaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybCkKKwkJbWJoYy0+bWJoY19jYi0+aHBoX3B1bGxfZG93bl9jdHJsKGNvZGVjLCBmYWxzZSk7CisKKwlpZiAobWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKQorCQltaWNiaWFzMSA9IG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cyhtYmhjLAorCQkJCQkJCQlNSUNfQklBU18xKTsKKworCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfY2FwX21vZGUpCisJCW1iaGMtPm1iaGNfY2ItPnNldF9jYXBfbW9kZShjb2RlYywgbWljYmlhczEsIHRydWUpOworCisJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQorCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbChjb2RlYywgTUlDX0JJQVNfMiwKKwkJCQkJCSAgICBNSUNCX0VOQUJMRSk7CisJZWxzZQorCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7CisKKwlkbyB7CisJCWNyb3NzX2Nvbm4gPSB3Y2RfY2hlY2tfY3Jvc3NfY29ubihtYmhjKTsKKwkJdHJ5Kys7CisJfSB3aGlsZSAodHJ5IDwgR05EX01JQ19TV0FQX1RIUkVTSE9MRCk7CisKKwlpZiAoY3Jvc3NfY29ubiA+IDApIHsKKwkJcHJfZGVidWcoIiVzOiBjcm9zcyBjb24gZm91bmQsIHN0YXJ0IHBvbGxpbmdcbiIsCisJCQkgX19mdW5jX18pOworCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7CisJCWlmICghbWJoYy0+Y3VycmVudF9wbHVnKQorCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gcGx1Z190eXBlOworCQlwcl9kZWJ1ZygiJXM6IFBsdWcgZm91bmQsIHBsdWcgdHlwZSBpcyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGx1Z190eXBlKTsKKwl9CisKKwkvKiBSZS1pbml0aWFsaXplIGJ1dHRvbiBwcmVzcyBjb21wbGV0aW9uIG9iamVjdCAqLworCXJlaW5pdF9jb21wbGV0aW9uKCZtYmhjLT5idG5fcHJlc3NfY29tcGwpOworCXdjZF9zY2hlZHVsZV9oc19kZXRlY3RfcGx1ZyhtYmhjLCAmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgd2NkX21iaGNfc3djaF9pcnFfaGFuZGxlcihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJYm9vbCBkZXRlY3Rpb25fdHlwZSA9IDA7CisJYm9vbCBtaWNiaWFzMSA9IGZhbHNlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKKworCW1iaGMtPmluX3N3Y2hfaXJxX2hhbmRsZXIgPSB0cnVlOworCisJLyogY2FuY2VsIHBlbmRpbmcgYnV0dG9uIHByZXNzICovCisJaWYgKHdjZF9jYW5jZWxfYnRuX3dvcmsobWJoYykpCisJCXByX2RlYnVnKCIlczogYnV0dG9uIHByZXNzIGlzIGNhbmNlbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19NRUNIX0RFVEVDVElPTl9UWVBFLCBkZXRlY3Rpb25fdHlwZSk7CisKKwkvKiBTZXQgdGhlIGRldGVjdGlvbiB0eXBlIGFwcHJvcHJpYXRlbHkgKi8KKwlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUVDSF9ERVRFQ1RJT05fVFlQRSwKKwkJCQkgIWRldGVjdGlvbl90eXBlKTsKKworCXByX2RlYnVnKCIlczogbWJoYy0+Y3VycmVudF9wbHVnOiAlZCBkZXRlY3Rpb25fdHlwZTogJWRcbiIsIF9fZnVuY19fLAorCQkJbWJoYy0+Y3VycmVudF9wbHVnLCBkZXRlY3Rpb25fdHlwZSk7CisJd2NkX2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLCAmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gpOworCisJaWYgKG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cykKKwkJbWljYmlhczEgPSBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMobWJoYywKKwkJCQkJCU1JQ19CSUFTXzEpOworCisJaWYgKChtYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfTk9ORSkgJiYKKwkgICAgZGV0ZWN0aW9uX3R5cGUpIHsKKwkJLyogTWFrZSBzdXJlIE1BU1RFUl9CSUFTX0NUTCBpcyBlbmFibGVkICovCisJCW1iaGMtPm1iaGNfY2ItPm1iaGNfYmlhcyhjb2RlYywgdHJ1ZSk7CisKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybCkKKwkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybChjb2RlYywKKwkJCQkJTUJIQ19DT01NT05fTUlDQl9UQUlMX0NVUlIsIHRydWUpOworCisJCWlmICghbWJoYy0+bWJoY19jZmctPmhzX2V4dF9taWNiaWFzICYmCisJCSAgICAgbWJoYy0+bWJoY19jYi0+bWljYl9pbnRlcm5hbCkKKwkJCS8qCisJCQkgKiBFbmFibGUgVHgyIFJCaWFzIGlmIHRoZSBoZWFkc2V0CisJCQkgKiBpcyB1c2luZyBpbnRlcm5hbCBtaWNiaWFzCisJCQkgKi8KKwkJCW1iaGMtPm1iaGNfY2ItPm1pY2JfaW50ZXJuYWwoY29kZWMsIDEsIHRydWUpOworCisJCS8qIFJlbW92ZSBtaWNiaWFzIHB1bGxkb3duICovCisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19QVUxMRE9XTl9DVFJMLCAwKTsKKwkJLyogQXBwbHkgdHJpbSBpZiBuZWVkZWQgb24gdGhlIGRldmljZSAqLworCQlpZiAobWJoYy0+bWJoY19jYi0+dHJpbV9idG5fcmVnKQorCQkJbWJoYy0+bWJoY19jYi0+dHJpbV9idG5fcmVnKGNvZGVjKTsKKwkJLyogRW5hYmxlIGV4dGVybmFsIHZvbHRhZ2Ugc291cmNlIHRvIG1pY2JpYXMgaWYgcHJlc2VudCAqLworCQlpZiAobWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZSkKKwkJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UobWJoYywgdHJ1ZSk7CisJCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7CisJCXdjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUobWJoYyk7CisJfSBlbHNlIGlmICgobWJoYy0+Y3VycmVudF9wbHVnICE9IE1CSENfUExVR19UWVBFX05PTkUpCisJCQkmJiAhZGV0ZWN0aW9uX3R5cGUpIHsKKwkJLyogRGlzYWJsZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSB0byBtaWNiaWFzIGlmIHByZXNlbnQgKi8KKwkJaWYgKG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UpCisJCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKG1iaGMsIGZhbHNlKTsKKwkJLyogRGlzYWJsZSBIVyBGU00gKi8KKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDApOworCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKQorCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAorCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1RBSUxfQ1VSUiwgZmFsc2UpOworCisJCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfY2FwX21vZGUpCisJCQltYmhjLT5tYmhjX2NiLT5zZXRfY2FwX21vZGUoY29kZWMsIG1pY2JpYXMxLCBmYWxzZSk7CisKKwkJbWJoYy0+YnRuX3ByZXNzX2ludHIgPSBmYWxzZTsKKwkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpIHsKKwkJCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsIFdDRF9NQkhDX0VMRUNfSFNfUkVNLAorCQkJCQkgICAgIGZhbHNlKTsKKwkJCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsIFdDRF9NQkhDX0VMRUNfSFNfSU5TLAorCQkJCQkgICAgIGZhbHNlKTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwKKwkJCQkJCSAxKTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAwKTsKKwkJCXdjZF9tYmhjX3JlcG9ydF9wbHVnKG1iaGMsIDAsIFNORF9KQUNLX0hFQURQSE9ORSk7CisJCX0gZWxzZSBpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUCkgeworCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMCwgU05EX0pBQ0tfVU5TVVBQT1JURUQpOworCQl9IGVsc2UgaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSB7CisJCQkvKiBtYWtlIHN1cmUgdG8gdHVybiBvZmYgUmJpYXMgKi8KKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5taWNiX2ludGVybmFsKQorCQkJCW1iaGMtPm1iaGNfY2ItPm1pY2JfaW50ZXJuYWwoY29kZWMsIDEsIGZhbHNlKTsKKworCQkJLyogUHVsbGRvd24gbWljYmlhcyAqLworCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX1BVTExET1dOX0NUUkwsIDEpOworCQkJd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19SRU0sCisJCQkJCSAgICAgZmFsc2UpOworCQkJd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19JTlMsCisJCQkJCSAgICAgZmFsc2UpOworCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX0RFVEVDVElPTl9UWVBFLAorCQkJCQkJIDEpOworCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIDApOworCQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMCwgU05EX0pBQ0tfSEVBRFNFVCk7CisJCX0gZWxzZSBpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hJR0hfSFBIKSB7CisJCQltYmhjLT5pc19leHRuX2NhYmxlID0gZmFsc2U7CisJCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX1JFTSwKKwkJCQkJICAgICBmYWxzZSk7CisJCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywKKwkJCQkJICAgICBmYWxzZSk7CisJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfREVURUNUSU9OX1RZUEUsCisJCQkJCQkgMSk7CisJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywgMCk7CisJCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19MSU5FT1VUKTsKKwkJfSBlbHNlIGlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfQU5DX0hFQURQSE9ORSkgeworCQkJbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2woY29kZWMsCisJCQkJCW1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyLAorCQkJCQlmYWxzZSk7CisJCQltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChjb2RlYywKKwkJCQkJbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHIsCisJCQkJCWZhbHNlKTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwKKwkJCQkJCSAwKTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAwKTsKKwkJCXdjZF9tYmhjX3JlcG9ydF9wbHVnKG1iaGMsIDAsIFNORF9KQUNLX0FOQ19IRUFEUEhPTkUpOworCQl9CisJfSBlbHNlIGlmICghZGV0ZWN0aW9uX3R5cGUpIHsKKwkJLyogRGlzYWJsZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSB0byBtaWNiaWFzIGlmIHByZXNlbnQgKi8KKwkJaWYgKG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UpCisJCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKG1iaGMsIGZhbHNlKTsKKwkJLyogRGlzYWJsZSBIVyBGU00gKi8KKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDApOworCX0KKworCW1iaGMtPmluX3N3Y2hfaXJxX2hhbmRsZXIgPSBmYWxzZTsKKwlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHdjZF9tYmhjX21lY2hfcGx1Z19kZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IHIgPSBJUlFfSEFORExFRDsKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCWlmICh1bmxpa2VseSgobWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCB0cnVlKSkgPT0gZmFsc2UpKSB7CisJCXByX3dhcm4oIiVzOiBmYWlsZWQgdG8gaG9sZCBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7CisJCXIgPSBJUlFfTk9ORTsKKwl9IGVsc2UgeworCQkvKiBDYWxsIGhhbmRsZXIgKi8KKwkJd2NkX21iaGNfc3djaF9pcnFfaGFuZGxlcihtYmhjKTsKKwkJbWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCBmYWxzZSk7CisJfQorCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB3Y2RfbWJoY19nZXRfYnV0dG9uX21hc2soc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCWludCBtYXNrID0gMDsKKwlpbnQgYnRuOworCisJYnRuID0gbWJoYy0+bWJoY19jYi0+bWFwX2J0bl9jb2RlX3RvX251bShtYmhjLT5jb2RlYyk7CisKKwlzd2l0Y2ggKGJ0bikgeworCWNhc2UgMDoKKwkJbWFzayA9IFNORF9KQUNLX0JUTl8wOworCQlicmVhazsKKwljYXNlIDE6CisJCW1hc2sgPSBTTkRfSkFDS19CVE5fMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltYXNrID0gU05EX0pBQ0tfQlROXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbWFzayA9IFNORF9KQUNLX0JUTl8zOworCQlicmVhazsKKwljYXNlIDQ6CisJCW1hc2sgPSBTTkRfSkFDS19CVE5fNDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQltYXNrID0gU05EX0pBQ0tfQlROXzU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfaHNfaW5zX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYyA9IGRhdGE7CisJYm9vbCBkZXRlY3Rpb25fdHlwZSA9IDAsIGhwaGxfc2NoID0gMCwgbWljX3NjaCA9IDA7CisJdTE2IGVsZWN0X3Jlc3VsdCA9IDA7CisJc3RhdGljIHUxNiBocGhsX3RyaWdlcnJlZDsKKwlzdGF0aWMgdTE2IG1pY190cmlnZXJyZWQ7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKKwkJcHJfZGVidWcoIiVzOiBSZXR1cm5pbmcgYXMgRXh0ZW5zaW9uIGNhYmxlIGZlYXR1cmUgbm90IGVuYWJsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7CisKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwgZGV0ZWN0aW9uX3R5cGUpOworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0VMRUNUX1JFU1VMVCwgZWxlY3RfcmVzdWx0KTsKKworCXByX2RlYnVnKCIlczogZGV0ZWN0aW9uX3R5cGUgJWQsIGVsZWN0X3Jlc3VsdCAleFxuIiwgX19mdW5jX18sCisJCQkJZGV0ZWN0aW9uX3R5cGUsIGVsZWN0X3Jlc3VsdCk7CisJaWYgKGRldGVjdGlvbl90eXBlKSB7CisJCS8qIGNoZWNrIGlmIGJvdGggTGVmdCBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMgYXJlIHRyaWdnZXJlZCAqLworCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2gpOworCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19NSUNfU0NITVRfUkVTVUxULCBtaWNfc2NoKTsKKwkJaWYgKGhwaGxfc2NoICYmIG1pY19zY2gpIHsKKwkJCS8qIEdvIGZvciBwbHVnIHR5cGUgZGV0ZXJtaW5hdGlvbiAqLworCQkJcHJfZGVidWcoIiVzOiBHbyBmb3IgcGx1ZyB0eXBlIGRldGVybWluYXRpb25cbiIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlnb3RvIGRldGVybWluZV9wbHVnOworCisJCX0gZWxzZSB7CisJCQlpZiAobWljX3NjaCkgeworCQkJCW1pY190cmlnZXJyZWQrKzsKKwkJCQlwcl9kZWJ1ZygiJXM6IEluc2VydGlvbiBNSUMgdHJpZ2VycmVkICVkXG4iLAorCQkJCQkgX19mdW5jX18sIG1pY190cmlnZXJyZWQpOworCQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUygKKwkJCQkJCVdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsCisJCQkJCQkwKTsKKwkJCQltc2xlZXAoMjApOworCQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUygKKwkJCQkJCVdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsCisJCQkJCQkxKTsKKwkJCX0KKwkJCWlmIChocGhsX3NjaCkgeworCQkJCWhwaGxfdHJpZ2VycmVkKys7CisJCQkJcHJfZGVidWcoIiVzOiBJbnNlcnRpb24gSFBITCB0cmlnZXJyZWQgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgaHBobF90cmlnZXJyZWQpOworCQkJfQorCQkJaWYgKG1pY190cmlnZXJyZWQgJiYgaHBobF90cmlnZXJyZWQpIHsKKwkJCQkvKiBHbyBmb3IgcGx1ZyB0eXBlIGRldGVybWluYXRpb24gKi8KKwkJCQlwcl9kZWJ1ZygiJXM6IEdvIGZvciBwbHVnIHR5cGUgZGV0ZXJtaW5hdGlvblxuIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCQlnb3RvIGRldGVybWluZV9wbHVnOworCQkJfQorCQl9CisJfQorCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCXJldHVybiBJUlFfSEFORExFRDsKKworZGV0ZXJtaW5lX3BsdWc6CisJLyoKKwkgKiBEaXNhYmxlIEhQSEwgdHJpZ2dlciBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMuCisJICogU2V0dXAgZm9yIGluc2VydGlvbiBkZXRlY3Rpb24uCisJICovCisJcHJfZGVidWcoIiVzOiBEaXNhYmxlIGluc2VydGlvbiBpbnRlcnJ1cHRcbiIsIF9fZnVuY19fKTsKKwl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywKKwkJCSAgICAgZmFsc2UpOworCisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIDApOworCWhwaGxfdHJpZ2VycmVkID0gMDsKKwltaWNfdHJpZ2VycmVkID0gMDsKKwltYmhjLT5pc19leHRuX2NhYmxlID0gdHJ1ZTsKKwltYmhjLT5idG5fcHJlc3NfaW50ciA9IGZhbHNlOworCXdjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUobWJoYyk7CisJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfaHNfcmVtX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYyA9IGRhdGE7CisJdTggaHNfY29tcF9yZXN1bHQgPSAwLCBocGhsX3NjaCA9IDAsIG1pY19zY2ggPSAwOworCXN0YXRpYyB1MTYgaHBobF90cmlnZXJyZWQ7CisJc3RhdGljIHUxNiBtaWNfdHJpZ2VycmVkOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlib29sIHJlbW92ZWQgPSB0cnVlOworCWludCByZXRyeSA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsKKwkJICBtc2Vjc190b19qaWZmaWVzKFdDRF9GQUtFX1JFTU9WQUxfTUlOX1BFUklPRF9NUyk7CisJZG8geworCQlyZXRyeSsrOworCQkvKgorCQkgKiByZWFkIHRoZSByZXN1bHQgcmVnaXN0ZXIgZXZlcnkgMTBtcyB0byBsb29rIGZvcgorCQkgKiBhbnkgY2hhbmdlIGluIEhTX0NPTVBfUkVTVUxUIGJpdAorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7CisJCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlc3VsdCk7CisJCXByX2RlYnVnKCIlczogQ2hlY2sgcmVzdWx0IHJlZyBmb3IgZmFrZSByZW1vdmFsOiBoc19jb21wX3JlcyAleFxuIiwKKwkJCSBfX2Z1bmNfXywgaHNfY29tcF9yZXN1bHQpOworCQlpZiAoKCFoc19jb21wX3Jlc3VsdCkgJiYKKwkJICAgIHJldHJ5ID4gRkFLRV9SRU1fUkVUUllfQVRURU1QVFMpIHsKKwkJCXJlbW92ZWQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpOworCisJaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3cgIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCXByX2RlYnVnKCIlczogaGVhZHNldCAlcyBhY3R1YWxseSByZW1vdmVkXG4iLCBfX2Z1bmNfXywKKwkJcmVtb3ZlZCA/ICIiIDogIm5vdCAiKTsKKworCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxULCBocGhsX3NjaCk7CisJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfTUlDX1NDSE1UX1JFU1VMVCwgbWljX3NjaCk7CisJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFNfQ09NUF9SRVNVTFQsIGhzX2NvbXBfcmVzdWx0KTsKKworCWlmIChyZW1vdmVkKSB7CisJCWlmICghKGhwaGxfc2NoICYmIG1pY19zY2ggJiYgaHNfY29tcF9yZXN1bHQpKSB7CisJCQkvKgorCQkJICogZXh0ZW5zaW9uIGNhYmxlIGlzIHN0aWxsIHBsdWdnZWQgaW4KKwkJCSAqIHJlcG9ydCBpdCBhcyBMSU5FT1VUIGRldmljZQorCQkJICovCisJCQlnb3RvIHJlcG9ydF91bnBsdWc7CisJCX0gZWxzZSB7CisJCQlpZiAoIW1pY19zY2gpIHsKKwkJCQltaWNfdHJpZ2VycmVkKys7CisJCQkJcHJfZGVidWcoIiVzOiBSZW1vdmFsIE1JQyB0cmlnZXJyZWQgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgbWljX3RyaWdlcnJlZCk7CisJCQl9CisJCQlpZiAoIWhwaGxfc2NoKSB7CisJCQkJaHBobF90cmlnZXJyZWQrKzsKKwkJCQlwcl9kZWJ1ZygiJXM6IFJlbW92YWwgSFBITCB0cmlnZXJyZWQgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgaHBobF90cmlnZXJyZWQpOworCQkJfQorCQkJaWYgKG1pY190cmlnZXJyZWQgJiYgaHBobF90cmlnZXJyZWQpIHsKKwkJCQkvKgorCQkJCSAqIGV4dGVuc2lvbiBjYWJsZSBpcyBzdGlsbCBwbHVnZ2VkIGluCisJCQkJICogcmVwb3J0IGl0IGFzIExJTkVPVVQgZGV2aWNlCisJCQkJICovCisJCQkJZ290byByZXBvcnRfdW5wbHVnOworCQkJfQorCQl9CisJfQorZXhpdDoKKwlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK3JlcG9ydF91bnBsdWc6CisKKwkvKiBjYW5jZWwgcGVuZGluZyBidXR0b24gcHJlc3MgKi8KKwlpZiAod2NkX2NhbmNlbF9idG5fd29yayhtYmhjKSkKKwkJcHJfZGVidWcoIiVzOiBidXR0b24gcHJlc3MgaXMgY2FuY2VsZWRcbiIsIF9fZnVuY19fKTsKKwkvKiBjYW5jZWwgY29ycmVjdCB3b3JrIGZ1bmN0aW9uICovCisJd2NkX2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLCAmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gpOworCisJcHJfZGVidWcoIiVzOiBSZXBvcnQgZXh0ZW5zaW9uIGNhYmxlXG4iLCBfX2Z1bmNfXyk7CisJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfTElORU9VVCk7CisJLyoKKwkgKiBJZiBQQSBpcyBlbmFibGVkIEhQSEwgc2NobWl0dCB0cmlnZ2VyIGNhbgorCSAqIGJlIHVucmVsaWFibGUsIG1ha2Ugc3VyZSB0byBkaXNhYmxlIGl0CisJICovCisJaWYgKHRlc3RfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSEwsCisJCSZtYmhjLT5ldmVudF9zdGF0ZSkpCisJCXdjZF9tYmhjX3NldF9hbmRfdHVybm9mZl9ocGhfcGFkYWMobWJoYyk7CisJLyoKKwkgKiBEaXNhYmxlIEhQSEwgdHJpZ2dlciBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMuCisJICogU2V0dXAgZm9yIGluc2VydGlvbiBkZXRlY3Rpb24uCisJICovCisJd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19SRU0sCisJCQkgICAgIGZhbHNlKTsKKwl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9OT05FKTsKKwkvKiBEaXNhYmxlIEhXIEZTTSAqLworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAzKTsKKworCS8qIFNldCB0aGUgZGV0ZWN0aW9uIHR5cGUgYXBwcm9wcmlhdGVseSAqLworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwgMSk7CisJd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19JTlMsCisJCQkgICAgIHRydWUpOworCWhwaGxfdHJpZ2VycmVkID0gMDsKKwltaWNfdHJpZ2VycmVkID0gMDsKKwlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9idG5fbHByZXNzX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7CisJczE2IGJ0bl9yZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCisJZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJbWJoYyA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdjZF9tYmhjLCBtYmhjX2J0bl9kd29yayk7CisKKwlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19CVE5fUkVTVUxULCBidG5fcmVzdWx0KTsKKwlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hFQURTRVQpIHsKKwkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgbG9uZyBidXR0b24gcHJlc3MgZXZlbnQsIGJ0bl9yZXN1bHQ6ICVkXG4iLAorCQkJIF9fZnVuY19fLCBidG5fcmVzdWx0KTsKKwkJd2NkX21iaGNfamFja19yZXBvcnQobWJoYywgJm1iaGMtPmJ1dHRvbl9qYWNrLAorCQkJCW1iaGMtPmJ1dHRvbnNfcHJlc3NlZCwgbWJoYy0+YnV0dG9uc19wcmVzc2VkKTsKKwl9CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOworfQorCitzdGF0aWMgYm9vbCB3Y2RfbWJoY19md192YWxpZGF0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwl1MzIgY2ZnX29mZnNldDsKKwlzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7CisJc3RydWN0IGZpcm13YXJlX2NhbCBmdzsKKworCWZ3LmRhdGEgPSAodm9pZCAqKWRhdGE7CisJZncuc2l6ZSA9IHNpemU7CisKKwlpZiAoZncuc2l6ZSA8IFdDRF9NQkhDX0NBTF9NSU5fU0laRSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBQcmV2aW91cyBjaGVjayBndWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgZW5vdWdoIGZ3IGRhdGEgdXAKKwkgKiB0byBudW1fYnRuCisJICovCisJYnRuX2NmZyA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUihmdy5kYXRhKTsKKwljZmdfb2Zmc2V0ID0gKHUzMikgKCh2b2lkICopIGJ0bl9jZmcgLSAodm9pZCAqKSBmdy5kYXRhKTsKKwlpZiAoZncuc2l6ZSA8IChjZmdfb2Zmc2V0ICsgV0NEX01CSENfQ0FMX0JUTl9TWihidG5fY2ZnKSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfYnRuX3ByZXNzX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOworCWludCBtYXNrOworCXVuc2lnbmVkIGxvbmcgbXNlY192YWw7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJY29tcGxldGUoJm1iaGMtPmJ0bl9wcmVzc19jb21wbCk7CisJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7CisJLyogc2VuZCBldmVudCB0byBzdyBpbnRyIGhhbmRsZXIqLworCW1iaGMtPmlzX2J0bl9wcmVzcyA9IHRydWU7CisJd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKKwlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7CisJCXByX2RlYnVnKCIlczogU3dpdGNoIGxldmVsIGlzIGxvdyAiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisJbWJoYy0+YnRuX3ByZXNzX2ludHIgPSB0cnVlOworCisJbXNlY192YWwgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBtYmhjLT5qaWZmaWVzX2F0cmVwb3J0KTsKKwlwcl9kZWJ1ZygiJXM6IG1zZWNfdmFsID0gJWxkXG4iLCBfX2Z1bmNfXywgbXNlY192YWwpOworCWlmIChtc2VjX3ZhbCA8IE1CSENfQlVUVE9OX1BSRVNTX1RIUkVTSE9MRF9NSU4pIHsKKwkJcHJfZGVidWcoIiVzOiBUb28gc2hvcnQsIGlnbm9yZSBidXR0b24gcHJlc3NcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIElmIHN3aXRjaCBpbnRlcnJ1cHQgYWxyZWFkeSBraWNrZWQgaW4sIGlnbm9yZSBidXR0b24gcHJlc3MgKi8KKwlpZiAobWJoYy0+aW5fc3djaF9pcnFfaGFuZGxlcikgeworCQlwcl9kZWJ1ZygiJXM6IFN3dGljaCBsZXZlbCBjaGFuZ2VkLCBpZ25vcmUgYnV0dG9uIHByZXNzXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAobWJoYy0+Y3VycmVudF9wbHVnICE9IE1CSENfUExVR19UWVBFX0hFQURTRVQpIHsKKwkJcHJfZGVidWcoIiVzOiBQbHVnIGlzbid0IGhlYWRzZXQsIGlnbm9yZSBidXR0b24gcHJlc3NcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCW1hc2sgPSB3Y2RfbWJoY19nZXRfYnV0dG9uX21hc2sobWJoYyk7CisJbWJoYy0+YnV0dG9uc19wcmVzc2VkIHw9IG1hc2s7CisJbWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCB0cnVlKTsKKwlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtYmhjLT5tYmhjX2J0bl9kd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKDQwMCkpID09IDApIHsKKwkJV0FSTigxLCAiQnV0dG9uIHByZXNzZWQgdHdpY2Ugd2l0aG91dCByZWxlYXNlIGV2ZW50XG4iKTsKKwkJbWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCBmYWxzZSk7CisJfQorZG9uZToKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19yZWxlYXNlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7CisJaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3cgIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKG1iaGMtPmJ0bl9wcmVzc19pbnRyKSB7CisJCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBUaGlzIHJlbGVhc2UgaXMgZm9yIGZha2UgYnRuIHByZXNzXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIElmIGN1cnJlbnQgcGx1ZyBpcyBoZWFkcGhvbmUgdGhlbiB0aGVyZSBpcyBubyBjaGFuY2UgdG8KKwkgKiBnZXQgYnRuIHJlbGVhc2UgaW50ZXJydXB0LCBzbyBjb25uZWN0ZWQgY2FibGUgc2hvdWxkIGJlCisJICogaGVhZHNldCBub3QgaGVhZHBob25lLgorCSAqLworCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsIE1CSENfUExVR19UWVBFX0hFQURTRVQpOworCQlnb3RvIGV4aXQ7CisKKwl9CisJaWYgKG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCAmIFdDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0spIHsKKwkJcmV0ID0gd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBsb25nIGJ1dHRvbiByZWxlYXNlIGV2ZW50XG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+YnV0dG9uX2phY2ssCisJCQkJCTAsIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7CisJCX0gZWxzZSB7CisJCQlpZiAobWJoYy0+aW5fc3djaF9pcnFfaGFuZGxlcikgeworCQkJCXByX2RlYnVnKCIlczogU3dpdGNoIGlycSBraWNrZWQgaW4sIGlnbm9yZVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJfSBlbHNlIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBidG4gcHJlc3NcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJd2NkX21iaGNfamFja19yZXBvcnQobWJoYywKKwkJCQkJCSAgICAgJm1iaGMtPmJ1dHRvbl9qYWNrLAorCQkJCQkJICAgICBtYmhjLT5idXR0b25zX3ByZXNzZWQsCisJCQkJCQkgICAgIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7CisJCQkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgYnRuIHJlbGVhc2VcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJd2NkX21iaGNfamFja19yZXBvcnQobWJoYywKKwkJCQkJCSZtYmhjLT5idXR0b25famFjaywKKwkJCQkJCTAsIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7CisJCQl9CisJCX0KKwkJbWJoYy0+YnV0dG9uc19wcmVzc2VkICY9IH5XQ0RfTUJIQ19KQUNLX0JVVFRPTl9NQVNLOworCX0KK2V4aXQ6CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfaHBobF9vY3BfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZF9tYmhjICptYmhjID0gZGF0YTsKKwlpbnQgdmFsOworCisJcHJfZGVidWcoIiVzOiByZWNlaXZlZCBIUEhMIE9DUCBpcnFcbiIsIF9fZnVuY19fKTsKKwlpZiAobWJoYykgeworCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KSB7CisJCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KG1iaGMpKSB7CisJCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFBIUl9PQ1BfU1RBVFVTLAorCQkJCQkJICB2YWwpOworCQkJCWlmICgodmFsICE9IC1FSU5WQUwpICYmIHZhbCkKKwkJCQkJbWJoYy0+aXNfaHBoX29jcF9wZW5kaW5nID0gdHJ1ZTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKworCQlpZiAobWJoYy0+aHBobG9jcF9jbnQgPCBPQ1BfQVRURU1QVCkgeworCQkJbWJoYy0+aHBobG9jcF9jbnQrKzsKKwkJCXByX2RlYnVnKCIlczogcmV0cnksIGhwaGxvY3BfY250OiAlZFxuIiwgX19mdW5jX18sCisJCQkJIG1iaGMtPmhwaGxvY3BfY250KTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAwKTsKKwkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAxKTsKKwkJfSBlbHNlIHsKKwkJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAorCQkJCQkJICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKKwkJCQkJCSAgIGZhbHNlKTsKKwkJCW1iaGMtPmhwaF9zdGF0dXMgfD0gU05EX0pBQ0tfT0NfSFBITDsKKwkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCisJCQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzLAorCQkJCQkgICAgV0NEX01CSENfSkFDS19NQVNLKTsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEJhZCB3Y2Q5eHh4X3NwbWkgcHJpdmF0ZSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJfQorZG9uZToKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19ocGhyX29jcF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOworCisJcHJfZGVidWcoIiVzOiByZWNlaXZlZCBIUEhSIE9DUCBpcnFcbiIsIF9fZnVuY19fKTsKKworCWlmICghbWJoYykgeworCQlwcl9lcnIoIiVzOiBCYWQgbWJoYyBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChtYmhjLT5pc19ocGhfb2NwX3BlbmRpbmcpIHsKKwkJbWJoYy0+aXNfaHBoX29jcF9wZW5kaW5nID0gZmFsc2U7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KSB7CisJCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcmVnaXN0ZXJfcmVjb3ZlcnkobWJoYykpCisJCQkvKiByZWdpc3RlciBjb3JydXB0aW9uLCBoZW5jZSByZXNldCByZWdpc3RlcnMgKi8KKwkJCWdvdG8gZG9uZTsKKwl9CisJaWYgKG1iaGMtPmhwaHJvY3BfY250IDwgT0NQX0FUVEVNUFQpIHsKKwkJbWJoYy0+aHBocm9jcF9jbnQrKzsKKwkJcHJfZGVidWcoIiVzOiByZXRyeSwgaHBocm9jcF9jbnQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBtYmhjLT5ocGhyb2NwX2NudCk7CisJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAwKTsKKwkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX09DUF9GU01fRU4sIDEpOworCX0gZWxzZSB7CisJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAorCQkJCQkgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwKKwkJCQkJICAgZmFsc2UpOworCQltYmhjLT5ocGhfc3RhdHVzIHw9IFNORF9KQUNLX09DX0hQSFI7CisJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCisJCQkJICAgIG1iaGMtPmhwaF9zdGF0dXMsIFdDRF9NQkhDX0pBQ0tfTUFTSyk7CisJfQorZG9uZToKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX21iaGNfaW5pdGlhbGlzZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7CisKKwkvKiBlbmFibGUgSFMgZGV0ZWN0aW9uICovCisJaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX3VwX2NvbnRyb2wpCisJCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX3VwX2NvbnRyb2woY29kZWMsIElfREVGQVVMVCk7CisJZWxzZQorCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DVFJMLCAzKTsKKworCWlmIChtYmhjLT5tYmhjX2NmZy0+bW9pc3R1cmVfZW4gJiYgbWJoYy0+bWJoY19jYi0+bWJoY19tb2lzdHVyZV9jb25maWcpCisJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbW9pc3R1cmVfY29uZmlnKG1iaGMpOworCisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSExfUExVR19UWVBFLCBtYmhjLT5ocGhsX3N3aCk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0dORF9QTFVHX1RZUEUsIG1iaGMtPmduZF9zd2gpOworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19TV19IUEhfTFBfMTAwS19UT19HTkQsIDEpOworCWlmIChtYmhjLT5tYmhjX2NmZy0+Z25kX2RldF9lbiAmJiBtYmhjLT5tYmhjX2NiLT5tYmhjX2duZF9kZXRfY3RybCkKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19nbmRfZGV0X2N0cmwoY29kZWMsIHRydWUpOworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NPTVBfQ1RSTCwgMSk7CisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0xfREVUX0VOLCAxKTsKKworCS8qIEluc2VydGlvbiBkZWJvdW5jZSBzZXQgdG8gOTZtcyAqLworCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19JTlNSRU1fREJOQywgNik7CisJLyogQnV0dG9uIERlYm91bmNlIHNldCB0byAxNm1zICovCisJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9EQk5DLCAyKTsKKworCS8qIEVuYWJsZSBtaWNiaWFzIHJhbXAgKi8KKwlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX3JhbXBfY29udHJvbCkKKwkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX3JhbXBfY29udHJvbChjb2RlYywgdHJ1ZSk7CisJLyogZW5hYmxlIGJpYXMgKi8KKwltYmhjLT5tYmhjX2NiLT5tYmhjX2JpYXMoY29kZWMsIHRydWUpOworCS8qIGVuYWJsZSBNQkhDIGNsb2NrICovCisJaWYgKG1iaGMtPm1iaGNfY2ItPmNsa19zZXR1cCkKKwkJbWJoYy0+bWJoY19jYi0+Y2xrX3NldHVwKGNvZGVjLCB0cnVlKTsKKworCS8qIHByb2dyYW0gSFNfVlJFRiB2YWx1ZSAqLworCXdjZF9wcm9ncmFtX2hzX3ZyZWYobWJoYyk7CisKKwl3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKG1iaGMsIGZhbHNlKTsKKworCUlOSVRfV09SSygmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gsIHdjZF9jb3JyZWN0X3N3Y2hfcGx1Zyk7CisKKwlpbml0X2NvbXBsZXRpb24oJm1iaGMtPmJ0bl9wcmVzc19jb21wbCk7CisKKwlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3Y2RfbWJoY19md19yZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqZndfZGF0YSA9IE5VTEw7CisJaW50IHJldCA9IC0xLCByZXRyeSA9IDA7CisJYm9vbCB1c2VfZGVmYXVsdF9jYWwgPSBmYWxzZTsKKworCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCW1iaGMgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgbWJoY19maXJtd2FyZV9kd29yayk7CisJY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCXdoaWxlIChyZXRyeSA8IEZXX1JFQURfQVRURU1QVFMpIHsKKwkJcmV0cnkrKzsKKwkJcHJfZGVidWcoIiVzOkF0dGVtcHQgJWQgdG8gcmVxdWVzdCBNQkhDIGZpcm13YXJlXG4iLAorCQkJX19mdW5jX18sIHJldHJ5KTsKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPmdldF9od2RlcF9md19jYWwpCisJCQlmd19kYXRhID0gbWJoYy0+bWJoY19jYi0+Z2V0X2h3ZGVwX2Z3X2NhbChtYmhjLAorCQkJCQlXQ0Q5WFhYX01CSENfQ0FMKTsKKwkJaWYgKCFmd19kYXRhKQorCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsICJ3Y2Q5MzIwL3djZDkzMjBfbWJoYy5iaW4iLAorCQkJCSAgICAgICBjb2RlYy0+ZGV2KTsKKwkJLyoKKwkJICogaWYgcmVxdWVzdF9maXJtd2FyZSBhbmQgaHdkZXAgY2FsIGJvdGggZmFpbCB0aGVuCisJCSAqIHNsZWVwIGZvciA0c2VjIGZvciB0aGUgdXNlcnNwYWNlIHRvIHNlbmQgZGF0YSB0byBrZXJuZWwKKwkJICogcmV0cnkgZm9yIGZldyB0aW1lcyBiZWZvcmUgYmFpbGluZyBvdXQKKwkJICovCisJCWlmICgocmV0ICE9IDApICYmICFmd19kYXRhKSB7CisJCQl1c2xlZXBfcmFuZ2UoRldfUkVBRF9USU1FT1VULCBGV19SRUFEX1RJTUVPVVQgKworCQkJCQlXQ0RfTUJIQ19VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogTUJIQyBGaXJtd2FyZSByZWFkIHN1Y2Nlc3NmdWxcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZndfZGF0YSkKKwkJcHJfZGVidWcoIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlXG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IHVzaW5nIGh3ZGVwIGNhbFxuIiwgX19mdW5jX18pOworCisJaWYgKHJldCAhPSAwICYmICFmd19kYXRhKSB7CisJCXByX2VycigiJXM6IENhbm5vdCBsb2FkIE1CSEMgZmlybXdhcmUgdXNlIGRlZmF1bHQgY2FsXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQl1c2VfZGVmYXVsdF9jYWwgPSB0cnVlOworCX0KKwlpZiAoIXVzZV9kZWZhdWx0X2NhbCkgeworCQljb25zdCB2b2lkICpkYXRhOworCQlzaXplX3Qgc2l6ZTsKKworCQlpZiAoZndfZGF0YSkgeworCQkJZGF0YSA9IGZ3X2RhdGEtPmRhdGE7CisJCQlzaXplID0gZndfZGF0YS0+c2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSBmdy0+ZGF0YTsKKwkJCXNpemUgPSBmdy0+c2l6ZTsKKwkJfQorCQlpZiAod2NkX21iaGNfZndfdmFsaWRhdGUoZGF0YSwgc2l6ZSkgPT0gZmFsc2UpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgTUJIQyBjYWwgZGF0YSBzaXplIHVzZSBkZWZhdWx0IGNhbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlpZiAoIWZ3X2RhdGEpCisJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCX0gZWxzZSB7CisJCQlpZiAoZndfZGF0YSkgeworCQkJCW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9CisJCQkJCSh2b2lkICopZndfZGF0YS0+ZGF0YTsKKwkJCQltYmhjLT5tYmhjX2NhbCA9IGZ3X2RhdGE7CisJCQl9IGVsc2UgeworCQkJCW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9CisJCQkJCSh2b2lkICopZnctPmRhdGE7CisJCQkJbWJoYy0+bWJoY19mdyA9IGZ3OworCQkJfQorCQl9CisKKwl9CisKKwkodm9pZCkgd2NkX21iaGNfaW5pdGlhbGlzZShtYmhjKTsKK30KKworaW50IHdjZF9tYmhjX3NldF9rZXljb2RlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKKwllbnVtIHNuZF9qYWNrX3R5cGVzIHR5cGU7CisJaW50IGksIHJldCwgcmVzdWx0ID0gMDsKKwlpbnQgKmJ0bl9rZXlfY29kZTsKKworCWJ0bl9rZXlfY29kZSA9IG1iaGMtPm1iaGNfY2ZnLT5rZXlfY29kZTsKKworCWZvciAoaSA9IDAgOyBpIDwgV0NEX01CSENfS0VZQ09ERV9OVU0gOyBpKyspIHsKKwkJaWYgKGJ0bl9rZXlfY29kZVtpXSAhPSAwKSB7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgMDoKKwkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHlwZSA9IFNORF9KQUNLX0JUTl8xOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzM7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJdHlwZSA9IFNORF9KQUNLX0JUTl80OworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fNTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJV0FSTl9PTkNFKDEsICJXcm9uZyBidXR0b24gbnVtYmVyOiVkXG4iLCBpKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmV0ID0gc25kX2phY2tfc2V0X2tleShtYmhjLT5idXR0b25famFjay5qYWNrLAorCQkJCQkJCXR5cGUsCisJCQkJCQkJYnRuX2tleV9jb2RlW2ldKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGUgZm9yICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYnRuX2tleV9jb2RlW2ldKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoCisJCQkJbWJoYy0+YnV0dG9uX2phY2suamFjay0+aW5wdXRfZGV2LAorCQkJCUVWX0tFWSwgYnRuX2tleV9jb2RlW2ldKTsKKwkJCXByX2RlYnVnKCIlczogc2V0IGJ0biVkIGtleSBjb2RlOiVkXG4iLCBfX2Z1bmNfXywKKwkJCQlpLCBidG5fa2V5X2NvZGVbaV0pOworCQl9CisJfQorCWlmIChidG5fa2V5X2NvZGVbMF0pCisJCW1iaGMtPmlzX2J0bl9hbHJlYWR5X3JlZ2QgPSB0cnVlOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCB3Y2RfbWJoY19zdGFydChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCisJCSAgICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKK3sKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCS8qIHVwZGF0ZSB0aGUgbWJoYyBjb25maWcgKi8KKwltYmhjLT5tYmhjX2NmZyA9IG1iaGNfY2ZnOworCisJLyogU2V0IGJ0biBrZXkgY29kZSAqLworCWlmICgoIW1iaGMtPmlzX2J0bl9hbHJlYWR5X3JlZ2QpICYmIHdjZF9tYmhjX3NldF9rZXljb2RlKG1iaGMpKQorCQlwcl9lcnIoIlNldCBidG4ga2V5IGNvZGUgZXJyb3IhISFcbiIpOworCisJaWYgKCFtYmhjLT5tYmhjX2NmZy0+cmVhZF9md19iaW4gfHwKKwkgICAgKG1iaGMtPm1iaGNfY2ZnLT5yZWFkX2Z3X2JpbiAmJiBtYmhjLT5tYmhjX2Z3KSB8fAorCSAgICAobWJoYy0+bWJoY19jZmctPnJlYWRfZndfYmluICYmIG1iaGMtPm1iaGNfY2FsKSkgeworCQlyYyA9IHdjZF9tYmhjX2luaXRpYWxpc2UobWJoYyk7CisJfSBlbHNlIHsKKwkJaWYgKCFtYmhjLT5tYmhjX2Z3IHx8ICFtYmhjLT5tYmhjX2NhbCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWJoYy0+bWJoY19maXJtd2FyZV9kd29yaywKKwkJCQkgICAgICB1c2Vjc190b19qaWZmaWVzKEZXX1JFQURfVElNRU9VVCkpOworCQllbHNlCisJCQlwcl9lcnIoIiVzOiBTa2lwcGluZyB0byByZWFkIG1iaGMgZncsIDB4JXBLICVwS1xuIiwKKwkJCQkgX19mdW5jX18sIG1iaGMtPm1iaGNfZncsIG1iaGMtPm1iaGNfY2FsKTsKKwl9CisJcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9tYmhjX3N0YXJ0KTsKKwordm9pZCB3Y2RfbWJoY19zdG9wKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPSBNQkhDX1BMVUdfVFlQRV9OT05FKSB7CisJCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPnNraXBfaW1wZWRfZGV0ZWN0KQorCQkJbWJoYy0+bWJoY19jYi0+c2tpcF9pbXBlZF9kZXRlY3QobWJoYy0+Y29kZWMpOworCX0KKwltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9OT05FOworCW1iaGMtPmhwaF9zdGF0dXMgPSAwOworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKSB7CisJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAorCQkJCW1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3AsCisJCQkJZmFsc2UpOworCQltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChtYmhjLT5jb2RlYywKKwkJCQltYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwKKwkJCQlmYWxzZSk7CisJfQorCWlmIChtYmhjLT5tYmhjX2Z3IHx8IG1iaGMtPm1iaGNfY2FsKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWJoYy0+bWJoY19maXJtd2FyZV9kd29yayk7CisJCWlmICghbWJoYy0+bWJoY19jYWwpCisJCQlyZWxlYXNlX2Zpcm13YXJlKG1iaGMtPm1iaGNfZncpOworCQltYmhjLT5tYmhjX2Z3ID0gTlVMTDsKKwkJbWJoYy0+bWJoY19jYWwgPSBOVUxMOworCX0KKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9tYmhjX3N0b3ApOworCisvKgorICogd2NkX21iaGNfaW5pdCA6IGluaXRpYWxpemUgTUJIQyBpbnRlcm5hbCBzdHJ1Y3R1cmVzLgorICoKKyAqIE5PVEU6IG1iaGMtPm1iaGNfY2ZnIGlzIG5vdCBZRVQgY29uZmlndXJlIHNvIHNob3VsZG4ndCBiZSB1c2VkCisgKi8KK2ludCB3Y2RfbWJoY19pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgKm1iaGNfY2IsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3Y2RfbWJoY19pbnRyICptYmhjX2NkY19pbnRyX2lkcywKKwkJICAgICAgc3RydWN0IHdjZF9tYmhjX3JlZ2lzdGVyICp3Y2RfbWJoY19yZWdzLAorCQkgICAgICBib29sIGltcGVkYW5jZV9kZXRfZW4pCit7CisJaW50IHJldCA9IDA7CisJaW50IGhwaF9zd2ggPSAwOworCWludCBnbmRfc3doID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCWNvbnN0IGNoYXIgKmhwaF9zd2l0Y2ggPSAicWNvbSxtc20tbWJoYy1ocGhsLXN3aCI7CisJY29uc3QgY2hhciAqZ25kX3N3aXRjaCA9ICJxY29tLG1zbS1tYmhjLWduZC1zd2giOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2FyZC0+ZGV2LT5vZl9ub2RlLCBocGhfc3dpdGNoLCAmaHBoX3N3aCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgaHBoX3N3aXRjaCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNhcmQtPmRldi0+b2Zfbm9kZSwgZ25kX3N3aXRjaCwgJmduZF9zd2gpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIGduZF9zd2l0Y2gpOworCQlnb3RvIGVycjsKKwl9CisKKwltYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyID0gZmFsc2U7CisJbWJoYy0+Y3VycmVudF9wbHVnID0gTUJIQ19QTFVHX1RZUEVfTk9ORTsKKwltYmhjLT5pc19idG5fcHJlc3MgPSBmYWxzZTsKKwltYmhjLT5jb2RlYyA9IGNvZGVjOworCW1iaGMtPmludHJfaWRzID0gbWJoY19jZGNfaW50cl9pZHM7CisJbWJoYy0+aW1wZWRhbmNlX2RldGVjdCA9IGltcGVkYW5jZV9kZXRfZW47CisJbWJoYy0+aHBobF9zd2ggPSBocGhfc3doOworCW1iaGMtPmduZF9zd2ggPSBnbmRfc3doOworCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7CisJbWJoYy0+bWJoY19jYiA9IG1iaGNfY2I7CisJbWJoYy0+YnRuX3ByZXNzX2ludHIgPSBmYWxzZTsKKwltYmhjLT5pc19oc19yZWNvcmRpbmcgPSBmYWxzZTsKKwltYmhjLT5pc19leHRuX2NhYmxlID0gZmFsc2U7CisJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTk9ORTsKKwltYmhjLT53Y2RfbWJoY19yZWdzID0gd2NkX21iaGNfcmVnczsKKworCWlmIChtYmhjLT5pbnRyX2lkcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEludGVycnVwdCBtYXBwaW5nIG5vdCBwcm92aWRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFtYmhjLT53Y2RfbWJoY19yZWdzKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtYmhjIHJlZ2lzdGVycyBhcmUgbm90IGRlZmluZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGlmIElSUSBhbmQgb3RoZXIgcmVxdWlyZWQgY2FsbGJhY2tzIGFyZSBkZWZpbmVkIG9yIG5vdCAqLworCWlmICghbWJoY19jYiB8fCAhbWJoY19jYi0+cmVxdWVzdF9pcnEgfHwgIW1iaGNfY2ItPmlycV9jb250cm9sIHx8CisJICAgICFtYmhjX2NiLT5mcmVlX2lycSB8fCAhbWJoY19jYi0+bWFwX2J0bl9jb2RlX3RvX251bSB8fAorCSAgICAhbWJoY19jYi0+bG9ja19zbGVlcCB8fCAhbWJoY19jYi0+bWJoY19iaWFzIHx8CisJICAgICFtYmhjX2NiLT5zZXRfYnRuX3RocikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogcmVxdWlyZWQgbWJoYyBjYWxsYmFja3MgYXJlIG5vdCBkZWZpbmVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWJoYy0+aGVhZHNldF9qYWNrLmphY2sgPT0gTlVMTCkgeworCQlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLAorCQkJCQkgICAgIkhlYWRzZXQgSmFjayIsIFdDRF9NQkhDX0pBQ0tfTUFTSywKKwkJCQkJICAgICZtYmhjLT5oZWFkc2V0X2phY2ssIE5VTEwsIDApOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIG5ldyBqYWNrXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KGNvZGVjLT5jb21wb25lbnQuY2FyZCwKKwkJCQkJICAgICJCdXR0b24gSmFjayIsCisJCQkJCSAgICBXQ0RfTUJIQ19KQUNLX0JVVFRPTl9NQVNLLAorCQkJCQkgICAgJm1iaGMtPmJ1dHRvbl9qYWNrLCBOVUxMLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBqYWNrXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzbmRfamFja19zZXRfa2V5KG1iaGMtPmJ1dHRvbl9qYWNrLmphY2ssCisJCQkJICAgICAgIFNORF9KQUNLX0JUTl8wLAorCQkJCSAgICAgICBLRVlfTUVESUEpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGUgZm9yIGJ0bi0wXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzZXRfYml0KElOUFVUX1BST1BfTk9fRFVNTVlfUkVMRUFTRSwKKwkJCW1iaGMtPmJ1dHRvbl9qYWNrLmphY2stPmlucHV0X2Rldi0+cHJvcGJpdCk7CisKKwkJSU5JVF9ERUxBWUVEX1dPUksoJm1iaGMtPm1iaGNfZmlybXdhcmVfZHdvcmssCisJCQkJICB3Y2RfbWJoY19md19yZWFkKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJm1iaGMtPm1iaGNfYnRuX2R3b3JrLCB3Y2RfYnRuX2xwcmVzc19mbik7CisJfQorCW11dGV4X2luaXQoJm1iaGMtPmhwaGxfcGFfbG9jayk7CisJbXV0ZXhfaW5pdCgmbWJoYy0+aHBocl9wYV9sb2NrKTsKKworCS8qIFJlZ2lzdGVyIGV2ZW50IG5vdGlmaWVyICovCisJbWJoYy0+bmJsb2NrLm5vdGlmaWVyX2NhbGwgPSB3Y2RfZXZlbnRfbm90aWZ5OworCWlmIChtYmhjLT5tYmhjX2NiLT5yZWdpc3Rlcl9ub3RpZmllcikgeworCQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZWdpc3Rlcl9ub3RpZmllcihtYmhjLCAmbWJoYy0+bmJsb2NrLAorCQkJCQkJICAgICAgIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgbm90aWZpZXIgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWJoYy0+d2FpdF9idG5fcHJlc3MpOworCW11dGV4X2luaXQoJm1iaGMtPmNvZGVjX3Jlc291cmNlX2xvY2spOworCisJcmV0ID0gbWJoYy0+bWJoY19jYi0+cmVxdWVzdF9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX3N3X2ludHIsCisJCQkJICB3Y2RfbWJoY19tZWNoX3BsdWdfZGV0ZWN0X2lycSwKKwkJCQkgICJtYmhjIHN3IGludHIiLCBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZCwgcmV0ID0gJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPm1iaGNfc3dfaW50ciwgcmV0KTsKKwkJZ290byBlcnJfbWJoY19zd19pcnE7CisJfQorCisJcmV0ID0gbWJoYy0+bWJoY19jYi0+cmVxdWVzdF9pcnEoY29kZWMsCisJCQkJCSBtYmhjLT5pbnRyX2lkcy0+bWJoY19idG5fcHJlc3NfaW50ciwKKwkJCQkJIHdjZF9tYmhjX2J0bl9wcmVzc19oYW5kbGVyLAorCQkJCQkgIkJ1dHRvbiBQcmVzcyBkZXRlY3QiLAorCQkJCQkgbWJoYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3ByZXNzX2ludHIpOworCQlnb3RvIGVycl9idG5fcHJlc3NfaXJxOworCX0KKworCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlcXVlc3RfaXJxKGNvZGVjLAorCQkJCQkgbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3JlbGVhc2VfaW50ciwKKwkJCQkJIHdjZF9tYmhjX3JlbGVhc2VfaGFuZGxlciwKKwkJCQkJICJCdXR0b24gUmVsZWFzZSBkZXRlY3QiLCBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCisJCQltYmhjLT5pbnRyX2lkcy0+bWJoY19idG5fcmVsZWFzZV9pbnRyKTsKKwkJZ290byBlcnJfYnRuX3JlbGVhc2VfaXJxOworCX0KKworCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlcXVlc3RfaXJxKGNvZGVjLAorCQkJCQkgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHIsCisJCQkJCSB3Y2RfbWJoY19oc19pbnNfaXJxLAorCQkJCQkgIkVsZWN0IEluc2VydCIsIG1iaGMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyKTsKKwkJZ290byBlcnJfbWJoY19oc19pbnNfaXJxOworCX0KKwltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHIsCisJCQkJICAgZmFsc2UpOworCWNsZWFyX2JpdChXQ0RfTUJIQ19FTEVDX0hTX0lOUywgJm1iaGMtPmludHJfc3RhdHVzKTsKKworCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlcXVlc3RfaXJxKGNvZGVjLAorCQkJCQkgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfcmVtX2ludHIsCisJCQkJCSB3Y2RfbWJoY19oc19yZW1faXJxLAorCQkJCQkgIkVsZWN0IFJlbW92ZSIsIG1iaGMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyKTsKKwkJZ290byBlcnJfbWJoY19oc19yZW1faXJxOworCX0KKwltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfcmVtX2ludHIsCisJCQkJICAgZmFsc2UpOworCWNsZWFyX2JpdChXQ0RfTUJIQ19FTEVDX0hTX1JFTSwgJm1iaGMtPmludHJfc3RhdHVzKTsKKworCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlcXVlc3RfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwLAorCQkJCSAgd2NkX21iaGNfaHBobF9vY3BfaXJxLCAiSFBIX0wgT0NQIGRldGVjdCIsCisJCQkJICBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKTsKKwkJZ290byBlcnJfaHBobF9vY3BfaXJxOworCX0KKworCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlcXVlc3RfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwKKwkJCQkgIHdjZF9tYmhjX2hwaHJfb2NwX2lycSwgIkhQSF9SIE9DUCBkZXRlY3QiLAorCQkJCSAgbWJoYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3ApOworCQlnb3RvIGVycl9ocGhyX29jcF9pcnE7CisJfQorCisJcHJfZGVidWcoIiVzOiBsZWF2ZSByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7CisKK2Vycl9ocGhyX29jcF9pcnE6CisJbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3AsIG1iaGMpOworZXJyX2hwaGxfb2NwX2lycToKKwltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfcmVtX2ludHIsIG1iaGMpOworZXJyX21iaGNfaHNfcmVtX2lycToKKwltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHIsIG1iaGMpOworZXJyX21iaGNfaHNfaW5zX2lycToKKwltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3JlbGVhc2VfaW50ciwKKwkJCQltYmhjKTsKK2Vycl9idG5fcmVsZWFzZV9pcnE6CisJbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9wcmVzc19pbnRyLAorCQkJCW1iaGMpOworZXJyX2J0bl9wcmVzc19pcnE6CisJbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX3N3X2ludHIsIG1iaGMpOworZXJyX21iaGNfc3dfaXJxOgorCWlmIChtYmhjLT5tYmhjX2NiLT5yZWdpc3Rlcl9ub3RpZmllcikKKwkJbWJoYy0+bWJoY19jYi0+cmVnaXN0ZXJfbm90aWZpZXIobWJoYywgJm1iaGMtPm5ibG9jaywgZmFsc2UpOworCW11dGV4X2Rlc3Ryb3koJm1iaGMtPmNvZGVjX3Jlc291cmNlX2xvY2spOworZXJyOgorCXByX2RlYnVnKCIlczogbGVhdmUgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19pbml0KTsKKwordm9pZCB3Y2RfbWJoY19kZWluaXQoc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX3N3X2ludHIsIG1iaGMpOworCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+bWJoY19idG5fcHJlc3NfaW50ciwKKwkJCQltYmhjKTsKKwltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3JlbGVhc2VfaW50ciwKKwkJCQltYmhjKTsKKwltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHIsIG1iaGMpOworCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+bWJoY19oc19yZW1faW50ciwgbWJoYyk7CisJbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3AsIG1iaGMpOworCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwgbWJoYyk7CisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+cmVnaXN0ZXJfbm90aWZpZXIpCisJCW1iaGMtPm1iaGNfY2ItPnJlZ2lzdGVyX25vdGlmaWVyKG1iaGMsICZtYmhjLT5uYmxvY2ssIGZhbHNlKTsKKwltdXRleF9kZXN0cm95KCZtYmhjLT5jb2RlY19yZXNvdXJjZV9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZtYmhjLT5ocGhsX3BhX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJm1iaGMtPmhwaHJfcGFfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9tYmhjX2RlaW5pdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigid2NkIE1CSEMgdjIgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDRmZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtdjIuaApAQCAtMCwwICsxLDU0MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19XQ0RfTUJIQ19WMl9IX18KKyNkZWZpbmUgX19XQ0RfTUJIQ19WMl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlICJ3Y2RjYWwtaHdkZXAuaCIKKworI2RlZmluZSBUT01CQUtfTUJIQ19OQwkwCisjZGVmaW5lIFRPTUJBS19NQkhDX05PCTEKKyNkZWZpbmUgV0NEX01CSENfREVGX0JVVFRPTlMgOAorI2RlZmluZSBXQ0RfTUJIQ19LRVlDT0RFX05VTSA4CisjZGVmaW5lIFdDRF9NQkhDX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMgMTAwCisjZGVmaW5lIFdDRF9NQkhDX1RIUl9IU19NSUNCX01WICAyNzAwCisvKiB6IHZhbHVlIGRlZmluZWQgaW4gT2htcyAqLworI2RlZmluZSBXQ0RfTU9OT19IU19NSU5fVEhSCTIKKyNkZWZpbmUgV0NEX01CSENfU1RSSU5HSUZZKHMpICBfX3N0cmluZ2lmeShzKQorCitlbnVtIHsKKwlXQ0RfTUJIQ19FTEVDX0hTX0lOUywKKwlXQ0RfTUJIQ19FTEVDX0hTX1JFTSwKK307CisKK3N0cnVjdCB3Y2RfbWJoYzsKK2VudW0gd2NkX21iaGNfcmVnaXN0ZXJfZnVuY3Rpb24geworCVdDRF9NQkhDX0xfREVUX0VOLAorCVdDRF9NQkhDX0dORF9ERVRfRU4sCisJV0NEX01CSENfTUVDSF9ERVRFQ1RJT05fVFlQRSwKKwlXQ0RfTUJIQ19NSUNfQ0xBTVBfQ1RMLAorCVdDRF9NQkhDX0VMRUNUX0RFVEVDVElPTl9UWVBFLAorCVdDRF9NQkhDX0hTX0xfREVUX1BVTExfVVBfQ1RSTCwKKwlXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NPTVBfQ1RSTCwKKwlXQ0RfTUJIQ19IUEhMX1BMVUdfVFlQRSwKKwlXQ0RfTUJIQ19HTkRfUExVR19UWVBFLAorCVdDRF9NQkhDX1NXX0hQSF9MUF8xMDBLX1RPX0dORCwKKwlXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLAorCVdDRF9NQkhDX0ZTTV9FTiwKKwlXQ0RfTUJIQ19JTlNSRU1fREJOQywKKwlXQ0RfTUJIQ19CVE5fREJOQywKKwlXQ0RfTUJIQ19IU19WUkVGLAorCVdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULAorCVdDRF9NQkhDX01JQ19TQ0hNVF9SRVNVTFQsCisJV0NEX01CSENfSFBITF9TQ0hNVF9SRVNVTFQsCisJV0NEX01CSENfSFBIUl9TQ0hNVF9SRVNVTFQsCisJV0NEX01CSENfT0NQX0ZTTV9FTiwKKwlXQ0RfTUJIQ19CVE5fUkVTVUxULAorCVdDRF9NQkhDX0JUTl9JU1JDX0NUTCwKKwlXQ0RfTUJIQ19FTEVDVF9SRVNVTFQsCisJV0NEX01CSENfTUlDQl9DVFJMLCAgICAvKiBQdWxsLXVwIGFuZCBtaWNiIGNvbnRyb2wgKi8KKwlXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUsCisJV0NEX01CSENfSFBIUl9QQV9FTiwKKwlXQ0RfTUJIQ19IUEhMX1BBX0VOLAorCVdDRF9NQkhDX0hQSF9QQV9FTiwKKwlXQ0RfTUJIQ19TV0NIX0xFVkVMX1JFTU9WRSwKKwlXQ0RfTUJIQ19QVUxMRE9XTl9DVFJMLAorCVdDRF9NQkhDX0FOQ19ERVRfRU4sCisJV0NEX01CSENfRlNNX1NUQVRVUywKKwlXQ0RfTUJIQ19NVVhfQ1RMLAorCVdDRF9NQkhDX0hQSExfT0NQX0RFVF9FTiwKKwlXQ0RfTUJIQ19IUEhSX09DUF9ERVRfRU4sCisJV0NEX01CSENfSFBITF9PQ1BfU1RBVFVTLAorCVdDRF9NQkhDX0hQSFJfT0NQX1NUQVRVUywKKwlXQ0RfTUJIQ19SRUdfRlVOQ19NQVgsCit9OworCitlbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSB7CisJTUJIQ19QTFVHX1RZUEVfSU5WQUxJRCA9IC0xLAorCU1CSENfUExVR19UWVBFX05PTkUsCisJTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCwKKwlNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUsCisJTUJIQ19QTFVHX1RZUEVfSElHSF9IUEgsCisJTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQLAorCU1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkUsCit9OworCitlbnVtIHBhX2RhY19hY2tfZmxhZ3MgeworCVdDRF9NQkhDX0hQSExfUEFfT0ZGX0FDSyA9IDAsCisJV0NEX01CSENfSFBIUl9QQV9PRkZfQUNLLAorfTsKKworZW51bSB3Y2RfbWJoY19idG5fZGV0X21lbSB7CisJV0NEX01CSENfQlROX0RFVF9WX0JUTl9MT1csCisJV0NEX01CSENfQlROX0RFVF9WX0JUTl9ISUdICit9OworCitlbnVtIHsKKwlNSUNfQklBU18xID0gMSwKKwlNSUNfQklBU18yLAorCU1JQ19CSUFTXzMsCisJTUlDX0JJQVNfNAorfTsKKworZW51bSB7CisJTUlDQl9QVUxMVVBfRU5BQkxFLAorCU1JQ0JfUFVMTFVQX0RJU0FCTEUsCisJTUlDQl9FTkFCTEUsCisJTUlDQl9ESVNBQkxFLAorfTsKKworZW51bSB7CisJTUJIQ19DT01NT05fTUlDQl9QUkVDSEFSR0UsCisJTUJIQ19DT01NT05fTUlDQl9TRVRfVkFMLAorCU1CSENfQ09NTU9OX01JQ0JfVEFJTF9DVVJSLAorfTsKKworZW51bSB3Y2Rfbm90aWZ5X2V2ZW50IHsKKwlXQ0RfRVZFTlRfSU5WQUxJRCwKKwkvKiBldmVudHMgZm9yIG1pY2JpYXMgT04gYW5kIE9GRiAqLworCVdDRF9FVkVOVF9QUkVfTUlDQklBU18yX09GRiwKKwlXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT0ZGLAorCVdDRF9FVkVOVF9QUkVfTUlDQklBU18yX09OLAorCVdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTiwKKwlXQ0RfRVZFTlRfUFJFX0RBUE1fTUlDQklBU18yX09GRiwKKwlXQ0RfRVZFTlRfUE9TVF9EQVBNX01JQ0JJQVNfMl9PRkYsCisJV0NEX0VWRU5UX1BSRV9EQVBNX01JQ0JJQVNfMl9PTiwKKwlXQ0RfRVZFTlRfUE9TVF9EQVBNX01JQ0JJQVNfMl9PTiwKKwkvKiBldmVudHMgZm9yIFBBIE9OIGFuZCBPRkYgKi8KKwlXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT04sCisJV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYsCisJV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09OLAorCVdDRF9FVkVOVF9QT1NUX0hQSFJfUEFfT0ZGLAorCVdDRF9FVkVOVF9QUkVfSFBITF9QQV9PRkYsCisJV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09GRiwKKwlXQ0RfRVZFTlRfT0NQX09GRiwKKwlXQ0RfRVZFTlRfT0NQX09OLAorCVdDRF9FVkVOVF9MQVNULAorfTsKKworZW51bSB3Y2RfbWJoY19ldmVudF9zdGF0ZSB7CisJV0NEX01CSENfRVZFTlRfUEFfSFBITCwKKwlXQ0RfTUJIQ19FVkVOVF9QQV9IUEhSLAorfTsKK3N0cnVjdCB3Y2RfbWJoY19nZW5lcmFsX2NmZyB7CisJdTggdF9sZG9oOworCXU4IHRfYmdfZmFzdF9zZXR0bGU7CisJdTggdF9zaHV0ZG93bl9wbHVnX3JlbTsKKwl1OCBtYmhjX25zYTsKKwl1OCBtYmhjX25hdmc7CisJdTggdl9taWNiaWFzX2w7CisJdTggdl9taWNiaWFzOworCXU4IG1iaGNfcmVzZXJ2ZWQ7CisJdTE2IHNldHRsZV93YWl0OworCXUxNiB0X21pY2JpYXNfcmFtcHVwOworCXUxNiB0X21pY2JpYXNfcmFtcGRvd247CisJdTE2IHRfc3VwcGx5X2JyaW5ndXA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2NkX21iaGNfcGx1Z19kZXRlY3RfY2ZnIHsKKwl1MzIgbWljX2N1cnJlbnQ7CisJdTMyIGhwaF9jdXJyZW50OworCXUxNiB0X21pY19waWQ7CisJdTE2IHRfaW5zX2NvbXBsZXRlOworCXUxNiB0X2luc19yZXRyeTsKKwl1MTYgdl9yZW1vdmFsX2RlbHRhOworCXU4IG1pY2JpYXNfc2xvd19yYW1wOworCXU4IHJlc2VydmVkMDsKKwl1OCByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQyOworfSBfX3BhY2tlZDsKKworc3RydWN0IHdjZF9tYmhjX3BsdWdfdHlwZV9jZmcgeworCXU4IGF2X2RldGVjdDsKKwl1OCBtb25vX2RldGVjdDsKKwl1OCBudW1faW5zX3RyaWVzOworCXU4IHJlc2VydmVkMDsKKwlzMTYgdl9ub19taWM7CisJczE2IHZfYXZfbWluOworCXMxNiB2X2F2X21heDsKKwlzMTYgdl9oc19taW47CisJczE2IHZfaHNfbWF4OworCXUxNiByZXNlcnZlZDE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgeworCXM4IGNbOF07CisJdTggbmM7CisJdTggbl9tZWFzOworCXU4IG1iaGNfbnNjOworCXU4IG5fYnRuX21lYXM7CisJdTggbl9idG5fY29uOworCXU4IG51bV9idG47CisJdTggcmVzZXJ2ZWQwOworCXU4IHJlc2VydmVkMTsKKwl1MTYgdF9wb2xsOworCXUxNiB0X2JvdW5jZV93YWl0OworCXUxNiB0X3JlbF90aW1lb3V0OworCXMxNiB2X2J0bl9wcmVzc19kZWx0YV9zdGE7CisJczE2IHZfYnRuX3ByZXNzX2RlbHRhX2NpYzsKKwl1MTYgdF9idG4wX3RpbWVvdXQ7CisJczE2IF92X2J0bl9sb3dbMF07IC8qIHZfYnRuX2xvd1tudW1fYnRuXSAqLworCXMxNiBfdl9idG5faGlnaFswXTsgLyogdl9idG5faGlnaFtudW1fYnRuXSAqLworCXU4IF9uX3JlYWR5WzJdOworCXU4IF9uX2NpY1syXTsKKwl1OCBfZ2FpblsyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2RfbWJoY19pbXBlZF9kZXRlY3RfY2ZnIHsKKwl1OCBfaHNfaW1wZWRfZGV0ZWN0OworCXU4IF9uX3Jsb2FkOworCXU4IF9ocGhfa2VlcF9vbjsKKwl1OCBfcmVwZWF0X3Jsb2FkX2NhbGM7CisJdTE2IF90X2RhY19yYW1wX3RpbWU7CisJdTE2IF9yaHBoX2hpZ2g7CisJdTE2IF9yaHBoX2xvdzsKKwl1MTYgX3Jsb2FkWzBdOyAvKiBybG9hZFtuX3Jsb2FkXSAqLworCXUxNiBfYWxwaGFbMF07IC8qIGFscGhhW25fcmxvYWRdICovCisJdTE2IF9iZXRhWzNdOworfSBfX3BhY2tlZDsKKworZW51bSB3Y2RfbWJoY19ocGhfdHlwZSB7CisJV0NEX01CSENfSFBIX05PTkUgPSAwLAorCVdDRF9NQkhDX0hQSF9NT05PLAorCVdDRF9NQkhDX0hQSF9TVEVSRU8sCit9OworCisvKgorICogVGhlc2UgZW51bSBkZWZpbml0aW9ucyBhcmUgZGlyZWN0bHkgbWFwcGVkIHRvIHRoZSByZWdpc3RlcgorICogZGVmaW5pdGlvbnMKKyAqLworZW51bSBtYmhjX21vaXN0dXJlX3ZyZWYgeworCVZfT0ZGLAorCVZfNDVfTVYsCisJVl8xMDBfTVYsCisJVl8yMjVfTVYsCit9OworCitlbnVtIG1iaGNfaHNfcHVsbHVwX2lyZWYgeworCUlfREVGQVVMVCA9IC0xLAorCUlfT0ZGID0gMCwKKwlJXzFQMF9VQSwKKwlJXzJQMF9VQSwKKwlJXzNQMF9VQSwKK307CisKK2VudW0gbWJoY19tb2lzdHVyZV9ycmVmIHsKKwlSX09GRiwKKwlSXzI0X0tPSE0sCisJUl84NF9LT0hNLAorCVJfMTg0X0tPSE0sCit9OworCitzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnIHsKKwlib29sIHJlYWRfZndfYmluOworCXZvaWQgKmNhbGlicmF0aW9uOworCWJvb2wgZGV0ZWN0X2V4dG5fY2FibGU7CisJYm9vbCBtb25vX3N0ZXJvX2RldGVjdGlvbjsKKwlib29sICgqc3dhcF9nbmRfbWljKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworCWJvb2wgaHNfZXh0X21pY2JpYXM7CisJYm9vbCBnbmRfZGV0X2VuOworCWludCBrZXlfY29kZVtXQ0RfTUJIQ19LRVlDT0RFX05VTV07CisJdWludDMyX3QgbGluZWluX3RoOworCWJvb2wgbW9pc3R1cmVfZW47CisJaW50IG1iaGNfbWljYmlhczsKKwlpbnQgYW5jX21pY2JpYXM7CisJYm9vbCBlbmFibGVfYW5jX21pY19kZXRlY3Q7Cit9OworCitzdHJ1Y3Qgd2NkX21iaGNfaW50ciB7CisJaW50IG1iaGNfc3dfaW50cjsKKwlpbnQgbWJoY19idG5fcHJlc3NfaW50cjsKKwlpbnQgbWJoY19idG5fcmVsZWFzZV9pbnRyOworCWludCBtYmhjX2hzX2luc19pbnRyOworCWludCBtYmhjX2hzX3JlbV9pbnRyOworCWludCBocGhfbGVmdF9vY3A7CisJaW50IGhwaF9yaWdodF9vY3A7Cit9OworCitzdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIgeworCWNvbnN0IGNoYXIgKmlkOworCXUxNiByZWc7CisJdTggbWFzazsKKwl1OCBvZmZzZXQ7CisJdTggaW52ZXJ0OworfTsKKworI2RlZmluZSBXQ0RfTUJIQ19SRUdJU1RFUihyaWQsIHJyZWcsIHJtYXNrLCByc2hpZnQsIHJpbnZlcnQpIFwKK3sgLmlkID0gcmlkLCAucmVnID0gcnJlZywgLm1hc2sgPSBybWFzaywgLm9mZnNldCA9IHJzaGlmdCwgLmludmVydCA9IHJpbnZlcnQgfQorCisjZGVmaW5lIFdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpCQkJXAorewkJCQkJCQlcCisJcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkNMXG4iLCBfX2Z1bmNfXyk7CVwKKwltdXRleF9sb2NrKCZtYmhjLT5jb2RlY19yZXNvdXJjZV9sb2NrKTsJCVwKKwlwcl9kZWJ1ZygiJXM6IEFjcXVpcmluZyBCQ0wgZG9uZVxuIiwgX19mdW5jX18pOwlcCit9CisKKyNkZWZpbmUgV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKQkJCVwKK3sJCQkJCQkJXAorCXByX2RlYnVnKCIlczogUmVsZWFzZSBCQ0xcbiIsIF9fZnVuY19fKTsJXAorCW11dGV4X3VubG9jaygmbWJoYy0+Y29kZWNfcmVzb3VyY2VfbG9jayk7CVwKK30KKworI2RlZmluZSBXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKQkJXAorewkJCQkJCQlcCisJV0FSTl9PTkNFKCFtdXRleF9pc19sb2NrZWQoJm1iaGMtPmNvZGVjX3Jlc291cmNlX2xvY2spLCBcCisJCSAgIiVzOiBCQ0wgc2hvdWxkIGhhdmUgYWNxdWlyZWRcbiIsIF9fZnVuY19fKTsgXAorfQorCisvKgorICogTWFjcm9zIHRvIHVwZGF0ZSBhbmQgcmVhZCBtYmhjIHJlZ2lzdGVyIGJpdHMuIENoZWNrIGZvcgorICogIjAiIGJlZm9yZSB1cGRhdGluZyBvciByZWFkaW5nIHRoZSByZWdpc3RlciwgYmVjYXVzZSBpdAorICogaXMgcG9zc2libGUgdGhhdCBvbmUgY29kZWMgd2FudHMgdG8gd3JpdGUgdG8gdGhhdCBiaXQgYW5kCisgKiBvdGhlciBjb2RlYyBkb2VzIG5vdC4KKyAqLworI2RlZmluZSBXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoZnVuY3Rpb24sIHZhbCkgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAobWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ucmVnKSB7ICAgICAgICBcCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWJoYy0+Y29kZWMsCVwKKwkJbWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ucmVnLAlcCisJCW1iaGMtPndjZF9tYmhjX3JlZ3NbZnVuY3Rpb25dLm1hc2ssCVwKKwkJdmFsIDw8IChtYmhjLT53Y2RfbWJoY19yZWdzW2Z1bmN0aW9uXS5vZmZzZXQpKTsgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgV0NEX01CSENfUkVHX1JFQUQoZnVuY3Rpb24sIHZhbCkJICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAobWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ucmVnKSB7ICAgICAgICBcCisJCXZhbCA9ICgoKHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywJXAorCQltYmhjLT53Y2RfbWJoY19yZWdzW2Z1bmN0aW9uXS5yZWcpKSAmCVwKKwkJKG1iaGMtPndjZF9tYmhjX3JlZ3NbZnVuY3Rpb25dLm1hc2spKSA+PiBcCisJCShtYmhjLT53Y2RfbWJoY19yZWdzW2Z1bmN0aW9uXS5vZmZzZXQpKTsgXAorCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXZhbCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdHJ1Y3Qgd2NkX21iaGNfY2IgeworCWludCAoKmVuYWJsZV9tYl9zb3VyY2UpKHN0cnVjdCB3Y2RfbWJoYyAqLCBib29sKTsKKwl2b2lkICgqdHJpbV9idG5fcmVnKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKKwl2b2lkICgqY29tcHV0ZV9pbXBlZGFuY2UpKHN0cnVjdCB3Y2RfbWJoYyAqLCB1aW50MzJfdCAqLCB1aW50MzJfdCAqKTsKKwl2b2lkICgqc2V0X21pY2JpYXNfdmFsdWUpKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOworCXZvaWQgKCpzZXRfYXV0b196ZXJvaW5nKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICogKCpnZXRfaHdkZXBfZndfY2FsKShzdHJ1Y3Qgd2NkX21iaGMgKiwKKwkJCWVudW0gd2NkX2NhbF90eXBlKTsKKwl2b2lkICgqc2V0X2NhcF9tb2RlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sLCBib29sKTsKKwlpbnQgKCpyZWdpc3Rlcl9ub3RpZmllcikoc3RydWN0IHdjZF9tYmhjICosCisJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrLAorCQkJCSBib29sIGVuYWJsZSk7CisJaW50ICgqcmVxdWVzdF9pcnEpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCisJCQlpbnQsIGlycV9oYW5kbGVyX3QsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKKwl2b2lkICgqaXJxX2NvbnRyb2wpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCisJCQlpbnQgaXJxLCBib29sIGVuYWJsZSk7CisJaW50ICgqZnJlZV9pcnEpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCisJCQlpbnQgaXJxLCB2b2lkICopOworCXZvaWQgKCpjbGtfc2V0dXApKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOworCWludCAoKm1hcF9idG5fY29kZV90b19udW0pKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOworCWJvb2wgKCpsb2NrX3NsZWVwKShzdHJ1Y3Qgd2NkX21iaGMgKiwgYm9vbCk7CisJYm9vbCAoKm1pY2JpYXNfZW5hYmxlX3N0YXR1cykoc3RydWN0IHdjZF9tYmhjICosIGludCk7CisJdm9pZCAoKm1iaGNfYmlhcykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7CisJdm9pZCAoKm1iaGNfY29tbW9uX21pY2JfY3RybCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKKwkJCQkgICAgICBpbnQgZXZlbnQsIGJvb2wpOworCXZvaWQgKCptaWNiX2ludGVybmFsKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAorCQkJaW50IG1pY2JfbnVtLCBib29sKTsKKwlib29sICgqaHBoX3BhX29uX3N0YXR1cykoc3RydWN0IHNuZF9zb2NfY29kZWMgKik7CisJdm9pZCAoKnNldF9idG5fdGhyKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBzMTYgKiwgczE2ICosCisJCQkgICAgaW50IG51bV9idG4sIGJvb2wpOworCXZvaWQgKCpocGhfcHVsbF91cF9jb250cm9sKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAorCQkJCSAgICBlbnVtIG1iaGNfaHNfcHVsbHVwX2lyZWYpOworCWludCAoKm1iaGNfbWljYmlhc19jb250cm9sKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBpbnQsIGludCByZXEpOworCXZvaWQgKCptYmhjX21pY2JfcmFtcF9jb250cm9sKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwl2b2lkICgqc2tpcF9pbXBlZF9kZXRlY3QpKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOworCWJvb2wgKCpleHRuX3VzZV9tYikoc3RydWN0IHNuZF9zb2NfY29kZWMgKik7CisJaW50ICgqbWJoY19taWNiX2N0cmxfdGhyX21pYykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgaW50LCBib29sKTsKKwl2b2lkICgqbWJoY19nbmRfZGV0X2N0cmwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOworCXZvaWQgKCpocGhfcHVsbF9kb3duX2N0cmwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOworCXZvaWQgKCptYmhjX21vaXN0dXJlX2NvbmZpZykoc3RydWN0IHdjZF9tYmhjICopOworCWJvb2wgKCpocGhfcmVnaXN0ZXJfcmVjb3ZlcnkpKHN0cnVjdCB3Y2RfbWJoYyAqKTsKK307CisKK3N0cnVjdCB3Y2RfbWJoYyB7CisJLyogRGVsYXllZCB3b3JrIHRvIHJlcG9ydCBsb25nIGJ1dHRvbiBwcmVzcyAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgbWJoY19idG5fZHdvcms7CisJaW50IGJ1dHRvbnNfcHJlc3NlZDsKKwlzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZzsKKwljb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgKm1iaGNfY2I7CisKKwl1MzIgaHBoX3N0YXR1czsgLyogdHJhY2sgaGVhZGhwb25lIHN0YXR1cyAqLworCXU4IGhwaGxvY3BfY250OyAvKiBoZWFkcGhvbmUgbGVmdCBvY3AgcmV0cnkgKi8KKwl1OCBocGhyb2NwX2NudDsgLyogaGVhZHBob25lIHJpZ2h0IG9jcCByZXRyeSAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9idG5fcHJlc3M7CisJYm9vbCBpc19idG5fcHJlc3M7CisJdTggY3VycmVudF9wbHVnOworCWJvb2wgaW5fc3djaF9pcnFfaGFuZGxlcjsKKwlib29sIGhwaGxfc3doOyAvKnRyYWNrIEhQSEwgc3dpdGNoIE5DIC8gTk8gKi8KKwlib29sIGduZF9zd2g7IC8qdHJhY2sgR05EIHN3aXRjaCBOQyAvIE5PICovCisJdTggbWljYmlhczFfY2FwX21vZGU7IC8qIHRyYWNrIGV4dCBjYXAgc2V0dGluZyAqLworCXU4IG1pY2JpYXMyX2NhcF9tb2RlOyAvKiB0cmFjayBleHQgY2FwIHNldHRpbmcgKi8KKwlib29sIGhzX2RldGVjdF93b3JrX3N0b3A7CisJYm9vbCBtaWNiaWFzX2VuYWJsZTsKKwlib29sIGJ0bl9wcmVzc19pbnRyOworCWJvb2wgaXNfaHNfcmVjb3JkaW5nOworCWJvb2wgaXNfZXh0bl9jYWJsZTsKKwlib29sIHNraXBfaW1wZWRfZGV0ZWN0aW9uOworCWJvb2wgaXNfYnRuX2FscmVhZHlfcmVnZDsKKworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwkvKiBXb3JrIHRvIHBlcmZvcm0gTUJIQyBGaXJtd2FyZSBSZWFkICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBtYmhjX2Zpcm13YXJlX2R3b3JrOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbWJoY19mdzsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICptYmhjX2NhbDsKKworCS8qIHRyYWNrIFBBL0RBQyBzdGF0ZSB0byBzeW5jIHdpdGggdXNlcnNwYWNlICovCisJdW5zaWduZWQgbG9uZyBocGhfcGFfZGFjX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZXZlbnRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX2F0cmVwb3J0OworCisJLyogaW1wZWRhbmNlIG9mIGhwaGwgYW5kIGhwaHIgKi8KKwl1aW50MzJfdCB6bCwgenI7CisJYm9vbCBpbXBlZGFuY2VfZGV0ZWN0OworCisJLyogSG9sZHMgdHlwZSBvZiBIZWFkc2V0IC0gTW9uby9TdGVyZW8gKi8KKwllbnVtIHdjZF9tYmhjX2hwaF90eXBlIGhwaF90eXBlOworCisJc3RydWN0IHNuZF9zb2NfamFjayBoZWFkc2V0X2phY2s7CisJc3RydWN0IHNuZF9zb2NfamFjayBidXR0b25famFjazsKKwlzdHJ1Y3QgbXV0ZXggY29kZWNfcmVzb3VyY2VfbG9jazsKKworCS8qIEhvbGRzIGNvZGVjIHNwZWNpZmljIGludGVycnVwdCBtYXBwaW5nICovCisJY29uc3Qgc3RydWN0IHdjZF9tYmhjX2ludHIgKmludHJfaWRzOworCisJLyogV29yayB0byBjb3JyZWN0IGFjY2Vzc29yeSB0eXBlICovCisJc3RydWN0IHdvcmtfc3RydWN0IGNvcnJlY3RfcGx1Z19zd2NoOworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYmxvY2s7CisKKwlzdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIgKndjZF9tYmhjX3JlZ3M7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBidG5fcHJlc3NfY29tcGw7CisJc3RydWN0IG11dGV4IGhwaGxfcGFfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggaHBocl9wYV9sb2NrOworCisJdW5zaWduZWQgbG9uZyBpbnRyX3N0YXR1czsKKwlib29sIGlzX2hwaF9vY3BfcGVuZGluZzsKK307CisjZGVmaW5lIFdDRF9NQkhDX0NBTF9TSVpFKGJ1dHRvbnMsIHJsb2FkKSAoIFwKKwlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2dlbmVyYWxfY2ZnKSArIFwKKwlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX3BsdWdfZGV0ZWN0X2NmZykgKyBcCisJKChzaXplb2YoczE2KSArIHNpemVvZihzMTYpKSAqIGJ1dHRvbnMpICsgXAorCSAgICBzaXplb2Yoc3RydWN0IHdjZF9tYmhjX3BsdWdfdHlwZV9jZmcpICsgXAorCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcpICsgXAorCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBcCisJCSgoc2l6ZW9mKHUxNikgKyBzaXplb2YodTE2KSkgKiBybG9hZCkgXAorCSkKKworCisjZGVmaW5lIFdDRF9NQkhDX0NBTF9HRU5FUkFMX1BUUihjYWxpKSAoIFwKKwkoc3RydWN0IHdjZF9tYmhjX2dlbmVyYWxfY2ZnICopIGNhbGkpCisjZGVmaW5lIFdDRF9NQkhDX0NBTF9QTFVHX0RFVF9QVFIoY2FsaSkgKCBcCisJKHN0cnVjdCB3Y2RfbWJoY19wbHVnX2RldGVjdF9jZmcgKikgXAorCSYoV0NEX01CSENfQ0FMX0dFTkVSQUxfUFRSKGNhbGkpWzFdKSkKKyNkZWZpbmUgV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIoY2FsaSkgKCBcCisJKHN0cnVjdCB3Y2RfbWJoY19wbHVnX3R5cGVfY2ZnICopIFwKKwkmKFdDRF9NQkhDX0NBTF9QTFVHX0RFVF9QVFIoY2FsaSlbMV0pKQorI2RlZmluZSBXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSkgKCBcCisJICAgIChzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKikgXAorCSYoV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIoY2FsaSlbMV0pKQorI2RlZmluZSBXQ0RfTUJIQ19DQUxfSU1QRURfREVUX1BUUihjYWxpKSAoIFwKKwkoc3RydWN0IHdjZF9tYmhjX2ltcGVkX2RldGVjdF9jZmcgKikgXAorCSgoKHZvaWQgKikmV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKGNhbGkpWzFdKSArIFwKKwkoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKGNhbGkpLT5udW1fYnRuICogXAorCShzaXplb2YoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKGNhbGkpLT5fdl9idG5fbG93WzBdKSArIFwKKwlzaXplb2YoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKGNhbGkpLT5fdl9idG5faGlnaFswXSkpKSkgXAorCSkKKworI2RlZmluZSBXQ0RfTUJIQ19DQUxfTUlOX1NJWkUgKCBcCisJc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19nZW5lcmFsX2NmZykgKyBcCisJc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19wbHVnX2RldGVjdF9jZmcpICsgXAorCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfcGx1Z190eXBlX2NmZykgKyBcCisJc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZykgKyBcCisJc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19pbXBlZF9kZXRlY3RfY2ZnKSArIFwKKwkoc2l6ZW9mKHUxNikqMikgIFwKKwkpCisKKyNkZWZpbmUgV0NEX01CSENfQ0FMX0JUTl9TWihjZmdfcHRyKSAoIFwKKwlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnKSArIFwKKwkoY2ZnX3B0ci0+bnVtX2J0biAqIChzaXplb2YoY2ZnX3B0ci0+X3ZfYnRuX2xvd1swXSkgKyBcCisJCQlzaXplb2YoY2ZnX3B0ci0+X3ZfYnRuX2hpZ2hbMF0pKSkpCisKKyNkZWZpbmUgV0NEX01CSENfQ0FMX0lNUEVEX01JTl9TWiAoIFwKKwlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2ltcGVkX2RldGVjdF9jZmcpICsgc2l6ZW9mKHUxNikgKiAyKQorCisjZGVmaW5lIFdDRF9NQkhDX0NBTF9JTVBFRF9TWihjZmdfcHRyKSAoIFwKKwlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2ltcGVkX2RldGVjdF9jZmcpICsgXAorCShjZmdfcHRyLT5fbl9ybG9hZCAqIFwKKwkoc2l6ZW9mKGNmZ19wdHItPl9ybG9hZFswXSkgKyBzaXplb2YoY2ZnX3B0ci0+X2FscGhhWzBdKSkpKQorCisjaWZkZWYgQ09ORklHX1NORF9TT0NfV0NEX01CSEMKK2ludCB3Y2RfbWJoY19zZXRfa2V5Y29kZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOworaW50IHdjZF9tYmhjX3N0YXJ0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJICAgICAgIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnKTsKK3ZvaWQgd2NkX21iaGNfc3RvcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOworaW50IHdjZF9tYmhjX2luaXQoc3RydWN0IHdjZF9tYmhjICptYmhjLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3Y2RfbWJoY19jYiAqbWJoY19jYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2ludHIgKm1iaGNfY2RjX2ludHJfaWRzLAorCQkgICAgICBzdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIgKm1iaGNfcmVnLAorCQkgICAgICBib29sIGltcGVkYW5jZV9kZXRfZW4pOworaW50IHdjZF9tYmhjX2dldF9pbXBlZGFuY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLCB1aW50MzJfdCAqemwsCisJCQkgICB1aW50MzJfdCAqenIpOwordm9pZCB3Y2RfbWJoY19kZWluaXQoc3RydWN0IHdjZF9tYmhjICptYmhjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX21iaGNfc3RvcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCB3Y2RfbWJoY19pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiICptYmhjX2NiLAorCQkJCWNvbnN0IHN0cnVjdCB3Y2RfbWJoY19pbnRyICptYmhjX2NkY19pbnRyX2lkcywKKwkJCQlzdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIgKm1iaGNfcmVnLAorCQkJCWJvb2wgaW1wZWRhbmNlX2RldF9lbikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHdjZF9tYmhjX3N0YXJ0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkJIHVpbnQzMl90ICp6bCwKKwkJCQkJIHVpbnQzMl90ICp6cikKK3sKKwkqemwgPSAwOworCSp6ciA9IDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX21iaGNfZGVpbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKK3sKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19XQ0RfTUJIQ19WMl9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLXNwaS1yZWdpc3RlcnMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLXNwaS1yZWdpc3RlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTU3OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Qtc3BpLXJlZ2lzdGVycy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fV0NEX1NQSV9SRUdJU1RFUlNfSF9fCisjZGVmaW5lIF9fV0NEX1NQSV9SRUdJU1RFUlNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1NBTklUWSAgICAgICAgICgweDAwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0RFVklDRV9JRCAgICAgICgweDA0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1NUQVRVUyAgICAgICAgICgweDA4KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0NPTkZJRyAgICAgICAgICgweDBjKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1NXX1JFU0VUICAgICAgICgweDEwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0lSUV9TVEFUVVMgICAgICgweDE0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0lSUV9FTiAgICAgICAgICgweDE4KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0lSUV9DTFIgICAgICAgICgweDFjKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0lSUV9GT1JDRSAgICAgICgweDIwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1RYICAgICAgICAgICAgICgweDI0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1RFU1RfQlVTX0RBVEEgICgweDJjKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1RFU1RfQlVTX0NUUkwgICgweDMwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1NXX1JTVF9JUlEgICAgICgweDM0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0NIQVJfQ0ZHICAgICAgICgweDM4KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0NIQVJfREFUQV9NT1NJICgweDNjKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0NIQVJfREFUQV9DU19OICgweDQwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0NIQVJfREFUQV9NSVNPICgweDQ0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1RSTlNfQllURV9DTlQgICgweDRjKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX1RSTlNfTEVOICAgICAgICgweDUwKQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0ZJRk9fTEVWRUwgICAgICgweDU0KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0dFTkVSSUNTICAgICAgICgweDU4KQorI2RlZmluZSBXQ0RfU1BJX1NMQVZFX0VYVF9CQVNFX0FERFIgICgweDVjKQorI2RlZmluZSBXQ0RfU1BJX01BWF9SRUdJU1RFUiAgICAgICAgICgweDVGKQorCisjZW5kaWYgLyogRW5kIF9fV0NEX1NQSV9SRUdJU1RFUlNfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZC1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZmJjODkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1zcGkuYwpAQCAtMCwwICsxLDEzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPHNvdW5kL3djZC1kc3AtbWdyLmg+CisjaW5jbHVkZSA8c291bmQvd2NkLXNwaS5oPgorI2luY2x1ZGUgIndjZC1zcGktcmVnaXN0ZXJzLmgiCisKKy8qIEJ5dGUgbWFuaXB1bGF0aW9ucyAqLworI2RlZmluZSBTSElGVF8xX0JZVEVTICAgICg4KQorI2RlZmluZSBTSElGVF8yX0JZVEVTICAgICgxNikKKyNkZWZpbmUgU0hJRlRfM19CWVRFUyAgICAoMjQpCisKKy8qIENvbW1hbmQgb3Bjb2RlcyAqLworI2RlZmluZSBXQ0RfU1BJX0NNRF9OT1AgICAgICgweDAwKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9XUkVOICAgICgweDA2KQorI2RlZmluZSBXQ0RfU1BJX0NNRF9DTEtSRVEgICgweERBKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9SRFNSICAgICgweDA1KQorI2RlZmluZSBXQ0RfU1BJX0NNRF9JUlIgICAgICgweDgxKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9JUlcgICAgICgweDgyKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9NSU9SICAgICgweDgzKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9GUkVBRCAgICgweDBCKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9NSU9XICAgICgweDAyKQorI2RlZmluZSBXQ0RfU1BJX1dSSVRFX0ZSQU1FX09QQ09ERSBcCisJKFdDRF9TUElfQ01EX01JT1cgPDwgU0hJRlRfM19CWVRFUykKKyNkZWZpbmUgV0NEX1NQSV9SRUFEX0ZSQU1FX09QQ09ERSBcCisJKFdDRF9TUElfQ01EX01JT1IgPDwgU0hJRlRfM19CWVRFUykKKyNkZWZpbmUgV0NEX1NQSV9GUkVBRF9GUkFNRV9PUENPREUgXAorCShXQ0RfU1BJX0NNRF9GUkVBRCA8PCBTSElGVF8zX0JZVEVTKQorCisvKiBDb21tYW5kIGxlbmd0aHMgKi8KKyNkZWZpbmUgV0NEX1NQSV9PUENPREVfTEVOICAgICAgICgweDAxKQorI2RlZmluZSBXQ0RfU1BJX0NNRF9OT1BfTEVOICAgICAgKDB4MDEpCisjZGVmaW5lIFdDRF9TUElfQ01EX1dSRU5fTEVOICAgICAoMHgwMSkKKyNkZWZpbmUgV0NEX1NQSV9DTURfQ0xLUkVRX0xFTiAgICgweDA0KQorI2RlZmluZSBXQ0RfU1BJX0NNRF9JUlJfTEVOICAgICAgKDB4MDQpCisjZGVmaW5lIFdDRF9TUElfQ01EX0lSV19MRU4gICAgICAoMHgwNikKKyNkZWZpbmUgV0NEX1NQSV9XUklURV9TSU5HTEVfTEVOICgweDA4KQorI2RlZmluZSBXQ0RfU1BJX1JFQURfU0lOR0xFX0xFTiAgKDB4MTMpCisjZGVmaW5lIFdDRF9TUElfQ01EX0ZSRUFEX0xFTiAgICAoMHgxMykKKworLyogQ29tbWFuZCBkZWxheXMgKi8KKyNkZWZpbmUgV0NEX1NQSV9DTEtSRVFfREVMQVlfVVNFQ1MgKDUwMCkKKyNkZWZpbmUgV0NEX1NQSV9DTEtfT0ZGX1RJTUVSX01TICAgKDMwMDApCisKKy8qIENvbW1hbmQgbWFza3MgKi8KKyNkZWZpbmUgV0NEX0NNRF9BRERSX01BU0sgICAgICAgICAgICBcCisJKDB4RkYgfCAgICAgICAgICAgICAgICAgICAgICBcCisJICgweEZGIDw8IFNISUZUXzFfQllURVMpIHwgICBcCisJICgweEZGIDw8IFNISUZUXzJfQllURVMpKQorCisvKiBDbG9jayBjdHJsIHJlcXVlc3QgcmVsYXRlZCAqLworI2RlZmluZSBXQ0RfU1BJX0NMS19FTkFCTEUgdHJ1ZQorI2RlZmluZSBXQ0RfU1BJX0NMS19ESVNBQkxFIGZhbHNlCisjZGVmaW5lIFdDRF9TUElfQ0xLX0ZMQUdfREVMQVlFRCAgICAoMSA8PCAwKQorI2RlZmluZSBXQ0RfU1BJX0NMS19GTEFHX0lNTUVESUFURSAgKDEgPDwgMSkKKworLyogSW50ZXJuYWwgYWRkcmVzc2VzICovCisjZGVmaW5lIFdDRF9TUElfQUREUl9JUENfQ1RMX0hPU1QgKDB4MDEyMDE0KQorCisvKiBXb3JkIHNpemVzIGFuZCBtaW4vbWF4IGxlbmd0aHMgKi8KKyNkZWZpbmUgV0NEX1NQSV9XT1JEX0JZVEVfQ05UICg0KQorI2RlZmluZSBXQ0RfU1BJX1JXX01VTFRJX01JTl9MRU4gKDE2KQorCisvKiBNYXggc2l6ZSBpcyBjbG9zZXN0IG11bHRpcGxlIG9mIDE2IGxlc3MgdGhhbiA2NEtieXRlcyAqLworI2RlZmluZSBXQ0RfU1BJX1JXX01VTFRJX01BWF9MRU4gKCg2NCAqIDEwMjQpIC0gMTYpCisKKy8qIEFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KKyNkZWZpbmUgV0NEX1NQSV9SV19NSU5fQUxJR04gICAgV0NEX1NQSV9XT1JEX0JZVEVfQ05UCisjZGVmaW5lIFdDRF9TUElfUldfTVVMVElfQUxJR04gICgxNikKKworLyogU3RhdHVzIG1hc2sgYml0cyAqLworI2RlZmluZSBXQ0RfU1BJX0NMS19TVEFURV9FTkFCTEVEIEJJVCgwKQorCisvKiBMb2NraW5nIHJlbGF0ZWQgKi8KKyNkZWZpbmUgV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgbG9jaykgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkZXZfdmRiZygmc3BpLT5kZXYsICIlczogbXV0ZXhfbG9jayglcylcbiIsIFwKKwkJIF9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgXAorCW11dGV4X2xvY2soJmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCBsb2NrKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZGV2X3ZkYmcoJnNwaS0+ZGV2LCAiJXM6IG11dGV4X3VubG9jayglcylcbiIsIFwKKwkJIF9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICBcCisJbXV0ZXhfdW5sb2NrKCZsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdHJ1Y3Qgd2NkX3NwaV9kZWJ1Z19kYXRhIHsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9OworCitzdHJ1Y3Qgd2NkX3NwaV9wcml2IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCXUzMiBtZW1fYmFzZV9hZGRyOworCisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJLyogTWVzc2FnZSBmb3Igc2luZ2xlIHRyYW5zZmVyICovCisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzE7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyMTsKKworCS8qIE1lc3NhZ2UgZm9yIHR3byB0cmFuc2ZlcnMgKi8KKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnMjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIyWzJdOworCisJLyogUmVnaXN0ZXIgYWNjZXNzIHJlbGF0ZWQgKi8KKwl1MzIgcmVnX2J5dGVzOworCXUzMiB2YWxfYnl0ZXM7CisKKwkvKiBDbG9jayByZXF1ZXN0cyByZWxhdGVkICovCisJc3RydWN0IG11dGV4IGNsa19tdXRleDsKKwlpbnQgY2xrX3VzZXJzOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBjbGtfZHdvcms7CisKKwkvKiBUcmFuc2FjdGlvbiByZWxhdGVkICovCisJc3RydWN0IG11dGV4IHhmZXJfbXV0ZXg7CisKKwlzdHJ1Y3QgZGV2aWNlICptX2RldjsKKwlzdHJ1Y3Qgd2RzcF9tZ3Jfb3BzICptX29wczsKKworCS8qIERlYnVnZnMgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB3Y2Rfc3BpX2RlYnVnX2RhdGEgZGVidWdfZGF0YTsKK307CisKK2VudW0geGZlcl9yZXF1ZXN0IHsKKwlXQ0RfU1BJX1hGRVJfV1JJVEUsCisJV0NEX1NQSV9YRkVSX1JFQUQsCit9OworCisKK3N0YXRpYyBjaGFyICp3Y2Rfc3BpX3hmZXJfcmVxX3N0cihlbnVtIHhmZXJfcmVxdWVzdCByZXEpCit7CisJaWYgKHJlcSA9PSBXQ0RfU1BJX1hGRVJfV1JJVEUpCisJCXJldHVybiAieGZlcl93cml0ZSI7CisJZWxzZSBpZiAocmVxID09IFdDRF9TUElfWEZFUl9SRUFEKQorCQlyZXR1cm4gInhmZXJfcmVhZCI7CisJZWxzZQorCQlyZXR1cm4gInhmZXJfaW52YWxpZCI7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9zcGlfcmVpbml0X3hmZXIoc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwl4ZmVyLT50eF9idWYgPSBOVUxMOworCXhmZXItPnJ4X2J1ZiA9IE5VTEw7CisJeGZlci0+ZGVsYXlfdXNlY3MgPSAwOworCXhmZXItPmxlbiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV9yZWFkX3NpbmdsZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICAgIHUzMiByZW1vdGVfYWRkciwgdTMyICp2YWwpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnR4X3hmZXIgPSAmd2NkX3NwaS0+eGZlcjJbMF07CisJc3RydWN0IHNwaV90cmFuc2ZlciAqcnhfeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMlsxXTsKKwl1OCAqdHhfYnVmOworCXUzMiBmcmFtZSA9IDA7CisJaW50IHJldDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IHJlbW90ZV9hZGRyID0gMHgleFxuIiwKKwkJX19mdW5jX18sIHJlbW90ZV9hZGRyKTsKKworCXR4X2J1ZiA9IGt6YWxsb2MoV0NEX1NQSV9SRUFEX1NJTkdMRV9MRU4sCisJCQkgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghdHhfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZyYW1lIHw9IFdDRF9TUElfUkVBRF9GUkFNRV9PUENPREU7CisJZnJhbWUgfD0gcmVtb3RlX2FkZHIgJiBXQ0RfQ01EX0FERFJfTUFTSzsKKworCXdjZF9zcGlfcmVpbml0X3hmZXIodHhfeGZlcik7CisJZnJhbWUgPSBjcHVfdG9fYmUzMihmcmFtZSk7CisJbWVtY3B5KHR4X2J1ZiwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKTsKKwl0eF94ZmVyLT50eF9idWYgPSB0eF9idWY7CisJdHhfeGZlci0+bGVuID0gV0NEX1NQSV9SRUFEX1NJTkdMRV9MRU47CisKKwl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHJ4X3hmZXIpOworCXJ4X3hmZXItPnJ4X2J1ZiA9IHZhbDsKKwlyeF94ZmVyLT5sZW4gPSBzaXplb2YoKnZhbCk7CisKKwlyZXQgPSBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cyKTsKKwlrZnJlZSh0eF9idWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX3JlYWRfbXVsdGkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgIHUzMiByZW1vdGVfYWRkciwgdTggKmRhdGEsCisJCQkgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyID0gJndjZF9zcGktPnhmZXIxOworCXU4ICp0eF9idWY7CisJdTggKnJ4X2J1ZjsKKwl1MzIgZnJhbWUgPSAwOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgICIlczogYWRkciAweCV4LCBsZW4gPSAlemRcbiIsCisJCV9fZnVuY19fLCByZW1vdGVfYWRkciwgbGVuKTsKKworCWZyYW1lIHw9IFdDRF9TUElfRlJFQURfRlJBTUVfT1BDT0RFOworCWZyYW1lIHw9IHJlbW90ZV9hZGRyICYgV0NEX0NNRF9BRERSX01BU0s7CisKKwl0eF9idWYgPSBremFsbG9jKFdDRF9TUElfQ01EX0ZSRUFEX0xFTiArIGxlbiwKKwkJCSBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCF0eF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcnhfYnVmID0ga3phbGxvYyhXQ0RfU1BJX0NNRF9GUkVBRF9MRU4gKyBsZW4sCisJCQkgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghcnhfYnVmKSB7CisJCWtmcmVlKHR4X2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdjZF9zcGlfcmVpbml0X3hmZXIoeGZlcik7CisJZnJhbWUgPSBjcHVfdG9fYmUzMihmcmFtZSk7CisJbWVtY3B5KHR4X2J1ZiwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKTsKKwl4ZmVyLT50eF9idWYgPSB0eF9idWY7CisJeGZlci0+cnhfYnVmID0gcnhfYnVmOworCXhmZXItPmxlbiA9IFdDRF9TUElfQ01EX0ZSRUFEX0xFTiArIGxlbjsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJndjZF9zcGktPm1zZzEpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtY3B5KGRhdGEsIHJ4X2J1ZiArIFdDRF9TUElfQ01EX0ZSRUFEX0xFTiwgbGVuKTsKK2RvbmU6CisJa2ZyZWUodHhfYnVmKTsKKwlrZnJlZShyeF9idWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV93cml0ZV9zaW5nbGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQl1MzIgcmVtb3RlX2FkZHIsIHUzMiB2YWwpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIgPSAmd2NkX3NwaS0+eGZlcjE7CisJdTggYnVmW1dDRF9TUElfV1JJVEVfU0lOR0xFX0xFTl07CisJdTMyIGZyYW1lID0gMDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IHJlbW90ZV9hZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwKKwkJX19mdW5jX18sIHJlbW90ZV9hZGRyLCB2YWwpOworCisJbWVtc2V0KGJ1ZiwgMCwgV0NEX1NQSV9XUklURV9TSU5HTEVfTEVOKTsKKwlmcmFtZSB8PSBXQ0RfU1BJX1dSSVRFX0ZSQU1FX09QQ09ERTsKKwlmcmFtZSB8PSAocmVtb3RlX2FkZHIgJiBXQ0RfQ01EX0FERFJfTUFTSyk7CisKKwlmcmFtZSA9IGNwdV90b19iZTMyKGZyYW1lKTsKKwltZW1jcHkoYnVmLCAmZnJhbWUsIHNpemVvZihmcmFtZSkpOworCW1lbWNweShidWYgKyBzaXplb2YoZnJhbWUpLCAmdmFsLCBzaXplb2YodmFsKSk7CisKKwl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHhmZXIpOworCXhmZXItPnR4X2J1ZiA9IGJ1ZjsKKwl4ZmVyLT5sZW4gPSBXQ0RfU1BJX1dSSVRFX1NJTkdMRV9MRU47CisKKwlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmd2NkX3NwaS0+bXNnMSk7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV93cml0ZV9tdWx0aShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICAgIHUzMiByZW1vdGVfYWRkciwgdTggKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMTsKKwl1MzIgZnJhbWUgPSAwOworCXU4ICp0eF9idWY7CisJaW50IHhmZXJfbGVuLCByZXQ7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiBhZGRyID0gMHgleCBsZW4gPSAlemRcbiIsCisJCV9fZnVuY19fLCByZW1vdGVfYWRkciwgbGVuKTsKKworCWZyYW1lIHw9IFdDRF9TUElfV1JJVEVfRlJBTUVfT1BDT0RFOworCWZyYW1lIHw9IChyZW1vdGVfYWRkciAmIFdDRF9DTURfQUREUl9NQVNLKTsKKworCWZyYW1lID0gY3B1X3RvX2JlMzIoZnJhbWUpOworCXhmZXJfbGVuID0gbGVuICsgc2l6ZW9mKGZyYW1lKTsKKworCXR4X2J1ZiA9IGt6YWxsb2MoeGZlcl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghdHhfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSh0eF9idWYsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSk7CisJbWVtY3B5KHR4X2J1ZiArIHNpemVvZihmcmFtZSksIGRhdGEsIGxlbik7CisKKwl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHhmZXIpOworCXhmZXItPnR4X2J1ZiA9IHR4X2J1ZjsKKwl4ZmVyLT5sZW4gPSB4ZmVyX2xlbjsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJndjZF9zcGktPm1zZzEpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXM6IEZhaWxlZCwgYWRkciA9IDB4JXgsIGxlbiA9ICV6ZFxuIiwKKwkJCV9fZnVuY19fLCByZW1vdGVfYWRkciwgbGVuKTsKKwlrZnJlZSh0eF9idWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX3RyYW5zZmVyX3NwbGl0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgd2NkX3NwaV9tc2cgKmRhdGFfbXNnLAorCQkJCSAgZW51bSB4ZmVyX3JlcXVlc3QgeGZlcl9yZXEpCit7CisJdTMyIGFkZHIgPSBkYXRhX21zZy0+cmVtb3RlX2FkZHI7CisJdTggKmRhdGEgPSBkYXRhX21zZy0+ZGF0YTsKKwlpbnQgcmVtYWluX3NpemUgPSBkYXRhX21zZy0+bGVuOworCWludCB0b194ZmVyLCBsb29wX2NudCwgcmV0ID0gMDsKKworCS8qIFBlcmZvcm0gc2luZ2xlIHdyaXRlcyB1bnRpbCBtdWx0aSB3b3JkIGFsaWdubWVudCBpcyBtZXQgKi8KKwlsb29wX2NudCA9IDE7CisJd2hpbGUgKHJlbWFpbl9zaXplICYmCisJICAgICAgICFJU19BTElHTkVEKGFkZHIsIFdDRF9TUElfUldfTVVMVElfQUxJR04pKSB7CisJCWlmICh4ZmVyX3JlcSA9PSBXQ0RfU1BJX1hGRVJfV1JJVEUpCisJCQlyZXQgPSB3Y2Rfc3BpX3dyaXRlX3NpbmdsZShzcGksIGFkZHIsCisJCQkJCQkgICAoKih1MzIgKilkYXRhKSk7CisJCWVsc2UKKwkJCXJldCA9IHdjZF9zcGlfcmVhZF9zaW5nbGUoc3BpLCBhZGRyLAorCQkJCQkJICAodTMyICopZGF0YSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJIiVzOiAlcyBmYWlsIGl0ZXIoJWQpIHN0YXJ0LXdvcmQgYWRkciAoMHgleClcbiIsCisJCQkJX19mdW5jX18sIHdjZF9zcGlfeGZlcl9yZXFfc3RyKHhmZXJfcmVxKSwKKwkJCQlsb29wX2NudCwgYWRkcik7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlhZGRyICs9IFdDRF9TUElfV09SRF9CWVRFX0NOVDsKKwkJZGF0YSArPSBXQ0RfU1BJX1dPUkRfQllURV9DTlQ7CisJCXJlbWFpbl9zaXplIC09IFdDRF9TUElfV09SRF9CWVRFX0NOVDsKKwkJbG9vcF9jbnQrKzsKKwl9CisKKwkvKiBQZXJmb3JtIG11bHRpIHdyaXRlcyBmb3IgbWF4IGFsbG93ZWQgbXVsdGkgd3JpdGVzICovCisJbG9vcF9jbnQgPSAxOworCXdoaWxlIChyZW1haW5fc2l6ZSA+PSBXQ0RfU1BJX1JXX01VTFRJX01BWF9MRU4pIHsKKwkJaWYgKHhmZXJfcmVxID09IFdDRF9TUElfWEZFUl9XUklURSkKKwkJCXJldCA9IHdjZF9zcGlfd3JpdGVfbXVsdGkoc3BpLCBhZGRyLCBkYXRhLAorCQkJCQkJICBXQ0RfU1BJX1JXX01VTFRJX01BWF9MRU4pOworCQllbHNlCisJCQlyZXQgPSB3Y2Rfc3BpX3JlYWRfbXVsdGkoc3BpLCBhZGRyLCBkYXRhLAorCQkJCQkJIFdDRF9TUElfUldfTVVMVElfTUFYX0xFTik7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkJIiVzOiAlcyBmYWlsIGl0ZXIoJWQpIG1heC13cml0ZSBhZGRyICgweCV4KVxuIiwKKwkJCQlfX2Z1bmNfXywgd2NkX3NwaV94ZmVyX3JlcV9zdHIoeGZlcl9yZXEpLAorCQkJCWxvb3BfY250LCBhZGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWFkZHIgKz0gV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOOworCQlkYXRhICs9IFdDRF9TUElfUldfTVVMVElfTUFYX0xFTjsKKwkJcmVtYWluX3NpemUgLT0gV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOOworCQlsb29wX2NudCsrOworCX0KKworCS8qCisJICogUGVyZm9ybSB3cml0ZSBmb3IgbWF4IHBvc3NpYmxlIGRhdGEgdGhhdCBpcyBtdWx0aXBsZQorCSAqIG9mIHRoZSBtaW5pbXVtIHNpemUgZm9yIG11bHRpLXdyaXRlIGNvbW1hbmRzLgorCSAqLworCXRvX3hmZXIgPSByZW1haW5fc2l6ZSAtIChyZW1haW5fc2l6ZSAlIFdDRF9TUElfUldfTVVMVElfTUlOX0xFTik7CisJaWYgKHJlbWFpbl9zaXplID49IFdDRF9TUElfUldfTVVMVElfTUlOX0xFTiAmJgorCSAgICB0b194ZmVyID4gMCkgeworCQlpZiAoeGZlcl9yZXEgPT0gV0NEX1NQSV9YRkVSX1dSSVRFKQorCQkJcmV0ID0gd2NkX3NwaV93cml0ZV9tdWx0aShzcGksIGFkZHIsIGRhdGEsIHRvX3hmZXIpOworCQllbHNlCisJCQlyZXQgPSB3Y2Rfc3BpX3JlYWRfbXVsdGkoc3BpLCBhZGRyLCBkYXRhLCB0b194ZmVyKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkiJXM6ICVzIGZhaWwgd3JpdGUgYWRkciAoMHgleCksIHNpemUgKDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCB3Y2Rfc3BpX3hmZXJfcmVxX3N0cih4ZmVyX3JlcSksCisJCQkJYWRkciwgdG9feGZlcik7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlhZGRyICs9IHRvX3hmZXI7CisJCWRhdGEgKz0gdG9feGZlcjsKKwkJcmVtYWluX3NpemUgLT0gdG9feGZlcjsKKwl9CisKKwkvKiBQZXJmb3JtIHNpbmdsZSB3cml0ZXMgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhICovCisJbG9vcF9jbnQgPSAxOworCXdoaWxlIChyZW1haW5fc2l6ZSA+IDApIHsKKwkJaWYgKHhmZXJfcmVxID09IFdDRF9TUElfWEZFUl9XUklURSkKKwkJCXJldCA9IHdjZF9zcGlfd3JpdGVfc2luZ2xlKHNwaSwgYWRkciwgKCooKHUzMiAqKWRhdGEpKSk7CisJCWVsc2UKKwkJCXJldCA9IHdjZF9zcGlfcmVhZF9zaW5nbGUoc3BpLCBhZGRyLCAgKHUzMiAqKSBkYXRhKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkiJXM6ICVzIGZhaWwgaXRlciglZCkgZW5kLXdyaXRlIGFkZHIgKDB4JXgpXG4iLAorCQkJCV9fZnVuY19fLCB3Y2Rfc3BpX3hmZXJfcmVxX3N0cih4ZmVyX3JlcSksCisJCQkJbG9vcF9jbnQsIGFkZHIpOworCQkJZ290byBkb25lOworCQl9CisKKwkJYWRkciArPSBXQ0RfU1BJX1dPUkRfQllURV9DTlQ7CisJCWRhdGEgKz0gV0NEX1NQSV9XT1JEX0JZVEVfQ05UOworCQlyZW1haW5fc2l6ZSAtPSBXQ0RfU1BJX1dPUkRfQllURV9DTlQ7CisJCWxvb3BfY250Kys7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV9jbWRfbm9wKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdTggbm9wID0gV0NEX1NQSV9DTURfTk9QOworCisJcmV0dXJuIHNwaV93cml0ZShzcGksICZub3AsIFdDRF9TUElfQ01EX05PUF9MRU4pOworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfY21kX2Nsa3JlcShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyID0gJndjZF9zcGktPnhmZXIxOworCXU4IGNtZFtXQ0RfU1BJX0NNRF9DTEtSRVFfTEVOXSA9IHsKKwkJV0NEX1NQSV9DTURfQ0xLUkVRLAorCQkweEJBLCAweDgwLCAweDAwfTsKKworCXdjZF9zcGlfcmVpbml0X3hmZXIoeGZlcik7CisJeGZlci0+dHhfYnVmID0gY21kOworCXhmZXItPmxlbiA9IFdDRF9TUElfQ01EX0NMS1JFUV9MRU47CisJeGZlci0+ZGVsYXlfdXNlY3MgPSBXQ0RfU1BJX0NMS1JFUV9ERUxBWV9VU0VDUzsKKworCXJldHVybiBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cxKTsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX2NtZF93cl9lbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXU4IHdyX2VuID0gV0NEX1NQSV9DTURfV1JFTjsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCAmd3JfZW4sIFdDRF9TUElfQ01EX1dSRU5fTEVOKTsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX2NtZF9yZHNyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgdTMyICpyZHNyX3N0YXR1cykKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdHhfeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMlswXTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpyeF94ZmVyID0gJndjZF9zcGktPnhmZXIyWzFdOworCXU4IHJkc3JfY21kOworCXUzMiBzdGF0dXM7CisJaW50IHJldDsKKworCXJkc3JfY21kID0gV0NEX1NQSV9DTURfUkRTUjsKKwl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHR4X3hmZXIpOworCXR4X3hmZXItPnR4X2J1ZiA9ICZyZHNyX2NtZDsKKwl0eF94ZmVyLT5sZW4gPSBzaXplb2YocmRzcl9jbWQpOworCisKKwl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHJ4X3hmZXIpOworCXJ4X3hmZXItPnJ4X2J1ZiA9ICZzdGF0dXM7CisJcnhfeGZlci0+bGVuID0gc2l6ZW9mKHN0YXR1cyk7CisKKwlyZXQgPSBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cyKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogUkRTUiBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkqcmRzcl9zdGF0dXMgPSBiZTMyX3RvX2NwdShzdGF0dXMpOworCisJZGV2X2RiZygmc3BpLT5kZXYsICIlczogUkRTUiBzdWNjZXNzLCB2YWx1ZSA9IDB4JXhcbiIsCisJCSBfX2Z1bmNfXywgKnJkc3Jfc3RhdHVzKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX2Nsa19lbmFibGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJaW50IHJldDsKKwl1MzIgcmRfc3RhdHVzOworCisJcmV0ID0gd2NkX3NwaV9jbWRfbm9wKHNwaSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IE5PUDEgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2NkX3NwaV9jbWRfY2xrcmVxKHNwaSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IENMS19SRVEgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2NkX3NwaV9jbWRfbm9wKHNwaSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IE5PUDIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCXdjZF9zcGlfY21kX3Jkc3Ioc3BpLCAmcmRfc3RhdHVzKTsKKwkvKgorCSAqIFJlYWQgc3RhdHVzIHplcm8gbWVhbnMgcmVhZHMgYXJlIG5vdAorCSAqIGhhcHBlbm5pbmcgb24gdGhlIGJ1cywgcG9zc2libHkgYmVjYXVzZQorCSAqIGNsb2NrIHJlcXVlc3QgZmFpbGVkLgorCSAqLworCWlmIChyZF9zdGF0dXMpIHsKKwkJc2V0X2JpdChXQ0RfU1BJX0NMS19TVEFURV9FTkFCTEVELAorCQkJJndjZF9zcGktPnN0YXR1c19tYXNrKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBSRFNSIHN0YXR1cyBpcyB6ZXJvXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlPOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2Rfc3BpX2Nsa19kaXNhYmxlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCWludCByZXQ7CisKKwlyZXQgPSB3Y2Rfc3BpX3dyaXRlX3NpbmdsZShzcGksIFdDRF9TUElfQUREUl9JUENfQ1RMX0hPU1QsIDB4MDEpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogRmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCWVsc2UKKwkJY2xlYXJfYml0KFdDRF9TUElfQ0xLX1NUQVRFX0VOQUJMRUQsICZ3Y2Rfc3BpLT5zdGF0dXNfbWFzayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfY2xrX2N0cmwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICBib29sIHJlcXVlc3QsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJaW50IHJldCA9IDA7CisJY29uc3QgY2hhciAqZGVsYXlfc3RyOworCisJZGVsYXlfc3RyID0gKGZsYWdzID09IFdDRF9TUElfQ0xLX0ZMQUdfREVMQVlFRCkgPworCQkgICAgImRlbGF5ZWQiIDogImltbWVkaWF0ZSI7CisKKwlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOworCisJLyogUmVqZWN0IGFueSB1bmJhbGFuY2VkIGRpc2FibGUgcmVxdWVzdCAqLworCWlmICh3Y2Rfc3BpLT5jbGtfdXNlcnMgPCAwIHx8CisJICAgICghcmVxdWVzdCAmJiB3Y2Rfc3BpLT5jbGtfdXNlcnMgPT0gMCkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5iYWxhbmNlZCBjbGtfdXNlcnMgJWQgZm9yICVzXG4iLAorCQkJIF9fZnVuY19fLCB3Y2Rfc3BpLT5jbGtfdXNlcnMsCisJCQlyZXF1ZXN0ID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCQlyZXQgPSAtRUlOVkFMOworCisJCS8qIFJlc2V0IHRoZSBjbGtfdXNlcnMgdG8gMCAqLworCQl3Y2Rfc3BpLT5jbGtfdXNlcnMgPSAwOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAocmVxdWVzdCA9PSBXQ0RfU1BJX0NMS19FTkFCTEUpIHsKKwkJLyogQ2FuY2VsIHRoZSBkaXNhYmxlIGNsayB3b3JrICovCisJCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3Y2Rfc3BpLT5jbGtfZHdvcmspOworCQlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOworCisJCXdjZF9zcGktPmNsa191c2VycysrOworCisJCS8qCisJCSAqIElmIGNsayBzdGF0ZSBpcyBhbHJlYWR5IHNldCwKKwkJICogdGhlbiBjbGsgd2FzbnQgcmVhbGx5IGRpc2FibGVkCisJCSAqLworCQlpZiAodGVzdF9iaXQoV0NEX1NQSV9DTEtfU1RBVEVfRU5BQkxFRCwgJndjZF9zcGktPnN0YXR1c19tYXNrKSkKKwkJCWdvdG8gZG9uZTsKKwkJZWxzZSBpZiAod2NkX3NwaS0+Y2xrX3VzZXJzID09IDEpCisJCQlyZXQgPSB3Y2Rfc3BpX2Nsa19lbmFibGUoc3BpKTsKKworCX0gZWxzZSB7CisJCXdjZF9zcGktPmNsa191c2Vycy0tOworCisJCS8qIENsb2NrIGlzIHN0aWxsIHZvdGVkIGZvciAqLworCQlpZiAod2NkX3NwaS0+Y2xrX3VzZXJzID4gMCkKKwkJCWdvdG8gZG9uZTsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmUgaGVyZSwgY2xrX3VzZXJzIG11c3QgYmUgMCBhbmQgbmVlZHMKKwkJICogdG8gYmUgZGlzYWJsZWQuIENhbGwgdGhlIGRpc2FibGUgYmFzZWQgb24gdGhlCisJCSAqIGZsYWdzLgorCQkgKi8KKwkJaWYgKGZsYWdzID09IFdDRF9TUElfQ0xLX0ZMQUdfREVMQVlFRCkgeworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3Y2Rfc3BpLT5jbGtfZHdvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhXQ0RfU1BJX0NMS19PRkZfVElNRVJfTVMpKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHdjZF9zcGlfY2xrX2Rpc2FibGUoc3BpKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkJIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBjbGsgZXJyID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQl9CisJfQorCitkb25lOgorCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IHVwZGF0ZWQgY2xrX3VzZXJzID0gJWQsIHJlcXVlc3RfJXMgJXNcbiIsCisJCV9fZnVuY19fLCB3Y2Rfc3BpLT5jbGtfdXNlcnMsIHJlcXVlc3QgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwKKwkJcmVxdWVzdCA/ICIiIDogZGVsYXlfc3RyKTsKKwlXQ0RfU1BJX01VVEVYX1VOTE9DSyhzcGksIHdjZF9zcGktPmNsa19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfaW5pdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgcmV0OworCisJcmV0ID0gd2NkX3NwaV9jbGtfY3RybChzcGksIFdDRF9TUElfQ0xLX0VOQUJMRSwKKwkJCSAgICAgICBXQ0RfU1BJX0NMS19GTEFHX0lNTUVESUFURSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSB3Y2Rfc3BpX2NtZF93cl9lbihzcGkpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZ290byBlcnJfd3JfZW47CisKKwkvKgorCSAqIEluIGNhc2Ugc3BpX2luaXQgaXMgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBkZWluaXQsCisJICogaXQgaXMgcG9zc2libGUgaGFyZHdhcmUgcmVnaXN0ZXIgc3RhdGUgaXMgYWxzbyByZXNldC4KKwkgKiBTeW5jIHRoZSByZWdjYWNoZSBoZXJlIHNvIGhhcmR3YXJlIHN0YXRlIGlzIHVwZGF0ZWQKKwkgKiB0byByZWZsZWN0IHRoZSBjYWNoZS4KKwkgKi8KKwlyZWdjYWNoZV9zeW5jKHdjZF9zcGktPnJlZ21hcCk7CisKKwlyZWdtYXBfd3JpdGUod2NkX3NwaS0+cmVnbWFwLCBXQ0RfU1BJX1NMQVZFX0NPTkZJRywKKwkJICAgICAweDBGM0QwODAwKTsKKworCS8qIFdyaXRlIHRoZSBNVFUgdG8gbWF4IGFsbG93ZWQgc2l6ZSAqLworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Rfc3BpLT5yZWdtYXAsCisJCQkgICBXQ0RfU1BJX1NMQVZFX1RSTlNfTEVOLAorCQkJICAgMHhGRkZGMDAwMCwgMHhGRkZGMDAwMCk7CitlcnJfd3JfZW46CisJd2NkX3NwaV9jbGtfY3RybChzcGksIFdDRF9TUElfQ0xLX0RJU0FCTEUsCisJCQkgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3Y2Rfc3BpX2Nsa193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJaW50IHJldDsKKworCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXdjZF9zcGkgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2Rfc3BpX3ByaXYsIGNsa19kd29yayk7CisJc3BpID0gd2NkX3NwaS0+c3BpOworCisJV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKKwlyZXQgPSB3Y2Rfc3BpX2Nsa19kaXNhYmxlKHNwaSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGRpc2FibGUgY2xrLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKK30KKworc3RhdGljIGludCBfX3djZF9zcGlfZGF0YV94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgICAgc3RydWN0IHdjZF9zcGlfbXNnICptc2csCisJCQkgICAgICAgZW51bSB4ZmVyX3JlcXVlc3QgeGZlcl9yZXEpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCWludCByZXQ7CisKKwkvKiBDaGVjayBmb3IgbWluaW11bSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisJaWYgKCFJU19BTElHTkVEKG1zZy0+cmVtb3RlX2FkZHIsIFdDRF9TUElfUldfTUlOX0FMSUdOKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCSIlcyBhZGRyIDB4JXggaXMgbm90IGFsaWduZWQgdG8gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBtc2ctPnJlbW90ZV9hZGRyLCBXQ0RfU1BJX1JXX01JTl9BTElHTik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAobXNnLT5sZW4gJSBXQ0RfU1BJX1dPUkRfQllURV9DTlQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXMgbGVuIDB4JXp4IGlzIG5vdCBtdWx0aXBsZSBvZiAlZFxuIiwKKwkJCV9fZnVuY19fLCBtc2ctPmxlbiwgV0NEX1NQSV9XT1JEX0JZVEVfQ05UKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+eGZlcl9tdXRleCk7CisJaWYgKG1zZy0+bGVuID09IFdDRF9TUElfV09SRF9CWVRFX0NOVCkgeworCQlpZiAoeGZlcl9yZXEgPT0gV0NEX1NQSV9YRkVSX1dSSVRFKQorCQkJcmV0ID0gd2NkX3NwaV93cml0ZV9zaW5nbGUoc3BpLCBtc2ctPnJlbW90ZV9hZGRyLAorCQkJCQkJICAgKCooKHUzMiAqKW1zZy0+ZGF0YSkpKTsKKwkJZWxzZQorCQkJcmV0ID0gd2NkX3NwaV9yZWFkX3NpbmdsZShzcGksIG1zZy0+cmVtb3RlX2FkZHIsCisJCQkJCQkgICh1MzIgKikgbXNnLT5kYXRhKTsKKwl9IGVsc2UgeworCQlyZXQgPSB3Y2Rfc3BpX3RyYW5zZmVyX3NwbGl0KHNwaSwgbXNnLCB4ZmVyX3JlcSk7CisJfQorCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+eGZlcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfZGF0YV94ZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgIHN0cnVjdCB3Y2Rfc3BpX21zZyAqbXNnLAorCQkJICAgICBlbnVtIHhmZXJfcmVxdWVzdCByZXEpCit7CisJaW50IHJldCwgcmV0MTsKKworCWlmIChtc2ctPmxlbiA8PSAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEludmFsaWQgc2l6ZSAlemRcbiIsCisJCQlfX2Z1bmNfXywgbXNnLT5sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZXF1ZXN0IGZvciBjbG9jayAqLworCXJldCA9IHdjZF9zcGlfY2xrX2N0cmwoc3BpLCBXQ0RfU1BJX0NMS19FTkFCTEUsCisJCQkgICAgICAgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjbGsgZW5hYmxlIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogUGVyZm9ybSB0aGUgdHJhbnNhY3Rpb24gKi8KKwlyZXQgPSBfX3djZF9zcGlfZGF0YV94ZmVyKHNwaSwgbXNnLCByZXEpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXM6IEZhaWxlZCAlcywgYWRkciA9IDB4JXgsIHNpemUgPSAweCV6eCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgd2NkX3NwaV94ZmVyX3JlcV9zdHIocmVxKSwKKwkJCW1zZy0+cmVtb3RlX2FkZHIsIG1zZy0+bGVuLCByZXQpOworCisJLyogUmVsZWFzZSB0aGUgY2xvY2sgZXZlbiBpZiB4ZmVyIGZhaWxlZCAqLworCXJldDEgPSB3Y2Rfc3BpX2Nsa19jdHJsKHNwaSwgV0NEX1NQSV9DTEtfRElTQUJMRSwKKwkJCQlXQ0RfU1BJX0NMS19GTEFHX0RFTEFZRUQpOworCWlmIChJU19FUlJfVkFMVUUocmV0MSkpCisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGNsayBkaXNhYmxlIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQxKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9zcGlfZGF0YV93cml0ZTogV3JpdGUgZGF0YSB0byBXQ0QgU1BJCisgKiBAc3BpOiBzcGlfZGV2aWNlIHN0cnVjdAorICogQG1zZzogbXNnIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byBXQ0QKKyAqCisgKiBUaGlzIEFQSSB3cml0ZXMgbGVuZ3RoIG9mIGRhdGEgdG8gYWRkcmVzcyBzcGVjaWZpZWQuIFRoZXNlIGRldGFpbHMKKyAqIGFib3V0IHRoZSB3cml0ZSBhcmUgZW5jYXBzdWxhdGVkIGluIEBtc2cuIFdyaXRlIHNpemUgc2hvdWxkIGJlIG11bHRpcGxlCisgKiBvZiA0IGJ5dGVzIGFuZCB3cml0ZSBhZGRyZXNzIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqLworaW50IHdjZF9zcGlfZGF0YV93cml0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkgICAgICAgc3RydWN0IHdjZF9zcGlfbXNnICptc2cpCit7CisJaWYgKCFzcGkgfHwgIW1zZykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKKwkJCSghc3BpKSA/ICJzcGkgZGV2aWNlIiA6ICJtc2ciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZ19yYXRlbGltaXRlZCgmc3BpLT5kZXYsICIlczogYWRkciA9IDB4JXgsIGxlbiA9ICV6dVxuIiwKKwkJCSAgICBfX2Z1bmNfXywgbXNnLT5yZW1vdGVfYWRkciwgbXNnLT5sZW4pOworCXJldHVybiB3Y2Rfc3BpX2RhdGFfeGZlcihzcGksIG1zZywgV0NEX1NQSV9YRkVSX1dSSVRFKTsKK30KK0VYUE9SVF9TWU1CT0wod2NkX3NwaV9kYXRhX3dyaXRlKTsKKworLyoKKyAqIHdjZF9zcGlfZGF0YV9yZWFkOiBSZWFkIGRhdGEgZnJvbSBXQ0QgU1BJCisgKiBAc3BpOiBzcGlfZGV2aWNlIHN0cnVjdAorICogQG1zZzogbXNnIHRoYXQgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIFdDRAorICoKKyAqIFRoaXMgQVBJIHJlYWRzIGxlbmd0aCBvZiBkYXRhIGZyb20gYWRkcmVzcyBzcGVjaWZpZWQuIFRoZXNlIGRldGFpbHMKKyAqIGFib3V0IHRoZSByZWFkIGFyZSBlbmNhcHN1bGF0ZWQgaW4gQG1zZy4gUmVhZCBzaXplIHNob3VsZCBiZSBtdWx0aXBsZQorICogb2YgNCBieXRlcyBhbmQgcmVhZCBhZGRyZXNzIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqLworaW50IHdjZF9zcGlfZGF0YV9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCSAgICAgIHN0cnVjdCB3Y2Rfc3BpX21zZyAqbXNnKQoreworCWlmICghc3BpIHx8ICFtc2cpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCQkoIXNwaSkgPyAic3BpIGRldmljZSIgOiAibXNnIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmdfcmF0ZWxpbWl0ZWQoJnNwaS0+ZGV2LCAiJXM6IGFkZHIgPSAweCV4LGxlbiA9ICV6dVxuIiwKKwkJCSAgICBfX2Z1bmNfXywgbXNnLT5yZW1vdGVfYWRkciwgbXNnLT5sZW4pOworCXJldHVybiB3Y2Rfc3BpX2RhdGFfeGZlcihzcGksIG1zZywgV0NEX1NQSV9YRkVSX1JFQUQpOworfQorRVhQT1JUX1NZTUJPTCh3Y2Rfc3BpX2RhdGFfcmVhZCk7CisKK3N0YXRpYyBpbnQgd2RzcF9zcGlfZGxvYWRfc2VjdGlvbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IHdkc3BfaW1nX3NlY3Rpb24gKnNlYyA9IGRhdGE7CisJc3RydWN0IHdjZF9zcGlfbXNnIG1zZzsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmc3BpLT5kZXYsICIlczogYWRkciA9IDB4JXgsIHNpemUgPSAweCV6eFxuIiwKKwkJX19mdW5jX18sIHNlYy0+YWRkciwgc2VjLT5zaXplKTsKKworCW1zZy5yZW1vdGVfYWRkciA9IHNlYy0+YWRkciArIHdjZF9zcGktPm1lbV9iYXNlX2FkZHI7CisJbXNnLmRhdGEgPSBzZWMtPmRhdGE7CisJbXNnLmxlbiA9IHNlYy0+c2l6ZTsKKworCXJldCA9IF9fd2NkX3NwaV9kYXRhX3hmZXIoc3BpLCAmbXNnLCBXQ0RfU1BJX1hGRVJfV1JJVEUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogZmFpbCBhZGRyICgweCV4KSBzaXplICgweCV6eClcbiIsCisJCQlfX2Z1bmNfXywgbXNnLnJlbW90ZV9hZGRyLCBtc2cubGVuKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkc3Bfc3BpX3JlYWRfc2VjdGlvbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3Qgd2RzcF9pbWdfc2VjdGlvbiAqc2VjID0gZGF0YTsKKwlzdHJ1Y3Qgd2NkX3NwaV9tc2cgbXNnOworCWludCByZXQ7CisKKwltc2cucmVtb3RlX2FkZHIgPSBzZWMtPmFkZHIgKyB3Y2Rfc3BpLT5tZW1fYmFzZV9hZGRyOworCW1zZy5kYXRhID0gc2VjLT5kYXRhOworCW1zZy5sZW4gPSBzZWMtPnNpemU7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiBhZGRyID0gMHgleCwgc2l6ZSA9IDB4JXp4XG4iLAorCQlfX2Z1bmNfXywgbXNnLnJlbW90ZV9hZGRyLCBtc2cubGVuKTsKKworCXJldCA9IHdjZF9zcGlfZGF0YV94ZmVyKHNwaSwgJm1zZywgV0NEX1NQSV9YRkVSX1JFQUQpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogZmFpbCBhZGRyICgweCV4KSBzaXplICgweCV6eClcbiIsCisJCQlfX2Z1bmNfXywgbXNnLnJlbW90ZV9hZGRyLCBtc2cubGVuKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdkc3Bfc3BpX2V2ZW50X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEsCisJCQkJICBlbnVtIHdkc3BfZXZlbnRfdHlwZSBldmVudCwKKwkJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IGV2ZW50IHR5cGUgJWRcbiIsCisJCV9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBXRFNQX0VWRU5UX1BSRV9ETE9BRF9DT0RFOgorCWNhc2UgV0RTUF9FVkVOVF9QUkVfRExPQURfREFUQToKKwkJcmV0ID0gd2NkX3NwaV9jbGtfY3RybChzcGksIFdDRF9TUElfQ0xLX0VOQUJMRSwKKwkJCQkgICAgICAgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjbGtfcmVxIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisKKwljYXNlIFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9DT0RFOgorCWNhc2UgV0RTUF9FVkVOVF9QT1NUX0RMT0FEX0RBVEE6CisJY2FzZSBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRDoKKworCQlyZXQgPSB3Y2Rfc3BpX2Nsa19jdHJsKHNwaSwgV0NEX1NQSV9DTEtfRElTQUJMRSwKKwkJCQkgICAgICAgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjbGsgdW52b3RlIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisKKwljYXNlIFdEU1BfRVZFTlRfRExPQURfU0VDVElPTjoKKwkJcmV0ID0gd2RzcF9zcGlfZGxvYWRfc2VjdGlvbihzcGksIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgV0RTUF9FVkVOVF9SRUFEX1NFQ1RJT046CisJCXJldCA9IHdkc3Bfc3BpX3JlYWRfc2VjdGlvbihzcGksIGRhdGEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IFVuaGFuZGxlZCBldmVudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBldmVudCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV9idXNfZ3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnJlZywKKwkJCSAgICAgIHNpemVfdCByZWdfbGVuLCBjb25zdCB2b2lkICp2YWwsCisJCQkgICAgICBzaXplX3QgdmFsX2xlbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXU4IHR4X2J1ZltXQ0RfU1BJX0NNRF9JUldfTEVOXTsKKworCWlmICghcmVnIHx8ICF2YWwgfHwgcmVnX2xlbiAhPSB3Y2Rfc3BpLT5yZWdfYnl0ZXMgfHwKKwkgICAgdmFsX2xlbiAhPSB3Y2Rfc3BpLT52YWxfYnl0ZXMpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXM6IEludmFsaWQgaW5wdXQsIHJlZ19sZW4gPSAlemQsIHZhbF9sZW4gPSAlemQiLAorCQkJX19mdW5jX18sIHJlZ19sZW4sIHZhbF9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0eF9idWZbMF0gPSBXQ0RfU1BJX0NNRF9JUlc7CisJdHhfYnVmWzFdID0gKigodTggKilyZWcpOworCW1lbWNweSgmdHhfYnVmW1dDRF9TUElfT1BDT0RFX0xFTiArIHJlZ19sZW5dLAorCSAgICAgICB2YWwsIHZhbF9sZW4pOworCisJcmV0dXJuIHNwaV93cml0ZShzcGksIHR4X2J1ZiwgV0NEX1NQSV9DTURfSVJXX0xFTik7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3NwaV9idXNfd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpZiAoY291bnQgPCAod2NkX3NwaS0+cmVnX2J5dGVzICsgd2NkX3NwaS0+dmFsX2J5dGVzKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBJbnZhbGlkIHNpemUgJXpkXG4iLAorCQkJX19mdW5jX18sIGNvdW50KTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHdjZF9zcGlfYnVzX2d3cml0ZShjb250ZXh0LCBkYXRhLCB3Y2Rfc3BpLT5yZWdfYnl0ZXMsCisJCQkJICBkYXRhICsgd2NkX3NwaS0+cmVnX2J5dGVzLAorCQkJCSAgY291bnQgLSB3Y2Rfc3BpLT5yZWdfYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfYnVzX3JlYWQodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcmVnLAorCQkJICAgIHNpemVfdCByZWdfbGVuLCB2b2lkICp2YWwsCisJCQkgICAgc2l6ZV90IHZhbF9sZW4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0eF94ZmVyID0gJndjZF9zcGktPnhmZXIyWzBdOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnJ4X3hmZXIgPSAmd2NkX3NwaS0+eGZlcjJbMV07CisJdTggdHhfYnVmW1dDRF9TUElfQ01EX0lSUl9MRU5dOworCisJaWYgKCFyZWcgfHwgIXZhbCB8fCByZWdfbGVuICE9IHdjZF9zcGktPnJlZ19ieXRlcyB8fAorCSAgICB2YWxfbGVuICE9IHdjZF9zcGktPnZhbF9ieXRlcykgeworCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCSIlczogSW52YWxpZCBpbnB1dCwgcmVnX2xlbiA9ICV6ZCwgdmFsX2xlbiA9ICV6ZCIsCisJCQlfX2Z1bmNfXywgcmVnX2xlbiwgdmFsX2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldCh0eF9idWYsIDAsIFdDRF9TUElfT1BDT0RFX0xFTik7CisJdHhfYnVmWzBdID0gV0NEX1NQSV9DTURfSVJSOworCXR4X2J1ZlsxXSA9ICooKHU4ICopcmVnKTsKKworCXdjZF9zcGlfcmVpbml0X3hmZXIodHhfeGZlcik7CisJdHhfeGZlci0+dHhfYnVmID0gdHhfYnVmOworCXR4X3hmZXItPnJ4X2J1ZiA9IE5VTEw7CisJdHhfeGZlci0+bGVuID0gV0NEX1NQSV9DTURfSVJSX0xFTjsKKworCXdjZF9zcGlfcmVpbml0X3hmZXIocnhfeGZlcik7CisJcnhfeGZlci0+dHhfYnVmID0gTlVMTDsKKwlyeF94ZmVyLT5yeF9idWYgPSB2YWw7CisJcnhfeGZlci0+bGVuID0gdmFsX2xlbjsKKworCXJldHVybiBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cyKTsKK30KKworc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHdjZF9zcGlfcmVnbWFwX2J1cyA9IHsKKwkud3JpdGUgPSB3Y2Rfc3BpX2J1c193cml0ZSwKKwkuZ2F0aGVyX3dyaXRlID0gd2NkX3NwaV9idXNfZ3dyaXRlLAorCS5yZWFkID0gd2NkX3NwaV9idXNfcmVhZCwKKwkucmVnX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdCA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbl9kZWZhdWx0ID0gUkVHTUFQX0VORElBTl9CSUcsCit9OworCitzdGF0aWMgaW50IHdjZF9zcGlfc3RhdGVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gZi0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJY29uc3QgY2hhciAqY2xrX3N0YXRlLCAqY2xrX211dGV4LCAqeGZlcl9tdXRleDsKKworCWlmICh0ZXN0X2JpdChXQ0RfU1BJX0NMS19TVEFURV9FTkFCTEVELCAmd2NkX3NwaS0+c3RhdHVzX21hc2spKQorCQljbGtfc3RhdGUgPSAiZW5hYmxlZCI7CisJZWxzZQorCQljbGtfc3RhdGUgPSAiZGlzYWJsZWQiOworCisJY2xrX211dGV4ID0gbXV0ZXhfaXNfbG9ja2VkKCZ3Y2Rfc3BpLT5jbGtfbXV0ZXgpID8KKwkJICAgICJsb2NrZWQiIDogInVubG9ja2VkIjsKKworCXhmZXJfbXV0ZXggPSBtdXRleF9pc19sb2NrZWQoJndjZF9zcGktPnhmZXJfbXV0ZXgpID8KKwkJICAgICAibG9ja2VkIiA6ICJ1bmxvY2tlZCI7CisKKwlzZXFfcHJpbnRmKGYsICJjbGtfc3RhdGUgPSAlc1xuY2xrX3VzZXJzID0gJWRcbiIKKwkJICAgImNsa19tdXRleCA9ICVzXG54ZmVyX211dGV4ID0gJXNcbiIsCisJCSAgIGNsa19zdGF0ZSwgd2NkX3NwaS0+Y2xrX3VzZXJzLCBjbGtfbXV0ZXgsCisJCSAgIHhmZXJfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfc3RhdGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgd2NkX3NwaV9zdGF0ZV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RhdGVfZm9wcyA9IHsKKwkub3BlbiA9IHdjZF9zcGlfc3RhdGVfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHdjZF9zcGlfZGVidWdmc19tZW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCB3Y2Rfc3BpX2RlYnVnX2RhdGEgKmRiZ19kYXRhID0gJndjZF9zcGktPmRlYnVnX2RhdGE7CisJc3RydWN0IHdjZF9zcGlfbXNnIG1zZzsKKwlzc2l6ZV90IGJ1Zl9zaXplLCByZWFkX2NvdW50ID0gMDsKKwljaGFyICpidWY7CisJaW50IHJldDsKKworCWlmICgqcHBvcyA8IDAgfHwgIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYmdfZGF0YS0+c2l6ZSA9PSAwIHx8IGRiZ19kYXRhLT5hZGRyID09IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcmVxdWVzdCwgc2l6ZSA9ICV1LCBhZGRyID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBkYmdfZGF0YS0+c2l6ZSwgZGJnX2RhdGEtPmFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWZfc2l6ZSA9IGNvdW50IDwgZGJnX2RhdGEtPnNpemUgPyBjb3VudCA6IGRiZ19kYXRhLT5zaXplOworCWJ1ZiA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zZy5kYXRhID0gYnVmOworCW1zZy5yZW1vdGVfYWRkciA9IGRiZ19kYXRhLT5hZGRyOworCW1zZy5sZW4gPSBidWZfc2l6ZTsKKwltc2cuZmxhZ3MgPSAwOworCisJcmV0ID0gd2NkX3NwaV9kYXRhX3JlYWQoc3BpLCAmbXNnKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byByZWFkICV6dSBieXRlcyBmcm9tIGFkZHIgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBidWZfc2l6ZSwgbXNnLnJlbW90ZV9hZGRyKTsKKwkJZ290byBkb25lOworCX0KKworCXJlYWRfY291bnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgYnVmLCBidWZfc2l6ZSk7CisKK2RvbmU6CisJa2ZyZWUoYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiByZWFkX2NvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZW1fcmVhZF9mb3BzID0geworCS5vcGVuID0gc2ltcGxlX29wZW4sCisJLnJlYWQgPSB3Y2Rfc3BpX2RlYnVnZnNfbWVtX3JlYWQsCit9OworCitzdGF0aWMgaW50IHdjZF9zcGlfZGVidWdmc19pbml0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCB3Y2Rfc3BpX2RlYnVnX2RhdGEgKmRiZ19kYXRhID0gJndjZF9zcGktPmRlYnVnX2RhdGE7CisJaW50IHJjID0gMDsKKworCWRiZ19kYXRhLT5kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIndjZF9zcGkiLCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGJnX2RhdGEtPmRpcikpIHsKKwkJZGJnX2RhdGEtPmRpciA9IE5VTEw7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRlIiwgMDQ0NCwgZGJnX2RhdGEtPmRpciwgc3BpLCAmc3RhdGVfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJhZGRyIiwgMDY0NCwgZGJnX2RhdGEtPmRpciwKKwkJCSAgICZkYmdfZGF0YS0+YWRkcik7CisJZGVidWdmc19jcmVhdGVfdTMyKCJzaXplIiwgMDY0NCwgZGJnX2RhdGEtPmRpciwKKwkJCSAgICZkYmdfZGF0YS0+c2l6ZSk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtZW1fcmVhZCIsIDA0NDQsIGRiZ19kYXRhLT5kaXIsCisJCQkgICAgc3BpLCAmbWVtX3JlYWRfZm9wcyk7Citkb25lOgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IHdjZF9zcGlfZGVmYXVsdHNbXSA9IHsKKwl7V0NEX1NQSV9TTEFWRV9TQU5JVFksIDB4REVBREJFRUZ9LAorCXtXQ0RfU1BJX1NMQVZFX0RFVklDRV9JRCwgMHgwMDUwMDAwMH0sCisJe1dDRF9TUElfU0xBVkVfU1RBVFVTLCAweDgwMTAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9DT05GSUcsIDB4MEYyMDA4MDh9LAorCXtXQ0RfU1BJX1NMQVZFX1NXX1JFU0VULCAweDAwMDAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9JUlFfU1RBVFVTLCAweDAwMDAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9JUlFfRU4sIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX0lSUV9DTFIsIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX0lSUV9GT1JDRSwgMHgwMDAwMDAwMH0sCisJe1dDRF9TUElfU0xBVkVfVFgsIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX1RFU1RfQlVTX0RBVEEsIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX1RFU1RfQlVTX0NUUkwsIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX1NXX1JTVF9JUlEsIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX0NIQVJfQ0ZHLCAweDAwMDAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9DSEFSX0RBVEFfTU9TSSwgMHgwMDAwMDAwMH0sCisJe1dDRF9TUElfU0xBVkVfQ0hBUl9EQVRBX0NTX04sIDB4MDAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX0NIQVJfREFUQV9NSVNPLCAweDAwMDAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9UUk5TX0JZVEVfQ05ULCAweDAwMDAwMDAwfSwKKwl7V0NEX1NQSV9TTEFWRV9UUk5TX0xFTiwgMHgwMDAwMDAwMH0sCisJe1dDRF9TUElfU0xBVkVfRklGT19MRVZFTCwgMHgwMDAwMDAwMH0sCisJe1dDRF9TUElfU0xBVkVfR0VORVJJQ1MsIDB4ODAwMDAwMDB9LAorCXtXQ0RfU1BJX1NMQVZFX0VYVF9CQVNFX0FERFIsIDB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGJvb2wgd2NkX3NwaV9pc192b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBXQ0RfU1BJX1NMQVZFX1NBTklUWToKKwljYXNlIFdDRF9TUElfU0xBVkVfU1RBVFVTOgorCWNhc2UgV0NEX1NQSV9TTEFWRV9JUlFfU1RBVFVTOgorCWNhc2UgV0NEX1NQSV9TTEFWRV9UWDoKKwljYXNlIFdDRF9TUElfU0xBVkVfU1dfUlNUX0lSUToKKwljYXNlIFdDRF9TUElfU0xBVkVfVFJOU19CWVRFX0NOVDoKKwljYXNlIFdDRF9TUElfU0xBVkVfRklGT19MRVZFTDoKKwljYXNlIFdDRF9TUElfU0xBVkVfR0VORVJJQ1M6CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgd2NkX3NwaV9pc19yZWFkYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBXQ0RfU1BJX1NMQVZFX1NXX1JFU0VUOgorCWNhc2UgV0NEX1NQSV9TTEFWRV9JUlFfQ0xSOgorCWNhc2UgV0NEX1NQSV9TTEFWRV9JUlFfRk9SQ0U6CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHdjZF9zcGlfcmVnbWFwX2NmZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDMyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSB3Y2Rfc3BpX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRSh3Y2Rfc3BpX2RlZmF1bHRzKSwKKwkubWF4X3JlZ2lzdGVyID0gV0NEX1NQSV9NQVhfUkVHSVNURVIsCisJLnZvbGF0aWxlX3JlZyA9IHdjZF9zcGlfaXNfdm9sYXRpbGVfcmVnLAorCS5yZWFkYWJsZV9yZWcgPSB3Y2Rfc3BpX2lzX3JlYWRhYmxlX3JlZywKK307CisKK3N0YXRpYyBpbnQgd2RzcF9zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSB3Y2Rfc3BpX2luaXQoc3BpKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEluaXQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2RzcF9zcGlfZGVpbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJLyoKKwkgKiBEZWluaXQgbWVhbnMgdGhlIGhhcmR3YXJlIGlzIHJlc2V0LiBNYXJrIHRoZSBjYWNoZQorCSAqIGFzIGRpcnR5IGhlcmUsIHNvIGluaXQgd2lsbCBzeW5jIHRoZSBjYWNoZQorCSAqLworCXJlZ2NhY2hlX21hcmtfZGlydHkod2NkX3NwaS0+cmVnbWFwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHdkc3BfY21wbnRfb3BzIHdkc3Bfc3BpX29wcyA9IHsKKwkuaW5pdCA9IHdkc3Bfc3BpX2luaXQsCisJLmRlaW5pdCA9IHdkc3Bfc3BpX2RlaW5pdCwKKwkuZXZlbnRfaGFuZGxlciA9IHdkc3Bfc3BpX2V2ZW50X2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IHdjZF9zcGlfY29tcG9uZW50X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgcmV0ID0gMDsKKworCXdjZF9zcGktPm1fZGV2ID0gbWFzdGVyOworCXdjZF9zcGktPm1fb3BzID0gZGF0YTsKKworCWlmICh3Y2Rfc3BpLT5tX29wcyAmJgorCSAgICB3Y2Rfc3BpLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKQorCQlyZXQgPSB3Y2Rfc3BpLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKG1hc3RlciwgZGV2LAorCQkJCQkJCSB3Y2Rfc3BpLAorCQkJCQkJCSAmd2RzcF9zcGlfb3BzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHJlZ2lzdGVyX2NtcG50X29wcyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3Y2Rfc3BpLT5yZWdfYnl0ZXMgPSBESVZfUk9VTkRfVVAod2NkX3NwaV9yZWdtYXBfY2ZnLnJlZ19iaXRzLCA4KTsKKwl3Y2Rfc3BpLT52YWxfYnl0ZXMgPSBESVZfUk9VTkRfVVAod2NkX3NwaV9yZWdtYXBfY2ZnLnZhbF9iaXRzLCA4KTsKKworCXdjZF9zcGktPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQoJnNwaS0+ZGV2LCAmd2NkX3NwaV9yZWdtYXBfYnVzLAorCQkJCQkgICAmc3BpLT5kZXYsICZ3Y2Rfc3BpX3JlZ21hcF9jZmcpOworCWlmIChJU19FUlIod2NkX3NwaS0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKHdjZF9zcGktPnJlZ21hcCk7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWdtYXAsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAod2NkX3NwaV9kZWJ1Z2ZzX2luaXQoc3BpKSkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogRmFpbGVkIGRlYnVnZnMgaW5pdFxuIiwgX19mdW5jX18pOworCisJc3BpX21lc3NhZ2VfaW5pdCgmd2NkX3NwaS0+bXNnMSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJndjZF9zcGktPnhmZXIxLCAmd2NkX3NwaS0+bXNnMSk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZ3Y2Rfc3BpLT5tc2cyKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmd2NkX3NwaS0+eGZlcjJbMF0sICZ3Y2Rfc3BpLT5tc2cyKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmd2NkX3NwaS0+eGZlcjJbMV0sICZ3Y2Rfc3BpLT5tc2cyKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkX3NwaV9jb21wb25lbnRfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwl3Y2Rfc3BpLT5tX2RldiA9IE5VTEw7CisJd2NkX3NwaS0+bV9vcHMgPSBOVUxMOworCisJc3BpX3RyYW5zZmVyX2RlbCgmd2NkX3NwaS0+eGZlcjEpOworCXNwaV90cmFuc2Zlcl9kZWwoJndjZF9zcGktPnhmZXIyWzBdKTsKKwlzcGlfdHJhbnNmZXJfZGVsKCZ3Y2Rfc3BpLT54ZmVyMlsxXSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyB3Y2Rfc3BpX2NvbXBvbmVudF9vcHMgPSB7CisJLmJpbmQgPSB3Y2Rfc3BpX2NvbXBvbmVudF9iaW5kLAorCS51bmJpbmQgPSB3Y2Rfc3BpX2NvbXBvbmVudF91bmJpbmQsCit9OworCitzdGF0aWMgaW50IHdjZF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpOworCWludCByZXQgPSAwOworCisJd2NkX3NwaSA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqd2NkX3NwaSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF3Y2Rfc3BpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHNwaS0+ZGV2Lm9mX25vZGUsCisJCQkJICAgInFjb20sbWVtLWJhc2UtYWRkciIsCisJCQkJICAgJndjZF9zcGktPm1lbV9iYXNlX2FkZHIpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBNaXNzaW5nICVzIERUIGVudHJ5IiwKKwkJCV9fZnVuY19fLCAicWNvbSxtZW0tYmFzZS1hZGRyIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwKKwkJIiVzOiBtZW1fYmFzZV9hZGRyIDB4JXhcbiIsIF9fZnVuY19fLCB3Y2Rfc3BpLT5tZW1fYmFzZV9hZGRyKTsKKworCW11dGV4X2luaXQoJndjZF9zcGktPmNsa19tdXRleCk7CisJbXV0ZXhfaW5pdCgmd2NkX3NwaS0+eGZlcl9tdXRleCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJndjZF9zcGktPmNsa19kd29yaywgd2NkX3NwaV9jbGtfd29yayk7CisKKwl3Y2Rfc3BpLT5zcGkgPSBzcGk7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgd2NkX3NwaSk7CisKKwlyZXQgPSBjb21wb25lbnRfYWRkKCZzcGktPmRldiwgJndjZF9zcGlfY29tcG9uZW50X29wcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjb21wb25lbnRfYWRkIGZhaWxlZCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9jb21wb25lbnRfYWRkOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycl9jb21wb25lbnRfYWRkOgorCW11dGV4X2Rlc3Ryb3koJndjZF9zcGktPmNsa19tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmd2NkX3NwaS0+eGZlcl9tdXRleCk7CitlcnJfcmV0OgorCWRldm1fa2ZyZWUoJnNwaS0+ZGV2LCB3Y2Rfc3BpKTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBOVUxMKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJY29tcG9uZW50X2RlbCgmc3BpLT5kZXYsICZ3Y2Rfc3BpX2NvbXBvbmVudF9vcHMpOworCisJbXV0ZXhfZGVzdHJveSgmd2NkX3NwaS0+Y2xrX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZ3Y2Rfc3BpLT54ZmVyX211dGV4KTsKKworCWRldm1fa2ZyZWUoJnNwaS0+ZGV2LCB3Y2Rfc3BpKTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3Y2Rfc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjZC1zcGktdjIiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdjZF9zcGlfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd2NkX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid2NkLXNwaS12MiIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdjZF9zcGlfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB3Y2Rfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSB3Y2Rfc3BpX3JlbW92ZSwKK307CisKK21vZHVsZV9zcGlfZHJpdmVyKHdjZF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJXQ0QgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLXRhYmxlcy5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLXRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjZmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzAtdGFibGVzLmMKQEAgLTAsMCArMSwxNjc1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOTMzMF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlICJ3Y2Q5MzMwLmgiCisKK2NvbnN0IHU4IHRvbXRvbV9yZWdfcmVhZGFibGVbV0NEOTMzMF9NQVhfUkVHSVNURVIgKyAxXSA9IHsKKwlbVE9NVE9NX0FfQ0hJUF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzBdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzFdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzJdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzNdID0gMSwKKwlbVE9NVE9NX0FfQ0hJUF9JMkNfU0xBVkVfSURdID0gMSwKKwlbVE9NVE9NX0FfU0xBVkVfSURfMV0gPSAxLAorCVtUT01UT01fQV9TTEFWRV9JRF8yXSA9IDEsCisJW1RPTVRPTV9BX1NMQVZFX0lEXzNdID0gMSwKKwlbVE9NVE9NX0FfUElOX0NUTF9PRTBdID0gMSwKKwlbVE9NVE9NX0FfUElOX0NUTF9PRTFdID0gMSwKKwlbVE9NVE9NX0FfUElOX0NUTF9PRTJdID0gMSwKKwlbVE9NVE9NX0FfUElOX0NUTF9EQVRBMF0gPSAxLAorCVtUT01UT01fQV9QSU5fQ1RMX0RBVEExXSA9IDEsCisJW1RPTVRPTV9BX1BJTl9DVExfREFUQTJdID0gMSwKKwlbVE9NVE9NX0FfSERSSVZFX0dFTkVSSUNdID0gMSwKKwlbVE9NVE9NX0FfSERSSVZFX09WRVJSSURFXSA9IDEsCisJW1RPTVRPTV9BX0FOQV9DU1JfV0FJVF9TVEFURV0gPSAxLAorCVtUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMF0gPSAxLAorCVtUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMV0gPSAxLAorCVtUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMMl0gPSAxLAorCVtUT01UT01fQV9QUk9DRVNTX01PTklUT1JfQ1RMM10gPSAxLAorCVtUT01UT01fQV9RRlVTRV9DVExdID0gMSwKKwlbVE9NVE9NX0FfUUZVU0VfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMF0gPSAxLAorCVtUT01UT01fQV9RRlVTRV9EQVRBX09VVDFdID0gMSwKKwlbVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQyXSA9IDEsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUM10gPSAxLAorCVtUT01UT01fQV9RRlVTRV9EQVRBX09VVDRdID0gMSwKKwlbVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ1XSA9IDEsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNl0gPSAxLAorCVtUT01UT01fQV9RRlVTRV9EQVRBX09VVDddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NUTF0gPSAxLAorCVtUT01UT01fQV9MRUFLQUdFX0NUTF0gPSAxLAorCVtUT01UT01fQV9TVkFTU19NRU1fUFRSMF0gPSAxLAorCVtUT01UT01fQV9TVkFTU19NRU1fUFRSMV0gPSAxLAorCVtUT01UT01fQV9TVkFTU19NRU1fUFRSMl0gPSAxLAorCVtUT01UT01fQV9TVkFTU19NRU1fQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX01FTV9CQU5LXSA9IDEsCisJW1RPTVRPTV9BX0RNSUNfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0RNSUNfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX0NMS1JTVF9DVExdID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfQ1BBUl9DRkddID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfQlVGX1JEWV9JTlRfUEVSSU9EXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX0NQQVJfV0RPR19DRkddID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfQ0ZHXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9DRkddID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX0lOVF9NQVNLXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX0lOVF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfSU5UX0NMUl0gPSAwLAorCVtUT01UT01fQV9TVkFTU19ERUJVR10gPSAxLAorCVtUT01UT01fQV9TVkFTU19TUEVfQktVUF9JTlRdID0gMCwKKwlbVE9NVE9NX0FfU1ZBU1NfTUVNX0FDQ10gPSAxLAorCVtUT01UT01fQV9NRU1fTEVBS0FHRV9DVExdID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1RSR10gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMF0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMV0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMl0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfM10gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNF0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNV0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNl0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfN10gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOF0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOV0gPSAwLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMTBdID0gMCwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzExXSA9IDAsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMF0gPSAxLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzFdID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8yXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfM10gPSAxLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzRdID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF81XSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNl0gPSAxLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzddID0gMSwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF84XSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfOV0gPSAxLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzEwXSA9IDEsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMTFdID0gMSwKKwlbVE9NVE9NX0FfSU5UUl9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX01BU0swXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX01BU0sxXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX01BU0syXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX01BU0szXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX1NUQVRVUzBdID0gMSwKKwlbVE9NVE9NX0FfSU5UUjFfU1RBVFVTMV0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9TVEFUVVMyXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX1NUQVRVUzNdID0gMSwKKwlbVE9NVE9NX0FfSU5UUjFfQ0xFQVIwXSA9IDAsCisJW1RPTVRPTV9BX0lOVFIxX0NMRUFSMV0gPSAwLAorCVtUT01UT01fQV9JTlRSMV9DTEVBUjJdID0gMCwKKwlbVE9NVE9NX0FfSU5UUjFfQ0xFQVIzXSA9IDAsCisJW1RPTVRPTV9BX0lOVFIxX0xFVkVMMF0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9MRVZFTDFdID0gMSwKKwlbVE9NVE9NX0FfSU5UUjFfTEVWRUwyXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX0xFVkVMM10gPSAxLAorCVtUT01UT01fQV9JTlRSMV9URVNUMF0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9URVNUMV0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9URVNUMl0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9URVNUM10gPSAxLAorCVtUT01UT01fQV9JTlRSMV9TRVQwXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIxX1NFVDFdID0gMSwKKwlbVE9NVE9NX0FfSU5UUjFfU0VUMl0gPSAxLAorCVtUT01UT01fQV9JTlRSMV9TRVQzXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIyX01BU0swXSA9IDEsCisJW1RPTVRPTV9BX0lOVFIyX1NUQVRVUzBdID0gMSwKKwlbVE9NVE9NX0FfSU5UUjJfQ0xFQVIwXSA9IDAsCisJW1RPTVRPTV9BX0lOVFIyX0xFVkVMMF0gPSAxLAorCVtUT01UT01fQV9JTlRSMl9URVNUMF0gPSAxLAorCVtUT01UT01fQV9JTlRSMl9TRVQwXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWF9JMlNfU0NLX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYX0kyU19XU19NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0RBVEEwX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMF9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0RBVEExX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMV9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWF9JMlNfU0NLX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYX0kyU19XU19NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0RBVEEyX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfQ0xLMl9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19JTlRSMV9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TQl9OUlpfU0VMX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lOVFIyX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JGX1BBX09OX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0JPT1NUX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0pUQ0tfTU9ERV0gPSAxLAorCVtUT01UT01fQV9DRENfSlRESV9NT0RFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19KVE1TX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0pURE9fTU9ERV0gPSAxLAorCVtUT01UT01fQV9DRENfSlRSU1RfTU9ERV0gPSAxLAorCVtUT01UT01fQV9DRENfQklTVF9NT0RFX01PREVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8xXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8xXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfM10gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF83XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzhdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19JSVJfQ1RMX1BUUl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMV0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8zXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNF0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF82XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfN10gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMV0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfMl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfM10gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNF0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNV0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfN10gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfOF0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUl0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUFEX0lOUF9TRUxdID0gMSwKKwlbVE9NVE9NX0FfQklBU19SRUZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0JJQVNfQ0VOVFJBTF9CR19DVExdID0gMSwKKwlbVE9NVE9NX0FfQklBU19QUkVDSFJHX0NUTF0gPSAxLAorCVtUT01UT01fQV9CSUFTX0NVUlJfQ1RMXzFdID0gMSwKKwlbVE9NVE9NX0FfQklBU19DVVJSX0NUTF8yXSA9IDEsCisJW1RPTVRPTV9BX0JJQVNfT1NDX0JHX0NUTF0gPSAxLAorCVtUT01UT01fQV9DTEtfQlVGRl9FTjFdID0gMSwKKwlbVE9NVE9NX0FfQ0xLX0JVRkZfRU4yXSA9IDEsCisJW1RPTVRPTV9BX0xET19MX01PREVfMV0gPSAxLAorCVtUT01UT01fQV9MRE9fTF9NT0RFXzJdID0gMSwKKwlbVE9NVE9NX0FfTERPX0xfQ1RSTF8xXSA9IDEsCisJW1RPTVRPTV9BX0xET19MX0NUUkxfMl0gPSAxLAorCVtUT01UT01fQV9MRE9fTF9DVFJMXzNdID0gMSwKKwlbVE9NVE9NX0FfTERPX0xfQ1RSTF80XSA9IDEsCisJW1RPTVRPTV9BX0xET19IX01PREVfMV0gPSAxLAorCVtUT01UT01fQV9MRE9fSF9NT0RFXzJdID0gMSwKKwlbVE9NVE9NX0FfTERPX0hfTE9PUF9DVExdID0gMSwKKwlbVE9NVE9NX0FfTERPX0hfQ09NUF8xXSA9IDEsCisJW1RPTVRPTV9BX0xET19IX0NPTVBfMl0gPSAxLAorCVtUT01UT01fQV9MRE9fSF9CSUFTXzFdID0gMSwKKwlbVE9NVE9NX0FfTERPX0hfQklBU18yXSA9IDEsCisJW1RPTVRPTV9BX0xET19IX0JJQVNfM10gPSAxLAorCVtUT01UT01fQV9WQkFUX0NMS10gPSAxLAorCVtUT01UT01fQV9WQkFUX0xPT1BdID0gMSwKKwlbVE9NVE9NX0FfVkJBVF9SRUZdID0gMSwKKwlbVE9NVE9NX0FfVkJBVF9BRENfVEVTVF0gPSAxLAorCVtUT01UT01fQV9WQkFUX0ZFXSA9IDEsCisJW1RPTVRPTV9BX1ZCQVRfQklBU18xXSA9IDEsCisJW1RPTVRPTV9BX1ZCQVRfQklBU18yXSA9IDEsCisJW1RPTVRPTV9BX1ZCQVRfQURDX0RBVEFfTVNCXSA9IDEsCisJW1RPTVRPTV9BX1ZCQVRfQURDX0RBVEFfTFNCXSA9IDEsCisJW1RPTVRPTV9BX0ZMTF9OUkVGXSA9IDEsCisJW1RPTVRPTV9BX0ZMTF9LRENPX1RVTkVdID0gMSwKKwlbVE9NVE9NX0FfRkxMX0xPQ0tfVEhSRVNIXSA9IDEsCisJW1RPTVRPTV9BX0ZMTF9MT0NLX0RFVF9DT1VOVF0gPSAxLAorCVtUT01UT01fQV9GTExfREFDX1RIUkVTSE9MRF0gPSAxLAorCVtUT01UT01fQV9GTExfVEVTVF9EQ09fRlJFRVJVTl0gPSAxLAorCVtUT01UT01fQV9GTExfVEVTVF9FTkFCTEVdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8xX0NUTF0gPSAxLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzFfVkFMXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9QUkVDSFJHXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl8xX0lOVF9SQklBU10gPSAxLAorCVtUT01UT01fQV9NSUNCXzFfTUJIQ10gPSAxLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUxdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8yX1BSRUNIUkddID0gMSwKKwlbVE9NVE9NX0FfTUlDQl8yX0NUTF0gPSAxLAorCVtUT01UT01fQV9NSUNCXzJfSU5UX1JCSUFTXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfMl9NQkhDXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfM19DVExdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTF0gPSAxLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzNfUFJFQ0hSR10gPSAxLAorCVtUT01UT01fQV9NSUNCXzNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVNdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl8zX01CSENdID0gMSwKKwlbVE9NVE9NX0FfTUlDQl80X0NUTF0gPSAxLAorCVtUT01UT01fQV9NSUNCXzRfSU5UX1JCSUFTXSA9IDEsCisJW1RPTVRPTV9BX01JQ0JfNF9NQkhDXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9FTl0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfR0FJTl0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfREFDX0NUTF0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfT0NQX0NUTF0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfQ0xJUF9ERVRdID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19EQUNdID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19QQV0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfREJHX1BXUlNUR10gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjJfQklBU19MRE9dID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0JJQVNfSU5UXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX1BBXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfT0NQXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfUEFdID0gMSwKKwlbVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUXSA9IDEsCisJW1RPTVRPTV9BX01CSENfSU5TRVJUX0RFVF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfVFhfQ09NX0JJQVNdID0gMSwKKwlbVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUMl0gPSAxLAorCVtUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzFdID0gMSwKKwlbVE9NVE9NX0FfTUJIQ19TQ0FMSU5HX01VWF8yXSA9IDEsCisJW1RPTVRPTV9BX01BRF9BTkFfQ1RSTF0gPSAxLAorCVtUT01UT01fQV9UWF9TVVBfU1dJVENIX0NUUkxfMV0gPSAxLAorCVtUT01UT01fQV9UWF9TVVBfU1dJVENIX0NUUkxfMl0gPSAxLAorCVtUT01UT01fQV9UWF8xX0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfMV8yX1RFU1RfRU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfMl9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX1RYXzFfMl9BRENfSUJdID0gMSwKKwlbVE9NVE9NX0FfVFhfMV8yX0FURVNUX1JFRkNUUkxdID0gMSwKKwlbVE9NVE9NX0FfVFhfMV8yX1RFU1RfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1RYXzFfMl9URVNUX0JMT0NLX0VOXSA9IDEsCisJW1RPTVRPTV9BX1RYXzFfMl9UWEZFX0NMS0RJVl0gPSAxLAorCVtUT01UT01fQV9UWF8xXzJfU0FSX0VSUl9DSDFdID0gMSwKKwlbVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gyXSA9IDEsCisJW1RPTVRPTV9BX1RYXzNfR0FJTl0gPSAxLAorCVtUT01UT01fQV9UWF8zXzRfVEVTVF9FTl0gPSAxLAorCVtUT01UT01fQV9UWF80X0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfM180X0FEQ19JQl0gPSAxLAorCVtUT01UT01fQV9UWF8zXzRfQVRFU1RfUkVGQ1RSTF0gPSAxLAorCVtUT01UT01fQV9UWF8zXzRfVEVTVF9DVExdID0gMSwKKwlbVE9NVE9NX0FfVFhfM180X1RFU1RfQkxPQ0tfRU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfM180X1RYRkVfQ0tESVZdID0gMSwKKwlbVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0gzXSA9IDEsCisJW1RPTVRPTV9BX1RYXzNfNF9TQVJfRVJSX0NINF0gPSAxLAorCVtUT01UT01fQV9UWF81X0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfNV82X1RFU1RfRU5dID0gMSwKKwlbVE9NVE9NX0FfVFhfNl9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX1RYXzVfNl9BRENfSUJdID0gMSwKKwlbVE9NVE9NX0FfVFhfNV82X0FURVNUX1JFRkNUUkxdID0gMSwKKwlbVE9NVE9NX0FfVFhfNV82X1RFU1RfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1RYXzVfNl9URVNUX0JMT0NLX0VOXSA9IDEsCisJW1RPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWXSA9IDEsCisJW1RPTVRPTV9BX1RYXzVfNl9TQVJfRVJSX0NINV0gPSAxLAorCVtUT01UT01fQV9UWF81XzZfU0FSX0VSUl9DSDZdID0gMSwKKwlbVE9NVE9NX0FfVFhfN19NQkhDX0VOXSA9IDEsCisJW1RPTVRPTV9BX1RYXzdfTUJIQ19BVEVTVF9SRUZDVFJMXSA9IDEsCisJW1RPTVRPTV9BX1RYXzdfTUJIQ19BRENdID0gMSwKKwlbVE9NVE9NX0FfVFhfN19NQkhDX1RFU1RfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1RYXzdfTUJIQ19TQVJfRVJSXSA9IDEsCisJW1RPTVRPTV9BX1RYXzdfVFhGRV9DTEtESVZdID0gMSwKKwlbVE9NVE9NX0FfUkNPX0NUUkxdID0gMSwKKwlbVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwxXSA9IDEsCisJW1RPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMl0gPSAxLAorCVtUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fQ1RSTDNdID0gMSwKKwlbVE9NVE9NX0FfUkNPX1RFU1RfQ1RSTF0gPSAxLAorCVtUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fUkVTVUxUMV0gPSAxLAorCVtUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fUkVTVUxUMl0gPSAxLAorCVtUT01UT01fQV9CVUNLX01PREVfMV0gPSAxLAorCVtUT01UT01fQV9CVUNLX01PREVfMl0gPSAxLAorCVtUT01UT01fQV9CVUNLX01PREVfM10gPSAxLAorCVtUT01UT01fQV9CVUNLX01PREVfNF0gPSAxLAorCVtUT01UT01fQV9CVUNLX01PREVfNV0gPSAxLAorCVtUT01UT01fQV9CVUNLX0NUUkxfVkNMXzFdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8yXSA9IDEsCisJW1RPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfM10gPSAxLAorCVtUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzFdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8yXSA9IDEsCisJW1RPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfM10gPSAxLAorCVtUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzRdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzFdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzJdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX1BXTV9EUlZSXzNdID0gMSwKKwlbVE9NVE9NX0FfQlVDS19UTVVYX0FfRF0gPSAxLAorCVtUT01UT01fQV9OQ1BfQlVDS1JFRl0gPSAxLAorCVtUT01UT01fQV9OQ1BfRU5dID0gMSwKKwlbVE9NVE9NX0FfTkNQX0NMS10gPSAxLAorCVtUT01UT01fQV9OQ1BfU1RBVElDXSA9IDEsCisJW1RPTVRPTV9BX05DUF9WVEhfTE9XXSA9IDEsCisJW1RPTVRPTV9BX05DUF9WVEhfSElHSF0gPSAxLAorCVtUT01UT01fQV9OQ1BfQVRFU1RdID0gMSwKKwlbVE9NVE9NX0FfTkNQX0RURVNUXSA9IDEsCisJW1RPTVRPTV9BX05DUF9ETFkxXSA9IDEsCisJW1RPTVRPTV9BX05DUF9ETFkyXSA9IDEsCisJW1RPTVRPTV9BX1JYX0FVWF9TV19DVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfUEFfQVVYX0lOX0NPTk5dID0gMSwKKwlbVE9NVE9NX0FfUlhfQ09NX1RJTUVSX0RJVl0gPSAxLAorCVtUT01UT01fQV9SWF9DT01fT0NQX0NUTF0gPSAxLAorCVtUT01UT01fQV9SWF9DT01fT0NQX0NPVU5UXSA9IDEsCisJW1RPTVRPTV9BX1JYX0NPTV9EQUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0NPTV9CSUFTXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9BVVRPX0NIT1BdID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0NIT1BfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9CSUFTX1BBXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9CSUFTX0xET10gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfQklBU19DTlBdID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0JJQVNfV0dfT0NQXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9DTlBfRU5dID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19DVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19USU1FXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9MX0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0xfVEVTVF0gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfTF9QQV9DVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX0xfREFDX0NUTF0gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfTF9BVEVTVF0gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfTF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfUlhfSFBIX1JfR0FJTl0gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfUl9URVNUXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9SX1BBX0NUTF0gPSAxLAorCVtUT01UT01fQV9SWF9IUEhfUl9EQUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9SX0FURVNUXSA9IDEsCisJW1RPTVRPTV9BX1JYX0hQSF9SX1NUQVRVU10gPSAxLAorCVtUT01UT01fQV9SWF9FQVJfQklBU19QQV0gPSAxLAorCVtUT01UT01fQV9SWF9FQVJfQklBU19DTUJVRkZdID0gMSwKKwlbVE9NVE9NX0FfUlhfRUFSX0VOXSA9IDEsCisJW1RPTVRPTV9BX1JYX0VBUl9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX1JYX0VBUl9DTUJVRkZdID0gMSwKKwlbVE9NVE9NX0FfUlhfRUFSX0lDVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfRUFSX0NDT01QXSA9IDEsCisJW1RPTVRPTV9BX1JYX0VBUl9WQ01dID0gMSwKKwlbVE9NVE9NX0FfUlhfRUFSX0NOUF0gPSAxLAorCVtUT01UT01fQV9SWF9FQVJfREFDX0NUTF9BVEVTVF0gPSAxLAorCVtUT01UT01fQV9SWF9FQVJfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfQklBU19QQV0gPSAxLAorCVtUT01UT01fQV9SWF9CVUNLX0JJQVMxXSA9IDEsCisJW1RPTVRPTV9BX1JYX0JVQ0tfQklBUzJdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV9DT01dID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV9DTlBfRU5dID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfQ05QX1dHX1RJTUVdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV8xX0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV8xX1RFU1RdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV8xX0RBQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV8xX1NUQVRVU10gPSAxLAorCVtUT01UT01fQV9SWF9MSU5FXzJfR0FJTl0gPSAxLAorCVtUT01UT01fQV9SWF9MSU5FXzJfVEVTVF0gPSAxLAorCVtUT01UT01fQV9SWF9MSU5FXzJfREFDX0NUTF0gPSAxLAorCVtUT01UT01fQV9SWF9MSU5FXzJfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19HQUlOXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19URVNUXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19EQUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV80X0dBSU5dID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV80X1RFU1RdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV80X0RBQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfUlhfTElORV80X1NUQVRVU10gPSAxLAorCVtUT01UT01fQV9SWF9MSU5FX0NOUF9EQkddID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX0VOXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9DTElQX0RFVF0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjFfSUVDXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQkdfREFDXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUEFdID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX0RCR19QV1JTVEddID0gMSwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfTERPXSA9IDEsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0lOVF0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjFfQklBU19QQV0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjFfU1RBVFVTX09DUF0gPSAxLAorCVtUT01UT01fQV9TUEtSX0RSVjFfU1RBVFVTX1BBXSA9IDEsCisJW1RPTVRPTV9BX1NQS1IxX1BST1RfRU5dID0gMSwKKwlbVE9NVE9NX0FfU1BLUjFfUFJPVF9BRENfVEVTVF9FTl0gPSAxLAorCVtUT01UT01fQV9TUEtSMV9QUk9UX0FURVNUXSA9IDEsCisJW1RPTVRPTV9BX1NQS1IxX1BST1RfTERPX0NUUkxdID0gMSwKKwlbVE9NVE9NX0FfU1BLUjFfUFJPVF9JU0VOU0VfQ1RSTF0gPSAxLAorCVtUT01UT01fQV9TUEtSMV9QUk9UX1ZTRU5TRV9DVFJMXSA9IDEsCisJW1RPTVRPTV9BX1NQS1IyX1BST1RfRU5dID0gMSwKKwlbVE9NVE9NX0FfU1BLUjJfUFJPVF9BRENfVEVTVF9FTl0gPSAxLAorCVtUT01UT01fQV9TUEtSMl9QUk9UX0FURVNUXSA9IDEsCisJW1RPTVRPTV9BX1NQS1IyX1BST1RfTERPX0NUUkxdID0gMSwKKwlbVE9NVE9NX0FfU1BLUjJfUFJPVF9JU0VOU0VfQ1RSTF0gPSAxLAorCVtUT01UT01fQV9TUEtSMl9QUk9UX1ZTRU5TRV9DVFJMXSA9IDEsCisJW1RPTVRPTV9BX01CSENfSFBIXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfU0hJRlRdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfU0hJRlRdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMl9JSVJfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0lJUl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMV9JSVJfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMyX0lJUl9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMl9MUEZfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfTFBGX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMV9TUEFSRV0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMl9TUEFSRV0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMV9TTUxQRl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfU01MUEZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0RDRkxUX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQU5DMl9EQ0ZMVF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfR0FJTl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfR0FJTl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19BTkMyX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfVElNRVJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX1RJTUVSXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9USU1FUl0gPSAxLAorCVtUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfVElNRVJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX1RJTUVSXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9USU1FUl0gPSAxLAorCVtUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfVElNRVJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX1RJTUVSXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9USU1FUl0gPSAxLAorCVtUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX1RJTUVSXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDJfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDVfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDhfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9HQUlOXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTl0gPSAxLAorCVtUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfQ0ZHXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDJfVk9MX0NUTF9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfQ0ZHXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDVfVk9MX0NUTF9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfQ0ZHXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDhfVk9MX0NUTF9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfVFgxX01VWF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYMl9NVVhfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDNfTVVYX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg0X01VWF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYNV9NVVhfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDZfTVVYX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg3X01VWF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYOF9NVVhfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDlfTVVYX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDFfQ0xLX0ZTX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFgyX0NMS19GU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYM19DTEtfRlNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDRfQ0xLX0ZTX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg1X0NMS19GU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYNl9DTEtfRlNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDdfQ0xLX0ZTX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg4X0NMS19GU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYOV9DTEtfRlNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDEwX0NMS19GU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDNfRE1JQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDZfRE1JQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19UWDlfRE1JQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1RYMTBfRE1JQ19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwwXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMV0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwzXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNF0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw2XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMN10gPSAxLAorCVtUT01UT01fQV9DRENfREVCVUdfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19ERUJVR19CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0RFQlVHX0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfREVCVUdfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19ERUJVR19CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0RFQlVHX0I2X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfREVCVUdfQjdfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUkMxX1BEQV9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NSQzJfUERBX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfU1JDMV9GU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NSQzJfRlNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDJfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDVfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlgzX1ZPTF9DVExfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg2X1ZPTF9DVExfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVkJBVF9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDFdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfQURDX0NBTDNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUMV0gPSAxLAorCVtUT01UT01fQV9DRENfVkJBVF9QS19FU1QyXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfUkZfUFJPQzFdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfUkZfUFJPQzJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDMV0gPSAxLAorCVtUT01UT01fQV9DRENfVkJBVF9UQUMyXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19WQkFUX1RBQzNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDNF0gPSAxLAorCVtUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDFdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQyXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEM10gPSAxLAorCVtUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDRdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfREVCVUcxXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEX01PTl0gPSAwLAorCVtUT01UT01fQV9DRENfVkJBVF9HQUlOX01PTl9WQUxdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfUlhfUkVTRVRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfUkVTRVRfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfUkVTRVRfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfUlhfSTJTX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMS19PVEhSX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xLX0FOQ19DTEtfRU5fQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfUlhfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfUlhfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfTUNMS19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMS19QRE1fQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTEtfU0RfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xTSF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xTSF9JRExFX0VBUl9USFNEXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNEXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNEXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0tfQUREUl0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xTSF9LX0RBVEFdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVV0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX0xdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfSERfRUFSXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfSERfSFBIXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfTUlOX0VBUl0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9IUEhdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CN19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CN19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9COF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9COF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMV9HQUlOX1RJTUVSX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMl9HQUlOX1RJTUVSX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMV9DT0VGX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMl9DT0VGX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfSUlSMl9DT0VGX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfVE9QX0dBSU5fVVBEQVRFXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19QQV9SQU1QX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUEFfUkFNUF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19QQV9SQU1QX0I0X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUl9DTElQREVUX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I0X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I1X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I2X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9CNl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAxX1NIVVRfRE9XTl9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAyX1NIVVRfRE9XTl9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0ZTX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfQ09NUDFfRlNfQ0ZHXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9GU19DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYMV9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDJfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYMl9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgzX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDNfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYNF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg0X0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDVfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYNV9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg2X0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDZfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYN19CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDdfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX0FOQ19CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fQU5DX0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9FUTFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX0VRMV9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0I0X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9FUTJfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX0VRMl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9FUTJfQjRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1NSQzFfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1NSQzFfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1NSQzJfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1NSQzJfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjNfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I0X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjZfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I3X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjlfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxMF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjExX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlhfU0JfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX0NMU0hfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DT05OX01JU0NdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg4X0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQ0xJUF9MRVZFTF9BREpVU1RdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfTUlOX0NMSVBfVEhSRVNIT0xEXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1RIUkVTSE9MRF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfU0FNUExFX01BUktdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQk9PU1RfR0FUSU5HXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0NMSVBfTEVWRUxfQURKVVNUXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9NSU5fQ0xJUF9USFJFU0hPTERdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX1RIUkVTSE9MRF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX1NBTVBMRV9NQVJLXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CT09TVF9HQVRJTkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfRU5fQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMV9DRkddID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfRklSX0IyX0NGR10gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19CMV9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQjJfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0IzX1NUQVRVU10gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19CNF9TVEFUVVNdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQjVfU1RBVFVTXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CM19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CNl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CN19DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9COF9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9COV9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjExX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQ0xLX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19JTlRfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0RFQlVHX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfTUJIQ19TUEFSRV0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0IxX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0IyX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0IzX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0I0X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0I1X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X0I2X0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfUlg4X1ZPTF9DVExfQjFfQ1RMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMl9DVExdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMF0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwxXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDJdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMM10gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw0XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNl0gPSAxLAorCVtUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw3XSA9IDEsCisJW1RPTVRPTV9BX0NEQ19CT09TVF9NT0RFX0NUTF0gPSAxLAorCVtUT01UT01fQV9DRENfQk9PU1RfVEhSRVNIT0xEXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19CT09TVF9UQVBfU0VMXSA9IDEsCisJW1RPTVRPTV9BX0NEQ19CT09TVF9IT0xEX1RJTUVdID0gMSwKKwlbVE9NVE9NX0FfQ0RDX0JPT1NUX1RSR1JfRU5dID0gMSwKK307CisKK2NvbnN0IHU4IHRvbXRvbV9yZXNldF9yZWdfZGVmYXVsdHNbVE9NVE9NX0NBQ0hFX1NJWkVdID0geworCVtUT01UT01fQV9DSElQX0NUTF0gPSBUT01UT01fQV9DSElQX0NUTF9fUE9SLAorCVtUT01UT01fQV9DSElQX1NUQVRVU10gPSBUT01UT01fQV9DSElQX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9DSElQX0lEX0JZVEVfMF0gPSBUT01UT01fQV9DSElQX0lEX0JZVEVfMF9fUE9SLAorCVtUT01UT01fQV9DSElQX0lEX0JZVEVfMV0gPSBUT01UT01fQV9DSElQX0lEX0JZVEVfMV9fUE9SLAorCVtUT01UT01fQV9DSElQX0lEX0JZVEVfMl0gPSBUT01UT01fQV9DSElQX0lEX0JZVEVfMl9fUE9SLAorCVtUT01UT01fQV9DSElQX0lEX0JZVEVfM10gPSBUT01UT01fQV9DSElQX0lEX0JZVEVfM19fUE9SLAorCVtUT01UT01fQV9DSElQX0kyQ19TTEFWRV9JRF0gPSBUT01UT01fQV9DSElQX0kyQ19TTEFWRV9JRF9fUE9SLAorCVtUT01UT01fQV9TTEFWRV9JRF8xXSA9IFRPTVRPTV9BX1NMQVZFX0lEXzFfX1BPUiwKKwlbVE9NVE9NX0FfU0xBVkVfSURfMl0gPSBUT01UT01fQV9TTEFWRV9JRF8yX19QT1IsCisJW1RPTVRPTV9BX1NMQVZFX0lEXzNdID0gVE9NVE9NX0FfU0xBVkVfSURfM19fUE9SLAorCVtUT01UT01fQV9QSU5fQ1RMX09FMF0gPSBUT01UT01fQV9QSU5fQ1RMX09FMF9fUE9SLAorCVtUT01UT01fQV9QSU5fQ1RMX09FMV0gPSBUT01UT01fQV9QSU5fQ1RMX09FMV9fUE9SLAorCVtUT01UT01fQV9QSU5fQ1RMX09FMl0gPSBUT01UT01fQV9QSU5fQ1RMX09FMl9fUE9SLAorCVtUT01UT01fQV9QSU5fQ1RMX0RBVEEwXSA9IFRPTVRPTV9BX1BJTl9DVExfREFUQTBfX1BPUiwKKwlbVE9NVE9NX0FfUElOX0NUTF9EQVRBMV0gPSBUT01UT01fQV9QSU5fQ1RMX0RBVEExX19QT1IsCisJW1RPTVRPTV9BX1BJTl9DVExfREFUQTJdID0gVE9NVE9NX0FfUElOX0NUTF9EQVRBMl9fUE9SLAorCVtUT01UT01fQV9IRFJJVkVfR0VORVJJQ10gPSBUT01UT01fQV9IRFJJVkVfR0VORVJJQ19fUE9SLAorCVtUT01UT01fQV9IRFJJVkVfT1ZFUlJJREVdID0gVE9NVE9NX0FfSERSSVZFX09WRVJSSURFX19QT1IsCisJW1RPTVRPTV9BX0FOQV9DU1JfV0FJVF9TVEFURV0gPSBUT01UT01fQV9BTkFfQ1NSX1dBSVRfU1RBVEVfX1BPUiwKKwlbVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDBdID0gVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDBfX1BPUiwKKwlbVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDFdID0gVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDFfX1BPUiwKKwlbVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDJdID0gVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDJfX1BPUiwKKwlbVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDNdID0gVE9NVE9NX0FfUFJPQ0VTU19NT05JVE9SX0NUTDNfX1BPUiwKKwlbVE9NVE9NX0FfUUZVU0VfQ1RMXSA9IFRPTVRPTV9BX1FGVVNFX0NUTF9fUE9SLAorCVtUT01UT01fQV9RRlVTRV9TVEFUVVNdID0gVE9NVE9NX0FfUUZVU0VfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMF0gPSBUT01UT01fQV9RRlVTRV9EQVRBX09VVDBfX1BPUiwKKwlbVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQxXSA9IFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMV9fUE9SLAorCVtUT01UT01fQV9RRlVTRV9EQVRBX09VVDJdID0gVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQyX19QT1IsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUM10gPSBUT01UT01fQV9RRlVTRV9EQVRBX09VVDNfX1BPUiwKKwlbVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ0XSA9IFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNF9fUE9SLAorCVtUT01UT01fQV9RRlVTRV9EQVRBX09VVDVdID0gVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ1X19QT1IsCisJW1RPTVRPTV9BX1FGVVNFX0RBVEFfT1VUNl0gPSBUT01UT01fQV9RRlVTRV9EQVRBX09VVDZfX1BPUiwKKwlbVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQ3XSA9IFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUN19fUE9SLAorCVtUT01UT01fQV9DRENfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfTEVBS0FHRV9DVExdID0gVE9NVE9NX0FfTEVBS0FHRV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjBdID0gVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjBfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjFdID0gVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjFfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjJdID0gVE9NVE9NX0FfU1ZBU1NfTUVNX1BUUjJfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfTUVNX0NUTF0gPSBUT01UT01fQV9TVkFTU19NRU1fQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX01FTV9CQU5LXSA9IFRPTVRPTV9BX1NWQVNTX01FTV9CQU5LX19QT1IsCisJW1RPTVRPTV9BX0RNSUNfQjFfQ1RMXSA9IFRPTVRPTV9BX0RNSUNfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0RNSUNfQjJfQ1RMXSA9IFRPTVRPTV9BX0RNSUNfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX0NMS1JTVF9DVExdID0gVE9NVE9NX0FfU1ZBU1NfQ0xLUlNUX0NUTF9fUE9SLAorCVtUT01UT01fQV9TVkFTU19DUEFSX0NGR10gPSBUT01UT01fQV9TVkFTU19DUEFSX0NGR19fUE9SLAorCVtUT01UT01fQV9TVkFTU19CVUZfUkRZX0lOVF9QRVJJT0RdID0KKwkJCQlUT01UT01fQV9TVkFTU19CVUZfUkRZX0lOVF9QRVJJT0RfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfQ1BBUl9XRE9HX0NGR10gPSBUT01UT01fQV9TVkFTU19DUEFSX1dET0dfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX0NGR10gPSBUT01UT01fQV9TVkFTU19DRkdfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX0NGR10gPSBUT01UT01fQV9TVkFTU19TUEVfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NUQVRVU10gPSBUT01UT01fQV9TVkFTU19TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfSU5UX01BU0tdID0gVE9NVE9NX0FfU1ZBU1NfSU5UX01BU0tfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfSU5UX1NUQVRVU10gPSBUT01UT01fQV9TVkFTU19JTlRfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX0lOVF9DTFJdID0gVE9NVE9NX0FfU1ZBU1NfSU5UX0NMUl9fUE9SLAorCVtUT01UT01fQV9TVkFTU19ERUJVR10gPSBUT01UT01fQV9TVkFTU19ERUJVR19fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfQktVUF9JTlRdID0gVE9NVE9NX0FfU1ZBU1NfU1BFX0JLVVBfSU5UX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX01FTV9BQ0NdID0gVE9NVE9NX0FfU1ZBU1NfTUVNX0FDQ19fUE9SLAorCVtUT01UT01fQV9NRU1fTEVBS0FHRV9DVExdID0gVE9NVE9NX0FfTUVNX0xFQUtBR0VfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF9UUkddID0gVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1RSR19fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMF0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMF9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMV0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMV9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMl0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMl9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfM10gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfM19fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNF0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNF9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNV0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNV9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNl0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfNl9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfN10gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfN19fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOF0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOF9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOV0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfOV9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMTBdID0gVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YXzEwX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF8xMV0gPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMTFfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8wXSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMF9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzFdID0gVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xX19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMl0gPSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzJfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8zXSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfM19fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzRdID0gVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF80X19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNV0gPSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzVfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF82XSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfNl9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzddID0gVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF83X19QT1IsCisJW1RPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfOF0gPSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzhfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF85XSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfOV9fUE9SLAorCVtUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzEwXSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfMTBfX1BPUiwKKwlbVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8xMV0gPSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YXzExX19QT1IsCisJW1RPTVRPTV9BX0lOVFJfTU9ERV0gPSBUT01UT01fQV9JTlRSX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTUFTSzBdID0gVE9NVE9NX0FfSU5UUjFfTUFTSzBfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTUFTSzFdID0gVE9NVE9NX0FfSU5UUjFfTUFTSzFfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTUFTSzJdID0gVE9NVE9NX0FfSU5UUjFfTUFTSzJfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTUFTSzNdID0gVE9NVE9NX0FfSU5UUjFfTUFTSzNfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfU1RBVFVTMF0gPSBUT01UT01fQV9JTlRSMV9TVEFUVVMwX19QT1IsCisJW1RPTVRPTV9BX0lOVFIxX1NUQVRVUzFdID0gVE9NVE9NX0FfSU5UUjFfU1RBVFVTMV9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9TVEFUVVMyXSA9IFRPTVRPTV9BX0lOVFIxX1NUQVRVUzJfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfU1RBVFVTM10gPSBUT01UT01fQV9JTlRSMV9TVEFUVVMzX19QT1IsCisJW1RPTVRPTV9BX0lOVFIxX0NMRUFSMF0gPSBUT01UT01fQV9JTlRSMV9DTEVBUjBfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfQ0xFQVIxXSA9IFRPTVRPTV9BX0lOVFIxX0NMRUFSMV9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9DTEVBUjJdID0gVE9NVE9NX0FfSU5UUjFfQ0xFQVIyX19QT1IsCisJW1RPTVRPTV9BX0lOVFIxX0NMRUFSM10gPSBUT01UT01fQV9JTlRSMV9DTEVBUjNfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTEVWRUwwXSA9IFRPTVRPTV9BX0lOVFIxX0xFVkVMMF9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9MRVZFTDFdID0gVE9NVE9NX0FfSU5UUjFfTEVWRUwxX19QT1IsCisJW1RPTVRPTV9BX0lOVFIxX0xFVkVMMl0gPSBUT01UT01fQV9JTlRSMV9MRVZFTDJfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfTEVWRUwzXSA9IFRPTVRPTV9BX0lOVFIxX0xFVkVMM19fUE9SLAorCVtUT01UT01fQV9JTlRSMV9URVNUMF0gPSBUT01UT01fQV9JTlRSMV9URVNUMF9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9URVNUMV0gPSBUT01UT01fQV9JTlRSMV9URVNUMV9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9URVNUMl0gPSBUT01UT01fQV9JTlRSMV9URVNUMl9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9URVNUM10gPSBUT01UT01fQV9JTlRSMV9URVNUM19fUE9SLAorCVtUT01UT01fQV9JTlRSMV9TRVQwXSA9IFRPTVRPTV9BX0lOVFIxX1NFVDBfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjFfU0VUMV0gPSBUT01UT01fQV9JTlRSMV9TRVQxX19QT1IsCisJW1RPTVRPTV9BX0lOVFIxX1NFVDJdID0gVE9NVE9NX0FfSU5UUjFfU0VUMl9fUE9SLAorCVtUT01UT01fQV9JTlRSMV9TRVQzXSA9IFRPTVRPTV9BX0lOVFIxX1NFVDNfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjJfTUFTSzBdID0gVE9NVE9NX0FfSU5UUjJfTUFTSzBfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjJfU1RBVFVTMF0gPSBUT01UT01fQV9JTlRSMl9TVEFUVVMwX19QT1IsCisJW1RPTVRPTV9BX0lOVFIyX0NMRUFSMF0gPSBUT01UT01fQV9JTlRSMl9DTEVBUjBfX1BPUiwKKwlbVE9NVE9NX0FfSU5UUjJfTEVWRUwwXSA9IFRPTVRPTV9BX0lOVFIyX0xFVkVMMF9fUE9SLAorCVtUT01UT01fQV9JTlRSMl9URVNUMF0gPSBUT01UT01fQV9JTlRSMl9URVNUMF9fUE9SLAorCVtUT01UT01fQV9JTlRSMl9TRVQwXSA9IFRPTVRPTV9BX0lOVFIyX1NFVDBfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYX0kyU19TQ0tfTU9ERV0gPSBUT01UT01fQV9DRENfVFhfSTJTX1NDS19NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWF9JMlNfV1NfTU9ERV0gPSBUT01UT01fQV9DRENfVFhfSTJTX1dTX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTBfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19EQVRBMF9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0NMSzBfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19DTEswX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTFfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19EQVRBMV9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0NMSzFfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19DTEsxX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYX0kyU19TQ0tfTU9ERV0gPSBUT01UT01fQV9DRENfUlhfSTJTX1NDS19NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19SWF9JMlNfV1NfTU9ERV0gPSBUT01UT01fQV9DRENfUlhfSTJTX1dTX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0RNSUNfREFUQTJfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19EQVRBMl9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19ETUlDX0NMSzJfTU9ERV0gPSBUT01UT01fQV9DRENfRE1JQ19DTEsyX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lOVFIxX01PREVdID0gVE9NVE9NX0FfQ0RDX0lOVFIxX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NCX05SWl9TRUxfTU9ERV0gPSBUT01UT01fQV9DRENfU0JfTlJaX1NFTF9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JTlRSMl9NT0RFXSA9IFRPTVRPTV9BX0NEQ19JTlRSMl9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19SRl9QQV9PTl9NT0RFXSA9IFRPTVRPTV9BX0NEQ19SRl9QQV9PTl9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19CT09TVF9NT0RFXSA9IFRPTVRPTV9BX0NEQ19CT09TVF9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19KVENLX01PREVdID0gVE9NVE9NX0FfQ0RDX0pUQ0tfTU9ERV9fUE9SLAorCVtUT01UT01fQV9DRENfSlRESV9NT0RFXSA9IFRPTVRPTV9BX0NEQ19KVERJX01PREVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0pUTVNfTU9ERV0gPSBUT01UT01fQV9DRENfSlRNU19NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19KVERPX01PREVdID0gVE9NVE9NX0FfQ0RDX0pURE9fTU9ERV9fUE9SLAorCVtUT01UT01fQV9DRENfSlRSU1RfTU9ERV0gPSBUT01UT01fQV9DRENfSlRSU1RfTU9ERV9fUE9SLAorCVtUT01UT01fQV9DRENfQklTVF9NT0RFX01PREVdID0gVE9NVE9NX0FfQ0RDX0JJU1RfTU9ERV9NT0RFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMV0gPSBUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8yXSA9IFRPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMl9fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8xXSA9IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMl0gPSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8yX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzNdID0gVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfM19fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80XSA9IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzRfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNV0gPSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF81X19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzZdID0gVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNl9fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF83XSA9IFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfOF0gPSBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF84X19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9QVFJdID0KKwkJCQlUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfUFRSX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9WQUxdID0KKwkJCQlUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMV0gPSBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8yXSA9IFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfMl9fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzNdID0gVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF8zX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNF0gPSBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzRfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF81XSA9IFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNV9fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzZdID0gVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF82X19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfN10gPSBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzFdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzJdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzNdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzRdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzRfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzVdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzZdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzZfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzddID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzhdID0gVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzhfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fSUlSX0NUTF9QVFJdID0KKwkJCQlUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUl9fUE9SLAorCVtUT01UT01fQV9DRENfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQURfSU5QX1NFTF0gPSBUT01UT01fQV9DRENfTUFEX0lOUF9TRUxfX1BPUiwKKwlbVE9NVE9NX0FfQklBU19SRUZfQ1RMXSA9IFRPTVRPTV9BX0JJQVNfUkVGX0NUTF9fUE9SLAorCVtUT01UT01fQV9CSUFTX0NFTlRSQUxfQkdfQ1RMXSA9IFRPTVRPTV9BX0JJQVNfQ0VOVFJBTF9CR19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQklBU19QUkVDSFJHX0NUTF0gPSBUT01UT01fQV9CSUFTX1BSRUNIUkdfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0JJQVNfQ1VSUl9DVExfMV0gPSBUT01UT01fQV9CSUFTX0NVUlJfQ1RMXzFfX1BPUiwKKwlbVE9NVE9NX0FfQklBU19DVVJSX0NUTF8yXSA9IFRPTVRPTV9BX0JJQVNfQ1VSUl9DVExfMl9fUE9SLAorCVtUT01UT01fQV9CSUFTX09TQ19CR19DVExdID0gVE9NVE9NX0FfQklBU19PU0NfQkdfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NMS19CVUZGX0VOMV0gPSBUT01UT01fQV9DTEtfQlVGRl9FTjFfX1BPUiwKKwlbVE9NVE9NX0FfQ0xLX0JVRkZfRU4yXSA9IFRPTVRPTV9BX0NMS19CVUZGX0VOMl9fUE9SLAorCVtUT01UT01fQV9MRE9fTF9NT0RFXzFdID0gVE9NVE9NX0FfTERPX0xfTU9ERV8xX19QT1IsCisJW1RPTVRPTV9BX0xET19MX01PREVfMl0gPSBUT01UT01fQV9MRE9fTF9NT0RFXzJfX1BPUiwKKwlbVE9NVE9NX0FfTERPX0xfQ1RSTF8xXSA9IFRPTVRPTV9BX0xET19MX0NUUkxfMV9fUE9SLAorCVtUT01UT01fQV9MRE9fTF9DVFJMXzJdID0gVE9NVE9NX0FfTERPX0xfQ1RSTF8yX19QT1IsCisJW1RPTVRPTV9BX0xET19MX0NUUkxfM10gPSBUT01UT01fQV9MRE9fTF9DVFJMXzNfX1BPUiwKKwlbVE9NVE9NX0FfTERPX0xfQ1RSTF80XSA9IFRPTVRPTV9BX0xET19MX0NUUkxfNF9fUE9SLAorCVtUT01UT01fQV9MRE9fSF9NT0RFXzFdID0gVE9NVE9NX0FfTERPX0hfTU9ERV8xX19QT1IsCisJW1RPTVRPTV9BX0xET19IX01PREVfMl0gPSBUT01UT01fQV9MRE9fSF9NT0RFXzJfX1BPUiwKKwlbVE9NVE9NX0FfTERPX0hfTE9PUF9DVExdID0gVE9NVE9NX0FfTERPX0hfTE9PUF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfTERPX0hfQ09NUF8xXSA9IFRPTVRPTV9BX0xET19IX0NPTVBfMV9fUE9SLAorCVtUT01UT01fQV9MRE9fSF9DT01QXzJdID0gVE9NVE9NX0FfTERPX0hfQ09NUF8yX19QT1IsCisJW1RPTVRPTV9BX0xET19IX0JJQVNfMV0gPSBUT01UT01fQV9MRE9fSF9CSUFTXzFfX1BPUiwKKwlbVE9NVE9NX0FfTERPX0hfQklBU18yXSA9IFRPTVRPTV9BX0xET19IX0JJQVNfMl9fUE9SLAorCVtUT01UT01fQV9MRE9fSF9CSUFTXzNdID0gVE9NVE9NX0FfTERPX0hfQklBU18zX19QT1IsCisJW1RPTVRPTV9BX1ZCQVRfQ0xLXSA9IFRPTVRPTV9BX1ZCQVRfQ0xLX19QT1IsCisJW1RPTVRPTV9BX1ZCQVRfTE9PUF0gPSBUT01UT01fQV9WQkFUX0xPT1BfX1BPUiwKKwlbVE9NVE9NX0FfVkJBVF9SRUZdID0gVE9NVE9NX0FfVkJBVF9SRUZfX1BPUiwKKwlbVE9NVE9NX0FfVkJBVF9BRENfVEVTVF0gPSBUT01UT01fQV9WQkFUX0FEQ19URVNUX19QT1IsCisJW1RPTVRPTV9BX1ZCQVRfRkVdID0gVE9NVE9NX0FfVkJBVF9GRV9fUE9SLAorCVtUT01UT01fQV9WQkFUX0JJQVNfMV0gPSBUT01UT01fQV9WQkFUX0JJQVNfMV9fUE9SLAorCVtUT01UT01fQV9WQkFUX0JJQVNfMl0gPSBUT01UT01fQV9WQkFUX0JJQVNfMl9fUE9SLAorCVtUT01UT01fQV9WQkFUX0FEQ19EQVRBX01TQl0gPSBUT01UT01fQV9WQkFUX0FEQ19EQVRBX01TQl9fUE9SLAorCVtUT01UT01fQV9WQkFUX0FEQ19EQVRBX0xTQl0gPSBUT01UT01fQV9WQkFUX0FEQ19EQVRBX0xTQl9fUE9SLAorCVtUT01UT01fQV9GTExfTlJFRl0gPSBUT01UT01fQV9GTExfTlJFRl9fUE9SLAorCVtUT01UT01fQV9GTExfS0RDT19UVU5FXSA9IFRPTVRPTV9BX0ZMTF9LRENPX1RVTkVfX1BPUiwKKwlbVE9NVE9NX0FfRkxMX0xPQ0tfVEhSRVNIXSA9IFRPTVRPTV9BX0ZMTF9MT0NLX1RIUkVTSF9fUE9SLAorCVtUT01UT01fQV9GTExfTE9DS19ERVRfQ09VTlRdID0gVE9NVE9NX0FfRkxMX0xPQ0tfREVUX0NPVU5UX19QT1IsCisJW1RPTVRPTV9BX0ZMTF9EQUNfVEhSRVNIT0xEXSA9IFRPTVRPTV9BX0ZMTF9EQUNfVEhSRVNIT0xEX19QT1IsCisJW1RPTVRPTV9BX0ZMTF9URVNUX0RDT19GUkVFUlVOXSA9IFRPTVRPTV9BX0ZMTF9URVNUX0RDT19GUkVFUlVOX19QT1IsCisJW1RPTVRPTV9BX0ZMTF9URVNUX0VOQUJMRV0gPSBUT01UT01fQV9GTExfVEVTVF9FTkFCTEVfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8xX0NUTF0gPSBUT01UT01fQV9NSUNCX0NGSUxUXzFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfMV9WQUxdID0gVE9NVE9NX0FfTUlDQl9DRklMVF8xX1ZBTF9fUE9SLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzFfUFJFQ0hSR10gPSBUT01UT01fQV9NSUNCX0NGSUxUXzFfUFJFQ0hSR19fUE9SLAorCVtUT01UT01fQV9NSUNCXzFfQ1RMXSA9IFRPTVRPTV9BX01JQ0JfMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl8xX0lOVF9SQklBU10gPSBUT01UT01fQV9NSUNCXzFfSU5UX1JCSUFTX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfMV9NQkhDXSA9IFRPTVRPTV9BX01JQ0JfMV9NQkhDX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9DVExdID0gVE9NVE9NX0FfTUlDQl9DRklMVF8yX0NUTF9fUE9SLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzJfVkFMXSA9IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUxfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8yX1BSRUNIUkddID0gVE9NVE9NX0FfTUlDQl9DRklMVF8yX1BSRUNIUkdfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl8yX0NUTF0gPSBUT01UT01fQV9NSUNCXzJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfMl9JTlRfUkJJQVNdID0gVE9NVE9NX0FfTUlDQl8yX0lOVF9SQklBU19fUE9SLAorCVtUT01UT01fQV9NSUNCXzJfTUJIQ10gPSBUT01UT01fQV9NSUNCXzJfTUJIQ19fUE9SLAorCVtUT01UT01fQV9NSUNCX0NGSUxUXzNfQ1RMXSA9IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTF0gPSBUT01UT01fQV9NSUNCX0NGSUxUXzNfVkFMX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfQ0ZJTFRfM19QUkVDSFJHXSA9IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfM19QUkVDSFJHX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfM19DVExdID0gVE9NVE9NX0FfTUlDQl8zX0NUTF9fUE9SLAorCVtUT01UT01fQV9NSUNCXzNfSU5UX1JCSUFTXSA9IFRPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVNfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl8zX01CSENdID0gVE9NVE9NX0FfTUlDQl8zX01CSENfX1BPUiwKKwlbVE9NVE9NX0FfTUlDQl80X0NUTF0gPSBUT01UT01fQV9NSUNCXzRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX01JQ0JfNF9JTlRfUkJJQVNdID0gVE9NVE9NX0FfTUlDQl80X0lOVF9SQklBU19fUE9SLAorCVtUT01UT01fQV9NSUNCXzRfTUJIQ10gPSBUT01UT01fQV9NSUNCXzRfTUJIQ19fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjJfRU5dID0gVE9NVE9NX0FfU1BLUl9EUlYyX0VOX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9HQUlOXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9HQUlOX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9EQUNfQ1RMXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9EQUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9PQ1BfQ1RMXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9PQ1BfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9DTElQX0RFVF0gPSBUT01UT01fQV9TUEtSX0RSVjJfQ0xJUF9ERVRfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19EQUNdID0gVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19EQUNfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0RCR19QQV0gPSBUT01UT01fQV9TUEtSX0RSVjJfREJHX1BBX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUFdSU1RHXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9EQkdfUFdSU1RHX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0xET10gPSBUT01UT01fQV9TUEtSX0RSVjJfQklBU19MRE9fX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYyX0JJQVNfSU5UXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9CSUFTX0lOVF9fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjJfQklBU19QQV0gPSBUT01UT01fQV9TUEtSX0RSVjJfQklBU19QQV9fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjJfU1RBVFVTX09DUF0gPSBUT01UT01fQV9TUEtSX0RSVjJfU1RBVFVTX09DUF9fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjJfU1RBVFVTX1BBXSA9IFRPTVRPTV9BX1NQS1JfRFJWMl9TVEFUVVNfUEFfX1BPUiwKKwlbVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUXSA9IFRPTVRPTV9BX01CSENfSU5TRVJUX0RFVEVDVF9fUE9SLAorCVtUT01UT01fQV9NQkhDX0lOU0VSVF9ERVRfU1RBVFVTXSA9CisJCQkJVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVUX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9UWF9DT01fQklBU10gPSBUT01UT01fQV9UWF9DT01fQklBU19fUE9SLAorCVtUT01UT01fQV9NQkhDX0lOU0VSVF9ERVRFQ1QyXSA9IFRPTVRPTV9BX01CSENfSU5TRVJUX0RFVEVDVDJfX1BPUiwKKwlbVE9NVE9NX0FfTUJIQ19TQ0FMSU5HX01VWF8xXSA9IFRPTVRPTV9BX01CSENfU0NBTElOR19NVVhfMV9fUE9SLAorCVtUT01UT01fQV9NQkhDX1NDQUxJTkdfTVVYXzJdID0gVE9NVE9NX0FfTUJIQ19TQ0FMSU5HX01VWF8yX19QT1IsCisJW1RPTVRPTV9BX01BRF9BTkFfQ1RSTF0gPSBUT01UT01fQV9NQURfQU5BX0NUUkxfX1BPUiwKKwlbVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzFdID0gVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzFfX1BPUiwKKwlbVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzJdID0gVE9NVE9NX0FfVFhfU1VQX1NXSVRDSF9DVFJMXzJfX1BPUiwKKwlbVE9NVE9NX0FfVFhfMV9HQUlOXSA9IFRPTVRPTV9BX1RYXzFfR0FJTl9fUE9SLAorCVtUT01UT01fQV9UWF8xXzJfVEVTVF9FTl0gPSBUT01UT01fQV9UWF8xXzJfVEVTVF9FTl9fUE9SLAorCVtUT01UT01fQV9UWF8yX0dBSU5dID0gVE9NVE9NX0FfVFhfMl9HQUlOX19QT1IsCisJW1RPTVRPTV9BX1RYXzFfMl9BRENfSUJdID0gVE9NVE9NX0FfVFhfMV8yX0FEQ19JQl9fUE9SLAorCVtUT01UT01fQV9UWF8xXzJfQVRFU1RfUkVGQ1RSTF0gPSBUT01UT01fQV9UWF8xXzJfQVRFU1RfUkVGQ1RSTF9fUE9SLAorCVtUT01UT01fQV9UWF8xXzJfVEVTVF9DVExdID0gVE9NVE9NX0FfVFhfMV8yX1RFU1RfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1RYXzFfMl9URVNUX0JMT0NLX0VOXSA9IFRPTVRPTV9BX1RYXzFfMl9URVNUX0JMT0NLX0VOX19QT1IsCisJW1RPTVRPTV9BX1RYXzFfMl9UWEZFX0NMS0RJVl0gPSBUT01UT01fQV9UWF8xXzJfVFhGRV9DTEtESVZfX1BPUiwKKwlbVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gxXSA9IFRPTVRPTV9BX1RYXzFfMl9TQVJfRVJSX0NIMV9fUE9SLAorCVtUT01UT01fQV9UWF8xXzJfU0FSX0VSUl9DSDJdID0gVE9NVE9NX0FfVFhfMV8yX1NBUl9FUlJfQ0gyX19QT1IsCisJW1RPTVRPTV9BX1RYXzNfR0FJTl0gPSBUT01UT01fQV9UWF8zX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfVFhfM180X1RFU1RfRU5dID0gVE9NVE9NX0FfVFhfM180X1RFU1RfRU5fX1BPUiwKKwlbVE9NVE9NX0FfVFhfNF9HQUlOXSA9IFRPTVRPTV9BX1RYXzRfR0FJTl9fUE9SLAorCVtUT01UT01fQV9UWF8zXzRfQURDX0lCXSA9IFRPTVRPTV9BX1RYXzNfNF9BRENfSUJfX1BPUiwKKwlbVE9NVE9NX0FfVFhfM180X0FURVNUX1JFRkNUUkxdID0gVE9NVE9NX0FfVFhfM180X0FURVNUX1JFRkNUUkxfX1BPUiwKKwlbVE9NVE9NX0FfVFhfM180X1RFU1RfQ1RMXSA9IFRPTVRPTV9BX1RYXzNfNF9URVNUX0NUTF9fUE9SLAorCVtUT01UT01fQV9UWF8zXzRfVEVTVF9CTE9DS19FTl0gPSBUT01UT01fQV9UWF8zXzRfVEVTVF9CTE9DS19FTl9fUE9SLAorCVtUT01UT01fQV9UWF8zXzRfVFhGRV9DS0RJVl0gPSBUT01UT01fQV9UWF8zXzRfVFhGRV9DS0RJVl9fUE9SLAorCVtUT01UT01fQV9UWF8zXzRfU0FSX0VSUl9DSDNdID0gVE9NVE9NX0FfVFhfM180X1NBUl9FUlJfQ0gzX19QT1IsCisJW1RPTVRPTV9BX1RYXzNfNF9TQVJfRVJSX0NINF0gPSBUT01UT01fQV9UWF8zXzRfU0FSX0VSUl9DSDRfX1BPUiwKKwlbVE9NVE9NX0FfVFhfNV9HQUlOXSA9IFRPTVRPTV9BX1RYXzVfR0FJTl9fUE9SLAorCVtUT01UT01fQV9UWF81XzZfVEVTVF9FTl0gPSBUT01UT01fQV9UWF81XzZfVEVTVF9FTl9fUE9SLAorCVtUT01UT01fQV9UWF82X0dBSU5dID0gVE9NVE9NX0FfVFhfNl9HQUlOX19QT1IsCisJW1RPTVRPTV9BX1RYXzVfNl9BRENfSUJdID0gVE9NVE9NX0FfVFhfNV82X0FEQ19JQl9fUE9SLAorCVtUT01UT01fQV9UWF81XzZfQVRFU1RfUkVGQ1RSTF0gPSBUT01UT01fQV9UWF81XzZfQVRFU1RfUkVGQ1RSTF9fUE9SLAorCVtUT01UT01fQV9UWF81XzZfVEVTVF9DVExdID0gVE9NVE9NX0FfVFhfNV82X1RFU1RfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1RYXzVfNl9URVNUX0JMT0NLX0VOXSA9IFRPTVRPTV9BX1RYXzVfNl9URVNUX0JMT0NLX0VOX19QT1IsCisJW1RPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWXSA9IFRPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWX19QT1IsCisJW1RPTVRPTV9BX1RYXzVfNl9TQVJfRVJSX0NINV0gPSBUT01UT01fQV9UWF81XzZfU0FSX0VSUl9DSDVfX1BPUiwKKwlbVE9NVE9NX0FfVFhfNV82X1NBUl9FUlJfQ0g2XSA9IFRPTVRPTV9BX1RYXzVfNl9TQVJfRVJSX0NINl9fUE9SLAorCVtUT01UT01fQV9UWF83X01CSENfRU5dID0gVE9NVE9NX0FfVFhfN19NQkhDX0VOX19QT1IsCisJW1RPTVRPTV9BX1RYXzdfTUJIQ19BVEVTVF9SRUZDVFJMXSA9CisJCQkJVE9NVE9NX0FfVFhfN19NQkhDX0FURVNUX1JFRkNUUkxfX1BPUiwKKwlbVE9NVE9NX0FfVFhfN19NQkhDX0FEQ10gPSBUT01UT01fQV9UWF83X01CSENfQURDX19QT1IsCisJW1RPTVRPTV9BX1RYXzdfTUJIQ19URVNUX0NUTF0gPSBUT01UT01fQV9UWF83X01CSENfVEVTVF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfVFhfN19NQkhDX1NBUl9FUlJdID0gVE9NVE9NX0FfVFhfN19NQkhDX1NBUl9FUlJfX1BPUiwKKwlbVE9NVE9NX0FfVFhfN19UWEZFX0NMS0RJVl0gPSBUT01UT01fQV9UWF83X1RYRkVfQ0xLRElWX19QT1IsCisJW1RPTVRPTV9BX1JDT19DVFJMXSA9IFRPTVRPTV9BX1JDT19DVFJMX19QT1IsCisJW1RPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMV0gPSBUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fQ1RSTDFfX1BPUiwKKwlbVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwyXSA9IFRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9DVFJMMl9fUE9SLAorCVtUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fQ1RSTDNdID0gVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX0NUUkwzX19QT1IsCisJW1RPTVRPTV9BX1JDT19URVNUX0NUUkxdID0gVE9NVE9NX0FfUkNPX1RFU1RfQ1RSTF9fUE9SLAorCVtUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fUkVTVUxUMV0gPQorCQkJCVRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9SRVNVTFQxX19QT1IsCisJW1RPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9SRVNVTFQyXSA9CisJCQkJVE9NVE9NX0FfUkNPX0NBTElCUkFUSU9OX1JFU1VMVDJfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19NT0RFXzFdID0gVE9NVE9NX0FfQlVDS19NT0RFXzFfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19NT0RFXzJdID0gVE9NVE9NX0FfQlVDS19NT0RFXzJfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19NT0RFXzNdID0gVE9NVE9NX0FfQlVDS19NT0RFXzNfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19NT0RFXzRdID0gVE9NVE9NX0FfQlVDS19NT0RFXzRfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19NT0RFXzVdID0gVE9NVE9NX0FfQlVDS19NT0RFXzVfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8xXSA9IFRPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfMV9fUE9SLAorCVtUT01UT01fQV9CVUNLX0NUUkxfVkNMXzJdID0gVE9NVE9NX0FfQlVDS19DVFJMX1ZDTF8yX19QT1IsCisJW1RPTVRPTV9BX0JVQ0tfQ1RSTF9WQ0xfM10gPSBUT01UT01fQV9CVUNLX0NUUkxfVkNMXzNfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8xXSA9IFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfMV9fUE9SLAorCVtUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzJdID0gVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8yX19QT1IsCisJW1RPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfM10gPSBUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzNfX1BPUiwKKwlbVE9NVE9NX0FfQlVDS19DVFJMX0NDTF80XSA9IFRPTVRPTV9BX0JVQ0tfQ1RSTF9DQ0xfNF9fUE9SLAorCVtUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMV0gPSBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMV9fUE9SLAorCVtUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMl0gPSBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfMl9fUE9SLAorCVtUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfM10gPSBUT01UT01fQV9CVUNLX0NUUkxfUFdNX0RSVlJfM19fUE9SLAorCVtUT01UT01fQV9CVUNLX1RNVVhfQV9EXSA9IFRPTVRPTV9BX0JVQ0tfVE1VWF9BX0RfX1BPUiwKKwlbVE9NVE9NX0FfTkNQX0JVQ0tSRUZdID0gVE9NVE9NX0FfTkNQX0JVQ0tSRUZfX1BPUiwKKwlbVE9NVE9NX0FfTkNQX0VOXSA9IFRPTVRPTV9BX05DUF9FTl9fUE9SLAorCVtUT01UT01fQV9OQ1BfQ0xLXSA9IFRPTVRPTV9BX05DUF9DTEtfX1BPUiwKKwlbVE9NVE9NX0FfTkNQX1NUQVRJQ10gPSBUT01UT01fQV9OQ1BfU1RBVElDX19QT1IsCisJW1RPTVRPTV9BX05DUF9WVEhfTE9XXSA9IFRPTVRPTV9BX05DUF9WVEhfTE9XX19QT1IsCisJW1RPTVRPTV9BX05DUF9WVEhfSElHSF0gPSBUT01UT01fQV9OQ1BfVlRIX0hJR0hfX1BPUiwKKwlbVE9NVE9NX0FfTkNQX0FURVNUXSA9IFRPTVRPTV9BX05DUF9BVEVTVF9fUE9SLAorCVtUT01UT01fQV9OQ1BfRFRFU1RdID0gVE9NVE9NX0FfTkNQX0RURVNUX19QT1IsCisJW1RPTVRPTV9BX05DUF9ETFkxXSA9IFRPTVRPTV9BX05DUF9ETFkxX19QT1IsCisJW1RPTVRPTV9BX05DUF9ETFkyXSA9IFRPTVRPTV9BX05DUF9ETFkyX19QT1IsCisJW1RPTVRPTV9BX1JYX0FVWF9TV19DVExdID0gVE9NVE9NX0FfUlhfQVVYX1NXX0NUTF9fUE9SLAorCVtUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTl0gPSBUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTl9fUE9SLAorCVtUT01UT01fQV9SWF9DT01fVElNRVJfRElWXSA9IFRPTVRPTV9BX1JYX0NPTV9USU1FUl9ESVZfX1BPUiwKKwlbVE9NVE9NX0FfUlhfQ09NX09DUF9DVExdID0gVE9NVE9NX0FfUlhfQ09NX09DUF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfUlhfQ09NX09DUF9DT1VOVF0gPSBUT01UT01fQV9SWF9DT01fT0NQX0NPVU5UX19QT1IsCisJW1RPTVRPTV9BX1JYX0NPTV9EQUNfQ1RMXSA9IFRPTVRPTV9BX1JYX0NPTV9EQUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0NPTV9CSUFTXSA9IFRPTVRPTV9BX1JYX0NPTV9CSUFTX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9BVVRPX0NIT1BdID0gVE9NVE9NX0FfUlhfSFBIX0FVVE9fQ0hPUF9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfQ0hPUF9DVExdID0gVE9NVE9NX0FfUlhfSFBIX0NIT1BfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9CSUFTX1BBXSA9IFRPTVRPTV9BX1JYX0hQSF9CSUFTX1BBX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9CSUFTX0xET10gPSBUT01UT01fQV9SWF9IUEhfQklBU19MRE9fX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX0JJQVNfQ05QXSA9IFRPTVRPTV9BX1JYX0hQSF9CSUFTX0NOUF9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfQklBU19XR19PQ1BdID0gVE9NVE9NX0FfUlhfSFBIX0JJQVNfV0dfT0NQX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMXSA9IFRPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9DTlBfRU5dID0gVE9NVE9NX0FfUlhfSFBIX0NOUF9FTl9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfQ05QX1dHX0NUTF0gPSBUT01UT01fQV9SWF9IUEhfQ05QX1dHX0NUTF9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfQ05QX1dHX1RJTUVdID0gVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19USU1FX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9MX0dBSU5dID0gVE9NVE9NX0FfUlhfSFBIX0xfR0FJTl9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfTF9URVNUXSA9IFRPTVRPTV9BX1JYX0hQSF9MX1RFU1RfX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX0xfUEFfQ1RMXSA9IFRPTVRPTV9BX1JYX0hQSF9MX1BBX0NUTF9fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfTF9EQUNfQ1RMXSA9IFRPTVRPTV9BX1JYX0hQSF9MX0RBQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX0xfQVRFU1RdID0gVE9NVE9NX0FfUlhfSFBIX0xfQVRFU1RfX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX0xfU1RBVFVTXSA9IFRPTVRPTV9BX1JYX0hQSF9MX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9SWF9IUEhfUl9HQUlOXSA9IFRPTVRPTV9BX1JYX0hQSF9SX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX1JfVEVTVF0gPSBUT01UT01fQV9SWF9IUEhfUl9URVNUX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9SX1BBX0NUTF0gPSBUT01UT01fQV9SWF9IUEhfUl9QQV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTF0gPSBUT01UT01fQV9SWF9IUEhfUl9EQUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9SX0FURVNUXSA9IFRPTVRPTV9BX1JYX0hQSF9SX0FURVNUX19QT1IsCisJW1RPTVRPTV9BX1JYX0hQSF9SX1NUQVRVU10gPSBUT01UT01fQV9SWF9IUEhfUl9TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfUlhfRUFSX0JJQVNfUEFdID0gVE9NVE9NX0FfUlhfRUFSX0JJQVNfUEFfX1BPUiwKKwlbVE9NVE9NX0FfUlhfRUFSX0JJQVNfQ01CVUZGXSA9IFRPTVRPTV9BX1JYX0VBUl9CSUFTX0NNQlVGRl9fUE9SLAorCVtUT01UT01fQV9SWF9FQVJfRU5dID0gVE9NVE9NX0FfUlhfRUFSX0VOX19QT1IsCisJW1RPTVRPTV9BX1JYX0VBUl9HQUlOXSA9IFRPTVRPTV9BX1JYX0VBUl9HQUlOX19QT1IsCisJW1RPTVRPTV9BX1JYX0VBUl9DTUJVRkZdID0gVE9NVE9NX0FfUlhfRUFSX0NNQlVGRl9fUE9SLAorCVtUT01UT01fQV9SWF9FQVJfSUNUTF0gPSBUT01UT01fQV9SWF9FQVJfSUNUTF9fUE9SLAorCVtUT01UT01fQV9SWF9FQVJfQ0NPTVBdID0gVE9NVE9NX0FfUlhfRUFSX0NDT01QX19QT1IsCisJW1RPTVRPTV9BX1JYX0VBUl9WQ01dID0gVE9NVE9NX0FfUlhfRUFSX1ZDTV9fUE9SLAorCVtUT01UT01fQV9SWF9FQVJfQ05QXSA9IFRPTVRPTV9BX1JYX0VBUl9DTlBfX1BPUiwKKwlbVE9NVE9NX0FfUlhfRUFSX0RBQ19DVExfQVRFU1RdID0gVE9NVE9NX0FfUlhfRUFSX0RBQ19DVExfQVRFU1RfX1BPUiwKKwlbVE9NVE9NX0FfUlhfRUFSX1NUQVRVU10gPSBUT01UT01fQV9SWF9FQVJfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfQklBU19QQV0gPSBUT01UT01fQV9SWF9MSU5FX0JJQVNfUEFfX1BPUiwKKwlbVE9NVE9NX0FfUlhfQlVDS19CSUFTMV0gPSBUT01UT01fQV9SWF9CVUNLX0JJQVMxX19QT1IsCisJW1RPTVRPTV9BX1JYX0JVQ0tfQklBUzJdID0gVE9NVE9NX0FfUlhfQlVDS19CSUFTMl9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FX0NPTV0gPSBUT01UT01fQV9SWF9MSU5FX0NPTV9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FX0NOUF9FTl0gPSBUT01UT01fQV9SWF9MSU5FX0NOUF9FTl9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FX0NOUF9XR19DVExdID0gVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfQ05QX1dHX1RJTUVdID0gVE9NVE9NX0FfUlhfTElORV9DTlBfV0dfVElNRV9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzFfR0FJTl0gPSBUT01UT01fQV9SWF9MSU5FXzFfR0FJTl9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzFfVEVTVF0gPSBUT01UT01fQV9SWF9MSU5FXzFfVEVTVF9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzFfREFDX0NUTF0gPSBUT01UT01fQV9SWF9MSU5FXzFfREFDX0NUTF9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzFfU1RBVFVTXSA9IFRPTVRPTV9BX1JYX0xJTkVfMV9TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfUlhfTElORV8yX0dBSU5dID0gVE9NVE9NX0FfUlhfTElORV8yX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfUlhfTElORV8yX1RFU1RdID0gVE9NVE9NX0FfUlhfTElORV8yX1RFU1RfX1BPUiwKKwlbVE9NVE9NX0FfUlhfTElORV8yX0RBQ19DVExdID0gVE9NVE9NX0FfUlhfTElORV8yX0RBQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfUlhfTElORV8yX1NUQVRVU10gPSBUT01UT01fQV9SWF9MSU5FXzJfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19HQUlOXSA9IFRPTVRPTV9BX1JYX0xJTkVfM19HQUlOX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19URVNUXSA9IFRPTVRPTV9BX1JYX0xJTkVfM19URVNUX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19EQUNfQ1RMXSA9IFRPTVRPTV9BX1JYX0xJTkVfM19EQUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1JYX0xJTkVfM19TVEFUVVNdID0gVE9NVE9NX0FfUlhfTElORV8zX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzRfR0FJTl0gPSBUT01UT01fQV9SWF9MSU5FXzRfR0FJTl9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzRfVEVTVF0gPSBUT01UT01fQV9SWF9MSU5FXzRfVEVTVF9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzRfREFDX0NUTF0gPSBUT01UT01fQV9SWF9MSU5FXzRfREFDX0NUTF9fUE9SLAorCVtUT01UT01fQV9SWF9MSU5FXzRfU1RBVFVTXSA9IFRPTVRPTV9BX1JYX0xJTkVfNF9TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfUlhfTElORV9DTlBfREJHXSA9IFRPTVRPTV9BX1JYX0xJTkVfQ05QX0RCR19fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjFfRU5dID0gVE9NVE9NX0FfU1BLUl9EUlYxX0VOX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9HQUlOXSA9IFRPTVRPTV9BX1NQS1JfRFJWMV9HQUlOX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQUNfQ1RMXSA9IFRPTVRPTV9BX1NQS1JfRFJWMV9EQUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMXSA9IFRPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9DTElQX0RFVF0gPSBUT01UT01fQV9TUEtSX0RSVjFfQ0xJUF9ERVRfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX0lFQ10gPSBUT01UT01fQV9TUEtSX0RSVjFfSUVDX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQkdfREFDXSA9IFRPTVRPTV9BX1NQS1JfRFJWMV9EQkdfREFDX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9EQkdfUEFdID0gVE9NVE9NX0FfU1BLUl9EUlYxX0RCR19QQV9fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjFfREJHX1BXUlNUR10gPSBUT01UT01fQV9TUEtSX0RSVjFfREJHX1BXUlNUR19fUE9SLAorCVtUT01UT01fQV9TUEtSX0RSVjFfQklBU19MRE9dID0gVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfTERPX19QT1IsCisJW1RPTVRPTV9BX1NQS1JfRFJWMV9CSUFTX0lOVF0gPSBUT01UT01fQV9TUEtSX0RSVjFfQklBU19JTlRfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfUEFdID0gVE9NVE9NX0FfU1BLUl9EUlYxX0JJQVNfUEFfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19PQ1BdID0gVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19PQ1BfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUl9EUlYxX1NUQVRVU19QQV0gPSBUT01UT01fQV9TUEtSX0RSVjFfU1RBVFVTX1BBX19QT1IsCisJW1RPTVRPTV9BX1NQS1IxX1BST1RfRU5dID0gVE9NVE9NX0FfU1BLUjFfUFJPVF9FTl9fUE9SLAorCVtUT01UT01fQV9TUEtSMV9QUk9UX0FEQ19URVNUX0VOXSA9CisJCQkJVE9NVE9NX0FfU1BLUjFfUFJPVF9BRENfVEVTVF9FTl9fUE9SLAorCVtUT01UT01fQV9TUEtSMV9QUk9UX0FURVNUXSA9IFRPTVRPTV9BX1NQS1IxX1BST1RfQVRFU1RfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUjFfUFJPVF9MRE9fQ1RSTF0gPSBUT01UT01fQV9TUEtSMV9QUk9UX0xET19DVFJMX19QT1IsCisJW1RPTVRPTV9BX1NQS1IxX1BST1RfSVNFTlNFX0NUUkxdID0KKwkJCQlUT01UT01fQV9TUEtSMV9QUk9UX0lTRU5TRV9DVFJMX19QT1IsCisJW1RPTVRPTV9BX1NQS1IxX1BST1RfVlNFTlNFX0NUUkxdID0KKwkJCQlUT01UT01fQV9TUEtSMV9QUk9UX1ZTRU5TRV9DVFJMX19QT1IsCisJW1RPTVRPTV9BX1NQS1IyX1BST1RfRU5dID0gVE9NVE9NX0FfU1BLUjJfUFJPVF9FTl9fUE9SLAorCVtUT01UT01fQV9TUEtSMl9QUk9UX0FEQ19URVNUX0VOXSA9CisJCQkJVE9NVE9NX0FfU1BLUjJfUFJPVF9BRENfVEVTVF9FTl9fUE9SLAorCVtUT01UT01fQV9TUEtSMl9QUk9UX0FURVNUXSA9IFRPTVRPTV9BX1NQS1IyX1BST1RfQVRFU1RfX1BPUiwKKwlbVE9NVE9NX0FfU1BLUjJfUFJPVF9MRE9fQ1RSTF0gPSBUT01UT01fQV9TUEtSMl9QUk9UX0xET19DVFJMX19QT1IsCisJW1RPTVRPTV9BX1NQS1IyX1BST1RfSVNFTlNFX0NUUkxdID0KKwkJCQlUT01UT01fQV9TUEtSMl9QUk9UX0lTRU5TRV9DVFJMX19QT1IsCisJW1RPTVRPTV9BX1NQS1IyX1BST1RfVlNFTlNFX0NUUkxdID0KKwkJCQlUT01UT01fQV9TUEtSMl9QUk9UX1ZTRU5TRV9DVFJMX19QT1IsCisJW1RPTVRPTV9BX01CSENfSFBIXSA9IFRPTVRPTV9BX01CSENfSFBIX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMV9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMyX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMV9TSElGVF0gPSBUT01UT01fQV9DRENfQU5DMV9TSElGVF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMl9TSElGVF0gPSBUT01UT01fQV9DRENfQU5DMl9TSElGVF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMV9JSVJfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMxX0lJUl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMl9JSVJfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0lJUl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMl9JSVJfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMyX0lJUl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IzX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMV9JSVJfQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMyX0lJUl9CM19DVExdID0gVE9NVE9NX0FfQ0RDX0FOQzJfSUlSX0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMV9MUEZfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfTFBGX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMl9MUEZfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0xQRl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0FOQzFfTFBGX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMl9MUEZfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMyX0xQRl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfU1BBUkVdID0gVE9NVE9NX0FfQ0RDX0FOQzFfU1BBUkVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfU1BBUkVdID0gVE9NVE9NX0FfQ0RDX0FOQzJfU1BBUkVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzFfU01MUEZfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMxX1NNTFBGX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMl9TTUxQRl9DVExdID0gVE9NVE9NX0FfQ0RDX0FOQzJfU01MUEZfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMxX0RDRkxUX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMV9EQ0ZMVF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0FOQzJfRENGTFRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19BTkMyX0RDRkxUX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMV9HQUlOX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMV9HQUlOX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMl9HQUlOX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMl9HQUlOX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQU5DMV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0FOQzFfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19BTkMyX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQU5DMl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMV9WT0xfQ1RMX1RJTUVSXSA9IFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9USU1FUl9fUE9SLAorCVtUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfVElNRVJdID0gVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX1RJTUVSX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9USU1FUl0gPSBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfVElNRVJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNF9WT0xfQ1RMX1RJTUVSXSA9IFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9USU1FUl9fUE9SLAorCVtUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfVElNRVJdID0gVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX1RJTUVSX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9USU1FUl0gPSBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfVElNRVJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYN19WT0xfQ1RMX1RJTUVSXSA9IFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9USU1FUl9fUE9SLAorCVtUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfVElNRVJdID0gVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX1RJTUVSX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9USU1FUl0gPSBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfVElNRVJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMTBfVk9MX0NUTF9USU1FUl0gPQorCQkJCVRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfVElNRVJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMV9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYMV9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNF9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYNF9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYN19WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYN19WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0dBSU5dID0gVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0dBSU5fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMTBfVk9MX0NUTF9HQUlOXSA9IFRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTl9fUE9SLAorCVtUT01UT01fQV9DRENfVFgxX1ZPTF9DVExfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0NGR10gPSBUT01UT01fQV9DRENfVFgyX1ZPTF9DVExfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9DRkddID0gVE9NVE9NX0FfQ0RDX1RYM19WT0xfQ1RMX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfVFg0X1ZPTF9DVExfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9DRkdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0NGR10gPSBUT01UT01fQV9DRENfVFg1X1ZPTF9DVExfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9DRkddID0gVE9NVE9NX0FfQ0RDX1RYNl9WT0xfQ1RMX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfVFg3X1ZPTF9DVExfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9DRkdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0NGR10gPSBUT01UT01fQV9DRENfVFg4X1ZPTF9DVExfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9DRkddID0gVE9NVE9NX0FfQ0RDX1RYOV9WT0xfQ1RMX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0NGR10gPSBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfVFgxX01VWF9DVExdID0gVE9NVE9NX0FfQ0RDX1RYMV9NVVhfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDJfTVVYX0NUTF0gPSBUT01UT01fQV9DRENfVFgyX01VWF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYM19NVVhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDNfTVVYX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg0X01VWF9DVExdID0gVE9NVE9NX0FfQ0RDX1RYNF9NVVhfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDVfTVVYX0NUTF0gPSBUT01UT01fQV9DRENfVFg1X01VWF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNl9NVVhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDZfTVVYX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg3X01VWF9DVExdID0gVE9NVE9NX0FfQ0RDX1RYN19NVVhfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDhfTVVYX0NUTF0gPSBUT01UT01fQV9DRENfVFg4X01VWF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYOV9NVVhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDlfTVVYX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDEwX01VWF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMV9DTEtfRlNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDFfQ0xLX0ZTX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFgyX0NMS19GU19DVExdID0gVE9NVE9NX0FfQ0RDX1RYMl9DTEtfRlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDNfQ0xLX0ZTX0NUTF0gPSBUT01UT01fQV9DRENfVFgzX0NMS19GU19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNF9DTEtfRlNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDRfQ0xLX0ZTX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg1X0NMS19GU19DVExdID0gVE9NVE9NX0FfQ0RDX1RYNV9DTEtfRlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDZfQ0xLX0ZTX0NUTF0gPSBUT01UT01fQV9DRENfVFg2X0NMS19GU19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYN19DTEtfRlNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDdfQ0xLX0ZTX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg4X0NMS19GU19DVExdID0gVE9NVE9NX0FfQ0RDX1RYOF9DTEtfRlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDlfQ0xLX0ZTX0NUTF0gPSBUT01UT01fQV9DRENfVFg5X0NMS19GU19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYMTBfQ0xLX0ZTX0NUTF0gPSBUT01UT01fQV9DRENfVFgxMF9DTEtfRlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDFfRE1JQ19DVExdID0gVE9NVE9NX0FfQ0RDX1RYMV9ETUlDX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFgyX0RNSUNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDJfRE1JQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYM19ETUlDX0NUTF0gPSBUT01UT01fQV9DRENfVFgzX0RNSUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDRfRE1JQ19DVExdID0gVE9NVE9NX0FfQ0RDX1RYNF9ETUlDX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg1X0RNSUNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDVfRE1JQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYNl9ETUlDX0NUTF0gPSBUT01UT01fQV9DRENfVFg2X0RNSUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDdfRE1JQ19DVExdID0gVE9NVE9NX0FfQ0RDX1RYN19ETUlDX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfVFg4X0RNSUNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDhfRE1JQ19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RYOV9ETUlDX0NUTF0gPSBUT01UT01fQV9DRENfVFg5X0RNSUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19UWDEwX0RNSUNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19UWDEwX0RNSUNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMF0gPSBUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDBfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwxXSA9IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMV9fUE9SLAorCVtUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDJdID0gVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyX19QT1IsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMM10gPSBUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw0XSA9IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNF9fUE9SLAorCVtUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDVdID0gVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1X19QT1IsCisJW1RPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNl0gPSBUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDZfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw3XSA9IFRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMN19fUE9SLAorCVtUT01UT01fQV9DRENfREVCVUdfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19ERUJVR19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0RFQlVHX0IyX0NUTF0gPSBUT01UT01fQV9DRENfREVCVUdfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19ERUJVR19CM19DVExdID0gVE9NVE9NX0FfQ0RDX0RFQlVHX0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfREVCVUdfQjRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19ERUJVR19CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0RFQlVHX0I1X0NUTF0gPSBUT01UT01fQV9DRENfREVCVUdfQjVfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19ERUJVR19CNl9DVExdID0gVE9NVE9NX0FfQ0RDX0RFQlVHX0I2X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfREVCVUdfQjdfQ1RMXSA9IFRPTVRPTV9BX0NEQ19ERUJVR19CN19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NSQzFfUERBX0NGR10gPSBUT01UT01fQV9DRENfU1JDMV9QREFfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX0NEQ19TUkMyX1BEQV9DRkddID0gVE9NVE9NX0FfQ0RDX1NSQzJfUERBX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfU1JDMV9GU19DVExdID0gVE9NVE9NX0FfQ0RDX1NSQzFfRlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19TUkMyX0ZTX0NUTF0gPSBUT01UT01fQV9DRENfU1JDMl9GU19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMV9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYMl9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYM19CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNF9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNV9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYNl9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYN19CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDJfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDVfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDFfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDJfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYM19WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDRfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDVfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYNl9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDdfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19WQkFUX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMV0gPSBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMV9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMl0gPSBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMMl9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMM10gPSBUT01UT01fQV9DRENfVkJBVF9BRENfQ0FMM19fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9QS19FU1QxXSA9IFRPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUMl0gPSBUT01UT01fQV9DRENfVkJBVF9QS19FU1QyX19QT1IsCisJW1RPTVRPTV9BX0NEQ19WQkFUX1BLX0VTVDNdID0gVE9NVE9NX0FfQ0RDX1ZCQVRfUEtfRVNUM19fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMV0gPSBUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMV9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMl0gPSBUT01UT01fQV9DRENfVkJBVF9SRl9QUk9DMl9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9UQUMxXSA9IFRPTVRPTV9BX0NEQ19WQkFUX1RBQzFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDMl0gPSBUT01UT01fQV9DRENfVkJBVF9UQUMyX19QT1IsCisJW1RPTVRPTV9BX0NEQ19WQkFUX1RBQzNdID0gVE9NVE9NX0FfQ0RDX1ZCQVRfVEFDM19fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9UQUM0XSA9IFRPTVRPTV9BX0NEQ19WQkFUX1RBQzRfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQxXSA9IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEMV9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDJdID0gVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQyX19QT1IsCisJW1RPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEM10gPSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRDNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9VUEQ0XSA9IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBENF9fUE9SLAorCVtUT01UT01fQV9DRENfVkJBVF9ERUJVRzFdID0gVE9NVE9NX0FfQ0RDX1ZCQVRfREVCVUcxX19QT1IsCisJW1RPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEX01PTl0gPSBUT01UT01fQV9DRENfVkJBVF9HQUlOX1VQRF9NT05fX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1ZCQVRfR0FJTl9NT05fVkFMXSA9IFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fTU9OX1ZBTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVExdID0gVE9NVE9NX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTEtfUlhfUkVTRVRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DTEtfUlhfUkVTRVRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfUkVTRVRfQjFfQ1RMXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NMS19UWF9SRVNFVF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19UWF9SRVNFVF9CMl9DVExdID0KKwkJCQlUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVExdID0gVE9NVE9NX0FfQ0RDX0NMS19SWF9JMlNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfSTJTX0NUTF0gPSBUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xLX09USFJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DTEtfT1RIUl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19BTkNfQ0xLX0VOX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTEtfQU5DX0NMS19FTl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19SWF9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NMS19SWF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19NQ0xLX0NUTF0gPSBUT01UT01fQV9DRENfQ0xLX01DTEtfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTEtfUERNX0NUTF0gPSBUT01UT01fQV9DRENfQ0xLX1BETV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMS19TRF9DVExdID0gVE9NVE9NX0FfQ0RDX0NMS19TRF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DTFNIX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xTSF9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NMU0hfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0IzX0NUTF0gPSBUT01UT01fQV9DRENfQ0xTSF9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSU10gPQorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0JVQ0tfTkNQX1ZBUlNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0RfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSURMRV9FQVJfVEhTRF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0lETEVfRUFSX1RIU0RfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0RdID0KKwkJCQlUT01UT01fQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xTSF9GQ0xLT05MWV9FQVJfVEhTRF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0ZDTEtPTkxZX0VBUl9USFNEX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0tfQUREUl0gPSBUT01UT01fQV9DRENfQ0xTSF9LX0FERFJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfS19EQVRBXSA9IFRPTVRPTV9BX0NEQ19DTFNIX0tfREFUQV9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0xdID0KKwkJCQlUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0xfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX1VdID0KKwkJCQlUT01UT01fQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfRUFSX1VfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9FQVJdID0gVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9FQVJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEhdID0gVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEhfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9NSU5fRUFSXSA9IFRPTVRPTV9BX0NEQ19DTFNIX1ZfUEFfTUlOX0VBUl9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xTSF9WX1BBX01JTl9IUEhdID0gVE9NVE9NX0FfQ0RDX0NMU0hfVl9QQV9NSU5fSFBIX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjVfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjVfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjVfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjVfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjZfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjZfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjZfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjZfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjdfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjdfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjdfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjdfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjhfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjhfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjhfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIxX0NUTF0gPSBUT01UT01fQV9DRENfSUlSMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19JSVIyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfSUlSMV9HQUlOX1RJTUVSX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fVElNRVJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19JSVIyX0dBSU5fVElNRVJfQ1RMXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9USU1FUl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0lJUjJfQ09FRl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1RPUF9HQUlOX1VQREFURV0gPSBUT01UT01fQV9DRENfVE9QX0dBSU5fVVBEQVRFX19QT1IsCisJW1RPTVRPTV9BX0NEQ19QQV9SQU1QX0IxX0NUTF0gPSBUT01UT01fQV9DRENfUEFfUkFNUF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19QQV9SQU1QX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfUEFfUkFNUF9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19QQV9SQU1QX0I0X0NUTF0gPSBUT01UT01fQV9DRENfUEFfUkFNUF9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVExdID0KKwkJCQlUT01UT01fQV9DRENfU1BLUl9DTElQREVUX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9CMV9DVExdID0KKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0IzX0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CM19DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I0X0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0I0X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I1X0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjVfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0I1X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjVfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0I2X0NUTF0gPSBUT01UT01fQV9DRENfQ09NUDBfQjZfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0I2X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfQjZfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVNdID0KKwkJCQlUT01UT01fQV9DRENfQ09NUDBfU0hVVF9ET1dOX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDFfU0hVVF9ET1dOX1NUQVRVU10gPQorCQkJCVRPTVRPTV9BX0NEQ19DT01QMV9TSFVUX0RPV05fU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMl9TSFVUX0RPV05fU1RBVFVTXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NPTVAyX1NIVVRfRE9XTl9TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTVAwX0ZTX0NGR10gPSBUT01UT01fQV9DRENfQ09NUDBfRlNfQ0ZHX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT01QMV9GU19DRkddID0gVE9NVE9NX0FfQ0RDX0NPTVAxX0ZTX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfQ09NUDJfRlNfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19DT01QMl9GU19DRkdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDFfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYMV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDFfQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDJfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYMl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlgyX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDJfQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlgzX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDNfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYM19CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlgzX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDRfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1JYNF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg0X0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDRfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYNV9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlg1X0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDVfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1JYNV9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg2X0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDZfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYNl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlg2X0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWDdfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1JYN19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWDdfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYN19CM19DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9BTkNfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX0FOQ19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fQU5DX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9BTkNfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9UWF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1RYX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9CM19DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX0I0X0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9UWF9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9FUTFfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX0VRMV9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9FUTFfQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0I0X0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9FUTFfQjRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX0VRMl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9FUTJfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9FUTJfQjNfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX0VRMl9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0I0X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9TUkMxX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9TUkMxX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9TUkMxX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9TUkMxX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9TUkMyX0IxX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9TUkMyX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9TUkMyX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9TUkMyX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjNfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I1X0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjZfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I2X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CN19DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjdfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I4X0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjlfQ1RMXSA9IFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I5X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjEwX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTFfQ1RMXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjExX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlhfU0JfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYX1NCX0IyX0NUTF0gPSBUT01UT01fQV9DRENfQ09OTl9SWF9TQl9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NPTk5fTUlTQ10gPSBUT01UT01fQV9DRENfQ09OTl9NSVNDX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DT05OX1JYOF9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlg4X0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVExdID0KKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQ0xJUF9MRVZFTF9BREpVU1RdID0KKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0NMSVBfTEVWRUxfQURKVVNUX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX01JTl9DTElQX1RIUkVTSE9MRF0gPQorCQkJVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfTUlOX0NMSVBfVEhSRVNIT0xEX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1RIUkVTSE9MRF9TVEFUVVNdID0KKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1RIUkVTSE9MRF9TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfU0FNUExFX01BUktdID0KKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX1NBTVBMRV9NQVJLX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0JPT1NUX0dBVElOR10gPQorCQkJVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfQk9PU1RfR0FUSU5HX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CMV9DVExdID0KKwkJCQlUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQjFfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9DTElQX0xFVkVMX0FESlVTVF0gPQorCQkJVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0NMSVBfTEVWRUxfQURKVVNUX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9NSU5fQ0xJUF9USFJFU0hPTERdID0KKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9NSU5fQ0xJUF9USFJFU0hPTERfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX1RIUkVTSE9MRF9TVEFUVVNdID0KKwkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9USFJFU0hPTERfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9TQU1QTEVfTUFSS10gPQorCQkJCVRPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9TQU1QTEVfTUFSS19fUE9SLAorCVtUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQk9PU1RfR0FUSU5HXSA9CisJCQkJVE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX0JPT1NUX0dBVElOR19fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19FTl9DVExdID0gVE9NVE9NX0FfQ0RDX01CSENfRU5fQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMV9DRkddID0gVE9NVE9NX0FfQ0RDX01CSENfRklSX0IxX0NGR19fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19GSVJfQjJfQ0ZHXSA9IFRPTVRPTV9BX0NEQ19NQkhDX0ZJUl9CMl9DRkdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjFfQ1RMXSA9IFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19USU1FUl9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjRfQ1RMXSA9IFRPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I0X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19USU1FUl9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQjFfU1RBVFVTXSA9IFRPTVRPTV9BX0NEQ19NQkhDX0IxX1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19CMl9TVEFUVVNdID0gVE9NVE9NX0FfQ0RDX01CSENfQjJfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0IzX1NUQVRVU10gPSBUT01UT01fQV9DRENfTUJIQ19CM19TVEFUVVNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQjRfU1RBVFVTXSA9IFRPTVRPTV9BX0NEQ19NQkhDX0I0X1NUQVRVU19fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19CNV9TVEFUVVNdID0gVE9NVE9NX0FfQ0RDX01CSENfQjVfU1RBVFVTX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0IxX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfQjJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19NQkhDX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0IyX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0IzX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IzX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I0X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I0X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I1X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I1X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I2X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I2X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I3X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I3X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I4X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I4X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0I5X0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0I5X0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMF9DVExdID0gVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjExX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19WT0xUX0IxMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfVk9MVF9CMTJfQ1RMXSA9IFRPTVRPTV9BX0NEQ19NQkhDX1ZPTFRfQjEyX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfTUJIQ19DTEtfQ1RMXSA9IFRPTVRPTV9BX0NEQ19NQkhDX0NMS19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfSU5UX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19JTlRfQ1RMX19QT1IsCisJW1RPTVRPTV9BX0NEQ19NQkhDX0RFQlVHX0NUTF0gPSBUT01UT01fQV9DRENfTUJIQ19ERUJVR19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX01CSENfU1BBUkVdID0gVE9NVE9NX0FfQ0RDX01CSENfU1BBUkVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CMV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CMl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CM19DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CM19DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CNF9DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CNF9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CNV9DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CNV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9CNl9DVExdID0gVE9NVE9NX0FfQ0RDX1JYOF9CNl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9WT0xfQ1RMX0IxX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMV9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1JYOF9WT0xfQ1RMX0IyX0NUTF0gPQorCQkJCVRPTVRPTV9BX0NEQ19SWDhfVk9MX0NUTF9CMl9DVExfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMF0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDBfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMV0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDFfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMMl0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDJfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMM10gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDNfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNF0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDRfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNV0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDVfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMNl0gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDZfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfVkFMN10gPQorCQkJCVRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX1ZBTDdfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0JPT1NUX01PREVfQ1RMXSA9IFRPTVRPTV9BX0NEQ19CT09TVF9NT0RFX0NUTF9fUE9SLAorCVtUT01UT01fQV9DRENfQk9PU1RfVEhSRVNIT0xEXSA9IFRPTVRPTV9BX0NEQ19CT09TVF9USFJFU0hPTERfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0JPT1NUX1RBUF9TRUxdID0gVE9NVE9NX0FfQ0RDX0JPT1NUX1RBUF9TRUxfX1BPUiwKKwlbVE9NVE9NX0FfQ0RDX0JPT1NUX0hPTERfVElNRV0gPSBUT01UT01fQV9DRENfQk9PU1RfSE9MRF9USU1FX19QT1IsCisJW1RPTVRPTV9BX0NEQ19CT09TVF9UUkdSX0VOXSA9IFRPTVRPTV9BX0NEQ19CT09TVF9UUkdSX0VOX19QT1IsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkyMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLmMKQEAgLTAsMCArMSw5MTExIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LWlycS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOTMzMF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlICJ3Y2Q5MzMwLmgiCisjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3IuaCIKKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi5oIgorI2luY2x1ZGUgIndjZGNhbC1od2RlcC5oIgorI2luY2x1ZGUgIndjZF9jcGVfY29yZS5oIgorCitlbnVtIHsKKwlCVVNfRE9XTiwKKwlBREMxX1RYRkUsCisJQURDMl9UWEZFLAorCUFEQzNfVFhGRSwKKwlBREM0X1RYRkUsCisJQURDNV9UWEZFLAorCUFEQzZfVFhGRSwKKwlIUEhfREVMQVksCit9OworCisjZGVmaW5lIFRPTVRPTV9NQURfU0xJTUJVU19UWF9QT1JUIDEyCisjZGVmaW5lIFRPTVRPTV9NQURfQVVESU9fRklSTVdBUkVfUEFUSCAid2NkOTMyMC93Y2Q5MzIwX21hZF9hdWRpby5iaW4iCisjZGVmaW5lIFRPTVRPTV9WQUxJREFURV9SWF9TQlBPUlRfUkFOR0UocG9ydCkgKChwb3J0ID49IDE2KSAmJiAocG9ydCA8PSAyMykpCisjZGVmaW5lIFRPTVRPTV9WQUxJREFURV9UWF9TQlBPUlRfUkFOR0UocG9ydCkgKChwb3J0ID49IDApICYmIChwb3J0IDw9IDE1KSkKKyNkZWZpbmUgVE9NVE9NX0NPTlZFUlRfUlhfU0JQT1JUX0lEKHBvcnQpIChwb3J0IC0gMTYpIC8qIFJYMSBwb3J0IElEID0gMCAqLworI2RlZmluZSBUT01UT01fQklUX0FESl9TSElGVF9QT1JUMV82IDQKKyNkZWZpbmUgVE9NVE9NX0JJVF9BREpfU0hJRlRfUE9SVDdfMTAgNQorCisjZGVmaW5lIFRPTVRPTV9IUEhfUEFfU0VUVExFX0NPTVBfT04gMTAwMDAKKyNkZWZpbmUgVE9NVE9NX0hQSF9QQV9TRVRUTEVfQ09NUF9PRkYgMTMwMDAKKyNkZWZpbmUgVE9NVE9NX0hQSF9QQV9SQU1QX0RFTEFZIDMwMDAwCisKKyNkZWZpbmUgVE9NVE9NX1NWQVNTX0lOVF9TVEFUVVNfUkNPX1dET0cgMHgyMAorI2RlZmluZSBUT01UT01fU1ZBU1NfSU5UX1NUQVRVU19XRE9HX0JJVEUgMHgwMgorCisvKiBBZGQgYW55IFNWQSBJUlFzIHRoYXQgYXJlIHRvIGJlIHRyZWF0ZWQgYXMgRkFUQUwgKi8KKyNkZWZpbmUgVE9NVE9NX0NQRV9GQVRBTF9JUlFTIFwKKwkoVE9NVE9NX1NWQVNTX0lOVF9TVEFUVVNfUkNPX1dET0cgfCBcCisJIFRPTVRPTV9TVkFTU19JTlRfU1RBVFVTX1dET0dfQklURSkKKworI2RlZmluZSBEQVBNX01JQ0JJQVMyX0VYVEVSTkFMX1NUQU5EQUxPTkUgIk1JQyBCSUFTMiBFeHRlcm5hbCBTdGFuZGFsb25lIgorCisvKiBSWF9IUEhfQ05QX1dHX1RJTUUgaW5jcmVhc2VzIGJ5IDAuMjRtcyAqLworI2RlZmluZSBUT01UT01fV0dfVElNRV9GQUNUT1JfVVMJMjQwCisKKyNkZWZpbmUgUlg4X1BBVEggOAorI2RlZmluZSBIUEhfUEFfRU5BQkxFIHRydWUKKyNkZWZpbmUgSFBIX1BBX0RJU0FCTEUgZmFsc2UKKworI2RlZmluZSBTTElNX0JXX0NMS19HRUFSXzkgNjIwMDAwMAorI2RlZmluZSBTTElNX0JXX1VOVk9URSAwCisKK3N0YXRpYyBpbnQgY3BlX2RlYnVnX21vZGU7Cittb2R1bGVfcGFyYW0oY3BlX2RlYnVnX21vZGUsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNwZV9kZWJ1Z19tb2RlLCAiYm9vdCBjcGUgaW4gZGVidWcgbW9kZSIpOworCitzdGF0aWMgYXRvbWljX3Qga3BfdG9tdG9tX3ByaXY7CisKK3N0YXRpYyBpbnQgaGlnaF9wZXJmX21vZGU7Cittb2R1bGVfcGFyYW0oaGlnaF9wZXJmX21vZGUsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhpZ2hfcGVyZl9tb2RlLCAiZW5hYmxlL2Rpc2FibGUgY2xhc3MgQUIgY29uZmlnIGZvciBocGgiKTsKKworc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1fc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyB0b210b21fc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyA9IHsKKwkubWlub3JfdmVyc2lvbiA9IDEsCisJLnNsaW1idXNfZGV2X2lkID0gQUZFX1NMSU1CVVNfREVWSUNFXzEsCisJLnNsYXZlX2Rldl9wZ2RfbGEgPSAwLAorCS5zbGF2ZV9kZXZfaW50ZmRldl9sYSA9IDAsCisJLmJpdF93aWR0aCA9IDE2LAorCS5kYXRhX2Zvcm1hdCA9IDAsCisJLm51bV9jaGFubmVscyA9IDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnIGF1ZGlvX3JlZ19jZmdbXSA9IHsKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8xKSwKKwkJSFdfTUFEX0FVRElPX0VOQUJMRSwgMHgxLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMyksCisJCUhXX01BRF9BVURJT19TTEVFUF9USU1FLCAweEYsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80KSwKKwkJSFdfTUFEX1RYX0FVRElPX1NXSVRDSF9PRkYsIDB4MSwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9BX0lOVFJfTU9ERSksCisJCU1BRF9BVURJT19JTlRfREVTVF9TRUxFQ1RfUkVHLCAweDQsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9JTlRSMl9NQVNLMCksCisJCU1BRF9BVURJT19JTlRfTUFTS19SRUcsIDB4MiwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9BX0lOVFIyX1NUQVRVUzApLAorCQlNQURfQVVESU9fSU5UX1NUQVRVU19SRUcsIDB4MiwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9BX0lOVFIyX0NMRUFSMCksCisJCU1BRF9BVURJT19JTlRfQ0xFQVJfUkVHLCAweDIsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fU0JfUEdEX1BPUlRfVFhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1RYX1dBVEVSTUFSS19OLCAweDFFLCA4LCAweDEKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fU0JfUEdEX1BPUlRfVFhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1RYX0VOQUJMRV9OLCAweDEsIDgsIDB4MQorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9TQl9QR0RfUE9SVF9SWF9CQVNFKSwKKwkJU0JfUEdEX1BPUlRfUlhfV0FURVJNQVJLX04sIDB4MUUsIDgsIDB4MQorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9TQl9QR0RfUE9SVF9SWF9CQVNFKSwKKwkJU0JfUEdEX1BPUlRfUlhfRU5BQkxFX04sIDB4MSwgOCwgMHgxCisJfSwKKwl7CTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTCksCisJCUFBTkNfRkZfR0FJTl9BREFQVElWRSwgMHg0LCA4LCAwCisJfSwKKwl7CTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfQ0RDX0FOQzFfSUlSX0IxX0NUTCksCisJCUFBTkNfRkZHQUlOX0FEQVBUSVZFX0VOLCAweDgsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9DRENfQU5DMV9HQUlOX0NUTCksCisJCUFBTkNfR0FJTl9DT05UUk9MLCAweEZGLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfSU5UUjJfTUFTSzApLAorCQlNQURfQ0xJUF9JTlRfTUFTS19SRUcsIDB4MTAsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9JTlRSMl9NQVNLMCksCisJCU1BRDJfQ0xJUF9JTlRfTUFTS19SRUcsIDB4MjAsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9JTlRSMl9TVEFUVVMwKSwKKwkJTUFEX0NMSVBfSU5UX1NUQVRVU19SRUcsIDB4MTAsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUT01UT01fQV9JTlRSMl9TVEFUVVMwKSwKKwkJTUFEMl9DTElQX0lOVF9TVEFUVVNfUkVHLCAweDIwLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVE9NVE9NX0FfSU5UUjJfQ0xFQVIwKSwKKwkJTUFEX0NMSVBfSU5UX0NMRUFSX1JFRywgMHgxMCwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRPTVRPTV9BX0lOVFIyX0NMRUFSMCksCisJCU1BRDJfQ0xJUF9JTlRfQ0xFQVJfUkVHLCAweDIwLCA4LCAwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnIGNsaXBfcmVnX2NmZ1tdID0geworCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkJCSBUT01UT01fQV9DRENfU1BLUl9DTElQREVUX0IxX0NUTCksCisJCVNQS1JfQ0xJUF9QSVBFX0JBTktfU0VMLCAweDMsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkJCVRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMCksCisJCVNQS1JfQ0xJUERFVF9WQUwwLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDEpLAorCQlTUEtSX0NMSVBERVRfVkFMMSwgMHhmZiwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUwyKSwKKwkJU1BLUl9DTElQREVUX1ZBTDIsIDB4ZmYsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkJCVRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMMyksCisJCVNQS1JfQ0xJUERFVF9WQUwzLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDQpLAorCQlTUEtSX0NMSVBERVRfVkFMNCwgMHhmZiwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCQkJVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9WQUw1KSwKKwkJU1BLUl9DTElQREVUX1ZBTDUsIDB4ZmYsIDgsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRPTVRPTV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkJCVRPTVRPTV9BX0NEQ19TUEtSX0NMSVBERVRfVkFMNiksCisJCVNQS1JfQ0xJUERFVF9WQUw2LCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUl9DTElQREVUX1ZBTDcpLAorCQlTUEtSX0NMSVBERVRfVkFMNywgMHhmZiwgOCwgMAorCX0sCisJeworCQkxLAorCQkoVE9NVE9NX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCQkJIFRPTVRPTV9BX0NEQ19TUEtSMl9DTElQREVUX0IxX0NUTCksCisJCVNQS1IyX0NMSVBfUElQRV9CQU5LX1NFTCwgMHgzLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwwKSwKKwkJU1BLUjJfQ0xJUERFVF9WQUwwLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwxKSwKKwkJU1BLUjJfQ0xJUERFVF9WQUwxLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwyKSwKKwkJU1BLUjJfQ0xJUERFVF9WQUwyLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUwzKSwKKwkJU1BLUjJfQ0xJUERFVF9WQUwzLCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw0KSwKKwkJU1BLUjJfQ0xJUERFVF9WQUw0LCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw1KSwKKwkJU1BLUjJfQ0xJUERFVF9WQUw1LCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw2KSwKKwkJU1BLUjJfQ0xJUERFVF9WQUw2LCAweGZmLCA4LCAwCisJfSwKKwl7CisJCTEsCisJCShUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJCQlUT01UT01fQV9DRENfU1BLUjJfQ0xJUERFVF9WQUw3KSwKKwkJU1BLUjJfQ0xJUERFVF9WQUw3LCAweGZmLCA4LCAwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX2RhdGEgdG9tdG9tX2F1ZGlvX3JlZ19jZmcgPSB7CisJLm51bV9yZWdpc3RlcnMgPSBBUlJBWV9TSVpFKGF1ZGlvX3JlZ19jZmcpLAorCS5yZWdfZGF0YSA9IGF1ZGlvX3JlZ19jZmcsCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhIHRvbXRvbV9jbGlwX3JlZ19jZmcgPSB7CisJLm51bV9yZWdpc3RlcnMgPSBBUlJBWV9TSVpFKGNsaXBfcmVnX2NmZyksCisJLnJlZ19kYXRhID0gY2xpcF9yZWdfY2ZnLAorfTsKKworc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbiB0b210b21fY2RjX2FhbmNfdmVyc2lvbiA9IHsKKwkuY2RjX2FhbmNfbWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9DRENfQUFOQ19WRVJTSU9OLAorCS5hYW5jX2h3X3ZlcnNpb24gICAgICAgID0gQUFOQ19IV19CTE9DS19WRVJTSU9OXzIsCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsIGNsaXBfYmFua19zZWwgPSB7CisJLm1pbm9yX3ZlcnNpb24gPSBBRkVfQVBJX1ZFUlNJT05fQ0xJUF9CQU5LX1NFTF9DRkcsCisJLm51bV9iYW5rcyA9IEFGRV9DTElQX01BWF9CQU5LUywKKwkuYmFua19tYXAgPSB7MCwgMSwgMiwgM30sCit9OworCisjZGVmaW5lIFdDRDkzMzBfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfOTYwMDAgfCBTTkRSVl9QQ01fUkFURV8xOTIwMDApCisKKyNkZWZpbmUgTlVNX0RFQ0lNQVRPUlMgMTAKKyNkZWZpbmUgTlVNX0lOVEVSUE9MQVRPUlMgOAorI2RlZmluZSBCSVRTX1BFUl9SRUcgOAorI2RlZmluZSBUT01UT01fVFhfUE9SVF9OVU1CRVIJMTYKKyNkZWZpbmUgVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSCTE2CisKKyNkZWZpbmUgVE9NVE9NX0kyU19NQVNURVJfTU9ERV9NQVNLIDB4MDgKKworI2RlZmluZSBUT01UT01fU0xJTV9DTE9TRV9USU1FT1VUIDEwMDAKKyNkZWZpbmUgVE9NVE9NX1NMSU1fSVJRX09WRVJGTE9XICgxIDw8IDApCisjZGVmaW5lIFRPTVRPTV9TTElNX0lSUV9VTkRFUkZMT1cgKDEgPDwgMSkKKyNkZWZpbmUgVE9NVE9NX1NMSU1fSVJRX1BPUlRfQ0xPU0VEICgxIDw8IDIpCisjZGVmaW5lIFRPTVRPTV9NQ0xLX0NMS18xMlAyODhNSFogMTIyODgwMDAKKyNkZWZpbmUgVE9NVE9NX01DTEtfQ0xLXzlQNk1IWiA5NjAwMDAwCisKKyNkZWZpbmUgVE9NVE9NX0ZPUk1BVFNfUzE2X1MyNF9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQlTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSkKKworI2RlZmluZSBUT01UT01fRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCisKKyNkZWZpbmUgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX1RYX0VOMCAoVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX0VOMCArIDIpCisjZGVmaW5lIFRPTVRPTV9aREVUX0JPWF9DQVJfQVZHX0xPT1BfQ09VTlQgMQorI2RlZmluZSBUT01UT01fWkRFVF9NVUxfRkFDVE9SXzFYIDcyMTgKKyNkZWZpbmUgVE9NVE9NX1pERVRfTVVMX0ZBQ1RPUl8xMFggKFRPTVRPTV9aREVUX01VTF9GQUNUT1JfMVggKiAxMCkKKyNkZWZpbmUgVE9NVE9NX1pERVRfTVVMX0ZBQ1RPUl8xMDBYIChUT01UT01fWkRFVF9NVUxfRkFDVE9SXzFYICogMTAwKQorI2RlZmluZSBUT01UT01fWkRFVF9FUlJPUl9BUFBST1hfTVVMX0ZBQ1RPUiA2NTUKKyNkZWZpbmUgVE9NVE9NX1pERVRfRVJST1JfQVBQUk9YX1NISUZUIDE2CisjZGVmaW5lIFRPTVRPTV9aREVUX1pPTkVfM19ERUZBVUxUX1ZBTCAxMDAwMDAwCisKK2VudW0geworCUFJRjFfUEIgPSAwLAorCUFJRjFfQ0FQLAorCUFJRjJfUEIsCisJQUlGMl9DQVAsCisJQUlGM19QQiwKKwlBSUYzX0NBUCwKKwlBSUY0X1ZJRkVFRCwKKwlBSUY0X01BRF9UWCwKKwlOVU1fQ09ERUNfREFJUywKK307CisKK2VudW0geworCVJYX01JWDFfSU5QX1NFTF9aRVJPID0gMCwKKwlSWF9NSVgxX0lOUF9TRUxfU1JDMSwKKwlSWF9NSVgxX0lOUF9TRUxfU1JDMiwKKwlSWF9NSVgxX0lOUF9TRUxfSUlSMSwKKwlSWF9NSVgxX0lOUF9TRUxfSUlSMiwKKwlSWF9NSVgxX0lOUF9TRUxfUlgxLAorCVJYX01JWDFfSU5QX1NFTF9SWDIsCisJUlhfTUlYMV9JTlBfU0VMX1JYMywKKwlSWF9NSVgxX0lOUF9TRUxfUlg0LAorCVJYX01JWDFfSU5QX1NFTF9SWDUsCisJUlhfTUlYMV9JTlBfU0VMX1JYNiwKKwlSWF9NSVgxX0lOUF9TRUxfUlg3LAorCVJYX01JWDFfSU5QX1NFTF9BVVhSWCwKK307CitlbnVtIHsKKwlSWDhfTUlYMV9JTlBfU0VMX1pFUk8gPSAwLAorCVJYOF9NSVgxX0lOUF9TRUxfSUlSMSwKKwlSWDhfTUlYMV9JTlBfU0VMX0lJUjIsCisJUlg4X01JWDFfSU5QX1NFTF9SWDEsCisJUlg4X01JWDFfSU5QX1NFTF9SWDIsCisJUlg4X01JWDFfSU5QX1NFTF9SWDMsCisJUlg4X01JWDFfSU5QX1NFTF9SWDQsCisJUlg4X01JWDFfSU5QX1NFTF9SWDUsCisJUlg4X01JWDFfSU5QX1NFTF9SWDYsCisJUlg4X01JWDFfSU5QX1NFTF9SWDcsCisJUlg4X01JWDFfSU5QX1NFTF9SWDgsCit9OworCisjZGVmaW5lIFRPTVRPTV9DT01QX0RJR0lUQUxfR0FJTl9PRkZTRVQgMworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF9nYWluLCAwLCAxLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW5lX2dhaW4sIDAsIDcsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFuYWxvZ19nYWluLCAwLCAyNSwgMSk7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0b210b21fZGFpW107CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYXV4X3BnYV9nYWluLCAwLCAyLCAwKTsKKworLyogQ29kZWMgc3VwcG9ydHMgMiBJSVIgZmlsdGVycyAqLworZW51bSB7CisJSUlSMSA9IDAsCisJSUlSMiwKKwlJSVJfTUFYLAorfTsKKy8qIENvZGVjIHN1cHBvcnRzIDUgYmFuZHMgKi8KK2VudW0geworCUJBTkQxID0gMCwKKwlCQU5EMiwKKwlCQU5EMywKKwlCQU5ENCwKKwlCQU5ENSwKKwlCQU5EX01BWCwKK307CisKK2VudW0geworCUNPTVBBTkRFUl8wLAorCUNPTVBBTkRFUl8xLAorCUNPTVBBTkRFUl8yLAorCUNPTVBBTkRFUl9NQVgsCit9OworCitlbnVtIHsKKwlDT01QQU5ERVJfRlNfOEtIWiA9IDAsCisJQ09NUEFOREVSX0ZTXzE2S0haLAorCUNPTVBBTkRFUl9GU18zMktIWiwKKwlDT01QQU5ERVJfRlNfNDhLSFosCisJQ09NUEFOREVSX0ZTXzk2S0haLAorCUNPTVBBTkRFUl9GU18xOTJLSFosCisJQ09NUEFOREVSX0ZTX01BWCwKK307CisKK3N0cnVjdCBjb21wX3NhbXBsZV9kZXBlbmRlbnRfcGFyYW1zIHsKKwl1MzIgcGVha19kZXRfdGltZW91dDsKKwl1MzIgcm1zX21ldGVyX2Rpdl9mYWN0OworCXUzMiBybXNfbWV0ZXJfcmVzYW1wX2ZhY3Q7Cit9OworCitzdHJ1Y3QgaHBmX3dvcmsgeworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tOworCXUzMiBkZWNpbWF0b3I7CisJdTggdHhfaHBmX2N1dF9vZl9mcmVxOworCWJvb2wgdHhfaHBmX2J5cGFzczsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworfTsKKworc3RhdGljIHN0cnVjdCBocGZfd29yayB0eF9ocGZfd29ya1tOVU1fREVDSU1BVE9SU107CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0b210b21fcnhfY2hzW1RPTVRPTV9SWF9NQVhdID0geworCVdDRDlYWFhfQ0goVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSLCAwKSwKKwlXQ0Q5WFhYX0NIKFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDEsIDEpLAorCVdDRDlYWFhfQ0goVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMiwgMiksCisJV0NEOVhYWF9DSChUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyAzLCAzKSwKKwlXQ0Q5WFhYX0NIKFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDQsIDQpLAorCVdDRDlYWFhfQ0goVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgNSwgNSksCisJV0NEOVhYWF9DSChUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA2LCA2KSwKKwlXQ0Q5WFhYX0NIKFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDcsIDcpLAorCVdDRDlYWFhfQ0goVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgOCwgOCksCisJV0NEOVhYWF9DSChUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA5LCA5KSwKKwlXQ0Q5WFhYX0NIKFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDEwLCAxMCksCisJV0NEOVhYWF9DSChUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyAxMSwgMTEpLAorCVdDRDlYWFhfQ0goVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTIsIDEyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0b210b21fdHhfY2hzW1RPTVRPTV9UWF9NQVhdID0geworCVdDRDlYWFhfQ0goMCwgMCksCisJV0NEOVhYWF9DSCgxLCAxKSwKKwlXQ0Q5WFhYX0NIKDIsIDIpLAorCVdDRDlYWFhfQ0goMywgMyksCisJV0NEOVhYWF9DSCg0LCA0KSwKKwlXQ0Q5WFhYX0NIKDUsIDUpLAorCVdDRDlYWFhfQ0goNiwgNiksCisJV0NEOVhYWF9DSCg3LCA3KSwKKwlXQ0Q5WFhYX0NIKDgsIDgpLAorCVdDRDlYWFhfQ0goOSwgOSksCisJV0NEOVhYWF9DSCgxMCwgMTApLAorCVdDRDlYWFhfQ0goMTEsIDExKSwKKwlXQ0Q5WFhYX0NIKDEyLCAxMiksCisJV0NEOVhYWF9DSCgxMywgMTMpLAorCVdDRDlYWFhfQ0goMTQsIDE0KSwKKwlXQ0Q5WFhYX0NIKDE1LCAxNSksCit9OworCitzdGF0aWMgY29uc3QgdTMyIHZwb3J0X2NoZWNrX3RhYmxlW05VTV9DT0RFQ19EQUlTXSA9IHsKKwkwLAkJCQkJLyogQUlGMV9QQiAqLworCSgxIDw8IEFJRjJfQ0FQKSB8ICgxIDw8IEFJRjNfQ0FQKSwJLyogQUlGMV9DQVAgKi8KKwkwLAkJCQkJLyogQUlGMl9QQiAqLworCSgxIDw8IEFJRjFfQ0FQKSB8ICgxIDw8IEFJRjNfQ0FQKSwJLyogQUlGMl9DQVAgKi8KKwkwLAkJCQkJLyogQUlGM19QQiAqLworCSgxIDw8IEFJRjFfQ0FQKSB8ICgxIDw8IEFJRjJfQ0FQKSwJLyogQUlGM19DQVAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1MzIgdnBvcnRfaTJzX2NoZWNrX3RhYmxlW05VTV9DT0RFQ19EQUlTXSA9IHsKKwkwLAkvKiBBSUYxX1BCICovCisJMCwJLyogQUlGMV9DQVAgKi8KKwkwLAkvKiBBSUYyX1BCICovCisJMCwJLyogQUlGMl9DQVAgKi8KK307CisKKy8qCisgKiBJbnRlcnJ1cHQgdGFibGUgZm9yIHYzIGNvcnJlc3BvbmRzIHRvIG5ld2VyIHZlcnNpb24KKyAqIGNvZGVjcyAod2NkOTMzMCkKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2RhdGEgd2NkOTMzMF9pbnRyX3RibFtdID0geworCXtXQ0Q5WFhYX0lSUV9TTElNQlVTLCBmYWxzZX0sCisJe1dDRDlYWFhfSVJRX01CSENfSU5TRVJUSU9OLCB0cnVlfSwKKwl7V0NEOVhYWF9JUlFfTUJIQ19QT1RFTlRJQUwsIHRydWV9LAorCXtXQ0Q5WFhYX0lSUV9NQkhDX1JFTEVBU0UsIHRydWV9LAorCXtXQ0Q5WFhYX0lSUV9NQkhDX1BSRVNTLCB0cnVlfSwKKwl7V0NEOVhYWF9JUlFfTUJIQ19TSE9SVF9URVJNLCB0cnVlfSwKKwl7V0NEOVhYWF9JUlFfTUJIQ19SRU1PVkFMLCB0cnVlfSwKKwl7V0NEOTMzMF9JUlFfTUJIQ19KQUNLX1NXSVRDSCwgdHJ1ZX0sCisJe1dDRDlYWFhfSVJRX0JHX1BSRUNIQVJHRSwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9QQTFfU1RBUlRVUCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9QQTJfU1RBUlRVUCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9QQTNfU1RBUlRVUCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9QQTRfU1RBUlRVUCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9QQTVfU1RBUlRVUCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9NSUNCSUFTMV9QUkVDSEFSR0UsIGZhbHNlfSwKKwl7V0NEOVhYWF9JUlFfTUlDQklBUzJfUFJFQ0hBUkdFLCBmYWxzZX0sCisJe1dDRDlYWFhfSVJRX01JQ0JJQVMzX1BSRUNIQVJHRSwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9FQVJfUEFfT0NQTF9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5WFhYX0lSUV9IUEhfTF9QQV9TVEFSVFVQLCBmYWxzZX0sCisJe1dDRDlYWFhfSVJRX0hQSF9SX1BBX1NUQVJUVVAsIGZhbHNlfSwKKwl7V0NEOTMyMF9JUlFfRUFSX1BBX1NUQVJUVVAsIGZhbHNlfSwKKwl7V0NEOTMzMF9JUlFfU1ZBU1NfRVJSX0VYQ0VQVElPTiwgZmFsc2V9LAorCXtXQ0Q5MzMwX0lSUV9TVkFTU19FTkdJTkUsIHRydWV9LAorCXtXQ0Q5MzMwX0lSUV9NQURfQVVESU8sIGZhbHNlfSwKKwl7V0NEOTMzMF9JUlFfTUFEX0JFQUNPTiwgZmFsc2V9LAorCXtXQ0Q5MzMwX0lSUV9NQURfVUxUUkFTT1VORCwgZmFsc2V9LAorCXtXQ0Q5MzMwX0lSUV9TUEVBS0VSMV9DTElQUElORywgZmFsc2V9LAorCXtXQ0Q5MzMwX0lSUV9TUEVBS0VSMl9DTElQUElORywgZmFsc2V9LAorCXtXQ0Q5MzMwX0lSUV9WQkFUX01PTklUT1JfQVRUQUNLLCBmYWxzZX0sCisJe1dDRDkzMzBfSVJRX1ZCQVRfTU9OSVRPUl9SRUxFQVNFLCBmYWxzZX0sCit9OworCitzdHJ1Y3QgdG9tdG9tX3ByaXYgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1MzIgYWRjX2NvdW50OworCXUzMiByeF9iaWFzX2NvdW50OworCXMzMiBkbWljXzFfMl9jbGtfY250OworCXMzMiBkbWljXzNfNF9jbGtfY250OworCXMzMiBkbWljXzVfNl9jbGtfY250OworCXMzMiBsZG9faF91c2VyczsKKwlzMzIgbWljYl8yX3VzZXJzOworCisJdTMyIGFuY19zbG90OworCWJvb2wgYW5jX2Z1bmM7CisKKwkvKiBjYWwgaW5mbyBmb3IgY29kZWMgKi8KKwlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YTsKKworCS8qdHJhY2sgdG9tdG9tIGludGVyZmFjZSB0eXBlKi8KKwl1OCBpbnRmX3R5cGU7CisKKwkvKiBudW0gb2Ygc2xpbSBwb3J0cyByZXF1aXJlZCAqLworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICBkYWlbTlVNX0NPREVDX0RBSVNdOworCisJLypjb21wYW5kZXIqLworCWludCBjb21wX2VuYWJsZWRbQ09NUEFOREVSX01BWF07CisJdTMyIGNvbXBfZnNbQ09NUEFOREVSX01BWF07CisKKwkvKiBNYWludGFpbiB0aGUgc3RhdHVzIG9mIEFVWCBQR0EgKi8KKwlpbnQgYXV4X3BnYV9jbnQ7CisJdTggYXV4X2xfZ2FpbjsKKwl1OCBhdXhfcl9nYWluOworCisJYm9vbCBzcGtyX3BhX3dpZGdldF9vbjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpzcGtkcnZfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKnNwa2RydjJfcmVnOworCisJYm9vbCBtYmhjX3N0YXJ0ZWQ7CisKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19zbGltYnVzX3NsYXZlX2NmZyBzbGltYnVzX3NsYXZlX2NmZzsKKworCS8qIHJlc21nciBtb2R1bGUgKi8KKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgcmVzbWdyOworCS8qIG1iaGMgbW9kdWxlICovCisJc3RydWN0IHdjZDl4eHhfbWJoYyBtYmhjOworCisJLyogY2xhc3MgaCBzcGVjaWZpYyBkYXRhICovCisJc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSBjbHNoX2Q7CisKKwlpbnQgKCptYWNoaW5lX2NvZGVjX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQllbnVtIHdjZDl4eHhfY29kZWNfZXZlbnQpOworCWludCAoKmNvZGVjX2V4dF9jbGtfZW5fY2IpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWludCBlbmFibGUsIGJvb2wgZGFwbSk7CisJaW50ICgqY29kZWNfZ2V0X2V4dF9jbGtfY250KSh2b2lkKTsKKwkvKgorCSAqIGxpc3QgdXNlZCB0byBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzIGF0IHN0YXJ0IGFuZAorCSAqIGVuZCBvZiBpbXBlZGFuY2UgbWVhc3VyZW1lbnQKKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlZ19zYXZlX3Jlc3RvcmU7CisKKwkvKiBoYW5kbGUgdG8gY3BlIGNvcmUgKi8KKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjcGVfY29yZTsKKworCS8qIFVIUUEgKGNsYXNzIEFCKSBtb2RlICovCisJdTggdWhxYV9tb2RlOworCisJLyogTXVsdGlwbGljYXRpb24gZmFjdG9yIHVzZWQgZm9yIGltcGVkYW5jZSBkZXRlY3Rpb24gKi8KKwlpbnQgemRldF9nYWluX211bF9mYWN0OworCisJLyogdG8gdHJhY2sgdGhlIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7CisKKwlpbnQgZXh0X2Nsa191c2VyczsKKwlzdHJ1Y3QgY2xrICp3Y2RfZXh0X2NsazsKKworCS8qIFBvcnQgdmFsdWVzIGZvciBSeCBhbmQgVHggY29kZWNfZGFpICovCisJdW5zaWduZWQgaW50IHJ4X3BvcnRfdmFsdWU7CisJdW5zaWduZWQgaW50IHR4X3BvcnRfdmFsdWU7CisKKwlzdHJ1Y3QgbXV0ZXggY29kZWNfbXV0ZXg7Cit9OworCitzdGF0aWMgY29uc3QgdTMyIGNvbXBfc2hpZnRbXSA9IHsKKwk0LCAvKiBDb21wYW5kZXIgMCdzIGNsb2NrIHNvdXJjZSBpcyBvbiBpbnRlcnBvbGF0b3IgNyAqLworCTAsCisJMiwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29tcF9yeF9wYXRoW10gPSB7CisJQ09NUEFOREVSXzEsCisJQ09NUEFOREVSXzEsCisJQ09NUEFOREVSXzIsCisJQ09NUEFOREVSXzIsCisJQ09NUEFOREVSXzIsCisJQ09NUEFOREVSXzIsCisJQ09NUEFOREVSXzAsCisJQ09NUEFOREVSXzAsCisJQ09NUEFOREVSX01BWCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcF9zYW1wbGVfZGVwZW5kZW50X3BhcmFtcyBjb21wX3NhbXBfcGFyYW1zW10gPSB7CisJeworCQkvKiA4IEtoeiAqLworCQkucGVha19kZXRfdGltZW91dCA9IDB4MDYsCisJCS5ybXNfbWV0ZXJfZGl2X2ZhY3QgPSAweDA5LAorCQkucm1zX21ldGVyX3Jlc2FtcF9mYWN0ID0gMHgwNiwKKwl9LAorCXsKKwkJLyogMTYgS2h6ICovCisJCS5wZWFrX2RldF90aW1lb3V0ID0gMHgwNywKKwkJLnJtc19tZXRlcl9kaXZfZmFjdCA9IDB4MEEsCisJCS5ybXNfbWV0ZXJfcmVzYW1wX2ZhY3QgPSAweDBDLAorCX0sCisJeworCQkvKiAzMiBLaHogKi8KKwkJLnBlYWtfZGV0X3RpbWVvdXQgPSAweDA4LAorCQkucm1zX21ldGVyX2Rpdl9mYWN0ID0gMHgwQiwKKwkJLnJtc19tZXRlcl9yZXNhbXBfZmFjdCA9IDB4MUUsCisJfSwKKwl7CisJCS8qIDQ4IEtoeiAqLworCQkucGVha19kZXRfdGltZW91dCA9IDB4MDksCisJCS5ybXNfbWV0ZXJfZGl2X2ZhY3QgPSAweDBCLAorCQkucm1zX21ldGVyX3Jlc2FtcF9mYWN0ID0gMHgyOCwKKwl9LAorCXsKKwkJLyogOTYgS2h6ICovCisJCS5wZWFrX2RldF90aW1lb3V0ID0gMHgwQSwKKwkJLnJtc19tZXRlcl9kaXZfZmFjdCA9IDB4MEMsCisJCS5ybXNfbWV0ZXJfcmVzYW1wX2ZhY3QgPSAweDUwLAorCX0sCisJeworCQkvKiAxOTIgS2h6ICovCisJCS5wZWFrX2RldF90aW1lb3V0ID0gMHgwQiwKKwkJLnJtc19tZXRlcl9kaXZfZmFjdCA9IDB4QywKKwkJLnJtc19tZXRlcl9yZXNhbXBfZmFjdCA9IDB4QTAsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByeF9kaWdpdGFsX2dhaW5fcmVnW10gPSB7CisJVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTCwKKwlUT01UT01fQV9DRENfUlgyX1ZPTF9DVExfQjJfQ1RMLAorCVRPTVRPTV9BX0NEQ19SWDNfVk9MX0NUTF9CMl9DVEwsCisJVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTCwKKwlUT01UT01fQV9DRENfUlg1X1ZPTF9DVExfQjJfQ1RMLAorCVRPTVRPTV9BX0NEQ19SWDZfVk9MX0NUTF9CMl9DVEwsCisJVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTCwKKwlUT01UT01fQV9DRENfUlg4X1ZPTF9DVExfQjJfQ1RMLAorfTsKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdHhfZGlnaXRhbF9nYWluX3JlZ1tdID0geworCVRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDJfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDNfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDVfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDZfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDhfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDlfVk9MX0NUTF9HQUlOLAorCVRPTVRPTV9BX0NEQ19UWDEwX1ZPTF9DVExfR0FJTiwKK307CisKKy8qCisgKiB3Y2Q5MzMwX2dldF9jb2RlY19pbmZvOiBHZXQgY29kZWMgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKiBAd2NkOXh4eDogcG9pbnRlciB0byB3Y2Q5eHh4IHN0cnVjdHVyZQorICogQHdjZF90eXBlOiBwb2ludGVyIHRvIHdjZDl4eHhfY29kZWNfdHlwZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQorICovCitpbnQgd2NkOTMzMF9nZXRfY29kZWNfaW5mbyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgIHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKndjZF90eXBlKQoreworCXUxNiBpZF9taW5vciwgaWRfbWFqb3I7CisJc3RydWN0IHJlZ21hcCAqd2NkX3JlZ21hcDsKKwlpbnQgcmMsIHZhbCwgdmVyc2lvbiA9IDA7CisKKwlpZiAoIXdjZDl4eHggfHwgIXdjZF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghd2NkOXh4eC0+cmVnbWFwKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggcmVnbWFwIGlzIG51bGwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2NkX3JlZ21hcCA9IHdjZDl4eHgtPnJlZ21hcDsKKwlyYyA9IHJlZ21hcF9idWxrX3JlYWQod2NkX3JlZ21hcCwgVE9NVE9NX0FfQ0hJUF9JRF9CWVRFXzAsCisJCQkgICAgICAodTggKikmaWRfbWlub3IsIHNpemVvZih1MTYpKTsKKwlpZiAocmMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSByZWdtYXBfYnVsa19yZWFkKHdjZF9yZWdtYXAsIFRPTVRPTV9BX0NISVBfSURfQllURV8yLAorCQkJICAgICAgKHU4ICopJmlkX21ham9yLCBzaXplb2YodTE2KSk7CisJaWYgKHJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5eHh4IGNoaXAgaWQgbWFqb3IgMHgleCwgbWlub3IgMHgleFxuIiwKKwkJIF9fZnVuY19fLCBpZF9tYWpvciwgaWRfbWlub3IpOworCisJaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDB4MSkpCisJCXZlcnNpb24gPSAyOworCWVsc2UgaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDB4MCkpCisJCXZlcnNpb24gPSAxOworCWVsc2UKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkOTMzMCB2ZXJzaW9uIHVua25vd24gKG1ham9yIDB4JXgsIG1pbm9yIDB4JXgpXG4iLAorCQkJX19mdW5jX18sIGlkX21ham9yLCBpZF9taW5vcik7CisKKwkvKiBGaWxsIGNvZGVjIHR5cGUgaW5mbyAqLworCXdjZF90eXBlLT5pZF9tYWpvciA9IGlkX21ham9yOworCXdjZF90eXBlLT5pZF9taW5vciA9IGlkX21pbm9yOworCXdjZF90eXBlLT5udW1faXJxcyA9IFdDRDkzMzBfTlVNX0lSUVM7CisJd2NkX3R5cGUtPnZlcnNpb24gPSB2ZXJzaW9uOworCXdjZF90eXBlLT5zbGltX3NsYXZlX3R5cGUgPSBXQ0Q5WFhYX1NMSU1fU0xBVkVfQUREUl9UWVBFXzE7CisJd2NkX3R5cGUtPmkyY19jaGlwX3N0YXR1cyA9IDB4MDE7CisJd2NkX3R5cGUtPmludHJfdGJsID0gd2NkOTMzMF9pbnRyX3RibDsKKwl3Y2RfdHlwZS0+aW50cl90Ymxfc2l6ZSA9IEFSUkFZX1NJWkUod2NkOTMzMF9pbnRyX3RibCk7CisKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX1NUQVRVU19CQVNFXSA9CisJCQkJCQlUT01UT01fQV9JTlRSMV9TVEFUVVMwOworCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gPQorCQkJCQkJVE9NVE9NX0FfSU5UUjFfQ0xFQVIwOworCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSA9CisJCQkJCQlUT01UT01fQV9JTlRSMV9NQVNLMDsKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0xFVkVMX0JBU0VdID0KKwkJCQkJCVRPTVRPTV9BX0lOVFIxX0xFVkVMMDsKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0NMUl9DT01NSVRdID0KKwkJCQkJCVRPTVRPTV9BX0lOVFJfTU9ERTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wod2NkOTMzMF9nZXRfY29kZWNfaW5mbyk7CisKKy8qCisgKiB3Y2Q5MzMwX2JyaW5nZG93bjogQnJpbmdkb3duIFdDRCBDb2RlYworICoKKyAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworaW50IHdjZDkzMzBfYnJpbmdkb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWlmICghd2NkOXh4eCB8fCAhd2NkOXh4eC0+cmVnbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweDcpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweDYpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweGUpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweDgpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDkzMzBfYnJpbmdkb3duKTsKKworLyoKKyAqIHdjZDkzMzBfYnJpbmd1cDogQnJpbmcgdXAgV0NEIENvZGVjCisgKgorICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gd2NkOXh4eCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQorICovCitpbnQgd2NkOTMzMF9icmluZ3VwKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWlmICghd2NkOXh4eCB8fCAhd2NkOXh4eC0+cmVnbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweDQpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0NEQ19DVEwsIDB4MCk7CisJLyogd2FpdCBmb3IgNW1zIGFmdGVyIGNvZGVjIHJlc2V0IGZvciBpdCB0byBjb21wbGV0ZSAqLworCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwlyZWdtYXBfd3JpdGUod2NkOXh4eC0+cmVnbWFwLCBUT01UT01fQV9DRENfQ1RMLCAweDEpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0xFQUtBR0VfQ1RMLCAweDMpOworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFRPTVRPTV9BX0NEQ19DVEwsIDB4Myk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOTMzMF9icmluZ3VwKTsKKworaW50IHRvbXRvbV9lbmFibGVfcWZ1c2Vfc2Vuc2luZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmICh0b210b20tPndjZF9leHRfY2xrKQorCQl0b210b21fY29kZWNfbWNsa19lbmFibGUoY29kZWMsIHRydWUsIGZhbHNlKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX1FGVVNFX0NUTCwgMHgwMyk7CisJLyoKKwkgKiA1bXMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZW5hYmxpbmcgcWZ1c2UgY29udHJvbAorCSAqIGJlZm9yZSBjaGVja2luZyB0aGUgc3RhdHVzLgorCSAqLworCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKwlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgVE9NVE9NX0FfUUZVU0VfU1RBVFVTKSAmICgweDAzKSkgIT0gMHgwMykKKwkJV0FSTigxLCAiJXM6IFFmdXNlIHNlbnNlIGlzIG5vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18pOworCisJaWYgKHRvbXRvbS0+d2NkX2V4dF9jbGspCisJCXRvbXRvbV9jb2RlY19tY2xrX2VuYWJsZShjb2RlYywgZmFsc2UsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodG9tdG9tX2VuYWJsZV9xZnVzZV9zZW5zaW5nKTsKKworc3RhdGljIGludCB0b210b21fZ2V0X3NhbXBsZV9yYXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHBhdGgpCit7CisJaWYgKHBhdGggPT0gUlg4X1BBVEgpCisJCXJldHVybiBzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX0NEQ19SWDhfQjVfQ1RMKTsKKwllbHNlCisJCXJldHVybiBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkoVE9NVE9NX0FfQ0RDX1JYMV9CNV9DVEwgKyA4ICogKHBhdGggLSAxKSkpOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb21wYXJlX2JpdF9mb3JtYXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWludCBiaXRfZm9ybWF0KQoreworCWludCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPREVDX0RBSVM7IGkrKykgeworCQlpZiAodG9tdG9tX3AtPmRhaVtpXS5iaXRfd2lkdGggPT0gYml0X2Zvcm1hdCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3VwZGF0ZV91aHFhX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcGF0aCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwkvKiBVSFFBIHBhdGggaGFzIGZzPTE5MktIeiAmIGJpdD0yNCBiaXQgKi8KKwlpZiAoKCh0b210b21fZ2V0X3NhbXBsZV9yYXRlKGNvZGVjLCBwYXRoKSAmIDB4RTApID09IDB4QTApICYmCisJCSh0b210b21fY29tcGFyZV9iaXRfZm9ybWF0KGNvZGVjLCAyNCkpKSB7CisJCXRvbXRvbV9wLT51aHFhX21vZGUgPSAxOworCX0gZWxzZSB7CisJCXRvbXRvbV9wLT51aHFhX21vZGUgPSAwOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWhxYV9tb2RlPSVkIiwgX19mdW5jX18sIHRvbXRvbV9wLT51aHFhX21vZGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2dldF9hbmNfc2xvdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0b210b20tPmFuY19zbG90OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9wdXRfYW5jX3Nsb3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXRvbXRvbS0+YW5jX3Nsb3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fZ2V0X2FuY19mdW5jKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh0b210b20tPmFuY19mdW5jID09IHRydWUgPyAxIDogMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3B1dF9hbmNfZnVuYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9CisJCQkJc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwltdXRleF9sb2NrKCZ0b210b20tPmNvZGVjX211dGV4KTsKKwl0b210b20tPmFuY19mdW5jID0gKCF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IGZhbHNlIDogdHJ1ZSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYW5jX2Z1bmMgJXgiLCBfX2Z1bmNfXywgdG9tdG9tLT5hbmNfZnVuYyk7CisKKwlpZiAodG9tdG9tLT5hbmNfZnVuYyA9PSB0cnVlKSB7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgSFBIUiIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIRUFEUEhPTkUiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUEhSIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBITCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhFQURQSE9ORSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVBUiBQQSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVBUiIpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIRUFEUEhPTkUiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgRUFSIFBBIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBIUiIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBITCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSEVBRFBIT05FIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVBUiIpOworCX0KKwltdXRleF91bmxvY2soJnRvbXRvbS0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlcigKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJKHNuZF9zb2NfcmVhZChjb2RlYywgKFRPTVRPTV9BX0NEQ19JSVIxX0NUTCArIDE2ICogaWlyX2lkeCkpICYKKwkJKDEgPDwgYmFuZF9pZHgpKSAhPSAwOworCisJcHJfZGVidWcoIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCisJCWlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlcigKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCS8qIE1hc2sgZmlyc3QgNSBiaXRzLCA2LTggYXJlIHJlc2VydmVkICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgKFRPTVRPTV9BX0NEQ19JSVIxX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSgxIDw8IGJhbmRfaWR4KSwgKHZhbHVlIDw8IGJhbmRfaWR4KSk7CisKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJaWlyX2lkeCwgYmFuZF9pZHgsCisJCSgoc25kX3NvY19yZWFkKGNvZGVjLCAoVE9NVE9NX0FfQ0RDX0lJUjFfQ1RMICsgMTYgKiBpaXJfaWR4KSkgJgorCQkoMSA8PCBiYW5kX2lkeCkpICE9IDApKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB1aW50MzJfdCBnZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCisJCQkJaW50IGNvZWZmX2lkeCkKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IDA7CisKKwkvKiBBZGRyZXNzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIGlmIHJlYWRpbmcgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKKworCXZhbHVlIHw9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJKFRPTVRPTV9BX0NEQ19JSVIxX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDEpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpKSA8PCA4KTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IxX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSgoYmFuZF9pZHggKiBCQU5EX01BWCArIGNvZWZmX2lkeCkKKwkJKiBzaXplb2YodWludDMyX3QpICsgMikgJiAweDdGKTsKKworCXZhbHVlIHw9IChzbmRfc29jX3JlYWQoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCkpIDw8IDE2KTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IxX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSgoYmFuZF9pZHggKiBCQU5EX01BWCArIGNvZWZmX2lkeCkKKwkJKiBzaXplb2YodWludDMyX3QpICsgMykgJiAweDdGKTsKKworCS8qIE1hc2sgYml0cyB0b3AgMiBiaXRzIHNpbmNlIHRoZXkgYXJlIHJlc2VydmVkICovCisJdmFsdWUgfD0gKChzbmRfc29jX3JlYWQoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCkpICYgMHgzRikgPDwgMjQpOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPQorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAyKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgNCk7CisKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjAgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIyID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMiA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0sCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9paXJfYmFuZF9jb2VmZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJaW50IGlpcl9pZHgsIGludCBiYW5kX2lkeCwKKwkJCQl1aW50MzJfdCB2YWx1ZSkKK3sKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgJiAweEZGKSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgPj4gOCkgJiAweEZGKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKworCS8qIE1hc2sgdG9wIDIgYml0cywgNy04IGFyZSByZXNlcnZlZCAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShUT01UT01fQV9DRENfSUlSMV9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSh2YWx1ZSA+PiAyNCkgJiAweDNGKTsKK30KKworc3RhdGljIGludCB0b210b21fcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCisJLyogTWFzayB0b3AgYml0IGl0IGlzIHJlc2VydmVkICovCisJLyogVXBkYXRlcyBhZGRyIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggQjIgd3JpdGUgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoVE9NVE9NX0FfQ0RDX0lJUjFfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoYmFuZF9pZHggKiBCQU5EX01BWCAqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7CisKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdKTsKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdKTsKKwlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdKTsKKworCXByX2RlYnVnKCIlczogSUlSICMlZCBiYW5kICMlZCBiMCA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIxID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjIgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGEyID0gMHgleFxuIiwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAwKSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAxKSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAyKSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAzKSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCA0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2dldF9jb21wYW5kZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgY29tcCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCSAgICBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRvbXRvbS0+Y29tcF9lbmFibGVkW2NvbXBdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9zZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogQ29tcGFuZGVyICVkIGVuYWJsZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCisJCSBfX2Z1bmNfXywgY29tcCwgdG9tdG9tLT5jb21wX2VuYWJsZWRbY29tcF0sIHZhbHVlKTsKKwl0b210b20tPmNvbXBfZW5hYmxlZFtjb21wXSA9IHZhbHVlOworCisJaWYgKGNvbXAgPT0gQ09NUEFOREVSXzEgJiYKKwkJCXRvbXRvbS0+Y29tcF9lbmFibGVkW2NvbXBdID09IDEpIHsKKwkJLyogV2F2ZWdlbiB0byA1IG1zZWMgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19DVEwsIDB4REIpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfQ05QX1dHX1RJTUUsIDB4MkEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfQklBU19XR19PQ1AsIDB4MkEpOworCisJCS8qIEVuYWJsZSBDaG9wcGVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQlUT01UT01fQV9SWF9IUEhfQ0hPUF9DVEwsIDB4ODAsIDB4ODApOworCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX05DUF9EVEVTVCwgMHgyMCk7CisJCXByX2RlYnVnKCIlczogRW5hYmxlZCBDaG9wcGVyIGFuZCBzZXQgd2F2ZWdlbiB0byA1IG1zZWNcbiIsCisJCQkJX19mdW5jX18pOworCX0gZWxzZSBpZiAoY29tcCA9PSBDT01QQU5ERVJfMSAmJgorCQkJdG9tdG9tLT5jb21wX2VuYWJsZWRbY29tcF0gPT0gMCkgeworCQkvKiBXYXZlZ2VuIHRvIDIwIG1zZWMgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfSFBIX0NOUF9XR19DVEwsIDB4REIpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfQ05QX1dHX1RJTUUsIDB4NTgpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfQklBU19XR19PQ1AsIDB4MUEpOworCisJCS8qIERpc2FibGUgQ0hPUFBFUiBibG9jayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJVE9NVE9NX0FfUlhfSFBIX0NIT1BfQ1RMLCAweDgwLCAweDAwKTsKKworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9OQ1BfRFRFU1QsIDB4MTApOworCQlwcl9kZWJ1ZygiJXM6IERpc2FibGVkIENob3BwZXIgYW5kIHNldCB3YXZlZ2VuIHRvIDIwIG1zZWNcbiIsCisJCQkJX19mdW5jX18pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29uZmlnX2dhaW5fY29tcGFuZGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgaW50IGNvbXAsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjb21wKSB7CisJY2FzZSBDT01QQU5ERVJfMDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfU1BLUl9EUlYxX0dBSU4sCisJCQkJICAgIDEgPDwgMiwgIWVuYWJsZSA8PCAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfU1BLUl9EUlYyX0dBSU4sCisJCQkJICAgIDEgPDwgMiwgIWVuYWJsZSA8PCAyKTsKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfMToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUlhfSFBIX0xfR0FJTiwKKwkJCQkgICAgMSA8PCA1LCAhZW5hYmxlIDw8IDUpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfUl9HQUlOLAorCQkJCSAgICAxIDw8IDUsICFlbmFibGUgPDwgNSk7CisJCWJyZWFrOworCWNhc2UgQ09NUEFOREVSXzI6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0xJTkVfMV9HQUlOLAorCQkJCSAgICAxIDw8IDUsICFlbmFibGUgPDwgNSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0xJTkVfM19HQUlOLAorCQkJCSAgICAxIDw8IDUsICFlbmFibGUgPDwgNSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0xJTkVfMl9HQUlOLAorCQkJCSAgICAxIDw8IDUsICFlbmFibGUgPDwgNSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0xJTkVfNF9HQUlOLAorCQkJCSAgICAxIDw8IDUsICFlbmFibGUgPDwgNSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdG9tdG9tX2Rpc2NoYXJnZV9jb21wKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNvbXApCit7CisJLyogTGV2ZWwgbWV0ZXIgRElWIEZhY3RvciB0byA1Ki8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQ09NUDBfQjJfQ1RMICsgKGNvbXAgKiA4KSwgMHhGMCwKKwkJCSAgICAweDA1IDw8IDQpOworCS8qIFJNUyBtZXRlciBTYW1wbGluZyB0byAweDAxICovCisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX0NPTVAwX0IzX0NUTCArIChjb21wICogOCksIDB4MDEpOworCisJLyogV29yc3QgY2FzZSB0aW1lb3V0IGZvciBjb21wYW5kZXIgQ25QIHNsZWVwIHRpbWVvdXQgKi8KKwl1c2xlZXBfcmFuZ2UoMzAwMCwgMzEwMCk7Cit9CisKK3N0YXRpYyBlbnVtIHdjZDl4eHhfYnVja192b2x0IHRvbXRvbV9jb2RlY19nZXRfYnVja19tdigKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGJ1Y2tfdm9sdCA9IFdDRDlYWFhfQ0RDX0JVQ0tfVU5TVVBQT1JURUQ7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSB0b210b20tPnJlc21nci5wZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5yZWd1bGF0b3IpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAocGRhdGEtPnJlZ3VsYXRvcltpXS5uYW1lLAorCQkJCQkgV0NEOVhYWF9TVVBQTFlfQlVDS19OQU1FKSkgeworCQkJaWYgKChwZGF0YS0+cmVndWxhdG9yW2ldLm1pbl91ViA9PQorCQkJCQlXQ0Q5WFhYX0NEQ19CVUNLX01WXzFQOCkgfHwKKwkJCQkocGRhdGEtPnJlZ3VsYXRvcltpXS5taW5fdVYgPT0KKwkJCQkJV0NEOVhYWF9DRENfQlVDS19NVl8yUDE1KSkKKwkJCQlidWNrX3ZvbHQgPSBwZGF0YS0+cmVndWxhdG9yW2ldLm1pbl91VjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBidWNrX3ZvbHQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvbmZpZ19jb21wYW5kZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCWludCBtYXNrLCBlbmFibGVfbWFzazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljb25zdCBpbnQgY29tcCA9IHctPnNoaWZ0OworCWNvbnN0IHUzMiByYXRlID0gdG9tdG9tLT5jb21wX2ZzW2NvbXBdOworCWNvbnN0IHN0cnVjdCBjb21wX3NhbXBsZV9kZXBlbmRlbnRfcGFyYW1zICpjb21wX3BhcmFtcyA9CisJICAgICZjb21wX3NhbXBfcGFyYW1zW3JhdGVdOworCWVudW0gd2NkOXh4eF9idWNrX3ZvbHQgYnVja19tdjsKKworCXByX2RlYnVnKCIlczogJXMgZXZlbnQgJWQgY29tcGFuZGVyICVkLCBlbmFibGVkICVkIiwgX19mdW5jX18sCisJCSB3LT5uYW1lLCBldmVudCwgY29tcCwgdG9tdG9tLT5jb21wX2VuYWJsZWRbY29tcF0pOworCisJaWYgKCF0b210b20tPmNvbXBfZW5hYmxlZFtjb21wXSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDb21wYW5kZXIgMCBoYXMgdHdvIGNoYW5uZWxzICovCisJbWFzayA9IGVuYWJsZV9tYXNrID0gMHgwMzsKKwlidWNrX212ID0gdG9tdG9tX2NvZGVjX2dldF9idWNrX212KGNvZGVjKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkvKiBTZXQgY29tcGFuZGVyIFNhbXBsZSByYXRlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJICAgIFRPTVRPTV9BX0NEQ19DT01QMF9GU19DRkcgKyAoY29tcCAqIDgpLAorCQkJCSAgICAweDA3LCByYXRlKTsKKwkJLyogU2V0IHRoZSBzdGF0aWMgZ2FpbiBvZmZzZXQgZm9yIEhQSCBQYXRoICovCisJCWlmIChjb21wID09IENPTVBBTkRFUl8xKSB7CisJCQlpZiAoYnVja19tdiA9PSBXQ0Q5WFhYX0NEQ19CVUNLX01WXzJQMTUpIHsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ09NUDBfQjRfQ1RMICsgKGNvbXAgKiA4KSwKKwkJCQkJMHg4MCwgMHgwMCk7CisJCQl9IGVsc2UgeworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVRPTVRPTV9BX0NEQ19DT01QMF9CNF9DVEwgKyAoY29tcCAqIDgpLAorCQkJCQkweDgwLCAweDgwKTsKKwkJCX0KKwkJfQorCQkvKiBFbmFibGUgUlggaW50ZXJwb2xhdGlvbiBwYXRoIGNvbXBhbmRlciBjbG9ja3MgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVEwsCisJCQkJICAgIG1hc2sgPDwgY29tcF9zaGlmdFtjb21wXSwKKwkJCQkgICAgbWFzayA8PCBjb21wX3NoaWZ0W2NvbXBdKTsKKwkJLyogVG9nZ2xlIGNvbXBhbmRlciByZXNldCBiaXRzICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19DTEtfT1RIUl9SRVNFVF9CMl9DVEwsCisJCQkJICAgIG1hc2sgPDwgY29tcF9zaGlmdFtjb21wXSwKKwkJCQkgICAgbWFzayA8PCBjb21wX3NoaWZ0W2NvbXBdKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IyX0NUTCwKKwkJCQkgICAgbWFzayA8PCBjb21wX3NoaWZ0W2NvbXBdLCAwKTsKKworCQkvKiBTZXQgZ2FpbiBzb3VyY2UgdG8gY29tcGFuZGVyICovCisJCXRvbXRvbV9jb25maWdfZ2Fpbl9jb21wYW5kZXIoY29kZWMsIGNvbXAsIHRydWUpOworCisJCS8qIENvbXBhbmRlciBlbmFibGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NPTVAwX0IxX0NUTCArCisJCQkJICAgIChjb21wICogOCksIGVuYWJsZV9tYXNrLCBlbmFibGVfbWFzayk7CisKKwkJdG9tdG9tX2Rpc2NoYXJnZV9jb21wKGNvZGVjLCBjb21wKTsKKworCQkvKiBTZXQgc2FtcGxlIHJhdGUgZGVwZW5kZW50IHBhcmFtZXRlciAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9DRENfQ09NUDBfQjNfQ1RMICsgKGNvbXAgKiA4KSwKKwkJCSAgICAgIGNvbXBfcGFyYW1zLT5ybXNfbWV0ZXJfcmVzYW1wX2ZhY3QpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCSAgICBUT01UT01fQV9DRENfQ09NUDBfQjJfQ1RMICsgKGNvbXAgKiA4KSwKKwkJCQkgICAgMHhGMCwgY29tcF9wYXJhbXMtPnJtc19tZXRlcl9kaXZfZmFjdCA8PCA0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJVE9NVE9NX0FfQ0RDX0NPTVAwX0IyX0NUTCArIChjb21wICogOCksCisJCQkJCTB4MEYsIGNvbXBfcGFyYW1zLT5wZWFrX2RldF90aW1lb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJLyogRGlzYWJsZSBjb21wYW5kZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgVE9NVE9NX0FfQ0RDX0NPTVAwX0IxX0NUTCArIChjb21wICogOCksCisJCQkJICAgIGVuYWJsZV9tYXNrLCAweDAwKTsKKworCQkvKiBUb2dnbGUgY29tcGFuZGVyIHJlc2V0IGJpdHMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NMS19PVEhSX1JFU0VUX0IyX0NUTCwKKwkJCQkgICAgbWFzayA8PCBjb21wX3NoaWZ0W2NvbXBdLAorCQkJCSAgICBtYXNrIDw8IGNvbXBfc2hpZnRbY29tcF0pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjJfQ1RMLAorCQkJCSAgICBtYXNrIDw8IGNvbXBfc2hpZnRbY29tcF0sIDApOworCisJCS8qIFR1cm4gb2ZmIHRoZSBjbG9jayBmb3IgY29tcGFuZGVyIGluIHBhaXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NMS19SWF9CMl9DVEwsCisJCQkJICAgIG1hc2sgPDwgY29tcF9zaGlmdFtjb21wXSwgMCk7CisKKwkJLyogU2V0IGdhaW4gc291cmNlIHRvIHJlZ2lzdGVyICovCisJCXRvbXRvbV9jb25maWdfZ2Fpbl9jb21wYW5kZXIoY29kZWMsIGNvbXAsIGZhbHNlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRvbXRvbV9hbmNfZnVuY190ZXh0W10gPSB7Ik9GRiIsICJPTiJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0b210b21fYW5jX2Z1bmNfZW51bSA9CisJCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgdG9tdG9tX2FuY19mdW5jX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFibGFfZWFyX3BhX2dhaW5fdGV4dFtdID0geyJQT1NfNl9EQiIsICJQT1NfMl9EQiJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0YWJsYV9lYXJfcGFfZ2Fpbl9lbnVtW10gPSB7CisJCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgdGFibGFfZWFyX3BhX2dhaW5fdGV4dCksCit9OworCisvKmN1dCBvZiBmcmVxdWVuY3kgZm9yIGhpZ2ggcGFzcyBmaWx0ZXIqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZl90ZXh0W10gPSB7CisJIk1JTl8zREJfNEh6IiwgIk1JTl8zREJfNzVIeiIsICJNSU5fM0RCXzE1MEh6IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9jZl90ZXh0W10gPSB7CisJIk1JTl8zREJfNEh6IiwgIk1JTl8zREJfNzVIeiIsICJNSU5fM0RCXzE1MEh6IiwKKwkiTUlOXzNEQl8wUDQ4SHoiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTCwgNCwgMywgY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfZGVjMl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX1RYMl9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWMzX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfVFgzX01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19UWDRfTVVYX0NUTCwgNCwgMywgY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfZGVjNV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX1RYNV9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWM2X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfVFg2X01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzdfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19UWDdfTVVYX0NUTCwgNCwgMywgY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfZGVjOF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX1RYOF9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWM5X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfVFg5X01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzEwX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDJfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDNfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDRfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDVfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KQorOworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDZfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDZfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDdfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDdfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19SWDhfQjRfQ1RMLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbGFzc19oX2RzbV90ZXh0W10gPSB7CisJIlpFUk8iLCAiRFNNX0hQSExfUlgxIiwgIkRTTV9TUEtSX1JYNyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2xhc3NfaF9kc21fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX0NMU0hfQ1RMLCA0LCAzLCBjbGFzc19oX2RzbV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNsYXNzX2hfZHNtX211eCA9CisJU09DX0RBUE1fRU5VTSgiQ0xBU1NfSF9EU00gTVVYIE11eCIsIGNsYXNzX2hfZHNtX2VudW0pOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4MV9pbnRlcnBfdGV4dFtdID0geworCSJaRVJPIiwgIlJYMSBNSVgyIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDFfaW50ZXJwX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgMCwgMiwgcngxX2ludGVycF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4MV9pbnRlcnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDEgSU5URVJQIE1VWCBNdXgiLCByeDFfaW50ZXJwX2VudW0pOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4Ml9pbnRlcnBfdGV4dFtdID0geworCSJaRVJPIiwgIlJYMiBNSVgyIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfaW50ZXJwX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgMSwgMiwgcngyX2ludGVycF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4Ml9pbnRlcnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDIgSU5URVJQIE1VWCBNdXgiLCByeDJfaW50ZXJwX2VudW0pOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdG9tdG9tX2Nvbm5fbWFkX3RleHRbXSA9IHsKKwkiQURDX01CIiwgIkFEQzEiLCAiQURDMiIsICJBREMzIiwgIkFEQzQiLCAiQURDNSIsICJBREM2IiwgIk5PVFVTRUQxIiwKKwkiRE1JQzEiLCAiRE1JQzIiLCAiRE1JQzMiLCAiRE1JQzQiLCAiRE1JQzUiLCAiRE1JQzYiLCAiTk9UVVNFRDIiLAorCSJOT1RVU0VEMyJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRvbXRvbV9jb25uX21hZF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUodG9tdG9tX2Nvbm5fbWFkX3RleHQpLAorCQkJdG9tdG9tX2Nvbm5fbWFkX3RleHQpOworCisKK3N0YXRpYyBpbnQgdG9tdG9tX21hZF9pbnB1dF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggdG9tdG9tX21hZF9pbnB1dDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCXRvbXRvbV9tYWRfaW5wdXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfSU5QX1NFTCk7CisKKwl0b210b21fbWFkX2lucHV0ID0gdG9tdG9tX21hZF9pbnB1dCAmIDB4MEY7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRvbXRvbV9tYWRfaW5wdXQ7CisKKwlwcl9kZWJ1ZygiJXM6IHRvbXRvbV9tYWRfaW5wdXQgPSAlc1xuIiwgX19mdW5jX18sCisJCQl0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fbWFkX2lucHV0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1OCB0b210b21fbWFkX2lucHV0OworCXUxNiBtaWNiX2ludF9yZWcsIG1pY2JfNF9pbnRfcmVnOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJY2hhciBtYWRfYW1pY19pbnB1dF93aWRnZXRbNl07CisJdTMyIGFkYzsKKwljb25zdCBjaGFyICptYWRfaW5wdXRfd2lkZ2V0OworCWNvbnN0IGNoYXIgKnNvdXJjZV93aWRnZXQgPSBOVUxMOworCXUzMiAgbWljX2JpYXNfZm91bmQgPSAwOworCXUzMiBpOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisJY2hhciAqbWFkX2lucHV0OworCisJdG9tdG9tX21hZF9pbnB1dCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW1pY2JfNF9pbnRfcmVnID0gdG9tdG9tLT5yZXNtZ3IucmVnX2FkZHItPm1pY2JfNF9pbnRfcmJpYXM7CisKKwlwcl9kZWJ1ZygiJXM6IHRvbXRvbV9tYWRfaW5wdXQgPSAlc1xuIiwgX19mdW5jX18sCisJCQl0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSk7CisKKwlpZiAoIXN0cmNtcCh0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSwgIk5PVFVTRUQxIikgfHwKKwkJIXN0cmNtcCh0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSwgIk5PVFVTRUQyIikgfHwKKwkJIXN0cmNtcCh0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSwgIk5PVFVTRUQzIikgfHwKKwkJIXN0cmNtcCh0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSwgIkFEQ19NQiIpKSB7CisJCXByX2luZm8oIiVzOiB0b210b20gbWFkIGlucHV0IGlzIHNldCB0byB1bnN1cHBvcnRlZCBpbnB1dCA9ICVzXG4iLAorCQkJX19mdW5jX18sIHRvbXRvbV9jb25uX21hZF90ZXh0W3RvbXRvbV9tYWRfaW5wdXRdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cm5zdHIodG9tdG9tX2Nvbm5fbWFkX3RleHRbdG9tdG9tX21hZF9pbnB1dF0sCisJCQkJIkFEQyIsIHNpemVvZigiQURDIikpKSB7CisJCW1hZF9pbnB1dCA9IHN0cnBicmsodG9tdG9tX2Nvbm5fbWFkX3RleHRbdG9tdG9tX21hZF9pbnB1dF0sCisJCQkJIjEyMzQ1NiIpOworCQlpZiAoIW1hZF9pbnB1dCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgTUFEIGlucHV0ICVzXG4iLAorCQkJX19mdW5jX18sIHRvbXRvbV9jb25uX21hZF90ZXh0W3RvbXRvbV9tYWRfaW5wdXRdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IGtzdHJ0b3VpbnQobWFkX2lucHV0LCAxMCwgJmFkYyk7CisJCWlmICgocmV0IDwgMCkgfHwgKGFkYyA+IDYpKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEFEQyA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJCQl0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XSk7CisJCQlyZXQgPSAgLUVJTlZBTDsKKwkJfQorCisJCXNucHJpbnRmKG1hZF9hbWljX2lucHV0X3dpZGdldCwgNiwgIiVzJXUiLCAiQU1JQyIsIGFkYyk7CisKKwkJbWFkX2lucHV0X3dpZGdldCA9IG1hZF9hbWljX2lucHV0X3dpZGdldDsKKwkJcHJfZGVidWcoIiVzOiB0b210b20gYW1pYyBpbnB1dCB3aWRnZXQgPSAlc1xuIiwgX19mdW5jX18sCisJCQkgIG1hZF9hbWljX2lucHV0X3dpZGdldCk7CisJfSBlbHNlIHsKKwkJLyogRE1JQyB0eXBlIGlucHV0IHdpZGdldCovCisJCW1hZF9pbnB1dF93aWRnZXQgPSB0b210b21fY29ubl9tYWRfdGV4dFt0b210b21fbWFkX2lucHV0XTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHRvbXRvbSBpbnB1dCB3aWRnZXQgPSAlc1xuIiwgX19mdW5jX18sIG1hZF9pbnB1dF93aWRnZXQpOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9kYXBtX3JvdXRlczsgaSsrKSB7CisKKwkJaWYgKCFzdHJjbXAoY2FyZC0+ZGFwbV9yb3V0ZXNbaV0uc2luaywgbWFkX2lucHV0X3dpZGdldCkpIHsKKworCQkJc291cmNlX3dpZGdldCA9IGNhcmQtPmRhcG1fcm91dGVzW2ldLnNvdXJjZTsKKwkJCWlmICghc291cmNlX3dpZGdldCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOiBpbnZhbGlkIHNvdXJjZSB3aWRnZXRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDE7CisJCQkJbWljYl9pbnRfcmVnID0gVE9NVE9NX0FfTUlDQl8xX0lOVF9SQklBUzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoc3RybnN0cihzb3VyY2Vfd2lkZ2V0LAorCQkJCSJNSUMgQklBUzIiLCBzaXplb2YoIk1JQyBCSUFTMiIpKSkgeworCQkJCW1pY19iaWFzX2ZvdW5kID0gMjsKKwkJCQltaWNiX2ludF9yZWcgPSBUT01UT01fQV9NSUNCXzJfSU5UX1JCSUFTOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsCisJCQkJIk1JQyBCSUFTMyIsIHNpemVvZigiTUlDIEJJQVMzIikpKSB7CisJCQkJbWljX2JpYXNfZm91bmQgPSAzOworCQkJCW1pY2JfaW50X3JlZyA9IFRPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVM7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDQ7CisJCQkJbWljYl9pbnRfcmVnID0gbWljYl80X2ludF9yZWc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobWljX2JpYXNfZm91bmQpIHsKKwkJcHJfZGVidWcoIiVzOiBzb3VyY2UgbWljIGJpYXMgPSAlcy4gc2luayA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJCQljYXJkLT5kYXBtX3JvdXRlc1tpXS5zb3VyY2UsCisJCQkJY2FyZC0+ZGFwbV9yb3V0ZXNbaV0uc2luayk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9JTlBfU0VMLAorCQkJCQkweDBGLCB0b210b21fbWFkX2lucHV0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUFEX0FOQV9DVFJMLAorCQkJCQkweDA3LCBtaWNfYmlhc19mb3VuZCk7CisKKwkJLyogU2V0dXAgaW50ZXJuYWwgbWljYmlhcyAqLworCisJCWlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsICJJbnRlcm5hbDEiLCBzdHJsZW4oc291cmNlX3dpZGdldCkpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWljYl9pbnRfcmVnLAorCQkJCQkweEUwLCAweEUwKTsKKwkJZWxzZSBpZiAoc3RybnN0cihzb3VyY2Vfd2lkZ2V0LCAiSW50ZXJuYWwyIiwKKwkJCQlzdHJsZW4oc291cmNlX3dpZGdldCkpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWljYl9pbnRfcmVnLAorCQkJCQkweDFDLCAweDFDKTsKKwkJZWxzZSBpZiAoc3RybnN0cihzb3VyY2Vfd2lkZ2V0LCAiSW50ZXJuYWwzIiwKKwkJCQlzdHJsZW4oc291cmNlX3dpZGdldCkpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWljYl9pbnRfcmVnLAorCQkJCQkweDMsIDB4Myk7CisJCWVsc2UKKwkJCS8qCisJCQkgKiAgSWYgbm90IGludGVybmFsLCBtYWtlIHN1cmUgdG8gd3JpdGUgdGhlCisJCQkgKiAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCQkJICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MjQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9lcnIoIiVzOiBtaWMgYmlhcyBzb3VyY2Ugbm90IGZvdW5kIGZvciBpbnB1dCA9ICVzXG4iLAorCQlfX2Z1bmNfXywgbWFkX2lucHV0X3dpZGdldCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3R4X2hwZl9ieXBhc3NfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXUzMgl0eF9pbmRleDsKKworCXR4X2luZGV4ID0gKHUzMilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmICh0eF9pbmRleCA+IE5VTV9ERUNJTUFUT1JTKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgVFggZGVjaW1hdG9yICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgIHR4X2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQl0eF9ocGZfd29ya1t0eF9pbmRleC0xXS50eF9ocGZfYnlwYXNzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3R4X2hwZl9ieXBhc3NfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWJvb2wgdHhfaHBmX2J5cGFzc19jZmc7CisJdTMyCXR4X2luZGV4OworCisJdHhfaHBmX2J5cGFzc19jZmcgPSAoYm9vbCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdHhfaHBmX2J5cGFzcyA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXR4X2hwZl9ieXBhc3NfY2ZnKTsKKworCXR4X2luZGV4ID0gKHUzMilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmICh0eF9pbmRleCA+IE5VTV9ERUNJTUFUT1JTKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgVFggZGVjaW1hdG9yICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgIHR4X2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh0eF9ocGZfd29ya1t0eF9pbmRleC0xXS50eF9ocGZfYnlwYXNzICE9IHR4X2hwZl9ieXBhc3NfY2ZnKQorCQl0eF9ocGZfd29ya1t0eF9pbmRleC0xXS50eF9ocGZfYnlwYXNzID0gdHhfaHBmX2J5cGFzc19jZmc7CisKKwlwcl9kZWJ1ZygiJXM6IFNldCBUWCVkIEhQRiBieXBhc3MgY29uZmlndXJhdGlvbiAlZCIsCisJCQkgX19mdW5jX18sIHR4X2luZGV4LAorCQkJIHR4X2hwZl93b3JrW3R4X2luZGV4LTFdLnR4X2hwZl9ieXBhc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0b210b21fc25kX2NvbnRyb2xzW10gPSB7CisKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgxIERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYMV9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgyIERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYMl9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgzIERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYM19WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg0IERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYNF9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg1IERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYNV9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg2IERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYNl9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg3IERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYN19WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg4IERpZ2l0YWwgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1JYOF9WT0xfQ1RMX0IyX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKworCVNPQ19TSU5HTEVfU1hfVExWKCJERUMxIFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9HQUlOLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzIgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1RYMl9WT0xfQ1RMX0dBSU4sIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDMyBWb2x1bWUiLCBUT01UT01fQV9DRENfVFgzX1ZPTF9DVExfR0FJTiwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUM0IFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19UWDRfVk9MX0NUTF9HQUlOLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzUgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1RYNV9WT0xfQ1RMX0dBSU4sIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDNiBWb2x1bWUiLCBUT01UT01fQV9DRENfVFg2X1ZPTF9DVExfR0FJTiwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUM3IFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19UWDdfVk9MX0NUTF9HQUlOLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzggVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX1RYOF9WT0xfQ1RMX0dBSU4sIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDOSBWb2x1bWUiLCBUT01UT01fQV9DRENfVFg5X1ZPTF9DVExfR0FJTiwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUMxMCBWb2x1bWUiLCBUT01UT01fQV9DRENfVFgxMF9WT0xfQ1RMX0dBSU4sIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKworCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDEgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMV9DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAyIFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjJfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMyBWb2x1bWUiLCBUT01UT01fQV9DRENfSUlSMV9HQUlOX0IzX0NUTCwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDQgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNF9DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMiBJTlAxIFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjIgSU5QMiBWb2x1bWUiLCBUT01UT01fQV9DRENfSUlSMl9HQUlOX0IyX0NUTCwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIyIElOUDMgVm9sdW1lIiwgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CM19DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMiBJTlA0IFZvbHVtZSIsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX0VYVCgiQU5DIFNsb3QiLCBTTkRfU09DX05PUE0sIDAsIDEwMCwgMCwgdG9tdG9tX2dldF9hbmNfc2xvdCwKKwkJdG9tdG9tX3B1dF9hbmNfc2xvdCksCisJU09DX0VOVU1fRVhUKCJBTkMgRnVuY3Rpb24iLCB0b210b21fYW5jX2Z1bmNfZW51bSwgdG9tdG9tX2dldF9hbmNfZnVuYywKKwkJdG9tdG9tX3B1dF9hbmNfZnVuYyksCisKKwlTT0NfRU5VTSgiVFgxIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMV9lbnVtKSwKKwlTT0NfRU5VTSgiVFgyIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMl9lbnVtKSwKKwlTT0NfRU5VTSgiVFgzIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjM19lbnVtKSwKKwlTT0NfRU5VTSgiVFg0IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNF9lbnVtKSwKKwlTT0NfRU5VTSgiVFg1IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNV9lbnVtKSwKKwlTT0NfRU5VTSgiVFg2IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNl9lbnVtKSwKKwlTT0NfRU5VTSgiVFg3IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjN19lbnVtKSwKKwlTT0NfRU5VTSgiVFg4IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjOF9lbnVtKSwKKwlTT0NfRU5VTSgiVFg5IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjOV9lbnVtKSwKKwlTT0NfRU5VTSgiVFgxMCBIUEYgY3V0IG9mZiIsIGNmX2RlYzEwX2VudW0pLAorCisJU09DX1NJTkdMRV9CT09MX0VYVCgiVFgxIEhQRiBTd2l0Y2giLCAxLAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX2dldCwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19wdXQpLAorCVNPQ19TSU5HTEVfQk9PTF9FWFQoIlRYMiBIUEYgU3dpdGNoIiwgMiwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19nZXQsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfcHV0KSwKKwlTT0NfU0lOR0xFX0JPT0xfRVhUKCJUWDMgSFBGIFN3aXRjaCIsIDMsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfZ2V0LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX3B1dCksCisJU09DX1NJTkdMRV9CT09MX0VYVCgiVFg0IEhQRiBTd2l0Y2giLCA0LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX2dldCwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19wdXQpLAorCVNPQ19TSU5HTEVfQk9PTF9FWFQoIlRYNSBIUEYgU3dpdGNoIiwgNSwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19nZXQsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfcHV0KSwKKwlTT0NfU0lOR0xFX0JPT0xfRVhUKCJUWDYgSFBGIFN3aXRjaCIsIDYsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfZ2V0LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX3B1dCksCisJU09DX1NJTkdMRV9CT09MX0VYVCgiVFg3IEhQRiBTd2l0Y2giLCA3LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX2dldCwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19wdXQpLAorCVNPQ19TSU5HTEVfQk9PTF9FWFQoIlRYOCBIUEYgU3dpdGNoIiwgOCwKKwkJCQl0b210b21fdHhfaHBmX2J5cGFzc19nZXQsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfcHV0KSwKKwlTT0NfU0lOR0xFX0JPT0xfRVhUKCJUWDkgSFBGIFN3aXRjaCIsIDksCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfZ2V0LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX3B1dCksCisJU09DX1NJTkdMRV9CT09MX0VYVCgiVFgxMCBIUEYgU3dpdGNoIiwgMTAsCisJCQkJdG9tdG9tX3R4X2hwZl9ieXBhc3NfZ2V0LAorCQkJCXRvbXRvbV90eF9ocGZfYnlwYXNzX3B1dCksCisKKwlTT0NfU0lOR0xFKCJSWDEgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDFfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDIgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDJfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDMgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDNfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDQgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDRfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDUgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDVfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDYgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDZfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDcgSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDdfQjVfQ1RMLCAyLCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJSWDggSFBGIFN3aXRjaCIsIFRPTVRPTV9BX0NEQ19SWDhfQjVfQ1RMLCAyLCAxLCAwKSwKKworCVNPQ19FTlVNKCJSWDEgSFBGIGN1dCBvZmYiLCBjZl9yeG1peDFfZW51bSksCisJU09DX0VOVU0oIlJYMiBIUEYgY3V0IG9mZiIsIGNmX3J4bWl4Ml9lbnVtKSwKKwlTT0NfRU5VTSgiUlgzIEhQRiBjdXQgb2ZmIiwgY2ZfcnhtaXgzX2VudW0pLAorCVNPQ19FTlVNKCJSWDQgSFBGIGN1dCBvZmYiLCBjZl9yeG1peDRfZW51bSksCisJU09DX0VOVU0oIlJYNSBIUEYgY3V0IG9mZiIsIGNmX3J4bWl4NV9lbnVtKSwKKwlTT0NfRU5VTSgiUlg2IEhQRiBjdXQgb2ZmIiwgY2ZfcnhtaXg2X2VudW0pLAorCVNPQ19FTlVNKCJSWDcgSFBGIGN1dCBvZmYiLCBjZl9yeG1peDdfZW51bSksCisJU09DX0VOVU0oIlJYOCBIUEYgY3V0IG9mZiIsIGNmX3J4bWl4OF9lbnVtKSwKKworCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMSIsIElJUjEsIEJBTkQxLCAxLCAwLAorCXRvbXRvbV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDIiLCBJSVIxLCBCQU5EMiwgMSwgMCwKKwl0b210b21fZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQzIiwgSUlSMSwgQkFORDMsIDEsIDAsCisJdG9tdG9tX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAxLCAwLAorCXRvbXRvbV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDUiLCBJSVIxLCBCQU5ENSwgMSwgMCwKKwl0b210b21fZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQxIiwgSUlSMiwgQkFORDEsIDEsIDAsCisJdG9tdG9tX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIyIEVuYWJsZSBCYW5kMiIsIElJUjIsIEJBTkQyLCAxLCAwLAorCXRvbXRvbV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMiBFbmFibGUgQmFuZDMiLCBJSVIyLCBCQU5EMywgMSwgMCwKKwl0b210b21fZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQ0IiwgSUlSMiwgQkFORDQsIDEsIDAsCisJdG9tdG9tX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIyIEVuYWJsZSBCYW5kNSIsIElJUjIsIEJBTkQ1LCAxLCAwLAorCXRvbXRvbV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQxIiwgSUlSMSwgQkFORDEsIDI1NSwgMCwgNSwKKwl0b210b21fZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMiIsIElJUjEsIEJBTkQyLCAyNTUsIDAsIDUsCisJdG9tdG9tX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDMiLCBJSVIxLCBCQU5EMywgMjU1LCAwLCA1LAorCXRvbXRvbV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQ0IiwgSUlSMSwgQkFORDQsIDI1NSwgMCwgNSwKKwl0b210b21fZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAyNTUsIDAsIDUsCisJdG9tdG9tX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjIgQmFuZDEiLCBJSVIyLCBCQU5EMSwgMjU1LCAwLCA1LAorCXRvbXRvbV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQyIiwgSUlSMiwgQkFORDIsIDI1NSwgMCwgNSwKKwl0b210b21fZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMiBCYW5kMyIsIElJUjIsIEJBTkQzLCAyNTUsIDAsIDUsCisJdG9tdG9tX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdG9tdG9tX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjIgQmFuZDQiLCBJSVIyLCBCQU5ENCwgMjU1LCAwLCA1LAorCXRvbXRvbV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRvbXRvbV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQ1IiwgSUlSMiwgQkFORDUsIDI1NSwgMCwgNSwKKwl0b210b21fZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0b210b21fcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKworCVNPQ19TSU5HTEVfRVhUKCJDT01QMCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl8wLCAxLCAwLAorCQkgICAgICAgdG9tdG9tX2dldF9jb21wYW5kZXIsIHRvbXRvbV9zZXRfY29tcGFuZGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDEgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfMSwgMSwgMCwKKwkJICAgICAgIHRvbXRvbV9nZXRfY29tcGFuZGVyLCB0b210b21fc2V0X2NvbXBhbmRlciksCisJU09DX1NJTkdMRV9FWFQoIkNPTVAyIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzIsIDEsIDAsCisJCSAgICAgICB0b210b21fZ2V0X2NvbXBhbmRlciwgdG9tdG9tX3NldF9jb21wYW5kZXIpLAorCisJU09DX0VOVU1fRVhUKCJNQUQgSW5wdXQiLCB0b210b21fY29ubl9tYWRfZW51bSwKKwkJCXRvbXRvbV9tYWRfaW5wdXRfZ2V0LCB0b210b21fbWFkX2lucHV0X3B1dCksCisKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXU4IGVhcl9wYV9nYWluOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCisJZWFyX3BhX2dhaW4gPSBzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1JYX0VBUl9HQUlOKTsKKworCWVhcl9wYV9nYWluID0gZWFyX3BhX2dhaW4gPj4gNTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZWFyX3BhX2dhaW47CisKKwlwcl9kZWJ1ZygiJXM6IGVhcl9wYV9nYWluID0gMHgleFxuIiwgX19mdW5jX18sIGVhcl9wYV9nYWluKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9wYV9nYWluX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1OCBlYXJfcGFfZ2FpbjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCXByX2RlYnVnKCIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gID0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCWVhcl9wYV9nYWluID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDw8IDU7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9SWF9FQVJfR0FJTiwgMHhFMCwgZWFyX3BhX2dhaW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRvbXRvbV8xX3hfZWFyX3BhX2dhaW5fdGV4dFtdID0geworCSJQT1NfNl9EQiIsICJQT1NfNFA1X0RCIiwgIlBPU18zX0RCIiwgIlBPU18xUDVfREIiLAorCSJQT1NfMF9EQiIsICJORUdfMlA1X0RCIiwgIlVOREVGSU5FRCIsICJORUdfMTJfREIiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRvbXRvbV8xX3hfZWFyX3BhX2dhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHRvbXRvbV8xX3hfZWFyX3BhX2dhaW5fdGV4dCksCisJCQl0b210b21fMV94X2Vhcl9wYV9nYWluX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdG9tdG9tXzFfeF9hbmFsb2dfZ2Fpbl9jb250cm9sc1tdID0geworCisJU09DX0VOVU1fRVhUKCJFQVIgUEEgR2FpbiIsIHRvbXRvbV8xX3hfZWFyX3BhX2dhaW5fZW51bSwKKwkJdG9tdG9tX3BhX2dhaW5fZ2V0LCB0b210b21fcGFfZ2Fpbl9wdXQpLAorCisJU09DX1NJTkdMRV9UTFYoIkhQSEwgVm9sdW1lIiwgVE9NVE9NX0FfUlhfSFBIX0xfR0FJTiwgMCwgMjAsIDEsCisJCWxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkhQSFIgVm9sdW1lIiwgVE9NVE9NX0FfUlhfSFBIX1JfR0FJTiwgMCwgMjAsIDEsCisJCWxpbmVfZ2FpbiksCisKKwlTT0NfU0lOR0xFX1RMVigiTElORU9VVDEgVm9sdW1lIiwgVE9NVE9NX0FfUlhfTElORV8xX0dBSU4sIDAsIDIwLCAxLAorCQlsaW5lX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJMSU5FT1VUMiBWb2x1bWUiLCBUT01UT01fQV9SWF9MSU5FXzJfR0FJTiwgMCwgMjAsIDEsCisJCWxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQzIFZvbHVtZSIsIFRPTVRPTV9BX1JYX0xJTkVfM19HQUlOLCAwLCAyMCwgMSwKKwkJbGluZV9nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiTElORU9VVDQgVm9sdW1lIiwgVE9NVE9NX0FfUlhfTElORV80X0dBSU4sIDAsIDIwLCAxLAorCQlsaW5lX2dhaW4pLAorCisJU09DX1NJTkdMRV9UTFYoIlNQSyBEUlYgVm9sdW1lIiwgVE9NVE9NX0FfU1BLUl9EUlYxX0dBSU4sIDMsIDgsIDEsCisJCWxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIlNQSyBEUlYyIFZvbHVtZSIsIFRPTVRPTV9BX1NQS1JfRFJWMl9HQUlOLCAzLCA4LCAxLAorCQlsaW5lX2dhaW4pLAorCisJU09DX1NJTkdMRV9UTFYoIkFEQzEgVm9sdW1lIiwgVE9NVE9NX0FfVFhfMV9HQUlOLCAyLCAxOSwgMCwKKwkJCWFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDMiBWb2x1bWUiLCBUT01UT01fQV9UWF8yX0dBSU4sIDIsIDE5LCAwLAorCQkJYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREMzIFZvbHVtZSIsIFRPTVRPTV9BX1RYXzNfR0FJTiwgMiwgMTksIDAsCisJCQlhbmFsb2dfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkFEQzQgVm9sdW1lIiwgVE9NVE9NX0FfVFhfNF9HQUlOLCAyLCAxOSwgMCwKKwkJCWFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDNSBWb2x1bWUiLCBUT01UT01fQV9UWF81X0dBSU4sIDIsIDE5LCAwLAorCQkJYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREM2IFZvbHVtZSIsIFRPTVRPTV9BX1RYXzZfR0FJTiwgMiwgMTksIDAsCisJCQlhbmFsb2dfZ2FpbiksCit9OworCitzdGF0aWMgaW50IHRvbXRvbV9ocGhfaW1wZWRhbmNlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1aW50MzJfdCB6bCwgenI7CisJYm9vbCBocGhyOworCXN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqbWM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRvbXRvbV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwltYyA9IChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCisJaHBociA9IG1jLT5zaGlmdDsKKwl3Y2Q5eHh4X21iaGNfZ2V0X2ltcGVkYW5jZSgmcHJpdi0+bWJoYywgJnpsLCAmenIpOworCXByX2RlYnVnKCIlczogemwgJXUsIHpyICV1XG4iLCBfX2Z1bmNfXywgemwsIHpyKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhwaHIgPyB6ciA6IHpsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkhQSEwgSW1wZWRhbmNlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCisJCSAgICAgICB0b210b21faHBoX2ltcGVkYW5jZV9nZXQsIE5VTEwpLAorCVNPQ19TSU5HTEVfRVhUKCJIUEhSIEltcGVkYW5jZSIsIDAsIDEsIFVJTlRfTUFYLCAwLAorCQkgICAgICAgdG9tdG9tX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX2dldF9ocGhfdHlwZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjOworCisJaWYgKCFwcml2KSB7CisJCXByX2RlYnVnKCIlczogd2NkOTMzMCBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwltYmhjID0gJnByaXYtPm1iaGM7CisJaWYgKCFtYmhjKSB7CisJCXByX2RlYnVnKCIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodTMyKSBtYmhjLT5ocGhfdHlwZTsKKwlwcl9kZWJ1ZygiJXM6IGhwaF90eXBlID0gJXVcbiIsIF9fZnVuY19fLCBtYmhjLT5ocGhfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaF90eXBlX2RldGVjdF9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJIUEggVHlwZSIsIDAsIDAsIFVJTlRfTUFYLCAwLAorCQkgICAgICAgdG9tdG9tX2dldF9ocGhfdHlwZSwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X21peDFfdGV4dFtdID0geworCSJaRVJPIiwgIlNSQzEiLCAiU1JDMiIsICJJSVIxIiwgIklJUjIiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwKKwkJIlJYNSIsICJSWDYiLCAiUlg3IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeDhfbWl4MV90ZXh0W10gPSB7CisJIlpFUk8iLCAiSUlSMSIsICJJSVIyIiwgIlJYMSIsICJSWDIiLCAiUlgzIiwgIlJYNCIsCisJCSJSWDUiLCAiUlg2IiwgIlJYNyIsICJSWDgiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X21peDJfdGV4dFtdID0geworCSJaRVJPIiwgIlNSQzEiLCAiU1JDMiIsICJJSVIxIiwgIklJUjIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X3JkYWM1X3RleHRbXSA9IHsKKwkiREVNNCIsICJERU0zX0lOViIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfcmRhYzdfdGV4dFtdID0geworCSJERU02IiwgIkRFTTVfSU5WIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYWRfc2VsX3RleHRbXSA9IHsKKwkiU1BFIiwgIk1TTSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgxX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDMSIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgyX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDMiIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgzX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDMyIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg0X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDNCIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg1X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDNSIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg2X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUk1JWDEiLCAiUk1JWDIiLCAiUk1JWDMiLCAiUk1JWDQiLCAiUk1JWDUiLCAiUk1JWDYiLCAiUk1JWDciLAorCQkiREVDNiIsICJSTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg3X3RvX3R4MTBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSTUlYMSIsICJSTUlYMiIsICJSTUlYMyIsICJSTUlYNCIsICJSTUlYNSIsICJSTUlYNiIsICJSTUlYNyIsCisJCSJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwgIkRFQzUiLCAiREVDNiIsICJERUM3IiwgIkRFQzgiLAorCQkiREVDOSIsICJERUMxMCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVjMV9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRNSUMxIiwgIkFEQzYiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWMyX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiRE1JQzIiLCAiQURDNSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRlYzNfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJETUlDMyIsICJBREM0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVjNF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRNSUM0IiwgIkFEQzMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWM1X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiRE1JQzUiLCAiQURDMiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRlYzZfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJETUlDNiIsICJBREMxIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVjN19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRNSUMxIiwgIkRNSUM2IiwgIkFEQzEiLCAiQURDNiIsICJBTkMxX0ZCIiwgIkFOQzJfRkIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWM4X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiRE1JQzIiLCAiRE1JQzUiLCAiQURDMiIsICJBREM1IiwgIkFOQzFfRkIiLCAiQU5DMl9GQiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRlYzlfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJETUlDNCIsICJETUlDNSIsICJBREMyIiwgIkFEQzMiLCAiQURDTUIiLCAiQU5DMV9GQiIsICJBTkMyX0ZCIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVjMTBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJETUlDMyIsICJETUlDNiIsICJBREMxIiwgIkFEQzQiLCAiQURDTUIiLCAiQU5DMV9GQiIsICJBTkMyX0ZCIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYW5jX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQURDMSIsICJBREMyIiwgIkFEQzMiLCAiQURDNCIsICJBREM1IiwgIkFEQzYiLCAiQURDX01CIiwKKwkJIlJTVkRfMSIsICJETUlDMSIsICJETUlDMiIsICJETUlDMyIsICJETUlDNCIsICJETUlDNSIsICJETUlDNiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYW5jMV9mYl9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkVBUl9IUEhfTCIsICJFQVJfTElORV8xIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlyX2lucDFfdGV4dFtdID0geworCSJaRVJPIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLCAiREVDNSIsICJERUM2IiwgIkRFQzciLCAiREVDOCIsCisJIkRFQzkiLCAiREVDMTAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsICJSWDYiLCAiUlg3IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaXJfaW5wMl90ZXh0W10gPSB7CisJIlpFUk8iLCAiREVDMSIsICJERUMyIiwgIkRFQzMiLCAiREVDNCIsICJERUM1IiwgIkRFQzYiLCAiREVDNyIsICJERUM4IiwKKwkiREVDOSIsICJERUMxMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpcl9pbnAzX3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwgIkRFQzUiLCAiREVDNiIsICJERUM3IiwgIkRFQzgiLAorCSJERUM5IiwgIkRFQzEwIiwgIlJYMSIsICJSWDIiLCAiUlgzIiwgIlJYNCIsICJSWDUiLCAiUlg2IiwgIlJYNyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlyX2lucDRfdGV4dFtdID0geworCSJaRVJPIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLCAiREVDNSIsICJERUM2IiwgIkRFQzciLCAiREVDOCIsCisJIkRFQzkiLCAiREVDMTAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsICJSWDYiLCAiUlg3IgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXgxX2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CMV9DVEwsIDAsIDEyLCByeF9taXgxX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X21peDFfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IxX0NUTCwgNCwgMTIsIHJ4X21peDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfbWl4MV9pbnAzX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDFfQjJfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDJfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDJfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDNfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDNfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDNfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDNfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDRfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDRfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDRfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDRfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDVfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDVfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDVfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDVfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDZfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDZfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDZfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDZfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDdfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDdfQjFfQ1RMLCAwLCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDdfbWl4MV9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDdfQjFfQ1RMLCA0LCAxMiwgcnhfbWl4MV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDhfbWl4MV9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDhfQjFfQ1RMLCAwLCAxMSwgcng4X21peDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcng4X21peDFfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fUlg4X0IxX0NUTCwgNCwgMTEsIHJ4OF9taXgxX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4MV9taXgyX2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1JYMV9CM19DVEwsIDAsIDUsIHJ4X21peDJfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcngxX21peDJfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IzX0NUTCwgMywgNSwgcnhfbWl4Ml90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4Ml9pbnAxX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDJfQjNfQ1RMLCAwLCA1LCByeF9taXgyX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4Ml9taXgyX2lucDJfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1JYMl9CM19DVEwsIDMsIDUsIHJ4X21peDJfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcng3X21peDJfaW5wMV9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fUlg3X0IzX0NUTCwgMCwgNSwgcnhfbWl4Ml90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDdfbWl4Ml9pbnAyX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9SWDdfQjNfQ1RMLCAzLCA1LCByeF9taXgyX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X3JkYWM1X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9NSVNDLCAyLCAyLCByeF9yZGFjNV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9yZGFjN19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fTUlTQywgMSwgMiwgcnhfcmRhYzdfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWFkX3NlbF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfU1ZBU1NfQ0ZHLCAwLCAyLCBtYWRfc2VsX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0IxX0NUTCwgMCwgMTAsIHNiX3R4MV9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHgyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjJfQ1RMLCAwLCAxMCwgc2JfdHgyX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDNfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CM19DVEwsIDAsIDEwLCBzYl90eDNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4NF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I0X0NUTCwgMCwgMTAsIHNiX3R4NF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg1X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjVfQ1RMLCAwLCAxMCwgc2JfdHg1X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDZfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNl9DVEwsIDAsIDEwLCBzYl90eDZfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4N19tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1RYX1NCX0I3X0NUTCwgMCwgMTgsCisJCQlzYl90eDdfdG9fdHgxMF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjhfQ1RMLCAwLCAxOCwKKwkJCXNiX3R4N190b190eDEwX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDlfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9UWF9TQl9COV9DVEwsIDAsIDE4LAorCQkJc2JfdHg3X3RvX3R4MTBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MTBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMTBfQ1RMLCAwLCAxOCwKKwkJCXNiX3R4N190b190eDEwX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWMxX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMLCAwLCAzLCBkZWMxX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWMyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMLCAyLCAzLCBkZWMyX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWMzX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMLCA0LCAzLCBkZWMzX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM0X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjFfQ1RMLCA2LCAzLCBkZWM0X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM1X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMLCAwLCAzLCBkZWM1X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM2X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMLCAyLCAzLCBkZWM2X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM3X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjJfQ1RMLCA0LCA3LCBkZWM3X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjNfQ1RMLCAwLCA3LCBkZWM4X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWM5X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfQjNfQ1RMLCAzLCA4LCBkZWM5X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkZWMxMF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX1RYX0I0X0NUTCwgMCwgOCwgZGVjMTBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFuYzFfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9BTkNfQjFfQ1RMLCAwLCAxNSwgYW5jX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbmMyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fQU5DX0IxX0NUTCwgNCwgMTUsIGFuY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYW5jMV9mYl9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX0FOQ19CMl9DVEwsIDAsIDMsIGFuYzFfZmJfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wMV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CMV9DVEwsIDAsIDE4LCBpaXJfaW5wMV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIyX2lucDFfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9FUTJfQjFfQ1RMLCAwLCAxOCwgaWlyX2lucDFfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMV9pbnAyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fRVExX0IyX0NUTCwgMCwgMTgsIGlpcl9pbnAyX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjJfaW5wMl9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX0VRMl9CMl9DVEwsIDAsIDE4LCBpaXJfaW5wMl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIxX2lucDNfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9FUTFfQjNfQ1RMLCAwLCAxOCwgaWlyX2lucDNfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMl9pbnAzX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoVE9NVE9NX0FfQ0RDX0NPTk5fRVEyX0IzX0NUTCwgMCwgMTgsIGlpcl9pbnAzX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wNF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRPTVRPTV9BX0NEQ19DT05OX0VRMV9CNF9DVEwsIDAsIDE4LCBpaXJfaW5wNF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIyX2lucDRfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUT01UT01fQV9DRENfQ09OTl9FUTJfQjRfQ1RMLCAwLCAxOCwgaWlyX2lucDRfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9taXgxX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDEgTUlYMSBJTlAxIE11eCIsIHJ4X21peDFfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peDFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMSBNSVgxIElOUDIgTXV4IiwgcnhfbWl4MV9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfbWl4MV9pbnAzX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgxIE1JWDEgSU5QMyBNdXgiLCByeF9taXgxX2lucDNfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDJfbWl4MV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgyIE1JWDEgSU5QMSBNdXgiLCByeDJfbWl4MV9pbnAxX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngyX21peDFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMiBNSVgxIElOUDIgTXV4IiwgcngyX21peDFfaW5wMl9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4M19taXgxX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDMgTUlYMSBJTlAxIE11eCIsIHJ4M19taXgxX2lucDFfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDNfbWl4MV9pbnAyX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgzIE1JWDEgSU5QMiBNdXgiLCByeDNfbWl4MV9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng0X21peDFfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYNCBNSVgxIElOUDEgTXV4Iiwgcng0X21peDFfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4NF9taXgxX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDQgTUlYMSBJTlAyIE11eCIsIHJ4NF9taXgxX2lucDJfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDVfbWl4MV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlg1IE1JWDEgSU5QMSBNdXgiLCByeDVfbWl4MV9pbnAxX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng1X21peDFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYNSBNSVgxIElOUDIgTXV4Iiwgcng1X21peDFfaW5wMl9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4Nl9taXgxX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDYgTUlYMSBJTlAxIE11eCIsIHJ4Nl9taXgxX2lucDFfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDZfbWl4MV9pbnAyX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlg2IE1JWDEgSU5QMiBNdXgiLCByeDZfbWl4MV9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng3X21peDFfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYNyBNSVgxIElOUDEgTXV4Iiwgcng3X21peDFfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4N19taXgxX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDcgTUlYMSBJTlAyIE11eCIsIHJ4N19taXgxX2lucDJfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDhfbWl4MV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlg4IE1JWDEgSU5QMSBNdXgiLCByeDhfbWl4MV9pbnAxX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng4X21peDFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYOCBNSVgxIElOUDIgTXV4Iiwgcng4X21peDFfaW5wMl9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4MV9taXgyX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDEgTUlYMiBJTlAxIE11eCIsIHJ4MV9taXgyX2lucDFfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDFfbWl4Ml9pbnAyX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlgxIE1JWDIgSU5QMiBNdXgiLCByeDFfbWl4Ml9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngyX21peDJfaW5wMV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYMiBNSVgyIElOUDEgTXV4IiwgcngyX21peDJfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4Ml9taXgyX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWDIgTUlYMiBJTlAyIE11eCIsIHJ4Ml9taXgyX2lucDJfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDdfbWl4Ml9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlg3IE1JWDIgSU5QMSBNdXgiLCByeDdfbWl4Ml9pbnAxX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng3X21peDJfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYNyBNSVgyIElOUDIgTXV4Iiwgcng3X21peDJfaW5wMl9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2RhYzVfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSREFDNSBNVVggTXV4IiwgcnhfcmRhYzVfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9kYWM3X211eCA9CisJU09DX0RBUE1fRU5VTSgiUkRBQzcgTVVYIE11eCIsIHJ4X3JkYWM3X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWFkX3NlbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIk1BRF9TRUwgTVVYIE11eCIsIG1hZF9zZWxfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYMSBNVVggTXV4Iiwgc2JfdHgxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4Ml9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFgyIE1VWCBNdXgiLCBzYl90eDJfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgzX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDMgTVVYIE11eCIsIHNiX3R4M19tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDRfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYNCBNVVggTXV4Iiwgc2JfdHg0X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4NV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg1IE1VWCBNdXgiLCBzYl90eDVfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg2X211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDYgTVVYIE11eCIsIHNiX3R4Nl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDdfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYNyBNVVggTXV4Iiwgc2JfdHg3X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4OF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg4IE1VWCBNdXgiLCBzYl90eDhfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg5X211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDkgTVVYIE11eCIsIHNiX3R4OV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDEwX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDEwIE1VWCBNdXgiLCBzYl90eDEwX211eF9lbnVtKTsKKworCitzdGF0aWMgaW50IHdjZDkzMzBfcHV0X2RlY19lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCBkZWNfbXV4LCBkZWNpbWF0b3I7CisJY2hhciAqZGVjX25hbWUgPSBOVUxMOworCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKKwljaGFyICp0ZW1wOworCXUxNiB0eF9tdXhfY3RsX3JlZzsKKwl1OCBhZGNfZG1pY19zZWwgPSAweDA7CisJaW50IHJldCA9IDA7CisJY2hhciAqZGVjOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj0gZS0+aXRlbXMpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVjX211eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisKKwl3aWRnZXRfbmFtZSA9IGtzdHJuZHVwKHctPm5hbWUsIDE1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdpZGdldF9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwl0ZW1wID0gd2lkZ2V0X25hbWU7CisKKwlkZWNfbmFtZSA9IHN0cnNlcCgmd2lkZ2V0X25hbWUsICIgIik7CisJd2lkZ2V0X25hbWUgPSB0ZW1wOworCWlmICghZGVjX25hbWUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwgX19mdW5jX18sIHctPm5hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWRlYyA9IHN0cnBicmsoZGVjX25hbWUsICIxMjM0NTY3ODkiKTsKKwlpZiAoIWRlYykgeworCQlkZXZfZXJyKHctPmRhcG0tPmRldiwgIiVzOiBkZWNpbWF0b3IgaW5kZXggbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IGtzdHJ0b3VpbnQoZGVjLCAxMCwgJmRlY2ltYXRvcik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwgX19mdW5jX18sIGRlY19uYW1lKTsKKwkJcmV0ID0gIC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcody0+ZGFwbS0+ZGV2LCAiJXMoKTogd2lkZ2V0ID0gJXMgZGVjaW1hdG9yID0gJXUgZGVjX211eCA9ICV1XG4iCisJCSwgX19mdW5jX18sIHctPm5hbWUsIGRlY2ltYXRvciwgZGVjX211eCk7CisKKworCXN3aXRjaCAoZGVjaW1hdG9yKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCWlmIChkZWNfbXV4ID09IDEpCisJCQlhZGNfZG1pY19zZWwgPSAweDE7CisJCWVsc2UKKwkJCWFkY19kbWljX3NlbCA9IDB4MDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCWNhc2UgODoKKwljYXNlIDk6CisJY2FzZSAxMDoKKwkJaWYgKChkZWNfbXV4ID09IDEpIHx8IChkZWNfbXV4ID09IDIpKQorCQkJYWRjX2RtaWNfc2VsID0gMHgxOworCQllbHNlCisJCQlhZGNfZG1pY19zZWwgPSAweDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgRGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLCBkZWNpbWF0b3IpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl0eF9tdXhfY3RsX3JlZyA9IFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTCArIDggKiAoZGVjaW1hdG9yIC0gMSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9tdXhfY3RsX3JlZywgMHgxLCBhZGNfZG1pY19zZWwpOworCisJcmV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOworCitvdXQ6CisJa2ZyZWUod2lkZ2V0X25hbWUpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgV0NEOTMzMF9ERUNfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAorCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCBcCisJLnB1dCA9IHdjZDkzMzBfcHV0X2RlY19lbnVtLCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjMV9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzEgTVVYIE11eCIsIGRlYzFfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjMl9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzIgTVVYIE11eCIsIGRlYzJfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjM19tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzMgTVVYIE11eCIsIGRlYzNfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjNF9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzQgTVVYIE11eCIsIGRlYzRfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjNV9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzUgTVVYIE11eCIsIGRlYzVfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjNl9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzYgTVVYIE11eCIsIGRlYzZfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjN19tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzcgTVVYIE11eCIsIGRlYzdfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjOF9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzggTVVYIE11eCIsIGRlYzhfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjOV9tdXggPQorCVdDRDkzMzBfREVDX0VOVU0oIkRFQzkgTVVYIE11eCIsIGRlYzlfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGVjMTBfbXV4ID0KKwlXQ0Q5MzMwX0RFQ19FTlVNKCJERUMxMCBNVVggTXV4IiwgZGVjMTBfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMSBJTlAxIE11eCIsIGlpcjFfaW5wMV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIyX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIyIElOUDEgTXV4IiwgaWlyMl9pbnAxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIklJUjEgSU5QMiBNdXgiLCBpaXIxX2lucDJfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMl9pbnAyX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMiBJTlAyIE11eCIsIGlpcjJfaW5wMl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIxX2lucDNfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIxIElOUDMgTXV4IiwgaWlyMV9pbnAzX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjJfaW5wM19tdXggPQorCVNPQ19EQVBNX0VOVU0oIklJUjIgSU5QMyBNdXgiLCBpaXIyX2lucDNfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnA0X211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMSBJTlA0IE11eCIsIGlpcjFfaW5wNF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIyX2lucDRfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIyIElOUDQgTXV4IiwgaWlyMl9pbnA0X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuYzFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBTkMxIE1VWCBNdXgiLCBhbmMxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuYzJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBTkMyIE1VWCBNdXgiLCBhbmMyX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuYzFfZmJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBTkMxIEZCIE1VWCBNdXgiLCBhbmMxX2ZiX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhYzFfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUT01UT01fQV9SWF9FQVJfRU4sIDUsIDEsIDApCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaGxfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUT01UT01fQV9SWF9IUEhfTF9EQUNfQ1RMLCA2LCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaGxfcGFfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBVVhfUEdBX0wgU3dpdGNoIiwgVE9NVE9NX0FfUlhfUEFfQVVYX0lOX0NPTk4sCisJCQkJCTcsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaHJfcGFfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBVVhfUEdBX1IgU3dpdGNoIiwgVE9NVE9NX0FfUlhfUEFfQVVYX0lOX0NPTk4sCisJCQkJCTYsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVhcl9wYV9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFVWF9QR0FfTCBTd2l0Y2giLCBUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTiwKKwkJCQkJNSwgMSwgMCksCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVvdXQxX3BhX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQVVYX1BHQV9MIFN3aXRjaCIsIFRPTVRPTV9BX1JYX1BBX0FVWF9JTl9DT05OLAorCQkJCQk0LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5lb3V0Ml9wYV9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFVWF9QR0FfUiBTd2l0Y2giLCBUT01UT01fQV9SWF9QQV9BVVhfSU5fQ09OTiwKKwkJCQkJMywgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGluZW91dDNfcGFfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBVVhfUEdBX0wgU3dpdGNoIiwgVE9NVE9NX0FfUlhfUEFfQVVYX0lOX0NPTk4sCisJCQkJCTIsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVvdXQ0X3BhX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQVVYX1BHQV9SIFN3aXRjaCIsIFRPTVRPTV9BX1JYX1BBX0FVWF9JTl9DT05OLAorCQkJCQkxLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5lb3V0M19ncm91bmRfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRPTVRPTV9BX1JYX0xJTkVfM19EQUNfQ1RMLCA2LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVvdXQ0X2dyb3VuZF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgVE9NVE9NX0FfUlhfTElORV80X0RBQ19DVEwsIDYsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmNF9tYWRfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRPTVRPTV9BX1NWQVNTX0NMS1JTVF9DVEwsIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmNF92aV9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgVE9NVE9NX0FfU1BLUjFfUFJPVF9FTiwgMywgMSwgMCk7CisKKy8qIHZpcnR1YWwgcG9ydCBlbnRyaWVzICovCitzdGF0aWMgaW50IHNsaW1fdHhfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0b210b21fcC0+dHhfcG9ydF92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCXN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqbWl4ZXIgPQorCQkoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl1MzIgZGFpX2lkID0gd2lkZ2V0LT5zaGlmdDsKKwl1MzIgcG9ydF9pZCA9IG1peGVyLT5zaGlmdDsKKwl1MzIgZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdTMyIHZ0YWJsZSA9IHZwb3J0X2NoZWNrX3RhYmxlW2RhaV9pZF07CisKKworCXByX2RlYnVnKCIlczogd25hbWUgJXMgY25hbWUgJXMgdmFsdWUgJXUgc2hpZnQgJWQgaXRlbSAlbGRcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHVjb250cm9sLT5pZC5uYW1lLCB0b210b21fcC0+dHhfcG9ydF92YWx1ZSwKKwkJd2lkZ2V0LT5zaGlmdCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXV0ZXhfbG9jaygmdG9tdG9tX3AtPmNvZGVjX211dGV4KTsKKworCWlmICh0b210b21fcC0+aW50Zl90eXBlICE9IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQlpZiAoZGFpX2lkICE9IEFJRjFfQ0FQKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBBSUYgZm9yIEkyQyBtb2RlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmdG9tdG9tX3AtPmNvZGVjX211dGV4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXN3aXRjaCAoZGFpX2lkKSB7CisJY2FzZSBBSUYxX0NBUDoKKwljYXNlIEFJRjJfQ0FQOgorCWNhc2UgQUlGM19DQVA6CisJCS8qIG9ubHkgYWRkIHRvIHRoZSBsaXN0IGlmIHZhbHVlIG5vdCBzZXQKKwkJICovCisJCWlmIChlbmFibGUgJiYgISh0b210b21fcC0+dHhfcG9ydF92YWx1ZSAmIDEgPDwgcG9ydF9pZCkpIHsKKworCQkJaWYgKHRvbXRvbV9wLT5pbnRmX3R5cGUgPT0KKwkJCQlXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpCisJCQkJdnRhYmxlID0gdnBvcnRfY2hlY2tfdGFibGVbZGFpX2lkXTsKKwkJCWlmICh0b210b21fcC0+aW50Zl90eXBlID09CisJCQkJV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCisJCQkJdnRhYmxlID0gdnBvcnRfaTJzX2NoZWNrX3RhYmxlW2RhaV9pZF07CisKKwkJCWlmICh3Y2Q5eHh4X3R4X3Zwb3J0X3ZhbGlkYXRpb24oCisJCQkJCXZ0YWJsZSwKKwkJCQkJcG9ydF9pZCwKKwkJCQkJdG9tdG9tX3AtPmRhaSwgTlVNX0NPREVDX0RBSVMpKSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgaXMgdXNlZCBieSBvdGhlciB2aXJ0dWFsIHBvcnRcbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkICsgMSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZ0b210b21fcC0+Y29kZWNfbXV0ZXgpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJdG9tdG9tX3AtPnR4X3BvcnRfdmFsdWUgfD0gMSA8PCBwb3J0X2lkOworCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QsCisJCQkgICAgICAmdG9tdG9tX3AtPmRhaVtkYWlfaWRdLndjZDl4eHhfY2hfbGlzdAorCQkJCQkgICAgICApOworCQl9IGVsc2UgaWYgKCFlbmFibGUgJiYgKHRvbXRvbV9wLT50eF9wb3J0X3ZhbHVlICYKKwkJCQkJMSA8PCBwb3J0X2lkKSkgeworCQkJdG9tdG9tX3AtPnR4X3BvcnRfdmFsdWUgJj0gfigxIDw8IHBvcnRfaWQpOworCQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGVuYWJsZSkKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBwb3J0IGlzIHVzZWQgYnlcbiIKKwkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCArIDEpOworCQkJZWxzZQorCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBUWCV1IHBvcnQgaXMgbm90IHVzZWQgYnlcbiIKKwkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCArIDEpOworCQkJLyogYXZvaWQgdXBkYXRlIHBvd2VyIGZ1bmN0aW9uICovCisJCQltdXRleF91bmxvY2soJnRvbXRvbV9wLT5jb2RlY19tdXRleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIlVua25vd24gQUlGICVkXG4iLCBkYWlfaWQpOworCQltdXRleF91bmxvY2soJnRvbXRvbV9wLT5jb2RlY19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IG5hbWUgJXMgc25hbWUgJXMgdXBkYXRlZCB2YWx1ZSAldSBzaGlmdCAlZFxuIiwgX19mdW5jX18sCisJCXdpZGdldC0+bmFtZSwgd2lkZ2V0LT5zbmFtZSwgdG9tdG9tX3AtPnR4X3BvcnRfdmFsdWUsCisJCXdpZGdldC0+c2hpZnQpOworCisJbXV0ZXhfdW5sb2NrKCZ0b210b21fcC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCB1cGRhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9tdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0b210b21fcC0+cnhfcG9ydF92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fcnhfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBSUYxX1BCIiwgIkFJRjJfUEIiLCAiQUlGM19QQiIKK307CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9tdXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKwl1MzIgcG9ydF9pZCA9IHdpZGdldC0+c2hpZnQ7CisKKwlwcl9kZWJ1ZygiJXM6IHduYW1lICVzIGNuYW1lICVzIHZhbHVlICV1IHNoaWZ0ICVkIGl0ZW0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJd2lkZ2V0LT5uYW1lLCB1Y29udHJvbC0+aWQubmFtZSwgdG9tdG9tX3AtPnJ4X3BvcnRfdmFsdWUsCisJCXdpZGdldC0+c2hpZnQsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXRvbXRvbV9wLT5yeF9wb3J0X3ZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKworCW11dGV4X2xvY2soJnRvbXRvbV9wLT5jb2RlY19tdXRleCk7CisKKwlpZiAodG9tdG9tX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJaWYgKHRvbXRvbV9wLT5yeF9wb3J0X3ZhbHVlID4gMikgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGludmFsaWQgQUlGIGZvciBJMkMgbW9kZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwkvKiB2YWx1ZSBuZWVkIHRvIG1hdGNoIHRoZSBWaXJ0dWFsIHBvcnQgYW5kIEFJRiBudW1iZXIKKwkgKi8KKwlzd2l0Y2ggKHRvbXRvbV9wLT5yeF9wb3J0X3ZhbHVlKSB7CisJY2FzZSAwOgorCQlsaXN0X2RlbF9pbml0KCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbihwb3J0X2lkICsKKwkJCVRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUiwKKwkJCSZ0b210b21fcC0+ZGFpW0FJRjFfUEJdLndjZDl4eHhfY2hfbGlzdCkpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWCV1IGlzIHVzZWQgYnkgY3VycmVudCByZXF1ZXN0aW5nIEFJRl9QQiBpdHNlbGZcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQgKyAxKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRvbXRvbV9wLT5kYWlbQUlGMV9QQl0ud2NkOXh4eF9jaF9saXN0KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAod2NkOXh4eF9yeF92cG9ydF92YWxpZGF0aW9uKHBvcnRfaWQgKworCQkJVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRvbXRvbV9wLT5kYWlbQUlGMl9QQl0ud2NkOXh4eF9jaF9saXN0KSkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYJXUgaXMgdXNlZCBieSBjdXJyZW50IHJlcXVlc3RpbmcgQUlGX1BCIGl0c2VsZlxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCArIDEpOworCQkJZ290byBydG47CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QsCisJCQkgICAgICAmdG9tdG9tX3AtPmRhaVtBSUYyX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIsCisJCQkmdG9tdG9tX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkICsgMSk7CisJCQlnb3RvIHJ0bjsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCwKKwkJCSAgICAgICZ0b210b21fcC0+ZGFpW0FJRjNfUEJdLndjZDl4eHhfY2hfbGlzdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiVW5rbm93biBBSUYgJWRcbiIsIHRvbXRvbV9wLT5yeF9wb3J0X3ZhbHVlKTsKKwkJZ290byBlcnI7CisJfQorcnRuOgorCW11dGV4X3VubG9jaygmdG9tdG9tX3AtPmNvZGVjX211dGV4KTsKKwlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAorCQkJCQl0b210b21fcC0+cnhfcG9ydF92YWx1ZSwgZSwgdXBkYXRlKTsKKworCXJldHVybiAwOworZXJyOgorCW11dGV4X3VubG9jaygmdG9tdG9tX3AtPmNvZGVjX211dGV4KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbGltX3J4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoc2xpbV9yeF9tdXhfdGV4dCksIHNsaW1fcnhfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbV9yeF9tdXhbVE9NVE9NX1JYX01BWF0gPSB7CisJU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlgxIE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCisJCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDIgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYMyBNdXgiLCBzbGltX3J4X211eF9lbnVtLAorCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCisJU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlg0IE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCisJCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDUgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYNiBNdXgiLCBzbGltX3J4X211eF9lbnVtLAorCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCisJU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlg3IE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCisJCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDggTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDIsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg0IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDUsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYNiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg3IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDgsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYOSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMCIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjJfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDIsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg0IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDUsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYNiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg3IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDgsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYOSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMCIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjNfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDIsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg0IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDUsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYNiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg3IiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9UWDgsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYOSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMCIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIHZvaWQgdG9tdG9tX2NvZGVjX2VuYWJsZV9hZGNfYmxvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmIChlbmFibGUpIHsKKwkJdG9tdG9tLT5hZGNfY291bnQrKzsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTEtfT1RIUl9DVEwsCisJCQkJCQkweDIsIDB4Mik7CisJfSBlbHNlIHsKKwkJdG9tdG9tLT5hZGNfY291bnQtLTsKKwkJaWYgKCF0b210b20tPmFkY19jb3VudCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfQ0xLX09USFJfQ1RMLAorCQkJCQkgICAgMHgyLCAweDApOworCX0KK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2FkYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgYWRjX3JlZzsKKwl1MTYgdHhfZmVfY2xrZGl2X3JlZzsKKwl1OCB0eF9mZV9jbGtkaXZfbWFzazsKKwl1OCBpbml0X2JpdF9zaGlmdDsKKwl1OCBiaXRfcG9zOworCisJcHJfZGVidWcoIiVzICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoICh3LT5yZWcpIHsKKwljYXNlIFRPTVRPTV9BX1RYXzFfR0FJTjoKKwkJYWRjX3JlZyA9IFRPTVRPTV9BX1RYXzFfMl9URVNUX0NUTDsKKwkJdHhfZmVfY2xrZGl2X3JlZyA9IFRPTVRPTV9BX1RYXzFfMl9UWEZFX0NMS0RJVjsKKwkJdHhfZmVfY2xrZGl2X21hc2sgPSAweDBGOworCQlpbml0X2JpdF9zaGlmdCA9IDc7CisJCWJpdF9wb3MgPSBBREMxX1RYRkU7CisJCWJyZWFrOworCWNhc2UgVE9NVE9NX0FfVFhfMl9HQUlOOgorCQlhZGNfcmVnID0gVE9NVE9NX0FfVFhfMV8yX1RFU1RfQ1RMOworCQl0eF9mZV9jbGtkaXZfcmVnID0gVE9NVE9NX0FfVFhfMV8yX1RYRkVfQ0xLRElWOworCQl0eF9mZV9jbGtkaXZfbWFzayA9IDB4RjA7CisJCWluaXRfYml0X3NoaWZ0ID0gNjsKKwkJYml0X3BvcyA9IEFEQzJfVFhGRTsKKwkJYnJlYWs7CisJY2FzZSBUT01UT01fQV9UWF8zX0dBSU46CisJCWFkY19yZWcgPSBUT01UT01fQV9UWF8zXzRfVEVTVF9DVEw7CisJCWluaXRfYml0X3NoaWZ0ID0gNzsKKwkJdHhfZmVfY2xrZGl2X3JlZyA9IFRPTVRPTV9BX1RYXzNfNF9UWEZFX0NLRElWOworCQl0eF9mZV9jbGtkaXZfbWFzayA9IDB4MEY7CisJCWJpdF9wb3MgPSBBREMzX1RYRkU7CisJCWJyZWFrOworCWNhc2UgVE9NVE9NX0FfVFhfNF9HQUlOOgorCQlhZGNfcmVnID0gVE9NVE9NX0FfVFhfM180X1RFU1RfQ1RMOworCQlpbml0X2JpdF9zaGlmdCA9IDY7CisJCXR4X2ZlX2Nsa2Rpdl9yZWcgPSBUT01UT01fQV9UWF8zXzRfVFhGRV9DS0RJVjsKKwkJdHhfZmVfY2xrZGl2X21hc2sgPSAweEYwOworCQliaXRfcG9zID0gQURDNF9UWEZFOworCQlicmVhazsKKwljYXNlIFRPTVRPTV9BX1RYXzVfR0FJTjoKKwkJYWRjX3JlZyA9IFRPTVRPTV9BX1RYXzVfNl9URVNUX0NUTDsKKwkJaW5pdF9iaXRfc2hpZnQgPSA3OworCQl0eF9mZV9jbGtkaXZfcmVnID0gVE9NVE9NX0FfVFhfNV82X1RYRkVfQ0tESVY7CisJCXR4X2ZlX2Nsa2Rpdl9tYXNrID0gMHgwRjsKKwkJYml0X3BvcyA9IEFEQzVfVFhGRTsKKwkJYnJlYWs7CisJY2FzZSBUT01UT01fQV9UWF82X0dBSU46CisJCWFkY19yZWcgPSBUT01UT01fQV9UWF81XzZfVEVTVF9DVEw7CisJCWluaXRfYml0X3NoaWZ0ID0gNjsKKwkJdHhfZmVfY2xrZGl2X3JlZyA9IFRPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWOworCQl0eF9mZV9jbGtkaXZfbWFzayA9IDB4RjA7CisJCWJpdF9wb3MgPSBBREM2X1RYRkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEVycm9yLCBpbnZhbGlkIGFkYyByZWdpc3RlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfZmVfY2xrZGl2X3JlZywgdHhfZmVfY2xrZGl2X21hc2ssCisJCQkJICAgIDB4MCk7CisJCXNldF9iaXQoYml0X3BvcywgJnByaXYtPnN0YXR1c19tYXNrKTsKKwkJdG9tdG9tX2NvZGVjX2VuYWJsZV9hZGNfYmxvY2soY29kZWMsIDEpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhZGNfcmVnLCAxIDw8IGluaXRfYml0X3NoaWZ0LAorCQkJCTEgPDwgaW5pdF9iaXRfc2hpZnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYWRjX3JlZywgMSA8PCBpbml0X2JpdF9zaGlmdCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl0b210b21fY29kZWNfZW5hYmxlX2FkY19ibG9jayhjb2RlYywgMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZXh0X2Nsa19lbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCWludCBlbmFibGUsIGJvb2wgZGFwbSkKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKCF0b210b20tPmNvZGVjX2V4dF9jbGtfZW5fY2IpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGV4dF9jbGtfY2FsbGJhY2tcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiB0b210b20tPmNvZGVjX2V4dF9jbGtfZW5fY2IoY29kZWMsIGVuYWJsZSwgZGFwbSk7Cit9CisKK3N0YXRpYyBpbnQgX190b210b21fbWNsa19lbmFibGUoc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20sIGludCBtY2xrX2VuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCVdDRDlYWFhfQkdfQ0xLX0xPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwlpZiAobWNsa19lbmFibGUpIHsKKwkJdG9tdG9tLT5leHRfY2xrX3VzZXJzKys7CisJCWlmICh0b210b20tPmV4dF9jbGtfdXNlcnMgPiAxKQorCQkJZ290byBiZ19jbGtfdW5sb2NrOworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodG9tdG9tLT53Y2RfZXh0X2Nsayk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGV4dCBjbGsgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl0b210b20tPmV4dF9jbGtfdXNlcnMtLTsKKwkJCWdvdG8gYmdfY2xrX3VubG9jazsKKwkJfQorCQl3Y2Q5eHh4X3Jlc21ncl9nZXRfYmFuZGdhcCgmdG9tdG9tLT5yZXNtZ3IsCisJCQkJCSAgIFdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFKTsKKwkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa19ibG9jaygmdG9tdG9tLT5yZXNtZ3IsIFdDRDlYWFhfQ0xLX01DTEspOworCX0gZWxzZSB7CisJCXRvbXRvbS0+ZXh0X2Nsa191c2Vycy0tOworCQlpZiAodG9tdG9tLT5leHRfY2xrX3VzZXJzID09IDApIHsKKwkJCS8qIFB1dCBjbG9jayBhbmQgQkcgKi8KKwkJCXdjZDl4eHhfcmVzbWdyX3B1dF9jbGtfYmxvY2soJnRvbXRvbS0+cmVzbWdyLAorCQkJCQkJICAgICBXQ0Q5WFhYX0NMS19NQ0xLKTsKKwkJCXdjZDl4eHhfcmVzbWdyX3B1dF9iYW5kZ2FwKCZ0b210b20tPnJlc21nciwKKwkJCQkJV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUpOworCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHRvbXRvbS0+d2NkX2V4dF9jbGspOworCQl9CisJfQorYmdfY2xrX3VubG9jazoKKwlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB0b210b21fY29kZWNfbWNsa19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgICBpbnQgZW5hYmxlLCBib29sIGRhcG0pCit7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmICh0b210b20tPndjZF9leHRfY2xrKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtY2xrX2VuYWJsZSA9ICV1LCBkYXBtID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZW5hYmxlLCBkYXBtKTsKKwkJcmV0dXJuIF9fdG9tdG9tX21jbGtfZW5hYmxlKHRvbXRvbSwgZW5hYmxlKTsKKwl9IGVsc2UgaWYgKHRvbXRvbS0+Y29kZWNfZXh0X2Nsa19lbl9jYikKKwkJcmV0dXJuIHRvbXRvbV9jb2RlY19leHRfY2xrX2VuKGNvZGVjLCBlbmFibGUsIGRhcG0pOworCWVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IENhbm5vdCB0dXJuIG9uIE1DTEtcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KK0VYUE9SVF9TWU1CT0wodG9tdG9tX2NvZGVjX21jbGtfZW5hYmxlKTsKKworc3RhdGljIGludCB0b210b21fY29kZWNfZ2V0X2V4dF9jbGtfdXNlcnMoc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20pCit7CisJaWYgKHRvbXRvbS0+d2NkX2V4dF9jbGspCisJCXJldHVybiB0b210b20tPmV4dF9jbGtfdXNlcnM7CisJZWxzZSBpZiAodG9tdG9tLT5jb2RlY19nZXRfZXh0X2Nsa19jbnQpCisJCXJldHVybiB0b210b20tPmNvZGVjX2dldF9leHRfY2xrX2NudCgpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIHRvbXRvbV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCggKQorICogTWFrZSBzdXJlIHRoYXQgQkdfQ0xLX0xPQ0sgaXMgbm90IGFjcXVpcmVkLiBFeGl0IGlmIGFjcXVpcmVkIHRvIGF2b2lkCisgKiBwb3RlbnRpYWwgZGVhZGxvY2sgYXMgZXh0X2Nsa19lbl9jYigpIGFsc28gdHJpZXMgdG8gYWNxdWlyZSB0aGUgc2FtZQorICogbG9jayB0byBlbmFibGUgTUNMSyBmb3IgUkNPIGNhbGlicmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJaWYgKGVuYWJsZSkgeworCQlpZiAod2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa190eXBlKCZ0b210b20tPnJlc21ncikgPT0KKwkJICAgIFdDRDlYWFhfQ0xLX1JDTykgeworCQkJV0NEOVhYWF9CR19DTEtfTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa19ibG9jaygmdG9tdG9tLT5yZXNtZ3IsCisJCQkJCQkgICAgIFdDRDlYWFhfQ0xLX1JDTyk7CisJCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwkJfSBlbHNlIHsKKwkJCXRvbXRvbV9jb2RlY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgZmFsc2UpOworCQkJV0NEOVhYWF9CR19DTEtfTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQkJdG9tdG9tLT5yZXNtZ3IuZXh0X2Nsa191c2VycyA9CisJCQkJCXRvbXRvbV9jb2RlY19nZXRfZXh0X2Nsa191c2Vycyh0b210b20pOworCQkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa19ibG9jaygmdG9tdG9tLT5yZXNtZ3IsCisJCQkJCQkgICAgIFdDRDlYWFhfQ0xLX1JDTyk7CisJCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwkJCXRvbXRvbV9jb2RlY19tY2xrX2VuYWJsZShjb2RlYywgZmFsc2UsIGZhbHNlKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJV0NEOVhYWF9CR19DTEtfTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQl3Y2Q5eHh4X3Jlc21ncl9wdXRfY2xrX2Jsb2NrKCZ0b210b20tPnJlc21nciwKKwkJCQkJICAgICBXQ0Q5WFhYX0NMS19SQ08pOworCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lbmFibGVfYXV4X3BnYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlXQ0Q5WFhYX0JHX0NMS19MT0NLKCZ0b210b20tPnJlc21ncik7CisJCXdjZDl4eHhfcmVzbWdyX2dldF9iYW5kZ2FwKCZ0b210b20tPnJlc21nciwKKwkJCQkJICAgV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUpOworCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwkJLyogQVVYIFBHQSByZXF1aXJlcyBSQ08gb3IgTUNMSyAqLworCQl0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwoY29kZWMsIHRydWUpOworCQlXQ0Q5WFhYX0JHX0NMS19MT0NLKCZ0b210b20tPnJlc21ncik7CisJCXdjZDl4eHhfcmVzbWdyX2VuYWJsZV9yeF9iaWFzKCZ0b210b20tPnJlc21nciwgMSk7CisJCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlXQ0Q5WFhYX0JHX0NMS19MT0NLKCZ0b210b20tPnJlc21ncik7CisJCXdjZDl4eHhfcmVzbWdyX2VuYWJsZV9yeF9iaWFzKCZ0b210b20tPnJlc21nciwgMCk7CisJCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQl0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwoY29kZWMsIGZhbHNlKTsKKwkJV0NEOVhYWF9CR19DTEtfTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCQl3Y2Q5eHh4X3Jlc21ncl9wdXRfYmFuZGdhcCgmdG9tdG9tLT5yZXNtZ3IsCisJCQkJCSAgIFdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFKTsKKwkJV0NEOVhYWF9CR19DTEtfVU5MT0NLKCZ0b210b20tPnJlc21ncik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2xpbmVvdXQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTE2IGxpbmVvdXRfZ2Fpbl9yZWc7CisKKwlwcl9kZWJ1ZygiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisKKwlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJY2FzZSAwOgorCQlsaW5lb3V0X2dhaW5fcmVnID0gVE9NVE9NX0FfUlhfTElORV8xX0dBSU47CisJCWJyZWFrOworCWNhc2UgMToKKwkJbGluZW91dF9nYWluX3JlZyA9IFRPTVRPTV9BX1JYX0xJTkVfMl9HQUlOOworCQlicmVhazsKKwljYXNlIDI6CisJCWxpbmVvdXRfZ2Fpbl9yZWcgPSBUT01UT01fQV9SWF9MSU5FXzNfR0FJTjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlsaW5lb3V0X2dhaW5fcmVnID0gVE9NVE9NX0FfUlhfTElORV80X0dBSU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEVycm9yLCBpbmNvcnJlY3QgbGluZW91dCByZWdpc3RlciB2YWx1ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxpbmVvdXRfZ2Fpbl9yZWcsIDB4NDAsIDB4NDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJd2NkOXh4eF9jbHNoX2ZzbShjb2RlYywgJnRvbXRvbS0+Y2xzaF9kLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9TVEFURV9MTywKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfUkVRX0VOQUJMRSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUE9TVF9QQSk7CisJCXByX2RlYnVnKCIlczogc2xlZXBpbmcgNSBtcyBhZnRlciAlcyBQQSB0dXJuIG9uXG4iLAorCQkJCV9fZnVuY19fLCB3LT5uYW1lKTsKKwkJLyogV2FpdCBmb3IgQ25QIHRpbWUgYWZ0ZXIgUEEgZW5hYmxlICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxpbmVvdXRfZ2Fpbl9yZWcsIDB4NDAsIDB4MDApOworCQlwcl9kZWJ1ZygiJXM6IHNsZWVwaW5nIDUgbXMgYWZ0ZXIgJXMgUEEgdHVybiBvZmZcbiIsCisJCQkgX19mdW5jX18sIHctPm5hbWUpOworCQkvKiBXYWl0IGZvciBDblAgdGltZSBhZnRlciBQQSBkaXNhYmxlICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lbmFibGVfc3BrX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgc3BrX2Rydl9yZWc7CisKKwlwcl9kZWJ1ZygiJXM6ICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOworCWlmIChzdHJuc3RyKHctPm5hbWUsICJTUEsyIFBBIiwgc2l6ZW9mKCJTUEsyIFBBIikpKQorCQlzcGtfZHJ2X3JlZyA9IFRPTVRPTV9BX1NQS1JfRFJWMl9FTjsKKwllbHNlCisJCXNwa19kcnZfcmVnID0gVE9NVE9NX0FfU1BLUl9EUlYxX0VOOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXRvbXRvbS0+c3Brcl9wYV93aWRnZXRfb24gPSB0cnVlOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzcGtfZHJ2X3JlZywgMHg4MCwgMHg4MCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl0b210b20tPnNwa3JfcGFfd2lkZ2V0X29uID0gZmFsc2U7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHNwa19kcnZfcmVnLCAweDgwLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTggdG9tdG9tX2dldF9kbWljX2Nsa192YWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXUzMiBtY2xrX3JhdGUsIHUzMiBkbWljX2Nsa19yYXRlKQoreworCXUzMiBkaXZfZmFjdG9yOworCXU4IGRtaWNfY3RsX3ZhbDsKKworCWRldl9kYmcoY29kZWMtPmRldiwKKwkJIiVzOiBtY2xrX3JhdGUgPSAlZCwgZG1pY19zYW1wbGVfcmF0ZSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbWNsa19yYXRlLCBkbWljX2Nsa19yYXRlKTsKKworCS8qIERlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZXJyb3IgKi8KKwlpZiAobWNsa19yYXRlID09IFRPTVRPTV9NQ0xLX0NMS185UDZNSFopCisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzBfRE1JQ19DTEtfRElWXzI7CisJZWxzZQorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzMwX0RNSUNfQ0xLX0RJVl8zOworCisJaWYgKGRtaWNfY2xrX3JhdGUgPT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGRtaWNfc2FtcGxlX3JhdGUgY2Fubm90IGJlIDBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkaXZfZmFjdG9yID0gbWNsa19yYXRlIC8gZG1pY19jbGtfcmF0ZTsKKwlzd2l0Y2ggKGRpdl9mYWN0b3IpIHsKKwljYXNlIDI6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzBfRE1JQ19DTEtfRElWXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTMzMF9ETUlDX0NMS19ESVZfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzMwX0RNSUNfQ0xLX0RJVl80OworCQlicmVhazsKKwljYXNlIDY6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzBfRE1JQ19DTEtfRElWXzY7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzBfRE1JQ19DTEtfRElWXzE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgZGl2X2ZhY3RvciAldSwgY2xrX3JhdGUoJXUpLCBkbWljX3JhdGUoJXUpXG4iLAorCQkJX19mdW5jX18sIGRpdl9mYWN0b3IsIG1jbGtfcmF0ZSwgZG1pY19jbGtfcmF0ZSk7CisJCWJyZWFrOworCX0KKworZG9uZToKKwlyZXR1cm4gZG1pY19jdGxfdmFsOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lbmFibGVfZG1pYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IHRvbXRvbS0+cmVzbWdyLnBkYXRhOworCXU4ICBkbWljX2Nsa19lbjsKKwl1MTYgZG1pY19jbGtfcmVnOworCXMzMiAqZG1pY19jbGtfY250OworCXU4IGRtaWNfcmF0ZV92YWwsIGRtaWNfcmF0ZV9zaGlmdDsKKwl1bnNpZ25lZCBpbnQgZG1pYzsKKwlpbnQgcmV0OworCWNoYXIgKnduYW1lOworCisJd25hbWUgPSBzdHJwYnJrKHctPm5hbWUsICIxMjM0NTYiKTsKKwlpZiAoIXduYW1lKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3aWRnZXQgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGtzdHJ0b3VpbnQod25hbWUsIDEwLCAmZG1pYyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBETUlDIGxpbmUgb24gdGhlIGNvZGVjXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZG1pYykgeworCWNhc2UgMToKKwljYXNlIDI6CisJCWRtaWNfY2xrX2VuID0gMHgwMTsKKwkJZG1pY19jbGtfY250ID0gJih0b210b20tPmRtaWNfMV8yX2Nsa19jbnQpOworCQlkbWljX2Nsa19yZWcgPSBUT01UT01fQV9ETUlDX0IxX0NUTDsKKwkJZG1pY19yYXRlX3NoaWZ0ID0gNTsKKwkJcHJfZGVidWcoIiVzKCkgZXZlbnQgJWQgRE1JQyVkIGRtaWNfMV8yX2Nsa19jbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnQsICBkbWljLCAqZG1pY19jbGtfY250KTsKKworCQlicmVhazsKKworCWNhc2UgMzoKKwljYXNlIDQ6CisJCWRtaWNfY2xrX2VuID0gMHgwMjsKKwkJZG1pY19jbGtfY250ID0gJih0b210b20tPmRtaWNfM180X2Nsa19jbnQpOworCQlkbWljX2Nsa19yZWcgPSBUT01UT01fQV9ETUlDX0IyX0NUTDsKKwkJZG1pY19yYXRlX3NoaWZ0ID0gMTsKKwkJcHJfZGVidWcoIiVzKCkgZXZlbnQgJWQgRE1JQyVkIGRtaWNfM180X2Nsa19jbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnQsICBkbWljLCAqZG1pY19jbGtfY250KTsKKwkJYnJlYWs7CisKKwljYXNlIDU6CisJY2FzZSA2OgorCQlkbWljX2Nsa19lbiA9IDB4MDQ7CisJCWRtaWNfY2xrX2NudCA9ICYodG9tdG9tLT5kbWljXzVfNl9jbGtfY250KTsKKwkJZG1pY19jbGtfcmVnID0gVE9NVE9NX0FfRE1JQ19CMl9DVEw7CisJCWRtaWNfcmF0ZV9zaGlmdCA9IDQ7CisJCXByX2RlYnVnKCIlcygpIGV2ZW50ICVkIERNSUMlZCBkbWljXzVfNl9jbGtfY250ICVkXG4iLAorCQkJX19mdW5jX18sIGV2ZW50LCAgZG1pYywgKmRtaWNfY2xrX2NudCk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIERNSUMgU2VsZWN0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCisJCWRtaWNfcmF0ZV92YWwgPQorCQkJdG9tdG9tX2dldF9kbWljX2Nsa192YWwoY29kZWMsCisJCQkJCXBkYXRhLT5tY2xrX3JhdGUsCisJCQkJCXBkYXRhLT5kbWljX3NhbXBsZV9yYXRlKTsKKworCQkoKmRtaWNfY2xrX2NudCkrKzsKKwkJaWYgKCpkbWljX2Nsa19jbnQgPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAorCQkJCTB4MDcgPDwgZG1pY19yYXRlX3NoaWZ0LAorCQkJCWRtaWNfcmF0ZV92YWwgPDwgZG1pY19yYXRlX3NoaWZ0KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0RNSUNfQjFfQ1RMLAorCQkJCQlkbWljX2Nsa19lbiwgZG1pY19jbGtfZW4pOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisKKwkJZG1pY19yYXRlX3ZhbCA9CisJCQl0b210b21fZ2V0X2RtaWNfY2xrX3ZhbChjb2RlYywKKwkJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQkJcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlKTsKKwkJKCpkbWljX2Nsa19jbnQpLS07CisJCWlmICgqZG1pY19jbGtfY250ICA9PSAwKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9ETUlDX0IxX0NUTCwKKwkJCQkJZG1pY19jbGtfZW4sIDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAorCQkJCTB4MDcgPDwgZG1pY19yYXRlX3NoaWZ0LAorCQkJCWRtaWNfcmF0ZV92YWwgPDwgZG1pY19yYXRlX3NoaWZ0KTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2NvbmZpZ19tYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsID0gTlVMTDsKKwlzdHJ1Y3QgbWFkX2F1ZGlvX2NhbCAqbWFkX2NhbDsKKwljb25zdCB2b2lkICpkYXRhOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gVE9NVE9NX01BRF9BVURJT19GSVJNV0FSRV9QQVRIOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc2l6ZV90IGNhbF9zaXplOworCWludCBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXRvbXRvbS0+ZndfZGF0YSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBjYWwgZGF0YVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRvbXRvbS0+ZndfZGF0YSwgV0NEOVhYWF9NQURfQ0FMKTsKKwlpZiAoaHdkZXBfY2FsKSB7CisJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCWNhbF9zaXplID0gaHdkZXBfY2FsLT5zaXplOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCX0gZWxzZSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgY29kZWMtPmRldik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWNxdWlyZSBNQUQgZmlyd21hcmUgZGF0YSAlczogJWRcbiIsCisJCQkJZmlsZW5hbWUsIHJldCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoIWZ3KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1hZCBmdyIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJZGF0YSA9IGZ3LT5kYXRhOworCQljYWxfc2l6ZSA9IGZ3LT5zaXplOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgcmVxdWVzdF9maXJtd2FyZSBjYWxpYnJhdGlvblxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJfQorCWlmIChjYWxfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgbWFkX2F1ZGlvX2NhbCkpIHsKKwkJcHJfZXJyKCIlczogaW5jb3JyZWN0IGh3ZGVwIGNhbCBzaXplICV6dVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfc2l6ZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCW1hZF9jYWwgPSAoc3RydWN0IG1hZF9hdWRpb19jYWwgKikoZGF0YSk7CisJaWYgKCFtYWRfY2FsKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGNhbGlicmF0aW9uIGRhdGFcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8yLAorCQkgICAgICBtYWRfY2FsLT5taWNyb3Bob25lX2luZm8uY3ljbGVfdGltZSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9NQUlOX0NUTF8xLCAweEZGIDw8IDMsCisJCQkgICAgKCh1aW50MTZfdCltYWRfY2FsLT5taWNyb3Bob25lX2luZm8uc2V0dGxlX3RpbWUpCisJCQkgICAgPDwgMyk7CisKKwkvKiBBdWRpbyAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzgsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX29taXRfc2FtcGxlcyk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMSwKKwkJCSAgICAweDA3IDw8IDQsIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX2NvbXBfdGltZSA8PCA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8yLCAweDAzIDw8IDIsCisJCQkgICAgbWFkX2NhbC0+YXVkaW9faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fQ1RMXzcsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX2RpZmZfdGhyZXNob2xkICYgMHgzRik7CisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNSwKKwkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfdGhyZXNob2xkX2xzYik7CisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfdGhyZXNob2xkX21zYik7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUobWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzKTsKKwkgICAgIGlkeCsrKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9QVFIsCisJCQkJICAgIDB4M0YsIGlkeCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQVVESU9fSUlSX0NUTF9WQUwsCisJCQkgICAgICBtYWRfY2FsLT5hdWRpb19pbmZvLmlpcl9jb2VmZmljaWVudHNbaWR4XSk7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOk1BRCBBdWRpbyBJSVIgQ29lZlslZF0gPSAwWCV4IiwKKwkJCV9fZnVuY19fLCBpZHgsCisJCQltYWRfY2FsLT5hdWRpb19pbmZvLmlpcl9jb2VmZmljaWVudHNbaWR4XSk7CisJfQorCisJLyogQmVhY29uICovCisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzgsCisJCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc19vbWl0X3NhbXBsZXMpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF8xLAorCQkJICAgIDB4MDcgPDwgNCwgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX2NvbXBfdGltZSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzIsIDB4MDMgPDwgMiwKKwkJCSAgICBtYWRfY2FsLT5iZWFjb25faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF83LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDFGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9DRENfTUFEX0JFQUNPTl9DVExfNSwKKwkJICAgICAgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfQkVBQ09OX0NUTF82LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfdGhyZXNob2xkX21zYik7CisKKwkvKiBVbHRyYXNvdW5kICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9CRUFDT05fQ1RMXzEsCisJCQkgICAgMHgwNyA8PCA0LCBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfY29tcF90aW1lKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfTUFEX1VMVFJfQ1RMXzIsIDB4MDMgPDwgMiwKKwkJCSAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSk7CisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF83LAorCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX2RpZmZfdGhyZXNob2xkICYgMHgxRik7CisJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX01BRF9VTFRSX0NUTF81LAorCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19NQURfVUxUUl9DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc190aHJlc2hvbGRfbXNiKTsKKworCS8qIFNldCBNQUQgaW50ciB0aW1lIHRvIDIwIG1zZWMgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCAweDRFLCAweDAxRiwgMHgxMyk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CitlcnI6CisJaWYgKCFod2RlcF9jYWwpCisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9tYWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCXU4IG1hZF9taWNiLCBtYWRfY2ZpbHQ7CisJdTE2IG1hZF9jZmlsdF9yZWc7CisKKwltYWRfbWljYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgVE9NVE9NX0FfTUFEX0FOQV9DVFJMKSAmIDB4MDc7CisJc3dpdGNoIChtYWRfbWljYikgeworCWNhc2UgMToKKwkJbWFkX2NmaWx0ID0gdG9tdG9tLT5yZXNtZ3IucGRhdGEtPm1pY2JpYXMuYmlhczFfY2ZpbHRfc2VsOworCQlicmVhazsKKwljYXNlIDI6CisJCW1hZF9jZmlsdCA9IHRvbXRvbS0+cmVzbWdyLnBkYXRhLT5taWNiaWFzLmJpYXMyX2NmaWx0X3NlbDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltYWRfY2ZpbHQgPSB0b210b20tPnJlc21nci5wZGF0YS0+bWljYmlhcy5iaWFzM19jZmlsdF9zZWw7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbWFkX2NmaWx0ID0gdG9tdG9tLT5yZXNtZ3IucGRhdGEtPm1pY2JpYXMuYmlhczRfY2ZpbHRfc2VsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgbWljYmlhcyBzZWxlY3Rpb24gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBtYWRfbWljYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobWFkX2NmaWx0KSB7CisJY2FzZSBXQ0Q5WFhYX0NGSUxUMV9TRUw6CisJCW1hZF9jZmlsdF9yZWcgPSBUT01UT01fQV9NSUNCX0NGSUxUXzFfVkFMOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfQ0ZJTFQyX1NFTDoKKwkJbWFkX2NmaWx0X3JlZyA9IFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUw7CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DRklMVDNfU0VMOgorCQltYWRfY2ZpbHRfcmVnID0gVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBpbnZhbGlkIGNmaWx0IDB4JXggZm9yIG1pY2IgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBtYWRfY2ZpbHQsIG1hZF9taWNiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXMgZXZlbnQgPSAlZCwgbWFkX2NmaWx0X3JlZyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBldmVudCwgbWFkX2NmaWx0X3JlZyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyogVW5kbyByZXNldCBmb3IgTUFEICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1NWQVNTX0NMS1JTVF9DVEwsCisJCQkJICAgIDB4MDIsIDB4MDApOworCisJCXJldCA9IHRvbXRvbV9jb2RlY19jb25maWdfbWFkKGNvZGVjKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNvbmZpZyBNQURcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogc2V0dXAgTUFEIG1pY2JpYXMgdG8gVkRESU8gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFkX2NmaWx0X3JlZywKKwkJCQkgICAgMHgwMiwgMHgwMik7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBSZXNldCB0aGUgTUFEIGJsb2NrICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1NWQVNTX0NMS1JTVF9DVEwsCisJCQkJICAgIDB4MDIsIDB4MDIpOworCisJCS8qIFVuZG8gc2V0dXAgb2YgTUFEIG1pY2JpYXMgdG8gVkRESU8gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFkX2NmaWx0X3JlZywKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTE2IG1pY2JfaW50X3JlZyA9IDAsIG1pY2JfY3RsX3JlZyA9IDA7CisJdTggY2ZpbHRfc2VsX3ZhbCA9IDA7CisJY2hhciAqaW50ZXJuYWwxX3RleHQgPSAiSW50ZXJuYWwxIjsKKwljaGFyICppbnRlcm5hbDJfdGV4dCA9ICJJbnRlcm5hbDIiOworCWNoYXIgKmludGVybmFsM190ZXh0ID0gIkludGVybmFsMyI7CisJZW51bSB3Y2Q5eHh4X25vdGlmeV9ldmVudCBlX3Bvc3Rfb2ZmLCBlX3ByZV9vbiwgZV9wb3N0X29uOworCisJcHJfZGVidWcoIiVzOiB3LT5uYW1lICVzIGV2ZW50ICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCWlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzEiLCBzaXplb2YoIk1JQyBCSUFTMSIpKSkgeworCQltaWNiX2N0bF9yZWcgPSBUT01UT01fQV9NSUNCXzFfQ1RMOworCQltaWNiX2ludF9yZWcgPSBUT01UT01fQV9NSUNCXzFfSU5UX1JCSUFTOworCQljZmlsdF9zZWxfdmFsID0gdG9tdG9tLT5yZXNtZ3IucGRhdGEtPm1pY2JpYXMuYmlhczFfY2ZpbHRfc2VsOworCQllX3ByZV9vbiA9IFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMV9PTjsKKwkJZV9wb3N0X29uID0gV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMV9PTjsKKwkJZV9wb3N0X29mZiA9IFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzFfT0ZGOworCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpIHsKKwkJbWljYl9jdGxfcmVnID0gVE9NVE9NX0FfTUlDQl8yX0NUTDsKKwkJbWljYl9pbnRfcmVnID0gVE9NVE9NX0FfTUlDQl8yX0lOVF9SQklBUzsKKwkJY2ZpbHRfc2VsX3ZhbCA9IHRvbXRvbS0+cmVzbWdyLnBkYXRhLT5taWNiaWFzLmJpYXMyX2NmaWx0X3NlbDsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzJfT047CisJCWVfcG9zdF9vbiA9IFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT047CisJCWVfcG9zdF9vZmYgPSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRjsKKwl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTMyIsIHNpemVvZigiTUlDIEJJQVMzIikpKSB7CisJCW1pY2JfY3RsX3JlZyA9IFRPTVRPTV9BX01JQ0JfM19DVEw7CisJCW1pY2JfaW50X3JlZyA9IFRPTVRPTV9BX01JQ0JfM19JTlRfUkJJQVM7CisJCWNmaWx0X3NlbF92YWwgPSB0b210b20tPnJlc21nci5wZGF0YS0+bWljYmlhcy5iaWFzM19jZmlsdF9zZWw7CisJCWVfcHJlX29uID0gV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18zX09OOworCQllX3Bvc3Rfb24gPSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18zX09OOworCQllX3Bvc3Rfb2ZmID0gV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfM19PRkY7CisJfSBlbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzQiLCBzaXplb2YoIk1JQyBCSUFTNCIpKSkgeworCQltaWNiX2N0bF9yZWcgPSBUT01UT01fQV9NSUNCXzRfQ1RMOworCQltaWNiX2ludF9yZWcgPSB0b210b20tPnJlc21nci5yZWdfYWRkci0+bWljYl80X2ludF9yYmlhczsKKwkJY2ZpbHRfc2VsX3ZhbCA9IHRvbXRvbS0+cmVzbWdyLnBkYXRhLT5taWNiaWFzLmJpYXM0X2NmaWx0X3NlbDsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzRfT047CisJCWVfcG9zdF9vbiA9IFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzRfT047CisJCWVfcG9zdF9vZmYgPSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU180X09GRjsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFcnJvciwgaW52YWxpZCBtaWNiaWFzICVzXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkvKiBMZXQgTUJIQyBtb2R1bGUga25vdyBzbyBtaWNiaWFzIHN3aXRjaCB0byBiZSBvZmYgKi8KKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbCgmdG9tdG9tLT5yZXNtZ3IsIGVfcHJlX29uKTsKKworCQkvKiBHZXQgY2ZpbHQgKi8KKwkJd2NkOXh4eF9yZXNtZ3JfY2ZpbHRfZ2V0KCZ0b210b20tPnJlc21nciwgY2ZpbHRfc2VsX3ZhbCk7CisKKwkJaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwxX3RleHQsIDMwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfaW50X3JlZywgMHhFMCwgMHhFMCk7CisJCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwyX3RleHQsIDMwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfaW50X3JlZywgMHgxQywgMHgxQyk7CisJCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwzX3RleHQsIDMwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfaW50X3JlZywgMHgzLCAweDMpOworCQllbHNlCisJCQkvKgorCQkJICogIElmIG5vdCBpbnRlcm5hbCwgbWFrZSBzdXJlIHRvIHdyaXRlIHRoZQorCQkJICogIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwkJCSAqLworCQkJc25kX3NvY193cml0ZShjb2RlYywgbWljYl9pbnRfcmVnLCAweDI0KTsKKwkJaWYgKHRvbXRvbS0+bWJoY19zdGFydGVkICYmIG1pY2JfY3RsX3JlZyA9PQorCQkgICAgVE9NVE9NX0FfTUlDQl8yX0NUTCkgeworCQkJaWYgKCsrdG9tdG9tLT5taWNiXzJfdXNlcnMgPT0gMSkgeworCQkJCWlmICh0b210b20tPnJlc21nci5wZGF0YS0+CisJCQkJICAgIG1pY2JpYXMuYmlhczJfaXNfaGVhZHNldF9vbmx5KQorCQkJCQl3Y2Q5eHh4X3Jlc21ncl9hZGRfY29uZF91cGRhdGVfYml0cygKKwkJCQkJCQkgJnRvbXRvbS0+cmVzbWdyLAorCQkJCQkJCSBXQ0Q5WFhYX0NPTkRfSFBIX01JQywKKwkJCQkJCQkgbWljYl9jdGxfcmVnLCB3LT5zaGlmdCwKKwkJCQkJCQkgZmFsc2UpOworCQkJCWVsc2UKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9jdGxfcmVnLAorCQkJCQkJCSAgICAxIDw8IHctPnNoaWZ0LAorCQkJCQkJCSAgICAxIDw8IHctPnNoaWZ0KTsKKwkJCX0KKwkJCXByX2RlYnVnKCIlczogbWljYl8yX3VzZXJzICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgdG9tdG9tLT5taWNiXzJfdXNlcnMpOworCQl9IGVsc2UgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9jdGxfcmVnLCAxIDw8IHctPnNoaWZ0LAorCQkJCQkgICAgMSA8PCB3LT5zaGlmdCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwkJLyogTGV0IE1CSEMgbW9kdWxlIGtub3cgc28gbWljYmlhcyBpcyBvbiAqLworCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKCZ0b210b20tPnJlc21nciwgZV9wb3N0X29uKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICh0b210b20tPm1iaGNfc3RhcnRlZCAmJiBtaWNiX2N0bF9yZWcgPT0KKwkJICAgIFRPTVRPTV9BX01JQ0JfMl9DVEwpIHsKKwkJCWlmICgtLXRvbXRvbS0+bWljYl8yX3VzZXJzID09IDApIHsKKwkJCQlpZiAodG9tdG9tLT5yZXNtZ3IucGRhdGEtPgorCQkJCSAgICBtaWNiaWFzLmJpYXMyX2lzX2hlYWRzZXRfb25seSkKKwkJCQkJd2NkOXh4eF9yZXNtZ3Jfcm1fY29uZF91cGRhdGVfYml0cygKKwkJCQkJCQkmdG9tdG9tLT5yZXNtZ3IsCisJCQkJCQkJV0NEOVhYWF9DT05EX0hQSF9NSUMsCisJCQkJCQkJbWljYl9jdGxfcmVnLCA3LCBmYWxzZSk7CisJCQkJZWxzZQorCQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2N0bF9yZWcsCisJCQkJCQkJICAgIDEgPDwgdy0+c2hpZnQsIDApOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBtaWNiXzJfdXNlcnMgJWRcbiIsIF9fZnVuY19fLAorCQkJCSB0b210b20tPm1pY2JfMl91c2Vycyk7CisJCQlXQVJOKHRvbXRvbS0+bWljYl8yX3VzZXJzIDwgMCwKKwkJCSAgICAgIlVuZXhwZWN0ZWQgbWljYmlhcyB1c2VycyAlZFxuIiwKKwkJCSAgICAgdG9tdG9tLT5taWNiXzJfdXNlcnMpOworCQl9IGVsc2UgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9jdGxfcmVnLCAxIDw8IHctPnNoaWZ0LAorCQkJCQkgICAgMCk7CisJCX0KKworCQkvKiBMZXQgTUJIQyBtb2R1bGUga25vdyBzbyBtaWNiaWFzIHN3aXRjaCB0byBiZSBvZmYgKi8KKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbCgmdG9tdG9tLT5yZXNtZ3IsIGVfcG9zdF9vZmYpOworCisJCWlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsMV90ZXh0LCAzMCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4ODAsIDB4MDApOworCQllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsMl90ZXh0LCAzMCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MTAsIDB4MDApOworCQllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsM190ZXh0LCAzMCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MiwgMHgwKTsKKworCQkvKiBQdXQgY2ZpbHQgKi8KKwkJd2NkOXh4eF9yZXNtZ3JfY2ZpbHRfcHV0KCZ0b210b20tPnJlc21nciwgY2ZpbHRfc2VsX3ZhbCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgdW5kZXIgY29kZWNfcmVzb3VyY2VfbG9jayBhY3F1aXNpdGlvbiAqLworc3RhdGljIGludCB0b210b21fZW5hYmxlX21iaGNfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlLAorCQkJCWVudW0gd2NkOXh4eF9taWNiaWFzX251bSBtaWNiX251bSkKK3sKKwlpbnQgcmM7CisKKwlpZiAobWljYl9udW0gIT0gTUJIQ19NSUNCSUFTMikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5zdXBwb3J0ZWQgbWljYmlhcywgbWljYl9udW09JWRcbiIsCisJCQlfX2Z1bmNfXywgbWljYl9udW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZW5hYmxlKQorCQlyYyA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAorCQkJCQkgICAgIHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAorCQkJCQkgICAgIERBUE1fTUlDQklBUzJfRVhURVJOQUxfU1RBTkRBTE9ORSk7CisJZWxzZQorCQlyYyA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkJICAgICBEQVBNX01JQ0JJQVMyX0VYVEVSTkFMX1NUQU5EQUxPTkUpOworCWlmICghcmMpCisJCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHR4ZmVfY2xrZGl2X3VwZGF0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRvbXRvbV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAodGVzdF9iaXQoQURDMV9UWEZFLCAmcHJpdi0+c3RhdHVzX21hc2spKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1RYXzFfMl9UWEZFX0NMS0RJViwKKwkJCQkgICAgMHgwRiwgMHgwNSk7CisJCWNsZWFyX2JpdChBREMxX1RYRkUsICZwcml2LT5zdGF0dXNfbWFzayk7CisJfQorCWlmICh0ZXN0X2JpdChBREMyX1RYRkUsICZwcml2LT5zdGF0dXNfbWFzaykpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfVFhfMV8yX1RYRkVfQ0xLRElWLAorCQkJCSAgICAweEYwLCAweDUwKTsKKwkJY2xlYXJfYml0KEFEQzJfVFhGRSwgJnByaXYtPnN0YXR1c19tYXNrKTsKKwl9CisJaWYgKHRlc3RfYml0KEFEQzNfVFhGRSwgJnByaXYtPnN0YXR1c19tYXNrKSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9UWF8zXzRfVFhGRV9DS0RJViwKKwkJCQkgICAgMHgwRiwgMHgwNSk7CisJCWNsZWFyX2JpdChBREMzX1RYRkUsICZwcml2LT5zdGF0dXNfbWFzayk7CisJfQorCWlmICh0ZXN0X2JpdChBREM0X1RYRkUsICZwcml2LT5zdGF0dXNfbWFzaykpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfVFhfM180X1RYRkVfQ0tESVYsCisJCQkJICAgIDB4RjAsIDB4NTApOworCQljbGVhcl9iaXQoQURDNF9UWEZFLCAmcHJpdi0+c3RhdHVzX21hc2spOworCX0KKwlpZiAodGVzdF9iaXQoQURDNV9UWEZFLCAmcHJpdi0+c3RhdHVzX21hc2spKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1RYXzVfNl9UWEZFX0NLRElWLAorCQkJCSAgICAweDBGLCAweDA1KTsKKwkJY2xlYXJfYml0KEFEQzVfVFhGRSwgJnByaXYtPnN0YXR1c19tYXNrKTsKKwl9CisJaWYgKHRlc3RfYml0KEFEQzZfVFhGRSwgJnByaXYtPnN0YXR1c19tYXNrKSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9UWF81XzZfVFhGRV9DS0RJViwKKwkJCQkgICAgMHhGMCwgMHg1MCk7CisJCWNsZWFyX2JpdChBREM2X1RYRkUsICZwcml2LT5zdGF0dXNfbWFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0eF9ocGZfY29ybmVyX2ZyZXFfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmhwZl9kZWxheWVkX3dvcms7CisJc3RydWN0IGhwZl93b3JrICpocGZfd29yazsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdTE2IHR4X211eF9jdGxfcmVnOworCXU4IGhwZl9jdXRfb2ZfZnJlcTsKKworCWhwZl9kZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJaHBmX3dvcmsgPSBjb250YWluZXJfb2YoaHBmX2RlbGF5ZWRfd29yaywgc3RydWN0IGhwZl93b3JrLCBkd29yayk7CisJdG9tdG9tID0gaHBmX3dvcmstPnRvbXRvbTsKKwljb2RlYyA9IGhwZl93b3JrLT50b210b20tPmNvZGVjOworCWhwZl9jdXRfb2ZfZnJlcSA9IGhwZl93b3JrLT50eF9ocGZfY3V0X29mX2ZyZXE7CisKKwl0eF9tdXhfY3RsX3JlZyA9IFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTCArCisJCQkoaHBmX3dvcmstPmRlY2ltYXRvciAtIDEpICogODsKKworCXByX2RlYnVnKCIlcygpOiBkZWNpbWF0b3IgJXUgaHBmX2N1dF9vZl9mcmVxIDB4JXhcbiIsIF9fZnVuY19fLAorCQlocGZfd29yay0+ZGVjaW1hdG9yLCAodW5zaWduZWQgaW50KWhwZl9jdXRfb2ZfZnJlcSk7CisKKwkvKgorCSAqIFJlc3RvcmUgVFhGRSBDbGtEaXYgcmVnaXN0ZXJzIHRvIGRlZmF1bHQuCisJICogSWYgYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBhcmUgbW9kaWZpZWQgZHVyaW5nIGFuYWxvZworCSAqIGZyb250LWVuZCBlbmFibGVtZW50LCB0aGV5IHdpbGwgYmUgcmVzdG9yZWQgYmFjayB0byB0aGUKKwkgKiBkZWZhdWx0CisJICovCisJdHhmZV9jbGtkaXZfdXBkYXRlKGNvZGVjKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDMwLCBocGZfY3V0X29mX2ZyZXEgPDwgNCk7Cit9CisKKyNkZWZpbmUgIFRYX01VWF9DVExfQ1VUX09GRl9GUkVRX01BU0sJMHgzMAorI2RlZmluZSAgQ0ZfTUlOXzNEQl80SFoJCQkweDAKKyNkZWZpbmUgIENGX01JTl8zREJfNzVIWgkJMHgxCisjZGVmaW5lICBDRl9NSU5fM0RCXzE1MEhaCQkweDIKKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwl1bnNpZ25lZCBpbnQgZGVjaW1hdG9yOworCWNoYXIgKmRlY19uYW1lID0gTlVMTDsKKwljaGFyICp3aWRnZXRfbmFtZSA9IE5VTEw7CisJY2hhciAqdGVtcDsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgZGVjX3Jlc2V0X3JlZywgdHhfdm9sX2N0bF9yZWcsIHR4X211eF9jdGxfcmVnOworCXU4IGRlY19ocGZfY3V0X29mX2ZyZXE7CisJaW50IG9mZnNldDsKKwljaGFyICpkZWM7CisKKwlwcl9kZWJ1ZygiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwl3aWRnZXRfbmFtZSA9IGtzdHJuZHVwKHctPm5hbWUsIDE1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdpZGdldF9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwl0ZW1wID0gd2lkZ2V0X25hbWU7CisKKwlkZWNfbmFtZSA9IHN0cnNlcCgmd2lkZ2V0X25hbWUsICIgIik7CisJd2lkZ2V0X25hbWUgPSB0ZW1wOworCWlmICghZGVjX25hbWUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwgX19mdW5jX18sIHctPm5hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGVjID0gc3RycGJyayhkZWNfbmFtZSwgIjEyMzQ1Njc4OSIpOworCWlmICghZGVjKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBkZWNpbWF0b3IgaW5kZXggbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0ga3N0cnRvdWludChkZWMsIDEwLCAmZGVjaW1hdG9yKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRlY2ltYXRvciA9ICVzXG4iLCBfX2Z1bmNfXywgZGVjX25hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfZGVidWcoIiVzKCk6IHdpZGdldCA9ICVzIGRlY19uYW1lID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAorCQkJdy0+bmFtZSwgZGVjX25hbWUsIGRlY2ltYXRvcik7CisKKwlpZiAody0+cmVnID09IFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTCkgeworCQlkZWNfcmVzZXRfcmVnID0gVE9NVE9NX0FfQ0RDX0NMS19UWF9SRVNFVF9CMV9DVEw7CisJCW9mZnNldCA9IDA7CisJfSBlbHNlIGlmICh3LT5yZWcgPT0gVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMKSB7CisJCWRlY19yZXNldF9yZWcgPSBUT01UT01fQV9DRENfQ0xLX1RYX1JFU0VUX0IyX0NUTDsKKwkJb2Zmc2V0ID0gODsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFcnJvciwgaW5jb3JyZWN0IGRlY1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0eF92b2xfY3RsX3JlZyA9IFRPTVRPTV9BX0NEQ19UWDFfVk9MX0NUTF9DRkcgKyA4ICogKGRlY2ltYXRvciAtIDEpOworCXR4X211eF9jdGxfcmVnID0gVE9NVE9NX0FfQ0RDX1RYMV9NVVhfQ1RMICsgOCAqIChkZWNpbWF0b3IgLSAxKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCisJCS8qIEVuYWJsZWFibGUgVFggZGlnaXRhbCBtdXRlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDAxLCAweDAxKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfcmVzZXRfcmVnLCAxIDw8IHctPnNoaWZ0LAorCQkJMSA8PCB3LT5zaGlmdCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19yZXNldF9yZWcsIDEgPDwgdy0+c2hpZnQsIDB4MCk7CisKKwkJcHJfZGVidWcoIiVzOiBkZWNpbWF0b3IgPSAldSwgYnlwYXNzID0gJWRcbiIsIF9fZnVuY19fLAorCQkJZGVjaW1hdG9yLCB0eF9ocGZfd29ya1tkZWNpbWF0b3IgLSAxXS50eF9ocGZfYnlwYXNzKTsKKwkJaWYgKHR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9ieXBhc3MgIT0gdHJ1ZSkgeworCQkJZGVjX2hwZl9jdXRfb2ZfZnJlcSA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJCQl0eF9tdXhfY3RsX3JlZyk7CisKKwkJCWRlY19ocGZfY3V0X29mX2ZyZXEgPSAoZGVjX2hwZl9jdXRfb2ZfZnJlcSAmIDB4MzApID4+IDQ7CisKKwkJCXR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9jdXRfb2ZfZnJlcSA9CisJCQkJZGVjX2hwZl9jdXRfb2ZfZnJlcTsKKworCQkJaWYgKGRlY19ocGZfY3V0X29mX2ZyZXEgIT0gQ0ZfTUlOXzNEQl8xNTBIWikgeworCisJCQkJLyogc2V0IGN1dCBvZiBmcmVxIHRvIENGX01JTl8zREJfMTUwSFogKDB4MSk7ICovCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MzAsCisJCQkJCQkJQ0ZfTUlOXzNEQl8xNTBIWiA8PCA0KTsKKwkJCX0KKworCQkJLyogZW5hYmxlIEhQRiAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MDgsIDB4MDApOworCQl9IGVsc2UKKwkJCS8qIGJ5cGFzcyBIUEYgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDA4LCAweDA4KTsKKworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCisJCS8qIERpc2FibGUgVFggZGlnaXRhbCBtdXRlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDAxLCAweDAwKTsKKworCQlpZiAoKHR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9jdXRfb2ZfZnJlcSAhPQorCQkJCUNGX01JTl8zREJfMTUwSFopICYmCisJCQkodHhfaHBmX3dvcmtbZGVjaW1hdG9yIC0gMV0udHhfaHBmX2J5cGFzcyAhPSB0cnVlKSkgeworCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLmR3b3JrLAorCQkJCQltc2Vjc190b19qaWZmaWVzKDMwMCkpOworCQl9CisJCS8qIGFwcGx5IHRoZSBkaWdpdGFsIGdhaW4gYWZ0ZXIgdGhlIGRlY2ltYXRvciBpcyBlbmFibGVkKi8KKwkJaWYgKCh3LT5zaGlmdCArIG9mZnNldCkgPCBBUlJBWV9TSVpFKHR4X2RpZ2l0YWxfZ2Fpbl9yZWcpKQorCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQkgIHR4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnQgKyBvZmZzZXRdLAorCQkJCSAgc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCSAgdHhfZGlnaXRhbF9nYWluX3JlZ1t3LT5zaGlmdCArIG9mZnNldF0pCisJCQkJICApOworCisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMSk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdHhfaHBmX3dvcmtbZGVjaW1hdG9yIC0gMV0uZHdvcmspOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDA4LCAweDA4KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MzAsCisJCQkodHhfaHBmX3dvcmtbZGVjaW1hdG9yIC0gMV0udHhfaHBmX2N1dF9vZl9mcmVxKSA8PCA0KTsKKworCQlicmVhazsKKwl9CitvdXQ6CisJa2ZyZWUod2lkZ2V0X25hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV92ZGRfc3BrcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXM6ICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOworCisJV0FSTl9PTkNFKCFwcml2LT5zcGtkcnZfcmVnLCAiU1BLRFJWIHN1cHBseSAlcyBpc24ndCBkZWZpbmVkXG4iLAorCQkgIFdDRDlYWFhfVkREX1NQS0RSVl9OQU1FKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaWYgKHByaXYtPnNwa2Rydl9yZWcpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocHJpdi0+c3BrZHJ2X3JlZyk7CisJCQlpZiAocmV0KQorCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBlbmFibGUgc3BrZHJ2X3JlZyAlc1xuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIFdDRDlYWFhfVkREX1NQS0RSVl9OQU1FKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKHByaXYtPnNwa2Rydl9yZWcpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKHByaXYtPnNwa2Rydl9yZWcpOworCQkJaWYgKHJldCkKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBzcGtkcnZfcmVnICVzXG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXywgV0NEOVhYWF9WRERfU1BLRFJWX05BTUUpOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV92ZGRfc3BrcjIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzOiAlZCAlc1xuIiwgX19mdW5jX18sIGV2ZW50LCB3LT5uYW1lKTsKKworCS8qCisJICogSWYgb24tZGVtYW5kIHZvbHRhZ2UgcmVndWxhdG9ycyBvZiBzcGtyMSBhbmQgc3BrcjIgaGFzIGJlZW4gZGVyaXZlZAorCSAqIGZyb20gc2FtZSBwb3dlciByYWlsIHRoZW4gc2FtZSBvbi1kZW1hbmQgdm9sdGFnZSByZWd1bGF0b3IgY2FuIGJlCisJICogdXNlZCBieSBib3RoIHNwa3IxIGFuZCBzcGtyMiwgaWYgYSBzZXBhcmF0ZSBkZXZpY2UgdHJlZSBlbnRyeSBoYXMKKwkgKiBub3QgYmVlbiBkZWZpbmVkIGZvciBvbi1kZW1hbmQgdm9sdGFnZSByZWd1bGF0b3IgZm9yIHNwa3IyLgorCSAqLworCWlmICghcHJpdi0+c3BrZHJ2Ml9yZWcpIHsKKwkJaWYgKHByaXYtPnNwa2Rydl9yZWcpIHsKKwkJCXByaXYtPnNwa2RydjJfcmVnID0gcHJpdi0+c3BrZHJ2X3JlZzsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT05DRSghcHJpdi0+c3BrZHJ2Ml9yZWcsCisJCQkJCSJTUEtEUlYyIHN1cHBseSAlcyBpc24ndCBkZWZpbmVkXG4iLAorCQkJCQlXQ0Q5WFhYX1ZERF9TUEtEUlYyX05BTUUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaWYgKHByaXYtPnNwa2RydjJfcmVnKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHByaXYtPnNwa2RydjJfcmVnKTsKKwkJCWlmIChyZXQpCisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSBzcGtkcnYyX3JlZyAlcyByZXQ6JWRcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCBXQ0Q5WFhYX1ZERF9TUEtEUlYyX05BTUUsIHJldCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmIChwcml2LT5zcGtkcnYyX3JlZykgeworCQkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+c3BrZHJ2Ml9yZWcpOworCQkJaWYgKHJldCkKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBzcGtkcnYyX3JlZyAlcyByZXQ6JWRcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCBXQ0Q5WFhYX1ZERF9TUEtEUlYyX05BTUUsIHJldCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2ludGVycG9sYXRvcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXByX2RlYnVnKCIlcyAlZCAlc1xuIiwgX19mdW5jX18sIGV2ZW50LCB3LT5uYW1lKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX1JYX1JFU0VUX0NUTCwKKwkJCTEgPDwgdy0+c2hpZnQsIDEgPDwgdy0+c2hpZnQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX1JYX1JFU0VUX0NUTCwKKwkJCTEgPDwgdy0+c2hpZnQsIDB4MCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKiBhcHBseSB0aGUgZGlnaXRhbCBnYWluIGFmdGVyIHRoZSBpbnRlcnBvbGF0b3IgaXMgZW5hYmxlZCovCisJCWlmICgody0+c2hpZnQpIDwgQVJSQVlfU0laRShyeF9kaWdpdGFsX2dhaW5fcmVnKSkKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJICByeF9kaWdpdGFsX2dhaW5fcmVnW3ctPnNoaWZ0XSwKKwkJCQkgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkgIHJ4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnRdKQorCQkJCSAgKTsKKwkJLyogQ2hlY2sgZm9yIFJ4MSBhbmQgUngyIHBhdGhzIGZvciB1aHFhIG1vZGUgdXBkYXRlICovCisJCWlmICh3LT5zaGlmdCA9PSAwIHx8IHctPnNoaWZ0ID09IDEpCisJCQl0b210b21fdXBkYXRlX3VocWFfbW9kZShjb2RlYywgKDEgPDwgdy0+c2hpZnQpKTsKKworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgaW50IF9fdG9tdG9tX2NvZGVjX2VuYWJsZV9sZG9faChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyoKKwkJICogbGRvX2hfdXNlcnMgaXMgcHJvdGVjdGVkIGJ5IHRvbXRvbS0+Y29kZWNfbXV0ZXgsIGRvbid0IG5lZWQKKwkJICogYWRkaXRpb25hbCBtdXRleAorCQkgKi8KKwkJaWYgKCsrcHJpdi0+bGRvX2hfdXNlcnMgPT0gMSkgeworCQkJV0NEOVhYWF9CR19DTEtfTE9DSygmcHJpdi0+cmVzbWdyKTsKKwkJCXdjZDl4eHhfcmVzbWdyX2dldF9iYW5kZ2FwKCZwcml2LT5yZXNtZ3IsCisJCQkJCQkgICBXQ0Q5WFhYX0JBTkRHQVBfQVVESU9fTU9ERSk7CisJCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnByaXYtPnJlc21ncik7CisJCQl0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwoY29kZWMsIHRydWUpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTERPX0hfTU9ERV8xLAorCQkJCQkgICAgMSA8PCA3LCAxIDw8IDcpOworCQkJdG9tdG9tX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBmYWxzZSk7CisJCQlwcl9kZWJ1ZygiJXM6IGxkb19oX3VzZXJzICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgcHJpdi0+bGRvX2hfdXNlcnMpOworCQkJLyogTERPIGVuYWJsZSByZXF1aXJlcyAxbXMgdG8gc2V0dGxlIGRvd24gKi8KKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKC0tcHJpdi0+bGRvX2hfdXNlcnMgPT0gMCkgeworCQkJdG9tdG9tX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCB0cnVlKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0xET19IX01PREVfMSwKKwkJCQkJICAgIDEgPDwgNywgMCk7CisJCQl0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwoY29kZWMsIGZhbHNlKTsKKwkJCVdDRDlYWFhfQkdfQ0xLX0xPQ0soJnByaXYtPnJlc21ncik7CisJCQl3Y2Q5eHh4X3Jlc21ncl9wdXRfYmFuZGdhcCgmcHJpdi0+cmVzbWdyLAorCQkJCQkJICAgV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUpOworCQkJV0NEOVhYWF9CR19DTEtfVU5MT0NLKCZwcml2LT5yZXNtZ3IpOworCQkJcHJfZGVidWcoIiVzOiBsZG9faF91c2VycyAlZFxuIiwgX19mdW5jX18sCisJCQkJIHByaXYtPmxkb19oX3VzZXJzKTsKKwkJfQorCQlXQVJOKHByaXYtPmxkb19oX3VzZXJzIDwgMCwgIlVuZXhwZWN0ZWQgbGRvX2ggdXNlcnMgJWRcbiIsCisJCSAgICAgcHJpdi0+bGRvX2hfdXNlcnMpOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lbmFibGVfbGRvX2goc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJaW50IHJjOworCisJcmMgPSBfX3RvbXRvbV9jb2RlY19lbmFibGVfbGRvX2godywga2NvbnRyb2wsIGV2ZW50KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9yeF9iaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJd2NkOXh4eF9yZXNtZ3JfZW5hYmxlX3J4X2JpYXMoJnRvbXRvbS0+cmVzbWdyLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdjZDl4eHhfcmVzbWdyX2VuYWJsZV9yeF9iaWFzKCZ0b210b20tPnJlc21nciwgMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2FuYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwljb25zdCBjaGFyICpmaWxlbmFtZTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCBpOworCWludCByZXQgPSAwOworCWludCBudW1fYW5jX3Nsb3RzOworCXN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIgKmFuY19oZWFkOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsID0gTlVMTDsKKwl1MzIgYW5jX3dyaXRlc19zaXplID0gMDsKKwl1MzIgYW5jX2NhbF9zaXplID0gMDsKKwlpbnQgYW5jX3NpemVfcmVtYWluaW5nOworCXUzMiAqYW5jX3B0cjsKKwl1MTYgcmVnOworCXU4IG1hc2ssIHZhbCwgb2xkX3ZhbDsKKwlzaXplX3QgY2FsX3NpemU7CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCWlmICh0b210b20tPmFuY19mdW5jID09IDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWZpbGVuYW1lID0gIndjZDkzMjAvd2NkOTMyMF9hbmMuYmluIjsKKworCQlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0b210b20tPmZ3X2RhdGEsIFdDRDlYWFhfQU5DX0NBTCk7CisJCWlmIChod2RlcF9jYWwpIHsKKwkJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCQljYWxfc2l6ZSA9IGh3ZGVwX2NhbC0+c2l6ZTsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyBod2RlcCBjYWxpYnJhdGlvblxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsIGNvZGVjLT5kZXYpOworCQkJaWYgKHJldCAhPSAwKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGFjcXVpcmUgQU5DIGRhdGE6ICVkXG4iLAorCQkJCQlyZXQpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJaWYgKCFmdykgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBnZXQgYW5jIGZ3Iik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQlkYXRhID0gZnctPmRhdGE7CisJCQljYWxfc2l6ZSA9IGZ3LT5zaXplOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIHJlcXVlc3RfZmlybXdhcmUgY2FsaWJyYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCQl9CisJCWlmIChjYWxfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTm90IGVub3VnaCBkYXRhXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBGaXJzdCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiByZWdpc3RlciB3cml0ZXMgKi8KKwkJYW5jX2hlYWQgPSAoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlciAqKShkYXRhKTsKKwkJYW5jX3B0ciA9ICh1MzIgKikoZGF0YSArCisJCQkJICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcikpOworCQlhbmNfc2l6ZV9yZW1haW5pbmcgPSBjYWxfc2l6ZSAtCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcik7CisJCW51bV9hbmNfc2xvdHMgPSBhbmNfaGVhZC0+bnVtX2FuY19zbG90czsKKworCQlpZiAodG9tdG9tLT5hbmNfc2xvdCA+PSBudW1fYW5jX3Nsb3RzKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIEFOQyBzbG90IHNlbGVjdGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FuY19zbG90czsgaSsrKSB7CisJCQlpZiAoYW5jX3NpemVfcmVtYWluaW5nIDwgVE9NVE9NX1BBQ0tFRF9SRUdfU0laRSkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgcmVnaXN0ZXIgZm9ybWF0XG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYW5jX3dyaXRlc19zaXplID0gKHUzMikoKmFuY19wdHIpOworCQkJYW5jX3NpemVfcmVtYWluaW5nIC09IHNpemVvZih1MzIpOworCQkJYW5jX3B0ciArPSAxOworCisJCQlpZiAoYW5jX3dyaXRlc19zaXplICogVE9NVE9NX1BBQ0tFRF9SRUdfU0laRQorCQkJCT4gYW5jX3NpemVfcmVtYWluaW5nKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCByZWdpc3RlciBmb3JtYXRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCWlmICh0b210b20tPmFuY19zbG90ID09IGkpCisJCQkJYnJlYWs7CisKKwkJCWFuY19zaXplX3JlbWFpbmluZyAtPSAoYW5jX3dyaXRlc19zaXplICoKKwkJCQlUT01UT01fUEFDS0VEX1JFR19TSVpFKTsKKwkJCWFuY19wdHIgKz0gYW5jX3dyaXRlc19zaXplOworCQl9CisJCWlmIChpID09IG51bV9hbmNfc2xvdHMpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlNlbGVjdGVkIEFOQyBzbG90IG5vdCBwcmVzZW50XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWkgPSAwOworCQlhbmNfY2FsX3NpemUgPSBhbmNfd3JpdGVzX3NpemU7CisJCWlmICh3LT5yZWcgPT0gVE9NVE9NX0FfUlhfSFBIX0xfREFDX0NUTCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVEwsIDB4MDMsIDB4MDMpOworCQkJYW5jX3dyaXRlc19zaXplID0gKGFuY19jYWxfc2l6ZS8yKTsKKwkJfQorCisJCWlmICh3LT5yZWcgPT0gVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVEwsIDB4MEMsIDB4MEMpOworCQkJaSA9IChhbmNfY2FsX3NpemUvMik7CisJCQlhbmNfd3JpdGVzX3NpemUgPSBhbmNfY2FsX3NpemU7CisJCX0KKworCQlmb3IgKDsgaSA8IGFuY193cml0ZXNfc2l6ZTsgaSsrKSB7CisJCQlUT01UT01fQ09ERUNfVU5QQUNLX0VOVFJZKGFuY19wdHJbaV0sIHJlZywKKwkJCQltYXNrLCB2YWwpOworCQkJLyoKKwkJCSAqIEFOQyBTb2Z0IHJlc2V0IHJlZ2lzdGVyIGlzIGlnbm9yZWQgZnJvbSBBQ0RCCisJCQkgKiBiZWNhdXNlIEFOQyBsZWZ0IHNvZnQgcmVzZXQgYml0cyB3aWxsIGJlIGNhbGxlZAorCQkJICogd2hpbGUgZW5hYmxpbmcgQU5DIEhQSCBSaWdodCBEQUMuCisJCQkgKi8KKwkJCWlmICgocmVnID09IFRPTVRPTV9BX0NEQ19DTEtfQU5DX1JFU0VUX0NUTCkgJiYKKwkJCQkoKHctPnJlZyA9PSBUT01UT01fQV9SWF9IUEhfTF9EQUNfQ1RMKSB8fAorCQkJCSh3LT5yZWcgPT0gVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlvbGRfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgcmVnLCAob2xkX3ZhbCAmIH5tYXNrKSB8CisJCQkJKHZhbCAmIG1hc2spKTsKKwkJfQorCQlpZiAody0+cmVnID09IFRPTVRPTV9BX1JYX0hQSF9MX0RBQ19DVEwpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVRPTVRPTV9BX0NEQ19DTEtfQU5DX1JFU0VUX0NUTCwgMHgwMywgMHgwMCk7CisKKwkJaWYgKHctPnJlZyA9PSBUT01UT01fQV9SWF9IUEhfUl9EQUNfQ1RMKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVEwsIDB4MEMsIDB4MDApOworCQlpZiAoIWh3ZGVwX2NhbCkKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQl0eGZlX2Nsa2Rpdl91cGRhdGUoY29kZWMpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQltc2xlZXAoNDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQU5DMV9CMV9DVEwsIDB4MDEsCisJCQkJICAgIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQU5DMl9CMV9DVEwsIDB4MDIsCisJCQkJICAgIDB4MDApOworCQltc2xlZXAoMjApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX0FOQ19SRVNFVF9DVEwsIDB4MEYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX0FOQ19DTEtfRU5fQ1RMLCAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQ0RDX0NMS19BTkNfUkVTRVRfQ1RMLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworZXJyOgorCWlmICghaHdkZXBfY2FsKQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRvbXRvbV9ocGhsX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdWludDMyX3QgaW1wZWRsLCBpbXBlZHI7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaWYgKHRvbXRvbV9wLT5hbmNfZnVuYykgeworCQkJdG9tdG9tX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJCW1zbGVlcCg1MCk7CisJCX0KKworCQlpZiAoIWhpZ2hfcGVyZl9tb2RlICYmICF0b210b21fcC0+dWhxYV9tb2RlKSB7CisJCQl3Y2Q5eHh4X2Nsc2hfZnNtKGNvZGVjLCAmdG9tdG9tX3AtPmNsc2hfZCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfUkVRX0VOQUJMRSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUFJFX0RBQyk7CisJCX0gZWxzZSB7CisJCQl3Y2Q5eHh4X2VuYWJsZV9oaWdoX3BlcmZfbW9kZShjb2RlYywgJnRvbXRvbV9wLT5jbHNoX2QsCisJCQkJCQl0b210b21fcC0+dWhxYV9tb2RlLAorCQkJCQkJV0NEOVhYWF9DTFNBQl9TVEFURV9IUEhMLAorCQkJCQkJV0NEOVhYWF9DTFNBQl9SRVFfRU5BQkxFKTsKKwkJfQorCQlyZXQgPSB3Y2Q5eHh4X21iaGNfZ2V0X2ltcGVkYW5jZSgmdG9tdG9tX3AtPm1iaGMsCisJCQkJCSZpbXBlZGwsICZpbXBlZHIpOworCQlpZiAoIXJldCkKKwkJCXdjZDl4eHhfY2xzaF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCk7CisJCWVsc2UKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gZ2V0IG1iaGMgaW1wZWRhbmNlICVkXG4iLAorCQkJCQkJX19mdW5jX18sIHJldCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfUlgxX0IzX0NUTCwgMHhCQywgMHg5NCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMLCAweDMwLCAweDEwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX1JYMV9CM19DVEwsIDB4QkMsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfUlgxX0I0X0NUTCwgMHgzMCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlpZiAoIWhpZ2hfcGVyZl9tb2RlICYmICF0b210b21fcC0+dWhxYV9tb2RlKSB7CisJCQl3Y2Q5eHh4X2Nsc2hfZnNtKGNvZGVjLCAmdG9tdG9tX3AtPmNsc2hfZCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfUkVRX0RJU0FCTEUsCisJCQkJCQkgV0NEOVhYWF9DTFNIX0VWRU5UX1BPU1RfUEEpOworCQl9IGVsc2UgeworCQkJd2NkOXh4eF9lbmFibGVfaGlnaF9wZXJmX21vZGUoY29kZWMsICZ0b210b21fcC0+Y2xzaF9kLAorCQkJCQkJdG9tdG9tX3AtPnVocWFfbW9kZSwKKwkJCQkJCVdDRDlYWFhfQ0xTQUJfU1RBVEVfSFBITCwKKwkJCQkJCVdDRDlYWFhfQ0xTQUJfUkVRX0RJU0FCTEUpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21faHBocl9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmICh0b210b21fcC0+YW5jX2Z1bmMpIHsKKwkJCXRvbXRvbV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7CisJCQltc2xlZXAoNTApOworCQl9CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdy0+cmVnLCAweDQwLCAweDQwKTsKKwkJaWYgKCFoaWdoX3BlcmZfbW9kZSAmJiAhdG9tdG9tX3AtPnVocWFfbW9kZSkgeworCQkJd2NkOXh4eF9jbHNoX2ZzbShjb2RlYywgJnRvbXRvbV9wLT5jbHNoX2QsCisJCQkJCQkgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFIsCisJCQkJCQkgV0NEOVhYWF9DTFNIX1JFUV9FTkFCTEUsCisJCQkJCQkgV0NEOVhYWF9DTFNIX0VWRU5UX1BSRV9EQUMpOworCQl9IGVsc2UgeworCQkJd2NkOXh4eF9lbmFibGVfaGlnaF9wZXJmX21vZGUoY29kZWMsICZ0b210b21fcC0+Y2xzaF9kLAorCQkJCQkJdG9tdG9tX3AtPnVocWFfbW9kZSwKKwkJCQkJCVdDRDlYWFhfQ0xTQUJfU1RBVEVfSFBIUiwKKwkJCQkJCVdDRDlYWFhfQ0xTQUJfUkVRX0VOQUJMRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19SWDJfQjNfQ1RMLCAweEJDLCAweDk0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX1JYMl9CNF9DVEwsIDB4MzAsIDB4MTApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfUlgyX0IzX0NUTCwgMHhCQywgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19SWDJfQjRfQ1RMLCAweDMwLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHctPnJlZywgMHg0MCwgMHgwMCk7CisJCWlmICghaGlnaF9wZXJmX21vZGUgJiYgIXRvbXRvbV9wLT51aHFhX21vZGUpIHsKKwkJCXdjZDl4eHhfY2xzaF9mc20oY29kZWMsICZ0b210b21fcC0+Y2xzaF9kLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhSLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9SRVFfRElTQUJMRSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUE9TVF9QQSk7CisJCX0gZWxzZSB7CisJCQl3Y2Q5eHh4X2VuYWJsZV9oaWdoX3BlcmZfbW9kZShjb2RlYywgJnRvbXRvbV9wLT5jbHNoX2QsCisJCQkJCQl0b210b21fcC0+dWhxYV9tb2RlLAorCQkJCQkJV0NEOVhYWF9DTFNBQl9TVEFURV9IUEhSLAorCQkJCQkJV0NEOVhYWF9DTFNBQl9SRVFfRElTQUJMRSk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9ocGhfcGFfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWVudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgZV9wcmVfb24sIGVfcG9zdF9vZmY7CisJdTggcmVxX2Nsc2hfc3RhdGU7CisJdTMyIHBhX3NldHRsZV90aW1lID0gVE9NVE9NX0hQSF9QQV9TRVRUTEVfQ09NUF9PRkY7CisKKwlwcl9kZWJ1ZygiJXM6ICVzIGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisJaWYgKHctPnNoaWZ0ID09IDUpIHsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9IUEhMX1BBX09OOworCQllX3Bvc3Rfb2ZmID0gV0NEOVhYWF9FVkVOVF9QT1NUX0hQSExfUEFfT0ZGOworCQlyZXFfY2xzaF9zdGF0ZSA9IFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMOworCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gNCkgeworCQllX3ByZV9vbiA9IFdDRDlYWFhfRVZFTlRfUFJFX0hQSFJfUEFfT047CisJCWVfcG9zdF9vZmYgPSBXQ0Q5WFhYX0VWRU5UX1BPU1RfSFBIUl9QQV9PRkY7CisJCXJlcV9jbHNoX3N0YXRlID0gV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFI7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCB3LT5zaGlmdCAlZFxuIiwgX19mdW5jX18sIHctPnNoaWZ0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRvbXRvbS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl8xXSkKKwkJcGFfc2V0dGxlX3RpbWUgPSBUT01UT01fSFBIX1BBX1NFVFRMRV9DT01QX09OOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNldF9iaXQoSFBIX0RFTEFZLCAmdG9tdG9tLT5zdGF0dXNfbWFzayk7CisJCS8qIExldCBNQkhDIG1vZHVsZSBrbm93IFBBIGlzIHR1cm5pbmcgb24gKi8KKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbCgmdG9tdG9tLT5yZXNtZ3IsIGVfcHJlX29uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKHRlc3RfYml0KEhQSF9ERUxBWSwgJnRvbXRvbS0+c3RhdHVzX21hc2spKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRvIHdhaXQgMTBtcyBhZnRlciBlbmFibGluZyBIUEhSX0hQSEwKKwkJCSAqIGluIHJlZ2lzdGVyIDB4MUFCCisJCQkgKi8KKwkJCXVzbGVlcF9yYW5nZShwYV9zZXR0bGVfdGltZSwgcGFfc2V0dGxlX3RpbWUgKyAxMDAwKTsKKwkJCWNsZWFyX2JpdChIUEhfREVMQVksICZ0b210b20tPnN0YXR1c19tYXNrKTsKKwkJCXByX2RlYnVnKCIlczogc2xlZXAgJWQgdXMgYWZ0ZXIgJXMgUEEgZW5hYmxlXG4iLAorCQkJCV9fZnVuY19fLCBwYV9zZXR0bGVfdGltZSwgdy0+bmFtZSk7CisJCX0KKwkJaWYgKCFoaWdoX3BlcmZfbW9kZSAmJiAhdG9tdG9tLT51aHFhX21vZGUpIHsKKwkJCXdjZDl4eHhfY2xzaF9mc20oY29kZWMsICZ0b210b20tPmNsc2hfZCwKKwkJCQkJCSByZXFfY2xzaF9zdGF0ZSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfUkVRX0VOQUJMRSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUE9TVF9QQSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzZXRfYml0KEhQSF9ERUxBWSwgJnRvbXRvbS0+c3RhdHVzX21hc2spOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBMZXQgTUJIQyBtb2R1bGUga25vdyBQQSB0dXJuZWQgb2ZmICovCisJCXdjZDl4eHhfcmVzbWdyX25vdGlmaWVyX2NhbGwoJnRvbXRvbS0+cmVzbWdyLCBlX3Bvc3Rfb2ZmKTsKKwkJaWYgKHRlc3RfYml0KEhQSF9ERUxBWSwgJnRvbXRvbS0+c3RhdHVzX21hc2spKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRvIHdhaXQgMTBtcyBhZnRlciBkaXNhYmxpbmcgSFBIUl9IUEhMCisJCQkgKiBpbiByZWdpc3RlciAweDFBQgorCQkJICovCisJCQl1c2xlZXBfcmFuZ2UocGFfc2V0dGxlX3RpbWUsIHBhX3NldHRsZV90aW1lICsgMTAwMCk7CisJCQljbGVhcl9iaXQoSFBIX0RFTEFZLCAmdG9tdG9tLT5zdGF0dXNfbWFzayk7CisJCQlwcl9kZWJ1ZygiJXM6IHNsZWVwICVkIHVzIGFmdGVyICVzIFBBIGRpc2FibGVcbiIsCisJCQkJX19mdW5jX18sIHBhX3NldHRsZV90aW1lLCB3LT5uYW1lKTsKKwkJfQorCisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2FuY19ocGgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gdG9tdG9tX2hwaF9wYV9ldmVudCh3LCBrY29udHJvbCwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9MX0RBQ19DVEwpICYgMHg4MCkgJiYKKwkJCShzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9SX0RBQ19DVEwpCisJCQkJCQkJCSYgMHg4MCkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVRPTVRPTV9BX1JYX0hQSF9DTlBfRU4sIDB4MzAsIDB4MzApOworCQkJbXNsZWVwKDMwKTsKKwkJfQorCQlyZXQgPSB0b210b21faHBoX3BhX2V2ZW50KHcsIGtjb250cm9sLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICh3LT5zaGlmdCA9PSA1KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlUT01UT01fQV9SWF9IUEhfQ05QX0VOLCAweDMwLCAweDAwKTsKKwkJCW1zbGVlcCg0MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlUT01UT01fQV9UWF83X01CSENfRU4sIDB4ODAsIDAwKTsKKwkJCXJldCB8PSB0b210b21fY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSB0b210b21faHBoX3BhX2V2ZW50KHcsIGtjb250cm9sLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdG9tdG9tX2RhcG1faTJzX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9JMlNfQ0xLIiwgVE9NVE9NX0FfQ0RDX0NMS19SWF9JMlNfQ1RMLAorCTQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlRYX0kyU19DTEsiLCBUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVEwsIDQsCisJMCwgTlVMTCwgMCksCit9OworCitzdGF0aWMgaW50IHRvbXRvbV9saW5lb3V0X2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXdjZDl4eHhfY2xzaF9mc20oY29kZWMsICZ0b210b20tPmNsc2hfZCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8sCisJCQkJCQkgV0NEOVhYWF9DTFNIX1JFUV9FTkFCTEUsCisJCQkJCQkgV0NEOVhYWF9DTFNIX0VWRU5UX1BSRV9EQUMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3LT5yZWcsIDB4NDAsIDB4NDApOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3LT5yZWcsIDB4NDAsIDB4MDApOworCQl3Y2Q5eHh4X2Nsc2hfZnNtKGNvZGVjLCAmdG9tdG9tLT5jbHNoX2QsCisJCQkJCQkgV0NEOVhYWF9DTFNIX1NUQVRFX0xPLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9SRVFfRElTQUJMRSwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUE9TVF9QQSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fc3BrX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXByX2RlYnVnKCIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMS19PVEhSX0NUTCwKKwkJCQkJCQkweDgwLCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCB3LT5yZWcpICYgMHgwMykgPT0gMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfQ0xLX09USFJfQ1RMLAorCQkJCQkJCTB4ODAsIDB4MDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX2kyc19tYXBbXSA9IHsKKwl7IlNMSU0gUlgxIiwgTlVMTCwgIlJYX0kyU19DTEsifSwKKwl7IlNMSU0gUlgyIiwgTlVMTCwgIlJYX0kyU19DTEsifSwKKwl7IlNMSU0gUlgzIiwgTlVMTCwgIlJYX0kyU19DTEsifSwKKwl7IlNMSU0gUlg0IiwgTlVMTCwgIlJYX0kyU19DTEsifSwKKworCXsiU0xJTSBUWDcgTVVYIiwgTlVMTCwgIlRYX0kyU19DTEsifSwKKwl7IlNMSU0gVFg4IE1VWCIsIE5VTEwsICJUWF9JMlNfQ0xLIn0sCisJeyJTTElNIFRYOSBNVVgiLCBOVUxMLCAiVFhfSTJTX0NMSyJ9LAorCXsiU0xJTSBUWDEwIE1VWCIsIE5VTEwsICJUWF9JMlNfQ0xLIn0sCisKKwl7IlJYX0kyU19DTEsiLCBOVUxMLCAiQ0RDX0kyU19SWF9DT05OIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKKwkvKiBTTElNQlVTIENvbm5lY3Rpb25zICovCisJeyJBSUYxIENBUCIsIE5VTEwsICJBSUYxX0NBUCBNaXhlciJ9LAorCXsiQUlGMiBDQVAiLCBOVUxMLCAiQUlGMl9DQVAgTWl4ZXIifSwKKwl7IkFJRjMgQ0FQIiwgTlVMTCwgIkFJRjNfQ0FQIE1peGVyIn0sCisKKwkvKiBWSSBGZWVkYmFjayAqLworCXsiQUlGNCBWSSIsIE5VTEwsICJWSU9OT0ZGIn0sCisJeyJWSU9OT0ZGIiwgIlN3aXRjaCIsICJWSUlOUFVUIn0sCisKKwkvKiBNQUQgKi8KKwl7Ik1BRF9TRUwgTVVYIiwgIlNQRSIsICJNQURfQ1BFX0lOUFVUIn0sCisJeyJNQURfU0VMIE1VWCIsICJNU00iLCAiTUFESU5QVVQifSwKKwl7Ik1BRE9OT0ZGIiwgIlN3aXRjaCIsICJNQURfU0VMIE1VWCJ9LAorCXsiQUlGNCBNQUQiLCBOVUxMLCAiTUFET05PRkYifSwKKworCS8qIFNMSU1fTUlYRVIoIkFJRjFfQ0FQIE1peGVyIiksKi8KKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDIiLCAiU0xJTSBUWDIgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0IE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDUiLCAiU0xJTSBUWDUgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3IE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDgiLCAiU0xJTSBUWDggTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAgTVVYIn0sCisJLyogU0xJTV9NSVhFUigiQUlGMl9DQVAgTWl4ZXIiKSwqLworCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgzIiwgIlNMSU0gVFgzIE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg2IiwgIlNMSU0gVFg2IE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg5IiwgIlNMSU0gVFg5IE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCBNVVgifSwKKwkvKiBTTElNX01JWEVSKCJBSUYzX0NBUCBNaXhlciIpLCovCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMSIsICJTTElNIFRYMSBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNCIsICJTTElNIFRYNCBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1IE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNyIsICJTTElNIFRYNyBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4IE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMTAiLCAiU0xJTSBUWDEwIE1VWCJ9LAorCisJeyJTTElNIFRYMSBNVVgiLCAiREVDMSIsICJERUMxIE1VWCJ9LAorCXsiU0xJTSBUWDEgTVVYIiwgIlJNSVgxIiwgIlJYMSBNSVgxIn0sCisJeyJTTElNIFRYMSBNVVgiLCAiUk1JWDIiLCAiUlgyIE1JWDEifSwKKwl7IlNMSU0gVFgxIE1VWCIsICJSTUlYMyIsICJSWDMgTUlYMSJ9LAorCXsiU0xJTSBUWDEgTVVYIiwgIlJNSVg0IiwgIlJYNCBNSVgxIn0sCisJeyJTTElNIFRYMSBNVVgiLCAiUk1JWDUiLCAiUlg1IE1JWDEifSwKKwl7IlNMSU0gVFgxIE1VWCIsICJSTUlYNiIsICJSWDYgTUlYMSJ9LAorCXsiU0xJTSBUWDEgTVVYIiwgIlJNSVg3IiwgIlJYNyBNSVgxIn0sCisJeyJTTElNIFRYMSBNVVgiLCAiUk1JWDgiLCAiUlg4IE1JWDEifSwKKworCXsiU0xJTSBUWDIgTVVYIiwgIkRFQzIiLCAiREVDMiBNVVgifSwKKwl7IlNMSU0gVFgyIE1VWCIsICJSTUlYMSIsICJSWDEgTUlYMSJ9LAorCXsiU0xJTSBUWDIgTVVYIiwgIlJNSVgyIiwgIlJYMiBNSVgxIn0sCisJeyJTTElNIFRYMiBNVVgiLCAiUk1JWDMiLCAiUlgzIE1JWDEifSwKKwl7IlNMSU0gVFgyIE1VWCIsICJSTUlYNCIsICJSWDQgTUlYMSJ9LAorCXsiU0xJTSBUWDIgTVVYIiwgIlJNSVg1IiwgIlJYNSBNSVgxIn0sCisJeyJTTElNIFRYMiBNVVgiLCAiUk1JWDYiLCAiUlg2IE1JWDEifSwKKwl7IlNMSU0gVFgyIE1VWCIsICJSTUlYNyIsICJSWDcgTUlYMSJ9LAorCXsiU0xJTSBUWDIgTVVYIiwgIlJNSVg4IiwgIlJYOCBNSVgxIn0sCisKKwl7IlNMSU0gVFgzIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJTTElNIFRYMyBNVVgiLCAiUk1JWDEiLCAiUlgxIE1JWDEifSwKKwl7IlNMSU0gVFgzIE1VWCIsICJSTUlYMiIsICJSWDIgTUlYMSJ9LAorCXsiU0xJTSBUWDMgTVVYIiwgIlJNSVgzIiwgIlJYMyBNSVgxIn0sCisJeyJTTElNIFRYMyBNVVgiLCAiUk1JWDQiLCAiUlg0IE1JWDEifSwKKwl7IlNMSU0gVFgzIE1VWCIsICJSTUlYNSIsICJSWDUgTUlYMSJ9LAorCXsiU0xJTSBUWDMgTVVYIiwgIlJNSVg2IiwgIlJYNiBNSVgxIn0sCisJeyJTTElNIFRYMyBNVVgiLCAiUk1JWDciLCAiUlg3IE1JWDEifSwKKwl7IlNMSU0gVFgzIE1VWCIsICJSTUlYOCIsICJSWDggTUlYMSJ9LAorCisJeyJTTElNIFRYNCBNVVgiLCAiREVDNCIsICJERUM0IE1VWCJ9LAorCXsiU0xJTSBUWDQgTVVYIiwgIlJNSVgxIiwgIlJYMSBNSVgxIn0sCisJeyJTTElNIFRYNCBNVVgiLCAiUk1JWDIiLCAiUlgyIE1JWDEifSwKKwl7IlNMSU0gVFg0IE1VWCIsICJSTUlYMyIsICJSWDMgTUlYMSJ9LAorCXsiU0xJTSBUWDQgTVVYIiwgIlJNSVg0IiwgIlJYNCBNSVgxIn0sCisJeyJTTElNIFRYNCBNVVgiLCAiUk1JWDUiLCAiUlg1IE1JWDEifSwKKwl7IlNMSU0gVFg0IE1VWCIsICJSTUlYNiIsICJSWDYgTUlYMSJ9LAorCXsiU0xJTSBUWDQgTVVYIiwgIlJNSVg3IiwgIlJYNyBNSVgxIn0sCisJeyJTTElNIFRYNCBNVVgiLCAiUk1JWDgiLCAiUlg4IE1JWDEifSwKKworCXsiU0xJTSBUWDUgTVVYIiwgIkRFQzUiLCAiREVDNSBNVVgifSwKKwl7IlNMSU0gVFg1IE1VWCIsICJSTUlYMSIsICJSWDEgTUlYMSJ9LAorCXsiU0xJTSBUWDUgTVVYIiwgIlJNSVgyIiwgIlJYMiBNSVgxIn0sCisJeyJTTElNIFRYNSBNVVgiLCAiUk1JWDMiLCAiUlgzIE1JWDEifSwKKwl7IlNMSU0gVFg1IE1VWCIsICJSTUlYNCIsICJSWDQgTUlYMSJ9LAorCXsiU0xJTSBUWDUgTVVYIiwgIlJNSVg1IiwgIlJYNSBNSVgxIn0sCisJeyJTTElNIFRYNSBNVVgiLCAiUk1JWDYiLCAiUlg2IE1JWDEifSwKKwl7IlNMSU0gVFg1IE1VWCIsICJSTUlYNyIsICJSWDcgTUlYMSJ9LAorCXsiU0xJTSBUWDUgTVVYIiwgIlJNSVg4IiwgIlJYOCBNSVgxIn0sCisKKwl7IlNMSU0gVFg2IE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisKKwl7IlNMSU0gVFg3IE1VWCIsICJERUMxIiwgIkRFQzEgTVVYIn0sCisJeyJTTElNIFRYNyBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIkRFQzMiLCAiREVDMyBNVVgifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJERUM0IiwgIkRFQzQgTVVYIn0sCisJeyJTTElNIFRYNyBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIkRFQzYiLCAiREVDNiBNVVgifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJERUM3IiwgIkRFQzcgTVVYIn0sCisJeyJTTElNIFRYNyBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIkRFQzkiLCAiREVDOSBNVVgifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJERUMxMCIsICJERUMxMCBNVVgifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJSTUlYMSIsICJSWDEgTUlYMSJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIlJNSVgyIiwgIlJYMiBNSVgxIn0sCisJeyJTTElNIFRYNyBNVVgiLCAiUk1JWDMiLCAiUlgzIE1JWDEifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJSTUlYNCIsICJSWDQgTUlYMSJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIlJNSVg1IiwgIlJYNSBNSVgxIn0sCisJeyJTTElNIFRYNyBNVVgiLCAiUk1JWDYiLCAiUlg2IE1JWDEifSwKKwl7IlNMSU0gVFg3IE1VWCIsICJSTUlYNyIsICJSWDcgTUlYMSJ9LAorCisJeyJTTElNIFRYOCBNVVgiLCAiREVDMSIsICJERUMxIE1VWCJ9LAorCXsiU0xJTSBUWDggTVVYIiwgIkRFQzIiLCAiREVDMiBNVVgifSwKKwl7IlNMSU0gVFg4IE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJTTElNIFRYOCBNVVgiLCAiREVDNCIsICJERUM0IE1VWCJ9LAorCXsiU0xJTSBUWDggTVVYIiwgIkRFQzUiLCAiREVDNSBNVVgifSwKKwl7IlNMSU0gVFg4IE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJTTElNIFRYOCBNVVgiLCAiREVDNyIsICJERUM3IE1VWCJ9LAorCXsiU0xJTSBUWDggTVVYIiwgIkRFQzgiLCAiREVDOCBNVVgifSwKKwl7IlNMSU0gVFg4IE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJTTElNIFRYOCBNVVgiLCAiREVDMTAiLCAiREVDMTAgTVVYIn0sCisKKwl7IlNMSU0gVFg5IE1VWCIsICJERUMxIiwgIkRFQzEgTVVYIn0sCisJeyJTTElNIFRYOSBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiU0xJTSBUWDkgTVVYIiwgIkRFQzMiLCAiREVDMyBNVVgifSwKKwl7IlNMSU0gVFg5IE1VWCIsICJERUM0IiwgIkRFQzQgTVVYIn0sCisJeyJTTElNIFRYOSBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiU0xJTSBUWDkgTVVYIiwgIkRFQzYiLCAiREVDNiBNVVgifSwKKwl7IlNMSU0gVFg5IE1VWCIsICJERUM3IiwgIkRFQzcgTVVYIn0sCisJeyJTTElNIFRYOSBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiU0xJTSBUWDkgTVVYIiwgIkRFQzkiLCAiREVDOSBNVVgifSwKKwl7IlNMSU0gVFg5IE1VWCIsICJERUMxMCIsICJERUMxMCBNVVgifSwKKworCXsiU0xJTSBUWDEwIE1VWCIsICJERUMxIiwgIkRFQzEgTVVYIn0sCisJeyJTTElNIFRYMTAgTVVYIiwgIkRFQzIiLCAiREVDMiBNVVgifSwKKwl7IlNMSU0gVFgxMCBNVVgiLCAiREVDMyIsICJERUMzIE1VWCJ9LAorCXsiU0xJTSBUWDEwIE1VWCIsICJERUM0IiwgIkRFQzQgTVVYIn0sCisJeyJTTElNIFRYMTAgTVVYIiwgIkRFQzUiLCAiREVDNSBNVVgifSwKKwl7IlNMSU0gVFgxMCBNVVgiLCAiREVDNiIsICJERUM2IE1VWCJ9LAorCXsiU0xJTSBUWDEwIE1VWCIsICJERUM3IiwgIkRFQzcgTVVYIn0sCisJeyJTTElNIFRYMTAgTVVYIiwgIkRFQzgiLCAiREVDOCBNVVgifSwKKwl7IlNMSU0gVFgxMCBNVVgiLCAiREVDOSIsICJERUM5IE1VWCJ9LAorCXsiU0xJTSBUWDEwIE1VWCIsICJERUMxMCIsICJERUMxMCBNVVgifSwKKworCS8qIEVhcnBpZWNlIChSWCBNSVgxKSAqLworCXsiRUFSIiwgTlVMTCwgIkVBUiBQQSJ9LAorCXsiRUFSIFBBIiwgTlVMTCwgIkVBUl9QQV9NSVhFUiJ9LAorCXsiRUFSX1BBX01JWEVSIiwgTlVMTCwgIkRBQzEifSwKKwl7IkRBQzEiLCBOVUxMLCAiUlhfQklBUyJ9LAorCisJeyJBTkMgRUFSIiwgTlVMTCwgIkFOQyBFQVIgUEEifSwKKwl7IkFOQyBFQVIgUEEiLCBOVUxMLCAiRUFSX1BBX01JWEVSIn0sCisJeyJBTkMxIEZCIE1VWCIsICJFQVJfSFBIX0wiLCAiUlgxIE1JWDIifSwKKwl7IkFOQzEgRkIgTVVYIiwgIkVBUl9MSU5FXzEiLCAiUlgyIE1JWDIifSwKKworCS8qIEhlYWRzZXQgKFJYIE1JWDEgYW5kIFJYIE1JWDIpICovCisJeyJIRUFEUEhPTkUiLCBOVUxMLCAiSFBITCJ9LAorCXsiSEVBRFBIT05FIiwgTlVMTCwgIkhQSFIifSwKKworCXsiSFBITCIsIE5VTEwsICJIUEhMX1BBX01JWEVSIn0sCisJeyJIUEhMX1BBX01JWEVSIiwgTlVMTCwgIkhQSEwgREFDIn0sCisJeyJIUEhMIERBQyIsIE5VTEwsICJSWF9CSUFTIn0sCisKKwl7IkhQSFIiLCBOVUxMLCAiSFBIUl9QQV9NSVhFUiJ9LAorCXsiSFBIUl9QQV9NSVhFUiIsIE5VTEwsICJIUEhSIERBQyJ9LAorCXsiSFBIUiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCisJeyJBTkMgSEVBRFBIT05FIiwgTlVMTCwgIkFOQyBIUEhMIn0sCisJeyJBTkMgSEVBRFBIT05FIiwgTlVMTCwgIkFOQyBIUEhSIn0sCisKKwl7IkFOQyBIUEhMIiwgTlVMTCwgIkhQSExfUEFfTUlYRVIifSwKKwl7IkFOQyBIUEhSIiwgTlVMTCwgIkhQSFJfUEFfTUlYRVIifSwKKworCXsiQU5DMSBNVVgiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTkMxIE1VWCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFOQzEgTVVYIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU5DMSBNVVgiLCAiQURDNCIsICJBREM0In0sCisJeyJBTkMxIE1VWCIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFOQzEgTVVYIiwgIkFEQzYiLCAiQURDNiJ9LAorCXsiQU5DMSBNVVgiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkFOQzEgTVVYIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJBTkMxIE1VWCIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiQU5DMSBNVVgiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkFOQzEgTVVYIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTkMxIE1VWCIsICJETUlDNiIsICJETUlDNiJ9LAorCXsiQU5DMiBNVVgiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTkMyIE1VWCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFOQzIgTVVYIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU5DMiBNVVgiLCAiQURDNCIsICJBREM0In0sCisJeyJBTkMyIE1VWCIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFOQzIgTVVYIiwgIkFEQzYiLCAiQURDNiJ9LAorCXsiQU5DMiBNVVgiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkFOQzIgTVVYIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJBTkMyIE1VWCIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiQU5DMiBNVVgiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkFOQzIgTVVYIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTkMyIE1VWCIsICJETUlDNiIsICJETUlDNiJ9LAorCisJeyJBTkMgSFBIUiIsIE5VTEwsICJDRENfQ09OTiJ9LAorCisJeyJEQUMxIiwgIlN3aXRjaCIsICJDTEFTU19IX0RTTSBNVVgifSwKKwl7IkhQSEwgREFDIiwgIlN3aXRjaCIsICJDTEFTU19IX0RTTSBNVVgifSwKKwl7IkhQSFIgREFDIiwgTlVMTCwgIlJYMiBDSEFJTiJ9LAorCisJeyJMSU5FT1VUMSIsIE5VTEwsICJMSU5FT1VUMSBQQSJ9LAorCXsiTElORU9VVDIiLCBOVUxMLCAiTElORU9VVDIgUEEifSwKKwl7IkxJTkVPVVQzIiwgTlVMTCwgIkxJTkVPVVQzIFBBIn0sCisJeyJMSU5FT1VUNCIsIE5VTEwsICJMSU5FT1VUNCBQQSJ9LAorCXsiU1BLX09VVCIsIE5VTEwsICJTUEsgUEEifSwKKwl7IlNQS19PVVQiLCBOVUxMLCAiU1BLMiBQQSJ9LAorCisJeyJMSU5FT1VUMSBQQSIsIE5VTEwsICJMSU5FT1VUMV9QQV9NSVhFUiJ9LAorCXsiTElORU9VVDFfUEFfTUlYRVIiLCBOVUxMLCAiTElORU9VVDEgREFDIn0sCisKKwl7IkxJTkVPVVQyIFBBIiwgTlVMTCwgIkxJTkVPVVQyX1BBX01JWEVSIn0sCisJeyJMSU5FT1VUMl9QQV9NSVhFUiIsIE5VTEwsICJMSU5FT1VUMiBEQUMifSwKKworCXsiTElORU9VVDMgUEEiLCBOVUxMLCAiTElORU9VVDNfUEFfTUlYRVIifSwKKwl7IkxJTkVPVVQzX1BBX01JWEVSIiwgTlVMTCwgIkxJTkVPVVQzIERBQyJ9LAorCisJeyJMSU5FT1VUNCBQQSIsIE5VTEwsICJMSU5FT1VUNF9QQV9NSVhFUiJ9LAorCXsiTElORU9VVDRfUEFfTUlYRVIiLCBOVUxMLCAiTElORU9VVDQgREFDIn0sCisKKwl7IkxJTkVPVVQxIERBQyIsIE5VTEwsICJSWDMgTUlYMSJ9LAorCisJeyJSREFDNSBNVVgiLCAiREVNM19JTlYiLCAiUlgzIE1JWDEifSwKKwl7IlJEQUM1IE1VWCIsICJERU00IiwgIlJYNCBNSVgxIn0sCisKKwl7IkxJTkVPVVQzIERBQyIsIE5VTEwsICJSREFDNSBNVVgifSwKKworCXsiTElORU9VVDIgREFDIiwgTlVMTCwgIlJYNSBNSVgxIn0sCisKKwl7IlJEQUM3IE1VWCIsICJERU01X0lOViIsICJSWDUgTUlYMSJ9LAorCXsiUkRBQzcgTVVYIiwgIkRFTTYiLCAiUlg2IE1JWDEifSwKKworCXsiTElORU9VVDQgREFDIiwgTlVMTCwgIlJEQUM3IE1VWCJ9LAorCisJeyJTUEsgUEEiLCBOVUxMLCAiU1BLIERBQyJ9LAorCXsiU1BLIERBQyIsIE5VTEwsICJSWDcgTUlYMiJ9LAorCXsiU1BLIERBQyIsIE5VTEwsICJWRERfU1BLRFJWIn0sCisKKwl7IlNQSzIgUEEiLCBOVUxMLCAiU1BLMiBEQUMifSwKKwl7IlNQSzIgREFDIiwgTlVMTCwgIlJYOCBNSVgxIn0sCisJeyJTUEsyIERBQyIsIE5VTEwsICJWRERfU1BLRFJWMiJ9LAorCisJeyJDTEFTU19IX0RTTSBNVVgiLCAiRFNNX0hQSExfUlgxIiwgIlJYMSBDSEFJTiJ9LAorCisJeyJSWDEgSU5URVJQIiwgTlVMTCwgIlJYMSBNSVgyIn0sCisJeyJSWDEgQ0hBSU4iLCBOVUxMLCAiUlgxIElOVEVSUCJ9LAorCXsiUlgyIElOVEVSUCIsIE5VTEwsICJSWDIgTUlYMiJ9LAorCXsiUlgyIENIQUlOIiwgTlVMTCwgIlJYMiBJTlRFUlAifSwKKwl7IlJYMSBNSVgyIiwgTlVMTCwgIkFOQzEgTVVYIn0sCisJeyJSWDIgTUlYMiIsIE5VTEwsICJBTkMyIE1VWCJ9LAorCisJeyJMSU5FT1VUMSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDIgREFDIiwgTlVMTCwgIlJYX0JJQVMifSwKKwl7IkxJTkVPVVQzIERBQyIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJMSU5FT1VUNCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiU1BLIERBQyIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJTUEsyIERBQyIsIE5VTEwsICJSWF9CSUFTIn0sCisKKwl7IlJYNyBNSVgxIiwgTlVMTCwgIkNPTVAwX0NMSyJ9LAorCXsiUlg4IE1JWDEiLCBOVUxMLCAiQ09NUDBfQ0xLIn0sCisJeyJSWDEgTUlYMSIsIE5VTEwsICJDT01QMV9DTEsifSwKKwl7IlJYMiBNSVgxIiwgTlVMTCwgIkNPTVAxX0NMSyJ9LAorCXsiUlgzIE1JWDEiLCBOVUxMLCAiQ09NUDJfQ0xLIn0sCisJeyJSWDUgTUlYMSIsIE5VTEwsICJDT01QMl9DTEsifSwKKworCXsiUlgxIE1JWDEiLCBOVUxMLCAiUlgxIE1JWDEgSU5QMSJ9LAorCXsiUlgxIE1JWDEiLCBOVUxMLCAiUlgxIE1JWDEgSU5QMiJ9LAorCXsiUlgxIE1JWDEiLCBOVUxMLCAiUlgxIE1JWDEgSU5QMyJ9LAorCXsiUlgyIE1JWDEiLCBOVUxMLCAiUlgyIE1JWDEgSU5QMSJ9LAorCXsiUlgyIE1JWDEiLCBOVUxMLCAiUlgyIE1JWDEgSU5QMiJ9LAorCXsiUlgzIE1JWDEiLCBOVUxMLCAiUlgzIE1JWDEgSU5QMSJ9LAorCXsiUlgzIE1JWDEiLCBOVUxMLCAiUlgzIE1JWDEgSU5QMiJ9LAorCXsiUlg0IE1JWDEiLCBOVUxMLCAiUlg0IE1JWDEgSU5QMSJ9LAorCXsiUlg0IE1JWDEiLCBOVUxMLCAiUlg0IE1JWDEgSU5QMiJ9LAorCXsiUlg1IE1JWDEiLCBOVUxMLCAiUlg1IE1JWDEgSU5QMSJ9LAorCXsiUlg1IE1JWDEiLCBOVUxMLCAiUlg1IE1JWDEgSU5QMiJ9LAorCXsiUlg2IE1JWDEiLCBOVUxMLCAiUlg2IE1JWDEgSU5QMSJ9LAorCXsiUlg2IE1JWDEiLCBOVUxMLCAiUlg2IE1JWDEgSU5QMiJ9LAorCXsiUlg3IE1JWDEiLCBOVUxMLCAiUlg3IE1JWDEgSU5QMSJ9LAorCXsiUlg3IE1JWDEiLCBOVUxMLCAiUlg3IE1JWDEgSU5QMiJ9LAorCXsiUlg4IE1JWDEiLCBOVUxMLCAiUlg4IE1JWDEgSU5QMSJ9LAorCXsiUlg4IE1JWDEiLCBOVUxMLCAiUlg4IE1JWDEgSU5QMiJ9LAorCXsiUlgxIE1JWDIiLCBOVUxMLCAiUlgxIE1JWDEifSwKKwl7IlJYMSBNSVgyIiwgTlVMTCwgIlJYMSBNSVgyIElOUDEifSwKKwl7IlJYMSBNSVgyIiwgTlVMTCwgIlJYMSBNSVgyIElOUDIifSwKKwl7IlJYMiBNSVgyIiwgTlVMTCwgIlJYMiBNSVgxIn0sCisJeyJSWDIgTUlYMiIsIE5VTEwsICJSWDIgTUlYMiBJTlAxIn0sCisJeyJSWDIgTUlYMiIsIE5VTEwsICJSWDIgTUlYMiBJTlAyIn0sCisJeyJSWDcgTUlYMiIsIE5VTEwsICJSWDcgTUlYMSJ9LAorCXsiUlg3IE1JWDIiLCBOVUxMLCAiUlg3IE1JWDIgSU5QMSJ9LAorCXsiUlg3IE1JWDIiLCBOVUxMLCAiUlg3IE1JWDIgSU5QMiJ9LAorCisJLyogU0xJTV9NVVgoIkFJRjFfUEIiLCAiQUlGMSBQQiIpLCovCisJeyJTTElNIFJYMSBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYMiBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYMyBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYNCBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYNSBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYNiBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYNyBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJeyJTTElNIFJYOCBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCisJLyogU0xJTV9NVVgoIkFJRjJfUEIiLCAiQUlGMiBQQiIpLCovCisJeyJTTElNIFJYMSBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYMiBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYMyBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYNCBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYNSBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYNiBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYNyBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJeyJTTElNIFJYOCBNVVgiLCAiQUlGMl9QQiIsICJBSUYyIFBCIn0sCisJLyogU0xJTV9NVVgoIkFJRjNfUEIiLCAiQUlGMyBQQiIpLCovCisJeyJTTElNIFJYMSBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYMiBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYMyBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNCBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNSBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNiBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNyBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYOCBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisKKwl7IlNMSU0gUlgxIiwgTlVMTCwgIlNMSU0gUlgxIE1VWCJ9LAorCXsiU0xJTSBSWDIiLCBOVUxMLCAiU0xJTSBSWDIgTVVYIn0sCisJeyJTTElNIFJYMyIsIE5VTEwsICJTTElNIFJYMyBNVVgifSwKKwl7IlNMSU0gUlg0IiwgTlVMTCwgIlNMSU0gUlg0IE1VWCJ9LAorCXsiU0xJTSBSWDUiLCBOVUxMLCAiU0xJTSBSWDUgTVVYIn0sCisJeyJTTElNIFJYNiIsIE5VTEwsICJTTElNIFJYNiBNVVgifSwKKwl7IlNMSU0gUlg3IiwgTlVMTCwgIlNMSU0gUlg3IE1VWCJ9LAorCXsiU0xJTSBSWDgiLCBOVUxMLCAiU0xJTSBSWDggTVVYIn0sCisKKwl7IlJYMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlgxIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlgxIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWDEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgxIE1JWDEgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWDEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlgxIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWDEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlgxIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWDEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgxIE1JWDEgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMSBNSVgxIElOUDMiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWDEgTUlYMSBJTlAzIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlgxIE1JWDEgSU5QMyIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYMSBNSVgxIElOUDMiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWDEgTUlYMSBJTlAzIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlgxIE1JWDEgSU5QMyIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYMSBNSVgxIElOUDMiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlgyIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYMiBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlgyIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYMiBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDIgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlgyIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMiBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDIgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlgyIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDIgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlgyIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDIgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlgyIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMiBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlgzIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYMyBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlgzIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYMyBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDMgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlgzIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMyBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDMgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlgzIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDMgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlgzIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDMgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlgzIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMyBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDQgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg0IE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNCBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDQgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg0IE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNCBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDQgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg0IE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNCBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDQgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg0IE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNCBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDQgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlg0IE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYNCBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDQgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg0IE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNCBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDUgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg1IE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNSBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDUgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg1IE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNSBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDUgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg1IE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNSBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDUgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg1IE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDUgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg1IE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDUgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg1IE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNSBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDYgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg2IE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNiBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDYgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg2IE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNiBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDYgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg2IE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNiBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDYgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg2IE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNiBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDYgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg2IE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNiBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDYgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg2IE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNiBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDcgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg3IE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNyBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDcgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg3IE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNyBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDcgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg3IE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNyBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDcgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg3IE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYNyBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDcgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg3IE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYNyBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDcgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg3IE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYNyBNSVgxIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDggTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlg4IE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYOCBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWDggTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlg4IE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYOCBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWDggTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlg4IE1JWDEgSU5QMSIsICJSWDgiLCAiU0xJTSBSWDgifSwKKwl7IlJYOCBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDggTUlYMSBJTlAxIiwgIklJUjIiLCAiSUlSMiJ9LAorCXsiUlg4IE1JWDEgSU5QMiIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYOCBNSVgxIElOUDIiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWDggTUlYMSBJTlAyIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlg4IE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYOCBNSVgxIElOUDIiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWDggTUlYMSBJTlAyIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlg4IE1JWDEgSU5QMiIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYOCBNSVgxIElOUDIiLCAiUlg4IiwgIlNMSU0gUlg4In0sCisJeyJSWDggTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlg4IE1JWDEgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKKworCS8qIElJUjEsIElJUjIgaW5wdXRzIHRvIFNlY29uZCBSWCBNaXhlciBvbiBSWDEsIFJYMiBhbmQgUlg3IGNoYWlucy4gKi8KKwl7IlJYMSBNSVgyIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDEgTUlYMiBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlgyIE1JWDIgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMiBNSVgyIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWDcgTUlYMiBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlg3IE1JWDIgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYMSBNSVgyIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDEgTUlYMiBJTlAyIiwgIklJUjIiLCAiSUlSMiJ9LAorCXsiUlgyIE1JWDIgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKKwl7IlJYMiBNSVgyIElOUDIiLCAiSUlSMiIsICJJSVIyIn0sCisJeyJSWDcgTUlYMiBJTlAxIiwgIklJUjIiLCAiSUlSMiJ9LAorCXsiUlg3IE1JWDIgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKKworCS8qIERlY2ltYXRvciBJbnB1dHMgKi8KKwl7IkRFQzEgTVVYIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJERUMxIE1VWCIsICJBREM2IiwgIkFEQzYifSwKKwl7IkRFQzEgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCisJeyJERUMyIE1VWCIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiREVDMiBNVVgiLCAiQURDNSIsICJBREM1In0sCisJeyJERUMyIE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAorCXsiREVDMyBNVVgiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRFQzMgTVVYIiwgIkFEQzQiLCAiQURDNCJ9LAorCXsiREVDMyBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKKwl7IkRFQzQgTVVYIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJERUM0IE1VWCIsICJBREMzIiwgIkFEQzMifSwKKwl7IkRFQzQgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCisJeyJERUM1IE1VWCIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiREVDNSBNVVgiLCAiQURDMiIsICJBREMyIn0sCisJeyJERUM1IE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAorCXsiREVDNiBNVVgiLCAiRE1JQzYiLCAiRE1JQzYifSwKKwl7IkRFQzYgTVVYIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiREVDNiBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKKwl7IkRFQzcgTVVYIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJERUM3IE1VWCIsICJETUlDNiIsICJETUlDNiJ9LAorCXsiREVDNyBNVVgiLCAiQURDMSIsICJBREMxIn0sCisJeyJERUM3IE1VWCIsICJBREM2IiwgIkFEQzYifSwKKwl7IkRFQzcgTVVYIiwgIkFOQzFfRkIiLCAiQU5DMSBNVVgifSwKKwl7IkRFQzcgTVVYIiwgIkFOQzJfRkIiLCAiQU5DMiBNVVgifSwKKwl7IkRFQzcgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCisJeyJERUM4IE1VWCIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiREVDOCBNVVgiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkRFQzggTVVYIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiREVDOCBNVVgiLCAiQURDNSIsICJBREM1In0sCisJeyJERUM4IE1VWCIsICJBTkMxX0ZCIiwgIkFOQzEgTVVYIn0sCisJeyJERUM4IE1VWCIsICJBTkMyX0ZCIiwgIkFOQzIgTVVYIn0sCisJeyJERUM4IE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAorCXsiREVDOSBNVVgiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRFQzkgTVVYIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJERUM5IE1VWCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkRFQzkgTVVYIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiREVDOSBNVVgiLCAiQU5DMV9GQiIsICJBTkMxIE1VWCJ9LAorCXsiREVDOSBNVVgiLCAiQU5DMl9GQiIsICJBTkMyIE1VWCJ9LAorCXsiREVDOSBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKKwl7IkRFQzEwIE1VWCIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiREVDMTAgTVVYIiwgIkRNSUM2IiwgIkRNSUM2In0sCisJeyJERUMxMCBNVVgiLCAiQURDMSIsICJBREMxIn0sCisJeyJERUMxMCBNVVgiLCAiQURDNCIsICJBREM0In0sCisJeyJERUMxMCBNVVgiLCAiQU5DMV9GQiIsICJBTkMxIE1VWCJ9LAorCXsiREVDMTAgTVVYIiwgIkFOQzJfRkIiLCAiQU5DMiBNVVgifSwKKwl7IkRFQzEwIE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAorCisJLyogQURDIENvbm5lY3Rpb25zICovCisJeyJBREMxIiwgTlVMTCwgIkFNSUMxIn0sCisJeyJBREMyIiwgTlVMTCwgIkFNSUMyIn0sCisJeyJBREMzIiwgTlVMTCwgIkFNSUMzIn0sCisJeyJBREM0IiwgTlVMTCwgIkFNSUM0In0sCisJeyJBREM1IiwgTlVMTCwgIkFNSUM1In0sCisJeyJBREM2IiwgTlVMTCwgIkFNSUM2In0sCisKKwkvKiBBVVggUEdBIENvbm5lY3Rpb25zICovCisJeyJFQVJfUEFfTUlYRVIiLCAiQVVYX1BHQV9MIFN3aXRjaCIsICJBVVhfUEdBX0xlZnQifSwKKwl7IkhQSExfUEFfTUlYRVIiLCAiQVVYX1BHQV9MIFN3aXRjaCIsICJBVVhfUEdBX0xlZnQifSwKKwl7IkhQSFJfUEFfTUlYRVIiLCAiQVVYX1BHQV9SIFN3aXRjaCIsICJBVVhfUEdBX1JpZ2h0In0sCisJeyJMSU5FT1VUMV9QQV9NSVhFUiIsICJBVVhfUEdBX0wgU3dpdGNoIiwgIkFVWF9QR0FfTGVmdCJ9LAorCXsiTElORU9VVDJfUEFfTUlYRVIiLCAiQVVYX1BHQV9SIFN3aXRjaCIsICJBVVhfUEdBX1JpZ2h0In0sCisJeyJMSU5FT1VUM19QQV9NSVhFUiIsICJBVVhfUEdBX0wgU3dpdGNoIiwgIkFVWF9QR0FfTGVmdCJ9LAorCXsiTElORU9VVDRfUEFfTUlYRVIiLCAiQVVYX1BHQV9SIFN3aXRjaCIsICJBVVhfUEdBX1JpZ2h0In0sCisJeyJBVVhfUEdBX0xlZnQiLCBOVUxMLCAiQU1JQzUifSwKKwl7IkFVWF9QR0FfUmlnaHQiLCBOVUxMLCAiQU1JQzYifSwKKworCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDEgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMiIsIE5VTEwsICJJSVIyIElOUDEgTVVYIn0sCisJeyJJSVIyIElOUDEgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIyIElOUDEgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIyIElOUDEgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIyIElOUDEgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIyIElOUDEgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjIgSU5QMSBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIyIElOUDEgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMiBJTlAxIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDIgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMiIsIE5VTEwsICJJSVIyIElOUDIgTVVYIn0sCisJeyJJSVIyIElOUDIgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjIgSU5QMiBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIyIElOUDIgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjIgSU5QMiBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIyIElOUDIgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjIgSU5QMiBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIyIElOUDIgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjIgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIyIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjIgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIyIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMiBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDMgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMiIsIE5VTEwsICJJSVIyIElOUDMgTVVYIn0sCisJeyJJSVIyIElOUDMgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjIgSU5QMyBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIyIElOUDMgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjIgSU5QMyBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIyIElOUDMgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjIgSU5QMyBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIyIElOUDMgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjIgSU5QMyBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIyIElOUDMgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjIgSU5QMyBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIyIElOUDMgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMiBJTlAzIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDQgTVVYIn0sCisJeyJJSVIxIElOUDQgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjEgSU5QNCBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIxIElOUDQgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjEgSU5QNCBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIxIElOUDQgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjEgSU5QNCBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIxIElOUDQgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjEgSU5QNCBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIxIElOUDQgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjEgSU5QNCBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIxIElOUDQgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMSBJTlA0IE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiSUlSMiIsIE5VTEwsICJJSVIyIElOUDQgTVVYIn0sCisJeyJJSVIyIElOUDQgTVVYIiwgIkRFQzEiLCAiREVDMSBNVVgifSwKKwl7IklJUjIgSU5QNCBNVVgiLCAiREVDMiIsICJERUMyIE1VWCJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJERUMzIiwgIkRFQzMgTVVYIn0sCisJeyJJSVIyIElOUDQgTVVYIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKKwl7IklJUjIgSU5QNCBNVVgiLCAiREVDNSIsICJERUM1IE1VWCJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJERUM2IiwgIkRFQzYgTVVYIn0sCisJeyJJSVIyIElOUDQgTVVYIiwgIkRFQzciLCAiREVDNyBNVVgifSwKKwl7IklJUjIgSU5QNCBNVVgiLCAiREVDOCIsICJERUM4IE1VWCJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJERUM5IiwgIkRFQzkgTVVYIn0sCisJeyJJSVIyIElOUDQgTVVYIiwgIkRFQzEwIiwgIkRFQzEwIE1VWCJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjIgSU5QNCBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIyIElOUDQgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjIgSU5QNCBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIyIElOUDQgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMiBJTlA0IE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKworCXsiTUlDIEJJQVMxIEludGVybmFsMSIsIE5VTEwsICJMRE9fSCJ9LAorCXsiTUlDIEJJQVMxIEludGVybmFsMiIsIE5VTEwsICJMRE9fSCJ9LAorCXsiTUlDIEJJQVMxIEV4dGVybmFsIiwgTlVMTCwgIkxET19IIn0sCisJeyJNSUMgQklBUzIgSW50ZXJuYWwxIiwgTlVMTCwgIkxET19IIn0sCisJeyJNSUMgQklBUzIgSW50ZXJuYWwyIiwgTlVMTCwgIkxET19IIn0sCisJeyJNSUMgQklBUzIgSW50ZXJuYWwzIiwgTlVMTCwgIkxET19IIn0sCisJeyJNSUMgQklBUzIgRXh0ZXJuYWwiLCBOVUxMLCAiTERPX0gifSwKKwl7Ik1JQyBCSUFTMyBJbnRlcm5hbDEiLCBOVUxMLCAiTERPX0gifSwKKwl7Ik1JQyBCSUFTMyBJbnRlcm5hbDIiLCBOVUxMLCAiTERPX0gifSwKKwl7Ik1JQyBCSUFTMyBFeHRlcm5hbCIsIE5VTEwsICJMRE9fSCJ9LAorCXsiTUlDIEJJQVM0IEV4dGVybmFsIiwgTlVMTCwgIkxET19IIn0sCisJe0RBUE1fTUlDQklBUzJfRVhURVJOQUxfU1RBTkRBTE9ORSwgTlVMTCwgIkxET19IIFN0YW5kYWxvbmUifSwKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG9tdG9tX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworfQorCitpbnQgdG9tdG9tX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1jbGtfZW5hYmxlLCBib29sIGRhcG0pCit7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2RlYnVnKCIlczogbWNsa19lbmFibGUgPSAldSwgZGFwbSA9ICVkXG4iLCBfX2Z1bmNfXywgbWNsa19lbmFibGUsCisJCSBkYXBtKTsKKworCVdDRDlYWFhfQkdfQ0xLX0xPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwlpZiAobWNsa19lbmFibGUpIHsKKwkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2JhbmRnYXAoJnRvbXRvbS0+cmVzbWdyLAorCQkJCQkgICBXQ0Q5WFhYX0JBTkRHQVBfQVVESU9fTU9ERSk7CisJCXdjZDl4eHhfcmVzbWdyX2dldF9jbGtfYmxvY2soJnRvbXRvbS0+cmVzbWdyLCBXQ0Q5WFhYX0NMS19NQ0xLKTsKKwl9IGVsc2UgeworCQkvKiBQdXQgY2xvY2sgYW5kIEJHICovCisJCXdjZDl4eHhfcmVzbWdyX3B1dF9jbGtfYmxvY2soJnRvbXRvbS0+cmVzbWdyLCBXQ0Q5WFhYX0NMS19NQ0xLKTsKKwkJd2NkOXh4eF9yZXNtZ3JfcHV0X2JhbmRnYXAoJnRvbXRvbS0+cmVzbWdyLAorCQkJCQkgICBXQ0Q5WFhYX0JBTkRHQVBfQVVESU9fTU9ERSk7CisJfQorCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSygmdG9tdG9tLT5yZXNtZ3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQkvKiBDUFUgaXMgbWFzdGVyICovCisJCWlmICh0b210b20tPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykgeworCQkJaWYgKGRhaS0+aWQgPT0gQUlGMV9DQVApCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ0xLX1RYX0kyU19DVEwsCisJCQkJCVRPTVRPTV9JMlNfTUFTVEVSX01PREVfTUFTSywgMCk7CisJCQllbHNlIGlmIChkYWktPmlkID09IEFJRjFfUEIpCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVEwsCisJCQkJCVRPTVRPTV9JMlNfTUFTVEVSX01PREVfTUFTSywgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCS8qIENQVSBpcyBzbGF2ZSAqLworCQlpZiAodG9tdG9tLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJCXZhbCA9IFRPTVRPTV9JMlNfTUFTVEVSX01PREVfTUFTSzsKKwkJCWlmIChkYWktPmlkID09IEFJRjFfQ0FQKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKKwkJCQkJVE9NVE9NX0FfQ0RDX0NMS19UWF9JMlNfQ1RMLCB2YWwsIHZhbCk7CisJCQllbHNlIGlmIChkYWktPmlkID09IEFJRjFfUEIpCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVEwsIHZhbCwgdmFsKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQl1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCisJCQkJdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQorCit7CisJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJaWYgKCF0eF9zbG90IHx8ICFyeF9zbG90KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgdHhfc2xvdD0lcEssIHJ4X3Nsb3Q9JXBLXG4iLAorCQkJX19mdW5jX18sIHR4X3Nsb3QsIHJ4X3Nsb3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzKCk6IGRhaV9uYW1lID0gJXMgREFJLUlEICV4IHR4X2NoICVkIHJ4X2NoICVkXG4iCisJCSAidG9tdG9tLT5pbnRmX3R5cGUgJWRcbiIsCisJCSBfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCB0eF9udW0sIHJ4X251bSwKKwkJIHRvbXRvbS0+aW50Zl90eXBlKTsKKworCWlmICh0b210b20tPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJd2NkOXh4eF9pbml0X3NsaW1zbGF2ZShjb3JlLCBjb3JlLT5zbGltLT5sYWRkciwKKwkJCQkJICAgdHhfbnVtLCB0eF9zbG90LCByeF9udW0sIHJ4X3Nsb3QpOworCQkvKlJlc2VydmUgdHgxMSBhbmQgdHgxMiBmb3IgVkkgZmVlZGJhY2sgcGF0aCovCisJCWRhaV9kYXRhID0gJnRvbXRvbS0+ZGFpW0FJRjRfVklGRUVEXTsKKwkJaWYgKGRhaV9kYXRhKSB7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbVE9NVE9NX1RYMTFdLmxpc3QsCisJCQkmZGFpX2RhdGEtPndjZDl4eHhfY2hfbGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbVE9NVE9NX1RYMTJdLmxpc3QsCisJCQkmZGFpX2RhdGEtPndjZDl4eHhfY2hfbGlzdCk7CisJCX0KKworCQkvKiBSZXNlcnZlIFRYMTMgZm9yIE1BRCBkYXRhIGNoYW5uZWwgKi8KKwkJZGFpX2RhdGEgPSAmdG9tdG9tLT5kYWlbQUlGNF9NQURfVFhdOworCQlpZiAoZGFpX2RhdGEpCisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbVE9NVE9NX1RYMTNdLmxpc3QsCisJCQkJICAgICAgJmRhaV9kYXRhLT53Y2Q5eHh4X2NoX2xpc3QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9nZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJIHVuc2lnbmVkIGludCAqdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCisJCQkJIHVuc2lnbmVkIGludCAqcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCisKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKwl1MzIgaSA9IDA7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSBBSUYxX1BCOgorCWNhc2UgQUlGMl9QQjoKKwljYXNlIEFJRjNfUEI6CisJCWlmICghcnhfc2xvdCB8fCAhcnhfbnVtKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHJ4X3Nsb3QgJXBLIG9yIHJ4X251bSAlcEtcbiIsCisJCQkJIF9fZnVuY19fLCByeF9zbG90LCByeF9udW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRvbXRvbV9wLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LAorCQkJCSAgICBsaXN0KSB7CisJCQlwcl9kZWJ1ZygiJXM6IHNsb3RfbnVtICV1IGNoLT5jaF9udW0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBpLCBjaC0+Y2hfbnVtKTsKKwkJCXJ4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07CisJCX0KKwkJcHJfZGVidWcoIiVzOiByeF9udW0gJWRcbiIsIF9fZnVuY19fLCBpKTsKKwkJKnJ4X251bSA9IGk7CisJCWJyZWFrOworCWNhc2UgQUlGMV9DQVA6CisJY2FzZSBBSUYyX0NBUDoKKwljYXNlIEFJRjNfQ0FQOgorCWNhc2UgQUlGNF9WSUZFRUQ6CisJY2FzZSBBSUY0X01BRF9UWDoKKwkJaWYgKCF0eF9zbG90IHx8ICF0eF9udW0pIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgdHhfc2xvdCAlcEsgb3IgdHhfbnVtICVwS1xuIiwKKwkJCQkgX19mdW5jX18sIHR4X3Nsb3QsIHR4X251bSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdG9tdG9tX3AtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJCXByX2RlYnVnKCIlczogc2xvdF9udW0gJXUgY2gtPmNoX251bSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGksICBjaC0+Y2hfbnVtKTsKKwkJCXR4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07CisJCX0KKwkJcHJfZGVidWcoIiVzOiB0eF9udW0gJWRcbiIsIF9fZnVuY19fLCBpKTsKKwkJKnR4X251bSA9IGk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBEQUkgSUQgJXhcbiIsIF9fZnVuY19fLCBkYWktPmlkKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3NldF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwl1OCByeF9mc19yYXRlX3JlZ192YWwsIHUzMiBjb21wYW5kZXJfZnMsIHUzMiBzYW1wbGVfcmF0ZSkKK3sKKwl1MzIgajsKKwl1OCByeF9taXgxX2lucCwgcng4X21peDFfaW5wOworCXUxNiByeF9taXhfMV9yZWdfMSwgcnhfbWl4XzFfcmVnXzI7CisJdTE2IHJ4X2ZzX3JlZzsKKwl1OCByeF9taXhfMV9yZWdfMV92YWwsIHJ4X21peF8xX3JlZ18yX3ZhbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBwb3J0X3J4XzggPSBUT01UT01fUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyBOVU1fSU5URVJQT0xBVE9SUyAtIDE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdG9tdG9tLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCS8qIGZvciBSWCBwb3J0IHN0YXJ0aW5nIGZyb20gMTYgaW5zdGVhZCBvZiAxMCBsaWtlIHRhYmxhICovCisJCXJ4X21peDFfaW5wID0gY2gtPnBvcnQgKyBSWF9NSVgxX0lOUF9TRUxfUlgxIC0KKwkJCSAgICAgIFRPTVRPTV9UWF9QT1JUX05VTUJFUjsKKwkJcng4X21peDFfaW5wID0gY2gtPnBvcnQgKyBSWDhfTUlYMV9JTlBfU0VMX1JYMSAtCisJCQkgICAgICAgVE9NVE9NX1JYX1BPUlRfU1RBUlRfTlVNQkVSOworCQlpZiAoKChjaC0+cG9ydCA8IHBvcnRfcnhfOCkgJiYKKwkJICAgICAoKHJ4X21peDFfaW5wIDwgUlhfTUlYMV9JTlBfU0VMX1JYMSkgfHwKKwkJICAgICAgKHJ4X21peDFfaW5wID4gUlhfTUlYMV9JTlBfU0VMX1JYNykpKSB8fAorCQkgICAgKChyeDhfbWl4MV9pbnAgPCBSWDhfTUlYMV9JTlBfU0VMX1JYMSkgfHwKKwkJICAgICAocng4X21peDFfaW5wID4gUlg4X01JWDFfSU5QX1NFTF9SWDgpKSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBUT01UT01fUlgldSBwb3J0LiBEYWkgSUQgaXMgJWRcbiIsCisJCQkJCV9fZnVuY19fLCAgcng4X21peDFfaW5wIC0gMiwKKwkJCQkJZGFpLT5pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJ4X21peF8xX3JlZ18xID0gVE9NVE9NX0FfQ0RDX0NPTk5fUlgxX0IxX0NUTDsKKworCQlmb3IgKGogPSAwOyBqIDwgTlVNX0lOVEVSUE9MQVRPUlMgLSAxOyBqKyspIHsKKwkJCXJ4X21peF8xX3JlZ18yID0gcnhfbWl4XzFfcmVnXzEgKyAxOworCisJCQlyeF9taXhfMV9yZWdfMV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCQkJICByeF9taXhfMV9yZWdfMSk7CisJCQlyeF9taXhfMV9yZWdfMl92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCQkJICByeF9taXhfMV9yZWdfMik7CisKKwkJCWlmICgoKHJ4X21peF8xX3JlZ18xX3ZhbCAmIDB4MEYpID09IHJ4X21peDFfaW5wKSB8fAorCQkJICAgICgoKHJ4X21peF8xX3JlZ18xX3ZhbCA+PiA0KSAmIDB4MEYpCisJCQkJPT0gcnhfbWl4MV9pbnApIHx8CisJCQkgICAgKChyeF9taXhfMV9yZWdfMl92YWwgJiAweDBGKSA9PSByeF9taXgxX2lucCkpIHsKKworCQkJCXJ4X2ZzX3JlZyA9IFRPTVRPTV9BX0NEQ19SWDFfQjVfQ1RMICsgOCAqIGo7CisKKwkJCQlwcl9kZWJ1ZygiJXM6IEFJRl9QQiBEQUkoJWQpIGNvbm5lY3RlZCB0byBSWCV1XG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpLT5pZCwgaiArIDEpOworCisJCQkJcHJfZGVidWcoIiVzOiBzZXQgUlgldSBzYW1wbGUgcmF0ZSB0byAldVxuIiwKKwkJCQkJX19mdW5jX18sIGogKyAxLCBzYW1wbGVfcmF0ZSk7CisKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9mc19yZWcsCisJCQkJCQkweEUwLCByeF9mc19yYXRlX3JlZ192YWwpOworCisJCQkJaWYgKGNvbXBfcnhfcGF0aFtqXSA8IENPTVBBTkRFUl9NQVgpCisJCQkJCXRvbXRvbS0+Y29tcF9mc1tjb21wX3J4X3BhdGhbal1dCisJCQkJCT0gY29tcGFuZGVyX2ZzOworCQkJfQorCQkJaWYgKGogPCAyKQorCQkJCXJ4X21peF8xX3JlZ18xICs9IDM7CisJCQllbHNlCisJCQkJcnhfbWl4XzFfcmVnXzEgKz0gMjsKKwkJfQorCisJCS8qIFJYOCBpbnRlcnBvbGF0b3IgcGF0aCAqLworCQlyeF9taXhfMV9yZWdfMV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCQlUT01UT01fQV9DRENfQ09OTl9SWDhfQjFfQ1RMKTsKKwkJaWYgKCgocnhfbWl4XzFfcmVnXzFfdmFsICYgMHgwRikgPT0gcng4X21peDFfaW5wKSB8fAorCQkgICAgKCgocnhfbWl4XzFfcmVnXzFfdmFsID4+IDQpICYgMHgwRikgPT0gcng4X21peDFfaW5wKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX1JYOF9CNV9DVEwsCisJCQkJCSAgICAweEUwLCByeF9mc19yYXRlX3JlZ192YWwpOworCQkJcHJfZGVidWcoIiVzOiBBSUZfUEIgREFJKCVkKSBjb25uZWN0ZWQgdG8gUlgldVxuIiwKKwkJCQkJX19mdW5jX18sIGRhaS0+aWQsIE5VTV9JTlRFUlBPTEFUT1JTKTsKKworCQkJcHJfZGVidWcoIiVzOiBzZXQgUlgldSBzYW1wbGUgcmF0ZSB0byAldVxuIiwKKwkJCQkJX19mdW5jX18sIE5VTV9JTlRFUlBPTEFUT1JTLAorCQkJCQlzYW1wbGVfcmF0ZSk7CisJCQlpZiAoY29tcF9yeF9wYXRoW05VTV9JTlRFUlBPTEFUT1JTIC0gMV0gPCBDT01QQU5ERVJfTUFYKQorCQkJCXRvbXRvbS0+Y29tcF9mc1tjb21wX3J4X3BhdGhbal1dID0KKwkJCQkJCQljb21wYW5kZXJfZnM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3NldF9kZWNpbWF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwl1OCB0eF9mc19yYXRlX3JlZ192YWwsIHUzMiBzYW1wbGVfcmF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUzMiB0eF9wb3J0OworCXUxNiB0eF9wb3J0X3JlZywgdHhfZnNfcmVnOworCXU4IHR4X3BvcnRfcmVnX3ZhbDsKKwlzOCBkZWNpbWF0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdG9tdG9tLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisKKwkJdHhfcG9ydCA9IGNoLT5wb3J0ICsgMTsKKwkJcHJfZGVidWcoIiVzOiBkYWktPmlkID0gJWQsIHR4X3BvcnQgPSAlZCIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCwgdHhfcG9ydCk7CisKKwkJaWYgKCh0eF9wb3J0IDwgMSkgfHwgKHR4X3BvcnQgPiBOVU1fREVDSU1BVE9SUykpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgU0xJTSBUWCV1IHBvcnQuIERBSSBJRCBpcyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdHhfcG9ydCwgZGFpLT5pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXR4X3BvcnRfcmVnID0gVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjFfQ1RMICsgKHR4X3BvcnQgLSAxKTsKKwkJdHhfcG9ydF9yZWdfdmFsID0gIHNuZF9zb2NfcmVhZChjb2RlYywgdHhfcG9ydF9yZWcpOworCisJCWRlY2ltYXRvciA9IDA7CisKKwkJaWYgKCh0eF9wb3J0ID49IDEpICYmICh0eF9wb3J0IDw9IDYpKSB7CisKKwkJCXR4X3BvcnRfcmVnX3ZhbCA9ICB0eF9wb3J0X3JlZ192YWwgJiAweDBGOworCQkJaWYgKHR4X3BvcnRfcmVnX3ZhbCA9PSAweDgpCisJCQkJZGVjaW1hdG9yID0gdHhfcG9ydDsKKworCQl9IGVsc2UgaWYgKCh0eF9wb3J0ID49IDcpICYmICh0eF9wb3J0IDw9IE5VTV9ERUNJTUFUT1JTKSkgeworCisJCQl0eF9wb3J0X3JlZ192YWwgPSAgdHhfcG9ydF9yZWdfdmFsICYgMHgxRjsKKworCQkJaWYgKCh0eF9wb3J0X3JlZ192YWwgPj0gMHg4KSAmJgorCQkJICAgICh0eF9wb3J0X3JlZ192YWwgPD0gMHgxMSkpIHsKKworCQkJCWRlY2ltYXRvciA9ICh0eF9wb3J0X3JlZ192YWwgLSAweDgpICsgMTsKKwkJCX0KKwkJfQorCisJCWlmIChkZWNpbWF0b3IpIHsgLyogU0xJTV9UWCBwb3J0IGhhcyBhIERFQyBhcyBpbnB1dCAqLworCisJCQl0eF9mc19yZWcgPSBUT01UT01fQV9DRENfVFgxX0NMS19GU19DVEwgKworCQkJCSAgICA4ICogKGRlY2ltYXRvciAtIDEpOworCisJCQlwcl9kZWJ1ZygiJXM6IHNldCBERUMldSAoLT4gU0xJTV9UWCV1KSByYXRlIHRvICV1XG4iLAorCQkJCV9fZnVuY19fLCBkZWNpbWF0b3IsIHR4X3BvcnQsIHNhbXBsZV9yYXRlKTsKKworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfZnNfcmVnLCAweDA3LAorCQkJCQkgICAgdHhfZnNfcmF0ZV9yZWdfdmFsKTsKKworCQl9IGVsc2UgeworCQkJaWYgKCh0eF9wb3J0X3JlZ192YWwgPj0gMHgxKSAmJgorCQkJICAgICh0eF9wb3J0X3JlZ192YWwgPD0gMHg3KSkgeworCisJCQkJcHJfZGVidWcoIiVzOiBSTUlYJXUgZ29pbmcgdG8gU0xJTSBUWCV1XG4iLAorCQkJCQlfX2Z1bmNfXywgdHhfcG9ydF9yZWdfdmFsLCB0eF9wb3J0KTsKKworCQkJfSBlbHNlIGlmICAoKHR4X3BvcnRfcmVnX3ZhbCA+PSAweDgpICYmCisJCQkJICAgICh0eF9wb3J0X3JlZ192YWwgPD0gMHgxMSkpIHsKKworCQkJCXByX2VycigiJXM6IEVSUk9SOiBTaG91bGQgbm90IGJlIGhlcmVcbiIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQlwcl9lcnIoIiVzOiBFUlJPUjogREVDIGNvbm5lY3RlZCB0byBTTElNIFRYJXVcbiIsCisJCQkJCV9fZnVuY19fLCB0eF9wb3J0KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJfSBlbHNlIGlmICh0eF9wb3J0X3JlZ192YWwgPT0gMCkgeworCQkJCXByX2RlYnVnKCIlczogbm8gc2lnbmFsIHRvIFNMSU0gVFgldVxuIiwKKwkJCQkJX19mdW5jX18sIHR4X3BvcnQpOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoIiVzOiBFUlJPUjogd3Jvbmcgc2lnbmFsIHRvIFNMSU0gVFgldVxuIiwKKwkJCQkJX19mdW5jX18sIHR4X3BvcnQpOworCQkJCXByX2VycigiJXM6IEVSUk9SOiB3cm9uZyBzaWduYWwgPSAldVxuIiwKKwkJCQkJX19mdW5jX18sIHR4X3BvcnRfcmVnX3ZhbCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRvbXRvbV9zZXRfcnhzYl9wb3J0X2Zvcm1hdChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmNkY19kYWk7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCWludCBwb3J0OworCXU4IGJpdF9zZWw7CisJdTE2IHNiX2N0bF9yZWcsIGZpZWxkX3NoaWZ0OworCisJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCWNhc2UgMTY6CisJCWJpdF9zZWwgPSAweDI7CisJCXRvbXRvbV9wLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMTY7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWJpdF9zZWwgPSAweDA7CisJCXRvbXRvbV9wLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWNkY19kYWkgPSAmdG9tdG9tX3AtPmRhaVtkYWktPmlkXTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZjZGNfZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJcG9ydCA9IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQoY2gtPmNoX251bSk7CisKKwkJaWYgKElTX0VSUl9WQUxVRShwb3J0KSB8fAorCQkgICAgIVRPTVRPTV9WQUxJREFURV9SWF9TQlBPUlRfUkFOR0UocG9ydCkpIHsKKwkJCWRldl93YXJuKGNvZGVjLT5kZXYsCisJCQkJICIlczogaW52YWxpZCBwb3J0IElEICVkIHJldHVybmVkIGZvciBSWCBEQUlcbiIsCisJCQkJIF9fZnVuY19fLCBwb3J0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnQgPSBUT01UT01fQ09OVkVSVF9SWF9TQlBPUlRfSUQocG9ydCk7CisKKwkJaWYgKHBvcnQgPD0gMykgeworCQkJc2JfY3RsX3JlZyA9IFRPTVRPTV9BX0NEQ19DT05OX1JYX1NCX0IxX0NUTDsKKwkJCWZpZWxkX3NoaWZ0ID0gcG9ydCA8PCAxOworCQl9IGVsc2UgaWYgKHBvcnQgPD0gNykgeworCQkJc2JfY3RsX3JlZyA9IFRPTVRPTV9BX0NEQ19DT05OX1JYX1NCX0IyX0NUTDsKKwkJCWZpZWxkX3NoaWZ0ID0gKHBvcnQgLSA0KSA8PCAxOworCQl9IGVsc2UgeyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJZGV2X3dhcm4oY29kZWMtPmRldiwKKwkJCQkgIiVzOiBiYWQgcG9ydCBJRCAlZFxuIiwgX19mdW5jX18sIHBvcnQpOworCQkJcmV0dXJuOworCQl9CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNiX2N0bF9yZWcgJXggZmllbGRfc2hpZnQgJXhcbiIsCisJCQlfX2Z1bmNfXywgc2JfY3RsX3JlZywgZmllbGRfc2hpZnQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzYl9jdGxfcmVnLCAweDMgPDwgZmllbGRfc2hpZnQsCisJCQkJICAgIGJpdF9zZWwgPDwgZmllbGRfc2hpZnQpOworCX0KK30KKworc3RhdGljIHZvaWQgdG9tdG9tX3NldF90eF9zYl9wb3J0X2Zvcm1hdChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpjZGNfZGFpOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlpbnQgcG9ydDsKKwl1OCBiaXRfc2VsLCBiaXRfc2hpZnQ7CisJdTE2IHNiX2N0bF9yZWc7CisKKwlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJY2FzZSAxNjoKKwkJYml0X3NlbCA9IDB4MjsKKwkJdG9tdG9tX3AtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJYml0X3NlbCA9IDB4MDsKKwkJdG9tdG9tX3AtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBhcmFtc193aWR0aChwYXJhbXMpKTsKKwkJcmV0dXJuOworCX0KKworCWNkY19kYWkgPSAmdG9tdG9tX3AtPmRhaVtkYWktPmlkXTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZjZGNfZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJcG9ydCA9IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQoY2gtPmNoX251bSk7CisKKwkJaWYgKElTX0VSUl9WQUxVRShwb3J0KSB8fAorCQkgICAgIVRPTVRPTV9WQUxJREFURV9UWF9TQlBPUlRfUkFOR0UocG9ydCkpIHsKKwkJCWRldl93YXJuKGNvZGVjLT5kZXYsCisJCQkJICIlczogaW52YWxpZCBwb3J0IElEICVkIHJldHVybmVkIGZvciBUWCBEQUlcbiIsCisJCQkJIF9fZnVuY19fLCBwb3J0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChwb3J0IDwgNikgLyogNiA9IFNMSU1CVVMgVFg3ICovCisJCQliaXRfc2hpZnQgPSBUT01UT01fQklUX0FESl9TSElGVF9QT1JUMV82OworCQllbHNlIGlmIChwb3J0IDwgMTApCisJCQliaXRfc2hpZnQgPSBUT01UT01fQklUX0FESl9TSElGVF9QT1JUN18xMDsKKwkJZWxzZSB7CisJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAorCQkJCSAiJXM6IHBvcnQgSUQgJWQgYml0d2lkdGggaXMgZml4ZWRcbiIsCisJCQkJIF9fZnVuY19fLCBwb3J0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNiX2N0bF9yZWcgPSAoVE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjFfQ1RMICsgcG9ydCk7CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHJlZyAleCBiaXRfc2VsICV4IGJpdF9zaGlmdCAleFxuIiwKKwkJCV9fZnVuY19fLCBzYl9jdGxfcmVnLCBiaXRfc2VsLCBiaXRfc2hpZnQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzYl9jdGxfcmVnLCAweDMgPDwKKwkJCQkgICAgYml0X3NoaWZ0LCBiaXRfc2VsIDw8IGJpdF9zaGlmdCk7CisJfQorfQorCitzdGF0aWMgaW50IHRvbXRvbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJdTggdHhfZnNfcmF0ZSwgcnhfZnNfcmF0ZSwgaTJzX2JpdF9tb2RlOworCXUzMiBjb21wYW5kZXJfZnM7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWRcbiIsIF9fZnVuY19fLAorCQkgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQkgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOworCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA4MDAwOgorCQl0eF9mc19yYXRlID0gMHgwMDsKKwkJcnhfZnNfcmF0ZSA9IDB4MDA7CisJCWNvbXBhbmRlcl9mcyA9IENPTVBBTkRFUl9GU184S0haOworCQlicmVhazsKKwljYXNlIDE2MDAwOgorCQl0eF9mc19yYXRlID0gMHgwMTsKKwkJcnhfZnNfcmF0ZSA9IDB4MjA7CisJCWNvbXBhbmRlcl9mcyA9IENPTVBBTkRFUl9GU18xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAzMjAwMDoKKwkJdHhfZnNfcmF0ZSA9IDB4MDI7CisJCXJ4X2ZzX3JhdGUgPSAweDQwOworCQljb21wYW5kZXJfZnMgPSBDT01QQU5ERVJfRlNfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCXR4X2ZzX3JhdGUgPSAweDAzOworCQlyeF9mc19yYXRlID0gMHg2MDsKKwkJY29tcGFuZGVyX2ZzID0gQ09NUEFOREVSX0ZTXzQ4S0haOworCQlicmVhazsKKwljYXNlIDk2MDAwOgorCQl0eF9mc19yYXRlID0gMHgwNDsKKwkJcnhfZnNfcmF0ZSA9IDB4ODA7CisJCWNvbXBhbmRlcl9mcyA9IENPTVBBTkRFUl9GU185NktIWjsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDA6CisJCXR4X2ZzX3JhdGUgPSAweDA1OworCQlyeF9mc19yYXRlID0gMHhBMDsKKwkJY29tcGFuZGVyX2ZzID0gQ09NUEFOREVSX0ZTXzE5MktIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzYW1wbGluZyByYXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHN1YnN0cmVhbS0+c3RyZWFtKSB7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6CisJCWlmIChkYWktPmlkICE9IEFJRjRfVklGRUVEICYmCisJCSAgICBkYWktPmlkICE9IEFJRjRfTUFEX1RYKSB7CisJCQlyZXQgPSB0b210b21fc2V0X2RlY2ltYXRvcl9yYXRlKGRhaSwgdHhfZnNfcmF0ZSwKKwkJCQkJCQkgICBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogc2V0IGRlY2ltYXRvciByYXRlIGZhaWxlZCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCisJCXRvbXRvbS0+ZGFpW2RhaS0+aWRdLnJhdGUgICA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKKwkJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJCWkyc19iaXRfbW9kZSA9IDB4MDE7CisJCQl0b210b20tPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQkJdG9tdG9tLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMjQ7CisJCQlpMnNfYml0X21vZGUgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCQl0b210b20tPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAzMjsKKwkJCWkyc19iaXRfbW9kZSA9IDB4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IEludmFsaWQgZm9ybWF0IDB4JXhcbiIsCisJCQkJIF9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodG9tdG9tLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19DTEtfVFhfSTJTX0NUTCwKKwkJCQkJICAgIDB4MjAsIGkyc19iaXRfbW9kZSA8PCA1KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19DTEtfVFhfSTJTX0NUTCwKKwkJCQkJICAgIDB4MDcsIHR4X2ZzX3JhdGUpOworCQl9IGVsc2UgeworCQkJLyogb25seSBnZW5lcmljIHBvcnRzIGNhbiBoYXZlIHNhbXBsZSBiaXQgYWRqdXN0bWVudCAqLworCQkJaWYgKGRhaS0+aWQgIT0gQUlGNF9WSUZFRUQgJiYKKwkJCSAgICBkYWktPmlkICE9IEFJRjRfTUFEX1RYKQorCQkJCXRvbXRvbV9zZXRfdHhfc2JfcG9ydF9mb3JtYXQocGFyYW1zLCBkYWkpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6CisJCXJldCA9IHRvbXRvbV9zZXRfaW50ZXJwb2xhdG9yX3JhdGUoZGFpLCByeF9mc19yYXRlLAorCQkJCQkJICBjb21wYW5kZXJfZnMsCisJCQkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogc2V0IGRlY2ltYXRvciByYXRlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKHRvbXRvbS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7CisJCQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVEwsCisJCQkJCTB4MjAsIDB4MjApOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlUT01UT01fQV9DRENfQ0xLX1JYX0kyU19DVEwsCisJCQkJCTB4MjAsIDB4MDApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9lcnIoImludmFsaWQgZm9ybWF0XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19DTEtfUlhfSTJTX0NUTCwKKwkJCQkJICAgIDB4MDMsIChyeF9mc19yYXRlID4+IDB4MDUpKTsKKwkJfSBlbHNlIHsKKwkJCXRvbXRvbV9zZXRfcnhzYl9wb3J0X2Zvcm1hdChwYXJhbXMsIGRhaSk7CisJCQl0b210b20tPmRhaVtkYWktPmlkXS5yYXRlICAgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsIF9fZnVuY19fLAorCQkJc3Vic3RyZWFtLT5zdHJlYW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgdG9tdG9tX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgPSB0b210b21fc3RhcnR1cCwKKwkuc2h1dGRvd24gPSB0b210b21fc2h1dGRvd24sCisJLmh3X3BhcmFtcyA9IHRvbXRvbV9od19wYXJhbXMsCisJLnNldF9zeXNjbGsgPSB0b210b21fc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQgPSB0b210b21fc2V0X2RhaV9mbXQsCisJLnNldF9jaGFubmVsX21hcCA9IHRvbXRvbV9zZXRfY2hhbm5lbF9tYXAsCisJLmdldF9jaGFubmVsX21hcCA9IHRvbXRvbV9nZXRfY2hhbm5lbF9tYXAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0b210b21fZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJ0b210b21fcngxIiwKKwkJLmlkID0gQUlGMV9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRvbXRvbV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0b210b21fdHgxIiwKKwkJLmlkID0gQUlGMV9DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzMwX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBUT01UT01fRk9STUFUUywKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQl9LAorCQkub3BzID0gJnRvbXRvbV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0b210b21fcngyIiwKKwkJLmlkID0gQUlGMl9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRvbXRvbV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0b210b21fdHgyIiwKKwkJLmlkID0gQUlGMl9DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzMwX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBUT01UT01fRk9STUFUUywKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQl9LAorCQkub3BzID0gJnRvbXRvbV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0b210b21fcngzIiwKKwkJLmlkID0gQUlGM19QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjMgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRvbXRvbV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0b210b21fdHgzIiwKKwkJLmlkID0gQUlGM19DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjMgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzMwX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBUT01UT01fRk9STUFUUywKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCX0sCisJCS5vcHMgPSAmdG9tdG9tX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRvbXRvbV92aWZlZWRiYWNrIiwKKwkJLmlkID0gQUlGNF9WSUZFRUQsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZJZmVlZCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlX21pbiA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkgfSwKKwkJLm9wcyA9ICZ0b210b21fZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidG9tdG9tX21hZDEiLAorCQkuaWQgPSBBSUY0X01BRF9UWCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGNCBNQUQgVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFRPTVRPTV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9taW4gPSAxNjAwMCwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJfSwKKwkJLm9wcyA9ICZ0b210b21fZGFpX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdG9tdG9tX2kyc19kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gInRvbXRvbV9pMnNfcngxIiwKKwkJLmlkID0gQUlGMV9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJfSwKKwkJLm9wcyA9ICZ0b210b21fZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidG9tdG9tX2kyc190eDEiLAorCQkuaWQgPSBBSUYxX0NBUCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzBfUkFURVMsCisJCQkuZm9ybWF0cyA9IFRPTVRPTV9GT1JNQVRTLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDQsCisJCX0sCisJCS5vcHMgPSAmdG9tdG9tX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRvbXRvbV9pMnNfcngyIiwKKwkJLmlkID0gQUlGMV9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gVE9NVE9NX0ZPUk1BVFMsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJfSwKKwkJLm9wcyA9ICZ0b210b21fZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidG9tdG9tX2kyc190eDIiLAorCQkuaWQgPSBBSUYxX0NBUCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMiBDYXB0dXJlIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzBfUkFURVMsCisJCQkuZm9ybWF0cyA9IFRPTVRPTV9GT1JNQVRTLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDQsCisJCX0sCisJCS5vcHMgPSAmdG9tdG9tX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAorCQkJCQkgIGJvb2wgdXApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCisJaWYgKHVwKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQkJcmV0ID0gd2NkOXh4eF9nZXRfc2xhdmVfcG9ydChjaC0+Y2hfbnVtKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogSW52YWxpZCBzbGF2ZSBwb3J0IElEOiAlZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2JpdChyZXQsICZkYWktPmNoX21hc2spOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRhaS0+ZGFpX3dhaXQsIChkYWktPmNoX21hc2sgPT0gMCksCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKAorCQkJCQkJVE9NVE9NX1NMSU1fQ0xPU0VfVElNRU9VVCkpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogU2xpbSBjbG9zZSB0eC9yeCB3YWl0IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRvbXRvbV9jb2RlY19lbmFibGVfaW50X3BvcnQoc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaSwKKwkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJaW50IHBvcnRfbnVtID0gMDsKKwl1bnNpZ25lZCBzaG9ydCByZWcgPSAwOworCXU4IHZhbCA9IDA7CisKKwlpZiAoIWRhaSB8fCAhY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNoLT5wb3J0ID49IFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUikgeworCQkJcG9ydF9udW0gPSBjaC0+cG9ydCAtIFRPTVRPTV9SWF9QT1JUX1NUQVJUX05VTUJFUjsKKwkJCXJlZyA9IFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyAocG9ydF9udW0gLyA4KTsKKwkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHdjZDl4eHgsCisJCQkJcmVnKTsKKwkJCWlmICghKHZhbCAmICgxIDw8IChwb3J0X251bSAlIDgpKSkpIHsKKwkJCQl2YWwgfD0gKDEgPDwgKHBvcnRfbnVtICUgOCkpOworCQkJCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSgKKwkJCQkJd2NkOXh4eCwgcmVnLCB2YWwpOworCQkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAorCQkJCQl3Y2Q5eHh4LCByZWcpOworCQkJfQorCQl9IGVsc2UgeworCQkJcG9ydF9udW0gPSBjaC0+cG9ydDsKKwkJCXJlZyA9IFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKyAocG9ydF9udW0gLyA4KTsKKwkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHdjZDl4eHgsCisJCQkJcmVnKTsKKwkJCWlmICghKHZhbCAmICgxIDw8IChwb3J0X251bSAlIDgpKSkpIHsKKwkJCQl2YWwgfD0gKDEgPDwgKHBvcnRfbnVtICUgOCkpOworCQkJCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAorCQkJCQlyZWcsIHZhbCk7CisJCQkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoCisJCQkJCXdjZDl4eHgsIHJlZyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltcngoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisKKwljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50IGNhbGxlZCEgY29kZWMgbmFtZSAlcyBudW1fZGFpICVkXG4iCisJCSJzdHJlYW0gbmFtZSAlcyBldmVudCAlZFxuIiwKKwkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSwKKwkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSwgZXZlbnQpOworCisJLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCisJaWYgKHRvbXRvbV9wLT5pbnRmX3R5cGUgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQlyZXR1cm4gMDsKKworCWRhaSA9ICZ0b210b21fcC0+ZGFpW3ctPnNoaWZ0XTsKKwlwcl9kZWJ1ZygiJXM6IHctPm5hbWUgJXMgdy0+c2hpZnQgJWQgZXZlbnQgJWRcbiIsCisJCSBfX2Z1bmNfXywgdy0+bmFtZSwgdy0+c2hpZnQsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOworCQl0b210b21fY29kZWNfZW5hYmxlX2ludF9wb3J0KGRhaSwgY29kZWMpOworCQkodm9pZCkgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIHRydWUpOworCQlyZXQgPSB3Y2Q5eHh4X2NmZ19zbGltX3NjaF9yeChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCSAgICAgIGRhaS0+cmF0ZSwgZGFpLT5iaXRfd2lkdGgsCisJCQkJCSAgICAgICZkYWktPmdycGgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF9yeChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQlkYWktPmdycGgpOworCQlpZiAoIWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkpCisJCQlyZXQgPSB0b210b21fY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgZmFsc2UpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiJXM6IGJ1cyBpbiByZWNvdmVyeSBza2lwIGVuYWJsZSBzbGltX2NobWFzayIsCisJCQkJX19mdW5jX18pOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoY29yZSwKKwkJCQkJCSAgICAgICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJCSAgICAgIGRhaS0+Z3JwaCk7CisJCQlwcl9kZWJ1ZygiJXM6IERpc2Nvbm5lY3QgUlggcG9ydCwgcmV0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCWludCBldmVudCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IE5VTEw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gTlVMTDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gTlVMTDsKKwl1MzIgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpID0gTlVMTDsKKworCWlmICghdykgeworCQlwcl9lcnIoIiVzIGludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwl0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCXByX2RlYnVnKCIlczogZXZlbnQgY2FsbGVkISBjb2RlYyBuYW1lICVzIG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCisJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm5hbWUsCisJCWNvZGVjLT5jb21wb25lbnQubnVtX2RhaSwgdy0+c25hbWUpOworCisJLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCisJaWYgKHRvbXRvbV9wLT5pbnRmX3R5cGUgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKSB7CisJCXByX2VycigiJXMgSW50ZXJmYWNlIGlzIG5vdCBjb3JyZWN0IiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygiJXMoKTogdy0+bmFtZSAlcyBldmVudCAlZCB3LT5zaGlmdCAlZFxuIiwKKwkJX19mdW5jX18sIHctPm5hbWUsIGV2ZW50LCB3LT5zaGlmdCk7CisJaWYgKHctPnNoaWZ0ICE9IEFJRjRfVklGRUVEKSB7CisJCXByX2VycigiJXMgRXJyb3IgaW4gZW5hYmxpbmcgdGhlIHR4IHBhdGhcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdmk7CisJfQorCWRhaSA9ICZ0b210b21fcC0+ZGFpW3ctPnNoaWZ0XTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qRW5hYmxlIFYmSSBzZW5zaW5nKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfU1BLUjFfUFJPVF9FTiwKKwkJCQkweDg4LCAweDg4KTsKKwkJLypFbmFibGUgc3BrciBWSSBjbG9ja3MqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQlUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMl9DVEwsIDB4QywgMHhDKTsKKwkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOworCQl0b210b21fY29kZWNfZW5hYmxlX2ludF9wb3J0KGRhaSwgY29kZWMpOworCQkodm9pZCkgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIHRydWUpOworCQlyZXQgPSB3Y2Q5eHh4X2NmZ19zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCWRhaS0+cmF0ZSwgZGFpLT5iaXRfd2lkdGgsCisJCQkJCSZkYWktPmdycGgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQlkYWktPmdycGgpOworCQlpZiAocmV0KQorCQkJcHJfZXJyKCIlcyBlcnJvciBpbiBjbG9zZV9zbGltX3NjaF90eCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJaWYgKCFkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5KQorCQkJcmV0ID0gdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsCisJCQkJJmRhaS0+d2NkOXh4eF9jaF9saXN0LAorCQkJCWRhaS0+Z3JwaCk7CisJCQlwcl9kZWJ1ZygiJXM6IERpc2Nvbm5lY3QgVFggcG9ydCwgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCX0KKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMl9DVEwsCisJCQkJMHhDLCAweDApOworCQkvKkRpc2FibGUgViZJIHNlbnNpbmcqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9TUEtSMV9QUk9UX0VOLAorCQkJCTB4ODgsIDB4MDApOworCQlicmVhazsKKwl9CitvdXRfdmk6CisJcmV0dXJuIHJldDsKK30KKworLyogX190b210b21fY29kZWNfZW5hYmxlX3NsaW10eDogRW5hYmxlIHRoZSBzbGltYnVzIHNsYXZlIHBvcnQKKyAqCQkJCSBmb3IgVFggcGF0aAorICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjIGZvciB3aGljaCB0aGUgc2xhdmUgcG9ydCBpcyB0byBiZQorICoJICAgZW5hYmxlZC4KKyAqIEBkYWlfZGF0YTogVGhlIGRhaSBzcGVjaWZpYyBkYXRhIGZvciBkYWkgd2hpY2ggaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIGludCBfX3RvbXRvbV9jb2RlY19lbmFibGVfc2xpbXR4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJaW50IGV2ZW50LCBzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpX2RhdGEpCit7CisJc3RydWN0IHdjZDl4eHggKmNvcmU7CisJaW50IHJldCA9IDA7CisKKwljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWRhaV9kYXRhLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOworCQl0b210b21fY29kZWNfZW5hYmxlX2ludF9wb3J0KGRhaV9kYXRhLCBjb2RlYyk7CisJCSh2b2lkKSB0b210b21fY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaV9kYXRhLCB0cnVlKTsKKwkJcmV0ID0gd2NkOXh4eF9jZmdfc2xpbV9zY2hfdHgoY29yZSwgJmRhaV9kYXRhLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCSAgICAgIGRhaV9kYXRhLT5yYXRlLAorCQkJCQkgICAgICBkYWlfZGF0YS0+Yml0X3dpZHRoLAorCQkJCQkgICAgICAmZGFpX2RhdGEtPmdycGgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eChjb3JlLAorCQkJCQkJJmRhaV9kYXRhLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQlkYWlfZGF0YS0+Z3JwaCk7CisJCWlmICghZGFpX2RhdGEtPmJ1c19kb3duX2luX3JlY292ZXJ5KQorCQkJcmV0ID0gdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWlfZGF0YSwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoY29yZSwKKwkJCQkJJmRhaV9kYXRhLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCWRhaV9kYXRhLT5ncnBoKTsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6IERpc2Nvbm5lY3QgVFggcG9ydCwgcmV0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0b210b21fY29kZWNfZW5hYmxlX3NsaW10eF9tYWQ6IENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkCisgKgl0byBzZXR1cCB0aGUgc2xhdmUgcG9ydCBmb3IgTUFELgorICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjCisgKiBAZXZlbnQ6IEluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzbGF2ZSBwb3J0CisgKi8KK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltdHhfbWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICB1OCBldmVudCkKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKKwlpbnQgZGFwbV9ldmVudCA9IFNORF9TT0NfREFQTV9QT1NUX1BNVTsKKworCWRhaSA9ICZ0b210b21fcC0+ZGFpW0FJRjRfTUFEX1RYXTsKKworCWlmIChldmVudCA9PSAwKQorCQlkYXBtX2V2ZW50ID0gU05EX1NPQ19EQVBNX1BPU1RfUE1EOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IG1hZF9jaGFubmVsLCBldmVudCA9IDB4JXhcbiIsCisJCSBfX2Z1bmNfXywgZXZlbnQpOworCXJldHVybiBfX3RvbXRvbV9jb2RlY19lbmFibGVfc2xpbXR4KGNvZGVjLCBkYXBtX2V2ZW50LCBkYWkpOworfQorCisvKgorICogdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltdHg6IERBUE0gd2lkZ2V0IGFsbGJhY2sgZm9yIFRYIHdpZGdldHMKKyAqIEB3OiB3aWRnZXQgZm9yIHdoaWNoIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZAorICogQGtjb250cm9sOiBrY29udHJvbCBhc3NvY2lhdGVkIHdpdGggdGhpcyB3aWRnZXQKKyAqIEBldmVudDogREFQTSBzdXBwbGllZCBldmVudCBpbmRpY2F0aW5nIGVuYWJsZS9kaXNhYmxlCisgKi8KK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltdHgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b21fcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgY2FsbGVkISBjb2RlYyBuYW1lICVzIG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCisJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm5hbWUsCisJCWNvZGVjLT5jb21wb25lbnQubnVtX2RhaSwgdy0+c25hbWUpOworCisJLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCisJaWYgKHRvbXRvbV9wLT5pbnRmX3R5cGUgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwKKwkJIiVzKCk6IHctPm5hbWUgJXMgZXZlbnQgJWQgdy0+c2hpZnQgJWRcbiIsCisJCV9fZnVuY19fLCB3LT5uYW1lLCBldmVudCwgdy0+c2hpZnQpOworCisJZGFpID0gJnRvbXRvbV9wLT5kYWlbdy0+c2hpZnRdOworCXJldHVybiBfX3RvbXRvbV9jb2RlY19lbmFibGVfc2xpbXR4KGNvZGVjLCBldmVudCwgZGFpKTsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2Vhcl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXdjZDl4eHhfY2xzaF9mc20oY29kZWMsICZ0b210b21fcC0+Y2xzaF9kLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9TVEFURV9FQVIsCisJCQkJCQkgV0NEOVhYWF9DTFNIX1JFUV9FTkFCTEUsCisJCQkJCQkgV0NEOVhYWF9DTFNIX0VWRU5UX1BPU1RfUEEpOworCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY19lYXJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2RlYnVnKCIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl3Y2Q5eHh4X2Nsc2hfZnNtKGNvZGVjLCAmdG9tdG9tX3AtPmNsc2hfZCwKKwkJCQkJCSBXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9SRVFfRU5BQkxFLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9FVkVOVF9QUkVfREFDKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdjZDl4eHhfY2xzaF9mc20oY29kZWMsICZ0b210b21fcC0+Y2xzaF9kLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9TVEFURV9FQVIsCisJCQkJCQkgV0NEOVhYWF9DTFNIX1JFUV9ESVNBQkxFLAorCQkJCQkJIFdDRDlYWFhfQ0xTSF9FVkVOVF9QT1NUX1BBKTsKKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX3NldF9paXJfZ2FpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVTogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJaWYgKHN0cm5zdHIody0+bmFtZSwgIklJUjEiLCBzaXplb2YoIklJUjEiKSkpIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjFfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMV9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjJfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CMl9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjNfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CM19DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIxX0dBSU5fQjRfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjFfR0FJTl9CNF9DVEwpKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjFfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMV9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjJfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CMl9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjNfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CM19DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0NEQ19JSVIyX0dBSU5fQjRfQ1RMLAorCQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgVE9NVE9NX0FfQ0RDX0lJUjJfR0FJTl9CNF9DVEwpKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NvZGVjX2RzbV9tdXhfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJdTggcmVnX3ZhbCwgem9oX211eF92YWwgPSAweDAwOworCisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBUT01UT01fQV9DRENfQ09OTl9DTFNIX0NUTCk7CisKKwkJaWYgKChyZWdfdmFsICYgMHgzMCkgPT0gMHgxMCkKKwkJCXpvaF9tdXhfdmFsID0gMHgwNDsKKwkJZWxzZSBpZiAoKHJlZ192YWwgJiAweDMwKSA9PSAweDIwKQorCQkJem9oX211eF92YWwgPSAweDA4OworCisJCWlmICh6b2hfbXV4X3ZhbCAhPSAweDAwKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVEwsCisJCQkJCTB4MEMsIHpvaF9tdXhfdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0RDX0NPTk5fQ0xTSF9DVEwsCisJCQkJCQkJMHgwQywgMHgwMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZW5hYmxlX2FuY19lYXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gdG9tdG9tX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJbXNsZWVwKDUwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUlhfRUFSX0VOLCAweDEwLCAweDEwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXJldCA9IHRvbXRvbV9jb2RlY19lbmFibGVfZWFyX3BhKHcsIGtjb250cm9sLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0VBUl9FTiwgMHgxMCwgMHgwMCk7CisJCW1zbGVlcCg0MCk7CisJCXJldCB8PSB0b210b21fY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gdG9tdG9tX2NvZGVjX2VuYWJsZV9lYXJfcGEodywga2NvbnRyb2wsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFRvZG86IEhhdmUgc2VwYXJhdGUgZGFwbSB3aWRnZXRzIGZvciBJMlMgYW5kIFNsaW1idXMuCisgKiBNaWdodCBOZWVkIHRvIGhhdmUgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb25seSBmb3Igc2xpbWJ1cworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdG9tdG9tX2RhcG1fd2lkZ2V0c1tdID0geworCS8qUlggc3R1ZmYgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJFQVIiKSwKKworCVNORF9TT0NfREFQTV9QR0FfRSgiRUFSIFBBIiwgVE9NVE9NX0FfUlhfRUFSX0VOLCA0LCAwLCBOVUxMLCAwLAorCQkJdG9tdG9tX2NvZGVjX2VuYWJsZV9lYXJfcGEsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiREFDMSIsIFRPTVRPTV9BX1JYX0VBUl9FTiwgNiwgMCwgZGFjMV9zd2l0Y2gsCisJCUFSUkFZX1NJWkUoZGFjMV9zd2l0Y2gpLCB0b210b21fY29kZWNfZWFyX2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYxIFBCIiwgIkFJRjEgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sCisJCQkJQUlGMV9QQiwgMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltcngsCisJCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjIgUEIiLCAiQUlGMiBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJCQlBSUYyX1BCLCAwLCB0b210b21fY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGMyBQQiIsICJBSUYzIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAorCQkJCUFJRjNfUEIsIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfc2xpbXJ4LAorCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMSBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDEsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDFdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMiBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDIsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDJdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMyBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDMsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDNdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNCBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDQsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDRdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNSBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDUsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDVdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNiBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDYsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDZdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNyBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDcsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDddKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYOCBNVVgiLCBTTkRfU09DX05PUE0sIFRPTVRPTV9SWDgsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RPTVRPTV9SWDhdKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDQiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDUiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDYiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDciLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBSWDgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogSGVhZHBob25lICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSEVBRFBIT05FIiksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhMIiwgVE9NVE9NX0FfUlhfSFBIX0NOUF9FTiwgNSwgMCwgTlVMTCwgMCwKKwkJdG9tdG9tX2hwaF9wYV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIkhQSEwgREFDIiwgVE9NVE9NX0FfUlhfSFBIX0xfREFDX0NUTCwgNywgMCwKKwkJaHBobF9zd2l0Y2gsIEFSUkFZX1NJWkUoaHBobF9zd2l0Y2gpLCB0b210b21faHBobF9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhSIiwgVE9NVE9NX0FfUlhfSFBIX0NOUF9FTiwgNCwgMCwgTlVMTCwgMCwKKwkJdG9tdG9tX2hwaF9wYV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIkhQSFIgREFDIiwgTlVMTCwgVE9NVE9NX0FfUlhfSFBIX1JfREFDX0NUTCwgNywgMCwKKwkJdG9tdG9tX2hwaHJfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCS8qIFNwZWFrZXIgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQyIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTElORU9VVDMiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUNCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS19PVVQiKSwKKworCVNORF9TT0NfREFQTV9QR0FfRSgiTElORU9VVDEgUEEiLCBUT01UT01fQV9SWF9MSU5FX0NOUF9FTiwgMCwgMCwgTlVMTCwKKwkJCTAsIHRvbXRvbV9jb2RlY19lbmFibGVfbGluZW91dCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQyIFBBIiwgVE9NVE9NX0FfUlhfTElORV9DTlBfRU4sIDEsIDAsIE5VTEwsCisJCQkwLCB0b210b21fY29kZWNfZW5hYmxlX2xpbmVvdXQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJMSU5FT1VUMyBQQSIsIFRPTVRPTV9BX1JYX0xJTkVfQ05QX0VOLCAyLCAwLCBOVUxMLAorCQkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9saW5lb3V0LCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiTElORU9VVDQgUEEiLCBUT01UT01fQV9SWF9MSU5FX0NOUF9FTiwgMywgMCwgTlVMTCwKKwkJCTAsIHRvbXRvbV9jb2RlY19lbmFibGVfbGluZW91dCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIlNQSyBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwKKwkJCSAgIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfc3BrX3BhLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiU1BLMiBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwKKwkJCSAgIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfc3BrX3BhLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0RBQ19FKCJMSU5FT1VUMSBEQUMiLCBOVUxMLCBUT01UT01fQV9SWF9MSU5FXzFfREFDX0NUTCwgNywKKwkJMCwgdG9tdG9tX2xpbmVvdXRfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJMSU5FT1VUMiBEQUMiLCBOVUxMLCBUT01UT01fQV9SWF9MSU5FXzJfREFDX0NUTCwgNywKKwkJMCwgdG9tdG9tX2xpbmVvdXRfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJMSU5FT1VUMyBEQUMiLCBOVUxMLCBUT01UT01fQV9SWF9MSU5FXzNfREFDX0NUTCwgNywKKwkJMCwgdG9tdG9tX2xpbmVvdXRfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTElORU9VVDMgREFDIEdST1VORCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmbGluZW91dDNfZ3JvdW5kX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJMSU5FT1VUNCBEQUMiLCBOVUxMLCBUT01UT01fQV9SWF9MSU5FXzRfREFDX0NUTCwgNywKKwkJMCwgdG9tdG9tX2xpbmVvdXRfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTElORU9VVDQgREFDIEdST1VORCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmbGluZW91dDRfZ3JvdW5kX3N3aXRjaCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIlNQSyBEQUMiLCBOVUxMLCBUT01UT01fQV9DRENfQk9PU1RfVFJHUl9FTiwgMCwgMCwKKwkJCSAgIHRvbXRvbV9zcGtfZGFjX2V2ZW50LAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9EQUNfRSgiU1BLMiBEQUMiLCBOVUxMLCBUT01UT01fQV9DRENfQk9PU1RfVFJHUl9FTiwgMSwgMCwKKwkJCSAgIHRvbXRvbV9zcGtfZGFjX2V2ZW50LAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiVkREX1NQS0RSViIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICB0b210b21fY29kZWNfZW5hYmxlX3ZkZF9zcGtyLAorCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIlZERF9TUEtEUlYyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgIHRvbXRvbV9jb2RlY19lbmFibGVfdmRkX3Nwa3IyLAorCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiUlgxIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlgyIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlg3IE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWDEgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWDIgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlgzIE1JWDEiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgMiwgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlg0IE1JWDEiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgMywgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlg1IE1JWDEiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgNCwgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlg2IE1JWDEiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgNSwgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlg3IE1JWDIiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgNiwgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlg4IE1JWDEiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgNywgMCwgTlVMTCwKKwkJMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiUlgxIElOVEVSUCIsIFRPTVRPTV9BX0NEQ19DTEtfUlhfQjFfQ1RMLCAwLCAwLAorCQkJJnJ4MV9pbnRlcnBfbXV4LCB0b210b21fY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYMiBJTlRFUlAiLCBUT01UT01fQV9DRENfQ0xLX1JYX0IxX0NUTCwgMSwgMCwKKwkJCSZyeDJfaW50ZXJwX211eCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKworCVNORF9TT0NfREFQTV9NSVhFUigiUlgxIENIQUlOIiwgVE9NVE9NX0FfQ0RDX1JYMV9CNl9DVEwsIDUsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlgyIENIQUlOIiwgVE9NVE9NX0FfQ0RDX1JYMl9CNl9DVEwsIDUsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01VWCgiUlgxIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X21peDFfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9taXgxX2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDEgTUlYMSBJTlAzIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4MV9pbnAzX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlgyIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4Ml9taXgxX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDIgTUlYMSBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcngyX21peDFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMyBNSVgxIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDNfbWl4MV9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlgzIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4M19taXgxX2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDQgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcng0X21peDFfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYNCBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDRfbWl4MV9pbnAyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlg1IE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4NV9taXgxX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDUgTUlYMSBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcng1X21peDFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYNiBNSVgxIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDZfbWl4MV9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlg2IE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4Nl9taXgxX2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDcgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcng3X21peDFfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYNyBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDdfbWl4MV9pbnAyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlg4IE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4OF9taXgxX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDggTUlYMSBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcng4X21peDFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMSBNSVgyIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDFfbWl4Ml9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlgxIE1JWDIgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4MV9taXgyX2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDIgTUlYMiBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcngyX21peDJfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYMiBNSVgyIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeDJfbWl4Ml9pbnAyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlg3IE1JWDIgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4N19taXgyX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWDcgTUlYMiBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcng3X21peDJfaW5wMl9tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWCgiUkRBQzUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfZGFjNV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJEQUM3IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2RhYzdfbXV4KSwKKworCVNORF9TT0NfREFQTV9NVVgoIk1BRF9TRUwgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmbWFkX3NlbF9tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJDTEFTU19IX0RTTSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZjbGFzc19oX2RzbV9tdXgsIHRvbXRvbV9jb2RlY19kc21fbXV4X2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUlhfQklBUyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdG9tdG9tX2NvZGVjX2VuYWJsZV9yeF9iaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJDRENfSTJTX1JYX0NPTk4iLCBXQ0Q5WFhYX0FfQ0RDX0NMS19PVEhSX0NUTCwgNSwgMCwKKwkJCSAgICBOVUxMLCAwKSwKKworCS8qIFRYICovCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJDRENfQ09OTiIsIFdDRDlYWFhfQV9DRENfQ0xLX09USFJfQ1RMLCAyLCAwLCBOVUxMLAorCQkwKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxET19IIiwgU05EX1NPQ19OT1BNLCA3LCAwLAorCQkJICAgIHRvbXRvbV9jb2RlY19lbmFibGVfbGRvX2gsCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCS8qCisJICogREFQTSAnTERPX0ggU3RhbmRhbG9uZScgaXMgdG8gYmUgcG93ZXJlZCBieSBtYmhjIGRyaXZlciBhZnRlcgorCSAqIGFjcXVyaW5nIGNvZGVjX3Jlc291cmNlIGxvY2suCisJICogU28gY2FsbCBfX3RvbXRvbV9jb2RlY19lbmFibGVfbGRvX2ggaW5zdGVhZCBhbmQgYXZvaWQgZGVhZGxvY2suCisJICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPX0ggU3RhbmRhbG9uZSIsIFNORF9TT0NfTk9QTSwgNywgMCwKKwkJCSAgICBfX3RvbXRvbV9jb2RlY19lbmFibGVfbGRvX2gsCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQ09NUDBfQ0xLIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0b210b21fY29uZmlnX2NvbXBhbmRlciwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkNPTVAxX0NMSyIsIFNORF9TT0NfTk9QTSwgMSwgMCwKKwkJdG9tdG9tX2NvbmZpZ19jb21wYW5kZXIsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkNPTVAyX0NMSyIsIFNORF9TT0NfTk9QTSwgMiwgMCwKKwkJdG9tdG9tX2NvbmZpZ19jb21wYW5kZXIsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMxIiksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMxIEV4dGVybmFsIiwgU05EX1NPQ19OT1BNLCA3LCAwLAorCQkJICAgICAgIHRvbXRvbV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzEgSW50ZXJuYWwxIiwgU05EX1NPQ19OT1BNLCA3LCAwLAorCQkJICAgICAgIHRvbXRvbV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzEgSW50ZXJuYWwyIiwgU05EX1NPQ19OT1BNLCA3LCAwLAorCQkJICAgICAgIHRvbXRvbV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzMiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzQiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzUiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzYiKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDMSBNVVgiLCBUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDAsIDAsCisJCSZkZWMxX211eCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJERUMyIE1VWCIsIFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgMSwgMCwKKwkJJmRlYzJfbXV4LCB0b210b21fY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzMgTVVYIiwgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCAyLCAwLAorCQkmZGVjM19tdXgsIHRvbXRvbV9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDNCBNVVgiLCBUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDMsIDAsCisJCSZkZWM0X211eCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJERUM1IE1VWCIsIFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgNCwgMCwKKwkJJmRlYzVfbXV4LCB0b210b21fY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzYgTVVYIiwgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCA1LCAwLAorCQkmZGVjNl9tdXgsIHRvbXRvbV9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDNyBNVVgiLCBUT01UT01fQV9DRENfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDYsIDAsCisJCSZkZWM3X211eCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJERUM4IE1VWCIsIFRPTVRPTV9BX0NEQ19DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgNywgMCwKKwkJJmRlYzhfbXV4LCB0b210b21fY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzkgTVVYIiwgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMLCAwLCAwLAorCQkmZGVjOV9tdXgsIHRvbXRvbV9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiREVDMTAgTVVYIiwgVE9NVE9NX0FfQ0RDX0NMS19UWF9DTEtfRU5fQjJfQ1RMLCAxLCAwLAorCQkmZGVjMTBfbXV4LCB0b210b21fY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJBTkMxIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmFuYzFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTkMyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmFuYzJfbXV4KSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBIRUFEUEhPTkUiKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBIUEhMIiwgU05EX1NPQ19OT1BNLCA1LCAwLCBOVUxMLCAwLAorCQl0b210b21fY29kZWNfZW5hYmxlX2FuY19ocGgsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIEhQSFIiLCBTTkRfU09DX05PUE0sIDQsIDAsIE5VTEwsIDAsCisJCXRvbXRvbV9jb2RlY19lbmFibGVfYW5jX2hwaCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU5DIEVBUiIpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIEVBUiBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKKwkJdG9tdG9tX2NvZGVjX2VuYWJsZV9hbmNfZWFyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTkMxIEZCIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmFuYzFfZmJfbXV4KSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzIiKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKERBUE1fTUlDQklBUzJfRVhURVJOQUxfU1RBTkRBTE9ORSwgU05EX1NPQ19OT1BNLAorCQkJICAgICAgIDcsIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzIgRXh0ZXJuYWwiLCBTTkRfU09DX05PUE0sIDcsIDAsCisJCQkgICAgICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiBJbnRlcm5hbDEiLCBTTkRfU09DX05PUE0sIDcsIDAsCisJCQkgICAgICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiBJbnRlcm5hbDIiLCBTTkRfU09DX05PUE0sIDcsIDAsCisJCQkgICAgICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiBJbnRlcm5hbDMiLCBTTkRfU09DX05PUE0sIDcsIDAsCisJCQkgICAgICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMyBFeHRlcm5hbCIsIFNORF9TT0NfTk9QTSwgNywgMCwKKwkJCSAgICAgICB0b210b21fY29kZWNfZW5hYmxlX21pY2JpYXMsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMzIEludGVybmFsMSIsIFNORF9TT0NfTk9QTSwgNywgMCwKKwkJCSAgICAgICB0b210b21fY29kZWNfZW5hYmxlX21pY2JpYXMsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMzIEludGVybmFsMiIsIFNORF9TT0NfTk9QTSwgNywgMCwKKwkJCSAgICAgICB0b210b21fY29kZWNfZW5hYmxlX21pY2JpYXMsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVM0IEV4dGVybmFsIiwgU05EX1NPQ19OT1BNLCA3LAorCQkJICAgICAgIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjEgQ0FQIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGMV9DQVAsIDAsIHRvbXRvbV9jb2RlY19lbmFibGVfc2xpbXR4LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMiBDQVAiLCAiQUlGMiBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAorCQlBSUYyX0NBUCwgMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltdHgsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUYzIENBUCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCisJCUFJRjNfQ0FQLCAwLCB0b210b21fY29kZWNfZW5hYmxlX3NsaW10eCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjQgVkkiLCAiVklmZWVkIiwgMCwgU05EX1NPQ19OT1BNLAorCQlBSUY0X1ZJRkVFRCwgMCwgdG9tdG9tX2NvZGVjX2VuYWJsZV9zbGltdmlfZmVlZGJhY2ssCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGNCBNQUQiLCAiQUlGNCBNQUQgVFgiLCAwLAorCQkJICAgICAgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0b210b21fY29kZWNfZW5hYmxlX21hZCwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTUFET05PRkYiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpZjRfbWFkX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNQURJTlBVVCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUFEX0NQRV9JTlBVVCIpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUYxX0NBUCBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGMV9DQVAsIDAsCisJCWFpZjFfY2FwX21peGVyLCBBUlJBWV9TSVpFKGFpZjFfY2FwX21peGVyKSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjJfQ0FQIE1peGVyIiwgU05EX1NPQ19OT1BNLCBBSUYyX0NBUCwgMCwKKwkJYWlmMl9jYXBfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmMl9jYXBfbWl4ZXIpKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiQUlGM19DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjNfQ0FQLCAwLAorCQlhaWYzX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYzX2NhcF9taXhlcikpLAorCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgxLCAwLAorCQkmc2JfdHgxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDIgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgyLCAwLAorCQkmc2JfdHgyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDMgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFgzLCAwLAorCQkmc2JfdHgzX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDQgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg0LCAwLAorCQkmc2JfdHg0X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDUgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg1LCAwLAorCQkmc2JfdHg1X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDYgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg2LCAwLAorCQkmc2JfdHg2X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDcgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg3LCAwLAorCQkmc2JfdHg3X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDggTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg4LCAwLAorCQkmc2JfdHg4X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDkgTVVYIiwgU05EX1NPQ19OT1BNLCBUT01UT01fVFg5LCAwLAorCQkmc2JfdHg5X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEwIE1VWCIsIFNORF9TT0NfTk9QTSwgVE9NVE9NX1RYMTAsIDAsCisJCSZzYl90eDEwX211eCksCisKKwkvKiBEaWdpdGFsIE1pYyBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMxIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0b210b21fY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzIiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRvbXRvbV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMyIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdG9tdG9tX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUM0IiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0b210b21fY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzUiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRvbXRvbV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzYiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRvbXRvbV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogU2lkZXRvbmUgKi8KKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnAxX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnAyX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnAzX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDQgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnA0X211eCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiSUlSMSIsIFRPTVRPTV9BX0NEQ19DTEtfU0RfQ1RMLCAwLCAwLCBOVUxMLCAwLAorCQl0b210b21fY29kZWNfc2V0X2lpcl9nYWluLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIyIElOUDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMl9pbnAxX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIyIElOUDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMl9pbnAyX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIyIElOUDMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMl9pbnAzX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIyIElOUDQgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMl9pbnA0X211eCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiSUlSMiIsIFRPTVRPTV9BX0NEQ19DTEtfU0RfQ1RMLCAxLCAwLCBOVUxMLCAwLAorCQl0b210b21fY29kZWNfc2V0X2lpcl9nYWluLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwkvKiBBVVggUEdBICovCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBVVhfUEdBX0xlZnQiLCBOVUxMLCBUT01UT01fQV9SWF9BVVhfU1dfQ1RMLCA3LCAwLAorCQl0b210b21fY29kZWNfZW5hYmxlX2F1eF9wZ2EsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiQVVYX1BHQV9SaWdodCIsIE5VTEwsIFRPTVRPTV9BX1JYX0FVWF9TV19DVEwsIDYsIDAsCisJCXRvbXRvbV9jb2RlY19lbmFibGVfYXV4X3BnYSwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogTGluZW91dCwgZWFyIGFuZCBIUEggUEEgTWl4ZXJzICovCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkVBUl9QQV9NSVhFUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJZWFyX3BhX21peCwgQVJSQVlfU0laRShlYXJfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkhQSExfUEFfTUlYRVIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWhwaGxfcGFfbWl4LCBBUlJBWV9TSVpFKGhwaGxfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkhQSFJfUEFfTUlYRVIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWhwaHJfcGFfbWl4LCBBUlJBWV9TSVpFKGhwaHJfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxJTkVPVVQxX1BBX01JWEVSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlsaW5lb3V0MV9wYV9taXgsIEFSUkFZX1NJWkUobGluZW91dDFfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxJTkVPVVQyX1BBX01JWEVSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlsaW5lb3V0Ml9wYV9taXgsIEFSUkFZX1NJWkUobGluZW91dDJfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxJTkVPVVQzX1BBX01JWEVSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlsaW5lb3V0M19wYV9taXgsIEFSUkFZX1NJWkUobGluZW91dDNfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkxJTkVPVVQ0X1BBX01JWEVSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlsaW5lb3V0NF9wYV9taXgsIEFSUkFZX1NJWkUobGluZW91dDRfcGFfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJWSU9OT0ZGIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICZhaWY0X3ZpX3N3aXRjaCksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlZJSU5QVVQiKSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0b210b21fc2xpbWJ1c19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSAwOworCWludCBpLCBqLCBwb3J0X2lkLCBrOworCXUzMiBiaXQ7CisJdTggdmFsLCBpbnRfdmFsID0gMDsKKwlib29sIHR4LCBjbGVhcmVkOworCXVuc2lnbmVkIHNob3J0IHJlZyA9IDA7CisKKwlmb3IgKGkgPSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzAsIGogPSAwOworCSAgICAgaSA8PSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzE7IGkrKywgaisrKSB7CisJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHdjZDl4eHgsIGkpOworCQlzdGF0dXMgfD0gKCh1MzIpdmFsIDw8ICg4ICogaikpOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaiwgJnN0YXR1cywgMzIpIHsKKwkJdHggPSAoaiA+PSAxNiA/IHRydWUgOiBmYWxzZSk7CisJCXBvcnRfaWQgPSAodHggPyBqIC0gMTYgOiBqKTsKKwkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQod2NkOXh4eCwKKwkJCQlUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfUlhfU09VUkNFMCArIGopOworCQlpZiAodmFsKSB7CisJCQlpZiAoIXR4KQorCQkJCXJlZyA9IFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKworCQkJCQkocG9ydF9pZCAvIDgpOworCQkJZWxzZQorCQkJCXJlZyA9IFRPTVRPTV9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKworCQkJCQkocG9ydF9pZCAvIDgpOworCQkJaW50X3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAorCQkJCXdjZDl4eHgsIHJlZyk7CisJCQkvKgorCQkJICogSWdub3JlIGludGVycnVwdHMgZm9yIHBvcnRzIGZvciB3aGljaCB0aGUKKwkJCSAqIGludGVycnVwdHMgYXJlIG5vdCBzcGVjaWZpY2FsbHkgZW5hYmxlZC4KKwkJCSAqLworCQkJaWYgKCEoaW50X3ZhbCAmICgxIDw8IChwb3J0X2lkICUgOCkpKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAodmFsICYgVE9NVE9NX1NMSU1fSVJRX09WRVJGTE9XKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKAorCQkJICAgIiVzOiBvdmVyZmxvdyBlcnJvciBvbiAlcyBwb3J0ICVkLCB2YWx1ZSAleFxuIiwKKwkJCSAgIF9fZnVuY19fLCAodHggPyAiVFgiIDogIlJYIiksIHBvcnRfaWQsIHZhbCk7CisJCWlmICh2YWwgJiBUT01UT01fU0xJTV9JUlFfVU5ERVJGTE9XKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKAorCQkJICAgIiVzOiB1bmRlcmZsb3cgZXJyb3Igb24gJXMgcG9ydCAlZCwgdmFsdWUgJXhcbiIsCisJCQkgICBfX2Z1bmNfXywgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkLCB2YWwpOworCQlpZiAoKHZhbCAmIFRPTVRPTV9TTElNX0lSUV9PVkVSRkxPVykgfHwKKwkJCSh2YWwgJiBUT01UT01fU0xJTV9JUlFfVU5ERVJGTE9XKSkgeworCQkJaWYgKCF0eCkKKwkJCQlyZWcgPSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWVsc2UKKwkJCQlyZWcgPSBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWludF92YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh3Y2Q5eHh4LCByZWcpOworCQkJaWYgKGludF92YWwgJiAoMSA8PCAocG9ydF9pZCAlIDgpKSkgeworCQkJCWludF92YWwgPSBpbnRfdmFsIF4gKDEgPDwgKHBvcnRfaWQgJSA4KSk7CisJCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHdjZDl4eHgsIHJlZywKKwkJCQkJCQkgICAgaW50X3ZhbCk7CisJCQl9CisJCX0KKwkJaWYgKHZhbCAmIFRPTVRPTV9TTElNX0lSUV9QT1JUX0NMT1NFRCkgeworCQkJLyoKKwkJCSAqIElOVCBTT1VSQ0UgcmVnaXN0ZXIgc3RhcnRzIGZyb20gUlggdG8gVFgKKwkJCSAqIGJ1dCBwb3J0IG51bWJlciBpbiB0aGUgY2hfbWFzayBpcyBpbiBvcHBvc2l0ZSB3YXkKKwkJCSAqLworCQkJYml0ID0gKHR4ID8gaiAtIDE2IDogaiArIDE2KTsKKwkJCXByX2RlYnVnKCIlczogJXMgcG9ydCAlZCBjbG9zZWQgdmFsdWUgJXgsIGJpdCAldVxuIiwKKwkJCQkgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsLAorCQkJCSBiaXQpOworCQkJZm9yIChrID0gMCwgY2xlYXJlZCA9IGZhbHNlOyBrIDwgTlVNX0NPREVDX0RBSVM7IGsrKykgeworCQkJCXByX2RlYnVnKCIlczogcHJpdi0+ZGFpWyVkXS5jaF9tYXNrID0gMHglbHhcbiIsCisJCQkJCSBfX2Z1bmNfXywgaywgcHJpdi0+ZGFpW2tdLmNoX21hc2spOworCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoYml0LAorCQkJCQkJICAgICAgICZwcml2LT5kYWlba10uY2hfbWFzaykpIHsKKwkJCQkJY2xlYXJlZCA9IHRydWU7CisJCQkJCWlmICghcHJpdi0+ZGFpW2tdLmNoX21hc2spCisJCQkJCQl3YWtlX3VwKCZwcml2LT5kYWlba10uZGFpX3dhaXQpOworCQkJCQkvKgorCQkJCQkgKiBUaGVyZSBhcmUgY2FzZXMgd2hlbiBtdWx0aXBsZSBEQUlzCisJCQkJCSAqIG1pZ2h0IGJlIHVzaW5nIHRoZSBzYW1lIHNsaW1idXMKKwkJCQkJICogY2hhbm5lbC4gSGVuY2UgZG9uJ3QgYnJlYWsgaGVyZS4KKwkJCQkJICovCisJCQkJfQorCQkJfQorCQkJV0FSTighY2xlYXJlZCwKKwkJCSAgICAgIkNvdWxkbid0IGZpbmQgc2xpbWJ1cyAlcyBwb3J0ICVkIGZvciBjbG9zaW5nXG4iLAorCQkJICAgICAodHggPyAiVFgiIDogIlJYIiksIHBvcnRfaWQpOworCQl9CisJCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAorCQkJCQkgICAgVE9NVE9NX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9SWF8wICsKKwkJCQkJICAgIChqIC8gOCksCisJCQkJCSAgICAxIDw8IChqICUgOCkpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0b210b21faGFuZGxlX3BkYXRhKHN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRvbXRvbS0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gdG9tdG9tLT5yZXNtZ3IucGRhdGE7CisJaW50IGsxLCBrMiwgazMsIGRlYywgcmMgPSAwOworCXU4IGxlZ19tb2RlLCB0eGZlX2J5cGFzcywgdHhmZV9idWZmLCBmbGFnOworCXU4IGkgPSAwLCBqID0gMDsKKwl1OCB2YWxfdHhmZSA9IDAsIHZhbHVlID0gMDsKKwl1OCBkbWljX2N0bF92YWwsIG1hZF9kbWljX2N0bF92YWw7CisJdTggYW5jX2N0bF92YWx1ZSA9IDA7CisJdTMyIGRlZl9kbWljX3JhdGU7CisJdTE2IHR4X2RtaWNfY3RsX3JlZzsKKworCWlmICghcGRhdGEpIHsKKwkJcHJfZXJyKCIlczogTlVMTCBwZGF0YVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsZWdfbW9kZSA9IHBkYXRhLT5hbWljX3NldHRpbmdzLmxlZ2FjeV9tb2RlOworCXR4ZmVfYnlwYXNzID0gcGRhdGEtPmFtaWNfc2V0dGluZ3MudHhmZV9lbmFibGU7CisJdHhmZV9idWZmID0gcGRhdGEtPmFtaWNfc2V0dGluZ3MudHhmZV9idWZmOworCWZsYWcgPSBwZGF0YS0+YW1pY19zZXR0aW5ncy51c2VfcGRhdGE7CisKKwkvKiBNYWtlIHN1cmUgc2V0dGluZ3MgYXJlIGNvcnJlY3QgKi8KKwlpZiAoKHBkYXRhLT5taWNiaWFzLmxkb2hfdiA+IFdDRDlYWFhfTERPSF8zUDBfVikgfHwKKwkgICAgKHBkYXRhLT5taWNiaWFzLmJpYXMxX2NmaWx0X3NlbCA+IFdDRDlYWFhfQ0ZJTFQzX1NFTCkgfHwKKwkgICAgKHBkYXRhLT5taWNiaWFzLmJpYXMyX2NmaWx0X3NlbCA+IFdDRDlYWFhfQ0ZJTFQzX1NFTCkgfHwKKwkgICAgKHBkYXRhLT5taWNiaWFzLmJpYXMzX2NmaWx0X3NlbCA+IFdDRDlYWFhfQ0ZJTFQzX1NFTCkgfHwKKwkgICAgKHBkYXRhLT5taWNiaWFzLmJpYXM0X2NmaWx0X3NlbCA+IFdDRDlYWFhfQ0ZJTFQzX1NFTCkpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCS8qIGZpZ3VyZSBvdXQgayB2YWx1ZSAqLworCWsxID0gd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKCZ0b210b20tPnJlc21nciwKKwkJCQkgICAgICBwZGF0YS0+bWljYmlhcy5jZmlsdDFfbXYpOworCWsyID0gd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKCZ0b210b20tPnJlc21nciwKKwkJCQkgICAgICBwZGF0YS0+bWljYmlhcy5jZmlsdDJfbXYpOworCWszID0gd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKCZ0b210b20tPnJlc21nciwKKwkJCQkgICAgICBwZGF0YS0+bWljYmlhcy5jZmlsdDNfbXYpOworCisJaWYgKElTX0VSUl9WQUxVRShrMSkgfHwgSVNfRVJSX1ZBTFVFKGsyKSB8fCBJU19FUlJfVkFMVUUoazMpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwkvKiBTZXQgdm9sdGFnZSBsZXZlbCBhbmQgYWx3YXlzIHVzZSBMRE8gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9MRE9fSF9NT0RFXzEsIDB4MEMsCisJCQkgICAgKHBkYXRhLT5taWNiaWFzLmxkb2hfdiA8PCAyKSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9NSUNCX0NGSUxUXzFfVkFMLCAweEZDLCAoazEgPDwgMikpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9WQUwsIDB4RkMsIChrMiA8PCAyKSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUlDQl9DRklMVF8zX1ZBTCwgMHhGQywgKGszIDw8IDIpKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX01JQ0JfMV9DVEwsIDB4NjAsCisJCQkgICAgKHBkYXRhLT5taWNiaWFzLmJpYXMxX2NmaWx0X3NlbCA8PCA1KSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUlDQl8yX0NUTCwgMHg2MCwKKwkJCSAgICAocGRhdGEtPm1pY2JpYXMuYmlhczJfY2ZpbHRfc2VsIDw8IDUpKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9NSUNCXzNfQ1RMLCAweDYwLAorCQkJICAgIChwZGF0YS0+bWljYmlhcy5iaWFzM19jZmlsdF9zZWwgPDwgNSkpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHRvbXRvbS0+cmVzbWdyLnJlZ19hZGRyLT5taWNiXzRfY3RsLCAweDYwLAorCQkJICAgIChwZGF0YS0+bWljYmlhcy5iaWFzNF9jZmlsdF9zZWwgPDwgNSkpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGorKywgaSArPSAyKSB7CisJCWlmIChmbGFnICYgKDB4MDEgPDwgaSkpIHsKKwkJCXZhbF90eGZlID0gKHR4ZmVfYnlwYXNzICYgKDB4MDEgPDwgaSkpID8gMHgyMCA6IDB4MDA7CisJCQl2YWxfdHhmZSA9IHZhbF90eGZlIHwKKwkJCQkoKHR4ZmVfYnVmZiAmICgweDAxIDw8IGkpKSA/IDB4MTAgOiAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJVE9NVE9NX0FfVFhfMV8yX1RFU1RfRU4gKyBqICogMTAsCisJCQkJMHgzMCwgdmFsX3R4ZmUpOworCQl9CisJCWlmIChmbGFnICYgKDB4MDEgPDwgKGkgKyAxKSkpIHsKKwkJCXZhbF90eGZlID0gKHR4ZmVfYnlwYXNzICYKKwkJCQkJKDB4MDEgPDwgKGkgKyAxKSkpID8gMHgwMiA6IDB4MDA7CisJCQl2YWxfdHhmZSB8PSAodHhmZV9idWZmICYKKwkJCQkJKDB4MDEgPDwgKGkgKyAxKSkpID8gMHgwMSA6IDB4MDA7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVRPTVRPTV9BX1RYXzFfMl9URVNUX0VOICsgaiAqIDEwLAorCQkJCTB4MDMsIHZhbF90eGZlKTsKKwkJfQorCX0KKwlpZiAoZmxhZyAmIDB4NDApIHsKKwkJdmFsdWUgPSAobGVnX21vZGUgJiAweDQwKSA/IDB4MTAgOiAweDAwOworCQl2YWx1ZSA9IHZhbHVlIHwgKCh0eGZlX2J5cGFzcyAmIDB4NDApID8gMHgwMiA6IDB4MDApOworCQl2YWx1ZSA9IHZhbHVlIHwgKCh0eGZlX2J1ZmYgJiAweDQwKSA/IDB4MDEgOiAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfVFhfN19NQkhDX0VOLAorCQkJMHgxMywgdmFsdWUpOworCX0KKworCWlmIChwZGF0YS0+b2NwLnVzZV9wZGF0YSkgeworCQkvKiBub3QgZGVmaW5lZCBpbiBDT0RFQyBzcGVjaWZpY2F0aW9uICovCisJCWlmIChwZGF0YS0+b2NwLmhwaF9vY3BfbGltaXQgPT0gMSB8fAorCQkJcGRhdGEtPm9jcC5ocGhfb2NwX2xpbWl0ID09IDUpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9SWF9DT01fT0NQX0NUTCwKKwkJCTB4MEYsIHBkYXRhLT5vY3AubnVtX2F0dGVtcHRzKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfQ09NX09DUF9DT1VOVCwKKwkJCSgocGRhdGEtPm9jcC5ydW5fdGltZSA8PCA0KSB8IHBkYXRhLT5vY3Aud2FpdF90aW1lKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMLAorCQkJMHhFMCwgKHBkYXRhLT5vY3AuaHBoX29jcF9saW1pdCA8PCA1KSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPnJlZ3VsYXRvcik7IGkrKykgeworCQlpZiAocGRhdGEtPnJlZ3VsYXRvcltpXS5uYW1lICYmCisJCSAgICAhc3RyY21wKHBkYXRhLT5yZWd1bGF0b3JbaV0ubmFtZSwgIkNEQ19WRERBX1JYIikpIHsKKwkJCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm1pbl91ViA9PSAxODAwMDAwICYmCisJCQkgICAgcGRhdGEtPnJlZ3VsYXRvcltpXS5tYXhfdVYgPT0gMTgwMDAwMCkgeworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0JJQVNfUkVGX0NUTCwKKwkJCQkJICAgICAgMHgxQyk7CisJCQl9IGVsc2UgaWYgKHBkYXRhLT5yZWd1bGF0b3JbaV0ubWluX3VWID09IDIyMDAwMDAgJiYKKwkJCQkgICBwZGF0YS0+cmVndWxhdG9yW2ldLm1heF91ViA9PSAyMjAwMDAwKSB7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfQklBU19SRUZfQ1RMLAorCQkJCQkgICAgICAweDFFKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgQ0RDX1ZEREFfUlggdm9sdGFnZVxuIgorCQkJCSAgICAgICAibWluICVkLCBtYXggJWRcbiIsIF9fZnVuY19fLAorCQkJCSAgICAgICBwZGF0YS0+cmVndWxhdG9yW2ldLm1pbl91ViwKKwkJCQkgICAgICAgcGRhdGEtPnJlZ3VsYXRvcltpXS5tYXhfdVYpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogU2V0IG1pY2JpYXMgY2FwbGVzcyBtb2RlIHdpdGggdGFpbCBjdXJyZW50ICovCisJdmFsdWUgPSAocGRhdGEtPm1pY2JpYXMuYmlhczFfY2FwX21vZGUgPT0gTUlDQklBU19FWFRfQllQX0NBUCA/CisJCSAweDAwIDogMHgxNik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUlDQl8xX0NUTCwgMHgxRSwgdmFsdWUpOworCXZhbHVlID0gKHBkYXRhLT5taWNiaWFzLmJpYXMyX2NhcF9tb2RlID09IE1JQ0JJQVNfRVhUX0JZUF9DQVAgPworCQkgMHgwMCA6IDB4MTYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX01JQ0JfMl9DVEwsIDB4MUUsIHZhbHVlKTsKKwl2YWx1ZSA9IChwZGF0YS0+bWljYmlhcy5iaWFzM19jYXBfbW9kZSA9PSBNSUNCSUFTX0VYVF9CWVBfQ0FQID8KKwkJIDB4MDAgOiAweDE2KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9NSUNCXzNfQ1RMLCAweDFFLCB2YWx1ZSk7CisJdmFsdWUgPSAocGRhdGEtPm1pY2JpYXMuYmlhczRfY2FwX21vZGUgPT0gTUlDQklBU19FWFRfQllQX0NBUCA/CisJCSAweDAwIDogMHgxNik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUlDQl80X0NUTCwgMHgxRSwgdmFsdWUpOworCisJLyogU2V0IHRoZSBETUlDIHNhbXBsZSByYXRlICovCisJc3dpdGNoIChwZGF0YS0+bWNsa19yYXRlKSB7CisJY2FzZSBUT01UT01fTUNMS19DTEtfOVA2TUhaOgorCQlkZWZfZG1pY19yYXRlID0KKwkJCVdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDhNSFo7CisJCWJyZWFrOworCWNhc2UgVE9NVE9NX01DTEtfQ0xLXzEyUDI4OE1IWjoKKwkJZGVmX2RtaWNfcmF0ZSA9CisJCQlXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNFAwOTZNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcHJfZXJyKCIlczogSW52YWxpZCBtY2xrX3JhdGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPm1jbGtfcmF0ZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9PQorCSAgICBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEKSB7CisJCXByX2luZm8oIiVzOiBkbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGVmX2RtaWNfcmF0ZSk7CisJCXBkYXRhLT5kbWljX3NhbXBsZV9yYXRlID0gZGVmX2RtaWNfcmF0ZTsKKwl9CisKKwlpZiAocGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlID09CisJICAgIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQpIHsKKwkJcHJfaW5mbygiJXM6IG1hZF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGVmX2RtaWNfcmF0ZSk7CisJCS8qCisJCSAqIHVzZSBkbWljX3NhbXBsZV9yYXRlIGFzIHRoZSBkZWZhdWx0IGZvciBNQUQKKwkJICogaWYgbWFkIGRtaWMgc2FtcGxlIHJhdGUgaXMgdW5kZWZpbmVkCisJCSAqLworCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgdGhlIERNSUMgY2xrIHJhdGVzIHRvIG1hZF9kbWljX3NhbXBsZV9yYXRlLAorCSAqIHdoZXJlYXMsIHRoZSBhbmMvdHhmZSBkbWljIHJhdGVzIHRvIGRtaWNfc2FtcGxlX3JhdGUKKwkgKiBzaW5jZSB0aGUgYW5jL3R4ZmUgYXJlIGluZGVwZW5kZW50IG9mIG1hZCBibG9jay4KKwkgKi8KKwltYWRfZG1pY19jdGxfdmFsID0gdG9tdG9tX2dldF9kbWljX2Nsa192YWwodG9tdG9tLT5jb2RlYywKKwkJCQlwZGF0YS0+bWNsa19yYXRlLAorCQkJCXBkYXRhLT5tYWRfZG1pY19zYW1wbGVfcmF0ZSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfRE1JQ19CMV9DVEwsCisJCTB4RTAsIG1hZF9kbWljX2N0bF92YWwgPDwgNSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfRE1JQ19CMl9DVEwsCisJCTB4NzAsIG1hZF9kbWljX2N0bF92YWwgPDwgNCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfRE1JQ19CMl9DVEwsCisJCTB4MEUsIG1hZF9kbWljX2N0bF92YWwgPDwgMSk7CisKKwlkbWljX2N0bF92YWwgPSB0b210b21fZ2V0X2RtaWNfY2xrX3ZhbCh0b210b20tPmNvZGVjLAorCQkJCXBkYXRhLT5tY2xrX3JhdGUsCisJCQkJcGRhdGEtPmRtaWNfc2FtcGxlX3JhdGUpOworCisJaWYgKGRtaWNfY3RsX3ZhbCA9PSBXQ0Q5MzMwX0RNSUNfQ0xLX0RJVl8yKQorCQlhbmNfY3RsX3ZhbHVlID0gV0NEOVhYWF9BTkNfRE1JQ19YMl9PTjsKKwllbHNlCisJCWFuY19jdGxfdmFsdWUgPSBXQ0Q5WFhYX0FOQ19ETUlDX1gyX09GRjsKKworCWZvciAoZGVjID0gMDsgZGVjIDwgTlVNX0RFQ0lNQVRPUlM7IGRlYysrKSB7CisJCXR4X2RtaWNfY3RsX3JlZyA9CisJCQlUT01UT01fQV9DRENfVFgxX0RNSUNfQ1RMICsgKDggKiBkZWMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9kbWljX2N0bF9yZWcsCisJCQkJICAgIDB4MDcsIGRtaWNfY3RsX3ZhbCk7CisJfQorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NEQ19BTkMxX0IyX0NUTCwKKwkJMHgxLCBhbmNfY3RsX3ZhbHVlKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DRENfQU5DMl9CMl9DVEwsCisJCTB4MSwgYW5jX2N0bF92YWx1ZSk7Citkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCB0b210b21fcmVnX2RlZmF1bHRzW10gPSB7CisKKwkvKiBzZXQgTUNMayB0byA5LjYgKi8KKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DSElQX0NUTCwgMHgwMiksCisKKwkvKiBFQVIgUEEgZGVhZnVsdHMgICovCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfUlhfRUFSX0NNQlVGRiwgMHgwNSksCisKKwkvKiBSWCBkZWFmdWx0cyAqLworCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDFfQjVfQ1RMLCAweDc5KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlgyX0I1X0NUTCwgMHg3OSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1JYM19CNV9DVEwsIDB4NzkpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDRfQjVfQ1RMLCAweDc5KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlg1X0I1X0NUTCwgMHg3OSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1JYNl9CNV9DVEwsIDB4NzkpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDdfQjVfQ1RMLCAweDc5KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlg4X0I1X0NUTCwgMHg3OSksCisKKwkvKiBSWDEgYW5kIFJYMiBkZWZhdWx0cyAqLworCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDFfQjZfQ1RMLCAweEEwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlgyX0I2X0NUTCwgMHhBMCksCisKKwkvKiBSWDMgdG8gUlg3IGRlZmF1bHRzICovCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1JYM19CNl9DVEwsIDB4ODApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDRfQjZfQ1RMLCAweDgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlg1X0I2X0NUTCwgMHg4MCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1JYNl9CNl9DVEwsIDB4ODApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDdfQjZfQ1RMLCAweDgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlg4X0I2X0NUTCwgMHg4MCksCisKKwkvKiBNQUQgcmVnaXN0ZXJzICovCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfTUFEX0FOQV9DVFJMLCAweEYxKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX01BSU5fQ1RMXzEsIDB4MDApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMiwgMHgwMCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX01BRF9BVURJT19DVExfMSwgMHgwMCksCisJLyogU2V0IFNBTVBMRV9UWF9FTiBiaXQgKi8KKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8yLCAweDAzKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF8zLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF80LCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF81LCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF82LCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF83LCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0NUTF84LCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfUFRSLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0FVRElPX0lJUl9DVExfVkFMLCAweDQwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfREVCVUdfQjdfQ1RMLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfQ0xLX09USFJfUkVTRVRfQjFfQ1RMLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfQ0xLX09USFJfQ1RMLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfTUFEX0lOUF9TRUwsIDB4MDEpLAorCisJLyogU2V0IEhQSCBQYXRoIHRvIGxvdyBwb3dlciBtb2RlICovCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfUlhfSFBIX0JJQVNfUEEsIDB4NTcpLAorCisJLyogQlVDSyBkZWZhdWx0ICovCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQlVDS19DVFJMX0NDTF80LCAweDUxKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9CVUNLX0NUUkxfQ0NMXzEsIDB4NUIpLAorfTsKKworLyoKKyAqIERvbid0IHVwZGF0ZSBUT01UT01fQV9DSElQX0NUTCwgVE9NVE9NX0FfQlVDS19DVFJMX0NDTF8xIGFuZAorICogVE9NVE9NX0FfUlhfRUFSX0NNQlVGRiBhcyB0aG9zZSBhcmUgdXBkYXRlZCBpbiB0b210b21fcmVnX2RlZmF1bHRzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgdG9tdG9tXzFfMF9yZWdfZGVmYXVsdHNbXSA9IHsKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9UWF8xX0dBSU4sIDB4MiksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfVFhfMl9HQUlOLCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1RYXzFfMl9BRENfSUIsIDB4NDQpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1RYXzNfR0FJTiwgMHgyKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9UWF80X0dBSU4sIDB4MiksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfVFhfM180X0FEQ19JQiwgMHg0NCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfVFhfNV9HQUlOLCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1RYXzZfR0FJTiwgMHgyKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9UWF81XzZfQURDX0lCLCAweDQ0KSwKKwlUT01UT01fUkVHX1ZBTChXQ0Q5WFhYX0FfQlVDS19NT0RFXzMsIDB4Q0UpLAorCVRPTVRPTV9SRUdfVkFMKFdDRDlYWFhfQV9CVUNLX0NUUkxfVkNMXzEsIDB4OCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQlVDS19DVFJMX0NDTF80LCAweDUxKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9OQ1BfRFRFU1QsIDB4MTApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0hQSF9DSE9QX0NUTCwgMHhBNCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfUlhfSFBIX09DUF9DVEwsIDB4NjkpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0hQSF9DTlBfV0dfQ1RMLCAweERBKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9SWF9IUEhfQ05QX1dHX1RJTUUsIDB4MTUpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0VBUl9CSUFTX1BBLCAweDc2KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9SWF9FQVJfQ05QLCAweEMwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9SWF9MSU5FX0JJQVNfUEEsIDB4NzgpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0xJTkVfMV9URVNULCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0xJTkVfMl9URVNULCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0xJTkVfM19URVNULCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0xJTkVfNF9URVNULCAweDIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1NQS1JfRFJWMV9PQ1BfQ1RMLCAweDk3KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9TUEtSX0RSVjFfQ0xJUF9ERVQsIDB4MSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfU1BLUl9EUlYxX0lFQywgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9TUEtSX0RSVjJfT0NQX0NUTCwgMHg5NyksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfU1BLUl9EUlYyX0NMSVBfREVULCAweDEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19UWDFfTVVYX0NUTCwgMHg0QSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1RYMl9NVVhfQ1RMLCAweDRBKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFgzX01VWF9DVEwsIDB4NEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19UWDRfTVVYX0NUTCwgMHg0QSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1RYNV9NVVhfQ1RMLCAweDRBKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFg2X01VWF9DVEwsIDB4NEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19UWDdfTVVYX0NUTCwgMHg0QSksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1RYOF9NVVhfQ1RMLCAweDRBKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFg5X01VWF9DVEwsIDB4NEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19UWDEwX01VWF9DVEwsIDB4NEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDFfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDJfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDNfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDRfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDVfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDZfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDdfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWDhfQjRfQ1RMLCAweEIpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19WQkFUX0dBSU5fVVBEX01PTiwgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUEFfUkFNUF9CMV9DVEwsIDB4MCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMLCAweDApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19QQV9SQU1QX0IzX0NUTCwgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUEFfUkFNUF9CNF9DVEwsIDB4MCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1NQS1JfQ0xJUERFVF9CMV9DVEwsIDB4MCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfQ0RDX1NQS1IyX0NMSVBERVRfQjFfQ1RMLCAweDApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19DT01QMF9CNF9DVEwsIDB4MzcpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19DT01QMF9CNV9DVEwsIDB4N2YpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19DT01QMF9CNV9DVEwsIDB4N2YpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCB0b210b21fMl8wX3JlZ19kZWZhdWx0c1tdID0geworCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19NQURfTUFJTl9DVExfMiwgMHgzMiksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfUkNPX0NUUkwsIDB4MTApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0hQSF9MX1RFU1QsIDB4MEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1JYX0hQSF9SX1RFU1QsIDB4MEEpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1BJTl9DVExfT0UwLCAweEMzKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9QSU5fQ1RMX0RBVEEwLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFhfSTJTX1NDS19NT0RFLCAweDA0KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFhfSTJTX1dTX01PREUsIDB4MDQpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWF9JMlNfU0NLX01PREUsIDB4MDQpLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWF9JMlNfV1NfTU9ERSwgMHgwNCksCisJVE9NVE9NX1JFR19WQUwoVE9NVE9NX0FfUElOX0NUTF9PRTEsIDB4RTApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1BJTl9DVExfT0UyLCAweDAzKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfSlRDS19NT0RFLCAweDA0KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfSlRESV9NT0RFLCAweDA0KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfSlRNU19NT0RFLCAweDA0KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfSlRET19NT0RFLCAweDA0KSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfSlRSU1RfTU9ERSwgMHgwNCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfcmVnX21hc2tfdmFsIHRvbXRvbV8yXzBfcmVnX2kyY19kZWZhdWx0c1tdID0geworCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX1BJTl9DVExfT0UwLCAweDAwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfVFhfSTJTX1NDS19NT0RFLCAweDApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19UWF9JMlNfV1NfTU9ERSwgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9DRENfUlhfSTJTX1NDS19NT0RFLCAweDApLAorCVRPTVRPTV9SRUdfVkFMKFRPTVRPTV9BX0NEQ19SWF9JMlNfV1NfTU9ERSwgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9QSU5fQ1RMX09FMSwgMHgwKSwKKwlUT01UT01fUkVHX1ZBTChUT01UT01fQV9QSU5fQ1RMX09FMiwgMHgwKSwKK307CisKK3N0YXRpYyB2b2lkIHRvbXRvbV91cGRhdGVfcmVnX2RlZmF1bHRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl1MzIgaTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqdG9tdG9tX2NvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9tdG9tX3JlZ19kZWZhdWx0cyk7IGkrKykKKwkJc25kX3NvY193cml0ZShjb2RlYywgdG9tdG9tX3JlZ19kZWZhdWx0c1tpXS5yZWcsCisJCQkgICAgICB0b210b21fcmVnX2RlZmF1bHRzW2ldLnZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b210b21fMV8wX3JlZ19kZWZhdWx0cyk7IGkrKykKKwkJc25kX3NvY193cml0ZShjb2RlYywgdG9tdG9tXzFfMF9yZWdfZGVmYXVsdHNbaV0ucmVnLAorCQkJCXRvbXRvbV8xXzBfcmVnX2RlZmF1bHRzW2ldLnZhbCk7CisKKwlpZiAoIVRPTVRPTV9JU18xXzAodG9tdG9tX2NvcmUtPnZlcnNpb24pKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvbXRvbV8yXzBfcmVnX2RlZmF1bHRzKTsgaSsrKQorCQkJc25kX3NvY193cml0ZShjb2RlYywgdG9tdG9tXzJfMF9yZWdfZGVmYXVsdHNbaV0ucmVnLAorCQkJCSAgICAgIHRvbXRvbV8yXzBfcmVnX2RlZmF1bHRzW2ldLnZhbCk7CisKKwkJaWYgKHRvbXRvbS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b210b21fMl8wX3JlZ19pMmNfZGVmYXVsdHMpOworCQkJICAgICBpKyspCisJCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQkJdG9tdG9tXzJfMF9yZWdfaTJjX2RlZmF1bHRzW2ldLnJlZywKKwkJCQkJdG9tdG9tXzJfMF9yZWdfaTJjX2RlZmF1bHRzW2ldLnZhbCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgdG9tdG9tX2NvZGVjX3JlZ19pbml0X3ZhbFtdID0geworCS8qIEluaXRpYWxpemUgY3VycmVudCB0aHJlc2hvbGQgdG8gMzUwTUEKKwkgKiBudW1iZXIgb2Ygd2FpdCBhbmQgcnVuIGN5Y2xlcyB0byA0MDk2CisJICovCisJe1RPTVRPTV9BX1JYX0hQSF9PQ1BfQ1RMLCAweEUxLCAweDYxfSwKKwl7VE9NVE9NX0FfUlhfQ09NX09DUF9DT1VOVCwgMHhGRiwgMHhGRn0sCisJe1RPTVRPTV9BX1JYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDF9LAorCXtUT01UT01fQV9SWF9IUEhfUl9URVNULCAweDAxLCAweDAxfSwKKworCS8qIEluaXRpYWxpemUgZ2FpbiByZWdpc3RlcnMgdG8gdXNlIHJlZ2lzdGVyIGdhaW4gKi8KKwl7VE9NVE9NX0FfUlhfSFBIX0xfR0FJTiwgMHgyMCwgMHgyMH0sCisJe1RPTVRPTV9BX1JYX0hQSF9SX0dBSU4sIDB4MjAsIDB4MjB9LAorCXtUT01UT01fQV9SWF9MSU5FXzFfR0FJTiwgMHgyMCwgMHgyMH0sCisJe1RPTVRPTV9BX1JYX0xJTkVfMl9HQUlOLCAweDIwLCAweDIwfSwKKwl7VE9NVE9NX0FfUlhfTElORV8zX0dBSU4sIDB4MjAsIDB4MjB9LAorCXtUT01UT01fQV9SWF9MSU5FXzRfR0FJTiwgMHgyMCwgMHgyMH0sCisJe1RPTVRPTV9BX1NQS1JfRFJWMV9HQUlOLCAweDA0LCAweDA0fSwKKwl7VE9NVE9NX0FfU1BLUl9EUlYyX0dBSU4sIDB4MDQsIDB4MDR9LAorCisJLyogVXNlIDE2IGJpdCBzYW1wbGUgc2l6ZSBmb3IgVFgxIHRvIFRYNiAqLworCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMV9DVEwsIDB4MzAsIDB4MjB9LAorCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CMl9DVEwsIDB4MzAsIDB4MjB9LAorCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CM19DVEwsIDB4MzAsIDB4MjB9LAorCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNF9DVEwsIDB4MzAsIDB4MjB9LAorCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNV9DVEwsIDB4MzAsIDB4MjB9LAorCXtUT01UT01fQV9DRENfQ09OTl9UWF9TQl9CNl9DVEwsIDB4MzAsIDB4MjB9LAorCisJLyogVXNlIDE2IGJpdCBzYW1wbGUgc2l6ZSBmb3IgVFg3IHRvIFRYMTAgKi8KKwl7VE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjdfQ1RMLCAweDYwLCAweDQwfSwKKwl7VE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjhfQ1RMLCAweDYwLCAweDQwfSwKKwl7VE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjlfQ1RMLCAweDYwLCAweDQwfSwKKwl7VE9NVE9NX0FfQ0RDX0NPTk5fVFhfU0JfQjEwX0NUTCwgMHg2MCwgMHg0MH0sCisKKwkvKmVuYWJsZSBIUEYgZmlsdGVyIGZvciBUWCBwYXRocyAqLworCXtUT01UT01fQV9DRENfVFgxX01VWF9DVEwsIDB4OCwgMHgwfSwKKwl7VE9NVE9NX0FfQ0RDX1RYMl9NVVhfQ1RMLCAweDgsIDB4MH0sCisJe1RPTVRPTV9BX0NEQ19UWDNfTVVYX0NUTCwgMHg4LCAweDB9LAorCXtUT01UT01fQV9DRENfVFg0X01VWF9DVEwsIDB4OCwgMHgwfSwKKwl7VE9NVE9NX0FfQ0RDX1RYNV9NVVhfQ1RMLCAweDgsIDB4MH0sCisJe1RPTVRPTV9BX0NEQ19UWDZfTVVYX0NUTCwgMHg4LCAweDB9LAorCXtUT01UT01fQV9DRENfVFg3X01VWF9DVEwsIDB4OCwgMHgwfSwKKwl7VE9NVE9NX0FfQ0RDX1RYOF9NVVhfQ1RMLCAweDgsIDB4MH0sCisJe1RPTVRPTV9BX0NEQ19UWDlfTVVYX0NUTCwgMHg4LCAweDB9LAorCXtUT01UT01fQV9DRENfVFgxMF9NVVhfQ1RMLCAweDgsIDB4MH0sCisKKwkvKiBDb21wYW5kZXIgem9uZSBzZWxlY3Rpb24gKi8KKwl7VE9NVE9NX0FfQ0RDX0NPTVAwX0I0X0NUTCwgMHgzRiwgMHgzN30sCisJe1RPTVRPTV9BX0NEQ19DT01QMV9CNF9DVEwsIDB4M0YsIDB4Mzd9LAorCXtUT01UT01fQV9DRENfQ09NUDJfQjRfQ1RMLCAweDNGLCAweDM3fSwKKwl7VE9NVE9NX0FfQ0RDX0NPTVAwX0I1X0NUTCwgMHg3RiwgMHg3Rn0sCisJe1RPTVRPTV9BX0NEQ19DT01QMV9CNV9DVEwsIDB4N0YsIDB4N0Z9LAorCXtUT01UT01fQV9DRENfQ09NUDJfQjVfQ1RMLCAweDdGLCAweDdGfSwKKworCS8qCisJICogU2V0dXAgd2F2ZWdlbiB0aW1lciB0byAyMG1zZWMgYW5kIGRpc2FibGUgY2hvcHBlcgorCSAqIGFzIGRlZmF1bHQuIFRoaXMgY29ycmVzcG9uZHMgdG8gQ29tcGFuZGVyIE9GRgorCSAqLworCXtUT01UT01fQV9SWF9IUEhfQ05QX1dHX0NUTCwgMHhGRiwgMHhEQn0sCisJe1RPTVRPTV9BX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhGRiwgMHg1OH0sCisJe1RPTVRPTV9BX1JYX0hQSF9CSUFTX1dHX09DUCwgMHhGRiwgMHgxQX0sCisJe1RPTVRPTV9BX1JYX0hQSF9DSE9QX0NUTCwgMHhGRiwgMHgyNH0sCisKKwkvKiBDaG9vc2UgbWF4IG5vbi1vdmVybGFwIHRpbWUgZm9yIE5DUCAqLworCXtUT01UT01fQV9OQ1BfQ0xLLCAweEZGLCAweEZDfSwKKworCS8qIFByb2dyYW0gdGhlIDAuODUgdm9sdCBWQkdfUkVGRVJFTkNFICovCisJe1RPTVRPTV9BX0JJQVNfQ1VSUl9DVExfMiwgMHhGRiwgMHgwNH0sCisKKwkvKiBzZXQgTUFEIGlucHV0IE1JQyB0byBETUlDMSAqLworCXtUT01UT01fQV9DRENfTUFEX0lOUF9TRUwsIDB4MEYsIDB4MDh9LAorCisJe1RPTVRPTV9BX0lOVFJfTU9ERSwgMHgwNCwgMHgwNH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfcmVnX21hc2tfdmFsIHRvbXRvbV9jb2RlY18yXzBfcmVnX2luaXRfdmFsW10gPSB7CisJe1RPTVRPTV9BX1JYX0hQSF9MX1RFU1QsIDB4MDgsIDB4MDB9LAorCXtUT01UT01fQV9SWF9IUEhfUl9URVNULCAweDA4LCAweDAwfSwKKwl7VE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1JfTUlOX0NMSVBfVEhSRVNIT0xELCAweEZGLCAweDAwfSwKKwl7VE9NVE9NX0FfQ0RDX0NMSVBfQURKX1NQS1IyX01JTl9DTElQX1RIUkVTSE9MRCwgMHhGRiwgMHgwMH0sCisJe1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSX0JPT1NUX0dBVElORywgMHgwMSwgMHgwMX0sCisJe1RPTVRPTV9BX0NEQ19DTElQX0FESl9TUEtSMl9CT09TVF9HQVRJTkcsIDB4MDEsIDB4MDF9LAorCXtUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUl9CMV9DVEwsIDB4MDEsIDB4MDB9LAorCXtUT01UT01fQV9DRENfQ0xJUF9BREpfU1BLUjJfQjFfQ1RMLCAweDAxLCAweDAwfSwKK307CisKK3N0YXRpYyB2b2lkIHRvbXRvbV9jb2RlY19pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTMyIGk7CisJc3RydWN0IHdjZDl4eHggKnRvbXRvbV9jb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b210b21fY29kZWNfcmVnX2luaXRfdmFsKTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0b210b21fY29kZWNfcmVnX2luaXRfdmFsW2ldLnJlZywKKwkJCQl0b210b21fY29kZWNfcmVnX2luaXRfdmFsW2ldLm1hc2ssCisJCQkJdG9tdG9tX2NvZGVjX3JlZ19pbml0X3ZhbFtpXS52YWwpOworCisJaWYgKCFUT01UT01fSVNfMV8wKHRvbXRvbV9jb3JlLT52ZXJzaW9uKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b210b21fY29kZWNfMl8wX3JlZ19pbml0X3ZhbCk7IGkrKykKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJdG9tdG9tX2NvZGVjXzJfMF9yZWdfaW5pdF92YWxbaV0ucmVnLAorCQkJCXRvbXRvbV9jb2RlY18yXzBfcmVnX2luaXRfdmFsW2ldLm1hc2ssCisJCQkJdG9tdG9tX2NvZGVjXzJfMF9yZWdfaW5pdF92YWxbaV0udmFsKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgdG9tdG9tX3NsaW1faW50ZXJmYWNlX2luaXRfcmVnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJZm9yIChpID0gMDsgaSA8IFdDRDlYWFhfU0xJTV9OVU1fUE9SVF9SRUc7IGkrKykKKwkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHdjZDl4eHgsCisJCQkJCSAgICBUT01UT01fU0xJTV9QR0RfUE9SVF9JTlRfRU4wICsgaSwKKwkJCQkJICAgIDB4RkYpOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9zZXR1cF9pcnFzKHN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRvbXRvbS0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgV0NEOVhYWF9JUlFfU0xJTUJVUywKKwkJCQkgIHRvbXRvbV9zbGltYnVzX2lycSwgIlNMSU1CVVMgU2xhdmUiLCB0b210b20pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBXQ0Q5WFhYX0lSUV9TTElNQlVTKTsKKwllbHNlCisJCXRvbXRvbV9zbGltX2ludGVyZmFjZV9pbml0X3JlZyhjb2RlYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0b210b21fY2xlYW51cF9pcnFzKHN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRvbXRvbS0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgV0NEOVhYWF9JUlFfU0xJTUJVUywgdG9tdG9tKTsKK30KKworc3RhdGljCitzdHJ1Y3QgZmlybXdhcmVfY2FsICp0b210b21fZ2V0X2h3ZGVwX2Z3X2NhbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQllbnVtIHdjZF9jYWxfdHlwZSB0eXBlKQoreworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tOworCXN0cnVjdCBmaXJtd2FyZV9jYWwgKmh3ZGVwX2NhbDsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogTlVMTCBjb2RlYyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwl0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0b210b20tPmZ3X2RhdGEsIHR5cGUpOworCWlmICghaHdkZXBfY2FsKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjYWwgbm90IHNlbnQgYnkgJWRcbiIsCisJCQkJX19mdW5jX18sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gaHdkZXBfY2FsOworCX0KK30KKworaW50IHRvbXRvbV9oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgc3RydWN0IHdjZDl4eHhfbWJoY19jb25maWcgKm1iaGNfY2ZnKQoreworCWludCByYzsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKG1iaGNfY2ZnLT5pbnNlcnRfZGV0ZWN0KSB7CisJCXJjID0gd2NkOXh4eF9tYmhjX3N0YXJ0KCZ0b210b20tPm1iaGMsIG1iaGNfY2ZnKTsKKwkJaWYgKCFyYykKKwkJCXRvbXRvbS0+bWJoY19zdGFydGVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKiBNQkhDIGlzIGRpc2FibGVkLCBzbyBkaXNhYmxlIEF1dG8gcHVsbGRvd24gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfTUJIQ19JTlNFUlRfREVURUNUMiwgMHhDMCwKKwkJCQkgICAgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX01JQ0JfQ0ZJTFRfMl9DVEwsIDB4MDEsCisJCQkJICAgIDB4MDApOworCQl0b210b20tPm1iaGMubWJoY19jZmcgPSBOVUxMOworCQlyYyA9IDA7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wodG9tdG9tX2hzX2RldGVjdCk7CisKK3ZvaWQgdG9tdG9tX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJd2NkOXh4eF9tYmhjX3N0b3AoJnRvbXRvbS0+bWJoYyk7CisJdG9tdG9tLT5tYmhjX3N0YXJ0ZWQgPSBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0wodG9tdG9tX2hzX2RldGVjdF9leGl0KTsKKwordm9pZCB0b210b21fZXZlbnRfcmVnaXN0ZXIoCisJaW50ICgqbWFjaGluZV9ldmVudF9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWVudW0gd2NkOXh4eF9jb2RlY19ldmVudCksCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0b210b20tPm1hY2hpbmVfY29kZWNfZXZlbnRfY2IgPSBtYWNoaW5lX2V2ZW50X2NiOworfQorRVhQT1JUX1NZTUJPTCh0b210b21fZXZlbnRfcmVnaXN0ZXIpOworCit2b2lkIHRvbXRvbV9yZWdpc3Rlcl9leHRfY2xrX2NiKAorCWludCAoKmNvZGVjX2V4dF9jbGtfZW4pKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQlpbnQgZW5hYmxlLCBib29sIGRhcG0pLAorCWludCAoKmdldF9leHRfY2xrX2NudCkodm9pZCksCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0b210b20tPmNvZGVjX2V4dF9jbGtfZW5fY2IgPSAgY29kZWNfZXh0X2Nsa19lbjsKKwl0b210b20tPmNvZGVjX2dldF9leHRfY2xrX2NudCA9IGdldF9leHRfY2xrX2NudDsKK30KK0VYUE9SVF9TWU1CT0wodG9tdG9tX3JlZ2lzdGVyX2V4dF9jbGtfY2IpOworCitzdGF0aWMgdm9pZCB0b210b21faW5pdF9zbGltX3NsYXZlX2NmZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRvbXRvbV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgKmNmZzsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXVpbnQ2NF90IGVhZGRyID0gMDsKKworCWNmZyA9ICZwcml2LT5zbGltYnVzX3NsYXZlX2NmZzsKKwljZmctPm1pbm9yX3ZlcnNpb24gPSAxOworCWNmZy0+dHhfc2xhdmVfcG9ydF9vZmZzZXQgPSAwOworCWNmZy0+cnhfc2xhdmVfcG9ydF9vZmZzZXQgPSAxNjsKKworCW1lbWNweSgmZWFkZHIsICZ3Y2Q5eHh4LT5zbGltLT5lX2FkZHIsIHNpemVvZih3Y2Q5eHh4LT5zbGltLT5lX2FkZHIpKTsKKwlXQVJOX09OKHNpemVvZih3Y2Q5eHh4LT5zbGltLT5lX2FkZHIpICE9IDYpOworCWNmZy0+ZGV2aWNlX2VudW1fYWRkcl9sc3cgPSBlYWRkciAmIDB4RkZGRkZGRkY7CisJY2ZnLT5kZXZpY2VfZW51bV9hZGRyX21zdyA9IGVhZGRyID4+IDMyOworCisJcHJfZGVidWcoIiVzOiBzbGltYnVzIGxvZ2ljYWwgYWRkcmVzcyAweCVsbHhcbiIsIF9fZnVuY19fLCBlYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX2RldmljZV9kb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWludCBjb3VudDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHRvbXRvbV9wcml2ICpwcml2OworCisJY29kZWMgPSAoc3RydWN0IHNuZF9zb2NfY29kZWMgKikod2NkOXh4eC0+c3NyX3ByaXYpOworCXByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl3Y2RfY3BlX3Nzcl9ldmVudChwcml2LT5jcGVfY29yZSwgV0NEX0NQRV9CVVNfRE9XTl9FVkVOVCk7CisJc25kX3NvY19jYXJkX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29kZWMtPmNvbXBvbmVudC5jYXJkLCAwKTsKKwlzZXRfYml0KEJVU19ET1dOLCAmcHJpdi0+c3RhdHVzX21hc2spOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX0NPREVDX0RBSVM7IGNvdW50KyspCisJCXByaXYtPmRhaVtjb3VudF0uYnVzX2Rvd25faW5fcmVjb3ZlcnkgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfcHJlcGFyZV9zdGF0aWNfcGEoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxoKQoreworCWludCBpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXUzMiBkZWxheTsKKworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0X3Bhb25bXSA9IHsKKwkJe1RPTVRPTV9BX1RYX0NPTV9CSUFTLCAweGZmLCAweEYwfSwKKwkJe1dDRDlYWFhfQV9DRENfUlgxX0I2X0NUTCwgMHhmZiwgMHg4MX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMS19SWF9CMV9DVEwsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV8yLCAweGZmLCAweEVGfSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMiwgMHhmZiwgMHhFRX0sCisJCXtUT01UT01fQV9OQ1BfRFRFU1QsIDB4ZmYsIDB4MjB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTEtfT1RIUl9DVEwsIDB4ZmYsIDB4MjF9LAorCQl7V0NEOVhYWF9BX0NEQ19SWDJfQjZfQ1RMLCAweGZmLCAweDgxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xLX1JYX0IxX0NUTCwgMHgwMiwgMHgwMn0sCisKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMiwgMHhmZiwgMHhBRX0sCisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzIsIDB4ZmYsIDB4QUF9LAorCQl7V0NEOVhYWF9BX05DUF9DTEssIDB4ZmYsIDB4OUN9LAorCQl7V0NEOVhYWF9BX05DUF9DTEssIDB4ZmYsIDB4RkN9LAorCQl7V0NEOVhYWF9BX1JYX0NPTV9CSUFTLCAweGZmLCAweEEwfSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMywgMHhmZiwgMHhDNn0sCisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzQsIDB4ZmYsIDB4RTZ9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV81LCAweGZmLCAweDAyfSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMSwgMHhmZiwgMHhBMX0sCisJCS8qIEFkZCBhIGRlbGF5IG9mIDFtcyBhZnRlciB0aGlzIHJlZyB3cml0ZSAqLworCisJCXtXQ0Q5WFhYX0FfTkNQX1NUQVRJQywgMHhmZiwgMHgyOH0sCisJCXtXQ0Q5WFhYX0FfTkNQX0VOLCAweGZmLCAweEZGfSwKKwkJLyogQWRkIGEgZGVsYXkgb2YgMW1zIGFmdGVyIHRoaXMgcmVnIHdyaXRlICovCisKKwkJLyogc2V0IEhQSEwgKi8KKwkJe1dDRDlYWFhfQV9SWF9IUEhfTF9URVNULCAweGZmLCAweDAwfSwKKwkJe1RPTVRPTV9BX1JYX0hQSF9MX1BBX0NUTCwgMHhmZiwgMHg0Mn0sCisJCXtUT01UT01fQV9SWF9IUEhfQklBU19MRE8sIDB4ZmYsIDB4OEN9LAorCQl7VE9NVE9NX0FfUlhfSFBIX0NIT1BfQ1RMLCAweGZmLCAweEE0fSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfTF9HQUlOLCAweGZmLCAweEUwfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfTF9HQUlOLCAweGZmLCAweEVDfSwKKworCQkvKiBzZXQgSFBIUiAqLworCQl7V0NEOVhYWF9BX1JYX0hQSF9SX1RFU1QsIDB4ZmYsIDB4MDB9LAorCQl7VE9NVE9NX0FfUlhfSFBIX1JfUEFfQ1RMLCAweGZmLCAweDQyfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfUl9HQUlOLCAweGZmLCAweDIwfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfUl9HQUlOLCAweGZmLCAweDJDfSwKKworCQkvKiBzZXQgSFBIIFBBcyAqLworCQl7V0NEOVhYWF9BX1JYX0hQSF9CSUFTX1dHX09DUCwgMHhmZiwgMHgyQX0sCisJCXtXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19DVEwsIDB4ZmYsIDB4REF9LAorCQl7V0NEOVhYWF9BX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhmZiwgMHgxNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjFfQ1RMLCAweGZmLCAweEU2fSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfTF9EQUNfQ1RMLCAweGZmLCAweDQwfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfTF9EQUNfQ1RMLCAweGZmLCAweEMwfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfUl9EQUNfQ1RMLCAweGZmLCAweDQwfSwKKwkJe1dDRDlYWFhfQV9SWF9IUEhfUl9EQUNfQ1RMLCAweGZmLCAweEMwfSwKKworCQl7VE9NVE9NX0FfUlhfSFBIX0xfQVRFU1QsIDB4ZmYsIDB4MDB9LAorCQl7VE9NVE9NX0FfUlhfSFBIX1JfQVRFU1QsIDB4ZmYsIDB4MDB9LAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdfc2V0X3Bhb24pOyBpKyspIHsKKwkJLyoKKwkJICogU29tZSBvZiB0aGUgY29kZWMgcmVnaXN0ZXJzIGxpa2UgQlVDS19NT0RFXzEKKwkJICogYW5kIE5DUF9FTiByZXF1aXJlcyAxbXMgd2FpdCB0aW1lIGZvciB0aGVtCisJCSAqIHRvIHRha2UgZWZmZWN0LiBPdGhlciByZWdpc3RlciB3cml0ZXMgZm9yCisJCSAqIFBBIGNvbmZpZ3VyYXRpb24gZG8gbm90IHJlcXVpcmUgYW55IHdhaXQgdGltZS4KKwkJICovCisJCWlmIChyZWdfc2V0X3Bhb25baV0ucmVnID09IFdDRDlYWFhfQV9CVUNLX01PREVfMSB8fAorCQkgICAgcmVnX3NldF9wYW9uW2ldLnJlZyA9PSBXQ0Q5WFhYX0FfTkNQX0VOKQorCQkJZGVsYXkgPSAxMDAwOworCQllbHNlCisJCQlkZWxheSA9IDA7CisJCXdjZDl4eHhfc29jX3VwZGF0ZV9iaXRzX3B1c2goY29kZWMsIGxoLAorCQkJCQkgICAgIHJlZ19zZXRfcGFvbltpXS5yZWcsCisJCQkJCSAgICAgcmVnX3NldF9wYW9uW2ldLm1hc2ssCisJCQkJCSAgICAgcmVnX3NldF9wYW9uW2ldLnZhbCwgZGVsYXkpOworCX0KKwlwcl9kZWJ1ZygiJXM6IFBBcyBhcmUgcHJlcGFyZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfZW5hYmxlX3N0YXRpY19wYShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLCBib29sIGVuYWJsZSwKKwkJCQkgICAgdTggaHBoX3BhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCWNvbnN0IGludCB3Z190aW1lID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19USU1FKSAqCisJCQkgICAgVE9NVE9NX1dHX1RJTUVfRkFDVE9SX1VTOworCXU4IG1hc2sgPSAoaHBoX3BhIDw8IDQpOworCXU4IHBhX2VuID0gZW5hYmxlID8gbWFzayA6IH5tYXNrOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU4sIG1hc2ssIHBhX2VuKTsKKwkvKiBXYWl0IGZvciB3YXZlIGdlbiB0aW1lIHRvIGF2b2lkIHBvcCBub2lzZSAqLworCXVzbGVlcF9yYW5nZSh3Z190aW1lLCB3Z190aW1lICsgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwlwcl9kZWJ1ZygiJXM6IFBBcyBhcmUgJXMgYXMgc3RhdGljIG1vZGUgKHdnX3RpbWUgJWQpXG4iLCBfX2Z1bmNfXywKKwkJIGVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIHdnX3RpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9zZXR1cF96ZGV0KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkgICAgZW51bSBtYmhjX2ltcGVkYW5jZV9kZXRlY3Rfc3RhZ2VzIHN0YWdlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKyNkZWZpbmUgX193cihyZWcsIG1hc2ssIHZhbHVlKQkJCQkJCSAgXAorCWRvIHsJCQkJCQkJCSAgXAorCQlyZXQgPSB3Y2Q5eHh4X3NvY191cGRhdGVfYml0c19wdXNoKGNvZGVjLAkJICBcCisJCQkJCQkgICAmdG9tdG9tLT5yZWdfc2F2ZV9yZXN0b3JlLCBcCisJCQkJCQkgICByZWcsIG1hc2ssIHZhbHVlLCAwKTsgIFwKKwkJaWYgKHJldCA8IDApCQkJCQkJICBcCisJCQlyZXR1cm4gcmV0OwkJCQkJICBcCisJfSB3aGlsZSAoMCkKKworCXN3aXRjaCAoc3RhZ2UpIHsKKworCWNhc2UgTUJIQ19aREVUX1BSRV9NRUFTVVJFOgorCQlJTklUX0xJU1RfSEVBRCgmdG9tdG9tLT5yZWdfc2F2ZV9yZXN0b3JlKTsKKwkJd2NkOXh4eF9wcmVwYXJlX3N0YXRpY19wYShtYmhjLCAmdG9tdG9tLT5yZWdfc2F2ZV9yZXN0b3JlKTsKKwkJLyogU2V0IEhQSF9NQkhDIGZvciB6ZGV0ICovCisJCV9fd3IoV0NEOVhYWF9BX01CSENfSFBILCAweGZmLCAweEM0KTsKKwkJdXNsZWVwX3JhbmdlKDEwLCAxMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCXdjZDl4eHhfZW5hYmxlX3N0YXRpY19wYShtYmhjLCBIUEhfUEFfRU5BQkxFLCBIUEhfUEFfTF9SKTsKKworCQkvKiBzYXZlIG9sZCB2YWx1ZSBvZiByZWdpc3RlcnMgYW5kIHdyaXRlIHRoZSBuZXcgdmFsdWUgKi8KKwkJX193cihXQ0Q5WFhYX0FfUlhfSFBIX09DUF9DVEwsIDB4ZmYsIDB4NjkpOworCQlfX3dyKFdDRDlYWFhfQV9DRENfUlgxX0I2X0NUTCwgMHhmZiwgMHg4MCk7CisJCV9fd3IoV0NEOVhYWF9BX0NEQ19SWDJfQjZfQ1RMLCAweGZmLCAweDgwKTsKKwkJLyogRW5hYmxlIE1CSEMgTVVYLCBTZXQgTVVYIGN1cnJlbnQgdG8gMzcuNXVBIGFuZCBBREM3ICovCisJCV9fd3IoV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwgMHhmZiwgMHhDMCk7CisJCV9fd3IoV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMiwgMHhmZiwgMHhGMCk7CisJCV9fd3IoVE9NVE9NX0FfVFhfN19UWEZFX0NMS0RJViwgMHhmZiwgMHg4Qik7CisJCV9fd3IoV0NEOVhYWF9BX1RYXzdfTUJIQ19URVNUX0NUTCwgMHhmZiwgMHg3OCk7CisJCV9fd3IoV0NEOVhYWF9BX1RYXzdfTUJIQ19FTiwgMHhmZiwgMHg4Qyk7CisJCV9fd3IoV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwgMHhmZiwgMHhEQyk7CisJCS8qIFJlc2V0IE1CSEMgYW5kIHNldCBpdCB1cCBmb3IgU1RBICovCisJCV9fd3IoV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4ZmYsIDB4MEEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMLCAweDAwKTsKKwkJX193cihXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHhmZiwgMHgwMik7CisJCV9fd3IoV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0I1X0NUTCwgMHhmZiwgMHg4MCk7CisJCV9fd3IoV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0I0X0NUTCwgMHhmZiwgMHgyNSk7CisJCS8qIFdhaXQgZm9yIH41MHVzIHRvIGxldCBNQkhDIGhhcmR3YXJlIHNldHRsZSBkb3duICovCisJCXVzbGVlcF9yYW5nZSg1MCwgNTAgKyBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQlicmVhazsKKwljYXNlIE1CSENfWkRFVF9QT1NUX01FQVNVUkU6CisJCS8qIDB4NjkgZm9yIDEwNSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgUEEgUkFNUCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjRfQ1RMLCAweDY5KTsKKwkJLyogUHJvZ3JhbSB0aGUgUEEgUmFtcCB0byBGU18xNkssIEwgc2hpZnQgMSAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMLAorCQkJICAgICAgMHgxIDw8IDQgfCAweDYpOworCQkvKiBSZXNldCB0aGUgUEEgUmFtcCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMLCAweDFDKTsKKwkJLyoKKwkJICogQ29ubmVjdCB0aGUgUEEgUmFtcCB0byBQQSBjaGFpbiBhbmQgcmVsZWFzZSByZXNldCB3aXRoCisJCSAqIGtlZXAgaXQgY29ubmVjdGVkLgorCQkgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IxX0NUTCwgMHgxRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMV9DVEwsIDB4MDMpOworCisJCS8qIFN0YXJ0IHRoZSBQQSByYW1wIG9uIEhQSCBMIGFuZCBSICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMl9DVEwsIDB4MDUpOworCQkvKiBSYW1wIGdlbmVyYXRvciB0YWtlcyB+MzBtcyAqLworCQl1c2xlZXBfcmFuZ2UoVE9NVE9NX0hQSF9QQV9SQU1QX0RFTEFZLAorCQkJICAgICBUT01UT01fSFBIX1BBX1JBTVBfREVMQVkgKworCQkJICAgICBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCisJCS8qCisJCSAqIFNldCB0aGUgbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciB6ZGV0IGNhbGN1bGF0aW9uCisJCSAqIGJhc2VkIG9uIHRoZSBSYW1wIHZvbHRhZ2UgYW5kIEdhaW4gdXNlZAorCQkgKi8KKwkJdG9tdG9tLT56ZGV0X2dhaW5fbXVsX2ZhY3QgPSBUT01UT01fWkRFVF9NVUxfRkFDVE9SXzFYOworCQlicmVhazsKKwljYXNlIE1CSENfWkRFVF9HQUlOXzA6CisJCS8qIFNldCBHYWluIGF0IDF4ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9MX0FURVNULCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfSFBIX1JfQVRFU1QsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfTF9QQV9DVEwsIDB4NDIpOworCQkvKiBBbGxvdyAxMDB1cyBmb3IgZ2FpbiByZWdpc3RlcnMgdG8gc2V0dGxlICovCisJCXVzbGVlcF9yYW5nZSgxMDAsCisJCQkgICAgIDEwMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCWJyZWFrOworCWNhc2UgTUJIQ19aREVUX0dBSU5fVVBEQVRFXzFYOgorCQkvKgorCQkgKiBTZXQgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgemRldCBjYWxjdWxhdGlvbgorCQkgKiBiYXNlZCBvbiB0aGUgR2FpbiB2YWx1ZSB1c2VkCisJCSAqLworCQl0b210b20tPnpkZXRfZ2Fpbl9tdWxfZmFjdCA9IFRPTVRPTV9aREVUX01VTF9GQUNUT1JfMVg7CisJCWJyZWFrOworCWNhc2UgTUJIQ19aREVUX0dBSU5fMToKKwkJLyogU2V0IEdhaW4gYXQgMTB4ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9MX0FURVNULCAweDEwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfSFBIX1JfQVRFU1QsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfTF9QQV9DVEwsIDB4NDIpOworCQkvKiBBbGxvdyAxMDB1cyBmb3IgZ2FpbiByZWdpc3RlcnMgdG8gc2V0dGxlICovCisJCXVzbGVlcF9yYW5nZSgxMDAsCisJCQkgICAgIDEwMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisKKwkJLyoKKwkJICogU2V0IHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIHpkZXQgY2FsY3VsYXRpb24KKwkJICogYmFzZWQgb24gdGhlIEdhaW4gdmFsdWUgdXNlZAorCQkgKi8KKwkJdG9tdG9tLT56ZGV0X2dhaW5fbXVsX2ZhY3QgPSBUT01UT01fWkRFVF9NVUxfRkFDVE9SXzEwWDsKKwkJYnJlYWs7CisJY2FzZSBNQkhDX1pERVRfR0FJTl8yOgorCQkvKiBTZXQgR2FpbiBhdCAxMDB4ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9MX0FURVNULCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVE9NVE9NX0FfUlhfSFBIX1JfQVRFU1QsIDB4MTApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfTF9QQV9DVEwsIDB4NDMpOworCQkvKiBBbGxvdyAxMDB1cyBmb3IgZ2FpbiByZWdpc3RlcnMgdG8gc2V0dGxlICovCisJCXVzbGVlcF9yYW5nZSgxMDAsCisJCQkgICAgIDEwMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisKKwkJLyoKKwkJICogU2V0IHRoZSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIHpkZXQgY2FsY3VsYXRpb24KKwkJICogYmFzZWQgb24gdGhlIEdhaW4gdmFsdWUgdXNlZAorCQkgKi8KKwkJdG9tdG9tLT56ZGV0X2dhaW5fbXVsX2ZhY3QgPSBUT01UT01fWkRFVF9NVUxfRkFDVE9SXzEwMFg7CisJCWJyZWFrOworCWNhc2UgTUJIQ19aREVUX1JBTVBfRElTQUJMRToKKwkJLyogUmFtcCBIUEggTCAmIFIgYmFjayB0byBaZXJvICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMl9DVEwsIDB4MDApOworCQkvKiAweDY5IGZvciAxMDUgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIFBBIFJBTVAgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0I0X0NUTCwgMHg2OSk7CisJCS8qIFByb2dyYW0gdGhlIFBBIFJhbXAgdG8gRlNfMTZLLCBMIHNoaWZ0IDEgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IzX0NUTCwKKwkJCSAgICAgIDB4MSA8PCA0IHwgMHg2KTsKKwkJLyogUmVzZXQgdGhlIFBBIFJhbXAgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IxX0NUTCwgMHgxNyk7CisJCS8qCisJCSAqIENvbm5lY3QgdGhlIFBBIFJhbXAgdG8gUEEgY2hhaW4gYW5kIHJlbGVhc2UgcmVzZXQgd2l0aAorCQkgKiBrZWVwIGl0IGNvbm5lY3RlZC4KKwkJICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMV9DVEwsIDB4MDMpOworCQkvKiBTdGFydCB0aGUgUEEgcmFtcCBvbiBIUEggTCBhbmQgUiAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMLCAweDBBKTsKKwkJLyogUmFtcCBnZW5lcmF0b3IgdGFrZXMgfjMwbXMgdG8gc2V0dGxlIGRvd24gKi8KKwkJdXNsZWVwX3JhbmdlKFRPTVRPTV9IUEhfUEFfUkFNUF9ERUxBWSwKKwkJCSAgICAgVE9NVE9NX0hQSF9QQV9SQU1QX0RFTEFZICsKKwkJCSAgICAgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJYnJlYWs7CisJY2FzZSBNQkhDX1pERVRfSFBIUl9SQU1QX0RJU0FCTEU6CisJCS8qIFJhbXAgSFBIUiBiYWNrIHRvIFplcm8gKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IyX0NUTCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CNF9DVEwsIDB4NjkpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMLAorCQkJICAgICAgMHgxIDw8IDQgfCAweDYpOworCQkvKiBSZXNldCB0aGUgUEEgUmFtcCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMLCAweDE3KTsKKwkJLyoKKwkJICogQ29ubmVjdCB0aGUgUEEgUmFtcCB0byBQQSBjaGFpbiBhbmQgcmVsZWFzZSByZXNldCB3aXRoCisJCSAqIGtlZXAgaXQgY29ubmVjdGVkLgorCQkgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IxX0NUTCwgMHgwMyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMl9DVEwsIDB4MDgpOworCQkvKiBSYW1wIGdlbmVyYXRvciB0YWtlcyB+MzBtcyB0byBzZXR0bGUgZG93biAqLworCQl1c2xlZXBfcmFuZ2UoVE9NVE9NX0hQSF9QQV9SQU1QX0RFTEFZLAorCQkJICAgICBUT01UT01fSFBIX1BBX1JBTVBfREVMQVkgKworCQkJICAgICBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQlicmVhazsKKwljYXNlIE1CSENfWkRFVF9IUEhMX1JBTVBfRElTQUJMRToKKwkJLyogUmFtcCBiYWNrIHRvIFplcm8gKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IyX0NUTCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CNF9DVEwsIDB4NjkpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjNfQ1RMLAorCQkJICAgICAgMHgxIDw8IDQgfCAweDYpOworCQkvKiBSZXNldCB0aGUgUEEgUmFtcCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjFfQ1RMLCAweDE3KTsKKwkJLyoKKwkJICogQ29ubmVjdCB0aGUgUEEgUmFtcCB0byBQQSBjaGFpbiBhbmQgcmVsZWFzZSByZXNldCB3aXRoCisJCSAqIGtlZXAgaXQgY29ubmVjdGVkLgorCQkgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IxX0NUTCwgMHgwMyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMl9DVEwsIDB4MDIpOworCQkvKiBSYW1wIGdlbmVyYXRvciB0YWtlcyB+MzBtcyB0byBzZXR0bGUgZG93biAqLworCQl1c2xlZXBfcmFuZ2UoVE9NVE9NX0hQSF9QQV9SQU1QX0RFTEFZLAorCQkJICAgICBUT01UT01fSFBIX1BBX1JBTVBfREVMQVkgKworCQkJICAgICBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQlicmVhazsKKwljYXNlIE1CSENfWkRFVF9IUEhSX1BBX0RJU0FCTEU6CisJCS8qIERpc2FibGUgUEEgKi8KKwkJd2NkOXh4eF9lbmFibGVfc3RhdGljX3BhKG1iaGMsIEhQSF9QQV9ESVNBQkxFLCBIUEhfUEFfUik7CisJCWJyZWFrOworCWNhc2UgTUJIQ19aREVUX1BBX0RJU0FCTEU6CisJCS8qIERpc2FibGUgUEEgKi8KKwkJaWYgKCFtYmhjLT5ocGhfcGFfZGFjX3N0YXRlICYmCisJCQkoISh0ZXN0X2JpdChNQkhDX0VWRU5UX1BBX0hQSEwsICZtYmhjLT5ldmVudF9zdGF0ZSkgfHwKKwkJCXRlc3RfYml0KE1CSENfRVZFTlRfUEFfSFBIUiwgJm1iaGMtPmV2ZW50X3N0YXRlKSkpKQorCQkJd2NkOXh4eF9lbmFibGVfc3RhdGljX3BhKG1iaGMsIEhQSF9QQV9ESVNBQkxFLAorCQkJCQkJIEhQSF9QQV9MX1IpOworCQllbHNlIGlmICghKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU4pICYgMHgxMCkpCisJCQl3Y2Q5eHh4X2VuYWJsZV9zdGF0aWNfcGEobWJoYywgSFBIX1BBX0VOQUJMRSwgSFBIX1BBX1IpOworCisJCS8qIFR1cm4gb2ZmIFBBIHJhbXAgZ2VuZXJhdG9yICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CMV9DVEwsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX1BBX1JBTVBfQjJfQ1RMLCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19QQV9SQU1QX0IzX0NUTCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfUEFfUkFNUF9CNF9DVEwsIDB4MDApOworCisJCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJCXdjZDl4eHhfcmVzdG9yZV9yZWdpc3RlcnMoY29kZWMsICZ0b210b20tPnJlZ19zYXZlX3Jlc3RvcmUpOworCQlicmVhazsKKwl9CisjdW5kZWYgX193cgorCisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsY3VsYXRlIGZpbmFsIGltcGVkYW5jZSB2YWx1ZXMgZm9yIEhQSCBsZWZ0IGFuZCByaWdodCBiYXNlZCBvbiBmb3JtdWxhZSAqLworc3RhdGljIHZvaWQgdG9tdG9tX2NvbXB1dGVfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHMxNiAqbCwgczE2ICpyLAorCQkJCSAgICAgdWludDMyX3QgKnpsLCB1aW50MzJfdCAqenIpCit7CisJczY0IHpsbiwgenJuOworCWludCB6bGQsIHpyZDsKKwlzNjQgcmwgPSAwLCByciA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tOworCisJaWYgKCFtYmhjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1ldGVycyBtYmhjID0gJXBLXG4iLAorCQkJX19mdW5jX18sICBtYmhjKTsKKwkJcmV0dXJuOworCX0KKwljb2RlYyA9IG1iaGMtPmNvZGVjOworCXRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGwgJiYgemwpIHsKKwkJemxuID0gKHM2NCkgKGxbMV0gLSBsWzBdKSAqIHRvbXRvbS0+emRldF9nYWluX211bF9mYWN0OworCQl6bGQgPSAobFsyXSAtIGxbMF0pOworCQlpZiAoemxkKQorCQkJcmwgPSBkaXZfczY0KHpsbiwgemxkKTsKKwkJZWxzZQorCQkJLyogSWYgTDAgYW5kIEwyIGFyZSBzYW1lLCBaIGhhcyB0byBiZSBvbiBab25lIDMuCisJCQkgKiBBc3NpZ24gYSBkZWZhdWx0IHZhbHVlIHNvIHRoYXQgYXRsZWFzdCB0aGUgdmFsdWUKKwkJCSAqIGlzIHJlYWQgYWdhaW4gd2l0aCBSYW1wLXVwCisJCQkgKi8KKwkJCXJsID0gVE9NVE9NX1pERVRfWk9ORV8zX0RFRkFVTFRfVkFMOworCisJCS8qIDMyLWJpdCBMU0JzIGFyZSBlbm91Z2ggdG8gaG9sZCBJbXBlZGFuY2UgdmFsdWVzICovCisJCSp6bCA9ICh1MzIpIHJsOworCX0KKwlpZiAociAmJiB6cikgeworCQl6cm4gPSAoczY0KSAoclsxXSAtIHJbMF0pICogdG9tdG9tLT56ZGV0X2dhaW5fbXVsX2ZhY3Q7CisJCXpyZCA9IChyWzJdIC0gclswXSk7CisJCWlmICh6cmQpCisJCQlyciA9IGRpdl9zNjQoenJuLCB6cmQpOworCQllbHNlCisJCQkvKiBJZiBSMCBhbmQgUjIgYXJlIHNhbWUsIFogaGFzIHRvIGJlIG9uIFpvbmUgMy4KKwkJCSAqIEFzc2lnbiBhIGRlZmF1bHQgdmFsdWUgc28gdGhhdCBhdGxlYXN0IHRoZSB2YWx1ZQorCQkJICogaXMgcmVhZCBhZ2FpbiB3aXRoIFJhbXAtdXAKKwkJCSAqLworCQkJcnIgPSBUT01UT01fWkRFVF9aT05FXzNfREVGQVVMVF9WQUw7CisKKwkJLyogMzItYml0IExTQnMgYXJlIGVub3VnaCB0byBob2xkIEltcGVkYW5jZSB2YWx1ZXMgKi8KKwkJKnpyID0gKHUzMikgcnI7CisJfQorfQorCisvKgorICogQ2FsY3VsYXRlIGVycm9yIGFwcHJveGltYXRpb24gb2YgaW1wZWRhbmNlIHZhbHVlcyBmb3IgSFBIIGxlZnQKKyAqIGFuZCBIUEggcmlnaHQgYmFzZWQgb24gUUZ1c2UgdmFsdWVzCisgKi8KK3N0YXRpYyB2b2lkIHRvbXRvbV96ZGV0X2Vycm9yX2FwcHJveChzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLCB1aW50MzJfdCAqemwsCisJCQkJICAgICB1aW50MzJfdCAqenIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tOworCXM4IHExX3QsIHEyX3Q7CisJczggcTFfbSwgcTJfbTsKKwlzOCBxMSwgcTI7CisJdTggZGl2X3NoaWZ0OworCWludCBybF9hbHBoYSA9IDAsIHJyX2FscGhhID0gMDsKKwlpbnQgcmxfYmV0YSA9IDAsIHJyX2JldGEgPSAwOworCXU2NCBybCA9IDAsIHJyID0gMDsKKwljb25zdCBpbnQgbXVsdF9mYWN0b3IgPSBUT01UT01fWkRFVF9FUlJPUl9BUFBST1hfTVVMX0ZBQ1RPUjsKKwljb25zdCBpbnQgc2hpZnQgPSBUT01UT01fWkRFVF9FUlJPUl9BUFBST1hfU0hJRlQ7CisKKwlpZiAoIXpsIHx8ICF6ciB8fCAhbWJoYykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMgemwgPSAlcEsgenIgPSAlcEssIG1iaGMgPSAlcEtcbiIsCisJCQlfX2Z1bmNfXywgemwsIHpyLCBtYmhjKTsKKwkJcmV0dXJuOworCX0KKwljb2RlYyA9IG1iaGMtPmNvZGVjOworCXRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKCh0b210b20tPnpkZXRfZ2Fpbl9tdWxfZmFjdCA9PSBUT01UT01fWkRFVF9NVUxfRkFDVE9SXzFYKSB8fAorCSAgICAodG9tdG9tLT56ZGV0X2dhaW5fbXVsX2ZhY3QgPT0gVE9NVE9NX1pERVRfTVVMX0ZBQ1RPUl8xMFgpKSB7CisJCXExX3QgPSAoKHNuZF9zb2NfcmVhZChjb2RlYywgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQwKSAmCisJCQkweDMpIDw8IDB4NSk7CisJCXExX3QgfD0gKChzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMSkgJgorCQkJMHhGOCkgPj4gMHgzKTsKKwkJcTJfdCA9ICgoc25kX3NvY19yZWFkKGNvZGVjLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDEpICYKKwkJCTB4NykgPDwgMHg0KTsKKwkJcTJfdCB8PSAoKHNuZF9zb2NfcmVhZChjb2RlYywgVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQyKSAmCisJCQkweEYwKSA+PiAweDQpOworCQkvKiBUYWtlIG91dCB0aGUgbnVtZXJpYyBwYXJ0IG9mIHRoZSBRZnVzZSB2YWx1ZSAqLworCQlxMV9tID0gcTFfdCAmIDB4M0Y7CisJCXEyX20gPSBxMl90ICYgMHgzRjsKKwkJLyogQ2hlY2sgdGhlIHNpZ24gcGFydCBvZiB0aGUgUWZ1c2UgYW5kIGFkanVzdCB2YWx1ZSAqLworCQlxMSA9IChxMV90ICYgMHg0MCkgPyAtcTFfbSA6IHExX207CisJCXEyID0gKHEyX3QgJiAweDQwKSA/IC1xMl9tIDogcTJfbTsKKwkJZGl2X3NoaWZ0ID0gMTsKKwl9IGVsc2UgeworCQlxMV90ID0gKChzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1FGVVNFX0RBVEFfT1VUMikgJgorCQkJMHhGKSA8PCAweDIpOworCQlxMV90IHw9ICgoc25kX3NvY19yZWFkKGNvZGVjLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDMpICYKKwkJCTB4QzApID4+IDB4Nik7CisJCXEyX3QgPSAoc25kX3NvY19yZWFkKGNvZGVjLCBUT01UT01fQV9RRlVTRV9EQVRBX09VVDMpICYgMHgzRik7CisJCS8qIFRha2Ugb3V0IHRoZSBudW1lcmljIHBhcnQgb2YgdGhlIFFmdXNlIHZhbHVlICovCisJCXExX20gPSBxMV90ICYgMHgxRjsKKwkJcTJfbSA9IHEyX3QgJiAweDFGOworCQkvKiBDaGVjayB0aGUgc2lnbiBwYXJ0IG9mIHRoZSBRZnVzZSBhbmQgYWRqdXN0IHZhbHVlICovCisJCXExID0gKHExX3QgJiAweDIwKSA/IC1xMV9tIDogcTFfbTsKKwkJcTIgPSAocTJfdCAmIDB4MjApID8gLXEyX20gOiBxMl9tOworCQlkaXZfc2hpZnQgPSAwOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBxZnVzZTEgPSAlZCwgcWZ1c2UyID0gJWRcbiIsCisJCV9fZnVuY19fLCBxMSwgcTIpOworCWlmICghcTEgJiYgIXEyKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBxZnVzZTEgYW5kIHFmdXNlMiBhcmUgMC4gRXhpdGluZ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXNlIG11bHRpcGxpY2F0aW9uIGFuZCBzaGlmdCB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBtYXRoCisJICogVGhlIFogdmFsdWUgaXMgY2FsY3VsYXRlZCB3aXRoIHRoZSBiZWxvdyBmb3JtdWxhZSB1c2luZworCSAqIHRoZSBRZnVzZSB2YWx1ZS0KKwkgKiB6bCA9IHpsICogWzEgLSB7KFExIC8gZGl2KSAvIDEwMH1dIChJbmNsdWRlIHNpZ24gZm9yIFExKQorCSAqIHpyID0genIgKiBbMSAtIHsoUTIgLyBkaXYpIC8gMTAwfV0gKEluY2x1ZGUgc2lnbiBmb3IgUTIpCisJICogV2UgbXVsdGlwbHkgYnkgNjU1MzYgYW5kIHNoaWZ0IDE2IHRpbWVzIHRvIGdldCB0aGUgYXBwcm94IHJlc3VsdAorCSAqIGRpdiA9IDQgZm9yIDF4IGdhaW4sIGRpdiA9IDIgZm9yIDEweC8xMDB4IGdhaW4KKwkgKi8KKwkvKiBRMS80ICovCisJcmxfYWxwaGEgPSBxMSA+PiBkaXZfc2hpZnQ7CisJcmxfYWxwaGEgPSAxMDAgLSBybF9hbHBoYTsKKwkvKiB7cmxfYWxwaGEvMTAwfSAqIDY1NTM2ICovCisJcmxfYmV0YSA9IHJsX2FscGhhICogbXVsdF9mYWN0b3I7CisJcmwgPSAodTY0KSAqemwgKiBybF9iZXRhOworCS8qIHJsLzY1NTM2ICovCisJcmwgPSAodTY0KSBybCA+PiBzaGlmdDsKKworCXJyX2FscGhhID0gcTIgPj4gZGl2X3NoaWZ0OworCXJyX2FscGhhID0gMTAwIC0gcnJfYWxwaGE7CisJcnJfYmV0YSA9IHJyX2FscGhhICogbXVsdF9mYWN0b3I7CisJcnIgPSAodTY0KSAqenIgKiBycl9iZXRhOworCXJyID0gKHU2NCkgcnIgPj4gc2hpZnQ7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogcmwgPSAweCVsbHggKCVsbGQpIFx0IHJyID0gMHglbGx4ICglbGxkKVxuIiwKKwkJX19mdW5jX18sIHJsLCBybCwgcnIsIHJyKTsKKworCSp6bCA9ICh1MzIpIHJsOworCSp6ciA9ICh1MzIpIHJyOworfQorCitzdGF0aWMgZW51bSB3Y2Q5eHh4X2NkY190eXBlIHRvbXRvbV9nZXRfY2RjX3R5cGUodm9pZCkKK3sKKwlyZXR1cm4gV0NEOVhYWF9DRENfVFlQRV9UT01UT007Cit9CisKK3N0YXRpYyBib29sIHRvbXRvbV9tYmhjX2luc19yZW1fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gIShzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0lOU0VSVF9ERVRfU1RBVFVTKSAmCisJCQkgICAgKDEgPDwgNCkpOworfQorCitzdGF0aWMgdm9pZCB0b210b21fbWJoY19taWNiX3B1bGxkb3duX2N0cmwoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkJICAgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlpZiAoIWVuYWJsZSkgeworCQkvKiBSZW1vdmUgYXV0b21hdGljIHB1bGxkb3duIG9uIG1pY2JpYXMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY2ZpbHRfY3RsLAorCQkJCSAgICAweDAxLCAweDAwKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgYXV0b21hdGljIHB1bGxkb3duIG9uIG1pY2JpYXMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY2ZpbHRfY3RsLAorCQkJCSAgICAweDAxLCAweDAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRvbXRvbV9jb2RlY19ocGhfYXV0b19wdWxsX2Rvd24oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHdjZDl4eHggKnRvbXRvbV9jb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoVE9NVE9NX0lTXzFfMCh0b210b21fY29yZS0+dmVyc2lvbikpCisJCXJldHVybjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyBhdXRvIHB1bGwgZG93blxuIiwgX19mdW5jX18sCisJCQllbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9SWF9IUEhfTF9URVNULCAweDA4LCAweDA4KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUlhfSFBIX1JfVEVTVCwgMHgwOCwgMHgwOCk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUlhfSFBIX0xfVEVTVCwgMHgwOCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX1JYX0hQSF9SX1RFU1QsIDB4MDgsIDB4MDApOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfY2IgbWJoY19jYiA9IHsKKwkuZ2V0X2NkY190eXBlID0gdG9tdG9tX2dldF9jZGNfdHlwZSwKKwkuc2V0dXBfemRldCA9IHRvbXRvbV9zZXR1cF96ZGV0LAorCS5jb21wdXRlX2ltcGVkYW5jZSA9IHRvbXRvbV9jb21wdXRlX2ltcGVkYW5jZSwKKwkuemRldF9lcnJvcl9hcHByb3ggPSB0b210b21femRldF9lcnJvcl9hcHByb3gsCisJLmluc2VydF9yZW1fc3RhdHVzID0gdG9tdG9tX21iaGNfaW5zX3JlbV9zdGF0dXMsCisJLm1pY2JpYXNfcHVsbGRvd25fY3RybCA9IHRvbXRvbV9tYmhjX21pY2JfcHVsbGRvd25fY3RybCwKKwkuY29kZWNfcmNvX2N0cmwgPSB0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwsCisJLmhwaF9hdXRvX3B1bGxkb3duX2N0cmwgPSB0b210b21fY29kZWNfaHBoX2F1dG9fcHVsbF9kb3duLAorCS5nZXRfaHdkZXBfZndfY2FsID0gdG9tdG9tX2dldF9od2RlcF9md19jYWwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19pbnRyIGNkY19pbnRyX2lkcyA9IHsKKwkucG9sbF9wbHVnX3JlbSA9IFdDRDlYWFhfSVJRX01CSENfUkVNT1ZBTCwKKwkuc2hvcnRhdmdfY29tcGxldGUgPSBXQ0Q5WFhYX0lSUV9NQkhDX1NIT1JUX1RFUk0sCisJLnBvdGVudGlhbF9idXR0b25fcHJlc3MgPSBXQ0Q5WFhYX0lSUV9NQkhDX1BSRVNTLAorCS5idXR0b25fcmVsZWFzZSA9IFdDRDlYWFhfSVJRX01CSENfUkVMRUFTRSwKKwkuZGNlX2VzdF9jb21wbGV0ZSA9IFdDRDlYWFhfSVJRX01CSENfUE9URU5USUFMLAorCS5pbnNlcnRpb24gPSBXQ0Q5WFhYX0lSUV9NQkhDX0lOU0VSVElPTiwKKwkuaHBoX2xlZnRfb2NwID0gV0NEOVhYWF9JUlFfSFBIX1BBX09DUExfRkFVTFQsCisJLmhwaF9yaWdodF9vY3AgPSBXQ0Q5WFhYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKKwkuaHNfamFja19zd2l0Y2ggPSBXQ0Q5MzMwX0lSUV9NQkhDX0pBQ0tfU1dJVENILAorfTsKKworc3RhdGljIGludCB0b210b21fcG9zdF9yZXNldF9jYihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b207CisJaW50IHJjb19jbGtfcmF0ZTsKKworCWNvZGVjID0gKHN0cnVjdCBzbmRfc29jX2NvZGVjICopKHdjZDl4eHgtPnNzcl9wcml2KTsKKwl0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXNuZF9zb2NfY2FyZF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvZGVjLT5jb21wb25lbnQuY2FyZCwgMSk7CisJY2xlYXJfYml0KEJVU19ET1dOLCAmdG9tdG9tLT5zdGF0dXNfbWFzayk7CisKKwltdXRleF9sb2NrKCZ0b210b20tPmNvZGVjX211dGV4KTsKKworCXRvbXRvbV91cGRhdGVfcmVnX2RlZmF1bHRzKGNvZGVjKTsKKwlpZiAod2NkOXh4eC0+bWNsa19yYXRlID09IFRPTVRPTV9NQ0xLX0NMS18xMlAyODhNSFopCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NISVBfQ1RMLCAweDA2LCAweDApOworCWVsc2UgaWYgKHdjZDl4eHgtPm1jbGtfcmF0ZSA9PSBUT01UT01fTUNMS19DTEtfOVA2TUhaKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9DSElQX0NUTCwgMHgwNiwgMHgyKTsKKwl0b210b21fY29kZWNfaW5pdF9yZWcoY29kZWMpOworCisJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKKworCXJldCA9IHRvbXRvbV9oYW5kbGVfcGRhdGEodG9tdG9tKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXByX2VycigiJXM6IGJhZCBwZGF0YVxuIiwgX19mdW5jX18pOworCisJdG9tdG9tX2luaXRfc2xpbV9zbGF2ZV9jZmcoY29kZWMpOworCXRvbXRvbV9zbGltX2ludGVyZmFjZV9pbml0X3JlZyhjb2RlYyk7CisJd2NkX2NwZV9zc3JfZXZlbnQodG9tdG9tLT5jcGVfY29yZSwgV0NEX0NQRV9CVVNfVVBfRVZFTlQpOworCXdjZDl4eHhfcmVzbWdyX3Bvc3Rfc3NyKCZ0b210b20tPnJlc21ncik7CisKKwlpZiAodG9tdG9tLT5tYmhjX3N0YXJ0ZWQpIHsKKwkJd2NkOXh4eF9tYmhjX2RlaW5pdCgmdG9tdG9tLT5tYmhjKTsKKwkJdG9tdG9tLT5tYmhjX3N0YXJ0ZWQgPSBmYWxzZTsKKworCQlpZiAod2NkOXh4eC0+bWNsa19yYXRlID09IFRPTVRPTV9NQ0xLX0NMS18xMlAyODhNSFopCisJCQlyY29fY2xrX3JhdGUgPSBUT01UT01fTUNMS19DTEtfMTJQMjg4TUhaOworCQllbHNlCisJCQlyY29fY2xrX3JhdGUgPSBUT01UT01fTUNMS19DTEtfOVA2TUhaOworCisJCXJldCA9IHdjZDl4eHhfbWJoY19pbml0KCZ0b210b20tPm1iaGMsICZ0b210b20tPnJlc21nciwgY29kZWMsCisJCQkJCXRvbXRvbV9lbmFibGVfbWJoY19taWNiaWFzLAorCQkJCQkmbWJoY19jYiwgJmNkY19pbnRyX2lkcywKKwkJCQkJcmNvX2Nsa19yYXRlLCBUT01UT01fWkRFVF9TVVBQT1JURUQpOworCQlpZiAocmV0KQorCQkJcHJfZXJyKCIlczogbWJoYyBpbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWVsc2UKKwkJCXRvbXRvbV9oc19kZXRlY3QoY29kZWMsIHRvbXRvbS0+bWJoYy5tYmhjX2NmZyk7CisJfQorCisJaWYgKHRvbXRvbS0+bWFjaGluZV9jb2RlY19ldmVudF9jYikKKwkJdG9tdG9tLT5tYWNoaW5lX2NvZGVjX2V2ZW50X2NiKGNvZGVjLAorCQkJCSAgICAgICBXQ0Q5WFhYX0NPREVDX0VWRU5UX0NPREVDX1VQKTsKKworCXRvbXRvbV9jbGVhbnVwX2lycXModG9tdG9tKTsKKwlyZXQgPSB0b210b21fc2V0dXBfaXJxcyh0b210b20pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXR1cCBpcnE6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qCisJICogQWZ0ZXIgU1NSLCB0aGUgcWZ1c2Ugc2Vuc2luZyBpcyBsb3N0LgorCSAqIFBlcmZvcm0gcWZ1c2Ugc2Vuc2luZyBhZ2FpbiBhZnRlciBTU1IKKwkgKiBoYW5kbGluZyBpcyBmaW5pc2hlZC4KKwkgKi8KKwl0b210b21fZW5hYmxlX3FmdXNlX3NlbnNpbmcoY29kZWMpOworCW11dGV4X3VubG9jaygmdG9tdG9tLT5jb2RlY19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqdG9tdG9tX2dldF9hZmVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKQoreworCXN0cnVjdCB0b210b21fcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChjb25maWdfdHlwZSkgeworCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHOgorCQlyZXR1cm4gJnByaXYtPnNsaW1idXNfc2xhdmVfY2ZnOworCWNhc2UgQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHOgorCQlyZXR1cm4gJnRvbXRvbV9hdWRpb19yZWdfY2ZnOworCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6CisJCXJldHVybiAmdG9tdG9tX3NsaW1idXNfc2xhdmVfcG9ydF9jZmc7CisJY2FzZSBBRkVfQUFOQ19WRVJTSU9OOgorCQlyZXR1cm4gJnRvbXRvbV9jZGNfYWFuY192ZXJzaW9uOworCWNhc2UgQUZFX0NMSVBfQkFOS19TRUw6CisJCXJldHVybiAmY2xpcF9iYW5rX3NlbDsKKwljYXNlIEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHOgorCQlyZXR1cm4gJnRvbXRvbV9jbGlwX3JlZ19jZmc7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogVW5rbm93biBjb25maWdfdHlwZSAweCV4XG4iLCBfX2Z1bmNfXywgY29uZmlnX3R5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2NkOXh4eF9yZWdfYWRkcmVzcyB0b210b21fcmVnX2FkZHJlc3MgPSB7CisJLm1pY2JfNF9tYmhjID0gVE9NVE9NX0FfTUlDQl80X01CSEMsCisJLm1pY2JfNF9pbnRfcmJpYXMgPSBUT01UT01fQV9NSUNCXzRfSU5UX1JCSUFTLAorCS5taWNiXzRfY3RsID0gVE9NVE9NX0FfTUlDQl80X0NUTCwKK307CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9zc3JfcmVnaXN0ZXIoc3RydWN0IHdjZDl4eHggKmNvbnRyb2wsCisJCQkJaW50ICgqZGV2aWNlX2Rvd25fY2IpKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KSwKKwkJCQlpbnQgKCpkZXZpY2VfdXBfY2IpKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KSwKKwkJCQl2b2lkICpwcml2KQoreworCWNvbnRyb2wtPmRldl9kb3duID0gZGV2aWNlX2Rvd25fY2I7CisJY29udHJvbC0+cG9zdF9yZXNldCA9IGRldmljZV91cF9jYjsKKwljb250cm9sLT5zc3JfcHJpdiA9IHByaXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0b210b21fMV9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzEiLCBOVUxMLCBUT01UT01fQV9UWF8xX0dBSU4sIDcsIDAsCisJCQkgICB0b210b21fY29kZWNfZW5hYmxlX2FkYywKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMyIiwgTlVMTCwgVE9NVE9NX0FfVFhfMl9HQUlOLCA3LCAwLAorCQkJICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9hZGMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDMyIsIE5VTEwsIFRPTVRPTV9BX1RYXzNfR0FJTiwgNywgMCwKKwkJCSAgIHRvbXRvbV9jb2RlY19lbmFibGVfYWRjLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzQiLCBOVUxMLCBUT01UT01fQV9UWF80X0dBSU4sIDcsIDAsCisJCQkgICB0b210b21fY29kZWNfZW5hYmxlX2FkYywKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREM1IiwgTlVMTCwgVE9NVE9NX0FfVFhfNV9HQUlOLCA3LCAwLAorCQkJICAgdG9tdG9tX2NvZGVjX2VuYWJsZV9hZGMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDNiIsIE5VTEwsIFRPTVRPTV9BX1RYXzZfR0FJTiwgNywgMCwKKwkJCSAgIHRvbXRvbV9jb2RlY19lbmFibGVfYWRjLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICp0b210b21fY29kZWNfZmluZF9yZWd1bGF0b3Ioc3RydWN0IHNuZF9zb2NfY29kZWMgKmNkYywKKwkJCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gZGV2X2dldF9kcnZkYXRhKGNkYy0+ZGV2LT5wYXJlbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvcmUtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7CisJCWlmIChjb3JlLT5zdXBwbGllc1tpXS5zdXBwbHkgJiYKKwkJICAgICFzdHJjbXAoY29yZS0+c3VwcGxpZXNbaV0uc3VwcGx5LCBuYW1lKSkKKwkJCXJldHVybiBjb3JlLT5zdXBwbGllc1tpXS5jb25zdW1lcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB3Y2RfY3BlX2NvcmUgKnRvbXRvbV9jb2RlY19nZXRfY3BlX2NvcmUoCisJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJldHVybiBwcml2LT5jcGVfY29yZTsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfZmxsX2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisKKwlpZiAoIWNvZGVjIHx8ICFjb2RlYy0+Y29udHJvbF9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29kZWMgaGFuZGxlLCAlcEtcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY29kZWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Y2Q5eHh4ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcywgbWNsa19yYXRlID0gJWRcbiIsCisJCV9fZnVuY19fLCAoZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpLAorCQl3Y2Q5eHh4LT5tY2xrX3JhdGUpOworCisJc3dpdGNoICh3Y2Q5eHh4LT5tY2xrX3JhdGUpIHsKKwljYXNlIFRPTVRPTV9NQ0xLX0NMS185UDZNSFo6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0ZMTF9OUkVGLAorCQkJCSAgICAweDFGLCAweDE1KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfRkxMX0tEQ09fVFVORSwKKwkJCQkgICAgMHgwNywgMHgwNik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0ZMTF9MT0NLX1RIUkVTSCwgMHhEMSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0ZMTF9MT0NLX0RFVF9DT1VOVCwKKwkJCSAgICAgIDB4NDApOworCQlicmVhazsKKwljYXNlIFRPTVRPTV9NQ0xLX0NMS18xMlAyODhNSFo6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0ZMTF9OUkVGLAorCQkJCSAgICAweDFGLCAweDExKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfRkxMX0tEQ09fVFVORSwKKwkJCQkgICAgMHgwNywgMHgwNSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0ZMTF9MT0NLX1RIUkVTSCwgMHhCMSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRPTVRPTV9BX0ZMTF9MT0NLX0RFVF9DT1VOVCwKKwkJCSAgICAgIDB4NDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfc2xpbV9yZXNlcnZlX2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdTMyIGJ3X29wcywgYm9vbCBjb21taXQpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvZGVjXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoIXdjZDl4eHgpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcGFyZW50IGRydl9kYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gd2NkOXh4eF9zbGltX3Jlc2VydmVfYncod2NkOXh4eCwgYndfb3BzLCBjb21taXQpOworfQorCitzdGF0aWMgaW50IHRvbXRvbV9jb2RlY192b3RlX21heF9idyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlib29sIHZvdGUpCit7CisJdTMyIGJ3X29wczsKKworCWlmICh2b3RlKQorCQlid19vcHMgPSBTTElNX0JXX0NMS19HRUFSXzk7CisJZWxzZQorCQlid19vcHMgPSBTTElNX0JXX1VOVk9URTsKKworCXJldHVybiB0b210b21fY29kZWNfc2xpbV9yZXNlcnZlX2J3KGNvZGVjLAorCQkJYndfb3BzLCB0cnVlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl9jYiByZXNtZ3JfY2IgPSB7CisJLmNkY19yY29fY3RybCA9IHRvbXRvbV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCwKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NwZV9lcnJfaXJxX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWVudW0gY3BlX2Vycl9pcnFfY250bF90eXBlIGNudGxfdHlwZSwgdTggKnN0YXR1cykKK3sKKwlzd2l0Y2ggKGNudGxfdHlwZSkgeworCWNhc2UgQ1BFX0VSUl9JUlFfTUFTSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgVE9NVE9NX0FfU1ZBU1NfSU5UX01BU0ssCisJCQkJICAgIDB4M0YsIDB4M0YpOworCQlicmVhazsKKwljYXNlIENQRV9FUlJfSVJRX1VOTUFTSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgVE9NVE9NX0FfU1ZBU1NfSU5UX01BU0ssCisJCQkJICAgIDB4M0YsIDB4MEMpOworCQlicmVhazsKKwljYXNlIENQRV9FUlJfSVJRX0NMRUFSOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCSAgICBUT01UT01fQV9TVkFTU19JTlRfQ0xSLAorCQkJCSAgICAweDNGLCAweDNGKTsKKwkJYnJlYWs7CisJY2FzZSBDUEVfRVJSX0lSUV9TVEFUVVM6CisJCWlmICghc3RhdHVzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSpzdGF0dXMgPSBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJICAgICAgIFRPTVRPTV9BX1NWQVNTX0lOVF9TVEFUVVMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfY3BlX2NkY19jYiBjcGVfY2IgPSB7CisJLmNkY19jbGtfZW4gPSB0b210b21fY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwsCisJLmNwZV9jbGtfZW4gPSB0b210b21fY29kZWNfZmxsX2VuYWJsZSwKKwkubGFiX2NkY19jaF9jdGwgPSB0b210b21fY29kZWNfZW5hYmxlX3NsaW10eF9tYWQsCisJLmNkY19leHRfY2xrID0gdG9tdG9tX2NvZGVjX2V4dF9jbGtfZW4sCisJLmJ1c192b3RlX2J3ID0gdG9tdG9tX2NvZGVjX3ZvdGVfbWF4X2J3LAorCS5jcGVfZXJyX2lycV9jb250cm9sID0gdG9tdG9tX2NwZV9lcnJfaXJxX2NvbnRyb2wsCit9OworCitzdGF0aWMgc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSBjcGVfc3ZjX3BhcmFtcyA9IHsKKwkudmVyc2lvbiA9IDAsCisJLnF1ZXJ5X2ZyZXFfcGxhbnNfY2IgPSBOVUxMLAorCS5jaGFuZ2VfZnJlcV9wbGFuX2NiID0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgdG9tdG9tX2NwZV9pbml0aWFsaXplKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2RfY3BlX3BhcmFtcyBjcGVfcGFyYW1zOworCisJbWVtc2V0KCZjcGVfcGFyYW1zLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHdjZF9jcGVfcGFyYW1zKSk7CisJY3BlX3BhcmFtcy5jb2RlYyA9IGNvZGVjOworCWNwZV9wYXJhbXMuZ2V0X2NwZV9jb3JlID0gdG9tdG9tX2NvZGVjX2dldF9jcGVfY29yZTsKKwljcGVfcGFyYW1zLmNkY19jYiA9ICZjcGVfY2I7CisJY3BlX3BhcmFtcy5kYmdfbW9kZSA9IGNwZV9kZWJ1Z19tb2RlOworCWNwZV9wYXJhbXMuY2RjX21ham9yX3ZlciA9IENQRV9TVkNfQ09ERUNfVE9NVE9NOworCWNwZV9wYXJhbXMuY2RjX21pbm9yX3ZlciA9IENQRV9TVkNfQ09ERUNfVjFQMDsKKwljcGVfcGFyYW1zLmNkY19pZCA9IENQRV9TVkNfQ09ERUNfVE9NVE9NOworCisJY3BlX3BhcmFtcy5jZGNfaXJxX2luZm8uY3BlX2VuZ2luZV9pcnEgPQorCQkJV0NEOTMzMF9JUlFfU1ZBU1NfRU5HSU5FOworCWNwZV9wYXJhbXMuY2RjX2lycV9pbmZvLmNwZV9lcnJfaXJxID0KKwkJCVdDRDkzMzBfSVJRX1NWQVNTX0VSUl9FWENFUFRJT047CisJY3BlX3BhcmFtcy5jZGNfaXJxX2luZm8uY3BlX2ZhdGFsX2lycXMgPQorCQkJVE9NVE9NX0NQRV9GQVRBTF9JUlFTOworCisJY3BlX3N2Y19wYXJhbXMuY29udGV4dCA9IGNvZGVjOworCWNwZV9wYXJhbXMuY3BlX3N2Y19wYXJhbXMgPSAmY3BlX3N2Y19wYXJhbXM7CisKKwl0b210b20tPmNwZV9jb3JlID0gd2NkX2NwZV9pbml0KCJjcGUiLCBjb2RlYywKKwkJCQkJJmNwZV9wYXJhbXMpOworCWlmIChJU19FUlJfT1JfTlVMTCh0b210b20tPmNwZV9jb3JlKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBlbmFibGUgQ1BFXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b210b21fY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19jb21wb25lbnRfdG9fY29kZWMoY29tcG9uZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJaW50IHJldCA9IDA7CisJaW50IGksIHJjb19jbGtfcmF0ZTsKKwl2b2lkICpwdHIgPSBOVUxMOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzOworCXN0cnVjdCBjbGsgKndjZF9leHRfY2xrID0gTlVMTDsKKworCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwl0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdjZDl4eHhfc3NyX3JlZ2lzdGVyKGNvbnRyb2wsIHRvbXRvbV9kZXZpY2VfZG93biwKKwkJCSAgICAgdG9tdG9tX3Bvc3RfcmVzZXRfY2IsICh2b2lkICopY29kZWMpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9ERUNJTUFUT1JTOyBpKyspIHsKKwkJdHhfaHBmX3dvcmtbaV0udG9tdG9tID0gdG9tdG9tOworCQl0eF9ocGZfd29ya1tpXS5kZWNpbWF0b3IgPSBpICsgMTsKKwkJdHhfaHBmX3dvcmtbaV0udHhfaHBmX2J5cGFzcyA9IGZhbHNlOworCQlJTklUX0RFTEFZRURfV09SSygmdHhfaHBmX3dvcmtbaV0uZHdvcmssCisJCQl0eF9ocGZfY29ybmVyX2ZyZXFfY2FsbGJhY2spOworCX0KKworCXdjZDl4eHggPSBjb250cm9sOworCWlmICghb2ZfZmluZF9wcm9wZXJ0eSh3Y2Q5eHh4LT5kZXYtPm9mX25vZGUsICJjbG9jay1uYW1lcyIsIE5VTEwpKSB7CisJCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IGNvZGVjIG5vdCB1c2luZyBhdWRpby1leHQtY2xrIGRyaXZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl3Y2RfZXh0X2NsayA9IGNsa19nZXQod2NkOXh4eC0+ZGV2LCAid2NkX2NsayIpOworCQlpZiAoSVNfRVJSKHdjZF9leHRfY2xrKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNsayBnZXQgJXMgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgIndjZF9leHRfY2xrIik7CisJCQlnb3RvIGVycl9ub21lbV9zbGltY2g7CisJCX0KKwl9CisJdG9tdG9tLT53Y2RfZXh0X2NsayA9IHdjZF9leHRfY2xrOworCWNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCS8qIGNvZGVjIHJlc21nciBtb2R1bGUgaW5pdCAqLworCXJldCA9IHdjZDl4eHhfcmVzbWdyX2luaXQoJnRvbXRvbS0+cmVzbWdyLCBjb2RlYywgY29yZV9yZXMsIHBkYXRhLAorCQkJCSAgJnBkYXRhLT5taWNiaWFzLCAmdG9tdG9tX3JlZ19hZGRyZXNzLAorCQkJCSAgJnJlc21ncl9jYiwgV0NEOVhYWF9DRENfVFlQRV9UT01UT00pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogd2NkOXh4eCBpbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX25vbWVtX3NsaW1jaDsKKwl9CisKKwl0b210b20tPmNsc2hfZC5idWNrX212ID0gdG9tdG9tX2NvZGVjX2dldF9idWNrX212KGNvZGVjKTsKKwkvKiBUb21Ub20gZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN3aXRjaGluZyBvZiB2ZGRfY3AgKi8KKwl0b210b20tPmNsc2hfZC5pc19keW5hbWljX3ZkZF9jcCA9IGZhbHNlOworCXdjZDl4eHhfY2xzaF9pbml0KCZ0b210b20tPmNsc2hfZCwgJnRvbXRvbS0+cmVzbWdyKTsKKworCWlmICh3Y2Q5eHh4LT5tY2xrX3JhdGUgPT0gVE9NVE9NX01DTEtfQ0xLXzEyUDI4OE1IWikKKwkJcmNvX2Nsa19yYXRlID0gVE9NVE9NX01DTEtfQ0xLXzEyUDI4OE1IWjsKKwllbHNlCisJCXJjb19jbGtfcmF0ZSA9IFRPTVRPTV9NQ0xLX0NMS185UDZNSFo7CisKKwl0b210b20tPmZ3X2RhdGEgPSBremFsbG9jKHNpemVvZigqKHRvbXRvbS0+ZndfZGF0YSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRvbXRvbS0+ZndfZGF0YSkKKwkJZ290byBlcnJfbm9tZW1fc2xpbWNoOworCXNldF9iaXQoV0NEOVhYWF9BTkNfQ0FMLCB0b210b20tPmZ3X2RhdGEtPmNhbF9iaXQpOworCXNldF9iaXQoV0NEOVhYWF9NQURfQ0FMLCB0b210b20tPmZ3X2RhdGEtPmNhbF9iaXQpOworCXNldF9iaXQoV0NEOVhYWF9NQkhDX0NBTCwgdG9tdG9tLT5md19kYXRhLT5jYWxfYml0KTsKKwlyZXQgPSB3Y2RfY2FsX2NyZWF0ZV9od2RlcCh0b210b20tPmZ3X2RhdGEsCisJCQkJV0NEOVhYWF9DT0RFQ19IV0RFUF9OT0RFLCBjb2RlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgaHdkZXAgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfaHdkZXA7CisJfQorCisJLyogaW5pdCBhbmQgc3RhcnQgbWJoYyAqLworCXJldCA9IHdjZDl4eHhfbWJoY19pbml0KCZ0b210b20tPm1iaGMsICZ0b210b20tPnJlc21nciwgY29kZWMsCisJCQkJdG9tdG9tX2VuYWJsZV9tYmhjX21pY2JpYXMsCisJCQkJJm1iaGNfY2IsICZjZGNfaW50cl9pZHMsCisJCQkJcmNvX2Nsa19yYXRlLCBUT01UT01fWkRFVF9TVVBQT1JURUQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogbWJoYyBpbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2h3ZGVwOworCX0KKworCXRvbXRvbS0+Y29kZWMgPSBjb2RlYzsKKwlmb3IgKGkgPSAwOyBpIDwgQ09NUEFOREVSX01BWDsgaSsrKSB7CisJCXRvbXRvbS0+Y29tcF9lbmFibGVkW2ldID0gMDsKKwkJdG9tdG9tLT5jb21wX2ZzW2ldID0gQ09NUEFOREVSX0ZTXzQ4S0haOworCX0KKwl0b210b20tPmludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOworCXRvbXRvbS0+YXV4X3BnYV9jbnQgPSAwOworCXRvbXRvbS0+YXV4X2xfZ2FpbiA9IDB4MUY7CisJdG9tdG9tLT5hdXhfcl9nYWluID0gMHgxRjsKKwl0b210b20tPmxkb19oX3VzZXJzID0gMDsKKwl0b210b20tPm1pY2JfMl91c2VycyA9IDA7CisJdG9tdG9tX3VwZGF0ZV9yZWdfZGVmYXVsdHMoY29kZWMpOworCXByX2RlYnVnKCIlczogTUNMSyBSYXRlID0gJXhcbiIsIF9fZnVuY19fLCB3Y2Q5eHh4LT5tY2xrX3JhdGUpOworCWlmICh3Y2Q5eHh4LT5tY2xrX3JhdGUgPT0gVE9NVE9NX01DTEtfQ0xLXzEyUDI4OE1IWikKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQ0hJUF9DVEwsIDB4MDYsIDB4MCk7CisJZWxzZSBpZiAod2NkOXh4eC0+bWNsa19yYXRlID09IFRPTVRPTV9NQ0xLX0NMS185UDZNSFopCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRPTVRPTV9BX0NISVBfQ1RMLCAweDA2LCAweDIpOworCXRvbXRvbV9jb2RlY19pbml0X3JlZyhjb2RlYyk7CisKKwlyZXQgPSB0b210b21faGFuZGxlX3BkYXRhKHRvbXRvbSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCXByX2VycigiJXM6IGJhZCBwZGF0YVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9od2RlcDsKKwl9CisKKwl0b210b20tPnNwa2Rydl9yZWcgPSB0b210b21fY29kZWNfZmluZF9yZWd1bGF0b3IoY29kZWMsCisJCQkJCSAgICAgICBXQ0Q5WFhYX1ZERF9TUEtEUlZfTkFNRSk7CisJdG9tdG9tLT5zcGtkcnYyX3JlZyA9IHRvbXRvbV9jb2RlY19maW5kX3JlZ3VsYXRvcihjb2RlYywKKwkJCQkJICAgICAgIFdDRDlYWFhfVkREX1NQS0RSVjJfTkFNRSk7CisKKwlwdHIgPSBrbWFsbG9jKChzaXplb2YodG9tdG9tX3J4X2NocykgKworCQkgICAgICAgc2l6ZW9mKHRvbXRvbV90eF9jaHMpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaHdkZXA7CisJfQorCisJaWYgKHRvbXRvbS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdG9tdG9tX2RhcG1faTJzX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKHRvbXRvbV9kYXBtX2kyc193aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX2kyc19tYXAsCisJCQlBUlJBWV9TSVpFKGF1ZGlvX2kyc19tYXApKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9tdG9tX2kyc19kYWkpOyBpKyspCisJCQlJTklUX0xJU1RfSEVBRCgmdG9tdG9tLT5kYWlbaV0ud2NkOXh4eF9jaF9saXN0KTsKKwl9IGVsc2UgaWYgKHRvbXRvbS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPREVDX0RBSVM7IGkrKykgeworCQkJSU5JVF9MSVNUX0hFQUQoJnRvbXRvbS0+ZGFpW2ldLndjZDl4eHhfY2hfbGlzdCk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0b210b20tPmRhaVtpXS5kYWlfd2FpdCk7CisJCX0KKwkJdG9tdG9tX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X2ludGZkZXZfbGEgPQorCQkgICAgY29udHJvbC0+c2xpbV9zbGF2ZS0+bGFkZHI7CisJCXRvbXRvbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9wZ2RfbGEgPQorCQkgICAgY29udHJvbC0+c2xpbS0+bGFkZHI7CisJCXRvbXRvbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX3BvcnRfbWFwcGluZ1swXSA9CisJCSAgICBUT01UT01fTUFEX1NMSU1CVVNfVFhfUE9SVDsKKworCQl0b210b21faW5pdF9zbGltX3NsYXZlX2NmZyhjb2RlYyk7CisJfQorCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0b210b21fMV9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKHRvbXRvbV8xX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLAorCQkJdG9tdG9tXzFfeF9hbmFsb2dfZ2Fpbl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUodG9tdG9tXzFfeF9hbmFsb2dfZ2Fpbl9jb250cm9scykpOworCisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHMsCisJCQkJICAgQVJSQVlfU0laRShpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzKSk7CisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGhwaF90eXBlX2RldGVjdF9jb250cm9scywKKwkJCQkgICBBUlJBWV9TSVpFKGhwaF90eXBlX2RldGVjdF9jb250cm9scykpOworCisJY29udHJvbC0+bnVtX3J4X3BvcnQgPSBUT01UT01fUlhfTUFYOworCWNvbnRyb2wtPnJ4X2NocyA9IHB0cjsKKwltZW1jcHkoY29udHJvbC0+cnhfY2hzLCB0b210b21fcnhfY2hzLCBzaXplb2YodG9tdG9tX3J4X2NocykpOworCWNvbnRyb2wtPm51bV90eF9wb3J0ID0gVE9NVE9NX1RYX01BWDsKKwljb250cm9sLT50eF9jaHMgPSBwdHIgKyBzaXplb2YodG9tdG9tX3J4X2Nocyk7CisJbWVtY3B5KGNvbnRyb2wtPnR4X2NocywgdG9tdG9tX3R4X2Nocywgc2l6ZW9mKHRvbXRvbV90eF9jaHMpKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJcmV0ID0gdG9tdG9tX3NldHVwX2lycXModG9tdG9tKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHRvbXRvbSBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJYXRvbWljX3NldCgma3BfdG9tdG9tX3ByaXYsICh1bnNpZ25lZCBsb25nKXRvbXRvbSk7CisJbXV0ZXhfbG9jaygmdG9tdG9tLT5jb2RlY19tdXRleCk7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIRUFEUEhPTkUiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIiKTsKKwltdXRleF91bmxvY2soJnRvbXRvbS0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJY29kZWMtPmNvbXBvbmVudC5pZ25vcmVfcG1kb3duX3RpbWUgPSAxOworCXJldCA9IHRvbXRvbV9jcGVfaW5pdGlhbGl6ZShjb2RlYyk7CisJaWYgKHJldCkgeworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBjcGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQkvKiBEbyBub3QgZmFpbCBwcm9iZSBpZiBDUEUgZmFpbGVkICovCisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7CisKK2Vycl9wZGF0YToKKwlrZnJlZShwdHIpOworCWNvbnRyb2wtPnJ4X2NocyA9IE5VTEw7CisJY29udHJvbC0+dHhfY2hzID0gTlVMTDsKK2Vycl9od2RlcDoKKwlrZnJlZSh0b210b20tPmZ3X2RhdGEpOworCXRvbXRvbS0+ZndfZGF0YSA9IE5VTEw7CitlcnJfbm9tZW1fc2xpbWNoOgorCWRldm1fa2ZyZWUoY29kZWMtPmRldiwgdG9tdG9tKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCB0b210b21fY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IHRvbXRvbV9wcml2ICp0b210b20gPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKKworCVdDRDlYWFhfQkdfQ0xLX0xPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKwlhdG9taWNfc2V0KCZrcF90b210b21fcHJpdiwgMCk7CisKKwlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0soJnRvbXRvbS0+cmVzbWdyKTsKKworCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwljb250cm9sLT5yeF9jaHMgPSBOVUxMOworCWNvbnRyb2wtPnR4X2NocyA9IE5VTEw7CisKKwlpZiAodG9tdG9tLT53Y2RfZXh0X2NsaykKKwkJY2xrX3B1dCh0b210b20tPndjZF9leHRfY2xrKTsKKwl0b210b21fY2xlYW51cF9pcnFzKHRvbXRvbSk7CisKKwkvKiBjbGVhbnVwIE1CSEMgKi8KKwl3Y2Q5eHh4X21iaGNfZGVpbml0KCZ0b210b20tPm1iaGMpOworCS8qIGNsZWFudXAgcmVzbWdyICovCisJd2NkOXh4eF9yZXNtZ3JfZGVpbml0KCZ0b210b20tPnJlc21ncik7CisKKwl0b210b20tPnNwa2Rydl9yZWcgPSBOVUxMOworCXRvbXRvbS0+c3BrZHJ2Ml9yZWcgPSBOVUxMOworCisJZGV2bV9rZnJlZShjb2RlYy0+ZGV2LCB0b210b20pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ21hcCAqdG9tdG9tX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKworCXJldHVybiBjb250cm9sLT5yZWdtYXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl90b210b20gPSB7CisJLmNvbnRyb2xzID0gdG9tdG9tX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0b210b21fc25kX2NvbnRyb2xzKSwKKwkuZ2V0X3JlZ21hcCA9IHRvbXRvbV9nZXRfcmVnbWFwLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkucHJvYmUgPSB0b210b21fY29kZWNfcHJvYmUsCisJCS5yZW1vdmUgPSB0b210b21fY29kZWNfcmVtb3ZlLAorCQkuZGFwbV93aWRnZXRzID0gdG9tdG9tX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRvbXRvbV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCisJfSwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgdG9tdG9tX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9tdG9tX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIXRvbXRvbSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiB0b210b20gcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSByZXN1bWVcbiIsIF9fZnVuY19fKTsKKwkvKiBOb3RpZnkgKi8KKwl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKCZ0b210b20tPnJlc21nciwKKwkJCQkgICAgIFdDRDlYWFhfRVZFTlRfUE9TVF9SRVNVTUUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdG9tdG9tX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IHRvbXRvbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdG9tdG9tX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIGludCB0b210b21fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdG9tdG9tX3ByaXYgKnRvbXRvbTsKKworCXRvbXRvbSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHRvbXRvbV9wcml2KSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghdG9tdG9tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRvbXRvbSk7CisKKwlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsICZzb2NfY29kZWNfZGV2X3RvbXRvbSwKKwkJCXRvbXRvbV9kYWksIEFSUkFZX1NJWkUodG9tdG9tX2RhaSkpOworCWVsc2UgaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQorCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsICZzb2NfY29kZWNfZGV2X3RvbXRvbSwKKwkJCXRvbXRvbV9pMnNfZGFpLCBBUlJBWV9TSVpFKHRvbXRvbV9pMnNfZGFpKSk7CisJbXV0ZXhfaW5pdCgmdG9tdG9tLT5jb2RlY19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgdG9tdG9tX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0b210b21fcHJpdiAqdG9tdG9tID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwltdXRleF9kZXN0cm95KCZ0b210b20tPmNvZGVjX211dGV4KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0b210b21fY29kZWNfZHJpdmVyID0geworCS5wcm9iZSA9IHRvbXRvbV9wcm9iZSwKKwkucmVtb3ZlID0gdG9tdG9tX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0b210b21fY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJnRvbXRvbV9wbV9vcHMsCisjZW5kaWYKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdG9tdG9tX2NvZGVjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0b210b21fY29kZWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRvbXRvbV9jb2RlY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRvbXRvbV9jb2RlY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0b210b21fY29kZWNfaW5pdCk7Cittb2R1bGVfZXhpdCh0b210b21fY29kZWNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVG9tVG9tIGNvZGVjIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc5ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzMwLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgV0NEOTMzMF9ICisjZGVmaW5lIFdDRDkzMzBfSAorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmg+CisjaW5jbHVkZSAid2NkOXh4eC1tYmhjLmgiCisjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3IuaCIKKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi5oIgorCisjZGVmaW5lIFRPTVRPTV9OVU1fUkVHSVNURVJTIDB4NDAwCisjZGVmaW5lIFRPTVRPTV9NQVhfUkVHSVNURVIgKFRPTVRPTV9OVU1fUkVHSVNURVJTLTEpCisjZGVmaW5lIFRPTVRPTV9DQUNIRV9TSVpFIFRPTVRPTV9OVU1fUkVHSVNURVJTCisKKyNkZWZpbmUgVE9NVE9NX1JFR19WQUwocmVnLCB2YWwpCQl7cmVnLCAwLCB2YWx9CisjZGVmaW5lIFRPTVRPTV9NQ0xLX0lEIDAKKworI2RlZmluZSBUT01UT01fUkVHSVNURVJfU1RBUlRfT0ZGU0VUIDB4ODAwCisjZGVmaW5lIFRPTVRPTV9TQl9QR0RfUE9SVF9SWF9CQVNFICAgMHg0MAorI2RlZmluZSBUT01UT01fU0JfUEdEX1BPUlRfVFhfQkFTRSAgIDB4NTAKKworI2RlZmluZSBXQ0Q5MzMwX0RNSUNfQ0xLX0RJVl8yIDB4MDAKKyNkZWZpbmUgV0NEOTMzMF9ETUlDX0NMS19ESVZfMyAweDAxCisjZGVmaW5lIFdDRDkzMzBfRE1JQ19DTEtfRElWXzQgMHgwMgorI2RlZmluZSBXQ0Q5MzMwX0RNSUNfQ0xLX0RJVl82IDB4MDMKKyNkZWZpbmUgV0NEOTMzMF9ETUlDX0NMS19ESVZfMTYgMHgwNAorCisjZGVmaW5lIFRPTVRPTV9aREVUX1NVUFBPUlRFRCB0cnVlCisKK2V4dGVybiBjb25zdCB1OCB0b210b21fcmVzZXRfcmVnX2RlZmF1bHRzW1RPTVRPTV9DQUNIRV9TSVpFXTsKK3N0cnVjdCB0b210b21fY29kZWNfZGFpX2RhdGEgeworCXUzMiByYXRlOworCXUzMiAqY2hfbnVtOworCXUzMiBjaF9hY3Q7CisJdTMyIGNoX3RvdDsKK307CisKK2VudW0gdG9tdG9tX3BpZF9jdXJyZW50IHsKKwlUT01UT01fUElEX01JQ18yUDVfVUEsCisJVE9NVE9NX1BJRF9NSUNfNV9VQSwKKwlUT01UT01fUElEX01JQ18xMF9VQSwKKwlUT01UT01fUElEX01JQ18yMF9VQSwKK307CisKK2VudW0gdG9tdG9tX21iaGNfYW5hbG9nX3B3cl9jZmcgeworCVRPTVRPTV9BTkFMT0dfUFdSX0NPTExBUFNFRCA9IDAsCisJVE9NVE9NX0FOQUxPR19QV1JfT04sCisJVE9NVE9NX05VTV9BTkFMT0dfUFdSX0NPTkZJR1MsCit9OworCitlbnVtIHsKKwlIUEhfUEFfTk9ORSA9IDAsCisJSFBIX1BBX1IsCisJSFBIX1BBX0wsCisJSFBIX1BBX0xfUiwKK307CisKKy8qIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IFNsaW1idXMgcG9ydCAqLworZW51bSB7CisJVE9NVE9NX1JYMSA9IDAsCisJVE9NVE9NX1JYMiwKKwlUT01UT01fUlgzLAorCVRPTVRPTV9SWDQsCisJVE9NVE9NX1JYNSwKKwlUT01UT01fUlg2LAorCVRPTVRPTV9SWDcsCisJVE9NVE9NX1JYOCwKKwlUT01UT01fUlg5LAorCVRPTVRPTV9SWDEwLAorCVRPTVRPTV9SWDExLAorCVRPTVRPTV9SWDEyLAorCVRPTVRPTV9SWDEzLAorCVRPTVRPTV9SWF9NQVgsCit9OworCitlbnVtIHsKKwlUT01UT01fVFgxID0gMCwKKwlUT01UT01fVFgyLAorCVRPTVRPTV9UWDMsCisJVE9NVE9NX1RYNCwKKwlUT01UT01fVFg1LAorCVRPTVRPTV9UWDYsCisJVE9NVE9NX1RYNywKKwlUT01UT01fVFg4LAorCVRPTVRPTV9UWDksCisJVE9NVE9NX1RYMTAsCisJVE9NVE9NX1RYMTEsCisJVE9NVE9NX1RYMTIsCisJVE9NVE9NX1RYMTMsCisJVE9NVE9NX1RYMTQsCisJVE9NVE9NX1RYMTUsCisJVE9NVE9NX1RYMTYsCisJVE9NVE9NX1RYX01BWCwKK307CisKK2V4dGVybiBpbnQgdG9tdG9tX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1jbGtfZW5hYmxlLAorCQkJICAgICBib29sIGRhcG0pOworZXh0ZXJuIGludCB0b210b21fY29kZWNfbWNsa19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICBpbnQgbWNsa19lbmFibGUsIGJvb2wgZGFwbSk7CitleHRlcm4gaW50IHRvbXRvbV9oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgc3RydWN0IHdjZDl4eHhfbWJoY19jb25maWcgKm1iaGNfY2ZnKTsKK2V4dGVybiB2b2lkIHRvbXRvbV9oc19kZXRlY3RfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIHZvaWQgKnRvbXRvbV9nZXRfYWZlX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWdfdHlwZSk7CisKK2V4dGVybiB2b2lkIHRvbXRvbV9ldmVudF9yZWdpc3RlcigKKwlpbnQgKCptYWNoaW5lX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJZW51bSB3Y2Q5eHh4X2NvZGVjX2V2ZW50KSwKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIHZvaWQgdG9tdG9tX3JlZ2lzdGVyX2V4dF9jbGtfY2IoCisJaW50ICgqY29kZWNfZXh0X2Nsa19lbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSksCisJaW50ICgqZ2V0X2V4dF9jbGtfY250KSh2b2lkKSwKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIGludCB0b210b21fZW5hYmxlX3FmdXNlX3NlbnNpbmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJjNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzM1LmMKQEAgLTAsMCArMSwxNDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlICJ3Y2Q5MzM1LmgiCisjaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi12Mi5oIgorI2luY2x1ZGUgIndjZDl4eHgtcmVzbWdyLXYyLmgiCisjaW5jbHVkZSAid2NkX2NwZV9jb3JlLmgiCisjaW5jbHVkZSAid2NkY2FsLWh3ZGVwLmgiCisKKyNkZWZpbmUgVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgIDE2CisKKyNkZWZpbmUgV0NEOTMzNV9SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfFwKKwkJCSAgICBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHxcCisJCQkgICAgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBTTkRSVl9QQ01fUkFURV8xOTIwMDApCisvKiBGcmFjdGlvbmFsIFJhdGVzICovCisjZGVmaW5lIFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV80NDEwMCkKKworI2RlZmluZSBXQ0Q5MzM1X01JWF9SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV80ODAwMCB8XAorCQkJCVNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwKQorCisjZGVmaW5lIFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkJICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSkKKworI2RlZmluZSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAorCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwgXAorCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKKyNkZWZpbmUgVEFTSEFfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCisKKy8qCisgKiBUaW1lb3V0IGluIG1pbGxpIHNlY29uZHMgYW5kIGl0IGlzIHRoZSB3YWl0IHRpbWUgZm9yCisgKiBzbGltIGNoYW5uZWwgcmVtb3ZhbCBpbnRlcnJ1cHQgdG8gcmVjZWl2ZS4KKyAqLworI2RlZmluZSBUQVNIQV9TTElNX0NMT1NFX1RJTUVPVVQgMTAwMAorI2RlZmluZSBUQVNIQV9TTElNX0lSUV9PVkVSRkxPVyAoMSA8PCAwKQorI2RlZmluZSBUQVNIQV9TTElNX0lSUV9VTkRFUkZMT1cgKDEgPDwgMSkKKyNkZWZpbmUgVEFTSEFfU0xJTV9JUlFfUE9SVF9DTE9TRUQgKDEgPDwgMikKKyNkZWZpbmUgVEFTSEFfTUNMS19DTEtfMTJQMjg4TUhaIDEyMjg4MDAwCisjZGVmaW5lIFRBU0hBX01DTEtfQ0xLXzlQNk1IWiA5NjAwMDAwCisKKyNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wIChUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyAyKQorCisjZGVmaW5lIFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTIDkKKyNkZWZpbmUgVEFTSEFfTlVNX0RFQ0lNQVRPUlMgOQorCisjZGVmaW5lIEJZVEVfQklUX01BU0sobnIpICgxIDw8ICgobnIpICUgQklUU19QRVJfQllURSkpCisjZGVmaW5lIFRBU0hBX01BRF9BVURJT19GSVJNV0FSRV9QQVRIICJ3Y2Q5MzM1L3djZDkzMzVfbWFkX2F1ZGlvLmJpbiIKKyNkZWZpbmUgVEFTSEFfQ1BFX1NTX0VSUl9TVEFUVVNfTUVNX0FDQ0VTUyAoMSA8PCAwKQorI2RlZmluZSBUQVNIQV9DUEVfU1NfRVJSX1NUQVRVU19XRE9HX0JJVEUgKDEgPDwgMSkKKworI2RlZmluZSBUQVNIQV9DUEVfRkFUQUxfSVJRUyBcCisJKFRBU0hBX0NQRV9TU19FUlJfU1RBVFVTX1dET0dfQklURSB8IFwKKwkgVEFTSEFfQ1BFX1NTX0VSUl9TVEFUVVNfTUVNX0FDQ0VTUykKKworI2RlZmluZSBTTElNX0JXX0NMS19HRUFSXzkgNjIwMDAwMAorI2RlZmluZSBTTElNX0JXX1VOVk9URSAwCisKKyNkZWZpbmUgQ1BFX0ZMTF9DTEtfNzVNSFogNzUwMDAwMDAKKyNkZWZpbmUgQ1BFX0ZMTF9DTEtfMTUwTUhaIDE1MDAwMDAwMAorI2RlZmluZSBXQ0Q5MzM1X1JFR19CSVRTIDgKKworI2RlZmluZSBXQ0Q5MzM1X01BWF9WQUxJRF9BRENfTVVYICAxMworI2RlZmluZSBXQ0Q5MzM1X0lOVkFMSURfQURDX01VWCA5CisKKyNkZWZpbmUgVEFTSEFfRElHX0NPUkVfUkVHX01JTiAgV0NEOTMzNV9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMCisjZGVmaW5lIFRBU0hBX0RJR19DT1JFX1JFR19NQVggIDB4REZGCisKKy8qIENvbnZlcnQgZnJvbSB2b3V0IGN0bCB0byBtaWNiaWFzIHZvbHRhZ2UgaW4gbVYgKi8KKyNkZWZpbmUgV0NEX1ZPVVRfQ1RMX1RPX01JQ0IodikgKDEwMDAgKyB2ICogNTApCisKKyNkZWZpbmUgVEFTSEFfWkRFVF9OVU1fTUVBU1VSRU1FTlRTIDE1MAorI2RlZmluZSBUQVNIQV9NQkhDX0dFVF9DMShjKSAgKChjICYgMHhDMDAwKSA+PiAxNCkKKyNkZWZpbmUgVEFTSEFfTUJIQ19HRVRfWDEoeCkgICh4ICYgMHgzRkZGKQorLyogeiB2YWx1ZSBjb21wYXJlZCBpbiBtaWxsaU9obSAqLworI2RlZmluZSBUQVNIQV9NQkhDX0lTX1NFQ09ORF9SQU1QX1JFUVVJUkVEKHopICgoeiA+IDQwMDAwMCkgfHwgKHogPCAzMjAwMCkpCisjZGVmaW5lIFRBU0hBX01CSENfWkRFVF9DT05TVCAgKDg2ICogMTYzODQpCisjZGVmaW5lIFRBU0hBX01CSENfTU9JU1RVUkVfVlJFRiAgVl80NV9NVgorI2RlZmluZSBUQVNIQV9NQkhDX01PSVNUVVJFX0lSRUYgIElfM1AwX1VBCisKKyNkZWZpbmUgVEFTSEFfVkVSU0lPTl9FTlRSWV9TSVpFIDE3CisKKyNkZWZpbmUgV0NEOTMzNV9BTUlDX1BXUl9MRVZFTF9MUCAwCisjZGVmaW5lIFdDRDkzMzVfQU1JQ19QV1JfTEVWRUxfREVGQVVMVCAxCisjZGVmaW5lIFdDRDkzMzVfQU1JQ19QV1JfTEVWRUxfSFAgMgorI2RlZmluZSBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLIDB4NjAKKyNkZWZpbmUgV0NEOTMzNV9BTUlDX1BXUl9MVkxfU0hJRlQgMHg1CisKKyNkZWZpbmUgV0NEOTMzNV9ERUNfUFdSX0xWTF9NQVNLIDB4MDYKKyNkZWZpbmUgV0NEOTMzNV9ERUNfUFdSX0xWTF9MUCAweDAyCisjZGVmaW5lIFdDRDkzMzVfREVDX1BXUl9MVkxfSFAgMHgwNAorI2RlZmluZSBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0RGIDB4MDAKKyNkZWZpbmUgV0NEOTMzNV9TVFJJTkdfTEVOIDEwMAorCisjZGVmaW5lIENBTENVTEFURV9WT1VUX0QocmVxX212KSAoKChyZXFfbXYgLSA2NTApICogMTApIC8gMjUpCisKK3N0YXRpYyBpbnQgY3BlX2RlYnVnX21vZGU7CisKKyNkZWZpbmUgVEFTSEFfTUFYX01JQ0JJQVMgNAorI2RlZmluZSBEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUgIk1JQyBCSUFTMSBTdGFuZGFsb25lIgorI2RlZmluZSBEQVBNX01JQ0JJQVMyX1NUQU5EQUxPTkUgIk1JQyBCSUFTMiBTdGFuZGFsb25lIgorI2RlZmluZSBEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUgIk1JQyBCSUFTMyBTdGFuZGFsb25lIgorI2RlZmluZSBEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUgIk1JQyBCSUFTNCBTdGFuZGFsb25lIgorCisjZGVmaW5lIERBUE1fTERPX0hfU1RBTkRBTE9ORSAiTERPX0giCittb2R1bGVfcGFyYW0oY3BlX2RlYnVnX21vZGUsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNwZV9kZWJ1Z19tb2RlLCAiYm9vdCBjcGUgaW4gZGVidWcgbW9kZSIpOworCisjZGVmaW5lIFRBU0hBX0RJR19DT1JFX0NPTExBUFNFX1RJTUVSX01TICAoNSAqIDEwMDApCisKKyNkZWZpbmUgTUFYX09OX0RFTUFORF9TVVBQTFlfTkFNRV9MRU5HVEggICAgNjQKKworc3RhdGljIGNoYXIgb25fZGVtYW5kX3N1cHBseV9uYW1lW11bTUFYX09OX0RFTUFORF9TVVBQTFlfTkFNRV9MRU5HVEhdID0geworCSJjZGMtdmRkLW1pYy1iaWFzIiwKK307CisKK2VudW0geworCVBPV0VSX0NPTExBUFNFLAorCVBPV0VSX1JFU1VNRSwKK307CisKK2VudW0gdGFzaGFfc2lkb192b2x0YWdlIHsKKwlTSURPX1ZPTFRBR0VfU1ZTX01WID0gOTUwLAorCVNJRE9fVk9MVEFHRV9OT01JTkFMX01WID0gMTEwMCwKK307CisKK3N0YXRpYyBlbnVtIGNvZGVjX3ZhcmlhbnQgY29kZWNfdmVyOworCitzdGF0aWMgaW50IGRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSA9IDE7Cittb2R1bGVfcGFyYW0oZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaWdfY29yZV9jb2xsYXBzZV9lbmFibGUsICJlbmFibGUvZGlzYWJsZSBwb3dlciBnYXRpbmciKTsKKworLyogZGlnX2NvcmVfY29sbGFwc2UgdGltZXIgaW4gc2Vjb25kcyAqLworc3RhdGljIGludCBkaWdfY29yZV9jb2xsYXBzZV90aW1lciA9IChUQVNIQV9ESUdfQ09SRV9DT0xMQVBTRV9USU1FUl9NUy8xMDAwKTsKK21vZHVsZV9wYXJhbShkaWdfY29yZV9jb2xsYXBzZV90aW1lciwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlnX2NvcmVfY29sbGFwc2VfdGltZXIsICJ0aW1lciBmb3IgcG93ZXIgZ2F0aW5nIik7CisKKy8qIFNWUyBTY2FsaW5nIGVuYWJsZS9kaXNhYmxlICovCitzdGF0aWMgaW50IHN2c19zY2FsaW5nX2VuYWJsZWQgPSAxOworbW9kdWxlX3BhcmFtKHN2c19zY2FsaW5nX2VuYWJsZWQsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN2c19zY2FsaW5nX2VuYWJsZWQsICJlbmFibGUvZGlzYWJsZSBzdnMgc2NhbGluZyIpOworCisvKiBTVlMgYnVjayBzZXR0aW5nICovCitzdGF0aWMgaW50IHNpZG9fYnVja19zdnNfdm9sdGFnZSA9IFNJRE9fVk9MVEFHRV9TVlNfTVY7Cittb2R1bGVfcGFyYW0oc2lkb19idWNrX3N2c192b2x0YWdlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UsCisJCQkic2V0dGluZyBmb3IgU1ZTIHZvbHRhZ2UgZm9yIFNJRE8gQlVDSyIpOworCisjZGVmaW5lIFRBU0hBX1RYX1VOTVVURV9ERUxBWV9NUwkyNQorCitzdGF0aWMgaW50IHR4X3VubXV0ZV9kZWxheSA9IFRBU0hBX1RYX1VOTVVURV9ERUxBWV9NUzsKK21vZHVsZV9wYXJhbSh0eF91bm11dGVfZGVsYXksIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3VubXV0ZV9kZWxheSwgImRlbGF5IHRvIHVubXV0ZSB0aGUgdHggcGF0aCIpOworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnIHRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgPSB7CisJLm1pbm9yX3ZlcnNpb24gPSAxLAorCS5zbGltYnVzX2Rldl9pZCA9IEFGRV9TTElNQlVTX0RFVklDRV8xLAorCS5zbGF2ZV9kZXZfcGdkX2xhID0gMCwKKwkuc2xhdmVfZGV2X2ludGZkZXZfbGEgPSAwLAorCS5iaXRfd2lkdGggPSAxNiwKKwkuZGF0YV9mb3JtYXQgPSAwLAorCS5udW1fY2hhbm5lbHMgPSAxCit9OworCitzdHJ1Y3QgdGFzaGFfbWJoY196ZGV0X3BhcmFtIHsKKwl1MTYgbGRvX2N0bDsKKwl1MTYgbm9mZjsKKwl1MTYgbnNoaWZ0OworCXUxNiBidG41OworCXUxNiBidG42OworCXUxNiBidG43OworfTsKKworc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19wYWdlX2NmZyB0YXNoYV9jZGNfcmVnX3BhZ2VfY2ZnID0geworCS5taW5vcl92ZXJzaW9uID0gQUZFX0FQSV9WRVJTSU9OX0NEQ19SRUdfUEFHRV9DRkcsCisJLmVuYWJsZSA9IDEsCisJLnByb2NfaWQgPSBBRkVfQ0RDX1JFR19QQUdFX0FTU0lHTl9QUk9DX0lEXzEsCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZyBhdWRpb19yZWdfY2ZnW10gPSB7CisJeworCQkxLAorCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzEpLAorCQlIV19NQURfQVVESU9fRU5BQkxFLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMyksCisJCUhXX01BRF9BVURJT19TTEVFUF9USU1FLCAweEYsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNCksCisJCUhXX01BRF9UWF9BVURJT19TV0lUQ0hfT0ZGLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9DRkcpLAorCQlNQURfQVVESU9fSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMyksCisJCU1BRF9BVURJT19JTlRfTUFTS19SRUcsIDB4MSwgV0NEOTMzNV9SRUdfQklUUywgMAorCX0sCisJeworCQkxLAorCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTMzNV9JTlRSX1BJTjJfU1RBVFVTMyksCisJCU1BRF9BVURJT19JTlRfU1RBVFVTX1JFRywgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMpLAorCQlNQURfQVVESU9fSU5UX0NMRUFSX1JFRywgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfQ0ZHKSwKKwkJVkJBVF9JTlRfREVTVF9TRUxFQ1RfUkVHLCAweDIsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX01BU0szKSwKKwkJVkJBVF9JTlRfTUFTS19SRUcsIDB4MDgsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpLAorCQlWQkFUX0lOVF9TVEFUVVNfUkVHLCAweDA4LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMpLAorCQlWQkFUX0lOVF9DTEVBUl9SRUcsIDB4MDgsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9DRkcpLAorCQlWQkFUX1JFTEVBU0VfSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMyksCisJCVZCQVRfUkVMRUFTRV9JTlRfTUFTS19SRUcsIDB4MTAsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpLAorCQlWQkFUX1JFTEVBU0VfSU5UX1NUQVRVU19SRUcsIDB4MTAsIFdDRDkzMzVfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMyksCisJCVZCQVRfUkVMRUFTRV9JTlRfQ0xFQVJfUkVHLCAweDEwLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUQVNIQV9TQl9QR0RfUE9SVF9UWF9CQVNFKSwKKwkJU0JfUEdEX1BPUlRfVFhfV0FURVJNQVJLX04sIDB4MUUsIFdDRDkzMzVfUkVHX0JJVFMsIDB4MQorCX0sCisJeworCQkxLAorCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVEFTSEFfU0JfUEdEX1BPUlRfVFhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1RYX0VOQUJMRV9OLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDB4MQorCX0sCisJeworCQkxLAorCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVEFTSEFfU0JfUEdEX1BPUlRfUlhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzM1X1JFR19CSVRTLCAweDEKKwl9LAorCXsKKwkJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRBU0hBX1NCX1BHRF9QT1JUX1JYX0JBU0UpLAorCQlTQl9QR0RfUE9SVF9SWF9FTkFCTEVfTiwgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAweDEKKwl9LAorCXsJMSwKKwkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCksCisJCUFBTkNfRkZfR0FJTl9BREFQVElWRSwgMHg0LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpLAorCQlBQU5DX0ZGR0FJTl9BREFQVElWRV9FTiwgMHg4LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0FfR0FJTl9DVEwpLAorCQlBQU5DX0dBSU5fQ09OVFJPTCwgMHhGRiwgV0NEOTMzNV9SRUdfQklUUywgMAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhIHRhc2hhX2F1ZGlvX3JlZ19jZmcgPSB7CisJLm51bV9yZWdpc3RlcnMgPSBBUlJBWV9TSVpFKGF1ZGlvX3JlZ19jZmcpLAorCS5yZWdfZGF0YSA9IGF1ZGlvX3JlZ19jZmcsCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9pZF9jZGNfYWFuY192ZXJzaW9uIHRhc2hhX2NkY19hYW5jX3ZlcnNpb24gPSB7CisJLmNkY19hYW5jX21pbm9yX3ZlcnNpb24gPSBBRkVfQVBJX1ZFUlNJT05fQ0RDX0FBTkNfVkVSU0lPTiwKKwkuYWFuY19od192ZXJzaW9uICAgICAgICA9IEFBTkNfSFdfQkxPQ0tfVkVSU0lPTl8yLAorfTsKKworZW51bSB7CisJVklfU0VOU0VfMSwKKwlWSV9TRU5TRV8yLAorCUFJRjRfU1dJVENIX1ZBTFVFLAorCUFVRElPX05PTUlOQUwsCisJQ1BFX05PTUlOQUwsCisJSFBIX1BBX0RFTEFZLAorCVNCX0NMS19HRUFSLAorCUFOQ19NSUNfQU1JQzEsCisJQU5DX01JQ19BTUlDMiwKKwlBTkNfTUlDX0FNSUMzLAorCUFOQ19NSUNfQU1JQzQsCisJQU5DX01JQ19BTUlDNSwKKwlBTkNfTUlDX0FNSUM2LAorCUNMQVNTSF9DT05GSUcsCit9OworCitlbnVtIHsKKwlBSUYxX1BCID0gMCwKKwlBSUYxX0NBUCwKKwlBSUYyX1BCLAorCUFJRjJfQ0FQLAorCUFJRjNfUEIsCisJQUlGM19DQVAsCisJQUlGNF9QQiwKKwlBSUZfTUlYMV9QQiwKKwlBSUY0X01BRF9UWCwKKwlBSUY0X1ZJRkVFRCwKKwlBSUY1X0NQRV9UWCwKKwlOVU1fQ09ERUNfREFJUywKK307CisKK2VudW0geworCUlOVG5fMV9NSVhfSU5QX1NFTF9aRVJPID0gMCwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfREVDMCwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfREVDMSwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfSUlSMCwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfSUlSMSwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfUlgwLAorCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDEsCisJSU5Ubl8xX01JWF9JTlBfU0VMX1JYMiwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfUlgzLAorCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDQsCisJSU5Ubl8xX01JWF9JTlBfU0VMX1JYNSwKKwlJTlRuXzFfTUlYX0lOUF9TRUxfUlg2LAorCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDcsCisKK307CisKKyNkZWZpbmUgSVNfVkFMSURfTkFUSVZFX0ZJRk9fUE9SVChpbnApIFwKKwkoKGlucCA+PSBJTlRuXzFfTUlYX0lOUF9TRUxfUlgwKSAmJiBcCisJIChpbnAgPD0gSU5Ubl8xX01JWF9JTlBfU0VMX1JYMykpCisKK2VudW0geworCUlOVG5fMl9JTlBfU0VMX1pFUk8gPSAwLAorCUlOVG5fMl9JTlBfU0VMX1JYMCwKKwlJTlRuXzJfSU5QX1NFTF9SWDEsCisJSU5Ubl8yX0lOUF9TRUxfUlgyLAorCUlOVG5fMl9JTlBfU0VMX1JYMywKKwlJTlRuXzJfSU5QX1NFTF9SWDQsCisJSU5Ubl8yX0lOUF9TRUxfUlg1LAorCUlOVG5fMl9JTlBfU0VMX1JYNiwKKwlJTlRuXzJfSU5QX1NFTF9SWDcsCisJSU5Ubl8yX0lOUF9TRUxfUFJPWElNSVRZLAorfTsKKworZW51bSB7CisJSU5URVJQX0VBUiA9IDAsCisJSU5URVJQX0hQSEwsCisJSU5URVJQX0hQSFIsCisJSU5URVJQX0xPMSwKKwlJTlRFUlBfTE8yLAorCUlOVEVSUF9MTzMsCisJSU5URVJQX0xPNCwKKwlJTlRFUlBfU1BLUjEsCisJSU5URVJQX1NQS1IyLAorfTsKKworc3RydWN0IGludGVycF9zYW1wbGVfcmF0ZSB7CisJaW50IHNhbXBsZV9yYXRlOworCWludCByYXRlX3ZhbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIGludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtdID0geworCXs4MDAwLCAweDB9LAkvKiA4SyAqLworCXsxNjAwMCwgMHgxfSwJLyogMTZLICovCisJezI0MDAwLCAtRUlOVkFMfSwvKiAyNEsgKi8KKwl7MzIwMDAsIDB4M30sCS8qIDMySyAqLworCXs0ODAwMCwgMHg0fSwJLyogNDhLICovCisJezk2MDAwLCAweDV9LAkvKiA5NksgKi8KKwl7MTkyMDAwLCAweDZ9LAkvKiAxOTJLICovCisJezM4NDAwMCwgMHg3fSwJLyogMzg0SyAqLworCXs0NDEwMCwgMHg4fSwgLyogNDQuMUsgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIGludF9taXhfc2FtcGxlX3JhdGVfdmFsW10gPSB7CisJezQ4MDAwLCAweDR9LAkvKiA0OEsgKi8KKwl7OTYwMDAsIDB4NX0sCS8qIDk2SyAqLworCXsxOTIwMDAsIDB4Nn0sCS8qIDE5MksgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0YXNoYV9yeF9jaHNbVEFTSEFfUlhfTUFYXSA9IHsKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSLCAwKSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMSwgMSksCisJV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDIsIDIpLAorCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyAzLCAzKSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgNCwgNCksCisJV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDUsIDUpLAorCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA2LCA2KSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgNywgNyksCisJV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDgsIDgpLAorCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA5LCA5KSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTAsIDEwKSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTEsIDExKSwKKwlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTIsIDEyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0YXNoYV90eF9jaHNbVEFTSEFfVFhfTUFYXSA9IHsKKwlXQ0Q5WFhYX0NIKDAsIDApLAorCVdDRDlYWFhfQ0goMSwgMSksCisJV0NEOVhYWF9DSCgyLCAyKSwKKwlXQ0Q5WFhYX0NIKDMsIDMpLAorCVdDRDlYWFhfQ0goNCwgNCksCisJV0NEOVhYWF9DSCg1LCA1KSwKKwlXQ0Q5WFhYX0NIKDYsIDYpLAorCVdDRDlYWFhfQ0goNywgNyksCisJV0NEOVhYWF9DSCg4LCA4KSwKKwlXQ0Q5WFhYX0NIKDksIDkpLAorCVdDRDlYWFhfQ0goMTAsIDEwKSwKKwlXQ0Q5WFhYX0NIKDExLCAxMSksCisJV0NEOVhYWF9DSCgxMiwgMTIpLAorCVdDRDlYWFhfQ0goMTMsIDEzKSwKKwlXQ0Q5WFhYX0NIKDE0LCAxNCksCisJV0NEOVhYWF9DSCgxNSwgMTUpLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiB2cG9ydF9zbGltX2NoZWNrX3RhYmxlW05VTV9DT0RFQ19EQUlTXSA9IHsKKwkvKiBOZWVkcyB0byBkZWZpbmUgaW4gdGhlIHNhbWUgb3JkZXIgb2YgREFJIGVudW0gZGVmaW5pdGlvbnMgKi8KKwkwLAorCUJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjRfTUFEX1RYKSB8IEJJVChBSUY1X0NQRV9UWCksCisJMCwKKwlCSVQoQUlGMV9DQVApIHwgQklUKEFJRjNfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCkgfCBCSVQoQUlGNV9DUEVfVFgpLAorCTAsCisJQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYyX0NBUCkgfCBCSVQoQUlGNF9NQURfVFgpIHwgQklUKEFJRjVfQ1BFX1RYKSwKKwkwLAorCTAsCisJQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjVfQ1BFX1RYKSwKKwkwLAorCUJJVChBSUYxX0NBUCkgfCBCSVQoQUlGMl9DQVApIHwgQklUKEFJRjNfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCksCit9OworCitzdGF0aWMgY29uc3QgdTMyIHZwb3J0X2kyc19jaGVja190YWJsZVtOVU1fQ09ERUNfREFJU10gPSB7CisJMCwJCQkvKiBBSUYxX1BCICovCisJQklUKEFJRjJfQ0FQKSwJCS8qIEFJRjFfQ0FQICovCisJMCwJCQkvKiBBSUYyX1BCICovCisJQklUKEFJRjFfQ0FQKSwJCS8qIEFJRjJfQ0FQICovCit9OworCisvKiBDb2RlYyBzdXBwb3J0cyAyIElJUiBmaWx0ZXJzICovCitlbnVtIHsKKwlJSVIwID0gMCwKKwlJSVIxLAorCUlJUl9NQVgsCit9OworCisvKiBFYWNoIElJUiBoYXMgNSBGaWx0ZXIgU3RhZ2VzICovCitlbnVtIHsKKwlCQU5EMSA9IDAsCisJQkFORDIsCisJQkFORDMsCisJQkFORDQsCisJQkFORDUsCisJQkFORF9NQVgsCit9OworCitlbnVtIHsKKwlDT01QQU5ERVJfMSwgLyogSFBIX0wgKi8KKwlDT01QQU5ERVJfMiwgLyogSFBIX1IgKi8KKwlDT01QQU5ERVJfMywgLyogTE8xX0RJRkYgKi8KKwlDT01QQU5ERVJfNCwgLyogTE8yX0RJRkYgKi8KKwlDT01QQU5ERVJfNSwgLyogTE8zX1NFICovCisJQ09NUEFOREVSXzYsIC8qIExPNF9TRSAqLworCUNPTVBBTkRFUl83LCAvKiBTV1IgU1BLIENIMSAqLworCUNPTVBBTkRFUl84LCAvKiBTV1IgU1BLIENIMiAqLworCUNPTVBBTkRFUl9NQVgsCit9OworCitlbnVtIHsKKwlTUkNfSU5fSFBITCwKKwlTUkNfSU5fTE8xLAorCVNSQ19JTl9IUEhSLAorCVNSQ19JTl9MTzIsCisJU1JDX0lOX1NQS1JMLAorCVNSQ19JTl9MTzMsCisJU1JDX0lOX1NQS1JSLAorCVNSQ19JTl9MTzQsCit9OworCitlbnVtIHsKKwlTUExJTkVfU1JDMCwKKwlTUExJTkVfU1JDMSwKKwlTUExJTkVfU1JDMiwKKwlTUExJTkVfU1JDMywKKwlTUExJTkVfU1JDX01BWCwKK307CisKKy8qIHdjZDkzMzUgaW50ZXJydXB0IHRhYmxlICAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2RhdGEgd2NkOTMzNV9pbnRyX3RhYmxlW10gPSB7CisJe1dDRDlYWFhfSVJRX1NMSU1CVVMsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfTUJIQ19TV19ERVQsIHRydWV9LAorCXtXQ0Q5MzM1X0lSUV9NQkhDX0JVVFRPTl9QUkVTU19ERVQsIHRydWV9LAorCXtXQ0Q5MzM1X0lSUV9NQkhDX0JVVFRPTl9SRUxFQVNFX0RFVCwgdHJ1ZX0sCisJe1dDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsIHRydWV9LAorCXtXQ0Q5MzM1X0lSUV9NQkhDX0VMRUNUX0lOU19SRU1fTEVHX0RFVCwgdHJ1ZX0sCisJe1dDRDkzMzVfSVJRX0ZMTF9MT0NLX0xPU1MsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfSFBIX1BBX0NOUExfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfSFBIX1BBX0NOUFJfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfRUFSX1BBX0NOUF9DT01QTEVURSwgZmFsc2V9LAorCXtXQ0Q5MzM1X0lSUV9MSU5FX1BBMV9DTlBfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfTElORV9QQTJfQ05QX0NPTVBMRVRFLCBmYWxzZX0sCisJe1dDRDkzMzVfSVJRX0xJTkVfUEEzX0NOUF9DT01QTEVURSwgZmFsc2V9LAorCXtXQ0Q5MzM1X0lSUV9MSU5FX1BBNF9DTlBfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfSFBIX1BBX09DUExfRkFVTFQsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfSFBIX1BBX09DUFJfRkFVTFQsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfRUFSX1BBX09DUF9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5MzM1X0lSUV9TT1VORFdJUkUsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfVkREX0RJR19SQU1QX0NPTVBMRVRFLCBmYWxzZX0sCisJe1dDRDkzMzVfSVJRX1JDT19FUlJPUiwgZmFsc2V9LAorCXtXQ0Q5MzM1X0lSUV9TVkFfRVJST1IsIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfTUFEX0FVRElPLCBmYWxzZX0sCisJe1dDRDkzMzVfSVJRX01BRF9CRUFDT04sIGZhbHNlfSwKKwl7V0NEOTMzNV9JUlFfU1ZBX09VVEJPWDEsIHRydWV9LAorCXtXQ0Q5MzM1X0lSUV9TVkFfT1VUQk9YMiwgdHJ1ZX0sCisJe1dDRDkzMzVfSVJRX01BRF9VTFRSQVNPVU5ELCBmYWxzZX0sCisJe1dDRDkzMzVfSVJRX1ZCQVRfQVRUQUNLLCBmYWxzZX0sCisJe1dDRDkzMzVfSVJRX1ZCQVRfUkVTVE9SRSwgZmFsc2V9LAorfTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfZ2FpbiwgMCwgMSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobGluZV9nYWluLCAwLCA3LCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhbmFsb2dfZ2FpbiwgMCwgMjUsIDEpOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0YXNoYV9kYWlbXTsKK3N0YXRpYyBpbnQgd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwodTMyIG1pY2JfbXYpOworCitzdGF0aWMgaW50IHRhc2hhX2NvbmZpZ19jb21wYW5kZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdTE2LCBib29sKTsKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgYm9vbCBlbmFibGUpOworCisvKiBIb2xkIGluc3RhbmNlIHRvIHNvdW5kd2lyZSBwbGF0Zm9ybSBkZXZpY2UgKi8KK3N0cnVjdCB0YXNoYV9zd3JfY3RybF9kYXRhIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzd3JfcGRldjsKKwlzdHJ1Y3QgaWRhIHN3cl9pZGE7Cit9OworCitzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgeworCXZvaWQgKmhhbmRsZTsgLyogaG9sZHMgY29kZWMgcHJpdmF0ZSBkYXRhICovCisJaW50ICgqcmVhZCkodm9pZCAqaGFuZGxlLCBpbnQgcmVnKTsKKwlpbnQgKCp3cml0ZSkodm9pZCAqaGFuZGxlLCBpbnQgcmVnLCBpbnQgdmFsKTsKKwlpbnQgKCpidWxrX3dyaXRlKSh2b2lkICpoYW5kbGUsIHUzMiAqcmVnLCB1MzIgKnZhbCwgc2l6ZV90IGxlbik7CisJaW50ICgqY2xrKSh2b2lkICpoYW5kbGUsIGJvb2wgZW5hYmxlKTsKKwlpbnQgKCpoYW5kbGVfaXJxKSh2b2lkICpoYW5kbGUsCisJCQkgIGlycXJldHVybl90ICgqc3dybV9pcnFfaGFuZGxlcikoaW50IGlycSwKKwkJCQkJCQkgIHZvaWQgKmRhdGEpLAorCQkJICB2b2lkICpzd3JtX2hhbmRsZSwKKwkJCSAgaW50IGFjdGlvbik7Cit9OworCitzdGF0aWMgc3RydWN0IHdjZF9tYmhjX3JlZ2lzdGVyCisJd2NkX21iaGNfcmVnaXN0ZXJzW1dDRF9NQkhDX1JFR19GVU5DX01BWF0gPSB7CisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0xfREVUX0VOIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19NRUNILCAweDgwLCA3LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX0RFVF9FTiIsCisJCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHg0MCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MjAsIDUsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NSUNfQ0xBTVBfQ1RMIiwKKwkJCSAgV0NEOTMzNV9NQkhDX1BMVUdfREVURUNUX0NUTCwgMHgzMCwgNCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0VMRUNUX0RFVEVDVElPTl9UWVBFIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwgMHgwOCwgMywgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0xfREVUX1BVTExfVVBfQ1RSTCIsCisJCQkgIFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwsIDB4QzAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NPTVBfQ1RSTCIsCisJCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgwNCwgMiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfUExVR19UWVBFIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19NRUNILCAweDEwLCA0LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX1BMVUdfVFlQRSIsCisJCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgwOCwgMywgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX1NXX0hQSF9MUF8xMDBLX1RPX0dORCIsCisJCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgwMSwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNULCAweDA2LCAxLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRlNNX0VOIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgNywgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0lOU1JFTV9EQk5DIiwKKwkJCSAgV0NEOTMzNV9NQkhDX1BMVUdfREVURUNUX0NUTCwgMHgwRiwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9EQk5DIiwKKwkJCSAgV0NEOTMzNV9NQkhDX0NUTF8xLCAweDAzLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfVlJFRiIsCisJCQkgIFdDRDkzMzVfTUJIQ19DVExfMiwgMHgwMywgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0NPTVBfUkVTVUxUIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHgwOCwgMywgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01JQ19TQ0hNVF9SRVNVTFQiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAweDIwLCA1LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9TQ0hNVF9SRVNVTFQiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAweDgwLCA3LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9TQ0hNVF9SRVNVTFQiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAweDQwLCA2LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfT0NQX0ZTTV9FTiIsCisJCQkgIFdDRDkzMzVfSFBIX09DUF9DVEwsIDB4MTAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fUkVTVUxUIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHgwNywgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9JU1JDX0NUTCIsCisJCQkgIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsIDB4NzAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9SRVNVTFQiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAweEZGLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDQl9DVFJMIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUlDQjIsIDB4QzAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUiLAorCQkJICBXQ0Q5MzM1X0hQSF9DTlBfV0dfVElNRSwgMHhGRiwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSFJfUEFfRU4iLAorCQkJICBXQ0Q5MzM1X0FOQV9IUEgsIDB4NDAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1BBX0VOIiwKKwkJCSAgV0NEOTMzNV9BTkFfSFBILCAweDgwLCA3LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIX1BBX0VOIiwKKwkJCSAgV0NEOTMzNV9BTkFfSFBILCAweEMwLCA2LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfU1dDSF9MRVZFTF9SRU1PVkUiLAorCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zLCAweDEwLCA0LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfUFVMTERPV05fQ1RSTCIsCisJCQkgIDAsIDAsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BTkNfREVUX0VOIiwKKwkJCSAgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDAxLCAwLCAwKSwKKwkvKgorCSAqIE1CSEMgRlNNIHN0YXR1cyByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBUYXNoYSAyLjAuCisJICogU28sIGluaXQgd2l0aCAwIGxhdGVyIG9uY2UgdGhlIHZlcnNpb24gaXMga25vd24sIHRoZW4gdmFsdWVzCisJICogd2lsbCBiZSB1cGRhdGVkLgorCSAqLworCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fU1RBVFVTIiwKKwkJCSAgMCwgMCwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01VWF9DVEwiLAorCQkJICBXQ0Q5MzM1X01CSENfQ1RMXzIsIDB4NzAsIDQsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfbWJoY19pbnRyIGludHJfaWRzID0geworCS5tYmhjX3N3X2ludHIgPSAgV0NEOTMzNV9JUlFfTUJIQ19TV19ERVQsCisJLm1iaGNfYnRuX3ByZXNzX2ludHIgPSBXQ0Q5MzM1X0lSUV9NQkhDX0JVVFRPTl9QUkVTU19ERVQsCisJLm1iaGNfYnRuX3JlbGVhc2VfaW50ciA9IFdDRDkzMzVfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULAorCS5tYmhjX2hzX2luc19pbnRyID0gV0NEOTMzNV9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0xFR19ERVQsCisJLm1iaGNfaHNfcmVtX2ludHIgPSBXQ0Q5MzM1X0lSUV9NQkhDX0VMRUNUX0lOU19SRU1fREVULAorCS5ocGhfbGVmdF9vY3AgPSBXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKKwkuaHBoX3JpZ2h0X29jcCA9IFdDRDkzMzVfSVJRX0hQSF9QQV9PQ1BSX0ZBVUxULAorfTsKKworc3RydWN0IHdjZF92YmF0IHsKKwlib29sIGlzX2VuYWJsZWQ7CisJYm9vbCBhZGNfY29uZmlnOworCS8qIFZhcmlhYmxlcyB0byBjYWNoZSBWYmF0IEFEQyBvdXRwdXQgdmFsdWVzICovCisJdTE2IGRjcDE7CisJdTE2IGRjcDI7Cit9OworCitzdHJ1Y3QgaHBmX3dvcmsgeworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwl1OCBkZWNpbWF0b3I7CisJdTggaHBmX2N1dF9vZmZfZnJlcTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworfTsKKworI2RlZmluZSBXQ0Q5MzM1X1NQS19BTkNfRU5fREVMQVlfTVMgMzUwCitzdGF0aWMgaW50IHNwa19hbmNfZW5fZGVsYXkgPSBXQ0Q5MzM1X1NQS19BTkNfRU5fREVMQVlfTVM7Cittb2R1bGVfcGFyYW0oc3BrX2FuY19lbl9kZWxheSwgaW50LCAwNjY0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3BrX2FuY19lbl9kZWxheSwgImRlbGF5IHRvIGVuYWJsZSBhbmMgaW4gc3BlYWtlciBwYXRoIik7CisKK3N0cnVjdCBzcGtfYW5jX3dvcmsgeworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworfTsKKworc3RydWN0IHR4X211dGVfd29yayB7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOworCXU4IGRlY2ltYXRvcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOworfTsKKworc3RydWN0IHRhc2hhX3ByaXYgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1MzIgYWRjX2NvdW50OworCXUzMiByeF9iaWFzX2NvdW50OworCXMzMiBkbWljXzBfMV9jbGtfY250OworCXMzMiBkbWljXzJfM19jbGtfY250OworCXMzMiBkbWljXzRfNV9jbGtfY250OworCXMzMiBsZG9faF91c2VyczsKKwlzMzIgbWljYl9yZWZbVEFTSEFfTUFYX01JQ0JJQVNdOworCXMzMiBwdWxsdXBfcmVmW1RBU0hBX01BWF9NSUNCSUFTXTsKKworCXUzMiBhbmNfc2xvdDsKKwlib29sIGFuY19mdW5jOworCisJLyogVmJhdCBtb2R1bGUgKi8KKwlzdHJ1Y3Qgd2NkX3ZiYXQgdmJhdDsKKworCS8qIGNhbCBpbmZvIGZvciBjb2RlYyAqLworCXN0cnVjdCBmd19pbmZvICpmd19kYXRhOworCisJLyp0cmFjayB0YXNoYSBpbnRlcmZhY2UgdHlwZSovCisJdTggaW50Zl90eXBlOworCisJLyogbnVtIG9mIHNsaW0gcG9ydHMgcmVxdWlyZWQgKi8KKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAgZGFpW05VTV9DT0RFQ19EQUlTXTsKKworCS8qIFNvdW5kV2lyZSBkYXRhIHN0cnVjdHVyZSAqLworCXN0cnVjdCB0YXNoYV9zd3JfY3RybF9kYXRhICpzd3JfY3RybF9kYXRhOworCWludCBucjsKKworCS8qY29tcGFuZGVyKi8KKwlpbnQgY29tcF9lbmFibGVkW0NPTVBBTkRFUl9NQVhdOworCisJLyogTWFpbnRhaW4gdGhlIHN0YXR1cyBvZiBBVVggUEdBICovCisJaW50IGF1eF9wZ2FfY250OworCXU4IGF1eF9sX2dhaW47CisJdTggYXV4X3JfZ2FpbjsKKworCWJvb2wgc3Brcl9wYV93aWRnZXRfb247CisJc3RydWN0IHJlZ3VsYXRvciAqc3BrZHJ2X3JlZzsKKwlzdHJ1Y3QgcmVndWxhdG9yICpzcGtkcnYyX3JlZzsKKworCWJvb2wgbWJoY19zdGFydGVkOworCS8qIGNsYXNzIGggc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSBjbHNoX2Q7CisKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19zbGltYnVzX3NsYXZlX2NmZyBzbGltYnVzX3NsYXZlX2NmZzsKKworCS8qCisJICogbGlzdCB1c2VkIHRvIHNhdmUvcmVzdG9yZSByZWdpc3RlcnMgYXQgc3RhcnQgYW5kCisJICogZW5kIG9mIGltcGVkYW5jZSBtZWFzdXJlbWVudAorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVnX3NhdmVfcmVzdG9yZTsKKworCS8qIGhhbmRsZSB0byBjcGUgY29yZSAqLworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNwZV9jb3JlOworCXUzMiBjdXJyZW50X2NwZV9jbGtfZnJlcTsKKwllbnVtIHRhc2hhX3NpZG9fdm9sdGFnZSBzaWRvX3ZvbHRhZ2U7CisJaW50IHNpZG9fY2NsX2NudDsKKworCXUzMiBhbmFfcnhfc3VwcGxpZXM7CisJLyogTXVsdGlwbGljYXRpb24gZmFjdG9yIHVzZWQgZm9yIGltcGVkYW5jZSBkZXRlY3Rpb24gKi8KKwlpbnQgemRldF9nYWluX211bF9mYWN0OworCisJLyogdG8gdHJhY2sgdGhlIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzaGFfYWRkX2NoaWxkX2RldmljZXNfd29yazsKKwlzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgc3dyX3BsYXRfZGF0YTsKKworCS8qIFBvcnQgdmFsdWVzIGZvciBSeCBhbmQgVHggY29kZWNfZGFpICovCisJdW5zaWduZWQgaW50IHJ4X3BvcnRfdmFsdWVbVEFTSEFfUlhfTUFYXTsKKwl1bnNpZ25lZCBpbnQgdHhfcG9ydF92YWx1ZTsKKworCXVuc2lnbmVkIGludCB2aV9mZWVkX3ZhbHVlOworCS8qIFRhc2hhIEludGVycG9sYXRvciBNb2RlIFNlbGVjdCBmb3IgRUFSLCBIUEhfTCBhbmQgSFBIX1IgKi8KKwl1MzIgaHBoX21vZGU7CisKKwl1MTYgcHJpbV9pbnRfdXNlcnNbVEFTSEFfTlVNX0lOVEVSUE9MQVRPUlNdOworCWludCBzcGxfc3JjX3VzZXJzW1NQTElORV9TUkNfTUFYXTsKKworCXN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcG93ZXJfZ2F0ZV93b3JrOworCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOworCXN0cnVjdCBtdXRleCBzaWRvX2xvY2s7CisKKwkvKiBtYmhjIG1vZHVsZSAqLworCXN0cnVjdCB3Y2RfbWJoYyBtYmhjOworCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG5vdGlmaWVyOworCXN0cnVjdCBtdXRleCBtaWNiX2xvY2s7CisKKwlzdHJ1Y3QgY2xrICp3Y2RfZXh0X2NsazsKKwlzdHJ1Y3QgY2xrICp3Y2RfbmF0aXZlX2NsazsKKwlzdHJ1Y3QgbXV0ZXggc3dyX3JlYWRfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggc3dyX3dyaXRlX2xvY2s7CisJc3RydWN0IG11dGV4IHN3cl9jbGtfbG9jazsKKwlpbnQgc3dyX2Nsa191c2VyczsKKwlpbnQgbmF0aXZlX2Nsa191c2VyczsKKwlpbnQgKCp6ZGV0X2dwaW9fY2IpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBoaWdoKTsKKworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OworCWludCBwb3dlcl9hY3RpdmVfcmVmOworCisJc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgb25fZGVtYW5kX2xpc3RbT05fREVNQU5EX1NVUFBMSUVTX01BWF07CisKKwlpbnQgKCptYWNoaW5lX2NvZGVjX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgZW51bSB3Y2Q5MzM1X2NvZGVjX2V2ZW50KTsKKwlpbnQgc3Brcl9nYWluX29mZnNldDsKKwlpbnQgc3Brcl9tb2RlOworCWludCBlYXJfc3Brcl9nYWluOworCXN0cnVjdCBocGZfd29yayB0eF9ocGZfd29ya1tUQVNIQV9OVU1fREVDSU1BVE9SU107CisJc3RydWN0IHR4X211dGVfd29yayB0eF9tdXRlX2R3b3JrW1RBU0hBX05VTV9ERUNJTUFUT1JTXTsKKwlzdHJ1Y3Qgc3BrX2FuY193b3JrIHNwa19hbmNfZHdvcms7CisJc3RydWN0IG11dGV4IGNvZGVjX211dGV4OworCWludCBocGhfbF9nYWluOworCWludCBocGhfcl9nYWluOworCWludCByeF83X2NvdW50OworCWludCByeF84X2NvdW50OworCWJvb2wgY2xrX21vZGU7CisJYm9vbCBjbGtfaW50ZXJuYWw7CisKKwkvKiBMb2NrIHRvIHByb3RlY3QgbWNsayBlbmFibGVtZW50ICovCisJc3RydWN0IG11dGV4IG1jbGtfbG9jazsKK307CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGJvb2wgdm90ZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGFzaGFfcmVnX21hc2tfdmFsIHRhc2hhX3Nwa3JfZGVmYXVsdFtdID0geworCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMsIDB4ODAsIDB4ODB9LAorCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDMsIDB4ODAsIDB4ODB9LAorCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDdDLCAweDUwfSwKKwl7V0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9zcGtyX21vZGUxW10gPSB7CisJe1dDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMywgMHg4MCwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgMHgwMSwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DVEwsIDB4N0MsIDB4NDR9LAorCXtXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ1RMLCAweDdDLCAweDQ0fSwKK307CisKKy8qCisgKiB3Y2Q5MzM1X2dldF9jb2RlY19pbmZvOiBHZXQgY29kZWMgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKiBAd2NkOXh4eDogcG9pbnRlciB0byB3Y2Q5eHh4IHN0cnVjdHVyZQorICogQHdjZF90eXBlOiBwb2ludGVyIHRvIHdjZDl4eHhfY29kZWNfdHlwZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQorICovCitpbnQgd2NkOTMzNV9nZXRfY29kZWNfaW5mbyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCSAgIHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKndjZF90eXBlKQoreworCXUxNiBpZF9taW5vciwgaWRfbWFqb3I7CisJc3RydWN0IHJlZ21hcCAqd2NkX3JlZ21hcDsKKwlpbnQgcmMsIHZhbCwgdmVyc2lvbiA9IDA7CisKKwlpZiAoIXdjZDl4eHggfHwgIXdjZF90eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghd2NkOXh4eC0+cmVnbWFwKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggcmVnbWFwIGlzIG51bGwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2NkX3JlZ21hcCA9IHdjZDl4eHgtPnJlZ21hcDsKKworCXJjID0gcmVnbWFwX2J1bGtfcmVhZCh3Y2RfcmVnbWFwLCBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTAsCisJCQkodTggKikmaWRfbWlub3IsIHNpemVvZih1MTYpKTsKKwlpZiAocmMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSByZWdtYXBfYnVsa19yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMiwKKwkJCSAgICAgICh1OCAqKSZpZF9tYWpvciwgc2l6ZW9mKHUxNikpOworCWlmIChyYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfaW5mbyh3Y2Q5eHh4LT5kZXYsICIlczogd2NkOXh4eCBjaGlwIGlkIG1ham9yIDB4JXgsIG1pbm9yIDB4JXhcbiIsCisJCSBfX2Z1bmNfXywgaWRfbWFqb3IsIGlkX21pbm9yKTsKKworCS8qIFZlcnNpb24gZGV0ZWN0aW9uICovCisJaWYgKGlkX21ham9yID09IFRBU0hBX01BSk9SKSB7CisJCXJlZ21hcF9yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDAsCisJCQkgICAgJnZhbCk7CisJCXZlcnNpb24gPSAoKHU4KXZhbCAmIDB4ODApID4+IDc7CisJfSBlbHNlIGlmIChpZF9tYWpvciA9PSBUQVNIQTJQMF9NQUpPUikKKwkJdmVyc2lvbiA9IDI7CisJZWxzZQorCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5MzM1IHZlcnNpb24gdW5rbm93biAobWFqb3IgMHgleCwgbWlub3IgMHgleClcbiIsCisJCQlfX2Z1bmNfXywgaWRfbWFqb3IsIGlkX21pbm9yKTsKKworCS8qIEZpbGwgY29kZWMgdHlwZSBpbmZvICovCisJd2NkX3R5cGUtPmlkX21ham9yID0gaWRfbWFqb3I7CisJd2NkX3R5cGUtPmlkX21pbm9yID0gaWRfbWlub3I7CisJd2NkX3R5cGUtPm51bV9pcnFzID0gV0NEOTMzNV9OVU1fSVJRUzsKKwl3Y2RfdHlwZS0+dmVyc2lvbiA9IHZlcnNpb247CisJd2NkX3R5cGUtPnNsaW1fc2xhdmVfdHlwZSA9IFdDRDlYWFhfU0xJTV9TTEFWRV9BRERSX1RZUEVfMTsKKwl3Y2RfdHlwZS0+aTJjX2NoaXBfc3RhdHVzID0gMHgwMTsKKwl3Y2RfdHlwZS0+aW50cl90YmwgPSB3Y2Q5MzM1X2ludHJfdGFibGU7CisJd2NkX3R5cGUtPmludHJfdGJsX3NpemUgPSBBUlJBWV9TSVpFKHdjZDkzMzVfaW50cl90YWJsZSk7CisKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX1NUQVRVU19CQVNFXSA9CisJCQkJCQlXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMwOworCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gPQorCQkJCQkJV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIwOworCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSA9CisJCQkJCQlXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMDsKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0xFVkVMX0JBU0VdID0KKwkJCQkJCVdDRDkzMzVfSU5UUl9MRVZFTDA7CisJd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTFJfQ09NTUlUXSA9CisJCQkJCQlXQ0Q5MzM1X0lOVFJfQ0xSX0NPTU1JVDsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wod2NkOTMzNV9nZXRfY29kZWNfaW5mbyk7CisKKy8qCisgKiB3Y2Q5MzM1X2JyaW5nZG93bjogQnJpbmdkb3duIFdDRCBDb2RlYworICoKKyAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworaW50IHdjZDkzMzVfYnJpbmdkb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCWlmICghd2NkOXh4eCB8fCAhd2NkOXh4eC0+cmVnbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKKwkJICAgICAweDA0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5MzM1X2JyaW5nZG93bik7CisKKy8qCisgKiB3Y2Q5MzM1X2JyaW5ndXA6IEJyaW5ndXAgV0NEIENvZGVjCisgKgorICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gdGhlIHdjZDl4eHggc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworaW50IHdjZDkzMzVfYnJpbmd1cChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgdmFsLCBieXRlMDsKKwlzdHJ1Y3QgcmVnbWFwICp3Y2RfcmVnbWFwOworCisJaWYgKCF3Y2Q5eHh4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghd2NkOXh4eC0+cmVnbWFwKSB7CisJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggcmVnbWFwIGlzIG51bGwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2NkX3JlZ21hcCA9IHdjZDl4eHgtPnJlZ21hcDsKKworCXJlZ21hcF9yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDAsICZ2YWwpOworCXJlZ21hcF9yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwgJmJ5dGUwKTsKKworCWlmICgodmFsIDwgMCkgfHwgKGJ5dGUwIDwgMCkpIHsKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogdGFzaGEgY29kZWMgdmVyc2lvbiBkZXRlY3Rpb24gZmFpbCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKHZhbCAmIDB4ODApICYmIChieXRlMCA9PSAweDApKSB7CisJCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5MzM1IGNvZGVjIHZlcnNpb24gaXMgdjEuMVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzM1X0NPREVDX1JQTV9SU1RfQ1RMLCAweDAxKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF8yLCAweEZDKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF80LCAweDIxKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKKwkJCSAgICAgMHg1KTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKKwkJCSAgICAgMHg3KTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKKwkJCSAgICAgMHgzKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4Myk7CisJfSBlbHNlIGlmIChieXRlMCA9PSAweDEpIHsKKwkJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDkzMzUgY29kZWMgdmVyc2lvbiBpcyB2Mi4wXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDEpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8yLCAweDAwKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF84LCAweDZGKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQklBU19WQkdfRklORV9BREosIDB4NjUpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAorCQkJICAgICAweDUpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAorCQkJICAgICAweDcpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAorCQkJICAgICAweDMpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgzKTsKKwl9IGVsc2UgaWYgKChieXRlMCA9PSAwKSAmJiAoISh2YWwgJiAweDgwKSkpIHsKKwkJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDkzMzUgY29kZWMgdmVyc2lvbiBpcyB2MS4wXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDEpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzIsIDB4RkMpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzQsIDB4MjEpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAorCQkJICAgICAweDMpOworCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgzKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB0YXNoYSBjb2RlYyB2ZXJzaW9uIHVua25vd25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOTMzNV9icmluZ3VwKTsKKworLyoqCisgKiB0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldCAtIG9mZnNldCB0aGUgc3BlYWtlciBwYXRoCisgKiBnYWluIHdpdGggdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS4KKyAqCisgKiBAY29kZWM6IGNvZGVjIGluc3RhbmNlCisgKiBAb2Zmc2V0OiBJbmRpY2F0ZXMgc3BlYWtlciBwYXRoIGdhaW4gb2Zmc2V0IHZhbHVlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCisgKi8KK2ludCB0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2LT5zcGtyX2dhaW5fb2Zmc2V0ID0gb2Zmc2V0OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldCk7CisKKy8qKgorICogdGFzaGFfc2V0X3Nwa3JfbW9kZSAtIENvbmZpZ3VyZXMgc3BlYWtlciBjb21wYW5kZXIgYW5kIHNtYXJ0Ym9vc3QKKyAqIHNldHRpbmdzIGJhc2VkIG9uIHNwZWFrZXIgbW9kZS4KKyAqCisgKiBAY29kZWM6IGNvZGVjIGluc3RhbmNlCisgKiBAbW9kZTogSW5kaWNhdGVzIHNwZWFrZXIgY29uZmlndXJhdGlvbiBtb2RlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCisgKi8KK2ludCB0YXNoYV9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgdGFzaGFfcmVnX21hc2tfdmFsICpyZWdzOworCWludCBzaXplOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgU1BLUl9NT0RFXzE6CisJCXJlZ3MgPSB0YXNoYV9zcGtyX21vZGUxOworCQlzaXplID0gQVJSQVlfU0laRSh0YXNoYV9zcGtyX21vZGUxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVncyA9IHRhc2hhX3Nwa3JfZGVmYXVsdDsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUodGFzaGFfc3Brcl9kZWZhdWx0KTsKKwkJYnJlYWs7CisJfQorCisJcHJpdi0+c3Brcl9tb2RlID0gbW9kZTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdzW2ldLnJlZywKKwkJCQkgICAgcmVnc1tpXS5tYXNrLCByZWdzW2ldLnZhbCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2hhX3NldF9zcGtyX21vZGUpOworCitzdGF0aWMgdm9pZCB0YXNoYV9lbmFibGVfc2lkb19idWNrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX1JDTywgMHg4MCwgMHg4MCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfQlVDS19DVEwsIDB4MDIsIDB4MDIpOworCS8qIDEwMHVzIHNsZWVwIG5lZWRlZCBhZnRlciBJUkVGIHNldHRpbmdzICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CVUNLX0NUTCwgMHgwNCwgMHgwNCk7CisJLyogMTAwdXMgc2xlZXAgbmVlZGVkIGFmdGVyIFZSRUYgc2V0dGluZ3MgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCXRhc2hhLT5yZXNtZ3ItPnNpZG9faW5wdXRfc3JjID0gU0lET19TT1VSQ0VfUkNPX0JHOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwgYm9vbCBjY2xfZmxhZykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXNoYS0+Y29kZWM7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwlpZiAoIVRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHRhc2hhIHZlcnNpb24gPCAycDAsIHJldHVyblxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2lkb19jY2xfY250PSVkLCBjY2xfZmxhZzolZFxuIiwKKwkJCV9fZnVuY19fLCB0YXNoYS0+c2lkb19jY2xfY250LCBjY2xfZmxhZyk7CisJaWYgKGNjbF9mbGFnKSB7CisJCWlmICgrK3Rhc2hhLT5zaWRvX2NjbF9jbnQgPT0gMSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzEwLCAweEZGLCAweDZFKTsKKwl9IGVsc2UgeworCQlpZiAodGFzaGEtPnNpZG9fY2NsX2NudCA9PSAwKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2lkb19jY2wgYWxyZWFkeSBkaXNhYmxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKC0tdGFzaGEtPnNpZG9fY2NsX2NudCA9PSAwKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMTAsIDB4RkYsIDB4MDIpOworCX0KK30KKworc3RhdGljIGJvb2wgdGFzaGFfY2RjX2lzX3N2c19lbmFibGVkKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKK3sKKwlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSAmJgorCQlzdnNfc2NhbGluZ19lbmFibGVkKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCB0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKKwkJCQkgICAgIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGFzaGEtPm1jbGtfbG9jayk7CisJaWYgKGVuYWJsZSkgeworCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHRhc2hhLT53Y2RfZXh0X2Nsayk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBleHQgY2xrIGVuYWJsZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byB1bmxvY2tfbXV0ZXg7CisJCX0KKwkJLyogZ2V0IEJHICovCisJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHRhc2hhLT5yZXNtZ3IpOworCQkvKiBnZXQgTUNMSyAqLworCQl3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGFzaGEtPnJlc21nciwgV0NEX0NMS19NQ0xLKTsKKwl9IGVsc2UgeworCQkvKiBwdXQgTUNMSyAqLworCQl3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhc2hhLT5yZXNtZ3IsIFdDRF9DTEtfTUNMSyk7CisJCS8qIHB1dCBCRyAqLworCQl3Y2RfcmVzbWdyX2Rpc2FibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0YXNoYS0+d2NkX2V4dF9jbGspOworCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCBmYWxzZSk7CisJfQordW5sb2NrX211dGV4OgorCW11dGV4X3VubG9jaygmdGFzaGEtPm1jbGtfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jZGNfY2hlY2tfc2lkb192YWx1ZShlbnVtIHRhc2hhX3NpZG9fdm9sdGFnZSByZXFfbXYpCit7CisJaWYgKChyZXFfbXYgIT0gU0lET19WT0xUQUdFX1NWU19NVikgJiYKKwkJKHJlcV9tdiAhPSBTSURPX1ZPTFRBR0VfTk9NSU5BTF9NVikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2FwcGx5X3NpZG9fdm9sdGFnZSgKKwkJCQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCisJCQkJZW51bSB0YXNoYV9zaWRvX3ZvbHRhZ2UgcmVxX212KQoreworCXUzMiB2b3V0X2RfdmFsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhc2hhLT5jb2RlYzsKKwlpbnQgcmV0OworCisJaWYgKCFjb2RlYykKKwkJcmV0dXJuOworCisJaWYgKCF0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQodGFzaGEpKQorCQlyZXR1cm47CisKKwlpZiAoKHNpZG9fYnVja19zdnNfdm9sdGFnZSAhPSBTSURPX1ZPTFRBR0VfU1ZTX01WKSAmJgorCQkoc2lkb19idWNrX3N2c192b2x0YWdlICE9IFNJRE9fVk9MVEFHRV9OT01JTkFMX01WKSkKKwkJc2lkb19idWNrX3N2c192b2x0YWdlID0gU0lET19WT0xUQUdFX1NWU19NVjsKKworCXJldCA9IHRhc2hhX2NkY19jaGVja19zaWRvX3ZhbHVlKHJlcV9tdik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHJlcXVlc3RlZCBtdj0lZCBub3QgaW4gcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgcmVxX212KTsKKwkJcmV0dXJuOworCX0KKwlpZiAocmVxX212ID09IHRhc2hhLT5zaWRvX3ZvbHRhZ2UpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEFscmVhZHkgYXQgcmVxdWVzdGVkIG12PSVkXG4iLAorCQkJX19mdW5jX18sIHJlcV9tdik7CisJCXJldHVybjsKKwl9CisJaWYgKHJlcV9tdiA9PSBzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UpIHsKKwkJaWYgKHRlc3RfYml0KEFVRElPX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spIHx8CisJCQl0ZXN0X2JpdChDUEVfTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzaykpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6IG5vbWluYWwgY2xpZW50IHJ1bm5pbmcsIHN0YXR1c19tYXNrPSVsdVxuIiwKKwkJCQlfX2Z1bmNfXywgdGFzaGEtPnN0YXR1c19tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBjb21wdXRlIHRoZSB2b3V0X2Qgc3RlcCB2YWx1ZSAqLworCXZvdXRfZF92YWwgPSBDQUxDVUxBVEVfVk9VVF9EKHJlcV9tdik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQlVDS19WT1VUX0QsIHZvdXRfZF92YWwgJiAweEZGKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CVUNLX0NUTCwgMHg4MCwgMHg4MCk7CisKKwkvKiAxIG1zZWMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgU0lETyBWb3V0X0Qgdm9sdGFnZSBjaGFuZ2UgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJdGFzaGEtPnNpZG9fdm9sdGFnZSA9IHJlcV9tdjsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogdXBkYXRlZCBTSURPIGJ1Y2sgVm91dF9EIHRvICVkLCB2b3V0X2Qgc3RlcCA9ICV1XG4iLAorCQlfX2Z1bmNfXywgdGFzaGEtPnNpZG9fdm9sdGFnZSwgdm91dF9kX3ZhbCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CVUNLX0NUTCwKKwkJCQkweDgwLCAweDAwKTsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKAorCQkJCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKKwkJCQllbnVtIHRhc2hhX3NpZG9fdm9sdGFnZSByZXFfbXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZ0YXNoYS0+c2lkb19sb2NrKTsKKwkvKiBlbmFibGUgbWNsayBiZWZvcmUgc2V0dGluZyBTSURPIHZvbHRhZ2UgKi8KKwlyZXQgPSB0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBleHQgY2xrIGVuYWJsZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwl0YXNoYV9jb2RlY19hcHBseV9zaWRvX3ZvbHRhZ2UodGFzaGEsIHJlcV9tdik7CisJdGFzaGFfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXNoYSwgZmFsc2UpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+c2lkb19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdGFzaGFfZW5hYmxlX2VmdXNlX3NlbnNpbmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIHRydWUsIGZhbHNlKTsKKworCWlmICghVEFTSEFfSVNfMl8wKHByaXYtPndjZDl4eHgpKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCwKKwkJCQkgICAgMHgxRSwgMHgwMik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsCisJCQkgICAgMHgwMSwgMHgwMSk7CisJLyoKKwkgKiA1bXMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZW5hYmxpbmcgZWZ1c2UgY29udHJvbAorCSAqIGJlZm9yZSBjaGVja2luZyB0aGUgc3RhdHVzLgorCSAqLworCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKwlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTKSAmIDB4MDEpKQorCQlXQVJOKDEsICIlczogRWZ1c2Ugc2Vuc2UgaXMgbm90IGNvbXBsZXRlXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoVEFTSEFfSVNfMl8wKHByaXYtPndjZDl4eHgpKSB7CisJCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCVdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDApICYgMHg0MCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0FURVNULAorCQkJCQkgICAgMHgwNCwgMHgwMCk7CisJCXRhc2hhX2VuYWJsZV9zaWRvX2J1Y2soY29kZWMpOworCX0KKworCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgZmFsc2UsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXNoYV9lbmFibGVfZWZ1c2Vfc2Vuc2luZyk7CisKK3ZvaWQgKnRhc2hhX2dldF9hZmVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGNvbmZpZ190eXBlKSB7CisJY2FzZSBBRkVfU0xJTUJVU19TTEFWRV9DT05GSUc6CisJCXJldHVybiAmcHJpdi0+c2xpbWJ1c19zbGF2ZV9jZmc7CisJY2FzZSBBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUc6CisJCXJldHVybiAmdGFzaGFfYXVkaW9fcmVnX2NmZzsKKwljYXNlIEFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHOgorCQlyZXR1cm4gJnRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmc7CisJY2FzZSBBRkVfQUFOQ19WRVJTSU9OOgorCQlyZXR1cm4gJnRhc2hhX2NkY19hYW5jX3ZlcnNpb247CisJY2FzZSBBRkVfQ0xJUF9CQU5LX1NFTDoKKwkJcmV0dXJuIE5VTEw7CisJY2FzZSBBRkVfQ0RDX0NMSVBfUkVHSVNURVJTX0NPTkZJRzoKKwkJcmV0dXJuIE5VTEw7CisJY2FzZSBBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHOgorCQlyZXR1cm4gJnRhc2hhX2NkY19yZWdfcGFnZV9jZmc7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFVua25vd24gY29uZmlnX3R5cGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBjb25maWdfdHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfZ2V0X2FmZV9jb25maWcpOworCisvKgorICogdGFzaGFfZXZlbnRfcmVnaXN0ZXI6IFJlZ2lzdGVycyBhIG1hY2hpbmUgZHJpdmVyIGNhbGxiYWNrCisgKiBmdW5jdGlvbiB3aXRoIGNvZGVjIHByaXZhdGUgZGF0YSBmb3IgcG9zdCBBRFNQIHN1Yi1zeXN0ZW0KKyAqIHJlc3RhcnQgKFNTUikuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZnJvbQorICogY29kZWMgZHJpdmVyIG9uY2UgY29kZWMgY29tZXMgb3V0IG9mIHJlc2V0IGFmdGVyIEFEU1AgU1NSLgorICoKKyAqIEBtYWNoaW5lX2V2ZW50X2NiOiBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIG1hY2hpbmUgZHJpdmVyCisgKiBAY29kZWM6IENvZGVjIGluc3RhbmNlCisgKgorICogUmV0dXJuOiBub25lCisgKi8KK3ZvaWQgdGFzaGFfZXZlbnRfcmVnaXN0ZXIoCisJaW50ICgqbWFjaGluZV9ldmVudF9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWVudW0gd2NkOTMzNV9jb2RlY19ldmVudCksCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHRhc2hhKQorCQl0YXNoYS0+bWFjaGluZV9jb2RlY19ldmVudF9jYiA9IG1hY2hpbmVfZXZlbnRfY2I7CisJZWxzZQorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCB0YXNoYV9wcml2IGRhdGFcbiIsIF9fZnVuY19fKTsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfZXZlbnRfcmVnaXN0ZXIpOworCitzdGF0aWMgaW50IHRhc2hhX21iaGNfcmVxdWVzdF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQorCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKKworCXJldHVybiB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBpcnEsIGhhbmRsZXIsIG5hbWUsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9tYmhjX2lycV9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICBpbnQgaXJxLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KKwkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7CisJaWYgKGVuYWJsZSkKKwkJd2NkOXh4eF9lbmFibGVfaXJxKGNvcmVfcmVzLCBpcnEpOworCWVsc2UKKwkJd2NkOXh4eF9kaXNhYmxlX2lycShjb3JlX3JlcywgaXJxKTsKK30KKworc3RhdGljIGludCB0YXNoYV9tYmhjX2ZyZWVfaXJxKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQorCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKKworCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIGlycSwgZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX21iaGNfY2xrX3NldHVwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8xLAorCQkJCSAgICAweDgwLCAweDgwKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19DVExfMSwKKwkJCQkgICAgMHg4MCwgMHgwMCk7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfbWJoY19idG5fdG9fbnVtKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zKSAmIDB4NzsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfbWJoY19tYmhjX2JpYXNfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNULAorCQkJCSAgICAweDAxLCAweDAxKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsCisJCQkJICAgIDB4MDEsIDB4MDApOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9tYmhjX3Byb2dyYW1fYnRuX3RocihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHMxNiAqYnRuX2xvdywgczE2ICpidG5faGlnaCwKKwkJCQkgICAgICAgaW50IG51bV9idG4sIGJvb2wgaXNfbWljYmlhcykKK3sKKwlpbnQgaTsKKwlpbnQgdnRoOworCisJaWYgKG51bV9idG4gPiBXQ0RfTUJIQ19ERUZfQlVUVE9OUykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBudW1iZXIgb2YgYnV0dG9uczogJWRcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2J0bik7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBUYXNoYSBqdXN0IG5lZWRzIG9uZSBzZXQgb2YgdGhyZXNob2xkcyBmb3IgYnV0dG9uIGRldGVjdGlvbgorCSAqIGR1ZSB0byBtaWNiaWFzIHZvbHRhZ2UgcmFtcCB0byBwdWxsdXAgdXBvbiBidXR0b24gcHJlc3MuIFNvCisJICogYnRuX2xvdyBhbmQgaXNfbWljYmlhcyBhcmUgaWdub3JlZCBhbmQgYWx3YXlzIHByb2dyYW0gYnV0dG9uCisJICogdGhyZXNob2xkcyB1c2luZyBidG5faGlnaC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J0bjsgaSsrKSB7CisJCXZ0aCA9ICgoYnRuX2hpZ2hbaV0gKiAyKSAvIDI1KSAmIDB4M0Y7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlROMCArIGksCisJCQkJICAgIDB4RkMsIHZ0aCA8PCAyKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGJ0bl9oaWdoWyVkXTogJWQsIHZ0aDogJWRcbiIsCisJCQlfX2Z1bmNfXywgaSwgYnRuX2hpZ2hbaV0sIHZ0aCk7CisJfQorfQorCitzdGF0aWMgYm9vbCB0YXNoYV9tYmhjX2xvY2tfc2xlZXAoc3RydWN0IHdjZF9tYmhjICptYmhjLCBib29sIGxvY2spCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCWlmIChsb2NrKQorCQlyZXR1cm4gd2NkOXh4eF9sb2NrX3NsZWVwKGNvcmVfcmVzKTsKKwllbHNlIHsKKwkJd2NkOXh4eF91bmxvY2tfc2xlZXAoY29yZV9yZXMpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfbWJoY19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCisJCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrLAorCQkJCQlib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChlbmFibGUpCisJCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmdGFzaGEtPm5vdGlmaWVyLAorCQkJCQkJCW5ibG9jayk7CisJZWxzZQorCQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmdGFzaGEtPm5vdGlmaWVyLAorCQkJCQkJCSAgbmJsb2NrKTsKK30KKworc3RhdGljIGJvb2wgdGFzaGFfbWJoY19taWNiX2VuX3N0YXR1cyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIGludCBtaWNiX251bSkKK3sKKwl1OCB2YWw7CisKKwlpZiAobWljYl9udW0gPT0gTUlDX0JJQVNfMikgeworCQl2YWwgPSAoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMikgPj4gNik7CisJCWlmICh2YWwgPT0gMHgwMSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHRhc2hhX21iaGNfaHBoX3BhX29uX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCkgJiAweEMwKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfbWJoY19ocGhfbF9wdWxsX3VwX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQllbnVtIG1iaGNfaHNfcHVsbHVwX2lyZWYgcHVsbF91cF9jdXIpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIXRhc2hhKQorCQlyZXR1cm47CisKKwkvKiBEZWZhdWx0IHB1bGwgdXAgY3VycmVudCB0byAydUEgKi8KKwlpZiAocHVsbF91cF9jdXIgPCBJX09GRiB8fCBwdWxsX3VwX2N1ciA+IElfM1AwX1VBIHx8CisJICAgIHB1bGxfdXBfY3VyID09IElfREVGQVVMVCkKKwkJcHVsbF91cF9jdXIgPSBJXzJQMF9VQTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBIUyBwdWxsIHVwIGN1cnJlbnQ6JWRcbiIsCisJCV9fZnVuY19fLCBwdWxsX3VwX2N1cik7CisKKwlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX1BMVUdfREVURUNUX0NUTCwKKwkJCSAgICAweEMwLCBwdWxsX3VwX2N1ciA8PCA2KTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwsCisJCQkgICAgMHhDMCwgMHg0MCk7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfZW5hYmxlX2V4dF9tYl9zb3VyY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQlib29sIHR1cm5fb24pCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgKnN1cHBseTsKKworCWlmICghdGFzaGEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3VwcGx5ID0gICZ0YXNoYS0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdOworCWlmICghc3VwcGx5LT5zdXBwbHkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHdhcm5pbmcgc3VwcGx5IG5vdCBwcmVzZW50IG9uZCBmb3IgJXNcbiIsCisJCQkJX19mdW5jX18sICJvbkRlbWFuZCBNaWNiaWFzIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgdHVybl9vbjogJWQgY291bnQ6ICVkXG4iLCBfX2Z1bmNfXywgdHVybl9vbiwKKwkJc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQpOworCisJaWYgKHR1cm5fb24pIHsKKwkJaWYgKCEoc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQpKSB7CisJCQlyZXQgPSBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigKKwkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKKwkJfQorCQlzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCsrOworCX0gZWxzZSB7CisJCWlmIChzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCA+IDApCisJCQlzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudC0tOworCQlpZiAoIShzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCkpIHsKKwkJCXJldCA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigKKwkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKKwkJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byAlcyBleHRlcm5hbCBtaWNiaWFzIHNvdXJjZVxuIiwKKwkJCV9fZnVuY19fLCB0dXJuX29uID8gImVuYWJsZSIgOiAiZGlzYWJsZWQiKTsKKwllbHNlCisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyBleHRlcm5hbCBtaWNiaWFzIHNvdXJjZVxuIiwKKwkJCV9fZnVuY19fLCB0dXJuX29uID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX21pY2JpYXNfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJIGludCBtaWNiX251bSwKKwkJCQkgaW50IHJlcSwgYm9vbCBpc19kYXBtKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBtaWNiX2luZGV4ID0gbWljYl9udW0gLSAxOworCXUxNiBtaWNiX3JlZzsKKwlpbnQgcHJlX29mZl9ldmVudCA9IDAsIHBvc3Rfb2ZmX2V2ZW50ID0gMDsKKwlpbnQgcG9zdF9vbl9ldmVudCA9IDAsIHBvc3RfZGFwbV9vZmYgPSAwOworCWludCBwb3N0X2RhcG1fb24gPSAwOworCisJaWYgKChtaWNiX2luZGV4IDwgMCkgfHwgKG1pY2JfaW5kZXggPiBUQVNIQV9NQVhfTUlDQklBUyAtIDEpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1pY2JpYXMgaW5kZXgsIG1pY2JfaW5kOiVkXG4iLAorCQkJX19mdW5jX18sIG1pY2JfaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoIChtaWNiX251bSkgeworCWNhc2UgTUlDX0JJQVNfMToKKwkJbWljYl9yZWcgPSBXQ0Q5MzM1X0FOQV9NSUNCMTsKKwkJYnJlYWs7CisJY2FzZSBNSUNfQklBU18yOgorCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0IyOworCQlwcmVfb2ZmX2V2ZW50ID0gV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGOworCQlwb3N0X29mZl9ldmVudCA9IFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY7CisJCXBvc3Rfb25fZXZlbnQgPSBXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT047CisJCXBvc3RfZGFwbV9vbiA9IFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OOworCQlwb3N0X2RhcG1fb2ZmID0gV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGOworCQlicmVhazsKKwljYXNlIE1JQ19CSUFTXzM6CisJCW1pY2JfcmVnID0gV0NEOTMzNV9BTkFfTUlDQjM7CisJCWJyZWFrOworCWNhc2UgTUlDX0JJQVNfNDoKKwkJbWljYl9yZWcgPSBXQ0Q5MzM1X0FOQV9NSUNCNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBudW1iZXI6ICVkXG4iLAorCQkJX19mdW5jX18sIG1pY2JfbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJnRhc2hhLT5taWNiX2xvY2spOworCisJc3dpdGNoIChyZXEpIHsKKwljYXNlIE1JQ0JfUFVMTFVQX0VOQUJMRToKKwkJdGFzaGEtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0rKzsKKwkJaWYgKCh0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAxKSAmJgorCQkgICAgKHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBNSUNCX1BVTExVUF9ESVNBQkxFOgorCQlpZiAodGFzaGEtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0gPiAwKQorCQkJdGFzaGEtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0tLTsKKwkJaWYgKCh0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAwKSAmJgorCQkgICAgKHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBNSUNCX0VOQUJMRToKKwkJdGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdKys7CisJCWlmICh0YXNoYS0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4NDApOworCQkJaWYgKHBvc3Rfb25fZXZlbnQpCisJCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAorCQkJCQkJcG9zdF9vbl9ldmVudCwgJnRhc2hhLT5tYmhjKTsKKwkJfQorCQlpZiAoaXNfZGFwbSAmJiBwb3N0X2RhcG1fb24pCisJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCXBvc3RfZGFwbV9vbiwgJnRhc2hhLT5tYmhjKTsKKwkJYnJlYWs7CisJY2FzZSBNSUNCX0RJU0FCTEU6CisJCWlmICh0YXNoYS0+bWljYl9yZWZbbWljYl9pbmRleF0gPiAwKQorCQkJdGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdLS07CisJCWlmICgodGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApICYmCisJCSAgICAodGFzaGEtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0gPiAwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKKwkJZWxzZSBpZiAoKHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSAmJgorCQkJICh0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAwKSkgeworCQkJaWYgKHByZV9vZmZfZXZlbnQpCisJCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAorCQkJCQkJcHJlX29mZl9ldmVudCwgJnRhc2hhLT5tYmhjKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKKwkJCWlmIChwb3N0X29mZl9ldmVudCkKKwkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCQlwb3N0X29mZl9ldmVudCwgJnRhc2hhLT5tYmhjKTsKKwkJfQorCQlpZiAoaXNfZGFwbSAmJiBwb3N0X2RhcG1fb2ZmKQorCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAorCQkJCQlwb3N0X2RhcG1fb2ZmLCAmdGFzaGEtPm1iaGMpOworCQlicmVhazsKKwl9OworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1pY2JfbnVtOiVkLCBtaWNiX3JlZjogJWQsIHB1bGx1cF9yZWY6ICVkXG4iLAorCQlfX2Z1bmNfXywgbWljYl9udW0sIHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSwKKwkJdGFzaGEtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0pOworCisJbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+bWljYl9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX21iaGNfcmVxdWVzdF9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBpbnQgbWljYl9udW0sIGludCByZXEpCit7CisJaW50IHJldDsKKworCS8qCisJICogSWYgbWljYmlhcyBpcyByZXF1ZXN0ZWQsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlCisJICogaXMgdm90ZSB0byBlbmFibGUgbWNsaworCSAqLworCWlmIChyZXEgPT0gTUlDQl9FTkFCTEUpCisJCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgZmFsc2UpOworCisJcmV0ID0gdGFzaGFfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgcmVxLCBmYWxzZSk7CisKKwkvKgorCSAqIFJlbGVhc2Ugdm90ZSBmb3IgbWNsayB3aGlsZSByZXF1ZXN0aW5nIGZvcgorCSAqIG1pY2JpYXMgZGlzYWJsZQorCSAqLworCWlmIChyZXEgPT0gTUlDQl9ESVNBQkxFKQorCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9tYmhjX21pY2JfcmFtcF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMl9SQU1QLAorCQkJCSAgICAweDFDLCAweDBDKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCwKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCwKKwkJCQkgICAgMHg4MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01JQ0IyX1JBTVAsCisJCQkJICAgIDB4MUMsIDB4MDApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9jYWwgKnRhc2hhX2dldF9od2RlcF9md19jYWwoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCQkJICAgZW51bSB3Y2RfY2FsX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzOiBOVUxMIGNvZGVjIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwodGFzaGEtPmZ3X2RhdGEsIHR5cGUpOworCWlmICghaHdkZXBfY2FsKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY2FsIG5vdCBzZW50IGJ5ICVkXG4iLAorCQkJX19mdW5jX18sIHR5cGUpOworCisJcmV0dXJuIGh3ZGVwX2NhbDsKK30KKworc3RhdGljIGludCB0YXNoYV9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgIGludCByZXFfdm9sdCwKKwkJCQkJICBpbnQgbWljYl9udW0pCit7CisJaW50IGN1cl92b3V0X2N0bCwgcmVxX3ZvdXRfY3RsOworCWludCBtaWNiX3JlZywgbWljYl92YWwsIG1pY2JfZW47CisKKwlzd2l0Y2ggKG1pY2JfbnVtKSB7CisJY2FzZSBNSUNfQklBU18xOgorCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0IxOworCQlicmVhazsKKwljYXNlIE1JQ19CSUFTXzI6CisJCW1pY2JfcmVnID0gV0NEOTMzNV9BTkFfTUlDQjI7CisJCWJyZWFrOworCWNhc2UgTUlDX0JJQVNfMzoKKwkJbWljYl9yZWcgPSBXQ0Q5MzM1X0FOQV9NSUNCMzsKKwkJYnJlYWs7CisJY2FzZSBNSUNfQklBU180OgorCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0I0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIElmIHJlcXVlc3RlZCBtaWNiaWFzIHZvbHRhZ2UgaXMgc2FtZSBhcyBjdXJyZW50IG1pY2JpYXMKKwkgKiB2b2x0YWdlLCB0aGVuIGp1c3QgcmV0dXJuLiBPdGhlcndpc2UsIGFkanVzdCB2b2x0YWdlIGFzCisJICogcGVyIHJlcXVlc3RlZCB2YWx1ZS4gSWYgbWljYmlhcyBpcyBhbHJlYWR5IGVuYWJsZWQsIHRoZW4KKwkgKiB0byBhdm9pZCBzbG93IG1pY2JpYXMgcmFtcC11cCBvciBkb3duIGVuYWJsZSBwdWxsLXVwCisJICogbW9tZW50YXJpbHksIGNoYW5nZSB0aGUgbWljYmlhcyB2YWx1ZSBhbmQgdGhlbiByZS1lbmFibGUKKwkgKiBtaWNiaWFzLgorCSAqLworCW1pY2JfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBtaWNiX3JlZyk7CisJbWljYl9lbiA9IChtaWNiX3ZhbCAmIDB4QzApID4+IDY7CisJY3VyX3ZvdXRfY3RsID0gbWljYl92YWwgJiAweDNGOworCisJcmVxX3ZvdXRfY3RsID0gd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwocmVxX3ZvbHQpOworCWlmIChJU19FUlJfVkFMVUUocmVxX3ZvdXRfY3RsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGN1cl92b3V0X2N0bCA9PSByZXFfdm91dF9jdGwpCisJCXJldHVybiAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1pY2JfbnVtOiAlZCwgY3VyX212OiAlZCwgcmVxX212OiAlZCwgbWljYl9lbjogJWRcbiIsCisJCSBfX2Z1bmNfXywgbWljYl9udW0sIFdDRF9WT1VUX0NUTF9UT19NSUNCKGN1cl92b3V0X2N0bCksCisJCSByZXFfdm9sdCwgbWljYl9lbik7CisKKwlpZiAobWljYl9lbiA9PSAweDEpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweDNGLCByZXFfdm91dF9jdGwpOworCisJaWYgKG1pY2JfZW4gPT0gMHgxKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDQwKTsKKwkJLyoKKwkJICogQWRkIDJtcyBkZWxheSBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgYWZ0ZXIgZW5hYmxpbmcKKwkJICogbWljYmlhcworCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX21iaGNfbWljYl9jdHJsX3RocmVzaG9sZF9taWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgICBpbnQgbWljYl9udW0sIGJvb2wgcmVxX2VuKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlpbnQgcmMsIG1pY2JfbXY7CisKKwlpZiAobWljYl9udW0gIT0gTUlDX0JJQVNfMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIElmIGRldmljZSB0cmVlIG1pY2JpYXMgbGV2ZWwgaXMgYWxyZWFkeSBhYm92ZSB0aGUgbWluaW11bQorCSAqIHZvbHRhZ2UgbmVlZGVkIHRvIGRldGVjdCB0aHJlc2hvbGQgbWljcm9waG9uZSwgdGhlbiBkbworCSAqIG5vdCBjaGFuZ2UgdGhlIG1pY2JpYXMsIGp1c3QgcmV0dXJuLgorCSAqLworCWlmIChwZGF0YS0+bWljYmlhcy5taWNiMl9tdiA+PSBXQ0RfTUJIQ19USFJfSFNfTUlDQl9NVikKKwkJcmV0dXJuIDA7CisKKwltaWNiX212ID0gcmVxX2VuID8gV0NEX01CSENfVEhSX0hTX01JQ0JfTVYgOiBwZGF0YS0+bWljYmlhcy5taWNiMl9tdjsKKworCW11dGV4X2xvY2soJnRhc2hhLT5taWNiX2xvY2spOworCXJjID0gdGFzaGFfbWJoY19taWNiX2FkanVzdF92b2x0YWdlKGNvZGVjLCBtaWNiX212LCBNSUNfQklBU18yKTsKKwltdXRleF91bmxvY2soJnRhc2hhLT5taWNiX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFzaGFfbWJoY19nZXRfcmVzdWx0X3BhcmFtcyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCQkJCXMxNiAqZDFfYSwgdTE2IG5vZmYsCisJCQkJCQlpbnQzMl90ICp6ZGV0KQoreworCWludCBpOworCWludCB2YWwsIHZhbDE7CisJczE2IGMxOworCXMzMiB4MSwgZDE7CisJaW50MzJfdCBkZW5vbTsKKwlpbnQgbWluQ29kZV9wYXJhbVtdID0geworCQkJMzI3NywgMTYzOSwgODIwLCA0MTAsIDIwNSwgMTAzLCA1MiwgMjYKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDIwLCAweDIwKTsKKwlmb3IgKGkgPSAwOyBpIDwgVEFTSEFfWkRFVF9OVU1fTUVBU1VSRU1FTlRTOyBpKyspIHsKKwkJcmVnbWFwX3JlYWQod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8yLCAmdmFsKTsKKwkJaWYgKHZhbCAmIDB4ODApCisJCQlicmVhazsKKwl9CisJdmFsID0gdmFsIDw8IDB4ODsKKwlyZWdtYXBfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzEsICZ2YWwxKTsKKwl2YWwgfD0gdmFsMTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQsIDB4MjAsIDB4MDApOworCXgxID0gVEFTSEFfTUJIQ19HRVRfWDEodmFsKTsKKwljMSA9IFRBU0hBX01CSENfR0VUX0MxKHZhbCk7CisJLyogSWYgcmFtcCBpcyBub3QgY29tcGxldGUsIGdpdmUgYWRkaXRpb25hbCA1bXMgKi8KKwlpZiAoKGMxIDwgMikgJiYgeDEpCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MDUwKTsKKworCWlmICghYzEgfHwgIXgxKSB7CisJCWRldl9kYmcod2NkOXh4eC0+ZGV2LAorCQkJIiVzOiBJbXBlZGFuY2UgZGV0ZWN0IHJhbXAgZXJyb3IsIGMxPSVkLCB4MT0weCV4XG4iLAorCQkJX19mdW5jX18sIGMxLCB4MSk7CisJCWdvdG8gcmFtcF9kb3duOworCX0KKwlkMSA9IGQxX2FbYzFdOworCWRlbm9tID0gKHgxICogZDEpIC0gKDEgPDwgKDE0IC0gbm9mZikpOworCWlmIChkZW5vbSA+IDApCisJCSp6ZGV0ID0gKFRBU0hBX01CSENfWkRFVF9DT05TVCAqIDEwMDApIC8gZGVub207CisJZWxzZSBpZiAoeDEgPCBtaW5Db2RlX3BhcmFtW25vZmZdKQorCQkqemRldCA9IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOworCisJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogZDE9JWQsIGMxPSVkLCB4MT0weCV4LCB6X3ZhbD0lZChtaWxsaU9obSlcbiIsCisJCV9fZnVuY19fLCBkMSwgYzEsIHgxLCAqemRldCk7CityYW1wX2Rvd246CisJaSA9IDA7CisJd2hpbGUgKHgxKSB7CisJCXJlZ21hcF9idWxrX3JlYWQod2NkOXh4eC0+cmVnbWFwLAorCQkJCSBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8xLCAodTggKikmdmFsLCAyKTsKKwkJeDEgPSBUQVNIQV9NQkhDX0dFVF9YMSh2YWwpOworCQlpKys7CisJCWlmIChpID09IFRBU0hBX1pERVRfTlVNX01FQVNVUkVNRU5UUykKKwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqIHRhc2hhX21iaGNfemRldF9ncGlvX2N0cmw6IFJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZvcgorICogY29udHJvbGxpbmcgdGhlIHN3aXRjaCBvbiBoaWZpIGFtcHMuIERlZmF1bHQgc3dpdGNoIHN0YXRlCisgKiB3aWxsIHB1dCBhIDUxb2htIGxvYWQgaW4gcGFyYWxsZWwgdG8gdGhlIGhwaCBsb2FkLiBTbywKKyAqIGltcGVkYW5jZSBkZXRlY3Rpb24gZnVuY3Rpb24gd2lsbCBwdWxsIHRoZSBncGlvIGhpZ2gKKyAqIHRvIG1ha2UgdGhlIHN3aXRjaCBvcGVuLgorICoKKyAqIEB6ZGV0X2dwaW9fY2I6IGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gbWFjaGluZSBkcml2ZXIKKyAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKKyAqCisgKiBSZXR1cm46IG5vbmUKKyAqLwordm9pZCB0YXNoYV9tYmhjX3pkZXRfZ3Bpb19jdHJsKAorCQlpbnQgKCp6ZGV0X2dwaW9fY2IpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBoaWdoKSwKKwkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdGFzaGEtPnpkZXRfZ3Bpb19jYiA9IHpkZXRfZ3Bpb19jYjsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfbWJoY196ZGV0X2dwaW9fY3RybCk7CisKK3N0YXRpYyB2b2lkIHRhc2hhX21iaGNfemRldF9yYW1wKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgc3RydWN0IHRhc2hhX21iaGNfemRldF9wYXJhbSAqemRldF9wYXJhbSwKKwkJCQkgaW50MzJfdCAqemwsIGludDMyX3QgKnpyLCBzMTYgKmQxX2EpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlpbnQzMl90IHpkZXQgPSAwOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfQU5BX0NUTCwgMHg3MCwKKwkJCSAgICB6ZGV0X3BhcmFtLT5sZG9fY3RsIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONSwgMHhGQywKKwkJCSAgICB6ZGV0X3BhcmFtLT5idG41KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjYsIDB4RkMsCisJCQkgICAgemRldF9wYXJhbS0+YnRuNik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE43LCAweEZDLAorCQkJICAgIHpkZXRfcGFyYW0tPmJ0bjcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX0FOQV9DVEwsIDB4MEYsCisJCQkgICAgemRldF9wYXJhbS0+bm9mZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfUkFNUF9DVEwsIDB4MEYsCisJCQkgICAgemRldF9wYXJhbS0+bnNoaWZ0KTsKKworCWlmICghemwpCisJCWdvdG8gel9yaWdodDsKKwkvKiBTdGFydCBpbXBlZGFuY2UgbWVhc3VyZW1lbnQgZm9yIEhQSF9MICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzMzVfQU5BX01CSENfWkRFVCwgMHg4MCwgMHg4MCk7CisJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogcmFtcCBmb3IgSFBIX0wsIG5vZmYgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHpkZXRfcGFyYW0tPm5vZmYpOworCXRhc2hhX21iaGNfZ2V0X3Jlc3VsdF9wYXJhbXMod2NkOXh4eCwgZDFfYSwgemRldF9wYXJhbS0+bm9mZiwgJnpkZXQpOworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQsIDB4ODAsIDB4MDApOworCisJKnpsID0gemRldDsKKworel9yaWdodDoKKwlpZiAoIXpyKQorCQlyZXR1cm47CisJLyogU3RhcnQgaW1wZWRhbmNlIG1lYXN1cmVtZW50IGZvciBIUEhfUiAqLworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQsIDB4NDAsIDB4NDApOworCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IHJhbXAgZm9yIEhQSF9SLCBub2ZmID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCB6ZGV0X3BhcmFtLT5ub2ZmKTsKKwl0YXNoYV9tYmhjX2dldF9yZXN1bHRfcGFyYW1zKHdjZDl4eHgsIGQxX2EsIHpkZXRfcGFyYW0tPm5vZmYsICZ6ZGV0KTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAorCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDQwLCAweDAwKTsKKworCSp6ciA9IHpkZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNoYV93Y2RfbWJoY19xZnVzZV9jYWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlpbnQzMl90ICp6X3ZhbCwgaW50IGZsYWdfbF9yKQoreworCXMxNiBxMTsKKwlpbnQgcTFfY2FsOworCisJaWYgKCp6X3ZhbCA8IChUQVNIQV9aREVUX1ZBTF80MDAvMTAwMCkpCisJCXExID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSArICgyICogZmxhZ19sX3IpKTsKKwllbHNlCisJCXExID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMiArICgyICogZmxhZ19sX3IpKTsKKwlpZiAocTEgJiAweDgwKQorCQlxMV9jYWwgPSAoMTAwMDAgLSAoKHExICYgMHg3RikgKiAyNSkpOworCWVsc2UKKwkJcTFfY2FsID0gKDEwMDAwICsgKHExICogMjUpKTsKKwlpZiAocTFfY2FsID4gMCkKKwkJKnpfdmFsID0gKCgqel92YWwpICogMTAwMDApIC8gcTFfY2FsOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV93Y2RfbWJoY19jYWxjX2ltcGVkYW5jZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCQkJICB1aW50MzJfdCAqenIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKKwlzMTYgcmVnMCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKKwlpbnQzMl90IHoxTCwgejFSLCB6MUxzOworCWludCB6TW9ubywgel9kaWZmMSwgel9kaWZmMjsKKwlib29sIGlzX2ZzbV9kaXNhYmxlID0gZmFsc2U7CisJYm9vbCBpc19jaGFuZ2UgPSBmYWxzZTsKKwlzdHJ1Y3QgdGFzaGFfbWJoY196ZGV0X3BhcmFtIHpkZXRfcGFyYW1bXSA9IHsKKwkJezQsIDAsIDQsIDB4MDgsIDB4MTQsIDB4MTh9LCAvKiA8IDMyb2htICovCisJCXsyLCAwLCAzLCAweDE4LCAweDdDLCAweDkwfSwgLyogMzJvaG0gPCBaIDwgNDAwb2htICovCisJCXsxLCA0LCA1LCAweDE4LCAweDdDLCAweDkwfSwgLyogNDAwb2htIDwgWiA8IDEyMDBvaG0gKi8KKwkJezEsIDYsIDcsIDB4MTgsIDB4N0MsIDB4OTB9LCAvKiA+MTIwMG9obSAqLworCX07CisJc3RydWN0IHRhc2hhX21iaGNfemRldF9wYXJhbSAqemRldF9wYXJhbV9wdHIgPSBOVUxMOworCXMxNiBkMV9hW11bNF0gPSB7CisJCXswLCAzMCwgOTAsIDMwfSwKKwkJezAsIDMwLCAzMCwgNX0sCisJCXswLCAzMCwgMzAsIDV9LAorCQl7MCwgMzAsIDMwLCA1fSwKKwl9OworCXMxNiAqZDEgPSBOVUxMOworCisJaWYgKCFUQVNIQV9JU18yXzAod2NkOXh4eCkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFotZGV0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgY29kZWMgdmVyc2lvblxuIiwKKwkJCQkJX19mdW5jX18pOworCQkqemwgPSAwOworCQkqenIgPSAwOworCQlyZXR1cm47CisJfQorCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOworCisJaWYgKHRhc2hhLT56ZGV0X2dwaW9fY2IpCisJCWlzX2NoYW5nZSA9IHRhc2hhLT56ZGV0X2dwaW9fY2IoY29kZWMsIHRydWUpOworCisJcmVnMCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE41KTsKKwlyZWcxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjYpOworCXJlZzIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONyk7CisJcmVnMyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8xKTsKKwlyZWc0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMKTsKKworCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QpICYgMHg4MCkgeworCQlpc19mc21fZGlzYWJsZSA9IHRydWU7CisJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgMHgwMCk7CisJfQorCisJLyogRm9yIE5PLWphY2ssIGRpc2FibGUgTF9ERVRfRU4gYmVmb3JlIFotZGV0IG1lYXN1cmVtZW50cyAqLworCWlmIChtYmhjLT5ocGhsX3N3aCkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4ODAsIDB4MDApOworCisJLyogRW5hYmxlIEFaICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8xLCAweDBDLCAweDA0KTsKKwkvKiBUdXJuIG9mZiAxMDBrIHB1bGwgZG93biBvbiBIUEhMICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgwMSwgMHgwMCk7CisKKwkvKiBGaXJzdCBnZXQgaW1wZWRhbmNlIG9uIExlZnQgKi8KKwlkMSA9IGQxX2FbMV07CisJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsxXTsKKwl0YXNoYV9tYmhjX3pkZXRfcmFtcChjb2RlYywgemRldF9wYXJhbV9wdHIsICZ6MUwsIE5VTEwsIGQxKTsKKworCWlmICghVEFTSEFfTUJIQ19JU19TRUNPTkRfUkFNUF9SRVFVSVJFRCh6MUwpKQorCQlnb3RvIGxlZnRfY2hfaW1wZWRhbmNlOworCisJLyogc2Vjb25kIHJhbXAgZm9yIGxlZnQgY2ggKi8KKwlpZiAoejFMIDwgVEFTSEFfWkRFVF9WQUxfMzIpIHsKKwkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVswXTsKKwkJZDEgPSBkMV9hWzBdOworCX0gZWxzZSBpZiAoKHoxTCA+IFRBU0hBX1pERVRfVkFMXzQwMCkgJiYgKHoxTCA8PSBUQVNIQV9aREVUX1ZBTF8xMjAwKSkgeworCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzJdOworCQlkMSA9IGQxX2FbMl07CisJfSBlbHNlIGlmICh6MUwgPiBUQVNIQV9aREVUX1ZBTF8xMjAwKSB7CisJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bM107CisJCWQxID0gZDFfYVszXTsKKwl9CisJdGFzaGFfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCAmejFMLCBOVUxMLCBkMSk7CisKK2xlZnRfY2hfaW1wZWRhbmNlOgorCWlmICgoejFMID09IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSB8fAorCQkoejFMID4gVEFTSEFfWkRFVF9WQUxfMTAwSykpIHsKKwkJKnpsID0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0U7CisJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMV07CisJCWQxID0gZDFfYVsxXTsKKwl9IGVsc2UgeworCQkqemwgPSB6MUwvMTAwMDsKKwkJdGFzaGFfd2NkX21iaGNfcWZ1c2VfY2FsKGNvZGVjLCB6bCwgMCk7CisJfQorCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbXBlZGFuY2Ugb24gSFBIX0wgPSAlZChvaG1zKVxuIiwKKwkJCQlfX2Z1bmNfXywgKnpsKTsKKworCS8qIHN0YXJ0IG9mIHJpZ2h0IGltcGVkYW5jZSByYW1wIGFuZCBjYWxjdWxhdGlvbiAqLworCXRhc2hhX21iaGNfemRldF9yYW1wKGNvZGVjLCB6ZGV0X3BhcmFtX3B0ciwgTlVMTCwgJnoxUiwgZDEpOworCWlmIChUQVNIQV9NQkhDX0lTX1NFQ09ORF9SQU1QX1JFUVVJUkVEKHoxUikpIHsKKwkJaWYgKCgoejFSID4gVEFTSEFfWkRFVF9WQUxfMTIwMCkgJiYKKwkJCSh6ZGV0X3BhcmFtX3B0ci0+bm9mZiA9PSAweDYpKSB8fAorCQkJKCgqemwpICE9IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSkKKwkJCWdvdG8gcmlnaHRfY2hfaW1wZWRhbmNlOworCQkvKiBzZWNvbmQgcmFtcCBmb3IgcmlnaHQgY2ggKi8KKwkJaWYgKHoxUiA8IFRBU0hBX1pERVRfVkFMXzMyKSB7CisJCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzBdOworCQkJZDEgPSBkMV9hWzBdOworCQl9IGVsc2UgaWYgKCh6MVIgPiBUQVNIQV9aREVUX1ZBTF80MDApICYmCisJCQkoejFSIDw9IFRBU0hBX1pERVRfVkFMXzEyMDApKSB7CisJCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzJdOworCQkJZDEgPSBkMV9hWzJdOworCQl9IGVsc2UgaWYgKHoxUiA+IFRBU0hBX1pERVRfVkFMXzEyMDApIHsKKwkJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bM107CisJCQlkMSA9IGQxX2FbM107CisJCX0KKwkJdGFzaGFfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCBOVUxMLCAmejFSLCBkMSk7CisJfQorcmlnaHRfY2hfaW1wZWRhbmNlOgorCWlmICgoejFSID09IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSB8fAorCQkoejFSID4gVEFTSEFfWkRFVF9WQUxfMTAwSykpIHsKKwkJKnpyID0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0U7CisJfSBlbHNlIHsKKwkJKnpyID0gejFSLzEwMDA7CisJCXRhc2hhX3djZF9tYmhjX3FmdXNlX2NhbChjb2RlYywgenIsIDEpOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW1wZWRhbmNlIG9uIEhQSF9SID0gJWQob2htcylcbiIsCisJCQkJX19mdW5jX18sICp6cik7CisKKwkvKiBtb25vL3N0ZXJlbyBkZXRlY3Rpb24gKi8KKwlpZiAoKCp6bCA9PSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgJiYKKwkJKCp6ciA9PSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBwbHVnIHR5cGUgaXMgaW52YWxpZCBvciBleHRlbnNpb24gY2FibGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gemRldF9jb21wbGV0ZTsKKwl9CisJaWYgKCgqemwgPT0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpIHx8CisJICAgICgqenIgPT0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpIHx8CisJICAgICgoKnpsIDwgV0NEX01PTk9fSFNfTUlOX1RIUikgJiYgKCp6ciA+IFdDRF9NT05PX0hTX01JTl9USFIpKSB8fAorCSAgICAoKCp6bCA+IFdDRF9NT05PX0hTX01JTl9USFIpICYmICgqenIgPCBXQ0RfTU9OT19IU19NSU5fVEhSKSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBNb25vIHBsdWcgdHlwZSB3aXRoIG9uZSBjaCBmbG9hdGluZyBvciBzaG9ydGVkIHRvIEdORFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKKwkJZ290byB6ZGV0X2NvbXBsZXRlOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0FURVNULCAweDAyLCAweDAyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDQwLCAweDAxKTsKKwlpZiAoKnpsIDwgKFRBU0hBX1pERVRfVkFMXzMyLzEwMDApKQorCQl0YXNoYV9tYmhjX3pkZXRfcmFtcChjb2RlYywgJnpkZXRfcGFyYW1bMF0sICZ6MUxzLCBOVUxMLCBkMSk7CisJZWxzZQorCQl0YXNoYV9tYmhjX3pkZXRfcmFtcChjb2RlYywgJnpkZXRfcGFyYW1bMV0sICZ6MUxzLCBOVUxMLCBkMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHg0MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUl9BVEVTVCwgMHgwMiwgMHgwMCk7CisJejFMcyAvPSAxMDAwOworCXRhc2hhX3djZF9tYmhjX3FmdXNlX2NhbChjb2RlYywgJnoxTHMsIDApOworCS8qIHBhcmFsbGVsIG9mIGxlZnQgWiBhbmQgOSBvaG0gcHVsbCBkb3duIHJlc2lzdG9yICovCisJek1vbm8gPSAoKCp6bCkgKiA5KSAvICgoKnpsKSArIDkpOworCXpfZGlmZjEgPSAoejFMcyA+IHpNb25vKSA/ICh6MUxzIC0gek1vbm8pIDogKHpNb25vIC0gejFMcyk7CisJel9kaWZmMiA9ICgoKnpsKSA+IHoxTHMpID8gKCgqemwpIC0gejFMcykgOiAoejFMcyAtICgqemwpKTsKKwlpZiAoKHpfZGlmZjEgKiAoKnpsICsgejFMcykpID4gKHpfZGlmZjIgKiAoejFMcyArIHpNb25vKSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHN0ZXJlbyBwbHVnIHR5cGUgZGV0ZWN0ZWRcbiIsCisJCQkJX19mdW5jX18pOworCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9TVEVSRU87CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1PTk8gcGx1ZyB0eXBlIGRldGVjdGVkXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKKwl9CisKK3pkZXRfY29tcGxldGU6CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE41LCByZWcwKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjYsIHJlZzEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONywgcmVnMik7CisJLyogVHVybiBvbiAxMDBrIHB1bGwgZG93biBvbiBIUEhMICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgwMSwgMHgwMSk7CisKKwkvKiBGb3IgTk8tamFjaywgcmUtZW5hYmxlIExfREVUX0VOIGFmdGVyIFotZGV0IG1lYXN1cmVtZW50cyAqLworCWlmIChtYmhjLT5ocGhsX3N3aCkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4ODAsIDB4ODApOworCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfQU5BX0NUTCwgcmVnNCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8xLCByZWczKTsKKwlpZiAoaXNfZnNtX2Rpc2FibGUpCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgMHg4MCk7CisJaWYgKHRhc2hhLT56ZGV0X2dwaW9fY2IgJiYgaXNfY2hhbmdlKQorCQl0YXNoYS0+emRldF9ncGlvX2NiKGNvZGVjLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX21iaGNfZ25kX2RldF9jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsCisJCQkJICAgIDB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsCisJCQkJICAgIDB4NDAsIDB4NDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfTUVDSCwKKwkJCQkgICAgMHg0MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfTUVDSCwKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0YXNoYV9tYmhjX2hwaF9wdWxsX2Rvd25fY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsCisJCQkJICAgIDB4NDAsIDB4NDApOworCQlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsCisJCQkJCSAgICAweDEwLCAweDEwKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLAorCQkJCSAgICAweDQwLCAweDAwKTsKKwkJaWYgKFRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0YXNoYV9tYmhjX21vaXN0dXJlX2NvbmZpZyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlpZiAoVEFTSEFfTUJIQ19NT0lTVFVSRV9WUkVGID09IFZfT0ZGKQorCQlyZXR1cm47CisKKwkvKiBEb25vdCBlbmFibGUgbW9pc3R1cmUgZGV0ZWN0aW9uIGlmIGphY2sgdHlwZSBpcyBOQyAqLworCWlmICghbWJoYy0+aHBobF9zd2gpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGRpc2FibGUgbW9pc3R1cmUgZGV0ZWN0aW9uIGZvciBOQ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19DVExfMiwKKwkJCSAgICAweDBDLCBUQVNIQV9NQkhDX01PSVNUVVJFX1ZSRUYgPDwgMik7CisJdGFzaGFfbWJoY19ocGhfbF9wdWxsX3VwX2NvbnRyb2woY29kZWMsIFRBU0hBX01CSENfTU9JU1RVUkVfSVJFRik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgbWJoY19jYiA9IHsKKwkucmVxdWVzdF9pcnEgPSB0YXNoYV9tYmhjX3JlcXVlc3RfaXJxLAorCS5pcnFfY29udHJvbCA9IHRhc2hhX21iaGNfaXJxX2NvbnRyb2wsCisJLmZyZWVfaXJxID0gdGFzaGFfbWJoY19mcmVlX2lycSwKKwkuY2xrX3NldHVwID0gdGFzaGFfbWJoY19jbGtfc2V0dXAsCisJLm1hcF9idG5fY29kZV90b19udW0gPSB0YXNoYV9tYmhjX2J0bl90b19udW0sCisJLmVuYWJsZV9tYl9zb3VyY2UgPSB0YXNoYV9lbmFibGVfZXh0X21iX3NvdXJjZSwKKwkubWJoY19iaWFzID0gdGFzaGFfbWJoY19tYmhjX2JpYXNfY29udHJvbCwKKwkuc2V0X2J0bl90aHIgPSB0YXNoYV9tYmhjX3Byb2dyYW1fYnRuX3RociwKKwkubG9ja19zbGVlcCA9IHRhc2hhX21iaGNfbG9ja19zbGVlcCwKKwkucmVnaXN0ZXJfbm90aWZpZXIgPSB0YXNoYV9tYmhjX3JlZ2lzdGVyX25vdGlmaWVyLAorCS5taWNiaWFzX2VuYWJsZV9zdGF0dXMgPSB0YXNoYV9tYmhjX21pY2JfZW5fc3RhdHVzLAorCS5ocGhfcGFfb25fc3RhdHVzID0gdGFzaGFfbWJoY19ocGhfcGFfb25fc3RhdHVzLAorCS5ocGhfcHVsbF91cF9jb250cm9sID0gdGFzaGFfbWJoY19ocGhfbF9wdWxsX3VwX2NvbnRyb2wsCisJLm1iaGNfbWljYmlhc19jb250cm9sID0gdGFzaGFfbWJoY19yZXF1ZXN0X21pY2JpYXMsCisJLm1iaGNfbWljYl9yYW1wX2NvbnRyb2wgPSB0YXNoYV9tYmhjX21pY2JfcmFtcF9jb250cm9sLAorCS5nZXRfaHdkZXBfZndfY2FsID0gdGFzaGFfZ2V0X2h3ZGVwX2Z3X2NhbCwKKwkubWJoY19taWNiX2N0cmxfdGhyX21pYyA9IHRhc2hhX21iaGNfbWljYl9jdHJsX3RocmVzaG9sZF9taWMsCisJLmNvbXB1dGVfaW1wZWRhbmNlID0gdGFzaGFfd2NkX21iaGNfY2FsY19pbXBlZGFuY2UsCisJLm1iaGNfZ25kX2RldF9jdHJsID0gdGFzaGFfbWJoY19nbmRfZGV0X2N0cmwsCisJLmhwaF9wdWxsX2Rvd25fY3RybCA9IHRhc2hhX21iaGNfaHBoX3B1bGxfZG93bl9jdHJsLAorCS5tYmhjX21vaXN0dXJlX2NvbmZpZyA9IHRhc2hhX21iaGNfbW9pc3R1cmVfY29uZmlnLAorfTsKKworc3RhdGljIGludCB0YXNoYV9nZXRfYW5jX3Nsb3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhc2hhLT5hbmNfc2xvdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9wdXRfYW5jX3Nsb3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0YXNoYS0+YW5jX3Nsb3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9nZXRfYW5jX2Z1bmMoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh0YXNoYS0+YW5jX2Z1bmMgPT0gdHJ1ZSA/IDEgOiAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9wdXRfYW5jX2Z1bmMoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwltdXRleF9sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOworCXRhc2hhLT5hbmNfZnVuYyA9ICghdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyBmYWxzZSA6IHRydWUpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGFuY19mdW5jICV4IiwgX19mdW5jX18sIHRhc2hhLT5hbmNfZnVuYyk7CisKKwlpZiAodGFzaGEtPmFuY19mdW5jID09IHRydWUpIHsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMiBQQSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgSFBITCBQQSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBTUEsxIFBBIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORU9VVDIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FT1VUMiBQQSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQxIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORU9VVDEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUEhSIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBITCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQSFIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUEhMIFBBIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRUFSIFBBIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRUFSIik7CisJfSBlbHNlIHsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDIiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBIUiIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhMIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCBQQSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgRUFSIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMSU5FT1VUMiBQQSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTElORU9VVDEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQxIFBBIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUEhSIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUEhMIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUEhSIFBBIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUEhMIFBBIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVBUiIpOworCX0KKwltdXRleF91bmxvY2soJnRhc2hhLT5jb2RlY19tdXRleCk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfZ2V0X2Nsa21vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGFzaGEtPmNsa19tb2RlOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbGtfbW9kZTogJWRcbiIsIF9fZnVuY19fLCB0YXNoYS0+Y2xrX21vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfcHV0X2Nsa21vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0YXNoYS0+Y2xrX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbGtfbW9kZTogJWRcbiIsIF9fZnVuY19fLCB0YXNoYS0+Y2xrX21vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisJLyogSUlSIGZpbHRlciBiYW5kIHJlZ2lzdGVycyBhcmUgYXQgaW50ZWdlciBtdWx0aXBsZXMgb2YgMTYgKi8KKwl1MTYgaWlyX3JlZyA9IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgaWlyX3JlZykgJgorCQkJCQkgICAgKDEgPDwgYmFuZF9pZHgpKSAhPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfaHBoX2ltcGVkYW5jZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWludDMyX3QgemwsIHpyOworCWJvb2wgaHBocjsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1jOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwltYyA9IChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWhwaHIgPSBtYy0+c2hpZnQ7CisJd2NkX21iaGNfZ2V0X2ltcGVkYW5jZSgmcHJpdi0+bWJoYywgJnpsLCAmenIpOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB6bD0ldShvaG1zKSwgenI9JXUob2htcylcbiIsIF9fZnVuY19fLCB6bCwgenIpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHBociA/IHpyIDogemw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSFBITCBJbXBlZGFuY2UiLCAwLCAwLCBVSU5UX01BWCwgMCwKKwkJICAgICAgIHRhc2hhX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKKwlTT0NfU0lOR0xFX0VYVCgiSFBIUiBJbXBlZGFuY2UiLCAwLCAxLCBVSU5UX01BWCwgMCwKKwkJICAgICAgIHRhc2hhX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKK307CisKK3N0YXRpYyBpbnQgdGFzaGFfZ2V0X2hwaF90eXBlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZF9tYmhjICptYmhjOworCisJaWYgKCFwcml2KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3Y2Q5MzM1IHByaXZhdGUgZGF0YSBpcyBOVUxMXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWJoYyA9ICZwcml2LT5tYmhjOworCWlmICghbWJoYykgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodTMyKSBtYmhjLT5ocGhfdHlwZTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaHBoX3R5cGUgPSAldVxuIiwgX19mdW5jX18sIG1iaGMtPmhwaF90eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkhQSCBUeXBlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCisJCSAgICAgICB0YXNoYV9nZXRfaHBoX3R5cGUsIE5VTEwpLAorfTsKKworc3RhdGljIGludCB0YXNoYV92aV9mZWVkX21peGVyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzaGFfcC0+dmlfZmVlZF92YWx1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3ZpX2ZlZWRfbWl4ZXJfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0KKwkJCQkJZGFwbV9rY29udHJvbF9nZXRfd2xpc3Qoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gdGFzaGFfcC0+d2NkOXh4eDsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KKwkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7CisJdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7CisJdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVuYWJsZTogJWQsIHBvcnRfaWQ6JWQsIGRhaV9pZDogJWRcbiIsCisJCV9fZnVuY19fLCBlbmFibGUsIHBvcnRfaWQsIGRhaV9pZCk7CisKKwl0YXNoYV9wLT52aV9mZWVkX3ZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwltdXRleF9sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAocG9ydF9pZCA9PSBUQVNIQV9UWDE0ICYmICF0ZXN0X2JpdChWSV9TRU5TRV8xLAorCQkJCQkJJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgeworCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW1RBU0hBX1RYMTRdLmxpc3QsCisJCQkJCSZ0YXNoYV9wLT5kYWlbZGFpX2lkXS53Y2Q5eHh4X2NoX2xpc3QpOworCQkJc2V0X2JpdChWSV9TRU5TRV8xLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spOworCQl9CisJCWlmIChwb3J0X2lkID09IFRBU0hBX1RYMTUgJiYgIXRlc3RfYml0KFZJX1NFTlNFXzIsCisJCQkJCQkmdGFzaGFfcC0+c3RhdHVzX21hc2spKSB7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbVEFTSEFfVFgxNV0ubGlzdCwKKwkJCQkJJnRhc2hhX3AtPmRhaVtkYWlfaWRdLndjZDl4eHhfY2hfbGlzdCk7CisJCQlzZXRfYml0KFZJX1NFTlNFXzIsICZ0YXNoYV9wLT5zdGF0dXNfbWFzayk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocG9ydF9pZCA9PSBUQVNIQV9UWDE0ICYmIHRlc3RfYml0KFZJX1NFTlNFXzEsCisJCQkJCSZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNvcmUtPnR4X2Noc1tUQVNIQV9UWDE0XS5saXN0KTsKKwkJCWNsZWFyX2JpdChWSV9TRU5TRV8xLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spOworCQl9CisJCWlmIChwb3J0X2lkID09IFRBU0hBX1RYMTUgJiYgdGVzdF9iaXQoVklfU0VOU0VfMiwKKwkJCQkJJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+dHhfY2hzW1RBU0hBX1RYMTVdLmxpc3QpOworCQkJY2xlYXJfYml0KFZJX1NFTlNFXzIsICZ0YXNoYV9wLT5zdGF0dXNfbWFzayk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7CisJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCBlbmFibGUsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHZpcnR1YWwgcG9ydCBlbnRyaWVzICovCitzdGF0aWMgaW50IHNsaW1fdHhfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzaGFfcC0+dHhfcG9ydF92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KKwkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7CisJdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7CisJdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXUzMiB2dGFibGU7CisKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3bmFtZSAlcyBjbmFtZSAlcyB2YWx1ZSAldSBzaGlmdCAlZCBpdGVtICVsZFxuIiwKKwkJICBfX2Z1bmNfXywKKwkJd2lkZ2V0LT5uYW1lLCB1Y29udHJvbC0+aWQubmFtZSwgdGFzaGFfcC0+dHhfcG9ydF92YWx1ZSwKKwkJd2lkZ2V0LT5zaGlmdCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXV0ZXhfbG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOworCisJaWYgKHRhc2hhX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJaWYgKGRhaV9pZCAhPSBBSUYxX0NBUCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGludmFsaWQgQUlGIGZvciBJMkMgbW9kZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQltdXRleF91bmxvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXZ0YWJsZSA9IHZwb3J0X3NsaW1fY2hlY2tfdGFibGVbZGFpX2lkXTsKKwl9IGVsc2UgeworCQlpZiAoZGFpX2lkID49IEFSUkFZX1NJWkUodnBvcnRfaTJzX2NoZWNrX3RhYmxlKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGRhaV9pZDogJWQsIG91dCBvZiBib3VuZHNcbiIsCisJCQkJX19mdW5jX18sIGRhaV9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl2dGFibGUgPSB2cG9ydF9pMnNfY2hlY2tfdGFibGVbZGFpX2lkXTsKKwl9CisJc3dpdGNoIChkYWlfaWQpIHsKKwljYXNlIEFJRjFfQ0FQOgorCWNhc2UgQUlGMl9DQVA6CisJY2FzZSBBSUYzX0NBUDoKKwkJLyogb25seSBhZGQgdG8gdGhlIGxpc3QgaWYgdmFsdWUgbm90IHNldCAqLworCQlpZiAoZW5hYmxlICYmICEodGFzaGFfcC0+dHhfcG9ydF92YWx1ZSAmIDEgPDwgcG9ydF9pZCkpIHsKKworCQkJaWYgKHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbih2dGFibGUsIHBvcnRfaWQsCisJCQkJCXRhc2hhX3AtPmRhaSwgTlVNX0NPREVDX0RBSVMpKSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgaXMgdXNlZCBieSBvdGhlciB2aXJ0dWFsIHBvcnRcbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCQltdXRleF91bmxvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXRhc2hhX3AtPnR4X3BvcnRfdmFsdWUgfD0gMSA8PCBwb3J0X2lkOworCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QsCisJCQkgICAgICAmdGFzaGFfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0CisJCQkJCSAgICAgICk7CisJCX0gZWxzZSBpZiAoIWVuYWJsZSAmJiAodGFzaGFfcC0+dHhfcG9ydF92YWx1ZSAmCisJCQkJCTEgPDwgcG9ydF9pZCkpIHsKKwkJCXRhc2hhX3AtPnR4X3BvcnRfdmFsdWUgJj0gfigxIDw8IHBvcnRfaWQpOworCQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGVuYWJsZSkKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBwb3J0IGlzIHVzZWQgYnlcbiIKKwkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQllbHNlCisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgcG9ydCBpcyBub3QgdXNlZCBieVxuIgorCQkJCQkidGhpcyB2aXJ0dWFsIHBvcnRcbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCS8qIGF2b2lkIHVwZGF0ZSBwb3dlciBmdW5jdGlvbiAqLworCQkJbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFJRjRfTUFEX1RYOgorCWNhc2UgQUlGNV9DUEVfVFg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiVW5rbm93biBBSUYgJWRcbiIsIGRhaV9pZCk7CisJCW11dGV4X3VubG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBuYW1lICVzIHNuYW1lICVzIHVwZGF0ZWQgdmFsdWUgJXUgc2hpZnQgJWRcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHdpZGdldC0+c25hbWUsIHRhc2hhX3AtPnR4X3BvcnRfdmFsdWUsCisJCXdpZGdldC0+c2hpZnQpOworCisJbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7CisJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCBlbmFibGUsIHVwZGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X211eF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJdGFzaGFfcC0+cnhfcG9ydF92YWx1ZVt3aWRnZXQtPnNoaWZ0XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fcnhfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBSUYxX1BCIiwgIkFJRjJfUEIiLCAiQUlGM19QQiIsICJBSUY0X1BCIiwgIkFJRl9NSVgxX1BCIgorfTsKKworc3RhdGljIGludCBzbGltX3J4X211eF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcnhfcG9ydF92YWx1ZTsKKwl1MzIgcG9ydF9pZCA9IHdpZGdldC0+c2hpZnQ7CisKKwl0YXNoYV9wLT5yeF9wb3J0X3ZhbHVlW3BvcnRfaWRdID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlyeF9wb3J0X3ZhbHVlID0gdGFzaGFfcC0+cnhfcG9ydF92YWx1ZVtwb3J0X2lkXTsKKworCXByX2RlYnVnKCIlczogd25hbWUgJXMgY25hbWUgJXMgdmFsdWUgJXUgc2hpZnQgJWQgaXRlbSAlbGRcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHVjb250cm9sLT5pZC5uYW1lLCByeF9wb3J0X3ZhbHVlLAorCQl3aWRnZXQtPnNoaWZ0LCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwltdXRleF9sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7CisKKwlpZiAodGFzaGFfcC0+aW50Zl90eXBlICE9IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQlpZiAocnhfcG9ydF92YWx1ZSA+IDIpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIEFJRiBmb3IgSTJDIG1vZGVcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJLyogdmFsdWUgbmVlZCB0byBtYXRjaCB0aGUgVmlydHVhbCBwb3J0IGFuZCBBSUYgbnVtYmVyICovCisJc3dpdGNoIChyeF9wb3J0X3ZhbHVlKSB7CisJY2FzZSAwOgorCQlsaXN0X2RlbF9pbml0KCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbihwb3J0X2lkICsKKwkJCVRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhc2hhX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhc2hhX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiwKKwkJCSZ0YXNoYV9wLT5kYWlbQUlGMl9QQl0ud2NkOXh4eF9jaF9saXN0KSkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYJXUgaXMgdXNlZCBieSBjdXJyZW50IHJlcXVlc3RpbmcgQUlGX1BCIGl0c2VsZlxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQlnb3RvIHJ0bjsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCwKKwkJCSAgICAgICZ0YXNoYV9wLT5kYWlbQUlGMl9QQl0ud2NkOXh4eF9jaF9saXN0KTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZiAod2NkOXh4eF9yeF92cG9ydF92YWxpZGF0aW9uKHBvcnRfaWQgKworCQkJVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIsCisJCQkmdGFzaGFfcC0+ZGFpW0FJRjNfUEJdLndjZDl4eHhfY2hfbGlzdCkpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWCV1IGlzIHVzZWQgYnkgY3VycmVudCByZXF1ZXN0aW5nIEFJRl9QQiBpdHNlbGZcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJZ290byBydG47CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QsCisJCQkgICAgICAmdGFzaGFfcC0+ZGFpW0FJRjNfUEJdLndjZDl4eHhfY2hfbGlzdCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbihwb3J0X2lkICsKKwkJCVRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhc2hhX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhc2hhX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDU6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiwKKwkJCSZ0YXNoYV9wLT5kYWlbQUlGX01JWDFfUEJdLndjZDl4eHhfY2hfbGlzdCkpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWCV1IGlzIHVzZWQgYnkgY3VycmVudCByZXF1ZXN0aW5nIEFJRl9QQiBpdHNlbGZcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJZ290byBydG47CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QsCisJCQkgICAgICAmdGFzaGFfcC0+ZGFpW0FJRl9NSVgxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIlVua25vd24gQUlGICVkXG4iLCByeF9wb3J0X3ZhbHVlKTsKKwkJZ290byBlcnI7CisJfQorcnRuOgorCW11dGV4X3VubG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsCisJCQkJCXJ4X3BvcnRfdmFsdWUsIGUsIHVwZGF0ZSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwltdXRleF91bmxvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbGltX3J4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoc2xpbV9yeF9tdXhfdGV4dCksIHNsaW1fcnhfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbV9yeF9tdXhbVEFTSEFfUlhfTUFYXSA9IHsKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDAgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYMSBNdXgiLCBzbGltX3J4X211eF9lbnVtLAorCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCisJU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlgyIE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCisJCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDMgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYNCBNdXgiLCBzbGltX3J4X211eF9lbnVtLAorCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCisJU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlg1IE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCisJCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDYgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKKwkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYNyBNdXgiLCBzbGltX3J4X211eF9lbnVtLAorCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmNF92aV9taXhlcltdID0geworCVNPQ19TSU5HTEVfRVhUKCJTUEtSX1ZJXzEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTQsIDEsIDAsCisJCQl0YXNoYV92aV9mZWVkX21peGVyX2dldCwgdGFzaGFfdmlfZmVlZF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTUEtSX1ZJXzIiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTUsIDEsIDAsCisJCQl0YXNoYV92aV9mZWVkX21peGVyX2dldCwgdGFzaGFfdmlfZmVlZF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg2IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDYsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYOCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg5IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDksIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTEsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjJfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg2IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDYsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYOCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg5IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDksIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTEsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjNfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg2IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDYsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYOCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg5IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDksIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTEsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfbWFkX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMiIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkhQSEwgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkhQSFIgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxPMSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NF9zcGxpbmVfbWl4X3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE8yIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ1X3NwbGluZV9taXhfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMTzMgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxPNCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50N19zcGxpbmVfbWl4X3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU1BLUkwgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlNQS1JSIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ1X3ZiYXRfbWl4X3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE8zIFZCQVQgRW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfdmJhdF9taXhfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMTzQgVkJBVCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50N192YmF0X21peF9zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlNQS1JMIFZCQVQgRW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfdmJhdF9taXhfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJTUEtSUiBWQkFUIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjcGVfaW5fbWl4X3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTUFEX0JZUEFTUyIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKK307CisKKworCitzdGF0aWMgaW50IHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCWJvb2wgaWlyX2JhbmRfZW5fc3RhdHVzOworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXUxNiBpaXJfcmVnID0gV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ1RMICsgMTYgKiBpaXJfaWR4OworCisJLyogTWFzayBmaXJzdCA1IGJpdHMsIDYtOCBhcmUgcmVzZXJ2ZWQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpaXJfcmVnLCAoMSA8PCBiYW5kX2lkeCksCisJCQkgICAgKHZhbHVlIDw8IGJhbmRfaWR4KSk7CisKKwlpaXJfYmFuZF9lbl9zdGF0dXMgPSAoKHNuZF9zb2NfcmVhZChjb2RlYywgaWlyX3JlZykgJgorCQkJICAgICAgKDEgPDwgYmFuZF9pZHgpKSAhPSAwKTsKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJaWlyX2lkeCwgYmFuZF9pZHgsIGlpcl9iYW5kX2VuX3N0YXR1cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCisJCQkJaW50IGNvZWZmX2lkeCkKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IDA7CisKKwkvKiBBZGRyZXNzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIGlmIHJlYWRpbmcgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKKworCXZhbHVlIHw9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDEpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJICAgICAgIChXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCisJCQkJMTYgKiBpaXJfaWR4KSkgPDwgOCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDIpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJICAgICAgIChXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCisJCQkJMTYgKiBpaXJfaWR4KSkgPDwgMTYpOworCisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQorCQkqIHNpemVvZih1aW50MzJfdCkgKyAzKSAmIDB4N0YpOworCisJLyogTWFzayBiaXRzIHRvcCAyIGJpdHMgc2luY2UgdGhleSBhcmUgcmVzZXJ2ZWQgKi8KKwl2YWx1ZSB8PSAoKHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKworCQkJCSAxNiAqIGlpcl9pZHgpKSAmIDB4M0YpIDw8IDI0KTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCB0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPQorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAyKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgNCk7CisKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjAgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIyID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMiA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0sCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9paXJfYmFuZF9jb2VmZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJaW50IGlpcl9pZHgsIGludCBiYW5kX2lkeCwKKwkJCQl1aW50MzJfdCB2YWx1ZSkKK3sKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgJiAweEZGKSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgPj4gOCkgJiAweEZGKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKworCS8qIE1hc2sgdG9wIDIgYml0cywgNy04IGFyZSByZXNlcnZlZCAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCksCisJCSh2YWx1ZSA+PiAyNCkgJiAweDNGKTsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfZW5hYmxlX2ludF9wb3J0KHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWksCisJCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJaW50IHBvcnRfbnVtID0gMDsKKwl1bnNpZ25lZCBzaG9ydCByZWcgPSAwOworCXU4IHZhbCA9IDA7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3A7CisKKwlpZiAoIWRhaSB8fCAhY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNoLT5wb3J0ID49IFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSB7CisJCQlwb3J0X251bSA9IGNoLT5wb3J0IC0gVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVI7CisJCQlyZWcgPSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyAocG9ydF9udW0gLyA4KTsKKwkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHRhc2hhX3AtPndjZDl4eHgsCisJCQkJcmVnKTsKKwkJCWlmICghKHZhbCAmIEJZVEVfQklUX01BU0socG9ydF9udW0pKSkgeworCQkJCXZhbCB8PSBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKTsKKwkJCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUoCisJCQkJCXRhc2hhX3AtPndjZDl4eHgsIHJlZywgdmFsKTsKKwkJCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKKwkJCQkJdGFzaGFfcC0+d2NkOXh4eCwgcmVnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBvcnRfbnVtID0gY2gtPnBvcnQ7CisJCQlyZWcgPSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKyAocG9ydF9udW0gLyA4KTsKKwkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHRhc2hhX3AtPndjZDl4eHgsCisJCQkJcmVnKTsKKwkJCWlmICghKHZhbCAmIEJZVEVfQklUX01BU0socG9ydF9udW0pKSkgeworCQkJCXZhbCB8PSBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKTsKKwkJCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUodGFzaGFfcC0+d2NkOXh4eCwKKwkJCQkJcmVnLCB2YWwpOworCQkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAorCQkJCQl0YXNoYV9wLT53Y2Q5eHh4LCByZWcpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAorCQkJCQkgIGJvb2wgdXApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCisJaWYgKHVwKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQkJcmV0ID0gd2NkOXh4eF9nZXRfc2xhdmVfcG9ydChjaC0+Y2hfbnVtKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogSW52YWxpZCBzbGF2ZSBwb3J0IElEOiAlZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2JpdChyZXQsICZkYWktPmNoX21hc2spOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRhaS0+ZGFpX3dhaXQsIChkYWktPmNoX21hc2sgPT0gMCksCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKAorCQkJCQkJVEFTSEFfU0xJTV9DTE9TRV9USU1FT1VUKSk7CisJCWlmICghcmV0KSB7CisJCQlwcl9lcnIoIiVzOiBTbGltIGNsb3NlIHR4L3J4IHdhaXQgdGltZW91dCwgY2hfbWFzazoweCVseFxuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5jaF9tYXNrKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW1yeChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisKKwljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgY2FsbGVkISBjb2RlYyBuYW1lICVzIG51bV9kYWkgJWRcbiIKKwkJInN0cmVhbSBuYW1lICVzIGV2ZW50ICVkXG4iLAorCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lLAorCQljb2RlYy0+Y29tcG9uZW50Lm51bV9kYWksIHctPnNuYW1lLCBldmVudCk7CisKKwkvKiBFeGVjdXRlIHRoZSBjYWxsYmFjayBvbmx5IGlmIGludGVyZmFjZSB0eXBlIGlzIHNsaW1idXMgKi8KKwlpZiAodGFzaGFfcC0+aW50Zl90eXBlICE9IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykKKwkJcmV0dXJuIDA7CisKKwlkYWkgPSAmdGFzaGFfcC0+ZGFpW3ctPnNoaWZ0XTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdy0+bmFtZSAlcyB3LT5zaGlmdCAlZCBldmVudCAlZFxuIiwKKwkJIF9fZnVuY19fLCB3LT5uYW1lLCB3LT5zaGlmdCwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5ID0gZmFsc2U7CisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRfcG9ydChkYWksIGNvZGVjKTsKKwkJKHZvaWQpIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIHRydWUpOworCQlyZXQgPSB3Y2Q5eHh4X2NmZ19zbGltX3NjaF9yeChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCSAgICAgIGRhaS0+cmF0ZSwgZGFpLT5iaXRfd2lkdGgsCisJCQkJCSAgICAgICZkYWktPmdycGgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlpZiAoIXRlc3RfYml0KFNCX0NMS19HRUFSLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spKSB7CisJCQl0YXNoYV9jb2RlY192b3RlX21heF9idyhjb2RlYywgdHJ1ZSk7CisJCQlzZXRfYml0KFNCX0NMS19HRUFSLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSB3Y2Q5eHh4X2Rpc2Nvbm5lY3RfcG9ydChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCSAgICAgIGRhaS0+Z3JwaCk7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBEaXNjb25uZWN0IFJYIHBvcnQsIHJldCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkJaWYgKCFkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5KQorCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgZmFsc2UpOworCQllbHNlCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBidXMgaW4gcmVjb3Zlcnkgc2tpcCBlbmFibGUgc2xpbV9jaG1hc2siLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF9yeChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQlkYWktPmdycGgpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBOVUxMOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpID0gTlVMTDsKKworCWlmICghdykgeworCQlwcl9lcnIoIiVzIGludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwl0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY29yZSA9IHRhc2hhX3AtPndjZDl4eHg7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbnVtX2RhaSAlZCBzdHJlYW0gbmFtZSAlc1xuIiwKKwkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubnVtX2RhaSwgdy0+c25hbWUpOworCisJLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCisJaWYgKHRhc2hhX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgSW50ZXJmYWNlIGlzIG5vdCBjb3JyZWN0IiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcygpOiB3LT5uYW1lICVzIGV2ZW50ICVkIHctPnNoaWZ0ICVkXG4iLAorCQlfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQsIHctPnNoaWZ0KTsKKwlpZiAody0+c2hpZnQgIT0gQUlGNF9WSUZFRUQpIHsKKwkJcHJfZXJyKCIlcyBFcnJvciBpbiBlbmFibGluZyB0aGUgdHggcGF0aFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF92aTsKKwl9CisJZGFpID0gJnRhc2hhX3AtPmRhaVt3LT5zaGlmdF07CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNwa3IxIGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKKwkJCS8qIEVuYWJsZSBWJkkgc2Vuc2luZyAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLCAweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwKKwkJCQkweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwgMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAorCQkJCTB4MTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgwMCk7CisJCX0KKwkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzIsICZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKKwkJCXByX2RlYnVnKCIlczogc3BrcjIgZW5hYmxlZFxuIiwgX19mdW5jX18pOworCQkJLyogRW5hYmxlIFYmSSBzZW5zaW5nICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCisJCQkJMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLAorCQkJCTB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKKwkJCQkweDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCisJCQkJMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDAwKTsKKwkJfQorCQlkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5ID0gZmFsc2U7CisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRfcG9ydChkYWksIGNvZGVjKTsKKwkJKHZvaWQpIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIHRydWUpOworCQlyZXQgPSB3Y2Q5eHh4X2NmZ19zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCSAgICAgIGRhaS0+cmF0ZSwgZGFpLT5iaXRfd2lkdGgsCisJCQkJCSAgICAgICZkYWktPmdycGgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQlkYWktPmdycGgpOworCQlpZiAocmV0KQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgZXJyb3IgaW4gY2xvc2Vfc2xpbV9zY2hfdHggJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWlmICghZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSkKKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsCisJCQkJJmRhaS0+d2NkOXh4eF9jaF9saXN0LAorCQkJCWRhaS0+Z3JwaCk7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRGlzY29ubmVjdCBUWCBwb3J0LCByZXQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJfQorCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgeworCQkJLyogRGlzYWJsZSBWJkkgc2Vuc2luZyAqLworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNwa3IxIGRpc2FibGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAorCQkJCTB4MDApOworCQl9CisJCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8yLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spKSB7CisJCQkvKiBEaXNhYmxlIFYmSSBzZW5zaW5nICovCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjIgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKKwkJCQkweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCisJCQkJMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfQorb3V0X3ZpOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBfX3Rhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHg6IEVuYWJsZSB0aGUgc2xpbWJ1cyBzbGF2ZSBwb3J0CisgKgkJCQkgZm9yIFRYIHBhdGgKKyAqIEBjb2RlYzogSGFuZGxlIHRvIHRoZSBjb2RlYyBmb3Igd2hpY2ggdGhlIHNsYXZlIHBvcnQgaXMgdG8gYmUKKyAqCSAgIGVuYWJsZWQuCisgKiBAZGFpX2RhdGE6IFRoZSBkYWkgc3BlY2lmaWMgZGF0YSBmb3IgZGFpIHdoaWNoIGlzIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgX190YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJaW50IGV2ZW50LCBzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpKQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwkvKiBFeGVjdXRlIHRoZSBjYWxsYmFjayBvbmx5IGlmIGludGVyZmFjZSB0eXBlIGlzIHNsaW1idXMgKi8KKwlpZiAodGFzaGFfcC0+aW50Zl90eXBlICE9IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkgPSBmYWxzZTsKKwkJdGFzaGFfY29kZWNfZW5hYmxlX2ludF9wb3J0KGRhaSwgY29kZWMpOworCQkodm9pZCkgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgdHJ1ZSk7CisJCXJldCA9IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJICAgICAgZGFpLT5yYXRlLCBkYWktPmJpdF93aWR0aCwKKwkJCQkJICAgICAgJmRhaS0+Z3JwaCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJCWRhaS0+Z3JwaCk7CisJCWlmICghZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSkKKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsCisJCQkJCQkgICAgICAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQkgICAgICBkYWktPmdycGgpOworCQkJcHJfZGVidWcoIiVzOiBEaXNjb25uZWN0IFRYIHBvcnQsIHJldCA9ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgcmV0KTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogdy0+bmFtZSAlcywgdy0+c2hpZnQgPSAlZCwgbnVtX2RhaSAlZCBzdHJlYW0gbmFtZSAlc1xuIiwKKwkJX19mdW5jX18sIHctPm5hbWUsIHctPnNoaWZ0LAorCQljb2RlYy0+Y29tcG9uZW50Lm51bV9kYWksIHctPnNuYW1lKTsKKworCWRhaSA9ICZ0YXNoYV9wLT5kYWlbdy0+c2hpZnRdOworCXJldHVybiBfX3Rhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHgoY29kZWMsIGV2ZW50LCBkYWkpOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19jcGVfcHBfc2V0X2NmZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisJdTggYml0X3dpZHRoLCByYXRlLCBidWZfcGVyaW9kOworCisJZGFpID0gJnRhc2hhX3AtPmRhaVtBSUY0X01BRF9UWF07CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzd2l0Y2ggKGRhaS0+Yml0X3dpZHRoKSB7CisJCWNhc2UgMzI6CisJCQliaXRfd2lkdGggPSAweEY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCWJpdF93aWR0aCA9IDB4RTsKKwkJCWJyZWFrOworCQljYXNlIDIwOgorCQkJYml0X3dpZHRoID0gMHhEOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCWRlZmF1bHQ6CisJCQliaXRfd2lkdGggPSAweDA7CisJCQlicmVhazsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19UWF9QUF9DRkcsIDB4MEYsCisJCQkJICAgIGJpdF93aWR0aCk7CisKKwkJc3dpdGNoIChkYWktPnJhdGUpIHsKKwkJY2FzZSAzODQwMDA6CisJCQlyYXRlID0gMHgzMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwMDoKKwkJCXJhdGUgPSAweDIwOworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDA6CisJCQlyYXRlID0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDE2MDAwOgorCQlkZWZhdWx0OgorCQkJcmF0ZSA9IDB4MDA7CisJCQlicmVhazsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19UWF9QUF9DRkcsIDB4NzAsCisJCQkJICAgIHJhdGUpOworCisJCWJ1Zl9wZXJpb2QgPSAoZGFpLT5yYXRlICogKGRhaS0+Yml0X3dpZHRoLzgpKSAvICgxNioxMDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQlVGX0lOVF9QRVJJT0QsCisJCQkJICAgIDB4RkYsIGJ1Zl9wZXJpb2QpOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUFAgYnVmZmVyIHBlcmlvZD0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBidWZfcGVyaW9kKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQ0ZHLCAweDNDKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQlVGX0lOVF9QRVJJT0QsIDB4NjApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIHRhc2hhX2NvZGVjX2dldF9tYWRfcG9ydF9pZDogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQKKyAqCXRvIGdldCB0aGUgcG9ydCBJRCBmb3IgTUFELgorICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjCisgKiBAcG9ydF9pZDogY3BlIHBvcnRfaWQgbmVlZHMgdG8gZW5hYmxlCisgKi8KK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZ2V0X21hZF9wb3J0X2lkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdTE2ICpwb3J0X2lkKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWk7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCisJaWYgKCFwb3J0X2lkIHx8ICFjb2RlYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaWYgKCF0YXNoYV9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhaSA9ICZ0YXNoYV9wLT5kYWlbQUlGNF9NQURfVFhdOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQlpZiAoY2gtPnBvcnQgPT0gVEFTSEFfVFgxMikKKwkJCSpwb3J0X2lkID0gV0NEX0NQRV9BRkVfT1VUX1BPUlRfMjsKKwkJZWxzZSBpZiAoY2gtPnBvcnQgPT0gVEFTSEFfVFgxMykKKwkJCSpwb3J0X2lkID0gV0NEX0NQRV9BRkVfT1VUX1BPUlRfNDsKKwkJZWxzZSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBtYWRfcG9ydCA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgY2gtPnBvcnQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHBvcnRfaWQgPSAlZFxuIiwgX19mdW5jX18sICpwb3J0X2lkKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eF9tYWQ6IENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkCisgKgl0byBzZXR1cCB0aGUgc2xhdmUgcG9ydCBmb3IgTUFELgorICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjCisgKiBAZXZlbnQ6IEluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzbGF2ZSBwb3J0CisgKi8KK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eF9tYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgdTggZXZlbnQpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlpbnQgZGFwbV9ldmVudCA9IFNORF9TT0NfREFQTV9QT1NUX1BNVTsKKwl1MTYgcG9ydCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlkYWkgPSAmdGFzaGFfcC0+ZGFpW0FJRjRfTUFEX1RYXTsKKworCWlmIChldmVudCA9PSAwKQorCQlkYXBtX2V2ZW50ID0gU05EX1NPQ19EQVBNX1BPU1RfUE1EOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IG1hZF9jaGFubmVsLCBldmVudCA9IDB4JXhcbiIsCisJCSBfX2Z1bmNfXywgZXZlbnQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtYWRfcG9ydCA9ICVkLCBldmVudCA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY2gtPnBvcnQsIGV2ZW50KTsKKwkJaWYgKGNoLT5wb3J0ID09IFRBU0hBX1RYMTMpIHsKKwkJCXRhc2hhX2NvZGVjX2NwZV9wcF9zZXRfY2ZnKGNvZGVjLCBkYXBtX2V2ZW50KTsKKwkJCXBvcnQgPSBUQVNIQV9UWDEzOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXQgPSBfX3Rhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHgoY29kZWMsIGRhcG1fZXZlbnQsIGRhaSk7CisKKwlpZiAocG9ydCA9PSBUQVNIQV9UWDEzKSB7CisJCXN3aXRjaCAoZGFwbV9ldmVudCkgeworCQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMV9TSFVURE9XTiwKKwkJCQkweDIwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEzX0lOUF9DRkcsCisJCQkJMHgwMywgMHgwMik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19DRkcsCisJCQkJCSAgICAweDgwLCAweDgwKTsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMV9TSFVURE9XTiwKKwkJCQkweDIwLCAweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEzX0lOUF9DRkcsCisJCQkJMHgwMywgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19DRkcsCisJCQkJCSAgICAweDgwLCAweDAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwkvKgorCSAqIE1hc2sgdG9wIGJpdCBpdCBpcyByZXNlcnZlZAorCSAqIFVwZGF0ZXMgYWRkciBhdXRvbWF0aWNhbGx5IGZvciBlYWNoIEIyIHdyaXRlCisJICovCisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKGJhbmRfaWR4ICogQkFORF9NQVggKiBzaXplb2YodWludDMyX3QpKSAmIDB4N0YpOworCisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7CisKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjAgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIyID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMiA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMCksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMSksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMiksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMyksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgNCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2dldF9jb21wYW5kZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgY29tcCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCSAgICBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+Y29tcF9lbmFibGVkW2NvbXBdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3NldF9jb21wYW5kZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogQ29tcGFuZGVyICVkIGVuYWJsZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCisJCSBfX2Z1bmNfXywgY29tcCArIDEsIHRhc2hhLT5jb21wX2VuYWJsZWRbY29tcF0sIHZhbHVlKTsKKwl0YXNoYS0+Y29tcF9lbmFibGVkW2NvbXBdID0gdmFsdWU7CisKKwkvKiBBbnkgc3BlY2lmaWMgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgY29tcGFuZGVyICovCisJc3dpdGNoIChjb21wKSB7CisJY2FzZSBDT01QQU5ERVJfMToKKwkJLyogU2V0IEdhaW4gU291cmNlIFNlbGVjdCBiYXNlZCBvbiBjb21wYW5kZXIgZW5hYmxlL2Rpc2FibGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfTF9FTiwgMHgyMCwKKwkJCQkodmFsdWUgPyAweDAwOjB4MjApKTsKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfMjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUl9FTiwgMHgyMCwKKwkJCQkodmFsdWUgPyAweDAwOjB4MjApKTsKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfMzoKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfNDoKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfNToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TRV9MT19MTzNfR0FJTiwgMHgyMCwKKwkJCQkodmFsdWUgPyAweDAwOjB4MjApKTsKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfNjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TRV9MT19MTzRfR0FJTiwgMHgyMCwKKwkJCQkodmFsdWUgPyAweDAwOjB4MjApKTsKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfNzoKKwkJYnJlYWs7CisJY2FzZSBDT01QQU5ERVJfODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogaWYgY29tcGFuZGVyIGlzIG5vdCBlbmFibGVkIGZvciBhbnkgaW50ZXJwb2xhdG9yLAorCQkgKiBpdCBkb2VzIG5vdCBjYXVzZSBhbnkgYXVkaW8gZmFpbHVyZSwgc28gZG8gbm90CisJCSAqIHJldHVybiBlcnJvciBpbiB0aGlzIGNhc2UsIGJ1dCBqdXN0IHByaW50IGEgbG9nCisJCSAqLworCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29tcGFuZGVyOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBjb21wKTsKKwl9OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19pbml0X2ZseWJhY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sIDB4QzAsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1JfRU4sIDB4QzAsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYsIDB4MEYsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYsIDB4RjAsIDB4MDApOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9yeF9iaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXRhc2hhLT5yeF9iaWFzX2NvdW50Kys7CisJCWlmICh0YXNoYS0+cnhfYmlhc19jb3VudCA9PSAxKSB7CisJCQlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKKwkJCQl0YXNoYV9jb2RlY19pbml0X2ZseWJhY2soY29kZWMpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfUlhfU1VQUExJRVMsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdGFzaGEtPnJ4X2JpYXNfY291bnQtLTsKKwkJaWYgKCF0YXNoYS0+cnhfYmlhc19jb3VudCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX1JYX1NVUFBMSUVTLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCWJyZWFrOworCX07CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEN1cnJlbnQgUlggQklBUyB1c2VyIGNvdW50OiAlZFxuIiwgX19mdW5jX18sCisJCXRhc2hhLT5yeF9iaWFzX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9yZWFsaWduX2FuY19jb2VmZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIHUxNiByZWcxLCB1MTYgcmVnMikKK3sKKwl1OCB2YWwxLCB2YWwyLCB0bXB2YWwxLCB0bXB2YWwyOworCisJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMCk7CisJdG1wdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnMik7CisJdG1wdmFsMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnMik7CisJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgcmVnMiwgMHhGRik7CisJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgcmVnMiwgMHhGRik7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcxLCAweDAwKTsKKwl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKTsKKwl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKTsKKworCWlmICh2YWwxID09IDB4MEYgJiYgdmFsMiA9PSAweEZGKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBBTkMwIGNvLWVmZiBpbmRleCByZS1hbGlnbmVkXG4iLAorCQkJX19mdW5jX18pOworCQlzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcxLCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMiwgdG1wdmFsMik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzEsIDB4MDEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcyLCB0bXB2YWwxKTsKKwl9IGVsc2UgaWYgKHZhbDEgPT0gMHhGRiAmJiB2YWwyID09IDB4MEYpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEFOQzEgY28tZWZmIGluZGV4IGFscmVhZHkgYWxpZ25lZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzIsIHRtcHZhbDEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcxLCAweDAxKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMiwgdG1wdmFsMik7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEFOQzAgY28tZWZmIGluZGV4IG5vdCBhbGlnbmVkXG4iLAorCQkJX19mdW5jX18pOworCX0KK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbnVtX2FuY19zbG90czsKKwlzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyICphbmNfaGVhZDsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICpod2RlcF9jYWwgPSBOVUxMOworCXUzMiBhbmNfd3JpdGVzX3NpemUgPSAwOworCXUzMiBhbmNfY2FsX3NpemUgPSAwOworCWludCBhbmNfc2l6ZV9yZW1haW5pbmc7CisJdTMyICphbmNfcHRyOworCXUxNiByZWc7CisJdTggbWFzaywgdmFsOworCXNpemVfdCBjYWxfc2l6ZTsKKwljb25zdCB2b2lkICpkYXRhOworCisJaWYgKCF0YXNoYS0+YW5jX2Z1bmMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRhc2hhLT5md19kYXRhLCBXQ0Q5WFhYX0FOQ19DQUwpOworCQlpZiAoaHdkZXBfY2FsKSB7CisJCQlkYXRhID0gaHdkZXBfY2FsLT5kYXRhOworCQkJY2FsX3NpemUgPSBod2RlcF9jYWwtPnNpemU7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJZmlsZW5hbWUgPSAid2NkOTMzNS93Y2Q5MzM1X2FuYy5iaW4iOworCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBjb2RlYy0+ZGV2KTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGFjcXVpcmUgQU5DIGRhdGE6ICVkXG4iLCByZXQpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQkJaWYgKCFmdykgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBnZXQgYW5jIGZ3Iik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQlkYXRhID0gZnctPmRhdGE7CisJCQljYWxfc2l6ZSA9IGZ3LT5zaXplOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlIGNhbGlicmF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJaWYgKGNhbF9zaXplIDwgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJOb3QgZW5vdWdoIGRhdGFcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qIEZpcnN0IG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyIHdyaXRlcyAqLworCQlhbmNfaGVhZCA9IChzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyICopKGRhdGEpOworCQlhbmNfcHRyID0gKHUzMiAqKShkYXRhICsKKwkJCQkgIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKSk7CisJCWFuY19zaXplX3JlbWFpbmluZyA9IGNhbF9zaXplIC0KKwkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKTsKKwkJbnVtX2FuY19zbG90cyA9IGFuY19oZWFkLT5udW1fYW5jX3Nsb3RzOworCisJCWlmICh0YXNoYS0+YW5jX3Nsb3QgPj0gbnVtX2FuY19zbG90cykgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBBTkMgc2xvdCBzZWxlY3RlZFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG51bV9hbmNfc2xvdHM7IGkrKykgeworCQkJaWYgKGFuY19zaXplX3JlbWFpbmluZyA8IFRBU0hBX1BBQ0tFRF9SRUdfU0laRSkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIkludmFsaWQgcmVnaXN0ZXIgZm9ybWF0XG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYW5jX3dyaXRlc19zaXplID0gKHUzMikoKmFuY19wdHIpOworCQkJYW5jX3NpemVfcmVtYWluaW5nIC09IHNpemVvZih1MzIpOworCQkJYW5jX3B0ciArPSAxOworCisJCQlpZiAoYW5jX3dyaXRlc19zaXplICogVEFTSEFfUEFDS0VEX1JFR19TSVpFCisJCQkJPiBhbmNfc2l6ZV9yZW1haW5pbmcpIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJJbnZhbGlkIHJlZ2lzdGVyIGZvcm1hdFxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJaWYgKHRhc2hhLT5hbmNfc2xvdCA9PSBpKQorCQkJCWJyZWFrOworCisJCQlhbmNfc2l6ZV9yZW1haW5pbmcgLT0gKGFuY193cml0ZXNfc2l6ZSAqCisJCQkJVEFTSEFfUEFDS0VEX1JFR19TSVpFKTsKKwkJCWFuY19wdHIgKz0gYW5jX3dyaXRlc19zaXplOworCQl9CisJCWlmIChpID09IG51bV9hbmNfc2xvdHMpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlNlbGVjdGVkIEFOQyBzbG90IG5vdCBwcmVzZW50XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWkgPSAwOworCQlhbmNfY2FsX3NpemUgPSBhbmNfd3JpdGVzX3NpemU7CisKKwkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDAgREFDIikgfHwKKwkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBTUEsxIFBBIikpCisJCQl0YXNoYV9yZWFsaWduX2FuY19jb2VmZihjb2RlYywKKwkJCQkJV0NEOTMzNV9DRENfQU5DMF9JSVJfQ09FRkZfMV9DVEwsCisJCQkJCVdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzJfQ1RMKTsKKworCQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMSBEQUMiKSB8fAorCQkJIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMyBEQUMiKSkgeworCQkJdGFzaGFfcmVhbGlnbl9hbmNfY29lZmYoY29kZWMsCisJCQkJCVdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMLAorCQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCk7CisJCQlhbmNfd3JpdGVzX3NpemUgPSBhbmNfY2FsX3NpemUgLyAyOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCVdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgMHgzOSwgMHgzOSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMiBEQUMiKSB8fAorCQkJCSFzdHJjbXAody0+bmFtZSwgIlJYIElOVDQgREFDIikpIHsKKwkJCXRhc2hhX3JlYWxpZ25fYW5jX2NvZWZmKGNvZGVjLAorCQkJCQlXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9DT0VGRl8xX0NUTCwKKwkJCQkJV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMl9DVEwpOworCQkJaSA9IGFuY19jYWxfc2l6ZSAvIDI7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJV0NEOTMzNV9DRENfQU5DMV9DTEtfUkVTRVRfQ1RMLCAweDM5LCAweDM5KTsKKwkJfQorCisJCWZvciAoOyBpIDwgYW5jX3dyaXRlc19zaXplOyBpKyspIHsKKwkJCVRBU0hBX0NPREVDX1VOUEFDS19FTlRSWShhbmNfcHRyW2ldLCByZWcsIG1hc2ssIHZhbCk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsICh2YWwgJiBtYXNrKSk7CisJCX0KKwkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDEgREFDIikgfHwKKwkJCSFzdHJjbXAody0+bmFtZSwgIlJYIElOVDMgREFDIikpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMLCAweDA4LCAweDA4KTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQyIERBQyIpIHx8CisJCQkJIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNCBEQUMiKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsIDB4MDgsIDB4MDgpOworCQl9CisKKwkJaWYgKCFod2RlcF9jYWwpCisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qIFJlbW92ZSBBTkMgUnggZnJvbSByZXNldCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsCisJCQkJICAgIDB4MDgsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsCisJCQkJICAgIDB4MDgsIDB4MDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKCFzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikgfHwKKwkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBFQVIgUEEiKSB8fAorCQkgICAgIXN0cmNtcCh3LT5uYW1lLCAiQU5DIFNQSzEgUEEiKSB8fAorCQkgICAgIXN0cmNtcCh3LT5uYW1lLCAiQU5DIExJTkVPVVQxIFBBIikpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfQU5DMF9NT0RFXzFfQ1RMLCAweDMwLCAweDAwKTsKKwkJCW1zbGVlcCg1MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCwgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgMHgzOCwgMHgzOCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgMHgwNywgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgMHgzOCwgMHgwMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSB8fAorCQkJICAgIXN0cmNtcCh3LT5uYW1lLCAiQU5DIExJTkVPVVQyIFBBIikpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfQU5DMV9NT0RFXzFfQ1RMLCAweDMwLCAweDAwKTsKKwkJCW1zbGVlcCg1MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8xX0NUTCwgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgMHgzOCwgMHgzOCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgMHgwNywgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgMHgzOCwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJaWYgKCFod2RlcF9jYWwpCisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2NsZWFyX2FuY190eF9ob2xkKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFOQ19NSUNfQU1JQzEsICZ0YXNoYS0+c3RhdHVzX21hc2spKQorCQl0YXNoYV9jb2RlY19zZXRfdHhfaG9sZCh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfQU5BX0FNSUMxLCBmYWxzZSk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBTkNfTUlDX0FNSUMyLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkKKwkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQodGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDMiwgZmFsc2UpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDMywgJnRhc2hhLT5zdGF0dXNfbWFzaykpCisJCXRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9BTkFfQU1JQzMsIGZhbHNlKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFOQ19NSUNfQU1JQzQsICZ0YXNoYS0+c3RhdHVzX21hc2spKQorCQl0YXNoYV9jb2RlY19zZXRfdHhfaG9sZCh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfQU5BX0FNSUM0LCBmYWxzZSk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBTkNfTUlDX0FNSUM1LCAmdGFzaGEtPnN0YXR1c19tYXNrKSkKKwkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQodGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNSwgZmFsc2UpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDNiwgJnRhc2hhLT5zdGF0dXNfbWFzaykpCisJCXRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9BTkFfQU1JQzYsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX3Bvc3RfcGFfY29uZmlnKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKKwkJCQkJICAgaW50IG1vZGUsIGludCBldmVudCkKK3sKKwl1OCBzY2FsZV92YWwgPSAwOworCisJaWYgKCFUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIENMU19IX0hJRkk6CisJCQlzY2FsZV92YWwgPSAweDM7CisJCQlicmVhazsKKwkJY2FzZSBDTFNfSF9MT0hJRkk6CisJCQlzY2FsZV92YWwgPSAweDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAodGFzaGEtPmFuY19mdW5jKSB7CisJCQkvKiBDbGVhciBUeCBGRSBIT0xEIGlmIGJvdGggUEFzIGFyZSBlbmFibGVkICovCisJCQlpZiAoKHNuZF9zb2NfcmVhZCh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfQU5BX0hQSCkgJgorCQkJICAgICAweEMwKSA9PSAweEMwKSB7CisJCQkJdGFzaGFfY29kZWNfY2xlYXJfYW5jX3R4X2hvbGQodGFzaGEpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNjYWxlX3ZhbCA9IDB4NjsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNjYWxlX3ZhbCkKKwkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDEsIDB4MEUsCisJCQkJICAgIHNjYWxlX3ZhbCA8PCAxKTsKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgeworCQlpZiAodGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfMV0gfHwKKwkJICAgIHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzJdKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9IUEhfTF9FTiwKKwkJCQkJICAgIDB4MjAsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX1JfRU4sCisJCQkJCSAgICAweDIwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHModGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0hQSF9BVVRPX0NIT1AsCisJCQkJCSAgICAweDIwLCAweDIwKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9IUEhfTF9FTiwgMHgxRiwKKwkJCQkgICAgdGFzaGEtPmhwaF9sX2dhaW4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9IUEhfUl9FTiwgMHgxRiwKKwkJCQkgICAgdGFzaGEtPmhwaF9yX2dhaW4pOworCX0KKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9IUEhfQVVUT19DSE9QLCAweDIwLAorCQkJCSAgICAweDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX292ZXJyaWRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgaW50IG1vZGUsCisJCQkJIGludCBldmVudCkKK3sKKwlpZiAobW9kZSA9PSBDTFNfQUIpIHsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMKSAmIDB4MTApICYmCisJCQkJKCEoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCQlXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwpICYgMHgxMCkpKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsIDB4MDIsIDB4MDIpOworCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsIDB4MDIsIDB4MDApOworCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfaHBocl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBocGhfbW9kZSA9IHRhc2hhLT5ocGhfbW9kZTsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmICgoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpKSAmJgorCQkgICAgKHRlc3RfYml0KEhQSF9QQV9ERUxBWSwgJnRhc2hhLT5zdGF0dXNfbWFzaykpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgsIDB4QzAsIDB4QzApOworCQl9CisJCXNldF9iaXQoSFBIX1BBX0RFTEFZLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpIHsKKwkJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgpICYgMHhDMCkKKwkJCQkJCQkhPSAweEMwKQorCQkJCS8qCisJCQkJICogSWYgUEFfRU4gaXMgbm90IHNldCAocG90ZW50aWFsbHkgaW4gQU5DIGNhc2UpCisJCQkJICogdGhlbiBkbyBub3RoaW5nIGZvciBQT1NUX1BNVSBhbmQgbGV0IGxlZnQKKwkJCQkgKiBjaGFubmVsIGhhbmRsZSBldmVyeXRoaW5nLgorCQkJCSAqLworCQkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIDdtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJaWYgKHRlc3RfYml0KEhQSF9QQV9ERUxBWSwgJnRhc2hhLT5zdGF0dXNfbWFzaykpIHsKKwkJCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKwkJCWNsZWFyX2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spOworCQl9CisJCXRhc2hhX2NvZGVjX2hwaF9wb3N0X3BhX2NvbmZpZyh0YXNoYSwgaHBoX21vZGUsIGV2ZW50KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCkpICYKKwkJCQkgIDB4MTApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCwKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpIHsKKwkJCS8qIERvIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBsZWZ0IGNoYW5uZWwgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTCwKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCSAgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCkpICYKKwkJCQkJICAweDEwKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkJMHgxMCwgMHgwMCk7CisJCQkvKiBSZW1vdmUgQU5DIFJ4IGZyb20gcmVzZXQgKi8KKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJfQorCQl0YXNoYV9jb2RlY19vdmVycmlkZShjb2RlYywgaHBoX21vZGUsIGV2ZW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCVdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkYsCisJCQkJCSZ0YXNoYS0+bWJoYyk7CisJCXRhc2hhX2NvZGVjX2hwaF9wb3N0X3BhX2NvbmZpZyh0YXNoYSwgaHBoX21vZGUsIGV2ZW50KTsKKwkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBIUiBQQSIpKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCwgMHg0MCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZGlzYWJsZWQgYXMgcGVyCisJCSAqIEhXIHJlcXVpcmVtZW50CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCXRhc2hhX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBocGhfbW9kZSwgZXZlbnQpOworCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCVdDRF9FVkVOVF9QT1NUX0hQSFJfUEFfT0ZGLAorCQkJCQkmdGFzaGEtPm1iaGMpOworCisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpIHsKKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2hwaGxfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaHBoX21vZGUgPSB0YXNoYS0+aHBoX21vZGU7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpKSkgJiYKKwkJICAgICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfSFBILCAweEMwLCAweEMwKTsKKwkJfQorCQlzZXRfYml0KEhQSF9QQV9ERUxBWSwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKSB7CisJCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9BTkFfSFBIKSAmIDB4QzApCisJCQkJCQkJCSE9IDB4QzApCisJCQkJLyoKKwkJCQkgKiBJZiBQQV9FTiBpcyBub3Qgc2V0IChwb3RlbnRpYWxseSBpbiBBTkMgY2FzZSkKKwkJCQkgKiB0aGVuIGRvIG5vdGhpbmcgZm9yIFBPU1RfUE1VIGFuZCBsZXQgcmlnaHQKKwkJCQkgKiBjaGFubmVsIGhhbmRsZSBldmVyeXRoaW5nLgorCQkJCSAqLworCQkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIDdtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJaWYgKHRlc3RfYml0KEhQSF9QQV9ERUxBWSwgJnRhc2hhLT5zdGF0dXNfbWFzaykpIHsKKwkJCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKwkJCWNsZWFyX2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spOworCQl9CisKKwkJdGFzaGFfY29kZWNfaHBoX3Bvc3RfcGFfY29uZmlnKHRhc2hhLCBocGhfbW9kZSwgZXZlbnQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwsCisJCQkJICAgIDB4MTAsIDB4MDApOworCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMKSkgJgorCQkJCSAgMHgxMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisKKwkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpKSkgeworCQkJLyogRG8gZXZlcnl0aGluZyBuZWVkZWQgZm9yIHJpZ2h0IGNoYW5uZWwgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCwKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCSAgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCkpICYKKwkJCQkJICAweDEwKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkJMHgxMCwgMHgwMCk7CisKKwkJCS8qIFJlbW92ZSBBTkMgUnggZnJvbSByZXNldCAqLworCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCQl9CisJCXRhc2hhX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBocGhfbW9kZSwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCVdDRF9FVkVOVF9QUkVfSFBITF9QQV9PRkYsCisJCQkJCSZ0YXNoYS0+bWJoYyk7CisJCXRhc2hhX2NvZGVjX2hwaF9wb3N0X3BhX2NvbmZpZyh0YXNoYSwgaHBoX21vZGUsIGV2ZW50KTsKKwkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCwgMHg4MCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZGlzYWJsZWQgYXMgcGVyCisJCSAqIEhXIHJlcXVpcmVtZW50CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCXRhc2hhX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBocGhfbW9kZSwgZXZlbnQpOworCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCisJCQkJCVdDRF9FVkVOVF9QT1NUX0hQSExfUEFfT0ZGLAorCQkJCQkmdGFzaGEtPm1iaGMpOworCisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSEwgUEEiKSkpIHsKKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJdTE2IGxpbmVvdXRfdm9sX3JlZyA9IDAsIGxpbmVvdXRfbWl4X3ZvbF9yZWcgPSAwOworCWludCByZXQgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlpZiAody0+cmVnID09IFdDRDkzMzVfQU5BX0xPXzFfMikgeworCQlpZiAody0+c2hpZnQgPT0gNykgeworCQkJbGluZW91dF92b2xfcmVnID0gV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ1RMOworCQkJbGluZW91dF9taXhfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEw7CisJCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gNikgeworCQkJbGluZW91dF92b2xfcmVnID0gV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ1RMOworCQkJbGluZW91dF9taXhfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEw7CisJCX0KKwl9IGVsc2UgaWYgKHctPnJlZyA9PSBXQ0Q5MzM1X0FOQV9MT18zXzQpIHsKKwkJaWYgKHctPnNoaWZ0ID09IDcpIHsKKwkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTDsKKwkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMOworCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDYpIHsKKwkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTDsKKwkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ1RMOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEVycm9yIGVuYWJsaW5nIGxpbmVvdXQgUEFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogNW1zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGVuYWJsZWQgYXMgcGVyCisJCSAqIEhXIHJlcXVpcmVtZW50CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxpbmVvdXRfdm9sX3JlZywKKwkJCQkgICAgMHgxMCwgMHgwMCk7CisJCS8qIFJlbW92ZSBtaXggcGF0aCBtdXRlIGlmIGl0IGlzIGVuYWJsZWQgKi8KKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIGxpbmVvdXRfbWl4X3ZvbF9yZWcpKSAmIDB4MTApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgbGluZW91dF9taXhfdm9sX3JlZywKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMSBQQSIpKSB8fAorCQkgICAgIShzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMiBQQSIpKSkKKwkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJdGFzaGFfY29kZWNfb3ZlcnJpZGUoY29kZWMsIENMU19BQiwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogNW1zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGRpc2FibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOworCQl0YXNoYV9jb2RlY19vdmVycmlkZShjb2RlYywgQ0xTX0FCLCBldmVudCk7CisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIExJTkVPVVQxIFBBIikpIHx8CisJCQkhKHN0cmNtcCh3LT5uYW1lLCAiQU5DIExJTkVPVVQyIFBBIikpKSB7CisJCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7CisJCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMSBQQSIpKSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOworCQkJZWxzZQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgxMCk7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX3Nwa19hbmNfdXBkYXRlX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3BrX2FuY193b3JrICpzcGtfYW5jX2R3b3JrOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcms7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXNwa19hbmNfZHdvcmsgPSBjb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3Qgc3BrX2FuY193b3JrLCBkd29yayk7CisJdGFzaGEgPSBzcGtfYW5jX2R3b3JrLT50YXNoYTsKKwljb2RlYyA9IHRhc2hhLT5jb2RlYzsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGtfYW5jKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIGludCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZCAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50LAorCQl0YXNoYS0+YW5jX2Z1bmMpOworCisJaWYgKCF0YXNoYS0+YW5jX2Z1bmMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXNoYS0+c3BrX2FuY19kd29yay5kd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKHNwa19hbmNfZW5fZGVsYXkpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGFzaGEtPnNwa19hbmNfZHdvcmsuZHdvcmspOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcwLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfZWFyX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCWludCByZXQgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DVEwsCisJCQkJICAgIDB4MTAsIDB4MDApOworCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMKSkgJgorCQkgICAgIDB4MTApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCwKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogNW1zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGRpc2FibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOworCisJCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEVBUiBQQSIpKSkgeworCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcwLCAweDEwLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX21vZGVfZ2Fpbl9vcHQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgIHU4IGdhaW4pCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTggaHBoX2xfZW4sIGhwaF9yX2VuOworCXU4IGxfdmFsLCByX3ZhbDsKKwl1OCBocGhfcGFfc3RhdHVzOworCWJvb2wgaXNfaHBobF9wYSwgaXNfaHBocl9wYTsKKworCWhwaF9wYV9zdGF0dXMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCk7CisJaXNfaHBobF9wYSA9IGhwaF9wYV9zdGF0dXMgPj4gNzsKKwlpc19ocGhyX3BhID0gKGhwaF9wYV9zdGF0dXMgJiAweDQwKSA+PiA2OworCisJaHBoX2xfZW4gPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfSFBIX0xfRU4pOworCWhwaF9yX2VuID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0VOKTsKKworCWxfdmFsID0gKGhwaF9sX2VuICYgMHhDMCkgfCAweDIwIHwgZ2FpbjsKKwlyX3ZhbCA9IChocGhfcl9lbiAmIDB4QzApIHwgMHgyMCB8IGdhaW47CisKKwkvKgorCSAqIFNldCBIUEhfTCAmIEhQSF9SIGdhaW4gc291cmNlIHNlbGVjdGlvbiB0byBSRUdJU1RFUgorCSAqIGZvciBiZXR0ZXIgY2xpY2sgYW5kIHBvcCBvbmx5IGlmIGNvcnJlc3BvbmRpbmcgUEFzIGFyZQorCSAqIG5vdCBlbmFibGVkLiBBbHNvIGNhY2hlIHRoZSB2YWx1ZXMgb2YgdGhlIEhQSEwvUgorCSAqIFBBIGdhaW5zIHRvIGJlIGFwcGxpZWQgYWZ0ZXIgUEFzIGFyZSBlbmFibGVkCisJICovCisJaWYgKChsX3ZhbCAhPSBocGhfbF9lbikgJiYgIWlzX2hwaGxfcGEpIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9IUEhfTF9FTiwgbF92YWwpOworCQl0YXNoYS0+aHBoX2xfZ2FpbiA9IGhwaF9sX2VuICYgMHgxRjsKKwl9CisKKwlpZiAoKHJfdmFsICE9IGhwaF9yX2VuKSAmJiAhaXNfaHBocl9wYSkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0VOLCByX3ZhbCk7CisJCXRhc2hhLT5ocGhfcl9nYWluID0gaHBoX3JfZW4gJiAweDFGOworCX0KK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX2xvaGlmaV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1BBLCAweDBGLCAweDA2KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyLAorCQkJCSAgICAweEYwLCAweDQwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfQ05QX1dHX0NUTCwgMHgwNywgMHgwMyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MDgsIDB4MDgpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwxLCAweDBFLCAweDBDKTsKKwkJdGFzaGFfY29kZWNfaHBoX21vZGVfZ2Fpbl9vcHQoY29kZWMsIDB4MTEpOworCX0KKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDA4LCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfQ05QX1dHX0NUTCwgMHgwNywgMHgwMik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMiwgMHg4QSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfUlhfQklBU19IUEhfUEEsIDB4MEYsIDB4MEEpOworCX0KK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX2xwX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgaW50IGV2ZW50KQoreworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDEsIDB4MEUsIDB4MEMpOworCQl0YXNoYV9jb2RlY19ocGhfbW9kZV9nYWluX29wdChjb2RlYywgMHgxMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsIDB4MDcsIDB4MDMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDA4LCAweDA4KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwNCwgMHgwNCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MjAsIDB4MjApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwsIDB4MDcsCisJCQkJICAgIDB4MDEpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwsIDB4NzAsCisJCQkJICAgIDB4MTApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPLAorCQkJCSAgICAweDBGLCAweDAxKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDX0xETywKKwkJCQkgICAgMHhGMCwgMHgxMCk7CisJfQorCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ19MRE8sIDB4ODgpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwsIDB4MzMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDIwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwNCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MDgsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMLCAweDA3LCAweDAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUl9FTiwgMHhDMCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sIDB4QzAsIDB4ODApOworCX0KK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX2hpZmlfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJaW50IGV2ZW50KQoreworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsIDB4MDcsIDB4MDMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDA4LCAweDA4KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMSwgMHgwRSwgMHgwQyk7CisJCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2dhaW5fb3B0KGNvZGVjLCAweDExKTsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwOCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsIDB4MDcsIDB4MDIpOworCX0KK30KKworc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaHBoX21vZGVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJaW50IGV2ZW50LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmICghVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTFNfSF9MUDoKKwkJdGFzaGFfY29kZWNfaHBoX2xwX2NvbmZpZyhjb2RlYywgZXZlbnQpOworCQlicmVhazsKKwljYXNlIENMU19IX0xPSElGSToKKwkJdGFzaGFfY29kZWNfaHBoX2xvaGlmaV9jb25maWcoY29kZWMsIGV2ZW50KTsKKwkJYnJlYWs7CisJY2FzZSBDTFNfSF9ISUZJOgorCQl0YXNoYV9jb2RlY19ocGhfaGlmaV9jb25maWcoY29kZWMsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2hwaHJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlpbnQgaHBoX21vZGUgPSB0YXNoYS0+aHBoX21vZGU7CisJdTggZGVtX2lucDsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHduYW1lOiAlcyBldmVudDogJWQgaHBoX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJdy0+bmFtZSwgZXZlbnQsIGhwaF9tb2RlKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAodGFzaGEtPmFuY19mdW5jKSB7CisJCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7CisJCQkvKiA0MCBtc2VjIGRlbGF5IGlzIG5lZWRlZCB0byBhdm9pZCBjbGljayBhbmQgcG9wICovCisJCQltc2xlZXAoNDApOworCQl9CisKKwkJLyogUmVhZCBERU0gSU5QIFNlbGVjdCAqLworCQlkZW1faW5wID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwKSAmCisJCQkgIDB4MDM7CisJCWlmICgoKGhwaF9tb2RlID09IENMU19IX0hJRkkpIHx8IChocGhfbW9kZSA9PSBDTFNfSF9MT0hJRkkpIHx8CisJCSAgICAgKGhwaF9tb2RlID09IENMU19IX0xQKSkgJiYgKGRlbV9pbnAgIT0gMHgwMSkpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBERU0gSW5wdXQgbm90IHNldCBjb3JyZWN0bHksIGhwaF9tb2RlOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGhwaF9tb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0hQSFIsCisJCQkgICAgICgoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSA/CisJCQkgICAgICAgQ0xTX0hfSElGSSA6IGhwaF9tb2RlKSk7CisKKwkJdGFzaGFfY29kZWNfaHBoX21vZGVfY29uZmlnKGNvZGVjLCBldmVudCwgaHBoX21vZGUpOworCisJCWlmICh0YXNoYS0+YW5jX2Z1bmMpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKiAxMDAwdXMgcmVxdWlyZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwkJaWYgKChocGhfbW9kZSA9PSBDTFNfSF9MUCkgJiYKKwkJICAgKFRBU0hBX0lTXzFfMSh3Y2Q5eHh4KSkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0xfREFDX0NUTCwKKwkJCQkJICAgIDB4MDMsIDB4MDMpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICgoaHBoX21vZGUgPT0gQ0xTX0hfTFApICYmCisJCSAgIChUQVNIQV9JU18xXzEod2NkOXh4eCkpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwsCisJCQkJCSAgICAweDAzLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogMTAwMHVzIHJlcXVpcmVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisKKwkJaWYgKCEod2NkX2Nsc2hfZ2V0X2Nsc2hfc3RhdGUoJnRhc2hhLT5jbHNoX2QpICYKKwkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhMKSkKKwkJCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2NvbmZpZyhjb2RlYywgZXZlbnQsIGhwaF9tb2RlKTsKKworCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhSLAorCQkJICAgICAoKGhwaF9tb2RlID09IENMU19IX0xPSElGSSkgPworCQkJICAgICAgIENMU19IX0hJRkkgOiBocGhfbW9kZSkpOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19ocGhsX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJaW50IGhwaF9tb2RlID0gdGFzaGEtPmhwaF9tb2RlOworCXU4IGRlbV9pbnA7CisJaW50IHJldCA9IDA7CisJdWludDMyX3QgaW1wZWRsID0gMCwgaW1wZWRyID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHduYW1lOiAlcyBldmVudDogJWQgaHBoX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJdy0+bmFtZSwgZXZlbnQsIGhwaF9tb2RlKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAodGFzaGEtPmFuY19mdW5jKSB7CisJCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7CisJCQkvKiA0MCBtc2VjIGRlbGF5IGlzIG5lZWRlZCB0byBhdm9pZCBjbGljayBhbmQgcG9wICovCisJCQltc2xlZXAoNDApOworCQl9CisKKwkJLyogUmVhZCBERU0gSU5QIFNlbGVjdCAqLworCQlkZW1faW5wID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMwKSAmCisJCQkgIDB4MDM7CisJCWlmICgoKGhwaF9tb2RlID09IENMU19IX0hJRkkpIHx8IChocGhfbW9kZSA9PSBDTFNfSF9MT0hJRkkpIHx8CisJCSAgICAgKGhwaF9tb2RlID09IENMU19IX0xQKSkgJiYgKGRlbV9pbnAgIT0gMHgwMSkpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBERU0gSW5wdXQgbm90IHNldCBjb3JyZWN0bHksIGhwaF9tb2RlOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGhwaF9tb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0hQSEwsCisJCQkgICAgICgoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSA/CisJCQkgICAgICAgQ0xTX0hfSElGSSA6IGhwaF9tb2RlKSk7CisKKwkJdGFzaGFfY29kZWNfaHBoX21vZGVfY29uZmlnKGNvZGVjLCBldmVudCwgaHBoX21vZGUpOworCisJCWlmICh0YXNoYS0+YW5jX2Z1bmMpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOworCisJCXJldCA9IHdjZF9tYmhjX2dldF9pbXBlZGFuY2UoJnRhc2hhLT5tYmhjLAorCQkJCQkmaW1wZWRsLCAmaW1wZWRyKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXdjZF9jbHNoX2ltcGVkX2NvbmZpZyhjb2RlYywgaW1wZWRsLCBmYWxzZSk7CisJCQlzZXRfYml0KENMQVNTSF9DT05GSUcsICZ0YXNoYS0+c3RhdHVzX21hc2spOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgbWJoYyBpbXBlZGFuY2UgJWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldCA9IDA7CisJCX0KKworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKiAxMDAwdXMgcmVxdWlyZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwkJaWYgKChocGhfbW9kZSA9PSBDTFNfSF9MUCkgJiYKKwkJICAgKFRBU0hBX0lTXzFfMSh3Y2Q5eHh4KSkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0xfREFDX0NUTCwKKwkJCQkJICAgIDB4MDMsIDB4MDMpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICgoaHBoX21vZGUgPT0gQ0xTX0hfTFApICYmCisJCSAgIChUQVNIQV9JU18xXzEod2NkOXh4eCkpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwsCisJCQkJCSAgICAweDAzLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogMTAwMHVzIHJlcXVpcmVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisKKwkJaWYgKCEod2NkX2Nsc2hfZ2V0X2Nsc2hfc3RhdGUoJnRhc2hhLT5jbHNoX2QpICYKKwkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhSKSkKKwkJCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2NvbmZpZyhjb2RlYywgZXZlbnQsIGhwaF9tb2RlKTsKKwkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGFzaGEtPmNsc2hfZCwKKwkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUE9TVF9QQSwKKwkJCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBITCwKKwkJCSAgICAgKChocGhfbW9kZSA9PSBDTFNfSF9MT0hJRkkpID8KKwkJCSAgICAgICBDTFNfSF9ISUZJIDogaHBoX21vZGUpKTsKKworCQlpZiAodGVzdF9iaXQoQ0xBU1NIX0NPTkZJRywgJnRhc2hhLT5zdGF0dXNfbWFzaykpIHsKKwkJCXdjZF9jbHNoX2ltcGVkX2NvbmZpZyhjb2RlYywgaW1wZWRsLCB0cnVlKTsKKwkJCWNsZWFyX2JpdChDTEFTU0hfQ09ORklHLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKKwkJfSBlbHNlCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGdldCBtYmhjIGltcGVkYW5jZSAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByZXQpOworCisKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfbGluZW91dF9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAodGFzaGEtPmFuY19mdW5jICYmCisJCQkoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMyBEQUMiKSB8fAorCQkJCSFzdHJjbXAody0+bmFtZSwgIlJYIElOVDQgREFDIikpKQorCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0xPLAorCQkJICAgICBDTFNfQUIpOworCisJCWlmICh0YXNoYS0+YW5jX2Z1bmMpIHsKKwkJCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQzIERBQyIpKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgxMCk7CisJCQllbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ0IERBQyIpKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgxMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BPU1RfUEEsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0xPLAorCQkJICAgICBDTFNfQUIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHRhc2hhX2RhcG1faTJzX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9JMlNfQ1RMIiwgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWF9JMlNfQ1RMLAorCTAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlRYX0kyU19DVEwiLCBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19DVEwsCisJMCwgMCwgTlVMTCwgMCksCit9OworCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2Vhcl9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAodGFzaGEtPmFuY19mdW5jKQorCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOworCisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0VBUiwKKwkJCSAgICAgQ0xTX0hfTk9STUFMKTsKKwkJaWYgKHRhc2hhLT5hbmNfZnVuYykKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgxMCk7CisKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIsCisJCQkgICAgIENMU19IX05PUk1BTCk7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX3Nwa19ib29zdF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXUxNiBib29zdF9wYXRoX2N0bCwgYm9vc3RfcGF0aF9jZmcxOworCXUxNiByZWcsIHJlZ19taXg7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ3IENIQUlOIikpIHsKKwkJYm9vc3RfcGF0aF9jdGwgPSBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfUEFUSF9DVEw7CisJCWJvb3N0X3BhdGhfY2ZnMSA9IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzE7CisJCXJlZyA9IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NUTDsKKwkJcmVnX21peCA9IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEw7CisJfSBlbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ4IENIQUlOIikpIHsKKwkJYm9vc3RfcGF0aF9jdGwgPSBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEw7CisJCWJvb3N0X3BhdGhfY2ZnMSA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzE7CisJCXJlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTDsKKwkJcmVnX21peCA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEw7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gd2lkZ2V0OiAlc1xuIiwKKwkJCV9fZnVuY19fLCB3LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYm9vc3RfcGF0aF9jZmcxLCAweDAxLCAweDAxKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDAwKTsKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHJlZ19taXgpKSAmIDB4MTApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdfbWl4LCAweDEwLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY2ZnMSwgMHgwMSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDAwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2IHRhc2hhX2ludGVycF9nZXRfcHJpbWFyeV9yZWcodTE2IHJlZywgdTE2ICppbmQpCit7CisJdTE2IHByaW1faW50X3JlZyA9IDA7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ1RMOgorCWNhc2UgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTDoKKwkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ1RMOworCQkqaW5kID0gMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEw6CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMOgorCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEw7CisJCSppbmQgPSAxOworCQlicmVhazsKKwljYXNlIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTDoKKwljYXNlIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEw6CisJCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTDsKKwkJKmluZCA9IDI7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ1RMOgorCWNhc2UgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTDoKKwkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ1RMOworCQkqaW5kID0gMzsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEw6CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMOgorCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEw7CisJCSppbmQgPSA0OworCQlicmVhazsKKwljYXNlIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTDoKKwljYXNlIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DVEw6CisJCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTDsKKwkJKmluZCA9IDU7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ1RMOgorCWNhc2UgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTDoKKwkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ1RMOworCQkqaW5kID0gNjsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEw6CisJY2FzZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMOgorCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEw7CisJCSppbmQgPSA3OworCQlicmVhazsKKwljYXNlIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTDoKKwljYXNlIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEw6CisJCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTDsKKwkJKmluZCA9IDg7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcHJpbV9pbnRfcmVnOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19oZDJfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIHUxNiBwcmltX2ludF9yZWcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgaGQyX3NjYWxlX3JlZzsKKwl1MTYgaGQyX2VuYWJsZV9yZWcgPSAwOworCisJaWYgKCFUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQorCQlyZXR1cm47CisKKwlpZiAocHJpbV9pbnRfcmVnID09IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTCkgeworCQloZDJfc2NhbGVfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMzsKKwkJaGQyX2VuYWJsZV9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwOworCX0KKwlpZiAocHJpbV9pbnRfcmVnID09IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCkgeworCQloZDJfc2NhbGVfcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMzsKKwkJaGQyX2VuYWJsZV9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwOworCX0KKworCWlmIChoZDJfZW5hYmxlX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9zY2FsZV9yZWcsIDB4M0MsIDB4MTApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDAzLCAweDAxKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX2VuYWJsZV9yZWcsIDB4MDQsIDB4MDQpOworCX0KKworCWlmIChoZDJfZW5hYmxlX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfZW5hYmxlX3JlZywgMHgwNCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9zY2FsZV9yZWcsIDB4MDMsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDNDLCAweDAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3ByaW1faW50ZXJwb2xhdG9yKAorCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQl1MTYgcmVnLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTE2IHByaW1faW50X3JlZzsKKwl1MTYgaW5kID0gMDsKKworCXByaW1faW50X3JlZyA9IHRhc2hhX2ludGVycF9nZXRfcHJpbWFyeV9yZWcocmVnLCAmaW5kKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl0YXNoYS0+cHJpbV9pbnRfdXNlcnNbaW5kXSsrOworCQlpZiAodGFzaGEtPnByaW1faW50X3VzZXJzW2luZF0gPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcHJpbV9pbnRfcmVnLAorCQkJCQkgICAgMHgxMCwgMHgxMCk7CisJCQl0YXNoYV9jb2RlY19oZDJfY29udHJvbChjb2RlYywgcHJpbV9pbnRfcmVnLCBldmVudCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBwcmltX2ludF9yZWcsCisJCQkJCSAgICAxIDw8IDB4NSwgMSA8PCAweDUpOworCQl9CisJCWlmICgocmVnICE9IHByaW1faW50X3JlZykgJiYKKwkJICAgICgoc25kX3NvY19yZWFkKGNvZGVjLCBwcmltX2ludF9yZWcpKSAmIDB4MTApKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDEwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXRhc2hhLT5wcmltX2ludF91c2Vyc1tpbmRdLS07CisJCWlmICh0YXNoYS0+cHJpbV9pbnRfdXNlcnNbaW5kXSA9PSAwKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBwcmltX2ludF9yZWcsCisJCQkJCTEgPDwgMHg1LCAwIDw8IDB4NSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBwcmltX2ludF9yZWcsCisJCQkJCTB4NDAsIDB4NDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcHJpbV9pbnRfcmVnLAorCQkJCQkweDQwLCAweDAwKTsKKwkJCXRhc2hhX2NvZGVjX2hkMl9jb250cm9sKGNvZGVjLCBwcmltX2ludF9yZWcsIGV2ZW50KTsKKwkJfQorCQlicmVhazsKKwl9OworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHByaW1hcnkgaW50ZXJwb2xhdG9yOiBJTlQlZCwgdXNlcnM6ICVkXG4iLAorCQlfX2Z1bmNfXywgaW5kLCB0YXNoYS0+cHJpbV9pbnRfdXNlcnNbaW5kXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9zcmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgaW50IHNyY19udW0sCisJCQkJCSBpbnQgZXZlbnQpCit7CisJdTE2IHNyY19wYWlyZWRfcmVnOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwl1MTYgcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMDsKKwl1MTYgcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMOworCWludCAqc3JjX3VzZXJzLCBjb3VudCwgc3BsX3NyYyA9IFNQTElORV9TUkMwOworCXUxNiBzcmNfY2xrX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzBfQ0xLX1JTVF9DVExfMDsKKworCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKHNyY19udW0pIHsKKwljYXNlIFNSQ19JTl9IUEhMOgorCQlyeF9wYXRoX2NmZ19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwOworCQlzcmNfY2xrX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzBfQ0xLX1JTVF9DVExfMDsKKwkJc3JjX3BhaXJlZF9yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMxX0NMS19SU1RfQ1RMXzA7CisJCXJ4X3BhdGhfY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTDsKKwkJc3BsX3NyYyA9IFNQTElORV9TUkMwOworCQlicmVhazsKKwljYXNlIFNSQ19JTl9MTzE6CisJCXJ4X3BhdGhfY2ZnX3JlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzA7CisJCXNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wOworCQlzcmNfcGFpcmVkX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMDsKKwkJcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ1RMOworCQlzcGxfc3JjID0gU1BMSU5FX1NSQzA7CisJCWJyZWFrOworCWNhc2UgU1JDX0lOX0hQSFI6CisJCXJ4X3BhdGhfY2ZnX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzA7CisJCXNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wOworCQlzcmNfcGFpcmVkX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzBfQ0xLX1JTVF9DVExfMDsKKwkJcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMOworCQlzcGxfc3JjID0gU1BMSU5FX1NSQzE7CisJCWJyZWFrOworCWNhc2UgU1JDX0lOX0xPMjoKKwkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMDsKKwkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMxX0NMS19SU1RfQ1RMXzA7CisJCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wOworCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEw7CisJCXNwbF9zcmMgPSBTUExJTkVfU1JDMTsKKwkJYnJlYWs7CisJY2FzZSBTUkNfSU5fU1BLUkw6CisJCXJ4X3BhdGhfY2ZnX3JlZyA9IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzA7CisJCXNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wOworCQlzcmNfcGFpcmVkX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzNfQ0xLX1JTVF9DVExfMDsKKwkJcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ1RMOworCQlzcGxfc3JjID0gU1BMSU5FX1NSQzI7CisJCWJyZWFrOworCWNhc2UgU1JDX0lOX0xPMzoKKwkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMDsKKwkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzA7CisJCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wOworCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEw7CisJCXNwbF9zcmMgPSBTUExJTkVfU1JDMjsKKwkJYnJlYWs7CisJY2FzZSBTUkNfSU5fU1BLUlI6CisJCXJ4X3BhdGhfY2ZnX3JlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzA7CisJCXNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wOworCQlzcmNfcGFpcmVkX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMDsKKwkJcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ1RMOworCQlzcGxfc3JjID0gU1BMSU5FX1NSQzM7CisJCWJyZWFrOworCWNhc2UgU1JDX0lOX0xPNDoKKwkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMDsKKwkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzA7CisJCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wOworCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEw7CisJCXNwbF9zcmMgPSBTUExJTkVfU1JDMzsKKwkJYnJlYWs7CisJfTsKKworCXNyY191c2VycyA9ICZ0YXNoYS0+c3BsX3NyY191c2Vyc1tzcGxfc3JjXTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQljb3VudCA9ICpzcmNfdXNlcnM7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA9PSAxKSB7CisJCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgc3JjX2Nsa19yZWcpICYgMHgwMikgfHwKKwkJCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBzcmNfcGFpcmVkX3JlZykgJiAweDAyKSkgeworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHNyY19jbGtfcmVnLCAweDAyLAorCQkJCQkJICAgIDB4MDApOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHNyY19wYWlyZWRfcmVnLAorCQkJCQkJICAgIDB4MDIsIDB4MDApOworCQkJfQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgc3JjX2Nsa19yZWcsCTB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmdfcmVnLCAweDgwLAorCQkJCQkgICAgMHg4MCk7CisJCX0KKwkJKnNyY191c2VycyA9IGNvdW50OworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJY291bnQgPSAqc3JjX3VzZXJzOworCQljb3VudC0tOworCQlpZiAoY291bnQgPT0gMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmdfcmVnLCAweDgwLAorCQkJCQkgICAgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzcmNfY2xrX3JlZywgMHgwMywgMHgwMik7CisJCQkvKiBkZWZhdWx0IHNhbXBsZSByYXRlICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2N0bF9yZWcsIDB4MGYsCisJCQkJCSAgICAweDA0KTsKKwkJfQorCQkqc3JjX3VzZXJzID0gY291bnQ7CisJCWJyZWFrOworCX07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogU3BsaW5lIFNSQyVkLCB1c2VyczogJWRcbiIsCisJCV9fZnVuY19fLCBzcGxfc3JjLCAqc3JjX3VzZXJzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3Jlc2FtcGxlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCWludCByZXQgPSAwOworCXU4IHNyY19pbjsKKworCXNyY19pbiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzApOworCWlmICghKHNyY19pbiAmIDB4RkYpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBTcGxpbmUgU1JDJXUgaW5wdXQgbm90IHNlbGVjdGVkXG4iLAorCQkJX19mdW5jX18sIHctPnNoaWZ0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh3LT5zaGlmdCkgeworCWNhc2UgU1BMSU5FX1NSQzA6CisJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfc3JjKGNvZGVjLAorCQkJKChzcmNfaW4gJiAweDAzKSA9PSAxKSA/IFNSQ19JTl9IUEhMIDogU1JDX0lOX0xPMSwKKwkJCWV2ZW50KTsKKwkJYnJlYWs7CisJY2FzZSBTUExJTkVfU1JDMToKKwkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9zcmMoY29kZWMsCisJCQkoKHNyY19pbiAmIDB4MEMpID09IDQpID8gU1JDX0lOX0hQSFIgOiBTUkNfSU5fTE8yLAorCQkJZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNQTElORV9TUkMyOgorCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3NyYyhjb2RlYywKKwkJCSgoc3JjX2luICYgMHgzMCkgPT0gMHgxMCkgPyBTUkNfSU5fTE8zIDogU1JDX0lOX1NQS1JMLAorCQkJZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNQTElORV9TUkMzOgorCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3NyYyhjb2RlYywKKwkJCSgoc3JjX2luICYgMHhDMCkgPT0gMHg0MCkgPyBTUkNfSU5fTE80IDogU1JDX0lOX1NQS1JSLAorCQkJZXZlbnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBzcGxpbmUgc3JjOiV1XG4iLCBfX2Z1bmNfXywKKwkJCXctPnNoaWZ0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3dyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJaW50IGksIGNoX2NudDsKKworCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIXRhc2hhLT5ucikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaWYgKChzdHJuc3RyKHctPm5hbWUsICJJTlQ3XyIsIHNpemVvZigiUlggSU5UN18iKSkpICYmCisJCSAgICAhdGFzaGEtPnJ4XzdfY291bnQpCisJCQl0YXNoYS0+cnhfN19jb3VudCsrOworCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDhfIiwgc2l6ZW9mKCJSWCBJTlQ4XyIpKSkgJiYKKwkJICAgICF0YXNoYS0+cnhfOF9jb3VudCkKKwkJCXRhc2hhLT5yeF84X2NvdW50Kys7CisJCWNoX2NudCA9IHRhc2hhLT5yeF83X2NvdW50ICsgdGFzaGEtPnJ4XzhfY291bnQ7CisKKwkJZm9yIChpID0gMDsgaSA8IHRhc2hhLT5ucjsgaSsrKSB7CisJCQlzd3JtX3djZF9ub3RpZnkodGFzaGEtPnN3cl9jdHJsX2RhdGFbaV0uc3dyX3BkZXYsCisJCQkJCVNXUl9ERVZJQ0VfVVAsIE5VTEwpOworCQkJc3dybV93Y2Rfbm90aWZ5KHRhc2hhLT5zd3JfY3RybF9kYXRhW2ldLnN3cl9wZGV2LAorCQkJCQlTV1JfU0VUX05VTV9SWF9DSCwgJmNoX2NudCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICgoc3RybnN0cih3LT5uYW1lLCAiSU5UN18iLCBzaXplb2YoIlJYIElOVDdfIikpKSAmJgorCQkgICAgdGFzaGEtPnJ4XzdfY291bnQpCisJCQl0YXNoYS0+cnhfN19jb3VudC0tOworCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDhfIiwgc2l6ZW9mKCJSWCBJTlQ4XyIpKSkgJiYKKwkJICAgIHRhc2hhLT5yeF84X2NvdW50KQorCQkJdGFzaGEtPnJ4XzhfY291bnQtLTsKKwkJY2hfY250ID0gdGFzaGEtPnJ4XzdfY291bnQgKyB0YXNoYS0+cnhfOF9jb3VudDsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGFzaGEtPm5yOyBpKyspCisJCQlzd3JtX3djZF9ub3RpZnkodGFzaGEtPnN3cl9jdHJsX2RhdGFbaV0uc3dyX3BkZXYsCisJCQkJCVNXUl9TRVRfTlVNX1JYX0NILCAmY2hfY250KTsKKworCQlicmVhazsKKwl9CisJZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IGN1cnJlbnQgc3dyIGNoIGNudDogJWRcbiIsCisJCV9fZnVuY19fLCB0YXNoYS0+cnhfN19jb3VudCArIHRhc2hhLT5yeF84X2NvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgIGludCBldmVudCwgaW50IGdhaW5fcmVnKQoreworCWludCBjb21wX2dhaW5fb2Zmc2V0LCB2YWw7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKHRhc2hhLT5zcGtyX21vZGUpIHsKKwkvKiBDb21wYW5kZXIgZ2FpbiBpbiBTUEtSX01PREUxIGNhc2UgaXMgMTIgZEIgKi8KKwljYXNlIFNQS1JfTU9ERV8xOgorCQljb21wX2dhaW5fb2Zmc2V0ID0gLTEyOworCQlicmVhazsKKwkvKiBEZWZhdWx0IGNhc2UgY29tcGFuZGVyIGdhaW4gaXMgMTUgZEIgKi8KKwlkZWZhdWx0OgorCQljb21wX2dhaW5fb2Zmc2V0ID0gLTE1OworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qIEFwcGx5IGVhciBzcGtyIGdhaW4gb25seSBpZiBjb21wYW5kZXIgaXMgZW5hYmxlZCAqLworCQlpZiAodGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gJiYKKwkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX0NUTCB8fAorCQkgICAgIGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCkgJiYKKwkJICAgICh0YXNoYS0+ZWFyX3Nwa3JfZ2FpbiAhPSAwKSkgeworCQkJLyogRm9yIGV4YW1wbGUsIHZhbCBpcyAtOCgtMTIrNS0xKSBmb3IgNGRCIG9mIGdhaW4gKi8KKwkJCXZhbCA9IGNvbXBfZ2Fpbl9vZmZzZXQgKyB0YXNoYS0+ZWFyX3Nwa3JfZ2FpbiAtIDE7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgdmFsKTsKKworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYNyBWb2x1bWUgJWQgZEJcbiIsCisJCQkJX19mdW5jX18sIHZhbCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qCisJCSAqIFJlc2V0IFJYNyB2b2x1bWUgdG8gMCBkQiBpZiBjb21wYW5kZXIgaXMgZW5hYmxlZCBhbmQKKwkJICogZWFyX3Nwa3JfZ2FpbiBpcyBub24temVyby4KKwkJICovCisJCWlmICh0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSAmJgorCQkgICAgKGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMKSAmJgorCQkgICAgKHRhc2hhLT5lYXJfc3Brcl9nYWluICE9IDApKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgMHgwKTsKKworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJlc2V0IFJYNyBWb2x1bWUgdG8gMCBkQlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgZ2Fpbl9yZWc7CisJaW50IG9mZnNldF92YWwgPSAwOworCWludCB2YWwgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisKKwlzd2l0Y2ggKHctPnJlZykgeworCWNhc2UgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTDoKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX01JWF9DVEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBObyBnYWluIHJlZ2lzdGVyIGF2YWlsIGZvciAlc1xuIiwKKwkJCV9fZnVuY19fLCB3LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKCh0YXNoYS0+c3Brcl9nYWluX29mZnNldCA9PSBSWF9HQUlOX09GRlNFVF9NMVA1X0RCKSAmJgorCQkgICAgKHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddIHx8CisJCSAgICAgdGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfOF0pICYmCisJCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCW9mZnNldF92YWwgPSAtMjsKKwkJfQorCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKKwkJdmFsICs9IG9mZnNldF92YWw7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOworCQl0YXNoYV9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICgodGFzaGEtPnNwa3JfZ2Fpbl9vZmZzZXQgPT0gUlhfR0FJTl9PRkZTRVRfTTFQNV9EQikgJiYKKwkJICAgICh0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSB8fAorCQkgICAgIHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzhdKSAmJgorCQkgICAgKGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCB8fAorCQkgICAgIGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzEsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMCwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQlvZmZzZXRfdmFsID0gMjsKKwkJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZ2Fpbl9yZWcpOworCQkJdmFsICs9IG9mZnNldF92YWw7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgdmFsKTsKKwkJfQorCQl0YXNoYV9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fdGFzaGFfY2RjX25hdGl2ZV9jbGtfZW5hYmxlKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKKwkJCQkJIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhc2hhLT5jb2RlYzsKKworCWlmICghdGFzaGEtPndjZF9uYXRpdmVfY2xrKSB7CisJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiB3Y2QgbmF0aXZlIGNsb2NrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IG5hdGl2ZV9jbGtfZW5hYmxlID0gJXVcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodGFzaGEtPndjZF9uYXRpdmVfY2xrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IG5hdGl2ZSBjbGsgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoKyt0YXNoYS0+bmF0aXZlX2Nsa191c2VycyA9PSAxKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NMT0NLX1RFU1RfQ1RMLAorCQkJCQkgICAgMHgxMCwgMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NMT0NLX1RFU1RfQ1RMLAorCQkJCQkgICAgMHg4MCwgMHg4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwKKwkJCQkJICAgIDB4MDQsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKKwkJCQkJMHgwMiwgMHgwMik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGFzaGEtPm5hdGl2ZV9jbGtfdXNlcnMgJiYKKwkJICAgICgtLXRhc2hhLT5uYXRpdmVfY2xrX3VzZXJzID09IDApKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAorCQkJCQkweDAyLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFLAorCQkJCQkgICAgMHgwNCwgMHgwNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NMT0NLX1RFU1RfQ1RMLAorCQkJCQkgICAgMHg4MCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NMT0NLX1RFU1RfQ1RMLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisJCX0KKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHRhc2hhLT53Y2RfbmF0aXZlX2Nsayk7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG5hdGl2ZV9jbGtfdXNlcnM6ICVkXG4iLCBfX2Z1bmNfXywKKwkJdGFzaGEtPm5hdGl2ZV9jbGtfdXNlcnMpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZ2V0X25hdGl2ZV9maWZvX3N5bmNfbWFzayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCQkgaW50IGludGVycF9uKQoreworCWludCBtYXNrID0gMDsKKwl1MTYgcmVnOworCXU4IHZhbDEsIHZhbDIsIGlucDAgPSAwOworCXU4IGlucDEgPSAwLCBpbnAyID0gMDsKKworCXJlZyA9IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcwICsgKDIgKiBpbnRlcnBfbikgLSAyOworCisJdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKTsKKwl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcgKyAxKTsKKworCWlucDAgPSB2YWwxICYgMHgwRjsKKwlpbnAxID0gKHZhbDEgPj4gNCkgJiAweDBGOworCWlucDIgPSAodmFsMiA+PiA0KSAmIDB4MEY7CisKKwlpZiAoSVNfVkFMSURfTkFUSVZFX0ZJRk9fUE9SVChpbnAwKSkKKwkJbWFzayB8PSAoMSA8PCAoaW5wMCAtIDUpKTsKKwlpZiAoSVNfVkFMSURfTkFUSVZFX0ZJRk9fUE9SVChpbnAxKSkKKwkJbWFzayB8PSAoMSA8PCAoaW5wMSAtIDUpKTsKKwlpZiAoSVNfVkFMSURfTkFUSVZFX0ZJRk9fUE9SVChpbnAyKSkKKwkJbWFzayB8PSAoMSA8PCAoaW5wMiAtIDUpKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBuYXRpdmUgZmlmbyBtYXNrOiAweCV4XG4iLCBfX2Z1bmNfXywgbWFzayk7CisJaWYgKCFtYXNrKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJuYXRpdmUgZmlmbyBlcnIsaW50OiVkLGlucDA6JWQsaW5wMTolZCxpbnAyOiVkXG4iLAorCQkJaW50ZXJwX24sIGlucDAsIGlucDEsIGlucDIpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IHRhc2hhX2VuYWJsZV9uYXRpdmVfc3VwcGx5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJaW50IG1hc2s7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUxNiBpbnRlcnBfcmVnOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50OiAlZCwgc2hpZnQ6JWRcbiIsIF9fZnVuY19fLCBldmVudCwKKwkJdy0+c2hpZnQpOworCisJaWYgKHctPnNoaWZ0IDwgSU5URVJQX0hQSEwgfHwgdy0+c2hpZnQgPiBJTlRFUlBfTE8yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWludGVycF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwgKyAyMCAqICh3LT5zaGlmdCAtIDEpOworCisJbWFzayA9IHRhc2hhX2NvZGVjX2dldF9uYXRpdmVfZmlmb19zeW5jX21hc2soY29kZWMsIHctPnNoaWZ0KTsKKwlpZiAoIW1hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCS8qIEFkanVzdCBpbnRlcnBvbGF0b3IgcmF0ZSB0byA0NFAxX05BVElWRSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpbnRlcnBfcmVnLCAweDBGLCAweDA5KTsKKwkJX190YXNoYV9jZGNfbmF0aXZlX2Nsa19lbmFibGUodGFzaGEsIHRydWUpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMsCisJCQkJICAgIG1hc2ssIG1hc2spOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMsCisJCQkJICAgIG1hc2ssIDB4MCk7CisJCV9fdGFzaGFfY2RjX25hdGl2ZV9jbGtfZW5hYmxlKHRhc2hhLCBmYWxzZSk7CisJCS8qIEFkanVzdCBpbnRlcnBvbGF0b3IgcmF0ZSB0byBkZWZhdWx0ICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludGVycF9yZWcsIDB4MEYsIDB4MDQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgZ2Fpbl9yZWc7CisJdTE2IHJlZzsKKwlpbnQgdmFsOworCWludCBvZmZzZXRfdmFsID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOworCisJaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQwIElOVEVSUCIpKSkgeworCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DVEw7CisJCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9DVEw7CisJfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMSBJTlRFUlAiKSkpIHsKKwkJcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMOworCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMOworCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDIgSU5URVJQIikpKSB7CisJCXJlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTDsKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX0NUTDsKKwl9IGVsc2UgaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQzIElOVEVSUCIpKSkgeworCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEw7CisJCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9DVEw7CisJfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNCBJTlRFUlAiKSkpIHsKKwkJcmVnID0gV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ1RMOworCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMOworCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDUgSU5URVJQIikpKSB7CisJCXJlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTDsKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTDsKKwl9IGVsc2UgaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQ2IElOVEVSUCIpKSkgeworCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEw7CisJCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9DVEw7CisJfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNyBJTlRFUlAiKSkpIHsKKwkJcmVnID0gV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ1RMOworCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMOworCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDggSU5URVJQIikpKSB7CisJCXJlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTDsKKwkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW50ZXJwb2xhdG9yIHJlZyBub3QgZm91bmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoIXRlc3RfYml0KFNCX0NMS19HRUFSLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkgeworCQkJdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoY29kZWMsIHRydWUpOworCQkJc2V0X2JpdChTQl9DTEtfR0VBUiwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJCX0KKwkJLyogUmVzZXQgaWYgbmVlZGVkICovCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9wcmltX2ludGVycG9sYXRvcihjb2RlYywgcmVnLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQl0YXNoYV9jb25maWdfY29tcGFuZGVyKGNvZGVjLCB3LT5zaGlmdCwgZXZlbnQpOworCQkvKiBhcHBseSBnYWluIGFmdGVyIGludCBjbGsgaXMgZW5hYmxlZCAqLworCQlpZiAoKHRhc2hhLT5zcGtyX2dhaW5fb2Zmc2V0ID09IFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCisJCSAgICAodGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKKwkJICAgICB0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKKwkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX0NUTCB8fAorCQkgICAgIGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfQ1RMKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCW9mZnNldF92YWwgPSAtMjsKKwkJfQorCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKKwkJdmFsICs9IG9mZnNldF92YWw7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOworCQl0YXNoYV9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXRhc2hhX2NvbmZpZ19jb21wYW5kZXIoY29kZWMsIHctPnNoaWZ0LCBldmVudCk7CisJCXRhc2hhX2NvZGVjX2VuYWJsZV9wcmltX2ludGVycG9sYXRvcihjb2RlYywgcmVnLCBldmVudCk7CisJCWlmICgodGFzaGEtPnNwa3JfZ2Fpbl9vZmZzZXQgPT0gUlhfR0FJTl9PRkZTRVRfTTFQNV9EQikgJiYKKwkJICAgICh0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSB8fAorCQkgICAgIHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzhdKSAmJgorCQkgICAgKGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9DVEwpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJb2Zmc2V0X3ZhbCA9IDI7CisJCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKKwkJCXZhbCArPSBvZmZzZXRfdmFsOworCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7CisJCX0KKwkJdGFzaGFfY29kZWNfY29uZmlnX2Vhcl9zcGtyX2dhaW4oY29kZWMsIGV2ZW50LCBnYWluX3JlZyk7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19zZXRfaWlyX2dhaW4oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmIChzdHJuc3RyKHctPm5hbWUsICJJSVIwIiwgc2l6ZW9mKCJJSVIwIikpKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLAorCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCkpOworCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IyX0NUTCwKKwkJCQlzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwsCisJCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLAorCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCkpOworCQl9IGVsc2UgeworCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCwKKwkJCQlzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwpKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMl9DVEwsCisJCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLAorCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IzX0NUTCkpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfb25fZGVtYW5kX3N1cHBseSgKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgb25fZGVtYW5kX3N1cHBseSAqc3VwcGx5OworCisJaWYgKHctPnNoaWZ0ID49IE9OX0RFTUFORF9TVVBQTElFU19NQVgpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGVycm9yIGluZGV4ID4gTUFYIERlbWFuZCBzdXBwbGllcyIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzdXBwbHk6ICVzIGV2ZW50OiAlZFxuIiwKKwkJX19mdW5jX18sIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0sIGV2ZW50KTsKKworCXN1cHBseSA9ICZ0YXNoYS0+b25fZGVtYW5kX2xpc3Rbdy0+c2hpZnRdOworCVdBUk5fT05DRSghc3VwcGx5LT5zdXBwbHksICIlcyBpc24ndCBkZWZpbmVkXG4iLAorCQlvbl9kZW1hbmRfc3VwcGx5X25hbWVbdy0+c2hpZnRdKTsKKwlpZiAoIXN1cHBseS0+c3VwcGx5KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlcnIgc3VwcGx5IG5vdCBwcmVzZW50IG9uZCBmb3IgJWQiLAorCQkJX19mdW5jX18sIHctPnNoaWZ0KTsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3VwcGx5LT5zdXBwbHkpOworCQlpZiAocmV0KQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShzdXBwbHktPnN1cHBseSk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGRpc2FibGUgJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIGludCBhZGNfbXV4X24pCit7CisJdTE2IG1hc2ssIHNoaWZ0LCBhZGNfbXV4X2luX3JlZzsKKwl1MTYgYW1pY19tdXhfc2VsX3JlZzsKKwlib29sIGlzX2FtaWM7CisKKwlpZiAoYWRjX211eF9uIDwgMCB8fCBhZGNfbXV4X24gPiBXQ0Q5MzM1X01BWF9WQUxJRF9BRENfTVVYIHx8CisJICAgIGFkY19tdXhfbiA9PSBXQ0Q5MzM1X0lOVkFMSURfQURDX01VWCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayB3aGV0aGVyIGFkYyBtdXggaW5wdXQgaXMgQU1JQyBvciBETUlDICovCisJaWYgKGFkY19tdXhfbiA8IDQpIHsKKwkJYWRjX211eF9pbl9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEgKworCQkJCSAyICogYWRjX211eF9uOworCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwICsKKwkJCQkgICAyICogYWRjX211eF9uOworCQltYXNrID0gMHgwMzsKKwkJc2hpZnQgPSAwOworCX0gZWxzZSB7CisJCWFkY19tdXhfaW5fcmVnID0gV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKKwkJCQkgYWRjX211eF9uIC0gNDsKKwkJYW1pY19tdXhfc2VsX3JlZyA9IGFkY19tdXhfaW5fcmVnOworCQltYXNrID0gMHhDMDsKKwkJc2hpZnQgPSA2OworCX0KKwlpc19hbWljID0gKCgoc25kX3NvY19yZWFkKGNvZGVjLCBhZGNfbXV4X2luX3JlZykgJiBtYXNrKSA+PiBzaGlmdCkKKwkJICAgID09IDEpOworCWlmICghaXNfYW1pYykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc25kX3NvY19yZWFkKGNvZGVjLCBhbWljX211eF9zZWxfcmVnKSAmIDB4MDc7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdTE2IGFtaWNfcmVnLCBib29sIHNldCkKK3sKKwl1OCBtYXNrID0gMHgyMDsKKwl1OCB2YWw7CisKKwlpZiAoYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzEgfHwKKwkgICAgYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzMgfHwKKwkgICAgYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzUpCisJCW1hc2sgPSAweDQwOworCisJdmFsID0gc2V0ID8gbWFzayA6IDB4MDA7CisKKwlzd2l0Y2ggKGFtaWNfcmVnKSB7CisJY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDMToKKwljYXNlIFdDRDkzMzVfQU5BX0FNSUMyOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDMiwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDMzoKKwljYXNlIFdDRDkzMzVfQU5BX0FNSUM0OgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNCwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDNToKKwljYXNlIFdDRDkzMzVfQU5BX0FNSUM2OgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNiwgbWFzaywgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGludmFsaWQgYW1pYzogJWRcbiIsCisJCQlfX2Z1bmNfXywgYW1pY19yZWcpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfdHhfYWRjX2NmZyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJaW50IGFkY19tdXhfbiA9IHctPnNoaWZ0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgYW1pY19uOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50OiAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJYW1pY19uID0gdGFzaGFfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBhZGNfbXV4X24pOworCQlpZiAoYW1pY19uKSB7CisJCQkvKgorCQkJICogUHJldmVudCBBTkMgUnggcG9wIGJ5IGxlYXZpbmcgVHggRkUgaW4gSE9MRAorCQkJICogc3RhdGUgdW50aWwgUEEgaXMgdXAuIFRyYWNrIEFNSUMgYmVpbmcgdXNlZAorCQkJICogc28gd2UgY2FuIHJlbGVhc2UgdGhlIEhPTEQgbGF0ZXIuCisJCQkgKi8KKwkJCXNldF9iaXQoQU5DX01JQ19BTUlDMSArIGFtaWNfbiAtIDEsCisJCQkJJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MTYgdGFzaGFfY29kZWNfZ2V0X2FtaWNfcHdsdmxfcmVnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGFtaWMpCit7CisJdTE2IHB3cl9sZXZlbF9yZWcgPSAwOworCisJc3dpdGNoIChhbWljKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJcHdyX2xldmVsX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxOworCQlicmVhazsKKworCWNhc2UgMzoKKwljYXNlIDQ6CisJCXB3cl9sZXZlbF9yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMzsKKwkJYnJlYWs7CisKKwljYXNlIDU6CisJY2FzZSA2OgorCQlwd3JfbGV2ZWxfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIGFtaWM6ICVkXG4iLAorCQkJX19mdW5jX18sIGFtaWMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcHdyX2xldmVsX3JlZzsKK30KKworI2RlZmluZSAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLCTB4NjAKKyNkZWZpbmUgIENGX01JTl8zREJfNEhaCQkJMHgwCisjZGVmaW5lICBDRl9NSU5fM0RCXzc1SFoJCTB4MQorI2RlZmluZSAgQ0ZfTUlOXzNEQl8xNTBIWgkJMHgyCisKK3N0YXRpYyB2b2lkIHRhc2hhX3R4X2hwZl9jb3JuZXJfZnJlcV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqaHBmX2RlbGF5ZWRfd29yazsKKwlzdHJ1Y3QgaHBmX3dvcmsgKmhwZl93b3JrOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdTE2IGRlY19jZmdfcmVnLCBhbWljX3JlZzsKKwl1OCBocGZfY3V0X29mZl9mcmVxOworCWludCBhbWljX247CisKKwlocGZfZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCWhwZl93b3JrID0gY29udGFpbmVyX29mKGhwZl9kZWxheWVkX3dvcmssIHN0cnVjdCBocGZfd29yaywgZHdvcmspOworCXRhc2hhID0gaHBmX3dvcmstPnRhc2hhOworCWNvZGVjID0gdGFzaGEtPmNvZGVjOworCWhwZl9jdXRfb2ZmX2ZyZXEgPSBocGZfd29yay0+aHBmX2N1dF9vZmZfZnJlcTsKKworCWRlY19jZmdfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogaHBmX3dvcmstPmRlY2ltYXRvcjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkZWNpbWF0b3IgJXUgaHBmX2N1dF9vZl9mcmVxIDB4JXhcbiIsCisJCV9fZnVuY19fLCBocGZfd29yay0+ZGVjaW1hdG9yLCBocGZfY3V0X29mZl9mcmVxKTsKKworCWFtaWNfbiA9IHRhc2hhX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChjb2RlYywgaHBmX3dvcmstPmRlY2ltYXRvcik7CisJaWYgKGFtaWNfbikgeworCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxICsgYW1pY19uIC0gMTsKKwkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQoY29kZWMsIGFtaWNfcmVnLCBmYWxzZSk7CisJfQorCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCB0cnVlKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLLAorCQkJICAgIGhwZl9jdXRfb2ZmX2ZyZXEgPDwgNSk7CisJdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoY29kZWMsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfdHhfbXV0ZV91cGRhdGVfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0eF9tdXRlX3dvcmsgKnR4X211dGVfZHdvcms7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdTE2IHR4X3ZvbF9jdGxfcmVnLCBocGZfZ2F0ZV9yZWc7CisKKwlkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJdHhfbXV0ZV9kd29yayA9IGNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCB0eF9tdXRlX3dvcmssIGR3b3JrKTsKKwl0YXNoYSA9IHR4X211dGVfZHdvcmstPnRhc2hhOworCWNvZGVjID0gdGFzaGEtPmNvZGVjOworCisJdHhfdm9sX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKworCQkJCQkxNiAqIHR4X211dGVfZHdvcmstPmRlY2ltYXRvcjsKKwlocGZfZ2F0ZV9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMyICsKKwkJCQkJMTYgKiB0eF9tdXRlX2R3b3JrLT5kZWNpbWF0b3I7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBmX2dhdGVfcmVnLCAweDAxLCAweDAxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgwMCk7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwl1bnNpZ25lZCBpbnQgZGVjaW1hdG9yOworCWNoYXIgKmRlY19hZGNfbXV4X25hbWUgPSBOVUxMOworCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKKwljaGFyICp3bmFtZTsKKwlpbnQgcmV0ID0gMCwgYW1pY19uOworCXUxNiB0eF92b2xfY3RsX3JlZywgcHdyX2xldmVsX3JlZyA9IDAsIGRlY19jZmdfcmVnLCBocGZfZ2F0ZV9yZWc7CisJdTE2IHR4X2dhaW5fY3RsX3JlZzsKKwljaGFyICpkZWM7CisJdTggaHBmX2N1dF9vZmZfZnJlcTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJd2lkZ2V0X25hbWUgPSBrc3RybmR1cCh3LT5uYW1lLCAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWRnZXRfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bmFtZSA9IHdpZGdldF9uYW1lOworCWRlY19hZGNfbXV4X25hbWUgPSBzdHJzZXAoJndpZGdldF9uYW1lLCAiICIpOworCWlmICghZGVjX2FkY19tdXhfbmFtZSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwKKwkJCV9fZnVuY19fLCB3LT5uYW1lKTsKKwkJcmV0ID0gIC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlkZWNfYWRjX211eF9uYW1lID0gd2lkZ2V0X25hbWU7CisKKwlkZWMgPSBzdHJwYnJrKGRlY19hZGNfbXV4X25hbWUsICIwMTIzNDU2NzgiKTsKKwlpZiAoIWRlYykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZGVjaW1hdG9yIGluZGV4IG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gIC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGtzdHJ0b3VpbnQoZGVjLCAxMCwgJmRlY2ltYXRvcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgd25hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMoKTogd2lkZ2V0ID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAorCQkJdy0+bmFtZSwgZGVjaW1hdG9yKTsKKworCXR4X3ZvbF9jdGxfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ1RMICsgMTYgKiBkZWNpbWF0b3I7CisJaHBmX2dhdGVfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMiArIDE2ICogZGVjaW1hdG9yOworCWRlY19jZmdfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogZGVjaW1hdG9yOworCXR4X2dhaW5fY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1RYMF9UWF9WT0xfQ1RMICsgMTYgKiBkZWNpbWF0b3I7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJYW1pY19uID0gdGFzaGFfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBkZWNpbWF0b3IpOworCQlpZiAoYW1pY19uKQorCQkJcHdyX2xldmVsX3JlZyA9IHRhc2hhX2NvZGVjX2dldF9hbWljX3B3bHZsX3JlZyhjb2RlYywKKwkJCQkJCQkJICAgICAgIGFtaWNfbik7CisKKwkJaWYgKHB3cl9sZXZlbF9yZWcpIHsKKwkJCXN3aXRjaCAoKHNuZF9zb2NfcmVhZChjb2RlYywgcHdyX2xldmVsX3JlZykgJgorCQkJCQkgICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLKSA+PgorCQkJCQkgICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVCkgeworCQkJY2FzZSBXQ0Q5MzM1X0FNSUNfUFdSX0xFVkVMX0xQOgorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAorCQkJCQkJICAgIFdDRDkzMzVfREVDX1BXUl9MVkxfTUFTSywKKwkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0xQKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBXQ0Q5MzM1X0FNSUNfUFdSX0xFVkVMX0hQOgorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAorCQkJCQkJICAgIFdDRDkzMzVfREVDX1BXUl9MVkxfTUFTSywKKwkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0hQKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0NEOTMzNV9BTUlDX1BXUl9MRVZFTF9ERUZBVUxUOgorCQkJZGVmYXVsdDoKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKKwkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX01BU0ssCisJCQkJCQkgICAgV0NEOTMzNV9ERUNfUFdSX0xWTF9ERik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaHBmX2N1dF9vZmZfZnJlcSA9IChzbmRfc29jX3JlYWQoY29kZWMsIGRlY19jZmdfcmVnKSAmCisJCQkJICAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLKSA+PiA1OworCQl0YXNoYS0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxID0KKwkJCQkJCQlocGZfY3V0X29mZl9mcmVxOworCisJCWlmIChocGZfY3V0X29mZl9mcmVxICE9IENGX01JTl8zREJfMTUwSFopCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKKwkJCQkJICAgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSywKKwkJCQkJICAgIENGX01JTl8zREJfMTUwSFogPDwgNSk7CisJCS8qIEVuYWJsZSBUWCBQR0EgTXV0ZSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgxMCk7CisJCS8qIEVuYWJsZSBBUEMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsIDB4MDgsIDB4MDgpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBmX2dhdGVfcmVnLCAweDAxLCAweDAwKTsKKworCQlpZiAoZGVjaW1hdG9yID09IDApIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAweDgzKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAweEEzKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAweDgzKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAweDAzKTsKKwkJfQorCQkvKiBzY2hlZHVsZSB3b3JrIHF1ZXVlIHRvIFJlbW92ZSBNdXRlICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdGFzaGEtPnR4X211dGVfZHdvcmtbZGVjaW1hdG9yXS5kd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKHR4X3VubXV0ZV9kZWxheSkpOworCQlpZiAodGFzaGEtPnR4X2hwZl93b3JrW2RlY2ltYXRvcl0uaHBmX2N1dF9vZmZfZnJlcSAhPQorCQkJCQkJCUNGX01JTl8zREJfMTUwSFopCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoCisJCQkJCSZ0YXNoYS0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5kd29yaywKKwkJCQkJbXNlY3NfdG9famlmZmllcygzMDApKTsKKwkJLyogYXBwbHkgZ2FpbiBhZnRlciBkZWNpbWF0b3IgaXMgZW5hYmxlZCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCB0eF9nYWluX2N0bF9yZWcsCisJCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIHR4X2dhaW5fY3RsX3JlZykpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlocGZfY3V0X29mZl9mcmVxID0KKwkJCXRhc2hhLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmhwZl9jdXRfb2ZmX2ZyZXE7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDEwLCAweDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsIDB4MDgsIDB4MDApOworCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAorCQkgICAgJnRhc2hhLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmR3b3JrKSkgeworCQkJaWYgKGhwZl9jdXRfb2ZmX2ZyZXEgIT0gQ0ZfTUlOXzNEQl8xNTBIWikgeworCQkJCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCB0cnVlKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKKwkJCQkJCSAgICBUWF9IUEZfQ1VUX09GRl9GUkVRX01BU0ssCisJCQkJCQkgICAgaHBmX2N1dF9vZmZfZnJlcSA8PCA1KTsKKwkJCQl0YXNoYV9jb2RlY192b3RlX21heF9idyhjb2RlYywgZmFsc2UpOworCQkJfQorCQl9CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKKwkJCQkmdGFzaGEtPnR4X211dGVfZHdvcmtbZGVjaW1hdG9yXS5kd29yayk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgwMCk7CisJCWJyZWFrOworCX07CitvdXQ6CisJa2ZyZWUod25hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdGFzaGFfZ2V0X2RtaWNfc2FtcGxlX3JhdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXVuc2lnbmVkIGludCBkbWljLCBzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEpCit7CisJdTggdHhfc3RyZWFtX2ZzOworCXU4IGFkY19tdXhfaW5kZXggPSAwLCBhZGNfbXV4X3NlbCA9IDA7CisJYm9vbCBkZWNfZm91bmQgPSBmYWxzZTsKKwl1MTYgYWRjX211eF9jdGxfcmVnLCB0eF9mc19yZWc7CisJdTMyIGRtaWNfZnM7CisKKwl3aGlsZSAoZGVjX2ZvdW5kID09IDAgJiYgYWRjX211eF9pbmRleCA8IFdDRDkzMzVfTUFYX1ZBTElEX0FEQ19NVVgpIHsKKwkJaWYgKGFkY19tdXhfaW5kZXggPCA0KSB7CisJCQlhZGNfbXV4X2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgKworCQkJCQkJKGFkY19tdXhfaW5kZXggKiAyKTsKKwkJCWFkY19tdXhfc2VsID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfY3RsX3JlZykgJgorCQkJCQkJMHg3OCkgPj4gMykgLSAxOworCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPCA5KSB7CisJCQlhZGNfbXV4X2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAgKworCQkJCQkJKChhZGNfbXV4X2luZGV4IC0gNCkgKiAxKTsKKwkJCWFkY19tdXhfc2VsID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfY3RsX3JlZykgJgorCQkJCQkJMHgzOCkgPj4gMykgLSAxOworCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPT0gOSkgeworCQkJKythZGNfbXV4X2luZGV4OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFkY19tdXhfc2VsID09IGRtaWMpCisJCQlkZWNfZm91bmQgPSB0cnVlOworCQllbHNlCisJCQkrK2FkY19tdXhfaW5kZXg7CisJfQorCisJaWYgKGRlY19mb3VuZCA9PSB0cnVlICYmIGFkY19tdXhfaW5kZXggPD0gOCkgeworCQl0eF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKyAoMTYgKiBhZGNfbXV4X2luZGV4KTsKKwkJdHhfc3RyZWFtX2ZzID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9mc19yZWcpICYgMHgwRjsKKwkJZG1pY19mcyA9IHR4X3N0cmVhbV9mcyA8PSA0ID8gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzJQNE1IWiA6CisJCQkJCVdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDhNSFo7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIEVDUFAgcGF0aCBzZWxlY3Rpb24gYW5kIERFQzEgbm90IGNvbm5lY3RlZCB0bworCQkgKiBhbnkgb3RoZXIgYXVkaW8gcGF0aCB0byBhcHBseSBFQ1BQIERNSUMgc2FtcGxlIHJhdGUKKwkJICovCisJCWlmICgoYWRjX211eF9pbmRleCA9PSAxKSAmJgorCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1VTX0VDX01VWF9DRkcpCisJCQkJICAgJiAweDBGKSA9PSAweDBBKSAmJgorCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCkKKwkJCQkgICAmIDB4MEMpID09IDB4MDApKSB7CisJCQlkbWljX2ZzID0gcGRhdGEtPmVjcHBfZG1pY19zYW1wbGVfcmF0ZTsKKwkJfQorCX0gZWxzZSB7CisJCWRtaWNfZnMgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKKwl9CisKKwlyZXR1cm4gZG1pY19mczsKK30KKworc3RhdGljIHU4IHRhc2hhX2dldF9kbWljX2Nsa192YWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSB1MzIgbWNsa19yYXRlLCB1MzIgZG1pY19jbGtfcmF0ZSkKK3sKKwl1MzIgZGl2X2ZhY3RvcjsKKwl1OCBkbWljX2N0bF92YWw7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogbWNsa19yYXRlID0gJWQsIGRtaWNfc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIG1jbGtfcmF0ZSwgZG1pY19jbGtfcmF0ZSk7CisKKwkvKiBEZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yICovCisJaWYgKG1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS185UDZNSFopCisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzI7CisJZWxzZQorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl8zOworCisJaWYgKGRtaWNfY2xrX3JhdGUgPT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGRtaWNfc2FtcGxlX3JhdGUgY2Fubm90IGJlIDBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkaXZfZmFjdG9yID0gbWNsa19yYXRlIC8gZG1pY19jbGtfcmF0ZTsKKwlzd2l0Y2ggKGRpdl9mYWN0b3IpIHsKKwljYXNlIDI6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl80OworCQlicmVhazsKKwljYXNlIDY6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzY7CisJCWJyZWFrOworCWNhc2UgODoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBkaXZfZmFjdG9yICV1LCBjbGtfcmF0ZSgldSksIGRtaWNfcmF0ZSgldSlcbiIsCisJCQlfX2Z1bmNfXywgZGl2X2ZhY3RvciwgbWNsa19yYXRlLCBkbWljX2Nsa19yYXRlKTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCXJldHVybiBkbWljX2N0bF92YWw7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2FkYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQ6JWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQoY29kZWMsIHctPnJlZywgdHJ1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9kbWljKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJdTggIGRtaWNfY2xrX2VuID0gMHgwMTsKKwl1MTYgZG1pY19jbGtfcmVnOworCXMzMiAqZG1pY19jbGtfY250OworCXU4IGRtaWNfcmF0ZV92YWwsIGRtaWNfcmF0ZV9zaGlmdCA9IDE7CisJdW5zaWduZWQgaW50IGRtaWM7CisJdTMyIGRtaWNfc2FtcGxlX3JhdGU7CisJaW50IHJldDsKKwljaGFyICp3bmFtZTsKKworCXduYW1lID0gc3RycGJyayh3LT5uYW1lLCAiMDEyMzQ1Iik7CisJaWYgKCF3bmFtZSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogd2lkZ2V0IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBrc3RydG91aW50KHduYW1lLCAxMCwgJmRtaWMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgbGluZSBvbiB0aGUgY29kZWNcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZG1pYykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfMF8xX2Nsa19jbnQpOworCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMF9DVEw7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDM6CisJCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfMl8zX2Nsa19jbnQpOworCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEw7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfNF81X2Nsa19jbnQpOworCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMl9DVEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgU2VsZWN0aW9uXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBldmVudCAlZCBETUlDJWQgZG1pY19jbGtfY250ICVkXG4iLAorCQkJX19mdW5jX18sIGV2ZW50LCAgZG1pYywgKmRtaWNfY2xrX2NudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJZG1pY19zYW1wbGVfcmF0ZSA9IHRhc2hhX2dldF9kbWljX3NhbXBsZV9yYXRlKGNvZGVjLCBkbWljLAorCQkJCQkJcGRhdGEpOworCQlkbWljX3JhdGVfdmFsID0KKwkJCXRhc2hhX2dldF9kbWljX2Nsa192YWwoY29kZWMsCisJCQkJCXBkYXRhLT5tY2xrX3JhdGUsCisJCQkJCWRtaWNfc2FtcGxlX3JhdGUpOworCisJCSgqZG1pY19jbGtfY250KSsrOworCQlpZiAoKmRtaWNfY2xrX2NudCA9PSAxKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJMHgwNyA8PCBkbWljX3JhdGVfc2hpZnQsCisJCQkJZG1pY19yYXRlX3ZhbCA8PCBkbWljX3JhdGVfc2hpZnQpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAorCQkJCQlkbWljX2Nsa19lbiwgZG1pY19jbGtfZW4pOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWRtaWNfcmF0ZV92YWwgPQorCQkJdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbChjb2RlYywKKwkJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQkJcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlKTsKKwkJKCpkbWljX2Nsa19jbnQpLS07CisJCWlmICgqZG1pY19jbGtfY250ICA9PSAwKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJCWRtaWNfY2xrX2VuLCAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKKwkJCQkweDA3IDw8IGRtaWNfcmF0ZV9zaGlmdCwKKwkJCQlkbWljX3JhdGVfdmFsIDw8IGRtaWNfcmF0ZV9zaGlmdCk7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCWludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IG1pY2JfbnVtOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHduYW1lOiAlcywgZXZlbnQ6ICVkXG4iLAorCQlfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTMSIsIHNpemVvZigiTUlDIEJJQVMxIikpKQorCQltaWNiX251bSA9IE1JQ19CSUFTXzE7CisJZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpCisJCW1pY2JfbnVtID0gTUlDX0JJQVNfMjsKKwllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzMiLCBzaXplb2YoIk1JQyBCSUFTMyIpKSkKKwkJbWljYl9udW0gPSBNSUNfQklBU18zOworCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTNCIsIHNpemVvZigiTUlDIEJJQVM0IikpKQorCQltaWNiX251bSA9IE1JQ19CSUFTXzQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkvKgorCQkgKiBNSUMgQklBUyBjYW4gYWxzbyBiZSByZXF1ZXN0ZWQgYnkgTUJIQywKKwkJICogc28gdXNlIHJlZiBjb3VudCB0byBoYW5kbGUgbWljYmlhcyBwdWxsdXAKKwkJICogYW5kIGVuYWJsZSByZXF1ZXN0cworCQkgKi8KKwkJdGFzaGFfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgTUlDQl9FTkFCTEUsIHRydWUpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogd2FpdCBmb3IgY25wIHRpbWUgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdGFzaGFfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgTUlDQl9ESVNBQkxFLCB0cnVlKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2xkb19oX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKKwkJdGFzaGEtPmxkb19oX3VzZXJzKys7CisKKwkJaWYgKHRhc2hhLT5sZG9faF91c2VycyA9PSAxKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9MRE9IX01PREUsCisJCQkJCSAgICAweDgwLCAweDgwKTsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJdGFzaGEtPmxkb19oX3VzZXJzLS07CisKKwkJaWYgKHRhc2hhLT5sZG9faF91c2VycyA8IDApCisJCQl0YXNoYS0+bGRvX2hfdXNlcnMgPSAwOworCisJCWlmICh0YXNoYS0+bGRvX2hfdXNlcnMgPT0gMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTERPSF9NT0RFLAorCQkJCQkgICAgMHg4MCwgMHgwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZm9yY2VfZW5hYmxlX2xkb19oKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7CisJCXRhc2hhX2NvZGVjX2xkb19oX2NvbnRyb2wodywgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdGFzaGFfY29kZWNfbGRvX2hfY29udHJvbCh3LCBldmVudCk7CisJCXdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyh0YXNoYS0+cmVzbWdyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgIGludCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7CisJCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgdHJ1ZSk7CisJCXJldCA9IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOworCQkvKiBXYWl0IGZvciAxbXMgZm9yIGJldHRlciBjbnAgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJldCA9IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKKwkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhc2hhLT5yZXNtZ3IpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXJldHVybiBfX3Rhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzKHcsIGV2ZW50KTsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9sZG9faChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgICBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoZW5hYmxlKQorCQlyYyA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAorCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkJREFQTV9MRE9fSF9TVEFOREFMT05FKTsKKwllbHNlCisJCXJjID0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKAorCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkJREFQTV9MRE9fSF9TVEFOREFMT05FKTsKKworCWlmICghcmMpCisJCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKKwllbHNlCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBsZG9faCBmb3JjZSAlcyBwaW4gZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIChlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIikpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogdGFzaGFfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyAtIGVuYWJsZSBtaWNiaWFzIHN0YW5kYWxvbmUKKyAqIEBjb2RlYzogcG9pbnRlciB0byBjb2RlYyBpbnN0YW5jZQorICogQG1pY2JfbnVtOiBudW1iZXIgb2YgbWljYmlhcyB0byBiZSBlbmFibGVkCisgKiBAZW5hYmxlOiB0cnVlIHRvIGVuYWJsZSBtaWNiaWFzIG9yIGZhbHNlIHRvIGRpc2FibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIG1pY2JpYXMgKDEsIDIsIDMgb3IgNCkgZHVyaW5nCisgKiBzdGFuZGFsb25lIGluZGVwZW5kZW50IG9mIHdoZXRoZXIgVFggdXNlLWNhc2UgaXMgcnVubmluZyBvciBub3QKKyAqCisgKiBSZXR1cm46IGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIG9yIDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zdGFuZGFsb25lX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgIGludCBtaWNiX251bSwKKwkJCQkJICBib29sIGVuYWJsZSkKK3sKKwljb25zdCBjaGFyICogY29uc3QgbWljYl9uYW1lc1tdID0geworCQlEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIERBUE1fTUlDQklBUzJfU1RBTkRBTE9ORSwKKwkJREFQTV9NSUNCSUFTM19TVEFOREFMT05FLCBEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUKKwl9OworCWludCBtaWNiX2luZGV4ID0gbWljYl9udW0gLSAxOworCWludCByYzsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogQ29kZWMgbWVtb3J5IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChtaWNiX2luZGV4IDwgMCkgfHwgKG1pY2JfaW5kZXggPiBUQVNIQV9NQVhfTUlDQklBUyAtIDEpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1pY2JpYXMgaW5kZXgsIG1pY2JfaW5kOiVkXG4iLAorCQkJX19mdW5jX18sIG1pY2JfaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZW5hYmxlKQorCQlyYyA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAorCQkJCQkJIHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAorCQkJCQkJICAgbWljYl9uYW1lc1ttaWNiX2luZGV4XSk7CisJZWxzZQorCQlyYyA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkJICAgICAgbWljYl9uYW1lc1ttaWNiX2luZGV4XSk7CisKKwlpZiAoIXJjKQorCQlzbmRfc29jX2RhcG1fc3luYyhzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSk7CisJZWxzZQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWljYmlhcyVkIGZvcmNlICVzIHBpbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgbWljYl9udW0sIChlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIikpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhc2hhX2FuY19mdW5jX3RleHRbXSA9IHsiT0ZGIiwgIk9OIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2FuY19mdW5jX2VudW0gPQorCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHRhc2hhX2FuY19mdW5jX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFzaGFfY2xrbW9kZV90ZXh0W10gPSB7IkVYVEVSTkFMIiwgIklOVEVSTkFMIn07CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRhc2hhX2Nsa21vZGVfZW51bSwgdGFzaGFfY2xrbW9kZV90ZXh0KTsKKworLyogQ3V0b2ZmIGZyZXF1ZW5jeSBmb3IgaGlnaCBwYXNzIGZpbHRlciAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZl90ZXh0W10gPSB7CisJIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9jZl90ZXh0W10gPSB7CisJIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIiwKKwkiQ0ZfTkVHXzNEQl8wUDQ4SFoiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzBfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzZfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzdfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDBfMV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQwXzJfZW51bSwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJICAgICByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQxXzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MV8yX2VudW0sIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsIDIsCisJCSAgICAgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50Ml8xX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDJfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAyLAorCQkgICAgIHJ4X2NmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDNfMV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQzXzJfZW51bSwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJICAgICByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQ0XzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50NF8yX2VudW0sIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsIDIsCisJCSAgICAgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50NV8xX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDVfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ0ZHLCAyLAorCQkgICAgIHJ4X2NmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDZfMV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ2XzJfZW51bSwgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJICAgICByeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQ3XzFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50N18yX2VudW0sIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsIDIsCisJCSAgICAgcnhfY2ZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50OF8xX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDhfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAyLAorCQkgICAgIHJ4X2NmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19pMnNfbWFwW10gPSB7CisJeyJTTElNIFJYMCBNVVgiLCBOVUxMLCAiUlhfSTJTX0NUTCJ9LAorCXsiU0xJTSBSWDEgTVVYIiwgTlVMTCwgIlJYX0kyU19DVEwifSwKKwl7IlNMSU0gUlgyIE1VWCIsIE5VTEwsICJSWF9JMlNfQ1RMIn0sCisJeyJTTElNIFJYMyBNVVgiLCBOVUxMLCAiUlhfSTJTX0NUTCJ9LAorCisJeyJTTElNIFRYNiBNVVgiLCBOVUxMLCAiVFhfSTJTX0NUTCJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgTlVMTCwgIlRYX0kyU19DVEwifSwKKwl7IlNMSU0gVFg4IE1VWCIsIE5VTEwsICJUWF9JMlNfQ1RMIn0sCisJeyJTTElNIFRYMTEgTVVYIiwgTlVMTCwgIlRYX0kyU19DVEwifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcFtdID0geworCisJLyogTUFEICovCisJeyJNQURfU0VMIE1VWCIsICJTUEUiLCAiTUFEX0NQRV9JTlBVVCJ9LAorCXsiTUFEX1NFTCBNVVgiLCAiTVNNIiwgIk1BRElOUFVUIn0sCisJeyJNQURPTk9GRiIsICJTd2l0Y2giLCAiTUFEX1NFTCBNVVgifSwKKwl7Ik1BRF9CUk9BRENBU1QiLCAiU3dpdGNoIiwgIk1BRF9TRUwgTVVYIn0sCisJeyJUWDEzIElOUCBNVVgiLCAiQ1BFX1RYX1BQIiwgIk1BRE9OT0ZGIn0sCisKKwkvKiBDUEUgSFcgTUFEIGJ5cGFzcyAqLworCXsiQ1BFIElOIE1peGVyIiwgIk1BRF9CWVBBU1MiLCAiU0xJTSBUWDEgTVVYIn0sCisKKwl7IkFJRjRfTUFEIE1peGVyIiwgIlNMSU0gVFgxIiwgIkNQRSBJTiBNaXhlciJ9LAorCXsiQUlGNF9NQUQgTWl4ZXIiLCAiU0xJTSBUWDEyIiwgIk1BRE9OT0ZGIn0sCisJeyJBSUY0X01BRCBNaXhlciIsICJTTElNIFRYMTMiLCAiVFgxMyBJTlAgTVVYIn0sCisJeyJBSUY0IE1BRCIsIE5VTEwsICJBSUY0X01BRCBNaXhlciJ9LAorCXsiQUlGNCBNQUQiLCBOVUxMLCAiQUlGNCJ9LAorCisJeyJFQyBCVUYgTVVYIElOUCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJBSUY1IENQRSIsIE5VTEwsICJFQyBCVUYgTVVYIElOUCJ9LAorCisJLyogU0xJTUJVUyBDb25uZWN0aW9ucyAqLworCXsiQUlGMSBDQVAiLCBOVUxMLCAiQUlGMV9DQVAgTWl4ZXIifSwKKwl7IkFJRjIgQ0FQIiwgTlVMTCwgIkFJRjJfQ0FQIE1peGVyIn0sCisJeyJBSUYzIENBUCIsIE5VTEwsICJBSUYzX0NBUCBNaXhlciJ9LAorCisJLyogVkkgRmVlZGJhY2sgKi8KKwl7IkFJRjRfVkkgTWl4ZXIiLCAiU1BLUl9WSV8xIiwgIlZJSU5QVVQifSwKKwl7IkFJRjRfVkkgTWl4ZXIiLCAiU1BLUl9WSV8yIiwgIlZJSU5QVVQifSwKKwl7IkFJRjQgVkkiLCBOVUxMLCAiQUlGNF9WSSBNaXhlciJ9LAorCisJLyogU0xJTV9NSVhFUigiQUlGMV9DQVAgTWl4ZXIiKSwqLworCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDAiLCAiU0xJTSBUWDAgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMSIsICJTTElNIFRYMSBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNCIsICJTTElNIFRYNCBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1IE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNyIsICJTTElNIFRYNyBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4IE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkgTVVYIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMTAiLCAiU0xJTSBUWDEwIE1VWCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDExIiwgIlNMSU0gVFgxMSBNVVgifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMyIsICJUWDEzIElOUCBNVVgifSwKKwkvKiBTTElNX01JWEVSKCJBSUYyX0NBUCBNaXhlciIpLCovCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMCIsICJTTElNIFRYMCBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDIiLCAiU0xJTSBUWDIgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0IE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDUiLCAiU0xJTSBUWDUgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3IE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDgiLCAiU0xJTSBUWDggTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSBNVVgifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAgTVVYIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMTEiLCAiU0xJTSBUWDExIE1VWCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlRYMTMgSU5QIE1VWCJ9LAorCS8qIFNMSU1fTUlYRVIoIkFJRjNfQ0FQIE1peGVyIiksKi8KKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgwIiwgIlNMSU0gVFgwIE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgzIiwgIlNMSU0gVFgzIE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg2IiwgIlNMSU0gVFg2IE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg5IiwgIlNMSU0gVFg5IE1VWCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCBNVVgifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMSIsICJTTElNIFRYMTEgTVVYIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMTMiLCAiVFgxMyBJTlAgTVVYIn0sCisKKwl7IlNMSU0gVFgwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJTTElNIFRYMCBNVVgiLCAiUlhfTUlYX1RYMCIsICJSWCBNSVggVFgwIE1VWCJ9LAorCXsiU0xJTSBUWDAgTVVYIiwgIkRFQzBfMTkyIiwgIkFEQyBVUyBNVVgwIn0sCisKKwl7IlNMSU0gVFgxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJTTElNIFRYMSBNVVgiLCAiUlhfTUlYX1RYMSIsICJSWCBNSVggVFgxIE1VWCJ9LAorCXsiU0xJTSBUWDEgTVVYIiwgIkRFQzFfMTkyIiwgIkFEQyBVUyBNVVgxIn0sCisKKwl7IlNMSU0gVFgyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCisJeyJTTElNIFRYMiBNVVgiLCAiUlhfTUlYX1RYMiIsICJSWCBNSVggVFgyIE1VWCJ9LAorCXsiU0xJTSBUWDIgTVVYIiwgIkRFQzJfMTkyIiwgIkFEQyBVUyBNVVgyIn0sCisKKwl7IlNMSU0gVFgzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJTTElNIFRYMyBNVVgiLCAiUlhfTUlYX1RYMyIsICJSWCBNSVggVFgzIE1VWCJ9LAorCXsiU0xJTSBUWDMgTVVYIiwgIkRFQzNfMTkyIiwgIkFEQyBVUyBNVVgzIn0sCisKKwl7IlNMSU0gVFg0IE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJTTElNIFRYNCBNVVgiLCAiUlhfTUlYX1RYNCIsICJSWCBNSVggVFg0IE1VWCJ9LAorCXsiU0xJTSBUWDQgTVVYIiwgIkRFQzRfMTkyIiwgIkFEQyBVUyBNVVg0In0sCisKKwl7IlNMSU0gVFg1IE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJTTElNIFRYNSBNVVgiLCAiUlhfTUlYX1RYNSIsICJSWCBNSVggVFg1IE1VWCJ9LAorCXsiU0xJTSBUWDUgTVVYIiwgIkRFQzVfMTkyIiwgIkFEQyBVUyBNVVg1In0sCisKKwl7IlNMSU0gVFg2IE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJTTElNIFRYNiBNVVgiLCAiUlhfTUlYX1RYNiIsICJSWCBNSVggVFg2IE1VWCJ9LAorCXsiU0xJTSBUWDYgTVVYIiwgIkRFQzZfMTkyIiwgIkFEQyBVUyBNVVg2In0sCisKKwl7IlNMSU0gVFg3IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJTTElNIFRYNyBNVVgiLCAiUlhfTUlYX1RYNyIsICJSWCBNSVggVFg3IE1VWCJ9LAorCXsiU0xJTSBUWDcgTVVYIiwgIkRFQzdfMTkyIiwgIkFEQyBVUyBNVVg3In0sCisKKwl7IlNMSU0gVFg4IE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCisJeyJTTElNIFRYOCBNVVgiLCAiUlhfTUlYX1RYOCIsICJSWCBNSVggVFg4IE1VWCJ9LAorCXsiU0xJTSBUWDggTVVYIiwgIkRFQzhfMTkyIiwgIkFEQyBVUyBNVVg4In0sCisKKwl7IlNMSU0gVFg5IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJTTElNIFRYOSBNVVgiLCAiREVDN18xOTIiLCAiQURDIFVTIE1VWDcifSwKKwl7IlNMSU0gVFgxMCBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiU0xJTSBUWDEwIE1VWCIsICJERUM2XzE5MiIsICJBREMgVVMgTVVYNiJ9LAorCisJeyJTTElNIFRYMTEgTVVYIiwgIkRFQ18wXzUiLCAiU0xJTSBUWDExIElOUDEgTVVYIn0sCisJeyJTTElNIFRYMTEgTVVYIiwgIkRFQ185XzEyIiwgIlNMSU0gVFgxMSBJTlAxIE1VWCJ9LAorCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKKwl7IlNMSU0gVFgxMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJTTElNIFRYMTEgSU5QMSBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKKwl7IlNMSU0gVFgxMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJTTElNIFRYMTEgSU5QMSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIlJYX01JWF9UWDUiLCAiUlggTUlYIFRYNSBNVVgifSwKKworCXsiVFgxMyBJTlAgTVVYIiwgIk1BRF9CUkRDU1QiLCAiTUFEX0JST0FEQ0FTVCJ9LAorCXsiVFgxMyBJTlAgTVVYIiwgIkNEQ19ERUNfNSIsICJTTElNIFRYMTMgTVVYIn0sCisJeyJTTElNIFRYMTMgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKKworCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAorCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCisKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKKworCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAorCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCisKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKKworCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAorCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCisKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKKworCXsiQURDIFVTIE1VWDAiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgwIn0sCisJeyJBREMgVVMgTVVYMSIsICJVU19Td2l0Y2giLCAiQURDIE1VWDEifSwKKwl7IkFEQyBVUyBNVVgyIiwgIlVTX1N3aXRjaCIsICJBREMgTVVYMiJ9LAorCXsiQURDIFVTIE1VWDMiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgzIn0sCisJeyJBREMgVVMgTVVYNCIsICJVU19Td2l0Y2giLCAiQURDIE1VWDQifSwKKwl7IkFEQyBVUyBNVVg1IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYNSJ9LAorCXsiQURDIFVTIE1VWDYiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg2In0sCisJeyJBREMgVVMgTVVYNyIsICJVU19Td2l0Y2giLCAiQURDIE1VWDcifSwKKwl7IkFEQyBVUyBNVVg4IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYOCJ9LAorCXsiQURDIE1VWDAiLCAiRE1JQyIsICJETUlDIE1VWDAifSwKKwl7IkFEQyBNVVgwIiwgIkFNSUMiLCAiQU1JQyBNVVgwIn0sCisJeyJBREMgTVVYMSIsICJETUlDIiwgIkRNSUMgTVVYMSJ9LAorCXsiQURDIE1VWDEiLCAiQU1JQyIsICJBTUlDIE1VWDEifSwKKwl7IkFEQyBNVVgyIiwgIkRNSUMiLCAiRE1JQyBNVVgyIn0sCisJeyJBREMgTVVYMiIsICJBTUlDIiwgIkFNSUMgTVVYMiJ9LAorCXsiQURDIE1VWDMiLCAiRE1JQyIsICJETUlDIE1VWDMifSwKKwl7IkFEQyBNVVgzIiwgIkFNSUMiLCAiQU1JQyBNVVgzIn0sCisJeyJBREMgTVVYNCIsICJETUlDIiwgIkRNSUMgTVVYNCJ9LAorCXsiQURDIE1VWDQiLCAiQU1JQyIsICJBTUlDIE1VWDQifSwKKwl7IkFEQyBNVVg1IiwgIkRNSUMiLCAiRE1JQyBNVVg1In0sCisJeyJBREMgTVVYNSIsICJBTUlDIiwgIkFNSUMgTVVYNSJ9LAorCXsiQURDIE1VWDYiLCAiRE1JQyIsICJETUlDIE1VWDYifSwKKwl7IkFEQyBNVVg2IiwgIkFNSUMiLCAiQU1JQyBNVVg2In0sCisJeyJBREMgTVVYNyIsICJETUlDIiwgIkRNSUMgTVVYNyJ9LAorCXsiQURDIE1VWDciLCAiQU1JQyIsICJBTUlDIE1VWDcifSwKKwl7IkFEQyBNVVg4IiwgIkRNSUMiLCAiRE1JQyBNVVg4In0sCisJeyJBREMgTVVYOCIsICJBTUlDIiwgIkFNSUMgTVVYOCJ9LAorCXsiQURDIE1VWDEwIiwgIkRNSUMiLCAiRE1JQyBNVVgxMCJ9LAorCXsiQURDIE1VWDEwIiwgIkFNSUMiLCAiQU1JQyBNVVgxMCJ9LAorCXsiQURDIE1VWDExIiwgIkRNSUMiLCAiRE1JQyBNVVgxMSJ9LAorCXsiQURDIE1VWDExIiwgIkFNSUMiLCAiQU1JQyBNVVgxMSJ9LAorCXsiQURDIE1VWDEyIiwgIkRNSUMiLCAiRE1JQyBNVVgxMiJ9LAorCXsiQURDIE1VWDEyIiwgIkFNSUMiLCAiQU1JQyBNVVgxMiJ9LAorCXsiQURDIE1VWDEzIiwgIkRNSUMiLCAiRE1JQyBNVVgxMyJ9LAorCXsiQURDIE1VWDEzIiwgIkFNSUMiLCAiQU1JQyBNVVgxMyJ9LAorCisJeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisJeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCisJeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCisJeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCisJeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCisKKwl7IkRNSUMgTVVYMCIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVgwIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDAiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYMCIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVgwIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDAiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYMCIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYMCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMCIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYMCIsICJBREM0IiwgIkFEQzQifSwKKwl7IkFNSUMgTVVYMCIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFNSUMgTVVYMCIsICJBREM2IiwgIkFEQzYifSwKKworCXsiRE1JQyBNVVgxIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDEiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYMSIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVgxIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDEiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYMSIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzQiLCAiQURDNCJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzUiLCAiQURDNSJ9LAorCXsiQU1JQyBNVVgxIiwgIkFEQzYiLCAiQURDNiJ9LAorCisJeyJETUlDIE1VWDIiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYMiIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVgyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDIiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYMiIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVgyIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDIiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDIiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDIiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDIiLCAiQURDNCIsICJBREM0In0sCisJeyJBTUlDIE1VWDIiLCAiQURDNSIsICJBREM1In0sCisJeyJBTUlDIE1VWDIiLCAiQURDNiIsICJBREM2In0sCisKKwl7IkRNSUMgTVVYMyIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVgzIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDMiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYMyIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVgzIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDMiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYMyIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYMyIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMyIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYMyIsICJBREM0IiwgIkFEQzQifSwKKwl7IkFNSUMgTVVYMyIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFNSUMgTVVYMyIsICJBREM2IiwgIkFEQzYifSwKKworCXsiRE1JQyBNVVg0IiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDQiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYNCIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVg0IiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDQiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYNCIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzQiLCAiQURDNCJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzUiLCAiQURDNSJ9LAorCXsiQU1JQyBNVVg0IiwgIkFEQzYiLCAiQURDNiJ9LAorCisJeyJETUlDIE1VWDUiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYNSIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVg1IiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDUiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYNSIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVg1IiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDUiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDUiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDUiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDUiLCAiQURDNCIsICJBREM0In0sCisJeyJBTUlDIE1VWDUiLCAiQURDNSIsICJBREM1In0sCisJeyJBTUlDIE1VWDUiLCAiQURDNiIsICJBREM2In0sCisKKwl7IkRNSUMgTVVYNiIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVg2IiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDYiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYNiIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVg2IiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDYiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYNiIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYNiIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYNiIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYNiIsICJBREM0IiwgIkFEQzQifSwKKwl7IkFNSUMgTVVYNiIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFNSUMgTVVYNiIsICJBREM2IiwgIkFEQzYifSwKKworCXsiRE1JQyBNVVg3IiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDciLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYNyIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVg3IiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDciLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYNyIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzQiLCAiQURDNCJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzUiLCAiQURDNSJ9LAorCXsiQU1JQyBNVVg3IiwgIkFEQzYiLCAiQURDNiJ9LAorCisJeyJETUlDIE1VWDgiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYOCIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVg4IiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDgiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYOCIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVg4IiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDgiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDgiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDgiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDgiLCAiQURDNCIsICJBREM0In0sCisJeyJBTUlDIE1VWDgiLCAiQURDNSIsICJBREM1In0sCisJeyJBTUlDIE1VWDgiLCAiQURDNiIsICJBREM2In0sCisKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYMTAiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYMTAiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDEwIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVgxMCIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYMTAiLCAiQURDNCIsICJBREM0In0sCisJeyJBTUlDIE1VWDEwIiwgIkFEQzUiLCAiQURDNSJ9LAorCXsiQU1JQyBNVVgxMCIsICJBREM2IiwgIkFEQzYifSwKKworCXsiRE1JQyBNVVgxMSIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVgxMSIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVgxMSIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVgxMSIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVgxMSIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVgxMSIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVgxMSIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYMTEiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDExIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVgxMSIsICJBREM0IiwgIkFEQzQifSwKKwl7IkFNSUMgTVVYMTEiLCAiQURDNSIsICJBREM1In0sCisJeyJBTUlDIE1VWDExIiwgIkFEQzYiLCAiQURDNiJ9LAorCisJeyJETUlDIE1VWDEyIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDEyIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxMiIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMTIiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDEyIiwgIkFEQzQiLCAiQURDNCJ9LAorCXsiQU1JQyBNVVgxMiIsICJBREM1IiwgIkFEQzUifSwKKwl7IkFNSUMgTVVYMTIiLCAiQURDNiIsICJBREM2In0sCisKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYMTMiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYMTMiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDEzIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVgxMyIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYMTMiLCAiQURDNCIsICJBREM0In0sCisJeyJBTUlDIE1VWDEzIiwgIkFEQzUiLCAiQURDNSJ9LAorCXsiQU1JQyBNVVgxMyIsICJBREM2IiwgIkFEQzYifSwKKwkvKiBBREMgQ29ubmVjdGlvbnMgKi8KKwl7IkFEQzEiLCBOVUxMLCAiQU1JQzEifSwKKwl7IkFEQzIiLCBOVUxMLCAiQU1JQzIifSwKKwl7IkFEQzMiLCBOVUxMLCAiQU1JQzMifSwKKwl7IkFEQzQiLCBOVUxMLCAiQU1JQzQifSwKKwl7IkFEQzUiLCBOVUxMLCAiQU1JQzUifSwKKwl7IkFEQzYiLCBOVUxMLCAiQU1JQzYifSwKKworCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMiJ9LAorCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMCJ9LAorCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMSJ9LAorCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMiJ9LAorCisJeyJSWCBJTlQwIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEifSwKKwl7IlJYIElOVDAgTUlYMiIsIE5VTEwsICJSWCBJTlQwIFNFQyBNSVgifSwKKwl7IlJYIElOVDAgTUlYMiIsIE5VTEwsICJSWCBJTlQwIE1JWDIgSU5QIn0sCisJeyJSWCBJTlQwIElOVEVSUCIsIE5VTEwsICJSWCBJTlQwIE1JWDIifSwKKwl7IlJYIElOVDAgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMCBJTlRFUlAifSwKKwl7IlJYIElOVDAgREFDIiwgTlVMTCwgIlJYIElOVDAgREVNIE1VWCJ9LAorCXsiUlggSU5UMCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiRUFSIFBBIiwgTlVMTCwgIlJYIElOVDAgREFDIn0sCisJeyJFQVIiLCBOVUxMLCAiRUFSIFBBIn0sCisKKwl7IlNQTCBTUkMwIE1VWCIsICJTUkNfSU5fSFBITCIsICJSWCBJTlQxXzEgTUlYMSJ9LAorCXsiUlggSU5UMSBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIn0sCisJeyJSWCBJTlQxIFNQTElORSBNSVgiLCAiSFBITCBTd2l0Y2giLCAiU1BMIFNSQzAgTVVYIn0sCisJeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQxXzEgTUlYMSJ9LAorCXsiUlggSU5UMSBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDFfMSBOQVRJVkUgTVVYIn0sCisJeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQxIE5BVElWRSBTVVBQTFkifSwKKwl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxIFNQTElORSBNSVgifSwKKwl7IlJYIElOVDEgTUlYMiIsIE5VTEwsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIElOVDEgTUlYMiIsIE5VTEwsICJSWCBJTlQxIE1JWDIgSU5QIn0sCisJeyJSWCBJTlQxIElOVEVSUCIsIE5VTEwsICJSWCBJTlQxIE1JWDIifSwKKwl7IlJYIElOVDEgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMSBJTlRFUlAifSwKKwl7IlJYIElOVDEgREFDIiwgTlVMTCwgIlJYIElOVDEgREVNIE1VWCJ9LAorCXsiUlggSU5UMSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiSFBITCBQQSIsIE5VTEwsICJSWCBJTlQxIERBQyJ9LAorCXsiSFBITCIsIE5VTEwsICJIUEhMIFBBIn0sCisKKwl7IlNQTCBTUkMxIE1VWCIsICJTUkNfSU5fSFBIUiIsICJSWCBJTlQyXzEgTUlYMSJ9LAorCXsiUlggSU5UMiBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIn0sCisJeyJSWCBJTlQyIFNQTElORSBNSVgiLCAiSFBIUiBTd2l0Y2giLCAiU1BMIFNSQzEgTVVYIn0sCisJeyJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQyXzEgTUlYMSJ9LAorCXsiUlggSU5UMiBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDJfMSBOQVRJVkUgTVVYIn0sCisJeyJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKKwl7IlJYIElOVDIgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQyIFNQTElORSBNSVgifSwKKwl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJSWCBJTlQyIFNFQyBNSVgifSwKKwl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJSWCBJTlQyIE1JWDIgSU5QIn0sCisJeyJSWCBJTlQyIElOVEVSUCIsIE5VTEwsICJSWCBJTlQyIE1JWDIifSwKKwl7IlJYIElOVDIgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMiBJTlRFUlAifSwKKwl7IlJYIElOVDIgREFDIiwgTlVMTCwgIlJYIElOVDIgREVNIE1VWCJ9LAorCXsiUlggSU5UMiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiSFBIUiBQQSIsIE5VTEwsICJSWCBJTlQyIERBQyJ9LAorCXsiSFBIUiIsIE5VTEwsICJIUEhSIFBBIn0sCisKKwl7IlNQTCBTUkMwIE1VWCIsICJTUkNfSU5fTE8xIiwgIlJYIElOVDNfMSBNSVgxIn0sCisJeyJSWCBJTlQzIFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEifSwKKwl7IlJYIElOVDMgU1BMSU5FIE1JWCIsICJMTzEgU3dpdGNoIiwgIlNQTCBTUkMwIE1VWCJ9LAorCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UM18xIE1JWDEifSwKKwl7IlJYIElOVDMgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQzXzEgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMyBOQVRJVkUgU1VQUExZIn0sCisJeyJSWCBJTlQzIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMyBTUExJTkUgTUlYIn0sCisJeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBTRUMgTUlYIn0sCisJeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBNSVgyIElOUCJ9LAorCXsiUlggSU5UMyBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMyBNSVgyIn0sCisJeyJSWCBJTlQzIERBQyIsIE5VTEwsICJSWCBJTlQzIElOVEVSUCJ9LAorCXsiUlggSU5UMyBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDEgUEEiLCBOVUxMLCAiUlggSU5UMyBEQUMifSwKKwl7IkxJTkVPVVQxIiwgTlVMTCwgIkxJTkVPVVQxIFBBIn0sCisKKwl7IlNQTCBTUkMxIE1VWCIsICJTUkNfSU5fTE8yIiwgIlJYIElOVDRfMSBNSVgxIn0sCisJeyJSWCBJTlQ0IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEifSwKKwl7IlJYIElOVDQgU1BMSU5FIE1JWCIsICJMTzIgU3dpdGNoIiwgIlNQTCBTUkMxIE1VWCJ9LAorCXsiUlggSU5UNF8xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UNF8xIE1JWDEifSwKKwl7IlJYIElOVDQgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzEgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UNF8xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UNCBOQVRJVkUgU1VQUExZIn0sCisJeyJSWCBJTlQ0IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UNCBTUExJTkUgTUlYIn0sCisJeyJSWCBJTlQ0IE1JWDIiLCBOVUxMLCAiUlggSU5UNCBTRUMgTUlYIn0sCisJeyJSWCBJTlQ0IE1JWDIiLCBOVUxMLCAiUlggSU5UNCBNSVgyIElOUCJ9LAorCXsiUlggSU5UNCBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNCBNSVgyIn0sCisJeyJSWCBJTlQ0IERBQyIsIE5VTEwsICJSWCBJTlQ0IElOVEVSUCJ9LAorCXsiUlggSU5UNCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDIgUEEiLCBOVUxMLCAiUlggSU5UNCBEQUMifSwKKwl7IkxJTkVPVVQyIiwgTlVMTCwgIkxJTkVPVVQyIFBBIn0sCisKKwl7IlNQTCBTUkMyIE1VWCIsICJTUkNfSU5fTE8zIiwgIlJYIElOVDVfMSBNSVgxIn0sCisJeyJSWCBJTlQ1IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEifSwKKwl7IlJYIElOVDUgU1BMSU5FIE1JWCIsICJMTzMgU3dpdGNoIiwgIlNQTCBTUkMyIE1VWCJ9LAorCXsiUlggSU5UNSBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDUgU1BMSU5FIE1JWCJ9LAorCXsiUlggSU5UNSBNSVgyIiwgTlVMTCwgIlJYIElOVDUgU0VDIE1JWCJ9LAorCXsiUlggSU5UNSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNSBNSVgyIn0sCisKKwl7IlJYIElOVDUgVkJBVCIsICJMTzMgVkJBVCBFbmFibGUiLCAiUlggSU5UNSBJTlRFUlAifSwKKwl7IlJYIElOVDUgREFDIiwgTlVMTCwgIlJYIElOVDUgVkJBVCJ9LAorCisJeyJSWCBJTlQ1IERBQyIsIE5VTEwsICJSWCBJTlQ1IElOVEVSUCJ9LAorCXsiUlggSU5UNSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDMgUEEiLCBOVUxMLCAiUlggSU5UNSBEQUMifSwKKwl7IkxJTkVPVVQzIiwgTlVMTCwgIkxJTkVPVVQzIFBBIn0sCisKKwl7IlNQTCBTUkMzIE1VWCIsICJTUkNfSU5fTE80IiwgIlJYIElOVDZfMSBNSVgxIn0sCisJeyJSWCBJTlQ2IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEifSwKKwl7IlJYIElOVDYgU1BMSU5FIE1JWCIsICJMTzQgU3dpdGNoIiwgIlNQTCBTUkMzIE1VWCJ9LAorCXsiUlggSU5UNiBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDYgU1BMSU5FIE1JWCJ9LAorCXsiUlggSU5UNiBNSVgyIiwgTlVMTCwgIlJYIElOVDYgU0VDIE1JWCJ9LAorCXsiUlggSU5UNiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNiBNSVgyIn0sCisKKwl7IlJYIElOVDYgVkJBVCIsICJMTzQgVkJBVCBFbmFibGUiLCAiUlggSU5UNiBJTlRFUlAifSwKKwl7IlJYIElOVDYgREFDIiwgTlVMTCwgIlJYIElOVDYgVkJBVCJ9LAorCisJeyJSWCBJTlQ2IERBQyIsIE5VTEwsICJSWCBJTlQ2IElOVEVSUCJ9LAorCXsiUlggSU5UNiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDQgUEEiLCBOVUxMLCAiUlggSU5UNiBEQUMifSwKKwl7IkxJTkVPVVQ0IiwgTlVMTCwgIkxJTkVPVVQ0IFBBIn0sCisKKwl7IlNQTCBTUkMyIE1VWCIsICJTUkNfSU5fU1BLUkwiLCAiUlggSU5UN18xIE1JWDEifSwKKwl7IlJYIElOVDcgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQ3XzEgTUlYMSJ9LAorCXsiUlggSU5UNyBTUExJTkUgTUlYIiwgIlNQS1JMIFN3aXRjaCIsICJTUEwgU1JDMiBNVVgifSwKKwl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ3IFNQTElORSBNSVgifSwKKwl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJSWCBJTlQ3IFNFQyBNSVgifSwKKwl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJSWCBJTlQ3IE1JWDIgSU5QIn0sCisKKwl7IlJYIElOVDcgSU5URVJQIiwgTlVMTCwgIlJYIElOVDcgTUlYMiJ9LAorCisJeyJSWCBJTlQ3IFZCQVQiLCAiU1BLUkwgVkJBVCBFbmFibGUiLCAiUlggSU5UNyBJTlRFUlAifSwKKwl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlggSU5UNyBWQkFUIn0sCisKKwl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlggSU5UNyBJTlRFUlAifSwKKwl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiU1BLMSBPVVQiLCBOVUxMLCAiUlggSU5UNyBDSEFJTiJ9LAorCisJeyJBTkMgU1BLUiBQQSBFbmFibGUiLCAiU3dpdGNoIiwgIlJYIElOVDcgQ0hBSU4ifSwKKwl7IkFOQyBTUEsxIFBBIiwgTlVMTCwgIkFOQyBTUEtSIFBBIEVuYWJsZSJ9LAorCXsiU1BLMSBPVVQiLCBOVUxMLCAiQU5DIFNQSzEgUEEifSwKKworCXsiU1BMIFNSQzMgTVVYIiwgIlNSQ19JTl9TUEtSUiIsICJSWCBJTlQ4XzEgTUlYMSJ9LAorCXsiUlggSU5UOCBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIn0sCisJeyJSWCBJTlQ4IFNQTElORSBNSVgiLCAiU1BLUlIgU3dpdGNoIiwgIlNQTCBTUkMzIE1VWCJ9LAorCXsiUlggSU5UOCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDggU1BMSU5FIE1JWCJ9LAorCXsiUlggSU5UOCBJTlRFUlAiLCBOVUxMLCAiUlggSU5UOCBTRUMgTUlYIn0sCisKKwl7IlJYIElOVDggVkJBVCIsICJTUEtSUiBWQkFUIEVuYWJsZSIsICJSWCBJTlQ4IElOVEVSUCJ9LAorCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWCBJTlQ4IFZCQVQifSwKKworCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWCBJTlQ4IElOVEVSUCJ9LAorCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJTUEsyIE9VVCIsIE5VTEwsICJSWCBJTlQ4IENIQUlOIn0sCisKKwl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9FQVIiLCAiUlggSU5UMCBNSVgyIn0sCisJeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fSFBITCIsICJSWCBJTlQxIE1JWDIifSwKKwl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9MTzEiLCAiUlggSU5UMyBNSVgyIn0sCisJeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fRUFSX1NQS1IiLCAiUlggSU5UNyBNSVgyIn0sCisJeyJBTkMxIEZCIE1VWCIsICJBTkNfSU5fSFBIUiIsICJSWCBJTlQyIE1JWDIifSwKKwl7IkFOQzEgRkIgTVVYIiwgIkFOQ19JTl9MTzIiLCAiUlggSU5UNCBNSVgyIn0sCisKKwl7IkFOQyBIUEhMIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEwIn0sCisJeyJBTkMgSFBITCBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAorCXsiUlggSU5UMSBNSVgyIiwgTlVMTCwgIkFOQyBIUEhMIEVuYWJsZSJ9LAorCisJeyJBTkMgSFBIUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMiJ9LAorCXsiQU5DIEhQSFIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTMifSwKKwl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJBTkMgSFBIUiBFbmFibGUifSwKKworCXsiQU5DIEVBUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMCJ9LAorCXsiQU5DIEVBUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAorCXsiUlggSU5UMCBNSVgyIiwgTlVMTCwgIkFOQyBFQVIgRW5hYmxlIn0sCisKKwl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKKwl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTEifSwKKwl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSJ9LAorCisJeyJBTkMgTElORU9VVDEgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKKwl7IkFOQyBMSU5FT1VUMSBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAorCXsiUlggSU5UMyBNSVgyIiwgTlVMTCwgIkFOQyBMSU5FT1VUMSBFbmFibGUifSwKKworCXsiQU5DIExJTkVPVVQyIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEyIn0sCisJeyJBTkMgTElORU9VVDIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTMifSwKKwl7IlJYIElOVDQgTUlYMiIsIE5VTEwsICJBTkMgTElORU9VVDIgRW5hYmxlIn0sCisKKwl7IkFOQyBFQVIgUEEiLCBOVUxMLCAiUlggSU5UMCBEQUMifSwKKwl7IkFOQyBFQVIiLCBOVUxMLCAiQU5DIEVBUiBQQSJ9LAorCXsiQU5DIEhQSEwgUEEiLCBOVUxMLCAiUlggSU5UMSBEQUMifSwKKwl7IkFOQyBIUEhMIiwgTlVMTCwgIkFOQyBIUEhMIFBBIn0sCisJeyJBTkMgSFBIUiBQQSIsIE5VTEwsICJSWCBJTlQyIERBQyJ9LAorCXsiQU5DIEhQSFIiLCBOVUxMLCAiQU5DIEhQSFIgUEEifSwKKwl7IkFOQyBMSU5FT1VUMSBQQSIsIE5VTEwsICJSWCBJTlQzIERBQyJ9LAorCXsiQU5DIExJTkVPVVQxIiwgTlVMTCwgIkFOQyBMSU5FT1VUMSBQQSJ9LAorCXsiQU5DIExJTkVPVVQyIFBBIiwgTlVMTCwgIlJYIElOVDQgREFDIn0sCisJeyJBTkMgTElORU9VVDIiLCBOVUxMLCAiQU5DIExJTkVPVVQyIFBBIn0sCisKKwkvKiBTTElNX01VWCgiQUlGMV9QQiIsICJBSUYxIFBCIiksKi8KKwl7IlNMSU0gUlgwIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwkvKiBTTElNX01VWCgiQUlGMl9QQiIsICJBSUYyIFBCIiksKi8KKwl7IlNMSU0gUlgwIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKKwkvKiBTTElNX01VWCgiQUlGM19QQiIsICJBSUYzIFBCIiksKi8KKwl7IlNMSU0gUlgwIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKKwkvKiBTTElNX01VWCgiQUlGNF9QQiIsICJBSUY0IFBCIiksKi8KKwl7IlNMSU0gUlgwIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKworCS8qIFNMSU1fTVVYKCJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiIpLCovCisJeyJTTElNIFJYMCBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAorCXsiU0xJTSBSWDIgTVVYIiwgIkFJRl9NSVgxX1BCIiwgIkFJRiBNSVgxIFBCIn0sCisJeyJTTElNIFJYMyBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAorCXsiU0xJTSBSWDUgTVVYIiwgIkFJRl9NSVgxX1BCIiwgIkFJRiBNSVgxIFBCIn0sCisJeyJTTElNIFJYNiBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAorCisJeyJTTElNIFJYMCIsIE5VTEwsICJTTElNIFJYMCBNVVgifSwKKwl7IlNMSU0gUlgxIiwgTlVMTCwgIlNMSU0gUlgxIE1VWCJ9LAorCXsiU0xJTSBSWDIiLCBOVUxMLCAiU0xJTSBSWDIgTVVYIn0sCisJeyJTTElNIFJYMyIsIE5VTEwsICJTTElNIFJYMyBNVVgifSwKKwl7IlNMSU0gUlg0IiwgTlVMTCwgIlNMSU0gUlg0IE1VWCJ9LAorCXsiU0xJTSBSWDUiLCBOVUxMLCAiU0xJTSBSWDUgTVVYIn0sCisJeyJTTElNIFJYNiIsIE5VTEwsICJTTElNIFJYNiBNVVgifSwKKwl7IlNMSU0gUlg3IiwgTlVMTCwgIlNMSU0gUlg3IE1VWCJ9LAorCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQwICovCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDBfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDBfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDAgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQwXzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQxICovCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDFfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDFfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxXzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQyICovCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMl8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDJfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMl8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDJfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMl8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDIgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQyXzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQzICovCisJeyJSWCBJTlQzXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UM18yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDNfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQzXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UM18yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDNfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQzXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UM18yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDMgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQzXzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQ0ICovCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDRfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDRfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDQgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQ1ICovCisJeyJSWCBJTlQ1XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNV8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDVfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ1XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNV8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDVfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ1XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNV8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDUgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ1XzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQ2ICovCisJeyJSWCBJTlQ2XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNl8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDZfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ2XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNl8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDZfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ2XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNl8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDYgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ2XzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQ3ICovCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UN18yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDdfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UN18yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDdfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UN18yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ3XzIgTVVYIn0sCisKKwkvKiBNSVhpbmcgcGF0aCBJTlQ4ICovCisJeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UOF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDhfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UOF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDhfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ4XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UOF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDggU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ4XzIgTVVYIn0sCisKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKworCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisKKwl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKworCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKworCS8qIFNSQzAsIFNSQzEgaW5wdXRzIHRvIFNpZGV0b25lIFJYIE1peGVyCisJICogb24gUlgwLCBSWDEsIFJYMiwgUlgzLCBSWDQgYW5kIFJYNyBjaGFpbnMKKwkgKi8KKwl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAwIE1VWCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJJSVIwIElOUDAgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJJSVIwIiwgTlVMTCwgIklJUjAgSU5QMSBNVVgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiSUlSMCIsIE5VTEwsICJJSVIwIElOUDIgTVVYIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAzIE1VWCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJJSVIwIElOUDMgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisKKwl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAwIE1VWCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJJSVIxIElOUDAgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisJeyJJSVIxIiwgTlVMTCwgIklJUjEgSU5QMSBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYMSIsICJTTElNIFJYMSJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDIiLCAiU0xJTSBSWDIifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYNCIsICJTTElNIFJYNCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDUiLCAiU0xJTSBSWDUifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlg2IiwgIlNMSU0gUlg2In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYNyIsICJTTElNIFJYNyJ9LAorCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDIgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKKwl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAzIE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCisKKwl7IlNSQzAiLCBOVUxMLCAiSUlSMCJ9LAorCXsiU1JDMSIsIE5VTEwsICJJSVIxIn0sCisJeyJSWCBJTlQwIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAorCXsiUlggSU5UMCBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKKwl7IlJYIElOVDEgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCisJeyJSWCBJTlQxIE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAorCXsiUlggSU5UMiBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKKwl7IlJYIElOVDIgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCisJeyJSWCBJTlQzIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAorCXsiUlggSU5UMyBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKKwl7IlJYIElOVDQgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCisJeyJSWCBJTlQ0IE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAorCXsiUlggSU5UNyBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKKwl7IlJYIElOVDcgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCit9OworCitzdGF0aWMgaW50IHRhc2hhX2FtaWNfcHdyX2x2bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXUxNiBhbWljX3JlZzsKKworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18xXzIgUFdSIE1PREUiKSkKKwkJYW1pY19yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMTsKKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfM180IFBXUiBNT0RFIikpCisJCWFtaWNfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzM7CisJaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzVfNiBQV1IgTU9ERSIpKQorCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUM1OworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkoc25kX3NvY19yZWFkKGNvZGVjLCBhbWljX3JlZykgJiBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLKSA+PgorCQkJICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2FtaWNfcHdyX2x2bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwl1MzIgbW9kZV92YWw7CisJdTE2IGFtaWNfcmVnOworCisJbW9kZV92YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVkXG4iLAorCQlfX2Z1bmNfXywgbW9kZV92YWwpOworCisJaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzFfMiBQV1IgTU9ERSIpKQorCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxOworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18zXzQgUFdSIE1PREUiKSkKKwkJYW1pY19yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMzsKKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfNV82IFBXUiBNT0RFIikpCisJCWFtaWNfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzU7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhbWljX3JlZywgV0NEOTMzNV9BTUlDX1BXUl9MVkxfTUFTSywKKwkJCSAgICBtb2RlX3ZhbCA8PCBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9yeF9ocGhfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+aHBoX21vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfcnhfaHBoX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MzIgbW9kZV92YWw7CisKKwltb2RlX3ZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJWRcbiIsCisJCV9fZnVuY19fLCBtb2RlX3ZhbCk7CisKKwlpZiAobW9kZV92YWwgPT0gMCkgeworCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6SW52YWxpZCBIUEggTW9kZSwgZGVmYXVsdCB0byBDbHMtSCBIaUZpXG4iLAorCQkJX19mdW5jX18pOworCQltb2RlX3ZhbCA9IENMU19IX0hJRkk7CisJfQorCXRhc2hhLT5ocGhfbW9kZSA9IG1vZGVfdmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFzaGFfY29ubl9tYWRfdGV4dFtdID0geworCSJOT1RVU0VEMSIsICJBREMxIiwgIkFEQzIiLCAiQURDMyIsICJBREM0IiwgIkFEQzUiLCAiQURDNiIsCisJIk5PVFVTRUQyIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwgIkRNSUM0IiwKKwkiRE1JQzUiLCAiTk9UVVNFRDMiLCAiTk9UVVNFRDQiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Nvbm5fbWFkX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXNoYV9jb25uX21hZF90ZXh0KSwKKwkJCSAgICB0YXNoYV9jb25uX21hZF90ZXh0KTsKKworc3RhdGljIGludCB0YXNoYV9lbmFibGVfbGRvX2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJdTggdmFsID0gMDsKKworCWlmIChjb2RlYykKKwkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0xET0hfTU9ERSkgJiAweDgwOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhIXZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2VuYWJsZV9sZG9faF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlib29sIGVuYWJsZTsKKworCWVuYWJsZSA9ICEhdmFsdWU7CisJaWYgKGNvZGVjKQorCQl0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9sZG9faChjb2RlYywgZW5hYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX21hZF9pbnB1dF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggdGFzaGFfbWFkX2lucHV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCisJdGFzaGFfbWFkX2lucHV0ID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzMzVfU09DX01BRF9JTlBfU0VMKSAmIDB4MEY7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYV9tYWRfaW5wdXQ7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogdGFzaGFfbWFkX2lucHV0ID0gJXNcbiIsIF9fZnVuY19fLAorCQl0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX21hZF9pbnB1dF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggdGFzaGFfbWFkX2lucHV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJY2hhciBtYWRfYW1pY19pbnB1dF93aWRnZXRbNl07CisJY29uc3QgY2hhciAqbWFkX2lucHV0X3dpZGdldDsKKwljb25zdCBjaGFyICpzb3VyY2Vfd2lkZ2V0ID0gTlVMTDsKKwl1MzIgYWRjLCBpLCBtaWNfYmlhc19mb3VuZCA9IDA7CisJaW50IHJldCA9IDA7CisJY2hhciAqbWFkX2lucHV0OworCisJdGFzaGFfbWFkX2lucHV0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAoIXN0cmNtcCh0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0sICJOT1RVU0VEMSIpIHx8CisJICAgICFzdHJjbXAodGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdLCAiTk9UVVNFRDIiKSB8fAorCSAgICAhc3RyY21wKHRhc2hhX2Nvbm5fbWFkX3RleHRbdGFzaGFfbWFkX2lucHV0XSwgIk5PVFVTRUQzIikgfHwKKwkgICAgIXN0cmNtcCh0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0sICJOT1RVU0VENCIpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogVW5zdXBwb3J0ZWQgdGFzaGFfbWFkX2lucHV0ID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgdGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cm5zdHIodGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdLAorCQkgICAgIkFEQyIsIHNpemVvZigiQURDIikpKSB7CisJCW1hZF9pbnB1dCA9IHN0cnBicmsodGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdLAorCQkJCSAgICAiMTIzNDU2Iik7CisJCWlmICghbWFkX2lucHV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBNQUQgaW5wdXQgJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJdGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IGtzdHJ0b3VpbnQobWFkX2lucHV0LCAxMCwgJmFkYyk7CisJCWlmICgocmV0IDwgMCkgfHwgKGFkYyA+IDYpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBJbnZhbGlkIEFEQyA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJCQl0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0pOworCQkJcmV0ID0gIC1FSU5WQUw7CisJCX0KKworCQlzbnByaW50ZihtYWRfYW1pY19pbnB1dF93aWRnZXQsIDYsICIlcyV1IiwgIkFNSUMiLCBhZGMpOworCisJCW1hZF9pbnB1dF93aWRnZXQgPSBtYWRfYW1pY19pbnB1dF93aWRnZXQ7CisJfSBlbHNlIHsKKwkJLyogRE1JQyB0eXBlIGlucHV0IHdpZGdldCovCisJCW1hZF9pbnB1dF93aWRnZXQgPSB0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF07CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IHRhc2hhIGlucHV0IHdpZGdldCA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJbWFkX2lucHV0X3dpZGdldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX29mX2RhcG1fcm91dGVzOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoY2FyZC0+b2ZfZGFwbV9yb3V0ZXNbaV0uc2luaywgbWFkX2lucHV0X3dpZGdldCkpIHsKKwkJCXNvdXJjZV93aWRnZXQgPSBjYXJkLT5vZl9kYXBtX3JvdXRlc1tpXS5zb3VyY2U7CisJCQlpZiAoIXNvdXJjZV93aWRnZXQpIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSIlczogaW52YWxpZCBzb3VyY2Ugd2lkZ2V0XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsCisJCQkJIk1JQyBCSUFTMSIsIHNpemVvZigiTUlDIEJJQVMxIikpKSB7CisJCQkJbWljX2JpYXNfZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsCisJCQkJIk1JQyBCSUFTMiIsIHNpemVvZigiTUlDIEJJQVMyIikpKSB7CisJCQkJbWljX2JpYXNfZm91bmQgPSAyOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsCisJCQkJIk1JQyBCSUFTMyIsIHNpemVvZigiTUlDIEJJQVMzIikpKSB7CisJCQkJbWljX2JpYXNfZm91bmQgPSAzOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChzdHJuc3RyKHNvdXJjZV93aWRnZXQsCisJCQkJIk1JQyBCSUFTNCIsIHNpemVvZigiTUlDIEJJQVM0IikpKSB7CisJCQkJbWljX2JpYXNfZm91bmQgPSA0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFtaWNfYmlhc19mb3VuZCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IG1pYyBiaWFzIHNvdXJjZSBub3QgZm91bmQgZm9yIGlucHV0ID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgbWFkX2lucHV0X3dpZGdldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwKKwkJIiVzOiBtaWNfYmlhcyBmb3VuZCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJbWljX2JpYXNfZm91bmQpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0lOUF9TRUwsCisJCQkgICAgMHgwRiwgdGFzaGFfbWFkX2lucHV0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQURfU0VUVVAsCisJCQkgICAgMHgwNywgbWljX2JpYXNfZm91bmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfcGluY3RsX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXUxNiBjdGxfcmVnOworCXU4IHJlZ192YWwsIHBpbmN0bF9wb3NpdGlvbjsKKworCXBpbmN0bF9wb3NpdGlvbiA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisJc3dpdGNoIChwaW5jdGxfcG9zaXRpb24gPj4gMykgeworCWNhc2UgMDoKKwkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHBpbmN0bCBwb3NpdGlvbiA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBpbmN0bF9wb3NpdGlvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGN0bF9yZWcpOworCXJlZ192YWwgPSAocmVnX3ZhbCA+PiAocGluY3RsX3Bvc2l0aW9uICYgMHgwNykpICYgMHgxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcmVnX3ZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3BpbmN0bF9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgY3RsX3JlZywgY2ZnX3JlZzsKKwl1OCBjdGxfdmFsLCBjZmdfdmFsLCBwaW5jdGxfcG9zaXRpb24sIHBpbmN0bF9tb2RlLCBtYXNrOworCisJLyogMS0gaGlnaCBvciBsb3c7IDAtIGhpZ2ggWiAqLworCXBpbmN0bF9tb2RlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcGluY3RsX3Bvc2l0aW9uID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKworCXN3aXRjaCAocGluY3RsX3Bvc2l0aW9uID4+IDMpIHsKKwljYXNlIDA6CisJCWN0bF9yZWcgPSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8wOworCQlicmVhazsKKwljYXNlIDE6CisJCWN0bF9yZWcgPSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8xOworCQlicmVhazsKKwljYXNlIDI6CisJCWN0bF9yZWcgPSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8yOworCQlicmVhazsKKwljYXNlIDM6CisJCWN0bF9yZWcgPSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBwaW5jdGwgcG9zaXRpb24gPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwaW5jdGxfcG9zaXRpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdGxfdmFsID0gcGluY3RsX21vZGUgPDwgKHBpbmN0bF9wb3NpdGlvbiAmIDB4MDcpOworCW1hc2sgPSAxIDw8IChwaW5jdGxfcG9zaXRpb24gJiAweDA3KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjdGxfcmVnLCBtYXNrLCBjdGxfdmFsKTsKKworCWNmZ19yZWcgPSBXQ0Q5MzM1X1RMTU1fQklTVF9NT0RFX1BJTkNGRyArIHBpbmN0bF9wb3NpdGlvbjsKKwlpZiAoIXBpbmN0bF9tb2RlKSB7CisJCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykKKwkJCWNmZ192YWwgPSAweDQ7CisJCWVsc2UKKwkJCWNmZ192YWwgPSAweEM7CisJfSBlbHNlIHsKKwkJY2ZnX3ZhbCA9IDA7CisJfQorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNmZ19yZWcsIDB4MDcsIGNmZ192YWwpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHJlZz0weCV4IG1hc2s9MHgleCB2YWw9JWQgcmVnPTB4JXggdmFsPSVkXG4iLAorCQkJX19mdW5jX18sIGN0bF9yZWcsIG1hc2ssIGN0bF92YWwsIGNmZ19yZWcsIGNmZ192YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF92YmF0X2FkY19vdXRfY29uZmlnXzJfMChzdHJ1Y3Qgd2NkX3ZiYXQgKnZiYXQsCisJCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl1OCB2YWwxLCB2YWwyOworCisJLyoKKwkgKiBNZWFzdXJlIGRjcDEgYnkgdXNpbmcgIkFMVCIgYnJhbmNoIG9mIGJhbmQgZ2FwCisJICogdm9sdGFnZShWYmcpIGFuZCB1c2UgaXQgaW4gRkFTVCBtb2RlCisJICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9CSUFTX0NUTCwgMHg4MiwgMHg4Mik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMLCAweDEwLCAweDEwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfREVCVUcxLCAweDAxLCAweDAxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9WQkFEQywgMHg4MCwgMHg4MCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9WQkFEQ19TVUJCTE9DS19FTiwgMHgyMCwgMHgwMCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwsIDB4MjAsIDB4MjApOworCS8qIFdhaXQgMTAwIHVzZWMgYWZ0ZXIgY2FsaWJyYXRpb24gc2VsZWN0IGFzIFZiZyAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg0MCwgMHg0MCk7CisJdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQik7CisJdmFsMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfRE9VVExTQik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfSU8sIDB4NDAsIDB4MDApOworCisJdmJhdC0+ZGNwMSA9ICgoKHZhbDEgJiAweEZGKSA8PCAzKSB8ICh2YWwyICYgMHgwNykpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9CSUFTX0NUTCwgMHg0MCwgMHg0MCk7CisJLyogV2FpdCAxMDAgdXNlYyBhZnRlciBzZWxlY3RpbmcgVmJnIGFzIDEuMDVWICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweDQwLCAweDQwKTsKKwl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCKTsKKwl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg0MCwgMHgwMCk7CisKKwl2YmF0LT5kY3AyID0gKCgodmFsMSAmIDB4RkYpIDw8IDMpIHwgKHZhbDIgJiAweDA3KSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGNwMToweCV4LCBkY3AyOjB4JXhcbiIsCisJCV9fZnVuY19fLCB2YmF0LT5kY3AxLCB2YmF0LT5kY3AyKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQklBU19DVEwsIDB4MjgpOworCS8qIFdhaXQgMTAwIHVzZWMgYWZ0ZXIgc2VsZWN0aW5nIFZiZyBhcyAwLjg1ViAqLworCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwsIDB4MjAsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfU1VCQkxPQ0tfRU4sIDB4MjAsIDB4MjApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX1ZCQURDLCAweDgwLCAweDAwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTCwgMHgxMCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSwgMHgwMSwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF92YmF0X2FkY19vdXRfY29uZmlnXzFfeChzdHJ1Y3Qgd2NkX3ZiYXQgKnZiYXQsCisJCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl1OCB2YWwxLCB2YWwyOworCisJLyoKKwkgKiBNZWFzdXJlIGRjcDEgYnkgYXBwbHlpbmcgYmFuZCBnYXAgdm9sdGFnZShWYmcpCisJICogb2YgMC44NVYKKwkgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CSUFTLCAweDIwKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0JJQVNfQ1RMLCAweDI4KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0JJQVNfVkJHX0ZJTkVfQURKLCAweDA1KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CSUFTLCAweEEwKTsKKwkvKiBXYWl0IDIgc2VjIGFmdGVyIGVuYWJsaW5nIGJhbmQgZ2FwIGJpYXMgKi8KKwl1c2xlZXBfcmFuZ2UoMjAwMDAwMCwgMjAwMDEwMCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9DTEtfVE9QLCAweDgyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9DTEtfVE9QLCAweDg3KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwsIDB4MTAsIDB4MTApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcsIDB4MEQpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9ERUJVRzEsIDB4MDEpOworCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfVkJBREMsIDB4ODApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfU1VCQkxPQ0tfRU4sIDB4REUpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfRkVfQ1RSTCwgMHgzQyk7CisJLyogV2FpdCAxIG1zZWMgYWZ0ZXIgY2FsaWJyYXRpb24gc2VsZWN0IGFzIFZiZyAqLworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweEMwKTsKKwl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCKTsKKwl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg4MCk7CisKKwl2YmF0LT5kY3AxID0gKCgodmFsMSAmIDB4RkYpIDw8IDMpIHwgKHZhbDIgJiAweDA3KSk7CisKKwkvKgorCSAqIE1lYXN1cmUgZGNwMiBieSBhcHBseWluZyBiYW5kIGdhcCB2b2x0YWdlKFZiZykKKwkgKiBvZiAxLjA1VgorCSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4ODApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4QzApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQklBU19DVEwsIDB4NjgpOworCS8qIFdhaXQgMiBtc2VjIGFmdGVyIHNlbGVjdGluZyBWYmcgYXMgMS4wNVYgKi8KKwl1c2xlZXBfcmFuZ2UoMjAwMCwgMjEwMCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CSUFTLCAweDgwKTsKKwkvKiBXYWl0IDEgc2VjIGFmdGVyIGVuYWJsaW5nIGJhbmQgZ2FwIGJpYXMgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwMDAwMCwgMTAwMDEwMCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHhDMCk7CisJdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQik7CisJdmFsMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfRE9VVExTQik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfSU8sIDB4ODApOworCisJdmJhdC0+ZGNwMiA9ICgoKHZhbDEgJiAweEZGKSA8PCAzKSB8ICh2YWwyICYgMHgwNykpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGRjcDE6MHgleCwgZGNwMjoweCV4XG4iLAorCQlfX2Z1bmNfXywgdmJhdC0+ZGNwMSwgdmJhdC0+ZGNwMik7CisKKwkvKiBSZXNldCB0aGUgVmJhdCBBREMgY29uZmlndXJhdGlvbiAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4ODApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4QzApOworCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9CSUFTX0NUTCwgMHgyOCk7CisJLyogV2FpdCAyIG1zZWMgYWZ0ZXIgc2VsZWN0aW5nIFZiZyBhcyAwLjg1ViAqLworCXVzbGVlcF9yYW5nZSgyMDAwLCAyMTAwKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4QTApOworCS8qIFdhaXQgMSBzZWMgYWZ0ZXIgZW5hYmxpbmcgYmFuZCBnYXAgYmlhcyAqLworCXVzbGVlcF9yYW5nZSgxMDAwMDAwLCAxMDAwMTAwKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfRkVfQ1RSTCwgMHgxQyk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19TVUJCTE9DS19FTiwgMHhGRSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfSU8sIDB4ODApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX1ZCQURDLCAweDAwKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9ERUJVRzEsIDB4MDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTCwgMHgwMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0NGRywgMHgwQSk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF92YmF0X2FkY19vdXRfY29uZmlnKHN0cnVjdCB3Y2RfdmJhdCAqdmJhdCwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWlmICghdmJhdC0+YWRjX2NvbmZpZykgeworCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIHRydWUsIGZhbHNlKTsKKworCQlpZiAoVEFTSEFfSVNfMl8wKHdjZDl4eHgpKQorCQkJd2NkX3ZiYXRfYWRjX291dF9jb25maWdfMl8wKHZiYXQsIGNvZGVjKTsKKwkJZWxzZQorCQkJd2NkX3ZiYXRfYWRjX291dF9jb25maWdfMV94KHZiYXQsIGNvZGVjKTsKKworCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisJCXZiYXQtPmFkY19jb25maWcgPSB0cnVlOworCX0KK30KKworc3RhdGljIGludCB0YXNoYV91cGRhdGVfdmJhdF9yZWdfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICpod2RlcF9jYWwgPSBOVUxMOworCXN0cnVjdCB2YmF0X21vbml0b3JfcmVnICp2YmF0X3JlZ19wdHIgPSBOVUxMOworCWNvbnN0IHZvaWQgKmRhdGE7CisJc2l6ZV90IGNhbF9zaXplLCB2YmF0X3NpemVfcmVtYWluaW5nOworCWludCByZXQgPSAwLCBpOworCXUzMiB2YmF0X3dyaXRlc19zaXplID0gMDsKKwl1MTYgcmVnOworCXU4IG1hc2ssIHZhbCwgb2xkX3ZhbDsKKworCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRhc2hhLT5md19kYXRhLCBXQ0Q5WFhYX1ZCQVRfQ0FMKTsKKwlpZiAoaHdkZXBfY2FsKSB7CisJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCWNhbF9zaXplID0gaHdkZXBfY2FsLT5zaXplOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFZiYXQgY2FsIG5vdCByZWNlaXZlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfc2l6ZSA8IHNpemVvZigqdmJhdF9yZWdfcHRyKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEluY29ycmVjdCBzaXplICV6ZCBmb3IgVmJhdCBDYWwsIGV4cGVjdGVkICV6ZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfc2l6ZSwgc2l6ZW9mKCp2YmF0X3JlZ19wdHIpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXZiYXRfcmVnX3B0ciA9IChzdHJ1Y3QgdmJhdF9tb25pdG9yX3JlZyAqKSAoZGF0YSk7CisKKwlpZiAoIXZiYXRfcmVnX3B0cikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgY2FsaWJyYXRpb24gZGF0YSBmb3IgVmJhdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXZiYXRfd3JpdGVzX3NpemUgPSB2YmF0X3JlZ19wdHItPnNpemU7CisJdmJhdF9zaXplX3JlbWFpbmluZyA9IGNhbF9zaXplIC0gc2l6ZW9mKHUzMik7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHZiYXRfd3JpdGVzX3N6OiAlZCwgdmJhdF9zel9yZW1haW5pbmc6ICV6ZFxuIiwKKwkJCV9fZnVuY19fLCB2YmF0X3dyaXRlc19zaXplLCB2YmF0X3NpemVfcmVtYWluaW5nKTsKKworCWlmICgodmJhdF93cml0ZXNfc2l6ZSAqIFRBU0hBX1BBQ0tFRF9SRUdfU0laRSkKKwkJCQkJPiB2YmF0X3NpemVfcmVtYWluaW5nKSB7CisJCXByX2VycigiJXM6IEluY29ycmVjdCBWYmF0IGNhbGlicmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDAgOyBpIDwgdmJhdF93cml0ZXNfc2l6ZTsgaSsrKSB7CisJCVRBU0hBX0NPREVDX1VOUEFDS19FTlRSWSh2YmF0X3JlZ19wdHItPndyaXRlc1tpXSwKKwkJCQkJcmVnLCBtYXNrLCB2YWwpOworCQlvbGRfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIChvbGRfdmFsICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV92YmF0X2FkY19kYXRhX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl3Y2RfdmJhdF9hZGNfb3V0X2NvbmZpZygmdGFzaGEtPnZiYXQsIGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzaGEtPnZiYXQuZGNwMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHRhc2hhLT52YmF0LmRjcDI7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogVmJhdCBBREMgb3V0cHV0IHZhbHVlcywgRGNwMSA6ICVsdSwgRGNwMjogJWx1XG4iLAorCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhc2hhX3ZiYXRfZ3NtX21vZGVfdGV4dFtdID0geworCSJPRkYiLCAiT04ifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0YXNoYV92YmF0X2dzbV9tb2RlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgdGFzaGFfdmJhdF9nc21fbW9kZV90ZXh0KTsKKworc3RhdGljIGludCB0YXNoYV92YmF0X2dzbV9tb2RlX2Z1bmNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0NGRykgJiAweDA0KSA/CisJCSAgMSA6IDApOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHZhbHVlOiAlbHVcbiIsIF9fZnVuY19fLAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV92YmF0X2dzbV9tb2RlX2Z1bmNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB2YWx1ZTogJWx1XG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJLyogU2V0IFZiYXQgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgR1NNIG1vZGUgYml0IGJhc2VkIG9uIHZhbHVlICovCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHLAorCQkJCQkJMHgwNCwgMHgwNCk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHLAorCQkJCQkJMHgwNCwgMHgwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY192YmF0X2VuYWJsZV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlpbnQgZXZlbnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUxNiB2YmF0X3BhdGhfY3RsLCB2YmF0X2NmZywgdmJhdF9wYXRoX2NmZzsKKworCXZiYXRfcGF0aF9jdGwgPSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEw7CisJdmJhdF9jZmcgPSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHOworCXZiYXRfcGF0aF9jZmcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxOworCisJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDggVkJBVCIpKQorCQl2YmF0X3BhdGhfY2ZnID0gV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMTsKKwllbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ3IFZCQVQiKSkKKwkJdmJhdF9wYXRoX2NmZyA9IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzE7CisJZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNiBWQkFUIikpCisJCXZiYXRfcGF0aF9jZmcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcxOworCWVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDUgVkJBVCIpKQorCQl2YmF0X3BhdGhfY2ZnID0gV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSB0YXNoYV91cGRhdGVfdmJhdF9yZWdfY29uZmlnKGNvZGVjKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJCSIlcyA6IFZCQVQgaXNuJ3QgY2FsaWJyYXRlZCwgU28gbm90IGVuYWJsaW5nIGl0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX1ZCQURDLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdmJhdF9wYXRoX2NmZywgMHgwMiwgMHgwMik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHZiYXRfcGF0aF9jdGwsIDB4MTAsIDB4MTApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB2YmF0X2NmZywgMHgwMSwgMHgwMSk7CisJCXRhc2hhLT52YmF0LmlzX2VuYWJsZWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKHRhc2hhLT52YmF0LmlzX2VuYWJsZWQpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHZiYXRfY2ZnLCAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHZiYXRfcGF0aF9jdGwsIDB4MTAsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdmJhdF9wYXRoX2NmZywgMHgwMiwgMHgwMCk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9WQkFEQywgMHgwMCk7CisJCQl0YXNoYS0+dmJhdC5pc19lbmFibGVkID0gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaHBoX21vZGVfbXV4X3RleHRbXSA9IHsKKwkiQ0xTX0hfSU5WQUxJRCIsICJDTFNfSF9ISUZJIiwgIkNMU19IX0xQIiwgIkNMU19BQiIsICJDTFNfSF9MT0hJRkkiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2hwaF9tb2RlX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUocnhfaHBoX21vZGVfbXV4X3RleHQpLAorCQkJICAgIHJ4X2hwaF9tb2RlX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbWljX3B3cl9sdmxfdGV4dFtdID0geworCSJMT1dfUFdSIiwgIkRFRkFVTFQiLCAiSElHSF9QRVJGIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbWljX3B3cl9sdmxfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGFtaWNfcHdyX2x2bF90ZXh0KSwKKwkJCSAgICBhbWljX3B3cl9sdmxfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0YXNoYV9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgwIERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9DVEwsCisJCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYMSBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDIgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgzIERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9DVEwsCisJCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYNCBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDUgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg2IERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9DVEwsCisJCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYNyBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDggRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDAgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDEgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDIgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDQgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlg0X1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDUgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlg1X1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDYgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDcgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDggTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMLAorCQkJICAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzAgVm9sdW1lIiwgV0NEOTMzNV9DRENfVFgwX1RYX1ZPTF9DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDMSBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDFfVFhfVk9MX0NUTCwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUMyIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYMl9UWF9WT0xfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzMgVm9sdW1lIiwgV0NEOTMzNV9DRENfVFgzX1RYX1ZPTF9DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDNCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDRfVFhfVk9MX0NUTCwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUM1IFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYNV9UWF9WT0xfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzYgVm9sdW1lIiwgV0NEOTMzNV9DRENfVFg2X1RYX1ZPTF9DVEwsIDAsCisJCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiREVDNyBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDdfVFhfVk9MX0NUTCwgMCwKKwkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJERUM4IFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYOF9UWF9WT0xfQ1RMLCAwLAorCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAwIFZvbHVtZSIsCisJCQkgIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLCAwLCAtODQsCisJCQkgIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIwIElOUDEgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwsIDAsIC04NCwKKwkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjAgSU5QMiBWb2x1bWUiLAorCQkJICBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCwgMCwgLTg0LAorCQkJICA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAzIFZvbHVtZSIsCisJCQkgIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLCAwLCAtODQsCisJCQkgIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDAgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwsIDAsIC04NCwKKwkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMSBWb2x1bWUiLAorCQkJICBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCwgMCwgLTg0LAorCQkJICA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAyIFZvbHVtZSIsCisJCQkgIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLCAwLCAtODQsCisJCQkgIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDMgVm9sdW1lIiwKKwkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNF9DVEwsIDAsIC04NCwKKwkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX0VYVCgiQU5DIFNsb3QiLCBTTkRfU09DX05PUE0sIDAsIDEwMCwgMCwgdGFzaGFfZ2V0X2FuY19zbG90LAorCQkgICAgICAgdGFzaGFfcHV0X2FuY19zbG90KSwKKwlTT0NfRU5VTV9FWFQoIkFOQyBGdW5jdGlvbiIsIHRhc2hhX2FuY19mdW5jX2VudW0sIHRhc2hhX2dldF9hbmNfZnVuYywKKwkJICAgICB0YXNoYV9wdXRfYW5jX2Z1bmMpLAorCisJU09DX0VOVU1fRVhUKCJDTEsgTU9ERSIsIHRhc2hhX2Nsa21vZGVfZW51bSwgdGFzaGFfZ2V0X2Nsa21vZGUsCisJCSAgICAgdGFzaGFfcHV0X2Nsa21vZGUpLAorCisJU09DX0VOVU0oIlRYMCBIUEYgY3V0IG9mZiIsIGNmX2RlYzBfZW51bSksCisJU09DX0VOVU0oIlRYMSBIUEYgY3V0IG9mZiIsIGNmX2RlYzFfZW51bSksCisJU09DX0VOVU0oIlRYMiBIUEYgY3V0IG9mZiIsIGNmX2RlYzJfZW51bSksCisJU09DX0VOVU0oIlRYMyBIUEYgY3V0IG9mZiIsIGNmX2RlYzNfZW51bSksCisJU09DX0VOVU0oIlRYNCBIUEYgY3V0IG9mZiIsIGNmX2RlYzRfZW51bSksCisJU09DX0VOVU0oIlRYNSBIUEYgY3V0IG9mZiIsIGNmX2RlYzVfZW51bSksCisJU09DX0VOVU0oIlRYNiBIUEYgY3V0IG9mZiIsIGNmX2RlYzZfZW51bSksCisJU09DX0VOVU0oIlRYNyBIUEYgY3V0IG9mZiIsIGNmX2RlYzdfZW51bSksCisJU09DX0VOVU0oIlRYOCBIUEYgY3V0IG9mZiIsIGNmX2RlYzhfZW51bSksCisKKwlTT0NfRU5VTSgiUlggSU5UMF8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MF8xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQwXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQwXzJfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDFfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDFfMV9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UMV8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MV8yX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQyXzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQyXzFfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDJfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDJfMl9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UM18xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50M18xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQzXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQzXzJfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDRfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDRfMV9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UNF8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50NF8yX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQ1XzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQ1XzFfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDVfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDVfMl9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UNl8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50Nl8xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQ2XzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQ2XzJfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDdfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDdfMV9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UN18yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50N18yX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQ4XzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQ4XzFfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDhfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDhfMl9lbnVtKSwKKworCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kMSIsIElJUjAsIEJBTkQxLCAxLCAwLAorCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjAgRW5hYmxlIEJhbmQyIiwgSUlSMCwgQkFORDIsIDEsIDAsCisJdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDMiLCBJSVIwLCBCQU5EMywgMSwgMCwKKwl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kNCIsIElJUjAsIEJBTkQ0LCAxLCAwLAorCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjAgRW5hYmxlIEJhbmQ1IiwgSUlSMCwgQkFORDUsIDEsIDAsCisJdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDEiLCBJSVIxLCBCQU5EMSwgMSwgMCwKKwl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMiIsIElJUjEsIEJBTkQyLCAxLCAwLAorCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQzIiwgSUlSMSwgQkFORDMsIDEsIDAsCisJdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDQiLCBJSVIxLCBCQU5ENCwgMSwgMCwKKwl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAxLCAwLAorCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCisKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMCBCYW5kMSIsIElJUjAsIEJBTkQxLCAyNTUsIDAsIDUsCisJdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQyIiwgSUlSMCwgQkFORDIsIDI1NSwgMCwgNSwKKwl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDMiLCBJSVIwLCBCQU5EMywgMjU1LCAwLCA1LAorCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMCBCYW5kNCIsIElJUjAsIEJBTkQ0LCAyNTUsIDAsIDUsCisJdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQ1IiwgSUlSMCwgQkFORDUsIDI1NSwgMCwgNSwKKwl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDEiLCBJSVIxLCBCQU5EMSwgMjU1LCAwLCA1LAorCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMiIsIElJUjEsIEJBTkQyLCAyNTUsIDAsIDUsCisJdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQzIiwgSUlSMSwgQkFORDMsIDI1NSwgMCwgNSwKKwl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDQiLCBJSVIxLCBCQU5ENCwgMjU1LCAwLCA1LAorCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAyNTUsIDAsIDUsCisJdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAorCisJU09DX1NJTkdMRV9FWFQoIkNPTVAxIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzEsIDEsIDAsCisJCSAgICAgICB0YXNoYV9nZXRfY29tcGFuZGVyLCB0YXNoYV9zZXRfY29tcGFuZGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDIgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfMiwgMSwgMCwKKwkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJDT01QMyBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl8zLCAxLCAwLAorCQkgICAgICAgdGFzaGFfZ2V0X2NvbXBhbmRlciwgdGFzaGFfc2V0X2NvbXBhbmRlciksCisJU09DX1NJTkdMRV9FWFQoIkNPTVA0IFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzQsIDEsIDAsCisJCSAgICAgICB0YXNoYV9nZXRfY29tcGFuZGVyLCB0YXNoYV9zZXRfY29tcGFuZGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDUgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfNSwgMSwgMCwKKwkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJDT01QNiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl82LCAxLCAwLAorCQkgICAgICAgdGFzaGFfZ2V0X2NvbXBhbmRlciwgdGFzaGFfc2V0X2NvbXBhbmRlciksCisJU09DX1NJTkdMRV9FWFQoIkNPTVA3IFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzcsIDEsIDAsCisJCSAgICAgICB0YXNoYV9nZXRfY29tcGFuZGVyLCB0YXNoYV9zZXRfY29tcGFuZGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDggU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfOCwgMSwgMCwKKwkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAorCisJU09DX0VOVU1fRVhUKCJSWCBIUEggTW9kZSIsIHJ4X2hwaF9tb2RlX211eF9lbnVtLAorCQkgICAgICAgdGFzaGFfcnhfaHBoX21vZGVfZ2V0LCB0YXNoYV9yeF9ocGhfbW9kZV9wdXQpLAorCisJU09DX0VOVU1fRVhUKCJNQUQgSW5wdXQiLCB0YXNoYV9jb25uX21hZF9lbnVtLAorCQkgICAgIHRhc2hhX21hZF9pbnB1dF9nZXQsIHRhc2hhX21hZF9pbnB1dF9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJMRE9fSCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCQl0YXNoYV9lbmFibGVfbGRvX2hfZ2V0LCB0YXNoYV9lbmFibGVfbGRvX2hfcHV0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJETUlDMV9DTEtfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDE3LCAxLCAwLAorCQkgICAgICAgdGFzaGFfcGluY3RsX21vZGVfZ2V0LCB0YXNoYV9waW5jdGxfbW9kZV9wdXQpLAorCisJU09DX1NJTkdMRV9FWFQoIkRNSUMxX0RBVEFfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDE4LCAxLCAwLAorCQkgICAgICAgdGFzaGFfcGluY3RsX21vZGVfZ2V0LCB0YXNoYV9waW5jdGxfbW9kZV9wdXQpLAorCisJU09DX1NJTkdMRV9FWFQoIkRNSUMyX0NMS19QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMTksIDEsIDAsCisJCSAgICAgICB0YXNoYV9waW5jdGxfbW9kZV9nZXQsIHRhc2hhX3BpbmN0bF9tb2RlX3B1dCksCisKKwlTT0NfU0lOR0xFX0VYVCgiRE1JQzJfREFUQV9QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMjAsIDEsIDAsCisJCSAgICAgICB0YXNoYV9waW5jdGxfbW9kZV9nZXQsIHRhc2hhX3BpbmN0bF9tb2RlX3B1dCksCisKKwlTT0NfU0lOR0xFX0VYVCgiRE1JQzNfQ0xLX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAyMSwgMSwgMCwKKwkJICAgICAgIHRhc2hhX3BpbmN0bF9tb2RlX2dldCwgdGFzaGFfcGluY3RsX21vZGVfcHV0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJETUlDM19EQVRBX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAyMiwgMSwgMCwKKwkJICAgICAgIHRhc2hhX3BpbmN0bF9tb2RlX2dldCwgdGFzaGFfcGluY3RsX21vZGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFNSUNfMV8yIFBXUiBNT0RFIiwgYW1pY19wd3JfbHZsX2VudW0sCisJCSAgICAgICB0YXNoYV9hbWljX3B3cl9sdmxfZ2V0LCB0YXNoYV9hbWljX3B3cl9sdmxfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFNSUNfM180IFBXUiBNT0RFIiwgYW1pY19wd3JfbHZsX2VudW0sCisJCSAgICAgICB0YXNoYV9hbWljX3B3cl9sdmxfZ2V0LCB0YXNoYV9hbWljX3B3cl9sdmxfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFNSUNfNV82IFBXUiBNT0RFIiwgYW1pY19wd3JfbHZsX2VudW0sCisJCSAgICAgICB0YXNoYV9hbWljX3B3cl9sdmxfZ2V0LCB0YXNoYV9hbWljX3B3cl9sdmxfcHV0KSwKKworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWYmF0IEFEQyBkYXRhIiwgU05EX1NPQ19OT1BNLCAwLCAweEZGRkYsIDAsIDIsCisJCQl0YXNoYV92YmF0X2FkY19kYXRhX2dldCwgTlVMTCksCisKKwlTT0NfRU5VTV9FWFQoIkdTTSBtb2RlIEVuYWJsZSIsIHRhc2hhX3ZiYXRfZ3NtX21vZGVfZW51bSwKKwkJCXRhc2hhX3ZiYXRfZ3NtX21vZGVfZnVuY19nZXQsCisJCQl0YXNoYV92YmF0X2dzbV9tb2RlX2Z1bmNfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgdGFzaGFfcHV0X2RlY19lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXUxNiBtaWNfc2VsX3JlZzsKKwl1OCBtaWNfc2VsOworCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAodmFsID4gZS0+aXRlbXMgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3bmFtZTogJXMsIHZhbDogMHgleFxuIiwgX19mdW5jX18sCisJCXdpZGdldC0+bmFtZSwgdmFsKTsKKworCXN3aXRjaCAoZS0+cmVnKSB7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzE6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzE6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzE6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzE6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzA6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzA6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg2X0NGRzA6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzA6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzA6CisJCW1pY19zZWxfcmVnID0gV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGUtPnJlZzogMHgleCBub3QgZXhwZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXywgZS0+cmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQURDOiAwLCBETUlDOiAxICovCisJbWljX3NlbCA9IHZhbCA/IDB4MCA6IDB4MTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNfc2VsX3JlZywgMSA8PCA3LCBtaWNfc2VsIDw8IDcpOworCisJcmV0dXJuIHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUoa2NvbnRyb2wsIHVjb250cm9sKTsKK30KKworc3RhdGljIGludCB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgc2hvcnQgbG9va19haGVhZF9kbHlfcmVnID0gV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHZhbCA+PSBlLT5pdGVtcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWU6ICVzLCB2YWw6IDB4JXhcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHZhbCk7CisKKwlpZiAoZS0+cmVnID09IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzA7CisJZWxzZSBpZiAoZS0+cmVnID09IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzA7CisJZWxzZSBpZiAoZS0+cmVnID09IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzA7CisKKwkvKiBTZXQgTG9vayBBaGVhZCBEZWxheSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxvb2tfYWhlYWRfZGx5X3JlZywKKwkJCSAgICAweDA4LCAodmFsID8gMHgwOCA6IDB4MDApKTsKKwkvKiBTZXQgREVNIElOUCBTZWxlY3QgKi8KKwlyZXR1cm4gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOworfQorCitzdGF0aWMgaW50IHRhc2hhX2Vhcl9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1OCBlYXJfcGFfZ2FpbjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCWVhcl9wYV9nYWluID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9FQVIpOworCisJZWFyX3BhX2dhaW4gPSAoZWFyX3BhX2dhaW4gJiAweDcwKSA+PiA0OworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBlYXJfcGFfZ2FpbjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlYXJfcGFfZ2FpbiA9IDB4JXhcbiIsIF9fZnVuY19fLAorCQllYXJfcGFfZ2Fpbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9lYXJfcGFfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggZWFyX3BhX2dhaW47CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gID0gJWxkXG4iLAorCQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCWVhcl9wYV9nYWluID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDw8IDQ7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9FQVIsIDB4NzAsIGVhcl9wYV9nYWluKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9lYXJfc3Brcl9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzaGEtPmVhcl9zcGtyX2dhaW47CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZWFyX3Nwa3JfZ2FpbiA9ICVsZFxuIiwgX19mdW5jX18sCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICA9ICVsZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXRhc2hhLT5lYXJfc3Brcl9nYWluID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29uZmlnX2NvbXBhbmRlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBpbnRlcnBfbiwKKwkJCQkgIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgY29tcDsKKwl1MTYgY29tcF9jdGwwX3JlZywgcnhfcGF0aF9jZmcwX3JlZzsKKworCS8qIEVBUiBkb2VzIG5vdCBoYXZlIGNvbXBhbmRlciAqLworCWlmICghaW50ZXJwX24pCisJCXJldHVybiAwOworCisJY29tcCA9IGludGVycF9uIC0gMTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgY29tcGFuZGVyICVkLCBlbmFibGVkICVkXG4iLAorCQlfX2Z1bmNfXywgZXZlbnQsIGNvbXAgKyAxLCB0YXNoYS0+Y29tcF9lbmFibGVkW2NvbXBdKTsKKworCWlmICghdGFzaGEtPmNvbXBfZW5hYmxlZFtjb21wXSkKKwkJcmV0dXJuIDA7CisKKwljb21wX2N0bDBfcmVnID0gV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEwwICsgKGNvbXAgKiA4KTsKKwlyeF9wYXRoX2NmZzBfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArIChjb21wICogMjApOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKKwkJLyogRW5hYmxlIENvbXBhbmRlciBDbG9jayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAxLCAweDAxKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2NmZzBfcmVnLCAweDAyLCAweDAyKTsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwNCwgMHgwNCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJ4X3BhdGhfY2ZnMF9yZWcsIDB4MDIsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDEsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDA0LCAweDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19jb25maWdfbWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaWR4OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsID0gTlVMTDsKKwlzdHJ1Y3Qgd2NkX21hZF9hdWRpb19jYWwgKm1hZF9jYWwgPSBOVUxMOworCWNvbnN0IHZvaWQgKmRhdGE7CisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBUQVNIQV9NQURfQVVESU9fRklSTVdBUkVfUEFUSDsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzaXplX3QgY2FsX3NpemU7CisKKwlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0YXNoYS0+ZndfZGF0YSwgV0NEOVhYWF9NQURfQ0FMKTsKKwlpZiAoaHdkZXBfY2FsKSB7CisJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCWNhbF9zaXplID0gaHdkZXBfY2FsLT5zaXplOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBjb2RlYy0+ZGV2KTsKKwkJaWYgKHJldCB8fCAhZncpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IE1BRCBmaXJtd2FyZSBhY3F1aXJlIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlkYXRhID0gZnctPmRhdGE7CisJCWNhbF9zaXplID0gZnctPnNpemU7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlIGNhbGlicmF0aW9uXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCWlmIChjYWxfc2l6ZSA8IHNpemVvZigqbWFkX2NhbCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBJbmNvcnJlY3Qgc2l6ZSAlemQgZm9yIE1BRCBDYWwsIGV4cGVjdGVkICV6ZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfc2l6ZSwgc2l6ZW9mKCptYWRfY2FsKSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwltYWRfY2FsID0gKHN0cnVjdCB3Y2RfbWFkX2F1ZGlvX2NhbCAqKSAoZGF0YSk7CisJaWYgKCFtYWRfY2FsKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBjYWxpYnJhdGlvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzIsCisJCSAgICAgIG1hZF9jYWwtPm1pY3JvcGhvbmVfaW5mby5jeWNsZV90aW1lKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMSwgMHhGRiA8PCAzLAorCQkJICAgICgodWludDE2X3QpbWFkX2NhbC0+bWljcm9waG9uZV9pbmZvLnNldHRsZV90aW1lKQorCQkJICAgIDw8IDMpOworCisJLyogQXVkaW8gKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzgsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX29taXRfc2FtcGxlcyk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8xLAorCQkJICAgIDB4MDcgPDwgNCwgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfY29tcF90aW1lIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMiwgMHgwMyA8PCAyLAorCQkJICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzcsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX2RpZmZfdGhyZXNob2xkICYgMHgzRik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF81LAorCQkgICAgICBtYWRfY2FsLT5hdWRpb19pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzYsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKG1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50cyk7CisJICAgICBpZHgrKykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fSUlSX0NUTF9QVFIsCisJCQkJICAgIDB4M0YsIGlkeCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1ZBTCwKKwkJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6TUFEIEF1ZGlvIElJUiBDb2VmWyVkXSA9IDBYJXgiLAorCQkJX19mdW5jX18sIGlkeCwKKwkJCW1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwl9CisKKwkvKiBCZWFjb24gKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF84LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfb21pdF9zYW1wbGVzKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8xLAorCQkJICAgIDB4MDcgPDwgNCwgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX2NvbXBfdGltZSA8PCA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8yLCAweDAzIDw8IDIsCisJCQkgICAgbWFkX2NhbC0+YmVhY29uX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF83LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDFGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF81LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfdGhyZXNob2xkX2xzYik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKG1hZF9jYWwtPmJlYWNvbl9pbmZvLmlpcl9jb2VmZmljaWVudHMpOworCSAgICAgaWR4KyspIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwKKwkJCQkgICAgMHgzRiwgaWR4KTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCwKKwkJCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLmlpcl9jb2VmZmljaWVudHNbaWR4XSk7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOk1BRCBCZWFjb24gSUlSIENvZWZbJWRdID0gMFgleCIsCisJCQlfX2Z1bmNfXywgaWR4LAorCQkJbWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwl9CisKKwkvKiBVbHRyYXNvdW5kICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzEsCisJCQkgICAgMHgwNyA8PCA0LAorCQkJICAgIG1hZF9jYWwtPnVsdHJhc291bmRfaW5mby5ybXNfY29tcF90aW1lIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF8yLCAweDAzIDw8IDIsCisJCQkgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLmRldGVjdGlvbl9tZWNoYW5pc20gPDwgMik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzcsCisJCSAgICAgIG1hZF9jYWwtPnVsdHJhc291bmRfaW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDFGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNSwKKwkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc190aHJlc2hvbGRfbXNiKTsKKworZG9uZToKKwlpZiAoIWh3ZGVwX2NhbCkKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9tYWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCS8qIFJldHVybiBpZiBDUEUgSU5QVVQgaXMgREVDMSAqLworCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1NWQV9DRkcpICYgMHgwMSkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCisJCS8qIFR1cm4gb24gTUFEIGNsayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19NQURfQ1RMLAorCQkJCSAgICAweDAxLCAweDAxKTsKKworCQkvKiBVbmRvIHJlc2V0IGZvciBNQUQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfTUFEX0NUTCwKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisJCXJldCA9IHRhc2hhX2NvZGVjX2NvbmZpZ19tYWQoY29kZWMpOworCQlpZiAocmV0KQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIGNvbmZpZyBNQUQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogUmVzZXQgdGhlIE1BRCBibG9jayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19NQURfQ1RMLAorCQkJCSAgICAweDAyLCAweDAyKTsKKwkJLyogVHVybiBvZmYgTUFEIGNsayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19NQURfQ1RMLAorCQkJCSAgICAweDAxLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19jb25maWd1cmVfY3BlX2lucHV0KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyogQ29uZmlndXJlIENQRSBpbnB1dCBhcyBERUMxICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1NWQV9DRkcsCisJCQkJICAgIDB4MDEsIDB4MDEpOworCisJCS8qIENvbmZpZ3VyZSBERUMxIFR4IG91dCB3aXRoIHNhbXBsZSByYXRlIGFzIDE2SyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DVEwsCisJCQkJICAgIDB4MEYsIDB4MDEpOworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBSZXNldCBERUMxIFR4IG91dCBzYW1wbGUgcmF0ZSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DVEwsCisJCQkJICAgIDB4MEYsIDB4MDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19TVkFfQ0ZHLAorCQkJCSAgICAweDAxLCAweDAwKTsKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2FpZjRfbWl4ZXJfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJZGFwbV9rY29udHJvbF9nZXRfd2xpc3Qoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHRlc3RfYml0KEFJRjRfU1dJVENIX1ZBTFVFLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQUlGNCBzd2l0Y2ggdmFsdWUgPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQUlGNCBzd2l0Y2ggdmFsdWUgPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sCisJCQkJCQlrY29udHJvbCwgMSwgdXBkYXRlKTsKKwkJc2V0X2JpdChBSUY0X1NXSVRDSF9WQUxVRSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwKKwkJCQkJCWtjb250cm9sLCAwLCB1cGRhdGUpOworCQljbGVhcl9iaXQoQUlGNF9TV0lUQ0hfVkFMVUUsICZ0YXNoYV9wLT5zdGF0dXNfbWFzayk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFzaGFfZWFyX3BhX2dhaW5fdGV4dFtdID0geworCSJHXzZfREIiLCAiR180UDVfREIiLCAiR18zX0RCIiwgIkdfMVA1X0RCIiwKKwkiR18wX0RCIiwgIkdfTTJQNV9EQiIsICJVTkRFRklORUQiLCAiR19NMTJfREIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dFtdID0geworCSJHX0RFRkFVTFQiLCAiR18wX0RCIiwgIkdfMV9EQiIsICJHXzJfREIiLCAiR18zX0RCIiwgIkdfNF9EQiIsCisJIkdfNV9EQiIsICJHXzZfREIiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Vhcl9wYV9nYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXNoYV9lYXJfcGFfZ2Fpbl90ZXh0KSwKKwkJCXRhc2hhX2Vhcl9wYV9nYWluX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dCksCisJCQkgICAgdGFzaGFfZWFyX3Nwa3JfcGFfZ2Fpbl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRhc2hhX2FuYWxvZ19nYWluX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJFQVIgUEEgR2FpbiIsIHRhc2hhX2Vhcl9wYV9nYWluX2VudW0sCisJCXRhc2hhX2Vhcl9wYV9nYWluX2dldCwgdGFzaGFfZWFyX3BhX2dhaW5fcHV0KSwKKworCVNPQ19FTlVNX0VYVCgiRUFSIFNQS1IgUEEgR2FpbiIsIHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fZW51bSwKKwkJICAgICB0YXNoYV9lYXJfc3Brcl9wYV9nYWluX2dldCwgdGFzaGFfZWFyX3Nwa3JfcGFfZ2Fpbl9wdXQpLAorCisJU09DX1NJTkdMRV9UTFYoIkhQSEwgVm9sdW1lIiwgV0NEOTMzNV9IUEhfTF9FTiwgMCwgMjAsIDEsCisJCWxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkhQSFIgVm9sdW1lIiwgV0NEOTMzNV9IUEhfUl9FTiwgMCwgMjAsIDEsCisJCWxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQxIFZvbHVtZSIsIFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSLAorCQkJMywgMTYsIDEsIGxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQyIFZvbHVtZSIsIFdDRDkzMzVfRElGRl9MT19MTzJfQ09NUEFOREVSLAorCQkJMywgMTYsIDEsIGxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQzIFZvbHVtZSIsIFdDRDkzMzVfU0VfTE9fTE8zX0dBSU4sIDAsIDIwLCAxLAorCQkJbGluZV9nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiTElORU9VVDQgVm9sdW1lIiwgV0NEOTMzNV9TRV9MT19MTzRfR0FJTiwgMCwgMjAsIDEsCisJCQlsaW5lX2dhaW4pLAorCisJU09DX1NJTkdMRV9UTFYoIkFEQzEgVm9sdW1lIiwgV0NEOTMzNV9BTkFfQU1JQzEsIDAsIDIwLCAwLAorCQkJYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREMyIFZvbHVtZSIsIFdDRDkzMzVfQU5BX0FNSUMyLCAwLCAyMCwgMCwKKwkJCWFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDMyBWb2x1bWUiLCBXQ0Q5MzM1X0FOQV9BTUlDMywgMCwgMjAsIDAsCisJCQlhbmFsb2dfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkFEQzQgVm9sdW1lIiwgV0NEOTMzNV9BTkFfQU1JQzQsIDAsIDIwLCAwLAorCQkJYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREM1IFZvbHVtZSIsIFdDRDkzMzVfQU5BX0FNSUM1LCAwLCAyMCwgMCwKKwkJCWFuYWxvZ19nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDNiBWb2x1bWUiLCBXQ0Q5MzM1X0FOQV9BTUlDNiwgMCwgMjAsIDAsCisJCQlhbmFsb2dfZ2FpbiksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU1JDX0lOX0hQSEwiLCAiU1JDX0lOX0xPMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMxX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU1JDX0lOX0hQSFIiLCAiU1JDX0lOX0xPMiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMyX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU1JDX0lOX0xPMyIsICJTUkNfSU5fU1BLUkwiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGxfc3JjM19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlNSQ19JTl9MTzQiLCAiU1JDX0lOX1NQS1JSIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50MF83X21peF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwKKwkiUlg2IiwgIlJYNyIsICJQUk9YSU1JVFkiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludF9taXhfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWDAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsCisJIlJYNiIsICJSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X3ByaW1fbWl4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiSUlSMCIsICJJSVIxIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwKKwkiUlgzIiwgIlJYNCIsICJSWDUiLCAiUlg2IiwgIlJYNyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcnhfc2lkZXRvbmVfbWl4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJTUkMwIiwgIlNSQzEiLCAiU1JDX1NVTSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYMCIsICJERUMwIiwgIkRFQzBfMTkyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDFfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFgxIiwgIkRFQzEiLCAiREVDMV8xOTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4Ml9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDIiLCAiREVDMiIsICJERUMyXzE5MiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgzX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYMyIsICJERUMzIiwgIkRFQzNfMTkyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDRfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFg0IiwgIkRFQzQiLCAiREVDNF8xOTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4NV9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDUiLCAiREVDNSIsICJERUM1XzE5MiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg2X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYNiIsICJERUM2IiwgIkRFQzZfMTkyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDdfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFg3IiwgIkRFQzciLCAiREVDN18xOTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4OF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDgiLCAiREVDOCIsICJERUM4XzE5MiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg5X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiREVDNyIsICJERUM3XzE5MiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgxMF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRFQzYiLCAiREVDNl8xOTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4MTFfbXV4X3RleHRbXSA9IHsKKwkiREVDXzBfNSIsICJERUNfOV8xMiIsICJNQURfQVVESU8iLCAiTUFEX0JSRENTVCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgxMV9pbnAxX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiREVDMCIsICJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwKKwkiREVDNSIsICJSWF9NSVhfVFg1IiwgIkRFQzlfMTAiLCAiREVDMTFfMTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4MTNfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUM1IiwgIkRFQzVfMTkyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eDEzX2lucF9tdXhfdGV4dFtdID0geworCSJDRENfREVDXzUiLCAiTUFEX0JSRENTVCIsICJDUEVfVFhfUFAiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpcl9pbnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLCAiREVDNSIsICJERUM2IiwKKwkiREVDNyIsICJERUM4IiwJIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludF9kZW1faW5wX211eF90ZXh0W10gPSB7CisJIk5PUk1BTF9EU01fT1VUIiwgIkNMU0hfRFNNX09VVCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDBfaW50ZXJwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlggSU5UMCBNSVgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50MV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQxIE1JWDIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQyX2ludGVycF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYIElOVDIgTUlYMiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDNfaW50ZXJwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlggSU5UMyBNSVgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50NF9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ0IE1JWDIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ1X2ludGVycF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYIElOVDUgTUlYMiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDZfaW50ZXJwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlggSU5UNiBNSVgyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50N19pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ3IE1JWDIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ4X2ludGVycF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYIElOVDggU0VDIE1JWCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWFkX3NlbF90ZXh0W10gPSB7CisJIlNQRSIsICJNU00iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkY19tdXhfdGV4dFtdID0geworCSJETUlDIiwgIkFNSUMiLCAiQU5DX0ZCX1RVTkUxIiwgIkFOQ19GQl9UVU5FMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZG1pY19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwgIkRNSUM0IiwgIkRNSUM1IiwKKwkiU01JQzAiLCAiU01JQzEiLCAiU01JQzIiLCAiU01JQzMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRtaWNfbXV4X2FsdF90ZXh0W10gPSB7CisJIlpFUk8iLCAiRE1JQzAiLCAiRE1JQzEiLCAiRE1JQzIiLCAiRE1JQzMiLCAiRE1JQzQiLCAiRE1JQzUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbWljX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQURDMSIsICJBREMyIiwgIkFEQzMiLCAiQURDNCIsICJBREM1IiwgIkFEQzYiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2VjaG9fbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVgwIiwgIlJYX01JWDEiLCAiUlhfTUlYMiIsICJSWF9NSVgzIiwgIlJYX01JWDQiLAorCSJSWF9NSVg1IiwgIlJYX01JWDYiLCAiUlhfTUlYNyIsICJSWF9NSVg4IiwgIlJYX01JWF9WQkFUNSIsCisJIlJYX01JWF9WQkFUNiIsCSJSWF9NSVhfVkJBVDciLCAiUlhfTUlYX1ZCQVQ4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMwX2ZiX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQU5DX0lOX0hQSEwiLCAiQU5DX0lOX0VBUiIsICJBTkNfSU5fRUFSX1NQS1IiLAorCSJBTkNfSU5fTE8xIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMxX2ZiX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQU5DX0lOX0hQSFIiLCAiQU5DX0lOX0xPMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX211eF90ZXh0W10gPSB7CisJIk9GRiIsICJPTiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwbF9zcmMwX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzAsIDAsIDMsCisJCQlzcGxfc3JjMF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BsX3NyYzFfbXV4X2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NQTElORV9TUkNfQ0ZHMCwgMiwgMywKKwkJCXNwbF9zcmMxX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGxfc3JjMl9tdXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX1NSQ19DRkcwLCA0LCAzLAorCQkJc3BsX3NyYzJfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwbF9zcmMzX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzAsIDYsIDMsCisJCQlzcGxfc3JjM19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF8yX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDAsIDEwLAorCQkJcnhfaW50MF83X21peF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV8yX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDAsIDksCisJCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyXzJfbXV4X2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSwgMCwgOSwKKwkJCXJ4X2ludF9taXhfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDNfMl9tdXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAwLCA5LAorCQkJcnhfaW50X21peF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF8yX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDAsIDksCisJCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ1XzJfbXV4X2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMSwgMCwgOSwKKwkJCXJ4X2ludF9taXhfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDZfMl9tdXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcxLCAwLCA5LAorCQkJcnhfaW50X21peF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N18yX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDAsIDEwLAorCQkJcnhfaW50MF83X21peF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF8yX211eF9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDAsIDksCisJCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpbnQxXzFfbmF0aXZlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUobmF0aXZlX211eF90ZXh0KSwKKwkJCW5hdGl2ZV9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaW50Ml8xX25hdGl2ZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCBBUlJBWV9TSVpFKG5hdGl2ZV9tdXhfdGV4dCksCisJCQluYXRpdmVfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGludDNfMV9uYXRpdmVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFNORF9TT0NfTk9QTSwgMCwgQVJSQVlfU0laRShuYXRpdmVfbXV4X3RleHQpLAorCQkJbmF0aXZlX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpbnQ0XzFfbmF0aXZlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUobmF0aXZlX211eF90ZXh0KSwKKwkJCW5hdGl2ZV9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQwXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDBfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQxXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDFfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDJfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M18xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQzXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDNfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ0XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDRfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NV8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ1XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNV9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDVfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Nl8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ2XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDZfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ2X0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N18xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ3XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDdfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF8xX21peF9pbnAwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMCwgMCwgMTMsCisJCQlyeF9wcmltX21peF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ4XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwLCA0LCAxMywKKwkJCXJ4X3ByaW1fbWl4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDhfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDQsIDEzLAorCQkJcnhfcHJpbV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDAsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDIsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDQsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M19zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDYsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDAsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N19zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDIsIDQsCisJCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDBfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgMCwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgMCwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDJfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSwgMCwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDNfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgMCwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDRfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDVfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDZfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDdfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDhfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDEwX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwLCA2LCA0LAorCQkJYWRjX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hZGNfbXV4MTFfY2hhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDYsIDQsCisJCQlhZGNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FkY19tdXgxMl9jaGFpbl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgNiwgNCwKKwkJCWFkY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDEzX2NoYWluX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwLCA2LCA0LAorCQkJYWRjX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDBfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCwgMywgMTEsCisJCQlkbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCwgMywgMTEsCisJCQlkbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMywgMTEsCisJCQlkbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCwgMywgMTEsCisJCQlkbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDZfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDdfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDEwX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwLCAzLCA3LAorCQkJZG1pY19tdXhfYWx0X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2RtaWNfbXV4MTFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDMsIDcsCisJCQlkbWljX211eF9hbHRfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfZG1pY19tdXgxMl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMywgNywKKwkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDEzX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwLCAzLCA3LAorCQkJZG1pY19tdXhfYWx0X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAwLCA3LAorCQkJYW1pY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXgxX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAsIDAsIDcsCisJCQlhbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMCwgNywKKwkJCWFtaWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4M19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAwLCA3LAorCQkJYW1pY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXg0X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAsIDAsIDcsCisJCQlhbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMCwgNywKKwkJCWFtaWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4Nl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwLCAwLCA3LAorCQkJYW1pY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXg3X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAsIDAsIDcsCisJCQlhbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMCwgNywKKwkJCWFtaWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MTBfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsIDAsIDcsCisJCQlhbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDExX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwLCAwLCA3LAorCQkJYW1pY19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXgxMl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMCwgNywKKwkJCWFtaWNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MTNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsIDAsIDcsCisJCQlhbWljX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDAsIDQsCisJCQlzYl90eDBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgMiwgNCwKKwkJCXNiX3R4MV9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHgyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLCA0LCA0LAorCQkJc2JfdHgyX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDNfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDYsIDQsCisJCQlzYl90eDNfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4NF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgMCwgNCwKKwkJCXNiX3R4NF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg1X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxLCAyLCA0LAorCQkJc2JfdHg1X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDZfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsIDQsIDQsCisJCQlzYl90eDZfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4N19tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgNiwgNCwKKwkJCXNiX3R4N19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAwLCA0LAorCQkJc2JfdHg4X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDlfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDIsIDMsCisJCQlzYl90eDlfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MTBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDQsIDMsCisJCQlzYl90eDEwX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDExX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDExX0lOUF9DRkcsIDAsIDQsCisJCQlzYl90eDExX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDExX2lucDFfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMsIDAsIDEwLAorCQkJc2JfdHgxMV9pbnAxX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDEzX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczLCA0LCAzLAorCQkJc2JfdHgxM19tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHgxM19pbnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTNfSU5QX0NGRywgMCwgMywKKwkJCXR4MTNfaW5wX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgwX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCwgMCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgxX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCwgNCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgMCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgzX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgNCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg0X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMiwgMCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg1X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMiwgNCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg2X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMywgMCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg3X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMywgNCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg4X211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCwgMCwgMTQsCisJCQlyeF9lY2hvX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIwX2lucDBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwLCAwLCAxOCwKKwkJCWlpcl9pbnBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjBfaW5wMV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEsIDAsIDE4LAorCQkJaWlyX2lucF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMF9pbnAyX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMiwgMCwgMTgsCisJCQlpaXJfaW5wX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIwX2lucDNfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczLCAwLCAxOCwKKwkJCWlpcl9pbnBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wMF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzAsIDAsIDE4LAorCQkJaWlyX2lucF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMV9pbnAxX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMSwgMCwgMTgsCisJCQlpaXJfaW5wX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIxX2lucDJfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyLCAwLCAxOCwKKwkJCWlpcl9pbnBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wM19tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMsIDAsIDE4LAorCQkJaWlyX2lucF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9kZW1faW5wX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCwgMCwKKwkJCUFSUkFZX1NJWkUocnhfaW50X2RlbV9pbnBfbXV4X3RleHQpLAorCQkJcnhfaW50X2RlbV9pbnBfbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDFfZGVtX2lucF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDAsCisJCQlBUlJBWV9TSVpFKHJ4X2ludF9kZW1faW5wX211eF90ZXh0KSwKKwkJCXJ4X2ludF9kZW1faW5wX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyX2RlbV9pbnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAwLAorCQkJQVJSQVlfU0laRShyeF9pbnRfZGVtX2lucF9tdXhfdGV4dCksCisJCQlyeF9pbnRfZGVtX2lucF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQwX2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQxX2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQyX2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M19pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQzX2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQ0X2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NV9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQ1X2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Nl9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQ2X2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N19pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQ3X2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF9pbnRlcnBfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEwsIDUsIDIsCisJCQlyeF9pbnQ4X2ludGVycF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWFkX3NlbF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DUEVfU1NfQ0ZHLCAwLCAyLCBtYWRfc2VsX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFuYzBfZmJfbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX0FOQ19DRkcwLCAwLCA1LAorCQkJYW5jMF9mYl9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYW5jMV9mYl9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzAsIDMsIDMsCisJCQlhbmMxX2ZiX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfZGVtX2lucF9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQwIERFTSBNVVggTXV4IiwgcnhfaW50MF9kZW1faW5wX211eF9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfZGVtX2lucF9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQxIERFTSBNVVggTXV4IiwgcnhfaW50MV9kZW1faW5wX211eF9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfZGVtX2lucF9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQyIERFTSBNVVggTXV4IiwgcnhfaW50Ml9kZW1faW5wX211eF9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMwX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1BMIFNSQzAgTVVYIE11eCIsIHNwbF9zcmMwX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMxX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1BMIFNSQzEgTVVYIE11eCIsIHNwbF9zcmMxX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMyX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1BMIFNSQzIgTVVYIE11eCIsIHNwbF9zcmMyX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMzX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1BMIFNSQzMgTVVYIE11eCIsIHNwbF9zcmMzX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDBfMiBNVVggTXV4IiwgcnhfaW50MF8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDFfMiBNVVggTXV4IiwgcnhfaW50MV8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMiBNVVggTXV4IiwgcnhfaW50Ml8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDNfMiBNVVggTXV4IiwgcnhfaW50M18yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDRfMiBNVVggTXV4IiwgcnhfaW50NF8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDVfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDVfMiBNVVggTXV4IiwgcnhfaW50NV8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDZfMiBNVVggTXV4IiwgcnhfaW50Nl8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDdfMiBNVVggTXV4IiwgcnhfaW50N18yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDhfMiBNVVggTXV4IiwgcnhfaW50OF8yX211eF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDFfMV9uYXRpdmVfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQxXzEgTkFUSVZFIE1VWCBNdXgiLCBpbnQxXzFfbmF0aXZlX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50Ml8xX25hdGl2ZV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMSBOQVRJVkUgTVVYIE11eCIsIGludDJfMV9uYXRpdmVfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQzXzFfbmF0aXZlX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UM18xIE5BVElWRSBNVVggTXV4IiwgaW50M18xX25hdGl2ZV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDRfMV9uYXRpdmVfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ0XzEgTkFUSVZFIE1VWCBNdXgiLCBpbnQ0XzFfbmF0aXZlX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MF8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UMF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQwXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQwXzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQwXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDBfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDBfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50MF8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MV8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UMV8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQxXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxXzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQxXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDFfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDFfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50MV8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Ml8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UMl8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQyXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQyXzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQyXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDJfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50Ml8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50M18xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UM18xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQzXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQzXzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQzXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDNfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDNfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50M18xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NF8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ0XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ0XzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ0XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDRfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDRfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50NF8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNV8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ1XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ1XzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ1XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDVfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDVfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDVfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50NV8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Nl8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNl8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ2XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2XzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ2XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDZfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDZfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50Nl8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50N18xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UN18xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ3XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ3XzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDdfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDdfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50N18xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50OF8xX21peF9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UOF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ4XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ4XzFfbWl4X2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDhfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfMV9taXhfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDhfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50OF8xX21peF9pbnAyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MF9taXgyX2lucF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDAgTUlYMiBJTlAgTXV4IiwgcnhfaW50MF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxX21peDJfaW5wX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UMSBNSVgyIElOUCBNdXgiLCByeF9pbnQxX3NpZGV0b25lX21peF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfbWl4Ml9pbnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQyIE1JWDIgSU5QIE11eCIsIHJ4X2ludDJfc2lkZXRvbmVfbWl4X2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50M19taXgyX2lucF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDMgTUlYMiBJTlAgTXV4IiwgcnhfaW50M19zaWRldG9uZV9taXhfY2hhaW5fZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ0X21peDJfaW5wX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNCBNSVgyIElOUCBNdXgiLCByeF9pbnQ0X3NpZGV0b25lX21peF9jaGFpbl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfbWl4Ml9pbnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ3IE1JWDIgSU5QIE11eCIsIHJ4X2ludDdfc2lkZXRvbmVfbWl4X2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDAgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMCBNdXgiLCB0eF9hZGNfbXV4MF9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMSBNdXgiLCB0eF9hZGNfbXV4MV9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDIgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMiBNdXgiLCB0eF9hZGNfbXV4Ml9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDMgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMyBNdXgiLCB0eF9hZGNfbXV4M19jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDQgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNCBNdXgiLCB0eF9hZGNfbXV4NF9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDUgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNSBNdXgiLCB0eF9hZGNfbXV4NV9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDYgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNiBNdXgiLCB0eF9hZGNfbXV4Nl9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDcgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNyBNdXgiLCB0eF9hZGNfbXV4N19jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYOCBNdXgiLCB0eF9hZGNfbXV4OF9jaGFpbl9lbnVtLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAorCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEwID0KKwlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTAgTXV4IiwgdHhfYWRjX211eDEwX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDExID0KKwlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTEgTXV4IiwgdHhfYWRjX211eDExX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEyID0KKwlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTIgTXV4IiwgdHhfYWRjX211eDEyX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEzID0KKwlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTMgTXV4IiwgdHhfYWRjX211eDEzX2NoYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgwID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDAgTXV4IiwgdHhfZG1pY19tdXgwX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDEgTXV4IiwgdHhfZG1pY19tdXgxX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgyID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDIgTXV4IiwgdHhfZG1pY19tdXgyX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgzID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDMgTXV4IiwgdHhfZG1pY19tdXgzX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg0ID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDQgTXV4IiwgdHhfZG1pY19tdXg0X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg1ID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDUgTXV4IiwgdHhfZG1pY19tdXg1X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg2ID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDYgTXV4IiwgdHhfZG1pY19tdXg2X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg3ID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDcgTXV4IiwgdHhfZG1pY19tdXg3X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg4ID0KKwlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDggTXV4IiwgdHhfZG1pY19tdXg4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMCA9CisJU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMCBNdXgiLCB0eF9kbWljX211eDEwX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMSA9CisJU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMSBNdXgiLCB0eF9kbWljX211eDExX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMiA9CisJU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMiBNdXgiLCB0eF9kbWljX211eDEyX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMyA9CisJU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMyBNdXgiLCB0eF9kbWljX211eDEzX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgwID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDAgTXV4IiwgdHhfYW1pY19tdXgwX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDEgTXV4IiwgdHhfYW1pY19tdXgxX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgyID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDIgTXV4IiwgdHhfYW1pY19tdXgyX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgzID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDMgTXV4IiwgdHhfYW1pY19tdXgzX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg0ID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDQgTXV4IiwgdHhfYW1pY19tdXg0X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg1ID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDUgTXV4IiwgdHhfYW1pY19tdXg1X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg2ID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDYgTXV4IiwgdHhfYW1pY19tdXg2X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg3ID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDcgTXV4IiwgdHhfYW1pY19tdXg3X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg4ID0KKwlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDggTXV4IiwgdHhfYW1pY19tdXg4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMCA9CisJU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMCBNdXgiLCB0eF9hbWljX211eDEwX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMSA9CisJU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMSBNdXgiLCB0eF9hbWljX211eDExX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMiA9CisJU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMiBNdXgiLCB0eF9hbWljX211eDEyX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMyA9CisJU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMyBNdXgiLCB0eF9hbWljX211eDEzX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgwX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDAgTVVYIE11eCIsIHNiX3R4MF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYMSBNVVggTXV4Iiwgc2JfdHgxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4Ml9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFgyIE1VWCBNdXgiLCBzYl90eDJfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgzX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDMgTVVYIE11eCIsIHNiX3R4M19tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDRfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYNCBNVVggTXV4Iiwgc2JfdHg0X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4NV9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg1IE1VWCBNdXgiLCBzYl90eDVfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg2X211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDYgTVVYIE11eCIsIHNiX3R4Nl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDdfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYNyBNVVggTXV4Iiwgc2JfdHg3X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4OF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg4IE1VWCBNdXgiLCBzYl90eDhfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg5X211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDkgTVVYIE11eCIsIHNiX3R4OV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDEwX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDEwIE1VWCBNdXgiLCBzYl90eDEwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4MTFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTTElNIFRYMTEgTVVYIE11eCIsIHNiX3R4MTFfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgxMV9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDExIElOUDEgTVVYIE11eCIsIHNiX3R4MTFfaW5wMV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDEzX211eCA9CisJU09DX0RBUE1fRU5VTSgiU0xJTSBUWDEzIE1VWCBNdXgiLCBzYl90eDEzX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4MTNfaW5wX211eCA9CisJU09DX0RBUE1fRU5VTSgiVFgxMyBJTlAgTVVYIE11eCIsIHR4MTNfaW5wX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgwIE1VWCBNdXgiLCByeF9taXhfdHgwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgxIE1VWCBNdXgiLCByeF9taXhfdHgxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgyIE1VWCBNdXgiLCByeF9taXhfdHgyX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDNfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgzIE1VWCBNdXgiLCByeF9taXhfdHgzX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDRfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg0IE1VWCBNdXgiLCByeF9taXhfdHg0X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDVfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg1IE1VWCBNdXgiLCByeF9taXhfdHg1X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDZfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg2IE1VWCBNdXgiLCByeF9taXhfdHg2X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDdfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg3IE1VWCBNdXgiLCByeF9taXhfdHg3X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDhfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg4IE1VWCBNdXgiLCByeF9taXhfdHg4X211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjBfaW5wMF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIklJUjAgSU5QMCBNdXgiLCBpaXIwX2lucDBfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMF9pbnAxX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMCBJTlAxIE11eCIsIGlpcjBfaW5wMV9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIwX2lucDJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIwIElOUDIgTXV4IiwgaWlyMF9pbnAyX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjBfaW5wM19tdXggPQorCVNPQ19EQVBNX0VOVU0oIklJUjAgSU5QMyBNdXgiLCBpaXIwX2lucDNfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnAwX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMSBJTlAwIE11eCIsIGlpcjFfaW5wMF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIxX2lucDFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJSVIxIElOUDEgTXV4IiwgaWlyMV9pbnAxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjFfaW5wMl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIklJUjEgSU5QMiBNdXgiLCBpaXIxX2lucDJfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnAzX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUlSMSBJTlAzIE11eCIsIGlpcjFfaW5wM19tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQwX2ludGVycF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDAgSU5URVJQIE11eCIsIHJ4X2ludDBfaW50ZXJwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfaW50ZXJwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UMSBJTlRFUlAgTXV4IiwgcnhfaW50MV9pbnRlcnBfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Ml9pbnRlcnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQyIElOVEVSUCBNdXgiLCByeF9pbnQyX2ludGVycF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQzX2ludGVycF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDMgSU5URVJQIE11eCIsIHJ4X2ludDNfaW50ZXJwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfaW50ZXJwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNCBJTlRFUlAgTXV4IiwgcnhfaW50NF9pbnRlcnBfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV9pbnRlcnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ1IElOVEVSUCBNdXgiLCByeF9pbnQ1X2ludGVycF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2X2ludGVycF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJYIElOVDYgSU5URVJQIE11eCIsIHJ4X2ludDZfaW50ZXJwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfaW50ZXJwX211eCA9CisJU09DX0RBUE1fRU5VTSgiUlggSU5UNyBJTlRFUlAgTXV4IiwgcnhfaW50N19pbnRlcnBfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50OF9pbnRlcnBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSWCBJTlQ4IElOVEVSUCBNdXgiLCByeF9pbnQ4X2ludGVycF9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYWRfc2VsX211eCA9CisJU09DX0RBUE1fRU5VTSgiTUFEX1NFTCBNVVggTXV4IiwgbWFkX3NlbF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfbWFkX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBXQ0Q5MzM1X0NQRV9TU19DRkcsIDUsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWFkX2JyZGNzdF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgV0NEOTMzNV9DUEVfU1NfQ0ZHLCA2LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCQkJMCwgMSwgMCwgdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfZ2V0LAorCQkJdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuY19ocGhsX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2hwaHJfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmNfZWFyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2Vhcl9zcGtyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2xpbmVvdXQxX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2xpbmVvdXQyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX3Nwa3JfcGFfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4MF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXgxX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDJfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4M19zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg0X3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDVfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4Nl9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg3X3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDhfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmMwX2ZiX211eCA9CisJU09DX0RBUE1fRU5VTSgiQU5DMCBGQiBNVVggTXV4IiwgYW5jMF9mYl9tdXhfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmMxX2ZiX211eCA9CisJU09DX0RBUE1fRU5VTSgiQU5DMSBGQiBNVVggTXV4IiwgYW5jMV9mYl9tdXhfZW51bSk7CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfZWNfYnVmX211eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgPSAlZCBuYW1lID0gJXNcbiIsCisJCV9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0VDX0JVRl9JTlRfUEVSSU9ELCAweDNCKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfQ0ZHLCAweDA4LCAweDA4KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLAorCQkJCSAgICAweDA4LCAweDA4KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwKKwkJCQkgICAgMHgwOCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0NGRywgMHgwOCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0VDX0JVRl9JTlRfUEVSSU9ELCAweDAwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVjX2J1Zl9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYTUlYRUMiLCAiU0JfUlgwIiwgIlNCX1JYMSIsICJTQl9SWDIiLCAiU0JfUlgzIiwKKwkiSTJTX1JYX1NEMF9MIiwgIkkyU19SWF9TRDBfUiIsICJJMlNfUlhfU0QxX0wiLCAiSTJTX1JYX1NEMV9SIiwKKwkiREVDMSIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlY19idWZfbXV4X2VudW0sIFdDRDkzMzVfQ1BFX1NTX1VTX0VDX01VWF9DRkcsCisJCQkgICAgMCwgZWNfYnVmX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVjX2J1Zl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIkVDIEJVRiBNdXgiLCBlY19idWZfbXV4X2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdGFzaGFfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU5DIEVBUiIpLAorCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGMSBQQiIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAorCQkJCUFJRjFfUEIsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCisJCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAorCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYyIFBCIiwgIkFJRjIgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sCisJCQkJQUlGMl9QQiwgMCwgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjMgUEIiLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJCQlBSUYzX1BCLCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXJ4LAorCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EIHwKKwkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGNCBQQiIsICJBSUY0IFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAorCQkJCUFJRjRfUEIsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCisJCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAorCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYgTUlYMSBQQiIsICJBSUYgTWl4IFBsYXliYWNrIiwgMCwKKwkJCSAgICAgICBTTkRfU09DX05PUE0sIEFJRl9NSVgxX1BCLCAwLAorCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMCBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYMCwgMCwKKwkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlgwXSksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDEsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYMV0pLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gUlgyIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfUlgyLCAwLAorCQkJCSZzbGltX3J4X211eFtUQVNIQV9SWDJdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMyBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYMywgMCwKKwkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlgzXSksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDQgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDQsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYNF0pLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gUlg1IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfUlg1LCAwLAorCQkJCSZzbGltX3J4X211eFtUQVNIQV9SWDVdKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNiBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYNiwgMCwKKwkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlg2XSksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDcgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDcsIDAsCisJCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYN10pLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlNQTCBTUkMwIE1VWCIsIFNORF9TT0NfTk9QTSwgU1BMSU5FX1NSQzAsIDAsCisJCQkgJnNwbF9zcmMwX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9yZXNhbXBsZXIsCisJCQkgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiU1BMIFNSQzEgTVVYIiwgU05EX1NPQ19OT1BNLCBTUExJTkVfU1JDMSwgMCwKKwkJCSAmc3BsX3NyYzFfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3Jlc2FtcGxlciwKKwkJCSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJTUEwgU1JDMiBNVVgiLCBTTkRfU09DX05PUE0sIFNQTElORV9TUkMyLCAwLAorCQkJICZzcGxfc3JjMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfcmVzYW1wbGVyLAorCQkJIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlNQTCBTUkMzIE1VWCIsIFNORF9TT0NfTk9QTSwgU1BMSU5FX1NSQzMsIDAsCisJCQkgJnNwbF9zcmMzX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9yZXNhbXBsZXIsCisJCQkgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQwXzIgTVVYIiwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCwKKwkJCTUsIDAsICZyeF9pbnQwXzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMV8yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwsCisJCQk1LCAwLCAmcnhfaW50MV8yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDJfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMLAorCQkJNSwgMCwgJnJ4X2ludDJfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKKwkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzIgTVVYIiwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTCwKKwkJCTUsIDAsICZyeF9pbnQzXzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNF8yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEwsCisJCQk1LCAwLCAmcnhfaW50NF8yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDVfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMLAorCQkJNSwgMCwgJnJ4X2ludDVfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKKwkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ2XzIgTVVYIiwgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTCwKKwkJCTUsIDAsICZyeF9pbnQ2XzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwsCisJCQk1LCAwLCAmcnhfaW50N18yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLAorCQkJNSwgMCwgJnJ4X2ludDhfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKKwkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50MF8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMF8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDBfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDBfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQwXzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50MV8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMV8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDFfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDFfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQxXzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50Ml8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMl8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDJfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDJfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQyXzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50M18xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UM18xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDNfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDNfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQzXzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50NF8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNF8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDRfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDRfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ0XzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50NV8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNV8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDVfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDVfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ1XzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50Nl8xX21peF9pbnAwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNl8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDZfMV9taXhfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDZfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ2XzFfbWl4X2lucDJfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDdfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ3XzFfbWl4X2lucDBfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3dyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50N18xX21peF9pbnAxX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3N3ciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDdfMV9taXhfaW5wMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zd3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ4XzFfbWl4X2lucDBfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3dyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50OF8xX21peF9pbnAxX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3N3ciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UOF8xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDhfMV9taXhfaW5wMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zd3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDFfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU1BMSU5FIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXJ4X2ludDFfc3BsaW5lX21peF9zd2l0Y2gsCisJCQlBUlJBWV9TSVpFKHJ4X2ludDFfc3BsaW5lX21peF9zd2l0Y2gpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyXzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlyeF9pbnQyX3NwbGluZV9taXhfc3dpdGNoLAorCQkJQVJSQVlfU0laRShyeF9pbnQyX3NwbGluZV9taXhfc3dpdGNoKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UM18xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJcnhfaW50M19zcGxpbmVfbWl4X3N3aXRjaCwKKwkJCUFSUkFZX1NJWkUocnhfaW50M19zcGxpbmVfbWl4X3N3aXRjaCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDRfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU1BMSU5FIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXJ4X2ludDRfc3BsaW5lX21peF9zd2l0Y2gsCisJCQlBUlJBWV9TSVpFKHJ4X2ludDRfc3BsaW5lX21peF9zd2l0Y2gpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1IFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlyeF9pbnQ1X3NwbGluZV9taXhfc3dpdGNoLAorCQkJQVJSQVlfU0laRShyeF9pbnQ1X3NwbGluZV9taXhfc3dpdGNoKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlyeF9pbnQ2X3NwbGluZV9taXhfc3dpdGNoLAorCQkJQVJSQVlfU0laRShyeF9pbnQ2X3NwbGluZV9taXhfc3dpdGNoKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJcnhfaW50N19zcGxpbmVfbWl4X3N3aXRjaCwKKwkJCUFSUkFZX1NJWkUocnhfaW50N19zcGxpbmVfbWl4X3N3aXRjaCkpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ4XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ4IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOCBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJcnhfaW50OF9zcGxpbmVfbWl4X3N3aXRjaCwKKwkJCUFSUkFZX1NJWkUocnhfaW50OF9zcGxpbmVfbWl4X3N3aXRjaCkpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQwIE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMSBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDIgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQzIE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNCBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDUgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCU5VTEwsIDAsIHRhc2hhX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UOCBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCU5VTEwsIDAsIHRhc2hhX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWCBJTlQ1IFZCQVQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlyeF9pbnQ1X3ZiYXRfbWl4X3N3aXRjaCwKKwkJCUFSUkFZX1NJWkUocnhfaW50NV92YmF0X21peF9zd2l0Y2gpLAorCQkJdGFzaGFfY29kZWNfdmJhdF9lbmFibGVfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDYgVkJBVCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXJ4X2ludDZfdmJhdF9taXhfc3dpdGNoLAorCQkJQVJSQVlfU0laRShyeF9pbnQ2X3ZiYXRfbWl4X3N3aXRjaCksCisJCQl0YXNoYV9jb2RlY192YmF0X2VuYWJsZV9ldmVudCwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBWQkFUIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJcnhfaW50N192YmF0X21peF9zd2l0Y2gsCisJCQlBUlJBWV9TSVpFKHJ4X2ludDdfdmJhdF9taXhfc3dpdGNoKSwKKwkJCXRhc2hhX2NvZGVjX3ZiYXRfZW5hYmxlX2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWCBJTlQ4IFZCQVQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlyeF9pbnQ4X3ZiYXRfbWl4X3N3aXRjaCwKKwkJCUFSUkFZX1NJWkUocnhfaW50OF92YmF0X21peF9zd2l0Y2gpLAorCQkJdGFzaGFfY29kZWNfdmJhdF9lbmFibGVfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQwIE1JWDIgSU5QIiwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMSwgNCwKKwkJCSAgIDAsICZyeF9pbnQwX21peDJfaW5wX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMSBNSVgyIElOUCIsIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEsIDQsCisJCQkgICAwLCAmcnhfaW50MV9taXgyX2lucF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDIgTUlYMiBJTlAiLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxLCA0LAorCQkJICAgMCwgJnJ4X2ludDJfbWl4Ml9pbnBfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQzIE1JWDIgSU5QIiwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSwgNCwKKwkJCSAgIDAsICZyeF9pbnQzX21peDJfaW5wX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNCBNSVgyIElOUCIsIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEsIDQsCisJCQkgICAwLCAmcnhfaW50NF9taXgyX2lucF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDcgTUlYMiBJTlAiLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcxLCA0LAorCQkJICAgMCwgJnJ4X2ludDdfbWl4Ml9pbnBfbXV4KSwKKworCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgwIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgwLCAwLAorCQkmc2JfdHgwX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEsIDAsCisJCSZzYl90eDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYMiBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMiwgMCwKKwkJJnNiX3R4Ml9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgzIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgzLCAwLAorCQkmc2JfdHgzX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDQgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDQsIDAsCisJCSZzYl90eDRfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYNSBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNSwgMCwKKwkJJnNiX3R4NV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFg2IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg2LCAwLAorCQkmc2JfdHg2X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDcgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDcsIDAsCisJCSZzYl90eDdfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYOCBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYOCwgMCwKKwkJJnNiX3R4OF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFg5IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg5LCAwLAorCQkmc2JfdHg5X211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEwIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMCwgMCwKKwkJJnNiX3R4MTBfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYMTEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDExLCAwLAorCQkmc2JfdHgxMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgxMSBJTlAxIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMSwgMCwKKwkJJnNiX3R4MTFfaW5wMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgxMyBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDAsCisJCSZzYl90eDEzX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiVFgxMyBJTlAgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICZ0eDEzX2lucF9tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMCIsIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NUTCwgNSwgMCwKKwkJCSAgICZ0eF9hZGNfbXV4MCwgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEiLCBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DVEwsIDUsIDAsCisJCQkgICAmdHhfYWRjX211eDEsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgyIiwgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkJICAgJnR4X2FkY19tdXgyLCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMyIsIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NUTCwgNSwgMCwKKwkJCSAgICZ0eF9hZGNfbXV4MywgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDQiLCBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DVEwsIDUsIDAsCisJCQkgICAmdHhfYWRjX211eDQsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg1IiwgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkJICAgJnR4X2FkY19tdXg1LCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNiIsIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NUTCwgNSwgMCwKKwkJCSAgICZ0eF9hZGNfbXV4NiwgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDciLCBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DVEwsIDUsIDAsCisJCQkgICAmdHhfYWRjX211eDcsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg4IiwgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkJICAgJnR4X2FkY19tdXg4LCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDEwLCAwLAorCQkJICZ0eF9hZGNfbXV4MTAsIHRhc2hhX2NvZGVjX3R4X2FkY19jZmcsCisJCQkgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAxMSwgMCwKKwkJCSAmdHhfYWRjX211eDExLCB0YXNoYV9jb2RlY190eF9hZGNfY2ZnLAorCQkJIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMTIsIDAsCisJCQkgJnR4X2FkY19tdXgxMiwgdGFzaGFfY29kZWNfdHhfYWRjX2NmZywKKwkJCSBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDEzLCAwLAorCQkJICZ0eF9hZGNfbXV4MTMsIHRhc2hhX2NvZGVjX3R4X2FkY19jZmcsCisJCQkgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2RtaWNfbXV4MCksCisJU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfZG1pY19tdXgxKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9kbWljX211eDIpLAorCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2RtaWNfbXV4MyksCisJU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfZG1pY19tdXg0KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9kbWljX211eDUpLAorCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2RtaWNfbXV4NiksCisJU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfZG1pY19tdXg3KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9kbWljX211eDgpLAorCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9kbWljX211eDEwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfZG1pY19tdXgxMSksCisJU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2RtaWNfbXV4MTIpLAorCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9kbWljX211eDEzKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2FtaWNfbXV4MCksCisJU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfYW1pY19tdXgxKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9hbWljX211eDIpLAorCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2FtaWNfbXV4MyksCisJU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfYW1pY19tdXg0KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9hbWljX211eDUpLAorCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2FtaWNfbXV4NiksCisJU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfYW1pY19tdXg3KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9hbWljX211eDgpLAorCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9hbWljX211eDEwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHhfYW1pY19tdXgxMSksCisJU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR4X2FtaWNfbXV4MTIpLAorCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0eF9hbWljX211eDEzKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiQURDMSIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMxLCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDMiIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMyLCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDMyIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMzLCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDNCIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM0LCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDNSIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM1LCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDNiIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM2LCA3LCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUlggSU5UMSBOQVRJVkUgU1VQUExZIiwgU05EX1NPQ19OT1BNLAorCQkJICAgIElOVEVSUF9IUEhMLCAwLCB0YXNoYV9lbmFibGVfbmF0aXZlX3N1cHBseSwKKwkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDIgTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKKwkJCSAgICBJTlRFUlBfSFBIUiwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQzIE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCisJCQkgICAgSU5URVJQX0xPMSwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ0IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCisJCQkgICAgSU5URVJQX0xPMiwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMxIiksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0YXNoYV9jb2RlY19lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgICAgdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXMsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVM0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzLAorCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMyX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKKwkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NVUFBMWShEQVBNX0xET19IX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbGRvX2gsCisJCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWCgiQU5DMCBGQiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhbmMwX2ZiX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiQU5DMSBGQiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhbmMxX2ZiX211eCksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMyIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDMyIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzQiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUM1IiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDNiIpLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMSBDQVAiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAorCQlBSUYxX0NBUCwgMCwgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjIgQ0FQIiwgIkFJRjIgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGMl9DQVAsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHgsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUYzIENBUCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCisJCUFJRjNfQ0FQLCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGNCBWSSIsICJWSWZlZWQiLCAwLCBTTkRfU09DX05PUE0sCisJCUFJRjRfVklGRUVELCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrLAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9WSSBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9WSUZFRUQsIDAsCisJCWFpZjRfdmlfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmNF92aV9taXhlcikpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUYxX0NBUCBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGMV9DQVAsIDAsCisJCWFpZjFfY2FwX21peGVyLCBBUlJBWV9TSVpFKGFpZjFfY2FwX21peGVyKSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjJfQ0FQIE1peGVyIiwgU05EX1NPQ19OT1BNLCBBSUYyX0NBUCwgMCwKKwkJYWlmMl9jYXBfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmMl9jYXBfbWl4ZXIpKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiQUlGM19DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjNfQ0FQLCAwLAorCQlhaWYzX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYzX2NhcF9taXhlcikpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUY0X01BRCBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9NQURfVFgsIDAsCisJCWFpZjRfbWFkX21peGVyLCBBUlJBWV9TSVpFKGFpZjRfbWFkX21peGVyKSksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlZJSU5QVVQiKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUY1IENQRSIsICJBSUY1IENQRSBUWCIsIDAsIFNORF9TT0NfTk9QTSwKKwkJCSAgICAgQUlGNV9DUEVfVFgsIDApLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJFQyBCVUYgTVVYIElOUCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmVjX2J1Zl9tdXgsCisJCXRhc2hhX2NvZGVjX2VjX2J1Zl9tdXhfZW5hYmxlLAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyogRGlnaXRhbCBNaWMgSW5wdXRzICovCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGFzaGFfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzEiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMyIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXNoYV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMyIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGFzaGFfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzQiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUM1IiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXNoYV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWCgiSUlSMCBJTlAwIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjBfaW5wMF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIklJUjAgSU5QMSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIwX2lucDFfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIwIElOUDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMF9pbnAyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiSUlSMCBJTlAzIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjBfaW5wM19tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIklJUjEgSU5QMCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIxX2lucDBfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnAxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiSUlSMSBJTlAyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjFfaW5wMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIklJUjEgSU5QMyBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIxX2lucDNfbXV4KSwKKworCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIwIiwgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwsCisJCQkgICAgIDQsIDAsIE5VTEwsIDAsIHRhc2hhX2NvZGVjX3NldF9paXJfZ2FpbiwKKwkJCSAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIxIiwgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsCisJCQkgICAgIDQsIDAsIE5VTEwsIDAsIHRhc2hhX2NvZGVjX3NldF9paXJfZ2FpbiwKKwkJCSAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1JDMCIsIFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMLAorCQkJICAgICA0LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNSQzEiLCBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwKKwkJCSAgICAgNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIkNQRSBJTiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQljcGVfaW5fbWl4X3N3aXRjaCwKKwkJCQlBUlJBWV9TSVpFKGNwZV9pbl9taXhfc3dpdGNoKSwKKwkJCQl0YXNoYV9jb2RlY19jb25maWd1cmVfY3BlX2lucHV0LAorCQkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDFfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmaW50MV8xX25hdGl2ZV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDJfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmaW50Ml8xX25hdGl2ZV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDNfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmaW50M18xX25hdGl2ZV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDRfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmaW50NF8xX25hdGl2ZV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDAgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4MF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4MV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4Ml9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4M19tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDQgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4NF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4NV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDYgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4Nl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDcgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4N19tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDggTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfbWl4X3R4OF9tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMCBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50MF9kZW1faW5wX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMSBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50MV9kZW1faW5wX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMiBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50Ml9kZW1faW5wX211eCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDAgSU5URVJQIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfRUFSLCAwLCAmcnhfaW50MF9pbnRlcnBfbXV4LAorCQl0YXNoYV9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQxIElOVEVSUCIsIFNORF9TT0NfTk9QTSwKKwkJSU5URVJQX0hQSEwsIDAsICZyeF9pbnQxX2ludGVycF9tdXgsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDIgSU5URVJQIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfSFBIUiwgMCwgJnJ4X2ludDJfaW50ZXJwX211eCwKKwkJdGFzaGFfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMyBJTlRFUlAiLCBTTkRfU09DX05PUE0sCisJCUlOVEVSUF9MTzEsIDAsICZyeF9pbnQzX2ludGVycF9tdXgsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDQgSU5URVJQIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfTE8yLCAwLCAmcnhfaW50NF9pbnRlcnBfbXV4LAorCQl0YXNoYV9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ1IElOVEVSUCIsIFNORF9TT0NfTk9QTSwKKwkJSU5URVJQX0xPMywgMCwgJnJ4X2ludDVfaW50ZXJwX211eCwKKwkJdGFzaGFfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNiBJTlRFUlAiLCBTTkRfU09DX05PUE0sCisJCUlOVEVSUF9MTzQsIDAsICZyeF9pbnQ2X2ludGVycF9tdXgsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDcgSU5URVJQIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfU1BLUjEsIDAsICZyeF9pbnQ3X2ludGVycF9tdXgsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDggSU5URVJQIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfU1BLUjIsIDAsICZyeF9pbnQ4X2ludGVycF9tdXgsCisJCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMCBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIHRhc2hhX2NvZGVjX2Vhcl9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMSBEQUMiLCBOVUxMLCBXQ0Q5MzM1X0FOQV9IUEgsCisJCTUsIDAsIHRhc2hhX2NvZGVjX2hwaGxfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDIgREFDIiwgTlVMTCwgV0NEOTMzNV9BTkFfSFBILAorCQk0LCAwLCB0YXNoYV9jb2RlY19ocGhyX2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQzIERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgdGFzaGFfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDQgREFDIiwgTlVMTCwgU05EX1NPQ19OT1BNLAorCQkwLCAwLCB0YXNoYV9jb2RlY19saW5lb3V0X2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UNSBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIHRhc2hhX2NvZGVjX2xpbmVvdXRfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQ2IERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgdGFzaGFfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSEwgUEEiLCBXQ0Q5MzM1X0FOQV9IUEgsIDcsIDAsIE5VTEwsIDAsCisJCQkgICB0YXNoYV9jb2RlY19lbmFibGVfaHBobF9wYSwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSFIgUEEiLCBXQ0Q5MzM1X0FOQV9IUEgsIDYsIDAsIE5VTEwsIDAsCisJCQkgICB0YXNoYV9jb2RlY19lbmFibGVfaHBocl9wYSwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkVBUiBQQSIsIFdDRDkzMzVfQU5BX0VBUiwgNywgMCwgTlVMTCwgMCwKKwkJCSAgIHRhc2hhX2NvZGVjX2VuYWJsZV9lYXJfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQxIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLCA3LCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQyIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLCA2LCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQzIFBBIiwgV0NEOTMzNV9BTkFfTE9fM180LCA3LCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQ0IFBBIiwgV0NEOTMzNV9BTkFfTE9fM180LCA2LCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBFQVIgUEEiLCBXQ0Q5MzM1X0FOQV9FQVIsIDcsIDAsIE5VTEwsIDAsCisJCQkgICB0YXNoYV9jb2RlY19lbmFibGVfZWFyX3BhLAorCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBIUEhMIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2hwaGxfcGEsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJBTkMgSFBIUiBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKKwkJCSAgIHRhc2hhX2NvZGVjX2VuYWJsZV9ocGhyX3BhLAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIExJTkVPVVQxIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLAorCQkJCTcsIDAsIE5VTEwsIDAsCisJCQkJdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJBTkMgTElORU9VVDIgUEEiLCBXQ0Q5MzM1X0FOQV9MT18xXzIsCisJCQkJNiwgMCwgTlVMTCwgMCwKKwkJCQl0YXNoYV9jb2RlY19lbmFibGVfbGluZW91dF9wYSwKKwkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBTUEsxIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAorCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX3Nwa19hbmMsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEhMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBIUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBIUEhMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQU5DIEhQSFIiKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9CSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXNoYV9jb2RlY19lbmFibGVfcnhfYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQSzEgT1VUIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMiBPVVQiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQyIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTElORU9VVDMiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUNCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBMSU5FT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBMSU5FT1VUMiIpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVNfUkVHVUxBVE9SIiwgU05EX1NPQ19OT1BNLAorCQlPTl9ERU1BTkRfTUlDQklBUywgMCwKKwkJdGFzaGFfY29kZWNfZW5hYmxlX29uX2RlbWFuZF9zdXBwbHksCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgwIiwgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJCSAgICAwLCAmYWRjX3VzX211eDBfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYMSIsIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCQkgICAgMCwgJmFkY191c19tdXgxX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDIiLCBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkJICAgIDAsICZhZGNfdXNfbXV4Ml9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgzIiwgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJCSAgICAwLCAmYWRjX3VzX211eDNfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNCIsIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCQkgICAgMCwgJmFkY191c19tdXg0X3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDUiLCBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkJICAgIDAsICZhZGNfdXNfbXV4NV9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVg2IiwgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJCSAgICAwLCAmYWRjX3VzX211eDZfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNyIsIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCQkgICAgMCwgJmFkY191c19tdXg3X3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDgiLCBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkJICAgIDAsICZhZGNfdXNfbXV4OF9zd2l0Y2gpLAorCS8qIE1BRCByZWxhdGVkIHdpZGdldHMgKi8KKwlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUY0IE1BRCIsICJBSUY0IE1BRCBUWCIsIDAsCisJCQkgICAgICAgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9tYWQsCisJCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWCgiTUFEX1NFTCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJm1hZF9zZWxfbXV4KSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1BRF9DUEVfSU5QVVQiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1BRElOUFVUIiksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTUFET05PRkYiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpZjRfbWFkX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTUFEX0JST0FEQ0FTVCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAmbWFkX2JyZGNzdF9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFJRjQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFpZjRfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgSFBITCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmYW5jX2hwaGxfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgSFBIUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmYW5jX2hwaHJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgRUFSIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZhbmNfZWFyX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQU5DIE9VVCBFQVIgU1BLUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFuY19lYXJfc3Brcl9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFOQyBMSU5FT1VUMSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmYW5jX2xpbmVvdXQxX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQU5DIExJTkVPVVQyIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZhbmNfbGluZW91dDJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgU1BLUiBQQSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgJmFuY19zcGtyX3BhX3N3aXRjaCksCit9OworCitzdGF0aWMgaW50IHRhc2hhX2dldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgdW5zaWduZWQgaW50ICp0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKKwkJCQkgdW5zaWduZWQgaW50ICpyeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJdTMyIGkgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKworCXN3aXRjaCAoZGFpLT5pZCkgeworCWNhc2UgQUlGMV9QQjoKKwljYXNlIEFJRjJfUEI6CisJY2FzZSBBSUYzX1BCOgorCWNhc2UgQUlGNF9QQjoKKwljYXNlIEFJRl9NSVgxX1BCOgorCQlpZiAoIXJ4X3Nsb3QgfHwgIXJ4X251bSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCByeF9zbG90ICVwSyBvciByeF9udW0gJXBLXG4iLAorCQkJCSBfX2Z1bmNfXywgcnhfc2xvdCwgcnhfbnVtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXNoYV9wLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LAorCQkJCSAgICBsaXN0KSB7CisJCQlwcl9kZWJ1ZygiJXM6IHNsb3RfbnVtICV1IGNoLT5jaF9udW0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBpLCBjaC0+Y2hfbnVtKTsKKwkJCXJ4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07CisJCX0KKwkJcHJfZGVidWcoIiVzOiByeF9udW0gJWRcbiIsIF9fZnVuY19fLCBpKTsKKwkJKnJ4X251bSA9IGk7CisJCWJyZWFrOworCWNhc2UgQUlGMV9DQVA6CisJY2FzZSBBSUYyX0NBUDoKKwljYXNlIEFJRjNfQ0FQOgorCWNhc2UgQUlGNF9NQURfVFg6CisJY2FzZSBBSUY0X1ZJRkVFRDoKKwkJaWYgKCF0eF9zbG90IHx8ICF0eF9udW0pIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgdHhfc2xvdCAlcEsgb3IgdHhfbnVtICVwS1xuIiwKKwkJCQkgX19mdW5jX18sIHR4X3Nsb3QsIHR4X251bSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGFzaGFfcC0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwKKwkJCQkgICAgbGlzdCkgeworCQkJcHJfZGVidWcoIiVzOiBzbG90X251bSAldSBjaC0+Y2hfbnVtICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgaSwgIGNoLT5jaF9udW0pOworCQkJdHhfc2xvdFtpKytdID0gY2gtPmNoX251bTsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IHR4X251bSAlZFxuIiwgX19mdW5jX18sIGkpOworCQkqdHhfbnVtID0gaTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIERBSSBJRCAleFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJIHVuc2lnbmVkIGludCB0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKKwkJCQkgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOworCisJaWYgKCFkYWkpIHsKKwkJcHJfZXJyKCIlczogZGFpIGlzIGVtcHR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoIXR4X3Nsb3QgfHwgIXJ4X3Nsb3QpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCB0eF9zbG90PSVwSywgcnhfc2xvdD0lcEtcbiIsCisJCQlfX2Z1bmNfXywgdHhfc2xvdCwgcnhfc2xvdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXMoKTogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggdHhfY2ggJWQgcnhfY2ggJWRcbiIKKwkJICJ0YXNoYS0+aW50Zl90eXBlICVkXG4iLAorCQkgX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCwgdHhfbnVtLCByeF9udW0sCisJCSB0YXNoYS0+aW50Zl90eXBlKTsKKworCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQl3Y2Q5eHh4X2luaXRfc2xpbXNsYXZlKGNvcmUsIGNvcmUtPnNsaW0tPmxhZGRyLAorCQkJCQkgICB0eF9udW0sIHR4X3Nsb3QsIHJ4X251bSwgcnhfc2xvdCk7CisJCS8qIFJlc2VydmUgVFgxMi9UWDEzIGZvciBNQUQgZGF0YSBjaGFubmVsICovCisJCWRhaV9kYXRhID0gJnRhc2hhLT5kYWlbQUlGNF9NQURfVFhdOworCQlpZiAoZGFpX2RhdGEpIHsKKwkJCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQorCQkJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnR4X2Noc1tUQVNIQV9UWDEzXS5saXN0LAorCQkJCQkgICAgICAmZGFpX2RhdGEtPndjZDl4eHhfY2hfbGlzdCk7CisJCQllbHNlCisJCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW1RBU0hBX1RYMTJdLmxpc3QsCisJCQkJCSAgICAgICZkYWlfZGF0YS0+d2NkOXh4eF9jaF9saXN0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCisJcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKworCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQorCQlyZXR1cm47CisKKwlpZiAoKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spICYmCisJICAgIHRlc3RfYml0KFNCX0NMS19HRUFSLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkgeworCQl0YXNoYV9jb2RlY192b3RlX21heF9idyhkYWktPmNvZGVjLCBmYWxzZSk7CisJCWNsZWFyX2JpdChTQl9DTEtfR0VBUiwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJfQorfQorCitzdGF0aWMgaW50IHRhc2hhX3NldF9kZWNpbWF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgICAgdTggdHhfZnNfcmF0ZV9yZWdfdmFsLCB1MzIgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTMyIHR4X3BvcnQgPSAwOworCXU4IHNoaWZ0ID0gMCwgc2hpZnRfdmFsID0gMCwgdHhfbXV4X3NlbCA9IDA7CisJaW50IGRlY2ltYXRvciA9IC0xOworCXUxNiB0eF9wb3J0X3JlZyA9IDAsIHR4X2ZzX3JlZyA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGFzaGEtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJdHhfcG9ydCA9IGNoLT5wb3J0OworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGFpLT5pZCA9ICVkLCB0eF9wb3J0ID0gJWQiLAorCQkJX19mdW5jX18sIGRhaS0+aWQsIHR4X3BvcnQpOworCisJCWlmICgodHhfcG9ydCA8IDApIHx8ICh0eF9wb3J0ID09IDEyKSB8fCAodHhfcG9ydCA+PSAxNCkpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIFNMSU0gVFgldSBwb3J0LiBEQUkgSUQ6ICVkXG4iLAorCQkJCV9fZnVuY19fLCB0eF9wb3J0LCBkYWktPmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIEZpbmQgdGhlIFNCIFRYIE1VWCBpbnB1dCAtIHdoaWNoIGRlY2ltYXRvciBpcyBjb25uZWN0ZWQgKi8KKwkJaWYgKHR4X3BvcnQgPCA0KSB7CisJCQl0eF9wb3J0X3JlZyA9IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMDsKKwkJCXNoaWZ0ID0gKHR4X3BvcnQgPDwgMSk7CisJCQlzaGlmdF92YWwgPSAweDAzOworCQl9IGVsc2UgaWYgKCh0eF9wb3J0ID49IDQpICYmICh0eF9wb3J0IDwgOCkpIHsKKwkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxOworCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA0KSA8PCAxKTsKKwkJCXNoaWZ0X3ZhbCA9IDB4MDM7CisJCX0gZWxzZSBpZiAoKHR4X3BvcnQgPj0gOCkgJiYgKHR4X3BvcnQgPCAxMSkpIHsKKwkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyOworCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA4KSA8PCAxKTsKKwkJCXNoaWZ0X3ZhbCA9IDB4MDM7CisJCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgeworCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzM7CisJCQlzaGlmdCA9IDA7CisJCQlzaGlmdF92YWwgPSAweDBGOworCQl9IGVsc2UgaWYgKHR4X3BvcnQgPT0gMTMpIHsKKwkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczOworCQkJc2hpZnQgPSA0OworCQkJc2hpZnRfdmFsID0gMHgwMzsKKwkJfQorCQl0eF9tdXhfc2VsID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9wb3J0X3JlZykgJgorCQkJCQkgIChzaGlmdF92YWwgPDwgc2hpZnQpOworCQl0eF9tdXhfc2VsID0gdHhfbXV4X3NlbCA+PiBzaGlmdDsKKworCQlpZiAodHhfcG9ydCA8PSA4KSB7CisJCQlpZiAoKHR4X211eF9zZWwgPT0gMHgyKSB8fCAodHhfbXV4X3NlbCA9PSAweDMpKQorCQkJCWRlY2ltYXRvciA9IHR4X3BvcnQ7CisJCX0gZWxzZSBpZiAodHhfcG9ydCA8PSAxMCkgeworCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKKwkJCQlkZWNpbWF0b3IgPSAoKHR4X3BvcnQgPT0gOSkgPyA3IDogNik7CisJCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgeworCQkJaWYgKCh0eF9tdXhfc2VsID49IDEpICYmICh0eF9tdXhfc2VsIDwgNykpCisJCQkJZGVjaW1hdG9yID0gdHhfbXV4X3NlbCAtIDE7CisJCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMykgeworCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKKwkJCQlkZWNpbWF0b3IgPSA1OworCQl9CisKKwkJaWYgKGRlY2ltYXRvciA+PSAwKSB7CisJCQl0eF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKworCQkJCSAgICAxNiAqIGRlY2ltYXRvcjsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXQgREVDJXUgKC0+IFNMSU1fVFgldSkgcmF0ZSB0byAldVxuIiwKKwkJCQlfX2Z1bmNfXywgZGVjaW1hdG9yLCB0eF9wb3J0LCBzYW1wbGVfcmF0ZSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9mc19yZWcsIDB4MEYsCisJCQkJCSAgICB0eF9mc19yYXRlX3JlZ192YWwpOworCQl9IGVsc2UgaWYgKCh0eF9wb3J0IDw9IDgpICYmICh0eF9tdXhfc2VsID09IDB4MDEpKSB7CisJCQkvKiBDaGVjayBpZiB0aGUgVFggTXV4IGlucHV0IGlzIFJYIE1JWCBUWG4gKi8KKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWF9NSVhfVFgldSBnb2luZyB0byBTTElNIFRYJXVcbiIsCisJCQkJCV9fZnVuY19fLCB0eF9wb3J0LCB0eF9wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFUlJPUjogSW52YWxpZCBkZWNpbWF0b3I6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBkZWNpbWF0b3IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfc2V0X21peF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkJICAgdTggaW50X21peF9mc19yYXRlX3JlZ192YWwsCisJCQkJCSAgIHUzMiBzYW1wbGVfcmF0ZSkKK3sKKwl1OCBpbnRfMl9pbnA7CisJdTMyIGo7CisJdTE2IGludF9tdXhfY2ZnMSwgaW50X2ZzX3JlZzsKKwl1OCBpbnRfbXV4X2NmZzFfdmFsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRhc2hhLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCWludF8yX2lucCA9IGNoLT5wb3J0ICsgSU5Ubl8yX0lOUF9TRUxfUlgwIC0KKwkJCQkgIFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSOworCQlpZiAoKGludF8yX2lucCA8IElOVG5fMl9JTlBfU0VMX1JYMCkgfHwKKwkJICAgKGludF8yX2lucCA+IElOVG5fMl9JTlBfU0VMX1JYNykpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgUlgldSBwb3J0LCBEYWkgSUQgaXMgJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJKGNoLT5wb3J0IC0gVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIpLAorCQkJCWRhaS0+aWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbnRfbXV4X2NmZzEgPSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMTsKKwkJZm9yIChqID0gMDsgaiA8IFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTOyBqKyspIHsKKwkJCWludF9tdXhfY2ZnMV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMSkgJgorCQkJCQkJMHgwRjsKKwkJCWlmIChpbnRfbXV4X2NmZzFfdmFsID09IGludF8yX2lucCkgeworCQkJCWludF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMICsKKwkJCQkJCTIwICogajsKKwkJCQlwcl9kZWJ1ZygiJXM6IEFJRl9NSVhfUEIgREFJKCVkKSBjb25uZWN0ZWQgdG8gSU5UJXVfMlxuIiwKKwkJCQkJICBfX2Z1bmNfXywgZGFpLT5pZCwgaik7CisJCQkJcHJfZGVidWcoIiVzOiBzZXQgSU5UJXVfMiBzYW1wbGUgcmF0ZSB0byAldVxuIiwKKwkJCQkJX19mdW5jX18sIGosIHNhbXBsZV9yYXRlKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpbnRfZnNfcmVnLAorCQkJCQkJMHgwRiwgaW50X21peF9mc19yYXRlX3JlZ192YWwpOworCQkJfQorCQkJaW50X211eF9jZmcxICs9IDI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfc2V0X3ByaW1faW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJCSAgICB1OCBpbnRfcHJpbV9mc19yYXRlX3JlZ192YWwsCisJCQkJCSAgICB1MzIgc2FtcGxlX3JhdGUpCit7CisJdTggaW50XzFfbWl4MV9pbnA7CisJdTMyIGo7CisJdTE2IGludF9tdXhfY2ZnMCwgaW50X211eF9jZmcxOworCXUxNiBpbnRfZnNfcmVnOworCXU4IGludF9tdXhfY2ZnMF92YWwsIGludF9tdXhfY2ZnMV92YWw7CisJdTggaW5wMF9zZWwsIGlucDFfc2VsLCBpbnAyX3NlbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXNoYS0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQlpbnRfMV9taXgxX2lucCA9IGNoLT5wb3J0ICsgSU5Ubl8xX01JWF9JTlBfU0VMX1JYMCAtCisJCQkJICBUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUjsKKwkJaWYgKChpbnRfMV9taXgxX2lucCA8IElOVG5fMV9NSVhfSU5QX1NFTF9SWDApIHx8CisJCSAgIChpbnRfMV9taXgxX2lucCA+IElOVG5fMV9NSVhfSU5QX1NFTF9SWDcpKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIFJYJXUgcG9ydCwgRGFpIElEIGlzICVkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCShjaC0+cG9ydCAtIFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSwKKwkJCQlkYWktPmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaW50X211eF9jZmcwID0gV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzA7CisKKwkJLyoKKwkJICogTG9vcCB0aHJvdWdoIGFsbCBpbnRlcnBvbGF0b3IgTVVYIGlucHV0cyBhbmQgZmluZCBvdXQKKwkJICogdG8gd2hpY2ggaW50ZXJwb2xhdG9yIGlucHV0LCB0aGUgc2xpbSByeCBwb3J0CisJCSAqIGlzIGNvbm5lY3RlZAorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTOyBqKyspIHsKKwkJCWludF9tdXhfY2ZnMSA9IGludF9tdXhfY2ZnMCArIDE7CisKKwkJCWludF9tdXhfY2ZnMF92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMCk7CisJCQlpbnRfbXV4X2NmZzFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBpbnRfbXV4X2NmZzEpOworCQkJaW5wMF9zZWwgPSBpbnRfbXV4X2NmZzBfdmFsICYgMHgwRjsKKwkJCWlucDFfc2VsID0gKGludF9tdXhfY2ZnMF92YWwgPj4gNCkgJiAweDBGOworCQkJaW5wMl9zZWwgPSAoaW50X211eF9jZmcxX3ZhbCA+PiA0KSAmIDB4MEY7CisJCQlpZiAoKGlucDBfc2VsID09IGludF8xX21peDFfaW5wKSB8fAorCQkJICAgIChpbnAxX3NlbCA9PSBpbnRfMV9taXgxX2lucCkgfHwKKwkJCSAgICAoaW5wMl9zZWwgPT0gaW50XzFfbWl4MV9pbnApKSB7CisJCQkJaW50X2ZzX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCArCisJCQkJCSAgICAgMjAgKiBqOworCQkJCXByX2RlYnVnKCIlczogQUlGX1BCIERBSSglZCkgY29ubmVjdGVkIHRvIElOVCV1XzFcbiIsCisJCQkJCSAgX19mdW5jX18sIGRhaS0+aWQsIGopOworCQkJCXByX2RlYnVnKCIlczogc2V0IElOVCV1XzEgc2FtcGxlIHJhdGUgdG8gJXVcbiIsCisJCQkJCV9fZnVuY19fLCBqLCBzYW1wbGVfcmF0ZSk7CisJCQkJLyogc2FtcGxlX3JhdGUgaXMgaW4gSHogKi8KKwkJCQlpZiAoKGogPT0gMCkgJiYgKHNhbXBsZV9yYXRlID09IDQ0MTAwKSkgeworCQkJCQlwcl9pbmZvKCIlczogQ2Fubm90IHNldCA0NC4xS0h6IG9uIElOVDBcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJfSBlbHNlCisJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludF9mc19yZWcsCisJCQkJCQkweDBGLCBpbnRfcHJpbV9mc19yYXRlX3JlZ192YWwpOworCQkJfQorCQkJaW50X211eF9jZmcwICs9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHRhc2hhX3NldF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgICAgICAgdTMyIHNhbXBsZV9yYXRlKQoreworCWludCByYXRlX3ZhbCA9IDA7CisJaW50IGksIHJldDsKKworCS8qIHNldCBtaXhpbmcgcGF0aCByYXRlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50X21peF9zYW1wbGVfcmF0ZV92YWwpOyBpKyspIHsKKwkJaWYgKHNhbXBsZV9yYXRlID09CisJCQkJaW50X21peF9zYW1wbGVfcmF0ZV92YWxbaV0uc2FtcGxlX3JhdGUpIHsKKwkJCXJhdGVfdmFsID0KKwkJCQlpbnRfbWl4X3NhbXBsZV9yYXRlX3ZhbFtpXS5yYXRlX3ZhbDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICgoaSA9PSBBUlJBWV9TSVpFKGludF9taXhfc2FtcGxlX3JhdGVfdmFsKSkgfHwKKwkJCShyYXRlX3ZhbCA8IDApKQorCQlnb3RvIHByaW1fcmF0ZTsKKwlyZXQgPSB0YXNoYV9zZXRfbWl4X2ludGVycG9sYXRvcl9yYXRlKGRhaSwKKwkJCSh1OCkgcmF0ZV92YWwsIHNhbXBsZV9yYXRlKTsKK3ByaW1fcmF0ZToKKwkvKiBzZXQgcHJpbWFyeSBwYXRoIHNhbXBsZSByYXRlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50X3ByaW1fc2FtcGxlX3JhdGVfdmFsKTsgaSsrKSB7CisJCWlmIChzYW1wbGVfcmF0ZSA9PQorCQkJCWludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtpXS5zYW1wbGVfcmF0ZSkgeworCQkJcmF0ZV92YWwgPQorCQkJCWludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtpXS5yYXRlX3ZhbDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICgoaSA9PSBBUlJBWV9TSVpFKGludF9wcmltX3NhbXBsZV9yYXRlX3ZhbCkpIHx8CisJCQkocmF0ZV92YWwgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gdGFzaGFfc2V0X3ByaW1faW50ZXJwb2xhdG9yX3JhdGUoZGFpLAorCQkJKHU4KSByYXRlX3ZhbCwgc2FtcGxlX3JhdGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCisJcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwlpZiAoKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spICYmCisJICAgIHRlc3RfYml0KFNCX0NMS19HRUFSLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkgeworCQl0YXNoYV9jb2RlY192b3RlX21heF9idyhkYWktPmNvZGVjLCBmYWxzZSk7CisJCWNsZWFyX2JpdChTQl9DTEtfR0VBUiwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKwlpbnQgcmV0OworCWludCB0eF9mc19yYXRlID0gLUVJTlZBTDsKKwlpbnQgcnhfZnNfcmF0ZSA9IC1FSU5WQUw7CisJaW50IGkyc19iaXRfbW9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBkYWlfbmFtZSA9ICVzIERBSS1JRCAleCByYXRlICVkIG51bV9jaCAlZFxuIiwgX19mdW5jX18sCisJCSBkYWktPm5hbWUsIGRhaS0+aWQsIHBhcmFtc19yYXRlKHBhcmFtcyksCisJCSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisKKwlzd2l0Y2ggKHN1YnN0cmVhbS0+c3RyZWFtKSB7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOgorCQlyZXQgPSB0YXNoYV9zZXRfaW50ZXJwb2xhdG9yX3JhdGUoZGFpLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBzYW1wbGUgcmF0ZTogJXVcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJCWNhc2UgMTY6CisJCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDE2OworCQkJaTJzX2JpdF9tb2RlID0gMHgwMTsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJdGFzaGEtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAyNDsKKwkJCWkyc19iaXRfbW9kZSA9IDB4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRhc2hhLT5kYWlbZGFpLT5pZF0ucmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7CisJCQlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwkJCWNhc2UgODAwMDoKKwkJCQlyeF9mc19yYXRlID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTYwMDA6CisJCQkJcnhfZnNfcmF0ZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyMDAwOgorCQkJCXJ4X2ZzX3JhdGUgPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSA0ODAwMDoKKwkJCQlyeF9mc19yYXRlID0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgOTYwMDA6CisJCQkJcnhfZnNfcmF0ZSA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDE5MjAwMDoKKwkJCQlyeF9mc19yYXRlID0gNTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X2Vycih0YXNoYS0+ZGV2LAorCQkJCSIlczogSW52YWxpZCBSWCBzYW1wbGUgcmF0ZTogJWRcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCwKKwkJCQkJMHgyMCwgaTJzX2JpdF9tb2RlIDw8IDUpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWF9JMlNfQ1RMLAorCQkJCQkweDFjLCAocnhfZnNfcmF0ZSA8PCAyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6CisJCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCQljYXNlIDgwMDA6CisJCQl0eF9mc19yYXRlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDE2MDAwOgorCQkJdHhfZnNfcmF0ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzMjAwMDoKKwkJCXR4X2ZzX3JhdGUgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDA6CisJCQl0eF9mc19yYXRlID0gNDsKKwkJCWJyZWFrOworCQljYXNlIDk2MDAwOgorCQkJdHhfZnNfcmF0ZSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSAxOTIwMDA6CisJCQl0eF9mc19yYXRlID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDM4NDAwMDoKKwkJCXR4X2ZzX3JhdGUgPSA3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHRhc2hhLT5kZXYsICIlczogSW52YWxpZCBUWCBzYW1wbGUgcmF0ZTogJWRcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfTsKKwkJaWYgKGRhaS0+aWQgIT0gQUlGNF9WSUZFRUQgJiYKKwkJICAgIGRhaS0+aWQgIT0gQUlGNF9NQURfVFgpIHsKKwkJCXJldCA9IHRhc2hhX3NldF9kZWNpbWF0b3JfcmF0ZShkYWksIHR4X2ZzX3JhdGUsCisJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKHRhc2hhLT5kZXYsICIlczogY2Fubm90IHNldCBUWCBEZWNpbWF0b3IgcmF0ZTogJWRcbiIsCisJCQkJCV9fZnVuY19fLCB0eF9mc19yYXRlKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXRhc2hhLT5kYWlbZGFpLT5pZF0ucmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCXRhc2hhLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMTY7CisJCQlpMnNfYml0X21vZGUgPSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDI0OworCQkJaTJzX2JpdF9tb2RlID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJdGFzaGEtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAzMjsKKwkJCWkyc19iaXRfbW9kZSA9IDB4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBJbnZhbGlkIGZvcm1hdCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfd2lkdGgocGFyYW1zKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKwkJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMLAorCQkJCTB4MjAsIGkyc19iaXRfbW9kZSA8PCA1KTsKKwkJCWlmICh0eF9mc19yYXRlID4gMSkKKwkJCQl0eF9mc19yYXRlLS07CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX0NUTCwKKwkJCQkweDFjLCB0eF9mc19yYXRlIDw8IDIpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfTF9DRkcsCisJCQkJMHgwNSwgMHgwNSk7CisKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX1JfQ0ZHLAorCQkJCTB4MDUsIDB4MDUpOworCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9MX0NGRywKKwkJCQkweDA1LCAweDA1KTsKKworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfUl9DRkcsCisJCQkJMHgwNSwgMHgwNSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzdHJlYW0gdHlwZSAlZFxuIiwgX19mdW5jX18sCisJCQlzdWJzdHJlYW0tPnN0cmVhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisJaWYgKGRhaS0+aWQgPT0gQUlGNF9WSUZFRUQpCisJCXRhc2hhLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMzI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJLyogQ1BVIGlzIG1hc3RlciAqLworCQlpZiAodGFzaGEtPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykgeworCQkJaWYgKGRhaS0+aWQgPT0gQUlGMV9DQVApCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19DVEwsCisJCQkJCTB4MiwgMCk7CisJCQllbHNlIGlmIChkYWktPmlkID09IEFJRjFfUEIpCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYX0kyU19DVEwsCisJCQkJCTB4MiwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQkvKiBDUFUgaXMgc2xhdmUgKi8KKwkJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJCWlmIChkYWktPmlkID09IEFJRjFfQ0FQKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKKwkJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMLAorCQkJCQkweDIsIDB4Mik7CisJCQllbHNlIGlmIChkYWktPmlkID09IEFJRjFfUEIpCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAorCQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYX0kyU19DVEwsCisJCQkJCTB4MiwgMHgyKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB0YXNoYV9kYWlfb3BzID0geworCS5zdGFydHVwID0gdGFzaGFfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSB0YXNoYV9zaHV0ZG93biwKKwkuaHdfcGFyYW1zID0gdGFzaGFfaHdfcGFyYW1zLAorCS5wcmVwYXJlID0gdGFzaGFfcHJlcGFyZSwKKwkuc2V0X3N5c2NsayA9IHRhc2hhX3NldF9kYWlfc3lzY2xrLAorCS5zZXRfZm10ID0gdGFzaGFfc2V0X2RhaV9mbXQsCisJLnNldF9jaGFubmVsX21hcCA9IHRhc2hhX3NldF9jaGFubmVsX21hcCwKKwkuZ2V0X2NoYW5uZWxfbWFwID0gdGFzaGFfZ2V0X2NoYW5uZWxfbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGFzaGFfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJ0YXNoYV9yeDEiLAorCQkuaWQgPSBBSUYxX1BCLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBQbGF5YmFjayIsCisJCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0sgfCBXQ0Q5MzM1X0ZSQUNfUkFURVNfTUFTSywKKwkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCX0sCisJCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGFzaGFfdHgxIiwKKwkJLmlkID0gQUlGMV9DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQl9LAorCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhc2hhX3J4MiIsCisJCS5pZCA9IEFJRjJfUEIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSyB8IFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNoYV90eDIiLAorCQkuaWQgPSBBSUYyX0NBUCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMiBDYXB0dXJlIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSywKKwkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCX0sCisJCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGFzaGFfcngzIiwKKwkJLmlkID0gQUlGM19QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjMgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLIHwgV0NEOTMzNV9GUkFDX1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhc2hhX3R4MyIsCisJCS5pZCA9IEFJRjNfQ0FQLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIENhcHR1cmUiLAorCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhc2hhX3J4NCIsCisJCS5pZCA9IEFJRjRfUEIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUY0IFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSyB8IFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKKwkJLmlkID0gQUlGX01JWDFfUEIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYgTWl4IFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSyB8IFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJfSwKKwkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNoYV9tYWQxIiwKKwkJLmlkID0gQUlGNF9NQURfVFgsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjQgTUFEIFRYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAgfCBTTkRSVl9QQ01fUkFURV8zODQwMDAsCisJCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkucmF0ZV9taW4gPSAxNjAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCX0sCisJCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGFzaGFfdmlmZWVkYmFjayIsCisJCS5pZCA9IEFJRjRfVklGRUVELAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWSWZlZWQiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJIH0sCisJCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGFzaGFfY3BlIiwKKwkJLmlkID0gQUlGNV9DUEVfVFgsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjUgQ1BFIFRYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkucmF0ZV9taW4gPSAxNjAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGFzaGFfaTJzX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSAidGFzaGFfaTJzX3J4MSIsCisJCS5pZCA9IEFJRjFfUEIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSywKKwkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCX0sCisJCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGFzaGFfaTJzX3R4MSIsCisJCS5pZCA9IEFJRjFfQ0FQLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIENhcHR1cmUiLAorCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJfSwKKwkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNoYV9pMnNfcngyIiwKKwkJLmlkID0gQUlGMl9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXNoYV9pMnNfdHgyIiwKKwkJLmlkID0gQUlGMl9DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQl9LAorCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX3Bvd2VyX2dhdGVfZGlnaXRhbF9jb3JlKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXNoYS0+Y29kZWM7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZ0YXNoYS0+cG93ZXJfbG9jayk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEVudGVyaW5nIHBvd2VyIGdhdGluZyBmdW5jdGlvbiwgJWRcbiIsCisJCV9fZnVuY19fLCB0YXNoYS0+cG93ZXJfYWN0aXZlX3JlZik7CisKKwlpZiAodGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYgPiAwKQorCQlnb3RvIGV4aXQ7CisKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXNoYS0+d2NkOXh4eCwKKwkJCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfQkVHSU4sCisJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDA0LCAweDA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDAxLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDAyLCAweDAwKTsKKwljbGVhcl9iaXQoQVVESU9fTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJdGFzaGFfY29kZWNfdXBkYXRlX3NpZG9fdm9sdGFnZSh0YXNoYSwgc2lkb19idWNrX3N2c192b2x0YWdlKTsKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXNoYS0+d2NkOXh4eCwgV0NEX1JFR0lPTl9QT1dFUl9ET1dOLAorCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOworZXhpdDoKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRXhpdGluZyBwb3dlciBnYXRpbmcgZnVuY3Rpb24sICVkXG4iLAorCQlfX2Z1bmNfXywgdGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYpOworCW11dGV4X3VubG9jaygmdGFzaGEtPnBvd2VyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19wb3dlcl9nYXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwl0YXNoYSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRhc2hhX3ByaXYsIHBvd2VyX2dhdGVfd29yayk7CisJY29kZWMgPSB0YXNoYS0+Y29kZWM7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwl0YXNoYV9jb2RlY19wb3dlcl9nYXRlX2RpZ2l0YWxfY29yZSh0YXNoYSk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBwb3dlcl9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgaW50IHRhc2hhX2RpZ19jb3JlX3JlbW92ZV9wb3dlcl9jb2xsYXBzZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0YXNoYV9jb2RlY192b3RlX21heF9idyhjb2RlYywgdHJ1ZSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDUpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHg3KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4Myk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgwMiwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgwMiwgMHgwMik7CisKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXNoYS0+d2NkOXh4eCwKKwkJCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfUkVNT1ZFLAorCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7CisJcmVnY2FjaGVfbWFya19kaXJ0eShjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCk7CisJcmVnY2FjaGVfc3luY19yZWdpb24oY29kZWMtPmNvbXBvbmVudC5yZWdtYXAsCisJCQkgICAgIFRBU0hBX0RJR19DT1JFX1JFR19NSU4sIFRBU0hBX0RJR19DT1JFX1JFR19NQVgpOworCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNoYV9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZShzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCisJCQkJCSBpbnQgcmVxX3N0YXRlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgY3VyX3N0YXRlOworCisJLyogRXhpdCBpZiBmZWF0dXJlIGlzIGRpc2FibGVkICovCisJaWYgKCFkaWdfY29yZV9jb2xsYXBzZV9lbmFibGUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmdGFzaGEtPnBvd2VyX2xvY2spOworCWlmIChyZXFfc3RhdGUgPT0gUE9XRVJfQ09MTEFQU0UpCisJCXRhc2hhLT5wb3dlcl9hY3RpdmVfcmVmLS07CisJZWxzZSBpZiAocmVxX3N0YXRlID09IFBPV0VSX1JFU1VNRSkKKwkJdGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYrKzsKKwllbHNlCisJCWdvdG8gdW5sb2NrX211dGV4OworCisJaWYgKHRhc2hhLT5wb3dlcl9hY3RpdmVfcmVmIDwgMCkgeworCQlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogcG93ZXJfYWN0aXZlX3JlZiBpcyBuZWdhdGl2ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byB1bmxvY2tfbXV0ZXg7CisJfQorCisJY29kZWMgPSB0YXNoYS0+Y29kZWM7CisJaWYgKCFjb2RlYykKKwkJZ290byB1bmxvY2tfbXV0ZXg7CisKKwlpZiAocmVxX3N0YXRlID09IFBPV0VSX0NPTExBUFNFKSB7CisJCWlmICh0YXNoYS0+cG93ZXJfYWN0aXZlX3JlZiA9PSAwKSB7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRhc2hhLT5wb3dlcl9nYXRlX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKGRpZ19jb3JlX2NvbGxhcHNlX3RpbWVyICogMTAwMCkpOworCQl9CisJfSBlbHNlIGlmIChyZXFfc3RhdGUgPT0gUE9XRVJfUkVTVU1FKSB7CisJCWlmICh0YXNoYS0+cG93ZXJfYWN0aXZlX3JlZiA9PSAxKSB7CisJCQkvKgorCQkJICogQXQgdGhpcyBwb2ludCwgdGhlcmUgY2FuIGJlIHR3byBjYXNlczoKKwkJCSAqIDEuIENvcmUgYWxyZWFkeSBpbiBwb3dlciBjb2xsYXBzZSBzdGF0ZQorCQkJICogMi4gVGltZXIga2lja2VkIGluIGFuZCBzdGlsbCBkaWQgbm90IGV4cGlyZSBvcgorCQkJICogd2FpdGluZyBmb3IgdGhlIHBvd2VyX2xvY2sKKwkJCSAqLworCQkJY3VyX3N0YXRlID0gd2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZSgKKwkJCQkJCXRhc2hhLT53Y2Q5eHh4LAorCQkJCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7CisJCQlpZiAoY3VyX3N0YXRlID09IFdDRF9SRUdJT05fUE9XRVJfRE9XTikKKwkJCQl0YXNoYV9kaWdfY29yZV9yZW1vdmVfcG93ZXJfY29sbGFwc2UoY29kZWMpOworCQkJZWxzZSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+cG93ZXJfbG9jayk7CisJCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAorCQkJCQkJJnRhc2hhLT5wb3dlcl9nYXRlX3dvcmspOworCQkJCW11dGV4X2xvY2soJnRhc2hhLT5wb3dlcl9sb2NrKTsKKwkJCX0KKwkJfQorCX0KKwordW5sb2NrX211dGV4OgorCW11dGV4X3VubG9jaygmdGFzaGEtPnBvd2VyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX190YXNoYV9jZGNfbWNsa19lbmFibGVfbG9ja2VkKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKKwkJCQkJICBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGFzaGEtPndjZF9leHRfY2xrKSB7CisJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiB3Y2QgZXh0IGNsb2NrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IG1jbGtfZW5hYmxlID0gJXVcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCisJaWYgKGVuYWJsZSkgeworCQl0YXNoYV9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXNoYSwgUE9XRVJfUkVTVU1FKTsKKwkJcmV0ID0gdGFzaGFfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXNoYSwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlzZXRfYml0KEFVRElPX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOworCQl0YXNoYV9jb2RlY19hcHBseV9zaWRvX3ZvbHRhZ2UodGFzaGEsCisJCQkJU0lET19WT0xUQUdFX05PTUlOQUxfTVYpOworCX0gZWxzZSB7CisJCWlmICghZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlKSB7CisJCQljbGVhcl9iaXQoQVVESU9fTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJCQl0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKHRhc2hhLAorCQkJCQkJc2lkb19idWNrX3N2c192b2x0YWdlKTsKKwkJfQorCQl0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHRhc2hhLCBmYWxzZSk7CisJCXRhc2hhX2RpZ19jb3JlX3Bvd2VyX2NvbGxhcHNlKHRhc2hhLCBQT1dFUl9DT0xMQVBTRSk7CisJfQorCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX3Rhc2hhX2NkY19tY2xrX2VuYWJsZShzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCisJCQkJICAgYm9vbCBlbmFibGUpCit7CisJaW50IHJldDsKKworCVdDRDlYWFhfVjJfQkdfQ0xLX0xPQ0sodGFzaGEtPnJlc21ncik7CisJcmV0ID0gX190YXNoYV9jZGNfbWNsa19lbmFibGVfbG9ja2VkKHRhc2hhLCBlbmFibGUpOworCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXNoYS0+cmVzbWdyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB0YXNoYV9jZGNfbWNsa19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLCBib29sIGRhcG0pCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZXR1cm4gX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGVuYWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2hhX2NkY19tY2xrX2VuYWJsZSk7CisKK2ludCB0YXNoYV9jZGNfbWNsa190eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLCBib29sIGRhcG0pCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogY2xrX21vZGU6ICVkLCBlbmFibGU6ICVkLCBjbGtfaW50ZXJuYWw6ICVkXG4iLAorCQlfX2Z1bmNfXywgdGFzaGEtPmNsa19tb2RlLCBlbmFibGUsIHRhc2hhLT5jbGtfaW50ZXJuYWwpOworCWlmICh0YXNoYS0+Y2xrX21vZGUgfHwgdGFzaGEtPmNsa19pbnRlcm5hbCkgeworCQlpZiAoZW5hYmxlKSB7CisJCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKwkJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHRhc2hhLT5yZXNtZ3IpOworCQkJdGFzaGFfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2UodGFzaGEsIFBPV0VSX1JFU1VNRSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wsCisJCQkJCTB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKKwkJCQkJMHgwMSwgMHgwMSk7CisJCQlzZXRfYml0KENQRV9OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKKwkJCXRhc2hhX2NvZGVjX3VwZGF0ZV9zaWRvX3ZvbHRhZ2UodGFzaGEsCisJCQkJCQlTSURPX1ZPTFRBR0VfTk9NSU5BTF9NVik7CisJCQl0YXNoYS0+Y2xrX2ludGVybmFsID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXRhc2hhLT5jbGtfaW50ZXJuYWwgPSBmYWxzZTsKKwkJCWNsZWFyX2JpdChDUEVfTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzayk7CisJCQl0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKHRhc2hhLAorCQkJCQkJc2lkb19idWNrX3N2c192b2x0YWdlKTsKKwkJCXRhc2hhX2RpZ19jb3JlX3Bvd2VyX2NvbGxhcHNlKHRhc2hhLCBQT1dFUl9DT0xMQVBTRSk7CisJCQl3Y2RfcmVzbWdyX2Rpc2FibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7CisJCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCBmYWxzZSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBfX3Rhc2hhX2NkY19tY2xrX2VuYWJsZSh0YXNoYSwgZW5hYmxlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfY2RjX21jbGtfdHhfZW5hYmxlKTsKKworc3RhdGljIHNzaXplX3QgdGFzaGFfY29kZWNfdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkgICAgICAgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJY2hhciBidWZmZXJbVEFTSEFfVkVSU0lPTl9FTlRSWV9TSVpFXTsKKwlpbnQgbGVuID0gMDsKKworCXRhc2hhID0gKHN0cnVjdCB0YXNoYV9wcml2ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJaWYgKCF0YXNoYSkgeworCQlwcl9lcnIoIiVzOiB0YXNoYSBwcml2IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OworCisJaWYgKHdjZDl4eHgtPmNvZGVjX3R5cGUtPmlkX21ham9yID09IFRBU0hBX01BSk9SKSB7CisJCWlmIChUQVNIQV9JU18xXzAod2NkOXh4eCkpCisJCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTMzNV8xXzBcbiIpOworCQllbHNlIGlmIChUQVNIQV9JU18xXzEod2NkOXh4eCkpCisJCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTMzNV8xXzFcbiIpOworCQllbHNlCisJCQlzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7CisJfSBlbHNlIGlmICh3Y2Q5eHh4LT5jb2RlY190eXBlLT5pZF9tYWpvciA9PSBUQVNIQTJQMF9NQUpPUikgeworCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTMzNV8yXzBcbiIpOworCX0gZWxzZQorCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJnBvcywgYnVmZmVyLCBsZW4pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyB0YXNoYV9jb2RlY19pbmZvX29wcyA9IHsKKwkucmVhZCA9IHRhc2hhX2NvZGVjX3ZlcnNpb25fcmVhZCwKK307CisKKy8qCisgKiB0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSAtIGNyZWF0ZXMgd2NkOTMzNSBtb2R1bGUKKyAqIEBjb2RlY19yb290OiBUaGUgcGFyZW50IGRpcmVjdG9yeQorICogQGNvZGVjOiBDb2RlYyBpbnN0YW5jZQorICoKKyAqIENyZWF0ZXMgd2NkOTMzNSBtb2R1bGUgYW5kIHZlcnNpb24gZW50cnkgdW5kZXIgdGhlIGdpdmVuCisgKiBwYXJlbnQgZGlyZWN0b3J5LgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHRhc2hhX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKKwkJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKworCWlmICghY29kZWNfcm9vdCB8fCAhY29kZWMpCisJCXJldHVybiAtRUlOVkFMOworCisJdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXRhc2hhLT5lbnRyeSA9IHNuZF9yZWdpc3Rlcl9tb2R1bGVfaW5mbyhjb2RlY19yb290LT5tb2R1bGUsCisJCQkJCQkidGFzaGEiLAorCQkJCQkJY29kZWNfcm9vdCk7CisJaWYgKCF0YXNoYS0+ZW50cnkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTMzNSBlbnRyeVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdmVyc2lvbl9lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQtPnNuZF9jYXJkLAorCQkJCQkJICAgInZlcnNpb24iLAorCQkJCQkJICAgdGFzaGEtPmVudHJ5KTsKKwlpZiAoIXZlcnNpb25fZW50cnkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTMzNSB2ZXJzaW9uIGVudHJ5XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB0YXNoYTsKKwl2ZXJzaW9uX2VudHJ5LT5zaXplID0gVEFTSEFfVkVSU0lPTl9FTlRSWV9TSVpFOworCXZlcnNpb25fZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKKwl2ZXJzaW9uX2VudHJ5LT5jLm9wcyA9ICZ0YXNoYV9jb2RlY19pbmZvX29wczsKKworCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKKwkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRhc2hhLT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSk7CisKK3N0YXRpYyBpbnQgX190YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCgKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJaWYgKGVuYWJsZSkgeworCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKwkJaWYgKHdjZF9yZXNtZ3JfZ2V0X2Nsa190eXBlKHRhc2hhLT5yZXNtZ3IpID09CisJCSAgICBXQ0RfQ0xLX1JDTykgeworCQkJcmV0ID0gd2NkX3Jlc21ncl9lbmFibGVfY2xrX2Jsb2NrKHRhc2hhLT5yZXNtZ3IsCisJCQkJCQkJICBXQ0RfQ0xLX1JDTyk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSB0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKwkJCXJldCB8PSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGFzaGEtPnJlc21nciwKKwkJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7CisJCQlyZXQgfD0gdGFzaGFfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXNoYSwgZmFsc2UpOworCQl9CisKKwl9IGVsc2UgeworCQlyZXQgPSB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhc2hhLT5yZXNtZ3IsCisJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7CisJCXRhc2hhX2NkY19zaWRvX2NjbF9lbmFibGUodGFzaGEsIGZhbHNlKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciBpbiAlcyBSQ09cbiIsCisJCQlfX2Z1bmNfXywgKGVuYWJsZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIikpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCgpCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IGFjcXVpcmUKKyAqIEJHX0NMS19MT0NLLgorICovCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXNoYS0+cmVzbWdyKTsKKwlyZXQgPSBfX3Rhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBlbmFibGUpOworCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXNoYS0+cmVzbWdyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGFzaGFfbWJoY19oc19kZXRlY3Q6IHN0YXJ0cyBtYmhjIGluc2VydGlvbi9yZW1vdmFsIGZ1bmN0aW9uYWxpdHkKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgorICogQG1iaGNfY2ZnOiBoYW5kbGUgdG8gbWJoYyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogcmV0dXJuIDAgaWYgbWJoY19zdGFydCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB0YXNoYV9tYmhjX2hzX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZXR1cm4gd2NkX21iaGNfc3RhcnQoJnRhc2hhLT5tYmhjLCBtYmhjX2NmZyk7Cit9CitFWFBPUlRfU1lNQk9MKHRhc2hhX21iaGNfaHNfZGV0ZWN0KTsKKworLyoKKyAqIHRhc2hhX21iaGNfaHNfZGV0ZWN0X2V4aXQ6IHN0b3AgbWJoYyBpbnNlcnRpb24vcmVtb3ZhbCBmdW5jdGlvbmFsaXR5CisgKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKKyAqLwordm9pZCB0YXNoYV9tYmhjX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdjZF9tYmhjX3N0b3AoJnRhc2hhLT5tYmhjKTsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdCk7CisKK3N0YXRpYyBpbnQgd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwodTMyIG1pY2JfbXYpCit7CisJLyogbWluIG1pY2JpYXMgdm9sdGFnZSBpcyAxViBhbmQgbWF4aW11bSBpcyAyLjg1ViAqLworCWlmIChtaWNiX212IDwgMTAwMCB8fCBtaWNiX212ID4gMjg1MCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBtaWNiaWFzIHZvbHRhZ2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIChtaWNiX212IC0gMTAwMCkgLyA1MDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xW10gPSB7CisJe1dDRDkzMzVfUkNPX0NUUkxfMiwgMHhGRiwgMHg0N30sCisJe1dDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQsIDB4RkYsIDB4NjB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtdID0geworCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8xLCAweEZGLCAweDY1fSwKKwl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMiwgMHhGRiwgMHg1Mn0sCisJe1dDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzMsIDB4RkYsIDB4QUZ9LAorCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF80LCAweEZGLCAweDYwfSwKKwl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8zLCAweEZGLCAweEY0fSwKKwl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF85LCAweEZGLCAweDQwfSwKKwl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8yLCAweEZGLCAweDRGfSwKKwl7V0NEOTMzNV9GTFlCQUNLX0VOLCAweEZGLCAweDZFfSwKKwl7V0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCisJe1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDB4RjgsIDB4Rjh9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMFtdID0geworCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMsIDB4RkYsIDB4NTR9LAorCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAweEZDLCAweEZDfSwKKwl7V0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGQ30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMl8wW10gPSB7CisJe1dDRDkzMzVfUkNPX0NUUkxfMiwgMHgwRiwgMHgwOH0sCisJe1dDRDkzMzVfUlhfQklBU19GTFlCX01JRF9SU1QsIDB4RjAsIDB4MTB9LAorCXtXQ0Q5MzM1X0ZMWUJBQ0tfQ1RSTF8xLCAweDIwLCAweDIwfSwKKwl7V0NEOTMzNV9IUEhfT0NQX0NUTCwgMHhGRiwgMHg3QX0sCisJe1dDRDkzMzVfSFBIX0xfVEVTVCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcxLCAweDNGLCAweDEyfSwKKwl7V0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NGRzIsIDB4MUMsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MUUsIDB4MTh9LAorCXtXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMSwgMHgzRiwgMHgxMn0sCisJe1dDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAweDFDLCAweDA4fSwKKwl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAweDFFLCAweDE4fSwKKwl7V0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNywgMHhGRiwgMHg0NX0sCisJe1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4RjR9LAorCXtXQ0Q5MzM1X0hQSF9SRUZCVUZGX0xQX0NUTCwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDAyfSwKKwl7V0NEOTMzNV9ESUZGX0xPX0NPUkVfT1VUX1BST0csIDB4RkMsIDB4QTB9LAorCXtXQ0Q5MzM1X1NFX0xPX0NPTTEsIDB4RkYsIDB4QzB9LAorCXtXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMwLCAweEZDLCAweEY0fSwKKwl7V0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGNH0sCisJe1dDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4Rjh9LAorCXtXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMwLCAweEZDLCAweEY4fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGFzaGFfcmVnX21hc2tfdmFsIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tdID0geworCXtXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwgMHgwMywgMHgwMH0sCisJe1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwMywgMHgwMX0sCisJe1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwNCwgMHgwNH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaTJjX2RlZmF1bHRzW10gPSB7CisJe1dDRDkzMzVfQU5BX0NMS19UT1AsIDB4MjAsIDB4MjB9LAorCXtXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwgMHgwMywgMHgwMX0sCisJe1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwMywgMHgwMH0sCisJe1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwNSwgMHgwNX0sCisJe1dDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgwX0lOUF9DRkcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMV9JTlBfQ0ZHLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDJfSU5QX0NGRywgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgzX0lOUF9DRkcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfTF9DRkcsIDB4MDUsIDB4MDV9LAorCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcsIDB4MDUsIDB4MDV9LAorCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfTF9DRkcsIDB4MDUsIDB4MDV9LAorCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfUl9DRkcsIDB4MDUsIDB4MDV9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtdID0geworCS8qIFJidWNrZmx5L1JfRUFSKDMyKSAqLworCXtXQ0Q5MzM1X0NEQ19DTFNIX0syX01TQiwgMHgwRiwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX0NMU0hfSzJfTFNCLCAweEZGLCAweDYwfSwKKwl7V0NEOTMzNV9DUEVfU1NfRE1JQ19DRkcsIDB4ODAsIDB4MDB9LAorCXtXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDcwLCAweDUwfSwKKwl7V0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3MCwgMHg1MH0sCisJe1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9BTkFfTE9fMV8yLCAweDNDLCAwWDNDfSwKKwl7V0NEOTMzNV9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSwgMHg3MCwgMHgwMH0sCisJe1dDRDkzMzVfU09DX01BRF9BVURJT19DVExfMiwgMHgwMywgMHgwM30sCisJe1dDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSwgMHgwMiwgMHgwMn0sCisJe1dDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfRUFSX0NNQlVGRiwgMHgwOCwgMHgwMH0sCisJe1dDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwzLCAweDgwLCAweDgwfSwKKwl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDgwfSwKKwl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3LCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9WQkFEQ19JQklBU19GRSwgMHgwQywgMHgwOH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaW5pdF8xX3hfdmFsW10gPSB7CisJLyogRW5hYmxlIFRYIEhQRiBGaWx0ZXIgJiBMaW5lYXIgUGhhc2UgKi8KKwl7V0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCisJe1dDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAorCXtXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKKwl7V0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCisJe1dDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAorCXtXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKKwl7V0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCisJe1dDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAorCXtXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKKwl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCisJe1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKKwl7V0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCisJe1dDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKKwl7V0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCisJe1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzAsIDB4RjgsIDB4RjB9LAorCXtXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMwLCAweEY4LCAweEYwfSwKKwl7V0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCisJe1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzAsIDB4RjgsIDB4Rjh9LAorCXtXQ0Q5MzM1X1JYX09DUF9DT1VOVCwgMHhGRiwgMHhGRn0sCisJe1dDRDkzMzVfSFBIX09DUF9DVEwsIDB4RjAsIDB4NzB9LAorCXtXQ0Q5MzM1X0NQRV9TU19DUEFSX0NGRywgMHhGRiwgMHgwMH0sCisJe1dDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSwgMHhGRiwgMHg2M30sCisJe1dDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCwgMHhGRiwgMHg3Rn0sCisJe1dDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEsIDB4RkYsIDB4NjB9LAorCXtXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF81LCAweEZGLCAweDQwfSwKKwl7V0NEOTMzNV9SWF9USU1FUl9ESVYsIDB4RkYsIDB4MzJ9LAorCXtXQ0Q5MzM1X1NFX0xPX0NPTTIsIDB4RkYsIDB4MDF9LAorCXtXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMLCAweDBGLCAweDA3fSwKKwl7V0NEOTMzNV9SWF9CSUFTX0hQSF9QQSwgMHhGMCwgMHg2MH0sCisJe1dDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCwgMHg4OCwgMHg4OH0sCisJe1dDRDkzMzVfSFBIX0xfRU4sIDB4MjAsIDB4MjB9LAorCXtXQ0Q5MzM1X0hQSF9SX0VOLCAweDIwLCAweDIwfSwKKwl7V0NEOTMzNV9ESUZGX0xPX0NPUkVfT1VUX1BST0csIDB4RkMsIDB4RDh9LAorCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzLCAweEJELCAweEJEfSwKKwl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMywgMHhCRCwgMHhCRH0sCisJe1dDRDkzMzVfRElGRl9MT19DT01fUEFfRlJFUSwgMHg3MCwgMHg0MH0sCit9OworCitzdGF0aWMgdm9pZCB0YXNoYV91cGRhdGVfcmVnX3Jlc2V0X3ZhbHVlcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTMyIGk7CisJc3RydWN0IHdjZDl4eHggKnRhc2hhX2NvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWlmIChUQVNIQV9JU18xXzEodGFzaGFfY29yZSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xKTsKKwkJICAgICBpKyspCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCSAgICAgIHRhc2hhX3JlZ191cGRhdGVfcmVzZXRfdmFsXzFfMVtpXS5yZWcsCisJCQkJICAgICAgdGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xW2ldLnZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTMyIGk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19pbml0X2NvbW1vbl92YWwpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5yZWcsCisJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5tYXNrLAorCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X2NvbW1vbl92YWxbaV0udmFsKTsKKworCWlmIChUQVNIQV9JU18xXzEod2NkOXh4eCkgfHwKKwkgICAgVEFTSEFfSVNfMV8wKHdjZDl4eHgpKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaW5pdF8xX3hfdmFsKTsgaSsrKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfMV94X3ZhbFtpXS5yZWcsCisJCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0XzFfeF92YWxbaV0ubWFzaywKKwkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfMV94X3ZhbFtpXS52YWwpOworCisJaWYgKFRBU0hBX0lTXzFfMSh3Y2Q5eHh4KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8xKTsgaSsrKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtpXS5yZWcsCisJCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8xXzFbaV0ubWFzaywKKwkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtpXS52YWwpOworCX0gZWxzZSBpZiAoVEFTSEFfSVNfMV8wKHdjZDl4eHgpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8xXzApOyBpKyspCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8wW2ldLnJlZywKKwkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMFtpXS5tYXNrLAorCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8wW2ldLnZhbCk7CisJfSBlbHNlIGlmIChUQVNIQV9JU18yXzAod2NkOXh4eCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzJfMCk7IGkrKykKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8yXzBbaV0ucmVnLAorCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMl8wW2ldLm1hc2ssCisJCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8yXzBbaV0udmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX3VwZGF0ZV9yZWdfZGVmYXVsdHMoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhKQoreworCXUzMiBpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCisJd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0cyk7IGkrKykKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkgICB0YXNoYV9jb2RlY19yZWdfZGVmYXVsdHNbaV0ucmVnLAorCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tpXS5tYXNrLAorCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tpXS52YWwpOworCisJdGFzaGEtPmludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOworCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaTJjX2RlZmF1bHRzKTsgaSsrKQorCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkJICAgdGFzaGFfY29kZWNfcmVnX2kyY19kZWZhdWx0c1tpXS5yZWcsCisJCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19pMmNfZGVmYXVsdHNbaV0ubWFzaywKKwkJCQkJICAgdGFzaGFfY29kZWNfcmVnX2kyY19kZWZhdWx0c1tpXS52YWwpOworCit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX3NsaW1faW50ZXJmYWNlX2luaXRfcmVnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZm9yIChpID0gMDsgaSA8IFdDRDlYWFhfU0xJTV9OVU1fUE9SVF9SRUc7IGkrKykKKwkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCisJCQkJCSAgICBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyBpLAorCQkJCQkgICAgMHhGRik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0YXNoYV9zbGltYnVzX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IDA7CisJaW50IGksIGosIHBvcnRfaWQsIGs7CisJdTMyIGJpdDsKKwl1OCB2YWwsIGludF92YWwgPSAwOworCWJvb2wgdHgsIGNsZWFyZWQ7CisJdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKKworCWZvciAoaSA9IFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19SWF8wLCBqID0gMDsKKwkgICAgIGkgPD0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzE7IGkrKywgaisrKSB7CisJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHByaXYtPndjZDl4eHgsIGkpOworCQlzdGF0dXMgfD0gKCh1MzIpdmFsIDw8ICg4ICogaikpOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaiwgJnN0YXR1cywgMzIpIHsKKwkJdHggPSAoaiA+PSAxNiA/IHRydWUgOiBmYWxzZSk7CisJCXBvcnRfaWQgPSAodHggPyBqIC0gMTYgOiBqKTsKKwkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQocHJpdi0+d2NkOXh4eCwKKwkJCQlUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwICsgaik7CisJCWlmICh2YWwpIHsKKwkJCWlmICghdHgpCisJCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWVsc2UKKwkJCQlyZWcgPSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKworCQkJCQkocG9ydF9pZCAvIDgpOworCQkJaW50X3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAorCQkJCXByaXYtPndjZDl4eHgsIHJlZyk7CisJCQkvKgorCQkJICogSWdub3JlIGludGVycnVwdHMgZm9yIHBvcnRzIGZvciB3aGljaCB0aGUKKwkJCSAqIGludGVycnVwdHMgYXJlIG5vdCBzcGVjaWZpY2FsbHkgZW5hYmxlZC4KKwkJCSAqLworCQkJaWYgKCEoaW50X3ZhbCAmICgxIDw8IChwb3J0X2lkICUgOCkpKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAodmFsICYgVEFTSEFfU0xJTV9JUlFfT1ZFUkZMT1cpCisJCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoCisJCQkgICAiJXM6IG92ZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAorCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKKwkJaWYgKHZhbCAmIFRBU0hBX1NMSU1fSVJRX1VOREVSRkxPVykKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgKKwkJCSAgICIlczogdW5kZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAorCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKKwkJaWYgKCh2YWwgJiBUQVNIQV9TTElNX0lSUV9PVkVSRkxPVykgfHwKKwkJCSh2YWwgJiBUQVNIQV9TTElNX0lSUV9VTkRFUkZMT1cpKSB7CisJCQlpZiAoIXR4KQorCQkJCXJlZyA9IFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0VOMCArCisJCQkJCShwb3J0X2lkIC8gOCk7CisJCQllbHNlCisJCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWludF92YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKKwkJCQlwcml2LT53Y2Q5eHh4LCByZWcpOworCQkJaWYgKGludF92YWwgJiAoMSA8PCAocG9ydF9pZCAlIDgpKSkgeworCQkJCWludF92YWwgPSBpbnRfdmFsIF4gKDEgPDwgKHBvcnRfaWQgJSA4KSk7CisJCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCisJCQkJCXJlZywgaW50X3ZhbCk7CisJCQl9CisJCX0KKwkJaWYgKHZhbCAmIFRBU0hBX1NMSU1fSVJRX1BPUlRfQ0xPU0VEKSB7CisJCQkvKgorCQkJICogSU5UIFNPVVJDRSByZWdpc3RlciBzdGFydHMgZnJvbSBSWCB0byBUWAorCQkJICogYnV0IHBvcnQgbnVtYmVyIGluIHRoZSBjaF9tYXNrIGlzIGluIG9wcG9zaXRlIHdheQorCQkJICovCisJCQliaXQgPSAodHggPyBqIC0gMTYgOiBqICsgMTYpOworCQkJcHJfZGVidWcoIiVzOiAlcyBwb3J0ICVkIGNsb3NlZCB2YWx1ZSAleCwgYml0ICV1XG4iLAorCQkJCSBfX2Z1bmNfXywgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkLCB2YWwsCisJCQkJIGJpdCk7CisJCQlmb3IgKGsgPSAwLCBjbGVhcmVkID0gZmFsc2U7IGsgPCBOVU1fQ09ERUNfREFJUzsgaysrKSB7CisJCQkJcHJfZGVidWcoIiVzOiBwcml2LT5kYWlbJWRdLmNoX21hc2sgPSAweCVseFxuIiwKKwkJCQkJIF9fZnVuY19fLCBrLCBwcml2LT5kYWlba10uY2hfbWFzayk7CisJCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChiaXQsCisJCQkJCQkgICAgICAgJnByaXYtPmRhaVtrXS5jaF9tYXNrKSkgeworCQkJCQljbGVhcmVkID0gdHJ1ZTsKKwkJCQkJaWYgKCFwcml2LT5kYWlba10uY2hfbWFzaykKKwkJCQkJCXdha2VfdXAoJnByaXYtPmRhaVtrXS5kYWlfd2FpdCk7CisJCQkJCS8qCisJCQkJCSAqIFRoZXJlIGFyZSBjYXNlcyB3aGVuIG11bHRpcGxlIERBSXMKKwkJCQkJICogbWlnaHQgYmUgdXNpbmcgdGhlIHNhbWUgc2xpbWJ1cworCQkJCQkgKiBjaGFubmVsLiBIZW5jZSBkb24ndCBicmVhayBoZXJlLgorCQkJCQkgKi8KKwkJCQl9CisJCQl9CisJCQlXQVJOKCFjbGVhcmVkLAorCQkJICAgICAiQ291bGRuJ3QgZmluZCBzbGltYnVzICVzIHBvcnQgJWQgZm9yIGNsb3NpbmdcbiIsCisJCQkgICAgICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCk7CisJCX0KKwkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCisJCQkJCSAgICBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMCArCisJCQkJCSAgICAoaiAvIDgpLAorCQkJCQkgICAgMSA8PCAoaiAlIDgpKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfc2V0dXBfaXJxcyhzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQorCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKKworCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIFdDRDlYWFhfSVJRX1NMSU1CVVMsCisJCQkJICB0YXNoYV9zbGltYnVzX2lycSwgIlNMSU1CVVMgU2xhdmUiLCB0YXNoYSk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIFdDRDlYWFhfSVJRX1NMSU1CVVMpOworCWVsc2UKKwkJdGFzaGFfc2xpbV9pbnRlcmZhY2VfaW5pdF9yZWcoY29kZWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfaW5pdF9zbGltX3NsYXZlX2NmZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19zbGltYnVzX3NsYXZlX2NmZyAqY2ZnOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gcHJpdi0+d2NkOXh4eDsKKwl1aW50NjRfdCBlYWRkciA9IDA7CisKKwljZmcgPSAmcHJpdi0+c2xpbWJ1c19zbGF2ZV9jZmc7CisJY2ZnLT5taW5vcl92ZXJzaW9uID0gMTsKKwljZmctPnR4X3NsYXZlX3BvcnRfb2Zmc2V0ID0gMDsKKwljZmctPnJ4X3NsYXZlX3BvcnRfb2Zmc2V0ID0gMTY7CisKKwltZW1jcHkoJmVhZGRyLCAmd2NkOXh4eC0+c2xpbS0+ZV9hZGRyLCBzaXplb2Yod2NkOXh4eC0+c2xpbS0+ZV9hZGRyKSk7CisJV0FSTl9PTihzaXplb2Yod2NkOXh4eC0+c2xpbS0+ZV9hZGRyKSAhPSA2KTsKKwljZmctPmRldmljZV9lbnVtX2FkZHJfbHN3ID0gZWFkZHIgJiAweEZGRkZGRkZGOworCWNmZy0+ZGV2aWNlX2VudW1fYWRkcl9tc3cgPSBlYWRkciA+PiAzMjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzbGltYnVzIGxvZ2ljYWwgYWRkcmVzcyAweCVsbHhcbiIsCisJCV9fZnVuY19fLCBlYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2hhX2NsZWFudXBfaXJxcyhzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgV0NEOVhYWF9JUlFfU0xJTUJVUywgdGFzaGEpOworfQorCitzdGF0aWMgaW50IHRhc2hhX2hhbmRsZV9wZGF0YShzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCisJCQkgICAgICBzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOworCXU4IGRtaWNfY3RsX3ZhbCwgbWFkX2RtaWNfY3RsX3ZhbDsKKwl1OCBhbmNfY3RsX3ZhbHVlOworCXUzMiBkZWZfZG1pY19yYXRlLCBkbWljX2Nsa19kcnY7CisJaW50IHZvdXRfY3RsXzEsIHZvdXRfY3RsXzIsIHZvdXRfY3RsXzMsIHZvdXRfY3RsXzQ7CisJaW50IHJjID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IE5VTEwgcGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogc2V0IG1pY2JpYXMgdm9sdGFnZSAqLworCXZvdXRfY3RsXzEgPSB3Y2Q5MzM1X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiMV9tdik7CisJdm91dF9jdGxfMiA9IHdjZDkzMzVfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHBkYXRhLT5taWNiaWFzLm1pY2IyX212KTsKKwl2b3V0X2N0bF8zID0gd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwocGRhdGEtPm1pY2JpYXMubWljYjNfbXYpOworCXZvdXRfY3RsXzQgPSB3Y2Q5MzM1X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiNF9tdik7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHZvdXRfY3RsXzEpIHx8IElTX0VSUl9WQUxVRSh2b3V0X2N0bF8yKSB8fAorCSAgICBJU19FUlJfVkFMVUUodm91dF9jdGxfMykgfHwgSVNfRVJSX1ZBTFVFKHZvdXRfY3RsXzQpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMSwgMHgzRiwgdm91dF9jdGxfMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUlDQjIsIDB4M0YsIHZvdXRfY3RsXzIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01JQ0IzLCAweDNGLCB2b3V0X2N0bF8zKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCNCwgMHgzRiwgdm91dF9jdGxfNCk7CisKKwkvKiBTZXQgdGhlIERNSUMgc2FtcGxlIHJhdGUgKi8KKwlzd2l0Y2ggKHBkYXRhLT5tY2xrX3JhdGUpIHsKKwljYXNlIFRBU0hBX01DTEtfQ0xLXzlQNk1IWjoKKwkJZGVmX2RtaWNfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDhNSFo7CisJCWJyZWFrOworCWNhc2UgVEFTSEFfTUNMS19DTEtfMTJQMjg4TUhaOgorCQlkZWZfZG1pY19yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQMDk2TUhaOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1jbGtfcmF0ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwZGF0YS0+bWNsa19yYXRlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfTsKKworCWlmIChwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9PQorCSAgICBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEKSB7CisJCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogZG1pY19yYXRlIGludmFsaWQgZGVmYXVsdCA9ICVkXG4iLAorCQkJX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOworCQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9IGRlZl9kbWljX3JhdGU7CisJfQorCWlmIChwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPT0KKwkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgeworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IG1hZF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGVmX2RtaWNfcmF0ZSk7CisJCS8qCisJCSAqIHVzZSBkbWljX3NhbXBsZV9yYXRlIGFzIHRoZSBkZWZhdWx0IGZvciBNQUQKKwkJICogaWYgbWFkIGRtaWMgc2FtcGxlIHJhdGUgaXMgdW5kZWZpbmVkCisJCSAqLworCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKKwl9CisJaWYgKHBkYXRhLT5lY3BwX2RtaWNfc2FtcGxlX3JhdGUgPT0KKwkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgeworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJICIlczogZWNwcF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCisJCQkgX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOworCQkvKgorCQkgKiB1c2UgZG1pY19zYW1wbGVfcmF0ZSBhcyB0aGUgZGVmYXVsdCBmb3IgRUNQUCBETUlDCisJCSAqIGlmIGVjcHAgZG1pYyBzYW1wbGUgcmF0ZSBpcyB1bmRlZmluZWQKKwkJICovCisJCXBkYXRhLT5lY3BwX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKKwl9CisKKwlpZiAocGRhdGEtPmRtaWNfY2xrX2RydiA9PQorCSAgICBXQ0Q5WFhYX0RNSUNfQ0xLX0RSSVZFX1VOREVGSU5FRCkgeworCQlwZGF0YS0+ZG1pY19jbGtfZHJ2ID0gV0NEOTMzNV9ETUlDX0NMS19EUklWRV9ERUZBVUxUOworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJICIlczogZG1pY19jbGtfc3RyZW5ndGggaW52YWxpZCwgZGVmYXVsdCA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBwZGF0YS0+ZG1pY19jbGtfZHJ2KTsKKwl9CisKKwlzd2l0Y2ggKHBkYXRhLT5kbWljX2Nsa19kcnYpIHsKKwljYXNlIDI6CisJCWRtaWNfY2xrX2RydiA9IDA7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZG1pY19jbGtfZHJ2ID0gMTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlkbWljX2Nsa19kcnYgPSAyOworCQlicmVhazsKKwljYXNlIDE2OgorCQlkbWljX2Nsa19kcnYgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGludmFsaWQgZG1pY19jbGtfZHJ2ICVkLCB1c2luZyBkZWZhdWx0XG4iLAorCQkJX19mdW5jX18sIHBkYXRhLT5kbWljX2Nsa19kcnYpOworCQlkbWljX2Nsa19kcnYgPSAwOworCQlicmVhazsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1RFU1RfREVCVUdfUEFEX0RSVkNUTCwKKwkJCSAgICAweDBDLCBkbWljX2Nsa19kcnYgPDwgMik7CisKKwkvKgorCSAqIERlZmF1bHQgdGhlIERNSUMgY2xrIHJhdGVzIHRvIG1hZF9kbWljX3NhbXBsZV9yYXRlLAorCSAqIHdoZXJlYXMsIHRoZSBhbmMvdHhmZSBkbWljIHJhdGVzIHRvIGRtaWNfc2FtcGxlX3JhdGUKKwkgKiBzaW5jZSB0aGUgYW5jL3R4ZmUgYXJlIGluZGVwZW5kZW50IG9mIG1hZCBibG9jay4KKwkgKi8KKwltYWRfZG1pY19jdGxfdmFsID0gdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbCh0YXNoYS0+Y29kZWMsCisJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0RNSUMwX0NUTCwKKwkJMHgwRSwgbWFkX2RtaWNfY3RsX3ZhbCA8PCAxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEwsCisJCTB4MEUsIG1hZF9kbWljX2N0bF92YWwgPDwgMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfRE1JQzJfQ1RMLAorCQkweDBFLCBtYWRfZG1pY19jdGxfdmFsIDw8IDEpOworCisJZG1pY19jdGxfdmFsID0gdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbCh0YXNoYS0+Y29kZWMsCisJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSk7CisKKwlpZiAoZG1pY19jdGxfdmFsID09IFdDRDkzMzVfRE1JQ19DTEtfRElWXzIpCisJCWFuY19jdGxfdmFsdWUgPSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0ZVTExfUkFURTsKKwllbHNlCisJCWFuY19jdGxfdmFsdWUgPSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0hBTEZfUkFURTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8yX0NUTCwKKwkJCSAgICAweDQwLCBhbmNfY3RsX3ZhbHVlIDw8IDYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8yX0NUTCwKKwkJCSAgICAweDIwLCBhbmNfY3RsX3ZhbHVlIDw8IDUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCwKKwkJCSAgICAweDQwLCBhbmNfY3RsX3ZhbHVlIDw8IDYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCwKKwkJCSAgICAweDIwLCBhbmNfY3RsX3ZhbHVlIDw8IDUpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2NkX2NwZV9jb3JlICp0YXNoYV9jb2RlY19nZXRfY3BlX2NvcmUoCisJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmV0dXJuIHByaXYtPmNwZV9jb3JlOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NwZV9mbGxfdXBkYXRlX2RpdmlkZXIoCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1MzIgY3BlX2ZsbF9yYXRlKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1MzIgZGl2X3ZhbCA9IDAsIGxfdmFsID0gMDsKKwl1MzIgY29tcHV0ZWRfY3BlX2ZsbDsKKworCWlmIChjcGVfZmxsX3JhdGUgIT0gQ1BFX0ZMTF9DTEtfNzVNSFogJiYKKwkgICAgY3BlX2ZsbF9yYXRlICE9IENQRV9GTExfQ0xLXzE1ME1IWikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgQ1BFIGZsbCByYXRlIHJlcXVlc3QgJXVcbiIsCisJCQlfX2Z1bmNfXywgY3BlX2ZsbF9yYXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdjZDl4eHgtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS18xMlAyODhNSFopIHsKKwkJLyogdXBkYXRlIGRpdmlkZXIgdG8gMTAgYW5kIGVuYWJsZSA1eCBkaXZpZGVyICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8xLAorCQkJICAgICAgMHg1NSk7CisJCWRpdl92YWwgPSAxMDsKKwl9IGVsc2UgaWYgKHdjZDl4eHgtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS185UDZNSFopIHsKKwkJLyogdXBkYXRlIGRpdmlkZXIgdG8gOCBhbmQgZW5hYmxlIDJ4IGRpdmlkZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAsCisJCQkJICAgIDB4N0MsIDB4NzApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMSwKKwkJCQkgICAgMHhFMCwgMHgyMCk7CisJCWRpdl92YWwgPSA4OworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBNQ0xLIHJhdGUgJXVcbiIsCisJCQlfX2Z1bmNfXywgd2NkOXh4eC0+bWNsa19yYXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbF92YWwgPSAoKGNwZV9mbGxfcmF0ZSAvIDEwMDApICogZGl2X3ZhbCkgLworCQkgKHdjZDl4eHgtPm1jbGtfcmF0ZSAvIDEwMDApOworCisJLyogSWYgbF92YWwgd2FzIGludGVnZXIgdHJ1bmNhdGVkLCBpbmNyZW1lbnQgbF92YWwgb25jZSAqLworCWNvbXB1dGVkX2NwZV9mbGwgPSAod2NkOXh4eC0+bWNsa19yYXRlIC8gZGl2X3ZhbCkgKiBsX3ZhbDsKKwlpZiAoY29tcHV0ZWRfY3BlX2ZsbCA8IGNwZV9mbGxfcmF0ZSkKKwkJbF92YWwrKzsKKworCisJLyogdXBkYXRlIEwgdmFsdWUgTFNCIGFuZCBNU0IgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzAsCisJCSAgICAgIChsX3ZhbCAmIDB4RkYpKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzEsCisJCSAgICAgICgobF92YWwgPj4gOCkgJiAweEZGKSk7CisKKwl0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEgPSBjcGVfZmxsX3JhdGU7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IHVwZGF0ZWQgbF92YWwgdG8gJXUgZm9yIGNwZV9jbGsgJXUgYW5kIG1jbGsgJXVcbiIsCisJCV9fZnVuY19fLCBsX3ZhbCwgY3BlX2ZsbF9yYXRlLCB3Y2Q5eHh4LT5tY2xrX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX190YXNoYV9jZGNfY2hhbmdlX2NwZV9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQl1MzIgY2xrX2ZyZXEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIXRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBTVlMgbm90IGVuYWJsZWQgb3IgdGFzaGEgaXMgbm90IDJwMCwgcmV0dXJuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNsa19mcmVxID0gJXVcbiIsIF9fZnVuY19fLCBjbGtfZnJlcSk7CisKKwlpZiAoY2xrX2ZyZXEgPT0gQ1BFX0ZMTF9DTEtfNzVNSFopIHsKKwkJLyogQ2hhbmdlIHRvIFNWUyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCisJCQkJICAgIDB4MDgsIDB4MDgpOworCQlpZiAodGFzaGFfY29kZWNfY3BlX2ZsbF91cGRhdGVfZGl2aWRlcihjb2RlYywgY2xrX2ZyZXEpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAorCQkJCSAgICAweDEwLCAweDEwKTsKKworCQljbGVhcl9iaXQoQ1BFX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOworCQl0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKHRhc2hhLCBzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UpOworCisJfSBlbHNlIGlmIChjbGtfZnJlcSA9PSBDUEVfRkxMX0NMS18xNTBNSFopIHsKKwkJLyogY2hhbmdlIHRvIG5vbWluYWwgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAorCQkJCSAgICAweDA4LCAweDA4KTsKKworCQlzZXRfYml0KENQRV9OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKKwkJdGFzaGFfY29kZWNfdXBkYXRlX3NpZG9fdm9sdGFnZSh0YXNoYSwgU0lET19WT0xUQUdFX05PTUlOQUxfTVYpOworCisJCWlmICh0YXNoYV9jb2RlY19jcGVfZmxsX3VwZGF0ZV9kaXZpZGVyKGNvZGVjLCBjbGtfZnJlcSkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAorCQkJCSAgICAweDEwLCAweDEwKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgY2xrX2ZyZXEgcmVxdWVzdCAlZCBmb3IgQ1BFIEZMTFxuIiwKKwkJCV9fZnVuY19fLCBjbGtfZnJlcSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCitkb25lOgorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwKKwkJCSAgICAweDEwLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCisJCQkgICAgMHgwOCwgMHgwMCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NwZV9mbGxfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXU4IGNsa19zZWxfcmVnX3ZhbCA9IDB4MDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgZW5hYmxlID8gInRydWUiIDogImZhbHNlIik7CisKKwlpZiAoZW5hYmxlKSB7CisJCWlmICh0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQodGFzaGEpKSB7CisJCQkvKiBGTEwgZW5hYmxlIGlzIGFsd2F5cyBhdCBTVlMgKi8KKwkJCWlmIChfX3Rhc2hhX2NkY19jaGFuZ2VfY3BlX2Nsayhjb2RlYywKKwkJCQkJQ1BFX0ZMTF9DTEtfNzVNSFopKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkiJXM6IGNsayBjaGFuZ2UgdG8gJWQgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgQ1BFX0ZMTF9DTEtfNzVNSFopOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHRhc2hhX2NvZGVjX2NwZV9mbGxfdXBkYXRlX2RpdmlkZXIoY29kZWMsCisJCQkJCQkJQ1BFX0ZMTF9DTEtfNzVNSFopKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkiJXM6IGNsayBjaGFuZ2UgdG8gJWQgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgQ1BFX0ZMTF9DTEtfNzVNSFopOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJaWYgKFRBU0hBX0lTXzFfMCh3Y2Q5eHh4KSkgeworCQkJdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCB0cnVlLCBmYWxzZSk7CisJCQljbGtfc2VsX3JlZ192YWwgPSAweDAyOworCQl9CisKKwkJLyogU2V0dXAgQ1BFIHJlZmVyZW5jZSBjbGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKKwkJCQkgICAgMHgwMiwgY2xrX3NlbF9yZWdfdmFsKTsKKworCQkvKiBlbmFibGUgQ1BFIEZMTCByZWZlcmVuY2UgY2xrICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0NMS19UT1AsCisJCQkJICAgIDB4MDEsIDB4MDEpOworCisJCS8qIHByb2dyYW0gdGhlIFBMTCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMCwKKwkJCQkgICAgMHgwMSwgMHgwMSk7CisKKwkJLyogVEVTVCBjbGsgc2V0dGluZyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMCwKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJCS8qIHNldCBGTEwgbW9kZSB0byBIVyBjb250cm9sbGVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwKKwkJCQkgICAgMHg2MCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwgMHg4MCk7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBDUEUgRkxMIHJlZmVyZW5jZSBjbGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKKwkJCQkgICAgMHgwMSwgMHgwMCk7CisJCS8qIHVuZG8gVEVTVCBjbGsgc2V0dGluZyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMCwKKwkJCQkgICAgMHg4MCwgMHgwMCk7CisJCS8qIHVuZG8gRkxMIG1vZGUgdG8gSFcgY29udHJvbCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCisJCQkJICAgIDB4NjAsIDB4MjApOworCQkvKiB1bmRvIHRoZSBQTEwgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAsCisJCQkJICAgIDB4MDEsIDB4MDApOworCisJCWlmIChUQVNIQV9JU18xXzAod2NkOXh4eCkpCisJCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisKKwkJLyoKKwkJICogRkxMIGNvdWxkIGdldCBkaXNhYmxlZCB3aGlsZSBhdCBub21pbmFsLAorCQkgKiBzY2FsZSBpdCBiYWNrIHRvIFNWUworCQkgKi8KKwkJaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpCisJCQlfX3Rhc2hhX2NkY19jaGFuZ2VfY3BlX2Nsayhjb2RlYywKKwkJCQkJCUNQRV9GTExfQ0xLXzc1TUhaKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCB0YXNoYV9jZGNfcXVlcnlfY3BlX2Nsa19wbGFuKHZvaWQgKmRhdGEsCisJCXN0cnVjdCBjcGVfc3ZjX2NmZ19jbGtfcGxhbiAqY2xrX2ZyZXEpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGF0YTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJdTMyIGNwZV9jbGtfa2h6OworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvZGVjIGhhbmRsZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY3BlX2Nsa19raHogPSB0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEgLyAxMDAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IGN1cnJlbnRfY2xrX2ZyZXEgPSAldVxuIiwKKwkJX19mdW5jX18sIHRhc2hhLT5jdXJyZW50X2NwZV9jbGtfZnJlcSk7CisKKwljbGtfZnJlcS0+Y3VycmVudF9jbGtfZmVxID0gY3BlX2Nsa19raHo7CisJY2xrX2ZyZXEtPm51bV9jbGtfZnJlcXMgPSAyOworCisJaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKKwkJY2xrX2ZyZXEtPmNsa19mcmVxc1swXSA9IENQRV9GTExfQ0xLXzc1TUhaIC8gMTAwMDsKKwkJY2xrX2ZyZXEtPmNsa19mcmVxc1sxXSA9IENQRV9GTExfQ0xLXzE1ME1IWiAvIDEwMDA7CisJfSBlbHNlIHsKKwkJY2xrX2ZyZXEtPmNsa19mcmVxc1swXSA9IENQRV9GTExfQ0xLXzc1TUhaOworCQljbGtfZnJlcS0+Y2xrX2ZyZXFzWzFdID0gQ1BFX0ZMTF9DTEtfMTUwTUhaOworCX0KK30KKworc3RhdGljIHZvaWQgdGFzaGFfY2RjX2NoYW5nZV9jcGVfY2xrKHZvaWQgKmRhdGEsCisJCXUzMiBjbGtfZnJlcSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYXRhOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwl1MzIgY3BlX2Nsa19raHosIHJlcV9mcmVxID0gMDsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb2RlYyBoYW5kbGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWNwZV9jbGtfa2h6ID0gdGFzaGEtPmN1cnJlbnRfY3BlX2Nsa19mcmVxIC8gMTAwMDsKKworCWlmICh0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQodGFzaGEpKSB7CisJCWlmICgoY2xrX2ZyZXEgKiAxMDAwKSA8PSBDUEVfRkxMX0NMS183NU1IWikKKwkJCXJlcV9mcmVxID0gQ1BFX0ZMTF9DTEtfNzVNSFo7CisJCWVsc2UKKwkJCXJlcV9mcmVxID0gQ1BFX0ZMTF9DTEtfMTUwTUhaOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwKKwkJIiVzOiByZXF1ZXN0ZWQgY2xrX2ZyZXEgPSAldSwgY3VycmVudCBjbGtfZnJlcSA9ICV1XG4iLAorCQlfX2Z1bmNfXywgY2xrX2ZyZXEgKiAxMDAwLAorCQl0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEpOworCisJaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKKwkJaWYgKF9fdGFzaGFfY2RjX2NoYW5nZV9jcGVfY2xrKGNvZGVjLCByZXFfZnJlcSkpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBjbG9jay92b2x0YWdlIHNjYWxpbmcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY29kZWNfc2xpbV9yZXNlcnZlX2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdTMyIGJ3X29wcywgYm9vbCBjb21taXQpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvZGVjXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoIXdjZDl4eHgpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcGFyZW50IGRydl9kYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gd2NkOXh4eF9zbGltX3Jlc2VydmVfYncod2NkOXh4eCwgYndfb3BzLCBjb21taXQpOworfQorCitzdGF0aWMgaW50IHRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWJvb2wgdm90ZSkKK3sKKwl1MzIgYndfb3BzOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCisJCXJldHVybiAwOworCisJaWYgKHZvdGUpCisJCWJ3X29wcyA9IFNMSU1fQldfQ0xLX0dFQVJfOTsKKwllbHNlCisJCWJ3X29wcyA9IFNMSU1fQldfVU5WT1RFOworCisJcmV0dXJuIHRhc2hhX2NvZGVjX3NsaW1fcmVzZXJ2ZV9idyhjb2RlYywKKwkJCWJ3X29wcywgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfY3BlX2Vycl9pcnFfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJZW51bSBjcGVfZXJyX2lycV9jbnRsX3R5cGUgY250bF90eXBlLCB1OCAqc3RhdHVzKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXU4IGlycV9iaXRzOworCisJaWYgKFRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpCisJCWlycV9iaXRzID0gMHhGRjsKKwllbHNlCisJCWlycV9iaXRzID0gMHgzRjsKKworCWlmIChzdGF0dXMpCisJCWlycV9iaXRzID0gKCpzdGF0dXMpICYgaXJxX2JpdHM7CisKKwlzd2l0Y2ggKGNudGxfdHlwZSkgeworCWNhc2UgQ1BFX0VSUl9JUlFfTUFTSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0ssCisJCQkJICAgIGlycV9iaXRzLCBpcnFfYml0cyk7CisJCWJyZWFrOworCWNhc2UgQ1BFX0VSUl9JUlFfVU5NQVNLOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCSAgICBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfTUFTSywKKwkJCQkgICAgaXJxX2JpdHMsIDB4MDApOworCQlicmVhazsKKwljYXNlIENQRV9FUlJfSVJRX0NMRUFSOgorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVIsCisJCQkgICAgICBpcnFfYml0cyk7CisJCWJyZWFrOworCWNhc2UgQ1BFX0VSUl9JUlFfU1RBVFVTOgorCQlpZiAoIXN0YXR1cykKKwkJCXJldHVybiAtRUlOVkFMOworCQkqc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCSAgICAgICBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX2NwZV9jZGNfY2IgY3BlX2NiID0geworCS5jZGNfY2xrX2VuID0gdGFzaGFfY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwsCisJLmNwZV9jbGtfZW4gPSB0YXNoYV9jb2RlY19jcGVfZmxsX2VuYWJsZSwKKwkuZ2V0X2FmZV9vdXRfcG9ydF9pZCA9IHRhc2hhX2NvZGVjX2dldF9tYWRfcG9ydF9pZCwKKwkubGFiX2NkY19jaF9jdGwgPSB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4X21hZCwKKwkuY2RjX2V4dF9jbGsgPSB0YXNoYV9jZGNfbWNsa19lbmFibGUsCisJLmJ1c192b3RlX2J3ID0gdGFzaGFfY29kZWNfdm90ZV9tYXhfYncsCisJLmNwZV9lcnJfaXJxX2NvbnRyb2wgPSB0YXNoYV9jcGVfZXJyX2lycV9jb250cm9sLAorfTsKKworc3RhdGljIHN0cnVjdCBjcGVfc3ZjX2luaXRfcGFyYW0gY3BlX3N2Y19wYXJhbXMgPSB7CisJLnZlcnNpb24gPSBDUEVfU1ZDX0lOSVRfUEFSQU1fVjEsCisJLnF1ZXJ5X2ZyZXFfcGxhbnNfY2IgPSB0YXNoYV9jZGNfcXVlcnlfY3BlX2Nsa19wbGFuLAorCS5jaGFuZ2VfZnJlcV9wbGFuX2NiID0gdGFzaGFfY2RjX2NoYW5nZV9jcGVfY2xrLAorfTsKKworc3RhdGljIGludCB0YXNoYV9jcGVfaW5pdGlhbGl6ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZF9jcGVfcGFyYW1zIGNwZV9wYXJhbXM7CisKKwltZW1zZXQoJmNwZV9wYXJhbXMsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgd2NkX2NwZV9wYXJhbXMpKTsKKwljcGVfcGFyYW1zLmNvZGVjID0gY29kZWM7CisJY3BlX3BhcmFtcy5nZXRfY3BlX2NvcmUgPSB0YXNoYV9jb2RlY19nZXRfY3BlX2NvcmU7CisJY3BlX3BhcmFtcy5jZGNfY2IgPSAmY3BlX2NiOworCWNwZV9wYXJhbXMuZGJnX21vZGUgPSBjcGVfZGVidWdfbW9kZTsKKwljcGVfcGFyYW1zLmNkY19tYWpvcl92ZXIgPSBDUEVfU1ZDX0NPREVDX1dDRDkzMzU7CisJY3BlX3BhcmFtcy5jZGNfbWlub3JfdmVyID0gQ1BFX1NWQ19DT0RFQ19WMVAwOworCWNwZV9wYXJhbXMuY2RjX2lkID0gQ1BFX1NWQ19DT0RFQ19XQ0Q5MzM1OworCisJY3BlX3BhcmFtcy5jZGNfaXJxX2luZm8uY3BlX2VuZ2luZV9pcnEgPQorCQkJV0NEOTMzNV9JUlFfU1ZBX09VVEJPWDE7CisJY3BlX3BhcmFtcy5jZGNfaXJxX2luZm8uY3BlX2Vycl9pcnEgPQorCQkJV0NEOTMzNV9JUlFfU1ZBX0VSUk9SOworCWNwZV9wYXJhbXMuY2RjX2lycV9pbmZvLmNwZV9mYXRhbF9pcnFzID0KKwkJCVRBU0hBX0NQRV9GQVRBTF9JUlFTOworCisJY3BlX3N2Y19wYXJhbXMuY29udGV4dCA9IGNvZGVjOworCWNwZV9wYXJhbXMuY3BlX3N2Y19wYXJhbXMgPSAmY3BlX3N2Y19wYXJhbXM7CisKKwl0YXNoYS0+Y3BlX2NvcmUgPSB3Y2RfY3BlX2luaXQoImNwZV85MzM1IiwgY29kZWMsCisJCQkJCSZjcGVfcGFyYW1zKTsKKwlpZiAoSVNfRVJSX09SX05VTEwodGFzaGEtPmNwZV9jb3JlKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBlbmFibGUgQ1BFXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfcmVzbWdyX2NiIHRhc2hhX3Jlc21ncl9jYiA9IHsKKwkuY2RjX3Jjb19jdHJsID0gX190YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCwKK307CisKK3N0YXRpYyBpbnQgdGFzaGFfZGV2aWNlX2Rvd24oc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2OworCWludCBjb3VudDsKKwlpbnQgaSA9IDA7CisKKwljb2RlYyA9IChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKSh3Y2Q5eHh4LT5zc3JfcHJpdik7CisJcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXdjZF9jcGVfc3NyX2V2ZW50KHByaXYtPmNwZV9jb3JlLCBXQ0RfQ1BFX0JVU19ET1dOX0VWRU5UKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnI7IGkrKykKKwkJc3dybV93Y2Rfbm90aWZ5KHByaXYtPnN3cl9jdHJsX2RhdGFbaV0uc3dyX3BkZXYsCisJCQkJU1dSX0RFVklDRV9ET1dOLCBOVUxMKTsKKwlzbmRfc29jX2NhcmRfY2hhbmdlX29ubGluZV9zdGF0ZShjb2RlYy0+Y29tcG9uZW50LmNhcmQsIDApOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE5VTV9DT0RFQ19EQUlTOyBjb3VudCsrKQorCQlwcml2LT5kYWlbY291bnRdLmJ1c19kb3duX2luX3JlY292ZXJ5ID0gdHJ1ZTsKKworCXByaXYtPnJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9JTlRFUk5BTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3Bvc3RfcmVzZXRfY2Ioc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHggKmNvbnRyb2w7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7CisKKwljb2RlYyA9IChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKSh3Y2Q5eHh4LT5zc3JfcHJpdik7CisJdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXNoYS0+d2NkOXh4eCwKKwkJCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKKwkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKKworCW11dGV4X2xvY2soJnRhc2hhLT5jb2RlY19tdXRleCk7CisKKwl0YXNoYV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9pbnRmZGV2X2xhID0KKwkJY29udHJvbC0+c2xpbV9zbGF2ZS0+bGFkZHI7CisJdGFzaGFfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9kZXZfcGdkX2xhID0KKwkJY29udHJvbC0+c2xpbS0+bGFkZHI7CisJdGFzaGFfaW5pdF9zbGltX3NsYXZlX2NmZyhjb2RlYyk7CisJaWYgKHRhc2hhLT5tYWNoaW5lX2NvZGVjX2V2ZW50X2NiKQorCQl0YXNoYS0+bWFjaGluZV9jb2RlY19ldmVudF9jYihjb2RlYywKKwkJCQlXQ0Q5MzM1X0NPREVDX0VWRU5UX0NPREVDX1VQKTsKKwlzbmRfc29jX2NhcmRfY2hhbmdlX29ubGluZV9zdGF0ZShjb2RlYy0+Y29tcG9uZW50LmNhcmQsIDEpOworCisJLyogQ2xhc3MtSCBJbml0Ki8KKwl3Y2RfY2xzaF9pbml0KCZ0YXNoYS0+Y2xzaF9kKTsKKwkvKiBEZWZhdWx0IEhQSCBNb2RlIHRvIENsYXNzLUggSGlGaSAqLworCXRhc2hhLT5ocGhfbW9kZSA9IENMU19IX0hJRkk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEFTSEFfTUFYX01JQ0JJQVM7IGkrKykKKwkJdGFzaGEtPm1pY2JfcmVmW2ldID0gMDsKKworCXRhc2hhX3VwZGF0ZV9yZWdfZGVmYXVsdHModGFzaGEpOworCisJdGFzaGEtPmNvZGVjID0gY29kZWM7CisJZm9yIChpID0gMDsgaSA8IENPTVBBTkRFUl9NQVg7IGkrKykKKwkJdGFzaGEtPmNvbXBfZW5hYmxlZFtpXSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTUNMSyBSYXRlID0gJXhcbiIsCisJCV9fZnVuY19fLCBjb250cm9sLT5tY2xrX3JhdGUpOworCisJaWYgKGNvbnRyb2wtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS18xMlAyODhNSFopCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCQkgICAgMHgwMywgMHgwMCk7CisJZWxzZSBpZiAoY29udHJvbC0+bWNsa19yYXRlID09IFRBU0hBX01DTEtfQ0xLXzlQNk1IWikKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAorCQkJCSAgICAweDAzLCAweDAxKTsKKwl0YXNoYV9jb2RlY19pbml0X3JlZyhjb2RlYyk7CisKKwl3Y2RfcmVzbWdyX3Bvc3Rfc3NyX3YyKHRhc2hhLT5yZXNtZ3IpOworCisJdGFzaGFfZW5hYmxlX2VmdXNlX3NlbnNpbmcoY29kZWMpOworCisJcmVnY2FjaGVfbWFya19kaXJ0eShjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCk7CisJcmVnY2FjaGVfc3luYyhjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCk7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlyZXQgPSB0YXNoYV9oYW5kbGVfcGRhdGEodGFzaGEsIHBkYXRhKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIHBkYXRhXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBNQkhDIEluaXQgKi8KKwl3Y2RfbWJoY19kZWluaXQoJnRhc2hhLT5tYmhjKTsKKwl0YXNoYS0+bWJoY19zdGFydGVkID0gZmFsc2U7CisKKwkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCisJcmV0ID0gd2NkX21iaGNfaW5pdCgmdGFzaGEtPm1iaGMsIGNvZGVjLCAmbWJoY19jYiwgJmludHJfaWRzLAorCQkgICAgICB3Y2RfbWJoY19yZWdpc3RlcnMsIFRBU0hBX1pERVRfU1VQUE9SVEVEKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJZWxzZQorCQl0YXNoYV9tYmhjX2hzX2RldGVjdChjb2RlYywgdGFzaGEtPm1iaGMubWJoY19jZmcpOworCisJdGFzaGFfY2xlYW51cF9pcnFzKHRhc2hhKTsKKwlyZXQgPSB0YXNoYV9zZXR1cF9pcnFzKHRhc2hhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB0YXNoYSBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXRhc2hhX3NldF9zcGtyX21vZGUoY29kZWMsIHRhc2hhLT5zcGtyX21vZGUpOworCXdjZF9jcGVfc3NyX2V2ZW50KHRhc2hhLT5jcGVfY29yZSwgV0NEX0NQRV9CVVNfVVBfRVZFTlQpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICp0YXNoYV9jb2RlY19maW5kX29uZGVtYW5kX3JlZ3VsYXRvcigKKwkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJZm9yIChpID0gMDsgaSA8IHdjZDl4eHgtPm51bV9vZl9zdXBwbGllczsgKytpKSB7CisJCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kICYmCisJCQl3Y2Q5eHh4LT5zdXBwbGllc1tpXS5zdXBwbHkgJiYKKwkJCSFzdHJjbXAod2NkOXh4eC0+c3VwcGxpZXNbaV0uc3VwcGx5LCBuYW1lKSkKKwkJCXJldHVybiB3Y2Q5eHh4LT5zdXBwbGllc1tpXS5jb25zdW1lcjsKKwl9CisKKwlkZXZfZGJnKHRhc2hhLT5kZXYsICJXYXJuaW5nOiByZWd1bGF0b3Igbm90IGZvdW5kOiVzXG4iLAorCQluYW1lKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYyhjb21wb25lbnQpOworCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJaW50IGksIHJldDsKKwl2b2lkICpwdHIgPSBOVUxMOworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKworCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl0YXNoYS0+aW50Zl90eXBlID0gd2NkOXh4eF9nZXRfaW50Zl90eXBlKCk7CisKKwlpZiAodGFzaGEtPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJY29udHJvbC0+ZGV2X2Rvd24gPSB0YXNoYV9kZXZpY2VfZG93bjsKKwkJY29udHJvbC0+cG9zdF9yZXNldCA9IHRhc2hhX3Bvc3RfcmVzZXRfY2I7CisJCWNvbnRyb2wtPnNzcl9wcml2ID0gKHZvaWQgKiljb2RlYzsKKwl9CisKKwkvKiBSZXNvdXJjZSBNYW5hZ2VyIHBvc3QgSW5pdCAqLworCXJldCA9IHdjZF9yZXNtZ3JfcG9zdF9pbml0KHRhc2hhLT5yZXNtZ3IsICZ0YXNoYV9yZXNtZ3JfY2IsIGNvZGVjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3Y2QgcmVzbWdyIHBvc3QgaW5pdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBDbGFzcy1IIEluaXQqLworCXdjZF9jbHNoX2luaXQoJnRhc2hhLT5jbHNoX2QpOworCS8qIERlZmF1bHQgSFBIIE1vZGUgdG8gQ2xhc3MtSCBIaUZpICovCisJdGFzaGEtPmhwaF9tb2RlID0gQ0xTX0hfSElGSTsKKworCXRhc2hhLT5jb2RlYyA9IGNvZGVjOworCWZvciAoaSA9IDA7IGkgPCBDT01QQU5ERVJfTUFYOyBpKyspCisJCXRhc2hhLT5jb21wX2VuYWJsZWRbaV0gPSAwOworCisJdGFzaGEtPnNwa3JfZ2Fpbl9vZmZzZXQgPSBSWF9HQUlOX09GRlNFVF8wX0RCOworCXRhc2hhLT5pbnRmX3R5cGUgPSB3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKTsKKwl0YXNoYV91cGRhdGVfcmVnX3Jlc2V0X3ZhbHVlcyhjb2RlYyk7CisJcHJfZGVidWcoIiVzOiBNQ0xLIFJhdGUgPSAleFxuIiwgX19mdW5jX18sIGNvbnRyb2wtPm1jbGtfcmF0ZSk7CisJaWYgKGNvbnRyb2wtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS18xMlAyODhNSFopCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCQkgICAgMHgwMywgMHgwMCk7CisJZWxzZSBpZiAoY29udHJvbC0+bWNsa19yYXRlID09IFRBU0hBX01DTEtfQ0xLXzlQNk1IWikKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAorCQkJCSAgICAweDAzLCAweDAxKTsKKwl0YXNoYV9jb2RlY19pbml0X3JlZyhjb2RlYyk7CisKKwl0YXNoYV9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhjb2RlYyk7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlyZXQgPSB0YXNoYV9oYW5kbGVfcGRhdGEodGFzaGEsIHBkYXRhKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJcHJfZXJyKCIlczogYmFkIHBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCXN1cHBseSA9IHRhc2hhX2NvZGVjX2ZpbmRfb25kZW1hbmRfcmVndWxhdG9yKGNvZGVjLAorCQlvbl9kZW1hbmRfc3VwcGx5X25hbWVbT05fREVNQU5EX01JQ0JJQVNdKTsKKwlpZiAoc3VwcGx5KSB7CisJCXRhc2hhLT5vbl9kZW1hbmRfbGlzdFtPTl9ERU1BTkRfTUlDQklBU10uc3VwcGx5ID0gc3VwcGx5OworCQl0YXNoYS0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdLm9uZGVtYW5kX3N1cHBseV9jb3VudCA9CisJCQkJMDsKKwl9CisKKwl0YXNoYS0+ZndfZGF0YSA9IGRldm1fa3phbGxvYyhjb2RlYy0+ZGV2LAorCQkJCSAgICAgIHNpemVvZigqKHRhc2hhLT5md19kYXRhKSksIEdGUF9LRVJORUwpOworCWlmICghdGFzaGEtPmZ3X2RhdGEpCisJCWdvdG8gZXJyOworCXNldF9iaXQoV0NEOVhYWF9BTkNfQ0FMLCB0YXNoYS0+ZndfZGF0YS0+Y2FsX2JpdCk7CisJc2V0X2JpdChXQ0Q5WFhYX01CSENfQ0FMLCB0YXNoYS0+ZndfZGF0YS0+Y2FsX2JpdCk7CisJc2V0X2JpdChXQ0Q5WFhYX01BRF9DQUwsIHRhc2hhLT5md19kYXRhLT5jYWxfYml0KTsKKwlzZXRfYml0KFdDRDlYWFhfVkJBVF9DQUwsIHRhc2hhLT5md19kYXRhLT5jYWxfYml0KTsKKworCXJldCA9IHdjZF9jYWxfY3JlYXRlX2h3ZGVwKHRhc2hhLT5md19kYXRhLAorCQkJCSAgIFdDRDlYWFhfQ09ERUNfSFdERVBfTk9ERSwgY29kZWMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIGh3ZGVwIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2h3ZGVwOworCX0KKworCS8qIEluaXRpYWxpemUgTUJIQyBtb2R1bGUgKi8KKwlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkgeworCQl3Y2RfbWJoY19yZWdpc3RlcnNbV0NEX01CSENfRlNNX1NUQVRVU10ucmVnID0KKwkJCVdDRDkzMzVfTUJIQ19GU01fU1RBVFVTOworCQl3Y2RfbWJoY19yZWdpc3RlcnNbV0NEX01CSENfRlNNX1NUQVRVU10ubWFzayA9IDB4MDE7CisJfQorCXJldCA9IHdjZF9tYmhjX2luaXQoJnRhc2hhLT5tYmhjLCBjb2RlYywgJm1iaGNfY2IsICZpbnRyX2lkcywKKwkJICAgICAgd2NkX21iaGNfcmVnaXN0ZXJzLCBUQVNIQV9aREVUX1NVUFBPUlRFRCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBtYmhjIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9od2RlcDsKKwl9CisKKwlwdHIgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgKHNpemVvZih0YXNoYV9yeF9jaHMpICsKKwkJCSAgIHNpemVvZih0YXNoYV90eF9jaHMpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaHdkZXA7CisJfQorCisJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0YXNoYV9kYXBtX2kyc193aWRnZXRzLAorCQkJQVJSQVlfU0laRSh0YXNoYV9kYXBtX2kyc193aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX2kyc19tYXAsCisJCQlBUlJBWV9TSVpFKGF1ZGlvX2kyc19tYXApKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFzaGFfaTJzX2RhaSk7IGkrKykgeworCQkJSU5JVF9MSVNUX0hFQUQoJnRhc2hhLT5kYWlbaV0ud2NkOXh4eF9jaF9saXN0KTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRhc2hhLT5kYWlbaV0uZGFpX3dhaXQpOworCQl9CisJfSBlbHNlIGlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPREVDX0RBSVM7IGkrKykgeworCQkJSU5JVF9MSVNUX0hFQUQoJnRhc2hhLT5kYWlbaV0ud2NkOXh4eF9jaF9saXN0KTsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRhc2hhLT5kYWlbaV0uZGFpX3dhaXQpOworCQl9CisJCXRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X2ludGZkZXZfbGEgPQorCQkJCQljb250cm9sLT5zbGltX3NsYXZlLT5sYWRkcjsKKwkJdGFzaGFfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9kZXZfcGdkX2xhID0KKwkJCQkJY29udHJvbC0+c2xpbS0+bGFkZHI7CisJCXRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfcG9ydF9tYXBwaW5nWzBdID0KKwkJCQkJVEFTSEFfVFgxMzsKKwkJdGFzaGFfaW5pdF9zbGltX3NsYXZlX2NmZyhjb2RlYyk7CisJfQorCisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHMsCisJCQkJICAgQVJSQVlfU0laRShpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzKSk7CisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGhwaF90eXBlX2RldGVjdF9jb250cm9scywKKwkJCQkgICBBUlJBWV9TSVpFKGhwaF90eXBlX2RldGVjdF9jb250cm9scykpOworCisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsCisJCQl0YXNoYV9hbmFsb2dfZ2Fpbl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUodGFzaGFfYW5hbG9nX2dhaW5fY29udHJvbHMpKTsKKwljb250cm9sLT5udW1fcnhfcG9ydCA9IFRBU0hBX1JYX01BWDsKKwljb250cm9sLT5yeF9jaHMgPSBwdHI7CisJbWVtY3B5KGNvbnRyb2wtPnJ4X2NocywgdGFzaGFfcnhfY2hzLCBzaXplb2YodGFzaGFfcnhfY2hzKSk7CisJY29udHJvbC0+bnVtX3R4X3BvcnQgPSBUQVNIQV9UWF9NQVg7CisJY29udHJvbC0+dHhfY2hzID0gcHRyICsgc2l6ZW9mKHRhc2hhX3J4X2Nocyk7CisJbWVtY3B5KGNvbnRyb2wtPnR4X2NocywgdGFzaGFfdHhfY2hzLCBzaXplb2YodGFzaGFfdHhfY2hzKSk7CisKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjEgUGxheWJhY2siKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjEgQ2FwdHVyZSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMiBQbGF5YmFjayIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMiBDYXB0dXJlIik7CisKKwlpZiAodGFzaGEtPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYzIFBsYXliYWNrIik7CisJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMyBDYXB0dXJlIik7CisJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBQbGF5YmFjayIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRiBNaXggUGxheWJhY2siKTsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUY0IE1BRCBUWCIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlZJZmVlZCIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjUgQ1BFIFRYIik7CisJfQorCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlyZXQgPSB0YXNoYV9zZXR1cF9pcnFzKHRhc2hhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHRhc2hhIGlycSBzZXR1cCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9wZGF0YTsKKwl9CisKKwlyZXQgPSB0YXNoYV9jcGVfaW5pdGlhbGl6ZShjb2RlYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGNwZSBpbml0aWFsaXphdGlvbiBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCS8qIERvIG5vdCBmYWlsIHByb2JlIGlmIENQRSBmYWlsZWQgKi8KKwkJcmV0ID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVEFTSEFfTlVNX0RFQ0lNQVRPUlM7IGkrKykgeworCQl0YXNoYS0+dHhfaHBmX3dvcmtbaV0udGFzaGEgPSB0YXNoYTsKKwkJdGFzaGEtPnR4X2hwZl93b3JrW2ldLmRlY2ltYXRvciA9IGk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZ0YXNoYS0+dHhfaHBmX3dvcmtbaV0uZHdvcmssCisJCQl0YXNoYV90eF9ocGZfY29ybmVyX2ZyZXFfY2FsbGJhY2spOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUQVNIQV9OVU1fREVDSU1BVE9SUzsgaSsrKSB7CisJCXRhc2hhLT50eF9tdXRlX2R3b3JrW2ldLnRhc2hhID0gdGFzaGE7CisJCXRhc2hhLT50eF9tdXRlX2R3b3JrW2ldLmRlY2ltYXRvciA9IGk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZ0YXNoYS0+dHhfbXV0ZV9kd29ya1tpXS5kd29yaywKKwkJCSAgdGFzaGFfdHhfbXV0ZV91cGRhdGVfY2FsbGJhY2spOworCX0KKworCXRhc2hhLT5zcGtfYW5jX2R3b3JrLnRhc2hhID0gdGFzaGE7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRhc2hhLT5zcGtfYW5jX2R3b3JrLmR3b3JrLAorCQkJICB0YXNoYV9zcGtfYW5jX3VwZGF0ZV9jYWxsYmFjayk7CisKKwltdXRleF9sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQxIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDIiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMSBQQSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQyIFBBIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhMIFBBIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBIUiBQQSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKKwltdXRleF91bmxvY2soJnRhc2hhLT5jb2RlY19tdXRleCk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfcGRhdGE6CisJZGV2bV9rZnJlZShjb2RlYy0+ZGV2LCBwdHIpOworCWNvbnRyb2wtPnJ4X2NocyA9IE5VTEw7CisJY29udHJvbC0+dHhfY2hzID0gTlVMTDsKK2Vycl9od2RlcDoKKwlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHRhc2hhLT5md19kYXRhKTsKKwl0YXNoYS0+ZndfZGF0YSA9IE5VTEw7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXNoYV9jb2RlY19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19jb21wb25lbnRfdG9fY29kZWMoY29tcG9uZW50KTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKKworCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwljb250cm9sLT5yeF9jaHMgPSBOVUxMOworCWNvbnRyb2wtPnR4X2NocyA9IE5VTEw7CisKKwl0YXNoYV9jbGVhbnVwX2lycXModGFzaGEpOworCS8qIENsZWFudXAgTUJIQyAqLworCS8qIENsZWFudXAgcmVzbWdyICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCByZWdtYXAgKnRhc2hhX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKworCXJldHVybiBjb250cm9sLT5yZWdtYXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl90YXNoYSA9IHsKKwkuY29udHJvbHMgPSB0YXNoYV9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodGFzaGFfc25kX2NvbnRyb2xzKSwKKwkuZ2V0X3JlZ21hcCA9IHRhc2hhX2dldF9yZWdtYXAsCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5wcm9iZSA9IHRhc2hhX2NvZGVjX3Byb2JlLAorCQkucmVtb3ZlID0gdGFzaGFfY29kZWNfcmVtb3ZlLAorCQkuZGFwbV93aWRnZXRzID0gdGFzaGFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGFzaGFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCX0sCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHRhc2hhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGFzaGEtPnBvd2VyX2dhdGVfd29yaykpCisJCXRhc2hhX2NvZGVjX3Bvd2VyX2dhdGVfZGlnaXRhbF9jb3JlKHRhc2hhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCF0YXNoYSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiB0YXNoYSBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RiZyhkZXYsICIlczogc3lzdGVtIHJlc3VtZVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdGFzaGFfcG1fb3BzID0geworCS5zdXNwZW5kID0gdGFzaGFfc3VzcGVuZCwKKwkucmVzdW1lID0gdGFzaGFfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRhc2hhX3N3cm1fcmVhZCh2b2lkICpoYW5kbGUsIGludCByZWcpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXVuc2lnbmVkIHNob3J0IHN3cl9yZF9hZGRyX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQgc3dyX3JkX2RhdGFfYmFzZTsKKwlpbnQgdmFsLCByZXQ7CisKKwlpZiAoIWhhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKiloYW5kbGU7CisJd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OworCisJZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IFJlYWRpbmcgc291bmR3aXJlIHJlZ2lzdGVyLCAweCV4XG4iLAorCQlfX2Z1bmNfXywgcmVnKTsKKwlzd3JfcmRfYWRkcl9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzA7CisJc3dyX3JkX2RhdGFfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wOworCS8qIHJlYWRfbG9jayAqLworCW11dGV4X2xvY2soJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKKwlyZXQgPSByZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9hZGRyX2Jhc2UsCisJCQkJKHU4ICopJnJlZywgNCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogUkQgQWRkciBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBDaGVjayBmb3IgUkQgc3RhdHVzICovCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9kYXRhX2Jhc2UsCisJCQkgICAgICAgKHU4ICopJnZhbCwgNCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogUkQgRGF0YSBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSB2YWw7CitlcnI6CisJLyogcmVhZF91bmxvY2sgKi8KKwltdXRleF91bmxvY2soJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX3N3cm1faTJzX2J1bGtfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCisJCQkJc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWcsCisJCQkJc2l6ZV90IGxlbikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfYWRkcl9iYXNlOworCXVuc2lnbmVkIHNob3J0IHN3cl93cl9kYXRhX2Jhc2U7CisKKwlzd3Jfd3JfYWRkcl9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzA7CisJc3dyX3dyX2RhdGFfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wOworCisJZm9yIChpID0gMDsgaSA8IChsZW4gKiAyKTsgaSArPSAyKSB7CisJCS8qIEZpcnN0IFdyaXRlIHRoZSBEYXRhIHRvIHJlZ2lzdGVyICovCisJCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwKKwkJCXN3cl93cl9kYXRhX2Jhc2UsIGJ1bGtfcmVnW2ldLmJ1ZiwgNCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBXUiBEYXRhIEZhaWx1cmVcbiIsCisJCQkJX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJLyogTmV4dCBXcml0ZSBBZGRyZXNzICovCisJCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwKKwkJCXN3cl93cl9hZGRyX2Jhc2UsIGJ1bGtfcmVnW2krMV0uYnVmLCA0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IFdSIEFkZHIgRmFpbHVyZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX3N3cm1fYnVsa193cml0ZSh2b2lkICpoYW5kbGUsIHUzMiAqcmVnLCB1MzIgKnZhbCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWc7CisJdW5zaWduZWQgc2hvcnQgc3dyX3dyX2FkZHJfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfZGF0YV9iYXNlOworCWludCBpLCBqLCByZXQ7CisKKwlpZiAoIWhhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxlbiA8PSAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc2l6ZTogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRhc2hhID0gKHN0cnVjdCB0YXNoYV9wcml2ICopaGFuZGxlOworCXdjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKKworCXN3cl93cl9hZGRyX2Jhc2UgPSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMDsKKwlzd3Jfd3JfZGF0YV9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzA7CisKKwlidWxrX3JlZyA9IGt6YWxsb2MoKDIgKiBsZW4gKiBzaXplb2Yoc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCkpLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWxrX3JlZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IChsZW4gKiAyKTsgaSArPSAyLCBqKyspIHsKKwkJYnVsa19yZWdbaV0ucmVnID0gc3dyX3dyX2RhdGFfYmFzZTsKKwkJYnVsa19yZWdbaV0uYnVmID0gKHU4ICopKCZ2YWxbal0pOworCQlidWxrX3JlZ1tpXS5ieXRlcyA9IDQ7CisJCWJ1bGtfcmVnW2krMV0ucmVnID0gc3dyX3dyX2FkZHJfYmFzZTsKKwkJYnVsa19yZWdbaSsxXS5idWYgPSAodTggKikoJnJlZ1tqXSk7CisJCWJ1bGtfcmVnW2krMV0uYnl0ZXMgPSA0OworCX0KKwltdXRleF9sb2NrKCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOworCisJaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7CisJCXJldCA9IHRhc2hhX3N3cm1faTJzX2J1bGtfd3JpdGUod2NkOXh4eCwgYnVsa19yZWcsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBpMnMgYnVsayB3cml0ZSBmYWlsZWQsIHJldDogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywKKwkJCQkgKGxlbiAqIDIpLCBmYWxzZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBzd3JtIGJ1bGsgd3JpdGUgZmFpbGVkLCByZXQ6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOworCWtmcmVlKGJ1bGtfcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGFzaGFfc3dybV93cml0ZSh2b2lkICpoYW5kbGUsIGludCByZWcsIGludCB2YWwpCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXVuc2lnbmVkIHNob3J0IHN3cl93cl9hZGRyX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQgc3dyX3dyX2RhdGFfYmFzZTsKKwlzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsIGJ1bGtfcmVnWzJdOworCWludCByZXQ7CisKKwlpZiAoIWhhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKiloYW5kbGU7CisJd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OworCisJc3dyX3dyX2FkZHJfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wOworCXN3cl93cl9kYXRhX2Jhc2UgPSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMDsKKworCS8qIEZpcnN0IFdyaXRlIHRoZSBEYXRhIHRvIHJlZ2lzdGVyICovCisJYnVsa19yZWdbMF0ucmVnID0gc3dyX3dyX2RhdGFfYmFzZTsKKwlidWxrX3JlZ1swXS5idWYgPSAodTggKikoJnZhbCk7CisJYnVsa19yZWdbMF0uYnl0ZXMgPSA0OworCWJ1bGtfcmVnWzFdLnJlZyA9IHN3cl93cl9hZGRyX2Jhc2U7CisJYnVsa19yZWdbMV0uYnVmID0gKHU4ICopKCZyZWcpOworCWJ1bGtfcmVnWzFdLmJ5dGVzID0gNDsKKworCW11dGV4X2xvY2soJnRhc2hhLT5zd3Jfd3JpdGVfbG9jayk7CisKKwlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJcmV0ID0gdGFzaGFfc3dybV9pMnNfYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywgMSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBpMnMgc3dybSB3cml0ZSBmYWlsZWQsIHJldDogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywgMiwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IFdSIERhdGEgRmFpbHVyZVxuIiwgX19mdW5jX18pOworCX0KKworCW11dGV4X3VubG9jaygmdGFzaGEtPnN3cl93cml0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX3N3cm1fY2xvY2sodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKikgaGFuZGxlOworCisJbXV0ZXhfbG9jaygmdGFzaGEtPnN3cl9jbGtfbG9jayk7CisKKwlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogc3dybSBjbG9jayAlc1xuIiwKKwkJX19mdW5jX18sIChlbmFibGU/ImVuYWJsZSIgOiAiZGlzYWJsZSIpKTsKKwlpZiAoZW5hYmxlKSB7CisJCXRhc2hhLT5zd3JfY2xrX3VzZXJzKys7CisJCWlmICh0YXNoYS0+c3dyX2Nsa191c2VycyA9PSAxKSB7CisJCQlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKKwkJCQlyZWdtYXBfdXBkYXRlX2JpdHMoCisJCQkJCXRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkJCVdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSwKKwkJCQkJMHgxMCwgMHgwMCk7CisJCQlfX3Rhc2hhX2NkY19tY2xrX2VuYWJsZSh0YXNoYSwgdHJ1ZSk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHModGFzaGEtPndjZDl4eHgtPnJlZ21hcCwKKwkJCQlXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsCisJCQkJMHgwMSwgMHgwMSk7CisJCX0KKwl9IGVsc2UgeworCQl0YXNoYS0+c3dyX2Nsa191c2Vycy0tOworCQlpZiAodGFzaGEtPnN3cl9jbGtfdXNlcnMgPT0gMCkgeworCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkJV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MLAorCQkJCTB4MDEsIDB4MDApOworCQkJX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGZhbHNlKTsKKwkJCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQorCQkJCXJlZ21hcF91cGRhdGVfYml0cygKKwkJCQkJdGFzaGEtPndjZDl4eHgtPnJlZ21hcCwKKwkJCQkJV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xLAorCQkJCQkweDEwLCAweDEwKTsKKwkJfQorCX0KKwlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogc3dybSBjbG9jayB1c2VycyAlZFxuIiwKKwkJX19mdW5jX18sIHRhc2hhLT5zd3JfY2xrX3VzZXJzKTsKKwltdXRleF91bmxvY2soJnRhc2hhLT5zd3JfY2xrX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc2hhX3N3cm1faGFuZGxlX2lycSh2b2lkICpoYW5kbGUsCisJCQkJICAgaXJxcmV0dXJuX3QgKCpzd3JtX2lycV9oYW5kbGVyKShpbnQgaXJxLAorCQkJCQkJCQkgICB2b2lkICpkYXRhKSwKKwkJCQkgICAgdm9pZCAqc3dybV9oYW5kbGUsCisJCQkJICAgIGludCBhY3Rpb24pCit7CisJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCisJaWYgKCFoYW5kbGUpIHsKKwkJcHJfZXJyKCIlczogbnVsbCBoYW5kbGUgcmVjZWl2ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRhc2hhID0gKHN0cnVjdCB0YXNoYV9wcml2ICopIGhhbmRsZTsKKwl3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7CisKKwlpZiAoYWN0aW9uKSB7CisJCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoJndjZDl4eHgtPmNvcmVfcmVzLAorCQkJCQkgIFdDRDkzMzVfSVJRX1NPVU5EV0lSRSwKKwkJCQkJICBzd3JtX2lycV9oYW5kbGVyLAorCQkJCQkgICJUYXNoYSBTV1IgTWFzdGVyIiwgc3dybV9oYW5kbGUpOworCQlpZiAocmV0KQorCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgV0NEOTMzNV9JUlFfU09VTkRXSVJFKTsKKwl9IGVsc2UKKwkJd2NkOXh4eF9mcmVlX2lycSgmd2NkOXh4eC0+Y29yZV9yZXMsIFdDRDkzMzVfSVJRX1NPVU5EV0lSRSwKKwkJCQkgc3dybV9oYW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGFzaGFfYWRkX2NoaWxkX2RldmljZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKwlzdHJ1Y3QgdGFzaGFfc3dyX2N0cmxfZGF0YSAqc3dyX2N0cmxfZGF0YSA9IE5VTEwsICp0ZW1wOworCWludCByZXQsIGN0cmxfbnVtID0gMDsKKwlzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhOworCWNoYXIgcGxhdF9kZXZfbmFtZVtXQ0Q5MzM1X1NUUklOR19MRU5dOworCisJdGFzaGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhc2hhX3ByaXYsCisJCQkgICAgIHRhc2hhX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOworCWlmICghdGFzaGEpIHsKKwkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5MzM1IGRvZXMgbm90IGV4aXN0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXdjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKKwlpZiAoIXdjZDl4eHgpIHsKKwkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5WFhYIGRvZXMgbm90IGV4aXN0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICghd2NkOXh4eC0+ZGV2LT5vZl9ub2RlKSB7CisJCXByX2VycigiJXM6IERUIG5vZGUgZm9yIHdjZDl4eHggZG9lcyBub3QgZXhpc3RcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwbGF0ZGF0YSA9ICZ0YXNoYS0+c3dyX3BsYXRfZGF0YTsKKworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUod2NkOXh4eC0+ZGV2LT5vZl9ub2RlLCBub2RlKSB7CisJCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJzd3JfbWFzdGVyIikpCisJCQlzdHJsY3B5KHBsYXRfZGV2X25hbWUsICJ0YXNoYV9zd3JfY3RybCIsCisJCQkJKFdDRDkzMzVfU1RSSU5HX0xFTiAtIDEpKTsKKwkJZWxzZSBpZiAoc3RybnN0cihub2RlLT5uYW1lLCAibXNtX2NkY19waW5jdHJsIiwKKwkJCQkgc3RybGVuKCJtc21fY2RjX3BpbmN0cmwiKSkgIT0gTlVMTCkKKwkJCXN0cmxjcHkocGxhdF9kZXZfbmFtZSwgbm9kZS0+bmFtZSwKKwkJCQkoV0NEOTMzNV9TVFJJTkdfTEVOIC0gMSkpOworCQllbHNlCisJCQljb250aW51ZTsKKworCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHBsYXRfZGV2X25hbWUsIC0xKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBwZGV2IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXBkZXYtPmRldi5wYXJlbnQgPSB0YXNoYS0+ZGV2OworCQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5vZGU7CisKKwkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSkgeworCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBsYXRkYXRhLAorCQkJCQkJICAgICAgIHNpemVvZigqcGxhdGRhdGEpKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSIlczogY2Fubm90IGFkZCBwbGF0IGRhdGEgY3RybDolZFxuIiwKKwkJCQkJX19mdW5jX18sIGN0cmxfbnVtKTsKKwkJCQlnb3RvIGZhaWxfcGRldl9hZGQ7CisJCQl9CisJCX0KKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIiVzOiBDYW5ub3QgYWRkIHBsYXRmb3JtIGRldmljZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWxfcGRldl9hZGQ7CisJCX0KKworCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpKSB7CisJCQl0ZW1wID0ga3JlYWxsb2Moc3dyX2N0cmxfZGF0YSwKKwkJCQkJKGN0cmxfbnVtICsgMSkgKiBzaXplb2YoCisJCQkJCXN0cnVjdCB0YXNoYV9zd3JfY3RybF9kYXRhKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXRlbXApIHsKKwkJCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlzd3JfY3RybF9kYXRhID0gdGVtcDsKKwkJCXN3cl9jdHJsX2RhdGFbY3RybF9udW1dLnN3cl9wZGV2ID0gcGRldjsKKwkJCWN0cmxfbnVtKys7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkJIiVzOiBBZGRlZCBzb3VuZHdpcmUgY3RybCBkZXZpY2UocylcbiIsCisJCQkJX19mdW5jX18pOworCQkJdGFzaGEtPm5yID0gY3RybF9udW07CisJCQl0YXNoYS0+c3dyX2N0cmxfZGF0YSA9IHN3cl9jdHJsX2RhdGE7CisJCX0KKwl9CisKKwlyZXR1cm47CitmYWlsX3BkZXZfYWRkOgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CitlcnI6CisJcmV0dXJuOworfQorCisvKgorICogdGFzaGFfY29kZWNfdmVyOiB0byBnZXQgdGFzaGEgY29kZWMgdmVyc2lvbgorICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCisgKiByZXR1cm4gZW51bSBjb2RlY192YXJpYW50IC0gdmVyc2lvbgorICovCitlbnVtIGNvZGVjX3ZhcmlhbnQgdGFzaGFfY29kZWNfdmVyKHZvaWQpCit7CisJcmV0dXJuIGNvZGVjX3ZlcjsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfY29kZWNfdmVyKTsKKworc3RhdGljIGludCBfX3Rhc2hhX2VuYWJsZV9lZnVzZV9zZW5zaW5nKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKK3sKKwlpbnQgdmFsLCByYzsKKworCV9fdGFzaGFfY2RjX21jbGtfZW5hYmxlKHRhc2hhLCB0cnVlKTsKKworCXJlZ21hcF91cGRhdGVfYml0cyh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLAorCQkJICAgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsIDB4MUUsIDB4MjApOworCXJlZ21hcF91cGRhdGVfYml0cyh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLAorCQkJICAgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsIDB4MDEsIDB4MDEpOworCisJLyoKKwkgKiA1bXMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZW5hYmxpbmcgZWZ1c2UgY29udHJvbAorCSAqIGJlZm9yZSBjaGVja2luZyB0aGUgc3RhdHVzLgorCSAqLworCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKwlyYyA9IHJlZ21hcF9yZWFkKHRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMsICZ2YWwpOworCisJaWYgKHJjIHx8ICghKHZhbCAmIDB4MDEpKSkKKwkJV0FSTigxLCAiJXM6IEVmdXNlIHNlbnNlIGlzIG5vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18pOworCisJX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGZhbHNlKTsKKworCXJldHVybiByYzsKK30KKwordm9pZCB0YXNoYV9nZXRfY29kZWNfdmVyKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKK3sKKwlpbnQgaTsKKwlpbnQgdmFsOworCXN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgY29kZWNfcmVnW10gPSB7CisJCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMCwgMHhGRiwgMHhGRn0sCisJCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMSwgMHhGRiwgMHg4M30sCisJCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMiwgMHhGRiwgMHgwQX0sCisJfTsKKworCV9fdGFzaGFfZW5hYmxlX2VmdXNlX3NlbnNpbmcodGFzaGEpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVjX3JlZyk7IGkrKykgeworCQlyZWdtYXBfcmVhZCh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLCBjb2RlY19yZWdbaV0ucmVnLCAmdmFsKTsKKwkJaWYgKCEodmFsICYmIGNvZGVjX3JlZ1tpXS52YWwpKSB7CisJCQljb2RlY192ZXIgPSBXQ0Q5MzM1OworCQkJZ290byByZXQ7CisJCX0KKwl9CisJY29kZWNfdmVyID0gV0NEOTMyNjsKK3JldDoKKwlwcl9kZWJ1ZygiJXM6IGNvZGVjIGlzICVkXG4iLCBfX2Z1bmNfXywgY29kZWNfdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wodGFzaGFfZ2V0X2NvZGVjX3Zlcik7CisKK3N0YXRpYyBpbnQgdGFzaGFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7CisJc3RydWN0IGNsayAqd2NkX2V4dF9jbGssICp3Y2RfbmF0aXZlX2NsazsKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncjsKKwlzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24gKmNkY19wd3I7CisKKwlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKKwkJaWYgKGFwcl9nZXRfc3Vic3lzX3N0YXRlKCkgPT0gQVBSX1NVQlNZU19ET1dOKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZHNwIGRvd25cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQl9CisJfQorCisJdGFzaGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB0YXNoYV9wcml2KSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhc2hhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0YXNoYSk7CisKKwl0YXNoYS0+d2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwl0YXNoYS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX0RFTEFZRURfV09SSygmdGFzaGEtPnBvd2VyX2dhdGVfd29yaywgdGFzaGFfY29kZWNfcG93ZXJfZ2F0ZV93b3JrKTsKKwltdXRleF9pbml0KCZ0YXNoYS0+cG93ZXJfbG9jayk7CisJbXV0ZXhfaW5pdCgmdGFzaGEtPnNpZG9fbG9jayk7CisJSU5JVF9XT1JLKCZ0YXNoYS0+dGFzaGFfYWRkX2NoaWxkX2RldmljZXNfd29yaywKKwkJICB0YXNoYV9hZGRfY2hpbGRfZGV2aWNlcyk7CisJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZ0YXNoYS0+bm90aWZpZXIpOworCW11dGV4X2luaXQoJnRhc2hhLT5taWNiX2xvY2spOworCW11dGV4X2luaXQoJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKKwltdXRleF9pbml0KCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOworCW11dGV4X2luaXQoJnRhc2hhLT5zd3JfY2xrX2xvY2spOworCW11dGV4X2luaXQoJnRhc2hhLT5tY2xrX2xvY2spOworCisJY2RjX3B3ciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHdjZDl4eHhfcG93ZXJfcmVnaW9uKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNkY19wd3IpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY2RjX3B3cjsKKwl9CisJdGFzaGEtPndjZDl4eHgtPndjZDl4eHhfcHdyW1dDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzFdID0gY2RjX3B3cjsKKwljZGNfcHdyLT5wd3JfY29sbGFwc2VfcmVnX21pbiA9IFRBU0hBX0RJR19DT1JFX1JFR19NSU47CisJY2RjX3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19tYXggPSBUQVNIQV9ESUdfQ09SRV9SRUdfTUFYOworCXdjZDl4eHhfc2V0X3Bvd2VyX3N0YXRlKHRhc2hhLT53Y2Q5eHh4LAorCQkJCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfUkVNT1ZFLAorCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOworCisJbXV0ZXhfaW5pdCgmdGFzaGEtPmNvZGVjX211dGV4KTsKKwkvKgorCSAqIEluaXQgcmVzb3VyY2UgbWFuYWdlciBzbyB0aGF0IGlmIGNoaWxkIG5vZGVzIHN1Y2ggYXMgU291bmRXaXJlCisJICogcmVxdWVzdHMgZm9yIGNsb2NrLCByZXNvdXJjZSBtYW5hZ2VyIGNhbiBob25vciB0aGUgcmVxdWVzdAorCSAqLworCXJlc21nciA9IHdjZF9yZXNtZ3JfaW5pdCgmdGFzaGEtPndjZDl4eHgtPmNvcmVfcmVzLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHJlc21ncikpIHsKKwkJcmV0ID0gUFRSX0VSUihyZXNtZ3IpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgd2NkIHJlc21nclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBlcnJfcmVzbWdyOworCX0KKwl0YXNoYS0+cmVzbWdyID0gcmVzbWdyOworCXRhc2hhLT5zd3JfcGxhdF9kYXRhLmhhbmRsZSA9ICh2b2lkICopIHRhc2hhOworCXRhc2hhLT5zd3JfcGxhdF9kYXRhLnJlYWQgPSB0YXNoYV9zd3JtX3JlYWQ7CisJdGFzaGEtPnN3cl9wbGF0X2RhdGEud3JpdGUgPSB0YXNoYV9zd3JtX3dyaXRlOworCXRhc2hhLT5zd3JfcGxhdF9kYXRhLmJ1bGtfd3JpdGUgPSB0YXNoYV9zd3JtX2J1bGtfd3JpdGU7CisJdGFzaGEtPnN3cl9wbGF0X2RhdGEuY2xrID0gdGFzaGFfc3dybV9jbG9jazsKKwl0YXNoYS0+c3dyX3BsYXRfZGF0YS5oYW5kbGVfaXJxID0gdGFzaGFfc3dybV9oYW5kbGVfaXJxOworCisJLyogUmVnaXN0ZXIgZm9yIENsb2NrICovCisJd2NkX2V4dF9jbGsgPSBjbGtfZ2V0KHRhc2hhLT53Y2Q5eHh4LT5kZXYsICJ3Y2RfY2xrIik7CisJaWYgKElTX0VSUih3Y2RfZXh0X2NsaykpIHsKKwkJZGV2X2Vycih0YXNoYS0+d2NkOXh4eC0+ZGV2LCAiJXM6IGNsayBnZXQgJXMgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sICJ3Y2RfZXh0X2NsayIpOworCQlnb3RvIGVycl9jbGs7CisJfQorCXRhc2hhLT53Y2RfZXh0X2NsayA9IHdjZF9leHRfY2xrOworCXRhc2hhLT5zaWRvX3ZvbHRhZ2UgPSBTSURPX1ZPTFRBR0VfTk9NSU5BTF9NVjsKKwlzZXRfYml0KEFVRElPX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOworCXRhc2hhLT5zaWRvX2NjbF9jbnQgPSAwOworCisJLyogUmVnaXN0ZXIgbmF0aXZlIGNsayBmb3IgNDQuMSBwbGF5YmFjayAqLworCXdjZF9uYXRpdmVfY2xrID0gY2xrX2dldCh0YXNoYS0+d2NkOXh4eC0+ZGV2LCAid2NkX25hdGl2ZV9jbGsiKTsKKwlpZiAoSVNfRVJSKHdjZF9uYXRpdmVfY2xrKSkKKwkJZGV2X2RiZyh0YXNoYS0+d2NkOXh4eC0+ZGV2LCAiJXM6IGNsayBnZXQgJXMgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sICJ3Y2RfbmF0aXZlX2NsayIpOworCWVsc2UKKwkJdGFzaGEtPndjZF9uYXRpdmVfY2xrID0gd2NkX25hdGl2ZV9jbGs7CisKKwlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsICZzb2NfY29kZWNfZGV2X3Rhc2hhLAorCQkJCQkgICAgIHRhc2hhX2RhaSwgQVJSQVlfU0laRSh0YXNoYV9kYWkpKTsKKwllbHNlIGlmICh3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykKKwkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl90YXNoYSwKKwkJCQkJICAgICB0YXNoYV9pMnNfZGFpLAorCQkJCQkgICAgIEFSUkFZX1NJWkUodGFzaGFfaTJzX2RhaSkpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDb2RlYyByZWdpc3RyYXRpb24gZmFpbGVkLCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9jZGNfcmVnOworCX0KKwkvKiBVcGRhdGUgY29kZWMgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMgKi8KKwl0YXNoYV91cGRhdGVfcmVnX2RlZmF1bHRzKHRhc2hhKTsKKwlzY2hlZHVsZV93b3JrKCZ0YXNoYS0+dGFzaGFfYWRkX2NoaWxkX2RldmljZXNfd29yayk7CisJdGFzaGFfZ2V0X2NvZGVjX3Zlcih0YXNoYSk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IFRhc2hhIGRyaXZlciBwcm9iZSBkb25lXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKKworZXJyX2NkY19yZWc6CisJY2xrX3B1dCh0YXNoYS0+d2NkX2V4dF9jbGspOworCWlmICh0YXNoYS0+d2NkX25hdGl2ZV9jbGspCisJCWNsa19wdXQodGFzaGEtPndjZF9uYXRpdmVfY2xrKTsKK2Vycl9jbGs6CisJd2NkX3Jlc21ncl9yZW1vdmUodGFzaGEtPnJlc21ncik7CitlcnJfcmVzbWdyOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgY2RjX3B3cik7CitlcnJfY2RjX3B3cjoKKwltdXRleF9kZXN0cm95KCZ0YXNoYS0+bWNsa19sb2NrKTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHRhc2hhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhc2hhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKKworCXRhc2hhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwltdXRleF9kZXN0cm95KCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOworCWNsa19wdXQodGFzaGEtPndjZF9leHRfY2xrKTsKKwlpZiAodGFzaGEtPndjZF9uYXRpdmVfY2xrKQorCQljbGtfcHV0KHRhc2hhLT53Y2RfbmF0aXZlX2Nsayk7CisJbXV0ZXhfZGVzdHJveSgmdGFzaGEtPm1jbGtfbG9jayk7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCB0YXNoYSk7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0YXNoYV9jb2RlY19kcml2ZXIgPSB7CisJLnByb2JlID0gdGFzaGFfcHJvYmUsCisJLnJlbW92ZSA9IHRhc2hhX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0gPSAmdGFzaGFfcG1fb3BzLAorI2VuZGlmCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGFzaGFfY29kZWNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUYXNoYSBDb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTMzNS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzM1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3YmI5NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTMzNS5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgV0NEOTMzNV9ICisjZGVmaW5lIFdDRDkzMzVfSAorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmg+CisjaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKKworI2RlZmluZSBUQVNIQV9SRUdfVkFMKHJlZywgdmFsKSAgICAgIHtyZWcsIDAsIHZhbH0KKworI2RlZmluZSBUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgIDB4ODAwCisjZGVmaW5lIFRBU0hBX1NCX1BHRF9QT1JUX1JYX0JBU0UgICAweDQwCisjZGVmaW5lIFRBU0hBX1NCX1BHRF9QT1JUX1RYX0JBU0UgICAweDUwCisKKyNkZWZpbmUgVEFTSEFfWkRFVF9TVVBQT1JURUQgdHJ1ZQorLyogeiB2YWx1ZSBkZWZpbmVkIGluIG1pbGxpb2htICovCisjZGVmaW5lIFRBU0hBX1pERVRfVkFMXzMyCTMyMDAwCisjZGVmaW5lIFRBU0hBX1pERVRfVkFMXzQwMAk0MDAwMDAKKyNkZWZpbmUgVEFTSEFfWkRFVF9WQUxfMTIwMAkxMjAwMDAwCisjZGVmaW5lIFRBU0hBX1pERVRfVkFMXzEwMEsJMTAwMDAwMDAwCisvKiB6IGZsb2F0aW5nIGRlZmluZWQgaW4gb2htcyAqLworI2RlZmluZSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSAweDBGRkZGRkZFCisKKyNkZWZpbmUgV0NEOTMzNV9ETUlDX0NMS19ESVZfMiAgMHgwCisjZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRElWXzMgIDB4MQorI2RlZmluZSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl80ICAweDIKKyNkZWZpbmUgV0NEOTMzNV9ETUlDX0NMS19ESVZfNiAgMHgzCisjZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRElWXzggIDB4NAorI2RlZmluZSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl8xNiAgMHg1CisjZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRFJJVkVfREVGQVVMVCAweDAyCisKKyNkZWZpbmUgV0NEOTMzNV9BTkNfRE1JQ19YMl9GVUxMX1JBVEUgMQorI2RlZmluZSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0hBTEZfUkFURSAwCisKKy8qIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IFNsaW1idXMgcG9ydCAqLworZW51bSB7CisJVEFTSEFfUlgwID0gMCwKKwlUQVNIQV9SWDEsCisJVEFTSEFfUlgyLAorCVRBU0hBX1JYMywKKwlUQVNIQV9SWDQsCisJVEFTSEFfUlg1LAorCVRBU0hBX1JYNiwKKwlUQVNIQV9SWDcsCisJVEFTSEFfUlg4LAorCVRBU0hBX1JYOSwKKwlUQVNIQV9SWDEwLAorCVRBU0hBX1JYMTEsCisJVEFTSEFfUlgxMiwKKwlUQVNIQV9SWF9NQVgsCit9OworCitlbnVtIHsKKwlUQVNIQV9UWDAgPSAwLAorCVRBU0hBX1RYMSwKKwlUQVNIQV9UWDIsCisJVEFTSEFfVFgzLAorCVRBU0hBX1RYNCwKKwlUQVNIQV9UWDUsCisJVEFTSEFfVFg2LAorCVRBU0hBX1RYNywKKwlUQVNIQV9UWDgsCisJVEFTSEFfVFg5LAorCVRBU0hBX1RYMTAsCisJVEFTSEFfVFgxMSwKKwlUQVNIQV9UWDEyLAorCVRBU0hBX1RYMTMsCisJVEFTSEFfVFgxNCwKKwlUQVNIQV9UWDE1LAorCVRBU0hBX1RYX01BWCwKK307CisKK2VudW0geworCS8qIElOVFJfUkVHIDAgKi8KKwlXQ0Q5MzM1X0lSUV9GTExfTE9DS19MT1NTID0gMSwKKwlXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKKwlXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKKwlXQ0Q5MzM1X0lSUV9FQVJfUEFfT0NQX0ZBVUxULAorCVdDRDkzMzVfSVJRX0hQSF9QQV9DTlBMX0NPTVBMRVRFLAorCVdDRDkzMzVfSVJRX0hQSF9QQV9DTlBSX0NPTVBMRVRFLAorCVdDRDkzMzVfSVJRX0VBUl9QQV9DTlBfQ09NUExFVEUsCisJLyogSU5UUl9SRUcgMSAqLworCVdDRDkzMzVfSVJRX01CSENfU1dfREVULAorCVdDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsCisJV0NEOTMzNV9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAorCVdDRDkzMzVfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULAorCVdDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAorCVdDRDkzMzVfSVJRX1JFU0VSVkVEXzAsCisJV0NEOTMzNV9JUlFfUkVTRVJWRURfMSwKKwlXQ0Q5MzM1X0lSUV9SRVNFUlZFRF8yLAorCS8qIElOVFJfUkVHIDIgKi8KKwlXQ0Q5MzM1X0lSUV9MSU5FX1BBMV9DTlBfQ09NUExFVEUsCisJV0NEOTMzNV9JUlFfTElORV9QQTJfQ05QX0NPTVBMRVRFLAorCVdDRDkzMzVfSVJRX0xJTkVfUEEzX0NOUF9DT01QTEVURSwKKwlXQ0Q5MzM1X0lSUV9MSU5FX1BBNF9DTlBfQ09NUExFVEUsCisJV0NEOTMzNV9JUlFfU09VTkRXSVJFLAorCVdDRDkzMzVfSVJRX1ZERF9ESUdfUkFNUF9DT01QTEVURSwKKwlXQ0Q5MzM1X0lSUV9SQ09fRVJST1IsCisJV0NEOTMzNV9JUlFfU1ZBX0VSUk9SLAorCS8qIElOVFJfUkVHIDMgKi8KKwlXQ0Q5MzM1X0lSUV9NQURfQVVESU8sCisJV0NEOTMzNV9JUlFfTUFEX0JFQUNPTiwKKwlXQ0Q5MzM1X0lSUV9NQURfVUxUUkFTT1VORCwKKwlXQ0Q5MzM1X0lSUV9WQkFUX0FUVEFDSywKKwlXQ0Q5MzM1X0lSUV9WQkFUX1JFU1RPUkUsCisJV0NEOTMzNV9JUlFfU1ZBX09VVEJPWDEsCisJV0NEOTMzNV9JUlFfU1ZBX09VVEJPWDIsCisJV0NEOTMzNV9OVU1fSVJRUywKK307CisKK2VudW0gd2NkOTMzNV9jb2RlY19ldmVudCB7CisJV0NEOTMzNV9DT0RFQ19FVkVOVF9DT0RFQ19VUCA9IDAsCit9OworCitlbnVtIHRhc2hhX29uX2RlbWFuZF9zdXBwbHkgeworCU9OX0RFTUFORF9NSUNCSUFTID0gMCwKKwlPTl9ERU1BTkRfU1VQUExJRVNfTUFYLAorfTsKKworLyogc3RydWN0dXJlIHVzZWQgdG8gcHV0IHRoZSBkZWZpbmVkCisgKiBvbmRlbWFuZCBzdXBwbHkgZm9yIGNvZGVjCisgKiBhbmQgY291bnQgYmVpbmcgdXNlZC4KKyAqLworc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgeworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKwlpbnQgb25kZW1hbmRfc3VwcGx5X2NvdW50OworfTsKKworLyogRGFpIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZQorICogZGFpIHNwZWNpZmljIGluZm8gbGlrZSByYXRlLAorICogY2hhbm5lbCBudW1iZXIgZXRjLgorICovCitzdHJ1Y3QgdGFzaGFfY29kZWNfZGFpX2RhdGEgeworCXUzMiByYXRlOworCXUzMiAqY2hfbnVtOworCXUzMiBjaF9hY3Q7CisJdTMyIGNoX3RvdDsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHVwZGF0ZSBjb2RlYworICogcmVnaXN0ZXIgZGVmYXVsdHMgYWZ0ZXIgcmVzZXQKKyAqLworc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB7CisJdTE2IHJlZzsKKwl1OCBtYXNrOworCXU4IHZhbDsKK307CisKKy8qIFNlbGVjdHMgY29tcGFuZGVyIGFuZCBzbWFydCBib29zdCBzZXR0aW5ncworICogZm9yIGEgZ2l2ZW4gc3BlYWtlciBtb2RlCisgKi8KK2VudW0geworCVNQS1JfTU9ERV9ERUZBVUxULAorCVNQS1JfTU9ERV8xLCAgICAgICAgICAvKiBDT01QIEdhaW4gPSAxMmRCLCBTbWFydGJvb3N0IE1heCA9IDUuNVYgKi8KK307CisKKy8qCisgKiBSeCBwYXRoIGdhaW4gb2Zmc2V0cworICovCitlbnVtIHsKKwlSWF9HQUlOX09GRlNFVF9NMVA1X0RCLAorCVJYX0dBSU5fT0ZGU0VUXzBfREIsCit9OworCitleHRlcm4gdm9pZCAqdGFzaGFfZ2V0X2FmZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOworZXh0ZXJuIGludCB0YXNoYV9jZGNfbWNsa19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLAorCQkJCSBib29sIGRhcG0pOworZXh0ZXJuIGludCB0YXNoYV9jZGNfbWNsa190eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLAorCQkJCSAgICBib29sIGRhcG0pOworZXh0ZXJuIGludCB0YXNoYV9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIGludCB0YXNoYV9tYmhjX2hzX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpOworZXh0ZXJuIHZvaWQgdGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIHZvaWQgdGFzaGFfbWJoY196ZGV0X2dwaW9fY3RybCgKKwkJaW50ICgqemRldF9ncGlvX2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgaGlnaCksCisJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitleHRlcm4gaW50IHRhc2hhX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KAorCQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3QsCisJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitleHRlcm4gdm9pZCB0YXNoYV9ldmVudF9yZWdpc3RlcigKKwlpbnQgKCptYWNoaW5lX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJZW51bSB3Y2Q5MzM1X2NvZGVjX2V2ZW50KSwKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworZXh0ZXJuIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJCSBpbnQgbWljYl9udW0sCisJCQkJCQkgYm9vbCBlbmFibGUpOworZXh0ZXJuIGludCB0YXNoYV9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpOworZXh0ZXJuIGludCB0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBvZmZzZXQpOworZXh0ZXJuIGVudW0gY29kZWNfdmFyaWFudCB0YXNoYV9jb2RlY192ZXIodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQzZmExCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIworIyBNYWtlZmlsZSBmb3Igd2NkOTM0eCBjb2RlYyBkcml2ZXIuCisjCitzbmQtc29jLXdjZDkzNHgtb2JqcyA6PSB3Y2Q5MzR4Lm8gd2NkOTM0eC1kc3AtY250bC5vCitvYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5MzRYKSArPSBzbmQtc29jLXdjZDkzNHgubworc25kLXNvYy13Y2Q5MzR4LW1iaGMtb2JqcyA6PSB3Y2Q5MzR4LW1iaGMubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEOTM0WF9NQkhDKSArPSBzbmQtc29jLXdjZDkzNHgtbWJoYy5vCitzbmQtc29jLXdjZDkzNHgtZHNkLW9ianMgOj0gd2NkOTM0eC1kc2Qubworb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEOTM0WF9EU0QpICs9IHNuZC1zb2Mtd2NkOTM0eC1kc2QubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNkLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA1OTFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNkLmMKQEAgLTAsMCArMSw3NjcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSAid2NkOTM0eC1kc2QuaCIKKworI2RlZmluZSBEU0RfVk9MVU1FX01BWF8wZEIgICAgICAwCisjZGVmaW5lIERTRF9WT0xVTUVfTUlOX00xMTBkQiAgIC0xMTAKKworI2RlZmluZSBEU0RfVk9MVU1FX1JBTkdFX0NIRUNLKHgpICAgKCh4ID49IERTRF9WT0xVTUVfTUlOX00xMTBkQikgJiZcCisJCQkJICAgICAoeCA8PSBEU0RfVk9MVU1FX01BWF8wZEIpKQorI2RlZmluZSBEU0RfVk9MVU1FX1NURVBTICAgICAgICAgICAgMworI2RlZmluZSBEU0RfVk9MVU1FX1VQREFURV9ERUxBWV9NUyAgMzAKKyNkZWZpbmUgRFNEX1ZPTFVNRV9VU0xFRVBfTUFSR0lOX1VTIDEwMAorI2RlZmluZSBEU0RfVk9MVU1FX1NURVBfREVMQVlfVVMgICAgKCgxMDAwICogRFNEX1ZPTFVNRV9VUERBVEVfREVMQVlfTVMpIC8gXAorCQkJCSAgICAgKDIgKiBEU0RfVk9MVU1FX1NURVBTKSkKKworI2RlZmluZSBUQVZJTF9WRVJTSU9OXzFfMCAgMAorI2RlZmluZSBUQVZJTF9WRVJTSU9OXzFfMSAgMQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKHRhdmlsX2RzZF9kYl9zY2FsZSwgRFNEX1ZPTFVNRV9NSU5fTTExMGRCLAorCQkJCSAgIERTRF9WT0xVTUVfTUFYXzBkQik7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkc2RfaWZfdGV4dFtdID0geworCSJaRVJPIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciLAorCSJEU0RfREFUQV9QQUQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzZF9maWx0MF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRTRF9MIElGIE1VWCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzZF9maWx0MV9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRTRF9SIElGIE1VWCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRzZF9maWx0MF9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwsIDAsCisJCQlBUlJBWV9TSVpFKGRzZF9maWx0MF9tdXhfdGV4dCksIGRzZF9maWx0MF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNkX2ZpbHQxX211eF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwgMCwKKwkJCUFSUkFZX1NJWkUoZHNkX2ZpbHQxX211eF90ZXh0KSwgZHNkX2ZpbHQxX211eF90ZXh0KTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzZF9sX2lmX2VudW0sIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCwKKwkJCSAgICAyLCBkc2RfaWZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHNkX3JfaWZfZW51bSwgV0NEOTM0WF9DRENfRFNEMV9DRkcwLAorCQkJICAgIDIsIGRzZF9pZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9maWx0MF9tdXggPQorCQlTT0NfREFQTV9FTlVNKCJEU0QgRmlsdDAgTXV4IiwgZHNkX2ZpbHQwX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9maWx0MV9tdXggPQorCQlTT0NfREFQTV9FTlVNKCJEU0QgRmlsdDEgTXV4IiwgZHNkX2ZpbHQxX211eF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9sX2lmX211eCA9CisJCVNPQ19EQVBNX0VOVU0oIkRTRCBMZWZ0IElmIE11eCIsIGRzZF9sX2lmX2VudW0pOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9yX2lmX211eCA9CisJCVNPQ19EQVBNX0VOVU0oIkRTRCBSaWdodCBJZiBNdXgiLCBkc2Rfcl9pZl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgdGF2aWxfZHNkX2F1ZGlvX21hcFtdID0geworCXsiRFNEX0wgSUYgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiRFNEX0wgSUYgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCisJeyJEU0RfRklMVEVSXzAiLCBOVUxMLCAiRFNEX0wgSUYgTVVYIn0sCisJeyJEU0RfRklMVEVSXzAiLCBOVUxMLCAiUlggSU5UMSBOQVRJVkUgU1VQUExZIn0sCisJeyJSWCBJTlQxIE1JWDMiLCAiRFNEIEhQSEwgU3dpdGNoIiwgIkRTRF9GSUxURVJfMCJ9LAorCisJeyJEU0RfUiBJRiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJEU0RfUiBJRiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisKKwl7IkRTRF9GSUxURVJfMSIsIE5VTEwsICJEU0RfUiBJRiBNVVgifSwKKwl7IkRTRF9GSUxURVJfMSIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKKwl7IlJYIElOVDIgTUlYMyIsICJEU0QgSFBIUiBTd2l0Y2giLCAiRFNEX0ZJTFRFUl8xIn0sCit9OworCitzdGF0aWMgYm9vbCBpc192YWxpZF9kc2RfaW50ZXJwb2xhdG9yKGludCBpbnRlcnBfbnVtKQoreworCWlmICgoaW50ZXJwX251bSA9PSBJTlRFUlBfSFBITCkgfHwgKGludGVycF9udW0gPT0gSU5URVJQX0hQSFIpIHx8CisJICAgIChpbnRlcnBfbnVtID09IElOVEVSUF9MTzEpIHx8IChpbnRlcnBfbnVtID09IElOVEVSUF9MTzIpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiB0YXZpbF9kc2Rfc2V0X21peGVyX3ZhbHVlIC0gU2V0IERTRCBIUEgvTE8gbWl4ZXIgdmFsdWUKKyAqCisgKiBAZHNkX2NvbmY6IHBvaW50ZXIgdG8gZHNkIGNvbmZpZworICogQGludGVycF9udW06IEludGVycG9sYXRvciBudW1iZXIgKEhQSEwvUiwgTE8xLzIpCisgKiBAc3dfdmFsdWU6IE1peGVyIHN3aXRjaCB2YWx1ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFpbHVyZQorICovCitpbnQgdGF2aWxfZHNkX3NldF9taXhlcl92YWx1ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCisJCQkgICAgICBpbnQgaW50ZXJwX251bSwgaW50IHN3X3ZhbHVlKQoreworCWlmICghZHNkX2NvbmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpc192YWxpZF9kc2RfaW50ZXJwb2xhdG9yKGludGVycF9udW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRzZF9jb25mLT5kc2RfaW50ZXJwX21peGVyW2ludGVycF9udW1dID0gISFzd192YWx1ZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2Rfc2V0X21peGVyX3ZhbHVlKTsKKworLyoqCisgKiB0YXZpbF9kc2RfZ2V0X2N1cnJlbnRfbWl4ZXJfdmFsdWUgLSBHZXQgRFNEIEhQSC9MTyBtaXhlciB2YWx1ZQorICoKKyAqIEBkc2RfY29uZjogcG9pbnRlciB0byBkc2QgY29uZmlnCisgKiBAaW50ZXJwX251bTogSW50ZXJwb2xhdG9yIG51bWJlciAoSFBITC9SLCBMTzEvMikKKyAqCisgKiBSZXR1cm5zIGN1cnJlbnQgbWl4ZXIgdmFsIGZvciBzdWNjZXNzIG9yIC1FSU5WQUwgZm9yIGZhaWx1cmUKKyAqLworaW50IHRhdmlsX2RzZF9nZXRfY3VycmVudF9taXhlcl92YWx1ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCisJCQkJICAgICAgaW50IGludGVycF9udW0pCit7CisJaWYgKCFkc2RfY29uZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWlzX3ZhbGlkX2RzZF9pbnRlcnBvbGF0b3IoaW50ZXJwX251bSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRzZF9jb25mLT5kc2RfaW50ZXJwX21peGVyW2ludGVycF9udW1dOworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2RfZ2V0X2N1cnJlbnRfbWl4ZXJfdmFsdWUpOworCisvKioKKyAqIHRhdmlsX2RzZF9zZXRfb3V0X3NlbGVjdCAtIERTRDAvMSBvdXQgc2VsZWN0IHRvIEhQSCBvciBMTworICoKKyAqIEBkc2RfY29uZjogcG9pbnRlciB0byBkc2QgY29uZmlnCisgKiBAaW50ZXJwX251bTogSW50ZXJwb2xhdG9yIG51bWJlciAoSFBITC9SLCBMTzEvMikKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBmb3IgZmFpbHVyZQorICovCitpbnQgdGF2aWxfZHNkX3NldF9vdXRfc2VsZWN0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKKwkJCSAgICAgaW50IGludGVycF9udW0pCit7CisJdW5zaWduZWQgaW50IHJlZywgdmFsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWlmICghZHNkX2NvbmYgfHwgIWRzZF9jb25mLT5jb2RlYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb2RlYyA9IGRzZF9jb25mLT5jb2RlYzsKKworCWlmICghaXNfdmFsaWRfZHNkX2ludGVycG9sYXRvcihpbnRlcnBfbnVtKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBJbnRlcnBvbGF0b3I6ICVkIGZvciBEU0RcbiIsCisJCQlfX2Z1bmNfXywgaW50ZXJwX251bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoaW50ZXJwX251bSkgeworCWNhc2UgSU5URVJQX0hQSEw6CisJCXJlZyA9IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMDsKKwkJdmFsID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFUlBfSFBIUjoKKwkJcmVnID0gV0NEOTM0WF9DRENfRFNEMV9DRkcwOworCQl2YWwgPSAweDAwOworCQlicmVhazsKKwljYXNlIElOVEVSUF9MTzE6CisJCXJlZyA9IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMDsKKwkJdmFsID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBJTlRFUlBfTE8yOgorCQlyZWcgPSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzA7CisJCXZhbCA9IDB4MDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMHgwMiwgdmFsKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3QpOworCisvKioKKyAqIHRhdmlsX2RzZF9yZXNldCAtIFJlc2V0IERTRCBibG9jaworICoKKyAqIEBkc2RfY29uZjogcG9pbnRlciB0byBkc2QgY29uZmlnCisgKgorICovCit2b2lkIHRhdmlsX2RzZF9yZXNldChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYpCit7CisJaWYgKCFkc2RfY29uZiB8fCAhZHNkX2NvbmYtPmNvZGVjKQorCQlyZXR1cm47CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGRzZF9jb25mLT5jb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKKwkJCSAgICAweDAyLCAweDAyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGRzZF9jb25mLT5jb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKKwkJCSAgICAweDAxLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGRzZF9jb25mLT5jb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKKwkJCSAgICAweDAyLCAweDAyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGRzZF9jb25mLT5jb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKKwkJCSAgICAweDAxLCAweDAwKTsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZHNkX3Jlc2V0KTsKKworLyoqCisgKiB0YXZpbF9kc2Rfc2V0X2ludGVycF9yYXRlIC0gU2V0IGludGVycG9sYXRvciByYXRlIGZvciBEU0QKKyAqCisgKiBAZHNkX2NvbmY6IHBvaW50ZXIgdG8gZHNkIGNvbmZpZworICogQHJ4X3BvcnQ6IFJYIHBvcnQgbnVtYmVyCisgKiBAc2FtcGxlX3JhdGU6IFNhbXBsZSByYXRlIG9mIHRoZSBSWCBpbnRlcnBvbGF0b3IKKyAqIEBzYW1wbGVfcmF0ZV92YWw6IEludGVycG9sYXRvciByYXRlIHZhbHVlCisgKi8KK3ZvaWQgdGF2aWxfZHNkX3NldF9pbnRlcnBfcmF0ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsIHUxNiByeF9wb3J0LAorCQkJICAgICAgIHUzMiBzYW1wbGVfcmF0ZSwgdTggc2FtcGxlX3JhdGVfdmFsKQoreworCXU4IGRzZF9pbnBfc2VsOworCXU4IGRzZDBfaW5wLCBkc2QxX2lucDsKKwl1OCB2YWwwLCB2YWwxOworCXU4IGRzZDBfb3V0X3NlbCwgZHNkMV9vdXRfc2VsOworCXUxNiBpbnRfZnNfcmVnLCBpbnRlcnBfbnVtID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlpZiAoIWRzZF9jb25mIHx8ICFkc2RfY29uZi0+Y29kZWMpCisJCXJldHVybjsKKworCWNvZGVjID0gZHNkX2NvbmYtPmNvZGVjOworCisJZHNkX2lucF9zZWwgPSBEU0RfSU5QX1NFTF9SWDAgKyByeF9wb3J0IC0gV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUjsKKworCXZhbDAgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCk7CisJdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcwKTsKKwlkc2QwX2lucCA9ICh2YWwwICYgMHgzQykgPj4gMjsKKwlkc2QxX2lucCA9ICh2YWwxICYgMHgzQykgPj4gMjsKKwlkc2QwX291dF9zZWwgPSAodmFsMCAmIDB4MDIpID4+IDE7CisJZHNkMV9vdXRfc2VsID0gKHZhbDEgJiAweDAyKSA+PiAxOworCisJLyogU2V0IEhQSEwgb3IgTE8xIGludGVycCByYXRlIGJhc2VkIG9uIG91dCBzZWxlY3QgKi8KKwlpZiAoZHNkX2lucF9zZWwgPT0gZHNkMF9pbnApIHsKKwkJaW50ZXJwX251bSA9IGRzZDBfb3V0X3NlbCA/IElOVEVSUF9MTzEgOiBJTlRFUlBfSFBITDsKKwkJZHNkX2NvbmYtPmJhc2Vfc2FtcGxlX3JhdGVbRFNEMF0gPSBzYW1wbGVfcmF0ZTsKKwl9CisKKwkvKiBTZXQgSFBIUiBvciBMTzIgaW50ZXJwIHJhdGUgYmFzZWQgb24gb3V0IHNlbGVjdCAqLworCWlmIChkc2RfaW5wX3NlbCA9PSBkc2QxX2lucCkgeworCQlpbnRlcnBfbnVtID0gZHNkMV9vdXRfc2VsID8gSU5URVJQX0xPMiA6IElOVEVSUF9IUEhSOworCQlkc2RfY29uZi0+YmFzZV9zYW1wbGVfcmF0ZVtEU0QxXSA9IHNhbXBsZV9yYXRlOworCX0KKworCWlmIChpbnRlcnBfbnVtKSB7CisJCWludF9mc19yZWcgPSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DVEwgKyAyMCAqIGludGVycF9udW07CisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBpbnRfZnNfcmVnKSAmIDB4MGYpIDwgMHgwOSkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFNldCBJbnRlcnAgJWQgdG8gc2FtcGxlX3JhdGUgdmFsIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGludGVycF9udW0sIHNhbXBsZV9yYXRlX3ZhbCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpbnRfZnNfcmVnLCAweDBGLAorCQkJCQkgICAgc2FtcGxlX3JhdGVfdmFsKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZHNkX3NldF9pbnRlcnBfcmF0ZSk7CisKK3N0YXRpYyBpbnQgdGF2aWxfc2V0X2RzZF9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGRzZF9udW0sCisJCQkgICAgICB1OCAqcGNtX3JhdGVfdmFsKQoreworCXVuc2lnbmVkIGludCBkc2Rfb3V0X3NlbF9yZWc7CisJdTggZHNkX21vZGU7CisJdTMyIHNhbXBsZV9yYXRlOworCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsX2dldF9kc2RfY29uZmlnKGNvZGVjKTsKKworCWlmICghZHNkX2NvbmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChkc2RfbnVtIDwgMCkgfHwgKGRzZF9udW0gPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzYW1wbGVfcmF0ZSA9IGRzZF9jb25mLT5iYXNlX3NhbXBsZV9yYXRlW2RzZF9udW1dOworCWRzZF9vdXRfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCArIGRzZF9udW0gKiAxNjsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIDE3NjQwMDoKKwkJZHNkX21vZGUgPSAwOyAvKiBEU0RfNjQgKi8KKwkJKnBjbV9yYXRlX3ZhbCA9IDB4YjsKKwkJYnJlYWs7CisJY2FzZSAzNTI4MDA6CisJCWRzZF9tb2RlID0gMTsgLyogRFNEXzEyOCAqLworCQkqcGNtX3JhdGVfdmFsID0gMHhjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBEU0QgcmF0ZTogJWRcbiIsCisJCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkc2Rfb3V0X3NlbF9yZWcsIDB4MDEsIGRzZF9tb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9kc2RfZGF0YV9wdWxsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGRzZF9udW0sCisJCQkJdTggcGNtX3JhdGVfdmFsLCBib29sIGVuYWJsZSkKK3sKKwl1OCBjbGtfZW4sIG11dGVfZW47CisJdTggZHNkX2lucF9zZWw7CisKKwlpZiAoZW5hYmxlKSB7CisJCWNsa19lbiA9IDB4MjA7CisJCW11dGVfZW4gPSAweDEwOworCX0gZWxzZSB7CisJCWNsa19lbiA9IDB4MDA7CisJCW11dGVfZW4gPSAweDAwOworCX0KKworCWlmIChkc2RfbnVtICYgMHgwMSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCSAgICAweDIwLCBjbGtfZW4pOworCQlkc2RfaW5wX3NlbCA9IChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCkgJgorCQkJCTB4M0MpID4+IDI7CisJCWRzZF9pbnBfc2VsID0gKGVuYWJsZSkgPyBkc2RfaW5wX3NlbCA6IDA7CisJCWlmIChkc2RfaW5wX3NlbCA8IDkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxLAorCQkJCQkweDBGLCBkc2RfaW5wX3NlbCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkweDBGLCBwY21fcmF0ZV92YWwpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NUTCwKKwkJCQkJMHgxMCwgbXV0ZV9lbik7CisJCX0KKwl9CisJaWYgKGRzZF9udW0gJiAweDAyKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEwsCisJCQkJICAgIDB4MjAsIGNsa19lbik7CisJCWRzZF9pbnBfc2VsID0gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcwKSAmCisJCQkJMHgzQykgPj4gMjsKKwkJZHNkX2lucF9zZWwgPSAoZW5hYmxlKSA/IGRzZF9pbnBfc2VsIDogMDsKKwkJaWYgKGRzZF9pbnBfc2VsIDwgOSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsCisJCQkJCTB4MEYsIGRzZF9pbnBfc2VsKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEwsCisJCQkJCTB4MEYsIHBjbV9yYXRlX3ZhbCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkweDEwLCBtdXRlX2VuKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdGF2aWxfZHNkX3VwZGF0ZV92b2x1bWUoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mKQoreworCXNuZF9zb2NfdXBkYXRlX2JpdHMoZHNkX2NvbmYtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzAsCisJCQkgICAgMHgwMSwgMHgwMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhkc2RfY29uZi0+Y29kZWMsIFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCwKKwkJCSAgICAweDAxLCAweDAwKTsKK30KKworc3RhdGljIGludCB0YXZpbF9lbmFibGVfZHNkKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsX2dldF9kc2RfY29uZmlnKGNvZGVjKTsKKwlpbnQgcmMsIGNsa191c2VyczsKKwlpbnQgaW50ZXJwX2lkeDsKKwl1OCBwY21fcmF0ZV92YWw7CisKKwlpZiAoIWRzZF9jb25mKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBudWxsIGRzZF9jb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRFNEJWQsIGV2ZW50OiAlZFxuIiwgX19mdW5jX18sCisJCXctPnNoaWZ0LCBldmVudCk7CisKKwlpZiAody0+c2hpZnQgPT0gRFNEMCkgeworCQkvKiBSZWFkIG91dCBzZWxlY3QgKi8KKwkJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcwKSAmIDB4MDIpCisJCQlpbnRlcnBfaWR4ID0gSU5URVJQX0xPMTsKKwkJZWxzZQorCQkJaW50ZXJwX2lkeCA9IElOVEVSUF9IUEhMOworCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gRFNEMSkgeworCQkvKiBSZWFkIG91dCBzZWxlY3QgKi8KKwkJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcwKSAmIDB4MDIpCisJCQlpbnRlcnBfaWR4ID0gSU5URVJQX0xPMjsKKwkJZWxzZQorCQkJaW50ZXJwX2lkeCA9IElOVEVSUF9IUEhSOworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBVbnN1cHBvcnRlZCBEU0Q6JWRcbiIsCisJCQlfX2Z1bmNfXywgdy0+c2hpZnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJY2xrX3VzZXJzID0gdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LAorCQkJCQkJCSAgaW50ZXJwX2lkeCk7CisKKwkJcmMgPSB0YXZpbF9zZXRfZHNkX21vZGUoY29kZWMsIHctPnNoaWZ0LCAmcGNtX3JhdGVfdmFsKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXRhdmlsX2RzZF9kYXRhX3B1bGwoY29kZWMsICgxIDw8IHctPnNoaWZ0KSwgcGNtX3JhdGVfdmFsLAorCQkJCSAgICB0cnVlKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCSAgICBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wsIDB4MDEsCisJCQkJICAgIDB4MDEpOworCQlpZiAody0+c2hpZnQgPT0gRFNEMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKKwkJCQkJICAgIDB4MDIsIDB4MDIpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKKwkJCQkJICAgIDB4MDIsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJLyogQXBwbHkgR2FpbiAqLworCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcxLAorCQkJCSAgICAgIGRzZF9jb25mLT52b2x1bWVbRFNEMF0pOworCQkJaWYgKGRzZF9jb25mLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8xKQorCQkJCXRhdmlsX2RzZF91cGRhdGVfdm9sdW1lKGRzZF9jb25mKTsKKworCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IERTRDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsCisJCQkJCSAgICAweDAyLCAweDAyKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsCisJCQkJCSAgICAweDAyLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCS8qIEFwcGx5IEdhaW4gKi8KKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMSwKKwkJCQkgICAgICBkc2RfY29uZi0+dm9sdW1lW0RTRDFdKTsKKwkJCWlmIChkc2RfY29uZi0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OXzFfMSkKKwkJCQl0YXZpbF9kc2RfdXBkYXRlX3ZvbHVtZShkc2RfY29uZik7CisJCX0KKwkJLyogMTBtc2VjIHNsZWVwIHJlcXVpcmVkIGFmdGVyIERTRCBjbG9jayBpcyBzZXQgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7CisKKwkJaWYgKGNsa191c2VycyA+IDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLAorCQkJCQkgICAgMHgwMiwgMHgwMik7CisJCQlpZiAody0+c2hpZnQgPT0gRFNEMCkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJICAgIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwKKwkJCQkJCSAgICAweDA0LCAweDAwKTsKKwkJCWlmICh3LT5zaGlmdCA9PSBEU0QxKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQkgICAgV0NEOTM0WF9DRENfRFNEMV9DRkcyLAorCQkJCQkJICAgIDB4MDQsIDB4MDApOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICh3LT5zaGlmdCA9PSBEU0QwKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzIsCisJCQkJCSAgICAweDA0LCAweDA0KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJfSBlbHNlIGlmICh3LT5zaGlmdCA9PSBEU0QxKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIsCisJCQkJCSAgICAweDA0LCAweDA0KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJfQorCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgaW50ZXJwX2lkeCk7CisKKwkJaWYgKCEoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMKSAmIDB4MDEpICYmCisJCSAgICAhKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCkgJiAweDAxKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0RTRF9DT05UUk9MLAorCQkJCQkweDAxLCAweDAwKTsKKwkJCXRhdmlsX2RzZF9kYXRhX3B1bGwoY29kZWMsIDB4MDMsIDB4MDQsIGZhbHNlKTsKKwkJCXRhdmlsX2RzZF9yZXNldChkc2RfY29uZik7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZHNkX3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IERTRF9WT0xVTUVfTUlOX00xMTBkQjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBEU0RfVk9MVU1FX01BWF8wZEI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9kc2Rfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWxfZ2V0X2RzZF9jb25maWcoY29kZWMpOworCWludCBudltEU0RfTUFYXSwgY3ZbRFNEX01BWF07CisJaW50IHN0ZXBfc2l6ZSwgbnYxOworCWludCBpLCBkc2RfaWR4OworCisJaWYgKCFkc2RfY29uZikKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZkc2RfY29uZi0+dm9sX211dGV4KTsKKworCWZvciAoZHNkX2lkeCA9IERTRDA7IGRzZF9pZHggPCBEU0RfTUFYOyBkc2RfaWR4KyspIHsKKwkJY3ZbZHNkX2lkeF0gPSBkc2RfY29uZi0+dm9sdW1lW2RzZF9pZHhdOworCQludltkc2RfaWR4XSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2RzZF9pZHhdOworCX0KKworCWlmICgoIURTRF9WT0xVTUVfUkFOR0VfQ0hFQ0sobnZbRFNEMF0pKSB8fAorCSAgICAoIURTRF9WT0xVTUVfUkFOR0VfQ0hFQ0sobnZbRFNEMV0pKSkKKwkJZ290byBkb25lOworCisJZm9yIChkc2RfaWR4ID0gRFNEMDsgZHNkX2lkeCA8IERTRF9NQVg7IGRzZF9pZHgrKykgeworCQlpZiAoY3ZbZHNkX2lkeF0gPT0gbnZbZHNkX2lkeF0pCisJCQljb250aW51ZTsKKworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRFNEJWQgY3VyLnZvbDogJWQsIG5ldyB2b2w6ICVkXG4iLAorCQkJX19mdW5jX18sIGRzZF9pZHgsIGN2W2RzZF9pZHhdLCBudltkc2RfaWR4XSk7CisKKwkJc3RlcF9zaXplID0gIChudltkc2RfaWR4XSAtIGN2W2RzZF9pZHhdKSAvCisJCQkgICAgICBEU0RfVk9MVU1FX1NURVBTOworCisJCW52MSA9IGN2W2RzZF9pZHhdOworCisJCWZvciAoaSA9IDA7IGkgPCBEU0RfVk9MVU1FX1NURVBTOyBpKyspIHsKKwkJCW52MSArPSBzdGVwX3NpemU7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCSAgICAgIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMSArIDE2ICogZHNkX2lkeCwKKwkJCQkgICAgICBudjEpOworCQkJaWYgKGRzZF9jb25mLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8xKQorCQkJCXRhdmlsX2RzZF91cGRhdGVfdm9sdW1lKGRzZF9jb25mKTsKKworCQkJLyogc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZWFjaCB2b2x1bWUgc3RlcCAqLworCQkJdXNsZWVwX3JhbmdlKERTRF9WT0xVTUVfU1RFUF9ERUxBWV9VUywKKwkJCQkgICAgIChEU0RfVk9MVU1FX1NURVBfREVMQVlfVVMgKworCQkJCSAgICAgIERTRF9WT0xVTUVfVVNMRUVQX01BUkdJTl9VUykpOworCQl9CisJCWlmIChudjEgIT0gbnZbZHNkX2lkeF0pIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJICAgICAgV0NEOTM0WF9DRENfRFNEMF9DRkcxICsgMTYgKiBkc2RfaWR4LAorCQkJCSAgICAgIG52W2RzZF9pZHhdKTsKKworCQkJaWYgKGRzZF9jb25mLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8xKQorCQkJCXRhdmlsX2RzZF91cGRhdGVfdm9sdW1lKGRzZF9jb25mKTsKKwkJfQorCisJCWRzZF9jb25mLT52b2x1bWVbZHNkX2lkeF0gPSBudltkc2RfaWR4XTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkc2RfY29uZi0+dm9sX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2RzZF92b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9nZXRfZHNkX2NvbmZpZyhjb2RlYyk7CisKKwlpZiAoZHNkX2NvbmYpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkc2RfY29uZi0+dm9sdW1lW0RTRDBdOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGRzZF9jb25mLT52b2x1bWVbRFNEMV07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0YXZpbF9kc2Rfdm9sX2NvbnRyb2xzW10gPSB7CisJeworCSAgIC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCSAgIC5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJICAgLm5hbWUgPSAiRFNEIFZvbHVtZSIsCisJICAgLmluZm8gPSB0YXZpbF9kc2Rfdm9sX2luZm8sCisJICAgLmdldCA9IHRhdmlsX2RzZF92b2xfZ2V0LAorCSAgIC5wdXQgPSB0YXZpbF9kc2Rfdm9sX3B1dCwKKwkgICAudGx2ID0geyAucCA9IHRhdmlsX2RzZF9kYl9zY2FsZSB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdGF2aWxfZHNkX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fTVVYKCJEU0RfTCBJRiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZkc2RfbF9pZl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiRFNEX0ZJTFRFUl8wIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmZHNkX2ZpbHQwX211eCwKKwkJCSAgIHRhdmlsX2VuYWJsZV9kc2QsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJEU0RfUiBJRiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZkc2Rfcl9pZl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiRFNEX0ZJTFRFUl8xIiwgU05EX1NPQ19OT1BNLCAxLCAwLCAmZHNkX2ZpbHQxX211eCwKKwkJCSAgIHRhdmlsX2VuYWJsZV9kc2QsCisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCit9OworCisvKioKKyAqIHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0IC0gRFNEIGludGlhbGl6YXRpb24gYWZ0ZXIgc3Vic3lzdGVtIHJlc3RhcnQKKyAqCisgKiBAY29kZWM6IHBvaW50ZXIgdG8gc25kX3NvY19jb2RlYworICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlpZiAoIWRzZF9jb25mIHx8ICFkc2RfY29uZi0+Y29kZWMpCisJCXJldHVybiAtRUlOVkFMOworCisJY29kZWMgPSBkc2RfY29uZi0+Y29kZWM7CisJLyogRGlzYWJsZSBEU0QgSW50ZXJydXB0cyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX01BU0ssIDB4MDgsIDB4MDgpOworCisJLyogRFNEIHJlZ2lzdGVycyBpbml0ICovCisJaWYgKGRzZF9jb25mLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8wKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwgMHgwMiwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwgMHgwMiwgMHgwMCk7CisJfQorCS8qIERTRDA6IE11dGUgRU4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzIsIDB4MDQsIDB4MDQpOworCS8qIERTRDE6IE11dGUgRU4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIsIDB4MDQsIDB4MDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMywgMHgxMCwKKwkJCSAgICAweDEwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzMsIDB4MTAsCisJCQkgICAgMHgxMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcwLCAweDBFLAorCQkJICAgIDB4MEEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMCwgMHgwRSwKKwkJCSAgICAweDBBKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzEsIDB4MDcsCisJCQkgICAgMHgwNCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcxLCAweDA3LAorCQkJICAgIDB4MDQpOworCisJLyogRW5hYmxlIERTRCBJbnRlcnJ1cHRzICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgMHgwOCwgMHgwMCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZHNkX3Bvc3Rfc3NyX2luaXQpOworCisvKioKKyAqIHRhdmlsX2RzZF9pbml0IC0gRFNEIGludGlhbGl6YXRpb24KKyAqCisgKiBAY29kZWM6IHBvaW50ZXIgdG8gc25kX3NvY19jb2RlYworICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB0YXZpbF9kc2RfY29uZmlnIGZvciBzdWNjZXNzIG9yIE5VTEwgZm9yIGZhaWx1cmUKKyAqLworc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKnRhdmlsX2RzZF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CisJc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mOworCXU4IHZhbDsKKworCWlmICghY29kZWMpCisJCXJldHVybiBOVUxMOworCisJZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJLyogUmVhZCBlZnVzZSByZWdpc3RlciB0byBjaGVjayBpZiBEU0QgaXMgc3VwcG9ydGVkICovCisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNCk7CisJaWYgKHZhbCAmIDB4ODApIHsKKwkJZGV2X2luZm8oY29kZWMtPmRldiwgIiVzOiBEU0QgdW5zdXBwb3J0ZWQgZm9yIHRoaXMgY29kZWMgdmVyc2lvblxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRzZF9jb25mID0gZGV2bV9remFsbG9jKGNvZGVjLT5kZXYsIHNpemVvZihzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFkc2RfY29uZikKKwkJcmV0dXJuIE5VTEw7CisKKwlkc2RfY29uZi0+Y29kZWMgPSBjb2RlYzsKKworCS8qIFJlYWQgdmVyc2lvbiAqLworCWRzZF9jb25mLT52ZXJzaW9uID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCQkgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwKTsKKwkvKiBEU0QgcmVnaXN0ZXJzIGluaXQgKi8KKwlpZiAoZHNkX2NvbmYtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzApIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcyLCAweDAyLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcyLCAweDAyLCAweDAwKTsKKwl9CisJLyogRFNEMDogTXV0ZSBFTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwgMHgwNCwgMHgwNCk7CisJLyogRFNEMTogTXV0ZSBFTiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwgMHgwNCwgMHgwNCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkczLCAweDEwLAorCQkJICAgIDB4MTApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMywgMHgxMCwKKwkJCSAgICAweDEwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzAsIDB4MEUsCisJCQkgICAgMHgwQSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcwLCAweDBFLAorCQkJICAgIDB4MEEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMSwgMHgwNywKKwkJCSAgICAweDA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzEsIDB4MDcsCisJCQkgICAgMHgwNCk7CisKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRhdmlsX2RzZF93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh0YXZpbF9kc2Rfd2lkZ2V0cykpOworCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgdGF2aWxfZHNkX2F1ZGlvX21hcCwKKwkJCQlBUlJBWV9TSVpFKHRhdmlsX2RzZF9hdWRpb19tYXApKTsKKworCW11dGV4X2luaXQoJmRzZF9jb25mLT52b2xfbXV0ZXgpOworCWRzZF9jb25mLT52b2x1bWVbRFNEMF0gPSBEU0RfVk9MVU1FX01BWF8wZEI7CisJZHNkX2NvbmYtPnZvbHVtZVtEU0QxXSA9IERTRF9WT0xVTUVfTUFYXzBkQjsKKworCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCB0YXZpbF9kc2Rfdm9sX2NvbnRyb2xzLAorCQkJCSAgIEFSUkFZX1NJWkUodGF2aWxfZHNkX3ZvbF9jb250cm9scykpOworCisJLyogRW5hYmxlIERTRCBJbnRlcnJ1cHRzICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgMHgwOCwgMHgwMCk7CisKKwlyZXR1cm4gZHNkX2NvbmY7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX2RzZF9pbml0KTsKKworLyoqCisgKiB0YXZpbF9kc2RfZGVpbml0IC0gRFNEIGRlLWludGlhbGl6YXRpb24KKyAqCisgKiBAZHNkX2NvbmY6IHBvaW50ZXIgdG8gdGF2aWxfZHNkX2NvbmZpZworICovCit2b2lkIHRhdmlsX2RzZF9kZWluaXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWlmICghZHNkX2NvbmYpCisJCXJldHVybjsKKworCWNvZGVjID0gZHNkX2NvbmYtPmNvZGVjOworCisJbXV0ZXhfZGVzdHJveSgmZHNkX2NvbmYtPnZvbF9tdXRleCk7CisKKwkvKiBEaXNhYmxlIERTRCBJbnRlcnJ1cHRzICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgMHgwOCwgMHgwOCk7CisKKwlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIGRzZF9jb25mKTsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZHNkX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc2QuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODI4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc2QuaApAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1dDRDkzNFhfRFNEX0hfXworI2RlZmluZSBfX1dDRDkzNFhfRFNEX0hfXworCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAid2NkOTM0eC5oIgorCitlbnVtIHsKKwlEU0QwLAorCURTRDEsCisJRFNEX01BWCwKK307CisKK2VudW0geworCURTRF9JTlBfU0VMX1pFUk8gPSAwLAorCURTRF9JTlBfU0VMX1JYMCwKKwlEU0RfSU5QX1NFTF9SWDEsCisJRFNEX0lOUF9TRUxfUlgyLAorCURTRF9JTlBfU0VMX1JYMywKKwlEU0RfSU5QX1NFTF9SWDQsCisJRFNEX0lOUF9TRUxfUlg1LAorCURTRF9JTlBfU0VMX1JYNiwKKwlEU0RfSU5QX1NFTF9SWDcsCit9OworCitzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXVuc2lnbmVkIGludCBkc2RfaW50ZXJwX21peGVyW0lOVEVSUF9NQVhdOworCXUzMiBiYXNlX3NhbXBsZV9yYXRlW0RTRF9NQVhdOworCWludCB2b2x1bWVbRFNEX01BWF07CisJc3RydWN0IG11dGV4IHZvbF9tdXRleDsKKwlpbnQgdmVyc2lvbjsKK307CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19XQ0Q5MzRYX0RTRAoraW50IHRhdmlsX2RzZF9zZXRfbWl4ZXJfdmFsdWUoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAorCQkJICAgICAgaW50IGludGVycF9udW0sIGludCBzd192YWx1ZSk7CitpbnQgdGF2aWxfZHNkX2dldF9jdXJyZW50X21peGVyX3ZhbHVlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKKwkJCQkgICAgICBpbnQgaW50ZXJwX251bSk7CitpbnQgdGF2aWxfZHNkX3NldF9vdXRfc2VsZWN0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKKwkJCSAgICAgaW50IGludGVycF9udW0pOwordm9pZCB0YXZpbF9kc2RfcmVzZXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mKTsKK3ZvaWQgdGF2aWxfZHNkX3NldF9pbnRlcnBfcmF0ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsIHUxNiByeF9wb3J0LAorCQkJICAgICAgIHUzMiBzYW1wbGVfcmF0ZSwgdTggc2FtcGxlX3JhdGVfdmFsKTsKK3N0cnVjdCB0YXZpbF9kc2RfY29uZmlnICp0YXZpbF9kc2RfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCB0YXZpbF9kc2RfZGVpbml0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZmlnKTsKK2ludCB0YXZpbF9kc2RfcG9zdF9zc3JfaW5pdChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmZpZyk7CisjZWxzZQoraW50IHRhdmlsX2RzZF9zZXRfbWl4ZXJfdmFsdWUoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAorCQkJICAgICAgaW50IGludGVycF9udW0sIGludCBzd192YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHRhdmlsX2RzZF9nZXRfY3VycmVudF9taXhlcl92YWx1ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCisJCQkJICAgICAgaW50IGludGVycF9udW0pCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3Qoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAorCQkJICAgICBpbnQgaW50ZXJwX251bSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0YXZpbF9kc2RfcmVzZXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mKQoreyAgfQorCit2b2lkIHRhdmlsX2RzZF9zZXRfaW50ZXJwX3JhdGUoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLCB1MTYgcnhfcG9ydCwKKwkJCSAgICAgICB1MzIgc2FtcGxlX3JhdGUsIHU4IHNhbXBsZV9yYXRlX3ZhbCkKK3sgIH0KKworc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKnRhdmlsX2RzZF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB0YXZpbF9kc2RfZGVpbml0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZmlnKQoreyAgfQoraW50IHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZmlnKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzcC1jbnRsLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc3AtY250bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWRhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc3AtY250bC5jCkBAIC0wLDAgKzEsMTM2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvd2NkLWRzcC1tZ3IuaD4KKyNpbmNsdWRlICJ3Y2Q5MzR4LmgiCisjaW5jbHVkZSAid2NkOTM0eC1kc3AtY250bC5oIgorCisjZGVmaW5lIFdDRF9DTlRMX0RJUl9OQU1FX0xFTl9NQVggMzIKKyNkZWZpbmUgV0NEX0NQRV9GTExfTUFYX1JFVFJJRVMgNQorI2RlZmluZSBXQ0RfTUVNX0VOQUJMRV9NQVhfUkVUUklFUyAyMAorI2RlZmluZSBXQ0RfRFNQX0JPT1RfVElNRU9VVF9NUyAzMDAwCisjZGVmaW5lIFdDRF9TWVNGU19FTlRSWV9NQVhfTEVOIDgKKyNkZWZpbmUgV0NEX1BST0NGU19FTlRSWV9NQVhfTEVOIDE2CisjZGVmaW5lIFdDRF85MzRYX1JBTURVTVBfU1RBUlRfQUREUiAweDIwMTAwMDAwCisjZGVmaW5lIFdDRF85MzRYX1JBTURVTVBfU0laRSAoKDEwMjQgKiAxMDI0KSAtIDEyOCkKKworI2RlZmluZSBXQ0RfQ05UTF9NVVRFWF9MT0NLKGNvZGVjLCBsb2NrKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbXV0ZXhfbG9jayglcylcbiIsICBcCisJCV9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICBcCisJbXV0ZXhfbG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFdDRF9DTlRMX01VVEVYX1VOTE9DSyhjb2RlYywgbG9jaykgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG11dGV4X3VubG9jayglcylcbiIsIFwKKwkJX19mdW5jX18sIF9fc3RyaW5naWZ5XzEobG9jaykpOyAgICAgICBcCisJbXV0ZXhfdW5sb2NrKCZsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworZW51bSB3Y2RfbWVtX3R5cGUgeworCVdDRF9NRU1fVFlQRV9BTFdBWVNfT04sCisJV0NEX01FTV9UWVBFX1NXSVRDSEFCTEUsCit9OworCitzdHJ1Y3Qgd2NkX2NudGxfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsIGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsLCBjb25zdCBjaGFyICpidWYsCisJCQkgc3NpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIFdDRF9DTlRMX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCitzdGF0aWMgc3RydWN0IHdjZF9jbnRsX2F0dHJpYnV0ZSBjbnRsX2F0dHJfIyNfbmFtZSA9IHsJXAorCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAubW9kZSA9IF9tb2RlfSwJXAorCS5zaG93ID0gX3Nob3csCVwKKwkuc3RvcmUgPSBfc3RvcmUsCVwKK30KKworI2RlZmluZSB0b193Y2RfY250bF9hdHRyKGEpIFwKKwljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3Qgd2NkX2NudGxfYXR0cmlidXRlLCBhdHRyKQorCisjZGVmaW5lIHRvX3djZF9jbnRsKGtvYmopIFwKKwljb250YWluZXJfb2YoKGtvYmopLCBzdHJ1Y3Qgd2NkX2RzcF9jbnRsLCB3Y2Rfa29iaikKKworc3RhdGljIHU4IG1lbV9lbmFibGVfdmFsdWVzW10gPSB7CisJMHhGRSwgMHhGQywgMHhGOCwgMHhGMCwKKwkweEUwLCAweEMwLCAweDgwLCAweDAwLAorfTsKKworc3RhdGljIHNzaXplX3Qgd2RzcF9ib290X3Nob3coc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFdDRF9TWVNGU19FTlRSWV9NQVhfTEVOLAorCQkJIiV1IiwgY250bC0+Ym9vdF9yZXFzKTsKK30KKworc3RhdGljIHNzaXplX3Qgd2RzcF9ib290X3N0b3JlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQoreworCXUzMiB2YWw7CisJYm9vbCB2b3RlOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91MzIoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCisJCQkiJXM6IEludmFsaWQgZW50cnksIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbCA+IDApIHsKKwkJY250bC0+Ym9vdF9yZXFzKys7CisJCXZvdGUgPSB0cnVlOworCX0gZWxzZSB7CisJCWNudGwtPmJvb3RfcmVxcy0tOworCQl2b3RlID0gZmFsc2U7CisJfQorCisJaWYgKGNudGwtPm1fZGV2ICYmIGNudGwtPm1fb3BzICYmCisJICAgIGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3ApCisJCXJldCA9IGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3AoY250bC0+bV9kZXYsIHZvdGUpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gJXMgZHNwXG4iLCBfX2Z1bmNfXywKKwkJCXZvdGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJcmV0dXJuIGNvdW50OworfQorCitXQ0RfQ05UTF9BVFRSKGJvb3QsIDA2NjAsIHdkc3BfYm9vdF9zaG93LCB3ZHNwX2Jvb3Rfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCB3Y2RfY250bF9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgd2NkX2NudGxfYXR0cmlidXRlICp3Y2RfYXR0ciA9IHRvX3djZF9jbnRsX2F0dHIoYXR0cik7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHRvX3djZF9jbnRsKGtvYmopOworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjbnRsICYmIHdjZF9hdHRyLT5zaG93KQorCQlyZXQgPSB3Y2RfYXR0ci0+c2hvdyhjbnRsLCBidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgd2NkX2NudGxfc3lzZnNfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3Y2RfY250bF9hdHRyaWJ1dGUgKndjZF9hdHRyID0gdG9fd2NkX2NudGxfYXR0cihhdHRyKTsKKwlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsID0gdG9fd2NkX2NudGwoa29iaik7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisJaWYgKGNudGwgJiYgd2NkX2F0dHItPnN0b3JlKQorCQlyZXQgPSB3Y2RfYXR0ci0+c3RvcmUoY250bCwgYnVmLCBjb3VudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyB3Y2RfY250bF9zeXNmc19vcHMgPSB7CisJLnNob3cgPSB3Y2RfY250bF9zeXNmc19zaG93LAorCS5zdG9yZSA9IHdjZF9jbnRsX3N5c2ZzX3N0b3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgd2NkX2NudGxfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZ3Y2RfY250bF9zeXNmc19vcHMsCit9OworCitzdGF0aWMgdm9pZCB3Y2RfY250bF9jaGFuZ2Vfb25saW5lX3N0YXRlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsCisJCQkJCSB1OCBvbmxpbmUpCit7CisJc3RydWN0IHdkc3Bfc3NyX2VudHJ5ICpzc3JfZW50cnkgPSAmY250bC0+c3NyX2VudHJ5OworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJV0NEX0NOVExfTVVURVhfTE9DSyhjbnRsLT5jb2RlYywgY250bC0+c3NyX211dGV4KTsKKwlzc3JfZW50cnktPm9mZmxpbmUgPSAhb25saW5lOworCS8qIE1ha2Ugc3VyZSB0aGUgd3JpdGUgaXMgY29tcGxldGUgKi8KKwl3bWIoKTsKKwlyZXQgPSB4Y2hnKCZzc3JfZW50cnktPm9mZmxpbmVfY2hhbmdlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNzcl9lbnRyeS0+b2ZmbGluZV9wb2xsX3dhaXQpOworCWRldl9kYmcoY250bC0+Y29kZWMtPmRldiwKKwkJIiVzOiByZXF1ZXN0ZWQgJXUsIG9mZmxpbmUgJXUgb2ZmbGluZV9jaGFuZ2UgJXUsIHJldCA9ICVsZG4iLAorCQlfX2Z1bmNfXywgb25saW5lLCBzc3JfZW50cnktPm9mZmxpbmUsCisJCXNzcl9lbnRyeS0+b2ZmbGluZV9jaGFuZ2UsIHJldCk7CisJV0NEX0NOVExfTVVURVhfVU5MT0NLKGNudGwtPmNvZGVjLCBjbnRsLT5zc3JfbXV0ZXgpOworfQorCitzdGF0aWMgc3NpemVfdCB3ZHNwX3Nzcl9lbnRyeV9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkJICAgdm9pZCAqZmlsZV9wcml2X2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlpbnQgbGVuID0gMDsKKwljaGFyIGJ1ZmZlcltXQ0RfUFJPQ0ZTX0VOVFJZX01BWF9MRU5dOworCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGw7CisJc3RydWN0IHdkc3Bfc3NyX2VudHJ5ICpzc3JfZW50cnk7CisJc3NpemVfdCByZXQ7CisJdTggb2ZmbGluZTsKKworCWNudGwgPSAoc3RydWN0IHdjZF9kc3BfY250bCAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWlmICghY250bCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YSBmb3IgU1NSIHByb2NmcyBlbnRyeVxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3NyX2VudHJ5ID0gJmNudGwtPnNzcl9lbnRyeTsKKworCVdDRF9DTlRMX01VVEVYX0xPQ0soY250bC0+Y29kZWMsIGNudGwtPnNzcl9tdXRleCk7CisJb2ZmbGluZSA9IHNzcl9lbnRyeS0+b2ZmbGluZTsKKwkvKiBNYWtlIHN1cmUgdGhlIHJlYWQgaXMgY29tcGxldGUgKi8KKwlybWIoKTsKKwlkZXZfZGJnKGNudGwtPmNvZGVjLT5kZXYsICIlczogb2ZmbGluZSA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJb2ZmbGluZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlc1xuIiwKKwkJICAgICAgIG9mZmxpbmUgPyAiT0ZGTElORSIgOiAiT05MSU5FIik7CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJnBvcywgYnVmZmVyLCBsZW4pOworCVdDRF9DTlRMX01VVEVYX1VOTE9DSyhjbnRsLT5jb2RlYywgY250bC0+c3NyX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2RzcF9zc3JfZW50cnlfcG9sbChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAorCQkJCQl2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQlwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGw7CisJc3RydWN0IHdkc3Bfc3NyX2VudHJ5ICpzc3JfZW50cnk7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAoIWVudHJ5IHx8ICFlbnRyeS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6ICVzIGlzIE5VTExcbiIsIF9fZnVuY19fLAorCQkgICAgICAgKCFlbnRyeSkgPyAiZW50cnkiIDogInByaXZhdGVfZGF0YSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbnRsID0gKHN0cnVjdCB3Y2RfZHNwX2NudGwgKikgZW50cnktPnByaXZhdGVfZGF0YTsKKwlzc3JfZW50cnkgPSAmY250bC0+c3NyX2VudHJ5OworCisJZGV2X2RiZyhjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IFBvbGwgd2FpdCwgb2ZmbGluZSA9ICV1XG4iLAorCQlfX2Z1bmNfXywgc3NyX2VudHJ5LT5vZmZsaW5lKTsKKwlwb2xsX3dhaXQoZmlsZSwgJnNzcl9lbnRyeS0+b2ZmbGluZV9wb2xsX3dhaXQsIHdhaXQpOworCWRldl9kYmcoY250bC0+Y29kZWMtPmRldiwgIiVzOiBXb2tlbiB1cCBQb2xsIHdhaXQsIG9mZmxpbmUgPSAldVxuIiwKKwkJX19mdW5jX18sIHNzcl9lbnRyeS0+b2ZmbGluZSk7CisKKwlXQ0RfQ05UTF9NVVRFWF9MT0NLKGNudGwtPmNvZGVjLCBjbnRsLT5zc3JfbXV0ZXgpOworCWlmICh4Y2hnKCZzc3JfZW50cnktPm9mZmxpbmVfY2hhbmdlLCAwKSkKKwkJcmV0ID0gUE9MTElOIHwgUE9MTFBSSSB8IFBPTExSRE5PUk07CisJZGV2X2RiZyhjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IHJldCAoJWQpIGZyb20gcG9sbF93YWl0XG4iLAorCQlfX2Z1bmNfXywgcmV0KTsKKwlXQ0RfQ05UTF9NVVRFWF9VTkxPQ0soY250bC0+Y29kZWMsIGNudGwtPnNzcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyB3ZHNwX3Nzcl9lbnRyeV9vcHMgPSB7CisJLnJlYWQgPSB3ZHNwX3Nzcl9lbnRyeV9yZWFkLAorCS5wb2xsID0gd2RzcF9zc3JfZW50cnlfcG9sbCwKK307CisKK3N0YXRpYyBpbnQgd2NkX2NudGxfY3BlX2ZsbF9jYWxpYnJhdGUoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlpbnQgcmV0ID0gMCwgcmV0cnkgPSAwOworCXU4IGNhbF9sc2IsIGNhbF9tc2I7CisJdTggbG9ja19kZXQ7CisKKwkvKiBNYWtlIHN1cmUgY2xvY2tzIGFyZSBnYXRlZCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwsCisJCQkgICAgMHgwNSwgMHgwMCk7CisKKwkvKiBFbmFibGUgQ1BFIEZMTCByZWZlcmVuY2UgY2xvY2sgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwKKwkJCSAgICAweDgwLCAweDgwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF81LAorCQkJICAgIDB4RjMsIDB4MTMpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMCwgMHg1MCk7CisKKwkvKiBEaXNhYmxlIENQQVIgcmVzZXQgYW5kIEVuYWJsZSBDUEFSIGNsayAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMLAorCQkJICAgIDB4MDIsIDB4MDIpOworCisJLyogV3JpdGUgY2FsaWJyYXRpb24gbC12YWx1ZSBiYXNlZCBvbiBjZGMgY2xrIHJhdGUgKi8KKwlpZiAoY250bC0+Y2xrX3JhdGUgPT0gOTYwMDAwMCkgeworCQljYWxfbHNiID0gMHg2ZDsKKwkJY2FsX21zYiA9IDB4MDA7CisJfSBlbHNlIHsKKwkJY2FsX2xzYiA9IDB4NTY7CisJCWNhbF9tc2IgPSAweDAwOworCX0KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNiwgY2FsX2xzYik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzcsIGNhbF9tc2IpOworCisJLyogRkxMIG1vZGUgdG8gZm9sbG93IHBvd2VyIHVwIHNlcXVlbmNlICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfRkxMX0ZMTF9NT0RFLAorCQkJICAgIDB4NjAsIDB4MDApOworCisJLyogSFcgY29udHJvbGxlZCBDUEUgRkxMICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfRkxMX0ZMTF9NT0RFLAorCQkJICAgIDB4ODAsIDB4ODApOworCisJLyogRm9yY2Ugb24gQ1BFIEZMTCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLAorCQkJICAgIDB4MDQsIDB4MDQpOworCisJZG8geworCQkvKiBUaW1lIGZvciBGTEwgY2FsaWJyYXRpb24gdG8gY29tcGxldGUgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlsb2NrX2RldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18zKTsKKwkJcmV0cnkrKzsKKwl9IHdoaWxlICghKGxvY2tfZGV0ICYgMHgwMSkgJiYKKwkJIHJldHJ5IDw9IFdDRF9DUEVfRkxMX01BWF9SRVRSSUVTKTsKKworCWlmICghKGxvY2tfZGV0ICYgMHgwMSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGxvY2sgZGV0ZWN0IG5vdCBzZXQsIDB4JTAyeFxuIiwKKwkJCV9fZnVuY19fLCBsb2NrX2RldCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX2xvY2tfZGV0OworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9GTExfTU9ERSwKKwkJCSAgICAweDYwLCAweDIwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NGRywKKwkJCSAgICAweDA0LCAweDAwKTsKKwlyZXR1cm4gcmV0OworCitlcnJfbG9ja19kZXQ6CisJLyogVW5kbyB0aGUgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NGRywKKwkJCSAgICAweDA0LCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUsCisJCQkgICAgMHg4MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsCisJCQkgICAgMHgwMiwgMHgwMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkX2NudGxfY29uZmlnX2NwYXIoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwl1OCBub21fbG8sIG5vbV9oaSwgc3ZzMl9sbywgc3ZzMl9oaTsKKworCS8qIENvbmZpZ3VyZSBDUEFSICovCisJbm9tX2hpID0gc3ZzMl9oaSA9IDA7CisJaWYgKGNudGwtPmNsa19yYXRlID09IDk2MDAwMDApIHsKKwkJbm9tX2xvID0gMHg5MDsKKwkJc3ZzMl9sbyA9IDB4NTA7CisJfSBlbHNlIHsKKwkJbm9tX2xvID0gMHg3MDsKKwkJc3ZzMl9sbyA9IDB4M2U7CisJfQorCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0xPVywgbm9tX2xvKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fSElHSCwgbm9tX2hpKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9TVlNfU1ZTMl9MT1csIHN2czJfbG8pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0hJR0gsIHN2czJfaGkpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRUZMTF9DVEwsCisJCQkgICAgMHgwMywgMHgwMyk7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NudGxfY3BlX2ZsbF9jdHJsKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsCisJCQkJIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOworCWludCByZXQgPSAwOworCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSB3Y2RfY250bF9jcGVfZmxsX2NhbGlicmF0ZShjbnRsKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBjcGVfZmxsX2NhbCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBkb25lOworCQl9CisKKwkJd2NkX2NudGxfY29uZmlnX2NwYXIoY250bCk7CisKKwkJLyogRW5hYmxlIEFIQiBDTEsgYW5kIENQRSBDTEsqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEVfQ1RMLAorCQkJCSAgICAweDA1LCAweDA1KTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIEFIQiBDTEsgYW5kIENQRSBDTEsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BFX0NUTCwKKwkJCQkgICAgMHgwNSwgMHgwMCk7CisJCS8qIFJlc2V0IHRoZSBDUEFSIG1vZGUgZm9yIENQRSBGTEwgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfRkxMX0ZMTF9NT0RFLCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DRkcsCisJCQkJICAgIDB4MDQsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTCwKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9jbnRsX2Nsb2Nrc19lbmFibGUoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlpbnQgcmV0OworCisJV0NEX0NOVExfTVVURVhfTE9DSyhjb2RlYywgY250bC0+Y2xrX211dGV4KTsKKwkvKiBFbmFibGUgY29kZWMgY2xvY2sgKi8KKwlpZiAoY250bC0+Y2RjX2NiICYmIGNudGwtPmNkY19jYi0+Y2RjX2Nsa19lbikKKwkJcmV0ID0gY250bC0+Y2RjX2NiLT5jZGNfY2xrX2VuKGNvZGVjLCB0cnVlKTsKKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNkYyBjbGssIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDb25maWd1cmUgYW5kIEVuYWJsZSBDUEUgRkxMIGNsb2NrICovCisJcmV0ID0gd2NkX2NudGxfY3BlX2ZsbF9jdHJsKGNudGwsIHRydWUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBlbmFibGUgY3BlIGNsaywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY3BlX2NsazsKKwl9CisJY250bC0+aXNfY2xrX2VuYWJsZWQgPSB0cnVlOworCisJLyogVW5nYXRlIHRoZSBDUFIgY2xvY2sgICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUsIDB4MTAsIDB4MDApOworZG9uZToKKwlXQ0RfQ05UTF9NVVRFWF9VTkxPQ0soY29kZWMsIGNudGwtPmNsa19tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyX2NwZV9jbGs6CisJaWYgKGNudGwtPmNkY19jYiAmJiBjbnRsLT5jZGNfY2ItPmNkY19jbGtfZW4pCisJCWNudGwtPmNkY19jYi0+Y2RjX2Nsa19lbihjb2RlYywgZmFsc2UpOworCisJV0NEX0NOVExfTVVURVhfVU5MT0NLKGNvZGVjLCBjbnRsLT5jbGtfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NudGxfY2xvY2tzX2Rpc2FibGUoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCVdDRF9DTlRMX01VVEVYX0xPQ0soY29kZWMsIGNudGwtPmNsa19tdXRleCk7CisJaWYgKCFjbnRsLT5pc19jbGtfZW5hYmxlZCkgeworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IGNsb2NrcyBhbHJlYWR5IGRpc2FibGVkXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogR2F0ZSB0aGUgQ1BSIGNsb2NrICAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAweDEwLCAweDEwKTsKKworCS8qIERpc2FibGUgQ1BFIEZMTCBjbG9jayAqLworCXJldCA9IHdjZF9jbnRsX2NwZV9mbGxfY3RybChjbnRsLCBmYWxzZSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBkaXNhYmxlIGNwZSBjbGssIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkvKgorCSAqIEV2ZW4gaWYgQ1BFIEZMTCBkaXNhYmxlIGZhaWxlZCwgZ28gYWhlYWQgYW5kIGRpc2FibGUKKwkgKiB0aGUgY29kZWMgY2xvY2sKKwkgKi8KKwlpZiAoY250bC0+Y2RjX2NiICYmIGNudGwtPmNkY19jYi0+Y2RjX2Nsa19lbikKKwkJcmV0ID0gY250bC0+Y2RjX2NiLT5jZGNfY2xrX2VuKGNvZGVjLCBmYWxzZSk7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJY250bC0+aXNfY2xrX2VuYWJsZWQgPSBmYWxzZTsKK2RvbmU6CisJV0NEX0NOVExfTVVURVhfVU5MT0NLKGNvZGVjLCBjbnRsLT5jbGtfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbnRsX2NwYXJfY3RybChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOworCisJaWYgKGVuYWJsZSkKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsIDB4MDMpOworCWVsc2UKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsIDB4MDApOworfQorCitzdGF0aWMgaW50IHdjZF9jbnRsX2VuYWJsZV9tZW1vcnkoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKKwkJCQkgIGVudW0gd2NkX21lbV90eXBlIG1lbV90eXBlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJaW50IGxvb3BfY250ID0gMDsKKwl1OCBzdGF0dXM7CisJaW50IHJldCA9IDA7CisKKworCXN3aXRjaCAobWVtX3R5cGUpIHsKKworCWNhc2UgV0NEX01FTV9UWVBFX0FMV0FZU19PTjoKKworCQkvKiA1MTJLQiBvZiBhbHdheXMgb24gcmVnaW9uICovCisJCXdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQod2NkOXh4eCwKKwkJCQlXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLAorCQkJCUFSUkFZX1NJWkUobWVtX2VuYWJsZV92YWx1ZXMpLAorCQkJCW1lbV9lbmFibGVfdmFsdWVzKTsKKwkJd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdCh3Y2Q5eHh4LAorCQkJCVdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzEsCisJCQkJQVJSQVlfU0laRShtZW1fZW5hYmxlX3ZhbHVlcyksCisJCQkJbWVtX2VuYWJsZV92YWx1ZXMpOworCQlicmVhazsKKworCWNhc2UgV0NEX01FTV9UWVBFX1NXSVRDSEFCTEU6CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwKKwkJCQkgICAgMHgwNCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19NRU1fQ1RSTCwKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9DVEwsCisJCQkJICAgIDB4MDEsIDB4MDEpOworCQlkbyB7CisJCQlsb29wX2NudCsrOworCQkJLyogVGltZSB0byBlbmFibGUgdGhlIHBvd2VyIGRvbWFpbiBmb3IgbWVtb3J5ICovCisJCQl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOworCQkJc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCQlXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfQ1RMKTsKKwkJfSB3aGlsZSAoKHN0YXR1cyAmIDB4MDIpICE9IDB4MDIgJiYKKwkJCSAgbG9vcF9jbnQgIT0gV0NEX01FTV9FTkFCTEVfTUFYX1JFVFJJRVMpOworCisJCWlmICgoc3RhdHVzICYgMHgwMikgIT0gMHgwMikgeworCQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAorCQkJCSIlczogcG93ZXIgZG9tYWluIG5vdCBlbmFibGVkLCBzdGF0dXMgPSAweCUwMnhcbiIsCisJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyogUmVzdCBvZiB0aGUgbWVtb3J5ICovCisJCXdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQod2NkOXh4eCwKKwkJCQlXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8yLAorCQkJCUFSUkFZX1NJWkUobWVtX2VuYWJsZV92YWx1ZXMpLAorCQkJCW1lbV9lbmFibGVfdmFsdWVzKTsKKwkJd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdCh3Y2Q5eHh4LAorCQkJCVdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzMsCisJCQkJQVJSQVlfU0laRShtZW1fZW5hYmxlX3ZhbHVlcyksCisJCQkJbWVtX2VuYWJsZV92YWx1ZXMpOworCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sCisJCQkgICAgICAweDA1KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtZW1fdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBtZW1fdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KK2RvbmU6CisJLyogTWFrZSBzdXJlIERlZXAgc2xlZXAgb2YgbWVtb3JpZXMgaXMgZW5hYmxlZCBmb3IgYWxsIGJhbmtzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8wLCAweEZGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzEsIDB4MEYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkX2NudGxfZGlzYWJsZV9tZW1vcnkoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKKwkJCQkgICAgZW51bSB3Y2RfbWVtX3R5cGUgbWVtX3R5cGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7CisJdTggdmFsOworCisJc3dpdGNoIChtZW1fdHlwZSkgeworCWNhc2UgV0NEX01FTV9UWVBFX0FMV0FZU19PTjoKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMSwKKwkJCSAgICAgIDB4RkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLAorCQkJICAgICAgMHhGRik7CisJCWJyZWFrOworCWNhc2UgV0NEX01FTV9UWVBFX1NXSVRDSEFCTEU6CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzMsCisJCQkgICAgICAweEZGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMiwKKwkJCSAgICAgIDB4RkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLAorCQkJICAgICAgMHgwNyk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwKKwkJCQkgICAgMHgwMSwgMHgwMCk7CisJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCk7CisJCWlmICh2YWwgJiAweDAyKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIlczogRGlzYWJsZSBzd2l0Y2hhYmxlIGZhaWxlZCwgdmFsID0gMHglMDJ4IiwKKwkJCQlfX2Z1bmNfXywgdmFsKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1RFU1RfREVCVUdfTUVNX0NUUkwsCisJCQkJICAgIDB4ODAsIDB4MDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtZW1fdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBtZW1fdHlwZSk7CisJCWJyZWFrOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMCwgMHhGRik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8xLCAweDBGKTsKK30KKworc3RhdGljIHZvaWQgd2NkX2NudGxfZG9fc2h1dGRvd24oc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKworCS8qIERpc2FibGUgV0RPRyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1dET0dfQ0ZHLAorCQkJICAgIDB4M0YsIDB4MDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCSAgICAweDA0LCAweDAwKTsKKworCS8qIFB1dCBXRFNQIGluIHJlc2V0IHN0YXRlICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BFX0NUTCwKKwkJCSAgICAweDAyLCAweDAwKTsKKworCS8qIElmIERTUCB0cmFuc2l0aW9ucyBmcm9tIGJvb3QgdG8gc2h1dGRvd24sIHRoZW4gdm90ZSBmb3IgU1ZTICovCisJaWYgKGNudGwtPmlzX3dkc3BfYm9vdGVkKQorCQljbnRsLT5jZGNfY2ItPmNkY192b3RlX3N2cyhjb2RlYywgdHJ1ZSk7CisJY250bC0+aXNfd2RzcF9ib290ZWQgPSBmYWxzZTsKK30KKworc3RhdGljIGludCB3Y2RfY250bF9kb19ib290KHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIERlYnVnIG1vZGUgaXMgc2V0IGZyb20gZGVidWdmcyBmaWxlIG5vZGUuIElmIGRlYnVnX21vZGUKKwkgKiBpcyBzZXQsIHRoZW4gZG8gbm90IGNvbmZpZ3VyZSB0aGUgd2F0Y2hkb2cgdGltZXIuIFRoaXMKKwkgKiB3aWxsIGJlIHJlcXVpcmVkIGZvciBkZWJ1Z2dpbmcgdGhlIERTUCBmaXJtd2FyZS4KKwkgKi8KKwlpZiAoY250bC0+ZGVidWdfbW9kZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRywKKwkJCQkgICAgMHgzRiwgMHgwMSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCQkgICAgMHgwNCwgMHgwMCk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAorCQkJCSAgICAweDA0LCAweDA0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfV0RPR19DRkcsCisJCQkJICAgIDB4M0YsIDB4MjEpOworCX0KKworCS8qIE1ha2Ugc3VyZSBhbGwgdGhlIGVycm9yIGludGVycnVwdHMgYXJlIGNsZWFyZWQgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMEEsIDB4RkYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8wQiwgMHhGRik7CisKKwlyZWluaXRfY29tcGxldGlvbigmY250bC0+Ym9vdF9jb21wbGV0ZSk7CisKKwkvKiBSZW1vdmUgV0RTUCBvdXQgb2YgcmVzZXQgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEVfQ1RMLAorCQkJICAgIDB4MDIsIDB4MDIpOworCisJLyoKKwkgKiBJbiBkZWJ1ZyBtb2RlLCBEU1AgbWF5IG5vdCBib290IHVwIG5vcm1hbGx5LAorCSAqIHdhaXQgaW5kZWZpbml0ZWx5IGZvciBEU1AgdG8gYm9vdC4KKwkgKi8KKwlpZiAoY250bC0+ZGVidWdfbW9kZSkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjbnRsLT5ib290X2NvbXBsZXRlKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFdEU1AgYm9vdGVkIGluIGRiZyBtb2RlXG4iLCBfX2Z1bmNfXyk7CisJCWNudGwtPmlzX3dkc3BfYm9vdGVkID0gdHJ1ZTsKKwkJZ290byBkb25lOworCX0KKworCS8qIEJvb3QgaW4gbm9ybWFsIG1vZGUgKi8KKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNudGwtPmJvb3RfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyhXQ0RfRFNQX0JPT1RfVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBXRFNQIGJvb3QgdGltZWQgb3V0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycl9ib290OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlLWluaXRpYWxpemUgdGhlIHJldHVybiBjb2RlIHRvIDAsIGFzIGluIHN1Y2Nlc3MgY2FzZSwKKwkJICogaXQgd2lsbCBob2xkIHRoZSByZW1haW5pbmcgdGltZSBmb3IgY29tcGxldGlvbiB0aW1lb3V0CisJCSAqLworCQlyZXQgPSAwOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBXRFNQIGJvb3RlZCBpbiBub3JtYWwgbW9kZVxuIiwgX19mdW5jX18pOworCWNudGwtPmlzX3dkc3BfYm9vdGVkID0gdHJ1ZTsKKworCS8qIEVuYWJsZSBXRE9HICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfV0RPR19DRkcsCisJCQkgICAgMHgxMCwgMHgxMCk7Citkb25lOgorCS8qIElmIGRzcCBib290ZWQgdXAsIHRoZW4gcmVtb3ZlIHZvdGUgb24gU1ZTICovCisJaWYgKGNudGwtPmlzX3dkc3BfYm9vdGVkKQorCQljbnRsLT5jZGNfY2ItPmNkY192b3RlX3N2cyhjb2RlYywgZmFsc2UpOworCisJcmV0dXJuIHJldDsKK2Vycl9ib290OgorCS8qIGNhbGwgc2h1dGRvd24gdG8gcGVyZm9ybSBjbGVhbnVwICovCisJd2NkX2NudGxfZG9fc2h1dGRvd24oY250bCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHdjZF9jbnRsX2lwY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsID0gZGF0YTsKKwlpbnQgcmV0OworCisJY29tcGxldGUoJmNudGwtPmJvb3RfY29tcGxldGUpOworCisJaWYgKGNudGwtPm1fZGV2ICYmIGNudGwtPm1fb3BzICYmCisJICAgIGNudGwtPm1fb3BzLT5zaWduYWxfaGFuZGxlcikKKwkJcmV0ID0gY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKGNudGwtPm1fZGV2LCBXRFNQX0lQQzFfSU5UUiwKKwkJCQkJCSAgTlVMTCk7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBoYW5kbGUgaXJxICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHdjZF9jbnRsX2Vycl9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsID0gZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlzdHJ1Y3Qgd2RzcF9lcnJfc2lnbmFsX2FyZyBhcmc7CisJdTE2IHN0YXR1cyA9IDA7CisJdTggcmVnX3ZhbDsKKwlpbnQgcmV0ID0gMDsKKworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEEpOworCXN0YXR1cyA9IHN0YXR1cyB8IHJlZ192YWw7CisKKwlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBCKTsKKwlzdGF0dXMgPSBzdGF0dXMgfCAocmVnX3ZhbCA8PCA4KTsKKworCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogZXJyb3IgaW50ZXJydXB0IHN0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBzdGF0dXMpOworCisJaWYgKChzdGF0dXMgJiBjbnRsLT5pcnFzLmZhdGFsX2lycXMpICYmCisJICAgIChjbnRsLT5tX2RldiAmJiBjbnRsLT5tX29wcyAmJiBjbnRsLT5tX29wcy0+c2lnbmFsX2hhbmRsZXIpKSB7CisJCWFyZy5tZW1fZHVtcHNfZW5hYmxlZCA9IGNudGwtPnJhbWR1bXBfZW5hYmxlOworCQlhcmcucmVtb3RlX3N0YXJ0X2FkZHIgPSBXQ0RfOTM0WF9SQU1EVU1QX1NUQVJUX0FERFI7CisJCWFyZy5kdW1wX3NpemUgPSBXQ0RfOTM0WF9SQU1EVU1QX1NJWkU7CisJCXJldCA9IGNudGwtPm1fb3BzLT5zaWduYWxfaGFuZGxlcihjbnRsLT5tX2RldiwgV0RTUF9FUlJfSU5UUiwKKwkJCQkJCSAgJmFyZyk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBoYW5kbGUgZmF0YWwgaXJxIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHN0YXR1cyAmIGNudGwtPmlycXMuZmF0YWxfaXJxcyk7CisJCXdjZF9jbnRsX2NoYW5nZV9vbmxpbmVfc3RhdGUoY250bCwgMCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgc2lnbmFsX2hhbmRsZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHdjZF9jb250cm9sX2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEsCisJCQkgICAgICAgZW51bSB3ZHNwX2V2ZW50X3R5cGUgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHByaXZfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFdEU1BfRVZFTlRfUE9TVF9JTklUOgorCWNhc2UgV0RTUF9FVkVOVF9QT1NUX0RMT0FEX0NPREU6CisJY2FzZSBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRDoKKwljYXNlIFdEU1BfRVZFTlRfUE9TVF9TSFVURE9XTjoKKworCQlpZiAoZXZlbnQgPT0gV0RTUF9FVkVOVF9QT1NUX0RMT0FEX0NPREUpCisJCQkvKiBNYXJrIERTUCBvbmxpbmUgc2luY2UgY29kZSBkb3dubG9hZCBpcyBjb21wbGV0ZSAqLworCQkJd2NkX2NudGxfY2hhbmdlX29ubGluZV9zdGF0ZShjbnRsLCAxKTsKKworCQkvKiBEaXNhYmxlIENQQVIgKi8KKwkJd2NkX2NudGxfY3Bhcl9jdHJsKGNudGwsIGZhbHNlKTsKKwkJLyogRGlzYWJsZSBhbGwgdGhlIGNsb2NrcyAqLworCQlyZXQgPSB3Y2RfY250bF9jbG9ja3NfZGlzYWJsZShjbnRsKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIGRpc2FibGUgY2xvY2tzLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisKKwljYXNlIFdEU1BfRVZFTlRfUFJFX0RMT0FEX0RBVEE6CisJY2FzZSBXRFNQX0VWRU5UX1BSRV9ETE9BRF9DT0RFOgorCisJCS8qIEVuYWJsZSBhbGwgdGhlIGNsb2NrcyAqLworCQlyZXQgPSB3Y2RfY250bF9jbG9ja3NfZW5hYmxlKGNudGwpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBlbmFibGUgY2xvY2tzLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIEVuYWJsZSBDUEFSICovCisJCXdjZF9jbnRsX2NwYXJfY3RybChjbnRsLCB0cnVlKTsKKworCQlpZiAoZXZlbnQgPT0gV0RTUF9FVkVOVF9QUkVfRExPQURfQ09ERSkKKwkJCXdjZF9jbnRsX2VuYWJsZV9tZW1vcnkoY250bCwgV0NEX01FTV9UWVBFX0FMV0FZU19PTik7CisJCWVsc2UgaWYgKGV2ZW50ID09IFdEU1BfRVZFTlRfUFJFX0RMT0FEX0RBVEEpCisJCQl3Y2RfY250bF9lbmFibGVfbWVtb3J5KGNudGwsIFdDRF9NRU1fVFlQRV9TV0lUQ0hBQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIFdEU1BfRVZFTlRfRE9fQk9PVDoKKworCQlyZXQgPSB3Y2RfY250bF9kb19ib290KGNudGwpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBXRFNQIGJvb3QgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisKKwljYXNlIFdEU1BfRVZFTlRfRE9fU0hVVERPV046CisKKwkJd2NkX2NudGxfZG9fc2h1dGRvd24oY250bCk7CisJCXdjZF9jbnRsX2Rpc2FibGVfbWVtb3J5KGNudGwsIFdDRF9NRU1fVFlQRV9TV0lUQ0hBQkxFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdW5oYW5kbGVkIGV2ZW50ICVkXG4iLAorCQkJX19mdW5jX18sIGV2ZW50KTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY250bF9zeXNmc19pbml0KGNoYXIgKmRpciwgc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjbnRsLT53Y2Rfa29iaiwgJndjZF9jbnRsX2t0eXBlLAorCQkJCSAgIGtlcm5lbF9rb2JqLCBkaXIpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBhZGQga29iamVjdCAlcywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGlyLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNudGwtPndjZF9rb2JqLCAmY250bF9hdHRyX2Jvb3QuYXR0cik7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGFkZCB3ZHNwX2Jvb3Qgc3lzZnMgZW50cnkgdG8gJXNcbiIsCisJCQlfX2Z1bmNfXywgZGlyKTsKKwkJZ290byBmYWlsX2NyZWF0ZV9maWxlOworCX0KKworCXJldHVybiByZXQ7CisKK2ZhaWxfY3JlYXRlX2ZpbGU6CisJa29iamVjdF9wdXQoJmNudGwtPndjZF9rb2JqKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkX2NudGxfc3lzZnNfcmVtb3ZlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCit7CisJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNudGwtPndjZF9rb2JqLCAmY250bF9hdHRyX2Jvb3QuYXR0cik7CisJa29iamVjdF9wdXQoJmNudGwtPndjZF9rb2JqKTsKK30KKworc3RhdGljIHZvaWQgd2NkX2NudGxfZGVidWdmc19pbml0KGNoYXIgKmRpciwgc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKworCWNudGwtPmVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKGRpciwgTlVMTCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRpcikpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgZGVidWdmc19jcmVhdGVfZGlyIGZhaWxlZCBmb3IgJXNcbiIsCisJCQlfX2Z1bmNfXywgZGlyKTsKKwkJZ290byBkb25lOworCX0KKworCWRlYnVnZnNfY3JlYXRlX3UzMigiZGVidWdfbW9kZSIsIDA2NDQsCisJCQkgICBjbnRsLT5lbnRyeSwgJmNudGwtPmRlYnVnX21vZGUpOworCWRlYnVnZnNfY3JlYXRlX2Jvb2woInJhbWR1bXBfZW5hYmxlIiwgMDY0NCwKKwkJCSAgICBjbnRsLT5lbnRyeSwgJmNudGwtPnJhbWR1bXBfZW5hYmxlKTsKK2RvbmU6CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3Y2RfY250bF9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsKQoreworCWlmIChjbnRsKQorCQlkZWJ1Z2ZzX3JlbW92ZShjbnRsLT5lbnRyeSk7Cit9CisKK3N0YXRpYyBpbnQgd2NkX21pc2NkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IGNvbnRhaW5lcl9vZihmaWxlcC0+cHJpdmF0ZV9kYXRhLAorCQkJCQkJIHN0cnVjdCB3Y2RfZHNwX2NudGwsIG1pc2NkZXYpOworCWlmICghY250bC0+bV9kZXYgfHwgIWNudGwtPm1fb3BzIHx8CisJICAgICFjbnRsLT5tX29wcy0+dm90ZV9mb3JfZHNwKSB7CisJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKKwkJCSIlczogRFNQIG5vdCByZWFkeSB0byBib290XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgRFNQIHVzZXJzIGdvZXMgdG8gemVybyB1cG9uIGNsb3NpbmcgZGV2IG5vZGUgKi8KKwl3aGlsZSAoY250bC0+Ym9vdF9yZXFzID4gMCkgeworCQljbnRsLT5tX29wcy0+dm90ZV9mb3JfZHNwKGNudGwtPm1fZGV2LCBmYWxzZSk7CisJCWNudGwtPmJvb3RfcmVxcy0tOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3Y2RfbWlzY2Rldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwgPSBjb250YWluZXJfb2YoZmlsZXAtPnByaXZhdGVfZGF0YSwKKwkJCQkJCSBzdHJ1Y3Qgd2NkX2RzcF9jbnRsLCBtaXNjZGV2KTsKKwljaGFyIHZhbFtjb3VudF07CisJYm9vbCB2b3RlOworCWludCByZXQgPSAwOworCisJaWYgKGNvdW50ID09IDAgfHwgY291bnQgPiAyKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY291bnQgPSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcih2YWwsIHVidWYsIGNvdW50KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAorCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAodmFsWzBdID09ICcxJykgeworCQljbnRsLT5ib290X3JlcXMrKzsKKwkJdm90ZSA9IHRydWU7CisJfSBlbHNlIGlmICh2YWxbMF0gPT0gJzAnKSB7CisJCWlmIChjbnRsLT5ib290X3JlcXMgPT0gMCkgeworCQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAorCQkJCSIlczogV0RTUCBhbHJlYWR5IGRpc2FibGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisJCWNudGwtPmJvb3RfcmVxcy0tOworCQl2b3RlID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgdmFsdWUgJXNcbiIsCisJCQlfX2Z1bmNfXywgdmFsKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRldl9kYmcoY250bC0+Y29kZWMtPmRldiwKKwkJIiVzOiBib290ZWQgPSAlcywgcmVmX2NudCA9ICVkLCB2b3RlID0gJXNcbiIsCisJCV9fZnVuY19fLCBjbnRsLT5pc193ZHNwX2Jvb3RlZCA/ICJ0cnVlIiA6ICJmYWxzZSIsCisJCWNudGwtPmJvb3RfcmVxcywgdm90ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisJaWYgKGNudGwtPm1fZGV2ICYmIGNudGwtPm1fb3BzICYmCisJICAgIGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3ApCisJCXJldCA9IGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3AoY250bC0+bV9kZXYsIHZvdGUpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKK2RvbmU6CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2NkX21pc2NkZXZfZm9wcyA9IHsKKwkud3JpdGUgPSB3Y2RfbWlzY2Rldl93cml0ZSwKKwkucmVsZWFzZSA9IHdjZF9taXNjZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHdjZF9jbnRsX21pc2NkZXZfY3JlYXRlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCit7CisJc25wcmludGYoY250bC0+bWlzY2Rldl9uYW1lLCBBUlJBWV9TSVpFKGNudGwtPm1pc2NkZXZfbmFtZSksCisJCSJ3Y2RfZHNwJXVfY29udHJvbCIsIGNudGwtPmRzcF9pbnN0YW5jZSk7CisJY250bC0+bWlzY2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKwljbnRsLT5taXNjZGV2Lm5hbWUgPSBjbnRsLT5taXNjZGV2X25hbWU7CisJY250bC0+bWlzY2Rldi5mb3BzID0gJndjZF9taXNjZGV2X2ZvcHM7CisJY250bC0+bWlzY2Rldi5wYXJlbnQgPSBjbnRsLT5jb2RlYy0+ZGV2OworCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmNudGwtPm1pc2NkZXYpOworfQorCitzdGF0aWMgdm9pZCB3Y2RfY250bF9taXNjZGV2X2Rlc3Ryb3koc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmNudGwtPm1pc2NkZXYpOworfQorCitzdGF0aWMgaW50IHdjZF9jb250cm9sX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHByaXZfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCWludCByZXQ7CisJYm9vbCBlcnJfaXJxX3JlcXVlc3RlZCA9IGZhbHNlOworCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywKKwkJCQkgIGNudGwtPmlycXMuY3BlX2lwYzFfaXJxLAorCQkJCSAgd2NkX2NudGxfaXBjX2lycSwgIkNQRSBJUEMxIiwKKwkJCQkgIGNudGwpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNwZSBpcGMgaXJxLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVW5tYXNrIHRoZSBmYXRhbCBpcnFzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEsCisJCSAgICAgIH4oY250bC0+aXJxcy5mYXRhbF9pcnFzICYgMHhGRikpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCLAorCQkgICAgICB+KChjbnRsLT5pcnFzLmZhdGFsX2lycXMgPj4gOCkgJiAweEZGKSk7CisKKwkvKgorCSAqIENQRSBFUlIgaXJxIGlzIHVzZWQgb25seSBmb3IgZXJyb3IgcmVwb3J0aW5nIGZyb20gV0NEIERTUCwKKwkgKiBldmVuIGlmIHRoaXMgcmVxdWVzdCBmYWlscywgRFNQIGNhbiBiZSBmdW5jdGlvbiBub3JtYWxseS4KKwkgKiBDb250aW51aW5nIHdpdGggaW5pdCBldmVuIGlmIHRoZSBDUEUgRVJSIGlycSByZXF1ZXN0IGZhaWxzLgorCSAqLworCWlmICh3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBjbnRsLT5pcnFzLmNwZV9lcnJfaXJxLAorCQkJCXdjZF9jbnRsX2Vycl9pcnEsICJDUEUgRVJSIiwgY250bCkpCisJCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHJlcXVlc3RfaXJxKGNwZV9lcnJfaXJxKSIsCisJCQlfX2Z1bmNfXyk7CisJZWxzZQorCQllcnJfaXJxX3JlcXVlc3RlZCA9IHRydWU7CisKKworCS8qIEVuYWJsZSBhbGwgdGhlIGNsb2NrcyAqLworCXJldCA9IHdjZF9jbnRsX2Nsb2Nrc19lbmFibGUoY250bCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNsb2NrcywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY2xrX2VuYWJsZTsKKwl9CisJd2NkX2NudGxfY3Bhcl9jdHJsKGNudGwsIHRydWUpOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGtfZW5hYmxlOgorCS8qIE1hc2sgYWxsIGVycm9yIGludGVycnVwdHMgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQSwgMHhGRik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEIsIDB4RkYpOworCisJLyogRnJlZSB0aGUgaXJxJ3MgcmVxdWVzdGVkICovCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgY250bC0+aXJxcy5jcGVfaXBjMV9pcnEsIGNudGwpOworCisJaWYgKGVycl9pcnFfcmVxdWVzdGVkKQorCQl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBjbnRsLT5pcnFzLmNwZV9lcnJfaXJxLCBjbnRsKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY29udHJvbF9kZWluaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHByaXZfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCisJd2NkX2NudGxfY2xvY2tzX2Rpc2FibGUoY250bCk7CisJd2NkX2NudGxfY3Bhcl9jdHJsKGNudGwsIGZhbHNlKTsKKworCS8qIE1hc2sgYWxsIGVycm9yIGludGVycnVwdHMgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQSwgMHhGRik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEIsIDB4RkYpOworCisJLyogRnJlZSB0aGUgaXJxJ3MgcmVxdWVzdGVkICovCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgY250bC0+aXJxcy5jcGVfZXJyX2lycSwgY250bCk7CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgY250bC0+aXJxcy5jcGVfaXBjMV9pcnEsIGNudGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2RzcF9jbXBudF9vcHMgY29udHJvbF9vcHMgPSB7CisJLmluaXQgPSB3Y2RfY29udHJvbF9pbml0LAorCS5kZWluaXQgPSB3Y2RfY29udHJvbF9kZWluaXQsCisJLmV2ZW50X2hhbmRsZXIgPSB3Y2RfY29udHJvbF9oYW5kbGVyLAorfTsKKworc3RhdGljIGludCB3Y2RfY3RybF9jb21wb25lbnRfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZSAqbWFzdGVyLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY250bDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CisJY2hhciBwcm9jX25hbWVbV0NEX1BST0NGU19FTlRSWV9NQVhfTEVOXTsKKwljaGFyIHdjZF9jbnRsX2Rpcl9uYW1lW1dDRF9DTlRMX0RJUl9OQU1FX0xFTl9NQVhdOworCWludCByZXQgPSAwOworCisJaWYgKCFkZXYgfHwgIW1hc3RlciB8fCAhZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY250bCA9IHRhdmlsX2dldF93Y2RfZHNwX2NudGwoZGV2KTsKKwlpZiAoIWNudGwpIHsKKwkJZGV2X2VycihkZXYsICIlczogRmFpbGVkIHRvIGdldCBjbnRsIHJlZmVyZW5jZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY250bC0+bV9kZXYgPSBtYXN0ZXI7CisJY250bC0+bV9vcHMgPSBkYXRhOworCisJaWYgKCFjbnRsLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGludmFsaWQgbWFzdGVyIGNhbGxiYWNrIHJlZ2lzdGVyX2NtcG50X29wc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNudGwtPm1fb3BzLT5yZWdpc3Rlcl9jbXBudF9vcHMobWFzdGVyLCBkZXYsIGNudGwsICZjb250cm9sX29wcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiByZWdpc3Rlcl9jbXBudF9vcHMgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2NkX2NudGxfbWlzY2Rldl9jcmVhdGUoY250bCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IG1pc2MgZGV2IHJlZ2lzdGVyIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXNucHJpbnRmKHdjZF9jbnRsX2Rpcl9uYW1lLCBXQ0RfQ05UTF9ESVJfTkFNRV9MRU5fTUFYLAorCQkgIiVzJWQiLCAid2RzcCIsIGNudGwtPmRzcF9pbnN0YW5jZSk7CisJcmV0ID0gd2NkX2NudGxfc3lzZnNfaW5pdCh3Y2RfY250bF9kaXJfbmFtZSwgY250bCk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHN5c2ZzX2luaXQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9zeXNmc19pbml0OworCX0KKworCXdjZF9jbnRsX2RlYnVnZnNfaW5pdCh3Y2RfY250bF9kaXJfbmFtZSwgY250bCk7CisKKwljb2RlYyA9IGNudGwtPmNvZGVjOworCWNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQtPnNuZF9jYXJkOworCXNucHJpbnRmKHByb2NfbmFtZSwgV0NEX1BST0NGU19FTlRSWV9NQVhfTEVOLCAiJXMlZCVzIiwgImNwZSIsCisJCSBjbnRsLT5kc3BfaW5zdGFuY2UsICJfc3RhdGUiKTsKKwllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsIHByb2NfbmFtZSwgY2FyZC0+cHJvY19yb290KTsKKwlpZiAoIWVudHJ5KSB7CisJCS8qIERvIG5vdCB0cmVhdCB0aGlzIGFzIEZhdGFsIGVycm9yICovCisJCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBjcmVhdGUgcHJvY2ZzIGVudHJ5ICVzXG4iLAorCQkJX19mdW5jX18sIHByb2NfbmFtZSk7CisJCWdvdG8gZXJyX3N5c2ZzX2luaXQ7CisJfQorCisJY250bC0+c3NyX2VudHJ5LmVudHJ5ID0gZW50cnk7CisJY250bC0+c3NyX2VudHJ5Lm9mZmxpbmUgPSAxOworCWVudHJ5LT5zaXplID0gV0NEX1BST0NGU19FTlRSWV9NQVhfTEVOOworCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CisJZW50cnktPmMub3BzID0gJndkc3Bfc3NyX2VudHJ5X29wczsKKwllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY250bDsKKwlyZXQgPSBzbmRfaW5mb19yZWdpc3RlcihlbnRyeSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byByZWdpc3RlciBlbnRyeSAlcywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcHJvY19uYW1lLCByZXQpOworCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKKwkJLyogTGV0IGJpbmQgc3RpbGwgaGFwcGVuIGV2ZW4gaWYgY3JlYXRpbmcgdGhlIGVudHJ5IGZhaWxlZCAqLworCQlyZXQgPSAwOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKKworZXJyX3N5c2ZzX2luaXQ6CisJd2NkX2NudGxfbWlzY2Rldl9kZXN0cm95KGNudGwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jdHJsX2NvbXBvbmVudF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKKwkJCQkgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGw7CisKKwlpZiAoIWRldikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRldmljZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY250bCA9IHRhdmlsX2dldF93Y2RfZHNwX2NudGwoZGV2KTsKKwlpZiAoIWNudGwpIHsKKwkJZGV2X2VycihkZXYsICIlczogRmFpbGVkIHRvIGdldCBjbnRsIHJlZmVyZW5jZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNudGwtPm1fZGV2ID0gTlVMTDsKKwljbnRsLT5tX29wcyA9IE5VTEw7CisKKwkvKiBSZW1vdmUgdGhlIHN5c2ZzIGVudHJpZXMgKi8KKwl3Y2RfY250bF9zeXNmc19yZW1vdmUoY250bCk7CisKKwkvKiBSZW1vdmUgdGhlIGRlYnVnZnMgZW50cmllcyAqLworCXdjZF9jbnRsX2RlYnVnZnNfcmVtb3ZlKGNudGwpOworCisJLyogUmVtb3ZlIHRoZSBtaXNjIGRldmljZSAqLworCXdjZF9jbnRsX21pc2NkZXZfZGVzdHJveShjbnRsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIHdjZF9jdHJsX2NvbXBvbmVudF9vcHMgPSB7CisJLmJpbmQgPSB3Y2RfY3RybF9jb21wb25lbnRfYmluZCwKKwkudW5iaW5kID0gd2NkX2N0cmxfY29tcG9uZW50X3VuYmluZCwKK307CisKKy8qCisgKiB3Y2RfZHNwX3Nzcl9ldmVudDogaGFuZGxlIHRoZSBTU1IgZXZlbnQgcmFpc2VkIGJ5IGNhbGxlci4KKyAqIEBjbnRsOiBIYW5kbGUgdG8gdGhlIHdjZF9kc3BfY250bCBzdHJ1Y3R1cmUKKyAqIEBldmVudDogVGhlIFNTUiBldmVudCB0byBiZSBoYW5kbGVkCisgKgorICogTm90aWZpZXMgdGhlIG1hbmFnZXIgZHJpdmVyIGFib3V0IHRoZSBTU1IgZXZlbnQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAqLworaW50IHdjZF9kc3Bfc3NyX2V2ZW50KHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsIGVudW0gY2RjX3Nzcl9ldmVudCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY250bCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBjb250cm9sXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY250bC0+bV9kZXYgfHwgIWNudGwtPm1fb3BzIHx8ICFjbnRsLT5tX29wcy0+c2lnbmFsX2hhbmRsZXIpIHsKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHNpZ25hbF9oYW5kbGVyIGNhbGxiYWNrXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFdDRF9DRENfRE9XTl9FVkVOVDoKKwkJcmV0ID0gY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKGNudGwtPm1fZGV2LAorCQkJCQkJICBXRFNQX0NEQ19ET1dOX1NJR05BTCwKKwkJCQkJCSAgTlVMTCk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKKwkJCQkiJXM6IFdEU1BfQ0RDX0RPV05fU0lHTkFMIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXdjZF9jbnRsX2NoYW5nZV9vbmxpbmVfc3RhdGUoY250bCwgMCk7CisJCWJyZWFrOworCWNhc2UgV0NEX0NEQ19VUF9FVkVOVDoKKwkJcmV0ID0gY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKGNudGwtPm1fZGV2LAorCQkJCQkJICBXRFNQX0NEQ19VUF9TSUdOQUwsCisJCQkJCQkgIE5VTEwpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCisJCQkJIiVzOiBXRFNQX0NEQ19VUF9TSUdOQUwgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZXZlbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2RfZHNwX3Nzcl9ldmVudCk7CisKKy8qCisgKiB3Y2RfZHNwX2NudGxfaW5pdDogSW5pdGlhbGl6ZSB0aGUgd2NkLWRzcCBjb250cm9sCisgKiBAY29kZWM6IHBvaW50ZXIgdG8gdGhlIGNvZGVjIGhhbmRsZQorICogQHBhcmFtczogUGFyYW1ldGVycyByZXF1aXJlZCB0byBpbml0aWFsaXplIHdjZC1kc3AgY29udHJvbAorICoKKyAqIFRoaXMgQVBJIGlzIGV4cGVjdGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIGNvZGVjIGRyaXZlciBhbmQKKyAqIHByb3ZpZGUgaW5mb3JtYXRpb24gZXNzZW50aWFsIGZvciB0aGUgd2NkIGRzcCBjb250cm9sIHRvCisgKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgdGhlIGRzcAorICovCit2b2lkIHdjZF9kc3BfY250bF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJICAgICAgIHN0cnVjdCB3Y2RfZHNwX3BhcmFtcyAqcGFyYW1zLAorCQkgICAgICAgc3RydWN0IHdjZF9kc3BfY250bCAqKmNudGwpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY29udHJvbDsKKwlpbnQgcmV0OworCisJaWYgKCFjb2RlYyB8fCAhcGFyYW1zKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvICVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICghY29kZWMpID8gImNvZGVjIiA6ICJwYXJhbXMiKTsKKwkJKmNudGwgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJaWYgKCpjbnRsKSB7CisJCXByX2VycigiJXM6IGNudGwgaXMgbm9uIE5VTEwsIG1heWJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgP1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghcGFyYW1zLT5jYiB8fCAhcGFyYW1zLT5jYi0+Y2RjX2Nsa19lbiB8fAorCSAgICAhcGFyYW1zLT5jYi0+Y2RjX3ZvdGVfc3ZzKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogY2xrX2VuIGFuZCB2b3RlX3N2cyBjYWxsYmFja3MgbXVzdCBiZSBwcm92aWRlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRyb2wgPSBremFsbG9jKHNpemVvZigqY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghKGNvbnRyb2wpKQorCQlyZXR1cm47CisKKwljb250cm9sLT5jb2RlYyA9IGNvZGVjOworCWNvbnRyb2wtPmNsa19yYXRlID0gcGFyYW1zLT5jbGtfcmF0ZTsKKwljb250cm9sLT5jZGNfY2IgPSBwYXJhbXMtPmNiOworCWNvbnRyb2wtPmRzcF9pbnN0YW5jZSA9IHBhcmFtcy0+ZHNwX2luc3RhbmNlOworCW1lbWNweSgmY29udHJvbC0+aXJxcywgJnBhcmFtcy0+aXJxcywgc2l6ZW9mKGNvbnRyb2wtPmlycXMpKTsKKwlpbml0X2NvbXBsZXRpb24oJmNvbnRyb2wtPmJvb3RfY29tcGxldGUpOworCW11dGV4X2luaXQoJmNvbnRyb2wtPmNsa19tdXRleCk7CisJbXV0ZXhfaW5pdCgmY29udHJvbC0+c3NyX211dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb250cm9sLT5zc3JfZW50cnkub2ZmbGluZV9wb2xsX3dhaXQpOworCisJLyoKKwkgKiBUaGUgZGVmYXVsdCBzdGF0ZSBvZiBXRFNQIGlzIGluIFNWUyBtb2RlLgorCSAqIFZvdGUgZm9yIFNWUyBub3csIHRoZSB2b3RlIHdpbGwgYmUgcmVtb3ZlZCBvbmx5CisJICogYWZ0ZXIgRFNQIGlzIGJvb3RlZCB1cC4KKwkgKi8KKwljb250cm9sLT5jZGNfY2ItPmNkY192b3RlX3N2cyhjb2RlYywgdHJ1ZSk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50IG5lZWRlZCBieSBtYXN0ZXIgdG8gYmUgcmVhZHksCisJICogdGhlbiBjb21wb25lbnRfYmluZCB3aWxsIGJlIGNhbGxlZCB3aXRoaW4gdGhlIGNvbXBvbmVudF9hZGQuCisJICogSGVuY2UsIHRoZSBkYXRhIHBvaW50ZXIgc2hvdWxkIGJlIGFzc2lnbmVkIGJlZm9yZSBjb21wb25lbnRfYWRkLAorCSAqIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkdXJpbmcgdGhpcyBjb21wb25lbnQncyBiaW5kIGNhbGwuCisJICovCisJKmNudGwgPSBjb250cm9sOworCXJldCA9IGNvbXBvbmVudF9hZGQoY29kZWMtPmRldiwgJndjZF9jdHJsX2NvbXBvbmVudF9vcHMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNvbXBvbmVudF9hZGQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlrZnJlZSgqY250bCk7CisJCSpjbnRsID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9kc3BfY250bF9pbml0KTsKKworLyoKKyAqIHdjZF9kc3BfY250bF9kZWluaXQ6IERlLWluaXRpYWxpemUgdGhlIHdjZC1kc3AgY29udHJvbAorICogQGNudGw6IFRoZSBzdHJ1Y3Qgd2NkX2RzcF9jbnRsIHRvIGRlLWluaXRpYWxpemUKKyAqCisgKiBUaGlzIEFQSSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IHRoZSBjb2RlYyBkcml2ZXIKKyAqIHRvIGRlLWluaXRpYWxpemUgdGhlIHdjZCBkc3AgY29udHJvbAorICovCit2b2lkIHdjZF9kc3BfY250bF9kZWluaXQoc3RydWN0IHdjZF9kc3BfY250bCAqKmNudGwpCit7CisJc3RydWN0IHdjZF9kc3BfY250bCAqY29udHJvbCA9ICpjbnRsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCS8qIElmIGNvbnRyb2wgaXMgTlVMTCwgdGhlcmUgaXMgbm90aGluZyB0byBkZS1pbml0aWFsaXplICovCisJaWYgKCFjb250cm9sKQorCQlyZXR1cm47CisJY29kZWMgPSBjb250cm9sLT5jb2RlYzsKKworCS8qCisJICogQ2FsbGluZyBzaHV0ZG93biB3aWxsIGNsZWFudXAgYWxsIHJlZ2lzdGVyIHN0YXRlcywKKwkgKiBpcnJlc3BlY3RpdmUgb2YgRFNQIHdhcyBib290ZWQgdXAgb3Igbm90LgorCSAqLworCXdjZF9jbnRsX2RvX3NodXRkb3duKGNvbnRyb2wpOworCXdjZF9jbnRsX2Rpc2FibGVfbWVtb3J5KGNvbnRyb2wsIFdDRF9NRU1fVFlQRV9TV0lUQ0hBQkxFKTsKKwl3Y2RfY250bF9kaXNhYmxlX21lbW9yeShjb250cm9sLCBXQ0RfTUVNX1RZUEVfQUxXQVlTX09OKTsKKworCWNvbXBvbmVudF9kZWwoY29kZWMtPmRldiwgJndjZF9jdHJsX2NvbXBvbmVudF9vcHMpOworCisJbXV0ZXhfZGVzdHJveSgmY29udHJvbC0+Y2xrX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZjb250cm9sLT5zc3JfbXV0ZXgpOworCWtmcmVlKCpjbnRsKTsKKwkqY250bCA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9kc3BfY250bF9kZWluaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNwLWNudGwuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzcC1jbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzNDYzOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzcC1jbnRsLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1dDRDkzNFhfRFNQX0NOVExfSF9fCisjZGVmaW5lIF9fV0NEOTM0WF9EU1BfQ05UTF9IX18KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3djZC1kc3AtbWdyLmg+CisKK2VudW0gY2RjX3Nzcl9ldmVudCB7CisJV0NEX0NEQ19ET1dOX0VWRU5ULAorCVdDRF9DRENfVVBfRVZFTlQsCit9OworCitzdHJ1Y3Qgd2NkX2RzcF9jZGNfY2IgeworCS8qIENhbGxiYWNrIHRvIGVuYWJsZSBjb2RlYyBjbG9jayAqLworCWludCAoKmNkY19jbGtfZW4pKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOworCS8qIENhbGxiYWNrIHRvIHZvdGUgYW5kIHVudm90ZSBmb3IgU1ZTMiBtb2RlICovCisJdm9pZCAoKmNkY192b3RlX3N2cykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Cit9OworCitzdHJ1Y3Qgd2NkX2RzcF9pcnFfaW5mbyB7CisJLyogSVBDIGludGVycnVwdCAqLworCWludCBjcGVfaXBjMV9pcnE7CisKKwkvKiBDUEUgZXJyb3Igc3VtbWFyeSBpbnRlcnJ1cHQgKi8KKwlpbnQgY3BlX2Vycl9pcnE7CisKKwkvKgorCSAqIEJpdCBtYXNrIHRvIGluZGljYXRlIHdoaWNoIG9mIHRoZQorCSAqIGVycm9yIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQKKwkgKiBhcyBmYXRhbC4KKwkgKi8KKwl1MTYgZmF0YWxfaXJxczsKK307CisKK3N0cnVjdCB3Y2RfZHNwX3BhcmFtcyB7CisJc3RydWN0IHdjZF9kc3BfY2RjX2NiICpjYjsKKwlzdHJ1Y3Qgd2NkX2RzcF9pcnFfaW5mbyBpcnFzOworCisJLyogUmF0ZSBhdCB3aGljaCB0aGUgY29kZWMgY2xvY2sgb3BlcmF0ZXMgKi8KKwl1MzIgY2xrX3JhdGU7CisKKwkvKgorCSAqIFJlcHJlc2VudHMgdGhlIGRzcCBpbnN0YW5jZSwgd2lsbCBiZSB1c2VkCisJICogdG8gY3JlYXRlIHN5c2ZzIGFuZCBkZWJ1Z2ZzIGVudHJpZXMgd2l0aAorCSAqIGRpcmVjdG9yeSB3ZHNwPGRzcC1pbnN0YW5jZT4KKwkgKi8KKwl1MzIgZHNwX2luc3RhbmNlOworfTsKKworc3RydWN0IHdkc3Bfc3NyX2VudHJ5IHsKKwl1OCBvZmZsaW5lOworCXU4IG9mZmxpbmVfY2hhbmdlOworCXdhaXRfcXVldWVfaGVhZF90IG9mZmxpbmVfcG9sbF93YWl0OworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Cit9OworCitzdHJ1Y3Qgd2NkX2RzcF9jbnRsIHsKKwkvKiBIYW5kbGUgdG8gY29kZWMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwkvKiBDbGsgcmF0ZSBvZiB0aGUgY29kZWMgY2xvY2sgKi8KKwl1MzIgY2xrX3JhdGU7CisKKwkvKiBDYWxsYmFja3MgdG8gY29kZWMgZHJpdmVyICovCisJY29uc3Qgc3RydWN0IHdjZF9kc3BfY2RjX2NiICpjZGNfY2I7CisKKwkvKiBDb21wbGV0aW9uIHRvIGluZGljYXRlIFdEU1AgYm9vdCBkb25lICovCisJc3RydWN0IGNvbXBsZXRpb24gYm9vdF9jb21wbGV0ZTsKKworCXN0cnVjdCB3Y2RfZHNwX2lycV9pbmZvIGlycXM7CisJdTMyIGRzcF9pbnN0YW5jZTsKKworCS8qIFN5c2ZzIGVudHJpZXMgcmVsYXRlZCAqLworCWludCBib290X3JlcXM7CisJc3RydWN0IGtvYmplY3Qgd2NkX2tvYmo7CisKKwkvKiBEZWJ1Z2ZzIHJlbGF0ZWQgKi8KKwlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKKwl1MzIgZGVidWdfbW9kZTsKKwlib29sIHJhbWR1bXBfZW5hYmxlOworCisJLyogV0RTUCBtYW5hZ2VyIGRyaXZlcnMgZGF0YSAqLworCXN0cnVjdCBkZXZpY2UgKm1fZGV2OworCXN0cnVjdCB3ZHNwX21ncl9vcHMgKm1fb3BzOworCisJLyogY2xrIHJlbGF0ZWQgKi8KKwlzdHJ1Y3QgbXV0ZXggY2xrX211dGV4OworCWJvb2wgaXNfY2xrX2VuYWJsZWQ7CisKKwkvKiBLZWVwIHRyYWNrIG9mIFdEU1AgYm9vdCBzdGF0dXMgKi8KKwlib29sIGlzX3dkc3BfYm9vdGVkOworCisJLyogU1NSIHJlbGF0ZWQgKi8KKwlzdHJ1Y3Qgd2RzcF9zc3JfZW50cnkgc3NyX2VudHJ5OworCXN0cnVjdCBtdXRleCBzc3JfbXV0ZXg7CisKKwkvKiBNaXNjIGRldmljZSByZWxhdGVkICovCisJY2hhciBtaXNjZGV2X25hbWVbMjU2XTsKKwlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2OworfTsKKwordm9pZCB3Y2RfZHNwX2NudGxfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCSAgICAgICBzdHJ1Y3Qgd2NkX2RzcF9wYXJhbXMgKnBhcmFtcywKKwkJICAgICAgIHN0cnVjdCB3Y2RfZHNwX2NudGwgKipjbnRsKTsKK3ZvaWQgd2NkX2RzcF9jbnRsX2RlaW5pdChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICoqY250bCk7CitpbnQgd2NkX2RzcF9zc3JfZXZlbnQoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwgZW51bSBjZGNfc3NyX2V2ZW50IGV2ZW50KTsKKyNlbmRpZiAvKiBlbmQgX19XQ0RfRFNQX0NPTlRST0xfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiZGI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LW1iaGMuYwpAQCAtMCwwICsxLDEwNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5MzR4L3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSAid2NkOTM0eC5oIgorI2luY2x1ZGUgIndjZDkzNHgtbWJoYy5oIgorI2luY2x1ZGUgIi4uL3djZGNhbC1od2RlcC5oIgorCisjZGVmaW5lIFRBVklMX1pERVRfU1VQUE9SVEVEICAgICAgICAgIHRydWUKKy8qIFogdmFsdWUgZGVmaW5lZCBpbiBtaWxsaW9obSAqLworI2RlZmluZSBUQVZJTF9aREVUX1ZBTF8zMiAgICAgICAgICAgICAzMjAwMAorI2RlZmluZSBUQVZJTF9aREVUX1ZBTF80MDAgICAgICAgICAgICA0MDAwMDAKKyNkZWZpbmUgVEFWSUxfWkRFVF9WQUxfMTIwMCAgICAgICAgICAgMTIwMDAwMAorI2RlZmluZSBUQVZJTF9aREVUX1ZBTF8xMDBLICAgICAgICAgICAxMDAwMDAwMDAKKy8qIFogZmxvYXRpbmcgZGVmaW5lZCBpbiBvaG1zICovCisjZGVmaW5lIFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFIDB4MEZGRkZGRkUKKworI2RlZmluZSBUQVZJTF9aREVUX05VTV9NRUFTVVJFTUVOVFMgICAxNTAKKyNkZWZpbmUgVEFWSUxfTUJIQ19HRVRfQzEoYykgICAgICAgICAgKChjICYgMHhDMDAwKSA+PiAxNCkKKyNkZWZpbmUgVEFWSUxfTUJIQ19HRVRfWDEoeCkgICAgICAgICAgKHggJiAweDNGRkYpCisvKiBaIHZhbHVlIGNvbXBhcmVkIGluIG1pbGxpT2htICovCisjZGVmaW5lIFRBVklMX01CSENfSVNfU0VDT05EX1JBTVBfUkVRVUlSRUQoeikgKCh6ID4gNDAwMDAwKSB8fCAoeiA8IDMyMDAwKSkKKyNkZWZpbmUgVEFWSUxfTUJIQ19aREVUX0NPTlNUICAgICAgICAgKDg2ICogMTYzODQpCisjZGVmaW5lIFRBVklMX01CSENfTU9JU1RVUkVfUlJFRiAgICAgIFJfMjRfS09ITQorCitzdGF0aWMgc3RydWN0IHdjZF9tYmhjX3JlZ2lzdGVyCisJd2NkX21iaGNfcmVnaXN0ZXJzW1dDRF9NQkhDX1JFR19GVU5DX01BWF0gPSB7CisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0xfREVUX0VOIiwKKwkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDgwLCA3LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX0RFVF9FTiIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHg0MCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUiLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4MjAsIDUsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NSUNfQ0xBTVBfQ1RMIiwKKwkJCSAgV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwsIDB4MzAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsIDB4MDgsIDMsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NUUkwiLAorCQkJICBXQ0Q5MzRYX01CSENfTkVXX1BMVUdfREVURUNUX0NUTCwgMHhDMCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0xfREVUX1BVTExfVVBfQ09NUF9DVFJMIiwKKwkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDA0LCAyLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9QTFVHX1RZUEUiLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4MTAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19HTkRfUExVR19UWVBFIiwKKwkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDA4LCAzLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfU1dfSFBIX0xQXzEwMEtfVE9fR05EIiwKKwkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDAxLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQyIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsIDB4MDYsIDEsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fRU4iLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAweDgwLCA3LCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSU5TUkVNX0RCTkMiLAorCQkJICBXQ0Q5MzRYX01CSENfTkVXX1BMVUdfREVURUNUX0NUTCwgMHgwRiwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9EQk5DIiwKKwkJCSAgV0NEOTM0WF9NQkhDX05FV19DVExfMSwgMHgwMywgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX1ZSRUYiLAorCQkJICBXQ0Q5MzRYX01CSENfTkVXX0NUTF8yLCAweDAzLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfQ09NUF9SRVNVTFQiLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDA4LCAzLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX1NDSE1UX1JFU1VMVCIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMsIDB4MjAsIDUsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMsIDB4ODAsIDcsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhSX1NDSE1UX1JFU1VMVCIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMsIDB4NDAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19PQ1BfRlNNX0VOIiwKKwkJCSAgV0NEOTM0WF9IUEhfT0NQX0NUTCwgMHgxMCwgNCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9SRVNVTFQiLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDA3LCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfQlROX0lTUkNfQ1RMIiwKKwkJCSAgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCwgMHg3MCwgNCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0VMRUNUX1JFU1VMVCIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMsIDB4RkYsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NSUNCX0NUUkwiLAorCQkJICBXQ0Q5MzRYX0FOQV9NSUNCMiwgMHhDMCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSF9DTlBfV0dfVElNRSIsCisJCQkgIFdDRDkzNFhfSFBIX0NOUF9XR19USU1FLCAweEZGLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9QQV9FTiIsCisJCQkgIFdDRDkzNFhfQU5BX0hQSCwgMHg0MCwgNiwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfUEFfRU4iLAorCQkJICBXQ0Q5MzRYX0FOQV9IUEgsIDB4ODAsIDcsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhfUEFfRU4iLAorCQkJICBXQ0Q5MzRYX0FOQV9IUEgsIDB4QzAsIDYsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19TV0NIX0xFVkVMX1JFTU9WRSIsCisJCQkgIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMsIDB4MTAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19QVUxMRE9XTl9DVFJMIiwKKwkJCSAgMCwgMCwgMCwgMCksCisJV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0FOQ19ERVRfRU4iLAorCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQsIDB4MDEsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fU1RBVFVTIiwKKwkJCSAgV0NEOTM0WF9NQkhDX1NUQVRVU19TUEFSRV8xLCAweDAxLCAwLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTVVYX0NUTCIsCisJCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsIDB4NzAsIDQsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX09DUF9ERVRfRU4iLAorCQkJICBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhSX09DUF9ERVRfRU4iLAorCQkJICBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDAsIDApLAorCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX09DUF9TVEFUVVMiLAorCQkJICBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMwLCAweDA0LCAyLCAwKSwKKwlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9PQ1BfU1RBVFVTIiwKKwkJCSAgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMCwgMHgwOCwgMywgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2ludHIgaW50cl9pZHMgPSB7CisJLm1iaGNfc3dfaW50ciA9ICBXQ0Q5MzRYX0lSUV9NQkhDX1NXX0RFVCwKKwkubWJoY19idG5fcHJlc3NfaW50ciA9IFdDRDkzNFhfSVJRX01CSENfQlVUVE9OX1BSRVNTX0RFVCwKKwkubWJoY19idG5fcmVsZWFzZV9pbnRyID0gV0NEOTM0WF9JUlFfTUJIQ19CVVRUT05fUkVMRUFTRV9ERVQsCisJLm1iaGNfaHNfaW5zX2ludHIgPSBXQ0Q5MzRYX0lSUV9NQkhDX0VMRUNUX0lOU19SRU1fTEVHX0RFVCwKKwkubWJoY19oc19yZW1faW50ciA9IFdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsCisJLmhwaF9sZWZ0X29jcCA9IFdDRDkzNFhfSVJRX0hQSF9QQV9PQ1BMX0ZBVUxULAorCS5ocGhfcmlnaHRfb2NwID0gV0NEOTM0WF9JUlFfSFBIX1BBX09DUFJfRkFVTFQsCit9OworCisKK3N0YXRpYyBjaGFyIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVtdW01BWF9PTl9ERU1BTkRfU1VQUExZX05BTUVfTEVOR1RIXSA9IHsKKwkiY2RjLXZkZC1taWMtYmlhcyIsCit9OworCitzdHJ1Y3QgdGF2aWxfbWJoY196ZGV0X3BhcmFtIHsKKwl1MTYgbGRvX2N0bDsKKwl1MTYgbm9mZjsKKwl1MTYgbnNoaWZ0OworCXUxNiBidG41OworCXUxNiBidG42OworCXUxNiBidG43OworfTsKKworc3RhdGljIGludCB0YXZpbF9tYmhjX3JlcXVlc3RfaXJxKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJcmV0dXJuIHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIGlycSwgaGFuZGxlciwgbmFtZSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX21iaGNfaXJxX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGludCBpcnEsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQorCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKKwlpZiAoZW5hYmxlKQorCQl3Y2Q5eHh4X2VuYWJsZV9pcnEoY29yZV9yZXMsIGlycSk7CisJZWxzZQorCQl3Y2Q5eHh4X2Rpc2FibGVfaXJxKGNvcmVfcmVzLCBpcnEpOworfQorCitzdGF0aWMgaW50IHRhdmlsX21iaGNfZnJlZV9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgaXJxLCBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfbWJoY19jbGtfc2V0dXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX0NUTF8xLAorCQkJCSAgICAweDgwLCAweDgwKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsCisJCQkJICAgIDB4ODAsIDB4MDApOworfQorCitzdGF0aWMgaW50IHRhdmlsX21iaGNfYnRuX3RvX251bShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMykgJiAweDc7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZW5hYmxlX2V4dF9tYl9zb3VyY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAorCQkJCSAgICAgIGJvb2wgdHVybl9vbikKK3sKKwlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHdjZDkzNHhfb25fZGVtYW5kX3N1cHBseSAqc3VwcGx5OworCWludCByZXQgPSAwOworCisJd2NkOTM0eF9tYmhjID0gY29udGFpbmVyX29mKG1iaGMsIHN0cnVjdCB3Y2Q5MzR4X21iaGMsIHdjZF9tYmhjKTsKKworCXN1cHBseSA9ICAmd2NkOTM0eF9tYmhjLT5vbl9kZW1hbmRfbGlzdFtXQ0Q5MzRYX09OX0RFTUFORF9NSUNCSUFTXTsKKwlpZiAoIXN1cHBseS0+c3VwcGx5KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3YXJuaW5nIHN1cHBseSBub3QgcHJlc2VudCBvbmQgZm9yICVzXG4iLAorCQkJCV9fZnVuY19fLCAib25EZW1hbmQgTWljYmlhcyIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHR1cm5fb246ICVkIGNvdW50OiAlZFxuIiwgX19mdW5jX18sIHR1cm5fb24sCisJCXN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50KTsKKworCWlmICh0dXJuX29uKSB7CisJCWlmICghKHN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50KSkgeworCQkJcmV0ID0gc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oCisJCQkJc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyksCisJCQkJIk1JQ0JJQVNfUkVHVUxBVE9SIik7CisJCQlzbmRfc29jX2RhcG1fc3luYyhzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSk7CisJCX0KKwkJc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQrKzsKKwl9IGVsc2UgeworCQlpZiAoc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQgPiAwKQorCQkJc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQtLTsKKwkJaWYgKCEoc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQpKSB7CisJCQlyZXQgPSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oCisJCQkJc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyksCisJCQkJIk1JQ0JJQVNfUkVHVUxBVE9SIik7CisJCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKKwkJfQorCX0KKworCWlmIChyZXQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gJXMgZXh0ZXJuYWwgbWljYmlhcyBzb3VyY2VcbiIsCisJCQlfX2Z1bmNfXywgdHVybl9vbiA/ICJlbmFibGUiIDogImRpc2FibGVkIik7CisJZWxzZQorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogJXMgZXh0ZXJuYWwgbWljYmlhcyBzb3VyY2VcbiIsCisJCQlfX2Z1bmNfXywgdHVybl9vbiA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfbWJoY19tYmhjX2JpYXNfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULAorCQkJCSAgICAweDAxLCAweDAxKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsCisJCQkJICAgIDB4MDEsIDB4MDApOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9tYmhjX3Byb2dyYW1fYnRuX3RocihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHMxNiAqYnRuX2xvdywgczE2ICpidG5faGlnaCwKKwkJCQkgICAgICAgaW50IG51bV9idG4sIGJvb2wgaXNfbWljYmlhcykKK3sKKwlpbnQgaTsKKwlpbnQgdnRoOworCisJaWYgKG51bV9idG4gPiBXQ0RfTUJIQ19ERUZfQlVUVE9OUykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBudW1iZXIgb2YgYnV0dG9uczogJWRcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2J0bik7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBUYXZpbCBqdXN0IG5lZWRzIG9uZSBzZXQgb2YgdGhyZXNob2xkcyBmb3IgYnV0dG9uIGRldGVjdGlvbgorCSAqIGR1ZSB0byBtaWNiaWFzIHZvbHRhZ2UgcmFtcCB0byBwdWxsdXAgdXBvbiBidXR0b24gcHJlc3MuIFNvCisJICogYnRuX2xvdyBhbmQgaXNfbWljYmlhcyBhcmUgaWdub3JlZCBhbmQgYWx3YXlzIHByb2dyYW0gYnV0dG9uCisJICogdGhyZXNob2xkcyB1c2luZyBidG5faGlnaC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J0bjsgaSsrKSB7CisJCXZ0aCA9ICgoYnRuX2hpZ2hbaV0gKiAyKSAvIDI1KSAmIDB4M0Y7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlROMCArIGksCisJCQkJICAgIDB4RkMsIHZ0aCA8PCAyKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGJ0bl9oaWdoWyVkXTogJWQsIHZ0aDogJWRcbiIsCisJCQlfX2Z1bmNfXywgaSwgYnRuX2hpZ2hbaV0sIHZ0aCk7CisJfQorfQorCitzdGF0aWMgYm9vbCB0YXZpbF9tYmhjX2xvY2tfc2xlZXAoc3RydWN0IHdjZF9tYmhjICptYmhjLCBib29sIGxvY2spCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCWJvb2wgcmV0ID0gMDsKKworCWlmIChsb2NrKQorCQlyZXQgPSB3Y2Q5eHh4X2xvY2tfc2xlZXAoY29yZV9yZXMpOworCWVsc2UKKwkJd2NkOXh4eF91bmxvY2tfc2xlZXAoY29yZV9yZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXZpbF9tYmhjX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2ssCisJCQkJCWJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYzsKKworCXdjZDkzNHhfbWJoYyA9IGNvbnRhaW5lcl9vZihtYmhjLCBzdHJ1Y3Qgd2NkOTM0eF9tYmhjLCB3Y2RfbWJoYyk7CisKKwlpZiAoZW5hYmxlKQorCQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJndjZDkzNHhfbWJoYy0+bm90aWZpZXIsCisJCQkJCQkJbmJsb2NrKTsKKwllbHNlCisJCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKAorCQkJCSZ3Y2Q5MzR4X21iaGMtPm5vdGlmaWVyLCBuYmxvY2spOworfQorCitzdGF0aWMgYm9vbCB0YXZpbF9tYmhjX21pY2JfZW5fc3RhdHVzKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgaW50IG1pY2JfbnVtKQoreworCXU4IHZhbDsKKworCWlmIChtaWNiX251bSA9PSBNSUNfQklBU18yKSB7CisJCXZhbCA9IChzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDkzNFhfQU5BX01JQ0IyKSA+PiA2KTsKKwkJaWYgKHZhbCA9PSAweDAxKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgdGF2aWxfbWJoY19ocGhfcGFfb25fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfSFBIKSAmIDB4QzApID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9tYmhjX2hwaF9sX3B1bGxfdXBfY29udHJvbCgKKwkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQllbnVtIG1iaGNfaHNfcHVsbHVwX2lyZWYgcHVsbF91cF9jdXIpCit7CisJLyogRGVmYXVsdCBwdWxsIHVwIGN1cnJlbnQgdG8gMnVBICovCisJaWYgKHB1bGxfdXBfY3VyIDwgSV9PRkYgfHwgcHVsbF91cF9jdXIgPiBJXzNQMF9VQSB8fAorCSAgICBwdWxsX3VwX2N1ciA9PSBJX0RFRkFVTFQpCisJCXB1bGxfdXBfY3VyID0gSV8yUDBfVUE7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogSFMgcHVsbCB1cCBjdXJyZW50OiVkXG4iLAorCQlfX2Z1bmNfXywgcHVsbF91cF9jdXIpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwsCisJCQkgICAgMHhDMCwgcHVsbF91cF9jdXIgPDwgNik7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfbWJoY19yZXF1ZXN0X21pY2JpYXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIGludCBtaWNiX251bSwgaW50IHJlcSkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBJZiBtaWNiaWFzIGlzIHJlcXVlc3RlZCwgbWFrZSBzdXJlIHRoYXQgdGhlcmUKKwkgKiBpcyB2b3RlIHRvIGVuYWJsZSBtY2xrCisJICovCisJaWYgKHJlcSA9PSBNSUNCX0VOQUJMRSkKKwkJdGF2aWxfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCB0cnVlKTsKKworCXJldCA9IHRhdmlsX21pY2JpYXNfY29udHJvbChjb2RlYywgbWljYl9udW0sIHJlcSwgZmFsc2UpOworCisJLyoKKwkgKiBSZWxlYXNlIHZvdGUgZm9yIG1jbGsgd2hpbGUgcmVxdWVzdGluZyBmb3IKKwkgKiBtaWNiaWFzIGRpc2FibGUKKwkgKi8KKwlpZiAocmVxID09IE1JQ0JfRElTQUJMRSkKKwkJdGF2aWxfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCBmYWxzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9tYmhjX21pY2JfcmFtcF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUlDQjJfUkFNUCwKKwkJCQkgICAgMHgxQywgMHgwQyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0IyX1JBTVAsCisJCQkJICAgIDB4ODAsIDB4ODApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0IyX1JBTVAsCisJCQkJICAgIDB4ODAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NSUNCMl9SQU1QLAorCQkJCSAgICAweDFDLCAweDAwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlybXdhcmVfY2FsICp0YXZpbF9nZXRfaHdkZXBfZndfY2FsKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKKwkJCQkJCSAgIGVudW0gd2NkX2NhbF90eXBlIHR5cGUpCit7CisJc3RydWN0IHdjZDkzNHhfbWJoYyAqd2NkOTM0eF9tYmhjOworCXN0cnVjdCBmaXJtd2FyZV9jYWwgKmh3ZGVwX2NhbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCXdjZDkzNHhfbWJoYyA9IGNvbnRhaW5lcl9vZihtYmhjLCBzdHJ1Y3Qgd2NkOTM0eF9tYmhjLCB3Y2RfbWJoYyk7CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IE5VTEwgY29kZWMgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwod2NkOTM0eF9tYmhjLT5md19kYXRhLCB0eXBlKTsKKwlpZiAoIWh3ZGVwX2NhbCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNhbCBub3Qgc2VudCBieSAlZFxuIiwKKwkJCV9fZnVuY19fLCB0eXBlKTsKKworCXJldHVybiBod2RlcF9jYWw7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfbWJoY19taWNiX2N0cmxfdGhyZXNob2xkX21pYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgIGludCBtaWNiX251bSwgYm9vbCByZXFfZW4pCit7CisJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCWludCByYywgbWljYl9tdjsKKworCWlmIChtaWNiX251bSAhPSBNSUNfQklBU18yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSWYgZGV2aWNlIHRyZWUgbWljYmlhcyBsZXZlbCBpcyBhbHJlYWR5IGFib3ZlIHRoZSBtaW5pbXVtCisJICogdm9sdGFnZSBuZWVkZWQgdG8gZGV0ZWN0IHRocmVzaG9sZCBtaWNyb3Bob25lLCB0aGVuIGRvCisJICogbm90IGNoYW5nZSB0aGUgbWljYmlhcywganVzdCByZXR1cm4uCisJICovCisJaWYgKHBkYXRhLT5taWNiaWFzLm1pY2IyX212ID49IFdDRF9NQkhDX1RIUl9IU19NSUNCX01WKQorCQlyZXR1cm4gMDsKKworCW1pY2JfbXYgPSByZXFfZW4gPyBXQ0RfTUJIQ19USFJfSFNfTUlDQl9NViA6IHBkYXRhLT5taWNiaWFzLm1pY2IyX212OworCisJcmMgPSB0YXZpbF9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2UoY29kZWMsIG1pY2JfbXYsIE1JQ19CSUFTXzIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGF2aWxfbWJoY19nZXRfcmVzdWx0X3BhcmFtcyhzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKKwkJCQkJCXMxNiAqZDFfYSwgdTE2IG5vZmYsCisJCQkJCQlpbnQzMl90ICp6ZGV0KQoreworCWludCBpOworCWludCB2YWwsIHZhbDE7CisJczE2IGMxOworCXMzMiB4MSwgZDE7CisJaW50MzJfdCBkZW5vbTsKKwlpbnQgbWluQ29kZV9wYXJhbVtdID0geworCQkJMzI3NywgMTYzOSwgODIwLCA0MTAsIDIwNSwgMTAzLCA1MiwgMjYKKwl9OworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAweDIwLCAweDIwKTsKKwlmb3IgKGkgPSAwOyBpIDwgVEFWSUxfWkRFVF9OVU1fTUVBU1VSRU1FTlRTOyBpKyspIHsKKwkJcmVnbWFwX3JlYWQod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8yLCAmdmFsKTsKKwkJaWYgKHZhbCAmIDB4ODApCisJCQlicmVhazsKKwl9CisJdmFsID0gdmFsIDw8IDB4ODsKKwlyZWdtYXBfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzEsICZ2YWwxKTsKKwl2YWwgfD0gdmFsMTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQsIDB4MjAsIDB4MDApOworCXgxID0gVEFWSUxfTUJIQ19HRVRfWDEodmFsKTsKKwljMSA9IFRBVklMX01CSENfR0VUX0MxKHZhbCk7CisJLyogSWYgcmFtcCBpcyBub3QgY29tcGxldGUsIGdpdmUgYWRkaXRpb25hbCA1bXMgKi8KKwlpZiAoKGMxIDwgMikgJiYgeDEpCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MDUwKTsKKworCWlmICghYzEgfHwgIXgxKSB7CisJCWRldl9kYmcod2NkOXh4eC0+ZGV2LAorCQkJIiVzOiBJbXBlZGFuY2UgZGV0ZWN0IHJhbXAgZXJyb3IsIGMxPSVkLCB4MT0weCV4XG4iLAorCQkJX19mdW5jX18sIGMxLCB4MSk7CisJCWdvdG8gcmFtcF9kb3duOworCX0KKwlkMSA9IGQxX2FbYzFdOworCWRlbm9tID0gKHgxICogZDEpIC0gKDEgPDwgKDE0IC0gbm9mZikpOworCWlmIChkZW5vbSA+IDApCisJCSp6ZGV0ID0gKFRBVklMX01CSENfWkRFVF9DT05TVCAqIDEwMDApIC8gZGVub207CisJZWxzZSBpZiAoeDEgPCBtaW5Db2RlX3BhcmFtW25vZmZdKQorCQkqemRldCA9IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOworCisJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogZDE9JWQsIGMxPSVkLCB4MT0weCV4LCB6X3ZhbD0lZChtaWxsaU9obSlcbiIsCisJCV9fZnVuY19fLCBkMSwgYzEsIHgxLCAqemRldCk7CityYW1wX2Rvd246CisJaSA9IDA7CisJd2hpbGUgKHgxKSB7CisJCXJlZ21hcF9idWxrX3JlYWQod2NkOXh4eC0+cmVnbWFwLAorCQkJCSBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8xLCAodTggKikmdmFsLCAyKTsKKwkJeDEgPSBUQVZJTF9NQkhDX0dFVF9YMSh2YWwpOworCQlpKys7CisJCWlmIChpID09IFRBVklMX1pERVRfTlVNX01FQVNVUkVNRU5UUykKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdGF2aWxfbWJoY196ZGV0X3JhbXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3QgdGF2aWxfbWJoY196ZGV0X3BhcmFtICp6ZGV0X3BhcmFtLAorCQkJCSBpbnQzMl90ICp6bCwgaW50MzJfdCAqenIsIHMxNiAqZDFfYSkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCWludDMyX3QgemRldCA9IDA7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX1pERVRfQU5BX0NUTCwgMHg3MCwKKwkJCSAgICB6ZGV0X3BhcmFtLT5sZG9fY3RsIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONSwgMHhGQywKKwkJCSAgICB6ZGV0X3BhcmFtLT5idG41KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjYsIDB4RkMsCisJCQkgICAgemRldF9wYXJhbS0+YnRuNik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE43LCAweEZDLAorCQkJICAgIHpkZXRfcGFyYW0tPmJ0bjcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMLCAweDBGLAorCQkJICAgIHpkZXRfcGFyYW0tPm5vZmYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9SQU1QX0NUTCwgMHgwRiwKKwkJCSAgICB6ZGV0X3BhcmFtLT5uc2hpZnQpOworCisJaWYgKCF6bCkKKwkJZ290byB6X3JpZ2h0OworCS8qIFN0YXJ0IGltcGVkYW5jZSBtZWFzdXJlbWVudCBmb3IgSFBIX0wgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAorCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAweDgwLCAweDgwKTsKKwlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiByYW1wIGZvciBIUEhfTCwgbm9mZiA9ICVkXG4iLAorCQlfX2Z1bmNfXywgemRldF9wYXJhbS0+bm9mZik7CisJdGF2aWxfbWJoY19nZXRfcmVzdWx0X3BhcmFtcyh3Y2Q5eHh4LCBkMV9hLCB6ZGV0X3BhcmFtLT5ub2ZmLCAmemRldCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzNFhfQU5BX01CSENfWkRFVCwgMHg4MCwgMHgwMCk7CisKKwkqemwgPSB6ZGV0OworCit6X3JpZ2h0OgorCWlmICghenIpCisJCXJldHVybjsKKwkvKiBTdGFydCBpbXBlZGFuY2UgbWVhc3VyZW1lbnQgZm9yIEhQSF9SICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzNFhfQU5BX01CSENfWkRFVCwgMHg0MCwgMHg0MCk7CisJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogcmFtcCBmb3IgSFBIX1IsIG5vZmYgPSAlZFxuIiwKKwkJX19mdW5jX18sIHpkZXRfcGFyYW0tPm5vZmYpOworCXRhdmlsX21iaGNfZ2V0X3Jlc3VsdF9wYXJhbXMod2NkOXh4eCwgZDFfYSwgemRldF9wYXJhbS0+bm9mZiwgJnpkZXQpOworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQsIDB4NDAsIDB4MDApOworCisJKnpyID0gemRldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhdmlsX3djZF9tYmhjX3FmdXNlX2NhbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICBpbnQzMl90ICp6X3ZhbCwgaW50IGZsYWdfbF9yKQoreworCXMxNiBxMTsKKwlpbnQgcTFfY2FsOworCisJaWYgKCp6X3ZhbCA8IChUQVZJTF9aREVUX1ZBTF80MDAvMTAwMCkpCisJCXExID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSArICgyICogZmxhZ19sX3IpKTsKKwllbHNlCisJCXExID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMiArICgyICogZmxhZ19sX3IpKTsKKwlpZiAocTEgJiAweDgwKQorCQlxMV9jYWwgPSAoMTAwMDAgLSAoKHExICYgMHg3RikgKiAyNSkpOworCWVsc2UKKwkJcTFfY2FsID0gKDEwMDAwICsgKHExICogMjUpKTsKKwlpZiAocTFfY2FsID4gMCkKKwkJKnpfdmFsID0gKCgqel92YWwpICogMTAwMDApIC8gcTFfY2FsOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF93Y2RfbWJoY19jYWxjX2ltcGVkYW5jZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCQkJICB1aW50MzJfdCAqenIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzMTYgcmVnMCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKKwlpbnQzMl90IHoxTCwgejFSLCB6MUxzOworCWludCB6TW9ubywgel9kaWZmMSwgel9kaWZmMjsKKwlib29sIGlzX2ZzbV9kaXNhYmxlID0gZmFsc2U7CisJc3RydWN0IHRhdmlsX21iaGNfemRldF9wYXJhbSB6ZGV0X3BhcmFtW10gPSB7CisJCXs0LCAwLCA0LCAweDA4LCAweDE0LCAweDE4fSwgLyogPCAzMm9obSAqLworCQl7MiwgMCwgMywgMHgxOCwgMHg3QywgMHg5MH0sIC8qIDMyb2htIDwgWiA8IDQwMG9obSAqLworCQl7MSwgNCwgNSwgMHgxOCwgMHg3QywgMHg5MH0sIC8qIDQwMG9obSA8IFogPCAxMjAwb2htICovCisJCXsxLCA2LCA3LCAweDE4LCAweDdDLCAweDkwfSwgLyogPjEyMDBvaG0gKi8KKwl9OworCXN0cnVjdCB0YXZpbF9tYmhjX3pkZXRfcGFyYW0gKnpkZXRfcGFyYW1fcHRyID0gTlVMTDsKKwlzMTYgZDFfYVtdWzRdID0geworCQl7MCwgMzAsIDkwLCAzMH0sCisJCXswLCAzMCwgMzAsIDV9LAorCQl7MCwgMzAsIDMwLCA1fSwKKwkJezAsIDMwLCAzMCwgNX0sCisJfTsKKwlzMTYgKmQxID0gTlVMTDsKKworCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOworCisJcmVnMCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE41KTsKKwlyZWcxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjYpOworCXJlZzIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONyk7CisJcmVnMyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9NQkhDX0NUTF9DTEspOworCXJlZzQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMKTsKKworCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QpICYgMHg4MCkgeworCQlpc19mc21fZGlzYWJsZSA9IHRydWU7CisJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgMHgwMCk7CisJfQorCisJLyogRm9yIE5PLWphY2ssIGRpc2FibGUgTF9ERVRfRU4gYmVmb3JlIFotZGV0IG1lYXN1cmVtZW50cyAqLworCWlmIChtYmhjLT5ocGhsX3N3aCkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4ODAsIDB4MDApOworCisJLyogVHVybiBvZmYgMTAwayBwdWxsIGRvd24gb24gSFBITCAqLworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4MDEsIDB4MDApOworCisJLyogRmlyc3QgZ2V0IGltcGVkYW5jZSBvbiBMZWZ0ICovCisJZDEgPSBkMV9hWzFdOworCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMV07CisJdGF2aWxfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCAmejFMLCBOVUxMLCBkMSk7CisKKwlpZiAoIVRBVklMX01CSENfSVNfU0VDT05EX1JBTVBfUkVRVUlSRUQoejFMKSkKKwkJZ290byBsZWZ0X2NoX2ltcGVkYW5jZTsKKworCS8qIFNlY29uZCByYW1wIGZvciBsZWZ0IGNoICovCisJaWYgKHoxTCA8IFRBVklMX1pERVRfVkFMXzMyKSB7CisJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMF07CisJCWQxID0gZDFfYVswXTsKKwl9IGVsc2UgaWYgKCh6MUwgPiBUQVZJTF9aREVUX1ZBTF80MDApICYmICh6MUwgPD0gVEFWSUxfWkRFVF9WQUxfMTIwMCkpIHsKKwkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsyXTsKKwkJZDEgPSBkMV9hWzJdOworCX0gZWxzZSBpZiAoejFMID4gVEFWSUxfWkRFVF9WQUxfMTIwMCkgeworCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzNdOworCQlkMSA9IGQxX2FbM107CisJfQorCXRhdmlsX21iaGNfemRldF9yYW1wKGNvZGVjLCB6ZGV0X3BhcmFtX3B0ciwgJnoxTCwgTlVMTCwgZDEpOworCitsZWZ0X2NoX2ltcGVkYW5jZToKKwlpZiAoKHoxTCA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKKwkJKHoxTCA+IFRBVklMX1pERVRfVkFMXzEwMEspKSB7CisJCSp6bCA9IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOworCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzFdOworCQlkMSA9IGQxX2FbMV07CisJfSBlbHNlIHsKKwkJKnpsID0gejFMLzEwMDA7CisJCXRhdmlsX3djZF9tYmhjX3FmdXNlX2NhbChjb2RlYywgemwsIDApOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW1wZWRhbmNlIG9uIEhQSF9MID0gJWQob2htcylcbiIsCisJCV9fZnVuY19fLCAqemwpOworCisJLyogU3RhcnQgb2YgcmlnaHQgaW1wZWRhbmNlIHJhbXAgYW5kIGNhbGN1bGF0aW9uICovCisJdGF2aWxfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCBOVUxMLCAmejFSLCBkMSk7CisJaWYgKFRBVklMX01CSENfSVNfU0VDT05EX1JBTVBfUkVRVUlSRUQoejFSKSkgeworCQlpZiAoKCh6MVIgPiBUQVZJTF9aREVUX1ZBTF8xMjAwKSAmJgorCQkJKHpkZXRfcGFyYW1fcHRyLT5ub2ZmID09IDB4NikpIHx8CisJCQkoKCp6bCkgIT0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpKQorCQkJZ290byByaWdodF9jaF9pbXBlZGFuY2U7CisJCS8qIFNlY29uZCByYW1wIGZvciByaWdodCBjaCAqLworCQlpZiAoejFSIDwgVEFWSUxfWkRFVF9WQUxfMzIpIHsKKwkJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMF07CisJCQlkMSA9IGQxX2FbMF07CisJCX0gZWxzZSBpZiAoKHoxUiA+IFRBVklMX1pERVRfVkFMXzQwMCkgJiYKKwkJCSh6MVIgPD0gVEFWSUxfWkRFVF9WQUxfMTIwMCkpIHsKKwkJCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMl07CisJCQlkMSA9IGQxX2FbMl07CisJCX0gZWxzZSBpZiAoejFSID4gVEFWSUxfWkRFVF9WQUxfMTIwMCkgeworCQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVszXTsKKwkJCWQxID0gZDFfYVszXTsKKwkJfQorCQl0YXZpbF9tYmhjX3pkZXRfcmFtcChjb2RlYywgemRldF9wYXJhbV9wdHIsIE5VTEwsICZ6MVIsIGQxKTsKKwl9CityaWdodF9jaF9pbXBlZGFuY2U6CisJaWYgKCh6MVIgPT0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpIHx8CisJCSh6MVIgPiBUQVZJTF9aREVUX1ZBTF8xMDBLKSkgeworCQkqenIgPSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRTsKKwl9IGVsc2UgeworCQkqenIgPSB6MVIvMTAwMDsKKwkJdGF2aWxfd2NkX21iaGNfcWZ1c2VfY2FsKGNvZGVjLCB6ciwgMSk7CisJfQorCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbXBlZGFuY2Ugb24gSFBIX1IgPSAlZChvaG1zKVxuIiwKKwkJX19mdW5jX18sICp6cik7CisKKwkvKiBNb25vL3N0ZXJlbyBkZXRlY3Rpb24gKi8KKwlpZiAoKCp6bCA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgJiYKKwkJKCp6ciA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBwbHVnIHR5cGUgaXMgaW52YWxpZCBvciBleHRlbnNpb24gY2FibGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gemRldF9jb21wbGV0ZTsKKwl9CisJaWYgKCgqemwgPT0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpIHx8CisJICAgICgqenIgPT0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpIHx8CisJICAgICgoKnpsIDwgV0NEX01PTk9fSFNfTUlOX1RIUikgJiYgKCp6ciA+IFdDRF9NT05PX0hTX01JTl9USFIpKSB8fAorCSAgICAoKCp6bCA+IFdDRF9NT05PX0hTX01JTl9USFIpICYmICgqenIgPCBXQ0RfTU9OT19IU19NSU5fVEhSKSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBNb25vIHBsdWcgdHlwZSB3aXRoIG9uZSBjaCBmbG9hdGluZyBvciBzaG9ydGVkIHRvIEdORFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKKwkJZ290byB6ZGV0X2NvbXBsZXRlOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SX0FURVNULCAweDAyLCAweDAyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9QQV9DVEwyLCAweDQwLCAweDAxKTsKKwlpZiAoKnpsIDwgKFRBVklMX1pERVRfVkFMXzMyLzEwMDApKQorCQl0YXZpbF9tYmhjX3pkZXRfcmFtcChjb2RlYywgJnpkZXRfcGFyYW1bMF0sICZ6MUxzLCBOVUxMLCBkMSk7CisJZWxzZQorCQl0YXZpbF9tYmhjX3pkZXRfcmFtcChjb2RlYywgJnpkZXRfcGFyYW1bMV0sICZ6MUxzLCBOVUxMLCBkMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUEFfQ1RMMiwgMHg0MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUl9BVEVTVCwgMHgwMiwgMHgwMCk7CisJejFMcyAvPSAxMDAwOworCXRhdmlsX3djZF9tYmhjX3FmdXNlX2NhbChjb2RlYywgJnoxTHMsIDApOworCS8qIFBhcmFsbGVsIG9mIGxlZnQgWiBhbmQgOSBvaG0gcHVsbCBkb3duIHJlc2lzdG9yICovCisJek1vbm8gPSAoKCp6bCkgKiA5KSAvICgoKnpsKSArIDkpOworCXpfZGlmZjEgPSAoejFMcyA+IHpNb25vKSA/ICh6MUxzIC0gek1vbm8pIDogKHpNb25vIC0gejFMcyk7CisJel9kaWZmMiA9ICgoKnpsKSA+IHoxTHMpID8gKCgqemwpIC0gejFMcykgOiAoejFMcyAtICgqemwpKTsKKwlpZiAoKHpfZGlmZjEgKiAoKnpsICsgejFMcykpID4gKHpfZGlmZjIgKiAoejFMcyArIHpNb25vKSkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHN0ZXJlbyBwbHVnIHR5cGUgZGV0ZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX1NURVJFTzsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTU9OTyBwbHVnIHR5cGUgZGV0ZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX01PTk87CisJfQorCit6ZGV0X2NvbXBsZXRlOgorCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONSwgcmVnMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE42LCByZWcxKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjcsIHJlZzIpOworCS8qIFR1cm4gb24gMTAwayBwdWxsIGRvd24gb24gSFBITCAqLworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4MDEsIDB4MDEpOworCisJLyogRm9yIE5PLWphY2ssIHJlLWVuYWJsZSBMX0RFVF9FTiBhZnRlciBaLWRldCBtZWFzdXJlbWVudHMgKi8KKwlpZiAobWJoYy0+aHBobF9zd2gpCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDgwLCAweDgwKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMLCByZWc0KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX01CSENfQ1RMX0NMSywgcmVnMyk7CisJaWYgKGlzX2ZzbV9kaXNhYmxlKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAorCQkJCSAgIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsIDB4ODAsIDB4ODApOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9tYmhjX2duZF9kZXRfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19NRUNILAorCQkJCSAgICAweDAyLCAweDAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19NRUNILAorCQkJCSAgICAweDQwLCAweDQwKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsCisJCQkJICAgIDB4NDAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsCisJCQkJICAgIDB4MDIsIDB4MDApOworCX0KK30KKworc3RhdGljIHZvaWQgdGF2aWxfbWJoY19ocGhfcHVsbF9kb3duX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUEFfQ1RMMiwKKwkJCQkgICAgMHg0MCwgMHg0MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1BBX0NUTDIsCisJCQkJICAgIDB4MTAsIDB4MTApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1BBX0NUTDIsCisJCQkJICAgIDB4NDAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9QQV9DVEwyLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwl9Cit9CitzdGF0aWMgdm9pZCB0YXZpbF9tYmhjX21vaXN0dXJlX2NvbmZpZyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlpZiAoVEFWSUxfTUJIQ19NT0lTVFVSRV9SUkVGID09IFJfT0ZGKQorCQlyZXR1cm47CisKKwkvKiBEb25vdCBlbmFibGUgbW9pc3R1cmUgZGV0ZWN0aW9uIGlmIGphY2sgdHlwZSBpcyBOQyAqLworCWlmICghbWJoYy0+aHBobF9zd2gpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGRpc2FibGUgbW9pc3R1cmUgZGV0ZWN0aW9uIGZvciBOQ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsCisJCQkgICAgMHgwQywgVEFWSUxfTUJIQ19NT0lTVFVSRV9SUkVGIDw8IDIpOworfQorCitzdGF0aWMgYm9vbCB0YXZpbF9ocGhfcmVnaXN0ZXJfcmVjb3Zlcnkoc3RydWN0IHdjZF9tYmhjICptYmhjKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7CisKKwlpZiAoIXdjZDkzNHhfbWJoYykKKwkJcmV0dXJuIGZhbHNlOworCisJd2NkOTM0eF9tYmhjLT5pc19ocGhfcmVjb3ZlciA9IGZhbHNlOworCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAorCQkJCSAgICAgICJSRVNFVF9IUEhfUkVHSVNURVJTIik7CisJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOworCisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAorCQkJCSAiUkVTRVRfSFBIX1JFR0lTVEVSUyIpOworCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKKworCXJldHVybiB3Y2Q5MzR4X21iaGMtPmlzX2hwaF9yZWNvdmVyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiIG1iaGNfY2IgPSB7CisJLnJlcXVlc3RfaXJxID0gdGF2aWxfbWJoY19yZXF1ZXN0X2lycSwKKwkuaXJxX2NvbnRyb2wgPSB0YXZpbF9tYmhjX2lycV9jb250cm9sLAorCS5mcmVlX2lycSA9IHRhdmlsX21iaGNfZnJlZV9pcnEsCisJLmNsa19zZXR1cCA9IHRhdmlsX21iaGNfY2xrX3NldHVwLAorCS5tYXBfYnRuX2NvZGVfdG9fbnVtID0gdGF2aWxfbWJoY19idG5fdG9fbnVtLAorCS5lbmFibGVfbWJfc291cmNlID0gdGF2aWxfZW5hYmxlX2V4dF9tYl9zb3VyY2UsCisJLm1iaGNfYmlhcyA9IHRhdmlsX21iaGNfbWJoY19iaWFzX2NvbnRyb2wsCisJLnNldF9idG5fdGhyID0gdGF2aWxfbWJoY19wcm9ncmFtX2J0bl90aHIsCisJLmxvY2tfc2xlZXAgPSB0YXZpbF9tYmhjX2xvY2tfc2xlZXAsCisJLnJlZ2lzdGVyX25vdGlmaWVyID0gdGF2aWxfbWJoY19yZWdpc3Rlcl9ub3RpZmllciwKKwkubWljYmlhc19lbmFibGVfc3RhdHVzID0gdGF2aWxfbWJoY19taWNiX2VuX3N0YXR1cywKKwkuaHBoX3BhX29uX3N0YXR1cyA9IHRhdmlsX21iaGNfaHBoX3BhX29uX3N0YXR1cywKKwkuaHBoX3B1bGxfdXBfY29udHJvbCA9IHRhdmlsX21iaGNfaHBoX2xfcHVsbF91cF9jb250cm9sLAorCS5tYmhjX21pY2JpYXNfY29udHJvbCA9IHRhdmlsX21iaGNfcmVxdWVzdF9taWNiaWFzLAorCS5tYmhjX21pY2JfcmFtcF9jb250cm9sID0gdGF2aWxfbWJoY19taWNiX3JhbXBfY29udHJvbCwKKwkuZ2V0X2h3ZGVwX2Z3X2NhbCA9IHRhdmlsX2dldF9od2RlcF9md19jYWwsCisJLm1iaGNfbWljYl9jdHJsX3Rocl9taWMgPSB0YXZpbF9tYmhjX21pY2JfY3RybF90aHJlc2hvbGRfbWljLAorCS5jb21wdXRlX2ltcGVkYW5jZSA9IHRhdmlsX3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlLAorCS5tYmhjX2duZF9kZXRfY3RybCA9IHRhdmlsX21iaGNfZ25kX2RldF9jdHJsLAorCS5ocGhfcHVsbF9kb3duX2N0cmwgPSB0YXZpbF9tYmhjX2hwaF9wdWxsX2Rvd25fY3RybCwKKwkubWJoY19tb2lzdHVyZV9jb25maWcgPSB0YXZpbF9tYmhjX21vaXN0dXJlX2NvbmZpZywKKwkuaHBoX3JlZ2lzdGVyX3JlY292ZXJ5ID0gdGF2aWxfaHBoX3JlZ2lzdGVyX3JlY292ZXJ5LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKnRhdmlsX2NvZGVjX2ZpbmRfb25kZW1hbmRfcmVndWxhdG9yKAorCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2NkOXh4eC0+bnVtX29mX3N1cHBsaWVzOyArK2kpIHsKKwkJaWYgKHBkYXRhLT5yZWd1bGF0b3JbaV0ub25kZW1hbmQgJiYKKwkJICAgIHdjZDl4eHgtPnN1cHBsaWVzW2ldLnN1cHBseSAmJgorCQkgICAgIXN0cmNtcCh3Y2Q5eHh4LT5zdXBwbGllc1tpXS5zdXBwbHksIG5hbWUpKQorCQkJcmV0dXJuIHdjZDl4eHgtPnN1cHBsaWVzW2ldLmNvbnN1bWVyOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIldhcm5pbmc6IHJlZ3VsYXRvciBub3QgZm91bmQ6JXNcbiIsCisJCW5hbWUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHRhdmlsX2dldF9ocGhfdHlwZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7CisJc3RydWN0IHdjZF9tYmhjICptYmhjOworCisJaWYgKCF3Y2Q5MzR4X21iaGMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYmhjID0gJndjZDkzNHhfbWJoYy0+d2NkX21iaGM7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh1MzIpIG1iaGMtPmhwaF90eXBlOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBocGhfdHlwZSA9ICV1XG4iLCBfX2Z1bmNfXywgbWJoYy0+aHBoX3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfaHBoX2ltcGVkYW5jZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWludDMyX3QgemwsIHpyOworCWJvb2wgaHBocjsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1jOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7CisKKwlpZiAoIXdjZDkzNHhfbWJoYykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1jID0gKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKShrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJaHBociA9IG1jLT5zaGlmdDsKKwl3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKCZ3Y2Q5MzR4X21iaGMtPndjZF9tYmhjLCAmemwsICZ6cik7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHpsPSV1KG9obXMpLCB6cj0ldShvaG1zKVxuIiwgX19mdW5jX18sIHpsLCB6cik7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBocGhyID8genIgOiB6bDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkhQSCBUeXBlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCisJCSAgICAgICB0YXZpbF9nZXRfaHBoX3R5cGUsIE5VTEwpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSFBITCBJbXBlZGFuY2UiLCAwLCAwLCBVSU5UX01BWCwgMCwKKwkJICAgICAgIHRhdmlsX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKKwlTT0NfU0lOR0xFX0VYVCgiSFBIUiBJbXBlZGFuY2UiLCAwLCAxLCBVSU5UX01BWCwgMCwKKwkJICAgICAgIHRhdmlsX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKK307CisKKy8qCisgKiB0YXZpbF9tYmhjX2hzX2RldGVjdDogc3RhcnRzIG1iaGMgaW5zZXJ0aW9uL3JlbW92YWwgZnVuY3Rpb25hbGl0eQorICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCisgKiBAbWJoY19jZmc6IGhhbmRsZSB0byBtYmhjIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiByZXR1cm4gMCBpZiBtYmhjX3N0YXJ0IGlzIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IHRhdmlsX21iaGNfaHNfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKK3sKKwlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGMgPSB0YXZpbF9zb2NfZ2V0X21iaGMoY29kZWMpOworCisJaWYgKCF3Y2Q5MzR4X21iaGMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gd2NkX21iaGNfc3RhcnQoJndjZDkzNHhfbWJoYy0+d2NkX21iaGMsIG1iaGNfY2ZnKTsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19oc19kZXRlY3QpOworCisvKgorICogdGF2aWxfbWJoY19oc19kZXRlY3RfZXhpdDogc3RvcCBtYmhjIGluc2VydGlvbi9yZW1vdmFsIGZ1bmN0aW9uYWxpdHkKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgorICovCit2b2lkIHRhdmlsX21iaGNfaHNfZGV0ZWN0X2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7CisKKwlpZiAoIXdjZDkzNHhfbWJoYykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJd2NkX21iaGNfc3RvcCgmd2NkOTM0eF9tYmhjLT53Y2RfbWJoYyk7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX21iaGNfaHNfZGV0ZWN0X2V4aXQpOworCisvKgorICogdGF2aWxfbWJoY19wb3N0X3Nzcl9pbml0OiBpbml0aWFsaXplIG1iaGMgZm9yIHRhdmlsIHBvc3Qgc3Vic3lzdGVtIHJlc3RhcnQKKyAqIEBtYmhjOiBwb25pdGVyIHRvIHdjZDkzNHhfbWJoYyBzdHJ1Y3R1cmUKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgorICoKKyAqIHJldHVybiAwIGlmIG1iaGNfaW5pdCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB0YXZpbF9tYmhjX3Bvc3Rfc3NyX2luaXQoc3RydWN0IHdjZDkzNHhfbWJoYyAqbWJoYywKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQ7CisKKwlpZiAoIW1iaGMgfHwgIWNvZGVjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdjZF9tYmhjX2RlaW5pdCgmbWJoYy0+d2NkX21iaGMpOworCXJldCA9IHdjZF9tYmhjX2luaXQoJm1iaGMtPndjZF9tYmhjLCBjb2RlYywgJm1iaGNfY2IsICZpbnRyX2lkcywKKwkJCSAgICB3Y2RfbWJoY19yZWdpc3RlcnMsIFRBVklMX1pERVRfU1VQUE9SVEVEKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtYmhjIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX0NUTF8xLCAweDA0LCAweDA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfQ1RMX0JDUywgMHgwMSwgMHgwMSk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19wb3N0X3Nzcl9pbml0KTsKKworLyoKKyAqIHRhdmlsX21iaGNfaW5pdDogaW5pdGlhbGl6ZSBtYmhjIGZvciB0YXZpbAorICogQG1iaGM6IHBvbml0ZXIgdG8gd2NkOTM0eF9tYmhjIHN0cnVjdCBwb2ludGVyIHRvIHN0b3JlIHRoZSBjb25maWdzCisgKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKKyAqIEBmd19kYXRhOiBoYW5kbGUgdG8gZmlybXdhcmUgZGF0YQorICoKKyAqIHJldHVybiAwIGlmIG1iaGNfaW5pdCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB0YXZpbF9tYmhjX2luaXQoc3RydWN0IHdjZDkzNHhfbWJoYyAqKm1iaGMsIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJICAgIHN0cnVjdCBmd19pbmZvICpmd19kYXRhKQoreworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKwlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGM7CisJaW50IHJldDsKKworCXdjZDkzNHhfbWJoYyA9IGRldm1fa3phbGxvYyhjb2RlYy0+ZGV2LCBzaXplb2Yoc3RydWN0IHdjZDkzNHhfbWJoYyksCisJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghd2NkOTM0eF9tYmhjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdjZDkzNHhfbWJoYy0+d2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXdjZDkzNHhfbWJoYy0+ZndfZGF0YSA9IGZ3X2RhdGE7CisJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZ3Y2Q5MzR4X21iaGMtPm5vdGlmaWVyKTsKKworCXJldCA9IHdjZF9tYmhjX2luaXQoJndjZDkzNHhfbWJoYy0+d2NkX21iaGMsIGNvZGVjLCAmbWJoY19jYiwgJmludHJfaWRzLAorCQkJICAgIHdjZF9tYmhjX3JlZ2lzdGVycywgVEFWSUxfWkRFVF9TVVBQT1JURUQpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlzdXBwbHkgPSB0YXZpbF9jb2RlY19maW5kX29uZGVtYW5kX3JlZ3VsYXRvcihjb2RlYywKKwkJCW9uX2RlbWFuZF9zdXBwbHlfbmFtZVtXQ0Q5MzRYX09OX0RFTUFORF9NSUNCSUFTXSk7CisJaWYgKHN1cHBseSkgeworCQl3Y2Q5MzR4X21iaGMtPm9uX2RlbWFuZF9saXN0WworCQkJV0NEOTM0WF9PTl9ERU1BTkRfTUlDQklBU10uc3VwcGx5ID0KKwkJCQlzdXBwbHk7CisJCXdjZDkzNHhfbWJoYy0+b25fZGVtYW5kX2xpc3RbCisJCQlXQ0Q5MzRYX09OX0RFTUFORF9NSUNCSUFTXS5vbmRlbWFuZF9zdXBwbHlfY291bnQgPQorCQkJCTA7CisJfQorCisJKCptYmhjKSA9IHdjZDkzNHhfbWJoYzsKKwlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgaW1wZWRhbmNlX2RldGVjdF9jb250cm9scywKKwkJCQkgICBBUlJBWV9TSVpFKGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHMpKTsKKwlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzLAorCQkJCSAgIEFSUkFZX1NJWkUoaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX0NUTF8xLCAweDA0LCAweDA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfQ1RMX0JDUywgMHgwMSwgMHgwMSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHdjZDkzNHhfbWJoYyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19pbml0KTsKKworLyoKKyAqIHRhdmlsX21iaGNfZGVpbml0OiBkZWluaXRpYWxpemUgbWJoYyBmb3IgdGF2aWwKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgorICovCit2b2lkIHRhdmlsX21iaGNfZGVpbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGMgPSB0YXZpbF9zb2NfZ2V0X21iaGMoY29kZWMpOworCisJaWYgKHdjZDkzNHhfbWJoYykgeworCQl3Y2RfbWJoY19kZWluaXQoJndjZDkzNHhfbWJoYy0+d2NkX21iaGMpOworCQlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHdjZDkzNHhfbWJoYyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkOGUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LW1iaGMuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19XQ0Q5MzRYX01CSENfSF9fCisjZGVmaW5lIF9fV0NEOTM0WF9NQkhDX0hfXworI2luY2x1ZGUgIi4uL3djZC1tYmhjLXYyLmgiCisKK2VudW0gd2NkOTM0eF9vbl9kZW1hbmRfc3VwcGx5X25hbWUgeworCVdDRDkzNFhfT05fREVNQU5EX01JQ0JJQVMgPSAwLAorCVdDRDkzNFhfT05fREVNQU5EX1NVUFBMSUVTX01BWCwKK307CisKK3N0cnVjdCB3Y2Q5MzR4X29uX2RlbWFuZF9zdXBwbHkgeworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKKwlpbnQgb25kZW1hbmRfc3VwcGx5X2NvdW50OworfTsKKworc3RydWN0IHdjZDkzNHhfbWJoYyB7CisJc3RydWN0IHdjZF9tYmhjIHdjZF9tYmhjOworCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG5vdGlmaWVyOworCXN0cnVjdCB3Y2Q5MzR4X29uX2RlbWFuZF9zdXBwbHkgb25fZGVtYW5kX2xpc3RbCisJCQlXQ0Q5MzRYX09OX0RFTUFORF9TVVBQTElFU19NQVhdOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXN0cnVjdCBmd19pbmZvICpmd19kYXRhOworCWJvb2wgbWJoY19zdGFydGVkOworCWJvb2wgaXNfaHBoX3JlY292ZXI7Cit9OworCitleHRlcm4gaW50IHRhdmlsX21iaGNfaW5pdChzdHJ1Y3Qgd2NkOTM0eF9tYmhjICoqbWJoYywKKwkJCSAgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgIHN0cnVjdCBmd19pbmZvICpmd19kYXRhKTsKK2V4dGVybiB2b2lkIHRhdmlsX21iaGNfaHNfZGV0ZWN0X2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2V4dGVybiBpbnQgdGF2aWxfbWJoY19oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnKTsKK2V4dGVybiB2b2lkIHRhdmlsX21iaGNfZGVpbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitleHRlcm4gaW50IHRhdmlsX21iaGNfcG9zdF9zc3JfaW5pdChzdHJ1Y3Qgd2NkOTM0eF9tYmhjICptYmhjLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworI2VuZGlmIC8qIF9fV0NEOTM0WF9NQkhDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtcm91dGluZy5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtcm91dGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MGZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1yb3V0aW5nLmgKQEAgLTAsMCArMSwxMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgV0NEOTM0WF9ST1VUSU5HX0gKKyNkZWZpbmUgV0NEOTM0WF9ST1VUSU5HX0gKKworI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisKK2NvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgdGF2aWxfc2xpbV9hdWRpb19tYXBbXSA9IHsKKworCS8qIFZpcnR1YWwgaW5wdXQgd2lkZ2V0cyAqLworCXsiQUlGMSBDQVAiLCBOVUxMLCAiQUlGMV9DQVAgTWl4ZXIifSwKKwl7IkFJRjIgQ0FQIiwgTlVMTCwgIkFJRjJfQ0FQIE1peGVyIn0sCisJeyJBSUYzIENBUCIsIE5VTEwsICJBSUYzX0NBUCBNaXhlciJ9LAorCXsiQUlGNCBNQUQiLCBOVUxMLCAiQUlGNF9NQUQgTWl4ZXIifSwKKworCS8qIFZpcnR1YWwgaW5wdXQgd2lkZ2V0IE1peGVyICovCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMCIsICJTTElNIFRYMCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIn0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1In0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcifSwKKwl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4In0sCisJeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDExIiwgIlNMSU0gVFgxMSJ9LAorCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlNMSU0gVFgxMyJ9LAorCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMCIsICJTTElNIFRYMCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIn0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1In0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcifSwKKwl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4In0sCisJeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDExIiwgIlNMSU0gVFgxMSJ9LAorCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlNMSU0gVFgxMyJ9LAorCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMCIsICJTTElNIFRYMCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIn0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1In0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcifSwKKwl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4In0sCisJeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDExIiwgIlNMSU0gVFgxMSJ9LAorCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlNMSU0gVFgxMyJ9LAorCisJeyJBSUY0X01BRCBNaXhlciIsICJTTElNIFRYMTMiLCAiU0xJTSBUWDEzIn0sCisKKwl7IlNMSU0gUlgwIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKKworCXsiU0xJTSBSWDAgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDEgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDIgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDMgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDQgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDUgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDYgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCXsiU0xJTSBSWDcgTVVYIiwgIkFJRjJfUEIiLCAiQUlGMiBQQiJ9LAorCisJeyJTTElNIFJYMCBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYMSBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYMiBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYMyBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNCBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNSBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNiBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisJeyJTTElNIFJYNyBNVVgiLCAiQUlGM19QQiIsICJBSUYzIFBCIn0sCisKKwl7IlNMSU0gUlgwIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgxIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgyIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlgzIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg0IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg1IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg2IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKwl7IlNMSU0gUlg3IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKKworCXsiU0xJTSBSWDAiLCBOVUxMLCAiU0xJTSBSWDAgTVVYIn0sCisJeyJTTElNIFJYMSIsIE5VTEwsICJTTElNIFJYMSBNVVgifSwKKwl7IlNMSU0gUlgyIiwgTlVMTCwgIlNMSU0gUlgyIE1VWCJ9LAorCXsiU0xJTSBSWDMiLCBOVUxMLCAiU0xJTSBSWDMgTVVYIn0sCisJeyJTTElNIFJYNCIsIE5VTEwsICJTTElNIFJYNCBNVVgifSwKKwl7IlNMSU0gUlg1IiwgTlVMTCwgIlNMSU0gUlg1IE1VWCJ9LAorCXsiU0xJTSBSWDYiLCBOVUxMLCAiU0xJTSBSWDYgTVVYIn0sCisJeyJTTElNIFJYNyIsIE5VTEwsICJTTElNIFJYNyBNVVgifSwKKworfTsKKworY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB0YXZpbF9hdWRpb19tYXBbXSA9IHsKKworCS8qIE1BRCAqLworCXsiTUFEX1NFTCBNVVgiLCAiU1BFIiwgIk1BRF9DUEVfSU5QVVQifSwKKwl7Ik1BRF9TRUwgTVVYIiwgIk1TTSIsICJNQURJTlBVVCJ9LAorCisJeyJNQURfSU5QIE1VWCIsICJNQUQiLCAiTUFEX1NFTCBNVVgifSwKKwl7Ik1BRF9JTlAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKworCXsiTUFEX0JST0FEQ0FTVCIsICJTd2l0Y2giLCAiTUFEX0lOUCBNVVgifSwKKwl7Ik1BRF9DUEUxIiwgIlN3aXRjaCIsICJNQURfSU5QIE1VWCJ9LAorCXsiTUFEX0NQRTIiLCAiU3dpdGNoIiwgIk1BRF9JTlAgTVVYIn0sCisKKwl7Ik1BRF9DUEVfT1VUMSIsIE5VTEwsICJNQURfQ1BFMSJ9LAorCXsiTUFEX0NQRV9PVVQyIiwgTlVMTCwgIk1BRF9DUEUyIn0sCisKKwkvKiBWSSBGZWVkYmFjayAqLworCXsiQUlGNF9WSSBNaXhlciIsICJTUEtSX1ZJXzEiLCAiVklJTlBVVCJ9LAorCXsiQUlGNF9WSSBNaXhlciIsICJTUEtSX1ZJXzIiLCAiVklJTlBVVCJ9LAorCXsiQUlGNCBWSSIsIE5VTEwsICJBSUY0X1ZJIE1peGVyIn0sCisKKwkvKiBDREMgVHggaW50ZXJmYWNlIHdpdGggU0xJTUJVUyAqLworCXsiU0xJTSBUWDAiLCBOVUxMLCAiQ0RDX0lGIFRYMCBNVVgifSwKKwl7IlNMSU0gVFgxIiwgTlVMTCwgIkNEQ19JRiBUWDEgTVVYIn0sCisJeyJTTElNIFRYMiIsIE5VTEwsICJDRENfSUYgVFgyIE1VWCJ9LAorCXsiU0xJTSBUWDMiLCBOVUxMLCAiQ0RDX0lGIFRYMyBNVVgifSwKKwl7IlNMSU0gVFg0IiwgTlVMTCwgIkNEQ19JRiBUWDQgTVVYIn0sCisJeyJTTElNIFRYNSIsIE5VTEwsICJDRENfSUYgVFg1IE1VWCJ9LAorCXsiU0xJTSBUWDYiLCBOVUxMLCAiQ0RDX0lGIFRYNiBNVVgifSwKKwl7IlNMSU0gVFg3IiwgTlVMTCwgIkNEQ19JRiBUWDcgTVVYIn0sCisJeyJTTElNIFRYOCIsIE5VTEwsICJDRENfSUYgVFg4IE1VWCJ9LAorCXsiU0xJTSBUWDkiLCBOVUxMLCAiQ0RDX0lGIFRYOSBNVVgifSwKKwl7IlNMSU0gVFgxMCIsIE5VTEwsICJDRENfSUYgVFgxMCBNVVgifSwKKwl7IlNMSU0gVFgxMSIsIE5VTEwsICJDRENfSUYgVFgxMSBNVVgifSwKKwl7IlNMSU0gVFgxMyIsIE5VTEwsICJDRENfSUYgVFgxMyBNVVgifSwKKworCXsiQ0RDX0lGIFRYMCBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiQ0RDX0lGIFRYMCBNVVgiLCAiUlhfTUlYX1RYMCIsICJSWCBNSVggVFgwIE1VWCJ9LAorCXsiQ0RDX0lGIFRYMCBNVVgiLCAiREVDMF8xOTIiLCAiQURDIFVTIE1VWDAifSwKKworCXsiQ0RDX0lGIFRYMSBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiQ0RDX0lGIFRYMSBNVVgiLCAiUlhfTUlYX1RYMSIsICJSWCBNSVggVFgxIE1VWCJ9LAorCXsiQ0RDX0lGIFRYMSBNVVgiLCAiREVDMV8xOTIiLCAiQURDIFVTIE1VWDEifSwKKworCXsiQ0RDX0lGIFRYMiBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiQ0RDX0lGIFRYMiBNVVgiLCAiUlhfTUlYX1RYMiIsICJSWCBNSVggVFgyIE1VWCJ9LAorCXsiQ0RDX0lGIFRYMiBNVVgiLCAiREVDMl8xOTIiLCAiQURDIFVTIE1VWDIifSwKKworCXsiQ0RDX0lGIFRYMyBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiQ0RDX0lGIFRYMyBNVVgiLCAiUlhfTUlYX1RYMyIsICJSWCBNSVggVFgzIE1VWCJ9LAorCXsiQ0RDX0lGIFRYMyBNVVgiLCAiREVDM18xOTIiLCAiQURDIFVTIE1VWDMifSwKKworCXsiQ0RDX0lGIFRYNCBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiQ0RDX0lGIFRYNCBNVVgiLCAiUlhfTUlYX1RYNCIsICJSWCBNSVggVFg0IE1VWCJ9LAorCXsiQ0RDX0lGIFRYNCBNVVgiLCAiREVDNF8xOTIiLCAiQURDIFVTIE1VWDQifSwKKworCXsiQ0RDX0lGIFRYNSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiQ0RDX0lGIFRYNSBNVVgiLCAiUlhfTUlYX1RYNSIsICJSWCBNSVggVFg1IE1VWCJ9LAorCXsiQ0RDX0lGIFRYNSBNVVgiLCAiREVDNV8xOTIiLCAiQURDIFVTIE1VWDUifSwKKworCXsiQ0RDX0lGIFRYNiBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiQ0RDX0lGIFRYNiBNVVgiLCAiUlhfTUlYX1RYNiIsICJSWCBNSVggVFg2IE1VWCJ9LAorCXsiQ0RDX0lGIFRYNiBNVVgiLCAiREVDNl8xOTIiLCAiQURDIFVTIE1VWDYifSwKKworCXsiQ0RDX0lGIFRYNyBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiQ0RDX0lGIFRYNyBNVVgiLCAiUlhfTUlYX1RYNyIsICJSWCBNSVggVFg3IE1VWCJ9LAorCXsiQ0RDX0lGIFRYNyBNVVgiLCAiREVDN18xOTIiLCAiQURDIFVTIE1VWDcifSwKKworCXsiQ0RDX0lGIFRYOCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiQ0RDX0lGIFRYOCBNVVgiLCAiUlhfTUlYX1RYOCIsICJSWCBNSVggVFg4IE1VWCJ9LAorCXsiQ0RDX0lGIFRYOCBNVVgiLCAiREVDOF8xOTIiLCAiQURDIFVTIE1VWDgifSwKKworCXsiQ0RDX0lGIFRYOSBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiQ0RDX0lGIFRYOSBNVVgiLCAiREVDN18xOTIiLCAiQURDIFVTIE1VWDcifSwKKwl7IkNEQ19JRiBUWDEwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJDRENfSUYgVFgxMCBNVVgiLCAiREVDNl8xOTIiLCAiQURDIFVTIE1VWDYifSwKKworCXsiQ0RDX0lGIFRYMTEgTVVYIiwgIkRFQ18wXzUiLCAiQ0RDX0lGIFRYMTEgSU5QMSBNVVgifSwKKwl7IkNEQ19JRiBUWDExIE1VWCIsICJERUNfOV8xMiIsICJDRENfSUYgVFgxMSBJTlAxIE1VWCJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiQ0RDX0lGIFRYMTEgSU5QMSBNVVgiLCAiUlhfTUlYX1RYNSIsICJSWCBNSVggVFg1IE1VWCJ9LAorCisJeyJDRENfSUYgVFgxMyBNVVgiLCAiTUFEX0JSRENTVCIsICJNQURfQlJPQURDQVNUIn0sCisJeyJDRENfSUYgVFgxMyBNVVgiLCAiQ0RDX0RFQ181IiwgIkNEQ19JRiBUWDEzIElOUDEgTVVYIn0sCisJeyJDRENfSUYgVFgxMyBJTlAxIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJDRENfSUYgVFgxMyBJTlAxIE1VWCIsICJERUM1XzE5MiIsICJBREMgVVMgTVVYNSJ9LAorCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAorCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKKwl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAorCisJeyJBREMgVVMgTVVYMCIsICJVU19Td2l0Y2giLCAiQURDIE1VWDAifSwKKwl7IkFEQyBVUyBNVVgxIiwgIlVTX1N3aXRjaCIsICJBREMgTVVYMSJ9LAorCXsiQURDIFVTIE1VWDIiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgyIn0sCisJeyJBREMgVVMgTVVYMyIsICJVU19Td2l0Y2giLCAiQURDIE1VWDMifSwKKwl7IkFEQyBVUyBNVVg0IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYNCJ9LAorCXsiQURDIFVTIE1VWDUiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg1In0sCisJeyJBREMgVVMgTVVYNiIsICJVU19Td2l0Y2giLCAiQURDIE1VWDYifSwKKwl7IkFEQyBVUyBNVVg3IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYNyJ9LAorCXsiQURDIFVTIE1VWDgiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg4In0sCisKKwl7IkFEQyBNVVgwIiwgIkRNSUMiLCAiRE1JQyBNVVgwIn0sCisJeyJBREMgTVVYMCIsICJBTUlDIiwgIkFNSUMgTVVYMCJ9LAorCXsiQURDIE1VWDEiLCAiRE1JQyIsICJETUlDIE1VWDEifSwKKwl7IkFEQyBNVVgxIiwgIkFNSUMiLCAiQU1JQyBNVVgxIn0sCisJeyJBREMgTVVYMiIsICJETUlDIiwgIkRNSUMgTVVYMiJ9LAorCXsiQURDIE1VWDIiLCAiQU1JQyIsICJBTUlDIE1VWDIifSwKKwl7IkFEQyBNVVgzIiwgIkRNSUMiLCAiRE1JQyBNVVgzIn0sCisJeyJBREMgTVVYMyIsICJBTUlDIiwgIkFNSUMgTVVYMyJ9LAorCXsiQURDIE1VWDQiLCAiRE1JQyIsICJETUlDIE1VWDQifSwKKwl7IkFEQyBNVVg0IiwgIkFNSUMiLCAiQU1JQyBNVVg0In0sCisJeyJBREMgTVVYNSIsICJETUlDIiwgIkRNSUMgTVVYNSJ9LAorCXsiQURDIE1VWDUiLCAiQU1JQyIsICJBTUlDIE1VWDUifSwKKwl7IkFEQyBNVVg2IiwgIkRNSUMiLCAiRE1JQyBNVVg2In0sCisJeyJBREMgTVVYNiIsICJBTUlDIiwgIkFNSUMgTVVYNiJ9LAorCXsiQURDIE1VWDciLCAiRE1JQyIsICJETUlDIE1VWDcifSwKKwl7IkFEQyBNVVg3IiwgIkFNSUMiLCAiQU1JQyBNVVg3In0sCisJeyJBREMgTVVYOCIsICJETUlDIiwgIkRNSUMgTVVYOCJ9LAorCXsiQURDIE1VWDgiLCAiQU1JQyIsICJBTUlDIE1VWDgifSwKKwl7IkFEQyBNVVgxMCIsICJETUlDIiwgIkRNSUMgTVVYMTAifSwKKwl7IkFEQyBNVVgxMCIsICJBTUlDIiwgIkFNSUMgTVVYMTAifSwKKwl7IkFEQyBNVVgxMSIsICJETUlDIiwgIkRNSUMgTVVYMTEifSwKKwl7IkFEQyBNVVgxMSIsICJBTUlDIiwgIkFNSUMgTVVYMTEifSwKKwl7IkFEQyBNVVgxMiIsICJETUlDIiwgIkRNSUMgTVVYMTIifSwKKwl7IkFEQyBNVVgxMiIsICJBTUlDIiwgIkFNSUMgTVVYMTIifSwKKwl7IkFEQyBNVVgxMyIsICJETUlDIiwgIkRNSUMgTVVYMTMifSwKKwl7IkFEQyBNVVgxMyIsICJBTUlDIiwgIkFNSUMgTVVYMTMifSwKKworCXsiQURDIE1VWDAiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDAiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDAiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDAiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDEiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDEiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDEiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDEiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDIiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDIiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDIiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDIiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDMiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDMiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDMiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDMiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDQiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDQiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDQiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDQiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDUiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDUiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDUiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDUiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDYiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDYiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDYiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDYiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDciLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDciLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDciLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDciLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCXsiQURDIE1VWDgiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMCJ9LAorCXsiQURDIE1VWDgiLCAiQU5DX0ZCX1RVTkUxIiwgIkFEQyBNVVgxMSJ9LAorCXsiQURDIE1VWDgiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMiJ9LAorCXsiQURDIE1VWDgiLCAiQU5DX0ZCX1RVTkUyIiwgIkFEQyBNVVgxMyJ9LAorCisJeyJETUlDIE1VWDAiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYMCIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVgwIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDAiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYMCIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVgwIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDAiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDAiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDAiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDAiLCAiQURDNCIsICJBREM0In0sCisKKwl7IkRNSUMgTVVYMSIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVgxIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDEiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYMSIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVgxIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDEiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYMSIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYMSIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMSIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYMSIsICJBREM0IiwgIkFEQzQifSwKKworCXsiRE1JQyBNVVgyIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDIiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYMiIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVgyIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDIiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYMiIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVgyIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgyIiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVgyIiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVgyIiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDMiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYMyIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVgzIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDMiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYMyIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVgzIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDMiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDMiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDMiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDMiLCAiQURDNCIsICJBREM0In0sCisKKwl7IkRNSUMgTVVYNCIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVg0IiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDQiLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYNCIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVg0IiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDQiLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYNCIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYNCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYNCIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYNCIsICJBREM0IiwgIkFEQzQifSwKKworCXsiRE1JQyBNVVg1IiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDUiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYNSIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVg1IiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDUiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYNSIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVg1IiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVg1IiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVg1IiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVg1IiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDYiLCAiRE1JQzAiLCAiRE1JQzAifSwKKwl7IkRNSUMgTVVYNiIsICJETUlDMSIsICJETUlDMSJ9LAorCXsiRE1JQyBNVVg2IiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDYiLCAiRE1JQzMiLCAiRE1JQzMifSwKKwl7IkRNSUMgTVVYNiIsICJETUlDNCIsICJETUlDNCJ9LAorCXsiRE1JQyBNVVg2IiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDYiLCAiQURDMSIsICJBREMxIn0sCisJeyJBTUlDIE1VWDYiLCAiQURDMiIsICJBREMyIn0sCisJeyJBTUlDIE1VWDYiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDYiLCAiQURDNCIsICJBREM0In0sCisKKwl7IkRNSUMgTVVYNyIsICJETUlDMCIsICJETUlDMCJ9LAorCXsiRE1JQyBNVVg3IiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDciLCAiRE1JQzIiLCAiRE1JQzIifSwKKwl7IkRNSUMgTVVYNyIsICJETUlDMyIsICJETUlDMyJ9LAorCXsiRE1JQyBNVVg3IiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDciLCAiRE1JQzUiLCAiRE1JQzUifSwKKwl7IkFNSUMgTVVYNyIsICJBREMxIiwgIkFEQzEifSwKKwl7IkFNSUMgTVVYNyIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYNyIsICJBREMzIiwgIkFEQzMifSwKKwl7IkFNSUMgTVVYNyIsICJBREM0IiwgIkFEQzQifSwKKworCXsiRE1JQyBNVVg4IiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDgiLCAiRE1JQzEiLCAiRE1JQzEifSwKKwl7IkRNSUMgTVVYOCIsICJETUlDMiIsICJETUlDMiJ9LAorCXsiRE1JQyBNVVg4IiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDgiLCAiRE1JQzQiLCAiRE1JQzQifSwKKwl7IkRNSUMgTVVYOCIsICJETUlDNSIsICJETUlDNSJ9LAorCXsiQU1JQyBNVVg4IiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVg4IiwgIkFEQzIiLCAiQURDMiJ9LAorCXsiQU1JQyBNVVg4IiwgIkFEQzMiLCAiQURDMyJ9LAorCXsiQU1JQyBNVVg4IiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDEwIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDEwIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDEwIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDEwIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDEwIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDEwIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDEwIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxMCIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMTAiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDEwIiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDExIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDExIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDExIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDExIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDExIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDExIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDExIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxMSIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMTEiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDExIiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDEyIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDEyIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDEyIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxMiIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMTIiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDEyIiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJETUlDIE1VWDEzIiwgIkRNSUMwIiwgIkRNSUMwIn0sCisJeyJETUlDIE1VWDEzIiwgIkRNSUMxIiwgIkRNSUMxIn0sCisJeyJETUlDIE1VWDEzIiwgIkRNSUMyIiwgIkRNSUMyIn0sCisJeyJETUlDIE1VWDEzIiwgIkRNSUMzIiwgIkRNSUMzIn0sCisJeyJETUlDIE1VWDEzIiwgIkRNSUM0IiwgIkRNSUM0In0sCisJeyJETUlDIE1VWDEzIiwgIkRNSUM1IiwgIkRNSUM1In0sCisJeyJBTUlDIE1VWDEzIiwgIkFEQzEiLCAiQURDMSJ9LAorCXsiQU1JQyBNVVgxMyIsICJBREMyIiwgIkFEQzIifSwKKwl7IkFNSUMgTVVYMTMiLCAiQURDMyIsICJBREMzIn0sCisJeyJBTUlDIE1VWDEzIiwgIkFEQzQiLCAiQURDNCJ9LAorCisJeyJBTUlDNF81IFNFTCIsICJBTUlDNCIsICJBTUlDNCJ9LAorCXsiQU1JQzRfNSBTRUwiLCAiQU1JQzUiLCAiQU1JQzUifSwKKworCXsiQURDMSIsIE5VTEwsICJBTUlDMSJ9LAorCXsiQURDMiIsIE5VTEwsICJBTUlDMiJ9LAorCXsiQURDMyIsIE5VTEwsICJBTUlDMyJ9LAorCXsiQURDNCIsIE5VTEwsICJBTUlDNF81IFNFTCJ9LAorCisJLyogQ0RDIFJ4IGludGVyZmFjZSB3aXRoIFNMSU1CVVMgKi8KKwl7IkNEQ19JRiBSWDAgTVVYIiwgIlNMSU0gUlgwIiwgIlNMSU0gUlgwIn0sCisJeyJDRENfSUYgUlgxIE1VWCIsICJTTElNIFJYMSIsICJTTElNIFJYMSJ9LAorCXsiQ0RDX0lGIFJYMiBNVVgiLCAiU0xJTSBSWDIiLCAiU0xJTSBSWDIifSwKKwl7IkNEQ19JRiBSWDMgTVVYIiwgIlNMSU0gUlgzIiwgIlNMSU0gUlgzIn0sCisJeyJDRENfSUYgUlg0IE1VWCIsICJTTElNIFJYNCIsICJTTElNIFJYNCJ9LAorCXsiQ0RDX0lGIFJYNSBNVVgiLCAiU0xJTSBSWDUiLCAiU0xJTSBSWDUifSwKKwl7IkNEQ19JRiBSWDYgTVVYIiwgIlNMSU0gUlg2IiwgIlNMSU0gUlg2In0sCisJeyJDRENfSUYgUlg3IE1VWCIsICJTTElNIFJYNyIsICJTTElNIFJYNyJ9LAorCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKworCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCisKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKKworCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAorCisJeyJSWCBJTlQwXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQwXzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQwXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQwXzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQwXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQwXzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQxXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQxXzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQxXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQxXzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQxXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQxXzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQyXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQyXzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQyXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQyXzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQyXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQyXzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQzXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQzXzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQzXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQzXzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQzXzEgTUlYMSIsIE5VTEwsICJSWCBJTlQzXzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ0XzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ0XzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQ0XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ0XzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ3XzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ3XzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQ3XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ3XzEgTUlYMSBJTlAyIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ4XzEgTUlYMSBJTlAwIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ4XzEgTUlYMSBJTlAxIn0sCisJeyJSWCBJTlQ4XzEgTUlYMSIsIE5VTEwsICJSWCBJTlQ4XzEgTUlYMSBJTlAyIn0sCisKKwkvKiBNaXhpbmcgcGF0aCBJTlQwICovCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDBfMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDBfMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQwXzIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UMF8yIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDAgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQwXzIgTVVYIn0sCisKKwkvKiBNaXhpbmcgcGF0aCBJTlQxICovCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDFfMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDFfMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQxXzIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UMV8yIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDFfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMV8yIE1VWCJ9LAorCXsiUlggSU5UMSBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDFfMiBJTlRFUlAifSwKKworCS8qIE1peGluZyBwYXRoIElOVDIgKi8KKwl7IlJYIElOVDJfMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UMl8yIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDJfMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UMl8yIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDJfMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQyXzIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UMl8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQyXzIgTVVYIn0sCisJeyJSWCBJTlQyIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMl8yIElOVEVSUCJ9LAorCisJLyogTWl4aW5nIHBhdGggSU5UMyAqLworCXsiUlggSU5UM18yIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDNfMiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQzXzIgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UM18yIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDNfMiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQzXzIgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UM18yIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDNfMiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQzXzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDNfMiBNVVgifSwKKwl7IlJYIElOVDMgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQzXzIgSU5URVJQIn0sCisKKwkvKiBNaXhpbmcgcGF0aCBJTlQ0ICovCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IlJYIElOVDRfMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IlJYIElOVDRfMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJSWCBJTlQ0XzIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiUlggSU5UNF8yIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IlJYIElOVDRfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNF8yIE1VWCJ9LAorCXsiUlggSU5UNCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDRfMiBJTlRFUlAifSwKKworCS8qIE1peGluZyBwYXRoIElOVDcgKi8KKwl7IlJYIElOVDdfMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiUlggSU5UN18yIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IlJYIElOVDdfMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiUlggSU5UN18yIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IlJYIElOVDdfMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJSWCBJTlQ3XzIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiUlggSU5UN18yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ3XzIgTVVYIn0sCisJeyJSWCBJTlQ3IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UN18yIElOVEVSUCJ9LAorCisJLyogTWl4aW5nIHBhdGggSU5UOCAqLworCXsiUlggSU5UOF8yIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IlJYIElOVDhfMiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiUlggSU5UOF8yIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IlJYIElOVDhfMiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJSWCBJTlQ4XzIgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiUlggSU5UOF8yIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IlJYIElOVDhfMiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJSWCBJTlQ4XzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDhfMiBNVVgifSwKKwl7IlJYIElOVDggU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ4XzIgSU5URVJQIn0sCisKKwl7IlJYIElOVDBfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEifSwKKwl7IlJYIElOVDAgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQwXzEgSU5URVJQIn0sCisJeyJSWCBJTlQwIE1JWDIiLCBOVUxMLCAiUlggSU5UMCBTRUMgTUlYIn0sCisJeyJSWCBJTlQwIE1JWDIiLCBOVUxMLCAiUlggSU5UMCBNSVgyIElOUCJ9LAorCXsiUlggSU5UMCBERU0gTVVYIiwgIkNMU0hfRFNNX09VVCIsICJSWCBJTlQwIE1JWDIifSwKKwl7IlJYIElOVDAgREFDIiwgTlVMTCwgIlJYIElOVDAgREVNIE1VWCJ9LAorCXsiUlggSU5UMCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiRUFSIFBBIiwgTlVMTCwgIlJYIElOVDAgREFDIn0sCisJeyJFQVIiLCBOVUxMLCAiRUFSIFBBIn0sCisKKwl7IlJYIElOVDFfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEifSwKKwl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxXzEgSU5URVJQIn0sCisJeyJSWCBJTlQxIE1JWDIiLCBOVUxMLCAiUlggSU5UMSBTRUMgTUlYIn0sCisJeyJSWCBJTlQxIE1JWDIiLCBOVUxMLCAiUlggSU5UMSBNSVgyIElOUCJ9LAorCXsiUlggSU5UMSBNSVgzIiwgTlVMTCwgIlJYIElOVDEgTUlYMiJ9LAorCXsiUlggSU5UMSBERU0gTVVYIiwgIkNMU0hfRFNNX09VVCIsICJSWCBJTlQxIE1JWDMifSwKKwl7IlJYIElOVDEgREFDIiwgTlVMTCwgIlJYIElOVDEgREVNIE1VWCJ9LAorCXsiUlggSU5UMSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiSFBITCBQQSIsIE5VTEwsICJSWCBJTlQxIERBQyJ9LAorCXsiSFBITCIsIE5VTEwsICJIUEhMIFBBIn0sCisKKwl7IlJYIElOVDJfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEifSwKKwl7IlJYIElOVDIgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQyXzEgSU5URVJQIn0sCisJeyJSWCBJTlQyIE1JWDIiLCBOVUxMLCAiUlggSU5UMiBTRUMgTUlYIn0sCisJeyJSWCBJTlQyIE1JWDIiLCBOVUxMLCAiUlggSU5UMiBNSVgyIElOUCJ9LAorCXsiUlggSU5UMiBNSVgzIiwgTlVMTCwgIlJYIElOVDIgTUlYMiJ9LAorCXsiUlggSU5UMiBERU0gTVVYIiwgIkNMU0hfRFNNX09VVCIsICJSWCBJTlQyIE1JWDMifSwKKwl7IlJYIElOVDIgREFDIiwgTlVMTCwgIlJYIElOVDIgREVNIE1VWCJ9LAorCXsiUlggSU5UMiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiSFBIUiBQQSIsIE5VTEwsICJSWCBJTlQyIERBQyJ9LAorCXsiSFBIUiIsIE5VTEwsICJIUEhSIFBBIn0sCisKKwl7IlJYIElOVDNfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEifSwKKwl7IlJYIElOVDMgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQzXzEgSU5URVJQIn0sCisJeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBTRUMgTUlYIn0sCisJeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBNSVgyIElOUCJ9LAorCXsiUlggSU5UMyBEQUMiLCBOVUxMLCAiUlggSU5UMyBNSVgyIn0sCisJeyJSWCBJTlQzIERBQyIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJMSU5FT1VUMSBQQSIsIE5VTEwsICJSWCBJTlQzIERBQyJ9LAorCXsiTElORU9VVDEiLCBOVUxMLCAiTElORU9VVDEgUEEifSwKKworCXsiUlggSU5UNF8xIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ0XzEgTUlYMSJ9LAorCXsiUlggSU5UNCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDRfMSBJTlRFUlAifSwKKwl7IlJYIElOVDQgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzEgTUlYMSJ9LAorCXsiUlggSU5UNCBNSVgyIiwgTlVMTCwgIlJYIElOVDQgU0VDIE1JWCJ9LAorCXsiUlggSU5UNCBNSVgyIiwgTlVMTCwgIlJYIElOVDQgTUlYMiBJTlAifSwKKwl7IlJYIElOVDQgREFDIiwgTlVMTCwgIlJYIElOVDQgTUlYMiJ9LAorCXsiUlggSU5UNCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiTElORU9VVDIgUEEiLCBOVUxMLCAiUlggSU5UNCBEQUMifSwKKwl7IkxJTkVPVVQyIiwgTlVMTCwgIkxJTkVPVVQyIFBBIn0sCisKKwl7IlJYIElOVDdfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEifSwKKwl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ3XzEgSU5URVJQIn0sCisJeyJSWCBJTlQ3IE1JWDIiLCBOVUxMLCAiUlggSU5UNyBTRUMgTUlYIn0sCisJeyJSWCBJTlQ3IE1JWDIiLCBOVUxMLCAiUlggSU5UNyBNSVgyIElOUCJ9LAorCXsiUlggSU5UNyBDSEFJTiIsIE5VTEwsICJSWCBJTlQ3IE1JWDIifSwKKwl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlhfQklBUyJ9LAorCXsiU1BLMSBPVVQiLCBOVUxMLCAiUlggSU5UNyBDSEFJTiJ9LAorCisJeyJSWCBJTlQ4XzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIn0sCisJeyJSWCBJTlQ4IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UOF8xIElOVEVSUCJ9LAorCXsiUlggSU5UOCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIn0sCisJeyJSWCBJTlQ4IENIQUlOIiwgTlVMTCwgIlJYIElOVDggU0VDIE1JWCJ9LAorCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWF9CSUFTIn0sCisJeyJTUEsyIE9VVCIsIE5VTEwsICJSWCBJTlQ4IENIQUlOIn0sCisKKwkvKiBBTkMgUm91dGluZyAqLworCXsiQU5DMCBGQiBNVVgiLCAiQU5DX0lOX0VBUiIsICJSWCBJTlQwIE1JWDIifSwKKwl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9IUEhMIiwgIlJYIElOVDEgTUlYMiJ9LAorCXsiQU5DMCBGQiBNVVgiLCAiQU5DX0lOX0xPMSIsICJSWCBJTlQzIE1JWDIifSwKKwl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9FQVJfU1BLUiIsICJSWCBJTlQ3IE1JWDIifSwKKwl7IkFOQzEgRkIgTVVYIiwgIkFOQ19JTl9IUEhSIiwgIlJYIElOVDIgTUlYMiJ9LAorCXsiQU5DMSBGQiBNVVgiLCAiQU5DX0lOX0xPMiIsICJSWCBJTlQ0IE1JWDIifSwKKworCXsiQU5DIE9VVCBFQVIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKKwl7IkFOQyBPVVQgRUFSIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDExIn0sCisJeyJSWCBJTlQwIE1JWDIiLCBOVUxMLCAiQU5DIE9VVCBFQVIgRW5hYmxlIn0sCisKKwl7IkFOQyBFQVIgUEEiLCBOVUxMLCAiUlggSU5UMCBEQUMifSwKKwl7IkFOQyBFQVIiLCBOVUxMLCAiQU5DIEVBUiBQQSJ9LAorCisJeyJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEwIn0sCisJeyJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDExIn0sCisJeyJSWCBJTlQ3IE1JWDIiLCBOVUxMLCAiQU5DIE9VVCBFQVIgU1BLUiBFbmFibGUifSwKKworCXsiQU5DIFNQS1IgUEEgRW5hYmxlIiwgIlN3aXRjaCIsICJSWCBJTlQ3IENIQUlOIn0sCisJeyJBTkMgU1BLMSBQQSIsIE5VTEwsICJBTkMgU1BLUiBQQSBFbmFibGUifSwKKwl7IlNQSzEgT1VUIiwgTlVMTCwgIkFOQyBTUEsxIFBBIn0sCisKKwkvKgorCSAqIFNSQzAsIFNSQzEgaW5wdXRzIHRvIFNpZGV0b25lIFJYIE1peGVyCisJICogb24gUlgwLCBSWDEsIFJYMiwgUlgzLCBSWDQgYW5kIFJYNyBjaGFpbnMKKwkgKi8KKwl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAwIE1VWCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIwIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJJSVIwIElOUDAgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiSUlSMCBJTlAwIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IklJUjAgSU5QMCBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJJSVIwIiwgTlVMTCwgIklJUjAgSU5QMSBNVVgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJJSVIwIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiSUlSMCBJTlAxIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IklJUjAgSU5QMSBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJJSVIwIElOUDEgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiSUlSMCIsIE5VTEwsICJJSVIwIElOUDIgTVVYIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJJSVIwIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IklJUjAgSU5QMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJJSVIwIElOUDIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiSUlSMCBJTlAyIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAzIE1VWCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIwIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJJSVIwIElOUDMgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiSUlSMCBJTlAzIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IklJUjAgSU5QMyBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisKKwl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAwIE1VWCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIxIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJJSVIxIElOUDAgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiSUlSMSBJTlAwIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IklJUjEgSU5QMCBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisJeyJJSVIxIiwgTlVMTCwgIklJUjEgSU5QMSBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCisJeyJJSVIxIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAorCXsiSUlSMSBJTlAxIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKKwl7IklJUjEgSU5QMSBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCisJeyJJSVIxIElOUDEgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAorCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDIgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKKwl7IklJUjEgSU5QMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCisJeyJJSVIxIElOUDIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAorCXsiSUlSMSBJTlAyIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKKwl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAzIE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCisJeyJJSVIxIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCisJeyJJSVIxIElOUDMgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAorCXsiSUlSMSBJTlAzIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKKwl7IklJUjEgSU5QMyBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCisKKwl7IlNSQzAiLCBOVUxMLCAiSUlSMCJ9LAorCXsiU1JDMSIsIE5VTEwsICJJSVIxIn0sCisJeyJSWCBJTlQwIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAorCXsiUlggSU5UMCBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKKwl7IlJYIElOVDEgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCisJeyJSWCBJTlQxIE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAorCXsiUlggSU5UMiBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKKwl7IlJYIElOVDIgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCisJeyJSWCBJTlQzIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAorCXsiUlggSU5UMyBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKKwl7IlJYIElOVDQgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCisJeyJSWCBJTlQ0IE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAorCXsiUlggSU5UNyBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKKwl7IlJYIElOVDcgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCisKKwkvKiBOYXRpdmUgY2xrIG1haW4gcGF0aCByb3V0aW5nICovCisJeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQxXzEgTUlYMSJ9LAorCXsiUlggSU5UMV8xIElOVEVSUCIsIE5VTEwsICJSWCBJTlQxXzEgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UMV8xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMSBOQVRJVkUgU1VQUExZIn0sCisKKwl7IlJYIElOVDJfMSBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDJfMSBNSVgxIn0sCisJeyJSWCBJTlQyXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDJfMSBOQVRJVkUgTVVYIn0sCisJeyJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKKworCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UM18xIE1JWDEifSwKKwl7IlJYIElOVDNfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UM18xIE5BVElWRSBNVVgifSwKKwl7IlJYIElOVDNfMSBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDMgTkFUSVZFIFNVUFBMWSJ9LAorCisJeyJSWCBJTlQ0XzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQ0XzEgTUlYMSJ9LAorCXsiUlggSU5UNF8xIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ0XzEgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UNF8xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UNCBOQVRJVkUgU1VQUExZIn0sCisKKwkvKiBOYXRpdmUgY2xrIG1peCBwYXRoIHJvdXRpbmcgKi8KKwl7IlJYIElOVDFfMiBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDFfMiBNVVgifSwKKwl7IlJYIElOVDFfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMV8yIE5BVElWRSBNVVgifSwKKwl7IlJYIElOVDFfMiBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDEgTkFUSVZFIFNVUFBMWSJ9LAorCisJeyJSWCBJTlQyXzIgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQyXzIgTVVYIn0sCisJeyJSWCBJTlQyXzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDJfMiBOQVRJVkUgTVVYIn0sCisJeyJSWCBJTlQyXzIgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKKworCXsiUlggSU5UM18yIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UM18yIE1VWCJ9LAorCXsiUlggSU5UM18yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQzXzIgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UM18yIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMyBOQVRJVkUgU1VQUExZIn0sCisKKwl7IlJYIElOVDRfMiBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDRfMiBNVVgifSwKKwl7IlJYIElOVDRfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNF8yIE5BVElWRSBNVVgifSwKKwl7IlJYIElOVDRfMiBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDQgTkFUSVZFIFNVUFBMWSJ9LAorCisJeyJSWCBJTlQ3XzIgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQ3XzIgTVVYIn0sCisJeyJSWCBJTlQ3XzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDdfMiBOQVRJVkUgTVVYIn0sCisJeyJSWCBJTlQ3XzIgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQ3IE5BVElWRSBTVVBQTFkifSwKKworCXsiUlggSU5UOF8yIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UOF8yIE1VWCJ9LAorCXsiUlggSU5UOF8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ4XzIgTkFUSVZFIE1VWCJ9LAorCXsiUlggSU5UOF8yIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UOCBOQVRJVkUgU1VQUExZIn0sCisKKwkvKiBBU1JDIFJvdXRpbmcgKi8KKwl7IkFTUkMwIE1VWCIsICJBU1JDX0lOX0hQSEwiLCAiUlggSU5UMV8yIElOVEVSUCJ9LAorCXsiUlggSU5UMSBTRUMgTUlYIiwgIkhQSEwgU3dpdGNoIiwgIkFTUkMwIE1VWCJ9LAorCisJeyJBU1JDMSBNVVgiLCAiQVNSQ19JTl9IUEhSIiwgIlJYIElOVDJfMiBJTlRFUlAifSwKKwl7IlJYIElOVDIgU0VDIE1JWCIsICJIUEhSIFN3aXRjaCIsICJBU1JDMSBNVVgifSwKKworCXsiQVNSQzAgTVVYIiwgIkFTUkNfSU5fTE8xIiwgIlJYIElOVDNfMiBJTlRFUlAifSwKKwl7IlJYIElOVDMgU0VDIE1JWCIsICJMTzEgU3dpdGNoIiwgIkFTUkMwIE1VWCJ9LAorCisJeyJBU1JDMSBNVVgiLCAiQVNSQ19JTl9MTzIiLCAiUlggSU5UNF8yIElOVEVSUCJ9LAorCXsiUlggSU5UNCBTRUMgTUlYIiwgIkxPMiBTd2l0Y2giLCAiQVNSQzEgTVVYIn0sCisKKwl7IkFTUkMyIE1VWCIsICJBU1JDX0lOX1NQS1IxIiwgIlJYIElOVDdfMiBJTlRFUlAifSwKKwl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJBU1JDMiBNVVgifSwKKworCXsiQVNSQzMgTVVYIiwgIkFTUkNfSU5fU1BLUjIiLCAiUlggSU5UOF8yIElOVEVSUCJ9LAorCXsiUlggSU5UOCBTRUMgTUlYIiwgTlVMTCwgIkFTUkMzIE1VWCJ9LAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2MxNTkzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguYwpAQCAtMCwwICsxLDk3NTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4X3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5MzR4L3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3N3ci13Y2QuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSAid2NkOTM0eC5oIgorI2luY2x1ZGUgIndjZDkzNHgtbWJoYy5oIgorI2luY2x1ZGUgIndjZDkzNHgtcm91dGluZy5oIgorI2luY2x1ZGUgIndjZDkzNHgtZHNwLWNudGwuaCIKKyNpbmNsdWRlICIuLi93Y2Q5eHh4LWNvbW1vbi12Mi5oIgorI2luY2x1ZGUgIi4uL3djZDl4eHgtcmVzbWdyLXYyLmgiCisjaW5jbHVkZSAiLi4vd2NkY2FsLWh3ZGVwLmgiCisjaW5jbHVkZSAid2NkOTM0eC1kc2QuaCIKKworI2RlZmluZSBXQ0Q5MzRYX1JBVEVTX01BU0sgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8XAorCQkJICAgIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfFwKKwkJCSAgICBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCB8XAorCQkJICAgIFNORFJWX1BDTV9SQVRFXzM4NDAwMCkKKy8qIEZyYWN0aW9uYWwgUmF0ZXMgKi8KKyNkZWZpbmUgV0NEOTM0WF9GUkFDX1JBVEVTX01BU0sgKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTc2NDAwKQorCisjZGVmaW5lIFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKKyNkZWZpbmUgV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisjZGVmaW5lIFdDRDkzNFhfRk9STUFUU19TMTZfTEUgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFKQorCisvKiBNYWNyb3MgZm9yIHBhY2tpbmcgcmVnaXN0ZXIgd3JpdGVzIGludG8gYSBVMzIgKi8KKyNkZWZpbmUgV0NEOTM0WF9QQUNLRURfUkVHX1NJWkUgc2l6ZW9mKHUzMikKKyNkZWZpbmUgV0NEOTM0WF9DT0RFQ19VTlBBQ0tfRU5UUlkocGFja2VkLCByZWcsIG1hc2ssIHZhbCkgXAorCWRvIHsgXAorCQkoKHJlZykgPSAoKHBhY2tlZCA+PiAxNikgJiAoMHhmZmZmKSkpOyBcCisJCSgobWFzaykgPSAoKHBhY2tlZCA+PiA4KSAmICgweGZmKSkpOyBcCisJCSgodmFsKSA9ICgocGFja2VkKSAmICgweGZmKSkpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVFJJTkcobmFtZSkgI25hbWUKKyNkZWZpbmUgV0NEX0RBUE1fRU5VTShuYW1lLCByZWcsIG9mZnNldCwgdGV4dCkgXAorc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG5hbWUjI19lbnVtLCByZWcsIG9mZnNldCwgdGV4dCk7IFwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYW1lIyNfbXV4ID0gXAorCQlTT0NfREFQTV9FTlVNKFNUUklORyhuYW1lKSwgbmFtZSMjX2VudW0pCisKKyNkZWZpbmUgV0NEX0RBUE1fRU5VTV9FWFQobmFtZSwgcmVnLCBvZmZzZXQsIHRleHQsIGdldG5hbWUsIHB1dG5hbWUpIFwKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChuYW1lIyNfZW51bSwgcmVnLCBvZmZzZXQsIHRleHQpOyBcCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmFtZSMjX211eCA9IFwKKwkJU09DX0RBUE1fRU5VTV9FWFQoU1RSSU5HKG5hbWUpLCBuYW1lIyNfZW51bSwgZ2V0bmFtZSwgcHV0bmFtZSkKKworI2RlZmluZSBXQ0RfREFQTV9NVVgobmFtZSwgc2hpZnQsIGtjdGwpIFwKKwkJU05EX1NPQ19EQVBNX01VWChuYW1lLCBTTkRfU09DX05PUE0sIHNoaWZ0LCAwLCAma2N0bCMjX211eCkKKworLyoKKyAqIFRpbWVvdXQgaW4gbWlsbGkgc2Vjb25kcyBhbmQgaXQgaXMgdGhlIHdhaXQgdGltZSBmb3IKKyAqIHNsaW0gY2hhbm5lbCByZW1vdmFsIGludGVycnVwdCB0byByZWNlaXZlLgorICovCisjZGVmaW5lIFdDRDkzNFhfU0xJTV9DTE9TRV9USU1FT1VUIDEwMDAKKyNkZWZpbmUgV0NEOTM0WF9TTElNX0lSUV9PVkVSRkxPVyAoMSA8PCAwKQorI2RlZmluZSBXQ0Q5MzRYX1NMSU1fSVJRX1VOREVSRkxPVyAoMSA8PCAxKQorI2RlZmluZSBXQ0Q5MzRYX1NMSU1fSVJRX1BPUlRfQ0xPU0VEICgxIDw8IDIpCisjZGVmaW5lIFdDRDkzNFhfTUNMS19DTEtfMTJQMjg4TUhaIDEyMjg4MDAwCisjZGVmaW5lIFdDRDkzNFhfTUNMS19DTEtfOVA2TUhaIDk2MDAwMDAKKworI2RlZmluZSBXQ0Q5MzRYX0lOVEVSUF9NVVhfTlVNX0lOUFVUUyAzCisjZGVmaW5lIFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlMgOQorI2RlZmluZSBXQ0Q5MzRYX05VTV9ERUNJTUFUT1JTIDkKKyNkZWZpbmUgV0NEOTM0WF9SWF9QQVRIX0NUTF9PRkZTRVQgMjAKKworI2RlZmluZSBCWVRFX0JJVF9NQVNLKG5yKSAoMSA8PCAoKG5yKSAlIEJJVFNfUEVSX0JZVEUpKQorCisjZGVmaW5lIFdDRDkzNFhfUkVHX0JJVFMgOAorI2RlZmluZSBXQ0Q5MzRYX01BWF9WQUxJRF9BRENfTVVYICAxMworI2RlZmluZSBXQ0Q5MzRYX0lOVkFMSURfQURDX01VWCA5CisKKyNkZWZpbmUgV0NEOTM0WF9BTUlDX1BXUl9MRVZFTF9MUCAwCisjZGVmaW5lIFdDRDkzNFhfQU1JQ19QV1JfTEVWRUxfREVGQVVMVCAxCisjZGVmaW5lIFdDRDkzNFhfQU1JQ19QV1JfTEVWRUxfSFAgMgorI2RlZmluZSBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9NQVNLIDB4NjAKKyNkZWZpbmUgV0NEOTM0WF9BTUlDX1BXUl9MVkxfU0hJRlQgMHg1CisKKyNkZWZpbmUgV0NEOTM0WF9ERUNfUFdSX0xWTF9NQVNLIDB4MDYKKyNkZWZpbmUgV0NEOTM0WF9ERUNfUFdSX0xWTF9MUCAweDAyCisjZGVmaW5lIFdDRDkzNFhfREVDX1BXUl9MVkxfSFAgMHgwNAorI2RlZmluZSBXQ0Q5MzRYX0RFQ19QV1JfTFZMX0RGIDB4MDAKKyNkZWZpbmUgV0NEOTM0WF9TVFJJTkdfTEVOIDEwMAorCisjZGVmaW5lIFdDRDkzNFhfRElHX0NPUkVfUkVHX01JTiAgV0NEOTM0WF9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMCisjZGVmaW5lIFdDRDkzNFhfRElHX0NPUkVfUkVHX01BWCAgMHhGRkYKKworI2RlZmluZSBXQ0Q5MzRYX01BWF9NSUNCSUFTIDQKKyNkZWZpbmUgREFQTV9NSUNCSUFTMV9TVEFOREFMT05FICJNSUMgQklBUzEgU3RhbmRhbG9uZSIKKyNkZWZpbmUgREFQTV9NSUNCSUFTMl9TVEFOREFMT05FICJNSUMgQklBUzIgU3RhbmRhbG9uZSIKKyNkZWZpbmUgREFQTV9NSUNCSUFTM19TVEFOREFMT05FICJNSUMgQklBUzMgU3RhbmRhbG9uZSIKKyNkZWZpbmUgREFQTV9NSUNCSUFTNF9TVEFOREFMT05FICJNSUMgQklBUzQgU3RhbmRhbG9uZSIKKworI2RlZmluZSAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLCTB4NjAKKyNkZWZpbmUgIENGX01JTl8zREJfNEhaCQkJMHgwCisjZGVmaW5lICBDRl9NSU5fM0RCXzc1SFoJCTB4MQorI2RlZmluZSAgQ0ZfTUlOXzNEQl8xNTBIWgkJMHgyCisKKyNkZWZpbmUgQ1BFX0VSUl9XRE9HX0JJVEUgQklUKDApCisjZGVmaW5lIENQRV9GQVRBTF9JUlFTIENQRV9FUlJfV0RPR19CSVRFCisKKyNkZWZpbmUgV0NEOTM0WF9NQURfQVVESU9fRklSTVdBUkVfUEFUSCAid2NkOTM0eC93Y2Q5MzR4X21hZF9hdWRpby5iaW4iCisKKyNkZWZpbmUgVEFWSUxfVkVSU0lPTl9FTlRSWV9TSVpFIDE3CisKKyNkZWZpbmUgV0NEOTM0WF9ESUdfQ09SRV9DT0xMQVBTRV9USU1FUl9NUyAgKDUgKiAxMDAwKQorCitlbnVtIHsKKwlQT1dFUl9DT0xMQVBTRSwKKwlQT1dFUl9SRVNVTUUsCit9OworCitzdGF0aWMgaW50IGRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSA9IDE7Cittb2R1bGVfcGFyYW0oZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaWdfY29yZV9jb2xsYXBzZV9lbmFibGUsICJlbmFibGUvZGlzYWJsZSBwb3dlciBnYXRpbmciKTsKKworLyogZGlnX2NvcmVfY29sbGFwc2UgdGltZXIgaW4gc2Vjb25kcyAqLworc3RhdGljIGludCBkaWdfY29yZV9jb2xsYXBzZV90aW1lciA9IChXQ0Q5MzRYX0RJR19DT1JFX0NPTExBUFNFX1RJTUVSX01TLzEwMDApOworbW9kdWxlX3BhcmFtKGRpZ19jb3JlX2NvbGxhcHNlX3RpbWVyLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhkaWdfY29yZV9jb2xsYXBzZV90aW1lciwgInRpbWVyIGZvciBwb3dlciBnYXRpbmciKTsKKworI2RlZmluZSBUQVZJTF9IUEhfUkVHX1JBTkdFXzEgIChXQ0Q5MzRYX0hQSF9SX0RBQ19DVEwgLSBXQ0Q5MzRYX0hQSF9DTlBfRU4gKyAxKQorI2RlZmluZSBUQVZJTF9IUEhfUkVHX1JBTkdFXzIgIChXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDMgLVwKKwkJCQlXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDIgKyAxKQorI2RlZmluZSBUQVZJTF9IUEhfUkVHX1JBTkdFXzMgIChXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzMgLVwKKwkJCQlXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwgKyAxKQorI2RlZmluZSBUQVZJTF9IUEhfVE9UQUxfUkVHICAgIChUQVZJTF9IUEhfUkVHX1JBTkdFXzEgKyBUQVZJTF9IUEhfUkVHX1JBTkdFXzIgK1wKKwkJCQlUQVZJTF9IUEhfUkVHX1JBTkdFXzMpCisKK2VudW0geworCVZJX1NFTlNFXzEsCisJVklfU0VOU0VfMiwKKwlBVURJT19OT01JTkFMLAorCUhQSF9QQV9ERUxBWSwKK307CisKK2VudW0geworCUFJRjFfUEIgPSAwLAorCUFJRjFfQ0FQLAorCUFJRjJfUEIsCisJQUlGMl9DQVAsCisJQUlGM19QQiwKKwlBSUYzX0NBUCwKKwlBSUY0X1BCLAorCUFJRjRfVklGRUVELAorCUFJRjRfTUFEX1RYLAorCU5VTV9DT0RFQ19EQUlTLAorfTsKKworZW51bSB7CisJSU5Ubl8xX0lOUF9TRUxfWkVSTyA9IDAsCisJSU5Ubl8xX0lOUF9TRUxfREVDMCwKKwlJTlRuXzFfSU5QX1NFTF9ERUMxLAorCUlOVG5fMV9JTlBfU0VMX0lJUjAsCisJSU5Ubl8xX0lOUF9TRUxfSUlSMSwKKwlJTlRuXzFfSU5QX1NFTF9SWDAsCisJSU5Ubl8xX0lOUF9TRUxfUlgxLAorCUlOVG5fMV9JTlBfU0VMX1JYMiwKKwlJTlRuXzFfSU5QX1NFTF9SWDMsCisJSU5Ubl8xX0lOUF9TRUxfUlg0LAorCUlOVG5fMV9JTlBfU0VMX1JYNSwKKwlJTlRuXzFfSU5QX1NFTF9SWDYsCisJSU5Ubl8xX0lOUF9TRUxfUlg3LAorfTsKKworZW51bSB7CisJSU5Ubl8yX0lOUF9TRUxfWkVSTyA9IDAsCisJSU5Ubl8yX0lOUF9TRUxfUlgwLAorCUlOVG5fMl9JTlBfU0VMX1JYMSwKKwlJTlRuXzJfSU5QX1NFTF9SWDIsCisJSU5Ubl8yX0lOUF9TRUxfUlgzLAorCUlOVG5fMl9JTlBfU0VMX1JYNCwKKwlJTlRuXzJfSU5QX1NFTF9SWDUsCisJSU5Ubl8yX0lOUF9TRUxfUlg2LAorCUlOVG5fMl9JTlBfU0VMX1JYNywKKwlJTlRuXzJfSU5QX1NFTF9QUk9YSU1JVFksCit9OworCitlbnVtIHsKKwlJTlRFUlBfTUFJTl9QQVRILAorCUlOVEVSUF9NSVhfUEFUSCwKK307CisKK3N0cnVjdCB0YXZpbF9pZGxlX2RldGVjdF9jb25maWcgeworCXU4IGhwaF9pZGxlX3RocjsKKwl1OCBocGhfaWRsZV9kZXRlY3RfZW47Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGludHJfZGF0YSB3Y2Q5MzR4X2ludHJfdGFibGVbXSA9IHsKKwl7V0NEOVhYWF9JUlFfU0xJTUJVUywgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9NQkhDX1NXX0RFVCwgdHJ1ZX0sCisJe1dDRDkzNFhfSVJRX01CSENfQlVUVE9OX1BSRVNTX0RFVCwgdHJ1ZX0sCisJe1dDRDkzNFhfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULCB0cnVlfSwKKwl7V0NEOTM0WF9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0RFVCwgdHJ1ZX0sCisJe1dDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULCB0cnVlfSwKKwl7V0NEOTM0WF9JUlFfTUlTQywgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfQ05QTF9DT01QTEVURSwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfQ05QUl9DT01QTEVURSwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9FQVJfUEFfQ05QX0NPTVBMRVRFLCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX0xJTkVfUEExX0NOUF9DT01QTEVURSwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9MSU5FX1BBMl9DTlBfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTM0WF9JUlFfU0xOUV9BTkFMT0dfRVJST1IsIGZhbHNlfSwKKwl7V0NEOTM0WF9JUlFfUkVTRVJWRURfMywgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9FQVJfUEFfT0NQX0ZBVUxULCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX1NPVU5EV0lSRSwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9WRERfRElHX1JBTVBfQ09NUExFVEUsIGZhbHNlfSwKKwl7V0NEOTM0WF9JUlFfUkNPX0VSUk9SLCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX0NQRV9FUlJPUiwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9NQURfQVVESU8sIGZhbHNlfSwKKwl7V0NEOTM0WF9JUlFfTUFEX0JFQUNPTiwgZmFsc2V9LAorCXtXQ0Q5MzRYX0lSUV9DUEUxX0lOVFIsIHRydWV9LAorCXtXQ0Q5MzRYX0lSUV9SRVNFUlZFRF80LCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX01BRF9VTFRSQVNPVU5ELCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX1ZCQVRfQVRUQUNLLCBmYWxzZX0sCisJe1dDRDkzNFhfSVJRX1ZCQVRfUkVTVE9SRSwgZmFsc2V9LAorfTsKKworc3RydWN0IHRhdmlsX2Nwcl9yZWdfZGVmYXVsdHMgeworCWludCB3cl9kYXRhOworCWludCB3cl9hZGRyOworfTsKKworc3RydWN0IGludGVycF9zYW1wbGVfcmF0ZSB7CisJaW50IHNhbXBsZV9yYXRlOworCWludCByYXRlX3ZhbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIHNyX3ZhbF90YmxbXSA9IHsKKwl7ODAwMCwgMHgwfSwgezE2MDAwLCAweDF9LCB7MzIwMDAsIDB4M30sIHs0ODAwMCwgMHg0fSwgezk2MDAwLCAweDV9LAorCXsxOTIwMDAsIDB4Nn0sIHszODQwMDAsIDB4N30sIHs0NDEwMCwgMHg5fSwgezg4MjAwLCAweEF9LAorCXsxNzY0MDAsIDB4Qn0sIHszNTI4MDAsIDB4Q30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfY2ggdGF2aWxfcnhfY2hzW1dDRDkzNFhfUlhfTUFYXSA9IHsKKwlXQ0Q5WFhYX0NIKFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIsIDApLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDEsIDEpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDIsIDIpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDMsIDMpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDQsIDQpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDUsIDUpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDYsIDYpLAorCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDcsIDcpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X2NoIHRhdmlsX3R4X2Noc1tXQ0Q5MzRYX1RYX01BWF0gPSB7CisJV0NEOVhYWF9DSCgwLCAwKSwKKwlXQ0Q5WFhYX0NIKDEsIDEpLAorCVdDRDlYWFhfQ0goMiwgMiksCisJV0NEOVhYWF9DSCgzLCAzKSwKKwlXQ0Q5WFhYX0NIKDQsIDQpLAorCVdDRDlYWFhfQ0goNSwgNSksCisJV0NEOVhYWF9DSCg2LCA2KSwKKwlXQ0Q5WFhYX0NIKDcsIDcpLAorCVdDRDlYWFhfQ0goOCwgOCksCisJV0NEOVhYWF9DSCg5LCA5KSwKKwlXQ0Q5WFhYX0NIKDEwLCAxMCksCisJV0NEOVhYWF9DSCgxMSwgMTEpLAorCVdDRDlYWFhfQ0goMTIsIDEyKSwKKwlXQ0Q5WFhYX0NIKDEzLCAxMyksCisJV0NEOVhYWF9DSCgxNCwgMTQpLAorCVdDRDlYWFhfQ0goMTUsIDE1KSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgdnBvcnRfc2xpbV9jaGVja190YWJsZVtOVU1fQ09ERUNfREFJU10gPSB7CisJMCwJCQkJCQkJLyogQUlGMV9QQiAqLworCUJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjRfTUFEX1RYKSwJLyogQUlGMV9DQVAgKi8KKwkwLAkJCQkJCQkvKiBBSUYyX1BCICovCisJQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYzX0NBUCkgfCBCSVQoQUlGNF9NQURfVFgpLAkvKiBBSUYyX0NBUCAqLworCTAsCQkJCQkJCS8qIEFJRjNfUEIgKi8KKwlCSVQoQUlGMV9DQVApIHwgQklUKEFJRjJfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCksCS8qIEFJRjNfQ0FQICovCisJMCwJCQkJCQkJLyogQUlGNF9QQiAqLworfTsKKworLyogQ29kZWMgc3VwcG9ydHMgMiBJSVIgZmlsdGVycyAqLworZW51bSB7CisJSUlSMCA9IDAsCisJSUlSMSwKKwlJSVJfTUFYLAorfTsKKworLyogRWFjaCBJSVIgaGFzIDUgRmlsdGVyIFN0YWdlcyAqLworZW51bSB7CisJQkFORDEgPSAwLAorCUJBTkQyLAorCUJBTkQzLAorCUJBTkQ0LAorCUJBTkQ1LAorCUJBTkRfTUFYLAorfTsKKworZW51bSB7CisJQ09NUEFOREVSXzEsIC8qIEhQSF9MICovCisJQ09NUEFOREVSXzIsIC8qIEhQSF9SICovCisJQ09NUEFOREVSXzMsIC8qIExPMV9ESUZGICovCisJQ09NUEFOREVSXzQsIC8qIExPMl9ESUZGICovCisJQ09NUEFOREVSXzUsIC8qIExPM19TRSAtIG5vdCB1c2VkIGluIFRhdmlsICovCisJQ09NUEFOREVSXzYsIC8qIExPNF9TRSAtIG5vdCB1c2VkIGluIFRhdmlsICovCisJQ09NUEFOREVSXzcsIC8qIFNXUiBTUEsgQ0gxICovCisJQ09NUEFOREVSXzgsIC8qIFNXUiBTUEsgQ0gyICovCisJQ09NUEFOREVSX01BWCwKK307CisKK2VudW0geworCUFTUkNfSU5fSFBITCwKKwlBU1JDX0lOX0xPMSwKKwlBU1JDX0lOX0hQSFIsCisJQVNSQ19JTl9MTzIsCisJQVNSQ19JTl9TUEtSMSwKKwlBU1JDX0lOX1NQS1IyLAorCUFTUkNfSU5WQUxJRCwKK307CisKK2VudW0geworCUFTUkMwLAorCUFTUkMxLAorCUFTUkMyLAorCUFTUkMzLAorCUFTUkNfTUFYLAorfTsKKworZW51bSB7CisJQ09OVl84OFAyS19UT18zODRLLAorCUNPTlZfOTZLX1RPXzM1MlA4SywKKwlDT05WXzM1MlA4S19UT18zODRLLAorCUNPTlZfMzg0S19UT18zNTJQOEssCisJQ09OVl8zODRLX1RPXzM4NEssCisJQ09OVl85NktfVE9fMzg0SywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyA9IHsKKwkubWlub3JfdmVyc2lvbiA9IDEsCisJLnNsaW1idXNfZGV2X2lkID0gQUZFX1NMSU1CVVNfREVWSUNFXzEsCisJLnNsYXZlX2Rldl9wZ2RfbGEgPSAwLAorCS5zbGF2ZV9kZXZfaW50ZmRldl9sYSA9IDAsCisJLmJpdF93aWR0aCA9IDE2LAorCS5kYXRhX2Zvcm1hdCA9IDAsCisJLm51bV9jaGFubmVscyA9IDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgdGF2aWxfY2RjX3JlZ19wYWdlX2NmZyA9IHsKKwkubWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9DRENfUkVHX1BBR0VfQ0ZHLAorCS5lbmFibGUgPSAxLAorCS5wcm9jX2lkID0gQUZFX0NEQ19SRUdfUEFHRV9BU1NJR05fUFJPQ19JRF8xLAorfTsKKworc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmcgYXVkaW9fcmVnX2NmZ1tdID0geworCXsKKwkJMSwKKwkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzEpLAorCQlIV19NQURfQVVESU9fRU5BQkxFLCAweDEsIFdDRDkzNFhfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8zKSwKKwkJSFdfTUFEX0FVRElPX1NMRUVQX1RJTUUsIDB4RiwgV0NEOTM0WF9SRUdfQklUUywgMAorCX0sCisJeworCQkxLAorCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzQpLAorCQlIV19NQURfVFhfQVVESU9fU1dJVENIX09GRiwgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9DRkcpLAorCQlNQURfQVVESU9fSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9QSU4yX01BU0szKSwKKwkJTUFEX0FVRElPX0lOVF9NQVNLX1JFRywgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9QSU4yX1NUQVRVUzMpLAorCQlNQURfQVVESU9fSU5UX1NUQVRVU19SRUcsIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMAorCX0sCisJeworCQkxLAorCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzRYX0lOVFJfUElOMl9DTEVBUjMpLAorCQlNQURfQVVESU9fSU5UX0NMRUFSX1JFRywgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfU0JfUEdEX1BPUlRfVFhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1RYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzRYX1JFR19CSVRTLCAweDEKKwl9LAorCXsKKwkJMSwKKwkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TQl9QR0RfUE9SVF9UWF9CQVNFKSwKKwkJU0JfUEdEX1BPUlRfVFhfRU5BQkxFX04sIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMHgxCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfU0JfUEdEX1BPUlRfUlhfQkFTRSksCisJCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzRYX1JFR19CSVRTLCAweDEKKwl9LAorCXsKKwkJMSwKKwkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TQl9QR0RfUE9SVF9SWF9CQVNFKSwKKwkJU0JfUEdEX1BPUlRfUlhfRU5BQkxFX04sIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMHgxCisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCSBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpLAorCQlBQU5DX0ZGX0dBSU5fQURBUFRJVkUsIDB4NCwgV0NEOTM0WF9SRUdfQklUUywgMAorCX0sCisJeworCQkxLAorCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkgV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMKSwKKwkJQUFOQ19GRkdBSU5fQURBUFRJVkVfRU4sIDB4OCwgV0NEOTM0WF9SRUdfQklUUywgMAorCX0sCisJeworCQkxLAorCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkgV0NEOTM0WF9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMKSwKKwkJQUFOQ19HQUlOX0NPTlRST0wsIDB4RkYsIFdDRDkzNFhfUkVHX0JJVFMsIDAKKwl9LAorCXsKKwkJMSwKKwkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKKwkJIFNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMCgwKSksCisJCVNCX1BHRF9UWF9QT1JUbl9NVUxUSV9DSE5MXzAsIDB4RkYsIFdDRDkzNFhfUkVHX0JJVFMsIDB4NAorCX0sCisJeworCQkxLAorCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKworCQkgU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8xKDApKSwKKwkJU0JfUEdEX1RYX1BPUlRuX01VTFRJX0NITkxfMSwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0CisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCSBTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoMHgxODAsIDApKSwKKwkJU0JfUEdEX1JYX1BPUlRuX01VTFRJX0NITkxfMCwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0CisJfSwKKwl7CisJCTEsCisJCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCisJCSBTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoMHgxODEsIDApKSwKKwkJU0JfUEdEX1JYX1BPUlRuX01VTFRJX0NITkxfMSwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0CisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX2RhdGEgdGF2aWxfYXVkaW9fcmVnX2NmZyA9IHsKKwkubnVtX3JlZ2lzdGVycyA9IEFSUkFZX1NJWkUoYXVkaW9fcmVnX2NmZyksCisJLnJlZ19kYXRhID0gYXVkaW9fcmVnX2NmZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NkY19hYW5jX3ZlcnNpb24gdGF2aWxfY2RjX2FhbmNfdmVyc2lvbiA9IHsKKwkuY2RjX2FhbmNfbWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9DRENfQUFOQ19WRVJTSU9OLAorCS5hYW5jX2h3X3ZlcnNpb24gICAgICAgID0gQUFOQ19IV19CTE9DS19WRVJTSU9OXzIsCit9OworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF9nYWluLCAwLCAxLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW5lX2dhaW4sIDAsIDcsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFuYWxvZ19nYWluLCAwLCAyNSwgMSk7CisKKyNkZWZpbmUgV0NEOTM0WF9UWF9VTk1VVEVfREVMQVlfTVMgMjUKKworc3RhdGljIGludCB0eF91bm11dGVfZGVsYXkgPSBXQ0Q5MzRYX1RYX1VOTVVURV9ERUxBWV9NUzsKK21vZHVsZV9wYXJhbSh0eF91bm11dGVfZGVsYXksIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3VubXV0ZV9kZWxheSwgImRlbGF5IHRvIHVubXV0ZSB0aGUgdHggcGF0aCIpOworCisKKy8qIEhvbGQgaW5zdGFuY2UgdG8gc291bmR3aXJlIHBsYXRmb3JtIGRldmljZSAqLworc3RydWN0IHRhdmlsX3N3cl9jdHJsX2RhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnN3cl9wZGV2OworfTsKKworc3RydWN0IHdjZF9zd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHsKKwl2b2lkICpoYW5kbGU7IC8qIGhvbGRzIGNvZGVjIHByaXZhdGUgZGF0YSAqLworCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7CisJaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7CisJaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOworCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7CisJaW50ICgqaGFuZGxlX2lycSkodm9pZCAqaGFuZGxlLAorCQkJICBpcnFyZXR1cm5fdCAoKnN3cm1faXJxX2hhbmRsZXIpKGludCBpcnEsIHZvaWQgKmRhdGEpLAorCQkJICB2b2lkICpzd3JtX2hhbmRsZSwgaW50IGFjdGlvbik7Cit9OworCisvKiBIb2xkcyBhbGwgU291bmR3aXJlIGFuZCBzcGVha2VyIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB3Y2Q5MzR4X3N3ciB7CisJc3RydWN0IHRhdmlsX3N3cl9jdHJsX2RhdGEgKmN0cmxfZGF0YTsKKwlzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgcGxhdF9kYXRhOworCXN0cnVjdCBtdXRleCByZWFkX211dGV4OworCXN0cnVjdCBtdXRleCB3cml0ZV9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggY2xrX211dGV4OworCWludCBzcGtyX2dhaW5fb2Zmc2V0OworCWludCBzcGtyX21vZGU7CisJaW50IGNsa191c2VyczsKKwlpbnQgcnhfN19jb3VudDsKKwlpbnQgcnhfOF9jb3VudDsKK307CisKK3N0cnVjdCB0eF9tdXRlX3dvcmsgeworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwl1OCBkZWNpbWF0b3I7CisJc3RydWN0IGRlbGF5ZWRfd29yayBkd29yazsKK307CisKKyNkZWZpbmUgV0NEOTM0WF9TUEtfQU5DX0VOX0RFTEFZX01TIDM1MAorc3RhdGljIGludCBzcGtfYW5jX2VuX2RlbGF5ID0gV0NEOTM0WF9TUEtfQU5DX0VOX0RFTEFZX01TOworbW9kdWxlX3BhcmFtKHNwa19hbmNfZW5fZGVsYXksIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNwa19hbmNfZW5fZGVsYXksICJkZWxheSB0byBlbmFibGUgYW5jIGluIHNwZWFrZXIgcGF0aCIpOworCitzdHJ1Y3Qgc3BrX2FuY193b3JrIHsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IGRlbGF5ZWRfd29yayBkd29yazsKK307CisKK3N0cnVjdCBocGZfd29yayB7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXU4IGRlY2ltYXRvcjsKKwl1OCBocGZfY3V0X29mZl9mcmVxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcms7Cit9OworCitzdHJ1Y3QgdGF2aWxfcHJpdiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1MzIgcnhfYmlhc19jb3VudDsKKwlzMzIgZG1pY18wXzFfY2xrX2NudDsKKwlzMzIgZG1pY18yXzNfY2xrX2NudDsKKwlzMzIgZG1pY180XzVfY2xrX2NudDsKKwlzMzIgbWljYl9yZWZbVEFWSUxfTUFYX01JQ0JJQVNdOworCXMzMiBwdWxsdXBfcmVmW1RBVklMX01BWF9NSUNCSUFTXTsKKworCS8qIEFOQyByZWxhdGVkICovCisJdTMyIGFuY19zbG90OworCWJvb2wgYW5jX2Z1bmM7CisKKwkvKiBjb21wYW5kZXIgKi8KKwlpbnQgY29tcF9lbmFibGVkW0NPTVBBTkRFUl9NQVhdOworCWludCBlYXJfc3Brcl9nYWluOworCisJLyogY2xhc3MgaCBzcGVjaWZpYyBkYXRhICovCisJc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhIGNsc2hfZDsKKwkvKiBUYXZpbCBJbnRlcnBvbGF0b3IgTW9kZSBTZWxlY3QgZm9yIEVBUiwgSFBIX0wgYW5kIEhQSF9SICovCisJdTMyIGhwaF9tb2RlOworCisJLyogTWFkIHN3aXRjaCByZWZlcmVuY2UgY291bnQgKi8KKwlpbnQgbWFkX3N3aXRjaF9jbnQ7CisKKwkvKiB0cmFjayB0YXZpbCBpbnRlcmZhY2UgdHlwZSAqLworCXU4IGludGZfdHlwZTsKKworCS8qIHRvIHRyYWNrIHRoZSBzdGF0dXMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXR1c19tYXNrOworCisJc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgc2xpbWJ1c19zbGF2ZV9jZmc7CisKKwkvKiBudW0gb2Ygc2xpbSBwb3J0cyByZXF1aXJlZCAqLworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICBkYWlbTlVNX0NPREVDX0RBSVNdOworCS8qIFBvcnQgdmFsdWVzIGZvciBSeCBhbmQgVHggY29kZWNfZGFpICovCisJdW5zaWduZWQgaW50IHJ4X3BvcnRfdmFsdWVbV0NEOTM0WF9SWF9NQVhdOworCXVuc2lnbmVkIGludCB0eF9wb3J0X3ZhbHVlOworCisJc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3I7CisJc3RydWN0IHdjZDkzNHhfc3dyIHN3cjsKKwlzdHJ1Y3QgbXV0ZXggbWljYl9sb2NrOworCisJc3RydWN0IGRlbGF5ZWRfd29yayBwb3dlcl9nYXRlX3dvcms7CisJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7CisKKwlzdHJ1Y3QgY2xrICp3Y2RfZXh0X2NsazsKKworCS8qIG1iaGMgbW9kdWxlICovCisJc3RydWN0IHdjZDkzNHhfbWJoYyAqbWJoYzsKKworCXN0cnVjdCBtdXRleCBjb2RlY19tdXRleDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGF2aWxfYWRkX2NoaWxkX2RldmljZXNfd29yazsKKwlzdHJ1Y3QgaHBmX3dvcmsgdHhfaHBmX3dvcmtbV0NEOTM0WF9OVU1fREVDSU1BVE9SU107CisJc3RydWN0IHR4X211dGVfd29yayB0eF9tdXRlX2R3b3JrW1dDRDkzNFhfTlVNX0RFQ0lNQVRPUlNdOworCXN0cnVjdCBzcGtfYW5jX3dvcmsgc3BrX2FuY19kd29yazsKKworCXVuc2lnbmVkIGludCB2aV9mZWVkX3ZhbHVlOworCisJLyogRFNQIGNvbnRyb2wgKi8KKwlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICp3ZHNwX2NudGw7CisKKwkvKiBjYWwgaW5mbyBmb3IgY29kZWMgKi8KKwlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YTsKKworCS8qIEVudHJ5IGZvciB2ZXJzaW9uIGluZm8gKi8KKwlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKKworCS8qIFNWUyB2b3RpbmcgcmVsYXRlZCAqLworCXN0cnVjdCBtdXRleCBzdnNfbXV0ZXg7CisJaW50IHN2c19yZWZfY250OworCisJaW50IG5hdGl2ZV9jbGtfdXNlcnM7CisJLyogQVNSQyB1c2VycyBjb3VudCAqLworCWludCBhc3JjX3VzZXJzW0FTUkNfTUFYXTsKKwlpbnQgYXNyY19vdXRwdXRfbW9kZVtBU1JDX01BWF07CisJLyogTWFpbiBwYXRoIGNsb2NrIHVzZXJzIGNvdW50ICovCisJaW50IG1haW5fY2xrX3VzZXJzW1dDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlNdOworCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZmlnOworCXN0cnVjdCB0YXZpbF9pZGxlX2RldGVjdF9jb25maWcgaWRsZV9kZXRfY2ZnOworCisJaW50IHBvd2VyX2FjdGl2ZV9yZWY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9zcGtyX2RlZmF1bHRbXSA9IHsKKwl7V0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwzLCAweDgwLCAweDgwfSwKKwl7V0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDgwfSwKKwl7V0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw3LCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw3LCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCisJe1dDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DVEwsIDB4N0MsIDB4NTB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfc3Brcl9tb2RlMVtdID0geworCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDMsIDB4ODAsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMsIDB4ODAsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDcsIDB4MDEsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDdDLCAweDQ0fSwKKwl7V0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg0NH0sCit9OworCitzdGF0aWMgaW50IF9fdGF2aWxfZW5hYmxlX2VmdXNlX3NlbnNpbmcoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKTsKKworLyoKKyAqIHdjZDkzNHhfZ2V0X2NvZGVjX2luZm86IEdldCBjb2RlYyBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICoKKyAqIEB3Y2Q5eHh4OiBwb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCisgKiBAd2NkX3R5cGU6IHBvaW50ZXIgdG8gd2NkOXh4eF9jb2RlY190eXBlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCisgKi8KK2ludCB3Y2Q5MzR4X2dldF9jb2RlY19pbmZvKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAorCQkJICAgc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqd2NkX3R5cGUpCit7CisJdTE2IGlkX21pbm9yLCBpZF9tYWpvcjsKKwlzdHJ1Y3QgcmVnbWFwICp3Y2RfcmVnbWFwOworCWludCByYywgdmVyc2lvbiA9IC0xOworCisJaWYgKCF3Y2Q5eHh4IHx8ICF3Y2RfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXdjZDl4eHgtPnJlZ21hcCkgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5eHh4IHJlZ21hcCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3Y2RfcmVnbWFwID0gd2NkOXh4eC0+cmVnbWFwOworCisJcmMgPSByZWdtYXBfYnVsa19yZWFkKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwKKwkJCSAgICAgICh1OCAqKSZpZF9taW5vciwgc2l6ZW9mKHUxNikpOworCWlmIChyYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IHJlZ21hcF9idWxrX3JlYWQod2NkX3JlZ21hcCwgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUyLAorCQkJICAgICAgKHU4ICopJmlkX21ham9yLCBzaXplb2YodTE2KSk7CisJaWYgKHJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5eHh4IGNoaXAgaWQgbWFqb3IgMHgleCwgbWlub3IgMHgleFxuIiwKKwkJIF9fZnVuY19fLCBpZF9tYWpvciwgaWRfbWlub3IpOworCisJaWYgKGlkX21ham9yICE9IFRBVklMX01BSk9SKQorCQlnb3RvIHZlcnNpb25fdW5rbm93bjsKKworCS8qCisJICogQXMgZmluZSB2ZXJzaW9uIGluZm8gY2Fubm90IGJlIHJldHJpZXZlZCBiZWZvcmUgdGF2aWwgcHJvYmUuCisJICogQXNzaWduIGNvYXJzZSB2ZXJzaW9ucyBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSBiZWZvcmUgdGF2aWwgcHJvYmUuCisJICovCisJaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDApKQorCQl2ZXJzaW9uID0gVEFWSUxfVkVSU0lPTl8xXzA7CisJZWxzZSBpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMHgwMSkpCisJCXZlcnNpb24gPSBUQVZJTF9WRVJTSU9OXzFfMTsKKwordmVyc2lvbl91bmtub3duOgorCWlmICh2ZXJzaW9uIDwgMCkKKwkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkOTM0eCB2ZXJzaW9uIHVua25vd25cbiIsCisJCQlfX2Z1bmNfXyk7CisKKwkvKiBGaWxsIGNvZGVjIHR5cGUgaW5mbyAqLworCXdjZF90eXBlLT5pZF9tYWpvciA9IGlkX21ham9yOworCXdjZF90eXBlLT5pZF9taW5vciA9IGlkX21pbm9yOworCXdjZF90eXBlLT5udW1faXJxcyA9IFdDRDkzNFhfTlVNX0lSUVM7CisJd2NkX3R5cGUtPnZlcnNpb24gPSB2ZXJzaW9uOworCXdjZF90eXBlLT5zbGltX3NsYXZlX3R5cGUgPSBXQ0Q5WFhYX1NMSU1fU0xBVkVfQUREUl9UWVBFXzE7CisJd2NkX3R5cGUtPmkyY19jaGlwX3N0YXR1cyA9IDB4MDE7CisJd2NkX3R5cGUtPmludHJfdGJsID0gd2NkOTM0eF9pbnRyX3RhYmxlOworCXdjZF90eXBlLT5pbnRyX3RibF9zaXplID0gQVJSQVlfU0laRSh3Y2Q5MzR4X2ludHJfdGFibGUpOworCisJd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9TVEFUVVNfQkFTRV0gPQorCQkJCQkJV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMDsKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0NMRUFSX0JBU0VdID0KKwkJCQkJCVdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMDsKKwl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX01BU0tfQkFTRV0gPQorCQkJCQkJV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzA7CisJd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9MRVZFTF9CQVNFXSA9CisJCQkJCQlXQ0Q5MzRYX0lOVFJfTEVWRUwwOworCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xSX0NPTU1JVF0gPQorCQkJCQkJV0NEOTM0WF9JTlRSX0NMUl9DT01NSVQ7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDkzNHhfZ2V0X2NvZGVjX2luZm8pOworCisvKgorICogd2NkOTM0eF9icmluZ2Rvd246IEJyaW5nZG93biBXQ0QgQ29kZWMKKyAqCisgKiBAd2NkOXh4eDogUG9pbnRlciB0byB3Y2Q5eHh4IHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCisgKi8KK2ludCB3Y2Q5MzR4X2JyaW5nZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpZiAoIXdjZDl4eHggfHwgIXdjZDl4eHgtPnJlZ21hcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWdtYXBfd3JpdGUod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCSAgICAgMHgwNCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOTM0eF9icmluZ2Rvd24pOworCisvKgorICogd2NkOTM0eF9icmluZ3VwOiBCcmluZ3VwIFdDRCBDb2RlYworICoKKyAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHRoZSB3Y2Q5eHh4IHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCisgKi8KK2ludCB3Y2Q5MzR4X2JyaW5ndXAoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCit7CisJc3RydWN0IHJlZ21hcCAqd2NkX3JlZ21hcDsKKworCWlmICghd2NkOXh4eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXdjZDl4eHgtPnJlZ21hcCkgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5eHh4IHJlZ21hcCBpcyBudWxsIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdjZF9yZWdtYXAgPSB3Y2Q5eHh4LT5yZWdtYXA7CisKKwlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgMHgwMSk7CisJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfU0lET19ORVdfVk9VVF9BX1NUQVJUVVAsIDB4MTkpOworCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9TVEFSVFVQLCAweDE1KTsKKwlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDUpOworCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4Nyk7CisJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHgzKTsKKwlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgMHgzKTsKKwlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgMHg3KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5MzR4X2JyaW5ndXApOworCisvKioKKyAqIHRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0IC0gb2Zmc2V0IHRoZSBzcGVha2VyIHBhdGgKKyAqIGdhaW4gd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLgorICoKKyAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKKyAqIEBvZmZzZXQ6IEluZGljYXRlcyBzcGVha2VyIHBhdGggZ2FpbiBvZmZzZXQgdmFsdWUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KKyAqLworaW50IHRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID0gb2Zmc2V0OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldCk7CisKKy8qKgorICogdGF2aWxfc2V0X3Nwa3JfbW9kZSAtIENvbmZpZ3VyZXMgc3BlYWtlciBjb21wYW5kZXIgYW5kIHNtYXJ0Ym9vc3QKKyAqIHNldHRpbmdzIGJhc2VkIG9uIHNwZWFrZXIgbW9kZS4KKyAqCisgKiBAY29kZWM6IGNvZGVjIGluc3RhbmNlCisgKiBAbW9kZTogSW5kaWNhdGVzIHNwZWFrZXIgY29uZmlndXJhdGlvbiBtb2RlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCisgKi8KK2ludCB0YXZpbF9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsICpyZWdzOworCWludCBzaXplOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgV0NEOTM0WF9TUEtSX01PREVfMToKKwkJcmVncyA9IHRhdmlsX3Nwa3JfbW9kZTE7CisJCXNpemUgPSBBUlJBWV9TSVpFKHRhdmlsX3Nwa3JfbW9kZTEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWdzID0gdGF2aWxfc3Brcl9kZWZhdWx0OworCQlzaXplID0gQVJSQVlfU0laRSh0YXZpbF9zcGtyX2RlZmF1bHQpOworCQlicmVhazsKKwl9CisKKwlwcml2LT5zd3Iuc3Brcl9tb2RlID0gbW9kZTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdzW2ldLnJlZywKKwkJCQkgICAgcmVnc1tpXS5tYXNrLCByZWdzW2ldLnZhbCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX3NldF9zcGtyX21vZGUpOworCisvKioKKyAqIHRhdmlsX2dldF9hZmVfY29uZmlnIC0gcmV0dXJucyBzcGVjaWZpYyBjb2RlYyBjb25maWd1cmF0aW9uIHRvIGFmZSB0byB3cml0ZQorICoKKyAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKKyAqIEBjb25maWdfdHlwZTogSW5kaWNhdGVzIHR5cGUgb2YgY29uZmlndXJhdGlvbiB0byB3cml0ZS4KKyAqLwordm9pZCAqdGF2aWxfZ2V0X2FmZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoY29uZmlnX3R5cGUpIHsKKwljYXNlIEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRzoKKwkJcmV0dXJuICZwcml2LT5zbGltYnVzX3NsYXZlX2NmZzsKKwljYXNlIEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRzoKKwkJcmV0dXJuICZ0YXZpbF9hdWRpb19yZWdfY2ZnOworCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6CisJCXJldHVybiAmdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZzsKKwljYXNlIEFGRV9BQU5DX1ZFUlNJT046CisJCXJldHVybiAmdGF2aWxfY2RjX2FhbmNfdmVyc2lvbjsKKwljYXNlIEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUc6CisJCXJldHVybiAmdGF2aWxfY2RjX3JlZ19wYWdlX2NmZzsKKwlkZWZhdWx0OgorCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IFVua25vd24gY29uZmlnX3R5cGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBjb25maWdfdHlwZSk7CisJCXJldHVybiBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZ2V0X2FmZV9jb25maWcpOworCitzdGF0aWMgYm9vbCBpc190YXZpbF9wbGF5YmFja19kYWkoaW50IGRhaV9pZCkKK3sKKwlpZiAoKGRhaV9pZCA9PSBBSUYxX1BCKSB8fCAoZGFpX2lkID09IEFJRjJfUEIpIHx8CisJICAgIChkYWlfaWQgPT0gQUlGM19QQikgfHwgKGRhaV9pZCA9PSBBSUY0X1BCKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZmluZF9wbGF5YmFja19kYWlfaWRfZm9yX3BvcnQoaW50IHBvcnRfaWQsCisJCQkJCSAgICAgICBzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCit7CisJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJaW50IGksIHNsdl9wb3J0X2lkOworCisJZm9yIChpID0gQUlGMV9QQjsgaSA8IE5VTV9DT0RFQ19EQUlTOyBpKyspIHsKKwkJaWYgKCFpc190YXZpbF9wbGF5YmFja19kYWkoaSkpCisJCQljb250aW51ZTsKKworCQlkYWkgPSAmdGF2aWwtPmRhaVtpXTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCQlzbHZfcG9ydF9pZCA9IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQoY2gtPmNoX251bSk7CisJCQlpZiAoKHNsdl9wb3J0X2lkID4gMCkgJiYgKHNsdl9wb3J0X2lkID09IHBvcnRfaWQpKQorCQkJCXJldHVybiBpOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX3ZvdGVfc3ZzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwgYm9vbCB2b3RlKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCisJd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OworCisJbXV0ZXhfbG9jaygmdGF2aWwtPnN2c19tdXRleCk7CisJaWYgKHZvdGUpIHsKKwkJdGF2aWwtPnN2c19yZWZfY250Kys7CisJCWlmICh0YXZpbC0+c3ZzX3JlZl9jbnQgPT0gMSkKKwkJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJCSAgIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wLAorCQkJCQkgICAweDAxLCAweDAxKTsKKwl9IGVsc2UgeworCQkvKiBEbyBub3QgZGVjcmVtZW50IHJlZiBjb3VudCBpZiBpdCBpcyBhbHJlYWR5IDAgKi8KKwkJaWYgKHRhdmlsLT5zdnNfcmVmX2NudCA9PSAwKQorCQkJZ290byBkb25lOworCisJCXRhdmlsLT5zdnNfcmVmX2NudC0tOworCQlpZiAodGF2aWwtPnN2c19yZWZfY250ID09IDApCisJCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAorCQkJCQkgICBXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMCwKKwkJCQkJICAgMHgwMSwgMHgwMCk7CisJfQorZG9uZToKKwlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogdm90ZSA9ICVzLCB1cGRhdGVkIHJlZiBjbnQgPSAldVxuIiwgX19mdW5jX18sCisJCXZvdGUgPyAidm90ZSIgOiAiVW52b3RlIiwgdGF2aWwtPnN2c19yZWZfY250KTsKKwltdXRleF91bmxvY2soJnRhdmlsLT5zdnNfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHRhdmlsX2dldF9hbmNfc2xvdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+YW5jX3Nsb3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfcHV0X2FuY19zbG90KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl0YXZpbC0+YW5jX3Nsb3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9nZXRfYW5jX2Z1bmMoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHRhdmlsLT5hbmNfZnVuYyA9PSB0cnVlID8gMSA6IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX3B1dF9hbmNfZnVuYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJbXV0ZXhfbG9jaygmdGF2aWwtPmNvZGVjX211dGV4KTsKKwl0YXZpbC0+YW5jX2Z1bmMgPSAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gZmFsc2UgOiB0cnVlKTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYW5jX2Z1bmMgJXgiLCBfX2Z1bmNfXywgdGF2aWwtPmFuY19mdW5jKTsKKworCWlmICh0YXZpbC0+YW5jX2Z1bmMgPT0gdHJ1ZSkgeworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFQVIiKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgRUFSIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVBUiBQQSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRUFSIik7CisJfQorCW11dGV4X3VubG9jaygmdGF2aWwtPmNvZGVjX211dGV4KTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljb25zdCBjaGFyICpmaWxlbmFtZTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCBpOworCWludCByZXQgPSAwOworCWludCBudW1fYW5jX3Nsb3RzOworCXN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIgKmFuY19oZWFkOworCXN0cnVjdCBmaXJtd2FyZV9jYWwgKmh3ZGVwX2NhbCA9IE5VTEw7CisJdTMyIGFuY193cml0ZXNfc2l6ZSA9IDA7CisJdTMyIGFuY19jYWxfc2l6ZSA9IDA7CisJaW50IGFuY19zaXplX3JlbWFpbmluZzsKKwl1MzIgKmFuY19wdHI7CisJdTE2IHJlZzsKKwl1OCBtYXNrLCB2YWw7CisJc2l6ZV90IGNhbF9zaXplOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwlpZiAoIXRhdmlsLT5hbmNfZnVuYykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwodGF2aWwtPmZ3X2RhdGEsIFdDRDlYWFhfQU5DX0NBTCk7CisJCWlmIChod2RlcF9jYWwpIHsKKwkJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCQljYWxfc2l6ZSA9IGh3ZGVwX2NhbC0+c2l6ZTsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyBod2RlcCBjYWxpYnJhdGlvbiwgY2FsX3NpemUgJXpkIiwKKwkJCQlfX2Z1bmNfXywgY2FsX3NpemUpOworCQl9IGVsc2UgeworCQkJZmlsZW5hbWUgPSAiV0NEOTM0WC9XQ0Q5MzRYX2FuYy5iaW4iOworCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBjb2RlYy0+ZGV2KTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWNxdWlyZSBBTkMgZGF0YTogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoIWZ3KSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgYW5jIGZ3XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQlkYXRhID0gZnctPmRhdGE7CisJCQljYWxfc2l6ZSA9IGZ3LT5zaXplOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIHJlcXVlc3RfZmlybXdhcmUgY2FsaWJyYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCQl9CisJCWlmIChjYWxfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgY2FsX3NpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCBjYWxfc2l6ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogRmlyc3QgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIgd3JpdGVzICovCisJCWFuY19oZWFkID0gKHN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIgKikoZGF0YSk7CisJCWFuY19wdHIgPSAodTMyICopKGRhdGEgKyBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcikpOworCQlhbmNfc2l6ZV9yZW1haW5pbmcgPSBjYWxfc2l6ZSAtCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcik7CisJCW51bV9hbmNfc2xvdHMgPSBhbmNfaGVhZC0+bnVtX2FuY19zbG90czsKKworCQlpZiAodGF2aWwtPmFuY19zbG90ID49IG51bV9hbmNfc2xvdHMpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEFOQyBzbG90IHNlbGVjdGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FuY19zbG90czsgaSsrKSB7CisJCQlpZiAoYW5jX3NpemVfcmVtYWluaW5nIDwgV0NEOTM0WF9QQUNLRURfUkVHX1NJWkUpIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCByZWdpc3RlciBmb3JtYXRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYW5jX3dyaXRlc19zaXplID0gKHUzMikoKmFuY19wdHIpOworCQkJYW5jX3NpemVfcmVtYWluaW5nIC09IHNpemVvZih1MzIpOworCQkJYW5jX3B0ciArPSAxOworCisJCQlpZiAoKGFuY193cml0ZXNfc2l6ZSAqIFdDRDkzNFhfUEFDS0VEX1JFR19TSVpFKSA+CisJCQkgICAgYW5jX3NpemVfcmVtYWluaW5nKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcmVnaXN0ZXIgZm9ybWF0XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJaWYgKHRhdmlsLT5hbmNfc2xvdCA9PSBpKQorCQkJCWJyZWFrOworCisJCQlhbmNfc2l6ZV9yZW1haW5pbmcgLT0gKGFuY193cml0ZXNfc2l6ZSAqCisJCQkJV0NEOTM0WF9QQUNLRURfUkVHX1NJWkUpOworCQkJYW5jX3B0ciArPSBhbmNfd3JpdGVzX3NpemU7CisJCX0KKwkJaWYgKGkgPT0gbnVtX2FuY19zbG90cykgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFNlbGVjdGVkIEFOQyBzbG90IG5vdCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWFuY19jYWxfc2l6ZSA9IGFuY193cml0ZXNfc2l6ZTsKKwkJZm9yIChpID0gMDsgaSA8IGFuY193cml0ZXNfc2l6ZTsgaSsrKSB7CisJCQlXQ0Q5MzRYX0NPREVDX1VOUEFDS19FTlRSWShhbmNfcHRyW2ldLCByZWcsIG1hc2ssIHZhbCk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsICh2YWwgJiBtYXNrKSk7CisJCX0KKworCQkvKiBSYXRlIGNvbnZlcnRlciBjbGsgZW5hYmxlIGFuZCBzZXQgYnlwYXNzIG1vZGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQU5DMF9SQ19DT01NT05fQ1RMLAorCQkJCSAgICAweDA1LCAweDA1KTsKKwkJaWYgKCFod2RlcF9jYWwpCisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfUkNfQ09NTU9OX0NUTCwKKwkJCQkgICAgMHgwNSwgMHgwMCk7CisJCWlmICghc3RyY21wKHctPm5hbWUsICJBTkMgRUFSIFBBIikgfHwKKwkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBTUEsxIFBBIikpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8xX0NUTCwKKwkJCQkJICAgIDB4MzAsIDB4MDApOworCQkJbXNsZWVwKDUwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8xX0NUTCwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKKwkJCQkJICAgIDB4MzgsIDB4MzgpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKKwkJCQkJICAgIDB4MDcsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKKwkJCQkJICAgIDB4MzgsIDB4MDApOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworZXJyOgorCWlmICghaHdkZXBfY2FsKQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX3ZpX2ZlZWRfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0KKwkJCQkJZGFwbV9rY29udHJvbF9nZXRfd2xpc3Qoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbF9wLT52aV9mZWVkX3ZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfdmlfZmVlZF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KKwkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7CisJdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7CisJdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVuYWJsZTogJWQsIHBvcnRfaWQ6JWQsIGRhaV9pZDogJWRcbiIsCisJCV9fZnVuY19fLCBlbmFibGUsIHBvcnRfaWQsIGRhaV9pZCk7CisKKwl0YXZpbF9wLT52aV9mZWVkX3ZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwltdXRleF9sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAocG9ydF9pZCA9PSBXQ0Q5MzRYX1RYMTQgJiYgIXRlc3RfYml0KFZJX1NFTlNFXzEsCisJCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE0XS5saXN0LAorCQkJCQkmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKKwkJCXNldF9iaXQoVklfU0VOU0VfMSwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKKwkJfQorCQlpZiAocG9ydF9pZCA9PSBXQ0Q5MzRYX1RYMTUgJiYgIXRlc3RfYml0KFZJX1NFTlNFXzIsCisJCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE1XS5saXN0LAorCQkJCQkmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKKwkJCXNldF9iaXQoVklfU0VOU0VfMiwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwb3J0X2lkID09IFdDRDkzNFhfVFgxNCAmJiB0ZXN0X2JpdChWSV9TRU5TRV8xLAorCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE0XS5saXN0KTsKKwkJCWNsZWFyX2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOworCQl9CisJCWlmIChwb3J0X2lkID09IFdDRDkzNFhfVFgxNSAmJiB0ZXN0X2JpdChWSV9TRU5TRV8yLAorCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE1XS5saXN0KTsKKwkJCWNsZWFyX2JpdChWSV9TRU5TRV8yLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOworCQl9CisJfQorCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGF2aWxfcC0+dHhfcG9ydF92YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKwlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KKwkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7CisJdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7CisJdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXUzMiB2dGFibGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWUgJXMgY25hbWUgJXMgdmFsdWUgJXUgc2hpZnQgJWQgaXRlbSAlbGRcbiIsCisJCSAgX19mdW5jX18sCisJCXdpZGdldC0+bmFtZSwgdWNvbnRyb2wtPmlkLm5hbWUsIHRhdmlsX3AtPnR4X3BvcnRfdmFsdWUsCisJCXdpZGdldC0+c2hpZnQsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCW11dGV4X2xvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKKwlpZiAoZGFpX2lkID49IEFSUkFZX1NJWkUodnBvcnRfc2xpbV9jaGVja190YWJsZSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGRhaV9pZDogJWQsIG91dCBvZiBib3VuZHNcbiIsCisJCQlfX2Z1bmNfXywgZGFpX2lkKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl2dGFibGUgPSB2cG9ydF9zbGltX2NoZWNrX3RhYmxlW2RhaV9pZF07CisKKwlzd2l0Y2ggKGRhaV9pZCkgeworCWNhc2UgQUlGMV9DQVA6CisJY2FzZSBBSUYyX0NBUDoKKwljYXNlIEFJRjNfQ0FQOgorCQkvKiBvbmx5IGFkZCB0byB0aGUgbGlzdCBpZiB2YWx1ZSBub3Qgc2V0ICovCisJCWlmIChlbmFibGUgJiYgISh0YXZpbF9wLT50eF9wb3J0X3ZhbHVlICYgMSA8PCBwb3J0X2lkKSkgeworCQkJaWYgKHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbih2dGFibGUsIHBvcnRfaWQsCisJCQkgICAgdGF2aWxfcC0+ZGFpLCBOVU1fQ09ERUNfREFJUykpIHsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBpcyB1c2VkIGJ5IG90aGVyIHZpcnR1YWwgcG9ydFxuIiwKKwkJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJdGF2aWxfcC0+dHhfcG9ydF92YWx1ZSB8PSAxIDw8IHBvcnRfaWQ7CisJCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbcG9ydF9pZF0ubGlzdCwKKwkJCQkgICAgICAmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKKwkJfSBlbHNlIGlmICghZW5hYmxlICYmICh0YXZpbF9wLT50eF9wb3J0X3ZhbHVlICYKKwkJCSAgIDEgPDwgcG9ydF9pZCkpIHsKKwkJCXRhdmlsX3AtPnR4X3BvcnRfdmFsdWUgJj0gfigxIDw8IHBvcnRfaWQpOworCQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGVuYWJsZSkKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBwb3J0IGlzIHVzZWQgYnlcbiIKKwkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQllbHNlCisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgcG9ydCBpcyBub3QgdXNlZCBieVxuIgorCQkJCQkidGhpcyB2aXJ0dWFsIHBvcnRcbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCS8qIGF2b2lkIHVwZGF0ZSBwb3dlciBmdW5jdGlvbiAqLworCQkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFJRjRfTUFEX1RYOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEFJRiAlZFxuIiwgZGFpX2lkKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbmFtZSAlcyBzbmFtZSAlcyB1cGRhdGVkIHZhbHVlICV1IHNoaWZ0ICVkXG4iLAorCQlfX2Z1bmNfXywgd2lkZ2V0LT5uYW1lLCB3aWRnZXQtPnNuYW1lLCB0YXZpbF9wLT50eF9wb3J0X3ZhbHVlLAorCQl3aWRnZXQtPnNoaWZ0KTsKKworCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCB1cGRhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9tdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJCQl0YXZpbF9wLT5yeF9wb3J0X3ZhbHVlW3dpZGdldC0+c2hpZnRdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fcnhfbXV4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0KKwkJCQkJZGFwbV9rY29udHJvbF9nZXRfd2xpc3Qoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCXVuc2lnbmVkIGludCByeF9wb3J0X3ZhbHVlOworCXUzMiBwb3J0X2lkID0gd2lkZ2V0LT5zaGlmdDsKKworCXRhdmlsX3AtPnJ4X3BvcnRfdmFsdWVbcG9ydF9pZF0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXJ4X3BvcnRfdmFsdWUgPSB0YXZpbF9wLT5yeF9wb3J0X3ZhbHVlW3BvcnRfaWRdOworCisJbXV0ZXhfbG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3bmFtZSAlcyBjbmFtZSAlcyB2YWx1ZSAldSBzaGlmdCAlZCBpdGVtICVsZFxuIiwKKwkJX19mdW5jX18sIHdpZGdldC0+bmFtZSwgdWNvbnRyb2wtPmlkLm5hbWUsCisJCXJ4X3BvcnRfdmFsdWUsIHdpZGdldC0+c2hpZnQsCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCS8qIHZhbHVlIG5lZWQgdG8gbWF0Y2ggdGhlIFZpcnR1YWwgcG9ydCBhbmQgQUlGIG51bWJlciAqLworCXN3aXRjaCAocnhfcG9ydF92YWx1ZSkgeworCWNhc2UgMDoKKwkJbGlzdF9kZWxfaW5pdCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QpOworCQlicmVhazsKKwljYXNlIDE6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhdmlsX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhdmlsX3AtPmRhaVtBSUYyX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYyX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhdmlsX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCisJCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAorCQkJJnRhdmlsX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAorCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEFJRiAlZFxuIiwgcnhfcG9ydF92YWx1ZSk7CisJCWdvdG8gZXJyOworCX0KK3J0bjoKKwltdXRleF91bmxvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKKwlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAorCQkJCSAgICAgIHJ4X3BvcnRfdmFsdWUsIGUsIHVwZGF0ZSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwltdXRleF91bmxvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKAorCQkJCQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCWludCBwb3J0X251bSA9IDA7CisJdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKKwl1OCB2YWwgPSAwOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wOworCisJaWYgKCFkYWkgfHwgIWNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7CisJCWlmIChjaC0+cG9ydCA+PSBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSB7CisJCQlwb3J0X251bSA9IGNoLT5wb3J0IC0gV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUjsKKwkJCXJlZyA9IFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfUlhfRU4wICsgKHBvcnRfbnVtIC8gOCk7CisJCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXZpbF9wLT53Y2Q5eHh4LAorCQkJCXJlZyk7CisJCQlpZiAoISh2YWwgJiBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKSkpIHsKKwkJCQl2YWwgfD0gQllURV9CSVRfTUFTSyhwb3J0X251bSk7CisJCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKAorCQkJCQl0YXZpbF9wLT53Y2Q5eHh4LCByZWcsIHZhbCk7CisJCQkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoCisJCQkJCXRhdmlsX3AtPndjZDl4eHgsIHJlZyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwb3J0X251bSA9IGNoLT5wb3J0OworCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKyAocG9ydF9udW0gLyA4KTsKKwkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHRhdmlsX3AtPndjZDl4eHgsCisJCQkJcmVnKTsKKwkJCWlmICghKHZhbCAmIEJZVEVfQklUX01BU0socG9ydF9udW0pKSkgeworCQkJCXZhbCB8PSBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKTsKKwkJCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUodGF2aWxfcC0+d2NkOXh4eCwKKwkJCQkJcmVnLCB2YWwpOworCQkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAorCQkJCQl0YXZpbF9wLT53Y2Q5eHh4LCByZWcpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAorCQkJCQkgIGJvb2wgdXApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHhfY2ggKmNoOworCisJaWYgKHVwKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQkJcmV0ID0gd2NkOXh4eF9nZXRfc2xhdmVfcG9ydChjaC0+Y2hfbnVtKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogSW52YWxpZCBzbGF2ZSBwb3J0IElEOiAlZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2JpdChyZXQsICZkYWktPmNoX21hc2spOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRhaS0+ZGFpX3dhaXQsIChkYWktPmNoX21hc2sgPT0gMCksCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKAorCQkJCQkJV0NEOTM0WF9TTElNX0NMT1NFX1RJTUVPVVQpKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXByX2VycigiJXM6IFNsaW0gY2xvc2UgdHgvcnggd2FpdCB0aW1lb3V0LCBjaF9tYXNrOjB4JWx4XG4iLAorCQkJCV9fZnVuY19fLCBkYWktPmNoX21hc2spOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfbXV0ZV9kc2Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpjaF9saXN0KQoreworCXU4IGRzZDBfaW47CisJdTggZHNkMV9pbjsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisKKwkvKiBSZWFkIERTRCBJbnB1dCBQb3J0cyAqLworCWRzZDBfaW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzApICYgMHgzQykgPj4gMjsKKwlkc2QxX2luID0gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcwKSAmIDB4M0MpID4+IDI7CisKKwlpZiAoKGRzZDBfaW4gPT0gMCkgJiYgKGRzZDFfaW4gPT0gMCkpCisJCXJldHVybjsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHBvcnRzIGdldHRpbmcgZGlzYWJsZWQgYXJlIGNvbm5lY3RlZCB0byBEU0QgaW5wdXRzLgorCSAqIElmIGNvbm5lY3RlZCwgZW5hYmxlIERTRCBtdXRlIHRvIGF2b2lkIERDIGVudGVyaW5nIGludG8gRFNEIEZpbHRlcgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsIGNoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNoLT5wb3J0ID09IChkc2QwX2luICsgV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiAtIDEpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcyLAorCQkJCQkgICAgMHgwNCwgMHgwNCk7CisJCWlmIChjaC0+cG9ydCA9PSAoZHNkMV9pbiArIFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIgLSAxKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwKKwkJCQkJICAgIDB4MDQsIDB4MDQpOworCX0KK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXJ4KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHdjZDl4eHggKmNvcmU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOworCisJY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50IGNhbGxlZCEgY29kZWMgbmFtZSAlcyBudW1fZGFpICVkXG4iCisJCSJzdHJlYW0gbmFtZSAlcyBldmVudCAlZFxuIiwKKwkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSwKKwkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSwgZXZlbnQpOworCisJZGFpID0gJnRhdmlsX3AtPmRhaVt3LT5zaGlmdF07CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHctPm5hbWUgJXMgdy0+c2hpZnQgJWQgZXZlbnQgJWRcbiIsCisJCSBfX2Z1bmNfXywgdy0+bmFtZSwgdy0+c2hpZnQsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOworCQl0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9wb3J0X2ludHIoZGFpLCBjb2RlYyk7CisJCSh2b2lkKSB0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCB0cnVlKTsKKwkJcmV0ID0gd2NkOXh4eF9jZmdfc2xpbV9zY2hfcngoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAorCQkJCQkgICAgICBkYWktPnJhdGUsIGRhaS0+Yml0X3dpZHRoLAorCQkJCQkgICAgICAmZGFpLT5ncnBoKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmIChkc2RfY29uZikKKwkJCXRhdmlsX2NvZGVjX211dGVfZHNkKGNvZGVjLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QpOworCisJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJICAgICAgZGFpLT5ncnBoKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc2Nvbm5lY3QgUlggcG9ydCwgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCQlpZiAoIWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkpCisJCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCBmYWxzZSk7CisJCWVsc2UKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6IGJ1cyBpbiByZWNvdmVyeSBza2lwIGVuYWJsZSBzbGltX2NobWFzayIsCisJCQkJX19mdW5jX18pOworCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3J4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJCWRhaS0+Z3JwaCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdHgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlOworCWludCByZXQgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IHctPm5hbWUgJXMsIHctPnNoaWZ0ID0gJWQsIG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCisJCV9fZnVuY19fLCB3LT5uYW1lLCB3LT5zaGlmdCwKKwkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSk7CisKKwlkYWkgPSAmdGF2aWxfcC0+ZGFpW3ctPnNoaWZ0XTsKKwljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkgPSBmYWxzZTsKKwkJdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKGRhaSwgY29kZWMpOworCQkodm9pZCkgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgdHJ1ZSk7CisJCXJldCA9IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJICAgICAgZGFpLT5yYXRlLCBkYWktPmJpdF93aWR0aCwKKwkJCQkJICAgICAgJmRhaS0+Z3JwaCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJCWRhaS0+Z3JwaCk7CisJCWlmICghZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSkKKwkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsCisJCQkJCQkgICAgICAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJCQkgICAgICBkYWktPmdycGgpOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc2Nvbm5lY3QgUlggcG9ydCwgcmV0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdmlfZmVlZGJhY2soc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHdjZDl4eHggKmNvcmUgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWkgPSBOVUxMOworCisJY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWRldl9kYmcoY29kZWMtPmRldiwKKwkJIiVzOiBudW1fZGFpICVkIHN0cmVhbSBuYW1lICVzIHctPm5hbWUgJXMgZXZlbnQgJWQgc2hpZnQgJWRcbiIsCisJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm51bV9kYWksIHctPnNuYW1lLAorCQl3LT5uYW1lLCBldmVudCwgdy0+c2hpZnQpOworCisJaWYgKHctPnNoaWZ0ICE9IEFJRjRfVklGRUVEKSB7CisJCXByX2VycigiJXMgRXJyb3IgaW4gZW5hYmxpbmcgdGhlIHR4IHBhdGhcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlkYWkgPSAmdGF2aWxfcC0+ZGFpW3ctPnNoaWZ0XTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjEgZW5hYmxlZFxuIiwgX19mdW5jX18pOworCQkJLyogRW5hYmxlIFYmSSBzZW5zaW5nICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLAorCQkJCTB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLCAweDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCisJCQkJMHgxMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDAwKTsKKwkJfQorCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMiwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKSkgeworCQkJcHJfZGVidWcoIiVzOiBzcGtyMiBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkvKiBFbmFibGUgViZJIHNlbnNpbmcgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwKKwkJCQkweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCisJCQkJMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAorCQkJCTB4MTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKKwkJCQkweDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MDApOworCQl9CisJCWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkgPSBmYWxzZTsKKwkJdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKGRhaSwgY29kZWMpOworCQkodm9pZCkgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgdHJ1ZSk7CisJCXJldCA9IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJICAgICAgZGFpLT5yYXRlLCBkYWktPmJpdF93aWR0aCwKKwkJCQkJICAgICAgJmRhaS0+Z3JwaCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKKwkJCQkJCWRhaS0+Z3JwaCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyBlcnJvciBpbiBjbG9zZV9zbGltX3NjaF90eCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJaWYgKCFkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5KQorCQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoY29yZSwKKwkJCQkmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJZGFpLT5ncnBoKTsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBEaXNjb25uZWN0IFRYIHBvcnQsIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQl9CisJCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7CisJCQkvKiBEaXNhYmxlIFYmSSBzZW5zaW5nICovCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjEgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwgMHgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAorCQkJCTB4MjApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCisJCQkJMHgwMCk7CisJCX0KKwkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzIsICZ0YXZpbF9wLT5zdGF0dXNfbWFzaykpIHsKKwkJCS8qIERpc2FibGUgViZJIHNlbnNpbmcgKi8KKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMiBkaXNhYmxlZFxuIiwgX19mdW5jX18pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKKwkJCQkweDIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCisJCQkJMHgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAorCQkJCTB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKKwkJCQkweDAwKTsKKwkJfQorCQlicmVhazsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX3J4X2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl0YXZpbC0+cnhfYmlhc19jb3VudCsrOworCQlpZiAodGF2aWwtPnJ4X2JpYXNfY291bnQgPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdGF2aWwtPnJ4X2JpYXNfY291bnQtLTsKKwkJaWYgKCF0YXZpbC0+cnhfYmlhc19jb3VudCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCWJyZWFrOworCX07CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEN1cnJlbnQgUlggQklBUyB1c2VyIGNvdW50OiAlZFxuIiwgX19mdW5jX18sCisJCXRhdmlsLT5yeF9iaWFzX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9zcGtfYW5jX3VwZGF0ZV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNwa19hbmNfd29yayAqc3BrX2FuY19kd29yazsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWRlbGF5ZWRfd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlzcGtfYW5jX2R3b3JrID0gY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IHNwa19hbmNfd29yaywgZHdvcmspOworCXRhdmlsID0gc3BrX2FuY19kd29yay0+dGF2aWw7CisJY29kZWMgPSB0YXZpbC0+Y29kZWM7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfc3Brcl9hbmMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIGludCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIXRhdmlsLT5hbmNfZnVuYykKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdzogJXMgZXZlbnQ6ICVkIGFuYzogJWRcbiIsIF9fZnVuY19fLAorCQl3LT5uYW1lLCBldmVudCwgdGF2aWwtPmFuY19mdW5jKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdGF2aWwtPnNwa19hbmNfZHdvcmsuZHdvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhzcGtfYW5jX2VuX2RlbGF5KSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRhdmlsLT5zcGtfYW5jX2R3b3JrLmR3b3JrKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMCwKKwkJCQkgICAgMHgxMCwgMHgwMCk7CisJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2Vhcl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgaW50IGV2ZW50KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKgorCQkgKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKKwkJICogSFcgcmVxdWlyZW1lbnQKKwkJICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ1RMLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCkpICYKKwkJICAgICAweDEwKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwsCisJCQkJCSAgICAweDEwLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qCisJCSAqIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBkaXNhYmxlZCBhcyBwZXIKKwkJICogSFcgcmVxdWlyZW1lbnQKKwkJICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKworCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBFQVIgUEEiKSkpIHsKKwkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDEwLCAweDAwKTsKKwkJfQorCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfb3ZlcnJpZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgbW9kZSwKKwkJCQkgaW50IGV2ZW50KQoreworCWlmIChtb2RlID09IENMU19BQiB8fCBtb2RlID09IENMU19BQl9ISUZJKSB7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCQlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCVdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCkgJiAweDEwKSAmJgorCQkJCSghKHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ1RMKSAmIDB4MTApKSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLCAweDAyLCAweDAyKTsKKwkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLCAweDAyLCAweDAwKTsKKwkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2hwaHJfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbC0+ZHNkX2NvbmZpZzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwsCisJCQkJCSAgICAweDA2LCAoMHgwMyA8PCAxKSk7CisJCXNldF9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKKwkJaWYgKGRzZF9jb25mICYmCisJCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKSAmIDB4MDEpKSB7CisJCQkvKiBTZXQgcmVndWxhdG9yIG1vZGUgdG8gQUIgaWYgRFNEIGlzIGVuYWJsZWQgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLAorCQkJCQkgICAgMHgwMiwgMHgwMik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qCisJCSAqIDdtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJaWYgKHRlc3RfYml0KEhQSF9QQV9ERUxBWSwgJnRhdmlsLT5zdGF0dXNfbWFzaykpIHsKKwkJCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKwkJCWNsZWFyX2JpdChIUEhfUEFfREVMQVksICZ0YXZpbC0+c3RhdHVzX21hc2spOworCQl9CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUl9URVNULCAweDAxLCAweDAxKTsKKworCQkvKiBSZW1vdmUgbXV0ZSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsCisJCQkJICAgIDB4MTAsIDB4MDApOworCQkvKiBFbmFibGUgR00zIGJvb3N0ICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsCisJCQkJICAgIDB4ODAsIDB4ODApOworCQkvKiBFbmFibGUgQXV0b0Nob3AgdGltZXIgYXQgdGhlIGVuZCBvZiBwb3dlciB1cCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEsCisJCQkJICAgIDB4MDIsIDB4MDIpOworCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMKSkgJgorCQkJCSAgMHgxMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisJCWlmIChkc2RfY29uZiAmJgorCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCkgJiAweDAxKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwKKwkJCQkJICAgIDB4MDQsIDB4MDApOworCQl0YXZpbF9jb2RlY19vdmVycmlkZShjb2RlYywgdGF2aWwtPmhwaF9tb2RlLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCQkJICAgICBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGLAorCQkJCQkgICAgICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOworCQkvKiBFbmFibGUgRFNEIE11dGUgYmVmb3JlIFBBIGRpc2FibGUgKi8KKwkJaWYgKGRzZF9jb25mICYmCisJCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKSAmIDB4MDEpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcyLAorCQkJCQkgICAgMHgwNCwgMHgwNCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCwKKwkJCQkgICAgMHgxMCwgMHgxMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgZGlzYWJsZSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7CisJCXRhdmlsX2NvZGVjX292ZXJyaWRlKGNvZGVjLCB0YXZpbC0+aHBoX21vZGUsIGV2ZW50KTsKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGF2aWwtPm1iaGMtPm5vdGlmaWVyLAorCQkJCQkgICAgIFdDRF9FVkVOVF9QT1NUX0hQSFJfUEFfT0ZGLAorCQkJCQkgICAgICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOworCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLAorCQkJCQkgICAgMHgwNiwgMHgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9ocGhsX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWwtPmRzZF9jb25maWc7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLAorCQkJCQkgICAgMHgwNiwgKDB4MDMgPDwgMSkpOworCQlzZXRfYml0KEhQSF9QQV9ERUxBWSwgJnRhdmlsLT5zdGF0dXNfbWFzayk7CisJCWlmIChkc2RfY29uZiAmJgorCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCkgJiAweDAxKSkgeworCQkJLyogU2V0IHJlZ3VsYXRvciBtb2RlIHRvIEFCIGlmIERTRCBpcyBlbmFibGVkICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9SWF9TVVBQTElFUywKKwkJCQkJICAgIDB4MDIsIDB4MDIpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKgorCQkgKiA3bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKKwkJICogSFcgcmVxdWlyZW1lbnQKKwkJICovCisJCWlmICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXZpbC0+c3RhdHVzX21hc2spKSB7CisJCQl1c2xlZXBfcmFuZ2UoNzAwMCwgNzEwMCk7CisJCQljbGVhcl9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDEpOworCQkvKiBSZW1vdmUgTXV0ZSBvbiBwcmltYXJ5IHBhdGggKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ1RMLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJLyogRW5hYmxlIEdNMyBib29zdCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMLAorCQkJCSAgICAweDgwLCAweDgwKTsKKwkJLyogRW5hYmxlIEF1dG9DaG9wIHRpbWVyIGF0IHRoZSBlbmQgb2YgcG93ZXIgdXAgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLAorCQkJCSAgICAweDAyLCAweDAyKTsKKwkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCkpICYKKwkJCQkgIDB4MTApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQlpZiAoZHNkX2NvbmYgJiYKKwkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwpICYgMHgwMSkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzIsCisJCQkJCSAgICAweDA0LCAweDAwKTsKKwkJdGF2aWxfY29kZWNfb3ZlcnJpZGUoY29kZWMsIHRhdmlsLT5ocGhfbW9kZSwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXZpbC0+bWJoYy0+bm90aWZpZXIsCisJCQkJCSAgICAgV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09GRiwKKwkJCQkJICAgICAmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKKwkJLyogRW5hYmxlIERTRCBNdXRlIGJlZm9yZSBQQSBkaXNhYmxlICovCisJCWlmIChkc2RfY29uZiAmJgorCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCkgJiAweDAxKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwKKwkJCQkJICAgIDB4MDQsIDB4MDQpOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX0xfVEVTVCwgMHgwMSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwKKwkJCQkgICAgMHgxMCwgMHgxMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgZGlzYWJsZSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7CisJCXRhdmlsX2NvZGVjX292ZXJyaWRlKGNvZGVjLCB0YXZpbC0+aHBoX21vZGUsIGV2ZW50KTsKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGF2aWwtPm1iaGMtPm5vdGlmaWVyLAorCQkJCQkgICAgIFdDRF9FVkVOVF9QT1NUX0hQSExfUEFfT0ZGLAorCQkJCQkgICAgICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOworCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLAorCQkJCQkgICAgMHgwNiwgMHgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9saW5lb3V0X3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXUxNiBsaW5lb3V0X3ZvbF9yZWcgPSAwLCBsaW5lb3V0X21peF92b2xfcmVnID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJaWYgKHctPnJlZyA9PSBXQ0Q5MzRYX0FOQV9MT18xXzIpIHsKKwkJaWYgKHctPnNoaWZ0ID09IDcpIHsKKwkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NUTDsKKwkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMOworCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDYpIHsKKwkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NUTDsKKwkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEVycm9yIGVuYWJsaW5nIGxpbmVvdXQgUEFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl0YXZpbF9jb2RlY19vdmVycmlkZShjb2RlYywgQ0xTX0FCLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKgorCQkgKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKKwkJICogSFcgcmVxdWlyZW1lbnQKKwkJICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbGluZW91dF92b2xfcmVnLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgbGluZW91dF9taXhfdm9sX3JlZykpICYgMHgxMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBsaW5lb3V0X21peF92b2xfcmVnLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKgorCQkgKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZGlzYWJsZWQgYXMgcGVyCisJCSAqIEhXIHJlcXVpcmVtZW50CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJCXRhdmlsX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBDTFNfQUIsIGV2ZW50KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZWFyX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgaW50IGV2ZW50KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCS8qIERpc2FibGUgQXV0b0Nob3AgdGltZXIgZHVyaW5nIHBvd2VyIHVwICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisKKwkJaWYgKHRhdmlsLT5hbmNfZnVuYykKKwkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKKworCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIsCisJCQkgICAgIENMU19IX05PUk1BTCk7CisJCWlmICh0YXZpbC0+YW5jX2Z1bmMpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHgxMCwgMHgxMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIsCisJCQkgICAgIENMU19IX05PUk1BTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2hwaHJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGhwaF9tb2RlID0gdGF2aWwtPmhwaF9tb2RlOworCXU4IGRlbV9pbnA7CisJc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWwtPmRzZF9jb25maWc7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB3bmFtZTogJXMgZXZlbnQ6ICVkIGhwaF9tb2RlOiAlZFxuIiwgX19mdW5jX18sCisJCXctPm5hbWUsIGV2ZW50LCBocGhfbW9kZSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyogUmVhZCBERU0gSU5QIFNlbGVjdCAqLworCQlkZW1faW5wID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMwKSAmCisJCQkgIDB4MDM7CisJCWlmICgoKGhwaF9tb2RlID09IENMU19IX0hJRkkpIHx8IChocGhfbW9kZSA9PSBDTFNfSF9MT0hJRkkpIHx8CisJCSAgICAgKGhwaF9tb2RlID09IENMU19IX0xQKSkgJiYgKGRlbV9pbnAgIT0gMHgwMSkpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBERU0gSW5wdXQgbm90IHNldCBjb3JyZWN0bHksIGhwaF9tb2RlOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGhwaF9tb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgoaHBoX21vZGUgIT0gQ0xTX0hfTFApICYmIChocGhfbW9kZSAhPSBDTFNfSF9VTFApKQorCQkJLyogUmlwcGxlIGZyZXEgY29udHJvbCBlbmFibGUgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICAgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIsCisJCQkJCSAgICAgMHgwMSwgMHgwMSk7CisJCS8qIERpc2FibGUgQXV0b0Nob3AgdGltZXIgZHVyaW5nIHBvd2VyIHVwICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwKKwkJCQkgICAgMHgwMiwgMHgwMCk7CisJCS8qIFNldCBSREFDIGdhaW4gKi8KKwkJaWYgKFRBVklMX0lTXzFfMCh0YXZpbC0+d2NkOXh4eCkpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMLAorCQkJCQkgICAgMHhGMCwgMHg0MCk7CisJCWlmIChkc2RfY29uZiAmJgorCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCkgJiAweDAxKSkKKwkJCWhwaF9tb2RlID0gQ0xTX0hfSElGSTsKKworCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhSLAorCQkJICAgICBocGhfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiAxMDAwdXMgcmVxdWlyZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGF2aWwtPmNsc2hfZCwKKwkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUE9TVF9QQSwKKwkJCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBIUiwKKwkJCSAgICAgaHBoX21vZGUpOworCQlpZiAoKGhwaF9tb2RlICE9IENMU19IX0xQKSAmJiAoaHBoX21vZGUgIT0gQ0xTX0hfVUxQKSkKKwkJCS8qIFJpcHBsZSBmcmVxIGNvbnRyb2wgZGlzYWJsZSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX0ZSRVEyLAorCQkJCQkgICAgMHgwMSwgMHgwKTsKKwkJLyogUmUtc2V0IFJEQUMgZ2FpbiAqLworCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsCisJCQkJCSAgICAweEYwLCAweDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfaHBobF9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaHBoX21vZGUgPSB0YXZpbC0+aHBoX21vZGU7CisJdTggZGVtX2lucDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbC0+ZHNkX2NvbmZpZzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHduYW1lOiAlcyBldmVudDogJWQgaHBoX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJdy0+bmFtZSwgZXZlbnQsIGhwaF9tb2RlKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkvKiBSZWFkIERFTSBJTlAgU2VsZWN0ICovCisJCWRlbV9pbnAgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzApICYKKwkJCSAgMHgwMzsKKwkJaWYgKCgoaHBoX21vZGUgPT0gQ0xTX0hfSElGSSkgfHwgKGhwaF9tb2RlID09IENMU19IX0xPSElGSSkgfHwKKwkJICAgICAoaHBoX21vZGUgPT0gQ0xTX0hfTFApKSAmJiAoZGVtX2lucCAhPSAweDAxKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IERFTSBJbnB1dCBub3Qgc2V0IGNvcnJlY3RseSwgaHBoX21vZGU6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgaHBoX21vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChocGhfbW9kZSAhPSBDTFNfSF9MUCkgJiYgKGhwaF9tb2RlICE9IENMU19IX1VMUCkpCisJCQkvKiBSaXBwbGUgZnJlcSBjb250cm9sIGVuYWJsZSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgICBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMiwKKwkJCQkJICAgICAweDAxLCAweDAxKTsKKwkJLyogRGlzYWJsZSBBdXRvQ2hvcCB0aW1lciBkdXJpbmcgcG93ZXIgdXAgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLAorCQkJCSAgICAweDAyLCAweDAwKTsKKwkJLyogU2V0IFJEQUMgZ2FpbiAqLworCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsCisJCQkJCSAgICAweEYwLCAweDQwKTsKKwkJaWYgKGRzZF9jb25mICYmCisJCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMKSAmIDB4MDEpKQorCQkJaHBoX21vZGUgPSBDTFNfSF9ISUZJOworCisJCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhdmlsLT5jbHNoX2QsCisJCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCisJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0hQSEwsCisJCQkgICAgIGhwaF9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qIDEwMDB1cyByZXF1aXJlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhMLAorCQkJICAgICBocGhfbW9kZSk7CisJCWlmICgoaHBoX21vZGUgIT0gQ0xTX0hfTFApICYmIChocGhfbW9kZSAhPSBDTFNfSF9VTFApKQorCQkJLyogUmlwcGxlIGZyZXEgY29udHJvbCBkaXNhYmxlICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIsCisJCQkJCSAgICAweDAxLCAweDApOworCQkvKiBSZS1zZXQgUkRBQyBnYWluICovCisJCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwKKwkJCQkJICAgIDB4RjAsIDB4MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2xpbmVvdXRfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGF2aWwtPmNsc2hfZCwKKwkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUFJFX0RBQywKKwkJCSAgICAgV0NEX0NMU0hfU1RBVEVfTE8sCisJCQkgICAgIENMU19BQik7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAorCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAorCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9MTywKKwkJCSAgICAgQ0xTX0FCKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfc3BrX2Jvb3N0X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwl1MTYgYm9vc3RfcGF0aF9jdGwsIGJvb3N0X3BhdGhfY2ZnMTsKKwl1MTYgcmVnLCByZWdfbWl4OworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNyBDSEFJTiIpKSB7CisJCWJvb3N0X3BhdGhfY3RsID0gV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMOworCQlib29zdF9wYXRoX2NmZzEgPSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcxOworCQlyZWcgPSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DVEw7CisJCXJlZ19taXggPSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMOworCX0gZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UOCBDSEFJTiIpKSB7CisJCWJvb3N0X3BhdGhfY3RsID0gV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMOworCQlib29zdF9wYXRoX2NmZzEgPSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxOworCQlyZWcgPSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DVEw7CisJCXJlZ19taXggPSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMOworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIHdpZGdldDogJXNcbiIsCisJCQlfX2Z1bmNfXywgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2NmZzEsIDB4MDEsIDB4MDEpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2N0bCwgMHgxMCwgMHgxMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMHgxMCwgMHgwMCk7CisJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCByZWdfbWl4KSkgJiAweDEwKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnX21peCwgMHgxMCwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2N0bCwgMHgxMCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY2ZnMSwgMHgwMSwgMHgwMCk7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3RhdmlsX2NvZGVjX2VuYWJsZV9zd3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCWludCBjaF9jbnQgPSAwOworCisJdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoKChzdHJuc3RyKHctPm5hbWUsICJJTlQ3XyIsIHNpemVvZigiUlggSU5UN18iKSkpIHx8CisJCQkoc3RybnN0cih3LT5uYW1lLCAiSU5UNyBNSVgyIiwKKwkJCQkJCXNpemVvZigiUlggSU5UNyBNSVgyIikpKSkpCisJCQl0YXZpbC0+c3dyLnJ4XzdfY291bnQrKzsKKwkJaWYgKChzdHJuc3RyKHctPm5hbWUsICJJTlQ4XyIsIHNpemVvZigiUlggSU5UOF8iKSkpICYmCisJCSAgICAhdGF2aWwtPnN3ci5yeF84X2NvdW50KQorCQkJdGF2aWwtPnN3ci5yeF84X2NvdW50Kys7CisJCWNoX2NudCA9ICEhKHRhdmlsLT5zd3IucnhfN19jb3VudCkgKyB0YXZpbC0+c3dyLnJ4XzhfY291bnQ7CisKKwkJc3dybV93Y2Rfbm90aWZ5KHRhdmlsLT5zd3IuY3RybF9kYXRhWzBdLnN3cl9wZGV2LAorCQkJCVNXUl9ERVZJQ0VfVVAsIE5VTEwpOworCQlzd3JtX3djZF9ub3RpZnkodGF2aWwtPnN3ci5jdHJsX2RhdGFbMF0uc3dyX3BkZXYsCisJCQkJU1dSX1NFVF9OVU1fUlhfQ0gsICZjaF9jbnQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJaWYgKChzdHJuc3RyKHctPm5hbWUsICJJTlQ3XyIsIHNpemVvZigiUlggSU5UN18iKSkpICB8fAorCQkJKHN0cm5zdHIody0+bmFtZSwgIklOVDcgTUlYMiIsCisJCQlzaXplb2YoIlJYIElOVDcgTUlYMiIpKSkpCisJCQl0YXZpbC0+c3dyLnJ4XzdfY291bnQtLTsKKwkJaWYgKChzdHJuc3RyKHctPm5hbWUsICJJTlQ4XyIsIHNpemVvZigiUlggSU5UOF8iKSkpICYmCisJCSAgICB0YXZpbC0+c3dyLnJ4XzhfY291bnQpCisJCQl0YXZpbC0+c3dyLnJ4XzhfY291bnQtLTsKKwkJY2hfY250ID0gISEodGF2aWwtPnN3ci5yeF83X2NvdW50KSArIHRhdmlsLT5zd3IucnhfOF9jb3VudDsKKworCQlzd3JtX3djZF9ub3RpZnkodGF2aWwtPnN3ci5jdHJsX2RhdGFbMF0uc3dyX3BkZXYsCisJCQkJU1dSX1NFVF9OVU1fUlhfQ0gsICZjaF9jbnQpOworCisJCWJyZWFrOworCX0KKwlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogJXM6IGN1cnJlbnQgc3dyIGNoIGNudDogJWRcbiIsCisJCV9fZnVuY19fLCB3LT5uYW1lLCBjaF9jbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX3N3cihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJcmV0dXJuIF9fdGF2aWxfY29kZWNfZW5hYmxlX3N3cih3LCBldmVudCk7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfY29uZmlnX21hZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldCA9IDA7CisJaW50IGlkeDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXN0cnVjdCBmaXJtd2FyZV9jYWwgKmh3ZGVwX2NhbCA9IE5VTEw7CisJc3RydWN0IHdjZF9tYWRfYXVkaW9fY2FsICptYWRfY2FsID0gTlVMTDsKKwljb25zdCB2b2lkICpkYXRhOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gV0NEOTM0WF9NQURfQVVESU9fRklSTVdBUkVfUEFUSDsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzaXplX3QgY2FsX3NpemU7CisKKwlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0YXZpbC0+ZndfZGF0YSwgV0NEOVhYWF9NQURfQ0FMKTsKKwlpZiAoaHdkZXBfY2FsKSB7CisJCWRhdGEgPSBod2RlcF9jYWwtPmRhdGE7CisJCWNhbF9zaXplID0gaHdkZXBfY2FsLT5zaXplOworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBjb2RlYy0+ZGV2KTsKKwkJaWYgKHJldCB8fCAhZncpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IE1BRCBmaXJtd2FyZSBhY3F1aXJlIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlkYXRhID0gZnctPmRhdGE7CisJCWNhbF9zaXplID0gZnctPnNpemU7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlIGNhbGlicmF0aW9uXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCWlmIChjYWxfc2l6ZSA8IHNpemVvZigqbWFkX2NhbCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBJbmNvcnJlY3Qgc2l6ZSAlemQgZm9yIE1BRCBDYWwsIGV4cGVjdGVkICV6ZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfc2l6ZSwgc2l6ZW9mKCptYWRfY2FsKSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwltYWRfY2FsID0gKHN0cnVjdCB3Y2RfbWFkX2F1ZGlvX2NhbCAqKSAoZGF0YSk7CisJaWYgKCFtYWRfY2FsKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBjYWxpYnJhdGlvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzIsCisJCSAgICAgIG1hZF9jYWwtPm1pY3JvcGhvbmVfaW5mby5jeWNsZV90aW1lKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMSwgMHhGRiA8PCAzLAorCQkJICAgICgodWludDE2X3QpbWFkX2NhbC0+bWljcm9waG9uZV9pbmZvLnNldHRsZV90aW1lKQorCQkJICAgIDw8IDMpOworCisJLyogQXVkaW8gKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzgsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX29taXRfc2FtcGxlcyk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8xLAorCQkJICAgIDB4MDcgPDwgNCwgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfY29tcF90aW1lIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMiwgMHgwMyA8PCAyLAorCQkJICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzcsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX2RpZmZfdGhyZXNob2xkICYgMHgzRik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF81LAorCQkgICAgICBtYWRfY2FsLT5hdWRpb19pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzYsCisJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKG1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50cyk7CisJICAgICBpZHgrKykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9QVFIsCisJCQkJICAgIDB4M0YsIGlkeCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1ZBTCwKKwkJCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6TUFEIEF1ZGlvIElJUiBDb2VmWyVkXSA9IDBYJXgiLAorCQkJX19mdW5jX18sIGlkeCwKKwkJCW1hZF9jYWwtPmF1ZGlvX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwl9CisKKwkvKiBCZWFjb24gKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF84LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfb21pdF9zYW1wbGVzKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8xLAorCQkJICAgIDB4MDcgPDwgNCwgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX2NvbXBfdGltZSA8PCA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8yLCAweDAzIDw8IDIsCisJCQkgICAgbWFkX2NhbC0+YmVhY29uX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF83LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDFGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF81LAorCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfdGhyZXNob2xkX2xzYik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+YmVhY29uX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKG1hZF9jYWwtPmJlYWNvbl9pbmZvLmlpcl9jb2VmZmljaWVudHMpOworCSAgICAgaWR4KyspIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwKKwkJCQkgICAgMHgzRiwgaWR4KTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCwKKwkJCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLmlpcl9jb2VmZmljaWVudHNbaWR4XSk7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOk1BRCBCZWFjb24gSUlSIENvZWZbJWRdID0gMFgleCIsCisJCQlfX2Z1bmNfXywgaWR4LAorCQkJbWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKKwl9CisKKwkvKiBVbHRyYXNvdW5kICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzEsCisJCQkgICAgMHgwNyA8PCA0LAorCQkJICAgIG1hZF9jYWwtPnVsdHJhc291bmRfaW5mby5ybXNfY29tcF90aW1lIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8yLCAweDAzIDw8IDIsCisJCQkgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLmRldGVjdGlvbl9tZWNoYW5pc20gPDwgMik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzcsCisJCSAgICAgIG1hZF9jYWwtPnVsdHJhc291bmRfaW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDFGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNSwKKwkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNiwKKwkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc190aHJlc2hvbGRfbXNiKTsKKworZG9uZToKKwlpZiAoIWh3ZGVwX2NhbCkKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fdGF2aWxfY29kZWNfZW5hYmxlX21hZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCWludCByYyA9IDA7CisKKwkvKiBSZXR1cm4gaWYgQ1BFIElOUFVUIGlzIERFQzEgKi8KKwlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHKSAmIDB4MDQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1BRCBpcyBieXBhc3NlZCwgc2tpcCBtYWQgJXNcbiIsCisJCQlfX2Z1bmNfXywgZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVuYWJsZSA9ICVzXG4iLCBfX2Z1bmNfXywKKwkJZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzIsCisJCQkJICAgIDB4MDMsIDB4MDMpOworCQlyYyA9IHRhdmlsX2NvZGVjX2NvbmZpZ19tYWQoY29kZWMpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8yLAorCQkJCQkgICAgMHgwMywgMHgwMCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKiBUdXJuIG9uIE1BRCBjbGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfTUFEX0NUTCwKKwkJCQkgICAgMHgwMSwgMHgwMSk7CisKKwkJLyogVW5kbyByZXNldCBmb3IgTUFEICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsCisJCQkJICAgIDB4MDIsIDB4MDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMiwKKwkJCQkgICAgMHgwMywgMHgwMCk7CisJCS8qIFJlc2V0IHRoZSBNQUQgYmxvY2sgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfTUFEX0NUTCwKKwkJCQkgICAgMHgwMiwgMHgwMik7CisJCS8qIFR1cm4gb2ZmIE1BRCBjbGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfTUFEX0NUTCwKKwkJCQkgICAgMHgwMSwgMHgwMCk7CisJfQorZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfYXBlX2VuYWJsZV9tYWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcsIDB4NDAsIDB4NDApOworCQlyYyA9IF9fdGF2aWxfY29kZWNfZW5hYmxlX21hZChjb2RlYywgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcsIDB4NDAsIDB4MDApOworCQlfX3RhdmlsX2NvZGVjX2VuYWJsZV9tYWQoY29kZWMsIGZhbHNlKTsKKwkJYnJlYWs7CisJfQorCisJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2NwZV9tYWRfY3RsKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJdGF2aWwtPm1hZF9zd2l0Y2hfY250Kys7CisJCWlmICh0YXZpbC0+bWFkX3N3aXRjaF9jbnQgIT0gMSkKKwkJCWdvdG8gZG9uZTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAweDIwLCAweDIwKTsKKwkJcmMgPSBfX3RhdmlsX2NvZGVjX2VuYWJsZV9tYWQoY29kZWMsIHRydWUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJdGF2aWwtPm1hZF9zd2l0Y2hfY250LS07CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQl0YXZpbC0+bWFkX3N3aXRjaF9jbnQtLTsKKwkJaWYgKHRhdmlsLT5tYWRfc3dpdGNoX2NudCAhPSAwKQorCQkJZ290byBkb25lOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcsIDB4MjAsIDB4MDApOworCQlfX3RhdmlsX2NvZGVjX2VuYWJsZV9tYWQoY29kZWMsIGZhbHNlKTsKKwkJYnJlYWs7CisJfQorZG9uZToKKwlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogZXZlbnQgPSAlZCwgbWFkX3N3aXRjaF9jbnQgPSAlZFxuIiwKKwkJX19mdW5jX18sIGV2ZW50LCB0YXZpbC0+bWFkX3N3aXRjaF9jbnQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0YXZpbF9nZXRfYXNyY19tb2RlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwgaW50IGFzcmMsCisJCQkgICAgICAgdTggbWFpbl9zciwgdTggbWl4X3NyKQoreworCXU4IGFzcmNfb3V0cHV0X21vZGU7CisJaW50IGFzcmNfbW9kZSA9IENPTlZfODhQMktfVE9fMzg0SzsKKworCWlmICgoYXNyYyA8IDApIHx8IChhc3JjID49IEFTUkNfTUFYKSkKKwkJcmV0dXJuIDA7CisKKwlhc3JjX291dHB1dF9tb2RlID0gdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbYXNyY107CisKKwlpZiAoYXNyY19vdXRwdXRfbW9kZSkgeworCQkvKgorCQkgKiBJZiBNaXggc2FtcGxlIHJhdGUgaXMgPCA5NktIeiwgdXNlIDk2SyB0byAzNTIuOEsKKwkJICogY29udmVyc2lvbiwgb3IgZWxzZSB1c2UgMzg0SyB0byAzNTIuOEsgY29udmVyc2lvbgorCQkgKi8KKwkJaWYgKG1peF9zciA8IDUpCisJCQlhc3JjX21vZGUgPSBDT05WXzk2S19UT18zNTJQOEs7CisJCWVsc2UKKwkJCWFzcmNfbW9kZSA9IENPTlZfMzg0S19UT18zNTJQOEs7CisJfSBlbHNlIHsKKwkJLyogSW50ZWdlciBtYWluIGFuZCBGcmFjdGlvbmFsIG1peCBwYXRoICovCisJCWlmIChtYWluX3NyIDwgOCAmJiBtaXhfc3IgPiA5KSB7CisJCQlhc3JjX21vZGUgPSBDT05WXzM1MlA4S19UT18zODRLOworCQl9IGVsc2UgaWYgKG1haW5fc3IgPiA4ICYmIG1peF9zciA8IDgpIHsKKwkJCS8qIEZyYWN0aW9uYWwgbWFpbiBhbmQgSW50ZWdlciBtaXggcGF0aCAqLworCQkJaWYgKG1peF9zciA8IDUpCisJCQkJYXNyY19tb2RlID0gQ09OVl85NktfVE9fMzUyUDhLOworCQkJZWxzZQorCQkJCWFzcmNfbW9kZSA9IENPTlZfMzg0S19UT18zNTJQOEs7CisJCX0gZWxzZSBpZiAobWFpbl9zciA8IDggJiYgbWl4X3NyIDwgOCkgeworCQkJLyogSW50ZWdlciBtYWluIGFuZCBJbnRlZ2VyIG1peCBwYXRoICovCisJCQlhc3JjX21vZGUgPSBDT05WXzk2S19UT18zODRLOworCQl9CisJfQorCisJcmV0dXJuIGFzcmNfbW9kZTsKK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfYXNyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgaW50IGFzcmNfaW4sIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgY2ZnX3JlZywgY3RsX3JlZywgY2xrX3JlZywgYXNyY19jdGwsIG1peF9jdGxfcmVnOworCWludCBhc3JjLCByZXQgPSAwOworCXU4IG1haW5fc3IsIG1peF9zciwgYXNyY19tb2RlID0gMDsKKworCXN3aXRjaCAoYXNyY19pbikgeworCWNhc2UgQVNSQ19JTl9IUEhMOgorCQljZmdfcmVnID0gV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMDsKKwkJY3RsX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTDsKKwkJY2xrX3JlZyA9IFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NMS19SU1RfQ1RMOworCQlhc3JjX2N0bCA9IFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDE7CisJCWFzcmMgPSBBU1JDMDsKKwkJYnJlYWs7CisJY2FzZSBBU1JDX0lOX0xPMToKKwkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzA7CisJCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DVEw7CisJCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DTEtfUlNUX0NUTDsKKwkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwxOworCQlhc3JjID0gQVNSQzA7CisJCWJyZWFrOworCWNhc2UgQVNSQ19JTl9IUEhSOgorCQljZmdfcmVnID0gV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMDsKKwkJY3RsX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTDsKKwkJY2xrX3JlZyA9IFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NMS19SU1RfQ1RMOworCQlhc3JjX2N0bCA9IFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NUTDE7CisJCWFzcmMgPSBBU1JDMTsKKwkJYnJlYWs7CisJY2FzZSBBU1JDX0lOX0xPMjoKKwkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzA7CisJCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DVEw7CisJCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DTEtfUlNUX0NUTDsKKwkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxOworCQlhc3JjID0gQVNSQzE7CisJCWJyZWFrOworCWNhc2UgQVNSQ19JTl9TUEtSMToKKwkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzA7CisJCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DVEw7CisJCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDMl9DTEtfUlNUX0NUTDsKKwkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwxOworCQlhc3JjID0gQVNSQzI7CisJCWJyZWFrOworCWNhc2UgQVNSQ19JTl9TUEtSMjoKKwkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzA7CisJCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DVEw7CisJCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDM19DTEtfUlNUX0NUTDsKKwkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwxOworCQlhc3JjID0gQVNSQzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGFzcmMgaW5wdXQgOiVkXG4iLCBfX2Z1bmNfXywKKwkJCWFzcmNfaW4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAodGF2aWwtPmFzcmNfdXNlcnNbYXNyY10gPT0gMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2ZnX3JlZywgMHg4MCwgMHg4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjbGtfcmVnLCAweDAxLCAweDAxKTsKKwkJCW1haW5fc3IgPSBzbmRfc29jX3JlYWQoY29kZWMsIGN0bF9yZWcpICYgMHgwRjsKKwkJCW1peF9jdGxfcmVnID0gY3RsX3JlZyArIDU7CisJCQltaXhfc3IgPSBzbmRfc29jX3JlYWQoY29kZWMsIG1peF9jdGxfcmVnKSAmIDB4MEY7CisJCQlhc3JjX21vZGUgPSB0YXZpbF9nZXRfYXNyY19tb2RlKHRhdmlsLCBhc3JjLAorCQkJCQkJCW1haW5fc3IsIG1peF9zcik7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWFpbl9zcjolZCBtaXhfc3I6JWQgYXNyY19tb2RlICVkXG4iLAorCQkJCV9fZnVuY19fLCBtYWluX3NyLCBtaXhfc3IsIGFzcmNfbW9kZSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhc3JjX2N0bCwgMHgwNywgYXNyY19tb2RlKTsKKwkJfQorCQl0YXZpbC0+YXNyY191c2Vyc1thc3JjXSsrOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdGF2aWwtPmFzcmNfdXNlcnNbYXNyY10tLTsKKwkJaWYgKHRhdmlsLT5hc3JjX3VzZXJzW2FzcmNdIDw9IDApIHsKKwkJCXRhdmlsLT5hc3JjX3VzZXJzW2FzcmNdID0gMDsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFzcmNfY3RsLCAweDA3LCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNmZ19yZWcsIDB4ODAsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2xrX3JlZywgMHgwMSwgMHgwMCk7CisJCX0KKwkJYnJlYWs7CisJfTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBBU1JDJWQsIHVzZXJzOiAlZFxuIiwKKwkJX19mdW5jX18sIGFzcmMsIHRhdmlsLT5hc3JjX3VzZXJzW2FzcmNdKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9hc3JjX3Jlc2FtcGxlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgICBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCWludCByZXQgPSAwOworCXU4IGNmZywgYXNyY19pbjsKKworCWNmZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwKTsKKwlpZiAoIShjZmcgJiAweEZGKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogQVNSQyV1IGlucHV0IG5vdCBzZWxlY3RlZFxuIiwKKwkJCV9fZnVuY19fLCB3LT5zaGlmdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAody0+c2hpZnQpIHsKKwljYXNlIEFTUkMwOgorCQlhc3JjX2luID0gKChjZmcgJiAweDAzKSA9PSAxKSA/IEFTUkNfSU5fSFBITCA6IEFTUkNfSU5fTE8xOworCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYXNyYyhjb2RlYywgYXNyY19pbiwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIEFTUkMxOgorCQlhc3JjX2luID0gKChjZmcgJiAweDBDKSA9PSA0KSA/IEFTUkNfSU5fSFBIUiA6IEFTUkNfSU5fTE8yOworCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYXNyYyhjb2RlYywgYXNyY19pbiwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIEFTUkMyOgorCQlhc3JjX2luID0gKChjZmcgJiAweDMwKSA9PSAweDIwKSA/IEFTUkNfSU5fU1BLUjEgOiBBU1JDX0lOVkFMSUQ7CisJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hc3JjKGNvZGVjLCBhc3JjX2luLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgQVNSQzM6CisJCWFzcmNfaW4gPSAoKGNmZyAmIDB4QzApID09IDB4ODApID8gQVNSQ19JTl9TUEtSMiA6IEFTUkNfSU5WQUxJRDsKKwkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX2FzcmMoY29kZWMsIGFzcmNfaW4sIGV2ZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgYXNyYzoldVxuIiwgX19mdW5jX18sCisJCQl3LT5zaGlmdCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWlmICgrK3RhdmlsLT5uYXRpdmVfY2xrX3VzZXJzID09IDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0xLX1NZU19QTExfRU5BQkxFUywKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJdXNsZWVwX3JhbmdlKDEwMCwgMTIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxLAorCQkJCQkgICAgMHgwNiwgMHgwMik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUsCisJCQkJCSAgICAweDA0LCAweDAwKTsKKwkJCXVzbGVlcF9yYW5nZSgzMCwgNTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKKwkJCQkJMHgwMiwgMHgwMik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wsCisJCQkJCTB4MTAsIDB4MTApOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICh0YXZpbC0+bmF0aXZlX2Nsa191c2VycyAmJgorCQkgICAgKC0tdGF2aWwtPm5hdGl2ZV9jbGtfdXNlcnMgPT0gMCkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwKKwkJCQkJMHgxMCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAorCQkJCQkweDAyLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLAorCQkJCQkgICAgMHgwNCwgMHgwNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEsCisJCQkJCSAgICAweDA2LCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0xLX1NZU19QTExfRU5BQkxFUywKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQl9CisJCWJyZWFrOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBuYXRpdmVfY2xrX3VzZXJzOiAlZCwgZXZlbnQ6ICVkXG4iLAorCQlfX2Z1bmNfXywgdGF2aWwtPm5hdGl2ZV9jbGtfdXNlcnMsIGV2ZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19ocGhkZWxheV9sdXRieXBhc3Moc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICB1MTYgaW50ZXJwX2lkeCwgaW50IGV2ZW50KQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXU4IGhwaF9kbHlfbWFzazsKKwl1MTYgaHBoX2x1dF9ieXBhc3NfcmVnID0gMDsKKwl1MTYgaHBoX2NvbXBfY3RybDcgPSAwOworCisKKwlzd2l0Y2ggKGludGVycF9pZHgpIHsKKwljYXNlIElOVEVSUF9IUEhMOgorCQlocGhfZGx5X21hc2sgPSAxOworCQlocGhfbHV0X2J5cGFzc19yZWcgPSBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX0xVVDsKKwkJaHBoX2NvbXBfY3RybDcgPSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDc7CisJCWJyZWFrOworCWNhc2UgSU5URVJQX0hQSFI6CisJCWhwaF9kbHlfbWFzayA9IDI7CisJCWhwaF9sdXRfYnlwYXNzX3JlZyA9IFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfTFVUOworCQlocGhfY29tcF9jdHJsNyA9IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGhwaF9sdXRfYnlwYXNzX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDAsCisJCQkJICAgIGhwaF9kbHlfbWFzaywgMHgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBoX2x1dF9ieXBhc3NfcmVnLCAweDgwLCAweDgwKTsKKwkJaWYgKHRhdmlsLT5ocGhfbW9kZSA9PSBDTFNfSF9VTFApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGhfY29tcF9jdHJsNywgMHgyMCwgMHgyMCk7CisJfQorCisJaWYgKGhwaF9sdXRfYnlwYXNzX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19DTFNIX1RFU1QwLAorCQkJCSAgICBocGhfZGx5X21hc2ssIGhwaF9kbHlfbWFzayk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwaF9sdXRfYnlwYXNzX3JlZywgMHg4MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwaF9jb21wX2N0cmw3LCAweDIwLCAweDApOworCX0KK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfaGQyX2NvbnRyb2woc3RydWN0IHRhdmlsX3ByaXYgKnByaXYsCisJCQkJICAgIHUxNiBpbnRlcnBfaWR4LCBpbnQgZXZlbnQpCit7CisJdTE2IGhkMl9zY2FsZV9yZWc7CisJdTE2IGhkMl9lbmFibGVfcmVnID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBwcml2LT5jb2RlYzsKKworCWlmIChUQVZJTF9JU18xXzEocHJpdi0+d2NkOXh4eCkpCisJCXJldHVybjsKKworCXN3aXRjaCAoaW50ZXJwX2lkeCkgeworCWNhc2UgSU5URVJQX0hQSEw6CisJCWhkMl9zY2FsZV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMzOworCQloZDJfZW5hYmxlX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzA7CisJCWJyZWFrOworCWNhc2UgSU5URVJQX0hQSFI6CisJCWhkMl9zY2FsZV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMzOworCQloZDJfZW5hYmxlX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzA7CisJCWJyZWFrOworCX0KKworCWlmIChoZDJfZW5hYmxlX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9zY2FsZV9yZWcsIDB4M0MsIDB4MTQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfZW5hYmxlX3JlZywgMHgwNCwgMHgwNCk7CisJfQorCisJaWYgKGhkMl9lbmFibGVfcmVnICYmIFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9lbmFibGVfcmVnLCAweDA0LCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX3NjYWxlX3JlZywgMHgzQywgMHgwMCk7CisJfQorfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgIGludCBldmVudCwgaW50IGdhaW5fcmVnKQoreworCWludCBjb21wX2dhaW5fb2Zmc2V0LCB2YWw7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKHRhdmlsLT5zd3Iuc3Brcl9tb2RlKSB7CisJLyogQ29tcGFuZGVyIGdhaW4gaW4gU1BLUl9NT0RFMSBjYXNlIGlzIDEyIGRCICovCisJY2FzZSBXQ0Q5MzRYX1NQS1JfTU9ERV8xOgorCQljb21wX2dhaW5fb2Zmc2V0ID0gLTEyOworCQlicmVhazsKKwkvKiBEZWZhdWx0IGNhc2UgY29tcGFuZGVyIGdhaW4gaXMgMTUgZEIgKi8KKwlkZWZhdWx0OgorCQljb21wX2dhaW5fb2Zmc2V0ID0gLTE1OworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCS8qIEFwcGx5IGVhciBzcGtyIGdhaW4gb25seSBpZiBjb21wYW5kZXIgaXMgZW5hYmxlZCAqLworCQlpZiAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gJiYKKwkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCB8fAorCQkgICAgIGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCkgJiYKKwkJICAgICh0YXZpbC0+ZWFyX3Nwa3JfZ2FpbiAhPSAwKSkgeworCQkJLyogRm9yIGV4YW1wbGUsIHZhbCBpcyAtOCgtMTIrNS0xKSBmb3IgNGRCIG9mIGdhaW4gKi8KKwkJCXZhbCA9IGNvbXBfZ2Fpbl9vZmZzZXQgKyB0YXZpbC0+ZWFyX3Nwa3JfZ2FpbiAtIDE7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgdmFsKTsKKworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYNyBWb2x1bWUgJWQgZEJcbiIsCisJCQkJX19mdW5jX18sIHZhbCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qCisJCSAqIFJlc2V0IFJYNyB2b2x1bWUgdG8gMCBkQiBpZiBjb21wYW5kZXIgaXMgZW5hYmxlZCBhbmQKKwkJICogZWFyX3Nwa3JfZ2FpbiBpcyBub24temVyby4KKwkJICovCisJCWlmICh0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSAmJgorCQkgICAgKGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMKSAmJgorCQkgICAgKHRhdmlsLT5lYXJfc3Brcl9nYWluICE9IDApKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgMHgwKTsKKworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJlc2V0IFJYNyBWb2x1bWUgdG8gMCBkQlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29uZmlnX2NvbXBhbmRlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBpbnRlcnBfbiwKKwkJCQkgIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgY29tcDsKKwl1MTYgY29tcF9jdGwwX3JlZywgcnhfcGF0aF9jZmcwX3JlZzsKKworCS8qIEVBUiBkb2VzIG5vdCBoYXZlIGNvbXBhbmRlciAqLworCWlmICghaW50ZXJwX24pCisJCXJldHVybiAwOworCisJY29tcCA9IGludGVycF9uIC0gMTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgY29tcGFuZGVyICVkLCBlbmFibGVkICVkXG4iLAorCQlfX2Z1bmNfXywgZXZlbnQsIGNvbXAgKyAxLCB0YXZpbC0+Y29tcF9lbmFibGVkW2NvbXBdKTsKKworCWlmICghdGF2aWwtPmNvbXBfZW5hYmxlZFtjb21wXSkKKwkJcmV0dXJuIDA7CisKKwljb21wX2N0bDBfcmVnID0gV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwwICsgKGNvbXAgKiA4KTsKKwlyeF9wYXRoX2NmZzBfcmVnID0gV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArIChjb21wICogMjApOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKKwkJLyogRW5hYmxlIENvbXBhbmRlciBDbG9jayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAxLCAweDAxKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2NmZzBfcmVnLCAweDAyLCAweDAyKTsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmcwX3JlZywgMHgwMiwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDQsIDB4MDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDEsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDA0LCAweDAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfaWRsZV9kZXRlY3RfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICBpbnQgaW50ZXJwLCBpbnQgZXZlbnQpCit7CisJaW50IHJlZyA9IDAsIG1hc2ssIHZhbDsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmICghdGF2aWwtPmlkbGVfZGV0X2NmZy5ocGhfaWRsZV9kZXRlY3RfZW4pCisJCXJldHVybjsKKworCWlmIChpbnRlcnAgPT0gSU5URVJQX0hQSEwpIHsKKwkJcmVnID0gV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfUEFUSF9DVEw7CisJCW1hc2sgPSAweDAxOworCQl2YWwgPSAweDAxOworCX0KKwlpZiAoaW50ZXJwID09IElOVEVSUF9IUEhSKSB7CisJCXJlZyA9IFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX1BBVEhfQ1RMOworCQltYXNrID0gMHgwMjsKKwkJdmFsID0gMHgwMjsKKwl9CisKKwlpZiAocmVnICYmIFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgbWFzaywgdmFsKTsKKworCWlmIChyZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBtYXNrLCAweDAwKTsKKwkJdGF2aWwtPmlkbGVfZGV0X2NmZy5ocGhfaWRsZV90aHIgPSAwOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkczLCAweDApOworCX0KK30KKworLyoqCisgKiB0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2NsayAtIEVuYWJsZSBtYWluIHBhdGggSW50ZXJwb2xhdG9yCisgKiBjbG9jay4KKyAqCisgKiBAY29kZWM6ICAgIENvZGVjIGluc3RhbmNlCisgKiBAZXZlbnQ6ICAgIEluZGljYXRlcyBzcGVha2VyIHBhdGggZ2FpbiBvZmZzZXQgdmFsdWUKKyAqIEBpbnRwX2lkeDogSW50ZXJwb2xhdG9yIGluZGV4CisgKiBSZXR1cm5zIG51bWJlciBvZiBtYWluIGNsb2NrIHVzZXJzCisgKi8KK2ludCB0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBpbnQgZXZlbnQsIGludCBpbnRlcnBfaWR4KQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwl1MTYgbWFpbl9yZWc7CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGF2aWwgID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJbWFpbl9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DVEwgKyAoaW50ZXJwX2lkeCAqIDIwKTsKKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCWlmICh0YXZpbC0+bWFpbl9jbGtfdXNlcnNbaW50ZXJwX2lkeF0gPT0gMCkgeworCQkJLyogTWFpbiBwYXRoIFBHQSBtdXRlIGVuYWJsZSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4MTAsIDB4MTApOworCQkJLyogQ2xrIGVuYWJsZSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4MjAsIDB4MjApOworCQkJdGF2aWxfY29kZWNfaWRsZV9kZXRlY3RfY29udHJvbChjb2RlYywgaW50ZXJwX2lkeCwKKwkJCQkJCQlldmVudCk7CisJCQl0YXZpbF9jb2RlY19oZDJfY29udHJvbCh0YXZpbCwgaW50ZXJwX2lkeCwgZXZlbnQpOworCQkJdGF2aWxfY29kZWNfaHBoZGVsYXlfbHV0YnlwYXNzKGNvZGVjLCBpbnRlcnBfaWR4LAorCQkJCQkJICAgICAgIGV2ZW50KTsKKwkJCXRhdmlsX2NvbmZpZ19jb21wYW5kZXIoY29kZWMsIGludGVycF9pZHgsIGV2ZW50KTsKKwkJfQorCQl0YXZpbC0+bWFpbl9jbGtfdXNlcnNbaW50ZXJwX2lkeF0rKzsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKKwkJdGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdLS07CisJCWlmICh0YXZpbC0+bWFpbl9jbGtfdXNlcnNbaW50ZXJwX2lkeF0gPD0gMCkgeworCQkJdGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdID0gMDsKKwkJCXRhdmlsX2NvbmZpZ19jb21wYW5kZXIoY29kZWMsIGludGVycF9pZHgsIGV2ZW50KTsKKwkJCXRhdmlsX2NvZGVjX2hwaGRlbGF5X2x1dGJ5cGFzcyhjb2RlYywgaW50ZXJwX2lkeCwKKwkJCQkJCSAgICAgICBldmVudCk7CisJCQl0YXZpbF9jb2RlY19oZDJfY29udHJvbCh0YXZpbCwgaW50ZXJwX2lkeCwgZXZlbnQpOworCQkJdGF2aWxfY29kZWNfaWRsZV9kZXRlY3RfY29udHJvbChjb2RlYywgaW50ZXJwX2lkeCwKKwkJCQkJCQlldmVudCk7CisJCQkvKiBDbGsgRGlzYWJsZSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4MjAsIDB4MDApOworCQkJLyogUmVzZXQgZW5hYmxlIGFuZCBkaXNhYmxlICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYWluX3JlZywgMHg0MCwgMHg0MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYWluX3JlZywgMHg0MCwgMHgwMCk7CisJCQkvKiBSZXNldCByYXRlIHRvIDQ4SyovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYWluX3JlZywgMHgwRiwgMHgwNCk7CisJCX0KKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyBldmVudCAlZCBtYWluX2Nsa191c2VycyAlZFxuIiwKKwkJX19mdW5jX18sICBldmVudCwgdGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdKTsKKworCXJldHVybiB0YXZpbC0+bWFpbl9jbGtfdXNlcnNbaW50ZXJwX2lkeF07Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKTsKKworc3RhdGljIGludCB0YXZpbF9jb2RlY19zZXRfaWRsZV9kZXRlY3RfdGhyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgaW50IGludGVycCwgaW50IHBhdGhfdHlwZSkKK3sKKwlpbnQgcG9ydF9pZFs0XSA9IHsgMCwgMCwgMCwgMCB9OworCWludCAqcG9ydF9wdHIsIG51bV9wb3J0czsKKwlpbnQgYml0X3dpZHRoID0gMCwgaTsKKwlpbnQgbXV4X3JlZywgbXV4X3JlZ192YWw7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGRhaV9pZCwgaWRsZV90aHI7CisKKwlpZiAoKGludGVycCAhPSBJTlRFUlBfSFBITCkgJiYgKGludGVycCAhPSBJTlRFUlBfSFBIUikpCisJCXJldHVybiAwOworCisJaWYgKCF0YXZpbC0+aWRsZV9kZXRfY2ZnLmhwaF9pZGxlX2RldGVjdF9lbikKKwkJcmV0dXJuIDA7CisKKwlwb3J0X3B0ciA9ICZwb3J0X2lkWzBdOworCW51bV9wb3J0cyA9IDA7CisKKwkvKgorCSAqIFJlYWQgaW50ZXJwb2xhdG9yIE1VWCBpbnB1dCByZWdpc3RlcnMgYW5kIGZpbmQKKwkgKiB3aGljaCBzbGltYnVzIHBvcnQgaXMgY29ubmVjdGVkIGFuZCBzdG9yZSB0aGUgcG9ydAorCSAqIG51bWJlcnMgaW4gcG9ydF9pZCBhcnJheS4KKwkgKi8KKwlpZiAocGF0aF90eXBlID09IElOVEVSUF9NSVhfUEFUSCkgeworCQltdXhfcmVnID0gV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEgKworCQkJICAyICogKGludGVycCAtIDEpOworCQltdXhfcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgbXV4X3JlZykgJiAweDBmOworCisJCWlmICgobXV4X3JlZ192YWwgPj0gSU5Ubl8yX0lOUF9TRUxfUlgwKSAmJgorCQkgICAobXV4X3JlZ192YWwgPCBJTlRuXzJfSU5QX1NFTF9QUk9YSU1JVFkpKSB7CisJCQkqcG9ydF9wdHIrKyA9IG11eF9yZWdfdmFsICsKKwkJCQkgICAgICBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSIC0gMTsKKwkJCW51bV9wb3J0cysrOworCQl9CisJfQorCisJaWYgKHBhdGhfdHlwZSA9PSBJTlRFUlBfTUFJTl9QQVRIKSB7CisJCW11eF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCArCisJCQkgIDIgKiAoaW50ZXJwIC0gMSk7CisJCW11eF9yZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBtdXhfcmVnKSAmIDB4MGY7CisJCWkgPSBXQ0Q5MzRYX0lOVEVSUF9NVVhfTlVNX0lOUFVUUzsKKworCQl3aGlsZSAoaSkgeworCQkJaWYgKChtdXhfcmVnX3ZhbCA+PSBJTlRuXzFfSU5QX1NFTF9SWDApICYmCisJCQkgICAgKG11eF9yZWdfdmFsIDw9IElOVG5fMV9JTlBfU0VMX1JYNykpIHsKKwkJCQkqcG9ydF9wdHIrKyA9IG11eF9yZWdfdmFsICsKKwkJCQkJV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiAtCisJCQkJCUlOVG5fMV9JTlBfU0VMX1JYMDsKKwkJCQludW1fcG9ydHMrKzsKKwkJCX0KKwkJCW11eF9yZWdfdmFsID0gKHNuZF9zb2NfcmVhZChjb2RlYywgbXV4X3JlZykgJgorCQkJCQkJICAgIDB4ZjApID4+IDQ7CisJCQltdXhfcmVnICs9IDE7CisJCQlpLS07CisJCX0KKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbnVtX3BvcnRzOiAlZCwgcG9ydHNbJWQgJWQgJWQgJWRdXG4iLAorCQlfX2Z1bmNfXywgbnVtX3BvcnRzLCBwb3J0X2lkWzBdLCBwb3J0X2lkWzFdLAorCQlwb3J0X2lkWzJdLCBwb3J0X2lkWzNdKTsKKworCWkgPSAwOworCXdoaWxlIChudW1fcG9ydHMpIHsKKwkJZGFpX2lkID0gdGF2aWxfZmluZF9wbGF5YmFja19kYWlfaWRfZm9yX3BvcnQocG9ydF9pZFtpKytdLAorCQkJCQkJCSAgICAgdGF2aWwpOworCisJCWlmICgoZGFpX2lkID49IDApICYmIChkYWlfaWQgPCBOVU1fQ09ERUNfREFJUykpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkYWlfaWQ6ICVkIGJpdF93aWR0aDogJWRcbiIsCisJCQkJX19mdW5jX18sIGRhaV9pZCwKKwkJCQl0YXZpbC0+ZGFpW2RhaV9pZF0uYml0X3dpZHRoKTsKKworCQkJaWYgKHRhdmlsLT5kYWlbZGFpX2lkXS5iaXRfd2lkdGggPiBiaXRfd2lkdGgpCisJCQkJYml0X3dpZHRoID0gdGF2aWwtPmRhaVtkYWlfaWRdLmJpdF93aWR0aDsKKwkJfQorCisJCW51bV9wb3J0cy0tOworCX0KKworCXN3aXRjaCAoYml0X3dpZHRoKSB7CisJY2FzZSAxNjoKKwkJaWRsZV90aHIgPSAweGZmOyAvKiBGMTYgKi8KKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQlpZGxlX3RociA9IDB4MDM7IC8qIEYyMiAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZGxlX3RociA9IDB4MDA7CisJCWJyZWFrOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAobmV3KSBpZGxlX3RocjogJWQsIChjdXIpIGlkbGVfdGhyOiAlZFxuIiwKKwkJX19mdW5jX18sIGlkbGVfdGhyLCB0YXZpbC0+aWRsZV9kZXRfY2ZnLmhwaF9pZGxlX3Rocik7CisKKwlpZiAoKHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyID09IDApIHx8CisJICAgIChpZGxlX3RociA8IHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyKSkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkczLCBpZGxlX3Rocik7CisJCXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyID0gaWRsZV90aHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgZ2Fpbl9yZWcsIG1peF9yZWc7CisJaW50IG9mZnNldF92YWwgPSAwOworCWludCB2YWwgPSAwOworCisJaWYgKHctPnNoaWZ0ID49IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlMgfHwKKwkgICAgdy0+c2hpZnQgPT0gSU5URVJQX0xPM19OQSB8fCB3LT5zaGlmdCA9PSBJTlRFUlBfTE80X05BKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEludGVycG9sYXRvciB2YWx1ZSAlZCBmb3IgbmFtZSAlc1xuIiwKKwkJCV9fZnVuY19fLCB3LT5zaGlmdCwgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlnYWluX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCArCisJCQkJCSh3LT5zaGlmdCAqIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKKwltaXhfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCArCisJCQkJCSh3LT5zaGlmdCAqIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKKworCWlmICh3LT5zaGlmdCA9PSBJTlRFUlBfU1BLUjEgfHwgIHctPnNoaWZ0ID09IElOVEVSUF9TUEtSMikKKwkJX190YXZpbF9jb2RlY19lbmFibGVfc3dyKHcsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl0YXZpbF9jb2RlY19zZXRfaWRsZV9kZXRlY3RfdGhyKGNvZGVjLCB3LT5zaGlmdCwKKwkJCQkJCUlOVEVSUF9NSVhfUEFUSCk7CisJCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOworCQkvKiBDbGsgZW5hYmxlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1peF9yZWcsIDB4MjAsIDB4MjApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKCh0YXZpbC0+c3dyLnNwa3JfZ2Fpbl9vZmZzZXQgPT0KKwkJICAgICBXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCisJCSAgICAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKKwkJICAgICB0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKKwkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX01JWF9DVEwgfHwKKwkJICAgICBnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX01JWF9DVEwpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJb2Zmc2V0X3ZhbCA9IC0yOworCQl9CisJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZ2Fpbl9yZWcpOworCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKKwkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7CisJCXRhdmlsX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogQ2xrIERpc2FibGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWl4X3JlZywgMHgyMCwgMHgwMCk7CisJCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOworCQkvKiBSZXNldCBlbmFibGUgYW5kIGRpc2FibGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWl4X3JlZywgMHg0MCwgMHg0MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1peF9yZWcsIDB4NDAsIDB4MDApOworCisJCWlmICgodGF2aWwtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID09CisJCSAgICAgV0NEOTM0WF9SWF9HQUlOX09GRlNFVF9NMVA1X0RCKSAmJgorCQkgICAgKHRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddIHx8CisJCSAgICAgdGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfOF0pICYmCisJCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCW9mZnNldF92YWwgPSAyOworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBnYWluX3JlZyk7CisJCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOworCQl9CisJCXRhdmlsX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOworCQlicmVhazsKKwl9OworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGV2ZW50ICVkIG5hbWUgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0YXZpbF9nZXRfZHNkX2NvbmZpZyAtIEdldCBwb2ludGVyIHRvIGRzZCBjb25maWcgc3RydWN0dXJlCisgKgorICogQGNvZGVjOiBwb2ludGVyIHRvIHNuZF9zb2NfY29kZWMgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIHRhdmlsX2RzZF9jb25maWcgc3RydWN0dXJlCisgKi8KK3N0cnVjdCB0YXZpbF9kc2RfY29uZmlnICp0YXZpbF9nZXRfZHNkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCisJaWYgKCFjb2RlYykKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKCF0YXZpbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdGF2aWwtPmRzZF9jb25maWc7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX2dldF9kc2RfY29uZmlnKTsKKworc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgZ2Fpbl9yZWc7CisJdTE2IHJlZzsKKwlpbnQgdmFsOworCWludCBvZmZzZXRfdmFsID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOworCisJaWYgKHctPnNoaWZ0ID49IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlMgfHwKKwkgICAgdy0+c2hpZnQgPT0gSU5URVJQX0xPM19OQSB8fCB3LT5zaGlmdCA9PSBJTlRFUlBfTE80X05BKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEludGVycG9sYXRvciB2YWx1ZSAlZCBmb3IgbmFtZSAlc1xuIiwKKwkJCV9fZnVuY19fLCB3LT5zaGlmdCwgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZWcgPSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DVEwgKyAody0+c2hpZnQgKgorCQkJCQkgICAgIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKKwlnYWluX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfQ1RMICsgKHctPnNoaWZ0ICoKKwkJCQkJCSBXQ0Q5MzRYX1JYX1BBVEhfQ1RMX09GRlNFVCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJdGF2aWxfY29kZWNfc2V0X2lkbGVfZGV0ZWN0X3Rocihjb2RlYywgdy0+c2hpZnQsCisJCQkJCQlJTlRFUlBfTUFJTl9QQVRIKTsKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LCB3LT5zaGlmdCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKiBhcHBseSBnYWluIGFmdGVyIGludCBjbGsgaXMgZW5hYmxlZCAqLworCQlpZiAoKHRhdmlsLT5zd3Iuc3Brcl9nYWluX29mZnNldCA9PQorCQkJCQlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCisJCSAgICAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKKwkJICAgICB0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKKwkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCB8fAorCQkgICAgIGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAxKTsKKwkJCW9mZnNldF92YWwgPSAtMjsKKwkJfQorCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKKwkJdmFsICs9IG9mZnNldF92YWw7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOworCQl0YXZpbF9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOworCisJCWlmICgodGF2aWwtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID09CisJCQkJCVdDRDkzNFhfUlhfR0FJTl9PRkZTRVRfTTFQNV9EQikgJiYKKwkJICAgICh0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSB8fAorCQkgICAgIHRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzhdKSAmJgorCQkgICAgKGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8CisJCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9DVEwpKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMxLAorCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKKwkJCQkJICAgIDB4MDEsIDB4MDApOworCQkJb2Zmc2V0X3ZhbCA9IDI7CisJCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKKwkJCXZhbCArPSBvZmZzZXRfdmFsOworCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7CisJCX0KKwkJdGF2aWxfY29kZWNfY29uZmlnX2Vhcl9zcGtyX2dhaW4oY29kZWMsIGV2ZW50LCBnYWluX3JlZyk7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19zZXRfaWlyX2dhaW4oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmIChzdHJuc3RyKHctPm5hbWUsICJJSVIwIiwgc2l6ZW9mKCJJSVIwIikpKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMKSk7CisJCX0gZWxzZSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMKSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLAorCQkJc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMKSk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIGludCBhZGNfbXV4X24pCit7CisJdTE2IG1hc2ssIHNoaWZ0LCBhZGNfbXV4X2luX3JlZzsKKwl1MTYgYW1pY19tdXhfc2VsX3JlZzsKKwlib29sIGlzX2FtaWM7CisKKwlpZiAoYWRjX211eF9uIDwgMCB8fCBhZGNfbXV4X24gPiBXQ0Q5MzRYX01BWF9WQUxJRF9BRENfTVVYIHx8CisJICAgIGFkY19tdXhfbiA9PSBXQ0Q5MzRYX0lOVkFMSURfQURDX01VWCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRjX211eF9uIDwgMykgeworCQlhZGNfbXV4X2luX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSArCisJCQkJIGFkY19tdXhfbjsKKwkJbWFzayA9IDB4MDM7CisJCXNoaWZ0ID0gMDsKKwkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCArCisJCQkJICAgMiAqIGFkY19tdXhfbjsKKwl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDQpIHsKKwkJYWRjX211eF9pbl9yZWcgPSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzE7CisJCW1hc2sgPSAweDAzOworCQlzaGlmdCA9IDA7CisJCWFtaWNfbXV4X3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgKworCQkJCSAgIDIgKiBhZGNfbXV4X247CisJfSBlbHNlIGlmIChhZGNfbXV4X24gPCA3KSB7CisJCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxICsKKwkJCQkgKGFkY19tdXhfbiAtIDQpOworCQltYXNrID0gMHgwQzsKKwkJc2hpZnQgPSAyOworCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKKwkJCQkgICBhZGNfbXV4X24gLSA0OworCX0gZWxzZSBpZiAoYWRjX211eF9uIDwgOCkgeworCQlhZGNfbXV4X2luX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMTsKKwkJbWFzayA9IDB4MEM7CisJCXNoaWZ0ID0gMjsKKwkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCArCisJCQkJICAgYWRjX211eF9uIC0gNDsKKwl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDEyKSB7CisJCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxICsKKwkJCQkgKChhZGNfbXV4X24gPT0gOCkgPyAoYWRjX211eF9uIC0gOCkgOgorCQkJCSAgKGFkY19tdXhfbiAtIDkpKTsKKwkJbWFzayA9IDB4MzA7CisJCXNoaWZ0ID0gNDsKKwkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCArCisJCQkJICAgYWRjX211eF9uIC0gNDsKKwl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDEzKSB7CisJCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcxOworCQltYXNrID0gMHgzMDsKKwkJc2hpZnQgPSA0OworCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKKwkJCQkgICBhZGNfbXV4X24gLSA0OworCX0gZWxzZSB7CisJCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxOworCQltYXNrID0gMHhDMDsKKwkJc2hpZnQgPSA2OworCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKKwkJCQkgICBhZGNfbXV4X24gLSA0OworCX0KKworCWlzX2FtaWMgPSAoKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfaW5fcmVnKSAmIG1hc2spID4+IHNoaWZ0KQorCQkgICAgPT0gMSk7CisJaWYgKCFpc19hbWljKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzbmRfc29jX3JlYWQoY29kZWMsIGFtaWNfbXV4X3NlbF9yZWcpICYgMHgwNzsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfc2V0X3R4X2hvbGQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICB1MTYgYW1pY19yZWcsIGJvb2wgc2V0KQoreworCXU4IG1hc2sgPSAweDIwOworCXU4IHZhbDsKKworCWlmIChhbWljX3JlZyA9PSBXQ0Q5MzRYX0FOQV9BTUlDMSB8fAorCSAgICBhbWljX3JlZyA9PSBXQ0Q5MzRYX0FOQV9BTUlDMykKKwkJbWFzayA9IDB4NDA7CisKKwl2YWwgPSBzZXQgPyBtYXNrIDogMHgwMDsKKworCXN3aXRjaCAoYW1pY19yZWcpIHsKKwljYXNlIFdDRDkzNFhfQU5BX0FNSUMxOgorCWNhc2UgV0NEOTM0WF9BTkFfQU1JQzI6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0FNSUMyLCBtYXNrLCB2YWwpOworCQlicmVhazsKKwljYXNlIFdDRDkzNFhfQU5BX0FNSUMzOgorCWNhc2UgV0NEOTM0WF9BTkFfQU1JQzQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0FNSUM0LCBtYXNrLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBhbWljOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBhbWljX3JlZyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY190eF9hZGNfY2ZnKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlpbnQgYWRjX211eF9uID0gdy0+c2hpZnQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCWludCBhbWljX247CisJdTE2IGFtaWNfcmVnOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50OiAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJYW1pY19uID0gdGF2aWxfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBhZGNfbXV4X24pOworCQlpZiAoYW1pY19uKSB7CisJCQlhbWljX3JlZyA9IFdDRDkzNFhfQU5BX0FNSUMxICsgYW1pY19uIC0gMTsKKwkJCXRhdmlsX2NvZGVjX3NldF90eF9ob2xkKGNvZGVjLCBhbWljX3JlZywgZmFsc2UpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2IHRhdmlsX2NvZGVjX2dldF9hbWljX3B3bHZsX3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBhbWljKQoreworCXUxNiBwd3JfbGV2ZWxfcmVnID0gMDsKKworCXN3aXRjaCAoYW1pYykgeworCWNhc2UgMToKKwljYXNlIDI6CisJCXB3cl9sZXZlbF9yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJY2FzZSA0OgorCQlwd3JfbGV2ZWxfcmVnID0gV0NEOTM0WF9BTkFfQU1JQzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIGFtaWM6ICVkXG4iLAorCQkJX19mdW5jX18sIGFtaWMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcHdyX2xldmVsX3JlZzsKK30KKworI2RlZmluZSAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLIDB4NjAKKyNkZWZpbmUgIENGX01JTl8zREJfNEhaICAgICAweDAKKyNkZWZpbmUgIENGX01JTl8zREJfNzVIWiAgICAweDEKKyNkZWZpbmUgIENGX01JTl8zREJfMTUwSFogICAweDIKKworc3RhdGljIHZvaWQgdGF2aWxfdHhfaHBmX2Nvcm5lcl9mcmVxX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpocGZfZGVsYXllZF93b3JrOworCXN0cnVjdCBocGZfd29yayAqaHBmX3dvcms7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1MTYgZGVjX2NmZ19yZWcsIGFtaWNfcmVnLCBnb19iaXRfcmVnOworCXU4IGhwZl9jdXRfb2ZmX2ZyZXE7CisJaW50IGFtaWNfbjsKKworCWhwZl9kZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJaHBmX3dvcmsgPSBjb250YWluZXJfb2YoaHBmX2RlbGF5ZWRfd29yaywgc3RydWN0IGhwZl93b3JrLCBkd29yayk7CisJdGF2aWwgPSBocGZfd29yay0+dGF2aWw7CisJY29kZWMgPSB0YXZpbC0+Y29kZWM7CisJaHBmX2N1dF9vZmZfZnJlcSA9IGhwZl93b3JrLT5ocGZfY3V0X29mZl9mcmVxOworCisJZGVjX2NmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwICsgMTYgKiBocGZfd29yay0+ZGVjaW1hdG9yOworCWdvX2JpdF9yZWcgPSBkZWNfY2ZnX3JlZyArIDc7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGVjaW1hdG9yICV1IGhwZl9jdXRfb2ZfZnJlcSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaHBmX3dvcmstPmRlY2ltYXRvciwgaHBmX2N1dF9vZmZfZnJlcSk7CisKKwlhbWljX24gPSB0YXZpbF9jb2RlY19maW5kX2FtaWNfaW5wdXQoY29kZWMsIGhwZl93b3JrLT5kZWNpbWF0b3IpOworCWlmIChhbWljX24pIHsKKwkJYW1pY19yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMSArIGFtaWNfbiAtIDE7CisJCXRhdmlsX2NvZGVjX3NldF90eF9ob2xkKGNvZGVjLCBhbWljX3JlZywgZmFsc2UpOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLLAorCQkJICAgIGhwZl9jdXRfb2ZmX2ZyZXEgPDwgNSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZ29fYml0X3JlZywgMHgwMiwgMHgwMik7CisJLyogTWluaW11bSAxIGNsayBjeWNsZSBkZWxheSBpcyByZXF1aXJlZCBhcyBwZXIgSFcgc3BlYyAqLworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDEwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBnb19iaXRfcmVnLCAweDAyLCAweDAwKTsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfdHhfbXV0ZV91cGRhdGVfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0eF9tdXRlX3dvcmsgKnR4X211dGVfZHdvcms7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdTE2IHR4X3ZvbF9jdGxfcmVnLCBocGZfZ2F0ZV9yZWc7CisKKwlkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJdHhfbXV0ZV9kd29yayA9IGNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCB0eF9tdXRlX3dvcmssIGR3b3JrKTsKKwl0YXZpbCA9IHR4X211dGVfZHdvcmstPnRhdmlsOworCWNvZGVjID0gdGF2aWwtPmNvZGVjOworCisJdHhfdm9sX2N0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwgKworCQkJIDE2ICogdHhfbXV0ZV9kd29yay0+ZGVjaW1hdG9yOworCWhwZl9nYXRlX3JlZyA9IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzIgKworCQkgICAgICAgMTYgKiB0eF9tdXRlX2R3b3JrLT5kZWNpbWF0b3I7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfdm9sX2N0bF9yZWcsIDB4MTAsIDB4MDApOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXUxNiBzaWRldG9uZV9yZWc7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlZCAlZFxuIiwgX19mdW5jX18sIGV2ZW50LCB3LT5zaGlmdCk7CisJc2lkZXRvbmVfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMSArIDB4MTQqKHctPnNoaWZ0KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNyBNSVgyIElOUCIpKQorCQkJX190YXZpbF9jb2RlY19lbmFibGVfc3dyKHcsIGV2ZW50KTsKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LCB3LT5zaGlmdCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHNpZGV0b25lX3JlZywgMHgxMCwgMHgxMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzaWRldG9uZV9yZWcsIDB4MTAsIDB4MDApOworCQl0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2Nsayhjb2RlYywgZXZlbnQsIHctPnNoaWZ0KTsKKwkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDcgTUlYMiBJTlAiKSkKKwkJCV9fdGF2aWxfY29kZWNfZW5hYmxlX3N3cih3LCBldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBkZWNpbWF0b3I7CisJY2hhciAqZGVjX2FkY19tdXhfbmFtZSA9IE5VTEw7CisJY2hhciAqd2lkZ2V0X25hbWUgPSBOVUxMOworCWNoYXIgKnduYW1lOworCWludCByZXQgPSAwLCBhbWljX247CisJdTE2IHR4X3ZvbF9jdGxfcmVnLCBwd3JfbGV2ZWxfcmVnID0gMCwgZGVjX2NmZ19yZWcsIGhwZl9nYXRlX3JlZzsKKwl1MTYgdHhfZ2Fpbl9jdGxfcmVnOworCWNoYXIgKmRlYzsKKwl1OCBocGZfY3V0X29mZl9mcmVxOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwl3aWRnZXRfbmFtZSA9IGtzdHJuZHVwKHctPm5hbWUsIDE1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdpZGdldF9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXduYW1lID0gd2lkZ2V0X25hbWU7CisJZGVjX2FkY19tdXhfbmFtZSA9IHN0cnNlcCgmd2lkZ2V0X25hbWUsICIgIik7CisJaWYgKCFkZWNfYWRjX211eF9uYW1lKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGRlY2ltYXRvciA9ICVzXG4iLAorCQkJX19mdW5jX18sIHctPm5hbWUpOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWRlY19hZGNfbXV4X25hbWUgPSB3aWRnZXRfbmFtZTsKKworCWRlYyA9IHN0cnBicmsoZGVjX2FkY19tdXhfbmFtZSwgIjAxMjM0NTY3OCIpOworCWlmICghZGVjKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBkZWNpbWF0b3IgaW5kZXggbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0ga3N0cnRvdWludChkZWMsIDEwLCAmZGVjaW1hdG9yKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwKKwkJCV9fZnVuY19fLCB3bmFtZSk7CisJCXJldCA9ICAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcygpOiB3aWRnZXQgPSAlcyBkZWNpbWF0b3IgPSAldVxuIiwgX19mdW5jX18sCisJCQl3LT5uYW1lLCBkZWNpbWF0b3IpOworCisJdHhfdm9sX2N0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwgKyAxNiAqIGRlY2ltYXRvcjsKKwlocGZfZ2F0ZV9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyICsgMTYgKiBkZWNpbWF0b3I7CisJZGVjX2NmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwICsgMTYgKiBkZWNpbWF0b3I7CisJdHhfZ2Fpbl9jdGxfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwgKyAxNiAqIGRlY2ltYXRvcjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlhbWljX24gPSB0YXZpbF9jb2RlY19maW5kX2FtaWNfaW5wdXQoY29kZWMsIGRlY2ltYXRvcik7CisJCWlmIChhbWljX24pCisJCQlwd3JfbGV2ZWxfcmVnID0gdGF2aWxfY29kZWNfZ2V0X2FtaWNfcHdsdmxfcmVnKGNvZGVjLAorCQkJCQkJCQkgICAgICAgYW1pY19uKTsKKworCQlpZiAocHdyX2xldmVsX3JlZykgeworCQkJc3dpdGNoICgoc25kX3NvY19yZWFkKGNvZGVjLCBwd3JfbGV2ZWxfcmVnKSAmCisJCQkJCSAgICAgIFdDRDkzNFhfQU1JQ19QV1JfTFZMX01BU0spID4+CisJCQkJCSAgICAgIFdDRDkzNFhfQU1JQ19QV1JfTFZMX1NISUZUKSB7CisJCQljYXNlIFdDRDkzNFhfQU1JQ19QV1JfTEVWRUxfTFA6CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsCisJCQkJCQkgICAgV0NEOTM0WF9ERUNfUFdSX0xWTF9NQVNLLAorCQkJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfTFApOworCQkJCWJyZWFrOworCisJCQljYXNlIFdDRDkzNFhfQU1JQ19QV1JfTEVWRUxfSFA6CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsCisJCQkJCQkgICAgV0NEOTM0WF9ERUNfUFdSX0xWTF9NQVNLLAorCQkJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfSFApOworCQkJCWJyZWFrOworCQkJY2FzZSBXQ0Q5MzRYX0FNSUNfUFdSX0xFVkVMX0RFRkFVTFQ6CisJCQlkZWZhdWx0OgorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAorCQkJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfTUFTSywKKwkJCQkJCSAgICBXQ0Q5MzRYX0RFQ19QV1JfTFZMX0RGKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBFbmFibGUgVFggUEdBIE11dGUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfdm9sX2N0bF9yZWcsIDB4MTAsIDB4MTApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaHBmX2N1dF9vZmZfZnJlcSA9IChzbmRfc29jX3JlYWQoY29kZWMsIGRlY19jZmdfcmVnKSAmCisJCQkJICAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLKSA+PiA1OworCisJCXRhdmlsLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmhwZl9jdXRfb2ZmX2ZyZXEgPQorCQkJCQkJCWhwZl9jdXRfb2ZmX2ZyZXE7CisJCWlmIChocGZfY3V0X29mZl9mcmVxICE9IENGX01JTl8zREJfMTUwSFopIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAorCQkJCQkgICAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLLAorCQkJCQkgICAgQ0ZfTUlOXzNEQl8xNTBIWiA8PCA1KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwZl9nYXRlX3JlZywgMHgwMiwgMHgwMik7CisJCQkvKgorCQkJICogTWluaW11bSAxIGNsayBjeWNsZSBkZWxheSBpcyByZXF1aXJlZCBhcyBwZXIKKwkJCSAqIEhXIHNwZWMuCisJCQkgKi8KKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwZl9nYXRlX3JlZywgMHgwMiwgMHgwMCk7CisJCX0KKwkJLyogc2NoZWR1bGUgd29yayBxdWV1ZSB0byBSZW1vdmUgTXV0ZSAqLworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRhdmlsLT50eF9tdXRlX2R3b3JrW2RlY2ltYXRvcl0uZHdvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyh0eF91bm11dGVfZGVsYXkpKTsKKwkJaWYgKHRhdmlsLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmhwZl9jdXRfb2ZmX2ZyZXEgIT0KKwkJCQkJCQlDRl9NSU5fM0RCXzE1MEhaKQorCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKAorCQkJCQkmdGF2aWwtPnR4X2hwZl93b3JrW2RlY2ltYXRvcl0uZHdvcmssCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMzAwKSk7CisJCS8qIGFwcGx5IGdhaW4gYWZ0ZXIgZGVjaW1hdG9yIGlzIGVuYWJsZWQgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgdHhfZ2Fpbl9jdGxfcmVnLAorCQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCB0eF9nYWluX2N0bF9yZWcpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJaHBmX2N1dF9vZmZfZnJlcSA9CisJCQl0YXZpbC0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgxMCk7CisJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoCisJCSAgICAmdGF2aWwtPnR4X2hwZl93b3JrW2RlY2ltYXRvcl0uZHdvcmspKSB7CisJCQlpZiAoaHBmX2N1dF9vZmZfZnJlcSAhPSBDRl9NSU5fM0RCXzE1MEhaKSB7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsCisJCQkJCQkgICAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLLAorCQkJCQkJICAgIGhwZl9jdXRfb2ZmX2ZyZXEgPDwgNSk7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBmX2dhdGVfcmVnLAorCQkJCQkJICAgIDB4MDIsIDB4MDIpOworCQkJCS8qCisJCQkJICogTWluaW11bSAxIGNsayBjeWNsZSBkZWxheSBpcyByZXF1aXJlZCBhcyBwZXIKKwkJCQkgKiBIVyBzcGVjLgorCQkJCSAqLworCQkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDEwKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGZfZ2F0ZV9yZWcsCisJCQkJCQkgICAgMHgwMiwgMHgwMCk7CisJCQl9CisJCX0KKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAorCQkJCSZ0YXZpbC0+dHhfbXV0ZV9kd29ya1tkZWNpbWF0b3JdLmR3b3JrKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDEwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsCisJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfTUFTSywKKwkJCQkgICAgV0NEOTM0WF9ERUNfUFdSX0xWTF9ERik7CisJCWJyZWFrOworCX07CitvdXQ6CisJa2ZyZWUod25hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdGF2aWxfZ2V0X2RtaWNfc2FtcGxlX3JhdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBkbWljLAorCQkJCSAgICAgIHN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSkKK3sKKwl1OCB0eF9zdHJlYW1fZnM7CisJdTggYWRjX211eF9pbmRleCA9IDAsIGFkY19tdXhfc2VsID0gMDsKKwlib29sIGRlY19mb3VuZCA9IGZhbHNlOworCXUxNiBhZGNfbXV4X2N0bF9yZWcsIHR4X2ZzX3JlZzsKKwl1MzIgZG1pY19mczsKKworCXdoaWxlIChkZWNfZm91bmQgPT0gMCAmJiBhZGNfbXV4X2luZGV4IDwgV0NEOTM0WF9NQVhfVkFMSURfQURDX01VWCkgeworCQlpZiAoYWRjX211eF9pbmRleCA8IDQpIHsKKwkJCWFkY19tdXhfY3RsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCArCisJCQkJCQkoYWRjX211eF9pbmRleCAqIDIpOworCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPCBXQ0Q5MzRYX0lOVkFMSURfQURDX01VWCkgeworCQkJYWRjX211eF9jdGxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKKwkJCQkJCWFkY19tdXhfaW5kZXggLSA0OworCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPT0gV0NEOTM0WF9JTlZBTElEX0FEQ19NVVgpIHsKKwkJCSsrYWRjX211eF9pbmRleDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFkY19tdXhfc2VsID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfY3RsX3JlZykgJgorCQkJCQkweEY4KSA+PiAzKSAtIDE7CisKKwkJaWYgKGFkY19tdXhfc2VsID09IGRtaWMpIHsKKwkJCWRlY19mb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCSsrYWRjX211eF9pbmRleDsKKwl9CisKKwlpZiAoZGVjX2ZvdW5kICYmIGFkY19tdXhfaW5kZXggPD0gOCkgeworCQl0eF9mc19yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwgKyAoMTYgKiBhZGNfbXV4X2luZGV4KTsKKwkJdHhfc3RyZWFtX2ZzID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9mc19yZWcpICYgMHgwRjsKKwkJaWYgKHR4X3N0cmVhbV9mcyA8PSA0KSAgeworCQkJaWYgKHBkYXRhLT5kbWljX3NhbXBsZV9yYXRlIDw9CisJCQkJCVdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV8yUDRNSFopCisJCQkJZG1pY19mcyA9IHBkYXRhLT5kbWljX3NhbXBsZV9yYXRlOworCQkJZWxzZQorCQkJCWRtaWNfZnMgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfMlA0TUhaOworCQl9IGVsc2UKKwkJCWRtaWNfZnMgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNFA4TUhaOworCX0gZWxzZSB7CisJCWRtaWNfZnMgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKKwl9CisKKwlyZXR1cm4gZG1pY19mczsKK30KKworc3RhdGljIHU4IHRhdmlsX2dldF9kbWljX2Nsa192YWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSB1MzIgbWNsa19yYXRlLCB1MzIgZG1pY19jbGtfcmF0ZSkKK3sKKwl1MzIgZGl2X2ZhY3RvcjsKKwl1OCBkbWljX2N0bF92YWw7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogbWNsa19yYXRlID0gJWQsIGRtaWNfc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIG1jbGtfcmF0ZSwgZG1pY19jbGtfcmF0ZSk7CisKKwkvKiBEZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yICovCisJaWYgKG1jbGtfcmF0ZSA9PSBXQ0Q5MzRYX01DTEtfQ0xLXzlQNk1IWikKKwkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfMjsKKwllbHNlCisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzNFhfRE1JQ19DTEtfRElWXzM7CisKKwlpZiAoZG1pY19jbGtfcmF0ZSA9PSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogZG1pY19zYW1wbGVfcmF0ZSBjYW5ub3QgYmUgMFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWRpdl9mYWN0b3IgPSBtY2xrX3JhdGUgLyBkbWljX2Nsa19yYXRlOworCXN3aXRjaCAoZGl2X2ZhY3RvcikgeworCWNhc2UgMjoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8zOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRtaWNfY3RsX3ZhbCA9IFdDRDkzNFhfRE1JQ19DTEtfRElWXzQ7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfNjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl84OworCQlicmVhazsKKwljYXNlIDE2OgorCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGRpdl9mYWN0b3IgJXUsIGNsa19yYXRlKCV1KSwgZG1pY19yYXRlKCV1KVxuIiwKKwkJCV9fZnVuY19fLCBkaXZfZmFjdG9yLCBtY2xrX3JhdGUsIGRtaWNfY2xrX3JhdGUpOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIGRtaWNfY3RsX3ZhbDsKK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfYWRjKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQ6JWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJdGF2aWxfY29kZWNfc2V0X3R4X2hvbGQoY29kZWMsIHctPnJlZywgdHJ1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9kbWljKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwl1OCAgZG1pY19jbGtfZW4gPSAweDAxOworCXUxNiBkbWljX2Nsa19yZWc7CisJczMyICpkbWljX2Nsa19jbnQ7CisJdTggZG1pY19yYXRlX3ZhbCwgZG1pY19yYXRlX3NoaWZ0ID0gMTsKKwl1bnNpZ25lZCBpbnQgZG1pYzsKKwl1MzIgZG1pY19zYW1wbGVfcmF0ZTsKKwlpbnQgcmV0OworCWNoYXIgKnduYW1lOworCisJd25hbWUgPSBzdHJwYnJrKHctPm5hbWUsICIwMTIzNDUiKTsKKwlpZiAoIXduYW1lKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3aWRnZXQgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGtzdHJ0b3VpbnQod25hbWUsIDEwLCAmZG1pYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgRE1JQyBsaW5lIG9uIHRoZSBjb2RlY1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkbWljKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJZG1pY19jbGtfY250ID0gJih0YXZpbC0+ZG1pY18wXzFfY2xrX2NudCk7CisJCWRtaWNfY2xrX3JlZyA9IFdDRDkzNFhfQ1BFX1NTX0RNSUMwX0NUTDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJZG1pY19jbGtfY250ID0gJih0YXZpbC0+ZG1pY18yXzNfY2xrX2NudCk7CisJCWRtaWNfY2xrX3JlZyA9IFdDRDkzNFhfQ1BFX1NTX0RNSUMxX0NUTDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJZG1pY19jbGtfY250ID0gJih0YXZpbC0+ZG1pY180XzVfY2xrX2NudCk7CisJCWRtaWNfY2xrX3JlZyA9IFdDRDkzNFhfQ1BFX1NTX0RNSUMyX0NUTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgRE1JQyBTZWxlY3Rpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ICVkIERNSUMlZCBkbWljX2Nsa19jbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnQsICBkbWljLCAqZG1pY19jbGtfY250KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlkbWljX3NhbXBsZV9yYXRlID0gdGF2aWxfZ2V0X2RtaWNfc2FtcGxlX3JhdGUoY29kZWMsIGRtaWMsCisJCQkJCQkJICAgICAgcGRhdGEpOworCQlkbWljX3JhdGVfdmFsID0KKwkJCXRhdmlsX2dldF9kbWljX2Nsa192YWwoY29kZWMsCisJCQkJCSAgICAgICBwZGF0YS0+bWNsa19yYXRlLAorCQkJCQkgICAgICAgZG1pY19zYW1wbGVfcmF0ZSk7CisKKwkJKCpkbWljX2Nsa19jbnQpKys7CisJCWlmICgqZG1pY19jbGtfY250ID09IDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKKwkJCQkJICAgIDB4MDcgPDwgZG1pY19yYXRlX3NoaWZ0LAorCQkJCQkgICAgZG1pY19yYXRlX3ZhbCA8PCBkbWljX3JhdGVfc2hpZnQpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAorCQkJCQkgICAgZG1pY19jbGtfZW4sIGRtaWNfY2xrX2VuKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlkbWljX3JhdGVfdmFsID0KKwkJCXRhdmlsX2dldF9kbWljX2Nsa192YWwoY29kZWMsCisJCQkJCSAgICAgICBwZGF0YS0+bWNsa19yYXRlLAorCQkJCQkgICAgICAgcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlKTsKKwkJKCpkbWljX2Nsa19jbnQpLS07CisJCWlmICgqZG1pY19jbGtfY250ICA9PSAwKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJCSAgICBkbWljX2Nsa19lbiwgMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCisJCQkJCSAgICAweDA3IDw8IGRtaWNfcmF0ZV9zaGlmdCwKKwkJCQkJICAgIGRtaWNfcmF0ZV92YWwgPDwgZG1pY19yYXRlX3NoaWZ0KTsKKwkJfQorCQlicmVhazsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0YXZpbF9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2U6IGFkanVzdCBzcGVjaWZpYyBtaWNiaWFzIHZvbHRhZ2UKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgorICogQHJlcV92b2x0OiBtaWNiaWFzIHZvbHRhZ2UgdG8gYmUgc2V0CisgKiBAbWljYl9udW06IG1pY2JpYXMgdG8gYmUgc2V0LCBlLmcuIG1pY2JpYXMxIG9yIG1pY2JpYXMyCisgKgorICogcmV0dXJuIDAgaWYgYWRqdXN0bWVudCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB0YXZpbF9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGludCByZXFfdm9sdCwgaW50IG1pY2JfbnVtKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBjdXJfdm91dF9jdGwsIHJlcV92b3V0X2N0bDsKKwlpbnQgbWljYl9yZWcsIG1pY2JfdmFsLCBtaWNiX2VuOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtaWNiX251bSkgeworCWNhc2UgTUlDX0JJQVNfMToKKwkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCMTsKKwkJYnJlYWs7CisJY2FzZSBNSUNfQklBU18yOgorCQltaWNiX3JlZyA9IFdDRDkzNFhfQU5BX01JQ0IyOworCQlicmVhazsKKwljYXNlIE1JQ19CSUFTXzM6CisJCW1pY2JfcmVnID0gV0NEOTM0WF9BTkFfTUlDQjM7CisJCWJyZWFrOworCWNhc2UgTUlDX0JJQVNfNDoKKwkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJnRhdmlsLT5taWNiX2xvY2spOworCisJLyoKKwkgKiBJZiByZXF1ZXN0ZWQgbWljYmlhcyB2b2x0YWdlIGlzIHNhbWUgYXMgY3VycmVudCBtaWNiaWFzCisJICogdm9sdGFnZSwgdGhlbiBqdXN0IHJldHVybi4gT3RoZXJ3aXNlLCBhZGp1c3Qgdm9sdGFnZSBhcworCSAqIHBlciByZXF1ZXN0ZWQgdmFsdWUuIElmIG1pY2JpYXMgaXMgYWxyZWFkeSBlbmFibGVkLCB0aGVuCisJICogdG8gYXZvaWQgc2xvdyBtaWNiaWFzIHJhbXAtdXAgb3IgZG93biBlbmFibGUgcHVsbC11cAorCSAqIG1vbWVudGFyaWx5LCBjaGFuZ2UgdGhlIG1pY2JpYXMgdmFsdWUgYW5kIHRoZW4gcmUtZW5hYmxlCisJICogbWljYmlhcy4KKwkgKi8KKwltaWNiX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgbWljYl9yZWcpOworCW1pY2JfZW4gPSAobWljYl92YWwgJiAweEMwKSA+PiA2OworCWN1cl92b3V0X2N0bCA9IG1pY2JfdmFsICYgMHgzRjsKKworCXJlcV92b3V0X2N0bCA9IHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHJlcV92b2x0KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJlcV92b3V0X2N0bCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAoY3VyX3ZvdXRfY3RsID09IHJlcV92b3V0X2N0bCkgeworCQlyZXQgPSAwOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1pY2JfbnVtOiAlZCwgY3VyX212OiAlZCwgcmVxX212OiAlZCwgbWljYl9lbjogJWRcbiIsCisJCSBfX2Z1bmNfXywgbWljYl9udW0sIFdDRF9WT1VUX0NUTF9UT19NSUNCKGN1cl92b3V0X2N0bCksCisJCSByZXFfdm9sdCwgbWljYl9lbik7CisKKwlpZiAobWljYl9lbiA9PSAweDEpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweDNGLCByZXFfdm91dF9jdGwpOworCisJaWYgKG1pY2JfZW4gPT0gMHgxKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDQwKTsKKwkJLyoKKwkJICogQWRkIDJtcyBkZWxheSBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgYWZ0ZXIgZW5hYmxpbmcKKwkJICogbWljYmlhcworCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOworCX0KK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+bWljYl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2UpOworCisvKgorICogdGF2aWxfbWljYmlhc19jb250cm9sOiBlbmFibGUvZGlzYWJsZSBtaWNiaWFzCisgKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKKyAqIEBtaWNiX251bTogbWljYmlhcyB0byBiZSBlbmFibGVkL2Rpc2FibGVkLCBlLmcuIG1pY2JpYXMxIG9yIG1pY2JpYXMyCisgKiBAcmVxOiBjb250cm9sIHJlcXVlc3RlZCwgZW5hYmxlL2Rpc2FibGUgb3IgcHVsbHVwIGVuYWJsZS9kaXNhYmxlCisgKiBAaXNfZGFwbTogdHJpZ2dlcmVkIGJ5IGRhcG0gb3Igbm90CisgKgorICogcmV0dXJuIDAgaWYgY29udHJvbCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCB0YXZpbF9taWNiaWFzX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICBpbnQgbWljYl9udW0sIGludCByZXEsIGJvb2wgaXNfZGFwbSkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgbWljYl9pbmRleCA9IG1pY2JfbnVtIC0gMTsKKwl1MTYgbWljYl9yZWc7CisJaW50IHByZV9vZmZfZXZlbnQgPSAwLCBwb3N0X29mZl9ldmVudCA9IDA7CisJaW50IHBvc3Rfb25fZXZlbnQgPSAwLCBwb3N0X2RhcG1fb2ZmID0gMDsKKwlpbnQgcG9zdF9kYXBtX29uID0gMDsKKworCWlmICgobWljYl9pbmRleCA8IDApIHx8IChtaWNiX2luZGV4ID4gVEFWSUxfTUFYX01JQ0JJQVMgLSAxKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtaWNiaWFzIGluZGV4LCBtaWNiX2luZDolZFxuIiwKKwkJCV9fZnVuY19fLCBtaWNiX2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChtaWNiX251bSkgeworCWNhc2UgTUlDX0JJQVNfMToKKwkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCMTsKKwkJYnJlYWs7CisJY2FzZSBNSUNfQklBU18yOgorCQltaWNiX3JlZyA9IFdDRDkzNFhfQU5BX01JQ0IyOworCQlwcmVfb2ZmX2V2ZW50ID0gV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGOworCQlwb3N0X29mZl9ldmVudCA9IFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY7CisJCXBvc3Rfb25fZXZlbnQgPSBXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT047CisJCXBvc3RfZGFwbV9vbiA9IFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OOworCQlwb3N0X2RhcG1fb2ZmID0gV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGOworCQlicmVhazsKKwljYXNlIE1JQ19CSUFTXzM6CisJCW1pY2JfcmVnID0gV0NEOTM0WF9BTkFfTUlDQjM7CisJCWJyZWFrOworCWNhc2UgTUlDX0JJQVNfNDoKKwkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBudW1iZXI6ICVkXG4iLAorCQkJX19mdW5jX18sIG1pY2JfbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJnRhdmlsLT5taWNiX2xvY2spOworCisJc3dpdGNoIChyZXEpIHsKKwljYXNlIE1JQ0JfUFVMTFVQX0VOQUJMRToKKwkJdGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0rKzsKKwkJaWYgKCh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAxKSAmJgorCQkgICAgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBNSUNCX1BVTExVUF9ESVNBQkxFOgorCQlpZiAodGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0gPiAwKQorCQkJdGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0tLTsKKwkJaWYgKCh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAwKSAmJgorCQkgICAgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKKwkJYnJlYWs7CisJY2FzZSBNSUNCX0VOQUJMRToKKwkJdGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdKys7CisJCWlmICh0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4NDApOworCQkJaWYgKHBvc3Rfb25fZXZlbnQgJiYgdGF2aWwtPm1iaGMpCisJCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigKKwkJCQkJCSZ0YXZpbC0+bWJoYy0+bm90aWZpZXIsCisJCQkJCQlwb3N0X29uX2V2ZW50LAorCQkJCQkJJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7CisJCX0KKwkJaWYgKGlzX2RhcG0gJiYgcG9zdF9kYXBtX29uICYmIHRhdmlsLT5tYmhjKQorCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGF2aWwtPm1iaGMtPm5vdGlmaWVyLAorCQkJCQlwb3N0X2RhcG1fb24sICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOworCQlicmVhazsKKwljYXNlIE1JQ0JfRElTQUJMRToKKwkJaWYgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA+IDApCisJCQl0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0tLTsKKwkJaWYgKCh0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMCkgJiYKKwkJICAgICh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA+IDApKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4ODApOworCQllbHNlIGlmICgodGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApICYmCisJCQkgKHRhdmlsLT5wdWxsdXBfcmVmW21pY2JfaW5kZXhdID09IDApKSB7CisJCQlpZiAocHJlX29mZl9ldmVudCAmJiB0YXZpbC0+bWJoYykKKwkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAorCQkJCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCQkJCXByZV9vZmZfZXZlbnQsCisJCQkJCQkmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKKwkJCWlmIChwb3N0X29mZl9ldmVudCAmJiB0YXZpbC0+bWJoYykKKwkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAorCQkJCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCQkJCXBvc3Rfb2ZmX2V2ZW50LAorCQkJCQkJJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7CisJCX0KKwkJaWYgKGlzX2RhcG0gJiYgcG9zdF9kYXBtX29mZiAmJiB0YXZpbC0+bWJoYykKKwkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCQkJcG9zdF9kYXBtX29mZiwgJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7CisJCWJyZWFrOworCX07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWljYl9udW06JWQsIG1pY2JfcmVmOiAlZCwgcHVsbHVwX3JlZjogJWRcbiIsCisJCV9fZnVuY19fLCBtaWNiX251bSwgdGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdLAorCQl0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSk7CisKKwltdXRleF91bmxvY2soJnRhdmlsLT5taWNiX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX21pY2JpYXNfY29udHJvbCk7CisKK3N0YXRpYyBpbnQgX190YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkJaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlpbnQgbWljYl9udW07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWU6ICVzLCBldmVudDogJWRcbiIsCisJCV9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpCisJCW1pY2JfbnVtID0gTUlDX0JJQVNfMTsKKwllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzIiLCBzaXplb2YoIk1JQyBCSUFTMiIpKSkKKwkJbWljYl9udW0gPSBNSUNfQklBU18yOworCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTMyIsIHNpemVvZigiTUlDIEJJQVMzIikpKQorCQltaWNiX251bSA9IE1JQ19CSUFTXzM7CisJZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpCisJCW1pY2JfbnVtID0gTUlDX0JJQVNfNDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCS8qCisJCSAqIE1JQyBCSUFTIGNhbiBhbHNvIGJlIHJlcXVlc3RlZCBieSBNQkhDLAorCQkgKiBzbyB1c2UgcmVmIGNvdW50IHRvIGhhbmRsZSBtaWNiaWFzIHB1bGx1cAorCQkgKiBhbmQgZW5hYmxlIHJlcXVlc3RzCisJCSAqLworCQl0YXZpbF9taWNiaWFzX2NvbnRyb2woY29kZWMsIG1pY2JfbnVtLCBNSUNCX0VOQUJMRSwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQkvKiB3YWl0IGZvciBjbnAgdGltZSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl0YXZpbF9taWNiaWFzX2NvbnRyb2woY29kZWMsIG1pY2JfbnVtLCBNSUNCX0RJU0FCTEUsIHRydWUpOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0YXZpbF9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzIC0gZW5hYmxlIG1pY2JpYXMgc3RhbmRhbG9uZQorICogQGNvZGVjOiBwb2ludGVyIHRvIGNvZGVjIGluc3RhbmNlCisgKiBAbWljYl9udW06IG51bWJlciBvZiBtaWNiaWFzIHRvIGJlIGVuYWJsZWQKKyAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlIG1pY2JpYXMgb3IgZmFsc2UgdG8gZGlzYWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgbWljYmlhcyAoMSwgMiwgMyBvciA0KSBkdXJpbmcKKyAqIHN0YW5kYWxvbmUgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciBUWCB1c2UtY2FzZSBpcyBydW5uaW5nIG9yIG5vdAorICoKKyAqIFJldHVybjogZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgb3IgMCBmb3Igc3VjY2VzcworICovCitpbnQgdGF2aWxfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgaW50IG1pY2JfbnVtLAorCQkJCQkgIGJvb2wgZW5hYmxlKQoreworCWNvbnN0IGNoYXIgKiBjb25zdCBtaWNiX25hbWVzW10gPSB7CisJCURBUE1fTUlDQklBUzFfU1RBTkRBTE9ORSwgREFQTV9NSUNCSUFTMl9TVEFOREFMT05FLAorCQlEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUsIERBUE1fTUlDQklBUzRfU1RBTkRBTE9ORQorCX07CisJaW50IG1pY2JfaW5kZXggPSBtaWNiX251bSAtIDE7CisJaW50IHJjOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzOiBDb2RlYyBtZW1vcnkgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKG1pY2JfaW5kZXggPCAwKSB8fCAobWljYl9pbmRleCA+IFRBVklMX01BWF9NSUNCSUFTIC0gMSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBpbmRleCwgbWljYl9pbmQ6JWRcbiIsCisJCQlfX2Z1bmNfXywgbWljYl9pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlbmFibGUpCisJCXJjID0gc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oCisJCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKKwkJCQkJCW1pY2JfbmFtZXNbbWljYl9pbmRleF0pOworCWVsc2UKKwkJcmMgPSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyksCisJCQkJCSAgICAgIG1pY2JfbmFtZXNbbWljYl9pbmRleF0pOworCisJaWYgKCFyYykKKwkJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOworCWVsc2UKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1pY2JpYXMlZCBmb3JjZSAlcyBwaW4gZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIG1pY2JfbnVtLCAoZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyk7CisKK3N0YXRpYyBpbnQgdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgIGludCBldmVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGF2aWwtPnJlc21ncik7CisJCXRhdmlsX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSk7CisJCXJldCA9IF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOworCQkvKiBXYWl0IGZvciAxbXMgZm9yIGJldHRlciBjbnAgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQl0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJldCA9IF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKKwkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhdmlsLT5yZXNtZ3IpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJcmV0dXJuIF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgZXZlbnQpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHRhdmlsX2hwaF9yZXNldF90YmxbXSA9IHsKKwl7IFdDRDkzNFhfSFBIX0NOUF9FTiwgMHg4MCB9LAorCXsgV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCwgMHg5QSB9LAorCXsgV0NEOTM0WF9IUEhfQ05QX1dHX1RJTUUsIDB4MTQgfSwKKwl7IFdDRDkzNFhfSFBIX09DUF9DVEwsIDB4MjggfSwKKwl7IFdDRDkzNFhfSFBIX0FVVE9fQ0hPUCwgMHgxNiB9LAorCXsgV0NEOTM0WF9IUEhfQ0hPUF9DVEwsIDB4ODMgfSwKKwl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4NDYgfSwKKwl7IFdDRDkzNFhfSFBIX1BBX0NUTDIsIDB4NTAgfSwKKwl7IFdDRDkzNFhfSFBIX0xfRU4sIDB4ODAgfSwKKwl7IFdDRDkzNFhfSFBIX0xfVEVTVCwgMHhFMCB9LAorCXsgV0NEOTM0WF9IUEhfTF9BVEVTVCwgMHg1MCB9LAorCXsgV0NEOTM0WF9IUEhfUl9FTiwgMHg4MCB9LAorCXsgV0NEOTM0WF9IUEhfUl9URVNULCAweEUwIH0sCisJeyBXQ0Q5MzRYX0hQSF9SX0FURVNULCAweDU0IH0sCisJeyBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwxLCAweDk5IH0sCisJeyBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwyLCAweDlCIH0sCisJeyBXQ0Q5MzRYX0hQSF9SREFDX0xET19DVEwsIDB4MzMgfSwKKwl7IFdDRDkzNFhfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9SRUZCVUZGX1VIUUFfQ1RMLCAweEE4IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB0YXZpbF9ocGhfcmVzZXRfdGJsXzFfMFtdID0geworCXsgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwsIDB4MEEgfSwKKwl7IFdDRDkzNFhfSFBIX0xfREFDX0NUTCwgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfUl9EQUNfQ1RMLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDIsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMywgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTCwgMHhBMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX1ZSRUZfQ1RMLCAweDEwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfT1ZFUlJJREVfQ1RMLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfTUlTQzEsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzEsIDB4MjIgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzIsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEsIDB4RkUgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMiwgMHgyIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjMsIDB4NGV9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVI0LCAweDU0IH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDMywgMHgwMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2UgdGF2aWxfaHBoX3Jlc2V0X3RibF8xXzFbXSA9IHsKKwl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDBFIH0sCisJeyBXQ0Q5MzRYX0hQSF9MX0RBQ19DVEwsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX1JfREFDX0NUTCwgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDMsIDB4MDAgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwgMHg0MCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVEwsIDB4ODEgfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19WUkVGX0NUTCwgMHgxMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX09WRVJSSURFX0NUTCwgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX01JU0MxLCAweDgxIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MxLCAweDIyIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQywgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLCAweEZFIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIsIDB4MiB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzLCAweDRlfSwKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCwgMHg1NCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MyLCAweDAwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzMsIDB4MDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX3BhX2Rpc2FibGVbXSA9IHsKKwl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgMHgzMCwgMHgxMCB9LCAvKiBSWDEgbXV0ZSBlbmFibGUgKi8KKwl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCwgMHgzMCwgMHgxMCB9LCAvKiBSWDIgbXV0ZSBlbmFibGUgKi8KKwl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwgLyogR00zIGJvb3N0IGRpc2FibGUgKi8KKwl7IFdDRDkzNFhfQU5BX0hQSCwgMHg4MCwgMHgwMCB9LCAvKiBIUEhMIFBBIGRpc2FibGUgKi8KKwl7IFdDRDkzNFhfQU5BX0hQSCwgMHg0MCwgMHgwMCB9LCAvKiBIUEhSIFBBIGRpc2FibGUgKi8KKwl7IFdDRDkzNFhfQU5BX0hQSCwgMHgyMCwgMHgwMCB9LCAvKiBIUEhMIFJFRiBkc2FibGUgKi8KKwl7IFdDRDkzNFhfQU5BX0hQSCwgMHgxMCwgMHgwMCB9LCAvKiBIUEhSIFJFRiBkaXNhYmxlICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9vY3BfZW5fc2VxW10gPSB7CisJeyBXQ0Q5MzRYX1JYX09DUF9DVEwsIDB4MEYsIDB4MDIgfSwgLyogT0NQIG51bWJlciBvZiBhdHRlbXB0cyBpcyAyICovCisJeyBXQ0Q5MzRYX0hQSF9PQ1BfQ1RMLCAweEZBLCAweDNBIH0sIC8qIE9DUCBjdXJyZW50IGxpbWl0ICovCisJeyBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSEwgT0NQICovCisJeyBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSFIgT0NQICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9vY3BfZW5fc2VxXzFbXSA9IHsKKwl7IFdDRDkzNFhfUlhfT0NQX0NUTCwgMHgwRiwgMHgwMiB9LCAvKiBPQ1AgbnVtYmVyIG9mIGF0dGVtcHRzIGlzIDIgKi8KKwl7IFdDRDkzNFhfSFBIX09DUF9DVEwsIDB4RkEsIDB4M0EgfSwgLyogT0NQIGN1cnJlbnQgbGltaXQgKi8KK307CisKKy8qIExPLUhJRkkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbXSA9IHsKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgMHgwMiwgMHgwMCB9LAorCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF80LCAweGYwLCAweDgwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAweDIwLCAweDIwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsIDB4ZjAsIDB4NDAgfSwKKwl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsIDB4ZjAsIDB4YzAgfSwKKwl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4MGUsIDB4MDIgfSwKKwl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDA2IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9wcmVfcGFfZW5bXSA9IHsKKwl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgMHgwMiwgMHgwMCB9LAorCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9NSVNDMiwgMHgyMCwgMHgwIH0sCisJeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsIDB4ZjAsIDB4NDAgfSwKKwl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwKKwl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsIDB4ZjAsIDB4ODAgfSwKKwl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4MGUsIDB4MDYgfSwKKwl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDA2IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9wb3N0X3BhX2VuW10gPSB7CisJeyBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSEwgT0NQICovCisJeyBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSFIgT0NQICovCisJeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsIDB4MzAsIDB4MjAgfSwgLyogUlgxIG11dGUgZGlzYWJsZSAqLworCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMLCAweDMwLCAweDIwIH0sIC8qIFJYMiBtdXRlIGRpc2FibGUgKi8KKwl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4ODAgfSwgLyogR00zIGJvb3N0IGVuYWJsZSAqLworCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLCAweDAyLCAweDAyIH0sCit9OworCitzdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19ocGhfcmVnX3JhbmdlX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1OCAqYnVmKQoreworCXJlZ21hcF9idWxrX3JlYWQobWFwLCBXQ0Q5MzRYX0hQSF9DTlBfRU4sIGJ1ZiwgVEFWSUxfSFBIX1JFR19SQU5HRV8xKTsKKwlyZWdtYXBfYnVsa19yZWFkKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLAorCQkJIGJ1ZiArIFRBVklMX0hQSF9SRUdfUkFOR0VfMSwgVEFWSUxfSFBIX1JFR19SQU5HRV8yKTsKKwlyZWdtYXBfYnVsa19yZWFkKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMLAorCQkJIGJ1ZiArIFRBVklMX0hQSF9SRUdfUkFOR0VfMSArIFRBVklMX0hQSF9SRUdfUkFOR0VfMiwKKwkJCSBUQVZJTF9IUEhfUkVHX1JBTkdFXzMpOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19ocGhfcmVnX3JlY292ZXIoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAorCQkJCQlzdHJ1Y3QgcmVnbWFwICptYXAsIGludCBwYV9zdGF0dXMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCQkgICAgIFdDRF9FVkVOVF9PQ1BfT0ZGLAorCQkJCSAgICAgJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7CisKKwlpZiAocGFfc3RhdHVzICYgMHhDMCkKKwkJZ290byBwYV9lbl9yZXN0b3JlOworCisJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IEhQSCBQQSBpbiBkaXNhYmxlIHN0YXRlICgweCV4KVxuIiwKKwkJX19mdW5jX18sIHBhX3N0YXR1cyk7CisKKwlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgMHgxMCwgMHgxMCk7CisJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsIDB4MTAsIDB4MTApOworCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9BTkFfSFBILCAweEMwLCAweDAwKTsKKwlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQU5BX0hQSCwgMHgzMCwgMHgwMCk7CisJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsIDB4MTAsIDB4MDApOworCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMLCAweDEwLCAweDAwKTsKKworCS8qIFJlc3RvcmUgdG8gSFcgZGVmYXVsdHMgKi8KKwlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKG1hcCwgdGF2aWxfaHBoX3Jlc2V0X3RibCwKKwkJCSAgICAgICBBUlJBWV9TSVpFKHRhdmlsX2hwaF9yZXNldF90YmwpKTsKKwlpZiAoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkKKwkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8xLAorCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzEpKTsKKwlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8wLAorCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzApKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX29jcF9lbl9zZXEpOyBpKyspCisJCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgdGF2aWxfb2NwX2VuX3NlcVtpXS5yZWcsCisJCQkJICB0YXZpbF9vY3BfZW5fc2VxW2ldLm1hc2ssCisJCQkJICB0YXZpbF9vY3BfZW5fc2VxW2ldLnZhbCk7CisJZ290byBlbmQ7CisKKworcGFfZW5fcmVzdG9yZToKKwlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogSFBIIFBBIGluIGVuYWJsZSBzdGF0ZSAoMHgleClcbiIsCisJCV9fZnVuY19fLCBwYV9zdGF0dXMpOworCisJLyogRGlzYWJsZSBQQSBhbmQgb3RoZXIgcmVnaXN0ZXJzIGJlZm9yZSByZXN0b3JpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9wYV9kaXNhYmxlKTsgaSsrKSB7CisJCWlmIChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpICYmCisJCSAgICAodGF2aWxfcGFfZGlzYWJsZVtpXS5yZWcgPT0gV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCkpCisJCQljb250aW51ZTsKKwkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9wYV9kaXNhYmxlW2ldLnJlZywKKwkJCQkgIHRhdmlsX3BhX2Rpc2FibGVbaV0ubWFzaywKKwkJCQkgIHRhdmlsX3BhX2Rpc2FibGVbaV0udmFsKTsKKwl9CisKKwlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKG1hcCwgdGF2aWxfaHBoX3Jlc2V0X3RibCwKKwkJCSAgICAgICBBUlJBWV9TSVpFKHRhdmlsX2hwaF9yZXNldF90YmwpKTsKKwlpZiAoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkKKwkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8xLAorCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzEpKTsKKwlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKKwkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8wLAorCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzApKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX29jcF9lbl9zZXFfMSk7IGkrKykKKwkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9vY3BfZW5fc2VxXzFbaV0ucmVnLAorCQkJCSAgdGF2aWxfb2NwX2VuX3NlcV8xW2ldLm1hc2ssCisJCQkJICB0YXZpbF9vY3BfZW5fc2VxXzFbaV0udmFsKTsKKworCWlmICh0YXZpbC0+aHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3ByZV9wYV9lbl9sb2hpZmkpOyBpKyspIHsKKwkJCXJlZyA9IHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbaV0ucmVnOworCQkJaWYgKChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpKSAmJgorCQkJICAgICgocmVnID09IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCkgfHwKKwkJCSAgICAgKHJlZyA9PSBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMKSB8fAorCQkJICAgICAocmVnID09IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMKSkpCisJCQkJY29udGludWU7CisJCQlyZWdtYXBfd3JpdGVfYml0cyhtYXAsCisJCQkJCSAgdGF2aWxfcHJlX3BhX2VuX2xvaGlmaVtpXS5yZWcsCisJCQkJCSAgdGF2aWxfcHJlX3BhX2VuX2xvaGlmaVtpXS5tYXNrLAorCQkJCQkgIHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbaV0udmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3ByZV9wYV9lbik7IGkrKykgeworCQkJcmVnID0gdGF2aWxfcHJlX3BhX2VuW2ldLnJlZzsKKwkJCWlmICgoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkgJiYKKwkJCSAgICAoKHJlZyA9PSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwpIHx8CisJCQkgICAgIChyZWcgPT0gV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCkgfHwKKwkJCSAgICAgKHJlZyA9PSBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCkpKQorCQkJCWNvbnRpbnVlOworCQkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9wcmVfcGFfZW5baV0ucmVnLAorCQkJCQkgIHRhdmlsX3ByZV9wYV9lbltpXS5tYXNrLAorCQkJCQkgIHRhdmlsX3ByZV9wYV9lbltpXS52YWwpOworCQl9CisJfQorCisJaWYgKFRBVklMX0lTXzFfMSh0YXZpbC0+d2NkOXh4eCkpIHsKKwkJcmVnbWFwX3dyaXRlKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfTCwgMHg4NCk7CisJCXJlZ21hcF93cml0ZShtYXAsIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMX1IsIDB4ODQpOworCX0KKworCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9BTkFfSFBILCAweDBDLCBwYV9zdGF0dXMgJiAweDBDKTsKKwlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQU5BX0hQSCwgMHgzMCwgMHgzMCk7CisJLyogd2FpdCBmb3IgMTAwdXNlYyBhZnRlciBIUEggREFDIGlzIGVuYWJsZWQgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCXJlZ21hcF93cml0ZShtYXAsIFdDRDkzNFhfQU5BX0hQSCwgcGFfc3RhdHVzKTsKKwkvKiBTbGVlcCBmb3IgN21zZWMgYWZ0ZXIgUEEgaXMgZW5hYmxlZCAqLworCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3Bvc3RfcGFfZW4pOyBpKyspIHsKKwkJaWYgKChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpKSAmJgorCQkgICAgKHRhdmlsX3Bvc3RfcGFfZW5baV0ucmVnID09IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwpKQorCQkJY29udGludWU7CisJCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgdGF2aWxfcG9zdF9wYV9lbltpXS5yZWcsCisJCQkJICB0YXZpbF9wb3N0X3BhX2VuW2ldLm1hc2ssCisJCQkJICB0YXZpbF9wb3N0X3BhX2VuW2ldLnZhbCk7CisJfQorCitlbmQ6CisJdGF2aWwtPm1iaGMtPmlzX2hwaF9yZWNvdmVyID0gdHJ1ZTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAorCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKKwkJCVdDRF9FVkVOVF9PQ1BfT04sCisJCQkmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKK30KKworc3RhdGljIGludCB0YXZpbF9jb2RlY19yZXNldF9ocGhfcmVnaXN0ZXJzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXU4IGNhY2hlX3ZhbFtUQVZJTF9IUEhfVE9UQUxfUkVHXTsKKwl1OCBod192YWxbVEFWSUxfSFBIX1RPVEFMX1JFR107CisJaW50IHBhX3N0YXR1czsKKwlpbnQgcmV0OworCisJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogZXZlbnQ6ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCW1lbXNldChjYWNoZV92YWwsIDAsIFRBVklMX0hQSF9UT1RBTF9SRUcpOworCQltZW1zZXQoaHdfdmFsLCAwLCBUQVZJTF9IUEhfVE9UQUxfUkVHKTsKKworCQlyZWdtYXBfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQU5BX0hQSCwgJnBhX3N0YXR1cyk7CisKKwkJdGF2aWxfY29kZWNfaHBoX3JlZ19yYW5nZV9yZWFkKHdjZDl4eHgtPnJlZ21hcCwgY2FjaGVfdmFsKTsKKworCQkvKiBSZWFkIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIEhXIGRpcmVjdGx5ICovCisJCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyh3Y2Q5eHh4LT5yZWdtYXAsIHRydWUpOworCQl0YXZpbF9jb2RlY19ocGhfcmVnX3JhbmdlX3JlYWQod2NkOXh4eC0+cmVnbWFwLCBod192YWwpOworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3Mod2NkOXh4eC0+cmVnbWFwLCBmYWxzZSk7CisKKwkJLyogY29tcGFyZSBib3RoIHRoZSByZWdpc3RlcnMgdG8ga25vdyBpZiB0aGVyZSBpcyBjb3JydXB0aW9uICovCisJCXJldCA9IG1lbWNtcChjYWNoZV92YWwsIGh3X3ZhbCwgVEFWSUxfSFBIX1RPVEFMX1JFRyk7CisKKwkJLyogSWYgYm90aCB0aGUgdmFsdWVzIGFyZSBzYW1lLCBpdCBtZWFucyBubyBjb3JydXB0aW9uICovCisJCWlmIChyZXQpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjYWNoZSBhbmQgaHcgcmVnIGFyZSBub3Qgc2FtZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl0YXZpbF9jb2RlY19ocGhfcmVnX3JlY292ZXIodGF2aWwsIHdjZDl4eHgtPnJlZ21hcCwKKwkJCQkJCSAgICBwYV9zdGF0dXMpOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNhY2hlIGFuZCBodyByZWcgYXJlIHNhbWVcbiIsCisJCQkJX19mdW5jX18pOworCQkJdGF2aWwtPm1iaGMtPmlzX2hwaF9yZWNvdmVyID0gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisJLyogSUlSIGZpbHRlciBiYW5kIHJlZ2lzdGVycyBhcmUgYXQgaW50ZWdlciBtdWx0aXBsZXMgb2YgMTYgKi8KKwl1MTYgaWlyX3JlZyA9IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgaWlyX3JlZykgJgorCQkJCQkgICAgKDEgPDwgYmFuZF9pZHgpKSAhPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKwlib29sIGlpcl9iYW5kX2VuX3N0YXR1czsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1MTYgaWlyX3JlZyA9IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKKworCS8qIE1hc2sgZmlyc3QgNSBiaXRzLCA2LTggYXJlIHJlc2VydmVkICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaWlyX3JlZywgKDEgPDwgYmFuZF9pZHgpLAorCQkJICAgICh2YWx1ZSA8PCBiYW5kX2lkeCkpOworCisJaWlyX2JhbmRfZW5fc3RhdHVzID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGlpcl9yZWcpICYKKwkJCSAgICAgICgxIDw8IGJhbmRfaWR4KSkgIT0gMCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJaWlyX2lkeCwgYmFuZF9pZHgsIGlpcl9iYW5kX2VuX3N0YXR1cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCisJCQkJICAgaW50IGNvZWZmX2lkeCkKK3sKKwl1aW50MzJfdCB2YWx1ZSA9IDA7CisKKwkvKiBBZGRyZXNzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIGlmIHJlYWRpbmcgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKKworCXZhbHVlIHw9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDEpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJICAgICAgIChXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCisJCQkJMTYgKiBpaXJfaWR4KSkgPDwgOCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCisJCSogc2l6ZW9mKHVpbnQzMl90KSArIDIpICYgMHg3Rik7CisKKwl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJICAgICAgIChXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCisJCQkJMTYgKiBpaXJfaWR4KSkgPDwgMTYpOworCisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQorCQkqIHNpemVvZih1aW50MzJfdCkgKyAzKSAmIDB4N0YpOworCisJLyogTWFzayBiaXRzIHRvcCAyIGJpdHMgc2luY2UgdGhleSBhcmUgcmVzZXJ2ZWQgKi8KKwl2YWx1ZSB8PSAoKHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKworCQkJCSAxNiAqIGlpcl9pZHgpKSAmIDB4M0YpIDw8IDI0KTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAxKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9CisJCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDIpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0KKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0gPQorCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCA0KTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdLAorCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCisJCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSwKKwkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAorCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIGludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCisJCQkgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKHZhbHVlICYgMHhGRikpOworCisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKHZhbHVlID4+IDgpICYgMHhGRik7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgPj4gMTYpICYgMHhGRik7CisKKwkvKiBNYXNrIHRvcCAyIGJpdHMsIDctOCBhcmUgcmVzZXJ2ZWQgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAorCQkodmFsdWUgPj4gMjQpICYgMHgzRik7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwkvKgorCSAqIE1hc2sgdG9wIGJpdCBpdCBpcyByZXNlcnZlZAorCSAqIFVwZGF0ZXMgYWRkciBhdXRvbWF0aWNhbGx5IGZvciBlYWNoIEIyIHdyaXRlCisJICovCisJc25kX3NvY193cml0ZShjb2RlYywKKwkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKKwkJKGJhbmRfaWR4ICogQkFORF9NQVggKiBzaXplb2YodWludDMyX3QpKSAmIDB4N0YpOworCisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSk7CisJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7CisKKwlwcl9kZWJ1ZygiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjAgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBiMSA9IDB4JXhcbiIKKwkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIyID0gMHgleFxuIgorCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTEgPSAweCV4XG4iCisJCSIlczogSUlSICMlZCBiYW5kICMlZCBhMiA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMCksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMSksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMiksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMyksCisJCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKKwkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgNCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvbXBhbmRlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlpbnQgY29tcCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCSAgICBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+Y29tcF9lbmFibGVkW2NvbXBdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2NvbXBhbmRlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDb21wYW5kZXIgJWQgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKKwkJIF9fZnVuY19fLCBjb21wICsgMSwgdGF2aWwtPmNvbXBfZW5hYmxlZFtjb21wXSwgdmFsdWUpOworCXRhdmlsLT5jb21wX2VuYWJsZWRbY29tcF0gPSB2YWx1ZTsKKworCS8qIEFueSBzcGVjaWZpYyByZWdpc3RlciBjb25maWd1cmF0aW9uIGZvciBjb21wYW5kZXIgKi8KKwlzd2l0Y2ggKGNvbXApIHsKKwljYXNlIENPTVBBTkRFUl8xOgorCQkvKiBTZXQgR2FpbiBTb3VyY2UgU2VsZWN0IGJhc2VkIG9uIGNvbXBhbmRlciBlbmFibGUvZGlzYWJsZSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9MX0VOLCAweDIwLAorCQkJCSh2YWx1ZSA/IDB4MDA6MHgyMCkpOworCQlicmVhazsKKwljYXNlIENPTVBBTkRFUl8yOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SX0VOLCAweDIwLAorCQkJCSh2YWx1ZSA/IDB4MDA6MHgyMCkpOworCQlicmVhazsKKwljYXNlIENPTVBBTkRFUl8zOgorCWNhc2UgQ09NUEFOREVSXzQ6CisJY2FzZSBDT01QQU5ERVJfNzoKKwljYXNlIENPTVBBTkRFUl84OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBpZiBjb21wYW5kZXIgaXMgbm90IGVuYWJsZWQgZm9yIGFueSBpbnRlcnBvbGF0b3IsCisJCSAqIGl0IGRvZXMgbm90IGNhdXNlIGFueSBhdWRpbyBmYWlsdXJlLCBzbyBkbyBub3QKKwkJICogcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSwgYnV0IGp1c3QgcHJpbnQgYSBsb2cKKwkJICovCisJCWRldl93YXJuKGNvZGVjLT5kZXYsICIlczogdW5rbm93biBjb21wYW5kZXI6ICVkXG4iLAorCQkJX19mdW5jX18sIGNvbXApOworCX07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfaHBoX2FzcmNfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGluZGV4ID0gLUVJTlZBTDsKKworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQVNSQzAgT3V0cHV0IE1vZGUiKSkKKwkJaW5kZXggPSBBU1JDMDsKKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFTUkMxIE91dHB1dCBNb2RlIikpCisJCWluZGV4ID0gQVNSQzE7CisKKwlpZiAodGF2aWwgJiYgKGluZGV4ID49IDApICYmIChpbmRleCA8IEFTUkNfTUFYKSkKKwkJdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbaW5kZXhdID0KKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfaHBoX2FzcmNfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCA9IDA7CisJaW50IGluZGV4ID0gLUVJTlZBTDsKKworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQVNSQzAgT3V0cHV0IE1vZGUiKSkKKwkJaW5kZXggPSBBU1JDMDsKKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFTUkMxIE91dHB1dCBNb2RlIikpCisJCWluZGV4ID0gQVNSQzE7CisKKwlpZiAodGF2aWwgJiYgKGluZGV4ID49IDApICYmIChpbmRleCA8IEFTUkNfTUFYKSkKKwkJdmFsID0gdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbaW5kZXhdOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9ocGhfaWRsZV9kZXRlY3RfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCA9IDA7CisKKwlpZiAodGF2aWwpCisJCXZhbCA9IHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfZGV0ZWN0X2VuOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9ocGhfaWRsZV9kZXRlY3RfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAodGF2aWwpCisJCXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfZGV0ZWN0X2VuID0KKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZG1pY19waW5fbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJdTE2IGRtaWNfcGluOworCXU4IHJlZ192YWwsIHBpbmN0bF9wb3NpdGlvbjsKKworCXBpbmN0bF9wb3NpdGlvbiA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7CisKKwlkbWljX3BpbiA9IHBpbmN0bF9wb3NpdGlvbiAmIDB4MDc7CisJcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCVdDRDkzNFhfVExNTV9ETUlDMV9DTEtfUElOQ0ZHICsgZG1pY19waW4gLSAxKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gISFyZWdfdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTE2IGN0bF9yZWcsIGNmZ19yZWcsIGRtaWNfcGluOworCXU4IGN0bF92YWwsIGNmZ192YWwsIHBpbmN0bF9wb3NpdGlvbiwgcGluY3RsX21vZGUsIG1hc2s7CisKKwkvKiAwLSBoaWdoIG9yIGxvdzsgMS0gaGlnaCBaICovCisJcGluY3RsX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlwaW5jdGxfcG9zaXRpb24gPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OworCisJc3dpdGNoIChwaW5jdGxfcG9zaXRpb24gPj4gMykgeworCWNhc2UgMDoKKwkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHBpbmN0bCBwb3NpdGlvbiA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBpbmN0bF9wb3NpdGlvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0bF92YWwgPSB+KHBpbmN0bF9tb2RlIDw8IChwaW5jdGxfcG9zaXRpb24gJiAweDA3KSk7CisJbWFzayA9IDEgPDwgKHBpbmN0bF9wb3NpdGlvbiAmIDB4MDcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGN0bF9yZWcsIG1hc2ssIGN0bF92YWwpOworCisJZG1pY19waW4gPSBwaW5jdGxfcG9zaXRpb24gJiAweDA3OworCWNmZ19yZWcgPSBXQ0Q5MzRYX1RMTU1fRE1JQzFfQ0xLX1BJTkNGRyArIGRtaWNfcGluIC0gMTsKKwlpZiAocGluY3RsX21vZGUpIHsKKwkJaWYgKHRhdmlsLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQorCQkJY2ZnX3ZhbCA9IDB4NjsKKwkJZWxzZQorCQkJY2ZnX3ZhbCA9IDB4RDsKKwl9IGVsc2UKKwkJY2ZnX3ZhbCA9IDA7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2ZnX3JlZywgMHgxRiwgY2ZnX3ZhbCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogcmVnPTB4JXggbWFzaz0weCV4IHZhbD0lZCByZWc9MHgleCB2YWw9JWRcbiIsCisJCQlfX2Z1bmNfXywgY3RsX3JlZywgbWFzaywgY3RsX3ZhbCwgY2ZnX3JlZywgY2ZnX3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9hbWljX3B3cl9sdmxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJdTE2IGFtaWNfcmVnOworCisJaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzFfMiBQV1IgTU9ERSIpKQorCQlhbWljX3JlZyA9IFdDRDkzNFhfQU5BX0FNSUMxOworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18zXzQgUFdSIE1PREUiKSkKKwkJYW1pY19yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMzsKKwllbHNlCisJCWdvdG8gcmV0OworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkoc25kX3NvY19yZWFkKGNvZGVjLCBhbWljX3JlZykgJiBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9NQVNLKSA+PgorCQkJICAgICBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9TSElGVDsKK3JldDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9hbWljX3B3cl9sdmxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJdTMyIG1vZGVfdmFsOworCXUxNiBhbWljX3JlZzsKKworCW1vZGVfdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlZFxuIiwgX19mdW5jX18sIG1vZGVfdmFsKTsKKworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18xXzIgUFdSIE1PREUiKSkKKwkJYW1pY19yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMTsKKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfM180IFBXUiBNT0RFIikpCisJCWFtaWNfcmVnID0gV0NEOTM0WF9BTkFfQU1JQzM7CisJZWxzZQorCQlnb3RvIHJldDsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFtaWNfcmVnLCBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9NQVNLLAorCQkJICAgIG1vZGVfdmFsIDw8IFdDRDkzNFhfQU1JQ19QV1JfTFZMX1NISUZUKTsKK3JldDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhdmlsX2Nvbm5fbWFkX3RleHRbXSA9IHsKKwkiTk9UVVNFRDEiLCAiQURDMSIsICJBREMyIiwgIkFEQzMiLCAiQURDNCIsICJOT1RVU0VENSIsCisJIk5PVFVTRUQ2IiwgIk5PVFVTRUQyIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwKKwkiRE1JQzQiLCAiRE1JQzUiLCAiTk9UVVNFRDMiLCAiTk9UVVNFRDQiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhdmlsX2Nvbm5fbWFkX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXZpbF9jb25uX21hZF90ZXh0KSwKKwkJCSAgICB0YXZpbF9jb25uX21hZF90ZXh0KTsKKworc3RhdGljIGludCB0YXZpbF9tYWRfaW5wdXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXU4IHRhdmlsX21hZF9pbnB1dDsKKworCXRhdmlsX21hZF9pbnB1dCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0lOUF9TRUwpICYgMHgwRjsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhdmlsX21hZF9pbnB1dDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB0YXZpbF9tYWRfaW5wdXQgPSAlc1xuIiwgX19mdW5jX18sCisJCXRhdmlsX2Nvbm5fbWFkX3RleHRbdGF2aWxfbWFkX2lucHV0XSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9tYWRfaW5wdXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJdTggdGF2aWxfbWFkX2lucHV0OworCWNoYXIgbWFkX2FtaWNfaW5wdXRfd2lkZ2V0WzZdOworCWNvbnN0IGNoYXIgKm1hZF9pbnB1dF93aWRnZXQ7CisJY29uc3QgY2hhciAqc291cmNlX3dpZGdldCA9IE5VTEw7CisJdTMyIGFkYywgaSwgbWljX2JpYXNfZm91bmQgPSAwOworCWludCByZXQgPSAwOworCWNoYXIgKm1hZF9pbnB1dDsKKwlib29sIGlzX2FkYzJfaW5wdXQgPSBmYWxzZTsKKworCXRhdmlsX21hZF9pbnB1dCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKHN0cm5zdHIodGF2aWxfY29ubl9tYWRfdGV4dFt0YXZpbF9tYWRfaW5wdXRdLCAiTk9UVVNFRCIsCisJCQkJc2l6ZW9mKCJOT1RVU0VEIikpKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCSIlczogVW5zdXBwb3J0ZWQgdGF2aWxfbWFkX2lucHV0ID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgdGF2aWxfY29ubl9tYWRfdGV4dFt0YXZpbF9tYWRfaW5wdXRdKTsKKwkJLyogTWFrZSBzdXJlIHRoZSBNQUQgcmVnaXN0ZXIgaXMgdXBkYXRlZCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQURfU0VUVVAsCisJCQkJICAgIDB4ODgsIDB4MDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RybnN0cih0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF0sCisJCSAgICAiQURDIiwgc2l6ZW9mKCJBREMiKSkpIHsKKwkJbWFkX2lucHV0ID0gc3RycGJyayh0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF0sCisJCQkJICAgICIxMjM0Iik7CisJCWlmICghbWFkX2lucHV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBNQUQgaW5wdXQgJXNcbiIsCisJCQkJX19mdW5jX18sIHRhdmlsX2Nvbm5fbWFkX3RleHRbdGF2aWxfbWFkX2lucHV0XSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IGtzdHJ0b3VpbnQobWFkX2lucHV0LCAxMCwgJmFkYyk7CisJCWlmICgocmV0IDwgMCkgfHwgKGFkYyA+IDQpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBBREMgPSAlc1xuIiwgX19mdW5jX18sCisJCQkJdGF2aWxfY29ubl9tYWRfdGV4dFt0YXZpbF9tYWRfaW5wdXRdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLypBTUlDNCBhbmQgQU1JQzUgc2hhcmUgQURDNCovCisJCWlmICgoYWRjID09IDQpICYmCisJCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX1RYX05FV19BTUlDXzRfNV9TRUwpICYgMHgxMCkpCisJCQlhZGMgPSA1OworCisJCXNucHJpbnRmKG1hZF9hbWljX2lucHV0X3dpZGdldCwgNiwgIiVzJXUiLCAiQU1JQyIsIGFkYyk7CisKKwkJbWFkX2lucHV0X3dpZGdldCA9IG1hZF9hbWljX2lucHV0X3dpZGdldDsKKwkJaWYgKGFkYyA9PSAyKQorCQkJaXNfYWRjMl9pbnB1dCA9IHRydWU7CisJfSBlbHNlIHsKKwkJLyogRE1JQyB0eXBlIGlucHV0IHdpZGdldCovCisJCW1hZF9pbnB1dF93aWRnZXQgPSB0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF07CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkiJXM6IHRhdmlsIGlucHV0IHdpZGdldCA9ICVzLCBhZGNfaW5wdXQgPSAlc1xuIiwgX19mdW5jX18sCisJCW1hZF9pbnB1dF93aWRnZXQsIGlzX2FkYzJfaW5wdXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fb2ZfZGFwbV9yb3V0ZXM7IGkrKykgeworCQlpZiAoIXN0cmNtcChjYXJkLT5vZl9kYXBtX3JvdXRlc1tpXS5zaW5rLCBtYWRfaW5wdXRfd2lkZ2V0KSkgeworCQkJc291cmNlX3dpZGdldCA9IGNhcmQtPm9mX2RhcG1fcm91dGVzW2ldLnNvdXJjZTsKKwkJCWlmICghc291cmNlX3dpZGdldCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOiBpbnZhbGlkIHNvdXJjZSB3aWRnZXRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDI7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVMzIiwgc2l6ZW9mKCJNSUMgQklBUzMiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDM7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKKwkJCQkiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpIHsKKwkJCQltaWNfYmlhc19mb3VuZCA9IDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIW1pY19iaWFzX2ZvdW5kKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtaWMgYmlhcyBub3QgZm91bmQgZm9yIGlucHV0ICVzXG4iLAorCQkJX19mdW5jX18sIG1hZF9pbnB1dF93aWRnZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWljX2JpYXMgZm91bmQgPSAlZFxuIiwgX19mdW5jX18sCisJCW1pY19iaWFzX2ZvdW5kKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9JTlBfU0VMLAorCQkJICAgIDB4MEYsIHRhdmlsX21hZF9pbnB1dCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUFEX1NFVFVQLAorCQkJICAgIDB4MDcsIG1pY19iaWFzX2ZvdW5kKTsKKwkvKiBmb3IgYWRjMiBpbnB1dCwgbWFkIHNob3VsZCBiZSBpbiBtaWNiaWFzIG1vZGUgd2l0aCBCRyBlbmFibGVkICovCisJaWYgKGlzX2FkYzJfaW5wdXQpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01BRF9TRVRVUCwKKwkJCQkgICAgMHg4OCwgMHg4OCk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQURfU0VUVVAsCisJCQkJICAgIDB4ODgsIDB4MDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2Vhcl9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTggZWFyX3BhX2dhaW47CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisKKwllYXJfcGFfZ2FpbiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfRUFSKTsKKworCWVhcl9wYV9nYWluID0gKGVhcl9wYV9nYWluICYgMHg3MCkgPj4gNDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZWFyX3BhX2dhaW47CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZWFyX3BhX2dhaW4gPSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJZWFyX3BhX2dhaW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZWFyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1OCBlYXJfcGFfZ2FpbjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAgPSAlbGRcbiIsCisJCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJZWFyX3BhX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNDsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0VBUiwgMHg3MCwgZWFyX3BhX2dhaW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+ZWFyX3Nwa3JfZ2FpbjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdGF2aWwtPmVhcl9zcGtyX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZ2FpbiA9ICVkXG4iLCBfX2Z1bmNfXywgdGF2aWwtPmVhcl9zcGtyX2dhaW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfcnhfaHBoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGF2aWwtPmhwaF9tb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX3J4X2hwaF9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTMyIG1vZGVfdmFsOworCisJbW9kZV92YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVkXG4iLCBfX2Z1bmNfXywgbW9kZV92YWwpOworCisJaWYgKG1vZGVfdmFsID09IDApIHsKKwkJZGV2X3dhcm4oY29kZWMtPmRldiwgIiVzOkludmFsaWQgSFBIIE1vZGUsIGRlZmF1bHQgdG8gQ2xzLUggTE9IaUZpXG4iLAorCQkJX19mdW5jX18pOworCQltb2RlX3ZhbCA9IENMU19IX0xPSElGSTsKKwl9CisJdGF2aWwtPmhwaF9tb2RlID0gbW9kZV92YWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaHBoX21vZGVfbXV4X3RleHRbXSA9IHsKKwkiQ0xTX0hfSU5WQUxJRCIsICJDTFNfSF9ISUZJIiwgIkNMU19IX0xQIiwgIkNMU19BQiIsICJDTFNfSF9MT0hJRkkiLAorCSJDTFNfSF9VTFAiLCAiQ0xTX0FCX0hJRkkiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9ocGhfbW9kZV9tdXhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHJ4X2hwaF9tb2RlX211eF90ZXh0KSwKKwkJCSAgICByeF9ocGhfbW9kZV9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YXZpbF9hbmNfZnVuY190ZXh0W10gPSB7Ik9GRiIsICJPTiJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0YXZpbF9hbmNfZnVuY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHRhdmlsX2FuY19mdW5jX3RleHQpOworCisvKiBDdXRvZmYgZnJlcXVlbmN5IGZvciBoaWdoIHBhc3MgZmlsdGVyICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNmX3RleHRbXSA9IHsKKwkiQ0ZfTkVHXzNEQl80SFoiLCAiQ0ZfTkVHXzNEQl83NUhaIiwgIkNGX05FR18zREJfMTUwSFoiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2NmX3RleHRbXSA9IHsKKwkiQ0ZfTkVHXzNEQl80SFoiLCAiQ0ZfTkVHXzNEQl83NUhaIiwgIkNGX05FR18zREJfMTUwSFoiLAorCSJDRl9ORUdfM0RCXzBQNDhIWiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYW1pY19wd3JfbHZsX3RleHRbXSA9IHsKKwkiTE9XX1BXUiIsICJERUZBVUxUIiwgIkhJR0hfUEVSRiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHBoX2lkbGVfZGV0ZWN0X3RleHRbXSA9IHsKKwkiT0ZGIiwgIk9OIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3JjX21vZGVfdGV4dFtdID0geworCSJJTlQiLCAiRlJBQyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGF2aWxfZWFyX3BhX2dhaW5fdGV4dFtdID0geworCSJHXzZfREIiLCAiR180UDVfREIiLCAiR18zX0RCIiwgIkdfMVA1X0RCIiwKKwkiR18wX0RCIiwgIkdfTTJQNV9EQiIsICJVTkRFRklORUQiLCAiR19NMTJfREIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dFtdID0geworCSJHX0RFRkFVTFQiLCAiR18wX0RCIiwgIkdfMV9EQiIsICJHXzJfREIiLCAiR18zX0RCIiwKKwkiR180X0RCIiwgIkdfNV9EQiIsICJHXzZfREIiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRhdmlsX2Vhcl9wYV9nYWluX2VudW0sIHRhdmlsX2Vhcl9wYV9nYWluX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0YXZpbF9lYXJfc3Brcl9wYV9nYWluX2VudW0sCisJCQkJdGF2aWxfZWFyX3Nwa3JfcGFfZ2Fpbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYW1pY19wd3JfbHZsX2VudW0sIGFtaWNfcHdyX2x2bF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaHBoX2lkbGVfZGV0ZWN0X2VudW0sIGhwaF9pZGxlX2RldGVjdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYXNyY19tb2RlX2VudW0sIGFzcmNfbW9kZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWMwX2VudW0sIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsIDUsCisJCQkJCQkJY2ZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjMV9lbnVtLCBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DRkcwLCA1LAorCQkJCQkJCWNmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzJfZW51bSwgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ0ZHMCwgNSwKKwkJCQkJCQljZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWMzX2VudW0sIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzAsIDUsCisJCQkJCQkJY2ZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjNF9lbnVtLCBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DRkcwLCA1LAorCQkJCQkJCWNmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzVfZW51bSwgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ0ZHMCwgNSwKKwkJCQkJCQljZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWM2X2VudW0sIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzAsIDUsCisJCQkJCQkJY2ZfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjN19lbnVtLCBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DRkcwLCA1LAorCQkJCQkJCWNmX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzhfZW51bSwgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ0ZHMCwgNSwKKwkJCQkJCQljZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQwXzFfZW51bSwgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQwXzJfZW51bSwgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQxXzFfZW51bSwgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQxXzJfZW51bSwgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQyXzFfZW51bSwgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQyXzJfZW51bSwgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQzXzFfZW51bSwgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQzXzJfZW51bSwgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ0XzFfZW51bSwgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ0XzJfZW51bSwgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ3XzFfZW51bSwgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ3XzJfZW51bSwgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ4XzFfZW51bSwgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMiwgMCwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ4XzJfZW51bSwgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRywgMiwKKwkJCQkJCQlyeF9jZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRhdmlsX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiRUFSIFBBIEdhaW4iLCB0YXZpbF9lYXJfcGFfZ2Fpbl9lbnVtLAorCQl0YXZpbF9lYXJfcGFfZ2Fpbl9nZXQsIHRhdmlsX2Vhcl9wYV9nYWluX3B1dCksCisJU09DX0VOVU1fRVhUKCJFQVIgU1BLUiBQQSBHYWluIiwgdGF2aWxfZWFyX3Nwa3JfcGFfZ2Fpbl9lbnVtLAorCQkgICAgIHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fZ2V0LCB0YXZpbF9lYXJfc3Brcl9wYV9nYWluX3B1dCksCisJU09DX1NJTkdMRV9UTFYoIkhQSEwgVm9sdW1lIiwgV0NEOTM0WF9IUEhfTF9FTiwgMCwgMjAsIDEsIGxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkhQSFIgVm9sdW1lIiwgV0NEOTM0WF9IUEhfUl9FTiwgMCwgMjAsIDEsIGxpbmVfZ2FpbiksCisJU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQxIFZvbHVtZSIsIFdDRDkzNFhfRElGRl9MT19MTzFfQ09NUEFOREVSLAorCQkzLCAxNiwgMSwgbGluZV9nYWluKSwKKwlTT0NfU0lOR0xFX1RMVigiTElORU9VVDIgVm9sdW1lIiwgV0NEOTM0WF9ESUZGX0xPX0xPMl9DT01QQU5ERVIsCisJCTMsIDE2LCAxLCBsaW5lX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREMxIFZvbHVtZSIsIFdDRDkzNFhfQU5BX0FNSUMxLCAwLCAyMCwgMCwgYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREMyIFZvbHVtZSIsIFdDRDkzNFhfQU5BX0FNSUMyLCAwLCAyMCwgMCwgYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREMzIFZvbHVtZSIsIFdDRDkzNFhfQU5BX0FNSUMzLCAwLCAyMCwgMCwgYW5hbG9nX2dhaW4pLAorCVNPQ19TSU5HTEVfVExWKCJBREM0IFZvbHVtZSIsIFdDRDkzNFhfQU5BX0FNSUM0LCAwLCAyMCwgMCwgYW5hbG9nX2dhaW4pLAorCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYMCBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLCAvKiAtODRkQiBtaW4gLSA0MGRCIG1heCAqLworCVNPQ19TSU5HTEVfU1hfVExWKCJSWDEgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlgyIERpZ2l0YWwgVm9sdW1lIiwgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9DVEwsCisJCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYMyBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDQgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzRYX0NEQ19SWDRfUlhfVk9MX0NUTCwKKwkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiUlg3IERpZ2l0YWwgVm9sdW1lIiwgV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9DVEwsCisJCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIlJYOCBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMLAorCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDAgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlgwX1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDEgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDIgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlgzX1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDQgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlg0X1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDcgTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJSWDggTWl4IERpZ2l0YWwgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMLCAwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAorCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzAgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzEgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFgxX1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzIgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFgyX1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzMgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFgzX1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzQgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFg0X1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzUgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFg1X1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzYgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFg2X1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzcgVm9sdW1lIiwgV0NEOTM0WF9DRENfVFg3X1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIkRFQzggVm9sdW1lIiwgV0NEOTM0WF9DRENfVFg4X1RYX1ZPTF9DVEwsIDAsCisJCS04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAwIFZvbHVtZSIsCisJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLCAwLCAtODQsIDQwLAorCQlkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIwIElOUDEgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwsIDAsIC04NCwgNDAsCisJCWRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjAgSU5QMiBWb2x1bWUiLAorCQlXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCwgMCwgLTg0LCA0MCwKKwkJZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAzIFZvbHVtZSIsCisJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLCAwLCAtODQsIDQwLAorCQlkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDAgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwsIDAsIC04NCwgNDAsCisJCWRpZ2l0YWxfZ2FpbiksCisJU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMSBWb2x1bWUiLAorCQlXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCwgMCwgLTg0LCA0MCwKKwkJZGlnaXRhbF9nYWluKSwKKwlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAyIFZvbHVtZSIsCisJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLCAwLCAtODQsIDQwLAorCQlkaWdpdGFsX2dhaW4pLAorCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDMgVm9sdW1lIiwKKwkJV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNF9DVEwsIDAsIC04NCwgNDAsCisJCWRpZ2l0YWxfZ2FpbiksCisKKwlTT0NfU0lOR0xFX0VYVCgiQU5DIFNsb3QiLCBTTkRfU09DX05PUE0sIDAsIDEwMCwgMCwgdGF2aWxfZ2V0X2FuY19zbG90LAorCQl0YXZpbF9wdXRfYW5jX3Nsb3QpLAorCVNPQ19FTlVNX0VYVCgiQU5DIEZ1bmN0aW9uIiwgdGF2aWxfYW5jX2Z1bmNfZW51bSwgdGF2aWxfZ2V0X2FuY19mdW5jLAorCQl0YXZpbF9wdXRfYW5jX2Z1bmMpLAorCisJU09DX0VOVU0oIlRYMCBIUEYgY3V0IG9mZiIsIGNmX2RlYzBfZW51bSksCisJU09DX0VOVU0oIlRYMSBIUEYgY3V0IG9mZiIsIGNmX2RlYzFfZW51bSksCisJU09DX0VOVU0oIlRYMiBIUEYgY3V0IG9mZiIsIGNmX2RlYzJfZW51bSksCisJU09DX0VOVU0oIlRYMyBIUEYgY3V0IG9mZiIsIGNmX2RlYzNfZW51bSksCisJU09DX0VOVU0oIlRYNCBIUEYgY3V0IG9mZiIsIGNmX2RlYzRfZW51bSksCisJU09DX0VOVU0oIlRYNSBIUEYgY3V0IG9mZiIsIGNmX2RlYzVfZW51bSksCisJU09DX0VOVU0oIlRYNiBIUEYgY3V0IG9mZiIsIGNmX2RlYzZfZW51bSksCisJU09DX0VOVU0oIlRYNyBIUEYgY3V0IG9mZiIsIGNmX2RlYzdfZW51bSksCisJU09DX0VOVU0oIlRYOCBIUEYgY3V0IG9mZiIsIGNmX2RlYzhfZW51bSksCisKKwlTT0NfRU5VTSgiUlggSU5UMF8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MF8xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQwXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQwXzJfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDFfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDFfMV9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UMV8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MV8yX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQyXzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQyXzFfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDJfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDJfMl9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UM18xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50M18xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQzXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQzXzJfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDRfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDRfMV9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UNF8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50NF8yX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQ3XzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQ3XzFfZW51bSksCisJU09DX0VOVU0oIlJYIElOVDdfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDdfMl9lbnVtKSwKKwlTT0NfRU5VTSgiUlggSU5UOF8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50OF8xX2VudW0pLAorCVNPQ19FTlVNKCJSWCBJTlQ4XzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQ4XzJfZW51bSksCisKKwlTT0NfRU5VTV9FWFQoIlJYIEhQSCBNb2RlIiwgcnhfaHBoX21vZGVfbXV4X2VudW0sCisJCXRhdmlsX3J4X2hwaF9tb2RlX2dldCwgdGF2aWxfcnhfaHBoX21vZGVfcHV0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kMSIsIElJUjAsIEJBTkQxLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kMiIsIElJUjAsIEJBTkQyLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kMyIsIElJUjAsIEJBTkQzLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kNCIsIElJUjAsIEJBTkQ0LCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kNSIsIElJUjAsIEJBTkQ1LCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMSIsIElJUjEsIEJBTkQxLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMiIsIElJUjEsIEJBTkQyLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMyIsIElJUjEsIEJBTkQzLCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAxLCAwLAorCQl0YXZpbF9paXJfZW5hYmxlX2F1ZGlvX21peGVyX2dldCwKKwkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQpLAorCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDEiLCBJSVIwLCBCQU5EMSwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDIiLCBJSVIwLCBCQU5EMiwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDMiLCBJSVIwLCBCQU5EMywgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDQiLCBJSVIwLCBCQU5ENCwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDUiLCBJSVIwLCBCQU5ENSwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDEiLCBJSVIxLCBCQU5EMSwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDIiLCBJSVIxLCBCQU5EMiwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDMiLCBJSVIxLCBCQU5EMywgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDQiLCBJSVIxLCBCQU5ENCwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDUiLCBJSVIxLCBCQU5ENSwgMjU1LCAwLCA1LAorCQl0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQsIHRhdmlsX2lpcl9iYW5kX2F1ZGlvX21peGVyX3B1dCksCisKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDEgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfMSwgMSwgMCwKKwkJdGF2aWxfY29tcGFuZGVyX2dldCwgdGF2aWxfY29tcGFuZGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIkNPTVAyIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzIsIDEsIDAsCisJCXRhdmlsX2NvbXBhbmRlcl9nZXQsIHRhdmlsX2NvbXBhbmRlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJDT01QMyBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl8zLCAxLCAwLAorCQl0YXZpbF9jb21wYW5kZXJfZ2V0LCB0YXZpbF9jb21wYW5kZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUDQgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfNCwgMSwgMCwKKwkJdGF2aWxfY29tcGFuZGVyX2dldCwgdGF2aWxfY29tcGFuZGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIkNPTVA3IFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzcsIDEsIDAsCisJCXRhdmlsX2NvbXBhbmRlcl9nZXQsIHRhdmlsX2NvbXBhbmRlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJDT01QOCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl84LCAxLCAwLAorCQl0YXZpbF9jb21wYW5kZXJfZ2V0LCB0YXZpbF9jb21wYW5kZXJfcHV0KSwKKworCVNPQ19FTlVNX0VYVCgiQVNSQzAgT3V0cHV0IE1vZGUiLCBhc3JjX21vZGVfZW51bSwKKwkJdGF2aWxfaHBoX2FzcmNfbW9kZV9nZXQsIHRhdmlsX2hwaF9hc3JjX21vZGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFTUkMxIE91dHB1dCBNb2RlIiwgYXNyY19tb2RlX2VudW0sCisJCXRhdmlsX2hwaF9hc3JjX21vZGVfZ2V0LCB0YXZpbF9ocGhfYXNyY19tb2RlX3B1dCksCisKKwlTT0NfRU5VTV9FWFQoIkhQSCBJZGxlIERldGVjdCIsIGhwaF9pZGxlX2RldGVjdF9lbnVtLAorCQl0YXZpbF9ocGhfaWRsZV9kZXRlY3RfZ2V0LCB0YXZpbF9ocGhfaWRsZV9kZXRlY3RfcHV0KSwKKworCVNPQ19FTlVNX0VYVCgiTUFEIElucHV0IiwgdGF2aWxfY29ubl9tYWRfZW51bSwKKwkJICAgICB0YXZpbF9tYWRfaW5wdXRfZ2V0LCB0YXZpbF9tYWRfaW5wdXRfcHV0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJETUlDMV9DTEtfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDE3LCAxLCAwLAorCQl0YXZpbF9kbWljX3Bpbl9tb2RlX2dldCwgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQpLAorCisJU09DX1NJTkdMRV9FWFQoIkRNSUMxX0RBVEFfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDE4LCAxLCAwLAorCQl0YXZpbF9kbWljX3Bpbl9tb2RlX2dldCwgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQpLAorCisJU09DX1NJTkdMRV9FWFQoIkRNSUMyX0NMS19QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMTksIDEsIDAsCisJCXRhdmlsX2RtaWNfcGluX21vZGVfZ2V0LCB0YXZpbF9kbWljX3Bpbl9tb2RlX3B1dCksCisKKwlTT0NfU0lOR0xFX0VYVCgiRE1JQzJfREFUQV9QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMjAsIDEsIDAsCisJCXRhdmlsX2RtaWNfcGluX21vZGVfZ2V0LCB0YXZpbF9kbWljX3Bpbl9tb2RlX3B1dCksCisKKwlTT0NfU0lOR0xFX0VYVCgiRE1JQzNfQ0xLX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAyMSwgMSwgMCwKKwkJdGF2aWxfZG1pY19waW5fbW9kZV9nZXQsIHRhdmlsX2RtaWNfcGluX21vZGVfcHV0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJETUlDM19EQVRBX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAyMiwgMSwgMCwKKwkJdGF2aWxfZG1pY19waW5fbW9kZV9nZXQsIHRhdmlsX2RtaWNfcGluX21vZGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFNSUNfMV8yIFBXUiBNT0RFIiwgYW1pY19wd3JfbHZsX2VudW0sCisJCXRhdmlsX2FtaWNfcHdyX2x2bF9nZXQsIHRhdmlsX2FtaWNfcHdyX2x2bF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiQU1JQ18zXzQgUFdSIE1PREUiLCBhbWljX3B3cl9sdmxfZW51bSwKKwkJdGF2aWxfYW1pY19wd3JfbHZsX2dldCwgdGF2aWxfYW1pY19wd3JfbHZsX3B1dCksCisJU09DX0VOVU1fRVhUKCJBTUlDXzVfNiBQV1IgTU9ERSIsIGFtaWNfcHdyX2x2bF9lbnVtLAorCQl0YXZpbF9hbWljX3B3cl9sdmxfZ2V0LCB0YXZpbF9hbWljX3B3cl9sdmxfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgdGF2aWxfZGVjX2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXUxNiBtaWNfc2VsX3JlZyA9IDA7CisJdTggbWljX3NlbDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHZhbCA+IGUtPml0ZW1zIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWU6ICVzLCB2YWw6IDB4JXhcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHZhbCk7CisKKwlzd2l0Y2ggKGUtPnJlZykgeworCWNhc2UgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxOgorCQlpZiAoZS0+c2hpZnRfbCA9PSAwKQorCQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwOworCQllbHNlIGlmIChlLT5zaGlmdF9sID09IDIpCisJCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzA7CisJCWVsc2UgaWYgKGUtPnNoaWZ0X2wgPT0gNCkKKwkJCW1pY19zZWxfcmVnID0gV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzE6CisJCWlmIChlLT5zaGlmdF9sID09IDApCisJCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzA7CisJCWVsc2UgaWYgKGUtPnNoaWZ0X2wgPT0gMikKKwkJCW1pY19zZWxfcmVnID0gV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzE6CisJCWlmIChlLT5zaGlmdF9sID09IDApCisJCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzA7CisJCWVsc2UgaWYgKGUtPnNoaWZ0X2wgPT0gMikKKwkJCW1pY19zZWxfcmVnID0gV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzE6CisJCWlmIChlLT5zaGlmdF9sID09IDApCisJCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzA7CisJCWVsc2UgaWYgKGUtPnNoaWZ0X2wgPT0gMikKKwkJCW1pY19zZWxfcmVnID0gV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGUtPnJlZzogMHgleCBub3QgZXhwZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXywgZS0+cmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQURDOiAwLCBETUlDOiAxICovCisJbWljX3NlbCA9IHZhbCA/IDB4MCA6IDB4MTsKKwlpZiAobWljX3NlbF9yZWcpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY19zZWxfcmVnLCAxIDw8IDcsIG1pY19zZWwgPDwgNyk7CisKKwlyZXR1cm4gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOworfQorCitzdGF0aWMgaW50IHRhdmlsX2ludF9kZW1faW5wX211eF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgc2hvcnQgbG9va19haGVhZF9kbHlfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHZhbCA+PSBlLT5pdGVtcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWU6ICVzLCB2YWw6IDB4JXhcbiIsIF9fZnVuY19fLAorCQl3aWRnZXQtPm5hbWUsIHZhbCk7CisKKwlpZiAoZS0+cmVnID09IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzA7CisJZWxzZSBpZiAoZS0+cmVnID09IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzA7CisJZWxzZSBpZiAoZS0+cmVnID09IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzApCisJCWxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzA7CisKKwkvKiBTZXQgTG9vayBBaGVhZCBEZWxheSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxvb2tfYWhlYWRfZGx5X3JlZywKKwkJCSAgICAweDA4LCAodmFsID8gMHgwOCA6IDB4MDApKTsKKwkvKiBTZXQgREVNIElOUCBTZWxlY3QgKi8KKwlyZXR1cm4gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDBfN19taXhfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWDAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsCisJIlJYNiIsICJSWDciLCAiUFJPWElNSVRZIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnRfbWl4X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlgwIiwgIlJYMSIsICJSWDIiLCAiUlgzIiwgIlJYNCIsICJSWDUiLAorCSJSWDYiLCAiUlg3IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9wcmltX21peF90ZXh0W10gPSB7CisJIlpFUk8iLCAiREVDMCIsICJERUMxIiwgIklJUjAiLCAiSUlSMSIsICJSWDAiLCAiUlgxIiwgIlJYMiIsCisJIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X3NpZGV0b25lX21peF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU1JDMCIsICJTUkMxIiwgIlNSQ19TVU0iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFgwIiwgIkRFQzAiLCAiREVDMF8xOTIiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHgxX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYMSIsICJERUMxIiwgIkRFQzFfMTkyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4Ml9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDIiLCAiREVDMiIsICJERUMyXzE5MiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDNfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFgzIiwgIkRFQzMiLCAiREVDM18xOTIiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHg0X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYNCIsICJERUM0IiwgIkRFQzRfMTkyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4NV9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDUiLCAiREVDNSIsICJERUM1XzE5MiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDZfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWF9NSVhfVFg2IiwgIkRFQzYiLCAiREVDNl8xOTIiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHg3X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYX1RYNyIsICJERUM3IiwgIkRFQzdfMTkyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4OF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYX01JWF9UWDgiLCAiREVDOCIsICJERUM4XzE5MiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDlfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUM3IiwgIkRFQzdfMTkyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4MTBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUM2IiwgIkRFQzZfMTkyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4MTFfbXV4X3RleHRbXSA9IHsKKwkiREVDXzBfNSIsICJERUNfOV8xMiIsICJNQURfQVVESU8iLCAiTUFEX0JSRENTVCIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDExX2lucDFfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLAorCSJERUM1IiwgIlJYX01JWF9UWDUiLCAiREVDOV8xMCIsICJERUMxMV8xMiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDEzX211eF90ZXh0W10gPSB7CisJIkNEQ19ERUNfNSIsICJNQURfQlJEQ1NUIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4MTNfaW5wMV9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkRFQzUiLCAiREVDNV8xOTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpcl9pbnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLCAiREVDNSIsICJERUM2IiwKKwkiREVDNyIsICJERUM4IiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludF9kZW1faW5wX211eF90ZXh0W10gPSB7CisJIk5PUk1BTF9EU01fT1VUIiwgIkNMU0hfRFNNX09VVCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDBfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQwXzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDFfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQxXzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDJfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQyXzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDNfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQzXzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDRfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ0XzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDdfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ3XzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDhfMV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ4XzEgTUlYMSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDBfMl9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQwXzIgTVVYIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50MV8yX2ludGVycF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYIElOVDFfMiBNVVgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQyXzJfaW50ZXJwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlggSU5UMl8yIE1VWCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDNfMl9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQzXzIgTVVYIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50NF8yX2ludGVycF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlJYIElOVDRfMiBNVVgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ3XzJfaW50ZXJwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlggSU5UN18yIE1VWCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDhfMl9pbnRlcnBfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJSWCBJTlQ4XzIgTVVYIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWFkX3NlbF90eHRbXSA9IHsKKwkiU1BFIiwgIk1TTSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWFkX2lucF9tdXhfdHh0W10gPSB7CisJIk1BRCIsICJERUMxIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhZGNfbXV4X3RleHRbXSA9IHsKKwkiRE1JQyIsICJBTUlDIiwgIkFOQ19GQl9UVU5FMSIsICJBTkNfRkJfVFVORTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRtaWNfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJETUlDMCIsICJETUlDMSIsICJETUlDMiIsICJETUlDMyIsICJETUlDNCIsICJETUlDNSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYW1pY19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkFEQzEiLCAiQURDMiIsICJBREMzIiwgIkFEQzQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFtaWM0XzVfc2VsX3RleHRbXSA9IHsKKwkiQU1JQzQiLCAiQU1JQzUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFuYzBfZmJfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBTkNfSU5fSFBITCIsICJBTkNfSU5fRUFSIiwgIkFOQ19JTl9FQVJfU1BLUiIsCisJIkFOQ19JTl9MTzEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFuYzFfZmJfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBTkNfSU5fSFBIUiIsICJBTkNfSU5fTE8yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9lY2hvX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiUlhfTUlYMCIsICJSWF9NSVgxIiwgIlJYX01JWDIiLCAiUlhfTUlYMyIsICJSWF9NSVg0IiwKKwkiUlhfTUlYNSIsICJSWF9NSVg2IiwgIlJYX01JWDciLCAiUlhfTUlYOCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQUlGMV9QQiIsICJBSUYyX1BCIiwgIkFJRjNfUEIiLCAiQUlGNF9QQiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjZGNfaWZfcngwX211eF90ZXh0W10gPSB7CisJIlNMSU0gUlgwIiwgIkkyU18wIFJYMCIKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4MV9tdXhfdGV4dFtdID0geworCSJTTElNIFJYMSIsICJJMlNfMCBSWDEiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNkY19pZl9yeDJfbXV4X3RleHRbXSA9IHsKKwkiU0xJTSBSWDIiLCAiSTJTXzAgUlgyIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjZGNfaWZfcngzX211eF90ZXh0W10gPSB7CisJIlNMSU0gUlgzIiwgIkkyU18wIFJYMyIKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4NF9tdXhfdGV4dFtdID0geworCSJTTElNIFJYNCIsICJJMlNfMCBSWDQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNkY19pZl9yeDVfbXV4X3RleHRbXSA9IHsKKwkiU0xJTSBSWDUiLCAiSTJTXzAgUlg1IgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjZGNfaWZfcng2X211eF90ZXh0W10gPSB7CisJIlNMSU0gUlg2IiwgIkkyU18wIFJYNiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4N19tdXhfdGV4dFtdID0geworCSJTTElNIFJYNyIsICJJMlNfMCBSWDciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzcmMwX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiQVNSQ19JTl9IUEhMIiwgIkFTUkNfSU5fTE8xIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNyYzFfbXV4X3RleHRbXSA9IHsKKwkiWkVSTyIsICJBU1JDX0lOX0hQSFIiLCAiQVNSQ19JTl9MTzIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3JjMl9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkFTUkNfSU5fU1BLUjEiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3JjM19tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIkFTUkNfSU5fU1BLUjIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXRpdmVfbXV4X3RleHRbXSA9IHsKKwkiT0ZGIiwgIk9OIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWY0X3ZpX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNQS1JfVklfMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDE0LCAxLCAwLAorCQkJdGF2aWxfdmlfZmVlZF9taXhlcl9nZXQsIHRhdmlsX3ZpX2ZlZWRfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU1BLUl9WSV8yIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTUsIDEsIDAsCisJCQl0YXZpbF92aV9mZWVkX21peGVyX2dldCwgdGF2aWxfdmlfZmVlZF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFfY2FwX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgwIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgyIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgzIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg0IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg1IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg2IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNiwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg3IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg4IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYOCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg5IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYOSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEwLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTEsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMywgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMl9jYXBfbWl4ZXJbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDAiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgwLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgyLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDMiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgzLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDQiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg0LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg1LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDYiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg2LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDciLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg3LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg4LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDkiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg5LCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEwIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTEiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMSwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEzLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYzX2NhcF9taXhlcltdID0geworCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDAsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMiIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDIsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDQsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDUsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDYsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDcsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDgsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDksIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMCwgMSwgMCwKKwkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDExLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEzIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTMsIDEsIDAsCisJCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfbWFkX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEzLCAxLCAwLAorCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKK307CisKK1dDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcngwLCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCisJc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDEsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKKwlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVChzbGltX3J4MiwgU05EX1NPQ19OT1BNLCAwLCBzbGltX3J4X211eF90ZXh0LAorCXNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KTsKK1dDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcngzLCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCisJc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDQsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKKwlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVChzbGltX3J4NSwgU05EX1NPQ19OT1BNLCAwLCBzbGltX3J4X211eF90ZXh0LAorCXNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KTsKK1dDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcng2LCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCisJc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDcsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKKwlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7CisKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MCwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MSwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngxX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MiwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngyX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MywgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngzX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NCwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng0X211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NSwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng1X211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NiwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng2X211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NywgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng3X211eF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShyeF9pbnQwXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxLCAwLAorCXJ4X2ludDBfN19taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQxXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxLCAwLAorCXJ4X2ludF9taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQyXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcxLCAwLAorCXJ4X2ludF9taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQzXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAwLAorCXJ4X2ludF9taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQ0XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxLCAwLAorCXJ4X2ludF9taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQ3XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxLCAwLAorCXJ4X2ludDBfN19taXhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQ4XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxLCAwLAorCXJ4X2ludF9taXhfbXV4X3RleHQpOworCitXQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsIDAsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDQsCisJcnhfcHJpbV9taXhfdGV4dCk7CisKK1dDRF9EQVBNX0VOVU0ocnhfaW50MF9taXgyX2lucCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMCwgMCwKKwlyeF9zaWRldG9uZV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDFfbWl4Ml9pbnAsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDIsCisJcnhfc2lkZXRvbmVfbWl4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQyX21peDJfaW5wLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwLCA0LAorCXJ4X3NpZGV0b25lX21peF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50M19taXgyX2lucCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMCwgNiwKKwlyeF9zaWRldG9uZV9taXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDRfbWl4Ml9pbnAsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDAsCisJcnhfc2lkZXRvbmVfbWl4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9pbnQ3X21peDJfaW5wLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxLCAyLAorCXJ4X3NpZGV0b25lX21peF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTAsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgNCwKKwlhZGNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSwgNCwKKwlhZGNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgNCwKKwlhZGNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTMsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgNiwKKwlhZGNfbXV4X3RleHQpOworCisKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgwLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAsIDMsCisJZG1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4MSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwLCAzLAorCWRtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgzLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzAsIDMsCisJZG1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4NCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwLCAzLAorCWRtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDUsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXg2LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg2X0NGRzAsIDMsCisJZG1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4NywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwLCAzLAorCWRtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDgsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTBfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTFfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTNfQ0ZHMCwgMywKKwlkbWljX211eF90ZXh0KTsKKworCitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAwLAorCWFtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCwgMCwKKwlhbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfYW1pY19tdXgyLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAwLAorCWFtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDQsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgMCwKKwlhbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfYW1pY19tdXg1LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4NiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwLCAwLAorCWFtaWNfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDcsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgMCwKKwlhbWljX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0odHhfYW1pY19tdXg4LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTAsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTMsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsIDAsCisJYW1pY19tdXhfdGV4dCk7CisKK1dDRF9EQVBNX0VOVU0odHhfYW1pYzRfNSwgV0NEOTM0WF9UWF9ORVdfQU1JQ180XzVfU0VMLCA3LCBhbWljNF81X3NlbF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgwLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDAsCisJY2RjX2lmX3R4MF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDEsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgMiwKKwljZGNfaWZfdHgxX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3R4MiwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLCA0LAorCWNkY19pZl90eDJfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgzLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDYsCisJY2RjX2lmX3R4M19tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDQsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgMCwKKwljZGNfaWZfdHg0X211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3R4NSwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxLCAyLAorCWNkY19pZl90eDVfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShjZGNfaWZfdHg2LCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsIDQsCisJY2RjX2lmX3R4Nl9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDcsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgNiwKKwljZGNfaWZfdHg3X211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3R4OCwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAwLAorCWNkY19pZl90eDhfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShjZGNfaWZfdHg5LCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDIsCisJY2RjX2lmX3R4OV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDEwLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDQsCisJY2RjX2lmX3R4MTBfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgxMV9pbnAxLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMsIDAsCisJY2RjX2lmX3R4MTFfaW5wMV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDExLCBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgMCwKKwljZGNfaWZfdHgxMV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGNkY19pZl90eDEzX2lucDEsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMywgNCwKKwljZGNfaWZfdHgxM19pbnAxX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oY2RjX2lmX3R4MTMsIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLCAwLAorCWNkY19pZl90eDEzX211eF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShyeF9taXhfdHgwLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCAwLAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHgxLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCA0LAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHgyLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxLCAwLAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHgzLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxLCA0LAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHg0LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyLCAwLAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHg1LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyLCA0LAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHg2LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCAwLAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHg3LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCA0LAorCXJ4X2VjaG9fbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShyeF9taXhfdHg4LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkc0LCAwLAorCXJ4X2VjaG9fbXV4X3RleHQpOworCitXQ0RfREFQTV9FTlVNKGlpcjBfaW5wMCwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMCwgMCwKKwlpaXJfaW5wX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oaWlyMF9pbnAxLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcxLCAwLAorCWlpcl9pbnBfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShpaXIwX2lucDIsIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIsIDAsCisJaWlyX2lucF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGlpcjBfaW5wMywgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMywgMCwKKwlpaXJfaW5wX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oaWlyMV9pbnAwLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcwLCAwLAorCWlpcl9pbnBfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShpaXIxX2lucDEsIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEsIDAsCisJaWlyX2lucF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGlpcjFfaW5wMiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMiwgMCwKKwlpaXJfaW5wX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oaWlyMV9pbnAzLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkczLCAwLAorCWlpcl9pbnBfbXV4X3RleHQpOworCitXQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50MF8xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50MV8xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50Ml8xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50M18xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50NF8xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50N18xX2ludGVycF9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50OF8xX2ludGVycF9tdXhfdGV4dCk7CisKK1dDRF9EQVBNX0VOVU0ocnhfaW50MF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQwXzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50MV8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQxXzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50Ml8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQyXzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50M18yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQzXzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50NF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ0XzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50N18yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ3XzJfaW50ZXJwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0ocnhfaW50OF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ4XzJfaW50ZXJwX211eF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShtYWRfc2VsLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAwLAorCW1hZF9zZWxfdHh0KTsKKworV0NEX0RBUE1fRU5VTShtYWRfaW5wX211eCwgV0NEOTM0WF9DUEVfU1NfU1ZBX0NGRywgMiwKKwltYWRfaW5wX211eF90eHQpOworCitXQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQwX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsIDAsCisJcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCisJdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQxX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDAsCisJcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCisJdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQyX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzAsIDAsCisJcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCisJdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7CisKK1dDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXgwLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEsIDAsCisJYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgMCwKKwlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4MiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxLCAwLAorCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKK1dDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXgzLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzEsIDAsCisJYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDQsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgMiwKKwlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4NSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxLCAyLAorCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKK1dDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXg2LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEsIDIsCisJYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOworV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDcsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgMiwKKwlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7CitXQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4OCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxLCA0LAorCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKKworV0NEX0RBUE1fRU5VTShhc3JjMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwLCAwLAorCWFzcmMwX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oYXNyYzEsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCwgMiwKKwlhc3JjMV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGFzcmMyLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NQTElORV9BU1JDX0NGRzAsIDQsCisJYXNyYzJfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShhc3JjMywgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwLCA2LAorCWFzcmMzX211eF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShpbnQxXzFfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGludDJfMV9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oaW50M18xX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShpbnQ0XzFfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7CisKK1dDRF9EQVBNX0VOVU0oaW50MV8yX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShpbnQyXzJfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGludDNfMl9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oaW50NF8yX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOworV0NEX0RBUE1fRU5VTShpbnQ3XzJfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7CitXQ0RfREFQTV9FTlVNKGludDhfMl9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKKworV0NEX0RBUE1fRU5VTShhbmMwX2ZiLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0FOQ19DRkcwLCAwLCBhbmMwX2ZiX211eF90ZXh0KTsKK1dDRF9EQVBNX0VOVU0oYW5jMV9mYiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCwgMywgYW5jMV9mYl9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmNfZWFyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2Vhcl9zcGtyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX3Nwa3JfcGFfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYWRfY3BlMV9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1hZF9jcGUyX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWFkX2JyZGNzdF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXgwX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDFfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4Ml9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXgzX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDRfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4NV9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg2X3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDdfc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4OF9zd2l0Y2ggPQorCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfYXNyY19zd2l0Y2hbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkhQSEwgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQyX2FzcmNfc3dpdGNoW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJIUEhSIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50M19hc3JjX3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE8xIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NF9hc3JjX3N3aXRjaFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTE8yIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCksCit9OworCitzdGF0aWMgaW50IHRhdmlsX2RzZF9taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KKwkJCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOworCWludCB2YWw7CisKKwl2YWwgPSB0YXZpbF9kc2RfZ2V0X2N1cnJlbnRfbWl4ZXJfdmFsdWUoZHNkX2NvbmYsIG1jLT5zaGlmdCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICgodmFsIDwgMCkgPyAwIDogdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX2RzZF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQorCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHd2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOworCisJaWYgKCFkc2RfY29uZikKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7CisKKwl0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3QoZHNkX2NvbmYsIG1jLT5zaGlmdCk7CisJdGF2aWxfZHNkX3NldF9taXhlcl92YWx1ZShkc2RfY29uZiwgbWMtPnNoaWZ0LCB3dmFsKTsKKworCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIoZGFwbSwga2NvbnRyb2wsIHd2YWwsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGhsX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkRTRCBIUEhMIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsIDEsIDAsCisJCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGhyX21peGVyW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkRTRCBIUEhSIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSFIsIDEsIDAsCisJCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0YXZpbF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjEgUEIiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGMV9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjIgUEIiLCAiQUlGMiBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGMl9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjMgUEIiLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGM19QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjQgUEIiLCAiQUlGNCBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGNF9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVdDRF9EQVBNX01VWCgiU0xJTSBSWDAgTVVYIiwgV0NEOTM0WF9SWDAsIHNsaW1fcngwKSwKKwlXQ0RfREFQTV9NVVgoIlNMSU0gUlgxIE1VWCIsIFdDRDkzNFhfUlgxLCBzbGltX3J4MSksCisJV0NEX0RBUE1fTVVYKCJTTElNIFJYMiBNVVgiLCBXQ0Q5MzRYX1JYMiwgc2xpbV9yeDIpLAorCVdDRF9EQVBNX01VWCgiU0xJTSBSWDMgTVVYIiwgV0NEOTM0WF9SWDMsIHNsaW1fcngzKSwKKwlXQ0RfREFQTV9NVVgoIlNMSU0gUlg0IE1VWCIsIFdDRDkzNFhfUlg0LCBzbGltX3J4NCksCisJV0NEX0RBUE1fTVVYKCJTTElNIFJYNSBNVVgiLCBXQ0Q5MzRYX1JYNSwgc2xpbV9yeDUpLAorCVdDRF9EQVBNX01VWCgiU0xJTSBSWDYgTVVYIiwgV0NEOTM0WF9SWDYsIHNsaW1fcng2KSwKKwlXQ0RfREFQTV9NVVgoIlNMSU0gUlg3IE1VWCIsIFdDRDkzNFhfUlg3LCBzbGltX3J4NyksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgwIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgzIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg1IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg2IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYMCBNVVgiLCBXQ0Q5MzRYX1JYMCwgY2RjX2lmX3J4MCksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgUlgxIE1VWCIsIFdDRDkzNFhfUlgxLCBjZGNfaWZfcngxKSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBSWDIgTVVYIiwgV0NEOTM0WF9SWDIsIGNkY19pZl9yeDIpLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYMyBNVVgiLCBXQ0Q5MzRYX1JYMywgY2RjX2lmX3J4MyksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgUlg0IE1VWCIsIFdDRDkzNFhfUlg0LCBjZGNfaWZfcng0KSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBSWDUgTVVYIiwgV0NEOTM0WF9SWDUsIGNkY19pZl9yeDUpLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYNiBNVVgiLCBXQ0Q5MzRYX1JYNiwgY2RjX2lmX3J4NiksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgUlg3IE1VWCIsIFdDRDkzNFhfUlg3LCBjZGNfaWZfcng3KSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMF8yIE1VWCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0VBUiwgMCwKKwkJJnJ4X2ludDBfMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMV8yIE1VWCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsIDAsCisJCSZyeF9pbnQxXzJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWl4X3BhdGgsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDJfMiBNVVgiLCBTTkRfU09DX05PUE0sIElOVEVSUF9IUEhSLCAwLAorCQkmcnhfaW50Ml8yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8xLCAwLAorCQkmcnhfaW50M18yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ0XzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8yLCAwLAorCQkmcnhfaW50NF8yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfU1BLUjEsIDAsCisJCSZyeF9pbnQ3XzJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWl4X3BhdGgsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMiBNVVgiLCBTTkRfU09DX05PUE0sIElOVEVSUF9TUEtSMiwgMCwKKwkJJnJ4X2ludDhfMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50MF8xX21peF9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDBfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQwXzFfbWl4X2lucDEpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UMF8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDBfMV9taXhfaW5wMiksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50MV8xX21peF9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQxXzFfbWl4X2lucDEpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UMV8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDFfMV9taXhfaW5wMiksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50Ml8xX21peF9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDJfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQyXzFfbWl4X2lucDEpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UMl8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDJfMV9taXhfaW5wMiksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50M18xX21peF9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDNfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQzXzFfbWl4X2lucDEpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UM18xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDNfMV9taXhfaW5wMiksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50NF8xX21peF9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQ0XzFfbWl4X2lucDEpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UNF8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDRfMV9taXhfaW5wMiksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDdfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ3XzFfbWl4X2lucDBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfc3dyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50N18xX21peF9pbnAxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3N3ciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDdfMV9taXhfaW5wMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9zd3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZyeF9pbnQ4XzFfbWl4X2lucDBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfc3dyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnhfaW50OF8xX21peF9pbnAxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3N3ciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UOF8xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnJ4X2ludDhfMV9taXhfaW5wMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9zd3IsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDFfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnhfaW50MV9hc3JjX3N3aXRjaCwgQVJSQVlfU0laRShyeF9pbnQxX2FzcmNfc3dpdGNoKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyXzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ4X2ludDJfYXNyY19zd2l0Y2gsIEFSUkFZX1NJWkUocnhfaW50Ml9hc3JjX3N3aXRjaCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UM18xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlyeF9pbnQzX2FzcmNfc3dpdGNoLCBBUlJBWV9TSVpFKHJ4X2ludDNfYXNyY19zd2l0Y2gpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDRfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnhfaW50NF9hc3JjX3N3aXRjaCwgQVJSQVlfU0laRShyeF9pbnQ0X2FzcmNfc3dpdGNoKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQxIE1JWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIGhwaGxfbWl4ZXIsCisJCQkgICBBUlJBWV9TSVpFKGhwaGxfbWl4ZXIpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDIgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIE1JWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIGhwaHJfbWl4ZXIsCisJCQkgICBBUlJBWV9TSVpFKGhwaHJfbWl4ZXIpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDMgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ0IE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJTlVMTCwgMCwgdGF2aWxfY29kZWNfc3BrX2Jvb3N0X2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDggQ0hBSU4iLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCU5VTEwsIDAsIHRhdmlsX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQwIE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfRUFSLAorCQkwLCAmcnhfaW50MF9taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMSBNSVgyIElOUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsCisJCTAsICZyeF9pbnQxX21peDJfaW5wX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3J4X3BhdGhfY2xrLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQyIE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBIUiwKKwkJMCwgJnJ4X2ludDJfbWl4Ml9pbnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfcnhfcGF0aF9jbGssCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDMgTUlYMiBJTlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzEsCisJCTAsICZyeF9pbnQzX21peDJfaW5wX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3J4X3BhdGhfY2xrLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ0IE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8yLAorCQkwLCAmcnhfaW50NF9taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNyBNSVgyIElOUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX1NQS1IxLAorCQkwLCAmcnhfaW50N19taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgwIE1VWCIsIFdDRDkzNFhfVFgwLCBjZGNfaWZfdHgwKSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEgTVVYIiwgV0NEOTM0WF9UWDEsIGNkY19pZl90eDEpLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYMiBNVVgiLCBXQ0Q5MzRYX1RYMiwgY2RjX2lmX3R4MiksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgzIE1VWCIsIFdDRDkzNFhfVFgzLCBjZGNfaWZfdHgzKSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDQgTVVYIiwgV0NEOTM0WF9UWDQsIGNkY19pZl90eDQpLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYNSBNVVgiLCBXQ0Q5MzRYX1RYNSwgY2RjX2lmX3R4NSksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFg2IE1VWCIsIFdDRDkzNFhfVFg2LCBjZGNfaWZfdHg2KSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDcgTVVYIiwgV0NEOTM0WF9UWDcsIGNkY19pZl90eDcpLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYOCBNVVgiLCBXQ0Q5MzRYX1RYOCwgY2RjX2lmX3R4OCksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFg5IE1VWCIsIFdDRDkzNFhfVFg5LCBjZGNfaWZfdHg5KSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEwIE1VWCIsIFdDRDkzNFhfVFgxMCwgY2RjX2lmX3R4MTApLAorCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYMTEgTVVYIiwgV0NEOTM0WF9UWDExLCBjZGNfaWZfdHgxMSksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgxMSBJTlAxIE1VWCIsIFdDRDkzNFhfVFgxMSwgY2RjX2lmX3R4MTFfaW5wMSksCisJV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgxMyBNVVgiLCBXQ0Q5MzRYX1RYMTMsIGNkY19pZl90eDEzKSwKKwlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEzIElOUDEgTVVYIiwgV0NEOTM0WF9UWDEzLCBjZGNfaWZfdHgxM19pbnAxKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDAiLCBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwsIDUsIDAsCisJCSZ0eF9hZGNfbXV4MF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMSIsIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NUTCwgNSwgMCwKKwkJJnR4X2FkY19tdXgxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgyIiwgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkmdHhfYWRjX211eDJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDMiLCBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DVEwsIDUsIDAsCisJCSZ0eF9hZGNfbXV4M19tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNCIsIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NUTCwgNSwgMCwKKwkJJnR4X2FkY19tdXg0X211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg1IiwgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkmdHhfYWRjX211eDVfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDYiLCBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DVEwsIDUsIDAsCisJCSZ0eF9hZGNfbXV4Nl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNyIsIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NUTCwgNSwgMCwKKwkJJnR4X2FkY19tdXg3X211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg4IiwgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ1RMLCA1LCAwLAorCQkmdHhfYWRjX211eDhfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEwIiwgU05EX1NPQ19OT1BNLCAxMCwgMCwgJnR4X2FkY19tdXgxMF9tdXgsCisJCXRhdmlsX2NvZGVjX3R4X2FkY19jZmcsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgxMSIsIFNORF9TT0NfTk9QTSwgMTEsIDAsICZ0eF9hZGNfbXV4MTFfbXV4LAorCQl0YXZpbF9jb2RlY190eF9hZGNfY2ZnLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTIiLCBTTkRfU09DX05PUE0sIDEyLCAwLCAmdHhfYWRjX211eDEyX211eCwKKwkJdGF2aWxfY29kZWNfdHhfYWRjX2NmZywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEzIiwgU05EX1NPQ19OT1BNLCAxMywgMCwgJnR4X2FkY19tdXgxM19tdXgsCisJCXRhdmlsX2NvZGVjX3R4X2FkY19jZmcsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMCIsIDAsIHR4X2RtaWNfbXV4MCksCisJV0NEX0RBUE1fTVVYKCJETUlDIE1VWDEiLCAwLCB0eF9kbWljX211eDEpLAorCVdDRF9EQVBNX01VWCgiRE1JQyBNVVgyIiwgMCwgdHhfZG1pY19tdXgyKSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMyIsIDAsIHR4X2RtaWNfbXV4MyksCisJV0NEX0RBUE1fTVVYKCJETUlDIE1VWDQiLCAwLCB0eF9kbWljX211eDQpLAorCVdDRF9EQVBNX01VWCgiRE1JQyBNVVg1IiwgMCwgdHhfZG1pY19tdXg1KSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYNiIsIDAsIHR4X2RtaWNfbXV4NiksCisJV0NEX0RBUE1fTVVYKCJETUlDIE1VWDciLCAwLCB0eF9kbWljX211eDcpLAorCVdDRF9EQVBNX01VWCgiRE1JQyBNVVg4IiwgMCwgdHhfZG1pY19tdXg4KSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTAiLCAwLCB0eF9kbWljX211eDEwKSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTEiLCAwLCB0eF9kbWljX211eDExKSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTIiLCAwLCB0eF9kbWljX211eDEyKSwKKwlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTMiLCAwLCB0eF9kbWljX211eDEzKSwKKworCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgwIiwgMCwgdHhfYW1pY19tdXgwKSwKKwlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYMSIsIDAsIHR4X2FtaWNfbXV4MSksCisJV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDIiLCAwLCB0eF9hbWljX211eDIpLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgzIiwgMCwgdHhfYW1pY19tdXgzKSwKKwlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYNCIsIDAsIHR4X2FtaWNfbXV4NCksCisJV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDUiLCAwLCB0eF9hbWljX211eDUpLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVg2IiwgMCwgdHhfYW1pY19tdXg2KSwKKwlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYNyIsIDAsIHR4X2FtaWNfbXV4NyksCisJV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDgiLCAwLCB0eF9hbWljX211eDgpLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMCIsIDAsIHR4X2FtaWNfbXV4MTApLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMSIsIDAsIHR4X2FtaWNfbXV4MTEpLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMiIsIDAsIHR4X2FtaWNfbXV4MTIpLAorCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMyIsIDAsIHR4X2FtaWNfbXV4MTMpLAorCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMxIiwgTlVMTCwgV0NEOTM0WF9BTkFfQU1JQzEsIDcsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9hZGMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzIiLCBOVUxMLCBXQ0Q5MzRYX0FOQV9BTUlDMiwgNywgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9BRENfRSgiQURDMyIsIE5VTEwsIFdDRDkzNFhfQU5BX0FNSUMzLCA3LCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSksCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREM0IiwgTlVMTCwgV0NEOTM0WF9BTkFfQU1JQzQsIDcsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9hZGMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKKworCVdDRF9EQVBNX01VWCgiQU1JQzRfNSBTRUwiLCAwLCB0eF9hbWljNF81KSwKKworCVdDRF9EQVBNX01VWCgiQU5DMCBGQiBNVVgiLCAwLCBhbmMwX2ZiKSwKKwlXQ0RfREFQTV9NVVgoIkFOQzEgRkIgTVVYIiwgMCwgYW5jMV9mYiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMxIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDMiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUM0IiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDNSIpLAorCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzMiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9taWNiaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVM0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJLyoKKwkgKiBOb3Qgc3VwcGx5IHdpZGdldCwgdGhpcyBpcyB1c2VkIHRvIHJlY292ZXIgSFBIIHJlZ2lzdGVycy4KKwkgKiBJdCBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBvdGhlciB3aWRnZXRzCisJICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUkVTRVRfSFBIX1JFR0lTVEVSUyIsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgdGF2aWxfY29kZWNfcmVzZXRfaHBoX3JlZ2lzdGVycywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBU19FKERBUE1fTUlDQklBUzJfU1RBTkRBTE9ORSwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoREFQTV9NSUNCSUFTM19TVEFOREFMT05FLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhdmlsX2NvZGVjX2ZvcmNlX2VuYWJsZV9taWNiaWFzLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjEgQ0FQIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKKwkJQUlGMV9DQVAsIDAsIHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdHgsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMiBDQVAiLCAiQUlGMiBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAorCQlBSUYyX0NBUCwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW10eCwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUYzIENBUCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCisJCUFJRjNfQ0FQLCAwLCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXR4LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGMV9DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjFfQ0FQLCAwLAorCQlhaWYxX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYxX2NhcF9taXhlcikpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGMl9DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjJfQ0FQLCAwLAorCQlhaWYyX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYyX2NhcF9taXhlcikpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGM19DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjNfQ0FQLCAwLAorCQlhaWYzX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYzX2NhcF9taXhlcikpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9NQUQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjRfTUFEX1RYLCAwLAorCQlhaWY0X21hZF9taXhlciwgQVJSQVlfU0laRShhaWY0X21hZF9taXhlcikpLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGNCBWSSIsICJWSWZlZWQiLCAwLCBTTkRfU09DX05PUE0sCisJCUFJRjRfVklGRUVELCAwLCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrLAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjQgTUFEIiwgIkFJRjQgTUFEIFRYIiwgMCwKKwkJU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9WSSBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9WSUZFRUQsIDAsCisJCWFpZjRfdmlfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmNF92aV9taXhlcikpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiVklJTlBVVCIpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYOCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwkvKiBEaWdpdGFsIE1pYyBJbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMwIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfZG1pYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzEiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9kbWljLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2RtaWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMzIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfZG1pYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzQiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9kbWljLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDNSIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2RtaWMsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVdDRF9EQVBNX01VWCgiSUlSMCBJTlAwIE1VWCIsIDAsIGlpcjBfaW5wMCksCisJV0NEX0RBUE1fTVVYKCJJSVIwIElOUDEgTVVYIiwgMCwgaWlyMF9pbnAxKSwKKwlXQ0RfREFQTV9NVVgoIklJUjAgSU5QMiBNVVgiLCAwLCBpaXIwX2lucDIpLAorCVdDRF9EQVBNX01VWCgiSUlSMCBJTlAzIE1VWCIsIDAsIGlpcjBfaW5wMyksCisJV0NEX0RBUE1fTVVYKCJJSVIxIElOUDAgTVVYIiwgMCwgaWlyMV9pbnAwKSwKKwlXQ0RfREFQTV9NVVgoIklJUjEgSU5QMSBNVVgiLCAwLCBpaXIxX2lucDEpLAorCVdDRF9EQVBNX01VWCgiSUlSMSBJTlAyIE1VWCIsIDAsIGlpcjFfaW5wMiksCisJV0NEX0RBUE1fTVVYKCJJSVIxIElOUDMgTVVYIiwgMCwgaWlyMV9pbnAzKSwKKworCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIwIiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwsCisJCTQsIDAsIE5VTEwsIDAsIHRhdmlsX2NvZGVjX3NldF9paXJfZ2FpbiwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIxIiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsCisJCTQsIDAsIE5VTEwsIDAsIHRhdmlsX2NvZGVjX3NldF9paXJfZ2FpbiwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1JDMCIsIFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMLAorCQk0LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNSQzEiLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwKKwkJNCwgMCwgTlVMTCwgMCksCisKKwlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDAgTVVYIiwgMCwgcnhfbWl4X3R4MCksCisJV0NEX0RBUE1fTVVYKCJSWCBNSVggVFgxIE1VWCIsIDAsIHJ4X21peF90eDEpLAorCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYMiBNVVgiLCAwLCByeF9taXhfdHgyKSwKKwlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDMgTVVYIiwgMCwgcnhfbWl4X3R4MyksCisJV0NEX0RBUE1fTVVYKCJSWCBNSVggVFg0IE1VWCIsIDAsIHJ4X21peF90eDQpLAorCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYNSBNVVgiLCAwLCByeF9taXhfdHg1KSwKKwlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDYgTVVYIiwgMCwgcnhfbWl4X3R4NiksCisJV0NEX0RBUE1fTVVYKCJSWCBNSVggVFg3IE1VWCIsIDAsIHJ4X21peF90eDcpLAorCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYOCBNVVgiLCAwLCByeF9taXhfdHg4KSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDAgREVNIE1VWCIsIDAsIHJ4X2ludDBfZGVtX2lucCksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQxIERFTSBNVVgiLCAwLCByeF9pbnQxX2RlbV9pbnApLAorCVdDRF9EQVBNX01VWCgiUlggSU5UMiBERU0gTVVYIiwgMCwgcnhfaW50Ml9kZW1faW5wKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMF8xIElOVEVSUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0VBUiwgMCwKKwkJJnJ4X2ludDBfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQxXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBITCwgMCwKKwkJJnJ4X2ludDFfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQyXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBIUiwgMCwKKwkJJnJ4X2ludDJfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8xLCAwLAorCQkmcnhfaW50M18xX2ludGVycF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9tYWluX3BhdGgsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDRfMSBJTlRFUlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzIsIDAsCisJCSZyeF9pbnQ0XzFfaW50ZXJwX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21haW5fcGF0aCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIElOVEVSUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX1NQS1IxLCAwLAorCQkmcnhfaW50N18xX2ludGVycF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9tYWluX3BhdGgsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBJTlRFUlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9TUEtSMiwgMCwKKwkJJnJ4X2ludDhfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDBfMiBJTlRFUlAiLCAwLCByeF9pbnQwXzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMiBJTlRFUlAiLCAwLCByeF9pbnQxXzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDJfMiBJTlRFUlAiLCAwLCByeF9pbnQyXzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDNfMiBJTlRFUlAiLCAwLCByeF9pbnQzXzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMiBJTlRFUlAiLCAwLCByeF9pbnQ0XzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDdfMiBJTlRFUlAiLCAwLCByeF9pbnQ3XzJfaW50ZXJwKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDhfMiBJTlRFUlAiLCAwLCByeF9pbnQ4XzJfaW50ZXJwKSwKKworCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgwIiwgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJMCwgJmFkY191c19tdXgwX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDEiLCBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkwLCAmYWRjX3VzX211eDFfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYMiIsIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCTAsICZhZGNfdXNfbXV4Ml9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgzIiwgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJMCwgJmFkY191c19tdXgzX3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDQiLCBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkwLCAmYWRjX3VzX211eDRfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNSIsIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCTAsICZhZGNfdXNfbXV4NV9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVg2IiwgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCwgMCwKKwkJMCwgJmFkY191c19tdXg2X3N3aXRjaCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDciLCBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF8xOTJfQ1RMLCAwLAorCQkwLCAmYWRjX3VzX211eDdfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYOCIsIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwsIDAsCisJCTAsICZhZGNfdXNfbXV4OF9zd2l0Y2gpLAorCisJLyogTUFEIHJlbGF0ZWQgd2lkZ2V0cyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiTUFEX0NQRV9JTlBVVCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUFESU5QVVQiKSwKKworCVdDRF9EQVBNX01VWCgiTUFEX1NFTCBNVVgiLCAwLCBtYWRfc2VsKSwKKwlXQ0RfREFQTV9NVVgoIk1BRF9JTlAgTVVYIiwgMCwgbWFkX2lucF9tdXgpLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQlJPQURDQVNUIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICAgJm1hZF9icmRjc3Rfc3dpdGNoLCB0YXZpbF9jb2RlY19hcGVfZW5hYmxlX21hZCwKKwkJCSAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQ1BFMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICZtYWRfY3BlMV9zd2l0Y2gsIHRhdmlsX2NvZGVjX2NwZV9tYWRfY3RsLAorCQkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisJU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQ1BFMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgICZtYWRfY3BlMl9zd2l0Y2gsIHRhdmlsX2NvZGVjX2NwZV9tYWRfY3RsLAorCQkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNQURfQ1BFX09VVDEiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNQURfQ1BFX09VVDIiKSwKKworCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMCBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIHRhdmlsX2NvZGVjX2Vhcl9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMSBEQUMiLCBOVUxMLCBXQ0Q5MzRYX0FOQV9IUEgsCisJCTUsIDAsIHRhdmlsX2NvZGVjX2hwaGxfZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDIgREFDIiwgTlVMTCwgV0NEOTM0WF9BTkFfSFBILAorCQk0LCAwLCB0YXZpbF9jb2RlY19ocGhyX2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQzIERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgdGF2aWxfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDQgREFDIiwgTlVMTCwgU05EX1NPQ19OT1BNLAorCQkwLCAwLCB0YXZpbF9jb2RlY19saW5lb3V0X2RhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1BHQV9FKCJFQVIgUEEiLCBXQ0Q5MzRYX0FOQV9FQVIsIDcsIDAsIE5VTEwsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9lYXJfcGEsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhMIFBBIiwgV0NEOTM0WF9BTkFfSFBILCA3LCAwLCBOVUxMLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfaHBobF9wYSwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhSIFBBIiwgV0NEOTM0WF9BTkFfSFBILCA2LCAwLCBOVUxMLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfaHBocl9wYSwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1BHQV9FKCJMSU5FT1VUMSBQQSIsIFdDRDkzNFhfQU5BX0xPXzFfMiwgNywgMCwgTlVMTCwgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQyIFBBIiwgV0NEOTM0WF9BTkFfTE9fMV8yLCA2LCAwLCBOVUxMLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfbGluZW91dF9wYSwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIEVBUiBQQSIsIFdDRDkzNFhfQU5BX0VBUiwgNywgMCwgTlVMTCwgMCwKKwkJdGF2aWxfY29kZWNfZW5hYmxlX2Vhcl9wYSwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIFNQSzEgUEEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDAsCisJCXRhdmlsX2NvZGVjX2VuYWJsZV9zcGtyX2FuYywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBITCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQSFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQyIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMSBPVVQiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEsyIE9VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBFQVIiKSwKKworCVNORF9TT0NfREFQTV9TV0lUQ0goIkFOQyBPVVQgRUFSIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmFuY19lYXJfc3dpdGNoKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmFuY19lYXJfc3Brcl9zd2l0Y2gpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFOQyBTUEtSIFBBIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmFuY19zcGtyX3BhX3N3aXRjaCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9CSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl0YXZpbF9jb2RlY19lbmFibGVfcnhfYmlhcywKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUlggSU5UMSBOQVRJVkUgU1VQUExZIiwgU05EX1NPQ19OT1BNLAorCQlJTlRFUlBfSFBITCwgMCwgdGF2aWxfZW5hYmxlX25hdGl2ZV9zdXBwbHksCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDIgTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKKwkJSU5URVJQX0hQSFIsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQzIE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCisJCUlOVEVSUF9MTzEsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ0IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCisJCUlOVEVSUF9MTzIsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ3IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCisJCUlOVEVSUF9TUEtSMSwgMCwgdGF2aWxfZW5hYmxlX25hdGl2ZV9zdXBwbHksCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDggTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKKwkJSU5URVJQX1NQS1IyLCAwLCB0YXZpbF9lbmFibGVfbmF0aXZlX3N1cHBseSwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMSBOQVRJVkUgTVVYIiwgMCwgaW50MV8xX25hdGl2ZSksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsIDAsIGludDJfMV9uYXRpdmUpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UM18xIE5BVElWRSBNVVgiLCAwLCBpbnQzXzFfbmF0aXZlKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMSBOQVRJVkUgTVVYIiwgMCwgaW50NF8xX25hdGl2ZSksCisKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMiBOQVRJVkUgTVVYIiwgMCwgaW50MV8yX25hdGl2ZSksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzIgTkFUSVZFIE1VWCIsIDAsIGludDJfMl9uYXRpdmUpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UM18yIE5BVElWRSBNVVgiLCAwLCBpbnQzXzJfbmF0aXZlKSwKKwlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMiBOQVRJVkUgTVVYIiwgMCwgaW50NF8yX25hdGl2ZSksCisJV0NEX0RBUE1fTVVYKCJSWCBJTlQ3XzIgTkFUSVZFIE1VWCIsIDAsIGludDdfMl9uYXRpdmUpLAorCVdDRF9EQVBNX01VWCgiUlggSU5UOF8yIE5BVElWRSBNVVgiLCAwLCBpbnQ4XzJfbmF0aXZlKSwKKworCVNORF9TT0NfREFQTV9NVVhfRSgiQVNSQzAgTVVYIiwgU05EX1NPQ19OT1BNLCBBU1JDMCwgMCwKKwkJJmFzcmMwX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2FzcmNfcmVzYW1wbGVyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX01VWF9FKCJBU1JDMSBNVVgiLCBTTkRfU09DX05PUE0sIEFTUkMxLCAwLAorCQkmYXNyYzFfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfYXNyY19yZXNhbXBsZXIsCisJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fTVVYX0UoIkFTUkMyIE1VWCIsIFNORF9TT0NfTk9QTSwgQVNSQzIsIDAsCisJCSZhc3JjMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9hc3JjX3Jlc2FtcGxlciwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NVVhfRSgiQVNSQzMgTVVYIiwgU05EX1NPQ19OT1BNLCBBU1JDMywgMCwKKwkJJmFzcmMzX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2FzcmNfcmVzYW1wbGVyLAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCit9OworCitzdGF0aWMgaW50IHRhdmlsX2dldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgdW5zaWduZWQgaW50ICp0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKKwkJCQkgdW5zaWduZWQgaW50ICpyeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOworCXUzMiBpID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIEFJRjFfUEI6CisJY2FzZSBBSUYyX1BCOgorCWNhc2UgQUlGM19QQjoKKwljYXNlIEFJRjRfUEI6CisJCWlmICghcnhfc2xvdCB8fCAhcnhfbnVtKSB7CisJCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogSW52YWxpZCByeF9zbG90IDB4JXBLIG9yIHJ4X251bSAweCVwS1xuIiwKKwkJCQkgX19mdW5jX18sIHJ4X3Nsb3QsIHJ4X251bSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRhdmlsLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LAorCQkJCSAgICBsaXN0KSB7CisJCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogc2xvdF9udW0gJXUgY2gtPmNoX251bSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGksIGNoLT5jaF9udW0pOworCQkJcnhfc2xvdFtpKytdID0gY2gtPmNoX251bTsKKwkJfQorCQkqcnhfbnVtID0gaTsKKwkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IGRhaV9uYW1lID0gJXMgZGFpX2lkID0gJXggIHJ4X251bSA9ICVkXG4iLAorCQkJX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCwgaSk7CisJCWlmICgqcnhfbnVtID09IDApIHsKKwkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBDaGFubmVsIGxpc3QgZW1wdHkgZm9yIGRhaV9uYW1lID0gJXMgZGFpX2lkID0gJXhcbiIsCisJCQkJX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgQUlGMV9DQVA6CisJY2FzZSBBSUYyX0NBUDoKKwljYXNlIEFJRjNfQ0FQOgorCWNhc2UgQUlGNF9NQURfVFg6CisJY2FzZSBBSUY0X1ZJRkVFRDoKKwkJaWYgKCF0eF9zbG90IHx8ICF0eF9udW0pIHsKKwkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIHR4X3Nsb3QgMHglcEsgb3IgdHhfbnVtIDB4JXBLXG4iLAorCQkJCSBfX2Z1bmNfXywgdHhfc2xvdCwgdHhfbnVtKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGF2aWwtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBzbG90X251bSAldSBjaC0+Y2hfbnVtICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgaSwgIGNoLT5jaF9udW0pOworCQkJdHhfc2xvdFtpKytdID0gY2gtPmNoX251bTsKKwkJfQorCQkqdHhfbnVtID0gaTsKKwkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IGRhaV9uYW1lID0gJXMgZGFpX2lkID0gJXggIHR4X251bSA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQsIGkpOworCQlpZiAoKnR4X251bSA9PSAwKSB7CisJCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogQ2hhbm5lbCBsaXN0IGVtcHR5IGZvciBkYWlfbmFtZSA9ICVzIGRhaV9pZCA9ICV4XG4iLAorCQkJCSBfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IEludmFsaWQgREFJIElEICV4XG4iLAorCQkJX19mdW5jX18sIGRhaS0+aWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCQkJCSB1bnNpZ25lZCBpbnQgcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlOworCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWlfZGF0YSA9IE5VTEw7CisKKwl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoIXR4X3Nsb3QgfHwgIXJ4X3Nsb3QpIHsKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IEludmFsaWQgdHhfc2xvdCAweCVwSywgcnhfc2xvdCAweCVwS1xuIiwKKwkJCV9fZnVuY19fLCB0eF9zbG90LCByeF9zbG90KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9kYmcodGF2aWwtPmRldiwgIiVzKCk6IGRhaV9uYW1lID0gJXMgREFJLUlEICV4IHR4X2NoICVkIHJ4X2NoICVkXG4iLAorCQkgX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCwgdHhfbnVtLCByeF9udW0pOworCisJd2NkOXh4eF9pbml0X3NsaW1zbGF2ZShjb3JlLCBjb3JlLT5zbGltLT5sYWRkciwKKwkJCQl0eF9udW0sIHR4X3Nsb3QsIHJ4X251bSwgcnhfc2xvdCk7CisJLyogUmVzZXJ2ZSBUWDEzIGZvciBNQUQgZGF0YSBjaGFubmVsICovCisJZGFpX2RhdGEgPSAmdGF2aWwtPmRhaVtBSUY0X01BRF9UWF07CisJaWYgKGRhaV9kYXRhKQorCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDEzXS5saXN0LAorCQkJICAgICAgJmRhaV9kYXRhLT53Y2Q5eHh4X2NoX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfc2V0X2RlY2ltYXRvcl9yYXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJCSAgICB1MzIgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdTMyIHR4X3BvcnQgPSAwLCB0eF9mc19yYXRlID0gMDsKKwl1OCBzaGlmdCA9IDAsIHNoaWZ0X3ZhbCA9IDAsIHR4X211eF9zZWwgPSAwOworCWludCBkZWNpbWF0b3IgPSAtMTsKKwl1MTYgdHhfcG9ydF9yZWcgPSAwLCB0eF9mc19yZWcgPSAwOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgODAwMDoKKwkJdHhfZnNfcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMTYwMDA6CisJCXR4X2ZzX3JhdGUgPSAxOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQl0eF9mc19yYXRlID0gMzsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJdHhfZnNfcmF0ZSA9IDQ7CisJCWJyZWFrOworCWNhc2UgOTYwMDA6CisJCXR4X2ZzX3JhdGUgPSA1OworCQlicmVhazsKKwljYXNlIDE5MjAwMDoKKwkJdHhfZnNfcmF0ZSA9IDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIFRYIHNhbXBsZSByYXRlOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzYW1wbGVfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCisJfTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXZpbC0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQl0eF9wb3J0ID0gY2gtPnBvcnQ7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkYWktPmlkID0gJWQsIHR4X3BvcnQgPSAlZCIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCwgdHhfcG9ydCk7CisKKwkJaWYgKCh0eF9wb3J0IDwgMCkgfHwgKHR4X3BvcnQgPT0gMTIpIHx8ICh0eF9wb3J0ID49IDE0KSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgU0xJTSBUWCV1IHBvcnQuIERBSSBJRDogJWRcbiIsCisJCQkJX19mdW5jX18sIHR4X3BvcnQsIGRhaS0+aWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogRmluZCB0aGUgU0IgVFggTVVYIGlucHV0IC0gd2hpY2ggZGVjaW1hdG9yIGlzIGNvbm5lY3RlZCAqLworCQlpZiAodHhfcG9ydCA8IDQpIHsKKwkJCXR4X3BvcnRfcmVnID0gV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwOworCQkJc2hpZnQgPSAodHhfcG9ydCA8PCAxKTsKKwkJCXNoaWZ0X3ZhbCA9IDB4MDM7CisJCX0gZWxzZSBpZiAoKHR4X3BvcnQgPj0gNCkgJiYgKHR4X3BvcnQgPCA4KSkgeworCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzE7CisJCQlzaGlmdCA9ICgodHhfcG9ydCAtIDQpIDw8IDEpOworCQkJc2hpZnRfdmFsID0gMHgwMzsKKwkJfSBlbHNlIGlmICgodHhfcG9ydCA+PSA4KSAmJiAodHhfcG9ydCA8IDExKSkgeworCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzI7CisJCQlzaGlmdCA9ICgodHhfcG9ydCAtIDgpIDw8IDEpOworCQkJc2hpZnRfdmFsID0gMHgwMzsKKwkJfSBlbHNlIGlmICh0eF9wb3J0ID09IDExKSB7CisJCQl0eF9wb3J0X3JlZyA9IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMzsKKwkJCXNoaWZ0ID0gMDsKKwkJCXNoaWZ0X3ZhbCA9IDB4MEY7CisJCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMykgeworCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzM7CisJCQlzaGlmdCA9IDQ7CisJCQlzaGlmdF92YWwgPSAweDAzOworCQl9CisJCXR4X211eF9zZWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIHR4X3BvcnRfcmVnKSAmCisJCQkJCSAgKHNoaWZ0X3ZhbCA8PCBzaGlmdCk7CisJCXR4X211eF9zZWwgPSB0eF9tdXhfc2VsID4+IHNoaWZ0OworCisJCWlmICh0eF9wb3J0IDw9IDgpIHsKKwkJCWlmICgodHhfbXV4X3NlbCA9PSAweDIpIHx8ICh0eF9tdXhfc2VsID09IDB4MykpCisJCQkJZGVjaW1hdG9yID0gdHhfcG9ydDsKKwkJfSBlbHNlIGlmICh0eF9wb3J0IDw9IDEwKSB7CisJCQlpZiAoKHR4X211eF9zZWwgPT0gMHgxKSB8fCAodHhfbXV4X3NlbCA9PSAweDIpKQorCQkJCWRlY2ltYXRvciA9ICgodHhfcG9ydCA9PSA5KSA/IDcgOiA2KTsKKwkJfSBlbHNlIGlmICh0eF9wb3J0ID09IDExKSB7CisJCQlpZiAoKHR4X211eF9zZWwgPj0gMSkgJiYgKHR4X211eF9zZWwgPCA3KSkKKwkJCQlkZWNpbWF0b3IgPSB0eF9tdXhfc2VsIC0gMTsKKwkJfSBlbHNlIGlmICh0eF9wb3J0ID09IDEzKSB7CisJCQlpZiAoKHR4X211eF9zZWwgPT0gMHgxKSB8fCAodHhfbXV4X3NlbCA9PSAweDIpKQorCQkJCWRlY2ltYXRvciA9IDU7CisJCX0KKworCQlpZiAoZGVjaW1hdG9yID49IDApIHsKKwkJCXR4X2ZzX3JlZyA9IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NUTCArCisJCQkJICAgIDE2ICogZGVjaW1hdG9yOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldCBERUMldSAoLT4gU0xJTV9UWCV1KSByYXRlIHRvICV1XG4iLAorCQkJCV9fZnVuY19fLCBkZWNpbWF0b3IsIHR4X3BvcnQsIHNhbXBsZV9yYXRlKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X2ZzX3JlZywgMHgwRiwgdHhfZnNfcmF0ZSk7CisJCX0gZWxzZSBpZiAoKHR4X3BvcnQgPD0gOCkgJiYgKHR4X211eF9zZWwgPT0gMHgwMSkpIHsKKwkJCS8qIENoZWNrIGlmIHRoZSBUWCBNdXggaW5wdXQgaXMgUlggTUlYIFRYbiAqLworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYX01JWF9UWCV1IGdvaW5nIHRvIENEQ19JRiBUWCV1XG4iLAorCQkJCQlfX2Z1bmNfXywgdHhfcG9ydCwgdHhfcG9ydCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRVJST1I6IEludmFsaWQgZGVjaW1hdG9yOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGVjaW1hdG9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX3NldF9taXhfaW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJCSAgIHU4IHJhdGVfcmVnX3ZhbCwKKwkJCQkJICAgdTMyIHNhbXBsZV9yYXRlKQoreworCXU4IGludF8yX2lucDsKKwl1MzIgajsKKwl1MTYgaW50X211eF9jZmcxLCBpbnRfZnNfcmVnOworCXU4IGludF9tdXhfY2ZnMV92YWw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGF2aWwtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKKwkJaW50XzJfaW5wID0gSU5Ubl8yX0lOUF9TRUxfUlgwICsgY2gtPnBvcnQgLQorCQkJCQkJV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUjsKKwkJaWYgKChpbnRfMl9pbnAgPCBJTlRuXzJfSU5QX1NFTF9SWDApIHx8CisJCSAgICAoaW50XzJfaW5wID4gSU5Ubl8yX0lOUF9TRUxfUlg3KSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgUlgldSBwb3J0LCBEYWkgSUQgaXMgJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJKGNoLT5wb3J0IC0gV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiksCisJCQkJZGFpLT5pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWludF9tdXhfY2ZnMSA9IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxOworCQlmb3IgKGogPSAwOyBqIDwgV0NEOTM0WF9OVU1fSU5URVJQT0xBVE9SUzsgaisrKSB7CisJCQkvKiBJbnRlcnBvbGF0b3JzIDUgYW5kIDYgYXJlIG5vdCBhdmlsaWFibGUgaW4gVGF2aWwgKi8KKwkJCWlmIChqID09IElOVEVSUF9MTzNfTkEgfHwgaiA9PSBJTlRFUlBfTE80X05BKSB7CisJCQkJaW50X211eF9jZmcxICs9IDI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpbnRfbXV4X2NmZzFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBpbnRfbXV4X2NmZzEpICYKKwkJCQkJCQkJCTB4MEY7CisJCQlpZiAoaW50X211eF9jZmcxX3ZhbCA9PSBpbnRfMl9pbnApIHsKKwkJCQkvKgorCQkJCSAqIEVhciBtaXggcGF0aCBzdXBwb3J0cyBvbmx5IDQ4LCA5NiwgMTkyLAorCQkJCSAqIDM4NEtIeiBvbmx5CisJCQkJICovCisJCQkJaWYgKChqID09IElOVEVSUF9FQVIpICYmCisJCQkJICAgIChyYXRlX3JlZ192YWwgPCAweDQgfHwKKwkJCQkgICAgIHJhdGVfcmVnX3ZhbCA+IDB4NykpIHsKKwkJCQkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LAorCQkJCQkiJXM6IEludmFsaWQgcmF0ZSBmb3IgQUlGX1BCIERBSSglZClcbiIsCisJCQkJCSAgX19mdW5jX18sIGRhaS0+aWQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpbnRfZnNfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCArCisJCQkJCQkJCQkyMCAqIGo7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEFJRl9QQiBEQUkoJWQpIGNvbm5lY3RlZCB0byBJTlQldV8yXG4iLAorCQkJCQkgIF9fZnVuY19fLCBkYWktPmlkLCBqKTsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2V0IElOVCV1XzIgc2FtcGxlIHJhdGUgdG8gJXVcbiIsCisJCQkJCV9fZnVuY19fLCBqLCBzYW1wbGVfcmF0ZSk7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaW50X2ZzX3JlZywgMHgwRiwKKwkJCQkJCSAgICByYXRlX3JlZ192YWwpOworCQkJfQorCQkJaW50X211eF9jZmcxICs9IDI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfc2V0X3ByaW1faW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJCSAgICB1OCByYXRlX3JlZ192YWwsCisJCQkJCSAgICB1MzIgc2FtcGxlX3JhdGUpCit7CisJdTggaW50XzFfbWl4MV9pbnA7CisJdTMyIGo7CisJdTE2IGludF9tdXhfY2ZnMCwgaW50X211eF9jZmcxOworCXUxNiBpbnRfZnNfcmVnOworCXU4IGludF9tdXhfY2ZnMF92YWwsIGludF9tdXhfY2ZnMV92YWw7CisJdTggaW5wMF9zZWwsIGlucDFfc2VsLCBpbnAyX3NlbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbC0+ZHNkX2NvbmZpZzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXZpbC0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgeworCQlpbnRfMV9taXgxX2lucCA9IElOVG5fMV9JTlBfU0VMX1JYMCArIGNoLT5wb3J0IC0KKwkJCQkJCVdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVI7CisJCWlmICgoaW50XzFfbWl4MV9pbnAgPCBJTlRuXzFfSU5QX1NFTF9SWDApIHx8CisJCSAgICAoaW50XzFfbWl4MV9pbnAgPiBJTlRuXzFfSU5QX1NFTF9SWDcpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBSWCV1IHBvcnQsIERhaSBJRCBpcyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQkoY2gtPnBvcnQgLSBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSwKKwkJCQlkYWktPmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaW50X211eF9jZmcwID0gV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzA7CisKKwkJLyoKKwkJICogTG9vcCB0aHJvdWdoIGFsbCBpbnRlcnBvbGF0b3IgTVVYIGlucHV0cyBhbmQgZmluZCBvdXQKKwkJICogdG8gd2hpY2ggaW50ZXJwb2xhdG9yIGlucHV0LCB0aGUgc2xpbSByeCBwb3J0CisJCSAqIGlzIGNvbm5lY3RlZAorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlM7IGorKykgeworCQkJLyogSW50ZXJwb2xhdG9ycyA1IGFuZCA2IGFyZSBub3QgYXZpbGlhYmxlIGluIFRhdmlsICovCisJCQlpZiAoaiA9PSBJTlRFUlBfTE8zX05BIHx8IGogPT0gSU5URVJQX0xPNF9OQSkgeworCQkJCWludF9tdXhfY2ZnMCArPSAyOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaW50X211eF9jZmcxID0gaW50X211eF9jZmcwICsgMTsKKworCQkJaW50X211eF9jZmcwX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgaW50X211eF9jZmcwKTsKKwkJCWludF9tdXhfY2ZnMV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMSk7CisJCQlpbnAwX3NlbCA9IGludF9tdXhfY2ZnMF92YWwgJiAweDBGOworCQkJaW5wMV9zZWwgPSAoaW50X211eF9jZmcwX3ZhbCA+PiA0KSAmIDB4MEY7CisJCQlpbnAyX3NlbCA9IChpbnRfbXV4X2NmZzFfdmFsID4+IDQpICYgMHgwRjsKKwkJCWlmICgoaW5wMF9zZWwgPT0gaW50XzFfbWl4MV9pbnApIHx8CisJCQkgICAgKGlucDFfc2VsID09IGludF8xX21peDFfaW5wKSB8fAorCQkJICAgIChpbnAyX3NlbCA9PSBpbnRfMV9taXgxX2lucCkpIHsKKwkJCQkvKgorCQkJCSAqIEVhciBhbmQgc3BlYWtlciBwcmltYXJ5IHBhdGggZG9lcyBub3Qgc3VwcG9ydAorCQkJCSAqIG5hdGl2ZSBzYW1wbGUgcmF0ZXMKKwkJCQkgKi8KKwkJCQlpZiAoKGogPT0gSU5URVJQX0VBUiB8fCBqID09IElOVEVSUF9TUEtSMSB8fAorCQkJCQlqID09IElOVEVSUF9TUEtSMikgJiYKKwkJCQkJKHJhdGVfcmVnX3ZhbCA+IDB4NykpIHsKKwkJCQkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LAorCQkJCQkiJXM6IEludmFsaWQgcmF0ZSBmb3IgQUlGX1BCIERBSSglZClcbiIsCisJCQkJCSAgX19mdW5jX18sIGRhaS0+aWQpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpbnRfZnNfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ1RMICsKKwkJCQkJCQkJCTIwICogajsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBBSUZfUEIgREFJKCVkKSBjb25uZWN0ZWQgdG8gSU5UJXVfMVxuIiwKKwkJCQkgIF9fZnVuY19fLCBkYWktPmlkLCBqKTsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJCSIlczogc2V0IElOVCV1XzEgc2FtcGxlIHJhdGUgdG8gJXVcbiIsCisJCQkJCV9fZnVuY19fLCBqLCBzYW1wbGVfcmF0ZSk7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaW50X2ZzX3JlZywgMHgwRiwKKwkJCQkJCSAgICByYXRlX3JlZ192YWwpOworCQkJfQorCQkJaW50X211eF9jZmcwICs9IDI7CisJCX0KKwkJaWYgKGRzZF9jb25mKQorCQkJdGF2aWxfZHNkX3NldF9pbnRlcnBfcmF0ZShkc2RfY29uZiwgY2gtPnBvcnQsCisJCQkJCQkgIHNhbXBsZV9yYXRlLCByYXRlX3JlZ192YWwpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdGF2aWxfc2V0X2ludGVycG9sYXRvcl9yYXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJCSAgICAgICB1MzIgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlpbnQgcmF0ZV92YWwgPSAwOworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcl92YWxfdGJsKTsgaSsrKSB7CisJCWlmIChzYW1wbGVfcmF0ZSA9PSBzcl92YWxfdGJsW2ldLnNhbXBsZV9yYXRlKSB7CisJCQlyYXRlX3ZhbCA9IHNyX3ZhbF90YmxbaV0ucmF0ZV92YWw7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoKGkgPT0gQVJSQVlfU0laRShzcl92YWxfdGJsKSkgfHwgKHJhdGVfdmFsIDwgMCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFVuc3VwcG9ydGVkIHNhbXBsZSByYXRlOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzYW1wbGVfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHRhdmlsX3NldF9wcmltX2ludGVycG9sYXRvcl9yYXRlKGRhaSwgKHU4KXJhdGVfdmFsLCBzYW1wbGVfcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSB0YXZpbF9zZXRfbWl4X2ludGVycG9sYXRvcl9yYXRlKGRhaSwgKHU4KXJhdGVfdmFsLCBzYW1wbGVfcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX3ZpX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKKworCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBkYWlfbmFtZSA9ICVzIERBSS1JRCAleCByYXRlICVkIG51bV9jaCAlZFxuIiwKKwkJIF9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQsIHBhcmFtc19yYXRlKHBhcmFtcyksCisJCSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisKKwl0YXZpbC0+ZGFpW2RhaS0+aWRdLnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMzI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWRcbiIsCisJCSBfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQkgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOworCisJc3dpdGNoIChzdWJzdHJlYW0tPnN0cmVhbSkgeworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKKwkJcmV0ID0gdGF2aWxfc2V0X2ludGVycG9sYXRvcl9yYXRlKGRhaSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBjYW5ub3Qgc2V0IHNhbXBsZSByYXRlOiAldVxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwkJY2FzZSAxNjoKKwkJCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMjQ7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRhdmlsLT5kYWlbZGFpLT5pZF0ucmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgorCQlpZiAoZGFpLT5pZCAhPSBBSUY0X01BRF9UWCkKKwkJCXJldCA9IHRhdmlsX3NldF9kZWNpbWF0b3JfcmF0ZShkYWksCisJCQkJCQkgICAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBjYW5ub3Qgc2V0IFRYIERlY2ltYXRvciByYXRlOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCQljYXNlIDE2OgorCQkJdGF2aWwtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJdGF2aWwtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAyNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IEludmFsaWQgZm9ybWF0IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc193aWR0aChwYXJhbXMpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9OworCQl0YXZpbC0+ZGFpW2RhaS0+aWRdLnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogSW52YWxpZCBzdHJlYW0gdHlwZSAlZFxuIiwgX19mdW5jX18sCisJCQlzdWJzdHJlYW0tPnN0cmVhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgdGF2aWxfZGFpX29wcyA9IHsKKwkuc3RhcnR1cCA9IHRhdmlsX3N0YXJ0dXAsCisJLnNodXRkb3duID0gdGF2aWxfc2h1dGRvd24sCisJLmh3X3BhcmFtcyA9IHRhdmlsX2h3X3BhcmFtcywKKwkucHJlcGFyZSA9IHRhdmlsX3ByZXBhcmUsCisJLnNldF9jaGFubmVsX21hcCA9IHRhdmlsX3NldF9jaGFubmVsX21hcCwKKwkuZ2V0X2NoYW5uZWxfbWFwID0gdGF2aWxfZ2V0X2NoYW5uZWxfbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgdGF2aWxfdmlfZGFpX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gdGF2aWxfdmlfaHdfcGFyYW1zLAorCS5zZXRfY2hhbm5lbF9tYXAgPSB0YXZpbF9zZXRfY2hhbm5lbF9tYXAsCisJLmdldF9jaGFubmVsX21hcCA9IHRhdmlsX2dldF9jaGFubmVsX21hcCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHRhdmlsX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSAidGF2aWxfcngxIiwKKwkJLmlkID0gQUlGMV9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTM0WF9SQVRFU19NQVNLIHwgV0NEOTM0WF9GUkFDX1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhdmlsX3R4MSIsCisJCS5pZCA9IEFJRjFfQ0FQLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIENhcHR1cmUiLAorCQkJLnJhdGVzID0gV0NEOTM0WF9SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQl9LAorCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhdmlsX3J4MiIsCisJCS5pZCA9IEFJRjJfUEIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKKwkJCS5yYXRlcyA9IFdDRDkzNFhfUkFURVNfTUFTSyB8IFdDRDkzNFhfRlJBQ19SQVRFU19NQVNLLAorCQkJLmZvcm1hdHMgPSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXZpbF90eDIiLAorCQkuaWQgPSBBSUYyX0NBUCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMiBDYXB0dXJlIiwKKwkJCS5yYXRlcyA9IFdDRDkzNFhfUkFURVNfTUFTSywKKwkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfTEUsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJfSwKKwkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJ0YXZpbF9yeDMiLAorCQkuaWQgPSBBSUYzX1BCLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCisJCQkucmF0ZXMgPSBXQ0Q5MzRYX1JBVEVTX01BU0sgfCBXQ0Q5MzRYX0ZSQUNfUkFURVNfTUFTSywKKwkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCX0sCisJCS5vcHMgPSAmdGF2aWxfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGF2aWxfdHgzIiwKKwkJLmlkID0gQUlGM19DQVAsCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjMgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBXQ0Q5MzRYX1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X0xFLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDQsCisJCX0sCisJCS5vcHMgPSAmdGF2aWxfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGF2aWxfcng0IiwKKwkJLmlkID0gQUlGNF9QQiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjQgUGxheWJhY2siLAorCQkJLnJhdGVzID0gV0NEOTM0WF9SQVRFU19NQVNLIHwgV0NEOTM0WF9GUkFDX1JBVEVTX01BU0ssCisJCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQl9LAorCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gInRhdmlsX3ZpZmVlZGJhY2siLAorCQkuaWQgPSBBSUY0X1ZJRkVFRCwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVklmZWVkIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNCwKKwkJIH0sCisJCS5vcHMgPSAmdGF2aWxfdmlfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAidGF2aWxfbWFkMSIsCisJCS5pZCA9IEFJRjRfTUFEX1RYLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUY0IE1BRCBUWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9MRSwKKwkJCS5yYXRlX21pbiA9IDE2MDAwLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQl9LAorCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHRhdmlsX2NvZGVjX3Bvd2VyX2dhdGVfZGlnaXRhbF9jb3JlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXZpbC0+Y29kZWM7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZ0YXZpbC0+cG93ZXJfbG9jayk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEVudGVyaW5nIHBvd2VyIGdhdGluZyBmdW5jdGlvbiwgJWRcbiIsCisJCV9fZnVuY19fLCB0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZik7CisKKwlpZiAodGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYgPiAwKQorCQlnb3RvIGV4aXQ7CisKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXZpbC0+d2NkOXh4eCwKKwkJCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfQkVHSU4sCisJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDA0LCAweDA0KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDAxLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCisJCQkweDAyLCAweDAwKTsKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXZpbC0+d2NkOXh4eCwgV0NEX1JFR0lPTl9QT1dFUl9ET1dOLAorCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOworZXhpdDoKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRXhpdGluZyBwb3dlciBnYXRpbmcgZnVuY3Rpb24sICVkXG4iLAorCQlfX2Z1bmNfXywgdGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYpOworCW11dGV4X3VubG9jaygmdGF2aWwtPnBvd2VyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19wb3dlcl9nYXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwl0YXZpbCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRhdmlsX3ByaXYsIHBvd2VyX2dhdGVfd29yayk7CisJY29kZWMgPSB0YXZpbC0+Y29kZWM7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwl0YXZpbF9jb2RlY19wb3dlcl9nYXRlX2RpZ2l0YWxfY29yZSh0YXZpbCk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBwb3dlcl9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgaW50IHRhdmlsX2RpZ19jb3JlX3JlbW92ZV9wb3dlcl9jb2xsYXBzZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4NSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDcpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHgzKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9SU1RfQ1RMLCAweDAyLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9SU1RfQ1RMLCAweDAyLCAweDAyKTsKKworCXdjZDl4eHhfc2V0X3Bvd2VyX3N0YXRlKHRhdmlsLT53Y2Q5eHh4LAorCQkJV0NEX1JFR0lPTl9QT1dFUl9DT0xMQVBTRV9SRU1PVkUsCisJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KGNvZGVjLT5jb21wb25lbnQucmVnbWFwKTsKKwlyZWdjYWNoZV9zeW5jX3JlZ2lvbihjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCwKKwkJCSAgICAgV0NEOTM0WF9ESUdfQ09SRV9SRUdfTUlOLAorCQkJICAgICBXQ0Q5MzRYX0RJR19DT1JFX1JFR19NQVgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2Uoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAorCQkJCQkgaW50IHJlcV9zdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IGN1cl9zdGF0ZTsKKworCS8qIEV4aXQgaWYgZmVhdHVyZSBpcyBkaXNhYmxlZCAqLworCWlmICghZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnRhdmlsLT5wb3dlcl9sb2NrKTsKKwlpZiAocmVxX3N0YXRlID09IFBPV0VSX0NPTExBUFNFKQorCQl0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZi0tOworCWVsc2UgaWYgKHJlcV9zdGF0ZSA9PSBQT1dFUl9SRVNVTUUpCisJCXRhdmlsLT5wb3dlcl9hY3RpdmVfcmVmKys7CisJZWxzZQorCQlnb3RvIHVubG9ja19tdXRleDsKKworCWlmICh0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZiA8IDApIHsKKwkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IHBvd2VyX2FjdGl2ZV9yZWYgaXMgbmVnYXRpdmVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrX211dGV4OworCX0KKworCWNvZGVjID0gdGF2aWwtPmNvZGVjOworCWlmICghY29kZWMpCisJCWdvdG8gdW5sb2NrX211dGV4OworCisJaWYgKHJlcV9zdGF0ZSA9PSBQT1dFUl9DT0xMQVBTRSkgeworCQlpZiAodGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYgPT0gMCkgeworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXZpbC0+cG93ZXJfZ2F0ZV93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhkaWdfY29yZV9jb2xsYXBzZV90aW1lciAqIDEwMDApKTsKKwkJfQorCX0gZWxzZSBpZiAocmVxX3N0YXRlID09IFBPV0VSX1JFU1VNRSkgeworCQlpZiAodGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYgPT0gMSkgeworCQkJLyoKKwkJCSAqIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGNhbiBiZSB0d28gY2FzZXM6CisJCQkgKiAxLiBDb3JlIGFscmVhZHkgaW4gcG93ZXIgY29sbGFwc2Ugc3RhdGUKKwkJCSAqIDIuIFRpbWVyIGtpY2tlZCBpbiBhbmQgc3RpbGwgZGlkIG5vdCBleHBpcmUgb3IKKwkJCSAqIHdhaXRpbmcgZm9yIHRoZSBwb3dlcl9sb2NrCisJCQkgKi8KKwkJCWN1cl9zdGF0ZSA9IHdjZDl4eHhfZ2V0X2N1cnJlbnRfcG93ZXJfc3RhdGUoCisJCQkJCQl0YXZpbC0+d2NkOXh4eCwKKwkJCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOworCQkJaWYgKGN1cl9zdGF0ZSA9PSBXQ0RfUkVHSU9OX1BPV0VSX0RPV04pIHsKKwkJCQl0YXZpbF9kaWdfY29yZV9yZW1vdmVfcG93ZXJfY29sbGFwc2UoY29kZWMpOworCQkJfSBlbHNlIHsKKwkJCQltdXRleF91bmxvY2soJnRhdmlsLT5wb3dlcl9sb2NrKTsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoCisJCQkJCQkmdGF2aWwtPnBvd2VyX2dhdGVfd29yayk7CisJCQkJbXV0ZXhfbG9jaygmdGF2aWwtPnBvd2VyX2xvY2spOworCQkJfQorCQl9CisJfQorCit1bmxvY2tfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+cG93ZXJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXZpbF9jZGNfcmVxX21jbGtfZW5hYmxlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwKKwkJCQkgICAgIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodGF2aWwtPndjZF9leHRfY2xrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IGV4dCBjbGsgZW5hYmxlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJLyogZ2V0IEJHICovCisJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHRhdmlsLT5yZXNtZ3IpOworCQkvKiBnZXQgTUNMSyAqLworCQl3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwgV0NEX0NMS19NQ0xLKTsKKwl9IGVsc2UgeworCQkvKiBwdXQgTUNMSyAqLworCQl3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhdmlsLT5yZXNtZ3IsIFdDRF9DTEtfTUNMSyk7CisJCS8qIHB1dCBCRyAqLworCQl3Y2RfcmVzbWdyX2Rpc2FibGVfbWFzdGVyX2JpYXModGF2aWwtPnJlc21ncik7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0YXZpbC0+d2NkX2V4dF9jbGspOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fdGF2aWxfY2RjX21jbGtfZW5hYmxlX2xvY2tlZChzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwsCisJCQkJCSAgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRhdmlsLT53Y2RfZXh0X2NsaykgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogd2NkIGV4dCBjbG9jayBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBtY2xrX2VuYWJsZSA9ICV1XG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmIChlbmFibGUpIHsKKwkJdGF2aWxfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2UodGF2aWwsIFBPV0VSX1JFU1VNRSk7CisJCXRhdmlsX3ZvdGVfc3ZzKHRhdmlsLCB0cnVlKTsKKwkJcmV0ID0gdGF2aWxfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXZpbCwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJdGF2aWxfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOworCQl0YXZpbF92b3RlX3N2cyh0YXZpbCwgZmFsc2UpOworCQl0YXZpbF9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXZpbCwgUE9XRVJfQ09MTEFQU0UpOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fdGF2aWxfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwKKwkJCQkgICBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCisJV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXZpbC0+cmVzbWdyKTsKKwlyZXQgPSBfX3RhdmlsX2NkY19tY2xrX2VuYWJsZV9sb2NrZWQodGF2aWwsIGVuYWJsZSk7CisJV0NEOVhYWF9WMl9CR19DTEtfVU5MT0NLKHRhdmlsLT5yZXNtZ3IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdGF2aWxfY29kZWNfdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkJCXZvaWQgKmZpbGVfcHJpdmF0ZV9kYXRhLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQlsb2ZmX3QgcG9zKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKwljaGFyIGJ1ZmZlcltUQVZJTF9WRVJTSU9OX0VOVFJZX1NJWkVdOworCWludCBsZW4gPSAwOworCisJdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKikgZW50cnktPnByaXZhdGVfZGF0YTsKKwlpZiAoIXRhdmlsKSB7CisJCXByX2VycigiJXM6IHRhdmlsIHByaXYgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7CisKKwlzd2l0Y2ggKHdjZDl4eHgtPnZlcnNpb24pIHsKKwljYXNlIFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzA6CisJCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJXQ0Q5MzQwXzFfMFxuIik7CisJCWJyZWFrOworCWNhc2UgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMDoKKwkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIldDRDkzNDFfMV8wXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8xOgorCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTM0MF8xXzFcbiIpOworCQlicmVhazsKKwljYXNlIFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzE6CisJCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJXQ0Q5MzQxXzFfMVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJWRVJfVU5ERUZJTkVEXG4iKTsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJnBvcywgYnVmZmVyLCBsZW4pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyB0YXZpbF9jb2RlY19pbmZvX29wcyA9IHsKKwkucmVhZCA9IHRhdmlsX2NvZGVjX3ZlcnNpb25fcmVhZCwKK307CisKKy8qCisgKiB0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSAtIGNyZWF0ZXMgd2NkOTM0eCBtb2R1bGUKKyAqIEBjb2RlY19yb290OiBUaGUgcGFyZW50IGRpcmVjdG9yeQorICogQGNvZGVjOiBDb2RlYyBpbnN0YW5jZQorICoKKyAqIENyZWF0ZXMgd2NkOTM0eCBtb2R1bGUgYW5kIHZlcnNpb24gZW50cnkgdW5kZXIgdGhlIGdpdmVuCisgKiBwYXJlbnQgZGlyZWN0b3J5LgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHRhdmlsX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKKwkJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKworCWlmICghY29kZWNfcm9vdCB8fCAhY29kZWMpCisJCXJldHVybiAtRUlOVkFMOworCisJdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXRhdmlsLT5lbnRyeSA9IHNuZF9yZWdpc3Rlcl9tb2R1bGVfaW5mbyhjb2RlY19yb290LT5tb2R1bGUsCisJCQkJCQkidGF2aWwiLAorCQkJCQkJY29kZWNfcm9vdCk7CisJaWYgKCF0YXZpbC0+ZW50cnkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTM0eCBlbnRyeVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdmVyc2lvbl9lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQtPnNuZF9jYXJkLAorCQkJCQkJICAgInZlcnNpb24iLAorCQkJCQkJICAgdGF2aWwtPmVudHJ5KTsKKwlpZiAoIXZlcnNpb25fZW50cnkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTM0eCB2ZXJzaW9uIGVudHJ5XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB0YXZpbDsKKwl2ZXJzaW9uX2VudHJ5LT5zaXplID0gVEFWSUxfVkVSU0lPTl9FTlRSWV9TSVpFOworCXZlcnNpb25fZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKKwl2ZXJzaW9uX2VudHJ5LT5jLm9wcyA9ICZ0YXZpbF9jb2RlY19pbmZvX29wczsKKworCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKKwkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRhdmlsLT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSk7CisKKy8qKgorICogdGF2aWxfY2RjX21jbGtfZW5hYmxlIC0gRW5hYmxlL2Rpc2FibGUgY29kZWMgbWNsaworICoKKyAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKKyAqIEBlbmFibGU6IEluZGljYXRlcyBjbGsgZW5hYmxlIG9yIGRpc2FibGUKKyAqCisgKiBSZXR1cm5zIDAgb24gU3VjY2VzcyBhbmQgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgdGF2aWxfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZXR1cm4gX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGVuYWJsZSk7Cit9CitFWFBPUlRfU1lNQk9MKHRhdmlsX2NkY19tY2xrX2VuYWJsZSk7CisKK3N0YXRpYyBpbnQgX190YXZpbF9jb2RlY19pbnRlcm5hbF9yY29fY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJaWYgKGVuYWJsZSkgeworCQlpZiAod2NkX3Jlc21ncl9nZXRfY2xrX3R5cGUodGF2aWwtPnJlc21ncikgPT0KKwkJICAgIFdDRF9DTEtfUkNPKSB7CisJCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwKKwkJCQkJCQkgIFdDRF9DTEtfUkNPKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHRhdmlsX2NkY19yZXFfbWNsa19lbmFibGUodGF2aWwsIHRydWUpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOiBtY2xrX2VuYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwKKwkJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7CisJCQlyZXQgfD0gdGF2aWxfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOworCQl9CisKKwl9IGVsc2UgeworCQlyZXQgPSB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhdmlsLT5yZXNtZ3IsCisJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7CisJfQorCisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IgaW4gJXMgUkNPXG4iLAorCQkJX19mdW5jX18sIChlbmFibGUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsOiBFbmFibGUvRGlzYWJsZSBjb2RlYydzIFJDTyBjbG9jaworICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjCisgKiBAZW5hYmxlOiBJbmRpY2F0ZXMgd2hldGhlciBjbG9jayBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICovCitzdGF0aWMgaW50IHRhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQgPSAwOworCisJV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXZpbC0+cmVzbWdyKTsKKwlyZXQgPSBfX3RhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBlbmFibGUpOworCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXZpbC0+cmVzbWdyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9yZXNtZ3JfY2IgdGF2aWxfcmVzbWdyX2NiID0geworCS5jZGNfcmNvX2N0cmwgPSBfX3RhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfY29kZWNfbWNsazJfMV8xX2RlZmF1bHRzW10gPSB7CisJe1dDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxLCAweDYwLCAweDIwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX2NvZGVjX21jbGsyXzFfMF9kZWZhdWx0c1tdID0geworCS8qCisJICogUExMIFNldHRpbmdzOgorCSAqIENsb2NrIFJvb3Q6IE1DTEsyLAorCSAqIENsb2NrIFNvdXJjZTogRVhUX0NMSywKKwkgKiBDbG9jayBEZXN0aW5hdGlvbjogTUNMSzIKKwkgKiBDbG9jayBGcmVxIEluOiAxOS4yTUh6LAorCSAqIENsb2NrIEZyZXEgT3V0OiAxMS4yODk2TUh6CisJICovCisJe1dDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxLCAweDYwLCAweDIwfSwKKwl7V0NEOTM0WF9DTEtfU1lTX0lOVF9QT1NUX0RJVl9SRUcwLCAweEZGLCAweDVFfSwKKwl7V0NEOTM0WF9DTEtfU1lTX0lOVF9QT1NUX0RJVl9SRUcxLCAweDFGLCAweDFGfSwKKwl7V0NEOTM0WF9DTEtfU1lTX0lOVF9SRUZfRElWX1JFRzAsIDB4RkYsIDB4NTR9LAorCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1JFRl9ESVZfUkVHMSwgMHhGRiwgMHgwMX0sCisJe1dDRDkzNFhfQ0xLX1NZU19JTlRfRklMVEVSX1JFRzEsIDB4MDcsIDB4MDR9LAorCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9MX1ZBTCwgMHhGRiwgMHg5M30sCisJe1dDRDkzNFhfQ0xLX1NZU19JTlRfUExMX05fVkFMLCAweEZGLCAweEZBfSwKKwl7V0NEOTM0WF9DTEtfU1lTX0lOVF9URVNUX1JFRzAsIDB4RkYsIDB4OTB9LAorCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1BGRF9DUF9EU01fUFJPRywgMHhGRiwgMHg3RX0sCisJe1dDRDkzNFhfQ0xLX1NZU19JTlRfVkNPX1BST0csIDB4RkYsIDB4Rjh9LAorCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMSwgMHhGRiwgMHg2OH0sCisJe1dDRDkzNFhfQ0xLX1NZU19JTlRfTERPX0xPQ0tfQ0ZHLCAweEZGLCAweDQwfSwKKwl7V0NEOTM0WF9DTEtfU1lTX0lOVF9ESUdfTE9DS19ERVRfQ0ZHLCAweEZGLCAweDMyfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX2NvZGVjX3JlZ19kZWZhdWx0c1tdID0geworCXtXQ0Q5MzRYX0JJQVNfVkJHX0ZJTkVfQURKLCAweEZGLCAweDc1fSwKKwl7V0NEOTM0WF9DT0RFQ19DUFJfU1ZTX0NYX1ZERCwgMHhGRiwgMHg3Q30sIC8qIHZhbHVlIGluIHN2cyBtb2RlICovCisJe1dDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfQ1hfVkRELCAweEZGLCAweDU4fSwgLyogdmFsdWUgaW4gc3ZzMiBtb2RlICovCisJe1dDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0RTTURFTV9DVEwsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9EU01ERU1fQ1RMLCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfRFNNREVNX0NUTCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0RTTURFTV9DVEwsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9EU01ERU1fQ1RMLCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfRFNNREVNX0NUTCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0RTTURFTV9DVEwsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDcsIDB4MUUsIDB4MTh9LAorCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MUUsIDB4MTh9LAorCXtXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMwLCAweDA4LCAweDB9LAorCXtXQ0Q5MzRYX0NEQ19DTFNIX0RFQ0FZX0NUUkwsIDB4MDMsIDB4MH0sCisJe1dDRDkzNFhfTUlDQjFfVEVTVF9DVExfMiwgMHgwNywgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DRkcxLCAweDNGLCAweDEyfSwKKwl7V0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzIsIDB4MUMsIDB4MDh9LAorCXtXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ0ZHMSwgMHgzRiwgMHgxMn0sCisJe1dDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAweDFDLCAweDA4fSwKKwl7V0NEOTM0WF9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCwgMHgxRiwgMHgwOX0sCisJe1dDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKKwl7V0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCisJe1dDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKKwl7V0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCisJe1dDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKKwl7V0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCisJe1dDRDkzNFhfUlhfT0NQX0NUTCwgMHgwRiwgMHgwMn0sIC8qIE9DUCBudW1iZXIgb2YgYXR0ZW1wdHMgaXMgMiAqLworCXtXQ0Q5MzRYX0hQSF9PQ1BfQ1RMLCAweEZGLCAweDNBfSwgLyogT0NQIGN1cnJlbnQgbGltaXQgKi8KKwl7V0NEOTM0WF9IUEhfTF9URVNULCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9IUEhfUl9URVNULCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMiwgMHhGRiwgMHgyMH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9jb2RlY19yZWdfaW5pdF8xXzFfdmFsW10gPSB7CisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNywgMHgxRSwgMHgwNn0sCisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgMHgxRSwgMHgwNn0sCisJe1dDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMX0wsIDB4RkYsIDB4ODR9LAorCXtXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTF9SLCAweEZGLCAweDg0fSwKKwl7V0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGNH0sCisJe1dDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4RjR9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9jcHJfcmVnX2RlZmF1bHRzIGNwcl9kZWZhdWx0c1tdID0geworCXsgMHgwMDAwMDgyMCwgMHgwMDAwMDA5NCB9LAorCXsgMHgwMDAwMGZDMCwgMHgwMDAwMDA0OCB9LAorCXsgMHgwMDAwZjAwMCwgMHgwMDAwMDA0NCB9LAorCXsgMHgwMDAwYmI4MCwgMHhDMDAwMDE3OCB9LAorCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDE2MCB9LAorCXsgMHgxMDg1NDUyMiwgMHgwMDAwMDA2MCB9LAorCXsgMHgxMDg1NDUwOSwgMHgwMDAwMDA2NCB9LAorCXsgMHgxMDg1NDRkZCwgMHgwMDAwMDA2OCB9LAorCXsgMHgxMDg1NDRhZCwgMHgwMDAwMDA2QyB9LAorCXsgMHgwMDAwMDc3RSwgMHgwMDAwMDA3MCB9LAorCXsgMHgwMDAwMDdkYSwgMHgwMDAwMDA3NCB9LAorCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3OCB9LAorCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3QyB9LAorCXsgMHgwMDA0MjAyOSwgMHgwMDAwMDA4MCB9LAorCXsgMHg0MDAyMDAyQSwgMHgwMDAwMDA5MCB9LAorCXsgMHg0MDAyMDAyQiwgMHgwMDAwMDA5MCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtdID0geworCXtXQ0Q5MzRYX0NEQ19DTFNIX0syX01TQiwgMHgwRiwgMHgwMH0sCisJe1dDRDkzNFhfQ0RDX0NMU0hfSzJfTFNCLCAweEZGLCAweDYwfSwKKwl7V0NEOTM0WF9DUEVfU1NfRE1JQ19DRkcsIDB4ODAsIDB4MDB9LAorCXtXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDcwLCAweDUwfSwKKwl7V0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3MCwgMHg1MH0sCisJe1dDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAorCXtXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAweDA4LCAweDA4fSwKKwl7V0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxLCAweDAyLCAweDAyfSwKKwl7V0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxLCAweDAxLCAweDAxfSwKKwl7V0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAorCXtXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHg4MH0sCisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMywgMHg4MCwgMHg4MH0sCisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMX0sCisJe1dDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAweDA4LCAweDAwfSwKKwl7V0NEOTM0WF9UTE1NX0RNSUMzX0NMS19QSU5DRkcsIDB4RkYsIDB4MGF9LAorCXtXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcsIDB4RkYsIDB4MGF9LAorCXtXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAweDYwLCAweDAwfSwKK307CisKK3N0YXRpYyB2b2lkIHRhdmlsX2NvZGVjX2luaXRfcmVnKHN0cnVjdCB0YXZpbF9wcml2ICpwcml2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbCk7IGkrKykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgdGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5yZWcsCisJCQkJICAgIHRhdmlsX2NvZGVjX3JlZ19pbml0X2NvbW1vbl92YWxbaV0ubWFzaywKKwkJCQkgICAgdGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS52YWwpOworCisJaWYgKFRBVklMX0lTXzFfMShwcml2LT53Y2Q5eHh4KSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9jb2RlY19yZWdfaW5pdF8xXzFfdmFsKTsgaSsrKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJdGF2aWxfY29kZWNfcmVnX2luaXRfMV8xX3ZhbFtpXS5yZWcsCisJCQkJCXRhdmlsX2NvZGVjX3JlZ19pbml0XzFfMV92YWxbaV0ubWFzaywKKwkJCQkJdGF2aWxfY29kZWNfcmVnX2luaXRfMV8xX3ZhbFtpXS52YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgdGF2aWxfdXBkYXRlX3JlZ19kZWZhdWx0cyhzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCit7CisJdTMyIGk7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisKKwl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGF2aWxfY29kZWNfcmVnX2RlZmF1bHRzKTsgaSsrKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAorCQkJCSAgIHRhdmlsX2NvZGVjX3JlZ19kZWZhdWx0c1tpXS5yZWcsCisJCQkJICAgdGF2aWxfY29kZWNfcmVnX2RlZmF1bHRzW2ldLm1hc2ssCisJCQkJICAgdGF2aWxfY29kZWNfcmVnX2RlZmF1bHRzW2ldLnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX3VwZGF0ZV9jcHJfZGVmYXVsdHMoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKQoreworCWludCBpOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCisJd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OworCWlmICghVEFWSUxfSVNfMV8xKHdjZDl4eHgpKQorCQlyZXR1cm47CisKKwlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgdHJ1ZSk7CisKKwlyZWdtYXBfd3JpdGUod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01JTl9DWF9WREQsIDB4MkMpOworCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLAorCQkJICAgMHgxMCwgMHgwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHJfZGVmYXVsdHMpOyBpKyspIHsKKwkJcmVnbWFwX2J1bGtfd3JpdGUod2NkOXh4eC0+cmVnbWFwLAorCQkJCVdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMCwKKwkJCQkodTggKikmY3ByX2RlZmF1bHRzW2ldLndyX2RhdGEsIDQpOworCQlyZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsCisJCQkJV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8wLAorCQkJCSh1OCAqKSZjcHJfZGVmYXVsdHNbaV0ud3JfYWRkciwgNCk7CisJfQorCisJX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfc2xpbV9pbnRlcmZhY2VfaW5pdF9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpOworCXN0cnVjdCB0YXZpbF9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0NEOVhYWF9TTElNX05VTV9QT1JUX1JFRzsgaSsrKQorCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUocHJpdi0+d2NkOXh4eCwKKwkJCQkgICAgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9FTjAgKyBpLAorCQkJCSAgICAweEZGKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRhdmlsX21pc2NfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gZGF0YTsKKwlpbnQgbWlzY192YWw7CisKKwkvKiBGaW5kIHNvdXJjZSBvZiBpbnRlcnJ1cHQgKi8KKwlyZWdtYXBfcmVhZCh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19TVEFUVVMsCisJCSAgICAmbWlzY192YWwpOworCisJaWYgKG1pc2NfdmFsICYgMHgwOCkgeworCQlkZXZfaW5mbyh0YXZpbC0+ZGV2LCAiJXM6IGlycTogJWQsIERTRCBEQyBkZXRlY3RlZCFcbiIsCisJCQkgX19mdW5jX18sIGlycSk7CisJCS8qIERTRCBEQyBpbnRlcnJ1cHQsIHJlc2V0IERTRCBwYXRoICovCisJCXRhdmlsX2RzZF9yZXNldCh0YXZpbC0+ZHNkX2NvbmZpZyk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IENvZGVjIG1pc2MgaXJxOiAlZCwgdmFsOiAweCV4XG4iLAorCQkJX19mdW5jX18sIGlycSwgbWlzY192YWwpOworCX0KKworCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKKwkJCSAgIFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX0NMRUFSLCBtaXNjX3ZhbCwgMHgwMCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0YXZpbF9zbGltYnVzX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSAwOworCWludCBpLCBqLCBwb3J0X2lkLCBrOworCXUzMiBiaXQ7CisJdTggdmFsLCBpbnRfdmFsID0gMDsKKwlib29sIHR4LCBjbGVhcmVkOworCXVuc2lnbmVkIHNob3J0IHJlZyA9IDA7CisKKwlmb3IgKGkgPSBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19SWF8wLCBqID0gMDsKKwkgICAgIGkgPD0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMTsgaSsrLCBqKyspIHsKKwkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQodGF2aWwtPndjZDl4eHgsIGkpOworCQlzdGF0dXMgfD0gKCh1MzIpdmFsIDw8ICg4ICogaikpOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaiwgJnN0YXR1cywgMzIpIHsKKwkJdHggPSAoaiA+PSAxNiA/IHRydWUgOiBmYWxzZSk7CisJCXBvcnRfaWQgPSAodHggPyBqIC0gMTYgOiBqKTsKKwkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQodGF2aWwtPndjZDl4eHgsCisJCQkJV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwICsgaik7CisJCWlmICh2YWwpIHsKKwkJCWlmICghdHgpCisJCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9FTjAgKworCQkJCQkocG9ydF9pZCAvIDgpOworCQkJZWxzZQorCQkJCXJlZyA9IFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWludF92YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKKwkJCQl0YXZpbC0+d2NkOXh4eCwgcmVnKTsKKwkJCS8qCisJCQkgKiBJZ25vcmUgaW50ZXJydXB0cyBmb3IgcG9ydHMgZm9yIHdoaWNoIHRoZQorCQkJICogaW50ZXJydXB0cyBhcmUgbm90IHNwZWNpZmljYWxseSBlbmFibGVkLgorCQkJICovCisJCQlpZiAoIShpbnRfdmFsICYgKDEgPDwgKHBvcnRfaWQgJSA4KSkpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmICh2YWwgJiBXQ0Q5MzRYX1NMSU1fSVJRX09WRVJGTE9XKQorCQkJZGV2X2Vycl9yYXRlbGltaXRlZCh0YXZpbC0+ZGV2LCAiJXM6IG92ZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAorCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKKwkJaWYgKHZhbCAmIFdDRDkzNFhfU0xJTV9JUlFfVU5ERVJGTE9XKQorCQkJZGV2X2Vycl9yYXRlbGltaXRlZCh0YXZpbC0+ZGV2LCAiJXM6IHVuZGVyZmxvdyBlcnJvciBvbiAlcyBwb3J0ICVkLCB2YWx1ZSAleFxuIiwKKwkJCSAgIF9fZnVuY19fLCAodHggPyAiVFgiIDogIlJYIiksIHBvcnRfaWQsIHZhbCk7CisJCWlmICgodmFsICYgV0NEOTM0WF9TTElNX0lSUV9PVkVSRkxPVykgfHwKKwkJCSh2YWwgJiBXQ0Q5MzRYX1NMSU1fSVJRX1VOREVSRkxPVykpIHsKKwkJCWlmICghdHgpCisJCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9FTjAgKworCQkJCQkocG9ydF9pZCAvIDgpOworCQkJZWxzZQorCQkJCXJlZyA9IFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsKKwkJCQkJKHBvcnRfaWQgLyA4KTsKKwkJCWludF92YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKKwkJCQl0YXZpbC0+d2NkOXh4eCwgcmVnKTsKKwkJCWlmIChpbnRfdmFsICYgKDEgPDwgKHBvcnRfaWQgJSA4KSkpIHsKKwkJCQlpbnRfdmFsID0gaW50X3ZhbCBeICgxIDw8IChwb3J0X2lkICUgOCkpOworCQkJCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh0YXZpbC0+d2NkOXh4eCwKKwkJCQkJcmVnLCBpbnRfdmFsKTsKKwkJCX0KKwkJfQorCQlpZiAodmFsICYgV0NEOTM0WF9TTElNX0lSUV9QT1JUX0NMT1NFRCkgeworCQkJLyoKKwkJCSAqIElOVCBTT1VSQ0UgcmVnaXN0ZXIgc3RhcnRzIGZyb20gUlggdG8gVFgKKwkJCSAqIGJ1dCBwb3J0IG51bWJlciBpbiB0aGUgY2hfbWFzayBpcyBpbiBvcHBvc2l0ZSB3YXkKKwkJCSAqLworCQkJYml0ID0gKHR4ID8gaiAtIDE2IDogaiArIDE2KTsKKwkJCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiAlcyBwb3J0ICVkIGNsb3NlZCB2YWx1ZSAleCwgYml0ICV1XG4iLAorCQkJCSBfX2Z1bmNfXywgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkLCB2YWwsCisJCQkJIGJpdCk7CisJCQlmb3IgKGsgPSAwLCBjbGVhcmVkID0gZmFsc2U7IGsgPCBOVU1fQ09ERUNfREFJUzsgaysrKSB7CisJCQkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IHRhdmlsLT5kYWlbJWRdLmNoX21hc2sgPSAweCVseFxuIiwKKwkJCQkJIF9fZnVuY19fLCBrLCB0YXZpbC0+ZGFpW2tdLmNoX21hc2spOworCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoYml0LAorCQkJCQkJJnRhdmlsLT5kYWlba10uY2hfbWFzaykpIHsKKwkJCQkJY2xlYXJlZCA9IHRydWU7CisJCQkJCWlmICghdGF2aWwtPmRhaVtrXS5jaF9tYXNrKQorCQkJCQkJd2FrZV91cCgKKwkJCQkJCSAgICAgICZ0YXZpbC0+ZGFpW2tdLmRhaV93YWl0KTsKKwkJCQkJLyoKKwkJCQkJICogVGhlcmUgYXJlIGNhc2VzIHdoZW4gbXVsdGlwbGUgREFJcworCQkJCQkgKiBtaWdodCBiZSB1c2luZyB0aGUgc2FtZSBzbGltYnVzCisJCQkJCSAqIGNoYW5uZWwuIEhlbmNlIGRvbid0IGJyZWFrIGhlcmUuCisJCQkJCSAqLworCQkJCX0KKwkJCX0KKwkJCVdBUk4oIWNsZWFyZWQsCisJCQkgICAgICJDb3VsZG4ndCBmaW5kIHNsaW1idXMgJXMgcG9ydCAlZCBmb3IgY2xvc2luZ1xuIiwKKwkJCSAgICAgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkKTsKKwkJfQorCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUodGF2aWwtPndjZDl4eHgsCisJCQkJCSAgICBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9SWF8wICsKKwkJCQkJICAgIChqIC8gOCksCisJCQkJCSAgICAxIDw8IChqICUgOCkpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0YXZpbF9zZXR1cF9pcnFzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXZpbC0+Y29kZWM7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXZpbC0+d2NkOXh4eDsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJJndjZDl4eHgtPmNvcmVfcmVzOworCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgV0NEOVhYWF9JUlFfU0xJTUJVUywKKwkJCQkgIHRhdmlsX3NsaW1idXNfaXJxLCAiU0xJTUJVUyBTbGF2ZSIsIHRhdmlsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIFdDRDlYWFhfSVJRX1NMSU1CVVMpOworCWVsc2UKKwkJdGF2aWxfc2xpbV9pbnRlcmZhY2VfaW5pdF9yZWcoY29kZWMpOworCisJLyogUmVnaXN0ZXIgZm9yIG1pc2MgaW50ZXJydXB0cyBhcyB3ZWxsICovCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgV0NEOTM0WF9JUlFfTUlTQywKKwkJCQkgIHRhdmlsX21pc2NfaXJxLCAiQ0RDIE1JU0MgSXJxIiwgdGF2aWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBjZGMgbWlzYyBpcnFcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0YXZpbF9pbml0X3NsaW1fc2xhdmVfY2ZnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnICpjZmc7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBwcml2LT53Y2Q5eHh4OworCXVpbnQ2NF90IGVhZGRyID0gMDsKKworCWNmZyA9ICZwcml2LT5zbGltYnVzX3NsYXZlX2NmZzsKKwljZmctPm1pbm9yX3ZlcnNpb24gPSAxOworCWNmZy0+dHhfc2xhdmVfcG9ydF9vZmZzZXQgPSAwOworCWNmZy0+cnhfc2xhdmVfcG9ydF9vZmZzZXQgPSAxNjsKKworCW1lbWNweSgmZWFkZHIsICZ3Y2Q5eHh4LT5zbGltLT5lX2FkZHIsIHNpemVvZih3Y2Q5eHh4LT5zbGltLT5lX2FkZHIpKTsKKwlXQVJOX09OKHNpemVvZih3Y2Q5eHh4LT5zbGltLT5lX2FkZHIpICE9IDYpOworCWNmZy0+ZGV2aWNlX2VudW1fYWRkcl9sc3cgPSBlYWRkciAmIDB4RkZGRkZGRkY7CisJY2ZnLT5kZXZpY2VfZW51bV9hZGRyX21zdyA9IGVhZGRyID4+IDMyOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNsaW1idXMgbG9naWNhbCBhZGRyZXNzIDB4JWxseFxuIiwKKwkJX19mdW5jX18sIGVhZGRyKTsKK30KKworc3RhdGljIHZvaWQgdGF2aWxfY2xlYW51cF9pcnFzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KKwkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7CisKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBXQ0Q5WFhYX0lSUV9TTElNQlVTLCB0YXZpbCk7CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgV0NEOTM0WF9JUlFfTUlTQywgdGF2aWwpOworfQorCisvKgorICogd2NkOTM0eF9nZXRfbWljYl92b3V0X2N0bF92YWw6IGNvbnZlcnRzIG1pY2JpYXMgZnJvbSB2b2x0cyB0byByZWdpc3RlciB2YWx1ZQorICogQG1pY2JfbXY6IG1pY2JpYXMgaW4gbXYKKyAqCisgKiByZXR1cm4gcmVnaXN0ZXIgdmFsdWUgY29udmVydGVkCisgKi8KK2ludCB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbCh1MzIgbWljYl9tdikKK3sKKwkvKiBtaW4gbWljYmlhcyB2b2x0YWdlIGlzIDFWIGFuZCBtYXhpbXVtIGlzIDIuODVWICovCisJaWYgKG1pY2JfbXYgPCAxMDAwIHx8IG1pY2JfbXYgPiAyODUwKSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIG1pY2JpYXMgdm9sdGFnZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gKG1pY2JfbXYgLSAxMDAwKSAvIDUwOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbCk7CisKK3N0YXRpYyBpbnQgdGF2aWxfaGFuZGxlX3BkYXRhKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwKKwkJCSAgICAgIHN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXZpbC0+Y29kZWM7CisJdTggbWFkX2RtaWNfY3RsX3ZhbDsKKwl1OCBhbmNfY3RsX3ZhbHVlOworCXUzMiBkZWZfZG1pY19yYXRlLCBkbWljX2Nsa19kcnY7CisJaW50IHZvdXRfY3RsXzEsIHZvdXRfY3RsXzIsIHZvdXRfY3RsXzMsIHZvdXRfY3RsXzQ7CisJaW50IHJjID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IE5VTEwgcGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogc2V0IG1pY2JpYXMgdm9sdGFnZSAqLworCXZvdXRfY3RsXzEgPSB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiMV9tdik7CisJdm91dF9jdGxfMiA9IHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHBkYXRhLT5taWNiaWFzLm1pY2IyX212KTsKKwl2b3V0X2N0bF8zID0gd2NkOTM0eF9nZXRfbWljYl92b3V0X2N0bF92YWwocGRhdGEtPm1pY2JpYXMubWljYjNfbXYpOworCXZvdXRfY3RsXzQgPSB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiNF9tdik7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHZvdXRfY3RsXzEpIHx8IElTX0VSUl9WQUxVRSh2b3V0X2N0bF8yKSB8fAorCSAgICBJU19FUlJfVkFMVUUodm91dF9jdGxfMykgfHwgSVNfRVJSX1ZBTFVFKHZvdXRfY3RsXzQpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NSUNCMSwgMHgzRiwgdm91dF9jdGxfMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUlDQjIsIDB4M0YsIHZvdXRfY3RsXzIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0IzLCAweDNGLCB2b3V0X2N0bF8zKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NSUNCNCwgMHgzRiwgdm91dF9jdGxfNCk7CisKKwkvKiBTZXQgdGhlIERNSUMgc2FtcGxlIHJhdGUgKi8KKwlzd2l0Y2ggKHBkYXRhLT5tY2xrX3JhdGUpIHsKKwljYXNlIFdDRDkzNFhfTUNMS19DTEtfOVA2TUhaOgorCQlkZWZfZG1pY19yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQOE1IWjsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5MzRYX01DTEtfQ0xLXzEyUDI4OE1IWjoKKwkJZGVmX2RtaWNfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDA5Nk1IWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtY2xrX3JhdGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPm1jbGtfcmF0ZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX07CisKKwlpZiAocGRhdGEtPmRtaWNfc2FtcGxlX3JhdGUgPT0KKwkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgeworCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IGRtaWNfcmF0ZSBpbnZhbGlkIGRlZmF1bHQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBkZWZfZG1pY19yYXRlKTsKKwkJcGRhdGEtPmRtaWNfc2FtcGxlX3JhdGUgPSBkZWZfZG1pY19yYXRlOworCX0KKwlpZiAocGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlID09CisJICAgIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQpIHsKKwkJZGV2X2luZm8oY29kZWMtPmRldiwgIiVzOiBtYWRfZG1pY19yYXRlIGludmFsaWQgZGVmYXVsdCA9ICVkXG4iLAorCQkJX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOworCQkvKgorCQkgKiB1c2UgZG1pY19zYW1wbGVfcmF0ZSBhcyB0aGUgZGVmYXVsdCBmb3IgTUFECisJCSAqIGlmIG1hZCBkbWljIHNhbXBsZSByYXRlIGlzIHVuZGVmaW5lZAorCQkgKi8KKwkJcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlID0gcGRhdGEtPmRtaWNfc2FtcGxlX3JhdGU7CisJfQorCisJaWYgKHBkYXRhLT5kbWljX2Nsa19kcnYgPT0KKwkgICAgV0NEOVhYWF9ETUlDX0NMS19EUklWRV9VTkRFRklORUQpIHsKKwkJcGRhdGEtPmRtaWNfY2xrX2RydiA9IFdDRDkzNFhfRE1JQ19DTEtfRFJJVkVfREVGQVVMVDsKKwkJZGV2X2luZm8oY29kZWMtPmRldiwKKwkJCSAiJXM6IGRtaWNfY2xrX3N0cmVuZ3RoIGludmFsaWQsIGRlZmF1bHQgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGRhdGEtPmRtaWNfY2xrX2Rydik7CisJfQorCisJc3dpdGNoIChwZGF0YS0+ZG1pY19jbGtfZHJ2KSB7CisJY2FzZSAyOgorCQlkbWljX2Nsa19kcnYgPSAwOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRtaWNfY2xrX2RydiA9IDE7CisJCWJyZWFrOworCWNhc2UgODoKKwkJZG1pY19jbGtfZHJ2ID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZG1pY19jbGtfZHJ2ID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBpbnZhbGlkIGRtaWNfY2xrX2RydiAlZCwgdXNpbmcgZGVmYXVsdFxuIiwKKwkJCV9fZnVuY19fLCBwZGF0YS0+ZG1pY19jbGtfZHJ2KTsKKwkJZG1pY19jbGtfZHJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMCwKKwkJCSAgICAweDBDLCBkbWljX2Nsa19kcnYgPDwgMik7CisKKwkvKgorCSAqIERlZmF1bHQgdGhlIERNSUMgY2xrIHJhdGVzIHRvIG1hZF9kbWljX3NhbXBsZV9yYXRlLAorCSAqIHdoZXJlYXMsIHRoZSBhbmMvdHhmZSBkbWljIHJhdGVzIHRvIGRtaWNfc2FtcGxlX3JhdGUKKwkgKiBzaW5jZSB0aGUgYW5jL3R4ZmUgYXJlIGluZGVwZW5kZW50IG9mIG1hZCBibG9jay4KKwkgKi8KKwltYWRfZG1pY19jdGxfdmFsID0gdGF2aWxfZ2V0X2RtaWNfY2xrX3ZhbCh0YXZpbC0+Y29kZWMsCisJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKKwkJCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0RNSUMwX0NUTCwKKwkJMHgwRSwgbWFkX2RtaWNfY3RsX3ZhbCA8PCAxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19ETUlDMV9DVEwsCisJCTB4MEUsIG1hZF9kbWljX2N0bF92YWwgPDwgMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfRE1JQzJfQ1RMLAorCQkweDBFLCBtYWRfZG1pY19jdGxfdmFsIDw8IDEpOworCisJaWYgKGRtaWNfY2xrX2RydiA9PSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8yKQorCQlhbmNfY3RsX3ZhbHVlID0gV0NEOTM0WF9BTkNfRE1JQ19YMl9GVUxMX1JBVEU7CisJZWxzZQorCQlhbmNfY3RsX3ZhbHVlID0gV0NEOTM0WF9BTkNfRE1JQ19YMl9IQUxGX1JBVEU7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19BTkMwX01PREVfMl9DVEwsCisJCQkgICAgMHg0MCwgYW5jX2N0bF92YWx1ZSA8PCA2KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19BTkMwX01PREVfMl9DVEwsCisJCQkgICAgMHgyMCwgYW5jX2N0bF92YWx1ZSA8PCA1KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMl9DVEwsCisJCQkgICAgMHg0MCwgYW5jX2N0bF92YWx1ZSA8PCA2KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMl9DVEwsCisJCQkgICAgMHgyMCwgYW5jX2N0bF92YWx1ZSA8PCA1KTsKKworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX2NkY192b3RlX3N2cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgdm90ZSkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJldHVybiB0YXZpbF92b3RlX3N2cyh0YXZpbCwgdm90ZSk7Cit9CisKK3N0cnVjdCB3Y2RfZHNwX2NkY19jYiBjZGNfY2IgPSB7CisJLmNkY19jbGtfZW4gPSB0YXZpbF9jb2RlY19pbnRlcm5hbF9yY29fY3RybCwKKwkuY2RjX3ZvdGVfc3ZzID0gdGF2aWxfY2RjX3ZvdGVfc3ZzLAorfTsKKworc3RhdGljIGludCB0YXZpbF93ZHNwX2luaXRpYWxpemUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwlzdHJ1Y3Qgd2NkX2RzcF9wYXJhbXMgcGFyYW1zOworCWludCByZXQgPSAwOworCisJY29udHJvbCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwYXJhbXMuY2IgPSAmY2RjX2NiOworCXBhcmFtcy5pcnFzLmNwZV9pcGMxX2lycSA9IFdDRDkzNFhfSVJRX0NQRTFfSU5UUjsKKwlwYXJhbXMuaXJxcy5jcGVfZXJyX2lycSA9IFdDRDkzNFhfSVJRX0NQRV9FUlJPUjsKKwlwYXJhbXMuaXJxcy5mYXRhbF9pcnFzID0gQ1BFX0ZBVEFMX0lSUVM7CisJcGFyYW1zLmNsa19yYXRlID0gY29udHJvbC0+bWNsa19yYXRlOworCXBhcmFtcy5kc3BfaW5zdGFuY2UgPSAwOworCisJd2NkX2RzcF9jbnRsX2luaXQoY29kZWMsICZwYXJhbXMsICZ0YXZpbC0+d2RzcF9jbnRsKTsKKwlpZiAoIXRhdmlsLT53ZHNwX2NudGwpIHsKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IHdjZC1kc3AtY29udHJvbCBpbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGF2aWxfc29jX2dldF9tYmhjOiBnZXQgd2NkOTM0eF9tYmhjIGhhbmRsZSBvZiBjb3JyZXNwb25kaW5nIGNvZGVjCisgKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKKyAqCisgKiByZXR1cm4gd2NkOTM0eF9tYmhjIGhhbmRsZSBvciBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp0YXZpbF9zb2NfZ2V0X21iaGMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMsIE5VTEwgY29kZWNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoIXRhdmlsKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zLCBOVUxMIHRhdmlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiB0YXZpbC0+bWJoYzsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfc29jX2dldF9tYmhjKTsKKworc3RhdGljIHZvaWQgdGF2aWxfbWNsazJfcmVnX2RlZmF1bHRzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0YXZpbC0+Y29kZWM7CisKKwlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkgeworCQkvKiBNQ0xLMiBjb25maWd1cmF0aW9uICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX2NvZGVjX21jbGsyXzFfMF9kZWZhdWx0cyk7IGkrKykKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCXRhdmlsX2NvZGVjX21jbGsyXzFfMF9kZWZhdWx0c1tpXS5yZWcsCisJCQkJCXRhdmlsX2NvZGVjX21jbGsyXzFfMF9kZWZhdWx0c1tpXS5tYXNrLAorCQkJCQl0YXZpbF9jb2RlY19tY2xrMl8xXzBfZGVmYXVsdHNbaV0udmFsKTsKKwl9CisJaWYgKFRBVklMX0lTXzFfMSh0YXZpbC0+d2NkOXh4eCkpIHsKKwkJLyogTUNMSzIgY29uZmlndXJhdGlvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9jb2RlY19tY2xrMl8xXzFfZGVmYXVsdHMpOyBpKyspCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQl0YXZpbF9jb2RlY19tY2xrMl8xXzFfZGVmYXVsdHNbaV0ucmVnLAorCQkJCQl0YXZpbF9jb2RlY19tY2xrMl8xXzFfZGVmYXVsdHNbaV0ubWFzaywKKwkJCQkJdGF2aWxfY29kZWNfbWNsazJfMV8xX2RlZmF1bHRzW2ldLnZhbCk7CisJfQorfQorCitzdGF0aWMgaW50IHRhdmlsX2RldmljZV9kb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqcHJpdjsKKwlpbnQgY291bnQ7CisKKwljb2RlYyA9IChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKSh3Y2Q5eHh4LT5zc3JfcHJpdik7CisJcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN3cm1fd2NkX25vdGlmeShwcml2LT5zd3IuY3RybF9kYXRhWzBdLnN3cl9wZGV2LAorCQkJU1dSX0RFVklDRV9ET1dOLCBOVUxMKTsKKwl0YXZpbF9kc2RfcmVzZXQocHJpdi0+ZHNkX2NvbmZpZyk7CisJc25kX3NvY19jYXJkX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29kZWMtPmNvbXBvbmVudC5jYXJkLCAwKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fQ09ERUNfREFJUzsgY291bnQrKykKKwkJcHJpdi0+ZGFpW2NvdW50XS5idXNfZG93bl9pbl9yZWNvdmVyeSA9IHRydWU7CisJd2NkX2RzcF9zc3JfZXZlbnQocHJpdi0+d2RzcF9jbnRsLCBXQ0RfQ0RDX0RPV05fRVZFTlQpOworCXdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjX2xvY2tlZChwcml2LT5yZXNtZ3IsCisJCQkJCSAgICAgU0lET19TT1VSQ0VfSU5URVJOQUwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfcG9zdF9yZXNldF9jYihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7CisKKwljb2RlYyA9IChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKSh3Y2Q5eHh4LT5zc3JfcHJpdik7CisJdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXZpbC0+d2NkOXh4eCwKKwkJCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKKwkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKKworCW11dGV4X2xvY2soJnRhdmlsLT5jb2RlY19tdXRleCk7CisJLyoKKwkgKiBDb2RlYyBoYXJkd2FyZSBieSBkZWZhdWx0IGNvbWVzIHVwIGluIFNWUyBtb2RlLgorCSAqIEluaXRpYWxpemUgdGhlIHN2c19yZWZfY250IHRvIDEgdG8gcmVmbGVjdCB0aGUgaGFyZHdhcmUKKwkgKiBzdGF0ZSBpbiB0aGUgZHJpdmVyLgorCSAqLworCXRhdmlsLT5zdnNfcmVmX2NudCA9IDE7CisKKwl0YXZpbF9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9pbnRmZGV2X2xhID0KKwkJCQljb250cm9sLT5zbGltX3NsYXZlLT5sYWRkcjsKKwl0YXZpbF9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9wZ2RfbGEgPQorCQkJCQljb250cm9sLT5zbGltLT5sYWRkcjsKKwl0YXZpbF9pbml0X3NsaW1fc2xhdmVfY2ZnKGNvZGVjKTsKKwlzbmRfc29jX2NhcmRfY2hhbmdlX29ubGluZV9zdGF0ZShjb2RlYy0+Y29tcG9uZW50LmNhcmQsIDEpOworCisJLyogQ2xhc3MtSCBJbml0ICovCisJd2NkX2Nsc2hfaW5pdCgmdGF2aWwtPmNsc2hfZCk7CisJLyogRGVmYXVsdCBIUEggTW9kZSB0byBDbGFzcy1IIExPSGlGaSAqLworCXRhdmlsLT5ocGhfbW9kZSA9IENMU19IX0xPSElGSTsKKworCWZvciAoaSA9IDA7IGkgPCBUQVZJTF9NQVhfTUlDQklBUzsgaSsrKQorCQl0YXZpbC0+bWljYl9yZWZbaV0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IENPTVBBTkRFUl9NQVg7IGkrKykKKwkJdGF2aWwtPmNvbXBfZW5hYmxlZFtpXSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTUNMSyBSYXRlID0gJXhcbiIsCisJCV9fZnVuY19fLCBjb250cm9sLT5tY2xrX3JhdGUpOworCisJaWYgKGNvbnRyb2wtPm1jbGtfcmF0ZSA9PSBXQ0Q5MzRYX01DTEtfQ0xLXzEyUDI4OE1IWikKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAorCQkJCSAgICAweDAzLCAweDAwKTsKKwllbHNlIGlmIChjb250cm9sLT5tY2xrX3JhdGUgPT0gV0NEOTM0WF9NQ0xLX0NMS185UDZNSFopCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCQkgICAgMHgwMywgMHgwMSk7CisJd2NkX3Jlc21ncl9wb3N0X3Nzcl92Mih0YXZpbC0+cmVzbWdyKTsKKwl0YXZpbF91cGRhdGVfcmVnX2RlZmF1bHRzKHRhdmlsKTsKKwl0YXZpbF9jb2RlY19pbml0X3JlZyh0YXZpbCk7CisJX190YXZpbF9lbmFibGVfZWZ1c2Vfc2Vuc2luZyh0YXZpbCk7CisJdGF2aWxfbWNsazJfcmVnX2RlZmF1bHRzKHRhdmlsKTsKKworCV9fdGF2aWxfY2RjX21jbGtfZW5hYmxlKHRhdmlsLCB0cnVlKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KGNvZGVjLT5jb21wb25lbnQucmVnbWFwKTsKKwlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb21wb25lbnQucmVnbWFwKTsKKwlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOworCisJdGF2aWxfdXBkYXRlX2Nwcl9kZWZhdWx0cyh0YXZpbCk7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlyZXQgPSB0YXZpbF9oYW5kbGVfcGRhdGEodGF2aWwsIHBkYXRhKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIHBkYXRhXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCisJbWJoYyA9ICZ0YXZpbC0+bWJoYy0+d2NkX21iaGM7CisJcmV0ID0gdGF2aWxfbWJoY19wb3N0X3Nzcl9pbml0KHRhdmlsLT5tYmhjLCBjb2RlYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQl0YXZpbF9tYmhjX2hzX2RldGVjdChjb2RlYywgbWJoYy0+bWJoY19jZmcpOworCX0KKworCS8qIERTRCBpbml0aWFsaXphdGlvbiAqLworCXJldCA9IHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0KHRhdmlsLT5kc2RfY29uZmlnKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogRFNEIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwl0YXZpbF9jbGVhbnVwX2lycXModGF2aWwpOworCXJldCA9IHRhdmlsX3NldHVwX2lycXModGF2aWwpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHRhdmlsIGlycSBzZXR1cCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXRhdmlsX3NldF9zcGtyX21vZGUoY29kZWMsIHRhdmlsLT5zd3Iuc3Brcl9tb2RlKTsKKwkvKgorCSAqIE9uY2UgdGhlIGNvZGVjIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIHN2cyB2b3RlCisJICogY2FuIGJlIHJlbGVhc2VkIGFsbG93aW5nIHRoZSBjb2RlYyB0byBnbyB0byBTVlMyLgorCSAqLworCXRhdmlsX3ZvdGVfc3ZzKHRhdmlsLCBmYWxzZSk7CisJd2NkX2RzcF9zc3JfZXZlbnQodGF2aWwtPndkc3BfY250bCwgV0NEX0NEQ19VUF9FVkVOVCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfc29jX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IHdjZDl4eHggKmNvbnRyb2w7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlpbnQgaSwgcmV0OworCXZvaWQgKnB0ciA9IE5VTEw7CisKKwljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOworCXRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdGF2aWwtPmludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOworCisJY29udHJvbC0+ZGV2X2Rvd24gPSB0YXZpbF9kZXZpY2VfZG93bjsKKwljb250cm9sLT5wb3N0X3Jlc2V0ID0gdGF2aWxfcG9zdF9yZXNldF9jYjsKKwljb250cm9sLT5zc3JfcHJpdiA9ICh2b2lkICopY29kZWM7CisKKwkvKiBSZXNvdXJjZSBNYW5hZ2VyIHBvc3QgSW5pdCAqLworCXJldCA9IHdjZF9yZXNtZ3JfcG9zdF9pbml0KHRhdmlsLT5yZXNtZ3IsICZ0YXZpbF9yZXNtZ3JfY2IsIGNvZGVjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3Y2QgcmVzbWdyIHBvc3QgaW5pdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBDbGFzcy1IIEluaXQgKi8KKwl3Y2RfY2xzaF9pbml0KCZ0YXZpbC0+Y2xzaF9kKTsKKwkvKiBEZWZhdWx0IEhQSCBNb2RlIHRvIENsYXNzLUggTG93IEhpRmkgKi8KKwl0YXZpbC0+aHBoX21vZGUgPSBDTFNfSF9MT0hJRkk7CisKKwl0YXZpbC0+ZndfZGF0YSA9IGRldm1fa3phbGxvYyhjb2RlYy0+ZGV2LCBzaXplb2YoKih0YXZpbC0+ZndfZGF0YSkpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghdGF2aWwtPmZ3X2RhdGEpCisJCWdvdG8gZXJyOworCisJc2V0X2JpdChXQ0Q5WFhYX0FOQ19DQUwsIHRhdmlsLT5md19kYXRhLT5jYWxfYml0KTsKKwlzZXRfYml0KFdDRDlYWFhfTUJIQ19DQUwsIHRhdmlsLT5md19kYXRhLT5jYWxfYml0KTsKKwlzZXRfYml0KFdDRDlYWFhfTUFEX0NBTCwgdGF2aWwtPmZ3X2RhdGEtPmNhbF9iaXQpOworCXNldF9iaXQoV0NEOVhYWF9WQkFUX0NBTCwgdGF2aWwtPmZ3X2RhdGEtPmNhbF9iaXQpOworCisJcmV0ID0gd2NkX2NhbF9jcmVhdGVfaHdkZXAodGF2aWwtPmZ3X2RhdGEsCisJCQkJICAgV0NEOVhYWF9DT0RFQ19IV0RFUF9OT0RFLCBjb2RlYyk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIGh3ZGVwIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2h3ZGVwOworCX0KKworCS8qIEluaXRpYWxpemUgTUJIQyBtb2R1bGUgKi8KKwlyZXQgPSB0YXZpbF9tYmhjX2luaXQoJnRhdmlsLT5tYmhjLCBjb2RlYywgdGF2aWwtPmZ3X2RhdGEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfaHdkZXA7CisJfQorCisJdGF2aWwtPmNvZGVjID0gY29kZWM7CisJZm9yIChpID0gMDsgaSA8IENPTVBBTkRFUl9NQVg7IGkrKykKKwkJdGF2aWwtPmNvbXBfZW5hYmxlZFtpXSA9IDA7CisKKwl0YXZpbF9jb2RlY19pbml0X3JlZyh0YXZpbCk7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwlyZXQgPSB0YXZpbF9oYW5kbGVfcGRhdGEodGF2aWwsIHBkYXRhKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGJhZCBwZGF0YVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9od2RlcDsKKwl9CisKKwlwdHIgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgKHNpemVvZih0YXZpbF9yeF9jaHMpICsKKwkJCSAgIHNpemVvZih0YXZpbF90eF9jaHMpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaHdkZXA7CisJfQorCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgdGF2aWxfc2xpbV9hdWRpb19tYXAsCisJCQlBUlJBWV9TSVpFKHRhdmlsX3NsaW1fYXVkaW9fbWFwKSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFQ19EQUlTOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhdmlsLT5kYWlbaV0ud2NkOXh4eF9jaF9saXN0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmdGF2aWwtPmRhaVtpXS5kYWlfd2FpdCk7CisJfQorCXRhdmlsX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X2ludGZkZXZfbGEgPQorCQkJCWNvbnRyb2wtPnNsaW1fc2xhdmUtPmxhZGRyOworCXRhdmlsX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X3BnZF9sYSA9CisJCQkJY29udHJvbC0+c2xpbS0+bGFkZHI7CisJdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9wb3J0X21hcHBpbmdbMF0gPQorCQkJCVdDRDkzNFhfVFgxMzsKKwl0YXZpbF9pbml0X3NsaW1fc2xhdmVfY2ZnKGNvZGVjKTsKKworCWNvbnRyb2wtPm51bV9yeF9wb3J0ID0gV0NEOTM0WF9SWF9NQVg7CisJY29udHJvbC0+cnhfY2hzID0gcHRyOworCW1lbWNweShjb250cm9sLT5yeF9jaHMsIHRhdmlsX3J4X2Nocywgc2l6ZW9mKHRhdmlsX3J4X2NocykpOworCWNvbnRyb2wtPm51bV90eF9wb3J0ID0gV0NEOTM0WF9UWF9NQVg7CisJY29udHJvbC0+dHhfY2hzID0gcHRyICsgc2l6ZW9mKHRhdmlsX3J4X2Nocyk7CisJbWVtY3B5KGNvbnRyb2wtPnR4X2NocywgdGF2aWxfdHhfY2hzLCBzaXplb2YodGF2aWxfdHhfY2hzKSk7CisKKwlyZXQgPSB0YXZpbF9zZXR1cF9pcnFzKHRhdmlsKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiB0YXZpbCBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX3BkYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBXQ0Q5MzRYX05VTV9ERUNJTUFUT1JTOyBpKyspIHsKKwkJdGF2aWwtPnR4X2hwZl93b3JrW2ldLnRhdmlsID0gdGF2aWw7CisJCXRhdmlsLT50eF9ocGZfd29ya1tpXS5kZWNpbWF0b3IgPSBpOworCQlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnR4X2hwZl93b3JrW2ldLmR3b3JrLAorCQkJCSAgdGF2aWxfdHhfaHBmX2Nvcm5lcl9mcmVxX2NhbGxiYWNrKTsKKworCQl0YXZpbC0+dHhfbXV0ZV9kd29ya1tpXS50YXZpbCA9IHRhdmlsOworCQl0YXZpbC0+dHhfbXV0ZV9kd29ya1tpXS5kZWNpbWF0b3IgPSBpOworCQlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnR4X211dGVfZHdvcmtbaV0uZHdvcmssCisJCQkJICB0YXZpbF90eF9tdXRlX3VwZGF0ZV9jYWxsYmFjayk7CisJfQorCisJdGF2aWwtPnNwa19hbmNfZHdvcmsudGF2aWwgPSB0YXZpbDsKKwlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnNwa19hbmNfZHdvcmsuZHdvcmssCisJCQkgIHRhdmlsX3Nwa19hbmNfdXBkYXRlX2NhbGxiYWNrKTsKKworCXRhdmlsX21jbGsyX3JlZ19kZWZhdWx0cyh0YXZpbCk7CisKKwkvKiBEU0QgaW5pdGlhbGl6YXRpb24gKi8KKwl0YXZpbC0+ZHNkX2NvbmZpZyA9IHRhdmlsX2RzZF9pbml0KGNvZGVjKTsKKwlpZiAoSVNfRVJSX09SX05VTEwodGF2aWwtPmRzZF9jb25maWcpKQorCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogRFNEIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgU1BLMSBQQSIpOworCW11dGV4X3VubG9jaygmdGF2aWwtPmNvZGVjX211dGV4KTsKKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMSBQbGF5YmFjayIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMSBDYXB0dXJlIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYyIFBsYXliYWNrIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYyIENhcHR1cmUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjMgUGxheWJhY2siKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjMgQ2FwdHVyZSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBQbGF5YmFjayIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklmZWVkIik7CisKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKworCXRhdmlsX3dkc3BfaW5pdGlhbGl6ZShjb2RlYyk7CisKKwkvKgorCSAqIE9uY2UgdGhlIGNvZGVjIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIHN2cyB2b3RlCisJICogY2FuIGJlIHJlbGVhc2VkIGFsbG93aW5nIHRoZSBjb2RlYyB0byBnbyB0byBTVlMyLgorCSAqLworCXRhdmlsX3ZvdGVfc3ZzKHRhdmlsLCBmYWxzZSk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfcGRhdGE6CisJZGV2bV9rZnJlZShjb2RlYy0+ZGV2LCBwdHIpOworCWNvbnRyb2wtPnJ4X2NocyA9IE5VTEw7CisJY29udHJvbC0+dHhfY2hzID0gTlVMTDsKK2Vycl9od2RlcDoKKwlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHRhdmlsLT5md19kYXRhKTsKKwl0YXZpbC0+ZndfZGF0YSA9IE5VTEw7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXZpbF9zb2NfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IHdjZDl4eHggKmNvbnRyb2w7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJZGV2bV9rZnJlZShjb2RlYy0+ZGV2LCBjb250cm9sLT5yeF9jaHMpOworCWNvbnRyb2wtPnJ4X2NocyA9IE5VTEw7CisJY29udHJvbC0+dHhfY2hzID0gTlVMTDsKKwl0YXZpbF9jbGVhbnVwX2lycXModGF2aWwpOworCisJaWYgKHRhdmlsLT53ZHNwX2NudGwpCisJCXdjZF9kc3BfY250bF9kZWluaXQoJnRhdmlsLT53ZHNwX2NudGwpOworCisJLyogRGVpbml0aWFsaXplIE1CSEMgbW9kdWxlICovCisJdGF2aWxfbWJoY19kZWluaXQoY29kZWMpOworCXRhdmlsLT5tYmhjID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ21hcCAqdGF2aWxfZ2V0X3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdjZDl4eHggKmNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCisJcmV0dXJuIGNvbnRyb2wtPnJlZ21hcDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3RhdmlsID0geworCS5jb250cm9scyA9IHRhdmlsX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0YXZpbF9zbmRfY29udHJvbHMpLAorCS5nZXRfcmVnbWFwID0gdGF2aWxfZ2V0X3JlZ21hcCwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLnByb2JlID0gdGF2aWxfc29jX2NvZGVjX3Byb2JlLAorCQkucmVtb3ZlID0gdGF2aWxfc29jX2NvZGVjX3JlbW92ZSwKKwkJLmRhcG1fd2lkZ2V0cyA9IHRhdmlsX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRhdmlsX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9IHRhdmlsX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGF2aWxfYXVkaW9fbWFwKSwKKwl9LAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0YXZpbF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIXRhdmlsKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IHRhdmlsIHByaXZhdGUgZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gc3VzcGVuZFxuIiwgX19mdW5jX18pOworCWlmIChkZWxheWVkX3dvcmtfcGVuZGluZygmdGF2aWwtPnBvd2VyX2dhdGVfd29yaykgJiYKKwkgICAgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0YXZpbC0+cG93ZXJfZ2F0ZV93b3JrKSkKKwkJdGF2aWxfY29kZWNfcG93ZXJfZ2F0ZV9kaWdpdGFsX2NvcmUodGF2aWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhdmlsX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCF0YXZpbCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiB0YXZpbCBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RiZyhkZXYsICIlczogc3lzdGVtIHJlc3VtZVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdGF2aWxfcG1fb3BzID0geworCS5zdXNwZW5kID0gdGF2aWxfc3VzcGVuZCwKKwkucmVzdW1lID0gdGF2aWxfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRhdmlsX3N3cm1fcmVhZCh2b2lkICpoYW5kbGUsIGludCByZWcpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OworCXVuc2lnbmVkIHNob3J0IHN3cl9yZF9hZGRyX2Jhc2U7CisJdW5zaWduZWQgc2hvcnQgc3dyX3JkX2RhdGFfYmFzZTsKKwlpbnQgdmFsLCByZXQ7CisKKwlpZiAoIWhhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKiloYW5kbGU7CisJd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OworCisJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IFJlYWRpbmcgc291bmR3aXJlIHJlZ2lzdGVyLCAweCV4XG4iLAorCQlfX2Z1bmNfXywgcmVnKTsKKwlzd3JfcmRfYWRkcl9iYXNlID0gV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzA7CisJc3dyX3JkX2RhdGFfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wOworCisJbXV0ZXhfbG9jaygmdGF2aWwtPnN3ci5yZWFkX211dGV4KTsKKwlyZXQgPSByZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9hZGRyX2Jhc2UsCisJCQkJICh1OCAqKSZyZWcsIDQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBSRCBBZGRyIEZhaWx1cmVcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHdjZDl4eHgtPnJlZ21hcCwgc3dyX3JkX2RhdGFfYmFzZSwKKwkJCQkodTggKikmdmFsLCA0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogUkQgRGF0YSBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gdmFsOworZG9uZToKKwltdXRleF91bmxvY2soJnRhdmlsLT5zd3IucmVhZF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX3N3cm1fYnVsa193cml0ZSh2b2lkICpoYW5kbGUsIHUzMiAqcmVnLCB1MzIgKnZhbCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWc7CisJdW5zaWduZWQgc2hvcnQgc3dyX3dyX2FkZHJfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfZGF0YV9iYXNlOworCWludCBpLCBqLCByZXQ7CisKKwlpZiAoIWhhbmRsZSB8fCAhcmVnIHx8ICF2YWwpIHsKKwkJcHJfZXJyKCIlczogTlVMTCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZW4gPD0gMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNpemU6ICV6dVxuIiwgX19mdW5jX18sIGxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0YXZpbCA9IChzdHJ1Y3QgdGF2aWxfcHJpdiAqKWhhbmRsZTsKKwl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7CisKKwlzd3Jfd3JfYWRkcl9iYXNlID0gV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzA7CisJc3dyX3dyX2RhdGFfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wOworCisJYnVsa19yZWcgPSBremFsbG9jKCgyICogbGVuICogc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X3JlZ192YWwpKSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghYnVsa19yZWcpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAobGVuICogMik7IGkgKz0gMiwgaisrKSB7CisJCWJ1bGtfcmVnW2ldLnJlZyA9IHN3cl93cl9kYXRhX2Jhc2U7CisJCWJ1bGtfcmVnW2ldLmJ1ZiA9ICh1OCAqKSgmdmFsW2pdKTsKKwkJYnVsa19yZWdbaV0uYnl0ZXMgPSA0OworCQlidWxrX3JlZ1tpKzFdLnJlZyA9IHN3cl93cl9hZGRyX2Jhc2U7CisJCWJ1bGtfcmVnW2krMV0uYnVmID0gKHU4ICopKCZyZWdbal0pOworCQlidWxrX3JlZ1tpKzFdLmJ5dGVzID0gNDsKKwl9CisKKwltdXRleF9sb2NrKCZ0YXZpbC0+c3dyLndyaXRlX211dGV4KTsKKwlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywKKwkJCSAobGVuICogMiksIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBzd3JtIGJ1bGsgd3JpdGUgZmFpbGVkLCByZXQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfQorCW11dGV4X3VubG9jaygmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7CisKKwlrZnJlZShidWxrX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0YXZpbF9zd3JtX3dyaXRlKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJdW5zaWduZWQgc2hvcnQgc3dyX3dyX2FkZHJfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfZGF0YV9iYXNlOworCXN0cnVjdCB3Y2Q5eHh4X3JlZ192YWwgYnVsa19yZWdbMl07CisJaW50IHJldDsKKworCWlmICghaGFuZGxlKSB7CisJCXByX2VycigiJXM6IE5VTEwgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0YXZpbCA9IChzdHJ1Y3QgdGF2aWxfcHJpdiAqKWhhbmRsZTsKKwl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7CisKKwlzd3Jfd3JfYWRkcl9iYXNlID0gV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzA7CisJc3dyX3dyX2RhdGFfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wOworCisJLyogRmlyc3QgV3JpdGUgdGhlIERhdGEgdG8gcmVnaXN0ZXIgKi8KKwlidWxrX3JlZ1swXS5yZWcgPSBzd3Jfd3JfZGF0YV9iYXNlOworCWJ1bGtfcmVnWzBdLmJ1ZiA9ICh1OCAqKSgmdmFsKTsKKwlidWxrX3JlZ1swXS5ieXRlcyA9IDQ7CisJYnVsa19yZWdbMV0ucmVnID0gc3dyX3dyX2FkZHJfYmFzZTsKKwlidWxrX3JlZ1sxXS5idWYgPSAodTggKikoJnJlZyk7CisJYnVsa19yZWdbMV0uYnl0ZXMgPSA0OworCisJbXV0ZXhfbG9jaygmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7CisJcmV0ID0gd2NkOXh4eF9zbGltX2J1bGtfd3JpdGUod2NkOXh4eCwgYnVsa19yZWcsIDIsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IFdSIERhdGEgRmFpbHVyZVxuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRhdmlsX3N3cm1fY2xvY2sodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisKKwlpZiAoIWhhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKiloYW5kbGU7CisKKwltdXRleF9sb2NrKCZ0YXZpbC0+c3dyLmNsa19tdXRleCk7CisJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IHN3cm0gY2xvY2sgJXNcbiIsCisJCV9fZnVuY19fLCAoZW5hYmxlPyJlbmFibGUiIDogImRpc2FibGUiKSk7CisJaWYgKGVuYWJsZSkgeworCQl0YXZpbC0+c3dyLmNsa191c2VycysrOworCQlpZiAodGF2aWwtPnN3ci5jbGtfdXNlcnMgPT0gMSkgeworCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkJCVdDRDkzNFhfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSwKKwkJCQkJMHgxMCwgMHgwMCk7CisJCQlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgdHJ1ZSk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKKwkJCQlXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsCisJCQkJMHgwMSwgMHgwMSk7CisJCX0KKwl9IGVsc2UgeworCQl0YXZpbC0+c3dyLmNsa191c2Vycy0tOworCQlpZiAodGF2aWwtPnN3ci5jbGtfdXNlcnMgPT0gMCkgeworCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MLAorCQkJCTB4MDEsIDB4MDApOworCQkJX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGZhbHNlKTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAorCQkJCQlXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEsCisJCQkJCTB4MTAsIDB4MTApOworCQl9CisJfQorCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBzd3JtIGNsb2NrIHVzZXJzICVkXG4iLAorCQlfX2Z1bmNfXywgdGF2aWwtPnN3ci5jbGtfdXNlcnMpOworCW11dGV4X3VubG9jaygmdGF2aWwtPnN3ci5jbGtfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfc3dybV9oYW5kbGVfaXJxKHZvaWQgKmhhbmRsZSwKKwkJCQkgaXJxcmV0dXJuX3QgKCpzd3JtX2lycV9oYW5kbGVyKShpbnQgaXJxLAorCQkJCQkJCQkgdm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnN3cm1faGFuZGxlLAorCQkJCSBpbnQgYWN0aW9uKQoreworCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKKworCWlmICghaGFuZGxlKSB7CisJCXByX2VycigiJXM6IE5VTEwgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0YXZpbCA9IChzdHJ1Y3QgdGF2aWxfcHJpdiAqKSBoYW5kbGU7CisJd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OworCisJaWYgKGFjdGlvbikgeworCQlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKCZ3Y2Q5eHh4LT5jb3JlX3JlcywKKwkJCQkJICBXQ0Q5MzRYX0lSUV9TT1VORFdJUkUsCisJCQkJCSAgc3dybV9pcnFfaGFuZGxlciwKKwkJCQkJICAiVGF2aWwgU1dSIE1hc3RlciIsIHN3cm1faGFuZGxlKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsCisJCQkJX19mdW5jX18sIFdDRDkzNFhfSVJRX1NPVU5EV0lSRSk7CisJfSBlbHNlCisJCXdjZDl4eHhfZnJlZV9pcnEoJndjZDl4eHgtPmNvcmVfcmVzLCBXQ0Q5MzRYX0lSUV9TT1VORFdJUkUsCisJCQkJIHN3cm1faGFuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX2NvZGVjX2FkZF9zcGlfZGV2aWNlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwl1MzIgcHJvcF92YWx1ZTsKKwlpbnQgcmM7CisKKwkvKiBSZWFkIHRoZSBtYXN0ZXIgYnVzIG51bSBmcm9tIERUIG5vZGUgKi8KKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJxY29tLG1hc3Rlci1idXMtbnVtIiwKKwkJCQkgICZwcm9wX3ZhbHVlKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogcHJvcCAlcyBub3QgZm91bmQgaW4gbm9kZSAlcyIsCisJCQlfX2Z1bmNfXywgInFjb20sbWFzdGVyLWJ1cy1udW0iLCBub2RlLT5mdWxsX25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogR2V0IHRoZSByZWZlcmVuY2UgdG8gU1BJIG1hc3RlciAqLworCW1hc3RlciA9IHNwaV9idXNudW1fdG9fbWFzdGVyKHByb3BfdmFsdWUpOworCWlmICghbWFzdGVyKSB7CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIHNwaV9tYXN0ZXIgZm9yIGJ1c19udW0gJXVcbiIsCisJCQlfX2Z1bmNfXywgcHJvcF92YWx1ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgc3BpIGRldmljZSAqLworCXNwaSA9IHNwaV9hbGxvY19kZXZpY2UobWFzdGVyKTsKKwlpZiAoIXNwaSkgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogc3BpX2FsbG9jX2RldmljZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3NwaV9hbGxvY19kZXY7CisJfQorCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgcHJvcGVydGllcyAqLworCWlmIChvZl9tb2RhbGlhc19ub2RlKG5vZGUsIHNwaS0+bW9kYWxpYXMsCisJCQkgICAgIHNpemVvZihzcGktPm1vZGFsaWFzKSkgPCAwKSB7CisJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBjYW5ub3QgZmluZCBtb2RhbGlhcyBmb3IgJXNcbiIsCisJCQlfX2Z1bmNfXywgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZ290byBlcnJfZHRfcGFyc2U7CisJfQorCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxjaGlwLXNlbGVjdCIsCisJCQkJICAmcHJvcF92YWx1ZSk7CisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IHByb3AgJXMgbm90IGZvdW5kIGluIG5vZGUgJXMiLAorCQkJX19mdW5jX18sICJxY29tLGNoaXAtc2VsZWN0Iiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZ290byBlcnJfZHRfcGFyc2U7CisJfQorCXNwaS0+Y2hpcF9zZWxlY3QgPSBwcm9wX3ZhbHVlOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxtYXgtZnJlcXVlbmN5IiwKKwkJCQkgICZwcm9wX3ZhbHVlKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogcHJvcCAlcyBub3QgZm91bmQgaW4gbm9kZSAlcyIsCisJCQlfX2Z1bmNfXywgInFjb20sbWF4LWZyZXF1ZW5jeSIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gZXJyX2R0X3BhcnNlOworCX0KKwlzcGktPm1heF9zcGVlZF9oeiA9IHByb3BfdmFsdWU7CisKKwlzcGktPmRldi5vZl9ub2RlID0gbm9kZTsKKworCXJjID0gc3BpX2FkZF9kZXZpY2Uoc3BpKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogc3BpX2FkZF9kZXZpY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2R0X3BhcnNlOworCX0KKworCS8qIFB1dCB0aGUgcmVmZXJlbmNlIHRvIFNQSSBtYXN0ZXIgKi8KKwlwdXRfZGV2aWNlKCZtYXN0ZXItPmRldik7CisKKwlyZXR1cm47CisKK2Vycl9kdF9wYXJzZToKKwlzcGlfZGV2X3B1dChzcGkpOworCitlcnJfc3BpX2FsbG9jX2RldjoKKwkvKiBQdXQgdGhlIHJlZmVyZW5jZSB0byBTUEkgbWFzdGVyICovCisJcHV0X2RldmljZSgmbWFzdGVyLT5kZXYpOworZG9uZToKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisJc3RydWN0IHRhdmlsX3N3cl9jdHJsX2RhdGEgKnN3cl9jdHJsX2RhdGEgPSBOVUxMLCAqdGVtcDsKKwlpbnQgcmV0LCBjdHJsX251bSA9IDA7CisJc3RydWN0IHdjZF9zd3JfY3RybF9wbGF0Zm9ybV9kYXRhICpwbGF0ZGF0YTsKKwljaGFyIHBsYXRfZGV2X25hbWVbV0NEOTM0WF9TVFJJTkdfTEVOXTsKKworCXRhdmlsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0YXZpbF9wcml2LAorCQkJICAgICB0YXZpbF9hZGRfY2hpbGRfZGV2aWNlc193b3JrKTsKKwlpZiAoIXRhdmlsKSB7CisJCXByX2VycigiJXM6IE1lbW9yeSBmb3IgV0NEOTM0WCBkb2VzIG5vdCBleGlzdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7CisJaWYgKCF3Y2Q5eHh4KSB7CisJCXByX2VycigiJXM6IE1lbW9yeSBmb3IgV0NEOVhYWCBkb2VzIG5vdCBleGlzdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXdjZDl4eHgtPmRldi0+b2Zfbm9kZSkgeworCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBEVCBub2RlIGZvciB3Y2Q5eHh4IGRvZXMgbm90IGV4aXN0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcGxhdGRhdGEgPSAmdGF2aWwtPnN3ci5wbGF0X2RhdGE7CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHdjZDl4eHgtPmRldi0+b2Zfbm9kZSwgbm9kZSkgeworCisJCS8qIFBhcnNlIGFuZCBhZGQgdGhlIFNQSSBkZXZpY2Ugbm9kZSAqLworCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAid2NkX3NwaSIpKSB7CisJCQl0YXZpbF9jb2RlY19hZGRfc3BpX2RldmljZSh0YXZpbCwgbm9kZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFBhcnNlIG90aGVyIGNoaWxkIGRldmljZSBub2RlcyBhbmQgYWRkIHBsYXRmb3JtIGRldmljZSAqLworCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpKQorCQkJc3RybGNweShwbGF0X2Rldl9uYW1lLCAidGF2aWxfc3dyX2N0cmwiLAorCQkJCShXQ0Q5MzRYX1NUUklOR19MRU4gLSAxKSk7CisJCWVsc2UgaWYgKHN0cm5zdHIobm9kZS0+bmFtZSwgIm1zbV9jZGNfcGluY3RybCIsCisJCQkJIHN0cmxlbigibXNtX2NkY19waW5jdHJsIikpICE9IE5VTEwpCisJCQlzdHJsY3B5KHBsYXRfZGV2X25hbWUsIG5vZGUtPm5hbWUsCisJCQkJKFdDRDkzNFhfU1RSSU5HX0xFTiAtIDEpKTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhwbGF0X2Rldl9uYW1lLCAtMSk7CisJCWlmICghcGRldikgeworCQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogcGRldiBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9tZW07CisJCX0KKwkJcGRldi0+ZGV2LnBhcmVudCA9IHRhdmlsLT5kZXY7CisJCXBkZXYtPmRldi5vZl9ub2RlID0gbm9kZTsKKworCQlpZiAoc3RyY21wKG5vZGUtPm5hbWUsICJzd3JfbWFzdGVyIikgPT0gMCkgeworCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBsYXRkYXRhLAorCQkJCQkJICAgICAgIHNpemVvZigqcGxhdGRhdGEpKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSIlczogY2Fubm90IGFkZCBwbGF0IGRhdGEgY3RybDolZFxuIiwKKwkJCQkJX19mdW5jX18sIGN0cmxfbnVtKTsKKwkJCQlnb3RvIGVycl9wZGV2X2FkZDsKKwkJCX0KKwkJfQorCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiJXM6IENhbm5vdCBhZGQgcGxhdGZvcm0gZGV2aWNlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX3BkZXZfYWRkOworCQl9CisKKwkJaWYgKHN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpID09IDApIHsKKwkJCXRlbXAgPSBrcmVhbGxvYyhzd3JfY3RybF9kYXRhLAorCQkJCQkoY3RybF9udW0gKyAxKSAqIHNpemVvZigKKwkJCQkJc3RydWN0IHRhdmlsX3N3cl9jdHJsX2RhdGEpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghdGVtcCkgeworCQkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycl9wZGV2X2FkZDsKKwkJCX0KKwkJCXN3cl9jdHJsX2RhdGEgPSB0ZW1wOworCQkJc3dyX2N0cmxfZGF0YVtjdHJsX251bV0uc3dyX3BkZXYgPSBwZGV2OworCQkJY3RybF9udW0rKzsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCQkiJXM6IEFkZGVkIHNvdW5kd2lyZSBjdHJsIGRldmljZShzKVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQl0YXZpbC0+c3dyLmN0cmxfZGF0YSA9IHN3cl9jdHJsX2RhdGE7CisJCX0KKwl9CisKKwlyZXR1cm47CisKK2Vycl9wZGV2X2FkZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworZXJyX21lbToKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX190YXZpbF9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCit7CisJaW50IHZhbCwgcmM7CisKKwlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgdHJ1ZSk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKKwkJCVdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMLCAweDFFLCAweDEwKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKKwkJCVdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMLCAweDAxLCAweDAxKTsKKworCS8qCisJICogNW1zIHNsZWVwIHJlcXVpcmVkIGFmdGVyIGVuYWJsaW5nIGVmdXNlIGNvbnRyb2wKKwkgKiBiZWZvcmUgY2hlY2tpbmcgdGhlIHN0YXR1cy4KKwkgKi8KKwl1c2xlZXBfcmFuZ2UoNTAwMCwgNTUwMCk7CisJcmMgPSByZWdtYXBfcmVhZCh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAorCQkJIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTLCAmdmFsKTsKKwlpZiAocmMgfHwgKCEodmFsICYgMHgwMSkpKQorCQlXQVJOKDEsICIlczogRWZ1c2Ugc2Vuc2UgaXMgbm90IGNvbXBsZXRlIHZhbD0leCwgcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHZhbCwgcmMpOworCisJX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGZhbHNlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19fdGF2aWxfZ2V0X2NvZGVjX2ZpbmVfdmVyc2lvbihzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCit7CisJaW50IHZhbDEsIHZhbDIsIHZlcnNpb247CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXUxNiBpZF9taW5vcjsKKwl1MzIgdmVyc2lvbl9tYXNrID0gMDsKKworCXJlZ21hcCA9IHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXA7CisJdmVyc2lvbiA9IHRhdmlsLT53Y2Q5eHh4LT52ZXJzaW9uOworCWlkX21pbm9yID0gdGF2aWwtPndjZDl4eHgtPmNvZGVjX3R5cGUtPmlkX21pbm9yOworCisJcmVnbWFwX3JlYWQocmVnbWFwLCBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNCwgJnZhbDEpOworCXJlZ21hcF9yZWFkKHJlZ21hcCwgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTUsICZ2YWwyKTsKKworCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBjaGlwIHZlcnNpb24gOjB4JXggMHg6JXhcbiIsCisJCV9fZnVuY19fLCB2YWwxLCB2YWwyKTsKKworCXZlcnNpb25fbWFzayB8PSAoISEoKHU4KXZhbDEgJiAweDgwKSkgPDwgRFNEX0RJU0FCTEVEX01BU0s7CisJdmVyc2lvbl9tYXNrIHw9ICghISgodTgpdmFsMiAmIDB4MDEpKSA8PCBTTE5RX0RJU0FCTEVEX01BU0s7CisKKwlzd2l0Y2ggKHZlcnNpb25fbWFzaykgeworCWNhc2UgRFNEX0RJU0FCTEVEIHwgU0xOUV9ESVNBQkxFRDoKKwkJaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDApKQorCQkJdmVyc2lvbiA9IFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzA7CisJCWVsc2UgaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDB4MDEpKQorCQkJdmVyc2lvbiA9IFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzE7CisJCWJyZWFrOworCWNhc2UgU0xOUV9ESVNBQkxFRDoKKwkJaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDApKQorCQkJdmVyc2lvbiA9IFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzA7CisJCWVsc2UgaWYgKGlkX21pbm9yID09IGNwdV90b19sZTE2KDB4MDEpKQorCQkJdmVyc2lvbiA9IFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzE7CisJCWJyZWFrOworCX0KKworCXRhdmlsLT53Y2Q5eHh4LT52ZXJzaW9uID0gdmVyc2lvbjsKKwl0YXZpbC0+d2NkOXh4eC0+Y29kZWNfdHlwZS0+dmVyc2lvbiA9IHZlcnNpb247Cit9CisKKy8qCisgKiB0YXZpbF9nZXRfd2NkX2RzcF9jbnRsOiBHZXQgdGhlIHJlZmVyZW5jZSB0byB3Y2RfZHNwX2NudGwKKyAqIEBkZXY6IERldmljZSBwb2ludGVyIGZvciBjb2RlYyBkZXZpY2UKKyAqCisgKiBUaGlzIEFQSSBnZXRzIHRoZSByZWZlcmVuY2UgdG8gY29kZWMncyBzdHJ1Y3Qgd2NkX2RzcF9jbnRsCisgKi8KK3N0cnVjdCB3Y2RfZHNwX2NudGwgKnRhdmlsX2dldF93Y2RfZHNwX2NudGwoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCisJaWYgKCFkZXYpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXRhdmlsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gdGF2aWwtPndkc3BfY250bDsKK30KK0VYUE9SVF9TWU1CT0wodGF2aWxfZ2V0X3djZF9kc3BfY250bCk7CisKK3N0YXRpYyBpbnQgdGF2aWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7CisJc3RydWN0IGNsayAqd2NkX2V4dF9jbGs7CisJc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3I7CisJc3RydWN0IHdjZDl4eHhfcG93ZXJfcmVnaW9uICpjZGNfcHdyOworCisJdGF2aWwgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB0YXZpbF9wcml2KSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhdmlsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRhdmlsKTsKKworCXRhdmlsLT53Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXRhdmlsLT5kZXYgPSAmcGRldi0+ZGV2OworCUlOSVRfREVMQVlFRF9XT1JLKCZ0YXZpbC0+cG93ZXJfZ2F0ZV93b3JrLCB0YXZpbF9jb2RlY19wb3dlcl9nYXRlX3dvcmspOworCW11dGV4X2luaXQoJnRhdmlsLT5wb3dlcl9sb2NrKTsKKwlJTklUX1dPUksoJnRhdmlsLT50YXZpbF9hZGRfY2hpbGRfZGV2aWNlc193b3JrLAorCQkgIHRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzKTsKKwltdXRleF9pbml0KCZ0YXZpbC0+bWljYl9sb2NrKTsKKwltdXRleF9pbml0KCZ0YXZpbC0+c3dyLnJlYWRfbXV0ZXgpOworCW11dGV4X2luaXQoJnRhdmlsLT5zd3Iud3JpdGVfbXV0ZXgpOworCW11dGV4X2luaXQoJnRhdmlsLT5zd3IuY2xrX211dGV4KTsKKwltdXRleF9pbml0KCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOworCW11dGV4X2luaXQoJnRhdmlsLT5zdnNfbXV0ZXgpOworCisJLyoKKwkgKiBDb2RlYyBoYXJkd2FyZSBieSBkZWZhdWx0IGNvbWVzIHVwIGluIFNWUyBtb2RlLgorCSAqIEluaXRpYWxpemUgdGhlIHN2c19yZWZfY250IHRvIDEgdG8gcmVmbGVjdCB0aGUgaGFyZHdhcmUKKwkgKiBzdGF0ZSBpbiB0aGUgZHJpdmVyLgorCSAqLworCXRhdmlsLT5zdnNfcmVmX2NudCA9IDE7CisKKwljZGNfcHdyID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24pLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghY2RjX3B3cikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZXNtZ3I7CisJfQorCXRhdmlsLT53Y2Q5eHh4LT53Y2Q5eHh4X3B3cltXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xXSA9IGNkY19wd3I7CisJY2RjX3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19taW4gPSBXQ0Q5MzRYX0RJR19DT1JFX1JFR19NSU47CisJY2RjX3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19tYXggPSBXQ0Q5MzRYX0RJR19DT1JFX1JFR19NQVg7CisJd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGF2aWwtPndjZDl4eHgsCisJCQkJV0NEX1JFR0lPTl9QT1dFUl9DT0xMQVBTRV9SRU1PVkUsCisJCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7CisJLyoKKwkgKiBJbml0IHJlc291cmNlIG1hbmFnZXIgc28gdGhhdCBpZiBjaGlsZCBub2RlcyBzdWNoIGFzIFNvdW5kV2lyZQorCSAqIHJlcXVlc3RzIGZvciBjbG9jaywgcmVzb3VyY2UgbWFuYWdlciBjYW4gaG9ub3IgdGhlIHJlcXVlc3QKKwkgKi8KKwlyZXNtZ3IgPSB3Y2RfcmVzbWdyX2luaXQoJnRhdmlsLT53Y2Q5eHh4LT5jb3JlX3JlcywgTlVMTCk7CisJaWYgKElTX0VSUihyZXNtZ3IpKSB7CisJCXJldCA9IFBUUl9FUlIocmVzbWdyKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHdjZCByZXNtZ3JcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3Jlc21ncjsKKwl9CisJdGF2aWwtPnJlc21nciA9IHJlc21ncjsKKwl0YXZpbC0+c3dyLnBsYXRfZGF0YS5oYW5kbGUgPSAodm9pZCAqKSB0YXZpbDsKKwl0YXZpbC0+c3dyLnBsYXRfZGF0YS5yZWFkID0gdGF2aWxfc3dybV9yZWFkOworCXRhdmlsLT5zd3IucGxhdF9kYXRhLndyaXRlID0gdGF2aWxfc3dybV93cml0ZTsKKwl0YXZpbC0+c3dyLnBsYXRfZGF0YS5idWxrX3dyaXRlID0gdGF2aWxfc3dybV9idWxrX3dyaXRlOworCXRhdmlsLT5zd3IucGxhdF9kYXRhLmNsayA9IHRhdmlsX3N3cm1fY2xvY2s7CisJdGF2aWwtPnN3ci5wbGF0X2RhdGEuaGFuZGxlX2lycSA9IHRhdmlsX3N3cm1faGFuZGxlX2lycTsKKwl0YXZpbC0+c3dyLnNwa3JfZ2Fpbl9vZmZzZXQgPSBXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUXzBfREI7CisKKwkvKiBSZWdpc3RlciBmb3IgQ2xvY2sgKi8KKwl3Y2RfZXh0X2NsayA9IGNsa19nZXQodGF2aWwtPndjZDl4eHgtPmRldiwgIndjZF9jbGsiKTsKKwlpZiAoSVNfRVJSKHdjZF9leHRfY2xrKSkgeworCQlkZXZfZXJyKHRhdmlsLT53Y2Q5eHh4LT5kZXYsICIlczogY2xrIGdldCAlcyBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgIndjZF9leHRfY2xrIik7CisJCWdvdG8gZXJyX2NsazsKKwl9CisJdGF2aWwtPndjZF9leHRfY2xrID0gd2NkX2V4dF9jbGs7CisJc2V0X2JpdChBVURJT19OT01JTkFMLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKKwkvKiBVcGRhdGUgY29kZWMgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMgKi8KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogTUNMSyBSYXRlID0gJXhcbiIsIF9fZnVuY19fLAorCQl0YXZpbC0+d2NkOXh4eC0+bWNsa19yYXRlKTsKKwlpZiAodGF2aWwtPndjZDl4eHgtPm1jbGtfcmF0ZSA9PSBXQ0Q5MzRYX01DTEtfQ0xLXzEyUDI4OE1IWikKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCisJCQkJICAgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAorCQkJCSAgIDB4MDMsIDB4MDApOworCWVsc2UgaWYgKHRhdmlsLT53Y2Q5eHh4LT5tY2xrX3JhdGUgPT0gV0NEOTM0WF9NQ0xLX0NMS185UDZNSFopCisJCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAorCQkJCSAgIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKKwkJCQkgICAweDAzLCAweDAxKTsKKwl0YXZpbF91cGRhdGVfcmVnX2RlZmF1bHRzKHRhdmlsKTsKKwlfX3RhdmlsX2VuYWJsZV9lZnVzZV9zZW5zaW5nKHRhdmlsKTsKKwlfX190YXZpbF9nZXRfY29kZWNfZmluZV92ZXJzaW9uKHRhdmlsKTsKKwl0YXZpbF91cGRhdGVfY3ByX2RlZmF1bHRzKHRhdmlsKTsKKworCS8qIFJlZ2lzdGVyIHdpdGggc29jIGZyYW1ld29yayAqLworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldiwgJnNvY19jb2RlY19kZXZfdGF2aWwsCisJCQkJICB0YXZpbF9kYWksIEFSUkFZX1NJWkUodGF2aWxfZGFpKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ29kZWMgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKKwkJIF9fZnVuY19fKTsKKwkJZ290byBlcnJfY2RjX3JlZzsKKwl9CisJc2NoZWR1bGVfd29yaygmdGF2aWwtPnRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOworCisJcmV0dXJuIHJldDsKKworZXJyX2NkY19yZWc6CisJY2xrX3B1dCh0YXZpbC0+d2NkX2V4dF9jbGspOworZXJyX2NsazoKKwl3Y2RfcmVzbWdyX3JlbW92ZSh0YXZpbC0+cmVzbWdyKTsKK2Vycl9yZXNtZ3I6CisJbXV0ZXhfZGVzdHJveSgmdGF2aWwtPm1pY2JfbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN2c19tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmdGF2aWwtPmNvZGVjX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZ0YXZpbC0+c3dyLnJlYWRfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5zd3Iud3JpdGVfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5zd3IuY2xrX211dGV4KTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHRhdmlsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGF2aWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOworCisJdGF2aWwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIXRhdmlsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5taWNiX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5zdnNfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5jb2RlY19tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN3ci5yZWFkX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZ0YXZpbC0+c3dyLndyaXRlX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZ0YXZpbC0+c3dyLmNsa19tdXRleCk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CisJY2xrX3B1dCh0YXZpbC0+d2NkX2V4dF9jbGspOworCXdjZF9yZXNtZ3JfcmVtb3ZlKHRhdmlsLT5yZXNtZ3IpOworCWlmICh0YXZpbC0+ZHNkX2NvbmZpZykgeworCQl0YXZpbF9kc2RfZGVpbml0KHRhdmlsLT5kc2RfY29uZmlnKTsKKwkJdGF2aWwtPmRzZF9jb25maWcgPSBOVUxMOworCX0KKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHRhdmlsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGF2aWxfY29kZWNfZHJpdmVyID0geworCS5wcm9iZSA9IHRhdmlsX3Byb2JlLAorCS5yZW1vdmUgPSB0YXZpbF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGF2aWxfY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJnRhdmlsX3BtX29wcywKKyNlbmRpZgorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRhdmlsX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiVGF2aWwgQ29kZWMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTcwMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIFdDRDkzNFhfSAorI2RlZmluZSBXQ0Q5MzRYX0gKKworI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmg+CisjaW5jbHVkZSAid2NkOTM0eC1kc3AtY250bC5oIgorI2luY2x1ZGUgIi4uL3djZDl4eHgtY29tbW9uLXYyLmgiCisjaW5jbHVkZSAiLi4vd2NkLW1iaGMtdjIuaCIKKworI2RlZmluZSBXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCAgMHg4MDAKKyNkZWZpbmUgV0NEOTM0WF9TQl9QR0RfUE9SVF9SWF9CQVNFICAgMHg0MAorI2RlZmluZSBXQ0Q5MzRYX1NCX1BHRF9QT1JUX1RYX0JBU0UgICAweDUwCisjZGVmaW5lIFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIgIDE2CisKKyNkZWZpbmUgV0NEOTM0WF9ETUlDX0NMS19ESVZfMiAgMHgwCisjZGVmaW5lIFdDRDkzNFhfRE1JQ19DTEtfRElWXzMgIDB4MQorI2RlZmluZSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl80ICAweDIKKyNkZWZpbmUgV0NEOTM0WF9ETUlDX0NMS19ESVZfNiAgMHgzCisjZGVmaW5lIFdDRDkzNFhfRE1JQ19DTEtfRElWXzggIDB4NAorI2RlZmluZSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8xNiAgMHg1CisjZGVmaW5lIFdDRDkzNFhfRE1JQ19DTEtfRFJJVkVfREVGQVVMVCAweDAyCisKKyNkZWZpbmUgV0NEOTM0WF9BTkNfRE1JQ19YMl9GVUxMX1JBVEUgMQorI2RlZmluZSBXQ0Q5MzRYX0FOQ19ETUlDX1gyX0hBTEZfUkFURSAwCisKKyNkZWZpbmUgVEFWSUxfTUFYX01JQ0JJQVMgNAorI2RlZmluZSBUQVZJTF9OVU1fSU5URVJQT0xBVE9SUyA5CisjZGVmaW5lIE1BWF9PTl9ERU1BTkRfU1VQUExZX05BTUVfTEVOR1RIICAgIDY0CisKKy8qIENvbnZlcnQgZnJvbSB2b3V0IGN0bCB0byBtaWNiaWFzIHZvbHRhZ2UgaW4gbVYgKi8KKyNkZWZpbmUgIFdDRF9WT1VUX0NUTF9UT19NSUNCKHYpICAoMTAwMCArIHYgKiA1MCkKKworLyogRmVhdHVyZSBtYXNrcyB0byBkaXN0aW5ndWlzaCBjb2RlYyB2ZXJzaW9uICovCisjZGVmaW5lIERTRF9ESVNBQkxFRF9NQVNLICAgMAorI2RlZmluZSBTTE5RX0RJU0FCTEVEX01BU0sgIDEKKworI2RlZmluZSBEU0RfRElTQUJMRUQgICAoMSA8PCBEU0RfRElTQUJMRURfTUFTSykKKyNkZWZpbmUgU0xOUV9ESVNBQkxFRCAgKDEgPDwgU0xOUV9ESVNBQkxFRF9NQVNLKQorCisvKiBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBTbGltYnVzIHBvcnQgKi8KK2VudW0geworCVdDRDkzNFhfUlgwID0gMCwKKwlXQ0Q5MzRYX1JYMSwKKwlXQ0Q5MzRYX1JYMiwKKwlXQ0Q5MzRYX1JYMywKKwlXQ0Q5MzRYX1JYNCwKKwlXQ0Q5MzRYX1JYNSwKKwlXQ0Q5MzRYX1JYNiwKKwlXQ0Q5MzRYX1JYNywKKwlXQ0Q5MzRYX1JYX01BWCwKK307CisKK2VudW0geworCVdDRDkzNFhfVFgwID0gMCwKKwlXQ0Q5MzRYX1RYMSwKKwlXQ0Q5MzRYX1RYMiwKKwlXQ0Q5MzRYX1RYMywKKwlXQ0Q5MzRYX1RYNCwKKwlXQ0Q5MzRYX1RYNSwKKwlXQ0Q5MzRYX1RYNiwKKwlXQ0Q5MzRYX1RYNywKKwlXQ0Q5MzRYX1RYOCwKKwlXQ0Q5MzRYX1RYOSwKKwlXQ0Q5MzRYX1RYMTAsCisJV0NEOTM0WF9UWDExLAorCVdDRDkzNFhfVFgxMiwKKwlXQ0Q5MzRYX1RYMTMsCisJV0NEOTM0WF9UWDE0LAorCVdDRDkzNFhfVFgxNSwKKwlXQ0Q5MzRYX1RYX01BWCwKK307CisKK2VudW0geworCUlOVEVSUF9FQVIgPSAwLAorCUlOVEVSUF9IUEhMLAorCUlOVEVSUF9IUEhSLAorCUlOVEVSUF9MTzEsCisJSU5URVJQX0xPMiwKKwlJTlRFUlBfTE8zX05BLCAvKiBMTzMgbm90IGF2YWxpYmxlIGluIFRhdmlsKi8KKwlJTlRFUlBfTE80X05BLAorCUlOVEVSUF9TUEtSMSwKKwlJTlRFUlBfU1BLUjIsCisJSU5URVJQX01BWCwKK307CisKK2VudW0geworCS8qIElOVFJfUkVHIDAgKi8KKwlXQ0Q5MzRYX0lSUV9NSVNDID0gMSwKKwlXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKKwlXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKKwlXQ0Q5MzRYX0lSUV9FQVJfUEFfT0NQX0ZBVUxULAorCVdDRDkzNFhfSVJRX0hQSF9QQV9DTlBMX0NPTVBMRVRFLAorCVdDRDkzNFhfSVJRX0hQSF9QQV9DTlBSX0NPTVBMRVRFLAorCVdDRDkzNFhfSVJRX0VBUl9QQV9DTlBfQ09NUExFVEUsCisJLyogSU5UUl9SRUcgMSAqLworCVdDRDkzNFhfSVJRX01CSENfU1dfREVULAorCVdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsCisJV0NEOTM0WF9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAorCVdDRDkzNFhfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULAorCVdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAorCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzAsCisJV0NEOTM0WF9JUlFfUkVTRVJWRURfMSwKKwlXQ0Q5MzRYX0lSUV9SRVNFUlZFRF8yLAorCS8qIElOVFJfUkVHIDIgKi8KKwlXQ0Q5MzRYX0lSUV9MSU5FX1BBMV9DTlBfQ09NUExFVEUsCisJV0NEOTM0WF9JUlFfTElORV9QQTJfQ05QX0NPTVBMRVRFLAorCVdDRDkzNFhfSVJRX1NMTlFfQU5BTE9HX0VSUk9SLAorCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzMsCisJV0NEOTM0WF9JUlFfU09VTkRXSVJFLAorCVdDRDkzNFhfSVJRX1ZERF9ESUdfUkFNUF9DT01QTEVURSwKKwlXQ0Q5MzRYX0lSUV9SQ09fRVJST1IsCisJV0NEOTM0WF9JUlFfQ1BFX0VSUk9SLAorCS8qIElOVFJfUkVHIDMgKi8KKwlXQ0Q5MzRYX0lSUV9NQURfQVVESU8sCisJV0NEOTM0WF9JUlFfTUFEX0JFQUNPTiwKKwlXQ0Q5MzRYX0lSUV9NQURfVUxUUkFTT1VORCwKKwlXQ0Q5MzRYX0lSUV9WQkFUX0FUVEFDSywKKwlXQ0Q5MzRYX0lSUV9WQkFUX1JFU1RPUkUsCisJV0NEOTM0WF9JUlFfQ1BFMV9JTlRSLAorCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzQsCisJV0NEOTM0WF9JUlFfU0xOUV9ESUdJVEFMLAorCVdDRDkzNFhfTlVNX0lSUVMsCit9OworCisvKgorICogU2VsZWN0cyBjb21wYW5kZXIgYW5kIHNtYXJ0IGJvb3N0IHNldHRpbmdzCisgKiBmb3IgYSBnaXZlbiBzcGVha2VyIG1vZGUKKyAqLworZW51bSB7CisJV0NEOTM0WF9TUEtSX01PREVfREVGQVVMVCwKKwlXQ0Q5MzRYX1NQS1JfTU9ERV8xLCAvKiBDT01QIEdhaW4gPSAxMmRCLCBTbWFydGJvb3N0IE1heCA9IDUuNVYgKi8KK307CisKKy8qCisgKiBSeCBwYXRoIGdhaW4gb2Zmc2V0cworICovCitlbnVtIHsKKwlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIsCisJV0NEOTM0WF9SWF9HQUlOX09GRlNFVF8wX0RCLAorfTsKKworLyoKKyAqIERhaSBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUKKyAqIGRhaSBzcGVjaWZpYyBpbmZvIGxpa2UgcmF0ZSwKKyAqIGNoYW5uZWwgbnVtYmVyIGV0Yy4KKyAqLworc3RydWN0IHRhdmlsX2NvZGVjX2RhaV9kYXRhIHsKKwl1MzIgcmF0ZTsKKwl1MzIgKmNoX251bTsKKwl1MzIgY2hfYWN0OworCXUzMiBjaF90b3Q7Cit9OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gdXBkYXRlIGNvZGVjCisgKiByZWdpc3RlciBkZWZhdWx0cyBhZnRlciByZXNldAorICovCitzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHsKKwl1MTYgcmVnOworCXU4IG1hc2s7CisJdTggdmFsOworfTsKKworZXh0ZXJuIHZvaWQgKnRhdmlsX2dldF9hZmVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKK2V4dGVybiBpbnQgdGF2aWxfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpOworZXh0ZXJuIGludCB0YXZpbF9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpOworZXh0ZXJuIGludCB0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBvZmZzZXQpOworZXh0ZXJuIHN0cnVjdCB3Y2RfZHNwX2NudGwgKnRhdmlsX2dldF93Y2RfZHNwX2NudGwoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgd2NkOTM0eF9nZXRfbWljYl92b3V0X2N0bF92YWwodTMyIG1pY2JfbXYpOworZXh0ZXJuIGludCB0YXZpbF9taWNiaWFzX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBpbnQgbWljYl9udW0sCisJCQkJIGludCByZXEsIGJvb2wgaXNfZGFwbSk7CitleHRlcm4gaW50IHRhdmlsX21iaGNfbWljYl9hZGp1c3Rfdm9sdGFnZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgaW50IHJlcV92b2x0LAorCQkJCQkgIGludCBtaWNiX251bSk7CitleHRlcm4gc3RydWN0IHdjZDkzNHhfbWJoYyAqdGF2aWxfc29jX2dldF9tYmhjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitleHRlcm4gaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIGludCBldmVudCwgaW50IGludHBfaWR4KTsKK2V4dGVybiBzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqdGF2aWxfZ2V0X2RzZF9jb25maWcoCisJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2V4dGVybiBpbnQgdGF2aWxfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkoCisJCQkJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpjb2RlY19yb290LAorCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24tdjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24tdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYyZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi12Mi5jCkBAIC0wLDAgKzEsMTI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi12Mi5oIgorCisjZGVmaW5lIFdDRF9VU0xFRVBfUkFOR0UgNTAKKyNkZWZpbmUgTUFYX0lNUEVEX1BBUkFNUyA2CisKK2VudW0geworCURBQ19HQUlOXzBEQiA9IDAsCisJREFDX0dBSU5fMFAyREIsCisJREFDX0dBSU5fMFA0REIsCisJREFDX0dBSU5fMFA2REIsCisJREFDX0dBSU5fMFA4REIsCisJREFDX0dBSU5fTTBQMkRCLAorCURBQ19HQUlOX00wUDREQiwKKwlEQUNfR0FJTl9NMFA2REIsCit9OworCitlbnVtIHsKKwlWUkVGX0ZJTFRfUl8wT0hNID0gMCwKKwlWUkVGX0ZJTFRfUl8yNUtPSE0sCisJVlJFRl9GSUxUX1JfNTBLT0hNLAorCVZSRUZfRklMVF9SXzEwMEtPSE0sCit9OworCitlbnVtIHsKKwlERUxUQV9JXzBNQSwKKwlERUxUQV9JXzEwTUEsCisJREVMVEFfSV8yME1BLAorCURFTFRBX0lfMzBNQSwKKwlERUxUQV9JXzQwTUEsCisJREVMVEFfSV81ME1BLAorfTsKKworc3RydWN0IHdjZF9pbXBlZF92YWwgeworCXUzMiBpbXBlZF92YWw7CisJdTggaW5kZXg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9yZWdfbWFza192YWwgaW1wZWRfdGFibGVbXVtNQVhfSU1QRURfUEFSQU1TXSA9IHsKKwl7CisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjV9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjV9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCisJCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmOX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjl9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9WT0xfQ1RMLCAweGZmLCAweGY5fSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCwgMHhmZiwgMHhmOX0sCisJCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfUEFUSF9TRUMxLCAweDAxLCAweDB9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmF9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZhfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZhfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmJ9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZifSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmJ9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZifSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmN9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZjfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmN9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZjfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmR9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZkfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmR9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZkfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmV9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZlfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmV9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZlfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAorCX0sCisJeworCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmZ9LAorCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZmfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDB9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmZ9LAorCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZmfSwKKwkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDB9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9pbXBlZF92YWwgaW1wZWRfaW5kZXhbXSA9IHsKKwl7NCwgMH0sCisJezUsIDF9LAorCXs2LCAyfSwKKwl7NywgM30sCisJezgsIDR9LAorCXs5LCA1fSwKKwl7MTAsIDZ9LAorCXsxMSwgN30sCisJezEyLCA4fSwKKwl7MTMsIDl9LAorfTsKKworc3RhdGljIHZvaWQgKCpjbHNoX3N0YXRlX2ZwW05VTV9DTFNIX1NUQVRFU19WMl0pKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCisJCQkJCSAgICAgIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqLAorCQkJCQkgICAgICB1OCByZXFfc3RhdGUsIGJvb2wgZW4sIGludCBtb2RlKTsKKworc3RhdGljIGludCBnZXRfaW1wZWRhbmNlX2luZGV4KGludCBpbXBlZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoaW1wZWQgPCBpbXBlZF9pbmRleFtpXS5pbXBlZF92YWwpIHsKKwkJcHJfZGVidWcoIiVzLCBkZXRlY3RlZCBpbXBlZGFuY2UgaXMgbGVzcyB0aGFuIDQgT2htXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJaSA9IDA7CisJCWdvdG8gcmV0OworCX0KKwlpZiAoaW1wZWQgPj0gaW1wZWRfaW5kZXhbQVJSQVlfU0laRShpbXBlZF9pbmRleCkgLSAxXS5pbXBlZF92YWwpIHsKKwkJcHJfZGVidWcoIiVzLCBkZXRlY3RlZCBpbXBlZGFuY2UgaXMgZ3JlYXRlciB0aGFuIDEyIE9obVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWkgPSBBUlJBWV9TSVpFKGltcGVkX2luZGV4KSAtIDE7CisJCWdvdG8gcmV0OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbXBlZF9pbmRleCkgLSAxOyBpKyspIHsKKwkJaWYgKGltcGVkID49IGltcGVkX2luZGV4W2ldLmltcGVkX3ZhbCAmJgorCQkJaW1wZWQgPCBpbXBlZF9pbmRleFtpICsgMV0uaW1wZWRfdmFsKQorCQkJYnJlYWs7CisJfQorcmV0OgorCXByX2RlYnVnKCIlczogc2VsZWN0ZWQgaW1wZWRhbmNlIGluZGV4ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaW1wZWRfaW5kZXhbaV0uaW5kZXgpOworCXJldHVybiBpbXBlZF9pbmRleFtpXS5pbmRleDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB3Y2RfY2xzaF9pbXBlZF9jb25maWcKKyAqIFBhcmFtczogY29kZWMsIGltcGVkLCByZXNldAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgSFBITCBhbmQgSFBIUiBnYWluIHNldHRpbmdzCisgKiBhY2NvcmRpbmcgdG8gdGhlIGltcGVkYW5jZSB2YWx1ZS4KKyAqLwordm9pZCB3Y2RfY2xzaF9pbXBlZF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgaW1wZWQsIGJvb2wgcmVzZXQpCit7CisJaW50IGk7CisJaW50IGluZGV4ID0gMDsKKworCS8qIHJlc2V0ID0gMSwgd2hpY2ggbWVhbnMgcmVxdWVzdCBpcyB0byByZXNldCB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCisJaWYgKHJlc2V0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1QRURfUEFSQU1TOyBpKyspCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpbXBlZF90YWJsZVtpbmRleF1baV0ucmVnLAorCQkJCWltcGVkX3RhYmxlW2luZGV4XVtpXS5tYXNrLCAwKTsKKwkJcmV0dXJuOworCX0KKwlpbmRleCA9IGdldF9pbXBlZGFuY2VfaW5kZXgoaW1wZWQpOworCWlmIChpbmRleCA+PSAoQVJSQVlfU0laRShpbXBlZF9pbmRleCkgLSAxKSkgeworCQlwcl9kZWJ1ZygiJXMsIGltcGVkYW5jZSBub3QgaW4gcmFuZ2UgPSAlZFxuIiwgX19mdW5jX18sIGltcGVkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShpbXBlZF90YWJsZSkpIHsKKwkJcHJfZGVidWcoIiVzLCBpbXBlZGFuY2UgaW5kZXggbm90IGluIHJhbmdlID0gJWRcbiIsIF9fZnVuY19fLAorCQkJaW5kZXgpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1QRURfUEFSQU1TOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGltcGVkX3RhYmxlW2luZGV4XVtpXS5yZWcsCisJCQkJaW1wZWRfdGFibGVbaW5kZXhdW2ldLm1hc2ssCisJCQkJaW1wZWRfdGFibGVbaW5kZXhdW2ldLnZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9jbHNoX2ltcGVkX2NvbmZpZyk7CisKK3N0YXRpYyBib29sIGlzX25hdGl2ZV80NF8xX2FjdGl2ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYm9vbCBuYXRpdmVfYWN0aXZlID0gZmFsc2U7CisJdTggbmF0aXZlX2NsaywgcngxX3JhdGUsIHJ4Ml9yYXRlOworCisJbmF0aXZlX2NsayA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkgV0NEOVhYWF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCk7CisJcngxX3JhdGUgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCk7CisJcngyX3JhdGUgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbmF0aXZlX2NsayAleCByeDFfcmF0ZT0gJXggcngyX3JhdGU9ICV4IiwKKwkJX19mdW5jX18sIG5hdGl2ZV9jbGssIHJ4MV9yYXRlLCByeDJfcmF0ZSk7CisKKwlpZiAoKG5hdGl2ZV9jbGsgJiAweDIpICYmCisJICAgICgocngxX3JhdGUgJiAweDBGKSA9PSAweDkgfHwgKHJ4Ml9yYXRlICYgMHgwRikgPT0gMHg5KSkKKwkJbmF0aXZlX2FjdGl2ZSA9IHRydWU7CisKKwlyZXR1cm4gbmF0aXZlX2FjdGl2ZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVfdG9fc3RyKGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xTX0hfTk9STUFMOgorCQlyZXR1cm4gIkNMU19IX05PUk1BTCI7CisJY2FzZSBDTFNfSF9ISUZJOgorCQlyZXR1cm4gIkNMU19IX0hJRkkiOworCWNhc2UgQ0xTX0hfTE9ISUZJOgorCQlyZXR1cm4gIkNMU19IX0xPSElGSSI7CisJY2FzZSBDTFNfSF9MUDoKKwkJcmV0dXJuICJDTFNfSF9MUCI7CisJY2FzZSBDTFNfSF9VTFA6CisJCXJldHVybiAiQ0xTX0hfVUxQIjsKKwljYXNlIENMU19BQjoKKwkJcmV0dXJuICJDTFNfQUIiOworCWNhc2UgQ0xTX0FCX0hJRkk6CisJCXJldHVybiAiQ0xTX0FCX0hJRkkiOworCWRlZmF1bHQ6CisJCXJldHVybiAiQ0xTX0hfSU5WQUxJRCI7CisJfTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlX3RvX3N0cih1OCBzdGF0ZSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWludCBpOworCWludCBjbnQgPSAwOworCS8qCisJICogVGhpcyBhcnJheSBvZiBzdHJpbmdzIHNob3VsZCBtYXRjaCB3aXRoIGVudW0gd2NkX2Nsc2hfc3RhdGVfYml0LgorCSAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdGF0ZXNbXSA9IHsKKwkJIlNUQVRFX0VBUiIsCisJCSJTVEFURV9IUEhfTCIsCisJCSJTVEFURV9IUEhfUiIsCisJCSJTVEFURV9MTyIsCisJfTsKKworCWlmIChzdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9JRExFKSB7CisJCXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiW1NUQVRFX0lETEVdIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlidWZbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRlcyk7IGkrKykgeworCQlpZiAoIShzdGF0ZSAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQljbnQgPSBzbnByaW50ZihidWYsIGJ1ZmxlbiAtIGNudCAtIDEsICIlcyVzJXMiLCBidWYsCisJCQkgICAgICAgYnVmWzBdID09ICdcMCcgPyAiWyIgOiAifCIsCisJCQkgICAgICAgc3RhdGVzW2ldKTsKKwl9CisJaWYgKGNudCA+IDApCisJCXN0cmxjYXQoYnVmICsgY250LCAiXSIsIGJ1Zmxlbik7CisKK2RvbmU6CisJaWYgKGJ1ZlswXSA9PSAnXDAnKQorCQlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIltTVEFURV9VTktOT1dOXSIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord2NkX2VuYWJsZV9jbHNoX2Jsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJICAgICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsIGJvb2wgZW5hYmxlKQoreworCWlmICgoZW5hYmxlICYmICsrY2xzaF9kLT5jbHNoX3VzZXJzID09IDEpIHx8CisJICAgICghZW5hYmxlICYmIC0tY2xzaF9kLT5jbHNoX3VzZXJzID09IDApKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfQ1JDLCAweDAxLAorCQkJCSAgICAodTgpIGVuYWJsZSk7CisJaWYgKGNsc2hfZC0+Y2xzaF91c2VycyA8IDApCisJCWNsc2hfZC0+Y2xzaF91c2VycyA9IDA7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNsc2hfdXNlcnMgJWQsIGVuYWJsZSAlZCIsIF9fZnVuY19fLAorCQljbHNoX2QtPmNsc2hfdXNlcnMsIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB3Y2RfY2xzaF9lbmFibGVfc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfQ1JDKSAmIDB4MDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdjZF9jbHNoX2dldF9pbnRfbW9kZShzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCQkJaW50IGNsc2hfc3RhdGUpCit7CisJaW50IG1vZGU7CisKKwlpZiAoKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfRUFSKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9IUEhMKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9IUEhSKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9MTykpCisJCW1vZGUgPSBDTFNfTk9ORTsKKwllbHNlCisJCW1vZGUgPSBjbHNoX2QtPmludGVycG9sYXRvcl9tb2Rlc1tmZnMoY2xzaF9zdGF0ZSldOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3Y2RfY2xzaF9zZXRfaW50X21vZGUoc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJCWludCBjbHNoX3N0YXRlLCBpbnQgbW9kZSkKK3sKKwlpZiAoKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfRUFSKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9IUEhMKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9IUEhSKSAmJgorCSAgICAoY2xzaF9zdGF0ZSAhPSBXQ0RfQ0xTSF9TVEFURV9MTykpCisJCXJldHVybjsKKworCWNsc2hfZC0+aW50ZXJwb2xhdG9yX21vZGVzW2ZmcyhjbHNoX3N0YXRlKV0gPSBtb2RlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgPT0gQ0xTX0hfSElGSSB8fCBtb2RlID09IENMU19IX0xPSElGSSB8fAorCSAgICBtb2RlID09IENMU19BQl9ISUZJIHx8IG1vZGUgPT0gQ0xTX0FCKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLAorCQkJCSAgICAweDA4LCAweDA4KTsgLyogc2V0IHRvIEhJRkkgKi8KKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsCisJCQkJICAgIDB4MDgsIDB4MDApOyAvKiBzZXQgdG8gZGVmYXVsdCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgPT0gQ0xTX0hfSElGSSB8fCBtb2RlID09IENMU19IX0xPSElGSSB8fAorCSAgICBtb2RlID09IENMU19BQl9ISUZJIHx8IG1vZGUgPT0gQ0xTX0FCKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLAorCQkJCSAgICAweDA0LCAweDA0KTsgLyogc2V0IHRvIEhJRkkgKi8KKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsCisJCQkJICAgIDB4MDQsIDB4MDApOyAvKiBzZXQgdG8gRGVmYXVsdCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX2Nsc2hfZ20zX2Jvb3N0X2Rpc2FibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgICBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJaWYgKCFJU19DT0RFQ19UWVBFKHdjZDl4eHgsIFdDRDkzNFgpKQorCQlyZXR1cm47CisKKwlpZiAobW9kZSA9PSBDTFNfSF9ISUZJIHx8IG1vZGUgPT0gQ0xTX0hfTE9ISUZJIHx8CisJICAgIG1vZGUgPT0gQ0xTX0FCX0hJRkkgfHwgbW9kZSA9PSBDTFNfQUIpIHsKKwkJaWYgKFRBVklMX0lTXzFfMCh3Y2Q5eHh4KSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX0NOUF9XR19DVEwsCisJCQkJCSAgICAweDgwLCAweDApOyAvKiBkaXNhYmxlIEdNMyBCb29zdCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzQsCisJCQkJICAgIDB4RjAsIDB4ODApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX0NOUF9XR19DVEwsCisJCQkJICAgIDB4ODAsIDB4ODApOyAvKiBzZXQgdG8gRGVmYXVsdCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzQsCisJCQkJICAgIDB4RjAsIDB4NzApOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkX2Nsc2hfZm9yY2VfaXFfY3RsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIGludCBtb2RlKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlpZiAoIUlTX0NPREVDX1RZUEUod2NkOXh4eCwgV0NEOTM0WCkpCisJCXJldHVybjsKKworCWlmIChtb2RlID09IENMU19IX0xPSElGSSB8fCBtb2RlID09IENMU19BQikgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9ORVdfSU5UX1BBX01JU0MyLAorCQkJCSAgICAweDIwLCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9SWF9CSUFTX0hQSF9MT1dQT1dFUiwKKwkJCQkgICAgMHhGMCwgMHhDMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX1BBX0NUTDEsCisJCQkJICAgIDB4MEUsIDB4MDIpOworCX0gZWxzZSB7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9IUEhfTkVXX0lOVF9QQV9NSVNDMiwKKwkJCQkgICAgMHgyMCwgMHgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9SWF9CSUFTX0hQSF9MT1dQT1dFUiwKKwkJCQkgICAgMHhGMCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX1BBX0NUTDEsCisJCQkJICAgIDB4MEUsIDB4MDYpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkX2Nsc2hfYnVja19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCSAgICAgICBpbnQgbW9kZSwKKwkJCSAgICAgICBib29sIGVuYWJsZSkKK3sKKwkvKiBlbmFibGUvZGlzYWJsZSBidWNrICovCisJaWYgKChlbmFibGUgJiYgKCsrY2xzaF9kLT5idWNrX3VzZXJzID09IDEpKSB8fAorCSAgICghZW5hYmxlICYmICgtLWNsc2hfZC0+YnVja191c2VycyA9PSAwKSkpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsCisJCQkJICAgICgxIDw8IDcpLCAoZW5hYmxlIDw8IDcpKTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYnVja191c2VycyAlZCwgZW5hYmxlICVkLCBtb2RlOiAlcyIsCisJCV9fZnVuY19fLCBjbHNoX2QtPmJ1Y2tfdXNlcnMsIGVuYWJsZSwgbW9kZV90b19zdHIobW9kZSkpOworCS8qCisJICogNTAwdXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgYnVjayBlbmFibGUvZGlzYWJsZQorCSAqIGFzIHBlciBIVyByZXF1aXJlbWVudAorCSAqLworCXVzbGVlcF9yYW5nZSg1MDAsIDUwMCArIFdDRF9VU0xFRVBfUkFOR0UpOworfQorCitzdGF0aWMgdm9pZCB3Y2RfY2xzaF9mbHliYWNrX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJICBpbnQgbW9kZSwKKwkJCQkgIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCBidWxrX3JlZ1syXTsKKwl1OCB2bmVnW10gPSB7MHgwMCwgMHg0MH07CisKKwkvKiBlbmFibGUvZGlzYWJsZSBmbHliYWNrICovCisJaWYgKChlbmFibGUgJiYgKCsrY2xzaF9kLT5mbHliYWNrX3VzZXJzID09IDEpKSB8fAorCSAgICghZW5hYmxlICYmICgtLWNsc2hfZC0+Zmx5YmFja191c2VycyA9PSAwKSkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUywKKwkJCQkgICAgKDEgPDwgNiksIChlbmFibGUgPDwgNikpOworCQkvKiAxMDB1c2VjIGRlbGF5IGlzIG5lZWRlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwkJaWYgKGVuYWJsZSAmJiAoVEFTSEFfSVNfMV8xKHdjZDl4eHgpKSkgeworCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfSElGSSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfRU4sCisJCQkJCSAgICAweDYwLCAweDQwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfRkxZQkFDS19FTiwKKwkJCQkJICAgIDB4MTAsIDB4MTApOworCQkJdm5lZ1swXSA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJICAgICAgIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMpOworCQkJdm5lZ1swXSAmPSB+KDB4NDApOworCQkJdm5lZ1sxXSA9IHZuZWdbMF0gfCAweDQwOworCQkJYnVsa19yZWdbMF0ucmVnID0gV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUzsKKwkJCWJ1bGtfcmVnWzBdLmJ1ZiA9ICZ2bmVnWzBdOworCQkJYnVsa19yZWdbMF0uYnl0ZXMgPSAxOworCQkJYnVsa19yZWdbMV0ucmVnID0gV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUzsKKwkJCWJ1bGtfcmVnWzFdLmJ1ZiA9ICZ2bmVnWzFdOworCQkJYnVsa19yZWdbMV0uYnl0ZXMgPSAxOworCQkJLyogNTAwdXNlYyBkZWxheSBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCQl1c2xlZXBfcmFuZ2UoNTAwLCA1MTApOworCQkJd2NkOXh4eF9zbGltX2J1bGtfd3JpdGUod2NkOXh4eCwgYnVsa19yZWcsIDIsCisJCQkJCQlmYWxzZSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfRU4sCisJCQkJCSAgICAweDEwLCAweDAwKTsKKwkJCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIG1vZGUpOworCQl9CisKKwl9CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZseWJhY2tfdXNlcnMgJWQsIGVuYWJsZSAlZCwgbW9kZTogJXMiLAorCQlfX2Z1bmNfXywgY2xzaF9kLT5mbHliYWNrX3VzZXJzLCBlbmFibGUsIG1vZGVfdG9fc3RyKG1vZGUpKTsKKwkvKgorCSAqIDUwMHVzIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIGZseWJhY2sgZW5hYmxlL2Rpc2FibGUKKwkgKiBhcyBwZXIgSFcgcmVxdWlyZW1lbnQKKwkgKi8KKwl1c2xlZXBfcmFuZ2UoNTAwLCA1MDAgKyBXQ0RfVVNMRUVQX1JBTkdFKTsKK30KKworc3RhdGljIHZvaWQgd2NkX2Nsc2hfc2V0X2dhaW5fcGF0aChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgaW50IG1vZGUpCit7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCisJaWYgKCFUQVNIQV9JU18yXzAod2NkOXh4eCkpCisJCXJldHVybjsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xTX0hfTk9STUFMOgorCWNhc2UgQ0xTX0FCOgorCQl2YWwgPSAweDAwOworCQlicmVhazsKKwljYXNlIENMU19IX0hJRkk6CisJCXZhbCA9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgQ0xTX0hfTFA6CisJCXZhbCA9IDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX0xfRU4sIDB4QzAsICh2YWwgPDwgNikpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX1JfRU4sIDB4QzAsICh2YWwgPDwgNikpOworfQorCitzdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfaHBoX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgaW50IG1vZGUpCit7CisJdTggdmFsID0gMDsKKwl1OCBnYWluID0gMDsKKwl1OCByZXNfdmFsID0gVlJFRl9GSUxUX1JfME9ITTsKKwl1OCBpcGVhayA9IERFTFRBX0lfNTBNQTsKKworCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMU19IX05PUk1BTDoKKwkJcmVzX3ZhbCA9IFZSRUZfRklMVF9SXzUwS09ITTsKKwkJdmFsID0gMHgwMDsKKwkJZ2FpbiA9IERBQ19HQUlOXzBEQjsKKwkJaXBlYWsgPSBERUxUQV9JXzUwTUE7CisJCWJyZWFrOworCWNhc2UgQ0xTX0FCOgorCQl2YWwgPSAweDAwOworCQlnYWluID0gREFDX0dBSU5fMERCOworCQlpcGVhayA9IERFTFRBX0lfNTBNQTsKKwkJYnJlYWs7CisJY2FzZSBDTFNfQUJfSElGSToKKwkJdmFsID0gMHgwODsKKwkJYnJlYWs7CisJY2FzZSBDTFNfSF9ISUZJOgorCQl2YWwgPSAweDA4OworCQlnYWluID0gREFDX0dBSU5fTTBQMkRCOworCQlpcGVhayA9IERFTFRBX0lfNTBNQTsKKwkJYnJlYWs7CisJY2FzZSBDTFNfSF9MT0hJRkk6CisJCXZhbCA9IDB4MDA7CisJCWlmICgoSVNfQ09ERUNfVFlQRSh3Y2Q5eHh4LCBXQ0Q5MzM1KSkgfHwKKwkJICAgIChJU19DT0RFQ19UWVBFKHdjZDl4eHgsIFdDRDkzMjYpKSkgeworCQkJdmFsID0gMHgwODsKKwkJCWdhaW4gPSBEQUNfR0FJTl9NMFAyREI7CisJCQlpcGVhayA9IERFTFRBX0lfNTBNQTsKKwkJfQorCQlicmVhazsKKwljYXNlIENMU19IX1VMUDoKKwkJdmFsID0gMHgwQzsKKwkJYnJlYWs7CisJY2FzZSBDTFNfSF9MUDoKKwkJdmFsID0gMHgwNDsKKwkJaXBlYWsgPSBERUxUQV9JXzMwTUE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJLyoKKwkgKiBGb3IgdGF2aWwgc2V0IG1vZGUgdG8gTG93ZXJfcG93ZXIgZm9yCisJICogQ0xTX0hfTE9ISUZJIGFuZCBDTFNfQUIKKwkgKi8KKwlpZiAoKElTX0NPREVDX1RZUEUod2NkOXh4eCwgV0NEOTM0WCkpICYmCisJICAgIChtb2RlID09IENMU19IX0xPSElGSSB8fCBtb2RlID09IENMU19BQikpCisJCXZhbCA9IDB4MDQ7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX0hQSCwgMHgwQywgdmFsKTsKKwlpZiAoVEFTSEFfSVNfMl8wKHdjZDl4eHgpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQ0xBU1NIX0NUUkxfVkNMXzIsCisJCQkJICAgIDB4MzAsIChyZXNfdmFsIDw8IDQpKTsKKwkJaWYgKG1vZGUgIT0gQ0xTX0hfTFApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9SRUZCVUZGX1VIUUFfQ1RMLAorCQkJCQkgICAgMHgwNywgZ2Fpbik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQ0xBU1NIX0NUUkxfQ0NMXzEsCisJCQkJICAgIDB4RjAsIChpcGVhayA8PCA0KSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfZmx5YmFja192bmVnX2N0bChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgYm9vbCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsIDB4RTAsCisJCQkJICAgIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzIsCisJCQkJICAgIDB4RTAsICgweDA3IDw8IDUpKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsIDB4RTAsCisJCQkJICAgICgweDA3IDw8IDUpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8yLAorCQkJCSAgICAweEUwLCAoMHgwMiA8PCA1KSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpCit7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKworCWlmICghVEFTSEFfSVNfMl8wKHdjZDl4eHgpKQorCQlyZXR1cm47CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX1JYX0JJQVNfRkxZQl9CVUZGLCAweDBGLCAweDBBKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX1JYX0JJQVNfRkxZQl9CVUZGLCAweEYwLCAweEEwKTsKKwkvKiBTbGVlcCBuZWVkZWQgdG8gYXZvaWQgY2xpY2sgYW5kIHBvcCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworfQorCitzdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgaW50IG1vZGUpCit7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUywKKwkJCSAgICAweDAyLCAweDAwKTsKK30KKworc3RhdGljIHZvaWQgd2NkX2Nsc2hfc3RhdGVfbG8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkgICAgICB1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKK3sKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCisJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBMTyBjYW5ub3QgYmUgaW4gdGhpcyBtb2RlOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBtb2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpc19lbmFibGUpIHsKKwkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja192bmVnX2N0bChjb2RlYywgdHJ1ZSk7CisJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOworCX0gZWxzZSB7CisJCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7CisJCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX3ZuZWdfY3RsKGNvZGVjLCBmYWxzZSk7CisJCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkX2Nsc2hfc3RhdGVfaHBoX2VhcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJICAgdTggcmVxX3N0YXRlLCBib29sIGlzX2VuYWJsZSwgaW50IG1vZGUpCit7CisJaW50IGhwaF9tb2RlID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKKwkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKGlzX2VuYWJsZSkgeworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0VBUikgeworCQkJLyogSWYgSFBIIGlzIHJ1bm5pbmcgaW4gQ0xTLUFCIHdoZW4KKwkJCSAqIEVBUiBjb21lcywgbGV0IGl0IGNvbnRpbnVlIHRvIHJ1bgorCQkJICogaW4gQ2xhc3MtQUIsIG5vIG5lZWQgdG8gZW5hYmxlIENsYXNzLUgKKwkJCSAqIGZvciBFQVIuCisJCQkgKi8KKwkJCWlmIChjbHNoX2QtPnN0YXRlICYgV0NEX0NMU0hfU1RBVEVfSFBITCkKKwkJCQlocGhfbW9kZSA9IHdjZF9jbHNoX2dldF9pbnRfbW9kZShjbHNoX2QsCisJCQkJCQlXQ0RfQ0xTSF9TVEFURV9IUEhMKTsKKwkJCWVsc2UgaWYgKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhSKQorCQkJCWhwaF9tb2RlID0gd2NkX2Nsc2hfZ2V0X2ludF9tb2RlKGNsc2hfZCwKKwkJCQkJCVdDRF9DTFNIX1NUQVRFX0hQSFIpOworCQkJZWxzZQorCQkJCXJldHVybjsKKwkJCWlmIChocGhfbW9kZSAhPSBDTFNfQUIgJiYgaHBoX21vZGUgIT0gQ0xTX0FCX0hJRkkKKwkJCSAgICAmJiAhaXNfbmF0aXZlXzQ0XzFfYWN0aXZlKGNvZGVjKSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCQkJMHg0MCwgMHg0MCk7CisJCX0KKworCQlpZiAoaXNfbmF0aXZlXzQ0XzFfYWN0aXZlKGNvZGVjKSkgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9DRENfQ0xTSF9IUEhfVl9QQSwgMHgzOSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0NEQ19SWDBfUlhfUEFUSF9TRUMwLAorCQkJCQkweDAzLCAweDAwKTsKKwkJCWlmICgocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpIHx8CisJCQkgICAgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhSKSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCQkJMHg0MCwgMHgwMCk7CisJCX0KKworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHg0MCk7CisJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDQwKTsKKwkJaWYgKChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBITCkgfHwKKwkJICAgIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikpIHsKKwkJCXdjZF9jbHNoX3NldF9nYWluX3BhdGgoY29kZWMsIG1vZGUpOworCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7CisJCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfRUFSKSB7CisJCQkvKgorCQkJICogSWYgRUFSIGdvZXMgYXdheSwgZGlzYWJsZSBFQVIgQ2hhbm5lbCBFbmFibGUKKwkJCSAqIGlmIEhQSCBydW5uaW5nIGluIENsYXNzLUggb3RoZXJ3aXNlCisJCQkgKiBhbmQgaWYgSFBIIHJlcXVlc3RlZCBtb2RlIGlzIENMU19BQiB0aGVuCisJCQkgKiBubyBuZWVkIHRvIGRpc2FibGUgRUFSIGNoYW5uZWwgZW5hYmxlIGJpdC4KKwkJCSAqLworCQkJaWYgKHdjZF9jbHNoX2VuYWJsZV9zdGF0dXMoY29kZWMpKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCisJCQkJCQkweDQwLCAweDAwKTsKKwkJfQorCisJCWlmIChpc19uYXRpdmVfNDRfMV9hY3RpdmUoY29kZWMpKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0NEQ19DTFNIX0hQSF9WX1BBLCAweDFDKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDlYWFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsCisJCQkJCTB4MDMsIDB4MDEpOworCQkJaWYgKCgoY2xzaF9kLT5zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkKKwkJCQkgICE9IFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkgJiYKKwkJCSAgICAoKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKSB8fAorCQkJICAgICAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpKSkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCQkJMHg0MCwgMHg0MCk7CisJCX0KKworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCisJCQkJCTB4NDAsIDB4MDApOworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCTB4NDAsIDB4MDApOworCQlpZiAoKHJlcV9zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkgJiYKKwkJICAgICF3Y2RfY2xzaF9lbmFibGVfc3RhdHVzKGNvZGVjKSkgeworCQkJLyogSWYgQ2xhc3MtSCBpcyBub3QgZW5hYmxlZCB3aGVuIEhQSCBpcyB0dXJuZWQKKwkJCSAqIG9mZiwgZW5hYmxlIGl0IGFzIEVBUiBpcyBpbiBwcm9ncmVzcworCQkJICovCisJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCisJCQkJCTB4NDAsIDB4NDApOworCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKKwkJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2Vhcl9sbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCQkgIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKKwkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKGlzX2VuYWJsZSAmJiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0xPKSkgeworCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywgQ0xTX0FCKTsKKwl9IGVsc2UgeworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0VBUikKKwkJCWdvdG8gZW5kOworCisJCS8qIExPIHBvd2VyZG93bi4KKwkJICogSWYgRUFSIENsYXNzLUggaXMgYWxyZWFkeSBlbmFibGVkLCBqdXN0CisJCSAqIHR1cm4gb24gcmVndWxhdG9yIG90aGVyIGVuYWJsZSBDbGFzcy1ICisJCSAqIGNvbmZpZ3VyYXRpb24KKwkJICovCisJCWlmICh3Y2RfY2xzaF9lbmFibGVfc3RhdHVzKGNvZGVjKSkgeworCQkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsCisJCQkJCUNMU19IX05PUk1BTCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCTB4NDAsIDB4NDApOworCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywKKwkJCQlDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7CisJCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCB0cnVlKTsKKwkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOworCX0KK2VuZDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2hwaF9sbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCQkgIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQoreworCWludCBocGhfbW9kZSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCisJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChpc19lbmFibGUpIHsKKwkJLyoKKwkJICogSWYgcmVxdWVzdGVkIHN0YXRlIGlzIExPLCBwdXQgcmVndWxhdG9yCisJCSAqIGluIGNsYXNzLUFCIG9yIGlmIHJlcXVlc3RlZCBzdGF0ZSBpcyBIUEgsCisJCSAqIHdoaWNoIG1lYW5zIExPIGlzIGFscmVhZHkgZW5hYmxlZCwga2VlcAorCQkgKiB0aGUgcmVndWxhdG9yIGNvbmZpZyB0aGUgc2FtZSBhdCBjbGFzcy1BQgorCQkgKiBhbmQganVzdCBzZXQgdGhlIHBvd2VyIG1vZGVzIGZvciBmbHliYWNrCisJCSAqIGFuZCBidWNrLgorCQkgKi8KKwkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9MTykKKwkJCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLCBDTFNfQUIpOworCQllbHNlIHsKKwkJCWlmICghd2NkX2Nsc2hfZW5hYmxlX3N0YXR1cyhjb2RlYykpIHsKKwkJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJCVdDRDlYWFhfQV9DRENfQ0xTSF9LMV9NU0IsCisJCQkJCQkweDBGLCAweDAwKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX0NEQ19DTFNIX0sxX0xTQiwKKwkJCQkJCTB4RkYsIDB4QzApOworCQkJCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIG1vZGUpOworCQkJCXdjZF9jbHNoX3NldF9mbHliYWNrX3ZuZWdfY3RsKGNvZGVjLCBmYWxzZSk7CisJCQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgbW9kZSk7CisJCQkJd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKGNvZGVjLCBtb2RlKTsKKwkJCQl3Y2RfY2xzaF9zZXRfZ2Fpbl9wYXRoKGNvZGVjLCBtb2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6Y2xzaCBpcyBhbHJlYWR5IGVuYWJsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCX0KKwkJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBITCkKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCisJCQkJCTB4NDAsIDB4NDApOworCQkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhSKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdDRDlYWFhfQV9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwKKwkJCQkJMHg0MCwgMHg0MCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKSB8fAorCQkgICAgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhSKSkgeworCQkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDAwKTsKKwkJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHgwMCk7CisJCQkvKgorCQkJICogSWYgSFBIIGlzIHBvd2VyaW5nIGRvd24gZmlyc3QsIHRoZW4gZGlzYWJsZSBjbHNoLAorCQkJICogc2V0IHRoZSBidWNrL2ZseWJhY2sgbW9kZSB0byBkZWZhdWx0IGFuZCBrZWVwIHRoZQorCQkJICogcmVndWxhdG9yIGF0IENsYXNzLUFCCisJCQkgKi8KKwkJCWlmICgoY2xzaF9kLT5zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkKKwkJCQkhPSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1QpIHsKKwkJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgZmFsc2UpOworCQkJCXdjZF9jbHNoX3NldF9mbHliYWNrX3ZuZWdfY3RsKGNvZGVjLCB0cnVlKTsKKwkJCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQkJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBMTyBwb3dlcmRvd24uCisJCQkgKiBJZiBIUEggbW9kZSBhbHNvIGlzIENMUy1BQiwgbm8gbmVlZAorCQkJICogdG8gdHVybi1vbiBjbGFzcy1ILCBvdGhlcndpc2UgZW5hYmxlCisJCQkgKiBDbGFzcy1IIGNvbmZpZ3VyYXRpb24uCisJCQkgKi8KKwkJCWlmIChjbHNoX2QtPnN0YXRlICYgV0NEX0NMU0hfU1RBVEVfSFBITCkKKwkJCQlocGhfbW9kZSA9IHdjZF9jbHNoX2dldF9pbnRfbW9kZShjbHNoX2QsCisJCQkJCQlXQ0RfQ0xTSF9TVEFURV9IUEhMKTsKKwkJCWVsc2UgaWYgKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhSKQorCQkJCWhwaF9tb2RlID0gd2NkX2Nsc2hfZ2V0X2ludF9tb2RlKGNsc2hfZCwKKwkJCQkJCVdDRF9DTFNIX1NUQVRFX0hQSFIpOworCQkJZWxzZQorCQkJCXJldHVybjsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBocGhfbW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQlocGhfbW9kZSk7CisKKwkJCWlmICgoaHBoX21vZGUgPT0gQ0xTX0FCKSB8fAorCQkJICAgKGhwaF9tb2RlID09IENMU19BQl9ISUZJKSB8fAorCQkJICAgKGhwaF9tb2RlID09IENMU19OT05FKSkKKwkJCQlnb3RvIGVuZDsKKworCQkJLyoKKwkJCSAqIElmIENsYXNzLUggaXMgYWxyZWFkeSBlbmFibGVkIChIUEggT04gYW5kIHRoZW4KKwkJCSAqIExPIE9OKSwgbm8gbmVlZCB0byB0dXJuIG9uIGFnYWluLCBqdXN0IHNldCB0aGUKKwkJCSAqIHJlZ3VsYXRvciBtb2RlLgorCQkJICovCisJCQlpZiAod2NkX2Nsc2hfZW5hYmxlX3N0YXR1cyhjb2RlYykpIHsKKwkJCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywKKwkJCQkJCQkJIGhwaF9tb2RlKTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0gZWxzZSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNsc2ggaXMgbm90IGVuYWJsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCX0KKworCQkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJV0NEOVhYWF9BX0NEQ19DTFNIX0sxX01TQiwKKwkJCQkJMHgwRiwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTFNCLAorCQkJCQkweEZGLCAweEMwKTsKKwkJCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLAorCQkJCQkJCSBocGhfbW9kZSk7CisJCQlpZiAoY2xzaF9kLT5zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSEwpCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJCVdDRDlYWFhfQV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCwKKwkJCQkJCTB4NDAsIDB4NDApOworCQkJaWYgKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhSKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCQkweDQwLCAweDQwKTsKKwkJCXdjZF9jbHNoX3NldF9ocGhfbW9kZShjb2RlYywgaHBoX21vZGUpOworCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2NkX2Nsc2hfc3RhdGVfaHBoX3N0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQkJCSAgdTggcmVxX3N0YXRlLCBib29sIGlzX2VuYWJsZSwgaW50IG1vZGUpCit7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVzLCAlc1xuIiwgX19mdW5jX18sIG1vZGVfdG9fc3RyKG1vZGUpLAorCQlpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisKKwlpZiAobW9kZSA9PSBDTFNfQUIgfHwgbW9kZSA9PSBDTFNfQUJfSElGSSkKKwkJcmV0dXJuOworCisJaWYgKGlzX2VuYWJsZSkgeworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHg0MCk7CisJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDQwKTsKKwl9IGVsc2UgeworCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHgwMCk7CisJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2hwaF9yKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKKwkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKG1vZGUgPT0gQ0xTX0hfTk9STUFMKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBOb3JtYWwgbW9kZSBub3QgYXBwbGljYWJsZSBmb3IgaHBoX3JcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfZW5hYmxlKSB7CisJCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7CisJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCQkvKgorCQkJICogVGhlc2UgSzEgdmFsdWVzIGRlcGVuZCBvbiB0aGUgSGVhZHBob25lIEltcGVkYW5jZQorCQkJICogRm9yIG5vdyBpdCBpcyBhc3N1bWVkIHRvIGJlIDE2IG9obQorCQkJICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTVNCLAorCQkJCQkgICAgMHgwRiwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTFNCLAorCQkJCQkgICAgMHhGRiwgMHhDMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHg0MCk7CisJCX0KKwkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfZ20zX2Jvb3N0X2Rpc2FibGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9mb3JjZV9pcV9jdGwoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9mbHliYWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgbW9kZSwgdHJ1ZSk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX2N1cnJlbnQoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOworCQl3Y2RfY2xzaF9zZXRfaHBoX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZ2Fpbl9wYXRoKGNvZGVjLCBtb2RlKTsKKwl9IGVsc2UgeworCQl3Y2RfY2xzaF9zZXRfaHBoX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisKKwkJaWYgKG1vZGUgIT0gQ0xTX0FCICYmIG1vZGUgIT0gQ0xTX0FCX0hJRkkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDAwKTsKKwkJCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJCX0KKwkJLyogYnVjayBhbmQgZmx5YmFjayBzZXQgdG8gZGVmYXVsdCBtb2RlIGFuZCBkaXNhYmxlICovCisJCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBDTFNfSF9OT1JNQUwsIGZhbHNlKTsKKwkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIENMU19IX05PUk1BTCwgZmFsc2UpOworCQl3Y2RfY2xzaF9mb3JjZV9pcV9jdGwoY29kZWMsIENMU19IX05PUk1BTCk7CisJCXdjZF9jbHNoX2dtM19ib29zdF9kaXNhYmxlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2hwaF9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKKwkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKG1vZGUgPT0gQ0xTX0hfTk9STUFMKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBOb3JtYWwgbW9kZSBub3QgYXBwbGljYWJsZSBmb3IgaHBoX2xcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfZW5hYmxlKSB7CisJCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7CisJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCQkvKgorCQkJICogVGhlc2UgSzEgdmFsdWVzIGRlcGVuZCBvbiB0aGUgSGVhZHBob25lIEltcGVkYW5jZQorCQkJICogRm9yIG5vdyBpdCBpcyBhc3N1bWVkIHRvIGJlIDE2IG9obQorCQkJICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTVNCLAorCQkJCQkgICAgMHgwRiwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTFNCLAorCQkJCQkgICAgMHhGRiwgMHhDMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAorCQkJCQkgICAgMHg0MCwgMHg0MCk7CisJCX0KKwkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfZ20zX2Jvb3N0X2Rpc2FibGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9mb3JjZV9pcV9jdGwoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9mbHliYWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgbW9kZSwgdHJ1ZSk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX2N1cnJlbnQoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBtb2RlKTsKKwkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOworCQl3Y2RfY2xzaF9zZXRfaHBoX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9zZXRfZ2Fpbl9wYXRoKGNvZGVjLCBtb2RlKTsKKwl9IGVsc2UgeworCQl3Y2RfY2xzaF9zZXRfaHBoX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7CisKKwkJaWYgKG1vZGUgIT0gQ0xTX0FCICYmIG1vZGUgIT0gQ0xTX0FCX0hJRkkpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCisJCQkJCSAgICAweDQwLCAweDAwKTsKKwkJCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJCX0KKwkJLyogc2V0IGJ1Y2sgYW5kIGZseWJhY2sgdG8gRGVmYXVsdCBNb2RlICovCisJCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBDTFNfSF9OT1JNQUwsIGZhbHNlKTsKKwkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIENMU19IX05PUk1BTCwgZmFsc2UpOworCQl3Y2RfY2xzaF9mb3JjZV9pcV9jdGwoY29kZWMsIENMU19IX05PUk1BTCk7CisJCXdjZF9jbHNoX2dtM19ib29zdF9kaXNhYmxlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOworCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2VhcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKK3sKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCisJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChtb2RlICE9IENMU19IX05PUk1BTCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMgY2Fubm90IGJlIHVzZWQgZm9yIEVBUlxuIiwKKwkJCV9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfZW5hYmxlKSB7CisJCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCB0cnVlKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCSAgICAweDQwLCAweDQwKTsKKwkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgbW9kZSk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9mbHliYWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgbW9kZSwgdHJ1ZSk7CisJCXdjZF9jbHNoX3NldF9mbHliYWNrX2N1cnJlbnQoY29kZWMsIG1vZGUpOworCQl3Y2RfY2xzaF9idWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgbW9kZSwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAorCQkJCSAgICAweDQwLCAweDAwKTsKKwkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKKwkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIGZhbHNlKTsKKwkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIGZhbHNlKTsKKwkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKKwkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2VycihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKK3sKKwljaGFyIG1zZ1sxMjhdOworCisJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkiJXMgV3JvbmcgcmVxdWVzdCBmb3IgY2xhc3MgSCBzdGF0ZSBtYWNoaW5lIHJlcXVlc3RlZCB0byAlcyAlcyIsCisJCV9fZnVuY19fLCBpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwKKwkJc3RhdGVfdG9fc3RyKHJlcV9zdGF0ZSwgbXNnLCBzaXplb2YobXNnKSkpOworCVdBUk5fT04oMSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogd2NkX2Nsc2hfaXNfc3RhdGVfdmFsaWQKKyAqIFBhcmFtczogc3RhdGUKKyAqIERlc2NyaXB0aW9uOgorICogUHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdmFsaWQgc3RhdGVzIG9mIENsYXNzIEggY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgYm9vbCB3Y2RfY2xzaF9pc19zdGF0ZV92YWxpZCh1OCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXQ0RfQ0xTSF9TVEFURV9JRExFOgorCWNhc2UgV0NEX0NMU0hfU1RBVEVfRUFSOgorCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBITDoKKwljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSFI6CisJY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1Q6CisJY2FzZSBXQ0RfQ0xTSF9TVEFURV9MTzoKKwljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSExfRUFSOgorCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBIUl9FQVI6CisJY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1RfRUFSOgorCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBITF9MTzoKKwljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSFJfTE86CisJY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1RfTE86CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9OworfQorCisvKgorICogRnVuY3Rpb246IHdjZF9jbHNoX2ZzbQorICogUGFyYW1zOiBjb2RlYywgY2RjX2Nsc2hfZCwgcmVxX3N0YXRlLCByZXFfdHlwZSwgY2xzaF9ldmVudAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUFJFIERBQyBhbmQgUE9TVCBEQUMgY29uZGl0aW9ucyBvZiBkaWZmZXJlbnQgZGV2aWNlcworICogYW5kIHVwZGF0ZXMgY2xhc3MgSCBjb25maWd1cmF0aW9uIG9mIGRpZmZlcmVudCBjb21iaW5hdGlvbiBvZiBkZXZpY2VzCisgKiBiYXNlZCBvbiB2YWxpZGl0eSBvZiB0aGVpciBzdGF0ZXMuIGNkY19jbHNoX2Qgd2lsbCBjb250YWluIGN1cnJlbnQKKyAqIGNsYXNzIGggc3RhdGUgaW5mb3JtYXRpb24KKyAqLwordm9pZCB3Y2RfY2xzaF9mc20oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNkY19jbHNoX2QsCisJCXU4IGNsc2hfZXZlbnQsIHU4IHJlcV9zdGF0ZSwKKwkJaW50IGludF9tb2RlKQoreworCXU4IG9sZF9zdGF0ZSwgbmV3X3N0YXRlOworCWNoYXIgbXNnMFsxMjhdLCBtc2cxWzEyOF07CisKKwlzd2l0Y2ggKGNsc2hfZXZlbnQpIHsKKwljYXNlIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUM6CisJCW9sZF9zdGF0ZSA9IGNkY19jbHNoX2QtPnN0YXRlOworCQluZXdfc3RhdGUgPSBvbGRfc3RhdGUgfCByZXFfc3RhdGU7CisKKwkJaWYgKCF3Y2RfY2xzaF9pc19zdGF0ZV92YWxpZChuZXdfc3RhdGUpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBDbGFzcy1IIG5vdCBhIHZhbGlkIG5ldyBzdGF0ZTogJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJc3RhdGVfdG9fc3RyKG5ld19zdGF0ZSwgbXNnMCwgc2l6ZW9mKG1zZzApKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG5ld19zdGF0ZSA9PSBvbGRfc3RhdGUpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IENsYXNzLUggYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGU6ICVzXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0YXRlX3RvX3N0cihuZXdfc3RhdGUsIG1zZzAsIHNpemVvZihtc2cwKSkpOworCQkJcmV0dXJuOworCQl9CisJCWNkY19jbHNoX2QtPnN0YXRlID0gbmV3X3N0YXRlOworCQl3Y2RfY2xzaF9zZXRfaW50X21vZGUoY2RjX2Nsc2hfZCwgcmVxX3N0YXRlLCBpbnRfbW9kZSk7CisJCSgqY2xzaF9zdGF0ZV9mcFtuZXdfc3RhdGVdKSAoY29kZWMsIGNkY19jbHNoX2QsIHJlcV9zdGF0ZSwKKwkJCQkJICAgICBDTFNIX1JFUV9FTkFCTEUsIGludF9tb2RlKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBDbGFzc0ggc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAorCQkJX19mdW5jX18sIHN0YXRlX3RvX3N0cihvbGRfc3RhdGUsIG1zZzAsIHNpemVvZihtc2cwKSksCisJCQlzdGF0ZV90b19zdHIoY2RjX2Nsc2hfZC0+c3RhdGUsIG1zZzEsIHNpemVvZihtc2cxKSkpOworCQlicmVhazsKKwljYXNlIFdDRF9DTFNIX0VWRU5UX1BPU1RfUEE6CisJCW9sZF9zdGF0ZSA9IGNkY19jbHNoX2QtPnN0YXRlOworCQluZXdfc3RhdGUgPSBvbGRfc3RhdGUgJiAofnJlcV9zdGF0ZSk7CisJCWlmIChuZXdfc3RhdGUgPCBOVU1fQ0xTSF9TVEFURVNfVjIpIHsKKwkJCWlmICghd2NkX2Nsc2hfaXNfc3RhdGVfdmFsaWQob2xkX3N0YXRlKSkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIiVzOkludmFsaWQgb2xkIHN0YXRlOiVzXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJc3RhdGVfdG9fc3RyKG9sZF9zdGF0ZSwgbXNnMCwKKwkJCQkJCSAgICAgc2l6ZW9mKG1zZzApKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKG5ld19zdGF0ZSA9PSBvbGRfc3RhdGUpIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSIlczogQ2xhc3MtSCBhbHJlYWR5IGluIHJlcXVlc3RlZCBzdGF0ZTogJXNcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzdGF0ZV90b19zdHIobmV3X3N0YXRlLCBtc2cwLAorCQkJCQkJICAgICBzaXplb2YobXNnMCkpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkoKmNsc2hfc3RhdGVfZnBbb2xkX3N0YXRlXSkgKGNvZGVjLCBjZGNfY2xzaF9kLAorCQkJCQlyZXFfc3RhdGUsIENMU0hfUkVRX0RJU0FCTEUsCisJCQkJCWludF9tb2RlKTsKKwkJCWNkY19jbHNoX2QtPnN0YXRlID0gbmV3X3N0YXRlOworCQkJd2NkX2Nsc2hfc2V0X2ludF9tb2RlKGNkY19jbHNoX2QsIHJlcV9zdGF0ZSwgQ0xTX05PTkUpOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IENsYXNzSCBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gJXMgdG8gJXNcbiIsCisJCQkJX19mdW5jX18sIHN0YXRlX3RvX3N0cihvbGRfc3RhdGUsIG1zZzAsCisJCQkJCQkgICAgICAgc2l6ZW9mKG1zZzApKSwKKwkJCQlzdGF0ZV90b19zdHIoY2RjX2Nsc2hfZC0+c3RhdGUsIG1zZzEsCisJCQkJCSAgICAgc2l6ZW9mKG1zZzEpKSk7CisJCX0KKwkJYnJlYWs7CisJfTsKK30KKworaW50IHdjZF9jbHNoX2dldF9jbHNoX3N0YXRlKHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaCkKK3sKKwlyZXR1cm4gY2xzaC0+c3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9jbHNoX2dldF9jbHNoX3N0YXRlKTsKKwordm9pZCB3Y2RfY2xzaF9pbml0KHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaCkKK3sKKwlpbnQgaTsKKworCWNsc2gtPnN0YXRlID0gV0NEX0NMU0hfU1RBVEVfSURMRTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0xTSF9TVEFURVNfVjI7IGkrKykKKwkJY2xzaF9zdGF0ZV9mcFtpXSA9IHdjZF9jbHNoX3N0YXRlX2VycjsKKworCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfRUFSXSA9IHdjZF9jbHNoX3N0YXRlX2VhcjsKKwljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSExdID0KKwkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9sOworCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBIUl0gPQorCQkJCQkJd2NkX2Nsc2hfc3RhdGVfaHBoX3I7CisJY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhfU1RdID0KKwkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9zdDsKKwljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0xPXSA9IHdjZF9jbHNoX3N0YXRlX2xvOworCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBITF9FQVJdID0KKwkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9lYXI7CisJY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhSX0VBUl0gPQorCQkJCQkJd2NkX2Nsc2hfc3RhdGVfaHBoX2VhcjsKKwljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSF9TVF9FQVJdID0KKwkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9lYXI7CisJY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhMX0xPXSA9IHdjZF9jbHNoX3N0YXRlX2hwaF9sbzsKKwljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSFJfTE9dID0gd2NkX2Nsc2hfc3RhdGVfaHBoX2xvOworCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBIX1NUX0xPXSA9CisJCQkJCQl3Y2RfY2xzaF9zdGF0ZV9ocGhfbG87CisJY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9FQVJfTE9dID0gd2NkX2Nsc2hfc3RhdGVfZWFyX2xvOworCS8qIFNldCBpbnRlcnBvbGFvdHIgbW9kZXMgdG8gTk9ORSAqLworCXdjZF9jbHNoX3NldF9pbnRfbW9kZShjbHNoLCBXQ0RfQ0xTSF9TVEFURV9FQVIsIENMU19OT05FKTsKKwl3Y2RfY2xzaF9zZXRfaW50X21vZGUoY2xzaCwgV0NEX0NMU0hfU1RBVEVfSFBITCwgQ0xTX05PTkUpOworCXdjZF9jbHNoX3NldF9pbnRfbW9kZShjbHNoLCBXQ0RfQ0xTSF9TVEFURV9IUEhSLCBDTFNfTk9ORSk7CisJd2NkX2Nsc2hfc2V0X2ludF9tb2RlKGNsc2gsIFdDRF9DTFNIX1NUQVRFX0xPLCBDTFNfTk9ORSk7CisJY2xzaC0+Zmx5YmFja191c2VycyA9IDA7CisJY2xzaC0+YnVja191c2VycyA9IDA7CisJY2xzaC0+Y2xzaF91c2VycyA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9jbHNoX2luaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIldDRDlYWFggQ29tbW9uIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi12Mi5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2U1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtY29tbW9uLXYyLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9XQ0Q5WFhYX0NPTU1PTl9WMgorCisjZGVmaW5lIF9XQ0Q5WFhYX0NPTU1PTl9WMgorCisjZGVmaW5lIENMU0hfUkVRX0VOQUJMRSB0cnVlCisjZGVmaW5lIENMU0hfUkVRX0RJU0FCTEUgZmFsc2UKKworI2RlZmluZSBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDIDB4MDEKKyNkZWZpbmUgV0NEX0NMU0hfRVZFTlRfUE9TVF9QQSAweDAyCisjZGVmaW5lIE1BWF9WQkFUX01PTklUT1JfV1JJVEVTIDE3CisvKgorICogQmFzaWMgc3RhdGVzIGZvciBDbGFzcyBIIHN0YXRlIG1hY2hpbmUuCisgKiByZXByZXNlbnRlZCBhcyBhIGJpdCBtYXNrIHdpdGhpbiBhIHU4IGRhdGEgdHlwZQorICogYml0IDA6IEVBUiBtb2RlCisgKiBiaXQgMTogSFBIIExlZnQgbW9kZQorICogYml0IDI6IEhQSCBSaWdodCBtb2RlCisgKiBiaXQgMzogTGluZW91dCBtb2RlCisgKi8KKyNkZWZpbmUJV0NEX0NMU0hfU1RBVEVfSURMRSAweDAwCisjZGVmaW5lCVdDRF9DTFNIX1NUQVRFX0VBUiAoMHgwMSA8PCAwKQorI2RlZmluZQlXQ0RfQ0xTSF9TVEFURV9IUEhMICgweDAxIDw8IDEpCisjZGVmaW5lCVdDRF9DTFNIX1NUQVRFX0hQSFIgKDB4MDEgPDwgMikKKyNkZWZpbmUJV0NEX0NMU0hfU1RBVEVfTE8gKDB4MDEgPDwgMykKKyNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfTUFYIDQKKyNkZWZpbmUgTlVNX0NMU0hfU1RBVEVTX1YyICgweDAxIDw8IFdDRF9DTFNIX1NUQVRFX01BWCkKKworCisvKiBEZXJpdmVkIFN0YXRlOiBCaXRzIDEgYW5kIDIgc2hvdWxkIGJlIHNldCBmb3IgSGVhZHBob25lIHN0ZXJlbyAqLworI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1QgKFdDRF9DTFNIX1NUQVRFX0hQSEwgfCBcCisJCQkgICAgICAgV0NEX0NMU0hfU1RBVEVfSFBIUikKKworI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9IUEhMX0xPIChXQ0RfQ0xTSF9TVEFURV9IUEhMIHwgXAorCQkJCSAgICBXQ0RfQ0xTSF9TVEFURV9MTykKKyNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfSFBIUl9MTyAoV0NEX0NMU0hfU1RBVEVfSFBIUiB8IFwKKwkJCQkgICAgV0NEX0NMU0hfU1RBVEVfTE8pCisjZGVmaW5lIFdDRF9DTFNIX1NUQVRFX0hQSF9TVF9MTyAoV0NEX0NMU0hfU1RBVEVfSFBIX1NUIHwgXAorCQkJCSAgICAgIFdDRF9DTFNIX1NUQVRFX0xPKQorI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9FQVJfTE8gKFdDRF9DTFNIX1NUQVRFX0VBUiB8IFwKKwkJCQkgICBXQ0RfQ0xTSF9TVEFURV9MTykKKyNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfSFBITF9FQVIgKFdDRF9DTFNIX1NUQVRFX0hQSEwgfCBcCisJCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIpCisjZGVmaW5lIFdDRF9DTFNIX1NUQVRFX0hQSFJfRUFSIChXQ0RfQ0xTSF9TVEFURV9IUEhSIHwgXAorCQkJCSAgICAgV0NEX0NMU0hfU1RBVEVfRUFSKQorI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1RfRUFSIChXQ0RfQ0xTSF9TVEFURV9IUEhfU1QgfCBcCisJCQkJICAgICAgIFdDRF9DTFNIX1NUQVRFX0VBUikKKworZW51bSB7CisJQ0xTX0hfTk9STUFMID0gMCwgLyogQ2xhc3MtSCBEZWZhdWx0ICovCisJQ0xTX0hfSElGSSwgLyogQ2xhc3MtSCBIaUZpICovCisJQ0xTX0hfTFAsIC8qIENsYXNzLUggTG93IFBvd2VyICovCisJQ0xTX0FCLCAvKiBDbGFzcy1BQiBMb3cgSElGSSovCisJQ0xTX0hfTE9ISUZJLCAvKiBMb0hJRkkgKi8KKwlDTFNfSF9VTFAsIC8qIFVsdHJhIExvdyBwb3dlciAqLworCUNMU19BQl9ISUZJLCAvKiBDbGFzcy1BQiAqLworCUNMU19OT05FLCAvKiBOb25lIG9mIHRoZSBhYm92ZSBtb2RlcyAqLworfTsKKworLyogQ2xhc3MgSCBkYXRhIHRoYXQgdGhlIGNvZGVjIGRyaXZlciB3aWxsIG1haW50YWluICovCitzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgeworCXU4IHN0YXRlOworCWludCBmbHliYWNrX3VzZXJzOworCWludCBidWNrX3VzZXJzOworCWludCBjbHNoX3VzZXJzOworCWludCBpbnRlcnBvbGF0b3JfbW9kZXNbV0NEX0NMU0hfU1RBVEVfTUFYXTsKK307CisKK3N0cnVjdCB3Y2RfbWFkX2F1ZGlvX2hlYWRlciB7CisJdTMyIHJlc2VydmVkWzNdOworCXUzMiBudW1fcmVnX2NmZzsKK307CisKK3N0cnVjdCB3Y2RfbWFkX21pY3JvcGhvbmVfaW5mbyB7CisJdWludDhfdCBpbnB1dF9taWNyb3Bob25lOworCXVpbnQ4X3QgY3ljbGVfdGltZTsKKwl1aW50OF90IHNldHRsZV90aW1lOworCXVpbnQ4X3QgcGFkZGluZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2RfbWFkX21pY2JpYXNfaW5mbyB7CisJdWludDhfdCBtaWNiaWFzOworCXVpbnQ4X3Qga19mYWN0b3I7CisJdWludDhfdCBleHRlcm5hbF9ieXBhc3NfY2FwYWNpdG9yOworCXVpbnQ4X3QgaW50ZXJuYWxfYmlhc2luZzsKKwl1aW50OF90IGNmaWx0ZXI7CisJdWludDhfdCBwYWRkaW5nWzNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHdjZF9tYWRfcm1zX2F1ZGlvX2JlYWNvbl9pbmZvIHsKKwl1aW50OF90IHJtc19vbWl0X3NhbXBsZXM7CisJdWludDhfdCBybXNfY29tcF90aW1lOworCXVpbnQ4X3QgZGV0ZWN0aW9uX21lY2hhbmlzbTsKKwl1aW50OF90IHJtc19kaWZmX3RocmVzaG9sZDsKKwl1aW50OF90IHJtc190aHJlc2hvbGRfbHNiOworCXVpbnQ4X3Qgcm1zX3RocmVzaG9sZF9tc2I7CisJdWludDhfdCBwYWRkaW5nWzJdOworCXVpbnQ4X3QgaWlyX2NvZWZmaWNpZW50c1szNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2NkX21hZF9ybXNfdWx0cmFzb3VuZF9pbmZvIHsKKwl1aW50OF90IHJtc19jb21wX3RpbWU7CisJdWludDhfdCBkZXRlY3Rpb25fbWVjaGFuaXNtOworCXVpbnQ4X3Qgcm1zX2RpZmZfdGhyZXNob2xkOworCXVpbnQ4X3Qgcm1zX3RocmVzaG9sZF9sc2I7CisJdWludDhfdCBybXNfdGhyZXNob2xkX21zYjsKKwl1aW50OF90IHBhZGRpbmdbM107CisJdWludDhfdCBpaXJfY29lZmZpY2llbnRzWzM2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2RfbWFkX2F1ZGlvX2NhbCB7CisJdWludDMyX3QgdmVyc2lvbjsKKwlzdHJ1Y3Qgd2NkX21hZF9taWNyb3Bob25lX2luZm8gbWljcm9waG9uZV9pbmZvOworCXN0cnVjdCB3Y2RfbWFkX21pY2JpYXNfaW5mbyBtaWNiaWFzX2luZm87CisJc3RydWN0IHdjZF9tYWRfcm1zX2F1ZGlvX2JlYWNvbl9pbmZvIGF1ZGlvX2luZm87CisJc3RydWN0IHdjZF9tYWRfcm1zX2F1ZGlvX2JlYWNvbl9pbmZvIGJlYWNvbl9pbmZvOworCXN0cnVjdCB3Y2RfbWFkX3Jtc191bHRyYXNvdW5kX2luZm8gdWx0cmFzb3VuZF9pbmZvOworfSBfX3BhY2tlZDsKKworc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlciB7CisJdTMyIHJlc2VydmVkWzNdOworCXUzMiBudW1fYW5jX3Nsb3RzOworfTsKKworc3RydWN0IHZiYXRfbW9uaXRvcl9yZWcgeworCXUzMiBzaXplOworCXUzMiB3cml0ZXNbTUFYX1ZCQVRfTU9OSVRPUl9XUklURVNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHdjZF9yZWdfbWFza192YWwgeworCXUxNglyZWc7CisJdTgJbWFzazsKKwl1OAl2YWw7Cit9OworCitleHRlcm4gdm9pZCB3Y2RfY2xzaF9mc20oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNkY19jbHNoX2QsCisJCXU4IGNsc2hfZXZlbnQsIHU4IHJlcV9zdGF0ZSwKKwkJaW50IGludF9tb2RlKTsKKworZXh0ZXJuIHZvaWQgd2NkX2Nsc2hfaW5pdChzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2gpOworZXh0ZXJuIGludCB3Y2RfY2xzaF9nZXRfY2xzaF9zdGF0ZShzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2gpOworZXh0ZXJuIHZvaWQgd2NkX2Nsc2hfaW1wZWRfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGltcGVkLAorCQlib29sIHJlc2V0KTsKKworZW51bSB7CisJUkVTRVJWRUQgPSAwLAorCUFBTkNfTFBGX0ZGX0ZCID0gMSwKKwlBQU5DX0xQRl9DT0VGRl9NU0IsCisJQUFOQ19MUEZfQ09FRkZfTFNCLAorCUhXX01BRF9BVURJT19FTkFCTEUsCisJSFdfTUFEX1VMVFJfRU5BQkxFLAorCUhXX01BRF9CRUFDT05fRU5BQkxFLAorCUhXX01BRF9BVURJT19TTEVFUF9USU1FLAorCUhXX01BRF9VTFRSX1NMRUVQX1RJTUUsCisJSFdfTUFEX0JFQUNPTl9TTEVFUF9USU1FLAorCUhXX01BRF9UWF9BVURJT19TV0lUQ0hfT0ZGLAorCUhXX01BRF9UWF9VTFRSX1NXSVRDSF9PRkYsCisJSFdfTUFEX1RYX0JFQUNPTl9TV0lUQ0hfT0ZGLAorCU1BRF9BVURJT19JTlRfREVTVF9TRUxFQ1RfUkVHLAorCU1BRF9VTFRfSU5UX0RFU1RfU0VMRUNUX1JFRywKKwlNQURfQkVBQ09OX0lOVF9ERVNUX1NFTEVDVF9SRUcsCisJTUFEX0NMSVBfSU5UX0RFU1RfU0VMRUNUX1JFRywKKwlWQkFUX0lOVF9ERVNUX1NFTEVDVF9SRUcsCisJTUFEX0FVRElPX0lOVF9NQVNLX1JFRywKKwlNQURfVUxUX0lOVF9NQVNLX1JFRywKKwlNQURfQkVBQ09OX0lOVF9NQVNLX1JFRywKKwlNQURfQ0xJUF9JTlRfTUFTS19SRUcsCisJVkJBVF9JTlRfTUFTS19SRUcsCisJTUFEX0FVRElPX0lOVF9TVEFUVVNfUkVHLAorCU1BRF9VTFRfSU5UX1NUQVRVU19SRUcsCisJTUFEX0JFQUNPTl9JTlRfU1RBVFVTX1JFRywKKwlNQURfQ0xJUF9JTlRfU1RBVFVTX1JFRywKKwlWQkFUX0lOVF9TVEFUVVNfUkVHLAorCU1BRF9BVURJT19JTlRfQ0xFQVJfUkVHLAorCU1BRF9VTFRfSU5UX0NMRUFSX1JFRywKKwlNQURfQkVBQ09OX0lOVF9DTEVBUl9SRUcsCisJTUFEX0NMSVBfSU5UX0NMRUFSX1JFRywKKwlWQkFUX0lOVF9DTEVBUl9SRUcsCisJU0JfUEdEX1BPUlRfVFhfV0FURVJNQVJLX04sCisJU0JfUEdEX1BPUlRfVFhfRU5BQkxFX04sCisJU0JfUEdEX1BPUlRfUlhfV0FURVJNQVJLX04sCisJU0JfUEdEX1BPUlRfUlhfRU5BQkxFX04sCisJU0JfUEdEX1RYX1BPUlRuX01VTFRJX0NITkxfMCwKKwlTQl9QR0RfVFhfUE9SVG5fTVVMVElfQ0hOTF8xLAorCVNCX1BHRF9SWF9QT1JUbl9NVUxUSV9DSE5MXzAsCisJU0JfUEdEX1JYX1BPUlRuX01VTFRJX0NITkxfMSwKKwlBQU5DX0ZGX0dBSU5fQURBUFRJVkUsCisJQUFOQ19GRkdBSU5fQURBUFRJVkVfRU4sCisJQUFOQ19HQUlOX0NPTlRST0wsCisJU1BLUl9DTElQX1BJUEVfQkFOS19TRUwsCisJU1BLUl9DTElQREVUX1ZBTDAsCisJU1BLUl9DTElQREVUX1ZBTDEsCisJU1BLUl9DTElQREVUX1ZBTDIsCisJU1BLUl9DTElQREVUX1ZBTDMsCisJU1BLUl9DTElQREVUX1ZBTDQsCisJU1BLUl9DTElQREVUX1ZBTDUsCisJU1BLUl9DTElQREVUX1ZBTDYsCisJU1BLUl9DTElQREVUX1ZBTDcsCisJVkJBVF9SRUxFQVNFX0lOVF9ERVNUX1NFTEVDVF9SRUcsCisJVkJBVF9SRUxFQVNFX0lOVF9NQVNLX1JFRywKKwlWQkFUX1JFTEVBU0VfSU5UX1NUQVRVU19SRUcsCisJVkJBVF9SRUxFQVNFX0lOVF9DTEVBUl9SRUcsCisJTUFEMl9DTElQX0lOVF9ERVNUX1NFTEVDVF9SRUcsCisJTUFEMl9DTElQX0lOVF9NQVNLX1JFRywKKwlNQUQyX0NMSVBfSU5UX1NUQVRVU19SRUcsCisJTUFEMl9DTElQX0lOVF9DTEVBUl9SRUcsCisJU1BLUjJfQ0xJUF9QSVBFX0JBTktfU0VMLAorCVNQS1IyX0NMSVBERVRfVkFMMCwKKwlTUEtSMl9DTElQREVUX1ZBTDEsCisJU1BLUjJfQ0xJUERFVF9WQUwyLAorCVNQS1IyX0NMSVBERVRfVkFMMywKKwlTUEtSMl9DTElQREVUX1ZBTDQsCisJU1BLUjJfQ0xJUERFVF9WQUw1LAorCVNQS1IyX0NMSVBERVRfVkFMNiwKKwlTUEtSMl9DTElQREVUX1ZBTDcsCisJTUFYX0NGR19SRUdJU1RFUlMsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24uYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJlNjhhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi5jCkBAIC0wLDAgKzEsMTQ4MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi5oIgorCisjZGVmaW5lIENMU0hfQ09NUFVURV9FQVIgMHgwMQorI2RlZmluZSBDTFNIX0NPTVBVVEVfSFBIX0wgMHgwMgorI2RlZmluZSBDTFNIX0NPTVBVVEVfSFBIX1IgMHgwMworCisjZGVmaW5lIEJVQ0tfVlJFRl8wUDQ5NFYgMHgzRgorI2RlZmluZSBCVUNLX1ZSRUZfMlYgMHhGRgorI2RlZmluZSBCVUNLX1ZSRUZfMFA0OTRWIDB4M0YKKyNkZWZpbmUgQlVDS19WUkVGXzFQOFYgMHhFNgorCisjZGVmaW5lIEJVQ0tfU0VUVExFX1RJTUVfVVMgNTAKKyNkZWZpbmUgTkNQX1NFVFRMRV9USU1FX1VTIDUwCisKKyNkZWZpbmUgTUFYX0lNUEVEX1BBUkFNUyAxMworCisjZGVmaW5lIFVTTEVFUF9SQU5HRV9NQVJHSU5fVVMgMTAwCisKK3N0cnVjdCB3Y2Q5eHh4X2ltcGVkX3ZhbCB7CisJdTMyIGltcGVkX3ZhbDsKKwl1OCBpbmRleDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgaW1wZWRfdGFibGVbXVtNQVhfSU1QRURfUEFSQU1TXSA9IHsKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDQ2fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MDR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDExfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHg5Qn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAyfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MDR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDBDfSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4NDd9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDlCfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgwNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MEN9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg0OX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAyfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDM1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHg0RX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDA2fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgwRX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDQ5fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MTZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEFDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4NUZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweENGfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MDZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDBGfSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4NTl9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgxNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4OUN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFCfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhDRX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4QkR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgwN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTB9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg2Nn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA0fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHg5QX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAyfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MkV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEJEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhBNn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDA3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxMX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDc5fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MDR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDExfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgzN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4QTZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEFEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MDh9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDEyfSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4NzZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwNH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDRFfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhBRH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4QUN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgwOX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTJ9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg3OH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxMn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4RDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEFDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxM30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDBBfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxM30sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDdBfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MDZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDE0fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhCN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDE0fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MEJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDE0fSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4NjB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwOX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEE0fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxNH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgwQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTR9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg3OX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDE3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4QUV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFGfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxRH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDBEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxNX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDc4fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MTZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDJDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhBQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MEV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDE2fSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4ODl9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4NDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDEzfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgxMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTZ9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg5N30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhEMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFCfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxQn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDEyfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxN30sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDhBfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MDZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEI3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUJ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDI0fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MTN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDE3fSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4OEF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4QTR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyNH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MjV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgxNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTh9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg5QX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA4fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHhBRX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDI1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDE4fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxOX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweDhCfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MTh9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEFDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxQn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MjB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDJFfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MUF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDE5fSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4OUF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgxN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MTN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFCfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyRX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MkR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgxRH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MUF9LAorCX0sCisJeworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHhBOX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA2fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxNH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MjR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDJEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JRExFX0hQSF9USFNELCAweGZmLCAweDFGfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9IUEhfVEhTRCwgMHhmZiwgMHgxOX0sCisJfSwKKwl7CisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9MLCAweGZmLCAweEI5fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX1UsIDB4ZmYsIDB4MDZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDEwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyNX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MkN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDJDfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfSFBIX1RIU0QsIDB4ZmYsIDB4MjN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0ZDTEtPTkxZX0hQSF9USFNELCAweGZmLCAweDE4fSwKKwl9LAorCXsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9JX1BBX0ZBQ1RfSFBIX0wsIDB4ZmYsIDB4QTl9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfVSwgMHhmZiwgMHgwN30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19BRERSLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MUR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDI3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MzV9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHhmZiwgMHgyNn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4ZmYsIDB4MTZ9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfaW1wZWRfdmFsIGltcGVkX2luZGV4W10gPSB7CisJezQwMDAsIDB9LAorCXs0NTAwLCAxfSwKKwl7NTAwMCwgMn0sCisJezU1MDAsIDN9LAorCXs2MDAwLCA0fSwKKwl7NjUwMCwgNX0sCisJezcwMDAsIDZ9LAorCXs3NzAwLCA3fSwKKwl7ODQ3MCwgOH0sCisJezkzMTcsIDl9LAorCXsxMDI0OCwgMTB9LAorCXsxMTI3MywgMTF9LAorCXsxMjQwMCwgMTJ9LAorCXsxMzY0MSwgMTN9LAorCXsxNTAwNSwgMTR9LAorCXsxNjUwNSwgMTV9LAorCXsxODE1NiwgMTZ9LAorCXsxOTk3MSwgMTd9LAorCXsyMTk2OSwgMTh9LAorCXsyNDE2NSwgMTl9LAorCXsyNjU4MiwgMjB9LAorCXsyOTI0MCwgMjF9LAorCXszMjE2NCwgMjJ9LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkCit3Y2Q5eHh4X2VuYWJsZV9jbHNoX2Jsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLCBib29sIGVuYWJsZSkKK3sKKwlpZiAoKGVuYWJsZSAmJiArK2Nsc2hfZC0+Y2xzaF91c2VycyA9PSAxKSB8fAorCSAgICAoIWVuYWJsZSAmJiAtLWNsc2hfZC0+Y2xzaF91c2VycyA9PSAwKSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0IxX0NUTCwKKwkJCQkgICAgMHgwMSwgZW5hYmxlID8gMHgwMSA6IDB4MDApOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbHNoX3VzZXJzICVkLCBlbmFibGUgJWQiLCBfX2Z1bmNfXywKKwkJY2xzaF9kLT5jbHNoX3VzZXJzLCBlbmFibGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2NkOXh4eF9lbmFibGVfYW5jX2RlbGF5KAorCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlib29sIG9uKQoreworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfQ0xTSF9CMV9DVEwsCisJCTB4MDIsIG9uID8gMHgwMiA6IDB4MDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3djZDl4eHhfZW5hYmxlX2J1Y2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLCBib29sIGVuYWJsZSkKK3sKKwlpZiAoKGVuYWJsZSAmJiArK2Nsc2hfZC0+YnVja191c2VycyA9PSAxKSB8fAorCSAgICAoIWVuYWJsZSAmJiAtLWNsc2hfZC0+YnVja191c2VycyA9PSAwKSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0JVQ0tfTU9ERV8xLAorCQkJCSAgICAweDgwLCBlbmFibGUgPyAweDgwIDogMHgwMCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGJ1Y2tfdXNlcnMgJWQsIGVuYWJsZSAlZCIsIF9fZnVuY19fLAorCQljbHNoX2QtPmJ1Y2tfdXNlcnMsIGVuYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkICgqY2xzaF9zdGF0ZV9mcFtOVU1fQ0xTSF9TVEFURVNdKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICosCisJCQkJCSAgICAgIHU4IHJlcV9zdGF0ZSwgYm9vbCByZXFfdHlwZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV90b19zdHIodTggc3RhdGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlpbnQgaTsKKwlpbnQgY250ID0gMDsKKwkvKgorCSAqIFRoaXMgYXJyYXkgb2Ygc3RyaW5ncyBzaG91bGQgbWF0Y2ggd2l0aCBlbnVtIHdjZDl4eHhfY2xzaF9zdGF0ZV9iaXQuCisJICovCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHN0YXRlc1tdID0geworCQkiU1RBVEVfRUFSIiwKKwkJIlNUQVRFX0hQSF9MIiwKKwkJIlNUQVRFX0hQSF9SIiwKKwkJIlNUQVRFX0xPIiwKKwl9OworCisJaWYgKHN0YXRlID09IFdDRDlYWFhfQ0xTSF9TVEFURV9JRExFKSB7CisJCXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiW1NUQVRFX0lETEVdIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlidWZbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRlcyk7IGkrKykgeworCQlpZiAoIShzdGF0ZSAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQljbnQgPSBzbnByaW50ZihidWYsIGJ1ZmxlbiAtIGNudCAtIDEsICIlcyVzJXMiLCBidWYsCisJCQkgICAgICAgYnVmWzBdID09ICdcMCcgPyAiWyIgOiAifCIsCisJCQkgICAgICAgc3RhdGVzW2ldKTsKKwl9CisJaWYgKGNudCA+IDApCisJCXN0cmxjYXQoYnVmICsgY250LCAiXSIsIGJ1Zmxlbik7CisKK2RvbmU6CisJaWYgKGJ1ZlswXSA9PSAnXDAnKQorCQlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIltTVEFURV9VTktOT1dOXSIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2ZnX2Nsc2hfcGFyYW1fY29tbW9uKAorCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfcmVnX21hc2tfdmFsIHJlZ19zZXRbXSA9IHsKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9CVUNLX05DUF9WQVJTLCAweDMgPDwgMCwgMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSUywgMHgzIDw8IDIsIDEgPDwgMn0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQlVDS19OQ1BfVkFSUywgKDB4MSA8PCA0KSwgMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjJfQ1RMLCAoMHgzIDw8IDApLCAweDAxfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9CMl9DVEwsICgweDMgPDwgMiksICgweDAxIDw8IDIpfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9CMl9DVEwsICgweGYgPDwgNCksICgweDAzIDw8IDQpfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9CM19DVEwsICgweGYgPDwgNCksICgweDAzIDw8IDQpfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9CM19DVEwsICgweGYgPDwgMCksICgweDBCKX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjFfQ1RMLCAoMHgxIDw8IDUpLCAoMHgwMSA8PCA1KX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfQjFfQ1RMLCAoMHgxIDw8IDEpLCAoMHgwMSA8PCAxKX0sCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ19zZXQpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ19zZXRbaV0ucmVnLCByZWdfc2V0W2ldLm1hc2ssCisJCQkJCQkgICAgcmVnX3NldFtpXS52YWwpOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFByb2dyYW1tZWQgY2xhc3MgSCBjb250cm9sbGVyIGNvbW1vbiBwYXJhbWV0ZXJzIiwKKwkJCSBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2hhcmdlcHVtcF9yZXF1ZXN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBvbikKK3sKKwlzdGF0aWMgaW50IGNwX2NvdW50OworCisJaWYgKG9uICYmICgrK2NwX2NvdW50ID09IDEpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfQ0xLX09USFJfQ1RMLAorCQkJCSAgICAweDAxLCAweDAxKTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IENoYXJnZSBQdW1wIGVuYWJsZWQsIGNvdW50ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY3BfY291bnQpOworCX0gZWxzZSBpZiAoIW9uKSB7CisJCWlmICgtLWNwX2NvdW50IDwgMCkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJCSIlczogVW5iYWxhbmNlZCBkaXNhYmxlIGZvciBjaGFyZ2UgcHVtcFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX0NMS19PVEhSX0NUTCkgJgorCQkJICAgIDB4MDEpIHsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJCSIlczogQWN0dWFsIGNoYXJnZXB1bXAgaXMgT05cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCX0KKwkJCWNwX2NvdW50ID0gMDsKKwkJCVdBUk5fT04oMSk7CisJCX0KKworCQlpZiAoY3BfY291bnQgPT0gMCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTEtfT1RIUl9DVEwsCisJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6IENoYXJnZSBwdW1wIGRpc2FibGVkLCBjb3VudCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBjcF9jb3VudCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgd2NkOXh4eF9lbmFibGVfaGlnaF9wZXJmX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXN0cnVjdCB3Y2Q5eHh4X2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCQl1OCB1aHFhX21vZGUsIHU4IHJlcV9zdGF0ZSwgYm9vbCByZXFfdHlwZSkKK3sKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNlcnMgZmNsazggJWQsIGZjbGs1ICVkIiwgX19mdW5jX18sCisJCQljbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF84XSwKKwkJCWNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzVdKTsKKworCWlmIChyZXFfdHlwZSA9PSBXQ0Q5WFhYX0NMU0FCX1JFUV9FTkFCTEUpIHsKKwkJY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfOF0rKzsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9CSUFTX1BBLAorCQkJCQlXQ0Q5WFhYX0FfUlhfSFBIX0JJQVNfUEFfX1BPUik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfTF9QQV9DVEwsIDB4NDgpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX1JfUEFfQ1RMLCAweDQ4KTsKKwkJaWYgKHVocWFfbW9kZSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfQ0hPUF9DVEwsCisJCQkJCQkweDIwLCAweDAwKTsKKwkJd2NkOXh4eF9jaGFyZ2VwdW1wX3JlcXVlc3QoY29kZWMsIHRydWUpOworCQl3Y2Q5eHh4X2VuYWJsZV9hbmNfZGVsYXkoY29kZWMsIHRydWUpOworCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKKwkJaWYgKGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzhdID4gMCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLAorCQkJCQkJMHgwRiwgMHgwOCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDMwLCAweDMwKTsKKworCQkvKiBFbmFibGUgTkNQIGFuZCB3YWl0IHVudGlsIHNldHRsZXMgZG93biAqLworCQlpZiAoc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX05DUF9FTiwgMHgwMSwgMHgwMSkpCisJCQl1c2xlZXBfcmFuZ2UoTkNQX1NFVFRMRV9USU1FX1VTLCBOQ1BfU0VUVExFX1RJTUVfVVMrMTApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfQ0hPUF9DVEwsCisJCQkJCTB4MjAsIDB4MjApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0xfUEFfQ1RMLAorCQkJCQlXQ0Q5WFhYX0FfUlhfSFBIX0xfUEFfQ1RMX19QT1IpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX1JfUEFfQ1RMLAorCQkJCQlXQ0Q5WFhYX0FfUlhfSFBIX1JfUEFfQ1RMX19QT1IpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0JJQVNfUEEsIDB4NTcpOworCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQl3Y2Q5eHh4X2NoYXJnZXB1bXBfcmVxdWVzdChjb2RlYywgZmFsc2UpOworCQl3Y2Q5eHh4X2VuYWJsZV9hbmNfZGVsYXkoY29kZWMsIGZhbHNlKTsKKwkJY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfOF0tLTsKKwkJaWYgKGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzhdID09IDAgJiYKKwkJICAgIGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzVdID09IDApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTkNQX0VOLAorCQkJCQkJMHgwMSwgMHgwMCk7CisJCWVsc2UgaWYgKGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzhdID09IDApCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTkNQX1NUQVRJQywKKwkJCQkJCTB4MEYsIDB4MDUpOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9lbmFibGVfaGlnaF9wZXJmX21vZGUpOworCitzdGF0aWMgaW50IGdldF9pbXBlZGFuY2VfaW5kZXgodTMyIGltcGVkKQoreworCWludCBpID0gMDsKKworCWlmIChpbXBlZCA8IGltcGVkX2luZGV4W2ldLmltcGVkX3ZhbCkgeworCQlwcl9kZWJ1ZygiJXMsIGRldGVjdGVkIGltcGVkYW5jZSBpcyBsZXNzIHRoYW4gNCBPaG1cbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIHJldDsKKwl9CisJaWYgKGltcGVkID49IGltcGVkX2luZGV4W0FSUkFZX1NJWkUoaW1wZWRfaW5kZXgpIC0gMV0uaW1wZWRfdmFsKSB7CisJCXByX2RlYnVnKCIlcywgZGV0ZWN0ZWQgaW1wZWRhbmNlIGlzIGdyZWF0ZXIgdGhhbiAzMjE2NCBPaG1cbiIsCisJCQkJX19mdW5jX18pOworCQlpID0gQVJSQVlfU0laRShpbXBlZF9pbmRleCkgLSAxOworCQlnb3RvIHJldDsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW1wZWRfaW5kZXgpIC0gMTsgaSsrKSB7CisJCWlmIChpbXBlZCA+PSBpbXBlZF9pbmRleFtpXS5pbXBlZF92YWwgJiYKKwkJCWltcGVkIDwgaW1wZWRfaW5kZXhbaSArIDFdLmltcGVkX3ZhbCkKKwkJCWJyZWFrOworCX0KK3JldDoKKwlwcl9kZWJ1ZygiJXM6IHNlbGVjdGVkIGltcGVkYW5jZSBpbmRleCA9ICVkXG4iLAorCQkJX19mdW5jX18sIGltcGVkX2luZGV4W2ldLmluZGV4KTsKKwlyZXR1cm4gaW1wZWRfaW5kZXhbaV0uaW5kZXg7Cit9CisKK3ZvaWQgd2NkOXh4eF9jbHNoX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBpbnQgaW1wZWQpCit7CisJaW50IGkgID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJaW5kZXggPSBnZXRfaW1wZWRhbmNlX2luZGV4KGltcGVkKTsKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShpbXBlZF9pbmRleCkpIHsKKwkJcHJfZXJyKCIlcywgaW52YWxpZCBpbXBlZCA9ICVkXG4iLCBfX2Z1bmNfXywgaW1wZWQpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1QRURfUEFSQU1TOyBpKyspCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGltcGVkX3RhYmxlW2luZGV4XVtpXS5yZWcsCisJCQkJCWltcGVkX3RhYmxlW2luZGV4XVtpXS52YWwpOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQkJCSAgaW50IGNvbXB1dGVfcGEsIGJvb2wgb24pCit7CisJdTggc2hpZnQ7CisKKwlpZiAoY29tcHV0ZV9wYSA9PSBDTFNIX0NPTVBVVEVfRUFSKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfQ0xTSF9CMV9DVEwsIDB4MTAsCisJCQkJICAgIChvbiA/IDB4MTAgOiAwKSk7CisJfSBlbHNlIHsKKwkJaWYgKGNvbXB1dGVfcGEgPT0gQ0xTSF9DT01QVVRFX0hQSF9MKSB7CisJCQlzaGlmdCA9IDM7CisJCX0gZWxzZSBpZiAoY29tcHV0ZV9wYSA9PSBDTFNIX0NPTVBVVEVfSFBIX1IpIHsKKwkJCXNoaWZ0ID0gMjsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6IGNsYXNzaCBjb21wdXRhdGlvbiByZXF1ZXN0IGlzIGluY29ycmVjdFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAob24pCisJCQl3Y2Q5eHh4X3Jlc21ncl9hZGRfY29uZF91cGRhdGVfYml0cyhjbHNoX2QtPnJlc21nciwKKwkJCQkJCSAgV0NEOVhYWF9DT05EX0hQSCwKKwkJCQkJCSAgV0NEOVhYWF9BX0NEQ19DTFNIX0IxX0NUTCwKKwkJCQkJCSAgc2hpZnQsIGZhbHNlKTsKKwkJZWxzZQorCQkJd2NkOXh4eF9yZXNtZ3Jfcm1fY29uZF91cGRhdGVfYml0cyhjbHNoX2QtPnJlc21nciwKKwkJCQkJCSAgV0NEOVhYWF9DT05EX0hQSCwKKwkJCQkJCSAgV0NEOVhYWF9BX0NEQ19DTFNIX0IxX0NUTCwKKwkJCQkJCSAgc2hpZnQsIGZhbHNlKTsKKwl9Cit9CisKK2ludCB3Y2Q5eHh4X3NvY191cGRhdGVfYml0c19wdXNoKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCQkJdWludDE2X3QgcmVnLCB1aW50OF90IG1hc2ssCisJCQkJCXVpbnQ4X3QgdmFsdWUsIGludCBkZWxheSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHdjZDl4eHhfcmVnaXN0ZXJfc2F2ZV9ub2RlICpub2RlOworCisJbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFub2RlKSkgeworCQlwcl9lcnIoIiVzOiBOb3QgZW5vdWdoIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbm9kZS0+cmVnID0gcmVnOworCW5vZGUtPnZhbHVlID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOworCWxpc3RfYWRkKCZub2RlLT5saCwgbGlzdCk7CisJaWYgKG1hc2sgPT0gMHhGRikKKwkJcmMgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwllbHNlCisJCXJjID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBtYXNrLCB2YWx1ZSk7CisJaWYgKGRlbGF5KQorCQl1c2xlZXBfcmFuZ2UoZGVsYXksIGRlbGF5ICsgVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NvY191cGRhdGVfYml0c19wdXNoKTsKKwordm9pZCB3Y2Q5eHh4X3Jlc3RvcmVfcmVnaXN0ZXJzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9yZWdpc3Rlcl9zYXZlX25vZGUgKm5vZGUsICpub2RldG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG5vZGV0bXAsIGxoLCBsaCkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBub2RlLT5yZWcsIG5vZGUtPnZhbHVlKTsKKwkJbGlzdF9kZWwoJm5vZGUtPmxoKTsKKwkJa2ZyZWUobm9kZSk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3Jlc3RvcmVfcmVnaXN0ZXJzKTsKKworc3RhdGljIHZvaWQgd2NkOXh4eF9keW5hbWljX2J5cGFzc19idWNrX2N0cmxfbG8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNkYywKKwkJCQkJCWJvb2wgZW5hYmxlKQoreworCWludCBpOworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0W10gPSB7CisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzMsICgweDEgPDwgMyksIChlbmFibGUgPDwgMyl9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV81LCBlbmFibGUgPyAweEZGIDogMHgwMiwgMHgwMn0sCisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzUsIDB4MSwgMHgwMX0KKwl9OworCisJaWYgKCFlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjZGMsIFdDRDlYWFhfQV9CVUNLX01PREVfMSwKKwkJCQkJKDB4MSA8PCAzKSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY2RjLCBXQ0Q5WFhYX0FfQlVDS19NT0RFXzQsCisJCQkJCTB4RkYsIEJVQ0tfVlJFRl8yVik7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ19zZXQpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY2RjLCByZWdfc2V0W2ldLnJlZywgcmVnX3NldFtpXS5tYXNrLAorCQkJCQkJCXJlZ19zZXRbaV0udmFsKTsKKworCS8qIDUwdXMgc2xlZXAgaXMgcmVxZC4gYXMgcGVyIHRoZSBjbGFzcyBIIEhXIGRlc2lnbiBzZXF1ZW5jZSAqLworCXVzbGVlcF9yYW5nZShCVUNLX1NFVFRMRV9USU1FX1VTLCBCVUNLX1NFVFRMRV9USU1FX1VTKzEwKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9keW5hbWljX2J5cGFzc19idWNrX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNkYywKKwkJCQkJCWJvb2wgZW5hYmxlKQoreworCWludCBpOworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0W10gPSB7CisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzMsICgweDEgPDwgMyksIChlbmFibGUgPDwgMyl9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV81LCAoMHgxIDw8IDEpLCAoKCFlbmFibGUpIDw8IDEpfSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfNSwgMHgxLCAhZW5hYmxlfQorCX07CisJaWYgKCFlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjZGMsIFdDRDlYWFhfQV9CVUNLX01PREVfMSwKKwkJCQkJKDB4MSA8PCAzKSwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY2RjLCBXQ0Q5WFhYX0FfQlVDS19NT0RFXzQsCisJCQkJCTB4RkYsIEJVQ0tfVlJFRl8yVik7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ19zZXQpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY2RjLCByZWdfc2V0W2ldLnJlZywgcmVnX3NldFtpXS5tYXNrLAorCQkJCQkJCXJlZ19zZXRbaV0udmFsKTsKKworCS8qIDUwdXMgc2xlZXAgaXMgcmVxZC4gYXMgcGVyIHRoZSBjbGFzcyBIIEhXIGRlc2lnbiBzZXF1ZW5jZSAqLworCXVzbGVlcF9yYW5nZShCVUNLX1NFVFRMRV9USU1FX1VTLCBCVUNLX1NFVFRMRV9USU1FX1VTKzEwKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9zZXRfYnVja19tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggYnVja192cmVmKQoreworCWludCBpOworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0W10gPSB7CisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzUsIDB4MDIsIDB4MDJ9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV80LCAweEZGLCBidWNrX3ZyZWZ9LAorCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV8xLCAweDA0LCAweDA0fSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMywgMHgwNCwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQlVDS19NT0RFXzMsIDB4MDgsIDB4MDB9LAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdfc2V0KTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdfc2V0W2ldLnJlZywKKwkJCQkJcmVnX3NldFtpXS5tYXNrLCByZWdfc2V0W2ldLnZhbCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRG9uZVxuIiwgX19mdW5jX18pOworCXVzbGVlcF9yYW5nZShCVUNLX1NFVFRMRV9USU1FX1VTLCBCVUNLX1NFVFRMRV9USU1FX1VTICsgMTApOworfQorCisKKy8qIFRoaXMgd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBzdGF0ZXMgZXhjZXB0IExpbmVvdXQgKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2xzaF9lbmFibGVfcG9zdF9wYShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2RjX2Nsc2hfZCkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgcmVnX3NldFtdID0geworCQl7V0NEOVhYWF9BX0JVQ0tfTU9ERV81LCAweDAyLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDIwLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9CVUNLX01PREVfMywgMHgwNCwgMHgwNH0sCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ19zZXQpOyBpKyspCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ19zZXRbaV0ucmVnLAorCQkJCQlyZWdfc2V0W2ldLm1hc2ssIHJlZ19zZXRbaV0udmFsKTsKKworCWlmICghY2RjX2Nsc2hfZC0+aXNfZHluYW1pY192ZGRfY3ApCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9CVUNLX01PREVfMywKKwkJCQkJCQkweDA4LCAweDA4KTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjb21wbGV0ZWQgY2xzaCBtb2RlIHNldHRpbmdzIGFmdGVyIFBBIGVuYWJsZVxuIiwKKwkJICAgX19mdW5jX18pOworCit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfc2V0X2ZjbGtfZ2V0X25jcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQkJICAgICBlbnVtIG5jcF9mY2xrX2xldmVsIGZjbGtfbGV2ZWwpCit7CisJY2xzaF9kLT5uY3BfdXNlcnNbZmNsa19sZXZlbF0rKzsKKworCXByX2RlYnVnKCIlczogZW50ZXIgbmNwIHR5cGUgJWQgdXNlcnMgZmNsazggJWQsIGZjbGs1ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGZjbGtfbGV2ZWwsIGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzhdLAorCQkgY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfNV0pOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX05DUF9TVEFUSUMsIDB4MTAsIDB4MDApOworCS8qIGZjbGsgbGV2ZWwgOCBkb21pbmF0ZXMgbGV2ZWwgNSAqLworCWlmIChjbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF84XSA+IDApCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDBGLCAweDA4KTsKKwllbHNlIGlmIChjbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF81XSA+IDApCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDBGLCAweDA1KTsKKwllbHNlCisJCVdBUk5fT05DRSgxLCAiVW5leHBlY3RlZCB1c2VycyAlZCwlZFxuIiwKKwkJCSAgY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfOF0sCisJCQkgIGNsc2hfZC0+bmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMXzVdKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTkNQX1NUQVRJQywgMHgyMCwgMHgyMCk7CisKKwkvKiBlbmFibGUgTkNQIGFuZCB3YWl0IHVudGlsIHNldHRsZXMgZG93biAqLworCWlmIChzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTkNQX0VOLCAweDAxLCAweDAxKSkKKwkJdXNsZWVwX3JhbmdlKE5DUF9TRVRUTEVfVElNRV9VUywgTkNQX1NFVFRMRV9USU1FX1VTICsgNTApOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9zZXRfZmNsa19wdXRfbmNwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIHN0cnVjdCB3Y2Q5eHh4X2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCQkgICAgIGVudW0gbmNwX2ZjbGtfbGV2ZWwgZmNsa19sZXZlbCkKK3sKKwljbHNoX2QtPm5jcF91c2Vyc1tmY2xrX2xldmVsXS0tOworCisJcHJfZGVidWcoIiVzOiBlbnRlciBuY3AgdHlwZSAlZCB1c2VycyBmY2xrOCAlZCwgZmNsazUgJWRcbiIsIF9fZnVuY19fLAorCQkgZmNsa19sZXZlbCwgY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfOF0sCisJCSBjbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF81XSk7CisKKwlpZiAoY2xzaF9kLT5uY3BfdXNlcnNbTkNQX0ZDTEtfTEVWRUxfOF0gPT0gMCAmJgorCSAgICBjbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF81XSA9PSAwKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTkNQX0VOLCAweDAxLCAweDAwKTsKKwllbHNlIGlmIChjbHNoX2QtPm5jcF91c2Vyc1tOQ1BfRkNMS19MRVZFTF84XSA9PSAwKQorCQkvKiBpZiBkb21pbmF0aW5nIGxldmVsIDggaGFzIGdvbmUsIHN3aXRjaCB0byA1ICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDBGLCAweDA1KTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2ZnX2Nsc2hfcGFyYW1fZWFyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgcmVnX3NldFtdID0geworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0IxX0NUTCwgKDB4MSA8PCA3KSwgMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfVl9QQV9IRF9FQVIsICgweDNmIDw8IDApLCAweDBEfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9WX1BBX01JTl9FQVIsICgweDNmIDw8IDApLCAweDNBfSwKKworCQkvKiBVbmRlciBhc3N1bXB0aW9uIHRoYXQgRUFSIGxvYWQgaXMgMTAuN29obSAqLworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lETEVfRUFSX1RIU0QsICgweDNmIDw8IDApLCAweDI2fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9GQ0xLT05MWV9FQVJfVEhTRCwgKDB4M2YgPDwgMCksIDB4MkN9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9FQVJfTCwgMHhmZiwgMHhBOX0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0VBUl9VLCAweGZmLCAweDA3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsICgweDEgPDwgNyksIDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgKDB4ZiA8PCAwKSwgMHgwOH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDFifSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgyZH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MzZ9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDM3fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdfc2V0KTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdfc2V0W2ldLnJlZywKKwkJCQkJcmVnX3NldFtpXS5tYXNrLCByZWdfc2V0W2ldLnZhbCk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUHJvZ3JhbW1lZCBDbGFzcyBIIGNvbnRyb2xsZXIgRUFSIHNwZWNpZmljIHBhcmFtc1xuIiwKKwkJCSBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2ZnX2Nsc2hfcGFyYW1faHBoKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZWdfbWFza192YWwgcmVnX3NldFtdID0geworCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0IxX0NUTCwgKDB4MSA8PCA2KSwgMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfVl9QQV9IRF9IUEgsIDB4M2YsIDB4MER9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX1ZfUEFfTUlOX0hQSCwgMHgzZiwgMHgxRH0sCisKKwkJLyogVW5kZXIgYXNzdW1wdGlvbiB0aGF0IEhQSCBsb2FkIGlzIDE2b2htIHBlciBjaGFubmVsICovCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSURMRV9IUEhfVEhTRCwgMHgzZiwgMHgxM30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfRkNMS09OTFlfSFBIX1RIU0QsIDB4MWYsIDB4MTl9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0lfUEFfRkFDVF9IUEhfTCwgMHhmZiwgMHg5N30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfSV9QQV9GQUNUX0hQSF9VLCAweGZmLCAweDA1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0FERFIsICgweDEgPDwgNyksIDB9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfQUREUiwgMHgwZiwgMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweEFFfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDF9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgxQ30sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDAwfSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MjR9LAorCQl7V0NEOVhYWF9BX0NEQ19DTFNIX0tfREFUQSwgMHhmZiwgMHgwMH0sCisJCXtXQ0Q5WFhYX0FfQ0RDX0NMU0hfS19EQVRBLCAweGZmLCAweDI1fSwKKwkJe1dDRDlYWFhfQV9DRENfQ0xTSF9LX0RBVEEsIDB4ZmYsIDB4MDB9LAorCX07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdfc2V0KTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdfc2V0W2ldLnJlZywgcmVnX3NldFtpXS5tYXNrLAorCQkJCQkJCXJlZ19zZXRbaV0udmFsKTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUHJvZ3JhbW1lZCBDbGFzcyBIIGNvbnRyb2xsZXIgSFBIIHNwZWNpZmljIHBhcmFtc1xuIiwKKwkJCSBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfbmNwX2J5cGFzc19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNkYywgYm9vbCBlbmFibGUpCit7CisJc25kX3NvY191cGRhdGVfYml0cyhjZGMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLCAweDEwLCAoZW5hYmxlIDw8IDQpKTsKKwkvKiA1MHVzIHNsZWVwIGlzIHJlcWQuIGFzIHBlciB0aGUgY2xhc3MgSCBIVyBkZXNpZ24gc2VxdWVuY2UgKi8KKwl1c2xlZXBfcmFuZ2UoQlVDS19TRVRUTEVfVElNRV9VUywgQlVDS19TRVRUTEVfVElNRV9VUysxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2xzaF9zZXRfSWVzdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXU4IHZhbHVlKQoreworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9CVUNLX01PREVfNSwKKwkJCQkgICAgMHgwMSwgKDB4MDEgJiAweDAzKSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0JVQ0tfTU9ERV81LAorCQkJCSAgICAweEZDLCAodmFsdWUgPDwgMikpOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX2VhcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCWludCBjb21wdXRlX3BhID0gMDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlbnRlciAlc1xuIiwgX19mdW5jX18sCisJCQlpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisKKwlpZiAoaXNfZW5hYmxlKSB7CisJCS8qCisJCSAqIFRoZSBiZWxvdyBjaGVjayBjb25kaXRpb24gaXMgcmVxdWlyZWQgdG8gbWFrZSBzdXJlCisJCSAqIGZ1bmN0aW9ucyBpbnNpZGUgaWYgY29uZGl0aW9uIHdpbGwgZXhlY3V0ZSBvbmx5IG9uY2UuCisJCSAqLworCQlpZiAoKGNsc2hfZC0+c3RhdGUgPT0gV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikgfHwKKwkJCShyZXFfc3RhdGUgPT0gV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikpIHsKKwkJCXdjZDl4eHhfZHluYW1pY19ieXBhc3NfYnVja19jdHJsKGNvZGVjLCBmYWxzZSk7CisJCQl3Y2Q5eHh4X25jcF9ieXBhc3NfZW5hYmxlKGNvZGVjLCB0cnVlKTsKKwkJfQorCQlzd2l0Y2ggKHJlcV9zdGF0ZSkgeworCQljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMOgorCQkJY29tcHV0ZV9wYSA9IENMU0hfQ09NUFVURV9IUEhfTDsKKwkJCWJyZWFrOworCQljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhSOgorCQkJY29tcHV0ZV9wYSA9IENMU0hfQ09NUFVURV9IUEhfUjsKKwkJCWJyZWFrOworCQljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9FQVI6CisJCQljb21wdXRlX3BhID0gQ0xTSF9DT01QVVRFX0VBUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJCSIlczpJbnZhbGlkIHN0YXRlOjB4JXgsZW5hYmxlOjB4JXhcbiIsCisJCQkJX19mdW5jX18sIHJlcV9zdGF0ZSwgaXNfZW5hYmxlKTsKKwkJCWJyZWFrOworCQl9CisJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLCBjb21wdXRlX3BhLCB0cnVlKTsKKworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRW5hYmxlZCBocGgrZWFyIG1vZGUgY2xzaFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChyZXFfc3RhdGUpIHsKKwkJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITDoKKwkJCWNvbXB1dGVfcGEgPSBDTFNIX0NPTVBVVEVfSFBIX0w7CisJCQlicmVhazsKKwkJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUjoKKwkJCWNvbXB1dGVfcGEgPSBDTFNIX0NPTVBVVEVfSFBIX1I7CisJCQlicmVhazsKKwkJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSOgorCQkJY29tcHV0ZV9wYSA9IENMU0hfQ09NUFVURV9FQVI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkiJXM6SW52YWxpZCBzdGF0ZToweCV4LGVuYWJsZToweCV4XG4iLAorCQkJCV9fZnVuY19fLCByZXFfc3RhdGUsIGlzX2VuYWJsZSk7CisJCQlicmVhazsKKwkJfQorCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgY29tcHV0ZV9wYSwgZmFsc2UpOworCisJCWlmICgoKGNsc2hfZC0+c3RhdGUgJiAofnJlcV9zdGF0ZSkpID09CisJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikgfHwKKwkJCShyZXFfc3RhdGUgPT0gV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikpIHsKKwkJCXdjZDl4eHhfbmNwX2J5cGFzc19lbmFibGUoY29kZWMsIGZhbHNlKTsKKwkJCXdjZDl4eHhfZHluYW1pY19ieXBhc3NfYnVja19jdHJsKGNvZGVjLCB0cnVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jbHNoX3N0YXRlX2hwaF9sbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVudGVyICVzXG4iLCBfX2Z1bmNfXywKKwkJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlpZiAoaXNfZW5hYmxlKSB7CisJCWlmICgoY2xzaF9kLT5zdGF0ZSA9PSBXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8pIHx8CisJCQkocmVxX3N0YXRlID09IFdDRDlYWFhfQ0xTSF9TVEFURV9MTykpIHsKKwkJCXdjZDl4eHhfZHluYW1pY19ieXBhc3NfYnVja19jdHJsX2xvKGNvZGVjLCBmYWxzZSk7CisJCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQkJd2NkOXh4eF9uY3BfYnlwYXNzX2VuYWJsZShjb2RlYywgdHJ1ZSk7CisJCQlpZiAocmVxX3N0YXRlICYgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVCkgeworCQkJCXdjZDl4eHhfc2V0X2ZjbGtfZ2V0X25jcChjb2RlYywgY2xzaF9kLAorCQkJCQkJCU5DUF9GQ0xLX0xFVkVMXzgpOworCQkJCXdjZDl4eHhfc2V0X2ZjbGtfcHV0X25jcChjb2RlYywgY2xzaF9kLAorCQkJCQkJCU5DUF9GQ0xLX0xFVkVMXzUpOworCQkJCXdjZDl4eHhfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCQkJd2NkOXh4eF9jaGFyZ2VwdW1wX3JlcXVlc3QoY29kZWMsIHRydWUpOworCQkJCXdjZDl4eHhfZW5hYmxlX2FuY19kZWxheShjb2RlYywgdHJ1ZSk7CisJCQl9CisJCX0KKwkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCkKKwkJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLAorCQkJCQkJQ0xTSF9DT01QVVRFX0hQSF9MLCB0cnVlKTsKKwkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUikKKwkJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLAorCQkJCQkJQ0xTSF9DT01QVVRFX0hQSF9SLCB0cnVlKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHJlcV9zdGF0ZSkgeworCQljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9MTzoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLAorCQkJCQkJMHgyMCwgMHgwMCk7CisJCQl3Y2Q5eHh4X2R5bmFtaWNfYnlwYXNzX2J1Y2tfY3RybF9sbyhjb2RlYywgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITDoKKwkJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLAorCQkJCQkJQ0xTSF9DT01QVVRFX0hQSF9MLCBmYWxzZSk7CisJCQlicmVhazsKKwkJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUjoKKwkJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLAorCQkJCQkJQ0xTSF9DT01QVVRFX0hQSF9SLCBmYWxzZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoY29kZWMtPmRldiwKKwkJCQkgIiVzOkludmFsaWQgc3RhdGU6MHgleCxlbmFibGU6MHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcmVxX3N0YXRlLCBpc19lbmFibGUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZXFfc3RhdGUgPT0gV0NEOVhYWF9DTFNIX1NUQVRFX0xPKSB8fAorCQkoKGNsc2hfZC0+c3RhdGUgJiAofnJlcV9zdGF0ZSkpID09IFdDRDlYWFhfQ0xTSF9TVEFURV9MTykpIHsKKwkJCXdjZDl4eHhfbmNwX2J5cGFzc19lbmFibGUoY29kZWMsIGZhbHNlKTsKKworCQkJaWYgKChjbHNoX2QtPnN0YXRlICYgKH5yZXFfc3RhdGUpKSA9PQorCQkJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0xPKSB7CisJCQkJd2NkOXh4eF9zZXRfZmNsa19nZXRfbmNwKGNvZGVjLCBjbHNoX2QsCisJCQkJCQkJTkNQX0ZDTEtfTEVWRUxfNSk7CisJCQkJd2NkOXh4eF9zZXRfZmNsa19wdXRfbmNwKGNvZGVjLCBjbHNoX2QsCisJCQkJCQkJTkNQX0ZDTEtfTEVWRUxfOCk7CisJCQl9CisKKwkJCWlmIChyZXFfc3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIX1NUKSB7CisJCQkJdXNsZWVwX3JhbmdlKEJVQ0tfU0VUVExFX1RJTUVfVVMsCisJCQkJCQlCVUNLX1NFVFRMRV9USU1FX1VTICsgMTApOworCQkJCWlmIChjbHNoX2QtPmJ1Y2tfbXYgPT0KKwkJCQkJCVdDRDlYWFhfQ0RDX0JVQ0tfTVZfMVA4KSB7CisJCQkJCXdjZDl4eHhfZW5hYmxlX2J1Y2soY29kZWMsIGNsc2hfZCwKKwkJCQkJCQkJZmFsc2UpOworCQkJCQl3Y2Q5eHh4X25jcF9ieXBhc3NfZW5hYmxlKGNvZGVjLCB0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKk5DUCBzZXR0bGUgdGltZSByZWNvbW1lbmRlZCBieSBjb2RlYworCQkJCQkgKnNwZWNpZmljYXRpb24KKwkJCQkJICovCisJCQkJCXVzbGVlcF9yYW5nZShOQ1BfU0VUVExFX1RJTUVfVVMsCisJCQkJCQlOQ1BfU0VUVExFX1RJTUVfVVMgKyAxMCk7CisJCQkJCXdjZDl4eHhfY2xzaF9zZXRfSWVzdChjb2RlYywgMHgwMik7CisJCQkJfQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQlVDS19NT0RFXzEsCisJCQkJCQkweDA0LCAweDAwKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJIFdDRDlYWFhfQV9CVUNLX01PREVfNCwKKwkJCQkJCTB4RkYsIEJVQ0tfVlJFRl8xUDhWKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jbHNoX3N0YXRlX2Vhcl9sbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVudGVyICVzXG4iLCBfX2Z1bmNfXywKKwkJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlpZiAoaXNfZW5hYmxlKSB7CisJCXdjZDl4eHhfZHluYW1pY19ieXBhc3NfYnVja19jdHJsKGNvZGVjLCBmYWxzZSk7CisJCXdjZDl4eHhfZW5hYmxlX2J1Y2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCXdjZDl4eHhfbmNwX2J5cGFzc19lbmFibGUoY29kZWMsIHRydWUpOworCQlpZiAocmVxX3N0YXRlICYgV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikgeworCQkJd2NkOXh4eF9zZXRfZmNsa19nZXRfbmNwKGNvZGVjLCBjbHNoX2QsCisJCQkJCQlOQ1BfRkNMS19MRVZFTF84KTsKKwkJCXdjZDl4eHhfc2V0X2ZjbGtfcHV0X25jcChjb2RlYywgY2xzaF9kLAorCQkJCQkJTkNQX0ZDTEtfTEVWRUxfNSk7CisJCQl3Y2Q5eHh4X2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQkJd2NkOXh4eF9jaGFyZ2VwdW1wX3JlcXVlc3QoY29kZWMsIHRydWUpOworCQkJd2NkOXh4eF9lbmFibGVfYW5jX2RlbGF5KGNvZGVjLCB0cnVlKTsKKwkJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLAorCQkJCQkJQ0xTSF9DT01QVVRFX0VBUiwgdHJ1ZSk7CisJCX0KKwl9IGVsc2UgeworCQl3Y2Q5eHh4X25jcF9ieXBhc3NfZW5hYmxlKGNvZGVjLCBmYWxzZSk7CisKKwkJaWYgKChjbHNoX2QtPnN0YXRlICYgKH5yZXFfc3RhdGUpKSA9PSBXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8pIHsKKwkJCXdjZDl4eHhfc2V0X2ZjbGtfZ2V0X25jcChjb2RlYywgY2xzaF9kLAorCQkJCQkJTkNQX0ZDTEtfTEVWRUxfNSk7CisJCQl3Y2Q5eHh4X3NldF9mY2xrX3B1dF9uY3AoY29kZWMsIGNsc2hfZCwKKwkJCQkJCU5DUF9GQ0xLX0xFVkVMXzgpOworCQl9CisKKwkJaWYgKHJlcV9zdGF0ZSAmIFdDRDlYWFhfQ0xTSF9TVEFURV9MTykgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX05DUF9TVEFUSUMsCisJCQkJCQkweDIwLCAweDAwKTsKKwkJCXdjZDl4eHhfZHluYW1pY19ieXBhc3NfYnVja19jdHJsKGNvZGVjLCB0cnVlKTsKKwkJfSBlbHNlIGlmIChyZXFfc3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSKSB7CisJCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgQ0xTSF9DT01QVVRFX0VBUiwKKwkJCQkJCWZhbHNlKTsKKwkJCS8qc2xlZXAgNW1zKi8KKwkJCWlmIChjbHNoX2QtPmJ1Y2tfbXYgPT0gV0NEOVhYWF9DRENfQlVDS19NVl8xUDgpIHsKKwkJCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKKwkJCQl3Y2Q5eHh4X25jcF9ieXBhc3NfZW5hYmxlKGNvZGVjLCB0cnVlKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTkNQIHNldHRsZSB0aW1lIHJlY29tbWVuZGVkIGJ5IGNvZGVjCXNwZWMgKi8KKwkJCQl1c2xlZXBfcmFuZ2UoTkNQX1NFVFRMRV9USU1FX1VTLAorCQkJCQkgICAgIE5DUF9TRVRUTEVfVElNRV9VUyArIDEwKTsKKwkJCQl3Y2Q5eHh4X2Nsc2hfc2V0X0llc3QoY29kZWMsIDB4MDIpOworCQkJfQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0JVQ0tfTU9ERV8xLAorCQkJCQkJMHgwNCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQlVDS19NT0RFXzQsCisJCQkJCQkweEZGLCBCVUNLX1ZSRUZfMVA4Vik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2xzaF9zdGF0ZV9ocGhfZWFyX2xvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCXN0cnVjdCB3Y2Q5eHh4X2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKKwkJCXU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUpCit7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVudGVyICVzXG4iLCBfX2Z1bmNfXywKKwkJCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChyZXFfc3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCkKKwkJd2NkOXh4eF9jbHNoX2NvbXBfcmVxKGNvZGVjLCBjbHNoX2QsIENMU0hfQ09NUFVURV9IUEhfTCwKKwkJCQkJaXNfZW5hYmxlKTsKKworCWlmIChyZXFfc3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUikKKwkJd2NkOXh4eF9jbHNoX2NvbXBfcmVxKGNvZGVjLCBjbHNoX2QsIENMU0hfQ09NUFVURV9IUEhfUiwKKwkJCQkJaXNfZW5hYmxlKTsKKworCWlmIChyZXFfc3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSKQorCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgQ0xTSF9DT01QVVRFX0VBUiwKKwkJCQkJaXNfZW5hYmxlKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jbHNoX3N0YXRlX2VhcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCXByX2RlYnVnKCIlczogZW50ZXIgJXNcbiIsIF9fZnVuY19fLCBpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJaWYgKGlzX2VuYWJsZSkgeworCQl3Y2Q5eHh4X2NmZ19jbHNoX3BhcmFtX2NvbW1vbihjb2RlYyk7CisJCXdjZDl4eHhfY2ZnX2Nsc2hfcGFyYW1fZWFyKGNvZGVjKTsKKwkJd2NkOXh4eF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCB0cnVlKTsKKwkJd2NkOXh4eF9jaGFyZ2VwdW1wX3JlcXVlc3QoY29kZWMsIHRydWUpOworCQl3Y2Q5eHh4X2VuYWJsZV9hbmNfZGVsYXkoY29kZWMsIHRydWUpOworCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgQ0xTSF9DT01QVVRFX0VBUiwgdHJ1ZSk7CisJCXdjZDl4eHhfc2V0X2J1Y2tfbW9kZShjb2RlYywgQlVDS19WUkVGXzJWKTsKKwkJd2NkOXh4eF9lbmFibGVfYnVjayhjb2RlYywgY2xzaF9kLCB0cnVlKTsKKwkJd2NkOXh4eF9zZXRfZmNsa19nZXRfbmNwKGNvZGVjLCBjbHNoX2QsIE5DUF9GQ0xLX0xFVkVMXzgpOworCisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBFbmFibGVkIGVhciBtb2RlIGNsYXNzIGhcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3R1YiBmYWxsYmFjayB0byBlYXJcbiIsIF9fZnVuY19fKTsKKwkJd2NkOXh4eF9zZXRfZmNsa19wdXRfbmNwKGNvZGVjLCBjbHNoX2QsIE5DUF9GQ0xLX0xFVkVMXzgpOworCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKKwkJd2NkOXh4eF9jbHNoX2NvbXBfcmVxKGNvZGVjLCBjbHNoX2QsIENMU0hfQ09NUFVURV9FQVIsIGZhbHNlKTsKKwkJd2NkOXh4eF9jaGFyZ2VwdW1wX3JlcXVlc3QoY29kZWMsIGZhbHNlKTsKKwkJd2NkOXh4eF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCXU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUpCit7CisJcHJfZGVidWcoIiVzOiBlbnRlciAlc1xuIiwgX19mdW5jX18sIGlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChpc19lbmFibGUpIHsKKwkJd2NkOXh4eF9jZmdfY2xzaF9wYXJhbV9jb21tb24oY29kZWMpOworCQl3Y2Q5eHh4X2NmZ19jbHNoX3BhcmFtX2hwaChjb2RlYyk7CisJCXdjZDl4eHhfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCXdjZDl4eHhfY2hhcmdlcHVtcF9yZXF1ZXN0KGNvZGVjLCB0cnVlKTsKKwkJd2NkOXh4eF9lbmFibGVfYW5jX2RlbGF5KGNvZGVjLCB0cnVlKTsKKwkJd2NkOXh4eF9jbHNoX2NvbXBfcmVxKGNvZGVjLCBjbHNoX2QsIENMU0hfQ09NUFVURV9IUEhfTCwgdHJ1ZSk7CisJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLCBDTFNIX0NPTVBVVEVfSFBIX1IsIHRydWUpOworCQl3Y2Q5eHh4X3NldF9idWNrX21vZGUoY29kZWMsIEJVQ0tfVlJFRl8wUDQ5NFYpOworCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQl3Y2Q5eHh4X3NldF9mY2xrX2dldF9uY3AoY29kZWMsIGNsc2hfZCwgTkNQX0ZDTEtfTEVWRUxfOCk7CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERvbmVcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl3Y2Q5eHh4X3NldF9mY2xrX3B1dF9uY3AoY29kZWMsIGNsc2hfZCwgTkNQX0ZDTEtfTEVWRUxfOCk7CisJCXdjZDl4eHhfZW5hYmxlX2J1Y2soY29kZWMsIGNsc2hfZCwgZmFsc2UpOworCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgQ0xTSF9DT01QVVRFX0hQSF9MLCBmYWxzZSk7CisJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLCBDTFNIX0NPTVBVVEVfSFBIX1IsIGZhbHNlKTsKKwkJd2NkOXh4eF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJCXdjZDl4eHhfY2hhcmdlcHVtcF9yZXF1ZXN0KGNvZGVjLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX3Ioc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCXU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUpCit7CisJcHJfZGVidWcoIiVzOiBlbnRlciAlc1xuIiwgX19mdW5jX18sIGlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKworCWlmIChpc19lbmFibGUpIHsKKwkJd2NkOXh4eF9jZmdfY2xzaF9wYXJhbV9jb21tb24oY29kZWMpOworCQl3Y2Q5eHh4X2NmZ19jbHNoX3BhcmFtX2hwaChjb2RlYyk7CisJCXdjZDl4eHhfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCXdjZDl4eHhfY2hhcmdlcHVtcF9yZXF1ZXN0KGNvZGVjLCB0cnVlKTsKKwkJd2NkOXh4eF9lbmFibGVfYW5jX2RlbGF5KGNvZGVjLCB0cnVlKTsKKwkJd2NkOXh4eF9jbHNoX2NvbXBfcmVxKGNvZGVjLCBjbHNoX2QsIENMU0hfQ09NUFVURV9IUEhfTCwgdHJ1ZSk7CisJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLCBDTFNIX0NPTVBVVEVfSFBIX1IsIHRydWUpOworCQl3Y2Q5eHh4X3NldF9idWNrX21vZGUoY29kZWMsIEJVQ0tfVlJFRl8wUDQ5NFYpOworCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIHRydWUpOworCQl3Y2Q5eHh4X3NldF9mY2xrX2dldF9uY3AoY29kZWMsIGNsc2hfZCwgTkNQX0ZDTEtfTEVWRUxfOCk7CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERvbmVcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl3Y2Q5eHh4X3NldF9mY2xrX3B1dF9uY3AoY29kZWMsIGNsc2hfZCwgTkNQX0ZDTEtfTEVWRUxfOCk7CisJCXdjZDl4eHhfZW5hYmxlX2J1Y2soY29kZWMsIGNsc2hfZCwgZmFsc2UpOworCQl3Y2Q5eHh4X2Nsc2hfY29tcF9yZXEoY29kZWMsIGNsc2hfZCwgQ0xTSF9DT01QVVRFX0hQSF9MLCBmYWxzZSk7CisJCXdjZDl4eHhfY2xzaF9jb21wX3JlcShjb2RlYywgY2xzaF9kLCBDTFNIX0NPTVBVVEVfSFBIX1IsIGZhbHNlKTsKKwkJd2NkOXh4eF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJCXdjZDl4eHhfY2hhcmdlcHVtcF9yZXF1ZXN0KGNvZGVjLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX3N0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCXByX2RlYnVnKCIlczogZW50ZXIgJXNcbiIsIF9fZnVuY19fLCBpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisKKwlpZiAoaXNfZW5hYmxlKQorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3R1YiBmYWxsYmFjayB0byBocGhfc3RcbiIsIF9fZnVuY19fKTsKKwllbHNlCisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzdHViIGZhbGxiYWNrIHRvIGhwaF9zdFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfbG8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCisJCXU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUpCit7CisJcHJfZGVidWcoIiVzOiBlbnRlciAlcywgYnVja19tdiAlZFxuIiwgX19mdW5jX18sCisJCSBpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwgY2xzaF9kLT5idWNrX212KTsKKworCWlmIChpc19lbmFibGUpIHsKKwkJd2NkOXh4eF9zZXRfYnVja19tb2RlKGNvZGVjLCBCVUNLX1ZSRUZfMVA4Vik7CisJCXdjZDl4eHhfZW5hYmxlX2J1Y2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7CisJCXdjZDl4eHhfc2V0X2ZjbGtfZ2V0X25jcChjb2RlYywgY2xzaF9kLCBOQ1BfRkNMS19MRVZFTF81KTsKKworCQlpZiAoY2xzaF9kLT5idWNrX212ID09IFdDRDlYWFhfQ0RDX0JVQ0tfTVZfMVA4KSB7CisJCQl3Y2Q5eHh4X2VuYWJsZV9idWNrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9OQ1BfU1RBVElDLAorCQkJCQkgICAgMSA8PCA0LCAxIDw8IDQpOworCQkJLyogTkNQIHNldHRsZSB0aW1lIHJlY29tbWVuZGVkIGJ5IGNvZGVjIHNwZWNpZmljYXRpb24gKi8KKwkJCXVzbGVlcF9yYW5nZShOQ1BfU0VUVExFX1RJTUVfVVMsCisJCQkJICAgICBOQ1BfU0VUVExFX1RJTUVfVVMgKyAxMCk7CisJCX0gZWxzZSB7CisJCQkvKiBOQ1Agc2V0dGxlIHRpbWUgcmVjb21tZW5kZWQgYnkgY29kZWMgc3BlY2lmaWNhdGlvbiAqLworCQkJdXNsZWVwX3JhbmdlKE5DUF9TRVRUTEVfVElNRV9VUywKKwkJCQkgICAgIE5DUF9TRVRUTEVfVElNRV9VUyArIDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9CVUNLX01PREVfNSwKKwkJCQkJICAgIDB4MDEsICgweDAxICYgMHgwMykpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0JVQ0tfTU9ERV81LAorCQkJCQkgICAgMHhGQywgKDB4RkMgJiAweEIpKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQlVDS19NT0RFXzEsIDB4MDQsIDB4MDApOworCX0gZWxzZSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzdHViIGZhbGxiYWNrIHRvIGxpbmVvdXRcbiIsIF9fZnVuY19fKTsKKwkJd2NkOXh4eF9zZXRfZmNsa19wdXRfbmNwKGNvZGVjLCBjbHNoX2QsIE5DUF9GQ0xLX0xFVkVMXzUpOworCQlpZiAoY2xzaF9kLT5idWNrX212ICE9IFdDRDlYWFhfQ0RDX0JVQ0tfTVZfMVA4KQorCQkJd2NkOXh4eF9lbmFibGVfYnVjayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Nsc2hfc3RhdGVfZXJyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlKQoreworCWNoYXIgbXNnWzEyOF07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlcyBXcm9uZyByZXF1ZXN0IGZvciBjbGFzcyBIIHN0YXRlIG1hY2hpbmUgcmVxdWVzdGVkIHRvICVzICVzIiwKKwkJX19mdW5jX18sIGlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiLAorCQlzdGF0ZV90b19zdHIocmVxX3N0YXRlLCBtc2csIHNpemVvZihtc2cpKSk7CisJV0FSTl9PTigxKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB3Y2Q5eHh4X2Nsc2hfaXNfc3RhdGVfdmFsaWQKKyAqIFBhcmFtczogc3RhdGUKKyAqIERlc2NyaXB0aW9uOgorICogUHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdmFsaWQgc3RhdGVzIG9mIENsYXNzIEggY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW50IHdjZDl4eHhfY2xzaF9pc19zdGF0ZV92YWxpZCh1OCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSURMRToKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9FQVI6CisJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITDoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhSOgorCWNhc2UgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVDoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9MTzoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMX0VBUjoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhSX0VBUjoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1RfRUFSOgorCWNhc2UgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSExfTE86CisJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUl9MTzoKKwljYXNlIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1RfTE86CisJY2FzZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSX0xPOgorCWNhc2UgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSExfRUFSX0xPOgorCWNhc2UgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFJfRUFSX0xPOgorCWNhc2UgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVF9FQVJfTE86CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiB3Y2Q5eHh4X2Nsc2hfZnNtCisgKiBQYXJhbXM6IGNvZGVjLCBjZGNfY2xzaF9kLCByZXFfc3RhdGUsIHJlcV90eXBlLCBjbHNoX2V2ZW50CisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBQUkUgREFDIGFuZCBQT1NUIERBQyBjb25kaXRpb25zIG9mIGRpZmZlcmVudCBkZXZpY2VzCisgKiBhbmQgdXBkYXRlcyBjbGFzcyBIIGNvbmZpZ3VyYXRpb24gb2YgZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIGRldmljZXMKKyAqIGJhc2VkIG9uIHZhbGlkaXR5IG9mIHRoZWlyIHN0YXRlcy4gY2RjX2Nsc2hfZCB3aWxsIGNvbnRhaW4gY3VycmVudAorICogY2xhc3MgaCBzdGF0ZSBpbmZvcm1hdGlvbgorICovCit2b2lkIHdjZDl4eHhfY2xzaF9mc20oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjZGNfY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgcmVxX3R5cGUsIHU4IGNsc2hfZXZlbnQpCit7CisJdTggb2xkX3N0YXRlLCBuZXdfc3RhdGU7CisJY2hhciBtc2cwWzEyOF0sIG1zZzFbMTI4XTsKKworCXN3aXRjaCAoY2xzaF9ldmVudCkgeworCWNhc2UgV0NEOVhYWF9DTFNIX0VWRU5UX1BSRV9EQUM6CisJCS8qIFBSRV9EQUMgZXZlbnQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgRW5hYmxlICovCisJCUJVR19PTihyZXFfdHlwZSAhPSBXQ0Q5WFhYX0NMU0hfUkVRX0VOQUJMRSk7CisKKwkJb2xkX3N0YXRlID0gY2RjX2Nsc2hfZC0+c3RhdGU7CisJCW5ld19zdGF0ZSA9IG9sZF9zdGF0ZSB8IHJlcV9zdGF0ZTsKKworCQlpZiAoIXdjZDl4eHhfY2xzaF9pc19zdGF0ZV92YWxpZChuZXdfc3RhdGUpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBjbGFzc0ggbm90IGEgdmFsaWQgbmV3IHN0YXRlOiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdGF0ZV90b19zdHIobmV3X3N0YXRlLCBtc2cwLCBzaXplb2YobXNnMCkpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobmV3X3N0YXRlID09IG9sZF9zdGF0ZSkgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJCSIlczogY2xhc3NIIGFscmVhZHkgaW4gcmVxdWVzdGVkIHN0YXRlOiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdGF0ZV90b19zdHIobmV3X3N0YXRlLCBtc2cwLCBzaXplb2YobXNnMCkpKTsKKwkJCXJldHVybjsKKwkJfQorCQkoKmNsc2hfc3RhdGVfZnBbbmV3X3N0YXRlXSkgKGNvZGVjLCBjZGNfY2xzaF9kLCByZXFfc3RhdGUsCisJCQkJCSAgICAgcmVxX3R5cGUpOworCQljZGNfY2xzaF9kLT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LAorCQkJIiVzOiBDbGFzc0ggc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAorCQkJX19mdW5jX18sIHN0YXRlX3RvX3N0cihvbGRfc3RhdGUsIG1zZzAsIHNpemVvZihtc2cwKSksCisJCQlzdGF0ZV90b19zdHIoY2RjX2Nsc2hfZC0+c3RhdGUsIG1zZzEsIHNpemVvZihtc2cxKSkpOworCisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DTFNIX0VWRU5UX1BPU1RfUEE6CisJCWlmIChyZXFfdHlwZSA9PSBXQ0Q5WFhYX0NMU0hfUkVRX0RJU0FCTEUpIHsKKwkJCW9sZF9zdGF0ZSA9IGNkY19jbHNoX2QtPnN0YXRlOworCQkJbmV3X3N0YXRlID0gb2xkX3N0YXRlICYgKH5yZXFfc3RhdGUpOworCisJCQlpZiAobmV3X3N0YXRlIDwgTlVNX0NMU0hfU1RBVEVTKSB7CisJCQkJaWYgKCF3Y2Q5eHh4X2Nsc2hfaXNfc3RhdGVfdmFsaWQob2xkX3N0YXRlKSkgeworCQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJCQkiJXM6SW52YWxpZCBvbGQgc3RhdGU6JXNcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCXN0YXRlX3RvX3N0cihvbGRfc3RhdGUsIG1zZzAsCisJCQkJCQlzaXplb2YobXNnMCkpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAobmV3X3N0YXRlID09IG9sZF9zdGF0ZSkgeworCQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJCSIlczogY2xzSCBhbHJlYWR5IGluIG9sZCBzdGF0ZTogJXNcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlzdGF0ZV90b19zdHIobmV3X3N0YXRlLCBtc2cwLAorCQkJCQlzaXplb2YobXNnMCkpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkoKmNsc2hfc3RhdGVfZnBbb2xkX3N0YXRlXSkgKGNvZGVjLCBjZGNfY2xzaF9kLAorCQkJCQkJCSAgICAgcmVxX3N0YXRlLAorCQkJCQkJCSAgICAgcmVxX3R5cGUpOworCQkJCWNkY19jbHNoX2QtPnN0YXRlID0gbmV3X3N0YXRlOworCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDbGFzc0ggc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgc3RhdGVfdG9fc3RyKG9sZF9zdGF0ZSwgbXNnMCwKKwkJCQkJCQkgICAgICAgc2l6ZW9mKG1zZzApKSwKKwkJCQkJc3RhdGVfdG9fc3RyKGNkY19jbHNoX2QtPnN0YXRlLCBtc2cxLAorCQkJCQkJICAgICBzaXplb2YobXNnMSkpKTsKKworCQkJfSBlbHNlIHsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczp3cm9uZyBuZXcgc3RhdGU9MHgleFxuIiwKKwkJCQkJCV9fZnVuY19fLCBuZXdfc3RhdGUpOworCQkJfQorCQl9IGVsc2UgaWYgKCEoY2RjX2Nsc2hfZC0+c3RhdGUgJiBXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8pKSB7CisJCQl3Y2Q5eHh4X2Nsc2hfZW5hYmxlX3Bvc3RfcGEoY29kZWMsIGNkY19jbHNoX2QpOworCQl9CisKKwkJYnJlYWs7CisJfQorCit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfY2xzaF9mc20pOworCit2b2lkIHdjZDl4eHhfY2xzaF9pbml0KHN0cnVjdCB3Y2Q5eHh4X2Nsc2hfY2RjX2RhdGEgKmNsc2gsCisJCSAgICAgICBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncikKK3sKKwlpbnQgaTsKKworCWNsc2gtPnN0YXRlID0gV0NEOVhYWF9DTFNIX1NUQVRFX0lETEU7CisJY2xzaC0+cmVzbWdyID0gcmVzbWdyOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DTFNIX1NUQVRFUzsgaSsrKQorCQljbHNoX3N0YXRlX2ZwW2ldID0gd2NkOXh4eF9jbHNoX3N0YXRlX2VycjsKKworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0VBUl0gPSB3Y2Q5eHh4X2Nsc2hfc3RhdGVfZWFyOworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0hQSExdID0KKwkJCQkJCXdjZDl4eHhfY2xzaF9zdGF0ZV9ocGhfbDsKKwljbHNoX3N0YXRlX2ZwW1dDRDlYWFhfQ0xTSF9TVEFURV9IUEhSXSA9CisJCQkJCQl3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX3I7CisJY2xzaF9zdGF0ZV9mcFtXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIX1NUXSA9CisJCQkJCQl3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX3N0OworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0xPXSA9IHdjZDl4eHhfY2xzaF9zdGF0ZV9sbzsKKwljbHNoX3N0YXRlX2ZwW1dDRDlYWFhfQ0xTSF9TVEFURV9IUEhMX0VBUl0gPQorCQkJCQkJd2NkOXh4eF9jbHNoX3N0YXRlX2hwaF9lYXI7CisJY2xzaF9zdGF0ZV9mcFtXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUl9FQVJdID0KKwkJCQkJCXdjZDl4eHhfY2xzaF9zdGF0ZV9ocGhfZWFyOworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVF9FQVJdID0KKwkJCQkJCXdjZDl4eHhfY2xzaF9zdGF0ZV9ocGhfZWFyOworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0hQSExfTE9dID0gd2NkOXh4eF9jbHNoX3N0YXRlX2hwaF9sbzsKKwljbHNoX3N0YXRlX2ZwW1dDRDlYWFhfQ0xTSF9TVEFURV9IUEhSX0xPXSA9IHdjZDl4eHhfY2xzaF9zdGF0ZV9ocGhfbG87CisJY2xzaF9zdGF0ZV9mcFtXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIX1NUX0xPXSA9CisJCQkJCQl3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX2xvOworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0VBUl9MT10gPSB3Y2Q5eHh4X2Nsc2hfc3RhdGVfZWFyX2xvOworCWNsc2hfc3RhdGVfZnBbV0NEOVhYWF9DTFNIX1NUQVRFX0hQSExfRUFSX0xPXSA9CisJCQkJCQl3Y2Q5eHh4X2Nsc2hfc3RhdGVfaHBoX2Vhcl9sbzsKKwljbHNoX3N0YXRlX2ZwW1dDRDlYWFhfQ0xTSF9TVEFURV9IUEhSX0VBUl9MT10gPQorCQkJCQkJd2NkOXh4eF9jbHNoX3N0YXRlX2hwaF9lYXJfbG87CisJY2xzaF9zdGF0ZV9mcFtXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIX1NUX0VBUl9MT10gPQorCQkJCQkJd2NkOXh4eF9jbHNoX3N0YXRlX2hwaF9lYXJfbG87CisKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9jbHNoX2luaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIldDRDlYWFggQ29tbW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtY29tbW9uLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwYzRhOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24uaApAQCAtMCwwICsxLDI4NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBXQ0Q5WFhYX0NPREVDX0NPTU1PTgorCisjZGVmaW5lIFdDRDlYWFhfQ09ERUNfQ09NTU9OCisKKyNpbmNsdWRlICJ3Y2Q5eHh4LXJlc21nci5oIgorCisjZGVmaW5lIFdDRDlYWFhfQ0xTSF9SRVFfRU5BQkxFIHRydWUKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1JFUV9ESVNBQkxFIGZhbHNlCisKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX0VWRU5UX1BSRV9EQUMgMHgwMQorI2RlZmluZSBXQ0Q5WFhYX0NMU0hfRVZFTlRfUE9TVF9QQSAweDAyCisKKy8qIEJhc2ljIHN0YXRlcyBmb3IgQ2xhc3MgSCBzdGF0ZSBtYWNoaW5lLgorICogcmVwcmVzZW50ZWQgYXMgYSBiaXQgbWFzayB3aXRoaW4gYSB1OCBkYXRhIHR5cGUKKyAqIGJpdCAwOiBFQVIgbW9kZQorICogYml0IDE6IEhQSCBMZWZ0IG1vZGUKKyAqIGJpdCAyOiBIUEggUmlnaHQgbW9kZQorICogYml0IDM6IExpbmVvdXQgbW9kZQorICogYml0IDQ6IFVsdHJhc291bmQgbW9kZQorICovCisjZGVmaW5lCVdDRDlYWFhfQ0xTSF9TVEFURV9JRExFIDB4MDAKKyNkZWZpbmUJV0NEOVhYWF9DTFNIX1NUQVRFX0VBUiAoMHgwMSA8PCAwKQorI2RlZmluZQlXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCAoMHgwMSA8PCAxKQorI2RlZmluZQlXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUiAoMHgwMSA8PCAyKQorI2RlZmluZQlXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8gKDB4MDEgPDwgMykKKyNkZWZpbmUgTlVNX0NMU0hfU1RBVEVTICgweDAxIDw8IDQpCisKKyNkZWZpbmUJV0NEOVhYWF9DTFNBQl9TVEFURV9JRExFICAweDAwCisjZGVmaW5lIFdDRDlYWFhfQ0xTQUJfU1RBVEVfSFBITCAoMHgwMSA8PCAxKQorI2RlZmluZSBXQ0Q5WFhYX0NMU0FCX1NUQVRFX0hQSFIgKDB4MDEgPDwgMikKKworI2RlZmluZSBXQ0Q5WFhYX0NMU0FCX1JFUV9FTkFCTEUgIHRydWUKKyNkZWZpbmUgV0NEOVhYWF9DTFNBQl9SRVFfRElTQUJMRSBmYWxzZQorCisjZGVmaW5lIFdDRDlYWFhfTk9OX1VIUUFfTU9ERQkwCisKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX0RJVl8yICAgIDB4MAorI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfRElWXzMgICAgMHgxCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9ESVZfNCAgICAweDIKKworI2RlZmluZSBXQ0Q5WFhYX0RNSUNfQjFfQ1RMX0RJVl8yIDB4MDAKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX0IxX0NUTF9ESVZfMyAweDIyCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19CMV9DVExfRElWXzQgMHg0NAorCisjZGVmaW5lIFdDRDlYWFhfRE1JQ19CMl9DVExfRElWXzIgMHgwMAorI2RlZmluZSBXQ0Q5WFhYX0RNSUNfQjJfQ1RMX0RJVl8zIDB4MDIKKyNkZWZpbmUgV0NEOVhYWF9ETUlDX0IyX0NUTF9ESVZfNCAweDA0CisKKyNkZWZpbmUgV0NEOVhYWF9BTkNfRE1JQ19YMl9PTiAgICAweDEKKyNkZWZpbmUgV0NEOVhYWF9BTkNfRE1JQ19YMl9PRkYgICAweDAKKworLyogRGVyaXZlZCBTdGF0ZTogQml0cyAxIGFuZCAyIHNob3VsZCBiZSBzZXQgZm9yIEhlYWRwaG9uZSBzdGVyZW8gKi8KKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVCAoV0NEOVhYWF9DTFNIX1NUQVRFX0hQSEwgfCBcCisJCQkJCQlXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUikKKworI2RlZmluZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITF9FQVIgKFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMIHwgXAorCQkJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0VBUikKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFJfRUFSIChXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUiB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9FQVIpCisKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSF9TVF9FQVIgKFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1QgfCBcCisJCQkJCQlXQ0Q5WFhYX0NMU0hfU1RBVEVfRUFSKQorCisjZGVmaW5lIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMX0xPIChXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITCB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9MTykKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFJfTE8gKFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhSIHwgXAorCQkJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0xPKQorCisjZGVmaW5lIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1RfTE8gKFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1QgfCBcCisJCQkJCQlXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8pCisKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0VBUl9MTyAoV0NEOVhYWF9DTFNIX1NUQVRFX0VBUiB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9MTykKKworI2RlZmluZSBXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBITF9FQVJfTE8gKFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhMIHwgXAorCQkJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0VBUiB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9MTykKKyNkZWZpbmUgV0NEOVhYWF9DTFNIX1NUQVRFX0hQSFJfRUFSX0xPIChXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIUiB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9FQVIgfCBcCisJCQkJCQlXQ0Q5WFhYX0NMU0hfU1RBVEVfTE8pCisjZGVmaW5lIFdDRDlYWFhfQ0xTSF9TVEFURV9IUEhfU1RfRUFSX0xPIChXQ0Q5WFhYX0NMU0hfU1RBVEVfSFBIX1NUIHwgXAorCQkJCQkJV0NEOVhYWF9DTFNIX1NUQVRFX0VBUiB8IFwKKwkJCQkJCVdDRDlYWFhfQ0xTSF9TVEFURV9MTykKKworc3RydWN0IHdjZDl4eHhfcmVnX21hc2tfdmFsIHsKKwl1MTYJcmVnOworCXU4CW1hc2s7CisJdTgJdmFsOworfTsKKworZW51bSBuY3BfZmNsa19sZXZlbCB7CisJTkNQX0ZDTEtfTEVWRUxfOCwKKwlOQ1BfRkNMS19MRVZFTF81LAorCU5DUF9GQ0xLX0xFVkVMX01BWCwKK307CisKKy8qIENsYXNzIEggZGF0YSB0aGF0IHRoZSBjb2RlYyBkcml2ZXIgd2lsbCBtYWludGFpbiAqLworc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSB7CisJdTggc3RhdGU7CisJaW50IGJ1Y2tfbXY7CisJYm9vbCBpc19keW5hbWljX3ZkZF9jcDsKKwlpbnQgY2xzaF91c2VyczsKKwlpbnQgYnVja191c2VyczsKKwlpbnQgbmNwX3VzZXJzW05DUF9GQ0xLX0xFVkVMX01BWF07CisJc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3I7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyIHsKKwl1MzIgcmVzZXJ2ZWRbM107CisJdTMyIG51bV9hbmNfc2xvdHM7Cit9OworCitlbnVtIHdjZDl4eHhfYnVja192b2x0IHsKKwlXQ0Q5WFhYX0NEQ19CVUNLX1VOU1VQUE9SVEVEID0gMCwKKwlXQ0Q5WFhYX0NEQ19CVUNLX01WXzFQOCA9IDE4MDAwMDAsCisJV0NEOVhYWF9DRENfQlVDS19NVl8yUDE1ID0gMjE1MDAwMCwKK307CisKK3N0cnVjdCBtYWRfYXVkaW9faGVhZGVyIHsKKwl1MzIgcmVzZXJ2ZWRbM107CisJdTMyIG51bV9yZWdfY2ZnOworfTsKKworc3RydWN0IG1hZF9taWNyb3Bob25lX2luZm8geworCXVpbnQ4X3QgaW5wdXRfbWljcm9waG9uZTsKKwl1aW50OF90IGN5Y2xlX3RpbWU7CisJdWludDhfdCBzZXR0bGVfdGltZTsKKwl1aW50OF90IHBhZGRpbmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbWFkX21pY2JpYXNfaW5mbyB7CisJdWludDhfdCBtaWNiaWFzOworCXVpbnQ4X3Qga19mYWN0b3I7CisJdWludDhfdCBleHRlcm5hbF9ieXBhc3NfY2FwYWNpdG9yOworCXVpbnQ4X3QgaW50ZXJuYWxfYmlhc2luZzsKKwl1aW50OF90IGNmaWx0ZXI7CisJdWludDhfdCBwYWRkaW5nWzNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IG1hZF9ybXNfYXVkaW9fYmVhY29uX2luZm8geworCXVpbnQ4X3Qgcm1zX29taXRfc2FtcGxlczsKKwl1aW50OF90IHJtc19jb21wX3RpbWU7CisJdWludDhfdCBkZXRlY3Rpb25fbWVjaGFuaXNtOworCXVpbnQ4X3Qgcm1zX2RpZmZfdGhyZXNob2xkOworCXVpbnQ4X3Qgcm1zX3RocmVzaG9sZF9sc2I7CisJdWludDhfdCBybXNfdGhyZXNob2xkX21zYjsKKwl1aW50OF90IHBhZGRpbmdbMl07CisJdWludDhfdCBpaXJfY29lZmZpY2llbnRzWzM2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtYWRfcm1zX3VsdHJhc291bmRfaW5mbyB7CisJdWludDhfdCBybXNfY29tcF90aW1lOworCXVpbnQ4X3QgZGV0ZWN0aW9uX21lY2hhbmlzbTsKKwl1aW50OF90IHJtc19kaWZmX3RocmVzaG9sZDsKKwl1aW50OF90IHJtc190aHJlc2hvbGRfbHNiOworCXVpbnQ4X3Qgcm1zX3RocmVzaG9sZF9tc2I7CisJdWludDhfdCBwYWRkaW5nWzNdOworCXVpbnQ4X3QgaWlyX2NvZWZmaWNpZW50c1szNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbWFkX2F1ZGlvX2NhbCB7CisJdWludDMyX3QgdmVyc2lvbjsKKwlzdHJ1Y3QgbWFkX21pY3JvcGhvbmVfaW5mbyBtaWNyb3Bob25lX2luZm87CisJc3RydWN0IG1hZF9taWNiaWFzX2luZm8gbWljYmlhc19pbmZvOworCXN0cnVjdCBtYWRfcm1zX2F1ZGlvX2JlYWNvbl9pbmZvIGF1ZGlvX2luZm87CisJc3RydWN0IG1hZF9ybXNfYXVkaW9fYmVhY29uX2luZm8gYmVhY29uX2luZm87CisJc3RydWN0IG1hZF9ybXNfdWx0cmFzb3VuZF9pbmZvIHVsdHJhc291bmRfaW5mbzsKK30gX19wYWNrZWQ7CisKK2V4dGVybiB2b2lkIHdjZDl4eHhfY2xzaF9mc20oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgd2NkOXh4eF9jbHNoX2NkY19kYXRhICpjZGNfY2xzaF9kLAorCQl1OCByZXFfc3RhdGUsIGJvb2wgcmVxX3R5cGUsIHU4IGNsc2hfZXZlbnQpOworCitleHRlcm4gdm9pZCB3Y2Q5eHh4X2VuYWJsZV9oaWdoX3BlcmZfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAorCQkJCXU4IHVocWFfbW9kZSwgdTggcmVxX3N0YXRlLCBib29sIHJlcV90eXBlKTsKKworZXh0ZXJuIHZvaWQgd2NkOXh4eF9jbHNoX2luaXQoc3RydWN0IHdjZDl4eHhfY2xzaF9jZGNfZGF0YSAqY2xzaCwKKwkJCSAgICAgIHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKTsKKworZXh0ZXJuIHZvaWQgd2NkOXh4eF9jbHNoX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICBpbnQgaW1wZWQpOworCitlbnVtIHdjZDl4eHhfY29kZWNfZXZlbnQgeworCVdDRDlYWFhfQ09ERUNfRVZFTlRfQ09ERUNfVVAgPSAwLAorfTsKKworc3RydWN0IHdjZDl4eHhfcmVnaXN0ZXJfc2F2ZV9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxoOworCXUxNiByZWc7CisJdTE2IHZhbHVlOworfTsKKworZXh0ZXJuIGludCB3Y2Q5eHh4X3NvY191cGRhdGVfYml0c19wdXNoKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqbGgsCisJCQkJCXVpbnQxNl90IHJlZywgdWludDhfdCBtYXNrLAorCQkJCQl1aW50OF90IHZhbHVlLCBpbnQgZGVsYXkpOworZXh0ZXJuIHZvaWQgd2NkOXh4eF9yZXN0b3JlX3JlZ2lzdGVycyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGgpOworZW51bSB7CisJUkVTRVJWRUQgPSAwLAorCUFBTkNfTFBGX0ZGX0ZCID0gMSwKKwlBQU5DX0xQRl9DT0VGRl9NU0IsCisJQUFOQ19MUEZfQ09FRkZfTFNCLAorCUhXX01BRF9BVURJT19FTkFCTEUsCisJSFdfTUFEX1VMVFJfRU5BQkxFLAorCUhXX01BRF9CRUFDT05fRU5BQkxFLAorCUhXX01BRF9BVURJT19TTEVFUF9USU1FLAorCUhXX01BRF9VTFRSX1NMRUVQX1RJTUUsCisJSFdfTUFEX0JFQUNPTl9TTEVFUF9USU1FLAorCUhXX01BRF9UWF9BVURJT19TV0lUQ0hfT0ZGLAorCUhXX01BRF9UWF9VTFRSX1NXSVRDSF9PRkYsCisJSFdfTUFEX1RYX0JFQUNPTl9TV0lUQ0hfT0ZGLAorCU1BRF9BVURJT19JTlRfREVTVF9TRUxFQ1RfUkVHLAorCU1BRF9VTFRfSU5UX0RFU1RfU0VMRUNUX1JFRywKKwlNQURfQkVBQ09OX0lOVF9ERVNUX1NFTEVDVF9SRUcsCisJTUFEX0NMSVBfSU5UX0RFU1RfU0VMRUNUX1JFRywKKwlNQURfVkJBVF9JTlRfREVTVF9TRUxFQ1RfUkVHLAorCU1BRF9BVURJT19JTlRfTUFTS19SRUcsCisJTUFEX1VMVF9JTlRfTUFTS19SRUcsCisJTUFEX0JFQUNPTl9JTlRfTUFTS19SRUcsCisJTUFEX0NMSVBfSU5UX01BU0tfUkVHLAorCU1BRF9WQkFUX0lOVF9NQVNLX1JFRywKKwlNQURfQVVESU9fSU5UX1NUQVRVU19SRUcsCisJTUFEX1VMVF9JTlRfU1RBVFVTX1JFRywKKwlNQURfQkVBQ09OX0lOVF9TVEFUVVNfUkVHLAorCU1BRF9DTElQX0lOVF9TVEFUVVNfUkVHLAorCU1BRF9WQkFUX0lOVF9TVEFUVVNfUkVHLAorCU1BRF9BVURJT19JTlRfQ0xFQVJfUkVHLAorCU1BRF9VTFRfSU5UX0NMRUFSX1JFRywKKwlNQURfQkVBQ09OX0lOVF9DTEVBUl9SRUcsCisJTUFEX0NMSVBfSU5UX0NMRUFSX1JFRywKKwlNQURfVkJBVF9JTlRfQ0xFQVJfUkVHLAorCVNCX1BHRF9QT1JUX1RYX1dBVEVSTUFSS19OLAorCVNCX1BHRF9QT1JUX1RYX0VOQUJMRV9OLAorCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLAorCVNCX1BHRF9QT1JUX1JYX0VOQUJMRV9OLAorCVNCX1BHRF9UWF9QT1JUbl9NVUxUSV9DSE5MXzAsCisJU0JfUEdEX1RYX1BPUlRuX01VTFRJX0NITkxfMSwKKwlTQl9QR0RfUlhfUE9SVG5fTVVMVElfQ0hOTF8wLAorCVNCX1BHRF9SWF9QT1JUbl9NVUxUSV9DSE5MXzEsCisJQUFOQ19GRl9HQUlOX0FEQVBUSVZFLAorCUFBTkNfRkZHQUlOX0FEQVBUSVZFX0VOLAorCUFBTkNfR0FJTl9DT05UUk9MLAorCVNQS1JfQ0xJUF9QSVBFX0JBTktfU0VMLAorCVNQS1JfQ0xJUERFVF9WQUwwLAorCVNQS1JfQ0xJUERFVF9WQUwxLAorCVNQS1JfQ0xJUERFVF9WQUwyLAorCVNQS1JfQ0xJUERFVF9WQUwzLAorCVNQS1JfQ0xJUERFVF9WQUw0LAorCVNQS1JfQ0xJUERFVF9WQUw1LAorCVNQS1JfQ0xJUERFVF9WQUw2LAorCVNQS1JfQ0xJUERFVF9WQUw3LAorCVZCQVRfUkVMRUFTRV9JTlRfREVTVF9TRUxFQ1RfUkVHLAorCVZCQVRfUkVMRUFTRV9JTlRfTUFTS19SRUcsCisJVkJBVF9SRUxFQVNFX0lOVF9TVEFUVVNfUkVHLAorCVZCQVRfUkVMRUFTRV9JTlRfQ0xFQVJfUkVHLAorCU1BRDJfQ0xJUF9JTlRfREVTVF9TRUxFQ1RfUkVHLAorCU1BRDJfQ0xJUF9JTlRfTUFTS19SRUcsCisJTUFEMl9DTElQX0lOVF9TVEFUVVNfUkVHLAorCU1BRDJfQ0xJUF9JTlRfQ0xFQVJfUkVHLAorCVNQS1IyX0NMSVBfUElQRV9CQU5LX1NFTCwKKwlTUEtSMl9DTElQREVUX1ZBTDAsCisJU1BLUjJfQ0xJUERFVF9WQUwxLAorCVNQS1IyX0NMSVBERVRfVkFMMiwKKwlTUEtSMl9DTElQREVUX1ZBTDMsCisJU1BLUjJfQ0xJUERFVF9WQUw0LAorCVNQS1IyX0NMSVBERVRfVkFMNSwKKwlTUEtSMl9DTElQREVUX1ZBTDYsCisJU1BLUjJfQ0xJUERFVF9WQUw3LAorCU1BWF9DRkdfUkVHSVNURVJTLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtbWJoYy5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LW1iaGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJkODRiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LW1iaGMuYwpAQCAtMCwwICsxLDU2NzYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5MzIwX3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgIndjZDl4eHgtbWJoYy5oIgorI2luY2x1ZGUgIndjZGNhbC1od2RlcC5oIgorI2luY2x1ZGUgIndjZDl4eHgtcmVzbWdyLmgiCisjaW5jbHVkZSAid2NkOXh4eC1jb21tb24uaCIKKworI2RlZmluZSBXQ0Q5WFhYX0pBQ0tfTUFTSyAoU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX09DX0hQSEwgfCBcCisJCQkgICBTTkRfSkFDS19PQ19IUEhSIHwgU05EX0pBQ0tfTElORU9VVCB8IFwKKwkJCSAgIFNORF9KQUNLX1VOU1VQUE9SVEVEIHwgU05EX0pBQ0tfTUlDUk9QSE9ORTIgfCBcCisJCQkgICBTTkRfSkFDS19NRUNIQU5JQ0FMKQorI2RlZmluZSBXQ0Q5WFhYX0pBQ0tfQlVUVE9OX01BU0sgKFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBcCisJCQkJICBTTkRfSkFDS19CVE5fMiB8IFNORF9KQUNLX0JUTl8zIHwgXAorCQkJCSAgU05EX0pBQ0tfQlROXzQgfCBTTkRfSkFDS19CVE5fNSkKKworI2RlZmluZSBOVU1fRENFX1BMVUdfREVURUNUIDMKKyNkZWZpbmUgTlVNX0RDRV9QTFVHX0lOU19ERVRFQ1QgNQorI2RlZmluZSBOVU1fQVRURU1QVFNfSU5TRVJUX0RFVEVDVCAyNQorI2RlZmluZSBOVU1fQVRURU1QVFNfVE9fUkVQT1JUIDUKKworI2RlZmluZSBGQUtFX0lOU19MT1cgMTAKKyNkZWZpbmUgRkFLRV9JTlNfSElHSCA4MAorI2RlZmluZSBGQUtFX0lOU19ISUdIX05PX1NXQ0ggMTUwCisjZGVmaW5lIEZBS0VfUkVNT1ZBTF9NSU5fUEVSSU9EX01TIDUwCisjZGVmaW5lIEZBS0VfSU5TX0RFTFRBX1NDQUxFRF9NViAzMDAKKworI2RlZmluZSBCVVRUT05fTUlOIDB4ODAwMAorI2RlZmluZSBTVEFUVVNfUkVMX0RFVEVDVElPTiAweDBDCisKKyNkZWZpbmUgSFNfREVURUNUX1BMVUdfVElNRV9NUyAoNSAqIDEwMDApCisjZGVmaW5lIEFOQ19IUEhfREVURUNUX1BMVUdfVElNRV9NUyAoNSAqIDEwMDApCisjZGVmaW5lIEhTX0RFVEVDVF9QTFVHX0lORVJWQUxfTVMgMTAwCisjZGVmaW5lIFNXQ0hfUkVMX0RFQk9VTkNFX1RJTUVfTVMgNTAKKyNkZWZpbmUgU1dDSF9JUlFfREVCT1VOQ0VfVElNRV9VUyA1MDAwCisjZGVmaW5lIEJUTl9SRUxFQVNFX0RFQk9VTkNFX1RJTUVfTVMgMjUKKworI2RlZmluZSBHTkRfTUlDX1NXQVBfVEhSRVNIT0xEIDIKKyNkZWZpbmUgT0NQX0FUVEVNUFQgMQorCisjZGVmaW5lIEZXX1JFQURfQVRURU1QVFMgMTUKKyNkZWZpbmUgRldfUkVBRF9USU1FT1VUIDQwMDAwMDAKKworI2RlZmluZSBCVVRUT05fUE9MTElOR19TVVBQT1JURUQgdHJ1ZQorCisjZGVmaW5lIE1DTEtfUkFURV8xMjI4OEtIWiAxMjI4ODAwMAorI2RlZmluZSBNQ0xLX1JBVEVfOTYwMEtIWiA5NjAwMDAwCisKKyNkZWZpbmUgREVGQVVMVF9EQ0VfU1RBX1dBSVQgNTUKKyNkZWZpbmUgREVGQVVMVF9EQ0VfV0FJVCA2MDAwMAorI2RlZmluZSBERUZBVUxUX1NUQV9XQUlUIDUwMDAKKworI2RlZmluZSBWRERJT19NSUNCSUFTX01WIDE4MDAKKworI2RlZmluZSBXQ0Q5WFhYX01JQ0JJQVNfUFVMTERPV05fU0VUVExFX1VTIDUwMDAKKworI2RlZmluZSBXQ0Q5WFhYX0hQSExfU1RBVFVTX1JFQURZX1dBSVRfVVMgMTAwMAorI2RlZmluZSBXQ0Q5WFhYX01VWF9TV0lUQ0hfUkVBRFlfV0FJVF9NUyA1MAorI2RlZmluZSBXQ0Q5WFhYX01FQVNfREVMVEFfTUFYX01WIDEyMAorI2RlZmluZSBXQ0Q5WFhYX01FQVNfSU5WQUxEX1JBTkdFX0xPV19NViAyMAorI2RlZmluZSBXQ0Q5WFhYX01FQVNfSU5WQUxEX1JBTkdFX0hJR0hfTVYgODAKKworLyogVGhyZXNob2xkIGluIG1pbGxpb2htIHVzZWQgZm9yIG1vbm8vc3RlcmVvCisgKiBwbHVnIGNsYXNzaWZpY2F0aW9uCisgKi8KKyNkZWZpbmUgV0NEOVhYWF9NT05PX0hTX0RJRkZfVEhSIDIwMDAwMDAwCisjZGVmaW5lIFdDRDlYWFhfTU9OT19IU19NSU5fVEhSIDIwMDAKKworLyoKKyAqIEludmFsaWQgdm9sdGFnZSByYW5nZSBmb3IgdGhlIGRldGVjdGlvbgorICogb2YgcGx1ZyB0eXBlIHdpdGggY3VycmVudCBzb3VyY2UKKyAqLworI2RlZmluZSBXQ0Q5WFhYX0NTX01FQVNfSU5WQUxEX1JBTkdFX0xPV19NViAxNjAKKyNkZWZpbmUgV0NEOVhYWF9DU19NRUFTX0lOVkFMRF9SQU5HRV9ISUdIX01WIDI2NQorCisvKgorICogVGhyZXNob2xkIHVzZWQgdG8gZGV0ZWN0IGV1cm8gaGVhZHNldAorICogd2l0aCBjdXJyZW50IHNvdXJjZQorICovCisjZGVmaW5lIFdDRDlYWFhfQ1NfR01fU1dBUF9USFJFU19NSU5fTVYgMTAKKyNkZWZpbmUgV0NEOVhYWF9DU19HTV9TV0FQX1RIUkVTX01BWF9NViA0MAorCisjZGVmaW5lIFdDRDlYWFhfTUJIQ19OU0NfQ1MgOQorI2RlZmluZSBXQ0Q5WFhYX0dNX1NXQVBfVEhSRVNfTUlOX01WIDE1MAorI2RlZmluZSBXQ0Q5WFhYX0dNX1NXQVBfVEhSRVNfTUFYX01WIDY1MAorI2RlZmluZSBXQ0Q5WFhYX1RIUkVTSE9MRF9NSUNfVEhSRVNIT0xEIDIwMAorCisjZGVmaW5lIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyAxMDAKKworLyogUlhfSFBIX0NOUF9XR19USU1FIGluY3JlYXNlcyBieSAwLjI0bXMgKi8KKyNkZWZpbmUgV0NEOVhYWF9XR19USU1FX0ZBQ1RPUl9VUwkyNDAKKworI2RlZmluZSBXQ0Q5WFhYX1ZfQ1NfSFNfTUFYIDUwMAorI2RlZmluZSBXQ0Q5WFhYX1ZfQ1NfTk9fTUlDIDUKKyNkZWZpbmUgV0NEOVhYWF9NQl9NRUFTX0RFTFRBX01BWF9NViA4MAorI2RlZmluZSBXQ0Q5WFhYX0NTX01FQVNfREVMVEFfTUFYX01WIDEyCisKKyNkZWZpbmUgV0NEOVhYWF9aREVUX1pPTkVfMSA4MDAwMAorI2RlZmluZSBXQ0Q5WFhYX1pERVRfWk9ORV8yIDgwMDAwMAorCisjZGVmaW5lIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzEoeCkgKHggPCBXQ0Q5WFhYX1pERVRfWk9ORV8xID8gMSA6IDApCisjZGVmaW5lIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzIoeCkgKCh4ID4gV0NEOVhYWF9aREVUX1pPTkVfMSAmJiBcCisJCQkJeCA8IFdDRDlYWFhfWkRFVF9aT05FXzIpID8gMSA6IDApCisjZGVmaW5lIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzMoeCkgKHggPiBXQ0Q5WFhYX1pERVRfWk9ORV8yID8gMSA6IDApCisjZGVmaW5lIFdDRDlYWFhfQk9YX0NBUl9BVlJHX01JTiAxCisjZGVmaW5lIFdDRDlYWFhfQk9YX0NBUl9BVlJHX01BWCAxMAorCisvKgorICogTmVlZCB0byByZXBvcnQgTElORUlOIGlmIEgvTCBpbXBlZGFuY2UKKyAqIGlzIGxhcmdlciB0aGFuIDVLIG9obQorICovCisjZGVmaW5lIFdDRDlYWFhfTElORUlOX1RIUkVTSE9MRCA1MDAwMDAwCisKK3N0YXRpYyBpbnQgaW1wZWRhbmNlX2RldGVjdF9lbjsKK21vZHVsZV9wYXJhbShpbXBlZGFuY2VfZGV0ZWN0X2VuLCBpbnQsIDA2NjQpOworTU9EVUxFX1BBUk1fREVTQyhpbXBlZGFuY2VfZGV0ZWN0X2VuLCAiZW5hYmxlL2Rpc2FibGUgaW1wZWRhbmNlIGRldGVjdCIpOworc3RhdGljIHVuc2lnbmVkIGludCB6X2RldF9ib3hfY2FyX2F2ZyA9IDE7Cittb2R1bGVfcGFyYW0oel9kZXRfYm94X2Nhcl9hdmcsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHpfZGV0X2JveF9jYXJfYXZnLAorCQkgIk51bWJlciBvZiBzYW1wbGVzIGZvciBpbXBlZGFuY2UgZGV0ZWN0aW9uIik7CisKK3N0YXRpYyBib29sIGRldGVjdF91c2VfdmRkaW9fc3dpdGNoOworCitzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2RldGVjdCB7CisJdTE2IGRjZTsKKwl1MTYgc3RhOworCXUxNiBocGhsX3N0YXR1czsKKwlib29sIHN3YXBfZ25kOworCWJvb2wgdmRkaW87CisJYm9vbCBod3ZhbHVlOworCWJvb2wgbWljX2JpYXM7CisJLyogaW50ZXJuYWwgcHVycG9zZSBmcm9tIGhlcmUgKi8KKwlib29sIF9hYm92ZV9ub19taWM7CisJYm9vbCBfYmVsb3dfdl9oc19tYXg7CisJczE2IF92ZGNlczsKKwllbnVtIHdjZDl4eHhfbWJoY19wbHVnX3R5cGUgX3R5cGU7Cit9OworCitlbnVtIG1lYXNfdHlwZSB7CisJU1RBID0gMCwKKwlEQ0UsCit9OworCitlbnVtIHsKKwlNQkhDX1VTRV9IUEhMX1RSSUdHRVIgPSAxLAorCU1CSENfVVNFX01CX1RSSUdHRVIgPSAyCit9OworCisvKgorICogRmxhZ3MgdG8gdHJhY2sgb2YgUEEgYW5kIERBQyBzdGF0ZS4KKyAqIFBBIGFuZCBEQUMgc2hvdWxkIGJlIHRyYWNrZWQgc2VwYXJhdGVseSBhcyBBVVhQR0EgbG9vcGJhY2sgcmVxdWlyZXMKKyAqIG9ubHkgUEEgdG8gYmUgdHVybmVkIG9uIHdpdGhvdXQgREFDIGJlaW5nIG9uLgorICovCitlbnVtIHBhX2RhY19hY2tfZmxhZ3MgeworCVdDRDlYWFhfSFBITF9QQV9PRkZfQUNLID0gMCwKKwlXQ0Q5WFhYX0hQSFJfUEFfT0ZGX0FDSywKKwlXQ0Q5WFhYX0hQSExfREFDX09GRl9BQ0ssCisJV0NEOVhYWF9IUEhSX0RBQ19PRkZfQUNLCit9OworCitlbnVtIHdjZDl4eHhfY3VycmVudF92X2lkeCB7CisJV0NEOVhYWF9DVVJSRU5UX1ZfSU5TX0gsCisJV0NEOVhYWF9DVVJSRU5UX1ZfSU5TX0hVLAorCVdDRDlYWFhfQ1VSUkVOVF9WX0IxX0gsCisJV0NEOVhYWF9DVVJSRU5UX1ZfQjFfSFUsCisJV0NEOVhYWF9DVVJSRU5UX1ZfQlJfSCwKK307CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9kZXRlY3RfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCQkgICAgdWludDMyX3QgKnpyKTsKK3N0YXRpYyBzMTYgd2NkOXh4eF9nZXRfY3VycmVudF92KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkJIGNvbnN0IGVudW0gd2NkOXh4eF9jdXJyZW50X3ZfaWR4IGlkeCk7CitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2dldF96KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHMxNiAqZGNlX3osIHMxNiAqc3RhX3osCisJCQkgIHN0cnVjdCBtYmhjX21pY2JpYXNfcmVncyAqbWljYl9yZWdzLAorCQkJICBib29sIG5vcmVsKTsKKworc3RhdGljIHZvaWQgd2NkOXh4eF9tYmhjX2NhbGNfdGhyZXMoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYyk7CisKK3N0YXRpYyB1MTYgd2NkOXh4eF9jb2RlY192X3N0YV9kY2Uoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkgICBlbnVtIG1lYXNfdHlwZSBkY2UsIHMxNiB2aW5fbXYsCisJCQkJICAgYm9vbCBjc19lbmFibGUpOworCitzdGF0aWMgYm9vbCB3Y2Q5eHh4X21iaGNfcG9sbGluZyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCXJldHVybiBzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19FTl9DVEwpICYgMHgxOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3R1cm5fb25vZmZfb3ZlcnJpZGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgYm9vbCBvbikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsCisJCQkgICAgMHgwNCwgb24gPyAweDA0IDogMHgwMCk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3BhdXNlX2hzX3BvbGxpbmcoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIW1iaGMtPnBvbGxpbmdfYWN0aXZlKSB7CisJCXByX2RlYnVnKCJwb2xsaW5nIG5vdCBhY3RpdmUsIG5vdGhpbmcgdG8gcGF1c2VcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogU29mdCByZXNldCBNQkhDIGJsb2NrICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwgMHg4KTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3N0YXJ0X2hzX3BvbGxpbmcoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlpbnQgbWJoY19zdGF0ZSA9IG1iaGMtPm1iaGNfc3RhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFtYmhjLT5wb2xsaW5nX2FjdGl2ZSkgeworCQlwcl9kZWJ1ZygiUG9sbGluZyBpcyBub3QgYWN0aXZlLCBkbyBub3Qgc3RhcnQgcG9sbGluZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHNldHVwIGludGVybmFsIG1pY2JpYXMgaWYgY29kZWMgdXNlcyBpbnRlcm5hbCBtaWNiaWFzIGZvcgorCSAqIGhlYWRzZXQgZGV0ZWN0aW9uCisJICovCisJaWYgKG1iaGMtPm1iaGNfY2ZnLT51c2VfaW50X3JiaWFzKSB7CisJCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPnNldHVwX2ludF9yYmlhcykKKwkJCW1iaGMtPm1iaGNfY2ItPnNldHVwX2ludF9yYmlhcyhjb2RlYywgdHJ1ZSk7CisJCWVsc2UKKwkJCXByX2VycigiJXM6IGludGVybmFsIGJpYXMgcmVxdWVzdGVkIGJ1dCBjb2RlYyBkaWQgbm90IHByb3ZpZGUgY2FsbGJhY2tcbiIsCisJCQkJX19mdW5jX18pOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4MDQpOworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tdXhfYmlhc19ibG9jaykKKwkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKGNvZGVjKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsCisJCQkJICAgIDB4ODAsIDB4ODApOworCisJaWYgKCFtYmhjLT5ub19taWNfaGVhZHNldF9vdmVycmlkZSAmJgorCSAgICBtYmhjX3N0YXRlID09IE1CSENfU1RBVEVfUE9URU5USUFMKSB7CisJCXByX2RlYnVnKCIlcyByZWNvdmVyaW5nIE1CSEMgc3RhdGUgbWFjaGluZVxuIiwgX19mdW5jX18pOworCQltYmhjLT5tYmhjX3N0YXRlID0gTUJIQ19TVEFURV9QT1RFTlRJQUxfUkVDT1ZFUlk7CisJCS8qIHNldCB0byBtYXggYnV0dG9uIHByZXNzIHRocmVzaG9sZCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMl9DVEwsIDB4N0YpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMV9DVEwsIDB4RkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwsIDB4N0YpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CM19DVEwsIDB4RkYpOworCQkvKiBzZXQgdG8gbWF4ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I2X0NUTCwgMHg3Rik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I1X0NUTCwgMHhGRik7CisJfQorCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHgxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHg4LCAweDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19FTl9DVEwsIDB4MSk7CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IF9fd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCXVuc2lnbmVkIGludCBjZmlsdF9tdikKK3sKKwlyZXR1cm4gd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKG1iaGMtPnJlc21nciwgY2ZpbHRfbXYpOworfQorCisvKgorICogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24KKyAqIHJldHVybiBvbGQgc3RhdHVzCisgKi8KK3N0YXRpYyBib29sIF9fd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJCSAgICAgaW50IHZkZGlvX3N3aXRjaCwgYm9vbCByZXN0YXJ0cG9sbGluZywKKwkJCQkgICAgIGJvb2wgY2hlY2twb2xsaW5nKQoreworCWJvb2wgcmV0OworCWludCBjZmlsdF9rX3ZhbDsKKwlib29sIG92ZXJyaWRlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgbWJoY19pbnRlcm5hbF9jYWxfZGF0YSAqZCA9ICZtYmhjLT5tYmhjX2RhdGE7CisKKwljb2RlYyA9IG1iaGMtPmNvZGVjOworCisJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlKSB7CisJCXByX2RlYnVnKCIlczogbWljYmlhcyBpcyBhbHJlYWR5IG9uXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IG1iaGMtPm1iaGNfbWljYmlhc19zd2l0Y2hlZDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQ7CisJaWYgKHZkZGlvX3N3aXRjaCAmJiAhbWJoYy0+bWJoY19taWNiaWFzX3N3aXRjaGVkICYmCisJICAgICghY2hlY2twb2xsaW5nIHx8IG1iaGMtPnBvbGxpbmdfYWN0aXZlKSkgeworCQlpZiAocmVzdGFydHBvbGxpbmcpCisJCQl3Y2Q5eHh4X3BhdXNlX2hzX3BvbGxpbmcobWJoYyk7CisJCW92ZXJyaWRlID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMKSAmCisJCQkgICAweDA0OworCQlpZiAoIW92ZXJyaWRlKQorCQkJd2NkOXh4eF90dXJuX29ub2ZmX292ZXJyaWRlKG1iaGMsIHRydWUpOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQURfQU5BX0NUUkwsCisJCQkJICAgIDB4MTAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTERPX0hfTU9ERV8xLAorCQkJCSAgICAweDIwLCAweDAwKTsKKwkJLyogQWRqdXN0IHRocmVzaG9sZCBpZiBNaWMgQmlhcyB2b2x0YWdlIGNoYW5nZXMgKi8KKwkJaWYgKGQtPm1pY2JfbXYgIT0gVkRESU9fTUlDQklBU19NVikgeworCQkJY2ZpbHRfa192YWwgPSBfX3djZDl4eHhfcmVzbWdyX2dldF9rX3ZhbChtYmhjLAorCQkJCQkJCSAgICAgIFZERElPX01JQ0JJQVNfTVYpOworCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQltYmhjLT5tYmhjX2JpYXNfcmVncy5jZmlsdF92YWwsCisJCQkJCTB4RkMsIChjZmlsdF9rX3ZhbCA8PCAyKSk7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMTAwKTsKKwkJCS8qIFRocmVzaG9kcyBmb3IgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxX0NUTCwKKwkJCQkgICAgICBkLT52X2luc19odVtNQkhDX1ZfSURYX1ZERElPXSAmIDB4RkYpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjJfQ1RMLAorCQkJCSAgICAgIChkLT52X2luc19odVtNQkhDX1ZfSURYX1ZERElPXSA+PiA4KSAmCisJCQkJICAgICAgMHhGRik7CisKKwkJCWlmIChtYmhjLT5tYmhjX3N0YXRlICE9IE1CSENfU1RBVEVfUE9URU5USUFMX1JFQ09WRVJZKSB7CisJCQkJLyogVGhyZXNob2RzIGZvciBidXR0b24gcHJlc3MgKi8KKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CM19DVEwsCisJCQkJCWQtPnZfYjFfaHVbTUJIQ19WX0lEWF9WRERJT10gJiAweEZGKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwsCisJCQkJCShkLT52X2IxX2h1W01CSENfVl9JRFhfVkRESU9dID4+IDgpICYKKwkJCQkJMHhGRik7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQkJV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjVfQ1RMLAorCQkJCQlkLT52X2IxX2hbTUJIQ19WX0lEWF9WRERJT10gJiAweEZGKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNl9DVEwsCisJCQkJCShkLT52X2IxX2hbTUJIQ19WX0lEWF9WRERJT10gPj4gOCkgJgorCQkJCQkweEZGKTsKKwkJCQkvKiBUaHJlc2hvZHMgZm9yIGJ1dHRvbiByZWxlYXNlICovCisJCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQkJV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMLAorCQkJCQlkLT52X2JyaFtNQkhDX1ZfSURYX1ZERElPXSAmIDB4RkYpOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJCVdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMF9DVEwsCisJCQkJCShkLT52X2JyaFtNQkhDX1ZfSURYX1ZERElPXSA+PiA4KSAmCisJCQkJCTB4RkYpOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBQcm9ncmFtbWVkIE1CSEMgdGhyZXNob2xkcyB0byBWRERJT1xuIiwKKwkJCQkgX19mdW5jX18pOworCQl9CisKKwkJLyogRW5hYmxlIE1JQyBCSUFTIFN3aXRjaCB0byBWRERJTyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLm1iaGNfcmVnLAorCQkJCSAgICAweDEwLCAweDAwKTsKKwkJaWYgKCFvdmVycmlkZSkKKwkJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CisJCWlmIChyZXN0YXJ0cG9sbGluZykKKwkJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKworCQltYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQgPSB0cnVlOworCQlwcl9kZWJ1ZygiJXM6IFZERElPIHN3aXRjaCBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIGlmICghdmRkaW9fc3dpdGNoICYmIG1iaGMtPm1iaGNfbWljYmlhc19zd2l0Y2hlZCkgeworCQlpZiAoKCFjaGVja3BvbGxpbmcgfHwgbWJoYy0+cG9sbGluZ19hY3RpdmUpICYmCisJCSAgICByZXN0YXJ0cG9sbGluZykKKwkJCXdjZDl4eHhfcGF1c2VfaHNfcG9sbGluZyhtYmhjKTsKKworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTCwKKwkJCQkJICAgIDB4MTAsIDB4MTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0xET19IX01PREVfMSwKKwkJCQkJICAgIDB4MjAsIDB4MjApOworCQkvKiBSZXByb2dyYW0gdGhyZXNob2xkcyAqLworCQlpZiAoZC0+bWljYl9tdiAhPSBWRERJT19NSUNCSUFTX01WKSB7CisJCQljZmlsdF9rX3ZhbCA9CisJCQkgICAgX193Y2Q5eHh4X3Jlc21ncl9nZXRfa192YWwobWJoYywKKwkJCQkJCSAgICAgZC0+bWljYl9tdik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQltYmhjLT5tYmhjX2JpYXNfcmVncy5jZmlsdF92YWwsCisJCQkJCTB4RkMsIChjZmlsdF9rX3ZhbCA8PCAyKSk7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMTAwKTsKKwkJCS8qIFJldmVydCB0aHJlc2hvZHMgZm9yIGluc2VydGlvbi9yZW1vdmFsICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMV9DVEwsCisJCQkJCWQtPnZfaW5zX2h1W01CSENfVl9JRFhfQ0ZJTFRdICYgMHhGRik7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMl9DVEwsCisJCQkJCShkLT52X2luc19odVtNQkhDX1ZfSURYX0NGSUxUXSA+PiA4KSAmCisJCQkJCTB4RkYpOworCQkJaWYgKG1iaGMtPm1iaGNfc3RhdGUgIT0gTUJIQ19TVEFURV9QT1RFTlRJQUxfUkVDT1ZFUlkpIHsKKwkJCQkvKiBSZXZlcnQgdGhyZXNob2RzIGZvciBidXR0b24gcHJlc3MgKi8KKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CM19DVEwsCisJCQkJCWQtPnZfYjFfaHVbTUJIQ19WX0lEWF9DRklMVF0gJiAweEZGKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwsCisJCQkJCShkLT52X2IxX2h1W01CSENfVl9JRFhfQ0ZJTFRdID4+IDgpICYKKwkJCQkJMHhGRik7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywKKwkJCQkJV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjVfQ1RMLAorCQkJCQlkLT52X2IxX2hbTUJIQ19WX0lEWF9DRklMVF0gJiAweEZGKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNl9DVEwsCisJCQkJCShkLT52X2IxX2hbTUJIQ19WX0lEWF9DRklMVF0gPj4gOCkgJgorCQkJCQkweEZGKTsKKwkJCQkvKiBSZXZlcnQgdGhyZXNob2RzIGZvciBidXR0b24gcmVsZWFzZSAqLworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCisJCQkJCVdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I5X0NUTCwKKwkJCQkJZC0+dl9icmhbTUJIQ19WX0lEWF9DRklMVF0gJiAweEZGKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMLAorCQkJCQkoZC0+dl9icmhbTUJIQ19WX0lEWF9DRklMVF0gPj4gOCkgJgorCQkJCQkweEZGKTsKKwkJCX0KKwkJCXByX2RlYnVnKCIlczogUHJvZ3JhbW1lZCBNQkhDIHRocmVzaG9sZHMgdG8gTUlDQklBU1xuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisKKwkJLyogRGlzYWJsZSBNSUMgQklBUyBTd2l0Y2ggdG8gVkRESU8gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsIDB4ODAsCisJCQkJICAgIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywgMHgxMCwKKwkJCQkgICAgMHgwMCk7CisKKwkJaWYgKCghY2hlY2twb2xsaW5nIHx8IG1iaGMtPnBvbGxpbmdfYWN0aXZlKSAmJiByZXN0YXJ0cG9sbGluZykKKwkJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKworCQltYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQgPSBmYWxzZTsKKwkJcHJfZGVidWcoIiVzOiBWRERJTyBzd2l0Y2ggZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGludCB2ZGRpb19zd2l0Y2gpCit7CisJX193Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKG1iaGMsIHZkZGlvX3N3aXRjaCwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzMTYgd2NkOXh4eF9nZXRfY3VycmVudF92KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkJIGNvbnN0IGVudW0gd2NkOXh4eF9jdXJyZW50X3ZfaWR4IGlkeCkKK3sKKwllbnVtIG1iaGNfdl9pbmRleCB2aWR4OworCXMxNiByZXQgPSAtRUlOVkFMOworCisJaWYgKChtYmhjLT5tYmhjX2RhdGEubWljYl9tdiAhPSBWRERJT19NSUNCSUFTX01WKSAmJgorCSAgICBtYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQpCisJCXZpZHggPSBNQkhDX1ZfSURYX1ZERElPOworCWVsc2UKKwkJdmlkeCA9IE1CSENfVl9JRFhfQ0ZJTFQ7CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgV0NEOVhYWF9DVVJSRU5UX1ZfSU5TX0g6CisJCXJldCA9IChzMTYpbWJoYy0+bWJoY19kYXRhLnZfaW5zX2hbdmlkeF07CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DVVJSRU5UX1ZfSU5TX0hVOgorCQlyZXQgPSAoczE2KW1iaGMtPm1iaGNfZGF0YS52X2luc19odVt2aWR4XTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0NVUlJFTlRfVl9CMV9IOgorCQlyZXQgPSAoczE2KW1iaGMtPm1iaGNfZGF0YS52X2IxX2hbdmlkeF07CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DVVJSRU5UX1ZfQjFfSFU6CisJCXJldCA9IChzMTYpbWJoYy0+bWJoY19kYXRhLnZfYjFfaHVbdmlkeF07CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DVVJSRU5UX1ZfQlJfSDoKKwkJcmV0ID0gKHMxNiltYmhjLT5tYmhjX2RhdGEudl9icmhbdmlkeF07CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKndjZDl4eHhfbWJoY19jYWxfYnRuX2RldF9tcCgKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0LAorCQkJICAgIGNvbnN0IGVudW0gd2NkOXh4eF9tYmhjX2J0bl9kZXRfbWVtIG1lbSkKK3sKKwl2b2lkICpyZXQgPSAodm9pZCAqKSZidG5fZGV0LT5fdl9idG5fbG93OworCisJc3dpdGNoIChtZW0pIHsKKwljYXNlIE1CSENfQlROX0RFVF9HQUlOOgorCQlyZXQgKz0gc2l6ZW9mKGJ0bl9kZXQtPl9uX2NpYyk7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBNQkhDX0JUTl9ERVRfTl9DSUM6CisJCXJldCArPSBzaXplb2YoYnRuX2RldC0+X25fcmVhZHkpOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgTUJIQ19CVE5fREVUX05fUkVBRFk6CisJCXJldCArPSBzaXplb2YoYnRuX2RldC0+X3ZfYnRuX2hpZ2hbMF0pICogYnRuX2RldC0+bnVtX2J0bjsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE1CSENfQlROX0RFVF9WX0JUTl9ISUdIOgorCQlyZXQgKz0gc2l6ZW9mKGJ0bl9kZXQtPl92X2J0bl9sb3dbMF0pICogYnRuX2RldC0+bnVtX2J0bjsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE1CSENfQlROX0RFVF9WX0JUTl9MT1c6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X21iaGNfY2FsX2J0bl9kZXRfbXApOworCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2NhbGlicmF0ZV9oc19wb2xsaW5nKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJY29uc3QgczE2IHZfaW5zX2h1ID0gd2NkOXh4eF9nZXRfY3VycmVudF92KG1iaGMsCisJCQkJCQkgICBXQ0Q5WFhYX0NVUlJFTlRfVl9JTlNfSFUpOworCWNvbnN0IHMxNiB2X2IxX2h1ID0gd2NkOXh4eF9nZXRfY3VycmVudF92KG1iaGMsCisJCQkJCQkgIFdDRDlYWFhfQ1VSUkVOVF9WX0IxX0hVKTsKKwljb25zdCBzMTYgdl9iMV9oID0gd2NkOXh4eF9nZXRfY3VycmVudF92KG1iaGMsIFdDRDlYWFhfQ1VSUkVOVF9WX0IxX0gpOworCWNvbnN0IHMxNiB2X2JyaCA9IHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9CUl9IKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxX0NUTCwgdl9pbnNfaHUgJiAweEZGKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMl9DVEwsCisJCSAgICAgICh2X2luc19odSA+PiA4KSAmIDB4RkYpOworCisJaWYgKG1iaGMtPm1iaGNfc3RhdGUgIT0gTUJIQ19TVEFURV9QT1RFTlRJQUxfUkVDT1ZFUlkpIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjNfQ1RMLCB2X2IxX2h1ICYKKwkJCQkweEZGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjRfQ1RMLAorCQkJCSh2X2IxX2h1ID4+IDgpICYgMHhGRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I1X0NUTCwgdl9iMV9oICYKKwkJCQkweEZGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjZfQ1RMLAorCQkJCSh2X2IxX2ggPj4gOCkgJiAweEZGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1ZPTFRfQjlfQ1RMLCB2X2JyaCAmCisJCQkJMHhGRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMF9DVEwsCisJCQkJKHZfYnJoID4+IDgpICYgMHhGRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMV9DVEwsCisJCQkJbWJoYy0+bWJoY19kYXRhLnZfYnJsICYgMHhGRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0IxMl9DVEwsCisJCQkJKG1iaGMtPm1iaGNfZGF0YS52X2JybCA+PiA4KSAmIDB4RkYpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jb2RlY19zd2l0Y2hfY2ZpbHRfbW9kZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJCQkgICAgYm9vbCBmYXN0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NmaWx0X21vZGUgY2ZpbHRfbW9kZTsKKworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPnN3aXRjaF9jZmlsdF9tb2RlKSB7CisJCWNmaWx0X21vZGUgPSBtYmhjLT5tYmhjX2NiLT5zd2l0Y2hfY2ZpbHRfbW9kZShtYmhjLCBmYXN0KTsKKwl9IGVsc2UgeworCQlpZiAoZmFzdCkKKwkJCWNmaWx0X21vZGUucmVnX21vZGVfdmFsID0gV0NEOVhYWF9DRklMVF9GQVNUX01PREU7CisJCWVsc2UKKwkJCWNmaWx0X21vZGUucmVnX21vZGVfdmFsID0gV0NEOVhYWF9DRklMVF9TTE9XX01PREU7CisKKwkJY2ZpbHRfbW9kZS5yZWdfbWFzayA9IDB4NDA7CisJCWNmaWx0X21vZGUuY3VyX21vZGVfdmFsID0KKwkJICAgIHNuZF9zb2NfcmVhZChjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY2ZpbHRfY3RsKSAmIDB4NDA7CisJfQorCisJaWYgKGNmaWx0X21vZGUuY3VyX21vZGVfdmFsCisJCQkhPSBjZmlsdF9tb2RlLnJlZ19tb2RlX3ZhbCkgeworCQlpZiAobWJoYy0+cG9sbGluZ19hY3RpdmUgJiYgd2NkOXh4eF9tYmhjX3BvbGxpbmcobWJoYykpCisJCQl3Y2Q5eHh4X3BhdXNlX2hzX3BvbGxpbmcobWJoYyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJICAgIG1iaGMtPm1iaGNfYmlhc19yZWdzLmNmaWx0X2N0bCwKKwkJCQkJY2ZpbHRfbW9kZS5yZWdfbWFzaywKKwkJCQkJY2ZpbHRfbW9kZS5yZWdfbW9kZV92YWwpOworCQlpZiAobWJoYy0+cG9sbGluZ19hY3RpdmUgJiYgd2NkOXh4eF9tYmhjX3BvbGxpbmcobWJoYykpCisJCQl3Y2Q5eHh4X3N0YXJ0X2hzX3BvbGxpbmcobWJoYyk7CisJCXByX2RlYnVnKCIlczogQ0ZJTFQgbW9kZSBjaGFuZ2UgKCV4IHRvICV4KVxuIiwgX19mdW5jX18sCisJCQljZmlsdF9tb2RlLmN1cl9tb2RlX3ZhbCwKKwkJCWNmaWx0X21vZGUucmVnX21vZGVfdmFsKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IENGSUxUIFZhbHVlIGlzIGFscmVhZHkgJXhcbiIsCisJCQkgX19mdW5jX18sIGNmaWx0X21vZGUuY3VyX21vZGVfdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfamFja19yZXBvcnQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgc3RhdHVzLCBpbnQgbWFzaykKK3sKKwlpZiAoamFjayA9PSAmbWJoYy0+aGVhZHNldF9qYWNrKSB7CisJCXdjZDl4eHhfcmVzbWdyX2NvbmRfdXBkYXRlX2NvbmQobWJoYy0+cmVzbWdyLAorCQkJCQkJV0NEOVhYWF9DT05EX0hQSF9NSUMsCisJCQkJCQlzdGF0dXMgJiBTTkRfSkFDS19NSUNST1BIT05FKTsKKwkJd2NkOXh4eF9yZXNtZ3JfY29uZF91cGRhdGVfY29uZChtYmhjLT5yZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0NPTkRfSFBILAorCQkJCQkJc3RhdHVzICYgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwl9CisKKwlzbmRfc29jX2phY2tfcmVwb3J0KGphY2ssIHN0YXR1cywgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faHBob2NwX29mZl9yZXBvcnQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgdTMyIGphY2tfc3RhdHVzLAorCQkJCWludCBpcnEpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBjbGVhciBvY3Agc3RhdHVzICV4XG4iLCBfX2Z1bmNfXywgamFja19zdGF0dXMpOworCWNvZGVjID0gbWJoYy0+Y29kZWM7CisJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBqYWNrX3N0YXR1cykgeworCQltYmhjLT5ocGhfc3RhdHVzICY9IH5qYWNrX3N0YXR1czsKKwkJd2NkOXh4eF9qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAorCQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzLCBXQ0Q5WFhYX0pBQ0tfTUFTSyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHgxMCwKKwkJCQkgICAgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHgxMCwKKwkJCQkgICAgMHgxMCk7CisJCS8qCisJCSAqIHJlc2V0IHJldHJ5IGNvdW50ZXIgYXMgUEEgaXMgdHVybmVkIG9mZiBzaWduaWZ5aW5nCisJCSAqIHN0YXJ0IG9mIG5ldyBPQ1AgZGV0ZWN0aW9uIHNlc3Npb24KKwkJICovCisJCWlmIChtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKQorCQkJbWJoYy0+aHBobG9jcF9jbnQgPSAwOworCQllbHNlCisJCQltYmhjLT5ocGhyb2NwX2NudCA9IDA7CisJCXdjZDl4eHhfZW5hYmxlX2lycShtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzLCBpcnEpOworCX0KK30KKworc3RhdGljIHZvaWQgaHBocm9jcF9vZmZfcmVwb3J0KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHUzMiBqYWNrX3N0YXR1cykKK3sKKwlfX2hwaG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSFIsCisJCQkgICAgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3ApOworfQorCitzdGF0aWMgdm9pZCBocGhsb2NwX29mZl9yZXBvcnQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgdTMyIGphY2tfc3RhdHVzKQoreworCV9faHBob2NwX29mZl9yZXBvcnQobWJoYywgU05EX0pBQ0tfT0NfSFBITCwKKwkJCSAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9nZXRfbWJoY19taWNiaWFzX3JlZ3Moc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQllbnVtIHdjZDl4eHhfbWJoY19taWNiaWFzX3R5cGUgbWJfdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZpbHQ7CisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptaWNiaWFzX3BkYXRhID0KKwkJbWJoYy0+cmVzbWdyLT5taWNiaWFzX3BkYXRhOworCXN0cnVjdCBtYmhjX21pY2JpYXNfcmVncyAqbWljYmlhc19yZWdzOworCWVudW0gd2NkOXh4eF9taWNiaWFzX251bSBtYl9udW07CisKKwlpZiAobWJfdHlwZSA9PSBNQkhDX0FOQ19NSUNfTUIpIHsKKwkJbWljYmlhc19yZWdzID0gJm1iaGMtPm1iaGNfYW5jX2JpYXNfcmVnczsKKwkJbWJfbnVtID0gbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzOworCX0gZWxzZSB7CisJCW1pY2JpYXNfcmVncyA9ICZtYmhjLT5tYmhjX2JpYXNfcmVnczsKKwkJbWJfbnVtID0gbWJoYy0+bWJoY19jZmctPm1pY2JpYXM7CisJfQorCisJc3dpdGNoIChtYl9udW0pIHsKKwljYXNlIE1CSENfTUlDQklBUzE6CisJCWNmaWx0ID0gbWljYmlhc19wZGF0YS0+YmlhczFfY2ZpbHRfc2VsOworCQltaWNiaWFzX3JlZ3MtPm1iaGNfcmVnID0gV0NEOVhYWF9BX01JQ0JfMV9NQkhDOworCQltaWNiaWFzX3JlZ3MtPmludF9yYmlhcyA9IFdDRDlYWFhfQV9NSUNCXzFfSU5UX1JCSUFTOworCQltaWNiaWFzX3JlZ3MtPmN0bF9yZWcgPSBXQ0Q5WFhYX0FfTUlDQl8xX0NUTDsKKwkJYnJlYWs7CisJY2FzZSBNQkhDX01JQ0JJQVMyOgorCQljZmlsdCA9IG1pY2JpYXNfcGRhdGEtPmJpYXMyX2NmaWx0X3NlbDsKKwkJbWljYmlhc19yZWdzLT5tYmhjX3JlZyA9IFdDRDlYWFhfQV9NSUNCXzJfTUJIQzsKKwkJbWljYmlhc19yZWdzLT5pbnRfcmJpYXMgPSBXQ0Q5WFhYX0FfTUlDQl8yX0lOVF9SQklBUzsKKwkJbWljYmlhc19yZWdzLT5jdGxfcmVnID0gV0NEOVhYWF9BX01JQ0JfMl9DVEw7CisJCWJyZWFrOworCWNhc2UgTUJIQ19NSUNCSUFTMzoKKwkJY2ZpbHQgPSBtaWNiaWFzX3BkYXRhLT5iaWFzM19jZmlsdF9zZWw7CisJCW1pY2JpYXNfcmVncy0+bWJoY19yZWcgPSBXQ0Q5WFhYX0FfTUlDQl8zX01CSEM7CisJCW1pY2JpYXNfcmVncy0+aW50X3JiaWFzID0gV0NEOVhYWF9BX01JQ0JfM19JTlRfUkJJQVM7CisJCW1pY2JpYXNfcmVncy0+Y3RsX3JlZyA9IFdDRDlYWFhfQV9NSUNCXzNfQ1RMOworCQlicmVhazsKKwljYXNlIE1CSENfTUlDQklBUzQ6CisJCWNmaWx0ID0gbWljYmlhc19wZGF0YS0+YmlhczRfY2ZpbHRfc2VsOworCQltaWNiaWFzX3JlZ3MtPm1iaGNfcmVnID0gbWJoYy0+cmVzbWdyLT5yZWdfYWRkci0+bWljYl80X21iaGM7CisJCW1pY2JpYXNfcmVncy0+aW50X3JiaWFzID0KKwkJICAgIG1iaGMtPnJlc21nci0+cmVnX2FkZHItPm1pY2JfNF9pbnRfcmJpYXM7CisJCW1pY2JpYXNfcmVncy0+Y3RsX3JlZyA9IG1iaGMtPnJlc21nci0+cmVnX2FkZHItPm1pY2JfNF9jdGw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNob3VsZCBuZXZlciByZWFjaCBoZXJlICovCisJCXByX2VycigiJXM6IEludmFsaWQgTUlDIEJJQVMgZm9yIE1CSENcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCW1pY2JpYXNfcmVncy0+Y2ZpbHRfc2VsID0gY2ZpbHQ7CisKKwlzd2l0Y2ggKGNmaWx0KSB7CisJY2FzZSBXQ0Q5WFhYX0NGSUxUMV9TRUw6CisJCW1pY2JpYXNfcmVncy0+Y2ZpbHRfdmFsID0gV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfMV9WQUw7CisJCW1pY2JpYXNfcmVncy0+Y2ZpbHRfY3RsID0gV0NEOVhYWF9BX01JQ0JfQ0ZJTFRfMV9DVEw7CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DRklMVDJfU0VMOgorCQltaWNiaWFzX3JlZ3MtPmNmaWx0X3ZhbCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfVkFMOworCQltaWNiaWFzX3JlZ3MtPmNmaWx0X2N0bCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfQ1RMOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfQ0ZJTFQzX1NFTDoKKwkJbWljYmlhc19yZWdzLT5jZmlsdF92YWwgPSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8zX1ZBTDsKKwkJbWljYmlhc19yZWdzLT5jZmlsdF9jdGwgPSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8zX0NUTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKG1iX3R5cGUgPT0gTUJIQ19QUklNQVJZX01JQ19NQikgeworCQlzd2l0Y2ggKGNmaWx0KSB7CisJCWNhc2UgV0NEOVhYWF9DRklMVDFfU0VMOgorCQkJbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYgPSBtaWNiaWFzX3BkYXRhLT5jZmlsdDFfbXY7CisJCQlicmVhazsKKwkJY2FzZSBXQ0Q5WFhYX0NGSUxUMl9TRUw6CisJCQltYmhjLT5tYmhjX2RhdGEubWljYl9tdiA9IG1pY2JpYXNfcGRhdGEtPmNmaWx0Ml9tdjsKKwkJCWJyZWFrOworCQljYXNlIFdDRDlYWFhfQ0ZJTFQzX1NFTDoKKwkJCW1iaGMtPm1iaGNfZGF0YS5taWNiX212ID0gbWljYmlhc19wZGF0YS0+Y2ZpbHQzX212OworCQkJYnJlYWs7CisJCX0KKwl9CisKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jbHJfYW5kX3R1cm5vbl9ocGhfcGFkYWMoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlib29sIHBhX3R1cm5lZF9vbiA9IGZhbHNlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXU4IHdnX3RpbWU7CisKKwl3Z190aW1lID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19USU1FKTsKKwl3Z190aW1lICs9IDE7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdDRDlYWFhfSFBIUl9EQUNfT0ZGX0FDSywKKwkJCSAgICAgICAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSkpIHsKKwkJcHJfZGVidWcoIiVzOiBIUEhSIGNsZWFyIGZsYWcgYW5kIGVuYWJsZSBEQUNcbiIsIF9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9SX0RBQ19DVEwsCisJCQkJICAgIDB4QzAsIDB4QzApOworCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdDRDlYWFhfSFBITF9EQUNfT0ZGX0FDSywKKwkJCQkmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSkpIHsKKwkJcHJfZGVidWcoIiVzOiBIUEhMIGNsZWFyIGZsYWcgYW5kIGVuYWJsZSBEQUNcbiIsIF9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9MX0RBQ19DVEwsCisJCQkJICAgIDB4ODAsIDB4ODApOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEOVhYWF9IUEhSX1BBX09GRl9BQ0ssCisJCQkgICAgICAgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpKSB7CisJCXByX2RlYnVnKCIlczogSFBIUiBjbGVhciBmbGFnIGFuZCBlbmFibGUgUEFcbiIsIF9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU4sIDB4MTAsCisJCQkJICAgIDEgPDwgNCk7CisJCXBhX3R1cm5lZF9vbiA9IHRydWU7CisJfQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEOVhYWF9IUEhMX1BBX09GRl9BQ0ssCisJCQkgICAgICAgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpKSB7CisJCXByX2RlYnVnKCIlczogSFBITCBjbGVhciBmbGFnIGFuZCBlbmFibGUgUEFcbiIsIF9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9DTlBfRU4sIDB4MjAsIDEKKwkJCQkgICAgPDwgNSk7CisJCXBhX3R1cm5lZF9vbiA9IHRydWU7CisJfQorCisJaWYgKHBhX3R1cm5lZF9vbikgeworCQlwcl9kZWJ1ZygiJXM6IFBBIHdhcyB0dXJuZWQgb24gYnkgTUJIQyBhbmQgbm90IGJ5IERBUE1cbiIsCisJCQkgX19mdW5jX18pOworCQl1c2xlZXBfcmFuZ2Uod2dfdGltZSAqIDEwMDAsIHdnX3RpbWUgKiAxMDAwICsgNTApOworCX0KK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2NhbmNlbF9idG5fd29yayhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCWludCByOworCisJciA9IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWJoYy0+bWJoY19idG5fZHdvcmspOworCWlmIChyKQorCQkvKiBpZiBzY2hlZHVsZWQgbWJoYy5tYmhjX2J0bl9kd29yayBpcyBjYW5jZWxlZCBmcm9tIGhlcmUsCisJCSAqIHdlIGhhdmUgdG8gdW5sb2NrIGZyb20gaGVyZSBpbnN0ZWFkIGJ0bl93b3JrCisJCSAqLworCQl3Y2Q5eHh4X3VubG9ja19zbGVlcChtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGJvb2wgd2NkOXh4eF9pc19ocGhfZGFjX29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGxlZnQpCit7CisJdTggaHBoX3JlZ192YWwgPSAwOworCisJaWYgKGxlZnQpCisJCWhwaF9yZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0xfREFDX0NUTCk7CisJZWxzZQorCQlocGhfcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9SX0RBQ19DVEwpOworCisJcmV0dXJuIChocGhfcmVnX3ZhbCAmIDB4QzApID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCB3Y2Q5eHh4X2lzX2hwaF9wYV9vbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggaHBoX3JlZ192YWwgPSAwOworCisJaHBoX3JlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfQ05QX0VOKTsKKworCXJldHVybiAoaHBoX3JlZ192YWwgJiAweDMwKSA/IHRydWUgOiBmYWxzZTsKK30KKworLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfc2V0X2FuZF90dXJub2ZmX2hwaF9wYWRhYyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCXU4IHdnX3RpbWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwl3Z190aW1lID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19USU1FKTsKKwl3Z190aW1lICs9IDE7CisKKwkvKiBJZiBoZWFkcGhvbmUgUEEgaXMgb24sIGNoZWNrIGlmIHVzZXJzcGFjZSByZWNlaXZlcworCSAqIHJlbW92YWwgZXZlbnQgdG8gc3luYy11cCBQQSdzIHN0YXRlCisJICovCisJaWYgKHdjZDl4eHhfaXNfaHBoX3BhX29uKGNvZGVjKSkgeworCQlwcl9kZWJ1ZygiJXMgUEEgaXMgb24sIHNldHRpbmcgUEFfT0ZGX0FDS1xuIiwgX19mdW5jX18pOworCQlzZXRfYml0KFdDRDlYWFhfSFBITF9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCXNldF9iaXQoV0NEOVhYWF9IUEhSX1BBX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXMgUEEgaXMgb2ZmXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJaWYgKHdjZDl4eHhfaXNfaHBoX2RhY19vbihjb2RlYywgMSkpCisJCXNldF9iaXQoV0NEOVhYWF9IUEhMX0RBQ19PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJaWYgKHdjZDl4eHhfaXNfaHBoX2RhY19vbihjb2RlYywgMCkpCisJCXNldF9iaXQoV0NEOVhYWF9IUEhSX0RBQ19PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9FTiwgMHgzMCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9MX0RBQ19DVEwsIDB4ODAsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfUl9EQUNfQ1RMLCAweEMwLCAweDAwKTsKKwl1c2xlZXBfcmFuZ2Uod2dfdGltZSAqIDEwMDAsIHdnX3RpbWUgKiAxMDAwICsgNTApOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2luc2VydF9kZXRlY3Rfc2V0dXAoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgYm9vbCBpbnMpCit7CisJaWYgKCFtYmhjLT5tYmhjX2NmZy0+aW5zZXJ0X2RldGVjdCkKKwkJcmV0dXJuOworCXByX2RlYnVnKCIlczogU2V0dGluZyB1cCAlcyBkZXRlY3Rpb25cbiIsIF9fZnVuY19fLAorCQkgaW5zID8gImluc2VydCIgOiAicmVtb3ZhbCIpOworCS8qIERpc2FibGUgZGV0ZWN0aW9uIHRvIGF2b2lkIGdsaXRjaCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMobWJoYy0+Y29kZWMsIFdDRDlYWFhfQV9NQkhDX0lOU0VSVF9ERVRFQ1QsIDEsIDApOworCWlmIChtYmhjLT5tYmhjX2NmZy0+Z3Bpb19sZXZlbF9pbnNlcnQpCisJCXNuZF9zb2Nfd3JpdGUobWJoYy0+Y29kZWMsIFdDRDlYWFhfQV9NQkhDX0lOU0VSVF9ERVRFQ1QsCisJCQkgICAgICAoMHg2OCB8IChpbnMgPyAoMSA8PCAxKSA6IDApKSk7CisJZWxzZQorCQlzbmRfc29jX3dyaXRlKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19JTlNFUlRfREVURUNULAorCQkJICAgICAgKDB4NkMgfCAoaW5zID8gKDEgPDwgMSkgOiAwKSkpOworCS8qIFJlLWVuYWJsZSBkZXRlY3Rpb24gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19JTlNFUlRfREVURUNULCAxLCAxKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfcmVwb3J0X3BsdWcoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgaW50IGluc2VydGlvbiwKKwkJCQllbnVtIHNuZF9qYWNrX3R5cGVzIGphY2tfdHlwZSkKK3sKKwlXQ0Q5WFhYX0JDTF9BU1NFUlRfTE9DS0VEKG1iaGMtPnJlc21ncik7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyIGluc2VydGlvbiAlZCBocGhfc3RhdHVzICV4XG4iLAorCQkgX19mdW5jX18sIGluc2VydGlvbiwgbWJoYy0+aHBoX3N0YXR1cyk7CisJaWYgKCFpbnNlcnRpb24pIHsKKwkJLyogUmVwb3J0IHJlbW92YWwgKi8KKwkJbWJoYy0+aHBoX3N0YXR1cyAmPSB+amFja190eXBlOworCQkvKgorCQkgKiBjYW5jZWwgcG9zc2libHkgc2NoZWR1bGVkIGJ0biB3b3JrIGFuZAorCQkgKiByZXBvcnQgcmVsZWFzZSBpZiB3ZSByZXBvcnRlZCBidXR0b24gcHJlc3MKKwkJICovCisJCWlmICh3Y2Q5eHh4X2NhbmNlbF9idG5fd29yayhtYmhjKSkKKwkJCXByX2RlYnVnKCIlczogYnV0dG9uIHByZXNzIGlzIGNhbmNlbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWVsc2UgaWYgKG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCkgeworCQkJcHJfZGVidWcoIiVzOiByZWxlYXNlIG9mIGJ1dHRvbiBwcmVzcyVkXG4iLAorCQkJCSBfX2Z1bmNfXywgamFja190eXBlKTsKKwkJCXdjZDl4eHhfamFja19yZXBvcnQobWJoYywgJm1iaGMtPmJ1dHRvbl9qYWNrLCAwLAorCQkJCQkgICAgbWJoYy0+YnV0dG9uc19wcmVzc2VkKTsKKwkJCW1iaGMtPmJ1dHRvbnNfcHJlc3NlZCAmPQorCQkJCX5XQ0Q5WFhYX0pBQ0tfQlVUVE9OX01BU0s7CisJCX0KKworCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUgJiYgbWJoYy0+bWljYmlhc19lbmFibGVfY2IpIHsKKwkJCXByX2RlYnVnKCIlczogRGlzYWJsaW5nIG1pY2JpYXNcbiIsIF9fZnVuY19fKTsKKwkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7CisJCQltYmhjLT5taWNiaWFzX2VuYWJsZV9jYihtYmhjLT5jb2RlYywgZmFsc2UsCisJCQkJCQltYmhjLT5tYmhjX2NmZy0+bWljYmlhcyk7CisJCX0KKwkJbWJoYy0+emwgPSBtYmhjLT56ciA9IDA7CisJCW1iaGMtPmhwaF90eXBlID0gTUJIQ19IUEhfTk9ORTsKKwkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgcmVtb3ZhbCAlZCgleClcbiIsIF9fZnVuY19fLAorCQkJIGphY2tfdHlwZSwgbWJoYy0+aHBoX3N0YXR1cyk7CisJCXdjZDl4eHhfamFja19yZXBvcnQobWJoYywgJm1iaGMtPmhlYWRzZXRfamFjaywgbWJoYy0+aHBoX3N0YXR1cywKKwkJCQkgICAgV0NEOVhYWF9KQUNLX01BU0spOworCQl3Y2Q5eHh4X3NldF9hbmRfdHVybm9mZl9ocGhfcGFkYWMobWJoYyk7CisJCWhwaHJvY3Bfb2ZmX3JlcG9ydChtYmhjLCBTTkRfSkFDS19PQ19IUEhSKTsKKwkJaHBobG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwpOworCQltYmhjLT5jdXJyZW50X3BsdWcgPSBQTFVHX1RZUEVfTk9ORTsKKwkJbWJoYy0+cG9sbGluZ19hY3RpdmUgPSBmYWxzZTsKKwkJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+aHBoX2F1dG9fcHVsbGRvd25fY3RybCkKKwkJCW1iaGMtPm1iaGNfY2ItPmhwaF9hdXRvX3B1bGxkb3duX2N0cmwobWJoYy0+Y29kZWMsCisJCQkJCQkJCWZhbHNlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXBvcnQgcmVtb3ZhbCBvZiBjdXJyZW50IGphY2sgdHlwZS4KKwkJICogSGVhZHBob25lIHRvIGhlYWRzZXQgc2hvdWxkbid0IHJlcG9ydCBoZWFkcGhvbmUKKwkJICogcmVtb3ZhbC4KKwkJICovCisJCWlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUgJiYKKwkJICAgICEobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEUEhPTkUgJiYKKwkJICAgICAgamFja190eXBlID09IFNORF9KQUNLX0hFQURTRVQpICYmCisJCSAgICAobWJoYy0+aHBoX3N0YXR1cyAmJiBtYmhjLT5ocGhfc3RhdHVzICE9IGphY2tfdHlwZSkpIHsKKwkJCWlmIChtYmhjLT5taWNiaWFzX2VuYWJsZSAmJiBtYmhjLT5taWNiaWFzX2VuYWJsZV9jYiAmJgorCQkJICAgIG1iaGMtPmhwaF9zdGF0dXMgPT0gU05EX0pBQ0tfSEVBRFNFVCkgeworCQkJCXByX2RlYnVnKCIlczogRGlzYWJsaW5nIG1pY2JpYXNcbiIsIF9fZnVuY19fKTsKKwkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOworCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlX2NiKG1iaGMtPmNvZGVjLCBmYWxzZSwKKwkJCQkJCW1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzKTsKKwkJCX0KKworCQkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgcmVtb3ZhbCAoJXgpXG4iLAorCQkJCSBfX2Z1bmNfXywgbWJoYy0+aHBoX3N0YXR1cyk7CisJCQltYmhjLT56bCA9IG1iaGMtPnpyID0gMDsKKwkJCXdjZDl4eHhfamFja19yZXBvcnQobWJoYywgJm1iaGMtPmhlYWRzZXRfamFjaywKKwkJCQkJICAgIDAsIFdDRDlYWFhfSkFDS19NQVNLKTsKKwkJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfihTTkRfSkFDS19IRUFEU0VUIHwKKwkJCQkJCVNORF9KQUNLX0xJTkVPVVQgfAorCQkJCQkJU05EX0pBQ0tfQU5DX0hFQURQSE9ORSB8CisJCQkJCQlTTkRfSkFDS19VTlNVUFBPUlRFRCk7CisJCQlpZiAobWJoYy0+bWJoY19jYiAmJgorCQkJCSBtYmhjLT5tYmhjX2NiLT5ocGhfYXV0b19wdWxsZG93bl9jdHJsKQorCQkJCW1iaGMtPm1iaGNfY2ItPmhwaF9hdXRvX3B1bGxkb3duX2N0cmwoCisJCQkJCQkJCW1iaGMtPmNvZGVjLAorCQkJCQkJCQlmYWxzZSk7CisJCX0KKworCQkvKiBSZXBvcnQgaW5zZXJ0aW9uICovCisJCWlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFBIT05FKSB7CisJCQltYmhjLT5jdXJyZW50X3BsdWcgPSBQTFVHX1RZUEVfSEVBRFBIT05FOworCQl9IGVsc2UgaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19VTlNVUFBPUlRFRCkgeworCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gUExVR19UWVBFX0dORF9NSUNfU1dBUDsKKwkJfSBlbHNlIGlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFNFVCkgeworCQkJbWJoYy0+cG9sbGluZ19hY3RpdmUgPSBCVVRUT05fUE9MTElOR19TVVBQT1JURUQ7CisJCQltYmhjLT5jdXJyZW50X3BsdWcgPSBQTFVHX1RZUEVfSEVBRFNFVDsKKwkJCW1iaGMtPnVwZGF0ZV96ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfTElORU9VVCkgeworCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gUExVR19UWVBFX0hJR0hfSFBIOworCQl9IGVsc2UgaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19BTkNfSEVBRFBIT05FKSB7CisJCQltYmhjLT5wb2xsaW5nX2FjdGl2ZSA9IEJVVFRPTl9QT0xMSU5HX1NVUFBPUlRFRDsKKwkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IFBMVUdfVFlQRV9BTkNfSEVBRFBIT05FOworCQl9CisKKwkJaWYgKG1iaGMtPmltcGVkYW5jZV9kZXRlY3QgJiYgaW1wZWRhbmNlX2RldGVjdF9lbikgeworCQkJd2NkOXh4eF9kZXRlY3RfaW1wZWRhbmNlKG1iaGMsCisJCQkJCSZtYmhjLT56bCwgJm1iaGMtPnpyKTsKKwkJCWlmICgobWJoYy0+emwgPiBXQ0Q5WFhYX0xJTkVJTl9USFJFU0hPTEQpICYmCisJCQkJKG1iaGMtPnpyID4gV0NEOVhYWF9MSU5FSU5fVEhSRVNIT0xEKSkgeworCQkJCWphY2tfdHlwZSA9IFNORF9KQUNLX0xJTkVPVVQ7CisJCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gUExVR19UWVBFX0hJR0hfSFBIOworCQkJCXByX2RlYnVnKCIlczogUmVwbGFjZSB3aXRoIFNORF9KQUNLX0xJTkVPVVRcbiIsCisJCQkJX19mdW5jX18pOworCQkJfQorCQl9CisKKwkJbWJoYy0+aHBoX3N0YXR1cyB8PSBqYWNrX3R5cGU7CisKKwkJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlICYmIG1iaGMtPm1pY2JpYXNfZW5hYmxlX2NiKSB7CisJCQlwcl9kZWJ1ZygiJXM6IEVuYWJsaW5nIG1pY2JpYXNcbiIsIF9fZnVuY19fKTsKKwkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlX2NiKG1iaGMtPmNvZGVjLCB0cnVlLAorCQkJCQkJbWJoYy0+bWJoY19jZmctPm1pY2JpYXMpOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgaW5zZXJ0aW9uICVkKCV4KVxuIiwgX19mdW5jX18sCisJCQkgamFja190eXBlLCBtYmhjLT5ocGhfc3RhdHVzKTsKKwkJd2NkOXh4eF9qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAorCQkJCSAgICAobWJoYy0+aHBoX3N0YXR1cyB8IFNORF9KQUNLX01FQ0hBTklDQUwpLAorCQkJCSAgICBXQ0Q5WFhYX0pBQ0tfTUFTSyk7CisJCS8qCisJCSAqIGlmIFBBIGlzIGFscmVhZHkgb24sIHN3aXRjaCBtaWNiaWFzCisJCSAqIHNvdXJjZSB0byBWRERJTworCQkgKi8KKwkJaWYgKCgobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEU0VUKSB8fAorCQkgICAgIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0FOQ19IRUFEUEhPTkUpKSAmJgorCQkgICAgKChtYmhjLT5ldmVudF9zdGF0ZSAmICgxIDw8IE1CSENfRVZFTlRfUEFfSFBITCB8CisJCQkxIDw8IE1CSENfRVZFTlRfUEFfSFBIUikpKSkKKwkJCV9fd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAxLCBmYWxzZSwKKwkJCQkJCSBmYWxzZSk7CisJCXdjZDl4eHhfY2xyX2FuZF90dXJub25faHBoX3BhZGFjKG1iaGMpOworCX0KKwkvKiBTZXR1cCBpbnNlcnQgZGV0ZWN0ICovCisJd2NkOXh4eF9pbnNlcnRfZGV0ZWN0X3NldHVwKG1iaGMsICFpbnNlcnRpb24pOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZSBocGhfc3RhdHVzICV4XG4iLCBfX2Z1bmNfXywgbWJoYy0+aHBoX3N0YXR1cyk7Cit9CisKKy8qIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgaW50ZXJydXB0IGNvbnRleHQgdGhhdCBob2xkIHN1c3BlbmQgKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkJICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlwcl9kZWJ1ZygiJXM6IHNjaGVkdWxpbmcgd2NkOXh4eF9jb3JyZWN0X3N3Y2hfcGx1Z1xuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKwltYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wID0gZmFsc2U7CisJd2NkOXh4eF9sb2NrX3NsZWVwKG1iaGMtPnJlc21nci0+Y29yZV9yZXMpOworCXNjaGVkdWxlX3dvcmsod29yayk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJCQkgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXByX2RlYnVnKCIlczogQ2FuY2VsaW5nIGNvcnJlY3RfcGx1Z19zd2NoXG4iLCBfX2Z1bmNfXyk7CisJV0NEOVhYWF9CQ0xfQVNTRVJUX0xPQ0tFRChtYmhjLT5yZXNtZ3IpOworCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSB0cnVlOworCisJLyogTWFrZSBzdXJlIG1iaGMgc3RhdGUgdXBkYXRlIGNvbXBsZXRlIGJlZm9yZSB1bmxvY2tpbmcuICovCisJd21iKCk7CisJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJaWYgKGNhbmNlbF93b3JrX3N5bmMod29yaykpIHsKKwkJcHJfZGVidWcoIiVzOiBjb3JyZWN0X3BsdWdfc3djaCBpcyBjYW5jZWxlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdjZDl4eHhfdW5sb2NrX3NsZWVwKG1iaGMtPnJlc21nci0+Y29yZV9yZXMpOworCX0KKwlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7Cit9CisKK3N0YXRpYyBzMTYgc2NhbGVfdl9taWNiX3ZkZGlvKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGludCB2LCBib29sIHRvdmRkaW8pCit7CisJaW50IHI7CisJaW50IHZkZGlvX2ssIG1iX2s7CisKKwl2ZGRpb19rID0gX193Y2Q5eHh4X3Jlc21ncl9nZXRfa192YWwobWJoYywgVkRESU9fTUlDQklBU19NVik7CisJbWJfayA9IF9fd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKG1iaGMsIG1iaGMtPm1iaGNfZGF0YS5taWNiX212KTsKKwlpZiAodG92ZGRpbykKKwkJciA9IHYgKiAodmRkaW9fayArIDQpIC8gKG1iX2sgKyA0KTsKKwllbHNlCisJCXIgPSB2ICogKG1iX2sgKyA0KSAvICh2ZGRpb19rICsgNCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzMTYgd2NkOXh4eF9nZXRfY3VycmVudF92X2hzX21heChzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCXMxNiB2X2hzX21heDsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX3BsdWdfdHlwZV9jZmcgKnBsdWdfdHlwZTsKKworCXBsdWdfdHlwZSA9IFdDRDlYWFhfTUJIQ19DQUxfUExVR19UWVBFX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCWlmICgobWJoYy0+bWJoY19kYXRhLm1pY2JfbXYgIT0gVkRESU9fTUlDQklBU19NVikgJiYKKwkgICAgbWJoYy0+bWJoY19taWNiaWFzX3N3aXRjaGVkKQorCQl2X2hzX21heCA9IHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBwbHVnX3R5cGUtPnZfaHNfbWF4LCB0cnVlKTsKKwllbHNlCisJCXZfaHNfbWF4ID0gcGx1Z190eXBlLT52X2hzX21heDsKKwlyZXR1cm4gdl9oc19tYXg7Cit9CisKK3N0YXRpYyBzaG9ydCB3Y2Q5eHh4X3JlYWRfc3RhX3Jlc3VsdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggYmlhc19tc2IsIGJpYXNfbHNiOworCXNob3J0IGJpYXNfdmFsdWU7CisKKwliaWFzX21zYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IzX1NUQVRVUyk7CisJYmlhc19sc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMl9TVEFUVVMpOworCWJpYXNfdmFsdWUgPSAoYmlhc19tc2IgPDwgOCkgfCBiaWFzX2xzYjsKKwlyZXR1cm4gYmlhc192YWx1ZTsKK30KKworc3RhdGljIHNob3J0IHdjZDl4eHhfcmVhZF9kY2VfcmVzdWx0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl1OCBiaWFzX21zYiwgYmlhc19sc2I7CisJc2hvcnQgYmlhc192YWx1ZTsKKworCWJpYXNfbXNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjVfU1RBVFVTKTsKKwliaWFzX2xzYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0I0X1NUQVRVUyk7CisJYmlhc192YWx1ZSA9IChiaWFzX21zYiA8PCA4KSB8IGJpYXNfbHNiOworCXJldHVybiBiaWFzX3ZhbHVlOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3R1cm5fb25vZmZfcmVsX2RldGVjdGlvbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgYm9vbCBvbikKK3sKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLCAweDAyLCBvbiA8PCAxKTsKK30KKworc3RhdGljIHNob3J0IF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGludCBkY2UsCisJCQkJICAgICBib29sIG92ZXJyaWRlX2J5cGFzcywgYm9vbCBub3JlbGRldGVjdGlvbikKK3sKKwlzaG9ydCBiaWFzX3ZhbHVlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJd2NkOXh4eF9kaXNhYmxlX2lycShtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzLAorCQkJICAgIG1iaGMtPmludHJfaWRzLT5kY2VfZXN0X2NvbXBsZXRlKTsKKwlpZiAobm9yZWxkZXRlY3Rpb24pCisJCXdjZDl4eHhfdHVybl9vbm9mZl9yZWxfZGV0ZWN0aW9uKGNvZGVjLCBmYWxzZSk7CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmRvX3JlY2FsaWJyYXRpb24pCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweDIsCisJCQkJICAgIDB4MCk7CisJLyogVHVybiBvbiB0aGUgb3ZlcnJpZGUgKi8KKwlpZiAoIW92ZXJyaWRlX2J5cGFzcykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwgMHg0LCAweDQpOworCWlmIChkY2UpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwKKwkJCQkgICAgMHg4KTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHg0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwKKwkJCQkgICAgMHgwKTsKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kb19yZWNhbGlicmF0aW9uKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsCisJCQkJCSAgICAweDIsIDB4Mik7CisJCXVzbGVlcF9yYW5nZShtYmhjLT5tYmhjX2RhdGEudF9zdGFfZGNlLAorCQkJICAgICBtYmhjLT5tYmhjX2RhdGEudF9zdGFfZGNlICsgNTApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMLCAweDQpOworCQl1c2xlZXBfcmFuZ2UobWJoYy0+bWJoY19kYXRhLnRfZGNlLCBtYmhjLT5tYmhjX2RhdGEudF9kY2UgKyA1MCk7CisJCWJpYXNfdmFsdWUgPSB3Y2Q5eHh4X3JlYWRfZGNlX3Jlc3VsdChjb2RlYyk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwKKwkJCQkgICAgMHg4KTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHgyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwKKwkJCQkgICAgMHgwKTsKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kb19yZWNhbGlicmF0aW9uKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsCisJCQkJCSAgICAweDIsIDB4Mik7CisJCXVzbGVlcF9yYW5nZShtYmhjLT5tYmhjX2RhdGEudF9zdGFfZGNlLAorCQkJICAgICBtYmhjLT5tYmhjX2RhdGEudF9zdGFfZGNlICsgNTApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMLCAweDIpOworCQl1c2xlZXBfcmFuZ2UobWJoYy0+bWJoY19kYXRhLnRfc3RhLAorCQkJICAgICBtYmhjLT5tYmhjX2RhdGEudF9zdGEgKyA1MCk7CisJCWJpYXNfdmFsdWUgPSB3Y2Q5eHh4X3JlYWRfc3RhX3Jlc3VsdChjb2RlYyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweDgsCisJCQkJICAgIDB4OCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19FTl9DVEwsIDB4MCk7CisJfQorCS8qIFR1cm4gb2ZmIHRoZSBvdmVycmlkZSBhZnRlciBtZWFzdXJpbmcgbWljIHZvbHRhZ2UgKi8KKwlpZiAoIW92ZXJyaWRlX2J5cGFzcykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwgMHgwNCwKKwkJCQkgICAgMHgwMCk7CisKKwlpZiAobm9yZWxkZXRlY3Rpb24pCisJCXdjZDl4eHhfdHVybl9vbm9mZl9yZWxfZGV0ZWN0aW9uKGNvZGVjLCB0cnVlKTsKKwl3Y2Q5eHh4X2VuYWJsZV9pcnEobWJoYy0+cmVzbWdyLT5jb3JlX3JlcywKKwkJCSAgIG1iaGMtPmludHJfaWRzLT5kY2VfZXN0X2NvbXBsZXRlKTsKKworCXJldHVybiBiaWFzX3ZhbHVlOworfQorCitzdGF0aWMgc2hvcnQgd2NkOXh4eF9jb2RlY19zdGFfZGNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGludCBkY2UsCisJCQkJICAgYm9vbCBub3JlbCkKK3sKKwlib29sIG92ZXJyaWRlX2J5cGFzczsKKworCS8qIEJ5cGFzcyBvdmVycmlkZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KKwlvdmVycmlkZV9ieXBhc3MgPSAoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLAorCQkJCQlXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMKSAmCisJCQkgICAweDA0KSA/IHRydWUgOiBmYWxzZTsKKworCXJldHVybiBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCBkY2UsIG92ZXJyaWRlX2J5cGFzcywgbm9yZWwpOworfQorCitzdGF0aWMgczMyIF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlX3Yoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgczggZGNlLAorCQkJCSAgICAgdTE2IGJpYXNfdmFsdWUsIHMxNiB6LCB1MzIgbWljYl9tdikKK3sKKwlzMTYgdmFsdWUsIG1iOworCXMzMiBtdiA9IDA7CisKKwl2YWx1ZSA9IGJpYXNfdmFsdWU7CisJaWYgKGRjZSkgeworCQltYiA9IChtYmhjLT5tYmhjX2RhdGEuZGNlX21iKTsKKwkJaWYgKG1iIC0geikKKwkJCW12ID0gKHZhbHVlIC0geikgKiAoczMyKW1pY2JfbXYgLyAobWIgLSB6KTsKKwl9IGVsc2UgeworCQltYiA9IChtYmhjLT5tYmhjX2RhdGEuc3RhX21iKTsKKwkJaWYgKG1iIC0geikKKwkJCW12ID0gKHZhbHVlIC0geikgKiAoczMyKW1pY2JfbXYgLyAobWIgLSB6KTsKKwl9CisKKwlyZXR1cm4gbXY7Cit9CisKK3N0YXRpYyBzMzIgd2NkOXh4eF9jb2RlY19zdGFfZGNlX3Yoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgczggZGNlLAorCQkJCSAgIHUxNiBiaWFzX3ZhbHVlKQoreworCXMxNiB6OworCisJeiA9IGRjZSA/IChzMTYpbWJoYy0+bWJoY19kYXRhLmRjZV96IDogKHMxNiltYmhjLT5tYmhjX2RhdGEuc3RhX3o7CisJcmV0dXJuIF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgZGNlLCBiaWFzX3ZhbHVlLCB6LAorCQkJCQkgbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYpOworfQorCisvKiBUbyBlbmFibGUvZGlzYWJsZSBiYW5kZ2FwIGFuZCBSQyBvc2NpbGxhdG9yICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X21iaGNfY3RybF9jbGtfYmFuZGdhcChzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQlib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKSB7CisJCVdDRDlYWFhfQkdfQ0xLX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2JhbmRnYXAobWJoYy0+cmVzbWdyLAorCQkJCVdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFKTsKKwkJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+Y29kZWNfcmNvX2N0cmwpIHsKKwkJCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJbWJoYy0+bWJoY19jYi0+Y29kZWNfcmNvX2N0cmwobWJoYy0+Y29kZWMsIHRydWUpOworCQl9IGVsc2UgeworCQkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa19ibG9jayhtYmhjLT5yZXNtZ3IsCisJCQkJCVdDRDlYWFhfQ0xLX1JDTyk7CisJCQlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmNvZGVjX3Jjb19jdHJsKSB7CisJCQltYmhjLT5tYmhjX2NiLT5jb2RlY19yY29fY3RybChtYmhjLT5jb2RlYywgZmFsc2UpOworCQkJV0NEOVhYWF9CR19DTEtfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQl9IGVsc2UgeworCQkJV0NEOVhYWF9CR19DTEtfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJd2NkOXh4eF9yZXNtZ3JfcHV0X2Nsa19ibG9jayhtYmhjLT5yZXNtZ3IsCisJCQkJCVdDRDlYWFhfQ0xLX1JDTyk7CisJCX0KKwkJd2NkOXh4eF9yZXNtZ3JfcHV0X2JhbmRnYXAobWJoYy0+cmVzbWdyLAorCQkJCVdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFKTsKKwkJV0NEOVhYWF9CR19DTEtfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJfQorfQorCisvKiBjYWxsZWQgb25seSBmcm9tIGludGVycnVwdCB3aGljaCBpcyB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgc2hvcnQgd2NkOXh4eF9tYmhjX3NldHVwX2hzX3BvbGxpbmcoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQlzdHJ1Y3QgbWJoY19taWNiaWFzX3JlZ3MgKm1iaGNfbWljYl9yZWdzLAorCQkJCWJvb2wgaXNfY3NfZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXNob3J0IGJpYXNfdmFsdWU7CisJdTggY2ZpbHRfbW9kZTsKKworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbikgeworCQlwcl9lcnIoIiVzOiBFcnJvciwgbm8gY2FsaWJyYXRpb24gZXhpc3RzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEVuYWJsZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSB0byBtaWNiaWFzIGlmIHByZXNlbnQgKi8KKwlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKQorCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKGNvZGVjLCB0cnVlLCB0cnVlKTsKKworCS8qCisJICogc2V0dXAgaW50ZXJuYWwgbWljYmlhcyBpZiBjb2RlYyB1c2VzIGludGVybmFsIG1pY2JpYXMgZm9yCisJICogaGVhZHNldCBkZXRlY3Rpb24KKwkgKi8KKwlpZiAobWJoYy0+bWJoY19jZmctPnVzZV9pbnRfcmJpYXMpIHsKKwkJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+c2V0dXBfaW50X3JiaWFzKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0dXBfaW50X3JiaWFzKGNvZGVjLCB0cnVlKTsKKwllbHNlCisJCXByX2VycigiJXM6IGludGVybmFsIGJpYXMgcmVxdWVzdGVkIGJ1dCBjb2RlYyBkaWQgbm90IHByb3ZpZGUgY2FsbGJhY2tcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwgMHgwNSwgMHgwMSk7CisKKwkvKiBNYWtlIHN1cmUgQ0ZJTFQgaXMgaW4gZmFzdCBtb2RlLCBzYXZlIGN1cnJlbnQgbW9kZSAqLworCWNmaWx0X21vZGUgPSBzbmRfc29jX3JlYWQoY29kZWMsIG1iaGNfbWljYl9yZWdzLT5jZmlsdF9jdGwpOworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmNmaWx0X2Zhc3RfbW9kZSkKKwkJbWJoYy0+bWJoY19jYi0+Y2ZpbHRfZmFzdF9tb2RlKGNvZGVjLCBtYmhjKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGNfbWljYl9yZWdzLT5jZmlsdF9jdGwsCisJCQkJICAgIDB4NzAsIDB4MDApOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4MiwgMHgyKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLAorCQkgICAgICBtYmhjLT5zY2FsaW5nX211eF9pbik7CisJcHJfZGVidWcoIiVzOiAgc2NhbGluZ19tdXhfaW5wdXQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCSBtYmhjLT5zY2FsaW5nX211eF9pbik7CisKKwlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2spCisJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tdXhfYmlhc19ibG9jayhjb2RlYyk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLAorCQkJCSAgICAweDgwLCAweDgwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9UWF83X01CSENfRU4sIDB4ODAsIDB4ODApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9UWF83X01CSENfRU4sIDB4MUYsIDB4MUMpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9UWF83X01CSENfVEVTVF9DVEwsIDB4NDAsIDB4NDApOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1RYXzdfTUJIQ19FTiwgMHg4MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4OCwgMHg4KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHg4LCAweDAwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIDB4MiwgMHgyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHg4LCAweDgpOworCisJaWYgKCFtYmhjLT5tYmhjX2NmZy0+ZG9fcmVjYWxpYnJhdGlvbikgeworCQlpZiAoIWlzX2NzX2VuYWJsZSkKKwkJCXdjZDl4eHhfY2FsaWJyYXRlX2hzX3BvbGxpbmcobWJoYyk7CisJfQorCisJLyogZG9uJ3QgZmxpcCBvdmVycmlkZSAqLworCWJpYXNfdmFsdWUgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCB0cnVlLCB0cnVlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBtYmhjX21pY2JfcmVncy0+Y2ZpbHRfY3RsLCBjZmlsdF9tb2RlKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19IUEgsIDB4MTMsIDB4MDApOworCisJcmV0dXJuIGJpYXNfdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfcmVjYWxpYnJhdGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQlzdHJ1Y3QgbWJoY19taWNiaWFzX3JlZ3MgKm1iaGNfbWljYl9yZWdzLAorCQkJCWJvb2wgaXNfY3NfZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXMxNiByZWc7CisJaW50IGNoYW5nZTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0OworCXMxNiBzdGFfeiA9IDAsIGRjZV96ID0gMDsKKworCWJ0bl9kZXQgPSBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmRvX3JlY2FsaWJyYXRpb24pIHsKKwkJLyogcmVjYWxpYnJhdGUgZGNlX3ogYW5kIHN0YV96ICovCisJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCk7CisJCWNoYW5nZSA9IHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsCisJCQkJCSAgICAgMHg3OCwgYnRuX2RldC0+bWJoY19uc2MgPDwgMyk7CisJCXdjZDl4eHhfZ2V0X3oobWJoYywgJmRjZV96LCAmc3RhX3osIG1iaGNfbWljYl9yZWdzLCB0cnVlKTsKKwkJaWYgKGNoYW5nZSkKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIHJlZyk7CisJCWlmIChkY2VfeiAmJiBzdGFfeikgeworCQkJcHJfZGVidWcoIiVzOiBzdGFfeiAweCV4IC0+IDB4JXgsIGRjZV96IDB4JXggLT4gMHgleFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIG1iaGMtPm1iaGNfZGF0YS5zdGFfeiwgc3RhX3ogJiAweGZmZmYsCisJCQkJIG1iaGMtPm1iaGNfZGF0YS5kY2VfeiwgZGNlX3ogJiAweGZmZmYpOworCQkJbWJoYy0+bWJoY19kYXRhLmRjZV96ID0gZGNlX3o7CisJCQltYmhjLT5tYmhjX2RhdGEuc3RhX3ogPSBzdGFfejsKKwkJCXdjZDl4eHhfbWJoY19jYWxjX3RocmVzKG1iaGMpOworCQkJd2NkOXh4eF9jYWxpYnJhdGVfaHNfcG9sbGluZyhtYmhjKTsKKwkJfSBlbHNlIHsKKwkJCXByX3dhcm4oIiVzOiBmYWlsZWQgZ2V0IG5ldyBkY2Vfei9zdGFfeiAweCV4LzB4JXhcbiIsCisJCQkJX19mdW5jX18sIGRjZV96LCBzdGFfeik7CisJCX0KKworCQlpZiAoaXNfY3NfZW5hYmxlKSB7CisJCQkvKiByZWNhbGlicmF0ZSBkY2VfbnNjX2NzX3ogKi8KKwkJCXJlZyA9IHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywKKwkJCQkJICAgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLAorCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwKKwkJCQkJICAgIDB4NzgsIFdDRDlYWFhfTUJIQ19OU0NfQ1MgPDwgMyk7CisJCQl3Y2Q5eHh4X2dldF96KG1iaGMsICZkY2VfeiwgTlVMTCwgbWJoY19taWNiX3JlZ3MsCisJCQkJICAgICAgdHJ1ZSk7CisJCQlzbmRfc29jX3dyaXRlKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLAorCQkJCSAgICAgIHJlZyk7CisJCQlpZiAoZGNlX3opIHsKKwkJCQltYmhjLT5tYmhjX2RhdGEuZGNlX25zY19jc196ID0gZGNlX3o7CisJCQkJLyogdXBkYXRlIHZfY3NfaW5zX2ggd2l0aCBuZXcgZGNlX25zY19jc196ICovCisJCQkJbWJoYy0+bWJoY19kYXRhLnZfY3NfaW5zX2ggPQorCQkJCQkJd2NkOXh4eF9jb2RlY192X3N0YV9kY2UoCisJCQkJCQkJbWJoYywgRENFLAorCQkJCQkJCVdDRDlYWFhfVl9DU19IU19NQVgsCisJCQkJCQkJaXNfY3NfZW5hYmxlKTsKKwkJCQlwcl9kZWJ1ZygiJXM6IGRjZV9uc2NfY3NfeiAweCV4IC0+IDB4JXgsIHZfY3NfaW5zX2ggMHgleFxuIiwKKwkJCQkJICBfX2Z1bmNfXywKKwkJCQkJICBtYmhjLT5tYmhjX2RhdGEuZGNlX25zY19jc196LAorCQkJCQkgIGRjZV96ICYgMHhmZmZmLAorCQkJCQkgIG1iaGMtPm1iaGNfZGF0YS52X2NzX2luc19oKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoIiVzOiBmYWlsZWQgZ2V0IG5ldyBkY2VfbnNjX2NzX3pcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfc2h1dGRvd25faHNfcmVtb3ZhbF9kZXRlY3Qoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2dlbmVyYWxfY2ZnICpnZW5lcmljID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9HRU5FUkFMX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCisJLyogTmVlZCBNQkhDIGNsb2NrICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+Y29kZWNfcmNvX2N0cmwpCisJCW1iaGMtPm1iaGNfY2ItPmNvZGVjX3Jjb19jdHJsKG1iaGMtPmNvZGVjLCB0cnVlKTsKKwllbHNlIHsKKwkJV0NEOVhYWF9CR19DTEtfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQl3Y2Q5eHh4X3Jlc21ncl9nZXRfY2xrX2Jsb2NrKG1iaGMtPnJlc21nciwgV0NEOVhYWF9DTEtfUkNPKTsKKwkJV0NEOVhYWF9CR19DTEtfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4MiwgMHgyKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLCAweDYsIDB4MCk7CisJX193Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKG1iaGMsIDAsIGZhbHNlLCBmYWxzZSk7CisKKwl1c2xlZXBfcmFuZ2UoZ2VuZXJpYy0+dF9zaHV0ZG93bl9wbHVnX3JlbSwKKwkJICAgICBnZW5lcmljLT50X3NodXRkb3duX3BsdWdfcmVtICsgNTApOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4QSwgMHg4KTsKKworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmNvZGVjX3Jjb19jdHJsKQorCQltYmhjLT5tYmhjX2NiLT5jb2RlY19yY29fY3RybChtYmhjLT5jb2RlYywgZmFsc2UpOworCWVsc2UgeworCQlXQ0Q5WFhYX0JHX0NMS19MT0NLKG1iaGMtPnJlc21ncik7CisJCS8qIFB1dCByZXF1ZXN0ZWQgQ0xLIGJhY2sgKi8KKwkJd2NkOXh4eF9yZXNtZ3JfcHV0X2Nsa19ibG9jayhtYmhjLT5yZXNtZ3IsIFdDRDlYWFhfQ0xLX1JDTyk7CisJCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4MDApOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2NsZWFudXBfaHNfcG9sbGluZyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCXdjZDl4eHhfc2h1dGRvd25faHNfcmVtb3ZhbF9kZXRlY3QobWJoYyk7CisKKworCS8qIERpc2FibGUgZXh0ZXJuYWwgdm9sdGFnZSBzb3VyY2UgdG8gbWljYmlhcyBpZiBwcmVzZW50ICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZSkKKwkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZShtYmhjLT5jb2RlYywgZmFsc2UsIHRydWUpOworCisJbWJoYy0+cG9sbGluZ19hY3RpdmUgPSBmYWxzZTsKKwltYmhjLT5tYmhjX3N0YXRlID0gTUJIQ19TVEFURV9OT05FOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfY29kZWNfaHBocl9nbmRfc3dpdGNoKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBvbikKK3sKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19IUEgsIDB4MDEsIG9uKTsKKwlpZiAob24pCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9vbm9mZl92ZGRpb19zd2l0Y2goc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgYm9vbCBvbikKK3sKKwlwcl9kZWJ1ZygiJXM6IHZkZGlvICVkXG4iLCBfX2Z1bmNfXywgb24pOworCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+cHVsbF9tYl90b192ZGRpbykgeworCQltYmhjLT5tYmhjX2NiLT5wdWxsX21iX3RvX3ZkZGlvKG1iaGMtPmNvZGVjLCBvbik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAob24pIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYmhjLT5jb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsCisJCQkJICAgIDEgPDwgNywgMSA8PCA3KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYmhjLT5jb2RlYywgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTCwKKwkJCQkgICAgMSA8PCA0LCAwKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLAorCQkJCSAgICAxIDw8IDQsIDEgPDwgNCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWJoYy0+Y29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLm1iaGNfcmVnLAorCQkJCSAgICAxIDw8IDcsIDApOworCX0KKworZXhpdDoKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBtaWNiaWFzIHRvIHNldHRsZSBkb3duIHRvIHZkZGlvCisJICogd2hlbiB0aGUgbWljYmlhcyB0byB2ZGRpbyBzd2l0Y2ggaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAob24pCisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaHBobF9zdGF0dXMoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwl1MTYgaHBoLCBzdGF0dXM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlXQ0Q5WFhYX0JDTF9BU1NFUlRfTE9DS0VEKG1iaGMtPnJlc21ncik7CisJaHBoID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19IUEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgxMiwgMHgwMik7CisJdXNsZWVwX3JhbmdlKFdDRDlYWFhfSFBITF9TVEFUVVNfUkVBRFlfV0FJVF9VUywKKwkJICAgICBXQ0Q5WFhYX0hQSExfU1RBVFVTX1JFQURZX1dBSVRfVVMgKworCQkgICAgIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0xfU1RBVFVTKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19IUEgsIGhwaCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZQord2NkOXh4eF9jc19maW5kX3BsdWdfdHlwZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJICBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2RldGVjdCAqZHQsIGNvbnN0IGludCBzaXplLAorCQkJICBib29sIGhpZ2hocGgsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnRfc3RhdGUpCit7CisJaW50IGk7CisJaW50IHZkY2UsIG1iX212OworCWludCBjaCwgc3osIGRlbHRhX3RocjsKKwlpbnQgbWludiA9IDAsIG1heHYgPSBJTlRfTUlOOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfZGV0ZWN0ICpkID0gZHQ7CisJc3RydWN0IHdjZDl4eHhfbWJoY19kZXRlY3QgKmRwcmV2ID0gZCwgKmRtaWNiaWFzID0gTlVMTCwgKmRnbmQgPSBOVUxMOworCWVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZSB0eXBlID0gUExVR19UWVBFX0lOVkFMSUQ7CisKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX3BsdWdfdHlwZV9jZmcgKnBsdWdfdHlwZSA9CisJICAgIFdDRDlYWFhfTUJIQ19DQUxfUExVR19UWVBFX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCXMxNiBoc19tYXgsIG5vX21pYywgZGNlX3o7CisJaW50IGhpZ2hocGhfY250ID0gMDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50X3N0YXRlIDB4JWx4XG4iLCBfX2Z1bmNfXywgZXZlbnRfc3RhdGUpOworCisJc3ogPSBzaXplIC0gMTsKKwlmb3IgKGkgPSAwLCBkID0gZHQsIGNoID0gMDsgaSA8IHN6OyBpKyssIGQrKykgeworCQlpZiAoZC0+bWljX2JpYXMpIHsKKwkJCWRjZV96ID0gbWJoYy0+bWJoY19kYXRhLmRjZV96OworCQkJbWJfbXYgPSBtYmhjLT5tYmhjX2RhdGEubWljYl9tdjsKKwkJCWhzX21heCA9IHBsdWdfdHlwZS0+dl9oc19tYXg7CisJCQlub19taWMgPSBwbHVnX3R5cGUtPnZfbm9fbWljOworCQl9IGVsc2UgeworCQkJZGNlX3ogPSBtYmhjLT5tYmhjX2RhdGEuZGNlX25zY19jc196OworCQkJbWJfbXYgPSBWRERJT19NSUNCSUFTX01WOworCQkJaHNfbWF4ID0gV0NEOVhYWF9WX0NTX0hTX01BWDsKKwkJCW5vX21pYyA9IFdDRDlYWFhfVl9DU19OT19NSUM7CisJCX0KKworCQl2ZGNlID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCB0cnVlLCBkLT5kY2UsCisJCQkJCQkgZGNlX3osICh1MzIpbWJfbXYpOworCQlkLT5fdmRjZXMgPSB2ZGNlOworCQlpZiAoZC0+X3ZkY2VzIDwgbm9fbWljKQorCQkJZC0+X3R5cGUgPSBQTFVHX1RZUEVfSEVBRFBIT05FOworCQllbHNlIGlmIChkLT5fdmRjZXMgPj0gaHNfbWF4KSB7CisJCQlkLT5fdHlwZSA9IFBMVUdfVFlQRV9ISUdIX0hQSDsKKwkJCWhpZ2hocGhfY250Kys7CisJCX0gZWxzZQorCQkJZC0+X3R5cGUgPSBQTFVHX1RZUEVfSEVBRFNFVDsKKworCQlwcl9kZWJ1ZygiJXM6IERDRSAjJWQsICUwNHgsIFYgJTA0ZCglMDRkKSwgSFBITCAlZCBUWVBFICVkXG4iLAorCQkJIF9fZnVuY19fLCBpLCBkLT5kY2UsIHZkY2UsIGQtPl92ZGNlcywKKwkJCSBkLT5ocGhsX3N0YXR1cyAmIDB4MDEsCisJCQkgZC0+X3R5cGUpOworCisJCWNoICs9IGQtPmhwaGxfc3RhdHVzICYgMHgwMTsKKwkJaWYgKCFkLT5zd2FwX2duZCAmJiAhZC0+bWljX2JpYXMpIHsKKwkJCWlmIChtYXh2IDwgZC0+X3ZkY2VzKQorCQkJCW1heHYgPSBkLT5fdmRjZXM7CisJCQlpZiAoIW1pbnYgfHwgbWludiA+IGQtPl92ZGNlcykKKwkJCQltaW52ID0gZC0+X3ZkY2VzOworCQl9CisJCWlmICgoIWQtPm1pY19iaWFzICYmCisJCSAgICAoZC0+X3ZkY2VzID49IFdDRDlYWFhfQ1NfTUVBU19JTlZBTERfUkFOR0VfTE9XX01WICYmCisJCSAgICAgZC0+X3ZkY2VzIDw9IFdDRDlYWFhfQ1NfTUVBU19JTlZBTERfUkFOR0VfSElHSF9NVikpIHx8CisJCSAgICAoZC0+bWljX2JpYXMgJiYKKwkJICAgIChkLT5fdmRjZXMgPj0gV0NEOVhYWF9NRUFTX0lOVkFMRF9SQU5HRV9MT1dfTVYgJiYKKwkJICAgICBkLT5fdmRjZXMgPD0gV0NEOVhYWF9NRUFTX0lOVkFMRF9SQU5HRV9ISUdIX01WKSkpIHsKKwkJCXByX2RlYnVnKCIlczogd2l0aGluIGludmFsaWQgcmFuZ2VcbiIsIF9fZnVuY19fKTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCWRlbHRhX3RociA9ICgoaGlnaGhwaF9jbnQgPT0gc3opIHx8IGhpZ2hocGgpID8KKwkJCSAgICAgIFdDRDlYWFhfTUJfTUVBU19ERUxUQV9NQVhfTVYgOgorCQkJICAgICAgV0NEOVhYWF9DU19NRUFTX0RFTFRBX01BWF9NVjsKKworCWZvciAoaSA9IDAsIGQgPSBkdDsgaSA8IHN6OyBpKyssIGQrKykgeworCQlpZiAoKGkgPiAwKSAmJiAhZC0+bWljX2JpYXMgJiYgIWQtPnN3YXBfZ25kICYmCisJCSAgICAoZC0+X3R5cGUgIT0gZHByZXYtPl90eXBlKSkgeworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBpbmNvbnNpc3RlbnQgdHlwZXNcbiIsIF9fZnVuY19fKTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWlmICghZC0+c3dhcF9nbmQgJiYgIWQtPm1pY19iaWFzICYmCisJCSAgICAoYWJzKG1pbnYgLSBkLT5fdmRjZXMpID4gZGVsdGFfdGhyIHx8CisJCSAgICAgYWJzKG1heHYgLSBkLT5fdmRjZXMpID4gZGVsdGFfdGhyKSkgeworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBkZWx0YSAlZG12LCAlZG12IGFuZCAlZG12XG4iLAorCQkJCSBfX2Z1bmNfXywgZC0+X3ZkY2VzLCBtaW52LCBtYXh2KTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJCWdvdG8gZXhpdDsKKwkJfSBlbHNlIGlmIChkLT5zd2FwX2duZCkgeworCQkJZGduZCA9IGQ7CisJCX0KKworCQlpZiAoIWQtPm1pY19iaWFzICYmICFkLT5zd2FwX2duZCkKKwkJCWRwcmV2ID0gZDsKKwkJZWxzZSBpZiAoZC0+bWljX2JpYXMpCisJCQlkbWljYmlhcyA9IGQ7CisJfQorCWlmIChkZ25kICYmIGR0LT5fdHlwZSAhPSBQTFVHX1RZUEVfSEVBRFNFVCAmJgorCSAgICBkdC0+X3R5cGUgIT0gZGduZC0+X3R5cGUpIHsKKwkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBpbmNvbnNpc3RlbnQgdHlwZXNcbiIsIF9fZnVuY19fKTsKKwkJdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCQlnb3RvIGV4aXQ7CisJfQorCisJdHlwZSA9IGR0LT5fdHlwZTsKKwlpZiAoZG1pY2JpYXMpIHsKKwkJaWYgKGRtaWNiaWFzLT5fdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCAmJgorCQkgICAgKGR0LT5fdHlwZSA9PSBQTFVHX1RZUEVfSElHSF9IUEggfHwKKwkJICAgICBkdC0+X3R5cGUgPT0gUExVR19UWVBFX0hFQURTRVQpKSB7CisJCQl0eXBlID0gUExVR19UWVBFX0hFQURTRVQ7CisJCQlpZiAoZHQtPl90eXBlID09IFBMVUdfVFlQRV9ISUdIX0hQSCkgeworCQkJCXByX2RlYnVnKCIlczogSGVhZHNldCB3aXRoIHRocmVzaG9sZCBvbiBNSUMgZGV0ZWN0ZWRcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzX2VuYWJsZV9mbGFncyAmCisJCQkJICgxIDw8IE1CSENfTUlDQklBU19FTkFCTEVfVEhSRVNIT0xEX0hFQURTRVQpKQorCQkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCAmJiBkZ25kICYmICFkZ25kLT5taWNfYmlhcykgeworCQkvKiBpZiBwbHVnIHR5cGUgaXMgSGVhZHBob25lIHJlcG9ydCBhcyBHTkRfTUlDX1NXQVAgKi8KKwkJaWYgKGRnbmQtPl90eXBlID09IFBMVUdfVFlQRV9IRUFEUEhPTkUpIHsKKwkJCXByX2RlYnVnKCIlczogR05EX01JQ19TV0FQXG4iLCBfX2Z1bmNfXyk7CisJCQl0eXBlID0gUExVR19UWVBFX0dORF9NSUNfU1dBUDsKKwkJCS8qCisJCQkgKiBpZiB0eXBlIGlzIEdORF9NSUNfU1dBUCB3ZSBzaG91bGQgbm90IGNoZWNrCisJCQkgKiBIUEhMIHN0YXR1cyBoZW5jZSBnb3RvIGV4aXQKKwkJCSAqLworCQkJZ290byBleGl0OworCQl9IGVsc2UgaWYgKGRnbmQtPl90eXBlICE9IFBMVUdfVFlQRV9IRUFEU0VUICYmICFkbWljYmlhcykgeworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBpbmNvbnNpc3RlbnQgdHlwZXNcbiIsIF9fZnVuY19fKTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJfQorCX0KKworCWlmIChldmVudF9zdGF0ZSAmICgxIDw8IE1CSENfRVZFTlRfUEFfSFBITCkpIHsKKwkJcHJfZGVidWcoIiVzOiBIUEhMIFBBIHdhcyBPTlxuIiwgX19mdW5jX18pOworCX0gZWxzZSBpZiAoY2ggIT0gc3ogJiYgY2ggPiAwKSB7CisJCXByX2RlYnVnKCIlczogSW52YWxpZCwgaW5jb25zaXN0ZW50IEhQSEwuLlxuIiwgX19mdW5jX18pOworCQl0eXBlID0gUExVR19UWVBFX0lOVkFMSUQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIShldmVudF9zdGF0ZSAmICgxVUwgPDwgTUJIQ19FVkVOVF9QQV9IUEhMKSkpIHsKKwkJaWYgKCgodHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCB8fAorCQkgICAgICB0eXBlID09IFBMVUdfVFlQRV9IRUFEUEhPTkUpICYmIGNoICE9IHN6KSkgeworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBub3QgZnVsbHkgaW5zZXJ0ZWQsIFRZUEUgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB0eXBlKTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJfQorCX0KKworCWlmICh0eXBlID09IFBMVUdfVFlQRV9IRUFEU0VUICYmCisJICAgIChtYmhjLT5tYmhjX2NmZy0+bWljYmlhc19lbmFibGVfZmxhZ3MgJgorCSAgICAoMSA8PCBNQkhDX01JQ0JJQVNfRU5BQkxFX1JFR1VMQVJfSEVBRFNFVCkpKQorCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IHRydWU7CisKK2V4aXQ6CisJcHJfZGVidWcoIiVzOiBQbHVnIHR5cGUgJWQgZGV0ZWN0ZWRcbiIsIF9fZnVuY19fLCB0eXBlKTsKKwlyZXR1cm4gdHlwZTsKK30KKworLyoKKyAqIHdjZDl4eHhfZmluZF9wbHVnX3R5cGUgOiBGaW5kIG91dCBhbmQgcmV0dXJuIHRoZSBiZXN0IHBsdWcgdHlwZSB3aXRoIGdpdmVuCisgKgkJCSAgICBsaXN0IG9mIHdjZDl4eHhfbWJoY19kZXRlY3Qgc3RydWN0dXJlLgorICogcGFyYW0gbWJoYyB3Y2Q5eHh4X21iaGMgc3RydWN0dXJlCisgKiBwYXJhbSBkdCBjb2xsZWN0ZWQgbWVhc3VyZW1lbnRzCisgKiBwYXJhbSBzaXplIGFycmF5IHNpemUgb2YgZHQKKyAqIHBhcmFtIGV2ZW50X3N0YXRlIG1iaGMtPmV2ZW50X3N0YXRlIHdoZW4gZHQgaXMgY29sbGVjdGVkCisgKi8KK3N0YXRpYyBlbnVtIHdjZDl4eHhfbWJoY19wbHVnX3R5cGUKK3djZDl4eHhfZmluZF9wbHVnX3R5cGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJICAgICAgIHN0cnVjdCB3Y2Q5eHh4X21iaGNfZGV0ZWN0ICpkdCwgY29uc3QgaW50IHNpemUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3N0YXRlKQoreworCWludCBpOworCWludCBjaDsKKwllbnVtIHdjZDl4eHhfbWJoY19wbHVnX3R5cGUgdHlwZTsKKwlpbnQgdmRjZTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2RldGVjdCAqZCwgKmRwcmV2LCAqZGduZCA9IE5VTEwsICpkdmRkaW8gPSBOVUxMOworCWludCBtYXh2ID0gMCwgbWludiA9IDA7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnICpwbHVnX3R5cGUgPQorCSAgICBXQ0Q5WFhYX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uKTsKKwljb25zdCBzMTYgaHNfbWF4ID0gcGx1Z190eXBlLT52X2hzX21heDsKKwljb25zdCBzMTYgbm9fbWljID0gcGx1Z190eXBlLT52X25vX21pYzsKKworCXByX2RlYnVnKCIlczogZXZlbnRfc3RhdGUgMHglbHhcbiIsIF9fZnVuY19fLCBldmVudF9zdGF0ZSk7CisKKwlmb3IgKGkgPSAwLCBkID0gZHQsIGNoID0gMDsgaSA8IHNpemU7IGkrKywgZCsrKSB7CisJCXZkY2UgPSB3Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCB0cnVlLCBkLT5kY2UpOworCQlpZiAoZC0+dmRkaW8pCisJCQlkLT5fdmRjZXMgPSBzY2FsZV92X21pY2JfdmRkaW8obWJoYywgdmRjZSwgZmFsc2UpOworCQllbHNlCisJCQlkLT5fdmRjZXMgPSB2ZGNlOworCisJCWlmIChkLT5fdmRjZXMgPj0gbm9fbWljICYmIGQtPl92ZGNlcyA8IGhzX21heCkKKwkJCWQtPl90eXBlID0gUExVR19UWVBFX0hFQURTRVQ7CisJCWVsc2UgaWYgKGQtPl92ZGNlcyA8IG5vX21pYykKKwkJCWQtPl90eXBlID0gUExVR19UWVBFX0hFQURQSE9ORTsKKwkJZWxzZQorCQkJZC0+X3R5cGUgPSBQTFVHX1RZUEVfSElHSF9IUEg7CisKKwkJY2ggKz0gZC0+aHBobF9zdGF0dXMgJiAweDAxOworCQlpZiAoIWQtPnN3YXBfZ25kICYmICFkLT5od3ZhbHVlICYmICFkLT52ZGRpbykgeworCQkJaWYgKG1heHYgPCBkLT5fdmRjZXMpCisJCQkJbWF4diA9IGQtPl92ZGNlczsKKwkJCWlmICghbWludiB8fCBtaW52ID4gZC0+X3ZkY2VzKQorCQkJCW1pbnYgPSBkLT5fdmRjZXM7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IERDRSAjJWQsICUwNHgsIFYgJTA0ZCglMDRkKSwgR05EICVkLCBWRERJTyAlZCwgSFBITCAlZCBUWVBFICVkXG4iLAorCQkJIF9fZnVuY19fLCBpLCBkLT5kY2UsIHZkY2UsIGQtPl92ZGNlcywKKwkJCSBkLT5zd2FwX2duZCwgZC0+dmRkaW8sIGQtPmhwaGxfc3RhdHVzICYgMHgwMSwKKwkJCSBkLT5fdHlwZSk7CisKKworCQkvKgorCQkgKiBJZiBHTkQgYW5kIE1JQyBwcm9uZ3MgYXJlIGFsaWduZWQgdG8gSFBIUiBhbmQgR05EIG9mCisJCSAqIGhlYWRwaG9uZSwgY29kZWMgbWVhc3VyZXMgdGhlIHZvbHRhZ2UgYmFzZWQgb24KKwkJICogaW1wZWRhbmNlIGJldHdlZW4gSFBIUiBhbmQgR05EIHdoaWNoIHJlc3VsdHMgaW4gfjgwbXYuCisJCSAqIEF2b2lkIHRoaXMuCisJCSAqLworCQlpZiAoZC0+X3ZkY2VzID49IFdDRDlYWFhfTUVBU19JTlZBTERfUkFOR0VfTE9XX01WICYmCisJCSAgICBkLT5fdmRjZXMgPD0gV0NEOVhYWF9NRUFTX0lOVkFMRF9SQU5HRV9ISUdIX01WKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHdpdGhpbiBpbnZhbGlkIHJhbmdlXG4iLCBfX2Z1bmNfXyk7CisJCQl0eXBlID0gUExVR19UWVBFX0lOVkFMSUQ7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwlpZiAoZXZlbnRfc3RhdGUgJiAoMSA8PCBNQkhDX0VWRU5UX1BBX0hQSEwpKSB7CisJCXByX2RlYnVnKCIlczogSFBITCBQQSB3YXMgT05cbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKGNoICE9IHNpemUgJiYgY2ggPiAwKSB7CisJCXByX2RlYnVnKCIlczogSW52YWxpZCwgaW5jb25zaXN0ZW50IEhQSExcbiIsIF9fZnVuY19fKTsKKwkJdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCQlnb3RvIGV4aXQ7CisJfQorCisJZm9yIChpID0gMCwgZHByZXYgPSBOVUxMLCBkID0gZHQ7IGkgPCBzaXplOyBpKyssIGQrKykgeworCQlpZiAoZC0+dmRkaW8pIHsKKwkJCWR2ZGRpbyA9IGQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoaSA+IDApICYmIChkcHJldiAhPSBOVUxMKSAmJiAoZC0+X3R5cGUgIT0gZHByZXYtPl90eXBlKSkgeworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkLCBpbmNvbnNpc3RlbnQgdHlwZXNcbiIsIF9fZnVuY19fKTsKKwkJCXR5cGUgPSBQTFVHX1RZUEVfSU5WQUxJRDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWlmICghZC0+c3dhcF9nbmQgJiYgIWQtPmh3dmFsdWUgJiYKKwkJICAgIChhYnMobWludiAtIGQtPl92ZGNlcykgPiBXQ0Q5WFhYX01FQVNfREVMVEFfTUFYX01WIHx8CisJCSAgICAgYWJzKG1heHYgLSBkLT5fdmRjZXMpID4gV0NEOVhYWF9NRUFTX0RFTFRBX01BWF9NVikpIHsKKwkJCXByX2RlYnVnKCIlczogSW52YWxpZCwgZGVsdGEgJWRtdiwgJWRtdiBhbmQgJWRtdlxuIiwKKwkJCQkgX19mdW5jX18sIGQtPl92ZGNlcywgbWludiwgbWF4dik7CisJCQl0eXBlID0gUExVR19UWVBFX0lOVkFMSUQ7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSBpZiAoZC0+c3dhcF9nbmQpIHsKKwkJCWRnbmQgPSBkOworCQl9CisJCWRwcmV2ID0gZDsKKwl9CisKKwlXQVJOX09OKGkgIT0gc2l6ZSk7CisJdHlwZSA9IGR0LT5fdHlwZTsKKwlpZiAodHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCAmJiBkZ25kKSB7CisJCWlmICgoZGduZC0+X3ZkY2VzICsgV0NEOVhYWF9HTV9TV0FQX1RIUkVTX01JTl9NViA8CisJCSAgICAgbWludikgJiYKKwkJICAgIChkZ25kLT5fdmRjZXMgKyBXQ0Q5WFhYX0dNX1NXQVBfVEhSRVNfTUFYX01WID4KKwkJICAgICBtYXh2KSkKKwkJCXR5cGUgPSBQTFVHX1RZUEVfR05EX01JQ19TV0FQOworCX0KKworCS8qIGlmIEhQSEwgUEEgd2FzIG9uLCB3ZSBjYW5ub3QgdXNlIGhwaGwgc3RhdHVzICovCisJaWYgKCEoZXZlbnRfc3RhdGUgJiAoMVVMIDw8IE1CSENfRVZFTlRfUEFfSFBITCkpKSB7CisJCWlmICgoKHR5cGUgPT0gUExVR19UWVBFX0hFQURTRVQgfHwKKwkJICAgICAgdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSAmJiBjaCAhPSBzaXplKSB8fAorCQkgICAgKHR5cGUgPT0gUExVR19UWVBFX0dORF9NSUNfU1dBUCAmJiBjaCkpIHsKKwkJCXByX2RlYnVnKCIlczogSW52YWxpZCwgbm90IGZ1bGx5IGluc2VydGVkLCBUWVBFICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgdHlwZSk7CisJCQl0eXBlID0gUExVR19UWVBFX0lOVkFMSUQ7CisJCX0KKwl9CisKKwlpZiAodHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCkgeworCQlpZiAoZHZkZGlvICYmICgoZHZkZGlvLT5fdmRjZXMgPiBoc19tYXgpIHx8CisJCSAgIChkdmRkaW8tPl92ZGNlcyA+IG1pbnYgKyBXQ0Q5WFhYX1RIUkVTSE9MRF9NSUNfVEhSRVNIT0xEKSkpIHsKKwkJCXByX2RlYnVnKCIlczogSGVhZHNldCB3aXRoIHRocmVzaG9sZCBvbiBNSUMgZGV0ZWN0ZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCWlmIChtYmhjLT5tYmhjX2NmZy0+bWljYmlhc19lbmFibGVfZmxhZ3MgJgorCQkJICAgICgxIDw8IE1CSENfTUlDQklBU19FTkFCTEVfVEhSRVNIT0xEX0hFQURTRVQpKQorCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogSGVhZHNldCB3aXRoIHJlZ3VsYXIgTUlDIGRldGVjdGVkXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlpZiAobWJoYy0+bWJoY19jZmctPm1pY2JpYXNfZW5hYmxlX2ZsYWdzICYKKwkJCSAgICAoMSA8PCBNQkhDX01JQ0JJQVNfRU5BQkxFX1JFR1VMQVJfSEVBRFNFVCkpCisJCQkJbWJoYy0+bWljYmlhc19lbmFibGUgPSB0cnVlOworCQl9CisJfQorZXhpdDoKKwlwcl9kZWJ1ZygiJXM6IFBsdWcgdHlwZSAlZCBkZXRlY3RlZCwgbWljYmlhc19lbmFibGUgJWRcbiIsIF9fZnVuY19fLAorCQkgdHlwZSwgbWJoYy0+bWljYmlhc19lbmFibGUpOworCXJldHVybiB0eXBlOworfQorCisvKgorICogUHVsbCBkb3duIE1CSEMgbWljYmlhcyBmb3IgcHJvdmlkZWQgZHVyYXRpb24gaW4gbWljcm9zZWNvbmQuCisgKi8KK3N0YXRpYyBpbnQgd2NkOXh4eF9wdWxsX2Rvd25fbWljYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLCBpbnQgdXMpCit7CisJYm9vbCBtaWNiaWFzY29ubiA9IGZhbHNlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCWNvbnN0IHUxNiBjdGxyZWcgPSBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnOworCisJLyoKKwkgKiBEaXNhYmxlIE1CSEMgdG8gbWljYmlhcyBjb25uZWN0aW9uIHRvIHB1bGwgZG93bgorCSAqIG1pY2JpYXMgYW5kIHB1bGwgZG93biBtaWNiaWFzIGZvciBhIG1vbWVudC4KKwkgKi8KKwlpZiAoKHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywgY3RscmVnKSAmIDB4MDEpKSB7CisJCVdBUk5fT05DRSgxLCAiTUJIQyBtaWNiaWFzIGlzIGFscmVhZHkgcHVsbGVkIGRvd24gdW5leHBlY3RlZGx5XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKChzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDlYWFhfQV9NQURfQU5BX0NUUkwpICYgMSA8PCA0KSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLAorCQkJCSAgICAxIDw8IDQsIDApOworCQltaWNiaWFzY29ubiA9IHRydWU7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywgMHgwMSwgMHgwMSk7CisKKwkvKgorCSAqIFB1bGwgZG93biBmb3IgMW1zIHRvIGRpc2NoYXJnZSBiaWFzLiBHaXZlIHNtYWxsIG1hcmdpbiAoMTB1cykgdG8gYmUKKwkgKiBhYmxlIHRvIGdldCBjb25zaXN0ZW50IHJlc3VsdCBhY3Jvc3MgRENFcy4KKwkgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCArIDEwKTsKKworCWlmIChtaWNiaWFzY29ubikKKwkJc25kX3NvY191cGRhdGVfYml0cyhtYmhjLT5jb2RlYywgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTCwKKwkJCQkgICAgMSA8PCA0LCAxIDw8IDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsIDB4MDEsIDB4MDApOworCXVzbGVlcF9yYW5nZSh1cywgdXMgKyBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB1bmRlciBjb2RlYyByZXNvdXJjZSBsb2NrIGFjcXVpc2l0aW9uICovCit2b2lkIHdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJCSAgICAgICBzdHJ1Y3QgbWJoY19taWNiaWFzX3JlZ3MgKm1iaGNfbWljYl9yZWdzLAorCQkJCSAgICAgICBib29sIG9uLCBib29sIGhpZ2hocGgpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9kZXQ7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX2RldGVjdF9jZmcgKnBsdWdfZGV0ID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9QTFVHX0RFVF9QVFIobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uKTsKKworCWJ0bl9kZXQgPSBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisJY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCWlmICgob24gJiYgbWJoYy0+aXNfY3NfZW5hYmxlZCkgfHwKKwkgICAgKCFvbiAmJiAhbWJoYy0+aXNfY3NfZW5hYmxlZCkpIHsKKwkJcHJfZGVidWcoIiVzOiBDdXJyZW50IHNvdXJjZSBpcyBhbHJlYWR5ICVzXG4iLAorCQkJX19mdW5jX18sIG9uID8gIk9OIiA6ICJPRkYiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvbikgeworCQlwcl9kZWJ1ZygiJXM6IGVuYWJsaW5nIGN1cnJlbnQgc291cmNlXG4iLCBfX2Z1bmNfXyk7CisJCS8qIE5zYyB0byA5ICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsCisJCQkJICAgIDB4NzgsIDB4NDgpOworCQkvKiBwdWxsIGRvd24gZGlvZGUgYml0IHRvIDAgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoY19taWNiX3JlZ3MtPm1iaGNfcmVnLAorCQkJCSAgICAweDAxLCAweDAwKTsKKwkJLyoKKwkJICogS2VlcCB0aGUgbG93IHBvd2VyIGluc2VydGlvbi9yZW1vdmFsCisJCSAqIGRldGVjdGlvbiAocmVnIDB4M0REKSBkaXNhYmxlZAorCQkgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVEwsCisJCQkJICAgIDB4MDEsIDB4MDApOworCQkvKgorCQkgKiBFbmFibGUgdGhlIE1pYyBCaWFzIGN1cnJlbnQgc291cmNlCisJCSAqIFdyaXRlIGJpdHNbNjo1XSBvZiByZWdpc3RlciBNSUNCXzJfTUJIQyB0byAweDMgKFZfMjBfVUEpCisJCSAqIFdyaXRlIGJpdFs3XSBvZiByZWdpc3RlciBNSUNCXzJfTUJIQyB0byAxCisJCSAqIChJTlNfREVUX0lTUkNfRU5fX0VOQUJMRSkKKwkJICogTUlDQl8yX01CSENfX1NDSFRfVFJJR19FTiB0byAxCisJCSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjX21pY2JfcmVncy0+bWJoY19yZWcsCisJCQkJICAgIDB4RjAsIDB4RjApOworCQkvKiBEaXNjb25uZWN0IE1CSEMgT3ZlcnJpZGUgZnJvbSBNaWNCaWFzIGFuZCBMRE9IICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQURfQU5BX0NUUkwsIDB4MTAsIDB4MDApOworCQltYmhjLT5pc19jc19lbmFibGVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IGRpc2FibGluZyBjdXJyZW50IHNvdXJjZVxuIiwgX19mdW5jX18pOworCQkvKiBDb25uZWN0IE1CSEMgT3ZlcnJpZGUgZnJvbSBNaWNCaWFzIGFuZCBMRE9IICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQURfQU5BX0NUUkwsIDB4MTAsIDB4MTApOworCQkvKiBJTlNfREVUX0lTUkNfQ1RMIHRvIGFjZGIgdmFsdWUgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoY19taWNiX3JlZ3MtPm1iaGNfcmVnLAorCQkJCSAgICAweDYwLCBwbHVnX2RldC0+bWljX2N1cnJlbnQgPDwgNSk7CisJCWlmICghaGlnaGhwaCkgeworCQkJLyogSU5TX0RFVF9JU1JDX0VOX19FTkFCTEUgdG8gMCAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIG1iaGNfbWljYl9yZWdzLT5tYmhjX3JlZywKKwkJCQkJICAgIDB4ODAsIDB4MDApOworCQkJLyogTUlDQl8yX01CSENfX1NDSFRfVFJJR19FTiAgdG8gMCAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIG1iaGNfbWljYl9yZWdzLT5tYmhjX3JlZywKKwkJCQkJICAgIDB4MTAsIDB4MDApOworCQl9CisJCS8qIE5zYyB0byBhY2RiIHZhbHVlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIDB4NzgsCisJCQkJICAgIGJ0bl9kZXQtPm1iaGNfbnNjIDw8IDMpOworCQltYmhjLT5pc19jc19lbmFibGVkID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgZW51bSB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlCit3Y2Q5eHh4X2NvZGVjX2NzX2dldF9wbHVnX3R5cGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgYm9vbCBoaWdoaHBoKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfZGV0ZWN0IHJ0W05VTV9EQ0VfUExVR19JTlNfREVURUNUXTsKKwllbnVtIHdjZDl4eHhfbWJoY19wbHVnX3R5cGUgdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCWludCBpOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCUJVR19PTihOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCA8IDQpOworCisJd2NkOXh4eF9tYmhjX2N0cmxfY2xrX2JhbmRnYXAobWJoYywgdHJ1ZSk7CisJcnRbMF0uc3dhcF9nbmQgPSBmYWxzZTsKKwlydFswXS52ZGRpbyA9IGZhbHNlOworCXJ0WzBdLmh3dmFsdWUgPSB0cnVlOworCXJ0WzBdLmhwaGxfc3RhdHVzID0gd2NkOXh4eF9ocGhsX3N0YXR1cyhtYmhjKTsKKwlydFswXS5kY2UgPSB3Y2Q5eHh4X21iaGNfc2V0dXBfaHNfcG9sbGluZyhtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIHRydWUpOworCXJ0WzBdLm1pY19iaWFzID0gZmFsc2U7CisKKwlmb3IgKGkgPSAxOyBpIDwgTlVNX0RDRV9QTFVHX0lOU19ERVRFQ1QgLSAxOyBpKyspIHsKKwkJcnRbaV0uc3dhcF9nbmQgPSAoaSA9PSBOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDMpOworCQlydFtpXS5taWNfYmlhcyA9ICgoaSA9PSBOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDQpICYmCisJCQkJICAgaGlnaGhwaCk7CisJCXJ0W2ldLmhwaGxfc3RhdHVzID0gd2NkOXh4eF9ocGhsX3N0YXR1cyhtYmhjKTsKKwkJaWYgKHJ0W2ldLnN3YXBfZ25kKQorCQkJd2NkOXh4eF9jb2RlY19ocGhyX2duZF9zd2l0Y2goY29kZWMsIHRydWUpOworCisJCWlmIChydFtpXS5taWNfYmlhcykKKwkJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLAorCQkJCQkJCSAgJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQkJCSAgZmFsc2UsIGZhbHNlKTsKKworCQlydFtpXS5kY2UgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCAhaGlnaGhwaCwgdHJ1ZSk7CisJCWlmIChydFtpXS5taWNfYmlhcykKKwkJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLAorCQkJCQkJCSAgJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQkJCSAgdHJ1ZSwgZmFsc2UpOworCQlpZiAocnRbaV0uc3dhcF9nbmQpCisJCQl3Y2Q5eHh4X2NvZGVjX2hwaHJfZ25kX3N3aXRjaChjb2RlYywgZmFsc2UpOworCX0KKworCS8qIHJlY2FsaWJyYXRlIERDRS9TVEEgR05EIHZvbHRhZ2VzICovCisJd2NkOXh4eF9yZWNhbGlicmF0ZShtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsIHRydWUpOworCisJdHlwZSA9IHdjZDl4eHhfY3NfZmluZF9wbHVnX3R5cGUobWJoYywgcnQsIEFSUkFZX1NJWkUocnQpLCBoaWdoaHBoLAorCQkJCQkgbWJoYy0+ZXZlbnRfc3RhdGUpOworCisJd2NkOXh4eF9tYmhjX2N0cmxfY2xrX2JhbmRnYXAobWJoYywgZmFsc2UpOworCXByX2RlYnVnKCIlczogcGx1Z190eXBlOiVkXG4iLCBfX2Z1bmNfXywgdHlwZSk7CisKKwlyZXR1cm4gdHlwZTsKK30KKworc3RhdGljIGVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZQord2NkOXh4eF9jb2RlY19nZXRfcGx1Z190eXBlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGJvb2wgaGlnaGhwaCkKK3sKKwlpbnQgaTsKKwlib29sIHZkZGlvb247CisJc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnICpwbHVnX3R5cGVfcHRyOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfZGV0ZWN0IHJ0W05VTV9EQ0VfUExVR19JTlNfREVURUNUXTsKKwllbnVtIHdjZDl4eHhfbWJoY19wbHVnX3R5cGUgdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCS8qIG1ha2Ugc3VyZSBvdmVycmlkZSBpcyBvbiAqLworCVdBUk5fT04oIShzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwpICYgMHgwNCkpOworCisJLyogR05EIGFuZCBNSUMgc3dhcCBkZXRlY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgMiByb3VuZHMgb2YgRENFICovCisJQlVHX09OKE5VTV9EQ0VfUExVR19JTlNfREVURUNUIDwgMik7CisJZGV0ZWN0X3VzZV92ZGRpb19zd2l0Y2ggPSBtYmhjLT5tYmhjX2NmZy0+dXNlX3ZkZGlvX21lYXM7CisKKwkvKgorCSAqIFRoZXJlIGFyZSBjaGFuY2VzIHZkZGlvIHN3aXRjaCBpcyBvbiBhbmQgY2ZpbHQgdm9sdGFnZSBpcyBhZGp1c3RlZAorCSAqIHRvIHZkZGlvIHZvbHRhZ2UgZXZlbiBhZnRlciBwbHVnIHR5cGUgcmVtb3ZhbCByZXBvcnRlZC4KKwkgKi8KKwl2ZGRpb29uID0gX193Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKG1iaGMsIDAsIGZhbHNlLCBmYWxzZSk7CisJcHJfZGVidWcoIiVzOiB2ZGRpbyBzd2l0Y2ggd2FzICVzXG4iLCBfX2Z1bmNfXywgdmRkaW9vbiA/ICJvbiIgOiAib2ZmIik7CisKKwlwbHVnX3R5cGVfcHRyID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisKKwkvKgorCSAqIGNmaWx0ZXIgaW4gZmFzdCBtb2RlIHJlcXVpcmVzIDFtcyB0byBjaGFyZ2UgdXAgYW5kIGRvd24gbWljYmlhcworCSAqIGZ1bGx5LgorCSAqLworCSh2b2lkKSB3Y2Q5eHh4X3B1bGxfZG93bl9taWNiaWFzKG1iaGMsCisJCQkJCSBXQ0Q5WFhYX01JQ0JJQVNfUFVMTERPV05fU0VUVExFX1VTKTsKKworCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIHRydWUpOworCXJ0WzBdLmhwaGxfc3RhdHVzID0gd2NkOXh4eF9ocGhsX3N0YXR1cyhtYmhjKTsKKwlydFswXS5kY2UgPSB3Y2Q5eHh4X21iaGNfc2V0dXBfaHNfcG9sbGluZyhtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIGZhbHNlKTsKKwlydFswXS5zd2FwX2duZCA9IGZhbHNlOworCXJ0WzBdLnZkZGlvID0gZmFsc2U7CisJcnRbMF0uaHd2YWx1ZSA9IHRydWU7CisJZm9yIChpID0gMTsgaSA8IE5VTV9EQ0VfUExVR19JTlNfREVURUNUOyBpKyspIHsKKwkJcnRbaV0uc3dhcF9nbmQgPSAoaSA9PSBOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDIpOworCQlpZiAoZGV0ZWN0X3VzZV92ZGRpb19zd2l0Y2gpCisJCQlydFtpXS52ZGRpbyA9IChpID09IDEpOworCQllbHNlCisJCQlydFtpXS52ZGRpbyA9IGZhbHNlOworCQlydFtpXS5ocGhsX3N0YXR1cyA9IHdjZDl4eHhfaHBobF9zdGF0dXMobWJoYyk7CisJCXJ0W2ldLmh3dmFsdWUgPSBmYWxzZTsKKwkJaWYgKHJ0W2ldLnN3YXBfZ25kKQorCQkJd2NkOXh4eF9jb2RlY19ocGhyX2duZF9zd2l0Y2goY29kZWMsIHRydWUpOworCQlpZiAocnRbaV0udmRkaW8pCisJCQl3Y2Q5eHh4X29ub2ZmX3ZkZGlvX3N3aXRjaChtYmhjLCB0cnVlKTsKKwkJLyoKKwkJICogUHVsbCBkb3duIG1pY2JpYXMgdG8gZGV0ZWN0IGhlYWRzZXQgd2l0aCBtaWMgd2hpY2ggaGFzCisJCSAqIHRocmVzaG9sZCBhbmQgdG8gaGF2ZSBtb3JlIGNvbnNpc3RlbnQgdm9sdGFnZSBtZWFzdXJlbWVudHMuCisJCSAqCisJCSAqIGNmaWx0ZXIgaW4gZmFzdCBtb2RlIHJlcXVpcmVzIDFtcyB0byBjaGFyZ2UgdXAgYW5kIGRvd24KKwkJICogbWljYmlhcyBmdWxseS4KKwkJICovCisJCSh2b2lkKSB3Y2Q5eHh4X3B1bGxfZG93bl9taWNiaWFzKG1iaGMsCisJCQkJCSAgICBXQ0Q5WFhYX01JQ0JJQVNfUFVMTERPV05fU0VUVExFX1VTKTsKKwkJcnRbaV0uZGNlID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2UobWJoYywgMSwgdHJ1ZSwgdHJ1ZSk7CisJCWlmIChydFtpXS52ZGRpbykKKwkJCXdjZDl4eHhfb25vZmZfdmRkaW9fc3dpdGNoKG1iaGMsIGZhbHNlKTsKKwkJaWYgKHJ0W2ldLnN3YXBfZ25kKQorCQkJd2NkOXh4eF9jb2RlY19ocGhyX2duZF9zd2l0Y2goY29kZWMsIGZhbHNlKTsKKwl9CisJLyogcmVjYWxpYnJhdGUgRENFL1NUQSBHTkQgdm9sdGFnZXMgKi8KKwl3Y2Q5eHh4X3JlY2FsaWJyYXRlKG1iaGMsICZtYmhjLT5tYmhjX2JpYXNfcmVncywgZmFsc2UpOworCisJaWYgKHZkZGlvb24pCisJCV9fd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAxLCBmYWxzZSwgZmFsc2UpOworCisJdHlwZSA9IHdjZDl4eHhfZmluZF9wbHVnX3R5cGUobWJoYywgcnQsIEFSUkFZX1NJWkUocnQpLAorCQkJCSAgICAgIG1iaGMtPmV2ZW50X3N0YXRlKTsKKworCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIGZhbHNlKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyBib29sIHdjZDl4eHhfc3djaF9sZXZlbF9yZW1vdmUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlpZiAobWJoYy0+bWJoY19jZmctPmdwaW8pCisJCXJldHVybiAoZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAobWJoYy0+bWJoY19jZmctPmdwaW8pICE9CisJCQltYmhjLT5tYmhjX2NmZy0+Z3Bpb19sZXZlbF9pbnNlcnQpOworCWVsc2UgaWYgKG1iaGMtPm1iaGNfY2ZnLT5pbnNlcnRfZGV0ZWN0KSB7CisJCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmluc2VydF9yZW1fc3RhdHVzKQorCQkJcmV0dXJuIG1iaGMtPm1iaGNfY2ItPmluc2VydF9yZW1fc3RhdHVzKG1iaGMtPmNvZGVjKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywKKwkJCQkgICAgV0NEOVhYWF9BX01CSENfSU5TRVJUX0RFVF9TVEFUVVMpICYKKwkJCQkgICAgKDEgPDwgMik7CisJfSBlbHNlCisJCVdBUk4oMSwgIkludmFsaWQgamFjayBkZXRlY3Rpb24gY29uZmlndXJhdGlvblxuIik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgaXNfY2xrX2FjdGl2ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuICEhKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX0NEQ19DTEtfTUNMS19DVEwpICYgMHgwNSk7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9lbmFibGVfaHNfZGV0ZWN0KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkJICAgIGludCBpbnNlcnRpb24sIGludCB0cmlnZ2VyLCBib29sIHBhZGFjX29mZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlpbnQgY2VudHJhbF9iaWFzX2VuYWJsZWQgPSAwOworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfZ2VuZXJhbF9jZmcgKmdlbmVyaWMgPQorCSAgICBXQ0Q5WFhYX01CSENfQ0FMX0dFTkVSQUxfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX2RldGVjdF9jZmcgKnBsdWdfZGV0ID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9QTFVHX0RFVF9QVFIobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uKTsKKworCXByX2RlYnVnKCIlczogZW50ZXIgaW5zZXJ0aW9uKCVkKSB0cmlnZ2VyKDB4JXgpXG4iLAorCQkgX19mdW5jX18sIGluc2VydGlvbiwgdHJpZ2dlcik7CisKKwlpZiAoIW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbikgeworCQlwcl9lcnIoIkVycm9yLCBubyB3Y2Q5eHh4IGNhbGlicmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVEwsIDB4MSwgMCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBtaWMgYmlhcyBhbmQgTWljIGxpbmUgc2NobWl0dCB0cmlnZ2VyCisJICogYXJlIHR1cm5lZCBPRkYKKwkgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnLCAweDAxLCAweDAxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywgMHg5MCwgMHgwMCk7CisKKwlpZiAoaW5zZXJ0aW9uKSB7CisJCXdjZDl4eHhfc3dpdGNoX21pY2JpYXMobWJoYywgMCk7CisKKwkJLyogREFQTSBjYW4gbWFuaXB1bGF0ZSBQQS9EQUMgYml0cyBjb25jdXJyZW50bHkgKi8KKwkJaWYgKHBhZGFjX29mZiA9PSB0cnVlKQorCQkJd2NkOXh4eF9zZXRfYW5kX3R1cm5vZmZfaHBoX3BhZGFjKG1iaGMpOworCisJCWlmICh0cmlnZ2VyICYgTUJIQ19VU0VfSFBITF9UUklHR0VSKSB7CisJCQkvKiBFbmFibGUgSFBIIFNjaG1pdHQgVHJpZ2dlciAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfSFBILCAweDExLAorCQkJCQkweDExKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgwQywKKwkJCQkJcGx1Z19kZXQtPmhwaF9jdXJyZW50IDw8IDIpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfSFBILCAweDAyLAorCQkJCQkweDAyKTsKKwkJfQorCQlpZiAodHJpZ2dlciAmIE1CSENfVVNFX01CX1RSSUdHRVIpIHsKKwkJCS8qIGVuYWJsZSB0aGUgbWljIGxpbmUgc2NobWl0dCB0cmlnZ2VyICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQltYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywKKwkJCQkJMHg2MCwgcGx1Z19kZXQtPm1pY19jdXJyZW50IDw8IDUpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsCisJCQkJCTB4ODAsIDB4ODApOworCQkJdXNsZWVwX3JhbmdlKHBsdWdfZGV0LT50X21pY19waWQsIHBsdWdfZGV0LT50X21pY19waWQgKworCQkJCQkJV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCW1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsIDB4MDEsCisJCQkJCTB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsCisJCQkJCTB4MTAsIDB4MTApOworCQl9CisKKwkJLyogc2V0dXAgZm9yIGluc2V0aW9uIGRldGVjdGlvbiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfSU5UX0NUTCwgMHgyLCAwKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1Zygic2V0dXAgZm9yIHJlbW92YWwgZGV0ZWN0aW9uXG4iKTsKKwkJLyogTWFrZSBzdXJlIHRoZSBIUEggc2NobWl0dCB0cmlnZ2VyIGlzIE9GRiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19IUEgsIDB4MTIsIDB4MDApOworCisJCS8qIGVuYWJsZSB0aGUgbWljIGxpbmUgc2NobWl0dCB0cmlnZ2VyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsCisJCQkJICAgIDB4MDEsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywgMHg2MCwKKwkJCQkgICAgcGx1Z19kZXQtPm1pY19jdXJyZW50IDw8IDUpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJCXVzbGVlcF9yYW5nZShwbHVnX2RldC0+dF9taWNfcGlkLCBwbHVnX2RldC0+dF9taWNfcGlkICsKKwkJCQkJV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsCisJCQkJICAgIDB4MTAsIDB4MTApOworCisJCS8qIFNldHVwIGZvciBsb3cgcG93ZXIgcmVtb3ZhbCBkZXRlY3Rpb24gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVEwsIDB4MiwKKwkJCQkgICAgMHgyKTsKKwl9CisKKwlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMKSAmIDB4NCkgeworCQkvKiBjYWxsZWQgYnkgaW50ZXJydXB0ICovCisJCWlmICghaXNfY2xrX2FjdGl2ZShjb2RlYykpIHsKKwkJCXdjZDl4eHhfcmVzbWdyX2VuYWJsZV9jb25maWdfbW9kZShtYmhjLT5yZXNtZ3IsIDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwKKwkJCQkJMHgwNiwgMCk7CisJCQl1c2xlZXBfcmFuZ2UoZ2VuZXJpYy0+dF9zaHV0ZG93bl9wbHVnX3JlbSwKKwkJCQkJZ2VuZXJpYy0+dF9zaHV0ZG93bl9wbHVnX3JlbSArCisJCQkJCVdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCQl3Y2Q5eHh4X3Jlc21ncl9lbmFibGVfY29uZmlnX21vZGUobWJoYy0+cmVzbWdyLCAwKTsKKwkJfSBlbHNlCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLAorCQkJCQkweDA2LCAwKTsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5pbnRfcmJpYXMsIDB4ODAsIDApOworCisJLyogSWYgY2VudHJhbCBiYW5kZ2FwIGRpc2FibGVkICovCisJaWYgKCEoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfUElOX0NUTF9PRTEpICYgMSkpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1BJTl9DVExfT0UxLCAweDMsIDB4Myk7CisJCXVzbGVlcF9yYW5nZShnZW5lcmljLT50X2JnX2Zhc3Rfc2V0dGxlLAorCQkJICAgICBnZW5lcmljLT50X2JnX2Zhc3Rfc2V0dGxlICsKKwkJCSAgICAgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJY2VudHJhbF9iaWFzX2VuYWJsZWQgPSAxOworCX0KKworCS8qIElmIExET19IIGRpc2FibGVkICovCisJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX1BJTl9DVExfT0UwKSAmIDB4ODApIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1BJTl9DVExfT0UwLCAweDEwLCAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1BJTl9DVExfT0UwLCAweDgwLCAweDgwKTsKKwkJdXNsZWVwX3JhbmdlKGdlbmVyaWMtPnRfbGRvaCwgZ2VuZXJpYy0+dF9sZG9oICsKKwkJCQkJICAgICAgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1BJTl9DVExfT0UwLCAweDgwLCAwKTsKKworCQlpZiAoY2VudHJhbF9iaWFzX2VuYWJsZWQpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfUElOX0NUTF9PRTEsIDB4MSwKKwkJCQkJICAgIDApOworCX0KKworCWlmIChtYmhjLT5yZXNtZ3ItPnJlZ19hZGRyICYmIG1iaGMtPnJlc21nci0+cmVnX2FkZHItPm1pY2JfNF9tYmhjKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5yZXNtZ3ItPnJlZ19hZGRyLT5taWNiXzRfbWJoYywKKwkJCQkgICAgMHgzLCBtYmhjLT5tYmhjX2NmZy0+bWljYmlhcyk7CisKKwl3Y2Q5eHh4X2VuYWJsZV9pcnEobWJoYy0+cmVzbWdyLT5jb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmluc2VydGlvbik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0lOVF9DVEwsIDB4MSwgMHgxKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuYyBtaWNyb3Bob25lIGlzIHByZXNldCBvciBub3QuCisgKiBSZXR1cm4gdHJ1ZSBpZiBhbmMgbWljcm9waG9uZSBpcyBkZXRlY3RlZCBvciBmYWxzZSBpZiBub3QgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyBib29sIHdjZDl4eHhfZGV0ZWN0X2FuY19wbHVnX3R5cGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2RldGVjdCBydFtOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDFdOworCWJvb2wgYW5jX21pY19mb3VuZCA9IHRydWU7CisJaW50IGksIG1iX212OworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlX2NmZyAqcGx1Z190eXBlID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisJczE2IGhzX21heCwgZGNlX3o7CisJczE2IG5vX21pYzsKKwlib29sIG92ZXJyaWRlX2VuOworCWJvb2wgdGltZWRvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0LCByZXRyeSA9IDA7CisJZW51bSB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlIHR5cGU7CisJYm9vbCBjc19lbmFibGU7CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzICE9IE1CSENfTUlDQklBUzMgJiYKKwkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzICE9IE1CSENfTUlDQklBUzIpCisJCXJldHVybiBmYWxzZTsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCW92ZXJyaWRlX2VuID0gKHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCkgJgorCQkgICAgICAgMHgwNCkgPyB0cnVlIDogZmFsc2U7CisJY3NfZW5hYmxlID0gKChtYmhjLT5tYmhjX2NmZy0+Y3NfZW5hYmxlX2ZsYWdzICYKKwkJICAgICgxIDw8IE1CSENfQ1NfRU5BQkxFX0RFVF9BTkMpKSAhPSAwKSAmJgorCQkgICAgKCEoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLAorCQkgICAgICAgbWJoYy0+bWJoY19hbmNfYmlhc19yZWdzLmN0bF9yZWcpICYgMHg4MCkpICYmCisJCSAgICAgKG1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzICE9IG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcyk7CisKKwlpZiAoY3NfZW5hYmxlKSB7CisJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLAorCQkJCQkJICAmbWJoYy0+bWJoY19hbmNfYmlhc19yZWdzLAorCQkJCQkJICB0cnVlLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcyA9PSBNQkhDX01JQ0JJQVMzKSB7CisJCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGVfY2IpCisJCQkJbWJoYy0+bWljYmlhc19lbmFibGVfY2IobWJoYy0+Y29kZWMsIHRydWUsCisJCQkJCQltYmhjLT5tYmhjX2NmZy0+YW5jX21pY2JpYXMpOworCQkJZWxzZQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVuYWJsZSBvdmVycmlkZSAqLworCQkJaWYgKCFvdmVycmlkZV9lbikKKwkJCQl3Y2Q5eHh4X3R1cm5fb25vZmZfb3ZlcnJpZGUobWJoYywgdHJ1ZSk7CisJCX0KKwl9CisKKwlpZiAoIWNzX2VuYWJsZSkgeworCQloc19tYXggPSBwbHVnX3R5cGUtPnZfaHNfbWF4OworCQlub19taWMgPSBwbHVnX3R5cGUtPnZfbm9fbWljOworCQlkY2VfeiA9IG1iaGMtPm1iaGNfZGF0YS5kY2VfejsKKwkJbWJfbXYgPSBtYmhjLT5tYmhjX2RhdGEubWljYl9tdjsKKwl9IGVsc2UgeworCQloc19tYXggPSBXQ0Q5WFhYX1ZfQ1NfSFNfTUFYOworCQlub19taWMgPSBXQ0Q5WFhYX1ZfQ1NfTk9fTUlDOworCQltYl9tdiA9IFZERElPX01JQ0JJQVNfTVY7CisJCWRjZV96ID0gbWJoYy0+bWJoY19kYXRhLmRjZV9uc2NfY3NfejsKKwl9CisKKwl3Y2Q5eHh4X21iaGNfY3RybF9jbGtfYmFuZGdhcChtYmhjLCB0cnVlKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBTkNfSFBIX0RFVEVDVF9QTFVHX1RJTUVfTVMpOworCWFuY19taWNfZm91bmQgPSB0cnVlOworCisJd2hpbGUgKCEodGltZWRvdXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSkgeworCQlyZXRyeSsrOworCisJCWlmICh3Y2Q5eHh4X3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKKwkJCWFuY19taWNfZm91bmQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiBSZXRyeSBhdHRlbXB0ICVsdSIsIF9fZnVuY19fLCByZXRyeSAtIDEpOworCisJCXJ0WzBdLmhwaGxfc3RhdHVzID0gd2NkOXh4eF9ocGhsX3N0YXR1cyhtYmhjKTsKKwkJcnRbMF0uZGNlID0gd2NkOXh4eF9tYmhjX3NldHVwX2hzX3BvbGxpbmcobWJoYywKKwkJCQkJCSAgJm1iaGMtPm1iaGNfYW5jX2JpYXNfcmVncywKKwkJCQkJCSAgY3NfZW5hYmxlKTsKKwkJcnRbMF0uX3ZkY2VzID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCB0cnVlLCBydFswXS5kY2UsCisJCQkJCQkJIGRjZV96LCAodTMyKW1iX212KTsKKworCQlpZiAocnRbMF0uX3ZkY2VzID49IG5vX21pYyAmJiBydFswXS5fdmRjZXMgPCBoc19tYXgpCisJCQlydFswXS5fdHlwZSA9IFBMVUdfVFlQRV9IRUFEU0VUOworCQllbHNlIGlmIChydFswXS5fdmRjZXMgPCBub19taWMpCisJCQlydFswXS5fdHlwZSA9IFBMVUdfVFlQRV9IRUFEUEhPTkU7CisJCWVsc2UKKwkJCXJ0WzBdLl90eXBlID0gUExVR19UWVBFX0hJR0hfSFBIOworCisJCXByX2RlYnVnKCIlczogRENFICMlZCwgViAlMDRkLCBIUEhMICVkIFRZUEUgJWRcbiIsCisJCQkJX19mdW5jX18sIDAsIHJ0WzBdLl92ZGNlcywKKwkJCQlydFswXS5ocGhsX3N0YXR1cyAmIDB4MDEsCisJCQkJcnRbMF0uX3R5cGUpOworCisJCWZvciAoaSA9IDE7IGkgPCBOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDE7IGkrKykgeworCQkJcnRbaV0uZGNlID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2UobWJoYywgMSwKKwkJCQkJCQkgICAgdHJ1ZSwgdHJ1ZSk7CisJCQlydFtpXS5fdmRjZXMgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIHRydWUsCisJCQkJCQkJIHJ0W2ldLmRjZSwgZGNlX3osCisJCQkJCQkJICh1MzIpIG1iX212KTsKKworCQkJaWYgKHJ0W2ldLl92ZGNlcyA+PSBub19taWMgJiYgcnRbaV0uX3ZkY2VzIDwgaHNfbWF4KQorCQkJCXJ0W2ldLl90eXBlID0gUExVR19UWVBFX0hFQURTRVQ7CisJCQllbHNlIGlmIChydFtpXS5fdmRjZXMgPCBub19taWMpCisJCQkJcnRbaV0uX3R5cGUgPSBQTFVHX1RZUEVfSEVBRFBIT05FOworCQkJZWxzZQorCQkJCXJ0W2ldLl90eXBlID0gUExVR19UWVBFX0hJR0hfSFBIOworCisJCQlydFtpXS5ocGhsX3N0YXR1cyA9IHdjZDl4eHhfaHBobF9zdGF0dXMobWJoYyk7CisKKwkJCXByX2RlYnVnKCIlczogRENFICMlZCwgViAlMDRkLCBIUEhMICVkIFRZUEUgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBpLCBydFtpXS5fdmRjZXMsCisJCQkJCXJ0W2ldLmhwaGxfc3RhdHVzICYgMHgwMSwKKwkJCQkJcnRbaV0uX3R5cGUpOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHRoZSAidHlwZSIgb2YgYWxsIHRoZSA0IG1lYXN1cmVtZW50cworCQkgKiBJZiBhbGwgNCBtZWFzdXJlbWVudHMgaGF2ZSB0aGUgVHlwZSBhcyBQTFVHX1RZUEVfSEVBRFNFVAorCQkgKiB0aGVuIGl0IGlzIHByb3BlciBtaWMgYW5kIGRlY2xhcmUgdGhhdCB0aGUgcGx1ZyBoYXMgdHdvIG1pY3MKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRENFX1BMVUdfSU5TX0RFVEVDVCAtIDE7IGkrKykgeworCQkJaWYgKGkgPiAwICYmIChydFtpIC0gMV0uX3R5cGUgIT0gcnRbaV0uX3R5cGUpKSB7CisJCQkJdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQl0eXBlID0gcnRbMF0uX3R5cGU7CisJCQl9CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IFBsdWcgdHlwZSBmb3VuZCBpbiBBTkMgZGV0ZWN0aW9uIDolZCIsCisJCQlfX2Z1bmNfXywgdHlwZSk7CisKKwkJaWYgKHR5cGUgIT0gUExVR19UWVBFX0hFQURTRVQpCisJCQlhbmNfbWljX2ZvdW5kID0gZmFsc2U7CisJCWlmIChhbmNfbWljX2ZvdW5kIHx8ICh0eXBlID09IFBMVUdfVFlQRV9IRUFEUEhPTkUgJiYKKwkJICAgIG1iaGMtPm1iaGNfY2ZnLT5od19qYWNrX3R5cGUgPT0gRklWRV9QT0xFX0pBQ0spIHx8CisJCSAgICAodHlwZSA9PSBQTFVHX1RZUEVfSElHSF9IUEggJiYKKwkJICAgIG1iaGMtPm1iaGNfY2ZnLT5od19qYWNrX3R5cGUgPT0gU0lYX1BPTEVfSkFDSykpCisJCQlicmVhazsKKwl9CisKKwl3Y2Q5eHh4X21iaGNfY3RybF9jbGtfYmFuZGdhcChtYmhjLCBmYWxzZSk7CisJaWYgKGNzX2VuYWJsZSkgeworCQl3Y2Q5eHh4X3R1cm5fb25vZmZfY3VycmVudF9zb3VyY2UobWJoYywKKwkJCQkJCSAgJm1iaGMtPm1iaGNfYW5jX2JpYXNfcmVncywKKwkJCQkJCSAgZmFsc2UsIGZhbHNlKTsKKwl9IGVsc2UgeworCQlpZiAobWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzID09IE1CSENfTUlDQklBUzMpIHsKKwkJCWlmIChtYmhjLT5taWNiaWFzX2VuYWJsZV9jYikKKwkJCQltYmhjLT5taWNiaWFzX2VuYWJsZV9jYihtYmhjLT5jb2RlYywgZmFsc2UsCisJCQkJCQltYmhjLT5tYmhjX2NmZy0+YW5jX21pY2JpYXMpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBvdmVycmlkZSAqLworCQkJaWYgKCFvdmVycmlkZV9lbikKKwkJCQl3Y2Q5eHh4X3R1cm5fb25vZmZfb3ZlcnJpZGUobWJoYywgZmFsc2UpOworCQl9CisJfQorCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gYW5jX21pY19mb3VuZDsKK30KKworLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfZmluZF9wbHVnX2FuZF9yZXBvcnQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkJIGVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCit7CisJYm9vbCBhbmNfbWljX2ZvdW5kID0gZmFsc2U7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyIGN1cnJlbnRfcGx1ZyglZCkgbmV3X3BsdWcoJWQpXG4iLAorCQkgX19mdW5jX18sIG1iaGMtPmN1cnJlbnRfcGx1ZywgcGx1Z190eXBlKTsKKworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCWlmIChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0hFQURQSE9ORSAmJgorCSAgICBtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX05PTkUpIHsKKwkJLyoKKwkJICogTm90aGluZyB3YXMgcmVwb3J0ZWQgcHJldmlvdXNseQorCQkgKiByZXBvcnQgYSBoZWFkcGhvbmUgb3IgdW5zdXBwb3J0ZWQKKwkJICovCisJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwkJd2NkOXh4eF9jbGVhbnVwX2hzX3BvbGxpbmcobWJoYyk7CisJfSBlbHNlIGlmIChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0dORF9NSUNfU1dBUCkgeworCQlpZiAoIW1iaGMtPm1iaGNfY2ZnLT5kZXRlY3RfZXh0bl9jYWJsZSkgeworCQkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSEVBRFNFVCkKKwkJCQl3Y2Q5eHh4X3JlcG9ydF9wbHVnKG1iaGMsIDAsCisJCQkJCQkJIFNORF9KQUNLX0hFQURTRVQpOworCQkJZWxzZSBpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEUEhPTkUpCisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLAorCQkJCQkJCSBTTkRfSkFDS19IRUFEUEhPTkUpOworCQl9CisJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfVU5TVVBQT1JURUQpOworCQl3Y2Q5eHh4X2NsZWFudXBfaHNfcG9sbGluZyhtYmhjKTsKKwl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFNFVCkgeworCisJCWlmIChtYmhjLT5tYmhjX2NmZy0+ZW5hYmxlX2FuY19taWNfZGV0ZWN0KSB7CisJCQkvKgorCQkJICogRG8gbm90IHJlcG9ydCBIZWFkc2V0LCBiZWNhdXNlIGF0IHRoaXMgcG9pbnQKKwkJCSAqIGl0IGNvdWxkIGJlIGEgQU5DIGhlYWRwaG9uZSBoYXZpbmcgdHdvIG1pY3MuCisJCQkgKiBTbywgcHJvY2VlZCBmdXJ0aGVyIHRvIGRldGVjdCBpZiB0aGVyZSBpcyBhCisJCQkgKiBzZWNvbmQgbWljLgorCQkJICovCisJCQltYmhjLT5zY2FsaW5nX211eF9pbiA9IDB4MDg7CisJCQlhbmNfbWljX2ZvdW5kID0gd2NkOXh4eF9kZXRlY3RfYW5jX3BsdWdfdHlwZShtYmhjKTsKKwkJfQorCisJCWlmIChhbmNfbWljX2ZvdW5kKSB7CisJCQkvKiBSZXBvcnQgQU5DIGhlYWRwaG9uZSAqLworCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLCBTTkRfSkFDS19BTkNfSEVBRFBIT05FKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiBIZWFkcGhvbmUgd2FzIHJlcG9ydGVkIHByZXZpb3VzbHksIHRoaXMgd2lsbAorCQkJICogb25seSByZXBvcnQgdGhlIG1pYyBsaW5lCisJCQkgKi8KKwkJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfSEVBRFNFVCk7CisJCX0KKwkJLyogQnV0dG9uIGRldGVjdGlvbiByZXF1aXJlZCBSQyBvc2NpbGxhdG9yICovCisJCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIHRydWUpOworCQkvKgorCQkgKiBzbGVlcCBzbyB0aGF0IGF1ZGlvIHBhdGggY29tcGxldGVseSB0ZWFycyBkb3duCisJCSAqIGJlZm9yZSByZXBvcnQgcGx1ZyBpbnNlcnRpb24gdG8gdGhlIHVzZXIgc3BhY2UKKwkJICovCisJCW1zbGVlcCgxMDApOworCisJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKwl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSElHSF9IUEgpIHsKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kZXRlY3RfZXh0bl9jYWJsZSkgeworCQkJLyogSGlnaCBpbXBlZGFuY2UgZGV2aWNlIGZvdW5kLiBSZXBvcnQgYXMgTElORU9VVCovCisJCQlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9OT05FKQorCQkJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfTElORU9VVCk7CisJCQl3Y2Q5eHh4X2NsZWFudXBfaHNfcG9sbGluZyhtYmhjKTsKKwkJCXByX2RlYnVnKCIlczogc2V0dXAgbWljIHRyaWdnZXIgZm9yIGZ1cnRoZXIgZGV0ZWN0aW9uXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQltYmhjLT5scGlfZW5hYmxlZCA9IHRydWU7CisJCQkvKgorCQkJICogRG8gbm90IGVuYWJsZSBIUEhMIHRyaWdnZXIuIElmIHBsYXliYWNrIGlzIGFjdGl2ZSwKKwkJCSAqIGl0IG1pZ2h0IGxlYWQgdG8gY29udGludW91cyBmYWxzZSBIUEhMIHRyaWdnZXJzCisJCQkgKi8KKwkJCXdjZDl4eHhfZW5hYmxlX2hzX2RldGVjdChtYmhjLCAxLCBNQkhDX1VTRV9NQl9UUklHR0VSLAorCQkJCQkJIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX05PTkUpCisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLAorCQkJCQkJCSBTTkRfSkFDS19IRUFEUEhPTkUpOworCQkJd2NkOXh4eF9jbGVhbnVwX2hzX3BvbGxpbmcobWJoYyk7CisJCQlwcl9kZWJ1Zygic2V0dXAgbWljIHRyaWdnZXIgZm9yIGZ1cnRoZXIgZGV0ZWN0aW9uXG4iKTsKKwkJCW1iaGMtPmxwaV9lbmFibGVkID0gdHJ1ZTsKKwkJCXdjZDl4eHhfZW5hYmxlX2hzX2RldGVjdChtYmhjLCAxLCBNQkhDX1VTRV9NQl9UUklHR0VSIHwKKwkJCQkJCQkgIE1CSENfVVNFX0hQSExfVFJJR0dFUiwKKwkJCQkJCSBmYWxzZSk7CisJCX0KKwl9IGVsc2UgeworCQlXQVJOKDEsICJVbmV4cGVjdGVkIGN1cnJlbnQgcGx1Z190eXBlICVkLCBwbHVnX3R5cGUgJWRcbiIsCisJCSAgICAgbWJoYy0+Y3VycmVudF9wbHVnLCBwbHVnX3R5cGUpOworCX0KKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X21iaGNfZGVjaWRlX3N3Y2hfcGx1ZyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCWVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGU7CisJYm9vbCBjdXJyZW50X3NvdXJjZV9lbmFibGU7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlXQ0Q5WFhYX0JDTF9BU1NFUlRfTE9DS0VEKG1iaGMtPnJlc21ncik7CisKKwljdXJyZW50X3NvdXJjZV9lbmFibGUgPSAoKChtYmhjLT5tYmhjX2NmZy0+Y3NfZW5hYmxlX2ZsYWdzICYKKwkJICAgICAgKDEgPDwgTUJIQ19DU19FTkFCTEVfSU5TRVJUSU9OKSkgIT0gMCkgJiYKKwkJICAgICAoIShzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsCisJCQkJICAgICBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnKSAmIDB4ODApKSk7CisKKwltYmhjLT5zY2FsaW5nX211eF9pbiA9IDB4MDQ7CisKKwlpZiAoY3VycmVudF9zb3VyY2VfZW5hYmxlKSB7CisJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIHRydWUsIGZhbHNlKTsKKwkJcGx1Z190eXBlID0gd2NkOXh4eF9jb2RlY19jc19nZXRfcGx1Z190eXBlKG1iaGMsIGZhbHNlKTsKKwkJLyoKKwkJICogRm9yIG90aGVyIHBsdWcgdHlwZXMsIHRoZSBjdXJyZW50IHNvdXJjZSBkaXNhYmxlCisJCSAqIHdpbGwgYmUgZG9uZSBmcm9tIHdjZDl4eHhfY29ycmVjdF9zd2NoX3BsdWcKKwkJICovCisJCWlmIChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0hFQURTRVQpCisJCQl3Y2Q5eHh4X3R1cm5fb25vZmZfY3VycmVudF9zb3VyY2UobWJoYywKKwkJCQkJCSZtYmhjLT5tYmhjX2JpYXNfcmVncywKKwkJCQkJCWZhbHNlLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJd2NkOXh4eF90dXJuX29ub2ZmX292ZXJyaWRlKG1iaGMsIHRydWUpOworCQlwbHVnX3R5cGUgPSB3Y2Q5eHh4X2NvZGVjX2dldF9wbHVnX3R5cGUobWJoYywgdHJ1ZSk7CisJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CisJfQorCisJaWYgKHdjZDl4eHhfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKKwkJaWYgKGN1cnJlbnRfc291cmNlX2VuYWJsZSAmJiBtYmhjLT5pc19jc19lbmFibGVkKSB7CisJCQl3Y2Q5eHh4X3R1cm5fb25vZmZfY3VycmVudF9zb3VyY2UobWJoYywKKwkJCQkJJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQlmYWxzZSwgZmFsc2UpOworCQl9CisJCXByX2RlYnVnKCIlczogU3dpdGNoIGxldmVsIGlzIGxvdyB3aGVuIGRldGVybWluaW5nIHBsdWdcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSU5WQUxJRCB8fAorCSAgICBwbHVnX3R5cGUgPT0gUExVR19UWVBFX0dORF9NSUNfU1dBUCkgeworCQl3Y2Q5eHh4X2NsZWFudXBfaHNfcG9sbGluZyhtYmhjKTsKKwkJd2NkOXh4eF9zY2hlZHVsZV9oc19kZXRlY3RfcGx1ZyhtYmhjLAorCQkJCQkJJm1iaGMtPmNvcnJlY3RfcGx1Z19zd2NoKTsKKwl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwkJd2NkOXh4eF9jbGVhbnVwX2hzX3BvbGxpbmcobWJoYyk7CisJCXdjZDl4eHhfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcobWJoYywKKwkJCQkJCSZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCk7CisJfSBlbHNlIGlmIChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0hJR0hfSFBIKSB7CisJCXdjZDl4eHhfY2xlYW51cF9oc19wb2xsaW5nKG1iaGMpOworCQl3Y2Q5eHh4X3NjaGVkdWxlX2hzX2RldGVjdF9wbHVnKG1iaGMsCisJCQkJCQkmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogVmFsaWQgcGx1ZyBmb3VuZCwgZGV0ZXJtaW5lIHBsdWcgdHlwZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGx1Z190eXBlKTsKKwkJd2NkOXh4eF9maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOworCX0KKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X21iaGNfZGV0ZWN0X3BsdWdfdHlwZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlXQ0Q5WFhYX0JDTF9BU1NFUlRfTE9DS0VEKG1iaGMtPnJlc21ncik7CisKKwlpZiAod2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkKKwkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggbGV2ZWwgbG93IHdoZW4gZGV0ZXJtaW5pbmcgcGx1Z1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJZWxzZQorCQl3Y2Q5eHh4X21iaGNfZGVjaWRlX3N3Y2hfcGx1ZyhtYmhjKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCBvbmx5IGZyb20gaW50ZXJydXB0IHdoaWNoIGlzIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfaHNfaW5zZXJ0X2lycV9zd2NoKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkJICAgICAgIGJvb2wgaXNfcmVtb3ZhbCkKK3sKKwlpZiAoIWlzX3JlbW92YWwpIHsKKwkJcHJfZGVidWcoIiVzOiBNSUMgdHJpZ2dlciBpbnNlcnRpb24gaW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogTWFrZSBzdXJlIG1lbW9yeSByZWFkIGlzIGNvbXBsZXRlZCBiZWZvcmUgcmVhZGluZworCQkgKiBscGlfZW5hYmxlZC4KKwkJICovCisJCXJtYigpOworCQlpZiAobWJoYy0+bHBpX2VuYWJsZWQpCisJCQltc2xlZXAoMTAwKTsKKworCQkvKiBNYWtlIHN1cmUgbWVtb3J5IHJlYWQgaXMgY29tcGxldGVkIGJlZm9yZSByZWFkaW5nCisJCSAqIGxwaV9lbmFibGVkLgorCQkgKi8KKwkJcm1iKCk7CisJCWlmICghbWJoYy0+bHBpX2VuYWJsZWQpIHsKKwkJCXByX2RlYnVnKCIlczogbHBpIGlzIGRpc2FibGVkXG4iLCBfX2Z1bmNfXyk7CisJCX0gZWxzZSBpZiAoIXdjZDl4eHhfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKKwkJCXByX2RlYnVnKCIlczogVmFsaWQgaW5zZXJ0aW9uLCBkZXRlY3QgcGx1ZyB0eXBlXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQl3Y2Q5eHh4X21iaGNfZGVjaWRlX3N3Y2hfcGx1ZyhtYmhjKTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogSW52YWxpZCBpbnNlcnRpb24gc3RvcCBwbHVnIGRldGVjdGlvblxuIiwKKwkJCQkgX19mdW5jX18pOworCQl9CisJfSBlbHNlIGlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKKwkJcHJfZGVidWcoIiVzOiBSZW1vdmFsXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghd2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQkJLyoKKwkJCSAqIFN3aXRjaCBpbmRpY2F0ZXMsIHNvbWV0aGluZyBpcyBzdGlsbCBpbnNlcnRlZC4KKwkJCSAqIFRoaXMgY291bGQgYmUgZXh0ZW5zaW9uIGNhYmxlIGkuZS4gaGVhZHNldCBpcworCQkJICogcmVtb3ZlZCBmcm9tIGV4dGVuc2lvbiBjYWJsZS4KKwkJCSAqLworCQkJLyogY2FuY2VsIGRldGVjdCBwbHVnICovCisJCQl3Y2Q5eHh4X2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLAorCQkJCQkJICAgICAgJm1iaGMtPmNvcnJlY3RfcGx1Z19zd2NoKTsKKwkJCXdjZDl4eHhfbWJoY19kZWNpZGVfc3djaF9wbHVnKG1iaGMpOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogU3dpdGNoIElSUSB1c2VkLCBpbnZhbGlkIE1CSEMgUmVtb3ZhbFxuIiwgX19mdW5jX18pOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfdmFsaWRfbWljX3ZvbHRhZ2Uoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgczMyIG1pY19tdiwKKwkJCQkgYm9vbCBjc19lbmFibGUpCit7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnICpwbHVnX3R5cGUgPQorCSAgICBXQ0Q5WFhYX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uKTsKKwljb25zdCBzMTYgdl9oc19tYXggPSB3Y2Q5eHh4X2dldF9jdXJyZW50X3ZfaHNfbWF4KG1iaGMpOworCisJaWYgKGNzX2VuYWJsZSkKKwkJcmV0dXJuICgobWljX212ID4gV0NEOVhYWF9WX0NTX05PX01JQykgJiYKKwkJCSAobWljX212IDwgV0NEOVhYWF9WX0NTX0hTX01BWCkpID8gdHJ1ZSA6IGZhbHNlOworCWVsc2UKKwkJcmV0dXJuICghKG1pY19tdiA+IFdDRDlYWFhfTUVBU19JTlZBTERfUkFOR0VfTE9XX01WICYmCisJCQkgIG1pY19tdiA8IFdDRDlYWFhfTUVBU19JTlZBTERfUkFOR0VfSElHSF9NVikgJiYKKwkJCShtaWNfbXYgPiBwbHVnX3R5cGUtPnZfbm9fbWljKSAmJgorCQkJKG1pY19tdiA8IHZfaHNfbWF4KSkgPyB0cnVlIDogZmFsc2U7Cit9CisKKy8qCisgKiBjYWxsZWQgdW5kZXIgY29kZWNfcmVzb3VyY2VfbG9jayBhY3F1aXNpdGlvbgorICogcmV0dXJucyB0cnVlIGlmIG1pYyB2b2x0YWdlIHJhbmdlIGlzIGJhY2sgdG8gbm9ybWFsIGluc2VydGlvbgorICogcmV0dXJucyBmYWxzZSBlaXRoZXIgaWYgdGltZWRvdXQgb3IgcmVtb3ZlZAorICovCitzdGF0aWMgYm9vbCB3Y2Q5eHh4X2hzX3JlbW92ZV9zZXR0bGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlpbnQgaTsKKwlib29sIHRpbWVkb3V0LCBzZXR0bGVkID0gZmFsc2U7CisJczMyIG1pY19tdltOVU1fRENFX1BMVUdfREVURUNUXTsKKwlzaG9ydCBtYl92W05VTV9EQ0VfUExVR19ERVRFQ1RdOworCXVuc2lnbmVkIGxvbmcgcmV0cnkgPSAwLCB0aW1lb3V0OworCWJvb2wgY3NfZW5hYmxlOworCisJY3NfZW5hYmxlID0gKCgobWJoYy0+bWJoY19jZmctPmNzX2VuYWJsZV9mbGFncyAmCisJCSAgICAgICgxIDw8IE1CSENfQ1NfRU5BQkxFX1JFTU9WQUwpKSAhPSAwKSAmJgorCQkgICAgICghKHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywKKwkJCQkgICAgIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcpICYgMHg4MCkpKTsKKwlpZiAoY3NfZW5hYmxlKQorCQl3Y2Q5eHh4X3R1cm5fb25vZmZfY3VycmVudF9zb3VyY2UobWJoYywgJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQkJICB0cnVlLCBmYWxzZSk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSFNfREVURUNUX1BMVUdfVElNRV9NUyk7CisJd2hpbGUgKCEodGltZWRvdXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSkgeworCQlyZXRyeSsrOworCQlpZiAod2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggaW5kaWNhdGVzIHJlbW92YWxcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldHJ5ID4gMSkKKwkJCW1zbGVlcCgyNTApOworCQllbHNlCisJCQltc2xlZXAoNTApOworCisJCWlmICh3Y2Q5eHh4X3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBpbmRpY2F0ZXMgcmVtb3ZhbFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY3NfZW5hYmxlKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RDRV9QTFVHX0RFVEVDVDsgaSsrKSB7CisJCQkJbWJfdltpXSA9IF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDEsCisJCQkJCQkJCSAgdHJ1ZSwgdHJ1ZSk7CisJCQkJbWljX212W2ldID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLAorCQkJCQkJCQkgICAgICB0cnVlLAorCQkJCQkJCQkgICAgICBtYl92W2ldLAorCQkJCQkJbWJoYy0+bWJoY19kYXRhLmRjZV9uc2NfY3NfeiwKKwkJCQkJCSh1MzIpVkRESU9fTUlDQklBU19NVik7CisJCQkJcHJfZGVidWcoIiVzIDogRENFIHJ1biAlbHUsIG1pY19tdiA9ICVkKCV4KVxuIiwKKwkJCQkJIF9fZnVuY19fLCByZXRyeSwgbWljX212W2ldLCBtYl92W2ldKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fRENFX1BMVUdfREVURUNUOyBpKyspIHsKKwkJCQltYl92W2ldID0gd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDEsCisJCQkJCQkJCXRydWUpOworCQkJCW1pY19tdltpXSA9IHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsCisJCQkJCQkJCW1iX3ZbaV0pOworCQkJCXByX2RlYnVnKCIlcyA6IERDRSBydW4gJWx1LCBtaWNfbXYgPSAlZCgleClcbiIsCisJCQkJCSBfX2Z1bmNfXywgcmV0cnksIG1pY19tdltpXSwKKwkJCQkJCQkJbWJfdltpXSk7CisJCQl9CisJCX0KKworCQlpZiAod2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQkJcHJfZGVidWcoIiVzOiBTd2l0Y24gaW5kaWNhdGVzIHJlbW92YWxcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfTk9ORSkgeworCQkJcHJfZGVidWcoIiVzIDogaGVhZHNldC9oZWFkcGhvbmUgaXMgcmVtb3ZlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RDRV9QTFVHX0RFVEVDVDsgaSsrKQorCQkJaWYgKCFpc192YWxpZF9taWNfdm9sdGFnZShtYmhjLCBtaWNfbXZbaV0sIGNzX2VuYWJsZSkpCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gTlVNX0RDRV9QTFVHX0RFVEVDVCkgeworCQkJcHJfZGVidWcoIiVzOiBNSUMgdm9sdGFnZSBzZXR0bGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlzZXR0bGVkID0gdHJ1ZTsKKwkJCW1zbGVlcCgyMDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY3NfZW5hYmxlKQorCQl3Y2Q5eHh4X3R1cm5fb25vZmZfY3VycmVudF9zb3VyY2UobWJoYywgJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQkJICBmYWxzZSwgZmFsc2UpOworCisJaWYgKHRpbWVkb3V0KQorCQlwcl9kZWJ1ZygiJXM6IE1pY3JvcGhvbmUgZGlkIG5vdCBzZXR0bGUgaW4gJWQgc2Vjb25kc1xuIiwKKwkJCSBfX2Z1bmNfXywgSFNfREVURUNUX1BMVUdfVElNRV9NUyk7CisJcmV0dXJuIHNldHRsZWQ7Cit9CisKKy8qIGNhbGxlZCBvbmx5IGZyb20gaW50ZXJydXB0IHdoaWNoIGlzIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfaHNfcmVtb3ZlX2lycV9zd2NoKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCWlmICh3Y2Q5eHh4X2hzX3JlbW92ZV9zZXR0bGUobWJoYykpCisJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCBvbmx5IGZyb20gaW50ZXJydXB0IHdoaWNoIGlzIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfaHNfcmVtb3ZlX2lycV9ub3N3Y2goc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzMTYgZGNlLCBkY2V6OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlib29sIHJlbW92ZWQgPSB0cnVlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfZ2VuZXJhbF9jZmcgKmdlbmVyaWMgPQorCQlXQ0Q5WFhYX01CSENfQ0FMX0dFTkVSQUxfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisJYm9vbCBjc19lbmFibGU7CisJczE2IGN1cl92X2luc19oOworCXUzMiBtYl9tdjsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAobWJoYy0+Y3VycmVudF9wbHVnICE9IFBMVUdfVFlQRV9IRUFEU0VUICYmCisJCW1iaGMtPmN1cnJlbnRfcGx1ZyAhPSBQTFVHX1RZUEVfQU5DX0hFQURQSE9ORSkgeworCQlwcl9kZWJ1ZygiJXMoKTogSGVhZHNldCBpcyBub3QgaW5zZXJ0ZWQsIGlnbm9yZSByZW1vdmFsXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsCisJCQkJMHgwOCwgMHgwOCk7CisJCXJldHVybjsKKwl9CisKKwl1c2xlZXBfcmFuZ2UoZ2VuZXJpYy0+dF9zaHV0ZG93bl9wbHVnX3JlbSwKKwkJICAgICBnZW5lcmljLT50X3NodXRkb3duX3BsdWdfcmVtICsKKwkJICAgICBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCisJLyogSWYgbWljYmlhcyBpcyBlbmFibGVkLCBkb24ndCBlbmFibGUgY3VycmVudCBzb3VyY2UgKi8KKwljc19lbmFibGUgPSAoKChtYmhjLT5tYmhjX2NmZy0+Y3NfZW5hYmxlX2ZsYWdzICYKKwkJICAgICAgKDEgPDwgTUJIQ19DU19FTkFCTEVfUkVNT1ZBTCkpICE9IDApICYmCisJCSAgICAgKCEoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCSAgICAgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZykgJiAweDgwKSkpOworCWlmIChjc19lbmFibGUpCisJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIHRydWUsIGZhbHNlKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhGQUtFX1JFTU9WQUxfTUlOX1BFUklPRF9NUyk7CisJZG8geworCQlpZiAoY3NfZW5hYmxlKSB7CisJCQlkY2UgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCAgdHJ1ZSwgdHJ1ZSk7CisJCQlkY2V6ID0gbWJoYy0+bWJoY19kYXRhLmRjZV9uc2NfY3NfejsKKwkJCW1iX212ID0gVkRESU9fTUlDQklBU19NVjsKKwkJfSBlbHNlIHsKKwkJCWRjZSA9IHdjZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCAgdHJ1ZSk7CisJCQlkY2V6ID0gbWJoYy0+bWJoY19kYXRhLmRjZV96OworCQkJbWJfbXYgPSBtYmhjLT5tYmhjX2RhdGEubWljYl9tdjsKKwkJfQorCisJCXByX2RlYnVnKCIlczogRENFIDB4JXgsJWRcbiIsIF9fZnVuY19fLCBkY2UsCisJCQkgIF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgdHJ1ZSwgZGNlLAorCQkJCQkJICAgIGRjZXosIG1iX212KSk7CisKKwkJY3VyX3ZfaW5zX2ggPSBjc19lbmFibGUgPyAoczE2KSBtYmhjLT5tYmhjX2RhdGEudl9jc19pbnNfaCA6CisJCQkJCSAgKHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLAorCQkJCQkgICBXQ0Q5WFhYX0NVUlJFTlRfVl9JTlNfSCkpOworCisJCWlmIChkY2UgPCBjdXJfdl9pbnNfaCkgeworCQkJcmVtb3ZlZCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSk7CisJcHJfZGVidWcoIiVzOiBoZWFkc2V0ICVzYWN0dWFsbHkgcmVtb3ZlZFxuIiwgX19mdW5jX18sCisJCSAgcmVtb3ZlZCA/ICIiIDogIm5vdCAiKTsKKworCWlmIChjc19lbmFibGUpCisJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIGZhbHNlLCBmYWxzZSk7CisKKwlpZiAocmVtb3ZlZCkgeworCQlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlKSB7CisJCQlpZiAoIXdjZDl4eHhfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKKwkJCQkvKgorCQkJCSAqIGV4dGVuc2lvbiBjYWJsZSBpcyBzdGlsbCBwbHVnZ2VkIGluCisJCQkJICogcmVwb3J0IGl0IGFzIExJTkVPVVQgZGV2aWNlCisJCQkJICovCisJCQkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgPT0gU05EX0pBQ0tfSEVBRFNFVCkKKwkJCQkJd2NkOXh4eF9tYmhjX2N0cmxfY2xrX2JhbmRnYXAobWJoYywKKwkJCQkJCQlmYWxzZSk7CisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLCBTTkRfSkFDS19MSU5FT1VUKTsKKwkJCQl3Y2Q5eHh4X2NsZWFudXBfaHNfcG9sbGluZyhtYmhjKTsKKwkJCQl3Y2Q5eHh4X2VuYWJsZV9oc19kZXRlY3QobWJoYywgMSwKKwkJCQkJCQkgTUJIQ19VU0VfTUJfVFJJR0dFUiwKKwkJCQkJCQkgZmFsc2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ2FuY2VsIHBvc3NpYmx5IHJ1bm5pbmcgaHNfZGV0ZWN0X3dvcmsgKi8KKwkJCXdjZDl4eHhfY2FuY2VsX2hzX2RldGVjdF9wbHVnKG1iaGMsCisJCQkJCQkgICAgJm1iaGMtPmNvcnJlY3RfcGx1Z19ub3N3Y2gpOworCQkJLyoKKwkJCSAqIElmIHRoaXMgcmVtb3ZhbCBpcyBub3QgZmFsc2UsIGZpcnN0IGNoZWNrIHRoZSBtaWNiaWFzCisJCQkgKiBzd2l0Y2ggc3RhdHVzIGFuZCBzd2l0Y2ggaXQgdG8gTERPSCBpZiBpdCBpcyBhbHJlYWR5CisJCQkgKiBzd2l0Y2hlZCB0byBWRERJTy4KKwkJCSAqLworCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAwKTsKKworCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19IRUFEU0VUKTsKKwkJCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIGZhbHNlKTsKKwkJCXdjZDl4eHhfY2xlYW51cF9oc19wb2xsaW5nKG1iaGMpOworCQkJd2NkOXh4eF9lbmFibGVfaHNfZGV0ZWN0KG1iaGMsIDEsIE1CSENfVVNFX01CX1RSSUdHRVIgfAorCQkJCQkJCSAgTUJIQ19VU0VfSFBITF9UUklHR0VSLAorCQkJCQkJIHRydWUpOworCQl9CisJfSBlbHNlIHsKKwkJd2NkOXh4eF9zdGFydF9oc19wb2xsaW5nKG1iaGMpOworCX0KKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qIGNhbGxlZCBvbmx5IGZyb20gaW50ZXJydXB0IHdoaWNoIGlzIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KK3N0YXRpYyB2b2lkIHdjZDl4eHhfaHNfaW5zZXJ0X2lycV9leHRuKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCQkJICAgICAgIGJvb2wgaXNfbWJfdHJpZ2dlcikKK3sKKwkvKiBDYW5jZWwgcG9zc2libHkgcnVubmluZyBoc19kZXRlY3Rfd29yayAqLworCXdjZDl4eHhfY2FuY2VsX2hzX2RldGVjdF9wbHVnKG1iaGMsICZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCk7CisKKwlpZiAoaXNfbWJfdHJpZ2dlcikgeworCQlwcl9kZWJ1ZygiJXM6IFdhaXRpbmcgZm9yIEhlYWRwaG9uZSBsZWZ0IHRyaWdnZXJcbiIsIF9fZnVuY19fKTsKKwkJd2NkOXh4eF9lbmFibGVfaHNfZGV0ZWN0KG1iaGMsIDEsIE1CSENfVVNFX0hQSExfVFJJR0dFUiwgZmFsc2UpOworCX0gZWxzZSAgeworCQlwcl9kZWJ1ZygiJXM6IEhQSEwgdHJpZ2dlciByZWNlaXZlZCwgZGV0ZWN0aW5nIHBsdWcgdHlwZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXdjZDl4eHhfbWJoY19kZXRlY3RfcGx1Z190eXBlKG1iaGMpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHdjZDl4eHhfaHNfcmVtb3ZlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMgPSBkYXRhOworCisJcHJfZGVidWcoIiVzOiBlbnRlciwgcmVtb3ZhbCBpbnRlcnJ1cHRcbiIsIF9fZnVuY19fKTsKKwlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7CisJLyoKKwkgKiBXaGlsZSB3ZSBkb24ndCBrbm93IHdoZXRoZXIgTUlDIGlzIHRoZXJlIG9yIG5vdCwgbGV0IHRoZSByZXNtZ3Iga25vdworCSAqIHNvIG1pY2JpYXMgY2FuIGJlIGRpc2FibGVkIHRlbXBvcmFyaWx5CisJICovCisJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSEVBRFNFVCkgeworCQl3Y2Q5eHh4X3Jlc21ncl9jb25kX3VwZGF0ZV9jb25kKG1iaGMtPnJlc21nciwKKwkJCQkJCVdDRDlYWFhfQ09ORF9IUEhfTUlDLCBmYWxzZSk7CisJCXdjZDl4eHhfcmVzbWdyX2NvbmRfdXBkYXRlX2NvbmQobWJoYy0+cmVzbWdyLAorCQkJCQkJV0NEOVhYWF9DT05EX0hQSCwgZmFsc2UpOworCX0gZWxzZSBpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEUEhPTkUpIHsKKwkJd2NkOXh4eF9yZXNtZ3JfY29uZF91cGRhdGVfY29uZChtYmhjLT5yZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0NPTkRfSFBILCBmYWxzZSk7CisJfQorCisJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kZXRlY3RfZXh0bl9jYWJsZSAmJgorCSAgICAhd2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkKKwkJd2NkOXh4eF9oc19yZW1vdmVfaXJxX25vc3djaChtYmhjKTsKKwllbHNlCisJCXdjZDl4eHhfaHNfcmVtb3ZlX2lycV9zd2NoKG1iaGMpOworCisJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSEVBRFNFVCkgeworCQl3Y2Q5eHh4X3Jlc21ncl9jb25kX3VwZGF0ZV9jb25kKG1iaGMtPnJlc21nciwKKwkJCQkJCVdDRDlYWFhfQ09ORF9IUEgsIHRydWUpOworCQl3Y2Q5eHh4X3Jlc21ncl9jb25kX3VwZGF0ZV9jb25kKG1iaGMtPnJlc21nciwKKwkJCQkJCVdDRDlYWFhfQ09ORF9IUEhfTUlDLCB0cnVlKTsKKwl9IGVsc2UgaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCXdjZDl4eHhfcmVzbWdyX2NvbmRfdXBkYXRlX2NvbmQobWJoYy0+cmVzbWdyLAorCQkJCQkJV0NEOVhYWF9DT05EX0hQSCwgdHJ1ZSk7CisJfQorCVdDRDlYWFhfQkNMX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkOXh4eF9oc19pbnNlcnRfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJYm9vbCBpc19tYl90cmlnZ2VyLCBpc19yZW1vdmFsOworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMgPSBkYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwl3Y2Q5eHh4X2Rpc2FibGVfaXJxKG1iaGMtPnJlc21nci0+Y29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5pbnNlcnRpb24pOworCisJaXNfbWJfdHJpZ2dlciA9ICEhKHNuZF9zb2NfcmVhZChjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcpICYKKwkJCSAgIDB4MTApOworCWlzX3JlbW92YWwgPSAhIShzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19JTlRfQ1RMKSAmIDB4MDIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19JTlRfQ1RMLCAweDAzLCAweDAwKTsKKworCS8qIFR1cm4gb2ZmIGJvdGggSFBIIGFuZCBNSUMgbGluZSBzY2htaXR0IHRyaWdnZXJzICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MubWJoY19yZWcsIDB4OTAsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgxMywgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywgMHgwMSwgMHgwMCk7CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlICYmCisJICAgIG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSElHSF9IUEgpCisJCXdjZDl4eHhfaHNfaW5zZXJ0X2lycV9leHRuKG1iaGMsIGlzX21iX3RyaWdnZXIpOworCWVsc2UKKwkJd2NkOXh4eF9oc19pbnNlcnRfaXJxX3N3Y2gobWJoYywgaXNfcmVtb3ZhbCk7CisKKwlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfYnRuX2xwcmVzc19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7CisJc2hvcnQgYmlhc192YWx1ZTsKKwlpbnQgZGNlX212LCBzdGFfbXY7CisJc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYzsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCW1iaGMgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2Q5eHh4X21iaGMsIG1iaGNfYnRuX2R3b3JrKTsKKworCWJpYXNfdmFsdWUgPSB3Y2Q5eHh4X3JlYWRfc3RhX3Jlc3VsdChtYmhjLT5jb2RlYyk7CisJc3RhX212ID0gd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgMCwgYmlhc192YWx1ZSk7CisKKwliaWFzX3ZhbHVlID0gd2NkOXh4eF9yZWFkX2RjZV9yZXN1bHQobWJoYy0+Y29kZWMpOworCWRjZV9tdiA9IHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIGJpYXNfdmFsdWUpOworCXByX2RlYnVnKCIlczogU1RBOiAlZCwgRENFOiAlZFxuIiwgX19mdW5jX18sIHN0YV9tdiwgZGNlX212KTsKKworCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIGxvbmcgYnV0dG9uIHByZXNzIGV2ZW50XG4iLCBfX2Z1bmNfXyk7CisJd2NkOXh4eF9qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+YnV0dG9uX2phY2ssIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCwKKwkJCSAgICBtYmhjLT5idXR0b25zX3ByZXNzZWQpOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCXdjZDl4eHhfdW5sb2NrX3NsZWVwKG1iaGMtPnJlc21nci0+Y29yZV9yZXMpOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X21iaGNfaW5zZXJ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzOworCisJZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJbWJoYyA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdjZDl4eHhfbWJoYywgbWJoY19pbnNlcnRfZHdvcmspOworCWNvZGVjID0gbWJoYy0+Y29kZWM7CisJY29yZV9yZXMgPSBtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJLyogVHVybiBvZmYgYm90aCBIUEggYW5kIE1JQyBsaW5lIHNjaG1pdHQgdHJpZ2dlcnMgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5tYmhjX3JlZywgMHg5MCwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfSFBILCAweDEzLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnLCAweDAxLCAweDAwKTsKKwl3Y2Q5eHh4X2Rpc2FibGVfaXJxX3N5bmMoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5pbnNlcnRpb24pOworCXdjZDl4eHhfbWJoY19kZXRlY3RfcGx1Z190eXBlKG1iaGMpOworCXdjZDl4eHhfdW5sb2NrX3NsZWVwKGNvcmVfcmVzKTsKK30KKworc3RhdGljIGJvb2wgd2NkOXh4eF9tYmhjX2Z3X3ZhbGlkYXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXUzMiBjZmdfb2Zmc2V0OworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfaW1wZWRfZGV0ZWN0X2NmZyAqaW1wZWRfY2ZnOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7CisJc3RydWN0IGZpcm13YXJlX2NhbCBmdzsKKworCWZ3LmRhdGEgPSAodm9pZCAqKWRhdGE7CisJZncuc2l6ZSA9IHNpemU7CisKKwlpZiAoZncuc2l6ZSA8IFdDRDlYWFhfTUJIQ19DQUxfTUlOX1NJWkUpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogUHJldmlvdXMgY2hlY2sgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIGVub3VnaCBmdyBkYXRhIHVwCisJICogdG8gbnVtX2J0bgorCSAqLworCWJ0bl9jZmcgPSBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKGZ3LmRhdGEpOworCWNmZ19vZmZzZXQgPSAodTMyKSAoKHZvaWQgKikgYnRuX2NmZyAtICh2b2lkICopIGZ3LmRhdGEpOworCWlmIChmdy5zaXplIDwgKGNmZ19vZmZzZXQgKyBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9TWihidG5fY2ZnKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogUHJldmlvdXMgY2hlY2sgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIGVub3VnaCBmdyBkYXRhIHVwCisJICogdG8gc3RhcnQgb2YgaW1wZWRhbmNlIGRldGVjdGlvbiBjb25maWd1cmF0aW9uCisJICovCisJaW1wZWRfY2ZnID0gV0NEOVhYWF9NQkhDX0NBTF9JTVBFRF9ERVRfUFRSKGZ3LmRhdGEpOworCWNmZ19vZmZzZXQgPSAodTMyKSAoKHZvaWQgKikgaW1wZWRfY2ZnIC0gKHZvaWQgKikgZncuZGF0YSk7CisKKwlpZiAoZncuc2l6ZSA8IChjZmdfb2Zmc2V0ICsgV0NEOVhYWF9NQkhDX0NBTF9JTVBFRF9NSU5fU1opKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoZncuc2l6ZSA8IChjZmdfb2Zmc2V0ICsgV0NEOVhYWF9NQkhDX0NBTF9JTVBFRF9TWihpbXBlZF9jZmcpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1MTYgd2NkOXh4eF9jb2RlY192X3N0YV9kY2Uoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkgICBlbnVtIG1lYXNfdHlwZSBkY2UsIHMxNiB2aW5fbXYsCisJCQkJICAgYm9vbCBjc19lbmFibGUpCit7CisJczE2IGRpZmYsIHplcm87CisJdTMyIG1iX212LCBpbjsKKwl1MTYgdmFsdWU7CisJczE2IGRjZV96OworCisJbWJfbXYgPSBtYmhjLT5tYmhjX2RhdGEubWljYl9tdjsKKwlkY2VfeiA9IG1iaGMtPm1iaGNfZGF0YS5kY2VfejsKKworCWlmIChtYl9tdiA9PSAwKSB7CisJCXByX2VycigiJXM6IE1pYyBCaWFzIHZvbHRhZ2UgaXMgc2V0IHRvIHplcm9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjc19lbmFibGUpIHsKKwkJbWJfbXYgPSBWRERJT19NSUNCSUFTX01WOworCQlkY2VfeiA9IG1iaGMtPm1iaGNfZGF0YS5kY2VfbnNjX2NzX3o7CisJfQorCisJaWYgKGRjZSkgeworCQlkaWZmID0gKG1iaGMtPm1iaGNfZGF0YS5kY2VfbWIpIC0gKGRjZV96KTsKKwkJemVybyA9IChkY2Vfeik7CisJfSBlbHNlIHsKKwkJZGlmZiA9IChtYmhjLT5tYmhjX2RhdGEuc3RhX21iKSAtIChtYmhjLT5tYmhjX2RhdGEuc3RhX3opOworCQl6ZXJvID0gKG1iaGMtPm1iaGNfZGF0YS5zdGFfeik7CisJfQorCWluID0gKHUzMikgZGlmZiAqIHZpbl9tdjsKKworCXZhbHVlID0gKHUxNikgKGluIC8gbWJfbXYpICsgemVybzsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfbWJoY19jYWxjX3RocmVzKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXMxNiBhZGpfdl9oc19tYXg7CisJczE2IGJ0bl9tdiA9IDAsIGJ0bl9tdl9zdGFbTUJIQ19WX0lEWF9OVU1dLCBidG5fbXZfZGNlW01CSENfVl9JRFhfTlVNXTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0OworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlX2NmZyAqcGx1Z190eXBlOworCXUxNiAqYnRuX2hpZ2g7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlidG5fZGV0ID0gV0NEOVhYWF9NQkhDX0NBTF9CVE5fREVUX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCXBsdWdfdHlwZSA9IFdDRDlYWFhfTUJIQ19DQUxfUExVR19UWVBFX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCisJbWJoYy0+bWJoY19kYXRhLnZfaW5zX2h1W01CSENfVl9JRFhfQ0ZJTFRdID0KKwkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgU1RBLCBwbHVnX3R5cGUtPnZfaHNfbWF4LCBmYWxzZSk7CisJbWJoYy0+bWJoY19kYXRhLnZfaW5zX2hbTUJIQ19WX0lEWF9DRklMVF0gPQorCSAgICB3Y2Q5eHh4X2NvZGVjX3Zfc3RhX2RjZShtYmhjLCBEQ0UsIHBsdWdfdHlwZS0+dl9oc19tYXgsIGZhbHNlKTsKKworCW1iaGMtPm1iaGNfZGF0YS52X2ludmFsX2luc19sb3cgPSBGQUtFX0lOU19MT1c7CisJbWJoYy0+bWJoY19kYXRhLnZfaW52YWxfaW5zX2hpZ2ggPSBGQUtFX0lOU19ISUdIOworCisJaWYgKG1iaGMtPm1iaGNfZGF0YS5taWNiX212ICE9IFZERElPX01JQ0JJQVNfTVYpIHsKKwkJYWRqX3ZfaHNfbWF4ID0gc2NhbGVfdl9taWNiX3ZkZGlvKG1iaGMsIHBsdWdfdHlwZS0+dl9oc19tYXgsCisJCQkJCQkgIHRydWUpOworCQltYmhjLT5tYmhjX2RhdGEudl9pbnNfaHVbTUJIQ19WX0lEWF9WRERJT10gPQorCQkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgU1RBLCBhZGpfdl9oc19tYXgsIGZhbHNlKTsKKwkJbWJoYy0+bWJoY19kYXRhLnZfaW5zX2hbTUJIQ19WX0lEWF9WRERJT10gPQorCQkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgRENFLCBhZGpfdl9oc19tYXgsIGZhbHNlKTsKKwkJbWJoYy0+bWJoY19kYXRhLnZfaW52YWxfaW5zX2xvdyA9CisJCSAgICBzY2FsZV92X21pY2JfdmRkaW8obWJoYywgbWJoYy0+bWJoY19kYXRhLnZfaW52YWxfaW5zX2xvdywKKwkJCQkgICAgICAgZmFsc2UpOworCQltYmhjLT5tYmhjX2RhdGEudl9pbnZhbF9pbnNfaGlnaCA9CisJCSAgICBzY2FsZV92X21pY2JfdmRkaW8obWJoYywgbWJoYy0+bWJoY19kYXRhLnZfaW52YWxfaW5zX2hpZ2gsCisJCQkJICAgICAgIGZhbHNlKTsKKwl9CisJbWJoYy0+bWJoY19kYXRhLnZfY3NfaW5zX2ggPSB3Y2Q5eHh4X2NvZGVjX3Zfc3RhX2RjZShtYmhjLCBEQ0UsCisJCQkJCQkJV0NEOVhYWF9WX0NTX0hTX01BWCwKKwkJCQkJCQl0cnVlKTsKKwlwcl9kZWJ1ZygiJXM6IHZfaW5zX2ggZm9yIGN1cnJlbnQgc291cmNlOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJICBtYmhjLT5tYmhjX2RhdGEudl9jc19pbnNfaCk7CisKKwlidG5faGlnaCA9IHdjZDl4eHhfbWJoY19jYWxfYnRuX2RldF9tcChidG5fZGV0LAorCQkJCQkgICAgICAgTUJIQ19CVE5fREVUX1ZfQlROX0hJR0gpOworCWZvciAoaSA9IDA7IGkgPCBidG5fZGV0LT5udW1fYnRuOyBpKyspCisJCWJ0bl9tdiA9IGJ0bl9oaWdoW2ldID4gYnRuX212ID8gYnRuX2hpZ2hbaV0gOiBidG5fbXY7CisKKwlidG5fbXZfc3RhW01CSENfVl9JRFhfQ0ZJTFRdID0gYnRuX212ICsgYnRuX2RldC0+dl9idG5fcHJlc3NfZGVsdGFfc3RhOworCWJ0bl9tdl9kY2VbTUJIQ19WX0lEWF9DRklMVF0gPSBidG5fbXYgKyBidG5fZGV0LT52X2J0bl9wcmVzc19kZWx0YV9jaWM7CisJYnRuX212X3N0YVtNQkhDX1ZfSURYX1ZERElPXSA9CisJICAgIHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBidG5fbXZfc3RhW01CSENfVl9JRFhfQ0ZJTFRdLCB0cnVlKTsKKwlidG5fbXZfZGNlW01CSENfVl9JRFhfVkRESU9dID0KKwkgICAgc2NhbGVfdl9taWNiX3ZkZGlvKG1iaGMsIGJ0bl9tdl9kY2VbTUJIQ19WX0lEWF9DRklMVF0sIHRydWUpOworCisJbWJoYy0+bWJoY19kYXRhLnZfYjFfaHVbTUJIQ19WX0lEWF9DRklMVF0gPQorCSAgICB3Y2Q5eHh4X2NvZGVjX3Zfc3RhX2RjZShtYmhjLCBTVEEsIGJ0bl9tdl9zdGFbTUJIQ19WX0lEWF9DRklMVF0sCisJCQkJICAgIGZhbHNlKTsKKwltYmhjLT5tYmhjX2RhdGEudl9iMV9oW01CSENfVl9JRFhfQ0ZJTFRdID0KKwkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgRENFLCBidG5fbXZfZGNlW01CSENfVl9JRFhfQ0ZJTFRdLAorCQkJCSAgICBmYWxzZSk7CisJbWJoYy0+bWJoY19kYXRhLnZfYjFfaHVbTUJIQ19WX0lEWF9WRERJT10gPQorCSAgICB3Y2Q5eHh4X2NvZGVjX3Zfc3RhX2RjZShtYmhjLCBTVEEsIGJ0bl9tdl9zdGFbTUJIQ19WX0lEWF9WRERJT10sCisJCQkJICAgIGZhbHNlKTsKKwltYmhjLT5tYmhjX2RhdGEudl9iMV9oW01CSENfVl9JRFhfVkRESU9dID0KKwkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgRENFLCBidG5fbXZfZGNlW01CSENfVl9JRFhfVkRESU9dLAorCQkJCSAgICBmYWxzZSk7CisKKwltYmhjLT5tYmhjX2RhdGEudl9icmhbTUJIQ19WX0lEWF9DRklMVF0gPQorCSAgICBtYmhjLT5tYmhjX2RhdGEudl9iMV9oW01CSENfVl9JRFhfQ0ZJTFRdOworCW1iaGMtPm1iaGNfZGF0YS52X2JyaFtNQkhDX1ZfSURYX1ZERElPXSA9CisJICAgIG1iaGMtPm1iaGNfZGF0YS52X2IxX2hbTUJIQ19WX0lEWF9WRERJT107CisKKwltYmhjLT5tYmhjX2RhdGEudl9icmwgPSBCVVRUT05fTUlOOworCisJbWJoYy0+bWJoY19kYXRhLnZfbm9fbWljID0KKwkgICAgd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgU1RBLCBwbHVnX3R5cGUtPnZfbm9fbWljLCBmYWxzZSk7CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X29ub2ZmX2V4dF9tY2xrKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIGJvb2wgb24pCit7CisJLyoKKwkgKiBYWFg6IHtjb2RlY31fbWNsa19lbmFibGUgaG9sZHMgV0NEOVhYWF9CQ0xfTE9DSywKKwkgKiB0aGVyZWZvcmUgd2NkOXh4eF9vbm9mZl9leHRfbWNsayBjYWxsZXIgU0hPVUxETidUIGhvbGQKKwkgKiBXQ0Q5WFhYX0JDTF9MT0NLIHdoZW4gaXQgY2FsbHMgd2NkOXh4eF9vbm9mZl9leHRfbWNsaygpCisJICovCisJaWYgKG1iaGMgJiYgbWJoYy0+bWJoY19jZmcgJiYgbWJoYy0+bWJoY19jZmctPm1jbGtfY2JfZm4pCisJCW1iaGMtPm1iaGNfY2ZnLT5tY2xrX2NiX2ZuKG1iaGMtPmNvZGVjLCBvbiwgZmFsc2UpOworfQorCisvKgorICogTWljIEJpYXMgRW5hYmxlIERlY2lzaW9uCisgKiBSZXR1cm4gdHJ1ZSBpZiBoaWdoX2hwaF9jbnQgaXMgYSBwb3dlciBvZiAyICghPSAyKQorICogb3RoZXJ3aXNlIHJldHVybiBmYWxzZQorICovCitzdGF0aWMgYm9vbCB3Y2Q5eHh4X21iaGNfZW5hYmxlX21iX2RlY2lzaW9uKGludCBoaWdoX2hwaF9jbnQpCit7CisJcmV0dXJuIChoaWdoX2hwaF9jbnQgPiAyKSAmJiAhKGhpZ2hfaHBoX2NudCAmIChoaWdoX2hwaF9jbnQgLSAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3Y2Q5eHh4X2hhbmRsZV9nbmRfbWljX3N3YXAoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkJaW50IHB0X2duZF9taWNfc3dhcF9jbnQsCisJCQkJCWVudW0gd2NkOXh4eF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCit7CisJaWYgKG1iaGMtPm1iaGNfY2ZnLT5zd2FwX2duZF9taWMgJiYKKwkgICAgKHB0X2duZF9taWNfc3dhcF9jbnQgPT0gR05EX01JQ19TV0FQX1RIUkVTSE9MRCkpIHsKKwkJLyoKKwkJICogaWYgc3dpdGNoIGlzIHRvZ2dsZWQsIGNoZWNrIGFnYWluLAorCQkgKiBvdGhlcndpc2UgcmVwb3J0IHVuc3VwcG9ydGVkIHBsdWcKKwkJICovCisJCW1iaGMtPm1iaGNfY2ZnLT5zd2FwX2duZF9taWMobWJoYy0+Y29kZWMpOworCX0gZWxzZSBpZiAocHRfZ25kX21pY19zd2FwX2NudCA+PSBHTkRfTUlDX1NXQVBfVEhSRVNIT0xEKSB7CisJCS8qIFJlcG9ydCBVTlNVUFBPUlRFRCBwbHVnCisJCSAqIGFuZCBjb250aW51ZSBwb2xsaW5nCisJCSAqLworCQlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7CisJCWlmICghbWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlKSB7CisJCQlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEUEhPTkUpCisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLAorCQkJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSk7CisJCQllbHNlIGlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0hFQURTRVQpCisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLAorCQkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQpOworCQl9CisJCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgIT0gcGx1Z190eXBlKQorCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLAorCQkJCQlTTkRfSkFDS19VTlNVUFBPUlRFRCk7CisJCVdDRDlYWFhfQkNMX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCX0KK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9jb3JyZWN0X3N3Y2hfcGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJZW51bSB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlIHBsdWdfdHlwZSA9IFBMVUdfVFlQRV9JTlZBTElEOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmV0cnkgPSAwLCBwdF9nbmRfbWljX3N3YXBfY250ID0gMDsKKwlpbnQgaGlnaGhwaF9jbnQgPSAwOworCWJvb2wgY29ycmVjdGlvbiA9IGZhbHNlOworCWJvb2wgY3VycmVudF9zb3VyY2VfZW5hYmxlOworCWJvb2wgd3JrX2NvbXBsZXRlID0gdHJ1ZSwgaGlnaGhwaCA9IGZhbHNlOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJbWJoYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjLCBjb3JyZWN0X3BsdWdfc3djaCk7CisJY29kZWMgPSBtYmhjLT5jb2RlYzsKKworCWN1cnJlbnRfc291cmNlX2VuYWJsZSA9ICgoKG1iaGMtPm1iaGNfY2ZnLT5jc19lbmFibGVfZmxhZ3MgJgorCQkgICAgICAoMSA8PCBNQkhDX0NTX0VOQUJMRV9QT0xMSU5HKSkgIT0gMCkgJiYKKwkJICAgICAoIShzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJICAgICBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnKSAmIDB4ODApKSk7CisKKwl3Y2Q5eHh4X29ub2ZmX2V4dF9tY2xrKG1iaGMsIHRydWUpOworCisJLyoKKwkgKiBLZWVwIG92ZXJyaWRlIG9uIGR1cmluZyBlbnRpcmUgcGx1ZyB0eXBlIGNvcnJlY3Rpb24gd29yay4KKwkgKgorCSAqIFRoaXMgaXMgb2theSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGFueSBzd2l0Y2ggaXJxcyB3aGljaCB1c2UKKwkgKiBNQkhDIGJsb2NrIGNhbmNlbCBhbmQgc3luYyB0aGlzIHdvcmsgc28gb3ZlcnJpZGUgaXMgb2ZmIGFnYWluCisJICogcHJpb3IgdG8gc3dpdGNoIGludGVycnVwdCBoYW5kbGVyJ3MgTUJIQyBibG9jayB1c2FnZS4KKwkgKiBBbHNvIHdoaWxlIHRoaXMgY29ycmVjdGlvbiB3b3JrIGlzIHJ1bm5pbmcsIHdlIGNhbiBndWFyYW50ZWUKKwkgKiBEQVBNIGRvZXNuJ3QgdXNlIGFueSBNQkhDIGJsb2NrIGFzIHRoaXMgd29yayBvbmx5IHJ1bnMgd2l0aAorCSAqIGhlYWRwaG9uZSBkZXRlY3Rpb24uCisJICovCisJaWYgKGN1cnJlbnRfc291cmNlX2VuYWJsZSkgeworCQlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7CisJCXdjZDl4eHhfdHVybl9vbm9mZl9jdXJyZW50X3NvdXJjZShtYmhjLCAmbWJoYy0+bWJoY19iaWFzX3JlZ3MsCisJCQkJCQkgIHRydWUsIGZhbHNlKTsKKwkJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJfSBlbHNlIHsKKwkJd2NkOXh4eF90dXJuX29ub2ZmX292ZXJyaWRlKG1iaGMsIHRydWUpOworCX0KKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhIU19ERVRFQ1RfUExVR19USU1FX01TKTsKKwl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJKytyZXRyeTsKKworCQkvKiBNYWtlIHN1cmUgYW55IHBlbmRpbmcgbWVtb3J5IHJlYWQgaXMgY29tcGxldGVkLCBiZWZvcmUKKwkJICogaHNfZGV0ZWN0X3dvcmtfc3RvcCB2YWx1ZSBpcyByZWFkLgorCQkgKi8KKwkJcm1iKCk7CisJCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7CisJCQl3cmtfY29tcGxldGUgPSBmYWxzZTsKKwkJCXByX2RlYnVnKCIlczogc3RvcCByZXF1ZXN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNsZWVwKEhTX0RFVEVDVF9QTFVHX0lORVJWQUxfTVMpOworCQlpZiAod2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgeworCQkJd3JrX2NvbXBsZXRlID0gZmFsc2U7CisJCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2FuIHJhY2Ugd2l0aCByZW1vdmFsIGludGVycnVwdCAqLworCQlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7CisJCWlmIChjdXJyZW50X3NvdXJjZV9lbmFibGUpCisJCQlwbHVnX3R5cGUgPSB3Y2Q5eHh4X2NvZGVjX2NzX2dldF9wbHVnX3R5cGUobWJoYywKKwkJCQkJCQkJICAgaGlnaGhwaCk7CisJCWVsc2UKKwkJCXBsdWdfdHlwZSA9IHdjZDl4eHhfY29kZWNfZ2V0X3BsdWdfdHlwZShtYmhjLCB0cnVlKTsKKwkJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0KCVkKSBjdXJyZW50X3BsdWcoJWQpIG5ld19wbHVnKCVkKVxuIiwKKwkJCSBfX2Z1bmNfXywgcmV0cnksIG1iaGMtPmN1cnJlbnRfcGx1ZywgcGx1Z190eXBlKTsKKworCQloaWdoaHBoX2NudCA9IChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0hJR0hfSFBIKSA/CisJCQkJCShoaWdoaHBoX2NudCArIDEpIDoKKwkJCQkJMDsKKwkJaGlnaGhwaCA9IHdjZDl4eHhfbWJoY19lbmFibGVfbWJfZGVjaXNpb24oaGlnaGhwaF9jbnQpOworCQlpZiAocGx1Z190eXBlID09IFBMVUdfVFlQRV9JTlZBTElEKSB7CisJCQlwcl9kZWJ1ZygiSW52YWxpZCBwbHVnIGluIGF0dGVtcHQgIyAlZFxuIiwgcmV0cnkpOworCQkJaWYgKCFtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUgJiYKKwkJCSAgICByZXRyeSA9PSBOVU1fQVRURU1QVFNfVE9fUkVQT1JUICYmCisJCQkgICAgbWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9OT05FKSB7CisJCQkJV0NEOVhYWF9CQ0xfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwKKwkJCQkJCSAgICBTTkRfSkFDS19IRUFEUEhPTkUpOworCQkJCVdDRDlYWFhfQkNMX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJfQorCQl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCQlwcl9kZWJ1ZygiR29vZCBoZWFkcGhvbmUgZGV0ZWN0ZWQsIGNvbnRpbnVlIHBvbGxpbmdcbiIpOworCQkJV0NEOVhYWF9CQ0xfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5kZXRlY3RfZXh0bl9jYWJsZSkgeworCQkJCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgIT0gcGx1Z190eXBlKQorCQkJCQl3Y2Q5eHh4X3JlcG9ydF9wbHVnKG1iaGMsIDEsCisJCQkJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSk7CisJCQl9IGVsc2UgaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfTk9ORSkgeworCQkJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMSwKKwkJCQkJCSAgICBTTkRfSkFDS19IRUFEUEhPTkUpOworCQkJfQorCQkJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJCX0gZWxzZSBpZiAocGx1Z190eXBlID09IFBMVUdfVFlQRV9ISUdIX0hQSCkgeworCQkJcHJfZGVidWcoIiVzOiBIaWdoIEhQSCBkZXRlY3RlZCwgY29udGludWUgcG9sbGluZ1xuIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwkJCWlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKKwkJCQlpZiAobWJoYy0+Y3VycmVudF9wbHVnICE9IHBsdWdfdHlwZSkKKwkJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLAorCQkJCQkJCSAgICBTTkRfSkFDS19MSU5FT1VUKTsKKwkJCX0gZWxzZSBpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9OT05FKSB7CisJCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAxLAorCQkJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSk7CisJCQl9CisJCQlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwbHVnX3R5cGUgPT0gUExVR19UWVBFX0dORF9NSUNfU1dBUCkgeworCQkJCXB0X2duZF9taWNfc3dhcF9jbnQrKzsKKwkJCQlpZiAocHRfZ25kX21pY19zd2FwX2NudCA+PQorCQkJCQkJR05EX01JQ19TV0FQX1RIUkVTSE9MRCkKKwkJCQkJd2NkOXh4eF9oYW5kbGVfZ25kX21pY19zd2FwKG1iaGMsCisJCQkJCQkJcHRfZ25kX21pY19zd2FwX2NudCwKKwkJCQkJCQlwbHVnX3R5cGUpOworCQkJCXByX2RlYnVnKCIlczogdW5zdXBwb3J0ZWQgSFMgZGV0ZWN0ZWQsIGNvbnRpbnVlIHBvbGxpbmdcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXB0X2duZF9taWNfc3dhcF9jbnQgPSAwOworCisJCQkJV0NEOVhYWF9CQ0xfTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJCS8qIFR1cm4gb2ZmIG92ZXJyaWRlL2N1cnJlbnQgc291cmNlICovCisJCQkJaWYgKGN1cnJlbnRfc291cmNlX2VuYWJsZSkKKwkJCQkJd2NkOXh4eF90dXJuX29ub2ZmX2N1cnJlbnRfc291cmNlKG1iaGMsCisJCQkJCQkJJm1iaGMtPm1iaGNfYmlhc19yZWdzLAorCQkJCQkJCWZhbHNlLCBmYWxzZSk7CisJCQkJZWxzZQorCQkJCQl3Y2Q5eHh4X3R1cm5fb25vZmZfb3ZlcnJpZGUobWJoYywKKwkJCQkJCQkJICAgIGZhbHNlKTsKKwkJCQkvKgorCQkJCSAqIFRoZSB2YWxpZCBwbHVnIGFsc28gaW5jbHVkZXMKKwkJCQkgKiBQTFVHX1RZUEVfR05EX01JQ19TV0FQCisJCQkJICovCisJCQkJd2NkOXh4eF9maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOworCQkJCVdDRDlYWFhfQkNMX1VOTE9DSyhtYmhjLT5yZXNtZ3IpOworCQkJCXByX2RlYnVnKCJBdHRlbXB0ICVkIGZvdW5kIGNvcnJlY3QgcGx1ZyAlZFxuIiwKKwkJCQkJCXJldHJ5LAorCQkJCQkJcGx1Z190eXBlKTsKKwkJCQljb3JyZWN0aW9uID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaGlnaGhwaCA9IGZhbHNlOworCWlmICh3cmtfY29tcGxldGUgJiYgcGx1Z190eXBlID09IFBMVUdfVFlQRV9ISUdIX0hQSCkgeworCQlwcl9kZWJ1ZygiJXM6IHBvbGxpbmcgaXMgZG9uZSwgc3RpbGwgSFBILCBzbyBlbmFibGluZyBNSUMgdHJpZ2dlclxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwkJd2NkOXh4eF9maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOworCQloaWdoaHBoID0gdHJ1ZTsKKwkJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJfQorCisJaWYgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmhwaF9hdXRvX3B1bGxkb3duX2N0cmwpCisJCQltYmhjLT5tYmhjX2NiLT5ocGhfYXV0b19wdWxsZG93bl9jdHJsKGNvZGVjLCB0cnVlKTsKKwl9CisKKwlpZiAoIWNvcnJlY3Rpb24gJiYgY3VycmVudF9zb3VyY2VfZW5hYmxlKSB7CisJCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwkJd2NkOXh4eF90dXJuX29ub2ZmX2N1cnJlbnRfc291cmNlKG1iaGMsICZtYmhjLT5tYmhjX2JpYXNfcmVncywKKwkJCQkJCSAgZmFsc2UsIGhpZ2hocGgpOworCQlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwl9IGVsc2UgaWYgKCFjb3JyZWN0aW9uKSB7CisJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CisJfQorCisJd2NkOXh4eF9vbm9mZl9leHRfbWNsayhtYmhjLCBmYWxzZSk7CisKKwlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlKSB7CisJCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwkJaWYgKChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0hFQURQSE9ORSAmJgorCQkgICAgd3JrX2NvbXBsZXRlKSB8fAorCQkgICAgbWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9HTkRfTUlDX1NXQVAgfHwKKwkJICAgIG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSU5WQUxJRCB8fAorCQkgICAgKHBsdWdfdHlwZSA9PSBQTFVHX1RZUEVfSU5WQUxJRCAmJiB3cmtfY29tcGxldGUpKSB7CisJCQkvKiBFbmFibGUgcmVtb3ZhbCBkZXRlY3Rpb24gKi8KKwkJCXdjZDl4eHhfY2xlYW51cF9oc19wb2xsaW5nKG1iaGMpOworCQkJd2NkOXh4eF9lbmFibGVfaHNfZGV0ZWN0KG1iaGMsIDAsIDAsIGZhbHNlKTsKKwkJfQorCQlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwl9CisJcHJfZGVidWcoIiVzOiBsZWF2ZSBjdXJyZW50X3BsdWcoJWQpXG4iLCBfX2Z1bmNfXywgbWJoYy0+Y3VycmVudF9wbHVnKTsKKwkvKiB1bmxvY2sgc2xlZXAgKi8KKwl3Y2Q5eHh4X3VubG9ja19zbGVlcChtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9zd2NoX2lycV9oYW5kbGVyKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJYm9vbCBpbnNlcnQ7CisJYm9vbCBpc19yZW1vdmVkID0gZmFsc2U7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwltYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyID0gdHJ1ZTsKKwkvKiBXYWl0IGhlcmUgZm9yIGRlYm91bmNlIHRpbWUgKi8KKwl1c2xlZXBfcmFuZ2UoU1dDSF9JUlFfREVCT1VOQ0VfVElNRV9VUywgU1dDSF9JUlFfREVCT1VOQ0VfVElNRV9VUyArCisJCQkJCVdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisKKwlXQ0Q5WFhYX0JDTF9MT0NLKG1iaGMtPnJlc21ncik7CisKKwkvKiBjYW5jZWwgcGVuZGluZyBidXR0b24gcHJlc3MgKi8KKwlpZiAod2NkOXh4eF9jYW5jZWxfYnRuX3dvcmsobWJoYykpCisJCXByX2RlYnVnKCIlczogYnV0dG9uIHByZXNzIGlzIGNhbmNlbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpbnNlcnQgPSAhd2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKTsKKwlwcl9kZWJ1ZygiJXM6IEN1cnJlbnQgcGx1ZyB0eXBlICVkLCBpbnNlcnQgJWRcbiIsIF9fZnVuY19fLAorCQkgbWJoYy0+Y3VycmVudF9wbHVnLCBpbnNlcnQpOworCWlmICgobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9OT05FKSAmJiBpbnNlcnQpIHsKKworCQltYmhjLT5scGlfZW5hYmxlZCA9IGZhbHNlOworCisJCS8qIE1ha2Ugc3VyZSBtYmhjIHN0YXRlIHVwZGF0ZSBjb21wbGV0ZSBiZWZvcmUgY2FuY2VsIGRldGVjdAorCQkgKiBwbHVnLgorCQkgKi8KKwkJd21iKCk7CisJCS8qIGNhbmNlbCBkZXRlY3QgcGx1ZyAqLworCQl3Y2Q5eHh4X2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLAorCQkJCSAgICAgICZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCk7CisKKwkJaWYgKChtYmhjLT5jdXJyZW50X3BsdWcgIT0gUExVR19UWVBFX05PTkUpICYmCisJCSAgICAobWJoYy0+Y3VycmVudF9wbHVnICE9IFBMVUdfVFlQRV9ISUdIX0hQSCkgJiYKKwkJICAgICEoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19JTlNFUlRfREVURUNUKSAmCisJCQkJICAgKDEgPDwgMSkpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGN1cnJlbnQgcGx1ZzogJWRcbiIsIF9fZnVuY19fLAorCQkJCW1iaGMtPmN1cnJlbnRfcGx1Zyk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBEaXNhYmxlIE1pYyBCaWFzIHB1bGwgZG93biBhbmQgSFBIIFN3aXRjaCB0byBHTkQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywgMHgwMSwKKwkJCQkgICAgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgwMSwgMHgwMCk7CisJCXdjZDl4eHhfbWJoY19kZXRlY3RfcGx1Z190eXBlKG1iaGMpOworCX0gZWxzZSBpZiAoKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPSBQTFVHX1RZUEVfTk9ORSkgJiYgIWluc2VydCkgeworCQltYmhjLT5scGlfZW5hYmxlZCA9IGZhbHNlOworCisJCS8qIE1ha2Ugc3VyZSBtYmhjIHN0YXRlIHVwZGF0ZSBjb21wbGV0ZSBiZWZvcmUgY2FuY2VsIGRldGVjdAorCQkgKiBwbHVnLgorCQkgKi8KKwkJd21iKCk7CisJCS8qIGNhbmNlbCBkZXRlY3QgcGx1ZyAqLworCQl3Y2Q5eHh4X2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLAorCQkJCSAgICAgICZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCk7CisKKwkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSEVBRFBIT05FKSB7CisJCQl3Y2Q5eHh4X3JlcG9ydF9wbHVnKG1iaGMsIDAsIFNORF9KQUNLX0hFQURQSE9ORSk7CisJCQlpc19yZW1vdmVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0dORF9NSUNfU1dBUCkgeworCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19VTlNVUFBPUlRFRCk7CisJCQlpc19yZW1vdmVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0hFQURTRVQpIHsKKwkJCXdjZDl4eHhfcGF1c2VfaHNfcG9sbGluZyhtYmhjKTsKKwkJCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIGZhbHNlKTsKKwkJCXdjZDl4eHhfY2xlYW51cF9oc19wb2xsaW5nKG1iaGMpOworCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19IRUFEU0VUKTsKKwkJCWlzX3JlbW92ZWQgPSB0cnVlOworCQl9IGVsc2UgaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBQTFVHX1RZUEVfSElHSF9IUEgpIHsKKwkJCXdjZDl4eHhfcmVwb3J0X3BsdWcobWJoYywgMCwgU05EX0pBQ0tfTElORU9VVCk7CisJCQlpc19yZW1vdmVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gUExVR19UWVBFX0FOQ19IRUFEUEhPTkUpIHsKKwkJCXdjZDl4eHhfcGF1c2VfaHNfcG9sbGluZyhtYmhjKTsKKwkJCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIGZhbHNlKTsKKwkJCXdjZDl4eHhfY2xlYW51cF9oc19wb2xsaW5nKG1iaGMpOworCQkJd2NkOXh4eF9yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19BTkNfSEVBRFBIT05FKTsKKwkJCWlzX3JlbW92ZWQgPSB0cnVlOworCQl9CisKKwkJaWYgKGlzX3JlbW92ZWQpIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsCisJCQkJICAgICAgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLAorCQkJCQkgICAgMHgwMiwgMHgwMCk7CisKKwkJCS8qIEVuYWJsZSBNaWMgQmlhcyBwdWxsIGRvd24gYW5kIEhQSCBTd2l0Y2ggdG8gR05EICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQltYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnLCAweDAxLAorCQkJCQkweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgwMSwKKwkJCQkJMHgwMSk7CisJCQkvKiBNYWtlIHN1cmUgbWljIHRyaWdnZXIgaXMgdHVybmVkIG9mZiAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywKKwkJCQkJICAgIDB4MDEsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIG1iaGMtPm1iaGNfYmlhc19yZWdzLm1iaGNfcmVnLAorCQkJCQkgICAgMHg5MCwgMHgwMCk7CisJCQkvKiBSZXNldCBNQkhDIFN0YXRlIE1hY2hpbmUgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLAorCQkJCQkgICAgMHgwOCwgMHgwOCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwKKwkJCQkJICAgIDB4MDgsIDB4MDApOworCQkJLyogVHVybiBvZmYgb3ZlcnJpZGUgKi8KKwkJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CisJCX0KKwl9CitleGl0OgorCW1iaGMtPmluX3N3Y2hfaXJxX2hhbmRsZXIgPSBmYWxzZTsKKwlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X21lY2hfcGx1Z19kZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IHIgPSBJUlFfSEFORExFRDsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjID0gZGF0YTsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAodW5saWtlbHkod2NkOXh4eF9sb2NrX3NsZWVwKG1iaGMtPnJlc21nci0+Y29yZV9yZXMpID09IGZhbHNlKSkgeworCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGhvbGQgc3VzcGVuZFxuIiwgX19mdW5jX18pOworCQlyID0gSVJRX05PTkU7CisJfSBlbHNlIHsKKwkJLyogQ2FsbCBoYW5kbGVyICovCisJCXdjZDl4eHhfc3djaF9pcnFfaGFuZGxlcihtYmhjKTsKKwkJd2NkOXh4eF91bmxvY2tfc2xlZXAobWJoYy0+cmVzbWdyLT5jb3JlX3Jlcyk7CisJfQorCisJcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaXNfZmFsc2VfcHJlc3Moc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzMTYgbWJfdjsKKwlpbnQgaSA9IDA7CisJaW50IHIgPSAwOworCWNvbnN0IHMxNiB2X2luc19odSA9CisJICAgIHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9JTlNfSFUpOworCWNvbnN0IHMxNiB2X2luc19oID0KKwkgICAgd2NkOXh4eF9nZXRfY3VycmVudF92KG1iaGMsIFdDRDlYWFhfQ1VSUkVOVF9WX0lOU19IKTsKKwljb25zdCBzMTYgdl9iMV9odSA9CisJICAgIHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9CMV9IVSk7CisJY29uc3QgczE2IHZfYjFfaCA9CisJICAgIHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9CMV9IKTsKKwljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPQorCSAgICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCVE5fUkVMRUFTRV9ERUJPVU5DRV9USU1FX01TKTsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIHJ1biBtZWFzdXJlbWVudHMganVzdCBmZXcgdGltZXMgZHVyaW5nCisJCSAqIHJlbGVhc2UgZGVib3VuY2UgdGltZS4gIE1ha2UgMW1zIGludGVydmFsIHRvIGF2b2lkCisJCSAqIHVubmVjZXNzYXJ5IGV4Y2Vzc2l2ZSBtZWFzdXJlbWVudHMuCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCWlmIChpID09IDApIHsKKwkJCW1iX3YgPSB3Y2Q5eHh4X2NvZGVjX3N0YV9kY2UobWJoYywgMCwgdHJ1ZSk7CisJCQlwcl9kZWJ1ZygiJXM6IFNUQVswXTogJWQsJWRcbiIsIF9fZnVuY19fLCBtYl92LAorCQkJCSB3Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAwLCBtYl92KSk7CisJCQlpZiAobWJfdiA8IHZfYjFfaHUgfHwgbWJfdiA+IHZfaW5zX2h1KSB7CisJCQkJciA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQltYl92ID0gd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDEsIHRydWUpOworCQkJcHJfZGVidWcoIiVzOiBEQ0VbJWRdOiAlZCwlZFxuIiwgX19mdW5jX18sIGksIG1iX3YsCisJCQkJIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIG1iX3YpKTsKKwkJCWlmIChtYl92IDwgdl9iMV9oIHx8IG1iX3YgPiB2X2luc19oKSB7CisJCQkJciA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaSsrOworCX0KKworCXJldHVybiByOworfQorCisvKiBjYWxsZWQgdW5kZXIgY29kZWNfcmVzb3VyY2VfbG9jayBhY3F1aXNpdGlvbiAqLworc3RhdGljIGludCB3Y2Q5eHh4X2RldGVybWluZV9idXR0b24oY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkgIGNvbnN0IHMzMiBtaWNtdikKK3sKKwlzMTYgKnZfYnRuX2xvdywgKnZfYnRuX2hpZ2g7CisJc3RydWN0IHdjZDl4eHhfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2RldDsKKwlpbnQgaSwgYnRuID0gLTE7CisKKwlidG5fZGV0ID0gV0NEOVhYWF9NQkhDX0NBTF9CVE5fREVUX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCXZfYnRuX2xvdyA9IHdjZDl4eHhfbWJoY19jYWxfYnRuX2RldF9tcChidG5fZGV0LAorCQkJCQkJTUJIQ19CVE5fREVUX1ZfQlROX0xPVyk7CisJdl9idG5faGlnaCA9IHdjZDl4eHhfbWJoY19jYWxfYnRuX2RldF9tcChidG5fZGV0LAorCQkJCQkJIE1CSENfQlROX0RFVF9WX0JUTl9ISUdIKTsKKworCWZvciAoaSA9IDA7IGkgPCBidG5fZGV0LT5udW1fYnRuOyBpKyspIHsKKwkJaWYgKCh2X2J0bl9sb3dbaV0gPD0gbWljbXYpICYmICh2X2J0bl9oaWdoW2ldID49IG1pY212KSkgeworCQkJYnRuID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJ0biA9PSAtMSkKKwkJcHJfZGVidWcoIiVzOiBjb3VsZG4ndCBmaW5kIGJ1dHRvbiBudW1iZXIgZm9yIG1pYyBtdiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbWljbXYpOworCisJcmV0dXJuIGJ0bjsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X2dldF9idXR0b25fbWFzayhjb25zdCBpbnQgYnRuKQoreworCWludCBtYXNrID0gMDsKKworCXN3aXRjaCAoYnRuKSB7CisJY2FzZSAwOgorCQltYXNrID0gU05EX0pBQ0tfQlROXzA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWFzayA9IFNORF9KQUNLX0JUTl8xOworCQlicmVhazsKKwljYXNlIDI6CisJCW1hc2sgPSBTTkRfSkFDS19CVE5fMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltYXNrID0gU05EX0pBQ0tfQlROXzM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbWFzayA9IFNORF9KQUNLX0JUTl80OworCQlicmVhazsKKwljYXNlIDU6CisJCW1hc2sgPSBTTkRfSkFDS19CVE5fNTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2dldF96KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHMxNiAqZGNlX3osIHMxNiAqc3RhX3osCisJCQkgIHN0cnVjdCBtYmhjX21pY2JpYXNfcmVncyAqbWljYl9yZWdzLAorCQkJICBib29sIG5vcmVsX2RldGVjdGlvbikKK3sKKwlzMTYgcmVnMCwgcmVnMTsKKwlpbnQgY2hhbmdlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJV0NEOVhYWF9CQ0xfQVNTRVJUX0xPQ0tFRChtYmhjLT5yZXNtZ3IpOworCS8qIFB1bGwgZG93biBtaWNiaWFzIHRvIGdyb3VuZCBhbmQgZGlzY29ubmVjdCB2ZGRpbyBzd2l0Y2ggKi8KKwlyZWcwID0gc25kX3NvY19yZWFkKGNvZGVjLCBtaWNiX3JlZ3MtPmN0bF9yZWcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVncy0+Y3RsX3JlZywgMHg4MSwgMHgxKTsKKwlyZWcxID0gc25kX3NvY19yZWFkKGNvZGVjLCBtaWNiX3JlZ3MtPm1iaGNfcmVnKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX3JlZ3MtPm1iaGNfcmVnLCAxIDw8IDcsIDApOworCisJLyogRGlzY29ubmVjdCBvdmVycmlkZSBmcm9tIG1pY2JpYXMgKi8KKwljaGFuZ2UgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLCAxIDw8IDQsCisJCQkJICAgICAxIDw8IDApOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwICsgMTAwMCk7CisJaWYgKHN0YV96KSB7CisJCSpzdGFfeiA9IHdjZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAwLCBub3JlbF9kZXRlY3Rpb24pOworCQlwcl9kZWJ1ZygiJXM6IHN0YV96IDB4JXhcbiIsIF9fZnVuY19fLCAqc3RhX3ogJiAweEZGRkYpOworCX0KKwlpZiAoZGNlX3opIHsKKwkJKmRjZV96ID0gd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDEsIG5vcmVsX2RldGVjdGlvbik7CisJCXByX2RlYnVnKCIlczogZGNlX3ogMHgleFxuIiwgX19mdW5jX18sICpkY2VfeiAmIDB4RkZGRik7CisJfQorCisJLyogQ29ubmVjdCBvdmVycmlkZSBmcm9tIG1pY2JpYXMgKi8KKwlpZiAoY2hhbmdlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLCAxIDw8IDQsCisJCQkJICAgIDEgPDwgNCk7CisJLyogRGlzYWJsZSBwdWxsIGRvd24gbWljYmlhcyB0byBncm91bmQgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBtaWNiX3JlZ3MtPm1iaGNfcmVnLCByZWcxKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBtaWNiX3JlZ3MtPmN0bF9yZWcsIHJlZzApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZWNhbGlicmF0ZXMgZGNlX3ogYW5kIHN0YV96IHBhcmFtZXRlcnMuCisgKiBObyByZWxlYXNlIGRldGVjdGlvbiB3aWxsIGJlIGZhbHNlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcworICogdXNlZC4KKyAqLwordm9pZCB3Y2Q5eHh4X3VwZGF0ZV96KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJY29uc3QgdTE2IHN0YV96ID0gbWJoYy0+bWJoY19kYXRhLnN0YV96OworCWNvbnN0IHUxNiBkY2VfeiA9IG1iaGMtPm1iaGNfZGF0YS5kY2VfejsKKworCXdjZDl4eHhfZ2V0X3oobWJoYywgJm1iaGMtPm1iaGNfZGF0YS5kY2VfeiwgJm1iaGMtPm1iaGNfZGF0YS5zdGFfeiwKKwkJICAgICAgJm1iaGMtPm1iaGNfYmlhc19yZWdzLCBmYWxzZSk7CisJcHJfZGVidWcoIiVzOiBzdGFfeiAweCV4LGRjZV96IDB4JXggLT4gc3RhX3ogMHgleCxkY2VfeiAweCV4XG4iLAorCQkgX19mdW5jX18sIHN0YV96ICYgMHhGRkZGLCBkY2VfeiAmIDB4RkZGRiwKKwkJIG1iaGMtPm1iaGNfZGF0YS5zdGFfeiAmIDB4RkZGRiwKKwkJIG1iaGMtPm1iaGNfZGF0YS5kY2VfeiAmIDB4RkZGRik7CisKKwl3Y2Q5eHh4X21iaGNfY2FsY190aHJlcyhtYmhjKTsKKwl3Y2Q5eHh4X2NhbGlicmF0ZV9oc19wb2xsaW5nKG1iaGMpOworfQorCisvKgorICogd2NkOXh4eF91cGRhdGVfcmVsX3RocmVzaG9sZCA6IHVwZGF0ZSBtYmhjIHJlbGVhc2UgdXBwZXIgYm91bmQgdGhyZXNob2xkCisgKgkJCQkgIHRvIGNlaWxtdiArIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHdjZDl4eHhfdXBkYXRlX3JlbF90aHJlc2hvbGQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywgaW50IGNlaWxtdiwKKwkJCQkJYm9vbCB2ZGRpbykKK3sKKwl1MTYgdl9icmgsIHZfYjFfaHU7CisJaW50IG12OworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9kZXQ7CisJdm9pZCAqY2FsaWJyYXRpb24gPSBtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb247CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlidG5fZGV0ID0gV0NEOVhYWF9NQkhDX0NBTF9CVE5fREVUX1BUUihjYWxpYnJhdGlvbik7CisJbXYgPSBjZWlsbXYgKyBidG5fZGV0LT52X2J0bl9wcmVzc19kZWx0YV9jaWM7CisJaWYgKHZkZGlvKQorCQltdiA9IHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBtdiwgdHJ1ZSk7CisJcHJfZGVidWcoIiVzOiByZXByb2dyYW0gdmIxaHUvdmJyaCB0byAlZG12XG4iLCBfX2Z1bmNfXywgbXYpOworCisJaWYgKG1iaGMtPm1iaGNfc3RhdGUgIT0gTUJIQ19TVEFURV9QT1RFTlRJQUxfUkVDT1ZFUlkpIHsKKwkJLyoKKwkJICogdXBkYXRlIExTQiBmaXJzdCBzbyBtYmhjIGhhcmR3YXJlIGJsb2NrCisJCSAqIGRvZXNuJ3Qgc2VlIHRvbyBsb3cgdmFsdWUuCisJCSAqLworCQl2X2IxX2h1ID0gd2NkOXh4eF9jb2RlY192X3N0YV9kY2UobWJoYywgU1RBLCBtdiwgZmFsc2UpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CM19DVEwsIHZfYjFfaHUgJgorCQkJCTB4RkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CNF9DVEwsCisJCQkJKHZfYjFfaHUgPj4gOCkgJiAweEZGKTsKKwkJdl9icmggPSB3Y2Q5eHh4X2NvZGVjX3Zfc3RhX2RjZShtYmhjLCBEQ0UsIG12LCBmYWxzZSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19WT0xUX0I5X0NUTCwgdl9icmggJgorCQkJCTB4RkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVk9MVF9CMTBfQ1RMLAorCQkJCSh2X2JyaCA+PiA4KSAmIDB4RkYpOworCX0KKwlyZXR1cm4gMDsKK30KKworaXJxcmV0dXJuX3Qgd2NkOXh4eF9kY2VfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWludCBpLCBtYXNrOworCWJvb2wgdmRkaW87CisJdTggbWJoY19zdGF0dXM7CisJczE2IGRjZV96LCBzdGFfejsKKwlzMzIgc3RhbXYsIHN0YW12X3M7CisJczE2ICp2X2J0bl9oaWdoOworCXN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9kZXQ7CisJaW50IGJ0biA9IC0xLCBtZWFzID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjID0gZGF0YTsKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpkID0KKwkgICAgV0NEOVhYWF9NQkhDX0NBTF9CVE5fREVUX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCXNob3J0IGJ0bm1lYXNbZC0+bl9idG5fbWVhcyArIDFdOworCXNob3J0IGRjZVtkLT5uX2J0bl9tZWFzICsgMV0sIHN0YTsKKwlzMzIgbXZbZC0+bl9idG5fbWVhcyArIDFdLCBtdl9zW2QtPm5fYnRuX21lYXMgKyAxXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9IG1iaGMtPnJlc21nci0+Y29yZV9yZXM7CisJaW50IG5fYnRuX21lYXMgPSBkLT5uX2J0bl9tZWFzOworCXZvaWQgKmNhbGlicmF0aW9uID0gbWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJV0NEOVhYWF9CQ0xfTE9DSyhtYmhjLT5yZXNtZ3IpOworCW11dGV4X2xvY2soJm1iaGMtPm1iaGNfbG9jayk7CisJbWJoY19zdGF0dXMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9TVEFUVVMpICYgMHgzRTsKKworCWlmIChtYmhjLT5tYmhjX3N0YXRlID09IE1CSENfU1RBVEVfUE9URU5USUFMX1JFQ09WRVJZKSB7CisJCXByX2RlYnVnKCIlczogbWJoYyBpcyBiZWluZyByZWNvdmVyZWQsIHNraXAgYnV0dG9uIHByZXNzXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCW1iaGMtPm1iaGNfc3RhdGUgPSBNQkhDX1NUQVRFX1BPVEVOVElBTDsKKworCWlmICghbWJoYy0+cG9sbGluZ19hY3RpdmUpIHsKKwkJcHJfd2FybigiJXM6IG1iaGMgcG9sbGluZyBpcyBub3QgYWN0aXZlLCBza2lwIGJ1dHRvbiBwcmVzc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIElmIHN3aXRjaCBudGVycnVwdCBhbHJlYWR5IGtpY2tlZCBpbiwgaWdub3JlIGJ1dHRvbiBwcmVzcyAqLworCWlmIChtYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyKSB7CisJCXByX2RlYnVnKCIlczogU3d0aWNoIGxldmVsIGNoYW5nZWQsIGlnbm9yZSBidXR0b24gcHJlc3NcbiIsCisJCQkgX19mdW5jX18pOworCQlidG4gPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogc2V0dXAgaW50ZXJuYWwgbWljYmlhcyBpZiBjb2RlYyB1c2VzIGludGVybmFsIG1pY2JpYXMgZm9yCisJICogaGVhZHNldCBkZXRlY3Rpb24KKwkgKi8KKwlpZiAobWJoYy0+bWJoY19jZmctPnVzZV9pbnRfcmJpYXMpIHsKKwkJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+c2V0dXBfaW50X3JiaWFzKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0dXBfaW50X3JiaWFzKGNvZGVjLCB0cnVlKTsKKwkJZWxzZQorCQkJcHJfZXJyKCIlczogaW50ZXJuYWwgYmlhcyByZXF1ZXN0ZWQgYnV0IGNvZGVjIGRpZCBub3QgcHJvdmlkZSBjYWxsYmFja1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJfQorCisKKwkvKiBNZWFzdXJlIHNjYWxlZCBIVyBEQ0UgKi8KKwl2ZGRpbyA9IChtYmhjLT5tYmhjX2RhdGEubWljYl9tdiAhPSBWRERJT19NSUNCSUFTX01WICYmCisJCSBtYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQpOworCisJZGNlX3ogPSBtYmhjLT5tYmhjX2RhdGEuZGNlX3o7CisJc3RhX3ogPSBtYmhjLT5tYmhjX2RhdGEuc3RhX3o7CisKKwkvKiBNZWFzdXJlIHNjYWxlZCBIVyBTVEEgKi8KKwlkY2VbMF0gPSB3Y2Q5eHh4X3JlYWRfZGNlX3Jlc3VsdChjb2RlYyk7CisJc3RhID0gd2NkOXh4eF9yZWFkX3N0YV9yZXN1bHQoY29kZWMpOworCWlmIChtYmhjX3N0YXR1cyAhPSBTVEFUVVNfUkVMX0RFVEVDVElPTikgeworCQlpZiAobWJoYy0+bWJoY19sYXN0X3Jlc3VtZSAmJgorCQkgICAgIXRpbWVfYWZ0ZXIoamlmZmllcywgbWJoYy0+bWJoY19sYXN0X3Jlc3VtZSArIEhaKSkgeworCQkJcHJfZGVidWcoIiVzOiBCdXR0b24gaXMgcmVsZWFzZWQgYWZ0ZXIgcmVzdW1lXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW5fYnRuX21lYXMgPSAwOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzOiBCdXR0b24gaXMgcmVsZWFzZWQgd2l0aG91dCByZXN1bWUiLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlpZiAobWJoYy0+dXBkYXRlX3opIHsKKwkJCQl3Y2Q5eHh4X3VwZGF0ZV96KG1iaGMpOworCQkJCWRjZV96ID0gbWJoYy0+bWJoY19kYXRhLmRjZV96OworCQkJCXN0YV96ID0gbWJoYy0+bWJoY19kYXRhLnN0YV96OworCQkJCW1iaGMtPnVwZGF0ZV96ID0gdHJ1ZTsKKwkJCX0KKwkJCXN0YW12ID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAwLCBzdGEsIHN0YV96LAorCQkJCQkJbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYpOworCQkJaWYgKHZkZGlvKQorCQkJCXN0YW12X3MgPSBzY2FsZV92X21pY2JfdmRkaW8obWJoYywgc3RhbXYsCisJCQkJCQkJICAgICBmYWxzZSk7CisJCQllbHNlCisJCQkJc3RhbXZfcyA9IHN0YW12OworCQkJbXZbMF0gPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIGRjZVswXSwKKwkJCQkJICBkY2VfeiwgbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYpOworCQkJbXZfc1swXSA9IHZkZGlvID8gc2NhbGVfdl9taWNiX3ZkZGlvKG1iaGMsIG12WzBdLAorCQkJCQkJCSAgICAgZmFsc2UpIDogbXZbMF07CisJCQlidG4gPSB3Y2Q5eHh4X2RldGVybWluZV9idXR0b24obWJoYywgbXZfc1swXSk7CisJCQlpZiAoYnRuICE9IHdjZDl4eHhfZGV0ZXJtaW5lX2J1dHRvbihtYmhjLCBzdGFtdl9zKSkKKwkJCQlidG4gPSAtMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWZvciAobWVhcyA9IDE7ICgoZC0+bl9idG5fbWVhcykgJiYgKG1lYXMgPCAoZC0+bl9idG5fbWVhcyArIDEpKSk7CisJICAgICBtZWFzKyspCisJCWRjZVttZWFzXSA9IHdjZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCBmYWxzZSk7CisKKwlpZiAobWJoYy0+dXBkYXRlX3opIHsKKwkJd2NkOXh4eF91cGRhdGVfeihtYmhjKTsKKwkJZGNlX3ogPSBtYmhjLT5tYmhjX2RhdGEuZGNlX3o7CisJCXN0YV96ID0gbWJoYy0+bWJoY19kYXRhLnN0YV96OworCQltYmhjLT51cGRhdGVfeiA9IHRydWU7CisJfQorCisJc3RhbXYgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDAsIHN0YSwgc3RhX3osCisJCQkJCSAgbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYpOworCWlmICh2ZGRpbykKKwkJc3RhbXZfcyA9IHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBzdGFtdiwgZmFsc2UpOworCWVsc2UKKwkJc3RhbXZfcyA9IHN0YW12OworCXByX2RlYnVnKCIlczogTWVhcyBIVyAtIFNUQSAweCV4LCVkLCVkXG4iLCBfX2Z1bmNfXywKKwkJIHN0YSAmIDB4RkZGRiwgc3RhbXYsIHN0YW12X3MpOworCisJLyogZGV0ZXJtaW5lIHByZXNzZWQgYnV0dG9uICovCisJbXZbMF0gPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIGRjZVswXSwgZGNlX3osCisJCQkJCSAgbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYpOworCW12X3NbMF0gPSB2ZGRpbyA/IHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBtdlswXSwgZmFsc2UpIDogbXZbMF07CisJYnRubWVhc1swXSA9IHdjZDl4eHhfZGV0ZXJtaW5lX2J1dHRvbihtYmhjLCBtdl9zWzBdKTsKKwlwcl9kZWJ1ZygiJXM6IE1lYXMgSFcgLSBEQ0UgMHgleCwlZCwlZCBidXR0b24gJWRcbiIsIF9fZnVuY19fLAorCQkgZGNlWzBdICYgMHhGRkZGLCBtdlswXSwgbXZfc1swXSwgYnRubWVhc1swXSk7CisJaWYgKG5fYnRuX21lYXMgPT0gMCkKKwkJYnRuID0gYnRubWVhc1swXTsKKwlmb3IgKG1lYXMgPSAxOyAobl9idG5fbWVhcyAmJiBkLT5uX2J0bl9tZWFzICYmCisJCQkobWVhcyA8IChkLT5uX2J0bl9tZWFzICsgMSkpKTsgbWVhcysrKSB7CisJCW12W21lYXNdID0gX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAxLCBkY2VbbWVhc10sIGRjZV96LAorCQkJCQkJICAgICBtYmhjLT5tYmhjX2RhdGEubWljYl9tdik7CisJCW12X3NbbWVhc10gPSB2ZGRpbyA/IHNjYWxlX3ZfbWljYl92ZGRpbyhtYmhjLCBtdlttZWFzXSwgZmFsc2UpIDoKKwkJCQkgICAgIG12W21lYXNdOworCQlidG5tZWFzW21lYXNdID0gd2NkOXh4eF9kZXRlcm1pbmVfYnV0dG9uKG1iaGMsIG12X3NbbWVhc10pOworCQlwcl9kZWJ1ZygiJXM6IE1lYXMgJWQgLSBEQ0UgMHgleCwlZCwlZCBidXR0b24gJWRcbiIsCisJCQkgX19mdW5jX18sIG1lYXMsIGRjZVttZWFzXSAmIDB4RkZGRiwgbXZbbWVhc10sCisJCQkgbXZfc1ttZWFzXSwgYnRubWVhc1ttZWFzXSk7CisJCS8qCisJCSAqIGlmIGxhcmdlIGVub3VnaCBtZWFzdXJlbWVudHMgYXJlIGNvbGxlY3RlZCwKKwkJICogc3RhcnQgdG8gY2hlY2sgaWYgbGFzdCBhbGwgbl9idG5fY29uIG1lYXN1cmVtZW50cyB3ZXJlCisJCSAqIGluIHNhbWUgYnV0dG9uIGxvdy9oaWdoIHJhbmdlCisJCSAqLworCQlpZiAobWVhcyArIDEgPj0gZC0+bl9idG5fY29uKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgZC0+bl9idG5fY29uOyBpKyspCisJCQkJaWYgKChidG5tZWFzW21lYXNdIDwgMCkgfHwKKwkJCQkgICAgKGJ0bm1lYXNbbWVhc10gIT0gYnRubWVhc1ttZWFzIC0gaV0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IGQtPm5fYnRuX2NvbikgeworCQkJCS8qIGJ1dHRvbiBwcmVzc2VkICovCisJCQkJYnRuID0gYnRubWVhc1ttZWFzXTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKG5fYnRuX21lYXMgLSBtZWFzKSA8IChkLT5uX2J0bl9jb24gLSAxKSkgeworCQkJCS8qCisJCQkJICogaWYgbGVmdCBtZWFzdXJlbWVudHMgYXJlIGxlc3MgdGhhbiBuX2J0bl9jb24sCisJCQkJICogaXQncyBpbXBvc3NpYmxlIHRvIGZpbmQgYnV0dG9uIG51bWJlcgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGJ0biA+PSAwKSB7CisJCWlmIChtYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyKSB7CisJCQlwcl9kZWJ1ZygKKwkJCSIlczogU3dpdGNoIGlycSB0cmlnZ2VyZWQsIGlnbm9yZSBidXR0b24gcHJlc3NcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnRuX2RldCA9IFdDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaWJyYXRpb24pOworCQl2X2J0bl9oaWdoID0gd2NkOXh4eF9tYmhjX2NhbF9idG5fZGV0X21wKGJ0bl9kZXQsCisJCQkJCQkgICAgICAgTUJIQ19CVE5fREVUX1ZfQlROX0hJR0gpOworCQlXQVJOX09OKGJ0biA+PSBidG5fZGV0LT5udW1fYnRuKTsKKwkJLyogcmVwcm9ncmFtIHJlbGVhc2UgdGhyZXNob2xkIHRvIGNhdGNoIHZvbHRhZ2UgcmFtcCB1cCBlYXJseSAqLworCQl3Y2Q5eHh4X3VwZGF0ZV9yZWxfdGhyZXNob2xkKG1iaGMsIHZfYnRuX2hpZ2hbYnRuXSwgdmRkaW8pOworCisJCW1hc2sgPSB3Y2Q5eHh4X2dldF9idXR0b25fbWFzayhidG4pOworCQltYmhjLT5idXR0b25zX3ByZXNzZWQgfD0gbWFzazsKKwkJd2NkOXh4eF9sb2NrX3NsZWVwKGNvcmVfcmVzKTsKKwkJaWYgKHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWJoYy0+bWJoY19idG5fZHdvcmssCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyg0MDApKSA9PSAwKSB7CisJCQlXQVJOKDEsICJCdXR0b24gcHJlc3NlZCB0d2ljZSB3aXRob3V0IHJlbGVhc2UgZXZlbnRcbiIpOworCQkJd2NkOXh4eF91bmxvY2tfc2xlZXAoY29yZV9yZXMpOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBib2d1cyBidXR0b24gcHJlc3MsIHRvbyBzaG9ydCBwcmVzcz9cbiIsCisJCQkgX19mdW5jX18pOworCX0KKworIGRvbmU6CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmbWJoYy0+bWJoY19sb2NrKTsKKwlXQ0Q5WFhYX0JDTF9VTkxPQ0sobWJoYy0+cmVzbWdyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X3JlbGVhc2VfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisJYm9vbCB3YWl0ZGVib3VuY2UgPSB0cnVlOworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMgPSBkYXRhOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0xPQ0sobWJoYy0+cmVzbWdyKTsKKwltYmhjLT5tYmhjX3N0YXRlID0gTUJIQ19TVEFURV9SRUxFQVNFOworCisJaWYgKG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCAmIFdDRDlYWFhfSkFDS19CVVRUT05fTUFTSykgeworCQlyZXQgPSB3Y2Q5eHh4X2NhbmNlbF9idG5fd29yayhtYmhjKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBsb25nIGJ1dHRvbiByZWxlYXNlIGV2ZW50XG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQl3Y2Q5eHh4X2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5idXR0b25famFjaywgMCwKKwkJCQkJICAgIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7CisJCX0gZWxzZSB7CisJCQlpZiAod2NkOXh4eF9pc19mYWxzZV9wcmVzcyhtYmhjKSkgeworCQkJCXByX2RlYnVnKCIlczogRmFrZSBidXR0b24gcHJlc3MgaW50ZXJydXB0XG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobWJoYy0+aW5fc3djaF9pcnFfaGFuZGxlcikgeworCQkJCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBpcnEga2lja2VkIGluLCBpZ25vcmVcbiIsCisJCQkJCQkgX19mdW5jX18pOworCQkJCX0gZWxzZSB7CisJCQkJCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIGJ0biBwcmVzc1xuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CisJCQkJCXdjZDl4eHhfamFja19yZXBvcnQobWJoYywKKwkJCQkJCQkgJm1iaGMtPmJ1dHRvbl9qYWNrLAorCQkJCQkJCSBtYmhjLT5idXR0b25zX3ByZXNzZWQsCisJCQkJCQkJIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7CisJCQkJCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIGJ0biByZWxlYXNlXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKKwkJCQkJd2NkOXh4eF9qYWNrX3JlcG9ydChtYmhjLAorCQkJCQkJICAgICAgJm1iaGMtPmJ1dHRvbl9qYWNrLAorCQkJCQkJICAgICAgMCwgbWJoYy0+YnV0dG9uc19wcmVzc2VkKTsKKwkJCQkJd2FpdGRlYm91bmNlID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbWJoYy0+YnV0dG9uc19wcmVzc2VkICY9IH5XQ0Q5WFhYX0pBQ0tfQlVUVE9OX01BU0s7CisJfQorCisJd2NkOXh4eF9jYWxpYnJhdGVfaHNfcG9sbGluZyhtYmhjKTsKKworCWlmICh3YWl0ZGVib3VuY2UpCisJCW1zbGVlcChTV0NIX1JFTF9ERUJPVU5DRV9USU1FX01TKTsKKwl3Y2Q5eHh4X3N0YXJ0X2hzX3BvbGxpbmcobWJoYyk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7CisJV0NEOVhYWF9CQ0xfVU5MT0NLKG1iaGMtPnJlc21ncik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2NkOXh4eF9ocGhsX29jcF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjID0gZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlwcl9pbmZvKCIlczogcmVjZWl2ZWQgSFBITCBPQ1AgaXJxXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAobWJoYykgeworCQljb2RlYyA9IG1iaGMtPmNvZGVjOworCQlpZiAoKG1iaGMtPmhwaGxvY3BfY250IDwgT0NQX0FUVEVNUFQpICYmCisJCSAgICAoIW1iaGMtPmhwaHJvY3BfY250KSkgeworCQkJcHJfaW5mbygiJXM6IHJldHJ5XG4iLCBfX2Z1bmNfXyk7CisJCQltYmhjLT5ocGhsb2NwX2NudCsrOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9PQ1BfQ1RMLAorCQkJCQkgICAgMHgxMCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX09DUF9DVEwsCisJCQkJCSAgICAweDEwLCAweDEwKTsKKwkJfSBlbHNlIHsKKwkJCXdjZDl4eHhfZGlzYWJsZV9pcnEobWJoYy0+cmVzbWdyLT5jb3JlX3JlcywKKwkJCQkJICBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKTsKKwkJCW1iaGMtPmhwaF9zdGF0dXMgfD0gU05EX0pBQ0tfT0NfSFBITDsKKwkJCXdjZDl4eHhfamFja19yZXBvcnQobWJoYywgJm1iaGMtPmhlYWRzZXRfamFjaywKKwkJCQkJICAgIG1iaGMtPmhwaF9zdGF0dXMsCisJCQkJCSAgICBXQ0Q5WFhYX0pBQ0tfTUFTSyk7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBCYWQgd2NkOXh4eCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X2hwaHJfb2NwX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMgPSBkYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCXByX2luZm8oIiVzOiByZWNlaXZlZCBIUEhSIE9DUCBpcnFcbiIsIF9fZnVuY19fKTsKKwljb2RlYyA9IG1iaGMtPmNvZGVjOworCWlmICgobWJoYy0+aHBocm9jcF9jbnQgPCBPQ1BfQVRURU1QVCkgJiYKKwkgICAgKCFtYmhjLT5ocGhsb2NwX2NudCkpIHsKKwkJcHJfaW5mbygiJXM6IHJldHJ5XG4iLCBfX2Z1bmNfXyk7CisJCW1iaGMtPmhwaHJvY3BfY250Kys7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHgxMCwKKwkJCQkgICAgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHgxMCwKKwkJCQkgICAgMHgxMCk7CisJfSBlbHNlIHsKKwkJd2NkOXh4eF9kaXNhYmxlX2lycShtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzLAorCQkJCSAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCk7CisJCW1iaGMtPmhwaF9zdGF0dXMgfD0gU05EX0pBQ0tfT0NfSFBIUjsKKwkJd2NkOXh4eF9qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAorCQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzLCBXQ0Q5WFhYX0pBQ0tfTUFTSyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfYWNkYl9tY2xrX2luZGV4KGNvbnN0IGludCByYXRlKQoreworCWlmIChyYXRlID09IE1DTEtfUkFURV8xMjI4OEtIWikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocmF0ZSA9PSBNQ0xLX1JBVEVfOTYwMEtIWikKKwkJcmV0dXJuIDE7CisJZWxzZSB7CisJCUJVR19PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3VwZGF0ZV9tYmhjX2Nsa19yYXRlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHUzMiByYXRlKQoreworCXUzMiBkY2Vfd2FpdCwgc3RhX3dhaXQ7CisJdTggbmNpYywgbm1lYXMsIG5hdmc7CisJdm9pZCAqY2FsaWJyYXRpb247CisJdTggKm5fY2ljLCAqbl9yZWFkeTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0OworCXU4IG5wb2xsID0gNCwgbmJvdW5jZV93YWl0ID0gMzA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisJaW50IGlkeCA9IHdjZDl4eHhfYWNkYl9tY2xrX2luZGV4KHJhdGUpOworCWludCBpZHhtY2xrID0gd2NkOXh4eF9hY2RiX21jbGtfaW5kZXgobWJoYy0+bWJoY19jZmctPm1jbGtfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IFVwZGF0aW5nIGNsb2NrIHJhdGUgZGVwZW5kZW50cywgcmF0ZSA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJIHJhdGUpOworCWNhbGlicmF0aW9uID0gbWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uOworCisJLyoKKwkgKiBGaXJzdCBjb21wdXRlIHRoZSBEQ0UgLyBTVEEgd2FpdCB0aW1lcyBkZXBlbmRpbmcgb24gdHVuYWJsZQorCSAqIHBhcmFtZXRlcnMuIFRoZSB2YWx1ZSBpcyBjb21wdXRlZCBpbiBtaWNyb3NlY29uZHMKKwkgKi8KKwlidG5fZGV0ID0gV0NEOVhYWF9NQkhDX0NBTF9CVE5fREVUX1BUUihjYWxpYnJhdGlvbik7CisJbl9yZWFkeSA9IHdjZDl4eHhfbWJoY19jYWxfYnRuX2RldF9tcChidG5fZGV0LCBNQkhDX0JUTl9ERVRfTl9SRUFEWSk7CisJbl9jaWMgPSB3Y2Q5eHh4X21iaGNfY2FsX2J0bl9kZXRfbXAoYnRuX2RldCwgTUJIQ19CVE5fREVUX05fQ0lDKTsKKwlubWVhcyA9IFdDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaWJyYXRpb24pLT5uX21lYXM7CisJbmF2ZyA9IFdDRDlYWFhfTUJIQ19DQUxfR0VORVJBTF9QVFIoY2FsaWJyYXRpb24pLT5tYmhjX25hdmc7CisKKwkvKiBuY2ljIHN0YXlzIHdpdGggdGhlIHNhbWUgd2hhdCB3ZSBoYWQgZHVyaW5nIGNhbGlicmF0aW9uICovCisJbmNpYyA9IG5fY2ljW2lkeG1jbGtdOworCWRjZV93YWl0ID0gKDEwMDAgKiA1MTIgKiBuY2ljICogKG5tZWFzICsgMSkpIC8gKHJhdGUgLyAxMDAwKTsKKwlzdGFfd2FpdCA9ICgxMDAwICogMTI4ICogKG5hdmcgKyAxKSkgLyAocmF0ZSAvIDEwMDApOworCW1iaGMtPm1iaGNfZGF0YS50X2RjZSA9IGRjZV93YWl0OworCS8qIGdpdmUgZXh0cmEgbWFyZ2luIHRvIHN0YSBmb3Igc2FmZXR5ICovCisJbWJoYy0+bWJoY19kYXRhLnRfc3RhID0gc3RhX3dhaXQgKyAyNTA7CisJbWJoYy0+bWJoY19kYXRhLnRfc3RhX2RjZSA9ICgoMTAwMCAqIDI1NikgLyAocmF0ZSAvIDEwMDApICoKKwkJCQkgICAgIG5fcmVhZHlbaWR4XSkgKyAxMDsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CMV9DVEwsIG5fcmVhZHlbaWR4XSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0I2X0NUTCwgbmNpYyk7CisKKwlpZiAocmF0ZSA9PSBNQ0xLX1JBVEVfMTIyODhLSFopIHsKKwkJbnBvbGwgPSA0OworCQluYm91bmNlX3dhaXQgPSAzMDsKKwl9IGVsc2UgaWYgKHJhdGUgPT0gTUNMS19SQVRFXzk2MDBLSFopIHsKKwkJbnBvbGwgPSAzOworCQluYm91bmNlX3dhaXQgPSAyMzsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjJfQ1RMLCBucG9sbCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX1RJTUVSX0IzX0NUTCwgbmJvdW5jZV93YWl0KTsKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfbWJoY19jYWwoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwl1OCBjZmlsdF9tb2RlOworCXUxNiByZWcwLCByZWcxLCByZWcyOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCXdjZDl4eHhfZGlzYWJsZV9pcnEobWJoYy0+cmVzbWdyLT5jb3JlX3JlcywKKwkJCSAgICBtYmhjLT5pbnRyX2lkcy0+ZGNlX2VzdF9jb21wbGV0ZSk7CisJd2NkOXh4eF90dXJuX29ub2ZmX3JlbF9kZXRlY3Rpb24oY29kZWMsIGZhbHNlKTsKKworCS8qIHRfZGNlIGFuZCB0X3N0YSBhcmUgdXBkYXRlZCBieSB3Y2Q5eHh4X3VwZGF0ZV9tYmhjX2Nsa19yYXRlKCkgKi8KKwlXQVJOX09OKCFtYmhjLT5tYmhjX2RhdGEudF9kY2UpOworCVdBUk5fT04oIW1iaGMtPm1iaGNfZGF0YS50X3N0YSk7CisKKwkvKgorCSAqIExET0ggYW5kIENGSUxUIGFyZSBhbHJlYWR5IGNvbmZpZ3VyZWQgZHVyaW5nIHBkYXRhIGhhbmRsaW5nLgorCSAqIE9ubHkgbmVlZCB0byBtYWtlIHN1cmUgQ0ZJTFQgYW5kIGJhbmRnYXAgYXJlIGluIEZhc3QgbW9kZS4KKwkgKiBOZWVkIHRvIHJlc3RvcmUgZGVmYXVsdHMgb25jZSBjYWxjdWxhdGlvbiBpcyBkb25lLgorCSAqCisJICogSW4gY2FzZSB3aGVuIE1pY2JpYXMgaXMgcG93ZXJlZCBieSBleHRlcm5hbCBzb3VyY2UsIHJlcXVlc3QKKwkgKiB0dXJuIG9uIHRoZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSBmb3IgQ2FsaWJyYXRpb24uCisJICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZSkKKwkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZShjb2RlYywgdHJ1ZSwgZmFsc2UpOworCisJY2ZpbHRfbW9kZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY2ZpbHRfY3RsKTsKKwlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5jZmlsdF9mYXN0X21vZGUpCisJCW1iaGMtPm1iaGNfY2ItPmNmaWx0X2Zhc3RfbW9kZShjb2RlYywgbWJoYyk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5jZmlsdF9jdGwsCisJCQkJICAgIDB4NDAsIDB4MDApOworCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+bWljYmlhc19wdWxsZG93bl9jdHJsKQorCQltYmhjLT5tYmhjX2NiLT5taWNiaWFzX3B1bGxkb3duX2N0cmwobWJoYywgZmFsc2UpOworCisJLyoKKwkgKiBNaWNiaWFzLCBDRklMVCwgTERPSCwgTUJIQyBNVVggbW9kZSBzZXR0aW5ncworCSAqIHRvIHBlcmZvcm0gQURDIGNhbGlicmF0aW9uCisJICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+c2VsZWN0X2NmaWx0KQorCQltYmhjLT5tYmhjX2NiLT5zZWxlY3RfY2ZpbHQoY29kZWMsIG1iaGMpOworCWVsc2UKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtYmhjLT5tYmhjX2JpYXNfcmVncy5jdGxfcmVnLCAweDYwLAorCQkJICAgIG1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzIDw8IDUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsIDB4MDEsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9MRE9fSF9NT0RFXzEsIDB4NjAsIDB4NjApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9UWF83X01CSENfVEVTVF9DVEwsIDB4NzgpOworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmNvZGVjX3NwZWNpZmljX2NhbCkKKwkJbWJoYy0+bWJoY19jYi0+Y29kZWNfc3BlY2lmaWNfY2FsKGNvZGVjLCBtYmhjKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsCisJCQkJICAgIDB4MDQsIDB4MDQpOworCisJLyogUHVsbCBkb3duIG1pY2JpYXMgdG8gZ3JvdW5kICovCisJcmVnMCA9IHNuZF9zb2NfcmVhZChjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZyk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywgMSwgMSk7CisJLyogRGlzY29ubmVjdCBvdmVycmlkZSBmcm9tIG1pY2JpYXMgKi8KKwlyZWcxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLCAxIDw8IDQsIDEgPDwgMCk7CisJLyogQ29ubmVjdCB0aGUgTVVYIHRvIG1pY2JpYXMgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLCAweDAyKTsKKwlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2spCisJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tdXhfYmlhc19ibG9jayhjb2RlYyk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLAorCQkJCSAgICAweDgwLCAweDgwKTsKKwkvKgorCSAqIEhhcmR3YXJlIHRoYXQgaGFzIGV4dGVybmFsIGNhcCBjYW4gZGVsYXkgbWljIGJpYXMgcmFtcGluZyBkb3duIHVwCisJICogdG8gNTBtcy4KKwkgKi8KKwltc2xlZXAoV0NEOVhYWF9NVVhfU1dJVENIX1JFQURZX1dBSVRfTVMpOworCS8qIERDRSBtZWFzdXJlbWVudCBmb3IgMCB2b2x0YWdlICovCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4MEEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweDAyKTsKKwltYmhjLT5tYmhjX2RhdGEuZGNlX3ogPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAxLCB0cnVlLCBmYWxzZSk7CisKKwkvKiBjb21wdXRlIGRjZV96IGZvciBjdXJyZW50IHNvdXJjZSAqLworCXJlZzIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIDB4NzgsCisJCQkgICAgV0NEOVhYWF9NQkhDX05TQ19DUyA8PCAzKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweDBBKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHgwMik7CisJbWJoYy0+bWJoY19kYXRhLmRjZV9uc2NfY3NfeiA9IF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDEsIHRydWUsCisJCQkJCQkJICAgICAgIGZhbHNlKTsKKwlwcl9kZWJ1ZygiJXM6IGRjZV96IHdpdGggbnNjIGNzOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkJCSBtYmhjLT5tYmhjX2RhdGEuZGNlX25zY19jc196KTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIHJlZzIpOworCisJLyogU1RBIG1lYXN1cmVtZW50IGZvciAwIHZvbHRhZ2UgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHgwQSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4MDIpOworCW1iaGMtPm1iaGNfZGF0YS5zdGFfeiA9IF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDAsIHRydWUsIGZhbHNlKTsKKworCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJc25kX3NvY193cml0ZShjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywgcmVnMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTCwgcmVnMSk7CisKKwkvKiBEQ0UgbWVhc3VybWVudCBmb3IgTUIgdm9sdGFnZSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweDBBKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHgwMik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwgMHgwMik7CisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKQorCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2soY29kZWMpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJLyoKKwkgKiBIYXJkd2FyZSB0aGF0IGhhcyBleHRlcm5hbCBjYXAgY2FuIGRlbGF5IG1pYyBiaWFzIHJhbXBpbmcgZG93biB1cAorCSAqIHRvIDUwbXMuCisJICovCisJbXNsZWVwKFdDRDlYWFhfTVVYX1NXSVRDSF9SRUFEWV9XQUlUX01TKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMLCAweDA0KTsKKwl1c2xlZXBfcmFuZ2UobWJoYy0+bWJoY19kYXRhLnRfZGNlLCBtYmhjLT5tYmhjX2RhdGEudF9kY2UgKworCQkJCQlXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCW1iaGMtPm1iaGNfZGF0YS5kY2VfbWIgPSB3Y2Q5eHh4X3JlYWRfZGNlX3Jlc3VsdChjb2RlYyk7CisKKwkvKiBTVEEgTWVhc3VyZW1lbnQgZm9yIE1CIFZvbHRhZ2UgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQ0xLX0NUTCwgMHgwQSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHgwMik7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4MDIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4MDIpOworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tdXhfYmlhc19ibG9jaykKKwkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKGNvZGVjKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsCisJCQkJICAgIDB4ODAsIDB4ODApOworCS8qCisJICogSGFyZHdhcmUgdGhhdCBoYXMgZXh0ZXJuYWwgY2FwIGNhbiBkZWxheSBtaWMgYmlhcyByYW1waW5nIGRvd24gdXAKKwkgKiB0byA1MG1zLgorCSAqLworCW1zbGVlcChXQ0Q5WFhYX01VWF9TV0lUQ0hfUkVBRFlfV0FJVF9NUyk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHgwMik7CisJdXNsZWVwX3JhbmdlKG1iaGMtPm1iaGNfZGF0YS50X3N0YSwgbWJoYy0+bWJoY19kYXRhLnRfc3RhICsKKwkJCQkJV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwltYmhjLT5tYmhjX2RhdGEuc3RhX21iID0gd2NkOXh4eF9yZWFkX3N0YV9yZXN1bHQoY29kZWMpOworCisJLyogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzLiAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIDB4MDQsIDB4MDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmNmaWx0X2N0bCwgY2ZpbHRfbW9kZSk7CisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwgMHgwNCk7CisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKQorCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2soY29kZWMpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkgICAgMHg4MCwgMHg4MCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UpCisJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisKKwlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX3B1bGxkb3duX2N0cmwpCisJCW1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfcHVsbGRvd25fY3RybChtYmhjLCB0cnVlKTsKKworCXdjZDl4eHhfZW5hYmxlX2lycShtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzLAorCQkJICAgbWJoYy0+aW50cl9pZHMtPmRjZV9lc3RfY29tcGxldGUpOworCXdjZDl4eHhfdHVybl9vbm9mZl9yZWxfZGV0ZWN0aW9uKGNvZGVjLCB0cnVlKTsKKworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9tYmhjX3NldHVwKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJaW50IG47CisJdTggKmdhaW47CisJc3RydWN0IHdjZDl4eHhfbWJoY19nZW5lcmFsX2NmZyAqZ2VuZXJpYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCWNvbnN0IGludCBpZHggPSB3Y2Q5eHh4X2FjZGJfbWNsa19pbmRleChtYmhjLT5tYmhjX2NmZy0+bWNsa19yYXRlKTsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlnZW5lcmljID0gV0NEOVhYWF9NQkhDX0NBTF9HRU5FUkFMX1BUUihtYmhjLT5tYmhjX2NmZy0+Y2FsaWJyYXRpb24pOworCWJ0bl9kZXQgPSBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7CisKKwlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19GSVJfQjFfQ0ZHLAorCQkJCSAgICAweDA3LCBuKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0ZJUl9CMl9DRkcsCisJCQkgICAgICBidG5fZGV0LT5jW25dKTsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjJfQ1RMLCAweDA3LAorCQkJICAgIGJ0bl9kZXQtPm5jKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CNF9DVEwsIDB4NzAsCisJCQkgICAgZ2VuZXJpYy0+bWJoY19uc2EgPDwgNCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjRfQ1RMLCAweDBGLAorCQkJICAgIGJ0bl9kZXQtPm5fbWVhcyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfVElNRVJfQjVfQ1RMLAorCQkgICAgICBnZW5lcmljLT5tYmhjX25hdmcpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0IxX0NUTCwgMHg4MCwgMHg4MCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMLCAweDc4LAorCQkJICAgIGJ0bl9kZXQtPm1iaGNfbnNjIDw8IDMpOworCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+Z2V0X2NkY190eXBlICYmCisJCQltYmhjLT5tYmhjX2NiLT5nZXRfY2RjX3R5cGUoKSAhPQorCQkJCQlXQ0Q5WFhYX0NEQ19UWVBFX0hFTElDT04pIHsKKwkJaWYgKG1iaGMtPnJlc21nci0+cmVnX2FkZHItPm1pY2JfNF9tYmhjKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJbWJoYy0+cmVzbWdyLT5yZWdfYWRkci0+bWljYl80X21iaGMsCisJCQkJCTB4MDMsIE1CSENfTUlDQklBUzIpOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsIDB4MDIsIDB4MDIpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMiwgMHhGMCwgMHhGMCk7CisKKwlnYWluID0gd2NkOXh4eF9tYmhjX2NhbF9idG5fZGV0X21wKGJ0bl9kZXQsIE1CSENfQlROX0RFVF9HQUlOKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjJfQ1RMLCAweDc4LAorCQkJICAgIGdhaW5baWR4XSA8PCAzKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUlDQl8yX01CSEMsIDB4MDQsIDB4MDQpOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfc2V0dXBfamFja19kZXRlY3RfaXJxKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqY29yZV9yZXMgPSBtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzOworCisJaWYgKG1iaGMtPm1iaGNfY2ZnLT5ncGlvKSB7CisJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKG1iaGMtPm1iaGNfY2ZnLT5ncGlvX2lycSwgTlVMTCwKKwkJCQkJICAgd2NkOXh4eF9tZWNoX3BsdWdfZGV0ZWN0X2lycSwKKwkJCQkJICAgKElSUUZfVFJJR0dFUl9SSVNJTkcgfAorCQkJCQkgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcpLAorCQkJCQkgICAiaGVhZHNldCBkZXRlY3QiLCBtYmhjKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIG1iaGMtPm1iaGNfY2ZnLT5ncGlvX2lycSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBlbmFibGVfaXJxX3dha2UobWJoYy0+bWJoY19jZmctPmdwaW9faXJxKTsKKwkJCWlmIChyZXQpCisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSB3YWtlIHVwIGlycSAlZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIG1iaGMtPm1iaGNfY2ZnLT5ncGlvX2lycSk7CisJCX0KKwl9IGVsc2UgaWYgKG1iaGMtPm1iaGNfY2ZnLT5pbnNlcnRfZGV0ZWN0KSB7CisJCS8qIEVuYWJsZSBIUEhMXzEwS19TVyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX09DUF9DVEwsCisJCQkJICAgIDEgPDwgMSwgMSA8PCAxKTsKKworCQlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLAorCQkJCQkgIG1iaGMtPmludHJfaWRzLT5oc19qYWNrX3N3aXRjaCwKKwkJCQkJICB3Y2Q5eHh4X21lY2hfcGx1Z19kZXRlY3RfaXJxLAorCQkJCQkgICJKYWNrIERldGVjdCIsCisJCQkJCSAgbWJoYyk7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpbnNlcnQgZGV0ZWN0IGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWJoYy0+aW50cl9pZHMtPmhzX2phY2tfc3dpdGNoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfaW5pdF9hbmRfY2FsaWJyYXRlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBFbmFibGUgTUNMSyBkdXJpbmcgY2FsaWJyYXRpb24gKi8KKwl3Y2Q5eHh4X29ub2ZmX2V4dF9tY2xrKG1iaGMsIHRydWUpOworCXdjZDl4eHhfbWJoY19zZXR1cChtYmhjKTsKKwl3Y2Q5eHh4X21iaGNfY2FsKG1iaGMpOworCXdjZDl4eHhfbWJoY19jYWxjX3RocmVzKG1iaGMpOworCXdjZDl4eHhfb25vZmZfZXh0X21jbGsobWJoYywgZmFsc2UpOworCXdjZDl4eHhfY2FsaWJyYXRlX2hzX3BvbGxpbmcobWJoYyk7CisKKwkvKiBFbmFibGUgTWljIEJpYXMgcHVsbCBkb3duIGFuZCBIUEggU3dpdGNoIHRvIEdORCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsIDB4MDEsIDB4MDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX0hQSCwgMHgwMSwgMHgwMSk7CisJSU5JVF9XT1JLKCZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCwgd2NkOXh4eF9jb3JyZWN0X3N3Y2hfcGx1Zyk7CisKKwlpZiAoIUlTX0VSUl9WQUxVRShyZXQpKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHgxMCwKKwkJCQkgICAgMHgxMCk7CisJCXdjZDl4eHhfZW5hYmxlX2lycShtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzLAorCQkJCSAgIG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3ApOworCQl3Y2Q5eHh4X2VuYWJsZV9pcnEobWJoYy0+cmVzbWdyLT5jb3JlX3JlcywKKwkJCQkgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCk7CisKKwkJLyogSW5pdGlhbGl6ZSBtZWNoYW5pY2FsIG1iaGMgKi8KKwkJcmV0ID0gd2NkOXh4eF9zZXR1cF9qYWNrX2RldGVjdF9pcnEobWJoYyk7CisKKwkJaWYgKCFyZXQgJiYgbWJoYy0+bWJoY19jZmctPmdwaW8pIHsKKwkJCS8qIFJlcXVlc3RlZCB3aXRoIElSUUZfRElTQUJMRUQgKi8KKwkJCWVuYWJsZV9pcnEobWJoYy0+bWJoY19jZmctPmdwaW9faXJxKTsKKworCQkJLyogQm9vdHVwIHRpbWUgZGV0ZWN0aW9uICovCisJCQl3Y2Q5eHh4X3N3Y2hfaXJxX2hhbmRsZXIobWJoYyk7CisJCX0gZWxzZSBpZiAoIXJldCAmJiBtYmhjLT5tYmhjX2NmZy0+aW5zZXJ0X2RldGVjdCkgeworCQkJcHJfZGVidWcoIiVzOiBTZXR0aW5nIHVwIGNvZGVjIG93biBpbnNlcnQgZGV0ZWN0aW9uXG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQkvKiBTZXR1cCBmb3IgaW5zZXJ0aW9uIGRldGVjdGlvbiAqLworCQkJd2NkOXh4eF9pbnNlcnRfZGV0ZWN0X3NldHVwKG1iaGMsIHRydWUpOworCQl9CisJfQorCisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9tYmhjX2Z3X3JlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOworCXN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqZndfZGF0YSA9IE5VTEw7CisJaW50IHJldCA9IC0xLCByZXRyeSA9IDA7CisJYm9vbCB1c2VfZGVmYXVsdF9jYWwgPSBmYWxzZTsKKworCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCW1iaGMgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2Q5eHh4X21iaGMsIG1iaGNfZmlybXdhcmVfZHdvcmspOworCWNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwl3aGlsZSAocmV0cnkgPCBGV19SRUFEX0FUVEVNUFRTKSB7CisJCXJldHJ5Kys7CisJCXByX2luZm8oIiVzOkF0dGVtcHQgJWQgdG8gcmVxdWVzdCBNQkhDIGZpcm13YXJlXG4iLAorCQkJCV9fZnVuY19fLCByZXRyeSk7CisJCWlmIChtYmhjLT5tYmhjX2NiLT5nZXRfaHdkZXBfZndfY2FsKQorCQkJZndfZGF0YSA9IG1iaGMtPm1iaGNfY2ItPmdldF9od2RlcF9md19jYWwoY29kZWMsCisJCQkJCVdDRDlYWFhfTUJIQ19DQUwpOworCQlpZiAoIWZ3X2RhdGEpCisJCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgIndjZDkzMjAvd2NkOTMyMF9tYmhjLmJpbiIsCisJCQkJCWNvZGVjLT5kZXYpOworCQkvKgorCQkgKiBpZiByZXF1ZXN0X2Zpcm13YXJlIGFuZCBod2RlcCBjYWwgYm90aCBmYWlsIHRoZW4KKwkJICogcmV0cnkgZm9yIGZldyB0aW1lcyBiZWZvcmUgYmFpbGluZyBvdXQKKwkJICovCisJCWlmICgocmV0ICE9IDApICYmICFmd19kYXRhKSB7CisJCQl1c2xlZXBfcmFuZ2UoRldfUkVBRF9USU1FT1VULCBGV19SRUFEX1RJTUVPVVQgKworCQkJCQlXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQl9IGVsc2UgeworCQkJcHJfaW5mbygiJXM6IE1CSEMgRmlybXdhcmUgcmVhZCBzdWNjZXNzZnVsXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWZ3X2RhdGEpCisJCXByX2luZm8oIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlXG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQlwcl9pbmZvKCIlczogdXNpbmcgaHdkZXAgY2FsXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHJldCAhPSAwICYmICFmd19kYXRhKSB7CisJCXByX2VycigiJXM6IENhbm5vdCBsb2FkIE1CSEMgZmlybXdhcmUgdXNlIGRlZmF1bHQgY2FsXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJdXNlX2RlZmF1bHRfY2FsID0gdHJ1ZTsKKwl9CisJaWYgKCF1c2VfZGVmYXVsdF9jYWwpIHsKKwkJY29uc3Qgdm9pZCAqZGF0YTsKKwkJc2l6ZV90IHNpemU7CisKKwkJaWYgKGZ3X2RhdGEpIHsKKwkJCWRhdGEgPSBmd19kYXRhLT5kYXRhOworCQkJc2l6ZSA9IGZ3X2RhdGEtPnNpemU7CisJCX0gZWxzZSB7CisJCQlkYXRhID0gZnctPmRhdGE7CisJCQlzaXplID0gZnctPnNpemU7CisJCX0KKwkJaWYgKHdjZDl4eHhfbWJoY19md192YWxpZGF0ZShkYXRhLCBzaXplKSA9PSBmYWxzZSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBNQkhDIGNhbCBkYXRhIHNpemUgdXNlIGRlZmF1bHQgY2FsXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWlmICghZndfZGF0YSkKKwkJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmd19kYXRhKSB7CisJCQkJbWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uID0KKwkJCQkJCSh2b2lkICopZndfZGF0YS0+ZGF0YTsKKwkJCQltYmhjLT5tYmhjX2NhbCA9IGZ3X2RhdGE7CisJCQl9IGVsc2UgeworCQkJCW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9CisJCQkJCQkodm9pZCAqKWZ3LT5kYXRhOworCQkJCW1iaGMtPm1iaGNfZncgPSBmdzsKKwkJCX0KKwkJfQorCX0KKworCSh2b2lkKSB3Y2Q5eHh4X2luaXRfYW5kX2NhbGlicmF0ZShtYmhjKTsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3NpemVfdCBjb2RlY19tYmhjX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCWNvbnN0IGludCBzaXplID0gNzY4OworCWNoYXIgYnVmZmVyW3NpemVdOworCWludCBuID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBtYmhjX2ludGVybmFsX2NhbF9kYXRhICpwID0gJm1iaGMtPm1iaGNfZGF0YTsKKwljb25zdCBzMTYgdl9pbnNfaHUgPQorCSAgICB3Y2Q5eHh4X2dldF9jdXJyZW50X3YobWJoYywgV0NEOVhYWF9DVVJSRU5UX1ZfSU5TX0hVKTsKKwljb25zdCBzMTYgdl9pbnNfaCA9CisJICAgIHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9JTlNfSCk7CisJY29uc3QgczE2IHZfYjFfaHUgPQorCSAgICB3Y2Q5eHh4X2dldF9jdXJyZW50X3YobWJoYywgV0NEOVhYWF9DVVJSRU5UX1ZfQjFfSFUpOworCWNvbnN0IHMxNiB2X2IxX2ggPQorCSAgICB3Y2Q5eHh4X2dldF9jdXJyZW50X3YobWJoYywgV0NEOVhYWF9DVVJSRU5UX1ZfQjFfSCk7CisJY29uc3QgczE2IHZfYnJfaCA9CisJICAgIHdjZDl4eHhfZ2V0X2N1cnJlbnRfdihtYmhjLCBXQ0Q5WFhYX0NVUlJFTlRfVl9CUl9IKTsKKworCW4gPSBzY25wcmludGYoYnVmZmVyLCBzaXplIC0gbiwgImRjZV96ID0gJXgoJWRtdilcbiIsCisJCSAgICAgIHAtPmRjZV96LCB3Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAxLCBwLT5kY2VfeikpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIHNpemUgLSBuLCAiZGNlX21iID0gJXgoJWRtdilcbiIsCisJCSAgICAgICBwLT5kY2VfbWIsIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIHAtPmRjZV9tYikpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIHNpemUgLSBuLCAiZGNlX25zY19jc196ID0gJXgoJWRtdilcbiIsCisJCSAgICAgIHAtPmRjZV9uc2NfY3NfeiwKKwkJICAgICAgX193Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAxLCBwLT5kY2VfbnNjX2NzX3osCisJCQkJCQlwLT5kY2VfbnNjX2NzX3osCisJCQkJCQlWRERJT19NSUNCSUFTX01WKSk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgc2l6ZSAtIG4sICJzdGFfeiA9ICV4KCVkbXYpXG4iLAorCQkgICAgICAgcC0+c3RhX3osIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDAsIHAtPnN0YV96KSk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgc2l6ZSAtIG4sICJzdGFfbWIgPSAleCglZG12KVxuIiwKKwkJICAgICAgIHAtPnN0YV9tYiwgd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgMCwgcC0+c3RhX21iKSk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgc2l6ZSAtIG4sICJ0X2RjZSA9ICVkXG4iLCAgcC0+dF9kY2UpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIHNpemUgLSBuLCAidF9zdGEgPSAlZFxuIiwgIHAtPnRfc3RhKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgIm1pY2JfbXYgPSAlZG12XG4iLCBwLT5taWNiX212KTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfaW5zX2h1ID0gJXgoJWRtdilcbiIsCisJCSAgICAgICB2X2luc19odSwgd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgMCwgdl9pbnNfaHUpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfaW5zX2ggPSAleCglZG12KVxuIiwKKwkJICAgICAgIHZfaW5zX2gsIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIHZfaW5zX2gpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfYjFfaHUgPSAleCglZG12KVxuIiwKKwkJICAgICAgIHZfYjFfaHUsIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDAsIHZfYjFfaHUpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfYjFfaCA9ICV4KCVkbXYpXG4iLAorCQkgICAgICAgdl9iMV9oLCB3Y2Q5eHh4X2NvZGVjX3N0YV9kY2VfdihtYmhjLCAxLCB2X2IxX2gpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfYnJoID0gJXgoJWRtdilcbiIsCisJCSAgICAgICB2X2JyX2gsIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDEsIHZfYnJfaCkpOworCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIHNpemUgLSBuLCAidl9icmwgPSAleCglZG12KVxuIiwgIHAtPnZfYnJsLAorCQkgICAgICAgd2NkOXh4eF9jb2RlY19zdGFfZGNlX3YobWJoYywgMCwgcC0+dl9icmwpKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgInZfbm9fbWljID0gJXgoJWRtdilcbiIsCisJCSAgICAgICBwLT52X25vX21pYywKKwkJICAgICAgIHdjZDl4eHhfY29kZWNfc3RhX2RjZV92KG1iaGMsIDAsIHAtPnZfbm9fbWljKSk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgc2l6ZSAtIG4sICJ2X2ludmFsX2luc19sb3cgPSAlZFxuIiwKKwkJICAgICAgIHAtPnZfaW52YWxfaW5zX2xvdyk7CisJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgc2l6ZSAtIG4sICJ2X2ludmFsX2luc19oaWdoID0gJWRcbiIsCisJCSAgICAgICBwLT52X2ludmFsX2luc19oaWdoKTsKKwluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBzaXplIC0gbiwgIkluc2VydCBkZXRlY3QgaW5zZXJ0ID0gJWRcbiIsCisJCSAgICAgICAhd2NkOXh4eF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSk7CisJYnVmZmVyW25dID0gMDsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwb3MsIGJ1ZmZlciwgbik7Cit9CisKK3N0YXRpYyBpbnQgY29kZWNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBjb2RlY19kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsCisJCQkJIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGxidWZbMzJdOworCWNoYXIgKmJ1ZjsKKwlpbnQgcmM7CisJc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChjbnQgPiBzaXplb2YobGJ1ZikgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKKwlpZiAocmMpCisJCXJldHVybiAtRUZBVUxUOworCisJbGJ1ZltjbnRdID0gJ1wwJzsKKwlidWYgPSAoY2hhciAqKWxidWY7CisJbWJoYy0+bm9fbWljX2hlYWRzZXRfb3ZlcnJpZGUgPSAoKnN0cnNlcCgmYnVmLCAiICIpID09ICcwJykgPworCQkJCQkgICAgIGZhbHNlIDogdHJ1ZTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1iaGNfdHJyc19kZWJ1Z19vcHMgPSB7CisJLm9wZW4gPSBjb2RlY19kZWJ1Z19vcGVuLAorCS53cml0ZSA9IGNvZGVjX2RlYnVnX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWJoY19kZWJ1Z19vcHMgPSB7CisJLm9wZW4gPSBjb2RlY19kZWJ1Z19vcGVuLAorCS5yZWFkID0gY29kZWNfbWJoY19kZWJ1Z19yZWFkLAorfTsKKworc3RhdGljIHZvaWQgd2NkOXh4eF9pbml0X2RlYnVnZnMoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwltYmhjLT5kZWJ1Z2ZzX3Bva2UgPQorCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJUUlJTIiwgU19JRlJFRyB8IDA0NDQsIE5VTEwsIG1iaGMsCisJCQkJJm1iaGNfdHJyc19kZWJ1Z19vcHMpOworCW1iaGMtPmRlYnVnZnNfbWJoYyA9CisJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoIndjZDl4eHhfbWJoYyIsIFNfSUZSRUcgfCAwNDQ0LAorCQkJCU5VTEwsIG1iaGMsICZtYmhjX2RlYnVnX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2xlYW51cF9kZWJ1Z2ZzKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJZGVidWdmc19yZW1vdmUobWJoYy0+ZGVidWdmc19wb2tlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShtYmhjLT5kZWJ1Z2ZzX21iaGMpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHdjZDl4eHhfaW5pdF9kZWJ1Z2ZzKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfY2xlYW51cF9kZWJ1Z2ZzKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7Cit9CisjZW5kaWYKKworaW50IHdjZDl4eHhfbWJoY19zZXRfa2V5Y29kZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKQoreworCWVudW0gc25kX2phY2tfdHlwZXMgdHlwZSA9IFNORF9KQUNLX0JUTl8wOworCWludCBpLCByZXQsIHJlc3VsdCA9IDA7CisJaW50ICpidG5fa2V5X2NvZGU7CisKKwlidG5fa2V5X2NvZGUgPSBtYmhjLT5tYmhjX2NmZy0+a2V5X2NvZGU7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJaWYgKGJ0bl9rZXlfY29kZVtpXSAhPSAwKSB7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgMDoKKwkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdHlwZSA9IFNORF9KQUNLX0JUTl8xOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzM7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJdHlwZSA9IFNORF9KQUNLX0JUTl80OworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fNTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJV0FSTl9PTkNFKDEsICJXcm9uZyBidXR0b24gbnVtYmVyOiVkXG4iLCBpKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHNuZF9qYWNrX3NldF9rZXkobWJoYy0+YnV0dG9uX2phY2suamFjaywKKwkJCQkJICAgICAgIHR5cGUsCisJCQkJCSAgICAgICBidG5fa2V5X2NvZGVbaV0pOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY29kZSBmb3IgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBidG5fa2V5X2NvZGVbaV0pOworCQkJCXJlc3VsdCA9IC0xOworCQkJfQorCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoCisJCQkJbWJoYy0+YnV0dG9uX2phY2suamFjay0+aW5wdXRfZGV2LAorCQkJCUVWX0tFWSwgYnRuX2tleV9jb2RlW2ldKTsKKwkJCXByX2RlYnVnKCIlczogc2V0IGJ0biVkIGtleSBjb2RlOiVkXG4iLCBfX2Z1bmNfXywKKwkJCQlpLCBidG5fa2V5X2NvZGVbaV0pOworCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCB3Y2Q5eHh4X21iaGNfc3RhcnQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJICAgICAgIHN0cnVjdCB3Y2Q5eHh4X21iaGNfY29uZmlnICptYmhjX2NmZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzOiBubyBjb2RlY1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWJoY19jZmctPm1jbGtfcmF0ZSAhPSBNQ0xLX1JBVEVfMTIyODhLSFogJiYKKwkgICAgbWJoY19jZmctPm1jbGtfcmF0ZSAhPSBNQ0xLX1JBVEVfOTYwMEtIWikgeworCQlwcl9lcnIoIkVycm9yOiB1bnN1cHBvcnRlZCBjbG9jayByYXRlICVkXG4iLAorCQkgICAgICAgbWJoY19jZmctPm1jbGtfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNhdmUgbWJoYyBjb25maWcgKi8KKwltYmhjLT5tYmhjX2NmZyA9IG1iaGNfY2ZnOworCisJLyogU2V0IGJ0biBrZXkgY29kZSAqLworCWlmICh3Y2Q5eHh4X21iaGNfc2V0X2tleWNvZGUobWJoYykpCisJCXByX2VycigiU2V0IGJ0biBrZXkgY29kZSBlcnJvciEhIVxuIik7CisKKwkvKiBHZXQgSFcgc3BlY2lmaWMgbWJoYyByZWdpc3RlcnMnIGFkZHJlc3MgKi8KKwl3Y2Q5eHh4X2dldF9tYmhjX21pY2JpYXNfcmVncyhtYmhjLCBNQkhDX1BSSU1BUllfTUlDX01CKTsKKworCS8qIEdldCBIVyBzcGVjaWZpYyBtYmhjIHJlZ2lzdGVycycgYWRkcmVzcyBmb3IgYW5jICovCisJd2NkOXh4eF9nZXRfbWJoY19taWNiaWFzX3JlZ3MobWJoYywgTUJIQ19BTkNfTUlDX01CKTsKKworCS8qIFB1dCBDRklMVCBpbiBmYXN0IG1vZGUgYnkgZGVmYXVsdCAqLworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmNmaWx0X2Zhc3RfbW9kZSkKKwkJbWJoYy0+bWJoY19jYi0+Y2ZpbHRfZmFzdF9tb2RlKGNvZGVjLCBtYmhjKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmNmaWx0X2N0bCwKKwkJMHg0MCwgV0NEOVhYWF9DRklMVF9GQVNUX01PREUpOworCisJLyoKKwkgKiBzZXR1cCBpbnRlcm5hbCBtaWNiaWFzIGlmIGNvZGVjIHVzZXMgaW50ZXJuYWwgbWljYmlhcyBmb3IKKwkgKiBoZWFkc2V0IGRldGVjdGlvbgorCSAqLworCWlmIChtYmhjLT5tYmhjX2NmZy0+dXNlX2ludF9yYmlhcykgeworCQlpZiAobWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5zZXR1cF9pbnRfcmJpYXMpIHsKKwkJCW1iaGMtPm1iaGNfY2ItPnNldHVwX2ludF9yYmlhcyhjb2RlYywgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKCIlczogaW50ZXJuYWwgYmlhcyByZXF1ZXN0ZWQgYnV0IGNvZGVjIGRpZCBub3QgcHJvdmlkZSBjYWxsYmFja1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGNvZGVjIGhhcyBzcGVjaWZpYyBjbG9jayBnYXRpbmcgZm9yIE1CSEMsCisJICogcmVtb3ZlIHRoZSBjbG9jayBnYXRlCisJICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYKKwkJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9jbG9ja19nYXRlKQorCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfY2xvY2tfZ2F0ZShtYmhjLT5jb2RlYywgdHJ1ZSk7CisKKwlpZiAoIW1iaGMtPm1iaGNfY2ZnLT5yZWFkX2Z3X2JpbiB8fAorCSAgICAobWJoYy0+bWJoY19jZmctPnJlYWRfZndfYmluICYmIG1iaGMtPm1iaGNfZncpIHx8CisJICAgIChtYmhjLT5tYmhjX2NmZy0+cmVhZF9md19iaW4gJiYgbWJoYy0+bWJoY19jYWwpKSB7CisJCXJjID0gd2NkOXh4eF9pbml0X2FuZF9jYWxpYnJhdGUobWJoYyk7CisJfSBlbHNlIHsKKwkJaWYgKCFtYmhjLT5tYmhjX2Z3IHx8ICFtYmhjLT5tYmhjX2NhbCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWJoYy0+bWJoY19maXJtd2FyZV9kd29yaywKKwkJCQkJICAgICB1c2Vjc190b19qaWZmaWVzKEZXX1JFQURfVElNRU9VVCkpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiJXM6IFNraXBwaW5nIHRvIHJlYWQgbWJoYyBmdywgMHglcEsgJXBLXG4iLAorCQkJCSBfX2Z1bmNfXywgbWJoYy0+bWJoY19mdywgbWJoYy0+bWJoY19jYWwpOworCX0KKworCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X21iaGNfc3RhcnQpOworCit2b2lkIHdjZDl4eHhfbWJoY19zdG9wKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJaWYgKG1iaGMtPm1iaGNfZncgfHwgbWJoYy0+bWJoY19jYWwpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtYmhjLT5tYmhjX2Zpcm13YXJlX2R3b3JrKTsKKwkJaWYgKCFtYmhjLT5tYmhjX2NhbCkKKwkJCXJlbGVhc2VfZmlybXdhcmUobWJoYy0+bWJoY19mdyk7CisJCW1iaGMtPm1iaGNfZncgPSBOVUxMOworCQltYmhjLT5tYmhjX2NhbCA9IE5VTEw7CisJfQorfQorRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X21iaGNfc3RvcCk7CisKK3N0YXRpYyBlbnVtIHdjZDl4eHhfbWljYmlhc19udW0KK3djZDl4eHhfZXZlbnRfdG9fbWljYmlhcyhjb25zdCBlbnVtIHdjZDl4eHhfbm90aWZ5X2V2ZW50IGV2ZW50KQoreworCWVudW0gd2NkOXh4eF9taWNiaWFzX251bSByZXQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzFfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzFfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMV9PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzFfT0ZGOgorCQlyZXQgPSBNQkhDX01JQ0JJQVMxOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMl9PRkY6CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18yX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY6CisJCXJldCA9IE1CSENfTUlDQklBUzI7CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18zX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18zX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzNfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18zX09GRjoKKwkJcmV0ID0gTUJIQ19NSUNCSUFTMzsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzRfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzRfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfNF9PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzRfT0ZGOgorCQlyZXQgPSBNQkhDX01JQ0JJQVM0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIkNhbm5vdCBjb252ZXJ0IGV2ZW50ICVkIHRvIG1pY2JpYXNcbiIsIGV2ZW50KTsKKwkJcmV0ID0gTUJIQ19NSUNCSUFTX0lOVkFMSUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfZXZlbnRfdG9fY2ZpbHQoY29uc3QgZW51bSB3Y2Q5eHh4X25vdGlmeV9ldmVudCBldmVudCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfMV9PRkY6CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfQ0ZJTFRfMV9PRkY6CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8xX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzFfT046CisJCXJldCA9IFdDRDlYWFhfQ0ZJTFQxX1NFTDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8yX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8yX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzJfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfQ0ZJTFRfMl9PTjoKKwkJcmV0ID0gV0NEOVhYWF9DRklMVDJfU0VMOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzNfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzNfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfM19PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8zX09OOgorCQlyZXQgPSBXQ0Q5WFhYX0NGSUxUM19TRUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfZ2V0X21iaGNfY2ZpbHRfc2VsKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCit7CisJaW50IGNmaWx0OworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyAqbWJfcGRhdGEgPQorCQltYmhjLT5yZXNtZ3ItPm1pY2JpYXNfcGRhdGE7CisKKwlzd2l0Y2ggKG1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzKSB7CisJY2FzZSBNQkhDX01JQ0JJQVMxOgorCQljZmlsdCA9IG1iX3BkYXRhLT5iaWFzMV9jZmlsdF9zZWw7CisJCWJyZWFrOworCWNhc2UgTUJIQ19NSUNCSUFTMjoKKwkJY2ZpbHQgPSBtYl9wZGF0YS0+YmlhczJfY2ZpbHRfc2VsOworCQlicmVhazsKKwljYXNlIE1CSENfTUlDQklBUzM6CisJCWNmaWx0ID0gbWJfcGRhdGEtPmJpYXMzX2NmaWx0X3NlbDsKKwkJYnJlYWs7CisJY2FzZSBNQkhDX01JQ0JJQVM0OgorCQljZmlsdCA9IG1iX3BkYXRhLT5iaWFzNF9jZmlsdF9zZWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNmaWx0ID0gTUJIQ19NSUNCSUFTX0lOVkFMSUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY2ZpbHQ7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfZW5hYmxlX21iaGNfdHhmZShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLCBib29sIG9uKQoreworCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYmhjX3R4ZmUpCisJCW1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYmhjX3R4ZmUobWJoYy0+Y29kZWMsIG9uKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWJoYy0+Y29kZWMsIFdDRDlYWFhfQV9UWF83X01CSENfVEVTVF9DVEwsCisJCQkJICAgIDB4NDAsIG9uID8gMHg0MCA6IDB4MDApOworfQorCitzdGF0aWMgaW50IHdjZDl4eHhfZXZlbnRfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjID0gKChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKilkYXRhKS0+bWJoYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJZW51bSB3Y2Q5eHh4X25vdGlmeV9ldmVudCBldmVudCA9IChlbnVtIHdjZDl4eHhfbm90aWZ5X2V2ZW50KXZhbDsKKworCXByX2RlYnVnKCIlczogZW50ZXIgZXZlbnQgJXMoJWQpXG4iLCBfX2Z1bmNfXywKKwkJIHdjZDl4eHhfZ2V0X2V2ZW50X3N0cmluZyhldmVudCksIGV2ZW50KTsKKworCWlmICghbWJoYyB8fCAhbWJoYy0+bWJoY19jZmcpIHsKKwkJcHJfZGVidWcoIm1iaGMgbm90IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWNvZGVjID0gbWJoYy0+Y29kZWM7CisJbXV0ZXhfbG9jaygmbWJoYy0+bWJoY19sb2NrKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJLyogTUlDQklBUyB1c2FnZSBjaGFuZ2UgKi8KKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMV9PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfM19PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfNF9PTjoKKwkJaWYgKG1iaGMtPm1iaGNfY2ZnICYmIG1iaGMtPm1iaGNfY2ZnLT5taWNiaWFzID09CisJCSAgICB3Y2Q5eHh4X2V2ZW50X3RvX21pY2JpYXMoZXZlbnQpKSB7CisJCQl3Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKG1iaGMsIDApOworCQkJLyoKKwkJCSAqIEVuYWJsZSBNQkhDIFR4RkUgd2hlbmV2ZXIgIG1pY2JpYXMgaXMKKwkJCSAqIHR1cm5lZCBPTiBhbmQgcG9sbGluZyBpcyBhY3RpdmUKKwkJCSAqLworCQkJaWYgKG1iaGMtPnBvbGxpbmdfYWN0aXZlKQorCQkJCXdjZDl4eHhfZW5hYmxlX21iaGNfdHhmZShtYmhjLCB0cnVlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzFfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18yX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfM19PTjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzRfT046CisJCWlmIChtYmhjLT5tYmhjX2NmZyAmJiBtYmhjLT5tYmhjX2NmZy0+bWljYmlhcyA9PQorCQkgICAgd2NkOXh4eF9ldmVudF90b19taWNiaWFzKGV2ZW50KSAmJgorCQkgICAgd2NkOXh4eF9tYmhjX3BvbGxpbmcobWJoYykpIHsKKwkJCS8qIGlmIHBvbGxpbmcgaXMgb24sIHJlc3RhcnQgaXQgKi8KKwkJCXdjZDl4eHhfcGF1c2VfaHNfcG9sbGluZyhtYmhjKTsKKwkJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzFfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY6CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18zX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzRfT0ZGOgorCQlpZiAobWJoYy0+bWJoY19jZmcgJiYgbWJoYy0+bWJoY19jZmctPm1pY2JpYXMgPT0KKwkJICAgIHdjZDl4eHhfZXZlbnRfdG9fbWljYmlhcyhldmVudCkpIHsKKwkJCWlmIChtYmhjLT5ldmVudF9zdGF0ZSAmCisJCQkgICAoMSA8PCBNQkhDX0VWRU5UX1BBX0hQSEwgfCAxIDw8IE1CSENfRVZFTlRfUEFfSFBIUikpCisJCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAxKTsKKwkJCS8qCisJCQkgKiBEaXNhYmxlIE1CSEMgVHhGRSwgaW4gY2FzZSBpdCB3YXMgZW5hYmxlZCBlYXJsaWVyCisJCQkgKiB3aGVuIG1pY2JpYXMgd2FzIGVuYWJsZWQgYW5kIHBvbGxpbmcgaXMgbm90IGFjdGl2ZS4KKwkJCSAqLworCQkJaWYgKCFtYmhjLT5wb2xsaW5nX2FjdGl2ZSkKKwkJCQl3Y2Q5eHh4X2VuYWJsZV9tYmhjX3R4ZmUobWJoYywgZmFsc2UpOworCQl9CisJCWlmIChtYmhjLT5taWNiaWFzX2VuYWJsZSAmJiBtYmhjLT5wb2xsaW5nX2FjdGl2ZSAmJgorCQkgICAgIShzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcpCisJCSAgICAmIDB4ODApKSB7CisJCQlwcl9kZWJ1ZygiJXM6TWljYmlhcyB0dXJuZWQgb2ZmIGJ5IHJlY29yZGluZywgc2V0IHVwIGFnYWluIiwKKwkJCQkgX19mdW5jX18pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZywKKwkJCQkJICAgIDB4ODAsIDB4ODApOworCQl9CisJCWJyZWFrOworCS8qIFBBIHVzYWdlIGNoYW5nZSAqLworCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfSFBITF9QQV9PTjoKKwkJc2V0X2JpdChNQkhDX0VWRU5UX1BBX0hQSEwsICZtYmhjLT5ldmVudF9zdGF0ZSk7CisJCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywgbWJoYy0+bWJoY19iaWFzX3JlZ3MuY3RsX3JlZykgJiAweDgwKSkKKwkJCS8qIGlmIG1pY2JpYXMgaXMgbm90IGVuYWJsZWQsIHN3aXRjaCB0byB2ZGRpbyAqLworCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9IUEhSX1BBX09OOgorCQlzZXRfYml0KE1CSENfRVZFTlRfUEFfSFBIUiwgJm1iaGMtPmV2ZW50X3N0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfSFBITF9QQV9PRkY6CisJCWNsZWFyX2JpdChNQkhDX0VWRU5UX1BBX0hQSEwsICZtYmhjLT5ldmVudF9zdGF0ZSk7CisJCS8qIGlmIEhQSCBQQXMgYXJlIG9mZiwgcmVwb3J0IE9DUCBhbmQgc3dpdGNoIGJhY2sgdG8gQ0ZJTFQgKi8KKwkJY2xlYXJfYml0KFdDRDlYWFhfSFBITF9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCWNsZWFyX2JpdChXQ0Q5WFhYX0hQSExfREFDX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKKwkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBTTkRfSkFDS19PQ19IUEhMKQorCQkJaHBobG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwpOworCQlpZiAoIShtYmhjLT5ldmVudF9zdGF0ZSAmCisJCSAgICAgICgxIDw8IE1CSENfRVZFTlRfUEFfSFBITCB8IDEgPDwgTUJIQ19FVkVOVF9QQV9IUEhSIHwKKwkJICAgICAgIDEgPDwgTUJIQ19FVkVOVF9QUkVfVFhfM19PTikpKQorCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfSFBIUl9QQV9PRkY6CisJCWNsZWFyX2JpdChNQkhDX0VWRU5UX1BBX0hQSFIsICZtYmhjLT5ldmVudF9zdGF0ZSk7CisJCS8qIGlmIEhQSCBQQXMgYXJlIG9mZiwgcmVwb3J0IE9DUCBhbmQgc3dpdGNoIGJhY2sgdG8gQ0ZJTFQgKi8KKwkJY2xlYXJfYml0KFdDRDlYWFhfSFBIUl9QQV9PRkZfQUNLLCAmbWJoYy0+aHBoX3BhX2RhY19zdGF0ZSk7CisJCWNsZWFyX2JpdChXQ0Q5WFhYX0hQSFJfREFDX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKKwkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBTTkRfSkFDS19PQ19IUEhSKQorCQkJaHBocm9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwpOworCQlpZiAoIShtYmhjLT5ldmVudF9zdGF0ZSAmCisJCSAgICAgICgxIDw8IE1CSENfRVZFTlRfUEFfSFBITCB8IDEgPDwgTUJIQ19FVkVOVF9QQV9IUEhSIHwKKwkJICAgICAgIDEgPDwgTUJIQ19FVkVOVF9QUkVfVFhfM19PTikpKQorCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAwKTsKKwkJYnJlYWs7CisJLyogQ2xvY2sgdXNhZ2UgY2hhbmdlICovCisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9NQ0xLX09OOgorCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09OOgorCQkvKiBDaGFuZ2UgdG8gbG93ZXIgVHhBQUYgZnJlcXVlbmN5ICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9UWF9DT01fQklBUywgMSA8PCA0LAorCQkJCSAgICAxIDw8IDQpOworCQkvKiBSZS1jYWxpYnJhdGUgY2xvY2sgcmF0ZSBkZXBlbmRlbnQgdmFsdWVzICovCisJCXdjZDl4eHhfdXBkYXRlX21iaGNfY2xrX3JhdGUobWJoYywgbWJoYy0+bWJoY19jZmctPm1jbGtfcmF0ZSk7CisJCS8qIElmIGNsb2NrIHNvdXJjZSBjaGFuZ2VzLCBzdG9wIGFuZCByZXN0YXJ0IHBvbGxpbmcgKi8KKwkJaWYgKHdjZDl4eHhfbWJoY19wb2xsaW5nKG1iaGMpKSB7CisJCQl3Y2Q5eHh4X2NhbGlicmF0ZV9oc19wb2xsaW5nKG1iaGMpOworCQkJd2NkOXh4eF9zdGFydF9oc19wb2xsaW5nKG1iaGMpOworCQl9CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfTUNMS19PRkY6CisJCS8qIElmIGNsb2NrIHNvdXJjZSBjaGFuZ2VzLCBzdG9wIGFuZCByZXN0YXJ0IHBvbGxpbmcgKi8KKwkJaWYgKHdjZDl4eHhfbWJoY19wb2xsaW5nKG1iaGMpKQorCQkJd2NkOXh4eF9wYXVzZV9oc19wb2xsaW5nKG1iaGMpOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09GRjoKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9SQ09fT046CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX1JDT19PTjoKKwkJLyogQ2hhbmdlIHRvIGhpZ2hlciBUeEFBRiBmcmVxdWVuY3kgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1RYX0NPTV9CSUFTLCAxIDw8IDQsCisJCQkJICAgIDAgPDwgNCk7CisJCS8qIFJlLWNhbGlicmF0ZSBjbG9jayByYXRlIGRlcGVuZGVudCB2YWx1ZXMgKi8KKwkJd2NkOXh4eF91cGRhdGVfbWJoY19jbGtfcmF0ZShtYmhjLCBtYmhjLT5yY29fY2xrX3JhdGUpOworCQkvKiBJZiBjbG9jayBzb3VyY2UgY2hhbmdlcywgc3RvcCBhbmQgcmVzdGFydCBwb2xsaW5nICovCisJCWlmICh3Y2Q5eHh4X21iaGNfcG9sbGluZyhtYmhjKSkgeworCQkJd2NkOXh4eF9jYWxpYnJhdGVfaHNfcG9sbGluZyhtYmhjKTsKKwkJCXdjZDl4eHhfc3RhcnRfaHNfcG9sbGluZyhtYmhjKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX1JDT19PRkY6CisJCS8qIElmIGNsb2NrIHNvdXJjZSBjaGFuZ2VzLCBzdG9wIGFuZCByZXN0YXJ0IHBvbGxpbmcgKi8KKwkJaWYgKHdjZDl4eHhfbWJoY19wb2xsaW5nKG1iaGMpKQorCQkJd2NkOXh4eF9wYXVzZV9oc19wb2xsaW5nKG1iaGMpOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9SQ09fT0ZGOgorCQlicmVhazsKKwkvKiBDRklMVCB1c2FnZSBjaGFuZ2UgKi8KKwljYXNlIFdDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzFfT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8yX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfM19PTjoKKwkJaWYgKHdjZDl4eHhfZ2V0X21iaGNfY2ZpbHRfc2VsKG1iaGMpID09CisJCSAgICB3Y2Q5eHh4X2V2ZW50X3RvX2NmaWx0KGV2ZW50KSkKKwkJCS8qCisJCQkgKiBTd2l0Y2ggQ0ZJTFQgdG8gc2xvdyBtb2RlIGlmIE1CSEMgQ0ZJTFQgaXMgYmVpbmcKKwkJCSAqIHVzZWQuCisJCQkgKi8KKwkJCXdjZDl4eHhfY29kZWNfc3dpdGNoX2NmaWx0X21vZGUobWJoYywgZmFsc2UpOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8xX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8yX09GRjoKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8zX09GRjoKKwkJaWYgKHdjZDl4eHhfZ2V0X21iaGNfY2ZpbHRfc2VsKG1iaGMpID09CisJCSAgICB3Y2Q5eHh4X2V2ZW50X3RvX2NmaWx0KGV2ZW50KSkKKwkJCS8qCisJCQkgKiBTd2l0Y2ggQ0ZJTFQgdG8gZmFzdCBtb2RlIGlmIE1CSEMgQ0ZJTFQgaXMgbm90CisJCQkgKiB1c2VkIGFueW1vcmUuCisJCQkgKi8KKwkJCXdjZDl4eHhfY29kZWNfc3dpdGNoX2NmaWx0X21vZGUobWJoYywgdHJ1ZSk7CisJCWJyZWFrOworCS8qIFN5c3RlbSByZXN1bWUgKi8KKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9SRVNVTUU6CisJCW1iaGMtPm1iaGNfbGFzdF9yZXN1bWUgPSBqaWZmaWVzOworCQlicmVhazsKKwkvKiBCRyBtb2RlIGNoYWdlICovCisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9CR19PRkY6CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfQkdfT0ZGOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QUkVfQkdfQVVESU9fT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BPU1RfQkdfQVVESU9fT046CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9CR19NQkhDX09OOgorCWNhc2UgV0NEOVhYWF9FVkVOVF9QT1NUX0JHX01CSENfT046CisJCS8qIE5vdCB1c2VkIGZvciBub3cgKi8KKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0VWRU5UX1BSRV9UWF8zX09OOgorCQkvKgorCQkgKiBpZiBwb2xsaW5nIGlzIE9OLCBtYmhjIG1pY2JpYXMgbm90IGVuYWJsZWQKKwkJICogIHN3aXRjaCBtaWNiaWFzIHNvdXJjZSB0byBWRERJTworCQkgKi8KKwkJc2V0X2JpdChNQkhDX0VWRU5UX1BSRV9UWF8zX09OLCAmbWJoYy0+ZXZlbnRfc3RhdGUpOworCQlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsIG1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcpCisJCSAgICAgICYgMHg4MCkgJiYKKwkJICAgIG1iaGMtPnBvbGxpbmdfYWN0aXZlICYmICFtYmhjLT5tYmhjX21pY2JpYXNfc3dpdGNoZWQpCisJCQl3Y2Q5eHh4X3N3aXRjaF9taWNiaWFzKG1iaGMsIDEpOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfRVZFTlRfUE9TVF9UWF8zX09GRjoKKwkJLyoKKwkJICogU3dpdGNoIGJhY2sgdG8gbWljYmlhcyBpZiBIUEggUEEgb3IgVFgzIHBhdGgKKwkJICogaXMgZGlzYWJsZWQKKwkJICovCisJCWNsZWFyX2JpdChNQkhDX0VWRU5UX1BSRV9UWF8zX09OLCAmbWJoYy0+ZXZlbnRfc3RhdGUpOworCQlpZiAobWJoYy0+cG9sbGluZ19hY3RpdmUgJiYgbWJoYy0+bWJoY19taWNiaWFzX3N3aXRjaGVkICYmCisJCSAgICAhKG1iaGMtPmV2ZW50X3N0YXRlICYgKDEgPDwgTUJIQ19FVkVOVF9QQV9IUEhMIHwKKwkJICAgICAgMSA8PCBNQkhDX0VWRU5UX1BBX0hQSFIpKSkKKwkJCXdjZDl4eHhfc3dpdGNoX21pY2JpYXMobWJoYywgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgIlVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtYmhjLT5tYmhjX2xvY2spOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHMxNiB3Y2Q5eHh4X3JlYWRfaW1wZWRhbmNlX3JlZ3Moc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzaG9ydCBiaWFzX3ZhbHVlOworCWludCBpOworCXMzMiB6X3QgPSAwOworCXMzMiB6X2xvb3AgPSB6X2RldF9ib3hfY2FyX2F2ZzsKKworCS8qIEJveCBDYXIgYXZyZyBvZiBsZXNzIHRoYW4gYSBwYXJ0aWN1bGFyIGxvb3AgY291bnQgd2lsbCBub3QgYmUKKwkgKiBhY2NvbW9kYXRlZC4gU2ltaWxhcmx5IGlmIHRoZSBjb3VudCBpcyBtb3JlIHRoYW4gYSBwYXJ0aWN1bGFyIG51bWJlcgorCSAqIGl0IHdpbGwgbm90IGJlIGNvdW50ZWQuIFNldCB6X2xvb3AgY291bnRlciB0byBhIGxpbWl0LCBpZiBpdHMgbW9yZQorCSAqIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgaW4gV0NEOVhYWF9CT1hfQ0FSX0FWUkdfTUFYIG9yCisJICogV0NEOVhYWF9CT1hfQ0FSX0FWUkdfTUlOCisJICovCisJaWYgKHpfbG9vcCA8IFdDRDlYWFhfQk9YX0NBUl9BVlJHX01JTikgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkiJXM6IEJveCBDYXIgYXZyZyBjb3VudGVyIDwgJWQuIExpbWl0aW5nIGl0IHRvICVkXG4iLAorCQkJX19mdW5jX18sIFdDRDlYWFhfQk9YX0NBUl9BVlJHX01JTiwKKwkJCVdDRDlYWFhfQk9YX0NBUl9BVlJHX01JTik7CisJCXpfbG9vcCA9IFdDRDlYWFhfQk9YX0NBUl9BVlJHX01JTjsKKwl9IGVsc2UgaWYgKHpfbG9vcCA+IFdDRDlYWFhfQk9YX0NBUl9BVlJHX01BWCkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkiJXM6IEJveCBDYXIgYXZyZyBjb3VudGVyID4gJWQuIExpbWl0aW5nIGl0IHRvICVkXG4iLAorCQkJX19mdW5jX18sIFdDRDlYWFhfQk9YX0NBUl9BVlJHX01BWCwKKwkJCVdDRDlYWFhfQk9YX0NBUl9BVlJHX01BWCk7CisJCXpfbG9vcCA9IFdDRDlYWFhfQk9YX0NBUl9BVlJHX01BWDsKKwl9CisKKwkvKiBUYWtlIGJveCBjYXIgYXZlcmFnZSBpZiBuZWVkZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgel9sb29wOyBpKyspIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NEQ19NQkhDX0VOX0NUTCwgMHgyKTsKKwkJLyogV2FpdCBmb3IgYXRsZWFzdCAxODAwdVMgdG8gbGV0IHJlZ2lzdGVyIHdyaXRlIHRvIHNldHRsZSAqLworCQl1c2xlZXBfcmFuZ2UoMTgwMCwgMTgwMCArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCXpfdCArPSB3Y2Q5eHh4X3JlYWRfc3RhX3Jlc3VsdChjb2RlYyk7CisJfQorCS8qIFRha2UgYXZlcmFnZSBvZiB0aGUgWiB2YWx1ZXMgcmVhZCAqLworCWJpYXNfdmFsdWUgPSAoczE2KSAoel90IC8gel9sb29wKTsKKwlyZXR1cm4gYmlhc192YWx1ZTsKK30KKworc3RhdGljIGludCB3Y2Q5eHh4X3JlbWVhc3VyZV96X3ZhbHVlcyhzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLAorCQkJCQlzMTYgbFszXSwgczE2IHJbM10sCisJCQkJCXVpbnQzMl90ICp6bCwgdWludDMyX3QgKnpyLAorCQkJCQl1MzIgKnpsX3N0ZXJlbywgdTMyICp6bF9tb25vKQoreworCXMxNiBsX3RbM10gPSB7MH0sIHJfdFszXSA9IHswfTsKKwlzMTYgbDJfc3RlcmVvLCBsMl9tb25vOworCWJvb2wgbGVmdCwgcmlnaHQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7CisKKwlpZiAoIW1iaGMtPm1iaGNfY2IgfHwgIW1iaGMtPm1iaGNfY2ItPnNldHVwX3pkZXQgfHwKKwkJIW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGVmdCA9ICEhKGwpOworCXJpZ2h0ID0gISEocik7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUmVtZWFzdXJpbmcgaW1wZWRhbmNlIHZhbHVlc1xuIiwgX19mdW5jX18pOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBsOiAlcEssIHI6ICVwSywgbGVmdD0lZCwgcmlnaHQ9JWRcbiIsIF9fZnVuY19fLAorCQkgbCwgciwgbGVmdCwgcmlnaHQpOworCisJLyogUmVtZWFzdXJlIFYyIHZhbHVlcyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsIDB4RkYsIDB4RjApOworCWlmIChyaWdodCkKKwkJcl90WzJdID0gd2NkOXh4eF9yZWFkX2ltcGVkYW5jZV9yZWdzKG1iaGMpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4RkYsIDB4QzApOworCWlmIChsZWZ0KQorCQlsX3RbMl0gPSB3Y2Q5eHh4X3JlYWRfaW1wZWRhbmNlX3JlZ3MobWJoYyk7CisKKwkvKiBSYW1wIGRvd24gSFBIUiAqLworCW1iaGMtPm1iaGNfY2ItPnNldHVwX3pkZXQobWJoYywgTUJIQ19aREVUX0hQSFJfUkFNUF9ESVNBQkxFKTsKKworCWlmIChyaWdodCkgeworCQkvKiBUYWtlIFIwJy9SMScgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMiwKKwkJCQkgICAgMHhGRiwgMHhGOCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsCisJCQkJICAgIDB4RkYsIDB4QTApOworCQlyX3RbMV0gPSB3Y2Q5eHh4X3JlYWRfaW1wZWRhbmNlX3JlZ3MobWJoYyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsCisJCQkJICAgIDB4RkYsIDB4RjApOworCQlyX3RbMF0gPSB3Y2Q5eHh4X3JlYWRfaW1wZWRhbmNlX3JlZ3MobWJoYyk7CisJfQorCisJLyogUHV0IGJhY2sgZ2FpbiB0byAxeCAqLworCWlmICghbGVmdCAmJiByaWdodCkKKwkJbWJoYy0+bWJoY19jYi0+c2V0dXBfemRldChtYmhjLCBNQkhDX1pERVRfR0FJTl8wKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4RkYsIDB4QzApOworCS8qIFRha2UgTDInJyBtZWFzdXJlbWVudCAqLworCWwyX3N0ZXJlbyA9IHdjZDl4eHhfcmVhZF9pbXBlZGFuY2VfcmVncyhtYmhjKTsKKworCS8qIFR1cm4gb2ZmIEhQSFIgUEEgYW5kIHRha2UgTDInJycgKi8KKwltYmhjLT5tYmhjX2NiLT5zZXR1cF96ZGV0KG1iaGMsIE1CSENfWkRFVF9IUEhSX1BBX0RJU0FCTEUpOworCWwyX21vbm8gPSB3Y2Q5eHh4X3JlYWRfaW1wZWRhbmNlX3JlZ3MobWJoYyk7CisKKwkvKiBSYW1wIEhQSEwgZnJvbSAtMTVtViB0byAwViAqLworCW1iaGMtPm1iaGNfY2ItPnNldHVwX3pkZXQobWJoYywgTUJIQ19aREVUX0hQSExfUkFNUF9ESVNBQkxFKTsKKworCS8qIFRha2UgTDAnIGFuZCBMMScgd2l0aCBpQ2FsICovCisJbF90WzBdID0gd2NkOXh4eF9yZWFkX2ltcGVkYW5jZV9yZWdzKG1iaGMpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsIDB4RkYsIDB4RjgpOworCWxfdFsxXSA9IHdjZDl4eHhfcmVhZF9pbXBlZGFuY2VfcmVncyhtYmhjKTsKKworCWlmIChsZWZ0KSB7CisJCWxbMF0gPSBsX3RbMF07CisJCWxbMV0gPSBsX3RbMV07CisJCWxbMl0gPSBsX3RbMl07CisJfQorCWlmIChyaWdodCkgeworCQlyWzBdID0gcl90WzBdOworCQlyWzFdID0gcl90WzFdOworCQlyWzJdID0gcl90WzJdOworCX0KKworCS8qIGNvbXB1dGUgdGhlIG5ldyBpbXBlZGFuY2UgdmFsdWVzICovCisJbWJoYy0+bWJoY19jYi0+Y29tcHV0ZV9pbXBlZGFuY2UobWJoYywgbCwgciwgemwsIHpyKTsKKworCWlmICghbGVmdCAmJiByaWdodCkKKwkJbWJoYy0+bWJoY19jYi0+c2V0dXBfemRldChtYmhjLCBNQkhDX1pERVRfR0FJTl9VUERBVEVfMVgpOworCS8qIGNvbXB1dGUgdGhlIG5ldyBaTCcnIHZhbHVlICovCisJbF90WzJdID0gbDJfc3RlcmVvOworCW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlKG1iaGMsIGxfdCwgTlVMTCwgemxfc3RlcmVvLCBOVUxMKTsKKwkvKiBjb21wdXRlIHRoZSBuZXcgWkwnJycgdmFsdWUgKi8KKwlsX3RbMl0gPSBsMl9tb25vOworCW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlKG1iaGMsIGxfdCwgTlVMTCwgemxfbW9ubywgTlVMTCk7CisKKwlwcl9kZWJ1ZygiJXM6IEwwJzogMHgleCwgTDEnOiAweCV4IEwyX3N0ZXJlbzogMHgleCwgTDJfbW9ubzogMHgleFxuIiwKKwkJIF9fZnVuY19fLCBsX3RbMF0gJiAweGZmZmYsIGxfdFsxXSAmIDB4ZmZmZiwKKwkJIGwyX3N0ZXJlbyAmIDB4ZmZmZiwgbDJfbW9ubyAmIDB4ZmZmZik7CisJcHJfZGVidWcoIiVzOiBaTF9zdGVyZW8gPSAldSwgWkxfbW9ubyA9ICV1XG4iLAorCQkgX19mdW5jX18sICp6bF9zdGVyZW8sICp6bF9tb25vKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBtYmhjX3pkZXRfem9uZXMgd2NkOXh4eF9hc3NpZ25femRldF96b25lKHVpbnQzMl90IHpsLCB1aW50MzJfdCB6ciwKKwkJCQkJCSAgICAgaW50MzJfdCAqZ2FpbikKK3sKKwllbnVtIG1iaGNfemRldF96b25lcyB6ZGV0X3pvbmU7CisKKwlpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMSh6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzEoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUxX19aUl9aT05FMTsKKwkJKmdhaW4gPSAwOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMih6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzIoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUyX19aUl9aT05FMjsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8xOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMyh6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzMoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUzX19aUl9aT05FMzsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8yOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMih6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzEoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUyX19aUl9aT05FMTsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8xOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMyh6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzEoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUzX19aUl9aT05FMTsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8yOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMSh6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzIoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUxX19aUl9aT05FMjsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8xOworCX0gZWxzZSBpZiAoV0NEOVhYWF9JU19JTl9aREVUX1pPTkVfMSh6bCkgJiYKKwkJIFdDRDlYWFhfSVNfSU5fWkRFVF9aT05FXzMoenIpKSB7CisJCXpkZXRfem9uZSA9IFpMX1pPTkUxX19aUl9aT05FMzsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8yOworCX0gZWxzZSB7CisJCXpkZXRfem9uZSA9IFpMX1pSX05PVF9JTl9aT05FMTsKKwkJKmdhaW4gPSBNQkhDX1pERVRfR0FJTl8xOworCX0KKworCXJldHVybiB6ZGV0X3pvbmU7Cit9CisKK3N0YXRpYyBpbnQgd2NkOXh4eF9kZXRlY3RfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCQkgICAgdWludDMyX3QgKnpyKQoreworCWludCBpOworCWludCByZXQgPSAwOworCXU4IG1pY2JfbWJoY192YWw7CisJczE2IGxbM10sIHJbM107CisJczE2ICp6W10gPSB7CisJCSZsWzBdLCAmclswXSwgJnJbMV0sICZsWzFdLCAmbFsyXSwgJnJbMl0sCisJfTsKKwl1MzIgemxfc3RlcmVvLCB6bF9tb25vOworCXUzMiB6bF9kaWZmXzEsIHpsX2RpZmZfMjsKKwlib29sIG92ZXJyaWRlX2VuOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOworCWNvbnN0IGludCBtdXhfd2FpdF91cyA9IDI1OworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0X211eFtdID0geworCQkvKiBQaGFzZSAxICovCisJCS8qIFNldCBNQkhDX01VWCBmb3IgSFBITCB3aXRob3V0IGljYWwgKi8KKwkJe1dDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsIDB4RkYsIDB4RjB9LAorCQkvKiBTZXQgTUJIQ19NVVggZm9yIEhQSFIgd2l0aG91dCBpY2FsICovCisJCXtXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLCAweEZGLCAweEEwfSwKKwkJLyogU2V0IE1CSENfTVVYIGZvciBIUEhSIHdpdGggaWNhbCAqLworCQl7V0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMiwgMHhGRiwgMHhGOH0sCisJCS8qIFNldCBNQkhDX01VWCBmb3IgSFBITCB3aXRoIGljYWwgKi8KKwkJe1dDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzEsIDB4RkYsIDB4QzB9LAorCisJCS8qIFBoYXNlIDIgKi8KKwkJe1dDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsIDB4RkYsIDB4RjB9LAorCQkvKiBTZXQgTUJIQ19NVVggZm9yIEhQSFIgd2l0aG91dCBpY2FsIGFuZCB3YWl0IGZvciAyNXVzICovCisJCXtXQ0Q5WFhYX0FfTUJIQ19TQ0FMSU5HX01VWF8xLCAweEZGLCAweEEwfSwKKwl9OworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkNMX0FTU0VSVF9MT0NLRUQobWJoYy0+cmVzbWdyKTsKKworCWlmICghbWJoYy0+bWJoY19jYiB8fCAhbWJoYy0+bWJoY19jYi0+c2V0dXBfemRldCB8fAorCSAgICAhbWJoYy0+bWJoY19jYi0+Y29tcHV0ZV9pbXBlZGFuY2UgfHwgIXpsIHx8ICF6cikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEltcGVkYW5jZSBkZXRlY3Rpb24gaXMgYW4gaW50cnVzaXZlIGZ1bmN0aW9uIGFzIGl0IG11dGVzIFJYIHBhdGhzLAorCSAqIGVuYWJsZSBQQXMgYW5kIGV0Yy4gIFRoZXJlZm9yZSBjb2RlYyBkcnZpZXIgaW5jbHVkaW5nIEFMU0EKKwkgKiBzaG91bGRuJ3QgcmVhZCBhbmQgd3JpdGUgaGFyZHdhcmUgcmVnaXN0ZXJzIGR1cmluZyBkZXRlY3Rpb24uCisJICovCisJd2NkOXh4eF9vbm9mZl9leHRfbWNsayhtYmhjLCB0cnVlKTsKKworCS8qCisJICogRm9yIGltcGVkYW5jZSBkZXRlY3Rpb24sIG1ha2Ugc3VyZSB0byBkaXNhYmxlIG1pY2JpYXMgZnJvbQorCSAqIG92ZXJyaWRlIHNpZ25hbCBzbyB0aGF0IG92ZXJyaWRlIGRvZXMgbm90IGNhdXNlIG1pY2JpYXMKKwkgKiB0byBiZSBlbmFibGVkLiBUaGlzIHNldHRpbmcgd2lsbCBiZSB1bmRvbmUgYWZ0ZXIgY29tcGxldGluZworCSAqIGltcGVkYW5jZSBtZWFzdXJlbWVudC4KKwkgKi8KKwltaWNiX21iaGNfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfTUFEX0FOQV9DVFJMLAorCQkJICAgIDB4MTAsIDB4MDApOworCisJb3ZlcnJpZGVfZW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfQjFfQ1RMKSAmIDB4MDQpID8KKwkJCQkJdHJ1ZSA6IGZhbHNlOworCWlmICghb3ZlcnJpZGVfZW4pCisJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCB0cnVlKTsKKwlwcl9kZWJ1ZygiJXM6IFNldHRpbmcgaW1wZWRhbmNlIGRldGVjdGlvblxuIiwgX19mdW5jX18pOworCisJLyogQ29kZWMgc3BlY2lmaWMgc2V0dXAgZm9yIEwwLCBSMCwgTDEgYW5kIFIxIG1lYXN1cmVtZW50cyAqLworCW1iaGMtPm1iaGNfY2ItPnNldHVwX3pkZXQobWJoYywgTUJIQ19aREVUX1BSRV9NRUFTVVJFKTsKKworCXByX2RlYnVnKCIlczogUGVyZm9ybWluZyBpbXBlZGFuY2UgZGV0ZWN0aW9uXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVnX3NldF9tdXgpIC0gMjsgaSsrKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ19zZXRfbXV4W2ldLnJlZywKKwkJCQkgICAgcmVnX3NldF9tdXhbaV0ubWFzaywKKwkJCQkgICAgcmVnX3NldF9tdXhbaV0udmFsKTsKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPmdldF9jZGNfdHlwZSAmJgorCQkgICAgbWJoYy0+bWJoY19jYi0+Z2V0X2NkY190eXBlKCkgPT0KKwkJCQlXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkgeworCQkJKih6W2ldKSA9IHdjZDl4eHhfcmVhZF9pbXBlZGFuY2VfcmVncyhtYmhjKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2spCisJCQkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKGNvZGVjKTsKKwkJCWVsc2UKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkJCTB4ODAsIDB4ODApOworCQkJLyogMjV1cyBpcyByZXF1aXJlZCBhZnRlciBtdXggY2hhbmdlIHRvIHNldHRsZSBkb3duICovCisJCQl1c2xlZXBfcmFuZ2UobXV4X3dhaXRfdXMsCisJCQkJIG11eF93YWl0X3VzICsgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwkJCSooeltpXSkgPSBfX3djZDl4eHhfY29kZWNfc3RhX2RjZShtYmhjLCAwLAorCQkJCQkJCSAgdHJ1ZSwgZmFsc2UpOworCQl9CisJfQorCisJLyogQ29kZWMgc3BlY2lmaWMgc2V0dXAgZm9yIEwyIGFuZCBSMiBtZWFzdXJlbWVudHMgKi8KKwltYmhjLT5tYmhjX2NiLT5zZXR1cF96ZGV0KG1iaGMsIE1CSENfWkRFVF9QT1NUX01FQVNVUkUpOworCisJZm9yICg7IGkgPCBBUlJBWV9TSVpFKHJlZ19zZXRfbXV4KTsgaSsrKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ19zZXRfbXV4W2ldLnJlZywKKwkJCQkgICAgcmVnX3NldF9tdXhbaV0ubWFzaywKKwkJCQkgICAgcmVnX3NldF9tdXhbaV0udmFsKTsKKwkJaWYgKG1iaGMtPm1iaGNfY2ItPmdldF9jZGNfdHlwZSAmJgorCQkgICAgbWJoYy0+bWJoY19jYi0+Z2V0X2NkY190eXBlKCkgPT0KKwkJCQlXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkgeworCQkJKih6W2ldKSA9IHdjZDl4eHhfcmVhZF9pbXBlZGFuY2VfcmVncyhtYmhjKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYmhjLT5tYmhjX2NiLT5lbmFibGVfbXV4X2JpYXNfYmxvY2spCisJCQkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX211eF9iaWFzX2Jsb2NrKGNvZGVjKTsKKwkJCWVsc2UKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkJCTB4ODAsIDB4ODApOworCQkJLyogMjV1cyBpcyByZXF1aXJlZCBhZnRlciBtdXggY2hhbmdlIHRvIHNldHRsZSBkb3duICovCisJCQl1c2xlZXBfcmFuZ2UobXV4X3dhaXRfdXMsCisJCQkJbXV4X3dhaXRfdXMgKyBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQkJKih6W2ldKSA9IF9fd2NkOXh4eF9jb2RlY19zdGFfZGNlKG1iaGMsIDAsCisJCQkJCQkJICB0cnVlLCBmYWxzZSk7CisJCX0KKwl9CisKKwltYmhjLT5tYmhjX2NiLT5jb21wdXRlX2ltcGVkYW5jZShtYmhjLCBsLCByLCB6bCwgenIpOworCisJLyoKKwkgKiBGb3Igc29tZSBjb2RlY3MsIGFuIGFkZGl0aW9uYWwgc3RlcCBvZiB6ZGV0IGlzIG5lZWRlZAorCSAqIHRvIG92ZXJjb21lIGVmZmVjdHMgb2Ygbm9pc2UgYW5kIGZvciBiZXR0ZXIgYWNjdXJhY3kgb2YKKwkgKiB6IHZhbHVlcworCSAqLworCWlmIChtYmhjLT5tYmhjX2NiLT5nZXRfY2RjX3R5cGUgJiYKKwkgICAgIG1iaGMtPm1iaGNfY2ItPmdldF9jZGNfdHlwZSgpID09IFdDRDlYWFhfQ0RDX1RZUEVfVE9NVE9NKSB7CisJCXVpbnQzMl90IHpsX3QgPSAwLCB6cl90ID0gMDsKKwkJczE2ICpsX3AsICpyX3A7CisJCWVudW0gbWJoY196ZGV0X3pvbmVzIHpkZXRfem9uZTsKKwkJaW50MzJfdCBnYWluOworCisJCXpkZXRfem9uZSA9IHdjZDl4eHhfYXNzaWduX3pkZXRfem9uZSgqemwsICp6ciwgJmdhaW4pOworCQlzd2l0Y2ggKHpkZXRfem9uZSkgeworCQljYXNlIFpMX1pPTkUxX19aUl9aT05FMToKKwkJCWxfcCA9IE5VTEw7CisJCQlyX3AgPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgWkxfWk9ORTJfX1pSX1pPTkUyOgorCQljYXNlIFpMX1pPTkUzX19aUl9aT05FMzoKKwkJY2FzZSBaTF9aUl9OT1RfSU5fWk9ORTE6CisJCQlsX3AgPSBsOworCQkJcl9wID0gcjsKKwkJCWJyZWFrOworCQljYXNlIFpMX1pPTkUyX19aUl9aT05FMToKKwkJY2FzZSBaTF9aT05FM19fWlJfWk9ORTE6CisJCS8qIElmIFpSIGZhbGxzIGluIFpvbmUgMSwgZnVydGhlciBjb21wdXRhdGlvbnMgd2l0aAorCQkgKiBnYWluIHVwZGF0ZSBhcmUgbm90IHJlcXVpcmVkCisJCSAqLworCQkJbF9wID0gbDsKKwkJCXJfcCA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBaTF9aT05FMV9fWlJfWk9ORTI6CisJCWNhc2UgWkxfWk9ORTFfX1pSX1pPTkUzOgorCQkvKiBJZiBaTCBmYWxscyBpbiBab25lIDEsIGZ1cnRoZXIgY29tcHV0YXRpb25zIHdpdGgKKwkJICogZ2FpbiB1cGRhdGUgYXJlIG5vdCByZXF1aXJlZAorCQkgKi8KKwkJCWxfcCA9IE5VTEw7CisJCQlyX3AgPSByOworCQkJYnJlYWs7CisJCX0KKwkJcHJfZGVidWcoIiVzOnpkZXRfem9uZSA9ICVkLCBnYWluID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHpkZXRfem9uZSwgZ2Fpbik7CisJCWlmIChnYWluKQorCQkJbWJoYy0+bWJoY19jYi0+c2V0dXBfemRldChtYmhjLCBnYWluKTsKKworCQl3Y2Q5eHh4X3JlbWVhc3VyZV96X3ZhbHVlcyhtYmhjLCBsX3AsIHJfcCwgJnpsX3QsICZ6cl90LAorCQkJCQkgICAmemxfc3RlcmVvLCAmemxfbW9ubyk7CisKKwkJKnpsID0gKHpsX3QpID8gemxfdCA6ICp6bDsKKwkJKnpyID0gKHpyX3QpID8genJfdCA6ICp6cjsKKworCQkvKiBDaGVjayBmb3IgTW9uby9TdGVyZW8gVHlwZQorCQkgKiBDb25kaXRpb25zIHRvIGNsYXNzaWZ5IE1vbm8vU3RlcmVvCisJCSAqIGkuIERpZmZlcmVuY2Ugb2Ygemxfc3RlcmVvIGFuZCB6bF9tb25vID4gKDEvMikgb2YgemxfbW9ubworCQkgKiBpaS4gQWJzb2x1dGUgZGlmZmVyZW5jZSBvZiB6bCBhbmQgenIgYWJvdmUgYSB0aHJlc2hvbGQKKwkJICovCisJCXpsX2RpZmZfMSA9ICh6bF9tb25vID4gemxfc3RlcmVvKSA/ICh6bF9tb25vIC0gemxfc3RlcmVvKSA6CisJCQkJCQkgICh6bF9zdGVyZW8gLSB6bF9tb25vKTsKKwkJemxfZGlmZl8yID0gKCp6bCA+ICp6cikgPyAoKnpsIC0gKnpyKSA6ICgqenIgLSAqemwpOworCisJCW1iaGMtPmhwaF90eXBlID0gTUJIQ19IUEhfTk9ORTsKKwkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPSBQTFVHX1RZUEVfSElHSF9IUEgpIHsKKwkJCWlmICgoemxfZGlmZl8xID4gKHpsX21vbm8gPj4gMSkpIHx8CisJCQkgICAgKHpsX2RpZmZfMiA+IFdDRDlYWFhfTU9OT19IU19ESUZGX1RIUikgfHwKKwkJCSAgICAoKCp6bCA8IFdDRDlYWFhfTU9OT19IU19NSU5fVEhSKSAmJgorCQkJICAgICAoKnpyID4gV0NEOVhYWF9NT05PX0hTX01JTl9USFIpKSB8fAorCQkJICAgICgoKnpyIDwgV0NEOVhYWF9NT05PX0hTX01JTl9USFIpICYmCisJCQkgICAgICgqemwgPiBXQ0Q5WFhYX01PTk9fSFNfTUlOX1RIUikpKSB7CisJCQkJcHJfZGVidWcoIiVzOiBNT05PIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCQltYmhjLT5ocGhfdHlwZSA9IE1CSENfSFBIX01PTk87CisJCQkJKnpsID0gemxfbW9ubzsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoIiVzOiBTVEVSRU8gcGx1ZyB0eXBlIGRldGVjdGVkXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJCW1iaGMtPmhwaF90eXBlID0gTUJIQ19IUEhfU1RFUkVPOworCQkJfQorCQl9CisJfQorCisJbWJoYy0+bWJoY19jYi0+c2V0dXBfemRldChtYmhjLCBNQkhDX1pERVRfUEFfRElTQUJMRSk7CisKKwkvKiBDYWxjdWxhdGUgeiB2YWx1ZXMgYmFzZWQgb24gdGhlIFEtZnVzZSByZWdpc3RlcnMsIGlmIHVzZWQgKi8KKwlpZiAobWJoYy0+bWJoY19jYi0+emRldF9lcnJvcl9hcHByb3gpCisJCW1iaGMtPm1iaGNfY2ItPnpkZXRfZXJyb3JfYXBwcm94KG1iaGMsIHpsLCB6cik7CisKKwl3Y2Q5eHh4X29ub2ZmX2V4dF9tY2xrKG1iaGMsIGZhbHNlKTsKKworCWlmICghb3ZlcnJpZGVfZW4pCisJCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CisKKwkvKiBVbmRvIHRoZSBtaWNiaWFzIGRpc2FibGUgZm9yIG92ZXJyaWRlICovCisJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX01BRF9BTkFfQ1RSTCwgbWljYl9tYmhjX3ZhbCk7CisKKwlwcl9kZWJ1ZygiJXM6IEwwOiAweCV4KCVkKSwgTDE6IDB4JXgoJWQpLCBMMjogMHgleCglZClcbiIsCisJCSBfX2Z1bmNfXywKKwkJIGxbMF0gJiAweGZmZmYsIGxbMF0sIGxbMV0gJiAweGZmZmYsIGxbMV0sIGxbMl0gJiAweGZmZmYsIGxbMl0pOworCXByX2RlYnVnKCIlczogUjA6IDB4JXgoJWQpLCBSMTogMHgleCglZCksIFIyOiAweCV4KCVkKVxuIiwKKwkJIF9fZnVuY19fLAorCQkgclswXSAmIDB4ZmZmZiwgclswXSwgclsxXSAmIDB4ZmZmZiwgclsxXSwgclsyXSAmIDB4ZmZmZiwgclsyXSk7CisJcHJfZGVidWcoIiVzOiBSTCAldSBtaWxsaW9obSwgUlIgJXUgbWlsbGlvaG1cbiIsIF9fZnVuY19fLCAqemwsICp6cik7CisJcHJfZGVidWcoIiVzOiBJbXBlZGFuY2UgZGV0ZWN0aW9uIGNvbXBsZXRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHdjZDl4eHhfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCSAgICAgICB1aW50MzJfdCAqenIpCit7CisJKnpsID0gbWJoYy0+emw7CisJKnpyID0gbWJoYy0+enI7CisKKwlpZiAoKnpsICYmICp6cikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIHdjZDl4eHhfbWJoY19pbml0IDogaW5pdGlhbGl6ZSBNQkhDIGludGVybmFsIHN0cnVjdHVyZXMuCisgKgorICogTk9URTogbWJoYy0+bWJoY19jZmcgaXMgbm90IFlFVCBjb25maWd1cmUgc28gc2hvdWxkbid0IGJlIHVzZWQKKyAqLworaW50IHdjZDl4eHhfbWJoY19pbml0KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCSAgICAgIGludCAoKm1pY2JpYXNfZW5hYmxlX2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyosICBib29sLAorCQkJCQkJZW51bSB3Y2Q5eHh4X21pY2JpYXNfbnVtKSwKKwkJICAgICAgY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19jYiAqbWJoY19jYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19pbnRyICptYmhjX2NkY19pbnRyX2lkcywKKwkJICAgICAgaW50IHJjb19jbGtfcmF0ZSwKKwkJICAgICAgYm9vbCBpbXBlZGFuY2VfZGV0X2VuKQoreworCWludCByZXQ7CisJdm9pZCAqY29yZV9yZXM7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJbWVtc2V0KCZtYmhjLT5tYmhjX2JpYXNfcmVncywgMCwgc2l6ZW9mKHN0cnVjdCBtYmhjX21pY2JpYXNfcmVncykpOworCW1lbXNldCgmbWJoYy0+bWJoY19kYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1iaGNfaW50ZXJuYWxfY2FsX2RhdGEpKTsKKworCW1iaGMtPm1iaGNfZGF0YS50X3N0YV9kY2UgPSBERUZBVUxUX0RDRV9TVEFfV0FJVDsKKwltYmhjLT5tYmhjX2RhdGEudF9kY2UgPSBERUZBVUxUX0RDRV9XQUlUOworCW1iaGMtPm1iaGNfZGF0YS50X3N0YSA9IERFRkFVTFRfU1RBX1dBSVQ7CisJbWJoYy0+bWJoY19taWNiaWFzX3N3aXRjaGVkID0gZmFsc2U7CisJbWJoYy0+cG9sbGluZ19hY3RpdmUgPSBmYWxzZTsKKwltYmhjLT5tYmhjX3N0YXRlID0gTUJIQ19TVEFURV9OT05FOworCW1iaGMtPmluX3N3Y2hfaXJxX2hhbmRsZXIgPSBmYWxzZTsKKwltYmhjLT5jdXJyZW50X3BsdWcgPSBQTFVHX1RZUEVfTk9ORTsKKwltYmhjLT5scGlfZW5hYmxlZCA9IGZhbHNlOworCW1iaGMtPm5vX21pY19oZWFkc2V0X292ZXJyaWRlID0gZmFsc2U7CisJbWJoYy0+bWJoY19sYXN0X3Jlc3VtZSA9IDA7CisJbWJoYy0+Y29kZWMgPSBjb2RlYzsKKwltYmhjLT5yZXNtZ3IgPSByZXNtZ3I7CisJbWJoYy0+cmVzbWdyLT5tYmhjID0gbWJoYzsKKwltYmhjLT5taWNiaWFzX2VuYWJsZV9jYiA9IG1pY2JpYXNfZW5hYmxlX2NiOworCW1iaGMtPnJjb19jbGtfcmF0ZSA9IHJjb19jbGtfcmF0ZTsKKwltYmhjLT5tYmhjX2NiID0gbWJoY19jYjsKKwltYmhjLT5pbnRyX2lkcyA9IG1iaGNfY2RjX2ludHJfaWRzOworCW1iaGMtPmltcGVkYW5jZV9kZXRlY3QgPSBpbXBlZGFuY2VfZGV0X2VuOworCW1iaGMtPmhwaF90eXBlID0gTUJIQ19IUEhfTk9ORTsKKworCWlmIChtYmhjLT5pbnRyX2lkcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEludGVycnVwdCBtYXBwaW5nIG5vdCBwcm92aWRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWJoYy0+aGVhZHNldF9qYWNrLmphY2sgPT0gTlVMTCkgeworCQlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLAorCQkJCQkgICAgIkhlYWRzZXQgSmFjayIsIFdDRDlYWFhfSkFDS19NQVNLLAorCQkJCQkgICAgJm1iaGMtPmhlYWRzZXRfamFjaywgTlVMTCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgbmV3IGphY2tcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLAorCQkJCQkgICAgIkJ1dHRvbiBKYWNrIiwKKwkJCQkJICAgIFdDRDlYWFhfSkFDS19CVVRUT05fTUFTSywKKwkJCQkJICAgICZtYmhjLT5idXR0b25famFjaywgTlVMTCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgamFja1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gc25kX2phY2tfc2V0X2tleShtYmhjLT5idXR0b25famFjay5qYWNrLAorCQkJCSAgICAgICBTTkRfSkFDS19CVE5fMCwKKwkJCQkgICAgICAgS0VZX01FRElBKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBjb2RlIGZvciBidG4tMFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc2V0X2JpdChJTlBVVF9QUk9QX05PX0RVTU1ZX1JFTEVBU0UsCisJCQltYmhjLT5idXR0b25famFjay5qYWNrLT5pbnB1dF9kZXYtPnByb3BiaXQpOworCisJCUlOSVRfREVMQVlFRF9XT1JLKCZtYmhjLT5tYmhjX2Zpcm13YXJlX2R3b3JrLAorCQkJCSAgd2NkOXh4eF9tYmhjX2Z3X3JlYWQpOworCQlJTklUX0RFTEFZRURfV09SSygmbWJoYy0+bWJoY19idG5fZHdvcmssIHdjZDl4eHhfYnRuX2xwcmVzc19mbik7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZtYmhjLT5tYmhjX2luc2VydF9kd29yaywKKwkJCQkgIHdjZDl4eHhfbWJoY19pbnNlcnRfd29yayk7CisJfQorCisJbXV0ZXhfaW5pdCgmbWJoYy0+bWJoY19sb2NrKTsKKworCS8qIFJlZ2lzdGVyIGV2ZW50IG5vdGlmaWVyICovCisJbWJoYy0+bmJsb2NrLm5vdGlmaWVyX2NhbGwgPSB3Y2Q5eHh4X2V2ZW50X25vdGlmeTsKKwlyZXQgPSB3Y2Q5eHh4X3Jlc21ncl9yZWdpc3Rlcl9ub3RpZmllcihtYmhjLT5yZXNtZ3IsICZtYmhjLT5uYmxvY2spOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIG5vdGlmaWVyICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJbXV0ZXhfZGVzdHJveSgmbWJoYy0+bWJoY19sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3Y2Q5eHh4X2luaXRfZGVidWdmcyhtYmhjKTsKKworCS8qIERpc2FibGUgSW1wZWRhbmNlIGRldGVjdGlvbiBieSBkZWZhdWx0IGZvciBjZXJ0YWluIGNvZGVjIHR5cGVzICovCisJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+Z2V0X2NkY190eXBlICYmCisJICAgIChtYmhjLT5tYmhjX2NiLT5nZXRfY2RjX3R5cGUoKSA9PSBXQ0Q5WFhYX0NEQ19UWVBFX0hFTElDT04pKQorCQlpbXBlZGFuY2VfZGV0ZWN0X2VuID0gMDsKKwllbHNlCisJCWltcGVkYW5jZV9kZXRlY3RfZW4gPSBpbXBlZGFuY2VfZGV0X2VuID8gMSA6IDA7CisKKwljb3JlX3JlcyA9IG1iaGMtPnJlc21nci0+Y29yZV9yZXM7CisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmluc2VydGlvbiwKKwkJCQkgIHdjZDl4eHhfaHNfaW5zZXJ0X2lycSwKKwkJCQkgICJIZWFkc2V0IGluc2VydCBkZXRlY3QiLCBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZCwgcmV0ID0gJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPmluc2VydGlvbiwgcmV0KTsKKwkJZ290byBlcnJfaW5zZXJ0X2lycTsKKwl9CisJd2NkOXh4eF9kaXNhYmxlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmluc2VydGlvbik7CisKKwlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+cG9sbF9wbHVnX3JlbSwKKwkJCQkgIHdjZDl4eHhfaHNfcmVtb3ZlX2lycSwKKwkJCQkgICJIZWFkc2V0IHJlbW92ZSBkZXRlY3QiLCBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCisJCQltYmhjLT5pbnRyX2lkcy0+cG9sbF9wbHVnX3JlbSk7CisJCWdvdG8gZXJyX3JlbW92ZV9pcnE7CisJfQorCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmRjZV9lc3RfY29tcGxldGUsCisJCQkJICB3Y2Q5eHh4X2RjZV9oYW5kbGVyLCAiREMgRXN0aW1hdGlvbiBkZXRlY3QiLAorCQkJCSAgbWJoYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPmRjZV9lc3RfY29tcGxldGUpOworCQlnb3RvIGVycl9wb3RlbnRpYWxfaXJxOworCX0KKworCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5idXR0b25fcmVsZWFzZSwKKwkJCQkgIHdjZDl4eHhfcmVsZWFzZV9oYW5kbGVyLAorCQkJCSAgIkJ1dHRvbiBSZWxlYXNlIGRldGVjdCIsIG1iaGMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKKwkJCW1iaGMtPmludHJfaWRzLT5idXR0b25fcmVsZWFzZSk7CisJCWdvdG8gZXJyX3JlbGVhc2VfaXJxOworCX0KKworCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3AsCisJCQkJICB3Y2Q5eHh4X2hwaGxfb2NwX2lycSwgIkhQSF9MIE9DUCBkZXRlY3QiLAorCQkJCSAgbWJoYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCk7CisJCWdvdG8gZXJyX2hwaGxfb2NwX2lycTsKKwl9CisJd2NkOXh4eF9kaXNhYmxlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCk7CisKKwlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwKKwkJCQkgIHdjZDl4eHhfaHBocl9vY3BfaXJxLCAiSFBIX1IgT0NQIGRldGVjdCIsCisJCQkJICBtYmhjKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCk7CisJCWdvdG8gZXJyX2hwaHJfb2NwX2lycTsKKwl9CisJd2NkOXh4eF9kaXNhYmxlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3ApOworCisJd2NkOXh4eF9yZWdtZ3JfY29uZF9yZWdpc3RlcihyZXNtZ3IsIDEgPDwgV0NEOVhYWF9DT05EX0hQSF9NSUMgfAorCQkJCQkgICAgIDEgPDwgV0NEOVhYWF9DT05EX0hQSCk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKKworZXJyX2hwaHJfb2NwX2lycToKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwLCBtYmhjKTsKK2Vycl9ocGhsX29jcF9pcnE6CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmJ1dHRvbl9yZWxlYXNlLCBtYmhjKTsKK2Vycl9yZWxlYXNlX2lycToKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+ZGNlX2VzdF9jb21wbGV0ZSwgbWJoYyk7CitlcnJfcG90ZW50aWFsX2lycToKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+cG9sbF9wbHVnX3JlbSwgbWJoYyk7CitlcnJfcmVtb3ZlX2lycToKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+aW5zZXJ0aW9uLCBtYmhjKTsKK2Vycl9pbnNlcnRfaXJxOgorCXdjZDl4eHhfcmVzbWdyX3VucmVnaXN0ZXJfbm90aWZpZXIobWJoYy0+cmVzbWdyLCAmbWJoYy0+bmJsb2NrKTsKKworCW11dGV4X2Rlc3Ryb3koJm1iaGMtPm1iaGNfbG9jayk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod2NkOXh4eF9tYmhjX2luaXQpOworCit2b2lkIHdjZDl4eHhfbWJoY19kZWluaXQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYykKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9CisJCQkJbWJoYy0+cmVzbWdyLT5jb3JlX3JlczsKKworCXdjZDl4eHhfcmVnbWdyX2NvbmRfZGVyZWdpc3RlcihtYmhjLT5yZXNtZ3IsIDEgPDwgV0NEOVhYWF9DT05EX0hQSF9NSUMgfAorCQkJCQkJICAgICAxIDw8IFdDRDlYWFhfQ09ORF9IUEgpOworCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmJ1dHRvbl9yZWxlYXNlLCBtYmhjKTsKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBtYmhjLT5pbnRyX2lkcy0+ZGNlX2VzdF9jb21wbGV0ZSwgbWJoYyk7CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPnBvbGxfcGx1Z19yZW0sIG1iaGMpOworCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5pbnNlcnRpb24sIG1iaGMpOworCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5oc19qYWNrX3N3aXRjaCwgbWJoYyk7CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwgbWJoYyk7CisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3AsIG1iaGMpOworCisJbXV0ZXhfZGVzdHJveSgmbWJoYy0+bWJoY19sb2NrKTsKKwl3Y2Q5eHh4X3Jlc21ncl91bnJlZ2lzdGVyX25vdGlmaWVyKG1iaGMtPnJlc21nciwgJm1iaGMtPm5ibG9jayk7CisJd2NkOXh4eF9jbGVhbnVwX2RlYnVnZnMobWJoYyk7Cit9CitFWFBPUlRfU1lNQk9MKHdjZDl4eHhfbWJoY19kZWluaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIndjZDl4eHggTUJIQyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1tYmhjLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtbWJoYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWY3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtbWJoYy5oCkBAIC0wLDAgKzEsNDkyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fV0NEOVhYWF9NQkhDX0hfXworI2RlZmluZSBfX1dDRDlYWFhfTUJIQ19IX18KKworI2luY2x1ZGUgIndjZDl4eHgtcmVzbWdyLmgiCisjaW5jbHVkZSAid2NkY2FsLWh3ZGVwLmgiCisKKyNkZWZpbmUgV0NEOVhYWF9DRklMVF9GQVNUX01PREUgMHgwMAorI2RlZmluZSBXQ0Q5WFhYX0NGSUxUX1NMT1dfTU9ERSAweDQwCisjZGVmaW5lIFdDRDlYWFhfQ0ZJTFRfRVhUX1BSQ0hHX0VOIDB4MzAKKyNkZWZpbmUgV0NEOVhYWF9DRklMVF9FWFRfUFJDSEdfRFNCTCAweDAwCisKKyNkZWZpbmUgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTIDEwMAorCitzdHJ1Y3QgbWJoY19taWNiaWFzX3JlZ3MgeworCXUxNiBjZmlsdF92YWw7CisJdTE2IGNmaWx0X2N0bDsKKwl1MTYgbWJoY19yZWc7CisJdTE2IGludF9yYmlhczsKKwl1MTYgY3RsX3JlZzsKKwl1OCBjZmlsdF9zZWw7Cit9OworCitlbnVtIG1iaGNfdl9pbmRleCB7CisJTUJIQ19WX0lEWF9DRklMVCwKKwlNQkhDX1ZfSURYX1ZERElPLAorCU1CSENfVl9JRFhfTlVNLAorfTsKKworZW51bSBtYmhjX2NhbF90eXBlIHsKKwlNQkhDX0NBTF9NQ0xLLAorCU1CSENfQ0FMX1JDTywKKwlNQkhDX0NBTF9OVU0sCit9OworCitlbnVtIG1iaGNfaW1wZWRhbmNlX2RldGVjdF9zdGFnZXMgeworCU1CSENfWkRFVF9QUkVfTUVBU1VSRSwKKwlNQkhDX1pERVRfUE9TVF9NRUFTVVJFLAorCU1CSENfWkRFVF9HQUlOXzAsCisJTUJIQ19aREVUX0dBSU5fMSwKKwlNQkhDX1pERVRfR0FJTl8yLAorCU1CSENfWkRFVF9IUEhSX1JBTVBfRElTQUJMRSwKKwlNQkhDX1pERVRfSFBITF9SQU1QX0RJU0FCTEUsCisJTUJIQ19aREVUX1JBTVBfRElTQUJMRSwKKwlNQkhDX1pERVRfSFBIUl9QQV9ESVNBQkxFLAorCU1CSENfWkRFVF9QQV9ESVNBQkxFLAorCU1CSENfWkRFVF9HQUlOX1VQREFURV8xWCwKK307CisKKy8qIFpvbmUgYXNzaWdubWVudHMgdXNlZCBpbiBXQ0Q5MzMwIGZvciBaZGV0ICovCitlbnVtIG1iaGNfemRldF96b25lcyB7CisJWkxfWk9ORTFfX1pSX1pPTkUxLAorCVpMX1pPTkUyX19aUl9aT05FMiwKKwlaTF9aT05FM19fWlJfWk9ORTMsCisJWkxfWk9ORTJfX1pSX1pPTkUxLAorCVpMX1pPTkUzX19aUl9aT05FMSwKKwlaTF9aT05FMV9fWlJfWk9ORTIsCisJWkxfWk9ORTFfX1pSX1pPTkUzLAorCVpMX1pSX05PVF9JTl9aT05FMSwKK307CisKKy8qIERhdGEgdXNlZCBieSBNQkhDICovCitzdHJ1Y3QgbWJoY19pbnRlcm5hbF9jYWxfZGF0YSB7CisJdTE2IGRjZV96OworCXUxNiBkY2VfbnNjX2NzX3o7CisJdTE2IGRjZV9tYjsKKwl1MTYgc3RhX3o7CisJdTE2IHN0YV9tYjsKKwl1MzIgdF9zdGFfZGNlOworCXUzMiB0X2RjZTsKKwl1MzIgdF9zdGE7CisJdTMyIG1pY2JfbXY7CisJdTE2IHZfaW5zX2h1W01CSENfVl9JRFhfTlVNXTsKKwl1MTYgdl9pbnNfaFtNQkhDX1ZfSURYX05VTV07CisJdTE2IHZfYjFfaHVbTUJIQ19WX0lEWF9OVU1dOworCXUxNiB2X2IxX2hbTUJIQ19WX0lEWF9OVU1dOworCXUxNiB2X2JyaFtNQkhDX1ZfSURYX05VTV07CisJdTE2IHZfYnJsOworCXUxNiB2X25vX21pYzsKKwlzMTYgdl9pbnZhbF9pbnNfbG93OworCXMxNiB2X2ludmFsX2luc19oaWdoOworCXUxNiB2X2NzX2luc19oOworfTsKKworZW51bSB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlIHsKKwlQTFVHX1RZUEVfSU5WQUxJRCA9IC0xLAorCVBMVUdfVFlQRV9OT05FLAorCVBMVUdfVFlQRV9IRUFEU0VULAorCVBMVUdfVFlQRV9IRUFEUEhPTkUsCisJUExVR19UWVBFX0hJR0hfSFBILAorCVBMVUdfVFlQRV9HTkRfTUlDX1NXQVAsCisJUExVR19UWVBFX0FOQ19IRUFEUEhPTkUsCit9OworCitlbnVtIHdjZDl4eHhfbWJoY19taWNiaWFzX3R5cGUgeworCU1CSENfUFJJTUFSWV9NSUNfTUIsCisJTUJIQ19BTkNfTUlDX01CLAorfTsKKworZW51bSB3Y2Q5eHh4X21pY2JpYXNfbnVtIHsKKwlNQkhDX01JQ0JJQVNfSU5WQUxJRCA9IC0xLAorCU1CSENfTUlDQklBUzEsCisJTUJIQ19NSUNCSUFTMiwKKwlNQkhDX01JQ0JJQVMzLAorCU1CSENfTUlDQklBUzQsCit9OworCitlbnVtIGh3X2phY2tfdHlwZSB7CisJRk9VUl9QT0xFX0pBQ0sgPSAwLAorCUZJVkVfUE9MRV9KQUNLLAorCVNJWF9QT0xFX0pBQ0ssCit9OworCitlbnVtIHdjZDl4eF9tYmhjX21pY2JpYXNfZW5hYmxlX2JpdHMgeworCU1CSENfTUlDQklBU19FTkFCTEVfVEhSRVNIT0xEX0hFQURTRVQsCisJTUJIQ19NSUNCSUFTX0VOQUJMRV9SRUdVTEFSX0hFQURTRVQsCit9OworCitlbnVtIHdjZDl4eF9tYmhjX2NzX2VuYWJsZV9iaXRzIHsKKwlNQkhDX0NTX0VOQUJMRV9QT0xMSU5HLAorCU1CSENfQ1NfRU5BQkxFX0lOU0VSVElPTiwKKwlNQkhDX0NTX0VOQUJMRV9SRU1PVkFMLAorCU1CSENfQ1NfRU5BQkxFX0RFVF9BTkMsCit9OworCitlbnVtIHdjZDl4eHhfbWJoY19zdGF0ZSB7CisJTUJIQ19TVEFURV9OT05FID0gLTEsCisJTUJIQ19TVEFURV9QT1RFTlRJQUwsCisJTUJIQ19TVEFURV9QT1RFTlRJQUxfUkVDT1ZFUlksCisJTUJIQ19TVEFURV9SRUxFQVNFLAorfTsKKworZW51bSB3Y2Q5eHh4X21iaGNfYnRuX2RldF9tZW0geworCU1CSENfQlROX0RFVF9WX0JUTl9MT1csCisJTUJIQ19CVE5fREVUX1ZfQlROX0hJR0gsCisJTUJIQ19CVE5fREVUX05fUkVBRFksCisJTUJIQ19CVE5fREVUX05fQ0lDLAorCU1CSENfQlROX0RFVF9HQUlOCit9OworCitlbnVtIHdjZDl4eHhfbWJoY19jbGtfZnJlcSB7CisJVEFJS09fTUNMS18xMlAyTUhaID0gMCwKKwlUQUlLT19NQ0xLXzlQNk1IWiwKKwlUQUlLT19OVU1fQ0xLX0ZSRVFTLAorfTsKKworZW51bSB3Y2Q5eHh4X21iaGNfZXZlbnRfc3RhdGUgeworCU1CSENfRVZFTlRfUEFfSFBITCwKKwlNQkhDX0VWRU5UX1BBX0hQSFIsCisJTUJIQ19FVkVOVF9QUkVfVFhfM19PTiwKKwlNQkhDX0VWRU5UX1BPU1RfVFhfM19PRkYsCit9OworCitlbnVtIG1iaGNfaHBoX3R5cGUgeworCU1CSENfSFBIX05PTkUgPSAwLAorCU1CSENfSFBIX01PTk8sCisJTUJIQ19IUEhfU1RFUkVPLAorfTsKKworc3RydWN0IHdjZDl4eHhfbWJoY19nZW5lcmFsX2NmZyB7CisJdTggdF9sZG9oOworCXU4IHRfYmdfZmFzdF9zZXR0bGU7CisJdTggdF9zaHV0ZG93bl9wbHVnX3JlbTsKKwl1OCBtYmhjX25zYTsKKwl1OCBtYmhjX25hdmc7CisJdTggdl9taWNiaWFzX2w7CisJdTggdl9taWNiaWFzOworCXU4IG1iaGNfcmVzZXJ2ZWQ7CisJdTE2IHNldHRsZV93YWl0OworCXUxNiB0X21pY2JpYXNfcmFtcHVwOworCXUxNiB0X21pY2JpYXNfcmFtcGRvd247CisJdTE2IHRfc3VwcGx5X2JyaW5ndXA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd2NkOXh4eF9tYmhjX3BsdWdfZGV0ZWN0X2NmZyB7CisJdTMyIG1pY19jdXJyZW50OworCXUzMiBocGhfY3VycmVudDsKKwl1MTYgdF9taWNfcGlkOworCXUxNiB0X2luc19jb21wbGV0ZTsKKwl1MTYgdF9pbnNfcmV0cnk7CisJdTE2IHZfcmVtb3ZhbF9kZWx0YTsKKwl1OCBtaWNiaWFzX3Nsb3dfcmFtcDsKKwl1OCByZXNlcnZlZDA7CisJdTggcmVzZXJ2ZWQxOworCXU4IHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlX2NmZyB7CisJdTggYXZfZGV0ZWN0OworCXU4IG1vbm9fZGV0ZWN0OworCXU4IG51bV9pbnNfdHJpZXM7CisJdTggcmVzZXJ2ZWQwOworCXMxNiB2X25vX21pYzsKKwlzMTYgdl9hdl9taW47CisJczE2IHZfYXZfbWF4OworCXMxNiB2X2hzX21pbjsKKwlzMTYgdl9oc19tYXg7CisJdTE2IHJlc2VydmVkMTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgeworCXM4IGNbOF07CisJdTggbmM7CisJdTggbl9tZWFzOworCXU4IG1iaGNfbnNjOworCXU4IG5fYnRuX21lYXM7CisJdTggbl9idG5fY29uOworCXU4IG51bV9idG47CisJdTggcmVzZXJ2ZWQwOworCXU4IHJlc2VydmVkMTsKKwl1MTYgdF9wb2xsOworCXUxNiB0X2JvdW5jZV93YWl0OworCXUxNiB0X3JlbF90aW1lb3V0OworCXMxNiB2X2J0bl9wcmVzc19kZWx0YV9zdGE7CisJczE2IHZfYnRuX3ByZXNzX2RlbHRhX2NpYzsKKwl1MTYgdF9idG4wX3RpbWVvdXQ7CisJczE2IF92X2J0bl9sb3dbMF07IC8qIHZfYnRuX2xvd1tudW1fYnRuXSAqLworCXMxNiBfdl9idG5faGlnaFswXTsgLyogdl9idG5faGlnaFtudW1fYnRuXSAqLworCXU4IF9uX3JlYWR5W1RBSUtPX05VTV9DTEtfRlJFUVNdOworCXU4IF9uX2NpY1tUQUlLT19OVU1fQ0xLX0ZSRVFTXTsKKwl1OCBfZ2FpbltUQUlLT19OVU1fQ0xLX0ZSRVFTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2Q5eHh4X21iaGNfaW1wZWRfZGV0ZWN0X2NmZyB7CisJdTggX2hzX2ltcGVkX2RldGVjdDsKKwl1OCBfbl9ybG9hZDsKKwl1OCBfaHBoX2tlZXBfb247CisJdTggX3JlcGVhdF9ybG9hZF9jYWxjOworCXUxNiBfdF9kYWNfcmFtcF90aW1lOworCXUxNiBfcmhwaF9oaWdoOworCXUxNiBfcmhwaF9sb3c7CisJdTE2IF9ybG9hZFswXTsgLyogcmxvYWRbbl9ybG9hZF0gKi8KKwl1MTYgX2FscGhhWzBdOyAvKiBhbHBoYVtuX3Jsb2FkXSAqLworCXUxNiBfYmV0YVszXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3Y2Q5eHh4X21iaGNfY29uZmlnIHsKKwlib29sIHJlYWRfZndfYmluOworCS8qCisJICogdm9pZCogY2FsaWJyYXRpb24gY29udGFpbnM6CisJICogIHN0cnVjdCB3Y2Q5eHh4X21iaGNfZ2VuZXJhbF9jZmcgZ2VuZXJpYzsKKwkgKiAgc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX2RldGVjdF9jZmcgcGx1Z19kZXQ7CisJICogIHN0cnVjdCB3Y2Q5eHh4X21iaGNfcGx1Z190eXBlX2NmZyBwbHVnX3R5cGU7CisJICogIHN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcgYnRuX2RldDsKKwkgKiAgc3RydWN0IHdjZDl4eHhfbWJoY19pbXBlZF9kZXRlY3RfY2ZnIGltcGVkX2RldDsKKwkgKiBOb3RlOiB2YXJpb3VzIHNpemUgZGVwZW5kcyBvbiBidG5fZGV0LT5udW1fYnRuCisJICovCisJdm9pZCAqY2FsaWJyYXRpb247CisJZW51bSB3Y2Q5eHh4X21pY2JpYXNfbnVtIG1pY2JpYXM7CisJZW51bSB3Y2Q5eHh4X21pY2JpYXNfbnVtIGFuY19taWNiaWFzOworCWludCAoKm1jbGtfY2JfZm4pKHN0cnVjdCBzbmRfc29jX2NvZGVjKiwgaW50LCBib29sKTsKKwl1bnNpZ25lZCBpbnQgbWNsa19yYXRlOworCXVuc2lnbmVkIGludCBncGlvOworCXVuc2lnbmVkIGludCBncGlvX2lycTsKKwlpbnQgZ3Bpb19sZXZlbF9pbnNlcnQ7CisJYm9vbCBpbnNlcnRfZGV0ZWN0OyAvKiBjb2RlYyBoYXMgb3duIE1CSENfSU5TRVJUX0RFVEVDVCAqLworCWJvb2wgZGV0ZWN0X2V4dG5fY2FibGU7CisJLyogYml0IG1hc2sgb2YgZW51bSB3Y2Q5eHhfbWJoY19taWNiaWFzX2VuYWJsZV9iaXRzICovCisJdW5zaWduZWQgbG9uZyBtaWNiaWFzX2VuYWJsZV9mbGFnczsKKwkvKiBzd2FwX2duZF9taWMgcmV0dXJucyB0cnVlIGlmIGV4dGVybiBHTkQvTUlDIHN3YXAgc3dpdGNoIHRvZ2dsZWQgKi8KKwlib29sICgqc3dhcF9nbmRfbWljKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKKwl1bnNpZ25lZCBsb25nIGNzX2VuYWJsZV9mbGFnczsKKwlib29sIHVzZV9pbnRfcmJpYXM7CisJYm9vbCBkb19yZWNhbGlicmF0aW9uOworCWJvb2wgdXNlX3ZkZGlvX21lYXM7CisJYm9vbCBlbmFibGVfYW5jX21pY19kZXRlY3Q7CisJZW51bSBod19qYWNrX3R5cGUgaHdfamFja190eXBlOworCWludCBrZXlfY29kZVs4XTsKK307CisKK3N0cnVjdCB3Y2Q5eHh4X2NmaWx0X21vZGUgeworCXU4IHJlZ19tb2RlX3ZhbDsKKwl1OCBjdXJfbW9kZV92YWw7CisJdTggcmVnX21hc2s7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2ludHIgeworCWludCBwb2xsX3BsdWdfcmVtOworCWludCBzaG9ydGF2Z19jb21wbGV0ZTsKKwlpbnQgcG90ZW50aWFsX2J1dHRvbl9wcmVzczsKKwlpbnQgYnV0dG9uX3JlbGVhc2U7CisJaW50IGRjZV9lc3RfY29tcGxldGU7CisJaW50IGluc2VydGlvbjsKKwlpbnQgaHBoX2xlZnRfb2NwOworCWludCBocGhfcmlnaHRfb2NwOworCWludCBoc19qYWNrX3N3aXRjaDsKK307CisKK3N0cnVjdCB3Y2Q5eHh4X21iaGNfY2IgeworCXZvaWQgKCplbmFibGVfbXV4X2JpYXNfYmxvY2spKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOworCXZvaWQgKCpjZmlsdF9mYXN0X21vZGUpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHN0cnVjdCB3Y2Q5eHh4X21iaGMgKik7CisJdm9pZCAoKmNvZGVjX3NwZWNpZmljX2NhbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKKwkJCQkgICAgc3RydWN0IHdjZDl4eHhfbWJoYyAqKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9jZmlsdF9tb2RlICgqc3dpdGNoX2NmaWx0X21vZGUpKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKiwKKwkJCQkJCQlib29sKTsKKwl2b2lkICgqc2VsZWN0X2NmaWx0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjICopOworCWVudW0gd2NkOXh4eF9jZGNfdHlwZSAoKmdldF9jZGNfdHlwZSkodm9pZCk7CisJdm9pZCAoKmVuYWJsZV9jbG9ja19nYXRlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwlpbnQgKCpzZXR1cF96ZGV0KShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICosCisJCQkgICBlbnVtIG1iaGNfaW1wZWRhbmNlX2RldGVjdF9zdGFnZXMgc3RhZ2UpOworCXZvaWQgKCpjb21wdXRlX2ltcGVkYW5jZSkoc3RydWN0IHdjZDl4eHhfbWJoYyAqLCBzMTYgKiwgczE2ICosCisJCQkJICAgdWludDMyX3QgKiwgdWludDMyX3QgKik7CisJdm9pZCAoKnpkZXRfZXJyb3JfYXBwcm94KShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICosIHVpbnQzMl90ICosCisJCQkJICAgIHVpbnQzMl90ICopOworCXZvaWQgKCplbmFibGVfbWJoY190eGZlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwlpbnQgKCplbmFibGVfbWJfc291cmNlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sLCBib29sKTsKKwl2b2lkICgqc2V0dXBfaW50X3JiaWFzKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwl2b2lkICgqcHVsbF9tYl90b192ZGRpbykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7CisJYm9vbCAoKmluc2VydF9yZW1fc3RhdHVzKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKKwl2b2lkICgqbWljYmlhc19wdWxsZG93bl9jdHJsKShzdHJ1Y3Qgd2NkOXh4eF9tYmhjICosIGJvb2wpOworCWludCAoKmNvZGVjX3Jjb19jdHJsKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKKwl2b2lkICgqaHBoX2F1dG9fcHVsbGRvd25fY3RybCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqICgqZ2V0X2h3ZGVwX2Z3X2NhbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKKwkJCQllbnVtIHdjZF9jYWxfdHlwZSk7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9tYmhjIHsKKwlib29sIHBvbGxpbmdfYWN0aXZlOworCS8qIERlbGF5ZWQgd29yayB0byByZXBvcnQgbG9uZyBidXR0b24gcHJlc3MgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG1iaGNfYnRuX2R3b3JrOworCWludCBidXR0b25zX3ByZXNzZWQ7CisJZW51bSB3Y2Q5eHh4X21iaGNfc3RhdGUgbWJoY19zdGF0ZTsKKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2NvbmZpZyAqbWJoY19jZmc7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19jYiAqbWJoY19jYjsKKworCXN0cnVjdCBtYmhjX2ludGVybmFsX2NhbF9kYXRhIG1iaGNfZGF0YTsKKworCXN0cnVjdCBtYmhjX21pY2JpYXNfcmVncyBtYmhjX2JpYXNfcmVnczsKKwlzdHJ1Y3QgbWJoY19taWNiaWFzX3JlZ3MgbWJoY19hbmNfYmlhc19yZWdzOworCisJYm9vbCBtYmhjX21pY2JpYXNfc3dpdGNoZWQ7CisKKwl1MzIgaHBoX3N0YXR1czsgLyogdHJhY2sgaGVhZGhwb25lIHN0YXR1cyAqLworCXU4IGhwaGxvY3BfY250OyAvKiBoZWFkcGhvbmUgbGVmdCBvY3AgcmV0cnkgKi8KKwl1OCBocGhyb2NwX2NudDsgLyogaGVhZHBob25lIHJpZ2h0IG9jcCByZXRyeSAqLworCisJLyogV29yayB0byBwZXJmb3JtIE1CSEMgRmlybXdhcmUgUmVhZCAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgbWJoY19maXJtd2FyZV9kd29yazsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm1iaGNfZnc7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqbWJoY19jYWw7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG1iaGNfaW5zZXJ0X2R3b3JrOworCisJdTggY3VycmVudF9wbHVnOworCXN0cnVjdCB3b3JrX3N0cnVjdCBjb3JyZWN0X3BsdWdfc3djaDsKKwkvKgorCSAqIFdvcmsgdG8gcGVyZm9ybSBwb2xsaW5nIG9uIG1pY3JvcGhvbmUgdm9sdGFnZQorCSAqIGluIG9yZGVyIHRvIGNvcnJlY3QgcGx1ZyB0eXBlIG9uY2UgcGx1ZyB0eXBlCisJICogaXMgZGV0ZWN0ZWQgYXMgaGVhZHBob25lCisJICovCisJc3RydWN0IHdvcmtfc3RydWN0IGNvcnJlY3RfcGx1Z19ub3N3Y2g7CisJYm9vbCBoc19kZXRlY3Rfd29ya19zdG9wOworCisJYm9vbCBscGlfZW5hYmxlZDsgLyogbG93IHBvd2VyIGluc2VydGlvbiBkZXRlY3Rpb24gKi8KKwlib29sIGluX3N3Y2hfaXJxX2hhbmRsZXI7CisKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlib29sIG5vX21pY19oZWFkc2V0X292ZXJyaWRlOworCisJLyogdHJhY2sgUEEvREFDIHN0YXRlIHRvIHN5bmMgd2l0aCB1c2Vyc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGhwaF9wYV9kYWNfc3RhdGU7CisJLyoKKwkgKiBzYXZlIGNvZGVjJ3Mgc3RhdGUgd2l0aCByZXNtZ3IgZXZlbnQgbm90aWZpY2F0aW9uCisJICogYml0IGZsYWdzIG9mIGVudW0gd2NkOXh4eF9tYmhjX2V2ZW50X3N0YXRlCisJICovCisJdW5zaWduZWQgbG9uZyBldmVudF9zdGF0ZTsKKworCXVuc2lnbmVkIGxvbmcgbWJoY19sYXN0X3Jlc3VtZTsgLyogaW4gamlmZmllcyAqLworCisJYm9vbCBpbnNlcnRfZGV0ZWN0X2xldmVsX2luc2VydDsKKworCXN0cnVjdCBzbmRfc29jX2phY2sgaGVhZHNldF9qYWNrOworCXN0cnVjdCBzbmRfc29jX2phY2sgYnV0dG9uX2phY2s7CisKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmJsb2NrOworCisJYm9vbCBtaWNiaWFzX2VuYWJsZTsKKwlpbnQgKCptaWNiaWFzX2VuYWJsZV9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMqLCAgYm9vbCwKKwkJCQkgIGVudW0gd2NkOXh4eF9taWNiaWFzX251bSk7CisKKwlib29sIGltcGVkYW5jZV9kZXRlY3Q7CisJLyogaW1wZWRhbmNlIG9mIGhwaGwgYW5kIGhwaHIgKi8KKwl1aW50MzJfdCB6bCwgenI7CisKKwl1MzIgcmNvX2Nsa19yYXRlOworCisJYm9vbCB1cGRhdGVfejsKKworCXU4ICAgc2NhbGluZ19tdXhfaW47CisJLyogSG9sZHMgY29kZWMgc3BlY2lmaWMgaW50ZXJydXB0IG1hcHBpbmcgKi8KKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2ludHIgKmludHJfaWRzOworCisJLyogSW5kaWNhdGVzIHN0YXR1cyBvZiBjdXJyZW50IHNvdXJjZSBzd2l0Y2ggKi8KKwlib29sIGlzX2NzX2VuYWJsZWQ7CisKKwkvKiBIb2xkcyB0eXBlIG9mIEhlYWRzZXQgLSBNb25vL1N0ZXJlbyAqLworCWVudW0gbWJoY19ocGhfdHlwZSBocGhfdHlwZTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG9rZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX21iaGM7CisjZW5kaWYKKworCXN0cnVjdCBtdXRleCBtYmhjX2xvY2s7Cit9OworCisjZGVmaW5lIFdDRDlYWFhfTUJIQ19DQUxfU0laRShidXR0b25zLCBybG9hZCkgKCBcCisJc2l6ZW9mKGVudW0gd2NkOXh4eF9taWNiaWFzX251bSkgKyBcCisJc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfZ2VuZXJhbF9jZmcpICsgXAorCXNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9tYmhjX3BsdWdfZGV0ZWN0X2NmZykgKyBcCisJICAgICgoc2l6ZW9mKHMxNikgKyBzaXplb2YoczE2KSkgKiBidXR0b25zKSArIFwKKwlzaXplb2Yoc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnKSArIFwKKwlzaXplb2Yoc3RydWN0IHdjZDl4eHhfbWJoY19idG5fZGV0ZWN0X2NmZykgKyBcCisJc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBcCisJICAgICgoc2l6ZW9mKHUxNikgKyBzaXplb2YodTE2KSkgKiBybG9hZCkgXAorCSkKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfQ0FMX0dFTkVSQUxfUFRSKGNhbGkpICggXAorCSAgICAoc3RydWN0IHdjZDl4eHhfbWJoY19nZW5lcmFsX2NmZyAqKSBjYWxpKQorI2RlZmluZSBXQ0Q5WFhYX01CSENfQ0FMX1BMVUdfREVUX1BUUihjYWxpKSAoIFwKKwkgICAgKHN0cnVjdCB3Y2Q5eHh4X21iaGNfcGx1Z19kZXRlY3RfY2ZnICopIFwKKwkgICAgJihXQ0Q5WFhYX01CSENfQ0FMX0dFTkVSQUxfUFRSKGNhbGkpWzFdKSkKKyNkZWZpbmUgV0NEOVhYWF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKGNhbGkpICggXAorCSAgICAoc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnICopIFwKKwkgICAgJihXQ0Q5WFhYX01CSENfQ0FMX1BMVUdfREVUX1BUUihjYWxpKVsxXSkpCisjZGVmaW5lIFdDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSkgKCBcCisJICAgIChzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2J0bl9kZXRlY3RfY2ZnICopIFwKKwkgICAgJihXQ0Q5WFhYX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIoY2FsaSlbMV0pKQorI2RlZmluZSBXQ0Q5WFhYX01CSENfQ0FMX0lNUEVEX0RFVF9QVFIoY2FsaSkgKCBcCisJICAgIChzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2ltcGVkX2RldGVjdF9jZmcgKikgXAorCSAgICAoKCh2b2lkICopJldDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSlbMV0pICsgXAorCSAgICAgKFdDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSktPm51bV9idG4gKiBcCisJICAgICAgKHNpemVvZihXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKGNhbGkpLT5fdl9idG5fbG93WzBdKSArIFwKKwkgICAgICAgc2l6ZW9mKFdDRDlYWFhfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSktPl92X2J0bl9oaWdoWzBdKSkpKSBcCisJKQorCisvKiBtaW5pbXVtIHNpemUgb2YgY2FsaWJyYXRpb24gZGF0YSBhc3N1bWluZyB0aGVyZSBpcyBvbmx5IG9uZSBidXR0b24gYW5kCisgKiBvbmUgcmxvYWQuCisgKi8KKyNkZWZpbmUgV0NEOVhYWF9NQkhDX0NBTF9NSU5fU0laRSAoIFwKKwkgICAgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfZ2VuZXJhbF9jZmcpICsgXAorCSAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX2RldGVjdF9jZmcpICsgXAorCSAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfbWJoY19wbHVnX3R5cGVfY2ZnKSArIFwKKwkgICAgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcpICsgXAorCSAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfbWJoY19pbXBlZF9kZXRlY3RfY2ZnKSArIFwKKwkgICAgKHNpemVvZih1MTYpICogMikgXAorCSkKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfQ0FMX0JUTl9TWihjZmdfcHRyKSAoIFwKKwkgICAgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfYnRuX2RldGVjdF9jZmcpICsgXAorCSAgICAoY2ZnX3B0ci0+bnVtX2J0biAqIChzaXplb2YoY2ZnX3B0ci0+X3ZfYnRuX2xvd1swXSkgKyBcCisJCQkJIHNpemVvZihjZmdfcHRyLT5fdl9idG5faGlnaFswXSkpKSkKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfQ0FMX0lNUEVEX01JTl9TWiAoIFwKKwkgICAgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBzaXplb2YodTE2KSAqIDIpCisKKyNkZWZpbmUgV0NEOVhYWF9NQkhDX0NBTF9JTVBFRF9TWihjZmdfcHRyKSAoIFwKKwkgICAgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBcCisJICAgIChjZmdfcHRyLT5fbl9ybG9hZCAqIFwKKwkgICAgIChzaXplb2YoY2ZnX3B0ci0+X3Jsb2FkWzBdKSArIHNpemVvZihjZmdfcHRyLT5fYWxwaGFbMF0pKSkpCisKK2ludCB3Y2Q5eHh4X21iaGNfc2V0X2tleWNvZGUoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYyk7CitpbnQgd2NkOXh4eF9tYmhjX3N0YXJ0KHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsCisJCSAgICAgICBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpOwordm9pZCB3Y2Q5eHh4X21iaGNfc3RvcChzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjKTsKK2ludCB3Y2Q5eHh4X21iaGNfaW5pdChzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjLCBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJICAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgICBpbnQgKCptaWNiaWFzX2VuYWJsZV9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMqLCAgYm9vbCwKKwkJCQkJCWVudW0gd2NkOXh4eF9taWNiaWFzX251bSksCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfY2IgKm1iaGNfY2IsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X21iaGNfaW50ciAqbWJoY19jZGNfaW50cl9pZHMsCisJCSAgICAgIGludCByY29fY2xrX3JhdGUsCisJCSAgICAgIGJvb2wgaW1wZWRhbmNlX2RldF9lbik7Cit2b2lkIHdjZDl4eHhfbWJoY19kZWluaXQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYyk7Cit2b2lkICp3Y2Q5eHh4X21iaGNfY2FsX2J0bl9kZXRfbXAoCisJCQkgICAgY29uc3Qgc3RydWN0IHdjZDl4eHhfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2RldCwKKwkJCSAgICBjb25zdCBlbnVtIHdjZDl4eHhfbWJoY19idG5fZGV0X21lbSBtZW0pOworaW50IHdjZDl4eHhfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMsIHVpbnQzMl90ICp6bCwKKwkJCSAgICAgICB1aW50MzJfdCAqenIpOworI2VuZGlmIC8qIF9fV0NEOVhYWF9NQkhDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTEzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLXYyLmMKQEAgLTAsMCArMSw2NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3ItdjIuaCIKKworI2RlZmluZSBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9JTkNfVVMgNTAwMAorI2RlZmluZSBXQ0Q5M1hYX0FOQV9CSUFTIDB4MDYwMQorI2RlZmluZSBXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MIDB4MGQ0MQorI2RlZmluZSBXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wgMHgwZDQyCisKK3N0YXRpYyB2b2lkIHdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAorCQkJCQkgIGludCBzaWRvX3NyYyk7CitzdGF0aWMgY29uc3QgY2hhciAqd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIoZW51bSB3Y2RfY2xvY2tfdHlwZSBjbGtfdHlwZSkKK3sKKwlpZiAoY2xrX3R5cGUgPT0gV0NEX0NMS19PRkYpCisJCXJldHVybiAiV0NEX0NMS19PRkYiOworCWVsc2UgaWYgKGNsa190eXBlID09IFdDRF9DTEtfUkNPKQorCQlyZXR1cm4gIldDRF9DTEtfUkNPIjsKKwllbHNlIGlmIChjbGtfdHlwZSA9PSBXQ0RfQ0xLX01DTEspCisJCXJldHVybiAiV0NEX0NMS19NQ0xLIjsKKwllbHNlCisJCXJldHVybiAiV0NEX0NMS19VTkRFRklORUQiOworfQorCitzdGF0aWMgaW50IHdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAorCQkJCQkgICAgdTE2IHJlZywgdTggbWFzaywgdTggdmFsKQoreworCWJvb2wgY2hhbmdlOworCWludCByZXQ7CisKKwlpZiAocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpIHsKKwkJLyogVGF2aWwgZG9lcyBub3Qgc3VwcG9ydCBBTkFfQ0xLX1RPUCByZWdpc3RlciAqLworCQlpZiAocmVnID09IFdDRDkzMzVfQU5BX0NMS19UT1ApCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiBUYXNoYSBkb2VzIG5vdCBzdXBwb3J0IENMS19TWVNfTUNMS19QUkcgcmVnaXN0ZXIgKi8KKwkJaWYgKHJlZyA9PSBXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJlc21nci0+Y29kZWMpIHsKKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyhyZXNtZ3ItPmNvZGVjLCByZWcsIG1hc2ssIHZhbCk7CisJfSBlbHNlIGlmIChyZXNtZ3ItPmNvcmVfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzX2NoZWNrKAorCQkJCXJlc21nci0+Y29yZV9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCQlyZWcsIG1hc2ssIHZhbCwgJmNoYW5nZSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY2hhbmdlOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGNvZGVjL3JlZ21hcCBub3QgZGVmaW5lZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3Jlc21ncl9jb2RlY19yZWdfcmVhZChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IHZhbCwgcmV0OworCisJaWYgKHJlc21nci0+Y29kZWNfdHlwZSA9PSBXQ0Q5MzRYKSB7CisJCWlmIChyZWcgPT0gV0NEOTMzNV9BTkFfQ0xLX1RPUCkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChyZWcgPT0gV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChyZXNtZ3ItPmNvZGVjKSB7CisJCXZhbCA9IHNuZF9zb2NfcmVhZChyZXNtZ3ItPmNvZGVjLCByZWcpOworCX0gZWxzZSBpZiAocmVzbWdyLT5jb3JlX3Jlcy0+d2NkX2NvcmVfcmVnbWFwKSB7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlc21nci0+Y29yZV9yZXMtPndjZF9jb3JlX3JlZ21hcCwKKwkJCQkgIHJlZywgJnZhbCk7CisJCWlmIChyZXQpCisJCQl2YWwgPSByZXQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogd2NkIHJlZ21hcCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiB3Y2RfcmVzbWdyX2dldF9jbGtfdHlwZSgpCisgKiBSZXR1cm5zIGNsayB0eXBlIHRoYXQgaXMgY3VycmVudGx5IGVuYWJsZWQKKyAqLworaW50IHdjZF9yZXNtZ3JfZ2V0X2Nsa190eXBlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCWlmICghcmVzbWdyKSB7CisJCXByX2VycigiJXM6IHJlc21nciBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiByZXNtZ3ItPmNsa190eXBlOworfQorCitzdGF0aWMgdm9pZCB3Y2RfcmVzbWdyX2NkY19zcGVjaWZpY19nZXRfY2xrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAorCQkJCQkJaW50IGNsa191c2VycykKK3sKKwkvKiBDYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBhY3F1aXJlZCBCR19DTEsgbG9jayAqLworCWlmIChjbGtfdXNlcnMpIHsKKwkJaWYgKHJlc21nci0+cmVzbWdyX2NiICYmCisJCSAgICByZXNtZ3ItPnJlc21ncl9jYi0+Y2RjX3Jjb19jdHJsKSB7CisJCQl3aGlsZSAoY2xrX3VzZXJzLS0pCisJCQkJcmVzbWdyLT5yZXNtZ3JfY2ItPmNkY19yY29fY3RybChyZXNtZ3ItPmNvZGVjLAorCQkJCQkJCQl0cnVlKTsKKwkJfQorCX0KK30KKwordm9pZCB3Y2RfcmVzbWdyX3Bvc3Rfc3NyX3YyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCWludCBvbGRfYmdfYXVkaW9fdXNlcnM7CisJaW50IG9sZF9jbGtfcmNvX3VzZXJzLCBvbGRfY2xrX21jbGtfdXNlcnM7CisKKwlXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHJlc21ncik7CisKKwlvbGRfYmdfYXVkaW9fdXNlcnMgPSByZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzOworCW9sZF9jbGtfbWNsa191c2VycyA9IHJlc21nci0+Y2xrX21jbGtfdXNlcnM7CisJb2xkX2Nsa19yY29fdXNlcnMgPSByZXNtZ3ItPmNsa19yY29fdXNlcnM7CisJcmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycyA9IDA7CisJcmVzbWdyLT5jbGtfbWNsa191c2VycyA9IDA7CisJcmVzbWdyLT5jbGtfcmNvX3VzZXJzID0gMDsKKwlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19PRkY7CisKKwlwcl9kZWJ1ZygiJXM6IG9sZF9iZ19hdWRpb191c2Vycz0lZCBvbGRfY2xrX21jbGtfdXNlcnM9JWQgb2xkX2Nsa19yY29fdXNlcnM9JWRcbiIsCisJCSBfX2Z1bmNfXywgb2xkX2JnX2F1ZGlvX3VzZXJzLAorCQkgb2xkX2Nsa19tY2xrX3VzZXJzLCBvbGRfY2xrX3Jjb191c2Vycyk7CisKKwlpZiAob2xkX2JnX2F1ZGlvX3VzZXJzKSB7CisJCXdoaWxlIChvbGRfYmdfYXVkaW9fdXNlcnMtLSkKKwkJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHJlc21ncik7CisJfQorCisJaWYgKG9sZF9jbGtfbWNsa191c2VycykgeworCQl3aGlsZSAob2xkX2Nsa19tY2xrX3VzZXJzLS0pCisJCQl3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2socmVzbWdyLCBXQ0RfQ0xLX01DTEspOworCX0KKworCWlmIChvbGRfY2xrX3Jjb191c2VycykKKwkJd2NkX3Jlc21ncl9jZGNfc3BlY2lmaWNfZ2V0X2NsayhyZXNtZ3IsIG9sZF9jbGtfcmNvX3VzZXJzKTsKKworCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyhyZXNtZ3IpOworfQorCisKKy8qCisgKiB3Y2RfcmVzbWdyX2VuYWJsZV9tYXN0ZXJfYmlhczogZW5hYmxlIGNvZGVjIG1hc3RlciBiaWFzCisgKiBAcmVzbWdyOiBoYW5kbGUgdG8gc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyCisgKi8KK2ludCB3Y2RfcmVzbWdyX2VuYWJsZV9tYXN0ZXJfYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncikKK3sKKwltdXRleF9sb2NrKCZyZXNtZ3ItPm1hc3Rlcl9iaWFzX2xvY2spOworCisJcmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycysrOworCWlmIChyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzID09IDEpIHsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5M1hYX0FOQV9CSUFTLAorCQkJCQkJIDB4ODAsIDB4ODApOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzWFhfQU5BX0JJQVMsCisJCQkJCQkgMHg0MCwgMHg0MCk7CisJCS8qCisJCSAqIDFtcyBkZWxheSBpcyByZXF1aXJlZCBhZnRlciBwcmUtY2hhcmdlIGlzIGVuYWJsZWQKKwkJICogYXMgcGVyIEhXIHJlcXVpcmVtZW50CisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTNYWF9BTkFfQklBUywKKwkJCQkJCSAweDQwLCAweDAwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQkJV0NEOTNYWF9BTkFfQklBUywgMHgyMCwgMHgwMCk7CisJfQorCisJcHJfZGVidWcoIiVzOiBjdXJyZW50IG1hc3RlciBiaWFzIHVzZXJzOiAlZFxuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzKTsKKworCW11dGV4X3VubG9jaygmcmVzbWdyLT5tYXN0ZXJfYmlhc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhczogZGlzYWJsZSBjb2RlYyBtYXN0ZXIgYmlhcworICogQHJlc21ncjogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MgorICovCitpbnQgd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCW11dGV4X2xvY2soJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7CisJaWYgKHJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMgPD0gMCkgeworCQltdXRleF91bmxvY2soJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMtLTsKKwlpZiAocmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycyA9PSAwKSB7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTNYWF9BTkFfQklBUywKKwkJCQkJCSAweDgwLCAweDAwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQkJV0NEOTNYWF9BTkFfQklBUywgMHgyMCwgMHgwMCk7CisJfQorCW11dGV4X3VubG9jaygmcmVzbWdyLT5tYXN0ZXJfYmlhc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfbWNsayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncikKK3sKKwkvKiBFbmFibGUgbWNsayByZXF1aXJlcyBtYXN0ZXIgYmlhcyB0byBiZSBlbmFibGVkIGZpcnN0ICovCisJaWYgKHJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgdHVybiBvbiBNQ0xLLCBCRyBpcyBub3QgZW5hYmxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCgocmVzbWdyLT5jbGtfbWNsa191c2VycyA9PSAwKSAmJgorCSAgICAgKHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEX0NMS19NQ0xLKSkgfHwKKwkgICAgKChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzID4gMCkgJiYKKwkgICAgKHJlc21nci0+Y2xrX3R5cGUgIT0gV0NEX0NMS19NQ0xLKSkpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgZW5hYmxpbmcgTUNMSywgY2xrX3R5cGU6ICVzXG4iLAorCQkJX19mdW5jX18sCisJCQl3Y2RfcmVzbWdyX2Nsa190eXBlX3RvX3N0cihyZXNtZ3ItPmNsa190eXBlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgrK3Jlc21nci0+Y2xrX21jbGtfdXNlcnMgPT0gMSkgeworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJV0NEOTMzNV9BTkFfQ0xLX1RPUCwgMHg4MCwgMHg4MCk7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQlXQ0Q5MzM1X0FOQV9DTEtfVE9QLCAweDA4LCAweDAwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCVdDRDkzMzVfQU5BX0NMS19UT1AsIDB4MDQsIDB4MDQpOworCQlpZiAocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpIHsKKwkJCS8qCisJCQkgKiBJbiB0YXZpbCBjbG9jayBjb250cmwgcmVnaXN0ZXIgaXMgY2hhbmdlZAorCQkJICogdG8gQ0xLX1NZU19NQ0xLX1BSRworCQkJICovCisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCVdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgMHgwMiwgMHgwMCk7CisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCVdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgMHg5MSwgMHg5MSk7CisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCVdDRDkzWFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwKKwkJCQkJMHgwMSwgMHgwMSk7CisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCVdDRDkzWFhfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wsCisJCQkJCTB4MDEsIDB4MDEpOworCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQlXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCisJCQkJCTB4MDQsIDB4MDQpOworCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQlXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAorCQkJCQkweDAxLCAweDAxKTsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUsIDB4MDMsIDB4MDApOworCQkJd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmMocmVzbWdyLAorCQkJCQkJICAgICAgU0lET19TT1VSQ0VfUkNPX0JHKTsKKwkJfSBlbHNlIHsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJV0NEOTNYWF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAorCQkJCQkweDAxLCAweDAxKTsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJV0NEOTNYWF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKKwkJCQkJMHgwMSwgMHgwMSk7CisJCX0KKwkJLyoKKwkJICogMTB1cyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBjbG9jayBpcyBlbmFibGVkCisJCSAqIGFzIHBlciBIVyByZXF1aXJlbWVudAorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDEwLCAxNSk7CisJfQorCisJcmVzbWdyLT5jbGtfdHlwZSA9IFdDRF9DTEtfTUNMSzsKKworCXByX2RlYnVnKCIlczogbWNsa191c2VyczogJWQsIGNsa190eXBlOiAlc1xuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPmNsa19tY2xrX3VzZXJzLAorCQkgd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIocmVzbWdyLT5jbGtfdHlwZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2NkX3Jlc21ncl9kaXNhYmxlX2Nsa19tY2xrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCWlmIChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzIDw9IDApIHsKKwkJcHJfZXJyKCIlczogTm8gbWNsayB1c2VycywgY2Fubm90IGRpc2FibGUgbWNsa1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoLS1yZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDApIHsKKwkJaWYgKHJlc21nci0+Y2xrX3Jjb191c2VycyA+IDApIHsKKwkJCS8qIE1DTEsgdG8gUkNPIHN3aXRjaCAqLworCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQlXQ0Q5MzM1X0FOQV9DTEtfVE9QLAorCQkJCQkweDA4LCAweDA4KTsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHLCAweDAyLCAweDAyKTsKKwkJCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0RfQ0xLX1JDTzsKKwkJfSBlbHNlIHsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJV0NEOTMzNV9BTkFfQ0xLX1RPUCwKKwkJCQkJMHgwNCwgMHgwMCk7CisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCVdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgMHg4MSwgMHgwMCk7CisJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19PRkY7CisJCX0KKworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX0NMS19UT1AsCisJCQkJCQkgMHg4MCwgMHgwMCk7CisJfQorCisJaWYgKChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOTM0WCkgJiYKKwkgICAgKHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEX0NMS19PRkYpKQorCQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyhyZXNtZ3IsIFNJRE9fU09VUkNFX0lOVEVSTkFMKTsKKworCXByX2RlYnVnKCIlczogbWNsa191c2VyczogJWQsIGNsa190eXBlOiAlc1xuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPmNsa19tY2xrX3VzZXJzLAorCQkgd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIocmVzbWdyLT5jbGtfdHlwZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdjZF9yZXNtZ3Jfc2V0X2J1Y2tfYWNjdXJhY3koc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpCit7CisJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKKwkJCQkJIDB4MDIsIDB4MDIpOworCS8qIDEwMHVzIHNsZWVwIG5lZWRlZCBhZnRlciBISUdIX0FDQ1VSQUNZX1BSRV9FTjEgKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTM0WF9BTkFfQlVDS19DVEwsCisJCQkJCSAweDAxLCAweDAxKTsKKwkvKiAxMDB1cyBzbGVlcCBuZWVkZWQgYWZ0ZXIgSElHSF9BQ0NVUkFDWV9QUkVfRU4yICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAorCQkJCQkgMHgwNCwgMHgwNCk7CisJLyogMTAwdXMgc2xlZXAgbmVlZGVkIGFmdGVyIEhJR0hfQUNDVVJBQ1lfRU4gKi8KKwl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworfQorCitzdGF0aWMgaW50IHdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19yY28oc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpCit7CisJYm9vbCByY29fY2FsX2RvbmUgPSB0cnVlOworCisJcmVzbWdyLT5jbGtfcmNvX3VzZXJzKys7CisJaWYgKChyZXNtZ3ItPmNsa19yY29fdXNlcnMgPT0gMSkgJiYKKwkgICAgKChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfT0ZGKSB8fAorCSAgICAgKHJlc21nci0+Y2xrX21jbGtfdXNlcnMgPT0gMCkpKSB7CisJCXByX3dhcm4oIiVzOiBSQ08gZW5hYmxlIHJlcXVpcmVzIE1DTEsgdG8gYmUgT04gZmlyc3RcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc21nci0+Y2xrX3Jjb191c2Vycy0tOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKChyZXNtZ3ItPmNsa19yY29fdXNlcnMgPT0gMSkgJiYKKwkJICAgKHJlc21nci0+Y2xrX21jbGtfdXNlcnMpKSB7CisJCS8qIFJDTyBFbmFibGUgKi8KKwkJaWYgKHJlc21nci0+c2lkb19pbnB1dF9zcmMgPT0gU0lET19TT1VSQ0VfSU5URVJOQUwpIHsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJCQkgV0NEOTMzNV9BTkFfUkNPLAorCQkJCQkJCSAweDgwLCAweDgwKTsKKwkJCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOTM0WCkKKwkJCQl3Y2RfcmVzbWdyX3NldF9idWNrX2FjY3VyYWN5KHJlc21ncik7CisJCX0KKworCQkvKgorCQkgKiAyMHVzIHJlcXVpcmVkIGFmdGVyIFJDTyBCRyBpcyBlbmFibGVkIGFzIHBlciBIVworCQkgKiByZXF1aXJlbWVudHMKKwkJICovCisJCXVzbGVlcF9yYW5nZSgyMCwgMjUpOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX1JDTywKKwkJCQkJCSAweDQwLCAweDQwKTsKKwkJLyoKKwkJICogMjB1cyByZXF1aXJlZCBhZnRlciBSQ08gaXMgZW5hYmxlZCBhcyBwZXIgSFcKKwkJICogcmVxdWlyZW1lbnRzCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMjAsIDI1KTsKKwkJLyogUkNPIENhbGlicmF0aW9uICovCisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTMzNV9BTkFfUkNPLAorCQkJCQkJIDB4MDQsIDB4MDQpOworCQlpZiAocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpCisJCQkvKgorCQkJICogRm9yIHdjZDkzNHggY29kZWMsIDIwdXMgc2xlZXAgaXMgbmVlZGVkCisJCQkgKiBhZnRlciBlbmFibGluZyBSQ08gY2FsaWJyYXRpb24KKwkJCSAqLworCQkJdXNsZWVwX3JhbmdlKDIwLCAyNSk7CisKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9SQ08sCisJCQkJCQkgMHgwNCwgMHgwMCk7CisJCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOTM0WCkKKwkJCS8qCisJCQkgKiBGb3Igd2NkOTM0eCBjb2RlYywgMjB1cyBzbGVlcCBpcyBuZWVkZWQKKwkJCSAqIGFmdGVyIGRpc2FibGluZyBSQ08gY2FsaWJyYXRpb24KKwkJCSAqLworCQkJdXNsZWVwX3JhbmdlKDIwLCAyNSk7CisKKwkJLyogUkNPIGNhbGlicmF0aW9uIHRha2VzIGFwcC4gNW1zIHRvIGNvbXBsZXRlICovCisJCXVzbGVlcF9yYW5nZShXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9JTkNfVVMsCisJCSAgICAgICBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9JTkNfVVMgKyAxMDApOworCQlpZiAod2NkX3Jlc21ncl9jb2RlY19yZWdfcmVhZChyZXNtZ3IsIFdDRDkzMzVfQU5BX1JDTykgJiAweDAyKQorCQkJcmNvX2NhbF9kb25lID0gZmFsc2U7CisKKwkJV0FSTigoIXJjb19jYWxfZG9uZSksICJSQ08gQ2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKKworCQkvKiBTd2l0Y2ggTVVYIHRvIFJDTyAqLworCQlpZiAocmVzbWdyLT5jbGtfbWNsa191c2VycyA9PSAxKSB7CisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCQkJV0NEOTMzNV9BTkFfQ0xLX1RPUCwKKwkJCQkJCQkweDA4LCAweDA4KTsKKwkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJCSBXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsCisJCQkJCQkgMHgwMiwgMHgwMik7CisJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19SQ087CisJCX0KKwl9CisJcHJfZGVidWcoIiVzOiByY28gY2xrIHVzZXJzOiAlZCwgY2xrX3R5cGU6ICVzXG4iLCBfX2Z1bmNfXywKKwkJIHJlc21nci0+Y2xrX3Jjb191c2VycywKKwkJIHdjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKHJlc21nci0+Y2xrX3R5cGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfcmNvKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCWlmICgocmVzbWdyLT5jbGtfcmNvX3VzZXJzIDw9IDApIHx8CisJICAgIChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfT0ZGKSkgeworCQlwcl9lcnIoIiVzOiByY29fY2xrX3VzZXJzID0gJWQsIGNsa190eXBlID0gJWQsIGNhbm5vdCBkaXNhYmxlXG4iLAorCQkJX19mdW5jX18sIHJlc21nci0+Y2xrX3Jjb191c2VycywgcmVzbWdyLT5jbGtfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlc21nci0+Y2xrX3Jjb191c2Vycy0tOworCisJaWYgKChyZXNtZ3ItPmNsa19yY29fdXNlcnMgPT0gMCkgJiYKKwkgICAgKHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEX0NMS19SQ08pKSB7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKKwkJCQkJCSAweDA4LCAweDAwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAorCQkJCQkJIFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywKKwkJCQkJCSAweDAyLCAweDAwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9DTEtfVE9QLAorCQkJCQkJIDB4MDQsIDB4MDApOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX1JDTywKKwkJCQkJCSAweDQwLCAweDAwKTsKKwkJaWYgKHJlc21nci0+c2lkb19pbnB1dF9zcmMgPT0gU0lET19TT1VSQ0VfSU5URVJOQUwpCisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCQkJIFdDRDkzMzVfQU5BX1JDTywKKwkJCQkJCQkgMHg4MCwgMHgwMCk7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKKwkJCQkJCSBXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsCisJCQkJCQkgMHgwMSwgMHgwMCk7CisJCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0RfQ0xLX09GRjsKKwl9IGVsc2UgaWYgKChyZXNtZ3ItPmNsa19yY29fdXNlcnMgPT0gMCkgJiYKKwkgICAgICAocmVzbWdyLT5jbGtfbWNsa191c2VycykpIHsKKwkJLyogRGlzYWJsZSBSQ08gd2hpbGUgTUNMSyBpcyBPTiAqLworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX1JDTywKKwkJCQkJCSAweDQwLCAweDAwKTsKKwkJaWYgKHJlc21nci0+c2lkb19pbnB1dF9zcmMgPT0gU0lET19TT1VSQ0VfSU5URVJOQUwpCisJCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCisJCQkJCQkJIFdDRDkzMzVfQU5BX1JDTywKKwkJCQkJCQkgMHg4MCwgMHgwMCk7CisJfQorCisJaWYgKChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOTM0WCkgJiYKKwkgICAgKHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEX0NMS19PRkYpKQorCQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyhyZXNtZ3IsIFNJRE9fU09VUkNFX0lOVEVSTkFMKTsKKworCXByX2RlYnVnKCIlczogcmNvIGNsayB1c2VyczogJWQsIGNsa190eXBlOiAlc1xuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPmNsa19yY29fdXNlcnMsCisJCSB3Y2RfcmVzbWdyX2Nsa190eXBlX3RvX3N0cihyZXNtZ3ItPmNsa190eXBlKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19ibG9jazogZW5hYmxlIE1DTEsgb3IgUkNPCisgKiBAcmVzbWdyOiBoYW5kbGUgdG8gc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyCisgKiBAdHlwZTogQ2xvY2sgdHlwZSB0byBlbmFibGUKKyAqLworaW50IHdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19ibG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCQllbnVtIHdjZF9jbG9ja190eXBlIHR5cGUpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgV0NEX0NMS19NQ0xLOgorCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfbWNsayhyZXNtZ3IpOworCQlicmVhazsKKwljYXNlIFdDRF9DTEtfUkNPOgorCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfcmNvKHJlc21ncik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVua25vd24gQ2xvY2sgdHlwZTogJXNcbiIsIF9fZnVuY19fLAorCQkJd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIodHlwZSkpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9OworCisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRW5hYmxlIGNsb2NrICVzIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCQl3Y2RfcmVzbWdyX2Nsa190eXBlX3RvX3N0cih0eXBlKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCQkJICBpbnQgc2lkb19zcmMpCit7CisJaWYgKCFyZXNtZ3IpCisJCXJldHVybjsKKworCWlmIChzaWRvX3NyYyA9PSByZXNtZ3ItPnNpZG9faW5wdXRfc3JjKQorCQlyZXR1cm47CisKKwlpZiAoc2lkb19zcmMgPT0gU0lET19TT1VSQ0VfSU5URVJOQUwpIHsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKKwkJCQkJCSAweDA0LCAweDAwKTsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKKwkJCQkJCSAweDAzLCAweDAwKTsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9SQ08sCisJCQkJCQkgMHg4MCwgMHgwMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7CisJCXJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9JTlRFUk5BTDsKKwkJcHJfZGVidWcoIiVzOiBzaWRvIGlucHV0IHNyYyB0byBpbnRlcm5hbFxuIiwgX19mdW5jX18pOworCX0gZWxzZSBpZiAoc2lkb19zcmMgPT0gU0lET19TT1VSQ0VfUkNPX0JHKSB7CisJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTM0WF9BTkFfUkNPLAorCQkJCQkJIDB4ODAsIDB4ODApOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAorCQkJCQkJIDB4MDIsIDB4MDIpOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAorCQkJCQkJIDB4MDEsIDB4MDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAorCQkJCQkJIDB4MDQsIDB4MDQpOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOworCQlyZXNtZ3ItPnNpZG9faW5wdXRfc3JjID0gU0lET19TT1VSQ0VfUkNPX0JHOworCQlwcl9kZWJ1ZygiJXM6IHNpZG8gaW5wdXQgc3JjIHRvIGV4dGVybmFsXG4iLCBfX2Z1bmNfXyk7CisJfQorfQorCisvKgorICogd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmNfbG9ja2VkOgorICogICBTZXQgU0lETyBpbnB1dCBpbiBCR19DTEsgbG9ja2VkIGNvbnRleHQKKyAqCisgKiBAcmVzbWdyOiBoYW5kbGUgdG8gc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyCisgKiBAc2lkb19zcmM6IFNlbGVjdCB0aGUgU0lETyBpbnB1dCBzb3VyY2UKKyAqLwordm9pZCB3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyY19sb2NrZWQoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCisJCQkJCSAgaW50IHNpZG9fc3JjKQoreworCWlmICghcmVzbWdyKQorCQlyZXR1cm47CisKKwlXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHJlc21ncik7CisJd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmMocmVzbWdyLCBzaWRvX3NyYyk7CisJV0NEOVhYWF9WMl9CR19DTEtfVU5MT0NLKHJlc21ncik7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjX2xvY2tlZCk7CisKKy8qCisgKiB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrOiBkaXNhYmxlIE1DTEsgb3IgUkNPCisgKiBAcmVzbWdyOiBoYW5kbGUgdG8gc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyCisgKiBAdHlwZTogQ2xvY2sgdHlwZSB0byBkaXNhYmxlCisgKi8KK2ludCB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAorCQkJCWVudW0gd2NkX2Nsb2NrX3R5cGUgdHlwZSkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBXQ0RfQ0xLX01DTEs6CisJCXJldCA9IHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfbWNsayhyZXNtZ3IpOworCQlicmVhazsKKwljYXNlIFdDRF9DTEtfUkNPOgorCQlyZXQgPSB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX3JjbyhyZXNtZ3IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVbmtub3duIENsb2NrIHR5cGU6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCXdjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKHR5cGUpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCWlmIChyZXQpCisJCXByX2VycigiJXM6IERpc2FibGUgY2xvY2sgJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCXdjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKHR5cGUpKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfcmVzbWdyX2luaXQ6IGluaXRpYWxpemUgd2NkIHJlc291cmNlIG1hbmFnZXIKKyAqIEBjb3JlX3JlczogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UKKyAqCisgKiBFYXJseSBpbml0IGNhbGwgd2l0aG91dCBhIGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKKyAqLworc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICp3Y2RfcmVzbWdyX2luaXQoCisJCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzLAorCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3I7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHg7CisKKwlyZXNtZ3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc21ncikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwl3Y2Q5eHh4ID0gY29udGFpbmVyX29mKGNvcmVfcmVzLCBzdHJ1Y3Qgd2NkOXh4eCwgY29yZV9yZXMpOworCWlmICghd2NkOXh4eCkgeworCQlrZnJlZShyZXNtZ3IpOworCQlwcl9lcnIoIiVzOiBDYW5ub3QgZ2V0IHdjZDl4eCBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCW11dGV4X2luaXQoJnJlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOworCW11dGV4X2luaXQoJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7CisJcmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycyA9IDA7CisJcmVzbWdyLT5jbGtfbWNsa191c2VycyA9IDA7CisJcmVzbWdyLT5jbGtfcmNvX3VzZXJzID0gMDsKKwlyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzID0gMDsKKwlyZXNtZ3ItPmNvZGVjID0gY29kZWM7CisJcmVzbWdyLT5jb3JlX3JlcyA9IGNvcmVfcmVzOworCXJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9JTlRFUk5BTDsKKwlyZXNtZ3ItPmNvZGVjX3R5cGUgPSB3Y2Q5eHh4LT50eXBlOworCisJcmV0dXJuIHJlc21ncjsKK30KKworLyoKKyAqIHdjZF9yZXNtZ3JfcmVtb3ZlOiBDbGVhbi11cCB3Y2QgcmVzb3VyY2UgbWFuYWdlcgorICogQHJlc21ncjogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MgorICovCit2b2lkIHdjZF9yZXNtZ3JfcmVtb3ZlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQoreworCW11dGV4X2Rlc3Ryb3koJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7CisJa2ZyZWUocmVzbWdyKTsKK30KKworLyoKKyAqIHdjZF9yZXNtZ3JfcG9zdF9pbml0OiBwb3N0IGluaXQgY2FsbCB0byBhc3NpZ24gY29kZWMgaGFuZGxlCisgKiBAcmVzbWdyOiBoYW5kbGUgdG8gc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyIGNyZWF0ZWQgZHVyaW5nIGVhcmx5IGluaXQKKyAqIEByZXNtZ3JfY2I6IGNvZGVjIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZXNtZ3IKKyAqIEBjb2RlYzogaGFuZGxlIHRvIHN0cnVjdCBzbmRfc29jX2NvZGVjCisgKi8KK2ludCB3Y2RfcmVzbWdyX3Bvc3RfaW5pdChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCSBjb25zdCBzdHJ1Y3Qgd2NkX3Jlc21ncl9jYiAqcmVzbWdyX2NiLAorCQkJIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoIXJlc21ncikgeworCQlwcl9lcnIoIiVzOiByZXNtZ3Igbm90IGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IENvZGVjIG1lbW9yeSBpcyBOVUxMLCBub3RoaW5nIHRvIHBvc3QgaW5pdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzbWdyLT5jb2RlYyA9IGNvZGVjOworCXJlc21nci0+cmVzbWdyX2NiID0gcmVzbWdyX2NiOworCisJcmV0dXJuIDA7Cit9CitNT0RVTEVfREVTQ1JJUFRJT04oIndjZDl4eHggcmVzbWdyIHYyIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDVhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLXYyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fV0NEOVhYWF9DT01NT05fVjJfSF9fCisjZGVmaW5lIF9fV0NEOVhYWF9DT01NT05fVjJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKworZW51bSB3Y2RfY2xvY2tfdHlwZSB7CisJV0NEX0NMS19PRkYsCisJV0NEX0NMS19SQ08sCisJV0NEX0NMS19NQ0xLLAorfTsKKworZW51bSB7CisJU0lET19TT1VSQ0VfSU5URVJOQUwsCisJU0lET19TT1VSQ0VfUkNPX0JHLAorfTsKKworc3RydWN0IHdjZF9yZXNtZ3JfY2IgeworCWludCAoKmNkY19yY29fY3RybCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlczsKKworCWludCBtYXN0ZXJfYmlhc191c2VyczsKKwlpbnQgY2xrX21jbGtfdXNlcnM7CisJaW50IGNsa19yY29fdXNlcnM7CisKKwlzdHJ1Y3QgbXV0ZXggY29kZWNfYmdfY2xrX2xvY2s7CisJc3RydWN0IG11dGV4IG1hc3Rlcl9iaWFzX2xvY2s7CisKKwllbnVtIGNvZGVjX3ZhcmlhbnQgY29kZWNfdHlwZTsKKwllbnVtIHdjZF9jbG9ja190eXBlIGNsa190eXBlOworCisJY29uc3Qgc3RydWN0IHdjZF9yZXNtZ3JfY2IgKnJlc21ncl9jYjsKKwlpbnQgc2lkb19pbnB1dF9zcmM7Cit9OworCisjZGVmaW5lIFdDRDlYWFhfVjJfQkdfQ0xLX0xPQ0socmVzbWdyKQkJCVwKK3sJCQkJCQkJXAorCXN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqX19yZXNtZ3IgPSByZXNtZ3I7CVwKKwlwcl9kZWJ1ZygiJXM6IEFjcXVpcmluZyBCR19DTEtcbiIsIF9fZnVuY19fKTsJXAorCW11dGV4X2xvY2soJl9fcmVzbWdyLT5jb2RlY19iZ19jbGtfbG9jayk7CVwKKwlwcl9kZWJ1ZygiJXM6IEFjcXVpcmluZyBCR19DTEsgZG9uZVxuIiwgX19mdW5jX18pOwlcCit9CisKKyNkZWZpbmUgV0NEOVhYWF9WMl9CR19DTEtfVU5MT0NLKHJlc21ncikJCQlcCit7CQkJCQkJCVwKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKl9fcmVzbWdyID0gcmVzbWdyOwlcCisJcHJfZGVidWcoIiVzOiBSZWxlYXNpbmcgQkdfQ0xLXG4iLCBfX2Z1bmNfXyk7CVwKKwltdXRleF91bmxvY2soJl9fcmVzbWdyLT5jb2RlY19iZ19jbGtfbG9jayk7CVwKK30KKworI2RlZmluZSBXQ0Q5WFhYX1YyX0JHX0NMS19BU1NFUlRfTE9DS0VEKHJlc21ncikJCVwKK3sJCQkJCQkJXAorCVdBUk5fT05DRSghbXV0ZXhfaXNfbG9ja2VkKCZyZXNtZ3ItPmNvZGVjX2JnX2Nsa19sb2NrKSwgXAorCQkgICIlczogQkdfQ0xLIGxvY2sgc2hvdWxkIGhhdmUgYWNxdWlyZWRcbiIsIF9fZnVuY19fKTsgXAorfQorCitpbnQgd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXMoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpOworaW50IHdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncik7CitzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKndjZF9yZXNtZ3JfaW5pdCgKKwkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMsCisJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Cit2b2lkIHdjZF9yZXNtZ3JfcmVtb3ZlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKTsKK2ludCB3Y2RfcmVzbWdyX3Bvc3RfaW5pdChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCSBjb25zdCBzdHJ1Y3Qgd2NkX3Jlc21ncl9jYiAqcmVzbWdyX2NiLAorCQkJIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitpbnQgd2NkX3Jlc21ncl9lbmFibGVfY2xrX2Jsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAorCQkJCWVudW0gd2NkX2Nsb2NrX3R5cGUgdHlwZSk7CitpbnQgd2NkX3Jlc21ncl9kaXNhYmxlX2Nsa19ibG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCQllbnVtIHdjZF9jbG9ja190eXBlIHR5cGUpOworaW50IHdjZF9yZXNtZ3JfZ2V0X2Nsa190eXBlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKTsKK3ZvaWQgd2NkX3Jlc21ncl9wb3N0X3Nzcl92MihzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncik7Cit2b2lkIHdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjX2xvY2tlZChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKKwkJCQkJICBpbnQgc2lkb19zcmMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMjY1MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1yZXNtZ3IuYwpAQCAtMCwwICsxLDEwOTkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2LTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5MzIwX3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDkzMzBfcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvcGRhdGEuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3IuaCIKKworc3RhdGljIGNoYXIgd2NkOXh4eF9ldmVudF9zdHJpbmdbXVs2NF0gPSB7CisJIldDRDlYWFhfRVZFTlRfSU5WQUxJRCIsCisKKwkiV0NEOVhYWF9FVkVOVF9QUkVfUkNPX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX1JDT19PTiIsCisJIldDRDlYWFhfRVZFTlRfUFJFX1JDT19PRkYiLAorCSJXQ0Q5WFhYX0VWRU5UX1BPU1RfUkNPX09GRiIsCisKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUNMS19PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUNMS19PRkYiLAorCSJXQ0Q5WFhYX0VWRU5UX1BPU1RfTUNMS19PRkYiLAorCisJIldDRDlYWFhfRVZFTlRfUFJFX0JHX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9CR19PRkYiLAorCSJXQ0Q5WFhYX0VWRU5UX1BSRV9CR19BVURJT19PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9CR19BVURJT19PTiIsCisJIldDRDlYWFhfRVZFTlRfUFJFX0JHX01CSENfT04iLAorCSJXQ0Q5WFhYX0VWRU5UX1BPU1RfQkdfTUJIQ19PTiIsCisKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18xX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzFfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18yX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18zX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzNfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU180X09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzRfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18xX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMV9PTiIsCisJIldDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT04iLAorCSJXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzNfT04iLAorCSJXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18zX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU180X09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfNF9PTiIsCisKKwkiV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfMV9PRkYiLAorCSJXQ0Q5WFhYX0VWRU5UX1BPU1RfQ0ZJTFRfMV9PRkYiLAorCSJXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8yX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8yX09GRiIsCisJIldDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzNfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzNfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfMV9PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8xX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfMl9PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8yX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfM19PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8zX09OIiwKKworCSJXQ0Q5WFhYX0VWRU5UX1BSRV9IUEhMX1BBX09OIiwKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX0hQSExfUEFfT0ZGIiwKKwkiV0NEOVhYWF9FVkVOVF9QUkVfSFBIUl9QQV9PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9IUEhSX1BBX09GRiIsCisKKwkiV0NEOVhYWF9FVkVOVF9QT1NUX1JFU1VNRSIsCisKKwkiV0NEOVhYWF9FVkVOVF9QUkVfVFhfM19PTiIsCisJIldDRDlYWFhfRVZFTlRfUE9TVF9UWF8zX09GRiIsCisKKwkiV0NEOVhYWF9FVkVOVF9MQVNUIiwKK307CisKKyNkZWZpbmUgV0NEOVhYWF9SQ09fQ0FMSUJSQVRJT05fUkVUUllfQ09VTlQgNQorI2RlZmluZSBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9VUyA1MDAwCisjZGVmaW5lIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyAxMDAKKyNkZWZpbmUgV0NEOVhYWF9SQ09fQ0FMSUJSQVRJT05fREVMQVlfSU5DX1VTIDEwMDAKKworc3RydWN0IHdjZDl4eHhfcmVzbWdyX2NvbmRfZW50cnkgeworCXVuc2lnbmVkIHNob3J0IHJlZzsKKwlpbnQgc2hpZnQ7CisJYm9vbCBpbnZlcnQ7CisJZW51bSB3Y2Q5eHh4X3Jlc21ncl9jb25kIGNvbmQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RhdGljIGVudW0gd2NkOXh4eF9jbG9ja190eXBlIHdjZDl4eHhfc2F2ZV9jbG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IKKwkJCQkJCSAgKnJlc21ncik7CitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3Jlc3RvcmVfY2xvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICBlbnVtIHdjZDl4eHhfY2xvY2tfdHlwZSB0eXBlKTsKKworY29uc3QgY2hhciAqd2NkOXh4eF9nZXRfZXZlbnRfc3RyaW5nKGVudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgdHlwZSkKK3sKKwlyZXR1cm4gd2NkOXh4eF9ldmVudF9zdHJpbmdbdHlwZV07Cit9CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkgIGNvbnN0IGVudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IG5vdGlmaWVyIGNhbGwgZXZlbnQgJWRcbiIsIF9fZnVuY19fLCBlKTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZyZXNtZ3ItPm5vdGlmaWVyLCBlLCByZXNtZ3IpOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X2Rpc2FibGVfYmcoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpCit7CisJLyogTm90aWZ5IGJnIG1vZGUgY2hhbmdlICovCisJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUFJFX0JHX09GRik7CisJLyogRGlzYWJsZSBiZyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMocmVzbWdyLT5jb2RlYywgV0NEOVhYWF9BX0JJQVNfQ0VOVFJBTF9CR19DVEwsCisJCQkgICAgMHgwMywgMHgwMCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKKwkvKiBOb3RpZnkgYmcgbW9kZSBjaGFuZ2UgKi8KKwl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwgV0NEOVhYWF9FVkVOVF9QT1NUX0JHX09GRik7Cit9CisKKy8qCisgKiBCRyBlbmFibGVtZW50IHNob3VsZCBhbHdheXMgZW5hYmxlIGluIHNsb3cgbW9kZS4KKyAqIFRoZSBmYXN0IG1vZGUgZG9lc24ndCBuZWVkIHRvIGJlIGVuYWJsZWQgYXMgZmFzdCBtb2RlIEJHIGlzIHRvIGJlIGRyaXZlbgorICogYnkgTUJIQyBvdmVycmlkZS4KKyAqLworc3RhdGljIHZvaWQgd2NkOXh4eF9lbmFibGVfYmcoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcmVzbWdyLT5jb2RlYzsKKworCS8qIEVuYWJsZSBCRyBpbiBzbG93IG1vZGUgYW5kIHByZWNoYXJnZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9CSUFTX0NFTlRSQUxfQkdfQ1RMLCAweDgwLCAweDgwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQklBU19DRU5UUkFMX0JHX0NUTCwgMHgwNCwgMHgwNCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0JJQVNfQ0VOVFJBTF9CR19DVEwsIDB4MDEsIDB4MDEpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQklBU19DRU5UUkFMX0JHX0NUTCwgMHg4MCwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfZW5hYmxlX2JnX2F1ZGlvKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKQoreworCS8qIE5vdGlmeSBiYW5kZ2FwIG1vZGUgY2hhbmdlICovCisJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUFJFX0JHX0FVRElPX09OKTsKKwl3Y2Q5eHh4X2VuYWJsZV9iZyhyZXNtZ3IpOworCS8qIE5vdGlmeSBiYW5kZ2FwIG1vZGUgY2hhbmdlICovCisJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUE9TVF9CR19BVURJT19PTik7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfZW5hYmxlX2JnX21iaGMoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcmVzbWdyLT5jb2RlYzsKKworCS8qIE5vdGlmeSBiYW5kZ2FwIG1vZGUgY2hhbmdlICovCisJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUFJFX0JHX01CSENfT04pOworCisJLyoKKwkgKiBtY2xrIHNob3VsZCBiZSBvZmYgb3IgY2xrIGJ1ZmYgc291cmNlIHNvdWxkbid0IGJlIFZCRworCSAqIExldCdzIHR1cm4gb2ZmIG1jbGsgYWx3YXlzCisJICovCisJV0FSTl9PTihzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjIpICYgKDEgPDwgMikpOworCisJd2NkOXh4eF9lbmFibGVfYmcocmVzbWdyKTsKKwkvKiBOb3RpZnkgYmFuZGdhcCBtb2RlIGNoYW5nZSAqLworCXdjZDl4eHhfcmVzbWdyX25vdGlmaWVyX2NhbGwocmVzbWdyLCBXQ0Q5WFhYX0VWRU5UX1BPU1RfQkdfTUJIQ19PTik7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfZGlzYWJsZV9jbG9ja19ibG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSByZXNtZ3ItPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCVdDRDlYWFhfQkdfQ0xLX0FTU0VSVF9MT0NLRUQocmVzbWdyKTsKKworCS8qIE5vdGlmeSAqLworCWlmIChyZXNtZ3ItPmNsa190eXBlID09IFdDRDlYWFhfQ0xLX1JDTykKKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUFJFX1JDT19PRkYpOworCWVsc2UKKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCSAgICAgV0NEOVhYWF9FVkVOVF9QUkVfTUNMS19PRkYpOworCisJc3dpdGNoIChyZXNtZ3ItPmNvZGVjX3R5cGUpIHsKKwljYXNlIFdDRDlYWFhfQ0RDX1RZUEVfVE9NVE9NOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4yLCAweDA0LCAweDAwKTsKKwkJdXNsZWVwX3JhbmdlKDUwLCA1NSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjIsIDB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLCAweDQwLCAweDQwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwgMHg0MCwgMHgwMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjEsIDB4MDEsIDB4MDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4yLCAweDA0LCAweDAwKTsKKwkJdXNsZWVwX3JhbmdlKDUwLCA1NSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjIsIDB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLCAweDA1LCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXVzbGVlcF9yYW5nZSg1MCwgNTUpOworCS8qIE5vdGlmeSAqLworCWlmIChyZXNtZ3ItPmNsa190eXBlID09IFdDRDlYWFhfQ0xLX1JDTykgeworCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwKKwkJCQkJICAgICBXQ0Q5WFhYX0VWRU5UX1BPU1RfUkNPX09GRik7CisJfSBlbHNlIHsKKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCSAgICAgV0NEOVhYWF9FVkVOVF9QT1NUX01DTEtfT0ZGKTsKKwl9CisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3Jlc21ncl9jZGNfc3BlY2lmaWNfZ2V0X2NsayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkJCWludCBjbGtfdXNlcnMpCit7CisJLyogQ2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYWNxdWlyZWQKKwkgKiAgQkdfQ0xLIGxvY2sKKwkgKi8KKwlXQ0Q5WFhYX0JHX0NMS19VTkxPQ0socmVzbWdyKTsKKwlpZiAoY2xrX3VzZXJzKSB7CisJCWlmIChyZXNtZ3ItPnJlc21ncl9jYiAmJgorCQkgICAgcmVzbWdyLT5yZXNtZ3JfY2ItPmNkY19yY29fY3RybCkgeworCQkJd2hpbGUgKGNsa191c2Vycy0tKQorCQkJCXJlc21nci0+cmVzbWdyX2NiLT5jZGNfcmNvX2N0cmwocmVzbWdyLT5jb2RlYywKKwkJCQkJCQkJdHJ1ZSk7CisJCX0KKwl9CisJLyogQWNxdWlyZSBCR19DTEsgbG9jayBiZWZvcmUgcmV0dXJuICovCisJV0NEOVhYWF9CR19DTEtfTE9DSyhyZXNtZ3IpOworfQorCit2b2lkIHdjZDl4eHhfcmVzbWdyX3Bvc3Rfc3NyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKQoreworCWludCBvbGRfYmdfYXVkaW9fdXNlcnMsIG9sZF9iZ19tYmhjX3VzZXJzOworCWludCBvbGRfY2xrX3Jjb191c2Vycywgb2xkX2Nsa19tY2xrX3VzZXJzOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJV0NEOVhYWF9CR19DTEtfTE9DSyhyZXNtZ3IpOworCW9sZF9iZ19hdWRpb191c2VycyA9IHJlc21nci0+YmdfYXVkaW9fdXNlcnM7CisJb2xkX2JnX21iaGNfdXNlcnMgPSByZXNtZ3ItPmJnX21iaGNfdXNlcnM7CisJb2xkX2Nsa19yY29fdXNlcnMgPSByZXNtZ3ItPmNsa19yY29fdXNlcnM7CisJb2xkX2Nsa19tY2xrX3VzZXJzID0gcmVzbWdyLT5jbGtfbWNsa191c2VyczsKKwlyZXNtZ3ItPmJnX2F1ZGlvX3VzZXJzID0gMDsKKwlyZXNtZ3ItPmJnX21iaGNfdXNlcnMgPSAwOworCXJlc21nci0+YmFuZGdhcF90eXBlID0gV0NEOVhYWF9CQU5ER0FQX09GRjsKKwlyZXNtZ3ItPmNsa19yY29fdXNlcnMgPSAwOworCXJlc21nci0+Y2xrX21jbGtfdXNlcnMgPSAwOworCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0Q5WFhYX0NMS19PRkY7CisKKwlpZiAob2xkX2JnX2F1ZGlvX3VzZXJzKSB7CisJCXdoaWxlIChvbGRfYmdfYXVkaW9fdXNlcnMtLSkKKwkJCXdjZDl4eHhfcmVzbWdyX2dldF9iYW5kZ2FwKHJlc21nciwKKwkJCQkJCSAgV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUpOworCX0KKworCWlmIChvbGRfYmdfbWJoY191c2VycykgeworCQl3aGlsZSAob2xkX2JnX21iaGNfdXNlcnMtLSkKKwkJCXdjZDl4eHhfcmVzbWdyX2dldF9iYW5kZ2FwKHJlc21nciwKKwkJCQkJCSAgV0NEOVhYWF9CQU5ER0FQX01CSENfTU9ERSk7CisJfQorCisJaWYgKG9sZF9jbGtfbWNsa191c2VycykgeworCQl3aGlsZSAob2xkX2Nsa19tY2xrX3VzZXJzLS0pCisJCQl3Y2Q5eHh4X3Jlc21ncl9nZXRfY2xrX2Jsb2NrKHJlc21nciwgV0NEOVhYWF9DTEtfTUNMSyk7CisJfQorCisJaWYgKHJlc21nci0+Y29kZWNfdHlwZSA9PSBXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkgeworCQl3Y2Q5eHh4X3Jlc21ncl9jZGNfc3BlY2lmaWNfZ2V0X2NsayhyZXNtZ3IsIG9sZF9jbGtfcmNvX3VzZXJzKTsKKwl9IGVsc2UgaWYgKG9sZF9jbGtfcmNvX3VzZXJzKSB7CisJCXdoaWxlIChvbGRfY2xrX3Jjb191c2Vycy0tKQorCQkJd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa19ibG9jayhyZXNtZ3IsCisJCQkJCVdDRDlYWFhfQ0xLX1JDTyk7CisJfQorCVdDRDlYWFhfQkdfQ0xLX1VOTE9DSyhyZXNtZ3IpOworCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKworLyoKKyAqIHdjZDl4eHhfcmVzbWdyX2dldF9iYW5kZ2FwIDogVm90ZSBmb3IgYmFuZGdhcCByZWYKKyAqIGNob2ljZSA6IFdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFLCBXQ0Q5WFhYX0JBTkRHQVBfTUJIQ19NT0RFCisgKi8KK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfZ2V0X2JhbmRnYXAoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJY29uc3QgZW51bSB3Y2Q5eHh4X2JhbmRnYXBfdHlwZSBjaG9pY2UpCit7CisJZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgY2xvY2tfc2F2ZSA9IFdDRDlYWFhfQ0xLX09GRjsKKworCXByX2RlYnVnKCIlczogZW50ZXIsIHdhbnRzICVkXG4iLCBfX2Z1bmNfXywgY2hvaWNlKTsKKworCVdDRDlYWFhfQkdfQ0xLX0FTU0VSVF9MT0NLRUQocmVzbWdyKTsKKwlzd2l0Y2ggKGNob2ljZSkgeworCWNhc2UgV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREU6CisJCXJlc21nci0+YmdfYXVkaW9fdXNlcnMrKzsKKwkJaWYgKHJlc21nci0+YmdfYXVkaW9fdXNlcnMgPT0gMSAmJiByZXNtZ3ItPmJnX21iaGNfdXNlcnMpIHsKKwkJCS8qCisJCQkgKiBDdXJyZW50IGJnIGlzIE1CSEMgbW9kZSwgYWJvdXQgdG8gc3dpdGNoIHRvCisJCQkgKiBhdWRpbyBtb2RlLgorCQkJICovCisJCQlXQVJOX09OKHJlc21nci0+YmFuZGdhcF90eXBlICE9CisJCQkJV0NEOVhYWF9CQU5ER0FQX01CSENfTU9ERSk7CisKKwkJCS8qIEJHIG1vZGUgY2FuIGJlIGNoYW5nZWQgb25seSB3aXRoIGNsb2NrIG9mZiAqLworCQkJaWYgKHJlc21nci0+Y29kZWNfdHlwZSAhPSBXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkKKwkJCQljbG9ja19zYXZlID0gd2NkOXh4eF9zYXZlX2Nsb2NrKHJlc21ncik7CisJCQkvKiBTd3RpY2ggQkcgbW9kZSAqLworCQkJd2NkOXh4eF9kaXNhYmxlX2JnKHJlc21ncik7CisJCQl3Y2Q5eHh4X2VuYWJsZV9iZ19hdWRpbyhyZXNtZ3IpOworCQkJLyogcmVzdG9yZSBjbG9jayAqLworCQkJaWYgKHJlc21nci0+Y29kZWNfdHlwZSAhPSBXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkKKwkJCQl3Y2Q5eHh4X3Jlc3RvcmVfY2xvY2socmVzbWdyLCBjbG9ja19zYXZlKTsKKwkJfSBlbHNlIGlmIChyZXNtZ3ItPmJnX2F1ZGlvX3VzZXJzID09IDEpIHsKKwkJCS8qIGN1cnJlbnRseSBvZmYsIGp1c3QgZW5hYmxlIGl0ICovCisJCQlXQVJOX09OKHJlc21nci0+YmFuZGdhcF90eXBlICE9IFdDRDlYWFhfQkFOREdBUF9PRkYpOworCQkJd2NkOXh4eF9lbmFibGVfYmdfYXVkaW8ocmVzbWdyKTsKKwkJfQorCQlyZXNtZ3ItPmJhbmRnYXBfdHlwZSA9IFdDRDlYWFhfQkFOREdBUF9BVURJT19NT0RFOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfQkFOREdBUF9NQkhDX01PREU6CisJCXJlc21nci0+YmdfbWJoY191c2VycysrOworCQlpZiAocmVzbWdyLT5iYW5kZ2FwX3R5cGUgPT0gV0NEOVhYWF9CQU5ER0FQX01CSENfTU9ERSB8fAorCQkgICAgcmVzbWdyLT5iYW5kZ2FwX3R5cGUgPT0gV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUpCisJCQkvKiBkbyBub3RoaW5nICovCisJCQlicmVhazsKKworCQkvKiBiZyBtb2RlIGNhbiBiZSBjaGFuZ2VkIG9ubHkgd2l0aCBjbG9jayBvZmYgKi8KKwkJY2xvY2tfc2F2ZSA9IHdjZDl4eHhfc2F2ZV9jbG9jayhyZXNtZ3IpOworCQkvKiBlbmFibGUgYmcgd2l0aCBNQkhDIG1vZGUgKi8KKwkJd2NkOXh4eF9lbmFibGVfYmdfbWJoYyhyZXNtZ3IpOworCQkvKiByZXN0b3JlIGNsb2NrICovCisJCXdjZDl4eHhfcmVzdG9yZV9jbG9jayhyZXNtZ3IsIGNsb2NrX3NhdmUpOworCQkvKiBzYXZlIGN1cnJlbnQgbW9kZSAqLworCQlyZXNtZ3ItPmJhbmRnYXBfdHlwZSA9IFdDRDlYWFhfQkFOREdBUF9NQkhDX01PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEVycm9yLCBJbnZhbGlkIGJhbmRnYXAgc2V0dGluZ3NcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBiZyB1c2VycyBhdWRpbyAlZCwgbWJoYyAlZFxuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPmJnX2F1ZGlvX3VzZXJzLCByZXNtZ3ItPmJnX21iaGNfdXNlcnMpOworfQorCisvKgorICogd2NkOXh4eF9yZXNtZ3JfcHV0X2JhbmRnYXAgOiBVbnZvdGUgYmFuZGdhcCByZWYgdGhhdCBoYXMgYmVlbiB2b3RlZAorICogY2hvaWNlIDogV0NEOVhYWF9CQU5ER0FQX0FVRElPX01PREUsIFdDRDlYWFhfQkFOREdBUF9NQkhDX01PREUKKyAqLwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9wdXRfYmFuZGdhcChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQllbnVtIHdjZDl4eHhfYmFuZGdhcF90eXBlIGNob2ljZSkKK3sKKwllbnVtIHdjZDl4eHhfY2xvY2tfdHlwZSBjbG9ja19zYXZlOworCisJcHJfZGVidWcoIiVzOiBlbnRlciBjaG9pY2UgJWRcbiIsIF9fZnVuY19fLCBjaG9pY2UpOworCisJV0NEOVhYWF9CR19DTEtfQVNTRVJUX0xPQ0tFRChyZXNtZ3IpOworCXN3aXRjaCAoY2hvaWNlKSB7CisJY2FzZSBXQ0Q5WFhYX0JBTkRHQVBfQVVESU9fTU9ERToKKwkJaWYgKC0tcmVzbWdyLT5iZ19hdWRpb191c2VycyA9PSAwKSB7CisJCQlpZiAocmVzbWdyLT5iZ19tYmhjX3VzZXJzKSB7CisJCQkJLyogYmcgbW9kZSBjYW4gYmUgY2hhbmdlZCBvbmx5IHdpdGggY2xvY2sgb2ZmICovCisJCQkJY2xvY2tfc2F2ZSA9IHdjZDl4eHhfc2F2ZV9jbG9jayhyZXNtZ3IpOworCQkJCS8qIHN3aXRjaCB0byBNQkhDIG1vZGUgKi8KKwkJCQl3Y2Q5eHh4X2VuYWJsZV9iZ19tYmhjKHJlc21ncik7CisJCQkJLyogcmVzdG9yZSBjbG9jayAqLworCQkJCXdjZDl4eHhfcmVzdG9yZV9jbG9jayhyZXNtZ3IsIGNsb2NrX3NhdmUpOworCQkJCXJlc21nci0+YmFuZGdhcF90eXBlID0KKwkJCQkgICAgV0NEOVhYWF9CQU5ER0FQX01CSENfTU9ERTsKKwkJCX0gZWxzZSB7CisJCQkJLyogdHVybiBvZmYgKi8KKwkJCQl3Y2Q5eHh4X2Rpc2FibGVfYmcocmVzbWdyKTsKKwkJCQlyZXNtZ3ItPmJhbmRnYXBfdHlwZSA9IFdDRDlYWFhfQkFOREdBUF9PRkY7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0JBTkRHQVBfTUJIQ19NT0RFOgorCQlXQVJOKHJlc21nci0+YmFuZGdhcF90eXBlID09IFdDRDlYWFhfQkFOREdBUF9PRkYsCisJCSAgICAgIlVuZXhwZWN0ZWQgYmFuZGdhcCB0eXBlICVkXG4iLCByZXNtZ3ItPmJhbmRnYXBfdHlwZSk7CisJCWlmICgtLXJlc21nci0+YmdfbWJoY191c2VycyA9PSAwICYmCisJCSAgICByZXNtZ3ItPmJhbmRnYXBfdHlwZSA9PSBXQ0Q5WFhYX0JBTkRHQVBfTUJIQ19NT0RFKSB7CisJCQl3Y2Q5eHh4X2Rpc2FibGVfYmcocmVzbWdyKTsKKwkJCXJlc21nci0+YmFuZGdhcF90eXBlID0gV0NEOVhYWF9CQU5ER0FQX09GRjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBFcnJvciwgSW52YWxpZCBiYW5kZ2FwIHNldHRpbmdzXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogYmcgdXNlcnMgYXVkaW8gJWQsIG1iaGMgJWRcbiIsIF9fZnVuY19fLAorCQkgcmVzbWdyLT5iZ19hdWRpb191c2VycywgcmVzbWdyLT5iZ19tYmhjX3VzZXJzKTsKK30KKwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9lbmFibGVfcnhfYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwgdTMyIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSByZXNtZ3ItPmNvZGVjOworCisJaWYgKGVuYWJsZSkgeworCQlyZXNtZ3ItPnJ4X2JpYXNfY291bnQrKzsKKwkJaWYgKHJlc21nci0+cnhfYmlhc19jb3VudCA9PSAxKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0NPTV9CSUFTLAorCQkJCQkgICAgMHg4MCwgMHg4MCk7CisJfSBlbHNlIHsKKwkJcmVzbWdyLT5yeF9iaWFzX2NvdW50LS07CisJCWlmICghcmVzbWdyLT5yeF9iaWFzX2NvdW50KQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0NPTV9CSUFTLAorCQkJCQkgICAgMHg4MCwgMHgwMCk7CisJfQorfQorCitpbnQgd2NkOXh4eF9yZXNtZ3JfZW5hYmxlX2NvbmZpZ19tb2RlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJlc21nci0+Y29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZSA9ICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwlpZiAoZW5hYmxlKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SQ19PU0NfRlJFUSwgMHgxMCwgMCk7CisJCS8qIGJhbmRnYXAgbW9kZSB0byBmYXN0ICovCisJCWlmIChyZXNtZ3ItPnBkYXRhLT5tY2xrX3JhdGUgPT0gV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopCisJCQkvKiBTZXQgY3VycmVudCB2YWx1ZSB0byAyMDBuQSBmb3IgMTIuMjg4TUh6IGNsb2NrICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQklBU19PU0NfQkdfQ1RMLCAweDM3KTsKKwkJZWxzZQorCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0JJQVNfT1NDX0JHX0NUTCwgMHgxNyk7CisKKwkJdXNsZWVwX3JhbmdlKDUsIDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JDX09TQ19GUkVRLCAweDgwLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JDX09TQ19URVNULCAweDgwLCAweDgwKTsKKwkJdXNsZWVwX3JhbmdlKDEwLCAyMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SQ19PU0NfVEVTVCwgMHg4MCwgMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOworCisJCWlmIChyZXNtZ3ItPnBkYXRhLT5tY2xrX3JhdGUgIT0gV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCQkJCTB4MDgsIDB4MDgpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9CSUFTX09TQ19CR19DVEwsIDB4MSwgMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SQ19PU0NfRlJFUSwgMHg4MCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdjZDl4eHhfZW5hYmxlX2Nsb2NrX2Jsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCWVudW0gd2NkOXh4eF9jbG9ja19jb25maWdfbW9kZSBjb25maWdfbW9kZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSByZXNtZ3ItPmNvZGVjOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9VUzsKKwlpbnQgbnVtX3JldHJ5ID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFscjsKKwl1bnNpZ25lZCBpbnQgdmFscjE7CisJdW5zaWduZWQgaW50IHZhbHdbXSA9IHsweDAxLCAweDAxLCAweDEwLCAweDAwfTsKKworCXByX2RlYnVnKCIlczogY29uZmlnX21vZGUgPSAlZFxuIiwgX19mdW5jX18sIGNvbmZpZ19tb2RlKTsKKworCS8qIHRyYW5zaXQgdG8gUkNPIHJlcXVpcmVzIG1jbGsgb2ZmICovCisJaWYgKHJlc21nci0+Y29kZWNfdHlwZSAhPSBXQ0Q5WFhYX0NEQ19UWVBFX1RPTVRPTSkKKwkJV0FSTl9PTihzbmRfc29jX3JlYWQoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjIpICYgKDEgPDwgMikpOworCisJaWYgKGNvbmZpZ19tb2RlID09IFdDRDlYWFhfQ0ZHX1JDTykgeworCQkvKiBOb3RpZnkgKi8KKwkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsIFdDRDlYWFhfRVZFTlRfUFJFX1JDT19PTik7CisJCS8qIGVuYWJsZSBSQ08gYW5kIHN3aXRjaCB0byBpdCAqLworCQl3Y2Q5eHh4X3Jlc21ncl9lbmFibGVfY29uZmlnX21vZGUocmVzbWdyLCAxKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMiwgMHgwMik7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwl9IGVsc2UgaWYgKGNvbmZpZ19tb2RlID09IFdDRDlYWFhfQ0ZHX0NBTF9SQ08pIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfQklBU19PU0NfQkdfQ1RMLAorCQkJCSAgICAweDAxLCAweDAxKTsKKwkJLyogMW1zIHNsZWVwIHJlcXVpcmVkIGFmdGVyIEJHIGVuYWJsZWQgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCisJCWlmIChyZXNtZ3ItPnBkYXRhLT5tY2xrX3JhdGUgPT0gV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopIHsKKwkJCS8qCisJCQkgKiBTZXQgUkNPIGNsb2NrIHJhdGUgYXMgMTIuMjg4TUh6IHJhdGUgZXhwbGljaXRseQorCQkJICogYXMgdGhlIFFmdXNlIHZhbHVlcyBhcmUgaW5jb3JyZWN0IGZvciB0aGlzIHJhdGUKKwkJCSAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwsCisJCQkJCTB4NTAsIDB4NTApOworCQl9IGVsc2UgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwsCisJCQkJCTB4MTgsIDB4MTApOworCQkJdmFsciA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJVE9NVE9NX0FfUUZVU0VfREFUQV9PVVQwKSAmICgweDA0KTsKKwkJCXZhbHIxID0gc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCQlUT01UT01fQV9RRlVTRV9EQVRBX09VVDEpICYgKDB4MDgpOworCQkJdmFsciA9ICh2YWxyID4+IDEpIHwgKHZhbHIxID4+IDMpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwsIDB4NjAsCisJCQkJCXZhbHdbdmFscl0gPDwgNSk7CisJCX0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwsIDB4ODAsIDB4ODApOworCisJCWRvIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fQ1RSTDEsCisJCQkJCSAgICAweDgwLCAweDgwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBUT01UT01fQV9SQ09fQ0FMSUJSQVRJT05fQ1RSTDEsCisJCQkJCSAgICAweDgwLCAweDAwKTsKKwkJCS8qIFJDTyBjYWxpYnJhdGlvbiB0YWtlcyBhcHByb3guIDVtcyAqLworCQkJdXNsZWVwX3JhbmdlKGRlbGF5LCBkZWxheSArCisJCQkJCSAgICBXQ0Q5WFhYX1VTTEVFUF9SQU5HRV9NQVJHSU5fVVMpOworCQkJaWYgKCEoc25kX3NvY19yZWFkKGNvZGVjLAorCQkJCVRPTVRPTV9BX1JDT19DQUxJQlJBVElPTl9SRVNVTFQxKSAmIDB4MTApKQorCQkJCWJyZWFrOworCQkJaWYgKG51bV9yZXRyeSA+PSAzKSB7CisJCQkJZGVsYXkgPSBkZWxheSArCisJCQkJCVdDRDlYWFhfUkNPX0NBTElCUkFUSU9OX0RFTEFZX0lOQ19VUzsKKwkJCX0KKwkJfSB3aGlsZSAobnVtX3JldHJ5KysgPCBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9SRVRSWV9DT1VOVCk7CisJfSBlbHNlIHsKKwkJLyogTm90aWZ5ICovCisJCXdjZDl4eHhfcmVzbWdyX25vdGlmaWVyX2NhbGwocmVzbWdyLCBXQ0Q5WFhYX0VWRU5UX1BSRV9NQ0xLX09OKTsKKwkJLyogc3dpdGNoIHRvIE1DTEsgKi8KKworCQlzd2l0Y2ggKHJlc21nci0+Y29kZWNfdHlwZSkgeworCQljYXNlIFdDRDlYWFhfQ0RDX1RZUEVfVE9NVE9NOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJICAgIDB4MDgsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJICAgIDB4NDAsIDB4NDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJICAgIDB4NDAsIDB4MDApOworCQkJLyogY2xrIHNvdXJjZSB0byBleHQgY2xrIGFuZCBjbGsgYnVmZiByZWYgdG8gVkJHICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCQkgICAgMHgwQywgMHgwNCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DTEtfQlVGRl9FTjEsCisJCQkJCSAgICAweDA4LCAweDAwKTsKKwkJCS8qIGlmIFJDTyBpcyBlbmFibGVkLCBzd2l0Y2ggZnJvbSBpdCAqLworCQkJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX1JDX09TQ19GUkVRKSAmIDB4ODApIHsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4yLAorCQkJCQkgICAgICAweDAyKTsKKwkJCQl3Y2Q5eHh4X3Jlc21ncl9lbmFibGVfY29uZmlnX21vZGUocmVzbWdyLCAwKTsKKwkJCX0KKwkJCS8qIGNsayBzb3VyY2UgdG8gZXh0IGNsayBhbmQgY2xrIGJ1ZmYgcmVmIHRvIFZCRyAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJICAgIDB4MEMsIDB4MDQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY29uZmlnX21vZGUgIT0gV0NEOVhYWF9DRkdfQ0FMX1JDTykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCSAgICAweDAxLCAweDAxKTsKKwkJLyoKKwkJICogc2xlZXAgcmVxdWlyZWQgYnkgY29kZWMgaGFyZHdhcmUgdG8KKwkJICogZW5hYmxlIGNsb2NrIGJ1ZmZlcgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4yLAorCQkJCSAgICAweDAyLCAweDAwKTsKKwkJLyogb24gTUNMSyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4yLAorCQkJCSAgICAweDA0LCAweDA0KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTEtfTUNMS19DVEwsCisJCQkJICAgIDB4MDEsIDB4MDEpOworCX0KKwl1c2xlZXBfcmFuZ2UoNTAsIDU1KTsKKworCS8qIE5vdGlmeSAqLworCWlmIChjb25maWdfbW9kZSA9PSBXQ0Q5WFhYX0NGR19SQ08pCisJCXdjZDl4eHhfcmVzbWdyX25vdGlmaWVyX2NhbGwocmVzbWdyLAorCQkJCQkgICAgIFdDRDlYWFhfRVZFTlRfUE9TVF9SQ09fT04pOworCWVsc2UgaWYgKGNvbmZpZ19tb2RlID09IFdDRDlYWFhfQ0ZHX01DTEspCisJCXdjZDl4eHhfcmVzbWdyX25vdGlmaWVyX2NhbGwocmVzbWdyLAorCQkJCQkgICAgIFdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09OKTsKK30KKworLyoKKyAqIGRpc2FibGUgY2xvY2sgYW5kIHJldHVybiBwcmV2aW91cyBjbG9jayBzdGF0ZQorICovCitzdGF0aWMgZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgd2NkOXh4eF9zYXZlX2Nsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKQoreworCVdDRDlYWFhfQkdfQ0xLX0FTU0VSVF9MT0NLRUQocmVzbWdyKTsKKwlpZiAocmVzbWdyLT5jbGtfdHlwZSAhPSBXQ0Q5WFhYX0NMS19PRkYpCisJCXdjZDl4eHhfZGlzYWJsZV9jbG9ja19ibG9jayhyZXNtZ3IpOworCXJldHVybiByZXNtZ3ItPmNsa190eXBlICE9IFdDRDlYWFhfQ0xLX09GRjsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9yZXN0b3JlX2Nsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgdHlwZSkKK3sKKwlpZiAodHlwZSAhPSBXQ0Q5WFhYX0NMS19PRkYpCisJCXdjZDl4eHhfZW5hYmxlX2Nsb2NrX2Jsb2NrKHJlc21nciwgdHlwZSA9PSBXQ0Q5WFhYX0NMS19SQ08pOworfQorCit2b2lkIHdjZDl4eHhfcmVzbWdyX2dldF9jbGtfYmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICBlbnVtIHdjZDl4eHhfY2xvY2tfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJlc21nci0+Y29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IGN1cnJlbnQgJWQsIHJlcXVlc3RlZCAlZCwgcmNvX3VzZXJzICVkLCBtY2xrX3VzZXJzICVkXG4iLAorCQkgX19mdW5jX18sIHJlc21nci0+Y2xrX3R5cGUsIHR5cGUsCisJCSByZXNtZ3ItPmNsa19yY29fdXNlcnMsIHJlc21nci0+Y2xrX21jbGtfdXNlcnMpOworCVdDRDlYWFhfQkdfQ0xLX0FTU0VSVF9MT0NLRUQocmVzbWdyKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFdDRDlYWFhfQ0xLX1JDTzoKKwkJaWYgKCsrcmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDEgJiYKKwkJICAgIHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEOVhYWF9DTEtfT0ZGKSB7CisJCQkvKiBlbmFibGUgUkNPIGFuZCBzd2l0Y2ggdG8gaXQgKi8KKwkJCXdjZDl4eHhfZW5hYmxlX2Nsb2NrX2Jsb2NrKHJlc21nciwgV0NEOVhYWF9DRkdfUkNPKTsKKwkJCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0Q5WFhYX0NMS19SQ087CisJCX0gZWxzZSBpZiAocmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDEgJiYKKwkJCSAgIHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEOVhYWF9DTEtfTUNMSyAmJgorCQkJICAgcmVzbWdyLT5jb2RlY190eXBlID09IFdDRDlYWFhfQ0RDX1RZUEVfVE9NVE9NKSB7CisJCQkvKgorCQkJICogRW5hYmxlIFJDTyBidXQgZG8gbm90IHN3aXRjaCBDTEsgTVVYIHRvIFJDTworCQkJICogdW5sZXNzIGV4dF9jbGtfdXNlcnMgaXMgMSwgd2hpY2ggaW5kaWNhdGVzCisJCQkgKiBFWFQgQ0xLIGlzIGVuYWJsZWQgZm9yIFJDTyBjYWxpYnJhdGlvbgorCQkJICovCisJCQl3Y2Q5eHh4X2VuYWJsZV9jbG9ja19ibG9jayhyZXNtZ3IsIFdDRDlYWFhfQ0ZHX0NBTF9SQ08pOworCQkJaWYgKHJlc21nci0+ZXh0X2Nsa191c2VycyA9PSAxKSB7CisJCQkJLyogTm90aWZ5ICovCisJCQkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0VWRU5UX1BSRV9SQ09fT04pOworCQkJCS8qIENMSyBNVVggdG8gUkNPICovCisJCQkJaWYgKHJlc21nci0+cGRhdGEtPm1jbGtfcmF0ZSAhPQorCQkJCQkJV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopCisJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCQkJMHgwOCwgMHgwOCk7CisJCQkJcmVzbWdyLT5jbGtfdHlwZSA9IFdDRDlYWFhfQ0xLX1JDTzsKKwkJCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwKKwkJCQkJCVdDRDlYWFhfRVZFTlRfUE9TVF9SQ09fT04pOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9DTEtfTUNMSzoKKwkJaWYgKCsrcmVzbWdyLT5jbGtfbWNsa191c2VycyA9PSAxICYmCisJCSAgICByZXNtZ3ItPmNsa190eXBlID09IFdDRDlYWFhfQ0xLX09GRikgeworCQkJLyogc3dpdGNoIHRvIE1DTEsgKi8KKwkJCXdjZDl4eHhfZW5hYmxlX2Nsb2NrX2Jsb2NrKHJlc21nciwgV0NEOVhYWF9DRkdfTUNMSyk7CisJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEOVhYWF9DTEtfTUNMSzsKKwkJfSBlbHNlIGlmIChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDEgJiYKKwkJCSAgIHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEOVhYWF9DTEtfUkNPKSB7CisJCQkvKiBSQ08gdG8gTUNMSyBzd2l0Y2gsIHdpdGggUkNPIHN0aWxsIHBvd2VyZWQgb24gKi8KKwkJCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOVhYWF9DRENfVFlQRV9UT01UT00pIHsKKwkJCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwKKwkJCQkJCVdDRDlYWFhfRVZFTlRfUFJFX01DTEtfT04pOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQklBU19DRU5UUkFMX0JHX0NUTCwKKwkJCQkJCTB4NDAsIDB4MDApOworCQkJCS8qIEVuYWJsZSBjbG9jayBidWZmZXIgKi8KKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJCTB4MDEsIDB4MDEpOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQlXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCQkJMHgwOCwgMHgwMCk7CisJCQkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0VWRU5UX1BPU1RfTUNMS19PTik7CisJCQl9IGVsc2UgeworCQkJCS8qIGlmIFJDTyBpcyBlbmFibGVkLCBzd2l0Y2ggZnJvbSBpdCAqLworCQkJCVdBUk5fT04oIShzbmRfc29jX3JlYWQocmVzbWdyLT5jb2RlYywKKwkJCQkJV0NEOVhYWF9BX1JDX09TQ19GUkVRKSAmIDB4ODApKTsKKwkJCQkvKiBkaXNhYmxlIGNsb2NrIGJsb2NrICovCisJCQkJd2NkOXh4eF9kaXNhYmxlX2Nsb2NrX2Jsb2NrKHJlc21ncik7CisJCQkJLyogc3dpdGNoIHRvIE1DTEsgKi8KKwkJCQl3Y2Q5eHh4X2VuYWJsZV9jbG9ja19ibG9jayhyZXNtZ3IsCisJCQkJCQkJICAgV0NEOVhYWF9DRkdfTUNMSyk7CisJCQl9CisJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEOVhYWF9DTEtfTUNMSzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBFcnJvciwgSW52YWxpZCBjbG9jayBnZXQgcmVxdWVzdCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICB0eXBlKTsKKwkJYnJlYWs7CisJfQorCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKK30KKwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9wdXRfY2xrX2Jsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSByZXNtZ3ItPmNvZGVjOworCisJcHJfZGVidWcoIiVzOiBjdXJyZW50ICVkLCBwdXQgJWRcbiIsIF9fZnVuY19fLCByZXNtZ3ItPmNsa190eXBlLCB0eXBlKTsKKworCVdDRDlYWFhfQkdfQ0xLX0FTU0VSVF9MT0NLRUQocmVzbWdyKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFdDRDlYWFhfQ0xLX1JDTzoKKwkJaWYgKC0tcmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDAgJiYKKwkJICAgIHJlc21nci0+Y2xrX3R5cGUgPT0gV0NEOVhYWF9DTEtfUkNPKSB7CisJCQl3Y2Q5eHh4X2Rpc2FibGVfY2xvY2tfYmxvY2socmVzbWdyKTsKKwkJCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOVhYWF9DRENfVFlQRV9UT01UT00pIHsKKwkJCQkvKiBQb3dlcmRvd24gUkNPICovCisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwsCisJCQkJCQkgICAgMHg4MCwgMHgwMCk7CisJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJCSAgICBUT01UT01fQV9CSUFTX09TQ19CR19DVEwsCisJCQkJCQkgICAgMHgwMSwgMHgwMCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGlmIFJDTyBpcyBlbmFibGVkLCBzd2l0Y2ggZnJvbSBpdCAqLworCQkJCWlmIChzbmRfc29jX3JlYWQocmVzbWdyLT5jb2RlYywKKwkJCQkJCSBXQ0Q5WFhYX0FfUkNfT1NDX0ZSRVEpCisJCQkJCQkgJiAweDgwKSB7CisJCQkJCXNuZF9zb2Nfd3JpdGUocmVzbWdyLT5jb2RlYywKKwkJCQkJCVdDRDlYWFhfQV9DTEtfQlVGRl9FTjIsCisJCQkJCQkweDAyKTsKKwkJCQkJd2NkOXh4eF9yZXNtZ3JfZW5hYmxlX2NvbmZpZ19tb2RlKAorCQkJCQkJCQlyZXNtZ3IsCTApOworCQkJCX0KKwkJCX0KKwkJCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0Q5WFhYX0NMS19PRkY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0NMS19NQ0xLOgorCQlpZiAoLS1yZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDAgJiYKKwkJICAgIHJlc21nci0+Y2xrX3Jjb191c2VycyA9PSAwKSB7CisJCQl3Y2Q5eHh4X2Rpc2FibGVfY2xvY2tfYmxvY2socmVzbWdyKTsKKworCQkJaWYgKChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOVhYWF9DRENfVFlQRV9UT01UT00pICYmCisJCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgVE9NVE9NX0FfUkNPX0NUUkwpICYgMHg4MCkpIHsKKwkJCQkvKiBwb3dlcmRvd24gUkNPKi8KKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBUT01UT01fQV9SQ09fQ1RSTCwKKwkJCQkJCSAgICAweDgwLCAweDAwKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJICAgIFRPTVRPTV9BX0JJQVNfT1NDX0JHX0NUTCwKKwkJCQkJCSAgICAweDAxLCAweDAwKTsKKwkJCX0KKwkJCXJlc21nci0+Y2xrX3R5cGUgPSBXQ0Q5WFhYX0NMS19PRkY7CisJCX0gZWxzZSBpZiAocmVzbWdyLT5jbGtfbWNsa191c2VycyA9PSAwICYmCisJCQkgICByZXNtZ3ItPmNsa19yY29fdXNlcnMpIHsKKwkJCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOVhYWF9DRENfVFlQRV9UT01UT00pIHsKKwkJCQlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsIFRPTVRPTV9BX1JDT19DVFJMKSAmCisJCQkJICAgICAgMHg4MCkpIHsKKwkJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEVuYWJsaW5nIFJDT1xuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQkJd2NkOXh4eF9lbmFibGVfY2xvY2tfYmxvY2socmVzbWdyLAorCQkJCQkJCVdDRDlYWFhfQ0ZHX0NBTF9SQ08pOworCQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQkJCVdDRDlYWFhfQV9DTEtfQlVGRl9FTjEsCisJCQkJCQkJMHgwMSwgMHgwMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0VWRU5UX1BSRV9NQ0xLX09GRik7CisJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCQkJV0NEOVhYWF9BX0NMS19CVUZGX0VOMSwKKwkJCQkJCQkweDA4LCAweDA4KTsKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJCQlXQ0Q5WFhYX0FfQ0xLX0JVRkZfRU4xLAorCQkJCQkJCTB4MDEsIDB4MDApOworCQkJCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwKKwkJCQkJCVdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09GRik7CisJCQkJCS8qIENMSyBNdXggY2hhbmdlZCB0byBSQ08sIG5vdGlmeSB0aGF0CisJCQkJCSAqIFJDTyBpcyBPTgorCQkJCQkgKi8KKwkJCQkJd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChyZXNtZ3IsCisJCQkJCQlXQ0Q5WFhYX0VWRU5UX1BPU1RfUkNPX09OKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGRpc2FibGUgY2xvY2sgKi8KKwkJCQl3Y2Q5eHh4X2Rpc2FibGVfY2xvY2tfYmxvY2socmVzbWdyKTsKKwkJCQkvKiBzd2l0Y2ggdG8gUkNPICovCisJCQkJd2NkOXh4eF9lbmFibGVfY2xvY2tfYmxvY2socmVzbWdyLAorCQkJCQkJCVdDRDlYWFhfQ0ZHX1JDTyk7CisJCQl9CisJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEOVhYWF9DTEtfUkNPOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEVycm9yLCBJbnZhbGlkIGNsb2NrIGdldCByZXF1ZXN0ICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHR5cGUpOworCQlicmVhazsKKwl9CisJV0FSTl9PTihyZXNtZ3ItPmNsa19yY29fdXNlcnMgPCAwKTsKKwlXQVJOX09OKHJlc21nci0+Y2xrX21jbGtfdXNlcnMgPCAwKTsKKworCXByX2RlYnVnKCIlczogbmV3IHJjb191c2VycyAlZCwgbWNsa191c2VycyAlZFxuIiwgX19mdW5jX18sCisJCSByZXNtZ3ItPmNsa19yY29fdXNlcnMsIHJlc21nci0+Y2xrX21jbGtfdXNlcnMpOworfQorCisvKgorICogd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa190eXBlKCkKKyAqIFJldHVybnMgY2xrIHR5cGUgdGhhdCBpcyBjdXJyZW50bHkgZW5hYmxlZAorICovCitpbnQgd2NkOXh4eF9yZXNtZ3JfZ2V0X2Nsa190eXBlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKQoreworCXJldHVybiByZXNtZ3ItPmNsa190eXBlOworfQorCitzdGF0aWMgdm9pZCB3Y2Q5eHh4X3Jlc21ncl91cGRhdGVfY2ZpbHRfdXNhZ2Uoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJCSAgICAgIGVudW0gd2NkOXh4eF9jZmlsdF9zZWwgY2ZpbHRfc2VsLAorCQkJCQkgICAgICBib29sIGluYykKK3sKKwl1MTYgbWljYl9jZmlsdF9yZWc7CisJZW51bSB3Y2Q5eHh4X25vdGlmeV9ldmVudCBlX3ByZV9vbiwgZV9wb3N0X29mZjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSByZXNtZ3ItPmNvZGVjOworCisJc3dpdGNoIChjZmlsdF9zZWwpIHsKKwljYXNlIFdDRDlYWFhfQ0ZJTFQxX1NFTDoKKwkJbWljYl9jZmlsdF9yZWcgPSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8xX0NUTDsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8xX09OOworCQllX3Bvc3Rfb2ZmID0gV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzFfT0ZGOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfQ0ZJTFQyX1NFTDoKKwkJbWljYl9jZmlsdF9yZWcgPSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8yX0NUTDsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8yX09OOworCQllX3Bvc3Rfb2ZmID0gV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzJfT0ZGOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfQ0ZJTFQzX1NFTDoKKwkJbWljYl9jZmlsdF9yZWcgPSBXQ0Q5WFhYX0FfTUlDQl9DRklMVF8zX0NUTDsKKwkJZV9wcmVfb24gPSBXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8zX09OOworCQllX3Bvc3Rfb2ZmID0gV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzNfT0ZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJJbnZhbGlkIENGSUxUIHNlbGVjdGlvbiAlZFxuIiwgY2ZpbHRfc2VsKTsKKwkJcmV0dXJuOyAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCX0KKworCWlmIChpbmMpIHsKKwkJaWYgKChyZXNtZ3ItPmNmaWx0X3VzZXJzW2NmaWx0X3NlbF0rKykgPT0gMCkgeworCQkJLyogTm90aWZ5ICovCisJCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwgZV9wcmVfb24pOworCQkJLyogRW5hYmxlIENGSUxUICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2NmaWx0X3JlZywgMHg4MCwgMHg4MCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBDaGVjayBpZiBjb3VudCBub3QgemVybywgZGVjcmVhc2UKKwkJICogdGhlbiBjaGVjayBpZiB6ZXJvLCBnbyBhaGVhZCBkaXNhYmxlIGNmaWx0ZXIKKwkJICovCisJCVdBUk4ocmVzbWdyLT5jZmlsdF91c2Vyc1tjZmlsdF9zZWxdID09IDAsCisJCSAgICAgIkludmFsaWQgQ0ZJTFQgdXNlIGNvdW50IDBcbiIpOworCQlpZiAoKC0tcmVzbWdyLT5jZmlsdF91c2Vyc1tjZmlsdF9zZWxdKSA9PSAwKSB7CisJCQkvKiBEaXNhYmxlIENGSUxUICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2NmaWx0X3JlZywgMHg4MCwgMCk7CisJCQkvKiBOb3RpZnkgTUJIQyBzbyBNQkhDIGNhbiBzd2l0Y2ggQ0ZJTFQgdG8gZmFzdCBtb2RlICovCisJCQl3Y2Q5eHh4X3Jlc21ncl9ub3RpZmllcl9jYWxsKHJlc21nciwgZV9wb3N0X29mZik7CisJCX0KKwl9Cit9CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfY2ZpbHRfZ2V0KHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJICAgICAgZW51bSB3Y2Q5eHh4X2NmaWx0X3NlbCBjZmlsdF9zZWwpCit7CisJcmV0dXJuIHdjZDl4eHhfcmVzbWdyX3VwZGF0ZV9jZmlsdF91c2FnZShyZXNtZ3IsIGNmaWx0X3NlbCwgdHJ1ZSk7Cit9CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfY2ZpbHRfcHV0KHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJICAgICAgZW51bSB3Y2Q5eHh4X2NmaWx0X3NlbCBjZmlsdF9zZWwpCit7CisJcmV0dXJuIHdjZDl4eHhfcmVzbWdyX3VwZGF0ZV9jZmlsdF91c2FnZShyZXNtZ3IsIGNmaWx0X3NlbCwgZmFsc2UpOworfQorCitpbnQgd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY2ZpbHRfbXYpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBpbnQgbGRvaF92ID0gcmVzbWdyLT5taWNiaWFzX3BkYXRhLT5sZG9oX3Y7CisJdW5zaWduZWQgaW50IG1pbl9tdiwgbWF4X212OworCisJc3dpdGNoIChsZG9oX3YpIHsKKwljYXNlIFdDRDlYWFhfTERPSF8xUDk1X1Y6CisJCW1pbl9tdiA9IDE2MDsKKwkJbWF4X212ID0gMTgwMDsKKwkJYnJlYWs7CisJY2FzZSBXQ0Q5WFhYX0xET0hfMlAzNV9WOgorCQltaW5fbXYgPSAyMDA7CisJCW1heF9tdiA9IDIyMDA7CisJCWJyZWFrOworCWNhc2UgV0NEOVhYWF9MRE9IXzJQNzVfVjoKKwkJbWluX212ID0gMjQwOworCQltYXhfbXYgPSAyNjAwOworCQlicmVhazsKKwljYXNlIFdDRDlYWFhfTERPSF8zUDBfVjoKKwkJbWluX212ID0gMjYwOworCQltYXhfbXYgPSAyODc1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNmaWx0X212IDwgbWluX212IHx8IGNmaWx0X212ID4gbWF4X212KQorCQlnb3RvIGRvbmU7CisKKwlmb3IgKHJjID0gNDsgcmMgPD0gNDQ7IHJjKyspIHsKKwkJbWluX212ID0gbWF4X212ICogKHJjKSAvIDQ0OworCQlpZiAobWluX212ID49IGNmaWx0X212KSB7CisJCQlyYyAtPSA0OworCQkJYnJlYWs7CisJCX0KKwl9Citkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgd2NkOXh4eF9yZXNtZ3JfY29uZF90cmlnZ2VyX2NvbmQoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJCSAgICAgZW51bSB3Y2Q5eHh4X3Jlc21ncl9jb25kIGNvbmQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfY29uZF9lbnRyeSAqZTsKKwlib29sIHNldDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwkvKiB1cGRhdGUgYml0IGlmIGNvbmQgaXNuJ3QgYXZhaWxhYmxlIG9yIGNvbmQgaXMgc2V0ICovCisJc2V0ID0gIXRlc3RfYml0KGNvbmQsICZyZXNtZ3ItPmNvbmRfYXZhaWxfZmxhZ3MpIHx8CisJICAgICAgISF0ZXN0X2JpdChjb25kLCAmcmVzbWdyLT5jb25kX2ZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKGwsICZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9oKSB7CisJCWUgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl9jb25kX2VudHJ5LCBsaXN0KTsKKwkJaWYgKGUtPmNvbmQgPT0gY29uZCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMocmVzbWdyLT5jb2RlYywgZS0+cmVnLAorCQkJCQkgICAgMSA8PCBlLT5zaGlmdCwKKwkJCQkJICAgIChzZXQgPyAhZS0+aW52ZXJ0IDogZS0+aW52ZXJ0KQorCQkJCQkgICAgPDwgZS0+c2hpZnQpOworCX0KKwlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Cit9CisKKy8qCisgKiB3Y2Q5eHh4X3JlZ21ncl9jb25kX3JlZ2lzdGVyIDogbm90aWZ5IHJlc21nciBjb25kaXRpb25zIGluIHRoZSBjb25kYml0cyBhcmUKKyAqCQkJCSAgYXZhaWxhYmxlIGFuZCBub3RpZmllZC4KKyAqIGNvbmRiaXRzIDogY29udGFpbnMgYml0bWFzayBvZiBlbnVtIHdjZDl4eHhfcmVzbWdyX2NvbmQKKyAqLwordm9pZCB3Y2Q5eHh4X3JlZ21ncl9jb25kX3JlZ2lzdGVyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgdW5zaWduZWQgbG9uZyBjb25kYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgY29uZDsKKworCWZvcl9lYWNoX3NldF9iaXQoY29uZCwgJmNvbmRiaXRzLCBCSVRTX1BFUl9CWVRFICogc2l6ZW9mKGNvbmRiaXRzKSkgeworCQltdXRleF9sb2NrKCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwkJV0FSTih0ZXN0X2JpdChjb25kLCAmcmVzbWdyLT5jb25kX2F2YWlsX2ZsYWdzKSwKKwkJICAgICAiQ29uZGl0aW9uIDB4JTB4IGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgY29uZCk7CisJCXNldF9iaXQoY29uZCwgJnJlc21nci0+Y29uZF9hdmFpbF9mbGFncyk7CisJCXdjZDl4eHhfcmVzbWdyX2NvbmRfdHJpZ2dlcl9jb25kKHJlc21nciwgY29uZCk7CisJCW11dGV4X3VubG9jaygmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfbG9jayk7CisJCXByX2RlYnVnKCIlczogQ29uZGl0aW9uIDB4JXggaXMgcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18sIGNvbmQpOworCX0KK30KKwordm9pZCB3Y2Q5eHh4X3JlZ21ncl9jb25kX2RlcmVnaXN0ZXIoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY29uZGJpdHMpCit7CisJdW5zaWduZWQgaW50IGNvbmQ7CisKKwlmb3JfZWFjaF9zZXRfYml0KGNvbmQsICZjb25kYml0cywgQklUU19QRVJfQllURSAqIHNpemVvZihjb25kYml0cykpIHsKKwkJbXV0ZXhfbG9jaygmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfbG9jayk7CisJCVdBUk4oIXRlc3RfYml0KGNvbmQsICZyZXNtZ3ItPmNvbmRfYXZhaWxfZmxhZ3MpLAorCQkgICAgICJDb25kaXRpb24gMHglMHggaXNuJ3QgcmVnaXN0ZXJlZFxuIiwgY29uZCk7CisJCWNsZWFyX2JpdChjb25kLCAmcmVzbWdyLT5jb25kX2F2YWlsX2ZsYWdzKTsKKwkJd2NkOXh4eF9yZXNtZ3JfY29uZF90cmlnZ2VyX2NvbmQocmVzbWdyLCBjb25kKTsKKwkJbXV0ZXhfdW5sb2NrKCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwkJcHJfZGVidWcoIiVzOiBDb25kaXRpb24gMHgleCBpcyBkZXJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fLAorCQkJIGNvbmQpOworCX0KK30KKwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9jb25kX3VwZGF0ZV9jb25kKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgICAgZW51bSB3Y2Q5eHh4X3Jlc21ncl9jb25kIGNvbmQsIGJvb2wgc2V0KQoreworCW11dGV4X2xvY2soJnJlc21nci0+dXBkYXRlX2JpdF9jb25kX2xvY2spOworCWlmICgoc2V0ICYmICF0ZXN0X2FuZF9zZXRfYml0KGNvbmQsICZyZXNtZ3ItPmNvbmRfZmxhZ3MpKSB8fAorCSAgICAoIXNldCAmJiB0ZXN0X2FuZF9jbGVhcl9iaXQoY29uZCwgJnJlc21nci0+Y29uZF9mbGFncykpKSB7CisJCXByX2RlYnVnKCIlczogUmVzb3VyY2UgJWQgY29uZGl0aW9uIGNoYW5nZWQgdG8gJXNcbiIsIF9fZnVuY19fLAorCQkJIGNvbmQsIHNldCA/ICJzZXQiIDogImNsZWFyIik7CisJCXdjZDl4eHhfcmVzbWdyX2NvbmRfdHJpZ2dlcl9jb25kKHJlc21nciwgY29uZCk7CisJfQorCW11dGV4X3VubG9jaygmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfbG9jayk7Cit9CisKK2ludCB3Y2Q5eHh4X3Jlc21ncl9hZGRfY29uZF91cGRhdGVfYml0cyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkJZW51bSB3Y2Q5eHh4X3Jlc21ncl9jb25kIGNvbmQsCisJCQkJCXVuc2lnbmVkIHNob3J0IHJlZywgaW50IHNoaWZ0LAorCQkJCQlib29sIGludmVydCkKK3sKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfY29uZF9lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW50cnktPmNvbmQgPSBjb25kOworCWVudHJ5LT5yZWcgPSByZWc7CisJZW50cnktPnNoaWZ0ID0gc2hpZnQ7CisJZW50cnktPmludmVydCA9IGludmVydDsKKworCW11dGV4X2xvY2soJnJlc21nci0+dXBkYXRlX2JpdF9jb25kX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfaCk7CisKKwl3Y2Q5eHh4X3Jlc21ncl9jb25kX3RyaWdnZXJfY29uZChyZXNtZ3IsIGNvbmQpOworCW11dGV4X3VubG9jaygmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdjZDl4eHhfcmVzbWdyX3JtX2NvbmRfdXBkYXRlX2JpdHMgOgorICogQ2xlYXIgYml0IGFuZCByZW1vdmUgZnJvbSB0aGUgY29uZGl0aW9uYWwgYml0IHVwZGF0ZSBsaXN0CisgKi8KK2ludCB3Y2Q5eHh4X3Jlc21ncl9ybV9jb25kX3VwZGF0ZV9iaXRzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgICAgICBlbnVtIHdjZDl4eHhfcmVzbWdyX2NvbmQgY29uZCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcmVnLCBpbnQgc2hpZnQsCisJCQkJICAgICAgIGJvb2wgaW52ZXJ0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpuZXh0OworCXN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl9jb25kX2VudHJ5ICplID0gTlVMTDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwltdXRleF9sb2NrKCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbmV4dCwgJnJlc21nci0+dXBkYXRlX2JpdF9jb25kX2gpIHsKKwkJZSA9IGxpc3RfZW50cnkobCwgc3RydWN0IHdjZDl4eHhfcmVzbWdyX2NvbmRfZW50cnksIGxpc3QpOworCQlpZiAoZS0+cmVnID09IHJlZyAmJiBlLT5zaGlmdCA9PSBzaGlmdCAmJiBlLT5pbnZlcnQgPT0gaW52ZXJ0KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHJlc21nci0+Y29kZWMsIGUtPnJlZywKKwkJCQkJICAgIDEgPDwgZS0+c2hpZnQsCisJCQkJCSAgICBlLT5pbnZlcnQgPDwgZS0+c2hpZnQpOworCQkJbGlzdF9kZWwoJmUtPmxpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwkJCWtmcmVlKGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwlwcl9lcnIoIiVzOiBDYW5ub3QgZmluZCB1cGRhdGUgYml0IGVudHJ5IHJlZyAweCV4LCBzaGlmdCAlZFxuIiwKKwkgICAgICAgX19mdW5jX18sIGUgPyBlLT5yZWcgOiAwLCBlID8gZS0+c2hpZnQgOiAwKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgd2NkOXh4eF9yZXNtZ3JfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaykKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnJlc21nci0+bm90aWZpZXIsIG5ibG9jayk7Cit9CisKK2ludCB3Y2Q5eHh4X3Jlc21ncl91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaykKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcmVzbWdyLT5ub3RpZmllciwgbmJsb2NrKTsKK30KKworaW50IHdjZDl4eHhfcmVzbWdyX2luaXQoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcywKKwkJCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSwKKwkJCXN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyAqbWljYmlhc19wZGF0YSwKKwkJCXN0cnVjdCB3Y2Q5eHh4X3JlZ19hZGRyZXNzICpyZWdfYWRkciwKKwkJCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl9jYiAqcmVzbWdyX2NiLAorCQkJZW51bSB3Y2Q5eHh4X2NkY190eXBlIGNkY190eXBlKQoreworCVdBUk4oQVJSQVlfU0laRSh3Y2Q5eHh4X2V2ZW50X3N0cmluZykgIT0gV0NEOVhYWF9FVkVOVF9MQVNUICsgMSwKKwkgICAgICJFdmVudCBzdHJpbmcgdGFibGUgaXNuJ3QgdXAgdG8gZGF0ZSEsICV6ZCAhPSAlZFxuIiwKKwkgICAgIEFSUkFZX1NJWkUod2NkOXh4eF9ldmVudF9zdHJpbmcpLCBXQ0Q5WFhYX0VWRU5UX0xBU1QgKyAxKTsKKworCXJlc21nci0+YmFuZGdhcF90eXBlID0gV0NEOVhYWF9CQU5ER0FQX09GRjsKKwlyZXNtZ3ItPmNvZGVjID0gY29kZWM7CisJcmVzbWdyLT5jb2RlY190eXBlID0gY2RjX3R5cGU7CisJLyogVGhpcyBnaXZlcyBhY2Nlc3Mgb2YgY29yZSBoYW5kbGUgdG8gbG9jay91bmxvY2sgc3VzcGVuZCAqLworCXJlc21nci0+Y29yZV9yZXMgPSBjb3JlX3JlczsKKwlyZXNtZ3ItPnBkYXRhID0gcGRhdGE7CisJcmVzbWdyLT5taWNiaWFzX3BkYXRhID0gbWljYmlhc19wZGF0YTsKKwlyZXNtZ3ItPnJlZ19hZGRyID0gcmVnX2FkZHI7CisJcmVzbWdyLT5yZXNtZ3JfY2IgPSByZXNtZ3JfY2I7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVzbWdyLT51cGRhdGVfYml0X2NvbmRfaCk7CisKKwlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJnJlc21nci0+bm90aWZpZXIpOworCisJbXV0ZXhfaW5pdCgmcmVzbWdyLT5jb2RlY19yZXNvdXJjZV9sb2NrKTsKKwltdXRleF9pbml0KCZyZXNtZ3ItPmNvZGVjX2JnX2Nsa19sb2NrKTsKKwltdXRleF9pbml0KCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHdjZDl4eHhfcmVzbWdyX2RlaW5pdChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncikKK3sKKwltdXRleF9kZXN0cm95KCZyZXNtZ3ItPnVwZGF0ZV9iaXRfY29uZF9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZyZXNtZ3ItPmNvZGVjX2JnX2Nsa19sb2NrKTsKKwltdXRleF9kZXN0cm95KCZyZXNtZ3ItPmNvZGVjX3Jlc291cmNlX2xvY2spOworfQorCit2b2lkIHdjZDl4eHhfcmVzbWdyX2JjbF9sb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyKQoreworCW11dGV4X2xvY2soJnJlc21nci0+Y29kZWNfcmVzb3VyY2VfbG9jayk7Cit9CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfYmNsX3VubG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncikKK3sKKwltdXRleF91bmxvY2soJnJlc21nci0+Y29kZWNfcmVzb3VyY2VfbG9jayk7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigid2NkOXh4eCByZXNtZ3IgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1ZDYxNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1yZXNtZ3IuaApAQCAtMCwwICsxLDI4MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTYgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX1dDRDlYWFhfQ09NTU9OX0hfXworI2RlZmluZSBfX1dDRDlYWFhfQ09NTU9OX0hfXworCisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KKworZW51bSB3Y2Q5eHh4X2JhbmRnYXBfdHlwZSB7CisJV0NEOVhYWF9CQU5ER0FQX09GRiwKKwlXQ0Q5WFhYX0JBTkRHQVBfQVVESU9fTU9ERSwKKwlXQ0Q5WFhYX0JBTkRHQVBfTUJIQ19NT0RFLAorfTsKKworZW51bSB3Y2Q5eHh4X2NkY190eXBlIHsKKwlXQ0Q5WFhYX0NEQ19UWVBFX0lOVkFMSUQgPSAwLAorCVdDRDlYWFhfQ0RDX1RZUEVfVEFJS08sCisJV0NEOVhYWF9DRENfVFlQRV9UQVBBTiwKKwlXQ0Q5WFhYX0NEQ19UWVBFX0hFTElDT04sCisJV0NEOVhYWF9DRENfVFlQRV9UT01UT00sCit9OworCitlbnVtIHdjZDl4eHhfY2xvY2tfdHlwZSB7CisJV0NEOVhYWF9DTEtfT0ZGLAorCVdDRDlYWFhfQ0xLX1JDTywKKwlXQ0Q5WFhYX0NMS19NQ0xLLAorfTsKKworZW51bSB3Y2Q5eHh4X2Nsb2NrX2NvbmZpZ19tb2RlIHsKKwlXQ0Q5WFhYX0NGR19NQ0xLID0gMCwKKwlXQ0Q5WFhYX0NGR19SQ08sCisJV0NEOVhYWF9DRkdfQ0FMX1JDTywKK307CisKK2VudW0gd2NkOXh4eF9jZmlsdF9zZWwgeworCVdDRDlYWFhfQ0ZJTFQxX1NFTCwKKwlXQ0Q5WFhYX0NGSUxUMl9TRUwsCisJV0NEOVhYWF9DRklMVDNfU0VMLAorCVdDRDlYWFhfTlVNX09GX0NGSUxULAorfTsKKworc3RydWN0IHdjZDl4eHhfcmVnX2FkZHJlc3MgeworCXUxNiBtaWNiXzRfY3RsOworCXUxNiBtaWNiXzRfaW50X3JiaWFzOworCXUxNiBtaWNiXzRfbWJoYzsKK307CisKK2VudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgeworCVdDRDlYWFhfRVZFTlRfSU5WQUxJRCwKKworCVdDRDlYWFhfRVZFTlRfUFJFX1JDT19PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfUkNPX09OLAorCVdDRDlYWFhfRVZFTlRfUFJFX1JDT19PRkYsCisJV0NEOVhYWF9FVkVOVF9QT1NUX1JDT19PRkYsCisKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NQ0xLX09OLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09OLAorCVdDRDlYWFhfRVZFTlRfUFJFX01DTEtfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9NQ0xLX09GRiwKKworCVdDRDlYWFhfRVZFTlRfUFJFX0JHX09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfQkdfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUFJFX0JHX0FVRElPX09OLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9CR19BVURJT19PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9CR19NQkhDX09OLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9CR19NQkhDX09OLAorCisJV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU18xX09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU18xX09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUFJFX01JQ0JJQVNfM19PRkYsCisJV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfM19PRkYsCisJV0NEOVhYWF9FVkVOVF9QUkVfTUlDQklBU180X09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfTUlDQklBU180X09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzFfT04sCisJV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMV9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzJfT04sCisJV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzNfT04sCisJV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfM19PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9NSUNCSUFTXzRfT04sCisJV0NEOVhYWF9FVkVOVF9QT1NUX01JQ0JJQVNfNF9PTiwKKworCVdDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzFfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8xX09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8yX09GRiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfQ0ZJTFRfMl9PRkYsCisJV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfM19PRkYsCisJV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzNfT0ZGLAorCVdDRDlYWFhfRVZFTlRfUFJFX0NGSUxUXzFfT04sCisJV0NEOVhYWF9FVkVOVF9QT1NUX0NGSUxUXzFfT04sCisJV0NEOVhYWF9FVkVOVF9QUkVfQ0ZJTFRfMl9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfQ0ZJTFRfMl9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BSRV9DRklMVF8zX09OLAorCVdDRDlYWFhfRVZFTlRfUE9TVF9DRklMVF8zX09OLAorCisJV0NEOVhYWF9FVkVOVF9QUkVfSFBITF9QQV9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYsCisJV0NEOVhYWF9FVkVOVF9QUkVfSFBIUl9QQV9PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfSFBIUl9QQV9PRkYsCisKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfUkVTVU1FLAorCisJV0NEOVhYWF9FVkVOVF9QUkVfVFhfM19PTiwKKwlXQ0Q5WFhYX0VWRU5UX1BPU1RfVFhfM19PRkYsCisKKwlXQ0Q5WFhYX0VWRU5UX0xBU1QsCit9OworCitzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfY2IgeworCWludCAoKmNkY19yY29fY3RybCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Cit9OworCitzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlczsKKworCXUzMiByeF9iaWFzX2NvdW50OworCisJLyoKKwkgKiBiYW5kZ2FwX3R5cGUsIGJnX2F1ZGlvX3VzZXJzIGFuZCBiZ19tYmhjX3VzZXJzIGhhdmUgdG8gYmUKKwkgKiByZWZlcnJlZC9tYW5pcHVsYXRlZCBhZnRlciBhY3F1aXJpbmcgY29kZWNfYmdfY2xrX2xvY2sgbXV0ZXgKKwkgKi8KKwllbnVtIHdjZDl4eHhfYmFuZGdhcF90eXBlIGJhbmRnYXBfdHlwZTsKKwl1MTYgYmdfYXVkaW9fdXNlcnM7CisJdTE2IGJnX21iaGNfdXNlcnM7CisKKwkvKgorCSAqIGNsa190eXBlLCBjbGtfcmNvX3VzZXJzIGFuZCBjbGtfbWNsa191c2VycyBoYXZlIHRvIGJlCisJICogcmVmZXJyZWQvbWFuaXB1bGF0ZWQgYWZ0ZXIgYWNxdWlyaW5nIGNvZGVjX2JnX2Nsa19sb2NrIG11dGV4CisJICovCisJZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgY2xrX3R5cGU7CisJdTE2IGNsa19yY29fdXNlcnM7CisJdTE2IGNsa19tY2xrX3VzZXJzOworCXUxNiBleHRfY2xrX3VzZXJzOworCisJLyogY2ZpbHQgdXNlcnMgcGVyIGNmaWx0cyAqLworCXUxNiBjZmlsdF91c2Vyc1tXQ0Q5WFhYX05VTV9PRl9DRklMVF07CisKKwlzdHJ1Y3Qgd2NkOXh4eF9yZWdfYWRkcmVzcyAqcmVnX2FkZHI7CisKKwlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7CisKKwlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXNfcGRhdGE7CisKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBub3RpZmllcjsKKwkvKiBOb3RpZmllciBuZWVkcyBtYmhjIHBvaW50ZXIgd2l0aCByZXNtZ3IgKi8KKwlzdHJ1Y3Qgd2NkOXh4eF9tYmhjICptYmhjOworCisJdW5zaWduZWQgbG9uZyBjb25kX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgY29uZF9hdmFpbF9mbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHVwZGF0ZV9iaXRfY29uZF9oOworCXN0cnVjdCBtdXRleCB1cGRhdGVfYml0X2NvbmRfbG9jazsKKworCS8qCisJICogQ3VycmVudGx5LCBvbmx5IHVzZWQgZm9yIG1iaGMgcHVycG9zZSwgdG8gcHJvdGVjdAorCSAqIGNvbmN1cnJlbnQgZXhlY3V0aW9uIG9mIG1iaGMgdGhyZWFkZWQgaXJxIGhhbmRsZXJzIGFuZAorCSAqIGtpbGwgcmFjZSBiZXR3ZWVuIERBUE0gYW5kIE1CSEMuIEJ1dCBjYW4gc2VydmUgYXMgYQorCSAqIGdlbmVyYWwgbG9jayB0byBwcm90ZWN0IGNvZGVjIHJlc291cmNlCisJICovCisJc3RydWN0IG11dGV4IGNvZGVjX3Jlc291cmNlX2xvY2s7CisJc3RydWN0IG11dGV4IGNvZGVjX2JnX2Nsa19sb2NrOworCisJZW51bSB3Y2Q5eHh4X2NkY190eXBlIGNvZGVjX3R5cGU7CisKKwljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfY2IgKnJlc21ncl9jYjsKK307CisKK2ludCB3Y2Q5eHh4X3Jlc21ncl9pbml0KHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXNfcGRhdGEsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9yZWdfYWRkcmVzcyAqcmVnX2FkZHIsCisJCQljb25zdCBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfY2IgKnJlc21ncl9jYiwKKwkJCWVudW0gd2NkOXh4eF9jZGNfdHlwZSBjZGNfdHlwZSk7Cit2b2lkIHdjZDl4eHhfcmVzbWdyX2RlaW5pdChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncik7CisKK2ludCB3Y2Q5eHh4X3Jlc21ncl9lbmFibGVfY29uZmlnX21vZGUoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJaW50IGVuYWJsZSk7CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfZW5hYmxlX3J4X2JpYXMoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsIHUzMiBlbmFibGUpOwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9nZXRfY2xrX2Jsb2NrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgZW51bSB3Y2Q5eHh4X2Nsb2NrX3R5cGUgdHlwZSk7Cit2b2lkIHdjZDl4eHhfcmVzbWdyX3B1dF9jbGtfYmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICBlbnVtIHdjZDl4eHhfY2xvY2tfdHlwZSB0eXBlKTsKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfZ2V0X2JhbmRnYXAoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJY29uc3QgZW51bSB3Y2Q5eHh4X2JhbmRnYXBfdHlwZSBjaG9pY2UpOwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9wdXRfYmFuZGdhcChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQllbnVtIHdjZDl4eHhfYmFuZGdhcF90eXBlIGNob2ljZSk7Cit2b2lkIHdjZDl4eHhfcmVzbWdyX2NmaWx0X2dldChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCSAgICAgIGVudW0gd2NkOXh4eF9jZmlsdF9zZWwgY2ZpbHRfc2VsKTsKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfY2ZpbHRfcHV0KHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJICAgICAgZW51bSB3Y2Q5eHh4X2NmaWx0X3NlbCBjZmlsdF9zZWwpOworaW50IHdjZDl4eHhfcmVzbWdyX2dldF9jbGtfdHlwZShzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncik7CisKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfYmNsX2xvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpOwordm9pZCB3Y2Q5eHh4X3Jlc21ncl9wb3N0X3NzcihzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21ncik7CisjZGVmaW5lIFdDRDlYWFhfQkNMX0xPQ0socmVzbWdyKQkJCVwKK3sJCQkJCQkJXAorCXByX2RlYnVnKCIlczogQWNxdWlyaW5nIEJDTFxuIiwgX19mdW5jX18pOwlcCisJd2NkOXh4eF9yZXNtZ3JfYmNsX2xvY2socmVzbWdyKTsJCQlcCisJcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkNMIGRvbmVcbiIsIF9fZnVuY19fKTsJXAorfQorCit2b2lkIHdjZDl4eHhfcmVzbWdyX2JjbF91bmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpOworI2RlZmluZSBXQ0Q5WFhYX0JDTF9VTkxPQ0socmVzbWdyKQkJCVwKK3sJCQkJCQkJXAorCXByX2RlYnVnKCIlczogUmVsZWFzZSBCQ0xcbiIsIF9fZnVuY19fKTsJXAorCXdjZDl4eHhfcmVzbWdyX2JjbF91bmxvY2socmVzbWdyKTsJCQlcCit9CisKKyNkZWZpbmUgV0NEOVhYWF9CQ0xfQVNTRVJUX0xPQ0tFRChyZXNtZ3IpCQlcCit7CQkJCQkJCVwKKwlXQVJOX09OQ0UoIW11dGV4X2lzX2xvY2tlZCgmcmVzbWdyLT5jb2RlY19yZXNvdXJjZV9sb2NrKSwgXAorCQkgICIlczogQkNMIHNob3VsZCBoYXZlIGFjcXVpcmVkXG4iLCBfX2Z1bmNfXyk7IFwKK30KKworI2RlZmluZSBXQ0Q5WFhYX0JHX0NMS19MT0NLKHJlc21ncikJCQlcCit7CQkJCQkJCVwKKwlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKl9fcmVzbWdyID0gcmVzbWdyOwlcCisJcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkdfQ0xLXG4iLCBfX2Z1bmNfXyk7CVwKKwltdXRleF9sb2NrKCZfX3Jlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOwlcCisJcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkdfQ0xLIGRvbmVcbiIsIF9fZnVuY19fKTsJXAorfQorCisjZGVmaW5lIFdDRDlYWFhfQkdfQ0xLX1VOTE9DSyhyZXNtZ3IpCQkJXAorewkJCQkJCQlcCisJc3RydWN0IHdjZDl4eHhfcmVzbWdyICpfX3Jlc21nciA9IHJlc21ncjsJXAorCXByX2RlYnVnKCIlczogUmVsZWFzaW5nIEJHX0NMS1xuIiwgX19mdW5jX18pOwlcCisJbXV0ZXhfdW5sb2NrKCZfX3Jlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOwlcCit9CisKKyNkZWZpbmUgV0NEOVhYWF9CR19DTEtfQVNTRVJUX0xPQ0tFRChyZXNtZ3IpCQlcCit7CQkJCQkJCVwKKwlXQVJOX09OQ0UoIW11dGV4X2lzX2xvY2tlZCgmcmVzbWdyLT5jb2RlY19iZ19jbGtfbG9jayksIFwKKwkJICAiJXM6IEJHX0NMSyBsb2NrIHNob3VsZCBoYXZlIGFjcXVpcmVkXG4iLCBfX2Z1bmNfXyk7IFwKK30KKworY29uc3QgY2hhciAqd2NkOXh4eF9nZXRfZXZlbnRfc3RyaW5nKGVudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgdHlwZSk7CitpbnQgd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY2ZpbHRfbXYpOworaW50IHdjZDl4eHhfcmVzbWdyX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCSAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2spOworaW50IHdjZDl4eHhfcmVzbWdyX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrKTsKK3ZvaWQgd2NkOXh4eF9yZXNtZ3Jfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkgIGNvbnN0IGVudW0gd2NkOXh4eF9ub3RpZnlfZXZlbnQgZSk7CisKK2VudW0gd2NkOXh4eF9yZXNtZ3JfY29uZCB7CisJV0NEOVhYWF9DT05EX0hQSCA9IDB4MDEsIC8qIEhlYWRwaG9uZSAqLworCVdDRDlYWFhfQ09ORF9IUEhfTUlDID0gMHgwMiwgLyogTWljcm9waG9uZSBvbiB0aGUgaGVhZHNldCAqLworfTsKK3ZvaWQgd2NkOXh4eF9yZWdtZ3JfY29uZF9yZWdpc3RlcihzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29uZGJpdHMpOwordm9pZCB3Y2Q5eHh4X3JlZ21ncl9jb25kX2RlcmVnaXN0ZXIoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY29uZGJpdHMpOworaW50IHdjZDl4eHhfcmVzbWdyX3JtX2NvbmRfdXBkYXRlX2JpdHMoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IsCisJCQkJICAgICAgIGVudW0gd2NkOXh4eF9yZXNtZ3JfY29uZCBjb25kLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCByZWcsIGludCBzaGlmdCwKKwkJCQkgICAgICAgYm9vbCBpbnZlcnQpOworaW50IHdjZDl4eHhfcmVzbWdyX2FkZF9jb25kX3VwZGF0ZV9iaXRzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21nciAqcmVzbWdyLAorCQkJCQllbnVtIHdjZDl4eHhfcmVzbWdyX2NvbmQgY29uZCwKKwkJCQkJdW5zaWduZWQgc2hvcnQgcmVnLCBpbnQgc2hpZnQsCisJCQkJCWJvb2wgaW52ZXJ0KTsKK3ZvaWQgd2NkOXh4eF9yZXNtZ3JfY29uZF91cGRhdGVfY29uZChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3IgKnJlc21nciwKKwkJCQkgICAgIGVudW0gd2NkOXh4eF9yZXNtZ3JfY29uZCBjb25kLCBib29sIHNldCk7CisKKyNlbmRpZiAvKiBfX1dDRDlYWFhfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RfY21pX2FwaS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY21pX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmU2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZF9jbWlfYXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19DTUlfQVBJX18KKyNkZWZpbmUgX19DTUlfQVBJX18KKworZW51bSBjbWlfYXBpX3Jlc3VsdCB7CisJQ01JX0FQSV9GQUlMRUQgPSAxLAorCUNNSV9BUElfQlVTWSwKKwlDTUlfQVBJX05PX01FTU9SWSwKKwlDTUlfQVBJX05PVF9SRUFEWSwKK307CisKK2VudW0gY21pX2FwaV9ldmVudCB7CisJQ01JX0FQSV9NU0cgPSAxLAorCUNNSV9BUElfT0ZGTElORSwKKwlDTUlfQVBJX09OTElORSwKKwlDTUlfQVBJX0RFSU5JVElBTElaRUQsCit9OworCitzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24geworCWVudW0gY21pX2FwaV9ldmVudCBldmVudDsKKwllbnVtIGNtaV9hcGlfcmVzdWx0IHJlc3VsdDsKKwl2b2lkICptZXNzYWdlOworfTsKKwordm9pZCAqY21pX3JlZ2lzdGVyKAorCXZvaWQgbm90aWZpY2F0aW9uX2NhbGxiYWNrCisJCShjb25zdCBzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gKnBhcmFtZXRlciksCisJdTMyIHNlcnZpY2UpOworZW51bSBjbWlfYXBpX3Jlc3VsdCBjbWlfZGVyZWdpc3Rlcih2b2lkICpyZWdfaGFuZGxlKTsKK2VudW0gY21pX2FwaV9yZXN1bHQgY21pX3NlbmRfbXNnKHZvaWQgKm1lc3NhZ2UpOworCisjZW5kaWYgLypfX0NNSV9BUElfXyovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfY29yZS5jIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM2ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuYwpAQCAtMCwwICsxLDQ2MDAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvbHNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NwZV9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY3BlX2NtaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NwZV9lcnIuaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LWlycS5oPgorI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgorI2luY2x1ZGUgIndjZF9jcGVfY29yZS5oIgorI2luY2x1ZGUgIndjZF9jcGVfc2VydmljZXMuaCIKKyNpbmNsdWRlICJ3Y2RfY21pX2FwaS5oIgorCisjZGVmaW5lIENNSV9DTURfVElNRU9VVCAoMTAgKiBIWikKKyNkZWZpbmUgV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TIDIKKyNkZWZpbmUgV0NEX0NQRV9BRkVfTUFYX1BPUlRTIDQKKyNkZWZpbmUgQUZFX1NWQ19FWFBMSUNJVF9QT1JUX1NUQVJUIDEKKyNkZWZpbmUgV0NEX0NQRV9FQ19QUF9CVUZfU0laRQk0ODAgLyogNSBtc2VjIGJ1ZmZlciAqLworCisjZGVmaW5lIEVMRl9GTEFHX0VYRUNVVEUgKDEgPDwgMCkKKyNkZWZpbmUgRUxGX0ZMQUdfV1JJVEUgKDEgPDwgMSkKKyNkZWZpbmUgRUxGX0ZMQUdfUkVBRCAoMSA8PCAyKQorCisjZGVmaW5lIEVMRl9GTEFHX1JXIChFTEZfRkxBR19SRUFEIHwgRUxGX0ZMQUdfV1JJVEUpCisKKyNkZWZpbmUgV0NEX0NQRV9HUkFCX0xPQ0sobG9jaywgbmFtZSkJCVwKK3sJCQkJCQlcCisJcHJfZGVidWcoIiVzOiAlcyBsb2NrIGFjcXVpcmVcbiIsCVwKKwkJIF9fZnVuY19fLCBuYW1lKTsJCVwKKwltdXRleF9sb2NrKGxvY2spOwkJCVwKK30KKworI2RlZmluZSBXQ0RfQ1BFX1JFTF9MT0NLKGxvY2ssIG5hbWUpCQlcCit7CQkJCQkJXAorCXByX2RlYnVnKCIlczogJXMgbG9jayByZWxlYXNlXG4iLAlcCisJCSBfX2Z1bmNfXywgbmFtZSk7CQlcCisJbXV0ZXhfdW5sb2NrKGxvY2spOwkJCVwKK30KKworI2RlZmluZSBXQ0RfQ1BFX1NUQVRFX01BWF9MRU4gMTEKKyNkZWZpbmUgQ1BFX09GRkxJTkVfV0FJVF9USU1FT1VUICgyICogSFopCisjZGVmaW5lIENQRV9SRUFEWV9XQUlUX1RJTUVPVVQgKDMgKiBIWikKKyNkZWZpbmUgV0NEX0NQRV9TWVNGU19ESVJfTUFYX0xFTkdUSCAzMgorCisjZGVmaW5lIENQRV9FUlJfSVJRX0NCKGNvcmUpIFwKKwkoY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCkKKworLyoKKyAqIEFGRSBvdXRwdXQgYnVmZmVyIHNpemUgaXMgYWx3YXlzCisgKiAoc2FtcGxlX3JhdGUgKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZS8yKjEwMDApCisgKi8KKyNkZWZpbmUgQUZFX09VVF9CVUZfU0laRShiaXRfd2lkdGgsIHNhbXBsZV9yYXRlKSBcCisJKCgoc2FtcGxlX3JhdGUpICogKGJpdF93aWR0aCAvIEJJVFNfUEVSX0JZVEUpKS8oMioxMDAwKSkKKworZW51bSBhZmVfcG9ydF9zdGF0ZSB7CisJQUZFX1BPUlRfU1RBVEVfREVJTklUID0gMCwKKwlBRkVfUE9SVF9TVEFURV9JTklULAorCUFGRV9QT1JUX1NUQVRFX0NPTkZJRywKKwlBRkVfUE9SVF9TVEFURV9TVEFSVEVELAorCUFGRV9QT1JUX1NUQVRFX1NVU1BFTkRFRCwKK307CisKK3N0cnVjdCB3Y2RfY21pX2FmZV9wb3J0X2RhdGEgeworCXU4IHBvcnRfaWQ7CisJc3RydWN0IG11dGV4IGFmZV9sb2NrOworCXN0cnVjdCBjb21wbGV0aW9uIGFmZV9jbWRfY29tcGxldGU7CisJZW51bSBhZmVfcG9ydF9zdGF0ZSBwb3J0X3N0YXRlOworCXU4IGNtZF9yZXN1bHQ7CisJdTMyIG1lbV9oYW5kbGU7Cit9OworCitzdHJ1Y3QgY3BlX2xzbV9pZHMgeworCXUzMiBtb2R1bGVfaWQ7CisJdTMyIHBhcmFtX2lkOworfTsKKworc3RhdGljIHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmVfZDsKK3N0YXRpYyBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uCisJCSpsc21fc2Vzc2lvbnNbV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TICsgMV07CitzdHJ1Y3Qgd2NkX2NwZV9jb3JlICogKCp3Y2RfZ2V0X2NwZV9jb3JlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKK3N0YXRpYyBzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhIGFmZV9wb3J0c1tXQ0RfQ1BFX0FGRV9NQVhfUE9SVFMgKyAxXTsKK3N0YXRpYyB2b2lkIHdjZF9jcGVfc3ZjX2V2ZW50X2NiKGNvbnN0IHN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiAqcGFyYW0pOworc3RhdGljIGludCB3Y2RfY3BlX3NldHVwX2lycXMoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSk7CitzdGF0aWMgdm9pZCB3Y2RfY3BlX2NsZWFudXBfaXJxcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKTsKK3N0YXRpYyBzc2l6ZV90IGNwZV9mdG1fdGVzdF90cmlnZ2VyKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHUzMiByYW1kdW1wX2VuYWJsZTsKK3N0YXRpYyB1MzIgY3BlX2Z0bV90ZXN0X3N0YXR1czsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwZV9mdG1fdGVzdF90cmlnZ2VyX2ZvcHMgPSB7CisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkud3JpdGUgPSBjcGVfZnRtX3Rlc3RfdHJpZ2dlciwKK307CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc3ZjX2NtZF9tb2RlKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCSAgICB1OCBtb2RlKTsKK3N0cnVjdCB3Y2RfY3BlX2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLCBjaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgY29uc3QgY2hhciAqYnVmLAorCQkJIHNzaXplX3QgY291bnQpOworfTsKKworI2RlZmluZSBXQ0RfQ1BFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCitzdGF0aWMgc3RydWN0IHdjZF9jcGVfYXR0cmlidXRlIGNwZV9hdHRyXyMjX25hbWUgPSB7IFwKKwkuYXR0ciA9IHsubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgLm1vZGUgPSBfbW9kZX0sIFwKKwkuc2hvdyA9IF9zaG93LCBcCisJLnN0b3JlID0gX3N0b3JlLCBcCit9CisKKyNkZWZpbmUgdG9fd2NkX2NwZV9hdHRyKGEpIFwKKwljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3Qgd2NkX2NwZV9hdHRyaWJ1dGUsIGF0dHIpCisKKyNkZWZpbmUga29ial90b19jcGVfY29yZShrb2JqKSBcCisJY29udGFpbmVyX29mKChrb2JqKSwgc3RydWN0IHdjZF9jcGVfY29yZSwgY3BlX2tvYmopCisKKy8qIHdjZF9jcGVfbHNtX3Nlc3Npb25fYWN0aXZlOiBjaGVjayBpZiBhbnkgc2Vzc2lvbiBpcyBhY3RpdmUKKyAqIHJldHVybiB0cnVlIGlmIGFueSBzZXNzaW9uIGlzIGFjdGl2ZS4KKyAqLworc3RhdGljIGJvb2wgd2NkX2NwZV9sc21fc2Vzc2lvbl9hY3RpdmUodm9pZCkKK3sKKwlpbnQgaW5kZXggPSAxOworCWJvb2wgbHNtX2FjdGl2ZSA9IGZhbHNlOworCisJLyogc2Vzc2lvbiBzdGFydHMgZnJvbSBpbmRleCAxICovCisJZm9yICg7IGluZGV4IDw9IFdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUzsgaW5kZXgrKykgeworCQlpZiAobHNtX3Nlc3Npb25zW2luZGV4XSAhPSBOVUxMKSB7CisJCQlsc21fYWN0aXZlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbHNtX2FjdGl2ZSA9IGZhbHNlOworCQl9CisJfQorCXJldHVybiBsc21fYWN0aXZlOworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfZ2V0X3Nmcl9kdW1wKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCit7CisJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgZHVtcF9zZWc7CisJaW50IHJjOworCXU4ICpzZnJfZHVtcDsKKworCXNmcl9kdW1wID0ga3phbGxvYyhjb3JlLT5zZnJfYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghc2ZyX2R1bXApCisJCWdvdG8gZG9uZTsKKworCWR1bXBfc2VnLnR5cGUgPSBDUEVfU1ZDX0RBVEFfTUVNOworCWR1bXBfc2VnLmNwZV9hZGRyID0gY29yZS0+c2ZyX2J1Zl9hZGRyOworCWR1bXBfc2VnLnNpemUgPSBjb3JlLT5zZnJfYnVmX3NpemU7CisJZHVtcF9zZWcuZGF0YSA9IHNmcl9kdW1wOworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IHJlYWRpbmcgU0ZSIGZyb20gQ1BFLCBzaXplID0gJXp1XG4iLAorCQlfX2Z1bmNfXywgY29yZS0+c2ZyX2J1Zl9zaXplKTsKKworCXJjID0gY3BlX3N2Y19yYW1kdW1wKGNvcmUtPmNwZV9oYW5kbGUsICZkdW1wX3NlZyk7CisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byByZWFkIGNwZSBzZnJfZHVtcCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZyZWVfc2ZyX2R1bXA7CisJfQorCisJZGV2X2luZm8oY29yZS0+ZGV2LAorCQkgIiVzOiBjcGVfc2ZyID0gJXNcbiIsIF9fZnVuY19fLCBzZnJfZHVtcCk7CisKK2ZyZWVfc2ZyX2R1bXA6CisJa2ZyZWUoc2ZyX2R1bXApOworZG9uZToKKwkvKiBFdmVuIGlmIFNGUiBkdW1wIGZhaWxlZCwgZG8gbm90IHJldHVybiBlcnJvciAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfY29sbGVjdF9yYW1kdW1wKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCit7CisJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgZHVtcF9zZWc7CisJaW50IHJjOworCisJaWYgKCFjb3JlLT5jcGVfcmFtZHVtcF9kZXYgfHwgIWNvcmUtPmNwZV9kdW1wX3ZfYWRkciB8fAorCSAgICBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZSA9PSAwKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBSYW1kdW1wIGRldmljZXMgbm90IHNldCB1cCwgc2l6ZSA9ICV6dVxuIiwKKwkJCV9fZnVuY19fLCBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWR1bXBfc2VnLnR5cGUgPSBDUEVfU1ZDX0RBVEFfTUVNOworCWR1bXBfc2VnLmNwZV9hZGRyID0gY29yZS0+aHdfaW5mby5kcmFtX29mZnNldDsKKwlkdW1wX3NlZy5zaXplID0gY29yZS0+aHdfaW5mby5kcmFtX3NpemU7CisJZHVtcF9zZWcuZGF0YSA9IGNvcmUtPmNwZV9kdW1wX3ZfYWRkcjsKKworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IFJlYWRpbmcgcmFtZHVtcCBmcm9tIENQRVxuIiwKKwkJX19mdW5jX18pOworCisJcmMgPSBjcGVfc3ZjX3JhbWR1bXAoY29yZS0+Y3BlX2hhbmRsZSwgJmR1bXBfc2VnKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIHJlYWQgQ1BFIHJhbWR1bXAsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IGNvbXBsZXRlZCByZWFkaW5nIHJhbWR1bXAgZnJvbSBDUEVcbiIsCisJCV9fZnVuY19fKTsKKworCWNvcmUtPmNwZV9yYW1kdW1wX3NlZy5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGNvcmUtPmNwZV9kdW1wX2FkZHI7CisJY29yZS0+Y3BlX3JhbWR1bXBfc2VnLnNpemUgPSBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZTsKKwljb3JlLT5jcGVfcmFtZHVtcF9zZWcudl9hZGRyZXNzID0gY29yZS0+Y3BlX2R1bXBfdl9hZGRyOworCisJcmMgPSBkb19yYW1kdW1wKGNvcmUtPmNwZV9yYW1kdW1wX2RldiwKKwkJCSZjb3JlLT5jcGVfcmFtZHVtcF9zZWcsIDEpOworCWlmIChyYykKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGZhaWwgdG8gZHVtcCBjcGUgcmFtIHRvIGRldmljZSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworLyogd2NkX2NwZV9pc192YWxpZF9lbGZfaGRyOiBjaGVjayBpZiB0aGUgRUxGIGhlYWRlciBpcyB2YWxpZAorICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKKyAqIEBmd19zaXplOiBzaXplIG9mIGZpcm13YXJlIGZyb20gcmVxdWVzdF9maXJtd2FyZQorICogQGVoZHI6IHRoZSBlbGYgaGVhZGVyIHRvIGJlIGNoZWNrZWQgZm9yCisgKiByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hlY2tzIHBhc3MsIHRydWUgaWYgYW55IGVsZiBjaGVjayBmYWlscworICovCitzdGF0aWMgYm9vbCB3Y2RfY3BlX2lzX3ZhbGlkX2VsZl9oZHIoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgc2l6ZV90IGZ3X3NpemUsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICplaGRyKQoreworCWlmIChmd19zaXplIDwgc2l6ZW9mKCplaGRyKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOkZpcm13YXJlIHRvbyBzbWFsbFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVsZl9jaGVja19mYWlsOworCX0KKworCWlmIChtZW1jbXAoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IE5vdCBhbiBFTEYgZmlsZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVsZl9jaGVja19mYWlsOworCX0KKworCWlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IE5vdCBhIGV4ZWN1dGFibGUgaW1hZ2VcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlbGZfY2hlY2tfZmFpbDsKKwl9CisKKwlpZiAoZWhkci0+ZV9waG51bSA9PSAwKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IG5vIHNlZ21lbnRzIHRvIGxvYWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlbGZfY2hlY2tfZmFpbDsKKwl9CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBlbGYzMl9waGRyKSAqIGVoZHItPmVfcGhudW0gKworCSAgICBzaXplb2Yoc3RydWN0IGVsZjMyX2hkcikgPiBmd19zaXplKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IFRvbyBzbWFsbCBNRFQgZmlsZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVsZl9jaGVja19mYWlsOworCX0KKworCXJldHVybiB0cnVlOworCitlbGZfY2hlY2tfZmFpbDoKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2xvYWRfZWFjaF9zZWdtZW50OiBkb3dubG9hZCBzZWdtZW50IHRvIENQRQorICogQGNvcmU6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkX2NwZV9jb3JlCisgKiBAZmlsZV9pZHg6IGluZGV4IG9mIHNwbGl0IGZpcm13YXJlIGltYWdlIGZpbGUgbmFtZQorICogQHBoZHI6IHByb2dyYW0gaGVhZGVyIGZyb20gbWV0YWRhdGEKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2xvYWRfZWFjaF9zZWdtZW50KHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCQkgIGludCBmaWxlX2lkeCwgY29uc3Qgc3RydWN0IGVsZjMyX3BoZHIgKnBoZHIpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpzcGxpdF9mdzsKKwljaGFyIHNwbGl0X2ZuYW1lWzMyXTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqc2VnbWVudDsKKworCWlmICghY29yZSB8fCAhcGhkcikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBmaWxlIHNpemUgY2FuIGJlIDAgZm9yIGJzcyBzZWdtZW50cyAqLworCWlmIChwaGRyLT5wX2ZpbGVzeiA9PSAwIHx8IHBoZHItPnBfbWVtc3ogPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzZWdtZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlZ21lbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJc25wcmludGYoc3BsaXRfZm5hbWUsIHNpemVvZihzcGxpdF9mbmFtZSksICIlcy5iJTAyZCIsCisJCSBjb3JlLT5mbmFtZSwgZmlsZV9pZHgpOworCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmc3BsaXRfZncsIHNwbGl0X2ZuYW1lLCBjb3JlLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICJmaXJtd2FyZSAlcyBub3QgZm91bmRcbiIsCisJCQlzcGxpdF9mbmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZndfcmVxX2ZhaWw7CisJfQorCisJaWYgKHBoZHItPnBfZmxhZ3MgJiBFTEZfRkxBR19FWEVDVVRFKQorCQlzZWdtZW50LT50eXBlID0gQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU07CisJZWxzZSBpZiAocGhkci0+cF9mbGFncyAmIEVMRl9GTEFHX1JXKQorCQlzZWdtZW50LT50eXBlID0gQ1BFX1NWQ19EQVRBX01FTTsKKwllbHNlIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlcyBpbnZhbGlkIGZsYWdzIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGhkci0+cF9mbGFncyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZWdtZW50LT5jcGVfYWRkciA9IHBoZHItPnBfcGFkZHI7CisJc2VnbWVudC0+c2l6ZSA9IHBoZHItPnBfZmlsZXN6OworCXNlZ21lbnQtPmRhdGEgPSAodTggKikgc3BsaXRfZnctPmRhdGE7CisKKwlkZXZfZGJnKGNvcmUtPmRldiwKKwkJIiVzOiBjcGUgc2VnbWVudCB0eXBlICVzIHJlYWQgZnJvbSBmaXJtd2FyZVxuIiwgX19mdW5jX18sCisJCShzZWdtZW50LT50eXBlID09IENQRV9TVkNfSU5TVFJVQ1RJT05fTUVNKSA/CisJCQkiSU5TVFJVQ1RJT04iIDogIkRBVEEiKTsKKworCXJldCA9IGNwZV9zdmNfZG93bmxvYWRfc2VnbWVudChjb3JlLT5jcGVfaGFuZGxlLCBzZWdtZW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZG93bmxvYWQgJXMsIGVycm9yID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgc3BsaXRfZm5hbWUsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmVsZWFzZV9maXJtd2FyZShzcGxpdF9mdyk7CisKK2Z3X3JlcV9mYWlsOgorCWtmcmVlKHNlZ21lbnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrczogZW5hYmxlIHRoZSBjbG9ja3MgZm9yIENQRQorICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKKyAqIEBlbmFibGU6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNwZSBjbG9ja3MKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0LCByZXQxOworCisJaWYgKCFjb3JlIHx8ICFjb3JlLT5jcGVfY2RjX2NiIHx8CisJICAgICFjb3JlLT5jcGVfY2RjX2NiLT5jcGVfY2xrX2VuKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaGFuZGxlXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBjb3JlLT5jcGVfY2RjX2NiLT5jZGNfY2xrX2VuKGNvcmUtPmNvZGVjLCBlbmFibGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogRmFpbGVkIHRvIGVuYWJsZSBSQ09cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFlbmFibGUgJiYgY29yZS0+Y3BlX2Nsa19yZWYgPiAwKQorCQljb3JlLT5jcGVfY2xrX3JlZi0tOworCisJLyoKKwkgKiBDUEUgY2xrIHdpbGwgYmUgZW5hYmxlZCBhdCB0aGUgZmlyc3QgdGltZQorCSAqIGFuZCBiZSBkaXNhYmxlZCBhdCB0aGUgbGFzdCB0aW1lLgorCSAqLworCWlmIChjb3JlLT5jcGVfY2xrX3JlZiA9PSAwKSB7CisJCXJldCA9IGNvcmUtPmNwZV9jZGNfY2ItPmNwZV9jbGtfZW4oY29yZS0+Y29kZWMsIGVuYWJsZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogY3BlX2Nsa19lbigpIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGNwZV9jbGtfZmFpbDsKKwkJfQorCX0KKworCWlmIChlbmFibGUpCisJCWNvcmUtPmNwZV9jbGtfcmVmKys7CisKKwlyZXR1cm4gMDsKKworY3BlX2Nsa19mYWlsOgorCS8qIFJlbGVhc2UgdGhlIGNvZGVjIGNsayBpZiBDUEUgY2xrIGVuYWJsZSBmYWlsZWQgKi8KKwlpZiAoZW5hYmxlKSB7CisJCXJldDEgPSBjb3JlLT5jcGVfY2RjX2NiLT5jZGNfY2xrX2VuKGNvcmUtPmNvZGVjLCAhZW5hYmxlKTsKKwkJaWYgKHJldDEpCisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IEZhaWwgdG8gcmVsZWFzZSBjb2RlYyBjbGssIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQxKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9idXNfdm90ZV9tYXhfYnc6IEZ1bmN0aW9uIHRvIHZvdGUgZm9yIG1heCBiYW5kd2lkdGggb24gY29kZWMgYnVzCisgKiBAY29yZTogaGFuZGxlIHRvIGNvcmUgZm9yIGNwZQorICogQHZvdGU6IGZsYWcgdG8gaW5kaWNhdGUgZW5hYmxlL2Rpc2FibGUgb2Ygdm90ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0cnkgdG8gdXNlIHRoZSBjb2RlYyBwcm92aWRlZCBjYWxsYmFjayB0bworICogdm90ZS91bnZvdGUgZm9yIHRoZSBtYXggYmFuZHdpZHRoIG9mIHRoZSBidXMgdGhhdCBpcyB1c2VkIGJ5CisgKiB0aGUgY29kZWMgZm9yIHJlZ2lzdGVyIHJlYWRzL3dyaXRlcy4KKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2J1c192b3RlX21heF9idyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQlib29sIHZvdGUpCit7CisJaWYgKCFjb3JlIHx8ICFjb3JlLT5jcGVfY2RjX2NiKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvICVzXG4iLAorCQkJX19mdW5jX18sCisJCQkoIWNvcmUpID8gImNvcmUiIDogImNvZGVjIGNhbGxiYWNrcyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29yZS0+Y3BlX2NkY19jYi0+YnVzX3ZvdGVfYncpIHsKKwkJZGV2X2RiZyhjb3JlLT5kZXYsICIlczogJXMgY2RjIGJ1cyBtYXggYmFuZHdpZHRoXG4iLAorCQkJIF9fZnVuY19fLCB2b3RlID8gIlZvdGUiIDogIlVudm90ZSIpOworCQljb3JlLT5jcGVfY2RjX2NiLT5idXNfdm90ZV9idyhjb3JlLT5jb2RlYywgdm90ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2xvYWRfZnc6IEZ1bmN0aW9uIHRvIGxvYWQgdGhlIGZ3IGltYWdlCisgKiBAY29yZTogY3BlIGNvcmUgcG9pbnRlcgorICogQGxvYWRfdHlwZTogaW5kaWNhdGVzIHdoZXRoZXIgdG8gbG9hZCB0byBkYXRhIHNlY3Rpb24KKyAqCSAgICAgICBvciB0aGUgaW5zdHJ1Y3Rpb24gc2VjdGlvbgorICoKKyAqIFBhcnNlIHRoZSBtZHQgZmlsZSB0byBsb29rIGZvciBwcm9ncmFtIGhlYWRlcnMsIGxvYWQgZWFjaAorICogc3BsaXQgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9ncmFtIGhlYWRlcnMuCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9sb2FkX2Z3KHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJdW5zaWduZWQgaW50IGxvYWRfdHlwZSkKK3sKKworCWludCByZXQsIHBoZHJfaWR4OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7CisJc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBOVUxMOworCWNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKmVoZHI7CisJY29uc3Qgc3RydWN0IGVsZjMyX3BoZHIgKnBoZHI7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCB1OCAqZWxmX3B0cjsKKwljaGFyIG1kdF9uYW1lWzY0XTsKKwlib29sIGltZ19kbG9hZF9mYWlsID0gZmFsc2U7CisJYm9vbCBsb2FkX3NlZ21lbnQ7CisKKwlpZiAoIWNvcmUgfHwgIWNvcmUtPmNwZV9oYW5kbGUpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgQ1BFIGNvcmUgJXBLXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGNvcmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29kZWMgPSBjb3JlLT5jb2RlYzsKKwl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CisJc25wcmludGYobWR0X25hbWUsIHNpemVvZihtZHRfbmFtZSksICIlcy5tZHQiLCBjb3JlLT5mbmFtZSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG1kdF9uYW1lLCBjb3JlLT5kZXYpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgImZpcm13YXJlICVzIG5vdCBmb3VuZFxuIiwgbWR0X25hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWVoZHIgPSAoc3RydWN0IGVsZjMyX2hkciAqKSBmdy0+ZGF0YTsKKwlpZiAoIXdjZF9jcGVfaXNfdmFsaWRfZWxmX2hkcihjb3JlLCBmdy0+c2l6ZSwgZWhkcikpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogZncgbWR0ICVzIGlzIGludmFsaWRcbiIsCisJCQlfX2Z1bmNfXywgbWR0X25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJZWxmX3B0ciA9IGZ3LT5kYXRhICsgc2l6ZW9mKCplaGRyKTsKKworCWlmIChsb2FkX3R5cGUgPT0gRUxGX0ZMQUdfRVhFQ1VURSkgeworCQkvKiBSZXNldCBDUEUgZmlyc3QgKi8KKwkJcmV0ID0gY3BlX3N2Y19yZXNldChjb3JlLT5jcGVfaGFuZGxlKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byByZXNldCBDUEUgd2l0aCBlcnJvciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IHN0YXJ0IGltYWdlIGRsb2FkLCBuYW1lID0gJXMsIGxvYWRfdHlwZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBjb3JlLT5mbmFtZSwgbG9hZF90eXBlKTsKKworCXdjZF9jcGVfYnVzX3ZvdGVfbWF4X2J3KGNvcmUsIHRydWUpOworCisJLyogcGFyc2UgZXZlcnkgcHJvZ3JhbSBoZWFkZXIgYW5kIHJlcXVlc3QgY29ycmVzcG9uZGluZyBmaXJtd2FyZSAqLworCWZvciAocGhkcl9pZHggPSAwOyBwaGRyX2lkeCA8IGVoZHItPmVfcGhudW07IHBoZHJfaWR4KyspIHsKKwkJcGhkciA9IChzdHJ1Y3QgZWxmMzJfcGhkciAqKWVsZl9wdHI7CisJCWxvYWRfc2VnbWVudCA9IGZhbHNlOworCisJCWRldl9kYmcoY29yZS0+ZGV2LAorCQkJImluZGV4ID0gJWQsIHZhZGRyID0gMHgleCwgcGFkZHIgPSAweCV4LCBmaWxlc3ogPSAweCV4LCBtZW1zeiA9IDB4JXgsIGZsYWdzID0gMHgleFxuIgorCQkJLCBwaGRyX2lkeCwgcGhkci0+cF92YWRkciwgcGhkci0+cF9wYWRkciwKKwkJCXBoZHItPnBfZmlsZXN6LCBwaGRyLT5wX21lbXN6LCBwaGRyLT5wX2ZsYWdzKTsKKworCQlzd2l0Y2ggKGxvYWRfdHlwZSkgeworCQljYXNlIEVMRl9GTEFHX0VYRUNVVEU6CisJCQlpZiAocGhkci0+cF9mbGFncyAmIGxvYWRfdHlwZSkKKwkJCQlsb2FkX3NlZ21lbnQgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgRUxGX0ZMQUdfUlc6CisJCQlpZiAoIShwaGRyLT5wX2ZsYWdzICYgRUxGX0ZMQUdfRVhFQ1VURSkgJiYKKwkJCSAgICAocGhkci0+cF9mbGFncyAmIGxvYWRfdHlwZSkpCisJCQkJbG9hZF9zZWdtZW50ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogSW52YWxpZCBsb2FkX3R5cGUgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgbG9hZF90eXBlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHJlbF9idXNfdm90ZTsKKwkJfQorCisJCWlmIChsb2FkX3NlZ21lbnQpIHsKKwkJCXJldCA9IHdjZF9jcGVfbG9hZF9lYWNoX3NlZ21lbnQoY29yZSwKKwkJCQkJCXBoZHJfaWR4LCBwaGRyKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCwgYWJvcnRpbmcgaW1nIGRsb2FkXG4iLAorCQkJCQlwaGRyX2lkeCk7CisJCQkJaW1nX2Rsb2FkX2ZhaWwgPSB0cnVlOworCQkJCWdvdG8gcmVsX2J1c192b3RlOworCQkJfQorCQl9IGVsc2UgeworCQkJZGV2X2RiZyhjb3JlLT5kZXYsCisJCQkJIiVzOiBza2lwcGVkIHNlZ21lbnQgd2l0aCBpbmRleCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGhkcl9pZHgpOworCQl9CisKKwkJZWxmX3B0ciA9IGVsZl9wdHIgKyBzaXplb2YoKnBoZHIpOworCX0KKwlpZiAobG9hZF90eXBlID09IEVMRl9GTEFHX0VYRUNVVEUpCisJCWNvcmUtPnNzcl90eXBlID0gV0NEX0NQRV9JTUVNX0RPV05MT0FERUQ7CisKK3JlbF9idXNfdm90ZToKKwl3Y2RfY3BlX2J1c192b3RlX21heF9idyhjb3JlLCBmYWxzZSk7CisKK2RvbmU6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfY2hhbmdlX29ubGluZV9zdGF0ZSAtIG1hcmsgY3BlIG9ubGluZS9vZmZsaW5lIHN0YXRlCisgKiBAY29yZTogY29yZSBzZXNzaW9uIHRvIG1hcmsKKyAqIEBvbmxpbmU6IHdoZXRoZXIgb25saW5lIG9mIG9mZmxpbmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfY2hhbmdlX29ubGluZV9zdGF0ZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQkJaW50IG9ubGluZSkKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9zc3JfZW50cnkgKnNzcl9lbnRyeSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlpZiAoIWNvcmUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3JlIGhhbmRsZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXNzcl9lbnRyeSA9ICZjb3JlLT5zc3JfZW50cnk7CisJV0NEX0NQRV9HUkFCX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisJc3NyX2VudHJ5LT5vZmZsaW5lID0gIW9ubGluZTsKKworCS8qIE1ha2Ugc3VyZSB3cml0ZSB0byBvZmZsaW5lIHN0YXRlIGlzIGNvbXBsZXRlZC4gKi8KKwl3bWIoKTsKKwlyZXQgPSB4Y2hnKCZzc3JfZW50cnktPm9mZmxpbmVfY2hhbmdlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNzcl9lbnRyeS0+b2ZmbGluZV9wb2xsX3dhaXQpOworCVdDRF9DUEVfUkVMX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisJcHJfZGVidWcoIiVzOiBjaGFuZ2Ugc3RhdGUgMHgleCBvZmZsaW5lX2NoYW5nZSAweCV4XG4iCisJCSAiIGNvcmUtPm9mZmxpbmUgMHgleCwgcmV0ID0gJWxkXG4iLAorCQkgX19mdW5jX18sIG9ubGluZSwKKwkJIHNzcl9lbnRyeS0+b2ZmbGluZV9jaGFuZ2UsCisJCSBjb3JlLT5zc3JfZW50cnkub2ZmbGluZSwgcmV0KTsKK30KKworLyoKKyAqIHdjZF9jcGVfbG9hZF9md19pbWFnZTogd29yayBmdW5jdGlvbiB0byBsb2FkIHRoZSBmdyBpbWFnZQorICogQHdvcms6IHdvcmsgdGhhdCBpcyBzY2hlZHVsZWQgdG8gcGVyZm9ybSB0aGUgaW1hZ2UgbG9hZGluZworICoKKyAqIFBhcnNlIHRoZSBtZHQgZmlsZSB0byBsb29rIGZvciBwcm9ncmFtIGhlYWRlcnMsIGxvYWQgZWFjaAorICogc3BsaXQgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9ncmFtIGhlYWRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfbG9hZF9md19pbWFnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZTsKKwlpbnQgcmV0ID0gMDsKKworCWNvcmUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdjZF9jcGVfY29yZSwgbG9hZF9md193b3JrKTsKKwlyZXQgPSB3Y2RfY3BlX2xvYWRfZncoY29yZSwgRUxGX0ZMQUdfRVhFQ1VURSk7CisJaWYgKCFyZXQpCisJCXdjZF9jcGVfY2hhbmdlX29ubGluZV9zdGF0ZShjb3JlLCAxKTsKKwllbHNlCisJCXByX2VycigiJXM6IGZhaWxlZCB0byBsb2FkIGluc3RydWN0aW9uIHNlY3Rpb24sIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2dldF9jb3JlX2hhbmRsZTogZ2V0IHRoZSBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCisgKiBAY29kZWM6IGNvZGVjIGZyb20gd2hpY2ggdGhpcyBoYW5kbGUgaXMgdG8gYmUgb2J0YWluZWQKKyAqIENvZGVjIGRyaXZlciBzaG91bGQgcHJvdmlkZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIG9idGFpbgorICogaGFuZGxlIHRvIHdjZF9jcGVfY29yZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2Ygd2NkX2NwZV9jb3JlCisgKi8KK3ZvaWQgKndjZF9jcGVfZ2V0X2NvcmVfaGFuZGxlKAorCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gTlVMTDsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb2RlYyBoYW5kbGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIXdjZF9nZXRfY3BlX2NvcmUpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBjb2RlYyBjYWxsYmFjayBub3QgYXZhaWxhYmxlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJY29yZSA9IHdjZF9nZXRfY3BlX2NvcmUoY29kZWMpOworCisJaWYgKCFjb3JlKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiJXM6IGhhbmRsZSB0byBjb3JlIG5vdCBhdmFpbGFibGVcbiIsCisJCQlfX2Z1bmNfXyk7Citkb25lOgorCXJldHVybiBjb3JlOworfQorCisvKgorICogc3Zhc3NfZW5naW5lX2lycTogdGhyZWFkZWQgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHN2YXNzIGVuZ2luZSBpcnEKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkYXRhOiBkYXRhIHBvaW50ZXIgcGFzc2VkIGR1cmluZyBpcnEgcmVnaXN0cmF0aW9uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzdmFzc19lbmdpbmVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGRhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNvcmUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkYXRhIGZvciBpbnRlcnJ1cHQgaGFuZGxlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNwZV9zdmNfcHJvY2Vzc19pcnEoY29yZS0+Y3BlX2hhbmRsZSwgQ1BFX0lSUV9PVVRCT1hfSVJRKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBFcnJvciBwcm9jZXNzaW5nIGlycSBmcm9tIGNwZV9TZXJ2aWNlc1xuIiwKKwkJCV9fZnVuY19fKTsKK2RvbmU6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogd2NkX2NwZV9zdGF0ZV9yZWFkIC0gdXBkYXRlIHJlYWQgc3RhdHVzIGluIHByb2NmcworICogQGVudHJ5OiBzbmRfaW5mb19lbnRyeQorICogQGJ1ZjogYnVmZmVyIHdoZXJlIHRoZSByZWFkIHN0YXR1cyBpcyB1cGRhdGVkLgorICoKKyAqLworc3RhdGljIHNzaXplX3Qgd2NkX2NwZV9zdGF0ZV9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkgICAgICAgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlpbnQgbGVuID0gMDsKKwljaGFyIGJ1ZmZlcltXQ0RfQ1BFX1NUQVRFX01BWF9MRU5dOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBOVUxMOworCXN0cnVjdCB3Y2RfY3BlX3Nzcl9lbnRyeSAqc3NyX2VudHJ5ID0gTlVMTDsKKworCWNvcmUgPSAoc3RydWN0IHdjZF9jcGVfY29yZSAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWlmICghY29yZSkgeworCQlwcl9lcnIoIiVzOiBDUEUgY29yZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzc3JfZW50cnkgPSAmY29yZS0+c3NyX2VudHJ5OworCisJLyogTWFrZSBzdXJlIHJlYWQgZnJvbSBzc3JfZW50cnkgaXMgY29tcGxldGVkLiAqLworCXJtYigpOworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IE9mZmxpbmUgMHgleFxuIiwgX19mdW5jX18sCisJCSBzc3JfZW50cnktPm9mZmxpbmUpOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzXG4iLAorCQkgICAgICAgc3NyX2VudHJ5LT5vZmZsaW5lID8gIk9GRkxJTkUiIDogIk9OTElORSIpOworCVdDRF9DUEVfUkVMX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgJnBvcywgYnVmZmVyLCBsZW4pOworfQorCisvKgorICogd2NkX2NwZV9zdGF0ZV9wb2xsIC0gcG9sbHMgZm9yIGNoYW5nZSBzdGF0ZQorICogQGVudHJ5OiBzbmRfaW5mb19lbnRyeQorICogQHdhaXQ6IHdhaXQgZm9yIGR1cmF0aW9uIGZvciBwb2xsIHdhaXQKKyAqCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2NkX2NwZV9zdGF0ZV9wb2xsKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkJCXZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCXBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfc3NyX2VudHJ5ICpzc3JfZW50cnkgPSBOVUxMOworCWludCByZXQgPSAwOworCisJY29yZSA9IChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJaWYgKCFjb3JlKSB7CisJCXByX2VycigiJXM6IENQRSBjb3JlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3NyX2VudHJ5ID0gJmNvcmUtPnNzcl9lbnRyeTsKKworCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IENQRSBQb2xsIHdhaXRcbiIsCisJICAgICAgIF9fZnVuY19fKTsKKwlwb2xsX3dhaXQoZmlsZSwgJnNzcl9lbnRyeS0+b2ZmbGluZV9wb2xsX3dhaXQsIHdhaXQpOworCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IFdha2UtdXAgUG9sbCB3YWl0XG4iLAorCSAgICAgICBfX2Z1bmNfXyk7CisJV0NEX0NQRV9HUkFCX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisKKwlpZiAoeGNoZygmc3NyX2VudHJ5LT5vZmZsaW5lX2NoYW5nZSwgMCkpCisJCXJldCA9IFBPTExJTiB8IFBPTExQUkkgfCBQT0xMUkROT1JNOworCisJV0NEX0NQRV9SRUxfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKKworCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IHJldCAoJWQpIGZyb20gcG9sbF93YWl0XG4iLAorCQlfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9pc19vbmxpbmVfc3RhdGUgLSByZXR1cm4gdHJ1ZSBpZiBjYXJkIGlzIG9ubGluZSBzdGF0ZQorICogQGNvcmU6IGNvcmUgb2ZmbGluZSB0byBxdWVyeQorICovCitzdGF0aWMgYm9vbCB3Y2RfY3BlX2lzX29ubGluZV9zdGF0ZSh2b2lkICpjb3JlX2hhbmRsZSkKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisKKwlpZiAoY29yZV9oYW5kbGUpIHsKKwkJcmV0dXJuICFjb3JlLT5zc3JfZW50cnkub2ZmbGluZTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBDb3JlIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCS8qIHN0aWxsIHJldHVybiAxLSBvZmZsaW5lIGlmIGNvcmUgcHRyIG51bGwgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgd2NkX2NwZV9zdGF0ZV9wcm9jX29wcyA9IHsKKwkucmVhZCA9IHdjZF9jcGVfc3RhdGVfcmVhZCwKKwkucG9sbCA9IHdjZF9jcGVfc3RhdGVfcG9sbCwKK307CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9jaGVja19uZXdfaW1hZ2Uoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSkKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgdGVtcF9pbWdfbmFtZVtXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWF07CisKKwlpZiAoIXN0cmNtcChjb3JlLT5mbmFtZSwgY29yZS0+ZHluX2ZuYW1lKSAmJgorCSAgICBjb3JlLT5zc3JfdHlwZSAhPSBXQ0RfQ1BFX0lOSVRJQUxJWkVEKSB7CisJCWRldl9kYmcoY29yZS0+ZGV2LAorCQkJIiVzOiBGaXJtd2FyZSB1bmNoYW5nZWQsIGZuYW1lID0gJXMsIHNzcl90eXBlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY29yZS0+Zm5hbWUsIGNvcmUtPnNzcl90eXBlKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogRGlmZmVyZW50IGZpcm13YXJlIG5hbWUgcmVxdWVzdGVkLAorCSAqIFJlLWxvYWQgdGhlIGluc3RydWN0aW9uIHNlY3Rpb24KKwkgKi8KKwlzdHJsY3B5KHRlbXBfaW1nX25hbWUsIGNvcmUtPmZuYW1lLAorCQlXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCk7CisJc3RybGNweShjb3JlLT5mbmFtZSwgY29yZS0+ZHluX2ZuYW1lLAorCQlXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCk7CisKKwlyYyA9IHdjZF9jcGVfbG9hZF9mdyhjb3JlLCBFTEZfRkxBR19FWEVDVVRFKTsKKwlpZiAocmMpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBkbG9hZCBuZXcgaW1hZ2UgJXMsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIGNvcmUtPmZuYW1lLCByYyk7CisJCS8qIElmIG5ldyBpbWFnZSBkb3dubG9hZCBmYWlsZWQsIHJldmVydCBiYWNrIHRvIG9sZCBpbWFnZSAqLworCQlzdHJsY3B5KGNvcmUtPmZuYW1lLCB0ZW1wX2ltZ19uYW1lLAorCQkJV0NEX0NQRV9JTUFHRV9GTkFNRV9NQVgpOworCQlyYyA9IHdjZF9jcGVfbG9hZF9mdyhjb3JlLCBFTEZfRkxBR19FWEVDVVRFKTsKKwkJaWYgKHJjKQorCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gcmUtZGxvYWQgaW1hZ2UgJXMsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBjb3JlLT5mbmFtZSwgcmMpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKGNvcmUtPmRldiwgIiVzOiBmdyBjaGFuZ2VkIHRvICVzXG4iLAorCQkJIF9fZnVuY19fLCBjb3JlLT5mbmFtZSk7CisJfQorZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9lbmFibGUoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwkJYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIFJlc2V0IENQRSBmaXJzdCAqLworCQlyZXQgPSBjcGVfc3ZjX3Jlc2V0KGNvcmUtPmNwZV9oYW5kbGUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogQ1BFIFJlc2V0IGZhaWxlZCwgZXJyb3IgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IHdjZF9jcGVfc2V0dXBfaXJxcyhjb3JlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBDUEUgSVJRcyBzZXR1cCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmV0ID0gd2NkX2NwZV9jaGVja19uZXdfaW1hZ2UoY29yZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxfYm9vdDsKKworCQkvKiBEbG9hZCBkYXRhIHNlY3Rpb24gKi8KKwkJcmV0ID0gd2NkX2NwZV9sb2FkX2Z3KGNvcmUsIEVMRl9GTEFHX1JXKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gZGxvYWQgZGF0YSBzZWN0aW9uLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZmFpbF9ib290OworCQl9CisKKwkJcmV0ID0gd2NkX2NwZV9lbmFibGVfY3BlX2Nsa3MoY29yZSwgdHJ1ZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBDUEUgY2xrIGVuYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBmYWlsX2Jvb3Q7CisJCX0KKworCQlyZXQgPSBjcGVfc3ZjX2Jvb3QoY29yZS0+Y3BlX2hhbmRsZSwKKwkJCQkgICBjb3JlLT5jcGVfZGVidWdfbW9kZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gYm9vdCBDUEVcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBmYWlsX2Jvb3Q7CisJCX0KKworCQkvKiB3YWl0IGZvciBDUEUgdG8gYmUgb25saW5lICovCisJCWRldl9kYmcoY29yZS0+ZGV2LAorCQkJIiVzOiB3YWl0aW5nIGZvciBDUEUgYm9vdHVwXG4iLAorCQkJX19mdW5jX18pOworCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvcmUtPm9ubGluZV9jb21wbCk7CisKKwkJZGV2X2RiZyhjb3JlLT5kZXYsCisJCQkiJXM6IENQRSBib290dXAgZG9uZVxuIiwKKwkJCV9fZnVuY19fKTsKKworCQljb3JlLT5zc3JfdHlwZSA9IFdDRF9DUEVfRU5BQkxFRDsKKwl9IGVsc2UgeworCQlpZiAoY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9CVVNfRE9XTl9FVkVOVCB8fAorCQkgICAgY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9TU1JfRVZFTlQpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGRpc2FibGUgdm90ZSBpcyB3aGVuCisJCQkgKiBTU1IgaXMgaW4gcHJvZ3Jlc3MsIGRvIG5vdCBkaXNhYmxlIENQRSBoZXJlLAorCQkJICogaW5zdGVhZCBTU1IgaGFuZGxlciB3aWxsIGNvbnRyb2wgQ1BFLgorCQkJICovCisJCQl3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCBmYWxzZSk7CisJCQkvKgorCQkJICogRHVyaW5nIEJVU19ET1dOIGV2ZW50LCBwb3NzaWJseSB0aGUKKwkJCSAqIGlycSBkcml2ZXIgaXMgdW5kZXIgY2xlYW51cCwgZG8gbm90IHJlcXVlc3QKKwkJCSAqIGNsZWFudXAgb2YgaXJxcyBoZXJlLCByYXRoZXIgY2xlYW51cCBpcnFzCisJCQkgKiBvbmNlIEJVU19VUCBldmVudCBpcyByZWNlaXZlZC4KKwkJCSAqLworCQkJaWYgKGNvcmUtPnNzcl90eXBlICE9IFdDRF9DUEVfQlVTX0RPV05fRVZFTlQpCisJCQkJd2NkX2NwZV9jbGVhbnVwX2lycXMoY29yZSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlyZXQgPSBjcGVfc3ZjX3NodXRkb3duKGNvcmUtPmNwZV9oYW5kbGUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogQ1BFIHNodXRkb3duIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQl3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCBmYWxzZSk7CisJCXdjZF9jcGVfY2xlYW51cF9pcnFzKGNvcmUpOworCQljb3JlLT5zc3JfdHlwZSA9IFdDRF9DUEVfSU1FTV9ET1dOTE9BREVEOworCX0KKworCXJldHVybiByZXQ7CisKK2ZhaWxfYm9vdDoKKwl3Y2RfY3BlX2NsZWFudXBfaXJxcyhjb3JlKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9ib290X3NzcjogTG9hZCB0aGUgaW1hZ2VzIHRvIENQRSBhZnRlciBzc3IgYW5kIGJvb3R1cCBjcGUKKyAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2Jvb3Rfc3NyKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCit7CisJaW50IHJjID0gMDsKKworCWlmICghY29yZSB8fCAhY29yZS0+Y3BlX2hhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisJLyogTG9hZCB0aGUgaW5zdHJ1Y3Rpb24gc2VjdGlvbiBhbmQgbWFyayBDUEUgYXMgb25saW5lICovCisJcmMgPSB3Y2RfY3BlX2xvYWRfZncoY29yZSwgRUxGX0ZMQUdfRVhFQ1VURSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gbG9hZCBpbnN0cnVjdGlvbiwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJd2NkX2NwZV9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvcmUsIDEpOworCX0KKworZmFpbDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2Nscl9yZWFkeV9zdGF0dXM6CisgKglDbGVhciB0aGUgdmFsdWUgZnJvbSB0aGUgcmVhZHkgc3RhdHVzIGZvciBDUEUKKyAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKKyAqIEB2YWx1ZTogZmxhZy9iaXRtYXNrIHRoYXQgaXMgdG8gYmUgY2xlYXJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdpdGggc3NyX2xvY2sgYWNxdWlyZWQKKyAqLworc3RhdGljIHZvaWQgd2NkX2NwZV9jbHJfcmVhZHlfc3RhdHVzKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCQkgICAgICAgdTggdmFsdWUpCit7CisJV0NEX0NQRV9HUkFCX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7CisJY29yZS0+cmVhZHlfc3RhdHVzICY9IH4odmFsdWUpOworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IHJlYWR5X3N0YXR1cyA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBjb3JlLT5yZWFkeV9zdGF0dXMpOworCVdDRF9DUEVfUkVMX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7Cit9CisKKy8qCisgKiB3Y2RfY3BlX3NldF9hbmRfY29tcGxldGU6CisgKglTZXQgdGhlIHJlYWR5IHN0YXR1cyB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQKKyAqCWZsYWcgdGhlIGNvbXBsZXRpb24gb2JqZWN0IGlmIHJlYWR5IHN0YXR1cyBtb3ZlcworICoJdG8gcmVhZHkgdG8gZG93bmxvYWQKKyAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKKyAqIEB2YWx1ZTogZmxhZy9iaXRtYXNrIHRoYXQgaXMgdG8gYmUgc2V0CisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfc2V0X2FuZF9jb21wbGV0ZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQkJCXU4IHZhbHVlKQoreworCVdDRF9DUEVfR1JBQl9MT0NLKCZjb3JlLT5zc3JfbG9jaywgIlNTUiIpOworCWNvcmUtPnJlYWR5X3N0YXR1cyB8PSB2YWx1ZTsKKwlpZiAoKGNvcmUtPnJlYWR5X3N0YXR1cyAmIFdDRF9DUEVfUkVBRFlfVE9fRExPQUQpID09CisJICAgIFdDRF9DUEVfUkVBRFlfVE9fRExPQUQpIHsKKwkJZGV2X2RiZyhjb3JlLT5kZXYsCisJCQkiJXM6IG1hcmtpbmcgcmVhZHksIHN0YXR1cyA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY29yZS0+cmVhZHlfc3RhdHVzKTsKKwkJY29tcGxldGUoJmNvcmUtPnJlYWR5X2NvbXBsKTsKKwl9CisJV0NEX0NQRV9SRUxfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKK30KKworCisvKgorICogd2NkX2NwZV9zc3Jfd29yazogd29yayBmdW5jdGlvbiB0byBoYW5kbGUgQ1BFIFNTUgorICogQHdvcms6IHdvcmsgdGhhdCBpcyBzY2hlZHVsZWQgdG8gcGVyZm9ybSBDUEUgc2h1dGRvd24KKyAqCWFuZCByZXN0YXJ0CisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfc3NyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCisJaW50IHJjID0gMDsKKwl1MzIgaXJxID0gMDsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gTlVMTDsKKwl1OCBzdGF0dXMgPSAwOworCisJY29yZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2NkX2NwZV9jb3JlLCBzc3Jfd29yayk7CisJaWYgKCFjb3JlKSB7CisJCXByX2VycigiJXM6IENvcmUgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9idGFpbiBwbSByZXF1ZXN0IHVwIGluIGNhc2Ugb2Ygc3VzcGVuZCBtb2RlICovCisJcG1fcW9zX2FkZF9yZXF1ZXN0KCZjb3JlLT5wbV9xb3NfcmVxLAorCQkJICAgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCSAgIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKwlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmNvcmUtPnBtX3Fvc19yZXEsCisJCQltc21fY3B1aWRsZV9nZXRfZGVlcF9pZGxlX2xhdGVuY3koKSk7CisKKwlkZXZfZGJnKGNvcmUtPmRldiwKKwkJIiVzOiBDUEUgU1NSIHdpdGggZXZlbnQgJWRcbiIsCisJCV9fZnVuY19fLCBjb3JlLT5zc3JfdHlwZSk7CisKKwlpZiAoY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9TU1JfRVZFTlQpIHsKKwkJaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQorCQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKKwkJCQkJY29yZS0+Y29kZWMsCisJCQkJCUNQRV9FUlJfSVJRX1NUQVRVUywKKwkJCQkJJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBjb3JlLT5pcnFfaW5mby5jcGVfZmF0YWxfaXJxcykKKwkJCWlycSA9IENQRV9JUlFfV0RPR19CSVRFOworCX0gZWxzZSB7CisJCS8qIElmIGJ1cyBpcyBkb3duLCBjZGMgcmVnIGNhbm5vdCBiZSByZWFkICovCisJCWlycSA9IENQRV9JUlFfV0RPR19CSVRFOworCX0KKworCWlmIChjb3JlLT5jcGVfdXNlcnMgPiAwKSB7CisJCXJjID0gY3BlX3N2Y19wcm9jZXNzX2lycShjb3JlLT5jcGVfaGFuZGxlLCBpcnEpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCS8qCisJCQkgKiBFdmVuIGlmIHByb2Nlc3NfaXJxIGZhaWxzLAorCQkJICogd2FpdCBmb3IgY3BlIHRvIG1vdmUgdG8gb2ZmbGluZSBzdGF0ZQorCQkJICovCisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IGlycSBwcm9jZXNzaW5nIGZhaWxlZCwgZXJyb3IgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCisJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb3JlLT5vZmZsaW5lX2NvbXBsLAorCQkJCQkJIENQRV9PRkZMSU5FX1dBSVRfVElNRU9VVCk7CisJCWlmICghcmMpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogd2FpdCBmb3IgY3BlIG9mZmxpbmUgdGltZWQgb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCQlpZiAoY29yZS0+c3NyX3R5cGUgIT0gV0NEX0NQRV9CVVNfRE9XTl9FVkVOVCkgeworCQkJd2NkX2NwZV9nZXRfc2ZyX2R1bXAoY29yZSk7CisKKwkJCS8qCisJCQkgKiBSYW1kdW1wIGhhcyB0byBiZSBleHBsaWNpdGx5IGVuYWJsZWQKKwkJCSAqIHRocm91Z2ggZGVidWdmcyBhbmQgY2Fubm90IGJlIGNvbGxlY3RlZAorCQkJICogd2hlbiBidXMgaXMgZG93bi4KKwkJCSAqLworCQkJaWYgKHJhbWR1bXBfZW5hYmxlKQorCQkJCXdjZF9jcGVfY29sbGVjdF9yYW1kdW1wKGNvcmUpOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogbm8gY3BlIHVzZXJzLCBtYXJrIGFzIG9mZmxpbmVcbiIsIF9fZnVuY19fKTsKKwkJd2NkX2NwZV9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvcmUsIDApOworCQl3Y2RfY3BlX3NldF9hbmRfY29tcGxldGUoY29yZSwKKwkJCQkJIFdDRF9DUEVfQkxLX1JFQURZKTsKKwl9CisKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29yZS0+cmVhZHlfY29tcGwsCisJCQkJCSBDUEVfUkVBRFlfV0FJVF9USU1FT1VUKTsKKwlpZiAoIXJjKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiByZWFkeSB0byBvbmxpbmUgdGltZWQgb3V0LCBzdGF0dXMgPSAldVxuIiwKKwkJCV9fZnVuY19fLCBjb3JlLT5yZWFkeV9zdGF0dXMpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJcmMgPSB3Y2RfY3BlX2Jvb3Rfc3NyKGNvcmUpOworCisJLyogT25jZSBpbWFnZSBhcmUgZG93bmxvYWRlZCBtYWtlIHN1cmUgYWxsCisJICogZXJyb3IgaW50ZXJydXB0cyBhcmUgY2xlYXJlZAorCSAqLworCWlmIChDUEVfRVJSX0lSUV9DQihjb3JlKSkKKwkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbChjb3JlLT5jb2RlYywKKwkJCQkJQ1BFX0VSUl9JUlFfQ0xFQVIsIE5VTEwpOworCitlcnJfcmV0OgorCS8qIHJlbW92ZSBhZnRlciBkZWZhdWx0IHBtIHFvcyAqLworCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmY29yZS0+cG1fcW9zX3JlcSwKKwkJCSAgICAgIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKwlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJmNvcmUtPnBtX3Fvc19yZXEpOworfQorCisvKgorICogd2NkX2NwZV9zc3JfaGFuZGxlOiBoYW5kbGUgU1NSIGV2ZW50cyBoZXJlLgorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCisgKiBAZXZlbnQ6IGluZGljYXRlcyBBRFNQIG9yIENEU1AgU1NSLgorICovCitpbnQgd2NkX2NwZV9zc3JfZXZlbnQodm9pZCAqY29yZV9oYW5kbGUsCisJCSAgICAgIGVudW0gd2NkX2NwZV9zc3Jfc3RhdGVfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCisJaWYgKCFjb3JlKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvcmVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogSWYgQ1BFIGlzIG5vdCBldmVuIGVuYWJsZWQsIHRoZSBTU1IgZXZlbnQgZm9yCisJICogQ1BFIG5lZWRzIHRvIGJlIGlnbm9yZWQKKwkgKi8KKwlpZiAoY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9JTklUSUFMSVpFRCkgeworCQlkZXZfaW5mbyhjb3JlLT5kZXYsCisJCQkiJXM6IENQRSBpbml0aWFsaXplZCBidXQgbm90IGVuYWJsZWQsIHNraXAgQ1BFIHNzclxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IFNjaGVkdWxlIHNzciB3b3JrLCBldmVudCA9ICVkXG4iLAorCQlfX2Z1bmNfXywgY29yZS0+c3NyX3R5cGUpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgV0NEX0NQRV9CVVNfRE9XTl9FVkVOVDoKKwkJLyoKKwkJICogSWYgYnVzIGRvd24sIHRoZW4gQ1BFIGJsb2NrIGlzIGFsc28KKwkJICogdHJlYXRlZCB0byBiZSBkb3duCisJCSAqLworCQl3Y2RfY3BlX2Nscl9yZWFkeV9zdGF0dXMoY29yZSwgV0NEX0NQRV9SRUFEWV9UT19ETE9BRCk7CisJCWNvcmUtPnNzcl90eXBlID0gZXZlbnQ7CisJCXNjaGVkdWxlX3dvcmsoJmNvcmUtPnNzcl93b3JrKTsKKwkJYnJlYWs7CisKKwljYXNlIFdDRF9DUEVfU1NSX0VWRU5UOgorCQl3Y2RfY3BlX2Nscl9yZWFkeV9zdGF0dXMoY29yZSwgV0NEX0NQRV9CTEtfUkVBRFkpOworCQljb3JlLT5zc3JfdHlwZSA9IGV2ZW50OworCQlzY2hlZHVsZV93b3JrKCZjb3JlLT5zc3Jfd29yayk7CisJCWJyZWFrOworCisJY2FzZSBXQ0RfQ1BFX0JVU19VUF9FVkVOVDoKKwkJd2NkX2NwZV9jbGVhbnVwX2lycXMoY29yZSk7CisJCXdjZF9jcGVfc2V0X2FuZF9jb21wbGV0ZShjb3JlLCBXQ0RfQ1BFX0JVU19SRUFEWSk7CisJCS8qCisJCSAqIEluIGNhc2Ugb2YgYnVzIHVwIGV2ZW50IHNzcl90eXBlIHdpbGwgYmUgY2hhbmdlZAorCQkgKiB0byBXQ0RfQ1BFX0FDVElWRSBvbmNlIENQRSBpcyBvbmxpbmUKKwkJICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IHVuaGFuZGxlZCBTU1IgZXZlbnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod2NkX2NwZV9zc3JfZXZlbnQpOworCisvKgorICogc3Zhc3NfZXhjZXB0aW9uX2lycTogdGhyZWFkZWQgaXJxIGhhbmRsZXIgZm9yIHN2YSBlcnJvciBpbnRlcnJ1cHRzCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogZGF0YSBwb2ludGVyIHBhc3NlZCBkdXJpbmcgaXJxIHJlZ2lzdHJhdGlvbgorICoKKyAqIE9uY2UgYSBlcnJvciBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQsIGl0IGlzIG5vdCBjbGVhcmVkLCBzaW5jZQorICogY2xlYXJpbmcgdGhpcyBpbnRlcnJ1cHQgd2lsbCByYWlzZSBzcHVyaW91cyBpbnRlcnJ1cHRzIHVubGVzcworICogQ1BFIGlzIHJlc2V0LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3Zhc3NfZXhjZXB0aW9uX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBkYXRhOworCXU4IHN0YXR1cyA9IDA7CisKKwlpZiAoIWNvcmUgfHwgIUNQRV9FUlJfSVJRX0NCKGNvcmUpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsCisJCSAgICAgICBfX2Z1bmNfXywKKwkJICAgICAgICghY29yZSkgPyAiY29yZSIgOiAiY2RjIGNvbnRyb2wiKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woY29yZS0+Y29kZWMsCisJCQlDUEVfRVJSX0lSUV9TVEFUVVMsICZzdGF0dXMpOworCisJd2hpbGUgKHN0YXR1cyAhPSAwKSB7CisJCWlmIChzdGF0dXMgJiBjb3JlLT5pcnFfaW5mby5jcGVfZmF0YWxfaXJxcykgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBDUEUgU1NSIGV2ZW50LGVycl9zdGF0dXMgPSAweCUwMnhcbiIsCisJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQl3Y2RfY3BlX3Nzcl9ldmVudChjb3JlLCBXQ0RfQ1BFX1NTUl9FVkVOVCk7CisJCQkvKgorCQkJICogSWYgZmF0YWwgaW50ZXJydXB0IGlzIHJlY2VpdmVkLAorCQkJICogdHJpZ2dlciBTU1IgYW5kIHN0b3AgcHJvY2Vzc2luZworCQkJICogZnVydGhlciBpbnRlcnJ1cHRzCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIE1hc2sgdGhlIGludGVycnVwdCB0aGF0IHdhcyByYWlzZWQgdG8KKwkJICogYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cworCQkgKi8KKwkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbChjb3JlLT5jb2RlYywKKwkJCQkJQ1BFX0VSUl9JUlFfTUFTSywgJnN0YXR1cyk7CisKKwkJLyogQ2xlYXIgb25seSB0aGUgaW50ZXJydXB0IHRoYXQgd2FzIHJhaXNlZCAqLworCQljb3JlLT5jcGVfY2RjX2NiLT5jcGVfZXJyX2lycV9jb250cm9sKGNvcmUtPmNvZGVjLAorCQkJCQlDUEVfRVJSX0lSUV9DTEVBUiwgJnN0YXR1cyk7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBlcnJfaW50ZXJydXB0IHN0YXR1cyA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKworCQkvKiBSZWFkIHN0YXR1cyBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woY29yZS0+Y29kZWMsCisJCQkJCUNQRV9FUlJfSVJRX1NUQVRVUywgJnN0YXR1cyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogd2NkX2NwZV9jbWlfYWZlX2NiOiBjYWxsYmFjayBjYWxsZWQgb24gcmVzcG9uc2UgdG8gYWZlIGNvbW1hbmRzCisgKiBAcGFyYW06IHBhcmFtZXRlciBjb250YWluaW5nIHRoZSByZXNwb25zZSBjb2RlLCBldGMKKyAqCisgKiBQcm9jZXNzIHRoZSByZXF1ZXN0IHRvIHRoZSBjb21tYW5kIHNlbnQgdG8gQ1BFIGFuZCB3YWtldXAgdGhlCisgKiBjb21tYW5kIHNlbmQgd2FpdC4KKyAqLworc3RhdGljIHZvaWQgd2NkX2NwZV9jbWlfYWZlX2NiKGNvbnN0IHN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiAqcGFyYW0pCit7CisJc3RydWN0IGNtaV9oZHIgKmhkcjsKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICphZmVfcG9ydF9kOworCXU4IHBvcnRfaWQ7CisKKwlpZiAoIXBhcmFtKSB7CisJCXByX2VycigiJXM6IHBhcmFtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwYXJhbS0+ZXZlbnQgIT0gQ01JX0FQSV9NU0cpIHsKKwkJcHJfZXJyKCIlczogdW5oYW5kbGVkIGV2ZW50IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcGFyYW0tPmV2ZW50KTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCIlczogcGFyYW0tPnJlc3VsdCA9ICVkXG4iLAorCQkgX19mdW5jX18sIHBhcmFtLT5yZXN1bHQpOworCisJaGRyID0gKHN0cnVjdCBjbWlfaGRyICopIHBhcmFtLT5tZXNzYWdlOworCisJLyoKKwkgKiBmb3IgQUZFIGNtZCByZXNwb25zZSwgcG9ydCBpZCBpcworCSAqIHN0b3JlZCBhdCBzZXNzaW9uIGlkIGZpZWxkIG9mIGhlYWRlcgorCSAqLworCXBvcnRfaWQgPSBDTUlfSERSX0dFVF9TRVNTSU9OX0lEKGhkcik7CisJaWYgKHBvcnRfaWQgPiBXQ0RfQ1BFX0FGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0X2lkICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm47CisJfQorCisJYWZlX3BvcnRfZCA9ICYoYWZlX3BvcnRzW3BvcnRfaWRdKTsKKworCWlmIChoZHItPm9wY29kZSA9PSBDUEVfQ01JX0JBU0lDX1JTUF9PUENPREUpIHsKKworCQl1OCAqcGF5bG9hZCA9ICgodTggKilwYXJhbS0+bWVzc2FnZSkgKyAoc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSk7CisJCXU4IHJlc3VsdCA9IHBheWxvYWRbMF07CisKKwkJYWZlX3BvcnRfZC0+Y21kX3Jlc3VsdCA9IHJlc3VsdDsKKwkJY29tcGxldGUoJmFmZV9wb3J0X2QtPmFmZV9jbWRfY29tcGxldGUpOworCisJfSBlbHNlIGlmIChoZHItPm9wY29kZSA9PSBDUEVfQUZFX1BPUlRfQ01EUlNQX1NIQVJFRF9NRU1fQUxMT0MpIHsKKworCQlzdHJ1Y3QgY3BlX2NtZHJzcF9zaG1lbV9hbGxvYyAqY21kcnNwX3NobWVtX2FsbG9jID0KKwkJCShzdHJ1Y3QgY3BlX2NtZHJzcF9zaG1lbV9hbGxvYyAqKSBwYXJhbS0+bWVzc2FnZTsKKworCQlpZiAoY21kcnNwX3NobWVtX2FsbG9jLT5hZGRyID09IDApIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCBBRkUgc2hhcmVkIG1lbSBhbGxvY1xuIiwgX19mdW5jX18pOworCQkJYWZlX3BvcnRfZC0+Y21kX3Jlc3VsdCA9IENNSV9TSE1FTV9BTExPQ19GQUlMRUQ7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXMgQUZFIHNoYXJlZCBtZW0gYWRkciA9IDB4JXhcbiIsCisJCQkJIF9fZnVuY19fLCBjbWRyc3Bfc2htZW1fYWxsb2MtPmFkZHIpOworCQkJYWZlX3BvcnRfZC0+bWVtX2hhbmRsZSA9IGNtZHJzcF9zaG1lbV9hbGxvYy0+YWRkcjsKKwkJCWFmZV9wb3J0X2QtPmNtZF9yZXN1bHQgPSAwOworCQl9CisJCWNvbXBsZXRlKCZhZmVfcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlKTsKKwl9Cit9CisKKy8qCisgKiB3Y2RfY3BlX2luaXRpYWxpemVfYWZlX3BvcnRfZGF0YTogSW5pdGlhbGl6ZSBhbGwgQUZFIHBvcnRzCisgKgorICogSW5pdGlhbGl6ZSB0aGUgZGF0YSBmb3IgYWxsIHRoZSBhZmUgcG9ydHMuIEFzc2lnbiB0aGUKKyAqIGFmZSBwb3J0IHN0YXRlIHRvIElOSVQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfaW5pdGlhbGl6ZV9hZmVfcG9ydF9kYXRhKHZvaWQpCit7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gV0NEX0NQRV9BRkVfTUFYX1BPUlRTOyBpKyspIHsKKwkJYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbaV07CisJCWFmZV9wb3J0X2QtPnBvcnRfaWQgPSBpOworCQlpbml0X2NvbXBsZXRpb24oJmFmZV9wb3J0X2QtPmFmZV9jbWRfY29tcGxldGUpOworCQlhZmVfcG9ydF9kLT5wb3J0X3N0YXRlID0gQUZFX1BPUlRfU1RBVEVfSU5JVDsKKwkJbXV0ZXhfaW5pdCgmYWZlX3BvcnRfZC0+YWZlX2xvY2spOworCX0KK30KKworLyoKKyAqIHdjZF9jcGVfZGVpbml0aWFsaXplX2FmZV9wb3J0X2RhdGE6IERlLWluaXRpYWxpemUgYWxsIEFGRSBwb3J0cworICoKKyAqIERlLUluaXRpYWxpemUgdGhlIGRhdGEgZm9yIGFsbCB0aGUgYWZlIHBvcnRzLiBBc3NpZ24gdGhlCisgKiBhZmUgcG9ydCBzdGF0ZSB0byBERUlOSVQgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfZGVpbml0aWFsaXplX2FmZV9wb3J0X2RhdGEodm9pZCkKK3sKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICphZmVfcG9ydF9kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSBXQ0RfQ1BFX0FGRV9NQVhfUE9SVFM7IGkrKykgeworCQlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1tpXTsKKwkJYWZlX3BvcnRfZC0+cG9ydF9zdGF0ZSA9IEFGRV9QT1JUX1NUQVRFX0RFSU5JVDsKKwkJbXV0ZXhfZGVzdHJveSgmYWZlX3BvcnRfZC0+YWZlX2xvY2spOworCX0KK30KKworLyoKKyAqIHdjZF9jcGVfc3ZjX2V2ZW50X2NiOiBjYWxsYmFjayBmcm9tIGNwZSBzZXJ2aWNlcywgaW5kaWNhdGluZworICogQ1BFIGlzIG9ubGluZSBvciBvZmZsaW5lLgorICogQHBhcmFtOiBwYXJhbWV0ZXIgLyBwYXlsb2FkIGZvciBldmVudCB0byBiZSBub3RpZmllZAorICovCitzdGF0aWMgdm9pZCB3Y2RfY3BlX3N2Y19ldmVudF9jYihjb25zdCBzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gKnBhcmFtKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlOworCXN0cnVjdCBjcGVfc3ZjX2Jvb3RfZXZlbnQgKmJvb3RfZGF0YTsKKwlib29sIGFjdGl2ZV9zZXNzaW9uczsKKworCWlmICghcGFyYW0pIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBldmVudFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY29kZWMgPSBwYXJhbS0+cHJpdmF0ZV9kYXRhOworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gY29kZWNcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljb3JlID0gd2NkX2NwZV9nZXRfY29yZV9oYW5kbGUoY29kZWMpOworCWlmICghY29yZSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBjb3JlXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZGV2X2RiZyhjb3JlLT5kZXYsCisJCSIlczogZXZlbnQgPSAweCV4LCBzc3JfdHlwZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCBwYXJhbS0+ZXZlbnQsIGNvcmUtPnNzcl90eXBlKTsKKworCXN3aXRjaCAocGFyYW0tPmV2ZW50KSB7CisJY2FzZSBDUEVfU1ZDX0JPT1Q6CisJCWJvb3RfZGF0YSA9IChzdHJ1Y3QgY3BlX3N2Y19ib290X2V2ZW50ICopCisJCQkJcGFyYW0tPnBheWxvYWQ7CisJCWNvcmUtPnNmcl9idWZfYWRkciA9IGJvb3RfZGF0YS0+ZGVidWdfYWRkcmVzczsKKwkJY29yZS0+c2ZyX2J1Zl9zaXplID0gYm9vdF9kYXRhLT5kZWJ1Z19idWZmZXJfc2l6ZTsKKwkJZGV2X2RiZyhjb3JlLT5kZXYsCisJCQkiJXM6IENQRSBib290ZWQsIHNmcl9hZGRyID0gJWQsIHNmcl9zaXplID0gJXp1XG4iLAorCQkJX19mdW5jX18sIGNvcmUtPnNmcl9idWZfYWRkciwKKwkJCWNvcmUtPnNmcl9idWZfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgQ1BFX1NWQ19PTkxJTkU6CisJCWNvcmUtPnNzcl90eXBlID0gV0NEX0NQRV9BQ1RJVkU7CisJCWRldl9kYmcoY29yZS0+ZGV2LCAiJXMgQ1BFIGlzIG5vdyBvbmxpbmVcbiIsCisJCQkgX19mdW5jX18pOworCQljb21wbGV0ZSgmY29yZS0+b25saW5lX2NvbXBsKTsKKwkJYnJlYWs7CisJY2FzZSBDUEVfU1ZDX09GRkxJTkU6CisJCS8qCisJCSAqIG9mZmxpbmUgY2FuIGhhcHBlbiBkdXJpbmcgbm9ybWFsIHNodXRkb3duLAorCQkgKiBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gb2ZmbGluZSBvbmx5IGR1cmluZworCQkgKiBTU1IuCisJCSAqLworCQlpZiAoY29yZS0+c3NyX3R5cGUgIT0gV0NEX0NQRV9TU1JfRVZFTlQgJiYKKwkJICAgIGNvcmUtPnNzcl90eXBlICE9IFdDRF9DUEVfQlVTX0RPV05fRVZFTlQpCisJCQlicmVhazsKKworCQlhY3RpdmVfc2Vzc2lvbnMgPSB3Y2RfY3BlX2xzbV9zZXNzaW9uX2FjdGl2ZSgpOworCQl3Y2RfY3BlX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29yZSwgMCk7CisJCWNvbXBsZXRlKCZjb3JlLT5vZmZsaW5lX2NvbXBsKTsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogQ1BFIGlzIG5vdyBvZmZsaW5lXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBDUEVfU1ZDX0NNSV9DTElFTlRTX0RFUkVHOgorCisJCS8qCisJCSAqIE9ubHkgd2hlbiBlaXRoZXIgQ1BFIFNTUiBpcyBpbiBwcm9ncmVzcywKKwkJICogb3IgdGhlIGJ1cyBpcyBkb3duLCB3ZSBuZWVkIHRvIG1hcmsgdGhlIENQRQorCQkgKiBhcyByZWFkeS4gSW4gYWxsIG90aGVyIGNhc2VzLCB0aGlzIGV2ZW50IGlzCisJCSAqIGlnbm9yZWQKKwkJICovCisJCWlmIChjb3JlLT5zc3JfdHlwZSA9PSBXQ0RfQ1BFX1NTUl9FVkVOVCB8fAorCQkgICAgY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9CVVNfRE9XTl9FVkVOVCkKKwkJCXdjZF9jcGVfc2V0X2FuZF9jb21wbGV0ZShjb3JlLAorCQkJCQkJIFdDRF9DUEVfQkxLX1JFQURZKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IHVuaGFuZGxlZCBub3RpZmljYXRpb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIHdjZF9jcGVfY2xlYW51cF9pcnFzOiBmcmVlIHRoZSBpcnEgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IGNwZQorICogQGNvcmU6IGhhbmRsZSB0aGUgY3BlIGNvcmUKKyAqCisgKiBUaGlzIEFQSSB3aWxsIGZyZWUgdGhlIElSUXMgZm9yIENQRSBidXQgZG9lcyBub3QgbWFzayB0aGUKKyAqIENQRSBpbnRlcnJ1cHRzLiBJZiBtYXNraW5nIGlzIG5lZWRlZCwgaXQgaGFzIHRvIGJlIGRvbmUKKyAqIGV4cGxpY2l0eSBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdjZF9jcGVfY2xlYW51cF9pcnFzKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb3JlLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCisJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywKKwkJCSBjb3JlLT5pcnFfaW5mby5jcGVfZW5naW5lX2lycSwKKwkJCSBjb3JlKTsKKwl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLAorCQkJIGNvcmUtPmlycV9pbmZvLmNwZV9lcnJfaXJxLAorCQkJIGNvcmUpOworCit9CisKKy8qCisgKiB3Y2RfY3BlX3NldHVwX3N2YV9lcnJfaW50cjogc2V0dXAgdGhlIGlycXMgZm9yIENQRQorICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKKyAqIEFsbCBpbnRlcnJ1cHRzIG5lZWRlZCBmb3IgQ1BFIGFyZSBhY3F1aXJlZC4gSWYgYW55CisgKiByZXF1ZXN0X2lycSBmYWlscywgdGhlbiBhbGwgaXJxcyBhcmUgZnJlZSdkCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9zZXR1cF9pcnFzKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb3JlLT5jb2RlYzsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOworCisJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywKKwkJCQkgIGNvcmUtPmlycV9pbmZvLmNwZV9lbmdpbmVfaXJxLAorCQkJCSAgc3Zhc3NfZW5naW5lX2lycSwgIlNWQVNTX0VuZ2luZSIsIGNvcmUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IHN2YXNzIGVuZ2luZSBpcnFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9lbmdpbmVfaXJxOworCX0KKworCS8qIE1ha2Ugc3VyZSBhbGwgZXJyb3IgaW50ZXJydXB0cyBhcmUgY2xlYXJlZCAqLworCWlmIChDUEVfRVJSX0lSUV9DQihjb3JlKSkKKwkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKKwkJCQkJY29yZS0+Y29kZWMsCisJCQkJCUNQRV9FUlJfSVJRX0NMRUFSLAorCQkJCQlOVUxMKTsKKworCS8qIEVuYWJsZSByZXF1aXJlZCBlcnJvciBpbnRlcnJ1cHRzICovCisJaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQorCQljb3JlLT5jcGVfY2RjX2NiLT5jcGVfZXJyX2lycV9jb250cm9sKAorCQkJCQljb3JlLT5jb2RlYywKKwkJCQkJQ1BFX0VSUl9JUlFfVU5NQVNLLAorCQkJCQlOVUxMKTsKKworCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsCisJCQkJICBjb3JlLT5pcnFfaW5mby5jcGVfZXJyX2lycSwKKwkJCQkgIHN2YXNzX2V4Y2VwdGlvbl9pcnEsICJTVkFTU19FeGNlcHRpb24iLCBjb3JlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBzdmFzcyBlcnIgaXJxXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfZXhjZXB0aW9uX2lycTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9leGNlcHRpb25faXJxOgorCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsCisJCQkgY29yZS0+aXJxX2luZm8uY3BlX2VuZ2luZV9pcnEsIGNvcmUpOworCitmYWlsX2VuZ2luZV9pcnE6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX2dldF9jYWxfaW5kZXgoaW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgY2FsX2luZGV4ID0gLUVJTlZBTDsKKworCWlmIChjYWxfdHlwZSA9PSBVTFBfQUZFX0NBTF9UWVBFKQorCQljYWxfaW5kZXggPSBXQ0RfQ1BFX0xTTV9DQUxfQUZFOworCWVsc2UgaWYgKGNhbF90eXBlID09IFVMUF9MU01fQ0FMX1RZUEUpCisJCWNhbF9pbmRleCA9IFdDRF9DUEVfTFNNX0NBTF9MU007CisJZWxzZSBpZiAoY2FsX3R5cGUgPT0gVUxQX0xTTV9UT1BPTE9HWV9JRF9DQUxfVFlQRSkKKwkJY2FsX2luZGV4ID0gV0NEX0NQRV9MU01fQ0FMX1RPUE9MT0dZX0lEOworCWVsc2UKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjYWxfdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfdHlwZSk7CisKKwlyZXR1cm4gY2FsX2luZGV4OworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCWNhbF9pbmRleCA9IHdjZF9jcGVfZ2V0X2NhbF9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjYWx0eXBlICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCQkJICBjb3JlX2QtPmNhbF9kYXRhW2NhbF9pbmRleF0sCisJCQkJICAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2FsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9kZWFsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLAorCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJY2FsX2luZGV4ID0gd2NkX2NwZV9nZXRfY2FsX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbHR5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2FsX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfZGVhbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAorCQkJCSAgICBjb3JlX2QtPmNhbF9kYXRhW2NhbF9pbmRleF0pOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfZGVhbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfc2V0X2NhbChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwljYWxfaW5kZXggPSB3Y2RfY3BlX2dldF9jYWxfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgY2FsdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGNhbF91dGlsc19zZXRfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKKwkJCQljb3JlX2QtPmNhbF9kYXRhW2NhbF9pbmRleF0sCisJCQkJMCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9jYWxfaW5pdChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGNhbF90eXBlX2luZm8gY2FsX3R5cGVfaW5mb1tdID0geworCQl7e1VMUF9BRkVfQ0FMX1RZUEUsCisJCSB7d2NkX2NwZV9hbGxvY19jYWwsIHdjZF9jcGVfZGVhbGxvY19jYWwsIE5VTEwsCisJCSAgd2NkX2NwZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tVTFBfTFNNX0NBTF9UWVBFLAorCQkge3djZF9jcGVfYWxsb2NfY2FsLCB3Y2RfY3BlX2RlYWxsb2NfY2FsLCBOVUxMLAorCQkgIHdjZF9jcGVfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJIHtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e1VMUF9MU01fVE9QT0xPR1lfSURfQ0FMX1RZUEUsCisJCSB7d2NkX2NwZV9hbGxvY19jYWwsIHdjZF9jcGVfZGVhbGxvY19jYWwsIE5VTEwsCisJCSAgd2NkX2NwZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQkge05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCX07CisKKwlyZXQgPSBjYWxfdXRpbHNfY3JlYXRlX2NhbF90eXBlcyhXQ0RfQ1BFX0xTTV9DQUxfTUFYLAorCQkJCQkgY29yZS0+Y2FsX2RhdGEsCisJCQkJCSBjYWxfdHlwZV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSFcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfZW5hYmxlOiBzZXR1cCB0aGUgY3BlIGludGVycnVwdHMgYW5kIHNjaGVkdWxlCisgKgl0aGUgd29yayB0byBkb3dubG9hZCBpbWFnZSBhbmQgYm9vdHVwIHRoZSBDUEUuCisgKiBjb3JlOiBoYW5kbGUgdG8gY3BlIGNvcmUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV92b3RlKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCWJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFjb3JlKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvcmVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkZXZfZGJnKGNvcmUtPmRldiwKKwkJIiVzOiBlbnRlciwgZW5hYmxlID0gJXMsIGNwZV91c2VycyA9ICV1XG4iLAorCQlfX2Z1bmNfXywgKGVuYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLAorCQljb3JlLT5jcGVfdXNlcnMpOworCisJaWYgKGVuYWJsZSkgeworCQljb3JlLT5jcGVfdXNlcnMrKzsKKwkJaWYgKGNvcmUtPmNwZV91c2VycyA9PSAxKSB7CisJCQlyZXQgPSB3Y2RfY3BlX2VuYWJsZShjb3JlLCBlbmFibGUpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCQkiJXM6IENQRSBlbmFibGUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9IGVsc2UgeworCQkJZGV2X2RiZyhjb3JlLT5kZXYsCisJCQkJIiVzOiBjcGUgYWxyZWFkeSBlbmFibGVkLCB1c2VycyA9ICV1XG4iLAorCQkJCV9fZnVuY19fLCBjb3JlLT5jcGVfdXNlcnMpOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlIHsKKwkJY29yZS0+Y3BlX3VzZXJzLS07CisJCWlmIChjb3JlLT5jcGVfdXNlcnMgPT0gMCkgeworCQkJcmV0ID0gd2NkX2NwZV9lbmFibGUoY29yZSwgZW5hYmxlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkJIiVzOiBDUEUgZGlzYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGNvcmUtPmRldiwKKwkJCQkiJXM6ICV1IHZhbGlkIHVzZXJzIG9uIGNwZVxuIiwKKwkJCQlfX2Z1bmNfXywgY29yZS0+Y3BlX3VzZXJzKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IGxlYXZlLCBlbmFibGUgPSAlcywgY3BlX3VzZXJzID0gJXVcbiIsCisJCV9fZnVuY19fLCAoZW5hYmxlID8gInRydWUiIDogImZhbHNlIiksCisJCWNvcmUtPmNwZV91c2Vycyk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKQoreworCWludCByYyA9IDA7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIndjZF9jcGUiLCBOVUxMKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChkaXIpKSB7CisJCWRpciA9IE5VTEw7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY3JlYXRlX2RpcjsKKwl9CisKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX3UzMigicmFtZHVtcF9lbmFibGUiLCAwNjQ0LAorCQkJCWRpciwgJnJhbWR1bXBfZW5hYmxlKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgbm9kZSAlc1xuIiwKKwkJCV9fZnVuY19fLCAicmFtZHVtcF9lbmFibGUiKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9jcmVhdGVfZW50cnk7CisJfQorCisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjcGVfZnRtX3Rlc3RfdHJpZ2dlciIsIDAyMDAsCisJCQkJZGlyLCBjb3JlLCAmY3BlX2Z0bV90ZXN0X3RyaWdnZXJfZm9wcykpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIG5vZGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgImNwZV9mdG1fdGVzdF90cmlnZ2VyIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY3JlYXRlX2VudHJ5OworCX0KKworCWlmICghZGVidWdmc19jcmVhdGVfdTMyKCJjcGVfZnRtX3Rlc3Rfc3RhdHVzIiwgMDQ0NCwKKwkJCQlkaXIsICZjcGVfZnRtX3Rlc3Rfc3RhdHVzKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgbm9kZSAlc1xuIiwKKwkJCV9fZnVuY19fLCAiY3BlX2Z0bV90ZXN0X3N0YXR1cyIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NyZWF0ZV9lbnRyeTsKKwl9CisKK2Vycl9jcmVhdGVfZW50cnk6CisJZGVidWdmc19yZW1vdmUoZGlyKTsKKworZXJyX2NyZWF0ZV9kaXI6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBmd19uYW1lX3Nob3coc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFdDRF9DUEVfSU1BR0VfRk5BTUVfTUFYLCAiJXMiLAorCQkJY29yZS0+ZHluX2ZuYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QgZndfbmFtZV9zdG9yZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQljb25zdCBjaGFyICpidWYsIHNzaXplX3QgY291bnQpCit7CisJaW50IGNvcHlfY291bnQgPSBjb3VudDsKKwljb25zdCBjaGFyICpwb3M7CisKKwlwb3MgPSBtZW1jaHIoYnVmLCAnXG4nLCBjb3VudCk7CisJaWYgKHBvcykKKwkJY29weV9jb3VudCA9IHBvcyAtIGJ1ZjsKKworCWlmIChjb3B5X2NvdW50ID4gV0NEX0NQRV9JTUFHRV9GTkFNRV9NQVgpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEludmFsaWQgbGVuZ3RoICVkLCBtYXggYWxsb3dlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjb3B5X2NvdW50LCBXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmxjcHkoY29yZS0+ZHluX2ZuYW1lLCBidWYsIGNvcHlfY291bnQgKyAxKTsKKworCXJldHVybiBjb3VudDsKK30KKworV0NEX0NQRV9BVFRSKGZ3X25hbWUsIDA2NjAsIGZ3X25hbWVfc2hvdywgZndfbmFtZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHdjZF9jcGVfc3lzZnNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3Y2RfY3BlX2F0dHJpYnV0ZSAqY3BlX2F0dHIgPSB0b193Y2RfY3BlX2F0dHIoYXR0cik7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGtvYmpfdG9fY3BlX2NvcmUoa29iaik7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisJaWYgKGNvcmUgJiYgY3BlX2F0dHItPnNob3cpCisJCXJldCA9IGNwZV9hdHRyLT5zaG93KGNvcmUsIGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB3Y2RfY3BlX3N5c2ZzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9hdHRyaWJ1dGUgKmNwZV9hdHRyID0gdG9fd2NkX2NwZV9hdHRyKGF0dHIpOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBrb2JqX3RvX2NwZV9jb3JlKGtvYmopOworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3JlICYmIGNwZV9hdHRyLT5zdG9yZSkKKwkJcmV0ID0gY3BlX2F0dHItPnN0b3JlKGNvcmUsIGJ1ZiwgY291bnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgd2NkX2NwZV9zeXNmc19vcHMgPSB7CisJLnNob3cgPSB3Y2RfY3BlX3N5c2ZzX3Nob3csCisJLnN0b3JlID0gd2NkX2NwZV9zeXNmc19zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHdjZF9jcGVfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZ3Y2RfY3BlX3N5c2ZzX29wcywKK307CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9zeXNmc19pbml0KHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsIGludCBpZCkKK3sKKwljaGFyIHN5c2ZzX2Rpcl9uYW1lW1dDRF9DUEVfU1lTRlNfRElSX01BWF9MRU5HVEhdOworCWludCByYyA9IDA7CisKKwlzbnByaW50ZihzeXNmc19kaXJfbmFtZSwgV0NEX0NQRV9TWVNGU19ESVJfTUFYX0xFTkdUSCwKKwkJICIlcyVkIiwgIndjZF9jcGUiLCBpZCk7CisKKwlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjb3JlLT5jcGVfa29iaiwgJndjZF9jcGVfa3R5cGUsCisJCQkJICBrZXJuZWxfa29iaiwKKwkJCQkgIHN5c2ZzX2Rpcl9uYW1lKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gYWRkIGtvYmplY3QgJXMsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHN5c2ZzX2Rpcl9uYW1lLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjb3JlLT5jcGVfa29iaiwgJmNwZV9hdHRyX2Z3X25hbWUuYXR0cik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZndfbmFtZSBzeXNmcyBlbnRyeSB0byAlc1xuIiwKKwkJCV9fZnVuY19fLCBzeXNmc19kaXJfbmFtZSk7CisJCWdvdG8gZmFpbF9jcmVhdGVfZmlsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9jcmVhdGVfZmlsZToKKwlrb2JqZWN0X3B1dCgmY29yZS0+Y3BlX2tvYmopOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwZV9mdG1fdGVzdF90cmlnZ2VyKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEVuYWJsZSB0aGUgY2xrcyBmb3IgY3BlICovCisJcmV0ID0gd2NkX2NwZV9lbmFibGVfY3BlX2Nsa3MoY29yZSwgdHJ1ZSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBDUEUgY2xrIGVuYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBHZXQgdGhlIENQRV9TVEFUVVMgKi8KKwlyZXQgPSBjcGVfc3ZjX2Z0bV90ZXN0KGNvcmUtPmNwZV9oYW5kbGUsICZjcGVfZnRtX3Rlc3Rfc3RhdHVzKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IENQRSBGVE0gdGVzdCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWlmIChyZXQgPT0gQ1BFX1NWQ19CVVNZKSB7CisJCQljcGVfZnRtX3Rlc3Rfc3RhdHVzID0gMTsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIHRoZSBjbGtzIGZvciBjcGUgKi8KKwlyZXQgPSB3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCBmYWxzZSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBDUEUgY2xrIGRpc2FibGUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCX0KKworZG9uZToKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX3ZhbGlkYXRlX3BhcmFtcygKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHdjZF9jcGVfcGFyYW1zICpwYXJhbXMpCit7CisKKwlpZiAoIWNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29kZWNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIiVzOiBObyBwYXJhbXMgc3VwcGxpZWQgZm9yIGNvZGVjICVzXG4iLAorCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcGFyYW1zLT5jb2RlYyB8fCAhcGFyYW1zLT5nZXRfY3BlX2NvcmUgfHwKKwkgICAgIXBhcmFtcy0+Y2RjX2NiKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBwYXJhbXMgZm9yIGNvZGVjICVzXG4iLAorCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogd2NkX2NwZV9pbml0OiBJbml0aWFsaXplIENQRSByZWxhdGVkIHN0cnVjdHVyZXMKKyAqIEBpbWdfZm5hbWU6IGZpbGVuYW1lIGZvciBmaXJtd2FyZSBpbWFnZQorICogQGNvZGVjOiBoYW5kbGUgdG8gY29kZWMgcmVxdWVzdGluZyBmb3IgaW1hZ2UgZG93bmxvYWQKKyAqIEBwYXJhbXM6IHBhcmFtZXRlciBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gY2FsbGVyCisgKgorICogVGhpcyBBUEkgd2lsbCBpbml0aWFsaXplIHRoZSBjcGUgY29yZSBidXQgd2lsbCBub3QKKyAqIGRvd25sb2FkIHRoZSBpbWFnZSBvciBib290IHRoZSBjcGUgY29yZS4KKyAqLworc3RydWN0IHdjZF9jcGVfY29yZSAqd2NkX2NwZV9pbml0KGNvbnN0IGNoYXIgKmltZ19mbmFtZSwKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHdjZF9jcGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBOVUxMOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnkgPSBOVUxMOworCWNoYXIgcHJvY19uYW1lW1dDRF9DUEVfU1RBVEVfTUFYX0xFTl07CisJY29uc3QgY2hhciAqY3BlX25hbWUgPSAiY3BlIjsKKwljb25zdCBjaGFyICpzdGF0ZV9uYW1lID0gIl9zdGF0ZSI7CisJY29uc3Qgc3RydWN0IGNwZV9zdmNfaHdfY2ZnICpod19pbmZvOworCWludCBpZCA9IDA7CisKKwlpZiAod2NkX2NwZV92YWxpZGF0ZV9wYXJhbXMoY29kZWMsIHBhcmFtcykpCisJCXJldHVybiBOVUxMOworCisJY29yZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3Y2RfY3BlX2NvcmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvcmUpCisJCXJldHVybiBOVUxMOworCisJc25wcmludGYoY29yZS0+Zm5hbWUsIHNpemVvZihjb3JlLT5mbmFtZSksICIlcyIsIGltZ19mbmFtZSk7CisJc3RybGNweShjb3JlLT5keW5fZm5hbWUsIGNvcmUtPmZuYW1lLCBXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCk7CisKKwl3Y2RfZ2V0X2NwZV9jb3JlID0gcGFyYW1zLT5nZXRfY3BlX2NvcmU7CisKKwljb3JlLT5jb2RlYyA9IHBhcmFtcy0+Y29kZWM7CisJY29yZS0+ZGV2ID0gcGFyYW1zLT5jb2RlYy0+ZGV2OworCWNvcmUtPmNwZV9kZWJ1Z19tb2RlID0gcGFyYW1zLT5kYmdfbW9kZTsKKworCWNvcmUtPmNkY19pbmZvLm1ham9yX3ZlcnNpb24gPSBwYXJhbXMtPmNkY19tYWpvcl92ZXI7CisJY29yZS0+Y2RjX2luZm8ubWlub3JfdmVyc2lvbiA9IHBhcmFtcy0+Y2RjX21pbm9yX3ZlcjsKKwljb3JlLT5jZGNfaW5mby5pZCA9IHBhcmFtcy0+Y2RjX2lkOworCisJY29yZS0+Y3BlX2NkY19jYiA9IHBhcmFtcy0+Y2RjX2NiOworCisJbWVtY3B5KCZjb3JlLT5pcnFfaW5mbywgJnBhcmFtcy0+Y2RjX2lycV9pbmZvLAorCSAgICAgICBzaXplb2YoY29yZS0+aXJxX2luZm8pKTsKKworCUlOSVRfV09SSygmY29yZS0+bG9hZF9md193b3JrLCB3Y2RfY3BlX2xvYWRfZndfaW1hZ2UpOworCUlOSVRfV09SSygmY29yZS0+c3NyX3dvcmssIHdjZF9jcGVfc3NyX3dvcmspOworCWluaXRfY29tcGxldGlvbigmY29yZS0+b2ZmbGluZV9jb21wbCk7CisJaW5pdF9jb21wbGV0aW9uKCZjb3JlLT5yZWFkeV9jb21wbCk7CisJaW5pdF9jb21wbGV0aW9uKCZjb3JlLT5vbmxpbmVfY29tcGwpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvcmUtPnNzcl9lbnRyeS5vZmZsaW5lX3BvbGxfd2FpdCk7CisJbXV0ZXhfaW5pdCgmY29yZS0+c3NyX2xvY2spOworCWNvcmUtPmNwZV91c2VycyA9IDA7CisJY29yZS0+Y3BlX2Nsa19yZWYgPSAwOworCisJLyoKKwkgKiBCeSBkZWZhdWx0LCBkdXJpbmcgcHJvYmUsIGl0IGlzIGFzc3VtZWQgdGhhdAorCSAqIGJvdGggQ1BFIGhhcmR3YXJlIGJsb2NrIGFuZCB1bmRlcmx5aW5nIGJ1cyB0byBjb2RlYworCSAqIGFyZSByZWFkeQorCSAqLworCWNvcmUtPnJlYWR5X3N0YXR1cyA9IFdDRF9DUEVfUkVBRFlfVE9fRExPQUQ7CisKKwljb3JlLT5jcGVfaGFuZGxlID0gY3BlX3N2Y19pbml0aWFsaXplKE5VTEwsICZjb3JlLT5jZGNfaW5mbywKKwkJCQkJICAgICAgcGFyYW1zLT5jcGVfc3ZjX3BhcmFtcyk7CisJaWYgKCFjb3JlLT5jcGVfaGFuZGxlKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjcGUgc2VydmljZXNcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9jcGVfaW5pdGlhbGl6ZTsKKwl9CisKKwljb3JlLT5jcGVfcmVnX2hhbmRsZSA9IGNwZV9zdmNfcmVnaXN0ZXIoY29yZS0+Y3BlX2hhbmRsZSwKKwkJCQkJd2NkX2NwZV9zdmNfZXZlbnRfY2IsCisJCQkJCUNQRV9TVkNfT05MSU5FIHwgQ1BFX1NWQ19PRkZMSU5FIHwKKwkJCQkJQ1BFX1NWQ19CT09UIHwKKwkJCQkJQ1BFX1NWQ19DTUlfQ0xJRU5UU19ERVJFRywKKwkJCQkJImNvZGVjIGNwZSBoYW5kbGVyIik7CisJaWYgKCFjb3JlLT5jcGVfcmVnX2hhbmRsZSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGNwZSBzZXJ2aWNlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfY3BlX3JlZ2lzdGVyOworCX0KKworCWNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQtPnNuZF9jYXJkOworCXNucHJpbnRmKHByb2NfbmFtZSwgKHNpemVvZigiY3BlIikgKyBzaXplb2YoIl9zdGF0ZSIpICsKKwkJIHNpemVvZihpZCkgLSAyKSwgIiVzJWQlcyIsIGNwZV9uYW1lLCBpZCwgc3RhdGVfbmFtZSk7CisJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCBwcm9jX25hbWUsCisJCQkJCSAgIGNhcmQtPnByb2Nfcm9vdCk7CisJaWYgKGVudHJ5KSB7CisJCWNvcmUtPnNzcl9lbnRyeS5lbnRyeSA9IGVudHJ5OworCQljb3JlLT5zc3JfZW50cnkub2ZmbGluZSA9IDE7CisJCWVudHJ5LT5zaXplID0gV0NEX0NQRV9TVEFURV9NQVhfTEVOOworCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOworCQllbnRyeS0+Yy5vcHMgPSAmd2NkX2NwZV9zdGF0ZV9wcm9jX29wczsKKwkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNvcmU7CisJCXJldCA9IHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogc25kX2luZm9fcmVnaXN0ZXIgZmFpbGVkICglZClcbiIsCisJCQkJIF9fZnVuY19fLCByZXQpOworCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CisJCQllbnRyeSA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGNyZWF0ZSBDUEUgU1NSIHN0YXR1cyBlbnRyeVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJLyoKKwkJICogRXZlbiBpZiBTU1IgZW50cnkgY3JlYXRpb24gZmFpbHMsIGNvbnRpbnVlCisJCSAqIHdpdGggaW1hZ2UgZG93bmxvYWQKKwkJICovCisJfQorCisJY29yZV9kID0gY29yZTsKKwlyZXQgPSB3Y2RfY3BlX2NhbF9pbml0KGNvcmUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogQ1BFIGNhbGlicmF0aW9uIGluaXQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxfY3BlX3Jlc2V0OworCX0KKworCXdjZF9jcGVfZGVidWdmc19pbml0KGNvcmUpOworCisJd2NkX2NwZV9zeXNmc19pbml0KGNvcmUsIGlkKTsKKworCWh3X2luZm8gPSBjcGVfc3ZjX2dldF9od19jZmcoY29yZS0+Y3BlX2hhbmRsZSk7CisJaWYgKCFod19pbmZvKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBodyBpbmZvIG5vdCBhdmFpbGFibGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gc2NoZWR1bGVfZGxvYWRfd29yazsKKwl9IGVsc2UgeworCQljb3JlLT5od19pbmZvLmRyYW1fb2Zmc2V0ID0gaHdfaW5mby0+RFJBTV9vZmZzZXQ7CisJCWNvcmUtPmh3X2luZm8uZHJhbV9zaXplID0gaHdfaW5mby0+RFJBTV9zaXplOworCQljb3JlLT5od19pbmZvLmlyYW1fb2Zmc2V0ID0gaHdfaW5mby0+SVJBTV9vZmZzZXQ7CisJCWNvcmUtPmh3X2luZm8uaXJhbV9zaXplID0gaHdfaW5mby0+SVJBTV9zaXplOworCX0KKworCS8qIFNldHVwIHRoZSByYW1kdW1wIGRldmljZSBhbmQgYnVmZmVyICovCisJY29yZS0+Y3BlX3JhbWR1bXBfZGV2ID0gY3JlYXRlX3JhbWR1bXBfZGV2aWNlKCJjcGUiLAorCQkJCQkJICAgICAgY29yZS0+ZGV2KTsKKwlpZiAoIWNvcmUtPmNwZV9yYW1kdW1wX2RldikgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGNyZWF0ZSByYW1kdW1wIGRldmljZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBzY2hlZHVsZV9kbG9hZF93b3JrOworCX0KKworCWFyY2hfc2V0dXBfZG1hX29wcyhjb3JlLT5kZXYsIDAsIDAsIE5VTEwsIDApOworCWNvcmUtPmNwZV9kdW1wX3ZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChjb3JlLT5kZXYsCisJCQkJCQkgICBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZSwKKwkJCQkJCSAgICZjb3JlLT5jcGVfZHVtcF9hZGRyLAorCQkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb3JlLT5jcGVfZHVtcF92X2FkZHIpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBhbGxvYyBtZW1vcnkgZm9yIGNwZSBkdW1wLCBzaXplID0gJXpkXG4iLAorCQkJX19mdW5jX18sIGNvcmUtPmh3X2luZm8uZHJhbV9zaXplKTsKKwkJZ290byBzY2hlZHVsZV9kbG9hZF93b3JrOworCX0gZWxzZSB7CisJCW1lbXNldChjb3JlLT5jcGVfZHVtcF92X2FkZHIsIDAsIGNvcmUtPmh3X2luZm8uZHJhbV9zaXplKTsKKwl9CisKK3NjaGVkdWxlX2Rsb2FkX3dvcms6CisJY29yZS0+c3NyX3R5cGUgPSBXQ0RfQ1BFX0lOSVRJQUxJWkVEOworCXNjaGVkdWxlX3dvcmsoJmNvcmUtPmxvYWRfZndfd29yayk7CisJcmV0dXJuIGNvcmU7CisKK2ZhaWxfY3BlX3Jlc2V0OgorCWNwZV9zdmNfZGVyZWdpc3Rlcihjb3JlLT5jcGVfaGFuZGxlLCBjb3JlLT5jcGVfcmVnX2hhbmRsZSk7CisKK2ZhaWxfY3BlX3JlZ2lzdGVyOgorCWNwZV9zdmNfZGVpbml0aWFsaXplKGNvcmUtPmNwZV9oYW5kbGUpOworCitmYWlsX2NwZV9pbml0aWFsaXplOgorCWtmcmVlKGNvcmUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh3Y2RfY3BlX2luaXQpOworCisvKgorICogd2NkX2NwZV9jbWlfbHNtX2NhbGxiYWNrOiBjYWxsYmFjayBjYWxsZWQgZnJvbSBjcGUgc2VydmljZXMKKyAqCQkJICAgICB0byBub3RpZnkgY29tbWFuZCByZXNwb25zZSBmb3IgbHNtCisgKgkJCSAgICAgc2VydmljZQorICogQHBhcmFtOiBwYXJhbSBjb250YWluaW5nIHRoZSByZXNwb25zZSBjb2RlIGFuZCBzdGF0dXMKKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgd2l0aCBjcGUgc2VydmljZXMgd2hpbGUgcmVnaXN0ZXJpbmcKKyAqIHRoZSBMU00gc2VydmljZQorICovCitzdGF0aWMgdm9pZCB3Y2RfY3BlX2NtaV9sc21fY2FsbGJhY2soY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICpwYXJhbSkKK3sKKwlzdHJ1Y3QgY21pX2hkciAqaGRyOworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKmxzbV9zZXNzaW9uOworCXU4IHNlc3Npb25faWQ7CisKKwlpZiAoIXBhcmFtKSB7CisJCXByX2VycigiJXM6IHBhcmFtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwYXJhbS0+ZXZlbnQgIT0gQ01JX0FQSV9NU0cpIHsKKwkJcHJfZXJyKCIlczogdW5oYW5kbGVkIGV2ZW50IDB4JXhcbiIsIF9fZnVuY19fLCBwYXJhbS0+ZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaGRyID0gKHN0cnVjdCBjbWlfaGRyICopIHBhcmFtLT5tZXNzYWdlOworCXNlc3Npb25faWQgPSBDTUlfSERSX0dFVF9TRVNTSU9OX0lEKGhkcik7CisKKwlpZiAoc2Vzc2lvbl9pZCA+IFdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUykgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGxzbSBzZXNzaW9uIGlkID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisJCXJldHVybjsKKwl9CisKKwlsc21fc2Vzc2lvbiA9IGxzbV9zZXNzaW9uc1tzZXNzaW9uX2lkXTsKKworCWlmIChoZHItPm9wY29kZSA9PSBDUEVfQ01JX0JBU0lDX1JTUF9PUENPREUpIHsKKworCQl1OCAqcGF5bG9hZCA9ICgodTggKilwYXJhbS0+bWVzc2FnZSkgKyAoc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSk7CisJCXU4IHJlc3VsdCA9IHBheWxvYWRbMF07CisKKwkJbHNtX3Nlc3Npb24tPmNtZF9lcnJfY29kZSA9IHJlc3VsdDsKKwkJY29tcGxldGUoJmxzbV9zZXNzaW9uLT5jbWRfY29tcCk7CisKKwl9IGVsc2UgaWYgKGhkci0+b3Bjb2RlID09IENQRV9MU01fU0VTU0lPTl9DTURSU1BfU0hBUkVEX01FTV9BTExPQykgeworCisJCXN0cnVjdCBjcGVfY21kcnNwX3NobWVtX2FsbG9jICpjbWRyc3Bfc2htZW1fYWxsb2MgPQorCQkJKHN0cnVjdCBjcGVfY21kcnNwX3NobWVtX2FsbG9jICopIHBhcmFtLT5tZXNzYWdlOworCisJCWlmIChjbWRyc3Bfc2htZW1fYWxsb2MtPmFkZHIgPT0gMCkgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIExTTSBzaGFyZWQgbWVtIGFsbG9jXG4iLCBfX2Z1bmNfXyk7CisJCQlsc21fc2Vzc2lvbi0+Y21kX2Vycl9jb2RlID0gQ01JX1NITUVNX0FMTE9DX0ZBSUxFRDsKKworCQl9IGVsc2UgeworCisJCQlwcl9kZWJ1ZygiJXMgTFNNIHNoYXJlZCBtZW0gYWRkciA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGNtZHJzcF9zaG1lbV9hbGxvYy0+YWRkcik7CisJCQlsc21fc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGUgPSBjbWRyc3Bfc2htZW1fYWxsb2MtPmFkZHI7CisJCQlsc21fc2Vzc2lvbi0+Y21kX2Vycl9jb2RlID0gMDsKKwkJfQorCisJCWNvbXBsZXRlKCZsc21fc2Vzc2lvbi0+Y21kX2NvbXApOworCisJfSBlbHNlIGlmIChoZHItPm9wY29kZSA9PSBDUEVfTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMikgeworCisJCXN0cnVjdCBjcGVfbHNtX2V2ZW50X2RldGVjdF92MiAqZXZlbnRfZGV0ZWN0X3YyID0KKwkJCShzdHJ1Y3QgY3BlX2xzbV9ldmVudF9kZXRlY3RfdjIgKikgcGFyYW0tPm1lc3NhZ2U7CisKKwkJaWYgKCFsc21fc2Vzc2lvbi0+cHJpdl9kKSB7CisJCQlwcl9lcnIoIiVzOiBwcml2YXRlIGRhdGEgaXMgbm90IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiBldmVudCBwYXlsb2FkLCBzdGF0dXMgPSAldSwgc2l6ZSA9ICV1XG4iLAorCQkJX19mdW5jX18sIGV2ZW50X2RldGVjdF92Mi0+ZGV0ZWN0aW9uX3N0YXR1cywKKwkJCWV2ZW50X2RldGVjdF92Mi0+c2l6ZSk7CisKKwkJaWYgKGxzbV9zZXNzaW9uLT5ldmVudF9jYikKKwkJCWxzbV9zZXNzaW9uLT5ldmVudF9jYigKKwkJCQlsc21fc2Vzc2lvbi0+cHJpdl9kLAorCQkJCWV2ZW50X2RldGVjdF92Mi0+ZGV0ZWN0aW9uX3N0YXR1cywKKwkJCQlldmVudF9kZXRlY3RfdjItPnNpemUsCisJCQkJZXZlbnRfZGV0ZWN0X3YyLT5wYXlsb2FkKTsKKwl9Cit9CisKKy8qCisgKiB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2c6IHNlbmQgYSBtZXNzYWdlIHRvIGxzbSBzZXJ2aWNlCisgKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAc2Vzc2lvbjogc2Vzc2lvbiBvbiB3aGljaCB0byBzZW5kIHRoZSBtZXNzYWdlCisgKiBAbWVzc2FnZTogYWN0dWFsIG1lc3NhZ2UgY29udGFpbmluZyBoZWFkZXIgYW5kIHBheWxvYWQKKyAqCisgKiBTZW5kcyBtZXNzYWdlIHRvIGxzbSBzZXJ2aWNlIGZvciBzcGVjaWZpZWQgc2Vzc2lvbiBhbmQgd2FpdAorICogZm9yIHJlc3BvbnNlIGJhY2sgb24gdGhlIG1lc3NhZ2UuCisgKiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFjcXVpcmluZyBzZXNzaW9uIHNwZWNpZmljIG11dGV4CisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKAorCQkJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCQl2b2lkICptZXNzYWdlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjbWlfaGRyICpoZHIgPSBtZXNzYWdlOworCisJcHJfZGVidWcoIiVzOiBzZW5kaW5nIG1lc3NhZ2Ugd2l0aCBvcGNvZGUgMHgleFxuIiwKKwkJIF9fZnVuY19fLCBoZHItPm9wY29kZSk7CisKKwlpZiAodW5saWtlbHkoIXdjZF9jcGVfaXNfb25saW5lX3N0YXRlKGNvcmUpKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogTVNHIG5vdCBzZW50LCBDUEUgb2ZmbGluZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoQ01JX0hEUl9HRVRfT0JNX0ZMQUcoaGRyKSkKKwkJd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoY29yZSwgdHJ1ZSk7CisKKwlyZWluaXRfY29tcGxldGlvbigmc2Vzc2lvbi0+Y21kX2NvbXApOworCXJldCA9IGNtaV9zZW5kX21zZyhtZXNzYWdlKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IG1zZyBvcGNvZGUgKDB4JXgpIHNlbmQgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUsIHJldCk7CisJCWdvdG8gcmVsX2J1c192b3RlOworCX0KKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2Vzc2lvbi0+Y21kX2NvbXAsCisJCQkJCSAgQ01JX0NNRF9USU1FT1VUKTsKKwlpZiAocmV0ID4gMCkgeworCQlwcl9kZWJ1ZygiJXM6IGNvbW1hbmQgMHgleCwgcmVjZWl2ZWQgcmVzcG9uc2UgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBoZHItPm9wY29kZSwgc2Vzc2lvbi0+Y21kX2Vycl9jb2RlKTsKKwkJaWYgKHNlc3Npb24tPmNtZF9lcnJfY29kZSA9PSBDTUlfU0hNRU1fQUxMT0NfRkFJTEVEKQorCQkJc2Vzc2lvbi0+Y21kX2Vycl9jb2RlID0gQ1BFX0VOT01FTU9SWTsKKwkJaWYgKHNlc3Npb24tPmNtZF9lcnJfY29kZSA+IDApCisJCQlwcl9lcnIoIiVzOiBDUEUgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBjcGVfZXJyX2dldF9lcnJfc3RyKAorCQkJCXNlc3Npb24tPmNtZF9lcnJfY29kZSkpOworCQlyZXQgPSBjcGVfZXJyX2dldF9sbnhfZXJyX2NvZGUoc2Vzc2lvbi0+Y21kX2Vycl9jb2RlKTsKKwkJZ290byByZWxfYnVzX3ZvdGU7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogY29tbWFuZCAoMHgleCkgc2VuZCB0aW1lZCBvdXRcbiIsCisJCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUpOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIHJlbF9idXNfdm90ZTsKKwl9CisKKworcmVsX2J1c192b3RlOgorCisJaWYgKENNSV9IRFJfR0VUX09CTV9GTEFHKGhkcikpCisJCXdjZF9jcGVfYnVzX3ZvdGVfbWF4X2J3KGNvcmUsIGZhbHNlKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBmaWxsX2NtaV9oZWFkZXI6IGZpbGwgdGhlIGNtaSBoZWFkZXIgd2l0aCBzcGVjaWZpZWQgdmFsdWVzCisgKgorICogQGhkcjogaGVhZGVyIHRvIGJlIHVwZGF0ZWQgd2l0aCB2YWx1ZXMKKyAqIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkIG9mIHRoZSBoZWFkZXIsCisgKgkJaW4gY2FzZSBvZiBBRkUgc2VydmljZSBpdCBpcyBwb3J0X2lkCisgKiBAc2VydmljZV9pZDogYWZlL2xzbSwgZXRjCisgKiBAdmVyc2lvbjogdXBkYXRlIHRoZSB2ZXJzaW9uIGZpZWxkIGluIGhlYWRlcgorICogQHBheWxvYWRfc2l6ZTogc2l6ZSBvZiB0aGUgcGF5bG9hZCBmb2xsb3dpbmcgYWZ0ZXIgaGVhZGVyCisgKiBAb3Bjb2RlOiBvcGNvZGUgb2YgdGhlIG1lc3NhZ2UKKyAqIEBvYm1fZmxhZzogaW5kaWNhdGVzIGlmIHRoaXMgaGVhZGVyIGlzIGZvciBvYm0gbWVzc2FnZQorICoKKyAqLworc3RhdGljIGludCBmaWxsX2NtaV9oZWFkZXIoc3RydWN0IGNtaV9oZHIgKmhkciwKKwkJCSAgIHU4IHNlc3Npb25faWQsIHU4IHNlcnZpY2VfaWQsCisJCQkgICBib29sIHZlcnNpb24sIHU4IHBheWxvYWRfc2l6ZSwKKwkJCSAgIHUxNiBvcGNvZGUsIGJvb2wgb2JtX2ZsYWcpCit7CisJLyogc2FuaXRpemUgdGhlIGRhdGEgKi8KKwlpZiAoIUlTX1ZBTElEX1NFU1NJT05fSUQoc2Vzc2lvbl9pZCkgfHwKKwkgICAgIUlTX1ZBTElEX1NFUlZJQ0VfSUQoc2VydmljZV9pZCkgfHwKKwkgICAgIUlTX1ZBTElEX1BMRF9TSVpFKHBheWxvYWRfc2l6ZSkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIGhlYWRlciBjcmVhdGlvbiByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQ01JX0hEUl9TRVRfU0VTU0lPTihoZHIsIHNlc3Npb25faWQpOworCUNNSV9IRFJfU0VUX1NFUlZJQ0UoaGRyLCBzZXJ2aWNlX2lkKTsKKwlpZiAodmVyc2lvbikKKwkJQ01JX0hEUl9TRVRfVkVSU0lPTihoZHIsIDEpOworCWVsc2UKKwkJQ01JX0hEUl9TRVRfVkVSU0lPTihoZHIsIDApOworCisJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwgcGF5bG9hZF9zaXplKTsKKworCWhkci0+b3Bjb2RlID0gb3Bjb2RlOworCisJaWYgKG9ibV9mbGFnKQorCQlDTUlfSERSX1NFVF9PQk0oaGRyLCBDTUlfT0JNX0ZMQUdfT1VUX0JBTkQpOworCWVsc2UKKwkJQ01JX0hEUl9TRVRfT0JNKGhkciwgQ01JX09CTV9GTEFHX0lOX0JBTkQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZDoKKyAqCUdpdmVuIHRoZSBoZWFkZXIsIGZpbGwgdGhlIGhlYWRlciB3aXRoIGluZm9ybWF0aW9uCisgKglmb3IgbHNtIHNlcnZpY2UsIHZlcnNpb24gMCBhbmQgaW5iYW5kIG1lc3NhZ2UKKyAqIEBoZHI6IHRoZSBjbWkgaGVhZGVyIHRvIGJlIGZpbGxlZC4KKyAqIEBzZXNzaW9uX2lkOiBJRCBmb3IgdGhlIGxzbSBzZXNzaW9uCisgKiBAcGF5bG9hZF9zaXplOiBzaXplIGZvciBjbWkgbWVzc2FnZSBwYXlsb2FkCisgKiBAb3Bjb2RlOiBvcGNvZGUgZm9yIGNtaSBtZXNzYWdlCisgKi8KK3N0YXRpYyBpbnQgZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoc3RydWN0IGNtaV9oZHIgKmhkciwKKwkJdTggc2Vzc2lvbl9pZCwgdTggcGF5bG9hZF9zaXplLCB1MTYgb3Bjb2RlKQoreworCXJldHVybiBmaWxsX2NtaV9oZWFkZXIoaGRyLCBzZXNzaW9uX2lkLAorCQkJICAgICAgIENNSV9DUEVfTFNNX1NFUlZJQ0VfSUQsIGZhbHNlLAorCQkJICAgICAgIHBheWxvYWRfc2l6ZSwgb3Bjb2RlLCBmYWxzZSk7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uOgorICoJQ2hlY2sgc2Vzc2lvbiBwYXJhbWV0ZXJzIHRvIGlkZW50aWZ5IHZhbGlkaXR5IGZvciB0aGUgc2VzaW9uCisgKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAc2Vzc2lvbjogaGFuZGxlIHRvIHRoZSBsc20gc2Vzc2lvbgorICogQGZ1bmM6IGludm9raW5nIGZ1bmN0aW9uIHRvIGJlIHByaW50ZWQgaW4gZXJyb3IgbG9ncworICovCitzdGF0aWMgaW50IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJY29uc3QgY2hhciAqZnVuYykKK3sKKwlpZiAodW5saWtlbHkoSVNfRVJSX09SX05VTEwoY29yZSkpKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaGFuZGxlIHRvIGNvcmVcbiIsCisJCQlmdW5jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHVubGlrZWx5KElTX0VSUl9PUl9OVUxMKHNlc3Npb24pKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBpbnZhbGlkIHNlc3Npb25cbiIsCisJCQlmdW5jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNlc3Npb24tPmlkID4gV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IGludmFsaWQgc2Vzc2lvbiBpZCAoJXUpXG4iLAorCQkJZnVuYywgc2Vzc2lvbi0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvcmUtPmRldiwgIiVzOiBzZXNzaW9uX2lkID0gJXVcbiIsCisJCWZ1bmMsIHNlc3Npb24tPmlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX2NtZF9sc21fb3Blbl90eF92MigKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHhfdjIgY21kX29wZW5fdHhfdjI7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICp0b3BfY2FsID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCAqbHNtX3RvcDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKKwkJCQkJICAgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX1RPUE9MT0dZX0lEXSA9PSBOVUxMKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBMU01fVE9QT0xPR1kgY2FsIG5vdCBhbGxvY2F0ZWQhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfVE9QT0xPR1lfSURdLT5sb2NrKTsKKwl0b3BfY2FsID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJCWNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9UT1BPTE9HWV9JRF0pOworCWlmICghdG9wX2NhbCkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGdldCBMU00gVE9QT0xPR1kgY2FsIGJsb2NrXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7CisJfQorCisJbHNtX3RvcCA9IChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCAqKQorCQkJdG9wX2NhbC0+Y2FsX2luZm87CisKKwlpZiAoIWxzbV90b3ApIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGNhbF9pbmZvIGZvciBMU01fVE9QT0xPR1kgbm90IGZvdW5kXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7CisJfQorCisJZGV2X2RiZyhjb3JlLT5kZXYsCisJCSIlczogdG9wb2xvZ3lfaWQgPSAweCV4LCBhY2RiX2lkID0gMHgleCwgYXBwX3R5cGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgbHNtX3RvcC0+dG9wb2xvZ3ksIGxzbV90b3AtPmFjZGJfaWQsCisJCWxzbV90b3AtPmFwcF90eXBlKTsKKworCWlmIChsc21fdG9wLT50b3BvbG9neSA9PSAwKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiB0b3BvbG9neSBpZCBub3Qgc2VudCBmb3IgYXBwX3R5cGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBsc21fdG9wLT5hcHBfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrX2NhbF9tdXRleDsKKwl9CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKworCW1lbXNldCgmY21kX29wZW5fdHhfdjIsIDAsIHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jbWRfb3Blbl90eF92MikpOworCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZCgmY21kX29wZW5fdHhfdjIuaGRyLAorCQkJCXNlc3Npb24tPmlkLCBPUEVOX1YyX0NNRF9QQVlMT0FEX1NJWkUsCisJCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9PUEVOX1RYX1YyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9yZXQ7CisJfQorCisJY21kX29wZW5fdHhfdjIudG9wb2xvZ3lfaWQgPSBsc21fdG9wLT50b3BvbG9neTsKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9vcGVuX3R4X3YyKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIHNlbmQgb3Blbl90eF92MiBjbWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJZWxzZQorCQlzZXNzaW9uLT5pc190b3BvbG9neV91c2VkID0gdHJ1ZTsKK2VuZF9yZXQ6CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwordW5sb2NrX2NhbF9tdXRleDoKKwltdXRleF91bmxvY2soJmNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9UT1BPTE9HWV9JRF0tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2NtZF9sc21fb3Blbl90eDogY29tcG9zZSBhbmQgc2VuZCBsc20gb3BlbiBjb21tYW5kCisgKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byBjcGUgY29yZQorICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHRoZSBjb21tYW5kIG5lZWRzIHRvIGJlIHNlbnQKKyAqIEBhcHBfaWQ6IGFwcGxpY2F0aW9uIGlkIHBhcnQgb2YgdGhlIGNvbW1hbmQKKyAqIEBzYW1wbGVfcmF0ZTogc2FtcGxlIHJhdGUgZm9yIHRoaXMgc2Vzc2lvbgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfY21kX2xzbV9vcGVuX3R4KHZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQl1MTYgYXBwX2lkLCB1MTYgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHggY21kX29wZW5fdHg7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRyeSB0byBvcGVuIHdpdGggdG9wb2xvZ3kgZmlyc3QgKi8KKwlyZXQgPSB3Y2RfY3BlX2NtZF9sc21fb3Blbl90eF92Mihjb3JlLCBzZXNzaW9uKTsKKwlpZiAoIXJldCkKKwkJZ290byBkb25lOworCisJZGV2X2RiZyhjb3JlLT5kZXYsICIlczogVHJ5IG9wZW5fdHggd2l0aG91dCB0b3BvbG9neVxuIiwKKwkJX19mdW5jX18pOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisKKwltZW1zZXQoJmNtZF9vcGVuX3R4LCAwLCBzaXplb2Yoc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHgpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9vcGVuX3R4LmhkciwKKwkJCQlzZXNzaW9uLT5pZCwgT1BFTl9DTURfUEFZTE9BRF9TSVpFLAorCQkJCUNQRV9MU01fU0VTU0lPTl9DTURfT1BFTl9UWCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmRfcmV0OworCX0KKworCWNtZF9vcGVuX3R4LmFwcF9pZCA9IGFwcF9pZDsKKwljbWRfb3Blbl90eC5zYW1wbGluZ19yYXRlID0gc2FtcGxlX3JhdGU7CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9vcGVuX3R4KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIHNlbmQgb3Blbl90eCBjbWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CitlbmRfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2NtZF9jbG9zZV90eDogY29tcG9zZSBhbmQgc2VuZCBsc20gY2xvc2UgY29tbWFuZAorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gY3BlIGNvcmUKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCB0aGUgY29tbWFuZCBuZWVkcyB0byBiZSBzZW50CisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9jbWRfbHNtX2Nsb3NlX3R4KHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgY21pX2hkciBjbWRfY2xvc2VfdHg7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJbWVtc2V0KCZjbWRfY2xvc2VfdHgsIDAsIHNpemVvZihjbWRfY2xvc2VfdHgpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9jbG9zZV90eCwgc2Vzc2lvbi0+aWQsCisJCQkgICAgMCwgQ1BFX0xTTV9TRVNTSU9OX0NNRF9DTE9TRV9UWCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmRfcmV0OworCX0KKworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY21kX2Nsb3NlX3R4KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogbHNtIGNsb3NlX3R4IGNtZCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJZWxzZQorCQlzZXNzaW9uLT5pc190b3BvbG9neV91c2VkID0gZmFsc2U7CitlbmRfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfY21kX3NobWVtX2FsbG9jOiBjb21wb3NlIGFuZCBzZW5kIGxzbSBzaGFyZWQKKyAqCQkJICAgIG1lbW9yeSBhbGxvY2F0aW9uIGNvbW1hbmQKKyAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggdGhlIGNvbW1hbmQgbmVlZHMgdG8gYmUgc2VudAorICogQHNpemU6IHNpemUgb2YgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZAorICovCitzdGF0aWMgaW50IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9hbGxvYyh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCQl1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgY3BlX2NtZF9zaG1lbV9hbGxvYyBjbWRfc2htZW1fYWxsb2M7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJbWVtc2V0KCZjbWRfc2htZW1fYWxsb2MsIDAsIHNpemVvZihjbWRfc2htZW1fYWxsb2MpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9zaG1lbV9hbGxvYy5oZHIsIHNlc3Npb24tPmlkLAorCQkJICAgIFNITUVNX0FMTE9DX0NNRF9QTERfU0laRSwKKwkJCSAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fQUxMT0MpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwljbWRfc2htZW1fYWxsb2Muc2l6ZSA9IHNpemU7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfc2htZW1fYWxsb2MpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBsc21fc2htZW1fYWxsb2MgY21kIHNlbmQgZmFpbCwgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKK2VuZF9yZXQ6CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9jbWRfbHNtX3NobWVtX2RlYWxsb2M6IGRlYWxsb2NhdGUgdGhlIHNoYXJlZCBtZW1vcnkKKyAqCQkJCSAgZm9yIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbgorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gY3BlIGNvcmUKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCBtZW1vcnkgbmVlZHMgdG8gYmUgZGVhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9jbWRfbHNtX3NobWVtX2RlYWxsb2Modm9pZCAqY29yZV9oYW5kbGUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IGNwZV9jbWRfc2htZW1fZGVhbGxvYyBjbWRfZGVhbGxvYzsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sCisJCQkJCSAgIF9fZnVuY19fKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisKKwltZW1zZXQoJmNtZF9kZWFsbG9jLCAwLCBzaXplb2YoY21kX2RlYWxsb2MpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9kZWFsbG9jLmhkciwgc2Vzc2lvbi0+aWQsCisJCQkgICAgU0hNRU1fREVBTExPQ19DTURfUExEX1NJWkUsCisJCQkgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX0RFQUxMT0MpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwljbWRfZGVhbGxvYy5hZGRyID0gc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGU7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfZGVhbGxvYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogbHNtX3NobWVtX2RlYWxsb2MgY21kIGZhaWxlZCwgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlbmRfcmV0OworCX0KKworCW1lbXNldCgmc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGUsIDAsCisJICAgICAgIHNpemVvZihzZXNzaW9uLT5sc21fbWVtX2hhbmRsZSkpOworCitlbmRfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfc2VuZF9sc21fY2FsOiBzZW5kIHRoZSBjYWxpYnJhdGlvbiBmb3IgbHNtIHNlcnZpY2UKKyAqCQkJICAgICAgZnJvbSBhY2RiIHRvIHRoZSBjcGUKKyAqIEBjb3JlOiBoYW5kbGUgdG8gY3BlIGNvcmUKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCB0aGUgY2FsaWJyYXRpb24gbmVlZHMgdG8gYmUgc2V0LgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfc2VuZF9sc21fY2FsKAorCQkJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCit7CisKKwl1OCAqbXNnX3BsZDsKKwlzdHJ1Y3QgY21pX2hkciAqaGRyOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqbHNtX2NhbCA9IE5VTEw7CisJdm9pZCAqaW5iX21zZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKGNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9MU01dID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogTFNNIGNhbCBub3QgYWxsb2NhdGVkIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfTFNNXS0+bG9jayk7CisJbHNtX2NhbCA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCisJCQljb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfTFNNXSk7CisJaWYgKCFsc21fY2FsKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgbHNtIGNhbCBibG9ja1xuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrX2NhbF9tdXRleDsKKwl9CisKKwlpZiAobHNtX2NhbC0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7CisJCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IE5vIExTTSBjYWwgdG8gc2VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAwOworCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7CisJfQorCisJaW5iX21zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSArIGxzbV9jYWwtPmNhbF9kYXRhLnNpemUsCisJCQkgIEdGUF9LRVJORUwpOworCWlmICghaW5iX21zZykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrX2NhbF9tdXRleDsKKwl9CisKKwloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgaW5iX21zZzsKKworCXJjID0gZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoaGRyLCBzZXNzaW9uLT5pZCwKKwkJCWxzbV9jYWwtPmNhbF9kYXRhLnNpemUsCisJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtcyBmb3IgaGVhZGVyLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZnJlZV9tc2c7CisJfQorCisJbXNnX3BsZCA9ICgodTggKikgaW5iX21zZykgKyBzaXplb2Yoc3RydWN0IGNtaV9oZHIpOworCW1lbWNweShtc2dfcGxkLCBsc21fY2FsLT5jYWxfZGF0YS5rdmFkZHIsCisJICAgICAgIGxzbV9jYWwtPmNhbF9kYXRhLnNpemUpOworCisJcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgaW5iX21zZyk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBhY2RiIGxzbV9wYXJhbXMgc2VuZCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworZnJlZV9tc2c6CisJa2ZyZWUoaW5iX21zZyk7CisKK3VubG9ja19jYWxfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfTFNNXS0+bG9jayk7CisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyB2b2lkIHdjZF9jcGVfc2V0X3BhcmFtX2RhdGEoc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kLAorCQlzdHJ1Y3QgY3BlX2xzbV9pZHMgKmlkcywgdTMyIHBfc2l6ZSwKKwkJdTMyIHNldF9wYXJhbV9jbWQpCit7CisJcGFyYW1fZC0+bW9kdWxlX2lkID0gaWRzLT5tb2R1bGVfaWQ7CisJcGFyYW1fZC0+cGFyYW1faWQgPSBpZHMtPnBhcmFtX2lkOworCisJc3dpdGNoIChzZXRfcGFyYW1fY21kKSB7CisJY2FzZSBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI6CisJCXBhcmFtX2QtPnBfc2l6ZS5wYXJhbV9zaXplID0gcF9zaXplOworCQlicmVhazsKKwljYXNlIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUzoKKwlkZWZhdWx0OgorCQlwYXJhbV9kLT5wX3NpemUuc3IucGFyYW1fc2l6ZSA9CisJCQkodTE2KSBwX3NpemU7CisJCXBhcmFtX2QtPnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fZXBkX3RocmVzKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzKQoreworCXN0cnVjdCBzbmRfbHNtX2VwX2RldF90aHJlcyAqZXBfZGV0X2RhdGE7CisJc3RydWN0IGNwZV9sc21fcGFyYW1fZXBkX3RocmVzIGVwZF9jbWQ7CisJc3RydWN0IGNtaV9oZHIgKm1zZ19oZHIgPSAmZXBkX2NtZC5oZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kID0KKwkJCQkmZXBkX2NtZC5wYXJhbTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJmVwZF9jbWQsIDAsIHNpemVvZihlcGRfY21kKSk7CisJZXBfZGV0X2RhdGEgPSAoc3RydWN0IHNuZF9sc21fZXBfZGV0X3RocmVzICopIGRhdGE7CisJaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKG1zZ19oZHIsCisJCQkJc2Vzc2lvbi0+aWQsCisJCQkJQ1BFX0NNRF9FUERfVEhSRVNfUExEX1NJWkUsCisJCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsIGlkcywKKwkJCSAgICAgICBDUEVfRVBEX1RIUkVTX1BBUkFNX1NJWkUsCisJCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKworCWVwZF9jbWQubWlub3JfdmVyc2lvbiA9IDE7CisJZXBkX2NtZC5lcGRfYmVnaW4gPSBlcF9kZXRfZGF0YS0+ZXBkX2JlZ2luOworCWVwZF9jbWQuZXBkX2VuZCA9IGVwX2RldF9kYXRhLT5lcGRfZW5kOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmVwZF9jbWQpOworCWlmICh1bmxpa2VseShyYykpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBzZXRfcGFyYW0oRVBEIFRocmVzaG9sZCkgZmFpbGVkLCByYyAlZG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworZXJyX3JldDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX3BhcmFtX29wbW9kZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQl2b2lkICpkYXRhLCBzdHJ1Y3QgY3BlX2xzbV9pZHMgKmlkcykKK3sKKwlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3RfbW9kZSAqb3Btb2RlX2Q7CisJc3RydWN0IGNwZV9sc21fcGFyYW1fb3Btb2RlIG9wbW9kZV9jbWQ7CisJc3RydWN0IGNtaV9oZHIgKm1zZ19oZHIgPSAmb3Btb2RlX2NtZC5oZHI7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kID0KKwkJCQkmb3Btb2RlX2NtZC5wYXJhbTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJm9wbW9kZV9jbWQsIDAsIHNpemVvZihvcG1vZGVfY21kKSk7CisJb3Btb2RlX2QgPSAoc3RydWN0IHNuZF9sc21fZGV0ZWN0X21vZGUgKikgZGF0YTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQobXNnX2hkciwKKwkJCQlzZXNzaW9uLT5pZCwKKwkJCQlDUEVfQ01EX09QTU9ERV9QTERfU0laRSwKKwkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXdjZF9jcGVfc2V0X3BhcmFtX2RhdGEocGFyYW1fZCwgaWRzLAorCQkJICAgICAgIENQRV9PUE1PREVfUEFSQU1fU0laRSwKKwkJCSAgICAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCisJb3Btb2RlX2NtZC5taW5vcl92ZXJzaW9uID0gMTsKKwlpZiAob3Btb2RlX2QtPm1vZGUgPT0gTFNNX01PREVfS0VZV09SRF9PTkxZX0RFVEVDVElPTikKKwkJb3Btb2RlX2NtZC5tb2RlID0gMTsKKwllbHNlCisJCW9wbW9kZV9jbWQubW9kZSA9IDM7CisKKwlpZiAob3Btb2RlX2QtPmRldGVjdF9mYWlsdXJlKQorCQlvcG1vZGVfY21kLm1vZGUgfD0gMHgwNDsKKworCW9wbW9kZV9jbWQucmVzZXJ2ZWQgPSAwOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm9wbW9kZV9jbWQpOworCWlmICh1bmxpa2VseShyYykpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBzZXRfcGFyYW0ob3BlcmF0aW9uX21vZGUpIGZhaWxlZCwgcmMgJWRuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKK2Vycl9yZXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfc2VuZF9wYXJhbV9nYWluKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzKQoreworCXN0cnVjdCBzbmRfbHNtX2dhaW4gKmdhaW5fZDsKKwlzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9nYWluIGdhaW5fY21kOworCXN0cnVjdCBjbWlfaGRyICptc2dfaGRyID0gJmdhaW5fY21kLmhkcjsKKwlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPQorCQkJCSZnYWluX2NtZC5wYXJhbTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJmdhaW5fY21kLCAwLCBzaXplb2YoZ2Fpbl9jbWQpKTsKKwlnYWluX2QgPSAoc3RydWN0IHNuZF9sc21fZ2FpbiAqKSBkYXRhOworCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZChtc2dfaGRyLAorCQkJCXNlc3Npb24tPmlkLAorCQkJCUNQRV9DTURfR0FJTl9QTERfU0laRSwKKwkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXdjZF9jcGVfc2V0X3BhcmFtX2RhdGEocGFyYW1fZCwgaWRzLAorCQkJICAgICAgIENQRV9HQUlOX1BBUkFNX1NJWkUsCisJCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKworCWdhaW5fY21kLm1pbm9yX3ZlcnNpb24gPSAxOworCWdhaW5fY21kLmdhaW4gPSBnYWluX2QtPmdhaW47CisJZ2Fpbl9jbWQucmVzZXJ2ZWQgPSAwOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmdhaW5fY21kKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogc2V0X3BhcmFtKGxzbV9nYWluKSBmYWlsZWQsIHJjICVkbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CitlcnJfcmV0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fY29ubmVjdHBvcnQoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJdm9pZCAqZGF0YSwgc3RydWN0IGNwZV9sc21faWRzICppZHMsIHUxNiBwb3J0X2lkKQoreworCXN0cnVjdCBjcGVfbHNtX3BhcmFtX2Nvbm5lY3Rwb3J0IGNvbl9wb3J0X2NtZDsKKwlzdHJ1Y3QgY21pX2hkciAqbXNnX2hkciA9ICZjb25fcG9ydF9jbWQuaGRyOworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9CisJCQkJJmNvbl9wb3J0X2NtZC5wYXJhbTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJmNvbl9wb3J0X2NtZCwgMCwgc2l6ZW9mKGNvbl9wb3J0X2NtZCkpOworCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZChtc2dfaGRyLAorCQkJCXNlc3Npb24tPmlkLAorCQkJCUNQRV9DTURfQ09OTkVDVFBPUlRfUExEX1NJWkUsCisJCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsIGlkcywKKwkJCSAgICAgICBDUEVfQ09OTkVDVFBPUlRfUEFSQU1fU0laRSwKKwkJCSAgICAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCisJY29uX3BvcnRfY21kLm1pbm9yX3ZlcnNpb24gPSAxOworCWNvbl9wb3J0X2NtZC5hZmVfcG9ydF9pZCA9IHBvcnRfaWQ7CisJY29uX3BvcnRfY21kLnJlc2VydmVkID0gMDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjb25fcG9ydF9jbWQpOworCWlmICh1bmxpa2VseShyYykpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBzZXRfcGFyYW0oY29ubmVjdF9wb3J0KSBmYWlsZWQsIHJjICVkbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CitlcnJfcmV0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fY29uZl9sZXZlbHMoCisJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCXN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzKQoreworCXN0cnVjdCBjcGVfbHNtX2NvbmZfbGV2ZWwgY29uZl9sZXZlbF9kYXRhOworCXN0cnVjdCBjbWlfaGRyICpoZHIgPSAmKGNvbmZfbGV2ZWxfZGF0YS5oZHIpOworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9ICYoY29uZl9sZXZlbF9kYXRhLnBhcmFtKTsKKwl1OCBwbGRfc2l6ZSA9IDA7CisJdTggcGFkX2J5dGVzID0gMDsKKwl2b2lkICptZXNzYWdlOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZjb25mX2xldmVsX2RhdGEsIDAsIHNpemVvZihjb25mX2xldmVsX2RhdGEpKTsKKworCXBsZF9zaXplID0gKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jb25mX2xldmVsKSAtIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpOworCXBsZF9zaXplICs9IHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVsczsKKwlwYWRfYnl0ZXMgPSAoKDQgLSAocGxkX3NpemUgJSA0KSkgJSA0KTsKKwlwbGRfc2l6ZSArPSBwYWRfYnl0ZXM7CisKKwlmaWxsX2NtaV9oZWFkZXIoaGRyLCBzZXNzaW9uLT5pZCwgQ01JX0NQRV9MU01fU0VSVklDRV9JRCwKKwkJCWZhbHNlLCBwbGRfc2l6ZSwKKwkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMiwgZmFsc2UpOworCisJd2NkX2NwZV9zZXRfcGFyYW1fZGF0YShwYXJhbV9kLCBpZHMsCisJCQkgICAgICAgcGxkX3NpemUgLSBzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSwKKwkJCSAgICAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCisJY29uZl9sZXZlbF9kYXRhLm51bV9hY3RpdmVfbW9kZWxzID0gc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCisJbWVzc2FnZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2NvbmZfbGV2ZWwpICsKKwkJCSAgIGNvbmZfbGV2ZWxfZGF0YS5udW1fYWN0aXZlX21vZGVscyArIHBhZF9ieXRlcywKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghbWVzc2FnZSkgeworCQlwcl9lcnIoIiVzOiBubyBtZW1vcnkgZm9yIGNvbmZfbGV2ZWxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KG1lc3NhZ2UsICZjb25mX2xldmVsX2RhdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jb25mX2xldmVsKSk7CisJbWVtY3B5KCgodTggKikgbWVzc2FnZSkgKyBzaXplb2Yoc3RydWN0IGNwZV9sc21fY29uZl9sZXZlbCksCisJCXNlc3Npb24tPmNvbmZfbGV2ZWxzLCBjb25mX2xldmVsX2RhdGEubnVtX2FjdGl2ZV9tb2RlbHMpOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sIG1lc3NhZ2UpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IGxzbV9zZXRfY29uZl9sZXZlbHMgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCWtmcmVlKG1lc3NhZ2UpOworCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fc25kX21vZGVsKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGNwZV9sc21faWRzICppZHMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNtaV9vYm1fbXNnIG9ibV9tc2c7CisJc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kOworCisKKwlyZXQgPSBmaWxsX2NtaV9oZWFkZXIoJm9ibV9tc2cuaGRyLCBzZXNzaW9uLT5pZCwKKwkJCUNNSV9DUEVfTFNNX1NFUlZJQ0VfSUQsIDAsIDIwLAorCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyLCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCW9ibV9tc2cucGxkLnZlcnNpb24gPSAwOworCW9ibV9tc2cucGxkLnNpemUgPSBzZXNzaW9uLT5zbmRfbW9kZWxfc2l6ZTsKKwlvYm1fbXNnLnBsZC5kYXRhX3B0ci5rdmFkZHIgPSBzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YTsKKwlvYm1fbXNnLnBsZC5tZW1faGFuZGxlID0gc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGU7CisKKwlwYXJhbV9kID0gKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqKSBzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YTsKKwl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsIGlkcywKKwkJCShzZXNzaW9uLT5zbmRfbW9kZWxfc2l6ZSAtIHNpemVvZigqcGFyYW1fZCkpLAorCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmb2JtX21zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IHNuZF9tb2RlbF9yZWdpc3RlciBmYWlsZWQsICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfc2VuZF9wYXJhbV9kZXJlZ19tb2RlbCgKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJc3RydWN0IGNwZV9sc21faWRzICppZHMpCit7CisJc3RydWN0IGNtaV9oZHIgKmhkcjsKKwlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2Q7CisJdTggKm1lc3NhZ2U7CisJdTMyIHBsZF9zaXplOworCWludCByYyA9IDA7CisKKwlwbGRfc2l6ZSA9IHNpemVvZigqaGRyKSArIHNpemVvZigqcGFyYW1fZCk7CisKKwltZXNzYWdlID0ga3phbGxvYyhwbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZXNzYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IChzdHJ1Y3QgY21pX2hkciAqKSBtZXNzYWdlOworCXBhcmFtX2QgPSAoc3RydWN0IGNwZV9wYXJhbV9kYXRhICopCisJCQkoKCh1OCAqKSBtZXNzYWdlKSArIHNpemVvZigqaGRyKSk7CisKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoaGRyLAorCQkJCXNlc3Npb24tPmlkLAorCQkJCXNpemVvZigqcGFyYW1fZCksCisJCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JldDsKKwl9CisJd2NkX2NwZV9zZXRfcGFyYW1fZGF0YShwYXJhbV9kLCBpZHMsIDAsCisJCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyYyA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCBtZXNzYWdlKTsKKwlpZiAocmMpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBzbmRfbW9kZWxfZGVyZWdpc3RlciBmYWlsZWQsICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworZXJyX3JldDoKKwlrZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX2N1c3RvbV9wYXJhbSgKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJdm9pZCAqZGF0YSwgdTMyIG1zZ19zaXplKQoreworCXU4ICptc2c7CisJc3RydWN0IGNtaV9oZHIgKmhkcjsKKwl1OCAqbXNnX3BsZDsKKwlpbnQgcmM7CisKKwlpZiAobXNnX3NpemUgPiBDTUlfSU5CQU5EX01FU1NBR0VfU0laRSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogb3V0IG9mIGJhbmQgY3VzdG9tIHBhcmFtcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2cgPSBremFsbG9jKHNpemVvZigqaGRyKSArIG1zZ19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgbXNnOworCW1zZ19wbGQgPSBtc2cgKyBzaXplb2Yoc3RydWN0IGNtaV9oZHIpOworCisJaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKGhkciwKKwkJCQlzZXNzaW9uLT5pZCwKKwkJCQltc2dfc2l6ZSwKKwkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmV0OworCX0KKworCW1lbWNweShtc2dfcGxkLCBkYXRhLCBtc2dfc2l6ZSk7CisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgbXNnKTsKKwlpZiAocmMpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBjdXN0b20gcGFyYW1zIHNlbmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmMpOworCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CitlcnJfcmV0OgorCWtmcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfc2V0X29uZV9wYXJhbSh2b2lkICpjb3JlX2hhbmRsZSwKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8sCisJdm9pZCAqZGF0YSwgZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlKQoreworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjcGVfbHNtX2lkcyBpZHM7CisKKwltZW1zZXQoJmlkcywgMCwgc2l6ZW9mKGlkcykpOworCWlkcy5tb2R1bGVfaWQgPSBwX2luZm8tPm1vZHVsZV9pZDsKKwlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCisJc3dpdGNoIChwYXJhbV90eXBlKSB7CisJY2FzZSBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRDoKKwkJcmMgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fZXBkX3RocmVzKGNvcmUsIHNlc3Npb24sCisJCQkJCQlkYXRhLCAmaWRzKTsKKwkJYnJlYWs7CisJY2FzZSBMU01fT1BFUkFUSU9OX01PREU6IHsKKwkJc3RydWN0IGNwZV9sc21faWRzIGNvbm5lY3Rwb3J0X2lkczsKKworCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9vcG1vZGUoY29yZSwgc2Vzc2lvbiwKKwkJCQkJZGF0YSwgJmlkcyk7CisJCWlmIChyYykKKwkJCWJyZWFrOworCisJCWNvbm5lY3Rwb3J0X2lkcy5tb2R1bGVfaWQgPSBMU01fTU9EVUxFX0lEX0ZSQU1FV09SSzsKKwkJY29ubmVjdHBvcnRfaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0NPTk5FQ1RfVE9fUE9SVDsKKworCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9jb25uZWN0cG9ydChjb3JlLCBzZXNzaW9uLCBOVUxMLAorCQkJCSAgICAgICAmY29ubmVjdHBvcnRfaWRzLCBDUEVfQUZFX1BPUlRfMV9UWCk7CisJCWlmIChyYykKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogc2VuZF9wYXJhbV9jb25uZWN0cG9ydCBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisJY2FzZSBMU01fR0FJTjoKKwkJcmMgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fZ2Fpbihjb3JlLCBzZXNzaW9uLCBkYXRhLCAmaWRzKTsKKwkJYnJlYWs7CisJY2FzZSBMU01fTUlOX0NPTkZJREVOQ0VfTEVWRUxTOgorCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9jb25mX2xldmVscyhjb3JlLCBzZXNzaW9uLCAmaWRzKTsKKwkJYnJlYWs7CisJY2FzZSBMU01fUkVHX1NORF9NT0RFTDoKKwkJcmMgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fc25kX21vZGVsKGNvcmUsIHNlc3Npb24sICZpZHMpOworCQlicmVhazsKKwljYXNlIExTTV9ERVJFR19TTkRfTU9ERUw6CisJCXJjID0gd2NkX2NwZV9zZW5kX3BhcmFtX2RlcmVnX21vZGVsKGNvcmUsIHNlc3Npb24sICZpZHMpOworCQlicmVhazsKKwljYXNlIExTTV9DVVNUT01fUEFSQU1TOgorCQlyYyA9IHdjZF9jcGVfc2VuZF9jdXN0b21fcGFyYW0oY29yZSwgc2Vzc2lvbiwKKwkJCQkJICAgICAgIGRhdGEsIHBfaW5mby0+cGFyYW1fc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHdyb25nIHBhcmFtX3R5cGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3R5cGUpOworCX0KKworCWlmIChyYykKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IHNlbmRfcGFyYW0oJWQpIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJIF9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3R5cGUsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2xzbV9zZXRfcGFyYW1zOiBzZXQgdGhlIHBhcmFtZXRlcnMgZm9yIGxzbSBzZXJ2aWNlCisgKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggdGhlIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHNldAorICogQGRldGVjdF9tb2RlOiBtb2RlIGZvciBkZXRlY3Rpb24KKyAqIEBkZXRlY3RfZmFpbHVyZTogZmxhZyBpbmRpY2F0aW5nIGZhaWx1cmUgZGV0ZWN0aW9uIGVuYWJsZWQvZGlzYWJsZWQKKyAqCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9sc21fc2V0X3BhcmFtcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGUsIGJvb2wgZGV0ZWN0X2ZhaWx1cmUpCit7CisJc3RydWN0IGNwZV9sc21faWRzIGlkczsKKwlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3RfbW9kZSBkZXRfbW9kZTsKKworCWludCByZXQgPSAwOworCisJLyogU2VuZCBsc20gY2FsaWJyYXRpb24gKi8KKwlyZXQgPSB3Y2RfY3BlX3NlbmRfbHNtX2NhbChjb3JlLCBzZXNzaW9uKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gc2VudCBhY2RiIGNhbCwgZXJyID0gJWQiLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBTZW5kIG9wZXJhdGlvbiBtb2RlICovCisJaWRzLm1vZHVsZV9pZCA9IENQRV9MU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUDsKKwlpZHMucGFyYW1faWQgPSBDUEVfTFNNX1BBUkFNX0lEX09QRVJBVElPTl9NT0RFOworCWRldF9tb2RlLm1vZGUgPSBkZXRlY3RfbW9kZTsKKwlkZXRfbW9kZS5kZXRlY3RfZmFpbHVyZSA9IGRldGVjdF9mYWlsdXJlOworCXJldCA9IHdjZF9jcGVfc2VuZF9wYXJhbV9vcG1vZGUoY29yZSwgc2Vzc2lvbiwKKwkJCQkJJmRldF9tb2RlLCAmaWRzKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIHNldCBvcG1vZGUsIGVycj0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9sc21fc2V0X2RhdGEodm9pZCAqY29yZV9oYW5kbGUsCisJCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQllbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBkZXRlY3RfbW9kZSwKKwkJCQlib29sIGRldGVjdF9mYWlsdXJlKQoreworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlzdHJ1Y3QgY3BlX2xzbV9pZHMgaWRzOworCWludCByZXQgPSAwOworCisJaWYgKHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyA+IDApIHsKKwkJcmV0ID0gd2NkX2NwZV9sc21fc2V0X3BhcmFtcyhjb3JlLCBzZXNzaW9uLCBkZXRlY3RfbW9kZSwKKwkJCQkgICAgICAgZGV0ZWN0X2ZhaWx1cmUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IGxzbSBzZXQgcGFyYW1zIGZhaWxlZCwgcmMgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCisJCWlkcy5tb2R1bGVfaWQgPSBDUEVfTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVA7CisJCWlkcy5wYXJhbV9pZCA9IENQRV9MU01fUEFSQU1fSURfTUlOX0NPTkZJREVOQ0VfTEVWRUxTOworCQlyZXQgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fY29uZl9sZXZlbHMoY29yZSwgc2Vzc2lvbiwgJmlkcyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogbHNtIGNvbmZpZGVuY2UgbGV2ZWxzIGZhaWxlZCwgcmMgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoY29yZS0+ZGV2LAorCQkJIiVzOiBubyBjb25mIGxldmVscyB0byBzZXRcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2xzbV9yZWdfc25kX21vZGVsOiByZWdpc3RlciB0aGUgc291bmQgbW9kZWwgZm9yIGxpc3RlbgorICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBzb3VuZCBtb2RlbAorICogQGRldGVjdF9tb2RlOiBkZXRlY3Rpb24gbW9kZSwgdXNlciBkZXBlbmRlbnQvaW5kZXBlbmRlbnQKKyAqIEBkZXRlY3RfZmFpbHVyZTogZmxhZyB0byBpbmRpY2F0ZSBpZiBmYWlsdXJlIGRldGVjdGlvbiBpcyBlbmFibGVkCisgKgorICogVGhlIG1lbW9yeSByZXF1aXJlZCBmb3Igc291bmQgbW9kZWwgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQgb24gQ1BFCisgKiBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfbHNtX3JlZ19zbmRfbW9kZWwodm9pZCAqY29yZV9oYW5kbGUsCisJCQkJIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlIGRldGVjdF9tb2RlLAorCQkJCSBib29sIGRldGVjdF9mYWlsdXJlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjbWlfb2JtX21zZyBvYm1fbXNnOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKKwkJCQkJICAgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB3Y2RfY3BlX2xzbV9zZXRfZGF0YShjb3JlX2hhbmRsZSwgc2Vzc2lvbiwKKwkJCQkgICBkZXRlY3RfbW9kZSwgZGV0ZWN0X2ZhaWx1cmUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGZhaWwgdG8gc2V0IGxzbSBkYXRhLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJcmV0ID0gZmlsbF9jbWlfaGVhZGVyKCZvYm1fbXNnLmhkciwgc2Vzc2lvbi0+aWQsCisJCQlDTUlfQ1BFX0xTTV9TRVJWSUNFX0lELCAwLCAyMCwKKwkJCUNQRV9MU01fU0VTU0lPTl9DTURfUkVHSVNURVJfU09VTkRfTU9ERUwsIHRydWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcGFyYW1ldGVycywgcmMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJb2JtX21zZy5wbGQudmVyc2lvbiA9IDA7CisJb2JtX21zZy5wbGQuc2l6ZSA9IHNlc3Npb24tPnNuZF9tb2RlbF9zaXplOworCW9ibV9tc2cucGxkLmRhdGFfcHRyLmt2YWRkciA9IHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhOworCW9ibV9tc2cucGxkLm1lbV9oYW5kbGUgPSBzZXNzaW9uLT5sc21fbWVtX2hhbmRsZTsKKworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmb2JtX21zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IHNuZF9tb2RlbF9yZWdpc3RlciBmYWlsZWQsICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CitlcnJfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfbHNtX2RlcmVnX3NuZF9tb2RlbDogZGVyZWdpc3RlciB0aGUgc291bmQgbW9kZWwgZm9yIGxpc3RlbgorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gY3BlIGNvcmUKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCB0byBkZXJlZ2lzdGVyIHRoZSBzb3VuZCBtb2RlbAorICoKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2xzbV9kZXJlZ19zbmRfbW9kZWwodm9pZCAqY29yZV9oYW5kbGUsCisJCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgY21pX2hkciBjbWRfZGVyZWdfc25kX21vZGVsOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKKwkJCQkJICAgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKworCW1lbXNldCgmY21kX2RlcmVnX3NuZF9tb2RlbCwgMCwgc2l6ZW9mKGNtZF9kZXJlZ19zbmRfbW9kZWwpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9kZXJlZ19zbmRfbW9kZWwsIHNlc3Npb24tPmlkLAorCQkJICAgIDAsIENQRV9MU01fU0VTU0lPTl9DTURfREVSRUdJU1RFUl9TT1VORF9NT0RFTCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmRfcmV0OworCX0KKworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY21kX2RlcmVnX3NuZF9tb2RlbCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBzZW5kIGRlcmVnX3NuZF9tb2RlbCBjbWRcbiIsCisJCQlfX2Z1bmNfXyk7CitlbmRfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQ6IGdldCBhZmUgb3V0cHV0IHBvcnQgaWQKKyAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIHRoZSBDUEUgY29yZQorICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHBvcnQgaWQgbmVlZHMgdG8gZ2V0CisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9sc21fZ2V0X2FmZV9vdXRfcG9ydF9pZCh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCQkJICAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCWludCByYyA9IDA7CisKKwlpZiAoIWNvcmUgfHwgIWNvcmUtPmNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvICVzXG4iLAorCQkJX19mdW5jX18sCisJCQkoIWNvcmUpID8gImNvcmUiIDogImNvZGVjIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghc2Vzc2lvbikgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBJbnZhbGlkIHNlc3Npb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY29yZS0+Y3BlX2NkY19jYiB8fAorCQkhY29yZS0+Y3BlX2NkY19jYi0+Z2V0X2FmZV9vdXRfcG9ydF9pZCkgeworCQlzZXNzaW9uLT5hZmVfb3V0X3BvcnRfaWQgPSBXQ0RfQ1BFX0FGRV9PVVRfUE9SVF8yOworCQlkZXZfZGJnKGNvcmUtPmRldiwKKwkJCSIlczogY2FsbGJhY2sgbm90IGRlZmluZWQsIGRlZmF1bHQgcG9ydF9pZCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHNlc3Npb24tPmFmZV9vdXRfcG9ydF9pZCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljb2RlYyA9IGNvcmUtPmNvZGVjOworCXJjID0gY29yZS0+Y3BlX2NkY19jYi0+Z2V0X2FmZV9vdXRfcG9ydF9pZChjb2RlYywKKwkJCQkJCSAgICZzZXNzaW9uLT5hZmVfb3V0X3BvcnRfaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGdldCBwb3J0IGlkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisJZGV2X2RiZyhjb3JlLT5kZXYsICIlczogcG9ydF9pZDogJWRcbiIsIF9fZnVuY19fLAorCQlzZXNzaW9uLT5hZmVfb3V0X3BvcnRfaWQpOworCitkb25lOgorCXJldHVybiByYzsKK30KKworLyoKKyAqIHdjZF9jcGVfY21kX2xzbV9zdGFydDogc2VuZCB0aGUgc3RhcnQgY29tbWFuZCB0byBsc20KKyAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIHRoZSBDUEUgY29yZQorICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHN0YXJ0IGNvbW1hbmQgdG8gYmUgc2VudAorICoKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2NtZF9sc21fc3RhcnQodm9pZCAqY29yZV9oYW5kbGUsCisJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBjbWlfaGRyIGNtZF9sc21fc3RhcnQ7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJbWVtc2V0KCZjbWRfbHNtX3N0YXJ0LCAwLCBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKTsKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9sc21fc3RhcnQsIHNlc3Npb24tPmlkLCAwLAorCQkJCQkgIENQRV9MU01fU0VTU0lPTl9DTURfU1RBUlQpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9sc21fc3RhcnQpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29yZS0+ZGV2LCAiZmFpbGVkIHRvIHNlbmQgbHNtX3N0YXJ0IGNtZFxuIik7CitlbmRfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfY21kX2xzbV9zdG9wOiBzZW5kIHRoZSBzdG9wIGNvbW1hbmQgZm9yIExTTSBzZXJ2aWNlCisgKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgY3BlIGNvcmUKKyAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCBzdG9wIGNvbW1hbmQgdG8gYmUgc2VudAorICoKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2NtZF9sc21fc3RvcCh2b2lkICpjb3JlX2hhbmRsZSwKKwkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgY21pX2hkciBjbWRfbHNtX3N0b3A7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAorCQkJCQkgICBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJbWVtc2V0KCZjbWRfbHNtX3N0b3AsIDAsIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpOworCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZCgmY21kX2xzbV9zdG9wLCBzZXNzaW9uLT5pZCwgMCwKKwkJCQkJICBDUEVfTFNNX1NFU1NJT05fQ01EX1NUT1ApKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9sc21fc3RvcCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBzZW5kIGxzbV9zdG9wIGNtZFxuIiwKKwkJCV9fZnVuY19fKTsKK2VuZF9yZXQ6CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qCisgKiB3Y2RfY3BlX2FsbG9jX2xzbV9zZXNzaW9uOiBhbGxvY2F0ZSBhIGxzbSBzZXNzaW9uCisgKiBAY29yZTogaGFuZGxlIHRvIHdjZF9jcGVfY29yZQorICogQGxzbV9wcml2X2Q6IGxzbSBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKndjZF9jcGVfYWxsb2NfbHNtX3Nlc3Npb24oCisJdm9pZCAqY29yZV9oYW5kbGUsIHZvaWQgKmNsaWVudF9kYXRhLAorCXZvaWQgKCpldmVudF9jYikodm9pZCAqLCB1OCwgdTgsIHU4ICopKQoreworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb247CisJaW50IGksIHNlc3Npb25faWQgPSAtMTsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJYm9vbCBhZmVfcmVnaXN0ZXJfc2VydmljZSA9IGZhbHNlOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBFdmVuIGlmIG11bHRpcGxlIGxpc3RlbiBzZXNzaW9ucyBjYW4gYmUKKwkgKiBhbGxvY2F0ZWQsIHRoZSBBRkUgc2VydmljZSByZWdpc3RyYXRpb24KKwkgKiBzaG91bGQgYmUgZG9uZSBvbmx5IG9uY2UgYXMgQ1BFIGNhbiBvbmx5CisJICogaGF2ZSBvbmUgaW5zdGFuY2Ugb2YgQUZFIHNlcnZpY2UuCisJICoKKwkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzZXNzaW9uIHRvIGJlIGFsbG9jYXRlZCwKKwkgKiBvbmx5IHRoZW4gcmVnaXN0ZXIgdGhlIGFmZSBzZXJ2aWNlLgorCSAqLworCWlmICghd2NkX2NwZV9sc21fc2Vzc2lvbl9hY3RpdmUoKSkKKwkJYWZlX3JlZ2lzdGVyX3NlcnZpY2UgPSB0cnVlOworCisJZm9yIChpID0gMTsgaSA8PSBXQ0RfQ1BFX0xTTV9NQVhfU0VTU0lPTlM7IGkrKykgeworCQlpZiAoIWxzbV9zZXNzaW9uc1tpXSkgeworCQkJc2Vzc2lvbl9pZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzZXNzaW9uX2lkIDwgMCkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogbWF4IGFsbG93ZWQgc2Vzc2lvbnMgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldCA9IHdjZF9jcGVfdm90ZShjb3JlLCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNwZSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2Vzc2lvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pCisJCWdvdG8gZXJyX3Nlc3Npb25fYWxsb2M7CisKKwlzZXNzaW9uLT5pZCA9IHNlc3Npb25faWQ7CisJc2Vzc2lvbi0+ZXZlbnRfY2IgPSBldmVudF9jYjsKKwlzZXNzaW9uLT5jbWlfcmVnX2hhbmRsZSA9IGNtaV9yZWdpc3Rlcih3Y2RfY3BlX2NtaV9sc21fY2FsbGJhY2ssCisJCQkJCQlDTUlfQ1BFX0xTTV9TRVJWSUNFX0lEKTsKKwlpZiAoIXNlc3Npb24tPmNtaV9yZWdfaGFuZGxlKSB7CisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgTFNNIHNlcnZpY2Ugd2l0aCBDTUlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3JldDsKKwl9CisJc2Vzc2lvbi0+cHJpdl9kID0gY2xpZW50X2RhdGE7CisJbXV0ZXhfaW5pdCgmc2Vzc2lvbi0+bHNtX2xvY2spOworCWlmIChhZmVfcmVnaXN0ZXJfc2VydmljZSkgeworCQkvKiBSZWdpc3RlciBmb3IgQUZFIFNlcnZpY2UgKi8KKwkJY29yZS0+Y21pX2FmZV9oYW5kbGUgPSBjbWlfcmVnaXN0ZXIod2NkX2NwZV9jbWlfYWZlX2NiLAorCQkJCQkJQ01JX0NQRV9BRkVfU0VSVklDRV9JRCk7CisJCXdjZF9jcGVfaW5pdGlhbGl6ZV9hZmVfcG9ydF9kYXRhKCk7CisJCWlmICghY29yZS0+Y21pX2FmZV9oYW5kbGUpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIEFGRSBzZXJ2aWNlIHdpdGggQ01JXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2FmZV9zdmNfcmVnOworCQl9CisKKwkJLyogT25jZSBBRkUgc2VydmljZSBpcyByZWdpc3RlcmVkLCBzZW5kIHRoZSBtb2RlIGNvbW1hbmQgKi8KKwkJcmV0ID0gd2NkX2NwZV9hZmVfc3ZjX2NtZF9tb2RlKGNvcmUsCisJCQkJQUZFX1NWQ19FWFBMSUNJVF9QT1JUX1NUQVJUKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2FmZV9tb2RlX2NtZDsKKwl9CisKKwlzZXNzaW9uLT5sc21fbWVtX2hhbmRsZSA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZzZXNzaW9uLT5jbWRfY29tcCk7CisKKwlsc21fc2Vzc2lvbnNbc2Vzc2lvbl9pZF0gPSBzZXNzaW9uOworCXJldHVybiBzZXNzaW9uOworCitlcnJfYWZlX21vZGVfY21kOgorCWNtaV9kZXJlZ2lzdGVyKGNvcmUtPmNtaV9hZmVfaGFuZGxlKTsKKworZXJyX2FmZV9zdmNfcmVnOgorCWNtaV9kZXJlZ2lzdGVyKHNlc3Npb24tPmNtaV9yZWdfaGFuZGxlKTsKKwltdXRleF9kZXN0cm95KCZzZXNzaW9uLT5sc21fbG9jayk7CisKK2Vycl9yZXQ6CisJa2ZyZWUoc2Vzc2lvbik7CisKK2Vycl9zZXNzaW9uX2FsbG9jOgorCXdjZF9jcGVfdm90ZShjb3JlLCBmYWxzZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2xzbV9jb25maWdfbGFiX2xhdGVuY3k6IHNlbmQgbGFiIGxhdGVuY3kgdmFsdWUKKyAqIEBjb3JlOiBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCisgKiBAc2Vzc2lvbjogbHNtIHNlc3Npb24KKyAqIEBsYXRlbmN5OiB0aGUgdmFsdWUgb2YgbGF0ZW5jeSBmb3IgbGFiIHNldHVwIGluIG1zZWMKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2xzbV9jb25maWdfbGFiX2xhdGVuY3koCisJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCXUzMiBsYXRlbmN5KQoreworCWludCByZXQgPSAwLCBwbGRfc2l6ZSA9IENQRV9QQVJBTV9MU01fTEFCX0xBVEVOQ1lfU0laRTsKKwlzdHJ1Y3QgY3BlX2xzbV9sYWJfbGF0ZW5jeV9jb25maWcgY3BlX2xhYl9sYXRlbmN5OworCXN0cnVjdCBjcGVfbHNtX2xhYl9jb25maWcgKmxhYl9sYXQgPSAmY3BlX2xhYl9sYXRlbmN5LmxhdGVuY3lfY2ZnOworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9ICZsYWJfbGF0LT5wYXJhbTsKKwlzdHJ1Y3QgY3BlX2xzbV9pZHMgaWRzOworCisJaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjcGVfbGFiX2xhdGVuY3kuaGRyLCBzZXNzaW9uLT5pZCwKKwkJKHU4KSBwbGRfc2l6ZSwgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGhlYWRlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxhdGVuY3kgPT0gMHgwMCB8fCBsYXRlbmN5ID4gV0NEX0NQRV9MQUJfTUFYX0xBVEVOQ1kpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBsYXRlbmN5ICV1XG4iLAorCQkJX19mdW5jX18sIGxhdGVuY3kpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsYWJfbGF0LT5sYXRlbmN5ID0gbGF0ZW5jeTsKKwlsYWJfbGF0LT5taW5vcl92ZXIgPSAxOworCWlkcy5tb2R1bGVfaWQgPSBDUEVfTFNNX01PRFVMRV9JRF9MQUI7CisJaWRzLnBhcmFtX2lkID0gQ1BFX0xTTV9QQVJBTV9JRF9MQUJfQ09ORklHOworCXdjZF9jcGVfc2V0X3BhcmFtX2RhdGEocGFyYW1fZCwgJmlkcywKKwkJCSAgICAgICBQQVJBTV9TSVpFX0xTTV9MQVRFTkNZX1NJWkUsCisJCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKworCXByX2RlYnVnKCIlczogTW9kdWxlIDB4JXggUGFyYW0gMHgleCBzaXplICV6dSBwbGRfc2l6ZSAweCV4XG4iLAorCQkgIF9fZnVuY19fLCBsYWJfbGF0LT5wYXJhbS5tb2R1bGVfaWQsCisJCSBsYWJfbGF0LT5wYXJhbS5wYXJhbV9pZCwgUEFSQU1fU0laRV9MU01fTEFURU5DWV9TSVpFLAorCQkgcGxkX3NpemUpOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjcGVfbGFiX2xhdGVuY3kpOworCWlmIChyZXQgIT0gMCkKKwkJcHJfZXJyKCIlczogbHNtX3NldF9wYXJhbXMgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9sc21fbGFiX2NvbnRyb2w6IGVuYWJsZS9kaXNhYmxlIGxhYgorICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKKyAqIEBzZXNzaW9uOiBsc20gc2Vzc2lvbgorICogQGVuYWJsZTogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIC8gZGlzYWJsZSBsYWIKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2xzbV9sYWJfY29udHJvbCgKKwkJdm9pZCAqY29yZV9oYW5kbGUsCisJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCisJCWJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlpbnQgcmV0ID0gMCwgcGxkX3NpemUgPSBDUEVfUEFSQU1fU0laRV9MU01fTEFCX0NPTlRST0w7CisJc3RydWN0IGNwZV9sc21fY29udHJvbF9sYWIgY3BlX2xhYl9lbmFibGU7CisJc3RydWN0IGNwZV9sc21fbGFiX2VuYWJsZSAqbGFiX2VuYWJsZSA9ICZjcGVfbGFiX2VuYWJsZS5sYWJfZW5hYmxlOworCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9ICZsYWJfZW5hYmxlLT5wYXJhbTsKKwlzdHJ1Y3QgY3BlX2xzbV9pZHMgaWRzOworCisJcHJfZGVidWcoIiVzOiBlbnRlciBwYXlsb2FkX3NpemUgPSAlZCBFbmFibGUgJWRcbiIsCisJCSBfX2Z1bmNfXywgcGxkX3NpemUsIGVuYWJsZSk7CisKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNwZV9sYWJfZW5hYmxlLmhkciwgc2Vzc2lvbi0+aWQsCisJCSh1OCkgcGxkX3NpemUsIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlbmFibGUgPT0gdHJ1ZSkKKwkJbGFiX2VuYWJsZS0+ZW5hYmxlID0gMTsKKwllbHNlCisJCWxhYl9lbmFibGUtPmVuYWJsZSA9IDA7CisKKwlpZHMubW9kdWxlX2lkID0gQ1BFX0xTTV9NT0RVTEVfSURfTEFCOworCWlkcy5wYXJhbV9pZCA9IENQRV9MU01fUEFSQU1fSURfTEFCX0VOQUJMRTsKKwl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsICZpZHMsCisJCQlQQVJBTV9TSVpFX0xTTV9DT05UUk9MX1NJWkUsCisJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCisJcHJfZGVidWcoIiVzOiBNb2R1bGUgMHgleCwgUGFyYW0gMHgleCBzaXplICV6dSBwbGRfc2l6ZSAweCV4XG4iLAorCQkgX19mdW5jX18sIGxhYl9lbmFibGUtPnBhcmFtLm1vZHVsZV9pZCwKKwkJIGxhYl9lbmFibGUtPnBhcmFtLnBhcmFtX2lkLCBQQVJBTV9TSVpFX0xTTV9DT05UUk9MX1NJWkUsCisJCSBwbGRfc2l6ZSk7CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNwZV9sYWJfZW5hYmxlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZXJyKCIlczogbHNtX3NldF9wYXJhbXMgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJCWdvdG8gZG9uZTsKKwl9CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKworCWlmIChsYWJfZW5hYmxlLT5lbmFibGUpCisJCXJldCA9IHdjZF9jcGVfbHNtX2NvbmZpZ19sYWJfbGF0ZW5jeShjb3JlLCBzZXNzaW9uLAorCQkJCQkgICAgICAgV0NEX0NQRV9MQUJfTUFYX0xBVEVOQ1kpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9sc21fZW9iOiBzdG9wIGxhYgorICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKKyAqIEBzZXNzaW9uOiBsc20gc2Vzc2lvbiB0byBiZSBkZWFsbG9jYXRlZAorICovCitzdGF0aWMgaW50IHdjZF9jcGVfbHNtX2VvYigKKwkJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCisJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjbWlfaGRyIGxhYl9lb2I7CisKKwlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmxhYl9lb2IsIHNlc3Npb24tPmlkLAorCQkwLCBDUEVfTFNNX1NFU1NJT05fQ01EX0VPQikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZsYWJfZW9iKTsKKwlpZiAocmV0ICE9IDApCisJCXByX2VycigiJXM6IGxzbV9zZXRfcGFyYW1zIGZhaWxlZFxuIiwgX19mdW5jX18pOworCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uOiBkZWFsbG9jYXRlIGxzbSBzZXNzaW9uCisgKiBAY29yZTogaGFuZGxlIHRvIHdjZF9jcGVfY29yZQorICogQHNlc3Npb246IGxzbSBzZXNzaW9uIHRvIGJlIGRlYWxsb2NhdGVkCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXNlc3Npb24pIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEludmFsaWQgbHNtIHNlc3Npb25cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhjb3JlLT5kZXYsICIlczogc2Vzc2lvbiAlZCBiZWluZyBkZWFsbG9jYXRlZFxuIiwKKwkJX19mdW5jX18sIHNlc3Npb24tPmlkKTsKKwlpZiAoc2Vzc2lvbi0+aWQgPiBXQ0RfQ1BFX0xTTV9NQVhfU0VTU0lPTlMpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IFdyb25nIHNlc3Npb24gaWQgJWQgbWF4IGFsbG93ZWQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBzZXNzaW9uLT5pZCwKKwkJCVdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNtaV9kZXJlZ2lzdGVyKHNlc3Npb24tPmNtaV9yZWdfaGFuZGxlKTsKKwltdXRleF9kZXN0cm95KCZzZXNzaW9uLT5sc21fbG9jayk7CisJbHNtX3Nlc3Npb25zW3Nlc3Npb24tPmlkXSA9IE5VTEw7CisJa2ZyZWUoc2Vzc2lvbik7CisKKwlpZiAoIXdjZF9jcGVfbHNtX3Nlc3Npb25fYWN0aXZlKCkpIHsKKwkJY21pX2RlcmVnaXN0ZXIoY29yZS0+Y21pX2FmZV9oYW5kbGUpOworCQljb3JlLT5jbWlfYWZlX2hhbmRsZSA9IE5VTEw7CisJCXdjZF9jcGVfZGVpbml0aWFsaXplX2FmZV9wb3J0X2RhdGEoKTsKKwl9CisKKwlyZXQgPSB3Y2RfY3BlX3ZvdGUoY29yZSwgZmFsc2UpOworCWlmIChyZXQpCisJCWRldl9kYmcoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gdW4tdm90ZSBjcGUsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfbGFiX2NoX3NldHVwKHZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQllbnVtIHdjZF9jcGVfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmMgPSAwOworCXU4IGNwZV9pbnRyX2JpdHM7CisKKwlpZiAoIWNvcmUgfHwgIWNvcmUtPmNvZGVjKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvICVzXG4iLAorCQkJX19mdW5jX18sCisJCQkoIWNvcmUpID8gImNvcmUiIDogImNvZGVjIik7CisJCXJjID0gRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFjb3JlLT5jcGVfY2RjX2NiIHx8CisJICAgICFjb3JlLT5jcGVfY2RjX2NiLT5jZGNfZXh0X2NsayB8fAorCSAgICAhY29yZS0+Y3BlX2NkY19jYi0+bGFiX2NkY19jaF9jdGwpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IEludmFsaWQgY29kZWMgY2FsbGJhY2tzXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljb2RlYyA9IGNvcmUtPmNvZGVjOworCWRldl9kYmcoY29yZS0+ZGV2LAorCQkiJXM6IGV2ZW50ID0gMHgleFxuIiwKKwkJX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFdDRF9DUEVfUFJFX0VOQUJMRToKKwkJcmMgPSBjb3JlLT5jcGVfY2RjX2NiLT5jZGNfZXh0X2Nsayhjb2RlYywgdHJ1ZSwgZmFsc2UpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSBjZGMgY2xrLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmMgPSBjb3JlLT5jcGVfY2RjX2NiLT5sYWJfY2RjX2NoX2N0bChjb2RlYywKKwkJCQkJCSAgICAgIHRydWUpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSBjZGMgcG9ydCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJjID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2V4dF9jbGsoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgV0NEX0NQRV9QT1NUX0VOQUJMRToKKwkJcmMgPSBjcGVfc3ZjX3RvZ2dsZV9sYWIoY29yZS0+Y3BlX2hhbmRsZSwgdHJ1ZSk7CisJCWlmIChyYykKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGxhYlxuIiwgX19mdW5jX18pOworCQlicmVhazsKKworCWNhc2UgV0NEX0NQRV9QUkVfRElTQUJMRToKKwkJLyoKKwkJICogTWFzayB0aGUgbm9uLWZhdGFsIGludGVycnVwdHMgaW4gQ1BFIGFzIHRoZXkgd2lsbAorCQkgKiBiZSBnZW5lcmF0ZWQgZHVyaW5nIGxhYiB0ZWFyZG93biBhbmQgbWF5IGZsb29kLgorCQkgKi8KKwkJY3BlX2ludHJfYml0cyA9IH4oY29yZS0+aXJxX2luZm8uY3BlX2ZhdGFsX2lycXMgJiAweEZGKTsKKwkJaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQorCQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKKwkJCQkJCWNvcmUtPmNvZGVjLAorCQkJCQkJQ1BFX0VSUl9JUlFfTUFTSywKKwkJCQkJCSZjcGVfaW50cl9iaXRzKTsKKworCQlyYyA9IGNvcmUtPmNwZV9jZGNfY2ItPmxhYl9jZGNfY2hfY3RsKGNvZGVjLAorCQkJCQkJICAgICAgZmFsc2UpOworCQlpZiAocmMpCisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byBkaXNhYmxlIGNkYyBwb3J0LCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKworCWNhc2UgV0NEX0NQRV9QT1NUX0RJU0FCTEU6CisJCXJjID0gd2NkX2NwZV9sc21fZW9iKGNvcmUsIHNlc3Npb24pOworCQlpZiAocmMpCisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IGVvYiBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKworCQkvKiBDb250aW51ZSB0ZWFyZG93biBldmVuIGlmIGVvYiBmYWlsZWQgKi8KKwkJcmMgPSBjcGVfc3ZjX3RvZ2dsZV9sYWIoY29yZS0+Y3BlX2hhbmRsZSwgZmFsc2UpOworCQlpZiAocmMpCisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGRpc2FibGUgbGFiXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogQ29udGludWUgd2l0aCBkaXNhYmxpbmcgZXZlbiBpZiB0b2dnbGUgbGFiIGZhaWxzICovCisJCXJjID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2V4dF9jbGsoY29kZWMsIGZhbHNlLCBmYWxzZSk7CisJCWlmIChyYykKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIGRpc2FibGUgY2RjIGNsaywgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKworCQkvKiBVbm1hc2sgbm9uLWZhdGFsIENQRSBpbnRlcnJ1cHRzICovCisJCWNwZV9pbnRyX2JpdHMgPSB+KGNvcmUtPmlycV9pbmZvLmNwZV9mYXRhbF9pcnFzICYgMHhGRik7CisJCWlmIChDUEVfRVJSX0lSUV9DQihjb3JlKSkKKwkJCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woCisJCQkJCQljb3JlLT5jb2RlYywKKwkJCQkJCUNQRV9FUlJfSVJRX1VOTUFTSywKKwkJCQkJCSZjcGVfaW50cl9iaXRzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogSW52YWxpZCBldmVudCAweCV4XG4iLAorCQkJX19mdW5jX18sIGV2ZW50KTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdjZF9jcGVfbHNtX3NldF9mbXRfY2ZnKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjcGVfbHNtX291dHB1dF9mb3JtYXRfY2ZnIG91dF9mbXRfY2ZnOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwgX19mdW5jX18pOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOworCisJbWVtc2V0KCZvdXRfZm10X2NmZywgMCwgc2l6ZW9mKG91dF9mbXRfY2ZnKSk7CisJaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZvdXRfZm10X2NmZy5oZHIsCisJCQlzZXNzaW9uLT5pZCwgT1VUX0ZNVF9DRkdfQ01EX1BBWUxPQURfU0laRSwKKwkJCUNQRV9MU01fU0VTU0lPTl9DTURfVFhfQlVGRl9PVVRQVVRfQ09ORklHKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJb3V0X2ZtdF9jZmcuZm9ybWF0ID0gc2Vzc2lvbi0+b3V0X2ZtdF9jZmcuZm9ybWF0OworCW91dF9mbXRfY2ZnLnBhY2tpbmcgPSBzZXNzaW9uLT5vdXRfZm10X2NmZy5wYWNrX21vZGU7CisJb3V0X2ZtdF9jZmcuZGF0YV9wYXRoX2V2ZW50cyA9IHNlc3Npb24tPm91dF9mbXRfY2ZnLmRhdGFfcGF0aF9ldmVudHM7CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm91dF9mbXRfY2ZnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogbHNtX3NldF9vdXRwdXRfZm9ybWF0X2NmZyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKK2Vycl9yZXQ6CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgd2NkX2NwZV9zbmRfbW9kZWxfb2Zmc2V0KHZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLCBzaXplX3QgKm9mZnNldCkKK3sKKwkqb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9sc21fc2V0X21lZGlhX2ZtdF9wYXJhbXModm9pZCAqY29yZV9oYW5kbGUsCisJCQkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICBzdHJ1Y3QgbHNtX2h3X3BhcmFtcyAqcGFyYW0pCit7CisJc3RydWN0IGNwZV9sc21fbWVkaWFfZm10X3BhcmFtIG1lZGlhX2ZtdDsKKwlzdHJ1Y3QgY21pX2hkciAqbXNnX2hkciA9ICZtZWRpYV9mbXQuaGRyOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPSAmbWVkaWFfZm10LnBhcmFtOworCXN0cnVjdCBjcGVfbHNtX2lkcyBpZHM7CisJaW50IHJldDsKKworCW1lbXNldCgmbWVkaWFfZm10LCAwLCBzaXplb2YobWVkaWFfZm10KSk7CisJaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKG1zZ19oZHIsCisJCQkJc2Vzc2lvbi0+aWQsCisJCQkJQ1BFX01FRElBX0ZNVF9QTERfU0laRSwKKwkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltZW1zZXQoJmlkcywgMCwgc2l6ZW9mKGlkcykpOworCWlkcy5tb2R1bGVfaWQgPSBDUEVfTFNNX01PRFVMRV9GUkFNRVdPUks7CisJaWRzLnBhcmFtX2lkID0gQ1BFX0xTTV9QQVJBTV9JRF9NRURJQV9GTVQ7CisKKwl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsICZpZHMsIENQRV9NRURJQV9GTVRfUEFSQU1fU0laRSwKKwkJCSAgICAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCisJbWVkaWFfZm10Lm1pbm9yX3ZlcnNpb24gPSAxOworCW1lZGlhX2ZtdC5zYW1wbGVfcmF0ZSA9IHBhcmFtLT5zYW1wbGVfcmF0ZTsKKwltZWRpYV9mbXQubnVtX2NoYW5uZWxzID0gcGFyYW0tPm51bV9jaHM7CisJbWVkaWFfZm10LmJpdF93aWR0aCA9IHBhcmFtLT5iaXRfd2lkdGg7CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm1lZGlhX2ZtdCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IFNldF9wYXJhbShtZWRpYV9mb3JtYXQpIGZhaWxlZCwgZXJyPSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y2RfY3BlX2xzbV9zZXRfcG9ydCh2b2lkICpjb3JlX2hhbmRsZSwKKwkJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLCB2b2lkICpkYXRhKQoreworCXUzMiBwb3J0X2lkOworCWludCByZXQ7CisJc3RydWN0IGNwZV9sc21faWRzIGlkczsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisKKwlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sIF9fZnVuY19fKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcG9ydF9pZCA9ICoodTMyICopZGF0YTsKKwlkZXZfZGJnKGNvcmUtPmRldiwgIiVzOiBwb3J0X2lkOiAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJbWVtc2V0KCZpZHMsIDAsIHNpemVvZihpZHMpKTsKKwlpZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9GUkFNRVdPUks7CisJaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0NPTk5FQ1RfVE9fUE9SVDsKKworCXJldCA9IHdjZF9jcGVfc2VuZF9wYXJhbV9jb25uZWN0cG9ydChjb3JlLCBzZXNzaW9uLCBOVUxMLAorCQkJCQkgICAgICZpZHMsIHBvcnRfaWQpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBzZW5kX3BhcmFtX2Nvbm5lY3Rwb3J0IGZhaWxlZCwgZXJyICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2dldF9sc21fb3BzOiByZWdpc3RlciBsc20gZHJpdmVyIHRvIGNvZGVjCisgKiBAbHNtX29wczogc3RydWN0dXJlIHdpdGggbHNtIGNhbGxiYWNrcworICogQGNvZGVjOiBjb2RlYyB0byB3aGljaCB0aGlzIGxzbSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB0bworICovCitpbnQgd2NkX2NwZV9nZXRfbHNtX29wcyhzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzKQoreworCWxzbV9vcHMtPmxzbV9hbGxvY19zZXNzaW9uID0gd2NkX2NwZV9hbGxvY19sc21fc2Vzc2lvbjsKKwlsc21fb3BzLT5sc21fZGVhbGxvY19zZXNzaW9uID0gd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uOworCWxzbV9vcHMtPmxzbV9vcGVuX3R4ID0gd2NkX2NwZV9jbWRfbHNtX29wZW5fdHg7CisJbHNtX29wcy0+bHNtX2Nsb3NlX3R4ID0gd2NkX2NwZV9jbWRfbHNtX2Nsb3NlX3R4OworCWxzbV9vcHMtPmxzbV9zaG1lbV9hbGxvYyA9IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9hbGxvYzsKKwlsc21fb3BzLT5sc21fc2htZW1fZGVhbGxvYyA9IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9kZWFsbG9jOworCWxzbV9vcHMtPmxzbV9yZWdpc3Rlcl9zbmRfbW9kZWwgPSB3Y2RfY3BlX2xzbV9yZWdfc25kX21vZGVsOworCWxzbV9vcHMtPmxzbV9kZXJlZ2lzdGVyX3NuZF9tb2RlbCA9IHdjZF9jcGVfbHNtX2RlcmVnX3NuZF9tb2RlbDsKKwlsc21fb3BzLT5sc21fZ2V0X2FmZV9vdXRfcG9ydF9pZCA9IHdjZF9jcGVfbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQ7CisJbHNtX29wcy0+bHNtX3N0YXJ0ID0gd2NkX2NwZV9jbWRfbHNtX3N0YXJ0OworCWxzbV9vcHMtPmxzbV9zdG9wID0gd2NkX2NwZV9jbWRfbHNtX3N0b3A7CisJbHNtX29wcy0+bHNtX2xhYl9jb250cm9sID0gd2NkX2NwZV9sc21fbGFiX2NvbnRyb2w7CisJbHNtX29wcy0+bGFiX2NoX3NldHVwID0gd2NkX2NwZV9sYWJfY2hfc2V0dXA7CisJbHNtX29wcy0+bHNtX3NldF9kYXRhID0gd2NkX2NwZV9sc21fc2V0X2RhdGE7CisJbHNtX29wcy0+bHNtX3NldF9mbXRfY2ZnID0gd2NkX2NwZV9sc21fc2V0X2ZtdF9jZmc7CisJbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0gPSB3Y2RfY3BlX3NldF9vbmVfcGFyYW07CisJbHNtX29wcy0+bHNtX2dldF9zbmRfbW9kZWxfb2Zmc2V0ID0gd2NkX2NwZV9zbmRfbW9kZWxfb2Zmc2V0OworCWxzbV9vcHMtPmxzbV9zZXRfbWVkaWFfZm10X3BhcmFtcyA9IHdjZF9jcGVfbHNtX3NldF9tZWRpYV9mbXRfcGFyYW1zOworCWxzbV9vcHMtPmxzbV9zZXRfcG9ydCA9IHdjZF9jcGVfbHNtX3NldF9wb3J0OworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHdjZF9jcGVfZ2V0X2xzbV9vcHMpOworCitzdGF0aWMgaW50IGZpbGxfYWZlX2NtZF9oZWFkZXIoc3RydWN0IGNtaV9oZHIgKmhkciwgdTggcG9ydF9pZCwKKwkJCQl1MTYgb3Bjb2RlLCB1OCBwbGRfc2l6ZSwKKwkJCQlib29sIG9ibV9mbGFnKQoreworCUNNSV9IRFJfU0VUX1NFU1NJT04oaGRyLCBwb3J0X2lkKTsKKwlDTUlfSERSX1NFVF9TRVJWSUNFKGhkciwgQ01JX0NQRV9BRkVfU0VSVklDRV9JRCk7CisKKwlDTUlfSERSX1NFVF9QQVlMT0FEX1NJWkUoaGRyLCBwbGRfc2l6ZSk7CisKKwloZHItPm9wY29kZSA9IG9wY29kZTsKKworCWlmIChvYm1fZmxhZykKKwkJQ01JX0hEUl9TRVRfT0JNKGhkciwgQ01JX09CTV9GTEFHX09VVF9CQU5EKTsKKwllbHNlCisJCUNNSV9IRFJfU0VUX09CTShoZHIsIENNSV9PQk1fRkxBR19JTl9CQU5EKTsKKworCXJldHVybiAwOworfQorCisvKgorICogd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnOiBzZW5kIG1lc3NhZ2UgdG8gQUZFIHNlcnZpY2UKKyAqIEBjb3JlOiB3Y2QgY3BlIGNvcmUgaGFuZGxlCisgKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0CisgKgkgICAgICBmb3Igd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKKyAqIEBtZXNzYWdlOiBhY3R1YWwgbWVzc2FnZSB3aXRoIGhlYWRlciBhbmQgcGF5bG9hZAorICoKKyAqIFBvcnQgc3BlY2lmaWMgbG9jayBuZWVkcyB0byBiZSBhY3F1aXJlZCBiZWZvcmUgdGhpcworICogZnVuY3Rpb24gY2FuIGJlIGludm9rZWQKKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coCisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QsCisJdm9pZCAqbWVzc2FnZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY21pX2hkciAqaGRyID0gbWVzc2FnZTsKKworCXByX2RlYnVnKCIlczogc2VuZGluZyBtZXNzYWdlIHdpdGggb3Bjb2RlIDB4JXhcbiIsCisJCV9fZnVuY19fLCBoZHItPm9wY29kZSk7CisKKwlpZiAodW5saWtlbHkoIXdjZF9jcGVfaXNfb25saW5lX3N0YXRlKGNvcmUpKSkgeworCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBDUEUgb2ZmbGluZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoQ01JX0hEUl9HRVRfT0JNX0ZMQUcoaGRyKSkKKwkJd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoY29yZSwgdHJ1ZSk7CisKKwlyZXQgPSBjbWlfc2VuZF9tc2cobWVzc2FnZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBjbWQgMHgleCBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUsIHJldCk7CisJCWdvdG8gcmVsX2J1c192b3RlOworCX0KKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlLAorCQkJCQkgIENNSV9DTURfVElNRU9VVCk7CisJaWYgKHJldCA+IDApIHsKKwkJcHJfZGVidWcoIiVzOiBjb21tYW5kIDB4JXgsIHJlY2VpdmVkIHJlc3BvbnNlIDB4JXhcbiIsCisJCQkgX19mdW5jX18sIGhkci0+b3Bjb2RlLCBwb3J0X2QtPmNtZF9yZXN1bHQpOworCQlpZiAocG9ydF9kLT5jbWRfcmVzdWx0ID09IENNSV9TSE1FTV9BTExPQ19GQUlMRUQpCisJCQlwb3J0X2QtPmNtZF9yZXN1bHQgPSBDUEVfRU5PTUVNT1JZOworCQlpZiAocG9ydF9kLT5jbWRfcmVzdWx0ID4gMCkKKwkJCXByX2VycigiJXM6IENQRSByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGNwZV9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJcG9ydF9kLT5jbWRfcmVzdWx0KSk7CisJCXJldCA9IGNwZV9lcnJfZ2V0X2xueF9lcnJfY29kZShwb3J0X2QtPmNtZF9yZXN1bHQpOworCQlnb3RvIHJlbF9idXNfdm90ZTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBjb21tYW5kIDB4JXggc2VuZCB0aW1lZCBvdXRcbiIsCisJCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUpOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIHJlbF9idXNfdm90ZTsKKwl9CisKK3JlbF9idXNfdm90ZToKKwlyZWluaXRfY29tcGxldGlvbigmcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlKTsKKworCWlmIChDTUlfSERSX0dFVF9PQk1fRkxBRyhoZHIpKQorCQl3Y2RfY3BlX2J1c192b3RlX21heF9idyhjb3JlLCBmYWxzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKworLyoKKyAqIHdjZF9jcGVfYWZlX3NobWVtX2FsbG9jOiBhbGxvY2F0ZSB0aGUgY3BlIG1lbW9yeSBmb3IgYWZlIHNlcnZpY2UKKyAqIEBjb3JlOiBoYW5kbGUgdG8gY3BlIGNvcmUKKyAqIEBwb3J0X2NmZzogY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgcG9ydCB3aGljaCBuZWVkcworICoJICAgICAgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBvbiBDUEUKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc2htZW1fYWxsb2MoCisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QsCisJdTMyIHNpemUpCit7CisJc3RydWN0IGNwZV9jbWRfc2htZW1fYWxsb2MgY21kX3NobWVtX2FsbG9jOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOiBlbnRlcjogc2l6ZSA9ICVkXG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisKKwltZW1zZXQoJmNtZF9zaG1lbV9hbGxvYywgMCwgc2l6ZW9mKGNtZF9zaG1lbV9hbGxvYykpOworCWlmIChmaWxsX2FmZV9jbWRfaGVhZGVyKCZjbWRfc2htZW1fYWxsb2MuaGRyLCBwb3J0X2QtPnBvcnRfaWQsCisJCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9TSEFSRURfTUVNX0FMTE9DLAorCQkJICAgIFNITUVNX0FMTE9DX0NNRF9QTERfU0laRSwgZmFsc2UpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwljbWRfc2htZW1fYWxsb2Muc2l6ZSA9IHNpemU7CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgcG9ydF9kLCAmY21kX3NobWVtX2FsbG9jKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGFmZV9zaG1lbV9hbGxvYyBmYWlsLHJldCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZW5kX3JldDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGNvbXBsZXRlZCAlcywgbWVtX2hhbmRsZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLCAiQ1BFX0FGRV9DTURfU0hBUkVEX01FTV9BTExPQyIsCisJCXBvcnRfZC0+bWVtX2hhbmRsZSk7CisKK2VuZF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2M6IGRlYWxsb2NhdGUgdGhlIGNwZSBtZW1vcnkgZm9yCisgKgkJCSAgICAgIGFmZSBzZXJ2aWNlCisgKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAcG9ydF9kOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IHdoaWNoIG5lZWRzCisgKgkgICAgICBtZW1vcnkgdG8gYmUgZGVhbGxvY2F0ZWQgb24gQ1BFCisgKiBUaGUgbWVtb3J5IGhhbmRsZSB0byBiZSBkZS1hbGxvY2F0ZWQgaXMgc2F2ZWQgaW4gdGhlCisgKiBwb3J0IGNvbmZpZ3VyYXRpb24gZGF0YQorICovCitzdGF0aWMgaW50IHdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2MoCisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QpCit7CisJc3RydWN0IGNwZV9jbWRfc2htZW1fZGVhbGxvYyBjbWRfZGVhbGxvYzsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogZW50ZXIsIHBvcnRfaWQgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwb3J0X2QtPnBvcnRfaWQpOworCisJbWVtc2V0KCZjbWRfZGVhbGxvYywgMCwgc2l6ZW9mKGNtZF9kZWFsbG9jKSk7CisJaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmNtZF9kZWFsbG9jLmhkciwgcG9ydF9kLT5wb3J0X2lkLAorCQkJCUNQRV9BRkVfUE9SVF9DTURfU0hBUkVEX01FTV9ERUFMTE9DLAorCQkJCVNITUVNX0RFQUxMT0NfQ01EX1BMRF9TSVpFLCBmYWxzZSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmRfcmV0OworCX0KKworCWNtZF9kZWFsbG9jLmFkZHIgPSBwb3J0X2QtPm1lbV9oYW5kbGU7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnKGNvcmUsIHBvcnRfZCwgJmNtZF9kZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbGVkIHRvIHNlbmQgc2htZW1fZGVhbGxvYyBjbWRcbiIpOworCQlnb3RvIGVuZF9yZXQ7CisJfQorCW1lbXNldCgmcG9ydF9kLT5tZW1faGFuZGxlLCAwLAorCSAgICAgICBzaXplb2YocG9ydF9kLT5tZW1faGFuZGxlKSk7CisKK2VuZF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfc2VuZF9hZmVfY2FsOiBzZW5kIHRoZSBhY2RiIGNhbGlicmF0aW9uIHRvIEFGRSBwb3J0CisgKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCisgKiBAcG9ydF9kOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IGZvciB3aGljaCB0aGUKKyAqCSAgICAgIGNhbGlicmF0aW9uIG5lZWRzIHRvIGJlIGFwcHBsaWVkCisgKi8KK3N0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX2FmZV9jYWwodm9pZCAqY29yZV9oYW5kbGUsCisJCXN0cnVjdCB3Y2RfY21pX2FmZV9wb3J0X2RhdGEgKnBvcnRfZCkKK3sKKworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWZlX2NhbCA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOworCXN0cnVjdCBjbWlfb2JtX21zZyBvYm1fbXNnOworCXZvaWQgKmluYl9tc2cgPSBOVUxMOworCXZvaWQgKm1zZzsKKwlpbnQgcmMgPSAwOworCWJvb2wgaXNfb2JtX21zZzsKKworCWlmIChjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfQUZFXSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IExTTSBjYWwgbm90IGFsbG9jYXRlZCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byByZWxfY2FsX211dGV4OworCX0KKworCW11dGV4X2xvY2soJmNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9BRkVdLT5sb2NrKTsKKwlhZmVfY2FsID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJCWNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9BRkVdKTsKKwlpZiAoIWFmZV9jYWwpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBhZmUgY2FsIGJsb2NrXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gcmVsX2NhbF9tdXRleDsKKwl9CisKKwlpZiAoYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7CisJCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IE5vIEFGRSBjYWwgdG8gc2VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAwOworCQlnb3RvIHJlbF9jYWxfbXV0ZXg7CisJfQorCisJaXNfb2JtX21zZyA9IChhZmVfY2FsLT5jYWxfZGF0YS5zaXplID4KKwkJICAgICAgQ01JX0lOQkFORF9NRVNTQUdFX1NJWkUpID8gdHJ1ZSA6IGZhbHNlOworCisJaWYgKGlzX29ibV9tc2cpIHsKKwkJc3RydWN0IGNtaV9oZHIgKmhkciA9ICYob2JtX21zZy5oZHIpOworCQlzdHJ1Y3QgY21pX29ibSAqcGxkID0gJihvYm1fbXNnLnBsZCk7CisKKwkJcmMgPSB3Y2RfY3BlX2FmZV9zaG1lbV9hbGxvYyhjb3JlLCBwb3J0X2QsCisJCQkJCWFmZV9jYWwtPmNhbF9kYXRhLnNpemUpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogQUZFIHNobWVtIGFsbG9jIGZhaWwgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gcmVsX2NhbF9tdXRleDsKKwkJfQorCisJCXJjID0gZmlsbF9hZmVfY21kX2hlYWRlcihoZHIsIHBvcnRfZC0+cG9ydF9pZCwKKwkJCQkJIENQRV9BRkVfQ01EX1NFVF9QQVJBTSwKKwkJCQkJIENQRV9BRkVfUEFSQU1fUEFZTE9BRF9TSVpFLAorCQkJCQkgdHJ1ZSk7CisJCWlmIChyYykgeworCQkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkJIiVzOiBpbnZhbGlkIHBhcmFtcyBmb3IgaGVhZGVyLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJd2NkX2NwZV9hZmVfc2htZW1fZGVhbGxvYyhjb3JlLCBwb3J0X2QpOworCQkJZ290byByZWxfY2FsX211dGV4OworCQl9CisKKwkJcGxkLT52ZXJzaW9uID0gMDsKKwkJcGxkLT5zaXplID0gYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZTsKKwkJcGxkLT5kYXRhX3B0ci5rdmFkZHIgPSBhZmVfY2FsLT5jYWxfZGF0YS5rdmFkZHI7CisJCXBsZC0+bWVtX2hhbmRsZSA9IHBvcnRfZC0+bWVtX2hhbmRsZTsKKwkJbXNnID0gJm9ibV9tc2c7CisKKwl9IGVsc2UgeworCQl1OCAqbXNnX3BsZDsKKwkJc3RydWN0IGNtaV9oZHIgKmhkcjsKKworCQlpbmJfbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtaV9oZHIpICsKKwkJCQkJYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSwKKwkJCQkgIEdGUF9LRVJORUwpOworCQlpZiAoIWluYl9tc2cpIHsKKwkJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJCSIlczogbm8gbWVtb3J5IGZvciBhZmUgY2FsIGluYmFuZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHJlbF9jYWxfbXV0ZXg7CisJCX0KKworCQloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgaW5iX21zZzsKKworCQlyYyA9IGZpbGxfYWZlX2NtZF9oZWFkZXIoaGRyLCBwb3J0X2QtPnBvcnRfaWQsCisJCQkJCSBDUEVfQUZFX0NNRF9TRVRfUEFSQU0sCisJCQkJCSBDUEVfQUZFX1BBUkFNX1BBWUxPQURfU0laRSwKKwkJCQkJIGZhbHNlKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCQkiJXM6IGludmFsaWQgcGFyYW1zIGZvciBoZWFkZXIsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlrZnJlZShpbmJfbXNnKTsKKwkJCWluYl9tc2cgPSBOVUxMOworCQkJZ290byByZWxfY2FsX211dGV4OworCQl9CisKKwkJbXNnX3BsZCA9ICgodTggKikgaW5iX21zZykgKyBzaXplb2Yoc3RydWN0IGNtaV9oZHIpOworCQltZW1jcHkobXNnX3BsZCwgYWZlX2NhbC0+Y2FsX2RhdGEua3ZhZGRyLAorCQkgICAgICAgYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSk7CisKKwkJbXNnID0gaW5iX21zZzsKKwl9CisKKwlyYyA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBwb3J0X2QsIG1zZyk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBhZmUgY2FsIGZvciBsaXN0ZW4gZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworCWlmIChpc19vYm1fbXNnKSB7CisJCXdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2MoY29yZSwgcG9ydF9kKTsKKwkJcG9ydF9kLT5tZW1faGFuZGxlID0gMDsKKwl9IGVsc2UgeworCQlrZnJlZShpbmJfbXNnKTsKKwkJaW5iX21zZyA9IE5VTEw7CisJfQorCityZWxfY2FsX211dGV4OgorCW11dGV4X3VubG9jaygmY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX0FGRV0tPmxvY2spOworCXJldHVybiByYzsKK30KKworLyoKKyAqIHdjZF9jcGVfaXNfdmFsaWRfcG9ydDogY2hlY2sgdmFsaWRpdHkgb2YgYWZlIHBvcnQgaWQKKyAqIEBjb3JlOiBoYW5kbGUgdG8gY29yZSB0byBjaGVjayBmb3IgdmFsaWRpdHkKKyAqIEBhZmVfY2ZnOiBjbGllbnQgcHJvdmlkZWQgYWZlIGNvbmZpZ3VyYXRpb24KKyAqIEBmdW5jOiBmdW5jdGlvbiBuYW1lIGludm9raW5nIHRoaXMgdmFsaWRpdHkgY2hlY2ssCisgKgkgIHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAorCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcsCisJCWNvbnN0IGNoYXIgKmZ1bmMpCit7CisJaWYgKHVubGlrZWx5KElTX0VSUl9PUl9OVUxMKGNvcmUpKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcmUgaGFuZGxlXG4iLCBmdW5jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFmZV9jZmctPnBvcnRfaWQgPiBXQ0RfQ1BFX0FGRV9NQVhfUE9SVFMpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGludmFsaWQgYWZlIHBvcnQgKCV1KVxuIiwKKwkJCWZ1bmMsIGFmZV9jZmctPnBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvcmUtPmRldiwKKwkJIiVzOiBwb3J0X2lkID0gJXVcbiIsCisJCWZ1bmMsIGFmZV9jZmctPnBvcnRfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc3ZjX2NtZF9tb2RlKHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJCSAgICB1OCBtb2RlKQoreworCXN0cnVjdCBjcGVfYWZlX3N2Y19jbWRfbW9kZSBhZmVfbW9kZTsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0OworCisJYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbMF07CisJLyoKKwkgKiBBRkUgU1ZDIG1vZGUgY29tbWFuZCBpcyBmb3IgdGhlIHNlcnZpY2UgYW5kIG5vdCBwb3J0CisJICogc3BlY2lmaWMsIGhlbmNlIHVzZSBBRkUgcG9ydCBhcyAwIHNvIHRoZSBjb21tYW5kIHdpbGwKKwkgKiBiZSBhcHBsaWVkIHRvIGFsbCBBRkUgcG9ydHMgb24gQ1BFLgorCSAqLworCWFmZV9wb3J0X2QtPnBvcnRfaWQgPSAwOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisJbWVtc2V0KCZhZmVfbW9kZSwgMCwgc2l6ZW9mKGFmZV9tb2RlKSk7CisJaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmFmZV9tb2RlLmhkciwgYWZlX3BvcnRfZC0+cG9ydF9pZCwKKwkJCQlDUEVfQUZFX1NWQ19DTURfTEFCX01PREUsCisJCQkJQ1BFX0FGRV9DTURfTU9ERV9QQVlMT0FEX1NJWkUsCisJCQkJZmFsc2UpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZmVfbW9kZS5tb2RlID0gbW9kZTsKKworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmYWZlX21vZGUpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBhZmVfc3ZjX21vZGUgY21kIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworZXJyX3JldDoKKwlXQ0RfQ1BFX1JFTF9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2NkX2NwZV9hZmVfY21kX3BvcnRfY2ZnKHZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcpCit7CisJc3RydWN0IGNwZV9hZmVfY21kX3BvcnRfY2ZnIHBvcnRfY2ZnX2NtZDsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0OworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIGFmZV9jZmcsIF9fZnVuY19fKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1thZmVfY2ZnLT5wb3J0X2lkXTsKKwlhZmVfcG9ydF9kLT5wb3J0X2lkID0gYWZlX2NmZy0+cG9ydF9pZDsKKworCVdDRF9DUEVfR1JBQl9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOworCW1lbXNldCgmcG9ydF9jZmdfY21kLCAwLCBzaXplb2YocG9ydF9jZmdfY21kKSk7CisJaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJnBvcnRfY2ZnX2NtZC5oZHIsCisJCQlhZmVfY2ZnLT5wb3J0X2lkLAorCQkJQ1BFX0FGRV9QT1JUX0NNRF9HRU5FUklDX0NPTkZJRywKKwkJCUNQRV9BRkVfQ01EX1BPUlRfQ0ZHX1BBWUxPQURfU0laRSwKKwkJCWZhbHNlKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJcG9ydF9jZmdfY21kLmJpdF93aWR0aCA9IGFmZV9jZmctPmJpdF93aWR0aDsKKwlwb3J0X2NmZ19jbWQubnVtX2NoYW5uZWxzID0gYWZlX2NmZy0+bnVtX2NoYW5uZWxzOworCXBvcnRfY2ZnX2NtZC5zYW1wbGVfcmF0ZSA9IGFmZV9jZmctPnNhbXBsZV9yYXRlOworCisJaWYgKGFmZV9wb3J0X2QtPnBvcnRfaWQgPT0gQ1BFX0FGRV9QT1JUXzNfVFgpCisJCXBvcnRfY2ZnX2NtZC5idWZmZXJfc2l6ZSA9IFdDRF9DUEVfRUNfUFBfQlVGX1NJWkU7CisJZWxzZQorCQlwb3J0X2NmZ19jbWQuYnVmZmVyX3NpemUgPSBBRkVfT1VUX0JVRl9TSVpFKGFmZV9jZmctPmJpdF93aWR0aCwKKwkJCQkJCQlhZmVfY2ZnLT5zYW1wbGVfcmF0ZSk7CisKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJnBvcnRfY2ZnX2NtZCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGFmZV9wb3J0X2NvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKK2Vycl9yZXQ6CisJV0NEX0NQRV9SRUxfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfYWZlX3NldF9wYXJhbXM6IHNldCB0aGUgcGFyYW1ldGVycyBmb3IgYWZlIHBvcnQKKyAqIEBhZmVfY2ZnOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IGZvciB3aGljaCB0aGUKKyAqCSAgICAgIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHNldAorICovCitzdGF0aWMgaW50IHdjZF9jcGVfYWZlX3NldF9wYXJhbXModm9pZCAqY29yZV9oYW5kbGUsCisJCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqYWZlX2NmZywgYm9vbCBhZmVfbWFkX2N0bCkKK3sKKwlzdHJ1Y3QgY3BlX2FmZV9wYXJhbXMgYWZlX3BhcmFtczsKKwlzdHJ1Y3QgY3BlX2FmZV9od19tYWRfY3RybCAqaHdfbWFkX2N0cmwgPSAmYWZlX3BhcmFtcy5od19tYWRfY3RybDsKKwlzdHJ1Y3QgY3BlX2FmZV9wb3J0X2NmZyAqcG9ydF9jZmcgPSAmYWZlX3BhcmFtcy5wb3J0X2NmZzsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0ID0gMCwgcGxkX3NpemUgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIGFmZV9jZmcsIF9fZnVuY19fKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbYWZlX2NmZy0+cG9ydF9pZF07CisJYWZlX3BvcnRfZC0+cG9ydF9pZCA9IGFmZV9jZmctPnBvcnRfaWQ7CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKKworCXJldCA9IHdjZF9jcGVfc2VuZF9hZmVfY2FsKGNvcmUsIGFmZV9wb3J0X2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGFmZSBhY2RiIGNhbCBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXBsZF9zaXplID0gQ1BFX0FGRV9QQVJBTV9QQVlMT0FEX1NJWkU7CisJbWVtc2V0KCZhZmVfcGFyYW1zLCAwLCBzaXplb2YoYWZlX3BhcmFtcykpOworCisJaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmFmZV9wYXJhbXMuaGRyLAorCQkJCWFmZV9jZmctPnBvcnRfaWQsCisJCQkJQ1BFX0FGRV9DTURfU0VUX1BBUkFNLAorCQkJCSh1OCkgcGxkX3NpemUsIGZhbHNlKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJaHdfbWFkX2N0cmwtPnBhcmFtLm1vZHVsZV9pZCA9IENQRV9BRkVfTU9EVUxFX0hXX01BRDsKKwlod19tYWRfY3RybC0+cGFyYW0ucGFyYW1faWQgPSBDUEVfQUZFX1BBUkFNX0lEX0hXX01BRF9DVEw7CisJaHdfbWFkX2N0cmwtPnBhcmFtLnBfc2l6ZS5zci5wYXJhbV9zaXplID0gUEFSQU1fU0laRV9BRkVfSFdfTUFEX0NUUkw7CisJaHdfbWFkX2N0cmwtPnBhcmFtLnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7CisJaHdfbWFkX2N0cmwtPm1pbm9yX3ZlcnNpb24gPSAxOworCWh3X21hZF9jdHJsLT5tYWRfdHlwZSA9IE1BRF9UWVBFX0FVRElPOworCWh3X21hZF9jdHJsLT5tYWRfZW5hYmxlID0gYWZlX21hZF9jdGw7CisKKwlwb3J0X2NmZy0+cGFyYW0ubW9kdWxlX2lkID0gQ1BFX0FGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwlwb3J0X2NmZy0+cGFyYW0ucGFyYW1faWQgPSBDUEVfQUZFX1BBUkFNX0lEX0dFTkVSSUNfUE9SVF9DT05GSUc7CisJcG9ydF9jZmctPnBhcmFtLnBfc2l6ZS5zci5wYXJhbV9zaXplID0gUEFSQU1fU0laRV9BRkVfUE9SVF9DRkc7CisJcG9ydF9jZmctPnBhcmFtLnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7CisJcG9ydF9jZmctPm1pbm9yX3ZlcnNpb24gPSAxOworCXBvcnRfY2ZnLT5iaXRfd2lkdGggPSBhZmVfY2ZnLT5iaXRfd2lkdGg7CisJcG9ydF9jZmctPm51bV9jaGFubmVscyA9IGFmZV9jZmctPm51bV9jaGFubmVsczsKKwlwb3J0X2NmZy0+c2FtcGxlX3JhdGUgPSBhZmVfY2ZnLT5zYW1wbGVfcmF0ZTsKKworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmYWZlX3BhcmFtcyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGFmZV9wb3J0X2NvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CitlcnJfcmV0OgorCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfYWZlX3BvcnRfc3RhcnQ6IHNlbmQgdGhlIHN0YXJ0IGNvbW1hbmQgdG8gYWZlIHNlcnZpY2UKKyAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIHRoZSBjcGUgY29yZQorICogQHBvcnRfY2ZnOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBhZmUgcG9ydCB3aGljaCBuZWVkcworICoJICAgICAgdG8gYmUgc3RhcnRlZC4KKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2FmZV9wb3J0X3N0YXJ0KHZvaWQgKmNvcmVfaGFuZGxlLAorCQkJc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnICpwb3J0X2NmZykKK3sKKworCXN0cnVjdCBjbWlfaGRyIGhkcjsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07CisJYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSk7CisJZmlsbF9hZmVfY21kX2hlYWRlcigmaGRyLCBwb3J0X2NmZy0+cG9ydF9pZCwKKwkJCSAgICBDUEVfQUZFX1BPUlRfQ01EX1NUQVJULAorCQkJICAgIDAsIGZhbHNlKTsKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJmhkcik7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGFmZV9wb3J0X3N0YXJ0IGNtZCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJV0NEX0NQRV9SRUxfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2NkX2NwZV9hZmVfcG9ydF9zdG9wOiBzZW5kIHN0b3AgY29tbWFuZCB0byBhZmUgc2VydmljZQorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCisgKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0IHdoaWNoIG5lZWRzCisgKgkgICAgICB0byBiZSBzdG9wcGVkLgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfYWZlX3BvcnRfc3RvcCh2b2lkICpjb3JlX2hhbmRsZSwKKwlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKnBvcnRfY2ZnKQoreworCXN0cnVjdCBjbWlfaGRyIGhkcjsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07CisJYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCWZpbGxfYWZlX2NtZF9oZWFkZXIoJmhkciwgcG9ydF9jZmctPnBvcnRfaWQsCisJCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9TVE9QLAorCQkJICAgIDAsIGZhbHNlKTsKKwlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJmhkcik7CisJaWYgKHJldCkKKwkJZGV2X2Vycihjb3JlLT5kZXYsCisJCQkiJXM6IGFmZV9zdG9wIGNtZCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwlXQ0RfQ1BFX1JFTF9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3Y2RfY3BlX2FmZV9wb3J0X3N1c3BlbmQ6IHNlbmQgc3VzcGVuZCBjb21tYW5kIHRvIGFmZSBzZXJ2aWNlCisgKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgY3BlIGNvcmUKKyAqIEBwb3J0X2NmZzogY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgYWZlIHBvcnQgd2hpY2ggbmVlZHMKKyAqCSAgICAgIHRvIGJlIHN1c3BlbmRlZC4KKyAqLworc3RhdGljIGludCB3Y2RfY3BlX2FmZV9wb3J0X3N1c3BlbmQodm9pZCAqY29yZV9oYW5kbGUsCisJCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqcG9ydF9jZmcpCit7CisJc3RydWN0IGNtaV9oZHIgaGRyOworCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKKwlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICphZmVfcG9ydF9kOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIHBvcnRfY2ZnLCBfX2Z1bmNfXyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWFmZV9wb3J0X2QgPSAmYWZlX3BvcnRzW3BvcnRfY2ZnLT5wb3J0X2lkXTsKKwlhZmVfcG9ydF9kLT5wb3J0X2lkID0gcG9ydF9jZmctPnBvcnRfaWQ7CisKKwlXQ0RfQ1BFX0dSQUJfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKKworCW1lbXNldCgmaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKTsKKwlmaWxsX2FmZV9jbWRfaGVhZGVyKCZoZHIsIHBvcnRfY2ZnLT5wb3J0X2lkLAorCQkJICAgIENQRV9BRkVfUE9SVF9DTURfU1VTUEVORCwKKwkJCSAgICAwLCBmYWxzZSk7CisJcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnKGNvcmUsIGFmZV9wb3J0X2QsICZoZHIpOworCWlmIChyZXQpCisJCWRldl9lcnIoY29yZS0+ZGV2LAorCQkJIiVzOiBhZmVfc3VzcGVuZCBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lOiBzZW5kIHRoZSByZXN1bWUgY29tbWFuZCB0byBhZmUgc2VydmljZQorICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCisgKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0IHdoaWNoIG5lZWRzCisgKgkgICAgICB0byBiZSByZXN1bWVkLgorICovCitzdGF0aWMgaW50IHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lKHZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKnBvcnRfY2ZnKQoreworCXN0cnVjdCBjbWlfaGRyIGhkcjsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7CisJc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07CisJYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOworCisJV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCWZpbGxfYWZlX2NtZF9oZWFkZXIoJmhkciwgcG9ydF9jZmctPnBvcnRfaWQsCisJCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9SRVNVTUUsCisJCQkgICAgMCwgZmFsc2UpOworCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmaGRyKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGNvcmUtPmRldiwKKwkJCSIlczogYWZlX3Jlc3VtZSBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7CisJcmV0dXJuIHJldDsKKworfQorCisvKgorICogd2NkX2NwZV9yZWdpc3Rlcl9hZmVfZHJpdmVyOiByZWdpc3RlciBsc20gZHJpdmVyIHRvIGNvZGVjCisgKiBAY3BlX29wczogc3RydWN0dXJlIHdpdGggbHNtIGNhbGxiYWNrcworICogQGNvZGVjOiBjb2RlYyB0byB3aGljaCB0aGlzIGxzbSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB0bworICovCitpbnQgd2NkX2NwZV9nZXRfYWZlX29wcyhzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzKQoreworCWFmZV9vcHMtPmFmZV9zZXRfcGFyYW1zID0gd2NkX2NwZV9hZmVfc2V0X3BhcmFtczsKKwlhZmVfb3BzLT5hZmVfcG9ydF9zdGFydCA9IHdjZF9jcGVfYWZlX3BvcnRfc3RhcnQ7CisJYWZlX29wcy0+YWZlX3BvcnRfc3RvcCA9IHdjZF9jcGVfYWZlX3BvcnRfc3RvcDsKKwlhZmVfb3BzLT5hZmVfcG9ydF9zdXNwZW5kID0gd2NkX2NwZV9hZmVfcG9ydF9zdXNwZW5kOworCWFmZV9vcHMtPmFmZV9wb3J0X3Jlc3VtZSA9IHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lOworCWFmZV9vcHMtPmFmZV9wb3J0X2NtZF9jZmcgPSB3Y2RfY3BlX2FmZV9jbWRfcG9ydF9jZmc7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod2NkX2NwZV9nZXRfYWZlX29wcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiV0NEIENQRSBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfY29yZS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY3MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuaApAQCAtMCwwICsxLDIyNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBXQ0RfQ1BFX0NPUkVfSAorI2RlZmluZSBXQ0RfQ1BFX0NPUkVfSAorCisjaW5jbHVkZSA8c29jL3Fjb20vcmFtZHVtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSAid2NkX2NwZV9zZXJ2aWNlcy5oIgorCisjZGVmaW5lIFdDRF9DUEVfTEFCX01BWF9MQVRFTkNZIDI1MAorI2RlZmluZSBXQ0RfQ1BFX01BRF9TTElNX0NIQU5ORUwgMTQwCisKKy8qIEluZGljYXRlcyBDUEUgYmxvY2sgaXMgcmVhZHkgZm9yIGltYWdlIHJlLWRvd25sb2FkICovCisjZGVmaW5lIFdDRF9DUEVfQkxLX1JFQURZICAoMSA8PCAwKQorLyogSW5kaWNhdGVzIHRoZSB1bmRlcmx5aW5nIGJ1cyBpcyByZWFkeSAqLworI2RlZmluZSBXQ0RfQ1BFX0JVU19SRUFEWSAoMSA8PCAxKQorCisvKgorICogb25seSB3aGVuIHRoZSB1bmRlcmx5aW5nIGJ1cyBhbmQgQ1BFIGJsb2NrIGJvdGggYXJlIHJlYWR5LAorICogdGhlIHN0YXRlIHdpbGwgYmUgcmVhZHkgdG8gZG93bmxvYWQKKyAqLworI2RlZmluZSBXQ0RfQ1BFX1JFQURZX1RPX0RMT0FECVwKKwkoV0NEX0NQRV9CTEtfUkVBRFkgfCBXQ0RfQ1BFX0JVU19SRUFEWSkKKworI2RlZmluZSBXQ0RfQ1BFX0xPQURfSU1FTSAoMSA8PCAwKQorI2RlZmluZSBXQ0RfQ1BFX0xPQURfREFUQSAoMSA8PCAxKQorI2RlZmluZSBXQ0RfQ1BFX0xPQURfQUxMIFwKKwkoV0NEX0NQRV9MT0FEX0lNRU0gfCBXQ0RfQ1BFX0xPQURfREFUQSkKKworI2RlZmluZSBXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCA2NAorCisjZGVmaW5lIFdDRF9DUEVfQUZFX09VVF9QT1JUXzIgMgorI2RlZmluZSBXQ0RfQ1BFX0FGRV9PVVRfUE9SVF80IDQKKworZW51bSB7CisJV0NEX0NQRV9MU01fQ0FMX0FGRSA9IDAsCisJV0NEX0NQRV9MU01fQ0FMX0xTTSwKKwlXQ0RfQ1BFX0xTTV9DQUxfVE9QT0xPR1lfSUQsCisJV0NEX0NQRV9MU01fQ0FMX01BWCwKK307CisKK2VudW0gY3BlX2Vycl9pcnFfY250bF90eXBlIHsKKwlDUEVfRVJSX0lSUV9NQVNLID0gMCwKKwlDUEVfRVJSX0lSUV9VTk1BU0ssCisJQ1BFX0VSUl9JUlFfQ0xFQVIsCisJQ1BFX0VSUl9JUlFfU1RBVFVTLAorfTsKKworc3RydWN0IHdjZF9jcGVfY2RjX2NiIHsKKwkvKiBjb2RlYyBwcm92aWRlZCBjYWxsYmFjayB0byBlbmFibGUgUkNPICovCisJaW50ICgqY2RjX2Nsa19lbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7CisKKwkvKiBjYWxsYmFjayBmb3IgRkxMIHNldHVwIGZvciBjb2RlYyAqLworCWludCAoKmNwZV9jbGtfZW4pKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOworCWludCAoKmNkY19leHRfY2xrKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBlbmFibGUsIGJvb2wgZGFwbSk7CisJaW50ICgqbGFiX2NkY19jaF9jdGwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggZXZlbnQpOworCWludCAoKmdldF9hZmVfb3V0X3BvcnRfaWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTE2ICpwb3J0X2lkKTsKKwlpbnQgKCpidXNfdm90ZV9idykoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJICAgYm9vbCB2b3RlKTsKKworCS8qIENhbGxiYWNrIHRvIGNvbnRyb2wgdGhlIGNwZSBlcnJvciBpbnRlcnJ1cHQgbWFzay9zdGF0dXMvY2xlYXIgKi8KKwlpbnQgKCpjcGVfZXJyX2lycV9jb250cm9sKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIGVudW0gY3BlX2Vycl9pcnFfY250bF90eXBlIGNudGxfdHlwZSwKKwkJCQkgICAgdTggKnN0YXR1cyk7Cit9OworCitlbnVtIHdjZF9jcGVfc3NyX3N0YXRlX2V2ZW50IHsKKwkvKiBJbmRpY2F0ZXMgQ1BFIGlzIGluaXRpYWxpemVkICovCisJV0NEX0NQRV9JTklUSUFMSVpFRCA9IDAsCisJLyogSW5kaWNhdGVzIHRoYXQgSU1FTSBpcyBkb3dubG9hZGVkIHRvIENQRSAqLworCVdDRF9DUEVfSU1FTV9ET1dOTE9BREVELAorCS8qIEluZGljYXRlcyBDUEUgaXMgZW5hYmxlZCAqLworCVdDRF9DUEVfRU5BQkxFRCwKKwkvKiBJbmRpY2F0ZXMgdGhhdCBDUEUgaXMgY3VycmVudGx5IGFjdGl2ZSAqLworCVdDRF9DUEVfQUNUSVZFLAorCS8qIEV2ZW50IGZyb20gdW5kZXJseWluZyBidXMgbm90aWZ5aW5nIGJ1cyBpcyBkb3duICovCisJV0NEX0NQRV9CVVNfRE9XTl9FVkVOVCwKKwkvKiBFdmVudCBmcm9tIENQRSBibG9jaywgbm90aWZ5aW5nIENQRSBpcyBkb3duICovCisJV0NEX0NQRV9TU1JfRVZFTlQsCisJLyogRXZlbnQgZnJvbSB1bmRlcmx5aW5nIGJ1cyBub3RpZnlpbmcgYnVzIGlzIHVwICovCisJV0NEX0NQRV9CVVNfVVBfRVZFTlQsCit9OworCitzdHJ1Y3Qgd2NkX2NwZV9zc3JfZW50cnkgeworCWludCBvZmZsaW5lOworCXUzMiBvZmZsaW5lX2NoYW5nZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvZmZsaW5lX3BvbGxfd2FpdDsKKwlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OworfTsKKworc3RydWN0IHdjZF9jcGVfaXJxX2luZm8geworCWludCBjcGVfZW5naW5lX2lycTsKKwlpbnQgY3BlX2Vycl9pcnE7CisJdTggY3BlX2ZhdGFsX2lycXM7Cit9OworCitzdHJ1Y3Qgd2NkX2NwZV9od19pbmZvIHsKKwl1MzIgZHJhbV9vZmZzZXQ7CisJc2l6ZV90IGRyYW1fc2l6ZTsKKwl1MzIgaXJhbV9vZmZzZXQ7CisJc2l6ZV90IGlyYW1fc2l6ZTsKK307CisKK3N0cnVjdCB3Y2RfY3BlX2NvcmUgeworCS8qIGhhbmRsZSB0byBjcGUgc2VydmljZXMgKi8KKwl2b2lkICpjcGVfaGFuZGxlOworCisJLyogcmVnaXN0cmF0aW9uIGhhbmRsZSB0byBjcGUgc2VydmljZXMgKi8KKwl2b2lkICpjcGVfcmVnX2hhbmRsZTsKKworCS8qIGNtaSByZWdpc3RyYXRpb24gaGFuZGxlIGZvciBhZmUgc2VydmljZSAqLworCXZvaWQgKmNtaV9hZmVfaGFuZGxlOworCisJLyogaGFuZGxlIHRvIGNvZGVjICovCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJLyogY29kZWMgZGV2aWNlICovCisJc3RydWN0IGRldmljZSAqZGV2OworCisJLyogZmlybXdhcmUgaW1hZ2UgZmlsZSBuYW1lICovCisJY2hhciBmbmFtZVtXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWF07CisKKwkvKiBmaXJtd2FyZSBpbWFnZSBmaWxlIG5hbWUgZnJvbSBzeXNmcyAqLworCWNoYXIgZHluX2ZuYW1lW1dDRF9DUEVfSU1BR0VfRk5BTUVfTUFYXTsKKworCS8qIGNvZGVjIGluZm9ybWF0aW9uIG5lZWRlZCBieSBjcGUgc2VydmljZXMgKi8KKwlzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxIGNkY19pbmZvOworCisJLyogd29yayB0byBwZXJmb3JtIGltYWdlIGRvd25sb2FkICovCisJc3RydWN0IHdvcmtfc3RydWN0IGxvYWRfZndfd29yazsKKworCS8qIGZsYWcgdG8gaW5kaWNhdGUgbW9kZSBpbiB3aGljaCBjcGUgbmVlZHMgdG8gYmUgYm9vdGVkICovCisJaW50IGNwZV9kZWJ1Z19tb2RlOworCisJLyogY2FsbGJhY2tzIGZvciBjb2RlYyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiAqLworCWNvbnN0IHN0cnVjdCB3Y2RfY3BlX2NkY19jYiAqY3BlX2NkY19jYjsKKworCS8qIHdvcmsgdG8gaGFuZGxlIENQRSBTU1IqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBzc3Jfd29yazsKKworCS8qIFBNIGhhbmRsZSBmb3Igc3VzcGVuZCBtb2RlIGR1cmluZyBTU1IgKi8KKwlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgcG1fcW9zX3JlcTsKKworCS8qIGNvbXBsZXRpb24gZXZlbnQgaW5kaWNhdGluZyBDUEUgT0ZGTElORSAqLworCXN0cnVjdCBjb21wbGV0aW9uIG9mZmxpbmVfY29tcGw7CisKKwkvKiBlbnRyeSBpbnRvIHNuZCBjYXJkIHByb2NmcyBpbmRpY2F0aW5nIGNwZSBzdGF0dXMgKi8KKwlzdHJ1Y3Qgd2NkX2NwZV9zc3JfZW50cnkgc3NyX2VudHJ5OworCisJLyoKKwkgKiBjb21wbGV0aW9uIGV2ZW50IHRvIHNpZ25hbCBDUEUgaXMKKwkgKiByZWFkeSBmb3IgaW1hZ2UgcmUtZG93bmxvYWQKKwkgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiByZWFkeV9jb21wbDsKKworCS8qIG1haW50YWlucyB0aGUgc3RhdHVzIGZvciBjcGUgc3NyICovCisJdTggcmVhZHlfc3RhdHVzOworCisJLyogSW5kaWNhdGUgU1NSIHR5cGUgKi8KKwllbnVtIHdjZF9jcGVfc3NyX3N0YXRlX2V2ZW50IHNzcl90eXBlOworCisJLyogbXV0ZXggdG8gcHJvdGVjdCBjcGUgc3NyIHN0YXR1cyB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggc3NyX2xvY2s7CisKKwkvKiBTdG9yZSB0aGUgY2FsaWJyYXRpb24gZGF0YSBuZWVkZWQgZm9yIGNwZSAqLworCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfTUFYXTsKKworCS8qIGNvbXBsZXRpb24gZXZlbnQgdG8gc2lnbmFsIENQRSBpcyBvbmxpbmUgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBvbmxpbmVfY29tcGw7CisKKwkvKiByZWZlcmVuY2UgY291bnRlciBmb3IgY3BlIHVzYWdlICovCisJdTggY3BlX3VzZXJzOworCisJLyogUmFtZHVtcCBzdXBwb3J0ICovCisJdm9pZCAqY3BlX3JhbWR1bXBfZGV2OworCXN0cnVjdCByYW1kdW1wX3NlZ21lbnQgY3BlX3JhbWR1bXBfc2VnOworCWRtYV9hZGRyX3QgY3BlX2R1bXBfYWRkcjsKKwl2b2lkICpjcGVfZHVtcF92X2FkZHI7CisKKwkvKiBTRlIgc3VwcG9ydCAqLworCXUzMiBzZnJfYnVmX2FkZHI7CisJc2l6ZV90IHNmcl9idWZfc2l6ZTsKKworCS8qIElSUSBpbmZvcm1hdGlvbiBmb3IgQ1BFIGludGVycnVwdHMgKi8KKwlzdHJ1Y3Qgd2NkX2NwZV9pcnFfaW5mbyBpcnFfaW5mbzsKKworCS8qIEtvYmplY3QgZm9yIHN5c2ZzIGVudHJ5ICovCisJc3RydWN0IGtvYmplY3QgY3BlX2tvYmo7CisKKwkvKiBSZWZlcmVuY2UgY291bnQgZm9yIGNwZSBjbGsqLworCWludCBjcGVfY2xrX3JlZjsKKworCS8qIGNvZGVjIGJhc2VkIGhhcmR3YXJlIGluZm8gKi8KKwlzdHJ1Y3Qgd2NkX2NwZV9od19pbmZvIGh3X2luZm87Cit9OworCitzdHJ1Y3Qgd2NkX2NwZV9wYXJhbXMgeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICogKCpnZXRfY3BlX2NvcmUpKAorCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICopOworCWNvbnN0IHN0cnVjdCB3Y2RfY3BlX2NkY19jYiAqY2RjX2NiOworCWludCBkYmdfbW9kZTsKKwl1MTYgY2RjX21ham9yX3ZlcjsKKwl1MTYgY2RjX21pbm9yX3ZlcjsKKwl1MzIgY2RjX2lkOworCisJc3RydWN0IHdjZF9jcGVfaXJxX2luZm8gY2RjX2lycV9pbmZvOworCisJc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSAqY3BlX3N2Y19wYXJhbXM7Cit9OworCitpbnQgd2NkX2NwZV9zc3JfZXZlbnQodm9pZCAqY29yZV9oYW5kbGUsCisJCSAgICAgIGVudW0gd2NkX2NwZV9zc3Jfc3RhdGVfZXZlbnQgZXZlbnQpOworc3RydWN0IHdjZF9jcGVfY29yZSAqd2NkX2NwZV9pbml0KGNvbnN0IGNoYXIgKmltZ19mbmFtZSwKK3N0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHdjZF9jcGVfcGFyYW1zICpwYXJhbXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NwZV9zZXJ2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjhlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuYwpAQCAtMCwwICsxLDI5OTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NwZV9jbWkuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5MzMwX3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5MzM1L3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgIndjZF9jcGVfc2VydmljZXMuaCIKKyNpbmNsdWRlICJ3Y2RfY21pX2FwaS5oIgorCisjZGVmaW5lIENQRV9NU0dfQlVGRkVSX1NJWkUgMTMyCisjZGVmaW5lIENQRV9OT19TRVJWSUNFIDAKKworI2RlZmluZSBDTUlfRFJJVkVSX1NVUFBPUlRFRF9WRVJTSU9OIDAKKyNkZWZpbmUgQ01JX0FQSV9TVUNDRVNTIDAKKyNkZWZpbmUgQ01JX01TR19UUkFOU1BPUlQgKDB4MDAwMikKKyNkZWZpbmUgQ1BFX1NWQ19JTkFDVElWRV9TVEFURV9SRVRSSUVTX01BWCAxMAorCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX09GRlNFVAkJCQkweDUwMDAwCisjZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX1NJWkUJCQkJMHgzMDAwMAorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSVJBTV9PRkZTRVQJCQkJMHg4MDAwMAorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSVJBTV9TSVpFCQkJCTB4QzAwMAorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfU0laRQkJCQkxMgorI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YX1NJWkUJCQkJMTIKKworI2RlZmluZSBNRU1fQUNDRVNTX05PTkVfVkFMCQkJMHgwCisjZGVmaW5lIE1FTV9BQ0NFU1NfSVJBTV9WQUwJCQkweDEKKyNkZWZpbmUgTUVNX0FDQ0VTU19EUkFNX1ZBTAkJCTB4MgorI2RlZmluZSBMSVNURU5fQ1RMX1NQRV9WQUwJCQkweDAKKyNkZWZpbmUgTElTVEVOX0NUTF9NU01fVkFMCQkJMHgxCisKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YKE4pCShUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfMCArIChOKSkKKyNkZWZpbmUgVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWChOKQkoVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWF8wICsgKE4pKQorCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9EUkFNX09GRlNFVAkJMHg0ODAwMAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfRFJBTV9TSVpFCQkweDM0MDAwCisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9JUkFNX09GRlNFVAkJMHg4MDAwMAorI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfSVJBTV9TSVpFCQkweDIwMDAwCisKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX0lOQk9YX1NJWkUJCTE2CisjZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9PVVRCT1hfU0laRQkJMTYKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX01FTV9CQU5LX1NJWgkJMTYKKworI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1gxKE4pCShXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMCArIChOKSkKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWDEoTikJKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMCArIChOKSkKKyNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTksoTikJKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzAgKyAoTikpCisKKyNkZWZpbmUgQ0hVTktfU0laRSAxNgorCisjZGVmaW5lIENQRV9TVkNfR1JBQl9MT0NLKGxvY2ssIG5hbWUpCQlcCit7CQkJCQkJXAorCXByX2RlYnVnKCIlczogJXMgbG9jayBhY3F1aXJlXG4iLAlcCisJCSBfX2Z1bmNfXywgbmFtZSk7CQlcCisJbXV0ZXhfbG9jayhsb2NrKTsJCQlcCit9CisKKyNkZWZpbmUgQ1BFX1NWQ19SRUxfTE9DSyhsb2NrLCBuYW1lKQkJXAorewkJCQkJCVwKKwlwcl9kZWJ1ZygiJXM6ICVzIGxvY2sgcmVsZWFzZVxuIiwJXAorCQkgX19mdW5jX18sIG5hbWUpOwkJXAorCW11dGV4X3VubG9jayhsb2NrKTsJCQlcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgY3BlX3N2Y190b210b21faW5mbyA9IHsKKwlUT01UT01fQV9TVkFTU19TUEVfRFJBTV9TSVpFLAorCVRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX09GRlNFVCwKKwlUT01UT01fQV9TVkFTU19TUEVfSVJBTV9TSVpFLAorCVRPTVRPTV9BX1NWQVNTX1NQRV9JUkFNX09GRlNFVCwKKwlUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfU0laRSwKKwlUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YX1NJWkUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgY3BlX3N2Y193Y2Q5MzM1X2luZm8gPSB7CisJV0NEOTMzNV9DUEVfU1NfU1BFX0RSQU1fU0laRSwKKwlXQ0Q5MzM1X0NQRV9TU19TUEVfRFJBTV9PRkZTRVQsCisJV0NEOTMzNV9DUEVfU1NfU1BFX0lSQU1fU0laRSwKKwlXQ0Q5MzM1X0NQRV9TU19TUEVfSVJBTV9PRkZTRVQsCisJV0NEOTMzNV9DUEVfU1NfU1BFX0lOQk9YX1NJWkUsCisJV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWF9TSVpFCit9OworCitlbnVtIGNwZV9zdGF0ZSB7CisJQ1BFX1NUQVRFX1VOSU5JVElBTElaRUQgPSAwLAorCUNQRV9TVEFURV9JTklUSUFMSVpFRCwKKwlDUEVfU1RBVEVfSURMRSwKKwlDUEVfU1RBVEVfRE9XTkxPQURJTkcsCisJQ1BFX1NUQVRFX0JPT1RJTkcsCisJQ1BFX1NUQVRFX1NFTkRJTkdfTVNHLAorCUNQRV9TVEFURV9PRkZMSU5FLAorCUNQRV9TVEFURV9CVUZGRVJJTkcsCisJQ1BFX1NUQVRFX0JVRkZFUklOR19DQU5DRUxMRUQKK307CisKK2VudW0gY3BlX3N1YnN0YXRlIHsKKwlDUEVfU1NfSURMRSA9IDAsCisJQ1BFX1NTX01TR19SRVFVRVNUX0FDQ0VTUywKKwlDUEVfU1NfTVNHX1NFTkRfSU5CT1gsCisJQ1BFX1NTX01TR19TRU5ULAorCUNQRV9TU19ETF9ET1dOTE9BRElORywKKwlDUEVfU1NfRExfQ09NUExFVEVELAorCUNQRV9TU19CT09ULAorCUNQRV9TU19CT09UX0lOSVQsCisJQ1BFX1NTX09OTElORQorfTsKKworZW51bSBjcGVfY29tbWFuZCB7CisJQ1BFX0NNRF9LSUxMX1RIUkVBRCA9IDAsCisJQ1BFX0NNRF9CT09ULAorCUNQRV9DTURfQk9PVF9JTklUSUFMSVpFLAorCUNQRV9DTURfQk9PVF9DT01QTEVURSwKKwlDUEVfQ01EX1NFTkRfTVNHLAorCUNQRV9DTURfU0VORF9UUkFOU19NU0csCisJQ1BFX0NNRF9TRU5EX01TR19DT01QTEVURSwKKwlDUEVfQ01EX1BST0NFU1NfSVJRLAorCUNQRV9DTURfUkFNRFVNUCwKKwlDUEVfQ01EX0RMX1NFR01FTlQsCisJQ1BFX0NNRF9TSFVURE9XTiwKKwlDUEVfQ01EX1JFU0VULAorCUNQRV9DTURfREVJTklUSUFMSVpFLAorCUNQRV9DTURfUkVBRCwKKwlDUEVfQ01EX0VOQUJMRV9MQUIsCisJQ1BFX0NNRF9ESVNBQkxFX0xBQiwKKwlDUEVfQ01EX1NXQVBfQlVGRkVSLAorCUNQRV9MQUJfQ0ZHX1NCLAorCUNQRV9DTURfQ0FOQ0VMX01FTUFDQ0VTUywKKwlDUEVfQ01EX1BST0NfSU5DT01JTkdfTVNHLAorCUNQRV9DTURfRlRNX1RFU1QsCit9OworCitlbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCB7CisJQ1BFX1BST0NfU1VDQ0VTUyA9IDAsCisJQ1BFX1BST0NfRkFJTEVELAorCUNQRV9QUk9DX0tJTExFRCwKKwlDUEVfUFJPQ19RVUVVRUQsCit9OworCitzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSB7CisJZW51bSBjcGVfY29tbWFuZCBjb21tYW5kOworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmVzdWx0OworCXZvaWQgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGNwZV9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1haW5fcXVldWU7CisJc3RydWN0IGNvbXBsZXRpb24gY21kX2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uIHRocmVhZF9jb21wOworCXZvaWQgKnRocmVhZF9oYW5kbGVyOworCWJvb2wgc3RvcF90aHJlYWQ7CisJc3RydWN0IG11dGV4IG1zZ19sb2NrOworCWVudW0gY3BlX3N0YXRlIHN0YXRlOworCWVudW0gY3BlX3N1YnN0YXRlIHN1YnN0YXRlOworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50X2xpc3Q7CisJZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgKCpjcGVfcHJvY2Vzc19jb21tYW5kKQorCQkJKHN0cnVjdCBjcGVfY29tbWFuZF9ub2RlICpjb21tYW5kX25vZGUpOworCWVudW0gY3BlX3N2Y19yZXN1bHQgKCpjcGVfY21kX3ZhbGlkYXRlKQorCQkJCShjb25zdCBzdHJ1Y3QgY3BlX2luZm8gKmksCisJCQkJIGVudW0gY3BlX2NvbW1hbmQgY29tbWFuZCk7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKmNwZV9zdGFydF9ub3RpZmljYXRpb24pCisJCQkgICAgIChzdHJ1Y3QgY3BlX2luZm8gKmkpOworCXUzMiBpbml0aWFsaXplZDsKKwlzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24gKnRndDsKKwl2b2lkICpwZW5kaW5nOworCXZvaWQgKmRhdGE7CisJdm9pZCAqY2xpZW50X2NvbnRleHQ7CisJdTMyIGNvZGVjX2lkOworCXN0cnVjdCB3b3JrX3N0cnVjdCBjbGtfcGxhbl93b3JrOworCXN0cnVjdCBjb21wbGV0aW9uIGNvcmVfc3ZjX2NtZF9jb21wbDsKK307CisKK3N0cnVjdCBjcGVfdGd0X3dhaXRpX2luZm8geworCXU4IHRndF93YWl0aV9zaXplOworCXU4ICp0Z3Rfd2FpdGlfZGF0YTsKK307CisKK3N0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiB7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF9ib290KShpbnQgZGVidWdfbW9kZSk7CisKKwl1MzIgKCp0Z3RfY3Bhcl9pbml0X2RvbmUpKHZvaWQpOworCisJdTMyICgqdGd0X2lzX2FjdGl2ZSkodm9pZCk7CisKKwllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3Jlc2V0KSh2b2lkKTsKKworCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3Rfc3RvcCkodm9pZCk7CisKKwllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3JlYWRfbWFpbGJveCkKKwkJCQkodTggKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisJZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF93cml0ZV9tYWlsYm94KQorCQkJCSh1OCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKwllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3JlYWRfcmFtKQorCQkJCShzdHJ1Y3QgY3BlX2luZm8gKmMsCisJCQkJIHN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICpkYXRhKTsKKworCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3Rfd3JpdGVfcmFtKQorCQkJCShzdHJ1Y3QgY3BlX2luZm8gKmMsCisJCQkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKmRhdGEpOworCisJZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF9yb3V0ZV9ub3RpZmljYXRpb24pCisJCQkJKGVudW0gY3BlX3N2Y19tb2R1bGUgbW9kdWxlLAorCQkJCSBlbnVtIGNwZV9zdmNfcm91dGVfZGVzdCBkZXN0KTsKKworCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3Rfc2V0X2RlYnVnX21vZGUpKHUzMiBlbmFibGUpOworCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX2h3X2NmZyAqKCp0Z3RfZ2V0X2NwZV9pbmZvKSh2b2lkKTsKKwllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X2RlaW5pdCkKKwkJCQkoc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSk7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF92b2ljZV90eF9sYWIpCisJCQkJKGJvb2wpOworCXU4ICppbmJveDsKKwl1OCAqb3V0Ym94OworCXN0cnVjdCBjcGVfdGd0X3dhaXRpX2luZm8gKnRndF93YWl0aV9pbmZvOworfTsKKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21faW5pdCgKKwlzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxICpjb2RlY19pbmZvLAorCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqcGFyYW0pOworCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfaW5pdCgKKwlzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxICpjb2RlY19pbmZvLAorCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqcGFyYW0pOworCitzdHJ1Y3QgY3BlX3NlbmRfbXNnIHsKKwl1OCAqcGF5bG9hZDsKKwl1MzIgaXNvYm07CisJdTMyIGFkZHJlc3M7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgY3BlX3JlYWRfaGFuZGxlIHsKKwl2b2lkICpyZWdpc3RyYXRpb247CisJc3RydWN0IGNwZV9pbmZvIHRfaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZmZlcnM7CisJdm9pZCAqY29uZmlnOworfTsKKworc3RydWN0IGdlbmVyaWNfbm90aWZpY2F0aW9uIHsKKwl2b2lkICgqbm90aWZpY2F0aW9uKQorCQkoY29uc3Qgc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpOworCXZvaWQgKCpjbWlfbm90aWZpY2F0aW9uKQorCQkoY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpOworfTsKKworc3RydWN0IGNwZV9ub3RpZl9ub2RlIHsKKwlzdHJ1Y3QgZ2VuZXJpY19ub3RpZmljYXRpb24gbm90aWY7CisJdTMyIG1hc2s7CisJdTMyIHNlcnZpY2U7CisJY29uc3Qgc3RydWN0IGNwZV9pbmZvICpjb250ZXh0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTMyIGRpc2FibGVkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBjcGVfcHJpdiB7CisJc3RydWN0IGNwZV9pbmZvICpjcGVfZGVmYXVsdF9oYW5kbGU7CisJdm9pZCAoKmNwZV9pcnFfY29udHJvbF9jYWxsYmFjaykodTMyIGVuYWJsZSk7CisJdm9pZCAoKmNwZV9xdWVyeV9mcmVxX3BsYW5zX2NiKQorCQkodm9pZCAqY2RjX3ByaXYsCisJCSBzdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4gKmNsa19mcmVxKTsKKwl2b2lkICgqY3BlX2NoYW5nZV9mcmVxX3BsYW5fY2IpKHZvaWQgKmNkY19wcml2LAorCQkJdTMyIGNsa19mcmVxKTsKKwl1MzIgY3BlX21zZ19idWZmZXI7CisJdm9pZCAqY3BlX2NtaV9oYW5kbGU7CisJc3RydWN0IG11dGV4IGNwZV9hcGlfbXV0ZXg7CisJc3RydWN0IG11dGV4IGNwZV9zdmNfbG9jazsKKwlzdHJ1Y3QgY3BlX3N2Y19ib290X2V2ZW50IGNwZV9kZWJ1Z192ZWN0b3I7CisJdm9pZCAqY2RjX3ByaXY7Cit9OworCitzdGF0aWMgc3RydWN0IGNwZV9wcml2IGNwZV9kOworCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBfX2NwZV9zdmNfc2h1dGRvd24odm9pZCAqY3BlX2hhbmRsZSk7CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9pc19jb21tYW5kX3ZhbGlkKAorCQljb25zdCBzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwkJZW51bSBjcGVfY29tbWFuZCBjb21tYW5kKTsKKworc3RhdGljIGludCBjcGVfcmVnaXN0ZXJfcmVhZCh1MzIgcmVnLCB1OCAqdmFsKQoreworCSoodmFsKSA9IHNuZF9zb2NfcmVhZChjcGVfZC5jZGNfcHJpdiwgcmVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3VwZGF0ZV9iaXRzKHUzMiByZWcsCisJCXUzMiBtYXNrLCB1MzIgdmFsdWUpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNwZV9kLmNkY19wcml2LCByZWcsCisJCQkJICBtYXNrLCB2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKKworCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgY3BlX3JlZ2lzdGVyX3dyaXRlKHUzMiByZWcsIHUzMiB2YWwpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocmVnICE9IFRPTVRPTV9BX1NWQVNTX01FTV9CQU5LICYmCisJICAgIHJlZyAhPSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18wKQorCQlwcl9kZWJ1ZygiJXM6IHJlZyA9IDB4JXgsIHZhbHVlID0gMHgleFxuIiwKKwkJCSAgX19mdW5jX18sIHJlZywgdmFsKTsKKworCXJldCA9IHNuZF9zb2Nfd3JpdGUoY3BlX2QuY2RjX3ByaXYsIHJlZywgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOworCisJcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBjcGVfcmVnaXN0ZXJfd3JpdGVfcmVwZWF0KHUzMiByZWcsIHU4ICpwdHIsIHUzMiB0b193cml0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjcGVfZC5jZGNfcHJpdjsKKwlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCWludCByZXQgPSAwOworCisJcmV0ID0gd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdCh3Y2Q5eHh4LCByZWcsIHRvX3dyaXRlLCBwdHIpOworCWlmIChyZXQgIT0gMCkKKwkJcHJfZXJyKCIlczogc2xpbV93cml0ZV9yZXBlYXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOworCisJcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKK30KKworc3RhdGljIGJvb2wgY3BlX3JlZ2lzdGVyX3JlYWRfYXV0b2luY19zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKiBDYWxsZWQgdW5kZXIgbXNncSBsb2NrZWQgY29udGV4dCAqLworc3RhdGljIHZvaWQgY3BlX2NtZF9yZWNlaXZlZChzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKK3sKKwlzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSAqbm9kZSA9IE5VTEw7CisJZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgcHJvY19yYyA9IENQRV9QUk9DX1NVQ0NFU1M7CisKKwlpZiAoIXRfaW5mbykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHRocmVhZCBpbmZvXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0X2luZm8tPm1haW5fcXVldWUpKSB7CisJCWlmIChwcm9jX3JjICE9IENQRV9QUk9DX1NVQ0NFU1MpCisJCQlicmVhazsKKwkJbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnRfaW5mby0+bWFpbl9xdWV1ZSwKKwkJCQkJc3RydWN0IGNwZV9jb21tYW5kX25vZGUsIGxpc3QpOworCQlpZiAoIW5vZGUpCisJCQlicmVhazsKKwkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOworCQlwcm9jX3JjID0gdF9pbmZvLT5jcGVfcHJvY2Vzc19jb21tYW5kKG5vZGUpOworCQlwcl9kZWJ1ZygiJXM6IHByb2Nlc3MgY29tbWFuZCByZXR1cm4gJWRcbiIsCisJCQkgX19mdW5jX18sIHByb2NfcmMpOworCisJCXN3aXRjaCAocHJvY19yYykgeworCQljYXNlIENQRV9QUk9DX1NVQ0NFU1M6CisJCQlrZnJlZShub2RlKTsKKwkJCWJyZWFrOworCQljYXNlIENQRV9QUk9DX0ZBSUxFRDoKKwkJCWtmcmVlKG5vZGUpOworCQkJcHJfZXJyKCIlczogY21kIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCWNhc2UgQ1BFX1BST0NfS0lMTEVEOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlsaXN0X2FkZCgmbm9kZS0+bGlzdCwgJih0X2luZm8tPm1haW5fcXVldWUpKTsKKworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGNwZV93b3JrZXJfdGhyZWFkKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY29udGV4dDsKKworCS8qCisJICogVGhyZWFkIHdpbGwgcnVuIHVudGlsIHJlcXVlc3RlZCB0byBzdG9wIGV4cGxpY2l0bHkKKwkgKiBieSBzZXR0aW5nIHRoZSB0X2luZm8tPnN0b3BfdGhyZWFkIGZsYWcKKwkgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGJlIHByb2Nlc3NlZCAqLworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0X2luZm8tPmNtZF9jb21wbGV0ZSk7CisKKwkJQ1BFX1NWQ19HUkFCX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOworCQljcGVfY21kX3JlY2VpdmVkKHRfaW5mbyk7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZ0X2luZm8tPmNtZF9jb21wbGV0ZSk7CisJCS8qIENoZWNrIGlmIHRocmVhZCBuZWVkcyB0byBiZSBzdG9wcGVkICovCisJCWlmICh0X2luZm8tPnN0b3BfdGhyZWFkKQorCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCUNQRV9TVkNfUkVMX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOworCX07CisKK3VubG9ja19hbmRfZXhpdDoKKwlwcl9kZWJ1ZygiJXM6IHRocmVhZCBzdG9wcGVkXG4iLCBfX2Z1bmNfXyk7CisJQ1BFX1NWQ19SRUxfTE9DSygmdF9pbmZvLT5tc2dfbG9jaywgIm1zZ19sb2NrIik7CisJY29tcGxldGVfYW5kX2V4aXQoJnRfaW5mby0+dGhyZWFkX2NvbXAsIDApOworfQorCitzdGF0aWMgdm9pZCBjcGVfY3JlYXRlX3dvcmtlcl90aHJlYWQoc3RydWN0IGNwZV9pbmZvICp0X2luZm8pCit7CisJSU5JVF9MSVNUX0hFQUQoJnRfaW5mby0+bWFpbl9xdWV1ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZ0X2luZm8tPmNtZF9jb21wbGV0ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZ0X2luZm8tPnRocmVhZF9jb21wKTsKKwl0X2luZm8tPnN0b3BfdGhyZWFkID0gZmFsc2U7CisJdF9pbmZvLT50aHJlYWRfaGFuZGxlciA9IGt0aHJlYWRfcnVuKGNwZV93b3JrZXJfdGhyZWFkLAorCQkodm9pZCAqKXRfaW5mbywgImNwZS13b3JrZXItdGhyZWFkIik7CisJcHJfZGVidWcoIiVzOiBDcmVhdGVkIG5ldyB3b3JrZXIgdGhyZWFkXG4iLAorCQkgX19mdW5jX18pOworfQorCitzdGF0aWMgdm9pZCBjcGVfY2xlYW51cF93b3JrZXJfdGhyZWFkKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQoreworCWlmICghdF9pbmZvLT50aHJlYWRfaGFuZGxlcikgeworCQlwcl9lcnIoIiVzOiB0aHJlYWQgbm90IGNyZWF0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2FrZSB1cCB0aGUgY29tbWFuZCBoYW5kbGVyIGluIGNhc2UKKwkgKiBpdCBpcyB3YWl0aW5nIGZvciBhbiBjb21tYW5kIHRvIGJlIHByb2Nlc3NlZC4KKwkgKi8KKwlDUEVfU1ZDX0dSQUJfTE9DSygmdF9pbmZvLT5tc2dfbG9jaywgIm1zZ19sb2NrIik7CisJdF9pbmZvLT5zdG9wX3RocmVhZCA9IHRydWU7CisJY29tcGxldGUoJnRfaW5mby0+Y21kX2NvbXBsZXRlKTsKKwlDUEVfU1ZDX1JFTF9MT0NLKCZ0X2luZm8tPm1zZ19sb2NrLCAibXNnX2xvY2siKTsKKworCS8qIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZXhpdCAqLworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRfaW5mby0+dGhyZWFkX2NvbXApOworCXRfaW5mby0+dGhyZWFkX2hhbmRsZXIgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBUaHJlYWQgY2xlYW5lZCB1cCBzdWNjZXNzZnVsbHlcbiIsCisJCSBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0CitjcGVfc2VuZF9jbWRfdG9fdGhyZWFkKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCWVudW0gY3BlX2NvbW1hbmQgY29tbWFuZCwgdm9pZCAqZGF0YSwKKwlib29sIGhpZ2hfcHJpbykKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlICpjbWQgPSBOVUxMOworCisJcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIGNvbW1hbmQpOworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kICVkXG4iLAorCQkJX19mdW5jX18sIGNvbW1hbmQpOworCQlyZXR1cm4gcmM7CisJfQorCisJY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9jb21tYW5kX25vZGUpLAorCQkgICAgICBHRlBfQVRPTUlDKTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIENQRV9TVkNfTk9fTUVNT1JZOworCisJY21kLT5jb21tYW5kID0gY29tbWFuZDsKKwljbWQtPmRhdGEgPSBkYXRhOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOworCWlmIChoaWdoX3ByaW8pCisJCWxpc3RfYWRkKCYoY21kLT5saXN0KSwKKwkJCSAmKHRfaW5mby0+bWFpbl9xdWV1ZSkpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmKGNtZC0+bGlzdCksCisJCQkgICAgICAmKHRfaW5mby0+bWFpbl9xdWV1ZSkpOworCWNvbXBsZXRlKCZ0X2luZm8tPmNtZF9jb21wbGV0ZSk7CisJQ1BFX1NWQ19SRUxfTE9DSygmdF9pbmZvLT5tc2dfbG9jaywgIm1zZ19sb2NrIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9jaGFuZ2Vfc3RhdGUoCisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCisJZW51bSBjcGVfc3RhdGUgc3RhdGUsIGVudW0gY3BlX3N1YnN0YXRlIHNzKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisKKwlpZiAoIXRfaW5mbykKKwkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJdF9pbmZvLT5zdGF0ZSA9IHN0YXRlOworCXRfaW5mby0+c3Vic3RhdGUgPSBzczsKKworCXByX2RlYnVnKCIlczogY3VycmVudCBzdGF0ZTogJWQsJWQsIG5ld19zdGF0ZTogJWQsJWRcbiIsCisJCSBfX2Z1bmNfXywgdF9pbmZvLT5zdGF0ZSwgdF9pbmZvLT5zdWJzdGF0ZSwKKwkJIHN0YXRlLCBzcyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0CitjcGVfaXNfY29tbWFuZF92YWxpZChjb25zdCBzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwkJZW51bSBjcGVfY29tbWFuZCBjb21tYW5kKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCisJaWYgKHRfaW5mbyAmJiB0X2luZm8tPmNwZV9jbWRfdmFsaWRhdGUpCisJCXJjID0gdF9pbmZvLT5jcGVfY21kX3ZhbGlkYXRlKHRfaW5mbywgY29tbWFuZCk7CisJZWxzZQorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGhhbmRsZSBvciBjYWxsYmFja1xuIiwKKwkJCV9fZnVuY19fKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGNwZV9ub3RpZnlfY2xpZW50KHN0cnVjdCBjcGVfbm90aWZfbm9kZSAqY2xpZW50LAorCQlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gKnBheWxvYWQpCit7CisJaWYgKCFjbGllbnQgfHwgIXBheWxvYWQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjbGllbnQgb3IgcGF5bG9hZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGNsaWVudC0+bWFzayAmIHBheWxvYWQtPmV2ZW50KSkgeworCQlwcl9kZWJ1ZygiJXM6IGNsaWVudCBtYXNrIDB4JXggbm90IHJlZ2lzdGVyZWQgZm9yIGV2ZW50IDB4JXhcbiIsCisJCQkgX19mdW5jX18sIGNsaWVudC0+bWFzaywgcGF5bG9hZC0+ZXZlbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNsaWVudC0+bm90aWYubm90aWZpY2F0aW9uICYmICFjbGllbnQtPmRpc2FibGVkKQorCQljbGllbnQtPm5vdGlmLm5vdGlmaWNhdGlvbihwYXlsb2FkKTsKKworCWlmICgoY2xpZW50LT5tYXNrICYgQ1BFX1NWQ19DTUlfTVNHKSAmJgorCSAgICAgY2xpZW50LT5ub3RpZi5jbWlfbm90aWZpY2F0aW9uKQorCQljbGllbnQtPm5vdGlmLmNtaV9ub3RpZmljYXRpb24oCisJCQkoY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICopcGF5bG9hZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwZV9icm9hZGNhc3Rfbm90aWZpY2F0aW9uKGNvbnN0IHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCQlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gKnBheWxvYWQpCit7CisJc3RydWN0IGNwZV9ub3RpZl9ub2RlICpuID0gTlVMTDsKKworCWlmICghdF9pbmZvIHx8ICFwYXlsb2FkKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG5vdGlmeSBjbGllbnRzLCBldmVudCA9ICVkXG4iLAorCQkgX19mdW5jX18sIHBheWxvYWQtPmV2ZW50KTsKKwlwYXlsb2FkLT5wcml2YXRlX2RhdGEgPSBjcGVfZC5jZGNfcHJpdjsKKworCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfc3ZjX2xvY2ssICJjcGVfc3ZjIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuLCAmdF9pbmZvLT5jbGllbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoIShuLT5tYXNrICYgQ1BFX1NWQ19DTUlfTVNHKSkKKwkJCWNwZV9ub3RpZnlfY2xpZW50KG4sIHBheWxvYWQpOworCX0KKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfc3ZjX2xvY2ssICJjcGVfc3ZjIik7Cit9CisKK3N0YXRpYyB2b2lkICpjcGVfcmVnaXN0ZXJfZ2VuZXJpYyhzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwkJdm9pZCBub3RpZmljYXRpb25fY2FsbGJhY2soCisJCQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gKnBhcmFtZXRlciksCisJCXZvaWQgY21pX2NhbGxiYWNrKAorCQkJY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpLAorCQl1MzIgbWFzaywgdTMyIHNlcnZpY2UsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNwZV9ub3RpZl9ub2RlICpuID0gTlVMTDsKKworCW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX25vdGlmX25vZGUpLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwluLT5tYXNrID0gbWFzazsKKwluLT5zZXJ2aWNlID0gc2VydmljZTsKKwluLT5ub3RpZi5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb25fY2FsbGJhY2s7CisJbi0+bm90aWYuY21pX25vdGlmaWNhdGlvbiA9IGNtaV9jYWxsYmFjazsKKwluLT5jb250ZXh0ID0gdF9pbmZvOworCW4tPmRpc2FibGVkID0gZmFsc2U7CisJbi0+bmFtZSA9IG5hbWU7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOworCS8qIE1ha2Ugc3VyZSBDUEUgY29yZSBzZXJ2aWNlIGlzIGZpcnN0ICovCisJaWYgKHNlcnZpY2UgPT0gQ01JX0NQRV9DT1JFX1NFUlZJQ0VfSUQpCisJCWxpc3RfYWRkKCZuLT5saXN0LCAmdF9pbmZvLT5jbGllbnRfbGlzdCk7CisJZWxzZQorCQlsaXN0X2FkZF90YWlsKCZuLT5saXN0LCAmdF9pbmZvLT5jbGllbnRfbGlzdCk7CisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9kZXJlZ2lzdGVyX2dlbmVyaWMoc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCisJCXZvaWQgKnJlZ19oYW5kbGUpCit7CisJc3RydWN0IGNwZV9ub3RpZl9ub2RlICpuID0gKHN0cnVjdCBjcGVfbm90aWZfbm9kZSAqKXJlZ19oYW5kbGU7CisKKwlpZiAoIXRfaW5mbyB8fCAhcmVnX2hhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKKwl9CisKKwlsaXN0X2RlbCgmKG4tPmxpc3QpKTsKKwlrZnJlZShyZWdfaGFuZGxlKTsKKworCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfdGd0X2luaXQoc3RydWN0IGNwZV9zdmNfY29kZWNfaW5mb192MSAqaSwKKwkJc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICphYnMpCit7CisJaWYgKCFpIHx8ICFhYnMpIHsKKwkJcHJfZXJyKCIlczogSW5jb3JyZWN0IGluZm9ybWF0aW9uIHByb3ZpZGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gQ1BFX1NWQ19GQUlMRUQ7CisJfQorCisJc3dpdGNoIChpLT5pZCkgeworCWNhc2UgQ1BFX1NWQ19DT0RFQ19UT01UT006CisJCXJldHVybiBjcGVfdGd0X3RvbXRvbV9pbml0KGksIGFicyk7CisJY2FzZSBDUEVfU1ZDX0NPREVDX1dDRDkzMzU6CisJCXJldHVybiBjcGVfdGd0X3djZDkzMzVfaW5pdChpLCBhYnMpOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IENvZGVjIHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBpLT5pZCk7CisJCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBjcGVfbm90aWZ5X2NtaV9jbGllbnQoc3RydWN0IGNwZV9pbmZvICp0X2luZm8sIHU4ICpwYXlsb2FkLAorCQllbnVtIGNwZV9zdmNfcmVzdWx0IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgY3BlX25vdGlmX25vZGUgKm4gPSBOVUxMOworCXN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiBub3RpZjsKKwlzdHJ1Y3QgY21pX2hkciAqaGRyOworCXU4IHNlcnZpY2UgPSAwOworCisJaWYgKCF0X2luZm8gfHwgIXBheWxvYWQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXlsb2FkL2hhbmRsZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWhkciA9IENNSV9HRVRfSEVBREVSKHBheWxvYWQpOworCXNlcnZpY2UgPSBDTUlfSERSX0dFVF9TRVJWSUNFKGhkcik7CisKKwlub3RpZi5ldmVudCA9IENQRV9TVkNfQ01JX01TRzsKKwlub3RpZi5yZXN1bHQgPSByZXN1bHQ7CisJbm90aWYubWVzc2FnZSA9IHBheWxvYWQ7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobiwgJnRfaW5mby0+Y2xpZW50X2xpc3QsIGxpc3QpIHsKKworCQlpZiAoKG4tPm1hc2sgJiBDUEVfU1ZDX0NNSV9NU0cpICYmCisJCSAgICBuLT5zZXJ2aWNlID09IHNlcnZpY2UgJiYKKwkJICAgIG4tPm5vdGlmLmNtaV9ub3RpZmljYXRpb24pIHsKKwkJCW4tPm5vdGlmLmNtaV9ub3RpZmljYXRpb24oJm5vdGlmKTsKKwkJCWJyZWFrOworCQl9CisJfQorCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9zdmNfbG9jaywgImNwZV9zdmMiKTsKK30KKworc3RhdGljIHZvaWQgY3BlX3RvZ2dsZV9pcnFfbm90aWZpY2F0aW9uKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLCB1MzIgdmFsdWUpCit7CisJaWYgKGNwZV9kLmNwZV9pcnFfY29udHJvbF9jYWxsYmFjaykKKwkJY3BlX2QuY3BlX2lycV9jb250cm9sX2NhbGxiYWNrKHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgY3BlX2NvbW1hbmRfY2xlYW51cChzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSAqY29tbWFuZF9ub2RlKQoreworCXN3aXRjaCAoY29tbWFuZF9ub2RlLT5jb21tYW5kKSB7CisJY2FzZSBDUEVfQ01EX1NFTkRfTVNHOgorCWNhc2UgQ1BFX0NNRF9TRU5EX1RSQU5TX01TRzoKKwljYXNlIENQRV9DTURfU0VORF9NU0dfQ09NUExFVEU6CisJY2FzZSBDUEVfQ01EX1NIVVRET1dOOgorCWNhc2UgQ1BFX0NNRF9SRUFEOgorCQlrZnJlZShjb21tYW5kX25vZGUtPmRhdGEpOworCQljb21tYW5kX25vZGUtPmRhdGEgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiB1bmhhbmRsZWQgY29tbWFuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc2VuZF9tc2dfdG9faW5ib3goCisJCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLCB1MzIgb3Bjb2RlLAorCQlzdHJ1Y3QgY3BlX3NlbmRfbXNnICptc2cpCit7CisJc2l6ZV90IGJ5dGVzID0gMDsKKwlzaXplX3QgaW5ib3hfc2l6ZSA9CisJCXRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCktPmluYm94X3NpemU7CisJc3RydWN0IGNtaV9oZHIgKmhkcjsKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJbWVtc2V0KHRfaW5mby0+dGd0LT5pbmJveCwgMCwgaW5ib3hfc2l6ZSk7CisJaGRyID0gQ01JX0dFVF9IRUFERVIodF9pbmZvLT50Z3QtPmluYm94KTsKKwlDTUlfSERSX1NFVF9TRVNTSU9OKGhkciwgMSk7CisJQ01JX0hEUl9TRVRfU0VSVklDRShoZHIsIENNSV9DUEVfQ09SRV9TRVJWSUNFX0lEKTsKKwlDTUlfSERSX1NFVF9WRVJTSU9OKGhkciwgQ01JX0RSSVZFUl9TVVBQT1JURURfVkVSU0lPTik7CisJQ01JX0hEUl9TRVRfT0JNKGhkciwgQ01JX09CTV9GTEFHX0lOX0JBTkQpOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIENQRV9DT1JFX1NWQ19DTURfU0hBUkVEX01FTV9BTExPQzogeworCQlzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9zaGFyZWRfbWVtX2FsbG9jICptOworCisJCUNNSV9IRFJfU0VUX09QQ09ERShoZHIsCisJCQlDUEVfQ09SRV9TVkNfQ01EX1NIQVJFRF9NRU1fQUxMT0MpOworCQlDTUlfSERSX1NFVF9QQVlMT0FEX1NJWkUoaGRyLAorCQkJc2l6ZW9mKHN0cnVjdCBjbWlfY29yZV9zdmNfY21kX3NoYXJlZF9tZW1fYWxsb2MpKTsKKwkJbSA9IChzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9zaGFyZWRfbWVtX2FsbG9jICopCisJCQlDTUlfR0VUX1BBWUxPQUQodF9pbmZvLT50Z3QtPmluYm94KTsKKwkJbS0+c2l6ZSA9IENQRV9NU0dfQlVGRkVSX1NJWkU7CisJCXByX2RlYnVnKCJzZW5kIHNoYXJlZCBtZW0gYWxsb2MgbXNnIHRvIGNwZSBpbmJveFxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDUEVfQ09SRV9TVkNfQ01EX0RSQU1fQUNDRVNTX1JFUToKKwkJQ01JX0hEUl9TRVRfT1BDT0RFKGhkciwKKwkJCUNQRV9DT1JFX1NWQ19DTURfRFJBTV9BQ0NFU1NfUkVRKTsKKwkJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwgMCk7CisJCXByX2RlYnVnKCIlczogQ3JlYXRpbmcgRFJBTSBhY2NlcyByZXF1ZXN0IG1zZ1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWJyZWFrOworCisJY2FzZSBDUEVfQ01JX0JBU0lDX1JTUF9PUENPREU6IHsKKwkJc3RydWN0IGNtaV9iYXNpY19yc3BfcmVzdWx0ICpyc3A7CisKKwkJQ01JX0hEUl9TRVRfT1BDT0RFKGhkciwKKwkJCSAgICAgICBDUEVfQ01JX0JBU0lDX1JTUF9PUENPREUpOworCQlDTUlfSERSX1NFVF9QQVlMT0FEX1NJWkUoaGRyLAorCQkJc2l6ZW9mKHN0cnVjdCBjbWlfYmFzaWNfcnNwX3Jlc3VsdCkpOworCQlyc3AgPSAoc3RydWN0IGNtaV9iYXNpY19yc3BfcmVzdWx0ICopCisJCQkJQ01JX0dFVF9QQVlMT0FEKHRfaW5mby0+dGd0LT5pbmJveCk7CisJCXJzcC0+c3RhdHVzID0gMDsKKwkJcHJfZGVidWcoIiVzOiBzZW5kIGJhc2ljIHJlc3BvbnNlXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAobXNnLT5hZGRyZXNzICE9IDApIHsKKwkJCXN0cnVjdCBjbWlfbXNnX3RyYW5zcG9ydCAqbSA9IE5VTEw7CisJCQlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCBtZW1fc2VnOworCisJCQltZW1fc2VnLnR5cGUgPSBDUEVfU1ZDX0RBVEFfTUVNOworCQkJaWYgKG1zZy0+aXNvYm0pIHsKKwkJCQlzdHJ1Y3QgY21pX29ibSAqb2JtID0gKHN0cnVjdCBjbWlfb2JtICopCisKKwkJCQlDTUlfR0VUX1BBWUxPQUQobXNnLT5wYXlsb2FkKTsKKwkJCQltZW1fc2VnLmNwZV9hZGRyID0gb2JtLT5tZW1faGFuZGxlOworCQkJCW1lbV9zZWcuZGF0YSA9ICh1OCAqKW9ibS0+ZGF0YV9wdHIua3ZhZGRyOworCQkJCW1lbV9zZWcuc2l6ZSA9IG9ibS0+c2l6ZTsKKwkJCQl0X2luZm8tPnRndC0+dGd0X3dyaXRlX3JhbSh0X2luZm8sICZtZW1fc2VnKTsKKwkJCX0KKworCQkJbWVtX3NlZy5jcGVfYWRkciA9IG1zZy0+YWRkcmVzczsKKwkJCW1lbV9zZWcuZGF0YSA9IG1zZy0+cGF5bG9hZDsKKwkJCW1lbV9zZWcuc2l6ZSA9IG1zZy0+c2l6ZTsKKwkJCXRfaW5mby0+dGd0LT50Z3Rfd3JpdGVfcmFtKHRfaW5mbywgJm1lbV9zZWcpOworCisJCQloZHIgPSBDTUlfR0VUX0hFQURFUih0X2luZm8tPnRndC0+aW5ib3gpOworCQkJQ01JX0hEUl9TRVRfT1BDT0RFKGhkciwgQ01JX01TR19UUkFOU1BPUlQpOworCQkJbSA9IChzdHJ1Y3QgY21pX21zZ190cmFuc3BvcnQgKikKKwkJCQlDTUlfR0VUX1BBWUxPQUQodF9pbmZvLT50Z3QtPmluYm94KTsKKwkJCW0tPmFkZHIgPSBtc2ctPmFkZHJlc3M7CisJCQltLT5zaXplID0gbXNnLT5zaXplOworCQkJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwKKwkJCQlzaXplb2Yoc3RydWN0IGNtaV9tc2dfdHJhbnNwb3J0KSk7CisJCX0gZWxzZSB7CisJCQltZW1jcHkodF9pbmZvLT50Z3QtPmluYm94LCBtc2ctPnBheWxvYWQsCisJCQkgICAgICAgbXNnLT5zaXplKTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogc2VuZGluZyBtZXNzYWdlIHRvIGNwZSBpbmJveFxuIiwKKwkJICBfX2Z1bmNfXyk7CisJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpOworCWhkciA9IENNSV9HRVRfSEVBREVSKHRfaW5mby0+dGd0LT5pbmJveCk7CisJYnl0ZXMgKz0gQ01JX0hEUl9HRVRfUEFZTE9BRF9TSVpFKGhkcik7CisJcmMgPSB0X2luZm8tPnRndC0+dGd0X3dyaXRlX21haWxib3godF9pbmZvLT50Z3QtPmluYm94LCBieXRlcyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIGNwZV9pc19jbWRfY2xrX3JlcSh2b2lkICpjbWQpCit7CisJc3RydWN0IGNtaV9oZHIgKmhkcjsKKworCWhkciA9IENNSV9HRVRfSEVBREVSKGNtZCk7CisKKwlpZiAoKENNSV9IRFJfR0VUX1NFUlZJQ0UoaGRyKSA9PQorCSAgICBDTUlfQ1BFX0NPUkVfU0VSVklDRV9JRCkpIHsKKwkJaWYgKENNSV9HRVRfT1BDT0RFKGNtZCkgPT0KKwkJICAgIENQRV9DT1JFX1NWQ19DTURfQ0xLX0ZSRVFfUkVRVUVTVCkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3Byb2Nlc3NfY2xrX2NoYW5nZV9yZXEoCisJCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQoreworCXN0cnVjdCBjbWlfY29yZV9zdmNfY21kX2Nsa19mcmVxX3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IChzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9jbGtfZnJlcV9yZXF1ZXN0ICopCisJCQlDTUlfR0VUX1BBWUxPQUQodF9pbmZvLT50Z3QtPm91dGJveCk7CisKKwlpZiAoIWNwZV9kLmNwZV9jaGFuZ2VfZnJlcV9wbGFuX2NiKSB7CisJCXByX2VycigiJXM6IE5vIHN1cHBvcnQgZm9yIGNsayBmcmVxIGNoYW5nZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOworCX0KKworCWNwZV9kLmNwZV9jaGFuZ2VfZnJlcV9wbGFuX2NiKGNwZV9kLmNkY19wcml2LAorCQkJCSAgICAgIHJlcS0+Y2xrX2ZyZXEpOworCisJLypzZW5kIGEgYmFzaWMgcmVzcG9uc2UqLworCWNwZV9zZW5kX21zZ190b19pbmJveCh0X2luZm8sCisJCUNQRV9DTUlfQkFTSUNfUlNQX09QQ09ERSwgTlVMTCk7CisKKwlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBjcGVfcHJvY2Vzc19pcnFfaW50KHUzMiBpcnEsCisJCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQoreworCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlIHRlbXBfbm9kZTsKKwlzdHJ1Y3QgY3BlX3NlbmRfbXNnICptOworCXU4IHNpemUgPSAwOworCWJvb2wgZXJyX2lycSA9IGZhbHNlOworCXN0cnVjdCBjbWlfaGRyICpoZHI7CisKKwlwcl9kZWJ1ZygiJXM6IGlycSA9ICV1XG4iLCBfX2Z1bmNfXywgaXJxKTsKKworCWlmICghdF9pbmZvKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIENQRV9JUlFfT1VUQk9YX0lSUToKKwkJc2l6ZSA9IHRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCktPm91dGJveF9zaXplOworCQl0X2luZm8tPnRndC0+dGd0X3JlYWRfbWFpbGJveCh0X2luZm8tPnRndC0+b3V0Ym94LCBzaXplKTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9JUlFfTUVNX0FDQ0VTU19FUlJPUjoKKwkJZXJyX2lycSA9IHRydWU7CisJCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfT0ZGTElORSwgQ1BFX1NTX0lETEUpOworCQlicmVhazsKKworCWNhc2UgQ1BFX0lSUV9XRE9HX0JJVEU6CisJY2FzZSBDUEVfSVJRX1JDT19XRE9HX0lOVDoKKwkJZXJyX2lycSA9IHRydWU7CisJCV9fY3BlX3N2Y19zaHV0ZG93bih0X2luZm8pOworCQlicmVhazsKKworCWNhc2UgQ1BFX0lSUV9GTExfTE9DS19MT1NUOgorCWRlZmF1bHQ6CisJCWVycl9pcnEgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwlpZiAoZXJyX2lycSkgeworCQlwcl9lcnIoIiVzOiBDUEUgZXJyb3IgSVJRICV1IG9jY3VycmVkXG4iLAorCQkJX19mdW5jX18sIGlycSk7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHRfaW5mby0+c3RhdGUpIHsKKwljYXNlIENQRV9TVEFURV9CT09USU5HOgorCisJCXN3aXRjaCAodF9pbmZvLT5zdWJzdGF0ZSkgeworCQljYXNlIENQRV9TU19CT09UOgorCQkJdGVtcF9ub2RlLmNvbW1hbmQgPSBDUEVfQ01EX0JPT1RfSU5JVElBTElaRTsKKwkJCXRlbXBfbm9kZS5yZXN1bHQgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCQl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX0JPT1RfSU5JVDsKKwkJCXRfaW5mby0+Y3BlX3Byb2Nlc3NfY29tbWFuZCgmdGVtcF9ub2RlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1BFX1NTX0JPT1RfSU5JVDoKKwkJCXRlbXBfbm9kZS5jb21tYW5kID0gQ1BFX0NNRF9CT09UX0NPTVBMRVRFOworCQkJdGVtcF9ub2RlLnJlc3VsdCA9IENQRV9TVkNfU1VDQ0VTUzsKKwkJCXRfaW5mby0+c3Vic3RhdGUgPSBDUEVfU1NfT05MSU5FOworCQkJdF9pbmZvLT5jcGVfcHJvY2Vzc19jb21tYW5kKCZ0ZW1wX25vZGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIHN1YnN0YXRlICVkIGZvciBzdGF0ZSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHRfaW5mby0+c3RhdGUsIHRfaW5mby0+c3Vic3RhdGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENQRV9TVEFURV9TRU5ESU5HX01TRzoKKwkJaGRyID0gQ01JX0dFVF9IRUFERVIodF9pbmZvLT50Z3QtPm91dGJveCk7CisJCWlmIChDTUlfR0VUX09QQ09ERSh0X2luZm8tPnRndC0+b3V0Ym94KSA9PQorCQkgICAgQ1BFX0xTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjIpIHsKKwkJCXByX2RlYnVnKCIlczogc2Vzc2lvbl9pZDogJXUsIHN0YXRlOiAlZCwlZCwgZXZlbnQgcmVjZWl2ZWRcbiIsCisJCQkJIF9fZnVuY19fLCBDTUlfSERSX0dFVF9TRVNTSU9OX0lEKGhkciksCisJCQkJdF9pbmZvLT5zdGF0ZSwgdF9pbmZvLT5zdWJzdGF0ZSk7CisJCQl0ZW1wX25vZGUuY29tbWFuZCA9IENQRV9DTURfUFJPQ19JTkNPTUlOR19NU0c7CisJCQl0ZW1wX25vZGUuZGF0YSA9IE5VTEw7CisJCQl0X2luZm8tPmNwZV9wcm9jZXNzX2NvbW1hbmQoJnRlbXBfbm9kZSk7CisJCQlicmVhazsKKwkJfQorCisJCW0gPSAoc3RydWN0IGNwZV9zZW5kX21zZyAqKXRfaW5mby0+cGVuZGluZzsKKworCQlzd2l0Y2ggKHRfaW5mby0+c3Vic3RhdGUpIHsKKwkJY2FzZSBDUEVfU1NfTVNHX1JFUVVFU1RfQUNDRVNTOgorCQkJY3BlX3NlbmRfY21kX3RvX3RocmVhZCh0X2luZm8sCisJCQkJQ1BFX0NNRF9TRU5EX1RSQU5TX01TRywgbSwgdHJ1ZSk7CisJCQlicmVhazsKKworCQljYXNlIENQRV9TU19NU0dfU0VORF9JTkJPWDoKKwkJCWlmIChjcGVfaXNfY21kX2Nsa19yZXEodF9pbmZvLT50Z3QtPm91dGJveCkpCisJCQkJY3BlX3Byb2Nlc3NfY2xrX2NoYW5nZV9yZXEodF9pbmZvKTsKKwkJCWVsc2UKKwkJCQljcGVfc2VuZF9jbWRfdG9fdGhyZWFkKHRfaW5mbywKKwkJCQkJQ1BFX0NNRF9TRU5EX01TR19DT01QTEVURSwgbSwgdHJ1ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJfZGVidWcoIiVzOiB1bmhhbmRsZWQgc3Vic3RhdGUgJWQgZm9yIHN0YXRlICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgdF9pbmZvLT5zdGF0ZSwgdF9pbmZvLT5zdWJzdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1BFX1NUQVRFX0lETEU6CisJCXByX2RlYnVnKCIlczogTWVzc2FnZSByZWNlaXZlZCwgbm90aWZ5aW5nIGNsaWVudFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXRlbXBfbm9kZS5jb21tYW5kID0gQ1BFX0NNRF9QUk9DX0lOQ09NSU5HX01TRzsKKwkJdGVtcF9ub2RlLmRhdGEgPSBOVUxMOworCQl0X2luZm8tPmNwZV9wcm9jZXNzX2NvbW1hbmQoJnRlbXBfbm9kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiB1bmhhbmRsZWQgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIHRfaW5mby0+c3RhdGUpOworCQlicmVhazsKKwl9CisKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworfQorCisKK3N0YXRpYyB2b2lkIGJyb2FjYXN0X2Jvb3RfZmFpbGVkKHZvaWQpCit7CisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7CisJc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uIHBheWxvYWQ7CisKKwlwYXlsb2FkLmV2ZW50ID0gQ1BFX1NWQ19CT09UX0ZBSUxFRDsKKwlwYXlsb2FkLnJlc3VsdCA9IENQRV9TVkNfRkFJTEVEOworCXBheWxvYWQucGF5bG9hZCA9IE5VTEw7CisJaWYgKHRfaW5mbykKKwkJcGF5bG9hZC5wcml2YXRlX2RhdGEgPQorCQkJdF9pbmZvLT5jbGllbnRfY29udGV4dDsKKwljcGVfYnJvYWRjYXN0X25vdGlmaWNhdGlvbih0X2luZm8sICZwYXlsb2FkKTsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgYnJvYWRjYXN0X2Jvb3RfZXZlbnQoCisJCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQoreworCXN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiBwYXlsb2FkOworCisJcGF5bG9hZC5ldmVudCA9IENQRV9TVkNfT05MSU5FOworCXBheWxvYWQucmVzdWx0ID0gQ1BFX1NWQ19TVUNDRVNTOworCXBheWxvYWQucGF5bG9hZCA9IE5VTEw7CisJaWYgKHRfaW5mbykKKwkJcGF5bG9hZC5wcml2YXRlX2RhdGEgPQorCQkJdF9pbmZvLT5jbGllbnRfY29udGV4dDsKKwljcGVfYnJvYWRjYXN0X25vdGlmaWNhdGlvbih0X2luZm8sICZwYXlsb2FkKTsKKworCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCBjcGVfYm9vdF9pbml0aWFsaXplKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCWVudW0gY3BlX3N2Y19yZXN1bHQgKmNwZV9yYykKK3sKKwllbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCByYyA9IENQRV9TVkNfRkFJTEVEOworCXN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiBwYXlsb2FkOworCXN0cnVjdCBjbWlfY29yZV9zdmNfZXZlbnRfc3lzdGVtX2Jvb3QgKnAgPSBOVUxMOworCisJaWYgKENNSV9HRVRfT1BDT0RFKHRfaW5mby0+dGd0LT5vdXRib3gpICE9CisJCUNQRV9DT1JFX1NWQ19FVkVOVF9TWVNURU1fQk9PVCkgeworCQlicm9hY2FzdF9ib290X2ZhaWxlZCgpOworCQlyZXR1cm4gcmM7CisJfQorCisJcCA9IChzdHJ1Y3QgY21pX2NvcmVfc3ZjX2V2ZW50X3N5c3RlbV9ib290ICopCisJCUNNSV9HRVRfUEFZTE9BRCh0X2luZm8tPnRndC0+b3V0Ym94KTsKKwlpZiAocC0+c3RhdHVzICE9IENQRV9CT09UX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogY3BlIGJvb3QgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwLT5zdGF0dXMpOworCQlicm9hY2FzdF9ib290X2ZhaWxlZCgpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogYm9vdCB3YXMgc3VjY2Vzc2Z1bCAqLworCWlmIChwLT52ZXJzaW9uID09CisJICAgIENQRV9DT1JFX1ZFUlNJT05fU1lTVEVNX0JPT1RfRVZFTlQpIHsKKwkJY3BlX2QuY3BlX2RlYnVnX3ZlY3Rvci5kZWJ1Z19hZGRyZXNzID0KKwkJCQlwLT5zZnJfYnVmZl9hZGRyZXNzOworCQljcGVfZC5jcGVfZGVidWdfdmVjdG9yLmRlYnVnX2J1ZmZlcl9zaXplID0KKwkJCQlwLT5zZnJfYnVmZl9zaXplOworCQljcGVfZC5jcGVfZGVidWdfdmVjdG9yLnN0YXR1cyA9IHAtPnN0YXR1czsKKwkJcGF5bG9hZC5ldmVudCA9IENQRV9TVkNfQk9PVDsKKwkJcGF5bG9hZC5yZXN1bHQgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCXBheWxvYWQucGF5bG9hZCA9ICh2b2lkICopJmNwZV9kLmNwZV9kZWJ1Z192ZWN0b3I7CisJCXBheWxvYWQucHJpdmF0ZV9kYXRhID0gdF9pbmZvLT5jbGllbnRfY29udGV4dDsKKwkJY3BlX2Jyb2FkY2FzdF9ub3RpZmljYXRpb24odF9pbmZvLCAmcGF5bG9hZCk7CisJfQorCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfQk9PVElORywKKwkJCSBDUEVfU1NfQk9PVF9JTklUKTsKKwkoKmNwZV9yYykgPSBjcGVfc2VuZF9tc2dfdG9faW5ib3godF9pbmZvLAorCQkJQ1BFX0NPUkVfU1ZDX0NNRF9TSEFSRURfTUVNX0FMTE9DLCBOVUxMKTsKKwlyYyA9IENQRV9QUk9DX1NVQ0NFU1M7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBjcGVfc3ZjX2NvcmVfY21pX2hhbmRsZXIoCisJCWNvbnN0IHN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiAqcGFyYW1ldGVyKQoreworCXN0cnVjdCBjbWlfaGRyICpoZHI7CisKKwlpZiAoIXBhcmFtZXRlcikKKwkJcmV0dXJuOworCisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLAorCQkgX19mdW5jX18sIHBhcmFtZXRlci0+ZXZlbnQpOworCisJaWYgKHBhcmFtZXRlci0+ZXZlbnQgIT0gQ01JX0FQSV9NU0cpCisJCXJldHVybjsKKworCWhkciA9IChzdHJ1Y3QgY21pX2hkciAqKSBwYXJhbWV0ZXItPm1lc3NhZ2U7CisKKwlpZiAoaGRyLT5vcGNvZGUgPT0gQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFKSB7CisJCXN0cnVjdCBjbWlfYmFzaWNfcnNwX3Jlc3VsdCAqcmVzdWx0OworCisJCXJlc3VsdCA9IChzdHJ1Y3QgY21pX2Jhc2ljX3JzcF9yZXN1bHQgKikKKwkJCSgodTggKilwYXJhbWV0ZXItPm1lc3NhZ2UpICsgKHNpemVvZigqaGRyKSk7CisJCWlmIChyZXN1bHQtPnN0YXR1cykKKwkJCXByX2VycigiJXM6IGVycm9yIHJlc3BvbnNlLCBlcnJvciBjb2RlID0gJXVcbiIsCisJCQkJX19mdW5jX18sIHJlc3VsdC0+c3RhdHVzKTsKKwkJY29tcGxldGUoJmNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZS0+Y29yZV9zdmNfY21kX2NvbXBsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNwZV9jbGtfcGxhbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IE5VTEw7CisJc2l6ZV90IHNpemUgPSAwOworCXN0cnVjdCBjcGVfc3ZjX2NmZ19jbGtfcGxhbiBwbGFuOworCXU4ICpjbWlfbXNnOworCXN0cnVjdCBjbWlfaGRyICpoZHI7CisJaW50IHJjOworCisJdF9pbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjcGVfaW5mbywgY2xrX3BsYW5fd29yayk7CisJaWYgKCF0X2luZm8pIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgZm9yIGNwZV9pbmZvXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIGNvcmUgc2VydmljZSAqLworCWNwZV9kLmNwZV9jbWlfaGFuZGxlID0gY21pX3JlZ2lzdGVyKAorCQkJCQljcGVfc3ZjX2NvcmVfY21pX2hhbmRsZXIsCisJCQkJCUNNSV9DUEVfQ09SRV9TRVJWSUNFX0lEKTsKKworCS8qIHNlbmQgdGhlIGNsayBwbGFuIGNvbW1hbmQgKi8KKwlpZiAoIWNwZV9kLmNwZV9xdWVyeV9mcmVxX3BsYW5zX2NiKSB7CisJCXByX2VycigiJXM6IE5vIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIGNsayBwbGFuc1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNwZV9kLmNwZV9xdWVyeV9mcmVxX3BsYW5zX2NiKGNwZV9kLmNkY19wcml2LCAmcGxhbik7CisJc2l6ZSA9IHNpemVvZihwbGFuLmN1cnJlbnRfY2xrX2ZlcSkgKworCQlzaXplb2YocGxhbi5udW1fY2xrX2ZyZXFzKTsKKwlzaXplICs9IHBsYW4ubnVtX2Nsa19mcmVxcyAqCisJCSAgc2l6ZW9mKHBsYW4uY2xrX2ZyZXFzWzBdKTsKKwljbWlfbXNnID0ga3phbGxvYyhzaXplICsgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWlfbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgY21pX21zZzsKKwlDTUlfSERSX1NFVF9PUENPREUoaGRyLAorCQkJICAgQ1BFX0NPUkVfU1ZDX0NNRF9DRkdfQ0xLX1BMQU4pOworCUNNSV9IRFJfU0VUX1NFUlZJQ0UoaGRyLCBDTUlfQ1BFX0NPUkVfU0VSVklDRV9JRCk7CisJCUNNSV9IRFJfU0VUX1NFU1NJT04oaGRyLCAxKTsKKwlDTUlfSERSX1NFVF9WRVJTSU9OKGhkciwgQ01JX0RSSVZFUl9TVVBQT1JURURfVkVSU0lPTik7CisJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwgc2l6ZSk7CisJbWVtY3B5KENNSV9HRVRfUEFZTE9BRChjbWlfbXNnKSwgJnBsYW4sCisJICAgICAgIHNpemUpOworCWNtaV9zZW5kX21zZyhjbWlfbXNnKTsKKworCS8qIFdhaXQgZm9yIGNsayBwbGFuIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdF9pbmZvLT5jb3JlX3N2Y19jbWRfY29tcGwsCisJCQkJCSAoMTAgKiBIWikpOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogY2xrIHBsYW4gY21kIHRpbWVkIG91dFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBjbWRfZmFpbDsKKwl9CisKKwkvKiBjbGsgcGxhbiBjbWQgaXMgc3VjY2Vzc2Z1bCwgc2VuZCBzdGFydCBub3RpZmljYXRpb24gKi8KKwlpZiAodF9pbmZvLT5jcGVfc3RhcnRfbm90aWZpY2F0aW9uKQorCQl0X2luZm8tPmNwZV9zdGFydF9ub3RpZmljYXRpb24odF9pbmZvKTsKKwllbHNlCisJCXByX2VycigiJXM6IG5vIHN0YXJ0IG5vdGlmaWNhdGlvblxuIiwKKwkJCSBfX2Z1bmNfXyk7CisKK2NtZF9mYWlsOgorCWtmcmVlKGNtaV9tc2cpOworCWNtaV9kZXJlZ2lzdGVyKGNwZV9kLmNwZV9jbWlfaGFuZGxlKTsKK30KKworc3RhdGljIGVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IGNwZV9ib290X2NvbXBsZXRlKAorCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKK3sKKwlzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZHJzcF9zaGFyZWRfbWVtX2FsbG9jICpwID0gTlVMTDsKKworCWlmIChDTUlfR0VUX09QQ09ERSh0X2luZm8tPnRndC0+b3V0Ym94KSAhPQorCQlDUEVfQ09SRV9TVkNfQ01EUlNQX1NIQVJFRF9NRU1fQUxMT0MpIHsKKwkJYnJvYWNhc3RfYm9vdF9mYWlsZWQoKTsKKwkJcmV0dXJuIENQRV9QUk9DX0ZBSUxFRDsKKwl9CisKKwlwID0gKHN0cnVjdCBjbWlfY29yZV9zdmNfY21kcnNwX3NoYXJlZF9tZW1fYWxsb2MgKikKKwkJQ01JX0dFVF9QQVlMT0FEKHRfaW5mby0+dGd0LT5vdXRib3gpOworCWNwZV9kLmNwZV9tc2dfYnVmZmVyID0gcC0+YWRkcjsKKworCWlmIChjcGVfZC5jcGVfbXNnX2J1ZmZlciA9PSAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY3BlIGJ1ZmZlciBmb3IgbWVzc2FnZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYnJvYWNhc3RfYm9vdF9mYWlsZWQoKTsKKwkJcmV0dXJuIENQRV9QUk9DX0ZBSUxFRDsKKwl9CisKKwljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX0lETEUsIENQRV9TU19JRExFKTsKKwljcGVfY3JlYXRlX3dvcmtlcl90aHJlYWQodF9pbmZvKTsKKworCWlmICh0X2luZm8tPmNvZGVjX2lkICE9IENQRV9TVkNfQ09ERUNfVE9NVE9NKSB7CisJCXNjaGVkdWxlX3dvcmsoJnRfaW5mby0+Y2xrX3BsYW5fd29yayk7CisJfSBlbHNlIHsKKwkJaWYgKHRfaW5mby0+Y3BlX3N0YXJ0X25vdGlmaWNhdGlvbikKKwkJCXRfaW5mby0+Y3BlX3N0YXJ0X25vdGlmaWNhdGlvbih0X2luZm8pOworCQllbHNlCisJCQlwcl9lcnIoIiVzOiBubyBzdGFydCBub3RpZmljYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCX0KKworCXByX2RlYnVnKCIlczogYm9vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18pOworCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCBjcGVfcHJvY2Vzc19zZW5kX21zZygKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwllbnVtIGNwZV9zdmNfcmVzdWx0ICpjcGVfcmMsCisJc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKmNvbW1hbmRfbm9kZSkKK3sKKwllbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCByYyA9IENQRV9QUk9DX1NVQ0NFU1M7CisJc3RydWN0IGNwZV9zZW5kX21zZyAqbSA9CisJCShzdHJ1Y3QgY3BlX3NlbmRfbXNnICopY29tbWFuZF9ub2RlLT5kYXRhOworCXUzMiBzaXplID0gbS0+c2l6ZTsKKworCWlmICh0X2luZm8tPnBlbmRpbmcpIHsKKwkJcHJfZGVidWcoIiVzOiBtZXNzYWdlIHF1ZXVlZFxuIiwgX19mdW5jX18pOworCQkqY3BlX3JjID0gQ1BFX1NWQ19TVUNDRVNTOworCQlyZXR1cm4gQ1BFX1BST0NfUVVFVUVEOworCX0KKworCXByX2RlYnVnKCIlczogU2VuZCBDTUkgbWVzc2FnZSwgc2l6ZSA9ICV1XG4iLAorCQkgX19mdW5jX18sIHNpemUpOworCisJaWYgKHNpemUgPD0gdF9pbmZvLT50Z3QtPnRndF9nZXRfY3BlX2luZm8oKS0+aW5ib3hfc2l6ZSkgeworCQlwcl9kZWJ1ZygiJXM6IE1zZyBmaXRzIG1haWxib3gsIHNpemUgJXVcbiIsCisJCQkgX19mdW5jX18sIHNpemUpOworCQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX1NFTkRJTkdfTVNHLAorCQkJQ1BFX1NTX01TR19TRU5EX0lOQk9YKTsKKwkJdF9pbmZvLT5wZW5kaW5nID0gbTsKKwkJKmNwZV9yYyA9IGNwZV9zZW5kX21zZ190b19pbmJveCh0X2luZm8sIDAsIG0pOworCX0gZWxzZSBpZiAoc2l6ZSA8IENQRV9NU0dfQlVGRkVSX1NJWkUpIHsKKwkJbS0+YWRkcmVzcyA9IGNwZV9kLmNwZV9tc2dfYnVmZmVyOworCQlwcl9kZWJ1ZygiJXM6IE1lc3NhZ2UgcmVxIENNSSBtZW0gYWNjZXNzXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJdF9pbmZvLT5wZW5kaW5nID0gbTsKKwkJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9TRU5ESU5HX01TRywKKwkJCUNQRV9TU19NU0dfUkVRVUVTVF9BQ0NFU1MpOworCQkqY3BlX3JjID0gY3BlX3NlbmRfbXNnX3RvX2luYm94KHRfaW5mbywKKwkJCUNQRV9DT1JFX1NWQ19DTURfRFJBTV9BQ0NFU1NfUkVRLCBtKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgbXNnIHNpemUgJXVcbiIsCisJCQkgX19mdW5jX18sIHNpemUpOworCQljcGVfY29tbWFuZF9jbGVhbnVwKGNvbW1hbmRfbm9kZSk7CisJCXJjID0gQ1BFX1BST0NfRkFJTEVEOworCQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX0lETEUsCisJCQlDUEVfU1NfSURMRSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgY3BlX3Byb2Nlc3NfaW5jb21pbmcoCisJCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQoreworCWVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IHJjID0gQ1BFX1BST0NfRkFJTEVEOworCXN0cnVjdCBjbWlfaGRyICpoZHI7CisKKwloZHIgPSBDTUlfR0VUX0hFQURFUih0X2luZm8tPnRndC0+b3V0Ym94KTsKKworCWlmIChDTUlfSERSX0dFVF9TRVJWSUNFKGhkcikgPT0KKwkgICAgQ01JX0NQRV9DT1JFX1NFUlZJQ0VfSUQpIHsKKwkJcHJfZGVidWcoIiVzOiBjb3JlIHNlcnZpY2UgbWVzc2FnZSByZWNlaXZlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisKKwkJc3dpdGNoIChDTUlfR0VUX09QQ09ERSh0X2luZm8tPnRndC0+b3V0Ym94KSkgeworCQljYXNlIENQRV9DT1JFX1NWQ19DTURfQ0xLX0ZSRVFfUkVRVUVTVDoKKwkJCWNwZV9wcm9jZXNzX2Nsa19jaGFuZ2VfcmVxKHRfaW5mbyk7CisJCQlyYyA9IENQRV9QUk9DX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBDTUlfTVNHX1RSQU5TUE9SVDoKKwkJCXByX2RlYnVnKCIlczogdHJhbnNwb3J0IG1zZyByZWNlaXZlZFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmMgPSBDUEVfUFJPQ19TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFOgorCQkJcHJfZGVidWcoIiVzOiByZWNlaXZlZCBiYXNpYyByc3BcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXJjID0gQ1BFX1BST0NfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZGVidWcoIiVzOiB1bmtub3duIG1lc3NhZ2UgcmVjZWl2ZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogaWYgc2VydmljZSBpZCBpZiBmb3IgYSBDTUkgY2xpZW50LCBub3RpZnkgY2xpZW50ICovCisJCXByX2RlYnVnKCIlczogTWVzc2FnZSByZWNlaXZlZCwgbm90aWZ5aW5nIGNsaWVudFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWNwZV9ub3RpZnlfY21pX2NsaWVudCh0X2luZm8sCisJCQl0X2luZm8tPnRndC0+b3V0Ym94LCBDUEVfU1ZDX1NVQ0NFU1MpOworCQlyYyA9IENQRV9QUk9DX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgY3BlX3Byb2Nlc3Nfa2lsbF90aHJlYWQoCisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCisJc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKmNvbW1hbmRfbm9kZSkKK3sKKwlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gcGF5bG9hZDsKKworCWNwZV9kLmNwZV9tc2dfYnVmZmVyID0gMDsKKwlwYXlsb2FkLnJlc3VsdCA9IENQRV9TVkNfU0hVVFRJTkdfRE9XTjsKKwlwYXlsb2FkLmV2ZW50ID0gQ1BFX1NWQ19PRkZMSU5FOworCXBheWxvYWQucGF5bG9hZCA9IE5VTEw7CisJcGF5bG9hZC5wcml2YXRlX2RhdGEgPSB0X2luZm8tPmNsaWVudF9jb250ZXh0OworCS8qCisJICogTWFrZSBzdGF0ZSBhcyBvZmZsaW5lIGJlZm9yZSBicm9hZGNhc3RpbmcKKwkgKiB0aGUgbWVzc2FnZSB0byBjbGllbnRzLgorCSAqLworCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfT0ZGTElORSwKKwkJCSBDUEVfU1NfSURMRSk7CisJY3BlX2Jyb2FkY2FzdF9ub3RpZmljYXRpb24odF9pbmZvLCAmcGF5bG9hZCk7CisKKwlyZXR1cm4gQ1BFX1BST0NfS0lMTEVEOworfQorCitzdGF0aWMgZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgY3BlX210X3Byb2Nlc3NfY21kKAorCQlzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSAqY29tbWFuZF9ub2RlKQoreworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3JjID0gQ1BFX1NWQ19TVUNDRVNTOworCWVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IHJjID0gQ1BFX1BST0NfU1VDQ0VTUzsKKwlzdHJ1Y3QgY3BlX3NlbmRfbXNnICptOworCXN0cnVjdCBjbWlfaGRyICpoZHI7CisJdTggc2VydmljZSA9IDA7CisJdTggcmV0cmllcyA9IDA7CisKKwlpZiAoIXRfaW5mbyB8fCAhY29tbWFuZF9ub2RlKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlL2NvbW1hbmQgbm9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIENQRV9QUk9DX0ZBSUxFRDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGNtZCA9ICV1XG4iLCBfX2Z1bmNfXywgY29tbWFuZF9ub2RlLT5jb21tYW5kKTsKKworCWNwZV9yYyA9IGNwZV9pc19jb21tYW5kX3ZhbGlkKHRfaW5mbywgY29tbWFuZF9ub2RlLT5jb21tYW5kKTsKKworCWlmIChjcGVfcmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29tbWFuZCAlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY29tbWFuZF9ub2RlLT5jb21tYW5kLCBjcGVfcmMpOworCQlyZXR1cm4gQ1BFX1BST0NfRkFJTEVEOworCX0KKworCXN3aXRjaCAoY29tbWFuZF9ub2RlLT5jb21tYW5kKSB7CisKKwljYXNlIENQRV9DTURfQk9PVF9JTklUSUFMSVpFOgorCQlyYyA9IGNwZV9ib290X2luaXRpYWxpemUodF9pbmZvLCAmY3BlX3JjKTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9DTURfQk9PVF9DT01QTEVURToKKwkJcmMgPSBjcGVfYm9vdF9jb21wbGV0ZSh0X2luZm8pOworCQlicmVhazsKKworCWNhc2UgQ1BFX0NNRF9TRU5EX01TRzoKKwkJcmMgPSBjcGVfcHJvY2Vzc19zZW5kX21zZyh0X2luZm8sICZjcGVfcmMsCisJCQkJCSAgY29tbWFuZF9ub2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9DTURfU0VORF9UUkFOU19NU0c6CisJCW0gPSAoc3RydWN0IGNwZV9zZW5kX21zZyAqKWNvbW1hbmRfbm9kZS0+ZGF0YTsKKworCQl3aGlsZSAocmV0cmllcyA8IENQRV9TVkNfSU5BQ1RJVkVfU1RBVEVfUkVUUklFU19NQVgpIHsKKwkJCWlmICh0X2luZm8tPnRndC0+dGd0X2lzX2FjdGl2ZSgpKSB7CisJCQkJKytyZXRyaWVzOworCQkJCS8qIFdhaXQgZm9yIENQRSB0byBiZSBpbmFjdGl2ZSAqLworCQkJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IGNwZSBpbmFjdGl2ZSBhZnRlciAlZCBhdHRlbXB0c1xuIiwKKwkJCSBfX2Z1bmNfXywgcmV0cmllcyk7CisKKwkJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9TRU5ESU5HX01TRywKKwkJCQlDUEVfU1NfTVNHX1NFTkRfSU5CT1gpOworCQlyYyA9IGNwZV9zZW5kX21zZ190b19pbmJveCh0X2luZm8sIDAsIG0pOworCQlicmVhazsKKworCWNhc2UgQ1BFX0NNRF9TRU5EX01TR19DT01QTEVURToKKwkJaGRyID0gQ01JX0dFVF9IRUFERVIodF9pbmZvLT50Z3QtPm91dGJveCk7CisJCXNlcnZpY2UgPSBDTUlfSERSX0dFVF9TRVJWSUNFKGhkcik7CisJCXByX2RlYnVnKCIlczogbXNnIHNlbmQgc3VjY2Vzcywgbm90aWZ5aW5nIGNsaWVudHNcbiIsCisJCQkgX19mdW5jX18pOworCQljcGVfY29tbWFuZF9jbGVhbnVwKGNvbW1hbmRfbm9kZSk7CisJCXRfaW5mby0+cGVuZGluZyA9IE5VTEw7CisJCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLAorCQkJCSBDUEVfU1RBVEVfSURMRSwgQ1BFX1NTX0lETEUpOworCQljcGVfbm90aWZ5X2NtaV9jbGllbnQodF9pbmZvLAorCQkJdF9pbmZvLT50Z3QtPm91dGJveCwgQ1BFX1NWQ19TVUNDRVNTKTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9DTURfUFJPQ19JTkNPTUlOR19NU0c6CisJCXJjID0gY3BlX3Byb2Nlc3NfaW5jb21pbmcodF9pbmZvKTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9DTURfS0lMTF9USFJFQUQ6CisJCXJjID0gY3BlX3Byb2Nlc3Nfa2lsbF90aHJlYWQodF9pbmZvLCBjb21tYW5kX25vZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVuaGFuZGxlZCBjcGUgY21kID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY29tbWFuZF9ub2RlLT5jb21tYW5kKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNwZV9yYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGV4ZWN1dGUgY29tbWFuZFxuIiwgX19mdW5jX18pOworCQlpZiAodF9pbmZvLT5wZW5kaW5nKSB7CisJCQltID0gKHN0cnVjdCBjcGVfc2VuZF9tc2cgKil0X2luZm8tPnBlbmRpbmc7CisJCQljcGVfbm90aWZ5X2NtaV9jbGllbnQodF9pbmZvLCBtLT5wYXlsb2FkLAorCQkJCQkgICAgICBDUEVfU1ZDX0ZBSUxFRCk7CisJCQl0X2luZm8tPnBlbmRpbmcgPSBOVUxMOworCQl9CisKKwkJY3BlX2NvbW1hbmRfY2xlYW51cChjb21tYW5kX25vZGUpOworCQlyYyA9IENQRV9QUk9DX0ZBSUxFRDsKKwkJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9JRExFLAorCQkJQ1BFX1NTX0lETEUpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX210X3ZhbGlkYXRlX2NtZCgKKwkJY29uc3Qgc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCisJCWVudW0gY3BlX2NvbW1hbmQgY29tbWFuZCkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJaWYgKCh0X2luZm8gPT0gTlVMTCkgfHwgdF9pbmZvLT5pbml0aWFsaXplZCA9PSBmYWxzZSkgeworCQlwcl9lcnIoIiVzOiBjcGUgc2VydmljZSBpcyBub3QgcmVhZHlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDUEVfU1ZDX05PVF9SRUFEWTsKKwl9CisKKwlzd2l0Y2ggKHRfaW5mby0+c3RhdGUpIHsKKwljYXNlIENQRV9TVEFURV9VTklOSVRJQUxJWkVEOgorCWNhc2UgQ1BFX1NUQVRFX0lOSVRJQUxJWkVEOgorCQlzd2l0Y2ggKGNvbW1hbmQpIHsKKwkJY2FzZSBDUEVfQ01EX1JFU0VUOgorCQljYXNlIENQRV9DTURfRExfU0VHTUVOVDoKKwkJY2FzZSBDUEVfQ01EX1JBTURVTVA6CisJCWNhc2UgQ1BFX0NNRF9QUk9DRVNTX0lSUToKKwkJY2FzZSBDUEVfQ01EX0tJTExfVEhSRUFEOgorCQljYXNlIENQRV9DTURfREVJTklUSUFMSVpFOgorCQljYXNlIENQRV9DTURfRlRNX1RFU1Q6CisJCQlyYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSBDUEVfU1ZDX05PVF9SRUFEWTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUEVfU1RBVEVfRE9XTkxPQURJTkc6CisJCXN3aXRjaCAoY29tbWFuZCkgeworCQljYXNlIENQRV9DTURfUkVTRVQ6CisJCWNhc2UgQ1BFX0NNRF9ETF9TRUdNRU5UOgorCQljYXNlIENQRV9DTURfQk9PVDoKKwkJY2FzZSBDUEVfQ01EX0ZUTV9URVNUOgorCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1BFX1NUQVRFX0JPT1RJTkc6CisJCXN3aXRjaCAoY29tbWFuZCkgeworCQljYXNlIENQRV9DTURfUFJPQ0VTU19JUlE6CisJCWNhc2UgQ1BFX0NNRF9CT09UX0lOSVRJQUxJWkU6CisJCWNhc2UgQ1BFX0NNRF9CT09UX0NPTVBMRVRFOgorCQljYXNlIENQRV9DTURfU0hVVERPV046CisJCQlyYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQljYXNlIENQRV9DTURfRlRNX1RFU1Q6CisJCQlyYyA9IENQRV9TVkNfQlVTWTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSBDUEVfU1ZDX05PVF9SRUFEWTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDUEVfU1RBVEVfSURMRToKKwkJc3dpdGNoIChjb21tYW5kKSB7CisJCWNhc2UgQ1BFX0NNRF9TRU5EX01TRzoKKwkJY2FzZSBDUEVfQ01EX1NFTkRfVFJBTlNfTVNHOgorCQljYXNlIENQRV9DTURfU0VORF9NU0dfQ09NUExFVEU6CisJCWNhc2UgQ1BFX0NNRF9QUk9DRVNTX0lSUToKKwkJY2FzZSBDUEVfQ01EX1JFU0VUOgorCQljYXNlIENQRV9DTURfU0hVVERPV046CisJCWNhc2UgQ1BFX0NNRF9LSUxMX1RIUkVBRDoKKwkJY2FzZSBDUEVfQ01EX1BST0NfSU5DT01JTkdfTVNHOgorCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBDUEVfQ01EX0ZUTV9URVNUOgorCQkJcmMgPSBDUEVfU1ZDX0JVU1k7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJjID0gQ1BFX1NWQ19GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1BFX1NUQVRFX1NFTkRJTkdfTVNHOgorCQlzd2l0Y2ggKGNvbW1hbmQpIHsKKwkJY2FzZSBDUEVfQ01EX1NFTkRfTVNHOgorCQljYXNlIENQRV9DTURfU0VORF9UUkFOU19NU0c6CisJCWNhc2UgQ1BFX0NNRF9TRU5EX01TR19DT01QTEVURToKKwkJY2FzZSBDUEVfQ01EX1BST0NFU1NfSVJROgorCQljYXNlIENQRV9DTURfU0hVVERPV046CisJCWNhc2UgQ1BFX0NNRF9LSUxMX1RIUkVBRDoKKwkJY2FzZSBDUEVfQ01EX1BST0NfSU5DT01JTkdfTVNHOgorCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBDUEVfQ01EX0ZUTV9URVNUOgorCQkJcmMgPSBDUEVfU1ZDX0JVU1k7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJjID0gQ1BFX1NWQ19GQUlMRUQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1BFX1NUQVRFX09GRkxJTkU6CisJCXN3aXRjaCAoY29tbWFuZCkgeworCQljYXNlIENQRV9DTURfUkVTRVQ6CisJCWNhc2UgQ1BFX0NNRF9SQU1EVU1QOgorCQljYXNlIENQRV9DTURfS0lMTF9USFJFQUQ6CisJCQlyYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSBDUEVfU1ZDX05PVF9SRUFEWTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiB1bmhhbmRsZWQgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIHRfaW5mby0+c3RhdGUpOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKQorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNvbW1hbmQgJWQsIHN0YXRlID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY29tbWFuZCwgdF9pbmZvLT5zdGF0ZSk7CisJcmV0dXJuIHJjOworfQorCit2b2lkICpjcGVfc3ZjX2luaXRpYWxpemUoCisJCXZvaWQgaXJxX2NvbnRyb2xfY2FsbGJhY2sodTMyIGVuYWJsZSksCisJCWNvbnN0IHZvaWQgKmNvZGVjX2luZm8sIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSBOVUxMOworCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX2h3X2NmZyAqY2FwID0gTlVMTDsKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfc3ZjX2luaXRfcGFyYW0gKmluaXRfY29udGV4dCA9CisJCShzdHJ1Y3QgY3BlX3N2Y19pbml0X3BhcmFtICopIGNvbnRleHQ7CisJdm9pZCAqY2xpZW50X2NvbnRleHQgPSBOVUxMOworCisJaWYgKGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSAmJgorCSAgICBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUtPmluaXRpYWxpemVkID09IHRydWUpCisJCXJldHVybiAodm9pZCAqKWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKwljcGVfZC5jcGVfcXVlcnlfZnJlcV9wbGFuc19jYiA9IE5VTEw7CisJY3BlX2QuY3BlX2NoYW5nZV9mcmVxX3BsYW5fY2IgPSBOVUxMOworCisJaWYgKGNvbnRleHQpIHsKKwkJY2xpZW50X2NvbnRleHQgPSBpbml0X2NvbnRleHQtPmNvbnRleHQ7CisJCXN3aXRjaCAoaW5pdF9jb250ZXh0LT52ZXJzaW9uKSB7CisJCWNhc2UgQ1BFX1NWQ19JTklUX1BBUkFNX1YxOgorCQkJY3BlX2QuY3BlX3F1ZXJ5X2ZyZXFfcGxhbnNfY2IgPQorCQkJCWluaXRfY29udGV4dC0+cXVlcnlfZnJlcV9wbGFuc19jYjsKKwkJCWNwZV9kLmNwZV9jaGFuZ2VfZnJlcV9wbGFuX2NiID0KKwkJCQlpbml0X2NvbnRleHQtPmNoYW5nZV9mcmVxX3BsYW5fY2I7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUpIHsKKwkJY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9pbmZvKSwKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUpCisJCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCQltZW1zZXQoY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjcGVfaW5mbykpOworCX0KKworCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKwl0X2luZm8tPmNsaWVudF9jb250ZXh0ID0gY2xpZW50X2NvbnRleHQ7CisKKwlJTklUX0xJU1RfSEVBRCgmdF9pbmZvLT5jbGllbnRfbGlzdCk7CisJY3BlX2QuY2RjX3ByaXYgPSBjbGllbnRfY29udGV4dDsKKwlJTklUX1dPUksoJnRfaW5mby0+Y2xrX3BsYW5fd29yaywgY3BlX2Nsa19wbGFuX3dvcmspOworCWluaXRfY29tcGxldGlvbigmdF9pbmZvLT5jb3JlX3N2Y19jbWRfY29tcGwpOworCisJdF9pbmZvLT50Z3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24pLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF0X2luZm8tPnRndCkKKwkJZ290byBlcnJfdGd0X2FsbG9jOworCXRfaW5mby0+Y29kZWNfaWQgPQorCQkoKHN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKikgY29kZWNfaW5mbyktPmlkOworCisJcmMgPSBjcGVfc3ZjX3RndF9pbml0KChzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxICopY29kZWNfaW5mbywKKwkJCXRfaW5mby0+dGd0KTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpCisJCWdvdG8gZXJyX3RndF9pbml0OworCisJY2FwID0gdF9pbmZvLT50Z3QtPnRndF9nZXRfY3BlX2luZm8oKTsKKworCW1lbXNldCh0X2luZm8tPnRndC0+b3V0Ym94LCAwLCBjYXAtPm91dGJveF9zaXplKTsKKwltZW1zZXQodF9pbmZvLT50Z3QtPmluYm94LCAwLCBjYXAtPmluYm94X3NpemUpOworCW11dGV4X2luaXQoJnRfaW5mby0+bXNnX2xvY2spOworCWNwZV9kLmNwZV9pcnFfY29udHJvbF9jYWxsYmFjayA9IGlycV9jb250cm9sX2NhbGxiYWNrOworCXRfaW5mby0+Y3BlX3Byb2Nlc3NfY29tbWFuZCA9IGNwZV9tdF9wcm9jZXNzX2NtZDsKKwl0X2luZm8tPmNwZV9jbWRfdmFsaWRhdGUgPSBjcGVfbXRfdmFsaWRhdGVfY21kOworCXRfaW5mby0+Y3BlX3N0YXJ0X25vdGlmaWNhdGlvbiA9IGJyb2FkY2FzdF9ib290X2V2ZW50OworCW11dGV4X2luaXQoJmNwZV9kLmNwZV9hcGlfbXV0ZXgpOworCW11dGV4X2luaXQoJmNwZV9kLmNwZV9zdmNfbG9jayk7CisJcHJfZGVidWcoIiVzOiBjcGUgc2VydmljZXMgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwl0X2luZm8tPnN0YXRlID0gQ1BFX1NUQVRFX0lOSVRJQUxJWkVEOworCXRfaW5mby0+aW5pdGlhbGl6ZWQgPSB0cnVlOworCisJcmV0dXJuIHRfaW5mbzsKKworZXJyX3RndF9pbml0OgorCWtmcmVlKHRfaW5mby0+dGd0KTsKKworZXJyX3RndF9hbGxvYzoKKwlrZnJlZShjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUpOworCWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSA9IE5VTEw7CisKK2Vycl9yZWdpc3RlcjoKKwlyZXR1cm4gTlVMTDsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2RlaW5pdGlhbGl6ZSh2b2lkICpjcGVfaGFuZGxlKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZTsKKworCWlmICghdF9pbmZvKQorCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7CisKKwlyYyA9IGNwZV9pc19jb21tYW5kX3ZhbGlkKHRfaW5mbywgQ1BFX0NNRF9ERUlOSVRJQUxJWkUpOworCisJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgJWRcbiIsCisJCQlfX2Z1bmNfXywgQ1BFX0NNRF9ERUlOSVRJQUxJWkUpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSA9PSB0X2luZm8pCisJCWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSA9IE5VTEw7CisKKwl0X2luZm8tPnRndC0+dGd0X2RlaW5pdCh0X2luZm8tPnRndCk7CisJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9VTklOSVRJQUxJWkVELAorCQkJIENQRV9TU19JRExFKTsKKwltdXRleF9kZXN0cm95KCZ0X2luZm8tPm1zZ19sb2NrKTsKKwlrZnJlZSh0X2luZm8tPnRndCk7CisJa2ZyZWUodF9pbmZvKTsKKwltdXRleF9kZXN0cm95KCZjcGVfZC5jcGVfYXBpX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZjcGVfZC5jcGVfc3ZjX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCit2b2lkICpjcGVfc3ZjX3JlZ2lzdGVyKHZvaWQgKmNwZV9oYW5kbGUsCisJCXZvaWQgKCpub3RpZmljYXRpb25fY2FsbGJhY2spCisJCQkoY29uc3Qgc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpLAorCQl1MzIgbWFzaywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl2b2lkICpyZWdfaGFuZGxlOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJaWYgKCFjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUpIHsKKwkJY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9pbmZvKSwKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUpIHsKKwkJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUsIDAsCisJCQlzaXplb2Yoc3RydWN0IGNwZV9pbmZvKSk7CisJfQorCisJaWYgKCFjcGVfaGFuZGxlKQorCQljcGVfaGFuZGxlID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJcmVnX2hhbmRsZSA9IGNwZV9yZWdpc3Rlcl9nZW5lcmljKChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlLAorCQkJCQkgICBub3RpZmljYXRpb25fY2FsbGJhY2ssCisJCQkJCSAgIE5VTEwsCisJCQkJCSAgIG1hc2ssIENQRV9OT19TRVJWSUNFLCBuYW1lKTsKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCisJcmV0dXJuIHJlZ19oYW5kbGU7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19kZXJlZ2lzdGVyKHZvaWQgKmNwZV9oYW5kbGUsIHZvaWQgKnJlZ19oYW5kbGUpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYzsKKworCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCWlmICghY3BlX2hhbmRsZSkKKwkJY3BlX2hhbmRsZSA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKworCXJjID0gY3BlX2RlcmVnaXN0ZXJfZ2VuZXJpYygoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZSwKKwkJCQkgICAgcmVnX2hhbmRsZSk7CisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKworCXJldHVybiByYzsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2Rvd25sb2FkX3NlZ21lbnQodm9pZCAqY3BlX2hhbmRsZSwKKwljb25zdCBzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqc2VnbWVudCkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlpZiAoIXRfaW5mbykKKwkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIENQRV9DTURfRExfU0VHTUVOVCk7CisKKwlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IGNtZCB2YWxpZGF0aW9uIGZhaWwsIGNtZCA9ICVkXG4iLAorCQkJX19mdW5jX18sIENQRV9DTURfRExfU0VHTUVOVCk7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybiByYzsKKwl9CisKKwljcGVfdG9nZ2xlX2lycV9ub3RpZmljYXRpb24odF9pbmZvLCBmYWxzZSk7CisJdF9pbmZvLT5zdGF0ZSA9IENQRV9TVEFURV9ET1dOTE9BRElORzsKKwl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX0RMX0RPV05MT0FESU5HOworCXJjID0gdF9pbmZvLT50Z3QtPnRndF93cml0ZV9yYW0odF9pbmZvLCBzZWdtZW50KTsKKwljcGVfdG9nZ2xlX2lycV9ub3RpZmljYXRpb24odF9pbmZvLCB0cnVlKTsKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCisJcmV0dXJuIHJjOworfQorCitlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfYm9vdCh2b2lkICpjcGVfaGFuZGxlLCBpbnQgZGVidWdfbW9kZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlpZiAoIXRfaW5mbykKKwkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIENQRV9DTURfQk9PVCk7CisKKwlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IGNtZCB2YWxpZGF0aW9uIGZhaWwsIGNtZCA9ICVkXG4iLAorCQkJX19mdW5jX18sIENQRV9DTURfQk9PVCk7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAocmMgPT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCXRfaW5mby0+dGd0LT50Z3RfYm9vdChkZWJ1Z19tb2RlKTsKKwkJdF9pbmZvLT5zdGF0ZSA9IENQRV9TVEFURV9CT09USU5HOworCQl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX0JPT1Q7CisJCXByX2RlYnVnKCIlczogY3BlIHNlcnZpY2UgYm9vdGluZ1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJfQorCisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19wcm9jZXNzX2lycSh2b2lkICpjcGVfaGFuZGxlLCB1MzIgY3BlX2lycSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisKKwlpZiAoIXRfaW5mbykKKwkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJY3BlX3RvZ2dsZV9pcnFfbm90aWZpY2F0aW9uKHRfaW5mbywgZmFsc2UpOworCWNwZV9wcm9jZXNzX2lycV9pbnQoY3BlX2lycSwgdF9pbmZvKTsKKwljcGVfdG9nZ2xlX2lycV9ub3RpZmljYXRpb24odF9pbmZvLCB0cnVlKTsKKworCXJldHVybiByYzsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3JvdXRlX25vdGlmaWNhdGlvbih2b2lkICpjcGVfaGFuZGxlLAorCQllbnVtIGNwZV9zdmNfbW9kdWxlIG1vZHVsZSwgZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgZGVzdCkKK3sKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX05PVF9SRUFEWTsKKworCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCWlmICghdF9pbmZvKQorCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7CisKKwlpZiAodF9pbmZvLT50Z3QpCisJCXJjID0gdF9pbmZvLT50Z3QtPnRndF9yb3V0ZV9ub3RpZmljYXRpb24obW9kdWxlLCBkZXN0KTsKKworCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBfX2NwZV9zdmNfc2h1dGRvd24odm9pZCAqY3BlX2hhbmRsZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisJc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKm4gPSBOVUxMOworCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlIGtpbGxfY21kOworCisJaWYgKCF0X2luZm8pCisJCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKworCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBDUEVfQ01EX1NIVVRET1dOKTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogY21kIHZhbGlkYXRpb24gZmFpbCwgY21kID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgQ1BFX0NNRF9TSFVURE9XTik7CisJCXJldHVybiByYzsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRfaW5mby0+bWFpbl9xdWV1ZSkpIHsKKwkJbiA9IGxpc3RfZmlyc3RfZW50cnkoJnRfaW5mby0+bWFpbl9xdWV1ZSwKKwkJCQkgICAgIHN0cnVjdCBjcGVfY29tbWFuZF9ub2RlLCBsaXN0KTsKKworCQlpZiAobi0+Y29tbWFuZCA9PSBDUEVfQ01EX1NFTkRfTVNHKSB7CisJCQljcGVfbm90aWZ5X2NtaV9jbGllbnQodF9pbmZvLCAodTggKiluLT5kYXRhLAorCQkJCUNQRV9TVkNfU0hVVFRJTkdfRE9XTik7CisJCX0KKwkJLyoKKwkJICogU2luY2UgY29tbWFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkLAorCQkgKiBkZWxldGUgaXQgZnJvbSB0aGUgbGlzdCBhbmQgcGVyZm9ybSBjbGVhbnVwCisJCSAqLworCQlsaXN0X2RlbCgmbi0+bGlzdCk7CisJCWNwZV9jb21tYW5kX2NsZWFudXAobik7CisJCWtmcmVlKG4pOworCX0KKworCXByX2RlYnVnKCIlczogY3BlIHNlcnZpY2UgT0ZGTElORSBzdGF0ZVxuIiwgX19mdW5jX18pOworCisJdF9pbmZvLT5zdGF0ZSA9IENQRV9TVEFURV9PRkZMSU5FOworCXRfaW5mby0+c3Vic3RhdGUgPSBDUEVfU1NfSURMRTsKKworCW1lbXNldCgma2lsbF9jbWQsIDAsIHNpemVvZihraWxsX2NtZCkpOworCWtpbGxfY21kLmNvbW1hbmQgPSBDUEVfQ01EX0tJTExfVEhSRUFEOworCisJaWYgKHRfaW5mby0+cGVuZGluZykgeworCQlzdHJ1Y3QgY3BlX3NlbmRfbXNnICptID0KKwkJCShzdHJ1Y3QgY3BlX3NlbmRfbXNnICopdF9pbmZvLT5wZW5kaW5nOworCQljcGVfbm90aWZ5X2NtaV9jbGllbnQodF9pbmZvLCBtLT5wYXlsb2FkLAorCQkJQ1BFX1NWQ19TSFVUVElOR19ET1dOKTsKKwkJa2ZyZWUodF9pbmZvLT5wZW5kaW5nKTsKKwkJdF9pbmZvLT5wZW5kaW5nID0gTlVMTDsKKwl9CisKKwljcGVfY2xlYW51cF93b3JrZXJfdGhyZWFkKHRfaW5mbyk7CisJdF9pbmZvLT5jcGVfcHJvY2Vzc19jb21tYW5kKCZraWxsX2NtZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19zaHV0ZG93bih2b2lkICpjcGVfaGFuZGxlKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlyYyA9IF9fY3BlX3N2Y19zaHV0ZG93bihjcGVfaGFuZGxlKTsKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCXJldHVybiByYzsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3Jlc2V0KHZvaWQgKmNwZV9oYW5kbGUpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJaWYgKCF0X2luZm8pCisJCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKworCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBDUEVfQ01EX1JFU0VUKTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogY21kIHZhbGlkYXRpb24gZmFpbCwgY21kID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgQ1BFX0NNRF9SRVNFVCk7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAodF9pbmZvICYmIHRfaW5mby0+dGd0KSB7CisJCXJjID0gdF9pbmZvLT50Z3QtPnRndF9yZXNldCgpOworCQlwcl9kZWJ1ZygiJXM6IGNwZSBzZXJ2aWNlcyBpbiBJTklUSUFMSVpFRCBzdGF0ZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXRfaW5mby0+c3RhdGUgPSBDUEVfU1RBVEVfSU5JVElBTElaRUQ7CisJCXRfaW5mby0+c3Vic3RhdGUgPSBDUEVfU1NfSURMRTsKKwl9CisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKworCXJldHVybiByYzsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3JhbWR1bXAodm9pZCAqY3BlX2hhbmRsZSwKKwkJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKmJ1ZmZlcikKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisKKwlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlpZiAoIXRfaW5mbykKKwkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOworCisJcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIENQRV9DTURfUkFNRFVNUCk7CisJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQlwcl9lcnIoIiVzOiBjbWQgdmFsaWRhdGlvbiBmYWlsLCBjbWQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBDUEVfQ01EX1JBTURVTVApOworCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHRfaW5mby0+dGd0KSB7CisJCXJjID0gdF9pbmZvLT50Z3QtPnRndF9yZWFkX3JhbSh0X2luZm8sIGJ1ZmZlcik7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogY3BlIHNlcnZpY2Ugbm90IHJlYWR5XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7CisJfQorCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19zZXRfZGVidWdfbW9kZSh2b2lkICpjcGVfaGFuZGxlLCB1MzIgbW9kZSkKK3sKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJaWYgKCF0X2luZm8pCisJCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKworCWlmICh0X2luZm8tPnRndCkKKwkJcmMgPSB0X2luZm8tPnRndC0+dGd0X3NldF9kZWJ1Z19tb2RlKG1vZGUpOworCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IHN0cnVjdCBjcGVfc3ZjX2h3X2NmZyAqY3BlX3N2Y19nZXRfaHdfY2ZnKHZvaWQgKmNwZV9oYW5kbGUpCit7CisJc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZTsKKworCWlmICghdF9pbmZvKQorCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7CisKKwlpZiAodF9pbmZvLT50Z3QpCisJCXJldHVybiB0X2luZm8tPnRndC0+dGd0X2dldF9jcGVfaW5mbygpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKmNtaV9yZWdpc3RlcigKKwkJdm9pZCBub3RpZmljYXRpb25fY2FsbGJhY2soCisJCQljb25zdCBzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gKnBhcmFtZXRlciksCisJCXUzMiBzZXJ2aWNlKQoreworCXZvaWQgKnJlZ19oYW5kbGUgPSBOVUxMOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJcmVnX2hhbmRsZSA9IGNwZV9yZWdpc3Rlcl9nZW5lcmljKGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSwKKwkJCU5VTEwsCisJCQlub3RpZmljYXRpb25fY2FsbGJhY2ssCisJCQkoQ1BFX1NWQ19DTUlfTVNHIHwgQ1BFX1NWQ19PRkZMSU5FIHwKKwkJCSBDUEVfU1ZDX09OTElORSksCisJCQlzZXJ2aWNlLAorCQkJIkNNSV9DTElFTlQiKTsKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCisJcmV0dXJuIHJlZ19oYW5kbGU7Cit9CisKK2VudW0gY21pX2FwaV9yZXN1bHQgY21pX2RlcmVnaXN0ZXIodm9pZCAqcmVnX2hhbmRsZSkKK3sKKwl1MzIgY2xpZW50cyA9IDA7CisJc3RydWN0IGNwZV9ub3RpZl9ub2RlICpuID0gTlVMTDsKKwllbnVtIGNtaV9hcGlfcmVzdWx0IHJjID0gQ01JX0FQSV9TVUNDRVNTOworCXN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiBwYXlsb2FkOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJcmMgPSAoZW51bSBjbWlfYXBpX3Jlc3VsdCkgY3BlX2RlcmVnaXN0ZXJfZ2VuZXJpYygKKwkJY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLCByZWdfaGFuZGxlKTsKKworCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfc3ZjX2xvY2ssICJjcGVfc3ZjIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuLCAmY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLT5jbGllbnRfbGlzdCwgbGlzdCkgeworCQlpZiAobi0+bWFzayAmIENQRV9TVkNfQ01JX01TRykKKwkJCWNsaWVudHMrKzsKKwl9CisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOworCisJaWYgKGNsaWVudHMgPT0gMCkgeworCQlwYXlsb2FkLmV2ZW50ID0gQ1BFX1NWQ19DTUlfQ0xJRU5UU19ERVJFRzsKKwkJcGF5bG9hZC5wYXlsb2FkID0gTlVMTDsKKwkJcGF5bG9hZC5yZXN1bHQgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJCWNwZV9icm9hZGNhc3Rfbm90aWZpY2F0aW9uKGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSwgJnBheWxvYWQpOworCX0KKworCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJcmV0dXJuIHJjOworfQorCitlbnVtIGNtaV9hcGlfcmVzdWx0IGNtaV9zZW5kX21zZyh2b2lkICptZXNzYWdlKQoreworCWVudW0gY21pX2FwaV9yZXN1bHQgcmMgPSBDTUlfQVBJX1NVQ0NFU1M7CisJc3RydWN0IGNwZV9zZW5kX21zZyAqbXNnID0gTlVMTDsKKwlzdHJ1Y3QgY21pX2hkciAqaGRyOworCisJQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJaGRyID0gQ01JX0dFVF9IRUFERVIobWVzc2FnZSk7CisJbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9zZW5kX21zZyksCisJCSAgICAgIEdGUF9BVE9NSUMpOworCWlmICghbXNnKSB7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKKwl9CisKKwlpZiAoQ01JX0hEUl9HRVRfT0JNX0ZMQUcoaGRyKSA9PSBDTUlfT0JNX0ZMQUdfT1VUX0JBTkQpCisJCW1zZy0+aXNvYm0gPSAxOworCWVsc2UKKwkJbXNnLT5pc29ibSA9IDA7CisKKwltc2ctPnNpemUgPSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpICsKKwkJCUNNSV9IRFJfR0VUX1BBWUxPQURfU0laRShoZHIpOworCisJbXNnLT5wYXlsb2FkID0ga3phbGxvYyhtc2ctPnNpemUsIEdGUF9BVE9NSUMpOworCWlmICghbXNnLT5wYXlsb2FkKSB7CisJCWtmcmVlKG1zZyk7CisJCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7CisJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKKwl9CisKKwltc2ctPmFkZHJlc3MgPSAwOworCW1lbWNweSgodm9pZCAqKW1zZy0+cGF5bG9hZCwgbWVzc2FnZSwgbXNnLT5zaXplKTsKKworCXJjID0gKGVudW0gY21pX2FwaV9yZXN1bHQpIGNwZV9zZW5kX2NtZF90b190aHJlYWQoCisJCQljcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUsCisJCQlDUEVfQ01EX1NFTkRfTVNHLAorCQkJKHZvaWQgKiltc2csIGZhbHNlKTsKKworCWlmIChyYyAhPSAwKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBxdWV1ZSBtZXNzYWdlXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKG1zZy0+cGF5bG9hZCk7CisJCWtmcmVlKG1zZyk7CisJfQorCisJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19mdG1fdGVzdCh2b2lkICpjcGVfaGFuZGxlLCB1MzIgKnN0YXR1cykKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7CisJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgYmFja3VwX3NlZzsKKwlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCB3YWl0aV9zZWc7CisJdTggKmJhY2t1cF9kYXRhID0gTlVMTDsKKworCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCWlmICghdF9pbmZvKQorCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7CisKKwlyYyA9IGNwZV9pc19jb21tYW5kX3ZhbGlkKHRfaW5mbywgQ1BFX0NNRF9GVE1fVEVTVCk7CisJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQlwcl9lcnIoIiVzOiBjbWQgdmFsaWRhdGlvbiBmYWlsLCBjbWQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBDUEVfQ01EX0ZUTV9URVNUKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAodF9pbmZvICYmIHRfaW5mby0+dGd0KSB7CisJCWJhY2t1cF9kYXRhID0ga3phbGxvYygKKwkJCQl0X2luZm8tPnRndC0+dGd0X3dhaXRpX2luZm8tPnRndF93YWl0aV9zaXplLAorCQkJCUdGUF9LRVJORUwpOworCisJCS8qIENQRSByZXNldCAqLworCQlyYyA9IHRfaW5mby0+dGd0LT50Z3RfcmVzZXQoKTsKKwkJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQkJcHJfZXJyKCIlczogQ1BFIHJlc2V0IGZhaWwhIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlnb3RvIGVycl9yZXR1cm47CisJCX0KKworCQkvKiBCYWNrIHVwIHRoZSA0IGJ5dGUgSVJBTSBkYXRhIGZpcnN0ICovCisJCWJhY2t1cF9zZWcudHlwZSA9IENQRV9TVkNfSU5TVFJVQ1RJT05fTUVNOworCQliYWNrdXBfc2VnLmNwZV9hZGRyID0KKwkJCXRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCktPklSQU1fb2Zmc2V0OworCQliYWNrdXBfc2VnLnNpemUgPSB0X2luZm8tPnRndC0+dGd0X3dhaXRpX2luZm8tPnRndF93YWl0aV9zaXplOworCQliYWNrdXBfc2VnLmRhdGEgPSBiYWNrdXBfZGF0YTsKKworCQlwcl9kZWJ1ZygiJXM6IEJhY2tpbmcgdXAgSVJBTSBkYXRhIGZyb20gQ1BFXG4iLAorCQkJX19mdW5jX18pOworCisJCXJjID0gdF9pbmZvLT50Z3QtPnRndF9yZWFkX3JhbSh0X2luZm8sICZiYWNrdXBfc2VnKTsKKwkJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQkJcHJfZXJyKCIlczogRmFpbCB0byBiYWNrdXAgQ1BFIElSQU0gZGF0YSwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZXJyX3JldHVybjsKKwkJfQorCisJCXByX2RlYnVnKCIlczogQ29tcGxldGUgYmFja2luZyB1cCBJUkFNIGRhdGEgZnJvbSBDUEVcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwkJLyogV3JpdGUgdGhlIFdBSVRJIGluc3RydWN0aW9uIGRhdGEgKi8KKwkJd2FpdGlfc2VnLnR5cGUgPSBDUEVfU1ZDX0lOU1RSVUNUSU9OX01FTTsKKwkJd2FpdGlfc2VnLmNwZV9hZGRyID0KKwkJCXRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCktPklSQU1fb2Zmc2V0OworCQl3YWl0aV9zZWcuc2l6ZSA9IHRfaW5mby0+dGd0LT50Z3Rfd2FpdGlfaW5mby0+dGd0X3dhaXRpX3NpemU7CisJCXdhaXRpX3NlZy5kYXRhID0gdF9pbmZvLT50Z3QtPnRndF93YWl0aV9pbmZvLT50Z3Rfd2FpdGlfZGF0YTsKKworCQlyYyA9IHRfaW5mby0+dGd0LT50Z3Rfd3JpdGVfcmFtKHRfaW5mbywgJndhaXRpX3NlZyk7CisJCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJCXByX2VycigiJXM6IEZhaWwgdG8gd3JpdGUgdGhlIFdBSVRJIGRhdGEsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlnb3RvIHJlc3RvcmVfaXJhbTsKKwkJfQorCisJCS8qIEJvb3QgdXAgY3BlIHRvIGV4ZWN1dGUgdGhlIFdBSVRJIGluc3RydWN0aW9ucyAqLworCQlyYyA9IHRfaW5mby0+dGd0LT50Z3RfYm9vdCgxKTsKKwkJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgeworCQkJcHJfZXJyKCIlczogRmFpbCB0byBib290IENQRSwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gcmVzZXQ7CisJCX0KKworCQkvKgorCQkgKiAxbXMgZGVsYXkgaXMgc3VnZ2VzdGVkIGJ5IHRoZSBodyB0ZWFtIHRvCisJCSAqIHdhaXQgZm9yIGNwZSB0byBib290IHVwLgorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCisJCS8qIENoZWNrIGlmIHRoZSBjcGUgaW5pdCBpcyBkb25lIGFmdGVyIGV4ZWN1dGluZyB0aGUgV0FJVEkgKi8KKwkJKnN0YXR1cyA9IHRfaW5mby0+dGd0LT50Z3RfY3Bhcl9pbml0X2RvbmUoKTsKKworcmVzZXQ6CisJCS8qIFNldCB0aGUgY3BlIGJhY2sgdG8gcmVzZXQgc3RhdGUgKi8KKwkJcmMgPSB0X2luZm8tPnRndC0+dGd0X3Jlc2V0KCk7CisJCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJCXByX2VycigiJXM6IENQRSByZXNldCBmYWlsISBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byByZXN0b3JlX2lyYW07CisJCX0KKworcmVzdG9yZV9pcmFtOgorCQkvKiBSZXN0b3JlIHRoZSBJUkFNIDQgYnl0ZXMgZGF0YSAqLworCQlyYyA9IHRfaW5mby0+dGd0LT50Z3Rfd3JpdGVfcmFtKHRfaW5mbywgJmJhY2t1cF9zZWcpOworCQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsIHRvIHJlc3RvcmUgdGhlIElSQU0gZGF0YSwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZXJyX3JldHVybjsKKwkJfQorCX0KKworZXJyX3JldHVybjoKKwlrZnJlZShiYWNrdXBfZGF0YSk7CitmYWlsX2NtZDoKKwlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fYm9vdChpbnQgZGVidWdfbW9kZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJaWYgKCFkZWJ1Z19tb2RlKQorCQlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DUEFSX1dET0dfQ0ZHLAorCQkJCSAgICAgMHgzRiwgMHgzMSk7CisJZWxzZQorCQlwcl9pbmZvKCIlczogQ1BFIGluIGRlYnVnIG1vZGUsIFdET0cgZGlzYWJsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMLAorCQkJICAgICAweDAyLCAweDAwKTsKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMLAorCQkJICAgICAweDBDLCAweDA0KTsKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DUEFSX0NGRywKKwkJCSAgICAgMHgwMSwgMHgwMSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1MzIgY3BlX3RndF90b210b21faXNfY3Bhcl9pbml0X2RvbmUodm9pZCkKK3sKKwl1OCBzdGF0dXMgPSAwOworCisJY3BlX3JlZ2lzdGVyX3JlYWQoVE9NVE9NX0FfU1ZBU1NfU1RBVFVTLCAmc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzICYgMHgwMTsKK30KKworc3RhdGljIHUzMiBjcGVfdGd0X3RvbXRvbV9pc19hY3RpdmUodm9pZCkKK3sKKwl1OCBzdGF0dXMgPSAwOworCisJY3BlX3JlZ2lzdGVyX3JlYWQoVE9NVE9NX0FfU1ZBU1NfU1RBVFVTLCAmc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzICYgMHgwNDsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fcmVzZXQodm9pZCkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJcmMgPSBjcGVfdXBkYXRlX2JpdHMoVE9NVE9NX0FfU1ZBU1NfQ1BBUl9XRE9HX0NGRywKKwkJCSAgICAgMHgzMCwgMHgwMCk7CisKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DUEFSX0NGRywKKwkJCSAgICAgMHgwMSwgMHgwMCk7CisJcmMgPSBjcGVfdXBkYXRlX2JpdHMoVE9NVE9NX0FfTUVNX0xFQUtBR0VfQ1RMLAorCQkJICAgICAweDA3LCAweDAzKTsKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMLAorCQkJICAgICAweDA4LCAweDA4KTsKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DTEtSU1RfQ1RMLAorCQkJICAgICAweDAyLCAweDAyKTsKKwlyZXR1cm4gcmM7Cit9CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fdm9pY2V0eChib29sIGVuYWJsZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXU4IHZhbCA9IDA7CisKKwlpZiAoZW5hYmxlKQorCQl2YWwgPSAweDAyOworCWVsc2UKKwkJdmFsID0gMHgwMDsKKwlyYyA9IGNwZV91cGRhdGVfYml0cyhUT01UT01fQV9TVkFTU19DRkcsCisJCQkgICAgIDB4MDIsIHZhbCk7CisJdmFsID0gMDsKKwljcGVfcmVnaXN0ZXJfcmVhZChUT01UT01fQV9TVkFTU19DRkcsICZ2YWwpOworCXJldHVybiByYzsKK30KKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3RvZ2dsZV9sYWIodm9pZCAqY3BlX2hhbmRsZSwgYm9vbCBlbmFibGUpCit7CisKKwlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOworCisJaWYgKCF0X2luZm8pCisJCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKKworCWlmICh0X2luZm8tPnRndCkKKwkJcmV0dXJuIHRfaW5mby0+dGd0LT50Z3Rfdm9pY2VfdHhfbGFiKGVuYWJsZSk7CisJZWxzZQorCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fcmVhZF9tYWlsYm94KHU4ICpidWZmZXIsCisJc2l6ZV90IHNpemUpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwl1MzIgY250ID0gMDsKKworCWlmIChzaXplID49IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfU0laRSkKKwkJc2l6ZSA9IFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfU0laRSAtIDE7CisJZm9yIChjbnQgPSAwOyAoY250IDwgc2l6ZSkgJiYgKHJjID09IENQRV9TVkNfU1VDQ0VTUyk7IGNudCsrKSB7CisJCXJjID0gY3BlX3JlZ2lzdGVyX3JlYWQoVE9NVE9NX0FfU1ZBU1NfU1BFX09VVEJPWChjbnQpLAorCQkJJihidWZmZXJbY250XSkpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX3dyaXRlX21haWxib3godTggKmJ1ZmZlciwKKwlzaXplX3Qgc2l6ZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXUzMiBjbnQgPSAwOworCisJaWYgKHNpemUgPj0gVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1NJWkUpCisJCXNpemUgPSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfU0laRSAtIDE7CisJZm9yIChjbnQgPSAwOyAoY250IDwgc2l6ZSkgJiYgKHJjID09IENQRV9TVkNfU1VDQ0VTUyk7IGNudCsrKSB7CisJCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWChjbnQpLAorCQkJYnVmZmVyW2NudF0pOworCX0KKworCWlmIChyYyA9PSBDUEVfU1ZDX1NVQ0NFU1MpCisJCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF9UUkcsIDEpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfZ2V0X21lbV9hZGRyKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqbWVtX3NlZywKKwkJdTMyICphZGRyLCB1OCAqbWVtKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTMyIG9mZnNldCwgbWVtX3N6LCBhZGRyZXNzOworCXU4IG1lbV90eXBlOworCisJc3dpdGNoIChtZW1fc2VnLT50eXBlKSB7CisKKwljYXNlIENQRV9TVkNfREFUQV9NRU06CisJCW1lbV90eXBlID0gTUVNX0FDQ0VTU19EUkFNX1ZBTDsKKwkJb2Zmc2V0ID0gVE9NVE9NX0FfU1ZBU1NfU1BFX0RSQU1fT0ZGU0VUOworCQltZW1fc3ogPSBUT01UT01fQV9TVkFTU19TUEVfRFJBTV9TSVpFOworCQlicmVhazsKKworCWNhc2UgQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU06CisJCW1lbV90eXBlID0gTUVNX0FDQ0VTU19JUkFNX1ZBTDsKKwkJb2Zmc2V0ID0gVE9NVE9NX0FfU1ZBU1NfU1BFX0lSQU1fT0ZGU0VUOworCQltZW1fc3ogPSBUT01UT01fQV9TVkFTU19TUEVfSVJBTV9TSVpFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgbWVtIHR5cGUgPSAldVxuIiwKKwkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisJfQorCisJaWYgKG1lbV9zZWctPmNwZV9hZGRyIDwgb2Zmc2V0KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgYWRkciAleCBmb3IgbWVtIHR5cGUgJXVcbiIsCisJCQlfX2Z1bmNfXywgbWVtX3NlZy0+Y3BlX2FkZHIsIG1lbV90eXBlKTsKKwkJCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCX0KKworCWFkZHJlc3MgPSBtZW1fc2VnLT5jcGVfYWRkciAtIG9mZnNldDsKKwlpZiAoYWRkcmVzcyArIG1lbV9zZWctPnNpemUgPiBtZW1fc3opIHsKKwkJcHJfZXJyKCIlczogd3Jvbmcgc2l6ZSAlenUsIHN0YXJ0IGFkZHJlc3MgJXgsIG1lbV90eXBlICV1XG4iLAorCQkJX19mdW5jX18sIG1lbV9zZWctPnNpemUsIGFkZHJlc3MsIG1lbV90eXBlKTsKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisJfQorCisJKCphZGRyKSA9IGFkZHJlc3M7CisJKCptZW0pID0gbWVtX3R5cGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX3JlYWRfUkFNKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCQlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqbWVtX3NlZykKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCXU4IG1lbV9yZWdfdmFsID0gMDsKKwl1MzIgY250ID0gMDsKKwlib29sIGF1dG9pbmM7CisJdTggbWVtID0gTUVNX0FDQ0VTU19OT05FX1ZBTDsKKwl1MzIgYWRkciA9IDA7CisJdTMyIHB0cl91cGRhdGUgPSB0cnVlOworCisJaWYgKCFtZW1fc2VnKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgbWVtIHNlZ21lbnRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCX0KKworCXJjID0gY3BlX2dldF9tZW1fYWRkcih0X2luZm8sIG1lbV9zZWcsICZhZGRyLCAmbWVtKTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogQ2Fubm90IG9idGFpbiBhZGRyZXNzLCBtZW1fdHlwZSAldVxuIiwKKwkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9DVEwsIDApOworCWF1dG9pbmMgPSBjcGVfcmVnaXN0ZXJfcmVhZF9hdXRvaW5jX3N1cHBvcnRlZCgpOworCWlmIChhdXRvaW5jKQorCQltZW1fcmVnX3ZhbCB8PSAweDA0OworCisJbWVtX3JlZ192YWwgfD0gMHgwODsKKwltZW1fcmVnX3ZhbCB8PSBtZW07CisKKwlkbyB7CisJCWlmICghYXV0b2luYyB8fCBwdHJfdXBkYXRlKSB7CisJCQlyYyA9IGNwZV9yZWdpc3Rlcl93cml0ZShUT01UT01fQV9TVkFTU19NRU1fUFRSMCwKKwkJCQkoYWRkciAmIDB4RkYpKTsKKwkJCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9QVFIxLAorCQkJCSgoYWRkciA+PiA4KSAmIDB4RkYpKTsKKwkJCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9QVFIyLAorCQkJCSgoYWRkciA+PiAxNikgJiAweEZGKSk7CisKKwkJCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9DVEwsCisJCQkJCQltZW1fcmVnX3ZhbCk7CisKKwkJCXB0cl91cGRhdGUgPSBmYWxzZTsKKwkJfQorCQlyYyA9IGNwZV9yZWdpc3Rlcl9yZWFkKFRPTVRPTV9BX1NWQVNTX01FTV9CQU5LLAorCQkJJm1lbV9zZWctPmRhdGFbY250XSk7CisKKwkJaWYgKCFhdXRvaW5jKQorCQkJcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoVE9NVE9NX0FfU1ZBU1NfTUVNX0NUTCwgMCk7CisJfSB3aGlsZSAoKytjbnQgPCBtZW1fc2VnLT5zaXplKTsKKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9DVEwsIDApOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV93cml0ZV9SQU0oc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCisJCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICptZW1fc2VnKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTggbWVtX3JlZ192YWwgPSAwOworCXU4IG1lbSA9IE1FTV9BQ0NFU1NfTk9ORV9WQUw7CisJdTMyIGFkZHIgPSAwOworCXU4ICp0ZW1wX3B0ciA9IE5VTEw7CisJdTMyIHRlbXBfc2l6ZSA9IDA7CisJYm9vbCBhdXRvaW5jOworCisJaWYgKCFtZW1fc2VnKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgbWVtIHNlZ21lbnRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCX0KKworCXJjID0gY3BlX2dldF9tZW1fYWRkcih0X2luZm8sIG1lbV9zZWcsICZhZGRyLCAmbWVtKTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogQ2Fubm90IG9idGFpbiBhZGRyZXNzLCBtZW1fdHlwZSAldVxuIiwKKwkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWF1dG9pbmMgPSBjcGVfcmVnaXN0ZXJfcmVhZF9hdXRvaW5jX3N1cHBvcnRlZCgpOworCWlmIChhdXRvaW5jKQorCQltZW1fcmVnX3ZhbCB8PSAweDA0OworCW1lbV9yZWdfdmFsIHw9IG1lbTsKKworCXJjID0gY3BlX3VwZGF0ZV9iaXRzKFRPTVRPTV9BX1NWQVNTX01FTV9DVEwsCisJCQkgICAgIDB4MEYsIG1lbV9yZWdfdmFsKTsKKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9QVFIwLAorCQkJCShhZGRyICYgMHhGRikpOworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9QVFIxLAorCQkJCSgoYWRkciA+PiA4KSAmIDB4RkYpKTsKKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFRPTVRPTV9BX1NWQVNTX01FTV9QVFIyLAorCQkJCSgoYWRkciA+PiAxNikgJiAweEZGKSk7CisKKwl0ZW1wX3NpemUgPSAwOworCXRlbXBfcHRyID0gbWVtX3NlZy0+ZGF0YTsKKworCXdoaWxlICh0ZW1wX3NpemUgPD0gbWVtX3NlZy0+c2l6ZSkgeworCQl1MzIgdG9fd3JpdGUgPSAobWVtX3NlZy0+c2l6ZSA+PSB0ZW1wX3NpemUrQ0hVTktfU0laRSkKKwkJCT8gQ0hVTktfU0laRSA6IChtZW1fc2VnLT5zaXplLXRlbXBfc2l6ZSk7CisKKwkJaWYgKHRfaW5mby0+c3RhdGUgPT0gQ1BFX1NUQVRFX09GRkxJTkUpIHsKKwkJCXByX2VycigiJXM6IENQRSBpcyBvZmZsaW5lXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gQ1BFX1NWQ19GQUlMRUQ7CisJCX0KKworCQljcGVfcmVnaXN0ZXJfd3JpdGVfcmVwZWF0KFRPTVRPTV9BX1NWQVNTX01FTV9CQU5LLAorCQkJdGVtcF9wdHIsIHRvX3dyaXRlKTsKKwkJdGVtcF9zaXplICs9IENIVU5LX1NJWkU7CisJCXRlbXBfcHRyICs9IENIVU5LX1NJWkU7CisJfQorCisJcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoVE9NVE9NX0FfU1ZBU1NfTUVNX0NUTCwgMCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9yb3V0ZV9ub3RpZmljYXRpb24oCisJCWVudW0gY3BlX3N2Y19tb2R1bGUgbW9kdWxlLAorCQllbnVtIGNwZV9zdmNfcm91dGVfZGVzdCBkZXN0KQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTggY3RsX3JlZ192YWwgPSAwOworCisJc3dpdGNoIChtb2R1bGUpIHsKKwljYXNlIENQRV9TVkNfTElTVEVOX1BST0M6CisJCXN3aXRjaCAoZGVzdCkgeworCQljYXNlIENQRV9TVkNfRVhURVJOQUw6CisJCQljdGxfcmVnX3ZhbCA9IExJU1RFTl9DVExfTVNNX1ZBTDsKKwkJCWJyZWFrOworCQljYXNlIENQRV9TVkNfSU5URVJOQUw6CisJCQljdGxfcmVnX3ZhbCA9IExJU1RFTl9DVExfU1BFX1ZBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogSW52YWxpZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBkZXN0KTsKKwkJCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKKwkJfQorCisJCXJjID0gY3BlX3VwZGF0ZV9iaXRzKFRPTVRPTV9BX1NWQVNTX0NGRywKKwkJCQkgICAgIDB4MDEsIGN0bF9yZWdfdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBtb2R1bGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgbW9kdWxlKTsKKwkJcmMgPSBDUEVfU1ZDX0ZBSUxFRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9zZXRfZGVidWdfbW9kZSh1MzIgZW5hYmxlKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTggZGJnX3JlZ192YWwgPSAweDAwOworCisJaWYgKGVuYWJsZSkKKwkJZGJnX3JlZ192YWwgPSAweDA4OworCXJjID0gY3BlX3VwZGF0ZV9iaXRzKFRPTVRPTV9BX1NWQVNTX0RFQlVHLAorCQkJICAgICAweDA4LCBkYmdfcmVnX3ZhbCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwZV9zdmNfaHdfY2ZnICpjcGVfdGd0X3RvbXRvbV9nZXRfY3BlX2luZm8odm9pZCkKK3sKKwlyZXR1cm4gJmNwZV9zdmNfdG9tdG9tX2luZm87Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX2RlaW5pdCgKKwkJc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSkKK3sKKwlrZnJlZShwYXJhbS0+aW5ib3gpOworCXBhcmFtLT5pbmJveCA9IE5VTEw7CisJa2ZyZWUocGFyYW0tPm91dGJveCk7CisJcGFyYW0tPm91dGJveCA9IE5VTEw7CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2Yoc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uKSk7CisJcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKK30KKworc3RhdGljIHU4IGNwZV90Z3RfdG9tdG9tX3dhaXRpX2RhdGFbXSA9IHsweDAwLCAweDcwLCAweDAwLCAweDAwfTsKKworc3RhdGljIHN0cnVjdCBjcGVfdGd0X3dhaXRpX2luZm8gY3BlX3RndF90b210b21fd2FpdGlfaW5mbyA9IHsKKwkudGd0X3dhaXRpX3NpemUgPSBBUlJBWV9TSVpFKGNwZV90Z3RfdG9tdG9tX3dhaXRpX2RhdGEpLAorCS50Z3Rfd2FpdGlfZGF0YSA9IGNwZV90Z3RfdG9tdG9tX3dhaXRpX2RhdGEsCit9OworCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9pbml0KAorCQlzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxICpjb2RlY19pbmZvLAorCQlzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24gKnBhcmFtKQoreworCWlmICghY29kZWNfaW5mbykKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisKKwlpZiAoY29kZWNfaW5mby0+aWQgPT0gQ1BFX1NWQ19DT0RFQ19UT01UT00pIHsKKwkJcGFyYW0tPnRndF9ib290ICAgICAgPSBjcGVfdGd0X3RvbXRvbV9ib290OworCQlwYXJhbS0+dGd0X2NwYXJfaW5pdF9kb25lID0gY3BlX3RndF90b210b21faXNfY3Bhcl9pbml0X2RvbmU7CisJCXBhcmFtLT50Z3RfaXNfYWN0aXZlID0gY3BlX3RndF90b210b21faXNfYWN0aXZlOworCQlwYXJhbS0+dGd0X3Jlc2V0ID0gY3BlX3RndF90b210b21fcmVzZXQ7CisJCXBhcmFtLT50Z3RfcmVhZF9tYWlsYm94ID0gY3BlX3RndF90b210b21fcmVhZF9tYWlsYm94OworCQlwYXJhbS0+dGd0X3dyaXRlX21haWxib3ggPSBjcGVfdGd0X3RvbXRvbV93cml0ZV9tYWlsYm94OworCQlwYXJhbS0+dGd0X3JlYWRfcmFtID0gY3BlX3RndF90b210b21fcmVhZF9SQU07CisJCXBhcmFtLT50Z3Rfd3JpdGVfcmFtID0gY3BlX3RndF90b210b21fd3JpdGVfUkFNOworCQlwYXJhbS0+dGd0X3JvdXRlX25vdGlmaWNhdGlvbiA9CisJCQljcGVfdGd0X3RvbXRvbV9yb3V0ZV9ub3RpZmljYXRpb247CisJCXBhcmFtLT50Z3Rfc2V0X2RlYnVnX21vZGUgPSBjcGVfdGd0X3RvbXRvbV9zZXRfZGVidWdfbW9kZTsKKwkJcGFyYW0tPnRndF9nZXRfY3BlX2luZm8gPSBjcGVfdGd0X3RvbXRvbV9nZXRfY3BlX2luZm87CisJCXBhcmFtLT50Z3RfZGVpbml0ID0gY3BlX3RndF90b210b21fZGVpbml0OworCQlwYXJhbS0+dGd0X3ZvaWNlX3R4X2xhYiA9IGNwZV90Z3RfdG9tdG9tX3ZvaWNldHg7CisJCXBhcmFtLT50Z3Rfd2FpdGlfaW5mbyA9ICZjcGVfdGd0X3RvbXRvbV93YWl0aV9pbmZvOworCisJCXBhcmFtLT5pbmJveCA9IGt6YWxsb2MoVE9NVE9NX0FfU1ZBU1NfU1BFX0lOQk9YX1NJWkUsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtLT5pbmJveCkKKwkJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKKworCQlwYXJhbS0+b3V0Ym94ID0ga3phbGxvYyhUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YX1NJWkUsCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtLT5vdXRib3gpIHsKKwkJCWtmcmVlKHBhcmFtLT5pbmJveCk7CisJCQlyZXR1cm4gQ1BFX1NWQ19OT19NRU1PUlk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfYm9vdChpbnQgZGVidWdfbW9kZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJaWYgKCFkZWJ1Z19tb2RlKQorCQlyYyB8PSBjcGVfdXBkYXRlX2JpdHMoCisJCQkJV0NEOTMzNV9DUEVfU1NfV0RPR19DRkcsCisJCQkJMHgzZiwgMHgzMSk7CisJZWxzZQorCQlwcl9pbmZvKCIlczogQ1BFIGluIGRlYnVnIG1vZGUsIFdET0cgZGlzYWJsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCwgMTkpOworCXJjIHw9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DUEFSX0NUTCwgMHgwNCwgMHgwMCk7CisJcmMgfD0gY3BlX3VwZGF0ZV9iaXRzKFdDRDkzMzVfQ1BFX1NTX0NQQVJfQ1RMLCAweDAyLCAweDAyKTsKKwlyYyB8PSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwsIDB4MDEsIDB4MDEpOworCisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYm9vdCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IENQRV9TVkNfRkFJTEVEOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHUzMiBjcGVfdGd0X3djZDkzMzVfaXNfY3Bhcl9pbml0X2RvbmUodm9pZCkKK3sKKwl1OCB0ZW1wID0gMDsKKworCWNwZV9yZWdpc3Rlcl9yZWFkKFdDRDkzMzVfQ1BFX1NTX1NUQVRVUywgJnRlbXApOworCXJldHVybiB0ZW1wICYgMHgxOworfQorCitzdGF0aWMgdTMyIGNwZV90Z3Rfd2NkOTMzNV9pc19hY3RpdmUodm9pZCkKK3sKKwl1OCB0ZW1wID0gMDsKKworCWNwZV9yZWdpc3Rlcl9yZWFkKFdDRDkzMzVfQ1BFX1NTX1NUQVRVUywgJnRlbXApOworCXJldHVybiB0ZW1wICYgMHg0OworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfcmVzZXQodm9pZCkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJcmMgfD0gY3BlX3VwZGF0ZV9iaXRzKFdDRDkzMzVfQ1BFX1NTX0NQQVJfQ0ZHLCAweDAxLCAweDAwKTsKKworCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZSgKKwkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9JUkFNX1NIVVRET1dOLCAweDAwKTsKKwlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoCisJCVdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sIDB4MDApOworCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZSgKKwkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMF9TSFVURE9XTl8xLCAweDAwKTsKKwlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoCisJCVdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMiwgMHgwMCk7CisKKwlyYyB8PSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwsIDB4MDQsIDB4MDQpOworCisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVzZXQgY3BlLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJjID0gQ1BFX1NWQ19GQUlMRUQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfcmVhZF9tYWlsYm94KHU4ICpidWZmZXIsCisJc2l6ZV90IHNpemUpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwl1MzIgY250ID0gMDsKKworCXByX2RlYnVnKCIlczogc2l6ZT0lemRcbiIsIF9fZnVuY19fLCBzaXplKTsKKworCWlmIChzaXplID4gV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWF9TSVpFKQorCQlzaXplID0gV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWF9TSVpFOworCisJZm9yIChjbnQgPSAwOyAoY250IDwgc2l6ZSkgJiYgKHJjID09IENQRV9TVkNfU1VDQ0VTUyk7IGNudCsrKQorCQlyYyA9IGNwZV9yZWdpc3Rlcl9yZWFkKFdDRDkzMzVfQ1BFX1NTX1NQRV9PVVRCT1gxKGNudCksCisJCQkJICAgICAgICZidWZmZXJbY250XSk7CisKKwlyYyA9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxX0FDSywgMHgwMSk7CisKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBBQ0sgb3V0Ym94LCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJjID0gQ1BFX1NWQ19GQUlMRUQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfd3JpdGVfbWFpbGJveCh1OCAqYnVmZmVyLAorCXNpemVfdCBzaXplKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTMyIGNudCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNpemUgPSAlemRcbiIsIF9fZnVuY19fLCBzaXplKTsKKwlpZiAoc2l6ZSA+IFdDRDkzMzVfQ1BFX1NTX1NQRV9JTkJPWF9TSVpFKQorCQlzaXplID0gV0NEOTMzNV9DUEVfU1NfU1BFX0lOQk9YX1NJWkU7CisJZm9yIChjbnQgPSAwOyAoY250IDwgc2l6ZSkgJiYgKHJjID09IENQRV9TVkNfU1VDQ0VTUyk7IGNudCsrKSB7CisJCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1gxKGNudCksCisJCQlidWZmZXJbY250XSk7CisJfQorCisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlwcl9lcnIoIiVzOiBFcnJvciAlZCB3cml0aW5nIG1haWxib3ggcmVnaXN0ZXJzXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV9UUkcsIDEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3djZDkzMzVfZ2V0X21lbV9hZGRyKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAorCQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqbWVtX3NlZywKKwkJdTMyICphZGRyLCB1OCAqbWVtKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTMyIG9mZnNldCwgbWVtX3N6LCBhZGRyZXNzOworCXU4IG1lbV90eXBlOworCisJc3dpdGNoIChtZW1fc2VnLT50eXBlKSB7CisJY2FzZSBDUEVfU1ZDX0RBVEFfTUVNOgorCQltZW1fdHlwZSA9IE1FTV9BQ0NFU1NfRFJBTV9WQUw7CisJCW9mZnNldCA9IFdDRDkzMzVfQ1BFX1NTX1NQRV9EUkFNX09GRlNFVDsKKwkJbWVtX3N6ID0gV0NEOTMzNV9DUEVfU1NfU1BFX0RSQU1fU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIENQRV9TVkNfSU5TVFJVQ1RJT05fTUVNOgorCQltZW1fdHlwZSA9IE1FTV9BQ0NFU1NfSVJBTV9WQUw7CisJCW9mZnNldCA9IFdDRDkzMzVfQ1BFX1NTX1NQRV9JUkFNX09GRlNFVDsKKwkJbWVtX3N6ID0gV0NEOTMzNV9DUEVfU1NfU1BFX0lSQU1fU0laRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG1lbSB0eXBlID0gJXVcbiIsCisJCQlfX2Z1bmNfXywgbWVtX3NlZy0+dHlwZSk7CisJCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCX0KKworCWlmIChtZW1fc2VnLT5jcGVfYWRkciA8IG9mZnNldCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGFkZHIgJXggZm9yIG1lbSB0eXBlICV1XG4iLAorCQkJX19mdW5jX18sIG1lbV9zZWctPmNwZV9hZGRyLCBtZW1fdHlwZSk7CisJCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOworCX0KKworCWFkZHJlc3MgPSBtZW1fc2VnLT5jcGVfYWRkciAtIG9mZnNldDsKKwlpZiAoYWRkcmVzcyArIG1lbV9zZWctPnNpemUgPiBtZW1fc3opIHsKKwkJcHJfZXJyKCIlczogd3Jvbmcgc2l6ZSAlenUsIHN0YXJ0IGFkZHJlc3MgJXgsIG1lbV90eXBlICV1XG4iLAorCQkJX19mdW5jX18sIG1lbV9zZWctPnNpemUsIGFkZHJlc3MsIG1lbV90eXBlKTsKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisJfQorCisJKCphZGRyKSA9IGFkZHJlc3M7CisJKCptZW0pID0gbWVtX3R5cGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9yZWFkX1JBTShzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwkJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKm1lbV9zZWcpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwl1OCB0ZW1wID0gMDsKKwl1MzIgY250ID0gMDsKKwl1OCBtZW0gPSAweDA7CisJdTMyIGFkZHIgPSAwOworCXUzMiBsYXN0YWRkciA9IDA7CisJdTMyIHB0cl91cGRhdGUgPSB0cnVlOworCWJvb2wgYXV0b2luYzsKKworCWlmICghbWVtX3NlZykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKKwl9CisKKwlyYyA9IGNwZV93Y2Q5MzM1X2dldF9tZW1fYWRkcih0X2luZm8sIG1lbV9zZWcsICZhZGRyLCAmbWVtKTsKKworCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogQ2Fubm90IG9idGFpbiBhZGRyZXNzLCBtZW1fdHlwZSAldVxuIiwKKwkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwgMCk7CisJYXV0b2luYyA9IGNwZV9yZWdpc3Rlcl9yZWFkX2F1dG9pbmNfc3VwcG9ydGVkKCk7CisKKwlpZiAoYXV0b2luYykKKwkJdGVtcCA9IDB4MTg7CisJZWxzZQorCQl0ZW1wID0gMHgxMDsKKworCXRlbXAgfD0gbWVtOworCisJbGFzdGFkZHIgPSB+YWRkcjsKKwlkbyB7CisJCWlmICghYXV0b2luYyB8fCAocHRyX3VwZGF0ZSkpIHsKKwkJCS8qIHdyaXRlIExTQiBvbmx5IGlmIG1vZGlmaWVkICovCisJCQlpZiAoKGxhc3RhZGRyICYgMHhGRikgIT0gKGFkZHIgJiAweEZGKSkKKwkJCQlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoCisJCQkJCQlXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzAsCisJCQkJCQkoYWRkciAmIDB4RkYpKTsKKwkJCS8qIHdyaXRlIG1pZGRsZSBieXRlIG9ubHkgaWYgbW9kaWZpZWQgKi8KKwkJCWlmICgoKGxhc3RhZGRyID4+IDgpICYgMHhGRikgIT0gKChhZGRyID4+IDgpICYgMHhGRikpCisJCQkJcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKAorCQkJCQkJV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8xLAorCQkJCQkJKChhZGRyPj44KSAmIDB4RkYpKTsKKwkJCS8qIHdyaXRlIE1TQiBvbmx5IGlmIG1vZGlmaWVkICovCisJCQlpZiAoKChsYXN0YWRkciA+PiAxNikgJiAweEZGKSAhPSAoKGFkZHIgPj4gMTYpICYgMHhGRikpCisJCQkJcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKAorCQkJCQkJV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8yLAorCQkJCQkJKChhZGRyPj4xNikgJiAweEZGKSk7CisKKwkJCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwgdGVtcCk7CisJCQlsYXN0YWRkciA9IGFkZHI7CisJCQlhZGRyKys7CisJCQlwdHJfdXBkYXRlID0gZmFsc2U7CisJCX0KKworCQlyYyB8PSBjcGVfcmVnaXN0ZXJfcmVhZChXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18wLAorCQkJCSAgICAgICAmbWVtX3NlZy0+ZGF0YVtjbnRdKTsKKworCQlpZiAoIWF1dG9pbmMpCisJCQlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwsIDApOworCX0gd2hpbGUgKCgrK2NudCA8IG1lbV9zZWctPnNpemUpIHx8CisJCSAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSk7CisKKwlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwsIDApOworCisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVhZCByZWdpc3RlcnMsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF93Y2Q5MzM1X3dyaXRlX1JBTShzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKKwkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKm1lbV9zZWcpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKwl1OCBtZW1fcmVnX3ZhbCA9IDA7CisJdTggbWVtID0gTUVNX0FDQ0VTU19OT05FX1ZBTDsKKwl1MzIgYWRkciA9IDA7CisJdTggKnRlbXBfcHRyID0gTlVMTDsKKwl1MzIgdGVtcF9zaXplID0gMDsKKwlib29sIGF1dG9pbmM7CisKKwlpZiAoIW1lbV9zZWcpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBtZW0gc2VnbWVudFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7CisJfQorCisJcmMgPSBjcGVfd2NkOTMzNV9nZXRfbWVtX2FkZHIodF9pbmZvLCBtZW1fc2VnLCAmYWRkciwgJm1lbSk7CisKKwlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IENhbm5vdCBvYnRhaW4gYWRkcmVzcywgbWVtX3R5cGUgJXVcbiIsCisJCQlfX2Z1bmNfXywgbWVtX3NlZy0+dHlwZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlhdXRvaW5jID0gY3BlX3JlZ2lzdGVyX3JlYWRfYXV0b2luY19zdXBwb3J0ZWQoKTsKKwlpZiAoYXV0b2luYykKKwkJbWVtX3JlZ192YWwgPSAweDE4OworCWVsc2UKKwkJbWVtX3JlZ192YWwgPSAweDEwOworCisJbWVtX3JlZ192YWwgfD0gbWVtOworCisJcmMgPSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwsCisJCQkgICAgIDB4MEYsIG1lbV9yZWdfdmFsKTsKKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMCwKKwkJCQkoYWRkciAmIDB4RkYpKTsKKwlyYyA9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzEsCisJCQkJKChhZGRyID4+IDgpICYgMHhGRikpOworCisJcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8yLAorCQkJCSgoYWRkciA+PiAxNikgJiAweEZGKSk7CisKKwl0ZW1wX3NpemUgPSAwOworCXRlbXBfcHRyID0gbWVtX3NlZy0+ZGF0YTsKKworCXdoaWxlICh0ZW1wX3NpemUgPD0gbWVtX3NlZy0+c2l6ZSkgeworCQl1MzIgdG9fd3JpdGUgPSAobWVtX3NlZy0+c2l6ZSA+PSB0ZW1wX3NpemUrQ0hVTktfU0laRSkKKwkJCT8gQ0hVTktfU0laRSA6IChtZW1fc2VnLT5zaXplIC0gdGVtcF9zaXplKTsKKworCQlpZiAodF9pbmZvLT5zdGF0ZSA9PSBDUEVfU1RBVEVfT0ZGTElORSkgeworCQkJcHJfZXJyKCIlczogQ1BFIGlzIG9mZmxpbmVcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKKwkJfQorCisJCWNwZV9yZWdpc3Rlcl93cml0ZV9yZXBlYXQoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCwKKwkJCXRlbXBfcHRyLCB0b193cml0ZSk7CisJCXRlbXBfc2l6ZSArPSBDSFVOS19TSVpFOworCQl0ZW1wX3B0ciArPSBDSFVOS19TSVpFOworCX0KKworCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX01FTV9DVFJMLCAwKTsKKworCWlmIChyYykKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVycywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF93Y2Q5MzM1X3JvdXRlX25vdGlmaWNhdGlvbigKKwkJZW51bSBjcGVfc3ZjX21vZHVsZSBtb2R1bGUsCisJCWVudW0gY3BlX3N2Y19yb3V0ZV9kZXN0IGRlc3QpCit7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKKworCXByX2RlYnVnKCIlczogTW9kdWxlID0gJWQsIERlc3RpbmF0aW9uID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgbW9kdWxlLCBkZXN0KTsKKworCXN3aXRjaCAobW9kdWxlKSB7CisJY2FzZSBDUEVfU1ZDX0xJU1RFTl9QUk9DOgorCQlzd2l0Y2ggKGRlc3QpIHsKKwkJY2FzZSBDUEVfU1ZDX0VYVEVSTkFMOgorCQkJcmMgPSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ0ZHLCAweDAxLCAweDAxKTsKKwkJCWJyZWFrOworCQljYXNlIENQRV9TVkNfSU5URVJOQUw6CisJCQlyYyA9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DRkcsIDB4MDEsIDB4MDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRlc3RpbmF0aW9uICVkXG4iLAorCQkJCV9fZnVuY19fLCBkZXN0KTsKKwkJCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG1vZHVsZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBtb2R1bGUpOworCQlyYyA9IENQRV9TVkNfRkFJTEVEOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfc2V0X2RlYnVnX21vZGUodTMyIGVuYWJsZSkKK3sKKwllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOworCisJcHJfZGVidWcoIiVzOiBlbmFibGUgPSAlc1xuIiwgX19mdW5jX18sCisJCSAoZW5hYmxlKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwZV9zdmNfaHdfY2ZnICpjcGVfdGd0X3djZDkzMzVfZ2V0X2NwZV9pbmZvKHZvaWQpCit7CisJcmV0dXJuICZjcGVfc3ZjX3djZDkzMzVfaW5mbzsKK30KKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQKK2NwZV90Z3Rfd2NkOTMzNV9kZWluaXQoc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSkKK3sKKwlrZnJlZShwYXJhbS0+aW5ib3gpOworCXBhcmFtLT5pbmJveCA9IE5VTEw7CisJa2ZyZWUocGFyYW0tPm91dGJveCk7CisJcGFyYW0tPm91dGJveCA9IE5VTEw7CisJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2Yoc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uKSk7CisKKwlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOworfQorCitzdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdAorCWNwZV90Z3Rfd2NkOTMzNV92b2ljZXR4KGJvb2wgZW5hYmxlKQoreworCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7CisJdTggdmFsID0gMDsKKworCXByX2RlYnVnKCIlczogZW5hYmxlID0gJXVcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCWlmIChlbmFibGUpCisJCXZhbCA9IDB4MDI7CisJZWxzZQorCQl2YWwgPSAweDAwOworCisJcmMgPSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ0ZHLCAweDAyLCB2YWwpOworCXZhbCA9IDA7CisJY3BlX3JlZ2lzdGVyX3JlYWQoV0NEOTMzNV9DUEVfU1NfQ0ZHLCAmdmFsKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHU4IGNwZV90Z3Rfd2NkOTMzNV93YWl0aV9kYXRhW10gPSB7MHgwMCwgMHg3MCwgMHgwMCwgMHgwMH07CisKK3N0YXRpYyBzdHJ1Y3QgY3BlX3RndF93YWl0aV9pbmZvIGNwZV90Z3Rfd2NkOTMzNV93YWl0aV9pbmZvID0geworCS50Z3Rfd2FpdGlfc2l6ZSA9IEFSUkFZX1NJWkUoY3BlX3RndF93Y2Q5MzM1X3dhaXRpX2RhdGEpLAorCS50Z3Rfd2FpdGlfZGF0YSA9IGNwZV90Z3Rfd2NkOTMzNV93YWl0aV9kYXRhLAorfTsKKworc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF93Y2Q5MzM1X2luaXQoCisJCXN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKmNvZGVjX2luZm8sCisJCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqcGFyYW0pCit7CisJaWYgKCFjb2RlY19pbmZvKQorCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKKwlpZiAoIXBhcmFtKQorCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKKworCWlmIChjb2RlY19pbmZvLT5pZCA9PSBDUEVfU1ZDX0NPREVDX1dDRDkzMzUpIHsKKwkJcGFyYW0tPnRndF9ib290ID0gY3BlX3RndF93Y2Q5MzM1X2Jvb3Q7CisJCXBhcmFtLT50Z3RfY3Bhcl9pbml0X2RvbmUgPSBjcGVfdGd0X3djZDkzMzVfaXNfY3Bhcl9pbml0X2RvbmU7CisJCXBhcmFtLT50Z3RfaXNfYWN0aXZlID0gY3BlX3RndF93Y2Q5MzM1X2lzX2FjdGl2ZTsKKwkJcGFyYW0tPnRndF9yZXNldCA9IGNwZV90Z3Rfd2NkOTMzNV9yZXNldDsKKwkJcGFyYW0tPnRndF9yZWFkX21haWxib3ggPSBjcGVfdGd0X3djZDkzMzVfcmVhZF9tYWlsYm94OworCQlwYXJhbS0+dGd0X3dyaXRlX21haWxib3ggPSBjcGVfdGd0X3djZDkzMzVfd3JpdGVfbWFpbGJveDsKKwkJcGFyYW0tPnRndF9yZWFkX3JhbSA9IGNwZV90Z3Rfd2NkOTMzNV9yZWFkX1JBTTsKKwkJcGFyYW0tPnRndF93cml0ZV9yYW0gPSBjcGVfdGd0X3djZDkzMzVfd3JpdGVfUkFNOworCQlwYXJhbS0+dGd0X3JvdXRlX25vdGlmaWNhdGlvbiA9CisJCQljcGVfdGd0X3djZDkzMzVfcm91dGVfbm90aWZpY2F0aW9uOworCQlwYXJhbS0+dGd0X3NldF9kZWJ1Z19tb2RlID0gY3BlX3RndF93Y2Q5MzM1X3NldF9kZWJ1Z19tb2RlOworCQlwYXJhbS0+dGd0X2dldF9jcGVfaW5mbyA9IGNwZV90Z3Rfd2NkOTMzNV9nZXRfY3BlX2luZm87CisJCXBhcmFtLT50Z3RfZGVpbml0ID0gY3BlX3RndF93Y2Q5MzM1X2RlaW5pdDsKKwkJcGFyYW0tPnRndF92b2ljZV90eF9sYWIgPSBjcGVfdGd0X3djZDkzMzVfdm9pY2V0eDsKKwkJcGFyYW0tPnRndF93YWl0aV9pbmZvID0gJmNwZV90Z3Rfd2NkOTMzNV93YWl0aV9pbmZvOworCisJCXBhcmFtLT5pbmJveCA9IGt6YWxsb2MoV0NEOTMzNV9DUEVfU1NfU1BFX0lOQk9YX1NJWkUsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtLT5pbmJveCkKKwkJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKKworCQlwYXJhbS0+b3V0Ym94ID0ga3phbGxvYyhXQ0Q5MzM1X0NQRV9TU19TUEVfT1VUQk9YX1NJWkUsCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtLT5vdXRib3gpIHsKKwkJCWtmcmVlKHBhcmFtLT5pbmJveCk7CisJCQlyZXR1cm4gQ1BFX1NWQ19OT19NRU1PUlk7CisJCX0KKwl9CisKKwlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIldDRCBDUEUgU2VydmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NwZV9zZXJ2aWNlcy5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX3NlcnZpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlYjYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NwZV9zZXJ2aWNlcy5oCkBAIC0wLDAgKzEsMTc5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fQ1BFX1NFUlZJQ0VTX18KKyNkZWZpbmUgX19DUEVfU0VSVklDRVNfXworCisjZGVmaW5lIENQRV9JUlFfT1VUQk9YX0lSUQkJMHgwMQorI2RlZmluZSBDUEVfSVJRX01FTV9BQ0NFU1NfRVJST1IJMHgwMgorI2RlZmluZSBDUEVfSVJRX1dET0dfQklURQkJMHgwNAorI2RlZmluZSBDUEVfSVJRX0JVRkZFUl9PVkVSRkxPVwkJMHgwOAorI2RlZmluZSBDUEVfSVJRX0xBQl9PVkZVTkYJCTB4MTAKKyNkZWZpbmUgQ1BFX0lSUV9GTExfTE9DS19MT1NUCQkweDIwCisjZGVmaW5lIENQRV9JUlFfUkNPX1dET0dfSU5UCQkweDQwCisKKyNkZWZpbmUgRUZBSUxFRCAoTUFYX0VSUk5PIC0gMSkKKyNkZWZpbmUgRU5PVFJFQURZIChNQVhfRVJSTk8gLSAyKQorCisjZGVmaW5lIE1BWF9TVVBQT1JURURfQ0xLRlJFUSA4CisjZGVmaW5lIENQRV9TVkNfSU5JVF9QQVJBTV9WMSAxCisKK2VudW0gY3BlX3N2Y19yZXN1bHQgeworCUNQRV9TVkNfU1VDQ0VTUwkJCT0gMCwKKwlDUEVfU1ZDX0ZBSUxFRAkJCT0gLUVGQUlMRUQsCisJQ1BFX1NWQ19OT19NRU1PUlkJCT0gLUVOT01FTSwKKwlDUEVfU1ZDX0lOVkFMSURfSEFORExFCQk9IC1FSU5WQUwsCisJQ1BFX1NWQ19OT1RfUkVBRFkJCT0gLUVOT1RSRUFEWSwKKwlDUEVfU1ZDX1NIVVRUSU5HX0RPV04JCT0gLUVTSFVURE9XTiwKKwlDUEVfU1ZDX0JVU1kJCQk9IC1FQlVTWSwKK307CisKK2VudW0gY3BlX3N2Y19ldmVudCB7CisJQ1BFX1NWQ19DTUlfTVNHCQkJPSAweDAxLAorCUNQRV9TVkNfT0ZGTElORQkJCT0gMHgwMiwKKwlDUEVfU1ZDX09OTElORQkJCT0gMHgwNCwKKwlDUEVfU1ZDX0JPT1RfRkFJTEVECQk9IDB4MDgsCisJQ1BFX1NWQ19SRUFEX0NPTVBMRVRFCQk9IDB4MTAsCisJQ1BFX1NWQ19SRUFEX0VSUk9SCQk9IDB4MjAsCisJQ1BFX1NWQ19CT09UCQkJPSAweDQwLAorCUNQRV9TVkNfQ01JX0NMSUVOVFNfREVSRUcJPSAweDEwMCwKKwlDUEVfU1ZDX0VWRU5UX0FOQ0hPUgkJPSAweDdGRkYKK307CisKK2VudW0gY3BlX3N2Y19tb2R1bGUgeworCUNQRV9TVkNfTElTVEVOX1BST0MJCT0gMSwKKwlDUEVfU1ZDX01PRFVMRV9BTkNIT1IJCT0gMHg3RgorfTsKKworZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgeworCUNQRV9TVkNfRVhURVJOQUwJCT0gMSwKKwlDUEVfU1ZDX0lOVEVSTkFMCQk9IDIsCisJQ1BFX1NWQ19ST1VURV9BTkNIT1IJCT0gMHg3RgorfTsKKworZW51bSBjcGVfc3ZjX21lbV90eXBlIHsKKwlDUEVfU1ZDX0RBVEFfTUVNCQk9IDEsCisJQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU0JCT0gMiwKKwlDUEVfU1ZDX0lQQ19NRU0JCQk9IDMsCisJQ1BFX1NWQ19NRU1fVFlQRV9BTkNIT1IJCT0gMHg3RgorfTsKKworZW51bSBjcGVfc3ZjX2NvZGVjX2lkIHsKKwlDUEVfU1ZDX0NPREVDX1RPTVRPTQkJPSA1LAorCUNQRV9TVkNfQ09ERUNfV0NEOTMzNQkJPSA3LAorCUNQRV9TVkNfQ09ERUNfV0NEOTMyNgkJPSA4LAorCUNQRV9TVkNfQ09ERUNfSURfQU5DSE9SCQk9IDB4N2ZmZmZmZgorfTsKKworZW51bSBjcGVfc3ZjX2NvZGVjX3ZlcnNpb24geworCUNQRV9TVkNfQ09ERUNfVjFQMAkJPSAxLAorCUNQRV9TVkNfQ09ERUNfVkVSU0lPTl9BTkNIT1IJPSAweDdmZmZmZmZmCit9OworCitzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxIHsKKwl1MTYJCQltYWpvcl92ZXJzaW9uOy8qbXVzdCBiZSAxKi8KKwl1MTYJCQltaW5vcl92ZXJzaW9uOy8qbXVzdCBiZSAwKi8KKwl1MzIJCQlpZDsKKwl1MzIJCQl2ZXJzaW9uOworCS8qQWRkIDEuMSB2ZXJzaW9uIGZpZWxkcyBhZnRlciB0aGlzIGxpbmUqLworfTsKKworc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uIHsKKwllbnVtIGNwZV9zdmNfZXZlbnQgZXZlbnQ7CisJZW51bSBjcGVfc3ZjX3Jlc3VsdCByZXN1bHQ7CisJdm9pZCAqcGF5bG9hZDsKKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9OworCitzdHJ1Y3QgY3BlX3N2Y19tc2dfcGF5bG9hZCB7CisJdTggICAgKmNtaV9tc2c7Cit9OworCitzdHJ1Y3QgY3BlX3N2Y19yZWFkX2NvbXBsZXRlIHsKKwl1OCAgICAqYnVmZmVyOworCXNpemVfdCAgIHNpemU7Cit9OworCitzdHJ1Y3QgY3BlX3N2Y19ib290X2V2ZW50IHsKKwl1MzIgZGVidWdfYWRkcmVzczsKKwlzaXplX3QgZGVidWdfYnVmZmVyX3NpemU7CisJdTMyIHN0YXR1czsKK307CisKK3N0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50IHsKKwllbnVtIGNwZV9zdmNfbWVtX3R5cGUgdHlwZTsKKwl1MzIgY3BlX2FkZHI7CisJc2l6ZV90IHNpemU7CisJdTggKmRhdGE7Cit9OworCitzdHJ1Y3QgY3BlX3N2Y19od19jZmcgeworCXNpemVfdCBEUkFNX3NpemU7CisJdTMyIERSQU1fb2Zmc2V0OworCXNpemVfdCBJUkFNX3NpemU7CisJdTMyIElSQU1fb2Zmc2V0OworCXU4IGluYm94X3NpemU7CisJdTggb3V0Ym94X3NpemU7Cit9OworCitzdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4geworCXUzMiBjdXJyZW50X2Nsa19mZXE7CisJdTMyIG51bV9jbGtfZnJlcXM7CisJdTMyIGNsa19mcmVxc1tNQVhfU1VQUE9SVEVEX0NMS0ZSRVFdOworfTsKKworc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSB7CisJdm9pZCAqY29udGV4dDsKKwl1MzIgdmVyc2lvbjsKKwl2b2lkICgqcXVlcnlfZnJlcV9wbGFuc19jYikodm9pZCAqY2RjX3ByaXYsCisJCQlzdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4gKmNsa19mcmVxKTsKKwl2b2lkICgqY2hhbmdlX2ZyZXFfcGxhbl9jYikodm9pZCAqY2RjX3ByaXYsCisJCQl1MzIgY2xrX2ZyZXEpOworfTsKKworCit2b2lkICpjcGVfc3ZjX2luaXRpYWxpemUoCisJCXZvaWQgaXJxX2NvbnRyb2xfY2FsbGJhY2sodTMyIGVuYWJsZSksCisJCWNvbnN0IHZvaWQgKmNvZGVjX2luZm8sIHZvaWQgKmNvbnRleHQpOworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2RlaW5pdGlhbGl6ZSh2b2lkICpjcGVfaGFuZGxlKTsKKwordm9pZCAqY3BlX3N2Y19yZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLAorCQl2b2lkICgqbm90aWZpY2F0aW9uX2NhbGxiYWNrKSgKKwkJCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiAqcGFyYW1ldGVyKSwKKwkJdTMyIG1hc2ssIGNvbnN0IGNoYXIgKm5hbWUpOworCitlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfZGVyZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLCB2b2lkICpyZWdfaGFuZGxlKTsKKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2Rvd25sb2FkX3NlZ21lbnQodm9pZCAqY3BlX2hhbmRsZSwKKwkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKnNlZ21lbnQpOworCitlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfYm9vdCh2b2lkICpjcGVfaGFuZGxlLCBpbnQgZGVidWdfbW9kZSk7CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19zaHV0ZG93bih2b2lkICpjcGVfaGFuZGxlKTsKKworZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3Jlc2V0KHZvaWQgKmNwZV9oYW5kbGUpOworCitlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfcHJvY2Vzc19pcnEodm9pZCAqY3BlX2hhbmRsZSwgdTMyIGNwZV9pcnEpOworCitlbnVtIGNwZV9zdmNfcmVzdWx0CitjcGVfc3ZjX3JvdXRlX25vdGlmaWNhdGlvbih2b2lkICpjcGVfaGFuZGxlLCBlbnVtIGNwZV9zdmNfbW9kdWxlIG1vZHVsZSwKKwkJZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgZGVzdCk7CisKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19yYW1kdW1wKHZvaWQgKmNwZV9oYW5kbGUsCisJCXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICpidWZmZXIpOworCitlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfc2V0X2RlYnVnX21vZGUodm9pZCAqY3BlX2hhbmRsZSwgdTMyIG1vZGUpOworCitjb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNwZV9zdmNfZ2V0X2h3X2NmZyh2b2lkICpjcGVfaGFuZGxlKTsKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y190b2dnbGVfbGFiKHZvaWQgKmNwZV9oYW5kbGUsIGJvb2wgZW5hYmxlKTsKK2VudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19mdG1fdGVzdCh2b2lkICpjcGVfaGFuZGxlLCB1MzIgKnN0YXR1cyk7CisjZW5kaWYgLypfX0NQRV9TRVJWSUNFU19fKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkY2FsLWh3ZGVwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZGNhbC1od2RlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWFlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZGNhbC1od2RlcC5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc21jYWwtaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlICJ3Y2RjYWwtaHdkZXAuaCIKKworY29uc3QgaW50IGNhbF9zaXplX2luZm9bV0NEOVhYWF9NQVhfQ0FMXSA9IHsKKwlbV0NEOVhYWF9BTkNfQ0FMXSA9IDE2Mzg0LAorCVtXQ0Q5WFhYX01CSENfQ0FMXSA9IDQwOTYsCisJW1dDRDlYWFhfTUFEX0NBTF0gPSA0MDk2LAorCVtXQ0Q5WFhYX1ZCQVRfQ0FMXSA9IDcyLAorfTsKKworY29uc3QgY2hhciAqY2FsX25hbWVfaW5mb1tXQ0Q5WFhYX01BWF9DQUxdID0geworCVtXQ0Q5WFhYX0FOQ19DQUxdID0gImFuYyIsCisJW1dDRDlYWFhfTUJIQ19DQUxdID0gIm1iaGMiLAorCVtXQ0Q5WFhYX01BRF9DQUxdID0gIm1hZCIsCisJW1dDRDlYWFhfVkJBVF9DQUxdID0gInZiYXQiLAorfTsKKworc3RydWN0IGZpcm13YXJlX2NhbCAqd2NkY2FsX2dldF9md19jYWwoc3RydWN0IGZ3X2luZm8gKmZ3X2RhdGEsCisJCQkJCWVudW0gd2NkX2NhbF90eXBlIHR5cGUpCit7CisJaWYgKCFmd19kYXRhKSB7CisJCXByX2VycigiJXM6IGZ3X2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHR5cGUgPj0gV0NEOVhYWF9NQVhfQ0FMIHx8CisJCXR5cGUgPCBXQ0Q5WFhYX01JTl9DQUwpIHsKKwkJcHJfZXJyKCIlczogd3JvbmcgY2FsIHR5cGUgc2VudCAlZFxuIiwgX19mdW5jX18sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXV0ZXhfbG9jaygmZndfZGF0YS0+bG9jayk7CisJaWYgKCF0ZXN0X2JpdChXQ0RDQUxfUkVDSUVWRUQsCisJCSZmd19kYXRhLT53Y2RjYWxfc3RhdGVbdHlwZV0pKSB7CisJCXByX2VycigiJXM6IGNhbCBub3Qgc2VudCBieSB1c2Vyc3BhY2UgJWRcbiIsCisJCQlfX2Z1bmNfXywgdHlwZSk7CisJCW11dGV4X3VubG9jaygmZndfZGF0YS0+bG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwltdXRleF91bmxvY2soJmZ3X2RhdGEtPmxvY2spOworCXJldHVybiBmd19kYXRhLT5md1t0eXBlXTsKK30KK0VYUE9SVF9TWU1CT0wod2NkY2FsX2dldF9md19jYWwpOworCitzdGF0aWMgaW50IHdjZGNhbF9od2RlcF9pb2N0bF9zaGFyZWQoc3RydWN0IHNuZF9od2RlcCAqaHcsCisJCQlzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlciBmd191c2VyKQoreworCXN0cnVjdCBmd19pbmZvICpmd19kYXRhID0gaHctPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICoqZncgPSBmd19kYXRhLT5mdzsKKwl2b2lkICpkYXRhOworCisJaWYgKCF0ZXN0X2JpdChmd191c2VyLmNhbF90eXBlLCBmd19kYXRhLT5jYWxfYml0KSkgeworCQlwcl9lcnIoIiVzOiBjb2RlYyBkaWRuJ3Qgc2V0IHRoaXMgJWQhIVxuIiwKKwkJCQlfX2Z1bmNfXywgZndfdXNlci5jYWxfdHlwZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoZndfdXNlci5jYWxfdHlwZSA+PSBXQ0Q5WFhYX01BWF9DQUwgfHwKKwkJZndfdXNlci5jYWxfdHlwZSA8IFdDRDlYWFhfTUlOX0NBTCkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBjYWwgdHlwZSBzZW50ICVkXG4iLAorCQkJCV9fZnVuY19fLCBmd191c2VyLmNhbF90eXBlKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChmd191c2VyLnNpemUgPiBjYWxfc2l6ZV9pbmZvW2Z3X3VzZXIuY2FsX3R5cGVdIHx8CisJCWZ3X3VzZXIuc2l6ZSA8PSAwKSB7CisJCXByX2VycigiJXM6IGluY29ycmVjdCBmaXJtd2FyZSBzaXplICVkIGZvciAlc1xuIiwKKwkJCV9fZnVuY19fLCBmd191c2VyLnNpemUsCisJCQljYWxfbmFtZV9pbmZvW2Z3X3VzZXIuY2FsX3R5cGVdKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRhdGEgPSBmd1tmd191c2VyLmNhbF90eXBlXS0+ZGF0YTsKKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgZndfdXNlci5idWZmZXIsIGZ3X3VzZXIuc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWZ3W2Z3X3VzZXIuY2FsX3R5cGVdLT5zaXplID0gZndfdXNlci5zaXplOworCW11dGV4X2xvY2soJmZ3X2RhdGEtPmxvY2spOworCXNldF9iaXQoV0NEQ0FMX1JFQ0lFVkVELCAmZndfZGF0YS0+d2NkY2FsX3N0YXRlW2Z3X3VzZXIuY2FsX3R5cGVdKTsKKwltdXRleF91bmxvY2soJmZ3X2RhdGEtPmxvY2spOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IHdjZGNhbF9pb2N0bF9idWZmZXIzMiB7CisJdTMyIHNpemU7CisJY29tcGF0X3VwdHJfdCBidWZmZXI7CisJZW51bSB3Y2RfY2FsX3R5cGUgY2FsX3R5cGU7Cit9OworCitlbnVtIHsKKwlTTkRSVl9DVExfSU9DVExfSFdERVBfQ0FMX1RZUEUzMiA9CisJCV9JT1coJ1UnLCAweDEsIHN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyMzIpLAorfTsKKworc3RhdGljIGludCB3Y2RjYWxfaHdkZXBfaW9jdGxfY29tcGF0KHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHdjZGNhbF9pb2N0bF9idWZmZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyMzIgZndfdXNlcjMyOworCXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyIGZ3X3VzZXJfY29tcGF0OworCisJaWYgKGNtZCAhPSBTTkRSVl9DVExfSU9DVExfSFdERVBfQ0FMX1RZUEUzMikgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpb2N0bCBjb21tYW5kIHNlbnQgJXUhXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZmd191c2VyMzIsIGFyZ3AsIHNpemVvZihmd191c2VyMzIpKSkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY29weVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZndfdXNlcl9jb21wYXQuc2l6ZSA9IGZ3X3VzZXIzMi5zaXplOworCWZ3X3VzZXJfY29tcGF0LmJ1ZmZlciA9IGNvbXBhdF9wdHIoZndfdXNlcjMyLmJ1ZmZlcik7CisJZndfdXNlcl9jb21wYXQuY2FsX3R5cGUgPSBmd191c2VyMzIuY2FsX3R5cGU7CisJcmV0dXJuIHdjZGNhbF9od2RlcF9pb2N0bF9zaGFyZWQoaHcsIGZ3X3VzZXJfY29tcGF0KTsKK30KKyNlbHNlCisjZGVmaW5lIHdjZGNhbF9od2RlcF9pb2N0bF9jb21wYXQgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgd2NkY2FsX2h3ZGVwX2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHdjZGNhbF9pb2N0bF9idWZmZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyIGZ3X3VzZXI7CisKKwlpZiAoY21kICE9IFNORFJWX0NUTF9JT0NUTF9IV0RFUF9DQUxfVFlQRSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBpb2N0bCBjb21tYW5kIHNlbnQgJWQhXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZmd191c2VyLCBhcmdwLCBzaXplb2YoZndfdXNlcikpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBjb3B5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gd2NkY2FsX2h3ZGVwX2lvY3RsX3NoYXJlZChodywgZndfdXNlcik7Cit9CisKK3N0YXRpYyBpbnQgd2NkY2FsX2h3ZGVwX3JlbGVhc2Uoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmd19pbmZvICpmd19kYXRhID0gaHctPnByaXZhdGVfZGF0YTsKKworCW11dGV4X2xvY2soJmZ3X2RhdGEtPmxvY2spOworCS8qIGNsZWFyIGFsbCB0aGUgY2FsaWJyYXRpb25zICovCisJbWVtc2V0KGZ3X2RhdGEtPndjZGNhbF9zdGF0ZSwgMCwKKwkJc2l6ZW9mKGZ3X2RhdGEtPndjZGNhbF9zdGF0ZSkpOworCW11dGV4X3VubG9jaygmZndfZGF0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB3Y2RfY2FsX2NyZWF0ZV9od2RlcCh2b2lkICpkYXRhLCBpbnQgbm9kZSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWNoYXIgaHduYW1lWzQwXTsKKwlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsKKwlzdHJ1Y3QgZmlybXdhcmVfY2FsICoqZnc7CisJc3RydWN0IGZ3X2luZm8gKmZ3X2RhdGEgPSBkYXRhOworCWludCBlcnIsIGNhbF9iaXQ7CisKKwlpZiAoIWZ3X2RhdGEgfHwgIWNvZGVjKSB7CisJCXByX2VycigiJXM6IHdyb25nIGFyZ3VtZW50cyBwYXNzZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZncgPSBmd19kYXRhLT5mdzsKKwlzbnByaW50Zihod25hbWUsIHN0cmxlbigiQ29kZWMgJXMiKSwgIkNvZGVjICVzIiwKKwkJIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJZXJyID0gc25kX2h3ZGVwX25ldyhjb2RlYy0+Y29tcG9uZW50LmNhcmQtPnNuZF9jYXJkLAorCQkJICAgIGh3bmFtZSwgbm9kZSwgJmh3ZGVwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbmV3IGh3ZGVwIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc25wcmludGYoaHdkZXAtPm5hbWUsIHN0cmxlbigiQ29kZWMgJXMiKSwgIkNvZGVjICVzIiwKKwkJIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJaHdkZXAtPmlmYWNlID0gU05EUlZfSFdERVBfSUZBQ0VfQVVESU9fQ09ERUM7CisJaHdkZXAtPnByaXZhdGVfZGF0YSA9IGZ3X2RhdGE7CisJaHdkZXAtPm9wcy5pb2N0bF9jb21wYXQgPSB3Y2RjYWxfaHdkZXBfaW9jdGxfY29tcGF0OworCWh3ZGVwLT5vcHMuaW9jdGwgPSB3Y2RjYWxfaHdkZXBfaW9jdGw7CisJaHdkZXAtPm9wcy5yZWxlYXNlID0gd2NkY2FsX2h3ZGVwX3JlbGVhc2U7CisJbXV0ZXhfaW5pdCgmZndfZGF0YS0+bG9jayk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGNhbF9iaXQsIGZ3X2RhdGEtPmNhbF9iaXQsIFdDRDlYWFhfTUFYX0NBTCkgeworCQlzZXRfYml0KFdDRENBTF9VTklOSVRJQUxJU0VELAorCQkJCSZmd19kYXRhLT53Y2RjYWxfc3RhdGVbY2FsX2JpdF0pOworCQlmd1tjYWxfYml0XSA9IGt6YWxsb2Moc2l6ZW9mICooZndbY2FsX2JpdF0pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmd1tjYWxfYml0XSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgJXMgY2FsXG4iLAorCQkJCV9fZnVuY19fLCBjYWxfbmFtZV9pbmZvW2NhbF9iaXRdKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCWZvcl9lYWNoX3NldF9iaXQoY2FsX2JpdCwgZndfZGF0YS0+Y2FsX2JpdCwgV0NEOVhYWF9NQVhfQ0FMKSB7CisJCWZ3W2NhbF9iaXRdLT5kYXRhID0ga3phbGxvYyhjYWxfc2l6ZV9pbmZvW2NhbF9iaXRdLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZndbY2FsX2JpdF0tPmRhdGEpCisJCQlnb3RvIGV4aXQ7CisJCXNldF9iaXQoV0NEQ0FMX0lOSVRJQUxJU0VELAorCQkJJmZ3X2RhdGEtPndjZGNhbF9zdGF0ZVtjYWxfYml0XSk7CisJfQorCXJldHVybiAwOworZXhpdDoKKwlmb3JfZWFjaF9zZXRfYml0KGNhbF9iaXQsIGZ3X2RhdGEtPmNhbF9iaXQsIFdDRDlYWFhfTUFYX0NBTCkgeworCQlrZnJlZShmd1tjYWxfYml0XS0+ZGF0YSk7CisJCWZ3W2NhbF9iaXRdLT5kYXRhID0gTlVMTDsKKwl9CitlbmQ6CisJZm9yX2VhY2hfc2V0X2JpdChjYWxfYml0LCBmd19kYXRhLT5jYWxfYml0LCBXQ0Q5WFhYX01BWF9DQUwpIHsKKwkJa2ZyZWUoZndbY2FsX2JpdF0pOworCQlmd1tjYWxfYml0XSA9IE5VTEw7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTCh3Y2RfY2FsX2NyZWF0ZV9od2RlcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZGNhbC1od2RlcC5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RjYWwtaHdkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJlMmYxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2RjYWwtaHdkZXAuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fV0NEOVhYWF9IV0RFUF9IX18KKyNkZWZpbmUgX19XQ0Q5WFhYX0hXREVQX0hfXworI2luY2x1ZGUgPHNvdW5kL21zbWNhbC1od2RlcC5oPgorCitlbnVtIHdjZF9jYWxfc3RhdGVzIHsKKwlXQ0RDQUxfVU5JTklUSUFMSVNFRCwKKwlXQ0RDQUxfSU5JVElBTElTRUQsCisJV0NEQ0FMX1JFQ0lFVkVECit9OworCitzdHJ1Y3QgZndfaW5mbyB7CisJc3RydWN0IGZpcm13YXJlX2NhbCAqZndbV0NEOVhYWF9NQVhfQ0FMXTsKKwlERUNMQVJFX0JJVE1BUChjYWxfYml0LCBXQ0Q5WFhYX01BWF9DQUwpOworCS8qIGZvciBjYWxpYnJhdGlvbiB0cmFja2luZyAqLworCXVuc2lnbmVkIGxvbmcgd2NkY2FsX3N0YXRlW1dDRDlYWFhfTUFYX0NBTF07CisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCitzdHJ1Y3QgZmlybXdhcmVfY2FsIHsKKwl1OCAqZGF0YTsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjOworaW50IHdjZF9jYWxfY3JlYXRlX2h3ZGVwKHZvaWQgKmZ3LCBpbnQgbm9kZSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK3N0cnVjdCBmaXJtd2FyZV9jYWwgKndjZGNhbF9nZXRfZndfY2FsKHN0cnVjdCBmd19pbmZvICpmd19kYXRhLAorCQkJCQllbnVtIHdjZF9jYWxfdHlwZSB0eXBlKTsKKyNlbmRpZiAvKiBfX1dDRDlYWFhfSFdERVBfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtYW5hbG9nLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtYW5hbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlMzE5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtYW5hbG9nLmMKQEAgLTAsMCArMSwxNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgIndzYTg4MXgtYW5hbG9nLmgiCisjaW5jbHVkZSAid3NhODgxeC10ZW1wLXNlbnNvci5oIgorI2luY2x1ZGUgIi4uL21zbS9tc20tYXVkaW8tcGluY3RybC5oIgorCisjZGVmaW5lIFNQS19HQUlOXzEyREIgNAorI2RlZmluZSBXSURHRVRfTkFNRV9NQVhfU0laRSA4MAorCisvKgorICogUHJpdmF0ZSBkYXRhIFN0cnVjdHVyZSBmb3Igd3NhODgxeC4gQWxsIHBhcmFtZXRlcnMgcmVsYXRlZCB0bworICogV1NBODgxWCBjb2RlYyBuZWVkcyB0byBiZSBkZWZpbmVkIGhlcmUuCisgKi8KK3N0cnVjdCB3c2E4ODF4X3BkYXRhIHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBbMl07CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudFsyXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwkvKiB0cmFjayB3c2E4ODF4IHN0YXR1cyBkdXJpbmcgcHJvYmUgKi8KKwlpbnQgc3RhdHVzOworCWJvb2wgYm9vc3RfZW5hYmxlOworCWJvb2wgdmlzZW5zZV9lbmFibGU7CisJaW50IHNwa19wYV9nYWluOworCXN0cnVjdCBpMmNfbXNnIHhmZXJfbXNnWzJdOworCXN0cnVjdCBtdXRleCB4ZmVyX2xvY2s7CisJYm9vbCByZWdtYXBfZmxhZzsKKwlib29sIHdzYV9hY3RpdmU7CisJaW50IGluZGV4OworCWludCAoKmVuYWJsZV9tY2xrKShzdHJ1Y3Qgc25kX3NvY19jYXJkICosIGJvb2wpOworCXN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgdHpfcGRhdGE7CisJaW50IGJnX2NudDsKKwlpbnQgY2xrX2NudDsKKwlpbnQgZW5hYmxlX2NudDsKKwlpbnQgdmVyc2lvbjsKKwlzdHJ1Y3QgbXV0ZXggYmdfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggcmVzX2xvY2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBvY3BfY3RsX3dvcms7Cit9OworCitlbnVtIHsKKwlXU0E4ODFYX1NUQVRVU19QUk9CSU5HLAorCVdTQTg4MVhfU1RBVFVTX0kyQywKK307CisKKyNkZWZpbmUgV1NBODgxWF9PQ1BfQ1RMX1RJTUVSX1NFQyAyCisjZGVmaW5lIFdTQTg4MVhfT0NQX0NUTF9URU1QX0NFTFNJVVMgMjUKKyNkZWZpbmUgV1NBODgxWF9PQ1BfQ1RMX1BPTExfVElNRVJfU0VDIDYwCisKK3N0YXRpYyBpbnQgd3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMgPSBXU0E4ODFYX09DUF9DVExfUE9MTF9USU1FUl9TRUM7Cittb2R1bGVfcGFyYW0od3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdzYTg4MXhfb2NwX3BvbGxfdGltZXJfc2VjLCAidGltZXIgZm9yIG9jcCBjdGwgcG9sbGluZyIpOworCitzdGF0aWMgaW50MzJfdCB3c2E4ODF4X3Jlc291cmNlX2FjcXVpcmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkJYm9vbCBlbmFibGUpOworCitjb25zdCBjaGFyICp3c2FfdHpfbmFtZXNbXSA9IHsid3NhODgxeC4wZSIsICJ3c2E4ODF4LjBmIn07CisKK3N0cnVjdCB3c2E4ODF4X3BkYXRhIHdzYV9wZGF0YVtNQVhfV1NBODgxWF9ERVZJQ0VdOworCitzdGF0aWMgYm9vbCBwaW5jdHJsX2luaXQ7CisKK3N0YXRpYyBpbnQgd3NhODgxeF9wb3B1bGF0ZV9kdF9wZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCB3c2E4ODF4X3Jlc2V0KHN0cnVjdCB3c2E4ODF4X3BkYXRhICpwZGF0YSwgYm9vbCBlbmFibGUpOworc3RhdGljIGludCB3c2E4ODF4X3N0YXJ0dXAoc3RydWN0IHdzYTg4MXhfcGRhdGEgKnBkYXRhKTsKK3N0YXRpYyBpbnQgd3NhODgxeF9zaHV0ZG93bihzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqcGRhdGEpOworCitzdGF0aWMgaW50IGRlbGF5X2FycmF5X21zZWNbXSA9IHsxMCwgMjAsIDMwLCA0MCwgNTB9OworCitzdGF0aWMgaW50IHdzYTg4MXhfaTJjX2FkZHIgPSAtMTsKK3N0YXRpYyBpbnQgd3NhODgxeF9wcm9iaW5nX2NvdW50Oworc3RhdGljIGludCB3c2E4ODF4X3ByZXNlbmNlX2NvdW50OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYTg4MXhfc3BrX3BhX2dhaW5fdGV4dFtdID0geworIlBPU18xM1A1X0RCIiwgIlBPU18xMl9EQiIsICJQT1NfMTBQNV9EQiIsICJQT1NfOV9EQiIsICJQT1NfN1A1X0RCIiwKKyJQT1NfNl9EQiIsICJQT1NfNFA1X0RCIiwgIlBPU18zX0RCIiwgIlBPU18xUDVfREIiLCAiUE9TXzBfREIifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3c2E4ODF4X3Nwa19wYV9nYWluX2VudW1bXSA9IHsKKwkJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHdzYTg4MXhfc3BrX3BhX2dhaW5fdGV4dCksCisJCQkJICAgIHdzYTg4MXhfc3BrX3BhX2dhaW5fdGV4dCksCit9OworCitzdGF0aWMgaW50IHdzYTg4MXhfc3BrX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdzYTg4MXgtPnNwa19wYV9nYWluOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNwa19wYV9nYWluID0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3Nwa19wYV9nYWluX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDwgMCB8fAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA+IDB4QykgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5zdXBwb3J0ZWQgZ2FpbiB2YWwgJWxkXG4iLAorCQkJIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3c2E4ODF4LT5zcGtfcGFfZ2FpbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKKwkJCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2kyY193c2E4ODF4X2RldmljZV9pbmRleCh1MTYgcmVnKQoreworCXUxNiBtYXNrID0gMHgwZjAwOworCWludCB2YWx1ZSA9IDA7CisKKwl2YWx1ZSA9ICgocmVnICYgbWFzaykgPj4gOCkgJiAweDAwMGY7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKwljYXNlIDE6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X2kyY193cml0ZV9kZXZpY2Uoc3RydWN0IHdzYTg4MXhfcGRhdGEgKndzYTg4MXgsCisJCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCBpID0gMCwgcmMgPSAwOworCWludCB3c2E4ODF4X2luZGV4OworCXN0cnVjdCBpMmNfbXNnICptc2c7CisJaW50IHJldCA9IDA7CisJaW50IGJ5dGVzID0gMTsKKwl1OCByZWdfYWRkciA9IDA7CisJdTggZGF0YVtieXRlcyArIDFdOworCisJd3NhODgxeF9pbmRleCA9IGdldF9pMmNfd3NhODgxeF9kZXZpY2VfaW5kZXgocmVnKTsKKwlpZiAod3NhODgxeF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczppbnZhbGlkIHJlZ2lzdGVyIHRvIHdyaXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAod3NhODgxeC0+cmVnbWFwX2ZsYWcpIHsKKwkJcmMgPSByZWdtYXBfd3JpdGUod3NhODgxeC0+cmVnbWFwW3dzYTg4MXhfaW5kZXhdLCByZWcsIHZhbCk7CisJCWZvciAoaSA9IDA7IHJjICYmIGkgPCBBUlJBWV9TSVpFKGRlbGF5X2FycmF5X21zZWMpOyBpKyspIHsKKwkJCXByX2VycigiRmFpbGVkIHdyaXRpbmcgcmVnPSV1IC0gcmV0cnkoJWQpXG4iLCByZWcsIGkpOworCQkJLyogcmV0cnkgYWZ0ZXIgZGVsYXkgb2YgaW5jcmVhc2luZyBvcmRlciAqLworCQkJbXNsZWVwKGRlbGF5X2FycmF5X21zZWNbaV0pOworCQkJcmMgPSByZWdtYXBfd3JpdGUod3NhODgxeC0+cmVnbWFwW3dzYTg4MXhfaW5kZXhdLAorCQkJCQkJCQlyZWcsIHZhbCk7CisJCX0KKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgd3JpdGluZyByZWc9JXUgcmM9JWRcbiIsIHJlZywgcmMpOworCQllbHNlCisJCQlwcl9lcnIoIndyaXRlIHN1Y2Nlc3MgcmVnaXN0ZXIgPSAleCB2YWwgPSAleFxuIiwKKwkJCQkJCQlyZWcsIHZhbCk7CisJfSBlbHNlIHsKKwkJcmVnX2FkZHIgPSAodTgpcmVnOworCQltc2cgPSAmd3NhODgxeC0+eGZlcl9tc2dbMF07CisJCW1zZy0+YWRkciA9IHdzYTg4MXgtPmNsaWVudFt3c2E4ODF4X2luZGV4XS0+YWRkcjsKKwkJbXNnLT5sZW4gPSBieXRlcyArIDE7CisJCW1zZy0+ZmxhZ3MgPSAwOworCQlkYXRhWzBdID0gcmVnOworCQlkYXRhWzFdID0gKHU4KXZhbDsKKwkJbXNnLT5idWYgPSBkYXRhOworCQlyZXQgPSBpMmNfdHJhbnNmZXIod3NhODgxeC0+Y2xpZW50W3dzYTg4MXhfaW5kZXhdLT5hZGFwdGVyLAorCQkJCQkJd3NhODgxeC0+eGZlcl9tc2csIDEpOworCQkvKiBUcnkgYWdhaW4gaWYgdGhlIHdyaXRlIGZhaWxzICovCisJCWlmIChyZXQgIT0gMSkgeworCQkJcmV0ID0gaTJjX3RyYW5zZmVyKAorCQkJCQl3c2E4ODF4LT5jbGllbnRbd3NhODgxeF9pbmRleF0tPmFkYXB0ZXIsCisJCQkJCQkJd3NhODgxeC0+eGZlcl9tc2csIDEpOworCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgdGhlIGRldmljZVxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlwcl9kZWJ1Zygid3JpdGUgc3VjY2VzcyByZWcgPSAleCB2YWwgPSAleFxuIiwgcmVnLCBkYXRhWzFdKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfaTJjX3JlYWRfZGV2aWNlKHN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4LAorCQkJCXVuc2lnbmVkIGludCByZWcpCit7CisJaW50IHdzYTg4MXhfaW5kZXg7CisJaW50IGkgPSAwLCByYyA9IDA7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgaTJjX21zZyAqbXNnOworCWludCByZXQgPSAwOworCXU4IHJlZ19hZGRyID0gMDsKKwl1OCBkZXN0WzVdOworCisJd3NhODgxeF9pbmRleCA9IGdldF9pMmNfd3NhODgxeF9kZXZpY2VfaW5kZXgocmVnKTsKKwlpZiAod3NhODgxeF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczppbnZhbGlkIHJlZ2lzdGVyIHRvIHJlYWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh3c2E4ODF4LT5yZWdtYXBfZmxhZykgeworCQlyYyA9IHJlZ21hcF9yZWFkKHdzYTg4MXgtPnJlZ21hcFt3c2E4ODF4X2luZGV4XSwgcmVnLCAmdmFsKTsKKwkJZm9yIChpID0gMDsgcmMgJiYgaSA8IEFSUkFZX1NJWkUoZGVsYXlfYXJyYXlfbXNlYyk7IGkrKykgeworCQkJcHJfZXJyKCJGYWlsZWQgcmVhZGluZyByZWc9JXUgLSByZXRyeSglZClcbiIsIHJlZywgaSk7CisJCQkvKiByZXRyeSBhZnRlciBkZWxheSBvZiBpbmNyZWFzaW5nIG9yZGVyICovCisJCQltc2xlZXAoZGVsYXlfYXJyYXlfbXNlY1tpXSk7CisJCQlyYyA9IHJlZ21hcF9yZWFkKHdzYTg4MXgtPnJlZ21hcFt3c2E4ODF4X2luZGV4XSwKKwkJCQkJCXJlZywgJnZhbCk7CisJCX0KKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIkZhaWxlZCByZWFkaW5nIHJlZz0ldSByYz0lZFxuIiwgcmVnLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcHJfZGVidWcoInJlYWQgc3VjY2VzcyByZWcgPSAleCB2YWwgPSAleFxuIiwKKwkJCQkJCXJlZywgdmFsKTsKKwl9IGVsc2UgeworCQlyZWdfYWRkciA9ICh1OClyZWc7CisJCW1zZyA9ICZ3c2E4ODF4LT54ZmVyX21zZ1swXTsKKwkJbXNnLT5hZGRyID0gd3NhODgxeC0+Y2xpZW50W3dzYTg4MXhfaW5kZXhdLT5hZGRyOworCQltc2ctPmxlbiA9IDE7CisJCW1zZy0+ZmxhZ3MgPSAwOworCQltc2ctPmJ1ZiA9ICZyZWdfYWRkcjsKKworCQltc2cgPSAmd3NhODgxeC0+eGZlcl9tc2dbMV07CisJCW1zZy0+YWRkciA9IHdzYTg4MXgtPmNsaWVudFt3c2E4ODF4X2luZGV4XS0+YWRkcjsKKwkJbXNnLT5sZW4gPSAxOworCQltc2ctPmZsYWdzID0gSTJDX01fUkQ7CisJCW1zZy0+YnVmID0gZGVzdDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKHdzYTg4MXgtPmNsaWVudFt3c2E4ODF4X2luZGV4XS0+YWRhcHRlciwKKwkJCQkJd3NhODgxeC0+eGZlcl9tc2csIDIpOworCisJCS8qIFRyeSBhZ2FpbiBpZiByZWFkIGZhaWxzIGZpcnN0IHRpbWUgKi8KKwkJaWYgKHJldCAhPSAyKSB7CisJCQlyZXQgPSBpMmNfdHJhbnNmZXIoCisJCQkJd3NhODgxeC0+Y2xpZW50W3dzYTg4MXhfaW5kZXhdLT5hZGFwdGVyLAorCQkJCQkJd3NhODgxeC0+eGZlcl9tc2csIDIpOworCQkJaWYgKHJldCAhPSAyKSB7CisJCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCB3c2EgcmVnaXN0ZXI6JWRcbiIsCisJCQkJCQkJCXJlZyk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQl2YWwgPSBkZXN0WzBdOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHdzYTg4MXhfaTJjX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXVuc2lnbmVkIGludCByZWcpCit7CisJc3RydWN0IHdzYTg4MXhfcGRhdGEgKndzYTg4MXg7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKGNvZGVjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjb2RlY1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWlmICghd3NhODgxeC0+d3NhX2FjdGl2ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3JlYWQoY29kZWMsIHJlZywgJnZhbCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldHVybiB2YWw7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSJjYWNoZSByZWFkIGZhaWxlZCBmb3IgcmVnOiAweCV4IHJldDogJWRcbiIsCisJCQkJCQkgcmVnLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gd3NhODgxeF9pMmNfcmVhZF9kZXZpY2Uod3NhODgxeCwgcmVnKTsKK30KKworc3RhdGljIGludCB3c2E4ODF4X2kyY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4OworCWludCByZXQgPSAwOworCisJaWYgKGNvZGVjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjb2RlY1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWlmICghd3NhODgxeC0+d3NhX2FjdGl2ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgImNhY2hlIHdyaXRlIHRvICV4IGZhaWxlZDogJWRcbiIsCisJCQkJCQlyZWcsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiB3c2E4ODF4X2kyY193cml0ZV9kZXZpY2Uod3NhODgxeCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfaTJjX2dldF9jbGllbnRfaW5kZXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJaW50ICp3c2E4ODF4X2luZGV4KQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbGllbnQtPmFkZHIpIHsKKwljYXNlIFdTQTg4MVhfSTJDX1NQSzBfU0xBVkUwX0FERFI6CisJY2FzZSBXU0E4ODFYX0kyQ19TUEswX1NMQVZFMV9BRERSOgorCQkqd3NhODgxeF9pbmRleCA9IFdTQTg4MVhfSTJDX1NQSzBfU0xBVkUwOworCWJyZWFrOworCWNhc2UgV1NBODgxWF9JMkNfU1BLMV9TTEFWRTBfQUREUjoKKwljYXNlIFdTQTg4MVhfSTJDX1NQSzFfU0xBVkUxX0FERFI6CisJCSp3c2E4ODF4X2luZGV4ID0gV1NBODgxWF9JMkNfU1BLMV9TTEFWRTA7CisJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X2Jvb3N0X2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzOiBlbmFibGU6JWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCWlmIChlbmFibGUpIHsKKwkJaWYgKCFXU0E4ODFYX0lTXzJfMCh3c2E4ODF4LT52ZXJzaW9uKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BTkFfQ1RMLAorCQkJCQkJCQkweDAxLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQU5BX0NUTCwKKwkJCQkJCQkJMHgwNCwgMHgwNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1BTX0NUTCwKKwkJCQkJCQkJMHg0MCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQxLAorCQkJCQkJCQkweEYwLCAweEIwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfWlhfQ1RMLAorCQkJCQkJCQkweDIwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfRU5fQ1RMLAorCQkJCQkJCQkweDgwLCAweDgwKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfTE9PUF9TVEFCSUxJVFksCisJCQkJCQkJMHgwMywgMHgwMyk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX01JU0MyX0NUTCwKKwkJCQkJCQkweEZGLCAweDE0KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfU1RBUlRfQ1RMLAorCQkJCQkJCTB4ODAsIDB4ODApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9TVEFSVF9DVEwsCisJCQkJCQkJMHgwMywgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCLAorCQkJCQkweDBDLCAweDA0KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdTQTg4MVhfQk9PU1RfU0xPUEVfQ09NUF9JU0VOU0VfRkIsCisJCQkJCTB4MDMsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSwKKwkJCQkJCQkweEYwLCAweDcwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQU5BX0NUTCwgMHgwMywgMHgwMSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0VOLAorCQkJCQkJCQkweDA4LCAweDA4KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQU5BX0NUTCwgMHgwNCwgMHgwNCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVQsCisJCQkJCQkJCTB4MEYsIDB4MDgpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9FTl9DVEwsCisJCQkJCQkJCTB4ODAsIDB4ODApOworCQl9CisJCS8qIEZvciBXU0E4ODEwLCBzdGFydC11cCB0aW1lIGlzIDE1MDB1cyBhcyBwZXIgcWNyZyBzZXF1ZW5jZSAqLworCQl1c2xlZXBfcmFuZ2UoMTUwMCwgMTUxMCk7CisJfSBlbHNlIHsKKwkJLyogRU5TVVJFOiBDbGFzcy1EIGFtcCBpcyBzaHV0ZG93bi4gQ0xLIGlzIHN0aWxsIG9uICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfRU5fQ1RMLCAweDgwLCAweDAwKTsKKwkJLyogYm9vc3Qgc2V0dGxlIHRpbWUgaXMgMTUwMHVzIGFzIHBlciBxY3JnIHNlcXVlbmNlICovCisJCXVzbGVlcF9yYW5nZSgxNTAwLCAxNTEwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF92aXNlbnNlX3R4ZmVfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlLAorCQkJCSAgICAgdTggaXNlbnNlMV9nYWluLCB1OCBpc2Vuc2UyX2dhaW4sCisJCQkJICAgICB1OCB2c2Vuc2VfZ2FpbikKK3sKKwl1OCB2YWx1ZSA9IDA7CisJc3RydWN0IHdzYTg4MXhfcGRhdGEgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2RlYnVnKCIlczogZW5hYmxlOiVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfMjgsCisJCQkJCQkweDNGLCAweDNBKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMSwKKwkJCQkJCTB4RkYsIDB4QjIpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT05HT19SRVNSVl9SRUcyLAorCQkJCQkJMHhGRiwgMHgwNSk7CisJCX0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTSwKKwkJCQkJMHgwOCwgMHgwMCk7CisJCWlmIChXU0E4ODFYX0lTXzJfMCh3c2E4ODF4LT52ZXJzaW9uKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyLAorCQkJCQkJCTB4MUMsIDB4MDQpOworCQl9IGVsc2UgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyLAorCQkJCQkJCTB4MDgsIDB4MDgpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyLAorCQkJCQkJCTB4MDIsIDB4MDIpOworCQl9CisJCXZhbHVlID0gKChpc2Vuc2UyX2dhaW4gPDwgNikgfCAoaXNlbnNlMV9nYWluIDw8IDQpIHwKKwkJCSh2c2Vuc2VfZ2FpbiA8PCAzKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sCisJCQkJCTB4RjgsIHZhbHVlKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfRkVfR0FJTiwKKwkJCQkJMHgwMSwgMHgwMSk7CisJfSBlbHNlIHsKKwkJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLCAweDEwLCAweDEwKTsKKwkJZWxzZQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQlXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLCAweDA4LCAweDA4KTsKKwkJLyoKKwkJICogMjAwdXMgc2xlZXAgaXMgbmVlZGVkIGFmdGVyIHZpc2Vuc2UgdHhmZSBkaXNhYmxlIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudC4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgyMDAsIDIxMCk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BST1RfRkVfR0FJTiwKKwkJCQkJMHgwMSwgMHgwMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfdmlzZW5zZV9hZGNfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZTolZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisJaWYgKGVuYWJsZSkgeworCQlpZiAoIVdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BRENfU0VMX0lCSUFTLAorCQkJCQkJCTB4NzAsIDB4NDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FEQ19FTl9TRUxfSUJJQVMsCisJCQkJCQkJMHgwNywgMHgwNCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX01PRFVfViwgMHg4MCwgMHg4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX01PRFVfSSwgMHg4MCwgMHg4MCk7CisJfSBlbHNlIHsKKwkJLyogRW5zdXJlOiBTcGVha2VyIFByb3RlY3Rpb24gaGFzIGJlZW4gc3RvcHBlZCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FEQ19FTl9NT0RVX1YsIDB4ODAsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FEQ19FTl9NT0RVX0ksIDB4ODAsIDB4MDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3c2E4ODF4X2JhbmRnYXBfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkLCBiZ19jb3VudDolZFxuIiwgX19mdW5jX18sCisJCWVuYWJsZSwgd3NhODgxeC0+YmdfY250KTsKKwltdXRleF9sb2NrKCZ3c2E4ODF4LT5iZ19sb2NrKTsKKwlpZiAoZW5hYmxlKSB7CisJCSsrd3NhODgxeC0+YmdfY250OworCQlpZiAod3NhODgxeC0+YmdfY250ID09IDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwKKwkJCQkJICAgIDB4MDgsIDB4MDgpOworCQkJLyogNDAwdXNlYyBzbGVlcCBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCQl1c2xlZXBfcmFuZ2UoNDAwLCA0MTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9URU1QX09QLCAweDA0LCAweDA0KTsKKwkJfQorCX0gZWxzZSB7CisJCS0td3NhODgxeC0+YmdfY250OworCQlpZiAod3NhODgxeC0+YmdfY250IDw9IDApIHsKKwkJCVdBUk5fT04od3NhODgxeC0+YmdfY250IDwgMCk7CisJCQl3c2E4ODF4LT5iZ19jbnQgPSAwOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9URU1QX09QLCAweDA0LCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwgMHgwOCwgMHgwMCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ3c2E4ODF4LT5iZ19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgd3NhODgxeF9jbGtfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczpzcyBlbmFibGU6JWQsIGNsa19jb3VudDolZFxuIiwgX19mdW5jX18sCisJCWVuYWJsZSwgd3NhODgxeC0+Y2xrX2NudCk7CisJbXV0ZXhfbG9jaygmd3NhODgxeC0+cmVzX2xvY2spOworCWlmIChlbmFibGUpIHsKKwkJKyt3c2E4ODF4LT5jbGtfY250OworCQlpZiAod3NhODgxeC0+Y2xrX2NudCA9PSAxKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXU0E4ODFYX0NEQ19SU1RfQ1RMLCAweDAyKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdTQTg4MVhfQ0RDX1JTVF9DVEwsIDB4MDMpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DTE9DS19DT05GSUcsIDB4MDEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDEpOworCQl9CisJfSBlbHNlIHsKKwkJLS13c2E4ODF4LT5jbGtfY250OworCQlpZiAod3NhODgxeC0+Y2xrX2NudCA8PSAwKSB7CisJCQlXQVJOX09OKHdzYTg4MXgtPmNsa19jbnQgPCAwKTsKKwkJCXdzYTg4MXgtPmNsa19jbnQgPSAwOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDApOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDApOworCQkJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVdTQTg4MVhfQ0RDX1RPUF9DTEtfQ1RMLCAweDAxLCAweDAwKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJndzYTg4MXgtPnJlc19sb2NrKTsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3JkYWNfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZTolZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisJaWYgKGVuYWJsZSkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FOQV9DVEwsIDB4MDgsIDB4MDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0dBSU4sIDB4MDgsIDB4MDgpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfREFDX0NUTCwgMHgyMCwgMHgyMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EQUNfQ1RMLCAweDIwLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0RBQ19DVEwsIDB4NDAsIDB4NDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfREFDX0NUTCwgMHg4MCwgMHg4MCk7CisJCWlmIChXU0E4ODFYX0lTXzJfMCh3c2E4ODF4LT52ZXJzaW9uKSkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0JJQVNfQ0FMLAorCQkJCQkJCQkweDAxLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLAorCQkJCQkJCQkweDMwLCAweDMwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLAorCQkJCQkJCQkweDBDLCAweDAwKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0dBSU4sIDB4RjAsIDB4NDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfTUlTQ19DVEwxLCAweDAxLCAweDAxKTsKKwl9IGVsc2UgeworCQkvKiBFbnN1cmUgY2xhc3MtRCBhbXAgaXMgb2ZmICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EQUNfQ1RMLCAweDgwLCAweDAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9zcGtyX3BhX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcHJfZGVidWcoIiVzOiBlbmFibGU6JWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCWlmIChlbmFibGUpIHsKKwkJLyoKKwkJICogRW5zdXJlOiBCb29zdCBpcyBlbmFibGVkIGFuZCBzdGFibGUsIEFuYWxvZyBpbnB1dCBpcyB1cAorCQkgKiBhbmQgb3V0cHV0dGluZyBzaWxlbmNlCisJCSAqLworCQlpZiAoIVdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JLAorCQkJCQkJCQkweEZGLCAweDAxKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX01PRFVfViwKKwkJCQkJCQkJMHgwMiwgMHgwMik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9WLAorCQkJCQkJCQkweEZGLCAweDEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QV1JTVEdfREJHLAorCQkJCQkJCQkweEEwLCAweEEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfRU4sCisJCQkJCQkJCTB4ODAsIDB4ODApOworCQkJdXNsZWVwX3JhbmdlKDcwMCwgNzEwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QV1JTVEdfREJHLAorCQkJCQkJCQkweDAwLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX0RFVF9URVNUX1YsCisJCQkJCQkJCTB4RkYsIDB4MDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BRENfRU5fTU9EVV9WLAorCQkJCQkJCQkweDAyLCAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX0RFVF9URVNUX0ksCisJCQkJCQkJCTB4RkYsIDB4MDApOworCQl9IGVsc2UKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfRU4sCisJCQkJCQkJCTB4ODAsIDB4ODApOworCQkvKiBhZGQgMTAwMHVzIGRlbGF5IGFzIHBlciBxY3JnICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0RSVl9FTiwgMHgwMSwgMHgwMSk7CisJCWlmIChXU0E4ODFYX0lTXzJfMCh3c2E4ODF4LT52ZXJzaW9uKSkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9CSUFTX0NBTCwKKwkJCQkJCQkJMHgwMSwgMHgwMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDEwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0RSVl9HQUlOLCAweEYwLAorCQkJCQkJKHdzYTg4MXgtPnNwa19wYV9nYWluIDw8IDQpKTsKKwkJaWYgKHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlKSB7CisJCQlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV1NBX0JPTkdPXzEsCisJCQkJCQkJIndzYV92aSIpOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBhY3RpdmF0ZWQgJXNcbiIsCisJCQkJCV9fZnVuY19fLCAid3NhX3ZpIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCXdzYTg4MXhfdmlzZW5zZV90eGZlX2N0cmwoY29kZWMsIHRydWUsCisJCQkJCQkweDAwLCAweDAxLCAweDAwKTsKKwkJCXdzYTg4MXhfdmlzZW5zZV9hZGNfY3RybChjb2RlYywgdHJ1ZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBFbnN1cmU6IEJvb3N0IGlzIHN0aWxsIG9uLCBTdHJlYW0gZnJvbSBBbmFsb2cgaW5wdXQgYW5kCisJCSAqIFNwZWFrZXIgUHJvdGVjdGlvbiBoYXMgYmVlbiBzdG9wcGVkIGFuZCBpbnB1dCBpcyBhdCAwVgorCQkgKi8KKwkJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfQklBU19DQUwsCisJCQkJCQkJCTB4MDEsIDB4MDEpOworCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0JJQVNfQ0FMLAorCQkJCQkJCQkweDAxLCAweDAwKTsKKwkJCW1zbGVlcCgyMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0FOQV9DVEwsCisJCQkJCQkJCTB4MDMsIDB4MDApOworCQkJdXNsZWVwX3JhbmdlKDIwMCwgMjEwKTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0VOLCAweDgwLCAweDAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9nZXRfYm9vc3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3c2E4ODF4LT5ib29zdF9lbmFibGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9zZXRfYm9vc3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHdzYTg4MXhfcGRhdGEgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBCb29zdCBlbmFibGUgY3VycmVudCAlZCwgbmV3ICVkXG4iLAorCQkgX19mdW5jX18sIHdzYTg4MXgtPmJvb3N0X2VuYWJsZSwgdmFsdWUpOworCXdzYTg4MXgtPmJvb3N0X2VuYWJsZSA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfZ2V0X3Zpc2Vuc2Uoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3c2E4ODF4LT52aXNlbnNlX2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3NldF92aXNlbnNlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVklzZW5zZSBlbmFibGUgY3VycmVudCAlZCwgbmV3ICVkXG4iLAorCQkgX19mdW5jX18sIHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlLCB2YWx1ZSk7CisJd3NhODgxeC0+dmlzZW5zZV9lbmFibGUgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdzYTg4MXhfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkJPT1NUIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKKwkJd3NhODgxeF9nZXRfYm9vc3QsIHdzYTg4MXhfc2V0X2Jvb3N0KSwKKworCVNPQ19TSU5HTEVfRVhUKCJWSVNFTlNFIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKKwkJd3NhODgxeF9nZXRfdmlzZW5zZSwgd3NhODgxeF9zZXRfdmlzZW5zZSksCisKKwlTT0NfRU5VTV9FWFQoIldTQV9TUEsgUEEgR2FpbiIsIHdzYTg4MXhfc3BrX3BhX2dhaW5fZW51bVswXSwKKwkJd3NhODgxeF9zcGtfcGFfZ2Fpbl9nZXQsIHdzYTg4MXhfc3BrX3BhX2dhaW5fcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmRhY190ZXh0W10gPSB7CisJIlpFUk8iLCAiU3dpdGNoIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmRhY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgQVJSQVlfU0laRShyZGFjX3RleHQpLCByZGFjX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmRhY19tdXhbXSA9IHsKKwlTT0NfREFQTV9FTlVNKCJSREFDIiwgcmRhY19lbnVtKQorfTsKKworc3RhdGljIGludCB3c2E4ODF4X3JkYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogJXMgJWQgYm9vc3QgJWQgdmlzZW5zZSAlZFxuIiwKKwkJIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCwKKwkJd3NhODgxeC0+Ym9vc3RfZW5hYmxlLCB3c2E4ODF4LT52aXNlbnNlX2VuYWJsZSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gd3NhODgxeF9zdGFydHVwKHdzYTg4MXgpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiB3c2Egc3RhcnR1cCBmYWlsZWQgcmV0OiAlZCIsIF9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQl3c2E4ODF4X2Nsa19jdHJsKGNvZGVjLCB0cnVlKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0RBQ19DVEwsIDB4MDIsIDB4MDIpOworCQlpZiAoIVdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CSUFTX1JFRl9DVFJMLAorCQkJCQkJCQkweDBGLCAweDA4KTsKKwkJd3NhODgxeF9iYW5kZ2FwX2N0cmwoY29kZWMsIHRydWUpOworCQlpZiAoIVdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0JCTV9DVEwsCisJCQkJCQkJCTB4MDIsIDB4MDIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfTUlTQ19DVEwxLCAweEMwLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX01JU0NfQ1RMMSwgMHgwNiwgMHgwNik7CisJCWlmICghV1NBODgxWF9JU18yXzAod3NhODgxeC0+dmVyc2lvbikpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9NSVNDX0NUTDIsCisJCQkJCQkJCTB4MDQsIDB4MDQpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0JJQVNfSU5ULAorCQkJCQkJCQkweDA5LCAweDA5KTsKKwkJfQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfUEFfSU5ULCAweEYwLCAweDIwKTsKKwkJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BBX0lOVCwKKwkJCQkJCQkJMHgwRSwgMHgwRSk7CisJCWlmICh3c2E4ODF4LT5ib29zdF9lbmFibGUpCisJCQl3c2E4ODF4X2Jvb3N0X2N0cmwoY29kZWMsIHRydWUpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJd3NhODgxeF9yZGFjX2N0cmwoY29kZWMsIHRydWUpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQl3c2E4ODF4X3JkYWNfY3RybChjb2RlYywgZmFsc2UpOworCQlpZiAod3NhODgxeC0+dmlzZW5zZV9lbmFibGUpIHsKKwkJCXdzYTg4MXhfdmlzZW5zZV9hZGNfY3RybChjb2RlYywgZmFsc2UpOworCQkJd3NhODgxeF92aXNlbnNlX3R4ZmVfY3RybChjb2RlYywgZmFsc2UsCisJCQkJCQkweDAwLCAweDAxLCAweDAwKTsKKwkJCXJldCA9IG1zbV9ncGlvc2V0X3N1c3BlbmQoQ0xJRU5UX1dTQV9CT05HT18xLAorCQkJCQkJCSJ3c2FfdmkiKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgc3VzcGVuZGVkICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgIndzYV92aSIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmICh3c2E4ODF4LT5ib29zdF9lbmFibGUpCisJCQl3c2E4ODF4X2Jvb3N0X2N0cmwoY29kZWMsIGZhbHNlKTsKKwkJd3NhODgxeF9jbGtfY3RybChjb2RlYywgZmFsc2UpOworCQl3c2E4ODF4X2JhbmRnYXBfY3RybChjb2RlYywgZmFsc2UpOworCQlyZXQgPSB3c2E4ODF4X3NodXRkb3duKHdzYTg4MXgpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogd3NhIHNodXRkb3duIGZhaWxlZCByZXQ6ICVkIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGludmFsaWQgZXZlbnQ6JWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3NhODgxeF9vY3BfY3RsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4OworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwl1bnNpZ25lZCBsb25nIHRlbXBfdmFsOworCisJZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJd3NhODgxeCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdzYTg4MXhfcGRhdGEsIG9jcF9jdGxfd29yayk7CisKKwlpZiAoIXdzYTg4MXgpCisJCXJldHVybjsKKworCWNvZGVjID0gd3NhODgxeC0+Y29kZWM7CisJd3NhODgxeF9nZXRfdGVtcCh3c2E4ODF4LT50el9wZGF0YS50el9kZXYsICZ0ZW1wX3ZhbCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiIHRlbXAgPSAlbGRcbiIsIHRlbXBfdmFsKTsKKworCWlmICh0ZW1wX3ZhbCA8PSBXU0E4ODFYX09DUF9DVExfVEVNUF9DRUxTSVVTKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhDMCwgMHgwMCk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhDMCwgMHhDMCk7CisKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKHdzYTg4MXhfb2NwX3BvbGxfdGltZXJfc2VjICogMTAwMCkpOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfc3Brcl9wYV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IHdzYTg4MXhfcGRhdGEgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXByX2RlYnVnKCIlczogJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4QzAsIDB4ODApOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJd3NhODgxeF9zcGtyX3BhX2N0cmwoY29kZWMsIHRydWUpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndzYTg4MXgtPm9jcF9jdGxfd29yaywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoV1NBODgxWF9PQ1BfQ1RMX1RJTUVSX1NFQyAqIDEwMDApKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJd3NhODgxeF9zcGtyX3BhX2N0cmwoY29kZWMsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd3NhODgxeC0+b2NwX2N0bF93b3JrKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4QzAsIDB4QzApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGV2ZW50OiVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdzYTg4MXhfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0lOUFVUKCJXU0FfSU4iKSwKKworCVNORF9TT0NfREFQTV9EQUNfRSgiUkRBQyBBbmFsb2ciLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXdzYTg4MXhfcmRhY19ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJXU0FfUkRBQyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcmRhY19tdXgpLAorCisJU05EX1NPQ19EQVBNX1BHQV9TKCJXU0FfU1BLUiBQR0EiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQl3c2E4ODF4X3Nwa3JfcGFfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAlTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiV1NBX1NQS1IiKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdzYTg4MXhfYXVkaW9fbWFwW10gPSB7CisJeyJXU0FfUkRBQyIsICJTd2l0Y2giLCAiV1NBX0lOIn0sCisJeyJSREFDIEFuYWxvZyIsIE5VTEwsICJXU0FfUkRBQyJ9LAorCXsiV1NBX1NQS1IgUEdBIiwgTlVMTCwgIlJEQUMgQW5hbG9nIn0sCisJeyJXU0FfU1BLUiIsIE5VTEwsICJXU0FfU1BLUiBQR0EifSwKK307CisKKworc3RhdGljIGludCB3c2E4ODF4X3N0YXJ0dXAoc3RydWN0IHdzYTg4MXhfcGRhdGEgKnBkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHBkYXRhLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCisJcHJfZGVidWcoIiVzKCk6IHdzYSBzdGFydHVwLCBlbmFibGVfY250OiVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJcGRhdGEtPmVuYWJsZV9jbnQpOworCisJaWYgKHBkYXRhLT5lbmFibGVfY250KysgPiAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV1NBX0JPTkdPXzEsICJ3c2FfY2xrIik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgYWN0aXZhdGVkICVzXG4iLAorCQkJX19mdW5jX18sICJ3c2FfY2xrIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChwZGF0YS0+ZW5hYmxlX21jbGspIHsKKwkJcmV0ID0gcGRhdGEtPmVuYWJsZV9tY2xrKGNhcmQsIHRydWUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LAorCQkJCSIlczogbWNsayBlbmFibGUgZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXQgPSB3c2E4ODF4X3Jlc2V0KHBkYXRhLCB0cnVlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfc2h1dGRvd24oc3RydWN0IHdzYTg4MXhfcGRhdGEgKnBkYXRhKQoreworCWludCByZXQgPSAwLCByZWc7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcGRhdGEtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisKKwlwcl9kZWJ1ZygiJXMoKTogd3NhIHNodXRkb3duLCBlbmFibGVfY250OiVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJcGRhdGEtPmVuYWJsZV9jbnQpOworCWlmICgtLXBkYXRhLT5lbmFibGVfY250ID4gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gd3NhODgxeF9yZXNldChwZGF0YSwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogd3NhIHJlc2V0IGZhaWxlZCBzdXNwZW5kICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHBkYXRhLT5lbmFibGVfbWNsaykgeworCQlyZXQgPSBwZGF0YS0+ZW5hYmxlX21jbGsoY2FyZCwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogbWNsayBkaXNhYmxlIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XU0FfQk9OR09fMSwgIndzYV9jbGsiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBzdXNwZW5kZWQgJXNcbiIsCisJCQlfX2Z1bmNfXywgIndzYV9jbGsiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHBkYXRhLT5jb2RlYykgeworCQkvKiByZXN0b3JlIGRlZmF1bHRzIHRvIGNhY2hlICovCisJCWZvciAocmVnID0gMDsgcmVnIDwgQVJSQVlfU0laRSh3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHMpOworCQkJCXJlZysrKSB7CisJCQlpZiAod3NhODgxeF9hbmFfcmVnX3JlYWRhYmxlW3JlZ10pCisJCQkJc25kX3NvY19jYWNoZV93cml0ZShwZGF0YS0+Y29kZWMsCisJCQkJCXdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0c1tyZWddLnJlZywKKwkJCQkJd3NhODgxeF9hbmFfcmVnX2RlZmF1bHRzW3JlZ10uZGVmKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3Qgd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJCWJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJldCA9IHdzYTg4MXhfc3RhcnR1cCh3c2E4ODF4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byBzdGFydHVwXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXdzYTg4MXhfY2xrX2N0cmwoY29kZWMsIGVuYWJsZSk7CisJd3NhODgxeF9iYW5kZ2FwX2N0cmwoY29kZWMsIGVuYWJsZSk7CisJaWYgKCFlbmFibGUpIHsKKwkJcmV0ID0gd3NhODgxeF9zaHV0ZG93bih3c2E4ODF4KTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBmYWlsZWQgdG8gc2h1dGRvd25cbiIsIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludDMyX3Qgd3NhODgxeF90ZW1wX3JlZ19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIHN0cnVjdCB3c2FfdGVtcF9yZWdpc3RlciAqd3NhX3RlbXBfcmVnKQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXdzYTg4MXgpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKGNvZGVjLCB0cnVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwKKwkJCSIlczogcmVzb3VyY2UgYWNxdWlyZSBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKFdTQTg4MVhfSVNfMl8wKHdzYTg4MXgtPnZlcnNpb24pKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEFEQ19WQUxVRV9DVEwsIDB4MDEsIDB4MDApOworCQl3c2FfdGVtcF9yZWctPmRtZWFzX21zYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9URU1QX01TQik7CisJCXdzYV90ZW1wX3JlZy0+ZG1lYXNfbHNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX1RFTVBfTFNCKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9UQURDX1ZBTFVFX0NUTCwgMHgwMSwgMHgwMSk7CisJfSBlbHNlIHsKKwkJd3NhX3RlbXBfcmVnLT5kbWVhc19tc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsCisJCQkJCQkgICBXU0E4ODFYX1RFTVBfRE9VVF9NU0IpOworCQl3c2FfdGVtcF9yZWctPmRtZWFzX2xzYiA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkJCSAgIFdTQTg4MVhfVEVNUF9ET1VUX0xTQik7CisJfQorCXdzYV90ZW1wX3JlZy0+ZDFfbXNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfMSk7CisJd3NhX3RlbXBfcmVnLT5kMV9sc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfT1RQX1JFR18yKTsKKwl3c2FfdGVtcF9yZWctPmQyX21zYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9PVFBfUkVHXzMpOworCXdzYV90ZW1wX3JlZy0+ZDJfbHNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfNCk7CisKKwlyZXQgPSB3c2E4ODF4X3Jlc291cmNlX2FjcXVpcmUoY29kZWMsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsCisJCQkiJXM6IHJlc291cmNlIHJlbGVhc2UgZmFpbFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3NhODgxeF9pbmRleCA9IDA7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgKmNvZGVjX2NvbmYgPSBjYXJkLT5jb2RlY19jb25mOworCisJY2xpZW50ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOworCXJldCA9IHdzYTg4MXhfaTJjX2dldF9jbGllbnRfaW5kZXgoY2xpZW50LCAmd3NhODgxeF9pbmRleCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IEkyQyBnZXQgY29kZWMgSTJDXG4iCisJCQkiY2xpZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKwltdXRleF9pbml0KCZ3c2FfcGRhdGFbd3NhODgxeF9pbmRleF0uYmdfbG9jayk7CisJbXV0ZXhfaW5pdCgmd3NhX3BkYXRhW3dzYTg4MXhfaW5kZXhdLnJlc19sb2NrKTsKKwlzbnByaW50Zih3c2FfcGRhdGFbd3NhODgxeF9pbmRleF0udHpfcGRhdGEubmFtZSwgMTAwLCAiJXMiLAorCQkJd3NhX3R6X25hbWVzW3dzYTg4MXhfaW5kZXhdKTsKKwl3c2FfcGRhdGFbd3NhODgxeF9pbmRleF0uY29kZWMgPSBjb2RlYzsKKwl3c2FfcGRhdGFbd3NhODgxeF9pbmRleF0uc3BrX3BhX2dhaW4gPSBTUEtfR0FJTl8xMkRCOworCXdzYV9wZGF0YVt3c2E4ODF4X2luZGV4XS5jb2RlYyA9IGNvZGVjOworCXdzYV9wZGF0YVt3c2E4ODF4X2luZGV4XS50el9wZGF0YS5jb2RlYyA9IGNvZGVjOworCXdzYV9wZGF0YVt3c2E4ODF4X2luZGV4XS50el9wZGF0YS53c2FfdGVtcF9yZWdfcmVhZCA9CisJCQkJCQl3c2E4ODF4X3RlbXBfcmVnX3JlYWQ7CisJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XSk7CisJd3NhODgxeF9pbml0X3RoZXJtYWwoJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XS50el9wZGF0YSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XS5vY3BfY3RsX3dvcmssCisJCQkJd3NhODgxeF9vY3BfY3RsX3dvcmspOworCisJaWYgKGNvZGVjX2NvbmYtPm5hbWVfcHJlZml4KSB7CisJCXdpZGdldF9uYW1lID0ga2NhbGxvYyhXSURHRVRfTkFNRV9NQVhfU0laRSwgc2l6ZW9mKGNoYXIpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCF3aWRnZXRfbmFtZSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNucHJpbnRmKHdpZGdldF9uYW1lLCBXSURHRVRfTkFNRV9NQVhfU0laRSwKKwkJCSIlcyBXU0FfU1BLUiIsIGNvZGVjX2NvbmYtPm5hbWVfcHJlZml4KTsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sIHdpZGdldF9uYW1lKTsKKwkJc25wcmludGYod2lkZ2V0X25hbWUsIFdJREdFVF9OQU1FX01BWF9TSVpFLAorCQkJIiVzIFdTQV9JTiIsIGNvZGVjX2NvbmYtPm5hbWVfcHJlZml4KTsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sIHdpZGdldF9uYW1lKTsKKwkJa2ZyZWUod2lkZ2V0X25hbWUpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiV1NBX1NQS1IiKTsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJXU0FfSU4iKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYyhjb21wb25lbnQpOworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAod3NhODgxeC0+dHpfcGRhdGEudHpfZGV2KQorCQl3c2E4ODF4X2RlaW5pdF90aGVybWFsKHdzYTg4MXgtPnR6X3BkYXRhLnR6X2Rldik7CisKKwltdXRleF9kZXN0cm95KCZ3c2E4ODF4LT5iZ19sb2NrKTsKKwltdXRleF9kZXN0cm95KCZ3c2E4ODF4LT5yZXNfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93c2E4ODF4ID0geworCS5yZWFkID0gd3NhODgxeF9pMmNfcmVhZCwKKwkud3JpdGUgPSB3c2E4ODF4X2kyY193cml0ZSwKKworCS5yZWdfY2FjaGVfc2l6ZSA9IFdTQTg4MVhfQ0FDSEVfU0laRSwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSB3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHMsCisJLnJlZ193b3JkX3NpemUgPSAxLAorCisJLmNvbnRyb2xzID0gd3NhODgxeF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod3NhODgxeF9zbmRfY29udHJvbHMpLAorCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5wcm9iZQk9IHdzYTg4MXhfcHJvYmUsCisJCS5yZW1vdmUJPSB3c2E4ODF4X3JlbW92ZSwKKworCQkuZGFwbV93aWRnZXRzID0gd3NhODgxeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3c2E4ODF4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9IHdzYTg4MXhfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3c2E4ODF4X2F1ZGlvX21hcCksCisJfSwKK307CisKK3N0YXRpYyBpbnQgd3NhODgxeF9yZXNldChzdHJ1Y3Qgd3NhODgxeF9wZGF0YSAqcGRhdGEsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBzaHV0ZG93biB0aGUgR1BJT3MgV1NBX0VOLCBXU0FfTUNMSywgcmVndWxhdG9ycworCSAqIGFuZCByZXN0b3JlIGRlZmF1bHRzIGluIHNvYyBjYWNoZSB3aGVuIHNodXRkb3duLgorCSAqIEVuYWJsZSByZWd1bGF0b3JzLCBHUElPcyBXU0FfTUNMSywgV1NBX0VOIHdoZW4gcG93ZXJ1cC4KKwkgKi8KKwlpZiAoZW5hYmxlKSB7CisJCWlmIChwZGF0YS0+d3NhX2FjdGl2ZSkKKwkJCXJldHVybiAwOworCQlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV1NBX0JPTkdPXzEsICJ3c2FfcmVzZXQiKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGFjdGl2YXRlZCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgIndzYV9yZXNldCIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XU0FfQk9OR09fMSwgIndzYV9yZXNldCIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgc3VzcGVuZGVkKHBvd2VydXApICVzXG4iLAorCQkJCV9fZnVuY19fLCAid3NhX3Jlc2V0Iik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IG1zbV9ncGlvc2V0X2FjdGl2YXRlKENMSUVOVF9XU0FfQk9OR09fMSwgIndzYV9yZXNldCIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgYWN0aXZhdGVkICVzXG4iLAorCQkJCV9fZnVuY19fLCAid3NhX3Jlc2V0Iik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXBkYXRhLT53c2FfYWN0aXZlID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAoIXBkYXRhLT53c2FfYWN0aXZlKQorCQkJcmV0dXJuIDA7CisJCXJldCA9IG1zbV9ncGlvc2V0X3N1c3BlbmQoQ0xJRU5UX1dTQV9CT05HT18xLCAid3NhX3Jlc2V0Iik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBzdXNwZW5kZWQgJXNcbiIsCisJCQkJX19mdW5jX18sICJ3c2FfcmVzZXQiKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcGRhdGEtPndzYV9hY3RpdmUgPSBmYWxzZTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHdzYTg4MXhfZ2V0X2NsaWVudF9pbmRleCh2b2lkKQoreworCXJldHVybiB3c2E4ODF4X2kyY19hZGRyOworfQorRVhQT1JUX1NZTUJPTCh3c2E4ODF4X2dldF9jbGllbnRfaW5kZXgpOworCitpbnQgd3NhODgxeF9nZXRfcHJvYmluZ19jb3VudCh2b2lkKQoreworCXJldHVybiB3c2E4ODF4X3Byb2JpbmdfY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MKHdzYTg4MXhfZ2V0X3Byb2JpbmdfY291bnQpOworCitpbnQgd3NhODgxeF9nZXRfcHJlc2VuY2VfY291bnQodm9pZCkKK3sKKwlyZXR1cm4gd3NhODgxeF9wcmVzZW5jZV9jb3VudDsKK30KK0VYUE9SVF9TWU1CT0wod3NhODgxeF9nZXRfcHJlc2VuY2VfY291bnQpOworCitpbnQgd3NhODgxeF9zZXRfbWNsa19jYWxsYmFjaygKKwlpbnQgKCplbmFibGVfbWNsa19jYWxsYmFjaykoc3RydWN0IHNuZF9zb2NfY2FyZCAqLCBib29sKSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfV1NBODgxWF9ERVZJQ0U7IGkrKykgeworCQlpZiAod3NhX3BkYXRhW2ldLnN0YXR1cyA9PSBXU0E4ODFYX1NUQVRVU19JMkMpCisJCQl3c2FfcGRhdGFbaV0uZW5hYmxlX21jbGsgPSBlbmFibGVfbWNsa19jYWxsYmFjazsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHdzYTg4MXhfc2V0X21jbGtfY2FsbGJhY2spOworCitzdGF0aWMgaW50IGNoZWNrX3dzYTg4MXhfcHJlc2VuY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3NhODgxeF9pbmRleCA9IDA7CisKKwlyZXQgPSB3c2E4ODF4X2kyY19nZXRfY2xpZW50X2luZGV4KGNsaWVudCwgJndzYTg4MXhfaW5kZXgpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBJMkMgZ2V0IGNvZGVjIEkyQ1xuIgorCQkJImNsaWVudCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gd3NhODgxeF9pMmNfcmVhZF9kZXZpY2UoJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XSwKKwkJCQkJV1NBODgxWF9DRENfUlNUX0NUTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCB3c2E4ODF4IHdpdGggYWRkciAleFxuIiwKKwkJCQljbGllbnQtPmFkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB3c2E4ODF4X2kyY193cml0ZV9kZXZpY2UoJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XSwKKwkJCQkJV1NBODgxWF9DRENfUlNUX0NUTCwgMHgwMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGUgYWRkciAleCByZWc6MHg1IHZhbDoweDFcbiIsCisJCQkJCWNsaWVudC0+YWRkcik7CisJCXJldHVybiByZXQ7CisJfQorCS8qIGFsbG93IDIwbXMgYmVmb3JlIHRyaWdnZXIgbmV4dCB3cml0ZSB0byB2ZXJpZnkgV1NBODgxeCBwcmVzZW5jZSAqLworCW1zbGVlcCgyMCk7CisJcmV0ID0gd3NhODgxeF9pMmNfd3JpdGVfZGV2aWNlKCZ3c2FfcGRhdGFbd3NhODgxeF9pbmRleF0sCisJCQkJCVdTQTg4MVhfQ0RDX1JTVF9DVEwsIDB4MDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRlIGFkZHIgJXggcmVnOjB4NSB2YWw6MHgwXG4iLAorCQkJCQljbGllbnQtPmFkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfcG9wdWxhdGVfZHRfcGRhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCisJLyogcmVhZGluZyB0aGUgZ3BpbyBjb25maWd1cmF0aW9ucyBmcm9tIGR0c2kgZmlsZSAqLworCWlmICghcGluY3RybF9pbml0KSB7CisJCXJldCA9IG1zbV9ncGlvc2V0X2luaXRpYWxpemUoQ0xJRU5UX1dTQV9CT05HT18xLCBkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsCisJCQkiJXM6IGVycm9yIHJlYWRpbmcgZHRzaSBmaWxlcyVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXBpbmN0cmxfaW5pdCA9IHRydWU7CisJfQorZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3NhODgxeF9pbmRleCA9IDA7CisJc3RydWN0IHdzYTg4MXhfcGRhdGEgKnBkYXRhID0gTlVMTDsKKworCXJldCA9IHdzYTg4MXhfaTJjX2dldF9jbGllbnRfaW5kZXgoY2xpZW50LCAmd3NhODgxeF9pbmRleCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IEkyQyBnZXQgY29kZWMgSTJDXG4iCisJCQkiY2xpZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXBkYXRhID0gJndzYV9wZGF0YVt3c2E4ODF4X2luZGV4XTsKKworCWlmICgoY2xpZW50LT5hZGRyID09IFdTQTg4MVhfSTJDX1NQSzBfU0xBVkUxX0FERFIgfHwKKwkJY2xpZW50LT5hZGRyID09IFdTQTg4MVhfSTJDX1NQSzFfU0xBVkUxX0FERFIpICYmCisJCShwZGF0YS0+c3RhdHVzID09IFdTQTg4MVhfU1RBVFVTX1BST0JJTkcpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBkYXRhLT5zdGF0dXMgPT0gV1NBODgxWF9TVEFUVVNfSTJDKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6cHJvYmUgZm9yIG90aGVyIHNsYXZlc1xuIgorCQkJImRldmljZXMgb2YgY29kZWMgSTJDIHNsYXZlIEFkZHIgPSAleFxuIiwKKwkJCV9fZnVuY19fLCBjbGllbnQtPmFkZHIpOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6d3NhX2lkeCA9ICVkIFNMQVZFID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHdzYTg4MXhfaW5kZXgsIFdTQTg4MVhfQU5BTE9HX1NMQVZFKTsKKwkJcGRhdGEtPnJlZ21hcFtXU0E4ODFYX0FOQUxPR19TTEFWRV0gPQorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoCisJCQkJY2xpZW50LAorCQkJJndzYTg4MXhfYW5hX3JlZ21hcF9jb25maWdbV1NBODgxWF9BTkFMT0dfU0xBVkVdKTsKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKHBkYXRhLT5yZWdtYXBbV1NBODgxWF9BTkFMT0dfU0xBVkVdLAorCQkJCQl0cnVlKTsKKwkJaWYgKElTX0VSUihwZGF0YS0+cmVnbWFwW1dTQTg4MVhfQU5BTE9HX1NMQVZFXSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGRhdGEtPnJlZ21hcFtXU0E4ODFYX0FOQUxPR19TTEFWRV0pOworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJIiVzOiByZWdtYXBfaW5pdCBmYWlsZWQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQl9CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGRhdGEpOworCQlwZGF0YS0+Y2xpZW50W1dTQTg4MVhfQU5BTE9HX1NMQVZFXSA9IGNsaWVudDsKKwkJaWYgKHBkYXRhLT52ZXJzaW9uID09IFdTQTg4MVhfMl8wKQorCQkJd3NhODgxeF91cGRhdGVfcmVnbWFwXzJfMCgKKwkJCQkJcGRhdGEtPnJlZ21hcFtXU0E4ODFYX0FOQUxPR19TTEFWRV0sCisJCQkJCVdTQTg4MVhfQU5BTE9HX1NMQVZFKTsKKworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAocGRhdGEtPnN0YXR1cyA9PSBXU0E4ODFYX1NUQVRVU19QUk9CSU5HKSB7CisJCXBkYXRhLT5pbmRleCA9IHdzYTg4MXhfaW5kZXg7CisJCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOlBsYXRmb3JtIGRhdGFcbiIKKwkJCQkiZnJvbSBkZXZpY2UgdHJlZVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gd3NhODgxeF9wb3B1bGF0ZV9kdF9wZGF0YSgmY2xpZW50LT5kZXYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiJXM6IEZhaWwgdG8gb2J0YWluIHBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6UGxhdGZvcm0gZGF0YSBmcm9tXG4iCisJCQkJImJvYXJkIGZpbGVcbiIsIF9fZnVuY19fKTsKKwkJCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJfQorCQlpZiAoIXBkYXRhKSB7CisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwZGF0YSk7CisJCWRldl9zZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYsIGNsaWVudCk7CisKKwkJcGRhdGEtPnJlZ21hcFtXU0E4ODFYX0RJR0lUQUxfU0xBVkVdID0KKwkJCWRldm1fcmVnbWFwX2luaXRfaTJjKAorCQkJCWNsaWVudCwKKwkJCSZ3c2E4ODF4X2FuYV9yZWdtYXBfY29uZmlnW1dTQTg4MVhfRElHSVRBTF9TTEFWRV0pOworCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MocGRhdGEtPnJlZ21hcFtXU0E4ODFYX0RJR0lUQUxfU0xBVkVdLAorCQkJCQl0cnVlKTsKKwkJaWYgKElTX0VSUihwZGF0YS0+cmVnbWFwW1dTQTg4MVhfRElHSVRBTF9TTEFWRV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkYXRhLT5yZWdtYXBbV1NBODgxWF9ESUdJVEFMX1NMQVZFXSk7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWdtYXBfaW5pdCBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBidXMgcmVzZXQgc2VxdWVuY2UgKi8KKwkJcmV0ID0gd3NhODgxeF9yZXNldChwZGF0YSwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBXU0EgZW5hYmxlIEZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXBkYXRhLT5jbGllbnRbV1NBODgxWF9ESUdJVEFMX1NMQVZFXSA9IGNsaWVudDsKKwkJcGRhdGEtPnJlZ21hcF9mbGFnID0gdHJ1ZTsKKwkJcmV0ID0gY2hlY2tfd3NhODgxeF9wcmVzZW5jZShjbGllbnQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJImZhaWxlZCB0byBwaW5nIHdzYSB3aXRoIGFkZHI6JXgsIHJldCA9ICVkXG4iLAorCQkJCQkJY2xpZW50LT5hZGRyLCByZXQpOworCQkJd3NhODgxeF9wcm9iaW5nX2NvdW50Kys7CisJCQlnb3RvIGVycjE7CisJCX0KKwkJcGRhdGEtPnZlcnNpb24gPSB3c2E4ODF4X2kyY19yZWFkX2RldmljZShwZGF0YSwKKwkJCQkJV1NBODgxWF9DSElQX0lEMSk7CisJCXByX2RlYnVnKCIlczogd3NhODgxeCB2ZXJzaW9uOiAlZFxuIiwgX19mdW5jX18sIHBkYXRhLT52ZXJzaW9uKTsKKwkJaWYgKHBkYXRhLT52ZXJzaW9uID09IFdTQTg4MVhfMl8wKSB7CisJCQl3c2E4ODF4X3VwZGF0ZV9yZWdfZGVmYXVsdHNfMl8wKCk7CisJCQl3c2E4ODF4X3VwZGF0ZV9yZWdtYXBfMl8wKAorCQkJCQlwZGF0YS0+cmVnbWFwW1dTQTg4MVhfRElHSVRBTF9TTEFWRV0sCisJCQkJCVdTQTg4MVhfRElHSVRBTF9TTEFWRSk7CisJCX0KKwkJd3NhODgxeF9wcmVzZW5jZV9jb3VudCsrOworCQl3c2E4ODF4X3Byb2JpbmdfY291bnQrKzsKKwkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCisJCQkJCSZzb2NfY29kZWNfZGV2X3dzYTg4MXgsCisJCQkJCSAgICAgTlVMTCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnIxOworCQlwZGF0YS0+c3RhdHVzID0gV1NBODgxWF9TVEFUVVNfSTJDOworCX0KK2VycjE6CisJd3NhODgxeF9yZXNldChwZGF0YSwgZmFsc2UpOworZXJyOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB3c2E4ODF4X3BkYXRhICp3c2E4ODF4ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlrZnJlZSh3c2E4ODF4KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB3c2E4ODF4X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwcl9kZWJ1ZygiJXM6IHN5c3RlbSBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9pMmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwcl9kZWJ1ZygiJXM6IHN5c3RlbSByZXN1bWVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdzYTg4MXhfaTJjX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh3c2E4ODF4X2kyY19zdXNwZW5kLCB3c2E4ODF4X2kyY19yZXN1bWUpCit9OworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd3NhODgxeF9pMmNfaWRbXSA9IHsKKwl7IndzYTg4MXgtaTJjLWRldiIsIFdTQTg4MVhfSTJDX1NQSzBfU0xBVkUwX0FERFJ9LAorCXsid3NhODgxeC1pMmMtZGV2IiwgV1NBODgxWF9JMkNfU1BLMF9TTEFWRTFfQUREUn0sCisJeyJ3c2E4ODF4LWkyYy1kZXYiLCBXU0E4ODFYX0kyQ19TUEsxX1NMQVZFMF9BRERSfSwKKwl7IndzYTg4MXgtaTJjLWRldiIsIFdTQTg4MVhfSTJDX1NQSzFfU0xBVkUxX0FERFJ9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd3NhODgxeF9pMmNfaWQpOworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9tYXRjaF90YWJsZVtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgtaTJjLWNvZGVjIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fbWF0Y2hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd3NhODgxeF9jb2RlY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid3NhODgxeC1pMmMtY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwkJLnBtID0gJndzYTg4MXhfaTJjX3BtX29wcywKKyNlbmRpZgorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fbWF0Y2hfdGFibGUsCisJfSwKKwkuaWRfdGFibGUgPSB3c2E4ODF4X2kyY19pZCwKKwkucHJvYmUgPSB3c2E4ODF4X2kyY19wcm9iZSwKKwkucmVtb3ZlID0gd3NhODgxeF9pMmNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd3NhODgxeF9jb2RlY19pbml0KHZvaWQpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9XU0E4ODFYX0RFVklDRTsgaSsrKQorCQl3c2FfcGRhdGFbaV0uc3RhdHVzID0gV1NBODgxWF9TVEFUVVNfUFJPQklORzsKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJndzYTg4MXhfY29kZWNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdzYTg4MXhfY29kZWNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3c2E4ODF4X2NvZGVjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmd3NhODgxeF9jb2RlY19kcml2ZXIpOworfQorCittb2R1bGVfZXhpdCh3c2E4ODF4X2NvZGVjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIldTQTg4MXggQ29kZWMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtYW5hbG9nLmggYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtYW5hbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlZjJhMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1hbmFsb2cuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1dTQTg4MVhfSAorI2RlZmluZSBfV1NBODgxWF9ICisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlICJ3c2E4ODF4LXJlZ2lzdGVycy1hbmFsb2cuaCIKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2RlZmluZSBXU0E4ODFYX0kyQ19TUEswX1NMQVZFMF9BRERSCTB4MEUKKyNkZWZpbmUgV1NBODgxWF9JMkNfU1BLMF9TTEFWRTFfQUREUgkweDQ0CisjZGVmaW5lIFdTQTg4MVhfSTJDX1NQSzFfU0xBVkUwX0FERFIJMHgwRgorI2RlZmluZSBXU0E4ODFYX0kyQ19TUEsxX1NMQVZFMV9BRERSCTB4NDUKKworI2RlZmluZSBXU0E4ODFYX0kyQ19TUEswX1NMQVZFMAkwCisjZGVmaW5lIFdTQTg4MVhfSTJDX1NQSzFfU0xBVkUwCTEKKyNkZWZpbmUgTUFYX1dTQTg4MVhfREVWSUNFIDIKKyNkZWZpbmUgV1NBODgxWF9ESUdJVEFMX1NMQVZFIDAKKyNkZWZpbmUgV1NBODgxWF9BTkFMT0dfU0xBVkUgMQorCitlbnVtIHsKKwlXU0E4ODFYXzFfWCA9IDAsCisJV1NBODgxWF8yXzAsCit9OworCisjZGVmaW5lIFdTQTg4MVhfSVNfMl8wKHZlcikgXAorCSgodmVyID09IFdTQTg4MVhfMl8wKSA/IDEgOiAwKQorCitleHRlcm4gY29uc3QgdTggd3NhODgxeF9hbmFfcmVnX3JlYWRhYmxlW1dTQTg4MVhfQ0FDSEVfU0laRV07CitleHRlcm4gc3RydWN0IHJlZ19kZWZhdWx0IHdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0c1tXU0E4ODFYX0NBQ0hFX1NJWkVdOworZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIHdzYTg4MXhfYW5hX3JlZ21hcF9jb25maWdbMl07CitpbnQgd3NhODgxeF9nZXRfY2xpZW50X2luZGV4KHZvaWQpOworaW50IHdzYTg4MXhfZ2V0X3Byb2JpbmdfY291bnQodm9pZCk7CitpbnQgd3NhODgxeF9nZXRfcHJlc2VuY2VfY291bnQodm9pZCk7CitpbnQgd3NhODgxeF9zZXRfbWNsa19jYWxsYmFjaygKKwlpbnQgKCplbmFibGVfbWNsa19jYWxsYmFjaykoc3RydWN0IHNuZF9zb2NfY2FyZCAqLCBib29sKSk7Cit2b2lkIHdzYTg4MXhfdXBkYXRlX3JlZ19kZWZhdWx0c18yXzAodm9pZCk7Cit2b2lkIHdzYTg4MXhfdXBkYXRlX3JlZ21hcF8yXzAoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgZmxhZyk7CisKKyNlbmRpZiAvKiBfV1NBODgxWF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtaXJxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmYmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1pcnEuYwpAQCAtMCwwICsxLDYxMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CisjaW5jbHVkZSA8c29jL3Fjb20vcG0uaD4KKyNpbmNsdWRlICJ3c2E4ODF4LWlycS5oIgorI2luY2x1ZGUgIndzYTg4MXgtcmVnaXN0ZXJzLWFuYWxvZy5oIgorCisjZGVmaW5lIEJZVEVfQklUX01BU0sobnIpCQkoMVVMIDw8ICgobnIpICUgQklUU19QRVJfQllURSkpCisjZGVmaW5lIEJJVF9CWVRFKG5yKQkJCSgobnIpIC8gQklUU19QRVJfQllURSkKKworCisjZGVmaW5lIFdTQV9NQVhfTlVNX0lSUVMgOAorCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEJKC0xKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmlycV90b19waHlpcnEoCisJc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcywgaW50IHZpcnEpOworc3RhdGljIGludCBwaHlpcnFfdG9fdmlycSgKKwlzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgaXJxKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3NhX2lycV9nZXRfdXBzdHJlYW1faXJxKAorCXN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMpOworc3RhdGljIHZvaWQgd3NhX2lycV9wdXRfdXBzdHJlYW1faXJxKAorCXN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMpOworc3RhdGljIGludCB3c2FfbWFwX2lycSgKKwlzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgaXJxKTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjICpwdHJfY29kZWM7CisKKy8qKgorICogd3NhX3NldF9jb2RlYygpIC0gdG8gdXBkYXRlIGNvZGVjIHBvaW50ZXIKKyAqIEBjb2RlYzogY29kZWMgcG9pbnRlci4KKyAqCisgKiBUbyB1cGRhdGUgdGhlIGNvZGVjIHBvaW50ZXIsIHdoaWNoIGlzIHVzZWQgdG8gcmVhZC93cml0ZQorICogd3NhIHJlZ2lzdGVyLgorICoKKyAqIFJldHVybjogdm9pZC4KKyAqLwordm9pZCB3c2Ffc2V0X2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoY29kZWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjb2RlYyBwb2ludGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcHRyX2NvZGVjID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlwdHJfY29kZWMgPSBjb2RlYzsKKwkvKiBJbml0aWFsaXplIGludGVycnVwdCBtYXNrIGFuZCBsZXZlbCByZWdpc3RlcnMgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXU0E4ODFYX0lOVFJfTEVWRUwsIDB4OEYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdTQTg4MVhfSU5UUl9NQVNLLCAweDhGKTsKK30KKworc3RhdGljIHZvaWQgd3NhX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzID0KKwkJCWlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCisJaWYgKHdzYV9yZXMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB3c2FfcmVzIHBvaW50ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCW11dGV4X2xvY2soJndzYV9yZXMtPmlycV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgd3NhX2lycV9zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcyA9CisJCQlpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBwb2ludGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAod3NhX3Jlcy0+Y29kZWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjb2RlYyBwb2ludGVyIG5vdCByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChwdHJfY29kZWMgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogZGlkIG5vdCByZWNlaXZlIHZhbGlkIGNvZGVjIHBvaW50ZXJcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9IGVsc2UgeworCQkJd3NhX3Jlcy0+Y29kZWMgPSBwdHJfY29kZWM7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZSBpbiB0aGUgbWFzayB3cml0ZSBpdCBiYWNrCisJICogdG8gdGhlIGhhcmR3YXJlLgorCSAqLworCWlmICh3c2FfcmVzLT5pcnFfbWFza3NfY3VyICE9CisJCQl3c2FfcmVzLT5pcnFfbWFza3NfY2FjaGUpIHsKKworCQl3c2FfcmVzLT5pcnFfbWFza3NfY2FjaGUgPQorCQkJd3NhX3Jlcy0+aXJxX21hc2tzX2N1cjsKKwkJc25kX3NvY193cml0ZSh3c2FfcmVzLT5jb2RlYywKKwkJCVdTQTg4MVhfSU5UUl9NQVNLLAorCQkJd3NhX3Jlcy0+aXJxX21hc2tzX2N1cik7CisJfQordW5sb2NrOgorCW11dGV4X3VubG9jaygmd3NhX3Jlcy0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB3c2FfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcyA9CisJCQlpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlpbnQgd3NhX2lycTsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBwb2ludGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwl3c2FfaXJxID0gdmlycV90b19waHlpcnEod3NhX3JlcywgZGF0YS0+aXJxKTsKKwlwcl9kZWJ1ZygiJXM6IHdzYV9pcnEgPSAlZFxuIiwgX19mdW5jX18sIHdzYV9pcnEpOworCXdzYV9yZXMtPmlycV9tYXNrc19jdXIgJj0KKwkJCX4oQllURV9CSVRfTUFTSyh3c2FfaXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdzYV9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcyA9CisJCQlpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlpbnQgd3NhX2lycTsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBwb2ludGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwl3c2FfaXJxID0gdmlycV90b19waHlpcnEod3NhX3JlcywgZGF0YS0+aXJxKTsKKwlwcl9kZWJ1ZygiJXM6IHdzYV9pcnEgPSAlZFxuIiwgX19mdW5jX18sIHdzYV9pcnEpOworCXdzYV9yZXMtPmlycV9tYXNrc19jdXIKKwkJCXw9IEJZVEVfQklUX01BU0sod3NhX2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIHdzYV9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpbnQgd3NhX2lycSA9IDA7CisJc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcyA9CisJCQlpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJd3NhX2lycSA9IHZpcnFfdG9fcGh5aXJxKHdzYV9yZXMsIGRhdGEtPmlycSk7CisJcHJfZGVidWcoIiVzOiBJUlFfQUNLIGNhbGxlZCBmb3IgV0NEOVhYWCBJUlE6ICVkXG4iLAorCQkJCV9fZnVuY19fLCB3c2FfaXJxKTsKK30KKworc3RhdGljIHZvaWQgd3NhX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwkvKiBkbyBub3RoaW5nIGJ1dCByZXF1aXJlZCBhcyBsaW51eCBjYWxscyBpcnFfbWFzayB3aXRob3V0IE5VTEwgY2hlY2sgKi8KK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3c2FfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAid3NhIiwKKwkuaXJxX2J1c19sb2NrID0gd3NhX2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrID0gd3NhX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2Rpc2FibGUgPSB3c2FfaXJxX2Rpc2FibGUsCisJLmlycV9lbmFibGUgPSB3c2FfaXJxX2VuYWJsZSwKKwkuaXJxX21hc2sgPSB3c2FfaXJxX21hc2ssCisJLmlycV9hY2sgPSB3c2FfaXJxX2FjaywKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3c2FfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMgPSBkYXRhOworCWludCBpOworCXU4IHN0YXR1czsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHdzYV9yZXMtPmNvZGVjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY29kZWMgcG9pbnRlciBub3QgcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18pOworCQlpZiAocHRyX2NvZGVjID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGRpZCBub3QgcmVjZWl2ZSB2YWxpZCBjb2RlYyBwb2ludGVyXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwkJd3NhX3Jlcy0+Y29kZWMgPSBwdHJfY29kZWM7CisJfQorCXN0YXR1cyA9IHNuZF9zb2NfcmVhZCh3c2FfcmVzLT5jb2RlYywgV1NBODgxWF9JTlRSX1NUQVRVUyk7CisJLyogQXBwbHkgbWFza2luZyAqLworCXN0YXR1cyAmPSB+d3NhX3Jlcy0+aXJxX21hc2tzX2N1cjsKKworCWZvciAoaSA9IDA7IGkgPCB3c2FfcmVzLT5udW1faXJxczsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiBCWVRFX0JJVF9NQVNLKGkpKSB7CisJCQltdXRleF9sb2NrKCZ3c2FfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworCQkJaGFuZGxlX25lc3RlZF9pcnEocGh5aXJxX3RvX3ZpcnEod3NhX3JlcywgaSkpOworCQkJbXV0ZXhfdW5sb2NrKCZ3c2FfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOworCQl9CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHdzYV9mcmVlX2lycSgpIC0gdG8gZnJlZSBhbiBpbnRlcnJ1cHQKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIuCisgKiBAZGF0YTogcG9pbnRlciB0byB3c2EgcmVzb3VyY2UuCisgKgorICogVG8gZnJlZSBhbHJlYWR5IHJlcXVlc3RlZCBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJuOiB2b2lkLgorICovCit2b2lkIHdzYV9mcmVlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMgPSBkYXRhOworCisJaWYgKHdzYV9yZXMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB3c2FfcmVzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlmcmVlX2lycShwaHlpcnFfdG9fdmlycSh3c2FfcmVzLCBpcnEpLCBkYXRhKTsKK30KKworLyoqCisgKiB3c2FfZW5hYmxlX2lycSgpIC0gdG8gZW5hYmxlIGFuIGludGVycnVwdAorICogQHdzYV9yZXM6IHBvaW50ZXIgdG8gd3NhIHJlc291cmNlLgorICogQGlycTogaW50ZXJydXB0IG51bWJlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIGVuYWJsZSBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJuOiB2b2lkLgorICovCit2b2lkIHdzYV9lbmFibGVfaXJxKHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMsIGludCBpcnEpCit7CisJaWYgKHdzYV9yZXMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB3c2FfcmVzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwllbmFibGVfaXJxKHBoeWlycV90b192aXJxKHdzYV9yZXMsIGlycSkpOworfQorCisvKioKKyAqIHdzYV9kaXNhYmxlX2lycSgpIC0gdG8gZGlzYWJsZSBhbiBpbnRlcnJ1cHQKKyAqIEB3c2FfcmVzOiBwb2ludGVyIHRvIHdzYSByZXNvdXJjZS4KKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIuCisgKgorICogVG8gZGlzYWJsZSBhbiBpbnRlcnJ1cHQgd2l0aG91dCB3YWl0aW5nIGZvciBleGVjdXRpbmcKKyAqIGhhbmRsZXIgdG8gY29tcGxldGUuCisgKgorICogUmV0dXJuOiB2b2lkLgorICovCit2b2lkIHdzYV9kaXNhYmxlX2lycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgaXJxKQoreworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJZGlzYWJsZV9pcnFfbm9zeW5jKHBoeWlycV90b192aXJxKHdzYV9yZXMsIGlycSkpOworfQorCisvKioKKyAqIHdzYV9kaXNhYmxlX2lycV9zeW5jKCkgLSB0byBkaXNhYmxlIGFuIGludGVycnVwdAorICogQHdzYV9yZXM6IHBvaW50ZXIgdG8gd3NhIHJlc291cmNlLgorICogQGlycTogaW50ZXJydXB0IG51bWJlci4KKyAqCisgKiBUbyBkaXNhYmxlIGFuIGludGVycnVwdCwgd2FpdCBmb3IgZXhlY3V0aW5nIElSUQorICogaGFuZGxlciB0byBjb21wbGV0ZS4KKyAqCisgKiBSZXR1cm46IHZvaWQuCisgKi8KK3ZvaWQgd3NhX2Rpc2FibGVfaXJxX3N5bmMoCisJCQlzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgaXJxKQoreworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJZGlzYWJsZV9pcnEocGh5aXJxX3RvX3ZpcnEod3NhX3JlcywgaXJxKSk7Cit9CisKK3N0YXRpYyBpbnQgd3NhX2lycV9zZXR1cF9kb3duc3RyZWFtX2lycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzKQoreworCWludCBpcnEsIHZpcnEsIHJldDsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IHdzYV9yZXMtPm51bV9pcnFzOyBpcnErKykgeworCQkvKiBNYXAgT0YgaXJxICovCisJCXZpcnEgPSB3c2FfbWFwX2lycSh3c2FfcmVzLCBpcnEpOworCQlwcl9kZWJ1ZygiJXM6IGlycSAlZCAtPiAlZFxuIiwgX19mdW5jX18sIGlycSwgdmlycSk7CisJCWlmICh2aXJxID09IE5PX0lSUSkgeworCQkJcHJfZXJyKCIlcywgTm8gaW50ZXJydXB0IHNwZWNpZmllciBmb3IgaXJxICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBpcnEpOworCQkJcmV0dXJuIE5PX0lSUTsKKwkJfQorCisJCXJldCA9IGlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIHdzYV9yZXMpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIGlycSAlZCAoJWQpXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBpcnEsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKHdzYV9yZXMtPmlycV9sZXZlbF9oaWdoW2lycV0pCisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJndzYV9pcnFfY2hpcCwKKwkJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJZWxzZQorCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZ3c2FfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKworCQlpcnFfc2V0X25lc3RlZF90aHJlYWQodmlycSwgMSk7CisJfQorCisJcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhX2lycV9pbml0KHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMpCit7CisJaW50IGksIHJldDsKKworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdXRleF9pbml0KCZ3c2FfcmVzLT5pcnFfbG9jayk7CisJbXV0ZXhfaW5pdCgmd3NhX3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKKworCXdzYV9yZXMtPmlycSA9IHdzYV9pcnFfZ2V0X3Vwc3RyZWFtX2lycSh3c2FfcmVzKTsKKwlpZiAoIXdzYV9yZXMtPmlycSkgeworCQlwcl93YXJuKCIlczogaXJxIGRyaXZlciBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCW11dGV4X2Rlc3Ryb3koJndzYV9yZXMtPmlycV9sb2NrKTsKKwkJbXV0ZXhfZGVzdHJveSgmd3NhX3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCXByX2RlYnVnKCIlczogcHJvYmVkIGlycSAlZFxuIiwgX19mdW5jX18sIHdzYV9yZXMtPmlycSk7CisKKwkvKiBTZXR1cCBkb3duc3RyZWFtIElSUXMgKi8KKwlyZXQgPSB3c2FfaXJxX3NldHVwX2Rvd25zdHJlYW1faXJxKHdzYV9yZXMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldHVwIGRvd25zdHJlYW0gSVJRXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9pcnFfaW5pdDsKKwl9CisKKwkvKiBtYXNrIGFsbCB0aGUgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCB3c2FfcmVzLT5udW1faXJxczsgaSsrKSB7CisJCXdzYV9yZXMtPmlycV9tYXNrc19jdXIgfD0gQllURV9CSVRfTUFTSyhpKTsKKwkJd3NhX3Jlcy0+aXJxX21hc2tzX2NhY2hlIHw9IEJZVEVfQklUX01BU0soaSk7CisJfQorCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod3NhX3Jlcy0+aXJxLCBOVUxMLCB3c2FfaXJxX3RocmVhZCwKKwkJCQkgICBJUlFGX1RSSUdHRVJfSElHSCB8IElSUUZfT05FU0hPVCwKKwkJCQkgICAid3NhIiwgd3NhX3Jlcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod3NhX3Jlcy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwKKwkJCXdzYV9yZXMtPmlycSwgcmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBlbmFibGVfaXJxX3dha2Uod3NhX3Jlcy0+aXJxKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih3c2FfcmVzLT5kZXYsCisJCQkJIkZhaWxlZCB0byBzZXQgd2FrZSBpbnRlcnJ1cHQgb24gSVJRICVkOiAlZFxuIiwKKwkJCQl3c2FfcmVzLT5pcnEsIHJldCk7CisJCQlmcmVlX2lycSh3c2FfcmVzLT5pcnEsIHdzYV9yZXMpOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJZ290byBmYWlsX2lycV9pbml0OworCisJcmV0dXJuIHJldDsKKworZmFpbF9pcnFfaW5pdDoKKwlkZXZfZXJyKHdzYV9yZXMtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGluaXQgd3NhIGlycVxuIiwgX19mdW5jX18pOworCXdzYV9pcnFfcHV0X3Vwc3RyZWFtX2lycSh3c2FfcmVzKTsKKwltdXRleF9kZXN0cm95KCZ3c2FfcmVzLT5pcnFfbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmd3NhX3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdzYV9yZXF1ZXN0X2lycSgpIC0gdG8gcmVxdWVzdC9yZWdpc3RlciBhbiBpbnRlcnJ1cHQKKyAqIEB3c2FfcmVzOiBwb2ludGVyIHRvIHdzYV9yZXNvdXJjZS4KKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIuCisgKiBAaGFuZGxlcjogaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAqIEBuYW1lOiBpbnRlcnJ1cHQgbmFtZS4KKyAqIEBkYXRhOiBkZXZpY2UgaW5mby4KKyAqCisgKiBDb252ZXJ0IHBoeXNpY2FsIGlycSB0byB2aXJ0dWFsIGlycSBhbmQgdGhlbgorICogcmVndWVzdCBmb3IgdGhyZWFkZWQgaGFuZGxlci4KKyAqCisgKiBSZXR1cm46IFJldHVucyBzdWNjZXNzL2ZhaWx1cmUuCisgKi8KK2ludCB3c2FfcmVxdWVzdF9pcnEoc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcywKKwkJCWludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJaW50IHZpcnE7CisKKwlpZiAod3NhX3JlcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHdzYV9yZXMgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmlycSA9IHBoeWlycV90b192aXJxKHdzYV9yZXMsIGlycSk7CisKKwkvKgorCSAqIEFSTSBuZWVkcyB1cyB0byBleHBsaWNpdGx5IGZsYWcgdGhlIElSUSBhcyB2YWxpZAorCSAqIGFuZCB3aWxsIHNldCB0aGVtIG5vcHJvYmUgd2hlbiB3ZSBkbyBzby4KKwkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BUk0pIHx8IGRlZmluZWQoQ09ORklHX0FSTTY0KQorCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCk7CisjZWxzZQorCXNldF9pcnFfbm9wcm9iZSh2aXJxKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlcXVlc3RfdGhyZWFkZWRfaXJxKHZpcnEsIE5VTEwsIGhhbmRsZXIsIElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJICAgIG5hbWUsIGRhdGEpOworfQorCisvKioKKyAqIHdzYV9pcnFfZXhpdCgpIC0gdG8gZGlzYWJsZS9jbGVhciBpbnRlcnJ1cHQvcmVzb3VyY2VzCisgKiBAd3NhX3JlczogcG9pbnRlciB0byB3c2FfcmVzb3VyY2UKKyAqCisgKiBEaXNhYmxlIGFuZCBmcmVlIHRoZSBpbnRlcnJ1cHRzIGFuZCB0aGVuIHJlbGVhc2UgcmVzb3VyY2VzLgorICoKKyAqIFJldHVybjogdm9pZC4KKyAqLwordm9pZCB3c2FfaXJxX2V4aXQoc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcykKK3sKKwlpZiAod3NhX3JlcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHdzYV9yZXMgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWRldl9kYmcod3NhX3Jlcy0+ZGV2LCAiJXM6IENsZWFuaW5nIHVwIGlycSAlZFxuIiwgX19mdW5jX18sCisJCXdzYV9yZXMtPmlycSk7CisKKwlpZiAod3NhX3Jlcy0+aXJxKSB7CisJCWRpc2FibGVfaXJxX3dha2Uod3NhX3Jlcy0+aXJxKTsKKwkJZnJlZV9pcnEod3NhX3Jlcy0+aXJxLCB3c2FfcmVzKTsKKwkJLyogUmVsZWFzZSBwYXJlbnQncyBvZiBub2RlICovCisJCXdzYV9pcnFfcHV0X3Vwc3RyZWFtX2lycSh3c2FfcmVzKTsKKwl9CisJbXV0ZXhfZGVzdHJveSgmd3NhX3Jlcy0+aXJxX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJndzYV9yZXMtPm5lc3RlZF9pcnFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcGh5aXJxX3RvX3ZpcnEoc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcywgaW50IG9mZnNldCkKK3sKKwlpZiAod3NhX3JlcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHdzYV9yZXMgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKHdzYV9yZXMtPmRvbWFpbiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCB2aXJxX3RvX3BoeWlycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX2dldF9pcnFfZGF0YSh2aXJxKTsKKworCWlmICh1bmxpa2VseSghaXJxX2RhdGEpKSB7CisJCXByX2VycigiJXM6IGlycV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBpcnFfZGF0YS0+aHdpcnE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3NhX2lycV9nZXRfdXBzdHJlYW1faXJxKHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMpCit7CisJaWYgKHdzYV9yZXMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB3c2FfcmVzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB3c2FfcmVzLT5pcnE7Cit9CisKK3N0YXRpYyB2b2lkIHdzYV9pcnFfcHV0X3Vwc3RyZWFtX2lycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzKQoreworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyogSG9sZCBwYXJlbnQncyBvZiBub2RlICovCisJb2Zfbm9kZV9wdXQod3NhX3Jlcy0+ZGV2LT5vZl9ub2RlKTsKK30KKworc3RhdGljIGludCB3c2FfbWFwX2lycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLCBpbnQgaXJxKQoreworCWlmICh3c2FfcmVzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogd3NhX3JlcyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gb2ZfaXJxX3RvX3Jlc291cmNlKHdzYV9yZXMtPmRldi0+b2Zfbm9kZSwgaXJxLCBOVUxMKTsKK30KKworc3RhdGljIGludCB3c2FfaXJxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGlycTsKKwlzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJ3c2EtaW50Iik7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENvdWxkbid0IGZpbmQgd3NhLWludCBub2RlKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBpcnEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBub2RlICVzXG4iLCBfX2Z1bmNfXywgcGRldi0+bmFtZSk7CisJd3NhX3JlcyA9IGt6YWxsb2Moc2l6ZW9mKCp3c2FfcmVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3c2FfcmVzKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qCisJICogd3NhIGludGVycnVwdCBjb250cm9sbGVyIHN1cHBvcnRzIE4gdG8gTiBpcnEgbWFwcGluZyB3aXRoCisJICogc2luZ2xlIGNlbGwgYmluZGluZyB3aXRoIGlycSBudW1iZXJzKG9mZnNldHMpIG9ubHkuCisJICogVXNlIGlycV9kb21haW5fc2ltcGxlX29wcyB0aGF0IGhhcyBpcnFfZG9tYWluX3NpbXBsZV9tYXAgYW5kCisJICogaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsLgorCSAqLworCXdzYV9yZXMtPmRldiA9ICZwZGV2LT5kZXY7CisJd3NhX3Jlcy0+ZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKHdzYV9yZXMtPmRldi0+b2Zfbm9kZSwKKwkJCVdTQV9NQVhfTlVNX0lSUVMsICZpcnFfZG9tYWluX3NpbXBsZV9vcHMsCisJCQl3c2FfcmVzKTsKKwlpZiAoIXdzYV9yZXMtPmRvbWFpbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZG9tYWluIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCXdzYV9yZXMtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogdmlycSA9ICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKKwl3c2FfcmVzLT5pcnEgPSBpcnE7CisJd3NhX3Jlcy0+bnVtX2lycV9yZWdzID0gMTsKKwl3c2FfcmVzLT5udW1faXJxcyA9IFdTQV9OVU1fSVJRUzsKKwlyZXQgPSB3c2FfaXJxX2luaXQod3NhX3Jlcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBkbyBpcnEgaW5pdCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHJldDsKK2VycjoKKwlrZnJlZSh3c2FfcmVzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYV9pcnFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3Qgd3NhX3Jlc291cmNlICpkYXRhOworCisJZG9tYWluID0gaXJxX2ZpbmRfaG9zdChwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKHVubGlrZWx5KCFkb21haW4pKSB7CisJCXByX2VycigiJXM6IGRvbWFpbiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYXRhID0gKHN0cnVjdCB3c2FfcmVzb3VyY2UgKilkb21haW4tPmhvc3RfZGF0YTsKKwlkYXRhLT5pcnEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHdzYS1pcnEiIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3c2FfaXJxX2RyaXZlciA9IHsKKwkucHJvYmUgPSB3c2FfaXJxX3Byb2JlLAorCS5yZW1vdmUgPSB3c2FfaXJxX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3c2FfaW50YyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2ZfbWF0Y2gpLAorCX0sCit9OworCitzdGF0aWMgaW50IHdzYV9pcnFfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3c2FfaXJxX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwod3NhX2lycV9kcnZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIHdzYV9pcnFfZHJ2X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd3NhX2lycV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod3NhX2lycV9kcnZfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiV1NBODgxeCBJUlEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtaXJxLmggYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwZWI5MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1pcnEuaApAQCAtMCwwICsxLDgyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19XU0E4ODFYX0lSUV9IX18KKyNkZWZpbmUgX19XU0E4ODFYX0lSUV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisvKioKKyAqIGVudW0gd3NhX2ludGVycnVwdHMgLSB3c2EgaW50ZXJydXB0IG51bWJlcgorICogQFdTQV9JTlRfU0FGMldBUjoJVGVtcCBpcnEgaW50ZXJydXB0LCBmcm9tIHNhZmUgc3RhdGUgdG8gd2FybmluZyBzdGF0ZS4KKyAqIEBXU0FfSU5UX1dBUjJTQUY6CVRlbXAgaXJxIGludGVycnVwdCwgZnJvbSB3YXJuaW5nIHN0YXRlIHRvIHNhZmUgc3RhdGUuCisgKiBAV1NBX0lOVF9ESVNBQkxFOglEaXNhYmxlIFRlbXAgc2Vuc29yIGludGVycnVwdHMuCisgKiBAV1NBX0lOVF9PQ1A6CU9DUCBpbnRlcnJ1cHQuCisgKiBAV1NBX0lOVF9DTElQOglDTElQIGRldGVjdCBpbnRlcnJ1cHQuCisgKiBAV1NBX05VTV9JUlFTOglNQVggSW50ZXJydXB0IG51bWJlci4KKyAqCisgKiBXU0EgSVJRIEludGVycnVwdCBudW1iZXJzLgorICovCitlbnVtIHdzYV9pbnRlcnJ1cHRzIHsKKwlXU0FfSU5UX1NBRjJXQVIgPSAwLAorCVdTQV9JTlRfV0FSMlNBRiwKKwlXU0FfSU5UX0RJU0FCTEUsCisJV1NBX0lOVF9PQ1AsCisJV1NBX0lOVF9DTElQLAorCVdTQV9OVU1fSVJRUywKK307CisKKy8qKgorICogc3RydWN0IHdzYV9yZXNvdXJjZSAtIHRoZSBiYXNpYyB3c2FfcmVzb3VyY2Ugc3RydWN0dXJlCisgKiBAaXJxX2xvY2s6CWxvY2sgdXNlZCBieSBpcnFfY2hpcCBmdW5jdGlvbnMuCisgKiBAbmVzdGVkX2lycV9sb2NrOiBsb2NrIHVzZWQgd2hpbGUgaGFuZGxpbmcgbmVzdGVkIGludGVycnVwdHMuCisgKiBAaXJxOglpbnRlcnJ1cHQgbnVtYmVyLgorICogQGlycV9tYXNrc19jdXI6IGN1cnJlbnQgbWFzayB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIG1hc2sgcmVnaXN0ZXJzLgorICogQGlycV9tYXNrc19jYWNoZTogY2FjaGVkIG1hc2sgdmFsdWUuCisgKiBAbnVtX2lycXM6IG51bWJlciBvZiBzdXBwb3J0ZWQgaW50ZXJydXB0cy4KKyAqIEBudW1faXJxX3JlZ3M6IG51bWJlciBvZiBpcnEgcmVnaXN0ZXJzLgorICogQHBhcmVudDoJcGFyZW50IHBvaW50ZXIuCisgKiBAZGV2OglkZXZpY2UgcG9pbnRlci4KKyAqIEBkb21haW46CWlycSBkb21haW4gcG9pbnRlci4KKyAqIGNvZGVjOgljb2RlYyBwb2ludGVyLgorICoKKyAqIENvbnRhaW5zIHJlcXVpcmVkIG1lbWJlcnMgdXNlZCBpbiB3c2EgaXJxIGRyaXZlci4KKyAqLworCitzdHJ1Y3Qgd3NhX3Jlc291cmNlIHsKKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJc3RydWN0IG11dGV4IG5lc3RlZF9pcnFfbG9jazsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXU4IGlycV9tYXNrc19jdXI7CisJdTggaXJxX21hc2tzX2NhY2hlOworCWJvb2wgaXJxX2xldmVsX2hpZ2hbOF07CisJaW50IG51bV9pcnFzOworCWludCBudW1faXJxX3JlZ3M7CisJdm9pZCAqcGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKK307CisKK3ZvaWQgd3NhX3NldF9jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCB3c2FfZnJlZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSk7Cit2b2lkIHdzYV9lbmFibGVfaXJxKHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMsIGludCBpcnEpOwordm9pZCB3c2FfZGlzYWJsZV9pcnEoc3RydWN0IHdzYV9yZXNvdXJjZSAqd3NhX3JlcywgaW50IGlycSk7Cit2b2lkIHdzYV9kaXNhYmxlX2lycV9zeW5jKHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMsIGludCBpcnEpOworaW50IHdzYV9yZXF1ZXN0X2lycShzdHJ1Y3Qgd3NhX3Jlc291cmNlICp3c2FfcmVzLAorCQkJaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSk7CisKK3ZvaWQgd3NhX2lycV9leGl0KHN0cnVjdCB3c2FfcmVzb3VyY2UgKndzYV9yZXMpOworCisjZW5kaWYgLyogX19XU0E4ODFYX0lSUV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdpc3RlcnMtYW5hbG9nLmggYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnaXN0ZXJzLWFuYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZWJmOGUxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXJlZ2lzdGVycy1hbmFsb2cuaApAQCAtMCwwICsxLDIwNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIFdTQTg4MVhfUkVHSVNURVJTX0gKKyNkZWZpbmUgV1NBODgxWF9SRUdJU1RFUlNfSAorCisjZGVmaW5lIFdTQTg4MVhfRElHSVRBTF9CQVNFCTB4MDAwMAorI2RlZmluZSBXU0E4ODFYX0FOQUxPR19CQVNFCTB4MDEwMAorCisjZGVmaW5lIFdTQTg4MVhfQ0hJUF9JRDAgICAgICAgICAgICAgICAgICAgICAgICAoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDAwKQorI2RlZmluZSBXU0E4ODFYX0NISVBfSUQxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwMSkKKyNkZWZpbmUgV1NBODgxWF9DSElQX0lEMgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDIpCisjZGVmaW5lIFdTQTg4MVhfQ0hJUF9JRDMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDAzKQorI2RlZmluZSBXU0E4ODFYX0JVU19JRAkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA0KQorI2RlZmluZSBXU0E4ODFYX0NEQ19SU1RfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwNSkKKyNkZWZpbmUgV1NBODgxWF9DRENfVE9QX0NMS19DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA2KQorI2RlZmluZSBXU0E4ODFYX0NEQ19BTkFfQ0xLX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDcpCisjZGVmaW5lIFdTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwOCkKKyNkZWZpbmUgV1NBODgxWF9DTE9DS19DT05GSUcJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA5KQorI2RlZmluZSBXU0E4ODFYX0FOQV9DVEwJCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwQSkKKyNkZWZpbmUgV1NBODgxWF9TV1JfUkVTRVRfRU4JCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDBCKQorI2RlZmluZSBXU0E4ODFYX1JFU0VUX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMEMpCisjZGVmaW5lIFdTQTg4MVhfVEFEQ19WQUxVRV9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDBGKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfREVURUNUX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTApCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9NU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDExKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfTFNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxMikKKyNkZWZpbmUgV1NBODgxWF9URU1QX0NPTkZJRzAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDEzKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfQ09ORklHMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTQpCisjZGVmaW5lIFdTQTg4MVhfQ0RDX0NMSVBfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxNSkKKyNkZWZpbmUgV1NBODgxWF9TRE1fUERNOV9MU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE2KQorI2RlZmluZSBXU0E4ODFYX1NETV9QRE05X01TQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTcpCisjZGVmaW5lIFdTQTg4MVhfQ0RDX1JYX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTgpCisjZGVmaW5lIFdTQTg4MVhfREVNX0JZUEFTU19EQVRBMAkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxOSkKKyNkZWZpbmUgV1NBODgxWF9ERU1fQllQQVNTX0RBVEExCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFBKQorI2RlZmluZSBXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTIJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUIpCisjZGVmaW5lIFdTQTg4MVhfREVNX0JZUEFTU19EQVRBMwkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxQykKKyNkZWZpbmUgV1NBODgxWF9PVFBfQ1RSTDAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFEKQorI2RlZmluZSBXU0E4ODFYX09UUF9DVFJMMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUUpCisjZGVmaW5lIFdTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDEJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUYpCisjZGVmaW5lIFdTQTg4MVhfSU5UUl9NT0RFCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyMCkKKyNkZWZpbmUgV1NBODgxWF9JTlRSX01BU0sJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDIxKQorI2RlZmluZSBXU0E4ODFYX0lOVFJfU1RBVFVTCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyMikKKyNkZWZpbmUgV1NBODgxWF9JTlRSX0NMRUFSCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyMykKKyNkZWZpbmUgV1NBODgxWF9JTlRSX0xFVkVMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyNCkKKyNkZWZpbmUgV1NBODgxWF9JTlRSX1NFVAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjUpCisjZGVmaW5lIFdTQTg4MVhfSU5UUl9URVNUCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyNikKKyNkZWZpbmUgV1NBODgxWF9QRE1fVEVTVF9NT0RFCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzMCkKKyNkZWZpbmUgV1NBODgxWF9BVEVfVEVTVF9NT0RFCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzMSkKKyNkZWZpbmUgV1NBODgxWF9QSU5fQ1RMX01PREUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDMyKQorI2RlZmluZSBXU0E4ODFYX1BJTl9DVExfT0UJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDMzKQorI2RlZmluZSBXU0E4ODFYX1BJTl9XREFUQV9JT1BBRAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzQpCisjZGVmaW5lIFdTQTg4MVhfUElOX1NUQVRVUwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzUpCisjZGVmaW5lIFdTQTg4MVhfRElHX0RFQlVHX01PREUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDM3KQorI2RlZmluZSBXU0E4ODFYX0RJR19ERUJVR19TRUwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDM4KQorI2RlZmluZSBXU0E4ODFYX0RJR19ERUJVR19FTgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzkpCisjZGVmaW5lIFdTQTg4MVhfU1dSX0hNX1RFU1QxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzQikKKyNkZWZpbmUgV1NBODgxWF9TV1JfSE1fVEVTVDIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDNDKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfREVURUNUX0RCR19DVEwJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwM0QpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9ERUJVR19NU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDNFKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfREVCVUdfTFNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzRikKKyNkZWZpbmUgV1NBODgxWF9TQU1QTEVfRURHRV9TRUwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDQ0KQorI2RlZmluZSBXU0E4ODFYX0lPUEFEX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwNDUpCisjZGVmaW5lIFdTQTg4MVhfU1BBUkVfMAkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDUwKQorI2RlZmluZSBXU0E4ODFYX1NQQVJFXzEJCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA1MSkKKyNkZWZpbmUgV1NBODgxWF9TUEFSRV8yCQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwNTIpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18wCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4MCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDgxKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODIpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18zCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4MykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg0KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfNQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODUpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR182CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4NikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzcJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg3KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfOAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODgpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR185CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4OSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzEwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4QSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzExCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4QikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzEyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4QykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzEzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4RCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE0CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4RSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE1CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4RikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE2CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5MCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE3CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5MSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE4CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5MikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzE5CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5MykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzIwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5NCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzIxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5NSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzIyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5NikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzIzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5NykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI0CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5OCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI1CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5OSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI2CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5QSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI3CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5QikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI4CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5QykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzI5CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5RCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzMwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5RSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzMxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA5RikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzMyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBMCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzMzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBMSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM0CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBMikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM1CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBMykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM2CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBNCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM3CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBNSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM4CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBNikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzM5CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBNykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBOCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBOSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBQSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBQikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ0CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBQykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ1CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBRCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ2CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBRSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ3CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBBRikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ4CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCMCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzQ5CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCMSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzUwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCMikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzUxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCMykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzUyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCNCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzUzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCNSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU0CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCNikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU1CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCNykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU2CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCOCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU3CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCOSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU4CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCQSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzU5CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCQikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzYwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCQykKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzYxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCRCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzYyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCRSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzYzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDBCRikKKy8qIEFuYWxvZyBSZWdpc3RlciBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIFdTQTg4MVhfQklBU19SRUZfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwMCkKKyNkZWZpbmUgV1NBODgxWF9CSUFTX1RFU1QJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDEpCisjZGVmaW5lIFdTQTg4MVhfQklBU19CSUFTCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDAyKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfT1AJCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDAzKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfSVJFRl9DVFJMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDA0KQorI2RlZmluZSBXU0E4ODFYX1RFTVBfSVNFTlNfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNSkKKyNkZWZpbmUgV1NBODgxWF9URU1QX0NMS19DVFJMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDA2KQorI2RlZmluZSBXU0E4ODFYX1RFTVBfVEVTVAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNykKKyNkZWZpbmUgV1NBODgxWF9URU1QX0JJQVMJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDgpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9BRENfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwOSkKKyNkZWZpbmUgV1NBODgxWF9URU1QX0RPVVRfTVNCCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDBBKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfRE9VVF9MU0IJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMEIpCisjZGVmaW5lIFdTQTg4MVhfQURDX0VOX01PRFVfVgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxMCkKKyNkZWZpbmUgV1NBODgxWF9BRENfRU5fTU9EVV9JCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDExKQorI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9WCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMTIpCisjZGVmaW5lIFdTQTg4MVhfQURDX0VOX0RFVF9URVNUX0kJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxMykKKyNkZWZpbmUgV1NBODgxWF9BRENfU0VMX0lCSUFTCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDE0KQorI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9TRUxfSUJJQVMJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxNSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9FTgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxQSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9HQUlOCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDFCKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfREFDX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxQykKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9EQkcJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMUQpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QV1JTVEdfREJHCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDFFKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfT0NQX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxRikKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0NMSVBfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDIwKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfQkJNX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX01JU0NfQ1RMMQkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMikKKyNkZWZpbmUgV1NBODgxWF9TUEtSX01JU0NfQ1RMMgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMykKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0JJQVNfSU5UCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI0KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUEFfSU5UCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI1KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfQklBU19DQUwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjYpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9CSUFTX1BTUlIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjcpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9TVEFUVVMxCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI4KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfU1RBVFVTMgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyOSkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9FTl9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMkEpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfQ1VSUkVOVF9MSU1JVAkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJCKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX1BTX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyQykKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJEKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMkUpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfRk9SQ0VfT1VUCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJGKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX0xET19QUk9HCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDMwKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzMSkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9ST05fQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDMyKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX0xPT1BfU1RBQklMSVRZCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzMpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfWlhfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM0KQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzNSkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9NSVNDMV9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzYpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfTUlTQzJfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM3KQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX01JU0MzX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzOCkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9BVEVTVF9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzkpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4JCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzQSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfQ01fTERPX1NFVAkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDNCKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9GRV9JU0VOU0VfQklBU19TRVQxCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzQykKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMgkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwM0QpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0FURVNUMQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDNFKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzRikKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQwKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfQklBU19TRVQxCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDA0MSkKKyNkZWZpbmUgV1NBODgxWF9CT05HT19SRVNSVl9SRUcxCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwNDIpCisjZGVmaW5lIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMgkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQzKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9TQVIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwNDQpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9TVEFUVVMzCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQ1KQorCisjZGVmaW5lIFdTQTg4MVhfTlVNX1JFR0lTVEVSUwkJKFdTQTg4MVhfU1BLUl9TVEFUVVMzKzEpCisjZGVmaW5lIFdTQTg4MVhfTUFYX1JFR0lTVEVSCQkoV1NBODgxWF9OVU1fUkVHSVNURVJTLTEpCisjZGVmaW5lIFdTQTg4MVhfQ0FDSEVfU0laRQkJV1NBODgxWF9OVU1fUkVHSVNURVJTCisjZW5kaWYgLyogV1NBODgxWF9SRUdJU1RFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXJlZ2lzdGVycy5oIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXJlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWE1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnaXN0ZXJzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBXU0E4ODFYX1JFR0lTVEVSU19ICisjZGVmaW5lIFdTQTg4MVhfUkVHSVNURVJTX0gKKworI2RlZmluZSBXU0E4ODFYX0RJR0lUQUxfQkFTRQkJMHgzMDAwCisjZGVmaW5lIFdTQTg4MVhfQU5BTE9HX0JBU0UJCTB4MzEwMAorCisvKiBEaWdpdGFsIHJlZ2lzdGVyIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgV1NBODgxWF9DSElQX0lEMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDApCisjZGVmaW5lIFdTQTg4MVhfQ0hJUF9JRDEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDAxKQorI2RlZmluZSBXU0E4ODFYX0NISVBfSUQyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwMikKKyNkZWZpbmUgV1NBODgxWF9DSElQX0lEMwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDMpCisjZGVmaW5lIFdTQTg4MVhfQlVTX0lECQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDQpCisjZGVmaW5lIFdTQTg4MVhfQ0RDX1JTVF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA1KQorI2RlZmluZSBXU0E4ODFYX0NEQ19UT1BfQ0xLX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDYpCisjZGVmaW5lIFdTQTg4MVhfQ0RDX0FOQV9DTEtfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwNykKKyNkZWZpbmUgV1NBODgxWF9DRENfRElHX0NMS19DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA4KQorI2RlZmluZSBXU0E4ODFYX0NMT0NLX0NPTkZJRwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDkpCisjZGVmaW5lIFdTQTg4MVhfQU5BX0NUTAkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDBBKQorI2RlZmluZSBXU0E4ODFYX1NXUl9SRVNFVF9FTgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMEIpCisjZGVmaW5lIFdTQTg4MVhfUkVTRVRfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwQykKKyNkZWZpbmUgV1NBODgxWF9UQURDX1ZBTFVFX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMEYpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxMCkKKyNkZWZpbmUgV1NBODgxWF9URU1QX01TQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTEpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9MU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDEyKQorI2RlZmluZSBXU0E4ODFYX1RFTVBfQ09ORklHMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTMpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9DT05GSUcxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxNCkKKyNkZWZpbmUgV1NBODgxWF9DRENfQ0xJUF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE1KQorI2RlZmluZSBXU0E4ODFYX1NETV9QRE05X0xTQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTYpCisjZGVmaW5lIFdTQTg4MVhfU0RNX1BETTlfTVNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxNykKKyNkZWZpbmUgV1NBODgxWF9DRENfUlhfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxOCkKKyNkZWZpbmUgV1NBODgxWF9ERU1fQllQQVNTX0RBVEEwCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE5KQorI2RlZmluZSBXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTEJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUEpCisjZGVmaW5lIFdTQTg4MVhfREVNX0JZUEFTU19EQVRBMgkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxQikKKyNkZWZpbmUgV1NBODgxWF9ERU1fQllQQVNTX0RBVEEzCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFDKQorI2RlZmluZSBXU0E4ODFYX09UUF9DVFJMMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUQpCisjZGVmaW5lIFdTQTg4MVhfT1RQX0NUUkwxCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxRSkKKyNkZWZpbmUgV1NBODgxWF9IRFJJVkVfQ1RMX0dST1VQMQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxRikKKyNkZWZpbmUgV1NBODgxWF9JTlRSX01PREUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDIwKQorI2RlZmluZSBXU0E4ODFYX0lOVFJfTUFTSwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjEpCisjZGVmaW5lIFdTQTg4MVhfSU5UUl9TVEFUVVMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDIyKQorI2RlZmluZSBXU0E4ODFYX0lOVFJfQ0xFQVIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDIzKQorI2RlZmluZSBXU0E4ODFYX0lOVFJfTEVWRUwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDI0KQorI2RlZmluZSBXU0E4ODFYX0lOVFJfU0VUCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyNSkKKyNkZWZpbmUgV1NBODgxWF9JTlRSX1RFU1QJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDI2KQorI2RlZmluZSBXU0E4ODFYX1BETV9URVNUX01PREUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDMwKQorI2RlZmluZSBXU0E4ODFYX0FURV9URVNUX01PREUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDMxKQorI2RlZmluZSBXU0E4ODFYX1BJTl9DVExfTU9ERQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzIpCisjZGVmaW5lIFdTQTg4MVhfUElOX0NUTF9PRQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzMpCisjZGVmaW5lIFdTQTg4MVhfUElOX1dEQVRBX0lPUEFECQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzNCkKKyNkZWZpbmUgV1NBODgxWF9QSU5fU1RBVFVTCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzNSkKKyNkZWZpbmUgV1NBODgxWF9ESUdfREVCVUdfTU9ERQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzcpCisjZGVmaW5lIFdTQTg4MVhfRElHX0RFQlVHX1NFTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzgpCisjZGVmaW5lIFdTQTg4MVhfRElHX0RFQlVHX0VOCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzOSkKKyNkZWZpbmUgV1NBODgxWF9TV1JfSE1fVEVTVDEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDNCKQorI2RlZmluZSBXU0E4ODFYX1NXUl9ITV9URVNUMgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwM0MpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9ERVRFQ1RfREJHX0NUTAkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzRCkKKyNkZWZpbmUgV1NBODgxWF9URU1QX0RFQlVHX01TQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwM0UpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9ERUJVR19MU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDNGKQorI2RlZmluZSBXU0E4ODFYX1NBTVBMRV9FREdFX1NFTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwNDQpCisjZGVmaW5lIFdTQTg4MVhfSU9QQURfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA0NSkKKyNkZWZpbmUgV1NBODgxWF9TUEFSRV8wCQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwNTApCisjZGVmaW5lIFdTQTg4MVhfU1BBUkVfMQkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDUxKQorI2RlZmluZSBXU0E4ODFYX1NQQVJFXzIJCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA1MikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDgwKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODEpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4MikKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDgzKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfNAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODQpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR181CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4NSkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzYJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg2KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfNwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODcpCisjZGVmaW5lIFdTQTg4MVhfT1RQX1JFR184CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4OCkKKyNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg5KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhBKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhCKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhDKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhEKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTQJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhFKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDhGKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTYJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDkwKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTcJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDkxKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTgJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDkyKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMTkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDkzKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk0KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk1KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk2KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk3KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjQJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk4KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDk5KQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjYJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlBKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjcJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlCKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjgJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlDKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMjkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlEKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMzAJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlFKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMzEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDlGKQorI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfNjMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMEJGKQorCisvKiBBbmFsb2cgUmVnaXN0ZXIgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBXU0E4ODFYX0JJQVNfUkVGX0NUUkwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDApCisjZGVmaW5lIFdTQTg4MVhfQklBU19URVNUCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDAxKQorI2RlZmluZSBXU0E4ODFYX0JJQVNfQklBUwkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwMikKKyNkZWZpbmUgV1NBODgxWF9URU1QX09QCQkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwMykKKyNkZWZpbmUgV1NBODgxWF9URU1QX0lSRUZfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNCkKKyNkZWZpbmUgV1NBODgxWF9URU1QX0lTRU5TX0NUUkwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDUpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9DTEtfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNikKKyNkZWZpbmUgV1NBODgxWF9URU1QX1RFU1QJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDcpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9CSUFTCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDA4KQorI2RlZmluZSBXU0E4ODFYX1RFTVBfQURDX0NUUkwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDkpCisjZGVmaW5lIFdTQTg4MVhfVEVNUF9ET1VUX01TQgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwQSkKKyNkZWZpbmUgV1NBODgxWF9URU1QX0RPVVRfTFNCCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDBCKQorI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9NT0RVX1YJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMTApCisjZGVmaW5lIFdTQTg4MVhfQURDX0VOX01PRFVfSQkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxMSkKKyNkZWZpbmUgV1NBODgxWF9BRENfRU5fREVUX1RFU1RfVgkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDEyKQorI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMTMpCisjZGVmaW5lIFdTQTg4MVhfQURDX1NFTF9JQklBUwkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxNCkKKyNkZWZpbmUgV1NBODgxWF9BRENfRU5fU0VMX0lCQUlTCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMTUpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9EUlZfRU4JCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMUEpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9EUlZfR0FJTgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxQikKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0RBQ19DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMUMpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9EUlZfREJHCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDFEKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFdSU1RHX0RCRwkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxRSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX09DUF9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMUYpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9DTElQX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMCkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0JCTV9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjEpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9NSVNDX0NUTDEJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjIpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9NSVNDX0NUTDIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjMpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9CSUFTX0lOVAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyNCkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BBX0lOVAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyNSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX0JJQVNfQ0FMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI2KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfQklBU19QU1JSCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI3KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfU1RBVFVTMQkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyOCkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1NUQVRVUzIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjkpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfRU5fQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJBKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVQJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyQikKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9QU19DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMkMpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDEJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyRCkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMgkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJFKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX0ZPUkNFX09VVAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyRikKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9MRE9fUFJPRwkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzMCkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9TTE9QRV9DT01QX0lTRU5TRV9GQgkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzEpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfUk9OX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzMikKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDMzKQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX1pYX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzNCkKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9TVEFSVF9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzUpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfTUlTQzFfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM2KQorI2RlZmluZSBXU0E4ODFYX0JPT1NUX01JU0MyX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzNykKKyNkZWZpbmUgV1NBODgxWF9CT09TVF9NSVNDM19DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzgpCisjZGVmaW5lIFdTQTg4MVhfQk9PU1RfQVRFU1RfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM5KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9GRV9HQUlOCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwM0EpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0NNX0xET19TRVQJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzQikKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwM0MpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0lTRU5TRV9CSUFTX1NFVDIJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDNEKQorI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDEJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzRSkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwM0YpCisjZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ00JCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDA0MCkKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX0JJQVNfU0VUMQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwNDEpCisjZGVmaW5lIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQyKQorI2RlZmluZSBXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzIJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDA0MykKKyNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfU0FSCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQ0KQorI2RlZmluZSBXU0E4ODFYX1NQS1JfU1RBVFVTMwkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDA0NSkKKworI2RlZmluZSBXU0E4ODFYX05VTV9SRUdJU1RFUlMJCQkoV1NBODgxWF9TUEtSX1NUQVRVUzMrMSkKKyNkZWZpbmUgV1NBODgxWF9NQVhfUkVHSVNURVIJCQkoV1NBODgxWF9OVU1fUkVHSVNURVJTLTEpCisjZGVmaW5lIFdTQTg4MVhfQ0FDSEVfU0laRQkJCVdTQTg4MVhfTlVNX1JFR0lTVEVSUworCisjZW5kaWYgLyogV1NBODgxWF9SRUdJU1RFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXJlZ21hcC1hbmFsb2cuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdtYXAtYW5hbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjM2M5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdtYXAtYW5hbG9nLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAid3NhODgxeC1yZWdpc3RlcnMtYW5hbG9nLmgiCisjaW5jbHVkZSAid3NhODgxeC1hbmFsb2cuaCIKKworc3RydWN0IHJlZ19kZWZhdWx0IHdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0c1tdID0geworCXtXU0E4ODFYX0NISVBfSUQwLCAweDAwfSwKKwl7V1NBODgxWF9DSElQX0lEMSwgMHgwMH0sCisJe1dTQTg4MVhfQ0hJUF9JRDIsIDB4MDB9LAorCXtXU0E4ODFYX0NISVBfSUQzLCAweDAyfSwKKwl7V1NBODgxWF9CVVNfSUQsIDB4MDB9LAorCXtXU0E4ODFYX0NEQ19SU1RfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DRENfVE9QX0NMS19DVEwsIDB4MDN9LAorCXtXU0E4ODFYX0NEQ19BTkFfQ0xLX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DTE9DS19DT05GSUcsIDB4MDB9LAorCXtXU0E4ODFYX0FOQV9DVEwsIDB4MDh9LAorCXtXU0E4ODFYX1NXUl9SRVNFVF9FTiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMLCAweDAxfSwKKwl7V1NBODgxWF9URU1QX01TQiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9MU0IsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfQ09ORklHMCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9DT05GSUcxLCAweDAwfSwKKwl7V1NBODgxWF9DRENfQ0xJUF9DVEwsIDB4MDN9LAorCXtXU0E4ODFYX1NETV9QRE05X0xTQiwgMHgwMH0sCisJe1dTQTg4MVhfU0RNX1BETTlfTVNCLCAweDAwfSwKKwl7V1NBODgxWF9DRENfUlhfQ1RMLCAweDdFfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEwLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEExLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEyLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEzLCAweDAwfSwKKwl7V1NBODgxWF9PVFBfQ1RSTDAsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9DVFJMMSwgMHgwMH0sCisJe1dTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDEsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9NQVNLLCAweDFGfSwKKwl7V1NBODgxWF9JTlRSX1NUQVRVUywgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9DTEVBUiwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9MRVZFTCwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9TRVQsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfVEVTVCwgMHgwMH0sCisJe1dTQTg4MVhfUERNX1RFU1RfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfQVRFX1RFU1RfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfUElOX0NUTF9NT0RFLCAweDAwfSwKKwl7V1NBODgxWF9QSU5fQ1RMX09FLCAweDAwfSwKKwl7V1NBODgxWF9QSU5fV0RBVEFfSU9QQUQsIDB4MDB9LAorCXtXU0E4ODFYX1BJTl9TVEFUVVMsIDB4MDB9LAorCXtXU0E4ODFYX0RJR19ERUJVR19NT0RFLCAweDAwfSwKKwl7V1NBODgxWF9ESUdfREVCVUdfU0VMLCAweDAwfSwKKwl7V1NBODgxWF9ESUdfREVCVUdfRU4sIDB4MDB9LAorCXtXU0E4ODFYX1NXUl9ITV9URVNUMSwgMHgwOH0sCisJe1dTQTg4MVhfU1dSX0hNX1RFU1QyLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RFVEVDVF9EQkdfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RFQlVHX01TQiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERUJVR19MU0IsIDB4MDB9LAorCXtXU0E4ODFYX1NBTVBMRV9FREdFX1NFTCwgMHgwQ30sCisJe1dTQTg4MVhfU1BBUkVfMCwgMHgwMH0sCisJe1dTQTg4MVhfU1BBUkVfMSwgMHgwMH0sCisJe1dTQTg4MVhfU1BBUkVfMiwgMHgwMH0sCisJe1dTQTg4MVhfT1RQX1JFR18wLCAweDAxfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfMiwgMHhDMH0sCisJe1dTQTg4MVhfT1RQX1JFR18zLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzQsIDB4QzB9LAorCXtXU0E4ODFYX09UUF9SRUdfNSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR182LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzcsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfOCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR185LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzExLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEyLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEzLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE0LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE1LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE2LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE3LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE4LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE5LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIxLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIyLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIzLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI0LCAweDAzfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI1LCAweDAxfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI2LCAweDAzfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI3LCAweDExfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI4LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI5LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMxLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzYzLCAweDQwfSwKKwkvKiBXU0E4ODF4IEFuYWxvZyByZWdpc3RlcnMgKi8KKwl7V1NBODgxWF9CSUFTX1JFRl9DVFJMLCAweDZDfSwKKwl7V1NBODgxWF9CSUFTX1RFU1QsIDB4MTZ9LAorCXtXU0E4ODFYX0JJQVNfQklBUywgMHhGMH0sCisJe1dTQTg4MVhfVEVNUF9PUCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9JUkVGX0NUUkwsIDB4NTZ9LAorCXtXU0E4ODFYX1RFTVBfSVNFTlNfQ1RSTCwgMHg0N30sCisJe1dTQTg4MVhfVEVNUF9DTEtfQ1RSTCwgMHg4N30sCisJe1dTQTg4MVhfVEVNUF9URVNULCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0JJQVMsIDB4NTF9LAorCXtXU0E4ODFYX1RFTVBfQURDX0NUUkwsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfRE9VVF9NU0IsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfRE9VVF9MU0IsIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9NT0RVX1YsIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9NT0RVX0ksIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9WLCAweDAwfSwKKwl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfSSwgMHgwMH0sCisJe1dTQTg4MVhfQURDX1NFTF9JQklBUywgMHgyNX0sCisJe1dTQTg4MVhfQURDX0VOX1NFTF9JQklBUywgMHgxMH0sCisJe1dTQTg4MVhfU1BLUl9EUlZfRU4sIDB4NzR9LAorCXtXU0E4ODFYX1NQS1JfRFJWX0dBSU4sIDB4MDF9LAorCXtXU0E4ODFYX1NQS1JfREFDX0NUTCwgMHg0MH0sCisJe1dTQTg4MVhfU1BLUl9EUlZfREJHLCAweDE1fSwKKwl7V1NBODgxWF9TUEtSX1BXUlNUR19EQkcsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhENH0sCisJe1dTQTg4MVhfU1BLUl9DTElQX0NUTCwgMHg5MH0sCisJe1dTQTg4MVhfU1BLUl9CQk1fQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMSwgMHg4MH0sCisJe1dTQTg4MVhfU1BLUl9NSVNDX0NUTDIsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfQklBU19JTlQsIDB4NTZ9LAorCXtXU0E4ODFYX1NQS1JfUEFfSU5ULCAweDU0fSwKKwl7V1NBODgxWF9TUEtSX0JJQVNfQ0FMLCAweEFDfSwKKwl7V1NBODgxWF9TUEtSX0JJQVNfUFNSUiwgMHg1NH0sCisJe1dTQTg4MVhfU1BLUl9TVEFUVVMxLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1NUQVRVUzIsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHgxOH0sCisJe1dTQTg4MVhfQk9PU1RfQ1VSUkVOVF9MSU1JVCwgMHg3QX0sCisJe1dTQTg4MVhfQk9PU1RfUFNfQ1RMLCAweEMwfSwKKwl7V1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSwgMHg3N30sCisJe1dTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDIsIDB4NzB9LAorCXtXU0E4ODFYX0JPT1NUX0ZPUkNFX09VVCwgMHgwRX0sCisJe1dTQTg4MVhfQk9PU1RfTERPX1BST0csIDB4MTZ9LAorCXtXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCLCAweDcxfSwKKwl7V1NBODgxWF9CT09TVF9ST05fQ1RMLCAweDBGfSwKKwl7V1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWSwgMHhBRH0sCisJe1dTQTg4MVhfQk9PU1RfWlhfQ1RMLCAweDM0fSwKKwl7V1NBODgxWF9CT09TVF9TVEFSVF9DVEwsIDB4MjN9LAorCXtXU0E4ODFYX0JPT1NUX01JU0MxX0NUTCwgMHg4MH0sCisJe1dTQTg4MVhfQk9PU1RfTUlTQzJfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9CT09TVF9NSVNDM19DVEwsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX0FURVNUX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sIDB4NDZ9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9DTV9MRE9fU0VULCAweDNCfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMSwgMHg4RH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0lTRU5TRV9CSUFTX1NFVDIsIDB4OER9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDEsIDB4MDF9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLCAweDhEfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX0JJQVNfU0VUMSwgMHg0RH0sCisJe1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMSwgMHgwMH0sCisJe1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMiwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX1NBUiwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9TVEFUVVMzLCAweDAwfSwKK307CisKK3N0cnVjdCByZWdfZGVmYXVsdCB3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNfMFtdID0geworCXtXU0E4ODFYX0NISVBfSUQwLCAweDAwfSwKKwl7V1NBODgxWF9DSElQX0lEMSwgMHgwMH0sCisJe1dTQTg4MVhfQ0hJUF9JRDIsIDB4MDB9LAorCXtXU0E4ODFYX0NISVBfSUQzLCAweDAyfSwKKwl7V1NBODgxWF9CVVNfSUQsIDB4MDB9LAorCXtXU0E4ODFYX0NEQ19SU1RfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DRENfVE9QX0NMS19DVEwsIDB4MDN9LAorCXtXU0E4ODFYX0NEQ19BTkFfQ0xLX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DTE9DS19DT05GSUcsIDB4MDB9LAorCXtXU0E4ODFYX0FOQV9DVEwsIDB4MDh9LAorCXtXU0E4ODFYX1NXUl9SRVNFVF9FTiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMLCAweDAxfSwKKwl7V1NBODgxWF9URU1QX01TQiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9MU0IsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfQ09ORklHMCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9DT05GSUcxLCAweDAwfSwKKwl7V1NBODgxWF9DRENfQ0xJUF9DVEwsIDB4MDN9LAorCXtXU0E4ODFYX1NETV9QRE05X0xTQiwgMHgwMH0sCisJe1dTQTg4MVhfU0RNX1BETTlfTVNCLCAweDAwfSwKKwl7V1NBODgxWF9DRENfUlhfQ1RMLCAweDdFfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEwLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEExLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEyLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEzLCAweDAwfSwKKwl7V1NBODgxWF9PVFBfQ1RSTDAsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9DVFJMMSwgMHgwMH0sCisJe1dTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDEsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9NQVNLLCAweDFGfSwKKwl7V1NBODgxWF9JTlRSX1NUQVRVUywgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9DTEVBUiwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9MRVZFTCwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9TRVQsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfVEVTVCwgMHgwMH0sCisJe1dTQTg4MVhfUERNX1RFU1RfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfQVRFX1RFU1RfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfUElOX0NUTF9NT0RFLCAweDAwfSwKKwl7V1NBODgxWF9QSU5fQ1RMX09FLCAweDAwfSwKKwl7V1NBODgxWF9QSU5fV0RBVEFfSU9QQUQsIDB4MDB9LAorCXtXU0E4ODFYX1BJTl9TVEFUVVMsIDB4MDB9LAorCXtXU0E4ODFYX0RJR19ERUJVR19NT0RFLCAweDAwfSwKKwl7V1NBODgxWF9ESUdfREVCVUdfU0VMLCAweDAwfSwKKwl7V1NBODgxWF9ESUdfREVCVUdfRU4sIDB4MDB9LAorCXtXU0E4ODFYX1NXUl9ITV9URVNUMSwgMHgwOH0sCisJe1dTQTg4MVhfU1dSX0hNX1RFU1QyLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RFVEVDVF9EQkdfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RFQlVHX01TQiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERUJVR19MU0IsIDB4MDB9LAorCXtXU0E4ODFYX1NBTVBMRV9FREdFX1NFTCwgMHgwQ30sCisJe1dTQTg4MVhfU1BBUkVfMCwgMHgwMH0sCisJe1dTQTg4MVhfU1BBUkVfMSwgMHgwMH0sCisJe1dTQTg4MVhfU1BBUkVfMiwgMHgwMH0sCisJe1dTQTg4MVhfT1RQX1JFR18wLCAweDAxfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfMiwgMHhDMH0sCisJe1dTQTg4MVhfT1RQX1JFR18zLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzQsIDB4QzB9LAorCXtXU0E4ODFYX09UUF9SRUdfNSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR182LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzcsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfOCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR185LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzExLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEyLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzEzLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE0LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE1LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE2LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE3LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE4LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzE5LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIxLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIyLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIzLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI0LCAweDAzfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI1LCAweDAxfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI2LCAweDAzfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI3LCAweDExfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI4LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI5LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMwLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMxLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzYzLCAweDQwfSwKK307CisKK3N0cnVjdCByZWdfZGVmYXVsdCB3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNfMVtdID0geworCXtXU0E4ODFYX0JJQVNfUkVGX0NUUkwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDZDfSwKKwl7V1NBODgxWF9CSUFTX1RFU1QgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDE2fSwKKwl7V1NBODgxWF9CSUFTX0JJQVMgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweEYwfSwKKwl7V1NBODgxWF9URU1QX09QIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9JUkVGX0NUUkwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDU2fSwKKwl7V1NBODgxWF9URU1QX0lTRU5TX0NUUkwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDQ3fSwKKwl7V1NBODgxWF9URU1QX0NMS19DVFJMIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg4N30sCisJe1dTQTg4MVhfVEVNUF9URVNUIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9CSUFTIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg1MX0sCisJe1dTQTg4MVhfVEVNUF9BRENfQ1RSTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfRE9VVF9NU0IgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RPVVRfTFNCIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfQURDX0VOX01PRFVfViAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9NT0RVX0kgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAwfSwKKwl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfQURDX1NFTF9JQklBUyAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MjV9LAorCXtXU0E4ODFYX0FEQ19FTl9TRUxfSUJJQVMgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDEwfSwKKwl7V1NBODgxWF9TUEtSX0RSVl9FTiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4NzR9LAorCXtXU0E4ODFYX1NQS1JfRFJWX0dBSU4gLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAxfSwKKwl7V1NBODgxWF9TUEtSX0RBQ19DVEwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDQwfSwKKwl7V1NBODgxWF9TUEtSX0RSVl9EQkcgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDE1fSwKKwl7V1NBODgxWF9TUEtSX1BXUlNUR19EQkcgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX09DUF9DVEwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweEQ0fSwKKwl7V1NBODgxWF9TUEtSX0NMSVBfQ1RMIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg5MH0sCisJe1dTQTg4MVhfU1BLUl9CQk1fQ1RMIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9NSVNDX0NUTDEgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDgwfSwKKwl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfQklBU19JTlQgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDU2fSwKKwl7V1NBODgxWF9TUEtSX1BBX0lOVCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4NTR9LAorCXtXU0E4ODFYX1NQS1JfQklBU19DQUwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweEFDfSwKKwl7V1NBODgxWF9TUEtSX0JJQVNfUFNSUiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4NTR9LAorCXtXU0E4ODFYX1NQS1JfU1RBVFVTMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfU1RBVFVTMiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX0VOX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MTh9LAorCXtXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVQgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDdBfSwKKwl7V1NBODgxWF9CT09TVF9QU19DVEwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweEMwfSwKKwl7V1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4Nzd9LAorCXtXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg3MH0sCisJe1dTQTg4MVhfQk9PU1RfRk9SQ0VfT1VUIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwRX0sCisJe1dTQTg4MVhfQk9PU1RfTERPX1BST0cgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDE2fSwKKwl7V1NBODgxWF9CT09TVF9TTE9QRV9DT01QX0lTRU5TRV9GQiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4NzF9LAorCXtXU0E4ODFYX0JPT1NUX1JPTl9DVEwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDBGfSwKKwl7V1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4QUR9LAorCXtXU0E4ODFYX0JPT1NUX1pYX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MzR9LAorCXtXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MjN9LAorCXtXU0E4ODFYX0JPT1NUX01JU0MxX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4ODB9LAorCXtXU0E4ODFYX0JPT1NUX01JU0MyX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX01JU0MzX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX0FURVNUX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9HQUlOIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg0Nn0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0NNX0xET19TRVQgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDNCfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4OER9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9JU0VOU0VfQklBU19TRVQyIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg4RH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDF9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4OER9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfQklBU19TRVQxIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg0RH0sCisJe1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDB9LAorCXtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzIgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfU0FSIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9TVEFUVVMzIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwMH0sCit9OworCitzdHJ1Y3QgcmVnX2RlZmF1bHQgd3NhODgxeF9yZXZfMl8wX2RpZ1tdID0geworCXtXU0E4ODFYX1JFU0VUX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfVEFEQ19WQUxVRV9DVEwsIDB4MDF9LAorCXtXU0E4ODFYX0lOVFJfTUFTSywgMHgxQn0sCisJe1dTQTg4MVhfSU9QQURfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI4LCAweDNGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzI5LCAweDNGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMwLCAweDAxfSwKKwl7V1NBODgxWF9PVFBfUkVHXzMxLCAweDAxfSwKK307CisKK3N0cnVjdCByZWdfZGVmYXVsdCB3c2E4ODF4X3Jldl8yXzBfYW5hW10gPSB7CisJe1dTQTg4MVhfVEVNUF9BRENfQ1RSTCwgMHgwM30sCisJe1dTQTg4MVhfQURDX1NFTF9JQklBUywgMHg0NX0sCisJe1dTQTg4MVhfU1BLUl9EUlZfR0FJTiwgMHhDMX0sCisJe1dTQTg4MVhfU1BLUl9EQUNfQ1RMLCAweDQyfSwKKwl7V1NBODgxWF9TUEtSX0JCTV9DVEwsIDB4MDJ9LAorCXtXU0E4ODFYX1NQS1JfTUlTQ19DVEwxLCAweDQwfSwKKwl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMiwgMHgwN30sCisJe1dTQTg4MVhfU1BLUl9CSUFTX0lOVCwgMHg1Rn0sCisJe1dTQTg4MVhfU1BLUl9CSUFTX1BTUlIsIDB4NDR9LAorCXtXU0E4ODFYX0JPT1NUX1BTX0NUTCwgMHhBMH0sCisJe1dTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDEsIDB4Qjd9LAorCXtXU0E4ODFYX0JPT1NUX0xPT1BfU1RBQklMSVRZLCAweDhEfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfQVRFU1QyLCAweDAyfSwKKwl7V1NBODgxWF9CT05HT19SRVNSVl9SRUcxLCAweDVFfSwKKwl7V1NBODgxWF9CT05HT19SRVNSVl9SRUcyLCAweDA3fSwKK307CisKK3N0cnVjdCByZWdfZGVmYXVsdCB3c2E4ODF4X3Jldl8yXzBfcmVnbWFwX2FuYVtdID0geworCXtXU0E4ODFYX1RFTVBfQURDX0NUUkwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDAzfSwKKwl7V1NBODgxWF9BRENfU0VMX0lCSUFTIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg0NX0sCisJe1dTQTg4MVhfU1BLUl9EUlZfR0FJTiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4QzF9LAorCXtXU0E4ODFYX1NQS1JfREFDX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4NDJ9LAorCXtXU0E4ODFYX1NQS1JfQkJNX0NUTCAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDJ9LAorCXtXU0E4ODFYX1NQS1JfTUlTQ19DVEwxIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg0MH0sCisJe1dTQTg4MVhfU1BLUl9NSVNDX0NUTDIgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDA3fSwKKwl7V1NBODgxWF9TUEtSX0JJQVNfSU5UIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg1Rn0sCisJe1dTQTg4MVhfU1BLUl9CSUFTX1BTUlIgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDQ0fSwKKwl7V1NBODgxWF9CT09TVF9QU19DVEwgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweEEwfSwKKwl7V1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4Qjd9LAorCXtXU0E4ODFYX0JPT1NUX0xPT1BfU1RBQklMSVRZIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHg4RH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMiAtIFdTQTg4MVhfQU5BTE9HX0JBU0UsIDB4MDJ9LAorCXtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzEgLSBXU0E4ODFYX0FOQUxPR19CQVNFLCAweDVFfSwKKwl7V1NBODgxWF9CT05HT19SRVNSVl9SRUcyIC0gV1NBODgxWF9BTkFMT0dfQkFTRSwgMHgwN30sCit9OworCisvKioKKyAqIHdzYTg4MXhfdXBkYXRlX3JlZ19kZWZhdWx0c18yXzAgLSB1cGRhdGUgZGVmYXVsdCB2YWx1ZXMgb2YgcmVncyBmb3IgdjIuMAorICoKKyAqIFdTQTg4MXggdjIuMCBoYXMgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWVzIGZvciBjZXJ0YWluIGFuYWxvZyBhbmQgZGlnaXRhbAorICogcmVnaXN0ZXJzIGNvbXBhcmVkIHRvIHYxLnguIFRoZXJlZm9yZSwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGhlc2UgcmVnaXN0ZXJzCisgKiB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0YWJsZXMgZGVmaW5lZCBhYm92ZSBmb3IgdjIuMC4KKyAqLwordm9pZCB3c2E4ODF4X3VwZGF0ZV9yZWdfZGVmYXVsdHNfMl8wKHZvaWQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c2E4ODF4X3Jldl8yXzBfZGlnKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0cyk7IGorKykKKwkJCWlmICh3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNbal0ucmVnID09CisJCQkJCQl3c2E4ODF4X3Jldl8yXzBfZGlnW2ldLnJlZykKKwkJCQl3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNbal0uZGVmID0KKwkJCQkJCXdzYTg4MXhfcmV2XzJfMF9kaWdbaV0uZGVmOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c2E4ODF4X3Jldl8yXzBfYW5hKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0cyk7IGorKykKKwkJCWlmICh3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNbal0ucmVnID09CisJCQkJCQl3c2E4ODF4X3Jldl8yXzBfYW5hW2ldLnJlZykKKwkJCQl3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNbal0uZGVmID0KKwkJCQkJCXdzYTg4MXhfcmV2XzJfMF9hbmFbaV0uZGVmOworCX0KK30KK0VYUE9SVF9TWU1CT0wod3NhODgxeF91cGRhdGVfcmVnX2RlZmF1bHRzXzJfMCk7CisKKy8qKgorICogd3NhODgxeF91cGRhdGVfcmVnbWFwXzJfMCAtIHVwZGF0ZSByZWdtYXAgZnJhbWV3b3JrIHdpdGggbmV3IHRhYmxlcworICogQHJlZ21hcDogcG9pbnRlciB0byBXU0E4ODF4IHJlZ21hcCBzdHJ1Y3R1cmUKKyAqIEBmbGFnOiBpbmRpY2F0ZXMgZGlnaXRhbCBvciBhbmFsb2cgV1NBODgxeCBzbGF2ZQorICoKKyAqIFdTQTg4MXggdjIuMCBoYXMgc29tZSBuZXcgcmVnaXN0ZXJzIGZvciBib3RoIGFuYWxvZyBhbmQgZGlnaXRhbCBzbGF2ZXMuCisgKiBVcGRhdGUgdGhlIHJlZ21hcCBmcmFtZXdvcmsgd2l0aCBhbGwgdGhlIG5ldyByZWdpc3RlcnMuCisgKi8KK3ZvaWQgd3NhODgxeF91cGRhdGVfcmVnbWFwXzJfMChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCBmbGFnKQoreworCXUxNiByZXQgPSAwOworCisJc3dpdGNoIChmbGFnKSB7CisJY2FzZSBXU0E4ODFYX0RJR0lUQUxfU0xBVkU6CisJCXJldCA9IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChyZWdtYXAsIHdzYTg4MXhfcmV2XzJfMF9kaWcsCisJCQkJCUFSUkFZX1NJWkUod3NhODgxeF9yZXZfMl8wX2RpZykpOworCQlicmVhazsKKwljYXNlIFdTQTg4MVhfQU5BTE9HX1NMQVZFOgorCQlyZXQgPSByZWdtYXBfcmVnaXN0ZXJfcGF0Y2gocmVnbWFwLCB3c2E4ODF4X3Jldl8yXzBfYW5hLAorCQkJCQlBUlJBWV9TSVpFKHdzYTg4MXhfcmV2XzJfMF9hbmEpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiB1bmtub3duIHZlcnNpb24iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIHJlZ21hcCBkZWZhdWx0cyByZXQ9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7Cit9CitFWFBPUlRfU1lNQk9MKHdzYTg4MXhfdXBkYXRlX3JlZ21hcF8yXzApOworCitzdGF0aWMgYm9vbCB3c2E4ODF4X3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gd3NhODgxeF9hbmFfcmVnX3JlYWRhYmxlW3JlZ107Cit9CisKK3N0YXRpYyBib29sIHdzYTg4MXhfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBXU0E4ODFYX0NISVBfSUQwOgorCWNhc2UgV1NBODgxWF9DSElQX0lEMToKKwljYXNlIFdTQTg4MVhfQ0hJUF9JRDI6CisJY2FzZSBXU0E4ODFYX0NISVBfSUQzOgorCWNhc2UgV1NBODgxWF9CVVNfSUQ6CisJY2FzZSBXU0E4ODFYX1RFTVBfTVNCOgorCWNhc2UgV1NBODgxWF9URU1QX0xTQjoKKwljYXNlIFdTQTg4MVhfU0RNX1BETTlfTFNCOgorCWNhc2UgV1NBODgxWF9TRE1fUERNOV9NU0I6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMDoKKwljYXNlIFdTQTg4MVhfT1RQX1JFR18xOgorCWNhc2UgV1NBODgxWF9PVFBfUkVHXzI6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMzoKKwljYXNlIFdTQTg4MVhfT1RQX1JFR180OgorCWNhc2UgV1NBODgxWF9PVFBfUkVHXzU6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMzE6CisJY2FzZSBXU0E4ODFYX1RFTVBfRE9VVF9NU0I6CisJY2FzZSBXU0E4ODFYX1RFTVBfRE9VVF9MU0I6CisJY2FzZSBXU0E4ODFYX1RFTVBfT1A6CisJY2FzZSBXU0E4ODFYX09UUF9DVFJMMToKKwljYXNlIFdTQTg4MVhfSU5UUl9TVEFUVVM6CisJY2FzZSBXU0E4ODFYX0FURV9URVNUX01PREU6CisJY2FzZSBXU0E4ODFYX1BJTl9TVEFUVVM6CisJY2FzZSBXU0E4ODFYX1NXUl9ITV9URVNUMjoKKwljYXNlIFdTQTg4MVhfU1BLUl9TVEFUVVMxOgorCWNhc2UgV1NBODgxWF9TUEtSX1NUQVRVUzI6CisJY2FzZSBXU0E4ODFYX1NQS1JfU1RBVFVTMzoKKwljYXNlIFdTQTg4MVhfU1BLUl9QUk9UX1NBUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RydWN0IHJlZ21hcF9jb25maWcgd3NhODgxeF9hbmFfcmVnbWFwX2NvbmZpZ1tdID0geworeworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX05PTkUsCisJLnJlZ19kZWZhdWx0cyA9IHdzYTg4MXhfYW5hX3JlZ19kZWZhdWx0c18wLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRSh3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNfMCksCisJLm1heF9yZWdpc3RlciA9IFdTQTg4MVhfTUFYX1JFR0lTVEVSLAorCS52b2xhdGlsZV9yZWcgPSB3c2E4ODF4X3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSB3c2E4ODF4X3JlYWRhYmxlX3JlZ2lzdGVyLAorCS5yZWdfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorCS52YWxfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorfSwKK3sKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAorCS5yZWdfZGVmYXVsdHMgPSB3c2E4ODF4X2FuYV9yZWdfZGVmYXVsdHNfMSwKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod3NhODgxeF9hbmFfcmVnX2RlZmF1bHRzXzEpLAorCS5tYXhfcmVnaXN0ZXIgPSBXU0E4ODFYX01BWF9SRUdJU1RFUiwKKwkudm9sYXRpbGVfcmVnID0gd3NhODgxeF92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnID0gd3NhODgxeF9yZWFkYWJsZV9yZWdpc3RlciwKKwkucmVnX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKKwkudmFsX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKK30KK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnbWFwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiYmJmYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdtYXAuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJ3c2E4ODF4LXJlZ2lzdGVycy5oIgorI2luY2x1ZGUgIndzYTg4MXguaCIKKworLyoKKyAqIERlZmF1bHQgcmVnaXN0ZXIgcmVzZXQgdmFsdWVzIHRoYXQgYXJlIGNvbW1vbiBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zCisgKiBhcmUgZGVmaW5lZCBoZXJlLiBJZiBhIHJlZ2lzdGVyIHJlc2V0IHZhbHVlIGlzIGNoYW5nZWQgYmFzZWQgb24gdmVyc2lvbgorICogdGhlbiByZW1vdmUgaXQgZnJvbSB0aGlzIHN0cnVjdHVyZSBhbmQgYWRkIGl0IGluIHZlcnNpb24gc3BlY2lmaWMKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnX2RlZmF1bHQgd3NhODgxeF9kZWZhdWx0c1tdID0geworCXtXU0E4ODFYX0NISVBfSUQwLCAweDAwfSwKKwl7V1NBODgxWF9DSElQX0lEMSwgMHgwMH0sCisJe1dTQTg4MVhfQ0hJUF9JRDIsIDB4MDB9LAorCXtXU0E4ODFYX0NISVBfSUQzLCAweDAyfSwKKwl7V1NBODgxWF9CVVNfSUQsIDB4MDB9LAorCXtXU0E4ODFYX0NEQ19SU1RfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DRENfVE9QX0NMS19DVEwsIDB4MDN9LAorCXtXU0E4ODFYX0NEQ19BTkFfQ0xLX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9DTE9DS19DT05GSUcsIDB4MDB9LAorCXtXU0E4ODFYX0FOQV9DVEwsIDB4MDh9LAorCXtXU0E4ODFYX1NXUl9SRVNFVF9FTiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMLCAweDAxfSwKKwl7V1NBODgxWF9URU1QX01TQiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9MU0IsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfQ09ORklHMCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9DT05GSUcxLCAweDAwfSwKKwl7V1NBODgxWF9DRENfQ0xJUF9DVEwsIDB4MDN9LAorCXtXU0E4ODFYX1NETV9QRE05X0xTQiwgMHgwMH0sCisJe1dTQTg4MVhfU0RNX1BETTlfTVNCLCAweDAwfSwKKwl7V1NBODgxWF9DRENfUlhfQ1RMLCAweDdFfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEwLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEExLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEyLCAweDAwfSwKKwl7V1NBODgxWF9ERU1fQllQQVNTX0RBVEEzLCAweDAwfSwKKwl7V1NBODgxWF9PVFBfQ1RSTDAsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9DVFJMMSwgMHgwMH0sCisJe1dTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDEsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9TVEFUVVMsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfQ0xFQVIsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfTEVWRUwsIDB4MDB9LAorCXtXU0E4ODFYX0lOVFJfU0VULCAweDAwfSwKKwl7V1NBODgxWF9JTlRSX1RFU1QsIDB4MDB9LAorCXtXU0E4ODFYX1BETV9URVNUX01PREUsIDB4MDB9LAorCXtXU0E4ODFYX0FURV9URVNUX01PREUsIDB4MDB9LAorCXtXU0E4ODFYX1BJTl9DVExfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfUElOX0NUTF9PRSwgMHgwMH0sCisJe1dTQTg4MVhfUElOX1dEQVRBX0lPUEFELCAweDAwfSwKKwl7V1NBODgxWF9QSU5fU1RBVFVTLCAweDAwfSwKKwl7V1NBODgxWF9ESUdfREVCVUdfTU9ERSwgMHgwMH0sCisJe1dTQTg4MVhfRElHX0RFQlVHX1NFTCwgMHgwMH0sCisJe1dTQTg4MVhfRElHX0RFQlVHX0VOLCAweDAwfSwKKwl7V1NBODgxWF9TV1JfSE1fVEVTVDEsIDB4MDh9LAorCXtXU0E4ODFYX1NXUl9ITV9URVNUMiwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERVRFQ1RfREJHX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9ERUJVR19NU0IsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfREVCVUdfTFNCLCAweDAwfSwKKwl7V1NBODgxWF9TQU1QTEVfRURHRV9TRUwsIDB4MEN9LAorCXtXU0E4ODFYX1NQQVJFXzAsIDB4MDB9LAorCXtXU0E4ODFYX1NQQVJFXzEsIDB4MDB9LAorCXtXU0E4ODFYX1NQQVJFXzIsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9SRUdfMCwgMHgwMX0sCisJe1dTQTg4MVhfT1RQX1JFR18xLCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzIsIDB4QzB9LAorCXtXU0E4ODFYX09UUF9SRUdfMywgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR180LCAweEMwfSwKKwl7V1NBODgxWF9PVFBfUkVHXzUsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfNiwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR183LCAweEZGfSwKKwl7V1NBODgxWF9PVFBfUkVHXzgsIDB4RkZ9LAorCXtXU0E4ODFYX09UUF9SRUdfOSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xMCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xMSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xMiwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xMywgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xNCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xNSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xNiwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xNywgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xOCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18xOSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18yMCwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18yMSwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18yMiwgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18yMywgMHhGRn0sCisJe1dTQTg4MVhfT1RQX1JFR18yNCwgMHgwM30sCisJe1dTQTg4MVhfT1RQX1JFR18yNSwgMHgwMX0sCisJe1dTQTg4MVhfT1RQX1JFR18yNiwgMHgwM30sCisJe1dTQTg4MVhfT1RQX1JFR18yNywgMHgxMX0sCisJe1dTQTg4MVhfT1RQX1JFR182MywgMHg0MH0sCisJLyogV1NBODgxeCBBbmFsb2cgcmVnaXN0ZXJzICovCisJe1dTQTg4MVhfQklBU19SRUZfQ1RSTCwgMHg2Q30sCisJe1dTQTg4MVhfQklBU19URVNULCAweDE2fSwKKwl7V1NBODgxWF9CSUFTX0JJQVMsIDB4RjB9LAorCXtXU0E4ODFYX1RFTVBfT1AsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfSVJFRl9DVFJMLCAweDU2fSwKKwl7V1NBODgxWF9URU1QX0lTRU5TX0NUUkwsIDB4NDd9LAorCXtXU0E4ODFYX1RFTVBfQ0xLX0NUUkwsIDB4ODd9LAorCXtXU0E4ODFYX1RFTVBfVEVTVCwgMHgwMH0sCisJe1dTQTg4MVhfVEVNUF9CSUFTLCAweDUxfSwKKwl7V1NBODgxWF9URU1QX0RPVVRfTVNCLCAweDAwfSwKKwl7V1NBODgxWF9URU1QX0RPVVRfTFNCLCAweDAwfSwKKwl7V1NBODgxWF9BRENfRU5fTU9EVV9WLCAweDAwfSwKKwl7V1NBODgxWF9BRENfRU5fTU9EVV9JLCAweDAwfSwKKwl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViwgMHgwMH0sCisJe1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX0ksIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19FTl9TRUxfSUJBSVMsIDB4MTB9LAorCXtXU0E4ODFYX1NQS1JfRFJWX0VOLCAweDc0fSwKKwl7V1NBODgxWF9TUEtSX0RSVl9EQkcsIDB4MTV9LAorCXtXU0E4ODFYX1NQS1JfUFdSU1RHX0RCRywgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweEQ0fSwKKwl7V1NBODgxWF9TUEtSX0NMSVBfQ1RMLCAweDkwfSwKKwl7V1NBODgxWF9TUEtSX1BBX0lOVCwgMHg1NH0sCisJe1dTQTg4MVhfU1BLUl9CSUFTX0NBTCwgMHhBQ30sCisJe1dTQTg4MVhfU1BLUl9TVEFUVVMxLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1NUQVRVUzIsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHgxOH0sCisJe1dTQTg4MVhfQk9PU1RfQ1VSUkVOVF9MSU1JVCwgMHg3QX0sCisJe1dTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDIsIDB4NzB9LAorCXtXU0E4ODFYX0JPT1NUX0ZPUkNFX09VVCwgMHgwRX0sCisJe1dTQTg4MVhfQk9PU1RfTERPX1BST0csIDB4MTZ9LAorCXtXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCLCAweDcxfSwKKwl7V1NBODgxWF9CT09TVF9ST05fQ1RMLCAweDBGfSwKKwl7V1NBODgxWF9CT09TVF9aWF9DVEwsIDB4MzR9LAorCXtXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTCwgMHgyM30sCisJe1dTQTg4MVhfQk9PU1RfTUlTQzFfQ1RMLCAweDgwfSwKKwl7V1NBODgxWF9CT09TVF9NSVNDMl9DVEwsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX01JU0MzX0NUTCwgMHgwMH0sCisJe1dTQTg4MVhfQk9PU1RfQVRFU1RfQ1RMLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfR0FJTiwgMHg0Nn0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0NNX0xET19TRVQsIDB4M0J9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9JU0VOU0VfQklBU19TRVQxLCAweDhEfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMiwgMHg4RH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMSwgMHgwMX0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ00sIDB4OER9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfQklBU19TRVQxLCAweDREfSwKKwl7V1NBODgxWF9TUEtSX1BST1RfU0FSLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX1NUQVRVUzMsIDB4MDB9LAorfTsKKworLyogRGVmYXVsdCByZWdpc3RlciByZXNldCB2YWx1ZXMgZm9yIFdTQTg4MXggcmV2IDIuMCAqLworc3RhdGljIHN0cnVjdCByZWdfc2VxdWVuY2Ugd3NhODgxeF9yZXZfMl8wW10gPSB7CisJe1dTQTg4MVhfUkVTRVRfQ1RMLCAweDAwLCAweDAwfSwKKwl7V1NBODgxWF9UQURDX1ZBTFVFX0NUTCwgMHgwMSwgMHgwMH0sCisJe1dTQTg4MVhfSU5UUl9NQVNLLCAweDFCLCAweDAwfSwKKwl7V1NBODgxWF9JT1BBRF9DVEwsIDB4MDAsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9SRUdfMjgsIDB4M0YsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9SRUdfMjksIDB4M0YsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9SRUdfMzAsIDB4MDEsIDB4MDB9LAorCXtXU0E4ODFYX09UUF9SRUdfMzEsIDB4MDEsIDB4MDB9LAorCXtXU0E4ODFYX1RFTVBfQURDX0NUUkwsIDB4MDMsIDB4MDB9LAorCXtXU0E4ODFYX0FEQ19TRUxfSUJJQVMsIDB4NDUsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfRFJWX0dBSU4sIDB4QzEsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfREFDX0NUTCwgMHg0MiwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9CQk1fQ1RMLCAweDAyLCAweDAwfSwKKwl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMSwgMHg0MCwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9NSVNDX0NUTDIsIDB4MDcsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfQklBU19JTlQsIDB4NUYsIDB4MDB9LAorCXtXU0E4ODFYX1NQS1JfQklBU19QU1JSLCAweDQ0LCAweDAwfSwKKwl7V1NBODgxWF9CT09TVF9QU19DVEwsIDB4QTAsIDB4MDB9LAorCXtXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQxLCAweEI3LCAweDAwfSwKKwl7V1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWSwgMHg4RCwgMHgwMH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMiwgMHgwMiwgMHgwMH0sCisJe1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMSwgMHg1RSwgMHgwMH0sCisJe1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMiwgMHgwNywgMHgwMH0sCit9OworCisvKgorICogd3NhODgxeF9yZWdtYXBfZGVmYXVsdHMgLSB1cGRhdGUgcmVnbWFwIGRlZmF1bHQgcmVnaXN0ZXIgdmFsdWVzCisgKiBAcmVnbWFwOiBwb2ludGVyIHRvIHJlZ21hcCBzdHJ1Y3R1cmUKKyAqIEB2ZXJzaW9uOiB3c2E4ODF4IHZlcnNpb24gaWQKKyAqCisgKiBVcGRhdGUgcmVnbWFwIGRlZmF1bHQgcmVnaXN0ZXIgdmFsdWVzIGJhc2VkIG9uIHZlcnNpb24gaWQKKyAqCisgKi8KK3ZvaWQgd3NhODgxeF9yZWdtYXBfZGVmYXVsdHMoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCB1OCB2ZXJzaW9uKQoreworCXUxNiByZXQgPSAwOworCisJaWYgKCFyZWdtYXApIHsKKwkJcHJfZGVidWcoIiVzOiByZWdtYXAgc3RydWN0dXJlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ2NhY2hlX2NhY2hlX29ubHkocmVnbWFwLCB0cnVlKTsKKwlyZXQgPSByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHJlZ21hcCwgd3NhODgxeF9yZXZfMl8wLAorCQkJCSAgICAgQVJSQVlfU0laRSh3c2E4ODF4X3Jldl8yXzApKTsKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgZmFsc2UpOworCisJaWYgKHJldCkKKwkJcHJfZGVidWcoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIHJlZ21hcCBkZWZhdWx0cyByZXQ9ICVkXG4iLAorCQkJIF9fZnVuY19fLCByZXQpOworfQorRVhQT1JUX1NZTUJPTCh3c2E4ODF4X3JlZ21hcF9kZWZhdWx0cyk7CisKK3N0YXRpYyBib29sIHdzYTg4MXhfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiB3c2E4ODF4X3JlZ19yZWFkYWJsZVtyZWddOworfQorCitzdGF0aWMgYm9vbCB3c2E4ODF4X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV1NBODgxWF9DSElQX0lEMDoKKwljYXNlIFdTQTg4MVhfQ0hJUF9JRDE6CisJY2FzZSBXU0E4ODFYX0NISVBfSUQyOgorCWNhc2UgV1NBODgxWF9DSElQX0lEMzoKKwljYXNlIFdTQTg4MVhfQlVTX0lEOgorCWNhc2UgV1NBODgxWF9URU1QX01TQjoKKwljYXNlIFdTQTg4MVhfVEVNUF9MU0I6CisJY2FzZSBXU0E4ODFYX1NETV9QRE05X0xTQjoKKwljYXNlIFdTQTg4MVhfU0RNX1BETTlfTVNCOgorCWNhc2UgV1NBODgxWF9PVFBfQ1RSTDE6CisJY2FzZSBXU0E4ODFYX0lOVFJfU1RBVFVTOgorCWNhc2UgV1NBODgxWF9BVEVfVEVTVF9NT0RFOgorCWNhc2UgV1NBODgxWF9QSU5fU1RBVFVTOgorCWNhc2UgV1NBODgxWF9TV1JfSE1fVEVTVDI6CisJY2FzZSBXU0E4ODFYX1NQS1JfU1RBVFVTMToKKwljYXNlIFdTQTg4MVhfU1BLUl9TVEFUVVMyOgorCWNhc2UgV1NBODgxWF9TUEtSX1NUQVRVUzM6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMDoKKwljYXNlIFdTQTg4MVhfT1RQX1JFR18xOgorCWNhc2UgV1NBODgxWF9PVFBfUkVHXzI6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMzoKKwljYXNlIFdTQTg4MVhfT1RQX1JFR180OgorCWNhc2UgV1NBODgxWF9PVFBfUkVHXzU6CisJY2FzZSBXU0E4ODFYX09UUF9SRUdfMzE6CisJY2FzZSBXU0E4ODFYX1RFTVBfRE9VVF9NU0I6CisJY2FzZSBXU0E4ODFYX1RFTVBfRE9VVF9MU0I6CisJY2FzZSBXU0E4ODFYX1RFTVBfT1A6CisJY2FzZSBXU0E4ODFYX1NQS1JfUFJPVF9TQVI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0cnVjdCByZWdtYXBfY29uZmlnIHdzYTg4MXhfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSA4LAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSB3c2E4ODF4X2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRSh3c2E4ODF4X2RlZmF1bHRzKSwKKwkubWF4X3JlZ2lzdGVyID0gV1NBODgxWF9NQVhfUkVHSVNURVIsCisJLnZvbGF0aWxlX3JlZyA9IHdzYTg4MXhfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZyA9IHdzYTg4MXhfcmVhZGFibGVfcmVnaXN0ZXIsCisJLnJlZ19mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCisJLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCisJLmNhbl9tdWx0aV93cml0ZSA9IHRydWUsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRhYmxlcy1hbmFsb2cuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMtYW5hbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZWQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMtYW5hbG9nLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgIndzYTg4MXgtcmVnaXN0ZXJzLWFuYWxvZy5oIgorCitjb25zdCB1OCB3c2E4ODF4X2FuYV9yZWdfcmVhZGFibGVbV1NBODgxWF9DQUNIRV9TSVpFXSA9IHsKKwlbV1NBODgxWF9DSElQX0lEMF0gPSAxLAorCVtXU0E4ODFYX0NISVBfSUQxXSA9IDEsCisJW1dTQTg4MVhfQ0hJUF9JRDJdID0gMSwKKwlbV1NBODgxWF9DSElQX0lEM10gPSAxLAorCVtXU0E4ODFYX0JVU19JRF0gPSAxLAorCVtXU0E4ODFYX0NEQ19SU1RfQ1RMXSA9IDEsCisJW1dTQTg4MVhfQ0RDX1RPUF9DTEtfQ1RMXSA9IDEsCisJW1dTQTg4MVhfQ0RDX0FOQV9DTEtfQ1RMXSA9IDEsCisJW1dTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMXSA9IDEsCisJW1dTQTg4MVhfQ0xPQ0tfQ09ORklHXSA9IDEsCisJW1dTQTg4MVhfQU5BX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NXUl9SRVNFVF9FTl0gPSAxLAorCVtXU0E4ODFYX1JFU0VUX0NUTF0gPSAxLAorCVtXU0E4ODFYX1RBRENfVkFMVUVfQ1RMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9NU0JdID0gMSwKKwlbV1NBODgxWF9URU1QX0xTQl0gPSAxLAorCVtXU0E4ODFYX1RFTVBfQ09ORklHMF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfQ09ORklHMV0gPSAxLAorCVtXU0E4ODFYX0NEQ19DTElQX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NETV9QRE05X0xTQl0gPSAxLAorCVtXU0E4ODFYX1NETV9QRE05X01TQl0gPSAxLAorCVtXU0E4ODFYX0NEQ19SWF9DVExdID0gMSwKKwlbV1NBODgxWF9ERU1fQllQQVNTX0RBVEEwXSA9IDEsCisJW1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMV0gPSAxLAorCVtXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTJdID0gMSwKKwlbV1NBODgxWF9ERU1fQllQQVNTX0RBVEEzXSA9IDEsCisJW1dTQTg4MVhfT1RQX0NUUkwwXSA9IDEsCisJW1dTQTg4MVhfT1RQX0NUUkwxXSA9IDEsCisJW1dTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDFdID0gMSwKKwlbV1NBODgxWF9JTlRSX01PREVdID0gMSwKKwlbV1NBODgxWF9JTlRSX01BU0tdID0gMSwKKwlbV1NBODgxWF9JTlRSX1NUQVRVU10gPSAxLAorCVtXU0E4ODFYX0lOVFJfQ0xFQVJdID0gMSwKKwlbV1NBODgxWF9JTlRSX0xFVkVMXSA9IDEsCisJW1dTQTg4MVhfSU5UUl9TRVRdID0gMSwKKwlbV1NBODgxWF9JTlRSX1RFU1RdID0gMSwKKwlbV1NBODgxWF9QRE1fVEVTVF9NT0RFXSA9IDEsCisJW1dTQTg4MVhfQVRFX1RFU1RfTU9ERV0gPSAxLAorCVtXU0E4ODFYX1BJTl9DVExfTU9ERV0gPSAxLAorCVtXU0E4ODFYX1BJTl9DVExfT0VdID0gMSwKKwlbV1NBODgxWF9QSU5fV0RBVEFfSU9QQURdID0gMSwKKwlbV1NBODgxWF9QSU5fU1RBVFVTXSA9IDEsCisJW1dTQTg4MVhfRElHX0RFQlVHX01PREVdID0gMSwKKwlbV1NBODgxWF9ESUdfREVCVUdfU0VMXSA9IDEsCisJW1dTQTg4MVhfRElHX0RFQlVHX0VOXSA9IDEsCisJW1dTQTg4MVhfU1dSX0hNX1RFU1QxXSA9IDEsCisJW1dTQTg4MVhfU1dSX0hNX1RFU1QyXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9ERVRFQ1RfREJHX0NUTF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfREVCVUdfTVNCXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9ERUJVR19MU0JdID0gMSwKKwlbV1NBODgxWF9TQU1QTEVfRURHRV9TRUxdID0gMSwKKwlbV1NBODgxWF9JT1BBRF9DVExdID0gMSwKKwlbV1NBODgxWF9TUEFSRV8wXSA9IDEsCisJW1dTQTg4MVhfU1BBUkVfMV0gPSAxLAorCVtXU0E4ODFYX1NQQVJFXzJdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzBdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzFdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzJdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzNdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzRdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzVdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzZdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzddID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzhdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzldID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzEwXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xMV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTJdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzEzXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xNF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTVdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzE2XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xN10gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMThdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzE5XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yMF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjFdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzIyXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yM10gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjRdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzI1XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yNl0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjddID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzI4XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yOV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMzBdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzMxXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR182M10gPSAxLAorCS8qIEFuYWxvZyBSZWdpc3RlcnMgKi8KKwlbV1NBODgxWF9CSUFTX1JFRl9DVFJMXSA9IDEsCisJW1dTQTg4MVhfQklBU19URVNUXSA9IDEsCisJW1dTQTg4MVhfQklBU19CSUFTXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9PUF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfSVJFRl9DVFJMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9JU0VOU19DVFJMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9DTEtfQ1RSTF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfVEVTVF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfQklBU10gPSAxLAorCVtXU0E4ODFYX1RFTVBfQURDX0NUUkxdID0gMSwKKwlbV1NBODgxWF9URU1QX0RPVVRfTVNCXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9ET1VUX0xTQl0gPSAxLAorCVtXU0E4ODFYX0FEQ19FTl9NT0RVX1ZdID0gMSwKKwlbV1NBODgxWF9BRENfRU5fTU9EVV9JXSA9IDEsCisJW1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX1ZdID0gMSwKKwlbV1NBODgxWF9BRENfRU5fREVUX1RFU1RfSV0gPSAxLAorCVtXU0E4ODFYX0FEQ19TRUxfSUJJQVNdID0gMSwKKwlbV1NBODgxWF9BRENfRU5fU0VMX0lCSUFTXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9EUlZfRU5dID0gMSwKKwlbV1NBODgxWF9TUEtSX0RSVl9HQUlOXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9EQUNfQ1RMXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9EUlZfREJHXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9PQ1BfQ1RMXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9DTElQX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NQS1JfQkJNX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NQS1JfTUlTQ19DVEwxXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9NSVNDX0NUTDJdID0gMSwKKwlbV1NBODgxWF9TUEtSX0JJQVNfSU5UXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QQV9JTlRdID0gMSwKKwlbV1NBODgxWF9TUEtSX0JJQVNfQ0FMXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9CSUFTX1BTUlJdID0gMSwKKwlbV1NBODgxWF9TUEtSX1NUQVRVUzFdID0gMSwKKwlbV1NBODgxWF9TUEtSX1NUQVRVUzJdID0gMSwKKwlbV1NBODgxWF9CT09TVF9FTl9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9DVVJSRU5UX0xJTUlUXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfUFNfQ1RMXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDFdID0gMSwKKwlbV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMl0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX0ZPUkNFX09VVF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX0xET19QUk9HXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfU0xPUEVfQ09NUF9JU0VOU0VfRkJdID0gMSwKKwlbV1NBODgxWF9CT09TVF9ST05fQ1RMXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfTE9PUF9TVEFCSUxJVFldID0gMSwKKwlbV1NBODgxWF9CT09TVF9aWF9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9TVEFSVF9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9NSVNDMV9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9NSVNDMl9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9NSVNDM19DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9BVEVTVF9DVExdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfRkVfR0FJTl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9GRV9DTV9MRE9fU0VUXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0lTRU5TRV9CSUFTX1NFVDFdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDFdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ01dID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX0JJQVNfU0VUMV0gPSAxLAorCVtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzFdID0gMSwKKwlbV1NBODgxWF9CT05HT19SRVNSVl9SRUcyXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QUk9UX1NBUl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfU1RBVFVTM10gPSAxLAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjEyMTJiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRhYmxlcy5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJ3c2E4ODF4LXJlZ2lzdGVycy5oIgorCitjb25zdCB1OCB3c2E4ODF4X3JlZ19yZWFkYWJsZVtXU0E4ODFYX0NBQ0hFX1NJWkVdID0geworCVtXU0E4ODFYX0NISVBfSUQwXSA9IDEsCisJW1dTQTg4MVhfQ0hJUF9JRDFdID0gMSwKKwlbV1NBODgxWF9DSElQX0lEMl0gPSAxLAorCVtXU0E4ODFYX0NISVBfSUQzXSA9IDEsCisJW1dTQTg4MVhfQlVTX0lEXSA9IDEsCisJW1dTQTg4MVhfQ0RDX1JTVF9DVExdID0gMSwKKwlbV1NBODgxWF9DRENfVE9QX0NMS19DVExdID0gMSwKKwlbV1NBODgxWF9DRENfQU5BX0NMS19DVExdID0gMSwKKwlbV1NBODgxWF9DRENfRElHX0NMS19DVExdID0gMSwKKwlbV1NBODgxWF9DTE9DS19DT05GSUddID0gMSwKKwlbV1NBODgxWF9BTkFfQ1RMXSA9IDEsCisJW1dTQTg4MVhfU1dSX1JFU0VUX0VOXSA9IDEsCisJW1dTQTg4MVhfUkVTRVRfQ1RMXSA9IDEsCisJW1dTQTg4MVhfVEFEQ19WQUxVRV9DVExdID0gMSwKKwlbV1NBODgxWF9URU1QX0RFVEVDVF9DVExdID0gMSwKKwlbV1NBODgxWF9URU1QX01TQl0gPSAxLAorCVtXU0E4ODFYX1RFTVBfTFNCXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9DT05GSUcwXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9DT05GSUcxXSA9IDEsCisJW1dTQTg4MVhfQ0RDX0NMSVBfQ1RMXSA9IDEsCisJW1dTQTg4MVhfU0RNX1BETTlfTFNCXSA9IDEsCisJW1dTQTg4MVhfU0RNX1BETTlfTVNCXSA9IDEsCisJW1dTQTg4MVhfQ0RDX1JYX0NUTF0gPSAxLAorCVtXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTBdID0gMSwKKwlbV1NBODgxWF9ERU1fQllQQVNTX0RBVEExXSA9IDEsCisJW1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMl0gPSAxLAorCVtXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTNdID0gMSwKKwlbV1NBODgxWF9PVFBfQ1RSTDBdID0gMSwKKwlbV1NBODgxWF9PVFBfQ1RSTDFdID0gMSwKKwlbV1NBODgxWF9IRFJJVkVfQ1RMX0dST1VQMV0gPSAxLAorCVtXU0E4ODFYX0lOVFJfTU9ERV0gPSAxLAorCVtXU0E4ODFYX0lOVFJfTUFTS10gPSAxLAorCVtXU0E4ODFYX0lOVFJfU1RBVFVTXSA9IDEsCisJW1dTQTg4MVhfSU5UUl9DTEVBUl0gPSAxLAorCVtXU0E4ODFYX0lOVFJfTEVWRUxdID0gMSwKKwlbV1NBODgxWF9JTlRSX1NFVF0gPSAxLAorCVtXU0E4ODFYX0lOVFJfVEVTVF0gPSAxLAorCVtXU0E4ODFYX1BETV9URVNUX01PREVdID0gMSwKKwlbV1NBODgxWF9BVEVfVEVTVF9NT0RFXSA9IDEsCisJW1dTQTg4MVhfUElOX0NUTF9NT0RFXSA9IDEsCisJW1dTQTg4MVhfUElOX0NUTF9PRV0gPSAxLAorCVtXU0E4ODFYX1BJTl9XREFUQV9JT1BBRF0gPSAxLAorCVtXU0E4ODFYX1BJTl9TVEFUVVNdID0gMSwKKwlbV1NBODgxWF9ESUdfREVCVUdfTU9ERV0gPSAxLAorCVtXU0E4ODFYX0RJR19ERUJVR19TRUxdID0gMSwKKwlbV1NBODgxWF9ESUdfREVCVUdfRU5dID0gMSwKKwlbV1NBODgxWF9TV1JfSE1fVEVTVDFdID0gMSwKKwlbV1NBODgxWF9TV1JfSE1fVEVTVDJdID0gMSwKKwlbV1NBODgxWF9URU1QX0RFVEVDVF9EQkdfQ1RMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9ERUJVR19NU0JdID0gMSwKKwlbV1NBODgxWF9URU1QX0RFQlVHX0xTQl0gPSAxLAorCVtXU0E4ODFYX1NBTVBMRV9FREdFX1NFTF0gPSAxLAorCVtXU0E4ODFYX0lPUEFEX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NQQVJFXzBdID0gMSwKKwlbV1NBODgxWF9TUEFSRV8xXSA9IDEsCisJW1dTQTg4MVhfU1BBUkVfMl0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMl0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfM10gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfNF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfNV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfNl0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfN10gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfOF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfOV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTBdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzExXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xMl0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTNdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzE0XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xNV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTZdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzE3XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18xOF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMTldID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzIwXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yMV0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjJdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzIzXSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yNF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjVdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzI2XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18yN10gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMjhdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzI5XSA9IDEsCisJW1dTQTg4MVhfT1RQX1JFR18zMF0gPSAxLAorCVtXU0E4ODFYX09UUF9SRUdfMzFdID0gMSwKKwlbV1NBODgxWF9PVFBfUkVHXzYzXSA9IDEsCisJLyogQW5hbG9nIFJlZ2lzdGVycyAqLworCVtXU0E4ODFYX0JJQVNfUkVGX0NUUkxdID0gMSwKKwlbV1NBODgxWF9CSUFTX1RFU1RdID0gMSwKKwlbV1NBODgxWF9CSUFTX0JJQVNdID0gMSwKKwlbV1NBODgxWF9URU1QX09QXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9JUkVGX0NUUkxdID0gMSwKKwlbV1NBODgxWF9URU1QX0lTRU5TX0NUUkxdID0gMSwKKwlbV1NBODgxWF9URU1QX0NMS19DVFJMXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9URVNUXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9CSUFTXSA9IDEsCisJW1dTQTg4MVhfVEVNUF9BRENfQ1RSTF0gPSAxLAorCVtXU0E4ODFYX1RFTVBfRE9VVF9NU0JdID0gMSwKKwlbV1NBODgxWF9URU1QX0RPVVRfTFNCXSA9IDEsCisJW1dTQTg4MVhfQURDX0VOX01PRFVfVl0gPSAxLAorCVtXU0E4ODFYX0FEQ19FTl9NT0RVX0ldID0gMSwKKwlbV1NBODgxWF9BRENfRU5fREVUX1RFU1RfVl0gPSAxLAorCVtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JXSA9IDEsCisJW1dTQTg4MVhfQURDX1NFTF9JQklBU10gPSAxLAorCVtXU0E4ODFYX0FEQ19FTl9TRUxfSUJBSVNdID0gMSwKKwlbV1NBODgxWF9TUEtSX0RSVl9FTl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfRFJWX0dBSU5dID0gMSwKKwlbV1NBODgxWF9TUEtSX0RBQ19DVExdID0gMSwKKwlbV1NBODgxWF9TUEtSX0RSVl9EQkddID0gMSwKKwlbV1NBODgxWF9TUEtSX1BXUlNUR19EQkddID0gMSwKKwlbV1NBODgxWF9TUEtSX09DUF9DVExdID0gMSwKKwlbV1NBODgxWF9TUEtSX0NMSVBfQ1RMXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9CQk1fQ1RMXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9NSVNDX0NUTDFdID0gMSwKKwlbV1NBODgxWF9TUEtSX01JU0NfQ1RMMl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfQklBU19JTlRdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BBX0lOVF0gPSAxLAorCVtXU0E4ODFYX1NQS1JfQklBU19DQUxdID0gMSwKKwlbV1NBODgxWF9TUEtSX0JJQVNfUFNSUl0gPSAxLAorCVtXU0E4ODFYX1NQS1JfU1RBVFVTMV0gPSAxLAorCVtXU0E4ODFYX1NQS1JfU1RBVFVTMl0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX0VOX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVRdID0gMSwKKwlbV1NBODgxWF9CT09TVF9QU19DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMV0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfRk9SQ0VfT1VUXSA9IDEsCisJW1dTQTg4MVhfQk9PU1RfTERPX1BST0ddID0gMSwKKwlbV1NBODgxWF9CT09TVF9TTE9QRV9DT01QX0lTRU5TRV9GQl0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX1JPTl9DVExdID0gMSwKKwlbV1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWV0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX1pYX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX01JU0MxX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX01JU0MyX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX01JU0MzX0NUTF0gPSAxLAorCVtXU0E4ODFYX0JPT1NUX0FURVNUX0NUTF0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9GRV9HQUlOXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0NNX0xET19TRVRdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMV0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9GRV9JU0VOU0VfQklBU19TRVQyXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMV0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDJdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTV0gPSAxLAorCVtXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfQklBU19TRVQxXSA9IDEsCisJW1dTQTg4MVhfQk9OR09fUkVTUlZfUkVHMV0gPSAxLAorCVtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzJdID0gMSwKKwlbV1NBODgxWF9TUEtSX1BST1RfU0FSXSA9IDEsCisJW1dTQTg4MVhfU1BLUl9TVEFUVVMzXSA9IDEsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtdGVtcC1zZW5zb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc5ZDBmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlICJ3c2E4ODF4LXRlbXAtc2Vuc29yLmgiCisKKyNkZWZpbmUgVDFfVEVNUCAtMTAKKyNkZWZpbmUgVDJfVEVNUCAxNTAKKyNkZWZpbmUgTE9XX1RFTVBfVEhSRVNIT0xEIDUKKyNkZWZpbmUgSElHSF9URU1QX1RIUkVTSE9MRCA0NQorI2RlZmluZSBURU1QX0lOVkFMSUQJMHhGRkZGCisKKy8qCisgKiB3c2E4ODF4X2dldF90ZW1wIC0gZ2V0IHdzYSB0ZW1wZXJhdHVyZQorICogQHRoZXJtYWw6IHRoZXJtYWwgem9uZSBkZXZpY2UKKyAqIEB0ZW1wOiB0ZW1wZXJhdHVyZSB2YWx1ZQorICoKKyAqIEdldCB0aGUgdGVtcGVyYXR1cmUgb2Ygd3NhODgxeC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCB3c2E4ODF4X2dldF90ZW1wKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsLAorCQkgICAgIGludCAqdGVtcCkKK3sKKwlzdHJ1Y3Qgd3NhODgxeF90el9wcml2ICpwZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHdzYV90ZW1wX3JlZ2lzdGVyIHJlZzsKKwlpbnQgZG1lYXMsIGQxLCBkMjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgdGVtcF92YWw7CisJaW50IHQxID0gVDFfVEVNUDsKKwlpbnQgdDIgPSBUMl9URU1QOworCisJaWYgKCF0aGVybWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aGVybWFsLT5kZXZkYXRhKSB7CisJCXBkYXRhID0gdGhlcm1hbC0+ZGV2ZGF0YTsKKwkJaWYgKHBkYXRhLT5jb2RlYykgeworCQkJY29kZWMgPSBwZGF0YS0+Y29kZWM7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBjb2RlYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwZGF0YS0+d3NhX3RlbXBfcmVnX3JlYWQpIHsKKwkJcmV0ID0gcGRhdGEtPndzYV90ZW1wX3JlZ19yZWFkKGNvZGVjLCAmcmVnKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogdGVtcGVyYXR1cmUgcmVnaXN0ZXIgcmVhZCBmYWlsZWQ6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHdzYV90ZW1wX3JlZ19yZWFkIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogVGVtcGVyYXR1cmUgcmVnaXN0ZXIgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUKKwkgKiBmb2xsb3dpbmcgcmFuZ2UuCisJICogZDFfbXNiICA9IDY4IC0gOTIgYW5kIGQxX2xzYiAgPSAwLCA2NCwgMTI4LCAxOTIKKwkgKiBkMl9tc2IgID0gMTg1IC0yMTggYW5kICBkMl9sc2IgID0gMCwgNjQsIDEyOCwgMTkyCisJICovCisJaWYgKChyZWcuZDFfbXNiIDwgNjggfHwgcmVnLmQxX21zYiA+IDkyKSB8fAorCSAgICAoIShyZWcuZDFfbHNiID09IDAgfHwgcmVnLmQxX2xzYiA9PSA2NCB8fCByZWcuZDFfbHNiID09IDEyOCB8fAorCQlyZWcuZDFfbHNiID09IDE5MikpIHx8CisJICAgIChyZWcuZDJfbXNiIDwgMTg1IHx8IHJlZy5kMl9tc2IgPiAyMTgpIHx8CisJICAgICghKHJlZy5kMl9sc2IgPT0gMCB8fCByZWcuZDJfbHNiID09IDY0IHx8IHJlZy5kMl9sc2IgPT0gMTI4IHx8CisJCXJlZy5kMl9sc2IgPT0gMTkyKSkpIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogVGVtcGVyYXR1cmUgcmVnaXN0ZXJzWyVkICVkICVkICVkXSBhcmUgb3V0IG9mIHJhbmdlXG4iLAorCQkJCSAgIF9fZnVuY19fLCByZWcuZDFfbXNiLCByZWcuZDFfbHNiLCByZWcuZDJfbXNiLAorCQkJCSAgIHJlZy5kMl9sc2IpOworCX0KKwlkbWVhcyA9ICgocmVnLmRtZWFzX21zYiA8PCAweDgpIHwgcmVnLmRtZWFzX2xzYikgPj4gMHg2OworCWQxID0gKChyZWcuZDFfbXNiIDw8IDB4OCkgfCByZWcuZDFfbHNiKSA+PiAweDY7CisJZDIgPSAoKHJlZy5kMl9tc2IgPDwgMHg4KSB8IHJlZy5kMl9sc2IpID4+IDB4NjsKKworCWlmIChkMSA9PSBkMikKKwkJdGVtcF92YWwgPSBURU1QX0lOVkFMSUQ7CisJZWxzZQorCQl0ZW1wX3ZhbCA9IHQxICsgKCgoZG1lYXMgLSBkMSkgKiAodDIgLSB0MSkpLyhkMiAtIGQxKSk7CisKKwlpZiAodGVtcF92YWwgPD0gTE9XX1RFTVBfVEhSRVNIT0xEIHx8CisJCXRlbXBfdmFsID49IEhJR0hfVEVNUF9USFJFU0hPTEQpIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogVDA6ICVkIGlzIG91dCBvZiByYW5nZVslZCwgJWRdXG4iLAorCQkJCSAgIF9fZnVuY19fLCB0ZW1wX3ZhbCwgTE9XX1RFTVBfVEhSRVNIT0xELAorCQkJCSAgIEhJR0hfVEVNUF9USFJFU0hPTEQpOworCX0KKwlpZiAodGVtcCkKKwkJKnRlbXAgPSB0ZW1wX3ZhbDsKKwlwcl9kZWJ1ZygiJXM6IHQwIG1lYXN1cmVkOiAlZCBkbWVhcyA9ICVkLCBkMSA9ICVkLCBkMiA9ICVkXG4iLAorCQkgIF9fZnVuY19fLCB0ZW1wX3ZhbCwgZG1lYXMsIGQxLCBkMik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wod3NhODgxeF9nZXRfdGVtcCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgd3NhODgxeF90aGVybWFsX29wcyA9IHsKKwkuZ2V0X3RlbXAgPSB3c2E4ODF4X2dldF90ZW1wLAorfTsKKworaW50IHdzYTg4MXhfaW5pdF90aGVybWFsKHN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgKnR6X3BkYXRhKQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0el9kZXY7CisKKwlpZiAodHpfcGRhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB0aGVybWFsIHBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFJlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgem9uZSAqLworCXR6X2RldiA9IHRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIodHpfcGRhdGEtPm5hbWUsCisJCQkJMCwgMCwgdHpfcGRhdGEsCisJCQkJJndzYTg4MXhfdGhlcm1hbF9vcHMsIE5VTEwsIDAsIDApOworCWlmIChJU19FUlIodHpfZGV2KSkgeworCQlwcl9lcnIoIiVzOiB0aGVybWFsIGRldmljZSByZWdpc3RlciBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0el9wZGF0YS0+dHpfZGV2ID0gdHpfZGV2OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3c2E4ODF4X2luaXRfdGhlcm1hbCk7CisKK3ZvaWQgd3NhODgxeF9kZWluaXRfdGhlcm1hbChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpfZGV2KQoreworCWlmICh0el9kZXYpCisJCXRoZXJtYWxfem9uZV9kZXZpY2VfdW5yZWdpc3Rlcih0el9kZXYpOworfQorRVhQT1JUX1NZTUJPTCh3c2E4ODF4X2RlaW5pdF90aGVybWFsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10ZW1wLXNlbnNvci5oIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMWViNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10ZW1wLXNlbnNvci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBXU0E4ODFYX1RFTVBfU0VOU09SX0gKKyNkZWZpbmUgV1NBODgxWF9URU1QX1NFTlNPUl9ICisKKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKK3N0cnVjdCB3c2FfdGVtcF9yZWdpc3RlciB7CisJdTggZDFfbXNiOworCXU4IGQxX2xzYjsKKwl1OCBkMl9tc2I7CisJdTggZDJfbHNiOworCXU4IGRtZWFzX21zYjsKKwl1OCBkbWVhc19sc2I7Cit9OwordHlwZWRlZiBpbnQzMl90ICgqd3NhX3RlbXBfcmVnaXN0ZXJfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlzdHJ1Y3Qgd3NhX3RlbXBfcmVnaXN0ZXIgKndzYV90ZW1wX3JlZyk7CitzdHJ1Y3Qgd3NhODgxeF90el9wcml2IHsKKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpfZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd3NhX3RlbXBfcmVnaXN0ZXIgKndzYV90ZW1wX3JlZzsKKwljaGFyIG5hbWVbODBdOworCXdzYV90ZW1wX3JlZ2lzdGVyX3JlYWQgd3NhX3RlbXBfcmVnX3JlYWQ7Cit9OworCitpbnQgd3NhODgxeF9nZXRfdGVtcChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpfZGV2LCBpbnQgKnRlbXApOworaW50IHdzYTg4MXhfaW5pdF90aGVybWFsKHN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgKnR6X3BkYXRhKTsKK3ZvaWQgd3NhODgxeF9kZWluaXRfdGhlcm1hbChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpfZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNjZTdjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmMKQEAgLTAsMCArMSwxNDA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3NvdW5kd2lyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlICJ3c2E4ODF4LmgiCisjaW5jbHVkZSAid3NhODgxeC10ZW1wLXNlbnNvci5oIgorCisjZGVmaW5lIFdTQTg4MVhfTlVNX1JFVFJZCTUKKworZW51bSB7CisJR18xOERCID0gMCwKKwlHXzE2UDVEQiwKKwlHXzE1REIsCisJR18xM1A1REIsCisJR18xMkRCLAorCUdfMTBQNURCLAorCUdfOURCLAorCUdfN1A1REIsCisJR182REIsCisJR180UDVEQiwKKwlHXzNEQiwKKwlHXzFQNURCLAorCUdfMERCLAorfTsKKworZW51bSB7CisJRElTQUJMRSA9IDAsCisJRU5BQkxFLAorfTsKKworZW51bSB7CisJU1dSX0RBQ19QT1JULAorCVNXUl9DT01QX1BPUlQsCisJU1dSX0JPT1NUX1BPUlQsCisJU1dSX1ZJU0VOU0VfUE9SVCwKK307CisKK3N0cnVjdCBzd3JfcG9ydCB7CisJdTggcG9ydF9pZDsKKwl1OCBjaF9tYXNrOworCXUzMiBjaF9yYXRlOworCXU4IG51bV9jaDsKK307CisKK2VudW0geworCVdTQTg4MVhfREVWX0RPV04sCisJV1NBODgxWF9ERVZfVVAsCit9OworCisvKgorICogUHJpdmF0ZSBkYXRhIFN0cnVjdHVyZSBmb3Igd3NhODgxeC4gQWxsIHBhcmFtZXRlcnMgcmVsYXRlZCB0bworICogV1NBODgxWCBjb2RlYyBuZWVkcyB0byBiZSBkZWZpbmVkIGhlcmUuCisgKi8KK3N0cnVjdCB3c2E4ODF4X3ByaXYgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9zbGF2ZTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJYm9vbCBjb21wX2VuYWJsZTsKKwlib29sIGJvb3N0X2VuYWJsZTsKKwlib29sIHZpc2Vuc2VfZW5hYmxlOworCXU4IHBhX2dhaW47CisJc3RydWN0IHN3cl9wb3J0IHBvcnRbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKKwlpbnQgcGRfZ3BpbzsKKwlzdHJ1Y3Qgd3NhODgxeF90el9wcml2IHR6X3BkYXRhOworCWludCBiZ19jbnQ7CisJaW50IGNsa19jbnQ7CisJaW50IHZlcnNpb247CisJc3RydWN0IG11dGV4IGJnX2xvY2s7CisJc3RydWN0IG11dGV4IHJlc19sb2NrOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OworCWludCBzdGF0ZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG9jcF9jdGxfd29yazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKndzYV9yc3RfbnA7Cit9OworCisjZGVmaW5lIFNXUl9TTFZfTUFYX1JFR19BRERSCTB4MzkwCisjZGVmaW5lIFNXUl9TTFZfU1RBUlRfUkVHX0FERFIJMHg0MAorI2RlZmluZSBTV1JfU0xWX01BWF9CVUZfTEVOCTIwCisjZGVmaW5lIEJZVEVTX1BFUl9MSU5FCQkxMgorI2RlZmluZSBTV1JfU0xWX1JEX0JVRl9MRU4JOAorI2RlZmluZSBTV1JfU0xWX1dSX0JVRl9MRU4JMzIKKyNkZWZpbmUgU1dSX1NMVl9NQVhfREVWSUNFUwkyCisKKyNkZWZpbmUgV1NBODgxWF9WRVJTSU9OX0VOVFJZX1NJWkUgMjcKKyNkZWZpbmUgV1NBODgxWF9PQ1BfQ1RMX1RJTUVSX1NFQyAyCisjZGVmaW5lIFdTQTg4MVhfT0NQX0NUTF9URU1QX0NFTFNJVVMgMjUKKyNkZWZpbmUgV1NBODgxWF9PQ1BfQ1RMX1BPTExfVElNRVJfU0VDIDYwCisKK3N0YXRpYyBpbnQgd3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMgPSBXU0E4ODFYX09DUF9DVExfUE9MTF9USU1FUl9TRUM7Cittb2R1bGVfcGFyYW0od3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMsIGludCwgMDY2NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdzYTg4MXhfb2NwX3BvbGxfdGltZXJfc2VjLCAidGltZXIgZm9yIG9jcCBjdGwgcG9sbGluZyIpOworCitzdGF0aWMgc3RydWN0IHdzYTg4MXhfcHJpdiAqZGJnd3NhODgxeDsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3dzYTg4MXhfZGVudDsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3BlZWs7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19wb2tlOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcmVnX2R1bXA7CitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfZGF0YTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2bnVtOworCitzdGF0aWMgaW50MzJfdCB3c2E4ODF4X3Jlc291cmNlX2FjcXVpcmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQkJYm9vbCBlbmFibGUpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYV9wYV9nYWluX3RleHRbXSA9IHsKKwkiR18xOF9EQiIsICJHXzE2UDVfREIiLCAiR18xNV9EQiIsICJHXzEzUDVfREIiLCAiR18xMl9EQiIsICJHXzEwUDVfREIiLAorCSJHXzlfREIiLCAiR183UDVfREIiLCAiR182X0RCIiwgIkdfNFA1X0RCIiwgIkdfM19EQiIsICJHXzFQNV9EQiIsCisJIkdfMF9EQiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd3NhX3BhX2dhaW5fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHdzYV9wYV9nYWluX3RleHQpLCB3c2FfcGFfZ2Fpbl90ZXh0KTsKKworc3RhdGljIGludCB3c2FfcGFfZ2Fpbl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdzYTg4MXgtPnBhX2dhaW47CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUEEgZ2FpbiA9IDB4JXhcbiIsIF9fZnVuY19fLCB3c2E4ODF4LT5wYV9nYWluKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYV9wYV9nYWluX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAgPSAlbGRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwl3c2E4ODF4LT5wYV9nYWluID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3c2FfYW5hbG9nX2dhaW5fY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIldTQSBQQSBHYWluIiwgd3NhX3BhX2dhaW5fZW51bSwKKwkJICAgICB3c2FfcGFfZ2Fpbl9nZXQsIHdzYV9wYV9nYWluX3B1dCksCit9OworCitzdGF0aWMgaW50IGNvZGVjX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcGFyYW1ldGVycyhjaGFyICpidWYsIHUzMiAqcGFyYW0xLCBpbnQgbnVtX29mX3BhcikKK3sKKwljaGFyICp0b2tlbjsKKwlpbnQgYmFzZSwgY250OworCisJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IG51bV9vZl9wYXI7IGNudCsrKSB7CisJCWlmICh0b2tlbikgeworCQkJaWYgKCh0b2tlblsxXSA9PSAneCcpIHx8ICh0b2tlblsxXSA9PSAnWCcpKQorCQkJCWJhc2UgPSAxNjsKKwkJCWVsc2UKKwkJCQliYXNlID0gMTA7CisKKwkJCWlmIChrc3RydG91MzIodG9rZW4sIGJhc2UsICZwYXJhbTFbY250XSkgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdzYTg4MXhfY29kZWNfdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkgICAgICAgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4OworCWNoYXIgYnVmZmVyW1dTQTg4MVhfVkVSU0lPTl9FTlRSWV9TSVpFXTsKKwlpbnQgbGVuOworCisJd3NhODgxeCA9IChzdHJ1Y3Qgd3NhODgxeF9wcml2ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJaWYgKCF3c2E4ODF4KSB7CisJCXByX2VycigiJXM6IHdzYTg4MXggcHJpdiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJXU0E4ODFYLVNPVU5EV0lSRV8yXzBcbiIpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgd3NhODgxeF9jb2RlY19pbmZvX29wcyA9IHsKKwkucmVhZCA9IHdzYTg4MXhfY29kZWNfdmVyc2lvbl9yZWFkLAorfTsKKworLyoKKyAqIHdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIHdzYTg4MXggbW9kdWxlCisgKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKKyAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKKyAqCisgKiBDcmVhdGVzIHdzYTg4MXggbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgorICogcGFyZW50IGRpcmVjdG9yeS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCB3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKKwkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKwljaGFyIG5hbWVbODBdOworCisJaWYgKCFjb2RlY19yb290IHx8ICFjb2RlYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy4leCIsICJ3c2E4ODF4IiwKKwkJICh1MzIpd3NhODgxeC0+c3dyX3NsYXZlLT5hZGRyKTsKKworCXdzYTg4MXgtPmVudHJ5ID0gc25kX3JlZ2lzdGVyX21vZHVsZV9pbmZvKGNvZGVjX3Jvb3QtPm1vZHVsZSwKKwkJCQkJCSAgKGNvbnN0IGNoYXIgKiluYW1lLAorCQkJCQkJICBjb2RlY19yb290KTsKKwlpZiAoIXdzYTg4MXgtPmVudHJ5KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHdzYTg4MXggZW50cnlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXZlcnNpb25fZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLT5zbmRfY2FyZCwKKwkJCQkJCSAgICJ2ZXJzaW9uIiwKKwkJCQkJCSAgIHdzYTg4MXgtPmVudHJ5KTsKKwlpZiAoIXZlcnNpb25fZW50cnkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd3NhODgxeCB2ZXJzaW9uIGVudHJ5XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB3c2E4ODF4OworCXZlcnNpb25fZW50cnktPnNpemUgPSBXU0E4ODFYX1ZFUlNJT05fRU5UUllfU0laRTsKKwl2ZXJzaW9uX2VudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CisJdmVyc2lvbl9lbnRyeS0+Yy5vcHMgPSAmd3NhODgxeF9jb2RlY19pbmZvX29wczsKKworCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKKwkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXdzYTg4MXgtPnZlcnNpb25fZW50cnkgPSB2ZXJzaW9uX2VudHJ5OworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkpOworCitzdGF0aWMgYm9vbCBpc19zd3Jfc2x2X3JlZ19yZWFkYWJsZShpbnQgcmVnKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCWlmICgoKHJlZyA+IDB4NDYpICYmIChyZWcgPCAweDRBKSkgfHwKKwkgICAgKChyZWcgPiAweDRBKSAmJiAocmVnIDwgMHg1MCkpIHx8CisJICAgICgocmVnID4gMHg1NSkgJiYgKHJlZyA8IDB4RTApKSB8fAorCSAgICAoKHJlZyA+IDB4RTApICYmIChyZWcgPCAweEYwKSkgfHwKKwkgICAgKChyZWcgPiAweEYwKSAmJiAocmVnIDwgMHgxMDApKSB8fAorCSAgICAoKHJlZyA+IDB4MTA1KSAmJiAocmVnIDwgMHgxMjApKSB8fAorCSAgICAoKHJlZyA+IDB4MTI4KSAmJiAocmVnIDwgMHgxMzApKSB8fAorCSAgICAoKHJlZyA+IDB4MTM4KSAmJiAocmVnIDwgMHgyMDApKSB8fAorCSAgICAoKHJlZyA+IDB4MjA1KSAmJiAocmVnIDwgMHgyMjApKSB8fAorCSAgICAoKHJlZyA+IDB4MjI4KSAmJiAocmVnIDwgMHgyMzApKSB8fAorCSAgICAoKHJlZyA+IDB4MjM4KSAmJiAocmVnIDwgMHgzMDApKSB8fAorCSAgICAoKHJlZyA+IDB4MzA1KSAmJiAocmVnIDwgMHgzMjApKSB8fAorCSAgICAoKHJlZyA+IDB4MzI4KSAmJiAocmVnIDwgMHgzMzApKSB8fAorCSAgICAoKHJlZyA+IDB4MzM4KSAmJiAocmVnIDwgMHg0MDApKSB8fAorCSAgICAoKHJlZyA+IDB4NDA1KSAmJiAocmVnIDwgMHg0MjApKSkKKwkJcmV0ID0gZmFsc2U7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB3c2E4ODF4X3N3cnNsYXZlX3JlZ19zaG93KGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQsCisJCQkJCSAgbG9mZl90ICpwcG9zKQoreworCWludCBpLCByZWdfdmFsLCBsZW47CisJc3NpemVfdCB0b3RhbCA9IDA7CisJY2hhciB0bXBfYnVmW1NXUl9TTFZfTUFYX0JVRl9MRU5dOworCisJaWYgKCF1YnVmIHx8ICFwcG9zIHx8IChkZXZudW0gPT0gMCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gKCgoaW50KSAqcHBvcyAvIEJZVEVTX1BFUl9MSU5FKSArIFNXUl9TTFZfU1RBUlRfUkVHX0FERFIpOworCQlpIDw9IFNXUl9TTFZfTUFYX1JFR19BRERSOyBpKyspIHsKKwkJaWYgKCFpc19zd3Jfc2x2X3JlZ19yZWFkYWJsZShpKSkKKwkJCWNvbnRpbnVlOworCQlzd3JfcmVhZChkYmd3c2E4ODF4LT5zd3Jfc2xhdmUsIGRldm51bSwKKwkJCWksICZyZWdfdmFsLCAxKTsKKwkJbGVuID0gc25wcmludGYodG1wX2J1ZiwgMjUsICIweCUuM3g6IDB4JS4yeFxuIiwgaSwKKwkJCSAgICAgICAocmVnX3ZhbCAmIDB4RkYpKTsKKwkJaWYgKCh0b3RhbCArIGxlbikgPj0gY291bnQgLSAxKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHVidWYgKyB0b3RhbCksIHRtcF9idWYsIGxlbikpIHsKKwkJCXByX2VycigiJXM6IGZhaWwgdG8gY29weSByZWcgZHVtcFxuIiwgX19mdW5jX18pOworCQkJdG90YWwgPSAtRUZBVUxUOworCQkJZ290byBjb3B5X2VycjsKKwkJfQorCQkqcHBvcyArPSBsZW47CisJCXRvdGFsICs9IGxlbjsKKwl9CisKK2NvcHlfZXJyOgorCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIHNzaXplX3QgY29kZWNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBsYnVmW1NXUl9TTFZfUkRfQlVGX0xFTl07CisJY2hhciAqYWNjZXNzX3N0cjsKKwlzc2l6ZV90IHJldF9jbnQ7CisKKwlpZiAoIWNvdW50IHx8ICFmaWxlIHx8ICFwcG9zIHx8ICF1YnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjY2Vzc19zdHIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCpwcG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcGVlayIpKSB7CisJCXNucHJpbnRmKGxidWYsIHNpemVvZihsYnVmKSwgIjB4JXhcbiIsIChyZWFkX2RhdGEgJiAweEZGKSk7CisJCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgbGJ1ZiwKKwkJCQkJICAgICAgIHN0cm5sZW4obGJ1ZiwgNykpOworCX0gZWxzZSBpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcmVnX2R1bXAiKSkgeworCQlyZXRfY250ID0gd3NhODgxeF9zd3JzbGF2ZV9yZWdfc2hvdyh1YnVmLCBjb3VudCwgcHBvcyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogJXMgbm90IHBlcm1pdHRlZCB0byByZWFkXG4iLCBfX2Z1bmNfXywgYWNjZXNzX3N0cik7CisJCXJldF9jbnQgPSAtRVBFUk07CisJfQorCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgc3NpemVfdCBjb2RlY19kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwljb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgbGJ1ZltTV1JfU0xWX1dSX0JVRl9MRU5dOworCWludCByYzsKKwl1MzIgcGFyYW1bNV07CisJY2hhciAqYWNjZXNzX3N0cjsKKworCWlmICghZmlscCB8fCAhcHBvcyB8fCAhdWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY2Nlc3Nfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmIChjbnQgPiBzaXplb2YobGJ1ZikgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKKwlpZiAocmMpCisJCXJldHVybiAtRUZBVUxUOworCisJbGJ1ZltjbnRdID0gJ1wwJzsKKwlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcG9rZSIpKSB7CisJCS8qIHdyaXRlICovCisJCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDMpOworCQlpZiAoKHBhcmFtWzBdIDw9IFNXUl9TTFZfTUFYX1JFR19BRERSKSAmJiAocGFyYW1bMV0gPD0gMHhGRikgJiYKKwkJCShyYyA9PSAwKSkKKwkJCXN3cl93cml0ZShkYmd3c2E4ODF4LT5zd3Jfc2xhdmUsIHBhcmFtWzJdLAorCQkJCXBhcmFtWzBdLCAmcGFyYW1bMV0pOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzd3JzbGF2ZV9wZWVrIikpIHsKKwkJLyogcmVhZCAqLworCQlyYyA9IGdldF9wYXJhbWV0ZXJzKGxidWYsIHBhcmFtLCAyKTsKKwkJaWYgKChwYXJhbVswXSA8PSBTV1JfU0xWX01BWF9SRUdfQUREUikgJiYgKHJjID09IDApKQorCQkJc3dyX3JlYWQoZGJnd3NhODgxeC0+c3dyX3NsYXZlLCBwYXJhbVsxXSwKKwkJCQlwYXJhbVswXSwgJnJlYWRfZGF0YSwgMSk7CisJCWVsc2UKKwkJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInN3cnNsYXZlX3JlZ19kdW1wIikpIHsKKwkJLyogcmVnIGR1bXAgKi8KKwkJcmMgPSBnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMSk7CisJCWlmICgocmMgPT0gMCkgJiYgKHBhcmFtWzBdID4gMCkgJiYKKwkJICAgIChwYXJhbVswXSA8PSBTV1JfU0xWX01BWF9ERVZJQ0VTKSkKKwkJCWRldm51bSA9IHBhcmFtWzBdOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfQorCWlmIChyYyA9PSAwKQorCQlyYyA9IGNudDsKKwllbHNlCisJCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGVjX2RlYnVnX29wcyA9IHsKKwkub3BlbiA9IGNvZGVjX2RlYnVnX29wZW4sCisJLndyaXRlID0gY29kZWNfZGVidWdfd3JpdGUsCisJLnJlYWQgPSBjb2RlY19kZWJ1Z19yZWFkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd3NhODgxeF9wcmVfcG11X3BhW10gPSB7CisJe1dTQTg4MVhfU1BLUl9EUlZfR0FJTiwgMHg0MSwgMH0sCisJe1dTQTg4MVhfU1BLUl9NSVNDX0NUTDEsIDB4MDEsIDB9LAorCXtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JLCAweDAxLCAwfSwKKwl7V1NBODgxWF9BRENfRU5fTU9EVV9WLCAweDAyLCAwfSwKKwl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViwgMHgxMCwgMH0sCisJe1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHLCAweEEwLCAwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdzYTg4MXhfcHJlX3BtdV9wYV8yXzBbXSA9IHsKKwl7V1NBODgxWF9TUEtSX0RSVl9HQUlOLCAweDQxLCAwfSwKKwl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMSwgMHg4NywgMH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB3c2E4ODF4X3Bvc3RfcG11X3BhW10gPSB7CisJe1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHLCAweDAwLCAwfSwKKwl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViwgMHgwMCwgMH0sCisJe1dTQTg4MVhfQURDX0VOX01PRFVfViwgMHgwMCwgMH0sCisJe1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX0ksIDB4MDAsIDB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd3NhODgxeF92aV90eGZlX2VuW10gPSB7CisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ00sIDB4ODUsIDB9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIsIDB4MEEsIDB9LAorCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9HQUlOLCAweENGLCAwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdzYTg4MXhfdmlfdHhmZV9lbl8yXzBbXSA9IHsKKwl7V1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTSwgMHg4NSwgMH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMiwgMHgwQSwgMH0sCisJe1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sIDB4NDcsIDB9LAorfTsKKworc3RhdGljIGludCB3c2E4ODF4X2Jvb3N0X2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwlpZiAoZW5hYmxlKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHg4MCwgMHg4MCk7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHg4MCwgMHgwMCk7CisJLyoKKwkgKiAxLjVtcyBzbGVlcCBpcyBuZWVkZWQgYWZ0ZXIgYm9vc3QgZW5hYmxlL2Rpc2FibGUgYXMgcGVyCisJICogSFcgcmVxdWlyZW1lbnQKKwkgKi8KKwl1c2xlZXBfcmFuZ2UoMTUwMCwgMTUxMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF92aXNlbnNlX3R4ZmVfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlLAorCQkJCSAgICAgdTggaXNlbnNlMV9nYWluLCB1OCBpc2Vuc2UyX2dhaW4sCisJCQkJICAgICB1OCB2c2Vuc2VfZ2FpbikKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCSIlczogZW5hYmxlOiVkLCBpc2Vuc2UxIGdhaW46ICVkLCBpc2Vuc2UyIGdhaW46ICVkLCB2c2Vuc2VfZ2FpbiAlZFxuIiwKKwkJX19mdW5jX18sIGVuYWJsZSwgaXNlbnNlMV9nYWluLCBpc2Vuc2UyX2dhaW4sIHZzZW5zZV9nYWluKTsKKworCWlmIChlbmFibGUpIHsKKwkJcmVnbWFwX211bHRpX3JlZ193cml0ZSh3c2E4ODF4LT5yZWdtYXAsCisJCQkJd3NhODgxeF92aV90eGZlX2VuXzJfMCwKKwkJCQlBUlJBWV9TSVpFKHdzYTg4MXhfdmlfdHhmZV9lbl8yXzApKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLAorCQkJCSAgICAweDA4LCAweDA4KTsKKwkJLyoKKwkJICogMjAwdXMgc2xlZXAgaXMgbmVlZGVkIGFmdGVyIHZpc2Vuc2UgdHhmZSBkaXNhYmxlIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudC4KKwkJICovCisJCXVzbGVlcF9yYW5nZSgyMDAsIDIxMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sCisJCQkJICAgIDB4MDEsIDB4MDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3Zpc2Vuc2VfYWRjX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlbmFibGU6JWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX01PRFVfViwgKDB4MDEgPDwgNyksCisJCQkgICAgKGVuYWJsZSA8PCA3KSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BRENfRU5fTU9EVV9JLCAoMHgwMSA8PCA3KSwKKwkJCSAgICAoZW5hYmxlIDw8IDcpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd3NhODgxeF9iYW5kZ2FwX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkLCBiZ19jb3VudDolZFxuIiwgX19mdW5jX18sCisJCWVuYWJsZSwgd3NhODgxeC0+YmdfY250KTsKKwltdXRleF9sb2NrKCZ3c2E4ODF4LT5iZ19sb2NrKTsKKwlpZiAoZW5hYmxlKSB7CisJCSsrd3NhODgxeC0+YmdfY250OworCQlpZiAod3NhODgxeC0+YmdfY250ID09IDEpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwKKwkJCQkJICAgIDB4MDgsIDB4MDgpOworCQkJLyogNDAwdXNlYyBzbGVlcCBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCQl1c2xlZXBfcmFuZ2UoNDAwLCA0MTApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9URU1QX09QLAorCQkJCQkgICAgMHgwNCwgMHgwNCk7CisJCX0KKwl9IGVsc2UgeworCQktLXdzYTg4MXgtPmJnX2NudDsKKwkJaWYgKHdzYTg4MXgtPmJnX2NudCA8PSAwKSB7CisJCQlXQVJOX09OKHdzYTg4MXgtPmJnX2NudCA8IDApOworCQkJd3NhODgxeC0+YmdfY250ID0gMDsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwgMHgwNCwgMHgwMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1RFTVBfT1AsIDB4MDgsIDB4MDApOworCQl9CisJfQorCW11dGV4X3VubG9jaygmd3NhODgxeC0+YmdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdzYTg4MXhfY2xrX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkLCBjbGtfY291bnQ6JWRcbiIsIF9fZnVuY19fLAorCQllbmFibGUsIHdzYTg4MXgtPmNsa19jbnQpOworCW11dGV4X2xvY2soJndzYTg4MXgtPnJlc19sb2NrKTsKKwlpZiAoZW5hYmxlKSB7CisJCSsrd3NhODgxeC0+Y2xrX2NudDsKKwkJaWYgKHdzYTg4MXgtPmNsa19jbnQgPT0gMSkgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDEpOworCQl9CisJfSBlbHNlIHsKKwkJLS13c2E4ODF4LT5jbGtfY250OworCQlpZiAod3NhODgxeC0+Y2xrX2NudCA8PSAwKSB7CisJCQlXQVJOX09OKHdzYTg4MXgtPmNsa19jbnQgPCAwKTsKKwkJCXdzYTg4MXgtPmNsa19jbnQgPSAwOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDApOworCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDApOworCQl9CisJfQorCW11dGV4X3VubG9jaygmd3NhODgxeC0+cmVzX2xvY2spOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfZ2V0X2NvbXBhbmRlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd3NhODgxeC0+Y29tcF9lbmFibGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9zZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDb21wYW5kZXIgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKKwkJIF9fZnVuY19fLCB3c2E4ODF4LT5jb21wX2VuYWJsZSwgdmFsdWUpOworCXdzYTg4MXgtPmNvbXBfZW5hYmxlID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9nZXRfYm9vc3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdzYTg4MXgtPmJvb3N0X2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3NldF9ib29zdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQm9vc3QgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKKwkJIF9fZnVuY19fLCB3c2E4ODF4LT5ib29zdF9lbmFibGUsIHZhbHVlKTsKKwl3c2E4ODF4LT5ib29zdF9lbmFibGUgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X2dldF92aXNlbnNlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3c2E4ODF4LT52aXNlbnNlX2VuYWJsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3NldF92aXNlbnNlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBWSXNlbnNlIGVuYWJsZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCisJCSBfX2Z1bmNfXywgd3NhODgxeC0+dmlzZW5zZV9lbmFibGUsIHZhbHVlKTsKKwl3c2E4ODF4LT52aXNlbnNlX2VuYWJsZSA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd3NhODgxeF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiQ09NUCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCXdzYTg4MXhfZ2V0X2NvbXBhbmRlciwgd3NhODgxeF9zZXRfY29tcGFuZGVyKSwKKworCVNPQ19TSU5HTEVfRVhUKCJCT09TVCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCXdzYTg4MXhfZ2V0X2Jvb3N0LCB3c2E4ODF4X3NldF9ib29zdCksCisKKwlTT0NfU0lOR0xFX0VYVCgiVklTRU5TRSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCXdzYTg4MXhfZ2V0X3Zpc2Vuc2UsIHdzYTg4MXhfc2V0X3Zpc2Vuc2UpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN3cl9kYWNfcG9ydFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQorfTsKKworc3RhdGljIGludCB3c2E4ODF4X3NldF9wb3J0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHBvcnRfaWR4LAorCQkJdTggKnBvcnRfaWQsIHU4ICpudW1fY2gsIHU4ICpjaF9tYXNrLCB1MzIgKmNoX3JhdGUpCit7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJKnBvcnRfaWQgPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5wb3J0X2lkOworCSpudW1fY2ggPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5udW1fY2g7CisJKmNoX21hc2sgPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5jaF9tYXNrOworCSpjaF9yYXRlID0gd3NhODgxeC0+cG9ydFtwb3J0X2lkeF0uY2hfcmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X2VuYWJsZV9zd3JfZGFjX3BvcnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXU4IHBvcnRfaWRbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKKwl1OCBudW1fY2hbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKKwl1OCBjaF9tYXNrW1dTQTg4MVhfTUFYX1NXUl9QT1JUU107CisJdTMyIGNoX3JhdGVbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKKwl1OCBudW1fcG9ydCA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgbmFtZSAlc1xuIiwgX19mdW5jX18sCisJCWV2ZW50LCB3LT5uYW1lKTsKKwlpZiAod3NhODgxeCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl3c2E4ODF4X3NldF9wb3J0KGNvZGVjLCBTV1JfREFDX1BPUlQsCisJCQkJJnBvcnRfaWRbbnVtX3BvcnRdLCAmbnVtX2NoW251bV9wb3J0XSwKKwkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7CisJCSsrbnVtX3BvcnQ7CisKKwkJaWYgKHdzYTg4MXgtPmNvbXBfZW5hYmxlKSB7CisJCQl3c2E4ODF4X3NldF9wb3J0KGNvZGVjLCBTV1JfQ09NUF9QT1JULAorCQkJCQkmcG9ydF9pZFtudW1fcG9ydF0sICZudW1fY2hbbnVtX3BvcnRdLAorCQkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7CisJCQkrK251bV9wb3J0OworCQl9CisJCWlmICh3c2E4ODF4LT5ib29zdF9lbmFibGUpIHsKKwkJCXdzYTg4MXhfc2V0X3BvcnQoY29kZWMsIFNXUl9CT09TVF9QT1JULAorCQkJCQkmcG9ydF9pZFtudW1fcG9ydF0sICZudW1fY2hbbnVtX3BvcnRdLAorCQkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7CisJCQkrK251bV9wb3J0OworCQl9CisJCWlmICh3c2E4ODF4LT52aXNlbnNlX2VuYWJsZSkgeworCQkJd3NhODgxeF9zZXRfcG9ydChjb2RlYywgU1dSX1ZJU0VOU0VfUE9SVCwKKwkJCQkJJnBvcnRfaWRbbnVtX3BvcnRdLCAmbnVtX2NoW251bV9wb3J0XSwKKwkJCQkJJmNoX21hc2tbbnVtX3BvcnRdLCAmY2hfcmF0ZVtudW1fcG9ydF0pOworCQkJKytudW1fcG9ydDsKKwkJfQorCQlzd3JfY29ubmVjdF9wb3J0KHdzYTg4MXgtPnN3cl9zbGF2ZSwgJnBvcnRfaWRbMF0sIG51bV9wb3J0LAorCQkJCSZjaF9tYXNrWzBdLCAmY2hfcmF0ZVswXSwgJm51bV9jaFswXSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcG9ydF9pZFtudW1fcG9ydF0gPSB3c2E4ODF4LT5wb3J0W1NXUl9EQUNfUE9SVF0ucG9ydF9pZDsKKwkJKytudW1fcG9ydDsKKwkJaWYgKHdzYTg4MXgtPmNvbXBfZW5hYmxlKSB7CisJCQlwb3J0X2lkW251bV9wb3J0XSA9CisJCQkJd3NhODgxeC0+cG9ydFtTV1JfQ09NUF9QT1JUXS5wb3J0X2lkOworCQkJKytudW1fcG9ydDsKKwkJfQorCQlpZiAod3NhODgxeC0+Ym9vc3RfZW5hYmxlKSB7CisJCQlwb3J0X2lkW251bV9wb3J0XSA9CisJCQkJd3NhODgxeC0+cG9ydFtTV1JfQk9PU1RfUE9SVF0ucG9ydF9pZDsKKwkJCSsrbnVtX3BvcnQ7CisJCX0KKwkJaWYgKHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlKSB7CisJCQlwb3J0X2lkW251bV9wb3J0XSA9CisJCQkJd3NhODgxeC0+cG9ydFtTV1JfVklTRU5TRV9QT1JUXS5wb3J0X2lkOworCQkJKytudW1fcG9ydDsKKwkJfQorCQlzd3JfZGlzY29ubmVjdF9wb3J0KHdzYTg4MXgtPnN3cl9zbGF2ZSwgJnBvcnRfaWRbMF0sIG51bV9wb3J0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfcmRhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyAlZCBib29zdCAlZCB2aXNlbnNlICVkXG4iLCBfX2Z1bmNfXywKKwkJdy0+bmFtZSwgZXZlbnQsCXdzYTg4MXgtPmJvb3N0X2VuYWJsZSwKKwkJd3NhODgxeC0+dmlzZW5zZV9lbmFibGUpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShjb2RlYywgRU5BQkxFKTsKKwkJaWYgKHdzYTg4MXgtPmJvb3N0X2VuYWJsZSkKKwkJCXdzYTg4MXhfYm9vc3RfY3RybChjb2RlYywgRU5BQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXN3cl9zbHZkZXZfZGF0YXBhdGhfY29udHJvbCh3c2E4ODF4LT5zd3Jfc2xhdmUsCisJCQkJCSAgICB3c2E4ODF4LT5zd3Jfc2xhdmUtPmRldl9udW0sCisJCQkJCSAgICBmYWxzZSk7CisJCWlmICh3c2E4ODF4LT5ib29zdF9lbmFibGUpCisJCQl3c2E4ODF4X2Jvb3N0X2N0cmwoY29kZWMsIERJU0FCTEUpOworCQl3c2E4ODF4X3Jlc291cmNlX2FjcXVpcmUoY29kZWMsIERJU0FCTEUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9yYW1wX3BhX2dhaW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCWludCBtaW5fZ2FpbiwgaW50IG1heF9nYWluLCBpbnQgdWRlbGF5KQoreworCWludCB2YWw7CisKKwlmb3IgKHZhbCA9IG1pbl9nYWluOyBtYXhfZ2FpbiA8PSB2YWw7IHZhbC0tKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfR0FJTiwKKwkJCQkgICAgMHhGMCwgdmFsIDw8IDQpOworCQkvKgorCQkgKiAxbXMgZGVsYXkgaXMgbmVlZGVkIGZvciBldmVyeSBzdGVwIGNoYW5nZSBpbiBnYWluIGFzIHBlcgorCQkgKiBIVyByZXF1aXJlbWVudC4KKwkJICovCisJCXVzbGVlcF9yYW5nZSh1ZGVsYXksIHVkZWxheSsxMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3c2E4ODF4X29jcF9jdGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IHRlbXBfdmFsOworCisJZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJd3NhODgxeCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdzYTg4MXhfcHJpdiwgb2NwX2N0bF93b3JrKTsKKworCWNvZGVjID0gd3NhODgxeC0+Y29kZWM7CisJd3NhODgxeF9nZXRfdGVtcCh3c2E4ODF4LT50el9wZGF0YS50el9kZXYsICZ0ZW1wX3ZhbCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiIHRlbXAgPSAlZFxuIiwgdGVtcF92YWwpOworCisJaWYgKHRlbXBfdmFsIDw9IFdTQTg4MVhfT0NQX0NUTF9URU1QX0NFTFNJVVMpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweEMwLCAweDAwKTsKKwllbHNlCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweEMwLCAweEMwKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd3NhODgxeC0+b2NwX2N0bF93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyh3c2E4ODF4X29jcF9wb2xsX3RpbWVyX3NlYyAqIDEwMDApKTsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3Nwa3JfcGFfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IG1pbl9nYWluLCBtYXhfZ2FpbjsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4QzAsIDB4ODApOworCQlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHdzYTg4MXgtPnJlZ21hcCwKKwkJCQl3c2E4ODF4X3ByZV9wbXVfcGFfMl8wLAorCQkJCUFSUkFZX1NJWkUod3NhODgxeF9wcmVfcG11X3BhXzJfMCkpOworCQlzd3Jfc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wod3NhODgxeC0+c3dyX3NsYXZlLAorCQkJCQkgICAgd3NhODgxeC0+c3dyX3NsYXZlLT5kZXZfbnVtLAorCQkJCQkgICAgdHJ1ZSk7CisJCS8qIFNldCByZWdpc3RlciBtb2RlIGlmIGNvbXBhbmRlciBpcyBub3QgZW5hYmxlZCAqLworCQlpZiAoIXdzYTg4MXgtPmNvbXBfZW5hYmxlKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX0RSVl9HQUlOLAorCQkJCQkgICAgMHgwOCwgMHgwOCk7CisJCWVsc2UKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfR0FJTiwKKwkJCQkJICAgIDB4MDgsIDB4MDApOworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAoIXdzYTg4MXgtPmNvbXBfZW5hYmxlKSB7CisJCQltYXhfZ2FpbiA9IHdzYTg4MXgtPnBhX2dhaW47CisJCQkvKgorCQkJICogR2FpbiBoYXMgdG8gc2V0IGluY3JlbWVudGFsbHkgaW4gNCBzdGVwcworCQkJICogYXMgcGVyIEhXIHNlcXVlbmNlCisJCQkgKi8KKwkJCWlmIChtYXhfZ2FpbiA+IEdfNFA1REIpCisJCQkJbWluX2dhaW4gPSBHXzBEQjsKKwkJCWVsc2UKKwkJCQltaW5fZ2FpbiA9IG1heF9nYWluICsgMzsKKwkJCS8qCisJCQkgKiAxbXMgZGVsYXkgaXMgbmVlZGVkIGJlZm9yZSBjaGFuZ2UgaW4gZ2FpbgorCQkJICogYXMgcGVyIEhXIHJlcXVpcmVtZW50LgorCQkJICovCisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAxMCk7CisJCQl3c2E4ODF4X3JhbXBfcGFfZ2Fpbihjb2RlYywgbWluX2dhaW4sIG1heF9nYWluLCAxMDAwKTsKKwkJfQorCQlpZiAod3NhODgxeC0+dmlzZW5zZV9lbmFibGUpIHsKKwkJCXdzYTg4MXhfdmlzZW5zZV90eGZlX2N0cmwoY29kZWMsIEVOQUJMRSwKKwkJCQkJCTB4MDAsIDB4MDMsIDB4MDEpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BRENfRU5fU0VMX0lCQUlTLAorCQkJCQkgICAgMHgwNywgMHgwMSk7CisJCQl3c2E4ODF4X3Zpc2Vuc2VfYWRjX2N0cmwoY29kZWMsIEVOQUJMRSk7CisJCX0KKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKFdTQTg4MVhfT0NQX0NUTF9USU1FUl9TRUMgKiAxMDAwKSk7CisJCS8qIEZvcmNlIHJlbW92ZSBncm91cCAqLworCQlzd3JfcmVtb3ZlX2Zyb21fZ3JvdXAod3NhODgxeC0+c3dyX3NsYXZlLAorCQkJCSAgICAgIHdzYTg4MXgtPnN3cl9zbGF2ZS0+ZGV2X251bSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlpZiAod3NhODgxeC0+dmlzZW5zZV9lbmFibGUpIHsKKwkJCXdzYTg4MXhfdmlzZW5zZV9hZGNfY3RybChjb2RlYywgRElTQUJMRSk7CisJCQl3c2E4ODF4X3Zpc2Vuc2VfdHhmZV9jdHJsKGNvZGVjLCBESVNBQkxFLAorCQkJCQkJMHgwMCwgMHgwMSwgMHgwMSk7CisJCX0KKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmspOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhDMCwgMHhDMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdzYTg4MXhfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTiIpLAorCisJU05EX1NPQ19EQVBNX01JWEVSX0UoIlNXUiBEQUNfUG9ydCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgc3dyX2RhY19wb3J0LAorCQlBUlJBWV9TSVpFKHN3cl9kYWNfcG9ydCksIHdzYTg4MXhfZW5hYmxlX3N3cl9kYWNfcG9ydCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fREFDX0UoIlJEQUMiLCBOVUxMLCBXU0E4ODFYX1NQS1JfREFDX0NUTCwgNywgMCwKKwkJd3NhODgxeF9yZGFjX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fUEdBX0UoIlNQS1IgUEdBIiwgV1NBODgxWF9TUEtSX0RSVl9FTiwgNywgMCwgTlVMTCwgMCwKKwkJCXdzYTg4MXhfc3Brcl9wYV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS1IiKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdzYTg4MXhfYXVkaW9fbWFwW10gPSB7CisJeyJTV1IgREFDX1BvcnQiLCAiU3dpdGNoIiwgIklOIn0sCisJeyJSREFDIiwgTlVMTCwgIlNXUiBEQUNfUG9ydCJ9LAorCXsiU1BLUiBQR0EiLCBOVUxMLCAiUkRBQyJ9LAorCXsiU1BLUiIsIE5VTEwsICJTUEtSIFBHQSJ9LAorfTsKKworaW50IHdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTggKnBvcnQsIHU4IG51bV9wb3J0LAorCQkJCXVuc2lnbmVkIGludCAqY2hfbWFzaywgdW5zaWduZWQgaW50ICpjaF9yYXRlKQoreworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCWlmICghcG9ydCB8fCAhY2hfbWFzayB8fCAhY2hfcmF0ZSB8fAorCQkobnVtX3BvcnQgPiBXU0E4ODFYX01BWF9TV1JfUE9SVFMpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogSW52YWxpZCBwb3J0PSVwSywgY2hfbWFzaz0lcEssIGNoX3JhdGU9JXBLXG4iLAorCQkJX19mdW5jX18sIHBvcnQsIGNoX21hc2ssIGNoX3JhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9wb3J0OyBpKyspIHsKKwkJd3NhODgxeC0+cG9ydFtpXS5wb3J0X2lkID0gcG9ydFtpXTsKKwkJd3NhODgxeC0+cG9ydFtpXS5jaF9tYXNrID0gY2hfbWFza1tpXTsKKwkJd3NhODgxeC0+cG9ydFtpXS5jaF9yYXRlID0gY2hfcmF0ZVtpXTsKKwkJd3NhODgxeC0+cG9ydFtpXS5udW1fY2ggPSBfX3N3X2h3ZWlnaHQ4KGNoX21hc2tbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wod3NhODgxeF9zZXRfY2hhbm5lbF9tYXApOworCitzdGF0aWMgdm9pZCB3c2E4ODF4X2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdzYTg4MXgtPnZlcnNpb24gPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfQ0hJUF9JRDEpOworCXdzYTg4MXhfcmVnbWFwX2RlZmF1bHRzKHdzYTg4MXgtPnJlZ21hcCwgd3NhODgxeC0+dmVyc2lvbik7CisJLyogQnJpbmcgb3V0IG9mIGFuYWxvZyByZXNldCAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQ0RDX1JTVF9DVEwsIDB4MDIsIDB4MDIpOworCS8qIEJyaW5nIG91dCBvZiBkaWdpdGFsIHJlc2V0ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9DRENfUlNUX0NUTCwgMHgwMSwgMHgwMSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0NMT0NLX0NPTkZJRywgMHgxMCwgMHgxMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4MDIsIDB4MDIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9NSVNDX0NUTDEsIDB4QzAsIDB4ODApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9NSVNDX0NUTDEsIDB4MDYsIDB4MDYpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9CSUFTX0lOVCwgMHhGRiwgMHgwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BBX0lOVCwgMHhGMCwgMHg0MCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX1BBX0lOVCwgMHgwRSwgMHgwRSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9MT09QX1NUQUJJTElUWSwKKwkJCSAgICAweDAzLCAweDAzKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX01JU0MyX0NUTCwgMHhGRiwgMHgxNCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9TVEFSVF9DVEwsIDB4ODAsIDB4ODApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfU1RBUlRfQ1RMLCAweDAzLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCLAorCQkJICAgIDB4MEMsIDB4MDQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfU0xPUEVfQ09NUF9JU0VOU0VfRkIsCisJCQkgICAgMHgwMywgMHgwMCk7CisJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9PVFBfUkVHXzApKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQxLAorCQkJCSAgICAweEYwLCAweDcwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyLAorCQkJICAgIDB4RjAsIDB4MzApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfRU4sIDB4MDgsIDB4MDgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfQ1VSUkVOVF9MSU1JVCwKKwkJCSAgICAweDBGLCAweDA4KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHgzMCwgMHgzMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4MEMsIDB4MDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfT1RQX1JFR18yOCwgMHgzRiwgMHgzQSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT05HT19SRVNSVl9SRUcxLAorCQkJICAgIDB4RkYsIDB4QjIpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMiwKKwkJCSAgICAweEZGLCAweDA1KTsKK30KKworc3RhdGljIGludDMyX3Qgd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJCWJvb2wgZW5hYmxlKQoreworCXdzYTg4MXhfY2xrX2N0cmwoY29kZWMsIGVuYWJsZSk7CisJd3NhODgxeF9iYW5kZ2FwX2N0cmwoY29kZWMsIGVuYWJsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IHdzYTg4MXhfdGVtcF9yZWdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3Qgd3NhX3RlbXBfcmVnaXN0ZXIgKndzYV90ZW1wX3JlZykKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHN3cl9kZXZpY2UgKmRldjsKKwl1OCBkZXZudW0gPSAwOworCisJaWYgKCF3c2E4ODF4KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3c2E4ODF4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldiA9IHdzYTg4MXgtPnN3cl9zbGF2ZTsKKwlpZiAoZGV2ICYmICh3c2E4ODF4LT5zdGF0ZSA9PSBXU0E4ODFYX0RFVl9ET1dOKSkgeworCQlpZiAoc3dyX2dldF9sb2dpY2FsX2Rldl9udW0oZGV2LCBkZXYtPmFkZHIsICZkZXZudW0pKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzIGdldCBkZXZudW0gJWQgZm9yIGRldiBhZGRyICVseCBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGRldm51bSwgZGV2LT5hZGRyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCW11dGV4X2xvY2soJndzYTg4MXgtPnJlc19sb2NrKTsKKwlpZiAoIXdzYTg4MXgtPmNsa19jbnQpIHsKKwkJcmVnY2FjaGVfbWFya19kaXJ0eSh3c2E4ODF4LT5yZWdtYXApOworCQlyZWdjYWNoZV9zeW5jKHdzYTg4MXgtPnJlZ21hcCk7CisJfQorCW11dGV4X3VubG9jaygmd3NhODgxeC0+cmVzX2xvY2spOworCisJd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKGNvZGVjLCBFTkFCTEUpOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9UQURDX1ZBTFVFX0NUTCwgMHgwMSwgMHgwMCk7CisJd3NhX3RlbXBfcmVnLT5kbWVhc19tc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfVEVNUF9NU0IpOworCXdzYV90ZW1wX3JlZy0+ZG1lYXNfbHNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX1RFTVBfTFNCKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1RBRENfVkFMVUVfQ1RMLCAweDAxLCAweDAxKTsKKwl3c2FfdGVtcF9yZWctPmQxX21zYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9PVFBfUkVHXzEpOworCXdzYV90ZW1wX3JlZy0+ZDFfbHNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfMik7CisJd3NhX3RlbXBfcmVnLT5kMl9tc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfT1RQX1JFR18zKTsKKwl3c2FfdGVtcF9yZWctPmQyX2xzYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9PVFBfUkVHXzQpOworCisJd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKGNvZGVjLCBESVNBQkxFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19jb21wb25lbnRfdG9fY29kZWMoY29tcG9uZW50KTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHN3cl9kZXZpY2UgKmRldjsKKworCWlmICghd3NhODgxeCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSB3c2E4ODF4LT5zd3Jfc2xhdmU7CisJd3NhODgxeC0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZ3c2E4ODF4LT5iZ19sb2NrKTsKKwltdXRleF9pbml0KCZ3c2E4ODF4LT5yZXNfbG9jayk7CisJd3NhODgxeF9pbml0KGNvZGVjKTsKKwlzbnByaW50Zih3c2E4ODF4LT50el9wZGF0YS5uYW1lLCBzaXplb2Yod3NhODgxeC0+dHpfcGRhdGEubmFtZSksCisJCSIlcy4leCIsICJ3c2F0eiIsICh1OClkZXYtPmFkZHIpOworCXdzYTg4MXgtPmJnX2NudCA9IDA7CisJd3NhODgxeC0+Y2xrX2NudCA9IDA7CisJd3NhODgxeC0+dHpfcGRhdGEuY29kZWMgPSBjb2RlYzsKKwl3c2E4ODF4LT50el9wZGF0YS53c2FfdGVtcF9yZWdfcmVhZCA9IHdzYTg4MXhfdGVtcF9yZWdfcmVhZDsKKwl3c2E4ODF4X2luaXRfdGhlcm1hbCgmd3NhODgxeC0+dHpfcGRhdGEpOworCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCB3c2FfYW5hbG9nX2dhaW5fY29udHJvbHMsCisJCQkJICAgQVJSQVlfU0laRSh3c2FfYW5hbG9nX2dhaW5fY29udHJvbHMpKTsKKwlJTklUX0RFTEFZRURfV09SSygmd3NhODgxeC0+b2NwX2N0bF93b3JrLCB3c2E4ODF4X29jcF9jdGxfd29yayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19jb21wb25lbnRfdG9fY29kZWMoY29tcG9uZW50KTsKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAod3NhODgxeC0+dHpfcGRhdGEudHpfZGV2KQorCQl3c2E4ODF4X2RlaW5pdF90aGVybWFsKHdzYTg4MXgtPnR6X3BkYXRhLnR6X2Rldik7CisJbXV0ZXhfZGVzdHJveSgmd3NhODgxeC0+YmdfbG9jayk7CisJbXV0ZXhfZGVzdHJveSgmd3NhODgxeC0+cmVzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICp3c2E4ODF4X2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKmNvbnRyb2wgPSBzd3JfZ2V0X2Rldl9kYXRhKHRvX3N3cl9kZXZpY2UoZGV2KSk7CisKKwlpZiAoIWNvbnRyb2wpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGNvbnRyb2wtPnJlZ21hcDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dzYTg4MXggPSB7CisJLmNvbnRyb2xzID0gd3NhODgxeF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod3NhODgxeF9zbmRfY29udHJvbHMpLAorCS5nZXRfcmVnbWFwID0gd3NhODgxeF9nZXRfcmVnbWFwLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkucHJvYmUgPSB3c2E4ODF4X3Byb2JlLAorCQkucmVtb3ZlID0gd3NhODgxeF9yZW1vdmUsCisJCS5kYXBtX3dpZGdldHMgPSB3c2E4ODF4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdzYTg4MXhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0gd3NhODgxeF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdzYTg4MXhfYXVkaW9fbWFwKSwKKwl9LAorfTsKKworc3RhdGljIGludCB3c2E4ODF4X3N3cl9zdGFydHVwKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KQoreworCWludCByZXQgPSAwOworCXU4IGRldm51bSA9IDA7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeDsKKworCXdzYTg4MXggPSBzd3JfZ2V0X2Rldl9kYXRhKHN3cl9kZXYpOworCWlmICghd3NhODgxeCkgeworCQlkZXZfZXJyKCZzd3JfZGV2LT5kZXYsICIlczogd3NhODgxeCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogQWRkIDVtc2VjIGRlbGF5IHRvIHByb3ZpZGUgc3VmZmljaWVudCB0aW1lIGZvcgorCSAqIHNvdW5kd2lyZSBhdXRvIGVudW1lcmF0aW9uIG9mIHNsYXZlIGRldmljZXMgYXMKKwkgKiBhcyBwZXIgSFcgcmVxdWlyZW1lbnQuCisJICovCisJdXNsZWVwX3JhbmdlKDUwMDAsIDUwMTApOworCXJldCA9IHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKHN3cl9kZXYsIHN3cl9kZXYtPmFkZHIsICZkZXZudW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmc3dyX2Rldi0+ZGV2LCAiJXMgZmFpbGVkIHRvIGdldCBkZXZudW0sIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisJc3dyX2Rldi0+ZGV2X251bSA9IGRldm51bTsKKworCXdzYTg4MXgtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3dyKHN3cl9kZXYsCisJCQkJCSAgICAgICAmd3NhODgxeF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHdzYTg4MXgtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUih3c2E4ODF4LT5yZWdtYXApOworCQlkZXZfZXJyKCZzd3JfZGV2LT5kZXYsICIlczogcmVnbWFwX2luaXQgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnN3cl9kZXYtPmRldiwgJnNvY19jb2RlY19kZXZfd3NhODgxeCwKKwkJCQkgICAgIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3dyX2Rldi0+ZGV2LCAiJXM6IENvZGVjIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9ncGlvX2N0cmwoc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAod3NhODgxeC0+cGRfZ3BpbyA8IDApIHsKKwkJZGV2X2Vycih3c2E4ODF4LT5kZXYsICIlczogZ3BpbyBpcyBub3QgdmFsaWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgd3NhODgxeC0+cGRfZ3Bpbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh3c2E4ODF4LT53c2FfcnN0X25wKSB7CisJCWlmIChlbmFibGUpCisJCQlyZXQgPSBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZSgKKwkJCQkJCQl3c2E4ODF4LT53c2FfcnN0X25wKTsKKwkJZWxzZQorCQkJcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKKwkJCQkJCQl3c2E4ODF4LT53c2FfcnN0X25wKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X2Vycih3c2E4ODF4LT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gdHVybiBzdGF0ZSAlZDsgcmV0PSVkXG4iLAorCQkJCV9fZnVuY19fLCBlbmFibGUsIHJldCk7CisJfSBlbHNlIHsKKwkJaWYgKGdwaW9faXNfdmFsaWQod3NhODgxeC0+cGRfZ3BpbykpCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQod3NhODgxeC0+cGRfZ3BpbywgZW5hYmxlKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfZ3Bpb19pbml0KHN0cnVjdCBzd3JfZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7CisKKwl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKKwlpZiAoIXdzYTg4MXgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGdwaW8gJWQgcmVxdWVzdCB3aXRoIG5hbWUgJXNcbiIsCisJCV9fZnVuY19fLCB3c2E4ODF4LT5wZF9ncGlvLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0KHdzYTg4MXgtPnBkX2dwaW8sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPT0gLUVCVVNZKSB7CisJCQkvKiBHUElPIHdhcyBhbHJlYWR5IHJlcXVlc3RlZCAqLworCQkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJCSAiJXM6IGdwaW8gJWQgaXMgYWxyZWFkeSBzZXQgdG8gaGlnaFxuIiwKKwkJCQkgX19mdW5jX18sIHdzYTg4MXgtPnBkX2dwaW8pOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBncGlvICVkLCBlcnI6ICVkXG4iLAorCQkJCV9fZnVuY19fLCB3c2E4ODF4LT5wZF9ncGlvLCByZXQpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9zd3JfcHJvYmUoc3RydWN0IHN3cl9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeDsKKworCXdzYTg4MXggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3c2E4ODF4X3ByaXYpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghd3NhODgxeCkKKwkJcmV0dXJuIC1FTk9NRU07CisJd3NhODgxeC0+d3NhX3JzdF9ucCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSAgICAgInFjb20sc3Brci1zZC1uLW5vZGUiLCAwKTsKKwlpZiAoIXdzYTg4MXgtPndzYV9yc3RfbnApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IE5vdCB1c2luZyBwaW5jdHJsLCBmYWxsYmFjayB0byBncGlvXG4iLAorCQkJX19mdW5jX18pOworCQl3c2E4ODF4LT5wZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgICJxY29tLHNwa3Itc2Qtbi1ncGlvIiwgMCk7CisJCWlmICh3c2E4ODF4LT5wZF9ncGlvIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6ICVzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgInFjb20sc3Brci1zZC1uLWdwaW8iLAorCQkJCXdzYTg4MXgtPnBkX2dwaW8pOworCQkJZ290byBlcnI7CisJCX0KKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IHJlc2V0IGdwaW8gJWRcbiIsIF9fZnVuY19fLAorCQkJd3NhODgxeC0+cGRfZ3Bpbyk7CisJfQorCXN3cl9zZXRfZGV2X2RhdGEocGRldiwgd3NhODgxeCk7CisKKwl3c2E4ODF4LT5zd3Jfc2xhdmUgPSBwZGV2OworCisJaWYgKCF3c2E4ODF4LT53c2FfcnN0X25wKSB7CisJCXJldCA9IHdzYTg4MXhfZ3Bpb19pbml0KHBkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCXdzYTg4MXhfZ3Bpb19jdHJsKHdzYTg4MXgsIHRydWUpOworCXdzYTg4MXgtPnN0YXRlID0gV1NBODgxWF9ERVZfVVA7CisKKwlpZiAoIWRlYnVnZnNfd3NhODgxeF9kZW50KSB7CisJCWRiZ3dzYTg4MXggPSB3c2E4ODF4OworCQlkZWJ1Z2ZzX3dzYTg4MXhfZGVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcigKKwkJCQkJCSJ3c2E4ODF4X3N3cl9zbGF2ZSIsIDApOworCQlpZiAoIUlTX0VSUihkZWJ1Z2ZzX3dzYTg4MXhfZGVudCkpIHsKKwkJCWRlYnVnZnNfcGVlayA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN3cnNsYXZlX3BlZWsiLAorCQkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc193c2E4ODF4X2RlbnQsCisJCQkJCSh2b2lkICopICJzd3JzbGF2ZV9wZWVrIiwKKwkJCQkJJmNvZGVjX2RlYnVnX29wcyk7CisKKwkJCWRlYnVnZnNfcG9rZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN3cnNsYXZlX3Bva2UiLAorCQkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc193c2E4ODF4X2RlbnQsCisJCQkJCSh2b2lkICopICJzd3JzbGF2ZV9wb2tlIiwKKwkJCQkJJmNvZGVjX2RlYnVnX29wcyk7CisKKwkJCWRlYnVnZnNfcmVnX2R1bXAgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKAorCQkJCQkJInN3cnNsYXZlX3JlZ19kdW1wIiwKKwkJCQkJCVNfSUZSRUcgfCAwNDQ0LAorCQkJCQkJZGVidWdmc193c2E4ODF4X2RlbnQsCisJCQkJCQkodm9pZCAqKSAic3dyc2xhdmVfcmVnX2R1bXAiLAorCQkJCQkJJmNvZGVjX2RlYnVnX29wcyk7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfc3dyX3JlbW92ZShzdHJ1Y3Qgc3dyX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4OworCisJd3NhODgxeCA9IHN3cl9nZXRfZGV2X2RhdGEocGRldik7CisJaWYgKCF3c2E4ODF4KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB3c2E4ODF4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZWJ1Z2ZzX3dzYTg4MXhfZGVudCk7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOworCWlmICh3c2E4ODF4LT5wZF9ncGlvKQorCQlncGlvX2ZyZWUod3NhODgxeC0+cGRfZ3Bpbyk7CisJc3dyX3NldF9kZXZfZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c2E4ODF4X3N3cl91cChzdHJ1Y3Qgc3dyX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7CisKKwl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKKwlpZiAoIXdzYTg4MXgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gd3NhODgxeF9ncGlvX2N0cmwod3NhODgxeCwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgZ3Bpb1xuIiwgX19mdW5jX18pOworCWVsc2UKKwkJd3NhODgxeC0+c3RhdGUgPSBXU0E4ODFYX0RFVl9VUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd3NhODgxeF9zd3JfZG93bihzdHJ1Y3Qgc3dyX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4OworCWludCByZXQ7CisKKwl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKKwlpZiAoIXdzYTg4MXgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGRlbGF5ZWRfd29ya19wZW5kaW5nKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmspKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndzYTg4MXgtPm9jcF9jdGxfd29yayk7CisJcmV0ID0gd3NhODgxeF9ncGlvX2N0cmwod3NhODgxeCwgZmFsc2UpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBncGlvXG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQl3c2E4ODF4LT5zdGF0ZSA9IFdTQTg4MVhfREVWX0RPV047CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfc3dyX3Jlc2V0KHN0cnVjdCBzd3JfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7CisJdTggcmV0cnkgPSBXU0E4ODFYX05VTV9SRVRSWTsKKwl1OCBkZXZudW0gPSAwOworCisJd3NhODgxeCA9IHN3cl9nZXRfZGV2X2RhdGEocGRldik7CisJaWYgKCF3c2E4ODF4KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB3c2E4ODF4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdzYTg4MXgtPmJnX2NudCA9IDA7CisJd3NhODgxeC0+Y2xrX2NudCA9IDA7CisJd2hpbGUgKHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKHBkZXYsIHBkZXYtPmFkZHIsICZkZXZudW0pICYmIHJldHJ5LS0pIHsKKwkJLyogUmV0cnkgYWZ0ZXIgMSBtc2VjIGRlbGF5ICovCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKKwl9CisJcmVnY2FjaGVfbWFya19kaXJ0eSh3c2E4ODF4LT5yZWdtYXApOworCXJlZ2NhY2hlX3N5bmMod3NhODgxeC0+cmVnbWFwKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB3c2E4ODF4X3N3cl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gc3VzcGVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzYTg4MXhfc3dyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHN3cl9nZXRfZGV2X2RhdGEodG9fc3dyX2RldmljZShkZXYpKTsKKworCWlmICghd3NhODgxeCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiB3c2E4ODF4IHByaXZhdGUgZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gcmVzdW1lXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB3c2E4ODF4X3N3cl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMod3NhODgxeF9zd3Jfc3VzcGVuZCwgd3NhODgxeF9zd3JfcmVzdW1lKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzd3JfZGV2aWNlX2lkIHdzYTg4MXhfc3dyX2lkW10gPSB7CisJeyJ3c2E4ODF4IiwgMH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdzYTg4MXhfc3dyX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgiLAorCX0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3dyX2RyaXZlciB3c2E4ODF4X2NvZGVjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3c2E4ODF4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZ3c2E4ODF4X3N3cl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdzYTg4MXhfc3dyX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gd3NhODgxeF9zd3JfcHJvYmUsCisJLnJlbW92ZSA9IHdzYTg4MXhfc3dyX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3c2E4ODF4X3N3cl9pZCwKKwkuZGV2aWNlX3VwID0gd3NhODgxeF9zd3JfdXAsCisJLmRldmljZV9kb3duID0gd3NhODgxeF9zd3JfZG93biwKKwkucmVzZXRfZGV2aWNlID0gd3NhODgxeF9zd3JfcmVzZXQsCisJLnN0YXJ0dXAgPSB3c2E4ODF4X3N3cl9zdGFydHVwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd3NhODgxeF9jb2RlY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHN3cl9kcml2ZXJfcmVnaXN0ZXIoJndzYTg4MXhfY29kZWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdzYTg4MXhfY29kZWNfZXhpdCh2b2lkKQoreworCXN3cl9kcml2ZXJfdW5yZWdpc3Rlcigmd3NhODgxeF9jb2RlY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh3c2E4ODF4X2NvZGVjX2luaXQpOworbW9kdWxlX2V4aXQod3NhODgxeF9jb2RlY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJXU0E4ODF4IENvZGVjIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmggYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIzNGFjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmgKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1dTQTg4MVhfSAorI2RlZmluZSBfV1NBODgxWF9ICisKKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSAid3NhODgxeC1yZWdpc3RlcnMuaCIKKworI2RlZmluZSBXU0E4ODFYX01BWF9TV1JfUE9SVFMgICA0CisKK2V4dGVybiBpbnQgd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1OCAqcG9ydCwKKwkJCQl1OCBudW1fcG9ydCwgdW5zaWduZWQgaW50ICpjaF9tYXNrLAorCQkJCXVuc2lnbmVkIGludCAqY2hfcmF0ZSk7CisKK2V4dGVybiBjb25zdCB1OCB3c2E4ODF4X3JlZ19yZWFkYWJsZVtXU0E4ODFYX0NBQ0hFX1NJWkVdOworZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIHdzYTg4MXhfcmVnbWFwX2NvbmZpZzsKK2V4dGVybiBpbnQgd3NhODgxeF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSgKKwkJCQkJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpjb2RlY19yb290LAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCB3c2E4ODF4X3JlZ21hcF9kZWZhdWx0cyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIHU4IHZlcnNpb24pOworCisjZW5kaWYgLyogX1dTQTg4MVhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9LY29uZmlnIGIvc291bmQvc29jL21zbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL0tjb25maWcKQEAgLTAsMCArMSwyNjQgQEAKK21lbnUgIk1TTSBTb0MgQXVkaW8gc3VwcG9ydCIKKworY29uZmlnIFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX01TTV9RRFNQNlYyX0lOVEYKKwlib29sICJTb0MgUTYgYXVkaW8gZHJpdmVyIGZvciBNU00vQVBRIgorCWRlcGVuZHMgb24gTVNNX1FEU1A2X0FQUlYyX0dMSU5LCisJaGVscAorCSBUbyBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIE1TTS9BUFEuCisJIFRoaXMgd2lsbCBlbmFibGUgYWxsIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYworCSBpbnRlcmFjdGlvbnMgdG93YXJkcyBEU1AuIEl0IGluY2x1ZGVzIGFzbSwKKwkgYWRtIGFuZCBhZmUgaW50ZXJmYWNlcyBvbiB0aGUgRFNQLgorCitjb25maWcgU05EX1NPQ19RRFNQNlYyCisJdHJpc3RhdGUgIlNvQyBBTFNBIGF1ZGlvIGRyaXZlciBmb3IgUURTUDZWMiIKKwlzZWxlY3QgU05EX1NPQ19NU01fUURTUDZWMl9JTlRGCisJc2VsZWN0IFNORF9TT0NfQ09NUFJFU1MKKwloZWxwCisJIFRvIGFkZCBzdXBwb3J0IGZvciBNU00gUURTUDZWMiBTb2MgQXVkaW8uCisJIFRoaXMgd2lsbCBlbmFibGUgc291bmQgc29jIHBsYXRmb3JtIHNwZWNpZmljCisJIGF1ZGlvIGRyaXZlcnMuIFRoaXMgaW5jbHVkZXMgcTZhc20sIHE2YWRtLAorCSBxNmFmZSBpbnRlcmZhY2VzIHRvIERTUCB1c2luZyBhcHIuCisKK2NvbmZpZyBTTkRfU09DX1FEU1BfREVCVUcKKwlib29sICJRRFNQIEF1ZGlvIERyaXZlciBEZWJ1ZyBGZWF0dXJlIgorCWhlbHAKKwkgQ29uZmlndXJhdGlvbiB0byBlbmFibGUgZGVidWdnaW5nIHV0aWxpdGllcyBmb3IKKwkgUURTUDYgYmFzZWQgYXVkaW8gZHJpdmVycy4gT25lIGRlYnVnZ2luZyB1dGlsaXR5CisJIGlzIGluZHVjaW5nIGtlcm5lbCBwYW5pYyB1cG9uIGVuY291bnRlcmluZyBjcml0aWNhbAorCSBlcnJvcnMgZnJvbSBEU1AgYXVkaW8gbW9kdWxlcworCitjb25maWcgRE9MQllfREFQCisJYm9vbCAiRW5hYmxlIERvbGJ5IERBUCIKKwlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgorCWhlbHAKKwkgVG8gYWRkIHN1cHBvcnQgZm9yIGRvbGJ5IERBUCBwb3N0IHByb2Nlc3NpbmcuCisJIFRoaXMgc3VwcG9ydCBpcyB0byBjb25maWd1cmUgdGhlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzCisJIHRvIERTUC4gVGhlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc2VuZGluZyB0aGUgZW5kIHBvaW50CisJIGRldmljZSwgZW5kIHBvaW50IGRlcGVuZGVudCBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyBhbmQKKwkgdGhlIHZhcmlvdXMgcG9zcnQgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzCisKK2NvbmZpZyBET0xCWV9EUzIKKwlib29sICJFbmFibGUgRG9sYnkgRFMyIgorCWRlcGVuZHMgb24gU05EX1NPQ19NU01fUURTUDZWMl9JTlRGCisJaGVscAorCSBUbyBhZGQgc3VwcG9ydCBmb3IgZG9sYnkgREFQIHBvc3QgcHJvY2Vzc2luZy4KKwkgVGhpcyBzdXBwb3J0IGlzIHRvIGNvbmZpZ3VyZSB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMKKwkgdG8gRFNQLiBUaGUgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZW5kaW5nIHRoZSBlbmQgcG9pbnQKKwkgZGV2aWNlLCBlbmQgcG9pbnQgZGVwZW5kZW50IHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIGFuZAorCSB0aGUgdmFyaW91cyBwb3NydCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMKKworY29uZmlnIERUU19FQUdMRQorCWJvb2wgIkVuYWJsZSBEVFMgRWFnbGUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgorCXNlbGVjdCBTTkRfSFdERVAKKwloZWxwCisJIFRvIGFkZCBEVFMgRWFnbGUgc3VwcG9ydCBvbiBRRFNQNiB0YXJnZXRzLgorCSBFYWdsZSBpcyBhIERUUyBwcmUvcG9zdCBwcm9jZXNzaW5nCisJIHBhY2thZ2UgdGhhdCBpbmNsdWRlcyBIZWFkcGhvbmVYLiBUaGUgY29uZmlndXJhdGlvbgorCSBpbmNsdWRlcyBzZW5kaW5nIHR1bmluZyBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgbW9kdWxlcy4KKworY29uZmlnIERUU19TUlNfVE0KKwlib29sICJFbmFibGUgRFRTIFNSUyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgorCWhlbHAKKwkgVG8gYWRkIHN1cHBvcnQgZm9yIERUUyBTUlMgcG9zdCBwcm9jZXNzaW5nLgorCSBUaGlzIHN1cHBvcnQgaXMgdG8gY29uZmlndXJlIHRoZSBwb3N0IHByb2Nlc3NpbmcKKwkgcGFyYW1ldGVycyB0byBEU1AuIFRoZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNlbmRpbmcKKwkgdHVuaW5nIHBhcmFtZXRlcnMgb2YgdmFyaW91cyBtb2R1bGVzLgorCitjb25maWcgUVRJX1BQCisJYm9vbCAiRW5hYmxlIFFUSSBQUCIKKwlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgorCWhlbHAKKwkgVG8gYWRkIHN1cHBvcnQgZm9yIGRlZmF1bHQgUVRJIHBvc3QgcHJvY2Vzc2luZy4KKwkgVGhpcyBzdXBwb3J0IGlzIHRvIGNvbmZpZ3VyZSB0aGUgcG9zdCBwcm9jZXNzaW5nCisJIHBhcmFtZXRlcnMgdG8gRFNQLiBUaGUgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZW5kaW5nCisJIHR1bmluZyBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgbW9kdWxlcyBzdWNoIGFzIGVxdWFsaXplciwKKwkgY3VzdG9taXplZCBtaXhpbmcuCisKK2NvbmZpZyBRVElfUFBfQVVESU9TUEhFUkUKKwlib29sICJFbmFibGUgUVRJIEFVRElPU1BIRVJFIFBQIgorCWRlcGVuZHMgb24gU05EX1NPQ19NU01fUURTUDZWMl9JTlRGCisJaGVscAorCSBUbyBhZGQgc3VwcG9ydCBmb3IgUVRJIGF1ZGlvIHNwaGVyZSBwb3N0IHByb2Nlc3NpbmcuCisJIFRoaXMgc3VwcG9ydCBpcyB0byBjb25maWd1cmUgdGhlIHBvc3QgcHJvY2Vzc2luZworCSBwYXJhbWV0ZXJzIHRvIERTUC4gVGhlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc2VuZGluZworCSB0dW5pbmcgcGFyYW1ldGVycyBvZiBhdWRpbyBzcGhlcmUgbW9kdWxlLgorCitjb25maWcgU05EX1NPQ19DUEUKKwl0cmlzdGF0ZSAiQ1BFIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBTTkRfU09DX1dDRF9DUEUKKwloZWxwCisJIFRvIGFkZCBzdXBwb3J0IGZvciBDb2RlYyBQcm9jZXNzaW5nIEVuZ2luZS4gVGhpcyBzdXBwb3J0CisJIGlzIHRvIGVuYWJsZSBDUEUgYmxvY2sgb24gdGhlIGNvZGVjIGFuZCB0aGlzIGNvbmZpZyBuZWVkcworCSB0byBiZSBhZGRlZCB0byBjb2RlY3MgdGhhdCBjb250YWluIHRoZSBDUEUgaGFyZHdhcmUgYmxvY2suCisJIFRoZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHRoZSBjcGUgbHNtIGRyaXZlciB0byBlbmFibGUKKwkgbGlzdGVuIG9uIGNvZGVjLgorCitjb25maWcgU05EX1NPQ19JTlRfQ09ERUMKKwl0cmlzdGF0ZSAiU29DIE1hY2hpbmUgZHJpdmVyIGZvciBNU01GQUxDT05fSU5UIgorCWRlcGVuZHMgb24gQVJDSF9RQ09NCisJc2VsZWN0IFNORF9TT0NfUURTUDZWMgorCXNlbGVjdCBTTkRfU09DX01TTV9TVFVCCisJc2VsZWN0IFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQorCXNlbGVjdCBTTkRfRFlOQU1JQ19NSU5PUlMKKwlzZWxlY3QgTVNNX1FEU1A2X0FQUlYyX0dMSU5LCisJc2VsZWN0IE1TTV9RRFNQNl9TU1IKKwlzZWxlY3QgTVNNX1FEU1A2X1BEUgorCXNlbGVjdCBNU01fUURTUDZfTk9USUZJRVIKKwlzZWxlY3QgTVNNX1FEU1A2VjJfQ09ERUNTCisJc2VsZWN0IFNORF9TT0NfTVNNX1NXUgorCXNlbGVjdCBTTkRfU09DX01TTThYMTZfV0NECisJc2VsZWN0IFFUSV9QUAorCXNlbGVjdCBEVFNfU1JTX1RNCisJc2VsZWN0IERPTEJZX0RBUAorCXNlbGVjdCBET0xCWV9EUzIKKwlzZWxlY3QgU05EX0hXREVQCisJc2VsZWN0IE1TTV9VTFRSQVNPVU5ECisJc2VsZWN0IERUU19FQUdMRQorCXNlbGVjdCBTTkRfU09DX01TTUZBTENPTl9DT01NT04KKwlzZWxlY3QgU05EX1NPQ19DT01QUkVTUworCWhlbHAKKwlUbyBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIE1TTV9JTlQuCisJVGhpcyB3aWxsIGVuYWJsZSBzb3VuZCBzb2MgZHJpdmVycyB3aGljaAorCWludGVyZmFjZXMgd2l0aCBEU1AsIGFsc28gaXQgd2lsbCBlbmFibGUKKwl0aGUgbWFjaGluZSBkcml2ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJREFJLWxpbmtzCisKK2NvbmZpZyBTTkRfU09DX0VYVF9DT0RFQworCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIE1TTUZBTENPTl9FWFQiCisJZGVwZW5kcyBvbiBBUkNIX1FDT00KKwlzZWxlY3QgU05EX1NPQ19RRFNQNlYyCisJc2VsZWN0IFNORF9TT0NfTVNNX1NUVUIKKwlzZWxlY3QgU05EX1NPQ19NU01fSE9TVExFU1NfUENNCisJc2VsZWN0IFNORF9EWU5BTUlDX01JTk9SUworCXNlbGVjdCBNU01fUURTUDZfQVBSVjJfR0xJTksKKwlzZWxlY3QgTVNNX1FEU1A2X1NTUgorCXNlbGVjdCBNU01fUURTUDZfUERSCisJc2VsZWN0IE1TTV9RRFNQNl9OT1RJRklFUgorCXNlbGVjdCBNU01fUURTUDZWMl9DT0RFQ1MKKwlzZWxlY3QgU05EX1NPQ19XQ0Q5MzM1CisJc2VsZWN0IFNORF9TT0NfV0NEOTM0WAorCXNlbGVjdCBTTkRfU09DX1dTQTg4MVgKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgUVRJX1BQCisJc2VsZWN0IERUU19TUlNfVE0KKwlzZWxlY3QgRE9MQllfREFQCisJc2VsZWN0IERPTEJZX0RTMgorCXNlbGVjdCBTTkRfU09DX0NQRQorCXNlbGVjdCBTTkRfU09DX1dDRF9DUEUKKwlzZWxlY3QgU05EX0hXREVQCisJc2VsZWN0IE1TTV9VTFRSQVNPVU5ECisJc2VsZWN0IERUU19FQUdMRQorCXNlbGVjdCBTTkRfU09DX01TTUZBTENPTl9DT01NT04KKwlzZWxlY3QgU05EX1NPQ19DT01QUkVTUworCWhlbHAKKwlUbyBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIE1TTV9FWFQuCisJVGhpcyB3aWxsIGVuYWJsZSBzb3VuZCBzb2MgZHJpdmVycyB3aGljaAorCWludGVyZmFjZXMgd2l0aCBEU1AsIGFsc28gaXQgd2lsbCBlbmFibGUKKwl0aGUgbWFjaGluZSBkcml2ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJREFJLWxpbmtzCisKK2NvbmZpZyBTTkRfU09DX01TTTg5OTYKKwl0cmlzdGF0ZSAiU29DIE1hY2hpbmUgZHJpdmVyIGZvciBNU004OTk2IGJvYXJkcyIKKwlkZXBlbmRzIG9uIEFSQ0hfTVNNODk5NgorCXNlbGVjdCBTTkRfU09DX0NPTVBSRVNTCisJc2VsZWN0IFNORF9TT0NfUURTUDZWMgorCXNlbGVjdCBTTkRfU09DX01TTV9TVFVCCisJc2VsZWN0IFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQorCXNlbGVjdCBTTkRfRFlOQU1JQ19NSU5PUlMKKwlzZWxlY3QgTVNNX1FEU1A2X0FQUlYyCisJc2VsZWN0IE1TTV9RRFNQNlYyX0NPREVDUworCXNlbGVjdCBTTkRfU09DX1dDRDkzMzUKKwlzZWxlY3QgU05EX1NPQ19XU0E4ODFYCisJc2VsZWN0IFNORF9TT0NfTVNNX0hETUlfQ09ERUNfUlgKKwlzZWxlY3QgRFRTX1NSU19UTQorCXNlbGVjdCBRVElfUFAKKwlzZWxlY3QgUVRJX1BQX0FVRElPU1BIRVJFCisJc2VsZWN0IFNORF9TT0NfQ1BFCisJc2VsZWN0IE1TTV9VTFRSQVNPVU5ECisJc2VsZWN0IERPTEJZX0RTMgorCXNlbGVjdCBTTkRfSFdERVAKKyAgICAgICAgc2VsZWN0IERUU19FQUdMRQorCWhlbHAKKwkgVG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBNU004OTk2LgorCSBUaGlzIHdpbGwgZW5hYmxlIHNvdW5kIHNvYyBkcml2ZXJzIHdoaWNoCisJIGludGVyZmFjZXMgd2l0aCBEU1AsIGFsc28gaXQgd2lsbCBlbmFibGUKKwkgdGhlIG1hY2hpbmUgZHJpdmVyIGFuZCB0aGUgY29ycmVzcG9uZGluZworCSBEQUktbGlua3MKKworY29uZmlnIFNORF9TT0NfTVNNODk5OAorCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIE1TTTg5OTggYm9hcmRzIgorCWRlcGVuZHMgb24gQVJDSF9RQ09NCisJc2VsZWN0IFNORF9TT0NfQ09NUFJFU1MKKwlzZWxlY3QgU05EX1NPQ19RRFNQNlYyCisJc2VsZWN0IFNORF9TT0NfTVNNX1NUVUIKKwlzZWxlY3QgU05EX1NPQ19NU01fSE9TVExFU1NfUENNCisJc2VsZWN0IFNORF9EWU5BTUlDX01JTk9SUworCXNlbGVjdCBNU01fUURTUDZfQVBSVjJfR0xJTksKKwlzZWxlY3QgTVNNX1FEU1A2X1NTUgorCXNlbGVjdCBNU01fUURTUDZfUERSCisJc2VsZWN0IE1TTV9RRFNQNl9OT1RJRklFUgorCXNlbGVjdCBNU01fUURTUDZWMl9DT0RFQ1MKKwlzZWxlY3QgU05EX1NPQ19XQ0Q5MzM1CisJc2VsZWN0IFNORF9TT0NfV0NEOTM0WAorCXNlbGVjdCBTTkRfU09DX1dTQTg4MVgKKwlzZWxlY3QgU05EX1NPQ19NU01fSERNSV9DT0RFQ19SWAorCXNlbGVjdCBEVFNfU1JTX1RNCisJc2VsZWN0IFFUSV9QUAorCXNlbGVjdCBTTkRfU09DX0NQRQorCXNlbGVjdCBNU01fVUxUUkFTT1VORAorCXNlbGVjdCBET0xCWV9EUzIKKwlzZWxlY3QgU05EX0hXREVQCisgICAgICAgIHNlbGVjdCBEVFNfRUFHTEUKKwloZWxwCisJIFRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTVNNODk5OC4KKwkgVGhpcyB3aWxsIGVuYWJsZSBzb3VuZCBzb2MgZHJpdmVycyB3aGljaAorCSBpbnRlcmZhY2VzIHdpdGggRFNQLCBhbHNvIGl0IHdpbGwgZW5hYmxlCisJIHRoZSBtYWNoaW5lIGRyaXZlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKwkgREFJLWxpbmtzCisKK2NvbmZpZyBTTkRfU09DX0ZBTENPTgorCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIE1TTUZBTENPTiBib2FyZHMiCisJZGVwZW5kcyBvbiBBUkNIX01TTUZBTENPTgorCXNlbGVjdCBTTkRfU09DX0lOVF9DT0RFQworCXNlbGVjdCBTTkRfU09DX0VYVF9DT0RFQworCWhlbHAKKwkgVG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBNU01GQUxDT04uCisJIFRoaXMgd2lsbCBlbmFibGUgc291bmQgc29jIGRyaXZlcnMgd2hpY2gKKwkgaW50ZXJmYWNlcyB3aXRoIERTUCwgYWxzbyBpdCB3aWxsIGVuYWJsZQorCSB0aGUgbWFjaGluZSBkcml2ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJIERBSS1saW5rcworCitjb25maWcgU05EX1NPQ19NU01TS1VOSworCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIE1TTVNLVU5LIGJvYXJkcyIKKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTQorCXNlbGVjdCBTTkRfU09DX0NPTVBSRVNTCisJc2VsZWN0IFNORF9TT0NfUURTUDZWMgorCXNlbGVjdCBTTkRfU09DX01TTV9TVFVCCisJc2VsZWN0IFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQorCXNlbGVjdCBTTkRfRFlOQU1JQ19NSU5PUlMKKwlzZWxlY3QgTVNNX1FEU1A2X0FQUlYyX0dMSU5LCisJc2VsZWN0IE1TTV9RRFNQNl9TU1IKKwlzZWxlY3QgTVNNX1FEU1A2X1BEUgorCXNlbGVjdCBNU01fUURTUDZfTk9USUZJRVIKKwlzZWxlY3QgTVNNX1FEU1A2VjJfQ09ERUNTCisJc2VsZWN0IFNORF9TT0NfV0NEOTM0WAorCXNlbGVjdCBTTkRfU09DX1dTQTg4MVgKKwlzZWxlY3QgU05EX1NPQ19NU01fSERNSV9DT0RFQ19SWAorCXNlbGVjdCBEVFNfU1JTX1RNCisJc2VsZWN0IFFUSV9QUAorCXNlbGVjdCBNU01fVUxUUkFTT1VORAorCXNlbGVjdCBET0xCWV9EUzIKKwlzZWxlY3QgU05EX0hXREVQCisgICAgICAgIHNlbGVjdCBEVFNfRUFHTEUKKwloZWxwCisJIFRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTVNNU0tVTksuCisJIFRoaXMgZW5hYmxlcyBzb3VuZCBzb2MgZHJpdmVycyB0aGF0IGludGVyZmFjZXMKKwkgd2l0aCBEU1AuIFRoaXMgYWxzbyBlbmFibGVzIHRoZSBtYWNoaW5lIGRyaXZlcgorCSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgREFJLWxpbmtzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL01ha2VmaWxlIGIvc291bmQvc29jL21zbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGNlZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjIE1TTSBNYWNoaW5lIFN1cHBvcnQKKworc25kLXNvYy1ob3N0bGVzcy1wY20tb2JqcyA6PSBtc20tcGNtLWhvc3RsZXNzLm8KK29iai0kKENPTkZJR19TTkRfU09DX01TTV9IT1NUTEVTU19QQ00pICs9IHNuZC1zb2MtaG9zdGxlc3MtcGNtLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNX1FEU1A2VjJfSU5URikgKz0gcWRzcDZ2Mi8KKworc25kLXNvYy1xZHNwNnYyLW9ianMgOj0gbXNtLWRhaS1mZS5vCitvYmotJChDT05GSUdfU05EX1NPQ19RRFNQNlYyKSArPSBzbmQtc29jLXFkc3A2djIubworCisjZm9yIENQRSBkcml2ZXJzCitzbmQtc29jLWNwZS1vYmpzIDo9IG1zbS1jcGUtbHNtLm8KK29iai0kKENPTkZJR19TTkRfU09DX0NQRSkgKz0gc25kLXNvYy1jcGUubworCisjIGZvciBNU004OTk2IHNvdW5kIGNhcmQgZHJpdmVyCitzbmQtc29jLW1zbTg5OTYtb2JqcyA6PSBtc204OTk2Lm8KK29iai0kKENPTkZJR19TTkRfU09DX01TTTg5OTYpICs9IHNuZC1zb2MtbXNtODk5Ni5vCisKKyMgZm9yIE1TTTg5OTggc291bmQgY2FyZCBkcml2ZXIKK3NuZC1zb2MtbXNtODk5OC1vYmpzIDo9IG1zbTg5OTgubworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNODk5OCkgKz0gc25kLXNvYy1tc204OTk4Lm8KKworIyBmb3IgTVNNRkFMQ09OIHNvdW5kIGNhcmQgZHJpdmVyCitzbmQtc29jLW1zbWZhbGNvbi1jb21tb24tb2JqcyA6PSBtc20tYXVkaW8tcGluY3RybC5vIG1zbWZhbGNvbi1jb21tb24ubworb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNRkFMQ09OX0NPTU1PTikgKz0gc25kLXNvYy1tc21mYWxjb24tY29tbW9uLm8KKworIyBmb3IgTVNNRkFMQ09OIHNvdW5kIGNhcmQgZHJpdmVyCitzbmQtc29jLWludC1jb2RlYy1vYmpzIDo9IG1zbWZhbGNvbi1pbnRlcm5hbC5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRfQ09ERUMpICs9IHNuZC1zb2MtbXNtZmFsY29uLWNvbW1vbi5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRfQ09ERUMpICs9IHNuZC1zb2MtaW50LWNvZGVjLm8KKworIyBmb3IgTVNNRkFMQ09OIHNvdW5kIGNhcmQgZHJpdmVyCitzbmQtc29jLWV4dC1jb2RlYy1vYmpzIDo9IG1zbWZhbGNvbi1leHRlcm5hbC5vIG1zbWZhbGNvbi1leHQtZGFpLWxpbmtzLm8KK29iai0kKENPTkZJR19TTkRfU09DX0VYVF9DT0RFQykgKz0gc25kLXNvYy1tc21mYWxjb24tY29tbW9uLm8KK29iai0kKENPTkZJR19TTkRfU09DX0VYVF9DT0RFQykgKz0gc25kLXNvYy1leHQtY29kZWMubworCisjIGZvciBNU01TS1VOSyBzb3VuZCBjYXJkIGRyaXZlcgorc25kLXNvYy1tc21za3Vuay1vYmpzIDo9IG1zbXNrdW5rLm8KK29iai0kKENPTkZJR19TTkRfU09DX01TTVNLVU5LKSArPSBzbmQtc29jLW1zbXNrdW5rLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vZGV2aWNlX2V2ZW50LmggYi9zb3VuZC9zb2MvbXNtL2RldmljZV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOGQxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL2RldmljZV9ldmVudC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fREVWSUNFX0VWRU5UX0gKKyNkZWZpbmUgX19ERVZJQ0VfRVZFTlRfSAorCisjZGVmaW5lIFFDX0FVRElPX0VYVEVSTkFMX1NQS18xX0VWRU5UICJxY19leHRfc3BrXzEiCisjZGVmaW5lIFFDX0FVRElPX0VYVEVSTkFMX1NQS18yX0VWRU5UICJxY19leHRfc3BrXzIiCisjZGVmaW5lIFFDX0FVRElPX0VYVEVSTkFMX01JQ19FVkVOVCAicWNfZXh0X21pYyIKKworI2VuZGlmIC8qIF9fREVWSUNFX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtLWF1ZGlvLXBpbmN0cmwuYyBiL3NvdW5kL3NvYy9tc20vbXNtLWF1ZGlvLXBpbmN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZiYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc20tYXVkaW8tcGluY3RybC5jCkBAIC0wLDAgKzEsMzE2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlICJtc20tYXVkaW8tcGluY3RybC5oIgorCisvKgorICogcGluY3RybCAtLSBoYW5kbGUgdG8gcXVlcnkgcGluY3RybCBhcGlzCisgKiBjZGMgbGluZXMgLS0gc3RvcmVzIHBpbmN0cmwgaGFuZGxlcyBmb3IgcGluY3RybCBzdGF0ZXMKKyAqIGFjdGl2ZV9zZXQgLS0gbWFpbnRhaW4gdGhlIG92ZXJhbGwgcGluY3RybCBzdGF0ZQorICovCitzdHJ1Y3QgY2RjX3BpbmN0cmxfaW5mbyB7CisJc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKipjZGNfbGluZXM7CisJaW50IGFjdGl2ZV9zZXQ7Cit9OworCisvKgorICogZ3Bpb3NldHMgLS0gc3RvcmVzIGFsbCBncGlvc2V0cyBtZW50aW9uZWQgaW4gZHRzaSBmaWxlCisgKiBncGlvc2V0c19jb21iX25hbWVzIC0tIHN0b3JlcyBhbGwgcG9zc2libGUgZ3Bpb3NldCBjb21iaW5hdGlvbnMKKyAqIGdwaW9zZXRfc3RhdGUgLS0gbWFpbnRhaW5zIGNvdW50ZXIgZm9yIGVhY2ggZ3Bpb3NldAorICogZ3Bpb3NldHNfbWF4IC0tIG1haW50YWluIHRoZSB0b3RhbCBzdXBwb3J0ZWQgZ3Bpb3NldHMKKyAqIGdwaW9zZXRzX2NvbWJfbWF4IC0tIG1haW50YWluIHRoZSB0b3RhbCBncGlvc2V0cyBjb21iaW5hdGlvbnMKKyAqLworc3RydWN0IGNkY19ncGlvc2V0X2luZm8geworCWNoYXIgKipncGlvc2V0czsKKwljaGFyICoqZ3Bpb3NldHNfY29tYl9uYW1lczsKKwl1aW50OF90ICpncGlvc2V0X3N0YXRlOworCWludCBncGlvc2V0c19tYXg7CisJaW50IGdwaW9zZXRzX2NvbWJfbWF4OworfTsKKworc3RhdGljIHN0cnVjdCBjZGNfcGluY3RybF9pbmZvIHBpbmN0cmxfaW5mb1tNQVhfUElOQ1RSTF9DTElFTlRdOworc3RhdGljIHN0cnVjdCBjZGNfZ3Bpb3NldF9pbmZvIGdwaW9zZXRfaW5mb1tNQVhfUElOQ1RSTF9DTElFTlRdOworCisvKiBGaW5kcyB0aGUgaW5kZXggZm9yIHRoZSBncGlvIHNldCBpbiB0aGUgZHRzaSBmaWxlICovCitpbnQgbXNtX2dldF9ncGlvc2V0X2luZGV4KGVudW0gcGluY3RybF9jbGllbnQgY2xpZW50LCBjaGFyICprZXl3b3JkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX21heDsgaSsrKSB7CisJCWlmICghKHN0cmNtcChncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c1tpXSwga2V5d29yZCkpKQorCQkJYnJlYWs7CisJfQorCS8qIENoZWNraW5nIGlmIHRoZSBrZXl3b3JkIGlzIHByZXNlbnQgaW4gZHRzaSBvciBub3QgKi8KKwlpZiAoaSAhPSBncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c19tYXgpCisJCXJldHVybiBpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBmb2xsb3dpbmcgZnJvbSBkdHNpIGZpbGUKKyAqIDEuIEFsbCBncGlvIHNldHMKKyAqIDIuIEFsbCBjb21iaW5hdGlvbnMgb2YgZ3BpbyBzZXRzCisgKiAzLiBQaW5jdHJsIGhhbmRsZXMgdG8gZ3BpbyBzZXRzCisgKgorICogUmV0dXJucyBlcnJvciBpZiB0aGVyZSBpcworICogMS4gUHJvYmxlbSByZWFkaW5nIGZyb20gZHRzaSBmaWxlCisgKiAyLiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgKi8KK2ludCBtc21fZ3Bpb3NldF9pbml0aWFsaXplKGVudW0gcGluY3RybF9jbGllbnQgY2xpZW50LAorCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwljb25zdCBjaGFyICpncGlvc2V0X25hbWVzID0gInFjb20sbXNtLWdwaW9zIjsKKwljb25zdCBjaGFyICpncGlvc2V0X2NvbWJpbmF0aW9ucyA9ICJxY29tLHBpbmN0cmwtbmFtZXMiOworCWNvbnN0IGNoYXIgKmdwaW9zZXRfbmFtZXNfc3RyID0gTlVMTDsKKwljb25zdCBjaGFyICpncGlvc2V0X2NvbWJfc3RyID0gTlVMTDsKKwlpbnQgbnVtX3N0cmluZ3MgPSAwOworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCXBpbmN0cmwgPSBkZXZtX3BpbmN0cmxfZ2V0KGRldik7CisJaWYgKElTX0VSUihwaW5jdHJsKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHBpbmN0cmwgaGFuZGxlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBpbmN0cmxfaW5mb1tjbGllbnRdLnBpbmN0cmwgPSBwaW5jdHJsOworCisJLyogUmVhZGluZyBvZiBncGlvIHNldHMgKi8KKwludW1fc3RyaW5ncyA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGV2LT5vZl9ub2RlLAorCQkJCQkJZ3Bpb3NldF9uYW1lcyk7CisJaWYgKG51bV9zdHJpbmdzIDwgMCkgeworCQlkZXZfZXJyKGRldiwKKwkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlIG9yIGxlbmd0aCBpcyBpbmNvcnJlY3RcbiIsCisJCQkJX19mdW5jX18sIGdwaW9zZXRfbmFtZXMpOworCQlnb3RvIGVycjsKKwl9CisJZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfbWF4ID0gbnVtX3N0cmluZ3M7CisJZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX21heCAqCisJCQkJCXNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBncGlvIHNldCBuYW1lc1xuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fc3RyaW5nczsgaSsrKSB7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KGRldi0+b2Zfbm9kZSwKKwkJCQkJZ3Bpb3NldF9uYW1lcywgaSwgJmdwaW9zZXRfbmFtZXNfc3RyKTsKKworCQlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c1tpXSA9IGRldm1fa3phbGxvYyhkZXYsCisJCQkJKHN0cmxlbihncGlvc2V0X25hbWVzX3N0cikgKyAxKSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c1tpXSkgeworCQkJZGV2X2VycihkZXYsICIlczogQ2FuJ3QgYWxsb2NhdGUgZ3Bpb3NldHNbJWRdIGRhdGFcbiIsCisJCQkJCQlfX2Z1bmNfXywgaSk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJc3RybGNweShncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c1tpXSwKKwkJCQlncGlvc2V0X25hbWVzX3N0ciwgc3RybGVuKGdwaW9zZXRfbmFtZXNfc3RyKSsxKTsKKwkJZ3Bpb3NldF9uYW1lc19zdHIgPSBOVUxMOworCX0KKwludW1fc3RyaW5ncyA9IDA7CisKKwkvKiBBbGxvY2F0aW5nIG1lbW9yeSBmb3IgZ3BpbyBzZXQgY291bnRlciAqLworCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGUgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX21heCAqCisJCQkJc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGUpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdwaW8gc2V0IGNvdW50ZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBSZWFkaW5nIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgZ3BpbyBzZXRzICovCisJbnVtX3N0cmluZ3MgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKGRldi0+b2Zfbm9kZSwKKwkJCQkJCWdwaW9zZXRfY29tYmluYXRpb25zKTsKKwlpZiAobnVtX3N0cmluZ3MgPCAwKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIiVzOiBtaXNzaW5nICVzIGluIGR0IG5vZGUgb3IgbGVuZ3RoIGlzIGluY29ycmVjdFxuIiwKKwkJCV9fZnVuY19fLCBncGlvc2V0X2NvbWJpbmF0aW9ucyk7CisJCWdvdG8gZXJyOworCX0KKwlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c19jb21iX21heCA9IG51bV9zdHJpbmdzOworCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX2NvbWJfbmFtZXMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCW51bV9zdHJpbmdzICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9uYW1lcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9tYXg7IGkrKykgeworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChkZXYtPm9mX25vZGUsCisJCQkJZ3Bpb3NldF9jb21iaW5hdGlvbnMsIGksICZncGlvc2V0X2NvbWJfc3RyKTsKKworCQlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c19jb21iX25hbWVzW2ldID0gZGV2bV9remFsbG9jKGRldiwKKwkJCQkoc3RybGVuKGdwaW9zZXRfY29tYl9zdHIpICsgMSksIEdGUF9LRVJORUwpOworCQlpZiAoIWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX2NvbWJfbmFtZXNbaV0pIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXN0cmxjcHkoZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9uYW1lc1tpXSwKKwkJCQkJZ3Bpb3NldF9jb21iX3N0ciwKKwkJCQkJc3RybGVuKGdwaW9zZXRfY29tYl9zdHIpKzEpOworCQlwcl9kZWJ1ZygiJXM6IEdQSU8gY29uZmlndXJhdGlvbiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c19jb21iX25hbWVzW2ldKTsKKwkJZ3Bpb3NldF9jb21iX3N0ciA9IE5VTEw7CisJfQorCisJLyogQWxsb2NhdGluZyBtZW1vcnkgZm9yIGhhbmRsZXMgdG8gcGluY3RybCBzdGF0ZXMgKi8KKwlwaW5jdHJsX2luZm9bY2xpZW50XS5jZGNfbGluZXMgPSBkZXZtX2t6YWxsb2MoZGV2LAorCQludW1fc3RyaW5ncyAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBpbmN0cmxfaW5mb1tjbGllbnRdLmNkY19saW5lcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBHZXQgcGluY3RybCBoYW5kbGVzIGZvciBncGlvIHNldHMgaW4gZHRzaSBmaWxlICovCisJZm9yIChpID0gMDsgaSA8IG51bV9zdHJpbmdzOyBpKyspIHsKKwkJcGluY3RybF9pbmZvW2NsaWVudF0uY2RjX2xpbmVzW2ldID0gcGluY3RybF9sb29rdXBfc3RhdGUoCisJCQkJCQkJCXBpbmN0cmwsCisJCQkJCShjb25zdCBjaGFyICopZ3Bpb3NldF9pbmZvW2NsaWVudF0uCisJCQkJCQkJZ3Bpb3NldHNfY29tYl9uYW1lc1tpXSk7CisJCWlmIChJU19FUlIocGluY3RybF9pbmZvW2NsaWVudF0uY2RjX2xpbmVzW2ldKSkKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgcGluY3RybCBoYW5kbGUgZm9yICVzXG4iLAorCQkJCV9fZnVuY19fLCBncGlvc2V0X2luZm9bY2xpZW50XS4KKwkJCQkJCWdwaW9zZXRzX2NvbWJfbmFtZXNbaV0pOworCX0KKwlnb3RvIHN1Y2Nlc3M7CisKK2VycjoKKwkvKiBGcmVlIHVwIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGdwaW8gc2V0IGNvbWJpbmF0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0c19tYXg7IGkrKykgeworCQlpZiAoZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNbaV0gIT0gTlVMTCkgeworCQkJZGV2bV9rZnJlZShkZXYsIGdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzW2ldKTsKKwkJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzW2ldID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHMgIT0gTlVMTCkgeworCQlkZXZtX2tmcmVlKGRldiwgZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHMpOworCQlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0cyA9IE5VTEw7CisJfQorCisJLyogRnJlZSB1cCBtZW1vcnkgYWxsb2NhdGVkIGZvciBncGlvIHNldCBjb21iaW5hdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9tYXg7IGkrKykgeworCQlpZiAoZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9uYW1lc1tpXSAhPSBOVUxMKSB7CisJCQlkZXZtX2tmcmVlKGRldiwKKwkJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX2NvbWJfbmFtZXNbaV0pOworCQkJZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9uYW1lc1tpXSA9IE5VTEw7CisJCX0KKwl9CisJaWYgKGdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX2NvbWJfbmFtZXMgIT0gTlVMTCkgeworCQlkZXZtX2tmcmVlKGRldiwgZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldHNfY29tYl9uYW1lcyk7CisJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRzX2NvbWJfbmFtZXMgPSBOVUxMOworCX0KKworCS8qIEZyZWUgdXAgbWVtb3J5IGFsbG9jYXRlZCBmb3IgaGFuZGxlcyB0byBwaW5jdHJsIHN0YXRlcyAqLworCWlmIChwaW5jdHJsX2luZm9bY2xpZW50XS5jZGNfbGluZXMgIT0gTlVMTCkgeworCQlkZXZtX2tmcmVlKGRldiwgcGluY3RybF9pbmZvW2NsaWVudF0uY2RjX2xpbmVzKTsKKwkJcGluY3RybF9pbmZvW2NsaWVudF0uY2RjX2xpbmVzID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIHVwIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGNvdW50ZXIgb2YgZ3BpbyBzZXRzICovCisJaWYgKGdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGUgIT0gTlVMTCkgeworCQlkZXZtX2tmcmVlKGRldiwgZ3Bpb3NldF9pbmZvW2NsaWVudF0uZ3Bpb3NldF9zdGF0ZSk7CisJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGUgPSBOVUxMOworCX0KKworc3VjY2VzczoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXNtX2dwaW9zZXRfYWN0aXZhdGUoZW51bSBwaW5jdHJsX2NsaWVudCBjbGllbnQsIGNoYXIgKmtleXdvcmQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGdwX3NldCA9IDA7CisJaW50IGFjdGl2ZV9zZXQgPSAwOworCisJZ3Bfc2V0ID0gbXNtX2dldF9ncGlvc2V0X2luZGV4KGNsaWVudCwga2V5d29yZCk7CisJaWYgKGdwX3NldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZ3BpbyBzZXQgbmFtZSBkb2VzIG5vdCBleGlzdFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBncF9zZXQ7CisJfQorCisJaWYgKCFncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0X3N0YXRlW2dwX3NldF0pIHsKKwkJLyoKKwkJICogSWYgcGluY3RybCBwb2ludGVyIGlzIG5vdCB2YWxpZCwKKwkJICogbm8gbmVlZCB0byBwcm9jZWVkIGZ1cnRoZXIKKwkJICovCisJCWFjdGl2ZV9zZXQgPSBwaW5jdHJsX2luZm9bY2xpZW50XS5hY3RpdmVfc2V0OworCQlpZiAoSVNfRVJSKHBpbmN0cmxfaW5mb1tjbGllbnRdLmNkY19saW5lc1thY3RpdmVfc2V0XSkpCisJCQlyZXR1cm4gMDsKKworCQlwaW5jdHJsX2luZm9bY2xpZW50XS5hY3RpdmVfc2V0IHw9ICgxIDw8IGdwX3NldCk7CisJCWFjdGl2ZV9zZXQgPSBwaW5jdHJsX2luZm9bY2xpZW50XS5hY3RpdmVfc2V0OworCQlwcl9kZWJ1ZygiJXM6IHBpbmN0cmwuYWN0aXZlX3NldDogJWRcbiIsIF9fZnVuY19fLCBhY3RpdmVfc2V0KTsKKworCQkvKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHBpbmN0cmwgc3RhdGUgKi8KKwkJcmV0ID0gIHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBpbmN0cmxfaW5mb1tjbGllbnRdLnBpbmN0cmwsCisJCQlwaW5jdHJsX2luZm9bY2xpZW50XS5jZGNfbGluZXNbYWN0aXZlX3NldF0pOworCX0KKwlncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0X3N0YXRlW2dwX3NldF0rKzsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBtc21fZ3Bpb3NldF9zdXNwZW5kKGVudW0gcGluY3RybF9jbGllbnQgY2xpZW50LCBjaGFyICprZXl3b3JkKQoreworCWludCByZXQgPSAwOworCWludCBncF9zZXQgPSAwOworCWludCBhY3RpdmVfc2V0ID0gMDsKKworCWdwX3NldCA9IG1zbV9nZXRfZ3Bpb3NldF9pbmRleChjbGllbnQsIGtleXdvcmQpOworCWlmIChncF9zZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGdwaW8gc2V0IG5hbWUgZG9lcyBub3QgZXhpc3RcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gZ3Bfc2V0OworCX0KKworCWlmIChncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0X3N0YXRlW2dwX3NldF0gPT0gMSkgeworCQlwaW5jdHJsX2luZm9bY2xpZW50XS5hY3RpdmVfc2V0ICY9IH4oMSA8PCBncF9zZXQpOworCQkvKgorCQkgKiBJZiBwaW5jdHJsIHBvaW50ZXIgaXMgbm90IHZhbGlkLAorCQkgKiBubyBuZWVkIHRvIHByb2NlZWQgZnVydGhlcgorCQkgKi8KKwkJYWN0aXZlX3NldCA9IHBpbmN0cmxfaW5mb1tjbGllbnRdLmFjdGl2ZV9zZXQ7CisJCWlmIChJU19FUlIocGluY3RybF9pbmZvW2NsaWVudF0uY2RjX2xpbmVzW2FjdGl2ZV9zZXRdKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByX2RlYnVnKCIlczogcGluY3RybC5hY3RpdmVfc2V0OiAlZFxuIiwgX19mdW5jX18sCisJCQkJcGluY3RybF9pbmZvW2NsaWVudF0uYWN0aXZlX3NldCk7CisJCS8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcGluY3RybCBzdGF0ZSAqLworCQlyZXQgPSAgcGluY3RybF9zZWxlY3Rfc3RhdGUocGluY3RybF9pbmZvW2NsaWVudF0ucGluY3RybCwKKwkJCXBpbmN0cmxfaW5mb1tjbGllbnRdLmNkY19saW5lc1twaW5jdHJsX2luZm9bY2xpZW50XS4KKwkJCQkJCQkJYWN0aXZlX3NldF0pOworCX0KKwlpZiAoIShncGlvc2V0X2luZm9bY2xpZW50XS5ncGlvc2V0X3N0YXRlW2dwX3NldF0pKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY2FsbCB0byBkZSBhY3RpdmF0ZSBncGlvczogJWRcbiIsIF9fZnVuY19fLAorCQkJCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGVbZ3Bfc2V0XSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdwaW9zZXRfaW5mb1tjbGllbnRdLmdwaW9zZXRfc3RhdGVbZ3Bfc2V0XS0tOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtLWF1ZGlvLXBpbmN0cmwuaCBiL3NvdW5kL3NvYy9tc20vbXNtLWF1ZGlvLXBpbmN0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdjNmFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc20tYXVkaW8tcGluY3RybC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NU01fQVVESU9fUElOQ1RSTF9ICisjZGVmaW5lIF9fTVNNX0FVRElPX1BJTkNUUkxfSAorCitlbnVtIHBpbmN0cmxfY2xpZW50IHsKKwlDTElFTlRfV0NELAorCUNMSUVOVF9XU0FfQk9OR09fMSwKKwlDTElFTlRfV1NBX0JPTkdPXzIsCisJTUFYX1BJTkNUUkxfQ0xJRU5ULAorfTsKKworCisvKiBmaW5kcyB0aGUgaW5kZXggZm9yIHRoZSBncGlvIHNldCBpbiB0aGUgZHRzaSBmaWxlICovCitpbnQgbXNtX2dldF9ncGlvc2V0X2luZGV4KGVudW0gcGluY3RybF9jbGllbnQgY2xpZW50LCBjaGFyICprZXl3b3JkKTsKKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGZvbGxvd2luZyBmcm9tIGR0c2kgZmlsZQorICogMS4gYWxsIGdwaW8gc2V0cworICogMi4gYWxsIGNvbWJpbmF0aW9ucyBvZiBncGlvIHNldHMKKyAqIDMuIHBpbmN0cmwgaGFuZGxlcyB0byBncGlvIHNldHMKKyAqCisgKiByZXR1cm5zIGVycm9yIGlmIHRoZXJlIGlzCisgKiAxLiBwcm9ibGVtIHJlYWRpbmcgZnJvbSBkdHNpIGZpbGUKKyAqIDIuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKKyAqLworaW50IG1zbV9ncGlvc2V0X2luaXRpYWxpemUoZW51bSBwaW5jdHJsX2NsaWVudCBjbGllbnQsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBtc21fZ3Bpb3NldF9hY3RpdmF0ZShlbnVtIHBpbmN0cmxfY2xpZW50IGNsaWVudCwgY2hhciAqa2V5d29yZCk7CisKK2ludCBtc21fZ3Bpb3NldF9zdXNwZW5kKGVudW0gcGluY3RybF9jbGllbnQgY2xpZW50LCBjaGFyICprZXl3b3JkKTsKKworI2VuZGlmIC8qIF9fTVNNX0FVRElPX1BJTkNUUkxfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc20tY3BlLWxzbS5jIGIvc291bmQvc29jL21zbS9tc20tY3BlLWxzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjI1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbS1jcGUtbHNtLmMKQEAgLTAsMCArMSwzMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvY3BlX2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9sc21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL21zbS1zbGltLWRtYS5oPgorCisjZGVmaW5lIFNBTVBMRV9SQVRFXzQ4S0haIDQ4MDAwCisjZGVmaW5lIFNBTVBMRV9SQVRFXzE2S0haIDE2MDAwCisjZGVmaW5lIExTTV9WT0lDRV9XQUtFVVBfQVBQX1YyIDIKKyNkZWZpbmUgQUZFX1BPUlRfSURfMSAxCisjZGVmaW5lIEFGRV9QT1JUX0lEXzMgMworI2RlZmluZSBBRkVfT1VUX1BPUlRfMiAyCisjZGVmaW5lIExJU1RFTl9NSU5fTlVNX1BFUklPRFMgICAgIDIKKyNkZWZpbmUgTElTVEVOX01BWF9OVU1fUEVSSU9EUyAgICAgMTIKKyNkZWZpbmUgTElTVEVOX01BWF9QRVJJT0RfU0laRSAgICAgNjE0NDAKKyNkZWZpbmUgTElTVEVOX01JTl9QRVJJT0RfU0laRSAgICAgMzIwCisjZGVmaW5lIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSAyNTYKKyNkZWZpbmUgTVNNX0NQRV9NQVhfQ1VTVE9NX1BBUkFNX1NJWkUgMjA0OAorCisjZGVmaW5lIE1TTV9DUEVfTEFCX1RIUkVBRF9USU1FT1VUICgzICogKEhaLzEwKSkKKworI2RlZmluZSBNU01fQ1BFX0xTTV9HUkFCX0xPQ0sobG9jaywgbmFtZSkJCVwKK3sJCQkJCQlcCisJcHJfZGVidWcoIiVzOiAlcyBsb2NrIGFjcXVpcmVcbiIsCVwKKwkJIF9fZnVuY19fLCBuYW1lKTsJCVwKKwltdXRleF9sb2NrKGxvY2spOwkJCVwKK30KKworI2RlZmluZSBNU01fQ1BFX0xTTV9SRUxfTE9DSyhsb2NrLCBuYW1lKQkJXAorewkJCQkJCVwKKwlwcl9kZWJ1ZygiJXM6ICVzIGxvY2sgcmVsZWFzZVxuIiwJXAorCQkgX19mdW5jX18sIG5hbWUpOwkJXAorCW11dGV4X3VubG9jayhsb2NrKTsJCQlcCit9CisKKy8qIENvbnZlbnRpb25hbCBhbmQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKKwk4MDAwLCAxNjAwMCwgNDgwMDAsIDE5MjAwMCwgMzg0MDAwCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAorCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKKwkubWFzayA9IDAsCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX2xpc3RlbiA9IHsKKwkuaW5mbyA9CShTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJICBTTkRSVl9QQ01fUkFURV8xOTIwMDAgfCBTTkRSVl9QQ01fUkFURV8zODQwMDApLAorCS5yYXRlX21pbiA9IDE2MDAwLAorCS5yYXRlX21heCA9IDM4NDAwMCwKKwkuY2hhbm5lbHNfbWluID0JMSwKKwkuY2hhbm5lbHNfbWF4ID0JMSwKKwkuYnVmZmVyX2J5dGVzX21heCA9IExJU1RFTl9NQVhfTlVNX1BFUklPRFMgKgorCQkJICAgIExJU1RFTl9NQVhfUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPSBMSVNURU5fTUlOX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gTElTVEVOX01BWF9QRVJJT0RfU0laRSwKKwkucGVyaW9kc19taW4gPSBMSVNURU5fTUlOX05VTV9QRVJJT0RTLAorCS5wZXJpb2RzX21heCA9IExJU1RFTl9NQVhfTlVNX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9IDAsCit9OworCitlbnVtIHsKKwlBRkVfQ01EX0lOVkFMSUQgPSAwLAorCUFGRV9DTURfUE9SVF9TVEFSVCwKKwlBRkVfQ01EX1BPUlRfU1VTUEVORCwKKwlBRkVfQ01EX1BPUlRfUkVTVU1FLAorCUFGRV9DTURfUE9SVF9TVE9QLAorfTsKKworZW51bSBjcGVfbGFiX3RocmVhZF9zdGF0dXMgeworCU1TTV9MU01fTEFCX1RIUkVBRF9TVE9QLAorCU1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HLAorCU1TTV9MU01fTEFCX1RIUkVBRF9FUlJPUiwKK307CisKK3N0cnVjdCBjcGVfaHdfcGFyYW1zIHsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTE2IHNhbXBsZV9zaXplOworCXUzMiBidWZfc3o7CisJdTMyIHBlcmlvZF9jb3VudDsKKwl1MTYgY2hhbm5lbHM7Cit9OworCitzdHJ1Y3QgY3BlX2RhdGFfcGNtX2J1ZiB7CisJdTggKm1lbTsKKwlwaHlzX2FkZHJfdCBwaHlzOworfTsKKworc3RydWN0IGNwZV9sc21fbGFiIHsKKwlhdG9taWNfdCBpbl9jb3VudDsKKwlhdG9taWNfdCBhYm9ydF9yZWFkOworCXUzMiBkbWFfd3JpdGU7CisJdTMyIGJ1Zl9pZHg7CisJdTMyIHBjbV9zaXplOworCWVudW0gY3BlX2xhYl90aHJlYWRfc3RhdHVzIHRocmVhZF9zdGF0dXM7CisJc3RydWN0IGNwZV9kYXRhX3BjbV9idWYgKnBjbV9idWY7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcGVyaW9kX3dhaXQ7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfY29tcGxldGU7Cit9OworCitzdHJ1Y3QgY3BlX3ByaXYgeworCXZvaWQgKmNvcmVfaGFuZGxlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzIGxzbV9vcHM7CisJc3RydWN0IHdjZF9jcGVfYWZlX29wcyBhZmVfb3BzOworCWJvb2wgYWZlX21hZF9jdGw7CisJdTMyIGlucHV0X3BvcnRfaWQ7Cit9OworCitzdHJ1Y3QgY3BlX2xzbV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqbHNtX3Nlc3Npb247CisJc3RydWN0IG11dGV4IGxzbV9hcGlfbG9jazsKKwlzdHJ1Y3QgY3BlX2xzbV9sYWIgbGFiOworCXN0cnVjdCBjcGVfaHdfcGFyYW1zIGh3X3BhcmFtczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7CisJYXRvbWljX3QgZXZlbnRfYXZhaWw7CisJYXRvbWljX3QgZXZlbnRfc3RvcDsKKworCXU4IGV2X2RldF9zdGF0dXM7CisJdTggZXZfZGV0X3BsZF9zaXplOworCXU4ICpldl9kZXRfcGF5bG9hZDsKKworCWJvb2wgY3BlX3ByZXBhcmVkOworfTsKKworc3RhdGljIGludCBtc21fY3BlX2FmZV9tYWRfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjcGUtPmFmZV9tYWRfY3RsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9jcGVfYWZlX21hZF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisKKwljcGUtPmFmZV9tYWRfY3RsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY3BlX2tjb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDUEUgQUZFIE1BRCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCQltc21fY3BlX2FmZV9tYWRfY3RsX2dldCwgbXNtX2NwZV9hZmVfbWFkX2N0bF9wdXQpLAorfTsKKworLyoKKyAqIGNwZV9nZXRfcHJpdmF0ZV9kYXRhOiBvYnRhaW4gQVNvQyBwbGF0Zm9ybSBkcml2ZXIgcHJpdmF0ZSBkYXRhCisgKiBAc3Vic3RyZWFtOiBBU29DIHN1YnN0cmVhbSBmb3Igd2hpY2ggcHJpdmF0ZSBkYXRhIHRvIGJlIG9idGFpbmVkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3BlX3ByaXYgKmNwZV9nZXRfcHJpdmF0ZV9kYXRhKAorCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogJXMgaXMgaW52YWxpZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWlmICghcnRkIHx8ICFydGQtPnBsYXRmb3JtKSB7CisJCXByX2VycigiJXM6ICVzIGlzIGludmFsaWRcbiIsCisJCQkgX19mdW5jX18sCisJCQkoIXJ0ZCkgPyAicnVudGltZSIgOiAicGxhdGZvcm0iKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXJldHVybiBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCitlcnJfcmV0OgorCXJldHVybiBOVUxMOworfQorCisvKgorICogY3BlX2dldF9sc21fZGF0YTogb2J0YWluIHRoZSBsc20gc2Vzc2lvbiBkYXRhIGdpdmVuIHRoZSBzdWJzdHJlYW0KKyAqIEBzdWJzdHJlYW06IEFTb0Mgc3Vic3RyZWFtIGZvciB3aGljaCBsc20gc2Vzc2lvbiBkYXRhIHRvIGJlIG9idGFpbmVkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3BlX2xzbV9kYXRhICpjcGVfZ2V0X2xzbV9kYXRhKAorCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlyZXR1cm4gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworfQorCitzdGF0aWMgdm9pZCBtc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzKHZvaWQgKmRhdGEsCisJCXU4IGRldGVjdF9zdGF0dXMsIHU4IHNpemUsIHU4ICpwYXlsb2FkKQoreworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gZGF0YTsKKworCWxzbV9kLT5ldl9kZXRfc3RhdHVzID0gZGV0ZWN0X3N0YXR1czsKKwlsc21fZC0+ZXZfZGV0X3BsZF9zaXplID0gc2l6ZTsKKworCWxzbV9kLT5ldl9kZXRfcGF5bG9hZCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsc21fZC0+ZXZfZGV0X3BheWxvYWQpCisJCXJldHVybjsKKworCW1lbWNweShsc21fZC0+ZXZfZGV0X3BheWxvYWQsIHBheWxvYWQsIHNpemUpOworCisJYXRvbWljX3NldCgmbHNtX2QtPmV2ZW50X2F2YWlsLCAxKTsKKwl3YWtlX3VwKCZsc21fZC0+ZXZlbnRfd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9jcGVfcHJvY2Vzc19ldmVudF9zdGF0dXNfZG9uZShzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZGF0YSkKK3sKKwlrZnJlZShsc21fZGF0YS0+ZXZfZGV0X3BheWxvYWQpOworCWxzbV9kYXRhLT5ldl9kZXRfcGF5bG9hZCA9IE5VTEw7CisKKwlsc21fZGF0YS0+ZXZfZGV0X3N0YXR1cyA9IDA7CisJbHNtX2RhdGEtPmV2X2RldF9wbGRfc2l6ZSA9IDA7Cit9CisKKy8qCisgKiBtc21fY3BlX2FmZV9wb3J0X2NudGw6IFBlcmZvcm0gdGhlIGFmZSBwb3J0IGNvbnRyb2wKKyAqIEBzdWJzdHJlYW06IHN1YnN0cmVhbSBmb3Igd2hpY2ggYWZlIHBvcnQgY29tbWFuZCB0byBiZSBwZXJmb3JtZWQKKyAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNvcmUKKyAqIEBhZmVfb3BzOiBoYW5kbGUgdG8gdGhlIGFmZSBvcGVyYXRpb25zCisgKiBAYWZlX2NmZzogYWZlIHBvcnQgY29uZmlndXJhdGlvbiBkYXRhCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIHNlbnQgdG8gQUZFCisgKgorICovCitzdGF0aWMgaW50IG1zbV9jcGVfYWZlX3BvcnRfY250bCgKKwkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXZvaWQgKmNvcmVfaGFuZGxlLAorCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzLAorCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcsCisJCWludCBjbWQpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAoIWFmZV9jZmctPnBvcnRfaWQpIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgZHJpdmVyIGNhbiBnZXQgY2xvc2VkIHdpdGhvdXQgcHJlcGFyZSwKKwkJICogaW4gd2hpY2ggY2FzZSBhZmUgcG9ydHMgd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQuCisJCSAqLworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGFmZSBwb3J0IGlkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQUZFX0NNRF9QT1JUX1NUQVJUOgorCQlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X3N0YXJ0KGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKKwkJaWYgKHJjICE9IDApCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogQUZFIHBvcnQgc3RhcnQgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQ01EX1BPUlRfU1VTUEVORDoKKwkJcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9zdXNwZW5kKGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKKwkJaWYgKHJjICE9IDApCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogYWZlX3N1c3BlbmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwljYXNlIEFGRV9DTURfUE9SVF9SRVNVTUU6CisJCXJjID0gYWZlX29wcy0+YWZlX3BvcnRfcmVzdW1lKGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKKwkJaWYgKHJjICE9IDApCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogYWZlX3Jlc3VtZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCWNhc2UgQUZFX0NNRF9QT1JUX1NUT1A6CisJCXJjID0gYWZlX29wcy0+YWZlX3BvcnRfc3RvcChjb3JlX2hhbmRsZSwgYWZlX2NmZyk7CisJCWlmIChyYyAhPSAwKQorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IGFmZV9zdG9wZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fbGFiX3N0b3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHM7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgY3BlX2xzbV9sYWIgKmxhYl9kID0gJmxzbV9kLT5sYWI7CisJc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7CisJaW50IHJjOworCisJLyoKKwkgKiB0aGUgY2FsbGVyIGlzIG5vdCBhd2FyZSBvZiBMQUIgc3RhdHVzIGFuZCB3aWxsCisJICogdHJ5IHRvIHN0b3AgbGFiIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzdG9wcGVkLgorCSAqIHJldHVybiBzdWNjZXNzIHJpZ2h0IGF3YXkgaXMgTEFCIGlzIGFscmVhZHkgc3RvcHBlZAorCSAqLworCWlmIChsYWJfZC0+dGhyZWFkX3N0YXR1cyA9PSBNU01fTFNNX0xBQl9USFJFQURfU1RPUCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBsYWIgYWxyZWFkeSBzdG9wcGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZC0+bHNtX3Nlc3Npb24pIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOworCWFmZV9vcHMgPSAmY3BlLT5hZmVfb3BzOworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJaWYgKHJ0ZC0+Y3B1X2RhaSkKKwkJZG1hX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEocnRkLT5jcHVfZGFpLAorCQkJCQlzdWJzdHJlYW0pOworCWlmICghZG1hX2RhdGEgfHwgIWRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogZG1hX2RhdGEgaXMgbm90IHNldFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxhYl9kLT50aHJlYWRfc3RhdHVzID09IE1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICIlczogc3RvcHBpbmcgbGFiIHRocmVhZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSBrdGhyZWFkX3N0b3Aoc2Vzc2lvbi0+bHNtX2xhYl90aHJlYWQpOworCisJCS8qCisJCSAqIGt0aHJlYWRfc3RvcCByZXR1cm5zIEVJTlRSIGlmIHRoZSB0aHJlYWRfZm4KKwkJICogd2FzIG5vdCBzY2hlZHVsZWQgYmVmb3JlIGNhbGxpbmcga3RocmVhZF9zdG9wLgorCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGRvbnQgbmVlZCB0byB3YWl0IGZvciBsYWIKKwkJICogdGhyZWFkIHRvIGNvbXBsZXRlIGFzIGxhYiB0aHJlYWQgd2lsbCBub3QgYmUKKwkJICogc2NoZWR1bGVkIGF0IGFsbC4KKwkJICovCisJCWlmIChyYyA9PSAtRUlOVFIpCisJCQlnb3RvIGRvbmU7CisKKwkJLyogV2FpdCBmb3IgdGhlIGxhYiB0aHJlYWQgdG8gZXhpdCAqLworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCQkmbGFiX2QtPnRocmVhZF9jb21wbGV0ZSwKKwkJCQlNU01fQ1BFX0xBQl9USFJFQURfVElNRU9VVCk7CisJCWlmICghcmMpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBXYWl0IGZvciBsYWIgdGhyZWFkIHRpbWVkb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJcmMgPSBsc21fb3BzLT5sYWJfY2hfc2V0dXAoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkgICBzZXNzaW9uLAorCQkJCSAgIFdDRF9DUEVfUFJFX0RJU0FCTEUpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogUFJFIGNoIHRlYXJkb3duIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCS8qIGNvbnRpbnVlIHdpdGggdGVhcmRvd24gZXZlbiBpZiBhbnkgaW50ZXJtZWRpYXRlIHN0ZXAgZmFpbHMgKi8KKwlyYyA9IGRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwoZG1hX2RhdGEsIHJ0ZC0+Y3B1X2RhaSwgZmFsc2UpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogb3BlbiBkYXRhIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlkbWFfZGF0YS0+cGggPSAwOworCisJLyoKKwkgKiBFdmVuIHRob3VnaCBMQUIgc3RvcCBmYWlsZWQsCisJICogb3V0cHV0IEFGRSBwb3J0IG5lZWRzIHRvIGJlIHN0b3BwZWQKKwkgKi8KKwlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X3N0b3AoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkgICAgJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmcpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogQUZFIG91dCBwb3J0IHN0b3AgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisKKwlyYyA9IGxzbV9vcHMtPmxhYl9jaF9zZXR1cChjcGUtPmNvcmVfaGFuZGxlLAorCQkJCSAgIHNlc3Npb24sCisJCQkJICAgV0NEX0NQRV9QT1NUX0RJU0FCTEUpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogUE9TVCBjaCB0ZWFyZG93biBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworZG9uZToKKwlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9TVE9QOworCWxhYl9kLT5idWZfaWR4ID0gMDsKKwlhdG9taWNfc2V0KCZsYWJfZC0+aW5fY291bnQsIDApOworCWxhYl9kLT5kbWFfd3JpdGUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sYWJfYnVmX2FsbG9jKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAorCQlzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgKmRtYV9kYXRhKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgY3BlX2xzbV9sYWIgKmxhYl9kID0gJmxzbV9kLT5sYWI7CisJc3RydWN0IGNwZV9od19wYXJhbXMgKmh3X3BhcmFtcyA9ICZsc21fZC0+aHdfcGFyYW1zOworCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpwY21fYnVmID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBkbWFfYWxsb2MgPSAwOworCXUzMiBjb3VudCA9IDA7CisJdTMyIGJ1ZnN6LCBidWZjbnQ7CisKKwlpZiAobGFiX2QtPnBjbV9idWYgJiYKKwkgICAgbGFiX2QtPnBjbV9idWYtPm1lbSkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBMQUIgYnVmIGFscmVhZHkgYWxsb2NhdGVkXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJYnVmc3ogPSBod19wYXJhbXMtPmJ1Zl9zejsKKwlidWZjbnQgPSBod19wYXJhbXMtPnBlcmlvZF9jb3VudDsKKworCWRldl9kYmcocnRkLT5kZXYsCisJCSIlczpCdWYgU2l6ZSAlZCBCdWYgY291bnQgJWRcbiIsCisJCSBfX2Z1bmNfXywKKwkJYnVmc3osIGJ1ZmNudCk7CisKKwlwY21fYnVmID0ga3phbGxvYygoKHNpemVvZihzdHJ1Y3QgY3BlX2RhdGFfcGNtX2J1ZikpICogYnVmY250KSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY21fYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWxhYl9kLT5wY21fYnVmID0gcGNtX2J1ZjsKKwlkbWFfYWxsb2MgPSBidWZzeiAqIGJ1ZmNudDsKKwlwY21fYnVmLT5tZW0gPSBOVUxMOworCXBjbV9idWYtPm1lbSA9IGRtYV9hbGxvY19jb2hlcmVudChkbWFfZGF0YS0+c2Rldi0+ZGV2LnBhcmVudCwKKwkJCQkJICBkbWFfYWxsb2MsCisJCQkJCSAgJihwY21fYnVmLT5waHlzKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjbV9idWYtPm1lbSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOkRNQSBhbGxvYyBmYWlsZWQgc2l6ZSA9ICV4XG4iLAorCQkJX19mdW5jX18sIGRtYV9hbGxvYyk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWNvdW50ID0gMDsKKwl3aGlsZSAoY291bnQgPCBidWZjbnQpIHsKKwkJcGNtX2J1Zltjb3VudF0ubWVtID0gcGNtX2J1ZlswXS5tZW0gKyAoY291bnQgKiBidWZzeik7CisJCXBjbV9idWZbY291bnRdLnBoeXMgPSBwY21fYnVmWzBdLnBoeXMgKyAoY291bnQgKiBidWZzeik7CisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6IHBjbV9idWZbJWRdLm1lbSAlcEsgcGNtX2J1ZlslZF0ucGh5cyAlcEtcbiIsCisJCQkgX19mdW5jX18sIGNvdW50LAorCQkJKHZvaWQgKilwY21fYnVmW2NvdW50XS5tZW0sCisJCQljb3VudCwgJihwY21fYnVmW2NvdW50XS5waHlzKSk7CisJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIDA7CitmYWlsOgorCWlmIChwY21fYnVmKSB7CisJCWlmIChwY21fYnVmLT5tZW0pCisJCQlkbWFfZnJlZV9jb2hlcmVudChkbWFfZGF0YS0+c2Rldi0+ZGV2LnBhcmVudCwgZG1hX2FsbG9jLAorCQkJCQkgIHBjbV9idWYtPm1lbSwgcGNtX2J1Zi0+cGh5cyk7CisJCWtmcmVlKHBjbV9idWYpOworCQlsYWJfZC0+cGNtX2J1ZiA9IE5VTEw7CisJfQorZXhpdDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sYWJfYnVmX2RlYWxsb2Moc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCXN0cnVjdCBjcGVfaHdfcGFyYW1zICpod19wYXJhbXMgPSAmbHNtX2QtPmh3X3BhcmFtczsKKwlpbnQgcmMgPSAwOworCWludCBkbWFfYWxsb2MgPSAwOworCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpwY21fYnVmID0gTlVMTDsKKwlpbnQgYnVmc3osIGJ1ZmNudDsKKworCWJ1ZnN6ID0gaHdfcGFyYW1zLT5idWZfc3o7CisJYnVmY250ID0gaHdfcGFyYW1zLT5wZXJpb2RfY291bnQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkiJXM6QnVmIFNpemUgJWQgQnVmIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywKKwkJYnVmc3osIGJ1ZmNudCk7CisKKwlpZiAoYnVmY250IDw9IDAgfHwgYnVmc3ogPD0gMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtcywgYnVmc3ogPSAldSwgYnVmY250ID0gJXVcbiIsCisJCQlfX2Z1bmNfXywgYnVmc3osIGJ1ZmNudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBjbV9idWYgPSBsYWJfZC0+cGNtX2J1ZjsKKwlkbWFfYWxsb2MgPSBidWZzeiAqIGJ1ZmNudDsKKwlpZiAoZG1hX2RhdGEgJiYgcGNtX2J1ZikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZG1hX2RhdGEtPnNkZXYtPmRldi5wYXJlbnQsIGRtYV9hbGxvYywKKwkJCQkgIHBjbV9idWYtPm1lbSwgcGNtX2J1Zi0+cGh5cyk7CisJa2ZyZWUocGNtX2J1Zik7CisJbGFiX2QtPnBjbV9idWYgPSBOVUxMOworCXJldHVybiByYzsKK30KKworLyoKKyAqIG1zbV9jcGVfbGFiX3RocmVhZDogSW5pdGlhdGVkIG9uIEtXIGRldGVjdGlvbgorICogQGRhdGE6IGxhYiBkYXRhCisgKgorICogU3RhcnQgbGFiIHRocmVhZCBhbmQgY2FsbCBDUEUgY29yZSBBUEkgZm9yIFNMSU0KKyAqIHJlYWQgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBtc21fY3BlX2xhYl90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGRhdGE7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGxzbV9kLT5zdWJzdHJlYW07CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCXN0cnVjdCBjcGVfaHdfcGFyYW1zICpod19wYXJhbXMgPSAmbHNtX2QtPmh3X3BhcmFtczsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisJc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKKwlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzOworCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpjdXJfYnVmLCAqbmV4dF9idWY7CisJc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IE5VTEw7CisJYm9vbCB3YWl0X3RpbWVkb3V0ID0gZmFsc2U7CisJaW50IHJjID0gMDsKKwl1MzIgZG9uZV9sZW4gPSAwOworCXUzMiBidWZfY291bnQgPSAwOworCXUzMiBwcmRfY250OworCisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwlwcl9kZWJ1ZygiJXM6IExhYiB0aHJlYWQgc3RhcnRcbiIsIF9fZnVuY19fKTsKKwlpbml0X2NvbXBsZXRpb24oJmxhYl9kLT5jb21wKTsKKworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7CisJCXByX2VycigiJXM6IEhhbmRsZSB0byAlcyBpcyBpbnZhbGlkXG4iLAorCQkJX19mdW5jX18sCisJCQkoIWNwZSkgPyAiY3BlIiA6ICJjb3JlIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWlmIChydGQtPmNwdV9kYWkpCisJCWRtYV9kYXRhID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwKKwkJCQkJc3Vic3RyZWFtKTsKKwlpZiAoIWRtYV9kYXRhIHx8ICFkbWFfZGF0YS0+ZGFpX2NoYW5uZWxfY3RsKSB7CisJCXByX2VycigiJXM6IGRtYV9kYXRhIGlzIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisJYWZlX29wcyA9ICZjcGUtPmFmZV9vcHM7CisKKwlyYyA9IGxzbV9vcHMtPmxhYl9jaF9zZXR1cChjcGUtPmNvcmVfaGFuZGxlLAorCQkJCSAgIHNlc3Npb24sCisJCQkJICAgV0NEX0NQRV9QUkVfRU5BQkxFKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogUFJFIGNoIHNldHVwIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSBkbWFfZGF0YS0+ZGFpX2NoYW5uZWxfY3RsKGRtYV9kYXRhLCBydGQtPmNwdV9kYWksIHRydWUpOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBvcGVuIGRhdGEgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBFc3RhYmxpc2hlZCBkYXRhIGNoYW5uZWxcbiIsCisJCV9fZnVuY19fKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxhYl9kLT5wZXJpb2Rfd2FpdCk7CisJbWVtc2V0KGxhYl9kLT5wY21fYnVmWzBdLm1lbSwgMCwgbGFiX2QtPnBjbV9zaXplKTsKKworCXJjID0gc2xpbV9wb3J0X3hmZXIoZG1hX2RhdGEtPnNkZXYsIGRtYV9kYXRhLT5waCwKKwkJCSAgICBsYWJfZC0+cGNtX2J1ZlswXS5waHlzLAorCQkJICAgIGh3X3BhcmFtcy0+YnVmX3N6LCAmbGFiX2QtPmNvbXApOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBidWZbMF0gc2xpbV9wb3J0X3hmZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHNsaW1fcG9ydF94ZmVyKGRtYV9kYXRhLT5zZGV2LCBkbWFfZGF0YS0+cGgsCisJCQkgICAgbGFiX2QtPnBjbV9idWZbMV0ucGh5cywKKwkJCSAgICBod19wYXJhbXMtPmJ1Zl9zeiwgJmxhYl9kLT5jb21wKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogYnVmWzBdIHNsaW1fcG9ydF94ZmVyIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJY3VyX2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlswXTsKKwluZXh0X2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlsyXTsKKwlwcmRfY250ID0gaHdfcGFyYW1zLT5wZXJpb2RfY291bnQ7CisJcmMgPSBsc21fb3BzLT5sYWJfY2hfc2V0dXAoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkgICBzZXNzaW9uLAorCQkJCSAgIFdDRF9DUEVfUE9TVF9FTkFCTEUpOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBQT1NUIGNoIHNldHVwIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9zdGFydChjcGUtPmNvcmVfaGFuZGxlLAorCQkJJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmcpOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBBRkUgb3V0IHBvcnQgc3RhcnQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJgorCSAgICAgICBsYWJfZC0+dGhyZWFkX3N0YXR1cyAhPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1IpIHsKKworCQlyYyA9IHNsaW1fcG9ydF94ZmVyKGRtYV9kYXRhLT5zZGV2LCBkbWFfZGF0YS0+cGgsCisJCQkJICAgIG5leHRfYnVmLT5waHlzLAorCQkJCSAgICBod19wYXJhbXMtPmJ1Zl9zeiwgJmxhYl9kLT5jb21wKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogc2xpbV9wb3J0X3hmZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJbGFiX2QtPnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1I7CisJCX0KKworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGFiX2QtPmNvbXAsICgyICogSFovMTApKTsKKwkJaWYgKCFyYykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IHdhaXQgdGltZWRvdXQgZm9yIHNsaW0gYnVmZmVyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXdhaXRfdGltZWRvdXQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJd2FpdF90aW1lZG91dCA9IGZhbHNlOworCQl9CisKKwkJcmMgPSBzbGltX3BvcnRfZ2V0X3hmZXJfc3RhdHVzKGRtYV9kYXRhLT5zZGV2LAorCQkJCQkgICAgICAgZG1hX2RhdGEtPnBoLAorCQkJCQkgICAgICAgJmN1cl9idWYtPnBoeXMsICZkb25lX2xlbik7CisJCWlmIChyYyB8fAorCQkgICAgKCFyYyAmJiB3YWl0X3RpbWVkb3V0KSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IHhmZXJfc3RhdHVzIGZhaWx1cmUsIHJjID0gJWQsIHdhaXRfdGltZWRvdXQgPSAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgcmMsCisJCQkJKHdhaXRfdGltZWRvdXQgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7CisJCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9FUlJPUjsKKwkJfQorCisJCWlmIChkb25lX2xlbiB8fAorCQkgICAgKCghZG9uZV9sZW4pICYmCisJCSAgICAgbGFiX2QtPnRocmVhZF9zdGF0dXMgPT0gTVNNX0xTTV9MQUJfVEhSRUFEX0VSUk9SKSkgeworCQkJYXRvbWljX2luYygmbGFiX2QtPmluX2NvdW50KTsKKwkJCWxhYl9kLT5kbWFfd3JpdGUgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCQl3YWtlX3VwKCZsYWJfZC0+cGVyaW9kX3dhaXQpOworCQkJYnVmX2NvdW50Kys7CisKKwkJCWN1cl9idWYgPSAmbGFiX2QtPnBjbV9idWZbYnVmX2NvdW50ICUgcHJkX2NudF07CisJCQluZXh0X2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlsoYnVmX2NvdW50ICsgMikgJSBwcmRfY250XTsKKwkJCWRldl9kYmcocnRkLT5kZXYsCisJCQkJIiVzOiBDdXIgYnVmLm1lbSA9ICVwSyBOZXh0IEJ1Zi5tZW0gPSAlcEtcbiIKKwkJCQkiIGJ1ZiBjb3VudCA9IDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCWN1cl9idWYtPm1lbSwgbmV4dF9idWYtPm1lbSwgYnVmX2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBTQiBnZXQgc3RhdHVzLCBpbnZhbGlkIGxlbiA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGRvbmVfbGVuKTsKKwkJfQorCQlkb25lX2xlbiA9IDA7CisJfQorCitkb25lOgorCWlmIChyYykKKwkJbGFiX2QtPnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1I7CisJcHJfZGVidWcoIiVzOiBFeGl0IGxhYl90aHJlYWQsIGV4aXRfc3RhdHVzPSVkLCB0aHJlYWRfc3RhdHVzPSVkXG4iLAorCQkgX19mdW5jX18sIHJjLCBsYWJfZC0+dGhyZWFkX3N0YXR1cyk7CisJY29tcGxldGUoJmxhYl9kLT50aHJlYWRfY29tcGxldGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtc21fY3BlX2xzbV9vcGVuOiBBU29DIGNhbGwgdG8gb3BlbiB0aGUgc3RyZWFtCisgKiBAc3Vic3RyZWFtOiBzdWJzdHJlYW0gdGhhdCBpcyB0byBiZSBvcGVuZWQKKyAqCisgKiBDcmVhdGUgc2Vzc2lvbiBkYXRhIGZvciBsc20gc2Vzc2lvbiBhbmQgb3BlbiB0aGUgbHNtIHNlc3Npb24KKyAqIG9uIENQRS4KKyAqLworc3RhdGljIGludCBtc21fY3BlX2xzbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCWludCByYyA9IDA7CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb2RlYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlX2xpc3RlbjsKKworCXJjID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKKwkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2Vycigic25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgZmFpbGVkIHJjICVkXG4iLCByYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuc3VyZSB0aGF0IGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgcGVyaW9kIHNpemUgKi8KKwlyYyA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCisJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBzZXQgcGNtX3BhcmFtX3BlcmlvZHMsIHJjICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCisJCUxJU1RFTl9NSU5fTlVNX1BFUklPRFMgKiBMSVNURU5fTUlOX1BFUklPRF9TSVpFLAorCQlMSVNURU5fTUFYX05VTV9QRVJJT0RTICogTElTVEVOX01BWF9QRVJJT0RfU0laRSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gc2V0IHBjbSBjb25zdHJhaW50cywgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcGUtPmNvcmVfaGFuZGxlID0gd2NkX2NwZV9nZXRfY29yZV9oYW5kbGUoY3BlLT5jb2RlYyk7CisKKwlpZiAoIWNwZS0+Y29yZV9oYW5kbGUpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBoYW5kbGUgdG8gY29kZWMgY29yZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisJbHNtX2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsc21fZCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBFTk9NRU0gZm9yIGxzbSBzZXNzaW9uLCBzaXplID0gJXpkXG4iLAorCQkJX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9kYXRhKSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsX3JldHVybjsKKwl9CisJbXV0ZXhfaW5pdCgmbHNtX2QtPmxzbV9hcGlfbG9jayk7CisKKwlsc21fZC0+bHNtX3Nlc3Npb24gPSBsc21fb3BzLT5sc21fYWxsb2Nfc2Vzc2lvbihjcGUtPmNvcmVfaGFuZGxlLAorCQkJCQlsc21fZCwgbXNtX2NwZV9wcm9jZXNzX2V2ZW50X3N0YXR1cyk7CisJaWYgKCFsc21fZC0+bHNtX3Nlc3Npb24pIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogc2Vzc2lvbiBhbGxvY2F0aW9uIGZhaWxlZCIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX3Nlc3Npb25fYWxsb2M7CisJfQorCS8qIEV4cGxpY2l0bHkgQXNzaWduIHRoZSBMQUIgdGhyZWFkIHRvIFNUT1Agc3RhdGUgKi8KKwlsc21fZC0+bGFiLnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfU1RPUDsKKwlsc21fZC0+bHNtX3Nlc3Npb24tPnN0YXJ0ZWQgPSBmYWxzZTsKKwlsc21fZC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxzbV9kLT5sYWIucGVyaW9kX3dhaXQpOworCWxzbV9kLT5jcGVfcHJlcGFyZWQgPSBmYWxzZTsKKworCWRldl9kYmcocnRkLT5kZXYsICIlczogYWxsb2NhdGVkIHNlc3Npb24gd2l0aCBpZCA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbHNtX2QtPmxzbV9zZXNzaW9uLT5pZCk7CisKKworCXJjID0gbHNtX29wcy0+bHNtX29wZW5fdHgoY3BlLT5jb3JlX2hhbmRsZSwgbHNtX2QtPmxzbV9zZXNzaW9uLAorCQkJCSAgIExTTV9WT0lDRV9XQUtFVVBfQVBQX1YyLCAxNjAwMCk7CisJaWYgKHJjICA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogT1BFTl9UWCBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbF9vcGVuX3R4OworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxzbV9kLT5ldmVudF93YWl0KTsKKwlhdG9taWNfc2V0KCZsc21fZC0+ZXZlbnRfYXZhaWwsIDApOworCWF0b21pY19zZXQoJmxzbV9kLT5ldmVudF9zdG9wLCAwKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBsc21fZDsKKworCXJldHVybiAwOworCitmYWlsX29wZW5fdHg6CisJbHNtX29wcy0+bHNtX2RlYWxsb2Nfc2Vzc2lvbihjcGUtPmNvcmVfaGFuZGxlLCBsc21fZC0+bHNtX3Nlc3Npb24pOworCitmYWlsX3Nlc3Npb25fYWxsb2M6CisJbXV0ZXhfZGVzdHJveSgmbHNtX2QtPmxzbV9hcGlfbG9jayk7CisJa2ZyZWUobHNtX2QpOworZmFpbF9yZXR1cm46CisJcmV0dXJuIHJjOworfQorCisvKgorICogbXNtX2NwZV9sc21fY2xvc2U6IEFTb0MgY2FsbCB0byBjbG9zZS9jbGVhbnVwIHRoZSBzdHJlYW0KKyAqIEBzdWJzdHJlYW06IHN1YnN0cmVhbSB0aGF0IGlzIHRvIGJlIGNsb3NlZAorICoKKyAqIERlYWxsb2NhdGUgdGhlIHNlc3Npb24gYW5kIHJlbGVhc2UgdGhlIEFGRSBwb3J0LiBJdCBpcyBub3QKKyAqIHJlcXVpcmVkIHRvIGRlcmVnaXN0ZXIgdGhlIHNvdW5kIG1vZGVsIGFzIGxvbmcgYXMgd2UgY2xvc2UKKyAqIHRoZSBsc20gc2Vzc2lvbiBvbiBDUEUuCisgKi8KK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzOworCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqYWZlX2NmZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjcGUgfHwgIWNwZS0+Y29yZV9oYW5kbGUpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbHNtX2QgfHwgIWxzbV9kLT5sc21fc2Vzc2lvbikgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHNlc3Npb24gZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKKwlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7CisKKwkvKgorCSAqIElmIGRyaXZlciBpcyBjbG9zZWQgd2l0aG91dCBzdG9wcGluZyBMQUIsCisJICogZXhwbGljaXRseSBzdG9wIExBQiBiZWZvcmUgY2xlYW5pbmcgdXAgdGhlCisJICogZHJpdmVyIHJlc291cmNlcy4KKwkgKi8KKwlyYyA9IG1zbV9jcGVfbHNtX2xhYl9zdG9wKHN1YnN0cmVhbSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBzdG9wIGxhYiwgZXJyb3IgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IG1zbV9jcGVfYWZlX3BvcnRfY250bChzdWJzdHJlYW0sCisJCQkJICAgY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkgICBhZmVfb3BzLCBhZmVfY2ZnLAorCQkJCSAgIEFGRV9DTURfUE9SVF9TVE9QKTsKKworCWxzbV9kLT5jcGVfcHJlcGFyZWQgPSBmYWxzZTsKKworCXJjID0gbHNtX29wcy0+bHNtX2Nsb3NlX3R4KGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOworCWlmIChyYyAhPSAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGxzbV9jbG9zZSBmYWlsLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlsc21fb3BzLT5sc21fZGVhbGxvY19zZXNzaW9uKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJbXV0ZXhfZGVzdHJveSgmbHNtX2QtPmxzbV9hcGlfbG9jayk7CisJa2ZyZWUobHNtX2QpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX2dldF9jb25mX2xldmVscygKKwkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJdTggKmNvbmZfbGV2ZWxzX3B0cikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyA8PSAwKSB7CisJCXByX2RlYnVnKCIlczogY29uZl9sZXZlbHMgKCV1KSwgc2tpcCBzZXQgcGFyYW1zXG4iLAorCQkJIF9fZnVuY19fLAorCQkJc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKTsKKwkJZ290byBkb25lOworCX0KKworCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0ga3phbGxvYyhzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghc2Vzc2lvbi0+Y29uZl9sZXZlbHMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKHNlc3Npb24tPmNvbmZfbGV2ZWxzLAorCQkJICAgY29uZl9sZXZlbHNfcHRyLAorCQkJICAgc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKSkgeworCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgZm9yIGNvbmZpZGVuY2UgbGV2ZWxzICV1XG4iLAorCQkJX19mdW5jX18sIHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyk7CisJCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKKwkJc2Vzc2lvbi0+Y29uZl9sZXZlbHMgPSBOVUxMOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX3ZhbGlkYXRlX291dF9mb3JtYXQoCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9sc21fb3V0cHV0X2Zvcm1hdF9jZmcgKmNmZykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaW50IHJjID0gMDsKKworCWlmICghY2ZnKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgbHNtIG91dCBjZmdcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNmZy0+Zm9ybWF0ICE9IExTTV9PVVRfRk9STUFUX1BDTSAmJgorCSAgICBjZmctPmZvcm1hdCAhPSBMU01fT1VUX0ZPUk1BVF9BRFBDTSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGZvcm1hdCAldVxuIiwKKwkJCV9fZnVuY19fLCBjZmctPmZvcm1hdCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjZmctPnBhY2tpbmcgIT0gTFNNX09VVF9EQVRBX1JBVyAmJgorCSAgICBjZmctPnBhY2tpbmcgIT0gTFNNX09VVF9EQVRBX1BBQ0tFRCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhY2tpbmcgbWV0aG9kICV1XG4iLAorCQkJX19mdW5jX18sIGNmZy0+cGFja2luZyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjZmctPmV2ZW50cyAhPSBMU01fT1VUX0RBVEFfRVZFTlRTX0RJU0FCTEVEICYmCisJICAgIGNmZy0+ZXZlbnRzICE9IExTTV9PVVRfREFUQV9FVkVOVFNfRU5BQkxFRCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGV2ZW50cyBwcm92aWRlZCAldVxuIiwKKwkJCV9fZnVuY19fLCBjZmctPmV2ZW50cyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjZmctPm1vZGUgIT0gTFNNX09VVF9UUkFOU0ZFUl9NT0RFX1JUICYmCisJICAgIGNmZy0+bW9kZSAhPSBMU01fT1VUX1RSQU5TRkVSX01PREVfRlRSVCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHRyYW5zZmVyIG1vZGUgJXVcbiIsCisJCQlfX2Z1bmNfXywgY2ZnLT5tb2RlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByYzsKK30KKworLyoKKyAqIG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZDogU2hhcmVkIElPQ1RMIGZvciB0aGlzIHBsYXRmb3JtIGRyaXZlcgorICogQHN1YnN0cmVhbTogQVNvQyBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgaW52b2tlZAorICogQGNtZDogY29tbWFuZCBmb3IgdGhlIGlvY3RsCisgKiBAYXJnOiBhcmd1bWVudCBmb3IgdGhlIGlvY3RsCisgKgorICogUGVyZm9ybSBkZWRpY2F0ZWQgbGlzdGVuIGZ1bmN0aW9ucyBsaWtlIHJlZ2lzdGVyIHNvdW5kIG1vZGVsLAorICogZGVyZWdpc3RlciBzb3VuZCBtb2RlbCwgZXRjCisgKiBDYWxsZWQgd2l0aCBsc21fYXBpX2xvY2sgYWNxdWlyZWQuCisgKi8KK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiBzbmRfbW9kZWw7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7CisJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICp1c2VyOworCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMgZGV0X3BhcmFtczsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjcGUgfHwgIWNwZS0+Y29yZV9oYW5kbGUpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbHNtX2QgfHwgIWxzbV9kLT5sc21fc2Vzc2lvbikgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHNlc3Npb24gZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9MU01fU1RPUF9MQUI6CisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6ICVzLCBsYWJfZW5hYmxlID0gJWQsIGxhYl90aHJlYWRfc3RzdHVzID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TVE9QX0xBQiIsCisJCQlzZXNzaW9uLT5sYWJfZW5hYmxlLAorCQkJbGFiX2QtPnRocmVhZF9zdGF0dXMpOworCisJCWlmIChzZXNzaW9uLT5sYWJfZW5hYmxlICYmCisJCSAgICBsYWJfZC0+dGhyZWFkX3N0YXR1cyAhPSBNU01fTFNNX0xBQl9USFJFQURfU1RPUCkgeworCQkJYXRvbWljX2luYygmbGFiX2QtPmFib3J0X3JlYWQpOworCQkJd2FrZV91cCgmbGFiX2QtPnBlcmlvZF93YWl0KTsKKwkJCXJjID0gbXNtX2NwZV9sc21fbGFiX3N0b3Aoc3Vic3RyZWFtKTsKKwkJCWlmIChyYykgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogc3RvcCBMQUIgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfSBlbHNlIGlmICghc2Vzc2lvbi0+bGFiX2VuYWJsZSkgeworCQkJZGV2X2RiZyhydGQtPmRldiwKKwkJCQkiJXM6IExBQiBhbHJlYWR5IHN0b3BwZWRcbiIsCisJCQkJX19mdW5jX18pOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9MQUJfQ09OVFJPTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXNzaW9uLT5sYWJfZW5hYmxlLCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2YodTMyKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCBzaXplb2YodTMyKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6ICVzLCBsYWJfZW5hYmxlID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9MQUJfQ09OVFJPTCIsCisJCQlzZXNzaW9uLT5sYWJfZW5hYmxlKTsKKwkJaWYgKHJ0ZC0+Y3B1X2RhaSkKKwkJCWRtYV9kYXRhID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwKKwkJCQkJCXN1YnN0cmVhbSk7CisJCWlmICghZG1hX2RhdGEgfHwgIWRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBkbWFfZGF0YSBpcyBub3Qgc2V0XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChzZXNzaW9uLT5sYWJfZW5hYmxlKSB7CisJCQlyYyA9IG1zbV9jcGVfbGFiX2J1Zl9hbGxvYyhzdWJzdHJlYW0sCisJCQkJCQkgICBzZXNzaW9uLCBkbWFfZGF0YSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogbGFiIGJ1ZmZlciBhbGxvYyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKworCQkJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJCQlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKwkJCWRtYV9idWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCQlkbWFfYnVmLT5hcmVhID0gbGFiX2QtPnBjbV9idWZbMF0ubWVtOworCQkJZG1hX2J1Zi0+YWRkciA9ICBsYWJfZC0+cGNtX2J1ZlswXS5waHlzOworCQkJZG1hX2J1Zi0+Ynl0ZXMgPSAobHNtX2QtPmh3X3BhcmFtcy5idWZfc3ogKgorCQkJCQlsc21fZC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCk7CisJCQlpbml0X2NvbXBsZXRpb24oJmxhYl9kLT50aHJlYWRfY29tcGxldGUpOworCQkJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLAorCQkJCQkJICAgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisJCQlyYyA9IGxzbV9vcHMtPmxzbV9sYWJfY29udHJvbChjcGUtPmNvcmVfaGFuZGxlLAorCQkJCQlzZXNzaW9uLCB0cnVlKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBMYWIgRW5hYmxlIEZhaWxlZCByYyAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSXQgaXMgcG9zc2libGUgdGhhdCBsYWIgaXMgc3RpbGwgZW5hYmxlZAorCQkJICogd2hlbiB0cnlpbmcgdG8gZGUtYWxsb2NhdGUgdGhlIGxhYiBidWZmZXIuCisJCQkgKiBNYWtlIHN1cmUgdG8gZGlzYWJsZSBsYWIgYmVmb3JlIGRlLWFsbG9jYXRpbmcKKwkJCSAqIHRoZSBsYWIgYnVmZmVyLgorCQkJICovCisJCQlyYyA9IG1zbV9jcGVfbHNtX2xhYl9zdG9wKHN1YnN0cmVhbSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogTEFCIHN0b3AgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCS8qCisJCQkgKiBCdWZmZXIgaGFzIHRvIGJlIGRlLWFsbG9jYXRlZCBldmVuIGlmCisJCQkgKiBsYWJfY29udHJvbCBmYWlsZWQuCisJCQkgKi8KKwkJCXJjID0gbXNtX2NwZV9sYWJfYnVmX2RlYWxsb2Moc3Vic3RyZWFtLAorCQkJCQkJICAgICBzZXNzaW9uLCBkbWFfZGF0YSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogbGFiIGJ1ZmZlciBmcmVlIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJYnJlYWs7CisJY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMjoKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogJXNcbiIsCisJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyIik7CisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogSW52YWxpZCBhcmd1bWVudCB0byBpb2N0bCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQkiU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjIiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbWVtY3B5KCZzbmRfbW9kZWwsIGFyZywKKwkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikpOworCisJCXNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQkJc25kX21vZGVsLm51bV9jb25maWRlbmNlX2xldmVsczsKKwkJcmMgPSBtc21fY3BlX2xzbV9nZXRfY29uZl9sZXZlbHMoc2Vzc2lvbiwKKwkJCQlzbmRfbW9kZWwuY29uZmlkZW5jZV9sZXZlbCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzIGdldF9jb25mX2xldmVscyBmYWlsLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyIiwKKwkJCQlyYyk7CisJCQlicmVhazsKKwkJfQorCisJCXNlc3Npb24tPnNuZF9tb2RlbF9kYXRhID0ga3phbGxvYyhzbmRfbW9kZWwuZGF0YV9zaXplLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSkgeworCQkJa2ZyZWUoc2Vzc2lvbi0+Y29uZl9sZXZlbHMpOworCQkJc2Vzc2lvbi0+Y29uZl9sZXZlbHMgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJc2Vzc2lvbi0+c25kX21vZGVsX3NpemUgPSBzbmRfbW9kZWwuZGF0YV9zaXplOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSwKKwkJCQkgICBzbmRfbW9kZWwuZGF0YSwgc25kX21vZGVsLmRhdGFfc2l6ZSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgZm9yIHNuZF9tb2RlbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlrZnJlZShzZXNzaW9uLT5jb25mX2xldmVscyk7CisJCQlrZnJlZShzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSk7CisJCQlzZXNzaW9uLT5jb25mX2xldmVscyA9IE5VTEw7CisJCQlzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSA9IE5VTEw7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJjID0gbHNtX29wcy0+bHNtX3NobWVtX2FsbG9jKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24sCisJCQkJCSAgICAgICBzZXNzaW9uLT5zbmRfbW9kZWxfc2l6ZSk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJCWtmcmVlKHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKTsKKwkJCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKKwkJCXNlc3Npb24tPnNuZF9tb2RlbF9kYXRhID0gTlVMTDsKKwkJCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJjID0gbHNtX29wcy0+bHNtX3JlZ2lzdGVyX3NuZF9tb2RlbChjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uLAorCQkJCQkJc25kX21vZGVsLmRldGVjdGlvbl9tb2RlLAorCQkJCQkJc25kX21vZGVsLmRldGVjdF9mYWlsdXJlKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBzbmRfbW9kZWxfcmVnIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJCWxzbV9vcHMtPmxzbV9zaG1lbV9kZWFsbG9jKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOworCQkJa2ZyZWUoc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEpOworCQkJa2ZyZWUoc2Vzc2lvbi0+Y29uZl9sZXZlbHMpOworCQkJc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSBOVUxMOworCQkJc2Vzc2lvbi0+Y29uZl9sZXZlbHMgPSBOVUxMOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9ERVJFR19TTkRfTU9ERUw6CisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6ICVzXG4iLAorCQkJX19mdW5jX18sICJTTkRSVl9MU01fREVSRUdfU05EX01PREVMIik7CisKKwkJaWYgKHNlc3Npb24tPmxhYl9lbmFibGUpIHsKKwkJCS8qCisJCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGxhYiBpcyBzdGlsbCBlbmFibGVkCisJCQkgKiB3aGVuIHRyeWluZyB0byBkZXJlZ2lzdGVyIHNvdW5kIG1vZGVsLgorCQkJICogTWFrZSBzdXJlIHRvIGRpc2FibGUgbGFiIGJlZm9yZSBkZS1hbGxvY2F0aW5nCisJCQkgKiB0aGUgbGFiIGJ1ZmZlci4KKwkJCSAqLworCQkJcmMgPSBtc21fY3BlX2xzbV9sYWJfc3RvcChzdWJzdHJlYW0pOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBMQUIgc3RvcCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCisJCQlyYyA9IGxzbV9vcHMtPmxzbV9sYWJfY29udHJvbChjcGUtPmNvcmVfaGFuZGxlLAorCQkJCQlzZXNzaW9uLCBmYWxzZSk7CisJCQlpZiAocmMpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBMYWIgRGlzYWJsZSBGYWlsZWQgcmMgJWRcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisKKwkJCWRtYV9kYXRhID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwKKwkJCQkJCQlzdWJzdHJlYW0pOworCQkJaWYgKCFkbWFfZGF0YSB8fCAhZG1hX2RhdGEtPmRhaV9jaGFubmVsX2N0bCkKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IGRtYV9kYXRhIGlzIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKKworCQkJLyoKKwkJCSAqIEJ1ZmZlciBoYXMgdG8gYmUgZGUtYWxsb2NhdGVkIGV2ZW4gaWYKKwkJCSAqIGxhYl9jb250cm9sIGZhaWxlZCBhbmQvb3IgZG1hIGRhdGEgaXMgaW52YWxpZC4KKwkJCSAqLworCQkJcmMgPSBtc21fY3BlX2xhYl9idWZfZGVhbGxvYyhzdWJzdHJlYW0sCisJCQkJCQlzZXNzaW9uLCBkbWFfZGF0YSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IGxhYiBidWZmZXIgZnJlZSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9CisKKwkJcmMgPSBsc21fb3BzLT5sc21fZGVyZWdpc3Rlcl9zbmRfbW9kZWwoCisJCQkJY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogc25kX21vZGVsIGRlLXJlZyBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlrZnJlZShzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSk7CisJCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKKwkJc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSBOVUxMOworCQlzZXNzaW9uLT5jb25mX2xldmVscyA9IE5VTEw7CisKKwkJcmMgPSBsc21fb3BzLT5sc21fc2htZW1fZGVhbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBMU00gc2hhcmVkIG1lbW9yeSBkZWFsbG9jIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiAlc1xuIiwKKwkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0VWRU5UX1NUQVRVUyIpOworCQlpZiAoIWFyZykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEludmFsaWQgYXJndW1lbnQgdG8gaW9jdGwgJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJIlNORFJWX0xTTV9FVkVOVF9TVEFUVVMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdXNlciA9IGFyZzsKKworCQkvKgorCQkgKiBSZWxlYXNlIHRoZSBhcGkgbG9jayBiZWZvcmUgd2FpdCB0byBhbGxvdworCQkgKiBvdGhlciBJT0NUTHMgdG8gYmUgaW52b2tlZCB3aGlsZSB3YWl0aW5nCisJCSAqIGZvciBldmVudAorCQkgKi8KKwkJTVNNX0NQRV9MU01fUkVMX0xPQ0soJmxzbV9kLT5sc21fYXBpX2xvY2ssCisJCQkJICAgICAibHNtX2FwaV9sb2NrIik7CisKKwkJcmMgPSB3YWl0X2V2ZW50X2ZyZWV6YWJsZShsc21fZC0+ZXZlbnRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJmxzbV9kLT5ldmVudF9hdmFpbCkgPT0gMSkgfHwKKwkJCQkoYXRvbWljX3JlYWQoJmxzbV9kLT5ldmVudF9zdG9wKSA9PSAxKSk7CisKKwkJTVNNX0NQRV9MU01fR1JBQl9MT0NLKCZsc21fZC0+bHNtX2FwaV9sb2NrLAorCQkJCSAgICAgICJsc21fYXBpX2xvY2siKTsKKworCQlpZiAoIXJjKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmxzbV9kLT5ldmVudF9hdmFpbCkgPT0gMSkgeworCQkJCXJjID0gMDsKKwkJCQlhdG9taWNfc2V0KCZsc21fZC0+ZXZlbnRfYXZhaWwsIDApOworCQkJCWlmIChsc21fZC0+ZXZfZGV0X3BsZF9zaXplID4KKwkJCQkJdXNlci0+cGF5bG9hZF9zaXplKSB7CisJCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCQkiJXM6IGF2YWlsIHBsZF9ieXRlcyA9ICV1LCBuZWVkZWQgPSAldVxuIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJdXNlci0+cGF5bG9hZF9zaXplLAorCQkJCQkJbHNtX2QtPmV2X2RldF9wbGRfc2l6ZSk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXVzZXItPnN0YXR1cyA9IGxzbV9kLT5ldl9kZXRfc3RhdHVzOworCQkJCXVzZXItPnBheWxvYWRfc2l6ZSA9IGxzbV9kLT5ldl9kZXRfcGxkX3NpemU7CisKKwkJCQltZW1jcHkodXNlci0+cGF5bG9hZCwKKwkJCQkgICAgICAgbHNtX2QtPmV2X2RldF9wYXlsb2FkLAorCQkJCSAgICAgICBsc21fZC0+ZXZfZGV0X3BsZF9zaXplKTsKKworCQkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmbHNtX2QtPmV2ZW50X3N0b3ApID09IDEpIHsKKwkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IHdhaXRfYWJvcnRlZFxuIiwgX19mdW5jX18pOworCQkJCXVzZXItPnBheWxvYWRfc2l6ZSA9IDA7CisJCQkJcmMgPSAwOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9BQk9SVF9FVkVOVDoKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogJXNcbiIsCisJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9BQk9SVF9FVkVOVCIpOworCQlhdG9taWNfc2V0KCZsc21fZC0+ZXZlbnRfc3RvcCwgMSk7CisJCXdha2VfdXAoJmxzbV9kLT5ldmVudF93YWl0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9TVEFSVDoKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogJXNcbiIsCisJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TVEFSVCIpOworCQlyYyA9IGxzbV9vcHMtPmxzbV9zdGFydChjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBsc21fc3RhcnQgZmFpbCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlzZXNzaW9uLT5zdGFydGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9TVE9QOgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiAlcywgbGFiX2VuYWJsZSA9ICVkLCBsYWJfdGhyZWFkX3N0YXR1cyA9ICVkXG4iLAorCQkJX19mdW5jX18sICJTTkRSVl9MU01fU1RPUCIsCisJCQlzZXNzaW9uLT5sYWJfZW5hYmxlLAorCQkJbGFiX2QtPnRocmVhZF9zdGF0dXMpOworCQlpZiAoKHNlc3Npb24tPmxhYl9lbmFibGUgJiYKKwkJICAgICBsYWJfZC0+dGhyZWFkX3N0YXR1cyA9PQorCQkgICAgIE1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HKSkgeworCQkJLyogRXhwbGljaXRseSBzdG9wIExBQiAqLworCQkJcmMgPSBtc21fY3BlX2xzbV9sYWJfc3RvcChzdWJzdHJlYW0pOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBsYWJfc3RvcCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCisJCXJjID0gbHNtX29wcy0+bHNtX3N0b3AoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogbHNtX3N0b3AgZmFpbCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCisJCQlyZXR1cm4gcmM7CisJCX0KKwkJc2Vzc2lvbi0+c3RhcnRlZCA9IGZhbHNlOworCQlicmVhazsKKworCWNhc2UgU05EUlZfTFNNX1NFVF9QQVJBTVM6CisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXMgSW52YWxpZCBhcmd1bWVudFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TRVRfUEFSQU1TIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZW1jcHkoJmRldF9wYXJhbXMsIGFyZywKKwkJCXNpemVvZihkZXRfcGFyYW1zKSk7CisJCWlmIChkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVscyA8PSAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEludmFsaWQgY29uZmlkZW5jZSBsZXZlbHMgJXVcbiIsCisJCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BBUkFNUyIsCisJCQkJZGV0X3BhcmFtcy5udW1fY29uZmlkZW5jZV9sZXZlbHMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQorCQkJCWRldF9wYXJhbXMubnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCQlyYyA9IG1zbV9jcGVfbHNtX2dldF9jb25mX2xldmVscyhzZXNzaW9uLAorCQkJCQkJZGV0X3BhcmFtcy5jb25mX2xldmVsKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXMgZ2V0X2NvbmZfbGV2ZWxzIGZhaWwsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiLAorCQkJCXJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmMgPSBsc21fb3BzLT5sc21fc2V0X2RhdGEoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbiwKKwkJCQkJICAgZGV0X3BhcmFtcy5kZXRlY3RfbW9kZSwKKwkJCQkJICAgZGV0X3BhcmFtcy5kZXRlY3RfZmFpbHVyZSk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IGxzbV9zZXRfZGF0YSBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlrZnJlZShzZXNzaW9uLT5jb25mX2xldmVscyk7CisJCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0gTlVMTDsKKworCQlicmVhazsKKworCQljYXNlIFNORFJWX0xTTV9PVVRfRk9STUFUX0NGRzogeworCQkJc3RydWN0IHNuZF9sc21fb3V0cHV0X2Zvcm1hdF9jZmcgdV9mbXRfY2ZnOworCisJCQlpZiAoIWFyZykgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogSW52YWxpZCBhcmd1bWVudCB0byBpb2N0bCAlc1xuIiwKKwkJCQkJX19mdW5jX18sICJTTkRSVl9MU01fT1VUX0ZPUk1BVF9DRkciKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1X2ZtdF9jZmcsIGFyZywKKwkJCQkJICAgc2l6ZW9mKHVfZm10X2NmZykpKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgZm9yIG91dF9mbXRfY2ZnXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWlmIChtc21fY3BlX2xzbV92YWxpZGF0ZV9vdXRfZm9ybWF0KHN1YnN0cmVhbSwKKwkJCQkJCQkgICAgJnVfZm10X2NmZykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNlc3Npb24tPm91dF9mbXRfY2ZnLmZvcm1hdCA9IHVfZm10X2NmZy5mb3JtYXQ7CisJCQlzZXNzaW9uLT5vdXRfZm10X2NmZy5wYWNrX21vZGUgPSB1X2ZtdF9jZmcucGFja2luZzsKKwkJCXNlc3Npb24tPm91dF9mbXRfY2ZnLmRhdGFfcGF0aF9ldmVudHMgPQorCQkJCQkJdV9mbXRfY2ZnLmV2ZW50czsKKwkJCXNlc3Npb24tPm91dF9mbXRfY2ZnLnRyYW5zZmVyX21vZGUgPSB1X2ZtdF9jZmcubW9kZTsKKworCQkJcmMgPSBsc21fb3BzLT5sc21fc2V0X2ZtdF9jZmcoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkJCSAgICAgIHNlc3Npb24pOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBsc21fc2V0X2ZtdF9jZmcgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBEZWZhdWx0IHNuZF9saWJfaW9jdGwgY21kIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fbGFiX3N0YXJ0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKmV2ZW50X3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9IE5VTEw7CisJc3RydWN0IGNwZV9od19wYXJhbXMgKmh3X3BhcmFtczsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHM7CisJc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnICpvdXRfcG9ydDsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzdWJzdHJlYW0gKCVwSylcbiIsCisJCQlfX2Z1bmNfXywgc3Vic3RyZWFtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7CisJY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKworCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWxzbV9kIHx8ICFsc21fZC0+bHNtX3Nlc3Npb24pIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisJbGFiX2QgPSAmbHNtX2QtPmxhYjsKKwlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKKwlod19wYXJhbXMgPSAmbHNtX2QtPmh3X3BhcmFtczsKKworCWlmICghc2Vzc2lvbi0+c3RhcnRlZCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBTZXNzaW9uIGlzIHN0b3BwZWQsIGNhbm5vdCBzdGFydCBMQUJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXJlaW5pdF9jb21wbGV0aW9uKCZsYWJfZC0+dGhyZWFkX2NvbXBsZXRlKTsKKworCWlmIChzZXNzaW9uLT5sYWJfZW5hYmxlICYmCisJICAgIGV2ZW50X3N0YXR1cy0+c3RhdHVzID09CisJICAgIExTTV9WT0lDRV9XQUtFVVBfU1RBVFVTX0RFVEVDVEVEKSB7CisJCW91dF9wb3J0ID0gJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmc7CisJCW91dF9wb3J0LT5wb3J0X2lkID0gc2Vzc2lvbi0+YWZlX291dF9wb3J0X2lkOworCQlvdXRfcG9ydC0+Yml0X3dpZHRoID0gaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZTsKKwkJb3V0X3BvcnQtPm51bV9jaGFubmVscyA9IGh3X3BhcmFtcy0+Y2hhbm5lbHM7CisJCW91dF9wb3J0LT5zYW1wbGVfcmF0ZSA9IGh3X3BhcmFtcy0+c2FtcGxlX3JhdGU7CisJCWRldl9kYmcocnRkLT5kZXYsICIlczogcG9ydF9pZD0gJXUsIGJpdF93aWR0aD0gJXUsIHJhdGU9ICV1XG4iLAorCQkJIF9fZnVuY19fLCBvdXRfcG9ydC0+cG9ydF9pZCwgb3V0X3BvcnQtPmJpdF93aWR0aCwKKwkJCW91dF9wb3J0LT5zYW1wbGVfcmF0ZSk7CisKKwkJcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9jbWRfY2ZnKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJCSAgICAgICBvdXRfcG9ydCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCBhZmUgZ2VuZXJpYyBjb25maWcgdjIsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlhdG9taWNfc2V0KCZsYWJfZC0+YWJvcnRfcmVhZCwgMCk7CisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6IEtXIGRldGVjdGVkLCBzY2hlZHVsaW5nIExBQiB0aHJlYWRcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwkJLyoKKwkJICogRXZlbiB0aG91Z2ggdGhyZWFkIG1pZ2h0IGJlIG9ubHkgc2NoZWR1bGVkIGFuZAorCQkgKiBub3QgY3VycmVudGx5IHJ1bm5pbmcsIG1hcmsgdGhlIGludGVybmFsIGRyaXZlcgorCQkgKiBzdGF0dXMgdG8gcnVubmluZyBzbyBkcml2ZXIgY2FuIGNhbmNlbCB0aGlzIHRocmVhZAorCQkgKiBpZiBpdCBuZWVkcyB0byBiZWZvcmUgdGhlIHRocmVhZCBnZXRzIGNoYW5jZSB0byBydW4uCisJCSAqLworCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HOworCQlzZXNzaW9uLT5sc21fbGFiX3RocmVhZCA9IGt0aHJlYWRfcnVuKAorCQkJCW1zbV9jcGVfbGFiX3RocmVhZCwKKwkJCQlsc21fZCwKKwkJCQkibGFiX3RocmVhZCIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBtc21fY3BlX2xzbV9pc192YWxpZF9zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWNvbnN0IGNoYXIgKmZ1bmMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IE5VTEw7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOworCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7CisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzdWJzdHJlYW0gKCVwSylcbiIsCisJCQlmdW5jLCBzdWJzdHJlYW0pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7CisJY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKworCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLAorCQkJZnVuYyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWxzbV9kIHx8ICFsc21fZC0+bHNtX3Nlc3Npb24pIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCisJCQlmdW5jKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisKKwlpZiAoIWxzbV9vcHMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBsc21fb3BzXG4iLCBmdW5jKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX3NldF9lcGQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKKwlzdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgZXBkX3RocmVzOworCWludCByYzsKKworCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKKworCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGVwZF90aHJlcykpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmZXBkX3RocmVzLCBwX2luZm8tPnBhcmFtX2RhdGEsCisJCQkgICBwX2luZm8tPnBhcmFtX3NpemUpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCXJjID0gbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0oY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQlzZXNzaW9uLCBwX2luZm8sICZlcGRfdGhyZXMsCisJCQkJTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQpOworCWlmICh1bmxpa2VseShyYykpCisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IHNldF9vbmVfcGFyYW0oZXBkX3RocmVzaG9sZCkgZmFpbGVkLCByYyAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7Citkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fY3BlX2xzbV9zZXRfbW9kZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBOVUxMOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCXN0cnVjdCBzbmRfbHNtX2RldGVjdF9tb2RlIGRldF9tb2RlOworCWludCByYzsKKworCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKKworCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGRldF9tb2RlKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtX3NpemUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfbW9kZSwgcF9pbmZvLT5wYXJhbV9kYXRhLAorCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJc2Vzc2lvbiwgcF9pbmZvLCAmZGV0X21vZGUsCisJCQkJTFNNX09QRVJBVElPTl9NT0RFKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBzZXRfb25lX3BhcmFtKGVwZF90aHJlc2hvbGQpIGZhaWxlZCwgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2dhaW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKKwlzdHJ1Y3Qgc25kX2xzbV9nYWluIGdhaW47CisJaW50IHJjOworCisJaWYgKCFtc21fY3BlX2xzbV9pc192YWxpZF9zdHJlYW0oc3Vic3RyZWFtLCBfX2Z1bmNfXykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7CisJY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOworCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOworCisJaWYgKHBfaW5mby0+cGFyYW1fc2l6ZSAhPSBzaXplb2YoZ2FpbikpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2FpbiwgcF9pbmZvLT5wYXJhbV9kYXRhLAorCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJc2Vzc2lvbiwgcF9pbmZvLCAmZ2FpbiwKKwkJCQlMU01fR0FJTik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogc2V0X29uZV9wYXJhbShlcGRfdGhyZXNob2xkKSBmYWlsZWQsIHJjICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKK2RvbmU6CisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2NvbmYoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKKwlpbnQgcmM7CisKKwlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKKwljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisKKwlzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQorCQkJcF9pbmZvLT5wYXJhbV9zaXplOworCXJjID0gbXNtX2NwZV9sc21fZ2V0X2NvbmZfbGV2ZWxzKHNlc3Npb24sCisJCQlwX2luZm8tPnBhcmFtX2RhdGEpOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBnZXRfY29uZl9sZXZlbHMgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJc2Vzc2lvbiwgcF9pbmZvLCBOVUxMLAorCQkJCUxTTV9NSU5fQ09ORklERU5DRV9MRVZFTFMpOworCWlmICh1bmxpa2VseShyYykpCisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IHNldF9vbmVfcGFyYW0oY29uZl9sZXZlbHMpIGZhaWxlZCwgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fcmVnX21vZGVsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IE5VTEw7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOworCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7CisJaW50IHJjOworCXNpemVfdCBvZmZzZXQ7CisJdTggKnNuZF9tb2RlbF9wdHI7CisKKwlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKKwljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisKKwlsc21fb3BzLT5sc21fZ2V0X3NuZF9tb2RlbF9vZmZzZXQoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCXNlc3Npb24sICZvZmZzZXQpOworCXNlc3Npb24tPnNuZF9tb2RlbF9zaXplID0gcF9pbmZvLT5wYXJhbV9zaXplICsgb2Zmc2V0OworCisJc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSB2emFsbG9jKHNlc3Npb24tPnNuZF9tb2RlbF9zaXplKTsKKwlpZiAoIXNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNuZF9tb2RlbF9wdHIgPSAoKHU4ICopIHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKSArIG9mZnNldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihzbmRfbW9kZWxfcHRyLAorCQkJICAgcF9pbmZvLT5wYXJhbV9kYXRhLCBwX2luZm8tPnBhcmFtX3NpemUpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBzbmRfbW9kZWwgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9zbmRfbW9kZWxfZGF0YTsKKwl9CisKKwlyYyA9IGxzbV9vcHMtPmxzbV9zaG1lbV9hbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uLAorCQkJCSAgICAgIHNlc3Npb24tPnNuZF9tb2RlbF9zaXplKTsKKwlpZiAocmMgIT0gMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX3NuZF9tb2RlbF9kYXRhOworCX0KKworCXJjID0gbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0oY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQlzZXNzaW9uLCBwX2luZm8sIE5VTEwsCisJCQkJTFNNX1JFR19TTkRfTU9ERUwpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogc2V0X29uZV9wYXJhbShzbmRfbW9kZWwpIGZhaWxlZCwgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRlYWxsb2Nfc2htZW07CisJfQorCXJldHVybiAwOworCitkZWFsbG9jX3NobWVtOgorCWxzbV9vcHMtPmxzbV9zaG1lbV9kZWFsbG9jKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOworCitmcmVlX3NuZF9tb2RlbF9kYXRhOgorCXZmcmVlKHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fZGVyZWdfbW9kZWwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisJc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKKwlpbnQgcmM7CisKKwlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKKwljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOworCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247CisJbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7CisKKwlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJc2Vzc2lvbiwgcF9pbmZvLCBOVUxMLAorCQkJCUxTTV9ERVJFR19TTkRfTU9ERUwpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogZGVyZWdfc25kX21vZGVsIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwlyZXR1cm4gbHNtX29wcy0+bHNtX3NobWVtX2RlYWxsb2MoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2N1c3RvbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBOVUxMOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCXU4ICpkYXRhOworCWludCByYzsKKworCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKKworCWlmIChwX2luZm8tPnBhcmFtX3NpemUgPiBNU01fQ1BFX01BWF9DVVNUT01fUEFSQU1fU0laRSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBpbnZhbGlkIHNpemUgJWQsIG1heCBhbGxvd2VkICVkXG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSwKKwkJCU1TTV9DUEVfTUFYX0NVU1RPTV9QQVJBTV9TSVpFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IGt6YWxsb2MocF9pbmZvLT5wYXJhbV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHBfaW5mby0+cGFyYW1fZGF0YSwKKwkJCSAgIHBfaW5mby0+cGFyYW1fc2l6ZSkpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkIGZvciBjdXN0b20gcGFyYW1zLCBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJcmMgPSBsc21fb3BzLT5sc21fc2V0X29uZV9wYXJhbShjcGUtPmNvcmVfaGFuZGxlLAorCQkJCXNlc3Npb24sIHBfaW5mbywgZGF0YSwKKwkJCQlMU01fQ1VTVE9NX1BBUkFNUyk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBjdXN0b21fcGFyYW1zIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworZXJyX3JldDoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fcHJvY2Vzc19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgKnBfZGF0YSwKKwkJdm9pZCAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm87CisJaW50IGk7CisJaW50IHJjID0gMDsKKworCXBfaW5mbyA9IChzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICopIHBhcmFtczsKKworCWZvciAoaSA9IDA7IGkgPCBwX2RhdGEtPm51bV9wYXJhbXM7IGkrKykgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBwYXJhbSAoJWQpLCBtb2R1bGVfaWQgPSAweCV4LCBwYXJhbV9pZCA9IDB4JXgsIHBhcmFtX3NpemUgPSAweCV4LCBwYXJhbV90eXBlID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpLCBwX2luZm8tPm1vZHVsZV9pZCwKKwkJCXBfaW5mby0+cGFyYW1faWQsIHBfaW5mby0+cGFyYW1fc2l6ZSwKKwkJCXBfaW5mby0+cGFyYW1fdHlwZSk7CisKKwkJc3dpdGNoIChwX2luZm8tPnBhcmFtX3R5cGUpIHsKKwkJY2FzZSBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRDoKKwkJCXJjID0gbXNtX2NwZV9sc21fc2V0X2VwZChzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fT1BFUkFUSU9OX01PREU6CisJCQlyYyA9IG1zbV9jcGVfbHNtX3NldF9tb2RlKHN1YnN0cmVhbSwgcF9pbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIExTTV9HQUlOOgorCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfZ2FpbihzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fTUlOX0NPTkZJREVOQ0VfTEVWRUxTOgorCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfY29uZihzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fUkVHX1NORF9NT0RFTDoKKwkJCXJjID0gbXNtX2NwZV9sc21fcmVnX21vZGVsKHN1YnN0cmVhbSwgcF9pbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIExTTV9ERVJFR19TTkRfTU9ERUw6CisJCQlyYyA9IG1zbV9jcGVfbHNtX2RlcmVnX21vZGVsKHN1YnN0cmVhbSwgcF9pbmZvKTsKKwkJCWJyZWFrOworCQljYXNlIExTTV9DVVNUT01fUEFSQU1TOgorCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfY3VzdG9tKHN1YnN0cmVhbSwgcF9pbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEludmFsaWQgcGFyYW1fdHlwZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV90eXBlKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogc2V0X3BhcmFtIGZhaWwgZm9yIHBhcmFtX3R5cGUgJWRcbiIsCisJCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fdHlwZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlwX2luZm8rKzsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCisJaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc3Vic3RyZWFtICglcEspXG4iLAorCQkJX19mdW5jX18sIHN1YnN0cmVhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNU01fQ1BFX0xTTV9HUkFCX0xPQ0soJmxzbV9kLT5sc21fYXBpX2xvY2ssCisJCQkgICAgICAibHNtX2FwaV9sb2NrIik7CisKKwlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOworCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOiB7CisJCXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyIHNuZF9tb2RlbDsKKworCQlpZiAoc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiTFNNX1JFR19TTkRfTU9ERUxfVjIiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzbmRfbW9kZWwsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzaXplb2Yoc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIpKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCisJCQkJCSAgICAgICAmc25kX21vZGVsKTsKKwl9CisJCWJyZWFrOworCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVUzogeworCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgdV9ldmVudF9zdGF0dXM7CisJCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyAqZXZlbnRfc3RhdHVzID0gTlVMTDsKKwkJaW50IHVfcGxkX3NpemUgPSAwOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdV9ldmVudF9zdGF0dXMsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IGV2ZW50IHN0YXR1cyBjb3B5IGZyb20gdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMpKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAodV9ldmVudF9zdGF0dXMucGF5bG9hZF9zaXplID4KKwkJICAgIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IHBheWxvYWRfc2l6ZSAlZCBpcyBpbnZhbGlkLCBtYXggYWxsb3dlZCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCB1X2V2ZW50X3N0YXR1cy5wYXlsb2FkX3NpemUsCisJCQkJTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQl1X3BsZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykgKworCQkJCXVfZXZlbnRfc3RhdHVzLnBheWxvYWRfc2l6ZTsKKworCQlldmVudF9zdGF0dXMgPSBremFsbG9jKHVfcGxkX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWV2ZW50X3N0YXR1cykgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIHsKKwkJCWV2ZW50X3N0YXR1cy0+cGF5bG9hZF9zaXplID0KKwkJCQl1X2V2ZW50X3N0YXR1cy5wYXlsb2FkX3NpemU7CisJCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLAorCQkJCQkJICAgICAgIGNtZCwgZXZlbnRfc3RhdHVzKTsKKwkJfQorCisJCWlmICghZXJyICAmJiBjb3B5X3RvX3VzZXIoYXJnLCBldmVudF9zdGF0dXMsIHVfcGxkX3NpemUpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSB0byB1c2VyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlrZnJlZShldmVudF9zdGF0dXMpOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCW1zbV9jcGVfbHNtX2xhYl9zdGFydChzdWJzdHJlYW0sIGV2ZW50X3N0YXR1cyk7CisJCW1zbV9jcGVfcHJvY2Vzc19ldmVudF9zdGF0dXNfZG9uZShsc21fZCk7CisJCWtmcmVlKGV2ZW50X3N0YXR1cyk7CisJfQorCQlicmVhazsKKwljYXNlIFNORFJWX0xTTV9TRVRfUEFSQU1TOiB7CisJCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMgZGV0X3BhcmFtczsKKworCQlpZiAoc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfcGFyYW1zLCAodm9pZCAqKSBhcmcsCisJCQkJICAgc2l6ZW9mKGRldF9wYXJhbXMpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlemRcbiIsCisJCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BBUkFNUyIsCisJCQkJc2l6ZW9mKGRldF9wYXJhbXMpKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCisJCQkJCSAgICAgICAmZGV0X3BhcmFtcyk7CisJfQorCQlicmVhazsKKworCWNhc2UgU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TOiB7CisJCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgcF9kYXRhOworCQlzaXplX3QgcF9zaXplOworCQl1OCAqcGFyYW1zOworCisJCWlmICghc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IE5vIFBhcmFtIGRhdGEgdG8gc2V0XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwX2RhdGEsIGFyZywKKwkJCQkgICBzaXplb2YocF9kYXRhKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLCAicF9kYXRhIiwgc2l6ZW9mKHBfZGF0YSkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlpZiAocF9kYXRhLm51bV9wYXJhbXMgPiBMU01fUEFSQU1TX01BWCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBJbnZhbGlkIG51bV9wYXJhbXMgJWRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsCisJCQkJcF9kYXRhLm51bV9wYXJhbXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwX3NpemUgPSBwX2RhdGEubnVtX3BhcmFtcyAqCisJCQkgc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm8pOworCisJCWlmIChwX2RhdGEuZGF0YV9zaXplICE9IHBfc2l6ZSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBJbnZhbGlkIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVMiLCBwX3NpemUpOworCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXBhcmFtcyA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYXJhbXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW1zLCBwX2RhdGEucGFyYW1zLAorCQkJCSAgIHBfZGF0YS5kYXRhX3NpemUpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCAicGFyYW1zIiwgcF9kYXRhLmRhdGFfc2l6ZSk7CisJCQlrZnJlZShwYXJhbXMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQllcnIgPSBtc21fY3BlX2xzbV9wcm9jZXNzX3BhcmFtcyhzdWJzdHJlYW0sICZwX2RhdGEsIHBhcmFtcyk7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEZhaWxlZCB0byBzZXQgcGFyYW1zLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIiwgZXJyKTsKKwkJa2ZyZWUocGFyYW1zKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCU1TTV9DUEVfTFNNX1JFTF9MT0NLKCZsc21fZC0+bHNtX2FwaV9sb2NrLAorCQkJICAgICAibHNtX2FwaV9sb2NrIik7CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1czMyIHsKKwl1MTYgc3RhdHVzOworCXUxNiBwYXlsb2FkX3NpemU7CisJdTggcGF5bG9hZFswXTsKK307CisKK3N0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyXzMyIHsKKwljb21wYXRfdXB0cl90IGRhdGE7CisJY29tcGF0X3VwdHJfdCBjb25maWRlbmNlX2xldmVsOworCXUzMiBkYXRhX3NpemU7CisJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0aW9uX21vZGU7CisJdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Cit9OworCitzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyIHsKKwljb21wYXRfdXB0cl90IGNvbmZfbGV2ZWw7CisJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGU7CisJdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Cit9OworCitzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyIHsKKwl1MzIgbW9kdWxlX2lkOworCXUzMiBwYXJhbV9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKKwljb21wYXRfdXB0cl90IHBhcmFtX2RhdGE7CisJZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlOworfTsKKworc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtc18zMiB7CisJY29tcGF0X3VwdHJfdCBwYXJhbXM7CisJdTMyIG51bV9wYXJhbXM7CisJdTMyIGRhdGFfc2l6ZTsKK307CisKK2VudW0geworCVNORFJWX0xTTV9FVkVOVF9TVEFUVVMzMiA9CisJCV9JT1coJ1UnLCAweDAyLCBzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMzMiksCisJU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIgPQorCQlfSU9XKCdVJywgMHgwNywgc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjJfMzIpLAorCVNORFJWX0xTTV9TRVRfUEFSQU1TMzIgPQorCQlfSU9XKCdVJywgMHgwQSwgc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtc18zMiksCisJU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TXzMyID0KKwkJX0lPVygnVScsIDB4MEIsIHN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXNfMzIpLAorfTsKKworc3RhdGljIGludCBtc21fY3BlX2xzbV9pb2N0bF9jb21wYXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOworCisJaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc3Vic3RyZWFtICglcEspXG4iLAorCQkJX19mdW5jX18sIHN1YnN0cmVhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlNU01fQ1BFX0xTTV9HUkFCX0xPQ0soJmxzbV9kLT5sc21fYXBpX2xvY2ssCisJCQkgICAgICAibHNtX2FwaV9sb2NrIik7CisKKwlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOworCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyXzMyOiB7CisJCXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyIHNuZF9tb2RlbDsKKwkJc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjJfMzIgc25kX21vZGVsMzI7CisKKwkJaWYgKHNlc3Npb24tPmlzX3RvcG9sb2d5X3VzZWQpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogbm90IHN1cHBvcnRlZCBpZiB1c2luZyB0b3BvbG9neVxuIiwKKwkJCQlfX2Z1bmNfXywgIkxTTV9SRUdfU05EX01PREVMX1YyXzMyIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6IGlvY3RsICVzXG4iLCBfX2Z1bmNfXywKKwkJCSJTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc25kX21vZGVsMzIsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihzbmRfbW9kZWwzMikpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzaXplb2Yoc25kX21vZGVsMzIpKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlzbmRfbW9kZWwuZGF0YSA9IGNvbXBhdF9wdHIoc25kX21vZGVsMzIuZGF0YSk7CisJCXNuZF9tb2RlbC5jb25maWRlbmNlX2xldmVsID0KKwkJCWNvbXBhdF9wdHIoc25kX21vZGVsMzIuY29uZmlkZW5jZV9sZXZlbCk7CisJCXNuZF9tb2RlbC5kYXRhX3NpemUgPSBzbmRfbW9kZWwzMi5kYXRhX3NpemU7CisJCXNuZF9tb2RlbC5kZXRlY3RfZmFpbHVyZSA9IHNuZF9tb2RlbDMyLmRldGVjdF9mYWlsdXJlOworCQlzbmRfbW9kZWwubnVtX2NvbmZpZGVuY2VfbGV2ZWxzID0KKwkJCXNuZF9tb2RlbDMyLm51bV9jb25maWRlbmNlX2xldmVsczsKKwkJc25kX21vZGVsLmRldGVjdGlvbl9tb2RlID0gc25kX21vZGVsMzIuZGV0ZWN0aW9uX21vZGU7CisKKwkJY21kID0gU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjI7CisJCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgJnNuZF9tb2RlbCk7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXMgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCSJTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMiIsCisJCQkJZXJyKTsKKwl9CisJCWJyZWFrOworCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVUzMyOiB7CisJCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyAqZXZlbnRfc3RhdHVzID0gTlVMTDsKKwkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzIHVfZXZlbnRfc3RhdHVzMzI7CisJCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyAqdWRhdGFfMzIgPSBOVUxMOworCQlpbnQgdV9wbGRfc2l6ZSA9IDA7CisKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogaW9jdGwgJXNcbiIsIF9fZnVuY19fLAorCQkJIlNORFJWX0xTTV9FVkVOVF9TVEFUVVMzMiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdV9ldmVudF9zdGF0dXMzMiwgKHZvaWQgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogZXZlbnQgc3RhdHVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykpOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmICh1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZSA+CisJCSAgIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IHBheWxvYWRfc2l6ZSAlZCBpcyBpbnZhbGlkLCBtYXggYWxsb3dlZCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCB1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZSwKKwkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXVfcGxkX3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKSArCisJCQkJdV9ldmVudF9zdGF0dXMzMi5wYXlsb2FkX3NpemU7CisJCWV2ZW50X3N0YXR1cyA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZXZlbnRfc3RhdHVzKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogTm8gbWVtb3J5IGZvciBldmVudCBzdGF0dXNcbiIsCisJCQkJX19mdW5jX18pOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIHsKKwkJCWV2ZW50X3N0YXR1cy0+cGF5bG9hZF9zaXplID0KKwkJCQl1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZTsKKwkJCWNtZCA9IFNORFJWX0xTTV9FVkVOVF9TVEFUVVM7CisJCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLAorCQkJCQkJICAgICAgIGNtZCwgZXZlbnRfc3RhdHVzKTsKKwkJCWlmIChlcnIpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiAlcyBmYWlsZWQsIGVycm9yID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQkiU05EUlZfTFNNX0VWRU5UX1NUQVRVUzMyIiwKKwkJCQkJZXJyKTsKKwkJfQorCisJCWlmICghZXJyKSB7CisJCQl1ZGF0YV8zMiA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXVkYXRhXzMyKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBub21lbSBmb3IgdWRhdGFcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQl1ZGF0YV8zMi0+c3RhdHVzID0gZXZlbnRfc3RhdHVzLT5zdGF0dXM7CisJCQkJdWRhdGFfMzItPnBheWxvYWRfc2l6ZSA9CisJCQkJCWV2ZW50X3N0YXR1cy0+cGF5bG9hZF9zaXplOworCQkJCW1lbWNweSh1ZGF0YV8zMi0+cGF5bG9hZCwKKwkJCQkgICAgICAgZXZlbnRfc3RhdHVzLT5wYXlsb2FkLAorCQkJCSAgICAgICB1X3BsZF9zaXplKTsKKwkJCX0KKwkJfQorCisJCWlmICghZXJyICAmJiBjb3B5X3RvX3VzZXIoYXJnLCB1ZGF0YV8zMiwKKwkJCQkJICB1X3BsZF9zaXplKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IGNvcHkgdG8gdXNlciBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJa2ZyZWUoZXZlbnRfc3RhdHVzKTsKKwkJCWtmcmVlKHVkYXRhXzMyKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQltc21fY3BlX2xzbV9sYWJfc3RhcnQoc3Vic3RyZWFtLCBldmVudF9zdGF0dXMpOworCQltc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzX2RvbmUobHNtX2QpOworCQlrZnJlZShldmVudF9zdGF0dXMpOworCQlrZnJlZSh1ZGF0YV8zMik7CisJfQorCQlicmVhazsKKwljYXNlIFNORFJWX0xTTV9TRVRfUEFSQU1TMzI6IHsKKwkJc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtc18zMiBkZXRfcGFyYW1zMzI7CisJCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMgZGV0X3BhcmFtczsKKworCQlpZiAoc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMzMiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRldF9wYXJhbXMzMiwgYXJnLAorCQkJCSAgIHNpemVvZihkZXRfcGFyYW1zMzIpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVNfMzIiLAorCQkJCXNpemVvZihkZXRfcGFyYW1zMzIpKTsKKwkJfSBlbHNlIHsKKwkJCWRldF9wYXJhbXMuY29uZl9sZXZlbCA9CisJCQkJY29tcGF0X3B0cihkZXRfcGFyYW1zMzIuY29uZl9sZXZlbCk7CisJCQlkZXRfcGFyYW1zLmRldGVjdF9tb2RlID0KKwkJCQlkZXRfcGFyYW1zMzIuZGV0ZWN0X21vZGU7CisJCQlkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQkJZGV0X3BhcmFtczMyLm51bV9jb25maWRlbmNlX2xldmVsczsKKwkJCWRldF9wYXJhbXMuZGV0ZWN0X2ZhaWx1cmUgPQorCQkJCWRldF9wYXJhbXMzMi5kZXRlY3RfZmFpbHVyZTsKKwkJCWNtZCA9IFNORFJWX0xTTV9TRVRfUEFSQU1TOworCQkJZXJyID0gbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLAorCQkJCQkJICAmZGV0X3BhcmFtcyk7CisJCQlpZiAoZXJyKQorCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogaW9jdGwgJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJIlNORFJWX0xTTV9TRVRfUEFSQU1TIik7CisJCX0KKworCQlicmVhazsKKwl9CisKKwljYXNlIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNU18zMjogeworCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zXzMyIHBfZGF0YV8zMjsKKwkJc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtcyBwX2RhdGE7CisJCXU4ICpwYXJhbXMsICpwYXJhbXMzMjsKKwkJc2l6ZV90IHBfc2l6ZTsKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMiAqcF9pbmZvXzMyOworCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm87CisJCWludCBpOworCisJCWlmICghc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TXzMyIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IE5vIFBhcmFtIGRhdGEgdG8gc2V0XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwX2RhdGFfMzIsIGFyZywKKwkJCQkgICBzaXplb2YocF9kYXRhXzMyKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAorCQkJCXNpemVvZihwX2RhdGFfMzIpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcF9kYXRhLnBhcmFtcyA9IGNvbXBhdF9wdHIocF9kYXRhXzMyLnBhcmFtcyk7CisJCXBfZGF0YS5udW1fcGFyYW1zID0gcF9kYXRhXzMyLm51bV9wYXJhbXM7CisJCXBfZGF0YS5kYXRhX3NpemUgPSBwX2RhdGFfMzIuZGF0YV9zaXplOworCisJCWlmIChwX2RhdGEubnVtX3BhcmFtcyA+IExTTV9QQVJBTVNfTUFYKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEludmFsaWQgbnVtX3BhcmFtcyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TXzMyIiwKKwkJCQlwX2RhdGEubnVtX3BhcmFtcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChwX2RhdGEuZGF0YV9zaXplICE9CisJCSAgICAocF9kYXRhLm51bV9wYXJhbXMgKiBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMikpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEludmFsaWQgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TXzMyIiwKKwkJCQlwX2RhdGEuZGF0YV9zaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIpICoKKwkJCSBwX2RhdGEubnVtX3BhcmFtczsKKworCQlwYXJhbXMzMiA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYXJhbXMzMikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvKSAqIHBfZGF0YS5udW1fcGFyYW1zOworCQlwYXJhbXMgPSBremFsbG9jKHBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGFyYW1zKSB7CisJCQlrZnJlZShwYXJhbXMzMik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbXMzMiwgcF9kYXRhLnBhcmFtcywKKwkJCQkgICBwX2RhdGEuZGF0YV9zaXplKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgInBhcmFtczMyIiwgcF9kYXRhLmRhdGFfc2l6ZSk7CisJCQlrZnJlZShwYXJhbXMzMik7CisJCQlrZnJlZShwYXJhbXMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlwX2luZm9fMzIgPSAoc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMiAqKSBwYXJhbXMzMjsKKwkJcF9pbmZvID0gKHN0cnVjdCBsc21fcGFyYW1zX2luZm8gKikgcGFyYW1zOworCQlmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLm51bV9wYXJhbXM7IGkrKykgeworCQkJcF9pbmZvLT5tb2R1bGVfaWQgPSBwX2luZm9fMzItPm1vZHVsZV9pZDsKKwkJCXBfaW5mby0+cGFyYW1faWQgPSBwX2luZm9fMzItPnBhcmFtX2lkOworCQkJcF9pbmZvLT5wYXJhbV9zaXplID0gcF9pbmZvXzMyLT5wYXJhbV9zaXplOworCQkJcF9pbmZvLT5wYXJhbV9kYXRhID0gY29tcGF0X3B0cihwX2luZm9fMzItPnBhcmFtX2RhdGEpOworCQkJcF9pbmZvLT5wYXJhbV90eXBlID0gcF9pbmZvXzMyLT5wYXJhbV90eXBlOworCisJCQlwX2luZm9fMzIrKzsKKwkJCXBfaW5mbysrOworCQl9CisKKwkJZXJyID0gbXNtX2NwZV9sc21fcHJvY2Vzc19wYXJhbXMoc3Vic3RyZWFtLAorCQkJCQkgICAgICZwX2RhdGEsIHBhcmFtcyk7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIHByb2Nlc3MgcGFyYW1zLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJa2ZyZWUocGFyYW1zKTsKKwkJa2ZyZWUocGFyYW1zMzIpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJZXJyID0gbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOworCQlicmVhazsKKwl9Citkb25lOgorCU1TTV9DUEVfTFNNX1JFTF9MT0NLKCZsc21fZC0+bHNtX2FwaV9sb2NrLAorCQkJICAgICAibHNtX2FwaV9sb2NrIik7CisJcmV0dXJuIGVycjsKK30KKworI2Vsc2UKKyNkZWZpbmUgbXNtX2NwZV9sc21faW9jdGxfY29tcGF0IE5VTEwKKyNlbmRpZgorCisvKgorICogbXNtX2NwZV9sc21fcHJlcGFyZTogcHJlcGFyZSBjYWxsIGZyb20gQVNvQyBjb3JlIGZvciB0aGlzIHBsYXRmb3JtCisgKiBAc3Vic3RyZWFtOiBBU29DIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyBpbnZva2VkCisgKgorICogc3RhcnQgdGhlIEFGRSBwb3J0IG9uIENQRSBhc3NvY2lhdGVkIGZvciB0aGlzIGxpc3RlbiBzZXNzaW9uCisgKi8KK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdjZF9jcGVfYWZlX29wcyAqYWZlX29wczsKKwlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmc7CisJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqbHNtX3Nlc3Npb247CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9od19wYXJhbXMgbHNtX3BhcmFtOworCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gfHwKKwkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQpIHsKKwkJcHJfZXJyKCIlczogWFJVTiBpZ25vcmUgZm9yIG5vd1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlsc21fc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlsYWJfZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKworCWRldl9kYmcocnRkLT5kZXYsCisJCSIlczogcGNtX3NpemUgMHgleCIsIF9fZnVuY19fLCBsYWJfZC0+cGNtX3NpemUpOworCisJaWYgKGxzbV9kLT5jcGVfcHJlcGFyZWQpIHsKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBDUEUgaXMgYWxyZWR5IHByZXBhcmVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKKwlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKKwlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7CisKKwlzd2l0Y2ggKGNwZS0+aW5wdXRfcG9ydF9pZCkgeworCWNhc2UgQUZFX1BPUlRfSURfMzoKKwkJYWZlX2NmZy0+cG9ydF9pZCA9IEFGRV9QT1JUX0lEXzM7CisJCWFmZV9jZmctPmJpdF93aWR0aCA9IDE2OworCQlhZmVfY2ZnLT5udW1fY2hhbm5lbHMgPSAxOworCQlhZmVfY2ZnLT5zYW1wbGVfcmF0ZSA9IFNBTVBMRV9SQVRFXzQ4S0haOworCQlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X2NtZF9jZmcoY3BlLT5jb3JlX2hhbmRsZSwgYWZlX2NmZyk7CisJCWJyZWFrOworCWNhc2UgQUZFX1BPUlRfSURfMToKKwlkZWZhdWx0OgorCQlhZmVfY2ZnLT5wb3J0X2lkID0gQUZFX1BPUlRfSURfMTsKKwkJYWZlX2NmZy0+Yml0X3dpZHRoID0gMTY7CisJCWFmZV9jZmctPm51bV9jaGFubmVscyA9IDE7CisJCWFmZV9jZmctPnNhbXBsZV9yYXRlID0gU0FNUExFX1JBVEVfMTZLSFo7CisJCXJjID0gYWZlX29wcy0+YWZlX3NldF9wYXJhbXMoY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkJICAgICBhZmVfY2ZnLCBjcGUtPmFmZV9tYWRfY3RsKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjICE9IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogY3BlIGFmZSBwYXJhbXMgZmFpbGVkIGZvciBwb3J0ID0gJWQsIGVyciA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBhZmVfY2ZnLT5wb3J0X2lkLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJbHNtX3BhcmFtLnNhbXBsZV9yYXRlID0gYWZlX2NmZy0+c2FtcGxlX3JhdGU7CisJbHNtX3BhcmFtLm51bV9jaHMgPSBhZmVfY2ZnLT5udW1fY2hhbm5lbHM7CisJbHNtX3BhcmFtLmJpdF93aWR0aCA9IGFmZV9jZmctPmJpdF93aWR0aDsKKwlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfbWVkaWFfZm10X3BhcmFtcyhjcGUtPmNvcmVfaGFuZGxlLCBsc21fc2Vzc2lvbiwKKwkJCQkJICAgICAgICZsc21fcGFyYW0pOworCWlmIChyYykKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIHNldCBsc20gbWVkaWEgZm10IHBhcmFtcywgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCisJLyogU2VuZCBjb25uZWN0IHRvIHBvcnQgKGlucHV0KSAqLworCXJjID0gbHNtX29wcy0+bHNtX3NldF9wb3J0KGNwZS0+Y29yZV9oYW5kbGUsIGxzbV9zZXNzaW9uLAorCQkJCSAgICZjcGUtPmlucHV0X3BvcnRfaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNvbm5lY3QgaW5wdXQgcG9ydCwgZXJyPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChjcGUtPmlucHV0X3BvcnRfaWQgIT0gMykgeworCQlyYyA9IGxzbV9vcHMtPmxzbV9nZXRfYWZlX291dF9wb3J0X2lkKGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJCQkgICAgICBsc21fc2Vzc2lvbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIGdldCBwb3J0IGlkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCS8qIFNlbmQgY29ubmVjdCB0byBwb3J0IChvdXRwdXQpICovCisJCXJjID0gbHNtX29wcy0+bHNtX3NldF9wb3J0KGNwZS0+Y29yZV9oYW5kbGUsIGxzbV9zZXNzaW9uLAorCQkJCQkgICAmbHNtX3Nlc3Npb24tPmFmZV9vdXRfcG9ydF9pZCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBzZXQgY29ubmVjdCBvdXRwdXQgcG9ydCwgZXJyPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJcmMgPSBtc21fY3BlX2FmZV9wb3J0X2NudGwoc3Vic3RyZWFtLAorCQkJCSAgIGNwZS0+Y29yZV9oYW5kbGUsCisJCQkJICAgYWZlX29wcywgYWZlX2NmZywKKwkJCQkgICBBRkVfQ01EX1BPUlRfU1RBUlQpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogY3BlX2FmZV9wb3J0IHN0YXJ0IGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCWVsc2UKKwkJbHNtX2QtPmNwZV9wcmVwYXJlZCA9IHRydWU7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBtc21fY3BlX2xzbV90cmlnZ2VyOiB0cmlnZ2VyIGNhbGwgZnJvbSBBU29DIGNvcmUgZm9yIHRoaXMgcGxhdGZvcm0KKyAqIEBzdWJzdHJlYW06IEFTb0Mgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGludm9rZWQKKyAqIEBjbWQ6IHRoZSB0cmlnZ2VyIGNvbW1hbmQgZnJvbSBmcmFtZXdvcmsKKyAqCisgKiBzdXNwZW5kL3Jlc3VtZSB0aGUgQUZFIHBvcnQgb24gQ1BFIGFzc29jaWF0ZWQgd2l0aCBsaXN0ZW4gc2Vzc2lvbgorICovCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgICAgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNwZV9wcml2ICpjcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHM7CisJc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnICphZmVfY2ZnOworCWludCBhZmVfY21kID0gQUZFX0NNRF9JTlZBTElEOworCWludCByYyA9IDA7CisKKwlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKKwlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWFmZV9jbWQgPSBBRkVfQ01EX1BPUlRfU1VTUEVORDsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWFmZV9jbWQgPSBBRkVfQ01EX1BPUlRfUkVTVU1FOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFmZV9jbWQgPSBBRkVfQ01EX0lOVkFMSUQ7CisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6IHVuaGFuZGxlZCB0cmlnZ2VyIGNtZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlpZiAoYWZlX2NtZCAhPSBBRkVfQ01EX0lOVkFMSUQpCisJCXJjID0gbXNtX2NwZV9hZmVfcG9ydF9jbnRsKHN1YnN0cmVhbSwKKwkJCQkJICAgY3BlLT5jb3JlX2hhbmRsZSwKKwkJCQkJICAgYWZlX29wcywgYWZlX2NmZywKKwkJCQkJICAgYWZlX2NtZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NwZV9sc21faHdwYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlzdHJ1Y3QgY3BlX2h3X3BhcmFtcyAqaHdfcGFyYW1zID0gTlVMTDsKKworCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgJXNcbiIsCisJCQlfX2Z1bmNfXywKKwkJCSghY3BlKSA/ICJjcGUiIDogImNvcmUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgJXNcbiIsCisJCQlfX2Z1bmNfXywKKwkJCSghbHNtX2QpID8gInByaXZfZGF0YSIgOiAic2Vzc2lvbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOworCWh3X3BhcmFtcyA9ICZsc21fZC0+aHdfcGFyYW1zOworCWh3X3BhcmFtcy0+YnVmX3N6ID0gKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKQorCQkJCS8gcGFyYW1zX3BlcmlvZHMocGFyYW1zKSk7CisJaHdfcGFyYW1zLT5wZXJpb2RfY291bnQgPSBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpOworCWh3X3BhcmFtcy0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwlod19wYXJhbXMtPnNhbXBsZV9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCWlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCisJCWh3X3BhcmFtcy0+c2FtcGxlX3NpemUgPSAxNjsKKwllbHNlIGlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0KKwkJIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQorCQlod19wYXJhbXMtPnNhbXBsZV9zaXplID0gMjQ7CisJZWxzZSBpZiAocGFyYW1zX2Zvcm1hdChwYXJhbXMpID09CisJCSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKKwkJaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZSA9IDMyOworCWVsc2UgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIEZvcm1hdCAweCV4XG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcocnRkLT5kZXYsCisJCSIlczogRm9ybWF0ICVkIGJ1ZmZlciBzaXplKGJ5dGVzKSAlZCBwZXJpb2QgY291bnQgJWRcbiIKKwkJIiBDaGFubmVsICVkIHBlcmlvZCBpbiBieXRlcyAweCV4IFBlcmlvZCBTaXplIDB4JXggcmF0ZSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyksCisJCXBhcmFtc19wZXJpb2RzKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLAorCQlwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyksIHBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpLAorCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX2NwZV9sc21fcG9pbnRlcigKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKwlpZiAobGFiX2QtPmRtYV93cml0ZSAgPj0gbGFiX2QtPnBjbV9zaXplKQorCQlsYWJfZC0+ZG1hX3dyaXRlID0gMDsKKwlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkiJXM6cGNtX2RtYV9wb3MgPSAlZFxuIiwKKwkJX19mdW5jX18sIGxhYl9kLT5kbWFfd3JpdGUpOworCisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAobGFiX2QtPmRtYV93cml0ZSkpOworfQorCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAorCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOworCWNoYXIgKnBjbV9idWY7CisJaW50IGZieXRlcyA9IDA7CisJaW50IHJjID0gMDsKKworCWZieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOworCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CisJICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQpIHsKKwkJcHJfZXJyKCIlczogWFJVTiBpZ25vcmUgZm9yIG5vd1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKKworCS8qIENoZWNrIGlmIGJ1ZmZlciByZWFkaW5nIGlzIGFscmVhZHkgaW4gZXJyb3Igc3RhdGUgKi8KKwlpZiAobGFiX2QtPnRocmVhZF9zdGF0dXMgPT0gTVNNX0xTTV9MQUJfVEhSRUFEX0VSUk9SKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEJ1ZmZlcnJpbmcgaXMgaW4gZXJyb3Igc3RhdGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCS8qCisJCSAqIEFkdmFuY2UgdGhlIHBlcmlvZCBzbyB0aGVyZSBpcyBubyB3YWl0IGluIGNhc2UKKwkJICogcmVhZCBpcyBpbnZva2VkIGV2ZW4gYWZ0ZXIgZXJyb3IgaXMgcHJvcG9nYXRlZAorCQkgKi8KKwkJYXRvbWljX2luYygmbGFiX2QtPmluX2NvdW50KTsKKwkJbGFiX2QtPmRtYV93cml0ZSArPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9IGVsc2UgaWYgKGxhYl9kLT50aHJlYWRfc3RhdHVzID09IE1TTV9MU01fTEFCX1RIUkVBRF9TVE9QKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEJ1ZmVycmluZyBpcyBpbiBzdG9wcGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChsYWJfZC0+cGVyaW9kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmxhYl9kLT5pbl9jb3VudCkgfHwKKwkJCWF0b21pY19yZWFkKCZsYWJfZC0+YWJvcnRfcmVhZCkpLAorCQkJKDIgKiBIWikpOworCWlmIChhdG9taWNfcmVhZCgmbGFiX2QtPmFib3J0X3JlYWQpKSB7CisJCXByX2RlYnVnKCIlczogTFNNIExBQiBBYm9ydCByZWFkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAobGFiX2QtPnRocmVhZF9zdGF0dXMgIT0gTVNNX0xTTV9MQUJfVEhSRUFEX1JVTk5JTkcpIHsKKwkJcHJfZXJyKCIlczogTGFiIHN0b3BwZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczpMQUIgZXJyIHdhaXRfZXZlbnRfdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FQUdBSU47CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGxhYl9kLT5idWZfaWR4ID49IChsc21fZC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCkpCisJCWxhYl9kLT5idWZfaWR4ID0gMDsKKwlwY21fYnVmID0gKGxhYl9kLT5wY21fYnVmW2xhYl9kLT5idWZfaWR4XS5tZW0pOworCXByX2RlYnVnKCIlczogQnVmIElEWCA9IDB4JXggcGNtX2J1ZiAlcEtcbiIsCisJCSBfX2Z1bmNfXywgIGxhYl9kLT5idWZfaWR4LCBwY21fYnVmKTsKKwlpZiAocGNtX2J1ZikgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcGNtX2J1ZiwgZmJ5dGVzKSkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY29weSBidWYgdG8gdXNlclxuIik7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJbGFiX2QtPmJ1Zl9pZHgrKzsKKwlhdG9taWNfZGVjKCZsYWJfZC0+aW5fY291bnQpOworCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBtc21fYXNvY19jcGVfbHNtX3Byb2JlOiBBU29DIGZyYW1ld29yayBmb3IgbHNtIHBsYXRmb3JtIGRyaXZlcgorICogQHBsYXRmb3JtOiBwbGF0Zm9ybSByZWdpc3RlcmVkIHdpdGggQVNvQyBjb3JlCisgKgorICogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBmb3IgdGhpcyBwbGF0Zm9ybSBhbmQgb2J0YWluIHRoZSBvcHMgZm9yCisgKiBsc20gYW5kIGFmZSBtb2R1bGVzIGZyb20gdW5kZXJseWluZyBkcml2ZXIuIEFsc28gZmluZCB0aGUgY29kZWMKKyAqIGZvciB0aGlzIHBsYXRmb3JtIGFzIHNwZWNpZmllZCBieSBtYWNoaW5lIGRyaXZlciBmb3IgQVNvQyBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyBpbnQgbXNtX2Fzb2NfY3BlX2xzbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgY3BlX3ByaXYgKmNwZV9wcml2OworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbDsKKwlib29sIGZvdW5kX3J1bnRpbWUgPSBmYWxzZTsKKwljb25zdCBjaGFyICpjcGVfZGV2X2lkID0gInFjb20sbXNtLWNwZS1sc20taWQiOworCXUzMiBwb3J0X2lkID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcGxhdGZvcm0gfHwgIXBsYXRmb3JtLT5jb21wb25lbnQuY2FyZCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBsYXRmb3JtIG9yIGNhcmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhcmQgPSBwbGF0Zm9ybS0+Y29tcG9uZW50LmNhcmQ7CisKKwkvKiBNYXRjaCBwbGF0Zm9ybSB0byBjb2RlYyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocnRkLCAmY2FyZC0+cnRkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFydGQtPnBsYXRmb3JtKQorCQkJY29udGludWU7CisJCWlmICghc3RyY21wKHJ0ZC0+cGxhdGZvcm0tPmNvbXBvbmVudC5uYW1lLAorCQkJICAgIHBsYXRmb3JtLT5jb21wb25lbnQubmFtZSkpIHsKKwkJCWZvdW5kX3J1bnRpbWUgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kX3J1bnRpbWUpIHsKKwkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gZmluZCBydW50aW1lIGZvciBwbGF0Zm9ybVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGxhdGZvcm0tPmRldi0+b2Zfbm9kZSwgY3BlX2Rldl9pZCwKKwkJCQkgICZwb3J0X2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcocGxhdGZvcm0tPmRldiwKKwkJCSIlczogbWlzc2luZyAweCV4IGluIGR0IG5vZGVcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcG9ydF9pZCA9IDE7CisJfQorCisJY29kZWMgPSBydGQtPmNvZGVjOworCisJY3BlX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX3ByaXYpLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcGVfcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcGVfcHJpdi0+Y29kZWMgPSBjb2RlYzsKKwljcGVfcHJpdi0+aW5wdXRfcG9ydF9pZCA9IHBvcnRfaWQ7CisJd2NkX2NwZV9nZXRfbHNtX29wcygmY3BlX3ByaXYtPmxzbV9vcHMpOworCXdjZF9jcGVfZ2V0X2FmZV9vcHMoJmNwZV9wcml2LT5hZmVfb3BzKTsKKworCXNuZF9zb2NfcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdGZvcm0sIGNwZV9wcml2KTsKKwlrY29udHJvbCA9ICZtc21fY3BlX2tjb250cm9sc1swXTsKKwlzbmRfY3RsX2FkZChjYXJkLT5zbmRfY2FyZCwgc25kX2N0bF9uZXcxKGtjb250cm9sLCBjcGVfcHJpdikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9jcGVfbHNtX29wcyA9IHsKKwkub3BlbiA9IG1zbV9jcGVfbHNtX29wZW4sCisJLmNsb3NlID0gbXNtX2NwZV9sc21fY2xvc2UsCisJLmlvY3RsID0gbXNtX2NwZV9sc21faW9jdGwsCisJLnByZXBhcmUgPSBtc21fY3BlX2xzbV9wcmVwYXJlLAorCS50cmlnZ2VyID0gbXNtX2NwZV9sc21fdHJpZ2dlciwKKwkucG9pbnRlciA9IG1zbV9jcGVfbHNtX3BvaW50ZXIsCisJLmNvcHkgPSBtc21fY3BlX2xzbV9jb3B5LAorCS5od19wYXJhbXMgPSBtc21fY3BlX2xzbV9od3BhcmFtcywKKwkuY29tcGF0X2lvY3RsID0gbXNtX2NwZV9sc21faW9jdGxfY29tcGF0LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX2NwZV9wbGF0Zm9ybSA9IHsKKwkub3BzID0gJm1zbV9jcGVfbHNtX29wcywKKwkucHJvYmUgPSBtc21fYXNvY19jcGVfbHNtX3Byb2JlLAorfTsKKworLyoKKyAqIG1zbV9jcGVfbHNtX3Byb2JlOiBwbGF0Zm9ybSBkcml2ZXIgcHJvYmUKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKiBSZWdpc3RlciB0aGUgQVNvQyBwbGF0Zm9ybSBkcml2ZXIgd2l0aCBBU29DIGNvcmUKKyAqLworc3RhdGljIGludCBtc21fY3BlX2xzbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKKwkJCQkJICZtc21fc29jX2NwZV9wbGF0Zm9ybSk7Cit9CisKKy8qCisgKiBtc21fY3BlX2xzbV9yZW1vdmU6IHBsYXRmb3JtIGRyaXZlciByZW1vdmUKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKKyAqCisgKiBEZXJlZ2lzdGVyIHRoZSBBU29DIHBsYXRmb3JtIGRyaXZlcgorICovCitzdGF0aWMgaW50IG1zbV9jcGVfbHNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2NwZV9sc21fZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tY3BlLWxzbSIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jcGVfbHNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tY3BlLWxzbSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXNtX2NwZV9sc21fZHRfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gbXNtX2NwZV9sc21fcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9jcGVfbHNtX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1zbV9jcGVfbHNtX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1BFIExTTSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9jcGVfbHNtX2R0X21hdGNoKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtLWRhaS1mZS5jIGIvc291bmQvc29jL21zbS9tc20tZGFpLWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxZjhiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vbXNtLWRhaS1mZS5jCkBAIC0wLDAgKzEsMjU1NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2ZlX2RhaV9vcHMgPSB7fTsKKworLyogQ29udmVudGlvbmFsIGFuZCB1bmNvbnZlbnRpb25hbCBzYW1wbGUgcmF0ZSBzdXBwb3J0ZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3VwcG9ydGVkX3NhbXBsZV9yYXRlc1tdID0geworCTgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwKKwk4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwLCAzNTI4MDAsIDM4NDAwMAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzKSwKKwkubGlzdCA9IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMsCisJLm1hc2sgPSAwLAorfTsKKworc3RhdGljIGludCBtdWx0aW1lZGlhX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJJmNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmVfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb247CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCisJaWYgKCFkYWkgfHwgIWRhaS0+ZHJpdmVyKSB7CisJCXByX2VycigiJXMgaW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhcG0gPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZGFwbShkYWktPmNvbXBvbmVudCk7CisJbWVtc2V0KCZpbnRlcmNvbiwgMCwgc2l6ZW9mKGludGVyY29uKSk7CisJaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZSAmJgorCQlkYWktPmRyaXZlci0+cGxheWJhY2suYWlmX25hbWUpIHsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCSAgIF9fZnVuY19fLCBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUpOworCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWU7CisJCWludGVyY29uLnNpbmsgPSBkYWktPmRyaXZlci0+cGxheWJhY2suYWlmX25hbWU7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlcyBzcmMgJXMgc2luayAlc1xuIiwKKwkJCSAgIF9fZnVuY19fLCBpbnRlcmNvbi5zb3VyY2UsIGludGVyY29uLnNpbmspOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgaW50ZXJjb24uc291cmNlKTsKKwl9CisJaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lICYmCisJICAgZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWUpIHsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCSAgIF9fZnVuY19fLCBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSk7CisJCWludGVyY29uLnNpbmsgPSBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZTsKKwkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWU7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlcyBzcmMgJXMgc2luayAlc1xuIiwKKwkJCSAgIF9fZnVuY19fLCBpbnRlcmNvbi5zb3VyY2UsIGludGVyY29uLnNpbmspOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgaW50ZXJjb24uc2luayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzID0geworCS5zdGFydHVwCT0gbXVsdGltZWRpYV9zdGFydHVwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2ZlX2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gIm1zbS1kYWktZmUiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2ZlX2RhaXNbXSA9IHsKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTU1fREwxIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0JMzg0MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9VTDEiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPQk0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDIiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPQkzODQwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIk1NX1VMMiIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDB8CisJCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9CTQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5uYW1lID0gIk11bHRpTWVkaWEyIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQ1MtVk9JQ0UgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIkNTLVZPSUNFX0RMMSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQ1MtVk9JQ0UgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiQ1MtVk9JQ0VfVUwxIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJDUy1WT0lDRSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZvSVAgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlZPSVBfREwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCQlTTkRSVl9QQ01fRk1UQklUX1NQRUNJQUwsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb0lQIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlZPSVBfVUwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCQlTTkRSVl9QQ01fRk1UQklUX1NQRUNJQUwsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJWb0lQIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIk1NX0RMMyIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA2LAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTU1fVUwzIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0JNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTMiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTU1fREw0IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8CisJCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPQk4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTQiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTU1fREw1IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8CisJCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPQk4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9VTDUiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDB8CisJCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9CTQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5uYW1lID0gIk11bHRpTWVkaWE1IiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTYgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIk1NX0RMNiIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTYgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTU1fVUw2IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPQk0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhNiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE3IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDciLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhNyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE4IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDgiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE4IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIk1NX1VMOCIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0JNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTgiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwkvKiBGRSBEQUlzIGNyZWF0ZWQgZm9yIGhvc3RsZXNzIG9wZXJhdGlvbiBwdXJwb3NlICovCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzBfSE9TVExFU1MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU0wX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTMF9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNMF9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU0xX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0xJTTFfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTTElNQlVTMV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNM19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNMSU0zX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0xJTUJVUzNfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTNF9IT1NUTEVTUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0xJTTRfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTNF9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNNF9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNMSU1CVVM0X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzZfSE9TVExFU1MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU02X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTTElNQlVTNl9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNOF9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0xJTThfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UX0ZNX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJJTlRGTV9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UX0ZNX0hPU1RMRVNTIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIklOVEZNX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJJTlRfRk1fSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlRfSEZQX0JUIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJJTlRIRlBfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxNjAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UX0hGUF9CVCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJJTlRIRlBfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxNjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiSU5UX0hGUF9CVF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFGRSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUENNX1JYIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfNDgwMDApLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUZFIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBDTV9UWCIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIkFGRS1QUk9YWSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhETUlfSE9TVExFU1MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIkhETUlfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiSERNSV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTV9IT1NUTEVTUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiQVVYUENNX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMTYwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTV9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJBVVhQQ01fVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgIDE2MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJBVVhQQ01fSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWT0lDRV9TVFVCIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJWT0lDRV9TVFVCX0RMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVk9JQ0VfU1RVQiBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJWT0lDRV9TVFVCX1VMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVk9JQ0VfU1RVQiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZvTFRFIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJWb0xURV9ETCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVm9MVEUgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVm9MVEVfVUwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlZvTFRFIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTUkyU19SWF9IT1NUTEVTUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTUkyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIk1JMlNfVFhfSE9TVExFU1MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTUkyU19VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJNSTJTX1RYX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU0VDX0kyU19SWF9IT1NUTEVTUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX0kyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfSTJTX1JYX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlNfVFggSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX01JMlNfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX01JMlNfVFhfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9NSTJTX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9NSTJTX1JYX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfTUkyU19VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfTUkyU19UWF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfTUkyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfTUkyU19SWF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX01JMlNfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9NSTJTX1RYX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9NSTJTX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlRFUlRfTUkyU19SWF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfTUkyU19VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX01JMlNfVFhfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfTUkyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX01JMlNfUlhfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQwIE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIklOVDBfTUkyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJJTlQwX01JMlNfUlhfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQ0IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIklOVDRfTUkyU19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJJTlQ0X01JMlNfUlhfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwkvKiBURE0gSG9zdGxlc3MgKi8KKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzBfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9UWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzBfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9SWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF8xX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fVFhfMV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF8xX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fUlhfMV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0yIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfMl9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJQUklfVERNX1RYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfMl9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJQUklfVERNX1JYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMyBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzNfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9UWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzNfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9SWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF80X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fVFhfNF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF80X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fUlhfNF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE01IEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfNV9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJQUklfVERNX1RYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfNV9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJQUklfVERNX1JYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzZfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9UWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzZfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUFJJX1RETV9SWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF83X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fVFhfN19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF83X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlBSSV9URE1fUlhfN19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF8wX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNFQ19URE1fVFhfMF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzBfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9SWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMSBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzFfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9UWF8xX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTEgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMV9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfVERNX1JYXzFfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0yIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfMl9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfVERNX1RYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF8yX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNFQ19URE1fUlhfMl9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF8zX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNFQ19URE1fVFhfM19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzNfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9SWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzRfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9UWF80X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTQgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNF9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfVERNX1JYXzRfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE01IEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfNV9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfVERNX1RYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF81X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNFQ19URE1fUlhfNV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF82X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlNFQ19URE1fVFhfNl9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzZfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9SWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNyBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzdfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiU0VDX1RETV9UWF83X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTcgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfN19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJTRUNfVERNX1JYXzdfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfMF9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9UWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMF9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9SWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0xIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzFfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fVFhfMV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTEgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzFfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fUlhfMV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF8yX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlRFUlRfVERNX1RYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF8yX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlRFUlRfVERNX1JYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfM19VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9UWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfM19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9SWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE00IEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzRfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fVFhfNF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTQgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzRfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fUlhfNF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF81X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlRFUlRfVERNX1RYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE01IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF81X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlRFUlRfVERNX1JYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfNl9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9UWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfNl9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJURVJUX1RETV9SWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE03IEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzdfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fVFhfN19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTcgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzdfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVEVSVF9URE1fUlhfN19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzBfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUVVBVF9URE1fVFhfMF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMF9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9SWF8wX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMV9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9UWF8xX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0xIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF8xX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFVQVRfVERNX1JYXzFfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF8yX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFVQVRfVERNX1RYXzJfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzJfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUVVBVF9URE1fUlhfMl9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzNfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUVVBVF9URE1fVFhfM19IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfM19ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9SWF8zX0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNF9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9UWF80X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE00IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF80X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFVQVRfVERNX1JYXzRfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF81X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFVQVRfVERNX1RYXzVfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzVfRExfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUVVBVF9URE1fUlhfNV9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzZfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiUVVBVF9URE1fVFhfNl9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNl9ETF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9SWF82X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfN19VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJRVUFUX1RETV9UWF83X0hPU1RMRVNTIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE03IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF83X0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFVQVRfVERNX1JYXzdfSE9TVExFU1MiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9ETCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9VTCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVm9pY2UyIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHNldWRvIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDkiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAgfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQc2V1ZG8gQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTU1fVUw5IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPQk0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkubmFtZSA9ICJQc2V1ZG8iLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJEVE1GX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJEVE1GX0RMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiRFRNRl9SWF9IT1NUTEVTUyIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQ1BFIExpc3RlbiBBdWRpbyBjYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJDUEVfTFNNX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIkNQRV9MU01fTk9IT1NUIiwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZPTFRFX1NUVUIgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlZPTFRFX1NUVUJfREwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWT0xURV9TVFVCIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlZPTFRFX1NUVUJfVUwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJWT0xURV9TVFVCIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVk9JQ0UyX1NUVUIgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9TVFVCX0RMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVk9JQ0UyX1NUVUIgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVk9JQ0UyX1NUVUJfVUwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJWT0lDRTJfU1RVQiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE5IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDkiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAorCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9CTM4NDAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTU1fVUw5IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAorCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0JNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTkiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRQ0hBVCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUUNIQVRfREwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRQ0hBVCBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRQ0hBVF9VTCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlFDSEFUIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIkxTTTFfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21pbiA9IDE2MDAwLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIkxTTTEiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTFNNMl9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWluID0gMTYwMDAsCisJCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiTFNNMiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJMU00zX1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9taW4gPSAxNjAwMCwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJMU00zIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIkxTTTRfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21pbiA9IDE2MDAwLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIkxTTTQiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTFNNNV9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWluID0gMTYwMDAsCisJCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiTFNNNSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJMU002X1VMX0hMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9taW4gPSAxNjAwMCwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJMU002IiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIkxTTTdfVUxfSEwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21pbiA9IDE2MDAwLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIkxTTTciLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTFNNOF9VTF9ITCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWluID0gMTYwMDAsCisJCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiTFNNOCIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZvV0xBTiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVm9XTEFOX0RMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVm9XTEFOIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlZvV0xBTl9VTCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCisJCS5uYW1lID0gIlZvV0xBTiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCS8qIEZFIERBSXMgY3JlYXRlZCBmb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIG9mZmxvYWQgcGxheWJhY2sgKi8KKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTAgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIk1NX0RMMTAiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPQk4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTEwIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTExIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDExIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8CisJCQkJICBTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCisJCS5uYW1lID0gIk11bHRpTWVkaWExMSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTU1fREwxMiIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAorCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhMTIiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIk1NX0RMMTMiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPQk4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTEzIiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTE0IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9ETDE0IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8CisJCQkJICBTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0JODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCisJCS5uYW1lID0gIk11bHRpTWVkaWExNCIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExNSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiTU1fREwxNSIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAorCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9CTgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhMTUiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTYgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIk1NX0RMMTYiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPQk4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTE2IiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVm9pY2VNTW9kZTEgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlZPSUNFTU1PREUxX0RMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCSB9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJWT0lDRU1NT0RFMV9VTCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKKwkJLm5hbWUgPSAiVm9pY2VNTW9kZTEiLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVk9JQ0VNTU9ERTJfREwiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUyIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlZPSUNFTU1PREUyX1VMIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAorCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTE3IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIk1NX1VMMTciLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDB8CisJCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAorCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSksCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKKwkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAorCQkubmFtZSA9ICJNdWx0aU1lZGlhMTciLAorCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExOCBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJNTV9VTDE4IiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAorCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKKwkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCisJCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKKwkJLm5hbWUgPSAiTXVsdGlNZWRpYTE4IiwKKwkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTkgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiTU1fVUwxOSIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMHwKKwkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCisJCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFKSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAorCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCisJCS5uYW1lID0gIk11bHRpTWVkaWExOSIsCisJCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKKwl9LAorfTsKKworc3RhdGljIGludCBtc21fZmVfZGFpX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiBuYW1lICVzXG4iLCBfX2Z1bmNfXywKKwkJZGV2X25hbWUoJnBkZXYtPmRldikpOworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmbXNtX2ZlX2RhaV9jb21wb25lbnQsCisJCW1zbV9mZV9kYWlzLCBBUlJBWV9TSVpFKG1zbV9mZV9kYWlzKSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2ZlX2RhaV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9mZV9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktZmUifSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2ZlX2RhaV9kcml2ZXIgPSB7CisJLnByb2JlICA9IG1zbV9mZV9kYWlfZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBtc21fZmVfZGFpX2Rldl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWRhaS1mZSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX2ZlX2R0X21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fZmVfZGFpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZmVfZGFpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fZmVfZGFpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2ZlX2RhaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9mZV9kYWlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9mZV9kYWlfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gRnJvbnRlbmQgREFJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc20tcGNtLWhvc3RsZXNzLmMgYi9zb3VuZC9zb2MvbXNtL21zbS1wY20taG9zdGxlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc2NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc20tcGNtLWhvc3RsZXNzLmMKQEAgLTAsMCArMSw4MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworCitzdGF0aWMgaW50IG1zbV9wY21faG9zdGxlc3NfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9ob3N0bGVzc19vcHMgPSB7CisJLnByZXBhcmUgPSBtc21fcGNtX2hvc3RsZXNzX3ByZXBhcmUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19ob3N0bGVzc19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZtc21fcGNtX2hvc3RsZXNzX29wcywKK307CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9ob3N0bGVzc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAorCQkJCSAgICZtc21fc29jX2hvc3RsZXNzX3BsYXRmb3JtKTsKK30KKworc3RhdGljIGludCBtc21fcGNtX2hvc3RsZXNzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3BjbV9ob3N0bGVzc19kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20taG9zdGxlc3MifSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9ob3N0bGVzc19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fcGNtX2hvc3RsZXNzX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX3BjbV9ob3N0bGVzc19wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3BjbV9ob3N0bGVzc19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2hvc3RsZXNzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21faG9zdGxlc3NfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdGxlc3MgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbTg5OTYuYyBiL3NvdW5kL3NvYy9tc20vbXNtODk5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNWY3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbTg5OTYuYwpAQCAtMCwwICsxLDQwMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KKyNpbmNsdWRlIDxkZXZpY2VfZXZlbnQuaD4KKyNpbmNsdWRlICJxZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzMwLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzMzUuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd3NhODgxeC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJtc204OTk2LWFzb2Mtc25kIgorCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfOEtIWiAgICAgIDgwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xNktIWiAgICAgMTYwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8zMktIWiAgICAgMzIwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV80OEtIWiAgICAgNDgwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV85NktIWiAgICAgOTYwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xOTJLSFogICAgMTkyMDAwCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfNDRQMUtIWiAgIDQ0MTAwCisKKyNkZWZpbmUgTVNNODk5Nl9TUEtfT04gICAgIDEKKyNkZWZpbmUgTVNNODk5Nl9ISUZJX09OICAgIDEKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX0JVVFRPTlMgICAgOAorI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyAgICAgNQorI2RlZmluZSBDT0RFQ19FWFRfQ0xLX1JBVEUgICAgICAgICA5NjAwMDAwCisjZGVmaW5lIEFEU1BfU1RBVEVfUkVBRFlfVElNRU9VVF9NUyAgICAzMDAwCisjZGVmaW5lIERFVl9OQU1FX1NUUl9MRU4gICAgICAgICAgICAzMgorCisjZGVmaW5lIFdTQTg4MTBfTkFNRV8xICJ3c2E4ODF4LjIwMTcwMjExIgorI2RlZmluZSBXU0E4ODEwX05BTUVfMiAid3NhODgxeC4yMDE3MDIxMiIKKworc3RhdGljIGludCBzbGltMF9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CitzdGF0aWMgaW50IHNsaW0wX3R4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKK3N0YXRpYyBpbnQgc2xpbTFfdHhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworc3RhdGljIGludCBzbGltMF9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CitzdGF0aWMgaW50IHNsaW0wX3R4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKK3N0YXRpYyBpbnQgc2xpbTFfdHhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworc3RhdGljIGludCBoZG1pX3J4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKK3N0YXRpYyBpbnQgbXNtODk5Nl9hdXhwY21fcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKK3N0YXRpYyBpbnQgc2xpbTVfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworc3RhdGljIGludCBzbGltNV9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CitzdGF0aWMgaW50IHNsaW02X3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKK3N0YXRpYyBpbnQgc2xpbTZfcnhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BkZXY7CitzdGF0aWMgaW50IGV4dF91c19hbXBfZ3BpbyA9IC0xOworc3RhdGljIGludCBtc204OTk2X3Nwa19jb250cm9sID0gMTsKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMF9yeF9jaCA9IDE7CitzdGF0aWMgaW50IG1zbV9zbGltXzBfdHhfY2ggPSAxOworc3RhdGljIGludCBtc21fc2xpbV8xX3R4X2NoID0gMTsKK3N0YXRpYyBpbnQgbXNtX3NsaW1fNV9yeF9jaCA9IDE7CitzdGF0aWMgaW50IG1zbV9zbGltXzZfcnhfY2ggPSAxOworc3RhdGljIGludCBtc21faGlmaV9jb250cm9sOworc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaCA9IDI7CisKK3N0YXRpYyBpbnQgbXNtX2hkbWlfcnhfY2ggPSAyOworc3RhdGljIGludCBtc21fcHJveHlfcnhfY2ggPSAyOworc3RhdGljIGludCBoZG1pX3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKK3N0YXRpYyBpbnQgbXNtX3RlcnRfbWkyc190eF9jaCA9IDI7CisKK3N0YXRpYyBib29sIGNvZGVjX3JlZ19kb25lOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaGlmaV9mdW5jdGlvbltdID0geyJPZmYiLCAiT24ifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwaW5fc3RhdGVzW10gPSB7IkRpc2FibGUiLCAiYWN0aXZlIn07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BrX2Z1bmN0aW9uW10gPSB7Ik9mZiIsICJPbiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW0wX3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW01X3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW02X3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW0wX3R4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwKKwkJCQkJCSJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCisJCQkJCQkiRWlnaHQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2aV9mZWVkX2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmhkbWlfcnhfY2hfdGV4dFtdID0geyJUd28iLCAiVGhyZWUiLCAiRm91ciIsICJGaXZlIiwKKwkJCQkJIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnJ4X2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIiwgIlMyNF8zTEUifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpzbGltNV9yeF9iaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMjRfM0xFIn07CitzdGF0aWMgY2hhciBjb25zdCAqc2xpbTZfcnhfYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnNsaW0wX3J4X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzQ4IiwgIktIWl85NiIsCisJCQkJCSJLSFpfMTkyIiwgIktIWl80NFAxIiwgIktIWl84IiwKKwkJCQkJIktIWl8xNiIsICJLSFpfMzIifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpzbGltNV9yeF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAorCQkJCQkJICAiS0haXzE5MiIsICJLSFpfNDRQMSJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnNsaW02X3J4X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzQ4IiwgIktIWl85NiIsCisJCQkJCQkgICJLSFpfMTkyIiwgIktIWl80NFAxIn07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJveHlfcnhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCSJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9OworCitzdGF0aWMgY2hhciBjb25zdCAqaGRtaV9yeF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAorCQkJCQkiS0haXzE5MiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXV4cGNtX3JhdGVfdGV4dFtdID0geyI4MDAwIiwgIjE2MDAwIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbTg5OTZfYXV4cGNtX2VudW1bXSA9IHsKKwkJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBhdXhwY21fcmF0ZV90ZXh0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbWkyc190eF9jbGsgPSB7CisJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9NSTJTX0lCSVQsCisJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKKwlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCTAsCit9OworCitzdHJ1Y3QgbXNtODk5Nl93c2E4ODF4X2Rldl9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJdTMyIGluZGV4OworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2F1eF9kZXYgKm1zbTg5OTZfYXV4X2RldjsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICptc204OTk2X2NvZGVjX2NvbmY7CisKK3N0cnVjdCBtc204OTk2X2Fzb2NfbWFjaF9kYXRhIHsKKwl1MzIgbWNsa19mcmVxOworCWludCB1c19ldXJvX2dwaW87CisJaW50IGhwaF9lbjFfZ3BpbzsKKwlpbnQgaHBoX2VuMF9ncGlvOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKK307CisKK3N0cnVjdCBtc204OTk2X2Fzb2Nfd2NkOTN4eF9jb2RlYyB7CisJdm9pZCogKCpnZXRfYWZlX2NvbmZpZ19mbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKKwl2b2lkICgqbWJoY19oc19kZXRlY3RfZXhpdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtODk5Nl9hc29jX3djZDkzeHhfY29kZWMgbXNtODk5Nl9jb2RlY19mbjsKKworc3RydWN0IG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2IHsKKwlpbnQgZG9ja19wbHVnX2dwaW87CisJaW50IGRvY2tfcGx1Z19pcnE7CisJaW50IGRvY2tfcGx1Z19kZXQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGlycV93b3JrOworCXN0cnVjdCBzd2l0Y2hfZGV2IGF1ZGlvX3NkZXY7Cit9Oworc3RhdGljIHN0cnVjdCBtc204OTk2X2xpcXVpZF9kb2NrX2RldiAqbXNtODk5Nl9saXF1aWRfZG9ja19kZXY7CisKK3N0YXRpYyB2b2lkICphZHNwX3N0YXRlX25vdGlmaWVyOworc3RhdGljIHZvaWQgKmRlZl90YXNoYV9tYmhjX2NhbCh2b2lkKTsKK3N0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSk7CitzdGF0aWMgaW50IG1zbTg5OTZfd3NhODgxeF9pbml0KHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KTsKKworLyoKKyAqIE5lZWQgdG8gcmVwb3J0IExJTkVJTgorICogaWYgUi9MIGNoYW5uZWwgaW1wZWRhbmNlIGlzIGxhcmdlciB0aGFuIDVLIG9obQorICovCitzdGF0aWMgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyB3Y2RfbWJoY19jZmcgPSB7CisJLnJlYWRfZndfYmluID0gZmFsc2UsCisJLmNhbGlicmF0aW9uID0gTlVMTCwKKwkuZGV0ZWN0X2V4dG5fY2FibGUgPSB0cnVlLAorCS5tb25vX3N0ZXJvX2RldGVjdGlvbiA9IGZhbHNlLAorCS5zd2FwX2duZF9taWMgPSBOVUxMLAorCS5oc19leHRfbWljYmlhcyA9IHRydWUsCisJLmtleV9jb2RlWzBdID0gS0VZX01FRElBLAorCS5rZXlfY29kZVsxXSA9IEtFWV9WT0lDRUNPTU1BTkQsCisJLmtleV9jb2RlWzJdID0gS0VZX1ZPTFVNRVVQLAorCS5rZXlfY29kZVszXSA9IEtFWV9WT0xVTUVET1dOLAorCS5rZXlfY29kZVs0XSA9IDAsCisJLmtleV9jb2RlWzVdID0gMCwKKwkua2V5X2NvZGVbNl0gPSAwLAorCS5rZXlfY29kZVs3XSA9IDAsCisJLmxpbmVpbl90aCA9IDUwMDAsCisJLm1vaXN0dXJlX2VuID0gdHJ1ZSwKKwkubWJoY19taWNiaWFzID0gTUlDX0JJQVNfMiwKKwkuYW5jX21pY2JpYXMgPSBNSUNfQklBU18yLAorCS5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZSwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcmFtX2lzX21hc2soaW50IHApCit7CisJcmV0dXJuIChwID49IFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLKSAmJgorCQkJKHAgPD0gU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9tYXNrICpwYXJhbV90b19tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwKKwkJCQkJICAgICBpbnQgbikKK3sKKwlyZXR1cm4gJihwLT5tYXNrc1tuIC0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdKTsKK30KKworc3RhdGljIHZvaWQgcGFyYW1fc2V0X21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBpbnQgbiwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQorCQlyZXR1cm47CisJaWYgKHBhcmFtX2lzX21hc2sobikpIHsKKwkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKKworCQltLT5iaXRzWzBdID0gMDsKKwkJbS0+Yml0c1sxXSA9IDA7CisJCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOworCX0KK30KKworc3RhdGljIHZvaWQgbXNtODk5Nl9saXF1aWRfZG9ja2luZ19pcnFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2ICpkb2NrX2RldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtODk5Nl9saXF1aWRfZG9ja19kZXYsCisJCQkgICAgIGlycV93b3JrKTsKKworCWRvY2tfZGV2LT5kb2NrX3BsdWdfZGV0ID0KKwkJZ3Bpb19nZXRfdmFsdWUoZG9ja19kZXYtPmRvY2tfcGx1Z19ncGlvKTsKKworCXN3aXRjaF9zZXRfc3RhdGUoJmRvY2tfZGV2LT5hdWRpb19zZGV2LCBkb2NrX2Rldi0+ZG9ja19wbHVnX2RldCk7CisJLyogbm90aWZ5IHRvIGF1ZGlvIGRhZW1vbiAqLworCXN5c2ZzX25vdGlmeSgmZG9ja19kZXYtPmF1ZGlvX3NkZXYuZGV2LT5rb2JqLCBOVUxMLCAic3RhdGUiKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1zbTg5OTZfbGlxdWlkX2RvY2tpbmdfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBtc204OTk2X2xpcXVpZF9kb2NrX2RldiAqZG9ja19kZXYgPSBkZXY7CisKKwkvKiBzd2l0Y2ggc3BlYWtlcnMgc2hvdWxkIG5vdCBydW4gaW4gaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZkb2NrX2Rldi0+aXJxX3dvcmspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtc204OTk2X2xpcXVpZF9pbml0X2RvY2tpbmcodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZG9ja19wbHVnX2dwaW8gPSAwOworCisJLyogcGx1ZyBpbiBkb2NraW5nIHNwZWFrZXIrcGx1ZyBpbiBkZXZpY2UgT1IgdW5wbHVnIG9uZSBvZiB0aGVtICovCisJdTMyIGRvY2tfcGx1Z19pcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HIHwKKwkJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCQkgIElSUUZfU0hBUkVEOworCisJZG9ja19wbHVnX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhzcGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSAgICJxY29tLGRvY2stcGx1Zy1kZXQtaXJxIiwgMCk7CisKKwlpZiAoZG9ja19wbHVnX2dwaW8gPj0gMCkgeworCQltc204OTk2X2xpcXVpZF9kb2NrX2RldiA9CisJCSBremFsbG9jKHNpemVvZigqbXNtODk5Nl9saXF1aWRfZG9ja19kZXYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtc204OTk2X2xpcXVpZF9kb2NrX2RldikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCW1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5kb2NrX3BsdWdfZ3BpbyA9IGRvY2tfcGx1Z19ncGlvOworCisJCXJldCA9IGdwaW9fcmVxdWVzdChtc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2dwaW8sCisJCQkJCSAgICJkb2NrLXBsdWctZGV0LWlycSIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOmZhaWxlZCByZXF1ZXN0IG1zbTg5OTZfbGlxdWlkX2RvY2tfcGx1Z19ncGlvIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9kb2NrX2dwaW87CisJCX0KKworCQltc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2RldCA9CisJCQlncGlvX2dldF92YWx1ZSgKKwkJCQltc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2dwaW8pOworCQltc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2lycSA9CisJCQlncGlvX3RvX2lycSgKKwkJCQltc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2dwaW8pOworCisJCXJldCA9IHJlcXVlc3RfaXJxKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5kb2NrX3BsdWdfaXJxLAorCQkJCSAgbXNtODk5Nl9saXF1aWRfZG9ja2luZ19pcnFfaGFuZGxlciwKKwkJCQkgIGRvY2tfcGx1Z19pcnFfZmxhZ3MsCisJCQkJICAibGlxdWlkX2RvY2tfcGx1Z19pcnEiLAorCQkJCSAgbXNtODk5Nl9saXF1aWRfZG9ja19kZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogUmVxdWVzdCBJcnEgRmFpbGVkIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBmYWlsX2RvY2tfZ3BpbzsKKwkJfQorCisJCW1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5hdWRpb19zZGV2Lm5hbWUgPQorCQkJCQkJUUNfQVVESU9fRVhURVJOQUxfU1BLXzFfRVZFTlQ7CisKKwkJaWYgKHN3aXRjaF9kZXZfcmVnaXN0ZXIoCisJCQkgJm1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5hdWRpb19zZGV2KSA8IDApIHsKKwkJCXByX2VycigiJXM6IGRvY2sgZGV2aWNlIHJlZ2lzdGVyIGluIHN3aXRjaCBkaXJldG9yeSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBmYWlsX3N3aXRjaF9kZXY7CisJCX0KKworCQlJTklUX1dPUksoCisJCQkmbXNtODk5Nl9saXF1aWRfZG9ja19kZXYtPmlycV93b3JrLAorCQkJbXNtODk5Nl9saXF1aWRfZG9ja2luZ19pcnFfd29yayk7CisJfQorCXJldHVybiAwOworCitmYWlsX3N3aXRjaF9kZXY6CisJZnJlZV9pcnEobXNtODk5Nl9saXF1aWRfZG9ja19kZXYtPmRvY2tfcGx1Z19pcnEsCisJCQkJbXNtODk5Nl9saXF1aWRfZG9ja19kZXYpOworZmFpbF9kb2NrX2dwaW86CisJZ3Bpb19mcmVlKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5kb2NrX3BsdWdfZ3Bpbyk7CitleGl0OgorCWtmcmVlKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2KTsKKwltc204OTk2X2xpcXVpZF9kb2NrX2RldiA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtODk5Nl9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwlwcl9kZWJ1ZygiJXM6IG1zbTg5OTZfc3BrX2NvbnRyb2wgPSAlZCIsIF9fZnVuY19fLAorCQkgbXNtODk5Nl9zcGtfY29udHJvbCk7CisJaWYgKG1zbTg5OTZfc3BrX2NvbnRyb2wgPT0gTVNNODk5Nl9TUEtfT04pIHsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMSBhbXAiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMiBhbXAiKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMSBhbXAiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lb3V0XzIgYW1wIik7CisJfQorCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfZ2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogbXNtODk5Nl9zcGtfY29udHJvbCA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBtc204OTk2X3Nwa19jb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbTg5OTZfc3BrX2NvbnRyb2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9zZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJcHJfZGVidWcoIiVzKCkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCWlmIChtc204OTk2X3Nwa19jb250cm9sID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlyZXR1cm4gMDsKKworCW1zbTg5OTZfc3BrX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwltc204OTk2X2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc204OTk2X2hpZmlfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sCisJCSBtc21faGlmaV9jb250cm9sKTsKKwlpZiAocGRhdGEtPmhwaF9lbjFfZ3BpbyA8IDApIHsKKwkJcHJfZXJyKCIlczogaHBoX2VuMV9ncGlvIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChtc21faGlmaV9jb250cm9sID09IE1TTTg5OTZfSElGSV9PTikgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPmhwaF9lbjFfZ3BpbywgMSk7CisJCS8qIDVtc2VjIGRlbGF5IG5lZWRlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDUwMTApOworCX0gZWxzZSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+aHBoX2VuMV9ncGlvLCAwKTsKKwl9CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9oaWZpX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBtc21faGlmaV9jb250cm9sKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9oaWZpX2NvbnRyb2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9oaWZpX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCisJcHJfZGVidWcoIiVzKCkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXNtX2hpZmlfY29udHJvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW1zbTg5OTZfaGlmaV9jdHJsKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc204OTk2X2V4dF91c19hbXBfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJZXh0X3VzX2FtcF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8oc3BkZXYtPmRldi5vZl9ub2RlLAorCQkJCSJxY29tLGV4dC11bHQtc3BrLWFtcC1ncGlvIiwgMCk7CisJaWYgKGV4dF91c19hbXBfZ3BpbyA+PSAwKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChleHRfdXNfYW1wX2dwaW8sICJleHRfdXNfYW1wX2dwaW8iKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogZXh0X3VzX2FtcF9ncGlvIHJlcXVlc3QgZmFpbGVkLCByZXQ6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChleHRfdXNfYW1wX2dwaW8sIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc204OTk2X2V4dF91c19hbXBfZW5hYmxlKHUzMiBvbikKK3sKKwlpZiAob24pCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChleHRfdXNfYW1wX2dwaW8sIDEpOworCWVsc2UKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGV4dF91c19hbXBfZ3BpbywgMCk7CisKKwlwcl9kZWJ1ZygiJXM6IFVTIEVtaXR0ZXIgR1BJTyBlbmFibGU6JXNcbiIsIF9fZnVuY19fLAorCQkJb24gPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2V4dF91bHRyYXNvdW5kX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJcHJfZGVidWcoIiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3RyY21wKHctPm5hbWUsICJ1bHRyYXNvdW5kIGFtcCIpKSB7CisJCWlmICghZ3Bpb19pc192YWxpZChleHRfdXNfYW1wX2dwaW8pKSB7CisJCQlwcl9lcnIoIiVzOiBleHRfdXNfYW1wX2dwaW8gaXNuJ3QgY29uZmlndXJlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJCW1zbTg5OTZfZXh0X3VzX2FtcF9lbmFibGUoMSk7CisJCWVsc2UKKwkJCW1zbTg5OTZfZXh0X3VzX2FtcF9lbmFibGUoMCk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlcygpIEludmFsaWQgV2lkZ2V0ID0gJXNcbiIsCisJCQkJX19mdW5jX18sIHctPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGFzaGFfY29kZWMiKSkgeworCQlyZXQgPSB0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSwgZGFwbSk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc204OTk2X21jbGtfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKGNvZGVjLCAxLCB0cnVlKTsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF9jbGsoY29kZWMsIDAsIHRydWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfdHhfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXNoYV9jb2RlYyIpKQorCQlyZXQgPSB0YXNoYV9jZGNfbWNsa190eF9lbmFibGUoY29kZWMsIGVuYWJsZSwgZGFwbSk7CisJZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIGNvZGVjIHRvIGVuYWJsZSBleHQgY2xrXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfbWNsa190eF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDEsIHRydWUpOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2Nsayhjb2RlYywgMCwgdHJ1ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9oaWZpX2N0cmxfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sCisJCSBtc21faGlmaV9jb250cm9sKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmIChtc21faGlmaV9jb250cm9sID09IE1TTTg5OTZfSElGSV9PTikgeworCQkJaWYgKHBkYXRhLT5ocGhfZW4wX2dwaW8gPCAwKSB7CisJCQkJcHJfZXJyKCIlczogaHBoX2VuMF9ncGlvIGlzIGludmFsaWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ocGhfZW4wX2dwaW8sIDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmIChtc21faGlmaV9jb250cm9sID09IE1TTTg5OTZfSElGSV9PTikgeworCQkJaWYgKHBkYXRhLT5ocGhfZW4wX2dwaW8gPCAwKSB7CisJCQkJcHJfZXJyKCIlczogaHBoX2VuMF9ncGlvIGlzIGludmFsaWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ocGhfZW4wX2dwaW8sIDApOworCQl9CisJCWJyZWFrOworCX0KK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtODk5Nl9kYXBtX3dpZGdldHNbXSA9IHsKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1DTEsiLCAgU05EX1NPQ19OT1BNLCAwLCAwLAorCW1zbTg5OTZfbWNsa19ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUNMSyBUWCIsICBTTkRfU09DX05PUE0sIDAsIDAsCisJbXNtODk5Nl9tY2xrX3R4X2V2ZW50LCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzEgYW1wIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8zIGFtcCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMiBhbXAiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzQgYW1wIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygidWx0cmFzb3VuZCBhbXAiLCBtc21fZXh0X3VsdHJhc291bmRfZXZlbnQpLAorCVNORF9TT0NfREFQTV9TUEsoImhpZmkgYW1wIiwgbXNtX2hpZmlfY3RybF9ldmVudCksCisJU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFOQ1JpZ2h0IEhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU5DTGVmdCBIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM0IiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzYiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJBbmFsb2cgTWljNyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM4IiwgTlVMTCksCisKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzAiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzEiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzQiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzYiLCBOVUxMKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZDkzMzVfYXVkaW9fcGF0aHNbXSA9IHsKKwl7Ik1JQyBCSUFTMSIsIE5VTEwsICJNQ0xLIFRYIn0sCisJeyJNSUMgQklBUzIiLCBOVUxMLCAiTUNMSyBUWCJ9LAorCXsiTUlDIEJJQVMzIiwgTlVMTCwgIk1DTEsgVFgifSwKKwl7Ik1JQyBCSUFTNCIsIE5VTEwsICJNQ0xLIFRYIn0sCit9OworCitzdGF0aWMgaW50IHNsaW01X3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKKworCXN3aXRjaCAoc2xpbTVfcnhfc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiBzbGltNV9yeF9zYW1wbGVfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHNsaW01X3J4X3NhbXBsZV9yYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW01X3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwgX19mdW5jX18sCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAzOgorCQlzbGltNV9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzbGltNV9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXNsaW01X3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXNsaW01X3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW01X3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgc2xpbTVfcnhfc2FtcGxlX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbTZfcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKHNsaW02X3J4X3NhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOworCXByX2RlYnVnKCIlczogc2xpbTZfcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSBzbGltNl9yeF9zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltNl9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDM6CisJCXNsaW02X3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNsaW02X3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2xpbTZfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJc2xpbTZfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHVjb250cm9sIHZhbHVlID0gJWxkLCBzbGltNl9yeF9zYW1wbGVfcmF0ZSA9ICVkXG4iLAorCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQkgc2xpbTZfcnhfc2FtcGxlX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbTBfdHhfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoIChzbGltMF90eF9iaXRfZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBzbGltMF90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkJIF9fZnVuY19fLCBzbGltMF90eF9iaXRfZm9ybWF0LAorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW0wX3R4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAyOgorCQlzbGltMF90eF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCXNsaW0wX3R4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlzbGltMF90eF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGludmFsaWQgdmFsdWUgJWxkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHVjb250cm9sIHZhbHVlID0gJWxkLCBzbGltMF90eF9iaXRfZm9ybWF0ID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCisJCSBzbGltMF90eF9iaXRfZm9ybWF0KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzbGltMF9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKHNsaW0wX3J4X3NhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiBzbGltMF9yeF9zYW1wbGVfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHNsaW0wX3J4X3NhbXBsZV9yYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW0wX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwgX19mdW5jX18sCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSA2OgorCQlzbGltMF9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2xpbTBfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNsaW0wX3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXNsaW0wX3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNsaW0wX3J4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2xpbTBfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJc2xpbTBfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCX0KKworCXByX2RlYnVnKCIlczogc2xpbTBfcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSBzbGltMF9yeF9zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltMF90eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKHNsaW0wX3R4X3NhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiBzbGltMF90eF9zYW1wbGVfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQlzbGltMF90eF9zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbTBfdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHVjb250cm9sIHZhbHVlID0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDI6CisJCXNsaW0wX3R4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2xpbTBfdHhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJCXNsaW0wX3R4X3NhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNhbXBsZSByYXRlIGJlaW5nIHBhc3NlZFxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW0wX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkJc2xpbTBfdHhfc2FtcGxlX3JhdGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzbGltNV9yeF9iaXRfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCXN3aXRjaCAoc2xpbTVfcnhfYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW01X3J4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgc2xpbTVfcnhfYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW01X3J4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDI6CisJCXNsaW01X3J4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2xpbTVfcnhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJc2xpbTVfcnhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbTZfcnhfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzd2l0Y2ggKHNsaW02X3J4X2JpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOworCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBzbGltNl9yeF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHNsaW02X3J4X2JpdF9mb3JtYXQsCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltNl9yeF9iaXRfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAyOgorCQlzbGltNl9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCXNsaW02X3J4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXNsaW02X3J4X2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW0wX3J4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCisJc3dpdGNoIChzbGltMF9yeF9iaXRfZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogc2xpbTBfcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCBzbGltMF9yeF9iaXRfZm9ybWF0LAorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbTBfcnhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMjoKKwkJc2xpbTBfcnhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzbGltMF9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQlzbGltMF9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc2xpbV81X3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltXzVfcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgbXNtX3NsaW1fNV9yeF9jaCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fc2xpbV81X3J4X2NoIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc2xpbV81X3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwltc21fc2xpbV81X3J4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fNV9yeF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIG1zbV9zbGltXzVfcnhfY2gpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltXzZfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fNl9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBtc21fc2xpbV82X3J4X2NoKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9zbGltXzZfcnhfY2ggLSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltXzZfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCW1zbV9zbGltXzZfcnhfY2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV82X3J4X2NoID0gJWRcbiIsIF9fZnVuY19fLAorCQkgbXNtX3NsaW1fNl9yeF9jaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMF9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV8wX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIG1zbV9zbGltXzBfcnhfY2gpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3NsaW1fMF9yeF9jaCAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMF9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXNtX3NsaW1fMF9yeF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltXzBfcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCSBtc21fc2xpbV8wX3J4X2NoKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fc2xpbV8wX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltXzBfdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgbXNtX3NsaW1fMF90eF9jaCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fc2xpbV8wX3R4X2NoIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc2xpbV8wX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwltc21fc2xpbV8wX3R4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fMF90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgbXNtX3NsaW1fMF90eF9jaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMV90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV8xX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIG1zbV9zbGltXzFfdHhfY2gpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3NsaW1fMV90eF9jaCAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMV90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXNtX3NsaW1fMV90eF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKKworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fMV90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgbXNtX3NsaW1fMV90eF9jaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3ZpX2ZlZWRfdHhfY2ggLSAxOworCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlbGRcbiIsIF9fZnVuY19fLAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwltc21fdmlfZmVlZF90eF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKKworCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sIG1zbV92aV9mZWVkX3R4X2NoKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoZG1pX3J4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzd2l0Y2ggKGhkbWlfcnhfYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGhkbWlfcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCBoZG1pX3J4X2JpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3J4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMjoKKwkJaGRtaV9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCWhkbWlfcnhfYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJaGRtaV9yeF9iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IGhkbWlfcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCBoZG1pX3J4X2JpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hkbWlfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21faGRtaV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBtc21faGRtaV9yeF9jaCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21faGRtaV9yeF9jaCAtIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21faGRtaV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwltc21faGRtaV9yeF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKKwlpZiAobXNtX2hkbWlfcnhfY2ggPiA4KSB7CisJCXByX2VycigiJXM6IGNoYW5uZWxzICVkIGV4Y2VlZGVkIDguTGltaXRpbmcgdG8gbWF4IGNocy04XG4iLAorCQkJX19mdW5jX18sIG1zbV9oZG1pX3J4X2NoKTsKKwkJbXNtX2hkbWlfcnhfY2ggPSA4OworCX0KKwlwcl9kZWJ1ZygiJXM6IG1zbV9oZG1pX3J4X2NoID0gJWRcbiIsIF9fZnVuY19fLCBtc21faGRtaV9yeF9jaCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoZG1pX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKKworCXN3aXRjaCAoaGRtaV9yeF9zYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNhbXBsZV9yYXRlX3ZhbDsKKwlwcl9kZWJ1ZygiJXM6IGhkbWlfcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSBoZG1pX3J4X3NhbXBsZV9yYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsIF9fZnVuY19fLAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMjoKKwkJaGRtaV9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDE6CisJCWhkbWlfcnhfc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJaGRtaV9yeF9zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJfQorCisJcHJfZGVidWcoIiVzOiBoZG1pX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaGRtaV9yeF9zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204OTk2X2F1eHBjbV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbTg5OTZfYXV4cGNtX3JhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9hdXhwY21fcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMDoKKwkJbXNtODk5Nl9hdXhwY21fcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltc204OTk2X2F1eHBjbV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNtODk5Nl9hdXhwY21fcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wcm94eV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21fcHJveHlfcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sIG1zbV9wcm94eV9yeF9jaCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fcHJveHlfcnhfY2ggLSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wcm94eV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXNtX3Byb3h5X3J4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3Byb3h5X3J4X2NoID0gJWRcbiIsIF9fZnVuY19fLCBtc21fcHJveHlfcnhfY2gpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9hdXhwY21fYmVfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9CisJICAgIGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPQorCSAgICBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtc204OTk2X2F1eHBjbV9yYXRlOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wcm94eV9yeF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJcHJfZGVidWcoIiVzOiBtc21fcHJveHlfcnhfY2ggPSVkXG4iLCBfX2Z1bmNfXywgbXNtX3Byb3h5X3J4X2NoKTsKKworCWlmIChjaGFubmVscy0+bWF4IDwgMikKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gbXNtX3Byb3h5X3J4X2NoOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3Byb3h5X3R4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisKKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfaGRtaV9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJcHJfZGVidWcoIiVzIGNoYW5uZWxzLT5taW4gJXUgY2hhbm5lbHMtPm1heCAldSAoKVxuIiwgX19mdW5jX18sCisJCSBjaGFubmVscy0+bWluLCBjaGFubmVscy0+bWF4KTsKKworCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQloZG1pX3J4X2JpdF9mb3JtYXQpOworCWlmIChjaGFubmVscy0+bWF4IDwgMikKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IGhkbWlfcnhfc2FtcGxlX3JhdGU7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21faGRtaV9yeF9jaDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV90eF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCXByX2RlYnVnKCIlczogY2hhbm5lbDolZFxuIiwgX19mdW5jX18sIG1zbV90ZXJ0X21pMnNfdHhfY2gpOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21fdGVydF9taTJzX3R4X2NoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCisJcHJfZGVidWcoIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisKKwltaTJzX3R4X2Nsay5lbmFibGUgPSAxOworCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWCwKKwkJCQkmbWkyc190eF9jbGspOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQsIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBzZXQgZm10IGNwdSBkYWkgZmFpbGVkLCBlcnI6JWRcbiIsIF9fZnVuY19fLCByZXQpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1zbTg5OTZfbWkyc19zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCisJbWkyc190eF9jbGsuZW5hYmxlID0gMDsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFgsCisJCQkJJm1pMnNfdHhfY2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCwgZXJyOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc204OTk2X21pMnNfYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtODk5Nl9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbTg5OTZfbWkyc19zbmRfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IG1zbV9zbGltXzVfcnhfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgc2xpbTVfcnhfYml0X2Zvcm1hdCk7CisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbTVfcnhfc2FtcGxlX3JhdGU7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21fc2xpbV81X3J4X2NoOworCisJIHByX2RlYnVnKCIlczogZm9ybWF0ID0gJWQsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKKwkJICBfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQkgIG1zbV9zbGltXzVfcnhfY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fNl9yeF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQkgICBzbGltNl9yeF9iaXRfZm9ybWF0KTsKKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltNl9yeF9zYW1wbGVfcmF0ZTsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IG1zbV9zbGltXzZfcnhfY2g7CisKKwlwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkLCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQkgbXNtX3NsaW1fNl9yeF9jaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc2xpbV8wX3J4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCSAgIHNsaW0wX3J4X2JpdF9mb3JtYXQpOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW0wX3J4X3NhbXBsZV9yYXRlOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gbXNtX3NsaW1fMF9yeF9jaDsKKworCSBwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkLCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCisJCSAgX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSwgcGFyYW1zX3JhdGUocGFyYW1zKSwKKwkJICBtc21fc2xpbV8wX3J4X2NoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltXzBfdHhfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwcl9kZWJ1ZygiJXMoKVxuIiwgX19mdW5jX18pOworCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwgc2xpbTBfdHhfYml0X2Zvcm1hdCk7CisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbTBfdHhfc2FtcGxlX3JhdGU7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21fc2xpbV8wX3R4X2NoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fMV90eF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCXByX2RlYnVnKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULCBzbGltMV90eF9iaXRfZm9ybWF0KTsKKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltMV90eF9zYW1wbGVfcmF0ZTsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IG1zbV9zbGltXzFfdHhfY2g7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc2xpbV80X3R4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCSAgICAgICBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSk7CisKKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzhLSFo7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21fdmlfZmVlZF90eF9jaDsKKwlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoOiAlZFxuIiwgX19mdW5jX18sIG1zbV92aV9mZWVkX3R4X2NoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltXzVfdHhfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgcmMgPSAwOworCXZvaWQgKmNvbmZpZyA9IE5VTEw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDE7CisKKwljb25maWcgPSBtc204OTk2X2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCUFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHKTsKKwlpZiAoY29uZmlnKSB7CisJCXJjID0gYWZlX3NldF9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcsIGNvbmZpZywKKwkJCQkgICAgU0xJTUJVU181X1RYKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IHNsaW1idXMgc2xhdmUgcG9ydCBjb25maWcgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fc25kX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHNwa19mdW5jdGlvbiksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBzbGltMF9yeF9jaF90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDgsIHNsaW0wX3R4X2NoX3RleHQpLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoNywgaGRtaV9yeF9jaF90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUocnhfYml0X2Zvcm1hdF90ZXh0KSwKKwkJCSAgICByeF9iaXRfZm9ybWF0X3RleHQpLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShzbGltMF9yeF9zYW1wbGVfcmF0ZV90ZXh0KSwKKwkJCSAgICBzbGltMF9yeF9zYW1wbGVfcmF0ZV90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDgsIHByb3h5X3J4X2NoX3RleHQpLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMywgaGRtaV9yeF9zYW1wbGVfcmF0ZV90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIHNsaW01X3J4X3NhbXBsZV9yYXRlX3RleHQpLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShzbGltNV9yeF9iaXRfZm9ybWF0X3RleHQpLAorCQkJICAgIHNsaW01X3J4X2JpdF9mb3JtYXRfdGV4dCksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBzbGltNV9yeF9jaF90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIGhpZmlfZnVuY3Rpb24pLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgdmlfZmVlZF9jaF90ZXh0KSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIHNsaW02X3J4X3NhbXBsZV9yYXRlX3RleHQpLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShzbGltNl9yeF9iaXRfZm9ybWF0X3RleHQpLAorCQkJICAgIHNsaW02X3J4X2JpdF9mb3JtYXRfdGV4dCksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBzbGltNl9yeF9jaF90ZXh0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgbXNtX3NuZF9lbnVtWzBdLCBtc204OTk2X2dldF9zcGssCisJCQltc204OTk2X3NldF9zcGspLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIENoYW5uZWxzIiwgbXNtX3NuZF9lbnVtWzFdLAorCQkJbXNtX3NsaW1fMF9yeF9jaF9nZXQsIG1zbV9zbGltXzBfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBDaGFubmVscyIsIG1zbV9zbmRfZW51bVsxMF0sCisJCQltc21fc2xpbV81X3J4X2NoX2dldCwgbXNtX3NsaW1fNV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIENoYW5uZWxzIiwgbXNtX3NuZF9lbnVtWzE1XSwKKwkJCW1zbV9zbGltXzZfcnhfY2hfZ2V0LCBtc21fc2xpbV82X3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfVFggQ2hhbm5lbHMiLCBtc21fc25kX2VudW1bMl0sCisJCQltc21fc2xpbV8wX3R4X2NoX2dldCwgbXNtX3NsaW1fMF90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8xX1RYIENoYW5uZWxzIiwgbXNtX3NuZF9lbnVtWzJdLAorCQkJbXNtX3NsaW1fMV90eF9jaF9nZXQsIG1zbV9zbGltXzFfdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFVWCBQQ00gU2FtcGxlUmF0ZSIsIG1zbTg5OTZfYXV4cGNtX2VudW1bMF0sCisJCQltc204OTk2X2F1eHBjbV9yYXRlX2dldCwKKwkJCW1zbTg5OTZfYXV4cGNtX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkhETUlfUlggQ2hhbm5lbHMiLCBtc21fc25kX2VudW1bM10sCisJCQltc21faGRtaV9yeF9jaF9nZXQsIG1zbV9oZG1pX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfUlggRm9ybWF0IiwgbXNtX3NuZF9lbnVtWzRdLAorCQkJc2xpbTBfcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW0wX3J4X2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBGb3JtYXQiLCBtc21fc25kX2VudW1bOV0sCisJCQlzbGltNV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbTVfcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIEZvcm1hdCIsIG1zbV9zbmRfZW51bVsxNF0sCisJCQlzbGltNl9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbTZfcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIFNhbXBsZVJhdGUiLCBtc21fc25kX2VudW1bNV0sCisJCQlzbGltMF9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW0wX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzVfUlggU2FtcGxlUmF0ZSIsIG1zbV9zbmRfZW51bVs4XSwKKwkJCXNsaW01X3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbTVfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBTYW1wbGVSYXRlIiwgbXNtX3NuZF9lbnVtWzEzXSwKKwkJCXNsaW02X3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbTZfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkhETUlfUlggQml0IEZvcm1hdCIsIG1zbV9zbmRfZW51bVs0XSwKKwkJCWhkbWlfcnhfYml0X2Zvcm1hdF9nZXQsIGhkbWlfcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJPWFlfUlggQ2hhbm5lbHMiLCBtc21fc25kX2VudW1bNl0sCisJCQltc21fcHJveHlfcnhfY2hfZ2V0LCBtc21fcHJveHlfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkhETUlfUlggU2FtcGxlUmF0ZSIsIG1zbV9zbmRfZW51bVs3XSwKKwkJCWhkbWlfcnhfc2FtcGxlX3JhdGVfZ2V0LCBoZG1pX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfVFggU2FtcGxlUmF0ZSIsIG1zbV9zbmRfZW51bVs1XSwKKwkJCXNsaW0wX3R4X3NhbXBsZV9yYXRlX2dldCwgc2xpbTBfdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBGb3JtYXQiLCBtc21fc25kX2VudW1bNF0sCisJCQlzbGltMF90eF9iaXRfZm9ybWF0X2dldCwgc2xpbTBfdHhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSGlGaSBGdW5jdGlvbiIsIG1zbV9zbmRfZW51bVsxMV0sIG1zbTg5OTZfaGlmaV9nZXQsCisJCQltc204OTk2X2hpZmlfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlZJX0ZFRURfVFggQ2hhbm5lbHMiLCBtc21fc25kX2VudW1bMTJdLAorCQkJbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0LCBtc21fdmlfZmVlZF90eF9jaF9wdXQpLAorfTsKKworc3RhdGljIGJvb2wgbXNtODk5Nl9zd2FwX2duZF9taWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbTg5OTZfYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHZhbHVlID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisKKwlwcl9kZWJ1ZygiJXM6IHN3YXAgc2VsZWN0IHN3aXRjaCAlZCB0byAlZFxuIiwgX19mdW5jX18sIHZhbHVlLCAhdmFsdWUpOworCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8sICF2YWx1ZSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2FmZV9zZXRfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmM7CisJdm9pZCAqY29uZmlnX2RhdGEgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKCFtc204OTk2X2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjb2RlYyBnZXQgYWZlIGNvbmZpZyBub3QgaW5pdCdlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29uZmlnX2RhdGEgPSBtc204OTk2X2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcsIGNvbmZpZ19kYXRhLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHJlZ2lzdGVycyBjb25maWcgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwljb25maWdfZGF0YSA9IG1zbTg5OTZfY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHLCBjb25maWdfZGF0YSwKKwkJCQkgICAgMCk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY2RjIHJlZ2lzdGVyIHBhZ2UgY29uZmlnXG4iLAorCQkJCV9fZnVuY19fKTsKKwl9CisKKwljb25maWdfZGF0YSA9IG1zbTg5OTZfY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOworCWlmIChjb25maWdfZGF0YSkgeworCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRywgY29uZmlnX2RhdGEsIDApOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBjb25maWcgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2FmZV9jbGVhcl9jb25maWcodm9pZCkKK3sKKwlhZmVfY2xlYXJfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7CisJYWZlX2NsZWFyX2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOworfQorCitzdGF0aWMgaW50ICBtc204OTk2X2Fkc3Bfc3RhdGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqcHJpdikKK3sKKwlpZiAodmFsdWUgPT0gU1VCU1lTX0JFRk9SRV9TSFVURE9XTikgeworCQlwcl9kZWJ1ZygiJXM6IEFEU1AgaXMgYWJvdXQgdG8gc2h1dGRvd24uIENsZWFyaW5nIEFGRSBjb25maWdcbiIsCisJCQkgX19mdW5jX18pOworCQltc21fYWZlX2NsZWFyX2NvbmZpZygpOworCX0gZWxzZSBpZiAodmFsdWUgPT0gU1VCU1lTX0FGVEVSX1BPV0VSVVApIHsKKwkJcHJfZGVidWcoIiVzOiBBRFNQIGlzIHVwXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhZHNwX3N0YXRlX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gbXNtODk5Nl9hZHNwX3N0YXRlX2NhbGxiYWNrLAorCS5wcmlvcml0eSA9IC1JTlRfTUFYLAorfTsKKworc3RhdGljIGludCBtc204OTk2X3djZDkzeHhfY29kZWNfdXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBhZHNwX3JlYWR5ID0gMDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsKKwkJbXNlY3NfdG9famlmZmllcyhBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMpOworCisJZG8geworCQlpZiAoIXE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgiJXM6IEFEU1AgQXVkaW8gaXNuJ3QgcmVhZHlcbiIsCisJCQkJCSAgIF9fZnVuY19fKTsKKwkJCS8qCisJCQkgKiBBRFNQIHdpbGwgYmUgY29taW5nIHVwIGFmdGVyIHN1YnN5c3RlbSByZXN0YXJ0IGFuZAorCQkJICogaXQgbWlnaHQgbm90IGJlIGZ1bGx5IHVwIHdoZW4gdGhlIGNvbnRyb2wgcmVhY2hlcworCQkJICogaGVyZS4gU28sIHdhaXQgZm9yIDUwbXNlYyBiZWZvcmUgY2hlY2tpbmcgQURTUCBzdGF0ZQorCQkJICovCisJCQltc2xlZXAoNTApOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzOiBBRFNQIEF1ZGlvIGlzIHJlYWR5XG4iLCBfX2Z1bmNfXyk7CisJCQlhZHNwX3JlYWR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlpZiAoIWFkc3BfcmVhZHkpIHsKKwkJcHJfZXJyKCIlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIEFEU1AgQXVkaW9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJZXJyID0gbXNtX2FmZV9zZXRfY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyKQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcuIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl90YXNoYV9jb2RlY19ldmVudF9jYihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWVudW0gd2NkOTMzNV9jb2RlY19ldmVudCBjb2RlY19ldmVudCkKK3sKKwlzd2l0Y2ggKGNvZGVjX2V2ZW50KSB7CisJY2FzZSBXQ0Q5MzM1X0NPREVDX0VWRU5UX0NPREVDX1VQOgorCQlyZXR1cm4gbXNtODk5Nl93Y2Q5M3h4X2NvZGVjX3VwKGNvZGVjKTsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBVblN1cHBvcnRlZCBjb2RlYyBldmVudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjb2RlY19ldmVudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBtc204OTk2X2NvbmZpZ19ocGhfZW4wX2dwaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGhpZ2gpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJaW50IHZhbDsKKworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpZiAoIXBkYXRhIHx8ICFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4wX2dwaW8pKQorCQlyZXR1cm4gMDsKKworCXZhbCA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5ocGhfZW4wX2dwaW8pOworCWlmICgoISF2YWwpID09IGhpZ2gpCisJCXJldHVybiAwOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ocGhfZW4wX2dwaW8sIChpbnQpaGlnaCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fYXVkcnhfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWludCBlcnI7CisJdm9pZCAqY29uZmlnX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmF1eF9jb21wOworCXZvaWQgKm1iaGNfY2FsaWJyYXRpb247CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CisJc3RydWN0IG1zbTg5OTZfYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKworCS8qIENvZGVjIFNMSU1CVVMgY29uZmlndXJhdGlvbgorCSAqIFJYMSwgUlgyLCBSWDMsIFJYNCwgUlg1LCBSWDYsIFJYNywgUlg4LCBSWDksIFJYMTAsIFJYMTEsIFJYMTIsIFJYMTMKKwkgKiBUWDEsIFRYMiwgVFgzLCBUWDQsIFRYNSwgVFg2LCBUWDcsIFRYOCwgVFg5LCBUWDEwLCBUWDExLCBUWDEyLCBUWDEzCisJICogVFgxNCwgVFgxNSwgVFgxNgorCSAqLworCXVuc2lnbmVkIGludCByeF9jaFtUQVNIQV9SWF9NQVhdID0gezE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwKKwkJCQkJICAgIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTZ9OworCXVuc2lnbmVkIGludCB0eF9jaFtUQVNIQV9UWF9NQVhdID0gezEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsCisJCQkJCSAgICAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LAorCQkJCQkgICAgMTQwLCAxNDEsIDE0MiwgMTQzfTsKKworCXByX2luZm8oIiVzOiBkZXZfbmFtZSVzXG4iLCBfX2Z1bmNfXywgZGV2X25hbWUoY3B1X2RhaS0+ZGV2KSk7CisKKwlydGQtPnBtZG93bl90aW1lID0gMDsKKworCWVyciA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtc21fc25kX2NvbnRyb2xzLAorCQkJCQkgQVJSQVlfU0laRShtc21fc25kX2NvbnRyb2xzKSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJfZXJyKCIlczogYWRkX2NvZGVjX2NvbnRyb2xzIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJX19mdW5jX18sIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gbXNtODk5Nl9saXF1aWRfaW5pdF9kb2NraW5nKCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiA4OTk2IGluaXQgRG9ja2luZyBzdGF0IElSUSBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IG1zbTg5OTZfZXh0X3VzX2FtcF9pbml0KCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiA4OTk2IFVTIEVtaXR0ZXIgR1BJTyBpbml0IGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtc204OTk2X2RhcG1fd2lkZ2V0cywKKwkJCQlBUlJBWV9TSVpFKG1zbTg5OTZfZGFwbV93aWRnZXRzKSk7CisKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2Q5MzM1X2F1ZGlvX3BhdGhzLAorCQkJCUFSUkFZX1NJWkUod2NkOTMzNV9hdWRpb19wYXRocykpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lb3V0XzEgYW1wIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMyBhbXAiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8yIGFtcCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lb3V0XzQgYW1wIik7CisKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxpbmVvdXRfMSBhbXAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxpbmVvdXRfMyBhbXAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxpbmVvdXRfMiBhbXAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxpbmVvdXRfNCBhbXAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgInVsdHJhc291bmQgYW1wIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQ1JpZ2h0IEhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkNMZWZ0IEhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMzIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljNSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM2Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBbmFsb2cgTWljNyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzgiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRElOUFVUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURfQ1BFX0lOUFVUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJFQVIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQxIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQ0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgRUFSIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDMSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUMzIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDNCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUM2Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDMSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMzIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDNCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzEgT1VUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUEsyIE9VVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBITCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBIUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSEwiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBIUEhSIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgTElORU9VVDEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBMSU5FT1VUMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBWSSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklJTlBVVCIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoKSwKKwkJCQkgICAgdHhfY2gsIEFSUkFZX1NJWkUocnhfY2gpLCByeF9jaCk7CisKKwltc204OTk2X2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuID0gdGFzaGFfZ2V0X2FmZV9jb25maWc7CisJbXNtODk5Nl9jb2RlY19mbi5tYmhjX2hzX2RldGVjdF9leGl0ID0gdGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdDsKKworCWVyciA9IG1zbV9hZmVfc2V0X2NvbmZpZyhjb2RlYyk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcgJWRcbiIsIF9fZnVuY19fLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwljb25maWdfZGF0YSA9IG1zbTg5OTZfY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQkJCQlBRkVfQUFOQ19WRVJTSU9OKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJZXJyID0gYWZlX3NldF9jb25maWcoQUZFX0FBTkNfVkVSU0lPTiwgY29uZmlnX2RhdGEsIDApOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGFhbmMgdmVyc2lvbiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWNvbmZpZ19kYXRhID0gbXNtODk5Nl9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCQkJICAgIEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJZXJyID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUcsCisJCQkJICAgICBjb25maWdfZGF0YSwgMCk7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY2xpcCByZWdpc3RlcnMgJWRcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwljb25maWdfZGF0YSA9IG1zbTg5OTZfY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfQ0xJUF9CQU5LX1NFTCk7CisJaWYgKGNvbmZpZ19kYXRhKSB7CisJCWVyciA9IGFmZV9zZXRfY29uZmlnKEFGRV9DTElQX0JBTktfU0VMLCBjb25maWdfZGF0YSwgMCk7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGJhbmsgc2VsZWN0aW9uICVkXG4iLAorCQkJCV9fZnVuY19fLCBlcnIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJLyogU3RhcnQgbWJoYyAqLworCXRhc2hhX21iaGNfemRldF9ncGlvX2N0cmwobXNtODk5Nl9jb25maWdfaHBoX2VuMF9ncGlvLCBydGQtPmNvZGVjKTsKKwltYmhjX2NhbGlicmF0aW9uID0gZGVmX3Rhc2hhX21iaGNfY2FsKCk7CisJaWYgKG1iaGNfY2FsaWJyYXRpb24pIHsKKwkJd2NkX21iaGNfY2ZnLmNhbGlicmF0aW9uID0gbWJoY19jYWxpYnJhdGlvbjsKKwkJZXJyID0gdGFzaGFfbWJoY19oc19kZXRlY3QoY29kZWMsICZ3Y2RfbWJoY19jZmcpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBtYmhjIGhzIGRldGVjdCBmYWlsZWQsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogbWJoY19jZmcgY2FsaWJyYXRpb24gaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJYWRzcF9zdGF0ZV9ub3RpZmllciA9IHN1YnN5c19ub3RpZl9yZWdpc3Rlcl9ub3RpZmllcigiYWRzcCIsCisJCQkJCQkmYWRzcF9zdGF0ZV9ub3RpZmllcl9ibG9jayk7CisJaWYgKCFhZHNwX3N0YXRlX25vdGlmaWVyKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byByZWdpc3RlciBhZHNwIHN0YXRlIG5vdGlmaWVyXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQllcnIgPSAtRUZBVUxUOworCQltc204OTk2X2NvZGVjX2ZuLm1iaGNfaHNfZGV0ZWN0X2V4aXQoY29kZWMpOworCQlnb3RvIG91dDsKKwl9CisKKwl0YXNoYV9ldmVudF9yZWdpc3Rlcihtc204OTk2X3Rhc2hhX2NvZGVjX2V2ZW50X2NiLCBydGQtPmNvZGVjKTsKKworCS8qCisJICogU2VuZCBzcGVha2VyIGNvbmZpZ3VyYXRpb24gb25seSBmb3IgV1NBODgxMC4KKwkgKiBEZWZhbHV0IGNvbmZpZ3VyYXRpb24gaXMgZm9yIFdTQTg4MTUuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QpKSB7CisJCWF1eF9jb21wID0gbGlzdF9maXJzdF9lbnRyeSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0LAorCQkJCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCwgbGlzdF9hdXgpOworCQlpZiAoIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8CisJCSAgICAhc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMikpIHsKKwkJCXRhc2hhX3NldF9zcGtyX21vZGUocnRkLT5jb2RlYywgU1BLUl9NT0RFXzEpOworCQkJdGFzaGFfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQocnRkLT5jb2RlYywKKwkJCQkJCSAgIFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpOworCQl9CisJfQorCWNvZGVjX3JlZ19kb25lID0gdHJ1ZTsKKworCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjYXJkLT5tb2R1bGUsICJjb2RlY3MiLAorCQkJCQkgY2FyZC0+cHJvY19yb290KTsKKwlpZiAoIWVudHJ5KSB7CisJCXByX2RlYnVnKCIlczogQ2Fubm90IGNyZWF0ZSBjb2RlY3MgbW9kdWxlIGVudHJ5XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZXJyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCXBkYXRhLT5jb2RlY19yb290ID0gZW50cnk7CisJdGFzaGFfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsIGNvZGVjKTsKKworCXJldHVybiAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkICpkZWZfdGFzaGFfbWJoY19jYWwodm9pZCkKK3sKKwl2b2lkICp0YXNoYV93Y2RfY2FsOworCXN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2NmZzsKKwl1MTYgKmJ0bl9oaWdoOworCisJdGFzaGFfd2NkX2NhbCA9IGt6YWxsb2MoV0NEX01CSENfQ0FMX1NJWkUoV0NEX01CSENfREVGX0JVVFRPTlMsCisJCQkJV0NEOVhYWF9NQkhDX0RFRl9STE9BRFMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhc2hhX3djZF9jYWwpCisJCXJldHVybiBOVUxMOworCisjZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUih0YXNoYV93Y2RfY2FsKS0+WCkgPSAoWSkpCisJUyh2X2hzX21heCwgMTUwMCk7CisjdW5kZWYgUworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhc2hhX3djZF9jYWwpLT5YKSA9IChZKSkKKwlTKG51bV9idG4sIFdDRF9NQkhDX0RFRl9CVVRUT05TKTsKKyN1bmRlZiBTCisKKwlidG5fY2ZnID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhc2hhX3djZF9jYWwpOworCWJ0bl9oaWdoID0gKCh2b2lkICopJmJ0bl9jZmctPl92X2J0bl9sb3cpICsKKwkJKHNpemVvZihidG5fY2ZnLT5fdl9idG5fbG93WzBdKSAqIGJ0bl9jZmctPm51bV9idG4pOworCisJYnRuX2hpZ2hbMF0gPSA3NTsKKwlidG5faGlnaFsxXSA9IDE1MDsKKwlidG5faGlnaFsyXSA9IDIzNzsKKwlidG5faGlnaFszXSA9IDUwMDsKKwlidG5faGlnaFs0XSA9IDUwMDsKKwlidG5faGlnaFs1XSA9IDUwMDsKKwlidG5faGlnaFs2XSA9IDUwMDsKKwlidG5faGlnaFs3XSA9IDUwMDsKKworCXJldHVybiB0YXNoYV93Y2RfY2FsOworfQorCitzdGF0aWMgaW50IG1zbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKworCWludCByZXQgPSAwOworCXUzMiByeF9jaFtTTElNX01BWF9SWF9QT1JUU10sIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCXUzMiByeF9jaF9jb3VudDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgpIHsKKwkJCXByX2RlYnVnKCIlczogcnhfNV9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkJICBtc21fc2xpbV81X3J4X2NoKTsKKwkJCXJ4X2NoX2NvdW50ID0gbXNtX3NsaW1fNV9yeF9jaDsKKwkJfSBlbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCkgeworCQkJcHJfZGVidWcoIiVzOiByeF82X2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIG1zbV9zbGltXzZfcnhfY2gpOworCQkJcnhfY2hfY291bnQgPSBtc21fc2xpbV82X3J4X2NoOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzOiByeF8wX2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIG1zbV9zbGltXzBfcnhfY2gpOworCQkJcnhfY2hfY291bnQgPSBtc21fc2xpbV8wX3J4X2NoOworCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAorCQkJCQkJICByeF9jaF9jb3VudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlIHsKKworCQlwcl9kZWJ1ZygiJXM6ICVzX3R4X2RhaV9pZF8lZF9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkLCB1c2VyX3NldF90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkvKiBGb3IgPGNvZGVjPl90eDEgY2FzZSAqLworCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgpCisJCQl1c2VyX3NldF90eF9jaCA9IG1zbV9zbGltXzBfdHhfY2g7CisJCS8qIEZvciA8Y29kZWM+X3R4MyBjYXNlICovCisJCWVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYKQorCQkJdXNlcl9zZXRfdHhfY2ggPSBtc21fc2xpbV8xX3R4X2NoOworCQllbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCkKKwkJCS8qIERBSSA1IGlzIHVzZWQgZm9yIGV4dGVybmFsIEVDIHJlZmVyZW5jZSBmcm9tIGNvZGVjLgorCQkJICogU2luY2UgUnggaXMgZmVkIGFzIHJlZmVyZW5jZSBmb3IgRUMsIHRoZSBjb25maWcgb2YKKwkJCSAqIHRoaXMgREFJIGlzIGJhc2VkIG9uIHRoYXQgb2YgdGhlIFJ4IHBhdGguCisJCQkgKi8KKwkJCXVzZXJfc2V0X3R4X2NoID0gbXNtX3NsaW1fMF9yeF9jaDsKKwkJZWxzZSBpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgpCisJCQl1c2VyX3NldF90eF9jaCA9IG1zbV92aV9mZWVkX3R4X2NoOworCQllbHNlCisJCQl1c2VyX3NldF90eF9jaCA9IHR4X2NoX2NudDsKKworCQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltXzBfdHhfY2goJWQpIHVzZXJfc2V0X3R4X2NoKCVkKSB0eF9jaF9jbnQoJWQpLCBCRSBpZCAoJWQpXG4iLAorCQkJIF9fZnVuY19fLCBtc21fc2xpbV8wX3R4X2NoLCB1c2VyX3NldF90eF9jaCwKKwkJCSB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCisJCQkJCQkgIHVzZXJfc2V0X3R4X2NoLCB0eF9jaCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fc25kX2NwZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCisJaW50IHJldCA9IDA7CisJdTMyIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLAorCQkJX19mdW5jX18sIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJcHJfZGVidWcoIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAorCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAorCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlbmQ7CisJfQorCisJdXNlcl9zZXRfdHhfY2ggPSB0eF9jaF9jbnQ7CisKKwlwcl9kZWJ1ZygiJXM6IHR4X2NoX2NudCglZCkgQkUgaWQgJWRcbiIsCisJCSBfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCisJCQkJCSAgdXNlcl9zZXRfdHhfY2gsIHR4X2NoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtODk5Nl9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc204OTk2X2NwZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfY3BlX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9zbGltYnVzXzJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcnhfY2hbU0xJTV9NQVhfUlhfUE9SVFNdLCB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107CisJdW5zaWduZWQgaW50IHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7CisJdW5zaWduZWQgaW50IG51bV90eF9jaCA9IDA7CisJdW5zaWduZWQgaW50IG51bV9yeF9jaCA9IDA7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQludW1fcnhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgcnhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3J4X2NoKTsKKwkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKKwkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIDAsCisJCQkJbnVtX3J4X2NoLCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgeworCQludW1fdHhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgIHR4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCW51bV90eF9jaCwgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtODk5Nl9zbGltYnVzXzJfYmVfb3BzID0geworCS5od19wYXJhbXMgPSBtc204OTk2X3NsaW1idXNfMl9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IG1zbTg5OTZfZ2V0X2xsX3Fvc192YWwoc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgdXNlY3M7CisKKwkvKiB0YWtlIDEwJSBvZiBwZXJpb2QgdGltZSBhcyB0aGUgZGVhZGxpbmUgKi8KKwl1c2VjcyA9ICgxMDAwMDAgLyBydW50aW1lLT5yYXRlKSAqIHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCXVzZWNzICs9ICgoMTAwMDAwICUgcnVudGltZS0+cmF0ZSkgKiBydW50aW1lLT5wZXJpb2Rfc2l6ZSkgLworCQlydW50aW1lLT5yYXRlOworCisJcmV0dXJuIHVzZWNzOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfbW01X3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaWYgKHBtX3Fvc19yZXF1ZXN0X2FjdGl2ZSgmc3Vic3RyZWFtLT5sYXRlbmN5X3BtX3Fvc19yZXEpKQorCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJnN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxKTsKKwlwbV9xb3NfYWRkX3JlcXVlc3QoJnN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxLAorCQkJICAgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCSAgIG1zbTg5OTZfZ2V0X2xsX3Fvc192YWwoc3Vic3RyZWFtLT5ydW50aW1lKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtODk5Nl9tbTVfb3BzID0geworCS5wcmVwYXJlID0gbXNtODk5Nl9tbTVfcHJlcGFyZSwKK307CisKKy8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc204OTk2X2NvbW1vbl9kYWlfbGlua3NbXSA9IHsKKwkvKiBGcm9udEVuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgTWVkaWExIiwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMQorCX0sCisJeworCQkubmFtZSA9ICJNU004OTk2IE1lZGlhMiIsCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLAorCX0sCisJeworCQkubmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTSBWb0lQIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvSVAiLAorCQkuY3B1X2RhaV9uYW1lID0gIlZvSVAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tdm9pcC1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JUCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBVTEwiLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTMiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWEzIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMiIsCisJCS5keW5hbWljID0gMSwKKwkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19QUkVQQVJFLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAorCX0sCisJLyogSG9zdGxlc3MgUENNIHB1cnBvc2UgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7CisJCS5uYW1lID0gIlRlcnRpYXJ5IE1JMlMgVFhfSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJURVJUX01JMlNfVFhfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTSBBRkUtUENNIFJYIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBSWCIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQxIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tYWZlIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNIEFGRS1QQ00gVFgiLAorCQkuc3RyZWFtX25hbWUgPSAiQUZFLVBST1hZIFRYIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yNDAiLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tYWZlIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBDb21wcmVzczEiLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MxIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiQVVYUENNX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18zIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzNfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVm9MVEUiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9MVEUiLAorCQkuY3B1X2RhaV9uYW1lID0gIlZvTFRFIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS12b2ljZSIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9MVEUsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgTG93TGF0ZW5jeSIsCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4xIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LAorCQkub3BzID0gJm1zbTg5OTZfbW01X29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU00xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMSwKKwl9LAorCS8qIE11bHRpcGxlIFR1bm5lbCBpbnN0YW5jZXMgKi8KKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgQ29tcHJlc3MyIiwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTciLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBDb21wcmVzczMiLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgVUxMIE5PSVJRIiwKKwkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsCisJfSwKKwl7CisJCS5uYW1lID0gIlFDSEFUIiwKKwkJLnN0cmVhbV9uYW1lID0gIlFDSEFUIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJRQ0hBVCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1FDSEFULAorCX0sCisJLyogSERNSSBIb3N0bGVzcyAqLworCXsKKwkJLm5hbWUgPSAiSERNSV9SWF9IT1NUTEVTUyIsCisJCS5zdHJlYW1fbmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJIRE1JX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkuY3B1X2RhaV9uYW1lID0gIlZvaWNlTU1vZGUyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS12b2ljZSIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAorCX0sCisJeworCQkubmFtZSA9ICJJTlRfSEZQX0JUIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIklOVF9IRlBfQlQgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIklOVF9IRlBfQlRfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBIRlAgVFgiLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTYiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE2IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1sb29wYmFjayIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsCisJfSwKKwkvKiBMU00gRkUgKi8KKwl7CisJCS5uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTMsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTQsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTYsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTgsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgTWVkaWE5IiwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE5IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhOSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LAorCX0sCisJeworCQkubmFtZSA9ICJWb1dMQU4iLAorCQkuc3RyZWFtX25hbWUgPSAiVm9XTEFOIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJWb1dMQU4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLAorCX0sCisJeworCQkubmFtZSA9ICJNU004OTk2IENvbXByZXNzNCIsCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczQiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBDb21wcmVzczUiLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgQ29tcHJlc3M2IiwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzNiIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEzIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLAorCX0sCisJeworCQkubmFtZSA9ICJNU004OTk2IENvbXByZXNzNyIsCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczciLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNODk5NiBDb21wcmVzczgiLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTTg5OTYgQ29tcHJlc3M5IiwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzOSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTE2IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LAorCX0sCisJeworCQkubmFtZSA9ICJDaXJjdWl0LVN3aXRjaCBWb2ljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDUy1Wb2ljZSIsCisJCS5jcHVfZGFpX25hbWUgICA9ICJDUy1WT0lDRSIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLAorCX0sCisJeworCQkubmFtZSA9ICJWb2ljZTIiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc204OTk2X3Rhc2hhX2ZlX2RhaV9saW5rc1tdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV92aWZlZWRiYWNrIiwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9zbGltXzRfdHhfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbTg5OTZfYmVfb3BzLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogVWx0cmFzb3VuZCBSWCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfcngyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLm9wcyA9ICZtc204OTk2X3NsaW1idXNfMl9iZV9vcHMsCisJfSwKKwkvKiBVbHRyYXNvdW5kIFRYIERBSSBMaW5rICovCisJeworCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLm9wcyA9ICZtc204OTk2X3NsaW1idXNfMl9iZV9vcHMsCisJfSwKKwkvKiBDUEUgTFNNIGRpcmVjdCBkYWktbGluayAqLworCXsKKwkJLm5hbWUgPSAiQ1BFIExpc3RlbiBzZXJ2aWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIkNQRSBMaXN0ZW4gQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1zbGltIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNwZS1sc20iLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21hZDEiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5vcHMgPSAmbXNtODk5Nl9jcGVfb3BzLAorCX0sCisJLyogc2xpbWJ1cyByeCA2IGhvc3RsZXNzICovCisJeworCQkubmFtZSA9ICJTTElNQlVTXzYgSG9zdGxlc3MgUGxheWJhY2siLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU182IEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTNl9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwkvKiBDUEUgTFNNIEVDIFBQIGRpcmVjdCBkYWktbGluayAqLworCXsKKwkJLm5hbWUgPSAiQ1BFIExpc3RlbiBzZXJ2aWNlIEVDUFAiLAorCQkuc3RyZWFtX25hbWUgPSAiQ1BFIExpc3RlbiBBdWRpbyBTZXJ2aWNlIEVDUFAiLAorCQkuY3B1X2RhaV9uYW1lID0gIkNQRV9MU01fTk9IT1NUIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNwZS1sc20uMyIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfY3BlIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtODk5Nl9jb21tb25fYmVfZGFpX2xpbmtzW10gPSB7CisJLyogQmFja2VuZCBBRkUgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9wcm94eV9yeF9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQUZFX1BDTV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9wcm94eV90eF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBQcmltYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2F1eHBjbV9iZV9wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9hdXhwY21fYmVfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIFJlY29yZCBVcGxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIFVwbGluayBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBSZWNvcmQgRG93bmxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIERvd25saW5rIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIDIgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVk9JQ0UyX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIEZhcmVuZCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3R4X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc204OTk2X21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc204OTk2X3Rhc2hhX2JlX2RhaV9saW5rc1tdID0geworCS8qIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJCS5pbml0ID0gJm1zbV9hdWRyeF9pbml0LAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3NsaW1fMF9yeF9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtODk5Nl9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9zbGltXzBfdHhfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbTg5OTZfYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3NsaW1fMF9yeF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtODk5Nl9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgzIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3NsaW1fMV90eF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtODk5Nl9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fc2xpbV8wX3J4X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc204OTk2X2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fc2xpbV8wX3R4X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc204OTk2X2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9zbGltXzBfcnhfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbTg5OTZfYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9yeDMiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3NsaW1fNV9yeF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtODk5Nl9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogTUFEIEJFICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWFkMSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9zbGltXzVfdHhfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbTg5OTZfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNl9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM2IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4NCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fc2xpbV82X3J4X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc204OTk2X2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc204OTk2X2hkbWlfZGFpX2xpbmtbXSA9IHsKKwkvKiBIRE1JIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0hETUksCisJCS5zdHJlYW1fbmFtZSA9ICJIRE1JIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWhkbWkuOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1oZG1pLWF1ZGlvLWNvZGVjLXJ4IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbV9oZG1pX2F1ZGlvX2NvZGVjX3J4X2RhaSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtODk5Nl9oZG1pX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc204OTk2X3Rhc2hhX2RhaV9saW5rc1sKKwkJCSBBUlJBWV9TSVpFKG1zbTg5OTZfY29tbW9uX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtODk5Nl90YXNoYV9mZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbTg5OTZfY29tbW9uX2JlX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtODk5Nl90YXNoYV9iZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbTg5OTZfaGRtaV9kYWlfbGluayldOworCitzdGF0aWMgaW50IG1zbTg5OTZfd3NhODgxeF9pbml0KHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQoreworCXU4IHNwa2xlZnRfcG9ydHNbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsxMDAsIDEwMSwgMTAyLCAxMDZ9OworCXU4IHNwa3JpZ2h0X3BvcnRzW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MTAzLCAxMDQsIDEwNSwgMTA3fTsKKwl1bnNpZ25lZCBpbnQgY2hfcmF0ZVtXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezI0MDAsIDYwMCwgMzAwLCAxMjAwfTsKKwl1bnNpZ25lZCBpbnQgY2hfbWFza1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezB4MSwgMHhGLCAweDMsIDB4M307CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19jb21wb25lbnRfdG9fY29kZWMoY29tcG9uZW50KTsKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzIGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JMZWZ0IikpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgbGVmdCBjaCBtYXAgdG8gY29kZWMgJXNcbiIsCisJCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKKwkJd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoY29kZWMsICZzcGtsZWZ0X3BvcnRzWzBdLAorCQkJCVdTQTg4MVhfTUFYX1NXUl9QT1JUUywgJmNoX21hc2tbMF0sCisJCQkJJmNoX3JhdGVbMF0pOworCQlpZiAoZGFwbS0+Y29tcG9uZW50KSB7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JMZWZ0IElOIik7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JMZWZ0IFNQS1IiKTsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChjb21wb25lbnQtPm5hbWVfcHJlZml4LCAiU3BrclJpZ2h0IikpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgcmlnaHQgY2ggbWFwIHRvIGNvZGVjICVzXG4iLAorCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrcmlnaHRfcG9ydHNbMF0sCisJCQkJV1NBODgxWF9NQVhfU1dSX1BPUlRTLCAmY2hfbWFza1swXSwKKwkJCQkmY2hfcmF0ZVswXSk7CisJCWlmIChkYXBtLT5jb21wb25lbnQpIHsKKwkJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3BrclJpZ2h0IElOIik7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JSaWdodCBTUEtSIik7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogd3JvbmcgY29kZWMgbmFtZSAlc1xuIiwgX19mdW5jX18sCisJCQljb2RlYy0+Y29tcG9uZW50Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29tcG9uZW50LT5jYXJkKTsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmNvZGVjX3Jvb3QpCisJCXdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsCisJCQkJCQkgICAgICBjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGFzaGFfbXNtODk5NiA9IHsKKwkubmFtZQkJPSAibXNtODk5Ni10YXNoYS1zbmQtY2FyZCIsCit9OworCitzdGF0aWMgaW50IG1zbTg5OTZfcG9wdWxhdGVfZGFpX2xpbmtfY29tcG9uZW50X29mX25vZGUoCisJCQkJCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJaW50IGksIGluZGV4LCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjYXJkLT5kZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWlmICghY2RldikgeworCQlwcl9lcnIoIiVzOiBTb3VuZCBjYXJkIGRldmljZSBtZW1vcnkgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2xpbmtzOyBpKyspIHsKKwkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX29mX25vZGUgJiYgZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpCisJCQljb250aW51ZTsKKworCQkvKiBwb3B1bGF0ZSBwbGF0Zm9ybV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUgJiYKKwkJICAgICFkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlKSB7CisJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAorCQkJCQkJImFzb2MtcGxhdGZvcm0tbmFtZXMiLAorCQkJCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJcHJfZXJyKCIlczogTm8gbWF0Y2ggZm91bmQgZm9yIHBsYXRmb3JtIG5hbWU6ICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQkJcmV0ID0gaW5kZXg7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtcGxhdGZvcm0iLAorCQkJCQkgICAgICBpbmRleCk7CisJCQlpZiAoIW5wKSB7CisJCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBwbGF0Zm9ybSAlcywgaW5kZXggJWQgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSwKKwkJCQkJaW5kZXgpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlID0gbnA7CisJCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lID0gTlVMTDsKKwkJfQorCisJCS8qIHBvcHVsYXRlIGNwdV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSAmJiAhZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpIHsKKwkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCisJCQkJCQkgImFzb2MtY3B1LW5hbWVzIiwKKwkJCQkJCSBkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOworCQkJaWYgKGluZGV4ID49IDApIHsKKwkJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY3B1IiwKKwkJCQkJCWluZGV4KTsKKwkJCQlpZiAoIW5wKSB7CisJCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgY3B1IGRhaSAlcyBmYWlsZWRcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSk7CisJCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCQlkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSA9IG5wOworCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSA9IE5VTEw7CisJCQl9CisJCX0KKworCQkvKiBwb3B1bGF0ZSBjb2RlY19vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLmNvZGVjX25hbWUgJiYgIWRhaV9saW5rW2ldLmNvZGVjX29mX25vZGUpIHsKKwkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCisJCQkJCQkgImFzb2MtY29kZWMtbmFtZXMiLAorCQkJCQkJIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOworCQkJaWYgKGluZGV4IDwgMCkKKwkJCQljb250aW51ZTsKKwkJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLCAiYXNvYy1jb2RlYyIsCisJCQkJCSAgICAgIGluZGV4KTsKKwkJCWlmICghbnApIHsKKwkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNvZGVjICVzIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlID0gbnA7CisJCQlkYWlfbGlua1tpXS5jb2RlY19uYW1lID0gTlVMTDsKKwkJfQorCX0KKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9wcmVwYXJlX3VzX2V1cm8oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgcmV0OworCisJaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgeworCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiB1c19ldXJvIGdwaW8gcmVxdWVzdCAlZCIsIF9fZnVuY19fLAorCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+dXNfZXVyb19ncGlvLCAiVEFTSEFfQ09ERUNfVVNfRVVSTyIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNvZGVjIFVTL0VVUk8gZ3BpbyAlZCBlcnJvciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3BpbywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc204OTk2X3ByZXBhcmVfaGlmaShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBtc204OTk2X2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCByZXQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMV9ncGlvKSkgeworCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiBocGhfZW4xX2dwaW8gcmVxdWVzdCAlZFxuIiwgX19mdW5jX18sCisJCQlwZGF0YS0+aHBoX2VuMV9ncGlvKTsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ocGhfZW4xX2dwaW8sICJocGhfZW4xX2dwaW8iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIiVzOiBocGhfZW4xX2dwaW8gcmVxdWVzdCBmYWlsZWQsIHJldDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmhwaF9lbjBfZ3BpbykpIHsKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICIlczogaHBoX2VuMF9ncGlvIHJlcXVlc3QgJWRcbiIsIF9fZnVuY19fLAorCQkJcGRhdGEtPmhwaF9lbjBfZ3Bpbyk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+aHBoX2VuMF9ncGlvLCAiaHBoX2VuMF9ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogaHBoX2VuMF9ncGlvIHJlcXVlc3QgZmFpbGVkLCByZXQ6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc204OTk2X2Fzb2NfbWFjaGluZV9vZl9tYXRjaFtdICA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtODk5Ni1hc29jLXNuZC10YXNoYSIsCisJICAuZGF0YSA9ICJ0YXNoYV9jb2RlYyJ9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgKnBvcHVsYXRlX3NuZF9jYXJkX2RhaWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpbGluazsKKwlpbnQgbGVuXzEsIGxlbl8yLCBsZW5fMywgbGVuXzQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisKKwltYXRjaCA9IG9mX21hdGNoX25vZGUobXNtODk5Nl9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsIGRldi0+b2Zfbm9kZSk7CisJaWYgKCFtYXRjaCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBObyBEVCBtYXRjaCBmb3VuZCBmb3Igc291bmQgY2FyZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJ0YXNoYV9jb2RlYyIpKSB7CisJCWNhcmQgPSAmc25kX3NvY19jYXJkX3Rhc2hhX21zbTg5OTY7CisJCWxlbl8xID0gQVJSQVlfU0laRShtc204OTk2X2NvbW1vbl9kYWlfbGlua3MpOworCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc204OTk2X3Rhc2hhX2ZlX2RhaV9saW5rcyk7CisJCWxlbl8zID0gbGVuXzIgKyBBUlJBWV9TSVpFKG1zbTg5OTZfY29tbW9uX2JlX2RhaV9saW5rcyk7CisKKwkJbWVtY3B5KG1zbTg5OTZfdGFzaGFfZGFpX2xpbmtzLAorCQkgICAgICAgbXNtODk5Nl9jb21tb25fZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbTg5OTZfY29tbW9uX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtODk5Nl90YXNoYV9kYWlfbGlua3MgKyBsZW5fMSwKKwkJICAgICAgIG1zbTg5OTZfdGFzaGFfZmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbTg5OTZfdGFzaGFfZmVfZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc204OTk2X3Rhc2hhX2RhaV9saW5rcyArIGxlbl8yLAorCQkgICAgICAgbXNtODk5Nl9jb21tb25fYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbTg5OTZfY29tbW9uX2JlX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtODk5Nl90YXNoYV9kYWlfbGlua3MgKyBsZW5fMywKKwkJICAgICAgIG1zbTg5OTZfdGFzaGFfYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbTg5OTZfdGFzaGFfYmVfZGFpX2xpbmtzKSk7CisKKwkJZGFpbGluayA9IG1zbTg5OTZfdGFzaGFfZGFpX2xpbmtzOworCQlsZW5fNCA9IGxlbl8zICsgQVJSQVlfU0laRShtc204OTk2X3Rhc2hhX2JlX2RhaV9saW5rcyk7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLGhkbWktYXVkaW8tcngiKSkgeworCQlkZXZfZGJnKGRldiwgIiVzKCk6IGhkbWkgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJbWVtY3B5KGRhaWxpbmsgKyBsZW5fNCwgbXNtODk5Nl9oZG1pX2RhaV9saW5rLAorCQkJc2l6ZW9mKG1zbTg5OTZfaGRtaV9kYWlfbGluaykpOworCQlsZW5fNCArPSBBUlJBWV9TSVpFKG1zbTg5OTZfaGRtaV9kYWlfbGluayk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhkZXYsICIlcygpOiBObyBoZG1pIGF1ZGlvIHN1cHBvcnRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlpZiAoY2FyZCkgeworCQljYXJkLT5kYWlfbGluayA9IGRhaWxpbms7CisJCWNhcmQtPm51bV9saW5rcyA9IGxlbl80OworCX0KKworCXJldHVybiBjYXJkOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfaW5pdF93c2FfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKndzYV9vZl9ub2RlOworCXUzMiB3c2FfbWF4X2RldnM7CisJdTMyIHdzYV9kZXZfY250OworCWNoYXIgKmRldl9uYW1lX3N0ciA9IE5VTEw7CisJc3RydWN0IG1zbTg5OTZfd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKKwljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOworCWludCBmb3VuZCA9IDA7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAicWNvbSx3c2EtbWF4LWRldnMiLCAmd3NhX21heF9kZXZzKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSAiJXM6IHdzYS1tYXgtZGV2cyBwcm9wZXJ0eSBtaXNzaW5nIGluIERUICVzLCByZXQgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh3c2FfbWF4X2RldnMgPT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICIlczogTWF4IFdTQSBkZXZpY2VzIGlzIDAgZm9yIHRoaXMgdGFyZ2V0P1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCBjb3VudCBvZiBXU0EgZGV2aWNlIHBoYW5kbGVzIGZvciB0aGlzIHBsYXRmb3JtICovCisJd3NhX2Rldl9jbnQgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAicWNvbSx3c2EtZGV2cyIsIE5VTEwpOworCWlmICh3c2FfZGV2X2NudCA9PSAtRU5PRU5UKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICIlczogTm8gd3NhIGRldmljZSBkZWZpbmVkIGluIERULlxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAod3NhX2Rldl9jbnQgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IEVycm9yIHJlYWRpbmcgd3NhIGRldmljZSBmcm9tIERULiB3c2FfZGV2X2NudCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdzYV9kZXZfY250KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBFeHBlY3QgdG90YWwgcGhhbmRsZXMgY291bnQgdG8gYmUgTk9UIGxlc3MgdGhhbiBtYXhpbXVtIHBvc3NpYmxlCisJICogV1NBIGNvdW50LiBIb3dldmVyLCBpZiBpdCBpcyBsZXNzLCB0aGVuIGFzc2lnbiBzYW1lIHZhbHVlIHRvCisJICogbWF4IGNvdW50IGFzIHdlbGwuCisJICovCisJaWYgKHdzYV9kZXZfY250IDwgd3NhX21heF9kZXZzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogd3NhX21heF9kZXZzID0gJWQgY2Fubm90IGV4Y2VlZCB3c2FfZGV2X2NudCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdzYV9tYXhfZGV2cywgd3NhX2Rldl9jbnQpOworCQl3c2FfbWF4X2RldnMgPSB3c2FfZGV2X2NudDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgcHJlZml4IHN0cmluZyBwYXNzZWQgZm9yIGVhY2ggV1NBIGRldmljZSAqLworCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJxY29tLHdzYS1hdXgtZGV2LXByZWZpeCIpOworCWlmIChyZXQgIT0gd3NhX2Rldl9jbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBleHBlY3RpbmcgJWQgd3NhIHByZWZpeC4gRGVmaW5lZCBvbmx5ICVkIGluIERUXG4iLAorCQkJX19mdW5jX18sIHdzYV9kZXZfY250LCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEFsbG9jIG1lbSB0byBzdG9yZSBwaGFuZGxlIGFuZCBpbmRleCBpbmZvIG9mIFdTQSBkZXZpY2UsIGlmIGFscmVhZHkKKwkgKiByZWdpc3RlcmVkIHdpdGggQUxTQSBjb3JlCisJICovCisJd3NhODgxeF9kZXZfaW5mbyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB3c2FfbWF4X2RldnMsCisJCQkJCXNpemVvZihzdHJ1Y3QgbXNtODk5Nl93c2E4ODF4X2Rldl9pbmZvKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCF3c2E4ODF4X2Rldl9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogc2VhcmNoIGFuZCBjaGVjayB3aGV0aGVyIGFsbCBXU0EgZGV2aWNlcyBhcmUgYWxyZWFkeQorCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgb3Igbm90LiBJZiBmb3VuZCBhIG5vZGUsIHN0b3JlCisJICogdGhlIG5vZGUgYW5kIHRoZSBpbmRleCBpbiBhIGxvY2FsIGFycmF5IG9mIHN0cnVjdCBmb3IgbGF0ZXIKKwkgKiB1c2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IHdzYV9kZXZfY250OyBpKyspIHsKKwkJd3NhX29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICAgInFjb20sd3NhLWRldnMiLCBpKTsKKwkJaWYgKHVubGlrZWx5KCF3c2Ffb2Zfbm9kZSkpIHsKKwkJCS8qIHdlIHNob3VsZCBub3QgYmUgaGVyZSAqLworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogd3NhIGRldiBub2RlIGlzIG5vdCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChzb2NfZmluZF9jb21wb25lbnQod3NhX29mX25vZGUsIE5VTEwpKSB7CisJCQkvKiBXU0EgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgKi8KKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLm9mX25vZGUgPSB3c2Ffb2Zfbm9kZTsKKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLmluZGV4ID0gaTsKKwkJCWZvdW5kKys7CisJCQlpZiAoZm91bmQgPT0gd3NhX21heF9kZXZzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kIDwgd3NhX21heF9kZXZzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGZpbmQgJWQgY29tcG9uZW50cy4gRm91bmQgb25seSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIGZvdW5kKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSIlczogZm91bmQgJWQgd3NhODgxeCBkZXZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmVcbiIsCisJCV9fZnVuY19fLCBmb3VuZCk7CisKKwljYXJkLT5udW1fYXV4X2RldnMgPSB3c2FfbWF4X2RldnM7CisJY2FyZC0+bnVtX2NvbmZpZ3MgPSB3c2FfbWF4X2RldnM7CisKKwkvKiBBbGxvYyBhcnJheSBvZiBBVVggZGV2cyBzdHJ1Y3QgKi8KKwltc204OTk2X2F1eF9kZXYgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgY2FyZC0+bnVtX2F1eF9kZXZzLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfYXV4X2RldiksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghbXNtODk5Nl9hdXhfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsbG9jIGFycmF5IG9mIGNvZGVjIGNvbmYgc3RydWN0ICovCisJbXNtODk5Nl9jb2RlY19jb25mID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNhcmQtPm51bV9hdXhfZGV2cywKKwkJCQkJICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc204OTk2X2NvZGVjX2NvbmYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9hdXhfZGV2czsgaSsrKSB7CisJCWRldl9uYW1lX3N0ciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBERVZfTkFNRV9TVFJfTEVOLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghZGV2X25hbWVfc3RyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgInFjb20sd3NhLWF1eC1kZXYtcHJlZml4IiwKKwkJCQkJCSAgICB3c2E4ODF4X2Rldl9pbmZvW2ldLmluZGV4LAorCQkJCQkJICAgIHdzYV9hdXhkZXZfbmFtZV9wcmVmaXgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIiVzOiBmYWlsZWQgdG8gcmVhZCB3c2EgYXV4IGRldiBwcmVmaXgsIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzbnByaW50ZihkZXZfbmFtZV9zdHIsIHN0cmxlbigid3NhODgxeC4lZCIpLCAid3NhODgxeC4lZCIsIGkpOworCQltc204OTk2X2F1eF9kZXZbaV0ubmFtZSA9IGRldl9uYW1lX3N0cjsKKwkJbXNtODk5Nl9hdXhfZGV2W2ldLmNvZGVjX25hbWUgPSBOVUxMOworCQltc204OTk2X2F1eF9kZXZbaV0uY29kZWNfb2Zfbm9kZSA9CisJCQkJCXdzYTg4MXhfZGV2X2luZm9baV0ub2Zfbm9kZTsKKwkJbXNtODk5Nl9hdXhfZGV2W2ldLmluaXQgPSBtc204OTk2X3dzYTg4MXhfaW5pdDsKKwkJbXNtODk5Nl9jb2RlY19jb25mW2ldLmRldl9uYW1lID0gTlVMTDsKKwkJbXNtODk5Nl9jb2RlY19jb25mW2ldLm5hbWVfcHJlZml4ID0gd3NhX2F1eGRldl9uYW1lX3ByZWZpeFswXTsKKwkJbXNtODk5Nl9jb2RlY19jb25mW2ldLm9mX25vZGUgPQorCQkJCQl3c2E4ODF4X2Rldl9pbmZvW2ldLm9mX25vZGU7CisJfQorCWNhcmQtPmNvZGVjX2NvbmYgPSBtc204OTk2X2NvZGVjX2NvbmY7CisJY2FyZC0+YXV4X2RldiA9IG1zbTg5OTZfYXV4X2RldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTg5OTZfYXNvY19tYWNoaW5lX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbXNtODk5Nl9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJY29uc3QgY2hhciAqbWJoY19hdWRpb19qYWNrX3R5cGUgPSBOVUxMOworCWNoYXIgKm1jbGtfZnJlcV9wcm9wX25hbWU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJaW50IHJldDsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gc3VwcGxpZWQgZnJvbSBkZXZpY2UgdHJlZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IG1zbTg5OTZfYXNvY19tYWNoX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhcmQgPSBwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcygmcGRldi0+ZGV2KTsKKwlpZiAoIWNhcmQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENhcmQgdW5pbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgcGRhdGEpOworCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoY2FyZCwgInFjb20sbW9kZWwiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNlIGNhcmQgbmFtZSBmYWlsZWQsIGVycjolZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZyhjYXJkLCAicWNvbSxhdWRpby1yb3V0aW5nIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwYXJzZSBhdWRpbyByb3V0aW5nIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG1zbTg5OTZfYXNvY19tYWNoaW5lX29mX21hdGNoLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICghbWF0Y2gpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIG1hdGNoZWQgY29kZWMgaXMgZm91bmQuXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwltY2xrX2ZyZXFfcHJvcF9uYW1lID0gInFjb20sdGFzaGEtbWNsay1jbGstZnJlcSI7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCW1jbGtfZnJlcV9wcm9wX25hbWUsICZwZGF0YS0+bWNsa19mcmVxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkLCBlcnIlZFxuIiwKKwkJCW1jbGtfZnJlcV9wcm9wX25hbWUsCisJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAocGRhdGEtPm1jbGtfZnJlcSAhPSBDT0RFQ19FWFRfQ0xLX1JBVEUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgbWNsayBmcmVxICV1XG4iLAorCQkJcGRhdGEtPm1jbGtfZnJlcSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXNwZGV2ID0gcGRldjsKKworCXJldCA9IG1zbTg5OTZfcG9wdWxhdGVfZGFpX2xpbmtfY29tcG9uZW50X29mX25vZGUoY2FyZCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBtc204OTk2X2luaXRfd3NhX2RldihwZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXBkYXRhLT5ocGhfZW4xX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsIDApOworCWlmIChwZGF0YS0+aHBoX2VuMV9ncGlvIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogJXMgcHJvcGVydHkgbm90IGZvdW5kICVkXG4iLAorCQkJX19mdW5jX18sICJxY29tLGhwaC1lbjEtZ3BpbyIsIHBkYXRhLT5ocGhfZW4xX2dwaW8pOworCX0KKworCXBkYXRhLT5ocGhfZW4wX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsIDApOworCWlmIChwZGF0YS0+aHBoX2VuMF9ncGlvIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogJXMgcHJvcGVydHkgbm90IGZvdW5kICVkXG4iLAorCQkJX19mdW5jX18sICJxY29tLGhwaC1lbjAtZ3BpbyIsIHBkYXRhLT5ocGhfZW4wX2dwaW8pOworCX0KKwlyZXQgPSBtc204OTk2X3ByZXBhcmVfaGlmaShjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtc204OTk2X3ByZXBhcmVfaGlmaSBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CisJCWlmIChjb2RlY19yZWdfZG9uZSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyOworCX0KKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU291bmQgY2FyZCAlcyByZWdpc3RlcmVkXG4iLCBjYXJkLT5uYW1lKTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSIsICZtYmhjX2F1ZGlvX2phY2tfdHlwZSk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKKwkJCSJxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIiwKKwkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJKYWNrIHR5cGUgcHJvcGVydGllcyBzZXQgdG8gZGVmYXVsdCIpOworCX0gZWxzZSB7CisJCWlmICghc3RyY21wKG1iaGNfYXVkaW9famFja190eXBlLCAiNC1wb2xlLWphY2siKSkKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlRoaXMgaGFyZHdhcmUgaGFzIDQgcG9sZSBqYWNrIik7CisJCWVsc2UgaWYgKCFzdHJjbXAobWJoY19hdWRpb19qYWNrX3R5cGUsICI1LXBvbGUtamFjayIpKQorCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVGhpcyBoYXJkd2FyZSBoYXMgNSBwb2xlIGphY2siKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjYtcG9sZS1qYWNrIikpCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJUaGlzIGhhcmR3YXJlIGhhcyA2IHBvbGUgamFjayIpOworCQllbHNlCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJVbmtub3duIHZhbHVlLCBzZXQgdG8gZGVmYXVsdCIpOworCX0KKwkvKgorCSAqIFBhcnNlIFVTLUV1cm8gZ3BpbyBpbmZvIGZyb20gRFQuIFJlcG9ydCBubyBlcnJvciBpZiB1cy1ldXJvCisJICogZW50cnkgaXMgbm90IGZvdW5kIGluIERUIGZpbGUgYXMgc29tZSB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0CisJICogVVMtRXVybyBkZXRlY3Rpb24KKwkgKi8KKwlwZGF0YS0+dXNfZXVyb19ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOworCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvIDwgMCkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAorCQkJInFjb20sdXMtZXVyby1ncGlvcyIsCisJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBkZXRlY3RlZCAlZCIsCisJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXdjZF9tYmhjX2NmZy5zd2FwX2duZF9taWMgPSBtc204OTk2X3N3YXBfZ25kX21pYzsKKwl9CisKKwlyZXQgPSBtc204OTk2X3ByZXBhcmVfdXNfZXVybyhjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAibXNtODk5Nl9wcmVwYXJlX3VzX2V1cm8gZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCXJldHVybiAwOworZXJyOgorCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvID4gMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBmcmVlIHVzX2V1cm8gZ3BpbyAlZFxuIiwKKwkJCV9fZnVuY19fLCBwZGF0YS0+dXNfZXVyb19ncGlvKTsKKwkJZ3Bpb19mcmVlKHBkYXRhLT51c19ldXJvX2dwaW8pOworCQlwZGF0YS0+dXNfZXVyb19ncGlvID0gMDsKKwl9CisJaWYgKHBkYXRhLT5ocGhfZW4xX2dwaW8gPiAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGZyZWUgaHBoX2VuMV9ncGlvICVkXG4iLAorCQkJX19mdW5jX18sIHBkYXRhLT5ocGhfZW4xX2dwaW8pOworCQlncGlvX2ZyZWUocGRhdGEtPmhwaF9lbjFfZ3Bpbyk7CisJCXBkYXRhLT5ocGhfZW4xX2dwaW8gPSAwOworCX0KKwlpZiAocGRhdGEtPmhwaF9lbjBfZ3BpbyA+IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZnJlZSBocGhfZW4wX2dwaW8gJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPmhwaF9lbjBfZ3Bpbyk7CisJCWdwaW9fZnJlZShwZGF0YS0+aHBoX2VuMF9ncGlvKTsKKwkJcGRhdGEtPmhwaF9lbjBfZ3BpbyA9IDA7CisJfQorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtODk5Nl9hc29jX21hY2hpbmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtc204OTk2X2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJaWYgKGdwaW9faXNfdmFsaWQoZXh0X3VzX2FtcF9ncGlvKSkKKwkJZ3Bpb19mcmVlKGV4dF91c19hbXBfZ3Bpbyk7CisKKwlncGlvX2ZyZWUocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJZ3Bpb19mcmVlKHBkYXRhLT5ocGhfZW4xX2dwaW8pOworCWdwaW9fZnJlZShwZGF0YS0+aHBoX2VuMF9ncGlvKTsKKworCWlmIChtc204OTk2X2xpcXVpZF9kb2NrX2RldiAhPSBOVUxMKSB7CisJCXN3aXRjaF9kZXZfdW5yZWdpc3RlcigmbXNtODk5Nl9saXF1aWRfZG9ja19kZXYtPmF1ZGlvX3NkZXYpOworCisJCWlmIChtc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2lycSkKKwkJCWZyZWVfaXJxKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5kb2NrX3BsdWdfaXJxLAorCQkJCSBtc204OTk2X2xpcXVpZF9kb2NrX2Rldik7CisKKwkJaWYgKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2LT5kb2NrX3BsdWdfZ3BpbykKKwkJCWdwaW9fZnJlZShtc204OTk2X2xpcXVpZF9kb2NrX2Rldi0+ZG9ja19wbHVnX2dwaW8pOworCisJCWtmcmVlKG1zbTg5OTZfbGlxdWlkX2RvY2tfZGV2KTsKKwkJbXNtODk5Nl9saXF1aWRfZG9ja19kZXYgPSBOVUxMOworCX0KKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc204OTk2X2Fzb2NfbWFjaGluZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtODk5Nl9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtc204OTk2X2Fzb2NfbWFjaGluZV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtODk5Nl9hc29jX21hY2hpbmVfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXNtODk5Nl9hc29jX21hY2hpbmVfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBtc20iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc204OTk2X2Fzb2NfbWFjaGluZV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbTg5OTguYyBiL3NvdW5kL3NvYy9tc20vbXNtODk5OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTBjMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbTg5OTguYwpAQCAtMCwwICsxLDY4MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8ZGV2aWNlX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgorI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzMzUuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3dzYTg4MXguaCIKKworI2RlZmluZSBEUlZfTkFNRSAibXNtODk5OC1hc29jLXNuZCIKKworI2RlZmluZSBfX0NISVBTRVRfXyAiTVNNODk5OCAiCisjZGVmaW5lIE1TTV9EQUlMSU5LX05BTUUobmFtZSkgKF9fQ0hJUFNFVF9fI25hbWUpCisKKyNkZWZpbmUgU0FNUExJTkdfUkFURV84S0haICAgICAgODAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWiAxMTAyNQorI2RlZmluZSBTQU1QTElOR19SQVRFXzE2S0haICAgICAxNjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzIyUDA1S0haICAyMjA1MAorI2RlZmluZSBTQU1QTElOR19SQVRFXzMyS0haICAgICAzMjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzQ0UDFLSFogICA0NDEwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzQ4S0haICAgICA0ODAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzg4UDJLSFogICA4ODIwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzk2S0haICAgICA5NjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzE3NlA0S0haICAxNzY0MDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xOTJLSFogICAgMTkyMDAwCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFogIDM1MjgwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzM4NEtIWiAgICAzODQwMDAKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX0JVVFRPTlMgICAgOAorI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyAgICAgNQorI2RlZmluZSBDT0RFQ19FWFRfQ0xLX1JBVEUgICAgICAgICAgOTYwMDAwMAorI2RlZmluZSBBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMgMzAwMAorI2RlZmluZSBERVZfTkFNRV9TVFJfTEVOICAgICAgICAgICAgMzIKKworI2RlZmluZSBXU0E4ODEwX05BTUVfMSAid3NhODgxeC4yMDE3MDIxMSIKKyNkZWZpbmUgV1NBODgxMF9OQU1FXzIgIndzYTg4MXguMjAxNzAyMTIiCisKKyNkZWZpbmUgV0NOX0NEQ19TTElNX1JYX0NIX01BWCAyCisjZGVmaW5lIFdDTl9DRENfU0xJTV9UWF9DSF9NQVggMworCisjZGVmaW5lIFRETV9DSEFOTkVMX01BWCA4CisjZGVmaW5lIFRETV9TTE9UX09GRlNFVF9NQVggOAorCisjZGVmaW5lIE1TTV9ISUZJX09OIDEKKworZW51bSB7CisJU0xJTV9SWF8wID0gMCwKKwlTTElNX1JYXzEsCisJU0xJTV9SWF8yLAorCVNMSU1fUlhfMywKKwlTTElNX1JYXzQsCisJU0xJTV9SWF81LAorCVNMSU1fUlhfNiwKKwlTTElNX1JYXzcsCisJU0xJTV9SWF9NQVgsCit9OworCitlbnVtIHsKKwlTTElNX1RYXzAgPSAwLAorCVNMSU1fVFhfMSwKKwlTTElNX1RYXzIsCisJU0xJTV9UWF8zLAorCVNMSU1fVFhfNCwKKwlTTElNX1RYXzUsCisJU0xJTV9UWF82LAorCVNMSU1fVFhfNywKKwlTTElNX1RYXzgsCisJU0xJTV9UWF9NQVgsCit9OworCitlbnVtIHsKKwlQUklNX01JMlMgPSAwLAorCVNFQ19NSTJTLAorCVRFUlRfTUkyUywKKwlRVUFUX01JMlMsCisJTUkyU19NQVgsCit9OworCitlbnVtIHsKKwlQUklNX0FVWF9QQ00gPSAwLAorCVNFQ19BVVhfUENNLAorCVRFUlRfQVVYX1BDTSwKKwlRVUFUX0FVWF9QQ00sCisJQVVYX1BDTV9NQVgsCit9OworCitlbnVtIHsKKwlQQ01fSTJTX1NFTF9QUklNID0gMCwKKwlQQ01fSTJTX1NFTF9TRUMsCisJUENNX0kyU19TRUxfVEVSVCwKKwlQQ01fSTJTX1NFTF9RVUFULAorCVBDTV9JMlNfU0VMX01BWCwKK307CisKK3N0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXZvaWQgKnBjbV9pMnNfc2VsX3Z0X2FkZHI7Cit9OworCitzdHJ1Y3QgbWkyc19jb25mIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1MzIgcmVmX2NudDsKKwl1MzIgbXNtX2lzX21pMnNfbWFzdGVyOworfTsKKworc3RydWN0IGF1eHBjbV9jb25mIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1MzIgcmVmX2NudDsKK307CisKK3N0cnVjdCBkZXZfY29uZmlnIHsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIGJpdF9mb3JtYXQ7CisJdTMyIGNoYW5uZWxzOworfTsKKworZW51bSB7CisJSERNSV9SWF9JRFggPSAwLAorCURQX1JYX0lEWCwKKwlFWFRfRElTUF9SWF9JRFhfTUFYLAorfTsKKworc3RydWN0IG1zbV93c2E4ODF4X2Rldl9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJdTMyIGluZGV4OworfTsKKworc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSB7CisJdTMyIG1jbGtfZnJlcTsKKwlpbnQgdXNfZXVyb19ncGlvOyAvKiB1c2VkIGJ5IGdwaW8gZHJpdmVyIEFQSSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdXNfZXVyb19ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhwaF9lbjFfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCisJc3RydWN0IGRldmljZV9ub2RlICpocGhfZW4wX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKK307CisKK3N0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIHsKKwl2b2lkKiAoKmdldF9hZmVfY29uZmlnX2ZuKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOworCXZvaWQgKCptYmhjX2hzX2RldGVjdF9leGl0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworfTsKKworZW51bSB7CisJVERNXzAgPSAwLAorCVRETV8xLAorCVRETV8yLAorCVRETV8zLAorCVRETV80LAorCVRETV81LAorCVRETV82LAorCVRETV83LAorCVRETV9QT1JUX01BWCwKK307CisKK2VudW0geworCVRETV9QUkkgPSAwLAorCVRETV9TRUMsCisJVERNX1RFUlQsCisJVERNX1FVQVQsCisJVERNX0lOVEVSRkFDRV9NQVgsCit9OworCitzdHJ1Y3QgdGRtX3BvcnQgeworCXUzMiBtb2RlOworCXUzMiBjaGFubmVsOworfTsKKworLyogVERNIGRlZmF1bHQgY29uZmlnICovCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgdGRtX3J4X2NmZ1tURE1fSU5URVJGQUNFX01BWF1bVERNX1BPUlRfTUFYXSA9IHsKKwl7IC8qIFBSSSBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCisJfSwKKwl7IC8qIFNFQyBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCisJfSwKKwl7IC8qIFRFUlQgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLworCX0sCisJeyAvKiBRVUFUIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KKwl9Cit9OworCisvKiBURE0gZGVmYXVsdCBjb25maWcgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB0ZG1fdHhfY2ZnW1RETV9JTlRFUkZBQ0VfTUFYXVtURE1fUE9SVF9NQVhdID0geworCXsgLyogUFJJIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KKwl9LAorCXsgLyogU0VDIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KKwl9LAorCXsgLyogVEVSVCBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCisJfSwKKwl7IC8qIFFVQVQgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLworCX0KK307CisKKy8qVERNIGRlZmF1bHQgb2Zmc2V0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRkbV9zbG90X29mZnNldFtURE1fUE9SVF9NQVhdW1RETV9TTE9UX09GRlNFVF9NQVhdID0geworCXswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjh9LC8qIFRYXzAgfCBSWF8wICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzEgfCBSWF8xICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzIgfCBSWF8yICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzMgfCBSWF8zICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzQgfCBSWF80ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzUgfCBSWF81ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzYgfCBSWF82ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzcgfCBSWF83ICovCit9OworCisvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2Ygc2xpbWJ1cyBjaGFubmVscyAqLworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fcnhfY2ZnW10gPSB7CisJW1NMSU1fUlhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fdHhfY2ZnW10gPSB7CisJW1NMSU1fVFhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGV4dGVybmFsIGRpc3BsYXkgQkUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBleHRfZGlzcF9yeF9jZmdbXSA9IHsKKwlbSERNSV9SWF9JRFhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKKwlbRFBfUlhfSURYXSA9ICAge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfcnhfY2ZnID0geworCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCisJLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkuY2hhbm5lbHMgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHVzYl90eF9jZmcgPSB7CisJLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWiwKKwkuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLAorCS5jaGFubmVscyA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgcHJveHlfcnhfY2ZnID0geworCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCisJLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkuY2hhbm5lbHMgPSAyLAorfTsKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3J4X2NmZ1tdID0geworCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKKwlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCisJW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3R4X2NmZ1tdID0geworCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBhdXhfcGNtX3J4X2NmZ1tdID0geworCVtQUklNX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTRUNfQVVYX1BDTV0gID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtURVJUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtRVUFUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fdHhfY2ZnW10gPSB7CisJW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCit9OworCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoID0gMjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fdHhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCQkJCQkJIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwKKwkJCQkJCSJFaWdodCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZpX2ZlZWRfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIn07CitzdGF0aWMgY2hhciBjb25zdCAqYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCisJCQkJCSAgIlMzMl9MRSJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIn07CitzdGF0aWMgY2hhciBjb25zdCAqc2xpbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCisJCQkJCSJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKKwkJCQkJIktIWl84OFAyIiwgIktIWl85NiIsICJLSFpfMTc2UDQiLAorCQkJCQkiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmJ0X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwgIktIWl80OCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVzYl9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCisJCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCisJCQkJCSAgICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmNoX3RleHRbXSA9IHsiVHdvIiwgIlRocmVlIiwgIkZvdXIiLCAiRml2ZSIsCisJCQkJCSJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKKwkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAorCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCisJCQkJCSJLSFpfODhQMiIsICJLSFpfOTYiLCAiS0haXzE3NlA0IiwKKwkJCQkJIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAorCQkJCQkJICAiS0haXzE5MiJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCisJCQkJICAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9iaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMzJfTEUifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp0ZG1fc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzMyIiwKKwkJCQkJICAgICAiS0haXzQ0UDEiLCAiS0haXzQ4IiwgIktIWl85NiIsCisJCQkJCSAgICAgIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhdXhwY21fcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiJ9Oworc3RhdGljIGNoYXIgY29uc3QgKm1pMnNfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCisJCQkJICAgICAgIktIWl8zMiIsICJLSFpfNDRQMSIsICJLSFpfNDgiLAorCQkJCSAgICAgICJLSFpfOTYiLCAiS0haXzE5MiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pMnNfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCQkJCQkgICAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLAorCQkJCQkgICAiRWlnaHQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBoaWZpX3RleHRbXSA9IHsiT2ZmIiwgIk9uIn07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8xX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV81X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X2NocywgdXNiX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfY2hzLCB1c2JfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHZpX2ZlZWRfdHhfY2hzLCB2aV9mZWVkX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9jaHMsIGNoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcm94eV9yeF9jaHMsIGNoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzZfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9mb3JtYXQsIGV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChidF9zYW1wbGVfcmF0ZSwgYnRfc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl9yeF9zYW1wbGVfcmF0ZSwgdXNiX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfc2FtcGxlX3JhdGUsIHVzYl9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGUsCisJCQkJZXh0X2Rpc3Bfc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9jaHMsIHRkbV9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X2Zvcm1hdCwgdGRtX2JpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9zYW1wbGVfcmF0ZSwgdGRtX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfY2hzLCB0ZG1fY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9mb3JtYXQsIHRkbV9iaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfc2FtcGxlX3JhdGUsIHRkbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChoaWZpX2Z1bmN0aW9uLCBoaWZpX3RleHQpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BkZXY7CitzdGF0aWMgaW50IG1zbV9oaWZpX2NvbnRyb2w7CisKK3N0YXRpYyBib29sIGlzX2luaXRpYWxfYm9vdDsKK3N0YXRpYyBib29sIGNvZGVjX3JlZ19kb25lOworc3RhdGljIHN0cnVjdCBzbmRfc29jX2F1eF9kZXYgKm1zbV9hdXhfZGV2Oworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgKm1zbV9jb2RlY19jb25mOworc3RhdGljIHN0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIG1zbV9jb2RlY19mbjsKKworc3RhdGljIHZvaWQgKmRlZl90YXNoYV9tYmhjX2NhbCh2b2lkKTsKK3N0YXRpYyB2b2lkICpkZWZfdGF2aWxfbWJoY19jYWwodm9pZCk7CitzdGF0aWMgaW50IG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlpbnQgZW5hYmxlLCBib29sIGRhcG0pOworc3RhdGljIGludCBtc21fd3NhODgxeF9pbml0KHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KTsKKworLyoKKyAqIE5lZWQgdG8gcmVwb3J0IExJTkVJTgorICogaWYgUi9MIGNoYW5uZWwgaW1wZWRhbmNlIGlzIGxhcmdlciB0aGFuIDVLIG9obQorICovCitzdGF0aWMgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyB3Y2RfbWJoY19jZmcgPSB7CisJLnJlYWRfZndfYmluID0gZmFsc2UsCisJLmNhbGlicmF0aW9uID0gTlVMTCwKKwkuZGV0ZWN0X2V4dG5fY2FibGUgPSB0cnVlLAorCS5tb25vX3N0ZXJvX2RldGVjdGlvbiA9IGZhbHNlLAorCS5zd2FwX2duZF9taWMgPSBOVUxMLAorCS5oc19leHRfbWljYmlhcyA9IHRydWUsCisJLmtleV9jb2RlWzBdID0gS0VZX01FRElBLAorCS5rZXlfY29kZVsxXSA9IEtFWV9WT0lDRUNPTU1BTkQsCisJLmtleV9jb2RlWzJdID0gS0VZX1ZPTFVNRVVQLAorCS5rZXlfY29kZVszXSA9IEtFWV9WT0xVTUVET1dOLAorCS5rZXlfY29kZVs0XSA9IDAsCisJLmtleV9jb2RlWzVdID0gMCwKKwkua2V5X2NvZGVbNl0gPSAwLAorCS5rZXlfY29kZVs3XSA9IDAsCisJLmxpbmVpbl90aCA9IDUwMDAsCisJLm1vaXN0dXJlX2VuID0gdHJ1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZF9hdWRpb19wYXRoc190YXNoYVtdID0geworCXsiTUlDIEJJQVMxIiwgTlVMTCwgIk1DTEsgVFgifSwKKwl7Ik1JQyBCSUFTMiIsIE5VTEwsICJNQ0xLIFRYIn0sCisJeyJNSUMgQklBUzMiLCBOVUxMLCAiTUNMSyBUWCJ9LAorCXsiTUlDIEJJQVM0IiwgTlVMTCwgIk1DTEsgVFgifSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZF9hdWRpb19wYXRoc1tdID0geworCXsiTUlDIEJJQVMxIiwgTlVMTCwgIk1DTEsifSwKKwl7Ik1JQyBCSUFTMiIsIE5VTEwsICJNQ0xLIn0sCisJeyJNSUMgQklBUzMiLCBOVUxMLCAiTUNMSyJ9LAorCXsiTUlDIEJJQVM0IiwgTlVMTCwgIk1DTEsifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbWkyc19jbGtbTUkyU19NQVhdID0geworCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9TRUNfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9URVJfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfSUJJVCwKKwkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKKwkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCisJCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJCTAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgbWkyc19hdXhwY21fY29uZltQQ01fSTJTX1NFTF9NQVhdOworc3RhdGljIHN0cnVjdCBtaTJzX2NvbmYgbWkyc19pbnRmX2NvbmZbTUkyU19NQVhdOworc3RhdGljIHN0cnVjdCBhdXhwY21fY29uZiBhdXhwY21faW50Zl9jb25mW0FVWF9QQ01fTUFYXTsKKworc3RhdGljIGludCBzbGltX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQoreworCWludCBzYW1wbGVfcmF0ZV92YWwgPSAwOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzg4UDJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDU7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE3NlA0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA3OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDk7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCBzbGltX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCit7CisJaW50IHNhbXBsZV9yYXRlID0gMDsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDA6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwljYXNlIDU6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84OFAyS0haOworCQlicmVhazsKKwljYXNlIDY6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZTsKK30KKworc3RhdGljIGludCBzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChpbnQgYml0X2Zvcm1hdCkKK3sKKwlpbnQgdmFsID0gMDsKKworCXN3aXRjaCAoYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCXZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQl2YWwgPSAyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQl2YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNsaW1fZ2V0X2JpdF9mb3JtYXQoaW50IHZhbCkKK3sKKwlpbnQgYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDA6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBiaXRfZm10OworfQorCitzdGF0aWMgaW50IHNsaW1fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQoreworCWludCBwb3J0X2lkID0gMDsKKworCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8wX1JYIiwgc2l6ZW9mKCJTTElNXzBfUlgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1JYXzA7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMl9SWCIsIHNpemVvZigiU0xJTV8yX1JYIikpKQorCQlwb3J0X2lkID0gU0xJTV9SWF8yOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzVfUlgiLCBzaXplb2YoIlNMSU1fNV9SWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fUlhfNTsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV82X1JYIiwgc2l6ZW9mKCJTTElNXzZfUlgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1JYXzY7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMF9UWCIsIHNpemVvZigiU0xJTV8wX1RYIikpKQorCQlwb3J0X2lkID0gU0xJTV9UWF8wOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzFfVFgiLCBzaXplb2YoIlNMSU1fMV9UWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fVFhfMTsKKwllbHNlIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHBvcnRfaWQ7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCXNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9CisJCXNsaW1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgc2FtcGxlX3JhdGUgPSAwOworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXNhbXBsZV9yYXRlID0gc2xpbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJaWYgKHNhbXBsZV9yYXRlID09IFNBTVBMSU5HX1JBVEVfNDRQMUtIWikgeworCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZDogZm9yIFR4IHBhdGhcbiIsCisJCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9yeF9iaXRfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0KTsKKworCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAorCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0ID0KKwkJc2xpbV9nZXRfYml0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAorCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3R4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCQlzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwlzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQorCQlzbGltX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV90eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV92aV9mZWVkX3R4X2NoIC0gMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCW1zbV92aV9mZWVkX3R4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCisJcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgbXNtX3ZpX2ZlZWRfdHhfY2gpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwkvKgorCSAqIFNsaW1idXNfN19SeC9UeCBzYW1wbGUgcmF0ZSB2YWx1ZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBzeW5jIChzYW1lKQorCSAqIHdoZW4gdXNlZCBmb3IgQlRfU0NPIHVzZSBjYXNlLiBSZXR1cm4gZWl0aGVyIFJ4IG9yIFR4IHNhbXBsZSByYXRlCisJICogdmFsdWUuCisJICovCisJc3dpdGNoIChzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNhbXBsZSByYXRlID0gJWQiLCBfX2Z1bmNfXywKKwkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDE6CisJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZXM6IHNsaW03X3J4ID0gJWQsIHNsaW03X3R4ID0gJWQsIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywKKwkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUsCisJCSBzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHVzYl9yeF9jZmcuY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3J4X2NmZy5jaGFubmVscyAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1c2JfcnhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl9yeF9jZmcuY2hhbm5lbHMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisKKwlzd2l0Y2ggKHVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTA7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gOTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSB1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAxMjoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwljYXNlIDExOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDk6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE3NlA0S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDc6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8yMlAwNUtIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xMVAwMjVLSFo7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogY29udHJvbCB2YWx1ZSA9ICVsZCwgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1c2JfcnhfY2ZnLmJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDM7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCB1c2JfcnhfY2ZnLmJpdF9mb3JtYXQsCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDM6CisJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOworCQlicmVhazsKKwljYXNlIDI6CisJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVzYl9yeF9jZmcuYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHVzYl90eF9jZmcuY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3R4X2NmZy5jaGFubmVscyAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1c2JfdHhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl90eF9jZmcuY2hhbm5lbHMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisKKwlzd2l0Y2ggKHVzYl90eF9jZmcuc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTA7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gOTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMTI6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84OFAyS0haOworCQlicmVhazsKKwljYXNlIDY6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwljYXNlIDU6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haOworCQlicmVhazsKKwljYXNlIDA6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb190eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodXNiX3R4X2NmZy5iaXRfZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdXNiX3R4X2NmZy5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb190eF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAzOgorCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJfQorCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCB1c2JfdHhfY2ZnLmJpdF9mb3JtYXQsCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQoreworCWludCBpZHg7CisKKwlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIkhETUlfUlgiLCBzaXplb2YoIkhETUlfUlgiKSkpCisJCWlkeCA9IEhETUlfUlhfSURYOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJEaXNwbGF5IFBvcnQgUlgiLAorCQkJIHNpemVvZigiRGlzcGxheSBQb3J0IFJYIikpKQorCQlpZHggPSBEUF9SWF9JRFg7CisJZWxzZSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIEJFOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlpZHggPSAtRUlOVkFMOworCX0KKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlzd2l0Y2ggKGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmZvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAxOgorCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzIC0gMjsKKworCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmNoID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHRfZGlzcF9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMgPQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAyOworCisJcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisJaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXN3aXRjaCAoZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDI6CisJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIGV4dF9kaXNwX3J4WyVkXS5zYW1wbGVfcmF0ZSA9ICVkXG4iLAorCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCBpZHgsCisJCSBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJveHlfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogcHJveHlfcnggY2hhbm5lbHMgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwcm94eV9yeF9jZmcuY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJveHlfcnhfY2ZnLmNoYW5uZWxzIC0gMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb3h5X3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcm94eV9yeF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDI7CisJcHJfZGVidWcoIiVzOiBwcm94eV9yeCBjaGFubmVscyA9ICVkXG4iLAorCQkgX19mdW5jX18sIHByb3h5X3J4X2NmZy5jaGFubmVscyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGUgPSAwOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDY6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZTsKK30KKworc3RhdGljIGludCBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCit7CisJaW50IHNhbXBsZV9yYXRlOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgdGRtX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQoreworCWludCBzYW1wbGVfcmF0ZV92YWwgPSAwOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDc7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOworfQorCitzdGF0aWMgaW50IGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbDsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOworfQorCitzdGF0aWMgaW50IHRkbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHRkbV9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0KSB7CisJCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJIiwKKwkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7CisJCQlwb3J0LT5tb2RlID0gVERNX1BSSTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDIiwKKwkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7CisJCQlwb3J0LT5tb2RlID0gVERNX1NFQzsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9URVJUOworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUIiwKKwkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7CisJCQlwb3J0LT5tb2RlID0gVERNX1FVQVQ7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBtb2RlIGluOiAlcyIsCisJCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8wIiwKKwkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCSAgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8wOworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8xIiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8xOworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8yIiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8yOworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8zIiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8zOworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF80IiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNCIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV80OworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF81IiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV81OworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF82IiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV82OworCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF83IiwKKwkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8CisJCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV83OworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbCBpbjogJXMiLAorCQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKAorCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUpOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlID0KKwkJCXRkbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKAorCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUpOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlID0KKwkJCXRkbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X2Zvcm1hdChpbnQgdmFsdWUpCit7CisJaW50IGZvcm1hdCA9IDA7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAwOgorCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZm9ybWF0OworfQorCitzdGF0aWMgaW50IHRkbV9nZXRfZm9ybWF0X3ZhbChpbnQgZm9ybWF0KQoreworCWludCB2YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdmFsdWUgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQl2YWx1ZSA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCB0ZG1fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9mb3JtYXRfdmFsKAorCQkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQpOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV9yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQgPQorCQkJdGRtX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfZm9ybWF0X3ZhbCgKKwkJCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0KTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0ID0KKwkJCXRkbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyA9CisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDE7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDEsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzID0KKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1eF9wY21fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQoreworCWludCBpZHg7CisKKwlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fQVVYX1BDTSIsCisJCSAgICBzaXplb2YoIlBSSU1fQVVYX1BDTSIpKSkKKwkJaWR4ID0gUFJJTV9BVVhfUENNOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfQVVYX1BDTSIsCisJCQkgc2l6ZW9mKCJTRUNfQVVYX1BDTSIpKSkKKwkJaWR4ID0gU0VDX0FVWF9QQ007CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfQVVYX1BDTSIsCisJCQkgc2l6ZW9mKCJURVJUX0FVWF9QQ00iKSkpCisJCWlkeCA9IFRFUlRfQVVYX1BDTTsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9BVVhfUENNIiwKKwkJCSBzaXplb2YoIlFVQVRfQVVYX1BDTSIpKSkKKwkJaWR4ID0gUVVBVF9BVVhfUENNOworCWVsc2UgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBwb3J0OiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlpZHggPSAtRUlOVkFMOworCX0KKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9CisJCWF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCSAgICAgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCWF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQorCQlhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkgICAgIGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaTJzX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKK3sKKwlpbnQgaWR4OworCisJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX01JMlNfUlgiLAorCSAgICBzaXplb2YoIlBSSU1fTUkyU19SWCIpKSkKKwkJaWR4ID0gUFJJTV9NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfTUkyU19SWCIsCisJCSBzaXplb2YoIlNFQ19NSTJTX1JYIikpKQorCQlpZHggPSBTRUNfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9NSTJTX1JYIiwKKwkJIHNpemVvZigiVEVSVF9NSTJTX1JYIikpKQorCQlpZHggPSBURVJUX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfTUkyU19SWCIsCisJCSBzaXplb2YoIlFVQVRfTUkyU19SWCIpKSkKKwkJaWR4ID0gUVVBVF9NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX01JMlNfVFgiLAorCQkgc2l6ZW9mKCJQUklNX01JMlNfVFgiKSkpCisJCWlkeCA9IFBSSU1fTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX01JMlNfVFgiLAorCQkgc2l6ZW9mKCJTRUNfTUkyU19UWCIpKSkKKwkJaWR4ID0gU0VDX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfTUkyU19UWCIsCisJCSBzaXplb2YoIlRFUlRfTUkyU19UWCIpKSkKKwkJaWR4ID0gVEVSVF9NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX01JMlNfVFgiLAorCQkgc2l6ZW9mKCJRVUFUX01JMlNfVFgiKSkpCisJCWlkeCA9IFFVQVRfTUkyUzsKKwllbHNlIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJaWR4ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IG1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbDsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Cit9CisKK3N0YXRpYyBpbnQgbWkyc19nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQoreworCWludCBzYW1wbGVfcmF0ZTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDA6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwljYXNlIDU6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJbWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9CisJCW1pMnNfZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQltaTJzX2dldF9zYW1wbGVfcmF0ZV92YWwobWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJbWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9CisJCW1pMnNfZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQltaTJzX2dldF9zYW1wbGVfcmF0ZV92YWwobWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG1pMnNfcnhfY2ZnW2lkeF0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX21pMnNfWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG1pMnNfdHhfY2ZnW2lkeF0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX21pMnNfWyVkXV90eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfdHhfY2ZnW2lkeF0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hpZmlfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJcHJfZGVidWcoIiVzOiBtc21faGlmaV9jb250cm9sID0gJWQiLCBfX2Z1bmNfXywKKwkJIG1zbV9oaWZpX2NvbnRyb2wpOworCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmhwaF9lbjFfZ3Bpb19wKSB7CisJCXByX2VycigiJXM6IGhwaF9lbjFfZ3BpbyBpcyBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobXNtX2hpZmlfY29udHJvbCA9PSBNU01fSElGSV9PTikgeworCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZShwZGF0YS0+aHBoX2VuMV9ncGlvX3ApOworCQkvKiA1bXNlYyBkZWxheSBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MDEwKTsKKwl9IGVsc2UgeworCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKHBkYXRhLT5ocGhfZW4xX2dwaW9fcCk7CisJfQorCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hpZmlfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21faGlmaV9jb250cm9sID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgbXNtX2hpZmlfY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21faGlmaV9jb250cm9sOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hpZmlfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisKKwlwcl9kZWJ1ZygiJXMoKSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwltc21faGlmaV9jb250cm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJbXNtX2hpZmlfY3RybChjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBDaGFubmVscyIsIHNsaW1fMF9yeF9jaHMsCisJCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzJfUlggQ2hhbm5lbHMiLCBzbGltXzJfcnhfY2hzLAorCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1RYIENoYW5uZWxzIiwgc2xpbV8wX3R4X2NocywKKwkJCW1zbV9zbGltX3R4X2NoX2dldCwgbXNtX3NsaW1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMV9UWCBDaGFubmVscyIsIHNsaW1fMV90eF9jaHMsCisJCQltc21fc2xpbV90eF9jaF9nZXQsIG1zbV9zbGltX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzVfUlggQ2hhbm5lbHMiLCBzbGltXzVfcnhfY2hzLAorCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIENoYW5uZWxzIiwgc2xpbV82X3J4X2NocywKKwkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlZJX0ZFRURfVFggQ2hhbm5lbHMiLCB2aV9mZWVkX3R4X2NocywKKwkJCW1zbV92aV9mZWVkX3R4X2NoX2dldCwgbXNtX3ZpX2ZlZWRfdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19SWCBDaGFubmVscyIsIHVzYl9yeF9jaHMsCisJCQl1c2JfYXVkaW9fcnhfY2hfZ2V0LCB1c2JfYXVkaW9fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19UWCBDaGFubmVscyIsIHVzYl90eF9jaHMsCisJCQl1c2JfYXVkaW9fdHhfY2hfZ2V0LCB1c2JfYXVkaW9fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkhETUlfUlggQ2hhbm5lbHMiLCBleHRfZGlzcF9yeF9jaHMsCisJCQlleHRfZGlzcF9yeF9jaF9nZXQsIGV4dF9kaXNwX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggQ2hhbm5lbHMiLCBleHRfZGlzcF9yeF9jaHMsCisJCQlleHRfZGlzcF9yeF9jaF9nZXQsIGV4dF9kaXNwX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUk9YWV9SWCBDaGFubmVscyIsIHByb3h5X3J4X2NocywKKwkJCXByb3h5X3J4X2NoX2dldCwgcHJveHlfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBGb3JtYXQiLCBzbGltXzBfcnhfZm9ybWF0LAorCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzVfUlggRm9ybWF0Iiwgc2xpbV81X3J4X2Zvcm1hdCwKKwkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIEZvcm1hdCIsIHNsaW1fNl9yeF9mb3JtYXQsCisJCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBGb3JtYXQiLCBzbGltXzBfdHhfZm9ybWF0LAorCQkJc2xpbV90eF9iaXRfZm9ybWF0X2dldCwgc2xpbV90eF9iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggRm9ybWF0IiwgdXNiX3J4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb19yeF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggRm9ybWF0IiwgdXNiX3R4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb190eF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJIRE1JX1JYIEJpdCBGb3JtYXQiLCBleHRfZGlzcF9yeF9mb3JtYXQsCisJCQlleHRfZGlzcF9yeF9mb3JtYXRfZ2V0LCBleHRfZGlzcF9yeF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkRpc3BsYXkgUG9ydCBSWCBCaXQgRm9ybWF0IiwgZXh0X2Rpc3BfcnhfZm9ybWF0LAorCQkJZXh0X2Rpc3BfcnhfZm9ybWF0X2dldCwgZXh0X2Rpc3BfcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfUlggU2FtcGxlUmF0ZSIsIHNsaW1fMF9yeF9zYW1wbGVfcmF0ZSwKKwkJCXNsaW1fcnhfc2FtcGxlX3JhdGVfZ2V0LCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzJfUlggU2FtcGxlUmF0ZSIsIHNsaW1fMl9yeF9zYW1wbGVfcmF0ZSwKKwkJCXNsaW1fcnhfc2FtcGxlX3JhdGVfZ2V0LCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfVFggU2FtcGxlUmF0ZSIsIHNsaW1fMF90eF9zYW1wbGVfcmF0ZSwKKwkJCXNsaW1fdHhfc2FtcGxlX3JhdGVfZ2V0LCBzbGltX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzVfUlggU2FtcGxlUmF0ZSIsIHNsaW1fNV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXNsaW1fcnhfc2FtcGxlX3JhdGVfZ2V0LCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzZfUlggU2FtcGxlUmF0ZSIsIHNsaW1fNl9yeF9zYW1wbGVfcmF0ZSwKKwkJCXNsaW1fcnhfc2FtcGxlX3JhdGVfZ2V0LCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJCVCBTYW1wbGVSYXRlIiwgYnRfc2FtcGxlX3JhdGUsCisJCQltc21fYnRfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbXNtX2J0X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggU2FtcGxlUmF0ZSIsIHVzYl9yeF9zYW1wbGVfcmF0ZSwKKwkJCXVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19UWCBTYW1wbGVSYXRlIiwgdXNiX3R4X3NhbXBsZV9yYXRlLAorCQkJdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSERNSV9SWCBTYW1wbGVSYXRlIiwgZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGUsCisJCQlleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIFNhbXBsZVJhdGUiLCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZSwKKwkJCWV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCisJCQl0ZG1fcnhfZm9ybWF0X2dldCwKKwkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAorCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKKwkJCXRkbV90eF9jaF9nZXQsCisJCQl0ZG1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKKwkJCXRkbV9yeF9mb3JtYXRfZ2V0LAorCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCisJCQl0ZG1fdHhfZm9ybWF0X2dldCwKKwkJCXRkbV90eF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCisJCQl0ZG1fcnhfY2hfZ2V0LAorCQkJdGRtX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAorCQkJdGRtX3R4X2NoX2dldCwKKwkJCXRkbV90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAorCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCisJCQl0ZG1fdHhfZm9ybWF0X2dldCwKKwkJCXRkbV90eF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCisJCQl0ZG1fdHhfY2hfZ2V0LAorCQkJdGRtX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCisJCQl0ZG1fcnhfZm9ybWF0X2dldCwKKwkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKKwkJCXRkbV90eF9mb3JtYXRfZ2V0LAorCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCisJCQl0ZG1fcnhfY2hfZ2V0LAorCQkJdGRtX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKKwkJCXRkbV90eF9jaF9nZXQsCisJCQl0ZG1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgcHJpbV9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgc2VjX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgdGVydF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHF1YXRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJTV9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBwcmltX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBzZWNfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCB0ZXJ0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgcXVhdF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX01JMlNfUlggU2FtcGxlUmF0ZSIsIHByaW1fbWkyc19yeF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfUlggU2FtcGxlUmF0ZSIsIHNlY19taTJzX3J4X3NhbXBsZV9yYXRlLAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX01JMlNfUlggU2FtcGxlUmF0ZSIsIHRlcnRfbWkyc19yeF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBxdWF0X21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19UWCBTYW1wbGVSYXRlIiwgcHJpbV9taTJzX3R4X3NhbXBsZV9yYXRlLAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBTYW1wbGVSYXRlIiwgc2VjX21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19UWCBTYW1wbGVSYXRlIiwgdGVydF9taTJzX3R4X3NhbXBsZV9yYXRlLAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggU2FtcGxlUmF0ZSIsIHF1YXRfbWkyc190eF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIENoYW5uZWxzIiwgcHJpbV9taTJzX3J4X2NocywKKwkJCW1zbV9taTJzX3J4X2NoX2dldCwgbXNtX21pMnNfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19UWCBDaGFubmVscyIsIHByaW1fbWkyc190eF9jaHMsCisJCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfTUkyU19SWCBDaGFubmVscyIsIHNlY19taTJzX3J4X2NocywKKwkJCW1zbV9taTJzX3J4X2NoX2dldCwgbXNtX21pMnNfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1RYIENoYW5uZWxzIiwgc2VjX21pMnNfdHhfY2hzLAorCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1JYIENoYW5uZWxzIiwgdGVydF9taTJzX3J4X2NocywKKwkJCW1zbV9taTJzX3J4X2NoX2dldCwgbXNtX21pMnNfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19UWCBDaGFubmVscyIsIHRlcnRfbWkyc190eF9jaHMsCisJCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfUlggQ2hhbm5lbHMiLCBxdWF0X21pMnNfcnhfY2hzLAorCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1RYIENoYW5uZWxzIiwgcXVhdF9taTJzX3R4X2NocywKKwkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkhpRmkgRnVuY3Rpb24iLCBoaWZpX2Z1bmN0aW9uLCBtc21faGlmaV9nZXQsCisJCQltc21faGlmaV9wdXQpLAorfTsKKworc3RhdGljIGludCBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJaW50IGVuYWJsZSwgYm9vbCBkYXBtKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXNoYV9jb2RlYyIpKQorCQlyZXQgPSB0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSwgZGFwbSk7CisJZWxzZSBpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlYy0+ZGV2KSwgInRhdmlsX2NvZGVjIikpCisJCXJldCA9IHRhdmlsX2NkY19tY2xrX2VuYWJsZShjb2RlYywgZW5hYmxlKTsKKwllbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgIGludCBlbmFibGUsIGJvb2wgZGFwbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGFzaGFfY29kZWMiKSkKKwkJcmV0ID0gdGFzaGFfY2RjX21jbGtfdHhfZW5hYmxlKGNvZGVjLCBlbmFibGUsIGRhcG0pOworCWVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdW5rbm93biBjb2RlYyB0byBlbmFibGUgZXh0IGNsa1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fbWNsa190eF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDEsIHRydWUpOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2Nsayhjb2RlYywgMCwgdHJ1ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9tY2xrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2Nsayhjb2RlYywgMSwgdHJ1ZSk7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKGNvZGVjLCAwLCB0cnVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hpZmlfY3RybF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sIG1zbV9oaWZpX2NvbnRyb2wpOworCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmhwaF9lbjBfZ3Bpb19wKSB7CisJCXByX2VycigiJXM6IGhwaF9lbjBfZ3BpbyBpcyBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtc21faGlmaV9jb250cm9sICE9IE1TTV9ISUZJX09OKSB7CisJCXByX2RlYnVnKCIlczogSGlGaSBtaXhlciBjb250cm9sIGlzIG5vdCBzZXRcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHBkYXRhLT5ocGhfZW4wX2dwaW9fcCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUocGRhdGEtPmhwaF9lbjBfZ3Bpb19wKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc21fZGFwbV93aWRnZXRzW10gPSB7CisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNQ0xLIiwgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICBtc21fbWNsa19ldmVudCwKKwkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNQ0xLIFRYIiwgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltc21fbWNsa190eF9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8xIGFtcCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMyBhbXAiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzIgYW1wIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF80IGFtcCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoImhpZmkgYW1wIiwgbXNtX2hpZmlfY3RybF9ldmVudCksCisJU05EX1NPQ19EQVBNX01JQygiSGFuZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFOQ1JpZ2h0IEhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU5DTGVmdCBIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM1IiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzYiLCBOVUxMKSwKKworCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNSIsIE5VTEwpLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgcGFyYW1faXNfbWFzayhpbnQgcCkKK3sKKwlyZXR1cm4gKHAgPj0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0spICYmCisJCQkocCA8PSBTTkRSVl9QQ01fSFdfUEFSQU1fTEFTVF9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25kX21hc2sgKnBhcmFtX3RvX21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLAorCQkJCQkgICAgIGludCBuKQoreworCXJldHVybiAmKHAtPm1hc2tzW24gLSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10pOworfQorCitzdGF0aWMgdm9pZCBwYXJhbV9zZXRfbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsIGludCBuLCB1bnNpZ25lZCBpbnQgYml0KQoreworCWlmIChiaXQgPj0gU05EUlZfTUFTS19NQVgpCisJCXJldHVybjsKKwlpZiAocGFyYW1faXNfbWFzayhuKSkgeworCQlzdHJ1Y3Qgc25kX21hc2sgKm0gPSBwYXJhbV90b19tYXNrKHAsIG4pOworCisJCW0tPmJpdHNbMF0gPSAwOworCQltLT5iaXRzWzFdID0gMDsKKwkJbS0+Yml0c1tiaXQgPj4gNV0gfD0gKDEgPDwgKGJpdCAmIDMxKSk7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoaW50MzJfdCBiZV9pZCkKK3sKKwlpbnQgY2hfaWQgPSAwOworCisJc3dpdGNoIChiZV9pZCkgeworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzA7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzE7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzI7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzM7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzQ7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWDoKKwkJY2hfaWQgPSBTTElNX1JYXzY7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWDoKKwkJY2hfaWQgPSBTTElNX1RYXzA7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWDoKKwkJY2hfaWQgPSBTTElNX1RYXzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNoX2lkID0gU0xJTV9SWF8wOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2hfaWQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2dldF9pZHhfZnJvbV9iZWlkKGludDMyX3QgYmVfaWQpCit7CisJaW50IGlkeDsKKworCXN3aXRjaCAoYmVfaWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYOgorCQlpZHggPSBIRE1JX1JYX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYOgorCQlpZHggPSBEUF9SWF9JRFg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEluY29ycmVjdCBleHRfZGlzcCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKKwkJaWR4ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlpbnQgcmMgPSAwOworCWludCBpZHg7CisJdm9pZCAqY29uZmlnID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBmb3JtYXQgPSAlZCwgcmF0ZSA9ICVkXG4iLAorCQkgIF9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc19yYXRlKHBhcmFtcykpOworCisJc3dpdGNoIChkYWlfbGluay0+aWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWDoKKwkJaWR4ID0gbXNtX3NsaW1fZ2V0X2NoX2Zyb21fYmVpZChkYWlfbGluay0+aWQpOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3J4X2NmZ1tpZHhdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6CisJCWlkeCA9IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXNsaW1fdHhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbaWR4XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlzbGltX3R4X2NmZ1sxXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbMV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gbXNtX3ZpX2ZlZWRfdHhfY2g7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbNV0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWDoKKwkJY29kZWMgPSBydGQtPmNvZGVjOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzE2S0haOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDE7CisKKwkJY29uZmlnID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQlBRkVfU0xJTUJVU19TTEFWRV9QT1JUX0NPTkZJRyk7CisJCWlmIChjb25maWcpIHsKKwkJCXJjID0gYWZlX3NldF9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcsCisJCQkJCSAgICBjb25maWcsIFNMSU1CVVNfNV9UWCk7CisJCQlpZiAocmMpCisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBzbGltYnVzIHNsYXZlIHBvcnQgY29uZmlnICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tTTElNX1RYXzhdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlzbGltX3R4X2NmZ1tTTElNX1RYXzhdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWDoKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHVzYl9yeF9jZmcuc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gdXNiX3J4X2NmZy5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHVzYl90eF9jZmcuY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfSERNSV9SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlg6CisJCWlkeCA9IG1zbV9leHRfZGlzcF9nZXRfaWR4X2Zyb21fYmVpZChkYWlfbGluay0+aWQpOworCQlpZiAoSVNfRVJSX1ZBTFVFKGlkeCkpIHsKKwkJCXByX2VycigiJXM6IEluY29ycmVjdCBleHQgZGlzcCBpZHggJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGlkeCk7CisJCQlyYyA9IGlkeDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBwcm94eV9yeF9jZmcuY2hhbm5lbHM7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5jaGFubmVsczsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzA6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCQl0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJICAgICAgIHRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1BSSU1fQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1BSSU1fQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV90eF9jZmdbUFJJTV9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV90eF9jZmdbUFJJTV9BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbU0VDX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tTRUNfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV90eF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc19yeF9jZmdbU0VDX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3J4X2NmZ1tTRUNfTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc190eF9jZmdbU0VDX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1RFUlRfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfcnhfY2ZnW1RFUlRfTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbVEVSVF9NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc190eF9jZmdbVEVSVF9NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1FVQVRfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfcnhfY2ZnW1FVQVRfTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tRVUFUX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3R4X2NmZ1tRVUFUX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIG1zbV9zd2FwX2duZF9taWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgdmFsdWUgPSAwOworCisJaWYgKHBkYXRhLT51c19ldXJvX2dwaW9fcCkgeworCQl2YWx1ZSA9IG1zbV9jZGNfcGluY3RybF9nZXRfc3RhdGUocGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKKwkJaWYgKHZhbHVlKQorCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKKwkJCQkJCQlwZGF0YS0+dXNfZXVyb19ncGlvX3ApOworCQllbHNlCisJCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZSgKKwkJCQkJCQlwZGF0YS0+dXNfZXVyb19ncGlvX3ApOworCX0gZWxzZSBpZiAocGRhdGEtPnVzX2V1cm9fZ3BpbyA+PSAwKSB7CisJCXZhbHVlID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8sICF2YWx1ZSk7CisJfQorCXByX2RlYnVnKCIlczogc3dhcCBzZWxlY3Qgc3dpdGNoICVkIHRvICVkXG4iLCBfX2Z1bmNfXywgdmFsdWUsICF2YWx1ZSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2FmZV9zZXRfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICpjb25maWdfZGF0YSA9IE5VTEw7CisKKwlpZiAoIW1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWMgZ2V0IGFmZSBjb25maWcgbm90IGluaXQnZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHLCBjb25maWdfZGF0YSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBzZXQgY29kZWMgcmVnaXN0ZXJzIGNvbmZpZyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCUFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUcpOworCWlmIChjb25maWdfZGF0YSkgeworCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHLCBjb25maWdfZGF0YSwKKwkJCQkgICAgMCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNkYyByZWdpc3RlciBwYWdlIGNvbmZpZ1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJfQorCisJY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOworCWlmIChjb25maWdfZGF0YSkgeworCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcsIGNvbmZpZ19kYXRhLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIHNldCBzbGltYnVzIHNsYXZlIGNvbmZpZyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2FmZV9jbGVhcl9jb25maWcodm9pZCkKK3sKKwlhZmVfY2xlYXJfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7CisJYWZlX2NsZWFyX2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOworfQorCitzdGF0aWMgaW50IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBhZHNwX3JlYWR5ID0gMDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsKKwkJbXNlY3NfdG9famlmZmllcyhBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMpOworCisJZG8geworCQlpZiAocTZjb3JlX2lzX2Fkc3BfcmVhZHkoKSkgeworCQkJcHJfZGVidWcoIiVzOiBBRFNQIEF1ZGlvIGlzIHJlYWR5XG4iLCBfX2Z1bmNfXyk7CisJCQlhZHNwX3JlYWR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIEFEU1Agd2lsbCBiZSBjb21pbmcgdXAgYWZ0ZXIgc3Vic3lzdGVtIHJlc3RhcnQgYW5kCisJCSAqIGl0IG1pZ2h0IG5vdCBiZSBmdWxseSB1cCB3aGVuIHRoZSBjb250cm9sIHJlYWNoZXMKKwkJICogaGVyZS4gU28sIHdhaXQgZm9yIDUwbXNlYyBiZWZvcmUgY2hlY2tpbmcgQURTUCBzdGF0ZQorCQkgKi8KKwkJbXNsZWVwKDUwKTsKKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCWlmICghYWRzcF9yZWFkeSkgeworCQlwcl9lcnIoIiVzOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgQURTUCBBdWRpb1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycl9mYWlsOworCX0KKworCXJldCA9IG1zbV9hZmVfc2V0X2NvbmZpZyhjb2RlYyk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBBRkUgY29uZmlnLiBlcnIgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiAwOworCitlcnJfZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbTg5OThfbm90aWZpZXJfc2VydmljZV9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJCSB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqcHRyKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IE5VTEw7CisJY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCXByX2RlYnVnKCIlczogU2VydmljZSBvcGNvZGUgMHglbHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjoKKwkJLyoKKwkJICogVXNlIGZsYWcgdG8gaWdub3JlIGluaXRpYWwgYm9vdCBub3RpZmljYXRpb25zCisJCSAqIE9uIGluaXRpYWwgYm9vdCBtc21fYWRzcF9wb3dlcl91cF9jb25maWcgaXMKKwkJICogY2FsbGVkIG9uIGluaXQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2xlYXIKKwkJICogYW5kIHNldCB0aGUgY29uZmlnIGFnYWluIG9uIGluaXRpYWwgYm9vdC4KKwkJICovCisJCWlmIChpc19pbml0aWFsX2Jvb3QpCisJCQlicmVhazsKKwkJbXNtX2FmZV9jbGVhcl9jb25maWcoKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQOgorCQlpZiAoaXNfaW5pdGlhbF9ib290KSB7CisJCQlpc19pbml0aWFsX2Jvb3QgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3BkZXYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BkZXYpOworCQlydGQgPSBzbmRfc29jX2dldF9wY21fcnVudGltZShjYXJkLCBiZV9kbF9uYW1lKTsKKwkJaWYgKCFydGQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogc25kX3NvY19nZXRfcGNtX3J1bnRpbWUgZm9yICVzIGZhaWxlZCFcbiIsCisJCQkJX19mdW5jX18sIGJlX2RsX25hbWUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQljb2RlYyA9IHJ0ZC0+Y29kZWM7CisKKwkJcmV0ID0gbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnKGNvZGVjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGZhaWxlZCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorZG9uZToKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNlcnZpY2VfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gbXNtODk5OF9ub3RpZmllcl9zZXJ2aWNlX2NiLAorCS5wcmlvcml0eSA9IC1JTlRfTUFYLAorfTsKKworc3RhdGljIGludCBtc21fYXVkcnhfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWludCByZXQgPSAwOworCXZvaWQgKmNvbmZpZ19kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICphdXhfY29tcDsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisKKwkvKiBDb2RlYyBTTElNQlVTIGNvbmZpZ3VyYXRpb24KKwkgKiBSWDEsIFJYMiwgUlgzLCBSWDQsIFJYNSwgUlg2LCBSWDcsIFJYOCwgUlg5LCBSWDEwLCBSWDExLCBSWDEyLCBSWDEzCisJICogVFgxLCBUWDIsIFRYMywgVFg0LCBUWDUsIFRYNiwgVFg3LCBUWDgsIFRYOSwgVFgxMCwgVFgxMSwgVFgxMiwgVFgxMworCSAqIFRYMTQsIFRYMTUsIFRYMTYKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcnhfY2hbVEFTSEFfUlhfTUFYXSA9IHsxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsCisJCQkJCSAgICAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2fTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbVEFTSEFfVFhfTUFYXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAorCQkJCQkgICAgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwKKwkJCQkJICAgIDE0MCwgMTQxLCAxNDIsIDE0M307CisKKwlwcl9pbmZvKCIlczogZGV2X25hbWUlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGNwdV9kYWktPmRldikpOworCisJcnRkLT5wbWRvd25fdGltZSA9IDA7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3NuZF9jb250cm9scywKKwkJCQkJIEFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGFkZF9jb2RlY19jb250cm9scyBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgbXNtX2RhcG1fd2lkZ2V0cywKKwkJCQlBUlJBWV9TSVpFKG1zbV9kYXBtX3dpZGdldHMpKTsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjX2RhaS0+ZGV2KSwgInRhc2hhX2NvZGVjIikpCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdjZF9hdWRpb19wYXRoc190YXNoYSwKKwkJCQkJQVJSQVlfU0laRSh3Y2RfYXVkaW9fcGF0aHNfdGFzaGEpKTsKKwllbHNlCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdjZF9hdWRpb19wYXRocywKKwkJCQkJQVJSQVlfU0laRSh3Y2RfYXVkaW9fcGF0aHMpKTsKKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkNSaWdodCBIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DTGVmdCBIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMwIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMzIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljNSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM2Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURJTlBVVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFEX0NQRV9JTlBVVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFEX0NQRV9PVVQxIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURfQ1BFX09VVDIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkVBUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgRUFSIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUEsxIE9VVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMiBPVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhQSEwiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhQSFIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjQgVkkiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlZJSU5QVVQiKTsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjX2RhaS0+ZGV2KSwgInRhc2hhX2NvZGVjIikpIHsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMyIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQ0Iik7CisJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSEwiKTsKKwkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgSFBIUiIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBMSU5FT1VUMSIpOworCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBMSU5FT1VUMiIpOworCX0KKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCisJCQkJICAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgeworCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXZpbF9nZXRfYWZlX2NvbmZpZzsKKwl9IGVsc2UgeworCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXNoYV9nZXRfYWZlX2NvbmZpZzsKKwkJbXNtX2NvZGVjX2ZuLm1iaGNfaHNfZGV0ZWN0X2V4aXQgPSB0YXNoYV9tYmhjX2hzX2RldGVjdF9leGl0OworCX0KKworCXJldCA9IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhjb2RlYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9hZmVfY2ZnOworCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQkJICAgICBBRkVfQUFOQ19WRVJTSU9OKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0FBTkNfVkVSU0lPTiwgY29uZmlnX2RhdGEsIDApOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGFhbmMgdmVyc2lvbiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2FmZV9jZmc7CisJCX0KKwl9CisKKwlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKSB7CisJCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQkJQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUcpOworCQlpZiAoY29uZmlnX2RhdGEpIHsKKwkJCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHLAorCQkJCQkJIGNvbmZpZ19kYXRhLCAwKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNsaXAgcmVnaXN0ZXJzICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGVycl9hZmVfY2ZnOworCQkJfQorCQl9CisJCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCUFGRV9DTElQX0JBTktfU0VMKTsKKwkJaWYgKGNvbmZpZ19kYXRhKSB7CisJCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0xJUF9CQU5LX1NFTCwgY29uZmlnX2RhdGEsIDApOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGJhbmsgc2VsZWN0aW9uICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGVycl9hZmVfY2ZnOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBTZW5kIHNwZWFrZXIgY29uZmlndXJhdGlvbiBvbmx5IGZvciBXU0E4ODEwLgorCSAqIERlZmFsdXQgY29uZmlndXJhdGlvbiBpcyBmb3IgV1NBODgxNS4KKwkgKi8KKwlwcl9kZWJ1ZygiJXM6IE51bWJlciBvZiBhdXggZGV2aWNlczogJWRcbiIsCisJCV9fZnVuY19fLCBydGQtPmNhcmQtPm51bV9hdXhfZGV2cyk7CisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgeworCQlpZiAocnRkLT5jYXJkLT5udW1fYXV4X2RldnMgJiYKKwkJICAgICFsaXN0X2VtcHR5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QpKSB7CisJCQlhdXhfY29tcCA9IGxpc3RfZmlyc3RfZW50cnkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCwKKwkJCQkJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50LCBsaXN0X2F1eCk7CisJCQlpZiAoIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8CisJCQkgICAgIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzIpKSB7CisJCQkJdGF2aWxfc2V0X3Nwa3JfbW9kZShydGQtPmNvZGVjLCBTUEtSX01PREVfMSk7CisJCQkJdGF2aWxfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQocnRkLT5jb2RlYywKKwkJCQkJCQlSWF9HQUlOX09GRlNFVF9NMVA1X0RCKTsKKwkJCX0KKwkJfQorCQljYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwkJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNhcmQtPm1vZHVsZSwgImNvZGVjcyIsCisJCQkJCQkgY2FyZC0+cHJvY19yb290KTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcHJfZGVidWcoIiVzOiBDYW5ub3QgY3JlYXRlIGNvZGVjcyBtb2R1bGUgZW50cnlcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCXBkYXRhLT5jb2RlY19yb290ID0gTlVMTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlwZGF0YS0+Y29kZWNfcm9vdCA9IGVudHJ5OworCQl0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShwZGF0YS0+Y29kZWNfcm9vdCwgY29kZWMpOworCX0gZWxzZSB7CisJCWlmIChydGQtPmNhcmQtPm51bV9hdXhfZGV2cyAmJgorCQkgICAgIWxpc3RfZW1wdHkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCkpIHsKKwkJCWF1eF9jb21wID0gbGlzdF9maXJzdF9lbnRyeSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0LAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQsIGxpc3RfYXV4KTsKKwkJCWlmICghc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMSkgfHwKKwkJCSAgICAhc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMikpIHsKKwkJCQl0YXNoYV9zZXRfc3Brcl9tb2RlKHJ0ZC0+Y29kZWMsIFNQS1JfTU9ERV8xKTsKKwkJCQl0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldChydGQtPmNvZGVjLAorCQkJCQkJCVJYX0dBSU5fT0ZGU0VUX00xUDVfREIpOworCQkJfQorCQl9CisJCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCQllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY2FyZC0+bW9kdWxlLCAiY29kZWNzIiwKKwkJCQkJCSBjYXJkLT5wcm9jX3Jvb3QpOworCQlpZiAoIWVudHJ5KSB7CisJCQlwcl9kZWJ1ZygiJXM6IENhbm5vdCBjcmVhdGUgY29kZWNzIG1vZHVsZSBlbnRyeVxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gZXJyX3NuZF9tb2R1bGU7CisJCX0KKwkJcGRhdGEtPmNvZGVjX3Jvb3QgPSBlbnRyeTsKKwkJdGFzaGFfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsIGNvZGVjKTsKKwl9Citkb25lOgorCWNvZGVjX3JlZ19kb25lID0gdHJ1ZTsKKwlyZXR1cm4gMDsKKworZXJyX3NuZF9tb2R1bGU6CitlcnJfYWZlX2NmZzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV93Y25faW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXVuc2lnbmVkIGludCByeF9jaFtXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYXSA9IHsxNTcsIDE1OH07CisJdW5zaWduZWQgaW50IHR4X2NoW1dDTl9DRENfU0xJTV9UWF9DSF9NQVhdICA9IHsxNTksIDE2MCwgMTYxfTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCisJcmV0dXJuIHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjb2RlY19kYWksIEFSUkFZX1NJWkUodHhfY2gpLAorCQkJCQkgICB0eF9jaCwgQVJSQVlfU0laRShyeF9jaCksIHJ4X2NoKTsKK30KKworc3RhdGljIHZvaWQgKmRlZl90YXNoYV9tYmhjX2NhbCh2b2lkKQoreworCXZvaWQgKnRhc2hhX3djZF9jYWw7CisJc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fY2ZnOworCXUxNiAqYnRuX2hpZ2g7CisKKwl0YXNoYV93Y2RfY2FsID0ga3phbGxvYyhXQ0RfTUJIQ19DQUxfU0laRShXQ0RfTUJIQ19ERUZfQlVUVE9OUywKKwkJCQlXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyksIEdGUF9LRVJORUwpOworCWlmICghdGFzaGFfd2NkX2NhbCkKKwkJcmV0dXJuIE5VTEw7CisKKyNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKHRhc2hhX3djZF9jYWwpLT5YKSA9IChZKSkKKwlTKHZfaHNfbWF4LCAxNjAwKTsKKyN1bmRlZiBTCisjZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIodGFzaGFfd2NkX2NhbCktPlgpID0gKFkpKQorCVMobnVtX2J0biwgV0NEX01CSENfREVGX0JVVFRPTlMpOworI3VuZGVmIFMKKworCWJ0bl9jZmcgPSBXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIodGFzaGFfd2NkX2NhbCk7CisJYnRuX2hpZ2ggPSAoKHZvaWQgKikmYnRuX2NmZy0+X3ZfYnRuX2xvdykgKworCQkoc2l6ZW9mKGJ0bl9jZmctPl92X2J0bl9sb3dbMF0pICogYnRuX2NmZy0+bnVtX2J0bik7CisKKwlidG5faGlnaFswXSA9IDc1OworCWJ0bl9oaWdoWzFdID0gMTUwOworCWJ0bl9oaWdoWzJdID0gMjM3OworCWJ0bl9oaWdoWzNdID0gNTAwOworCWJ0bl9oaWdoWzRdID0gNTAwOworCWJ0bl9oaWdoWzVdID0gNTAwOworCWJ0bl9oaWdoWzZdID0gNTAwOworCWJ0bl9oaWdoWzddID0gNTAwOworCisJcmV0dXJuIHRhc2hhX3djZF9jYWw7Cit9CisKK3N0YXRpYyB2b2lkICpkZWZfdGF2aWxfbWJoY19jYWwodm9pZCkKK3sKKwl2b2lkICp0YXZpbF93Y2RfY2FsOworCXN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2NmZzsKKwl1MTYgKmJ0bl9oaWdoOworCisJdGF2aWxfd2NkX2NhbCA9IGt6YWxsb2MoV0NEX01CSENfQ0FMX1NJWkUoV0NEX01CSENfREVGX0JVVFRPTlMsCisJCQkJV0NEOVhYWF9NQkhDX0RFRl9STE9BRFMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhdmlsX3djZF9jYWwpCisJCXJldHVybiBOVUxMOworCisjZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUih0YXZpbF93Y2RfY2FsKS0+WCkgPSAoWSkpCisJUyh2X2hzX21heCwgMTYwMCk7CisjdW5kZWYgUworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhdmlsX3djZF9jYWwpLT5YKSA9IChZKSkKKwlTKG51bV9idG4sIFdDRF9NQkhDX0RFRl9CVVRUT05TKTsKKyN1bmRlZiBTCisKKwlidG5fY2ZnID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhdmlsX3djZF9jYWwpOworCWJ0bl9oaWdoID0gKCh2b2lkICopJmJ0bl9jZmctPl92X2J0bl9sb3cpICsKKwkJKHNpemVvZihidG5fY2ZnLT5fdl9idG5fbG93WzBdKSAqIGJ0bl9jZmctPm51bV9idG4pOworCisJYnRuX2hpZ2hbMF0gPSA3NTsKKwlidG5faGlnaFsxXSA9IDE1MDsKKwlidG5faGlnaFsyXSA9IDIzNzsKKwlidG5faGlnaFszXSA9IDUwMDsKKwlidG5faGlnaFs0XSA9IDUwMDsKKwlidG5faGlnaFs1XSA9IDUwMDsKKwlidG5faGlnaFs2XSA9IDUwMDsKKwlidG5faGlnaFs3XSA9IDUwMDsKKworCXJldHVybiB0YXZpbF93Y2RfY2FsOworfQorCitzdGF0aWMgaW50IG1zbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKworCWludCByZXQgPSAwOworCXUzMiByeF9jaFtTTElNX01BWF9SWF9QT1JUU10sIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCXUzMiByeF9jaF9jb3VudDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwkJaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzVfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSAgc2xpbV9yeF9jZmdbNV0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s1XS5jaGFubmVsczsKKwkJfSBlbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCkgeworCQkJcHJfZGVidWcoIiVzOiByeF8yX2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgc2xpbV9yeF9jZmdbMl0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1syXS5jaGFubmVsczsKKwkJfSBlbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCkgeworCQkJcHJfZGVidWcoIiVzOiByeF82X2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIHNsaW1fcnhfY2ZnWzZdLmNoYW5uZWxzKTsKKwkJCXJ4X2NoX2NvdW50ID0gc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHM7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzBfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSAgc2xpbV9yeF9jZmdbMF0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1swXS5jaGFubmVsczsKKwkJfQorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgMCwKKwkJCQkJCSAgcnhfY2hfY291bnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwl9IGVsc2UgeworCisJCXByX2RlYnVnKCIlczogJXNfdHhfZGFpX2lkXyVkX2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIHVzZXJfc2V0X3R4X2NoKTsKKwkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKKwkJCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2NoX21hcDsKKwkJfQorCQkvKiBGb3IgPGNvZGVjPl90eDEgY2FzZSAqLworCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgpCisJCQl1c2VyX3NldF90eF9jaCA9IHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzOworCQkvKiBGb3IgPGNvZGVjPl90eDMgY2FzZSAqLworCQllbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCkKKwkJCXVzZXJfc2V0X3R4X2NoID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7CisJCWVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYKQorCQkJdXNlcl9zZXRfdHhfY2ggPSBtc21fdmlfZmVlZF90eF9jaDsKKwkJZWxzZQorCQkJdXNlcl9zZXRfdHhfY2ggPSB0eF9jaF9jbnQ7CisKKwkJcHJfZGVidWcoIiVzOiBtc21fc2xpbV8wX3R4X2NoKCVkKSB1c2VyX3NldF90eF9jaCglZCkgdHhfY2hfY250KCVkKSwgQkUgaWQgKCVkKVxuIiwKKwkJCSBfX2Z1bmNfXywgIHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzLCB1c2VyX3NldF90eF9jaCwKKwkJCSB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCisJCQkJCQkgIHVzZXJfc2V0X3R4X2NoLCB0eF9jaCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisKK2Vycl9jaF9tYXA6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fc25kX2NwZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCisJaW50IHJldCA9IDA7CisJdTMyIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLAorCQkJX19mdW5jX18sIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfc3RyZWFtX3R5cGU7CisJfQorCisJcHJfZGVidWcoIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAorCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAorCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY2hfbWFwOworCX0KKworCXVzZXJfc2V0X3R4X2NoID0gdHhfY2hfY250OworCisJcHJfZGVidWcoIiVzOiB0eF9jaF9jbnQoJWQpIEJFIGlkICVkXG4iLAorCQkgX19mdW5jX18sIHR4X2NoX2NudCwgZGFpX2xpbmstPmlkKTsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkgIHVzZXJfc2V0X3R4X2NoLCB0eF9jaCwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKK2Vycl9jaF9tYXA6CitlcnJfc3RyZWFtX3R5cGU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fc2xpbWJ1c18yX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJdW5zaWduZWQgaW50IHJ4X2NoW1NMSU1fTUFYX1JYX1BPUlRTXSwgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOworCXVuc2lnbmVkIGludCByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOworCXVuc2lnbmVkIGludCBudW1fdHhfY2ggPSAwOworCXVuc2lnbmVkIGludCBudW1fcnhfY2ggPSAwOworCWludCByZXQgPSAwOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJbnVtX3J4X2NoID0gIHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCQlwcl9kZWJ1ZygiJXM6ICVzIHJ4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV9yeF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2NoX21hcDsKKwkJfQorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgMCwKKwkJCQludW1fcnhfY2gsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwl9IGVsc2UgeworCQludW1fdHhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgIHR4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2NoX21hcDsKKwkJfQorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKKwkJCQludW1fdHhfY2gsIHR4X2NoLCAwLCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwl9CisKK2Vycl9jaF9tYXA6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fd2NuX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7CisJdTMyIHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdLCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhydGQtPmRldiwgIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAorCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAorCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGdldCBCVEZNIGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGV2X2RiZyhydGQtPmRldiwgIiVzOiB0eF9jaF9jbnQoJWQpIEJFIGlkICVkXG4iLAorCQlfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCisJCQkJCSAgdHhfY2hfY250LCB0eF9jaCwgcnhfY2hfY250LCByeF9jaCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihydGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXV4X3BjbV9zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCBpbmRleCA9IGNwdV9kYWktPmlkIC0gMTsKKwlyZXR1cm4gcmV0ID0gMDsKKworCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsCisJCSIlczogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkLCBkYWkgbmFtZSAlcywgZGFpIElEICVkXG4iLAorCQlfX2Z1bmNfXywgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkJY3B1X2RhaS0+bmFtZSwgY3B1X2RhaS0+aWQpOworCisJaWYgKGluZGV4IDwgUFJJTV9BVVhfUENNIHx8IGluZGV4ID4gUVVBVF9BVVhfUENNKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkiJXM6IENQVSBEQUkgaWQgKCVkKSBvdXQgb2YgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7CisJaWYgKCsrYXV4cGNtX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAxKSB7CisJCWlmIChtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQkJaW93cml0ZTMyKDEsCisJCQkJbWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkcik7CisJCQltdXRleF91bmxvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQl9IGVsc2UgeworCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCQkiJXMgbHBhaWZfdGVydF9tdXhzZWxfdmlydF9hZGRyIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQtLTsKKworCW11dGV4X3VubG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX2F1eF9wY21fc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBydGQtPmNwdV9kYWktPmlkIC0gMTsKKworCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsCisJCSIlczogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkLCBkYWkgbmFtZSAlcywgZGFpIElEICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkJcnRkLT5jcHVfZGFpLT5uYW1lLCBydGQtPmNwdV9kYWktPmlkKTsKKworCWlmIChpbmRleCA8IFBSSU1fQVVYX1BDTSB8fCBpbmRleCA+IFFVQVRfQVVYX1BDTSkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBDUFUgREFJIGlkICglZCkgb3V0IG9mIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIHJ0ZC0+Y3B1X2RhaS0+aWQpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7CisJaWYgKC0tYXV4cGNtX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAwKSB7CisJCWlmIChtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQkJaW93cml0ZTMyKDAsCisJCQkJbWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkcik7CisJCQltdXRleF91bmxvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQl9IGVsc2UgeworCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCQkiJXMgbHBhaWZfdGVydF9tdXhzZWxfdmlydF9hZGRyIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQkJYXV4cGNtX2ludGZfY29uZltpbmRleF0ucmVmX2NudCsrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dldF9wb3J0X2lkKGludCBiZV9pZCkKK3sKKwlpbnQgYWZlX3BvcnRfaWQ7CisKKwlzd2l0Y2ggKGJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlg6CisJCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgQkUgaWQ6ICVkXG4iLCBfX2Z1bmNfXywgYmVfaWQpOworCQlhZmVfcG9ydF9pZCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGFmZV9wb3J0X2lkOworfQorCitzdGF0aWMgdTMyIGdldF9taTJzX2JpdHNfcGVyX3NhbXBsZSh1MzIgYml0X2Zvcm1hdCkKK3sKKwl1MzIgYml0X3Blcl9zYW1wbGU7CisKKwlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRfcGVyX3NhbXBsZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCWJpdF9wZXJfc2FtcGxlID0gMTY7CisJCWJyZWFrOworCX0KKworCXJldHVybiBiaXRfcGVyX3NhbXBsZTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX21pMnNfY2xrX3ZhbChpbnQgZGFpX2lkLCBpbnQgc3RyZWFtKQoreworCXUzMiBiaXRfcGVyX3NhbXBsZTsKKworCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQliaXRfcGVyX3NhbXBsZSA9CisJCSAgICBnZXRfbWkyc19iaXRzX3Blcl9zYW1wbGUobWkyc19yeF9jZmdbZGFpX2lkXS5iaXRfZm9ybWF0KTsKKwkJbWkyc19jbGtbZGFpX2lkXS5jbGtfZnJlcV9pbl9oeiA9CisJCSAgICBtaTJzX3J4X2NmZ1tkYWlfaWRdLnNhbXBsZV9yYXRlICogMiAqIGJpdF9wZXJfc2FtcGxlOworCX0gZWxzZSB7CisJCWJpdF9wZXJfc2FtcGxlID0KKwkJICAgIGdldF9taTJzX2JpdHNfcGVyX3NhbXBsZShtaTJzX3R4X2NmZ1tkYWlfaWRdLmJpdF9mb3JtYXQpOworCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0KKwkJICAgIG1pMnNfdHhfY2ZnW2RhaV9pZF0uc2FtcGxlX3JhdGUgKiAyICogYml0X3Blcl9zYW1wbGU7CisJfQorCisJaWYgKCFtaTJzX2ludGZfY29uZltkYWlfaWRdLm1zbV9pc19taTJzX21hc3RlcikKKwkJbWkyc19jbGtbZGFpX2lkXS5jbGtfZnJlcV9pbl9oeiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfc2V0X3NjbGsoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IHBvcnRfaWQgPSAwOworCWludCBpbmRleCA9IGNwdV9kYWktPmlkOworCisJcG9ydF9pZCA9IG1zbV9nZXRfcG9ydF9pZChydGQtPmRhaV9saW5rLT5pZCk7CisJaWYgKElTX0VSUl9WQUxVRShwb3J0X2lkKSkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IEludmFsaWQgcG9ydF9pZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSBwb3J0X2lkOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGVuYWJsZSkgeworCQl1cGRhdGVfbWkyc19jbGtfdmFsKGluZGV4LCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsICIlczogY2xvY2sgcmF0ZSAldWxcbiIsIF9fZnVuY19fLAorCQkJbWkyc19jbGtbaW5kZXhdLmNsa19mcmVxX2luX2h6KTsKKwl9CisKKwltaTJzX2Nsa1tpbmRleF0uZW5hYmxlID0gZW5hYmxlOworCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIocG9ydF9pZCwKKwkJCQkgICAgICZtaTJzX2Nsa1tpbmRleF0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQgZm9yIHBvcnQgMHgleCAsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgaW5kZXggPSBjcHVfZGFpLT5pZDsKKwl1bnNpZ25lZCBpbnQgZm10ID0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKKworCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsCisJCSIlczogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkLCBkYWkgbmFtZSAlcywgZGFpIElEICVkXG4iLAorCQlfX2Z1bmNfXywgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkJY3B1X2RhaS0+bmFtZSwgY3B1X2RhaS0+aWQpOworCisJaWYgKGluZGV4IDwgUFJJTV9NSTJTIHx8IGluZGV4ID4gUVVBVF9NSTJTKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkiJXM6IENQVSBEQUkgaWQgKCVkKSBvdXQgb2YgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOworCQlnb3RvIGRvbmU7CisJfQorCS8qCisJICogTXV4dGV4IHByb3RlY3Rpb24gaW4gY2FzZSB0aGUgc2FtZSBNSTJTCisJICogaW50ZXJmYWNlIHVzaW5nIGZvciBib3RoIFRYIGFuZCBSWCAgc28KKwkgKiB0aGF0IHRoZSBzYW1lIGNsb2NrIHdvbid0IGJlIGVuYWJsZSB0d2ljZS4KKwkgKi8KKwltdXRleF9sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7CisJaWYgKCsrbWkyc19pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQgPT0gMSkgeworCQlyZXQgPSBtc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIHRydWUpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkJIiVzOiBhZmUgbHBhc3MgY2xvY2sgZmFpbGVkIHRvIGVuYWJsZSBNSTJTIGNsb2NrLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCWlmIChtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQkJaW93cml0ZTMyKDAsCisJCQkJbWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkcik7CisJCQltdXRleF91bmxvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQl9IGVsc2UgeworCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCQkiJXMgbHBhaWZfbXV4c2VsX3ZpcnRfYWRkciBpcyBOVUxMIGZvciBkYWkgJWRcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGNsa19vZmY7CisJCX0KKwkJLyogQ2hlY2sgaWYgbXNtIG5lZWRzIHRvIHByb3ZpZGUgdGhlIGNsb2NrIHRvIHRoZSBpbnRlcmZhY2UgKi8KKwkJaWYgKCFtaTJzX2ludGZfY29uZltpbmRleF0ubXNtX2lzX21pMnNfbWFzdGVyKQorCQkJZm10ID0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTTsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBmbXQpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJCXByX2VycigiJXM6IHNldCBmbXQgY3B1IGRhaSBmYWlsZWQgZm9yIE1JMlMgKCVkKSwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCwgcmV0KTsKKwkJCWdvdG8gY2xrX29mZjsKKwkJfQorCX0KK2Nsa19vZmY6CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQltc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKK2NsZWFuX3VwOgorCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJbWkyc19pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQtLTsKKwltdXRleF91bmxvY2soJm1pMnNfaW50Zl9jb25mW2luZGV4XS5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQ7CisKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgeworCQlwcl9lcnIoIiVzOmludmFsaWQgTUkyUyBEQUkoJWQpXG4iLCBfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworCWlmICgtLW1pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKKwkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOmNsb2NrIGRpc2FibGUgZmFpbGVkIGZvciBNSTJTICglZCk7IHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7CisJCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCsrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9taTJzX2JlX29wcyA9IHsKKwkuc3RhcnR1cCA9IG1zbV9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbV9taTJzX3NuZF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2F1eF9wY21fYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAsCisJLnNodXRkb3duID0gbXNtX2F1eF9wY21fc25kX3NodXRkb3duLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayh1MTYgcG9ydF9pZCwgaW50IHNsb3Rfd2lkdGgsCisJCQkJCSAgICBpbnQgc2xvdHMpCit7CisJdW5zaWduZWQgaW50IHNsb3RfbWFzayA9IDA7CisJaW50IGksIGo7CisJdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKKworCWZvciAoaSA9IFRETV8wOyBpIDwgVERNX1BPUlRfTUFYOyBpKyspIHsKKwkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGorKykgeworCQkJaWYgKHNsb3Rfb2Zmc2V0W2pdICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCisJCQkJc2xvdF9tYXNrIHw9CisJCQkJKDEgPDwgKChzbG90X29mZnNldFtqXSAqIDgpIC8gc2xvdF93aWR0aCkpOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHNsb3RfbWFzazsKK30KKworc3RhdGljIGludCBtc21fdGRtX3NuZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCByZXQgPSAwOworCWludCBjaGFubmVscywgc2xvdF93aWR0aCwgc2xvdHM7CisJdW5zaWduZWQgaW50IHNsb3RfbWFzazsKKwl1bnNpZ25lZCBpbnQgKnNsb3Rfb2Zmc2V0OworCWludCBvZmZzZXRfY2hhbm5lbHMgPSAwOworCWludCBpOworCisJcHJfZGVidWcoIiVzOiBkYWkgaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOworCisJY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCWNhc2UgODoKKwkJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJLyoKKwkJICogdXAgdG8gOCBjaGFubmVscyBIVyBjb25maWcgc2hvdWxkCisJCSAqIHVzZSAzMiBiaXQgc2xvdCB3aWR0aCBmb3IgbWF4IHN1cHBvcnQgb2YKKwkJICogc3RyZWFtIGJpdCB3aWR0aC4gKHNsb3Rfd2lkdGggPiBiaXRfd2lkdGgpCisJCSAqLworCQkJc2xvdF93aWR0aCA9IDMyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGZvcm1hdCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2xvdHMgPSA4OworCQlzbG90X21hc2sgPSB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayhjcHVfZGFpLT5pZCwKKwkJCQkJCSAgICBzbG90X3dpZHRoLAorCQkJCQkJICAgIHNsb3RzKTsKKwkJaWYgKCFzbG90X21hc2spIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgc2xvdF9tYXNrIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHNsb3RfbWFzayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGNoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCisJc3dpdGNoIChjcHVfZGFpLT5pZCkgeworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbVERNXzBdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBkYWkgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGkrKykgeworCQlpZiAoc2xvdF9vZmZzZXRbaV0gIT0gQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRCkKKwkJCW9mZnNldF9jaGFubmVscysrOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAob2Zmc2V0X2NoYW5uZWxzID09IDApIHsKKwkJcHJfZXJyKCIlczogc2xvdCBvZmZzZXQgbm90IHN1cHBvcnRlZCwgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIG9mZnNldF9jaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVscyA+IG9mZnNldF9jaGFubmVscykgeworCQlwcl9lcnIoIiVzOiBjaGFubmVscyAlZCBleGNlZWQgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWxzLCBvZmZzZXRfY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMCwgc2xvdF9tYXNrLAorCQkJCQkgICAgICAgc2xvdHMsIHNsb3Rfd2lkdGgpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgTlVMTCwKKwkJCQkJCSAgY2hhbm5lbHMsIHNsb3Rfb2Zmc2V0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2hhbm5lbCBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIHNsb3RfbWFzaywgMCwKKwkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIGNoYW5uZWxzLAorCQkJCQkJICBzbG90X29mZnNldCwgMCwgTlVMTCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fY3BlX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbXNtX3NuZF9jcGVfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fc2xpbWJ1c18yX2JlX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbXNtX3NsaW1idXNfMl9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV93Y25fb3BzID0geworCS5od19wYXJhbXMgPSBtc21fd2NuX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3RkbV9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV90ZG1fc25kX2h3X3BhcmFtcworfTsKKworLyogRGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9jb21tb25fZGFpX2xpbmtzW10gPSB7CisJLyogRnJvbnRFbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWExKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMQorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWEyKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsCisJfSwKKwl7CisJCS5uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNIFZvSVAiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9JUCIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9JUCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS12b2lwLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lQLAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjIiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAorCX0sCisJLyogSG9zdGxlc3MgUENNIHB1cnBvc2UgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTSBBRkUtUENNIFJYIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBSWCIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQxIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tYWZlIiwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNU00gQUZFLVBDTSBUWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgVFgiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMSksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczEiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE0IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19IV19QQVJBTVMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiQVVYUENNX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18zIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzNfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKExvd0xhdGVuY3kpLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTUiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMSIsCisJCS5keW5hbWljID0gMSwKKwkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19QUkVQQVJFLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU00xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMSwKKwl9LAorCS8qIE11bHRpcGxlIFR1bm5lbCBpbnN0YW5jZXMgKi8KKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczIpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MzKSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMyIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMX05PSVJRKSwKKwkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsCisJfSwKKwkvKiBIRE1JIEhvc3RsZXNzICovCisJeworCQkubmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKKwkJLnN0cmVhbV9uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAorCQkuY3B1X2RhaV9uYW1lID0gIkhETUlfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJeworCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCisJfSwKKwkvKiBMU00gRkUgKi8KKwl7CisJCS5uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTMsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTQsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTYsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTgsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTkpLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE5IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczQpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M0IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczUpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczYpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M2IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczcpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M3IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczgpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczkpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M5IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsCisJfSwKKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfOCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTOF9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTOF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGFzaGFfZmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkzIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3ZpZmVlZGJhY2siLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogVWx0cmFzb3VuZCBSWCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfcngyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLm9wcyA9ICZtc21fc2xpbWJ1c18yX2JlX29wcywKKwl9LAorCS8qIFVsdHJhc291bmQgVFggREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDIiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkub3BzID0gJm1zbV9zbGltYnVzXzJfYmVfb3BzLAorCX0sCisJLyogQ1BFIExTTSBkaXJlY3QgZGFpLWxpbmsgKi8KKwl7CisJCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDUEUgTGlzdGVuIEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktc2xpbSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9tYWQxIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkub3BzID0gJm1zbV9jcGVfb3BzLAorCX0sCisJeworCQkubmFtZSA9ICJTTElNQlVTXzYgSG9zdGxlc3MgUGxheWJhY2siLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU182IEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTNl9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJLyogQ1BFIExTTSBFQyBQUCBkaXJlY3QgZGFpLWxpbmsgKi8KKwl7CisJCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSBFQ1BQIiwKKwkJLnN0cmVhbV9uYW1lID0gIkNQRSBMaXN0ZW4gQXVkaW8gU2VydmljZSBFQ1BQIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJDUEVfTFNNX05PSE9TVCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtLjMiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX2NwZSIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9mZV9kYWlfbGlua3NbXSA9IHsKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdmlmZWVkYmFjayIsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBVbHRyYXNvdW5kIFJYIERBSSBMaW5rICovCisJeworCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDIiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkub3BzID0gJm1zbV9zbGltYnVzXzJfYmVfb3BzLAorCX0sCisJLyogVWx0cmFzb3VuZCBUWCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MiIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5vcHMgPSAmbXNtX3NsaW1idXNfMl9iZV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX2JlX2RhaV9saW5rc1tdID0geworCS8qIEJhY2tlbmQgQUZFIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIFJlY29yZCBVcGxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIFVwbGluayBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBSZWNvcmQgRG93bmxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIERvd25saW5rIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIDIgQkFDSyBFTkQgREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVk9JQ0UyX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIEZhcmVuZCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yODY3MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9QUklfVERNX1RYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTAgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfVERNX1JYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4OTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1RYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1JYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEzIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3Rhc2hhX2JlX2RhaV9saW5rc1tdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MyIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4MyIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogTUFEIEJFICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWFkMSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9yeDQiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9iZV9kYWlfbGlua3NbXSA9IHsKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgzIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMl9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MiIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MyIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogTUFEIEJFICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfbWFkMSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDQiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCisJCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKKwkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KKwkJICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU183X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czcgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJidGZtc2xpbV9zbGF2ZSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19zbGltX3R4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzhfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzOCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjQwMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fZm1fc2xpbV90eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pbml0ID0gJm1zbV93Y25faW5pdCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV4dF9kaXNwX2JlX2RhaV9saW5rW10gPSB7CisJLyogSERNSSBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9IRE1JLAorCQkuc3RyZWFtX25hbWUgPSAiSERNSSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1oZG1pLjgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX2hkbWlfYXVkaW9fY29kZWNfcnhfZGFpIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIERJU1AgUE9SVCBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9ESVNQTEFZX1BPUlQsCisJCS5zdHJlYW1fbmFtZSA9ICJEaXNwbGF5IFBvcnQgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZHAuMjQ2MDgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX2RwX2F1ZGlvX2NvZGVjX3J4X2RhaSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9taTJzX2JlX2RhaV9saW5rc1tdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9QUklfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyUyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2F1eHBjbV9iZV9kYWlfbGlua3NbXSA9IHsKKwkvKiBQcmltYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FVWFBDTV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwkvKiBTZWNvbmRhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX0FVWFBDTV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCS8qIFRlcnRpYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwkvKiBRdWF0ZXJuYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGFzaGFfZGFpX2xpbmtzWworCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV90YXNoYV9mZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV9jb21tb25fYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fdGFzaGFfYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUoZXh0X2Rpc3BfYmVfZGFpX2xpbmspICsKKwkJCSBBUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtX2F1eHBjbV9iZV9kYWlfbGlua3MpXTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9kYWlfbGlua3NbCisJCQkgQVJSQVlfU0laRShtc21fY29tbW9uX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtX3RhdmlsX2ZlX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV90YXZpbF9iZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluaykgKworCQkJIEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyldOworCitzdGF0aWMgaW50IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCWludCByZXQgPSAwOworCXZvaWQgKm1iaGNfY2FsaWJyYXRpb247CisKKwlydGQgPSBzbmRfc29jX2dldF9wY21fcnVudGltZShjYXJkLCBiZV9kbF9uYW1lKTsKKwlpZiAoIXJ0ZCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSIlczogc25kX3NvY19nZXRfcGNtX3J1bnRpbWUgZm9yICVzIGZhaWxlZCFcbiIsCisJCQlfX2Z1bmNfXywgYmVfZGxfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3BjbV9ydW50aW1lOworCX0KKworCW1iaGNfY2FsaWJyYXRpb24gPSBkZWZfdGFzaGFfbWJoY19jYWwoKTsKKwlpZiAoIW1iaGNfY2FsaWJyYXRpb24pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbWJoY19jYWw7CisJfQorCXdjZF9tYmhjX2NmZy5jYWxpYnJhdGlvbiA9IG1iaGNfY2FsaWJyYXRpb247CisJcmV0ID0gdGFzaGFfbWJoY19oc19kZXRlY3QocnRkLT5jb2RlYywgJndjZF9tYmhjX2NmZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIiVzOiBtYmhjIGhzIGRldGVjdCBmYWlsZWQsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9oc19kZXRlY3Q7CisJfQorCXJldHVybiAwOworCitlcnJfaHNfZGV0ZWN0OgorCWtmcmVlKG1iaGNfY2FsaWJyYXRpb24pOworZXJyX21iaGNfY2FsOgorZXJyX3BjbV9ydW50aW1lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NuZF9jYXJkX3RhdmlsX2xhdGVfcHJvYmUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwljb25zdCBjaGFyICpiZV9kbF9uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJaW50IHJldCA9IDA7CisJdm9pZCAqbWJoY19jYWxpYnJhdGlvbjsKKworCXJ0ZCA9IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKGNhcmQsIGJlX2RsX25hbWUpOworCWlmICghcnRkKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIiVzOiBzbmRfc29jX2dldF9wY21fcnVudGltZSBmb3IgJXMgZmFpbGVkIVxuIiwKKwkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcGNtX3J1bnRpbWU7CisJfQorCisJbWJoY19jYWxpYnJhdGlvbiA9IGRlZl90YXZpbF9tYmhjX2NhbCgpOworCWlmICghbWJoY19jYWxpYnJhdGlvbikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tYmhjX2NhbDsKKwl9CisJd2NkX21iaGNfY2ZnLmNhbGlicmF0aW9uID0gbWJoY19jYWxpYnJhdGlvbjsKKwlyZXQgPSB0YXZpbF9tYmhjX2hzX2RldGVjdChydGQtPmNvZGVjLCAmd2NkX21iaGNfY2ZnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXM6IG1iaGMgaHMgZGV0ZWN0IGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2hzX2RldGVjdDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9oc19kZXRlY3Q6CisJa2ZyZWUobWJoY19jYWxpYnJhdGlvbik7CitlcnJfbWJoY19jYWw6CitlcnJfcGNtX3J1bnRpbWU6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGFzaGFfbXNtID0geworCS5uYW1lCQk9ICJtc204OTk4LXRhc2hhLXNuZC1jYXJkIiwKKwkubGF0ZV9wcm9iZQk9IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlLAorfTsKKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGF2aWxfbXNtID0geworCS5uYW1lCQk9ICJtc204OTk4LXRhdmlsLXNuZC1jYXJkIiwKKwkubGF0ZV9wcm9iZQk9IG1zbV9zbmRfY2FyZF90YXZpbF9sYXRlX3Byb2JlLAorfTsKKworc3RhdGljIGludCBtc21fcG9wdWxhdGVfZGFpX2xpbmtfY29tcG9uZW50X29mX25vZGUoCisJCQkJCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJaW50IGksIGluZGV4LCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjYXJkLT5kZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWlmICghY2RldikgeworCQlwcl9lcnIoIiVzOiBTb3VuZCBjYXJkIGRldmljZSBtZW1vcnkgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2xpbmtzOyBpKyspIHsKKwkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX29mX25vZGUgJiYgZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpCisJCQljb250aW51ZTsKKworCQkvKiBwb3B1bGF0ZSBwbGF0Zm9ybV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUgJiYKKwkJICAgICFkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlKSB7CisJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAorCQkJCQkJImFzb2MtcGxhdGZvcm0tbmFtZXMiLAorCQkJCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJcHJfZXJyKCIlczogTm8gbWF0Y2ggZm91bmQgZm9yIHBsYXRmb3JtIG5hbWU6ICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQkJcmV0ID0gaW5kZXg7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtcGxhdGZvcm0iLAorCQkJCQkgICAgICBpbmRleCk7CisJCQlpZiAoIW5wKSB7CisJCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBwbGF0Zm9ybSAlcywgaW5kZXggJWQgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSwKKwkJCQkJaW5kZXgpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlID0gbnA7CisJCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lID0gTlVMTDsKKwkJfQorCisJCS8qIHBvcHVsYXRlIGNwdV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSAmJiAhZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpIHsKKwkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCisJCQkJCQkgImFzb2MtY3B1LW5hbWVzIiwKKwkJCQkJCSBkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOworCQkJaWYgKGluZGV4ID49IDApIHsKKwkJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY3B1IiwKKwkJCQkJCWluZGV4KTsKKwkJCQlpZiAoIW5wKSB7CisJCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgY3B1IGRhaSAlcyBmYWlsZWRcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSk7CisJCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCQlkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSA9IG5wOworCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSA9IE5VTEw7CisJCQl9CisJCX0KKworCQkvKiBwb3B1bGF0ZSBjb2RlY19vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KKwkJaWYgKGRhaV9saW5rW2ldLmNvZGVjX25hbWUgJiYgIWRhaV9saW5rW2ldLmNvZGVjX29mX25vZGUpIHsKKwkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCisJCQkJCQkgImFzb2MtY29kZWMtbmFtZXMiLAorCQkJCQkJIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOworCQkJaWYgKGluZGV4IDwgMCkKKwkJCQljb250aW51ZTsKKwkJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLCAiYXNvYy1jb2RlYyIsCisJCQkJCSAgICAgIGluZGV4KTsKKwkJCWlmICghbnApIHsKKwkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNvZGVjICVzIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlID0gbnA7CisJCQlkYWlfbGlua1tpXS5jb2RlY19uYW1lID0gTlVMTDsKKwkJfQorCX0KKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ByZXBhcmVfdXNfZXVybyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGRhdGEtPnVzX2V1cm9fZ3BpbyA+PSAwKSB7CisJCWRldl9kYmcoY2FyZC0+ZGV2LCAiJXM6IHVzX2V1cm8gZ3BpbyByZXF1ZXN0ICVkIiwgX19mdW5jX18sCisJCQlwZGF0YS0+dXNfZXVyb19ncGlvKTsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT51c19ldXJvX2dwaW8sICJUQVNIQV9DT0RFQ19VU19FVVJPIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIHJlcXVlc3QgY29kZWMgVVMvRVVSTyBncGlvICVkIGVycm9yICVkXG4iLAorCQkJCV9fZnVuY19fLCBwZGF0YS0+dXNfZXVyb19ncGlvLCByZXQpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXVkcnhfc3R1Yl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKworCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtc21fc25kX2NvbnRyb2xzLAorCQkJCQkgQVJSQVlfU0laRShtc21fc25kX2NvbnRyb2xzKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGFkZF9jb2RlY19jb250cm9scyBmYWlsZWQsIGVyciVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtc21fZGFwbV93aWRnZXRzLAorCQkJCUFSUkFZX1NJWkUobXNtX2RhcG1fd2lkZ2V0cykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NuZF9zdHViX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCByeF9jaFtdID0gezE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwKKwkJCQkxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2fTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAorCQkJCTEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCisJCQkJMTQwLCAxNDEsIDE0MiwgMTQzfTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAorCQkJCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscywKKwkJCQkJCSAgcnhfY2gpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IFJYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkJICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywKKwkJCQkJCSAgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IFRYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3N0dWJfYmVfb3BzID0geworCS5od19wYXJhbXMgPSBtc21fc25kX3N0dWJfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2ZlX2RhaV9saW5rc1tdID0geworCisJLyogRnJvbnRFbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9ICJNU01TVFVCIE1lZGlhMSIsCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2JlX2RhaV9saW5rc1tdID0geworCisJLyogQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwkJLmluaXQgPSAmbXNtX2F1ZHJ4X3N0dWJfaW5pdCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9zdHViX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX3N0dWJfYmVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3N0dWJfZGFpX2xpbmtzWworCQkJIEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fc3R1Yl9iZV9kYWlfbGlua3MpXTsKKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfc3R1Yl9tc20gPSB7CisJLm5hbWUJCT0gIm1zbTg5OTgtc3R1Yi1zbmQtY2FyZCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc204OTk4X2Fzb2NfbWFjaGluZV9vZl9tYXRjaFtdICA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtODk5OC1hc29jLXNuZC10YXNoYSIsCisJICAuZGF0YSA9ICJ0YXNoYV9jb2RlYyJ9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc204OTk4LWFzb2Mtc25kLXRhdmlsIiwKKwkgIC5kYXRhID0gInRhdmlsX2NvZGVjIn0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5OTgtYXNvYy1zbmQtc3R1YiIsCisJICAuZGF0YSA9ICJzdHViX2NvZGVjIn0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCAqcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3Moc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlsaW5rOworCWludCBsZW5fMSwgbGVuXzIsIGxlbl8zOworCWludCB0b3RhbF9saW5rczsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtc204OTk4X2Fzb2NfbWFjaGluZV9vZl9tYXRjaCwgZGV2LT5vZl9ub2RlKTsKKwlpZiAoIW1hdGNoKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE5vIERUIG1hdGNoIGZvdW5kIGZvciBzb3VuZCBjYXJkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhc2hhX2NvZGVjIikpIHsKKwkJY2FyZCA9ICZzbmRfc29jX2NhcmRfdGFzaGFfbXNtOworCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpOworCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc21fdGFzaGFfZmVfZGFpX2xpbmtzKTsKKwkJbGVuXzMgPSBsZW5fMiArIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpOworCQl0b3RhbF9saW5rcyA9IGxlbl8zICsgQVJSQVlfU0laRShtc21fdGFzaGFfYmVfZGFpX2xpbmtzKTsKKwkJbWVtY3B5KG1zbV90YXNoYV9kYWlfbGlua3MsCisJCSAgICAgICBtc21fY29tbW9uX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcyArIGxlbl8xLAorCQkgICAgICAgbXNtX3Rhc2hhX2ZlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fdGFzaGFfZmVfZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgbGVuXzIsCisJCSAgICAgICBtc21fY29tbW9uX2JlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2JlX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcyArIGxlbl8zLAorCQkgICAgICAgbXNtX3Rhc2hhX2JlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fdGFzaGFfYmVfZGFpX2xpbmtzKSk7CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLHdjbi1idGZtIikpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCisJCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCisJCQkgICAgICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKKwkJfQorCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4IikpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXMoKTogRXh0ZXJuYWwgZGlzcGxheSBhdWRpbyBzdXBwb3J0IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJbWVtY3B5KG1zbV90YXNoYV9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCWV4dF9kaXNwX2JlX2RhaV9saW5rLAorCQkJc2l6ZW9mKGV4dF9kaXNwX2JlX2RhaV9saW5rKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAicWNvbSxtaTJzLWF1ZGlvLWludGYiKSkgeworCQkJbWVtY3B5KG1zbV90YXNoYV9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCSAgICAgICBtc21fbWkyc19iZV9kYWlfbGlua3MsCisJCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOworCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpOworCQl9CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLGF1eHBjbS1hdWRpby1pbnRmIikpIHsKKwkJCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCisJCQkgICAgICAgbXNtX2F1eHBjbV9iZV9kYWlfbGlua3MsCisJCQkgICAgICAgc2l6ZW9mKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlkYWlsaW5rID0gbXNtX3Rhc2hhX2RhaV9saW5rczsKKwl9ICBlbHNlIGlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAidGF2aWxfY29kZWMiKSkgeworCQljYXJkID0gJnNuZF9zb2NfY2FyZF90YXZpbF9tc207CisJCWxlbl8xID0gQVJSQVlfU0laRShtc21fY29tbW9uX2RhaV9saW5rcyk7CisJCWxlbl8yID0gbGVuXzEgKyBBUlJBWV9TSVpFKG1zbV90YXZpbF9mZV9kYWlfbGlua3MpOworCQlsZW5fMyA9IGxlbl8yICsgQVJSQVlfU0laRShtc21fY29tbW9uX2JlX2RhaV9saW5rcyk7CisJCXRvdGFsX2xpbmtzID0gbGVuXzMgKyBBUlJBWV9TSVpFKG1zbV90YXZpbF9iZV9kYWlfbGlua3MpOworCQltZW1jcHkobXNtX3RhdmlsX2RhaV9saW5rcywKKwkJICAgICAgIG1zbV9jb21tb25fZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV9jb21tb25fZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgbGVuXzEsCisJCSAgICAgICBtc21fdGF2aWxfZmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV90YXZpbF9mZV9kYWlfbGlua3MpKTsKKwkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyBsZW5fMiwKKwkJICAgICAgIG1zbV9jb21tb25fYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV9jb21tb25fYmVfZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgbGVuXzMsCisJCSAgICAgICBtc21fdGF2aWxfYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV90YXZpbF9iZV9kYWlfbGlua3MpKTsKKworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sd2NuLWJ0Zm0iKSkgeworCQkJZGV2X2RiZyhkZXYsICIlcygpOiBXQ04gQlRGTSBzdXBwb3J0IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCSAgICAgICBtc21fd2NuX2JlX2RhaV9saW5rcywKKwkJCSAgICAgICBzaXplb2YobXNtX3djbl9iZV9kYWlfbGlua3MpKTsKKwkJCXRvdGFsX2xpbmtzICs9IEFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpOworCQl9CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCisJCQkJCSAgInFjb20sZXh0LWRpc3AtYXVkaW8tcngiKSkgeworCQkJZGV2X2RiZyhkZXYsICIlcygpOiBleHQgZGlzcCBhdWRpbyBzdXBwb3J0IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCSAgICAgICBleHRfZGlzcF9iZV9kYWlfbGluaywKKwkJCSAgICAgICBzaXplb2YoZXh0X2Rpc3BfYmVfZGFpX2xpbmspKTsKKwkJCXRvdGFsX2xpbmtzICs9IEFSUkFZX1NJWkUoZXh0X2Rpc3BfYmVfZGFpX2xpbmspOworCQl9CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLG1pMnMtYXVkaW8taW50ZiIpKSB7CisJCQltZW1jcHkobXNtX3RhdmlsX2RhaV9saW5rcyArIHRvdGFsX2xpbmtzLAorCQkJICAgICAgIG1zbV9taTJzX2JlX2RhaV9saW5rcywKKwkJCSAgICAgICBzaXplb2YobXNtX21pMnNfYmVfZGFpX2xpbmtzKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcyk7CisJCX0KKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCisJCQkJCSAgInFjb20sYXV4cGNtLWF1ZGlvLWludGYiKSkgeworCQkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCW1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAorCQkJc2l6ZW9mKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlkYWlsaW5rID0gbXNtX3RhdmlsX2RhaV9saW5rczsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJzdHViX2NvZGVjIikpIHsKKwkJY2FyZCA9ICZzbmRfc29jX2NhcmRfc3R1Yl9tc207CisJCWxlbl8xID0gQVJSQVlfU0laRShtc21fc3R1Yl9mZV9kYWlfbGlua3MpOworCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc21fc3R1Yl9iZV9kYWlfbGlua3MpOworCisJCW1lbWNweShtc21fc3R1Yl9kYWlfbGlua3MsCisJCSAgICAgICBtc21fc3R1Yl9mZV9kYWlfbGlua3MsCisJCSAgICAgICBzaXplb2YobXNtX3N0dWJfZmVfZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc21fc3R1Yl9kYWlfbGlua3MgKyBsZW5fMSwKKwkJICAgICAgIG1zbV9zdHViX2JlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fc3R1Yl9iZV9kYWlfbGlua3MpKTsKKworCQlkYWlsaW5rID0gbXNtX3N0dWJfZGFpX2xpbmtzOworCQl0b3RhbF9saW5rcyA9IGxlbl8yOworCX0KKworCWlmIChjYXJkKSB7CisJCWNhcmQtPmRhaV9saW5rID0gZGFpbGluazsKKwkJY2FyZC0+bnVtX2xpbmtzID0gdG90YWxfbGlua3M7CisJfQorCisJcmV0dXJuIGNhcmQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3dzYTg4MXhfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwl1OCBzcGtsZWZ0X3BvcnRzW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MTAwLCAxMDEsIDEwMiwgMTA2fTsKKwl1OCBzcGtyaWdodF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMywgMTA0LCAxMDUsIDEwN307CisJdW5zaWduZWQgaW50IGNoX3JhdGVbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsyNDAwLCA2MDAsIDMwMCwgMTIwMH07CisJdW5zaWduZWQgaW50IGNoX21hc2tbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsweDEsIDB4RiwgMHgzLCAweDN9OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCWludCByZXQgPSAwOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzIGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JMZWZ0IikpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgbGVmdCBjaCBtYXAgdG8gY29kZWMgJXNcbiIsCisJCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKKwkJd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoY29kZWMsICZzcGtsZWZ0X3BvcnRzWzBdLAorCQkJCVdTQTg4MVhfTUFYX1NXUl9QT1JUUywgJmNoX21hc2tbMF0sCisJCQkJJmNoX3JhdGVbMF0pOworCQlpZiAoZGFwbS0+Y29tcG9uZW50KSB7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JMZWZ0IElOIik7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JMZWZ0IFNQS1IiKTsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChjb21wb25lbnQtPm5hbWVfcHJlZml4LCAiU3BrclJpZ2h0IikpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgcmlnaHQgY2ggbWFwIHRvIGNvZGVjICVzXG4iLAorCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrcmlnaHRfcG9ydHNbMF0sCisJCQkJV1NBODgxWF9NQVhfU1dSX1BPUlRTLCAmY2hfbWFza1swXSwKKwkJCQkmY2hfcmF0ZVswXSk7CisJCWlmIChkYXBtLT5jb21wb25lbnQpIHsKKwkJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3BrclJpZ2h0IElOIik7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JSaWdodCBTUEtSIik7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogd3JvbmcgY29kZWMgbmFtZSAlc1xuIiwgX19mdW5jX18sCisJCQljb2RlYy0+Y29tcG9uZW50Lm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9jb2RlYzsKKwl9CisJcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29tcG9uZW50LT5jYXJkKTsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmNvZGVjX3Jvb3QpCisJCXdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsCisJCQkJCQkgICAgICBjb2RlYyk7CisKK2Vycl9jb2RlYzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9pbml0X3dzYV9kZXYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqd3NhX29mX25vZGU7CisJdTMyIHdzYV9tYXhfZGV2czsKKwl1MzIgd3NhX2Rldl9jbnQ7CisJaW50IGk7CisJc3RydWN0IG1zbV93c2E4ODF4X2Rldl9pbmZvICp3c2E4ODF4X2Rldl9pbmZvOworCWNvbnN0IGNoYXIgKndzYV9hdXhkZXZfbmFtZV9wcmVmaXhbMV07CisJY2hhciAqZGV2X25hbWVfc3RyID0gTlVMTDsKKwlpbnQgZm91bmQgPSAwOworCWludCByZXQgPSAwOworCisJLyogR2V0IG1heGltdW0gV1NBIGRldmljZSBjb3VudCBmb3IgdGhpcyBwbGF0Zm9ybSAqLworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAgICJxY29tLHdzYS1tYXgtZGV2cyIsICZ3c2FfbWF4X2RldnMpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJICIlczogd3NhLW1heC1kZXZzIHByb3BlcnR5IG1pc3NpbmcgaW4gRFQgJXMsIHJldCA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLCByZXQpOworCQlnb3RvIGVycl9kdDsKKwl9CisJaWYgKHdzYV9tYXhfZGV2cyA9PSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIiVzOiBNYXggV1NBIGRldmljZXMgaXMgMCBmb3IgdGhpcyB0YXJnZXQ/XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZHQ7CisJfQorCisJLyogR2V0IGNvdW50IG9mIFdTQSBkZXZpY2UgcGhhbmRsZXMgZm9yIHRoaXMgcGxhdGZvcm0gKi8KKwl3c2FfZGV2X2NudCA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICJxY29tLHdzYS1kZXZzIiwgTlVMTCk7CisJaWYgKHdzYV9kZXZfY250ID09IC1FTk9FTlQpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIiVzOiBObyB3c2EgZGV2aWNlIGRlZmluZWQgaW4gRFQuXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZ290byBlcnJfZHQ7CisJfSBlbHNlIGlmICh3c2FfZGV2X2NudCA8PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlczogRXJyb3IgcmVhZGluZyB3c2EgZGV2aWNlIGZyb20gRFQuIHdzYV9kZXZfY250ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgd3NhX2Rldl9jbnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9kdDsKKwl9CisKKwkvKgorCSAqIEV4cGVjdCB0b3RhbCBwaGFuZGxlcyBjb3VudCB0byBiZSBOT1QgbGVzcyB0aGFuIG1heGltdW0gcG9zc2libGUKKwkgKiBXU0EgY291bnQuIEhvd2V2ZXIsIGlmIGl0IGlzIGxlc3MsIHRoZW4gYXNzaWduIHNhbWUgdmFsdWUgdG8KKwkgKiBtYXggY291bnQgYXMgd2VsbC4KKwkgKi8KKwlpZiAod3NhX2Rldl9jbnQgPCB3c2FfbWF4X2RldnMpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIiVzOiB3c2FfbWF4X2RldnMgPSAlZCBjYW5ub3QgZXhjZWVkIHdzYV9kZXZfY250ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgd3NhX21heF9kZXZzLCB3c2FfZGV2X2NudCk7CisJCXdzYV9tYXhfZGV2cyA9IHdzYV9kZXZfY250OworCX0KKworCS8qIE1ha2Ugc3VyZSBwcmVmaXggc3RyaW5nIHBhc3NlZCBmb3IgZWFjaCBXU0EgZGV2aWNlICovCisJcmV0ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sd3NhLWF1eC1kZXYtcHJlZml4Iik7CisJaWYgKHJldCAhPSB3c2FfZGV2X2NudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IGV4cGVjdGluZyAlZCB3c2EgcHJlZml4LiBEZWZpbmVkIG9ubHkgJWQgaW4gRFRcbiIsCisJCQlfX2Z1bmNfXywgd3NhX2Rldl9jbnQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2R0OworCX0KKworCS8qCisJICogQWxsb2MgbWVtIHRvIHN0b3JlIHBoYW5kbGUgYW5kIGluZGV4IGluZm8gb2YgV1NBIGRldmljZSwgaWYgYWxyZWFkeQorCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUKKwkgKi8KKwl3c2E4ODF4X2Rldl9pbmZvID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHdzYV9tYXhfZGV2cywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghd3NhODgxeF9kZXZfaW5mbykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW07CisJfQorCisJLyoKKwkgKiBzZWFyY2ggYW5kIGNoZWNrIHdoZXRoZXIgYWxsIFdTQSBkZXZpY2VzIGFyZSBhbHJlYWR5CisJICogcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZSBvciBub3QuIElmIGZvdW5kIGEgbm9kZSwgc3RvcmUKKwkgKiB0aGUgbm9kZSBhbmQgdGhlIGluZGV4IGluIGEgbG9jYWwgYXJyYXkgb2Ygc3RydWN0IGZvciBsYXRlcgorCSAqIHVzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd3NhX2Rldl9jbnQ7IGkrKykgeworCQl3c2Ffb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSAgICAicWNvbSx3c2EtZGV2cyIsIGkpOworCQlpZiAodW5saWtlbHkoIXdzYV9vZl9ub2RlKSkgeworCQkJLyogd2Ugc2hvdWxkIG5vdCBiZSBoZXJlICovCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIiVzOiB3c2EgZGV2IG5vZGUgaXMgbm90IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2Rldl9ub2RlOworCQl9CisJCWlmIChzb2NfZmluZF9jb21wb25lbnQod3NhX29mX25vZGUsIE5VTEwpKSB7CisJCQkvKiBXU0EgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgKi8KKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLm9mX25vZGUgPSB3c2Ffb2Zfbm9kZTsKKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLmluZGV4ID0gaTsKKwkJCWZvdW5kKys7CisJCQlpZiAoZm91bmQgPT0gd3NhX21heF9kZXZzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kIDwgd3NhX21heF9kZXZzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGZpbmQgJWQgY29tcG9uZW50cy4gRm91bmQgb25seSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIGZvdW5kKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSIlczogZm91bmQgJWQgd3NhODgxeCBkZXZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmVcbiIsCisJCV9fZnVuY19fLCBmb3VuZCk7CisKKwljYXJkLT5udW1fYXV4X2RldnMgPSB3c2FfbWF4X2RldnM7CisJY2FyZC0+bnVtX2NvbmZpZ3MgPSB3c2FfbWF4X2RldnM7CisKKwkvKiBBbGxvYyBhcnJheSBvZiBBVVggZGV2cyBzdHJ1Y3QgKi8KKwltc21fYXV4X2RldiA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjYXJkLT5udW1fYXV4X2RldnMsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2KSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc21fYXV4X2RldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hdXhkZXZfbWVtOworCX0KKworCS8qIEFsbG9jIGFycmF5IG9mIGNvZGVjIGNvbmYgc3RydWN0ICovCisJbXNtX2NvZGVjX2NvbmYgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgY2FyZC0+bnVtX2F1eF9kZXZzLAorCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbV9jb2RlY19jb25mKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NvZGVjX2NvbmY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9hdXhfZGV2czsgaSsrKSB7CisJCWRldl9uYW1lX3N0ciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBERVZfTkFNRV9TVFJfTEVOLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghZGV2X25hbWVfc3RyKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZGV2X3N0cjsKKwkJfQorCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICAgICJxY29tLHdzYS1hdXgtZGV2LXByZWZpeCIsCisJCQkJCQkgICAgd3NhODgxeF9kZXZfaW5mb1tpXS5pbmRleCwKKwkJCQkJCSAgICB3c2FfYXV4ZGV2X25hbWVfcHJlZml4KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIHJlYWQgd3NhIGF1eCBkZXYgcHJlZml4LCByZXQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9kdF9wcm9wOworCQl9CisKKwkJc25wcmludGYoZGV2X25hbWVfc3RyLCBzdHJsZW4oIndzYTg4MXguJWQiKSwgIndzYTg4MXguJWQiLCBpKTsKKwkJbXNtX2F1eF9kZXZbaV0ubmFtZSA9IGRldl9uYW1lX3N0cjsKKwkJbXNtX2F1eF9kZXZbaV0uY29kZWNfbmFtZSA9IE5VTEw7CisJCW1zbV9hdXhfZGV2W2ldLmNvZGVjX29mX25vZGUgPQorCQkJCQl3c2E4ODF4X2Rldl9pbmZvW2ldLm9mX25vZGU7CisJCW1zbV9hdXhfZGV2W2ldLmluaXQgPSBtc21fd3NhODgxeF9pbml0OworCQltc21fY29kZWNfY29uZltpXS5kZXZfbmFtZSA9IE5VTEw7CisJCW1zbV9jb2RlY19jb25mW2ldLm5hbWVfcHJlZml4ID0gd3NhX2F1eGRldl9uYW1lX3ByZWZpeFswXTsKKwkJbXNtX2NvZGVjX2NvbmZbaV0ub2Zfbm9kZSA9CisJCQkJd3NhODgxeF9kZXZfaW5mb1tpXS5vZl9ub2RlOworCX0KKwljYXJkLT5jb2RlY19jb25mID0gbXNtX2NvZGVjX2NvbmY7CisJY2FyZC0+YXV4X2RldiA9IG1zbV9hdXhfZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9kdF9wcm9wOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZGV2X25hbWVfc3RyKTsKK2Vycl9kZXZfc3RyOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbXNtX2NvZGVjX2NvbmYpOworZXJyX2NvZGVjX2NvbmY6CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBtc21fYXV4X2Rldik7CitlcnJfYXV4ZGV2X21lbToKK2Vycl9kZXZfbm9kZToKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdzYTg4MXhfZGV2X2luZm8pOworZXJyX21lbToKK2Vycl9kdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpMnNfYXV4cGNtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm11eHNlbDsKKwlpbnQgY291bnQ7CisJdTMyIG1pMnNfbWFzdGVyX3NsYXZlW01JMlNfTUFYXTsKKwlpbnQgcmV0OworCWNoYXIgKnN0cltQQ01fSTJTX1NFTF9NQVhdID0geworCQkibHBhaWZfcHJpX21vZGVfbXV4c2VsIiwKKwkJImxwYWlmX3NlY19tb2RlX211eHNlbCIsCisJCSJscGFpZl90ZXJ0X21vZGVfbXV4c2VsIiwKKwkJImxwYWlmX3F1YXRfbW9kZV9tdXhzZWwiCisJfTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1JMlNfTUFYOyBjb3VudCsrKSB7CisJCW11dGV4X2luaXQoJm1pMnNfaW50Zl9jb25mW2NvdW50XS5sb2NrKTsKKwkJbWkyc19pbnRmX2NvbmZbY291bnRdLnJlZl9jbnQgPSAwOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFVWF9QQ01fTUFYOyBjb3VudCsrKSB7CisJCW11dGV4X2luaXQoJmF1eHBjbV9pbnRmX2NvbmZbY291bnRdLmxvY2spOworCQlhdXhwY21faW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspIHsKKwkJbXV0ZXhfaW5pdCgmbWkyc19hdXhwY21fY29uZltjb3VudF0ubG9jayk7CisJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgPSBOVUxMOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFBDTV9JMlNfU0VMX01BWDsgY291bnQrKykgeworCQltdXhzZWwgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkJICAgICAgc3RyW2NvdW50XSk7CisJCWlmIChtdXhzZWwpIHsKKwkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIKKwkJCQk9IGlvcmVtYXAobXV4c2VsLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtdXhzZWwpKTsKKwkJfQorCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNtLW1pMnMtbWFzdGVyIiwKKwkJCW1pMnNfbWFzdGVyX3NsYXZlLCBNSTJTX01BWCk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogbm8gcWNvbSxtc20tbWkycy1tYXN0ZXIgaW4gRFQgbm9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgeworCQkJbWkyc19pbnRmX2NvbmZbY291bnRdLm1zbV9pc19taTJzX21hc3RlciA9CisJCQkJbWkyc19tYXN0ZXJfc2xhdmVbY291bnRdOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpMnNfYXV4cGNtX2RlaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFBDTV9JMlNfU0VMX01BWDsgY291bnQrKykKKwkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0KKwkJCU5VTEwpCisJCQlpb3VubWFwKAorCQkJbWkyc19hdXhwY21fY29uZltjb3VudF0ucGNtX2kyc19zZWxfdnRfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfbWFjaGluZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJY29uc3QgY2hhciAqbWJoY19hdWRpb19qYWNrX3R5cGUgPSBOVUxMOworCWNoYXIgKm1jbGtfZnJlcV9wcm9wX25hbWU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJaW50IHJldDsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gc3VwcGxpZWQgZnJvbSBkZXZpY2UgdHJlZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FyZCA9IHBvcHVsYXRlX3NuZF9jYXJkX2RhaWxpbmtzKCZwZGV2LT5kZXYpOworCWlmICghY2FyZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2FyZCB1bmluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShjYXJkLCBwZGF0YSk7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAicWNvbSxtb2RlbCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGFyc2UgY2FyZCBuYW1lIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJxY29tLGF1ZGlvLXJvdXRpbmciKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNlIGF1ZGlvIHJvdXRpbmcgZmFpbGVkLCBlcnI6JWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwltYXRjaCA9IG9mX21hdGNoX25vZGUobXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCisJCQlwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKCFtYXRjaCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbm8gbWF0Y2hlZCBjb2RlYyBpcyBmb3VuZC5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAidGFzaGFfY29kZWMiKSkKKwkJbWNsa19mcmVxX3Byb3BfbmFtZSA9ICJxY29tLHRhc2hhLW1jbGstY2xrLWZyZXEiOworCWVsc2UKKwkJbWNsa19mcmVxX3Byb3BfbmFtZSA9ICJxY29tLHRhdmlsLW1jbGstY2xrLWZyZXEiOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQltY2xrX2ZyZXFfcHJvcF9uYW1lLCAmcGRhdGEtPm1jbGtfZnJlcSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCwgZXJyJWRcbiIsCisJCQltY2xrX2ZyZXFfcHJvcF9uYW1lLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHBkYXRhLT5tY2xrX2ZyZXEgIT0gQ09ERUNfRVhUX0NMS19SQVRFKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuc3VwcG9ydGVkIG1jbGsgZnJlcSAldVxuIiwKKwkJCXBkYXRhLT5tY2xrX2ZyZXEpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBtc21fcG9wdWxhdGVfZGFpX2xpbmtfY29tcG9uZW50X29mX25vZGUoY2FyZCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gbXNtX2luaXRfd3NhX2RldihwZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQlpZiAoY29kZWNfcmVnX2RvbmUpCisJCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9IGVsc2UgaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycjsKKwl9CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlNvdW5kIGNhcmQgJXMgcmVnaXN0ZXJlZFxuIiwgY2FyZC0+bmFtZSk7CisJc3BkZXYgPSBwZGV2OworCisJcmV0ID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocGRldi0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBhZGQgY2hpbGQgbm9kZXMsIHJldD0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCX0gZWxzZSB7CisJCXBkYXRhLT5ocGhfZW4xX2dwaW9fcCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkJInFjb20saHBoLWVuMS1ncGlvIiwgMCk7CisJCWlmICghcGRhdGEtPmhwaF9lbjFfZ3Bpb19wKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm9wZXJ0eSAlcyBub3QgZGV0ZWN0ZWQgaW4gbm9kZSAlcyIsCisJCQkJInFjb20saHBoLWVuMS1ncGlvIiwKKwkJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJfQorCisJCXBkYXRhLT5ocGhfZW4wX2dwaW9fcCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkJInFjb20saHBoLWVuMC1ncGlvIiwgMCk7CisJCWlmICghcGRhdGEtPmhwaF9lbjBfZ3Bpb19wKSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm9wZXJ0eSAlcyBub3QgZGV0ZWN0ZWQgaW4gbm9kZSAlcyIsCisJCQkJInFjb20saHBoLWVuMC1ncGlvIiwKKwkJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJfQorCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSIsICZtYmhjX2F1ZGlvX2phY2tfdHlwZSk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKKwkJCSJxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIiwKKwkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJKYWNrIHR5cGUgcHJvcGVydGllcyBzZXQgdG8gZGVmYXVsdCIpOworCX0gZWxzZSB7CisJCWlmICghc3RyY21wKG1iaGNfYXVkaW9famFja190eXBlLCAiNC1wb2xlLWphY2siKSkKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlRoaXMgaGFyZHdhcmUgaGFzIDQgcG9sZSBqYWNrIik7CisJCWVsc2UgaWYgKCFzdHJjbXAobWJoY19hdWRpb19qYWNrX3R5cGUsICI1LXBvbGUtamFjayIpKQorCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVGhpcyBoYXJkd2FyZSBoYXMgNSBwb2xlIGphY2siKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjYtcG9sZS1qYWNrIikpCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJUaGlzIGhhcmR3YXJlIGhhcyA2IHBvbGUgamFjayIpOworCQllbHNlCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJVbmtub3duIHZhbHVlLCBzZXQgdG8gZGVmYXVsdCIpOworCX0KKwkvKgorCSAqIFBhcnNlIFVTLUV1cm8gZ3BpbyBpbmZvIGZyb20gRFQuIFJlcG9ydCBubyBlcnJvciBpZiB1cy1ldXJvCisJICogZW50cnkgaXMgbm90IGZvdW5kIGluIERUIGZpbGUgYXMgc29tZSB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0CisJICogVVMtRXVybyBkZXRlY3Rpb24KKwkgKi8KKwlwZGF0YS0+dXNfZXVyb19ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSkKKwkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSAmJiAoIXBkYXRhLT51c19ldXJvX2dwaW9fcCkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAorCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGRldGVjdGVkIiwKKwkJCSJxY29tLHVzLWV1cm8tZ3Bpb3MiKTsKKwkJd2NkX21iaGNfY2ZnLnN3YXBfZ25kX21pYyA9IG1zbV9zd2FwX2duZF9taWM7CisJfQorCisJcmV0ID0gbXNtX3ByZXBhcmVfdXNfZXVybyhjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtc21fcHJlcGFyZV91c19ldXJvIGZhaWxlZCAoJWQpXG4iLAorCQkJcmV0KTsKKworCWkyc19hdXhwY21faW5pdChwZGV2KTsKKworCWlzX2luaXRpYWxfYm9vdCA9IHRydWU7CisJcmV0ID0gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoIm1zbTg5OTgiLCBBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTiwKKwkJCQkgICAgICAmc2VydmljZV9uYik7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIDA7CitlcnI6CisJaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPiAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGZyZWUgdXNfZXVybyBncGlvICVkXG4iLAorCQkJX19mdW5jX18sIHBkYXRhLT51c19ldXJvX2dwaW8pOworCQlncGlvX2ZyZWUocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXBkYXRhLT51c19ldXJvX2dwaW8gPSAwOworCX0KKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHBkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hc29jX21hY2hpbmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlncGlvX2ZyZWUocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJaTJzX2F1eHBjbV9kZWluaXQoKTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc204OTk4X2Fzb2NfbWFjaGluZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtc21fYXNvY19tYWNoaW5lX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fYXNvY19tYWNoaW5lX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1zbTg5OThfYXNvY19tYWNoaW5lX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgbXNtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc21mYWxjb24tY29tbW9uLmMgYi9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTI4OTgyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc21mYWxjb24tY29tbW9uLmMKQEAgLTAsMCArMSwyODA2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAibXNtLWF1ZGlvLXBpbmN0cmwuaCIKKyNpbmNsdWRlICJtc21mYWxjb24tY29tbW9uLmgiCisjaW5jbHVkZSAibXNtZmFsY29uLWludGVybmFsLmgiCisjaW5jbHVkZSAibXNtZmFsY29uLWV4dGVybmFsLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL21zbTh4MTYvbXNtOHgxNi13Y2QuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd3NhODgxeC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJtc21mYWxjb24tYXNvYy1zbmQiCisKKyNkZWZpbmUgREVWX05BTUVfU1RSX0xFTiAgMzIKKyNkZWZpbmUgREVGQVVMVF9NQ0xLX1JBVEUgOTYwMDAwMAorCitzdHJ1Y3QgZGV2X2NvbmZpZyB7CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBiaXRfZm9ybWF0OworCXUzMiBjaGFubmVsczsKK307CisKKy8qIFRETSBkZWZhdWx0IGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHRkbV9yeF9jZmdbVERNX0lOVEVSRkFDRV9NQVhdW1RETV9QT1JUX01BWF0gPSB7CisJeyAvKiBQUkkgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLworCX0sCisJeyAvKiBTRUMgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLworCX0sCisJeyAvKiBURVJUIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KKwl9LAorCXsgLyogUVVBVCBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCisJfQorfTsKKworLyogVERNIGRlZmF1bHQgY29uZmlnICovCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgdGRtX3R4X2NmZ1tURE1fSU5URVJGQUNFX01BWF1bVERNX1BPUlRfTUFYXSA9IHsKKwl7IC8qIFBSSSBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCisJfSwKKwl7IC8qIFNFQyBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCisJfSwKKwl7IC8qIFRFUlQgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLworCX0sCisJeyAvKiBRVUFUIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgdXNiX3J4X2NmZyA9IHsKKwkuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haLAorCS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsCisJLmNoYW5uZWxzID0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfdHhfY2ZnID0geworCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCisJLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkuY2hhbm5lbHMgPSAxLAorfTsKKworZW51bSB7CisJUFJJTV9NSTJTID0gMCwKKwlTRUNfTUkyUywKKwlURVJUX01JMlMsCisJUVVBVF9NSTJTLAorCU1JMlNfTUFYLAorfTsKKworZW51bSB7CisJUFJJTV9BVVhfUENNID0gMCwKKwlTRUNfQVVYX1BDTSwKKwlURVJUX0FVWF9QQ00sCisJUVVBVF9BVVhfUENNLAorCUFVWF9QQ01fTUFYLAorfTsKKworZW51bSB7CisJUENNX0kyU19TRUxfUFJJTSA9IDAsCisJUENNX0kyU19TRUxfU0VDLAorCVBDTV9JMlNfU0VMX1RFUlQsCisJUENNX0kyU19TRUxfUVVBVCwKKwlQQ01fSTJTX1NFTF9NQVgsCit9OworCitzdHJ1Y3QgbWkyc19hdXhfcGNtX2NvbW1vbl9jb25mIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl2b2lkICpwY21faTJzX3NlbF92dF9hZGRyOworfTsKKworc3RydWN0IG1pMnNfY29uZiB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTMyIHJlZl9jbnQ7CisJdTMyIG1zbV9pc19taTJzX21hc3RlcjsKK307CisKK3N0cnVjdCBhdXhwY21fY29uZiB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTMyIHJlZl9jbnQ7Cit9OworCitzdHJ1Y3QgbXNtX3dzYTg4MXhfZGV2X2luZm8geworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKKwl1MzIgaW5kZXg7Cit9Oworc3RhdGljIHN0cnVjdCBzbmRfc29jX2F1eF9kZXYgKm1zbV9hdXhfZGV2Oworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgKm1zbV9jb2RlY19jb25mOworCitzdGF0aWMgYm9vbCBtc21fc3dhcF9nbmRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CisKK3N0YXRpYyBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnIG1iaGNfY2ZnID0geworCS5yZWFkX2Z3X2JpbiA9IGZhbHNlLAorCS5jYWxpYnJhdGlvbiA9IE5VTEwsCisJLmRldGVjdF9leHRuX2NhYmxlID0gdHJ1ZSwKKwkubW9ub19zdGVyb19kZXRlY3Rpb24gPSBmYWxzZSwKKwkuc3dhcF9nbmRfbWljID0gTlVMTCwKKwkuaHNfZXh0X21pY2JpYXMgPSBmYWxzZSwKKwkua2V5X2NvZGVbMF0gPSBLRVlfTUVESUEsCisJLmtleV9jb2RlWzFdID0gS0VZX1ZPSUNFQ09NTUFORCwKKwkua2V5X2NvZGVbMl0gPSBLRVlfVk9MVU1FVVAsCisJLmtleV9jb2RlWzNdID0gS0VZX1ZPTFVNRURPV04sCisJLmtleV9jb2RlWzRdID0gMCwKKwkua2V5X2NvZGVbNV0gPSAwLAorCS5rZXlfY29kZVs2XSA9IDAsCisJLmtleV9jb2RlWzddID0gMCwKKwkubGluZWluX3RoID0gNTAwMCwKKwkubW9pc3R1cmVfZW4gPSBmYWxzZSwKKwkubWJoY19taWNiaWFzID0gMCwKKwkuYW5jX21pY2JpYXMgPSAwLAorCS5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBwcm94eV9yeF9jZmcgPSB7CisJLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWiwKKwkuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLAorCS5jaGFubmVscyA9IDIsCit9OworCisvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgTUkyUyBjaGFubmVscyAqLworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIG1pMnNfcnhfY2ZnW10gPSB7CisJW1BSSU1fTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorCVtTRUNfTUkyU10gID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKKwlbVEVSVF9NSTJTXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCisJW1FVQVRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIG1pMnNfdHhfY2ZnW10gPSB7CisJW1BSSU1fTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTRUNfTUkyU10gID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbVEVSVF9NSTJTXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1FVQVRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fcnhfY2ZnW10gPSB7CisJW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgYXV4X3BjbV90eF9jZmdbXSA9IHsKKwlbUFJJTV9BVVhfUENNXSA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0VDX0FVWF9QQ01dICA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbVEVSVF9BVVhfUENNXSA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbUVVBVF9BVVhfUENNXSA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKK307CisKK3N0YXRpYyBjaGFyIGNvbnN0ICpjaF90ZXh0W10gPSB7IlR3byIsICJUaHJlZSIsICJGb3VyIiwgIkZpdmUiLAorCQkJCQkiU2l4IiwgIlNldmVuIiwgIkVpZ2h0In07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXV4cGNtX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICptaTJzX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLAorCQkJCSAgICAgICJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKKwkJCQkgICAgICAiS0haXzk2IiwgIktIWl8xOTIifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaTJzX2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwKKwkJCQkJICAgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwKKwkJCQkJICAgIkVpZ2h0In07CitzdGF0aWMgY2hhciBjb25zdCAqYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCisJCQkJCSAgIlMzMl9MRSJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCisJCQkJICAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9iaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMzJfTEUifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp0ZG1fc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzMyIiwKKwkJCQkJICAgICAiS0haXzQ0UDEiLCAiS0haXzQ4IiwgIktIWl85NiIsCisJCQkJCSAgICAgIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1c2JfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCQkJCQkgICAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLAorCQkJCQkgICAiRWlnaHQifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKKwkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAorCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCisJCQkJCSJLSFpfOTYiLCAiS0haXzE5MiIsICJLSFpfMzg0In07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJveHlfcnhfY2hzLCBjaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfcnhfY2hzLCB1c2JfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9jaHMsIHVzYl9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X3NhbXBsZV9yYXRlLCB1c2Jfc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9zYW1wbGVfcmF0ZSwgdXNiX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfY2hzLCB0ZG1fY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9mb3JtYXQsIHRkbV9iaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfc2FtcGxlX3JhdGUsIHRkbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X2NocywgdGRtX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfZm9ybWF0LCB0ZG1fYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X3NhbXBsZV9yYXRlLCB0ZG1fc2FtcGxlX3JhdGVfdGV4dCk7CisKK3N0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbWkyc19jbGtbTUkyU19NQVhdID0geworCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9TRUNfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9URVJfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfSUJJVCwKKwkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKKwkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCisJCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJCTAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgbWkyc19hdXhwY21fY29uZltQQ01fSTJTX1NFTF9NQVhdOworc3RhdGljIHN0cnVjdCBtaTJzX2NvbmYgbWkyc19pbnRmX2NvbmZbTUkyU19NQVhdOworc3RhdGljIHN0cnVjdCBhdXhwY21fY29uZiBhdXhwY21faW50Zl9jb25mW0FVWF9QQ01fTUFYXTsKKworc3RhdGljIGludCBwcm94eV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBwcm94eV9yeCBjaGFubmVscyA9ICVkXG4iLAorCQkgX19mdW5jX18sIHByb3h5X3J4X2NmZy5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcm94eV9yeF9jZmcuY2hhbm5lbHMgLSAyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJveHlfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByb3h5X3J4X2NmZy5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKKwlwcl9kZWJ1ZygiJXM6IHByb3h5X3J4IGNoYW5uZWxzID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgcHJveHlfcnhfY2ZnLmNoYW5uZWxzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQoreworCWludCBzYW1wbGVfcmF0ZSA9IDA7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAwOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA3OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCB0ZG1fcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydCkgeworCQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSSIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9QUkk7CisJCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQyIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9TRUM7CisJCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlQiLAorCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPm1vZGUgPSBURE1fVEVSVDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9RVUFUOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgbW9kZSBpbjogJXMiLAorCQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkgICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzAiLAorCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzEiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzIiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMjsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzMiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMzsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNCIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzQiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzUiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzYiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNjsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzciLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNzsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWwgaW46ICVzIiwKKwkJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKKwkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9CisJCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKKwkJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9CisJCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX2dldF9mb3JtYXQoaW50IHZhbHVlKQoreworCWludCBmb3JtYXQgPSAwOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X2Zvcm1hdF92YWwoaW50IGZvcm1hdCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZhbHVlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJdmFsdWUgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfZm9ybWF0X3ZhbCgKKwkJCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0KTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0ID0KKwkJCXRkbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X2Zvcm1hdF92YWwoCisJCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCk7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCA9CisJCQl0ZG1fZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMSwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgPQorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscywKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyA9CisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCit7CisJaW50IHNhbXBsZV9yYXRlOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IGlkeDsKKworCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9BVVhfUENNIiwKKwkJICAgIHNpemVvZigiUFJJTV9BVVhfUENNIikpKQorCQlpZHggPSBQUklNX0FVWF9QQ007CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19BVVhfUENNIiwKKwkJCSBzaXplb2YoIlNFQ19BVVhfUENNIikpKQorCQlpZHggPSBTRUNfQVVYX1BDTTsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9BVVhfUENNIiwKKwkJCSBzaXplb2YoIlRFUlRfQVVYX1BDTSIpKSkKKwkJaWR4ID0gVEVSVF9BVVhfUENNOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX0FVWF9QQ00iLAorCQkJIHNpemVvZigiUVVBVF9BVVhfUENNIikpKQorCQlpZHggPSBRVUFUX0FVWF9QQ007CisJZWxzZSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIHBvcnQ6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCWlkeCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KKwkJYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJICAgICBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9CisJCWF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCSAgICAgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pMnNfZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQoreworCWludCBpZHg7CisKKwlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fTUkyU19SWCIsCisJICAgIHNpemVvZigiUFJJTV9NSTJTX1JYIikpKQorCQlpZHggPSBQUklNX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19NSTJTX1JYIiwKKwkJIHNpemVvZigiU0VDX01JMlNfUlgiKSkpCisJCWlkeCA9IFNFQ19NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX01JMlNfUlgiLAorCQkgc2l6ZW9mKCJURVJUX01JMlNfUlgiKSkpCisJCWlkeCA9IFRFUlRfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9NSTJTX1JYIiwKKwkJIHNpemVvZigiUVVBVF9NSTJTX1JYIikpKQorCQlpZHggPSBRVUFUX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fTUkyU19UWCIsCisJCSBzaXplb2YoIlBSSU1fTUkyU19UWCIpKSkKKwkJaWR4ID0gUFJJTV9NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfTUkyU19UWCIsCisJCSBzaXplb2YoIlNFQ19NSTJTX1RYIikpKQorCQlpZHggPSBTRUNfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9NSTJTX1RYIiwKKwkJIHNpemVvZigiVEVSVF9NSTJTX1RYIikpKQorCQlpZHggPSBURVJUX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfTUkyU19UWCIsCisJCSBzaXplb2YoIlFVQVRfTUkyU19UWCIpKSkKKwkJaWR4ID0gUVVBVF9NSTJTOworCWVsc2UgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjaGFubmVsOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlpZHggPSAtRUlOVkFMOworCX0KKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCBtaTJzX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCit7CisJaW50IHNhbXBsZV9yYXRlOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDY6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZTsKK30KKworc3RhdGljIGludCBtaTJzX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwltaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KKwkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaTJzX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwltaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KKwkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwltaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7CisJcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fbWkyc190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fbWkyc190eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwltaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7CisJcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHVzYl9yeF9jZmcuY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3J4X2NmZy5jaGFubmVscyAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1c2JfcnhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOworCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl9yeF9jZmcuY2hhbm5lbHMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisKKwlzd2l0Y2ggKHVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA5OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDc7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDU7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzIyUDA1S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xMVAwMjVLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgOToKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVzYl9yeF9jZmcuYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVzYl9yeF9jZmcuYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMzoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdXNiX3J4X2NmZy5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3R4X2NmZy5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB1c2JfdHhfY2ZnLmNoYW5uZWxzIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVzYl90eF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisKKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgdXNiX3R4X2NmZy5jaGFubmVscyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbDsKKworCXN3aXRjaCAodXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDk7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDg7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgOToKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVzYl90eF9jZmcuYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVzYl90eF9jZmcuYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMzoKKwkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdXNiX3R4X2NmZy5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIHJjOworfQorCitjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY29tbW9uX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiUFJPWFlfUlggQ2hhbm5lbHMiLCBwcm94eV9yeF9jaHMsCisJCQlwcm94eV9yeF9jaF9nZXQsIHByb3h5X3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHByaW1fYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHNlY19hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHRlcnRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBxdWF0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgcHJpbV9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgc2VjX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgdGVydF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHF1YXRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIFNhbXBsZVJhdGUiLCBwcmltX21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIFNhbXBsZVJhdGUiLCBzZWNfbWkyc19yeF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1JYIFNhbXBsZVJhdGUiLCB0ZXJ0X21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBTYW1wbGVSYXRlIiwgcXVhdF9taTJzX3J4X3NhbXBsZV9yYXRlLAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggU2FtcGxlUmF0ZSIsIHByaW1fbWkyc190eF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfVFggU2FtcGxlUmF0ZSIsIHNlY19taTJzX3R4X3NhbXBsZV9yYXRlLAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggU2FtcGxlUmF0ZSIsIHRlcnRfbWkyc190eF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1RYIFNhbXBsZVJhdGUiLCBxdWF0X21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19SWCBDaGFubmVscyIsIHByaW1fbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggQ2hhbm5lbHMiLCBwcmltX21pMnNfdHhfY2hzLAorCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfUlggQ2hhbm5lbHMiLCBzZWNfbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBDaGFubmVscyIsIHNlY19taTJzX3R4X2NocywKKwkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19SWCBDaGFubmVscyIsIHRlcnRfbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggQ2hhbm5lbHMiLCB0ZXJ0X21pMnNfdHhfY2hzLAorCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1JYIENoYW5uZWxzIiwgcXVhdF9taTJzX3J4X2NocywKKwkJCW1zbV9taTJzX3J4X2NoX2dldCwgbXNtX21pMnNfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19UWCBDaGFubmVscyIsIHF1YXRfbWkyc190eF9jaHMsCisJCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggQ2hhbm5lbHMiLCB1c2JfcnhfY2hzLAorCQkJdXNiX2F1ZGlvX3J4X2NoX2dldCwgdXNiX2F1ZGlvX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggQ2hhbm5lbHMiLCB1c2JfdHhfY2hzLAorCQkJdXNiX2F1ZGlvX3R4X2NoX2dldCwgdXNiX2F1ZGlvX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggRm9ybWF0IiwgdXNiX3J4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb19yeF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggRm9ybWF0IiwgdXNiX3R4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb190eF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggU2FtcGxlUmF0ZSIsIHVzYl9yeF9zYW1wbGVfcmF0ZSwKKwkJCXVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19UWCBTYW1wbGVSYXRlIiwgdXNiX3R4X3NhbXBsZV9yYXRlLAorCQkJdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAorCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKKwkJCXRkbV90eF9mb3JtYXRfZ2V0LAorCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKKwkJCXRkbV9yeF9jaF9nZXQsCisJCQl0ZG1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCisJCQl0ZG1fdHhfY2hfZ2V0LAorCQkJdGRtX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCisJCQl0ZG1fcnhfZm9ybWF0X2dldCwKKwkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAorCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKKwkJCXRkbV90eF9jaF9nZXQsCisJCQl0ZG1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKKwkJCXRkbV9yeF9mb3JtYXRfZ2V0LAorCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAorCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKKwkJCXRkbV9yeF9jaF9nZXQsCisJCQl0ZG1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAorCQkJdGRtX3R4X2NoX2dldCwKKwkJCXRkbV90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAorCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCisJCQl0ZG1fdHhfZm9ybWF0X2dldCwKKwkJCXRkbV90eF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCisJCQl0ZG1fdHhfY2hfZ2V0LAorCQkJdGRtX3R4X2NoX3B1dCksCit9OworCitzdGF0aWMgaW5saW5lIGludCBwYXJhbV9pc19tYXNrKGludCBwKQoreworCXJldHVybiAocCA+PSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSykgJiYKKwkJCShwIDw9IFNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfbWFzayAqcGFyYW1fdG9fbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsCisJCQkJCSAgICAgaW50IG4pCit7CisJcmV0dXJuICYocC0+bWFza3NbbiAtIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcmFtX3NldF9tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwgaW50IG4sIHVuc2lnbmVkIGludCBiaXQpCit7CisJaWYgKGJpdCA+PSBTTkRSVl9NQVNLX01BWCkKKwkJcmV0dXJuOworCWlmIChwYXJhbV9pc19tYXNrKG4pKSB7CisJCXN0cnVjdCBzbmRfbWFzayAqbSA9IHBhcmFtX3RvX21hc2socCwgbik7CisKKwkJbS0+Yml0c1swXSA9IDA7CisJCW0tPmJpdHNbMV0gPSAwOworCQltLT5iaXRzW2JpdCA+PiA1XSB8PSAoMSA8PCAoYml0ICYgMzEpKTsKKwl9Cit9CisKKy8qKgorICogbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAgLSB1cGRhdGVzIHNldHRpbmdzIG9mIEFMU0EgQkUgaHcgcGFyYW1zLgorICoKKyAqIEBydGQ6IHJ1bnRpbWUgZGFpbGluayBpbnN0YW5jZQorICogQHBhcmFtczogSFcgcGFyYW1zIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgorICoKKyAqIFJldHVybnMgMC4KKyAqLworaW50IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzOiBmb3JtYXQgPSAlZCwgcmF0ZSA9ICVkXG4iLAorCQkgIF9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc19yYXRlKHBhcmFtcykpOworCisJc3dpdGNoIChkYWlfbGluay0+YmVfaWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHVzYl9yeF9jZmcuY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfVVNCX1RYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSB1c2JfdHhfY2ZnLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlg6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gcHJveHlfcnhfY2ZnLmNoYW5uZWxzOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzA6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCQl0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQkgICB0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJICAgdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCSAgIHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzA6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCQl0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQkgICB0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tQUklNX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tQUklNX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1BSSU1fQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1BSSU1fQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tTRUNfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1RFUlRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1RFUlRfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tURVJUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tURVJUX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbUVVBVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbUVVBVF9BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1FVQVRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1FVQVRfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1BSSU1fTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfcnhfY2ZnW1BSSU1fTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1BSSU1fTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1BSSU1fTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1NFQ19NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc19yeF9jZmdbU0VDX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tRVUFUX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUVVBVF9NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCk7CisKKy8qKgorICogbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAgLSBzdGFydHVwIG9wcyBvZiBhdXhwY20uCisgKgorICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBwb2ludGVyIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KKyAqLworaW50IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IGluZGV4ID0gY3B1X2RhaS0+aWQgLSAxOworCXJldHVybiByZXQgPSAwOworCisJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKKwkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCisJCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAorCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7CisKKwlpZiAoaW5kZXggPCBQUklNX0FVWF9QQ00gfHwgaW5kZXggPiBRVUFUX0FVWF9QQ00pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKKwkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKKwlpZiAoKythdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDEpIHsKKwkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgeworCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCQlpb3dyaXRlMzIoMSwKKwkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKKwkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlcyBscGFpZl90ZXJ0X211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJYXV4cGNtX2ludGZfY29uZltpbmRleF0ucmVmX2NudC0tOworCisJbXV0ZXhfdW5sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtc21fYXV4X3BjbV9zbmRfc3RhcnR1cCk7CisKKy8qKgorICogbXNtX2F1eF9wY21fc25kX3NodXRkb3duIC0gc2h1dGRvd24gb3BzIG9mIGF1eHBjbS4KKyAqCisgKiBAc3Vic3RyZWFtOiBQQ00gc3RyZWFtIHBvaW50ZXIgb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsKKyAqLwordm9pZCBtc21fYXV4X3BjbV9zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQgLSAxOworCisJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKKwkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCisJCV9fZnVuY19fLAorCQlzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAorCQlydGQtPmNwdV9kYWktPm5hbWUsIHJ0ZC0+Y3B1X2RhaS0+aWQpOworCisJaWYgKGluZGV4IDwgUFJJTV9BVVhfUENNIHx8IGluZGV4ID4gUVVBVF9BVVhfUENNKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkiJXM6IENQVSBEQUkgaWQgKCVkKSBvdXQgb2YgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgcnRkLT5jcHVfZGFpLT5pZCk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKKwlpZiAoLS1hdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKKwkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgeworCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCQlpb3dyaXRlMzIoMCwKKwkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKKwkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlcyBscGFpZl90ZXJ0X211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlhdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250Kys7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2F1eF9wY21fc25kX3NodXRkb3duKTsKKworc3RhdGljIGludCBtc21fZ2V0X3BvcnRfaWQoaW50IGJlX2lkKQoreworCWludCBhZmVfcG9ydF9pZDsKKworCXN3aXRjaCAoYmVfaWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6CisJCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6CisJCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBiZV9pZDogJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7CisJCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYWZlX3BvcnRfaWQ7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKHUzMiBiaXRfZm9ybWF0KQoreworCXUzMiBiaXRfcGVyX3NhbXBsZTsKKworCXN3aXRjaCAoYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWJpdF9wZXJfc2FtcGxlID0gMzI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJYml0X3Blcl9zYW1wbGUgPSAxNjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJpdF9wZXJfc2FtcGxlOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbWkyc19jbGtfdmFsKGludCBkYWlfaWQsIGludCBzdHJlYW0pCit7CisJdTMyIGJpdF9wZXJfc2FtcGxlOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWJpdF9wZXJfc2FtcGxlID0KKwkJICAgIGdldF9taTJzX2JpdHNfcGVyX3NhbXBsZShtaTJzX3J4X2NmZ1tkYWlfaWRdLmJpdF9mb3JtYXQpOworCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0KKwkJICAgIG1pMnNfcnhfY2ZnW2RhaV9pZF0uc2FtcGxlX3JhdGUgKiAyICogYml0X3Blcl9zYW1wbGU7CisJfSBlbHNlIHsKKwkJYml0X3Blcl9zYW1wbGUgPQorCQkgICAgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKG1pMnNfdHhfY2ZnW2RhaV9pZF0uYml0X2Zvcm1hdCk7CisJCW1pMnNfY2xrW2RhaV9pZF0uY2xrX2ZyZXFfaW5faHogPQorCQkgICAgbWkyc190eF9jZmdbZGFpX2lkXS5zYW1wbGVfcmF0ZSAqIDIgKiBiaXRfcGVyX3NhbXBsZTsKKwl9CisKKwlpZiAoIW1pMnNfaW50Zl9jb25mW2RhaV9pZF0ubXNtX2lzX21pMnNfbWFzdGVyKQorCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0gMDsKK30KKworc3RhdGljIGludCBtc21fbWkyc19zZXRfc2NsayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcG9ydF9pZCA9IDA7CisJaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7CisKKwlwb3J0X2lkID0gbXNtX2dldF9wb3J0X2lkKHJ0ZC0+ZGFpX2xpbmstPmJlX2lkKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHBvcnRfaWQpKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlczogSW52YWxpZCBwb3J0X2lkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHBvcnRfaWQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoZW5hYmxlKSB7CisJCXVwZGF0ZV9taTJzX2Nsa192YWwoaW5kZXgsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwgIiVzOiBjbG9jayByYXRlICV1bFxuIiwgX19mdW5jX18sCisJCQltaTJzX2Nsa1tpbmRleF0uY2xrX2ZyZXFfaW5faHopOworCX0KKworCW1pMnNfY2xrW2luZGV4XS5lbmFibGUgPSBlbmFibGU7CisJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAorCQkJCSAgICAgJm1pMnNfY2xrW2luZGV4XSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCSIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCBmb3IgcG9ydCAweCV4ICwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtc21fbWkyc19zbmRfc3RhcnR1cCAtIHN0YXJ0dXAgb3BzIG9mIG1pMnMuCisgKgorICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBwb2ludGVyIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KKyAqLworaW50IG1zbV9taTJzX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7CisJdW5zaWduZWQgaW50IGZtdCA9IFNORF9TT0NfREFJRk1UX0NCU19DRlM7CisKKwlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZCwgZGFpIG5hbWUgJXMsIGRhaSBJRCAlZFxuIiwKKwkJX19mdW5jX18sIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0sCisJCWNwdV9kYWktPm5hbWUsIGNwdV9kYWktPmlkKTsKKworCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgeworCQlyZXQgPSAtRUlOVkFMOworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBDUFUgREFJIGlkICglZCkgb3V0IG9mIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKKwkJZ290byBkb25lOworCX0KKwkvKgorCSAqIE11eHRleCBwcm90ZWN0aW9uIGluIGNhc2UgdGhlIHNhbWUgTUkyUworCSAqIGludGVyZmFjZSB1c2luZyBmb3IgYm90aCBUWCBhbmQgUlggIHNvCisJICogdGhhdCB0aGUgc2FtZSBjbG9jayB3b24ndCBiZSBlbmFibGUgdHdpY2UuCisJICovCisJbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworCWlmICgrK21pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDEpIHsKKwkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCB0cnVlKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCB0byBlbmFibGUgTUkyUyBjbG9jaywgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQlpZiAobWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkciAhPSBOVUxMKSB7CisJCQltdXRleF9sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKKwkJCWlvd3JpdGUzMigwLAorCQkJCW1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOworCQkJbXV0ZXhfdW5sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkJIiVzIGxwYWlmX211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTCBmb3IgZGFpICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBjbGtfb2ZmOworCQl9CisJCS8qIENoZWNrIGlmIG1zbSBuZWVkcyB0byBwcm92aWRlIHRoZSBjbG9jayB0byB0aGUgaW50ZXJmYWNlICovCisJCWlmICghbWkyc19pbnRmX2NvbmZbaW5kZXhdLm1zbV9pc19taTJzX21hc3RlcikKKwkJCWZtdCA9IFNORF9TT0NfREFJRk1UX0NCTV9DRk07CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgZm10KTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlczogc2V0IGZtdCBjcHUgZGFpIGZhaWxlZCBmb3IgTUkyUyAoJWQpLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIGluZGV4LCByZXQpOworCQkJZ290byBjbGtfb2ZmOworCQl9CisJfQorY2xrX29mZjoKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCW1zbV9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgZmFsc2UpOworY2xlYW5fdXA6CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudC0tOworCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtc21fbWkyc19zbmRfc3RhcnR1cCk7CisKKy8qKgorICogbXNtX21pMnNfc25kX3NodXRkb3duIC0gc2h1dGRvd24gb3BzIG9mIG1pMnMuCisgKgorICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBwb2ludGVyIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rCisgKi8KK3ZvaWQgbXNtX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQ7CisKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgeworCQlwcl9lcnIoIiVzOmludmFsaWQgTUkyUyBEQUkoJWQpXG4iLCBfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworCWlmICgtLW1pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKKwkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOmNsb2NrIGRpc2FibGUgZmFpbGVkIGZvciBNSTJTICglZCk7IHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7CisJCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCsrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworfQorRVhQT1JUX1NZTUJPTChtc21fbWkyc19zbmRfc2h1dGRvd24pOworCisvKiBWYWxpZGF0ZSB3aGV0aGVyIFVTIEVVIHN3aXRjaCBpcyBwcmVzZW50IG9yIG5vdCAqLworc3RhdGljIGludCBtc21fcHJlcGFyZV91c19ldXJvKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvID49IDApIHsKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICIlczogdXNfZXVybyBncGlvIHJlcXVlc3QgJWQiLCBfX2Z1bmNfXywKKwkJCXBkYXRhLT51c19ldXJvX2dwaW8pOworCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPnVzX2V1cm9fZ3BpbywgIlRBU0hBX0NPREVDX1VTX0VVUk8iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBjb2RlYyBVUy9FVVJPIGdwaW8gJWQgZXJyb3IgJWRcbiIsCisJCQkJX19mdW5jX18sIHBkYXRhLT51c19ldXJvX2dwaW8sIHJldCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBtc21fc3dhcF9nbmRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHZhbHVlID0gMDsKKworCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvX3ApIHsKKwkJdmFsdWUgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHBkYXRhLT51c19ldXJvX2dwaW9fcCk7CisJCWlmICh2YWx1ZSkKKwkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCisJCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKKwkJZWxzZQorCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCisJCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKKwl9IGVsc2UgaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgeworCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8pOworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+dXNfZXVyb19ncGlvLCAhdmFsdWUpOworCX0KKwlwcl9kZWJ1ZygiJXM6IHN3YXAgc2VsZWN0IHN3aXRjaCAlZCB0byAlZFxuIiwgX19mdW5jX18sIHZhbHVlLCAhdmFsdWUpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IG1zbV9wb3B1bGF0ZV9kYWlfbGlua19jb21wb25lbnRfb2Zfbm9kZSgKKwkJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaSwgaW5kZXgsIHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqY2RldiA9IGNhcmQtPmRldjsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBjYXJkLT5kYWlfbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoYW5kbGU7CisKKwlpZiAoIWNkZXYpIHsKKwkJcHJfZXJyKCIlczogU291bmQgY2FyZCBkZXZpY2UgbWVtb3J5IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7CisJCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlICYmIGRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKQorCQkJY29udGludWU7CisKKwkJLyogcG9wdWxhdGUgcGxhdGZvcm1fb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCisJCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lICYmCisJCQkJIWRhaV9saW5rW2ldLnBsYXRmb3JtX29mX25vZGUpIHsKKwkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCisJCQkJCSJhc29jLXBsYXRmb3JtLW5hbWVzIiwKKwkJCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJcHJfZXJyKCIlczogTm8gbWF0Y2ggZm91bmQgZm9yIHBsYXRmb3JtIG5hbWU6ICVzXG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7CisJCQkJcmV0ID0gaW5kZXg7CisJCQkJZ290byBjcHVfZGFpOworCQkJfQorCQkJcGhhbmRsZSA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwKKwkJCQkJImFzb2MtcGxhdGZvcm0iLAorCQkJCQlpbmRleCk7CisJCQlpZiAoIXBoYW5kbGUpIHsKKwkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIHBsYXRmb3JtICVzLCBpbmRleCAlZCBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fLCBkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lLAorCQkJCQkJaW5kZXgpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlID0gcGhhbmRsZTsKKwkJCWRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUgPSBOVUxMOworCQl9CitjcHVfZGFpOgorCQkvKiBwb3B1bGF0ZSBjcHVfb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCisJCWlmIChkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgJiYgIWRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKSB7CisJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAorCQkJCQkiYXNvYy1jcHUtbmFtZXMiLAorCQkJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOworCQkJaWYgKGluZGV4IDwgMCkKKwkJCQlnb3RvIGNvZGVjX2RhaTsKKwkJCXBoYW5kbGUgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsICJhc29jLWNwdSIsCisJCQkJCWluZGV4KTsKKwkJCWlmICghcGhhbmRsZSkgeworCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgY3B1IGRhaSAlcyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fLCBkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSA9IHBoYW5kbGU7CisJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgPSBOVUxMOworCQl9Citjb2RlY19kYWk6CisJCS8qIHBvcHVsYXRlIGNvZGVjX29mX25vZGUgZm9yIHNuZCBjYXJkIGRhaSBsaW5rcyAqLworCQlpZiAoZGFpX2xpbmtbaV0uY29kZWNfbmFtZSAmJiAhZGFpX2xpbmtbaV0uY29kZWNfb2Zfbm9kZSkgeworCQkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcoY2Rldi0+b2Zfbm9kZSwKKwkJCQkJImFzb2MtY29kZWMtbmFtZXMiLAorCQkJCQlkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKKwkJCWlmIChpbmRleCA8IDApCisJCQkJY29udGludWU7CisJCQlwaGFuZGxlID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLCAiYXNvYy1jb2RlYyIsCisJCQkJCWluZGV4KTsKKwkJCWlmICghcGhhbmRsZSkgeworCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgY29kZWMgZGFpICVzIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlID0gcGhhbmRsZTsKKwkJCWRhaV9saW5rW2ldLmNvZGVjX25hbWUgPSBOVUxMOworCQl9CisJfQorZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3dzYTg4MXhfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKK3sKKwl1OCBzcGtsZWZ0X3BvcnRzW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MTAwLCAxMDEsIDEwMiwgMTA2fTsKKwl1OCBzcGtyaWdodF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMywgMTA0LCAxMDUsIDEwN307CisJdW5zaWduZWQgaW50IGNoX3JhdGVbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsyNDAwLCA2MDAsIDMwMCwgMTIwMH07CisJdW5zaWduZWQgaW50IGNoX21hc2tbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsweDEsIDB4RiwgMHgzLCAweDN9OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KKwkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJaWYgKCFjb2RlYykgeworCQlwcl9lcnIoIiVzIGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JMZWZ0IikpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgbGVmdCBjaCBtYXAgdG8gY29kZWMgJXNcbiIsCisJCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrbGVmdF9wb3J0c1swXSwKKwkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAorCQkJCSZjaF9yYXRlWzBdKTsKKwkJaWYgKGRhcG0tPmNvbXBvbmVudCkgeworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBJTiIpOworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBTUEtSIik7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JSaWdodCIpKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIHJpZ2h0IGNoIG1hcCB0byBjb2RlYyAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKKwkJd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoY29kZWMsICZzcGtyaWdodF9wb3J0c1swXSwKKwkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAorCQkJCSZjaF9yYXRlWzBdKTsKKwkJaWYgKGRhcG0tPmNvbXBvbmVudCkgeworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyUmlnaHQgSU4iKTsKKwkJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3BrclJpZ2h0IFNQS1IiKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3cm9uZyBjb2RlYyBuYW1lICVzXG4iLCBfX2Z1bmNfXywKKwkJCQljb2RlYy0+Y29tcG9uZW50Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvbXBvbmVudC0+Y2FyZCk7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19yb290KQorCQl3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LAorCQkJCQkJICAgICAgY29kZWMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbXNtX2luaXRfd3NhX2RldihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICp3c2Ffb2Zfbm9kZTsKKwl1MzIgd3NhX21heF9kZXZzOworCXUzMiB3c2FfZGV2X2NudDsKKwljaGFyICpkZXZfbmFtZV9zdHIgPSBOVUxMOworCXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKKwljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOworCWludCBmb3VuZCA9IDA7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sd3NhLW1heC1kZXZzIiwgJndzYV9tYXhfZGV2cyk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkiJXM6IHdzYS1tYXgtZGV2cyBwcm9wZXJ0eSBtaXNzaW5nIGluIERUICVzLCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLCByZXQpOworCQlnb3RvIGVycl9kdDsKKwl9CisJaWYgKHdzYV9tYXhfZGV2cyA9PSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkiJXM6IE1heCBXU0EgZGV2aWNlcyBpcyAwIGZvciB0aGlzIHRhcmdldD9cbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2R0OworCQkJCX0KKworCS8qIEdldCBjb3VudCBvZiBXU0EgZGV2aWNlIHBoYW5kbGVzIGZvciB0aGlzIHBsYXRmb3JtICovCisJd3NhX2Rldl9jbnQgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSJxY29tLHdzYS1kZXZzIiwgTlVMTCk7CisJaWYgKHdzYV9kZXZfY250ID09IC1FTk9FTlQpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIiVzOiBObyB3c2EgZGV2aWNlIGRlZmluZWQgaW4gRFQuXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9kdDsKKwl9IGVsc2UgaWYgKHdzYV9kZXZfY250IDw9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBFcnJvciByZWFkaW5nIHdzYSBkZXZpY2UgZnJvbSBEVC4gd3NhX2Rldl9jbnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3c2FfZGV2X2NudCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2R0OworCX0KKworCS8qCisJICogRXhwZWN0IHRvdGFsIHBoYW5kbGVzIGNvdW50IHRvIGJlIE5PVCBsZXNzIHRoYW4gbWF4aW11bSBwb3NzaWJsZQorCSAqIFdTQSBjb3VudC4gSG93ZXZlciwgaWYgaXQgaXMgbGVzcywgdGhlbiBhc3NpZ24gc2FtZSB2YWx1ZSB0bworCSAqIG1heCBjb3VudCBhcyB3ZWxsLgorCSAqLworCWlmICh3c2FfZGV2X2NudCA8IHdzYV9tYXhfZGV2cykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkiJXM6IHdzYV9tYXhfZGV2cyA9ICVkIGNhbm5vdCBleGNlZWQgd3NhX2Rldl9jbnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIHdzYV9kZXZfY250KTsKKwkJd3NhX21heF9kZXZzID0gd3NhX2Rldl9jbnQ7CisJfQorCisJLyogTWFrZSBzdXJlIHByZWZpeCBzdHJpbmcgcGFzc2VkIGZvciBlYWNoIFdTQSBkZXZpY2UgKi8KKwlyZXQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sd3NhLWF1eC1kZXYtcHJlZml4Iik7CisJaWYgKHJldCAhPSB3c2FfZGV2X2NudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IGV4cGVjdGluZyAlZCB3c2EgcHJlZml4LiBEZWZpbmVkIG9ubHkgJWQgaW4gRFRcbiIsCisJCQlfX2Z1bmNfXywgd3NhX2Rldl9jbnQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2R0OworCX0KKworCS8qCisJICogQWxsb2MgbWVtIHRvIHN0b3JlIHBoYW5kbGUgYW5kIGluZGV4IGluZm8gb2YgV1NBIGRldmljZSwgaWYgYWxyZWFkeQorCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUKKwkgKi8KKwl3c2E4ODF4X2Rldl9pbmZvID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHdzYV9tYXhfZGV2cywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghd3NhODgxeF9kZXZfaW5mbykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9tZW07CisJfQorCisJLyoKKwkgKiBzZWFyY2ggYW5kIGNoZWNrIHdoZXRoZXIgYWxsIFdTQSBkZXZpY2VzIGFyZSBhbHJlYWR5CisJICogcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZSBvciBub3QuIElmIGZvdW5kIGEgbm9kZSwgc3RvcmUKKwkgKiB0aGUgbm9kZSBhbmQgdGhlIGluZGV4IGluIGEgbG9jYWwgYXJyYXkgb2Ygc3RydWN0IGZvciBsYXRlcgorCSAqIHVzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd3NhX2Rldl9jbnQ7IGkrKykgeworCQl3c2Ffb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSAgICAgICAicWNvbSx3c2EtZGV2cyIsIGkpOworCQlpZiAodW5saWtlbHkoIXdzYV9vZl9ub2RlKSkgeworCQkJLyogd2Ugc2hvdWxkIG5vdCBiZSBoZXJlICovCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIiVzOiB3c2EgZGV2IG5vZGUgaXMgbm90IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2Rldl9ub2RlOworCQl9CisJCWlmIChzb2NfZmluZF9jb21wb25lbnQod3NhX29mX25vZGUsIE5VTEwpKSB7CisJCQkvKiBXU0EgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgKi8KKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLm9mX25vZGUgPSB3c2Ffb2Zfbm9kZTsKKwkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLmluZGV4ID0gaTsKKwkJCWZvdW5kKys7CisJCQlpZiAoZm91bmQgPT0gd3NhX21heF9kZXZzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZvdW5kIDwgd3NhX21heF9kZXZzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGZpbmQgJWQgY29tcG9uZW50cy4gRm91bmQgb25seSAlZFxuIiwKKwkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIGZvdW5kKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSIlczogZm91bmQgJWQgd3NhODgxeCBkZXZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmVcbiIsCisJCV9fZnVuY19fLCBmb3VuZCk7CisKKwljYXJkLT5udW1fYXV4X2RldnMgPSB3c2FfbWF4X2RldnM7CisJY2FyZC0+bnVtX2NvbmZpZ3MgPSB3c2FfbWF4X2RldnM7CisKKwkvKiBBbGxvYyBhcnJheSBvZiBBVVggZGV2cyBzdHJ1Y3QgKi8KKwltc21fYXV4X2RldiA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjYXJkLT5udW1fYXV4X2RldnMsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2F1eF9kZXYpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghbXNtX2F1eF9kZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfYXV4ZGV2X21lbTsKKwl9CisKKwkvKiBBbGxvYyBhcnJheSBvZiBjb2RlYyBjb25mIHN0cnVjdCAqLworCW1zbV9jb2RlY19jb25mID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNhcmQtPm51bV9hdXhfZGV2cywKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc21fY29kZWNfY29uZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jb2RlY19jb25mOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fYXV4X2RldnM7IGkrKykgeworCQlkZXZfbmFtZV9zdHIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgREVWX05BTUVfU1RSX0xFTiwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWRldl9uYW1lX3N0cikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2Rldl9zdHI7CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAgICAicWNvbSx3c2EtYXV4LWRldi1wcmVmaXgiLAorCQkJCQkJICAgIHdzYTg4MXhfZGV2X2luZm9baV0uaW5kZXgsCisJCQkJCQkgICAgd3NhX2F1eGRldl9uYW1lX3ByZWZpeCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byByZWFkIHdzYSBhdXggZGV2IHByZWZpeCwgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfZHRfcHJvcDsKKwkJfQorCisJCXNucHJpbnRmKGRldl9uYW1lX3N0ciwgc3RybGVuKCJ3c2E4ODF4LiVkIiksICJ3c2E4ODF4LiVkIiwgaSk7CisJCW1zbV9hdXhfZGV2W2ldLm5hbWUgPSBkZXZfbmFtZV9zdHI7CisJCW1zbV9hdXhfZGV2W2ldLmNvZGVjX25hbWUgPSBOVUxMOworCQltc21fYXV4X2RldltpXS5jb2RlY19vZl9ub2RlID0KKwkJCXdzYTg4MXhfZGV2X2luZm9baV0ub2Zfbm9kZTsKKwkJbXNtX2F1eF9kZXZbaV0uaW5pdCA9IG1zbV93c2E4ODF4X2luaXQ7CisJCW1zbV9jb2RlY19jb25mW2ldLmRldl9uYW1lID0gTlVMTDsKKwkJbXNtX2NvZGVjX2NvbmZbaV0ubmFtZV9wcmVmaXggPSB3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzBdOworCQltc21fY29kZWNfY29uZltpXS5vZl9ub2RlID0gd3NhODgxeF9kZXZfaW5mb1tpXS5vZl9ub2RlOworCX0KKwljYXJkLT5jb2RlY19jb25mID0gbXNtX2NvZGVjX2NvbmY7CisJY2FyZC0+YXV4X2RldiA9IG1zbV9hdXhfZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9kdF9wcm9wOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZGV2X25hbWVfc3RyKTsKK2Vycl9kZXZfc3RyOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbXNtX2NvZGVjX2NvbmYpOworZXJyX2NvZGVjX2NvbmY6CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBtc21fYXV4X2Rldik7CitlcnJfYXV4ZGV2X21lbToKK2Vycl9kZXZfbm9kZToKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdzYTg4MXhfZGV2X2luZm8pOworZXJyX21lbToKK2Vycl9kdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc21fZnJlZV9hdXhkZXZfbWVtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpOworCisJaWYgKGNhcmQtPm51bV9hdXhfZGV2cyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9hdXhfZGV2czsgaSsrKSB7CisJCQlrZnJlZShtc21fYXV4X2RldltpXS5jb2RlY19uYW1lKTsKKwkJCWtmcmVlKG1zbV9jb2RlY19jb25mW2ldLmRldl9uYW1lKTsKKwkJCWtmcmVlKG1zbV9jb2RlY19jb25mW2ldLm5hbWVfcHJlZml4KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaTJzX2F1eHBjbV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICptdXhzZWw7CisJaW50IGNvdW50OworCXUzMiBtaTJzX21hc3Rlcl9zbGF2ZVtNSTJTX01BWF07CisJaW50IHJldDsKKwljaGFyICpzdHJbUENNX0kyU19TRUxfTUFYXSA9IHsKKwkJImxwYWlmX3ByaV9tb2RlX211eHNlbCIsCisJCSJscGFpZl9zZWNfbW9kZV9tdXhzZWwiLAorCQkibHBhaWZfdGVydF9tb2RlX211eHNlbCIsCisJCSJscGFpZl9xdWF0X21vZGVfbXV4c2VsIgorCX07CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgeworCQltdXRleF9pbml0KCZtaTJzX2ludGZfY29uZltjb3VudF0ubG9jayk7CisJCW1pMnNfaW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBVVhfUENNX01BWDsgY291bnQrKykgeworCQltdXRleF9pbml0KCZhdXhwY21faW50Zl9jb25mW2NvdW50XS5sb2NrKTsKKwkJYXV4cGNtX2ludGZfY29uZltjb3VudF0ucmVmX2NudCA9IDA7CisJfQorCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgUENNX0kyU19TRUxfTUFYOyBjb3VudCsrKSB7CisJCW11dGV4X2luaXQoJm1pMnNfYXV4cGNtX2NvbmZbY291bnRdLmxvY2spOworCQltaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyID0gTlVMTDsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspIHsKKwkJbXV4c2VsID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJCSAgICAgIHN0cltjb3VudF0pOworCQlpZiAobXV4c2VsKSB7CisJCQltaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyCisJCQkJPSBpb3JlbWFwKG11eHNlbC0+c3RhcnQsIHJlc291cmNlX3NpemUobXV4c2VsKSk7CisJCX0KKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1taTJzLW1hc3RlciIsCisJCQltaTJzX21hc3Rlcl9zbGF2ZSwgTUkyU19NQVgpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IG5vIHFjb20sbXNtLW1pMnMtbWFzdGVyIGluIERUIG5vZGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUkyU19NQVg7IGNvdW50KyspIHsKKwkJCW1pMnNfaW50Zl9jb25mW2NvdW50XS5tc21faXNfbWkyc19tYXN0ZXIgPQorCQkJCW1pMnNfbWFzdGVyX3NsYXZlW2NvdW50XTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaTJzX2F1eHBjbV9kZWluaXQodm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspCisJCWlmIChtaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyICE9CisJCQlOVUxMKQorCQkJaW91bm1hcCgKKwkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21mYWxjb25fYXNvY19tYWNoaW5lX29mX21hdGNoW10gID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc21mYWxjb24tYXNvYy1zbmQiLAorCSAgLmRhdGEgPSAiaW50ZXJuYWxfY29kZWMifSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtZmFsY29uLWFzb2Mtc25kLXRhc2hhIiwKKwkgIC5kYXRhID0gInRhc2hhX2NvZGVjIn0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbWZhbGNvbi1hc29jLXNuZC10YXZpbCIsCisJICAuZGF0YSA9ICJ0YXZpbF9jb2RlYyJ9LAorCXt9LAorfTsKKworc3RhdGljIGludCBtc21fYXNvY19tYWNoaW5lX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IE5VTEw7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCWNvbnN0IGNoYXIgKm1jbGsgPSAicWNvbSxtc20tbWNsay1mcmVxIjsKKwlpbnQgcmV0ID0gLUVJTlZBTCwgaWQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJICAgICBzaXplb2Yoc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSksCisJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG1zbWZhbGNvbl9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCisJCQkgICAgICBwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKCFtYXRjaCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgbWNsaywgJmlkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgbWNsayk7CisJCWlkID0gREVGQVVMVF9NQ0xLX1JBVEU7CisJfQorCXBkYXRhLT5tY2xrX2ZyZXEgPSBpZDsKKworCWlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAidGFzaGFfY29kZWMiKSB8fAorCSAgICAhc3RyY21wKG1hdGNoLT5kYXRhLCAidGF2aWxfY29kZWMiKSkgeworCQlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhc2hhX2NvZGVjIikpCisJCQlwZGF0YS0+c25kX2NhcmRfdmFsID0gRVhUX1NORF9DQVJEX1RBU0hBOworCQllbHNlCisJCQlwZGF0YS0+c25kX2NhcmRfdmFsID0gRVhUX1NORF9DQVJEX1RBVklMOworCQlyZXQgPSBtc21fZXh0X2NkY19pbml0KHBkZXYsIHBkYXRhLCAmY2FyZCwgJm1iaGNfY2ZnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgImludGVybmFsX2NvZGVjIikpIHsKKwkJcGRhdGEtPnNuZF9jYXJkX3ZhbCA9IElOVF9TTkRfQ0FSRDsKKwkJcmV0ID0gbXNtX2ludF9jZGNfaW5pdChwZGV2LCBwZGF0YSwgJmNhcmQsICZtYmhjX2NmZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IE5vdCBhIG1hdGNoaW5nIERUIHNvdW5kIG5vZGVcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCWlmICghY2FyZCkKKwkJZ290byBlcnI7CisKKwlpZiAocGRhdGEtPnNuZF9jYXJkX3ZhbCA9PSBJTlRfU05EX0NBUkQpIHsKKwkJLypyZWFkaW5nIHRoZSBncGlvIGNvbmZpZ3VyYXRpb25zIGZyb20gZHRzaSBmaWxlKi8KKwkJcmV0ID0gbXNtX2dwaW9zZXRfaW5pdGlhbGl6ZShDTElFTlRfV0NELCAmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiJXM6IGVycm9yIHJlYWRpbmcgZHRzaSBmaWxlcyVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhcnNlIFVTLUV1cm8gZ3BpbyBpbmZvIGZyb20gRFQuIFJlcG9ydCBubyBlcnJvciBpZiB1cy1ldXJvCisJICogZW50cnkgaXMgbm90IGZvdW5kIGluIERUIGZpbGUgYXMgc29tZSB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0CisJICogVVMtRXVybyBkZXRlY3Rpb24KKwkgKi8KKwlwZGF0YS0+dXNfZXVyb19ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSkKKwkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSAmJiAoIXBkYXRhLT51c19ldXJvX2dwaW9fcCkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAorCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGRldGVjdGVkIiwKKwkJCSJxY29tLHVzLWV1cm8tZ3Bpb3MiKTsKKwkJbWJoY19jZmcuc3dhcF9nbmRfbWljID0gbXNtX3N3YXBfZ25kX21pYzsKKwl9CisKKwlyZXQgPSBtc21fcHJlcGFyZV91c19ldXJvKGNhcmQpOworCWlmIChyZXQpCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1zbV9wcmVwYXJlX3VzX2V1cm8gZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCisJaTJzX2F1eHBjbV9pbml0KHBkZXYpOworCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJxY29tLGF1ZGlvLXJvdXRpbmciKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG1zbV9wb3B1bGF0ZV9kYWlfbGlua19jb21wb25lbnRfb2Zfbm9kZShjYXJkKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBtc21faW5pdF93c2FfZGV2KHBkZXYsIGNhcmQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAocGRhdGEtPnNuZF9jYXJkX3ZhbCAhPSBJTlRfU05EX0NBUkQpCisJCW1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIoKTsKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAocGRhdGEtPnVzX2V1cm9fZ3BpbyA+IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZnJlZSB1c19ldXJvIGdwaW8gJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXBkYXRhLT51c19ldXJvX2dwaW8gPSAwOworCX0KKwlpZiAocGRhdGEtPmhwaF9lbjFfZ3BpbyA+IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZnJlZSBocGhfZW4xX2dwaW8gJWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPmhwaF9lbjFfZ3Bpbyk7CisJCWdwaW9fZnJlZShwZGF0YS0+aHBoX2VuMV9ncGlvKTsKKwkJcGRhdGEtPmhwaF9lbjFfZ3BpbyA9IDA7CisJfQorCWlmIChwZGF0YS0+aHBoX2VuMF9ncGlvID4gMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBmcmVlIGhwaF9lbjBfZ3BpbyAlZFxuIiwKKwkJCV9fZnVuY19fLCBwZGF0YS0+aHBoX2VuMF9ncGlvKTsKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ocGhfZW4wX2dwaW8pOworCQlwZGF0YS0+aHBoX2VuMF9ncGlvID0gMDsKKwl9CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXNvY19tYWNoaW5lX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCWlmIChwZGF0YS0+c25kX2NhcmRfdmFsID09IElOVF9TTkRfQ0FSRCkKKwkJbXV0ZXhfZGVzdHJveSgmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCW1zbV9mcmVlX2F1eGRldl9tZW0ocGRldik7CisKKwlncGlvX2ZyZWUocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJZ3Bpb19mcmVlKHBkYXRhLT5ocGhfZW4xX2dwaW8pOworCWdwaW9fZnJlZShwZGF0YS0+aHBoX2VuMF9ncGlvKTsKKwlpMnNfYXV4cGNtX2RlaW5pdCgpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21mYWxjb25fYXNvY19tYWNoaW5lX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21mYWxjb25fYXNvY19tYWNoaW5lX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX2Fzb2NfbWFjaGluZV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2Fzb2NfbWFjaGluZV9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtc21mYWxjb25fYXNvY19tYWNoaW5lX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgbXNtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtZmFsY29uX2Fzb2NfbWFjaGluZV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1jb21tb24uaCBiL3NvdW5kL3NvYy9tc20vbXNtZmFsY29uLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmI4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1jb21tb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX01TTV9DT01NT04KKyNkZWZpbmUgX19NU01fQ09NTU9OCisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2QtbWJoYy12Mi5oIgorCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfOEtIWiAgICAgIDgwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xMVAwMjVLSFogMTEwMjUKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xNktIWiAgICAgMTYwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8yMlAwNUtIWiAgMjIwNTAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8zMktIWiAgICAgMzIwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV80NFAxS0haICAgNDQxMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV80OEtIWiAgICAgNDgwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV84OFAyS0haICAgODgyMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV85NktIWiAgICAgOTYwMDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xNzZQNEtIWiAgMTc2NDAwCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTkyS0haICAgIDE5MjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzM1MlA4S0haICAzNTI4MDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8zODRLSFogICAgMzg0MDAwCisKKyNkZWZpbmUgVERNX0NIQU5ORUxfTUFYIDgKKyNkZWZpbmUgVERNX1NMT1RfT0ZGU0VUX01BWCA4CisKK2VudW0geworCVRETV8wID0gMCwKKwlURE1fMSwKKwlURE1fMiwKKwlURE1fMywKKwlURE1fNCwKKwlURE1fNSwKKwlURE1fNiwKKwlURE1fNywKKwlURE1fUE9SVF9NQVgsCit9OworCitlbnVtIHsKKwlURE1fUFJJID0gMCwKKwlURE1fU0VDLAorCVRETV9URVJULAorCVRETV9RVUFULAorCVRETV9JTlRFUkZBQ0VfTUFYLAorfTsKKworc3RydWN0IHRkbV9wb3J0IHsKKwl1MzIgbW9kZTsKKwl1MzIgY2hhbm5lbDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY29tbW9uX3NuZF9jb250cm9sc1tdOworc3RydWN0IG1zbWZhbGNvbl9jb2RlYyB7CisJdm9pZCogKCpnZXRfYWZlX2NvbmZpZ19mbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKK307CisKK2VudW0geworCUlOVF9TTkRfQ0FSRCwKKwlFWFRfU05EX0NBUkRfVEFTSEEsCisJRVhUX1NORF9DQVJEX1RBVklMLAorfTsKKworc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSB7CisJaW50IHVzX2V1cm9fZ3BpbzsgLyogdXNlZCBieSBncGlvIGRyaXZlciBBUEkgKi8KKwlpbnQgaHBoX2VuMV9ncGlvOworCWludCBocGhfZW4wX2dwaW87CisJc3RydWN0IGRldmljZV9ub2RlICp1c19ldXJvX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaHBoX2VuMV9ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhwaF9lbjBfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBtc21mYWxjb25fY29kZWMgbXNtZmFsY29uX2NvZGVjX2ZuOworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKKwlpbnQgc3BrX2V4dF9wYV9ncGlvOworCWludCBtY2xrX2ZyZXE7CisJaW50IGxiX21vZGU7CisJaW50IHNuZF9jYXJkX3ZhbDsKKwl1OCBtaWNiaWFzMV9jYXBfbW9kZTsKKwl1OCBtaWNiaWFzMl9jYXBfbW9kZTsKKwlhdG9taWNfdCBpbnRfbWNsazBfcnNjX3JlZjsKKwlhdG9taWNfdCBpbnRfbWNsazBfZW5hYmxlZDsKKwlzdHJ1Y3QgbXV0ZXggY2RjX2ludF9tY2xrMF9tdXRleDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRpc2FibGVfaW50X21jbGswX3dvcms7CisJc3RydWN0IGFmZV9jbGtfc2V0IGRpZ2l0YWxfY2RjX2NvcmVfY2xrOworfTsKKworaW50IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitpbnQgbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwordm9pZCBtc21fYXV4X3BjbV9zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOworaW50IG1zbV9taTJzX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKK3ZvaWQgbXNtX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc21mYWxjb24tZXh0LWRhaS1saW5rcy5jIGIvc291bmQvc29jL21zbS9tc21mYWxjb24tZXh0LWRhaS1saW5rcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDY2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1leHQtZGFpLWxpbmtzLmMKQEAgLTAsMCArMSwxOTY3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzMzUuaCIKKyNpbmNsdWRlICJtc21mYWxjb24tY29tbW9uLmgiCisjaW5jbHVkZSAibXNtZmFsY29uLWV4dGVybmFsLmgiCisKKyNkZWZpbmUgREVWX05BTUVfU1RSX0xFTiAgICAgICAgICAgIDMyCisjZGVmaW5lIF9fQ0hJUFNFVF9fICJNU01GQUxDT04gIgorI2RlZmluZSBNU01fREFJTElOS19OQU1FKG5hbWUpIChfX0NISVBTRVRfXyNuYW1lKQorCisjZGVmaW5lIFdDTl9DRENfU0xJTV9SWF9DSF9NQVggMgorI2RlZmluZSBXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYIDMKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX21zbV9jYXJkX3RhdmlsOworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX21zbV9jYXJkX3Rhc2hhOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9leHRfc2xpbWJ1c19iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fZXh0X2NwZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfY3BlX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzID0geworCS5od19wYXJhbXMgPSBtc21fZXh0X3NsaW1idXNfMl9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9taTJzX2JlX29wcyA9IHsKKwkuc3RhcnR1cCA9IG1zbV9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbV9taTJzX3NuZF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2F1eF9wY21fYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAsCisJLnNodXRkb3duID0gbXNtX2F1eF9wY21fc25kX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBtc21fd2NuX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwl1bnNpZ25lZCBpbnQgcnhfY2hbV0NOX0NEQ19TTElNX1JYX0NIX01BWF0gPSB7MTU3LCAxNTh9OworCXVuc2lnbmVkIGludCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXSAgPSB7MTU5LCAxNjAsIDE2MX07CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKworCXJldHVybiBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoKSwKKwkJCQkJICAgdHhfY2gsIEFSUkFZX1NJWkUocnhfY2gpLCByeF9jaCk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3djbl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCXUzMiByeF9jaFtXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYXSwgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF07CisJdTMyIHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7CisJaW50IHJldDsKKworCWRldl9kYmcocnRkLT5kZXYsICIlczogJXNfdHhfZGFpX2lkXyVkXG4iLCBfX2Z1bmNfXywKKwkJIGNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCk7CisJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKKwkJCQkgJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBnZXQgQlRGTSBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCWRldl9kYmcocnRkLT5kZXYsICIlczogdHhfY2hfY250KCVkKSBiZV9pZCAlZFxuIiwKKwkJX19mdW5jX18sIHR4X2NoX2NudCwgZGFpX2xpbmstPmJlX2lkKTsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkgIHR4X2NoX2NudCwgdHhfY2gsIHJ4X2NoX2NudCwgcnhfY2gpOworCWlmIChyZXQpCisJCWRldl9lcnIocnRkLT5kZXYsICIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3djbl9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV93Y25faHdfcGFyYW1zLAorfTsKKworLypURE0gZGVmYXVsdCBvZmZzZXQgY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBURE1fUlhfMCBhbmQgVERNX1RYXzAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGRtX3Nsb3Rfb2Zmc2V0W1RETV9QT1JUX01BWF1bVERNX1NMT1RfT0ZGU0VUX01BWF0gPSB7CisJezAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOH0sLyogVFhfMCB8IFJYXzAgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMSB8IFJYXzEgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMiB8IFJYXzIgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMyB8IFJYXzMgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNCB8IFJYXzQgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNSB8IFJYXzUgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNiB8IFJYXzYgKi8KKwl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNyB8IFJYXzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGRtX3BhcmFtX3NldF9zbG90X21hc2sodTE2IHBvcnRfaWQsIGludCBzbG90X3dpZHRoLAorCQkJCQkgICAgaW50IHNsb3RzKQoreworCXVuc2lnbmVkIGludCBzbG90X21hc2sgPSAwOworCWludCBpLCBqOworCXVuc2lnbmVkIGludCAqc2xvdF9vZmZzZXQ7CisKKwlmb3IgKGkgPSBURE1fMDsgaSA8IFRETV9QT1JUX01BWDsgaSsrKSB7CisJCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W2ldOworCisJCWZvciAoaiA9IDA7IGogPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBqKyspIHsKKwkJCWlmIChzbG90X29mZnNldFtqXSAhPSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEKQorCQkJCXNsb3RfbWFzayB8PQorCQkJCSgxIDw8ICgoc2xvdF9vZmZzZXRbal0gKiA4KSAvIHNsb3Rfd2lkdGgpKTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzbG90X21hc2s7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3RkbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2hhbm5lbHMsIHNsb3Rfd2lkdGgsIHNsb3RzOworCXVuc2lnbmVkIGludCBzbG90X21hc2s7CisJdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKKwlpbnQgb2Zmc2V0X2NoYW5uZWxzID0gMDsKKwlpbnQgaTsKKworCXByX2RlYnVnKCIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGNwdV9kYWktPmlkKTsKKworCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJc3dpdGNoIChjaGFubmVscykgeworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCWNhc2UgNDoKKwljYXNlIDU6CisJY2FzZSA2OgorCWNhc2UgNzoKKwljYXNlIDg6CisJCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCS8qCisJCSAqIHVwIHRvIDggY2hhbm5lbHMgSFcgY29uZmlnIHNob3VsZAorCQkgKiB1c2UgMzIgYml0IHNsb3Qgd2lkdGggZm9yIG1heCBzdXBwb3J0IG9mCisJCSAqIHN0cmVhbSBiaXQgd2lkdGguIChzbG90X3dpZHRoID4gYml0X3dpZHRoKQorCQkgKi8KKwkJCXNsb3Rfd2lkdGggPSAzMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBmb3JtYXQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNsb3RzID0gODsKKwkJc2xvdF9tYXNrID0gdGRtX3BhcmFtX3NldF9zbG90X21hc2soY3B1X2RhaS0+aWQsCisJCQkJCQkgICAgc2xvdF93aWR0aCwKKwkJCQkJCSAgICBzbG90cyk7CisJCWlmICghc2xvdF9tYXNrKSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNsb3RfbWFzayAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBzbG90X21hc2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBjaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIFRETV9SWF8wIGFuZCBURE1fVFhfMCAqLworCXN3aXRjaCAoY3B1X2RhaS0+aWQpIHsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6CisJCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W1RETV8wXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZGFpIGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBpKyspIHsKKwkJaWYgKHNsb3Rfb2Zmc2V0W2ldICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCisJCQlvZmZzZXRfY2hhbm5lbHMrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKG9mZnNldF9jaGFubmVscyA9PSAwKSB7CisJCXByX2VycigiJXM6IHNsb3Qgb2Zmc2V0IG5vdCBzdXBwb3J0ZWQsIG9mZnNldF9jaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBvZmZzZXRfY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbm5lbHMgPiBvZmZzZXRfY2hhbm5lbHMpIHsKKwkJcHJfZXJyKCIlczogY2hhbm5lbHMgJWQgZXhjZWVkIG9mZnNldF9jaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFubmVscywgb2Zmc2V0X2NoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIDAsIHNsb3RfbWFzaywKKwkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIE5VTEwsCisJCQkJCQkgIGNoYW5uZWxzLCBzbG90X29mZnNldCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjcHVfZGFpLCBzbG90X21hc2ssIDAsCisJCQkJCSAgICAgICBzbG90cywgc2xvdF93aWR0aCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IHRkbSBzbG90LCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCBjaGFubmVscywKKwkJCQkJCSAgc2xvdF9vZmZzZXQsIDAsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjaGFubmVsIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fdGRtX2JlX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbXNtX3RkbV9zbmRfaHdfcGFyYW1zCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2V4dF90YXNoYV9mZV9kYWlbXSA9IHsKKwkvKiB0YXNoYV92aWZlZWRiYWNrIGZvciBzcGVha2VyIHByb3RlY3Rpb24gKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdmlmZWVkYmFjayIsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogVWx0cmFzb3VuZCBSWCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfcngyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfMl9iZV9vcHMsCisJfSwKKwkvKiBVbHRyYXNvdW5kIFRYIERBSSBMaW5rICovCisJeworCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzLAorCX0sCisJLyogQ1BFIExTTSBkaXJlY3QgZGFpLWxpbmsgKi8KKwl7CisJCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJDUEUgTGlzdGVuIEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktc2xpbSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9tYWQxIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkub3BzID0gJm1zbV9leHRfY3BlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU182IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNiBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzZfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCS8qIENQRSBMU00gRUMgUFAgZGlyZWN0IGRhaS1saW5rICovCisJeworCQkubmFtZSA9ICJDUEUgTGlzdGVuIHNlcnZpY2UgRUNQUCIsCisJCS5zdHJlYW1fbmFtZSA9ICJDUEUgTGlzdGVuIEF1ZGlvIFNlcnZpY2UgRUNQUCIsCisJCS5jcHVfZGFpX25hbWUgPSAiQ1BFX0xTTV9OT0hPU1QiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY3BlLWxzbS4zIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9jcGUiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fZXh0X3RhdmlsX2ZlX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF92aWZlZWRiYWNrIiwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBVbHRyYXNvdW5kIFJYIERBSSBMaW5rICovCisJeworCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDIiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c18yX2JlX29wcywKKwl9LAorCS8qIFVsdHJhc291bmQgVFggREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF90eDIiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c18yX2JlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfdGFzaGFfYmVfZGFpW10gPSB7CisJLyogQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwkJLmluaXQgPSAmbXNtX2F1ZHJ4X2luaXQsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18xX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czEgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODciLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDMiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9yeDMiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBNQUQgQkUgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU181X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9tYWQxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9yeDQiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fZXh0X3RhdmlsX2JlX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJCS5pbml0ID0gJm1zbV9hdWRyeF9pbml0LAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18xX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czEgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODciLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF90eDMiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMl9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MiIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF90eDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDMiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBNQUQgQkUgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU181X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9tYWQxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDQiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fZXh0X2NvbW1vbl9mZV9kYWlbXSA9IHsKKwkvKiBGcm9udEVuZCBEQUkgTGlua3MgKi8KKwl7LyogaHc6eCwwICovCisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTEpLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKKwl9LAorCXsvKiBodzp4LDEgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMiksCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiIsCisJCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhMiIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4wIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLAorCX0sCisJey8qIGh3OngsMiAqLworCQkubmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKKwl9LAorCXsvKiBodzp4LDMgKi8KKwkJLm5hbWUgPSAiTVNNIFZvSVAiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9JUCIsCisJCS5jcHVfZGFpX25hbWUJPSAiVm9JUCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tdm9pcC1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JUCwKKwl9LAorCXsvKiBodzp4LDQgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTCksCisJCS5zdHJlYW1fbmFtZSA9ICJVTEwiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWEzIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjIiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywKKwl9LAorCS8qIEhvc3RsZXNzIFBDTSBwdXJwb3NlICovCisJey8qIGh3OngsNSAqLworCQkubmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18wIEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTMF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lCT0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogVGhpcyBkYWkgbGluayBoYXMgTUkyUyBzdXBwb3J0ICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsNiAqLworCQkubmFtZSA9ICJNU00gQUZFLVBDTSBSWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgUlgiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MSIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJey8qIGh3OngsNyAqLworCQkubmFtZSA9ICJNU00gQUZFLVBDTSBUWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgVFgiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJey8qIGh3OngsOCAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MxKSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMSIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTQiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LAorCX0sCisJey8qIGh3OngsOSovCisJCS5uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJBVVhQQ00gSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lICAgPSAiQVVYUENNX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCwxMCAqLworCQkubmFtZSA9ICJTTElNQlVTXzEgSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTMV9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsvKiBodzp4LDExICovCisJCS5uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzMgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsIC8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMTIgKi8KKwkJLm5hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwgLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCwxMyAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTG93TGF0ZW5jeSksCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSIsCisJCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhNSIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4xIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKKwl9LAorCS8qIExTTSBGRSAqLworCXsvKiBodzp4LDE0ICovCisJCS5uYW1lID0gIkxpc3RlbiAxIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU00xLAorCX0sCisJey8qIGh3OngsMTUgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMiksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczIiLAorCQkuY3B1X2RhaV9uYW1lICAgPSAiTXVsdGlNZWRpYTciLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCisJfSwKKwl7LyogaHc6eCwxNiAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MzKSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMyIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEwIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsCisJfSwKKwl7LyogaHc6eCwxNyAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMX05PSVJRKSwKKwkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRIiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhOCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC1ub2lycSIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LAorCX0sCisJey8qIGh3OngsMTggKi8KKwkJLm5hbWUgPSAiSERNSV9SWF9IT1NUTEVTUyIsCisJCS5zdHJlYW1fbmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJIRE1JX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMTkgKi8KKwkJLm5hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkuY3B1X2RhaV9uYW1lID0gIlZvaWNlTU1vZGUyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS12b2ljZSIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCisJfSwKKwl7LyogaHc6eCwyMCAqLworCQkubmFtZSA9ICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIkxTTTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMiwKKwl9LAorCXsvKiBodzp4LDIxICovCisJCS5uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU00zLAorCX0sCisJey8qIGh3OngsMjIgKi8KKwkJLm5hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU000IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTQsCisJfSwKKwl7LyogaHc6eCwyMyAqLworCQkubmFtZSA9ICJMaXN0ZW4gNSBBdWRpbyBTZXJ2aWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIkxTTTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNSwKKwl9LAorCXsvKiBodzp4LDI0ICovCisJCS5uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU002CisJfSwKKwl7LyogaHc6eCwyNSAqLworCQkubmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIkxTTTciLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNywKKwl9LAorCXsvKiBodzp4LDI2ICovCisJCS5uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU004LAorCX0sCisJey8qIGh3OngsMjcgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhOSksCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhOSIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTkiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3AuMCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LAorCX0sCisJey8qIGh3OngsMjggKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNCksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczQiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExMSIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLAorCX0sCisJey8qIGh3OngsMjkgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNSksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczUiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExMiIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLAorCX0sCisJey8qIGh3OngsMzAgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNiksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczYiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExMyIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLAorCX0sCisJey8qIGh3OngsMzEgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNyksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczciLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExNCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LAorCX0sCisJey8qIGh3OngsMzIgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzOCksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczgiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExNSIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LAorCX0sCisJey8qIGh3OngsMzMgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzOSksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczkiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExNiIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LAorCX0sCisJey8qIGh3OngsMzQgKi8KKwkJLm5hbWUgPSAiU0xJTUJVU184IEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfY29tbW9uX2JlX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiQUZFIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBJbmNhbGwgUmVjb3JkIFVwbGluayBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9JTkNBTExfUkVDT1JEX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgVXBsaW5rIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgICAgID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBJbmNhbGwgUmVjb3JkIERvd25saW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBJbmNhbGwgTXVzaWMgMiBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgRmFyZW5kIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1VTQl9BVURJT19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjg2NzIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9VU0JfQVVESU9fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjg2NzMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODY1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19URE1fUlhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg4MCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9URE1fUlhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk2IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4OTciLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1JYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fbWkyc19iZV9kYWlfbGlua3NbXSA9IHsKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfTUkyU19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2F1eHBjbV9iZV9kYWlfbGlua3NbXSA9IHsKKwkvKiBQcmltYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCS8qIFNlY29uZGFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX0FVWFBDTV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwkvKiBUZXJ0aWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4zIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwkvKiBRdWF0ZXJuYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX0FVWFBDTV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCisJCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKKwkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KKwkJICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3djbl9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk5IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiYnRmbV9idF9zY29fc2xpbV90eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV93Y25fb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfOF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM4IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2NDAxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiYnRmbV9mbV9zbGltX3R4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pbml0ID0gJm1zbV93Y25faW5pdCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfdGFzaGFfZGFpX2xpbmtzWworQVJSQVlfU0laRShtc21fZXh0X2NvbW1vbl9mZV9kYWkpICsKK0FSUkFZX1NJWkUobXNtX2V4dF90YXNoYV9mZV9kYWkpICsKK0FSUkFZX1NJWkUobXNtX2V4dF9jb21tb25fYmVfZGFpKSArCitBUlJBWV9TSVpFKG1zbV9leHRfdGFzaGFfYmVfZGFpKSArCitBUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcykgKworQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcykgKworQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcyldOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2V4dF90YXZpbF9kYWlfbGlua3NbCitBUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2ZlX2RhaSkgKworQVJSQVlfU0laRShtc21fZXh0X3RhdmlsX2ZlX2RhaSkgKworQVJSQVlfU0laRShtc21fZXh0X2NvbW1vbl9iZV9kYWkpICsKK0FSUkFZX1NJWkUobXNtX2V4dF90YXZpbF9iZV9kYWkpICsKK0FSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCitBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSArCitBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKV07CisKKy8qKgorICogcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3MgLSBwcmVwYXJlcyBkYWlsaW5rIGFycmF5IGFuZCBpbml0aWFsaXplcyBjYXJkLgorICoKKyAqIEBkZXY6IGRldmljZSBoYW5kbGUKKyAqCisgKiBSZXR1cm5zIGNhcmQgb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBzbmRfc29jX2NhcmQgKnBvcHVsYXRlX3NuZF9jYXJkX2RhaWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCWludCBzbmRfY2FyZF92YWwpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbXNtX2V4dF9kYWlfbGlua3MgPSBOVUxMOworCWludCByZXQsIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQ7CisJZW51bSBjb2RlY192YXJpYW50IGNvZGVjX3ZlciA9IDA7CisKKwlpZiAoc25kX2NhcmRfdmFsID09IEVYVF9TTkRfQ0FSRF9UQVNIQSkgeworCQljYXJkID0gJnNuZF9zb2NfY2FyZF9tc21fY2FyZF90YXNoYTsKKwl9IGVsc2UgaWYgKHNuZF9jYXJkX3ZhbCA9PSBFWFRfU05EX0NBUkRfVEFWSUwpIHsKKwkJY2FyZCA9ICZzbmRfc29jX2NhcmRfbXNtX2NhcmRfdGF2aWw7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGluZyBhcyBubyBtYXRjaGluZyBjYXJkIG5hbWVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNhcmQtPmRldiA9IGRldjsKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAicWNvbSxtb2RlbCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlczogcGFyc2UgY2FyZCBuYW1lIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzdHJuc3RyKGNhcmQtPm5hbWUsICJ0YXNoYSIsIHN0cmxlbihjYXJkLT5uYW1lKSkpIHsKKwkJY29kZWNfdmVyID0gdGFzaGFfY29kZWNfdmVyKCk7CisJCWlmIChjb2RlY192ZXIgPT0gV0NEOTMyNikKKwkJCWNhcmQtPm5hbWUgPSAibXNtZmFsY29uLXRhc2hhbGl0ZS1zbmQtY2FyZCI7CisKKwkJbGVuMSA9IEFSUkFZX1NJWkUobXNtX2V4dF9jb21tb25fZmVfZGFpKTsKKwkJbGVuMiA9IGxlbjEgKyBBUlJBWV9TSVpFKG1zbV9leHRfdGFzaGFfZmVfZGFpKTsKKwkJbGVuMyA9IGxlbjIgKyBBUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2JlX2RhaSk7CisJCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcywgbXNtX2V4dF9jb21tb25fZmVfZGFpLAorCQkgICAgICAgc2l6ZW9mKG1zbV9leHRfY29tbW9uX2ZlX2RhaSkpOworCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW4xLAorCQkgICAgICAgbXNtX2V4dF90YXNoYV9mZV9kYWksIHNpemVvZihtc21fZXh0X3Rhc2hhX2ZlX2RhaSkpOworCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW4yLAorCQkgICAgICAgbXNtX2V4dF9jb21tb25fYmVfZGFpLCBzaXplb2YobXNtX2V4dF9jb21tb25fYmVfZGFpKSk7CisJCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcyArIGxlbjMsCisJCSAgICAgICBtc21fZXh0X3Rhc2hhX2JlX2RhaSwgc2l6ZW9mKG1zbV9leHRfdGFzaGFfYmVfZGFpKSk7CisJCWxlbjQgPSBsZW4zICsgQVJSQVlfU0laRShtc21fZXh0X3Rhc2hhX2JlX2RhaSk7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLG1pMnMtYXVkaW8taW50ZiIpKSB7CisJCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW40LAorCQkJICAgICAgIG1zbV9taTJzX2JlX2RhaV9saW5rcywKKwkJCSAgICAgICBzaXplb2YobXNtX21pMnNfYmVfZGFpX2xpbmtzKSk7CisJCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7CisJCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW40LAorCQkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAorCQkJICAgICAgIHNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOworCQkJbGVuNCArPSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sd2NuLWJ0Zm0iKSkgeworCQkJZGV2X2RiZyhkZXYsICIlcygpOiBXQ04gQlRGTSBzdXBwb3J0IHByZXNlbnRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcyArIGxlbjQsCisJCQkJICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCisJCQkJICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7CisJCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpOworCQl9CisJCW1zbV9leHRfZGFpX2xpbmtzID0gbXNtX2V4dF90YXNoYV9kYWlfbGlua3M7CisJfSBlbHNlIGlmIChzdHJuc3RyKGNhcmQtPm5hbWUsICJ0YXZpbCIsIHN0cmxlbihjYXJkLT5uYW1lKSkpIHsKKwkJbGVuMSA9IEFSUkFZX1NJWkUobXNtX2V4dF9jb21tb25fZmVfZGFpKTsKKwkJbGVuMiA9IGxlbjEgKyBBUlJBWV9TSVpFKG1zbV9leHRfdGF2aWxfZmVfZGFpKTsKKwkJbGVuMyA9IGxlbjIgKyBBUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2JlX2RhaSk7CisJCW1lbWNweShtc21fZXh0X3RhdmlsX2RhaV9saW5rcywgbXNtX2V4dF9jb21tb25fZmVfZGFpLAorCQkgICAgICAgc2l6ZW9mKG1zbV9leHRfY29tbW9uX2ZlX2RhaSkpOworCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW4xLAorCQkgICAgICAgbXNtX2V4dF90YXZpbF9mZV9kYWksIHNpemVvZihtc21fZXh0X3RhdmlsX2ZlX2RhaSkpOworCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW4yLAorCQkgICAgICAgbXNtX2V4dF9jb21tb25fYmVfZGFpLCBzaXplb2YobXNtX2V4dF9jb21tb25fYmVfZGFpKSk7CisJCW1lbWNweShtc21fZXh0X3RhdmlsX2RhaV9saW5rcyArIGxlbjMsCisJCSAgICAgICBtc21fZXh0X3RhdmlsX2JlX2RhaSwgc2l6ZW9mKG1zbV9leHRfdGF2aWxfYmVfZGFpKSk7CisJCWxlbjQgPSBsZW4zICsgQVJSQVlfU0laRShtc21fZXh0X3RhdmlsX2JlX2RhaSk7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLG1pMnMtYXVkaW8taW50ZiIpKSB7CisJCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW40LAorCQkJICAgICAgIG1zbV9taTJzX2JlX2RhaV9saW5rcywKKwkJCSAgICAgICBzaXplb2YobXNtX21pMnNfYmVfZGFpX2xpbmtzKSk7CisJCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7CisJCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW40LAorCQkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAorCQkJICAgICAgIHNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOworCQkJbGVuNCArPSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sd2NuLWJ0Zm0iKSkgeworCQkJZGV2X2RiZyhkZXYsICIlcygpOiBXQ04gQlRGTSBzdXBwb3J0IHByZXNlbnRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCW1lbWNweShtc21fZXh0X3RhdmlsX2RhaV9saW5rcyArIGxlbjQsCisJCQkJICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCisJCQkJICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7CisJCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpOworCQl9CisJCW1zbV9leHRfZGFpX2xpbmtzID0gbXNtX2V4dF90YXZpbF9kYWlfbGlua3M7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGluZyBhcyBubyBtYXRjaGluZyBjYXJkIG5hbWVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwljYXJkLT5kYWlfbGluayA9IG1zbV9leHRfZGFpX2xpbmtzOworCWNhcmQtPm51bV9saW5rcyA9IGxlbjQ7CisKKwlyZXR1cm4gY2FyZDsKK30KK0VYUE9SVF9TWU1CT0wocG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3MpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc21mYWxjb24tZXh0ZXJuYWwuYyBiL3NvdW5kL3NvYy9tc20vbXNtZmFsY29uLWV4dGVybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiMDAyZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vbXNtZmFsY29uLWV4dGVybmFsLmMKQEAgLTAsMCArMSwxNzY1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaD4KKyNpbmNsdWRlICJxZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oIgorI2luY2x1ZGUgIm1zbS1hdWRpby1waW5jdHJsLmgiCisjaW5jbHVkZSAibXNtZmFsY29uLWNvbW1vbi5oIgorI2luY2x1ZGUgIm1zbWZhbGNvbi1leHRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzM1LmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzNHgvd2NkOTM0eC5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtbWJoYy5oIgorCisjZGVmaW5lIE1TTUZBTENPTl9TUEtfT04gICAgIDEKKyNkZWZpbmUgTVNNRkFMQ09OX1NQS19PRkYgICAgMAorCisjZGVmaW5lIFdDRDlYWFhfTUJIQ19ERUZfQlVUVE9OUyAgICA4CisjZGVmaW5lIFdDRDlYWFhfTUJIQ19ERUZfUkxPQURTICAgICA1CisjZGVmaW5lIENPREVDX0VYVF9DTEtfUkFURSAgICAgICAgICA5NjAwMDAwCisjZGVmaW5lIEFEU1BfU1RBVEVfUkVBRFlfVElNRU9VVF9NUyAzMDAwCisKKyNkZWZpbmUgV1NBODgxMF9OQU1FXzEgIndzYTg4MXguMjAxNzAyMTEiCisjZGVmaW5lIFdTQTg4MTBfTkFNRV8yICJ3c2E4ODF4LjIwMTcwMjEyIgorCitzdGF0aWMgaW50IG1zbV9leHRfc3BrX2NvbnRyb2wgPSAxOworc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKndjZF9tYmhjX2NmZ19wdHI7CisKK3N0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIHsKKwl2b2lkKiAoKmdldF9hZmVfY29uZmlnX2ZuKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOworCXZvaWQgKCptYmhjX2hzX2RldGVjdF9leGl0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworfTsKKworc3RhdGljIHN0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIG1zbV9jb2RlY19mbjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzcGRldjsKKworc3RhdGljIGJvb2wgaXNfaW5pdGlhbF9ib290OworCitzdGF0aWMgdm9pZCAqZGVmX2V4dF9tYmhjX2NhbCh2b2lkKTsKKworZW51bSB7CisJU0xJTV9SWF8wID0gMCwKKwlTTElNX1JYXzEsCisJU0xJTV9SWF8yLAorCVNMSU1fUlhfMywKKwlTTElNX1JYXzQsCisJU0xJTV9SWF81LAorCVNMSU1fUlhfNiwKKwlTTElNX1JYXzcsCisJU0xJTV9SWF9NQVgsCit9OworCitlbnVtIHsKKwlTTElNX1RYXzAgPSAwLAorCVNMSU1fVFhfMSwKKwlTTElNX1RYXzIsCisJU0xJTV9UWF8zLAorCVNMSU1fVFhfNCwKKwlTTElNX1RYXzUsCisJU0xJTV9UWF82LAorCVNMSU1fVFhfNywKKwlTTElNX1RYXzgsCisJU0xJTV9UWF9NQVgsCit9OworCitzdHJ1Y3QgZGV2X2NvbmZpZyB7CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBiaXRfZm9ybWF0OworCXUzMiBjaGFubmVsczsKK307CisKKy8qIERlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBzbGltYnVzIGNoYW5uZWxzICovCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgc2xpbV9yeF9jZmdbXSA9IHsKKwlbU0xJTV9SWF8wXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfMV0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzJdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF8zXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfNF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzVdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF82XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfN10gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgc2xpbV90eF9jZmdbXSA9IHsKKwlbU0xJTV9UWF8wXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfMV0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzJdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF8zXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfNF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzVdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF82XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfN10gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfOF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorfTsKKworc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaCA9IDI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xpbV9yeF9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28ifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3R4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwKKwkJCQkJCSJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCisJCQkJCQkiRWlnaHQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2aV9mZWVkX2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmJpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIiwgIlMyNF8zTEUiLAorCQkJCQkgICJTMzJfTEUifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpzbGltX3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKKwkJCQkJIktIWl8zMiIsICJLSFpfNDRQMSIsICJLSFpfNDgiLAorCQkJCQkiS0haXzg4UDIiLCAiS0haXzk2IiwgIktIWl8xNzZQNCIsCisJCQkJCSJLSFpfMTkyIiwgIktIWl8zNTJQOCIsICJLSFpfMzg0In07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BrX2Z1bmN0aW9uX3RleHRbXSA9IHsiT2ZmIiwgIk9uIn07CitzdGF0aWMgY2hhciBjb25zdCAqYnRfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzQ4In07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc3BrX2Z1bmNfZW4sIHNwa19mdW5jdGlvbl90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8xX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV81X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodmlfZmVlZF90eF9jaHMsIHZpX2ZlZWRfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF90eF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChidF9zYW1wbGVfcmF0ZSwgYnRfc2FtcGxlX3JhdGVfdGV4dCk7CisKK3N0YXRpYyBpbnQgc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84OFAyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gODsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA5OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQoreworCWludCBzYW1wbGVfcmF0ZSA9IDA7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAwOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfODhQMktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE3NlA0S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgOToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOworCQlicmVhazsKKwljYXNlIDEwOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoaW50IGJpdF9mb3JtYXQpCit7CisJaW50IHZhbCA9IDA7CisKKwlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQl2YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl2YWwgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzbGltX2dldF9iaXRfZm9ybWF0KGludCB2YWwpCit7CisJaW50IGJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDI6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYml0X2ZtdDsKK30KKworc3RhdGljIGludCBzbGltX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKK3sKKwlpbnQgcG9ydF9pZCA9IDA7CisKKwlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMF9SWCIsIHNpemVvZigiU0xJTV8wX1JYIikpKQorCQlwb3J0X2lkID0gU0xJTV9SWF8wOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzJfUlgiLCBzaXplb2YoIlNMSU1fMl9SWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fUlhfMjsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV81X1JYIiwgc2l6ZW9mKCJTTElNXzVfUlgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1JYXzU7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fNl9SWCIsIHNpemVvZigiU0xJTV82X1JYIikpKQorCQlwb3J0X2lkID0gU0xJTV9SWF82OworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzBfVFgiLCBzaXplb2YoIlNMSU1fMF9UWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fVFhfMDsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8xX1RYIiwgc2l6ZW9mKCJTTElNXzFfVFgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1RYXzE7CisJZWxzZSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWw6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBwb3J0X2lkOworfQorCitzdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwkvKgorCSAqIFNsaW1idXNfN19SeC9UeCBzYW1wbGUgcmF0ZSB2YWx1ZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBzeW5jIChzYW1lKQorCSAqIHdoZW4gdXNlZCBmb3IgQlRfU0NPIHVzZSBjYXNlLiBSZXR1cm4gZWl0aGVyIFJ4IG9yIFR4IHNhbXBsZSByYXRlCisJICogdmFsdWUuCisJICovCisJc3dpdGNoIChzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNhbXBsZSByYXRlID0gJWQiLCBfX2Z1bmNfXywKKwkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDE6CisJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZXM6IHNsaW03X3J4ID0gJWQsIHNsaW03X3R4ID0gJWQsIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywKKwkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUsCisJCSBzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKHNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwlzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlID0KKwkJc2xpbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlzbGltX2dldF9zYW1wbGVfcmF0ZV92YWwoc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZSA9IDA7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2FtcGxlX3JhdGUgPSBzbGltX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwlpZiAoc2FtcGxlX3JhdGUgPT0gU0FNUExJTkdfUkFURV80NFAxS0haKSB7CisJCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkOiBmb3IgVHggcGF0aFxuIiwKKwkJCV9fZnVuY19fLCBzYW1wbGVfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIHZhbHVlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCQlzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwlzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQorCQlzbGltX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJCXNsaW1fZ2V0X2JpdF9mb3JtYXRfdmFsKHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV90eF9iaXRfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCA9CisJCXNsaW1fZ2V0X2JpdF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3ZpX2ZlZWRfdHhfY2ggLSAxOworCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlbGRcbiIsIF9fZnVuY19fLAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXNtX3ZpX2ZlZWRfdHhfY2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisKKwlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWRcbiIsIF9fZnVuY19fLCBtc21fdmlfZmVlZF90eF9jaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkICpkZWZfZXh0X21iaGNfY2FsKHZvaWQpCit7CisJdm9pZCAqdGF2aWxfd2NkX2NhbDsKKwlzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7CisJdTE2ICpidG5faGlnaDsKKworCXRhdmlsX3djZF9jYWwgPSBremFsbG9jKFdDRF9NQkhDX0NBTF9TSVpFKFdDRF9NQkhDX0RFRl9CVVRUT05TLAorCQkJCVdDRDlYWFhfTUJIQ19ERUZfUkxPQURTKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YXZpbF93Y2RfY2FsKQorCQlyZXR1cm4gTlVMTDsKKworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIodGF2aWxfd2NkX2NhbCktPlgpID0gKFkpKQorCVModl9oc19tYXgsIDE2MDApOworI3VuZGVmIFMKKyNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXZpbF93Y2RfY2FsKS0+WCkgPSAoWSkpCisJUyhudW1fYnRuLCBXQ0RfTUJIQ19ERUZfQlVUVE9OUyk7CisjdW5kZWYgUworCisJYnRuX2NmZyA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXZpbF93Y2RfY2FsKTsKKwlidG5faGlnaCA9ICgodm9pZCAqKSZidG5fY2ZnLT5fdl9idG5fbG93KSArCisJCShzaXplb2YoYnRuX2NmZy0+X3ZfYnRuX2xvd1swXSkgKiBidG5fY2ZnLT5udW1fYnRuKTsKKworCWJ0bl9oaWdoWzBdID0gNzU7CisJYnRuX2hpZ2hbMV0gPSAxNTA7CisJYnRuX2hpZ2hbMl0gPSAyMzc7CisJYnRuX2hpZ2hbM10gPSA1MDA7CisJYnRuX2hpZ2hbNF0gPSA1MDA7CisJYnRuX2hpZ2hbNV0gPSA1MDA7CisJYnRuX2hpZ2hbNl0gPSA1MDA7CisJYnRuX2hpZ2hbN10gPSA1MDA7CisKKwlyZXR1cm4gdGF2aWxfd2NkX2NhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFyYW1faXNfbWFzayhpbnQgcCkKK3sKKwlyZXR1cm4gKHAgPj0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0spICYmCisJCShwIDw9IFNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfbWFzayAqcGFyYW1fdG9fbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsIGludCBuKQoreworCXJldHVybiAmKHAtPm1hc2tzW24gLSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10pOworfQorCisKK3N0YXRpYyB2b2lkIG1zbV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KKwkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJcHJfZGVidWcoIiVzOiBtc21fZXh0X3Nwa19jb250cm9sID0gJWQiLCBfX2Z1bmNfXywgbXNtX2V4dF9zcGtfY29udHJvbCk7CisJaWYgKG1zbV9leHRfc3BrX2NvbnRyb2wgPT0gTVNNRkFMQ09OX1NQS19PTikgeworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8xIGFtcCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8zIGFtcCIpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZW91dF8xIGFtcCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMyBhbXAiKTsKKwl9CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2V4dF9nZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiBtc21fZXh0X3Nwa19jb250cm9sID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgbXNtX2V4dF9zcGtfY29udHJvbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fZXh0X3Nwa19jb250cm9sOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfc2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXByX2RlYnVnKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKG1zbV9leHRfc3BrX2NvbnRyb2wgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJbXNtX2V4dF9zcGtfY29udHJvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW1zbV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKKworaW50IG1zbV9leHRfZW5hYmxlX2NvZGVjX21jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLAorCQkJICAgICAgYm9vbCBkYXBtKQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZSA9ICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGFzaGFfY29kZWMiKSkKKwkJcmV0ID0gdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCBlbmFibGUsIGRhcG0pOworCWVsc2UgaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXZpbF9jb2RlYyIpKQorCQlyZXQgPSB0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSk7CisJZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIGNvZGVjIHRvIGVuYWJsZSBleHQgY2xrXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiU3BlYWtlciBGdW5jdGlvbiIsIHNwa19mdW5jX2VuLCBtc21fZXh0X2dldF9zcGssCisJCQltc21fZXh0X3NldF9zcGspLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIENoYW5uZWxzIiwgc2xpbV8wX3J4X2NocywKKwkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBDaGFubmVscyIsIHNsaW1fMl9yeF9jaHMsCisJCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzBfVFggQ2hhbm5lbHMiLCBzbGltXzBfdHhfY2hzLAorCQkJbXNtX3NsaW1fdHhfY2hfZ2V0LCBtc21fc2xpbV90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8xX1RYIENoYW5uZWxzIiwgc2xpbV8xX3R4X2NocywKKwkJCW1zbV9zbGltX3R4X2NoX2dldCwgbXNtX3NsaW1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBDaGFubmVscyIsIHNsaW1fNV9yeF9jaHMsCisJCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzZfUlggQ2hhbm5lbHMiLCBzbGltXzZfcnhfY2hzLAorCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVklfRkVFRF9UWCBDaGFubmVscyIsIHZpX2ZlZWRfdHhfY2hzLAorCQkJbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0LCBtc21fdmlfZmVlZF90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIEZvcm1hdCIsIHNsaW1fMF9yeF9mb3JtYXQsCisJCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBGb3JtYXQiLCBzbGltXzVfcnhfZm9ybWF0LAorCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzZfUlggRm9ybWF0Iiwgc2xpbV82X3J4X2Zvcm1hdCwKKwkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1RYIEZvcm1hdCIsIHNsaW1fMF90eF9mb3JtYXQsCisJCQlzbGltX3R4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3R4X2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3J4X3NhbXBsZV9yYXRlLAorCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBTYW1wbGVSYXRlIiwgc2xpbV8yX3J4X3NhbXBsZV9yYXRlLAorCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3R4X3NhbXBsZV9yYXRlLAorCQkJc2xpbV90eF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBTYW1wbGVSYXRlIiwgc2xpbV81X3J4X3NhbXBsZV9yYXRlLAorCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBTYW1wbGVSYXRlIiwgc2xpbV82X3J4X3NhbXBsZV9yYXRlLAorCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkJUIFNhbXBsZVJhdGUiLCBidF9zYW1wbGVfcmF0ZSwKKwkJCW1zbV9idF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltc21fYnRfc2FtcGxlX3JhdGVfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fZ2V0X2NoX2Zyb21fYmVpZChpbnQzMl90IGJlX2lkKQoreworCWludCBjaF9pZCA9IDA7CisKKwlzd2l0Y2ggKGJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYOgorCQljaF9pZCA9IFNMSU1fUlhfMDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYOgorCQljaF9pZCA9IFNMSU1fUlhfMTsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYOgorCQljaF9pZCA9IFNMSU1fUlhfMjsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYOgorCQljaF9pZCA9IFNMSU1fUlhfMzsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYOgorCQljaF9pZCA9IFNMSU1fUlhfNDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYOgorCQljaF9pZCA9IFNMSU1fUlhfNjsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYOgorCQljaF9pZCA9IFNMSU1fVFhfMDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYOgorCQljaF9pZCA9IFNMSU1fVFhfMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hfaWQgPSBTTElNX1JYXzA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBjaF9pZDsKK30KKworc3RhdGljIHZvaWQgcGFyYW1fc2V0X21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBpbnQgbiwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQorCQlyZXR1cm47CisJaWYgKHBhcmFtX2lzX21hc2sobikpIHsKKwkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKKworCQltLT5iaXRzWzBdID0gMDsKKwkJbS0+Yml0c1sxXSA9IDA7CisJCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOworCX0KK30KKworLyoqCisgKiBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCAtIHVwZGF0ZXMgc2V0dGluZ3Mgb2YgQUxTQSBCRSBodyBwYXJhbXMuCisgKgorICogQHJ0ZDogcnVudGltZSBkYWlsaW5rIGluc3RhbmNlCisgKiBAcGFyYW1zOiBIVyBwYXJhbXMgb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgcmMgb24gZmFpbHVyZS4KKyAqLworaW50IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJaW50IHJjID0gMDsKKwlpbnQgaWR4OworCXZvaWQgKmNvbmZpZyA9IE5VTEw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKworCXByX2RlYnVnKCIlczogZm9ybWF0ID0gJWQsIHJhdGUgPSAlZFxuIiwKKwkJICBfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCXN3aXRjaCAoZGFpX2xpbmstPmJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlg6CisJCWlkeCA9IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoZGFpX2xpbmstPmJlX2lkKTsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXNsaW1fcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV9yeF9jZmdbaWR4XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYOgorCQlpZHggPSBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGRhaV9saW5rLT5iZV9pZCk7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlzbGltX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fdHhfY2ZnW2lkeF0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV90eF9jZmdbMV0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnWzFdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fdHhfY2ZnWzFdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWDoKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJICAgICAgIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFKTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV84S0haOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IG1zbV92aV9mZWVkX3R4X2NoOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWDoKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXNsaW1fcnhfY2ZnWzVdLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3J4X2NmZ1s1XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3J4X2NmZ1s1XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMTsKKworCQljb25maWcgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQkJCUFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHKTsKKwkJaWYgKGNvbmZpZykgeworCQkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9QT1JUX0NPTkZJRywKKwkJCQkJICAgIGNvbmZpZywgU0xJTUJVU181X1RYKTsKKwkJCWlmIChyYykKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IHNsaW1idXMgc2xhdmUgcG9ydCBjb25maWcgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW1NMSU1fVFhfOF0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfOF0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXApOworCisvKioKKyAqIG1zbV9zbmRfaHdfcGFyYW1zIC0gaHcgcGFyYW1zIG9wcyBvZiBiYWNrZW5kIGRhaWxpbmsuCisgKgorICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBvZiBhc3NvY2lhdGVkIGJhY2tlbmQgZGFpbGluay4KKyAqIEBwYXJhbXM6IEhXIHBhcmFtcyBvZiBhc3NvY2lhdGVkIGJhY2tlbmQgZGFpbGluay4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciByZXQgb24gZmFpbHVyZS4KKyAqLworaW50IG1zbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKworCWludCByZXQgPSAwOworCXUzMiByeF9jaFtTTElNX01BWF9SWF9QT1JUU10sIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCXUzMiByeF9jaF9jb3VudDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwkJaWYgKGRhaV9saW5rLT5iZV9pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzVfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSAgc2xpbV9yeF9jZmdbNV0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s1XS5jaGFubmVsczsKKwkJfSBlbHNlIGlmIChkYWlfbGluay0+YmVfaWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCkgeworCQkJcHJfZGVidWcoIiVzOiByeF8yX2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgc2xpbV9yeF9jZmdbMl0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1syXS5jaGFubmVsczsKKwkJfSBlbHNlIGlmIChkYWlfbGluay0+YmVfaWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCkgeworCQkJcHJfZGVidWcoIiVzOiByeF82X2NoPSVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgIHNsaW1fcnhfY2ZnWzZdLmNoYW5uZWxzKTsKKwkJCXJ4X2NoX2NvdW50ID0gc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHM7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzBfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSAgc2xpbV9yeF9jZmdbMF0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1swXS5jaGFubmVsczsKKwkJfQorCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgMCwKKwkJCQkJCSAgcnhfY2hfY291bnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6ICVzX3R4X2RhaV9pZF8lZF9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkLCB1c2VyX3NldF90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9jaF9tYXA7CisJCX0KKwkJLyogRm9yIDxjb2RlYz5fdHgxIGNhc2UgKi8KKwkJaWYgKGRhaV9saW5rLT5iZV9pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYKQorCQkJdXNlcl9zZXRfdHhfY2ggPSBzbGltX3R4X2NmZ1swXS5jaGFubmVsczsKKwkJLyogRm9yIDxjb2RlYz5fdHgzIGNhc2UgKi8KKwkJZWxzZSBpZiAoZGFpX2xpbmstPmJlX2lkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgpCisJCQl1c2VyX3NldF90eF9jaCA9IHNsaW1fdHhfY2ZnWzFdLmNoYW5uZWxzOworCQllbHNlIGlmIChkYWlfbGluay0+YmVfaWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCkKKwkJCXVzZXJfc2V0X3R4X2NoID0gbXNtX3ZpX2ZlZWRfdHhfY2g7CisJCWVsc2UKKwkJCXVzZXJfc2V0X3R4X2NoID0gdHhfY2hfY250OworCisJCXByX2RlYnVnKCIlczogbXNtX3NsaW1fMF90eF9jaCglZCkgdXNlcl9zZXRfdHhfY2goJWQpIHR4X2NoX2NudCglZCksIGJlX2lkICglZClcbiIsCisJCQkgX19mdW5jX18sICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywgdXNlcl9zZXRfdHhfY2gsCisJCQkgdHhfY2hfY250LCBkYWlfbGluay0+YmVfaWQpOworCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkJICB1c2VyX3NldF90eF9jaCwgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJfQorCitlcnJfY2hfbWFwOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9zbmRfaHdfcGFyYW1zKTsKKworLyoqCisgKiBtc21fZXh0X3NsaW1idXNfMl9od19wYXJhbXMgLSBodyBwYXJhbXMgb3BzIG9mIHNsaW1idXNfMiBCRS4KKyAqCisgKiBAc3Vic3RyZWFtOiBQQ00gc3RyZWFtIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgorICogQHBhcmFtczogSFcgcGFyYW1zIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIHJldCBvbiBmYWlsdXJlLgorICovCitpbnQgbXNtX2V4dF9zbGltYnVzXzJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcnhfY2hbU0xJTV9NQVhfUlhfUE9SVFNdLCB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107CisJdW5zaWduZWQgaW50IHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7CisJdW5zaWduZWQgaW50IG51bV90eF9jaCA9IDA7CisJdW5zaWduZWQgaW50IG51bV9yeF9jaCA9IDA7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQludW1fcnhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgcnhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3J4X2NoKTsKKwkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKKwkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIDAsCisJCQkJbnVtX3J4X2NoLCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgeworCQludW1fdHhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgIHR4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCW51bV90eF9jaCwgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9leHRfc2xpbWJ1c18yX2h3X3BhcmFtcyk7CisKKy8qKgorICogbXNtX3NuZF9jcGVfaHdfcGFyYW1zIC0gaHcgcGFyYW1zIG9wcyBvZiBDUEUgYmFja2VuZC4KKyAqCisgKiBAc3Vic3RyZWFtOiBQQ00gc3RyZWFtIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgorICogQHBhcmFtczogSFcgcGFyYW1zIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIHJldCBvbiBmYWlsdXJlLgorICovCitpbnQgbXNtX3NuZF9jcGVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOworCXUzMiB0eF9jaF9jbnQgPSAwOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLAorCQkJX19mdW5jX18sIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJcHJfZGVidWcoIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAorCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAorCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlbmQ7CisJfQorCisJcHJfZGVidWcoIiVzOiB0eF9jaF9jbnQoJWQpIGJlX2lkICVkXG4iLAorCQkgX19mdW5jX18sIHR4X2NoX2NudCwgZGFpX2xpbmstPmJlX2lkKTsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkgIHR4X2NoX2NudCwgdHhfY2gsIDAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlbmQ7CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9zbmRfY3BlX2h3X3BhcmFtcyk7CisKK3N0YXRpYyBpbnQgbXNtX2FmZV9zZXRfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgcmM7CisJdm9pZCAqY29uZmlnX2RhdGE7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIW1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbikgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWMgZ2V0IGFmZSBjb25maWcgbm90IGluaXQnZWRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQkJQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcsIGNvbmZpZ19kYXRhLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHJlZ2lzdGVycyBjb25maWcgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCUFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUcpOworCWlmIChjb25maWdfZGF0YSkgeworCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUcsIGNvbmZpZ19kYXRhLAorCQkJCSAgICAwKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBjZGMgcmVnaXN0ZXIgcGFnZSBjb25maWdcbiIsCisJCQkJX19mdW5jX18pOworCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcsIGNvbmZpZ19kYXRhLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IHNsaW1idXMgc2xhdmUgY29uZmlnICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfQUFOQ19WRVJTSU9OKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQUFOQ19WRVJTSU9OLCBjb25maWdfZGF0YSwgMCk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBBQU5DIHZlcnNpb24gJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCQlBRkVfQ0RDX0NMSVBfUkVHSVNURVJTX0NPTkZJRyk7CisJaWYgKGNvbmZpZ19kYXRhKSB7CisJCXJjID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUcsCisJCQkJCWNvbmZpZ19kYXRhLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNsaXAgcmVnaXN0ZXJzICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCUFGRV9DTElQX0JBTktfU0VMKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0xJUF9CQU5LX1NFTCwKKwkJCQljb25maWdfZGF0YSwgMCk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBBRkUgYmFuayBzZWxlY3Rpb24gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRyk7CisJaWYgKGNvbmZpZ19kYXRhKSB7CisJCXJjID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRywgY29uZmlnX2RhdGEsCisJCQkJMCk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY2RjIHJlZ2lzdGVyIHBhZ2UgY29uZmlnXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9hZmVfY2xlYXJfY29uZmlnKHZvaWQpCit7CisJYWZlX2NsZWFyX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpOworCWFmZV9jbGVhcl9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKK30KKworc3RhdGljIGludCBtc21fYWRzcF9wb3dlcl91cF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgYWRzcF9yZWFkeSA9IDA7CisKKwl0aW1lb3V0ID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQURTUF9TVEFURV9SRUFEWV9USU1FT1VUX01TKTsKKworCWRvIHsKKwkJaWYgKHE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKKwkJCXByX2RlYnVnKCIlczogQURTUCBBdWRpbyBpcyByZWFkeVxuIiwgX19mdW5jX18pOworCQkJYWRzcF9yZWFkeSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBBRFNQIHdpbGwgYmUgY29taW5nIHVwIGFmdGVyIHN1YnN5c3RlbSByZXN0YXJ0IGFuZAorCQkgKiBpdCBtaWdodCBub3QgYmUgZnVsbHkgdXAgd2hlbiB0aGUgY29udHJvbCByZWFjaGVzCisJCSAqIGhlcmUuIFNvLCB3YWl0IGZvciA1MG1zZWMgYmVmb3JlIGNoZWNraW5nIEFEU1Agc3RhdGUKKwkJICovCisJCW1zbGVlcCg1MCk7CisJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlpZiAoIWFkc3BfcmVhZHkpIHsKKwkJcHJfZXJyKCIlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIEFEU1AgQXVkaW9cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnJfZmFpbDsKKwl9CisKKwlyZXQgPSBtc21fYWZlX3NldF9jb25maWcoY29kZWMpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGNvbmZpZy4gZXJyICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21mYWxjb25fbm90aWZpZXJfc2VydmljZV9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJCSB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqcHRyKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IE5VTEw7CisJY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCXByX2RlYnVnKCIlczogU2VydmljZSBvcGNvZGUgMHglbHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjoKKwkJLyoKKwkJICogVXNlIGZsYWcgdG8gaWdub3JlIGluaXRpYWwgYm9vdCBub3RpZmljYXRpb25zCisJCSAqIE9uIGluaXRpYWwgYm9vdCBtc21fYWRzcF9wb3dlcl91cF9jb25maWcgaXMKKwkJICogY2FsbGVkIG9uIGluaXQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2xlYXIKKwkJICogYW5kIHNldCB0aGUgY29uZmlnIGFnYWluIG9uIGluaXRpYWwgYm9vdC4KKwkJICovCisJCWlmIChpc19pbml0aWFsX2Jvb3QpCisJCQlicmVhazsKKwkJbXNtX2FmZV9jbGVhcl9jb25maWcoKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQOgorCQlpZiAoaXNfaW5pdGlhbF9ib290KSB7CisJCQlpc19pbml0aWFsX2Jvb3QgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3BkZXYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BkZXYpOworCQlydGQgPSBzbmRfc29jX2dldF9wY21fcnVudGltZShjYXJkLCBiZV9kbF9uYW1lKTsKKwkJaWYgKCFydGQpIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogc25kX3NvY19nZXRfcGNtX3J1bnRpbWUgZm9yICVzIGZhaWxlZCFcbiIsCisJCQkJX19mdW5jX18sIGJlX2RsX25hbWUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQljb2RlYyA9IHJ0ZC0+Y29kZWM7CisKKwkJcmV0ID0gbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnKGNvZGVjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGZhaWxlZCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorZG9uZToKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNlcnZpY2VfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgID0gbXNtZmFsY29uX25vdGlmaWVyX3NlcnZpY2VfY2IsCisJLnByaW9yaXR5ID0gLUlOVF9NQVgsCit9OworCitzdGF0aWMgaW50IG1zbV9jb25maWdfaHBoX2VuMF9ncGlvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBoaWdoKQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJaW50IHZhbDsKKworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpZiAoIXBkYXRhIHx8ICFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4wX2dwaW8pKQorCQlyZXR1cm4gMDsKKworCXZhbCA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5ocGhfZW4wX2dwaW8pOworCWlmICgoISF2YWwpID09IGhpZ2gpCisJCXJldHVybiAwOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ocGhfZW4wX2dwaW8sIChpbnQpaGlnaCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfdHhfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJICAgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXNoYV9jb2RlYyIpKQorCQlyZXQgPSB0YXNoYV9jZGNfbWNsa190eF9lbmFibGUoY29kZWMsIGVuYWJsZSwgZGFwbSk7CisJZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIGNvZGVjIHRvIGVuYWJsZSBleHQgY2xrXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9leHRfbWNsa190eF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDEsIHRydWUpOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2Nsayhjb2RlYywgMCwgdHJ1ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfbWNsa19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldHVybiBtc21fZXh0X2VuYWJsZV9jb2RlY19tY2xrKGNvZGVjLCAxLCB0cnVlKTsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0dXJuIG1zbV9leHRfZW5hYmxlX2NvZGVjX21jbGsoY29kZWMsIDAsIHRydWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZXh0X3ByZXBhcmVfaGlmaShzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4xX2dwaW8pKSB7CisJCXByX2RlYnVnKCIlczogaHBoX2VuMV9ncGlvIHJlcXVlc3QgJWRcbiIsIF9fZnVuY19fLAorCQkJcGRhdGEtPmhwaF9lbjFfZ3Bpbyk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+aHBoX2VuMV9ncGlvLCAiaHBoX2VuMV9ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGhwaF9lbjFfZ3BpbyByZXF1ZXN0IGZhaWxlZCwgcmV0OiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmhwaF9lbjBfZ3BpbykpIHsKKwkJcHJfZGVidWcoIiVzOiBocGhfZW4wX2dwaW8gcmVxdWVzdCAlZFxuIiwgX19mdW5jX18sCisJCQlwZGF0YS0+aHBoX2VuMF9ncGlvKTsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ocGhfZW4wX2dwaW8sICJocGhfZW4wX2dwaW8iKTsKKwkJaWYgKHJldCkKKwkJCXByX2VycigiJXM6IGhwaF9lbjBfZ3BpbyByZXF1ZXN0IGZhaWxlZCwgcmV0OiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc21fZGFwbV93aWRnZXRzW10gPSB7CisKKwlTTkRfU09DX0RBUE1fU1VQUExZX1MoIk1DTEsiLCAtMSwgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltc21fZXh0X21jbGtfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFlfUygiTUNMSyBUWCIsIC0xLCAgU05EX1NPQ19OT1BNLCAwLCAwLAorCW1zbV9leHRfbWNsa190eF9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCisJU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8xIGFtcCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMyBhbXAiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzIgYW1wIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF80IGFtcCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJTZWNvbmRhcnkgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU5DUmlnaHQgSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJBTkNMZWZ0IEhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzQiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJBbmFsb2cgTWljNiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM3IiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzgiLCBOVUxMKSwKKworCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNiIsIE5VTEwpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd2NkX2F1ZGlvX3BhdGhzX3Rhc2hhW10gPSB7CisJeyJNSUMgQklBUzEiLCBOVUxMLCAiTUNMSyBUWCJ9LAorCXsiTUlDIEJJQVMyIiwgTlVMTCwgIk1DTEsgVFgifSwKKwl7Ik1JQyBCSUFTMyIsIE5VTEwsICJNQ0xLIFRYIn0sCisJeyJNSUMgQklBUzQiLCBOVUxMLCAiTUNMSyBUWCJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd2NkX2F1ZGlvX3BhdGhzW10gPSB7CisJeyJNSUMgQklBUzEiLCBOVUxMLCAiTUNMSyJ9LAorCXsiTUlDIEJJQVMyIiwgTlVMTCwgIk1DTEsifSwKKwl7Ik1JQyBCSUFTMyIsIE5VTEwsICJNQ0xLIn0sCisJeyJNSUMgQklBUzQiLCBOVUxMLCAiTUNMSyJ9LAorfTsKKworLyoqCisgKiBtc21fYXVkcnhfaW5pdCAtIEF1ZGlvIGluaXQgZnVuY3Rpb24gb2Ygc291bmQgY2FyZCBpbnN0YW50aWF0ZS4KKyAqCisgKiBAcnRkOiBydW50aW1lIGRhaWxpbmsgaW5zdGFuY2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciByZXQgb24gZmFpbHVyZS4KKyAqLworaW50IG1zbV9hdWRyeF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldDsKKwl2b2lkICpjb25maWdfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9CisJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkX2F1eCA9IHJ0ZC0+Y2FyZC0+cnRkX2F1eDsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisKKwkvKiBDb2RlYyBTTElNQlVTIGNvbmZpZ3VyYXRpb24KKwkgKiBSWDEsIFJYMiwgUlgzLCBSWDQsIFJYNSwgUlg2LCBSWDcsIFJYOCwgUlg5LCBSWDEwLCBSWDExLCBSWDEyLCBSWDEzCisJICogVFgxLCBUWDIsIFRYMywgVFg0LCBUWDUsIFRYNiwgVFg3LCBUWDgsIFRYOSwgVFgxMCwgVFgxMSwgVFgxMiwgVFgxMworCSAqIFRYMTQsIFRYMTUsIFRYMTYKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcnhfY2hbVEFTSEFfUlhfTUFYXSA9IHsxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsCisJCQkJCSAgICAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2fTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbVEFTSEFfVFhfTUFYXSAgPSB7MTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywKKwkJCQkJICAgICAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LAorCQkJCQkgICAgIDE0MCwgMTQxLCAxNDIsIDE0M307CisKKwlwcl9kZWJ1ZygiJXM6IGRldl9uYW1lJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZShjcHVfZGFpLT5kZXYpKTsKKworCXJ0ZC0+cG1kb3duX3RpbWUgPSAwOworCisJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIG1zbV9zbmRfY29udHJvbHMsCisJCQkJCSBBUlJBWV9TSVpFKG1zbV9zbmRfY29udHJvbHMpKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBhZGRfY29kZWNfY29udHJvbHMgZmFpbGVkOiAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgbXNtX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUobXNtX2RhcG1fd2lkZ2V0cykpOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGFzaGFfY29kZWMiKSkKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd2NkX2F1ZGlvX3BhdGhzX3Rhc2hhLAorCQkJCQlBUlJBWV9TSVpFKHdjZF9hdWRpb19wYXRoc190YXNoYSkpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd2NkX2F1ZGlvX3BhdGhzLAorCQkJCQlBUlJBWV9TSVpFKHdjZF9hdWRpb19wYXRocykpOworCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMSBhbXAiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8zIGFtcCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lb3V0XzIgYW1wIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfNCBhbXAiKTsKKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFESU5QVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfSU5QVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIZWFkc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU2Vjb25kYXJ5IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTGluZW91dF8xIGFtcCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTGluZW91dF8zIGFtcCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTGluZW91dF8yIGFtcCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTGluZW91dF80IGFtcCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMxIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWM0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBbmFsb2cgTWljNiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzciKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM4Iik7CisKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkVBUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUMxIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUM0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDNSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzYiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMwIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDMSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMzIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDNCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBFQVIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBIRUFEUEhPTkUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzEgT1VUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUEsyIE9VVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBITCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBIUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSEwiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBIUEhSIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgTElORU9VVDEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBMSU5FT1VUMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBWSSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklJTlBVVCIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCisJCQkJICAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOworCisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgeworCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXZpbF9nZXRfYWZlX2NvbmZpZzsKKwl9IGVsc2UgeworCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXNoYV9nZXRfYWZlX2NvbmZpZzsKKwkJbXNtX2NvZGVjX2ZuLm1iaGNfaHNfZGV0ZWN0X2V4aXQgPSB0YXNoYV9tYmhjX2hzX2RldGVjdF9leGl0OworCX0KKworCXJldCA9IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhjb2RlYyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9hZmVfY2ZnOworCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQkJICAgICBBRkVfQUFOQ19WRVJTSU9OKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0FBTkNfVkVSU0lPTiwgY29uZmlnX2RhdGEsIDApOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGFhbmMgdmVyc2lvbiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyX2FmZV9jZmc7CisJCX0KKwl9CisKKwlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKSB7CisJCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQkJQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUcpOworCQlpZiAoY29uZmlnX2RhdGEpIHsKKwkJCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHLAorCQkJCQkJIGNvbmZpZ19kYXRhLCAwKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNsaXAgcmVnaXN0ZXJzICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGVycl9hZmVfY2ZnOworCQkJfQorCQl9CisJCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCUFGRV9DTElQX0JBTktfU0VMKTsKKwkJaWYgKGNvbmZpZ19kYXRhKSB7CisJCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0xJUF9CQU5LX1NFTCwgY29uZmlnX2RhdGEsIDApOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGJhbmsgc2VsZWN0aW9uICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGVycl9hZmVfY2ZnOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBTZW5kIHNwZWFrZXIgY29uZmlndXJhdGlvbiBvbmx5IGZvciBXU0E4ODEwLgorCSAqIERlZmFsdXQgY29uZmlndXJhdGlvbiBpcyBmb3IgV1NBODgxNS4KKwkgKi8KKwlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXZpbF9jb2RlYyIpKSB7CisJCWlmIChydGRfYXV4ICYmIHJ0ZF9hdXgtPmNvbXBvbmVudCkKKwkJCWlmICghc3RyY21wKHJ0ZF9hdXgtPmNvbXBvbmVudC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8CisJCQkgICAgIXN0cmNtcChydGRfYXV4LT5jb21wb25lbnQtPm5hbWUsIFdTQTg4MTBfTkFNRV8yKSkgeworCQkJCXRhdmlsX3NldF9zcGtyX21vZGUocnRkLT5jb2RlYywgU1BLUl9NT0RFXzEpOworCQkJCXRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHJ0ZC0+Y29kZWMsCisJCQkJCQkJUlhfR0FJTl9PRkZTRVRfTTFQNV9EQik7CisJCX0KKwkJY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjYXJkLT5tb2R1bGUsICJjb2RlY3MiLAorCQkJCQkJIGNhcmQtPnByb2Nfcm9vdCk7CisJCWlmICghZW50cnkpIHsKKwkJCXByX2RlYnVnKCIlczogQ2Fubm90IGNyZWF0ZSBjb2RlY3MgbW9kdWxlIGVudHJ5XG4iLAorCQkJCSBfX2Z1bmNfXyk7CisJCQlwZGF0YS0+Y29kZWNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcGRhdGEtPmNvZGVjX3Jvb3QgPSBlbnRyeTsKKwkJdGF2aWxfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsIGNvZGVjKTsKKwl9IGVsc2UgeworCQlpZiAocnRkX2F1eCAmJiBydGRfYXV4LT5jb21wb25lbnQpCisJCQlpZiAoIXN0cmNtcChydGRfYXV4LT5jb21wb25lbnQtPm5hbWUsIFdTQTg4MTBfTkFNRV8xKSB8fAorCQkJICAgICFzdHJjbXAocnRkX2F1eC0+Y29tcG9uZW50LT5uYW1lLCBXU0E4ODEwX05BTUVfMikpIHsKKwkJCQl0YXNoYV9zZXRfc3Brcl9tb2RlKHJ0ZC0+Y29kZWMsIFNQS1JfTU9ERV8xKTsKKwkJCQl0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldChydGQtPmNvZGVjLAorCQkJCQkJCVJYX0dBSU5fT0ZGU0VUX00xUDVfREIpOworCQl9CisJCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCQllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY2FyZC0+bW9kdWxlLCAiY29kZWNzIiwKKwkJCQkJCSBjYXJkLT5wcm9jX3Jvb3QpOworCQlpZiAoIWVudHJ5KSB7CisJCQlwcl9kZWJ1ZygiJXM6IENhbm5vdCBjcmVhdGUgY29kZWNzIG1vZHVsZSBlbnRyeVxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gZXJyX3NuZF9tb2R1bGU7CisJCX0KKwkJcGRhdGEtPmNvZGVjX3Jvb3QgPSBlbnRyeTsKKwkJdGFzaGFfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkocGRhdGEtPmNvZGVjX3Jvb3QsIGNvZGVjKTsKKwkJdGFzaGFfbWJoY196ZGV0X2dwaW9fY3RybChtc21fY29uZmlnX2hwaF9lbjBfZ3BpbywgcnRkLT5jb2RlYyk7CisJfQorCisJd2NkX21iaGNfY2ZnX3B0ci0+Y2FsaWJyYXRpb24gPSBkZWZfZXh0X21iaGNfY2FsKCk7CisJaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgeworCQlpZiAod2NkX21iaGNfY2ZnX3B0ci0+Y2FsaWJyYXRpb24pIHsKKwkJCXBkYXRhLT5jb2RlYyA9IGNvZGVjOworCQkJcmV0ID0gdGF2aWxfbWJoY19oc19kZXRlY3QoY29kZWMsIHdjZF9tYmhjX2NmZ19wdHIpOworCQkJaWYgKHJldCA8IDApCisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGludGlhbGlzZSBtYmhjICVkXG4iLAorCQkJCQkJX19mdW5jX18sIHJldCk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiB3Y2RfbWJoY19jZmcgY2FsaWJyYXRpb24gaXMgTlVMTFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX21iaGNfY2FsOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHdjZF9tYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uKSB7CisJCQlwZGF0YS0+Y29kZWMgPSBjb2RlYzsKKwkJCXJldCA9IHRhc2hhX21iaGNfaHNfZGV0ZWN0KGNvZGVjLCB3Y2RfbWJoY19jZmdfcHRyKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBpbnRpYWxpc2UgbWJoYyAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByZXQpOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogd2NkX21iaGNfY2ZnIGNhbGlicmF0aW9uIGlzIE5VTExcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9tYmhjX2NhbDsKKwkJfQorCisJfQorZG9uZToKKwlyZXR1cm4gMDsKKworZXJyX3NuZF9tb2R1bGU6CitlcnJfYWZlX2NmZzoKK2Vycl9tYmhjX2NhbDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtc21fYXVkcnhfaW5pdCk7CisKKy8qKgorICogbXNtX2V4dF9yZWdpc3Rlcl9hdWRpb19ub3RpZmllciAtIHJlZ2lzdGVyIFNTUiBub3RpZmllci4KKyAqLwordm9pZCBtc21fZXh0X3JlZ2lzdGVyX2F1ZGlvX25vdGlmaWVyKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyKCJtc21mYWxjb24iLCBBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTiwKKwkJCQkgICAgICAmc2VydmljZV9uYik7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworfQorRVhQT1JUX1NZTUJPTChtc21fZXh0X3JlZ2lzdGVyX2F1ZGlvX25vdGlmaWVyKTsKKworLyoqCisgKiBtc21fZXh0X2NkY19pbml0IC0gZXh0ZXJuYWwgY29kZWMgbWFjaGluZSBzcGVjaWZpYyBpbml0LgorICoKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgaGFuZGxlCisgKiBAcGRhdGE6IHByaXZhdGUgZGF0YSBvZiBtYWNoaW5lIGRyaXZlcgorICogQGNhcmQ6IHNvdW5kIGNhcmQgcG9pbnRlciByZWZlcmVuY2UKKyAqIEBtYmhjX2NmZzogTUJIQyBjb25maWcgcmVmZXJlbmNlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgcmV0IG9uIGZhaWx1cmUuCisgKi8KK2ludCBtc21fZXh0X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCisJCSAgICAgc3RydWN0IHNuZF9zb2NfY2FyZCAqKmNhcmQsCisJCSAgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqd2NkX21iaGNfY2ZnX3B0cjEpCit7CisJaW50IHJldCA9IDA7CisKKwl3Y2RfbWJoY19jZmdfcHRyID0gd2NkX21iaGNfY2ZnX3B0cjE7CisJcGRldi0+aWQgPSAwOworCXdjZF9tYmhjX2NmZ19wdHItPm1vaXN0dXJlX2VuID0gdHJ1ZTsKKwl3Y2RfbWJoY19jZmdfcHRyLT5tYmhjX21pY2JpYXMgPSBNSUNfQklBU18yOworCXdjZF9tYmhjX2NmZ19wdHItPmFuY19taWNiaWFzID0gTUlDX0JJQVNfMjsKKwl3Y2RfbWJoY19jZmdfcHRyLT5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZTsKKworCSpjYXJkID0gcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3MoJnBkZXYtPmRldiwgcGRhdGEtPnNuZF9jYXJkX3ZhbCk7CisJaWYgKCEoKmNhcmQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDYXJkIHVuaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnI7CisJfQorCXNwZGV2ID0gcGRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAqY2FyZCk7CisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCpjYXJkLCBwZGF0YSk7CisJaXNfaW5pdGlhbF9ib290ID0gdHJ1ZTsKKwlwZGF0YS0+aHBoX2VuMV9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkicWNvbSxocGgtZW4xLWdwaW8iLCAwKTsKKwlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEtPmhwaF9lbjFfZ3BpbykpCisJCXBkYXRhLT5ocGhfZW4xX2dwaW9fcCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsIDApOworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMV9ncGlvKSAmJiAoIXBkYXRhLT5ocGhfZW4xX2dwaW9fcCkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAorCQkJInFjb20saHBoLWVuMS1ncGlvIiwgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJfQorCisJcGRhdGEtPmhwaF9lbjBfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJInFjb20saHBoLWVuMC1ncGlvIiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4wX2dwaW8pKQorCQlwZGF0YS0+aHBoX2VuMF9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkicWNvbSxocGgtZW4wLWdwaW8iLCAwKTsKKwlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEtPmhwaF9lbjBfZ3BpbykgJiYgKCFwZGF0YS0+aHBoX2VuMF9ncGlvX3ApKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInByb3BlcnR5ICVzIG5vdCBkZXRlY3RlZCBpbiBub2RlICVzIiwKKwkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCX0KKworCXJldCA9IG1zbV9leHRfcHJlcGFyZV9oaWZpKHBkYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1zbV9leHRfcHJlcGFyZV9oaWZpIGZhaWxlZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0ID0gMDsKKwl9CitlcnI6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2V4dF9jZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1leHRlcm5hbC5oIGIvc291bmQvc29jL21zbS9tc21mYWxjb24tZXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTRjYjcwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc21mYWxjb24tZXh0ZXJuYWwuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTVNNRkFMQ09OX0VYVEVSTkFMCisjZGVmaW5lIF9fTVNNRkFMQ09OX0VYVEVSTkFMCisKK2ludCBtc21fc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOworaW50IG1zbV9leHRfc2xpbWJ1c18yX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitpbnQgbXNtX2J0c2NvX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitpbnQgbXNtX3Byb3h5X3J4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitpbnQgbXNtX3Byb3h5X3R4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitpbnQgbXNtX2F1ZHJ4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7CitpbnQgbXNtX3NuZF9jcGVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CitzdHJ1Y3Qgc25kX3NvY19jYXJkICpwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlpbnQgc25kX2NhcmRfdmFsKTsKK2ludCBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19FWFRfQ09ERUMKK2ludCBtc21fZXh0X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqLAorCQkgICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKiosIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKik7Cit2b2lkIG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIodm9pZCk7CisjZWxzZQoraW5saW5lIGludCBtc21fZXh0X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCisJCQkgICAgc3RydWN0IHNuZF9zb2NfY2FyZCAqKmNhcmQsCisJCQkgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqd2NkX21iaGNfY2ZnX3B0cjEpCit7CisJcmV0dXJuIDA7Cit9CisKK2lubGluZSB2b2lkIG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIodm9pZCkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1pbnRlcm5hbC5jIGIvc291bmQvc29jL21zbS9tc21mYWxjb24taW50ZXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGRiNjUwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9tc21mYWxjb24taW50ZXJuYWwuYwpAQCAtMCwwICsxLDI5NzAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAibXNtLWF1ZGlvLXBpbmN0cmwuaCIKKyNpbmNsdWRlICJtc21mYWxjb24tY29tbW9uLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL21zbTh4MTYvbXNtOHgxNi13Y2QuaCIKKworI2RlZmluZSBfX0NISVBTRVRfXyAiTVNNRkFMQ09OICIKKyNkZWZpbmUgTVNNX0RBSUxJTktfTkFNRShuYW1lKSAoX19DSElQU0VUX18jbmFtZSkKKworI2RlZmluZSBERUZBVUxUX01DTEtfUkFURSA5NjAwMDAwCisjZGVmaW5lIE5BVElWRV9NQ0xLX1JBVEUgMTEyODk2MDAKKworI2RlZmluZSBXQ0RfTUJIQ19ERUZfUkxPQURTIDUKKworI2RlZmluZSBXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYIDIKKyNkZWZpbmUgV0NOX0NEQ19TTElNX1RYX0NIX01BWCAzCisKK2VudW0geworCUlOVDBfTUkyUyA9IDAsCisJSU5UMV9NSTJTLAorCUlOVDJfTUkyUywKKwlJTlQzX01JMlMsCisJSU5UNF9NSTJTLAorCUlOVDVfTUkyUywKKwlJTlQ2X01JMlMsCisJSU5UX01JMlNfTUFYLAorfTsKKworZW51bSB7CisJQlRfU0xJTTcsCisJRk1fU0xJTTgsCisJU0xJTV9NQVgsCit9OworCisvKlRETSBkZWZhdWx0IG9mZnNldCBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIFRETV9SWF8wIGFuZCBURE1fVFhfMCAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZG1fc2xvdF9vZmZzZXRbVERNX1BPUlRfTUFYXVtURE1fU0xPVF9PRkZTRVRfTUFYXSA9IHsKKwl7MCwgNCwgOCwgMTIsIDE2LCAyMCwgMjQsIDI4fSwvKiBUWF8wIHwgUlhfMCAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF8xIHwgUlhfMSAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF8yIHwgUlhfMiAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF8zIHwgUlhfMyAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF80IHwgUlhfNCAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF81IHwgUlhfNSAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF82IHwgUlhfNiAqLworCXtBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEfSwvKiBUWF83IHwgUlhfNyAqLworfTsKKworc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBpbnRfbWkyc19jbGtbSU5UX01JMlNfTUFYXSA9IHsKKwl7CisJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAorCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UMF9NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDFfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9JTlQyX01JMlNfSUJJVCwKKwkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKKwkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCisJCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJCTAsCisJfSwKKwl7CisJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAorCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UM19NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDRfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9LAorCXsKKwkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCisJCVE2QUZFX0xQQVNTX0NMS19JRF9JTlQ1X01JMlNfSUJJVCwKKwkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKKwkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCisJCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJCTAsCisJfSwKKwl7CisJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAorCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UNl9NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCit9OworCitzdHJ1Y3QgZGV2X2NvbmZpZyB7CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBiaXRfZm9ybWF0OworCXUzMiBjaGFubmVsczsKK307CisKKy8qIERlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBNSTJTIGNoYW5uZWxzICovCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgaW50X21pMnNfY2ZnW10gPSB7CisJW0lOVDBfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorCVtJTlQxX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbSU5UMl9NSTJTXSAgPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtJTlQzX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbSU5UNF9NSTJTXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW0lOVDVfTUkyU10gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCisJW0lOVDZfTUkyU10gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgYnRfZm1fY2ZnW10gPSB7CisJW0JUX1NMSU03XSA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbRk1fU0xJTThdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKK3N0YXRpYyBjaGFyIGNvbnN0ICppbnRfbWkyc19yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKKwkJCQkJICAgIktIWl8zMiIsICJLSFpfNDRQMSIsICJLSFpfNDgiLAorCQkJCQkgICAiS0haXzk2IiwgIktIWl8xOTIifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbnRfbWkyc19jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28ifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbnRfbWkyc190eF9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLAorCQkJCQkJIlRocmVlIiwgIkZvdXIifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpiaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMjRfM0xFIn07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9vcGJhY2tfbWNsa190ZXh0W10gPSB7IkRJU0FCTEUiLCAiRU5BQkxFIn07CitzdGF0aWMgY2hhciBjb25zdCAqYnRfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzQ4In07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50MF9taTJzX3J4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQwX21pMnNfcnhfY2hzLCBpbnRfbWkyc19jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50MF9taTJzX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50Ml9taTJzX3R4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQyX21pMnNfdHhfY2hzLCBpbnRfbWkyc190eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50Ml9taTJzX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50M19taTJzX3R4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQzX21pMnNfdHhfY2hzLCBpbnRfbWkyc190eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50M19taTJzX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NF9taTJzX3J4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQ0X21pMnNfcnhfY2hzLCBpbnRfbWkyc19jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NF9taTJzX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NV9taTJzX3R4X2NocywgaW50X21pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGxvb3BiYWNrX21jbGtfZW4sIGxvb3BiYWNrX21jbGtfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGJ0X3NhbXBsZV9yYXRlLCBidF9zYW1wbGVfcmF0ZV90ZXh0KTsKKworc3RhdGljIGludCBtc21fZG1pY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7CitzdGF0aWMgaW50IG1zbV9pbnRfZW5hYmxlX2RpZ19jZGNfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSwKKwkJCQkgICAgICBib29sIGRhcG0pOworc3RhdGljIGludCBtc21faW50X21jbGswX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7CitzdGF0aWMgaW50IG1zbV9pbnRfbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CitzdGF0aWMgdm9pZCBtc21faW50X21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKKworc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnX3B0cjsKKworc3RhdGljIGludCBpbnRfbWkyc19nZXRfYml0X2Zvcm1hdF92YWwoaW50IGJpdF9mb3JtYXQpCit7CisJaW50IHZhbCA9IDA7CisKKwlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl2YWwgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBpbnRfbWkyc19nZXRfYml0X2Zvcm1hdChpbnQgdmFsKQoreworCWludCBiaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMDoKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYml0X2ZtdDsKK30KKworc3RhdGljIGludCBpbnRfbWkyc19nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IHBvcnRfaWQgPSAwOworCisJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJJTlQwX01JMlMiLCBzaXplb2YoIklOVDBfTUkyUyIpKSkKKwkJcG9ydF9pZCA9IElOVDBfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiSU5UMl9NSTJTIiwgc2l6ZW9mKCJJTlQyX01JMlMiKSkpCisJCXBvcnRfaWQgPSBJTlQyX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIklOVDNfTUkyUyIsIHNpemVvZigiSU5UM19NSTJTIikpKQorCQlwb3J0X2lkID0gSU5UM19NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJJTlQ0X01JMlMiLCBzaXplb2YoIklOVDRfTUkyUyIpKSkKKwkJcG9ydF9pZCA9IElOVDRfTUkyUzsKKwllbHNlIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHBvcnRfaWQ7Cit9CisKK3N0YXRpYyBpbnQgaW50X21pMnNfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlpbnRfbWkyc19nZXRfYml0X2Zvcm1hdF92YWwoaW50X21pMnNfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCk7CisKKwlwcl9kZWJ1ZygiJXM6IGludF9taTJzWyVkXV9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBpbnRfbWkyc19jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRfbWkyc19iaXRfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gaW50X21pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJaW50X21pMnNfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCA9CisJCWludF9taTJzX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBpbnRfbWkyc1slZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAorCQkgX19mdW5jX18sIGNoX251bSwgaW50X21pMnNfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcmFtX2lzX21hc2soaW50IHApCit7CisJcmV0dXJuIChwID49IFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLKSAmJgorCQkJKHAgPD0gU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9tYXNrICpwYXJhbV90b19tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwKKwkJCQkJICAgICBpbnQgbikKK3sKKwlyZXR1cm4gJihwLT5tYXNrc1tuIC0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdKTsKK30KKworc3RhdGljIHZvaWQgcGFyYW1fc2V0X21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBpbnQgbiwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQorCQlyZXR1cm47CisJaWYgKHBhcmFtX2lzX21hc2sobikpIHsKKwkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKKworCQltLT5iaXRzWzBdID0gMDsKKwkJbS0+Yml0c1sxXSA9IDA7CisJCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOworCX0KK30KKworc3RhdGljIGludCBpbnRfbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsOworCisJc3dpdGNoIChzYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDM7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCBpbnRfbWkyc19nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQoreworCWludCBzYW1wbGVfcmF0ZTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDA6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwljYXNlIDU6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgaW50X21pMnNfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gaW50X21pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQorCQlpbnRfbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludF9taTJzX3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlpbnRfbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKGludF9taTJzX2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBpbnRfbWkyc19jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50X21pMnNfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXByX2RlYnVnKCIlczogaW50X21pMnNfWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIGludF9taTJzX2NmZ1tpZHhdLmNoYW5uZWxzKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaW50X21pMnNfY2ZnW2lkeF0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50X21pMnNfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCWludF9taTJzX2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7CisJcHJfZGVidWcoIiVzOiBpbnRfbWkyc19bJWRdX2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgaW50X21pMnNfY2ZnW2lkeF0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc21faW50X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFlfUygiSU5UX01DTEswIiwgLTEsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltc21faW50X21jbGswX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJTZWNvbmRhcnkgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMxIiwgbXNtX2RtaWNfZXZlbnQpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMiIsIG1zbV9kbWljX2V2ZW50KSwKKwlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzMiLCBtc21fZG1pY19ldmVudCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWM0IiwgbXNtX2RtaWNfZXZlbnQpLAorfTsKKworc3RhdGljIGludCBtc21fY29uZmlnX2hwaF9jb21wYW5kZXJfZ3Bpbyhib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogJXMgSFBIIENvbXBhbmRlclxuIiwgX19mdW5jX18sCisJCWVuYWJsZSA/ICJFbmFibGUiIDogIkRpc2FibGUiKTsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0ID0gbXNtX2dwaW9zZXRfYWN0aXZhdGUoQ0xJRU5UX1dDRCwgImNvbXBfZ3BpbyIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgYWN0aXZhdGVkICVzXG4iLAorCQkJCV9fZnVuY19fLCAiY29tcF9ncGlvIik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XQ0QsICJjb21wX2dwaW8iKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGRlLWFjdGl2YXRlZCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgImNvbXBfZ3BpbyIpOworCQkJZ290byBkb25lOworCQl9CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfZXh0X3Nwa19ncGlvX3N1cHBvcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSkKK3sKKwljb25zdCBjaGFyICpzcGtfZXh0X3BhID0gInFjb20sbXNtLXNway1leHQtcGEiOworCisJcHJfZGVidWcoIiVzOkVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlwZGF0YS0+c3BrX2V4dF9wYV9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJc3BrX2V4dF9wYSwgMCk7CisKKwlpZiAocGRhdGEtPnNwa19leHRfcGFfZ3BpbyA8IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIiVzOiBtaXNzaW5nICVzIGluIGR0IG5vZGVcbiIsIF9fZnVuY19fLCBzcGtfZXh0X3BhKTsKKwl9IGVsc2UgeworCQlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEtPnNwa19leHRfcGFfZ3BpbykpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgZXh0ZXJuYWwgc3BlYWtlciBncGlvOiAlZCIsCisJCQkJX19mdW5jX18sIHBkYXRhLT5zcGtfZXh0X3BhX2dwaW8pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX3Nwa19leHRfcGEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHJldDsKKworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+c3BrX2V4dF9wYV9ncGlvKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGdwaW86ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBkYXRhLT5zcGtfZXh0X3BhX2dwaW8pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJfZGVidWcoIiVzOiAlcyBleHRlcm5hbCBzcGVha2VyIFBBXG4iLCBfX2Z1bmNfXywKKwkJZW5hYmxlID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpOworCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV0NELCAiZXh0X3Nwa19ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBkZS1hY3RpdmF0ZWQgJXNcbiIsCisJCQkJCV9fZnVuY19fLCAiZXh0X3Nwa19ncGlvIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT5zcGtfZXh0X3BhX2dwaW8sIGVuYWJsZSk7CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnNwa19leHRfcGFfZ3BpbywgZW5hYmxlKTsKKwkJcmV0ID0gbXNtX2dwaW9zZXRfc3VzcGVuZChDTElFTlRfV0NELCAiZXh0X3Nwa19ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBkZS1hY3RpdmF0ZWQgJXNcbiIsCisJCQkJCV9fZnVuY19fLCAiZXh0X3Nwa19ncGlvIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludF9taTJzX2dldF9pZHhfZnJvbV9iZWlkKGludDMyX3QgYmVfaWQpCit7CisJaW50IGlkeCA9IDA7CisKKwlzd2l0Y2ggKGJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYOgorCQlpZHggPSBJTlQwX01JMlM7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWDoKKwkJaWR4ID0gSU5UMl9NSTJTOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFg6CisJCWlkeCA9IElOVDNfTUkyUzsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYOgorCQlpZHggPSBJTlQ0X01JMlM7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDVfTUkyU19UWDoKKwkJaWR4ID0gSU5UNV9NSTJTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZHggPSBJTlQwX01JMlM7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwcl9kZWJ1ZygiJXMoKVxuIiwgX19mdW5jX18pOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludF9taTJzX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCWludCBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkLCByYXRlID0gJWRcbiIsCisJCSAgX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisKKwlzd2l0Y2ggKGRhaV9saW5rLT5iZV9pZCkgeworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQ1X01JMlNfVFg6CisJCWlkeCA9IGludF9taTJzX2dldF9pZHhfZnJvbV9iZWlkKGRhaV9saW5rLT5iZV9pZCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IGludF9taTJzX2NmZ1tpZHhdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlpbnRfbWkyc19jZmdbaWR4XS5jaGFubmVsczsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJICAgICAgIGludF9taTJzX2NmZ1tpZHhdLmJpdF9mb3JtYXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2J0Zm1fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlzd2l0Y2ggKGRhaV9saW5rLT5iZV9pZCkgeworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlidF9mbV9jZmdbQlRfU0xJTTddLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBidF9mbV9jZmdbQlRfU0xJTTddLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlidF9mbV9jZmdbQlRfU0xJTTddLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gYnRfZm1fY2ZnW0ZNX1NMSU04XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYnRfZm1fY2ZnW0ZNX1NMSU04XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCShpbnRfbWkyc19jZmdbSU5UNV9NSTJTXS5jaGFubmVscy8yIC0gMSk7CisJcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVsZFxuIiwgX19mdW5jX18sCisJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50X21pMnNfY2ZnW0lOVDVfTUkyU10uY2hhbm5lbHMgPQorCQlyb3VuZHVwX3Bvd19vZl90d28odWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAyKTsKKworCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBpbnRfbWkyc19jZmdbSU5UNV9NSTJTXS5jaGFubmVscyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2ludF9lbmFibGVfZGlnX2NkY19jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIGludCBlbmFibGUsIGJvb2wgZGFwbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisJaW50IGNsa19mcmVxX2luX2h6OworCWJvb2wgaW50X21jbGswX2ZyZXFfY2hnID0gZmFsc2U7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOworCXByX2RlYnVnKCIlczogZW5hYmxlICVkIG1jbGsgcmVmIGNvdW50ZXIgJWRcbiIsCisJCSAgIF9fZnVuY19fLCBlbmFibGUsCisJCSAgIGF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpKTsKKwlpZiAoZW5hYmxlKSB7CisJCWlmIChpbnRfbWkyc19jZmdbSU5UMF9NSTJTXS5zYW1wbGVfcmF0ZSA9PQorCQkJCVNBTVBMSU5HX1JBVEVfNDRQMUtIWikKKwkJCWNsa19mcmVxX2luX2h6ID0gTkFUSVZFX01DTEtfUkFURTsKKwkJZWxzZQorCQkJY2xrX2ZyZXFfaW5faHogPSBwZGF0YS0+bWNsa19mcmVxOworCisJCWlmIChwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuY2xrX2ZyZXFfaW5faHoKKwkJCQkhPSBjbGtfZnJlcV9pbl9oeikKKwkJCWludF9tY2xrMF9mcmVxX2NoZyA9IHRydWU7CisJCWlmICghYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgfHwKKwkJCQlpbnRfbWNsazBfZnJlcV9jaGcpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKKwkJCQkJJnBkYXRhLT5kaXNhYmxlX2ludF9tY2xrMF93b3JrKTsKKwkJCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwkJCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSA9PSBmYWxzZSB8fAorCQkJCWludF9tY2xrMF9mcmVxX2NoZykgeworCQkJCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5jbGtfZnJlcV9pbl9oeiA9CisJCQkJCQkJY2xrX2ZyZXFfaW5faHo7CisJCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7CisJCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192MigKKwkJCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAorCQkJCQkmcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIENDTEtcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJCQltdXRleF91bmxvY2soCisJCQkJCQkmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQlwcl9kZWJ1ZygiZW5hYmxlZCBkaWdpdGFsIGNvZGVjIGNvcmUgY2xrXG4iKTsKKwkJCQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIHRydWUpOworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7CisJCX0KKwkJYXRvbWljX2luYygmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKTsKKwl9IGVsc2UgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBkYXRhLT5kaXNhYmxlX2ludF9tY2xrMF93b3JrKTsKKwkJbXV0ZXhfbG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkgPT0gdHJ1ZSkgeworCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDA7CisJCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAorCQkJCUFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWCwKKwkJCQkmcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBkaXNhYmxlIENDTEtcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKKwkJfQorCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsb29wYmFja19tY2xrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG9vcGJhY2tfbWNsa19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7CisJcHJfZGVidWcoIiVzOiBtY2xrX3JzY19yZWYgJWQgZW5hYmxlICVsZFxuIiwKKwkJCV9fZnVuY19fLCBhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSwKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAxOgorCQlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV0NELCAiaW50X3BkbSIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIHRoZSBwcmkgZ3Bpb3M6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWJyZWFrOworCQl9CisJCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwkJaWYgKCghYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikpICYmCisJCQkJKCFhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSkpIHsKKwkJCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5lbmFibGUgPSAxOworCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192MigKKwkJCQlBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCisJCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBlbmFibGUgdGhlIE1DTEs6ICVkXG4iLAorCQkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7CisJCQkJcmV0ID0gbXNtX2dwaW9zZXRfc3VzcGVuZChDTElFTlRfV0NELAorCQkJCQkJCQkiaW50X3BkbSIpOworCQkJCWlmIChyZXQpCisJCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBkaXNhYmxlIHRoZSBwcmkgZ3Bpb3M6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkLCB0cnVlKTsKKwkJfQorCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwkJYXRvbWljX2luYygmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKTsKKwkJbXNtOHgxNl93Y2RfbWNsa19lbmFibGUoY29kZWMsIDEsIHRydWUpOworCQlicmVhazsKKwljYXNlIDA6CisJCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSA8PSAwKQorCQkJYnJlYWs7CisJCW1zbTh4MTZfd2NkX21jbGtfZW5hYmxlKGNvZGVjLCAwLCB0cnVlKTsKKwkJbXV0ZXhfbG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCQlpZiAoKCFhdG9taWNfZGVjX3JldHVybigmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSkgJiYKKwkJCQkoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkpKSB7CisJCQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuZW5hYmxlID0gMDsKKwkJCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCisJCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAorCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZGlzYWJsZSB0aGUgQ0NMSzogJWRcbiIsCisJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgZmFsc2UpOworCQl9CisJCW11dGV4X3VubG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOworCQlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XQ0QsICJpbnRfcGRtIik7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZGlzYWJsZSB0aGUgcHJpIGdwaW9zOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IFVuZXhwZWN0ZWQgaW5wdXQgdmFsdWVcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qCisJICogU2xpbWJ1c183X1J4L1R4IHNhbXBsZSByYXRlIHZhbHVlcyBzaG91bGQgYWx3YXlzIGJlIGluIHN5bmMgKHNhbWUpCisJICogd2hlbiB1c2VkIGZvciBCVF9TQ08gdXNlIGNhc2UuIFJldHVybiBlaXRoZXIgUnggb3IgVHggc2FtcGxlIHJhdGUKKwkgKiB2YWx1ZS4KKwkgKi8KKwlzd2l0Y2ggKGJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGUgPSAlZCIsIF9fZnVuY19fLAorCQkgYnRfZm1fY2ZnW0JUX1NMSU03XS5zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fYnRfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMToKKwkJYnRfZm1fY2ZnW0JUX1NMSU03XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYnRfZm1fY2ZnW0JUX1NMSU03XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQlidF9mbV9jZmdbQlRfU0xJTTddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZXM6IHNsaW03X3J4ID0gJWQsIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywKKwkJIGJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSU5UMF9NSTJTX1JYIEZvcm1hdCIsIGludDBfbWkyc19yeF9mb3JtYXQsCisJCSAgICAgaW50X21pMnNfYml0X2Zvcm1hdF9nZXQsIGludF9taTJzX2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIklOVDJfTUkyU19UWCBGb3JtYXQiLCBpbnQyX21pMnNfdHhfZm9ybWF0LAorCQkgICAgIGludF9taTJzX2JpdF9mb3JtYXRfZ2V0LCBpbnRfbWkyc19iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJJTlQzX01JMlNfVFggRm9ybWF0IiwgaW50M19taTJzX3R4X2Zvcm1hdCwKKwkJICAgICBpbnRfbWkyc19iaXRfZm9ybWF0X2dldCwgaW50X21pMnNfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UMF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBpbnQwX21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UMl9NSTJTX1RYIFNhbXBsZVJhdGUiLCBpbnQyX21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UM19NSTJTX1RYIFNhbXBsZVJhdGUiLCBpbnQzX21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UMF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBpbnQwX21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UMl9NSTJTX1RYIFNhbXBsZVJhdGUiLCBpbnQyX21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UM19NSTJTX1RYIFNhbXBsZVJhdGUiLCBpbnQzX21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UMF9NSTJTX1JYIENoYW5uZWxzIiwgaW50MF9taTJzX3J4X2NocywKKwkJCWludF9taTJzX2NoX2dldCwgaW50X21pMnNfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIklOVDJfTUkyU19UWCBDaGFubmVscyIsIGludDJfbWkyc190eF9jaHMsCisJCQlpbnRfbWkyc19jaF9nZXQsIGludF9taTJzX2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJJTlQzX01JMlNfVFggQ2hhbm5lbHMiLCBpbnQzX21pMnNfdHhfY2hzLAorCQkJaW50X21pMnNfY2hfZ2V0LCBpbnRfbWkyc19jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiTG9vcGJhY2sgTUNMSyIsIGxvb3BiYWNrX21jbGtfZW4sCisJCSAgICAgbG9vcGJhY2tfbWNsa19nZXQsIGxvb3BiYWNrX21jbGtfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkJUIFNhbXBsZVJhdGUiLCBidF9zYW1wbGVfcmF0ZSwKKwkJCW1zbV9idF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltc21fYnRfc2FtcGxlX3JhdGVfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fc3dyX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJJTlQ0X01JMlNfUlggRm9ybWF0IiwgaW50NF9taTJzX3J4X2Zvcm1hdCwKKwkJICAgICBpbnRfbWkyc19iaXRfZm9ybWF0X2dldCwgaW50X21pMnNfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UNF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBpbnQ0X21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UNF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBpbnQ0X21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQsCisJCQlpbnRfbWkyc19zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiSU5UNF9NSTJTX1JYIENoYW5uZWxzIiwgaW50NF9taTJzX3J4X2NocywKKwkJCWludF9taTJzX2NoX2dldCwgaW50X21pMnNfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlZJX0ZFRURfVFggQ2hhbm5lbHMiLCBpbnQ1X21pMnNfdHhfY2hzLAorCQkgICAgIG1zbV92aV9mZWVkX3R4X2NoX2dldCwgbXNtX3ZpX2ZlZWRfdHhfY2hfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RtaWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlpbnQgcmV0ID0gMDsKKworCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7CisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSBtc21fZ3Bpb3NldF9hY3RpdmF0ZShDTElFTlRfV0NELCAiZG1pY19ncGlvIik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgYWN0aXZhdGVkICVzZCIsCisJCQkJCV9fZnVuY19fLCAiZG1pY19ncGlvIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XQ0QsICJkbWljX2dwaW8iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBkZS1hY3RpdmF0ZWQgJXNkIiwKKwkJCQkJX19mdW5jX18sICJkbWljX2dwaW8iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogaW52YWxpZCBEQVBNIGV2ZW50ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2ludF9tY2xrMF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJaW50IHJldCA9IDA7CisKKwlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOworCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXByX2RlYnVnKCIlczogbWNsa19yZXNfcmVmID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikpOworCQlyZXQgPSBtc21fZ3Bpb3NldF9zdXNwZW5kKENMSUVOVF9XQ0QsICJpbnRfcGRtIik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgZGUtYWN0aXZhdGVkICVzZCIsCisJCQkJCV9fZnVuY19fLCAiaW50X3BkbSIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgPT0gMCkgeworCQkJcHJfZGVidWcoIiVzOiBkaXNhYmxpbmcgTUNMS1xuIiwgX19mdW5jX18pOworCQkJLyogZGlzYWJsZSB0aGUgY29kZWMgbWNsayBjb25maWcqLworCQkJbXNtOHgxNl93Y2RfbWNsa19lbmFibGUoY29kZWMsIDAsIHRydWUpOworCQkJbXNtX2ludF9lbmFibGVfZGlnX2NkY19jbGsoY29kZWMsIDAsIHRydWUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGludmFsaWQgREFQTSBldmVudCAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludF9taTJzX2dldF9wb3J0X2lkKGludCBiZV9pZCkKK3sKKwlpbnQgYWZlX3BvcnRfaWQ7CisKKwlzd2l0Y2ggKGJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBiZV9pZDogJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7CisJCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYWZlX3BvcnRfaWQ7Cit9CisKK3N0YXRpYyBpbnQgaW50X21pMnNfZ2V0X2luZGV4KGludCBwb3J0X2lkKQoreworCWludCBpbmRleDsKKworCXN3aXRjaCAocG9ydF9pZCkgeworCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOgorCQlpbmRleCA9IElOVDBfTUkyUzsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6CisJCWluZGV4ID0gSU5UMl9NSTJTOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKKwkJaW5kZXggPSBJTlQzX01JMlM7CisJCWJyZWFrOworCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOgorCQlpbmRleCA9IElOVDRfTUkyUzsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6CisJCWluZGV4ID0gSU5UNV9NSTJTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQ6ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCWluZGV4ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2ludF9taTJzX2JpdHNfcGVyX3NhbXBsZSh1MzIgYml0X2Zvcm1hdCkKK3sKKwl1MzIgYml0X3Blcl9zYW1wbGU7CisKKwlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRfcGVyX3NhbXBsZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCWJpdF9wZXJfc2FtcGxlID0gMTY7CisJCWJyZWFrOworCX0KKworCXJldHVybiBiaXRfcGVyX3NhbXBsZTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2ludF9taTJzX2Nsa192YWwoaW50IGlkeCwgaW50IHN0cmVhbSkKK3sKKwl1MzIgYml0X3Blcl9zYW1wbGU7CisKKwliaXRfcGVyX3NhbXBsZSA9CisJICAgIGdldF9pbnRfbWkyc19iaXRzX3Blcl9zYW1wbGUoaW50X21pMnNfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7CisJaW50X21pMnNfY2xrW2lkeF0uY2xrX2ZyZXFfaW5faHogPQorCSAgICAoaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgKiBpbnRfbWkyc19jZmdbaWR4XS5jaGFubmVscworCQkJCQkqIGJpdF9wZXJfc2FtcGxlKTsKK30KKworc3RhdGljIGludCBpbnRfbWkyc19zZXRfc2NsayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3J0X2lkID0gMDsKKwlpbnQgaW5kZXg7CisKKwlwb3J0X2lkID0gaW50X21pMnNfZ2V0X3BvcnRfaWQocnRkLT5kYWlfbGluay0+YmVfaWQpOworCWlmIChJU19FUlJfVkFMVUUocG9ydF9pZCkpIHsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzOiBJbnZhbGlkIHBvcnRfaWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gcG9ydF9pZDsKKwkJZ290byBkb25lOworCX0KKwlpbmRleCA9IGludF9taTJzX2dldF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlczogSW52YWxpZCBwb3J0X2lkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHBvcnRfaWQ7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGVuYWJsZSkgeworCQl1cGRhdGVfaW50X21pMnNfY2xrX3ZhbChpbmRleCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IGNsb2NrIHJhdGUgJXVsXG4iLCBfX2Z1bmNfXywKKwkJCWludF9taTJzX2Nsa1tpbmRleF0uY2xrX2ZyZXFfaW5faHopOworCX0KKworCWludF9taTJzX2Nsa1tpbmRleF0uZW5hYmxlID0gZW5hYmxlOworCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIocG9ydF9pZCwKKwkJCQkgICAgICZpbnRfbWkyc19jbGtbaW5kZXhdKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBhZmUgbHBhc3MgY2xvY2sgZmFpbGVkIGZvciBwb3J0IDB4JXggLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9zd3JfbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKworCXJldCA9IGludF9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgdHJ1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBzY2xrICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBFbmFibGUgdGhlIGNvZGVjIG1jbGsgY29uZmlnICovCisJcmV0ID0gbXNtX2dwaW9zZXRfYWN0aXZhdGUoQ0xJRU5UX1dDRCwgInN3cl9waW4iKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgYWN0aXZhdGVkICVzZCIsCisJCQkJX19mdW5jX18sICJzd3JfcGluIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IHNldCBmbXQgY3B1IGRhaSBmYWlsZWQ7IHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc21fc3dyX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCisJcmV0ID0gaW50X21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6Y2xvY2sgZGlzYWJsZSBmYWlsZWQ7IHJldD0lZFxuIiwgX19mdW5jX18sCisJCQkJcmV0KTsKK30KKworc3RhdGljIGludCBtc21faW50X21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKworCXJldCA9IGludF9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgdHJ1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBzY2xrICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSAgbXNtX2ludF9lbmFibGVfZGlnX2NkY19jbGsoY29kZWMsIDEsIHRydWUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiZmFpbGVkIHRvIGVuYWJsZSBtY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogRW5hYmxlIHRoZSBjb2RlYyBtY2xrIGNvbmZpZyAqLworCXJldCA9IG1zbV9ncGlvc2V0X2FjdGl2YXRlKENMSUVOVF9XQ0QsICJpbnRfcGRtIik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGFjdGl2YXRlZCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgImludF9wZG0iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbXNtOHgxNl93Y2RfbWNsa19lbmFibGUoY29kZWMsIDEsIHRydWUpOworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IHNldCBmbXQgY3B1IGRhaSBmYWlsZWQ7IHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc21faW50X21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCisJcmV0ID0gaW50X21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6Y2xvY2sgZGlzYWJsZSBmYWlsZWQ7IHJldD0lZFxuIiwgX19mdW5jX18sCisJCQkJcmV0KTsKKwlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgPiAwKSB7CisJCWF0b21pY19kZWMoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZik7CisJCXByX2RlYnVnKCIlczogZGVjcmVtZW50aW5nIG1jbGtfcmVzX3JlZiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywKKwkJCSBhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCAqZGVmX21zbV9pbnRfd2NkX21iaGNfY2FsKHZvaWQpCit7CisJdm9pZCAqbXNtX2ludF93Y2RfY2FsOworCXN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2NmZzsKKwl1MTYgKmJ0bl9sb3csICpidG5faGlnaDsKKworCW1zbV9pbnRfd2NkX2NhbCA9IGt6YWxsb2MoV0NEX01CSENfQ0FMX1NJWkUoV0NEX01CSENfREVGX0JVVFRPTlMsCisJCQkJV0NEX01CSENfREVGX1JMT0FEUyksIEdGUF9LRVJORUwpOworCWlmICghbXNtX2ludF93Y2RfY2FsKQorCQlyZXR1cm4gTlVMTDsKKworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIobXNtX2ludF93Y2RfY2FsKS0+WCkgPSAoWSkpCisJUyh2X2hzX21heCwgMTUwMCk7CisjdW5kZWYgUworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1zbV9pbnRfd2NkX2NhbCktPlgpID0gKFkpKQorCVMobnVtX2J0biwgV0NEX01CSENfREVGX0JVVFRPTlMpOworI3VuZGVmIFMKKworCisJYnRuX2NmZyA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUihtc21faW50X3djZF9jYWwpOworCWJ0bl9sb3cgPSBidG5fY2ZnLT5fdl9idG5fbG93OworCWJ0bl9oaWdoID0gKCh2b2lkICopJmJ0bl9jZmctPl92X2J0bl9sb3cpICsKKwkJKHNpemVvZihidG5fY2ZnLT5fdl9idG5fbG93WzBdKSAqIGJ0bl9jZmctPm51bV9idG4pOworCisJLyoKKwkgKiBJbiBTVyB3ZSBhcmUgbWFpbnRhaW5pbmcgdHdvIHNldHMgb2YgdGhyZXNob2xkIHJlZ2lzdGVyCisJICogb25lIGZvciBjdXJyZW50IHNvdXJjZSBhbmQgYW5vdGhlciBmb3IgTWljYmlhcy4KKwkgKiBhbGwgYnRuX2xvdyBjb3JyZXNwb25kcyB0byB0aHJlc2hvbGQgZm9yIGN1cnJlbnQgc291cmNlCisJICogYWxsIGJ0X2hpZ2ggY29ycmVzcG9uZHMgdG8gdGhyZXNob2xkIGZvciBNaWNiaWFzCisJICogQmVsb3cgdGhyZXNob2xkcyBhcmUgYmFzZWQgb24gZm9sbG93aW5nIHJlc2lzdGFuY2VzCisJICogMC03MCAgICA9PSBCdXR0b24gMAorCSAqIDExMC0xODAgPT0gQnV0dG9uIDEKKwkgKiAyMTAtMjkwID09IEJ1dHRvbiAyCisJICogMzYwLTY4MCA9PSBCdXR0b24gMworCSAqLworCWJ0bl9sb3dbMF0gPSA3NTsKKwlidG5faGlnaFswXSA9IDc1OworCWJ0bl9sb3dbMV0gPSAxNTA7CisJYnRuX2hpZ2hbMV0gPSAxNTA7CisJYnRuX2xvd1syXSA9IDIyNTsKKwlidG5faGlnaFsyXSA9IDIyNTsKKwlidG5fbG93WzNdID0gNDUwOworCWJ0bl9oaWdoWzNdID0gNDUwOworCWJ0bl9sb3dbNF0gPSA1MDA7CisJYnRuX2hpZ2hbNF0gPSA1MDA7CisKKwlyZXR1cm4gbXNtX2ludF93Y2RfY2FsOworfQorCitzdGF0aWMgaW50IG1zbV9hdWRyeF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQorCQkJc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCByZXQgPSAtRU5PTUVNOworCisJcHJfZGVidWcoIiVzKCksZGV2X25hbWUlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGNwdV9kYWktPmRldikpOworCisJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIG1zbV9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKG1zbV9zbmRfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtc21fY29tbW9uX3NuZF9jb250cm9scywKKwkJCUFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOworCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtc21faW50X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUobXNtX2ludF9kYXBtX3dpZGdldHMpKTsKKworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTZWNvbmRhcnkgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMiIpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJFQVIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhFQURQSE9ORSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLX09VVCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUMyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDMyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzEiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDMyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzQiKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJbXNtOHgxNl93Y2Rfc3BrX2V4dF9wYV9jYihlbmFibGVfc3BrX2V4dF9wYSwgY29kZWMpOworCW1zbTh4MTZfd2NkX2hwaF9jb21wX2NiKG1zbV9jb25maWdfaHBoX2NvbXBhbmRlcl9ncGlvLCBjb2RlYyk7CisKKwltYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uID0gZGVmX21zbV9pbnRfd2NkX21iaGNfY2FsKCk7CisJaWYgKG1iaGNfY2ZnX3B0ci0+Y2FsaWJyYXRpb24pIHsKKwkJcmV0ID0gbXNtOHgxNl93Y2RfaHNfZGV0ZWN0KGNvZGVjLCBtYmhjX2NmZ19wdHIpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBtc204eDE2X3djZF9oc19kZXRlY3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlrZnJlZShtYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3N3cl9hdWRyeF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQorCQkJc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3N3cl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUobXNtX3N3cl9jb250cm9scykpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxX1NXUiBQbGF5YmFjayIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklmZWVkX1NXUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMSBPVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzIgT1VUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxX1NXUiBWSSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklJTlBVVF9TV1IiKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3djbl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJdW5zaWduZWQgaW50IHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdID0gezE1NywgMTU4fTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF0gID0gezE1OSwgMTYwLCAxNjF9OworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisKKwlyZXR1cm4gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCisJCQkJCSAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOworfQorCitzdGF0aWMgaW50IG1zbV93Y25faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKwl1MzIgcnhfY2hbV0NOX0NEQ19TTElNX1JYX0NIX01BWF0sIHR4X2NoW1dDTl9DRENfU0xJTV9UWF9DSF9NQVhdOworCXUzMiByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOworCWludCByZXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6ICVzX3R4X2RhaV9pZF8lZFxuIiwgX19mdW5jX18sCisJCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQpOworCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gZ2V0IEJURk0gY29kZWMgY2hhbiBtYXBcbiwgZXJyOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHR4X2NoX2NudCglZCkgYmVfaWQgJWRcbiIsCisJCV9fZnVuY19fLCB0eF9jaF9jbnQsIGRhaV9saW5rLT5iZV9pZCk7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKKwkJCQkJICB0eF9jaF9jbnQsIHR4X2NoLCByeF9jaF9jbnQsIHJ4X2NoKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRkbV9wYXJhbV9zZXRfc2xvdF9tYXNrKHUxNiBwb3J0X2lkLCBpbnQgc2xvdF93aWR0aCwKKwkJCQkJICAgIGludCBzbG90cykKK3sKKwl1bnNpZ25lZCBpbnQgc2xvdF9tYXNrID0gMDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgKnNsb3Rfb2Zmc2V0OworCisJZm9yIChpID0gVERNXzA7IGkgPCBURE1fUE9SVF9NQVg7IGkrKykgeworCQlzbG90X29mZnNldCA9IHRkbV9zbG90X29mZnNldFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgVERNX1NMT1RfT0ZGU0VUX01BWDsgaisrKSB7CisJCQlpZiAoc2xvdF9vZmZzZXRbal0gIT0gQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRCkKKwkJCQlzbG90X21hc2sgfD0KKwkJCQkoMSA8PCAoKHNsb3Rfb2Zmc2V0W2pdICogOCkgLyBzbG90X3dpZHRoKSk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gc2xvdF9tYXNrOworfQorCitzdGF0aWMgaW50IG1zbV90ZG1fc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IHJldCA9IDA7CisJaW50IGNoYW5uZWxzLCBzbG90X3dpZHRoLCBzbG90czsKKwl1bnNpZ25lZCBpbnQgc2xvdF9tYXNrOworCXVuc2lnbmVkIGludCAqc2xvdF9vZmZzZXQ7CisJaW50IG9mZnNldF9jaGFubmVscyA9IDA7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXM6IGRhaSBpZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBjcHVfZGFpLT5pZCk7CisKKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXN3aXRjaCAoY2hhbm5lbHMpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwljYXNlIDc6CisJY2FzZSA4OgorCQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQkvKgorCQkgKiB1cCB0byA4IGNoYW5uZWxzIEhXIGNvbmZpZyBzaG91bGQKKwkJICogdXNlIDMyIGJpdCBzbG90IHdpZHRoIGZvciBtYXggc3VwcG9ydCBvZgorCQkgKiBzdHJlYW0gYml0IHdpZHRoLiAoc2xvdF93aWR0aCA+IGJpdF93aWR0aCkKKwkJICovCisJCQlzbG90X3dpZHRoID0gMzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gZm9ybWF0IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzbG90cyA9IDg7CisJCXNsb3RfbWFzayA9IHRkbV9wYXJhbV9zZXRfc2xvdF9tYXNrKGNwdV9kYWktPmlkLAorCQkJCQkJICAgIHNsb3Rfd2lkdGgsCisJCQkJCQkgICAgc2xvdHMpOworCQlpZiAoIXNsb3RfbWFzaykgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBzbG90X21hc2sgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgc2xvdF9tYXNrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gY2hhbm5lbHMgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBURE1fUlhfMCBhbmQgVERNX1RYXzAgKi8KKwlzd2l0Y2ggKGNwdV9kYWktPmlkKSB7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCQlzbG90X29mZnNldCA9IHRkbV9zbG90X29mZnNldFtURE1fMF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGRhaSBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVERNX1NMT1RfT0ZGU0VUX01BWDsgaSsrKSB7CisJCWlmIChzbG90X29mZnNldFtpXSAhPSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEKQorCQkJb2Zmc2V0X2NoYW5uZWxzKys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChvZmZzZXRfY2hhbm5lbHMgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBzbG90IG9mZnNldCBub3Qgc3VwcG9ydGVkLCBvZmZzZXRfY2hhbm5lbHMgJWRcbiIsCisJCQlfX2Z1bmNfXywgb2Zmc2V0X2NoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5uZWxzID4gb2Zmc2V0X2NoYW5uZWxzKSB7CisJCXByX2VycigiJXM6IGNoYW5uZWxzICVkIGV4Y2VlZCBvZmZzZXRfY2hhbm5lbHMgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2hhbm5lbHMsIG9mZnNldF9jaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjcHVfZGFpLCAwLCBzbG90X21hc2ssCisJCQkJCSAgICAgICBzbG90cywgc2xvdF93aWR0aCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IHRkbSBzbG90LCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCBOVUxMLAorCQkJCQkJICBjaGFubmVscywgc2xvdF9vZmZzZXQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjaGFubmVsIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgc2xvdF9tYXNrLCAwLAorCQkJCQkgICAgICAgc2xvdHMsIHNsb3Rfd2lkdGgpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgY2hhbm5lbHMsCisJCQkJCQkgIHNsb3Rfb2Zmc2V0LCAwLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2hhbm5lbCBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorZW5kOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3RkbV9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV90ZG1fc25kX2h3X3BhcmFtcworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fd2NuX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbXNtX3djbl9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9taTJzX2JlX29wcyA9IHsKKwkuc3RhcnR1cCA9IG1zbV9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbV9taTJzX3NuZF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2F1eF9wY21fYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAsCisJLnNodXRkb3duID0gbXNtX2F1eF9wY21fc25kX3NodXRkb3duLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21faW50X21pMnNfYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtX2ludF9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbV9pbnRfbWkyc19zbmRfc2h1dGRvd24sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9zd3JfbWkyc19iZV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBtc21fc3dyX21pMnNfc25kX3N0YXJ0dXAsCisJLnNodXRkb3duID0gbXNtX3N3cl9taTJzX3NuZF9zaHV0ZG93biwKK307CisKKy8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21faW50X2RhaVtdID0geworCS8qIEZyb250RW5kIERBSSBMaW5rcyAqLworCXsvKiBodzp4LDAgKi8KKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMSksCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3AuMCIsCisJCS5keW5hbWljID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMQorCX0sCisJey8qIGh3OngsMSAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWEyKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIiwKKwkJLmNwdV9kYWlfbmFtZSAgID0gIk11bHRpTWVkaWEyIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsCisJfSwKKwl7LyogaHc6eCwyICovCisJCS5uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLAorCX0sCisJey8qIGh3OngsMyAqLworCQkubmFtZSA9ICJNU00gVm9JUCIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb0lQIiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJWb0lQIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS12b2lwLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9WT0lQLAorCX0sCisJey8qIGh3OngsNCAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMKSwKKwkJLnN0cmVhbV9uYW1lID0gIlVMTCIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTMiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3AuMiIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAorCX0sCisJLyogSG9zdGxlc3MgUENNIHB1cnBvc2UgKi8KKwl7LyogaHc6eCw1ICovCisJCS5uYW1lID0gIklOVDQgTUkyU19SWCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJJTlQ0IE1JMlNfUlggSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIklOVDRfTUkyU19SWF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lCT0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkvKiBUaGlzIGRhaW5saW5rIGhhcyBNSTJTIHN1cHBvcnQgKi8KKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCw2ICovCisJCS5uYW1lID0gIk1TTSBBRkUtUENNIFJYIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBSWCIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQxIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWFmZSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7LyogaHc6eCw3ICovCisJCS5uYW1lID0gIk1TTSBBRkUtUENNIFRYIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBUWCIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQwIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWFmZSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7LyogaHc6eCw4ICovCisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczEpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MxIiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhNCIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsCisJfSwKKwl7LyogaHc6eCw5Ki8KKwkJLm5hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgICA9ICJBVVhQQ01fSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsvKiBodzp4LDEwICovCisJCS5uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzEgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMxX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsIC8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMTEgKi8KKwkJLm5hbWUgPSAiU0xJTUJVU18zIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzNfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwgLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCwxMiAqLworCQkubmFtZSA9ICJTTElNQlVTXzQgSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTNF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsvKiBodzp4LDEzICovCisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShMb3dMYXRlbmN5KSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE1IiwKKwkJLmNwdV9kYWlfbmFtZSAgID0gIk11bHRpTWVkaWE1IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjEiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LAorCX0sCisJLyogTFNNIEZFICovCisJey8qIGh3OngsMTQgKi8KKwkJLm5hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU00xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTEsCisJfSwKKwl7LyogaHc6eCwxNSAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MyKSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMiIsCisJCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhNyIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywKKwl9LAorCXsvKiBodzp4LDE2ICovCisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczMpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MzIiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTAiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwKKwl9LAorCXsvKiBodzp4LDE3ICovCisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTExfTk9JUlEpLAorCQkuc3RyZWFtX25hbWUgPSAiTU1fTk9JUlEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWE4IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsCisJfSwKKwl7LyogaHc6eCwxOCAqLworCQkubmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKKwkJLnN0cmVhbV9uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAorCQkuY3B1X2RhaV9uYW1lCT0gIkhETUlfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCwxOSAqLworCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwKKwl9LAorCXsvKiBodzp4LDIwICovCisJCS5uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU00yLAorCX0sCisJey8qIGh3OngsMjEgKi8KKwkJLm5hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU00zIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTMsCisJfSwKKwl7LyogaHc6eCwyMiAqLworCQkubmFtZSA9ICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAorCQkuY3B1X2RhaV9uYW1lID0gIkxTTTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNCwKKwl9LAorCXsvKiBodzp4LDIzICovCisJCS5uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU001LAorCX0sCisJey8qIGh3OngsMjQgKi8KKwkJLm5hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNiBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU002IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTYKKwl9LAorCXsvKiBodzp4LDI1ICovCisJCS5uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9MU003LAorCX0sCisJey8qIGh3OngsMjYgKi8KKwkJLm5hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gOCBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU004IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuYmVfaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTgsCisJfSwKKwl7LyogaHc6eCwyNyAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWE5KSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE5IiwKKwkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhOSIsCisJCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4wIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5iZV9pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksCisJfSwKKwl7LyogaHc6eCwyOCAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M0KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzNCIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTExIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsCisJfSwKKwl7LyogaHc6eCwyOSAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M1KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzNSIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEyIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsCisJfSwKKwl7LyogaHc6eCwzMCAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M2KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzNiIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEzIiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsCisJfSwKKwl7LyogaHc6eCwzMSAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M3KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzNyIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTE0IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsCisJfSwKKwl7LyogaHc6eCwzMiAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M4KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzOCIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTE1IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsCisJfSwKKwl7LyogaHc6eCwzMyAqLworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3M5KSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzOSIsCisJCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTE2IiwKKwkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsCisJfSwKKwl7LyogaHc6eCwzNCAqLworCQkubmFtZSA9ICJTTElNQlVTXzggSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMzUgKi8KKwkJLm5hbWUgPSBMUEFTU19CRV9JTlQ1X01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJJTlQ1X21pMnMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5jb2RlY19uYW1lID0gIm1zbV9zd3JfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX3N3cl92aWZlZWRiYWNrIiwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOVDVfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGludF9taTJzX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fc3dyX21pMnNfYmVfb3BzLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7LyogaHc6eCwzNiAqLworCQkubmFtZSA9ICJQcmltYXJ5IE1JMlNfUlggSG9zdGxlc3MiLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTX1JYIEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJQUklfTUkyU19SWF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lCT0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkvKiBUaGlzIGRhaW5saW5rIGhhcyBNSTJTIHN1cHBvcnQgKi8KKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7LyogaHc6eCwzNyAqLworCQkubmFtZSA9ICJTZWNvbmRhcnkgTUkyU19SWCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyU19SWCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0VDX01JMlNfUlhfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLyogVGhpcyBkYWlubGluayBoYXMgTUkyUyBzdXBwb3J0ICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMzggKi8KKwkJLm5hbWUgPSAiVGVydGlhcnkgTUkyU19SWCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTX1JYIEhvc3RsZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJURVJUX01JMlNfUlhfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLyogVGhpcyBkYWlubGluayBoYXMgTUkyUyBzdXBwb3J0ICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJey8qIGh3OngsMzkgKi8KKwkJLm5hbWUgPSAiSU5UMCBNSTJTX1JYIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIklOVDAgTUkyU19SWCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiSU5UMF9NSTJTX1JYX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUJPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS8qIFRoaXMgZGFpbmxpbmsgaGFzIE1JMlMgc3VwcG9ydCAqLworCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCS8qIEJhY2tlbmQgSTJTIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9JTlQwX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJJTlQwIE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy43IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgICAgID0gImNham9uX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbTh4MTZfd2NkX2kyc19yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUgfAorCQkJQVNZTkNfRFBDTV9TTkRfU09DX0hXX1BBUkFNUywKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwkJLmluaXQgPSAmbXNtX2F1ZHJ4X2luaXQsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBpbnRfbWkyc19iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2ludF9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9JTlQ0X01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJJTlQ0IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbV9zd3JfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX3N3cl9pMnNfcngxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwkJLmluaXQgPSAmbXNtX3N3cl9hdWRyeF9pbml0LAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gaW50X21pMnNfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9zd3JfbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5UMl9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiSU5UMiBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy45IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgICAgID0gImNham9uX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbTh4MTZfd2NkX2kyc190eDIiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSB8CisJCQlBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gaW50X21pMnNfYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9pbnRfbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfSU5UM19NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiSU5UMyBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lICAgICA9ICJjYWpvbl9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc204eDE2X3djZF9pMnNfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUgfAorCQkJQVNZTkNfRFBDTV9TTkRfU09DX0hXX1BBUkFNUywKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGludF9taTJzX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21faW50X21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBSZWNvcmQgVXBsaW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBVcGxpbmsgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSAgICAgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIFJlY29yZCBEb3dubGluayBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9JTkNBTExfUkVDT1JEX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRG93bmxpbmsgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSAgICAgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBNdXNpYyAyIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgICAgID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9VU0JfQVVESU9fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjcyIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9URE1fUlhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfVERNX1JYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODgxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1JYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg5NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1RYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1RYXzAsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY5MTMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX21pMnNfYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19NSTJTX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzW10gPSB7CisJLyogUHJpbWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0FVWFBDTV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwkvKiBTZWNvbmRhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJLyogVGVydGlhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX0FVWFBDTV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJLyogUXVhdGVybmFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfQVVYUENNX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKK307CisKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCisJCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKKwkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KKwkJICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2J0Zm1fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV93Y25fb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzdfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fYnRfc2NvX3NsaW1fdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYnRmbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3djbl9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU184X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czggQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTY0MDEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJidGZtc2xpbV9zbGF2ZSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2ZtX3NsaW1fdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYnRmbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pbml0ID0gJm1zbV93Y25faW5pdCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9pbnRfZGFpX2xpbmtzWworQVJSQVlfU0laRShtc21faW50X2RhaSkgKworQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpICsKK0FSUkFZX1NJWkUobXNtX2F1eHBjbV9iZV9kYWlfbGlua3MpKworQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcyldOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBtc21mYWxjb25fY2FyZCA9IHsKKwkvKiBzbmRfc29jX2NhcmRfbXNtZmFsY29uICovCisJLm5hbWUJCT0gIm1zbWZhbGNvbi1zbmQtY2FyZCIsCisJLmRhaV9saW5rCT0gbXNtX2ludF9kYWksCisJLm51bV9saW5rcwk9IEFSUkFZX1NJWkUobXNtX2ludF9kYWkpLAorfTsKKworc3RhdGljIHZvaWQgbXNtX2Rpc2FibGVfaW50X21jbGswKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7CisJaW50IHJldCA9IDA7CisKKwlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlwZGF0YSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSwKKwkJCWRpc2FibGVfaW50X21jbGswX3dvcmspOworCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKKwlwcl9kZWJ1ZygiJXM6IG1jbGtfZW5hYmxlZCAlZCBtY2xrX3JzY19yZWYgJWRcbiIsIF9fZnVuY19fLAorCQkJYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCksCisJCQlhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkgPT0gdHJ1ZQorCQkJJiYgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgPT0gMCkgeworCQlwcl9kZWJ1ZygiRGlzYWJsZSB0aGUgbWNsa1xuIik7CisJCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5lbmFibGUgPSAwOworCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAorCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAorCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlcyBmYWlsZWQgdG8gZGlzYWJsZSB0aGUgQ0NMS1xuIiwgX19mdW5jX18pOworCQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9pbnRfZHRfcGFyc2VfY2FwX2luZm8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSkKK3sKKwljb25zdCBjaGFyICpleHQxX2NhcCA9ICJxY29tLG1zbS1taWNiaWFzMS1leHQtY2FwIjsKKwljb25zdCBjaGFyICpleHQyX2NhcCA9ICJxY29tLG1zbS1taWNiaWFzMi1leHQtY2FwIjsKKworCXBkYXRhLT5taWNiaWFzMV9jYXBfbW9kZSA9CisJCShvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsIGV4dDFfY2FwKSA/CisJCSBNSUNCSUFTX0VYVF9CWVBfQ0FQIDogTUlDQklBU19OT19FWFRfQllQX0NBUCk7CisKKwlwZGF0YS0+bWljYmlhczJfY2FwX21vZGUgPQorCQkob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCBleHQyX2NhcCkgPworCQkgTUlDQklBU19FWFRfQllQX0NBUCA6IE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVApOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCAqbXNtX2ludF9wb3B1bGF0ZV9zbmRjYXJkX2RhaWxpbmtzKAorCQkJCQkJc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmbXNtZmFsY29uX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaWxpbms7CisJaW50IGxlbjE7CisKKwljYXJkLT5uYW1lID0gZGV2X25hbWUoZGV2KTsKKwlsZW4xID0gQVJSQVlfU0laRShtc21faW50X2RhaSk7CisJbWVtY3B5KG1zbV9pbnRfZGFpX2xpbmtzLCBtc21faW50X2RhaSwgc2l6ZW9mKG1zbV9pbnRfZGFpKSk7CisJZGFpbGluayA9IG1zbV9pbnRfZGFpX2xpbmtzOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCSAgInFjb20sbWkycy1hdWRpby1pbnRmIikpIHsKKwkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAorCQkgICAgICAgbXNtX21pMnNfYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOworCQlsZW4xICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKKwl9CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCisJCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7CisJCW1lbWNweShkYWlsaW5rICsgbGVuMSwKKwkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSk7CisJCWxlbjEgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7CisJfQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSx3Y24tYnRmbSIpKSB7CisJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAorCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCisJCSAgICAgICBzaXplb2YobXNtX3djbl9iZV9kYWlfbGlua3MpKTsKKwkJbGVuMSArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKKwl9CisJY2FyZC0+ZGFpX2xpbmsgPSBkYWlsaW5rOworCWNhcmQtPm51bV9saW5rcyA9IGxlbjE7CisJcmV0dXJuIGNhcmQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2ludGVybmFsX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJY29uc3QgY2hhciAqdHlwZSA9IE5VTEw7CisJY29uc3QgY2hhciAqaHNfbWljYmlhc190eXBlID0gInFjb20sbXNtLWhzLW1pY2JpYXMtdHlwZSI7CisJaW50IHJldDsKKworCXJldCA9IGlzX2V4dF9zcGtfZ3Bpb19zdXBwb3J0KHBkZXYsIHBkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIiVzOiBkb2Vzbid0IHN1cHBvcnQgZXh0ZXJuYWwgc3BlYWtlciBwYVxuIiwKKwkJCV9fZnVuY19fKTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAgICAgIGhzX21pY2JpYXNfdHlwZSwgJnR5cGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwKKwkJCV9fZnVuY19fLCBoc19taWNiaWFzX3R5cGUpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFzdHJjbXAodHlwZSwgImV4dGVybmFsIikpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSGVhZHNldCBpcyB1c2luZyBleHRlcm5hbCBtaWNiaWFzXG4iKTsKKwkJbWJoY19jZmdfcHRyLT5oc19leHRfbWljYmlhcyA9IHRydWU7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSGVhZHNldCBpcyB1c2luZyBpbnRlcm5hbCBtaWNiaWFzXG4iKTsKKwkJbWJoY19jZmdfcHRyLT5oc19leHRfbWljYmlhcyA9IGZhbHNlOworCX0KKworCS8qIGluaXRpYWxpemUgdGhlIGludF9tY2xrMCAqLworCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5jbGtfc2V0X21pbm9yX3ZlcnNpb24gPQorCQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUc7CisJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmNsa19pZCA9CisJCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UX01DTEtfMDsKKwlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuY2xrX2ZyZXFfaW5faHogPQorCQkJcGRhdGEtPm1jbGtfZnJlcTsKKwlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuY2xrX2F0dHJpID0KKwkJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05POworCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5jbGtfcm9vdCA9CisJCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxUOworCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5lbmFibGUgPSAxOworCisJLyogSW5pdGlhbGl6ZSBsb29wYmFjayBtb2RlIHRvIGZhbHNlICovCisJcGRhdGEtPmxiX21vZGUgPSBmYWxzZTsKKworCW1zbV9pbnRfZHRfcGFyc2VfY2FwX2luZm8ocGRldiwgcGRhdGEpOworCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgcGRhdGEpOworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfY2FyZF9uYW1lKGNhcmQsICJxY29tLG1vZGVsIik7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisJLyogaW5pdGlhbGl6ZSB0aW1lciAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZwZGF0YS0+ZGlzYWJsZV9pbnRfbWNsazBfd29yaywKKwkJCSAgbXNtX2Rpc2FibGVfaW50X21jbGswKTsKKwltdXRleF9pbml0KCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7CisJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmLCAwKTsKKwlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZGVmYXVsdCBjb2RlYyBjb25maWd1cmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1zbV9pbnRfY2RjX2luaXQgLSBpbnRlcm5hbCBjb2RlYyBtYWNoaW5lIHNwZWNpZmljIGluaXQuCisgKgorICogQHBkZXY6IHBsYXRmb3JtIGRldmljZSBoYW5kbGUKKyAqIEBwZGF0YTogcHJpdmF0ZSBkYXRhIG9mIG1hY2hpbmUgZHJpdmVyCisgKiBAY2FyZDogc291bmQgY2FyZCBwb2ludGVyIHJlZmVyZW5jZQorICogQG1iaGNfY2ZnOiBNQkhDIGNvbmZpZyByZWZlcmVuY2UKKyAqCisgKiBSZXR1cm5zIDAuCisgKi8KK2ludCBtc21faW50X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCisJCSAgICAgc3RydWN0IHNuZF9zb2NfY2FyZCAqKmNhcmQsCisJCSAgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCit7CisJbWJoY19jZmdfcHRyID0gbWJoY19jZmc7CisKKwkqY2FyZCA9IG1zbV9pbnRfcG9wdWxhdGVfc25kY2FyZF9kYWlsaW5rcygmcGRldi0+ZGV2KTsKKwltc21faW50ZXJuYWxfaW5pdChwZGV2LCBwZGF0YSwgKmNhcmQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtc21faW50X2NkY19pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtZmFsY29uLWludGVybmFsLmggYi9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTNlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL21zbWZhbGNvbi1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTVNNRkFMQ09OX0lOVEVSTkFMCisjZGVmaW5lIF9fTVNNRkFMQ09OX0lOVEVSTkFMCisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2lmZGVmIENPTkZJR19TTkRfU09DX0lOVF9DT0RFQworaW50IG1zbV9pbnRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKKwkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKKwkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZyk7CisjZWxzZQoraW50IG1zbV9pbnRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKKwkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKKwkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbXNrdW5rLmMgYi9zb3VuZC9zb2MvbXNtL21zbXNrdW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMDE5NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vbXNtc2t1bmsuYwpAQCAtMCwwICsxLDYyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8ZGV2aWNlX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgorI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzNHgvd2NkOTM0eC5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtbWJoYy5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy93c2E4ODF4LmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm1zbXNrdW5rLWFzb2Mtc25kIgorCisjZGVmaW5lIF9fQ0hJUFNFVF9fICJNU01TS1VOSyAiCisjZGVmaW5lIE1TTV9EQUlMSU5LX05BTUUobmFtZSkgKF9fQ0hJUFNFVF9fI25hbWUpCisKKyNkZWZpbmUgU0FNUExJTkdfUkFURV84S0haICAgICAgODAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWiAxMTAyNQorI2RlZmluZSBTQU1QTElOR19SQVRFXzE2S0haICAgICAxNjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzIyUDA1S0haICAyMjA1MAorI2RlZmluZSBTQU1QTElOR19SQVRFXzMyS0haICAgICAzMjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzQ0UDFLSFogICA0NDEwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzQ4S0haICAgICA0ODAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzg4UDJLSFogICA4ODIwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzk2S0haICAgICA5NjAwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzE3NlA0S0haICAxNzY0MDAKKyNkZWZpbmUgU0FNUExJTkdfUkFURV8xOTJLSFogICAgMTkyMDAwCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFogIDM1MjgwMAorI2RlZmluZSBTQU1QTElOR19SQVRFXzM4NEtIWiAgICAzODQwMDAKKworI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX0JVVFRPTlMgICAgOAorI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyAgICAgNQorI2RlZmluZSBDT0RFQ19FWFRfQ0xLX1JBVEUgICAgICAgICAgOTYwMDAwMAorI2RlZmluZSBBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMgMzAwMAorI2RlZmluZSBERVZfTkFNRV9TVFJfTEVOICAgICAgICAgICAgMzIKKworI2RlZmluZSBXU0E4ODEwX05BTUVfMSAid3NhODgxeC4yMDE3MDIxMSIKKyNkZWZpbmUgV1NBODgxMF9OQU1FXzIgIndzYTg4MXguMjAxNzAyMTIiCisKKyNkZWZpbmUgV0NOX0NEQ19TTElNX1JYX0NIX01BWCAyCisjZGVmaW5lIFdDTl9DRENfU0xJTV9UWF9DSF9NQVggMworCisjZGVmaW5lIFRETV9DSEFOTkVMX01BWCA4CisjZGVmaW5lIFRETV9TTE9UX09GRlNFVF9NQVggOAorCisjZGVmaW5lIE1TTV9ISUZJX09OIDEKKworZW51bSB7CisJU0xJTV9SWF8wID0gMCwKKwlTTElNX1JYXzEsCisJU0xJTV9SWF8yLAorCVNMSU1fUlhfMywKKwlTTElNX1JYXzQsCisJU0xJTV9SWF81LAorCVNMSU1fUlhfNiwKKwlTTElNX1JYXzcsCisJU0xJTV9SWF9NQVgsCit9OworCitlbnVtIHsKKwlTTElNX1RYXzAgPSAwLAorCVNMSU1fVFhfMSwKKwlTTElNX1RYXzIsCisJU0xJTV9UWF8zLAorCVNMSU1fVFhfNCwKKwlTTElNX1RYXzUsCisJU0xJTV9UWF82LAorCVNMSU1fVFhfNywKKwlTTElNX1RYXzgsCisJU0xJTV9UWF9NQVgsCit9OworCitlbnVtIHsKKwlQUklNX01JMlMgPSAwLAorCVNFQ19NSTJTLAorCVRFUlRfTUkyUywKKwlRVUFUX01JMlMsCisJTUkyU19NQVgsCit9OworCitlbnVtIHsKKwlQUklNX0FVWF9QQ00gPSAwLAorCVNFQ19BVVhfUENNLAorCVRFUlRfQVVYX1BDTSwKKwlRVUFUX0FVWF9QQ00sCisJQVVYX1BDTV9NQVgsCit9OworCitlbnVtIHsKKwlQQ01fSTJTX1NFTF9QUklNID0gMCwKKwlQQ01fSTJTX1NFTF9TRUMsCisJUENNX0kyU19TRUxfVEVSVCwKKwlQQ01fSTJTX1NFTF9RVUFULAorCVBDTV9JMlNfU0VMX01BWCwKK307CisKK3N0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXZvaWQgKnBjbV9pMnNfc2VsX3Z0X2FkZHI7Cit9OworCitzdHJ1Y3QgbWkyc19jb25mIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1MzIgcmVmX2NudDsKKwl1MzIgbXNtX2lzX21pMnNfbWFzdGVyOworfTsKKworc3RydWN0IGF1eHBjbV9jb25mIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1MzIgcmVmX2NudDsKK307CisKK3N0cnVjdCBkZXZfY29uZmlnIHsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTMyIGJpdF9mb3JtYXQ7CisJdTMyIGNoYW5uZWxzOworfTsKKworZW51bSB7CisJRFBfUlhfSURYID0gMCwKKwlFWFRfRElTUF9SWF9JRFhfTUFYLAorfTsKKworc3RydWN0IG1zbV93c2E4ODF4X2Rldl9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJdTMyIGluZGV4OworfTsKKworc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSB7CisJdTMyIG1jbGtfZnJlcTsKKwlpbnQgdXNfZXVyb19ncGlvOyAvKiB1c2VkIGJ5IGdwaW8gZHJpdmVyIEFQSSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdXNfZXVyb19ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhwaF9lbjFfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCisJc3RydWN0IGRldmljZV9ub2RlICpocGhfZW4wX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLworCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKK307CisKK3N0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIHsKKwl2b2lkKiAoKmdldF9hZmVfY29uZmlnX2ZuKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOworCXZvaWQgKCptYmhjX2hzX2RldGVjdF9leGl0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworfTsKKworZW51bSB7CisJVERNXzAgPSAwLAorCVRETV8xLAorCVRETV8yLAorCVRETV8zLAorCVRETV80LAorCVRETV81LAorCVRETV82LAorCVRETV83LAorCVRETV9QT1JUX01BWCwKK307CisKK2VudW0geworCVRETV9QUkkgPSAwLAorCVRETV9TRUMsCisJVERNX1RFUlQsCisJVERNX1FVQVQsCisJVERNX0lOVEVSRkFDRV9NQVgsCit9OworCitzdHJ1Y3QgdGRtX3BvcnQgeworCXUzMiBtb2RlOworCXUzMiBjaGFubmVsOworfTsKKworLyogVERNIGRlZmF1bHQgY29uZmlnICovCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgdGRtX3J4X2NmZ1tURE1fSU5URVJGQUNFX01BWF1bVERNX1BPUlRfTUFYXSA9IHsKKwl7IC8qIFBSSSBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCisJfSwKKwl7IC8qIFNFQyBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCisJfSwKKwl7IC8qIFRFUlQgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLworCX0sCisJeyAvKiBRVUFUIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KKwl9Cit9OworCisvKiBURE0gZGVmYXVsdCBjb25maWcgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB0ZG1fdHhfY2ZnW1RETV9JTlRFUkZBQ0VfTUFYXVtURE1fUE9SVF9NQVhdID0geworCXsgLyogUFJJIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KKwl9LAorCXsgLyogU0VDIFRETSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KKwl9LAorCXsgLyogVEVSVCBURE0gKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCisJfSwKKwl7IC8qIFFVQVQgVERNICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLworCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCisJCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KKwkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLworCX0KK307CisKKy8qVERNIGRlZmF1bHQgb2Zmc2V0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCitzdGF0aWMgdW5zaWduZWQgaW50IHRkbV9zbG90X29mZnNldFtURE1fUE9SVF9NQVhdW1RETV9TTE9UX09GRlNFVF9NQVhdID0geworCXswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjh9LC8qIFRYXzAgfCBSWF8wICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzEgfCBSWF8xICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzIgfCBSWF8yICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzMgfCBSWF8zICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzQgfCBSWF80ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzUgfCBSWF81ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzYgfCBSWF82ICovCisJe0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzcgfCBSWF83ICovCit9OworCisvKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2Ygc2xpbWJ1cyBjaGFubmVscyAqLworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fcnhfY2ZnW10gPSB7CisJW1NMSU1fUlhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9SWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fUlhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1JYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fdHhfY2ZnW10gPSB7CisJW1NMSU1fVFhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0xJTV9UWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NMSU1fVFhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTTElNX1RYXzhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGV4dGVybmFsIGRpc3BsYXkgQkUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBleHRfZGlzcF9yeF9jZmdbXSA9IHsKKwlbRFBfUlhfSURYXSA9ICAge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfcnhfY2ZnID0geworCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCisJLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkuY2hhbm5lbHMgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHVzYl90eF9jZmcgPSB7CisJLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWiwKKwkuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLAorCS5jaGFubmVscyA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IGRldl9jb25maWcgcHJveHlfcnhfY2ZnID0geworCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCisJLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKKwkuY2hhbm5lbHMgPSAyLAorfTsKKworLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3J4X2NmZ1tdID0geworCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKKwlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCisJW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAorCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3R4X2NmZ1tdID0geworCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKKwlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBhdXhfcGNtX3J4X2NmZ1tdID0geworCVtQUklNX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtTRUNfQVVYX1BDTV0gID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtURVJUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorCVtRVUFUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fdHhfY2ZnW10gPSB7CisJW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCisJW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCit9OworCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoID0gMjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fdHhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCQkJCQkJIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwKKwkJCQkJCSJFaWdodCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZpX2ZlZWRfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIn07CitzdGF0aWMgY2hhciBjb25zdCAqYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCisJCQkJCSAgIlMzMl9MRSJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIn07CitzdGF0aWMgY2hhciBjb25zdCAqc2xpbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCisJCQkJCSJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKKwkJCQkJIktIWl84OFAyIiwgIktIWl85NiIsICJLSFpfMTc2UDQiLAorCQkJCQkiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmJ0X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwgIktIWl80OCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVzYl9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCisJCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCisJCQkJCSAgICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKmNoX3RleHRbXSA9IHsiVHdvIiwgIlRocmVlIiwgIkZvdXIiLCAiRml2ZSIsCisJCQkJCSJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKKwkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAorCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCisJCQkJCSJLSFpfODhQMiIsICJLSFpfOTYiLCAiS0haXzE3NlA0IiwKKwkJCQkJIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICpleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAorCQkJCQkJICAiS0haXzE5MiJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCisJCQkJICAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Oworc3RhdGljIGNoYXIgY29uc3QgKnRkbV9iaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMzJfTEUifTsKK3N0YXRpYyBjaGFyIGNvbnN0ICp0ZG1fc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzMyIiwKKwkJCQkJICAgICAiS0haXzQ0UDEiLCAiS0haXzQ4IiwgIktIWl85NiIsCisJCQkJCSAgICAgIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhdXhwY21fcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiJ9Oworc3RhdGljIGNoYXIgY29uc3QgKm1pMnNfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCisJCQkJICAgICAgIktIWl8zMiIsICJLSFpfNDRQMSIsICJLSFpfNDgiLAorCQkJCSAgICAgICJLSFpfOTYiLCAiS0haXzE5MiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pMnNfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAorCQkJCQkgICAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLAorCQkJCQkgICAiRWlnaHQifTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBoaWZpX3RleHRbXSA9IHsiT2ZmIiwgIk9uIn07CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8xX3R4X2Nocywgc2xpbV90eF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV81X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X2Nocywgc2xpbV9yeF9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X2NocywgdXNiX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfY2hzLCB1c2JfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHZpX2ZlZWRfdHhfY2hzLCB2aV9mZWVkX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9jaHMsIGNoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcm94eV9yeF9jaHMsIGNoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzZfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9mb3JtYXQsIGV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8yX3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChidF9zYW1wbGVfcmF0ZSwgYnRfc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl9yeF9zYW1wbGVfcmF0ZSwgdXNiX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfc2FtcGxlX3JhdGUsIHVzYl9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGUsCisJCQkJZXh0X2Rpc3Bfc2FtcGxlX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9jaHMsIHRkbV9jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X2Zvcm1hdCwgdGRtX2JpdF9mb3JtYXRfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9zYW1wbGVfcmF0ZSwgdGRtX3NhbXBsZV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfY2hzLCB0ZG1fY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9mb3JtYXQsIHRkbV9iaXRfZm9ybWF0X3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfc2FtcGxlX3JhdGUsIHRkbV9zYW1wbGVfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7CitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChoaWZpX2Z1bmN0aW9uLCBoaWZpX3RleHQpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BkZXY7CitzdGF0aWMgaW50IG1zbV9oaWZpX2NvbnRyb2w7CisKK3N0YXRpYyBib29sIGlzX2luaXRpYWxfYm9vdDsKK3N0YXRpYyBib29sIGNvZGVjX3JlZ19kb25lOworc3RhdGljIHN0cnVjdCBzbmRfc29jX2F1eF9kZXYgKm1zbV9hdXhfZGV2Oworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgKm1zbV9jb2RlY19jb25mOworc3RhdGljIHN0cnVjdCBtc21fYXNvY193Y2Q5M3h4X2NvZGVjIG1zbV9jb2RlY19mbjsKKworc3RhdGljIHZvaWQgKmRlZl90YXZpbF9tYmhjX2NhbCh2b2lkKTsKK3N0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSk7CitzdGF0aWMgaW50IG1zbV93c2E4ODF4X2luaXQoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpOworCisvKgorICogTmVlZCB0byByZXBvcnQgTElORUlOCisgKiBpZiBSL0wgY2hhbm5lbCBpbXBlZGFuY2UgaXMgbGFyZ2VyIHRoYW4gNUsgb2htCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnIHdjZF9tYmhjX2NmZyA9IHsKKwkucmVhZF9md19iaW4gPSBmYWxzZSwKKwkuY2FsaWJyYXRpb24gPSBOVUxMLAorCS5kZXRlY3RfZXh0bl9jYWJsZSA9IHRydWUsCisJLm1vbm9fc3Rlcm9fZGV0ZWN0aW9uID0gZmFsc2UsCisJLnN3YXBfZ25kX21pYyA9IE5VTEwsCisJLmhzX2V4dF9taWNiaWFzID0gdHJ1ZSwKKwkua2V5X2NvZGVbMF0gPSBLRVlfTUVESUEsCisJLmtleV9jb2RlWzFdID0gS0VZX1ZPSUNFQ09NTUFORCwKKwkua2V5X2NvZGVbMl0gPSBLRVlfVk9MVU1FVVAsCisJLmtleV9jb2RlWzNdID0gS0VZX1ZPTFVNRURPV04sCisJLmtleV9jb2RlWzRdID0gMCwKKwkua2V5X2NvZGVbNV0gPSAwLAorCS5rZXlfY29kZVs2XSA9IDAsCisJLmtleV9jb2RlWzddID0gMCwKKwkubGluZWluX3RoID0gNTAwMCwKKwkubW9pc3R1cmVfZW4gPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd2NkX2F1ZGlvX3BhdGhzW10gPSB7CisJeyJNSUMgQklBUzEiLCBOVUxMLCAiTUNMSyJ9LAorCXsiTUlDIEJJQVMyIiwgTlVMTCwgIk1DTEsifSwKKwl7Ik1JQyBCSUFTMyIsIE5VTEwsICJNQ0xLIn0sCisJeyJNSUMgQklBUzQiLCBOVUxMLCAiTUNMSyJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBtaTJzX2Nsa1tNSTJTX01BWF0gPSB7CisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9NSTJTX0lCSVQsCisJCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCisJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAorCQkwLAorCX0sCisJeworCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKKwkJUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfTUkyU19JQklULAorCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAorCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKKwkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkJMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IG1pMnNfYXV4X3BjbV9jb21tb25fY29uZiBtaTJzX2F1eHBjbV9jb25mW1BDTV9JMlNfU0VMX01BWF07CitzdGF0aWMgc3RydWN0IG1pMnNfY29uZiBtaTJzX2ludGZfY29uZltNSTJTX01BWF07CitzdGF0aWMgc3RydWN0IGF1eHBjbV9jb25mIGF1eHBjbV9pbnRmX2NvbmZbQVVYX1BDTV9NQVhdOworCitzdGF0aWMgaW50IHNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDc7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDg7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8zNTJQOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gOTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM4NEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOworfQorCitzdGF0aWMgaW50IHNsaW1fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGUgPSAwOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDc6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDk6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IHNsaW1fZ2V0X2JpdF9mb3JtYXRfdmFsKGludCBiaXRfZm9ybWF0KQoreworCWludCB2YWwgPSAwOworCisJc3dpdGNoIChiaXRfZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJdmFsID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9nZXRfYml0X2Zvcm1hdChpbnQgdmFsKQoreworCWludCBiaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMDoKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDM6CisJCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGJpdF9mbXQ7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IHBvcnRfaWQgPSAwOworCisJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzBfUlgiLCBzaXplb2YoIlNMSU1fMF9SWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fUlhfMDsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8yX1JYIiwgc2l6ZW9mKCJTTElNXzJfUlgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1JYXzI7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fNV9SWCIsIHNpemVvZigiU0xJTV81X1JYIikpKQorCQlwb3J0X2lkID0gU0xJTV9SWF81OworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzZfUlgiLCBzaXplb2YoIlNMSU1fNl9SWCIpKSkKKwkJcG9ydF9pZCA9IFNMSU1fUlhfNjsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8wX1RYIiwgc2l6ZW9mKCJTTElNXzBfVFgiKSkpCisJCXBvcnRfaWQgPSBTTElNX1RYXzA7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMV9UWCIsIHNpemVvZigiU0xJTV8xX1RYIikpKQorCQlwb3J0X2lkID0gU0xJTV9UWF8xOworCWVsc2UgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjaGFubmVsOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcG9ydF9pZDsKK30KKworc3RhdGljIGludCBzbGltX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKHNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwlzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlID0KKwkJc2xpbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlzbGltX2dldF9zYW1wbGVfcmF0ZV92YWwoc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBzYW1wbGVfcmF0ZSA9IDA7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2FtcGxlX3JhdGUgPSBzbGltX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwlpZiAoc2FtcGxlX3JhdGUgPT0gU0FNUExJTkdfUkFURV80NFAxS0haKSB7CisJCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkOiBmb3IgVHggcGF0aFxuIiwKKwkJCV9fZnVuY19fLCBzYW1wbGVfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIHZhbHVlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGltX3J4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCQlzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwlzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQorCQlzbGltX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaW1fdHhfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGNoX251bSA8IDApCisJCXJldHVybiBjaF9udW07CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJCXNsaW1fZ2V0X2JpdF9mb3JtYXRfdmFsKHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpbV90eF9iaXRfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoY2hfbnVtIDwgMCkKKwkJcmV0dXJuIGNoX251bTsKKworCXNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCA9CisJCXNsaW1fZ2V0X2JpdF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3R4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NsaW1fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChjaF9udW0gPCAwKQorCQlyZXR1cm4gY2hfbnVtOworCisJc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOworCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3ZpX2ZlZWRfdHhfY2ggLSAxOworCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlbGRcbiIsIF9fZnVuY19fLAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXNtX3ZpX2ZlZWRfdHhfY2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisKKwlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWRcbiIsIF9fZnVuY19fLCBtc21fdmlfZmVlZF90eF9jaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qCisJICogU2xpbWJ1c183X1J4L1R4IHNhbXBsZSByYXRlIHZhbHVlcyBzaG91bGQgYWx3YXlzIGJlIGluIHN5bmMgKHNhbWUpCisJICogd2hlbiB1c2VkIGZvciBCVF9TQ08gdXNlIGNhc2UuIFJldHVybiBlaXRoZXIgUnggb3IgVHggc2FtcGxlIHJhdGUKKwkgKiB2YWx1ZS4KKwkgKi8KKwlzd2l0Y2ggKHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGUgPSAlZCIsIF9fZnVuY19fLAorCQkgc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fYnRfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMToKKwkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNhbXBsZSByYXRlczogc2xpbTdfcnggPSAlZCwgc2xpbTdfdHggPSAlZCwgdmFsdWUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLAorCQkgc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSwKKwkJIHNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3J4X2NmZy5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB1c2JfcnhfY2ZnLmNoYW5uZWxzIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVzYl9yeF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisKKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgdXNiX3J4X2NmZy5jaGFubmVscyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbDsKKworCXN3aXRjaCAodXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDEyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDExOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE3NlA0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA5OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDg7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84OFAyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA3OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8yMlAwNUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNhbXBsZV9yYXRlX3ZhbDsKKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDEyOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOworCQlicmVhazsKKwljYXNlIDEwOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7CisJCWJyZWFrOworCWNhc2UgOToKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfODhQMktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOworCQlicmVhazsKKwljYXNlIDI6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVzYl9yeF9jZmcuYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVzYl9yeF9jZmcuYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMzoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdXNiX3J4X2NmZy5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVzYl9hdWRpb190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgdXNiX3R4X2NmZy5jaGFubmVscyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB1c2JfdHhfY2ZnLmNoYW5uZWxzIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVzYl90eF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7CisKKwlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgdXNiX3R4X2NmZy5jaGFubmVscyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNhbXBsZV9yYXRlX3ZhbDsKKworCXN3aXRjaCAodXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSkgeworCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDEyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDExOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE3NlA0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA5OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDg7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV84OFAyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA3OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA1OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8yMlAwNUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSB1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAxMjoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwljYXNlIDExOgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDk6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE3NlA0S0haOworCQlicmVhazsKKwljYXNlIDg6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOworCQlicmVhazsKKwljYXNlIDc6CisJCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8yMlAwNUtIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xMVAwMjVLSFo7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogY29udHJvbCB2YWx1ZSA9ICVsZCwgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsCisJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKKwkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3dpdGNoICh1c2JfdHhfY2ZnLmJpdF9mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDM7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKKwkJIF9fZnVuY19fLCB1c2JfdHhfY2ZnLmJpdF9mb3JtYXQsCisJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIDM6CisJCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOworCQlicmVhazsKKwljYXNlIDI6CisJCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVzYl90eF9jZmcuYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBleHRfZGlzcF9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IGlkeDsKKworCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiRGlzcGxheSBQb3J0IFJYIiwKKwkJICAgIHNpemVvZigiRGlzcGxheSBQb3J0IFJYIikpKSB7CisJCWlkeCA9IERQX1JYX0lEWDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBCRTogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJaWR4ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IGV4dF9kaXNwX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJc3dpdGNoIChleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0LAorCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dF9kaXNwX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMToKKwkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dF9kaXNwX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyAtIDI7CisKKwlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0KKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKKworCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmNoID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsOworCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlzd2l0Y2ggKGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOworCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLnNhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAyOgorCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDE6CisJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCBleHRfZGlzcF9yeFslZF0uc2FtcGxlX3JhdGUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgaWR4LAorCQkgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb3h5X3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcl9kZWJ1ZygiJXM6IHByb3h5X3J4IGNoYW5uZWxzID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgcHJveHlfcnhfY2ZnLmNoYW5uZWxzKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByb3h5X3J4X2NmZy5jaGFubmVscyAtIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm94eV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJveHlfcnhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAyOworCXByX2RlYnVnKCIlczogcHJveHlfcnggY2hhbm5lbHMgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwcm94eV9yeF9jZmcuY2hhbm5lbHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGRtX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCit7CisJaW50IHNhbXBsZV9yYXRlID0gMDsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDA6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwljYXNlIDE6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwljYXNlIDU6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOworCQlicmVhazsKKwljYXNlIDc6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQoreworCWludCBzYW1wbGVfcmF0ZTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDE6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKKworCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gNjsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA3OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisKKwlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAxOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKKwlkZWZhdWx0OgorCQlzYW1wbGVfcmF0ZV92YWwgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCB0ZG1fcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydCkgeworCQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSSIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9QUkk7CisJCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQyIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9TRUM7CisJCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlQiLAorCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPm1vZGUgPSBURE1fVEVSVDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgeworCQkJcG9ydC0+bW9kZSA9IFRETV9RVUFUOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgbW9kZSBpbjogJXMiLAorCQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMCIsCisJCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkgICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzAiLAorCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzEiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzIiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMjsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzMiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMzsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNCIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzQiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNSIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzUiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNiIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzYiLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNjsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNyIsCisJCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAorCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzciLAorCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKKwkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNzsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWwgaW46ICVzIiwKKwkJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKKwkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9CisJCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKKwkJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9CisJCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX2dldF9mb3JtYXQoaW50IHZhbHVlKQoreworCWludCBmb3JtYXQgPSAwOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDoKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIGludCB0ZG1fZ2V0X2Zvcm1hdF92YWwoaW50IGZvcm1hdCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZhbHVlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJdmFsdWUgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfZm9ybWF0X3ZhbCgKKwkJCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0KTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0ID0KKwkJCXRkbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJCXByX2RlYnVnKCIlczogdGRtX3J4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X2Zvcm1hdF92YWwoCisJCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCk7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCisJCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCA9CisJCQl0ZG1fZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKworCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMSwKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZG1fcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OworCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJfSBlbHNlIHsKKwkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgPQorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7CisKKwkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscywKKwkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRtX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKKwlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0gZWxzZSB7CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxOworCisJCXByX2RlYnVnKCIlczogdGRtX3R4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkbV90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRkbV9wb3J0IHBvcnQ7CisJaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9IGVsc2UgeworCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyA9CisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKworCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzLAorCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKK3sKKwlpbnQgaWR4OworCisJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX0FVWF9QQ00iLAorCQkgICAgc2l6ZW9mKCJQUklNX0FVWF9QQ00iKSkpCisJCWlkeCA9IFBSSU1fQVVYX1BDTTsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX0FVWF9QQ00iLAorCQkJIHNpemVvZigiU0VDX0FVWF9QQ00iKSkpCisJCWlkeCA9IFNFQ19BVVhfUENNOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX0FVWF9QQ00iLAorCQkJIHNpemVvZigiVEVSVF9BVVhfUENNIikpKQorCQlpZHggPSBURVJUX0FVWF9QQ007CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfQVVYX1BDTSIsCisJCQkgc2l6ZW9mKCJRVUFUX0FVWF9QQ00iKSkpCisJCWlkeCA9IFFVQVRfQVVYX1BDTTsKKwllbHNlIHsKKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgcG9ydDogJXMiLAorCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJaWR4ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IGF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCWF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQorCQlhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkgICAgIGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwlhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KKwkJYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKKworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gaWR4OworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJICAgICBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGlkeCwgYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKKwkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWkyc19nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IGlkeDsKKworCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9NSTJTX1JYIiwKKwkgICAgc2l6ZW9mKCJQUklNX01JMlNfUlgiKSkpCisJCWlkeCA9IFBSSU1fTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX01JMlNfUlgiLAorCQkgc2l6ZW9mKCJTRUNfTUkyU19SWCIpKSkKKwkJaWR4ID0gU0VDX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfTUkyU19SWCIsCisJCSBzaXplb2YoIlRFUlRfTUkyU19SWCIpKSkKKwkJaWR4ID0gVEVSVF9NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX01JMlNfUlgiLAorCQkgc2l6ZW9mKCJRVUFUX01JMlNfUlgiKSkpCisJCWlkeCA9IFFVQVRfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9NSTJTX1RYIiwKKwkJIHNpemVvZigiUFJJTV9NSTJTX1RYIikpKQorCQlpZHggPSBQUklNX01JMlM7CisJZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19NSTJTX1RYIiwKKwkJIHNpemVvZigiU0VDX01JMlNfVFgiKSkpCisJCWlkeCA9IFNFQ19NSTJTOworCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX01JMlNfVFgiLAorCQkgc2l6ZW9mKCJURVJUX01JMlNfVFgiKSkpCisJCWlkeCA9IFRFUlRfTUkyUzsKKwllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9NSTJTX1RYIiwKKwkJIHNpemVvZigiUVVBVF9NSTJTX1RYIikpKQorCQlpZHggPSBRVUFUX01JMlM7CisJZWxzZSB7CisJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWw6ICVzIiwKKwkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCWlkeCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBtaTJzX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQoreworCWludCBzYW1wbGVfcmF0ZV92YWw7CisKKwlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7CisJY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSAyOworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKKwkJc2FtcGxlX3JhdGVfdmFsID0gMzsKKwkJYnJlYWs7CisJY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgorCQlzYW1wbGVfcmF0ZV92YWwgPSA0OworCQlicmVhazsKKwljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDU7CisJCWJyZWFrOworCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOworfQorCitzdGF0aWMgaW50IG1pMnNfZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKK3sKKwlpbnQgc2FtcGxlX3JhdGU7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAwOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOworCQlicmVhazsKKwljYXNlIDM6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IG1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCW1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQorCQltaTJzX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaTJzX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKG1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCW1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQorCQltaTJzX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAorCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaTJzX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOworCisJaWYgKGlkeCA8IDApCisJCXJldHVybiBpZHg7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKG1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOworCisJcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCisJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9taTJzX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXByX2RlYnVnKCIlczogbXNtX21pMnNfWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9taTJzX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCW1pMnNfcnhfY2ZnW2lkeF0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9taTJzX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXByX2RlYnVnKCIlczogbXNtX21pMnNfWyVkXV90eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCisJCSBpZHgsIG1pMnNfdHhfY2ZnW2lkeF0uY2hhbm5lbHMpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9taTJzX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7CisKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCW1pMnNfdHhfY2ZnW2lkeF0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKKwlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAorCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9oaWZpX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sCisJCSBtc21faGlmaV9jb250cm9sKTsKKworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5ocGhfZW4xX2dwaW9fcCkgeworCQlwcl9lcnIoIiVzOiBocGhfZW4xX2dwaW8gaXMgaW52YWxpZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG1zbV9oaWZpX2NvbnRyb2wgPT0gTVNNX0hJRklfT04pIHsKKwkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPmhwaF9lbjFfZ3Bpb19wKTsKKwkJLyogNW1zZWMgZGVsYXkgbmVlZGVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTAxMCk7CisJfSBlbHNlIHsKKwkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShwZGF0YS0+aHBoX2VuMV9ncGlvX3ApOworCX0KKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9oaWZpX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkXG4iLAorCQkgX19mdW5jX18sIG1zbV9oaWZpX2NvbnRyb2wpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX2hpZmlfY29udHJvbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9oaWZpX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCisJcHJfZGVidWcoIiVzKCkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXNtX2hpZmlfY29udHJvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW1zbV9oaWZpX2N0cmwoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJTTElNXzBfUlggQ2hhbm5lbHMiLCBzbGltXzBfcnhfY2hzLAorCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIENoYW5uZWxzIiwgc2xpbV8yX3J4X2NocywKKwkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBDaGFubmVscyIsIHNsaW1fMF90eF9jaHMsCisJCQltc21fc2xpbV90eF9jaF9nZXQsIG1zbV9zbGltX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzFfVFggQ2hhbm5lbHMiLCBzbGltXzFfdHhfY2hzLAorCQkJbXNtX3NsaW1fdHhfY2hfZ2V0LCBtc21fc2xpbV90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIENoYW5uZWxzIiwgc2xpbV81X3J4X2NocywKKwkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBDaGFubmVscyIsIHNsaW1fNl9yeF9jaHMsCisJCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJWSV9GRUVEX1RYIENoYW5uZWxzIiwgdmlfZmVlZF90eF9jaHMsCisJCQltc21fdmlfZmVlZF90eF9jaF9nZXQsIG1zbV92aV9mZWVkX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggQ2hhbm5lbHMiLCB1c2JfcnhfY2hzLAorCQkJdXNiX2F1ZGlvX3J4X2NoX2dldCwgdXNiX2F1ZGlvX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggQ2hhbm5lbHMiLCB1c2JfdHhfY2hzLAorCQkJdXNiX2F1ZGlvX3R4X2NoX2dldCwgdXNiX2F1ZGlvX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggQ2hhbm5lbHMiLCBleHRfZGlzcF9yeF9jaHMsCisJCQlleHRfZGlzcF9yeF9jaF9nZXQsIGV4dF9kaXNwX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUk9YWV9SWCBDaGFubmVscyIsIHByb3h5X3J4X2NocywKKwkJCXByb3h5X3J4X2NoX2dldCwgcHJveHlfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBGb3JtYXQiLCBzbGltXzBfcnhfZm9ybWF0LAorCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTTElNXzVfUlggRm9ybWF0Iiwgc2xpbV81X3J4X2Zvcm1hdCwKKwkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIEZvcm1hdCIsIHNsaW1fNl9yeF9mb3JtYXQsCisJCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBGb3JtYXQiLCBzbGltXzBfdHhfZm9ybWF0LAorCQkJc2xpbV90eF9iaXRfZm9ybWF0X2dldCwgc2xpbV90eF9iaXRfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fUlggRm9ybWF0IiwgdXNiX3J4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb19yeF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggRm9ybWF0IiwgdXNiX3R4X2Zvcm1hdCwKKwkJCXVzYl9hdWRpb190eF9mb3JtYXRfZ2V0LCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggQml0IEZvcm1hdCIsIGV4dF9kaXNwX3J4X2Zvcm1hdCwKKwkJCWV4dF9kaXNwX3J4X2Zvcm1hdF9nZXQsIGV4dF9kaXNwX3J4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIFNhbXBsZVJhdGUiLCBzbGltXzBfcnhfc2FtcGxlX3JhdGUsCisJCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIFNhbXBsZVJhdGUiLCBzbGltXzJfcnhfc2FtcGxlX3JhdGUsCisJCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1RYIFNhbXBsZVJhdGUiLCBzbGltXzBfdHhfc2FtcGxlX3JhdGUsCisJCQlzbGltX3R4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIFNhbXBsZVJhdGUiLCBzbGltXzVfcnhfc2FtcGxlX3JhdGUsCisJCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIFNhbXBsZVJhdGUiLCBzbGltXzZfcnhfc2FtcGxlX3JhdGUsCisJCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiQlQgU2FtcGxlUmF0ZSIsIGJ0X3NhbXBsZV9yYXRlLAorCQkJbXNtX2J0X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1zbV9idF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIFNhbXBsZVJhdGUiLCB1c2Jfcnhfc2FtcGxlX3JhdGUsCisJCQl1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJVU0JfQVVESU9fVFggU2FtcGxlUmF0ZSIsIHVzYl90eF9zYW1wbGVfcmF0ZSwKKwkJCXVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkRpc3BsYXkgUG9ydCBSWCBTYW1wbGVSYXRlIiwgZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGUsCisJCQlleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAorCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKKwkJCXRkbV90eF9mb3JtYXRfZ2V0LAorCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKKwkJCXRkbV9yeF9jaF9nZXQsCisJCQl0ZG1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCisJCQl0ZG1fdHhfY2hfZ2V0LAorCQkJdGRtX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCisJCQl0ZG1fcnhfZm9ybWF0X2dldCwKKwkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAorCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKKwkJCXRkbV90eF9jaF9nZXQsCisJCQl0ZG1fdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKKwkJCXRkbV9yeF9mb3JtYXRfZ2V0LAorCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAorCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fdHhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKKwkJCXRkbV9yeF9jaF9nZXQsCisJCQl0ZG1fcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAorCQkJdGRtX3R4X2NoX2dldCwKKwkJCXRkbV90eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBTYW1wbGVSYXRlIiwgdGRtX3R4X3NhbXBsZV9yYXRlLAorCQkJdGRtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCXRkbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAorCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCisJCQl0ZG1fcnhfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCisJCQl0ZG1fdHhfZm9ybWF0X2dldCwKKwkJCXRkbV90eF9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgQ2hhbm5lbHMiLCB0ZG1fcnhfY2hzLAorCQkJdGRtX3J4X2NoX2dldCwKKwkJCXRkbV9yeF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCisJCQl0ZG1fdHhfY2hfZ2V0LAorCQkJdGRtX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHByaW1fYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHNlY19hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHRlcnRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBxdWF0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgcHJpbV9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgc2VjX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgdGVydF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHF1YXRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKKwkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIFNhbXBsZVJhdGUiLCBwcmltX21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIFNhbXBsZVJhdGUiLCBzZWNfbWkyc19yeF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1JYIFNhbXBsZVJhdGUiLCB0ZXJ0X21pMnNfcnhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBTYW1wbGVSYXRlIiwgcXVhdF9taTJzX3J4X3NhbXBsZV9yYXRlLAorCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggU2FtcGxlUmF0ZSIsIHByaW1fbWkyc190eF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfVFggU2FtcGxlUmF0ZSIsIHNlY19taTJzX3R4X3NhbXBsZV9yYXRlLAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggU2FtcGxlUmF0ZSIsIHRlcnRfbWkyc190eF9zYW1wbGVfcmF0ZSwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAorCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1RYIFNhbXBsZVJhdGUiLCBxdWF0X21pMnNfdHhfc2FtcGxlX3JhdGUsCisJCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKKwkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19SWCBDaGFubmVscyIsIHByaW1fbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggQ2hhbm5lbHMiLCBwcmltX21pMnNfdHhfY2hzLAorCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfUlggQ2hhbm5lbHMiLCBzZWNfbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBDaGFubmVscyIsIHNlY19taTJzX3R4X2NocywKKwkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19SWCBDaGFubmVscyIsIHRlcnRfbWkyc19yeF9jaHMsCisJCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggQ2hhbm5lbHMiLCB0ZXJ0X21pMnNfdHhfY2hzLAorCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1JYIENoYW5uZWxzIiwgcXVhdF9taTJzX3J4X2NocywKKwkJCW1zbV9taTJzX3J4X2NoX2dldCwgbXNtX21pMnNfcnhfY2hfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19UWCBDaGFubmVscyIsIHF1YXRfbWkyc190eF9jaHMsCisJCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCisJU09DX0VOVU1fRVhUKCJIaUZpIEZ1bmN0aW9uIiwgaGlmaV9mdW5jdGlvbiwgbXNtX2hpZmlfZ2V0LAorCQkJbXNtX2hpZmlfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgeworCQlyZXQgPSB0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX21jbGtfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKGNvZGVjLCAxLCB0cnVlKTsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF9jbGsoY29kZWMsIDAsIHRydWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21faGlmaV9jdHJsX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCisJcHJfZGVidWcoIiVzOiBtc21faGlmaV9jb250cm9sID0gJWQiLCBfX2Z1bmNfXywgbXNtX2hpZmlfY29udHJvbCk7CisKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aHBoX2VuMF9ncGlvX3ApIHsKKwkJcHJfZXJyKCIlczogaHBoX2VuMF9ncGlvIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1zbV9oaWZpX2NvbnRyb2wgIT0gTVNNX0hJRklfT04pIHsKKwkJcHJfZGVidWcoIiVzOiBIaUZpIG1peGVyIGNvbnRyb2wgaXMgbm90IHNldFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPmhwaF9lbjBfZ3Bpb19wKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShwZGF0YS0+aHBoX2VuMF9ncGlvX3ApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG1zbV9kYXBtX3dpZGdldHNbXSA9IHsKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1DTEsiLCAgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgIG1zbV9tY2xrX2V2ZW50LAorCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1DTEsgVFgiLCAgU05EX1NPQ19OT1BNLCAwLCAwLAorCU5VTEwsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMSBhbXAiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzIgYW1wIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiaGlmaSBhbXAiLCBtc21faGlmaV9jdHJsX2V2ZW50KSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIYW5kc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU5DUmlnaHQgSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJBTkNMZWZ0IEhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzUiLCBOVUxMKSwKKworCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNSIsIE5VTEwpLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgcGFyYW1faXNfbWFzayhpbnQgcCkKK3sKKwlyZXR1cm4gKHAgPj0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0spICYmCisJCQkocCA8PSBTTkRSVl9QQ01fSFdfUEFSQU1fTEFTVF9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25kX21hc2sgKnBhcmFtX3RvX21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLAorCQkJCQkgICAgIGludCBuKQoreworCXJldHVybiAmKHAtPm1hc2tzW24gLSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10pOworfQorCitzdGF0aWMgdm9pZCBwYXJhbV9zZXRfbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsIGludCBuLAorCQkJICAgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQorCQlyZXR1cm47CisJaWYgKHBhcmFtX2lzX21hc2sobikpIHsKKwkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKKworCQltLT5iaXRzWzBdID0gMDsKKwkJbS0+Yml0c1sxXSA9IDA7CisJCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOworCX0KK30KKworc3RhdGljIGludCBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGludDMyX3QgYmVfaWQpCit7CisJaW50IGNoX2lkID0gMDsKKworCXN3aXRjaCAoYmVfaWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6CisJCWNoX2lkID0gU0xJTV9SWF8wOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlg6CisJCWNoX2lkID0gU0xJTV9SWF8xOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlg6CisJCWNoX2lkID0gU0xJTV9SWF8yOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6CisJCWNoX2lkID0gU0xJTV9SWF8zOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlg6CisJCWNoX2lkID0gU0xJTV9SWF80OworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlg6CisJCWNoX2lkID0gU0xJTV9SWF82OworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFg6CisJCWNoX2lkID0gU0xJTV9UWF8wOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6CisJCWNoX2lkID0gU0xJTV9UWF8zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljaF9pZCA9IFNMSU1fUlhfMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNoX2lkOworfQorCitzdGF0aWMgaW50IG1zbV9leHRfZGlzcF9nZXRfaWR4X2Zyb21fYmVpZChpbnQzMl90IGJlX2lkKQoreworCWludCBpZHg7CisKKwlzd2l0Y2ggKGJlX2lkKSB7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYOgorCQlpZHggPSBEUF9SWF9JRFg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEluY29ycmVjdCBleHRfZGlzcCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKKwkJaWR4ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwlpbnQgcmMgPSAwOworCWludCBpZHg7CisJdm9pZCAqY29uZmlnID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBmb3JtYXQgPSAlZCwgcmF0ZSA9ICVkXG4iLAorCQkgIF9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc19yYXRlKHBhcmFtcykpOworCisJc3dpdGNoIChkYWlfbGluay0+aWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYOgorCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWDoKKwkJaWR4ID0gbXNtX3NsaW1fZ2V0X2NoX2Zyb21fYmVpZChkYWlfbGluay0+aWQpOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3J4X2NmZ1tpZHhdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWDoKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6CisJCWlkeCA9IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXNsaW1fdHhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbaWR4XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQlzbGltX3R4X2NmZ1sxXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbMV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzhLSFo7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gbXNtX3ZpX2ZlZWRfdHhfY2g7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbNV0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWDoKKwkJY29kZWMgPSBydGQtPmNvZGVjOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzE2S0haOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDE7CisKKwkJY29uZmlnID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJCQlBRkVfU0xJTUJVU19TTEFWRV9QT1JUX0NPTkZJRyk7CisJCWlmIChjb25maWcpIHsKKwkJCXJjID0gYWZlX3NldF9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcsCisJCQkJCSAgICBjb25maWcsIFNMSU1CVVNfNV9UWCk7CisJCQlpZiAocmMpCisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBzbGltYnVzIHNsYXZlIHBvcnQgY29uZmlnICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYOgorCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tTTElNX1RYXzhdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlzbGltX3R4X2NmZ1tTTElNX1RYXzhdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWDoKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHVzYl9yeF9jZmcuc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gdXNiX3J4X2NmZy5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFg6CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHVzYl90eF9jZmcuY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYOgorCQlpZHggPSBtc21fZXh0X2Rpc3BfZ2V0X2lkeF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKKwkJaWYgKElTX0VSUl9WQUxVRShpZHgpKSB7CisJCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZXh0IGRpc3AgaWR4ICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBpZHgpOworCQkJcmMgPSBpZHg7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlg6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gcHJveHlfcnhfY2ZnLmNoYW5uZWxzOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzA6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCQl0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wOgorCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQkJdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmNoYW5uZWxzOworCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCQkgICAgICAgdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmJpdF9mb3JtYXQpOworCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uc2FtcGxlX3JhdGU7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMDoKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJCXRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKKwkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5iaXRfZm9ybWF0KTsKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLnNhbXBsZV9yYXRlOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzA6CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCQl0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uY2hhbm5lbHM7CisJCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uYml0X2Zvcm1hdCk7CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tQUklNX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3J4X2NmZ1tQUklNX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1BSSU1fQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1BSSU1fQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tTRUNfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1RFUlRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fcnhfY2ZnW1RFUlRfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tURVJUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQlhdXhfcGNtX3R4X2NmZ1tURVJUX0FVWF9QQ01dLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbUVVBVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJYXV4X3BjbV9yeF9jZmdbUVVBVF9BVVhfUENNXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1FVQVRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCWF1eF9wY21fdHhfY2ZnW1FVQVRfQVVYX1BDTV0uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1BSSU1fTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfcnhfY2ZnW1BSSU1fTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1BSSU1fTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1BSSU1fTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1NFQ19NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc19yeF9jZmdbU0VDX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6CisJCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uc2FtcGxlX3JhdGU7CisJCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KKwkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uY2hhbm5lbHM7CisJCWJyZWFrOworCisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tRVUFUX01JMlNdLnNhbXBsZV9yYXRlOworCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9CisJCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmNoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKKwkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUVVBVF9NSTJTXS5zYW1wbGVfcmF0ZTsKKwkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQorCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5jaGFubmVsczsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgYm9vbCBtc21fc3dhcF9nbmRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHZhbHVlID0gMDsKKworCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvX3ApIHsKKwkJdmFsdWUgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHBkYXRhLT51c19ldXJvX2dwaW9fcCk7CisJCWlmICh2YWx1ZSkKKwkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCisJCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKKwkJZWxzZQorCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCisJCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKKwl9IGVsc2UgaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgeworCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8pOworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+dXNfZXVyb19ncGlvLCAhdmFsdWUpOworCX0KKwlwcl9kZWJ1ZygiJXM6IHN3YXAgc2VsZWN0IHN3aXRjaCAlZCB0byAlZFxuIiwgX19mdW5jX18sIHZhbHVlLCAhdmFsdWUpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfc2V0X2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqY29uZmlnX2RhdGEgPSBOVUxMOworCisJaWYgKCFtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4pIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNvZGVjIGdldCBhZmUgY29uZmlnIG5vdCBpbml0J2VkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKKwkJCUFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7CisJaWYgKGNvbmZpZ19kYXRhKSB7CisJCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRywgY29uZmlnX2RhdGEsIDApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHJlZ2lzdGVycyBjb25maWcgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQlBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRywgY29uZmlnX2RhdGEsCisJCQkJICAgIDApOworCQlpZiAocmV0KQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIHNldCBjZGMgcmVnaXN0ZXIgcGFnZSBjb25maWdcbiIsCisJCQkJX19mdW5jX18pOworCX0KKworCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAorCQkJQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKKwlpZiAoY29uZmlnX2RhdGEpIHsKKwkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHLCBjb25maWdfZGF0YSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBjb25maWcgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9hZmVfY2xlYXJfY29uZmlnKHZvaWQpCit7CisJYWZlX2NsZWFyX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpOworCWFmZV9jbGVhcl9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKK30KKworc3RhdGljIGludCBtc21fYWRzcF9wb3dlcl91cF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgYWRzcF9yZWFkeSA9IDA7CisKKwl0aW1lb3V0ID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQURTUF9TVEFURV9SRUFEWV9USU1FT1VUX01TKTsKKworCWRvIHsKKwkJaWYgKHE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKKwkJCXByX2RlYnVnKCIlczogQURTUCBBdWRpbyBpcyByZWFkeVxuIiwgX19mdW5jX18pOworCQkJYWRzcF9yZWFkeSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBBRFNQIHdpbGwgYmUgY29taW5nIHVwIGFmdGVyIHN1YnN5c3RlbSByZXN0YXJ0IGFuZAorCQkgKiBpdCBtaWdodCBub3QgYmUgZnVsbHkgdXAgd2hlbiB0aGUgY29udHJvbCByZWFjaGVzCisJCSAqIGhlcmUuIFNvLCB3YWl0IGZvciA1MG1zZWMgYmVmb3JlIGNoZWNraW5nIEFEU1Agc3RhdGUKKwkJICovCisJCW1zbGVlcCg1MCk7CisJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlpZiAoIWFkc3BfcmVhZHkpIHsKKwkJcHJfZXJyKCIlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIEFEU1AgQXVkaW9cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gbXNtX2FmZV9zZXRfY29uZmlnKGNvZGVjKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcuIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbXNrdW5rX25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCQkgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKnB0cikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOworCWNvbnN0IGNoYXIgKmJlX2RsX25hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlg7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwlwcl9kZWJ1ZygiJXM6IFNlcnZpY2Ugb3Bjb2RlIDB4JWx4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046CisJCS8qCisJCSAqIFVzZSBmbGFnIHRvIGlnbm9yZSBpbml0aWFsIGJvb3Qgbm90aWZpY2F0aW9ucworCQkgKiBPbiBpbml0aWFsIGJvb3QgbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGlzCisJCSAqIGNhbGxlZCBvbiBpbml0LiBUaGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyCisJCSAqIGFuZCBzZXQgdGhlIGNvbmZpZyBhZ2FpbiBvbiBpbml0aWFsIGJvb3QuCisJCSAqLworCQlpZiAoaXNfaW5pdGlhbF9ib290KQorCQkJYnJlYWs7CisJCW1zbV9hZmVfY2xlYXJfY29uZmlnKCk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKKwkJaWYgKGlzX2luaXRpYWxfYm9vdCkgeworCQkJaXNfaW5pdGlhbF9ib290ID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXNwZGV2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwZGV2KTsKKwkJcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7CisJCWlmICghcnRkKSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAorCQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQljb2RlYyA9IHJ0ZC0+Y29kZWM7CisKKwkJcmV0ID0gbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnKGNvZGVjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJCSIlczogbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGZhaWxlZCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitlcnI6CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXJ2aWNlX25iID0geworCS5ub3RpZmllcl9jYWxsICA9IG1zbXNrdW5rX25vdGlmaWVyX3NlcnZpY2VfY2IsCisJLnByaW9yaXR5ID0gLUlOVF9NQVgsCit9OworCitzdGF0aWMgaW50IG1zbV9hdWRyeF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqY29uZmlnX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmF1eF9jb21wOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KKwkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKworCS8qIENvZGVjIFNMSU1CVVMgY29uZmlndXJhdGlvbgorCSAqIFJYMSwgUlgyLCBSWDMsIFJYNCwgUlg1LCBSWDYsIFJYNywgUlg4CisJICogVFgxLCBUWDIsIFRYMywgVFg0LCBUWDUsIFRYNiwgVFg3LCBUWDgsIFRYOSwgVFgxMCwgVFgxMSwgVFgxMiwgVFgxMworCSAqIFRYMTQsIFRYMTUsIFRYMTYKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcnhfY2hbV0NEOTM0WF9SWF9NQVhdID0gezE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksCisJCQkJCSAgICAgIDE1MCwgMTUxfTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbV0NEOTM0WF9UWF9NQVhdID0gezEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsCisJCQkJCSAgICAgIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCisJCQkJCSAgICAgIDE0MCwgMTQxLCAxNDIsIDE0M307CisKKwlwcl9pbmZvKCIlczogZGV2X25hbWUlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGNwdV9kYWktPmRldikpOworCisJcnRkLT5wbWRvd25fdGltZSA9IDA7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3NuZF9jb250cm9scywKKwkJCQkJIEFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGFkZF9jb2RlY19jb250cm9scyBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgbXNtX2RhcG1fd2lkZ2V0cywKKwkJCQlBUlJBWV9TSVpFKG1zbV9kYXBtX3dpZGdldHMpKTsKKworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdjZF9hdWRpb19wYXRocywKKwkJCQlBUlJBWV9TSVpFKHdjZF9hdWRpb19wYXRocykpOworCisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IE1pYyIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQ1JpZ2h0IEhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkNMZWZ0IEhlYWRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzAiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljNCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWM1Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBbmFsb2cgTWljNSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFESU5QVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfSU5QVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfT1VUMSIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFEX0NQRV9PVVQyIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJFQVIiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQxIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEVBUiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMSBPVVQiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzIgT1VUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhMIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhSIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUY0IFZJIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJWSUlOUFVUIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgSFBITCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSFIiKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCisJc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCisJCQkJICAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOworCisJbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuID0gdGF2aWxfZ2V0X2FmZV9jb25maWc7CisKKwlyZXQgPSBtc21fYWRzcF9wb3dlcl91cF9jb25maWcoY29kZWMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBBRkUgY29uZmlnICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCisJCQkJCQkgICAgIEFGRV9BQU5DX1ZFUlNJT04pOworCWlmIChjb25maWdfZGF0YSkgeworCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQUFOQ19WRVJTSU9OLCBjb25maWdfZGF0YSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgYWFuYyB2ZXJzaW9uICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlbmQgc3BlYWtlciBjb25maWd1cmF0aW9uIG9ubHkgZm9yIFdTQTg4MTAuCisJICogRGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGZvciBXU0E4ODE1LgorCSAqLworCXByX2RlYnVnKCIlczogTnVtYmVyIG9mIGF1eCBkZXZpY2VzOiAlZFxuIiwKKwkJX19mdW5jX18sIHJ0ZC0+Y2FyZC0+bnVtX2F1eF9kZXZzKTsKKwlpZiAocnRkLT5jYXJkLT5udW1fYXV4X2RldnMgJiYKKwkgICAgIWxpc3RfZW1wdHkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCkpIHsKKwkJYXV4X2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QsCisJCQkJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50LCBsaXN0X2F1eCk7CisJCWlmICghc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMSkgfHwKKwkJICAgICFzdHJjbXAoYXV4X2NvbXAtPm5hbWUsIFdTQTg4MTBfTkFNRV8yKSkgeworCQkJdGF2aWxfc2V0X3Nwa3JfbW9kZShydGQtPmNvZGVjLCBTUEtSX01PREVfMSk7CisJCQl0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldChydGQtPmNvZGVjLAorCQkJCQkJUlhfR0FJTl9PRkZTRVRfTTFQNV9EQik7CisJCX0KKwl9CisJY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNhcmQtPm1vZHVsZSwgImNvZGVjcyIsCisJCQkJICAgICAgIGNhcmQtPnByb2Nfcm9vdCk7CisJaWYgKCFlbnRyeSkgeworCQlwcl9kZWJ1ZygiJXM6IENhbm5vdCBjcmVhdGUgY29kZWNzIG1vZHVsZSBlbnRyeVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXBkYXRhLT5jb2RlY19yb290ID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKwlwZGF0YS0+Y29kZWNfcm9vdCA9IGVudHJ5OworCXRhdmlsX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LCBjb2RlYyk7CisKK2RvbmU6CisJY29kZWNfcmVnX2RvbmUgPSB0cnVlOworCXJldHVybiAwOworCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fd2NuX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwl1bnNpZ25lZCBpbnQgcnhfY2hbV0NOX0NEQ19TTElNX1JYX0NIX01BWF0gPSB7MTU3LCAxNTh9OworCXVuc2lnbmVkIGludCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXSAgPSB7MTU5LCAxNjAsIDE2MX07CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKworCXJldHVybiBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoKSwKKwkJCQkJICAgdHhfY2gsIEFSUkFZX1NJWkUocnhfY2gpLCByeF9jaCk7Cit9CisKK3N0YXRpYyB2b2lkICpkZWZfdGF2aWxfbWJoY19jYWwodm9pZCkKK3sKKwl2b2lkICp0YXZpbF93Y2RfY2FsOworCXN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqYnRuX2NmZzsKKwl1MTYgKmJ0bl9oaWdoOworCisJdGF2aWxfd2NkX2NhbCA9IGt6YWxsb2MoV0NEX01CSENfQ0FMX1NJWkUoV0NEX01CSENfREVGX0JVVFRPTlMsCisJCQkJV0NEOVhYWF9NQkhDX0RFRl9STE9BRFMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhdmlsX3djZF9jYWwpCisJCXJldHVybiBOVUxMOworCisjZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUih0YXZpbF93Y2RfY2FsKS0+WCkgPSAoWSkpCisJUyh2X2hzX21heCwgMTYwMCk7CisjdW5kZWYgUworI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhdmlsX3djZF9jYWwpLT5YKSA9IChZKSkKKwlTKG51bV9idG4sIFdDRF9NQkhDX0RFRl9CVVRUT05TKTsKKyN1bmRlZiBTCisKKwlidG5fY2ZnID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHRhdmlsX3djZF9jYWwpOworCWJ0bl9oaWdoID0gKCh2b2lkICopJmJ0bl9jZmctPl92X2J0bl9sb3cpICsKKwkJKHNpemVvZihidG5fY2ZnLT5fdl9idG5fbG93WzBdKSAqIGJ0bl9jZmctPm51bV9idG4pOworCisJYnRuX2hpZ2hbMF0gPSA3NTsKKwlidG5faGlnaFsxXSA9IDE1MDsKKwlidG5faGlnaFsyXSA9IDIzNzsKKwlidG5faGlnaFszXSA9IDUwMDsKKwlidG5faGlnaFs0XSA9IDUwMDsKKwlidG5faGlnaFs1XSA9IDUwMDsKKwlidG5faGlnaFs2XSA9IDUwMDsKKwlidG5faGlnaFs3XSA9IDUwMDsKKworCXJldHVybiB0YXZpbF93Y2RfY2FsOworfQorCitzdGF0aWMgaW50IG1zbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKKworCWludCByZXQgPSAwOworCXUzMiByeF9jaFtTTElNX01BWF9SWF9QT1JUU10sIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwl1MzIgdXNlcl9zZXRfdHhfY2ggPSAwOworCXUzMiByeF9jaF9jb3VudDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgpIHsKKwkJCXByX2RlYnVnKCIlczogcnhfNV9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkJICBzbGltX3J4X2NmZ1s1XS5jaGFubmVscyk7CisJCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOworCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzJfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSBzbGltX3J4X2NmZ1syXS5jaGFubmVscyk7CisJCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzJdLmNoYW5uZWxzOworCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYKSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJ4XzZfY2g9JWRcbiIsIF9fZnVuY19fLAorCQkJCSAgc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHMpOworCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s2XS5jaGFubmVsczsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogcnhfMF9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscyk7CisJCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzBdLmNoYW5uZWxzOworCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAorCQkJCQkJICByeF9jaF9jb3VudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKworCQlwcl9kZWJ1ZygiJXM6ICVzX3R4X2RhaV9pZF8lZF9jaD0lZFxuIiwgX19mdW5jX18sCisJCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkLCB1c2VyX3NldF90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBGb3IgPGNvZGVjPl90eDEgY2FzZSAqLworCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgpCisJCQl1c2VyX3NldF90eF9jaCA9IHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzOworCQkvKiBGb3IgPGNvZGVjPl90eDMgY2FzZSAqLworCQllbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCkKKwkJCXVzZXJfc2V0X3R4X2NoID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7CisJCWVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYKQorCQkJdXNlcl9zZXRfdHhfY2ggPSBtc21fdmlfZmVlZF90eF9jaDsKKwkJZWxzZQorCQkJdXNlcl9zZXRfdHhfY2ggPSB0eF9jaF9jbnQ7CisKKwkJcHJfZGVidWcoIiVzOiBtc21fc2xpbV8wX3R4X2NoKCVkKSB1c2VyX3NldF90eF9jaCglZCkgdHhfY2hfY250KCVkKSwgQkUgaWQgKCVkKVxuIiwKKwkJCSBfX2Z1bmNfXywgIHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzLCB1c2VyX3NldF90eF9jaCwKKwkJCSB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCisJCQkJCQkgIHVzZXJfc2V0X3R4X2NoLCB0eF9jaCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9zbGltYnVzXzJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgcnhfY2hbU0xJTV9NQVhfUlhfUE9SVFNdLCB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107CisJdW5zaWduZWQgaW50IHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7CisJdW5zaWduZWQgaW50IG51bV90eF9jaCA9IDA7CisJdW5zaWduZWQgaW50IG51bV9yeF9jaCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQludW1fcnhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgcnhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3J4X2NoKTsKKwkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKKwkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIDAsCisJCQkJbnVtX3J4X2NoLCByeF9jaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQludW1fdHhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJCXByX2RlYnVnKCIlczogJXMgIHR4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCisJCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV90eF9jaCk7CisJCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCisJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCW51bV90eF9jaCwgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fd2NuX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7CisJdTMyIHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdLCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXTsKKwl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhydGQtPmRldiwgIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAorCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKKwlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAorCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGdldCBCVEZNIGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHR4X2NoX2NudCglZCkgQkUgaWQgJWRcbiIsCisJCV9fZnVuY19fLCB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKKwkJCQkJICB0eF9jaF9jbnQsIHR4X2NoLCByeF9jaF9jbnQsIHJ4X2NoKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgaW5kZXggPSBjcHVfZGFpLT5pZCAtIDE7CisJcmV0dXJuIHJldCA9IDA7CisKKwlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZCwgZGFpIG5hbWUgJXMsIGRhaSBJRCAlZFxuIiwKKwkJX19mdW5jX18sIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0sCisJCWNwdV9kYWktPm5hbWUsIGNwdV9kYWktPmlkKTsKKworCWlmIChpbmRleCA8IFBSSU1fQVVYX1BDTSB8fCBpbmRleCA+IFFVQVRfQVVYX1BDTSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBDUFUgREFJIGlkICglZCkgb3V0IG9mIHJhbmdlXG4iLAorCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKKwkJZ290byBlcnI7CisJfQorCisJbXV0ZXhfbG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7CisJaWYgKCsrYXV4cGNtX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAxKSB7CisJCWlmIChtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQkJaW93cml0ZTMyKDEsCisJCQkJbWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkcik7CisJCQltdXRleF91bmxvY2soJm1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLmxvY2spOworCQl9IGVsc2UgeworCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCQkiJXMgbHBhaWZfdGVydF9tdXhzZWxfdmlydF9hZGRyIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCWF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQtLTsKKworCW11dGV4X3VubG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc21fYXV4X3BjbV9zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQgLSAxOworCisJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKKwkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCisJCV9fZnVuY19fLAorCQlzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAorCQlydGQtPmNwdV9kYWktPm5hbWUsIHJ0ZC0+Y3B1X2RhaS0+aWQpOworCisJaWYgKGluZGV4IDwgUFJJTV9BVVhfUENNIHx8IGluZGV4ID4gUVVBVF9BVVhfUENNKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkiJXM6IENQVSBEQUkgaWQgKCVkKSBvdXQgb2YgcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgcnRkLT5jcHVfZGFpLT5pZCk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKKwlpZiAoLS1hdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKKwkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgeworCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCQlpb3dyaXRlMzIoMCwKKwkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKKwkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlcyBscGFpZl90ZXJ0X211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlhdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250Kys7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKK30KKworc3RhdGljIGludCBtc21fZ2V0X3BvcnRfaWQoaW50IGJlX2lkKQoreworCWludCBhZmVfcG9ydF9pZDsKKworCXN3aXRjaCAoYmVfaWQpIHsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKKwkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6CisJCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6CisJCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYOgorCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBCRSBpZDogJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7CisJCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYWZlX3BvcnRfaWQ7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKHUzMiBiaXRfZm9ybWF0KQoreworCXUzMiBiaXRfcGVyX3NhbXBsZTsKKworCXN3aXRjaCAoYml0X2Zvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWJpdF9wZXJfc2FtcGxlID0gMzI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJYml0X3Blcl9zYW1wbGUgPSAxNjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJpdF9wZXJfc2FtcGxlOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbWkyc19jbGtfdmFsKGludCBkYWlfaWQsIGludCBzdHJlYW0pCit7CisJdTMyIGJpdF9wZXJfc2FtcGxlOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWJpdF9wZXJfc2FtcGxlID0KKwkJICAgIGdldF9taTJzX2JpdHNfcGVyX3NhbXBsZShtaTJzX3J4X2NmZ1tkYWlfaWRdLmJpdF9mb3JtYXQpOworCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0KKwkJICAgIG1pMnNfcnhfY2ZnW2RhaV9pZF0uc2FtcGxlX3JhdGUgKiAyICogYml0X3Blcl9zYW1wbGU7CisJfSBlbHNlIHsKKwkJYml0X3Blcl9zYW1wbGUgPQorCQkgICAgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKG1pMnNfdHhfY2ZnW2RhaV9pZF0uYml0X2Zvcm1hdCk7CisJCW1pMnNfY2xrW2RhaV9pZF0uY2xrX2ZyZXFfaW5faHogPQorCQkgICAgbWkyc190eF9jZmdbZGFpX2lkXS5zYW1wbGVfcmF0ZSAqIDIgKiBiaXRfcGVyX3NhbXBsZTsKKwl9CisKKwlpZiAoIW1pMnNfaW50Zl9jb25mW2RhaV9pZF0ubXNtX2lzX21pMnNfbWFzdGVyKQorCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0gMDsKK30KKworc3RhdGljIGludCBtc21fbWkyc19zZXRfc2NsayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcG9ydF9pZCA9IDA7CisJaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7CisKKwlwb3J0X2lkID0gbXNtX2dldF9wb3J0X2lkKHJ0ZC0+ZGFpX2xpbmstPmlkKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHBvcnRfaWQpKSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlczogSW52YWxpZCBwb3J0X2lkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHBvcnRfaWQ7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChlbmFibGUpIHsKKwkJdXBkYXRlX21pMnNfY2xrX3ZhbChpbmRleCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IGNsb2NrIHJhdGUgJXVsXG4iLCBfX2Z1bmNfXywKKwkJCW1pMnNfY2xrW2luZGV4XS5jbGtfZnJlcV9pbl9oeik7CisJfQorCisJbWkyc19jbGtbaW5kZXhdLmVuYWJsZSA9IGVuYWJsZTsKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHBvcnRfaWQsCisJCQkJICAgICAmbWkyc19jbGtbaW5kZXhdKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJIiVzOiBhZmUgbHBhc3MgY2xvY2sgZmFpbGVkIGZvciBwb3J0IDB4JXggLCBlcnI6JWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCBpbmRleCA9IGNwdV9kYWktPmlkOworCXVuc2lnbmVkIGludCBmbXQgPSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOworCisJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKKwkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCisJCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAorCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7CisKKwlpZiAoaW5kZXggPCBQUklNX01JMlMgfHwgaW5kZXggPiBRVUFUX01JMlMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKKwkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKKwkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7CisJCWdvdG8gZXJyOworCX0KKwkvKgorCSAqIE11eHRleCBwcm90ZWN0aW9uIGluIGNhc2UgdGhlIHNhbWUgTUkyUworCSAqIGludGVyZmFjZSB1c2luZyBmb3IgYm90aCBUWCBhbmQgUlggIHNvCisJICogdGhhdCB0aGUgc2FtZSBjbG9jayB3b24ndCBiZSBlbmFibGUgdHdpY2UuCisJICovCisJbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworCWlmICgrK21pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDEpIHsKKwkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCB0cnVlKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAorCQkJCSIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCB0byBlbmFibGUgTUkyUyBjbG9jaywgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQlpZiAobWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkciAhPSBOVUxMKSB7CisJCQltdXRleF9sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKKwkJCWlvd3JpdGUzMigwLAorCQkJCW1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOworCQkJbXV0ZXhfdW5sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCisJCQkJIiVzIGxwYWlmX211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTCBmb3IgZGFpICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBjbGtfb2ZmOworCQl9CisJCS8qIENoZWNrIGlmIG1zbSBuZWVkcyB0byBwcm92aWRlIHRoZSBjbG9jayB0byB0aGUgaW50ZXJmYWNlICovCisJCWlmICghbWkyc19pbnRmX2NvbmZbaW5kZXhdLm1zbV9pc19taTJzX21hc3RlcikKKwkJCWZtdCA9IFNORF9TT0NfREFJRk1UX0NCTV9DRk07CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgZm10KTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlwcl9lcnIoIiVzOiBzZXQgZm10IGNwdSBkYWkgZmFpbGVkIGZvciBNSTJTICglZCksIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7CisJCQlnb3RvIGNsa19vZmY7CisJCX0KKwl9CitjbGtfb2ZmOgorCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CitjbGVhbl91cDoKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCW1pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250LS07CisJbXV0ZXhfdW5sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQ7CisKKwlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgeworCQlwcl9lcnIoIiVzOmludmFsaWQgTUkyUyBEQUkoJWQpXG4iLCBfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworCWlmICgtLW1pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKKwkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOmNsb2NrIGRpc2FibGUgZmFpbGVkIGZvciBNSTJTICglZCk7IHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7CisJCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCsrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9taTJzX2JlX29wcyA9IHsKKwkuc3RhcnR1cCA9IG1zbV9taTJzX3NuZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IG1zbV9taTJzX3NuZF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2F1eF9wY21fYmVfb3BzID0geworCS5zdGFydHVwID0gbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAsCisJLnNodXRkb3duID0gbXNtX2F1eF9wY21fc25kX3NodXRkb3duLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayh1MTYgcG9ydF9pZCwgaW50IHNsb3Rfd2lkdGgsCisJCQkJCSAgICBpbnQgc2xvdHMpCit7CisJdW5zaWduZWQgaW50IHNsb3RfbWFzayA9IDA7CisJaW50IGksIGo7CisJdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKKworCWZvciAoaSA9IFRETV8wOyBpIDwgVERNX1BPUlRfTUFYOyBpKyspIHsKKwkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGorKykgeworCQkJaWYgKHNsb3Rfb2Zmc2V0W2pdICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCisJCQkJc2xvdF9tYXNrIHw9CisJCQkJKDEgPDwgKChzbG90X29mZnNldFtqXSAqIDgpIC8gc2xvdF93aWR0aCkpOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHNsb3RfbWFzazsKK30KKworc3RhdGljIGludCBtc21fdGRtX3NuZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCWludCByZXQgPSAwOworCWludCBjaGFubmVscywgc2xvdF93aWR0aCwgc2xvdHM7CisJdW5zaWduZWQgaW50IHNsb3RfbWFzazsKKwl1bnNpZ25lZCBpbnQgKnNsb3Rfb2Zmc2V0OworCWludCBvZmZzZXRfY2hhbm5lbHMgPSAwOworCWludCBpOworCisJcHJfZGVidWcoIiVzOiBkYWkgaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOworCisJY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCWNhc2UgODoKKwkJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJLyoKKwkJICogVXAgdG8gOCBjaGFubmVscyBIVyBjb25maWcgc2hvdWxkCisJCSAqIHVzZSAzMiBiaXQgc2xvdCB3aWR0aCBmb3IgbWF4IHN1cHBvcnQgb2YKKwkJICogc3RyZWFtIGJpdCB3aWR0aC4gKHNsb3Rfd2lkdGggPiBiaXRfd2lkdGgpCisJCSAqLworCQkJc2xvdF93aWR0aCA9IDMyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGZvcm1hdCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2xvdHMgPSA4OworCQlzbG90X21hc2sgPSB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayhjcHVfZGFpLT5pZCwKKwkJCQkJCSAgICBzbG90X3dpZHRoLAorCQkJCQkJICAgIHNsb3RzKTsKKwkJaWYgKCFzbG90X21hc2spIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgc2xvdF9tYXNrIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHNsb3RfbWFzayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGNoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCisJc3dpdGNoIChjcHVfZGFpLT5pZCkgeworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbVERNXzBdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBkYWkgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGkrKykgeworCQlpZiAoc2xvdF9vZmZzZXRbaV0gIT0gQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRCkKKwkJCW9mZnNldF9jaGFubmVscysrOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAob2Zmc2V0X2NoYW5uZWxzID09IDApIHsKKwkJcHJfZXJyKCIlczogc2xvdCBvZmZzZXQgbm90IHN1cHBvcnRlZCwgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIG9mZnNldF9jaGFubmVscyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVscyA+IG9mZnNldF9jaGFubmVscykgeworCQlwcl9lcnIoIiVzOiBjaGFubmVscyAlZCBleGNlZWQgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWxzLCBvZmZzZXRfY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMCwgc2xvdF9tYXNrLAorCQkJCQkgICAgICAgc2xvdHMsIHNsb3Rfd2lkdGgpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBlcnI7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgTlVMTCwKKwkJCQkJCSAgY2hhbm5lbHMsIHNsb3Rfb2Zmc2V0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2hhbm5lbCBtYXAsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIHNsb3RfbWFzaywgMCwKKwkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIGNoYW5uZWxzLAorCQkJCQkJICBzbG90X29mZnNldCwgMCwgTlVMTCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV9zbmRfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fc2xpbWJ1c18yX2JlX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbXNtX3NsaW1idXNfMl9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV93Y25fb3BzID0geworCS5od19wYXJhbXMgPSBtc21fd2NuX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3RkbV9iZV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IG1zbV90ZG1fc25kX2h3X3BhcmFtcworfTsKKworLyogRGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9jb21tb25fZGFpX2xpbmtzW10gPSB7CisJLyogRnJvbnRFbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWExKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMQorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWEyKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjAiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsCisJfSwKKwl7CisJCS5uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUxIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVNNIFZvSVAiLAorCQkuc3RyZWFtX25hbWUgPSAiVm9JUCIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9JUCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS12b2lwLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lQLAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMKSwKKwkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjIiLAorCQkuZHluYW1pYyA9IDEsCisJCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAorCX0sCisJLyogSG9zdGxlc3MgUENNIHB1cnBvc2UgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKKwl7CisJCS5uYW1lID0gIk1TTSBBRkUtUENNIFJYIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBSWCIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQxIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tYWZlIiwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNU00gQUZFLVBDTSBUWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgVFgiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MCIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMSksCisJCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczEiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE0IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19IV19QQVJBTVMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiQVVYUENNX0hPU1RMRVNTIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18zIEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzNfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwl9LAorCXsKKwkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKExvd0xhdGVuY3kpLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTUiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMSIsCisJCS5keW5hbWljID0gMSwKKwkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19QUkVQQVJFLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCisJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMU00xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSAgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMSwKKwl9LAorCS8qIE11bHRpcGxlIFR1bm5lbCBpbnN0YW5jZXMgKi8KKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczIpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MzKSwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMyIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAorCX0sCisJeworCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMX05PSVJRKSwKKwkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsCisJfSwKKwkvKiBIRE1JIEhvc3RsZXNzICovCisJeworCQkubmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKKwkJLnN0cmVhbV9uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAorCQkuY3B1X2RhaV9uYW1lID0gIkhETUlfSE9TVExFU1MiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCX0sCisJeworCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCisJfSwKKwkvKiBMU00gRkUgKi8KKwl7CisJCS5uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTMsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTQsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTYsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNNyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCisJfSwKKwl7CisJCS5uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAorCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTFNNOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTgsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTkpLAorCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkiLAorCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE5IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMCIsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczQpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M0IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczUpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczYpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M2IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczcpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M3IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczgpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTUiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsCisJfSwKKwl7CisJCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczkpLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M5IiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsCisJfSwKKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfOCBIb3N0bGVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTOF9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTOF9IT1NUTEVTUyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAorCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGF2aWxfZmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkzIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3ZpZmVlZGJhY2siLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogVWx0cmFzb3VuZCBSWCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcngyIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKKwkJLm9wcyA9ICZtc21fc2xpbWJ1c18yX2JlX29wcywKKwl9LAorCS8qIFVsdHJhc291bmQgVFggREFJIExpbmsgKi8KKwl7CisJCS5uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF90eDIiLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAorCQkub3BzID0gJm1zbV9zbGltYnVzXzJfYmVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2NvbW1vbl9iZV9kYWlfbGlua3NbXSA9IHsKKwkvKiBCYWNrZW5kIEFGRSBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQUZFX1BDTV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIkFGRSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI0IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiQUZFIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBSZWNvcmQgVXBsaW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBVcGxpbmsgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwkvKiBJbmNhbGwgUmVjb3JkIERvd25saW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBNdXNpYyBCQUNLIEVORCBEQUkgTGluayAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9WT0lDRV9QTEFZQkFDS19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIEZhcmVuZCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCS8qIEluY2FsbCBNdXNpYyAyIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9WT0lDRTJfUExBWUJBQ0tfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1VTQl9BVURJT19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjg2NzIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1VTQl9BVURJT19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yODY3MyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9URE1fUlhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODY1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODgwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODgxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9URE1fUlhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk2IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX1RETV9UWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg5NyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX1RETV9SWF8wLAorCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9URE1fVFhfMCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9iZV9kYWlfbGlua3NbXSA9IHsKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgzIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMl9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MiIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MyIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9iZV9vcHMsCisJCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJLyogTUFEIEJFICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAorCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfbWFkMSIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDQiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fYmVfb3BzLAorCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCisJCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKKwkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KKwkJICovCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU183X1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czcgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJidGZtc2xpbV9zbGF2ZSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19zbGltX3R4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzhfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzOCBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjQwMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fZm1fc2xpbV90eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pbml0ID0gJm1zbV93Y25faW5pdCwKKwkJLm9wcyA9ICZtc21fd2NuX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV4dF9kaXNwX2JlX2RhaV9saW5rW10gPSB7CisJLyogRElTUCBQT1JUIEJBQ0sgRU5EIERBSSBMaW5rICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX0RJU1BMQVlfUE9SVCwKKwkJLnN0cmVhbV9uYW1lID0gIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kcC4yNDYwOCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1leHQtZGlzcC1hdWRpby1jb2RlYy1yeCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc21fZHBfYXVkaW9fY29kZWNfcnhfZGFpIiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX21pMnNfYmVfZGFpX2xpbmtzW10gPSB7CisJeworCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfTUkyU19UWCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjIiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCX0sCisJeworCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfTUkyU19SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX01JMlNfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fYXV4cGNtX2JlX2RhaV9saW5rc1tdID0geworCS8qIFByaW1hcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIFBsYXliYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBDYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCS8qIFNlY29uZGFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fUlgsCisJCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TRUNfQVVYUENNX1RYLAorCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAorCX0sCisJLyogVGVydGlhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9URVJUX0FVWFBDTV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorCS8qIFF1YXRlcm5hcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLworCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX0FVWFBDTV9SWCwKKwkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uNCIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCisJCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAorCQkubm9fcGNtID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3NbCisJCQkgQVJSQVlfU0laRShtc21fY29tbW9uX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtX3RhdmlsX2ZlX2RhaV9saW5rcykgKworCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV90YXZpbF9iZV9kYWlfbGlua3MpICsKKwkJCSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluaykgKworCQkJIEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyldOworCitzdGF0aWMgaW50IG1zbV9zbmRfY2FyZF90YXZpbF9sYXRlX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCWludCByZXQgPSAwOworCXZvaWQgKm1iaGNfY2FsaWJyYXRpb247CisKKwlydGQgPSBzbmRfc29jX2dldF9wY21fcnVudGltZShjYXJkLCBiZV9kbF9uYW1lKTsKKwlpZiAoIXJ0ZCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCSIlczogc25kX3NvY19nZXRfcGNtX3J1bnRpbWUgZm9yICVzIGZhaWxlZCFcbiIsCisJCQlfX2Z1bmNfXywgYmVfZGxfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1iaGNfY2FsaWJyYXRpb24gPSBkZWZfdGF2aWxfbWJoY19jYWwoKTsKKwlpZiAoIW1iaGNfY2FsaWJyYXRpb24pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCXdjZF9tYmhjX2NmZy5jYWxpYnJhdGlvbiA9IG1iaGNfY2FsaWJyYXRpb247CisJcmV0ID0gdGF2aWxfbWJoY19oc19kZXRlY3QocnRkLT5jb2RlYywgJndjZF9tYmhjX2NmZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIiVzOiBtYmhjIGhzIGRldGVjdCBmYWlsZWQsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGVycl9mcmVlX21iaGNfY2FsOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfbWJoY19jYWw6CisJa2ZyZWUobWJoY19jYWxpYnJhdGlvbik7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGF2aWxfbXNtID0geworCS5uYW1lCQk9ICJtc21za3Vuay10YXZpbC1zbmQtY2FyZCIsCisJLmxhdGVfcHJvYmUJPSBtc21fc25kX2NhcmRfdGF2aWxfbGF0ZV9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3BvcHVsYXRlX2RhaV9saW5rX2NvbXBvbmVudF9vZl9ub2RlKAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCWludCBpLCBpbmRleCwgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpjZGV2ID0gY2FyZC0+ZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAoIWNkZXYpIHsKKwkJcHJfZXJyKCIlczogU291bmQgY2FyZCBkZXZpY2UgbWVtb3J5IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7CisJCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlICYmIGRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKQorCQkJY29udGludWU7CisKKwkJLyogcG9wdWxhdGUgcGxhdGZvcm1fb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCisJCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lICYmCisJCSAgICAhZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSkgeworCQkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcoY2Rldi0+b2Zfbm9kZSwKKwkJCQkJCSJhc29jLXBsYXRmb3JtLW5hbWVzIiwKKwkJCQkJCWRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOworCQkJaWYgKGluZGV4IDwgMCkgeworCQkJCXByX2VycigiJXM6IE5vIG1hdGNoIGZvdW5kIGZvciBwbGF0Zm9ybSBuYW1lOiAlc1xuIiwKKwkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOworCQkJCXJldCA9IGluZGV4OworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsICJhc29jLXBsYXRmb3JtIiwKKwkJCQkJICAgICAgaW5kZXgpOworCQkJaWYgKCFucCkgeworCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgcGxhdGZvcm0gJXMsIGluZGV4ICVkIGZhaWxlZFxuIiwKKwkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUsCisJCQkJCWluZGV4KTsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSA9IG5wOworCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSA9IE5VTEw7CisJCX0KKworCQkvKiBwb3B1bGF0ZSBjcHVfb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCisJCWlmIChkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgJiYgIWRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKSB7CisJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAorCQkJCQkJICJhc29jLWNwdS1uYW1lcyIsCisJCQkJCQkgZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lKTsKKwkJCWlmIChpbmRleCA+PSAwKSB7CisJCQkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsICJhc29jLWNwdSIsCisJCQkJCQlpbmRleCk7CisJCQkJaWYgKCFucCkgeworCQkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNwdSBkYWkgJXMgZmFpbGVkXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOworCQkJCQlyZXQgPSAtRU5PREVWOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJZGFpX2xpbmtbaV0uY3B1X29mX25vZGUgPSBucDsKKwkJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgPSBOVUxMOworCQkJfQorCQl9CisKKwkJLyogcG9wdWxhdGUgY29kZWNfb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCisJCWlmIChkYWlfbGlua1tpXS5jb2RlY19uYW1lICYmICFkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlKSB7CisJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAorCQkJCQkJICJhc29jLWNvZGVjLW5hbWVzIiwKKwkJCQkJCSBkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKKwkJCWlmIChpbmRleCA8IDApCisJCQkJY29udGludWU7CisJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY29kZWMiLAorCQkJCQkgICAgICBpbmRleCk7CisJCQlpZiAoIW5wKSB7CisJCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBjb2RlYyAlcyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fLCBkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJZGFpX2xpbmtbaV0uY29kZWNfb2Zfbm9kZSA9IG5wOworCQkJZGFpX2xpbmtbaV0uY29kZWNfbmFtZSA9IE5VTEw7CisJCX0KKwl9CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wcmVwYXJlX3VzX2V1cm8oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9CisJCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCByZXQgPSAwOworCisJaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgeworCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiB1c19ldXJvIGdwaW8gcmVxdWVzdCAlZCIsIF9fZnVuY19fLAorCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+dXNfZXVyb19ncGlvLCAiVEFWSUxfQ09ERUNfVVNfRVVSTyIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNvZGVjIFVTL0VVUk8gZ3BpbyAlZCBlcnJvciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3BpbywgcmV0KTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1ZHJ4X3N0dWJfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3NuZF9jb250cm9scywKKwkJCQkJIEFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSIlczogYWRkX2NvZGVjX2NvbnRyb2xzIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1zbV9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKG1zbV9kYXBtX3dpZGdldHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zbmRfc3R1Yl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcnhfY2hbXSA9IHsxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsCisJCQkJMTUxfTsKKwl1bnNpZ25lZCBpbnQgdHhfY2hbXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAorCQkJCTEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCisJCQkJMTQwLCAxNDEsIDE0MiwgMTQzfTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAorCQkJCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscywKKwkJCQkJCSAgcnhfY2gpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IFJYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAorCQkJCQkJICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywKKwkJCQkJCSAgdHhfY2gsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IFRYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3N0dWJfYmVfb3BzID0geworCS5od19wYXJhbXMgPSBtc21fc25kX3N0dWJfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2ZlX2RhaV9saW5rc1tdID0geworCisJLyogRnJvbnRFbmQgREFJIExpbmtzICovCisJeworCQkubmFtZSA9ICJNU01TVFVCIE1lZGlhMSIsCisJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2JlX2RhaV9saW5rc1tdID0geworCisJLyogQmFja2VuZCBEQUkgTGlua3MgKi8KKwl7CisJCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAorCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAorCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwkJLmluaXQgPSAmbXNtX2F1ZHJ4X3N0dWJfaW5pdCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLworCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkub3BzID0gJm1zbV9zdHViX2JlX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCisJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCisJCS5ub19wY20gPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5vcHMgPSAmbXNtX3N0dWJfYmVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3N0dWJfZGFpX2xpbmtzWworCQkJIEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKSArCisJCQkgQVJSQVlfU0laRShtc21fc3R1Yl9iZV9kYWlfbGlua3MpXTsKKworc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfc3R1Yl9tc20gPSB7CisJLm5hbWUJCT0gIm1zbXNrdW5rLXN0dWItc25kLWNhcmQiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtc2t1bmtfYXNvY19tYWNoaW5lX29mX21hdGNoW10gID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc21za3Vuay1hc29jLXNuZC10YXZpbCIsCisJICAuZGF0YSA9ICJ0YXZpbF9jb2RlYyJ9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc21za3Vuay1hc29jLXNuZC1zdHViIiwKKwkgIC5kYXRhID0gInN0dWJfY29kZWMifSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkICpwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IE5VTEw7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaWxpbms7CisJaW50IGxlbl8xLCBsZW5fMiwgbGVuXzM7CisJaW50IHRvdGFsX2xpbmtzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG1zbXNrdW5rX2Fzb2NfbWFjaGluZV9vZl9tYXRjaCwgZGV2LT5vZl9ub2RlKTsKKwlpZiAoIW1hdGNoKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE5vIERUIG1hdGNoIGZvdW5kIGZvciBzb3VuZCBjYXJkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhdmlsX2NvZGVjIikpIHsKKwkJY2FyZCA9ICZzbmRfc29jX2NhcmRfdGF2aWxfbXNtOworCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpOworCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc21fdGF2aWxfZmVfZGFpX2xpbmtzKTsKKwkJbGVuXzMgPSBsZW5fMiArIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpOworCQl0b3RhbF9saW5rcyA9IGxlbl8zICsgQVJSQVlfU0laRShtc21fdGF2aWxfYmVfZGFpX2xpbmtzKTsKKwkJbWVtY3B5KG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3MsCisJCSAgICAgICBtc21fY29tbW9uX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtX3RhdmlsX3NuZF9jYXJkX2RhaV9saW5rcyArIGxlbl8xLAorCQkgICAgICAgbXNtX3RhdmlsX2ZlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fdGF2aWxfZmVfZGFpX2xpbmtzKSk7CisJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgbGVuXzIsCisJCSAgICAgICBtc21fY29tbW9uX2JlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2JlX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtX3RhdmlsX3NuZF9jYXJkX2RhaV9saW5rcyArIGxlbl8zLAorCQkgICAgICAgbXNtX3RhdmlsX2JlX2RhaV9saW5rcywKKwkJICAgICAgIHNpemVvZihtc21fdGF2aWxfYmVfZGFpX2xpbmtzKSk7CisKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLHdjbi1idGZtIikpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCisJCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCisJCQkgICAgICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKKwkJfQorCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4IikpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXMoKTogZXh0IGRpc3AgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCisJCQkgICAgICAgZXh0X2Rpc3BfYmVfZGFpX2xpbmssCisJCQkgICAgICAgc2l6ZW9mKGV4dF9kaXNwX2JlX2RhaV9saW5rKSk7CisJCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKKwkJfQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJICAicWNvbSxtaTJzLWF1ZGlvLWludGYiKSkgeworCQkJbWVtY3B5KG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKKwkJCSAgICAgICBtc21fbWkyc19iZV9kYWlfbGlua3MsCisJCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOworCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpOworCQl9CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkgICJxY29tLGF1eHBjbS1hdWRpby1pbnRmIikpIHsKKwkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCisJCQltc21fYXV4cGNtX2JlX2RhaV9saW5rcywKKwkJCXNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOworCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7CisJCX0KKwkJZGFpbGluayA9IG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3M7CisJfSBlbHNlIGlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAic3R1Yl9jb2RlYyIpKSB7CisJCWNhcmQgPSAmc25kX3NvY19jYXJkX3N0dWJfbXNtOworCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKTsKKwkJbGVuXzIgPSBsZW5fMSArIEFSUkFZX1NJWkUobXNtX3N0dWJfYmVfZGFpX2xpbmtzKTsKKworCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzLAorCQkgICAgICAgbXNtX3N0dWJfZmVfZGFpX2xpbmtzLAorCQkgICAgICAgc2l6ZW9mKG1zbV9zdHViX2ZlX2RhaV9saW5rcykpOworCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzICsgbGVuXzEsCisJCSAgICAgICBtc21fc3R1Yl9iZV9kYWlfbGlua3MsCisJCSAgICAgICBzaXplb2YobXNtX3N0dWJfYmVfZGFpX2xpbmtzKSk7CisKKwkJZGFpbGluayA9IG1zbV9zdHViX2RhaV9saW5rczsKKwkJdG90YWxfbGlua3MgPSBsZW5fMjsKKwl9CisKKwlpZiAoY2FyZCkgeworCQljYXJkLT5kYWlfbGluayA9IGRhaWxpbms7CisJCWNhcmQtPm51bV9saW5rcyA9IHRvdGFsX2xpbmtzOworCX0KKworCXJldHVybiBjYXJkOworfQorCitzdGF0aWMgaW50IG1zbV93c2E4ODF4X2luaXQoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCit7CisJdTggc3BrbGVmdF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMCwgMTAxLCAxMDIsIDEwNn07CisJdTggc3BrcmlnaHRfcG9ydHNbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsxMDMsIDEwNCwgMTA1LCAxMDd9OworCXVuc2lnbmVkIGludCBjaF9yYXRlW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MjQwMCwgNjAwLCAzMDAsIDEyMDB9OworCXVuc2lnbmVkIGludCBjaF9tYXNrW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MHgxLCAweEYsIDB4MywgMHgzfTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYyhjb21wb25lbnQpOworCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY29kZWMpIHsKKwkJcHJfZXJyKCIlcyBjb2RlYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKworCWlmICghc3RyY21wKGNvbXBvbmVudC0+bmFtZV9wcmVmaXgsICJTcGtyTGVmdCIpKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIGxlZnQgY2ggbWFwIHRvIGNvZGVjICVzXG4iLAorCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7CisJCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrbGVmdF9wb3J0c1swXSwKKwkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAorCQkJCSZjaF9yYXRlWzBdKTsKKwkJaWYgKGRhcG0tPmNvbXBvbmVudCkgeworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBJTiIpOworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBTUEtSIik7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JSaWdodCIpKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIHJpZ2h0IGNoIG1hcCB0byBjb2RlYyAlc1xuIiwKKwkJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm5hbWUpOworCQl3c2E4ODF4X3NldF9jaGFubmVsX21hcChjb2RlYywgJnNwa3JpZ2h0X3BvcnRzWzBdLAorCQkJCVdTQTg4MVhfTUFYX1NXUl9QT1JUUywgJmNoX21hc2tbMF0sCisJCQkJJmNoX3JhdGVbMF0pOworCQlpZiAoZGFwbS0+Y29tcG9uZW50KSB7CisJCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JSaWdodCBJTiIpOworCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyUmlnaHQgU1BLUiIpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdyb25nIGNvZGVjIG5hbWUgJXNcbiIsIF9fZnVuY19fLAorCQkJY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvbXBvbmVudC0+Y2FyZCk7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19yb290KQorCQl3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LAorCQkJCQkJICAgICAgY29kZWMpOworCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21faW5pdF93c2FfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKndzYV9vZl9ub2RlOworCXUzMiB3c2FfbWF4X2RldnM7CisJdTMyIHdzYV9kZXZfY250OworCWludCBpOworCXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKKwljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOworCWNoYXIgKmRldl9uYW1lX3N0ciA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAicWNvbSx3c2EtbWF4LWRldnMiLCAmd3NhX21heF9kZXZzKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSAiJXM6IHdzYS1tYXgtZGV2cyBwcm9wZXJ0eSBtaXNzaW5nIGluIERUICVzLCByZXQgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCWlmICh3c2FfbWF4X2RldnMgPT0gMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICIlczogTWF4IFdTQSBkZXZpY2VzIGlzIDAgZm9yIHRoaXMgdGFyZ2V0P1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIEdldCBjb3VudCBvZiBXU0EgZGV2aWNlIHBoYW5kbGVzIGZvciB0aGlzIHBsYXRmb3JtICovCisJd3NhX2Rldl9jbnQgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAicWNvbSx3c2EtZGV2cyIsIE5VTEwpOworCWlmICh3c2FfZGV2X2NudCA9PSAtRU5PRU5UKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICIlczogTm8gd3NhIGRldmljZSBkZWZpbmVkIGluIERULlxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAod3NhX2Rldl9jbnQgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IEVycm9yIHJlYWRpbmcgd3NhIGRldmljZSBmcm9tIERULiB3c2FfZGV2X2NudCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdzYV9kZXZfY250KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBFeHBlY3QgdG90YWwgcGhhbmRsZXMgY291bnQgdG8gYmUgTk9UIGxlc3MgdGhhbiBtYXhpbXVtIHBvc3NpYmxlCisJICogV1NBIGNvdW50LiBIb3dldmVyLCBpZiBpdCBpcyBsZXNzLCB0aGVuIGFzc2lnbiBzYW1lIHZhbHVlIHRvCisJICogbWF4IGNvdW50IGFzIHdlbGwuCisJICovCisJaWYgKHdzYV9kZXZfY250IDwgd3NhX21heF9kZXZzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSIlczogd3NhX21heF9kZXZzID0gJWQgY2Fubm90IGV4Y2VlZCB3c2FfZGV2X2NudCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHdzYV9tYXhfZGV2cywgd3NhX2Rldl9jbnQpOworCQl3c2FfbWF4X2RldnMgPSB3c2FfZGV2X2NudDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgcHJlZml4IHN0cmluZyBwYXNzZWQgZm9yIGVhY2ggV1NBIGRldmljZSAqLworCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJxY29tLHdzYS1hdXgtZGV2LXByZWZpeCIpOworCWlmIChyZXQgIT0gd3NhX2Rldl9jbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBleHBlY3RpbmcgJWQgd3NhIHByZWZpeC4gRGVmaW5lZCBvbmx5ICVkIGluIERUXG4iLAorCQkJX19mdW5jX18sIHdzYV9kZXZfY250LCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIEFsbG9jIG1lbSB0byBzdG9yZSBwaGFuZGxlIGFuZCBpbmRleCBpbmZvIG9mIFdTQSBkZXZpY2UsIGlmIGFscmVhZHkKKwkgKiByZWdpc3RlcmVkIHdpdGggQUxTQSBjb3JlCisJICovCisJd3NhODgxeF9kZXZfaW5mbyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB3c2FfbWF4X2RldnMsCisJCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3dzYTg4MXhfZGV2X2luZm8pLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXdzYTg4MXhfZGV2X2luZm8pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBzZWFyY2ggYW5kIGNoZWNrIHdoZXRoZXIgYWxsIFdTQSBkZXZpY2VzIGFyZSBhbHJlYWR5CisJICogcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZSBvciBub3QuIElmIGZvdW5kIGEgbm9kZSwgc3RvcmUKKwkgKiB0aGUgbm9kZSBhbmQgdGhlIGluZGV4IGluIGEgbG9jYWwgYXJyYXkgb2Ygc3RydWN0IGZvciBsYXRlcgorCSAqIHVzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd3NhX2Rldl9jbnQ7IGkrKykgeworCQl3c2Ffb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSAgICAicWNvbSx3c2EtZGV2cyIsIGkpOworCQlpZiAodW5saWtlbHkoIXdzYV9vZl9ub2RlKSkgeworCQkJLyogd2Ugc2hvdWxkIG5vdCBiZSBoZXJlICovCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIiVzOiB3c2EgZGV2IG5vZGUgaXMgbm90IHByZXNlbnRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2ZyZWVfZGV2X2luZm87CisJCX0KKwkJaWYgKHNvY19maW5kX2NvbXBvbmVudCh3c2Ffb2Zfbm9kZSwgTlVMTCkpIHsKKwkJCS8qIFdTQSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZSAqLworCQkJd3NhODgxeF9kZXZfaW5mb1tmb3VuZF0ub2Zfbm9kZSA9IHdzYV9vZl9ub2RlOworCQkJd3NhODgxeF9kZXZfaW5mb1tmb3VuZF0uaW5kZXggPSBpOworCQkJZm91bmQrKzsKKwkJCWlmIChmb3VuZCA9PSB3c2FfbWF4X2RldnMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZm91bmQgPCB3c2FfbWF4X2RldnMpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gZmluZCAlZCBjb21wb25lbnRzLiBGb3VuZCBvbmx5ICVkXG4iLAorCQkJX19mdW5jX18sIHdzYV9tYXhfZGV2cywgZm91bmQpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJIiVzOiBmb3VuZCAlZCB3c2E4ODF4IGRldmljZXMgcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZVxuIiwKKwkJX19mdW5jX18sIGZvdW5kKTsKKworCWNhcmQtPm51bV9hdXhfZGV2cyA9IHdzYV9tYXhfZGV2czsKKwljYXJkLT5udW1fY29uZmlncyA9IHdzYV9tYXhfZGV2czsKKworCS8qIEFsbG9jIGFycmF5IG9mIEFVWCBkZXZzIHN0cnVjdCAqLworCW1zbV9hdXhfZGV2ID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNhcmQtPm51bV9hdXhfZGV2cywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2F1eF9kZXYpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbV9hdXhfZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfZGV2X2luZm87CisJfQorCisJLyogQWxsb2MgYXJyYXkgb2YgY29kZWMgY29uZiBzdHJ1Y3QgKi8KKwltc21fY29kZWNfY29uZiA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjYXJkLT5udW1fYXV4X2RldnMsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYpLAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghbXNtX2NvZGVjX2NvbmYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9hdXhfZGV2OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fYXV4X2RldnM7IGkrKykgeworCQlkZXZfbmFtZV9zdHIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgREVWX05BTUVfU1RSX0xFTiwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWRldl9uYW1lX3N0cikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2ZyZWVfY2RjX2NvbmY7CisJCX0KKworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAgICAicWNvbSx3c2EtYXV4LWRldi1wcmVmaXgiLAorCQkJCQkJICAgIHdzYTg4MXhfZGV2X2luZm9baV0uaW5kZXgsCisJCQkJCQkgICAgd3NhX2F1eGRldl9uYW1lX3ByZWZpeCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byByZWFkIHdzYSBhdXggZGV2IHByZWZpeCwgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfZnJlZV9kZXZfbmFtZV9zdHI7CisJCX0KKworCQlzbnByaW50ZihkZXZfbmFtZV9zdHIsIHN0cmxlbigid3NhODgxeC4lZCIpLCAid3NhODgxeC4lZCIsIGkpOworCQltc21fYXV4X2RldltpXS5uYW1lID0gZGV2X25hbWVfc3RyOworCQltc21fYXV4X2RldltpXS5jb2RlY19uYW1lID0gTlVMTDsKKwkJbXNtX2F1eF9kZXZbaV0uY29kZWNfb2Zfbm9kZSA9CisJCQkJCXdzYTg4MXhfZGV2X2luZm9baV0ub2Zfbm9kZTsKKwkJbXNtX2F1eF9kZXZbaV0uaW5pdCA9IG1zbV93c2E4ODF4X2luaXQ7CisJCW1zbV9jb2RlY19jb25mW2ldLmRldl9uYW1lID0gTlVMTDsKKwkJbXNtX2NvZGVjX2NvbmZbaV0ubmFtZV9wcmVmaXggPSB3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzBdOworCQltc21fY29kZWNfY29uZltpXS5vZl9ub2RlID0KKwkJCQl3c2E4ODF4X2Rldl9pbmZvW2ldLm9mX25vZGU7CisJfQorCWNhcmQtPmNvZGVjX2NvbmYgPSBtc21fY29kZWNfY29uZjsKKwljYXJkLT5hdXhfZGV2ID0gbXNtX2F1eF9kZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZGV2X25hbWVfc3RyOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZGV2X25hbWVfc3RyKTsKK2Vycl9mcmVlX2NkY19jb25mOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbXNtX2NvZGVjX2NvbmYpOworZXJyX2ZyZWVfYXV4X2RldjoKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG1zbV9hdXhfZGV2KTsKK2Vycl9mcmVlX2Rldl9pbmZvOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgd3NhODgxeF9kZXZfaW5mbyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX2kyc19hdXhwY21faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqbXV4c2VsOworCWludCBjb3VudDsKKwl1MzIgbWkyc19tYXN0ZXJfc2xhdmVbTUkyU19NQVhdOworCWludCByZXQ7CisJY2hhciAqc3RyW1BDTV9JMlNfU0VMX01BWF0gPSB7CisJCSJscGFpZl9wcmlfbW9kZV9tdXhzZWwiLAorCQkibHBhaWZfc2VjX21vZGVfbXV4c2VsIiwKKwkJImxwYWlmX3RlcnRfbW9kZV9tdXhzZWwiLAorCQkibHBhaWZfcXVhdF9tb2RlX211eHNlbCIKKwl9OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUkyU19NQVg7IGNvdW50KyspIHsKKwkJbXV0ZXhfaW5pdCgmbWkyc19pbnRmX2NvbmZbY291bnRdLmxvY2spOworCQltaTJzX2ludGZfY29uZltjb3VudF0ucmVmX2NudCA9IDA7CisJfQorCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgQVVYX1BDTV9NQVg7IGNvdW50KyspIHsKKwkJbXV0ZXhfaW5pdCgmYXV4cGNtX2ludGZfY29uZltjb3VudF0ubG9jayk7CisJCWF1eHBjbV9pbnRmX2NvbmZbY291bnRdLnJlZl9jbnQgPSAwOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFBDTV9JMlNfU0VMX01BWDsgY291bnQrKykgeworCQltdXRleF9pbml0KCZtaTJzX2F1eHBjbV9jb25mW2NvdW50XS5sb2NrKTsKKwkJbWkyc19hdXhwY21fY29uZltjb3VudF0ucGNtX2kyc19zZWxfdnRfYWRkciA9IE5VTEw7CisJfQorCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgUENNX0kyU19TRUxfTUFYOyBjb3VudCsrKSB7CisJCW11eHNlbCA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCQkgICAgICBzdHJbY291bnRdKTsKKwkJaWYgKG11eHNlbCkgeworCQkJbWkyc19hdXhwY21fY29uZltjb3VudF0ucGNtX2kyc19zZWxfdnRfYWRkcgorCQkJCT0gaW9yZW1hcChtdXhzZWwtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG11eHNlbCkpOworCQl9CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkicWNvbSxtc20tbWkycy1tYXN0ZXIiLAorCQkJbWkyc19tYXN0ZXJfc2xhdmUsIE1JMlNfTUFYKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBubyBxY29tLG1zbS1taTJzLW1hc3RlciBpbiBEVCBub2RlXG4iLAorCQkJX19mdW5jX18pOworCX0gZWxzZSB7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1JMlNfTUFYOyBjb3VudCsrKSB7CisJCQltaTJzX2ludGZfY29uZltjb3VudF0ubXNtX2lzX21pMnNfbWFzdGVyID0KKwkJCQltaTJzX21hc3Rlcl9zbGF2ZVtjb3VudF07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9pMnNfYXV4cGNtX2RlaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFBDTV9JMlNfU0VMX01BWDsgY291bnQrKykgeworCQlpZiAobWkyc19hdXhwY21fY29uZltjb3VudF0ucGNtX2kyc19zZWxfdnRfYWRkciAhPQorCQkgICAgTlVMTCkgeworCQkJaW91bm1hcCgKKwkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOworCQkJbWkyc19hdXhwY21fY29uZltjb3VudF0ucGNtX2kyc19zZWxfdnRfYWRkciA9IE5VTEw7CisJCX0KKwkJbXV0ZXhfZGVzdHJveSgmbWkyc19hdXhwY21fY29uZltjb3VudF0ubG9jayk7CisJfQorCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgQVVYX1BDTV9NQVg7IGNvdW50KyspIHsKKwkJbXV0ZXhfZGVzdHJveSgmYXV4cGNtX2ludGZfY29uZltjb3VudF0ubG9jayk7CisJCWF1eHBjbV9pbnRmX2NvbmZbY291bnRdLnJlZl9jbnQgPSAwOworCX0KKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1JMlNfTUFYOyBjb3VudCsrKSB7CisJCW11dGV4X2Rlc3Ryb3koJm1pMnNfaW50Zl9jb25mW2NvdW50XS5sb2NrKTsKKwkJbWkyc19pbnRmX2NvbmZbY291bnRdLnJlZl9jbnQgPSAwOworCQltaTJzX2ludGZfY29uZltjb3VudF0ubXNtX2lzX21pMnNfbWFzdGVyID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfbWFjaGluZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7CisJY29uc3QgY2hhciAqbWJoY19hdWRpb19qYWNrX3R5cGUgPSBOVUxMOworCWNoYXIgKm1jbGtfZnJlcV9wcm9wX25hbWU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJaW50IHJldDsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gc3VwcGxpZWQgZnJvbSBkZXZpY2UgdHJlZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FyZCA9IHBvcHVsYXRlX3NuZF9jYXJkX2RhaWxpbmtzKCZwZGV2LT5kZXYpOworCWlmICghY2FyZCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2FyZCB1bmluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShjYXJkLCBwZGF0YSk7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAicWNvbSxtb2RlbCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGFyc2UgY2FyZCBuYW1lIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKGNhcmQsICJxY29tLGF1ZGlvLXJvdXRpbmciKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNlIGF1ZGlvIHJvdXRpbmcgZmFpbGVkLCBlcnI6JWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwltYXRjaCA9IG9mX21hdGNoX25vZGUobXNtc2t1bmtfYXNvY19tYWNoaW5lX29mX21hdGNoLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmICghbWF0Y2gpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIG1hdGNoZWQgY29kZWMgaXMgZm91bmQuXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwltY2xrX2ZyZXFfcHJvcF9uYW1lID0gInFjb20sdGF2aWwtbWNsay1jbGstZnJlcSI7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCW1jbGtfZnJlcV9wcm9wX25hbWUsICZwZGF0YS0+bWNsa19mcmVxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkLCBlcnIlZFxuIiwKKwkJCW1jbGtfZnJlcV9wcm9wX25hbWUsCisJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAocGRhdGEtPm1jbGtfZnJlcSAhPSBDT0RFQ19FWFRfQ0xLX1JBVEUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgbWNsayBmcmVxICV1XG4iLAorCQkJcGRhdGEtPm1jbGtfZnJlcSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IG1zbV9wb3B1bGF0ZV9kYWlfbGlua19jb21wb25lbnRfb2Zfbm9kZShjYXJkKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBtc21faW5pdF93c2FfZGV2KHBkZXYsIGNhcmQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgY2FyZCk7CisJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CisJCWlmIChjb2RlY19yZWdfZG9uZSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyOworCX0KKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU291bmQgY2FyZCAlcyByZWdpc3RlcmVkXG4iLCBjYXJkLT5uYW1lKTsKKwlzcGRldiA9IHBkZXY7CisKKwlyZXQgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwgTlVMTCwgTlVMTCwgJnBkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIGFkZCBjaGlsZCBub2RlcywgcmV0PSVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfSBlbHNlIHsKKwkJcGRhdGEtPmhwaF9lbjFfZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCQkicWNvbSxocGgtZW4xLWdwaW8iLCAwKTsKKwkJaWYgKCFwZGF0YS0+aHBoX2VuMV9ncGlvX3ApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgInByb3BlcnR5ICVzIG5vdCBkZXRlY3RlZCBpbiBub2RlICVzIiwKKwkJCQkicWNvbSxocGgtZW4xLWdwaW8iLAorCQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQl9CisKKwkJcGRhdGEtPmhwaF9lbjBfZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCQkicWNvbSxocGgtZW4wLWdwaW8iLCAwKTsKKwkJaWYgKCFwZGF0YS0+aHBoX2VuMF9ncGlvX3ApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgInByb3BlcnR5ICVzIG5vdCBkZXRlY3RlZCBpbiBub2RlICVzIiwKKwkJCQkicWNvbSxocGgtZW4wLWdwaW8iLAorCQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQl9CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1iaGMtYXVkaW8tamFjay10eXBlIiwgJm1iaGNfYXVkaW9famFja190eXBlKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAorCQkJInFjb20sbWJoYy1hdWRpby1qYWNrLXR5cGUiLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkphY2sgdHlwZSBwcm9wZXJ0aWVzIHNldCB0byBkZWZhdWx0Iik7CisJfSBlbHNlIHsKKwkJaWYgKCFzdHJjbXAobWJoY19hdWRpb19qYWNrX3R5cGUsICI0LXBvbGUtamFjayIpKQorCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVGhpcyBoYXJkd2FyZSBoYXMgNCBwb2xlIGphY2siKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjUtcG9sZS1qYWNrIikpCisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJUaGlzIGhhcmR3YXJlIGhhcyA1IHBvbGUgamFjayIpOworCQllbHNlIGlmICghc3RyY21wKG1iaGNfYXVkaW9famFja190eXBlLCAiNi1wb2xlLWphY2siKSkKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlRoaXMgaGFyZHdhcmUgaGFzIDYgcG9sZSBqYWNrIik7CisJCWVsc2UKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlVua25vd24gdmFsdWUsIHNldCB0byBkZWZhdWx0Iik7CisJfQorCS8qCisJICogUGFyc2UgVVMtRXVybyBncGlvIGluZm8gZnJvbSBEVC4gUmVwb3J0IG5vIGVycm9yIGlmIHVzLWV1cm8KKwkgKiBlbnRyeSBpcyBub3QgZm91bmQgaW4gRFQgZmlsZSBhcyBzb21lIHRhcmdldHMgZG8gbm90IHN1cHBvcnQKKwkgKiBVUy1FdXJvIGRldGVjdGlvbgorCSAqLworCXBkYXRhLT51c19ldXJvX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT51c19ldXJvX2dwaW8pKQorCQlwZGF0YS0+dXNfZXVyb19ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgMCk7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT51c19ldXJvX2dwaW8pICYmICghcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm9wZXJ0eSAlcyBub3QgZGV0ZWN0ZWQgaW4gbm9kZSAlcyIsCisJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZGV0ZWN0ZWQiLAorCQkJInFjb20sdXMtZXVyby1ncGlvcyIpOworCQl3Y2RfbWJoY19jZmcuc3dhcF9nbmRfbWljID0gbXNtX3N3YXBfZ25kX21pYzsKKwl9CisKKwlyZXQgPSBtc21fcHJlcGFyZV91c19ldXJvKGNhcmQpOworCWlmIChyZXQpCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1zbV9wcmVwYXJlX3VzX2V1cm8gZmFpbGVkICglZClcbiIsCisJCQlyZXQpOworCisJbXNtX2kyc19hdXhwY21faW5pdChwZGV2KTsKKworCWlzX2luaXRpYWxfYm9vdCA9IHRydWU7CisJcmV0ID0gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoIm1zbXNrdW5rIiwgQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU4sCisJCQkJICAgICAgJnNlcnZpY2VfbmIpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBBdWRpbyBub3RpZmllciByZWdpc3RlciBmYWlsZWQgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiAwOworZXJyOgorCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfbWFjaGluZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQorCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvID4gMCkgeworCQlncGlvX2ZyZWUocGRhdGEtPnVzX2V1cm9fZ3Bpbyk7CisJCXBkYXRhLT51c19ldXJvX2dwaW8gPSAwOworCX0KKwltc21faTJzX2F1eHBjbV9kZWluaXQoKTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21za3Vua19hc29jX21hY2hpbmVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbXNrdW5rX2Fzb2NfbWFjaGluZV9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1zbV9hc29jX21hY2hpbmVfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9hc29jX21hY2hpbmVfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXNtc2t1bmtfYXNvY19tYWNoaW5lX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgbXNtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtc2t1bmtfYXNvY19tYWNoaW5lX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9NYWtlZmlsZSBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFjMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKK3NuZC1zb2MtcWRzcDZ2Mi1vYmpzICs9IG1zbS1kYWktcTYtdjIubyBtc20tcGNtLXE2LXYyLm8gbXNtLXBjbS1yb3V0aW5nLXYyLm8gXAorCQkJbXNtLWNvbXByZXNzLXE2LXYyLm8gbXNtLWNvbXByLXE2LXYyLm8gXAorCQkJbXNtLXBjbS1hZmUtdjIubyBtc20tcGNtLXZvaXAtdjIubyBcCisJCQltc20tcGNtLXZvaWNlLXYyLm8gbXNtLWRhaS1xNi1oZG1pLXYyLm8gXAorCQkJbXNtLWxzbS1jbGllbnQubyBtc20tcGNtLWhvc3Qtdm9pY2UtdjIubyBcCisJCQltc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5vIG1zbS1wY20tbG9vcGJhY2stdjIubyBcCisJCQltc20tZGFpLXNsaW0ubyBcCisJCQlhZHNwX2Vyci5vCitvYmotJChDT05GSUdfU05EX1NPQ19RRFNQNlYyKSArPSBzbmQtc29jLXFkc3A2djIubyBtc20tcGNtLWR0bWYtdjIubyBcCisJCQkJIG1zbS1kYWktc3R1Yi12Mi5vCitvYmotJChDT05GSUdfU05EX0hXREVQKSArPSBtc20tcGNtLXJvdXRpbmctZGV2ZGVwLm8KK29iai0kKENPTkZJR19EVFNfRUFHTEUpICs9IG1zbS1kdHMtZWFnbGUubworb2JqLSQoQ09ORklHX0RPTEJZX0RBUCkgKz0gbXNtLWRvbGJ5LWRhcC1jb25maWcubworb2JqLSQoQ09ORklHX0RPTEJZX0RTMikgKz0gbXNtLWRzMi1kYXAtY29uZmlnLm8KK29iai0kKENPTkZJR19EVFNfU1JTX1RNKSArPSBtc20tZHRzLXNycy10bS1jb25maWcubworb2JqLSQoQ09ORklHX1FUSV9QUCkgKz0gbXNtLXF0aS1wcC1jb25maWcubworb2JqLXkgKz0gYXVkaW9fY2FsaWJyYXRpb24ubyBhdWRpb19jYWxfdXRpbHMubyBxNmFkbS5vIHE2YWZlLm8gcTZhc20ubyBcCisJcTZhdWRpby12Mi5vIHE2dm9pY2UubyBxNmNvcmUubyBydGFjLm8gcTZsc20ubyBhdWRpb19zbGltc2xhdmUubyBcCisJbXNtLXBjbS1xNi1ub2lycS5vCitvY21lbS1hdWRpby1vYmpzICs9IGF1ZGlvX29jbWVtLm8KK29iai0kKENPTkZJR19BVURJT19PQ01FTSkgKz0gb2NtZW0tYXVkaW8ubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL2Fkc3BfZXJyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYWRzcF9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdiZDZhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL2Fkc3BfZXJyLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorCisKKy8qIEVSUk9SIFNUUklORyAqLworLyogU3VjY2Vzcy4gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBubyBlcnJvcnMuICovCisjZGVmaW5lIEFEU1BfRU9LX1NUUiAgICAgICAgICAiQURTUF9FT0siCisvKiBHZW5lcmFsIGZhaWx1cmUuICovCisjZGVmaW5lIEFEU1BfRUZBSUxFRF9TVFIgICAgICAiQURTUF9FRkFJTEVEIgorLyogQmFkIG9wZXJhdGlvbiBwYXJhbWV0ZXIuICovCisjZGVmaW5lIEFEU1BfRUJBRFBBUkFNX1NUUiAgICAiQURTUF9FQkFEUEFSQU0iCisvKiBVbnN1cHBvcnRlZCByb3V0aW5lIG9yIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgQURTUF9FVU5TVVBQT1JURURfU1RSICJBRFNQX0VVTlNVUFBPUlRFRCIKKy8qIFVuc3VwcG9ydGVkIHZlcnNpb24uICovCisjZGVmaW5lIEFEU1BfRVZFUlNJT05fU1RSICAgICAiQURTUF9FVkVSU0lPTiIKKy8qIFVuZXhwZWN0ZWQgcHJvYmxlbSBlbmNvdW50ZXJlZC4gKi8KKyNkZWZpbmUgQURTUF9FVU5FWFBFQ1RFRF9TVFIgICJBRFNQX0VVTkVYUEVDVEVEIgorLyogVW5oYW5kbGVkIHByb2JsZW0gb2NjdXJyZWQuICovCisjZGVmaW5lIEFEU1BfRVBBTklDX1NUUiAgICAgICAiQURTUF9FUEFOSUMiCisvKiBVbmFibGUgdG8gYWxsb2NhdGUgcmVzb3VyY2UuICovCisjZGVmaW5lIEFEU1BfRU5PUkVTT1VSQ0VfU1RSICAiQURTUF9FTk9SRVNPVVJDRSIKKy8qIEludmFsaWQgaGFuZGxlLiAqLworI2RlZmluZSBBRFNQX0VIQU5ETEVfU1RSICAgICAgIkFEU1BfRUhBTkRMRSIKKy8qIE9wZXJhdGlvbiBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQURTUF9FQUxSRUFEWV9TVFIgICAgICJBRFNQX0VBTFJFQURZIgorLyogT3BlcmF0aW9uIGlzIG5vdCByZWFkeSB0byBiZSBwcm9jZXNzZWQuICovCisjZGVmaW5lIEFEU1BfRU5PVFJFQURZX1NUUiAgICAiQURTUF9FTk9UUkVBRFkiCisvKiBPcGVyYXRpb24gaXMgcGVuZGluZyBjb21wbGV0aW9uLiAqLworI2RlZmluZSBBRFNQX0VQRU5ESU5HX1NUUiAgICAgIkFEU1BfRVBFTkRJTkciCisvKiBPcGVyYXRpb24gY291bGQgbm90IGJlIGFjY2VwdGVkIG9yIHByb2Nlc3NlZC4gKi8KKyNkZWZpbmUgQURTUF9FQlVTWV9TVFIgICAgICAgICJBRFNQX0VCVVNZIgorLyogT3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLiAqLworI2RlZmluZSBBRFNQX0VBQk9SVEVEX1NUUiAgICAgIkFEU1BfRUFCT1JURUQiCisvKiBPcGVyYXRpb24gcHJlZW1wdGVkIGJ5IGEgaGlnaGVyIHByaW9yaXR5LiAqLworI2RlZmluZSBBRFNQX0VQUkVFTVBURURfU1RSICAgIkFEU1BfRVBSRUVNUFRFRCIKKy8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCisjZGVmaW5lIEFEU1BfRUNPTlRJTlVFX1NUUiAgICAiQURTUF9FQ09OVElOVUUiCisvKiBPcGVyYXRpb24gcmVxdWVzdHMgaW1tZWRpYXRlIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KKyNkZWZpbmUgQURTUF9FSU1NRURJQVRFX1NUUiAgICJBRFNQX0VJTU1FRElBVEUiCisvKiBPcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiAqLworI2RlZmluZSBBRFNQX0VOT1RJTVBMX1NUUiAgICAgIkFEU1BfRU5PVElNUEwiCisvKiBPcGVyYXRpb24gbmVlZHMgbW9yZSBkYXRhIG9yIHJlc291cmNlcy4gKi8KKyNkZWZpbmUgQURTUF9FTkVFRE1PUkVfU1RSICAgICJBRFNQX0VORUVETU9SRSIKKy8qIE9wZXJhdGlvbiBkb2VzIG5vdCBoYXZlIG1lbW9yeS4gKi8KKyNkZWZpbmUgQURTUF9FTk9NRU1PUllfU1RSICAgICJBRFNQX0VOT01FTU9SWSIKKy8qIEl0ZW0gZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lIEFEU1BfRU5PVEVYSVNUX1NUUiAgICAiQURTUF9FTk9URVhJU1QiCisvKiBVbmV4cGVjdGVkIGVycm9yIGNvZGUuICovCisjZGVmaW5lIEFEU1BfRVJSX01BWF9TVFIgICAgICAiQURTUF9FUlJfTUFYIgorCisjaWZkZWYgQ09ORklHX1NORF9TT0NfUURTUF9ERUJVRworc3RhdGljIGJvb2wgYWRzcF9lcnJfcGFuaWM7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Fkc3BfZXJyOworCitzdGF0aWMgc3NpemVfdCBhZHNwX2Vycl9kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKKwljb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgY21kOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIHVidWYsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjbWQgPT0gJzAnKQorCQlhZHNwX2Vycl9wYW5pYyA9IGZhbHNlOworCWVsc2UKKwkJYWRzcF9lcnJfcGFuaWMgPSB0cnVlOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWRzcF9lcnJfZGVidWdfb3BzID0geworCS53cml0ZSA9IGFkc3BfZXJyX2RlYnVnX3dyaXRlLAorfTsKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBhZHNwX2Vycl9jb2RlIHsKKwlpbnQJCWxueF9lcnJfY29kZTsKKwljaGFyCSphZHNwX2Vycl9zdHI7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWRzcF9lcnJfY29kZSBhZHNwX2Vycl9jb2RlX2luZm9bQURTUF9FUlJfTUFYKzFdID0geworCXsgMCwgQURTUF9FT0tfU1RSfSwKKwl7IC1FTk9UUkVDT1ZFUkFCTEUsIEFEU1BfRUZBSUxFRF9TVFJ9LAorCXsgLUVJTlZBTCwgQURTUF9FQkFEUEFSQU1fU1RSfSwKKwl7IC1FT1BOT1RTVVBQLCBBRFNQX0VVTlNVUFBPUlRFRF9TVFJ9LAorCXsgLUVOT1BST1RPT1BULCBBRFNQX0VWRVJTSU9OX1NUUn0sCisJeyAtRU5PVFJFQ09WRVJBQkxFLCBBRFNQX0VVTkVYUEVDVEVEX1NUUn0sCisJeyAtRU5PVFJFQ09WRVJBQkxFLCBBRFNQX0VQQU5JQ19TVFJ9LAorCXsgLUVOT1NQQywgQURTUF9FTk9SRVNPVVJDRV9TVFJ9LAorCXsgLUVCQURSLCBBRFNQX0VIQU5ETEVfU1RSfSwKKwl7IC1FQUxSRUFEWSwgQURTUF9FQUxSRUFEWV9TVFJ9LAorCXsgLUVQRVJNLCBBRFNQX0VOT1RSRUFEWV9TVFJ9LAorCXsgLUVJTlBST0dSRVNTLCBBRFNQX0VQRU5ESU5HX1NUUn0sCisJeyAtRUJVU1ksIEFEU1BfRUJVU1lfU1RSfSwKKwl7IC1FQ0FOQ0VMRUQsIEFEU1BfRUFCT1JURURfU1RSfSwKKwl7IC1FQUdBSU4sIEFEU1BfRVBSRUVNUFRFRF9TVFJ9LAorCXsgLUVBR0FJTiwgQURTUF9FQ09OVElOVUVfU1RSfSwKKwl7IC1FQUdBSU4sIEFEU1BfRUlNTUVESUFURV9TVFJ9LAorCXsgLUVBR0FJTiwgQURTUF9FTk9USU1QTF9TVFJ9LAorCXsgLUVOT0RBVEEsIEFEU1BfRU5FRURNT1JFX1NUUn0sCisJeyAtRUFEViwgQURTUF9FUlJfTUFYX1NUUn0sCisJeyAtRU5PTUVNLCBBRFNQX0VOT01FTU9SWV9TVFJ9LAorCXsgLUVOT0RFViwgQURTUF9FTk9URVhJU1RfU1RSfSwKKwl7IC1FQURWLCBBRFNQX0VSUl9NQVhfU1RSfSwKK307CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19RRFNQX0RFQlVHCitzdGF0aWMgaW5saW5lIHZvaWQgYWRzcF9lcnJfY2hlY2tfcGFuaWModTMyIGFkc3BfZXJyb3IpCit7CisJaWYgKGFkc3BfZXJyX3BhbmljICYmIGFkc3BfZXJyb3IgIT0gQURTUF9FQUxSRUFEWSkKKwkJcGFuaWMoIiVzOiBlbmNvdW50ZXIgYWRzcF9lcnI9MHgleFxuIiwgX19mdW5jX18sIGFkc3BfZXJyb3IpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHNwX2Vycl9jaGVja19wYW5pYyh1MzIgYWRzcF9lcnJvcikge30KKyNlbmRpZgorCitpbnQgYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSh1MzIgYWRzcF9lcnJvcikKK3sKKwlhZHNwX2Vycl9jaGVja19wYW5pYyhhZHNwX2Vycm9yKTsKKworCWlmIChhZHNwX2Vycm9yID4gQURTUF9FUlJfTUFYKQorCQlyZXR1cm4gYWRzcF9lcnJfY29kZV9pbmZvW0FEU1BfRVJSX01BWF0ubG54X2Vycl9jb2RlOworCWVsc2UKKwkJcmV0dXJuIGFkc3BfZXJyX2NvZGVfaW5mb1thZHNwX2Vycm9yXS5sbnhfZXJyX2NvZGU7Cit9CisKK2NoYXIgKmFkc3BfZXJyX2dldF9lcnJfc3RyKHUzMiBhZHNwX2Vycm9yKQoreworCWlmIChhZHNwX2Vycm9yID4gQURTUF9FUlJfTUFYKQorCQlyZXR1cm4gYWRzcF9lcnJfY29kZV9pbmZvW0FEU1BfRVJSX01BWF0uYWRzcF9lcnJfc3RyOworCWVsc2UKKwkJcmV0dXJuIGFkc3BfZXJyX2NvZGVfaW5mb1thZHNwX2Vycm9yXS5hZHNwX2Vycl9zdHI7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1FEU1BfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorc3RhdGljIGludCBfX2luaXQgYWRzcF9lcnJfaW5pdCh2b2lkKQoreworCisKKwlkZWJ1Z2ZzX2Fkc3BfZXJyID0gZGVidWdmc19jcmVhdGVfZmlsZSgibXNtX2Fkc3BfYXVkaW9fZGVidWciLAorCQkJCQkgICAgICAgU19JRlJFRyB8IDA0NDQsIE5VTEwsIE5VTEwsCisJCQkJCSAgICAgICAmYWRzcF9lcnJfZGVidWdfb3BzKTsKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoYWRzcF9lcnJfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19jYWxfdXRpbHMuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19jYWxfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgwODdiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbF91dGlscy5jCkBAIC0wLDAgKzEsOTY1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+CisKK3N0YXRpYyBpbnQgdW5tYXBfbWVtb3J5KHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKKwkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKKworc2l6ZV90IGdldF9jYWxfaW5mb19zaXplKGludDMyX3QgY2FsX3R5cGUpCit7CisJc2l6ZV90IHNpemUgPSAwOworCisJc3dpdGNoIChjYWxfdHlwZSkgeworCWNhc2UgQ1ZQX1ZPQ19SWF9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX3RvcCk7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX3RvcCk7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ1BST0NfU1RBVElDX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2Nwcm9jKTsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DUFJPQ19EWU5BTUlDX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2N2b2wpOworCQlicmVhazsKKwljYXNlIENWU19WT0NTVFJNX1NUQVRJQ19DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ0RFVl9DRkdfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY2Rldl9jZmcpOworCQlicmVhazsKKwljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DT0xfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wpOworCQlicmVhazsKKwljYXNlIENWUF9WT0NQUk9DX0RZTkFNSUNfQ09MX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sKTsKKwkJYnJlYWs7CisJY2FzZSBDVlNfVk9DU1RSTV9TVEFUSUNfQ09MX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sKTsKKwkJYnJlYWs7CisJY2FzZSBBRE1fVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FkbV90b3ApOworCQlicmVhazsKKwljYXNlIEFETV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgorCWNhc2UgQ09SRV9DVVNUT01fVE9QT0xPR0lFU19DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQURNX0FVRFBST0NfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHByb2MpOworCQlicmVhazsKKwljYXNlIEFETV9BVURWT0xfQ0FMX1RZUEU6CisJY2FzZSBBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbCk7CisJCWJyZWFrOworCWNhc2UgQVNNX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hc21fdG9wKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQVNNX0FVRFNUUk1fQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHN0cm0pOworCQlicmVhazsKKwljYXNlIEFGRV9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcCk7CisJCWJyZWFrOworCWNhc2UgQUZFX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIEFGRV9DT01NT05fUlhfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZSk7CisJCWJyZWFrOworCWNhc2UgQUZFX0NPTU1PTl9UWF9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfRkJfU1BLUl9QUk9UX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19zcGtfcHJvdF9jZmcpOworCQlicmVhazsKKwljYXNlIEFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEU6CisJCS8qCisJCSAqIFNpbmNlIGdldCBhbmQgc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGFyZSBkaWZmZXJlbnQgaW4gc2l6ZQorCQkgKiB1c2UgdGhlIG1heGltdW0gc2l6ZSBvZiBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCSAqLworCQlzaXplID0gbWF4KHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfdGhfdmlfZnRtX2NmZyksCisJCQkgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX3BhcmFtKSk7CisJCWJyZWFrOworCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxfVFlQRToKKwkJLyoKKwkJICogU2luY2UgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyIHN0cnVjdHVyZXMgYXJlIGRpZmZlcmVudCBpbiBzaXplCisJCSAqIHVzZSB0aGUgbWF4aW11bSBzaXplIG9mIGdldCBhbmQgc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmUKKwkJICovCisJCXNpemUgPSBtYXgoc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19zcF9leF92aV9mdG1fY2ZnKSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfZXhfdmlfcGFyYW0pKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQU5DX0NBTF9UWVBFOgorCQlzaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQUFOQ19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWFuYyk7CisJCWJyZWFrOworCWNhc2UgQUZFX0hXX0RFTEFZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19od19kZWxheSk7CisJCWJyZWFrOworCWNhc2UgQUZFX1NJREVUT05FX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19zaWRldG9uZSk7CisJCWJyZWFrOworCWNhc2UgTFNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIExTTV9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCk7CisJCWJyZWFrOworCWNhc2UgVUxQX0xTTV9UT1BPTE9HWV9JRF9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCk7CisJCWJyZWFrOworCWNhc2UgTFNNX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19sc20pOworCQlicmVhazsKKwljYXNlIEFETV9SVEFDX0lORk9fQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIFZPSUNFX1JUQUNfSU5GT19DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQURNX1JUQUNfQVBSX0NBTF9UWVBFOgorCQlzaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBU01fUlRBQ19BUFJfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIFZPSUNFX1JUQUNfQVBSX0NBTF9UWVBFOgorCQlzaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNQURfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIFVMUF9BRkVfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZSk7CisJCWJyZWFrOworCWNhc2UgVUxQX0xTTV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtKTsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIEFVRElPX0NPUkVfTUVUQUlORk9fQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21ldGFpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBTUlNfVFJVTUVESUFfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOkludmFsaWQgY2FsIHR5cGUgJWQhIiwKKwkJCV9fZnVuY19fLCBjYWxfdHlwZSk7CisJfQorCXJldHVybiBzaXplOworfQorCitzaXplX3QgZ2V0X3VzZXJfY2FsX3R5cGVfc2l6ZShpbnQzMl90IGNhbF90eXBlKQoreworCXNpemVfdCBzaXplID0gMDsKKworCXN3aXRjaCAoY2FsX3R5cGUpIHsKKwljYXNlIENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY190b3ApOworCQlicmVhazsKKwljYXNlIENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY190b3ApOworCQlicmVhazsKKwljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jcHJvYyk7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jdm9sKTsKKwkJYnJlYWs7CisJY2FzZSBDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKTsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DREVWX0NGR19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jZGV2X2NmZyk7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ1BST0NfU1RBVElDX0NPTF9DQUxfVFlQRToKKwljYXNlIENWUF9WT0NQUk9DX0RZTkFNSUNfQ09MX0NBTF9UWVBFOgorCWNhc2UgQ1ZTX1ZPQ1NUUk1fU1RBVElDX0NPTF9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jX2NvbCk7CisJCWJyZWFrOworCWNhc2UgQURNX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZG1fdG9wKTsKKwkJYnJlYWs7CisJY2FzZSBBRE1fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKKwljYXNlIENPUkVfQ1VTVE9NX1RPUE9MT0dJRVNfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKTsKKwkJYnJlYWs7CisJY2FzZSBBRE1fQVVEUFJPQ19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXVkcHJvYyk7CisJCWJyZWFrOworCWNhc2UgQURNX0FVRFZPTF9DQUxfVFlQRToKKwljYXNlIEFETV9SVEFDX0FVRFZPTF9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXVkdm9sKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FzbV90b3ApOworCQlicmVhazsKKwljYXNlIEFTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7CisJCWJyZWFrOworCWNhc2UgQVNNX0FVRFNUUk1fQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHN0cm0pOworCQlicmVhazsKKwljYXNlIEFGRV9UT1BPTE9HWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlX3RvcCk7CisJCWJyZWFrOworCWNhc2UgQUZFX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQ09NTU9OX1JYX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZmUpOworCQlicmVhazsKKwljYXNlIEFGRV9DT01NT05fVFhfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FmZSk7CisJCWJyZWFrOworCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3RfY2ZnKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF9UWVBFOgorCQkvKgorCQkgKiBTaW5jZSBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlcyBhcmUgZGlmZmVyZW50IGluIHNpemUKKwkJICogdXNlIHRoZSBtYXhpbXVtIHNpemUgb2YgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyIHN0cnVjdHVyZQorCQkgKi8KKwkJc2l6ZSA9IG1heChzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX2Z0bV9jZmcpLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9wYXJhbSkpOworCQlicmVhazsKKwljYXNlIEFGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMX1RZUEU6CisJCS8qCisJCSAqIFNpbmNlIGdldCBhbmQgc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGFyZSBkaWZmZXJlbnQgaW4gc2l6ZQorCQkgKiB1c2UgdGhlIG1heGltdW0gc2l6ZSBvZiBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlCisJCSAqLworCQlzaXplID0gbWF4KHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfZXhfdmlfZnRtX2NmZyksCisJCQkgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX3BhcmFtKSk7CisJCWJyZWFrOworCWNhc2UgQUZFX0FOQ19DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQUZFX0FBTkNfQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FhbmMpOworCQlicmVhazsKKwljYXNlIEFGRV9IV19ERUxBWV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaHdfZGVsYXkpOworCQlicmVhazsKKwljYXNlIEFGRV9TSURFVE9ORV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc2lkZXRvbmUpOworCQlicmVhazsKKwljYXNlIExTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7CisJCWJyZWFrOworCWNhc2UgTFNNX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc21fdG9wKTsKKwkJYnJlYWs7CisJY2FzZSBVTFBfTFNNX1RPUE9MT0dZX0lEX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc21fdG9wKTsKKwkJYnJlYWs7CisJY2FzZSBMU01fQ0FMX1RZUEU6CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2xzbSk7CisJCWJyZWFrOworCWNhc2UgQURNX1JUQUNfSU5GT19DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFOgorCQlzaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRE1fUlRBQ19BUFJfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIEFTTV9SVEFDX0FQUl9DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUlRBQ19BUFJfQ0FMX1RZUEU6CisJCXNpemUgPSAwOworCQlicmVhazsKKwljYXNlIE1BRF9DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgVUxQX0FGRV9DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlKTsKKwkJYnJlYWs7CisJY2FzZSBVTFBfTFNNX0NBTF9UWVBFOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc20pOworCQlicmVhazsKKwljYXNlIERUU19FQUdMRV9DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgQVVESU9fQ09SRV9NRVRBSU5GT19DQUxfVFlQRToKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfbWV0YWluZm8pOworCQlicmVhazsKKwljYXNlIFNSU19UUlVNRURJQV9DQUxfVFlQRToKKwkJc2l6ZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6SW52YWxpZCBjYWwgdHlwZSAlZCEiLAorCQkJX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK2ludDMyX3QgY2FsX3V0aWxzX2dldF9jYWxfdHlwZV92ZXJzaW9uKHZvaWQgKmNhbF90eXBlX2RhdGEpCit7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljICpkYXRhID0gTlVMTDsKKworCWRhdGEgPSAoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljICopY2FsX3R5cGVfZGF0YTsKKworCXJldHVybiBkYXRhLT5jYWxfaGRyLnZlcnNpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY3JlYXRlX2NhbF90eXBlX2RhdGEoCisJCQkJc3RydWN0IGNhbF90eXBlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNhbF90eXBlX2RhdGEJKmNhbF90eXBlID0gTlVMTDsKKworCWlmICgoaW5mby0+cmVnLmNhbF90eXBlIDwgMCkgfHwKKwkJKGluZm8tPnJlZy5jYWxfdHlwZSA+PSBNQVhfQ0FMX1RZUEVTKSkgeworCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSAlZCBpcyBJbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBpbmZvLT5yZWcuY2FsX3R5cGUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGluZm8tPmNhbF91dGlsX2NhbGxiYWNrcy5tYXRjaF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbCB0eXBlICVkIG5vIG1ldGhvZCB0byBtYXRjaCBibG9ja3MhXG4iLAorCQkJX19mdW5jX18sIGluZm8tPnJlZy5jYWxfdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljYWxfdHlwZSA9IGttYWxsb2Moc2l6ZW9mKCpjYWxfdHlwZSksIEdGUF9LRVJORUwpOworCWlmIChjYWxfdHlwZSA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwlJTklUX0xJU1RfSEVBRCgmY2FsX3R5cGUtPmNhbF9ibG9ja3MpOworCW11dGV4X2luaXQoJmNhbF90eXBlLT5sb2NrKTsKKwltZW1jcHkoJmNhbF90eXBlLT5pbmZvLCBpbmZvLAorCQlzaXplb2YoY2FsX3R5cGUtPmluZm8pKTsKK2RvbmU6CisJcmV0dXJuIGNhbF90eXBlOworfQorCitpbnQgY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoaW50IG51bV9jYWxfdHlwZXMsCisJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlLAorCQkJc3RydWN0IGNhbF90eXBlX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKGluZm8gPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBpbmZvIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKChudW1fY2FsX3R5cGVzIDw9IDApIHx8CisJCShudW1fY2FsX3R5cGVzID4gTUFYX0NBTF9UWVBFUykpIHsKKwkJcHJfZXJyKCIlczogbnVtX2NhbF90eXBlcyBvZiAlZCBpcyBJbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBudW1fY2FsX3R5cGVzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FsX3R5cGVzOyBpKyspIHsKKwkJaWYgKChpbmZvW2ldLnJlZy5jYWxfdHlwZSA8IDApIHx8CisJCQkoaW5mb1tpXS5yZWcuY2FsX3R5cGUgPj0gTUFYX0NBTF9UWVBFUykpIHsKKwkJCXByX2VycigiJXM6IGNhbCB0eXBlICVkIGF0IGluZGV4ICVkIGlzIEludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmZvW2ldLnJlZy5jYWxfdHlwZSwgaSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJY2FsX3R5cGVbaV0gPSBjcmVhdGVfY2FsX3R5cGVfZGF0YSgmaW5mb1tpXSk7CisJCWlmIChjYWxfdHlwZVtpXSA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgY2FsX3R5cGUgb2YgaW5kZXggJWQhXG4iLAorCQkJCV9fZnVuY19fLCBpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlyZXQgPSBhdWRpb19jYWxfcmVnaXN0ZXIoMSwgJmluZm9baV0ucmVnKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IGF1ZGlvX2NhbF9yZWdpc3RlciBmYWlsZWQsIHJldCA9ICVkIVxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBjYWwgdHlwZSAlZCBhdCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgaW5mb1tpXS5yZWcuY2FsX3R5cGUsIGkpOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlX2NhbF9ibG9jayhzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJbGlzdF9kZWwoJmNhbF9ibG9jay0+bGlzdCk7CisJa2ZyZWUoY2FsX2Jsb2NrLT5jbGllbnRfaW5mbyk7CisJY2FsX2Jsb2NrLT5jbGllbnRfaW5mbyA9IE5VTEw7CisJa2ZyZWUoY2FsX2Jsb2NrLT5jYWxfaW5mbyk7CisJY2FsX2Jsb2NrLT5jYWxfaW5mbyA9IE5VTEw7CisJaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCAgIT0gTlVMTCkgeworCQltc21fYXVkaW9faW9uX2ZyZWUoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50LAorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlKTsKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50ID0gTlVMTDsKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlID0gTlVMTDsKKwl9CisJa2ZyZWUoY2FsX2Jsb2NrKTsKK2RvbmU6CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2FsbF9jYWxfYmxvY2tzKHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJJmNhbF90eXBlLT5jYWxfYmxvY2tzKSB7CisKKwkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOworCisJCXJldCA9IHVubWFwX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHVubWFwX21lbW9yeSBmYWlsZWQsIGNhbCB0eXBlICVkLCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sCisJCQkgICAgICAgY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlLAorCQkJCXJldCk7CisJCX0KKwkJZGVsZXRlX2NhbF9ibG9jayhjYWxfYmxvY2spOworCQljYWxfYmxvY2sgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9jYWxfdHlwZV9kYXRhKHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSkKK3sKKwlpZiAoY2FsX3R5cGUgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJZGVzdHJveV9hbGxfY2FsX2Jsb2NrcyhjYWxfdHlwZSk7CisJbGlzdF9kZWwoJmNhbF90eXBlLT5jYWxfYmxvY2tzKTsKKwlrZnJlZShjYWxfdHlwZSk7Citkb25lOgorCXJldHVybjsKK30KKwordm9pZCBjYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoaW50IG51bV9jYWxfdHlwZXMsCisJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlKQoreworCWludCBpOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgobnVtX2NhbF90eXBlcyA8PSAwKSB8fAorCQkobnVtX2NhbF90eXBlcyA+IE1BWF9DQUxfVFlQRVMpKSB7CisJCXByX2VycigiJXM6IG51bV9jYWxfdHlwZXMgb2YgJWQgaXMgSW52YWxpZCFcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2NhbF90eXBlcyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbF90eXBlczsgaSsrKSB7CisJCWF1ZGlvX2NhbF9kZXJlZ2lzdGVyKDEsICZjYWxfdHlwZVtpXS0+aW5mby5yZWcpOworCQlkZXN0cm95X2NhbF90eXBlX2RhdGEoY2FsX3R5cGVbaV0pOworCQljYWxfdHlwZVtpXSA9IE5VTEw7CisJfQorZG9uZToKKwlyZXR1cm47Cit9CisKK3N0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOworCisJaWYgKGNhbF90eXBlID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCSZjYWxfdHlwZS0+Y2FsX2Jsb2NrcykgeworCisJCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKKwkJYnJlYWs7CisJfQorZG9uZToKKwlyZXR1cm4gY2FsX2Jsb2NrOworfQorCitib29sIGNhbF91dGlsc19tYXRjaF9idWZfbnVtKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLAorCQkJCQl2b2lkICp1c2VyX2RhdGEpCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMJKmRhdGEgPSB1c2VyX2RhdGE7CisKKwlpZiAoY2FsX2Jsb2NrLT5idWZmZXJfbnVtYmVyID09IGRhdGEtPmNhbF9oZHIuYnVmZmVyX251bWJlcikKKwkJcmV0ID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmdldF9tYXRjaGluZ19jYWxfYmxvY2soCisJCQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKKwkJCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJJmNhbF90eXBlLT5jYWxfYmxvY2tzKSB7CisKKwkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOworCisJCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MuCisJCQltYXRjaF9ibG9jayhjYWxfYmxvY2ssIGRhdGEpKQorCQkJcmV0dXJuIGNhbF9ibG9jazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjYWxfYmxvY2tfaW9uX2FsbG9jKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludAlyZXQgPSAwOworCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX2F1ZGlvX2lvbl9pbXBvcnQoImF1ZGlvX2NhbF9jbGllbnQiLAorCQkmY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50LAorCQkmY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlLAorCQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9tYXBfaGFuZGxlLAorCQlOVUxMLCAwLAorCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsCisJCSZjYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBJT04gaW1wb3J0IGZhaWxlZCwgcmMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjcmVhdGVfY2FsX2Jsb2NrKHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKKwkJCQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMgKmJhc2ljX2NhbCwKKwkJCQlzaXplX3QgY2xpZW50X2luZm9fc2l6ZSwgdm9pZCAqY2xpZW50X2luZm8pCit7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhCSpjYWxfYmxvY2sgPSBOVUxMOworCisJaWYgKGNhbF90eXBlID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2FsX3R5cGUgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0gZWxzZSBpZiAoYmFzaWNfY2FsID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogYmFzaWNfY2FsIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljYWxfYmxvY2sgPSBremFsbG9jKHNpemVvZigqY2FsX2Jsb2NrKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwlJTklUX0xJU1RfSEVBRCgmY2FsX2Jsb2NrLT5saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZjYWxfYmxvY2stPmxpc3QsICZjYWxfdHlwZS0+Y2FsX2Jsb2Nrcyk7CisKKwljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9tYXBfaGFuZGxlID0gYmFzaWNfY2FsLT5jYWxfZGF0YS5tZW1faGFuZGxlOworCWlmIChiYXNpY19jYWwtPmNhbF9kYXRhLm1lbV9oYW5kbGUgPiAwKSB7CisJCWlmIChjYWxfYmxvY2tfaW9uX2FsbG9jKGNhbF9ibG9jaykpIHsKKwkJCXByX2VycigiJXM6IGNhbF9ibG9ja19pb25fYWxsb2MgZmFpbGVkIVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwlpZiAoY2xpZW50X2luZm9fc2l6ZSA+IDApIHsKKwkJY2FsX2Jsb2NrLT5jbGllbnRfaW5mb19zaXplID0gY2xpZW50X2luZm9fc2l6ZTsKKwkJY2FsX2Jsb2NrLT5jbGllbnRfaW5mbyA9IGttYWxsb2MoY2xpZW50X2luZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChjYWxfYmxvY2stPmNsaWVudF9pbmZvID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0cyBjbGllbnRfaW5mbyFcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGNsaWVudF9pbmZvICE9IE5VTEwpCisJCQltZW1jcHkoY2FsX2Jsb2NrLT5jbGllbnRfaW5mbywgY2xpZW50X2luZm8sCisJCQkJY2xpZW50X2luZm9fc2l6ZSk7CisJfQorCisJY2FsX2Jsb2NrLT5jYWxfaW5mbyA9IGt6YWxsb2MoCisJCWdldF9jYWxfaW5mb19zaXplKGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSksCisJCUdGUF9LRVJORUwpOworCWlmIChjYWxfYmxvY2stPmNhbF9pbmZvID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRzIGNhbF9pbmZvIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCWNhbF9ibG9jay0+YnVmZmVyX251bWJlciA9IGJhc2ljX2NhbC0+Y2FsX2hkci5idWZmZXJfbnVtYmVyOworCXByX2RlYnVnKCIlczogY3JlYXRlZCBibG9jayBmb3IgY2FsIHR5cGUgJWQsIGJ1ZiBudW0gJWQsIG1hcCBoYW5kbGUgJWQsIG1hcCBzaXplICV6ZCBwYWRkciAweCVwSyFcbiIsCisJCV9fZnVuY19fLCBjYWxfdHlwZS0+aW5mby5yZWcuY2FsX3R5cGUsCisJCWNhbF9ibG9jay0+YnVmZmVyX251bWJlciwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fbWFwX2hhbmRsZSwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwKKwkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworZG9uZToKKwlyZXR1cm4gY2FsX2Jsb2NrOworZXJyOgorCWtmcmVlKGNhbF9ibG9jayk7CisJY2FsX2Jsb2NrID0gTlVMTDsKKwlyZXR1cm4gY2FsX2Jsb2NrOworfQorCit2b2lkIGNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKGludCBudW1fY2FsX3R5cGVzLAorCQkJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgobnVtX2NhbF90eXBlcyA8PSAwKSB8fAorCQkobnVtX2NhbF90eXBlcyA+IE1BWF9DQUxfVFlQRVMpKSB7CisJCXByX2VycigiJXM6IG51bV9jYWxfdHlwZXMgb2YgJWQgaXMgSW52YWxpZCFcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2NhbF90eXBlcyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKDsgaSA8IG51bV9jYWxfdHlwZXM7IGkrKykgeworCQlpZiAoY2FsX3R5cGVbaV0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCW11dGV4X2xvY2soJmNhbF90eXBlW2ldLT5sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJCSZjYWxfdHlwZVtpXS0+Y2FsX2Jsb2NrcykgeworCisJCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOworCisJCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjYWxfdHlwZVtpXS0+bG9jayk7CisJfQorZG9uZToKKwlyZXR1cm47Cit9CisKKworCitzdGF0aWMgaW50IHJlYWxsb2NfbWVtb3J5KHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXQgPSAwOworCisJbXNtX2F1ZGlvX2lvbl9mcmVlKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlKTsKKwljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPSBOVUxMOworCWNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7CisJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID0gMDsKKworCXJldCA9IGNhbF9ibG9ja19pb25fYWxsb2MoY2FsX2Jsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogcmVhbGxvY19tZW1vcnkgZmFpbGVkIVxuIiwKKwkJCV9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1hcF9tZW1vcnkoc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCit7CisJaW50IHJldCA9IDA7CisKKworCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MubWFwX2NhbCAhPSBOVUxMKSB7CisJCWlmICgoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fbWFwX2hhbmRsZSA8IDApIHx8CisJCQkoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA8PSAwKSB8fAorCQkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlICE9IDApKSB7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IGNhbCB0eXBlICVkIGNhbGwgbWFwXG4iLAorCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSk7CisJCXJldCA9IGNhbF90eXBlLT5pbmZvLmNhbF91dGlsX2NhbGxiYWNrcy4KKwkJCW1hcF9jYWwoY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlLCBjYWxfYmxvY2spOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogbWFwX2NhbCBmYWlsZWQsIGNhbCB0eXBlICVkLCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwKKwkJCQlyZXQpOworCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVubWFwX21lbW9yeShzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MudW5tYXBfY2FsICE9IE5VTEwpIHsKKwkJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9tYXBfaGFuZGxlIDwgMCkgfHwKKwkJCShjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplIDw9IDApIHx8CisJCQkoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkpIHsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IGNhbCB0eXBlICVkIGNhbGwgdW5tYXBcbiIsCisJCQlfX2Z1bmNfXywgY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKTsKKwkJcmV0ID0gY2FsX3R5cGUtPmluZm8uY2FsX3V0aWxfY2FsbGJhY2tzLgorCQkJdW5tYXBfY2FsKGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHVubWFwX2NhbCBmYWlsZWQsIGNhbCB0eXBlICVkLCByZXQgPSAlZCFcbiIsCisJCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwKKwkJCQlyZXQpOworCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY2FsX3V0aWxzX2FsbG9jX2NhbChzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLAorCQkJc2l6ZV90IGNsaWVudF9pbmZvX3NpemUsIHZvaWQgKmNsaWVudF9pbmZvKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hbGxvYyAqYWxsb2NfZGF0YSA9IGRhdGE7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChkYXRhX3NpemUgPCBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FsbG9jKSkgeworCQlwcl9lcnIoIiVzOiBkYXRhX3NpemUgb2YgJXpkIGRvZXMgbm90IGVxdWFsIGFsbG9jIHN0cnVjdCBzaXplIG9mICV6ZCFcbiIsCisJCQlfX2Z1bmNfXywgZGF0YV9zaXplLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hbGxvYykpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICgoY2xpZW50X2luZm9fc2l6ZSA+IDApICYmIChjbGllbnRfaW5mbyA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBVc2VyIGluZm8gcG9pbnRlciBpcyBOVUxMIGJ1dCBzaXplIGlzICV6ZCFcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50X2luZm9fc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYWxsb2NfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSA8IDApIHsKKwkJcHJfZXJyKCIlczogbWVtX2hhbmRsZSAlZCBpbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBhbGxvY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNhbF90eXBlLT5sb2NrKTsKKworCWNhbF9ibG9jayA9IGdldF9tYXRjaGluZ19jYWxfYmxvY2soY2FsX3R5cGUsCisJCWRhdGEpOworCWlmIChjYWxfYmxvY2sgIT0gTlVMTCkgeworCQlyZXQgPSB1bm1hcF9tZW1vcnkoY2FsX3R5cGUsIGNhbF9ibG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJCXJldCA9IHJlYWxsb2NfbWVtb3J5KGNhbF9ibG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJfSBlbHNlIHsKKwkJY2FsX2Jsb2NrID0gY3JlYXRlX2NhbF9ibG9jayhjYWxfdHlwZSwKKwkJCShzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMgKilhbGxvY19kYXRhLAorCQkJY2xpZW50X2luZm9fc2l6ZSwgY2xpZW50X2luZm8pOworCQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IGNyZWF0ZV9jYWxfYmxvY2sgZmFpbGVkIGZvciAlZCFcbiIsCisJCQkJX19mdW5jX18sIGFsbG9jX2RhdGEtPmNhbF9kYXRhLm1lbV9oYW5kbGUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJcmV0ID0gbWFwX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZjYWxfdHlwZS0+bG9jayk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBjYWxfdXRpbHNfZGVhbGxvY19jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jazsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZGVhbGxvYyAqZGVhbGxvY19kYXRhID0gZGF0YTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisKKwlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChkYXRhX3NpemUgPCBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2RlYWxsb2MpKSB7CisJCXByX2VycigiJXM6IGRhdGFfc2l6ZSBvZiAlemQgZG9lcyBub3QgZXF1YWwgc3RydWN0IHNpemUgb2YgJXpkIVxuIiwKKwkJCV9fZnVuY19fLCBkYXRhX3NpemUsCisJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2RlYWxsb2MpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgoZGVhbGxvY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlID09IC0xKSAmJgorCQkoZGVhbGxvY19kYXRhLT5jYWxfaGRyLmJ1ZmZlcl9udW1iZXIgPT0gQUxMX0NBTF9CTE9DS1MpKSB7CisJCWRlc3Ryb3lfYWxsX2NhbF9ibG9ja3MoY2FsX3R5cGUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGRlYWxsb2NfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSA8IDApIHsKKwkJcHJfZXJyKCIlczogbWVtX2hhbmRsZSAlZCBpbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBkZWFsbG9jX2RhdGEtPmNhbF9kYXRhLm1lbV9oYW5kbGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmY2FsX3R5cGUtPmxvY2spOworCWNhbF9ibG9jayA9IGdldF9tYXRjaGluZ19jYWxfYmxvY2soCisJCWNhbF90eXBlLAorCQlkYXRhKTsKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogYWxsb2NhdGlvbiBkb2VzIG5vdCBleGlzdCBmb3IgJWQhXG4iLAorCQkJX19mdW5jX18sIGRlYWxsb2NfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHVubWFwX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlkZWxldGVfY2FsX2Jsb2NrKGNhbF9ibG9jayk7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZjYWxfdHlwZS0+bG9jayk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBjYWxfdXRpbHNfc2V0X2NhbChzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLAorCQkJc2l6ZV90IGNsaWVudF9pbmZvX3NpemUsIHZvaWQgKmNsaWVudF9pbmZvKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyAqYmFzaWNfZGF0YSA9IGRhdGE7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChjbGllbnRfaW5mb19zaXplID4gMCkgJiYgKGNsaWVudF9pbmZvID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IFVzZXIgaW5mbyBwb2ludGVyIGlzIE5VTEwgYnV0IHNpemUgaXMgJXpkIVxuIiwKKwkJCV9fZnVuY19fLCBjbGllbnRfaW5mb19zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgoZGF0YV9zaXplID4gZ2V0X3VzZXJfY2FsX3R5cGVfc2l6ZSgKKwkJY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKSkgfHwgKGRhdGFfc2l6ZSA8IDApKSB7CisJCXByX2VycigiJXM6IGNhbF90eXBlICVkLCBkYXRhX3NpemUgb2YgJXpkIGlzIGludmFsaWQsIGV4cGVjdGluZyAlemQhXG4iLAorCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwgZGF0YV9zaXplLAorCQkJZ2V0X3VzZXJfY2FsX3R5cGVfc2l6ZShjYWxfdHlwZS0+aW5mby5yZWcuY2FsX3R5cGUpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNhbF90eXBlLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBnZXRfbWF0Y2hpbmdfY2FsX2Jsb2NrKAorCQljYWxfdHlwZSwKKwkJZGF0YSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCWlmIChiYXNpY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlID4gMCkgeworCQkJcHJfZXJyKCIlczogYWxsb2NhdGlvbiBkb2VzIG5vdCBleGlzdCBmb3IgJWQhXG4iLAorCQkJCV9fZnVuY19fLCBiYXNpY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfSBlbHNlIHsKKwkJCWNhbF9ibG9jayA9IGNyZWF0ZV9jYWxfYmxvY2soCisJCQkJY2FsX3R5cGUsCisJCQkJYmFzaWNfZGF0YSwKKwkJCQljbGllbnRfaW5mb19zaXplLCBjbGllbnRfaW5mbyk7CisJCQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJCQlwcl9lcnIoIiVzOiBjcmVhdGVfY2FsX2Jsb2NrIGZhaWxlZCBmb3IgY2FsIHR5cGUgJWQhXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkgICAgICAgY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gbWFwX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwljYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPSBiYXNpY19kYXRhLT5jYWxfZGF0YS5jYWxfc2l6ZTsKKworCWlmIChjbGllbnRfaW5mb19zaXplID4gMCkgeworCQltZW1jcHkoY2FsX2Jsb2NrLT5jbGllbnRfaW5mbywKKwkJCWNsaWVudF9pbmZvLAorCQkJY2xpZW50X2luZm9fc2l6ZSk7CisJfQorCisJbWVtY3B5KGNhbF9ibG9jay0+Y2FsX2luZm8sCisJCSgodWludDhfdCAqKWRhdGEgKyBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKSksCisJCWRhdGFfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMpKTsKKworZXJyOgorCW11dGV4X3VubG9jaygmY2FsX3R5cGUtPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbGlicmF0aW9uLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fY2FsaWJyYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhhMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbGlicmF0aW9uLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+CisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsaWJyYXRpb24uaD4KKyNpbmNsdWRlIDxzb3VuZC9hdWRpb19jYWxfdXRpbHMuaD4KKworc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NhbGxiYWNrcwkqY2FsbGJhY2tzOworfTsKKworc3RydWN0IGF1ZGlvX2NhbF9pbmZvIHsKKwlzdHJ1Y3QgbXV0ZXgJCQljb21tb25fbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCQljYWxfbXV0ZXhbTUFYX0NBTF9UWVBFU107CisJc3RydWN0IGxpc3RfaGVhZAkJY2xpZW50X2luZm9bTUFYX0NBTF9UWVBFU107CisJaW50CQkJCXJlZl9jb3VudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fY2FsX2luZm8JYXVkaW9fY2FsOworCisKK3N0YXRpYyBib29sIGNhbGxiYWNrc19hcmVfZXF1YWwoc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MgKmNhbGxiYWNrMSwKKwkJCQlzdHJ1Y3QgYXVkaW9fY2FsX2NhbGxiYWNrcyAqY2FsbGJhY2syKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NhbGxiYWNrcyAqY2FsbDEgPSBjYWxsYmFjazE7CisJc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MgKmNhbGwyID0gY2FsbGJhY2syOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoKGNhbGwxID09IE5VTEwpICYmIChjYWxsMiA9PSBOVUxMKSkKKwkJcmV0ID0gdHJ1ZTsKKwllbHNlIGlmICgoY2FsbDEgPT0gTlVMTCkgfHwgKGNhbGwyID09IE5VTEwpKQorCQlyZXQgPSBmYWxzZTsKKwllbHNlIGlmICgoY2FsbDEtPmFsbG9jICE9IGNhbGwyLT5hbGxvYykgfHwKKwkJKGNhbGwxLT5kZWFsbG9jICE9IGNhbGwyLT5kZWFsbG9jKSB8fAorCQkoY2FsbDEtPnByZV9jYWwgIT0gY2FsbDItPnByZV9jYWwpIHx8CisJCShjYWxsMS0+c2V0X2NhbCAhPSBjYWxsMi0+c2V0X2NhbCkgfHwKKwkJKGNhbGwxLT5nZXRfY2FsICE9IGNhbGwyLT5nZXRfY2FsKSB8fAorCQkoY2FsbDEtPnBvc3RfY2FsICE9IGNhbGwyLT5wb3N0X2NhbCkpCisJCXJldCA9IGZhbHNlOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdWRpb19jYWxfZGVyZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywKKwkJCSBzdHJ1Y3QgYXVkaW9fY2FsX3JlZyAqcmVnX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChyZWdfZGF0YSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHJlZ19kYXRhIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKChudW1fY2FsX3R5cGVzIDw9IDApIHx8CisJCShudW1fY2FsX3R5cGVzID4gTUFYX0NBTF9UWVBFUykpIHsKKwkJcHJfZXJyKCIlczogbnVtX2NhbF90eXBlcyBvZiAlZCBpcyBJbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBudW1fY2FsX3R5cGVzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWZvciAoOyBpIDwgbnVtX2NhbF90eXBlczsgaSsrKSB7CisJCWlmICgocmVnX2RhdGFbaV0uY2FsX3R5cGUgPCAwKSB8fAorCQkJKHJlZ19kYXRhW2ldLmNhbF90eXBlID49IE1BWF9DQUxfVFlQRVMpKSB7CisJCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSAlZCBhdCBpbmRleCAlZCBpcyBJbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgcmVnX2RhdGFbaV0uY2FsX3R5cGUsIGkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbXV0ZXhfbG9jaygmYXVkaW9fY2FsLmNhbF9tdXRleFtyZWdfZGF0YVtpXS5jYWxfdHlwZV0pOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tyZWdfZGF0YVtpXS5jYWxfdHlwZV0pIHsKKworCQkJY2xpZW50X2luZm9fbm9kZSA9IGxpc3RfZW50cnkocHRyLAorCQkJCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8sIGxpc3QpOworCQkJaWYgKGNhbGxiYWNrc19hcmVfZXF1YWwoY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLAorCQkJCSZyZWdfZGF0YVtpXS5jYWxsYmFja3MpKSB7CisJCQkJbGlzdF9kZWwoJmNsaWVudF9pbmZvX25vZGUtPmxpc3QpOworCQkJCWtmcmVlKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcyk7CisJCQkJY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzID0gTlVMTDsKKwkJCQlrZnJlZShjbGllbnRfaW5mb19ub2RlKTsKKwkJCQljbGllbnRfaW5mb19ub2RlID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbcmVnX2RhdGFbaV0uY2FsX3R5cGVdKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKKworaW50IGF1ZGlvX2NhbF9yZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywKKwkJCSBzdHJ1Y3QgYXVkaW9fY2FsX3JlZyAqcmVnX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvX25vZGUgPSBOVUxMOworCXN0cnVjdCBhdWRpb19jYWxfY2FsbGJhY2tzICpjYWxsYmFja19ub2RlID0gTlVMTDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHJlZ19kYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2FsbGJhY2tzIGFyZSBOVUxMIVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgobnVtX2NhbF90eXBlcyA8PSAwKSB8fAorCQkobnVtX2NhbF90eXBlcyA+IE1BWF9DQUxfVFlQRVMpKSB7CisJCXByX2VycigiJXM6IG51bV9jYWxfdHlwZXMgb2YgJWQgaXMgSW52YWxpZCFcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2NhbF90eXBlcyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKDsgaSA8IG51bV9jYWxfdHlwZXM7IGkrKykgeworCQlpZiAoKHJlZ19kYXRhW2ldLmNhbF90eXBlIDwgMCkgfHwKKwkJCShyZWdfZGF0YVtpXS5jYWxfdHlwZSA+PSBNQVhfQ0FMX1RZUEVTKSkgeworCQkJcHJfZXJyKCIlczogY2FsIHR5cGUgJWQgYXQgaW5kZXggJWQgaXMgSW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIHJlZ19kYXRhW2ldLmNhbF90eXBlLCBpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWNsaWVudF9pbmZvX25vZGUgPSBrbWFsbG9jKHNpemVvZigqY2xpZW50X2luZm9fbm9kZSksCisJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKGNsaWVudF9pbmZvX25vZGUgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCUlOSVRfTElTVF9IRUFEKCZjbGllbnRfaW5mb19ub2RlLT5saXN0KTsKKworCQljYWxsYmFja19ub2RlID0ga21hbGxvYyhzaXplb2YoKmNhbGxiYWNrX25vZGUpLAorCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChjYWxsYmFja19ub2RlID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQorCisJCW1lbWNweShjYWxsYmFja19ub2RlLCAmcmVnX2RhdGFbaV0uY2FsbGJhY2tzLAorCQkJc2l6ZW9mKCpjYWxsYmFja19ub2RlKSk7CisJCWNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcyA9IGNhbGxiYWNrX25vZGU7CisKKwkJbXV0ZXhfbG9jaygmYXVkaW9fY2FsLmNhbF9tdXRleFtyZWdfZGF0YVtpXS5jYWxfdHlwZV0pOworCQlsaXN0X2FkZF90YWlsKCZjbGllbnRfaW5mb19ub2RlLT5saXN0LAorCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tyZWdfZGF0YVtpXS5jYWxfdHlwZV0pOworCQltdXRleF91bmxvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbcmVnX2RhdGFbaV0uY2FsX3R5cGVdKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7CitlcnI6CisJYXVkaW9fY2FsX2RlcmVnaXN0ZXIobnVtX2NhbF90eXBlcywgcmVnX2RhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsbF9hbGxvY3MoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgY2FsX3R5cGVfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0MiA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlID0gTlVMTDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bY2FsX3R5cGVdKSB7CisKKwkJY2xpZW50X2luZm9fbm9kZSA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbywgbGlzdCk7CisKKwkJaWYgKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+YWxsb2MgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXJldDIgPSBjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPgorCQkJYWxsb2MoY2FsX3R5cGUsIGNhbF90eXBlX3NpemUsIGRhdGEpOworCQlpZiAocmV0MiA8IDApIHsKKwkJCXByX2VycigiJXM6IGFsbG9jIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IHJldDI7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxsX2RlYWxsb2NzKGludDMyX3QgY2FsX3R5cGUsCisJCQkJc2l6ZV90IGNhbF90eXBlX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJldDIgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXMgY2FsIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tjYWxfdHlwZV0pIHsKKworCQljbGllbnRfaW5mb19ub2RlID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKKworCQlpZiAoY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT5kZWFsbG9jID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZXQyID0gY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT4KKwkJCWRlYWxsb2MoY2FsX3R5cGUsIGNhbF90eXBlX3NpemUsIGRhdGEpOworCQlpZiAocmV0MiA8IDApIHsKKwkJCXByX2VycigiJXM6IGRlYWxsb2MgZmFpbGVkIVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gcmV0MjsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbGxfcHJlX2NhbHMoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgY2FsX3R5cGVfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0MiA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlID0gTlVMTDsKKworCXByX2RlYnVnKCIlcyBjYWwgdHlwZSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCQkmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2NhbF90eXBlXSkgeworCisJCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8sIGxpc3QpOworCisJCWlmIChjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPnByZV9jYWwgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXJldDIgPSBjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPgorCQkJcHJlX2NhbChjYWxfdHlwZSwgY2FsX3R5cGVfc2l6ZSwgZGF0YSk7CisJCWlmIChyZXQyIDwgMCkgeworCQkJcHJfZXJyKCIlczogcHJlX2NhbCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSByZXQyOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsbF9wb3N0X2NhbHMoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgY2FsX3R5cGVfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0MiA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlID0gTlVMTDsKKworCXByX2RlYnVnKCIlcyBjYWwgdHlwZSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCQkmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2NhbF90eXBlXSkgeworCisJCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8sIGxpc3QpOworCisJCWlmIChjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPnBvc3RfY2FsID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZXQyID0gY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT4KKwkJCXBvc3RfY2FsKGNhbF90eXBlLCBjYWxfdHlwZV9zaXplLCBkYXRhKTsKKwkJaWYgKHJldDIgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBwb3N0X2NhbCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSByZXQyOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsbF9zZXRfY2FscyhpbnQzMl90IGNhbF90eXBlLAorCQkJCXNpemVfdCBjYWxfdHlwZV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCByZXQyID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvX25vZGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzIGNhbCB0eXBlICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bY2FsX3R5cGVdKSB7CisKKwkJY2xpZW50X2luZm9fbm9kZSA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbywgbGlzdCk7CisKKwkJaWYgKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+c2V0X2NhbCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcmV0MiA9IGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+CisJCQlzZXRfY2FsKGNhbF90eXBlLCBjYWxfdHlwZV9zaXplLCBkYXRhKTsKKwkJaWYgKHJldDIgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBzZXRfY2FsIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IHJldDI7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxsX2dldF9jYWxzKGludDMyX3QgY2FsX3R5cGUsCisJCQkJc2l6ZV90IGNhbF90eXBlX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJldDIgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXMgY2FsIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tjYWxfdHlwZV0pIHsKKworCQljbGllbnRfaW5mb19ub2RlID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKKworCQlpZiAoY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT5nZXRfY2FsID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlyZXQyID0gY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT4KKwkJCWdldF9jYWwoY2FsX3R5cGUsIGNhbF90eXBlX3NpemUsIGRhdGEpOworCQlpZiAocmV0MiA8IDApIHsKKwkJCXByX2VycigiJXM6IGdldF9jYWwgZmFpbGVkIVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gcmV0MjsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1ZGlvX2NhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZhdWRpb19jYWwuY29tbW9uX2xvY2spOworCWF1ZGlvX2NhbC5yZWZfY291bnQrKzsKKwltdXRleF91bmxvY2soJmF1ZGlvX2NhbC5jb21tb25fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX2FsbF9jbGllbnRzKHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9kZWFsbG9jIGRlYWxsb2NfZGF0YTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJZGVhbGxvY19kYXRhLmNhbF9oZHIudmVyc2lvbiA9IFZFUlNJT05fMF8wOworCWRlYWxsb2NfZGF0YS5jYWxfaGRyLmJ1ZmZlcl9udW1iZXIgPSBBTExfQ0FMX0JMT0NLUzsKKwlkZWFsbG9jX2RhdGEuY2FsX2RhdGEubWVtX2hhbmRsZSA9IC0xOworCisJZm9yICg7IGkgPCBNQVhfQ0FMX1RZUEVTOyBpKyspCisJCWNhbGxfZGVhbGxvY3MoaSwgc2l6ZW9mKGRlYWxsb2NfZGF0YSksICZkZWFsbG9jX2RhdGEpOworfQorCitzdGF0aWMgaW50IGF1ZGlvX2NhbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZhdWRpb19jYWwuY29tbW9uX2xvY2spOworCWF1ZGlvX2NhbC5yZWZfY291bnQtLTsKKwlpZiAoYXVkaW9fY2FsLnJlZl9jb3VudCA8PSAwKSB7CisJCWF1ZGlvX2NhbC5yZWZfY291bnQgPSAwOworCQlkZWFsbG9jX2FsbF9jbGllbnRzKCk7CisJfQorCW11dGV4X3VubG9jaygmYXVkaW9fY2FsLmNvbW1vbl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGF1ZGlvX2NhbF9zaGFyZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQzMl90IHNpemU7CisJc3RydWN0IGF1ZGlvX2NhbF9iYXNpYyAqZGF0YSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19BTExPQ0FURV9DQUxJQlJBVElPTjoKKwljYXNlIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT046CisJY2FzZSBBVURJT19QUkVQQVJFX0NBTElCUkFUSU9OOgorCWNhc2UgQVVESU9fU0VUX0NBTElCUkFUSU9OOgorCWNhc2UgQVVESU9fR0VUX0NBTElCUkFUSU9OOgorCWNhc2UgQVVESU9fUE9TVF9DQUxJQlJBVElPTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogaW9jdGwgbm90IGZvdW5kIVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzaXplLCAodm9pZCAqKWFyZywgc2l6ZW9mKHNpemUpKSkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBzaXplIHZhbHVlIGZyb20gdXNlclxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgoc2l6ZSA8IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2Jhc2ljKSkKKwkJfHwgKHNpemUgPiBNQVhfSU9DVExfQ01EX1NJWkUpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc2l6ZSBzZW50IHRvIGRyaXZlcjogJWQsIG1heCBzaXplIGlzICVkLCBtaW4gc2l6ZSBpcyAlemRcbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSwgTUFYX0lPQ1RMX0NNRF9TSVpFLAorCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfYmFzaWMpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0gZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgKHZvaWQgKilhcmcsIHNpemUpKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IGRhdGEgZnJvbSB1c2VyXG4iLAorCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgoZGF0YS0+aGRyLmNhbF90eXBlIDwgMCkgfHwKKwkJKGRhdGEtPmhkci5jYWxfdHlwZSA+PSBNQVhfQ0FMX1RZUEVTKSkgeworCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSAlZCBpcyBJbnZhbGlkIVxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5oZHIuY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmICgoZGF0YS0+aGRyLmNhbF90eXBlX3NpemUgPAorCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKSkgfHwKKwkJKGRhdGEtPmhkci5jYWxfdHlwZV9zaXplID4KKwkJZ2V0X3VzZXJfY2FsX3R5cGVfc2l6ZShkYXRhLT5oZHIuY2FsX3R5cGUpKSkgeworCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSBzaXplICVkIGlzIEludmFsaWQhIE1heCBpcyAlemQhXG4iLAorCQkJX19mdW5jX18sIGRhdGEtPmhkci5jYWxfdHlwZV9zaXplLAorCQkJZ2V0X3VzZXJfY2FsX3R5cGVfc2l6ZShkYXRhLT5oZHIuY2FsX3R5cGUpKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0gZWxzZSBpZiAoZGF0YS0+Y2FsX3R5cGUuY2FsX2hkci5idWZmZXJfbnVtYmVyIDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSAlZCBJbnZhbGlkIGJ1ZmZlciBudW1iZXIgJWQhXG4iLAorCQkJX19mdW5jX18sIGRhdGEtPmhkci5jYWxfdHlwZSwKKwkJCWRhdGEtPmNhbF90eXBlLmNhbF9oZHIuYnVmZmVyX251bWJlcik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCW11dGV4X2xvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbZGF0YS0+aGRyLmNhbF90eXBlXSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT046CisJCXJldCA9IGNhbGxfYWxsb2NzKGRhdGEtPmhkci5jYWxfdHlwZSwKKwkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOworCQlicmVhazsKKwljYXNlIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT046CisJCXJldCA9IGNhbGxfZGVhbGxvY3MoZGF0YS0+aGRyLmNhbF90eXBlLAorCQkJZGF0YS0+aGRyLmNhbF90eXBlX3NpemUsICZkYXRhLT5jYWxfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fUFJFUEFSRV9DQUxJQlJBVElPTjoKKwkJcmV0ID0gY2FsbF9wcmVfY2FscyhkYXRhLT5oZHIuY2FsX3R5cGUsCisJCQlkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSwgJmRhdGEtPmNhbF90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19TRVRfQ0FMSUJSQVRJT046CisJCXJldCA9IGNhbGxfc2V0X2NhbHMoZGF0YS0+aGRyLmNhbF90eXBlLAorCQkJZGF0YS0+aGRyLmNhbF90eXBlX3NpemUsICZkYXRhLT5jYWxfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fR0VUX0NBTElCUkFUSU9OOgorCQlyZXQgPSBjYWxsX2dldF9jYWxzKGRhdGEtPmhkci5jYWxfdHlwZSwKKwkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOworCQlicmVhazsKKwljYXNlIEFVRElPX1BPU1RfQ0FMSUJSQVRJT046CisJCXJldCA9IGNhbGxfcG9zdF9jYWxzKGRhdGEtPmhkci5jYWxfdHlwZSwKKwkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlpZiAoY21kID09IEFVRElPX0dFVF9DQUxJQlJBVElPTikgeworCQlpZiAoZGF0YS0+aGRyLmNhbF90eXBlX3NpemUgPT0gMCkKKwkJCWdvdG8gdW5sb2NrOworCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJZ290byB1bmxvY2s7CisJCWlmICgoc2l6ZW9mKGRhdGEtPmhkcikgKyBkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSkgPiBzaXplKSB7CisJCQlwcl9lcnIoIiVzOiBoZWFkZXIgc2l6ZSAlemQgcGx1cyBjYWwgdHlwZSBzaXplICVkIGFyZSBncmVhdGVyIHRoYW4gZGF0YSBidWZmZXIgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZW9mKGRhdGEtPmhkciksCisJCQkJZGF0YS0+aGRyLmNhbF90eXBlX3NpemUsIHNpemUpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gdW5sb2NrOworCQl9IGVsc2UgaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgZGF0YSwKKwkJCXNpemVvZihkYXRhLT5oZHIpICsgZGF0YS0+aGRyLmNhbF90eXBlX3NpemUpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBjYWwgdHlwZSB0byB1c2VyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmYXVkaW9fY2FsLmNhbF9tdXRleFtkYXRhLT5oZHIuY2FsX3R5cGVdKTsKK2RvbmU6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgYXVkaW9fY2FsX2lvY3RsKHN0cnVjdCBmaWxlICpmLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gYXVkaW9fY2FsX3NoYXJlZF9pb2N0bChmLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKyNkZWZpbmUgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT04zMglfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDAsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT04zMglfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDEsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT04zMglfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDIsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX1NFVF9DQUxJQlJBVElPTjMyCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDMsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX0dFVF9DQUxJQlJBVElPTjMyCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDQsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX1BPU1RfQ0FMSUJSQVRJT04zMglfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKKwkJCQkJCQkyMDUsIGNvbXBhdF91cHRyX3QpCisKK3N0YXRpYyBsb25nIGF1ZGlvX2NhbF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBjbWQ2NDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19BTExPQ0FURV9DQUxJQlJBVElPTjMyOgorCQljbWQ2NCA9IEFVRElPX0FMTE9DQVRFX0NBTElCUkFUSU9OOworCQlicmVhazsKKwljYXNlIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT04zMjoKKwkJY21kNjQgPSBBVURJT19ERUFMTE9DQVRFX0NBTElCUkFUSU9OOworCQlicmVhazsKKwljYXNlIEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT04zMjoKKwkJY21kNjQgPSBBVURJT19QUkVQQVJFX0NBTElCUkFUSU9OOworCQlicmVhazsKKwljYXNlIEFVRElPX1NFVF9DQUxJQlJBVElPTjMyOgorCQljbWQ2NCA9IEFVRElPX1NFVF9DQUxJQlJBVElPTjsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19HRVRfQ0FMSUJSQVRJT04zMjoKKwkJY21kNjQgPSBBVURJT19HRVRfQ0FMSUJSQVRJT047CisJCWJyZWFrOworCWNhc2UgQVVESU9fUE9TVF9DQUxJQlJBVElPTjMyOgorCQljbWQ2NCA9IEFVRElPX1BPU1RfQ0FMSUJSQVRJT047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGlvY3RsIG5vdCBmb3VuZCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGF1ZGlvX2NhbF9zaGFyZWRfaW9jdGwoZiwgY21kNjQsIGNvbXBhdF9wdHIoYXJnKSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fY2FsX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhdWRpb19jYWxfb3BlbiwKKwkucmVsZWFzZSA9IGF1ZGlvX2NhbF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2NhbF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9ICAgYXVkaW9fY2FsX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fY2FsX21pc2MgPSB7CisJLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lCT0gIm1zbV9hdWRpb19jYWwiLAorCS5mb3BzCT0gJmF1ZGlvX2NhbF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXVkaW9fY2FsX2luaXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCW1lbXNldCgmYXVkaW9fY2FsLCAwLCBzaXplb2YoYXVkaW9fY2FsKSk7CisJbXV0ZXhfaW5pdCgmYXVkaW9fY2FsLmNvbW1vbl9sb2NrKTsKKwlmb3IgKDsgaSA8IE1BWF9DQUxfVFlQRVM7IGkrKykgeworCQlJTklUX0xJU1RfSEVBRCgmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2ldKTsKKwkJbXV0ZXhfaW5pdCgmYXVkaW9fY2FsLmNhbF9tdXRleFtpXSk7CisJfQorCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2NhbF9taXNjKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1ZGlvX2NhbF9leGl0KHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZTsKKworCWZvciAoOyBpIDwgTUFYX0NBTF9UWVBFUzsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCQkmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2ldKSB7CisJCQljbGllbnRfaW5mb19ub2RlID0gbGlzdF9lbnRyeShwdHIsCisJCQkJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbywgbGlzdCk7CisJCQlsaXN0X2RlbCgmY2xpZW50X2luZm9fbm9kZS0+bGlzdCk7CisJCQlrZnJlZShjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MpOworCQkJY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzID0gTlVMTDsKKwkJCWtmcmVlKGNsaWVudF9pbmZvX25vZGUpOworCQkJY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N1YnN5c19pbml0Y2FsbChhdWRpb19jYWxfaW5pdCk7Cittb2R1bGVfZXhpdChhdWRpb19jYWxfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU29DIFFEU1A2djIgQXVkaW8gQ2FsaWJyYXRpb24gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fc2xpbXNsYXZlLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fc2xpbXNsYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllY2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19zbGltc2xhdmUuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX3NsaW1zbGF2ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsaW1idXMvc2xpbWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworc3RhdGljIHN0cnVjdCBzbGltX2RldmljZSAqc2xpbTsKK3N0YXRpYyBpbnQgdm90ZV9jb3VudDsKK3N0cnVjdCBtdXRleCBzdXNwZW5kX2xvY2s7Citib29sIHN1c3BlbmQ7CisKK3N0YXRpYyBpbnQgYXVkaW9fc2xpbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWlmICh2b3RlX2NvdW50KSB7CisJCXByX2RlYnVnKCIlczogdW52b3RlOiB2b3RlX2NvdW50PSVkXG4iLCBfX2Z1bmNfXywgdm90ZV9jb3VudCk7CisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc2xpbS0+ZGV2LnBhcmVudCk7CisJCXBtX3J1bnRpbWVfcHV0KHNsaW0tPmRldi5wYXJlbnQpOworCQl2b3RlX2NvdW50LS07CisJfQorCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBhdWRpb19zbGltX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKHZvdGVfY291bnQpIHsKKwkJcHJfZGVidWcoIiVzOiB1bnZvdGU6IHZvdGVfY291bnQ9JWRcbiIsIF9fZnVuY19fLCB2b3RlX2NvdW50KTsKKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzbGltLT5kZXYucGFyZW50KTsKKwkJcG1fcnVudGltZV9wdXQoc2xpbS0+ZGV2LnBhcmVudCk7CisJCXZvdGVfY291bnQtLTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IHZvdGU6IHZvdGVfY291bnQ9JWRcbiIsIF9fZnVuY19fLCB2b3RlX2NvdW50KTsKKwkJcG1fcnVudGltZV9nZXRfc3luYyhzbGltLT5kZXYucGFyZW50KTsKKwkJdm90ZV9jb3VudCsrOworCX0KKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBsb25nIGF1ZGlvX3NsaW1faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdV9hcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFVRElPX1NMSU1TTEFWRV9WT1RFOgorCQltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOworCQlpZiAoIXZvdGVfY291bnQgJiYgIXN1c3BlbmQpIHsKKwkJCXByX2RlYnVnKCIlczpBVURJT19TTElNU0xBVkVfVk9URVxuIiwgX19mdW5jX18pOworCQkJcG1fcnVudGltZV9nZXRfc3luYyhzbGltLT5kZXYucGFyZW50KTsKKwkJCXZvdGVfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6SW52YWxpZCB2b3RlOiB2b3RlX2NvdW50PSVkIHN1c3BlbmQ9JWRcbiIsCisJCQkJIF9fZnVuY19fLCB2b3RlX2NvdW50LCBzdXNwZW5kKTsKKwkJfQorCQltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fU0xJTVNMQVZFX1VOVk9URToKKwkJbXV0ZXhfbG9jaygmc3VzcGVuZF9sb2NrKTsKKwkJaWYgKHZvdGVfY291bnQgJiYgIXN1c3BlbmQpIHsKKwkJCXByX2RlYnVnKCIlczpBVURJT19TTElNU0xBVkVfVU5WT1RFXG4iLCBfX2Z1bmNfXyk7CisJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHNsaW0tPmRldi5wYXJlbnQpOworCQkJcG1fcnVudGltZV9wdXQoc2xpbS0+ZGV2LnBhcmVudCk7CisJCQl2b3RlX2NvdW50LS07CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOkludmFsaWQgdW52b3RlOiB2b3RlX2NvdW50PSVkIHN1c3BlbmQ9JWRcbiIsCisJCQkJIF9fZnVuY19fLCB2b3RlX2NvdW50LCBzdXNwZW5kKTsKKwkJfQorCQltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogSW52YWxpZCBpb2N0bCBjbWQ6ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19zbGltc2xhdmVfZm9wcyA9IHsKKwkub3BlbiA9ICAgICAgICAgICAgICAgICBhdWRpb19zbGltX29wZW4sCisJLnVubG9ja2VkX2lvY3RsID0gICAgICAgYXVkaW9fc2xpbV9pb2N0bCwKKwkucmVsZWFzZSA9ICAgICAgICAgICAgICBhdWRpb19zbGltX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19zbGltc2xhdmVfbWlzYyA9IHsKKwkubWlub3IgID0gICAgICAgTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lICAgPSAgICAgICBBVURJT19TTElNU0xBVkVfSU9DVExfTkFNRSwKKwkuZm9wcyAgID0gICAgICAgJmF1ZGlvX3NsaW1zbGF2ZV9mb3BzLAorfTsKKworc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcHJvYmUoc3RydWN0IHNsaW1fZGV2aWNlICphdWRpb19zbGltKQoreworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2luaXQoJnN1c3BlbmRfbG9jayk7CisJc3VzcGVuZCA9IGZhbHNlOworCXNsaW0gPSBhdWRpb19zbGltOworCW1pc2NfcmVnaXN0ZXIoJmF1ZGlvX3NsaW1zbGF2ZV9taXNjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcmVtb3ZlKHN0cnVjdCBzbGltX2RldmljZSAqYXVkaW9fc2xpbSkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX3NsaW1zbGF2ZV9taXNjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcmVzdW1lKHN0cnVjdCBzbGltX2RldmljZSAqYXVkaW9fc2xpbSkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOworCXN1c3BlbmQgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fc2xpbXNsYXZlX3N1c3BlbmQoc3RydWN0IHNsaW1fZGV2aWNlICphdWRpb19zbGltLAorCQkJCSAgIHBtX21lc3NhZ2VfdCBwbWVzZykKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOworCXN1c3BlbmQgPSB0cnVlOworCW11dGV4X3VubG9jaygmc3VzcGVuZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbGltX2RldmljZV9pZCBhdWRpb19zbGltc2xhdmVfZHRfbWF0Y2hbXSA9IHsKKwl7ImF1ZGlvLXNsaW1zbGF2ZSIsIDB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNsaW1fZHJpdmVyIGF1ZGlvX3NsaW1zbGF2ZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXVkaW8tc2xpbXNsYXZlIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhdWRpb19zbGltc2xhdmVfcHJvYmUsCisJLnJlbW92ZSA9IGF1ZGlvX3NsaW1zbGF2ZV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYXVkaW9fc2xpbXNsYXZlX2R0X21hdGNoLAorCS5yZXN1bWUgPSBhdWRpb19zbGltc2xhdmVfcmVzdW1lLAorCS5zdXNwZW5kID0gYXVkaW9fc2xpbXNsYXZlX3N1c3BlbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdWRpb19zbGltc2xhdmVfaW5pdCh2b2lkKQoreworCXJldHVybiBzbGltX2RyaXZlcl9yZWdpc3RlcigmYXVkaW9fc2xpbXNsYXZlX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdWRpb19zbGltc2xhdmVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19zbGltc2xhdmVfZXhpdCh2b2lkKQoreworCit9Cittb2R1bGVfZXhpdChhdWRpb19zbGltc2xhdmVfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdWRpbyBzaWRlIFNsaW1idXMgc2xhdmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNWY5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuYwpAQCAtMCwwICsxLDEzOTkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL21zbS1kdHMtZWFnbGUuaD4KKyNpbmNsdWRlIDxzb3VuZC9kZXZkZXBfcGFyYW1zLmg+CisKKyNkZWZpbmUgTUFYX0VOQUJMRV9DTURfU0laRSAzMgorCisjZGVmaW5lIEdFVF9ORVhUKHB0ciwgdXBwZXJfbGltaXQsIHJjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCgocHRyKSArIDEpID4gKHVwcGVyX2xpbWl0KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcHJfZXJyKCIlczogcGFyYW0gbGlzdCBvdXQgb2YgYm91bmRhcnlcbiIsIF9fZnVuY19fKTsgICBcCisJCShyYykgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChyYykgPT0gMCkgPyAqKHB0cikrKyA6ICAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgQ0hFQ0tfUEFSQU1fTEVOKGxlbiwgbWF4X2xlbiwgdGFnLCByYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKGxlbikgPiAobWF4X2xlbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlwcl9lcnIoIiVzOiBwYXJhbXMgbGVuZ3RoIG92ZXJmbG93c1xuIiwgKHRhZykpOyAgICAgICAgIFwKKwkJKHJjKSA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKworYm9vbCBtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoaW50IGVmZmVjdF9tb2R1bGUsCisJCQkJCQlpbnQgdG9wb2xvZ3kpCit7CisJc3dpdGNoIChlZmZlY3RfbW9kdWxlKSB7CisJY2FzZSBWSVJUVUFMSVpFUl9NT0RVTEU6CisJY2FzZSBSRVZFUkJfTU9EVUxFOgorCWNhc2UgQkFTU19CT09TVF9NT0RVTEU6CisJY2FzZSBQQkVfTU9EVUxFOgorCWNhc2UgRVFfTU9EVUxFOgorCQlzd2l0Y2ggKHRvcG9sb2d5KSB7CisJCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX1NBX1BMVVM6CisJCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9QTFVTOgorCQljYXNlIEFTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9IUFhfTUFTVEVSOgorCQkJcmV0dXJuIHRydWU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwljYXNlIERUU19FQUdMRV9NT0RVTEU6CisJCXN3aXRjaCAodG9wb2xvZ3kpIHsKKwkJY2FzZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfRFRTX0hQWDoKKwkJY2FzZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX1BMVVM6CisJCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVI6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCWNhc2UgU09GVF9WT0xVTUUyX01PRFVMRToKKwljYXNlIERUU19FQUdMRV9NT0RVTEVfRU5BQkxFOgorCQlzd2l0Y2ggKHRvcG9sb2d5KSB7CisJCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9QTFVTOgorCQljYXNlIEFTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9IUFhfTUFTVEVSOgorCQkJcmV0dXJuIHRydWU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitpbnQgbXNtX2F1ZGlvX2VmZmVjdHNfZW5hYmxlX2V4dG4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJc3RydWN0IG1zbV9udF9lZmZfYWxsX2NvbmZpZyAqZWZmZWN0cywKKwkJCQlib29sIGZsYWcpCit7CisJdWludDMyX3QgdXBkdF9wYXJhbXNbTUFYX0VOQUJMRV9DTURfU0laRV0gPSB7MH07CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aDsKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtc19sZW5ndGggPSAwOworCXVwZHRfcGFyYW1zWzBdID0gQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVI7CisJdXBkdF9wYXJhbXNbMV0gPSBBVURQUk9DX1BBUkFNX0lEX0VOQUJMRTsKKwl1cGR0X3BhcmFtc1syXSA9IFZJUlRVQUxJWkVSX0VOQUJMRV9QQVJBTV9TWjsKKwl1cGR0X3BhcmFtc1szXSA9IGZsYWc7CisJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKyBWSVJUVUFMSVpFUl9FTkFCTEVfUEFSQU1fU1o7CisJaWYgKGVmZmVjdHMtPnZpcnR1YWxpemVyLmVuYWJsZV9mbGFnKQorCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCAoY2hhciAqKSZ1cGR0X3BhcmFtc1swXSwKKwkJCQkJcGFyYW1zX2xlbmd0aCk7CisJbWVtc2V0KHVwZHRfcGFyYW1zLCAwLCBNQVhfRU5BQkxFX0NNRF9TSVpFKTsKKwlwYXJhbXNfbGVuZ3RoID0gMDsKKwl1cGR0X3BhcmFtc1swXSA9IEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1Q7CisJdXBkdF9wYXJhbXNbMV0gPSBBVURQUk9DX1BBUkFNX0lEX0VOQUJMRTsKKwl1cGR0X3BhcmFtc1syXSA9IEJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaOworCXVwZHRfcGFyYW1zWzNdID0gZmxhZzsKKwlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArIEJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaOworCWlmIChlZmZlY3RzLT5iYXNzX2Jvb3N0LmVuYWJsZV9mbGFnKQorCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCAoY2hhciAqKSZ1cGR0X3BhcmFtc1swXSwKKwkJCQkJcGFyYW1zX2xlbmd0aCk7CisJbWVtc2V0KHVwZHRfcGFyYW1zLCAwLCBNQVhfRU5BQkxFX0NNRF9TSVpFKTsKKwlwYXJhbXNfbGVuZ3RoID0gMDsKKwl1cGR0X3BhcmFtc1swXSA9IEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSOworCXVwZHRfcGFyYW1zWzFdID0gQVVEUFJPQ19QQVJBTV9JRF9FTkFCTEU7CisJdXBkdF9wYXJhbXNbMl0gPSBFUV9FTkFCTEVfUEFSQU1fU1o7CisJdXBkdF9wYXJhbXNbM10gPSBmbGFnOworCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsgRVFfRU5BQkxFX1BBUkFNX1NaOworCWlmIChlZmZlY3RzLT5lcXVhbGl6ZXIuZW5hYmxlX2ZsYWcpCisJCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIChjaGFyICopJnVwZHRfcGFyYW1zWzBdLAorCQkJCQlwYXJhbXNfbGVuZ3RoKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c192aXJ0dWFsaXplcl9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXN0cnVjdCB2aXJ0dWFsaXplcl9wYXJhbXMgKnZpcnR1YWxpemVyLAorCQkJCWxvbmcgKnZhbHVlcykKK3sKKwlsb25nICpwYXJhbV9tYXhfb2Zmc2V0ID0gdmFsdWVzICsgTUFYX1BQX1BBUkFNU19TWiAtIDE7CisJY2hhciAqcGFyYW1zID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBkZXZpY2VzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJaW50IG51bV9jb21tYW5kcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCWludCAqdXBkdF9wYXJhbXMsIGksIHByZXZfZW5hYmxlX2ZsYWc7CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IChNQVhfSU5CQU5EX1BBUkFNX1NaKTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWlmICghYWMgfHwgKGRldmljZXMgPT0gLUVJTlZBTCkgfHwgKG51bV9jb21tYW5kcyA9PSAtRUlOVkFMKSkgeworCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfZGVidWcoIiVzOiBkZXZpY2U6ICVkXG4iLCBfX2Z1bmNfXywgZGV2aWNlcyk7CisJdXBkdF9wYXJhbXMgPSAoaW50ICopcGFyYW1zOworCXBhcmFtc19sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29tbWFuZHM7IGkrKykgeworCQl1aW50MzJfdCBjb21tYW5kX2lkID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBjb21tYW5kX2NvbmZpZ19zdGF0ZSA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgaW5kZXhfb2Zmc2V0ID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBsZW5ndGggPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXN3aXRjaCAoY29tbWFuZF9pZCkgeworCQljYXNlIFZJUlRVQUxJWkVSX0VOQUJMRToKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiVklSVCBFTkFCTEU6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcHJldl9lbmFibGVfZmxhZyA9IHZpcnR1YWxpemVyLT5lbmFibGVfZmxhZzsKKwkJCXZpcnR1YWxpemVyLT5lbmFibGVfZmxhZyA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6VklSVCBFTkFCTEUgcHJldjolZCwgbmV3OiVkXG4iLCBfX2Z1bmNfXywKKwkJCQlwcmV2X2VuYWJsZV9mbGFnLCB2aXJ0dWFsaXplci0+ZW5hYmxlX2ZsYWcpOworCQkJaWYgKHByZXZfZW5hYmxlX2ZsYWcgIT0gdmlydHVhbGl6ZXItPmVuYWJsZV9mbGFnKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlWSVJUVUFMSVpFUl9FTkFCTEVfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlZJUlQgRU5BQkxFIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCUFVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfRU5BQkxFOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlWSVJUVUFMSVpFUl9FTkFCTEVfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCXZpcnR1YWxpemVyLT5lbmFibGVfZmxhZzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZJUlRVQUxJWkVSX1NUUkVOR1RIOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJWSVJUIFNUUkVOR1RIOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXZpcnR1YWxpemVyLT5zdHJlbmd0aCA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFZJUlQgU1RSRU5HVEggdmFsOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHZpcnR1YWxpemVyLT5zdHJlbmd0aCk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJVklSVFVBTElaRVJfU1RSRU5HVEhfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlZJUlQgU1RSRU5HVEgiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX1NUUkVOR1RIOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJVklSVFVBTElaRVJfU1RSRU5HVEhfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQl2aXJ0dWFsaXplci0+c3RyZW5ndGg7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWSVJUVUFMSVpFUl9PVVRfVFlQRToKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiVklSVCBPVVRfVFlQRTppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQl2aXJ0dWFsaXplci0+b3V0X3R5cGUgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBWSVJUIE9VVF9UWVBFIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgdmlydHVhbGl6ZXItPm91dF90eXBlKTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiVklSVCBPVVRfVFlQRSIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfT1VUX1RZUEU7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCXZpcnR1YWxpemVyLT5vdXRfdHlwZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZJUlRVQUxJWkVSX0dBSU5fQURKVVNUOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJWSVJUIEdBSU5fQURKVVNUOiBpbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQl2aXJ0dWFsaXplci0+Z2Fpbl9hZGp1c3QgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBWSVJUIEdBSU5fQURKVVNUIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgdmlydHVhbGl6ZXItPmdhaW5fYWRqdXN0KTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlWSVJUVUFMSVpFUl9HQUlOX0FESlVTVF9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiVklSVCBHQUlOX0FESlVTVCIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCUFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX0dBSU5fQURKVVNUOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlWSVJUVUFMSVpFUl9HQUlOX0FESlVTVF9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJdmlydHVhbGl6ZXItPmdhaW5fYWRqdXN0OworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgdG8gc2V0IGNvbmZpZ1xuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHBhcmFtc19sZW5ndGggJiYgIW1zbV9kdHNfZWFnbGVfaXNfaHB4X29uKCkgJiYgKHJjID09IDApKQorCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCBwYXJhbXMsCisJCQkJCQlwYXJhbXNfbGVuZ3RoKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogZGlkIG5vdCBzZW5kIHBwIHBhcmFtc1xuIiwgX19mdW5jX18pOworaW52YWxpZF9jb25maWc6CisJa2ZyZWUocGFyYW1zKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c19yZXZlcmJfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkgICAgIHN0cnVjdCByZXZlcmJfcGFyYW1zICpyZXZlcmIsCisJCQkJICAgICBsb25nICp2YWx1ZXMpCit7CisJbG9uZyAqcGFyYW1fbWF4X29mZnNldCA9IHZhbHVlcyArIE1BWF9QUF9QQVJBTVNfU1ogLSAxOworCWNoYXIgKnBhcmFtcyA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgZGV2aWNlcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCWludCBudW1fY29tbWFuZHMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwlpbnQgKnVwZHRfcGFyYW1zLCBpLCBwcmV2X2VuYWJsZV9mbGFnOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoTUFYX0lOQkFORF9QQVJBTV9TWik7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWFjIHx8IChkZXZpY2VzID09IC1FSU5WQUwpIHx8IChudW1fY29tbWFuZHMgPT0gLUVJTlZBTCkpIHsKKwkJcHJfZXJyKCIlczogY2Fubm90IHNldCBhdWRpbyBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbXMgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCIlczogZGV2aWNlOiAlZFxuIiwgX19mdW5jX18sIGRldmljZXMpOworCXVwZHRfcGFyYW1zID0gKGludCAqKXBhcmFtczsKKwlwYXJhbXNfbGVuZ3RoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyspIHsKKwkJdWludDMyX3QgY29tbWFuZF9pZCA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgY29tbWFuZF9jb25maWdfc3RhdGUgPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXVpbnQzMl90IGluZGV4X29mZnNldCA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgbGVuZ3RoID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQlzd2l0Y2ggKGNvbW1hbmRfaWQpIHsKKwkJY2FzZSBSRVZFUkJfRU5BQkxFOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJSRVZFUkJfRU5BQkxFOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXByZXZfZW5hYmxlX2ZsYWcgPSByZXZlcmItPmVuYWJsZV9mbGFnOworCQkJcmV2ZXJiLT5lbmFibGVfZmxhZyA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6UkVWRVJCX0VOQUJMRSBwcmV2OiVkLG5ldzolZFxuIiwgX19mdW5jX18sCisJCQkJCXByZXZfZW5hYmxlX2ZsYWcsIHJldmVyYi0+ZW5hYmxlX2ZsYWcpOworCQkJaWYgKHByZXZfZW5hYmxlX2ZsYWcgIT0gcmV2ZXJiLT5lbmFibGVfZmxhZykgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX0VOQUJMRV9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX0VOQUJMRSIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9FTkFCTEU7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlSRVZFUkJfRU5BQkxFX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJcmV2ZXJiLT5lbmFibGVfZmxhZzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9NT0RFOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJSRVZFUkJfTU9ERTppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlyZXZlcmItPm1vZGUgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfTU9ERSB2YWw6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldmVyYi0+bW9kZSk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX01PREVfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlJFVkVSQl9NT0RFIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX01PREU7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlSRVZFUkJfTU9ERV9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCXJldmVyYi0+bW9kZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9QUkVTRVQ6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9QUkVTRVQ6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcmV2ZXJiLT5wcmVzZXQgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfUFJFU0VUIHZhbDolZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldmVyYi0+cHJlc2V0KTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlSRVZFUkJfUFJFU0VUX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfUFJFU0VUIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1BSRVNFVDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVJFVkVSQl9QUkVTRVRfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlyZXZlcmItPnByZXNldDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9XRVRfTUlYOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJSRVZFUkJfV0VUX01JWDppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlyZXZlcmItPndldF9taXggPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfV0VUX01JWCB2YWw6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldmVyYi0+d2V0X21peCk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX1dFVF9NSVhfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlJFVkVSQl9XRVRfTUlYIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1dFVF9NSVg7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlSRVZFUkJfV0VUX01JWF9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCXJldmVyYi0+d2V0X21peDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9HQUlOX0FESlVTVDoKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiUkVWRVJCX0dBSU5fQURKVVNUOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXJldmVyYi0+Z2Fpbl9hZGp1c3QgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfR0FJTl9BREpVU1QgdmFsOiVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5nYWluX2FkanVzdCk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX0dBSU5fQURKVVNUX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfR0FJTl9BREpVU1QiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfR0FJTl9BREpVU1Q7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlSRVZFUkJfR0FJTl9BREpVU1RfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlyZXZlcmItPmdhaW5fYWRqdXN0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVWRVJCX1JPT01fTEVWRUw6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9ST09NX0xFVkVMOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXJldmVyYi0+cm9vbV9sZXZlbCA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9ST09NX0xFVkVMIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5yb29tX2xldmVsKTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlSRVZFUkJfUk9PTV9MRVZFTF9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX1JPT01fTEVWRUwiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUk9PTV9MRVZFTDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVJFVkVSQl9ST09NX0xFVkVMX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJcmV2ZXJiLT5yb29tX2xldmVsOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVWRVJCX1JPT01fSEZfTEVWRUw6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9ST09NX0hGX0xFVkVMOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXJldmVyYi0+cm9vbV9oZl9sZXZlbCA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9ST09NX0hGX0xFVkVMIHZhbCVkXG4iLAorCQkJCV9fZnVuY19fLCByZXZlcmItPnJvb21faGZfbGV2ZWwpOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9ST09NX0hGX0xFVkVMX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfUk9PTV9IRl9MRVZFTCIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0hGX0xFVkVMOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJUkVWRVJCX1JPT01fSEZfTEVWRUxfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlyZXZlcmItPnJvb21faGZfbGV2ZWw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRVZFUkJfREVDQVlfVElNRToKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiUkVWRVJCX0RFQ0FZX1RJTUU6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcmV2ZXJiLT5kZWNheV90aW1lID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogUkVWRVJCX0RFQ0FZX1RJTUUgdmFsOiVkXG4iLAorCQkJCV9fZnVuY19fLCByZXZlcmItPmRlY2F5X3RpbWUpOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9ERUNBWV9USU1FX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfREVDQVlfVElNRSIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUNBWV9USU1FOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJUkVWRVJCX0RFQ0FZX1RJTUVfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlyZXZlcmItPmRlY2F5X3RpbWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRVZFUkJfREVDQVlfSEZfUkFUSU86CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9ERUNBWV9IRl9SQVRJT2ludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXJldmVyYi0+ZGVjYXlfaGZfcmF0aW8gPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfREVDQVlfSEZfUkFUSU8gdmFsJWRcbiIsCisJCQkJX19mdW5jX18sIHJldmVyYi0+ZGVjYXlfaGZfcmF0aW8pOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9ERUNBWV9IRl9SQVRJT19QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX0RFQ0FZX0hGX1JBVElPIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX0hGX1JBVElPOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJUkVWRVJCX0RFQ0FZX0hGX1JBVElPX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJcmV2ZXJiLT5kZWNheV9oZl9yYXRpbzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTDoKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiUkVWRVJCX1JFRkxFQ1RJT05fTFZMaW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcmV2ZXJiLT5yZWZsZWN0aW9uc19sZXZlbCA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTCB2YWw6JWRcbiIsCisJCQkJX19mdW5jX18sIHJldmVyYi0+cmVmbGVjdGlvbnNfbGV2ZWwpOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTF9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9SRUZMRUNUSU9OU19MRVZFTDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlyZXZlcmItPnJlZmxlY3Rpb25zX2xldmVsOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJSRVZFUkJfUkVGTEVDVElPTl9ETFlpbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlyZXZlcmItPnJlZmxlY3Rpb25zX2RlbGF5ID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5yZWZsZWN0aW9uc19kZWxheSk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfUkVGTEVDVElPTlNfREVMQVkiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQlSRVZFUkJfUkVGTEVDVElPTlNfREVMQVlfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCXJldmVyYi0+cmVmbGVjdGlvbnNfZGVsYXk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRVZFUkJfTEVWRUw6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9MRVZFTDppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlyZXZlcmItPmxldmVsID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogUkVWRVJCX0xFVkVMIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5sZXZlbCk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJUkVWRVJCX0xFVkVMX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJSRVZFUkJfTEVWRUwiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfTEVWRUw7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlSRVZFUkJfTEVWRUxfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlyZXZlcmItPmxldmVsOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVWRVJCX0RFTEFZOgorCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7CisJCQkJcHJfZXJyKCJSRVZFUkJfREVMQVk6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcmV2ZXJiLT5kZWxheSA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6UkVWRVJCX0RFTEFZIHZhbDolZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldmVyYi0+ZGVsYXkpOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9ERUxBWV9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX0RFTEFZIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFTEFZOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJUkVWRVJCX0RFTEFZX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJcmV2ZXJiLT5kZWxheTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFVkVSQl9ESUZGVVNJT046CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9ESUZGVVNJT046aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJcmV2ZXJiLT5kaWZmdXNpb24gPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfRElGRlVTSU9OIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5kaWZmdXNpb24pOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCVJFVkVSQl9ESUZGVVNJT05fUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlJFVkVSQl9ESUZGVVNJT04iLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfRElGRlVTSU9OOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJUkVWRVJCX0RJRkZVU0lPTl9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCXJldmVyYi0+ZGlmZnVzaW9uOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkVWRVJCX0RFTlNJVFk6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlJFVkVSQl9ERU5TSVRZOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXJldmVyYi0+ZGVuc2l0eSA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9ERU5TSVRZIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5kZW5zaXR5KTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlSRVZFUkJfREVOU0lUWV9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiUkVWRVJCX0RFTlNJVFkiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVOU0lUWTsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVJFVkVSQl9ERU5TSVRZX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJcmV2ZXJiLT5kZW5zaXR5OworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgdG8gc2V0IGNvbmZpZ1xuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHBhcmFtc19sZW5ndGggJiYgIW1zbV9kdHNfZWFnbGVfaXNfaHB4X29uKCkgJiYgKHJjID09IDApKQorCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCBwYXJhbXMsCisJCQkJCQlwYXJhbXNfbGVuZ3RoKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogZGlkIG5vdCBzZW5kIHBwIHBhcmFtc1xuIiwgX19mdW5jX18pOworaW52YWxpZF9jb25maWc6CisJa2ZyZWUocGFyYW1zKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c19iYXNzX2Jvb3N0X2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCXN0cnVjdCBiYXNzX2Jvb3N0X3BhcmFtcyAqYmFzc19ib29zdCwKKwkJCQkJbG9uZyAqdmFsdWVzKQoreworCWxvbmcgKnBhcmFtX21heF9vZmZzZXQgPSB2YWx1ZXMgKyBNQVhfUFBfUEFSQU1TX1NaIC0gMTsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGRldmljZXMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwlpbnQgbnVtX2NvbW1hbmRzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJaW50ICp1cGR0X3BhcmFtcywgaSwgcHJldl9lbmFibGVfZmxhZzsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKE1BWF9JTkJBTkRfUEFSQU1fU1opOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFhYyB8fCAoZGV2aWNlcyA9PSAtRUlOVkFMKSB8fCAobnVtX2NvbW1hbmRzID09IC1FSU5WQUwpKSB7CisJCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFyYW1zID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhcmFtcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9kZWJ1ZygiJXM6IGRldmljZTogJWRcbiIsIF9fZnVuY19fLCBkZXZpY2VzKTsKKwl1cGR0X3BhcmFtcyA9IChpbnQgKilwYXJhbXM7CisJcGFyYW1zX2xlbmd0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb21tYW5kczsgaSsrKSB7CisJCXVpbnQzMl90IGNvbW1hbmRfaWQgPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXVpbnQzMl90IGNvbW1hbmRfY29uZmlnX3N0YXRlID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBpbmRleF9vZmZzZXQgPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXVpbnQzMl90IGxlbmd0aCA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJc3dpdGNoIChjb21tYW5kX2lkKSB7CisJCWNhc2UgQkFTU19CT09TVF9FTkFCTEU6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIkJBU1NfQk9PU1RfRU5BQkxFOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXByZXZfZW5hYmxlX2ZsYWcgPSBiYXNzX2Jvb3N0LT5lbmFibGVfZmxhZzsKKwkJCWJhc3NfYm9vc3QtPmVuYWJsZV9mbGFnID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogQkFTU19CT09TVF9FTkFCTEUgcHJldjolZCBuZXc6JWRcbiIsCisJCQkJX19mdW5jX18sIHByZXZfZW5hYmxlX2ZsYWcsCisJCQkJYmFzc19ib29zdC0+ZW5hYmxlX2ZsYWcpOworCQkJaWYgKHByZXZfZW5hYmxlX2ZsYWcgIT0gYmFzc19ib29zdC0+ZW5hYmxlX2ZsYWcpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCUJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJCQVNTX0JPT1NUX0VOQUJMRSIsIHJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NUOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX0VOQUJMRTsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJYmFzc19ib29zdC0+ZW5hYmxlX2ZsYWc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCQVNTX0JPT1NUX01PREU6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIkJBU1NfQk9PU1RfTU9ERTppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQliYXNzX2Jvb3N0LT5tb2RlID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogQkFTU19CT09TVF9NT0RFIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgYmFzc19ib29zdC0+bW9kZSk7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJQkFTU19CT09TVF9NT0RFX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJCQVNTX0JPT1NUX01PREUiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfQkFTU19CT09TVF9NT0RFOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQkFTU19CT09TVF9NT0RFX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJYmFzc19ib29zdC0+bW9kZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJBU1NfQk9PU1RfU1RSRU5HVEg6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIkJBU1NfQk9PU1RfU1RSRU5HVEg6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJYmFzc19ib29zdC0+c3RyZW5ndGggPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBCQVNTX0JPT1NUX1NUUkVOR1RIIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgYmFzc19ib29zdC0+c3RyZW5ndGgpOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCUJBU1NfQk9PU1RfU1RSRU5HVEhfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIkJBU1NfQk9PU1RfU1RSRU5HVEgiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfQkFTU19CT09TVF9TVFJFTkdUSDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUJBU1NfQk9PU1RfU1RSRU5HVEhfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQliYXNzX2Jvb3N0LT5zdHJlbmd0aDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kIHRvIHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwYXJhbXNfbGVuZ3RoICYmICFtc21fZHRzX2VhZ2xlX2lzX2hweF9vbigpICYmIChyYyA9PSAwKSkKKwkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgcGFyYW1zLAorCQkJCQkJcGFyYW1zX2xlbmd0aCk7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IGRpZCBub3Qgc2VuZCBwcCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKK2ludmFsaWRfY29uZmlnOgorCWtmcmVlKHBhcmFtcyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbXNtX2F1ZGlvX2VmZmVjdHNfcGJlX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCXN0cnVjdCBwYmVfcGFyYW1zICpwYmUsCisJCQkJCWxvbmcgKnZhbHVlcykKK3sKKwlsb25nICpwYXJhbV9tYXhfb2Zmc2V0ID0gdmFsdWVzICsgTUFYX1BQX1BBUkFNU19TWiAtIDE7CisJY2hhciAqcGFyYW1zID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBkZXZpY2VzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJaW50IG51bV9jb21tYW5kcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCWludCAqdXBkdF9wYXJhbXMsIGksIGosIHByZXZfZW5hYmxlX2ZsYWc7CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IChNQVhfSU5CQU5EX1BBUkFNX1NaKTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWlmICghYWMgfHwgKGRldmljZXMgPT0gLUVJTlZBTCkgfHwgKG51bV9jb21tYW5kcyA9PSAtRUlOVkFMKSkgeworCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfZGVidWcoIiVzOiBkZXZpY2U6ICVkXG4iLCBfX2Z1bmNfXywgZGV2aWNlcyk7CisJdXBkdF9wYXJhbXMgPSAoaW50ICopcGFyYW1zOworCXBhcmFtc19sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29tbWFuZHM7IGkrKykgeworCQl1aW50MzJfdCBjb21tYW5kX2lkID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBjb21tYW5kX2NvbmZpZ19zdGF0ZSA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgaW5kZXhfb2Zmc2V0ID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBsZW5ndGggPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXN3aXRjaCAoY29tbWFuZF9pZCkgeworCQljYXNlIFBCRV9FTkFCTEU6CisJCQlwcl9kZWJ1ZygiJXM6IFBCRV9FTkFCTEVcbiIsIF9fZnVuY19fKTsKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2Vycigibm8gdmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXByZXZfZW5hYmxlX2ZsYWcgPSBwYmUtPmVuYWJsZV9mbGFnOworCQkJcGJlLT5lbmFibGVfZmxhZyA9CisJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlpZiAocHJldl9lbmFibGVfZmxhZyAhPSBwYmUtPmVuYWJsZV9mbGFnKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlQQkVfRU5BQkxFX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJQQkVfRU5BQkxFIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1BCRTsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfUEFSQU1fSURfUEJFX0VOQUJMRTsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVBCRV9FTkFCTEVfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlwYmUtPmVuYWJsZV9mbGFnOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEJFX0NPTkZJRzoKKwkJCXByX2RlYnVnKCIlczogUEJFX1BBUkFNIGxlbmd0aCAldVxuIiwgX19mdW5jX18sIGxlbmd0aCk7CisJCQlpZiAobGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBwYmVfY29uZmlnX3QpIHx8CisJCQkJbGVuZ3RoIDwgUEJFX0NPTkZJR19QQVJBTV9MRU4gfHwKKwkJCQlpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2Vycigibm8gdmFsaWQgcGFyYW1zLCBsZW4gJWRcbiIsIGxlbmd0aCk7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsgbGVuZ3RoOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJQQkVfUEFSQU0iLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUEJFOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9QQkVfUEFSQU1fQ09ORklHOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJbGVuZ3RoOworCQkJCWZvciAoaiA9IDA7IGogPCBsZW5ndGg7ICkgeworCQkJCQlqICs9IHNpemVvZigqdXBkdF9wYXJhbXMpOworCQkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCQlHRVRfTkVYVCgKKwkJCQkJCXZhbHVlcywKKwkJCQkJCXBhcmFtX21heF9vZmZzZXQsCisJCQkJCQlyYyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgdG8gc2V0IGNvbmZpZ1xuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHBhcmFtc19sZW5ndGggJiYgKHJjID09IDApKQorCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCBwYXJhbXMsCisJCQkJCQlwYXJhbXNfbGVuZ3RoKTsKK2ludmFsaWRfY29uZmlnOgorCWtmcmVlKHBhcmFtcyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbXNtX2F1ZGlvX2VmZmVjdHNfcG9wbGVzc19lcV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgc3RydWN0IGVxX3BhcmFtcyAqZXEsCisJCQkJCSBsb25nICp2YWx1ZXMpCit7CisJbG9uZyAqcGFyYW1fbWF4X29mZnNldCA9IHZhbHVlcyArIE1BWF9QUF9QQVJBTVNfU1ogLSAxOworCWNoYXIgKnBhcmFtcyA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgZGV2aWNlcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCWludCBudW1fY29tbWFuZHMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwlpbnQgKnVwZHRfcGFyYW1zLCBpLCBwcmV2X2VuYWJsZV9mbGFnOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoTUFYX0lOQkFORF9QQVJBTV9TWik7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWFjIHx8IChkZXZpY2VzID09IC1FSU5WQUwpIHx8IChudW1fY29tbWFuZHMgPT0gLUVJTlZBTCkpIHsKKwkJcHJfZXJyKCIlczogY2Fubm90IHNldCBhdWRpbyBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbXMgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCIlczogZGV2aWNlOiAlZFxuIiwgX19mdW5jX18sIGRldmljZXMpOworCXVwZHRfcGFyYW1zID0gKGludCAqKXBhcmFtczsKKwlwYXJhbXNfbGVuZ3RoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyspIHsKKwkJdWludDMyX3QgY29tbWFuZF9pZCA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgY29tbWFuZF9jb25maWdfc3RhdGUgPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXVpbnQzMl90IGluZGV4X29mZnNldCA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgbGVuZ3RoID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBpZHg7CisJCWludCBqOworCisJCXN3aXRjaCAoY29tbWFuZF9pZCkgeworCQljYXNlIEVRX0VOQUJMRToKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiRVFfRU5BQkxFOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXByZXZfZW5hYmxlX2ZsYWcgPSBlcS0+ZW5hYmxlX2ZsYWc7CisJCQllcS0+ZW5hYmxlX2ZsYWcgPQorCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJcHJfZGVidWcoIiVzOiBFUV9FTkFCTEUgcHJldjolZCBuZXc6JWRcbiIsIF9fZnVuY19fLAorCQkJCXByZXZfZW5hYmxlX2ZsYWcsIGVxLT5lbmFibGVfZmxhZyk7CisJCQlpZiAocHJldl9lbmFibGVfZmxhZyAhPSBlcS0+ZW5hYmxlX2ZsYWcpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCUVRX0VOQUJMRV9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiRVFfRU5BQkxFIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9FUV9FTkFCTEU7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlFUV9FTkFCTEVfUEFSQU1fU1o7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQllcS0+ZW5hYmxlX2ZsYWc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBFUV9DT05GSUc6CisJCQlpZiAobGVuZ3RoIDwgRVFfQ09ORklHX1BBUkFNX0xFTiB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiRVFfQ09ORklHOmludmFsaWQgcGFyYW1zXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCXByX2RlYnVnKCIlczogRVFfQ09ORklHIGJhbmRzOiVkLCBwZ2FpbjolZCwgcHNldDolZFxuIiwKKwkJCQkgX19mdW5jX18sIGVxLT5jb25maWcubnVtX2JhbmRzLAorCQkJCWVxLT5jb25maWcuZXFfcHJlZ2FpbiwgZXEtPmNvbmZpZy5wcmVzZXRfaWQpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfRVFfQkFORFM7IGlkeCsrKQorCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5iYW5kX2lkeCA9IC0xOworCQkJZXEtPmNvbmZpZy5lcV9wcmVnYWluID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCWVxLT5jb25maWcucHJlc2V0X2lkID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCWVxLT5jb25maWcubnVtX2JhbmRzID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCWlmIChlcS0+Y29uZmlnLm51bV9iYW5kcyA+IE1BWF9FUV9CQU5EUykgeworCQkJCXByX2VycigiRVFfQ09ORklHOmludmFsaWQgbnVtIG9mIGJhbmRzXG4iKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKKwkJCX0KKwkJCWlmIChlcS0+Y29uZmlnLm51bV9iYW5kcyAmJgorCQkJICAgICgoKGxlbmd0aCAtIEVRX0NPTkZJR19QQVJBTV9MRU4pLworCQkJCUVRX0NPTkZJR19QRVJfQkFORF9QQVJBTV9MRU4pCisJCQkJIT0gZXEtPmNvbmZpZy5udW1fYmFuZHMpKSB7CisJCQkJcHJfZXJyKCJFUV9DT05GSUc6aW52YWxpZCBsZW5ndGggcGVyIGJhbmRcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IGVxLT5jb25maWcubnVtX2JhbmRzOyBqKyspIHsKKwkJCQlpZHggPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCQlpZiAoaWR4ID49IE1BWF9FUV9CQU5EUykgeworCQkJCQlwcl9lcnIoIkVRX0NPTkZJRzppbnZhbGlkIGJhbmQgaW5kZXhcbiIpOworCQkJCQlyYyA9IC1FSU5WQUw7CisJCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQkJfQorCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5iYW5kX2lkeCA9IGlkeDsKKwkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uZmlsdGVyX3R5cGUgPQorCQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uZnJlcV9taWxsaWhlcnR6ID0KKwkJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmdhaW5fbWlsbGliZWxzID0KKwkJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLnF1YWxpdHlfZmFjdG9yID0KKwkJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQl9CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCWludCBjb25maWdfcGFyYW1fbGVuZ3RoID0gRVFfQ09ORklHX1BBUkFNX1NaICsKKwkJCQkJKEVRX0NPTkZJR19QRVJfQkFORF9QQVJBTV9TWioKKwkJCQkJIGVxLT5jb25maWcubnVtX2JhbmRzKTsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCQljb25maWdfcGFyYW1fbGVuZ3RoOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJFUV9DT05GSUciLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX0VRX0NPTkZJRzsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCWNvbmZpZ19wYXJhbV9sZW5ndGg7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQllcS0+Y29uZmlnLmVxX3ByZWdhaW47CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQllcS0+Y29uZmlnLnByZXNldF9pZDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCWVxLT5jb25maWcubnVtX2JhbmRzOworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0VRX0JBTkRTOyBpZHgrKykgeworCQkJCQlpZiAoZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmJhbmRfaWR4IDwgMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5maWx0ZXJfdHlwZTsKKwkJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uZnJlcV9taWxsaWhlcnR6OworCQkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5nYWluX21pbGxpYmVsczsKKwkJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0ucXVhbGl0eV9mYWN0b3I7CisJCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmJhbmRfaWR4OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEVRX0JBTkRfSU5ERVg6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIkVRX0JBTkRfSU5ERVg6aW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJaWR4ID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCQlpZiAoaWR4ID4gTUFYX0VRX0JBTkRTKSB7CisJCQkJcHJfZXJyKCJFUV9CQU5EX0lOREVYOmludmFsaWQgYmFuZCBpbmRleFxuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQllcS0+YmFuZF9pbmRleCA9IGlkeDsKKwkJCXByX2RlYnVnKCIlczogRVFfQkFORF9JTkRFWCB2YWw6JWRcbiIsCisJCQkJX19mdW5jX18sIGVxLT5iYW5kX2luZGV4KTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlFUV9CQU5EX0lOREVYX1BBUkFNX1NaOworCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAorCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKKwkJCQkJCSJFUV9CQU5EX0lOREVYIiwgcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0lOREVYOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJRVFfQkFORF9JTkRFWF9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCWVxLT5iYW5kX2luZGV4OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRVFfU0lOR0xFX0JBTkRfRlJFUToKKwkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiRVFfU0lOR0xFX0JBTkRfRlJFUTppbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQlpZiAoZXEtPmJhbmRfaW5kZXggPiBNQVhfRVFfQkFORFMpIHsKKwkJCQlwcl9lcnIoIkVRX1NJTkdMRV9CQU5EX0ZSRVE6aW52YWxpZCBpbmRleFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQllcS0+ZnJlcV9taWxsaWhlcnR6ID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXByX2RlYnVnKCIlczogRVFfU0lOR0xFX0JBTkRfRlJFUSBpZHg6JWQsIHZhbDolZFxuIiwKKwkJCQlfX2Z1bmNfXywgZXEtPmJhbmRfaW5kZXgsIGVxLT5mcmVxX21pbGxpaGVydHopOworCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKKwkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCisJCQkJCUVRX1NJTkdMRV9CQU5EX0ZSRVFfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIkVRX1NJTkdMRV9CQU5EX0ZSRVEiLCByYyk7CisJCQkJaWYgKHJjICE9IDApCisJCQkJCWJyZWFrOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVI7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBVURQUk9DX1BBUkFNX0lEX0VRX1NJTkdMRV9CQU5EX0ZSRVE7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlFUV9TSU5HTEVfQkFORF9GUkVRX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJZXEtPmZyZXFfbWlsbGloZXJ0ejsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kIHRvIHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwYXJhbXNfbGVuZ3RoICYmICFtc21fZHRzX2VhZ2xlX2lzX2hweF9vbigpICYmIChyYyA9PSAwKSkKKwkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgcGFyYW1zLAorCQkJCQkJcGFyYW1zX2xlbmd0aCk7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IGRpZCBub3Qgc2VuZCBwcCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKK2ludmFsaWRfY29uZmlnOgorCWtmcmVlKHBhcmFtcyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fbXNtX2F1ZGlvX2VmZmVjdHNfdm9sdW1lX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgICAgIHN0cnVjdCBzb2Z0X3ZvbHVtZV9wYXJhbXMgKnZvbCwKKwkJCQkJICAgICAgbG9uZyAqdmFsdWVzLAorCQkJCQkgICAgICBpbnQgaW5zdGFuY2UpCit7CisJaW50IGRldmljZXM7CisJaW50IG51bV9jb21tYW5kczsKKwljaGFyICpwYXJhbXMgPSBOVUxMOworCWludCAqdXBkdF9wYXJhbXMsIGk7CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IChNQVhfSU5CQU5EX1BBUkFNX1NaKTsKKwlsb25nICpwYXJhbV9tYXhfb2Zmc2V0OworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGluc3RhbmNlOiAlZFxuIiwgX19mdW5jX18sIGluc3RhbmNlKTsKKwlpZiAoIXZhbHVlcykgeworCQlwcl9lcnIoIiVzOiBzZXQgYXVkaW8gZWZmZWN0cyBmYWlsZWQsIG5vIHZhbGlkIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbV9tYXhfb2Zmc2V0ID0gdmFsdWVzICsgTUFYX1BQX1BBUkFNU19TWiAtIDE7CisJZGV2aWNlcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCW51bV9jb21tYW5kcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCWlmICghYWMgfHwgKGRldmljZXMgPT0gLUVJTlZBTCkgfHwgKG51bV9jb21tYW5kcyA9PSAtRUlOVkFMKSkgeworCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJdXBkdF9wYXJhbXMgPSAoaW50ICopcGFyYW1zOworCXBhcmFtc19sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29tbWFuZHM7IGkrKykgeworCQl1aW50MzJfdCBjb21tYW5kX2lkID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBjb21tYW5kX2NvbmZpZ19zdGF0ZSA9CisJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJdWludDMyX3QgaW5kZXhfb2Zmc2V0ID0KKwkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQl1aW50MzJfdCBsZW5ndGggPQorCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7CisJCXN3aXRjaCAoY29tbWFuZF9pZCkgeworCQljYXNlIFNPRlRfVk9MVU1FX0dBSU5fMkNIOgorCQljYXNlIFNPRlRfVk9MVU1FMl9HQUlOXzJDSDoKKwkJCWlmIChsZW5ndGggIT0gMiB8fCBpbmRleF9vZmZzZXQgIT0gMCkgeworCQkJCXByX2VycigiVk9MVU1FX0dBSU5fMkNIOiBpbnZhbGlkIHBhcmFtc1xuIik7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gaW52YWxpZF9jb25maWc7CisJCQl9CisJCQl2b2wtPmxlZnRfZ2FpbiA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOworCQkJdm9sLT5yaWdodF9nYWluID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCXZvbC0+bWFzdGVyX2dhaW4gPSAweDIwMDA7CisJCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgeworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJCVNPRlRfVk9MVU1FX0dBSU5fMkNIX1BBUkFNX1NaOworCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKKwkJCQkJU09GVF9WT0xVTUVfR0FJTl9NQVNURVJfUEFSQU1fU1o7CisJCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCisJCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAorCQkJCQkJIlZPTFVNRS9WT0xVTUUyX0dBSU5fMkNIIiwKKwkJCQkJCXJjKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGluc3RhbmNlID09IFNPRlRfVk9MVU1FX0lOU1RBTkNFXzIpCisJCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkwyOworCQkJCWVsc2UKKwkJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQkJQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9MUl9DSEFOTkVMX0dBSU47CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCSh2b2wtPmxlZnRfZ2FpbiA8PCAxNikgfAorCQkJCQkJdm9sLT5yaWdodF9nYWluOworCQkJCWlmIChpbnN0YW5jZSA9PSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yKQorCQkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCQlBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKKwkJCQllbHNlCisJCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkw7CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlBU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU47CisJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9TWjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCXZvbC0+bWFzdGVyX2dhaW47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUjoKKwkJY2FzZSBTT0ZUX1ZPTFVNRTJfR0FJTl9NQVNURVI6CisJCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKKwkJCQlwcl9lcnIoIlZPTFVNRV9HQUlOX01BU1RFUjogaW52YWxpZCBwYXJhbXNcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGludmFsaWRfY29uZmlnOworCQkJfQorCQkJdm9sLT5sZWZ0X2dhaW4gPSAweDIwMDA7CisJCQl2b2wtPnJpZ2h0X2dhaW4gPSAweDIwMDA7CisJCQl2b2wtPm1hc3Rlcl9nYWluID0KKwkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKKwkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQkJU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fU1o7CisJCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKworCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9TWjsKKwkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKKwkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCisJCQkJCQkiVk9MVU1FL1ZPTFVNRTJfR0FJTl9NQVNURVIiLAorCQkJCQkJcmMpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoaW5zdGFuY2UgPT0gU09GVF9WT0xVTUVfSU5TVEFOQ0VfMikKKwkJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQkJQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDI7CisJCQkJZWxzZQorCQkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCQlBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX0xSX0NIQU5ORUxfR0FJTjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVNPRlRfVk9MVU1FX0dBSU5fMkNIX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJKHZvbC0+bGVmdF9nYWluIDw8IDE2KSB8CisJCQkJCQl2b2wtPnJpZ2h0X2dhaW47CisJCQkJaWYgKGluc3RhbmNlID09IFNPRlRfVk9MVU1FX0lOU1RBTkNFXzIpCisJCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkwyOworCQkJCWVsc2UKKwkJCQkJKnVwZHRfcGFyYW1zKysgPQorCQkJCQkJQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCUFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NQVNURVJfR0FJTjsKKwkJCQkqdXBkdF9wYXJhbXMrKyA9CisJCQkJCVNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX1NaOworCQkJCSp1cGR0X3BhcmFtcysrID0KKwkJCQkJdm9sLT5tYXN0ZXJfZ2FpbjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kIGlkOiAlZCB0byBzZXQgY29uZmlnXG4iLAorCQkJCV9fZnVuY19fLCBjb21tYW5kX2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwYXJhbXNfbGVuZ3RoICYmIChyYyA9PSAwKSkKKwkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgcGFyYW1zLAorCQkJCQkJcGFyYW1zX2xlbmd0aCk7CitpbnZhbGlkX2NvbmZpZzoKKwlrZnJlZShwYXJhbXMpOworCXJldHVybiByYzsKK30KKworaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCSAgICAgc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyAqdm9sLAorCQkJCSAgICAgbG9uZyAqdmFsdWVzKQoreworCXJldHVybiBfX21zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKGFjLCB2b2wsIHZhbHVlcywKKwkJCQkJCSAgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMSk7Cit9CisKK2ludCBtc21fYXVkaW9fZWZmZWN0c192b2x1bWVfaGFuZGxlcl92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyAqdm9sLAorCQkJCQlsb25nICp2YWx1ZXMsIGludCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gX19tc21fYXVkaW9fZWZmZWN0c192b2x1bWVfaGFuZGxlcihhYywgdm9sLCB2YWx1ZXMsIGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tY29tcHItcTYtdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tY29tcHItcTYtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkzMjVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wci1xNi12Mi5jCkBAIC0wLDAgKzEsMTcxNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+CisKKyNpbmNsdWRlIDxzb3VuZC90aW1lci5oPgorCisjaW5jbHVkZSAibXNtLWNvbXByLXE2LXYyLmgiCisjaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNkZWZpbmUgQ09NUFJFX0NBUFRVUkVfTlVNX1BFUklPRFMJMTYKKy8qIEFsbG9jYXRlIHRoZSB3b3JzdCBjYXNlIGZyYW1lIHNpemUgZm9yIGNvbXByZXNzZWQgYXVkaW8gKi8KKyNkZWZpbmUgQ09NUFJFX0NBUFRVUkVfSEVBREVSX1NJWkUJKHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2F1ZGlvX2luZm8pKQorLyogQ2hhbmdpbmcgcGVyaW9kIHNpemUgdG8gNDAzMi4gNDAzMiB3aWxsIG1ha2Ugc3VyZSBDT01QUkVfQ0FQVFVSRV9QRVJJT0RfU0laRQorICogaXMgNDA5NiB3aXRoIG1ldGEgZGF0YSBzaXplIG9mIDY0IGFuZCBNQVhfTlVNX0ZSQU1FU19QRVJfQlVGRkVSIDEKKyAqLworI2RlZmluZSBDT01QUkVfQ0FQVFVSRV9NQVhfRlJBTUVfU0laRQkoNDAzMikKKyNkZWZpbmUgQ09NUFJFX0NBUFRVUkVfUEVSSU9EX1NJWkUJKChDT01QUkVfQ0FQVFVSRV9NQVhfRlJBTUVfU0laRSArIFwKKwkJCQkJICBDT01QUkVfQ0FQVFVSRV9IRUFERVJfU0laRSkgKiBcCisJCQkJCSAgTUFYX05VTV9GUkFNRVNfUEVSX0JVRkZFUikKKyNkZWZpbmUgQ09NUFJFX09VVFBVVF9NRVRBREFUQV9TSVpFCShzaXplb2Yoc3RydWN0IG91dHB1dF9tZXRhX2RhdGFfc3QpKQorI2RlZmluZSBDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFMJMHgyMDAwMjAwMAorCisjZGVmaW5lIE1BWF9BQzNfUEFSQU1fU0laRQkJKDE4KjIqc2l6ZW9mKGludCkpCisjZGVmaW5lIEFNUl9XQl9CQU5EX01PREUgOAorI2RlZmluZSBBTVJfV0JfRFRYX01PREUgMAorCisKK2NvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihjb21wcl9yeF92b2xfZ2FpbiwgMCwKKwkJCSAgICBDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFMpOworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2xvY2tzIHRoZV9sb2NrczsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9jb21wcl9oYXJkd2FyZV9jYXB0dXJlID0geworCS5pbmZvID0JCSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPQkgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkucmF0ZV9taW4gPQkgICAgIDgwMDAsCisJLnJhdGVfbWF4ID0JICAgICA0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0JIDEsCisJLmNoYW5uZWxzX21heCA9CSA4LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0KKwkJQ09NUFJFX0NBUFRVUkVfUEVSSU9EX1NJWkUgKiBDT01QUkVfQ0FQVFVSRV9OVU1fUEVSSU9EUywKKwkucGVyaW9kX2J5dGVzX21pbiA9CUNPTVBSRV9DQVBUVVJFX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gQ09NUFJFX0NBUFRVUkVfUEVSSU9EX1NJWkUsCisJLnBlcmlvZHNfbWluID0JICBDT01QUkVfQ0FQVFVSRV9OVU1fUEVSSU9EUywKKwkucGVyaW9kc19tYXggPQkgIENPTVBSRV9DQVBUVVJFX05VTV9QRVJJT0RTLAorCS5maWZvX3NpemUgPQkgICAgMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fY29tcHJfaGFyZHdhcmVfcGxheWJhY2sgPSB7CisJLmluZm8gPQkJIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9CSAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV9LTk9ULAorCS5yYXRlX21pbiA9CSAgICAgODAwMCwKKwkucmF0ZV9tYXggPQkgICAgIDQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkgMSwKKwkuY2hhbm5lbHNfbWF4ID0JIDgsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSAgICAgMTAyNCAqIDEwMjQsCisJLnBlcmlvZF9ieXRlc19taW4gPQkxMjggKiAxMDI0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gICAgIDI1NiAqIDEwMjQsCisJLnBlcmlvZHNfbWluID0JICA0LAorCS5wZXJpb2RzX21heCA9CSAgOCwKKwkuZmlmb19zaXplID0JICAgIDAsCit9OworCisvKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7CisJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCit9OworCisvKiBBZGQgc3VwcG9ydGVkIGNvZGVjcyBmb3IgY29tcHJlc3MgY2FwdHVyZSBwYXRoICovCitzdGF0aWMgdWludDMyX3Qgc3VwcG9ydGVkX2NvbXByX2NhcHR1cmVfY29kZWNzW10gPSB7CisJU05EX0FVRElPQ09ERUNfQU1SV0IKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCisJLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBib29sIG1zbV9jb21wcl9jYXB0dXJlX2NvZGVjcyh1aW50MzJfdCByZXFfY29kZWMpCit7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXMgcmVxX2NvZGVjOiVkXG4iLCBfX2Z1bmNfXywgcmVxX2NvZGVjKTsKKwlpZiAocmVxX2NvZGVjID09IDApCisJCXJldHVybiBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdXBwb3J0ZWRfY29tcHJfY2FwdHVyZV9jb2RlY3MpOyBpKyspIHsKKwkJaWYgKHJlcV9jb2RlYyA9PSBzdXBwb3J0ZWRfY29tcHJfY2FwdHVyZV9jb2RlY3NbaV0pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjb21wcl9ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwKKwkJdWludDMyX3QgdG9rZW4sIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBjb21wcl9hdWRpbyAqY29tcHIgPSBwcml2OworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSAmY29tcHItPnBydGQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwcnRkLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgYXVkaW9fYWlvX3dyaXRlX3BhcmFtIHBhcmFtOworCXN0cnVjdCBhdWRpb19haW9fcmVhZF9wYXJhbSByZWFkX3BhcmFtOworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1ZiA9IE5VTEw7CisJcGh5c19hZGRyX3QgdGVtcDsKKwlzdHJ1Y3Qgb3V0cHV0X21ldGFfZGF0YV9zdCBvdXRwdXRfbWV0YV9kYXRhOworCXVpbnQzMl90ICpwdHJtZW0gPSAodWludDMyX3QgKilwYXlsb2FkOworCWludCBpID0gMDsKKwlpbnQgdGltZV9zdGFtcF9mbGFnID0gMDsKKwlpbnQgYnVmZmVyX2xlbmd0aCA9IDA7CisJaW50IHN0b3BfcGxheWJhY2sgPSAwOworCisJcHJfZGVidWcoIiVzIG9wY29kZSA9JTA4eFxuIiwgX19mdW5jX18sIG9wY29kZSk7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6IHsKKwkJdWludDMyX3QgKnB0cm1lbSA9ICh1aW50MzJfdCAqKSZwYXJhbTsKKworCQlwcl9kZWJ1ZygiQVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORVxuIik7CisJCXByX2RlYnVnKCJCdWZmZXIgQ29uc3VtZWQgPSAweCUwOHhcbiIsICpwdHJtZW0pOworCQlwcnRkLT5wY21faXJxX3BvcyArPSBwcnRkLT5wY21fY291bnQ7CisJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQorCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCQllbHNlCisJCQlpZiAoc3Vic3RyZWFtLT50aW1lcl9ydW5uaW5nKQorCQkJCXNuZF90aW1lcl9pbnRlcnJ1cHQoc3Vic3RyZWFtLT50aW1lciwgMSk7CisJCWF0b21pY19pbmMoJnBydGQtPm91dF9jb3VudCk7CisJCXdha2VfdXAoJnRoZV9sb2Nrcy53cml0ZV93YWl0KTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKSB7CisJCQlhdG9taWNfc2V0KCZwcnRkLT5wZW5kaW5nX2J1ZmZlciwgMSk7CisJCQlicmVhazsKKwkJfQorCQlhdG9taWNfc2V0KCZwcnRkLT5wZW5kaW5nX2J1ZmZlciwgMCk7CisKKwkJLyoKKwkJICogY2hlY2sgZm9yIHVuZGVycnVuCisJCSAqLworCQlzbmRfcGNtX3N0cmVhbV9sb2NrX2lycShzdWJzdHJlYW0pOworCQlpZiAocnVudGltZS0+c3RhdHVzLT5od19wdHIgPj0gcnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIpIHsKKwkJCXJ1bnRpbWUtPnJlbmRlcl9mbGFnIHw9IFNORFJWX1JFTkRFUl9TVE9QUEVEOworCQkJc3RvcF9wbGF5YmFjayA9IDE7CisJCX0KKwkJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOworCisJCWlmIChzdG9wX3BsYXliYWNrKSB7CisJCQlwcl9lcnIoInVuZGVycnVuISByZW5kZXIgc3RvcHBlZFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtJTl0uYnVmOworCQlwcl9kZWJ1ZygiJXM6d3JpdGluZyAlZCBieXRlcyBvZiBidWZmZXJbJWRdIHRvIGRzcCAyXG4iLAorCQkJCV9fZnVuY19fLCBwcnRkLT5wY21fY291bnQsIHBydGQtPm91dF9oZWFkKTsKKwkJdGVtcCA9IGJ1ZlswXS5waHlzICsgKHBydGQtPm91dF9oZWFkICogcHJ0ZC0+cGNtX2NvdW50KTsKKwkJcHJfZGVidWcoIiVzOndyaXRpbmcgYnVmZmVyWyVkXSBmcm9tIDB4JXBLXG4iLAorCQkJX19mdW5jX18sIHBydGQtPm91dF9oZWFkLCAmdGVtcCk7CisKKwkJaWYgKHJ1bnRpbWUtPnRzdGFtcF9tb2RlID09IFNORFJWX1BDTV9UU1RBTVBfRU5BQkxFKQorCQkJdGltZV9zdGFtcF9mbGFnID0gU0VUX1RJTUVTVEFNUDsKKwkJZWxzZQorCQkJdGltZV9zdGFtcF9mbGFnID0gTk9fVElNRVNUQU1QOworCQltZW1jcHkoJm91dHB1dF9tZXRhX2RhdGEsIChjaGFyICopKGJ1Zi0+ZGF0YSArCisJCQlwcnRkLT5vdXRfaGVhZCAqIHBydGQtPnBjbV9jb3VudCksCisJCQlDT01QUkVfT1VUUFVUX01FVEFEQVRBX1NJWkUpOworCisJCWJ1ZmZlcl9sZW5ndGggPSBvdXRwdXRfbWV0YV9kYXRhLmZyYW1lX3NpemU7CisJCXByX2RlYnVnKCJtZXRhX2RhdGFfbGVuZ3RoOiAlZCwgZnJhbWVfbGVuZ3RoOiAlZFxuIiwKKwkJCSBvdXRwdXRfbWV0YV9kYXRhLm1ldGFfZGF0YV9sZW5ndGgsCisJCQkgb3V0cHV0X21ldGFfZGF0YS5mcmFtZV9zaXplKTsKKwkJcHJfZGVidWcoInRpbWVzdGFtcF9tc3c6ICVkLCB0aW1lc3RhbXBfbHN3OiAlZFxuIiwKKwkJCSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9tc3csCisJCQkgb3V0cHV0X21ldGFfZGF0YS50aW1lc3RhbXBfbHN3KTsKKwkJaWYgKGJ1ZmZlcl9sZW5ndGggPT0gMCkgeworCQkJcHJfZGVidWcoIlJlY2VpdmVkIGEgemVybyBsZW5ndGggYnVmZmVyLWJyZWFrIG91dCIpOworCQkJYnJlYWs7CisJCX0KKwkJcGFyYW0ucGFkZHIgPSB0ZW1wICsgb3V0cHV0X21ldGFfZGF0YS5tZXRhX2RhdGFfbGVuZ3RoOworCQlwYXJhbS5sZW4gPSBidWZmZXJfbGVuZ3RoOworCQlwYXJhbS5tc3dfdHMgPSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9tc3c7CisJCXBhcmFtLmxzd190cyA9IG91dHB1dF9tZXRhX2RhdGEudGltZXN0YW1wX2xzdzsKKwkJcGFyYW0uZmxhZ3MgPSB0aW1lX3N0YW1wX2ZsYWc7CisJCXBhcmFtLnVpZCA9IHBydGQtPnNlc3Npb25faWQ7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSkvNDsKKwkJCQkJaSsrLCArK3B0cm1lbSkKKwkJCXByX2RlYnVnKCJjbWRbJWRdPTB4JTA4eFxuIiwgaSwgKnB0cm1lbSk7CisJCWlmIChxNmFzbV9hc3luY193cml0ZShwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJCSZwYXJhbSkgPCAwKQorCQkJcHJfZXJyKCIlczpxNmFzbV9hc3luY193cml0ZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQllbHNlCisJCQlwcnRkLT5vdXRfaGVhZCA9CisJCQkJKHBydGQtPm91dF9oZWFkICsgMSkgJiAocnVudGltZS0+cGVyaW9kcyAtIDEpOworCQlicmVhazsKKwl9CisJY2FzZSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1M6CisJCXByX2RlYnVnKCJBU01fREFUQV9DTURSU1BfRU9TXG4iKTsKKwkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lb3MpKSB7CisJCQlwcl9kZWJ1ZygiQVNNX0RBVEFfQ01EUlNQX0VPUyB3YWtlIHVwXG4iKTsKKwkJCXBydGQtPmNtZF9hY2sgPSAxOworCQkJd2FrZV91cCgmdGhlX2xvY2tzLmVvc193YWl0KTsKKwkJCWF0b21pY19zZXQoJnBydGQtPmVvcywgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6IHsKKwkJcHJfZGVidWcoIkFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORVxuIik7CisJCXByX2RlYnVnKCJidWYgPSAlcEssIGRhdGEgPSAweCVYLCAqZGF0YSA9ICVwSyxcbiIKKwkJCSAicHJ0ZC0+cGNtX2lycV9wb3MgPSAlZFxuIiwKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbT1VUXS5idWYsCisJCQkgKih1aW50MzJfdCAqKXBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtPVVRdLmJ1Zi0+ZGF0YSwKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbT1VUXS5idWYtPmRhdGEsCisJCQkJcHJ0ZC0+cGNtX2lycV9wb3MpOworCisJCW1lbWNweShwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbT1VUXS5idWYtPmRhdGEgKworCQkJICAgcHJ0ZC0+cGNtX2lycV9wb3MsIChwdHJtZW0gKyBSRUFERE9ORV9JRFhfU0laRSksCisJCQkgICBDT01QUkVfQ0FQVFVSRV9IRUFERVJfU0laRSk7CisJCXByX2RlYnVnKCJidWYgPSAlcEssIHVwZGF0ZWQgZGF0YSA9IDB4JVgsICpkYXRhID0gJXBLXG4iLAorCQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtPVVRdLmJ1ZiwKKwkJCSoodWludDMyX3QgKikocHJ0ZC0+YXVkaW9fY2xpZW50LT5wb3J0W09VVF0uYnVmLT5kYXRhICsKKwkJCQlwcnRkLT5wY21faXJxX3BvcyksCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wb3J0W09VVF0uYnVmLT5kYXRhKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQorCQkJYnJlYWs7CisJCXByX2RlYnVnKCJmcmFtZSBzaXplPSVkLCBidWZmZXIgPSAweCVYXG4iLAorCQkJCXB0cm1lbVtSRUFERE9ORV9JRFhfU0laRV0sCisJCQkJcHRybWVtW1JFQURET05FX0lEWF9CVUZBRERfTFNXXSk7CisJCWlmIChwdHJtZW1bUkVBRERPTkVfSURYX1NJWkVdID4gQ09NUFJFX0NBUFRVUkVfTUFYX0ZSQU1FX1NJWkUpIHsKKwkJCXByX2VycigiRnJhbWUgbGVuZ3RoIGV4Y2VlZGVkIHRoZSBtYXggbGVuZ3RoIik7CisJCQlicmVhazsKKwkJfQorCQlidWYgPSBwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbT1VUXS5idWY7CisKKwkJcHJfZGVidWcoInBjbV9pcnFfcG9zPSVkLCBidWZbMF0ucGh5cyA9IDB4JXBLXG4iLAorCQkJCXBydGQtPnBjbV9pcnFfcG9zLCAmYnVmWzBdLnBoeXMpOworCQlyZWFkX3BhcmFtLmxlbiA9IHBydGQtPnBjbV9jb3VudCAtIENPTVBSRV9DQVBUVVJFX0hFQURFUl9TSVpFOworCQlyZWFkX3BhcmFtLnBhZGRyID0gYnVmWzBdLnBoeXMgKworCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKyBDT01QUkVfQ0FQVFVSRV9IRUFERVJfU0laRTsKKwkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NvdW50OworCisJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQorCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCisJCXE2YXNtX2FzeW5jX3JlYWQocHJ0ZC0+YXVkaW9fY2xpZW50LCAmcmVhZF9wYXJhbSk7CisJCWJyZWFrOworCX0KKwljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOiB7CisJCXN3aXRjaCAocGF5bG9hZFswXSkgeworCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI6IHsKKwkJCWlmIChzdWJzdHJlYW0tPnN0cmVhbQorCQkJCSE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWF0b21pY19yZWFkKCZwcnRkLT5wZW5kaW5nX2J1ZmZlcikpCisJCQkJYnJlYWs7CisJCQlwcl9kZWJ1ZygiJXM6IHdyaXRpbmcgJWQgYnl0ZXMgb2YgYnVmZmVyWyVkXSB0byBkc3BcbiIsCisJCQkJX19mdW5jX18sIHBydGQtPnBjbV9jb3VudCwgcHJ0ZC0+b3V0X2hlYWQpOworCQkJYnVmID0gcHJ0ZC0+YXVkaW9fY2xpZW50LT5wb3J0W0lOXS5idWY7CisJCQlwcl9kZWJ1ZygiJXM6IHdyaXRpbmcgYnVmZmVyWyVkXSBmcm9tIDB4JXBLIGhlYWQgJWQgY291bnQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBydGQtPm91dF9oZWFkLCAmYnVmWzBdLnBoeXMsCisJCQkJcHJ0ZC0+cGNtX2NvdW50LCBwcnRkLT5vdXRfaGVhZCk7CisJCQlpZiAocnVudGltZS0+dHN0YW1wX21vZGUgPT0gU05EUlZfUENNX1RTVEFNUF9FTkFCTEUpCisJCQkJdGltZV9zdGFtcF9mbGFnID0gU0VUX1RJTUVTVEFNUDsKKwkJCWVsc2UKKwkJCQl0aW1lX3N0YW1wX2ZsYWcgPSBOT19USU1FU1RBTVA7CisJCQltZW1jcHkoJm91dHB1dF9tZXRhX2RhdGEsIChjaGFyICopKGJ1Zi0+ZGF0YSArCisJCQkJcHJ0ZC0+b3V0X2hlYWQgKiBwcnRkLT5wY21fY291bnQpLAorCQkJCUNPTVBSRV9PVVRQVVRfTUVUQURBVEFfU0laRSk7CisJCQlidWZmZXJfbGVuZ3RoID0gb3V0cHV0X21ldGFfZGF0YS5mcmFtZV9zaXplOworCQkJcHJfZGVidWcoIm1ldGFfZGF0YV9sZW5ndGg6ICVkLCBmcmFtZV9sZW5ndGg6ICVkXG4iLAorCQkJCSBvdXRwdXRfbWV0YV9kYXRhLm1ldGFfZGF0YV9sZW5ndGgsCisJCQkJIG91dHB1dF9tZXRhX2RhdGEuZnJhbWVfc2l6ZSk7CisJCQlwcl9kZWJ1ZygidGltZXN0YW1wX21zdzogJWQsIHRpbWVzdGFtcF9sc3c6ICVkXG4iLAorCQkJCSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9tc3csCisJCQkJIG91dHB1dF9tZXRhX2RhdGEudGltZXN0YW1wX2xzdyk7CisJCQlwYXJhbS5wYWRkciA9IGJ1ZltwcnRkLT5vdXRfaGVhZF0ucGh5cworCQkJCQkrIG91dHB1dF9tZXRhX2RhdGEubWV0YV9kYXRhX2xlbmd0aDsKKwkJCXBhcmFtLmxlbiA9IGJ1ZmZlcl9sZW5ndGg7CisJCQlwYXJhbS5tc3dfdHMgPSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9tc3c7CisJCQlwYXJhbS5sc3dfdHMgPSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9sc3c7CisJCQlwYXJhbS5mbGFncyA9IHRpbWVfc3RhbXBfZmxhZzsKKwkJCXBhcmFtLnVpZCA9IHBydGQtPnNlc3Npb25faWQ7CisJCQlwYXJhbS5tZXRhZGF0YV9sZW4gPSBDT01QUkVfT1VUUFVUX01FVEFEQVRBX1NJWkU7CisJCQlpZiAocTZhc21fYXN5bmNfd3JpdGUocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkJJnBhcmFtKSA8IDApCisJCQkJcHJfZXJyKCIlczpxNmFzbV9hc3luY193cml0ZSBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWVsc2UKKwkJCQlwcnRkLT5vdXRfaGVhZCA9CisJCQkJCShwcnRkLT5vdXRfaGVhZCArIDEpCisJCQkJCSYgKHJ1bnRpbWUtPnBlcmlvZHMgLSAxKTsKKwkJCWF0b21pY19zZXQoJnBydGQtPnBlbmRpbmdfYnVmZmVyLCAwKTsKKwkJfQorCQkJYnJlYWs7CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfRkxVU0g6CisJCQlwcl9kZWJ1ZygiQVNNX1NUUkVBTV9DTURfRkxVU0hcbiIpOworCQkJcHJ0ZC0+Y21kX2FjayA9IDE7CisJCQl3YWtlX3VwKCZ0aGVfbG9ja3MuZmx1c2hfd2FpdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiTm90IFN1cHBvcnRlZCBFdmVudCBvcGNvZGVbMHgleF1cbiIsIG9wY29kZSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBtc21fY29tcHJfc2VuZF9kZHBfY2ZnKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQlzdHJ1Y3Qgc25kX2RlY19kZHAgKmRkcCkKK3sKKwlpbnQgaSwgcmM7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChkZHAtPnBhcmFtc19sZW5ndGggLyAyID4gU05EX0RFQ19ERFBfTUFYX1BBUkFNUykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG51bWJlciBvZiBwYXJhbXMgJXUsIG1heCBhbGxvd2VkICV1XG4iLAorCQkJX19mdW5jX18sIGRkcC0+cGFyYW1zX2xlbmd0aCAvIDIsCisJCQlTTkRfREVDX0REUF9NQVhfUEFSQU1TKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRkcC0+cGFyYW1zX2xlbmd0aC8yOyBpKyspIHsKKwkJcmMgPSBxNmFzbV9kczFfc2V0X2VuZHBfcGFyYW1zKGFjLCBkZHAtPnBhcmFtc19pZFtpXSwKKwkJCQkJCWRkcC0+cGFyYW1zX3ZhbHVlW2ldKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoInNlbmRpbmcgcGFyYW1zX2lkOiAlZCBmYWlsZWRcbiIsCisJCQkJZGRwLT5wYXJhbXNfaWRbaV0pOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGNvbXByX2F1ZGlvICpjb21wciA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gJmNvbXByLT5wcnRkOworCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zOworCXN0cnVjdCBhc21fYWFjX2NmZyBhYWNfY2ZnOworCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2OworCWludCByZXQ7CisKKwlzdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgc29mdHBhdXNlID0geworCQkuZW5hYmxlID0gU09GVF9QQVVTRV9FTkFCTEUsCisJCS5wZXJpb2QgPSBTT0ZUX1BBVVNFX1BFUklPRCwKKwkJLnN0ZXAgPSBTT0ZUX1BBVVNFX1NURVAsCisJCS5yYW1waW5nY3VydmUgPSBTT0ZUX1BBVVNFX0NVUlZFX0xJTkVBUiwKKwl9OworCXN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgc29mdHZvbCA9IHsKKwkJLnBlcmlvZCA9IFNPRlRfVk9MVU1FX1BFUklPRCwKKwkJLnN0ZXAgPSBTT0ZUX1ZPTFVNRV9TVEVQLAorCQkucmFtcGluZ2N1cnZlID0gU09GVF9WT0xVTUVfQ1VSVkVfTElORUFSLAorCX07CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCXBhcmFtcyA9ICZzb2NfcHJ0ZC0+ZHBjbVtzdWJzdHJlYW0tPnN0cmVhbV0uaHdfcGFyYW1zOworCWlmIChydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCisJCWJpdHNfcGVyX3NhbXBsZSA9IDI0OworCisJcmV0ID0gcTZhc21fb3Blbl93cml0ZV92MihwcnRkLT5hdWRpb19jbGllbnQsCisJCQljb21wci0+Y29kZWMsIGJpdHNfcGVyX3NhbXBsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogU2Vzc2lvbiBvdXQgb3BlbiBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKAorCQkJc29jX3BydGQtPmRhaV9saW5rLT5pZCwKKwkJCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAorCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwKKwkJCXN1YnN0cmVhbS0+c3RyZWFtKTsKKwkvKgorCSAqIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXJlIHJlcXVpcmVkIHRvIGNhbGwgdm9sdW1lIGFwaQorCSAqIGFjY29yaWRuZ2x5LiBTbywgZ2V0IGNoYW5uZWxzIGZyb20gaHcgcGFyYW1zCisJICovCisJaWYgKChwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSA+IDApICYmCisJCQkocGFyYW1zX3BlcmlvZHMocGFyYW1zKSA8PSBydW50aW1lLT5ody5jaGFubmVsc19tYXgpKQorCQlwcnRkLT5jaGFubmVsX21vZGUgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKworCXJldCA9IHE2YXNtX3NldF9zb2Z0cGF1c2UocHJ0ZC0+YXVkaW9fY2xpZW50LCAmc29mdHBhdXNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogU2VuZCBTb2Z0UGF1c2UgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwlyZXQgPSBxNmFzbV9zZXRfc29mdHZvbHVtZShwcnRkLT5hdWRpb19jbGllbnQsICZzb2Z0dm9sKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogU2VuZCBTb2Z0Vm9sdW1lIFBhcmFtIGZhaWxlZCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisKKwlyZXQgPSBxNmFzbV9zZXRfaW9fbW9kZShwcnRkLT5hdWRpb19jbGllbnQsCisJCQkoQ09NUFJFU1NFRF9JTyB8IEFTWU5DX0lPX01PREUpKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgSU8gbW9kZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJ0ZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisJLyogcmF0ZSBhbmQgY2hhbm5lbHMgYXJlIHNlbnQgdG8gYXVkaW8gZHJpdmVyICovCisJcHJ0ZC0+c2FtcF9yYXRlID0gcnVudGltZS0+cmF0ZTsKKwlwcnRkLT5jaGFubmVsX21vZGUgPSBydW50aW1lLT5jaGFubmVsczsKKwlwcnRkLT5vdXRfaGVhZCA9IDA7CisJYXRvbWljX3NldCgmcHJ0ZC0+b3V0X2NvdW50LCBydW50aW1lLT5wZXJpb2RzKTsKKworCWlmIChwcnRkLT5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY29tcHItPmluZm8uY29kZWNfcGFyYW0uY29kZWMuaWQpIHsKKwljYXNlIFNORF9BVURJT0NPREVDX01QMzoKKwkJLyogTm8gbWVkaWEgZm9ybWF0IGJsb2NrIGZvciBtcDMgKi8KKwkJYnJlYWs7CisJY2FzZSBTTkRfQVVESU9DT0RFQ19BQUM6CisJCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfQUFDXG4iLCBfX2Z1bmNfXyk7CisJCW1lbXNldCgmYWFjX2NmZywgMHgwLCBzaXplb2Yoc3RydWN0IGFzbV9hYWNfY2ZnKSk7CisJCWFhY19jZmcuYW90ID0gQUFDX0VOQ19NT0RFX0VBQUNfUDsKKwkJYWFjX2NmZy5mb3JtYXQgPSAweDAzOworCQlhYWNfY2ZnLmNoX2NmZyA9IHJ1bnRpbWUtPmNoYW5uZWxzOworCQlhYWNfY2ZnLnNhbXBsZV9yYXRlID0gIHJ1bnRpbWUtPnJhdGU7CisJCXJldCA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkmYWFjX2NmZyk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogQ01EIEZvcm1hdCBibG9jayBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfQVVESU9DT0RFQ19BQzM6IHsKKwkJc3RydWN0IHNuZF9kZWNfZGRwICpkZHAgPQorCQkJCSZjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5vcHRpb25zLmRkcDsKKwkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19BQzNcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gbXNtX2NvbXByX3NlbmRfZGRwX2NmZyhwcnRkLT5hdWRpb19jbGllbnQsIGRkcCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogRERQIENNRCBDRkcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKwljYXNlIFNORF9BVURJT0NPREVDX0VBQzM6IHsKKwkJc3RydWN0IHNuZF9kZWNfZGRwICpkZHAgPQorCQkJCSZjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5vcHRpb25zLmRkcDsKKwkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19FQUMzXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IG1zbV9jb21wcl9zZW5kX2RkcF9jZmcocHJ0ZC0+YXVkaW9fY2xpZW50LCBkZHApOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IEREUCBDTUQgQ0ZHIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJ0ZC0+ZW5hYmxlZCA9IDE7CisJcHJ0ZC0+Y21kX2FjayA9IDA7CisJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGNvbXByX2F1ZGlvICpjb21wciA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gJmNvbXByLT5wcnRkOworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtPVVRdLmJ1ZjsKKwlzdHJ1Y3Qgc25kX2NvZGVjICpjb2RlYyA9ICZjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gcmVhZF9wYXJhbTsKKwl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCXBydGQtPnBjbV9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOworCisJaWYgKHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSkKKwkJYml0c19wZXJfc2FtcGxlID0gMjQ7CisKKwlpZiAoIW1zbV9jb21wcl9jYXB0dXJlX2NvZGVjcygKKwkJCQljb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5pZCkpIHsKKwkJLyoKKwkJICogcmVxdWVzdCBjb2RlYyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQsCisJCSAqIHVzZSBkZWZhdWx0IGNvbXByZXNzIGZvcm1hdAorCQkgKi8KKwkJY29tcHItPmluZm8uY29kZWNfcGFyYW0uY29kZWMuaWQgPQorCQkJU05EX0FVRElPQ09ERUNfQU1SV0I7CisJfQorCXN3aXRjaCAoY29tcHItPmluZm8uY29kZWNfcGFyYW0uY29kZWMuaWQpIHsKKwljYXNlIFNORF9BVURJT0NPREVDX0FNUldCOgorCQlwcl9kZWJ1ZygicTZhc21fb3Blbl9yZWFkKEZPUk1BVF9BTVJXQilcbiIpOworCQlyZXQgPSBxNmFzbV9vcGVuX3JlYWQocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCUZPUk1BVF9BTVJXQik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBjb21wcmVzc2VkIFNlc3Npb24gb3V0IG9wZW4gZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlwcl9kZWJ1ZygibXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtXG4iKTsKKwkJbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKAorCQkJCXNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUsCisJCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygicTZhc21fb3Blbl9yZWFkX2NvbXByZXNzZWQoQ09NUFJFU1NFRF9NRVRBX0RBVEFfTU9ERSlcbiIpOworCQkvKgorCQkgKiByZXQgPSBxNmFzbV9vcGVuX3JlYWRfY29tcHJlc3NlZChwcnRkLT5hdWRpb19jbGllbnQsCisJCSAqIE1BWF9OVU1fRlJBTUVTX1BFUl9CVUZGRVIsCisJCSAqIENPTVBSRVNTRURfTUVUQV9EQVRBX01PREUpOworCQkgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb21wcmVzc2VkIFNlc3Npb24gb3V0IG9wZW4gZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gcTZhc21fc2V0X2lvX21vZGUocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkoQ09NUFJFU1NFRF9JTyB8IEFTWU5DX0lPX01PREUpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IFNldCBJTyBtb2RlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwlpZiAoIW1zbV9jb21wcl9jYXB0dXJlX2NvZGVjcyhjb2RlYy0+aWQpKSB7CisJCS8qCisJCSAqIHJlcXVlc3QgY29kZWMgaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLAorCQkgKiB1c2UgZGVmYXVsdCBjb21wcmVzcyBmb3JtYXQKKwkJICovCisJCWNvZGVjLT5pZCA9IFNORF9BVURJT0NPREVDX0FNUldCOworCX0KKwkvKiByYXRlIGFuZCBjaGFubmVscyBhcmUgc2VudCB0byBhdWRpbyBkcml2ZXIgKi8KKwlwcnRkLT5zYW1wX3JhdGUgPSBydW50aW1lLT5yYXRlOworCXBydGQtPmNoYW5uZWxfbW9kZSA9IHJ1bnRpbWUtPmNoYW5uZWxzOworCisJaWYgKHBydGQtPmVuYWJsZWQpCisJCXJldHVybiByZXQ7CisJcmVhZF9wYXJhbS5sZW4gPSBwcnRkLT5wY21fY291bnQ7CisKKwlzd2l0Y2ggKGNvZGVjLT5pZCkgeworCWNhc2UgU05EX0FVRElPQ09ERUNfQU1SV0I6CisJCXByX2RlYnVnKCJTTkRfQVVESU9DT0RFQ19BTVJXQlxuIik7CisJCXJldCA9IHE2YXNtX2VuY19jZmdfYmxrX2FtcndiKHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCU1BWF9OVU1fRlJBTUVTX1BFUl9CVUZGRVIsCisJCQkvKgorCQkJICogdXNlIGZpeGVkIGJhbmQgbW9kZSBhbmQgZHR4IG1vZGUKKwkJCSAqIGJhbmQgbW9kZSAtIDIzLjg1IGticHMKKwkJCSAqLworCQkJQU1SX1dCX0JBTkRfTU9ERSwKKwkJCS8qIGR0eCBtb2RlIC0gZGlzYWJsZSAqLworCQkJQU1SX1dCX0RUWF9NT0RFKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJObyBjb25maWcgZm9yIGNvZGVjICVkXG4iLCBjb2RlYy0+aWQpOworCX0KKwlwcl9kZWJ1ZygiJXM6IFNhbXBfcmF0ZSA9ICVkLCBDaGFubmVsID0gJWQsIHBjbV9zaXplID0gJWQsXG4iCisJCQkgInBjbV9jb3VudCA9ICVkLCBwZXJpb2RzID0gJWRcbiIsCisJCQkgX19mdW5jX18sIHBydGQtPnNhbXBfcmF0ZSwgcHJ0ZC0+Y2hhbm5lbF9tb2RlLAorCQkJIHBydGQtPnBjbV9zaXplLCBwcnRkLT5wY21fY291bnQsIHJ1bnRpbWUtPnBlcmlvZHMpOworCisJZm9yIChpID0gMDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgeworCQlyZWFkX3BhcmFtLnVpZCA9IGk7CisJCXN3aXRjaCAoY29kZWMtPmlkKSB7CisJCWNhc2UgU05EX0FVRElPQ09ERUNfQU1SV0I6CisJCQlyZWFkX3BhcmFtLmxlbiA9IHBydGQtPnBjbV9jb3VudAorCQkJCQktIENPTVBSRV9DQVBUVVJFX0hFQURFUl9TSVpFOworCQkJcmVhZF9wYXJhbS5wYWRkciA9IGJ1ZltpXS5waHlzCisJCQkJCSsgQ09NUFJFX0NBUFRVUkVfSEVBREVSX1NJWkU7CisJCQlwcl9kZWJ1ZygiUHVzaCBidWZmZXIgWyVkXSB0byBEU1AsIHBhZGRyOiAlcEssIHZhZGRyOiAlcEtcbiIsCisJCQkJCWksICZyZWFkX3BhcmFtLnBhZGRyLAorCQkJCQlidWZbaV0uZGF0YSk7CisJCQlxNmFzbV9hc3luY19yZWFkKHBydGQtPmF1ZGlvX2NsaWVudCwgJnJlYWRfcGFyYW0pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZWFkX3BhcmFtLnBhZGRyID0gYnVmW2ldLnBoeXM7CisJCQkvKiBxNmFzbV9hc3luY19yZWFkX2NvbXByZXNzZWQocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJICogJnJlYWRfcGFyYW0pOworCQkJICovCisJCQlwcl9kZWJ1ZygiJXM6IFRvIGFkZCBzdXBwb3J0IGZvciByZWFkIGNvbXByZXNzZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcnRkLT5wZXJpb2RzID0gcnVudGltZS0+cGVyaW9kczsKKworCXBydGQtPmVuYWJsZWQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjb21wcl9hdWRpbyAqY29tcHIgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9ICZjb21wci0+cHJ0ZDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOworCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJCWlmICghbXNtX2NvbXByX2NhcHR1cmVfY29kZWNzKAorCQkJCWNvbXByLT5pbmZvLmNvZGVjX3BhcmFtLmNvZGVjLmlkKSkgeworCQkJCS8qCisJCQkJICogcmVxdWVzdCBjb2RlYyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQsCisJCQkJICogdXNlIGRlZmF1bHQgY29tcHJlc3MgZm9ybWF0CisJCQkJICovCisJCQkJY29tcHItPmluZm8uY29kZWNfcGFyYW0uY29kZWMuaWQgPQorCQkJCVNORF9BVURJT0NPREVDX0FNUldCOworCQkJfQorCQkJc3dpdGNoIChjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5pZCkgeworCQkJY2FzZSBTTkRfQVVESU9DT0RFQ19BTVJXQjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbXNtX3BjbV9yb3V0aW5nX3JlZ19wc3Rocl9zdHJlYW0oCisJCQkJCXNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQkJCXBydGQtPnNlc3Npb25faWQsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhdG9taWNfc2V0KCZwcnRkLT5wZW5kaW5nX2J1ZmZlciwgMSk7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlwcl9kZWJ1ZygiJXM6IFRyaWdnZXIgc3RhcnRcbiIsIF9fZnVuY19fKTsKKwkJcTZhc21fcnVuX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOworCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcHJfZGVidWcoIlNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIpOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCQlzd2l0Y2ggKGNvbXByLT5pbmZvLmNvZGVjX3BhcmFtLmNvZGVjLmlkKSB7CisJCQljYXNlIFNORF9BVURJT0NPREVDX0FNUldCOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQltc21fcGNtX3JvdXRpbmdfcmVnX3BzdGhyX3N0cmVhbSgKKwkJCQkJc29jX3BydGQtPmRhaV9saW5rLT5pZCwKKwkJCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAwKTsKKwkJcnVudGltZS0+cmVuZGVyX2ZsYWcgJj0gflNORFJWX1JFTkRFUl9TVE9QUEVEOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfUEFVU0VcbiIpOworCQlxNmFzbV9jbWRfbm93YWl0KHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX1BBVVNFKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOworCQlydW50aW1lLT5yZW5kZXJfZmxhZyAmPSB+U05EUlZfUkVOREVSX1NUT1BQRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvcHVsYXRlX2NvZGVjX2xpc3Qoc3RydWN0IGNvbXByX2F1ZGlvICpjb21wciwKKwkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBNUDMgQmxvY2sgKi8KKwljb21wci0+aW5mby5jb21wcl9jYXAubnVtX2NvZGVjcyA9IDU7CisJY29tcHItPmluZm8uY29tcHJfY2FwLm1pbl9mcmFnbWVudF9zaXplID0gcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21pbjsKKwljb21wci0+aW5mby5jb21wcl9jYXAubWF4X2ZyYWdtZW50X3NpemUgPSBydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4OworCWNvbXByLT5pbmZvLmNvbXByX2NhcC5taW5fZnJhZ21lbnRzID0gcnVudGltZS0+aHcucGVyaW9kc19taW47CisJY29tcHItPmluZm8uY29tcHJfY2FwLm1heF9mcmFnbWVudHMgPSBydW50aW1lLT5ody5wZXJpb2RzX21heDsKKwljb21wci0+aW5mby5jb21wcl9jYXAuY29kZWNzWzBdID0gU05EX0FVRElPQ09ERUNfTVAzOworCWNvbXByLT5pbmZvLmNvbXByX2NhcC5jb2RlY3NbMV0gPSBTTkRfQVVESU9DT0RFQ19BQUM7CisJY29tcHItPmluZm8uY29tcHJfY2FwLmNvZGVjc1syXSA9IFNORF9BVURJT0NPREVDX0FDMzsKKwljb21wci0+aW5mby5jb21wcl9jYXAuY29kZWNzWzNdID0gU05EX0FVRElPQ09ERUNfRUFDMzsKKwljb21wci0+aW5mby5jb21wcl9jYXAuY29kZWNzWzRdID0gU05EX0FVRElPQ09ERUNfQU1SV0I7CisJLyogQWRkIG5ldyBjb2RlY3MgaGVyZSAqLworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGNvbXByX2F1ZGlvICpjb21wcjsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJY29tcHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29tcHJfYXVkaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29tcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1zbV9hdWRpb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcnRkID0gJmNvbXByLT5wcnRkOworCXBydGQtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5yZW5kZXJfZmxhZyA9IFNORFJWX0RNQV9NT0RFOworCXBydGQtPmF1ZGlvX2NsaWVudCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygKKwkJCQkoYXBwX2NiKWNvbXByX2V2ZW50X2hhbmRsZXIsIGNvbXByKTsKKwlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlwcl9pbmZvKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQlrZnJlZShwcnRkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSBmYWxzZTsKKwlwcl9pbmZvKCIlczogc2Vzc2lvbiBJRCAlZFxuIiwgX19mdW5jX18sIHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbik7CisKKwlwcnRkLT5zZXNzaW9uX2lkID0gcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcnVudGltZS0+aHcgPSBtc21fY29tcHJfaGFyZHdhcmVfcGxheWJhY2s7CisJCXBydGQtPmNtZF9hY2sgPSAxOworCX0gZWxzZSB7CisJCXJ1bnRpbWUtPmh3ID0gbXNtX2NvbXByX2hhcmR3YXJlX2NhcHR1cmU7CisJfQorCisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygic25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgZmFpbGVkXG4iKTsKKwkvKiBFbnN1cmUgdGhhdCBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHBlcmlvZCBzaXplICovCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApCisJCXByX2luZm8oInNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZFxuIik7CisKKwlwcnRkLT5kc3BfY250ID0gMDsKKwlhdG9taWNfc2V0KCZwcnRkLT5wZW5kaW5nX2J1ZmZlciwgMSk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNvbXByLT5jb2RlYyA9IEZPUk1BVF9NUDM7CisJcG9wdWxhdGVfY29kZWNfbGlzdChjb21wciwgcnVudGltZSk7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gY29tcHI7CisJYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wcmVzc2VkX3NldF92b2x1bWUoc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCwgdWludDMyX3Qgdm9sdW1lKQoreworCWludCByYyA9IDA7CisJaW50IGF2Z192b2wgPSAwOworCWludCBsZ2FpbiA9ICh2b2x1bWUgPj4gMTYpICYgMHhGRkZGOworCWludCByZ2FpbiA9IHZvbHVtZSAmIDB4RkZGRjsKKworCWlmIChwcnRkICYmIHBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlwcl9kZWJ1ZygiJXM6IGNoYW5uZWxzICVkIHZvbHVtZSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCXBydGQtPmNoYW5uZWxfbW9kZSwgdm9sdW1lKTsKKwkJaWYgKChwcnRkLT5jaGFubmVsX21vZGUgPT0gMikgJiYKKwkJCShsZ2FpbiAhPSByZ2FpbikpIHsKKwkJCXByX2RlYnVnKCIlczogY2FsbCBxNmFzbV9zZXRfbHJnYWluXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IHE2YXNtX3NldF9scmdhaW4ocHJ0ZC0+YXVkaW9fY2xpZW50LCBsZ2FpbiwgcmdhaW4pOworCQl9IGVsc2UgeworCQkJYXZnX3ZvbCA9IChsZ2FpbiArIHJnYWluKS8yOworCQkJcHJfZGVidWcoIiVzOiBjYWxsIHE2YXNtX3NldF92b2x1bWVcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gcTZhc21fc2V0X3ZvbHVtZShwcnRkLT5hdWRpb19jbGllbnQsIGF2Z192b2wpOworCQl9CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IFNlbmQgVm9sdW1lIGNvbW1hbmQgZmFpbGVkIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjb21wcl9hdWRpbyAqY29tcHIgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9ICZjb21wci0+cHJ0ZDsKKwlpbnQgZGlyID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJZGlyID0gSU47CisJYXRvbWljX3NldCgmcHJ0ZC0+cGVuZGluZ19idWZmZXIsIDApOworCisJcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOworCXE2YXNtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9DTE9TRSk7CisJcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoZGlyLAorCQkJCXBydGQtPmF1ZGlvX2NsaWVudCk7CisJCW1zbV9wY21fcm91dGluZ19kZXJlZ19waHlfc3RyZWFtKAorCQkJc29jX3BydGQtPmRhaV9saW5rLT5pZCwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKHBydGQtPmF1ZGlvX2NsaWVudCk7CisJa2ZyZWUocHJ0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NvbXByX2NhcHR1cmVfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29tcHJfYXVkaW8gKmNvbXByID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSAmY29tcHItPnBydGQ7CisJaW50IGRpciA9IE9VVDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWF0b21pY19zZXQoJnBydGQtPnBlbmRpbmdfYnVmZmVyLCAwKTsKKwlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfQ0xPU0UpOworCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQpOworCW1zbV9wY21fcm91dGluZ19kZXJlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShwcnRkLT5hdWRpb19jbGllbnQpOworCWtmcmVlKHBydGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fY29tcHJfcGxheWJhY2tfY2xvc2Uoc3Vic3RyZWFtKTsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldCA9IG1zbV9jb21wcl9jYXB0dXJlX2Nsb3NlKHN1YnN0cmVhbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fY29tcHJfcGxheWJhY2tfcHJlcGFyZShzdWJzdHJlYW0pOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX2NvbXByX2NhcHR1cmVfcHJlcGFyZShzdWJzdHJlYW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fY29tcHJfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGNvbXByX2F1ZGlvICpjb21wciA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gJmNvbXByLT5wcnRkOworCisJaWYgKHBydGQtPnBjbV9pcnFfcG9zID49IHBydGQtPnBjbV9zaXplKQorCQlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHBjbV9pcnFfcG9zID0gJWQsIHBjbV9zaXplID0gJWQsIHNhbXBsZV9iaXRzID0gJWQsXG4iCisJCQkgImZyYW1lX2JpdHMgPSAlZFxuIiwgX19mdW5jX18sIHBydGQtPnBjbV9pcnFfcG9zLAorCQkJIHBydGQtPnBjbV9zaXplLCBydW50aW1lLT5zYW1wbGVfYml0cywKKwkJCSBydW50aW1lLT5mcmFtZV9iaXRzKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChwcnRkLT5wY21faXJxX3BvcykpOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICphcGQgPSBhYy0+cG9ydDsKKwlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKKwlpbnQgZGlyID0gLTE7CisKKwlwcnRkLT5tbWFwX2ZsYWcgPSAxOworCXJ1bnRpbWUtPnJlbmRlcl9mbGFnID0gU05EUlZfTk9OX0RNQV9NT0RFOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlkaXIgPSBJTjsKKwllbHNlCisJCWRpciA9IE9VVDsKKwlhYiA9ICYoYXBkW2Rpcl0uYnVmWzBdKTsKKworCXJldHVybiBtc21fYXVkaW9faW9uX21tYXAoYWIsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NvbXByX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBjb21wcl9hdWRpbyAqY29tcHIgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9ICZjb21wci0+cHJ0ZDsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYV9idWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1ZjsKKwlpbnQgZGlyLCByZXQ7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZGlyID0gSU47CisJZWxzZQorCQlkaXIgPSBPVVQ7CisJLyogTW9kaWZ5aW5nIGtlcm5lbCBoYXJkd2FyZSBwYXJhbXMgYmFzZWQgb24gdXNlcnNwYWNlIGNvbmZpZyAqLworCWlmIChwYXJhbXNfcGVyaW9kcyhwYXJhbXMpID4gMCAmJgorCQkocGFyYW1zX3BlcmlvZHMocGFyYW1zKSAhPSBydW50aW1lLT5ody5wZXJpb2RzX21heCkpIHsKKwkJcnVudGltZS0+aHcucGVyaW9kc19tYXggPSBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpOworCX0KKwlpZiAocGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpID4gMCAmJgorCQkocGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpICE9IHJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19taW4pKSB7CisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19taW4gPSBwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyk7CisJfQorCXJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXggPQorCQkJcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21pbiAqIHJ1bnRpbWUtPmh3LnBlcmlvZHNfbWF4OworCXByX2RlYnVnKCJhbGxvY2F0ZSAlemQgYnVmZmVycyBlYWNoIG9mIHNpemUgJWRcbiIsCisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19taW4sCisJCXJ1bnRpbWUtPmh3LnBlcmlvZHNfbWF4KTsKKwlyZXQgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXMoZGlyLAorCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21pbiwKKwkJCXJ1bnRpbWUtPmh3LnBlcmlvZHNfbWF4KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0OiBCdWZmZXIgQWxsb2NhdGlvbiBmYWlsZWQgcmMgPSAlZFxuIiwKKwkJCQkJCXJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWYgPSBwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbZGlyXS5idWY7CisKKwlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKwlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWRtYV9idWYtPmFyZWEgPSBidWZbMF0uZGF0YTsKKwlkbWFfYnVmLT5hZGRyID0gIGJ1ZlswXS5waHlzOworCWRtYV9idWYtPmJ5dGVzID0gcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heDsKKworCXByX2RlYnVnKCIlczogYnVmWyVwS11kbWFfYnVmLT5hcmVhWyVwS11kbWFfYnVmLT5hZGRyWyVwS11cbiIKKwkJICJkbWFfYnVmLT5ieXRlc1slemRdXG4iLCBfX2Z1bmNfXywKKwkJICh2b2lkICopYnVmLCAodm9pZCAqKWRtYV9idWYtPmFyZWEsCisJCSAmZG1hX2J1Zi0+YWRkciwgZG1hX2J1Zi0+Ynl0ZXMpOworCWlmICghZG1hX2J1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9pb2N0bF9zaGFyZWQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGNvbXByX2F1ZGlvICpjb21wciA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gJmNvbXByLT5wcnRkOworCXVpbnQ2NF90IHRpbWVzdGFtcDsKKwl1aW50NjRfdCB0ZW1wOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0NPTVBSRVNTX1RTVEFNUDogeworCQlzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcCAqdHN0YW1wOworCisJCXByX2RlYnVnKCJTTkRSVl9DT01QUkVTU19UU1RBTVBcbiIpOworCQl0c3RhbXAgPSBhcmc7CisJCW1lbXNldCh0c3RhbXAsIDB4MCwgc2l6ZW9mKCp0c3RhbXApKTsKKwkJcmMgPSBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgJnRpbWVzdGFtcCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IEdldCBTZXNzaW9uIFRpbWUgcmV0dXJuIHZhbHVlID0lbGxkXG4iLAorCQkJCV9fZnVuY19fLCB0aW1lc3RhbXApOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJdGVtcCA9ICh0aW1lc3RhbXAgKiAyICogcnVudGltZS0+Y2hhbm5lbHMpOworCQl0ZW1wID0gdGVtcCAqIChydW50aW1lLT5yYXRlLzEwMDApOworCQl0ZW1wID0gZGl2X3U2NCh0ZW1wLCAxMDAwKTsKKwkJdHN0YW1wLT5zYW1wbGluZ19yYXRlID0gcnVudGltZS0+cmF0ZTsKKwkJdHN0YW1wLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCXByX2RlYnVnKCIlczogYnl0ZXNfY29uc3VtZWQ6LHRpbWVzdGFtcCA9ICVsbGQsXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQl0c3RhbXAtPnRpbWVzdGFtcCk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFNORFJWX0NPTVBSRVNTX0dFVF9DQVBTOiB7CisJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwczsKKworCQljYXBzID0gYXJnOworCQltZW1zZXQoY2FwcywgMCwgc2l6ZW9mKCpjYXBzKSk7CisJCXByX2RlYnVnKCJTTkRSVl9DT01QUkVTU19HRVRfQ0FQU1xuIik7CisJCW1lbWNweShjYXBzLCAmY29tcHItPmluZm8uY29tcHJfY2FwLCBzaXplb2YoKmNhcHMpKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgU05EUlZfQ09NUFJFU1NfU0VUX1BBUkFNUzoKKwkJcHJfZGVidWcoIlNORFJWX0NPTVBSRVNTX1NFVF9QQVJBTVM6XG4iKTsKKwkJbWVtY3B5KCZjb21wci0+aW5mby5jb2RlY19wYXJhbSwgKHZvaWQgKikgYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfcGFyYW1zKSk7CisJCXN3aXRjaCAoY29tcHItPmluZm8uY29kZWNfcGFyYW0uY29kZWMuaWQpIHsKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6CisJCQkvKiBGb3IgTVAzIHdlIGRvbnQgbmVlZCBhbnkgb3RoZXIgcGFyYW1ldGVyICovCisJCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfTVAzXG4iKTsKKwkJCWNvbXByLT5jb2RlYyA9IEZPUk1BVF9NUDM7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19BQUM6CisJCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfQUFDXG4iKTsKKwkJCWNvbXByLT5jb2RlYyA9IEZPUk1BVF9NUEVHNF9BQUM7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19BQzM6IHsKKwkJCWNoYXIgcGFyYW1zX3ZhbHVlW01BWF9BQzNfUEFSQU1fU0laRV07CisJCQlpbnQgKnBhcmFtc192YWx1ZV9kYXRhID0gKGludCAqKXBhcmFtc192YWx1ZTsKKwkJCS8qIDM2IGlzIHRoZSBtYXggcGFyYW0gbGVuZ3RoIGZvciBkZHAgKi8KKwkJCWludCBpOworCQkJc3RydWN0IHNuZF9kZWNfZGRwICpkZHAgPQorCQkJCSZjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5vcHRpb25zLmRkcDsKKwkJCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAwOworCisJCQltZW1zZXQocGFyYW1zX3ZhbHVlLCAwLCBNQVhfQUMzX1BBUkFNX1NJWkUpOworCQkJLyogY2hlY2sgaW50ZWdlciBvdmVyZmxvdyAqLworCQkJaWYgKGRkcC0+cGFyYW1zX2xlbmd0aCA+IFVJTlRfTUFYL3NpemVvZihpbnQpKSB7CisJCQkJcHJfZXJyKCIlczogSW50ZWdlciBvdmVyZmxvdyBkZHAtPnBhcmFtc19sZW5ndGggJWRcbiIsCisJCQkJX19mdW5jX18sIGRkcC0+cGFyYW1zX2xlbmd0aCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwYXJhbXNfbGVuZ3RoID0gZGRwLT5wYXJhbXNfbGVuZ3RoKnNpemVvZihpbnQpOworCQkJaWYgKHBhcmFtc19sZW5ndGggPiBNQVhfQUMzX1BBUkFNX1NJWkUpIHsKKwkJCQkvKk1BWCBpcyAzNipzaXplb2YoaW50KSB0aGlzIHNob3VsZCBub3QgaGFwcGVuKi8KKwkJCQlwcl9lcnIoIiVzOiBwYXJhbXNfbGVuZ3RoKCVkKSBpcyBncmVhdGVyIHRoYW4gJXpkXG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoLCBNQVhfQUMzX1BBUkFNX1NJWkUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX0FDM1xuIik7CisJCQljb21wci0+Y29kZWMgPSBGT1JNQVRfQUMzOworCQkJcHJfZGVidWcoInBhcmFtc19sZW5ndGg6ICVkXG4iLCBkZHAtPnBhcmFtc19sZW5ndGgpOworCQkJZm9yIChpID0gMDsgaSA8IHBhcmFtc19sZW5ndGgvc2l6ZW9mKGludCk7IGkrKykKKwkJCQlwcl9kZWJ1ZygicGFyYW1zX3ZhbHVlWyVkXTogJXhcbiIsIGksCisJCQkJCXBhcmFtc192YWx1ZV9kYXRhW2ldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBkZHAtPnBhcmFtc19sZW5ndGgvMjsgaSsrKSB7CisJCQkJZGRwLT5wYXJhbXNfaWRbaV0gPSBwYXJhbXNfdmFsdWVfZGF0YVsyKmldOworCQkJCWRkcC0+cGFyYW1zX3ZhbHVlW2ldID0gcGFyYW1zX3ZhbHVlX2RhdGFbMippKzFdOworCQkJfQorCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKKwkJCQlyYyA9IG1zbV9jb21wcl9zZW5kX2RkcF9jZmcocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkJCQlkZHApOworCQkJCWlmIChyYyA8IDApCisJCQkJCXByX2VycigiJXM6IEREUCBDTUQgQ0ZHIGZhaWxlZFxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU05EX0FVRElPQ09ERUNfRUFDMzogeworCQkJY2hhciBwYXJhbXNfdmFsdWVbTUFYX0FDM19QQVJBTV9TSVpFXTsKKwkJCWludCAqcGFyYW1zX3ZhbHVlX2RhdGEgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCQkJLyogMzYgaXMgdGhlIG1heCBwYXJhbSBsZW5ndGggZm9yIGRkcCAqLworCQkJaW50IGk7CisJCQlzdHJ1Y3Qgc25kX2RlY19kZHAgKmRkcCA9CisJCQkJJmNvbXByLT5pbmZvLmNvZGVjX3BhcmFtLmNvZGVjLm9wdGlvbnMuZGRwOworCQkJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IDA7CisKKwkJCW1lbXNldChwYXJhbXNfdmFsdWUsIDAsIE1BWF9BQzNfUEFSQU1fU0laRSk7CisJCQkvKiBjaGVjayBpbnRlZ2VyIG92ZXJmbG93ICovCisJCQlpZiAoZGRwLT5wYXJhbXNfbGVuZ3RoID4gVUlOVF9NQVgvc2l6ZW9mKGludCkpIHsKKwkJCQlwcl9lcnIoIiVzOiBJbnRlZ2VyIG92ZXJmbG93IGRkcC0+cGFyYW1zX2xlbmd0aCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGRwLT5wYXJhbXNfbGVuZ3RoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXBhcmFtc19sZW5ndGggPSBkZHAtPnBhcmFtc19sZW5ndGgqc2l6ZW9mKGludCk7CisJCQlpZiAocGFyYW1zX2xlbmd0aCA+IE1BWF9BQzNfUEFSQU1fU0laRSkgeworCQkJCS8qTUFYIGlzIDM2KnNpemVvZihpbnQpIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4qLworCQkJCXByX2VycigiJXM6IHBhcmFtc19sZW5ndGgoJWQpIGlzIGdyZWF0ZXIgdGhhbiAlemRcbiIsCisJCQkJX19mdW5jX18sIHBhcmFtc19sZW5ndGgsIE1BWF9BQzNfUEFSQU1fU0laRSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfRUFDM1xuIik7CisJCQljb21wci0+Y29kZWMgPSBGT1JNQVRfRUFDMzsKKwkJCXByX2RlYnVnKCJwYXJhbXNfbGVuZ3RoOiAlZFxuIiwgZGRwLT5wYXJhbXNfbGVuZ3RoKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBkZHAtPnBhcmFtc19sZW5ndGg7IGkrKykKKwkJCQlwcl9kZWJ1ZygicGFyYW1zX3ZhbHVlWyVkXTogJXhcbiIsIGksCisJCQkJCXBhcmFtc192YWx1ZV9kYXRhW2ldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBkZHAtPnBhcmFtc19sZW5ndGgvMjsgaSsrKSB7CisJCQkJZGRwLT5wYXJhbXNfaWRbaV0gPSBwYXJhbXNfdmFsdWVfZGF0YVsyKmldOworCQkJCWRkcC0+cGFyYW1zX3ZhbHVlW2ldID0gcGFyYW1zX3ZhbHVlX2RhdGFbMippKzFdOworCQkJfQorCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKKwkJCQlyYyA9IG1zbV9jb21wcl9zZW5kX2RkcF9jZmcocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkJCQlkZHApOworCQkJCWlmIChyYyA8IDApCisJCQkJCXByX2VycigiJXM6IEREUCBDTUQgQ0ZHIGZhaWxlZFxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlwcl9kZWJ1ZygiRk9STUFUX0xJTkVBUl9QQ01cbiIpOworCQkJY29tcHItPmNvZGVjID0gRk9STUFUX0xJTkVBUl9QQ007CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFNORFJWX1BDTV9JT0NUTDFfUkVTRVQ6CisJCXByX2RlYnVnKCJTTkRSVl9QQ01fSU9DVEwxX1JFU0VUXG4iKTsKKwkJLyogRmx1c2ggb25seSB3aGVuIHNlc3Npb24gaXMgc3RhcnRlZCBkdXJpbmcgQ0FQVFVSRSwKKwkJICogd2hpbGUgUExBWUJBQ0sgaGFzIG5vIHN1Y2ggcmVzdHJpY3Rpb24uCisJCSAqLworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyB8fAorCQkJICAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFICYmCisJCQkJCQlhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lb3MpKSB7CisJCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDE7CisJCQkJd2FrZV91cCgmdGhlX2xvY2tzLmVvc193YWl0KTsKKwkJCQlhdG9taWNfc2V0KCZwcnRkLT5lb3MsIDApOworCQkJfQorCisJCQkvKiBBIHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIHBvc3NpYmxlIHdpdGggRkxVU0gKKwkJCSAqIERSQUlOIGlmIGFjayBpcyBzZXQgYnkgZmx1c2ggYW5kIHJlc2V0IGJ5IGRyYWluCisJCQkgKi8KKwkJCXBydGQtPmNtZF9hY2sgPSAwOworCQkJcmMgPSBxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfRkxVU0gpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6IGZsdXNoIGNtZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhlX2xvY2tzLmZsdXNoX3dhaXQsCisJCQkJcHJ0ZC0+Y21kX2FjaywgNSAqIEhaKTsKKwkJCWlmICghcmMpCisJCQkJcHJfZXJyKCJGbHVzaCBjbWQgdGltZW91dFxuIik7CisJCQlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DT01QUkVTU19EUkFJTjoKKwkJcHJfZGVidWcoIiVzOiBTTkRSVl9DT01QUkVTU19EUkFJTlxuIiwgX19mdW5jX18pOworCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnBlbmRpbmdfYnVmZmVyKSkgeworCQkJcHJfZGVidWcoIiVzOiBubyBwZW5kaW5nIHdyaXRlcywgZHJhaW4gd291bGQgYmxvY2tcbiIsCisJCQkgX19mdW5jX18pOworCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJfQorCisJCWF0b21pY19zZXQoJnBydGQtPmVvcywgMSk7CisJCWF0b21pY19zZXQoJnBydGQtPnBlbmRpbmdfYnVmZmVyLCAwKTsKKwkJcHJ0ZC0+Y21kX2FjayA9IDA7CisJCXE2YXNtX2NtZF9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfRU9TKTsKKwkJLyogV2FpdCBpbmRlZmluaXRlbHkgZm9yICBEUkFJTi4gRmx1c2ggY2FuIGFsc28gc2lnbmFsIHRoaXMqLworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGVfbG9ja3MuZW9zX3dhaXQsCisJCQkocHJ0ZC0+Y21kX2FjayB8fCBwcnRkLT5jbWRfaW50ZXJydXB0KSk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiRU9TIGNtZCBpbnRlcnJ1cHRlZFxuIik7CisJCXByX2RlYnVnKCIlczogU05EUlZfQ09NUFJFU1NfRFJBSU4gIG91dCBvZiB3YWl0XG4iLCBfX2Z1bmNfXyk7CisKKwkJaWYgKHBydGQtPmNtZF9pbnRlcnJ1cHQpCisJCQlyYyA9IC1FSU5UUjsKKworCQlwcnRkLT5jbWRfaW50ZXJydXB0ID0gMDsKKwkJcmV0dXJuIHJjOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc25kX3BjbV9saWJfaW9jdGwoc3Vic3RyZWFtLCBjbWQsIGFyZyk7Cit9CisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IHNuZF9lbmNfd21hMzIgeworCXUzMiBzdXBlcl9ibG9ja19hbGlnbjsgLyogV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLworCXUzMiBlbmNvZGVvcHQxOworCXUzMiBlbmNvZGVvcHQyOworfTsKKworc3RydWN0IHNuZF9lbmNfdm9yYmlzMzIgeworCXMzMiBxdWFsaXR5OworCXUzMiBtYW5hZ2VkOworCXUzMiBtYXhfYml0X3JhdGU7CisJdTMyIG1pbl9iaXRfcmF0ZTsKKwl1MzIgZG93bm1peDsKK307CisKK3N0cnVjdCBzbmRfZW5jX3JlYWwzMiB7CisJdTMyIHF1YW50X2JpdHM7CisJdTMyIHN0YXJ0X3JlZ2lvbjsKKwl1MzIgbnVtX3JlZ2lvbnM7Cit9OworCitzdHJ1Y3Qgc25kX2VuY19mbGFjMzIgeworCXUzMiBudW07CisJdTMyIGdhaW47Cit9OworCitzdHJ1Y3Qgc25kX2VuY19nZW5lcmljMzIgeworCXUzMiBidzsJLyogZW5jb2RlciBiYW5kd2lkdGggKi8KKwlzMzIgcmVzZXJ2ZWRbMTVdOworfTsKK3N0cnVjdCBzbmRfZGVjX2RkcDMyIHsKKwl1MzIgcGFyYW1zX2xlbmd0aDsKKwl1MzIgcGFyYW1zX2lkWzE4XTsKKwl1MzIgcGFyYW1zX3ZhbHVlWzE4XTsKK307CisKK3VuaW9uIHNuZF9jb2RlY19vcHRpb25zMzIgeworCXN0cnVjdCBzbmRfZW5jX3dtYTMyIHdtYTsKKwlzdHJ1Y3Qgc25kX2VuY192b3JiaXMzMiB2b3JiaXM7CisJc3RydWN0IHNuZF9lbmNfcmVhbDMyIHJlYWw7CisJc3RydWN0IHNuZF9lbmNfZmxhYzMyIGZsYWM7CisJc3RydWN0IHNuZF9lbmNfZ2VuZXJpYzMyIGdlbmVyaWM7CisJc3RydWN0IHNuZF9kZWNfZGRwMzIgZGRwOworfTsKKworc3RydWN0IHNuZF9jb2RlYzMyIHsKKwl1MzIgaWQ7CisJdTMyIGNoX2luOworCXUzMiBjaF9vdXQ7CisJdTMyIHNhbXBsZV9yYXRlOworCXUzMiBiaXRfcmF0ZTsKKwl1MzIgcmF0ZV9jb250cm9sOworCXUzMiBwcm9maWxlOworCXUzMiBsZXZlbDsKKwl1MzIgY2hfbW9kZTsKKwl1MzIgZm9ybWF0OworCXUzMiBhbGlnbjsKKwl1bmlvbiBzbmRfY29kZWNfb3B0aW9uczMyIG9wdGlvbnM7CisJdTMyIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IHNuZF9jb21wcmVzc2VkX2J1ZmZlcjMyIHsKKwl1MzIgZnJhZ21lbnRfc2l6ZTsKKwl1MzIgZnJhZ21lbnRzOworfTsKKworc3RydWN0IHNuZF9jb21wcl9wYXJhbXMzMiB7CisJc3RydWN0IHNuZF9jb21wcmVzc2VkX2J1ZmZlcjMyIGJ1ZmZlcjsKKwlzdHJ1Y3Qgc25kX2NvZGVjMzIgY29kZWM7CisJdTggbm9fd2FrZV9tb2RlOworfTsKKworc3RydWN0IHNuZF9jb21wcl9jYXBzMzIgeworCXUzMiBudW1fY29kZWNzOworCXUzMiBkaXJlY3Rpb247CisJdTMyIG1pbl9mcmFnbWVudF9zaXplOworCXUzMiBtYXhfZnJhZ21lbnRfc2l6ZTsKKwl1MzIgbWluX2ZyYWdtZW50czsKKwl1MzIgbWF4X2ZyYWdtZW50czsKKwl1MzIgY29kZWNzW01BWF9OVU1fQ09ERUNTXTsKKwl1MzIgcmVzZXJ2ZWRbMTFdOworfTsKK3N0cnVjdCBzbmRfY29tcHJfdHN0YW1wMzIgeworCXUzMiBieXRlX29mZnNldDsKKwl1MzIgY29waWVkX3RvdGFsOworCWNvbXBhdF91bG9uZ190IHBjbV9mcmFtZXM7CisJY29tcGF0X3Vsb25nX3QgcGNtX2lvX2ZyYW1lczsKKwl1MzIgc2FtcGxpbmdfcmF0ZTsKKwljb21wYXRfdTY0IHRpbWVzdGFtcDsKK307CitlbnVtIHsKKwlTTkRSVl9DT01QUkVTU19UU1RBTVAzMiA9IF9JT1IoJ0MnLCAweDIwLCBzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcDMyKSwKKwlTTkRSVl9DT01QUkVTU19HRVRfQ0FQUzMyID0gX0lPV1IoJ0MnLCAweDEwLCBzdHJ1Y3Qgc25kX2NvbXByX2NhcHMzMiksCisJU05EUlZfQ09NUFJFU1NfU0VUX1BBUkFNUzMyID0KKwlfSU9XKCdDJywgMHgxMiwgc3RydWN0IHNuZF9jb21wcl9wYXJhbXMzMiksCit9Oworc3RhdGljIGludCBtc21fY29tcHJfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfQ09NUFJFU1NfVFNUQU1QMzI6IHsKKwkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgdHN0YW1wOworCQlzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcDMyIHRzdGFtcDMyOworCisJCW1lbXNldCgmdHN0YW1wLCAwLCBzaXplb2YodHN0YW1wKSk7CisJCW1lbXNldCgmdHN0YW1wMzIsIDAsIHNpemVvZih0c3RhbXAzMikpOworCQljbWQgPSBTTkRSVl9DT01QUkVTU19UU1RBTVA7CisJCWVyciA9IG1zbV9jb21wcl9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsICZ0c3RhbXApOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBDT01QUkVTU19UU1RBTVAgZmFpbGVkIHJjICVkXG4iLAorCQkJX19mdW5jX18sIGVycik7CisJCQlnb3RvIGJhaWxfb3V0OworCQl9CisJCXRzdGFtcDMyLmJ5dGVfb2Zmc2V0ID0gdHN0YW1wLmJ5dGVfb2Zmc2V0OworCQl0c3RhbXAzMi5jb3BpZWRfdG90YWwgPSB0c3RhbXAuY29waWVkX3RvdGFsOworCQl0c3RhbXAzMi5wY21fZnJhbWVzID0gdHN0YW1wLnBjbV9mcmFtZXM7CisJCXRzdGFtcDMyLnBjbV9pb19mcmFtZXMgPSB0c3RhbXAucGNtX2lvX2ZyYW1lczsKKwkJdHN0YW1wMzIuc2FtcGxpbmdfcmF0ZSA9IHRzdGFtcC5zYW1wbGluZ19yYXRlOworCQl0c3RhbXAzMi50aW1lc3RhbXAgPSB0c3RhbXAudGltZXN0YW1wOworCQlpZiAoY29weV90b191c2VyKGFyZywgJnRzdGFtcDMyLCBzaXplb2YodHN0YW1wMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weXRvdXNlciBmYWlsZWQgQ09NUFJFU1NfVFNUQU1QMzJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQllcnIgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0NPTVBSRVNTX0dFVF9DQVBTMzI6IHsKKwkJc3RydWN0IHNuZF9jb21wcl9jYXBzIGNhcHM7CisJCXN0cnVjdCBzbmRfY29tcHJfY2FwczMyIGNhcHMzMjsKKwkJdTMyIGk7CisKKwkJbWVtc2V0KCZjYXBzLCAwLCBzaXplb2YoY2FwcykpOworCQltZW1zZXQoJmNhcHMzMiwgMCwgc2l6ZW9mKGNhcHMzMikpOworCQljbWQgPSBTTkRSVl9DT01QUkVTU19HRVRfQ0FQUzsKKwkJZXJyID0gbXNtX2NvbXByX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgJmNhcHMpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBHRVRfQ0FQUyBmYWlsZWQgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyKTsKKwkJCWdvdG8gYmFpbF9vdXQ7CisJCX0KKwkJcHJfZGVidWcoIlNORFJWX0NPTVBSRVNTX0dFVF9DQVBTXzMyXG4iKTsKKwkJaWYgKCFlcnIgJiYgY2Fwcy5udW1fY29kZWNzID49IE1BWF9OVU1fQ09ERUNTKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG51bWJlciBvZiBjb2RlY3NcbiIsIF9fZnVuY19fKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGJhaWxfb3V0OworCQl9CisJCWNhcHMzMi5kaXJlY3Rpb24gPSBjYXBzLmRpcmVjdGlvbjsKKwkJY2FwczMyLm1heF9mcmFnbWVudF9zaXplID0gY2Fwcy5tYXhfZnJhZ21lbnRfc2l6ZTsKKwkJY2FwczMyLm1heF9mcmFnbWVudHMgPSBjYXBzLm1heF9mcmFnbWVudHM7CisJCWNhcHMzMi5taW5fZnJhZ21lbnRfc2l6ZSA9IGNhcHMubWluX2ZyYWdtZW50X3NpemU7CisJCWNhcHMzMi5udW1fY29kZWNzID0gY2Fwcy5udW1fY29kZWNzOworCQlmb3IgKGkgPSAwOyBpIDwgY2Fwcy5udW1fY29kZWNzOyBpKyspCisJCQljYXBzMzIuY29kZWNzW2ldID0gY2Fwcy5jb2RlY3NbaV07CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2FwczMyLCBzaXplb2YoY2FwczMyKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHl0b3VzZXIgZmFpbGVkIENPTVBSRVNTX0dFVENBUFMzMlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfQ09NUFJFU1NfU0VUX1BBUkFNUzMyOiB7CisJCXN0cnVjdCBzbmRfY29tcHJfcGFyYW1zMzIgcGFyYW1zMzI7CisJCXN0cnVjdCBzbmRfY29tcHJfcGFyYW1zIHBhcmFtczsKKworCQltZW1zZXQoJnBhcmFtczMyLCAwLCBzaXplb2YocGFyYW1zMzIpKTsKKwkJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKwkJY21kID0gU05EUlZfQ09NUFJFU1NfU0VUX1BBUkFNUzsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJhbXMzMiwgYXJnLCBzaXplb2YocGFyYW1zMzIpKSkgeworCQkJcHJfZXJyKCIlczogY29weWZyb211c2VyIGZhaWxlZCBTRVRfUEFSQU1TMzJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBiYWlsX291dDsKKwkJfQorCQlwYXJhbXMubm9fd2FrZV9tb2RlID0gcGFyYW1zMzIubm9fd2FrZV9tb2RlOworCQlwYXJhbXMuY29kZWMuaWQgPSBwYXJhbXMzMi5jb2RlYy5pZDsKKwkJcGFyYW1zLmNvZGVjLmNoX2luID0gcGFyYW1zMzIuY29kZWMuY2hfaW47CisJCXBhcmFtcy5jb2RlYy5jaF9vdXQgPSBwYXJhbXMzMi5jb2RlYy5jaF9vdXQ7CisJCXBhcmFtcy5jb2RlYy5zYW1wbGVfcmF0ZSA9IHBhcmFtczMyLmNvZGVjLnNhbXBsZV9yYXRlOworCQlwYXJhbXMuY29kZWMuYml0X3JhdGUgPSBwYXJhbXMzMi5jb2RlYy5iaXRfcmF0ZTsKKwkJcGFyYW1zLmNvZGVjLnJhdGVfY29udHJvbCA9IHBhcmFtczMyLmNvZGVjLnJhdGVfY29udHJvbDsKKwkJcGFyYW1zLmNvZGVjLnByb2ZpbGUgPSBwYXJhbXMzMi5jb2RlYy5wcm9maWxlOworCQlwYXJhbXMuY29kZWMubGV2ZWwgPSBwYXJhbXMzMi5jb2RlYy5sZXZlbDsKKwkJcGFyYW1zLmNvZGVjLmNoX21vZGUgPSBwYXJhbXMzMi5jb2RlYy5jaF9tb2RlOworCQlwYXJhbXMuY29kZWMuZm9ybWF0ID0gcGFyYW1zMzIuY29kZWMuZm9ybWF0OworCQlwYXJhbXMuY29kZWMuYWxpZ24gPSBwYXJhbXMzMi5jb2RlYy5hbGlnbjsKKworCQlzd2l0Y2ggKHBhcmFtcy5jb2RlYy5pZCkgeworCQljYXNlIFNORF9BVURJT0NPREVDX1dNQToKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19XTUFfUFJPOgorCQkJcGFyYW1zLmNvZGVjLm9wdGlvbnMud21hLmVuY29kZW9wdDEgPQorCQkJcGFyYW1zMzIuY29kZWMub3B0aW9ucy53bWEuZW5jb2Rlb3B0MTsKKwkJCXBhcmFtcy5jb2RlYy5vcHRpb25zLndtYS5lbmNvZGVvcHQyID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMud21hLmVuY29kZW9wdDI7CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy53bWEuc3VwZXJfYmxvY2tfYWxpZ24gPQorCQkJcGFyYW1zMzIuY29kZWMub3B0aW9ucy53bWEuc3VwZXJfYmxvY2tfYWxpZ247CisJCWJyZWFrOworCQljYXNlIFNORF9BVURJT0NPREVDX1ZPUkJJUzoKKwkJCXBhcmFtcy5jb2RlYy5vcHRpb25zLnZvcmJpcy5kb3dubWl4ID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMudm9yYmlzLmRvd25taXg7CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy52b3JiaXMubWFuYWdlZCA9CisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLnZvcmJpcy5tYW5hZ2VkOworCQkJcGFyYW1zLmNvZGVjLm9wdGlvbnMudm9yYmlzLm1heF9iaXRfcmF0ZSA9CisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLnZvcmJpcy5tYXhfYml0X3JhdGU7CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy52b3JiaXMubWluX2JpdF9yYXRlID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMudm9yYmlzLm1pbl9iaXRfcmF0ZTsKKwkJCXBhcmFtcy5jb2RlYy5vcHRpb25zLnZvcmJpcy5xdWFsaXR5ID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMudm9yYmlzLnF1YWxpdHk7CisJCWJyZWFrOworCQljYXNlIFNORF9BVURJT0NPREVDX1JFQUw6CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy5yZWFsLm51bV9yZWdpb25zID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMucmVhbC5udW1fcmVnaW9uczsKKwkJCXBhcmFtcy5jb2RlYy5vcHRpb25zLnJlYWwucXVhbnRfYml0cyA9CisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLnJlYWwucXVhbnRfYml0czsKKwkJCXBhcmFtcy5jb2RlYy5vcHRpb25zLnJlYWwuc3RhcnRfcmVnaW9uID0KKwkJCXBhcmFtczMyLmNvZGVjLm9wdGlvbnMucmVhbC5zdGFydF9yZWdpb247CisJCWJyZWFrOworCQljYXNlIFNORF9BVURJT0NPREVDX0ZMQUM6CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy5mbGFjLmdhaW4gPQorCQkJcGFyYW1zMzIuY29kZWMub3B0aW9ucy5mbGFjLmdhaW47CisJCQlwYXJhbXMuY29kZWMub3B0aW9ucy5mbGFjLm51bSA9CisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLmZsYWMubnVtOworCQlicmVhazsKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19EVFM6CisJCWNhc2UgU05EX0FVRElPQ09ERUNfRFRTX1BBU1NfVEhST1VHSDoKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19EVFNfTEJSOgorCQljYXNlIFNORF9BVURJT0NPREVDX0RUU19MQlJfUEFTU19USFJPVUdIOgorCQljYXNlIFNORF9BVURJT0NPREVDX0RUU19UUkFOU0NPREVfTE9PUEJBQ0s6CisJCWJyZWFrOworCQljYXNlIFNORF9BVURJT0NPREVDX0FDMzoKKwkJY2FzZSBTTkRfQVVESU9DT0RFQ19FQUMzOgorCQkJcGFyYW1zLmNvZGVjLm9wdGlvbnMuZGRwLnBhcmFtc19sZW5ndGggPQorCQkJcGFyYW1zMzIuY29kZWMub3B0aW9ucy5kZHAucGFyYW1zX2xlbmd0aDsKKwkJCW1lbWNweShwYXJhbXMuY29kZWMub3B0aW9ucy5kZHAucGFyYW1zX3ZhbHVlLAorCQkJcGFyYW1zMzIuY29kZWMub3B0aW9ucy5kZHAucGFyYW1zX3ZhbHVlLAorCQkJc2l6ZW9mKHBhcmFtczMyLmNvZGVjLm9wdGlvbnMuZGRwLnBhcmFtc192YWx1ZSkpOworCQkJbWVtY3B5KHBhcmFtcy5jb2RlYy5vcHRpb25zLmRkcC5wYXJhbXNfaWQsCisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLmRkcC5wYXJhbXNfaWQsCisJCQlzaXplb2YocGFyYW1zMzIuY29kZWMub3B0aW9ucy5kZHAucGFyYW1zX2lkKSk7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFyYW1zLmNvZGVjLm9wdGlvbnMuZ2VuZXJpYy5idyA9CisJCQlwYXJhbXMzMi5jb2RlYy5vcHRpb25zLmdlbmVyaWMuYnc7CisJCWJyZWFrOworCQl9CisJCWlmICghZXJyKQorCQkJZXJyID0gbXNtX2NvbXByX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgJnBhcmFtcyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQllcnIgPSBtc21fY29tcHJfaW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOworCX0KK2JhaWxfb3V0OgorCXJldHVybiBlcnI7CisKK30KKyNlbmRpZgorc3RhdGljIGludCBtc21fY29tcHJfaW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICghc3Vic3RyZWFtKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXMgY2FsbGVkIHdpdGggY21kID0gJWRcbiIsIF9fZnVuY19fLCBjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9DT01QUkVTU19UU1RBTVA6IHsKKwkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgdHN0YW1wOworCisJCWlmICghYXJnKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBUc3RhbXBcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVyciA9IG1zbV9jb21wcl9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsICZ0c3RhbXApOworCQlpZiAoZXJyKQorCQkJcHJfZXJyKCIlczogQ09NUFJFU1NfVFNUQU1QIGZhaWxlZCByYyAlZFxuIiwKKwkJCV9fZnVuY19fLCBlcnIpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdHN0YW1wLCBzaXplb2YodHN0YW1wKSkpIHsKKwkJCXByX2VycigiJXM6IGNvcHl0b3VzZXIgZmFpbGVkIENPTVBSRVNTX1RTVEFNUFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfQ09NUFJFU1NfR0VUX0NBUFM6IHsKKwkJc3RydWN0IHNuZF9jb21wcl9jYXBzIGNhcDsKKworCQlpZiAoIWFyZykgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgZ2V0Y2Fwc1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHJfZGVidWcoIlNORFJWX0NPTVBSRVNTX0dFVF9DQVBTXG4iKTsKKwkJZXJyID0gbXNtX2NvbXByX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgJmNhcCk7CisJCWlmIChlcnIpCisJCQlwcl9lcnIoIiVzOiBHRVRfQ0FQUyBmYWlsZWQgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyKTsKKwkJaWYgKCFlcnIgJiYgY29weV90b191c2VyKGFyZywgJmNhcCwgc2l6ZW9mKGNhcCkpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5dG91c2VyIGZhaWxlZCBHRVRfQ0FQU1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfQ09NUFJFU1NfU0VUX1BBUkFNUzogeworCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyBwYXJhbXM7CisKKwkJaWYgKCFhcmcpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIHNldHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmFtcywgYXJnLAorCQkJc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfcGFyYW1zKSkpIHsKKwkJCXByX2VycigiJXM6IFNFVF9QQVJBTVNcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWVyciA9IG1zbV9jb21wcl9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsICZwYXJhbXMpOworCQlpZiAoZXJyKQorCQkJcHJfZXJyKCIlczogU0VUX1BBUkFNUyBmYWlsZWQgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IG1zbV9jb21wcl9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsIGFyZyk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NvbXByX3Jlc3RhcnQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgY29tcHJfYXVkaW8gKmNvbXByID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSAmY29tcHItPnBydGQ7CisJc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWYgPSBOVUxMOworCXN0cnVjdCBvdXRwdXRfbWV0YV9kYXRhX3N0IG91dHB1dF9tZXRhX2RhdGE7CisJaW50IHRpbWVfc3RhbXBfZmxhZyA9IDA7CisJaW50IGJ1ZmZlcl9sZW5ndGggPSAwOworCisJcHJfZGVidWcoIiVzLCB0cmlnZ2VyIHJlc3RhcnRcbiIsIF9fZnVuY19fKTsKKworCWlmIChydW50aW1lLT5yZW5kZXJfZmxhZyAmIFNORFJWX1JFTkRFUl9TVE9QUEVEKSB7CisJCWJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtJTl0uYnVmOworCQlwcl9kZWJ1ZygiJXM6d3JpdGluZyAlZCBieXRlcyBvZiBidWZmZXJbJWRdIHRvIGRzcCAyXG4iLAorCQkJCV9fZnVuY19fLCBwcnRkLT5wY21fY291bnQsIHBydGQtPm91dF9oZWFkKTsKKwkJcHJfZGVidWcoIiVzOndyaXRpbmcgYnVmZmVyWyVkXSBmcm9tIDB4JTA4eFxuIiwKKwkJCQlfX2Z1bmNfXywgcHJ0ZC0+b3V0X2hlYWQsCisJCQkJKCh1bnNpZ25lZCBpbnQpYnVmWzBdLnBoeXMKKwkJCQkrIChwcnRkLT5vdXRfaGVhZCAqIHBydGQtPnBjbV9jb3VudCkpKTsKKworCQlpZiAocnVudGltZS0+dHN0YW1wX21vZGUgPT0gU05EUlZfUENNX1RTVEFNUF9FTkFCTEUpCisJCQl0aW1lX3N0YW1wX2ZsYWcgPSBTRVRfVElNRVNUQU1QOworCQllbHNlCisJCQl0aW1lX3N0YW1wX2ZsYWcgPSBOT19USU1FU1RBTVA7CisJCW1lbWNweSgmb3V0cHV0X21ldGFfZGF0YSwgKGNoYXIgKikoYnVmLT5kYXRhICsKKwkJCXBydGQtPm91dF9oZWFkICogcHJ0ZC0+cGNtX2NvdW50KSwKKwkJCUNPTVBSRV9PVVRQVVRfTUVUQURBVEFfU0laRSk7CisKKwkJYnVmZmVyX2xlbmd0aCA9IG91dHB1dF9tZXRhX2RhdGEuZnJhbWVfc2l6ZTsKKwkJcHJfZGVidWcoIm1ldGFfZGF0YV9sZW5ndGg6ICVkLCBmcmFtZV9sZW5ndGg6ICVkXG4iLAorCQkJIG91dHB1dF9tZXRhX2RhdGEubWV0YV9kYXRhX2xlbmd0aCwKKwkJCSBvdXRwdXRfbWV0YV9kYXRhLmZyYW1lX3NpemUpOworCQlwcl9kZWJ1ZygidGltZXN0YW1wX21zdzogJWQsIHRpbWVzdGFtcF9sc3c6ICVkXG4iLAorCQkJIG91dHB1dF9tZXRhX2RhdGEudGltZXN0YW1wX21zdywKKwkJCSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9sc3cpOworCisJCXBhcmFtLnBhZGRyID0gKHVuc2lnbmVkIGxvbmcpYnVmWzBdLnBoeXMKKwkJCQkrIChwcnRkLT5vdXRfaGVhZCAqIHBydGQtPnBjbV9jb3VudCkKKwkJCQkrIG91dHB1dF9tZXRhX2RhdGEubWV0YV9kYXRhX2xlbmd0aDsKKwkJcGFyYW0ubGVuID0gYnVmZmVyX2xlbmd0aDsKKwkJcGFyYW0ubXN3X3RzID0gb3V0cHV0X21ldGFfZGF0YS50aW1lc3RhbXBfbXN3OworCQlwYXJhbS5sc3dfdHMgPSBvdXRwdXRfbWV0YV9kYXRhLnRpbWVzdGFtcF9sc3c7CisJCXBhcmFtLmZsYWdzID0gdGltZV9zdGFtcF9mbGFnOworCQlwYXJhbS51aWQgPSBwcnRkLT5zZXNzaW9uX2lkOworCQlpZiAocTZhc21fYXN5bmNfd3JpdGUocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkmcGFyYW0pIDwgMCkKKwkJCXByX2VycigiJXM6cTZhc21fYXN5bmNfd3JpdGUgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJZWxzZQorCQkJcHJ0ZC0+b3V0X2hlYWQgPQorCQkJCShwcnRkLT5vdXRfaGVhZCArIDEpICYgKHJ1bnRpbWUtPnBlcmlvZHMgLSAxKTsKKworCQlydW50aW1lLT5yZW5kZXJfZmxhZyAmPSB+U05EUlZfUkVOREVSX1NUT1BQRUQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNuZF9wY21fdm9sdW1lICp2b2wgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQorCQkJIHZvbC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOworCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdm9sdW1lIDogJXhcbiIsIF9fZnVuY19fLCB2b2x1bWUpOworCWlmICghc3Vic3RyZWFtKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7CisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcnRkKQorCQlyYyA9IGNvbXByZXNzZWRfc2V0X3ZvbHVtZShwcnRkLCB2b2x1bWUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl92b2x1bWVfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkJCSB2b2wtPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWlmICghc3Vic3RyZWFtKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7CisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcnRkKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHBydGQtPnZvbHVtZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sdW1lX2luZm87CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKworCWRldl9kYmcocnRkLT5kZXYsICIlcywgVm9sdW1lIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOworCXJldCA9IHNuZF9wY21fYWRkX3ZvbHVtZV9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCQkgICAgICBOVUxMLCAxLCBydGQtPmRhaV9saW5rLT5pZCwKKwkJCQkgICAgICAmdm9sdW1lX2luZm8pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWtjdGwgPSB2b2x1bWVfaW5mby0+a2N0bDsKKwlrY3RsLT5wdXQgPSBtc21fY29tcHJfdm9sdW1lX2N0bF9wdXQ7CisJa2N0bC0+Z2V0ID0gbXNtX2NvbXByX3ZvbHVtZV9jdGxfZ2V0OworCWtjdGwtPnRsdi5wID0gY29tcHJfcnhfdm9sX2dhaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX2NvbXByX29wcyA9IHsKKwkub3BlbgkgICA9IG1zbV9jb21wcl9vcGVuLAorCS5od19wYXJhbXMJPSBtc21fY29tcHJfaHdfcGFyYW1zLAorCS5jbG9zZQkgID0gbXNtX2NvbXByX2Nsb3NlLAorCS5pb2N0bAkgID0gbXNtX2NvbXByX2lvY3RsLAorCS5wcmVwYXJlCT0gbXNtX2NvbXByX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBtc21fY29tcHJfdHJpZ2dlciwKKwkucG9pbnRlcgk9IG1zbV9jb21wcl9wb2ludGVyLAorCS5tbWFwCQk9IG1zbV9jb21wcl9tbWFwLAorCS5yZXN0YXJ0CT0gbXNtX2NvbXByX3Jlc3RhcnQsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgICA9IG1zbV9jb21wcl9jb21wYXRfaW9jdGwsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJcmV0ID0gbXNtX2NvbXByX2FkZF9jb250cm9scyhydGQpOworCWlmIChyZXQpCisJCXByX2VycigiJXMsIGtjdGwgYWRkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZtc21fY29tcHJfb3BzLAorCS5wY21fbmV3CT0gbXNtX2Fzb2NfcGNtX25ldywKK307CisKK3N0YXRpYyBpbnQgbXNtX2NvbXByX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IGRldiBuYW1lICVzXG4iLAorCQkJIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAorCQkJCSAgICZtc21fc29jX3BsYXRmb3JtKTsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fY29tcHJfZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tY29tcHItZHNwIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fY29tcHJfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY29tcHJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1jb21wci1kc3AiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2NvbXByX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX2NvbXByX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fY29tcHJfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2xvY2tzLmVuYWJsZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3MuZW9zX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9sb2Nrcy53cml0ZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3MucmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3MuZmx1c2hfd2FpdCk7CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY29tcHJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2NvbXByX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDTSBtb2R1bGUgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWNvbXByLXE2LXYyLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWNvbXByLXE2LXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlM2VjNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tY29tcHItcTYtdjIuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX01TTV9DT01QUl9ICisjZGVmaW5lIF9NU01fQ09NUFJfSAorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3NfcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3Nfb2ZmbG9hZC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorCisjaW5jbHVkZSAibXNtLXBjbS1xNi12Mi5oIgorCitzdHJ1Y3QgY29tcHJfaW5mbyB7CisJc3RydWN0IHNuZF9jb21wcl9jYXBzIGNvbXByX2NhcDsKKwlzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgY29kZWNfY2FwczsKKwlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyBjb2RlY19wYXJhbTsKK307CisKK3N0cnVjdCBjb21wcl9hdWRpbyB7CisJc3RydWN0IG1zbV9hdWRpbyBwcnRkOworCXN0cnVjdCBjb21wcl9pbmZvIGluZm87CisJdWludDMyX3QgY29kZWM7Cit9OworCisjZW5kaWYgLypfTVNNX0NPTVBSX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wcmVzcy1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wcmVzcy1xNi12Mi5jCmluZGV4IDFjZWIwMDYuLjllYTY5YWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tY29tcHJlc3MtcTYtdjIuYworKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWNvbXByZXNzLXE2LXYyLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC01NSw2ICs1NSwxMCBAQAogI2RlZmluZSBEU1BfTlVNX09VVFBVVF9GUkFNRV9CVUZGRVJFRAkyCiAjZGVmaW5lIEZMQUNfQkxLX1NJWkVfTElNSVQJCTY1NTM1CiAKKy8qIFRpbWVzdGFtcCBtb2RlIHBheWxvYWQgb2Zmc2V0cyAqLworI2RlZmluZSBUU19MU1dfT0ZGU0VUCQkJNgorI2RlZmluZSBUU19NU1dfT0ZGU0VUCQkJNworCiAvKiBkZWNvZGVyIHBhcmFtZXRlciBsZW5ndGggKi8KICNkZWZpbmUgRERQX0RFQ19NQVhfTlVNX1BBUkFNCQkxOAogCkBAIC02OCwxMiArNzIsNiBAQAogY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1zbV9jb21wcl92b2xfZ2FpbiwgMCwKIAkJCQlDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFMpOwogCi0vKgotICogTFNCIDggYml0cyBpcyB1c2VkIGFzIHN0cmVhbSBpZCBmb3Igc29tZSBEU1AKLSAqIGNvbW1hbmRzIGZvciBjb21wcmVzc2VkIHBsYXliYWNrLgotICovCi0jZGVmaW5lIFNUUkVBTV9JRF9GUk9NX1RPS0VOKGkpIChpICYgMHhGRikKLQogLyogU3RyZWFtIGlkIHN3aXRjaGVzIGJldHdlZW4gMSBhbmQgMiAqLwogI2RlZmluZSBORVhUX1NUUkVBTV9JRChzdHJlYW1faWQpICgoc3RyZWFtX2lkICYgMSkgKyAxKQogCkBAIC0xMDIsNyArMTAwLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7CiAJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwKLQk4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwCisJODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzUyODAwLCAzODQwMDAsIDI4MjI0MDAsIDU2NDQ4MDAKIH07CiAKIHN0cnVjdCBtc21fY29tcHJfcGRhdGEgewpAQCAtMTEwLDYgKzEwOCw3IEBACiAJdWludDMyX3Qgdm9sdW1lW01TTV9GUk9OVEVORF9EQUlfTUFYXVsyXTsgLyogRm9yIGJvdGggTCAmIFIgKi8KIAlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHNbTVNNX0ZST05URU5EX0RBSV9NQVhdOwogCWJvb2wgdXNlX2RzcF9nYXBsZXNzX21vZGU7CisJYm9vbCB1c2VfbGVnYWN5X2FwaTsgLyogaW5kaWNhdGVzIHVzZSBvbGRlciBhc20gYXBpcyovCiAJc3RydWN0IG1zbV9jb21wcl9kZWNfcGFyYW1zICpkZWNfcGFyYW1zW01TTV9GUk9OVEVORF9EQUlfTUFYXTsKIAlzdHJ1Y3QgbXNtX2NvbXByX2NoX21hcCAqY2hfbWFwW01TTV9GUk9OVEVORF9EQUlfTUFYXTsKIH07CkBAIC0xMzIsNiArMTMxLDEzIEBACiAJdWludDY0X3QgYnl0ZXNfcmVjZWl2ZWQ7IC8qIGZyb20gdXNlcnNwYWNlICovCiAJdWludDY0X3QgYnl0ZXNfc2VudDsgLyogdG8gRFNQICovCiAKKwl1aW50NjRfdCByZWNlaXZlZF90b3RhbDsgLyogYnl0ZXMgcmVjZWl2ZWQgZnJvbSBEU1AgKi8KKwl1aW50NjRfdCBieXRlc19jb3BpZWQ7IC8qIHRvIHVzZXJzcGFjZSAqLworCXVpbnQ2NF90IGJ5dGVzX3JlYWQ7IC8qIGZyb20gRFNQICovCisJdWludDMyX3QgYnl0ZXNfcmVhZF9vZmZzZXQ7IC8qIGJ5dGVzIHJlYWQgb2Zmc2V0ICovCisKKwl1aW50MzJfdCB0c19oZWFkZXJfb2Zmc2V0OyAvKiBob2xkcyB0aGUgdGltZXN0YW1wIGhlYWRlciBvZmZzZXQgKi8KKwogCWludDMyX3QgZmlyc3RfYnVmZmVyOwogCWludDMyX3QgbGFzdF9idWZmZXI7CiAJaW50MzJfdCBwYXJ0aWFsX2RyYWluX2RlbGF5OwpAQCAtMTc0LDcgKzE4MCw5IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotY29uc3QgdTMyIGNvbXByX2NvZGVjc1tdID0ge1NORF9BVURJT0NPREVDX0FDMywgU05EX0FVRElPQ09ERUNfRUFDM307Citjb25zdCB1MzIgY29tcHJfY29kZWNzW10gPSB7CisJU05EX0FVRElPQ09ERUNfQUMzLCBTTkRfQVVESU9DT0RFQ19FQUMzLCBTTkRfQVVESU9DT0RFQ19EVFMsCisJU05EX0FVRElPQ09ERUNfRFNEfTsKIAogc3RydWN0IHF1ZXJ5X2F1ZGlvX2VmZmVjdCB7CiAJdWludDMyX3QgbW9kX2lkOwpAQCAtMjExLDcgKzIxOSw3IEBACiAJCQkJdWludDMyX3Qgdm9sdW1lX2wsIHVpbnQzMl90IHZvbHVtZV9yKQogewogCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQ7Ci0JaW50IHJjID0gMCwgaTsKKwlpbnQgcmMgPSAwOwogCXVpbnQzMl90IGF2Z192b2wsIGdhaW5fbGlzdFtWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFNdOwogCXVpbnQzMl90IG51bV9jaGFubmVsczsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwpAQCAtMjQwLDggKzI0OCw4IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQl1c2VfZGVmYXVsdCA9ICEocGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5iZV9pZF0tPnNldF9jaF9tYXApOwotCWNobWFwID0gcGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5iZV9pZF0tPmNoYW5uZWxfbWFwOworCXVzZV9kZWZhdWx0ID0gIShwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmlkXS0+c2V0X2NoX21hcCk7CisJY2htYXAgPSBwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmlkXS0+Y2hhbm5lbF9tYXA7CiAJbnVtX2NoYW5uZWxzID0gcHJ0ZC0+bnVtX2NoYW5uZWxzOwogCiAJaWYgKHBydGQtPm51bV9jaGFubmVscyA+IDIpIHsKQEAgLTI1NSw5ICsyNjMsNyBAQAogCQkgKgogCQkgKi8KIAkJYXZnX3ZvbCA9ICh2b2x1bWVfbCArIHZvbHVtZV9yKSAvIDI7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcnRkLT5udW1fY2hhbm5lbHM7IGkrKykKLQkJCWdhaW5fbGlzdFtpXSA9IGF2Z192b2w7Ci0KKwkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgYXZnX3ZvbCk7CiAJfSBlbHNlIHsKIAkJZ2Fpbl9saXN0WzBdID0gdm9sdW1lX2w7CiAJCWdhaW5fbGlzdFsxXSA9IHZvbHVtZV9yOwpAQCAtMjY3LDExICsyNzMsMTAgQEAKIAkJCW51bV9jaGFubmVscyA9IDM7CiAJCQl1c2VfZGVmYXVsdCA9IHRydWU7CiAJCX0KKwkJcmMgPSBxNmFzbV9zZXRfbXVsdGljaF9nYWluKHBydGQtPmF1ZGlvX2NsaWVudCwgbnVtX2NoYW5uZWxzLAorCQkJCQlnYWluX2xpc3QsIGNobWFwLCB1c2VfZGVmYXVsdCk7CiAJfQogCi0JcmMgPSBxNmFzbV9zZXRfbXVsdGljaF9nYWluKHBydGQtPmF1ZGlvX2NsaWVudCwgbnVtX2NoYW5uZWxzLAotCQkJCSAgICBnYWluX2xpc3QsIGNobWFwLCB1c2VfZGVmYXVsdCk7Ci0KIAlpZiAocmMgPCAwKQogCQlwcl9lcnIoIiVzOiBTZW5kIHZvbCBnYWluIGNvbW1hbmQgZmFpbGVkIHJjPSVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHJjKTsKQEAgLTM3MCw2ICszNzUsNTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtc21fY29tcHJfcmVhZF9idWZmZXIoc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCkKK3sKKwlpbnQgYnVmZmVyX2xlbmd0aDsKKwl1aW50NjRfdCBieXRlc19hdmFpbGFibGU7CisJdWludDY0X3QgYnVmZmVyX3NlbnQ7CisJc3RydWN0IGF1ZGlvX2Fpb19yZWFkX3BhcmFtIHBhcmFtOworCWludCByZXQ7CisKKwlpZiAoIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKKwkJcHJfZXJyKCIlczogc3RyZWFtIGlzIG5vdCBpbiBzdGFydGVkIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1ZmZlcl9sZW5ndGggPSBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRfc2l6ZSAtCisJCQkJCQkgcHJ0ZC0+dHNfaGVhZGVyX29mZnNldDsKKwlieXRlc19hdmFpbGFibGUgPSBwcnRkLT5yZWNlaXZlZF90b3RhbCAtIHBydGQtPmJ5dGVzX2NvcGllZDsKKwlidWZmZXJfc2VudCA9IHBydGQtPmJ5dGVzX3JlYWQgLSBwcnRkLT5ieXRlc19jb3BpZWQ7CisJaWYgKGJ1ZmZlcl9zZW50ICsgYnVmZmVyX2xlbmd0aCArIHBydGQtPnRzX2hlYWRlcl9vZmZzZXQKKwkJCQkJCT4gcHJ0ZC0+YnVmZmVyX3NpemUpIHsKKwkJcHJfZGVidWcoIiAlcyA6IEJ1ZmZlciBpcyBGdWxsIGJ5dGVzX2F2YWlsYWJsZTogJWxsdVxuIiwKKwkJCQlfX2Z1bmNfXywgYnl0ZXNfYXZhaWxhYmxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KCZwYXJhbSwgMHgwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2Fpb19yZWFkX3BhcmFtKSk7CisJcGFyYW0ucGFkZHIgPSBwcnRkLT5idWZmZXJfcGFkZHIgKyBwcnRkLT5ieXRlc19yZWFkX29mZnNldCArCisJCQkJCQlwcnRkLT50c19oZWFkZXJfb2Zmc2V0OworCXBhcmFtLmxlbiA9IGJ1ZmZlcl9sZW5ndGg7CisJcGFyYW0udWlkID0gYnVmZmVyX2xlbmd0aDsKKwlwYXJhbS5mbGFncyA9IHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmZsYWdzOworCisJcHJfZGVidWcoIiVzOiByZWFkaW5nICVkIGJ5dGVzIGZyb20gRFNQIGJ5dGVfb2Zmc2V0ID0gJWxsdVxuIiwKKwkJCV9fZnVuY19fLCBidWZmZXJfbGVuZ3RoLCBwcnRkLT5ieXRlc19yZWFkKTsKKwlyZXQgPSBxNmFzbV9hc3luY19yZWFkKHBydGQtPmF1ZGlvX2NsaWVudCwgJnBhcmFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBxNmFzbV9hc3luY19yZWFkIGZhaWxlZCAtICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXBydGQtPmJ5dGVzX3JlYWQgKz0gYnVmZmVyX2xlbmd0aDsKKwlwcnRkLT5ieXRlc19yZWFkX29mZnNldCArPSBidWZmZXJfbGVuZ3RoOworCWlmIChwcnRkLT5ieXRlc19yZWFkX29mZnNldCA+PSBwcnRkLT5idWZmZXJfc2l6ZSkKKwkJcHJ0ZC0+Ynl0ZXNfcmVhZF9vZmZzZXQgLT0gcHJ0ZC0+YnVmZmVyX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgY29tcHJfZXZlbnRfaGFuZGxlcih1aW50MzJfdCBvcGNvZGUsCiAJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKIHsKQEAgLTM4Miw2ICs0MzQsOCBAQAogCWludCBzdHJlYW1faWQ7CiAJdWludDMyX3Qgc3RyZWFtX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDY0X3QgcmVhZF9zaXplOworCXVpbnQzMl90ICpidWZmX2FkZHI7CiAKIAlpZiAoIXBydGQpIHsKIAkJcHJfZXJyKCIlczogcHJ0ZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CkBAIC0zOTAsNiArNDQ0LDEyIEBACiAJY3N0cmVhbSA9IHBydGQtPmNzdHJlYW07CiAJYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CiAKKwkvKgorCSAqIFRva2VuIGZvciByZXN0IG9mIHRoZSBjb21wcmVzc2VkIGNvbW1hbmRzIHVzZSB0byBzZXQKKwkgKiBzZXNzaW9uIGlkLCBzdHJlYW0gaWQsIGRpciBldGMuCisJICovCisJc3RyZWFtX2lkID0gcTZhc21fZ2V0X3N0cmVhbV9pZF9mcm9tX3Rva2VuKHRva2VuKTsKKwogCXByX2RlYnVnKCIlcyBvcGNvZGUgPSUwOHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOwogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyOgpAQCAtNDE3LDYgKzQ3NywxMiBAQAogCQkJCSBwcnRkLT5ieXRlX29mZnNldCwgdG9rZW4pOwogCQl9CiAKKwkJLyoKKwkJICogVG9rZW4gZm9yIFdSSVRFIGNvbW1hbmQgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGRhdGEKKwkJICogd3JpdHRlbiB0byBBRFNQIGluIHRoZSBsYXN0IHdyaXRlLCB1cGRhdGUgb2Zmc2V0IGFuZAorCQkgKiB0b3RhbCBjb3BpZWQgZGF0YSBhY2NvcmRpbmdseS4KKwkJICovCisKIAkJcHJ0ZC0+Ynl0ZV9vZmZzZXQgKz0gdG9rZW47CiAJCXBydGQtPmNvcGllZF90b3RhbCArPSB0b2tlbjsKIAkJaWYgKHBydGQtPmJ5dGVfb2Zmc2V0ID49IHBydGQtPmJ1ZmZlcl9zaXplKQpAQCAtNDU1LDExICs1MjEsNTMgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7CiAJCWJyZWFrOworCisJY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisKKwkJcHJfZGVidWcoIkFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMiBvZmZzZXQgJWQsIGxlbmd0aCAlZFxuIiwKKwkJCQkgcHJ0ZC0+Ynl0ZV9vZmZzZXQsIHBheWxvYWRbNF0pOworCisJCWlmIChwcnRkLT50c19oZWFkZXJfb2Zmc2V0KSB7CisJCQkvKiBVcGRhdGUgdGhlIGhlYWRlciBmb3IgcmVjZWl2ZWQgYnVmZmVyICovCisJCQlidWZmX2FkZHIgPSBwcnRkLT5idWZmZXIgKyBwcnRkLT5ieXRlX29mZnNldDsKKwkJCS8qIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLworCQkJKmJ1ZmZfYWRkciA9IHBydGQtPmNvZGVjX3BhcmFtLmJ1ZmZlci5mcmFnbWVudF9zaXplCisJCQkJCQkgLSBwcnRkLT50c19oZWFkZXJfb2Zmc2V0OworCQkJYnVmZl9hZGRyKys7CisJCQkvKiBXcml0ZSB0aGUgb2Zmc2V0ICovCisJCQkqYnVmZl9hZGRyID0gcHJ0ZC0+dHNfaGVhZGVyX29mZnNldDsKKwkJCWJ1ZmZfYWRkcisrOworCQkJLyogV3JpdGUgdGhlIFRTIExTVyAqLworCQkJKmJ1ZmZfYWRkciA9IHBheWxvYWRbVFNfTFNXX09GRlNFVF07CisJCQlidWZmX2FkZHIrKzsKKwkJCS8qIFdyaXRlIHRoZSBUUyBNU1cgKi8KKwkJCSpidWZmX2FkZHIgPSBwYXlsb2FkW1RTX01TV19PRkZTRVRdOworCQl9CisJCS8qIEFsd2F5cyBhc3N1bWUgcmVhZF9zaXplIGlzIHNhbWUgYXMgZnJhZ21lbnRfc2l6ZSAqLworCQlyZWFkX3NpemUgPSBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKKwkJcHJ0ZC0+Ynl0ZV9vZmZzZXQgKz0gcmVhZF9zaXplOworCQlwcnRkLT5yZWNlaXZlZF90b3RhbCArPSByZWFkX3NpemU7CisJCWlmIChwcnRkLT5ieXRlX29mZnNldCA+PSBwcnRkLT5idWZmZXJfc2l6ZSkKKwkJCXBydGQtPmJ5dGVfb2Zmc2V0IC09IHBydGQtPmJ1ZmZlcl9zaXplOworCisJCXNuZF9jb21wcl9mcmFnbWVudF9lbGFwc2VkKGNzdHJlYW0pOworCisJCWlmICghYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgeworCQkJcHJfZGVidWcoInJlYWRfZG9uZSByZWNlaXZlZCB3aGlsZSBub3Qgc3RhcnRlZCwgdHJlYXQgYXMgeHJ1biIpOworCQkJYXRvbWljX3NldCgmcHJ0ZC0+eHJ1biwgMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQltc21fY29tcHJfcmVhZF9idWZmZXIocHJ0ZCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKwogCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwogCQlwcl9kZWJ1ZygiJXM6IEFTTV9EQVRBX0NNRFJTUF9FT1MgdG9rZW4gMHgleCxzdHJlYW0gaWQgJWRcbiIsCi0JCQkgIF9fZnVuY19fLCB0b2tlbiwgU1RSRUFNX0lEX0ZST01fVE9LRU4odG9rZW4pKTsKLQkJc3RyZWFtX2lkID0gU1RSRUFNX0lEX0ZST01fVE9LRU4odG9rZW4pOworCQkJICBfX2Z1bmNfXywgdG9rZW4sIHN0cmVhbV9pZCk7CiAJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZW9zKSAmJgogCQkgICAgIXBydGQtPmdhcGxlc3Nfc3RhdGUuc2V0X25leHRfc3RyZWFtX2lkKSB7CiAJCQlwcl9kZWJ1ZygiQVNNX0RBVEFfQ01EUlNQX0VPUyB3YWtlIHVwXG4iKTsKQEAgLTUwOSw2ICs2MTcsMTQgQEAKIAogCQkJLyogRklYTUU6IEEgc3RhdGUgaXMgYSBiZXR0ZXIgd2F5LCBkZWFsaW5nIHdpdGggdGhpcyAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkgeworCQkJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAxKTsKKwkJCQltc21fY29tcHJfcmVhZF9idWZmZXIocHJ0ZCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCiAJCQlpZiAoIXBydGQtPmJ5dGVzX3NlbnQpIHsKIAkJCQlieXRlc19hdmFpbGFibGUgPSBwcnRkLT5ieXRlc19yZWNlaXZlZCAtCiAJCQkJCQkgIHBydGQtPmNvcGllZF90b3RhbDsKQEAgLTU0NywyNSArNjYzLDI1IEBACiAJCWNhc2UgQVNNX1NUUkVBTV9DTURfRkxVU0g6CiAJCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fQ01EX0ZMVVNIOiIsIF9fZnVuY19fKTsKIAkJCXByX2RlYnVnKCJ0b2tlbiAweCV4LCBzdHJlYW0gaWQgJWRcbiIsIHRva2VuLAotCQkJCSAgU1RSRUFNX0lEX0ZST01fVE9LRU4odG9rZW4pKTsKKwkJCQkgIHN0cmVhbV9pZCk7CiAJCQlwcnRkLT5jbWRfYWNrID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIEFTTV9EQVRBX0NNRF9SRU1PVkVfSU5JVElBTF9TSUxFTkNFOgogCQkJcHJfZGVidWcoIiVzOiBBU01fREFUQV9DTURfUkVNT1ZFX0lOSVRJQUxfU0lMRU5DRToiLAogCQkJCSAgIF9fZnVuY19fKTsKIAkJCXByX2RlYnVnKCJ0b2tlbiAweCV4LCBzdHJlYW0gaWQgPSAlZFxuIiwgdG9rZW4sCi0JCQkJICBTVFJFQU1fSURfRlJPTV9UT0tFTih0b2tlbikpOworCQkJCSAgc3RyZWFtX2lkKTsKIAkJCWJyZWFrOwogCQljYXNlIEFTTV9EQVRBX0NNRF9SRU1PVkVfVFJBSUxJTkdfU0lMRU5DRToKIAkJCXByX2RlYnVnKCIlczogQVNNX0RBVEFfQ01EX1JFTU9WRV9UUkFJTElOR19TSUxFTkNFOiIsCiAJCQkJICBfX2Z1bmNfXyk7CiAJCQlwcl9kZWJ1ZygidG9rZW4gPSAweCV4LAlzdHJlYW0gaWQgPSAlZFxuIiwgdG9rZW4sCi0JCQkJICBTVFJFQU1fSURfRlJPTV9UT0tFTih0b2tlbikpOworCQkJCSAgc3RyZWFtX2lkKTsKIAkJCWJyZWFrOwogCQljYXNlIEFTTV9TVFJFQU1fQ01EX0NMT1NFOgogCQkJcHJfZGVidWcoIiVzOiBBU01fREFUQV9DTURfQ0xPU0U6IiwgX19mdW5jX18pOwogCQkJcHJfZGVidWcoInRva2VuIDB4JXgsIHN0cmVhbSBpZCAlZFxuIiwgdG9rZW4sCi0JCQkJICBTVFJFQU1fSURfRlJPTV9UT0tFTih0b2tlbikpOworCQkJCSAgc3RyZWFtX2lkKTsKIAkJCS8qCiAJCQkgKiB3YWtldXAgd2FpdCBmb3Igc3RyZWFtIGF2YWlsIG9uIHN0cmVhbSAzCiAJCQkgKiBhZnRlciBzdHJlYW0gMSBlbmRzLgpAQCAtNTk3LDggKzcxMywxMiBAQAogCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCByZXNldCBldmVudHMgQ0IsIG1vdmUgdG8gZXJyb3Igc3RhdGUiLAogCQkJX19mdW5jX18pOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlzbmRfY29tcHJfZnJhZ21lbnRfZWxhcHNlZChjc3RyZWFtKTsKKwkJLyoKKwkJICogU2luY2UgQURTUCBpcyBkb3duLCBsZXQgdGhpcyBkcml2ZXIgcHJldGVuZCB0aGF0IGl0IGNvcGllZAorCQkgKiBhbGwgdGhlIGJ5dGVzIHJlY2VpdmVkLCBzbyB0aGF0IG5leHQgd3JpdGUgd2lsbCBiZSB0cmlnZ2VyZWQKKwkJICovCiAJCXBydGQtPmNvcGllZF90b3RhbCA9IHBydGQtPmJ5dGVzX3JlY2VpdmVkOworCQlzbmRfY29tcHJfZnJhZ21lbnRfZWxhcHNlZChjc3RyZWFtKTsKIAkJYXRvbWljX3NldCgmcHJ0ZC0+ZXJyb3IsIDEpOwogCQl3YWtlX3VwKCZwcnRkLT5kcmFpbl93YWl0KTsKIAkJaWYgKGF0b21pY19jbXB4Y2hnKCZwcnRkLT5lb3MsIDEsIDApKSB7CkBAIC02MjMsNyArNzQzLDggQEAKIAlkZWxheV90aW1lX21zID0gZGVsYXlfdGltZV9tcyA+IFBBUlRJQUxfRFJBSU5fQUNLX0VBUkxZX0JZX01TRUMgPwogCQkJZGVsYXlfdGltZV9tcyAtIFBBUlRJQUxfRFJBSU5fQUNLX0VBUkxZX0JZX01TRUMgOiAwOwogCi0JcHJfZGVidWcoIiVzOiBwYXJ0aWFsIGRyYWluIGRlbGF5ICVkXG4iLCBfX2Z1bmNfXywgZGVsYXlfdGltZV9tcyk7CisJcHJfZGVidWcoIiVzOiBmcmFtZV9zeiAlZCwgc2FtcGxlX3JhdGUgJWQsIHBhcnRpYWwgZHJhaW4gZGVsYXkgJWRcbiIsCisJCV9fZnVuY19fLCBmcmFtZV9zeiwgc2FtcGxlX3JhdGUsIGRlbGF5X3RpbWVfbXMpOwogCXJldHVybiBkZWxheV90aW1lX21zOwogfQogCkBAIC02MzksNyArNzYwLDcgQEAKIAkJCUNPTVBSX1BMQVlCQUNLX01JTl9OVU1fRlJBR01FTlRTOwogCXBydGQtPmNvbXByX2NhcC5tYXhfZnJhZ21lbnRzID0KIAkJCUNPTVBSX1BMQVlCQUNLX01BWF9OVU1fRlJBR01FTlRTOwotCXBydGQtPmNvbXByX2NhcC5udW1fY29kZWNzID0gMTI7CisJcHJ0ZC0+Y29tcHJfY2FwLm51bV9jb2RlY3MgPSAxNDsKIAlwcnRkLT5jb21wcl9jYXAuY29kZWNzWzBdID0gU05EX0FVRElPQ09ERUNfTVAzOwogCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMV0gPSBTTkRfQVVESU9DT0RFQ19BQUM7CiAJcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1syXSA9IFNORF9BVURJT0NPREVDX0FDMzsKQEAgLTY1Miw2ICs3NzMsOCBAQAogCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbOV0gPSBTTkRfQVVESU9DT0RFQ19WT1JCSVM7CiAJcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1sxMF0gPSBTTkRfQVVESU9DT0RFQ19BTEFDOwogCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMTFdID0gU05EX0FVRElPQ09ERUNfQVBFOworCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMTJdID0gU05EX0FVRElPQ09ERUNfRFRTOworCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMTNdID0gU05EX0FVRElPQ09ERUNfRFNEOwogfQogCiBzdGF0aWMgaW50IG1zbV9jb21wcl9zZW5kX21lZGlhX2Zvcm1hdF9ibG9jayhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKQEAgLTY3MCwxMiArNzkzLDE0IEBACiAJc3RydWN0IGFzbV92b3JiaXNfY2ZnIHZvcmJpc19jZmc7CiAJc3RydWN0IGFzbV9hbGFjX2NmZyBhbGFjX2NmZzsKIAlzdHJ1Y3QgYXNtX2FwZV9jZmcgYXBlX2NmZzsKKwlzdHJ1Y3QgYXNtX2RzZF9jZmcgZHNkX2NmZzsKIAl1bmlvbiBzbmRfY29kZWNfb3B0aW9ucyAqY29kZWNfb3B0aW9uczsKIAogCWludCByZXQgPSAwOwotCXVpbnQxNl90IGJpdF93aWR0aCA9IDE2OworCXVpbnQxNl90IGJpdF93aWR0aDsKIAlib29sIHVzZV9kZWZhdWx0X2NobWFwID0gdHJ1ZTsKIAljaGFyICpjaG1hcCA9IE5VTEw7CisJdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZTsKIAogCXByX2RlYnVnKCIlczogdXNlX2dhcGxlc3NfY29kZWNfb3B0aW9ucyAlZFxuIiwKIAkJCV9fZnVuY19fLCB1c2VfZ2FwbGVzc19jb2RlY19vcHRpb25zKTsKQEAgLTY5MywyMSArODE4LDQyIEBACiAJc3dpdGNoIChwcnRkLT5jb2RlYykgewogCWNhc2UgRk9STUFUX0xJTkVBUl9QQ006CiAJCXByX2RlYnVnKCJTTkRfQVVESU9DT0RFQ19QQ01cbiIpOwotCQlpZiAocGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5iZV9pZF0pIHsKKwkJaWYgKHBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdKSB7CiAJCQl1c2VfZGVmYXVsdF9jaG1hcCA9Ci0JCQkgICAgIShwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmJlX2lkXS0+c2V0X2NoX21hcCk7CisJCQkgICAgIShwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmlkXS0+c2V0X2NoX21hcCk7CiAJCQljaG1hcCA9Ci0JCQkgICAgcGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5iZV9pZF0tPmNoYW5uZWxfbWFwOworCQkJICAgIHBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdLT5jaGFubmVsX21hcDsKIAkJfQotCQlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQorCisJCXN3aXRjaCAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0KSB7CisJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCQliaXRfd2lkdGggPSAzMjsKKwkJCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKKwkJCWJyZWFrOworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgogCQkJYml0X3dpZHRoID0gMjQ7Ci0JCXJldCA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjIoCisJCQlzYW1wbGVfd29yZF9zaXplID0gMzI7CisJCQlicmVhazsKKwkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCQliaXRfd2lkdGggPSAyNDsKKwkJCXNhbXBsZV93b3JkX3NpemUgPSAyNDsKKwkJCWJyZWFrOworCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlkZWZhdWx0OgorCQkJYml0X3dpZHRoID0gMTY7CisJCQlzYW1wbGVfd29yZF9zaXplID0gMTY7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0KAogCQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwKIAkJCQkJCQlwcnRkLT5zYW1wbGVfcmF0ZSwKIAkJCQkJCQlwcnRkLT5udW1fY2hhbm5lbHMsCiAJCQkJCQkJYml0X3dpZHRoLCBzdHJlYW1faWQsCiAJCQkJCQkJdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCQkJY2htYXApOworCQkJCQkJCWNobWFwLAorCQkJCQkJCXNhbXBsZV93b3JkX3NpemUsCisJCQkJCQkJQVNNX0xJVFRMRV9FTkRJQU4sCisJCQkJCQkJREVGQVVMVF9RRik7CiAJCWlmIChyZXQgPCAwKQogCQkJcHJfZXJyKCIlczogQ01EIEZvcm1hdCBibG9jayBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIApAQCAtODYxLDcgKzEwMDcsMjQgQEAKIAkJCXByX2VycigiJXM6IENNRCBGb3JtYXQgYmxvY2sgZmFpbGVkIHJldCAlZFxuIiwKIAkJCQkJX19mdW5jX18sIHJldCk7CiAJCWJyZWFrOwotCisJY2FzZSBGT1JNQVRfRFRTOgorCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfRFRTXG4iKTsKKwkJLyogbm8gbWVkaWEgZm9ybWF0IGJsb2NrIG5lZWRlZCAqLworCQlicmVhazsKKwljYXNlIEZPUk1BVF9EU0Q6CisJCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfRFNEXG4iLCBfX2Z1bmNfXyk7CisJCW1lbXNldCgmZHNkX2NmZywgMHgwLCBzaXplb2Yoc3RydWN0IGFzbV9kc2RfY2ZnKSk7CisJCWRzZF9jZmcubnVtX2NoYW5uZWxzID0gcHJ0ZC0+bnVtX2NoYW5uZWxzOworCQlkc2RfY2ZnLmRzZF9kYXRhX3JhdGUgPSBwcnRkLT5zYW1wbGVfcmF0ZTsKKwkJZHNkX2NmZy5udW1fdmVyc2lvbiA9IDA7CisJCWRzZF9jZmcuaXNfYml0d2lzZV9iaWdfZW5kaWFuID0gMTsKKwkJZHNkX2NmZy5kc2RfY2hhbm5lbF9ibG9ja19zaXplID0gMTsKKwkJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2RzZChwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJCQkgICAmZHNkX2NmZywgc3RyZWFtX2lkKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBDTUQgRFNEIEZvcm1hdCBibG9jayBmYWlsZWQgcmV0ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9kZWJ1ZygiJXMsIHVuc3VwcG9ydGVkIGZvcm1hdCwgc2tpcCIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CkBAIC05MTIsNyArMTA3NSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtc21fY29tcHJfY29uZmlndXJlX2RzcChzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSkKK3N0YXRpYyBpbnQgbXNtX2NvbXByX2NvbmZpZ3VyZV9kc3BfZm9yX3BsYXliYWNrCisJCQkoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwpAQCAtOTM0LDcgKzEwOTgsMTQgQEAKIAl9OwogCiAJcHJfZGVidWcoIiVzOiBzdHJlYW1faWQgJWRcbiIsIF9fZnVuY19fLCBhYy0+c3RyZWFtX2lkKTsKLQlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQorCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChhYy0+c3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtX2luZGV4ID49IE1BWF9OVU1CRVJfT0ZfU1RSRUFNUyB8fCBzdHJlYW1faW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIGluZGV4OiVkIiwgX19mdW5jX18sIHN0cmVhbV9pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB8fAorCQkocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRSkpCiAJCWJpdHNfcGVyX3NhbXBsZSA9IDI0OwogCWVsc2UgaWYgKHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKIAkJYml0c19wZXJfc2FtcGxlID0gMzI7CkBAIC05NDcsOCArMTExOCwxMCBAQAogCQkJCV9fZnVuY19fLCByZXQsIHBydGQtPmNvbXByX3Bhc3N0aHIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQorCQlwcnRkLT5nYXBsZXNzX3N0YXRlLnN0cmVhbV9vcGVuZWRbc3RyZWFtX2luZGV4XSA9IDE7CisKIAkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfY29tcHJfc3RyZWFtKAotCQkJCXNvY19wcnRkLT5kYWlfbGluay0+YmVfaWQsCisJCQkJc29jX3BydGQtPmRhaV9saW5rLT5pZCwKIAkJCQlhYy0+cGVyZl9tb2RlLAogCQkJCXBydGQtPnNlc3Npb25faWQsCiAJCQkJU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKQEAgLTk2MSw3ICsxMTM0LDcgQEAKIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiJXM6IHN0cmVhbV9pZCAlZCBiaXRzX3Blcl9zYW1wbGUgJWRcbiIsCiAJCQkJX19mdW5jX18sIGFjLT5zdHJlYW1faWQsIGJpdHNfcGVyX3NhbXBsZSk7Ci0JCXJldCA9IHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YyKGFjLAorCQlyZXQgPSBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92NChhYywKIAkJCQlwcnRkLT5jb2RlYywgYml0c19wZXJfc2FtcGxlLAogCQkJCWFjLT5zdHJlYW1faWQsCiAJCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS51c2VfZHNwX2dhcGxlc3NfbW9kZSk7CkBAIC05NzAsOSArMTE0MywxMCBAQAogCQkJCV9fZnVuY19fLCByZXQsIHBydGQtPmNvbXByX3Bhc3N0aHIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKwkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zdHJlYW1fb3BlbmVkW3N0cmVhbV9pbmRleF0gPSAxOwogCi0JCXByX2RlYnVnKCIlczogYmVfaWQgJWRcbiIsIF9fZnVuY19fLCBzb2NfcHJ0ZC0+ZGFpX2xpbmstPmJlX2lkKTsKLQkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+YmVfaWQsCisJCXByX2RlYnVnKCIlczogQkUgaWQgJWRcbiIsIF9fZnVuY19fLCBzb2NfcHJ0ZC0+ZGFpX2xpbmstPmJlX2lkKTsKKwkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+aWQsCiAJCQkJYWMtPnBlcmZfbW9kZSwKIAkJCQlwcnRkLT5zZXNzaW9uX2lkLAogCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwpAQCAtOTg2LDMxICsxMTYwLDMwIEBACiAJaWYgKHJldCA8IDApCiAJCXByX2VycigiJXMgOiBTZXQgVm9sdW1lIGZhaWxlZCA6ICVkIiwgX19mdW5jX18sIHJldCk7CiAKLQlyZXQgPSBxNmFzbV9zZW5kX2NhbChhYyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2RlYnVnKCIlcyA6IFNlbmQgY2FsIGZhaWxlZCA6ICVkIiwgX19mdW5jX18sIHJldCk7CisJaWYgKHBydGQtPmNvbXByX3Bhc3N0aHIgIT0gTEVHQUNZX1BDTSkgeworCQlwcl9kZWJ1ZygiJXMgOiBEb24ndCBzZW5kIGNhbCBhbmQgUFAgcGFyYW1zIGZvciBjb21wcmVzcyBwYXRoIiwKKwkJCQlfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gcTZhc21fc2VuZF9jYWwoYWMpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2RlYnVnKCIlcyA6IFNlbmQgY2FsIGZhaWxlZCA6ICVkIiwgX19mdW5jX18sIHJldCk7CiAKLQlyZXQgPSBxNmFzbV9zZXRfc29mdHBhdXNlKGFjLCAmc29mdHBhdXNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0UGF1c2UgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQlyZXQgPSBxNmFzbV9zZXRfc29mdHZvbHVtZShhYywgJnNvZnR2b2wpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0ID0gcTZhc21fc2V0X3NvZnRwYXVzZShhYywgJnNvZnRwYXVzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0UGF1c2UgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CiAKKwkJcmV0ID0gcTZhc21fc2V0X3NvZnR2b2x1bWUoYWMsICZzb2Z0dm9sKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJfQogCXJldCA9IHE2YXNtX3NldF9pb19tb2RlKGFjLCAoQ09NUFJFU1NFRF9TVFJFQU1fSU8gfCBBU1lOQ19JT19NT0RFKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCIlczogU2V0IElPIG1vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzdHJlYW1faW5kZXggPSBTVFJFQU1fQVJSQVlfSU5ERVgoYWMtPnN0cmVhbV9pZCk7Ci0JaWYgKHN0cmVhbV9pbmRleCA+PSBNQVhfTlVNQkVSX09GX1NUUkVBTVMgfHwgc3RyZWFtX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSBpbmRleDolZCIsIF9fZnVuY19fLCBzdHJlYW1faW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlwcnRkLT5nYXBsZXNzX3N0YXRlLnN0cmVhbV9vcGVuZWRbc3RyZWFtX2luZGV4XSA9IDE7CiAJcnVudGltZS0+ZnJhZ21lbnRzID0gcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50czsKIAlydW50aW1lLT5mcmFnbWVudF9zaXplID0gcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50X3NpemU7CiAJcHJfZGVidWcoImFsbG9jYXRlICVkIGJ1ZmZlcnMgZWFjaCBvZiBzaXplICVkXG4iLApAQCAtMTA0MCw3ICsxMjEzLDEwOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXNtX2NvbXByX29wZW4oc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCitzdGF0aWMgaW50IG1zbV9jb21wcl9jb25maWd1cmVfZHNwX2Zvcl9jYXB0dXJlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlOworCXVpbnQxNl90IHNhbXBsZV93b3JkX3NpemU7CisJaW50IGRpciA9IE9VVCwgcmV0ID0gMDsKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKKwl1aW50MzJfdCBzdHJlYW1faW5kZXg7CisKKwlzd2l0Y2ggKHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWJpdHNfcGVyX3NhbXBsZSA9IDI0OworCQlzYW1wbGVfd29yZF9zaXplID0gMzI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDI0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWRlZmF1bHQ6CisJCWJpdHNfcGVyX3NhbXBsZSA9IDE2OworCQlzYW1wbGVfd29yZF9zaXplID0gMTY7CisJCWJyZWFrOworCX0KKworCXByX2RlYnVnKCIlczogc3RyZWFtX2lkICVkIGJpdHNfcGVyX3NhbXBsZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBhYy0+c3RyZWFtX2lkLCBiaXRzX3Blcl9zYW1wbGUpOworCisJcmV0ID0gcTZhc21fb3Blbl9yZWFkX3Y0KHBydGQtPmF1ZGlvX2NsaWVudCwgRk9STUFUX0xJTkVBUl9QQ00sCisJCWJpdHNfcGVyX3NhbXBsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcTZhc21fb3Blbl9yZWFkIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQlhYy0+cGVyZl9tb2RlLAorCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwKKwkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBzdHJlYW0gcmVnIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcTZhc21fc2V0X2lvX21vZGUoYWMsIChDT01QUkVTU0VEX1NUUkVBTV9JTyB8IEFTWU5DX0lPX01PREUpKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgSU8gbW9kZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtX2luZGV4ID0gU1RSRUFNX0FSUkFZX0lOREVYKGFjLT5zdHJlYW1faWQpOworCWlmIChzdHJlYW1faW5kZXggPj0gTUFYX05VTUJFUl9PRl9TVFJFQU1TIHx8IHN0cmVhbV9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzdHJlYW0gaW5kZXg6JWQiLCBfX2Z1bmNfXywgc3RyZWFtX2luZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnVudGltZS0+ZnJhZ21lbnRzID0gcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50czsKKwlydW50aW1lLT5mcmFnbWVudF9zaXplID0gcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50X3NpemU7CisJcHJfZGVidWcoIiVzOiBhbGxvY2F0ZSAlZCBidWZmZXJzIGVhY2ggb2Ygc2l6ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBydW50aW1lLT5mcmFnbWVudHMsCisJCQlydW50aW1lLT5mcmFnbWVudF9zaXplKTsKKwlyZXQgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXMoZGlyLCBhYywKKwkJCQkJcnVudGltZS0+ZnJhZ21lbnRfc2l6ZSwKKwkJCQkJcnVudGltZS0+ZnJhZ21lbnRzKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0OiBCdWZmZXIgQWxsb2NhdGlvbiBmYWlsZWQgcmMgPSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJ0ZC0+Ynl0ZV9vZmZzZXQgICAgPSAwOworCXBydGQtPnJlY2VpdmVkX3RvdGFsID0gMDsKKwlwcnRkLT5hcHBfcG9pbnRlciAgICA9IDA7CisJcHJ0ZC0+Ynl0ZXNfY29waWVkICAgPSAwOworCXBydGQtPmJ5dGVzX3JlYWQgICAgID0gMDsKKwlwcnRkLT5ieXRlc19yZWFkX29mZnNldCA9IDA7CisJcHJ0ZC0+YnVmZmVyICAgICAgICAgPSBhYy0+cG9ydFtkaXJdLmJ1ZlswXS5kYXRhOworCXBydGQtPmJ1ZmZlcl9wYWRkciAgID0gYWMtPnBvcnRbZGlyXS5idWZbMF0ucGh5czsKKwlwcnRkLT5idWZmZXJfc2l6ZSAgICA9IHJ1bnRpbWUtPmZyYWdtZW50cyAqIHJ1bnRpbWUtPmZyYWdtZW50X3NpemU7CisKKwkvKiBCaXQtMCBvZiBmbGFncyByZXByZXNlbnQgdGltZXN0YW1wIG1vZGUgKi8KKwlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZmxhZ3MgJiBDT01QUkVTU0VEX1RJTUVTVEFNUF9GTEFHKQorCQlwcnRkLT50c19oZWFkZXJfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzbmRfY29kZWNfbWV0YWRhdGEpOworCWVsc2UKKwkJcHJ0ZC0+dHNfaGVhZGVyX29mZnNldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNhbXBsZV9yYXRlID0gJWQgY2hhbm5lbHMgPSAlZCBicHMgPSAlZCBzYW1wbGVfd29yZF9zaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcHJ0ZC0+c2FtcGxlX3JhdGUsIHBydGQtPm51bV9jaGFubmVscywKKwkJCQkJIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7CisJcmV0ID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX2Zvcm1hdF9zdXBwb3J0X3YzKHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQkJcHJ0ZC0+c2FtcGxlX3JhdGUsIHBydGQtPm51bV9jaGFubmVscywKKwkJCQkJYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2NvbXByX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwpAQCAtMTA1NywzOSArMTMzMSwyNSBAQAogCiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlwcnRkLT5jc3RyZWFtID0gY3N0cmVhbTsKLQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5iZV9pZF0gPSBjc3RyZWFtOwotCXBkYXRhLT5hdWRpb19lZmZlY3RzW3J0ZC0+ZGFpX2xpbmstPmJlX2lkXSA9CisJcGRhdGEtPmNzdHJlYW1bcnRkLT5kYWlfbGluay0+aWRdID0gY3N0cmVhbTsKKwlwZGF0YS0+YXVkaW9fZWZmZWN0c1tydGQtPmRhaV9saW5rLT5pZF0gPQogCQkga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9jb21wcl9hdWRpb19lZmZlY3RzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YS0+YXVkaW9fZWZmZWN0c1tydGQtPmRhaV9saW5rLT5iZV9pZF0pIHsKKwlpZiAoIXBkYXRhLT5hdWRpb19lZmZlY3RzW3J0ZC0+ZGFpX2xpbmstPmlkXSkgewogCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7Ci0JCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmJlX2lkXSA9IE5VTEw7CisJCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7CiAJCWtmcmVlKHBydGQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcGRhdGEtPmRlY19wYXJhbXNbcnRkLT5kYWlfbGluay0+YmVfaWRdID0KKwlwZGF0YS0+ZGVjX3BhcmFtc1tydGQtPmRhaV9saW5rLT5pZF0gPQogCQkga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9jb21wcl9kZWNfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YS0+ZGVjX3BhcmFtc1tydGQtPmRhaV9saW5rLT5iZV9pZF0pIHsKKwlpZiAoIXBkYXRhLT5kZWNfcGFyYW1zW3J0ZC0+ZGFpX2xpbmstPmlkXSkgewogCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZWMgcGFyYW1zXG4iLAogCQkJX19mdW5jX18pOwotCQlrZnJlZShwZGF0YS0+YXVkaW9fZWZmZWN0c1tydGQtPmRhaV9saW5rLT5iZV9pZF0pOwotCQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5iZV9pZF0gPSBOVUxMOworCQlrZnJlZShwZGF0YS0+YXVkaW9fZWZmZWN0c1tydGQtPmRhaV9saW5rLT5pZF0pOworCQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5pZF0gPSBOVUxMOwogCQlrZnJlZShwcnRkKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXBydGQtPmF1ZGlvX2NsaWVudCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygKLQkJCQkoYXBwX2NiKWNvbXByX2V2ZW50X2hhbmRsZXIsIHBydGQpOwotCWlmICghcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNsaWVudFxuIiwgX19mdW5jX18pOwotCQlrZnJlZShwZGF0YS0+YXVkaW9fZWZmZWN0c1tydGQtPmRhaV9saW5rLT5iZV9pZF0pOwotCQlrZnJlZShwZGF0YS0+ZGVjX3BhcmFtc1tydGQtPmRhaV9saW5rLT5iZV9pZF0pOwotCQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5iZV9pZF0gPSBOVUxMOwotCQlrZnJlZShwcnRkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uIElEICVkXG4iLCBfX2Z1bmNfXywgcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uKTsKLQlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSA9IGZhbHNlOwotCXBydGQtPnNlc3Npb25faWQgPSBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb247CiAJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfTVAzOwogCXBydGQtPmJ5dGVzX3JlY2VpdmVkID0gMDsKIAlwcnRkLT5ieXRlc19zZW50ID0gMDsKQEAgLTExMjgsMTEgKzEzODgsOTEgQEAKIAogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CiAJcG9wdWxhdGVfY29kZWNfbGlzdChwcnRkKTsKKwlwcnRkLT5hdWRpb19jbGllbnQgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCisJCQkJKGFwcF9jYiljb21wcl9ldmVudF9oYW5kbGVyLCBwcnRkKTsKKwlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjbGllbnRcbiIsIF9fZnVuY19fKTsKKwkJa2ZyZWUocGRhdGEtPmF1ZGlvX2VmZmVjdHNbcnRkLT5kYWlfbGluay0+aWRdKTsKKwkJa2ZyZWUocGRhdGEtPmRlY19wYXJhbXNbcnRkLT5kYWlfbGluay0+aWRdKTsKKwkJcGRhdGEtPmNzdHJlYW1bcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKKwkJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJa2ZyZWUocHJ0ZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gSUQgJWRcbiIsIF9fZnVuY19fLCBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24pOworCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gZmFsc2U7CisJcHJ0ZC0+c2Vzc2lvbl9pZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbjsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zbV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQorc3RhdGljIGludCBtc21fY29tcHJfY2FwdHVyZV9vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOworCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhID0KKwkJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9jb21wcl9hdWRpbyksIEdGUF9LRVJORUwpOworCWlmIChwcnRkID09IE5VTEwpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtc21fY29tcHJfYXVkaW9cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXBydGQtPmNzdHJlYW0gPSBjc3RyZWFtOworCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmlkXSA9IGNzdHJlYW07CisKKwlwcnRkLT5hdWRpb19jbGllbnQgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCisJCQkJKGFwcF9jYiljb21wcl9ldmVudF9oYW5kbGVyLCBwcnRkKTsKKwlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjbGllbnRcbiIsIF9fZnVuY19fKTsKKwkJcGRhdGEtPmNzdHJlYW1bcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKKwkJa2ZyZWUocHJ0ZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gSUQgJWRcbiIsIF9fZnVuY19fLCBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24pOworCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gZmFsc2U7CisJcHJ0ZC0+c2Vzc2lvbl9pZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbjsKKwlwcnRkLT5jb2RlYyA9IEZPUk1BVF9MSU5FQVJfUENNOworCXBydGQtPmJ5dGVzX2NvcGllZCA9IDA7CisJcHJ0ZC0+Ynl0ZXNfcmVhZCA9IDA7CisJcHJ0ZC0+Ynl0ZXNfcmVhZF9vZmZzZXQgPSAwOworCXBydGQtPnJlY2VpdmVkX3RvdGFsID0gMDsKKwlwcnRkLT5ieXRlX29mZnNldCA9IDA7CisJcHJ0ZC0+c2FtcGxlX3JhdGUgPSA0ODAwMDsKKwlwcnRkLT5udW1fY2hhbm5lbHMgPSAyOworCXBydGQtPmZpcnN0X2J1ZmZlciA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJ0ZC0+bG9jayk7CisKKwlhdG9taWNfc2V0KCZwcnRkLT5lb3MsIDApOworCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAwKTsKKwlhdG9taWNfc2V0KCZwcnRkLT5kcmFpbiwgMCk7CisJYXRvbWljX3NldCgmcHJ0ZC0+eHJ1biwgMCk7CisJYXRvbWljX3NldCgmcHJ0ZC0+Y2xvc2UsIDApOworCWF0b21pY19zZXQoJnBydGQtPndhaXRfb25fY2xvc2UsIDApOworCWF0b21pY19zZXQoJnBydGQtPmVycm9yLCAwKTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfb3BlbihzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fY29tcHJfcGxheWJhY2tfb3Blbihjc3RyZWFtKTsKKwllbHNlIGlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpCisJCXJldCA9IG1zbV9jb21wcl9jYXB0dXJlX29wZW4oY3N0cmVhbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfZnJlZShzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWU7CiAJc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZDsKQEAgLTEyMDgsOSArMTU0OCw5IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKIAotCXBkYXRhLT5jc3RyZWFtW3NvY19wcnRkLT5kYWlfbGluay0+YmVfaWRdID0gTlVMTDsKKwlwZGF0YS0+Y3N0cmVhbVtzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7CiAJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKLQkJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKIAkJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCX0KIApAQCAtMTIxOCwxNSArMTU1OCw4NSBAQAogCiAJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwogCi0Ja2ZyZWUocGRhdGEtPmF1ZGlvX2VmZmVjdHNbc29jX3BydGQtPmRhaV9saW5rLT5iZV9pZF0pOwotCXBkYXRhLT5hdWRpb19lZmZlY3RzW3NvY19wcnRkLT5kYWlfbGluay0+YmVfaWRdID0gTlVMTDsKLQlrZnJlZShwZGF0YS0+ZGVjX3BhcmFtc1tzb2NfcHJ0ZC0+ZGFpX2xpbmstPmJlX2lkXSk7Ci0JcGRhdGEtPmRlY19wYXJhbXNbc29jX3BydGQtPmRhaV9saW5rLT5iZV9pZF0gPSBOVUxMOworCWtmcmVlKHBkYXRhLT5hdWRpb19lZmZlY3RzW3NvY19wcnRkLT5kYWlfbGluay0+aWRdKTsKKwlwZGF0YS0+YXVkaW9fZWZmZWN0c1tzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7CisJa2ZyZWUocGRhdGEtPmRlY19wYXJhbXNbc29jX3BydGQtPmRhaV9saW5rLT5pZF0pOworCXBkYXRhLT5kZWNfcGFyYW1zW3NvY19wcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKIAlrZnJlZShwcnRkKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2ZyZWUoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCit7CisJc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkOworCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhOworCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOworCWludCBkaXIgPSBPVVQsIHN0cmVhbV9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKKworCWlmICghY3N0cmVhbSkgeworCQlwcl9lcnIoIiVzIGNzdHJlYW0gaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CisJc29jX3BydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaWYgKCFydW50aW1lIHx8ICFzb2NfcHJ0ZCB8fCAhKHNvY19wcnRkLT5wbGF0Zm9ybSkpIHsKKwkJcHJfZXJyKCIlcyBydW50aW1lIG9yIHNvY19wcnRkIG9yIHBsYXRmb3JtIGlzIG51bGxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmICghcHJ0ZCkgeworCQlwcl9lcnIoIiVzIHBydGQgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHNvY19wcnRkLT5wbGF0Zm9ybSk7CisJYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJaWYgKCFwZGF0YSB8fCAhYWMpIHsKKwkJcHJfZXJyKCIlcyBwZGF0YSBvciBhYyBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJc3RyZWFtX2lkID0gYWMtPnN0cmVhbV9pZDsKKworCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChzdHJlYW1faWQpOworCWlmICgoc3RyZWFtX2luZGV4IDwgTUFYX05VTUJFUl9PRl9TVFJFQU1TICYmIHN0cmVhbV9pbmRleCA+PSAwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJCXByX2RlYnVnKCJjbG9zZSBzdHJlYW0gJWQiLCBzdHJlYW1faWQpOworCQlxNmFzbV9zdHJlYW1fY21kKGFjLCBDTURfQ0xPU0UsIHN0cmVhbV9pZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKKworCXBkYXRhLT5jc3RyZWFtW3NvY19wcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKKwltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQkJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCisJcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoZGlyLCBhYyk7CisKKwlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhYyk7CisKKwlrZnJlZShwcnRkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQoreworCWludCByZXQgPSAwOworCisJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCisJCXJldCA9IG1zbV9jb21wcl9wbGF5YmFja19mcmVlKGNzdHJlYW0pOworCWVsc2UgaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX2NvbXByX2NhcHR1cmVfZnJlZShjc3RyZWFtKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgYm9vbCBtc21fY29tcHJfdmFsaWRhdGVfY29kZWNfY29tcHIoX191MzIgY29kZWNfaWQpCiB7CiAJaW50MzJfdCBpOwpAQCAtMTI1Nyw4ICsxNjY3LDE0IEBACiAJaWYgKGkgPT0gbnVtX3JhdGVzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jb21wcl9wYXNzdGhyID49IDAgJiYKLQkJcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuY29tcHJfcGFzc3RociA8PSAyKQorCW1lbWNweSgmcHJ0ZC0+Y29kZWNfcGFyYW0sIHBhcmFtcywgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfcGFyYW1zKSk7CisJLyogVG9EbzogcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KKwlwcnRkLT5udW1fY2hhbm5lbHMgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jaF9pbjsKKwlwcnRkLT5zYW1wbGVfcmF0ZSA9IHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLnNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogc2FtcGxlX3JhdGUgJWRcbiIsIF9fZnVuY19fLCBwcnRkLT5zYW1wbGVfcmF0ZSk7CisKKwlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuY29tcHJfcGFzc3RociA+PSBMRUdBQ1lfUENNICYmCisJICAgIHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmNvbXByX3Bhc3N0aHIgPD0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9EU0QpCiAJCXBydGQtPmNvbXByX3Bhc3N0aHIgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jb21wcl9wYXNzdGhyOwogCWVsc2UKIAkJcHJ0ZC0+Y29tcHJfcGFzc3RociA9IExFR0FDWV9QQ007CkBAIC0xMzYzLDYgKzE3NzksMTggQEAKIAkJYnJlYWs7CiAJfQogCisJY2FzZSBTTkRfQVVESU9DT0RFQ19EVFM6IHsKKwkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19EVFNcbiIsIF9fZnVuY19fKTsKKwkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfRFRTOworCQlicmVhazsKKwl9CisKKwljYXNlIFNORF9BVURJT0NPREVDX0RTRDogeworCQlwcl9kZWJ1ZygiJXM6IFNORF9BVURJT0NPREVDX0RTRFxuIiwgX19mdW5jX18pOworCQlwcnRkLT5jb2RlYyA9IEZPUk1BVF9EU0Q7CisJCWJyZWFrOworCX0KKwogCWRlZmF1bHQ6CiAJCXByX2VycigiY29kZWMgbm90IHN1cHBvcnRlZCwgaWQgPSVkXG4iLCBwYXJhbXMtPmNvZGVjLmlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzc0LDEzICsxODAyLDEwIEBACiAJcHJ0ZC0+cGFydGlhbF9kcmFpbl9kZWxheSA9CiAJCW1zbV9jb21wcl9nZXRfcGFydGlhbF9kcmFpbl9kZWxheShmcmFtZV9zeiwgcHJ0ZC0+c2FtcGxlX3JhdGUpOwogCi0JbWVtY3B5KCZwcnRkLT5jb2RlY19wYXJhbSwgcGFyYW1zLCBzaXplb2Yoc3RydWN0IHNuZF9jb21wcl9wYXJhbXMpKTsKLQotCS8qIFRvRG86IHJlbW92ZSBkdXBsaWNhdGVzICovCi0JcHJ0ZC0+bnVtX2NoYW5uZWxzID0gcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuY2hfaW47Ci0JcHJ0ZC0+c2FtcGxlX3JhdGUgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5zYW1wbGVfcmF0ZTsKLQlwcl9kZWJ1ZygiJXM6IHNhbXBsZV9yYXRlICVkXG4iLCBfX2Z1bmNfXywgcHJ0ZC0+c2FtcGxlX3JhdGUpOwotCXJldCA9IG1zbV9jb21wcl9jb25maWd1cmVfZHNwKGNzdHJlYW0pOworCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fY29tcHJfY29uZmlndXJlX2RzcF9mb3JfcGxheWJhY2soY3N0cmVhbSk7CisJZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKQorCQlyZXQgPSBtc21fY29tcHJfY29uZmlndXJlX2RzcF9mb3JfY2FwdHVyZShjc3RyZWFtKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDYxLDkgKzE4ODYsOSBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPQogCQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQl1aW50MzJfdCAqdm9sdW1lID0gcGRhdGEtPnZvbHVtZVtydGQtPmRhaV9saW5rLT5iZV9pZF07CisJdWludDMyX3QgKnZvbHVtZSA9IHBkYXRhLT52b2x1bWVbcnRkLT5kYWlfbGluay0+aWRdOwogCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gcHJ0ZC0+YXVkaW9fY2xpZW50OwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBydGQtPmRhaV9saW5rLT5iZV9pZDsKKwl1bnNpZ25lZCBsb25nIGZlX2lkID0gcnRkLT5kYWlfbGluay0+aWQ7CiAJaW50IHJjID0gMDsKIAlpbnQgYnl0ZXNfdG9fd3JpdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0NzEsMTEgKzE4OTYsNiBAQAogCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKIAl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKIAotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gIT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7CiAJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lcnJvcikpIHsKIAkJcHJfZXJyKCIlcyBHb3QgUkVTRVQgRVZFTlRTIG5vdGlmaWNhdGlvbiwgcmV0dXJuIGltbWVkaWF0ZWx5IiwKQEAgLTE0OTAsMTcgKzE5MTAsMzAgQEAKIAkJcHJfZGVidWcoIiVzOiBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIiwgX19mdW5jX18pOwogCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7CiAKLQkJLyogc2V0IHZvbHVtZSBmb3IgdGhlIHN0cmVhbSBiZWZvcmUgUlVOICovCi0JCXJjID0gbXNtX2NvbXByX3NldF92b2x1bWUoY3N0cmVhbSwgdm9sdW1lWzBdLCB2b2x1bWVbMV0pOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzIDogU2V0IFZvbHVtZSBmYWlsZWQgOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOworCQkvKgorCQkgKiBjb21wcl9zZXRfdm9sdW1lIGFuZCBjb21wcl9pbml0X3BwX3BhcmFtcworCQkgKiBhcmUgdXNlZCB0byBjb25maWd1cmUgQVNNIHZvbHVtZSBoZW5jZSBub3QKKwkJICogbmVlZGVkIGZvciBjb21wcmVzcyBwYXNzdGhyb3VnaCBwbGF5YmFjay4KKwkJICoKKwkJICogY29tcHJlc3MgcGFzc3Rocm91Z2ggdm9sdW1lIGlzIGNvbnRyb2xsZWQgaW4KKwkJICogQURNIGJ5IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUoKQorCQkgKi8KKwkJaWYgKHBydGQtPmNvbXByX3Bhc3N0aHIgPT0gTEVHQUNZX1BDTSAmJgorCQkJY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgeworCQkJLyogc2V0IHZvbHVtZSBmb3IgdGhlIHN0cmVhbSBiZWZvcmUgUlVOICovCisJCQlyYyA9IG1zbV9jb21wcl9zZXRfdm9sdW1lKGNzdHJlYW0sCisJCQkJdm9sdW1lWzBdLCB2b2x1bWVbMV0pOworCQkJaWYgKHJjKQorCQkJCXByX2VycigiJXMgOiBTZXQgVm9sdW1lIGZhaWxlZCA6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOwogCi0JCXJjID0gbXNtX2NvbXByX2luaXRfcHBfcGFyYW1zKGNzdHJlYW0sIGFjKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlcyA6IGluaXQgUFAgcGFyYW1zIGZhaWxlZCA6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0KKwkJCXJjID0gbXNtX2NvbXByX2luaXRfcHBfcGFyYW1zKGNzdHJlYW0sIGFjKTsKKwkJCWlmIChyYykKKwkJCQlwcl9lcnIoIiVzIDogaW5pdCBQUCBwYXJhbXMgZmFpbGVkIDogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCX0gZWxzZSB7CisJCQltc21fY29tcHJfcmVhZF9idWZmZXIocHJ0ZCk7CisJCX0KIAkJLyogaXNzdWUgUlVOIGNvbW1hbmQgZm9yIHRoZSBzdHJlYW0gKi8KIAkJcTZhc21fcnVuX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOwogCQlicmVhazsKQEAgLTE1MTAsNiArMTk0MywxOCBAQAogCQkJCQlwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbik7CiAJCXN0cmVhbV9pZCA9IGFjLT5zdHJlYW1faWQ7CiAJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAwKTsKKwkJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkgeworCQkJcTZhc21fY21kX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9QQVVTRSk7CisJCQlhdG9taWNfc2V0KCZwcnRkLT54cnVuLCAwKTsKKwkJCXBydGQtPnJlY2VpdmVkX3RvdGFsID0gMDsKKwkJCXBydGQtPmJ5dGVzX2NvcGllZCA9IDA7CisJCQlwcnRkLT5ieXRlc19yZWFkID0gMDsKKwkJCXBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ID0gMDsKKwkJCXBydGQtPmJ5dGVfb2Zmc2V0ICA9IDA7CisJCQlwcnRkLT5hcHBfcG9pbnRlciAgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKHBydGQtPm5leHRfc3RyZWFtKSB7CiAJCQlwcl9kZWJ1ZygiJXM6IGludGVycnVwdCBuZXh0IHRyYWNrIHdhaXQgcXVldWVzXG4iLAogCQkJCQkJCQlfX2Z1bmNfXyk7CkBAIC0xNTE5LDggKzE5NjQsMTUgQEAKIAkJfQogCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVvcykpIHsKIAkJCXByX2RlYnVnKCIlczogaW50ZXJydXB0IGVvcyB3YWl0IHF1ZXVlcyIsIF9fZnVuY19fKTsKLQkJCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAxOwotCQkJd2FrZV91cCgmcHJ0ZC0+ZW9zX3dhaXQpOworCQkJLyoKKwkJCSAqIEdhcGxlc3MgcGxheWJhY2sgZG9lcyBub3Qgd2FpdCBmb3IgZW9zLCBkbyBub3Qgc2V0CisJCQkgKiBjbWRfaW50IGFuZCBkbyBub3Qgd2FrZSB1cCBlb3Nfd2FpdCBkdXJpbmcgZ2FwbGVzcworCQkJICogdHJhbnNpdGlvbgorCQkJICovCisJCQlpZiAoIXBydGQtPmdhcGxlc3Nfc3RhdGUuZ2FwbGVzc190cmFuc2l0aW9uKSB7CisJCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDE7CisJCQkJd2FrZV91cCgmcHJ0ZC0+ZW9zX3dhaXQpOworCQkJfQogCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAwKTsKIAkJfQogCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmRyYWluKSkgewpAQCAtMTYyOSw3ICsyMDgxLDcgQEAKIAkJCWlmIChwcnRkLT5sYXN0X2J1ZmZlcikgewogCQkJCXByX2RlYnVnKCIlczogbGFzdCBidWZmZXIgZHJhaW5cbiIsIF9fZnVuY19fKTsKIAkJCQlyYyA9IG1zbV9jb21wcl9kcmFpbl9idWZmZXIocHJ0ZCwgJmZsYWdzKTsKLQkJCQlpZiAocmMpIHsKKwkJCQlpZiAocmMgfHwgIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywKIAkJCQkJCQkJCWZsYWdzKTsKIAkJCQkJYnJlYWs7CkBAIC0xNjQ5LDcgKzIxMDEsNyBAQAogCQkJLyogd2FpdCBmb3IgdGhlIHplcm8gbGVuZ3RoIGJ1ZmZlciB0byBiZSByZXR1cm5lZCAqLwogCQkJcHJfZGVidWcoIiVzOiB6ZXJvIGxlbmd0aCBidWZmZXIgZHJhaW5cbiIsIF9fZnVuY19fKTsKIAkJCXJjID0gbXNtX2NvbXByX2RyYWluX2J1ZmZlcihwcnRkLCAmZmxhZ3MpOwotCQkJaWYgKHJjKSB7CisJCQlpZiAocmMgfHwgIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNjgzLDcgKzIxMzUsMTIgQEAKIAkJCXBydGQtPmFwcF9wb2ludGVyICA9IDA7CiAJCQlwcnRkLT5maXJzdF9idWZmZXIgPSAxOwogCQkJcHJ0ZC0+bGFzdF9idWZmZXIgPSAwOwotCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24gPSAxOworCQkJLyoKKwkJCSAqIFNldCBnYXBsZXNzIHRyYW5zaXRpb24gZmxhZyBvbmx5IGlmIEVPUyBoYXNuJ3QgYmVlbgorCQkJICogYWNrbm93bGVkZ2VkIGFscmVhZHkuCisJCQkgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZW9zKSkKKwkJCQlwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbiA9IDE7CiAJCQlwcnRkLT5tYXJrZXJfdGltZXN0YW1wID0gMDsKIAogCQkJLyoKQEAgLTE3MDcsNiArMjE2NCw3IEBACiAJCSAqIHN0cmVhbSBjYW4gYmUgdXNlZCBmb3IgZ2FwbGVzcyBwbGF5YmFjawogCQkgKi8KIAkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zZXRfbmV4dF9zdHJlYW1faWQgPSBmYWxzZTsKKwkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24gPSAwOwogCQlwcl9kZWJ1ZygiJXM6Q01EX0VPUyBzdHJlYW1faWQgJWRcbiIsIF9fZnVuY19fLCBhYy0+c3RyZWFtX2lkKTsKIAogCQlwcnRkLT5lb3NfYWNrID0gMDsKQEAgLTE3NTQsOCArMjIxMiwxNCBAQAogCQkJLyoKIAkJCSAqIENhY2hlIHRoaXMgdGltZSBhcyBsYXN0IGtub3duIHRpbWUKIAkJCSAqLwotCQkJcTZhc21fZ2V0X3Nlc3Npb25fdGltZShwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCSAgICAgICAmcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCk7CisJCQlpZiAocGRhdGEtPnVzZV9sZWdhY3lfYXBpKQorCQkJCXE2YXNtX2dldF9zZXNzaW9uX3RpbWVfbGVnYWN5KAorCQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQkJCSAgICAgICAmcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCk7CisJCQllbHNlCisJCQkJcTZhc21fZ2V0X3Nlc3Npb25fdGltZShwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJCQkgICAgICAgJnBydGQtPm1hcmtlcl90aW1lc3RhbXApOworCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwogCQkJLyoKIAkJCSAqIERvbid0IHJlc2V0IHRoZXNlIGFzIHRoZXNlIHZhcnMgbWFwIHRvCkBAIC0xODUxLDcgKzIzMTUsNyBAQAogCiAJCXByX2RlYnVnKCIlczogb3Blbl93cml0ZSBzdHJlYW1faWQgJWQgYml0c19wZXJfc2FtcGxlICVkIiwKIAkJCQlfX2Z1bmNfXywgc3RyZWFtX2lkLCBiaXRzX3Blcl9zYW1wbGUpOwotCQlyYyA9IHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YyKHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJcmMgPSBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92NChwcnRkLT5hdWRpb19jbGllbnQsCiAJCQkJcHJ0ZC0+Y29kZWMsIGJpdHNfcGVyX3NhbXBsZSwKIAkJCQlzdHJlYW1faWQsCiAJCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS51c2VfZHNwX2dhcGxlc3NfbW9kZSk7CkBAIC0xODgyLDU3ICsyMzQ2LDc3IEBACiB9CiAKIHN0YXRpYyBpbnQgbXNtX2NvbXByX3BvaW50ZXIoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKmFyZykKKwkJCQkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKmFyZykKIHsKIAlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgdHN0YW1wOwogCXVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CiAJaW50IHJjID0gMCwgZmlyc3RfYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdWludDMyX3QgZ2FwbGVzc190cmFuc2l0aW9uOwogCisJcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwogCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCW1lbXNldCgmdHN0YW1wLCAweDAsIHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcCkpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKIAl0c3RhbXAuc2FtcGxpbmdfcmF0ZSA9IHBydGQtPnNhbXBsZV9yYXRlOwogCXRzdGFtcC5ieXRlX29mZnNldCA9IHBydGQtPmJ5dGVfb2Zmc2V0OwotCXRzdGFtcC5jb3BpZWRfdG90YWwgPSBwcnRkLT5jb3BpZWRfdG90YWw7CisJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCisJCXRzdGFtcC5jb3BpZWRfdG90YWwgPSBwcnRkLT5jb3BpZWRfdG90YWw7CisJZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKQorCQl0c3RhbXAuY29waWVkX3RvdGFsID0gcHJ0ZC0+cmVjZWl2ZWRfdG90YWw7CiAJZmlyc3RfYnVmZmVyID0gcHJ0ZC0+Zmlyc3RfYnVmZmVyOwogCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZXJyb3IpKSB7Ci0JCXByX2VycigiJXMgR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24sIHJldHVybiBlcnJvciIsCisJCXByX2VycigiJXMgR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24sIHJldHVybiBlcnJvclxuIiwKIAkJCV9fZnVuY19fKTsKKwkJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCisJCQlydW50aW1lLT50b3RhbF9ieXRlc190cmFuc2ZlcnJlZCA9IHRzdGFtcC5jb3BpZWRfdG90YWw7CisJCWVsc2UKKwkJCXJ1bnRpbWUtPnRvdGFsX2J5dGVzX2F2YWlsYWJsZSA9IHRzdGFtcC5jb3BpZWRfdG90YWw7CiAJCXRzdGFtcC5wY21faW9fZnJhbWVzID0gMDsKIAkJbWVtY3B5KGFyZywgJnRzdGFtcCwgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfdHN0YW1wKSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTkVUUkVTRVQ7CiAJfQorCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7CiAKLQlnYXBsZXNzX3RyYW5zaXRpb24gPSBwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbjsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFF1ZXJ5IHRpbWVzdGFtcCBmcm9tIERTUCBpZiBzb21lIGRhdGEgaXMgd2l0aCBpdC4KLQkgKiBUaGlzIHByZXZlbnRzIHRpbWVvdXRzLgotCSAqLwotCWlmICghZmlyc3RfYnVmZmVyIHx8IGdhcGxlc3NfdHJhbnNpdGlvbikgeworCQlnYXBsZXNzX3RyYW5zaXRpb24gPSBwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwogCQlpZiAoZ2FwbGVzc190cmFuc2l0aW9uKQogCQkJcHJfZGVidWcoIiVzIHNlc3Npb24gdGltZSBpbiBnYXBsZXNzIHRyYW5zaXRpb24iLAotCQkJCSBfX2Z1bmNfXyk7CisJCQkJX19mdW5jX18pOworCQkvKgorCQkgKi0gRG8gbm90IHF1ZXJ5IGlmIG5vIGJ1ZmZlciBoYXMgYmVlbiBnaXZlbi4KKwkJICotIERvIG5vdCBxdWVyeSBvbiBhIGdhcGxlc3MgdHJhbnNpdGlvbi4KKwkJICogIFBsYXliYWNrIGZvciB0aGUgMm5kIHN0cmVhbSBjYW4gc3RhcnQgKHRodXMgcmV0dXJuaW5nIHRpbWUKKwkJICogIHN0YXJ0aW5nIGZyb20gMCkgYmVmb3JlIHRoZSBkcml2ZXIga25vd3MgYWJvdXQgRU9TIG9mIGZpcnN0CisJCSAqICBzdHJlYW0uCisJCSAqLworCQlpZiAoIWZpcnN0X2J1ZmZlciB8fCBnYXBsZXNzX3RyYW5zaXRpb24pIHsKIAotCQlyYyA9IHE2YXNtX2dldF9zZXNzaW9uX3RpbWUocHJ0ZC0+YXVkaW9fY2xpZW50LCAmdGltZXN0YW1wKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogR2V0IFNlc3Npb24gVGltZSByZXR1cm4gdmFsdWUgPSVsbGRcbiIsCi0JCQkJX19mdW5jX18sIHRpbWVzdGFtcCk7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSkKLQkJCQlyZXR1cm4gLUVORVRSRVNFVDsKKwkJCWlmIChwZGF0YS0+dXNlX2xlZ2FjeV9hcGkpCisJCQkJcmMgPSBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lX2xlZ2FjeSgKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQsICZwcnRkLT5tYXJrZXJfdGltZXN0YW1wKTsKIAkJCWVsc2UKLQkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCQlyYyA9IHE2YXNtX2dldF9zZXNzaW9uX3RpbWUoCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LCAmcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogR2V0IFNlc3Npb24gVGltZSByZXR1cm4gPSVsbGRcbiIsCisJCQkJCV9fZnVuY19fLCB0aW1lc3RhbXApOworCQkJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZXJyb3IpKQorCQkJCQlyZXR1cm4gLUVORVRSRVNFVDsKKwkJCQllbHNlCisJCQkJCXJldHVybiAtRUFHQUlOOworCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJdGltZXN0YW1wID0gcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwogCX0KKwl0aW1lc3RhbXAgPSBwcnRkLT5tYXJrZXJfdGltZXN0YW1wOwogCiAJLyogRFNQIHJldHVybnMgdGltZXN0YW1wIGluIHVzZWMgKi8KIAlwcl9kZWJ1ZygiJXM6IHRpbWVzdGFtcCA9ICVsbGQgdXNlY1xuIiwgX19mdW5jX18sIHRpbWVzdGFtcCk7CkBAIC0xOTkxLDggKzI0NzUsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jb3B5KHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IG1zbV9jb21wcl9wbGF5YmFja19jb3B5KHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCSAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKQEAgLTIwNTUsNiArMjUzOSw2MCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIGludCBtc21fY29tcHJfY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAorCQkJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKnNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiBjb3VudCA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50KTsKKwlpZiAoIXBydGQtPmJ1ZmZlcikgeworCQlwcl9lcnIoIiVzOiBCdWZmZXIgaXMgbm90IGFsbG9jYXRlZCB5ZXQgPz8iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lcnJvcikpIHsKKwkJcHJfZXJyKCIlcyBHb3QgUkVTRVQgRVZFTlRTIG5vdGlmaWNhdGlvbiIsIF9fZnVuY19fKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisKKwlzb3VyY2UgPSBwcnRkLT5idWZmZXIgKyBwcnRkLT5hcHBfcG9pbnRlcjsKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSB0byBjb3B5IHRvIHVzZXIqLworCWlmIChjb3VudCA8PSBwcnRkLT5yZWNlaXZlZF90b3RhbCAtIHBydGQtPmJ5dGVzX2NvcGllZCkJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzb3VyY2UsIGNvdW50KSkgeworCQkJcHJfZXJyKCJjb3B5X3RvX3VzZXIgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCQlwcnRkLT5hcHBfcG9pbnRlciArPSBjb3VudDsKKwkJaWYgKHBydGQtPmFwcF9wb2ludGVyID49IHBydGQtPmJ1ZmZlcl9zaXplKQorCQkJcHJ0ZC0+YXBwX3BvaW50ZXIgLT0gcHJ0ZC0+YnVmZmVyX3NpemU7CisJCXBydGQtPmJ5dGVzX2NvcGllZCArPSBjb3VudDsKKwl9CisJbXNtX2NvbXByX3JlYWRfYnVmZmVyKHBydGQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtc21fY29tcHJfY29weShzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKKwkJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiIEluICVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCisJCXJldCA9IG1zbV9jb21wcl9wbGF5YmFja19jb3B5KGNzdHJlYW0sIGJ1ZiwgY291bnQpOworCWVsc2UgaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX2NvbXByX2NhcHR1cmVfY29weShjc3RyZWFtLCBidWYsIGNvdW50KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1zbV9jb21wcl9nZXRfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKIAkJCQlzdHJ1Y3Qgc25kX2NvbXByX2NhcHMgKmFyZykKIHsKQEAgLTIwNjcsNyArMjYwNSw3IEBACiAJCW1lbWNweShhcmcsICZwcnRkLT5jb21wcl9jYXAsIHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKIAl9IGVsc2UgewogCQlyZXQgPSAtRUlOVkFMOwotCQlwcl9lcnIoIiVzOiBhcmcgKDB4JXApLCBwcnRkICgweCVwKVxuIiwgX19mdW5jX18sIGFyZywgcHJ0ZCk7CisJCXByX2VycigiJXM6IGFyZyAoMHglcEspLCBwcnRkICgweCVwSylcbiIsIF9fZnVuY19fLCBhcmcsIHBydGQpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yMTIzLDYgKzI2NjEsMTAgQEAKIAkJYnJlYWs7CiAJY2FzZSBTTkRfQVVESU9DT0RFQ19BUEU6CiAJCWJyZWFrOworCWNhc2UgU05EX0FVRElPQ09ERUNfRFRTOgorCQlicmVhazsKKwljYXNlIFNORF9BVURJT0NPREVDX0RTRDoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCIlczogVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgJWRcbiIsCiAJCQlfX2Z1bmNfXywgY29kZWMtPmNvZGVjKTsKQEAgLTI2MDAsNiArMzE0Miw4IEBACiAJY2FzZSBGT1JNQVRfVk9SQklTOgogCWNhc2UgRk9STUFUX0FMQUM6CiAJY2FzZSBGT1JNQVRfQVBFOgorCWNhc2UgRk9STUFUX0RUUzoKKwljYXNlIEZPUk1BVF9EU0Q6CiAJCXByX2RlYnVnKCIlczogbm8gcnVudGltZSBwYXJhbWV0ZXJzIGZvciBjb2RlYzogJWRcbiIsIF9fZnVuY19fLAogCQkJIHBydGQtPmNvZGVjKTsKIAkJYnJlYWs7CkBAIC0yNjQ2LDcgKzMxOTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hcHBfdHlwZV9jZmdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKQEAgLTI2NjUsMjAgKzMyMDksMTExIEBACiAJYWNkYl9kZXZfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gIT0gMCkKIAkJc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQlwcl9kZWJ1ZygiJXM6IGFwcF90eXBlLSAlZCBhY2RiX2Rldl9pZC0gJWQgc2FtcGxlX3JhdGUtICVkXG4iLAotCQlfX2Z1bmNfXywgYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7CisJcHJfZGVidWcoIiVzOiBhcHBfdHlwZS0gJWQgYWNkYl9kZXZfaWQtICVkIHNhbXBsZV9yYXRlLSAlZCBzZXNzaW9uX3R5cGUtICVkXG4iLAorCQlfX2Z1bmNfXywgYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1JYKTsKIAltc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIGFwcF90eXBlLAotCQkJCQkJYWNkYl9kZXZfaWQsIHNhbXBsZV9yYXRlKTsKKwkJCWFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1JYKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hcHBfdHlwZV9jZmdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKKwl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYXBwX3R5cGU7CisJaW50IGFjZGJfZGV2X2lkOworCWludCBzYW1wbGVfcmF0ZTsKKworCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHVcbiIsIF9fZnVuY19fLCBmZV9pZCk7CisJaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7CisJCXByX2VycigiJXMgUmVjZWl2ZWQgb3V0IG9mIGJvdW5kcyBmZV9pZCAlbGx1XG4iLAorCQkJX19mdW5jX18sIGZlX2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgU0VTU0lPTl9UWVBFX1JYLAorCQkmYXBwX3R5cGUsICZhY2RiX2Rldl9pZCwgJnNhbXBsZV9yYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGFwcF90eXBlOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gYWNkYl9kZXZfaWQ7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPSBzYW1wbGVfcmF0ZTsKKwlwcl9kZWJ1ZygiJXM6IGZlZGFpX2lkICVsbHUsIHNlc3Npb25fdHlwZSAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKKwkJX19mdW5jX18sIGZlX2lkLCBTRVNTSU9OX1RZUEVfUlgsCisJCWFwcF90eXBlLCBhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2FwcF90eXBlX2NmZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBhcHBfdHlwZTsKKwlpbnQgYWNkYl9kZXZfaWQ7CisJaW50IHNhbXBsZV9yYXRlID0gNDgwMDA7CisKKwlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgeworCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWxsdVxuIiwKKwkJCV9fZnVuY19fLCBmZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFwcF90eXBlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJYWNkYl9kZXZfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gIT0gMCkKKwkJc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKwlwcl9kZWJ1ZygiJXM6IGFwcF90eXBlLSAlZCBhY2RiX2Rldl9pZC0gJWQgc2FtcGxlX3JhdGUtICVkIHNlc3Npb25fdHlwZS0gJWRcbiIsCisJCV9fZnVuY19fLCBhcHBfdHlwZSwgYWNkYl9kZXZfaWQsIHNhbXBsZV9yYXRlLCBTRVNTSU9OX1RZUEVfVFgpOworCW1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgYXBwX3R5cGUsCisJCWFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1RYKTsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2FwcF90eXBlX2NmZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCByZXQgPSAwOworCWludCBhcHBfdHlwZTsKKwlpbnQgYWNkYl9kZXZfaWQ7CisJaW50IHNhbXBsZV9yYXRlOworCisJcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdVxuIiwgX19mdW5jX18sIGZlX2lkKTsKKwlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlcyBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBTRVNTSU9OX1RZUEVfVFgsCisJCSZhcHBfdHlwZSwgJmFjZGJfZGV2X2lkLCAmc2FtcGxlX3JhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXBwX3R5cGU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhY2RiX2Rldl9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IHNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAorCQlfX2Z1bmNfXywgZmVfaWQsIFNFU1NJT05fVFlQRV9UWCwKKwkJYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbXNtX2NvbXByX2NoYW5uZWxfbWFwX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewpAQCAtMjc3Myw2ICszNDA4LDggQEAKIHsKIAlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YTsKIAlpbnQgaTsKKwlpbnQgcmM7CisJY29uc3QgY2hhciAqcWRzcF92ZXJzaW9uOwogCiAJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAJcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQpAQCAtMjc5NCw2ICszNDMxLDE3IEBACiAJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV9jb21wcl9nYXBsZXNzX2NvbnRyb2xzLAogCQkJCSAgICAgIEFSUkFZX1NJWkUobXNtX2NvbXByX2dhcGxlc3NfY29udHJvbHMpKTsKIAorCXJjID0gIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBsYXRmb3JtLT5kZXYtPm9mX25vZGUsCisJCSJxY29tLGFkc3AtdmVyc2lvbiIsICZxZHNwX3ZlcnNpb24pOworCWlmICghcmMpIHsKKwkJaWYgKCFzdHJjbXAocWRzcF92ZXJzaW9uLCAiTURTUCAxLjIiKSkKKwkJCXBkYXRhLT51c2VfbGVnYWN5X2FwaSA9IHRydWU7CisJCWVsc2UKKwkJCXBkYXRhLT51c2VfbGVnYWN5X2FwaSA9IGZhbHNlOworCX0gZWxzZQorCQlwZGF0YS0+dXNlX2xlZ2FjeV9hcGkgPSBmYWxzZTsKKworCXByX2RlYnVnKCIlczogdXNlIGxlZ2FjeSBhcGkgJWRcbiIsIF9fZnVuY19fLCBwZGF0YS0+dXNlX2xlZ2FjeV9hcGkpOwogCS8qCiAJICogdXNlX2RzcF9nYXBsZXNzX21vZGUgcGFydCBvZiBwbGF0Zm9ybSBkYXRhKHBkYXRhKSBpcyB1cGRhdGVkIGZyb20gSEFMCiAJICogdGhyb3VnaCBhIG1peGVyIGNvbnRyb2wgYmVmb3JlIGNvbXByZXNzIGRyaXZlciBpcyBvcGVuZWQuIFRoZSBtaXhlcgpAQCAtMjgxOCw3ICszNDY2LDcgQEAKIAkJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMTI4OworCXVpbmZvLT5jb3VudCA9IE1BWF9QUF9QQVJBTVNfU1o7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweEZGRkZGRkZGOwogCXJldHVybiAwOwpAQCAtMjg5MCw3ICszNTM4LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKIAkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAJY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDEgKwogCQkgIHN0cmxlbihzdWZmaXgpICsgMTsKQEAgLTI5MDIsNyArMzU1MCw3IEBACiAJc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQgJXMiLCBtaXhlcl9jdGxfbmFtZSwKIAkJIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7CiAJZmVfdm9sdW1lX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV92b2x1bWVfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+YmVfaWQ7CisJZmVfdm9sdW1lX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwogCXByX2RlYnVnKCJSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzIiwgbWl4ZXJfc3RyKTsKIAlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLCBmZV92b2x1bWVfY29udHJvbCwKIAkJCQkgICAgICBBUlJBWV9TSVpFKGZlX3ZvbHVtZV9jb250cm9sKSk7CkBAIC0yOTM1LDcgKzM1ODMsNyBAQAogCX0KIAogCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKIAkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAKIAljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMTsKQEAgLTI5NDcsNyArMzU5NSw3IEBACiAJc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQiLCBtaXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAKIAlmZV9hdWRpb19lZmZlY3RzX2NvbmZpZ19jb250cm9sWzBdLm5hbWUgPSBtaXhlcl9zdHI7Ci0JZmVfYXVkaW9fZWZmZWN0c19jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+YmVfaWQ7CisJZmVfYXVkaW9fZWZmZWN0c19jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7CiAJcHJfZGVidWcoIlJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXNcbiIsIG1peGVyX3N0cik7CiAJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKIAkJCQlmZV9hdWRpb19lZmZlY3RzX2NvbmZpZ19jb250cm9sLApAQCAtMjk3OSw3ICszNjI3LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKIAkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAJY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDE7CiAJbWl4ZXJfc3RyID0ga3phbGxvYyhjdGxfbGVuLCBHRlBfS0VSTkVMKTsKQEAgLTI5ODksNyArMzYzNyw3IEBACiAJfQogCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwogCWZlX3F1ZXJ5X2F1ZGlvX2VmZmVjdF9jb250cm9sWzBdLm5hbWUgPSBtaXhlcl9zdHI7Ci0JZmVfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmJlX2lkOworCWZlX3F1ZXJ5X2F1ZGlvX2VmZmVjdF9jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPSBydGQtPmRhaV9saW5rLT5pZDsKIAlwcl9kZWJ1ZygiJXM6IHJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXNcbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwogCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCiAJCQkJZmVfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2wsCkBAIC0zMDI0LDcgKzM2NzIsNyBAQAogCX0KIAogCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKIAkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAKIAljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMSArCkBAIC0zMDM4LDcgKzM2ODYsNyBAQAogCQkgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKIAogCWZlX2RlY19wYXJhbXNfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2RlY19wYXJhbXNfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+YmVfaWQ7CisJZmVfZGVjX3BhcmFtc19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPSBydGQtPmRhaV9saW5rLT5pZDsKIAlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgbmV3IG1peGVyIGN0bCAlcyIsIG1peGVyX3N0cik7CiAJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKIAkJCQkgICAgICBmZV9kZWNfcGFyYW1zX2NvbnRyb2wsCkBAIC0zMDQ5LDcgKzM2OTcsOCBAQAogCiBzdGF0aWMgaW50IG1zbV9jb21wcl9hZGRfYXBwX3R5cGVfY2ZnX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZQk9ICJBdWRpbyBTdHJlYW0iOworCWNvbnN0IGNoYXIgKnBsYXliYWNrX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSI7CisJY29uc3QgY2hhciAqY2FwdHVyZV9taXhlcl9jdGxfbmFtZQk9ICJBdWRpbyBTdHJlYW0gQ2FwdHVyZSI7CiAJY29uc3QgY2hhciAqZGV2aWNlTm8JCT0gIk5OIjsKIAljb25zdCBjaGFyICpzdWZmaXgJCT0gIkFwcCBUeXBlIENmZyI7CiAJY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKQEAgLTMwNjAsOCArMzcwOSw4IEBACiAJCS5uYW1lID0gIj8iLAogCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKIAkJLmluZm8gPSBtc21fY29tcHJfYXBwX3R5cGVfY2ZnX2luZm8sCi0JCS5wdXQgPSBtc21fY29tcHJfYXBwX3R5cGVfY2ZnX3B1dCwKLQkJLmdldCA9IG1zbV9jb21wcl9hcHBfdHlwZV9jZmdfZ2V0LAorCQkucHV0ID0gbXNtX2NvbXByX3BsYXliYWNrX2FwcF90eXBlX2NmZ19wdXQsCisJCS5nZXQgPSBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2dldCwKIAkJLnByaXZhdGVfdmFsdWUgPSAwLAogCQl9CiAJfTsKQEAgLTMwNzIsMjQgKzM3MjEsNDUgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiJXM6IGFkZGVkIG5ldyBjb21wciBGRSBjdGwgd2l0aCBuYW1lICVzLCBpZCAlZCwgY3B1IGRhaSAlcywgZGV2aWNlIG5vICVkXG4iLAotCQkgX19mdW5jX18sIHJ0ZC0+ZGFpX2xpbmstPm5hbWUsIHJ0ZC0+ZGFpX2xpbmstPmJlX2lkLAotCQkgcnRkLT5kYWlfbGluay0+Y3B1X2RhaV9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlKTsKKwkJX19mdW5jX18sIHJ0ZC0+ZGFpX2xpbmstPm5hbWUsIHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQkJcnRkLT5kYWlfbGluay0+Y3B1X2RhaV9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlKTsKKwlpZiAocnRkLT5jb21wci0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKKwkJY3RsX2xlbiA9IHN0cmxlbihwbGF5YmFja19taXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKQorCQkJICsgMSArIHN0cmxlbihzdWZmaXgpICsgMTsKKwllbHNlCisJCWN0bF9sZW4gPSBzdHJsZW4oY2FwdHVyZV9taXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKQorCQkJKyAxICsgc3RybGVuKHN1ZmZpeCkgKyAxOwogCi0JY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDEgKwotCQkgIHN0cmxlbihzdWZmaXgpICsgMTsKIAltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwogCiAJaWYgKCFtaXhlcl9zdHIpCiAJCXJldHVybiAwOwogCi0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQgJXMiLCBtaXhlcl9jdGxfbmFtZSwKLQkJIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7CisJaWYgKHJ0ZC0+Y29tcHItPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCisJCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkICVzIiwKKwkJCSBwbGF5YmFja19taXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKKwllbHNlCisJCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkICVzIiwKKwkJCSBjYXB0dXJlX21peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOworCiAJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9hcHBfdHlwZV9jZmdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+YmVfaWQ7CisJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOworCisJaWYgKHJ0ZC0+Y29tcHItPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKKwkJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2xbMF0ucHV0ID0KKwkJCQkJIG1zbV9jb21wcl9wbGF5YmFja19hcHBfdHlwZV9jZmdfcHV0OworCQlmZV9hcHBfdHlwZV9jZmdfY29udHJvbFswXS5nZXQgPQorCQkJCQkgbXNtX2NvbXByX3BsYXliYWNrX2FwcF90eXBlX2NmZ19nZXQ7CisJfSBlbHNlIHsKKwkJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2xbMF0ucHV0ID0KKwkJCQkJIG1zbV9jb21wcl9jYXB0dXJlX2FwcF90eXBlX2NmZ19wdXQ7CisJCWZlX2FwcF90eXBlX2NmZ19jb250cm9sWzBdLmdldCA9CisJCQkJCSBtc21fY29tcHJfY2FwdHVyZV9hcHBfdHlwZV9jZmdfZ2V0OworCX0KIAlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgbmV3IG1peGVyIGN0bCAlcyIsIG1peGVyX3N0cik7CiAJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKLQkJCQkgICAgICBmZV9hcHBfdHlwZV9jZmdfY29udHJvbCwKLQkJCQkgICAgICBBUlJBWV9TSVpFKGZlX2FwcF90eXBlX2NmZ19jb250cm9sKSk7CisJCQkJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2wsCisJCQkJQVJSQVlfU0laRShmZV9hcHBfdHlwZV9jZmdfY29udHJvbCkpOwogCWtmcmVlKG1peGVyX3N0cik7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTE5LDcgKzM3ODksNyBAQAogCX0KIAogCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5iZV9pZCwKKwkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKIAkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAKIAljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIHN0cmxlbihkZXZpY2VObykgKyAxOwpAQCAtMzEzMSwxNiArMzgwMSwxNiBAQAogCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzJWQiLCBtaXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7CiAKIAlmZV9jaGFubmVsX21hcF9jb250cm9sWzBdLm5hbWUgPSBtaXhlcl9zdHI7Ci0JZmVfY2hhbm5lbF9tYXBfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+YmVfaWQ7CisJZmVfY2hhbm5lbF9tYXBfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7CiAJcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKIAlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAogCQkJCWZlX2NoYW5uZWxfbWFwX2NvbnRyb2wsCiAJCQkJQVJSQVlfU0laRShmZV9jaGFubmVsX21hcF9jb250cm9sKSk7CiAKIAlwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0JcGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5iZV9pZF0gPQorCXBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdID0KIAkJIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY29tcHJfY2hfbWFwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmJlX2lkXSkgeworCWlmICghcGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5pZF0pIHsKIAkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY2hhbm5lbCBtYXBcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCWtmcmVlKG1peGVyX3N0cik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi1oZG1pLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi1oZG1pLXYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMThiMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXE2LWhkbWktdjIuYwpAQCAtMCwwICsxLDQ4OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+CisjaW5jbHVkZSA8c291bmQvbXNtLWRhaS1xNi12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2RlZmluZSBIRE1JX1JYX0NBX01BWCAweDMyCisKK2VudW0geworCVNUQVRVU19QT1JUX1NUQVJURUQsIC8qIHRyYWNrIGlmIEFGRSBwb3J0IGhhcyBzdGFydGVkICovCisJU1RBVFVTX01BWAorfTsKKworc3RydWN0IG1zbV9leHRfZGlzcF9jYSB7CisJYm9vbCBzZXRfY2E7CisJdTMyIGNhOworfTsKKworc3RydWN0IG1zbV9kYWlfcTZfaGRtaV9kYWlfZGF0YSB7CisJREVDTEFSRV9CSVRNQVAoc3RhdHVzX21hc2ssIFNUQVRVU19NQVgpOworCXUzMiByYXRlOworCXUzMiBjaGFubmVsczsKKwlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2NhIGNhOworCXVuaW9uIGFmZV9wb3J0X2NvbmZpZyBwb3J0X2NvbmZpZzsKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9leHRfZGlzcF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmICghZGFpX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogZGFpX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5kYXRhdHlwZSA9IHZhbHVlOworCXByX2RlYnVnKCIlczogdmFsdWUgPSAlZFxuIiwgX19mdW5jX18sIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZXh0X2Rpc3BfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWRhaV9kYXRhKSB7CisJCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5kYXRhdHlwZTsKKwlwcl9kZWJ1ZygiJXM6IHZhbHVlID0gJWxkXG4iLAorCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZXh0X2Rpc3BfY2FfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGFpX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogZGFpX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZGF0YS0+Y2EuY2EgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlkYWlfZGF0YS0+Y2Euc2V0X2NhID0gdHJ1ZTsKKwlwcl9kZWJ1ZygiJXM6IGNhID0gJWRcbiIsIF9fZnVuY19fLCBkYWlfZGF0YS0+Y2EuY2EpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZXh0X2Rpc3BfY2FfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGFpX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogZGFpX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhaV9kYXRhLT5jYS5jYTsKKwlwcl9kZWJ1ZygiJXM6IGNhID0gJWRcbiIsIF9fZnVuY19fLCBkYWlfZGF0YS0+Y2EuY2EpOworCXJldHVybiAwOworfQorCisvKiBIRE1JIGZvcm1hdCBmaWVsZCBmb3IgQUZFX1BPUlRfTVVMVElfQ0hBTl9IRE1JX0FVRElPX0lGX0NPTkZJRyBjb21tYW5kCisgKiAgMDogbGluZWFyIFBDTQorICogIDE6IG5vbi1saW5lYXIgUENNCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRtaV9mb3JtYXRbXSA9IHsKKwkiTFBDTSIsCisJIkNvbXByIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBoZG1pX2NvbmZpZ19lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBoZG1pX2Zvcm1hdCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGRtaV9jb25maWdfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIkhETUkgUlggRm9ybWF0IiwgaGRtaV9jb25maWdfZW51bVswXSwKKwkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9mb3JtYXRfZ2V0LAorCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2Zvcm1hdF9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJIRE1JIFJYIENBIiwgU05EX1NPQ19OT1BNLCAwLAorCQkJCSBIRE1JX1JYX0NBX01BWCwgMCwgMSwKKwkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9jYV9nZXQsCisJCQkJIG1zbV9kYWlfcTZfZXh0X2Rpc3BfY2FfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkaXNwbGF5X3BvcnRfY29uZmlnX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggRm9ybWF0IiwgaGRtaV9jb25maWdfZW51bVswXSwKKwkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9mb3JtYXRfZ2V0LAorCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2Zvcm1hdF9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEaXNwbGF5IFBvcnQgUlggQ0EiLCBTTkRfU09DX05PUE0sIDAsCisJCQkJIEhETUlfUlhfQ0FfTUFYLCAwLCAxLAorCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2NhX2dldCwKKwkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9jYV9wdXQpLAorfTsKKworLyogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIGh3X3BhcmFtIGlzIGNhbGxlZCBvbmNlCisgKiBUaGlzIG1heSBub3QgYmUgdGhlIGNhc2UgYnV0IHdoYXQgdG8gZG8gd2hlbiBBRE0gYW5kIEFGRQorICogcG9ydCBhcmUgYWxyZWFkeSBvcGVuZWQgYW5kIHBhcmFtZXRlciBjaGFuZ2VzCisgKi8KK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9oZG1pX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2gucmVzZXJ2ZWQgPSAwOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmhkbWlfY2ZnX21pbm9yX3ZlcnNpb24gPSAxOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7CisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5iaXRfd2lkdGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guYml0X3dpZHRoID0gMjQ7CisJCWJyZWFrOworCX0KKworCS8qcmVmZXIgdG8gSERNSSBzcGVjIENFQS04NjEtRTogVGFibGUgMjggQXVkaW8gSW5mb0ZyYW1lIERhdGEgQnl0ZSA0Ki8KKwlzd2l0Y2ggKGRhaV9kYXRhLT5jaGFubmVscykgeworCWNhc2UgMjoKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0gMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24gPSAweDAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmNoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MDY7CisJCWJyZWFrOworCWNhc2UgNToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0gMHgwQTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24gPSAweDBCOworCQlicmVhazsKKwljYXNlIDc6CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmNoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MTI7CisJCWJyZWFrOworCWNhc2UgODoKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0gMHgxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgImludmFsaWQgQ2hhbm5lbHMgPSAldVxuIiwKKwkJCQlkYWlfZGF0YS0+Y2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RiZyhkYWktPmRldiwgIiVzKCkgbWlub3IgdmVyc2lvbjogJXUgc2FtcGxlcmF0ZTogJXUgYml0d2lkdGg6ICV1XG4iCisJCSJudW1fY2ggPSAldSBjaGFubmVsX2FsbG9jYXRpb24gPSAldSBkYXRhdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guaGRtaV9jZmdfbWlub3JfdmVyc2lvbiwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guc2FtcGxlX3JhdGUsCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmJpdF93aWR0aCwKKwkJZGFpX2RhdGEtPmNoYW5uZWxzLAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmRhdGF0eXBlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG1zbV9kYWlfcTZfaGRtaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJaW50IHJjID0gMDsKKworCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlwcl9pbmZvKCIlczogIGFmZSBwb3J0IG5vdCBzdGFydGVkLiBkYWlfZGF0YS0+c3RhdHVzX21hc2sgPSAlbGRcbiIsCisJCSBfX2Z1bmNfXywgKmRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gY2xvc2UgQUZFIHBvcnRcbiIpOworCisJcHJfZGVidWcoIiVzOiBkYWlfZGF0YS0+c3RhdHVzX21hc2sgPSAlbGRcbiIsIF9fZnVuY19fLAorCQkJKmRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisKKwljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKK30KKworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfaGRtaV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJaW50IHJjID0gMDsKKworCWlmIChkYWlfZGF0YS0+Y2Euc2V0X2NhKQorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24gPQorCQkJCQkJCSAgICAgIGRhaV9kYXRhLT5jYS5jYTsKKworCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlyYyA9IGFmZV9wb3J0X3N0YXJ0KGRhaS0+aWQsICZkYWlfZGF0YS0+cG9ydF9jb25maWcsCisJCQkJICAgIGRhaV9kYXRhLT5yYXRlKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBvcGVuIEFGRSBwb3J0ICV4XG4iLAorCQkJCWRhaS0+aWQpOworCQllbHNlCisJCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fZGFpX3E2X2hkbWlfc2V0X2RhaV9pZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpZiAoIWRhaS0+ZHJpdmVyLT5pZCkgeworCQlkZXZfd2FybihkYWktPmRldiwgIkRBSSBkcml2ZXIgaWQgaXMgbm90IHNldFxuIik7CisJCXJldHVybjsKKwl9CisJZGFpLT5pZCA9IGRhaS0+ZHJpdmVyLT5pZDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhOworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb247CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCisJaWYgKCFkYWkgfHwgIWRhaS0+ZHJpdmVyKSB7CisJCXByX2VycigiJXM6IGRhaSBvciBkYWktPmRyaXZlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYWlfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEpLAorCQlHRlBfS0VSTkVMKTsKKworCWlmICghZGFpX2RhdGEpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIkRBSS0lZDogZmFpbCB0byBhbGxvY2F0ZSBkYWkgZGF0YVxuIiwKKwkJZGFpLT5pZCk7CisJCXJjID0gLUVOT01FTTsKKwl9IGVsc2UKKwkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBkYWlfZGF0YSk7CisKKwltc21fZGFpX3E2X2hkbWlfc2V0X2RhaV9pZChkYWkpOworCisJaWYgKGRhaS0+ZHJpdmVyLT5pZCA9PSBIRE1JX1JYKSB7CisJCWtjb250cm9sID0gJmhkbWlfY29uZmlnX2NvbnRyb2xzWzBdOworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOworCisJCWtjb250cm9sID0gJmhkbWlfY29uZmlnX2NvbnRyb2xzWzFdOworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOworCX0gZWxzZSBpZiAoZGFpLT5kcml2ZXItPmlkID09IERJU1BMQVlfUE9SVF9SWCkgeworCQlrY29udHJvbCA9ICZkaXNwbGF5X3BvcnRfY29uZmlnX2NvbnRyb2xzWzBdOworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOworCisJCWtjb250cm9sID0gJmRpc3BsYXlfcG9ydF9jb25maWdfY29udHJvbHNbMV07CisJCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAorCQkJCSBzbmRfY3RsX25ldzEoa2NvbnRyb2wsIGRhaV9kYXRhKSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBJbnZhbGlkIGlkOiVkXG4iLAorCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5pZCk7CisJCWtmcmVlKGRhaV9kYXRhKTsKKwkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBOVUxMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGFwbSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kYXBtKGRhaS0+Y29tcG9uZW50KTsKKwltZW1zZXQoJmludGVyY29uLCAwLCBzaXplb2YoaW50ZXJjb24pKTsKKwlpZiAoIXJjKSB7CisJCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKKwkJCWRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZSkgeworCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKKwkJCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZTsKKwkJCWludGVyY29uLnNpbmsgPSBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWU7CisJCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCisJCQkJICAgX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCQl9CisJCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgorCQkgICBkYWktPmRyaXZlci0+Y2FwdHVyZS5haWZfbmFtZSkgeworCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOworCQkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOworCQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWU7CisJCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCisJCQkJICAgX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YTsKKwlpbnQgcmM7CisKKwlkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCisKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7CisKKwkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJfQorCWtmcmVlKGRhaV9kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3E2X2hkbWlfb3BzID0geworCS5wcmVwYXJlCT0gbXNtX2RhaV9xNl9oZG1pX3ByZXBhcmUsCisJLmh3X3BhcmFtcwk9IG1zbV9kYWlfcTZfaGRtaV9od19wYXJhbXMsCisJLnNodXRkb3duCT0gbXNtX2RhaV9xNl9oZG1pX3NodXRkb3duLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9oZG1pX2hkbWlfcnhfZGFpID0geworCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkhETUkgUGxheWJhY2siLAorCQkuYWlmX25hbWUgPSAiSERNSSIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQkucmF0ZV9taW4gPSA0ODAwMCwKKwl9LAorCS5vcHMgPSAmbXNtX2RhaV9xNl9oZG1pX29wcywKKwkuaWQgPSBIRE1JX1JYLAorCS5wcm9iZSA9IG1zbV9kYWlfcTZfaGRtaV9kYWlfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfaGRtaV9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9kaXNwbGF5X3BvcnRfcnhfZGFpW10gPSB7CisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiRGlzcGxheSBQb3J0IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJESVNQTEFZX1BPUlQiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCisJCQkucmF0ZV9taW4gPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9oZG1pX29wcywKKwkJLmlkID0gRElTUExBWV9QT1JUX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2hkbWlfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9oZG1pX2RhaV9yZW1vdmUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9kYWlfaGRtaV9xNl9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gIm1zbS1kYWktcTYtaGRtaSIsCit9OworCisvKiBUbyBkbzogY2hhbmdlIHRvIHJlZ2lzdGVyIERBSXMgYXMgYmF0Y2ggKi8KK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9oZG1pX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYywgaWQ7CisJY29uc3QgY2hhciAqcTZfZGV2X2lkID0gInFjb20sbXNtLWRhaS1xNi1kZXYtaWQiOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgcTZfZGV2X2lkLCAmaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIHE2X2Rldl9pZCk7CisJCXJldHVybiByYzsKKwl9CisKKwlwZGV2LT5pZCA9IGlkOworCisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlcywgaWQ6JWRcbiIsIF9fZnVuY19fLAorCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIHBkZXYtPmlkKTsKKworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIEhETUlfUlg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX2hkbWlfcTZfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfcTZfaGRtaV9oZG1pX3J4X2RhaSwgMSk7CisJCWJyZWFrOworCWNhc2UgRElTUExBWV9QT1JUX1JYOgorCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkmbXNtX2RhaV9oZG1pX3E2X2NvbXBvbmVudCwKKwkJCSZtc21fZGFpX3E2X2Rpc3BsYXlfcG9ydF9yeF9kYWlbMF0sCisJCQlBUlJBWV9TSVpFKG1zbV9kYWlfcTZfZGlzcGxheV9wb3J0X3J4X2RhaSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGRldmljZSBJRCAlZFxuIiwgcGRldi0+aWQpOworCQlyYyA9IC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9oZG1pX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X2hkbWlfZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWhkbWkifSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9kYWlfcTZfaGRtaV9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9kYWlfcTZfaGRtaV9kcml2ZXIgPSB7CisJLnByb2JlICA9IG1zbV9kYWlfcTZfaGRtaV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfaGRtaV9kZXZfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1kYWktcTYtaGRtaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3E2X2hkbWlfZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9kYWlfcTZfaGRtaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9xNl9oZG1pX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fZGFpX3E2X2hkbWlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fZGFpX3E2X2hkbWlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2X2hkbWlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9kYWlfcTZfaGRtaV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBEU1AgSERNSSBEQUkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktcTYtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2UyZTdlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktcTYtdjIuYwpAQCAtMCwwICsxLDc4OTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsvbXNtLWNsay5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL21zbS1kYWktcTYtdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisKKyNkZWZpbmUgTVNNX0RBSV9QUklfQVVYUENNX0RUX0RFVl9JRCAxCisjZGVmaW5lIE1TTV9EQUlfU0VDX0FVWFBDTV9EVF9ERVZfSUQgMgorI2RlZmluZSBNU01fREFJX1RFUlRfQVVYUENNX0RUX0RFVl9JRCAzCisjZGVmaW5lIE1TTV9EQUlfUVVBVF9BVVhQQ01fRFRfREVWX0lEIDQKKworCisjZGVmaW5lIHNwZGlmX2Nsb2NrX3ZhbHVlKHJhdGUpICgyKnJhdGUqMzIqMikKKyNkZWZpbmUgQ0hBTk5FTF9TVEFUVVNfU0laRSAyNAorI2RlZmluZSBDSEFOTkVMX1NUQVRVU19NQVNLX0lOSVQgMHgwCisjZGVmaW5lIENIQU5ORUxfU1RBVFVTX01BU0sgMHg0CisjZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DTE9DS19TRVQgMQorCisjZGVmaW5lIERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitlbnVtIHsKKwlFTkNfRk1UX05PTkUsCisJRU5DX0ZNVF9TQkMgPSBBU01fTUVESUFfRk1UX1NCQywKKwlFTkNfRk1UX0FBQ19WMiA9IEFTTV9NRURJQV9GTVRfQUFDX1YyLAorCUVOQ19GTVRfQVBUWCA9IEFTTV9NRURJQV9GTVRfQVBUWCwKKwlFTkNfRk1UX0FQVFhfSEQgPSBBU01fTUVESUFfRk1UX0FQVFhfSEQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmZV9jbGtfc2V0IGxwYXNzX2Nsa19zZXRfZGVmYXVsdCA9IHsKKwlBRkVfQVBJX1ZFUlNJT05fQ0xPQ0tfU0VULAorCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfUENNX0lCSVQsCisJUTZBRkVfTFBBU1NfT1NSX0NMS18yX1AwNDhfTUhaLAorCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAorCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCisJMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZlX2Nsa19jZmcgbHBhc3NfY2xrX2NmZ19kZWZhdWx0ID0geworCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAorCVE2QUZFX0xQQVNTX09TUl9DTEtfMl9QMDQ4X01IWiwKKwkwLAorCVE2QUZFX0xQQVNTX0NMS19TUkNfSU5URVJOQUwsCisJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwlRNkFGRV9MUEFTU19NT0RFX0NMSzFfVkFMSUQsCisJMCwKK307CitlbnVtIHsKKwlTVEFUVVNfUE9SVF9TVEFSVEVELCAvKiB0cmFjayBpZiBBRkUgcG9ydCBoYXMgc3RhcnRlZCAqLworCS8qIHRyYWNrIEFGRSBUeCBwb3J0IHN0YXR1cyBmb3IgYmktZGlyZWN0aW9uYWwgdHJhbnNmZXJzICovCisJU1RBVFVTX1RYX1BPUlQsCisJLyogdHJhY2sgQUZFIFJ4IHBvcnQgc3RhdHVzIGZvciBiaS1kaXJlY3Rpb25hbCB0cmFuc2ZlcnMgKi8KKwlTVEFUVVNfUlhfUE9SVCwKKwlTVEFUVVNfTUFYCit9OworCitlbnVtIHsKKwlSQVRFXzhLSFosCisJUkFURV8xNktIWiwKKwlSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUywKK307CisKK2VudW0geworCUlEWF9QUklNQVJZX1RETV9SWF8wLAorCUlEWF9QUklNQVJZX1RETV9SWF8xLAorCUlEWF9QUklNQVJZX1RETV9SWF8yLAorCUlEWF9QUklNQVJZX1RETV9SWF8zLAorCUlEWF9QUklNQVJZX1RETV9SWF80LAorCUlEWF9QUklNQVJZX1RETV9SWF81LAorCUlEWF9QUklNQVJZX1RETV9SWF82LAorCUlEWF9QUklNQVJZX1RETV9SWF83LAorCUlEWF9QUklNQVJZX1RETV9UWF8wLAorCUlEWF9QUklNQVJZX1RETV9UWF8xLAorCUlEWF9QUklNQVJZX1RETV9UWF8yLAorCUlEWF9QUklNQVJZX1RETV9UWF8zLAorCUlEWF9QUklNQVJZX1RETV9UWF80LAorCUlEWF9QUklNQVJZX1RETV9UWF81LAorCUlEWF9QUklNQVJZX1RETV9UWF82LAorCUlEWF9QUklNQVJZX1RETV9UWF83LAorCUlEWF9TRUNPTkRBUllfVERNX1JYXzAsCisJSURYX1NFQ09OREFSWV9URE1fUlhfMSwKKwlJRFhfU0VDT05EQVJZX1RETV9SWF8yLAorCUlEWF9TRUNPTkRBUllfVERNX1JYXzMsCisJSURYX1NFQ09OREFSWV9URE1fUlhfNCwKKwlJRFhfU0VDT05EQVJZX1RETV9SWF81LAorCUlEWF9TRUNPTkRBUllfVERNX1JYXzYsCisJSURYX1NFQ09OREFSWV9URE1fUlhfNywKKwlJRFhfU0VDT05EQVJZX1RETV9UWF8wLAorCUlEWF9TRUNPTkRBUllfVERNX1RYXzEsCisJSURYX1NFQ09OREFSWV9URE1fVFhfMiwKKwlJRFhfU0VDT05EQVJZX1RETV9UWF8zLAorCUlEWF9TRUNPTkRBUllfVERNX1RYXzQsCisJSURYX1NFQ09OREFSWV9URE1fVFhfNSwKKwlJRFhfU0VDT05EQVJZX1RETV9UWF82LAorCUlEWF9TRUNPTkRBUllfVERNX1RYXzcsCisJSURYX1RFUlRJQVJZX1RETV9SWF8wLAorCUlEWF9URVJUSUFSWV9URE1fUlhfMSwKKwlJRFhfVEVSVElBUllfVERNX1JYXzIsCisJSURYX1RFUlRJQVJZX1RETV9SWF8zLAorCUlEWF9URVJUSUFSWV9URE1fUlhfNCwKKwlJRFhfVEVSVElBUllfVERNX1JYXzUsCisJSURYX1RFUlRJQVJZX1RETV9SWF82LAorCUlEWF9URVJUSUFSWV9URE1fUlhfNywKKwlJRFhfVEVSVElBUllfVERNX1RYXzAsCisJSURYX1RFUlRJQVJZX1RETV9UWF8xLAorCUlEWF9URVJUSUFSWV9URE1fVFhfMiwKKwlJRFhfVEVSVElBUllfVERNX1RYXzMsCisJSURYX1RFUlRJQVJZX1RETV9UWF80LAorCUlEWF9URVJUSUFSWV9URE1fVFhfNSwKKwlJRFhfVEVSVElBUllfVERNX1RYXzYsCisJSURYX1RFUlRJQVJZX1RETV9UWF83LAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF8wLAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF8xLAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF8yLAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF8zLAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF80LAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF81LAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF82LAorCUlEWF9RVUFURVJOQVJZX1RETV9SWF83LAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF8wLAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF8xLAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF8yLAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF8zLAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF80LAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF81LAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF82LAorCUlEWF9RVUFURVJOQVJZX1RETV9UWF83LAorCUlEWF9URE1fTUFYLAorfTsKKworZW51bSB7CisJSURYX0dST1VQX1BSSU1BUllfVERNX1JYLAorCUlEWF9HUk9VUF9QUklNQVJZX1RETV9UWCwKKwlJRFhfR1JPVVBfU0VDT05EQVJZX1RETV9SWCwKKwlJRFhfR1JPVVBfU0VDT05EQVJZX1RETV9UWCwKKwlJRFhfR1JPVVBfVEVSVElBUllfVERNX1JYLAorCUlEWF9HUk9VUF9URVJUSUFSWV9URE1fVFgsCisJSURYX0dST1VQX1FVQVRFUk5BUllfVERNX1JYLAorCUlEWF9HUk9VUF9RVUFURVJOQVJZX1RETV9UWCwKKwlJRFhfR1JPVVBfVERNX01BWCwKK307CisKK3N0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhIHsKKwlERUNMQVJFX0JJVE1BUChzdGF0dXNfbWFzaywgU1RBVFVTX01BWCk7CisJREVDTEFSRV9CSVRNQVAoaHdmcmVlX3N0YXR1cywgU1RBVFVTX01BWCk7CisJdTMyIHJhdGU7CisJdTMyIGNoYW5uZWxzOworCXUzMiBiaXR3aWR0aDsKKwl1MzIgY2FsX21vZGU7CisJdTMyIGFmZV9pbl9jaGFubmVsczsKKwl1MTYgYWZlX2luX2JpdGZvcm1hdDsKKwlzdHJ1Y3QgYWZlX2VuY19jb25maWcgZW5jX2NvbmZpZzsKKwl1bmlvbiBhZmVfcG9ydF9jb25maWcgcG9ydF9jb25maWc7Cit9OworCitzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSB7CisJREVDTEFSRV9CSVRNQVAoc3RhdHVzX21hc2ssIFNUQVRVU19NQVgpOworCXUzMiByYXRlOworCXUzMiBjaGFubmVsczsKKwl1MzIgYml0d2lkdGg7CisJc3RydWN0IGFmZV9zcGRpZl9wb3J0X2NvbmZpZyBzcGRpZl9wb3J0OworfTsKKworc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfY29uZmlnIHsKKwl1MTYgcGRhdGFfbWkyc19saW5lczsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSBtaTJzX2RhaV9kYXRhOworfTsKKworc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSB7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfY29uZmlnIHR4X2RhaTsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9taTJzX2RhaV9jb25maWcgcnhfZGFpOworfTsKKworc3RydWN0IG1zbV9kYWlfcTZfYXV4cGNtX2RhaV9kYXRhIHsKKwkvKiBCSVRNQVAgdG8gdHJhY2sgUnggYW5kIFR4IHBvcnQgdXNhZ2UgY291bnQgKi8KKwlERUNMQVJFX0JJVE1BUChhdXhwY21fcG9ydF9zdGF0dXMsIFNUQVRVU19NQVgpOworCXN0cnVjdCBtdXRleCBybG9jazsgLyogYXV4cGNtIGRldiByZXNvdXJjZSBsb2NrICovCisJdTE2IHJ4X3BpZDsgLyogQVVYUENNIFJYIEFGRSBwb3J0IElEICovCisJdTE2IHR4X3BpZDsgLyogQVVYUENNIFRYIEFGRSBwb3J0IElEICovCisJdTE2IGFmZV9jbGtfdmVyOworCXN0cnVjdCBhZmVfY2xrX2NmZyBjbGtfY2ZnOyAvKiBob2xkIExQQVNTIGNsb2NrIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgYWZlX2Nsa19zZXQgY2xrX3NldDsgLyogaG9sZCBMUEFTUyBjbG9jayBjb25maWd1cmF0aW9uICovCisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgYmRhaV9kYXRhOyAvKiBpbmNvcG9yYXRlIGJhc2UgREFJIGRhdGEgKi8KK307CisKK3N0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSB7CisJREVDTEFSRV9CSVRNQVAoc3RhdHVzX21hc2ssIFNUQVRVU19NQVgpOworCXUzMiByYXRlOworCXUzMiBjaGFubmVsczsKKwl1MzIgYml0d2lkdGg7CisJc3RydWN0IGFmZV9jbGtfc2V0IGNsa19zZXQ7IC8qIGhvbGQgTFBBU1MgY2xvY2sgY29uZmlnLiAqLworCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyBncm91cF9jZmc7IC8qIGhvbGQgdGRtIGdyb3VwIGNvbmZpZyAqLworCXN0cnVjdCBhZmVfdGRtX3BvcnRfY29uZmlnIHBvcnRfY2ZnOyAvKiBob2xkIHRkbSBjb25maWcgKi8KK307CisKKy8qIE1JMlMgZm9ybWF0IGZpZWxkIGZvciBBRkVfUE9SVF9DTURfSTJTX0NPTkZJRyBjb21tYW5kCisgKiAgMDogbGluZWFyIFBDTQorICogIDE6IG5vbi1saW5lYXIgUENNCisgKiAgMjogUENNIGRhdGEgaW4gSUVDIDYwOTY4IGNvbnRhaW5lcgorICogIDM6IGNvbXByZXNzZWQgZGF0YSBpbiBJRUMgNjA5NTggY29udGFpbmVyCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaTJzX2Zvcm1hdFtdID0geworCSJMUENNIiwKKwkiQ29tcHIiLAorCSJMUENNLTYwOTU4IiwKKwkiQ29tcHItNjA5NTgiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pMnNfY29uZmlnX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIG1pMnNfZm9ybWF0KSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzYl9mb3JtYXRbXSA9IHsKKwkiVU5QQUNLRUQiLAorCSJQQUNLRURfMTZCIiwKKwkiRFNEX0RPUCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX2NvbmZpZ19lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFX0VYVCgzLCBzYl9mb3JtYXQpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRkbV9kYXRhX2Zvcm1hdFtdID0geworCSJMUENNIiwKKwkiQ29tcHIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRkbV9oZWFkZXJfdHlwZVtdID0geworCSJJbnZhbGlkIiwKKwkiRGVmYXVsdCIsCisJIkVudGVydGFpbm1lbnQiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0ZG1fY29uZmlnX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHRkbV9kYXRhX2Zvcm1hdCksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgzLCB0ZG1faGVhZGVyX3R5cGUpLAorfTsKKworc3RhdGljIERFRklORV9NVVRFWCh0ZG1fbXV0ZXgpOworCitzdGF0aWMgYXRvbWljX3QgdGRtX2dyb3VwX3JlZltJRFhfR1JPVVBfVERNX01BWF07CisKKy8qIGNhY2hlIG9mIGdyb3VwIGNmZyBwZXIgcGFyZW50IG5vZGUgKi8KK3N0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2lkX2dyb3VwX2RldmljZV90ZG1fY2ZnIHRkbV9ncm91cF9jZmcgPSB7CisJQUZFX0FQSV9WRVJTSU9OX0dST1VQX0RFVklDRV9URE1fQ09ORklHLAorCUFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fUlgsCisJMCwKKwl7QUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlgsCisJQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSwKKwlBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yLAorCUFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzMsCisJQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCwKKwlBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81LAorCUFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzYsCisJQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfN30sCisJOCwKKwk0ODAwMCwKKwkzMiwKKwk4LAorCTMyLAorCTB4RkYsCit9OworCitzdGF0aWMgc3RydWN0IGFmZV9jbGtfc2V0IHRkbV9jbGtfc2V0ID0geworCUFGRV9BUElfVkVSU0lPTl9DTE9DS19TRVQsCisJUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfVERNX0VCSVQsCisJUTZBRkVfTFBBU1NfSUJJVF9DTEtfRElTQUJMRSwKKwlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0lOVkVSVF9DT1VQTEVfTk8sCisJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKKwkwLAorfTsKKworaW50IG1zbV9kYWlfcTZfZ2V0X2dyb3VwX2lkeCh1MTYgaWQpCit7CisJc3dpdGNoIChpZCkgeworCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9HUk9VUF9QUklNQVJZX1RETV9SWDsKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6CisJCXJldHVybiBJRFhfR1JPVVBfUFJJTUFSWV9URE1fVFg7CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0dST1VQX1NFQ09OREFSWV9URE1fUlg7CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0dST1VQX1NFQ09OREFSWV9URE1fVFg7CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1RFUlRJQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0dST1VQX1RFUlRJQVJZX1RETV9SWDsKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6CisJCXJldHVybiBJRFhfR1JPVVBfVEVSVElBUllfVERNX1RYOworCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9HUk9VUF9RVUFURVJOQVJZX1RETV9SWDsKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6CisJCXJldHVybiBJRFhfR1JPVVBfUVVBVEVSTkFSWV9URE1fVFg7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitpbnQgbXNtX2RhaV9xNl9nZXRfcG9ydF9pZHgodTE2IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCQlyZXR1cm4gSURYX1BSSU1BUllfVERNX1JYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF8wOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF8xOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF8xOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF80OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF80OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNToKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF81OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF82OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF83OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKKwkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9UWF83OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMToKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6CisJCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9UWF8xOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fUlhfMjsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6CisJCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF8zOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfMzsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6CisJCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9UWF80OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fUlhfNTsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6CisJCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF82OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfNjsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6CisJCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9UWF83OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF8wOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9UWF8wOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6CisJCXJldHVybiBJRFhfVEVSVElBUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKKwkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6CisJCXJldHVybiBJRFhfVEVSVElBUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKKwkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fUlhfMzsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6CisJCXJldHVybiBJRFhfVEVSVElBUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKKwkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6CisJCXJldHVybiBJRFhfVEVSVElBUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKKwkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fUlhfNjsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6CisJCXJldHVybiBJRFhfVEVSVElBUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKKwkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCQlyZXR1cm4gSURYX1FVQVRFUk5BUllfVERNX1JYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF8wOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF8xOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF8xOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF80OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF80OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNToKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF81OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF82OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF83OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKKwkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9UWF83OworCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHUxNiBtc21fZGFpX3E2X21heF9udW1fc2xvdChpbnQgZnJhbWVfcmF0ZSkKK3sKKwkvKiBNYXggbnVtIG9mIHNsb3RzIGlzIGJpdHMgcGVyIGZyYW1lIGRpdmlkZWQKKwkgKiBieSBiaXRzIHBlciBzYW1wbGUgd2hpY2ggaXMgMTYKKwkgKi8KKwlzd2l0Y2ggKGZyYW1lX3JhdGUpIHsKKwljYXNlIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV84OgorCQlyZXR1cm4gMDsKKwljYXNlIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8xNjoKKwkJcmV0dXJuIDE7CisJY2FzZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMzI6CisJCXJldHVybiAyOworCWNhc2UgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzY0OgorCQlyZXR1cm4gNDsKKwljYXNlIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8xMjg6CisJCXJldHVybiA4OworCWNhc2UgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzI1NjoKKwkJcmV0dXJuIDE2OworCWRlZmF1bHQ6CisJCXByX2VycigiJXMgSW52YWxpZCBiaXRzIHBlciBmcmFtZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBmcmFtZV9yYXRlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX2FkZF9yb3V0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKKworCWlmICghZGFpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIGRhaVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFkYWktPmRyaXZlcikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBkYWkgZHJpdmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYXBtID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RhcG0oZGFpLT5jb21wb25lbnQpOworCW1lbXNldCgmaW50ZXJjb24sIDAsIHNpemVvZihpbnRlcmNvbikpOworCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKKwkJZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lKSB7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlczogYWRkIHJvdXRlIGZvciB3aWRnZXQgJXMiLAorCQkJCV9fZnVuY19fLCBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUpOworCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+cGxheWJhY2suYWlmX25hbWU7CisJCWludGVyY29uLnNpbmsgPSBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWU7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlczogc3JjICVzIHNpbmsgJXNcbiIsCisJCQkJX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sICZpbnRlcmNvbiwgMSk7CisJfQorCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgorCQlkYWktPmRyaXZlci0+Y2FwdHVyZS5haWZfbmFtZSkgeworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOworCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWU7CisJCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lOworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IHNyYyAlcyBzaW5rICVzXG4iLAorCQkJCV9fZnVuY19fLCBpbnRlcmNvbi5zb3VyY2UsIGludGVyY29uLnNpbmspOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2F1eHBjbV9od19wYXJhbXMoCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfYXV4cGNtX2RhaV9kYXRhICphdXhfZGFpX2RhdGEgPQorCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSAmYXV4X2RhaV9kYXRhLT5iZGFpX2RhdGE7CisJc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhICphdXhwY21fcGRhdGEgPQorCQkJKHN0cnVjdCBtc21fZGFpX2F1eHBjbV9wZGF0YSAqKSBkYWktPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQgcmMgPSAwLCBzbG90X21hcHBpbmdfY29weV9sZW4gPSAwOworCisJaWYgKHBhcmFtc19jaGFubmVscyhwYXJhbXMpICE9IDEgfHwgKHBhcmFtc19yYXRlKHBhcmFtcykgIT0gODAwMCAmJgorCSAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICE9IDE2MDAwKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgcGFyYW0gY2hhbiAlZCByYXRlICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTVEFUVVNfUlhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKSB7CisJCS8qIEFVWFBDTSBEQUkgaW4gdXNlICovCisJCWlmIChkYWlfZGF0YS0+cmF0ZSAhPSBwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IHJhdGUgbWlzbWF0Y2ggb2YgcnVubmluZyBEQUlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhdXhfZGFpX2RhdGEtPnJsb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCWlmIChkYWlfZGF0YS0+cmF0ZSA9PSA4MDAwKSB7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20ucGNtX2NmZ19taW5vcl92ZXJzaW9uID0KKwkJCQlBRkVfQVBJX1ZFUlNJT05fUENNX0NPTkZJRzsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5hdXhfbW9kZSA9IGF1eHBjbV9wZGF0YS0+bW9kZV84ay5tb2RlOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnN5bmNfc3JjID0gYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnN5bmM7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uZnJhbWVfc2V0dGluZyA9CisJCQkJCWF1eHBjbV9wZGF0YS0+bW9kZV84ay5mcmFtZTsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5xdWFudHlwZSA9CisJCQkJCSBhdXhwY21fcGRhdGEtPm1vZGVfOGsucXVhbnQ7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uY3RybF9kYXRhX291dF9lbmFibGUgPQorCQkJCQkgYXV4cGNtX3BkYXRhLT5tb2RlXzhrLmRhdGE7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uYml0X3dpZHRoID0gMTY7CisJCWlmIChBUlJBWV9TSVpFKGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZykgPD0KKwkJICAgIGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMpCisJCQlzbG90X21hcHBpbmdfY29weV9sZW4gPQorCQkJCUFSUkFZX1NJWkUoCisJCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nKQorCQkJCSAqIHNpemVvZih1aW50MTZfdCk7CisJCWVsc2UKKwkJCXNsb3RfbWFwcGluZ19jb3B5X2xlbiA9IGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMKKwkJCQkqIHNpemVvZih1aW50MTZfdCk7CisKKwkJaWYgKGF1eHBjbV9wZGF0YS0+bW9kZV84ay5zbG90X21hcHBpbmcpIHsKKwkJCW1lbWNweShkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNsb3RfbnVtYmVyX21hcHBpbmcsCisJCQkgICAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnNsb3RfbWFwcGluZywKKwkJCSAgICAgICBzbG90X21hcHBpbmdfY29weV9sZW4pOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzIDhraHogc2xvdCBtYXBwaW5nIGlzIE5VTExcbiIsCisJCQkJX19mdW5jX18pOworCQkJbXV0ZXhfdW5sb2NrKCZhdXhfZGFpX2RhdGEtPnJsb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5wY21fY2ZnX21pbm9yX3ZlcnNpb24gPQorCQkJCUFGRV9BUElfVkVSU0lPTl9QQ01fQ09ORklHOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmF1eF9tb2RlID0KKwkJCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5tb2RlOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnN5bmNfc3JjID0KKwkJCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5zeW5jOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmZyYW1lX3NldHRpbmcgPQorCQkJCQlhdXhwY21fcGRhdGEtPm1vZGVfMTZrLmZyYW1lOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnF1YW50eXBlID0KKwkJCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5xdWFudDsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5jdHJsX2RhdGFfb3V0X2VuYWJsZSA9CisJCQkJCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuZGF0YTsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOworCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLm51bV9jaGFubmVscyA9IGRhaV9kYXRhLT5jaGFubmVsczsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5iaXRfd2lkdGggPSAxNjsKKwkJaWYgKEFSUkFZX1NJWkUoZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nKSA8PQorCQkgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMpCisJCQlzbG90X21hcHBpbmdfY29weV9sZW4gPQorCQkJCUFSUkFZX1NJWkUoCisJCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nKQorCQkJCSAqIHNpemVvZih1aW50MTZfdCk7CisJCWVsc2UKKwkJCXNsb3RfbWFwcGluZ19jb3B5X2xlbiA9IGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzCisJCQkJKiBzaXplb2YodWludDE2X3QpOworCisJCWlmIChhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZykgeworCQkJbWVtY3B5KGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZywKKwkJCSAgICAgICBhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZywKKwkJCSAgICAgICBzbG90X21hcHBpbmdfY29weV9sZW4pOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzIDE2a2h6IHNsb3QgbWFwcGluZyBpcyBOVUxMXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogYXV4X21vZGUgMHgleCBzeW5jX3NyYyAweCV4IGZyYW1lX3NldHRpbmcgMHgleFxuIiwKKwkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uYXV4X21vZGUsCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc3luY19zcmMsCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uZnJhbWVfc2V0dGluZyk7CisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBxdHlwZSAweCV4IGRvdXQgMHgleCBudW1fbWFwWzBdIDB4JXhcbiIKKwkJIm51bV9tYXBbMV0gMHgleCBudW1fbWFwWzJdIDB4JXggbnVtX21hcFszXSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5xdWFudHlwZSwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5jdHJsX2RhdGFfb3V0X2VuYWJsZSwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nWzBdLAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNsb3RfbnVtYmVyX21hcHBpbmdbMV0sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZ1syXSwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nWzNdKTsKKworCW11dGV4X3VubG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoCisJCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqYXV4X2RhaV9kYXRhLAorCQl1MTYgcG9ydF9pZCwgYm9vbCBlbmFibGUpCit7CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzOiBhZmVfY2xrX3ZlcjogJWQsIHBvcnRfaWQ6ICVkLCBlbmFibGU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGF1eF9kYWlfZGF0YS0+YWZlX2Nsa192ZXIsIHBvcnRfaWQsIGVuYWJsZSk7CisJaWYgKGF1eF9kYWlfZGF0YS0+YWZlX2Nsa192ZXIgPT0gQUZFX0NMS19WRVJTSU9OX1YyKSB7CisJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5lbmFibGUgPSBlbmFibGU7CisJCXJjID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAorCQkJCQkmYXV4X2RhaV9kYXRhLT5jbGtfc2V0KTsKKwl9IGVsc2UgeworCQlpZiAoIWVuYWJsZSkKKwkJCWF1eF9kYWlfZGF0YS0+Y2xrX2NmZy5jbGtfdmFsMSA9IDA7CisJCXJjID0gYWZlX3NldF9scGFzc19jbG9jayhwb3J0X2lkLAorCQkJCQkmYXV4X2RhaV9kYXRhLT5jbGtfY2ZnKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtc21fZGFpX3E2X2F1eHBjbV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqYXV4X2RhaV9kYXRhID0KKwkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCW11dGV4X2xvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOworCisJaWYgKCEodGVzdF9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSB8fAorCSAgICAgIHRlc3RfYml0KFNUQVRVU19SWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykpKSB7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlcygpOiBkYWktPmlkICVkIFBDTSBwb3J0cyBhbHJlYWR5IGNsb3NlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCWlmICh0ZXN0X2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKQorCQkJY2xlYXJfYml0KFNUQVRVU19UWF9QT1JULAorCQkJCSAgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOworCQllbHNlIHsKKwkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogUENNX1RYIHBvcnQgYWxyZWFkeSBjbG9zZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9CisJfSBlbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWlmICh0ZXN0X2JpdChTVEFUVVNfUlhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKQorCQkJY2xlYXJfYml0KFNUQVRVU19SWF9QT1JULAorCQkJCSAgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOworCQllbHNlIHsKKwkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogUENNX1JYIHBvcnQgYWxyZWFkeSBjbG9zZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9CisJfQorCWlmICh0ZXN0X2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19SWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykpIHsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBjYW5ub3Qgc2h1dGRvd24gUENNIHBvcnRzXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBkYWktPmlkID0gJWQgY2xvc2luZyBQQ00gQUZFIHBvcnRzXG4iLAorCQkJX19mdW5jX18sIGRhaS0+aWQpOworCisJcmMgPSBhZmVfY2xvc2UoYXV4X2RhaV9kYXRhLT5yeF9waWQpOyAvKiBjYW4gYmxvY2sgKi8KKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gY2xvc2UgUENNX1JYICBBRkUgcG9ydFxuIik7CisKKwlyYyA9IGFmZV9jbG9zZShhdXhfZGFpX2RhdGEtPnR4X3BpZCk7CisJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFVWCBQQ00gVFggcG9ydFxuIik7CisKKwltc21fZGFpX3E2X2F1eHBjbV9zZXRfY2xrKGF1eF9kYWlfZGF0YSwgYXV4X2RhaV9kYXRhLT5yeF9waWQsIGZhbHNlKTsKKwltc21fZGFpX3E2X2F1eHBjbV9zZXRfY2xrKGF1eF9kYWlfZGF0YSwgYXV4X2RhaV9kYXRhLT50eF9waWQsIGZhbHNlKTsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZhdXhfZGFpX2RhdGEtPnJsb2NrKTsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2F1eHBjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9hdXhwY21fZGFpX2RhdGEgKmF1eF9kYWlfZGF0YSA9CisJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gJmF1eF9kYWlfZGF0YS0+YmRhaV9kYXRhOworCXN0cnVjdCBtc21fZGFpX2F1eHBjbV9wZGF0YSAqYXV4cGNtX3BkYXRhID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXUzMiBwY21fY2xrX3JhdGU7CisKKwlhdXhwY21fcGRhdGEgPSBkYWktPmRldi0+cGxhdGZvcm1fZGF0YTsKKwltdXRleF9sb2NrKCZhdXhfZGFpX2RhdGEtPnJsb2NrKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJaWYgKHRlc3RfYml0KFNUQVRVU19UWF9QT1JULAorCQkJCWF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkgeworCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBQQ01fVFggcG9ydCBhbHJlYWR5IE9OXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXhpdDsKKwkJfSBlbHNlCisJCQlzZXRfYml0KFNUQVRVU19UWF9QT1JULAorCQkJCSAgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOworCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlpZiAodGVzdF9iaXQoU1RBVFVTX1JYX1BPUlQsCisJCQkJYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKSB7CisJCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IFBDTV9SWCBwb3J0IGFscmVhZHkgT05cbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9IGVsc2UKKwkJCXNldF9iaXQoU1RBVFVTX1JYX1BPUlQsCisJCQkJICBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cyk7CisJfQorCWlmICh0ZXN0X2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpICYmCisJICAgIHRlc3RfYml0KFNUQVRVU19SWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykpIHsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBQQ00gcG9ydHMgYWxyZWFkeSBzZXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBleGl0OworCX0KKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpLT5pZDolZCAgb3BlbmluZyBhZmUgcG9ydHNcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisKKwlyYyA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIG9wZW4gQUZFIEFQUlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIEZvciBBVVggUENNIEludGVyZmFjZSB0aGUgYmVsb3cgc2VxdWVuY2Ugb2YgY2xrCisJICogc2V0dGluZ3MgYW5kIGFmZV9vcGVuIGlzIGEgc3RyaWN0IHJlcXVpcmVtZW50LgorCSAqCisJICogQWxzbyB1c2luZyBhZmVfb3BlbiBpbnN0ZWFkIG9mIGFmZV9wb3J0X3N0YXJ0X25vd2FpdAorCSAqIHRvIG1ha2Ugc3VyZSB0aGUgcG9ydCBpcyBvcGVuIGJlZm9yZSBkZWFzc2VydGluZyB0aGUKKwkgKiBjbG9jayBsaW5lLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgcGNtIHJlZ2lzdGVyIGlzCisJICogbm90IHdyaXR0ZW4gYmVmb3JlIGNsb2NrIGRlYXNzZXJ0LiBIZW5jZSB0aGUgaHcgZG9lcworCSAqIG5vdCBnZXQgdXBkYXRlZCB3aXRoIG5ldyBzZXR0aW5nIGlmIHRoZSBiZWxvdyBjbG9jaworCSAqIGFzc2VydC9kZWFzc2V0IGFuZCBhZmVfb3BlbiBzZXF1ZW5jZSBpcyBub3QgZm9sbG93ZWQuCisJICovCisKKwlpZiAoZGFpX2RhdGEtPnJhdGUgPT0gODAwMCkgeworCQlwY21fY2xrX3JhdGUgPSBhdXhwY21fcGRhdGEtPm1vZGVfOGsucGNtX2Nsa19yYXRlOworCX0gZWxzZSBpZiAoZGFpX2RhdGEtPnJhdGUgPT0gMTYwMDApIHsKKwkJcGNtX2Nsa19yYXRlID0gKGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucGNtX2Nsa19yYXRlKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IEludmFsaWQgQVVYIFBDTSByYXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJCWRhaV9kYXRhLT5yYXRlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChhdXhfZGFpX2RhdGEtPmFmZV9jbGtfdmVyID09IEFGRV9DTEtfVkVSU0lPTl9WMikgeworCQltZW1jcHkoJmF1eF9kYWlfZGF0YS0+Y2xrX3NldCwgJmxwYXNzX2Nsa19zZXRfZGVmYXVsdCwKKwkJCQlzaXplb2Yoc3RydWN0IGFmZV9jbGtfc2V0KSk7CisJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfZnJlcV9pbl9oeiA9IHBjbV9jbGtfcmF0ZTsKKworCQlzd2l0Y2ggKGRhaS0+aWQpIHsKKwkJY2FzZSBNU01fREFJX1BSSV9BVVhQQ01fRFRfREVWX0lEOgorCQkJaWYgKHBjbV9jbGtfcmF0ZSkKKwkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9QQ01fSUJJVDsKKwkJCWVsc2UKKwkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9QQ01fRUJJVDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9EQUlfU0VDX0FVWFBDTV9EVF9ERVZfSUQ6CisJCQlpZiAocGNtX2Nsa19yYXRlKQorCQkJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX1BDTV9JQklUOworCQkJZWxzZQorCQkJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX1BDTV9FQklUOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0RBSV9URVJUX0FVWFBDTV9EVF9ERVZfSUQ6CisJCQlpZiAocGNtX2Nsa19yYXRlKQorCQkJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCQlRNkFGRV9MUEFTU19DTEtfSURfVEVSX1BDTV9JQklUOworCQkJZWxzZQorCQkJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCQlRNkFGRV9MUEFTU19DTEtfSURfVEVSX1BDTV9FQklUOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0RBSV9RVUFUX0FVWFBDTV9EVF9ERVZfSUQ6CisJCQlpZiAocGNtX2Nsa19yYXRlKQorCQkJCWF1eF9kYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCQlRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9QQ01fSUJJVDsKKwkJCWVsc2UKKwkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfUENNX0VCSVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogQVVYUENNIGlkOiAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCV9fZnVuY19fLCBkYWktPmlkKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZhdXhfZGFpX2RhdGEtPmNsa19jZmcsICZscGFzc19jbGtfY2ZnX2RlZmF1bHQsCisJCQkJc2l6ZW9mKHN0cnVjdCBhZmVfY2xrX2NmZykpOworCQlhdXhfZGFpX2RhdGEtPmNsa19jZmcuY2xrX3ZhbDEgPSBwY21fY2xrX3JhdGU7CisJfQorCisJcmMgPSBtc21fZGFpX3E2X2F1eHBjbV9zZXRfY2xrKGF1eF9kYWlfZGF0YSwKKwkJCQkgICAgICAgYXV4X2RhaV9kYXRhLT5yeF9waWQsIHRydWUpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihkYWktPmRldiwKKwkJCSIlczphZmVfc2V0X2xwYXNzX2Nsb2NrIG9uIFJYIHBjbV9zcmNfY2xrIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gbXNtX2RhaV9xNl9hdXhwY21fc2V0X2NsayhhdXhfZGFpX2RhdGEsCisJCQkJICAgICAgIGF1eF9kYWlfZGF0YS0+dHhfcGlkLCB0cnVlKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsCisJCQkiJXM6YWZlX3NldF9scGFzc19jbG9jayBvbiBUWCBwY21fc3JjX2NsayBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlhZmVfb3BlbihhdXhfZGFpX2RhdGEtPnJ4X3BpZCwgJmRhaV9kYXRhLT5wb3J0X2NvbmZpZywgZGFpX2RhdGEtPnJhdGUpOworCWFmZV9vcGVuKGF1eF9kYWlfZGF0YS0+dHhfcGlkLCAmZGFpX2RhdGEtPnBvcnRfY29uZmlnLCBkYWlfZGF0YS0+cmF0ZSk7CisJZ290byBleGl0OworCitmYWlsOgorCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCWNsZWFyX2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNsZWFyX2JpdChTVEFUVVNfUlhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOworCitleGl0OgorCW11dGV4X3VubG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfYXV4cGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWludCBjbWQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6cG9ydDolZCAgY21kOiVkXG4iLAorCQlfX2Z1bmNfXywgZGFpLT5pZCwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJLyogYWZlX29wZW4gd2lsbCBiZSBjYWxsZWQgZnJvbSBwcmVwYXJlICovCisJCXJldHVybiAwOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogY21kICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKKworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX2F1eHBjbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfYXV4cGNtX2RhaV9kYXRhICphdXhfZGFpX2RhdGE7CisJaW50IHJjOworCisJYXV4X2RhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpLT5pZCAlZCBjbG9zaW5nIGFmZVxuIiwKKwkJX19mdW5jX18sIGRhaS0+aWQpOworCisJaWYgKHRlc3RfYml0KFNUQVRVU19UWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkgeworCQlyYyA9IGFmZV9jbG9zZShhdXhfZGFpX2RhdGEtPnJ4X3BpZCk7IC8qIGNhbiBibG9jayAqLworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFVWFBDTSBSWCBBRkUgcG9ydFxuIik7CisJCXJjID0gYWZlX2Nsb3NlKGF1eF9kYWlfZGF0YS0+dHhfcGlkKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBVVhQQ00gVFggQUZFIHBvcnRcbiIpOworCQljbGVhcl9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKKwkJY2xlYXJfYml0KFNUQVRVU19SWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cyk7CisJfQorCW1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoYXV4X2RhaV9kYXRhLCBhdXhfZGFpX2RhdGEtPnJ4X3BpZCwgZmFsc2UpOworCW1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoYXV4X2RhaV9kYXRhLCBhdXhfZGFpX2RhdGEtPnR4X3BpZCwgZmFsc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfYXV4X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFkYWkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgZGFpXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWRhaS0+ZGV2KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIGRhaSBkZXZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghZGFpLT5kcml2ZXItPmlkKSB7CisJCWRldl93YXJuKGRhaS0+ZGV2LCAiREFJIGRyaXZlciBpZCBpcyBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhaS0+aWQgPSBkYWktPmRyaXZlci0+aWQ7CisJcmMgPSBtc21fZGFpX3E2X2RhaV9hZGRfcm91dGUoZGFpKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfcTZfYXV4cGNtX29wcyA9IHsKKwkucHJlcGFyZQk9IG1zbV9kYWlfcTZfYXV4cGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBtc21fZGFpX3E2X2F1eHBjbV90cmlnZ2VyLAorCS5od19wYXJhbXMJPSBtc21fZGFpX3E2X2F1eHBjbV9od19wYXJhbXMsCisJLnNodXRkb3duCT0gbXNtX2RhaV9xNl9hdXhwY21fc2h1dGRvd24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlcgorCW1zbV9kYWlfcTZfYXV4X3BjbV9kYWlfY29tcG9uZW50ID0geworCS5uYW1lCQk9ICJtc20tYXV4cGNtLWRldiIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2F1eF9wY21fZGFpW10gPSB7CisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiQVVYX1BDTV9SWCIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIkFVWF9QQ01fVFgiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJfSwKKwkJLmlkID0gTVNNX0RBSV9QUklfQVVYUENNX0RUX0RFVl9JRCwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X2F1eHBjbV9vcHMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfYXV4X3BjbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX2F1eHBjbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX0FVWF9QQ01fUlgiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0VDX0FVWF9QQ01fVFgiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJfSwKKwkJLmlkID0gTVNNX0RBSV9TRUNfQVVYUENNX0RUX0RFVl9JRCwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X2F1eHBjbV9vcHMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfYXV4X3BjbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX2F1eHBjbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfQVVYX1BDTV9SWCIsCisJCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAxLAorCQkJLnJhdGVfbWF4ID0gMTYwMDAsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9BVVhfUENNX1RYIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDApLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCX0sCisJCS5pZCA9IE1TTV9EQUlfVEVSVF9BVVhQQ01fRFRfREVWX0lELAorCQkub3BzID0gJm1zbV9kYWlfcTZfYXV4cGNtX29wcywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9hdXhfcGNtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfYXV4cGNtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9BVVhfUENNX1JYIiwKKwkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDApLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX0FVWF9QQ01fVFgiLAorCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJCS5yYXRlX21heCA9IDE2MDAwLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJfSwKKwkJLmlkID0gTVNNX0RBSV9RVUFUX0FVWFBDTV9EVF9ERVZfSUQsCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9hdXhwY21fb3BzLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2F1eF9wY21fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9hdXhwY21fcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2ZnLmRhdGFfZm9ybWF0ID0gdmFsdWU7CisJcHJfZGVidWcoIiVzOiB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywgdmFsdWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuZGF0YV9mb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZm9ybWF0W10gPSB7CisJIkxQQ00iLAorCSJDb21wciIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BkaWZfY29uZmlnX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHNwZGlmX2Zvcm1hdCksCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfY2hzdGF0dXNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2hfc3RhdHVzLnN0YXR1c190eXBlID0KKwkJQUZFX0FQSV9WRVJTSU9OX1NQRElGX0NIX1NUQVRVU19DT05GSUc7CisJbWVtc2V0KGRhaV9kYXRhLT5zcGRpZl9wb3J0LmNoX3N0YXR1cy5zdGF0dXNfbWFzaywKKwkJCUNIQU5ORUxfU1RBVFVTX01BU0tfSU5JVCwgQ0hBTk5FTF9TVEFUVVNfU0laRSk7CisJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2hfc3RhdHVzLnN0YXR1c19tYXNrWzBdID0KKwkJQ0hBTk5FTF9TVEFUVVNfTUFTSzsKKworCW1lbWNweShkYWlfZGF0YS0+c3BkaWZfcG9ydC5jaF9zdGF0dXMuc3RhdHVzX2JpdHMsCisJCQl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1cywgQ0hBTk5FTF9TVEFUVVNfU0laRSk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlwcl9kZWJ1ZygiJXM6IFBvcnQgYWxyZWFkeSBzdGFydGVkLiBEeW5hbWljIHVwZGF0ZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IGFmZV9zZW5kX3NwZGlmX2NoX3N0YXR1c19jZmcoCisJCQkJJmRhaV9kYXRhLT5zcGRpZl9wb3J0LmNoX3N0YXR1cywKKwkJCQlBRkVfUE9SVF9JRF9TUERJRl9SWCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9jaHN0YXR1c19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCisJc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCW1lbWNweSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1cywKKwkJCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNoX3N0YXR1cy5zdGF0dXNfYml0cywKKwkJCUNIQU5ORUxfU1RBVFVTX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfY2hzdGF0dXNfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGRpZl9jb25maWdfY29udHJvbHNbXSA9IHsKKwl7CisJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFKSwKKwkJLmlmYWNlICA9ICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCQkubmFtZSAgID0gICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBQQ01fU1RSRUFNKSwKKwkJLmluZm8gICA9ICAgbXNtX2RhaV9xNl9zcGRpZl9jaHN0YXR1c19pbmZvLAorCQkuZ2V0ICAgID0gICBtc21fZGFpX3E2X3NwZGlmX2Noc3RhdHVzX2dldCwKKwkJLnB1dCAgICA9ICAgbXNtX2RhaV9xNl9zcGRpZl9jaHN0YXR1c19wdXQsCisJfSwKKwlTT0NfRU5VTV9FWFQoIlNQRElGIFJYIEZvcm1hdCIsIHNwZGlmX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl9zcGRpZl9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl9zcGRpZl9mb3JtYXRfcHV0KQorfTsKKworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRhaS0+aWQgPSBBRkVfUE9SVF9JRF9TUERJRl9SWDsKKwlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcubnVtX2NoYW5uZWxzID0gZGFpX2RhdGEtPmNoYW5uZWxzOworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2ZnLmJpdF93aWR0aCA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuYml0X3dpZHRoID0gMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGZvcm1hdCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJZGFpX2RhdGEtPmJpdHdpZHRoID0gZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2ZnLmJpdF93aWR0aDsKKwlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKKwlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuc3BkaWZfY2ZnX21pbm9yX3ZlcnNpb24gPQorCQlBRkVfQVBJX1ZFUlNJT05fU1BESUZfQ09ORklHOworCWRldl9kYmcoZGFpLT5kZXYsICIgY2hhbm5lbCAlZCBzYW1wbGUgcmF0ZSAlZCBiaXQgd2lkdGggJWRcbiIsCisJCQlkYWlfZGF0YS0+Y2hhbm5lbHMsIGRhaV9kYXRhLT5yYXRlLAorCQkJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2ZnLmJpdF93aWR0aCk7CisJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2ZnLnJlc2VydmVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2RhaV9xNl9zcGRpZl9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlpbnQgcmMgPSAwOworCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spKSB7CisJCXByX2luZm8oIiVzOiAgYWZlIHBvcnQgbm90IHN0YXJ0ZWQuIGRhaV9kYXRhLT5zdGF0dXNfbWFzayA9ICVsZFxuIiwKKwkJCQlfX2Z1bmNfXywgKmRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsKKworCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7CisKKwlwcl9kZWJ1ZygiJXM6IGRhaV9kYXRhLT5zdGF0dXNfbWFzayA9ICVsZFxuIiwgX19mdW5jX18sCisJCQkqZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKworCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spOworfQorCisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCWludCByYyA9IDA7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGNsa19jb25maWcgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmM7CisJfQorCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlyYyA9IGFmZV9zcGRpZl9wb3J0X3N0YXJ0KGRhaS0+aWQsICZkYWlfZGF0YS0+c3BkaWZfcG9ydCwKKwkJCQlkYWlfZGF0YS0+cmF0ZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gb3BlbiBBRkUgcG9ydCAweCV4XG4iLAorCQkJCQlkYWktPmlkKTsKKwkJZWxzZQorCQkJc2V0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAorCQkJCQlkYWlfZGF0YS0+c3RhdHVzX21hc2spOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGE7CisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sOworCWludCByYyA9IDA7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbjsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CisKKwlpZiAoIWRhaSkgeworCQlwcl9lcnIoIiVzOiBkYWkgbm90IGZvdW5kISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRhaV9kYXRhKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJEQUktJWQ6IGZhaWwgdG8gYWxsb2NhdGUgZGFpIGRhdGFcbiIsCisJCQkJQUZFX1BPUlRfSURfU1BESUZfUlgpOworCQlyYyA9IC1FTk9NRU07CisJfSBlbHNlCisJCWRldl9zZXRfZHJ2ZGF0YShkYWktPmRldiwgZGFpX2RhdGEpOworCisJa2NvbnRyb2wgPSAmc3BkaWZfY29uZmlnX2NvbnRyb2xzWzFdOworCWRhcG0gPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZGFwbShkYWktPmNvbXBvbmVudCk7CisKKwlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCXNuZF9jdGxfbmV3MShrY29udHJvbCwgZGFpX2RhdGEpKTsKKworCW1lbXNldCgmaW50ZXJjb24sIDAsIHNpemVvZihpbnRlcmNvbikpOworCWlmICghcmMgJiYgZGFpICYmIGRhaS0+ZHJpdmVyKSB7CisJCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKKwkJCQlkYWktPmRyaXZlci0+cGxheWJhY2suYWlmX25hbWUpIHsKKwkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogYWRkIHJvdXRlIGZvciB3aWRnZXQgJXMiLAorCQkJCV9fZnVuY19fLCBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUpOworCQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lOworCQkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZTsKKwkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogc3JjICVzIHNpbmsgJXNcbiIsCisJCQkJX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOworCQl9CisJCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgorCQkJCWRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lKSB7CisJCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOworCQkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOworCQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWU7CisJCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IHNyYyAlcyBzaW5rICVzXG4iLAorCQkJCV9fZnVuY19fLCBpbnRlcmNvbi5zb3VyY2UsIGludGVyY29uLnNpbmspOworCQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9kYWlfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YTsKKwlpbnQgcmM7CisKKwlkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCisKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7CisKKwkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJfQorCWtmcmVlKGRhaV9kYXRhKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfcTZfc3BkaWZfb3BzID0geworCS5wcmVwYXJlCT0gbXNtX2RhaV9xNl9zcGRpZl9wcmVwYXJlLAorCS5od19wYXJhbXMJPSBtc21fZGFpX3E2X3NwZGlmX2h3X3BhcmFtcywKKwkuc2h1dGRvd24JPSBtc21fZGFpX3E2X3NwZGlmX3NodXRkb3duLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9zcGRpZl9zcGRpZl9yeF9kYWkgPSB7CisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiU1BESUYgUGxheWJhY2siLAorCQkuYWlmX25hbWUgPSAiU1BESUZfUlgiLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSA0LAorCQkucmF0ZV9taW4gPSA4MDAwLAorCQkucmF0ZV9tYXggPSA0ODAwMCwKKwl9LAorCS5vcHMgPSAmbXNtX2RhaV9xNl9zcGRpZl9vcHMsCisJLnByb2JlID0gbXNtX2RhaV9xNl9zcGRpZl9kYWlfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfc3BkaWZfZGFpX3JlbW92ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9kYWlfc3BkaWZfcTZfY29tcG9uZW50ID0geworCS5uYW1lCQk9ICJtc20tZGFpLXE2LXNwZGlmIiwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCWludCByYyA9IDA7CisKKwlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKKwkJaWYgKGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCAhPSBFTkNfRk1UX05PTkUpIHsKKwkJCWludCBiaXR3aWR0aCA9IDA7CisKKwkJCWlmIChkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCA9PQorCQkJICAgIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQorCQkJCWJpdHdpZHRoID0gMjQ7CisJCQllbHNlIGlmIChkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCA9PQorCQkJCSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkKKwkJCQliaXR3aWR0aCA9IDE2OworCQkJcHJfZGVidWcoIiVzOiBjYWxsaW5nIEFGRV9QT1JUX1NUQVJUX1YyIHdpdGggZW5jX2Zvcm1hdDogJWRcbiIsCisJCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCQkJcmMgPSBhZmVfcG9ydF9zdGFydF92MihkYWktPmlkLCAmZGFpX2RhdGEtPnBvcnRfY29uZmlnLAorCQkJCQkgICAgICAgZGFpX2RhdGEtPnJhdGUsCisJCQkJCSAgICAgICBkYWlfZGF0YS0+YWZlX2luX2NoYW5uZWxzLAorCQkJCQkgICAgICAgYml0d2lkdGgsCisJCQkJCSAgICAgICAmZGFpX2RhdGEtPmVuY19jb25maWcpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlwcl9lcnIoIiVzOiBhZmVfcG9ydF9zdGFydF92MiBmYWlsZWQgZXJyb3I6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9IGVsc2UgeworCQkJcmMgPSBhZmVfcG9ydF9zdGFydChkYWktPmlkLCAmZGFpX2RhdGEtPnBvcnRfY29uZmlnLAorCQkJCQkJZGFpX2RhdGEtPnJhdGUpOworCQl9CisJCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gb3BlbiBBRkUgcG9ydCAweCV4XG4iLAorCQkJCWRhaS0+aWQpOworCQllbHNlCisJCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfY2RjX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0pCit7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXN3aXRjaCAoZGFpX2RhdGEtPmNoYW5uZWxzKSB7CisJY2FzZSAyOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLm1vbm9fc3RlcmVvID0gTVNNX0FGRV9TVEVSRU87CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5tb25vX3N0ZXJlbyA9IE1TTV9BRkVfTU9OTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCXByX2VycigiJXM6IGVyciBjaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYWlfZGF0YS0+Y2hhbm5lbHMpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1NQRUNJQUw6CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuYml0X3dpZHRoID0gMTY7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuYml0X3dpZHRoID0gMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGZvcm1hdCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuaTJzX2NmZ19taW5vcl92ZXJzaW9uID0KKwkJCQkJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuZGF0YV9mb3JtYXQgPSAgQUZFX0xJTkVBUl9QQ01fREFUQTsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiIGNoYW5uZWwgJWQgc2FtcGxlIHJhdGUgJWQgZW50ZXJlZFxuIiwKKwlkYWlfZGF0YS0+Y2hhbm5lbHMsIGRhaV9kYXRhLT5yYXRlKTsKKworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IG51bV9vZl9iaXRzX3NldCh1OCBzZF9saW5lX21hc2spCit7CisJdTggbnVtX2JpdHNfc2V0ID0gMDsKKworCXdoaWxlIChzZF9saW5lX21hc2spIHsKKwkJbnVtX2JpdHNfc2V0Kys7CisJCXNkX2xpbmVfbWFzayA9IHNkX2xpbmVfbWFzayAmIChzZF9saW5lX21hc2sgLSAxKTsKKwl9CisJcmV0dXJuIG51bV9iaXRzX3NldDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9pMnNfZGF0YSAqaTJzX3BkYXRhID0KKwkJCShzdHJ1Y3QgbXNtX2kyc19kYXRhICopIGRhaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJaWYgKG51bV9vZl9iaXRzX3NldChpMnNfcGRhdGEtPnNkX2xpbmVzKSA9PSAxKSB7CisJCXN3aXRjaCAoZGFpX2RhdGEtPmNoYW5uZWxzKSB7CisJCWNhc2UgMjoKKwkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMubW9ub19zdGVyZW8gPSBNU01fQUZFX1NURVJFTzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLm1vbm9fc3RlcmVvID0gTVNNX0FGRV9NT05POworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl93YXJuKCIlczogZ3JlYXRlciB0aGFuIHN0ZXJlbyBoYXMgbm90IGJlZW4gdmFsaWRhdGVkICVkIiwKKwkJCQlfX2Z1bmNfXywgZGFpX2RhdGEtPmNoYW5uZWxzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5pMnNfY2ZnX21pbm9yX3ZlcnNpb24gPQorCQkJCQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUc7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5kYXRhX2Zvcm1hdCA9ICBBRkVfTElORUFSX1BDTV9EQVRBOworCS8qIFE2IG9ubHkgc3VwcG9ydHMgMTYgYXMgbm93ICovCisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5iaXRfd2lkdGggPSAxNjsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3NsaW1fYnVzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0pCit7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfU1BFQ0lBTDoKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmJpdF93aWR0aCA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guYml0X3dpZHRoID0gMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5iaXRfd2lkdGggPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZm9ybWF0ICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zYl9jZmdfbWlub3JfdmVyc2lvbiA9CisJCQkJQUZFX0FQSV9WRVJTSU9OX1NMSU1CVVNfQ09ORklHOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIFNMSU1CVVNfN19SWDoKKwljYXNlIFNMSU1CVVNfN19UWDoKKwljYXNlIFNMSU1CVVNfOF9SWDoKKwljYXNlIFNMSU1CVVNfOF9UWDoKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNsaW1idXNfZGV2X2lkID0KKwkJCUFGRV9TTElNQlVTX0RFVklDRV8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2xpbWJ1c19kZXZfaWQgPQorCQkJQUZFX1NMSU1CVVNfREVWSUNFXzE7CisJCWJyZWFrOworCX0KKworCWRldl9kYmcoZGFpLT5kZXYsICIlczpzbGltYnVzX2Rldl9pZFslaHVdIGJpdF93ZFslaHVdIGZvcm1hdFslaHVdXG4iCisJCSJudW1fY2hhbm5lbCAlaHUgIHNoYXJlZF9jaF9tYXBwaW5nWzBdICAlaHVcbiIKKwkJInNsYXZlX3BvcnRfbWFwcGluZ1sxXSAgJWh1IHNsYXZlX3BvcnRfbWFwcGluZ1syXSAgJWh1XG4iCisJCSJzYW1wbGVfcmF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zbGltYnVzX2Rldl9pZCwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmJpdF93aWR0aCwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmRhdGFfZm9ybWF0LAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2gubnVtX2NoYW5uZWxzLAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMF0sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zaGFyZWRfY2hfbWFwcGluZ1sxXSwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNoYXJlZF9jaF9tYXBwaW5nWzJdLAorCQlkYWlfZGF0YS0+cmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3VzYl9hdWRpb19od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0pCit7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfU1BFQ0lBTDoKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5iaXRfd2lkdGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5iaXRfd2lkdGggPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5iaXRfd2lkdGggPSAzMjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgZm9ybWF0ICVkXG4iLAorCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLmNmZ19taW5vcl92ZXJzaW9uID0KKwkJCQkJQUZFX0FQSV9NSU5JT1JfVkVSU0lPTl9VU0JfQVVESU9fQ09ORklHOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8ubnVtX2NoYW5uZWxzID0gZGFpX2RhdGEtPmNoYW5uZWxzOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGV2X2lkWzB4JXhdIGJpdF93ZFslaHVdIGZvcm1hdFslaHVdXG4iCisJCSJudW1fY2hhbm5lbCAlaHUgIHNhbXBsZV9yYXRlICVkXG4iLCBfX2Z1bmNfXywKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5kZXZfdG9rZW4sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uYml0X3dpZHRoLAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLmRhdGFfZm9ybWF0LAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLm51bV9jaGFubmVscywKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5zYW1wbGVfcmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2J0X2ZtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCisJZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJZGV2X2RiZyhkYWktPmRldiwgImNoYW5uZWxzICVkIHNhbXBsZSByYXRlICVkIGVudGVyZWRcbiIsCisJCWRhaV9kYXRhLT5jaGFubmVscywgZGFpX2RhdGEtPnJhdGUpOworCisJbWVtc2V0KCZkYWlfZGF0YS0+cG9ydF9jb25maWcsIDAsIHNpemVvZihkYWlfZGF0YS0+cG9ydF9jb25maWcpKTsKKworCXByX2RlYnVnKCIlczogc2V0dGluZyBidF9mbSBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7CisKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaW50X2J0X2ZtLmJ0X2ZtX2NmZ19taW5vcl92ZXJzaW9uID0KKwkJCQkJQUZFX0FQSV9WRVJTSU9OX0lOVEVSTkFMX0JUX0ZNX0NPTkZJRzsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaW50X2J0X2ZtLm51bV9jaGFubmVscyA9IGRhaV9kYXRhLT5jaGFubmVsczsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaW50X2J0X2ZtLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmludF9idF9mbS5iaXRfd2lkdGggPSAxNjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfYWZlX3J0cHJveHlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkubnVtX2NoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuc2FtcGxlX3JhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJcHJfZGVidWcoImNoYW5uZWwgJWQgZW50ZXJlZCxkYWlfaWQ6ICVkLHJhdGU6ICVkXG4iLAorCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5Lm51bV9jaGFubmVscywgZGFpLT5pZCwgZGFpX2RhdGEtPnJhdGUpOworCisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkucnRfcHJveHlfY2ZnX21pbm9yX3ZlcnNpb24gPQorCQkJCUFGRV9BUElfVkVSU0lPTl9SVF9QUk9YWV9DT05GSUc7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuYml0X3dpZHRoID0gMTY7IC8qIFE2IG9ubHkgc3VwcG9ydHMgMTYgKi8KKwlkYWlfZGF0YS0+cG9ydF9jb25maWcucnRwcm94eS5pbnRlcmxlYXZlZCA9IDE7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuZnJhbWVfc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcucnRwcm94eS5qaXR0ZXJfYWxsb3dhbmNlID0KKwkJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucnRwcm94eS5mcmFtZV9zaXplLzI7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkubG93X3dhdGVyX21hcmsgPSAwOworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5LmhpZ2hfd2F0ZXJfbWFyayA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3BzZXVkb19wb3J0X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0pCit7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCS8qIFE2IG9ubHkgc3VwcG9ydHMgMTYgYXMgbm93ICovCisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LnBzZXVkX3BvcnRfY2ZnX21pbm9yX3ZlcnNpb24gPQorCQkJCUFGRV9BUElfVkVSU0lPTl9QU0VVRE9fUE9SVF9DT05GSUc7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0Lm51bV9jaGFubmVscyA9CisJCQkJcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LmJpdF93aWR0aCA9IDE2OworCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5kYXRhX2Zvcm1hdCA9IDA7CisJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LnRpbWluZ19tb2RlID0KKwkJCQlBRkVfUFNFVURPUE9SVF9USU1JTkdfTU9ERV9USU1FUjsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQuc2FtcGxlX3JhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBiaXRfd2RbJWh1XSBudW1fY2hhbm5lbHMgWyVodV0gZm9ybWF0WyVodV1cbiIKKwkJInRpbWluZyBNb2RlICVodSBzYW1wbGVfcmF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5iaXRfd2lkdGgsCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5udW1fY2hhbm5lbHMsCisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5kYXRhX2Zvcm1hdCwKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LnRpbWluZ19tb2RlLAorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQuc2FtcGxlX3JhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBod19wYXJhbSBpcyBjYWxsZWQgb25jZQorICogVGhpcyBtYXkgbm90IGJlIHRoZSBjYXNlIGJ1dCB3aGF0IHRvIGRvIHdoZW4gQURNIGFuZCBBRkUKKyAqIHBvcnQgYXJlIGFscmVhZHkgb3BlbmVkIGFuZCBwYXJhbWV0ZXIgY2hhbmdlcworICovCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIFBSSU1BUllfSTJTX1RYOgorCWNhc2UgUFJJTUFSWV9JMlNfUlg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1JYOgorCQlyYyA9IG1zbV9kYWlfcTZfY2RjX2h3X3BhcmFtcyhwYXJhbXMsIGRhaSwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIE1JMlNfUlg6CisJCXJjID0gbXNtX2RhaV9xNl9pMnNfaHdfcGFyYW1zKHBhcmFtcywgZGFpLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWJyZWFrOworCWNhc2UgU0xJTUJVU18wX1JYOgorCWNhc2UgU0xJTUJVU18xX1JYOgorCWNhc2UgU0xJTUJVU18yX1JYOgorCWNhc2UgU0xJTUJVU18zX1JYOgorCWNhc2UgU0xJTUJVU180X1JYOgorCWNhc2UgU0xJTUJVU181X1JYOgorCWNhc2UgU0xJTUJVU182X1JYOgorCWNhc2UgU0xJTUJVU183X1JYOgorCWNhc2UgU0xJTUJVU184X1JYOgorCWNhc2UgU0xJTUJVU18wX1RYOgorCWNhc2UgU0xJTUJVU18xX1RYOgorCWNhc2UgU0xJTUJVU18yX1RYOgorCWNhc2UgU0xJTUJVU18zX1RYOgorCWNhc2UgU0xJTUJVU180X1RYOgorCWNhc2UgU0xJTUJVU181X1RYOgorCWNhc2UgU0xJTUJVU182X1RYOgorCWNhc2UgU0xJTUJVU183X1RYOgorCWNhc2UgU0xJTUJVU184X1RYOgorCQlyYyA9IG1zbV9kYWlfcTZfc2xpbV9idXNfaHdfcGFyYW1zKHBhcmFtcywgZGFpLAorCQkJCXN1YnN0cmVhbS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRfQlRfU0NPX1JYOgorCWNhc2UgSU5UX0JUX1NDT19UWDoKKwljYXNlIElOVF9CVF9BMkRQX1JYOgorCWNhc2UgSU5UX0ZNX1JYOgorCWNhc2UgSU5UX0ZNX1RYOgorCQlyYyA9IG1zbV9kYWlfcTZfYnRfZm1faHdfcGFyYW1zKHBhcmFtcywgZGFpLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWJyZWFrOworCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVVNCX1RYOgorCQlyYyA9IG1zbV9kYWlfcTZfdXNiX2F1ZGlvX2h3X3BhcmFtcyhwYXJhbXMsIGRhaSwKKwkJCQkJCSAgICBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWJyZWFrOworCWNhc2UgUlRfUFJPWFlfREFJXzAwMV9UWDoKKwljYXNlIFJUX1BST1hZX0RBSV8wMDFfUlg6CisJY2FzZSBSVF9QUk9YWV9EQUlfMDAyX1RYOgorCWNhc2UgUlRfUFJPWFlfREFJXzAwMl9SWDoKKwkJcmMgPSBtc21fZGFpX3E2X2FmZV9ydHByb3h5X2h3X3BhcmFtcyhwYXJhbXMsIGRhaSk7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRV9SRUNPUkRfUlg6CisJY2FzZSBWT0lDRV9SRUNPUkRfVFg6CisJCXJjID0gbXNtX2RhaV9xNl9wc2V1ZG9fcG9ydF9od19wYXJhbXMocGFyYW1zLAorCQkJCQkJZGFpLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJpbnZhbGlkIEFGRSBwb3J0IElEIDB4JXhcbiIsIGRhaS0+aWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNtX2RhaV9xNl9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCWludCByYyA9IDA7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcHNldWRvIHBvcnQ6JWRcbiIsIF9fZnVuY19fLCAgZGFpLT5pZCk7CisJCXJjID0gYWZlX2Nsb3NlKGRhaS0+aWQpOyAvKiBjYW4gYmxvY2sgKi8KKworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFGRSBwb3J0XG4iKTsKKwkJcHJfZGVidWcoIiVzOiBkYWlfZGF0YS0+c3RhdHVzX21hc2sgPSAlbGRcbiIsIF9fZnVuY19fLAorCQkJKmRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spOworCX0KK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2NkY19zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLndzX3NyYyA9IDE7IC8qIENQVSBpcyBtYXN0ZXIgKi8KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLndzX3NyYyA9IDA7IC8qIENQVSBpcyBzbGF2ZSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBmbXQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlpbnQgcmMgPSAwOworCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBpZCA9ICVkIGZtdFslZF1cbiIsIF9fZnVuY19fLAorCQkJCQkJCWRhaS0+aWQsIGZtdCk7CisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSBQUklNQVJZX0kyU19UWDoKKwljYXNlIFBSSU1BUllfSTJTX1JYOgorCWNhc2UgTUkyU19SWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6CisJCXJjID0gbXNtX2RhaV9xNl9jZGNfc2V0X2ZtdChkYWksIGZtdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJpbnZhbGlkIGNwdV9kYWkgaWQgMHgleFxuIiwgZGFpLT5pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfc2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJCXVuc2lnbmVkIGludCB0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKKwkJCQl1bnNpZ25lZCBpbnQgcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCisKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBpZCA9ICVkXG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSBTTElNQlVTXzBfUlg6CisJY2FzZSBTTElNQlVTXzFfUlg6CisJY2FzZSBTTElNQlVTXzJfUlg6CisJY2FzZSBTTElNQlVTXzNfUlg6CisJY2FzZSBTTElNQlVTXzRfUlg6CisJY2FzZSBTTElNQlVTXzVfUlg6CisJY2FzZSBTTElNQlVTXzZfUlg6CisJY2FzZSBTTElNQlVTXzdfUlg6CisJY2FzZSBTTElNQlVTXzhfUlg6CisJCS8qCisJCSAqIGNoYW5uZWwgbnVtYmVyIHRvIGJlIGJldHdlZW4gMTI4IGFuZCAyNTUuCisJCSAqIEZvciBSWCBwb3J0IHVzZSBjaGFubmVsIG51bWJlcnMKKwkJICogZnJvbSAxMzggdG8gMTQ0IGZvciBwcmUtVGFpa28KKwkJICogZnJvbSAxNDQgdG8gMTU5IGZvciBUYWlrbworCQkgKi8KKwkJaWYgKCFyeF9zbG90KSB7CisJCQlwcl9lcnIoIiVzOiByeCBzbG90IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHJ4X251bTsgaSsrKSB7CisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbaV0gPQorCQkJICAgIHJ4X3Nsb3RbaV07CisJCQlwcl9kZWJ1ZygiJXM6IGZpbmQgbnVtYmVyIG9mIGNoYW5uZWxzWyVkXSBjaFslZF1cbiIsCisJCQkgICAgICAgX19mdW5jX18sIGksIHJ4X3Nsb3RbaV0pOworCQl9CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5udW1fY2hhbm5lbHMgPSByeF9udW07CisJCXByX2RlYnVnKCIlczogU0xJTUJVU18lZF9SWCBjbnRbJWRdIGNoWyVkICVkXVxuIiwgX19mdW5jX18sCisJCQkoZGFpLT5pZCAtIFNMSU1CVVNfMF9SWCkgLyAyLCByeF9udW0sCisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMF0sCisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMV0pOworCisJCWJyZWFrOworCWNhc2UgU0xJTUJVU18wX1RYOgorCWNhc2UgU0xJTUJVU18xX1RYOgorCWNhc2UgU0xJTUJVU18yX1RYOgorCWNhc2UgU0xJTUJVU18zX1RYOgorCWNhc2UgU0xJTUJVU180X1RYOgorCWNhc2UgU0xJTUJVU181X1RYOgorCWNhc2UgU0xJTUJVU182X1RYOgorCWNhc2UgU0xJTUJVU183X1RYOgorCWNhc2UgU0xJTUJVU184X1RYOgorCQkvKgorCQkgKiBjaGFubmVsIG51bWJlciB0byBiZSBiZXR3ZWVuIDEyOCBhbmQgMjU1LgorCQkgKiBGb3IgVFggcG9ydCB1c2UgY2hhbm5lbCBudW1iZXJzCisJCSAqIGZyb20gMTI4IHRvIDEzNyBmb3IgcHJlLVRhaWtvCisJCSAqIGZyb20gMTI4IHRvIDE0MyBmb3IgVGFpa28KKwkJICovCisJCWlmICghdHhfc2xvdCkgeworCQkJcHJfZXJyKCIlczogdHggc2xvdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB0eF9udW07IGkrKykgeworCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNoYXJlZF9jaF9tYXBwaW5nW2ldID0KKwkJCSAgICB0eF9zbG90W2ldOworCQkJcHJfZGVidWcoIiVzOiBmaW5kIG51bWJlciBvZiBjaGFubmVsc1slZF0gY2hbJWRdXG4iLAorCQkJCSBfX2Z1bmNfXywgaSwgdHhfc2xvdFtpXSk7CisJCX0KKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLm51bV9jaGFubmVscyA9IHR4X251bTsKKwkJcHJfZGVidWcoIiVzOlNMSU1CVVNfJWRfVFggY250WyVkXSBjaFslZCAlZF1cbiIsIF9fZnVuY19fLAorCQkJKGRhaS0+aWQgLSBTTElNQlVTXzBfVFgpIC8gMiwgdHhfbnVtLAorCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNoYXJlZF9jaF9tYXBwaW5nWzBdLAorCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNoYXJlZF9jaF9tYXBwaW5nWzFdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgImludmFsaWQgY3B1X2RhaSBpZCAweCV4XG4iLCBkYWktPmlkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3E2X29wcyA9IHsKKwkucHJlcGFyZQk9IG1zbV9kYWlfcTZfcHJlcGFyZSwKKwkuaHdfcGFyYW1zCT0gbXNtX2RhaV9xNl9od19wYXJhbXMsCisJLnNodXRkb3duCT0gbXNtX2RhaV9xNl9zaHV0ZG93biwKKwkuc2V0X2ZtdAk9IG1zbV9kYWlfcTZfc2V0X2ZtdCwKKwkuc2V0X2NoYW5uZWxfbWFwID0gbXNtX2RhaV9xNl9zZXRfY2hhbm5lbF9tYXAsCit9OworCisvKgorICogRm9yIHNpbmdsZSBDUFUgREFJIHJlZ2lzdHJhdGlvbiwgdGhlIGRhaSBpZCBuZWVkcyB0byBiZQorICogc2V0IGV4cGxpY2l0bHkgaW4gdGhlIGRhaSBwcm9iZSBhcyBBU29DIGRvZXMgbm90IHJlYWQKKyAqIHRoZSBjcHUtPmRyaXZlci0+aWQgZmllbGQgcmF0aGVyIGl0IGFzc2lnbnMgdGhlIGRhaSBpZAorICogZnJvbSB0aGUgZGV2aWNlIG5hbWUgdGhhdCBpcyBpbiB0aGUgZm9ybSAlcy4lZC4gVGhpcyBkYWkKKyAqIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byBiYWNrLWVuZCBBRkUgcG9ydCBpZCBhbmQgdXNlZAorICogZHVyaW5nIGRhaSBwcmVwYXJlLiBGb3IgbXVsdGlwbGUgZGFpIHJlZ2lzdHJhdGlvbiwgaXQKKyAqIGlzIG5vdCByZXF1aXJlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIGhvd2V2ZXIgdGhlIGRhaS0+CisgKiBkcml2ZXItPmlkIGZpZWxkIG11c3QgYmUgZGVmaW5lZCBhbmQgc2V0IHRvIGNvcnJlc3BvbmRpbmcKKyAqIEFGRSBQb3J0IGlkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2RhaV9xNl9zZXRfZGFpX2lkKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWlmICghZGFpLT5kcml2ZXItPmlkKSB7CisJCWRldl93YXJuKGRhaS0+ZGV2LCAiREFJIGRyaXZlciBpZCBpcyBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKwlkYWktPmlkID0gZGFpLT5kcml2ZXItPmlkOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfY2FsX2luZm9fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCXUxNiBwb3J0X2lkID0gKChzdHJ1Y3Qgc29jX2VudW0gKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisKKwlkYWlfZGF0YS0+Y2FsX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgY2FsX21vZGUgdG8gJWRcbiIsCisJCV9fZnVuY19fLCBkYWlfZGF0YS0+Y2FsX21vZGUpOworCWFmZV9zZXRfY2FsX21vZGUocG9ydF9pZCwgZGFpX2RhdGEtPmNhbF9tb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfY2FsX2luZm9fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkYWlfZGF0YS0+Y2FsX21vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9zYl9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKGRhaV9kYXRhKSB7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5kYXRhX2Zvcm1hdCA9IHZhbHVlOworCQlwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkXG4iLCAgX19mdW5jX18sIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3NiX2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGFpX2RhdGEpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5kYXRhX2Zvcm1hdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJdTMyIHZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKGRhaV9kYXRhKSB7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZGV2X3Rva2VuID0gdmFsOworCQlwcl9kZWJ1ZygiJXM6IGRldl90b2tlbiA9IDB4JXhcbiIsICBfX2Z1bmNfXywKKwkJCQkgZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5kZXZfdG9rZW4pOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3VzYl9hdWRpb19jZmdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRhaV9kYXRhKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCSBkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLmRldl90b2tlbjsKKwkJcHJfZGVidWcoIiVzOiBkZXZfdG9rZW4gPSAweCV4XG4iLCAgX19mdW5jX18sCisJCQkJIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZGV2X3Rva2VuKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBkYWlfZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgIG1zbV9kYWlfcTZfYWZlX2VuY19jZmdfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CisJdWluZm8tPmNvdW50ID0gc2l6ZW9mKHN0cnVjdCBhZmVfZW5jX2NvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRhaV9kYXRhKSB7CisJCWludCBmb3JtYXRfc2l6ZSA9IHNpemVvZihkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCisJCXByX2RlYnVnKCIlczplbmNvZGVyIGNvbmZpZyBmb3IgJWQgZm9ybWF0XG4iLAorCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsCisJCQkmZGFpX2RhdGEtPmVuY19jb25maWcuZm9ybWF0LAorCQkJZm9ybWF0X3NpemUpOworCQlzd2l0Y2ggKGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCkgeworCQljYXNlIEVOQ19GTVRfU0JDOgorCQkJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCisJCQkJJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc2JjX2VuY19jZmdfdCkpOworCQkJYnJlYWs7CisJCWNhc2UgRU5DX0ZNVF9BQUNfVjI6CisJCQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBmb3JtYXRfc2l6ZSwKKwkJCQkmZGFpX2RhdGEtPmVuY19jb25maWcuZGF0YSwKKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90KSk7CisJCQlicmVhazsKKwkJY2FzZSBFTkNfRk1UX0FQVFg6CisJCWNhc2UgRU5DX0ZNVF9BUFRYX0hEOgorCQkJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCisJCQkJJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fYWFjX2VuY19jZmdfdjJfdCkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9kZWJ1ZygiJXM6IHVua25vd24gZm9ybWF0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRhaV9kYXRhKSB7CisJCWludCBmb3JtYXRfc2l6ZSA9IHNpemVvZihkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCisJCW1lbXNldCgmZGFpX2RhdGEtPmVuY19jb25maWcsIDB4MCwKKwkJCXNpemVvZihzdHJ1Y3QgYWZlX2VuY19jb25maWcpKTsKKwkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQsCisJCQl1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKKwkJCWZvcm1hdF9zaXplKTsKKwkJcHJfZGVidWcoIiVzOiBSZWNlaXZlZCBlbmNvZGVyIGNvbmZpZyBmb3IgJWQgZm9ybWF0XG4iLAorCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCQlzd2l0Y2ggKGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCkgeworCQljYXNlIEVOQ19GTVRfU0JDOgorCQkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5kYXRhLAorCQkJCXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc2JjX2VuY19jZmdfdCkpOworCQkJYnJlYWs7CisJCWNhc2UgRU5DX0ZNVF9BQUNfVjI6CisJCQltZW1jcHkoJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCisJCQkJdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBmb3JtYXRfc2l6ZSwKKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90KSk7CisJCQlicmVhazsKKwkJY2FzZSBFTkNfRk1UX0FQVFg6CisJCWNhc2UgRU5DX0ZNVF9BUFRYX0hEOgorCQkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5kYXRhLAorCQkJCXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fY3VzdG9tX2VuY19jZmdfYXB0eF90KSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczogSWdub3JlIGVuYyBjb25maWcgZm9yIHVua25vd24gZm9ybWF0ID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWZlX2lucHV0X2Noc190ZXh0W10gPSB7Ilplcm8iLCAiT25lIiwgIlR3byJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFmZV9pbnB1dF9jaHNfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRV9FWFQoMywgYWZlX2lucHV0X2Noc190ZXh0KSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZmVfaW5wdXRfYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZmVfaW5wdXRfYml0X2Zvcm1hdF9lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBhZmVfaW5wdXRfYml0X2Zvcm1hdF90ZXh0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9hZmVfaW5wdXRfY2hhbm5lbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRhaV9kYXRhKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVsczsKKwkJcHJfZGVidWcoIiVzOmFmZSBpbnB1dCBjaGFubmVsID0gJWRcbiIsCisJCQkgIF9fZnVuY19fLCBkYWlfZGF0YS0+YWZlX2luX2NoYW5uZWxzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9pbnB1dF9jaGFubmVsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGFpX2RhdGEpIHsKKwkJZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlwcl9kZWJ1ZygiJXM6IHVwZGF0aW5nIGFmZSBpbnB1dCBjaGFubmVsIDogJWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVscyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9hZmVfaW5wdXRfYml0X2Zvcm1hdF9nZXQoCisJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWRhaV9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZGFpIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IGFmZSBpbnB1dCBiaXQgZm9ybWF0IDogJWxkXG4iLAorCQkgIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X3B1dCgKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGFpX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBkYWkgZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMToKKwkJZGFpX2RhdGEtPmFmZV9pbl9iaXRmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCWRhaV9kYXRhLT5hZmVfaW5fYml0Zm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7CisJCWJyZWFrOworCX0KKwlwcl9kZWJ1ZygiJXM6IHVwZGF0aW5nIGFmZSBpbnB1dCBiaXQgZm9ybWF0IDogJWRcbiIsCisJCV9fZnVuY19fLCBkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWZlX2VuY19jb25maWdfY29udHJvbHNbXSA9IHsKKwl7CisJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUpLAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJCS5uYW1lID0gIlNMSU1fN19SWCBFbmNvZGVyIENvbmZpZyIsCisJCS5pbmZvID0gbXNtX2RhaV9xNl9hZmVfZW5jX2NmZ19pbmZvLAorCQkuZ2V0ID0gbXNtX2RhaV9xNl9hZmVfZW5jX2NmZ19nZXQsCisJCS5wdXQgPSBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX3B1dCwKKwl9LAorCVNPQ19FTlVNX0VYVCgiQUZFIElucHV0IENoYW5uZWxzIiwgYWZlX2lucHV0X2Noc19lbnVtWzBdLAorCQkgICAgIG1zbV9kYWlfcTZfYWZlX2lucHV0X2NoYW5uZWxfZ2V0LAorCQkgICAgIG1zbV9kYWlfcTZfYWZlX2lucHV0X2NoYW5uZWxfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIkFGRSBJbnB1dCBCaXQgRm9ybWF0IiwgYWZlX2lucHV0X2JpdF9mb3JtYXRfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X3B1dCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFmZV9jYWxfbW9kZV90ZXh0W10gPSB7CisJIkNBTF9NT0RFX0RFRkFVTFQiLCAiQ0FMX01PREVfTk9ORSIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2xpbV8yX3J4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShTTElNQlVTXzJfUlgsIDAsIEFSUkFZX1NJWkUoYWZlX2NhbF9tb2RlX3RleHQpLAorCQkJYWZlX2NhbF9tb2RlX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ0X3Byb3h5XzFfcnhfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFJUX1BST1hZX1BPUlRfMDAxX1JYLCAwLCBBUlJBWV9TSVpFKGFmZV9jYWxfbW9kZV90ZXh0KSwKKwkJCWFmZV9jYWxfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBydF9wcm94eV8xX3R4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShSVF9QUk9YWV9QT1JUXzAwMV9UWCwgMCwgQVJSQVlfU0laRShhZmVfY2FsX21vZGVfdGV4dCksCisJCQlhZmVfY2FsX21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl9jb25maWdfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIlNMSU1fNF9UWCBGb3JtYXQiLCBzYl9jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X3NiX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9zYl9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBTZXRDYWxNb2RlIiwgc2xpbV8yX3J4X2VudW0sCisJCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIEZvcm1hdCIsIHNiX2NvbmZpZ19lbnVtWzBdLAorCQkgICAgIG1zbV9kYWlfcTZfc2JfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X3NiX2Zvcm1hdF9wdXQpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnRfcHJveHlfY29uZmlnX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU1fRVhUKCJSVF9QUk9YWV8xX1JYIFNldENhbE1vZGUiLCBydF9wcm94eV8xX3J4X2VudW0sCisJCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19wdXQpLAorCVNPQ19FTlVNX0VYVCgiUlRfUFJPWFlfMV9UWCBTZXRDYWxNb2RlIiwgcnRfcHJveHlfMV90eF9lbnVtLAorCQkgICAgIG1zbV9kYWlfcTZfY2FsX2luZm9fZ2V0LAorCQkgICAgIG1zbV9kYWlfcTZfY2FsX2luZm9fcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1c2JfYXVkaW9fY2ZnX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19SWCBkZXZfdG9rZW4iLCAwLCAwLCBVSU5UX01BWCwgMCwKKwkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19nZXQsCisJCQltc21fZGFpX3E2X3VzYl9hdWRpb19jZmdfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIGRldl90b2tlbiIsIDAsIDAsIFVJTlRfTUFYLCAwLAorCQkJbXNtX2RhaV9xNl91c2JfYXVkaW9fY2ZnX2dldCwKKwkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19wdXQpLAorfTsKKworc3RhdGljIGludCBtc21fZGFpX3E2X2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGE7CisJaW50IHJjID0gMDsKKworCWlmICghZGFpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIGRhaVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFkYWktPmRldikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBkYWkgZGV2XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGFpX2RhdGEpCisJCXJjID0gLUVOT01FTTsKKwllbHNlCisJCWRldl9zZXRfZHJ2ZGF0YShkYWktPmRldiwgZGFpX2RhdGEpOworCisJbXNtX2RhaV9xNl9zZXRfZGFpX2lkKGRhaSk7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIFNMSU1CVVNfNF9UWDoKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJIHNuZF9jdGxfbmV3MSgmc2JfY29uZmlnX2NvbnRyb2xzWzBdLAorCQkJCSBkYWlfZGF0YSkpOworCQlicmVhazsKKwljYXNlIFNMSU1CVVNfMl9SWDoKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJIHNuZF9jdGxfbmV3MSgmc2JfY29uZmlnX2NvbnRyb2xzWzFdLAorCQkJCSBkYWlfZGF0YSkpOworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKCZzYl9jb25maWdfY29udHJvbHNbMl0sCisJCQkJIGRhaV9kYXRhKSk7CisJCWJyZWFrOworCWNhc2UgU0xJTUJVU183X1JYOgorCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKCZhZmVfZW5jX2NvbmZpZ19jb250cm9sc1swXSwKKwkJCQkgZGFpX2RhdGEpKTsKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJIHNuZF9jdGxfbmV3MSgmYWZlX2VuY19jb25maWdfY29udHJvbHNbMV0sCisJCQkJIGRhaV9kYXRhKSk7CisJCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAorCQkJCSBzbmRfY3RsX25ldzEoJmFmZV9lbmNfY29uZmlnX2NvbnRyb2xzWzJdLAorCQkJCSBkYWlfZGF0YSkpOworCQlicmVhazsKKwljYXNlIFJUX1BST1hZX0RBSV8wMDFfUlg6CisJCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAorCQkJCSBzbmRfY3RsX25ldzEoJnJ0X3Byb3h5X2NvbmZpZ19jb250cm9sc1swXSwKKwkJCQkgZGFpX2RhdGEpKTsKKwkJYnJlYWs7CisJY2FzZSBSVF9QUk9YWV9EQUlfMDAxX1RYOgorCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKCZydF9wcm94eV9jb25maWdfY29udHJvbHNbMV0sCisJCQkJIGRhaV9kYXRhKSk7CisJCWJyZWFrOworCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgorCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgc25kX2N0bF9uZXcxKCZ1c2JfYXVkaW9fY2ZnX2NvbnRyb2xzWzBdLAorCQkJCSBkYWlfZGF0YSkpOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJIHNuZF9jdGxfbmV3MSgmdXNiX2F1ZGlvX2NmZ19jb250cm9sc1sxXSwKKwkJCQkgZGFpX2RhdGEpKTsKKwkJYnJlYWs7CisJfQorCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGVyciBhZGQgY29uZmlnIGN0bCwgREFJID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKKworCXJjID0gbXNtX2RhaV9xNl9kYWlfYWRkX3JvdXRlKGRhaSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGE7CisJaW50IHJjOworCisJZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCisJLyogSWYgQUZFIHBvcnQgaXMgc3RpbGwgdXAsIGNsb3NlIGl0ICovCisJaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKKwkJcHJfZGVidWcoIiVzOiBzdG9wIHBzZXVkbyBwb3J0OiVkXG4iLCBfX2Z1bmNfXywgIGRhaS0+aWQpOworCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCisKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7CisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spOworCX0KKwlrZnJlZShkYWlfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9hZmVfcnhfZGFpW10gPSB7CisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQQ01fUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9CTQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBSVF9QUk9YWV9EQUlfMDAxX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJIC5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgUlgiLAorCQkJIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkgLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkgLmNoYW5uZWxzX21pbiA9IDEsCisJCQkgLmNoYW5uZWxzX21heCA9IDIsCisJCQkgLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkgLnJhdGVfbWF4ID0JNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFJUX1BST1hZX0RBSV8wMDJfUlgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2FmZV90eF9kYWlbXSA9IHsKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFGRSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQQ01fVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9CTQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBSVF9QUk9YWV9EQUlfMDAyX1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUZFLVBST1hZIFRYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPQk0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gUlRfUFJPWFlfREFJXzAwMV9UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfYnRfc2NvX3J4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBCVC1TQ08gUGxheWJhY2siLAorCQkuYWlmX25hbWUgPSAiSU5UX0JUX1NDT19SWCIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJLnJhdGVfbWluID0gODAwMCwKKwl9LAorCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJLmlkID0gSU5UX0JUX1NDT19SWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9idF9hMmRwX3J4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBCVC1BMkRQIFBsYXliYWNrIiwKKwkJLmFpZl9uYW1lID0gIklOVF9CVF9BMkRQX1JYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCS5yYXRlX21pbiA9IDQ4MDAwLAorCX0sCisJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkuaWQgPSBJTlRfQlRfQTJEUF9SWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9idF9zY29fdHhfZGFpID0geworCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiSW50ZXJuYWwgQlQtU0NPIENhcHR1cmUiLAorCQkuYWlmX25hbWUgPSAiSU5UX0JUX1NDT19UWCIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZV9tYXggPSAxNjAwMCwKKwkJLnJhdGVfbWluID0gODAwMCwKKwl9LAorCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJLmlkID0gSU5UX0JUX1NDT19UWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9mbV9yeF9kYWkgPSB7CisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiSW50ZXJuYWwgRk0gUGxheWJhY2siLAorCQkuYWlmX25hbWUgPSAiSU5UX0ZNX1JYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCS5yYXRlX21pbiA9IDgwMDAsCisJfSwKKwkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCS5pZCA9IElOVF9GTV9SWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9mbV90eF9kYWkgPSB7CisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBGTSBDYXB0dXJlIiwKKwkJLmFpZl9uYW1lID0gIklOVF9GTV9UWCIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlX21heCA9IDQ4MDAwLAorCQkucmF0ZV9taW4gPSA4MDAwLAorCX0sCisJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkuaWQgPSBJTlRfRk1fVFgsCisJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaVtdID0geworCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIEZhcmVuZCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVk9JQ0VfUExBWUJBQ0tfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBWT0lDRV9QTEFZQkFDS19UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgRmFyZW5kIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJWT0lDRTJfUExBWUJBQ0tfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBWT0lDRTJfUExBWUJBQ0tfVFgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpW10gPSB7CisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBVcGxpbmsgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiSU5DQUxMX1JFQ09SRF9UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBWT0lDRV9SRUNPUkRfVFgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJJTkNBTExfUkVDT1JEX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFZPSUNFX1JFQ09SRF9SWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfdXNiX3J4X2RhaSA9IHsKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gUGxheWJhY2siLAorCQkuYWlmX25hbWUgPSAiVVNCX0FVRElPX1JYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKKwkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8zODQwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSA4LAorCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCS5yYXRlX21pbiA9IDgwMDAsCisJfSwKKwkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCS5pZCA9IEFGRV9QT1JUX0lEX1VTQl9SWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl91c2JfdHhfZGFpID0geworCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAorCQkuYWlmX25hbWUgPSAiVVNCX0FVRElPX1RYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKKwkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8zODQwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSA4LAorCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCS5yYXRlX21pbiA9IDgwMDAsCisJfSwKKwkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCS5pZCA9IEFGRV9QT1JUX0lEX1VTQl9UWCwKKwkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBtc21fYXV4cGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqZGFpX2RhdGE7CisJc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhICphdXhwY21fcGRhdGE7CisJdWludDMyX3QgdmFsX2FycmF5W1JBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTXTsKKwl1aW50MzJfdCB2YWwgPSAwOworCWNvbnN0IGNoYXIgKmludGZfbmFtZTsKKwlpbnQgcmMgPSAwLCBpID0gMCwgbGVuID0gMDsKKwljb25zdCB1aW50MzJfdCAqc2xvdF9tYXBwaW5nX2FycmF5ID0gTlVMTDsKKwl1MzIgYXJyYXlfbGVuZ3RoID0gMDsKKworCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfYXV4cGNtX2RhaV9kYXRhKSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghZGFpX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJYXV4cGNtX3BkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhKSwKKwkJCQlHRlBfS0VSTkVMKTsKKworCWlmICghYXV4cGNtX3BkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIGZhaWxfcGRhdGFfbm9tZW07CisJfQorCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiAlcEssIGRhaV9kYXRhICVwSywgYXV4cGNtX3BkYXRhICVwS1xuIiwKKwkJX19mdW5jX18sICZwZGV2LT5kZXYsIGRhaV9kYXRhLCBhdXhwY21fcGRhdGEpOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLW1vZGUiLAorCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLW1vZGUgbWlzc2luZyBpbiBEVCBub2RlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKKwl9CisJYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm1vZGUgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOworCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubW9kZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXN5bmMiLAorCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLXN5bmMgbWlzc2luZyBpbiBEVCBub2RlXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKKwl9CisJYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnN5bmMgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOworCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc3luYyA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLWZyYW1lIiwKKwkJCXZhbF9hcnJheSwgUkFURV9NQVhfTlVNX09GX0FVWF9QQ01fUkFURVMpOworCisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLWZyYW1lIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBmYWlsX2ludmFsaWRfZHQ7CisJfQorCWF1eHBjbV9wZGF0YS0+bW9kZV84ay5mcmFtZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfOEtIWl07CisJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5mcmFtZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXF1YW50IiwKKwkJCXZhbF9hcnJheSwgUkFURV9NQVhfTlVNX09GX0FVWF9QQ01fUkFURVMpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1xdWFudCBtaXNzaW5nIGluIERUIG5vZGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2R0OworCX0KKwlhdXhwY21fcGRhdGEtPm1vZGVfOGsucXVhbnQgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOworCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucXVhbnQgPSAodTE2KXZhbF9hcnJheVtSQVRFXzE2S0haXTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkicWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1udW0tc2xvdHMiLAorCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLW51bS1zbG90cyBtaXNzaW5nIGluIERUIG5vZGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2R0OworCX0KKwlhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzID0gKHUxNil2YWxfYXJyYXlbUkFURV84S0haXTsKKworCWlmIChhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzID4KKwkgICAgbXNtX2RhaV9xNl9tYXhfbnVtX3Nsb3QoYXV4cGNtX3BkYXRhLT5tb2RlXzhrLmZyYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBNYXggc2xvdHMgJWQgZ3JlYXRlciB0aGFuIERUIG5vZGUgJWRcbiIsCisJCQkgX19mdW5jX18sCisJCQltc21fZGFpX3E2X21heF9udW1fc2xvdChhdXhwY21fcGRhdGEtPm1vZGVfOGsuZnJhbWUpLAorCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm51bV9zbG90cyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2ludmFsaWRfZHQ7CisJfQorCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzID0gKHUxNil2YWxfYXJyYXlbUkFURV8xNktIWl07CisKKwlpZiAoYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMgPgorCSAgICBtc21fZGFpX3E2X21heF9udW1fc2xvdChhdXhwY21fcGRhdGEtPm1vZGVfMTZrLmZyYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBNYXggc2xvdHMgJWQgZ3JlYXRlciB0aGFuIERUIG5vZGUgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCW1zbV9kYWlfcTZfbWF4X251bV9zbG90KGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuZnJhbWUpLAorCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2R0OworCX0KKworCXNsb3RfbWFwcGluZ19hcnJheSA9IG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkicWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1zbG90LW1hcHBpbmciLCAmbGVuKTsKKworCWlmIChzbG90X21hcHBpbmdfYXJyYXkgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBzbG90X21hcHBpbmdfYXJyYXkgaXMgbm90IHZhbGlkXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2R0OworCX0KKworCWFycmF5X2xlbmd0aCA9IGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMgKworCQkgICAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHM7CisKKwlpZiAobGVuICE9IHNpemVvZih1aW50MzJfdCkgKiBhcnJheV9sZW5ndGgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgTGVuZ3RoIGlzICVkIGFuZCBleHBlY3RlZCBpcyAlemRcbiIsCisJCQlfX2Z1bmNfXywgbGVuLCBzaXplb2YodWludDMyX3QpICogYXJyYXlfbGVuZ3RoKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKKwl9CisKKwlhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nID0KKwkJCQkJa3phbGxvYyhzaXplb2YodWludDE2X3QpICoKKwkJCQkJICAgIGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWF1eHBjbV9wZGF0YS0+bW9kZV84ay5zbG90X21hcHBpbmcpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgTm8gbWVtIGZvciBtb2RlXzhrIHNsb3QgbWFwcGluZ1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm51bV9zbG90czsgaSsrKQorCQlhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nW2ldID0KKwkJCQkodTE2KWJlMzJfdG9fY3B1KHNsb3RfbWFwcGluZ19hcnJheVtpXSk7CisKKwlhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZyA9CisJCQkJCWt6YWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCisJCQkJCSAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc2xvdF9tYXBwaW5nKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIE5vIG1lbSBmb3IgbW9kZV8xNmsgc2xvdCBtYXBwaW5nXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9pbnZhbGlkXzE2a19zbG90X21hcHBpbmc7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzOyBpKyspCisJCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc2xvdF9tYXBwaW5nW2ldID0KKwkJCSh1MTYpYmUzMl90b19jcHUoc2xvdF9tYXBwaW5nX2FycmF5W2kgKworCQkJCQlhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzXSk7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNtLWNwdWRhaS1hdXhwY20tZGF0YSIsCisJCQl2YWxfYXJyYXksIFJBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHFjb20sbXNtLWNwdWRhaS1hdXhwY20tZGF0YSBtaXNzaW5nIGluIERUIG5vZGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2R0MTsKKwl9CisJYXV4cGNtX3BkYXRhLT5tb2RlXzhrLmRhdGEgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOworCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuZGF0YSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXBjbS1jbGstcmF0ZSIsCisJCQl2YWxfYXJyYXksIFJBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLXBjbS1jbGstcmF0ZSBtaXNzaW5nIGluIERUXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfaW52YWxpZF9kdDE7CisJfQorCWF1eHBjbV9wZGF0YS0+bW9kZV84ay5wY21fY2xrX3JhdGUgPSAoaW50KXZhbF9hcnJheVtSQVRFXzhLSFpdOworCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucGNtX2Nsa19yYXRlID0gKGludCl2YWxfYXJyYXlbUkFURV8xNktIWl07CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNtLWF1eHBjbS1pbnRlcmZhY2UiLCAmaW50Zl9uYW1lKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBxY29tLG1zbS1hdXhwY20taW50ZXJmYWNlIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBmYWlsX25vZGV2X2ludGY7CisJfQorCisJaWYgKCFzdHJjbXAoaW50Zl9uYW1lLCAicHJpbWFyeSIpKSB7CisJCWRhaV9kYXRhLT5yeF9waWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDsKKwkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOworCQlwZGV2LT5pZCA9IE1TTV9EQUlfUFJJX0FVWFBDTV9EVF9ERVZfSUQ7CisJCWkgPSAwOworCX0gZWxzZSBpZiAoIXN0cmNtcChpbnRmX25hbWUsICJzZWNvbmRhcnkiKSkgeworCQlkYWlfZGF0YS0+cnhfcGlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDsKKwkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg7CisJCXBkZXYtPmlkID0gTVNNX0RBSV9TRUNfQVVYUENNX0RUX0RFVl9JRDsKKwkJaSA9IDE7CisJfSBlbHNlIGlmICghc3RyY21wKGludGZfbmFtZSwgInRlcnRpYXJ5IikpIHsKKwkJZGFpX2RhdGEtPnJ4X3BpZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDsKKwkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDsKKwkJcGRldi0+aWQgPSBNU01fREFJX1RFUlRfQVVYUENNX0RUX0RFVl9JRDsKKwkJaSA9IDI7CisJfSBlbHNlIGlmICghc3RyY21wKGludGZfbmFtZSwgInF1YXRlcm5hcnkiKSkgeworCQlkYWlfZGF0YS0+cnhfcGlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg7CisJCWRhaV9kYXRhLT50eF9waWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDsKKwkJcGRldi0+aWQgPSBNU01fREFJX1FVQVRfQVVYUENNX0RUX0RFVl9JRDsKKwkJaSA9IDM7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGludmFsaWQgRFQgaW50ZiBuYW1lICVzXG4iLAorCQkJX19mdW5jX18sIGludGZfbmFtZSk7CisJCWdvdG8gZmFpbF9pbnZhbGlkX2ludGY7CisJfQorCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICAicWNvbSxtc20tY3B1ZGFpLWFmZS1jbGstdmVyIiwgJnZhbCk7CisJaWYgKHJjKQorCQlkYWlfZGF0YS0+YWZlX2Nsa192ZXIgPSBBRkVfQ0xLX1ZFUlNJT05fVjE7CisJZWxzZQorCQlkYWlfZGF0YS0+YWZlX2Nsa192ZXIgPSB2YWw7CisKKwltdXRleF9pbml0KCZkYWlfZGF0YS0+cmxvY2spOworCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGFpX2RhdGEpOworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikgYXV4cGNtX3BkYXRhOworCisJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfcTZfYXV4X3BjbV9kYWlfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfcTZfYXV4X3BjbV9kYWlbaV0sIDEpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogYXV4cGNtIGRhaSByZWcgZmFpbGVkLCByYz0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWxfcmVnX2RhaTsKKwl9CisKKwlyZXR1cm4gcmM7CisKK2ZhaWxfcmVnX2RhaToKK2ZhaWxfaW52YWxpZF9pbnRmOgorZmFpbF9ub2Rldl9pbnRmOgorZmFpbF9pbnZhbGlkX2R0MToKKwlrZnJlZShhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZyk7CitmYWlsX2ludmFsaWRfMTZrX3Nsb3RfbWFwcGluZzoKKwlrZnJlZShhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nKTsKK2ZhaWxfaW52YWxpZF9kdDoKKwlrZnJlZShhdXhwY21fcGRhdGEpOworZmFpbF9wZGF0YV9ub21lbToKKwlrZnJlZShkYWlfZGF0YSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9hdXhwY21fZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqZGFpX2RhdGE7CisKKwlkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CisKKwltdXRleF9kZXN0cm95KCZkYWlfZGF0YS0+cmxvY2spOworCWtmcmVlKGRhaV9kYXRhKTsKKwlrZnJlZShwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2F1eHBjbV9kZXZfZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWF1eHBjbS1kZXYiLCB9LAorCXt9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9hdXhwY21fZGV2X2RyaXZlciA9IHsKKwkucHJvYmUgID0gbXNtX2F1eHBjbV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9hdXhwY21fZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tYXV4cGNtLWRldiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fYXV4cGNtX2Rldl9kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9zbGltYnVzX3J4X2RhaVtdID0geworCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMF9SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU18wX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzFfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCisJCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfMV9SWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU18yX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzJfUlgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfM19SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU18zX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzRfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCisJCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfNF9SWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU182X1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzZfUlgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfNV9SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU181X1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzdfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCisJCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfN19SWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzOCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU184X1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAorCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzhfUlgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X3NsaW1idXNfdHhfZGFpW10gPSB7CisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMF9UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfMF9UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMV9UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfMV9UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMl9UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzJfVFgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzNfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSA0LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU18zX1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU180X1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDQsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzRfVFgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzVfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU181X1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czYgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU182X1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCisJCS5pZCA9IFNMSU1CVVNfNl9UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfN19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDE5MjAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKKwkJLmlkID0gU0xJTUJVU183X1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czggQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0xJTUJVU184X1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAorCQkuaWQgPSBTTElNQlVTXzhfVFgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmRhdGFfZm9ybWF0ID0gdmFsdWU7CisJcHJfZGVidWcoIiVzOiB2YWx1ZSA9ICVkLCBjaGFubmVsID0gJWQsIGxpbmUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCB2YWx1ZSwgZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5tb25vX3N0ZXJlbywKKwkJIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmRhdGFfZm9ybWF0OworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWkyc19jb25maWdfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIlBSSSBNSTJTIFJYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDIE1JMlMgUlggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUIE1JMlMgUlggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUIE1JMlMgUlggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUlOIE1JMlMgUlggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUkkgTUkyUyBUWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAorCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAorCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQyBNSTJTIFRYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVCBNSTJTIFRYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVCBNSTJTIFRYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVJTiBNSTJTIFRYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCisJCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VOQVJZIE1JMlMgVFggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKKwkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9CisJCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBtc21fbWkyc19wZGF0YSAqbWkyc19wZGF0YSA9CisJCQkoc3RydWN0IG1zbV9taTJzX3BkYXRhICopIGRhaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjdHJsID0gTlVMTDsKKworCWRhaS0+aWQgPSBtaTJzX3BkYXRhLT5pbnRmX2lkOworCisJaWYgKG1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUpIHsKKwkJaWYgKGRhaS0+aWQgPT0gTVNNX1BSSU1fTUkyUykKKwkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbMF07CisJCWlmIChkYWktPmlkID09IE1TTV9TRUNfTUkyUykKKwkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbMV07CisJCWlmIChkYWktPmlkID09IE1TTV9URVJUX01JMlMpCisJCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzJdOworCQlpZiAoZGFpLT5pZCA9PSBNU01fUVVBVF9NSTJTKQorCQkJY3RybCA9ICZtaTJzX2NvbmZpZ19jb250cm9sc1szXTsKKwkJaWYgKGRhaS0+aWQgPT0gTVNNX1FVSU5fTUkyUykKKwkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbNF07CisJfQorCisJaWYgKGN0cmwpIHsKKwkJa2NvbnRyb2wgPSBzbmRfY3RsX25ldzEoY3RybCwKKwkJCQkJJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhKTsKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsIGtjb250cm9sKTsKKworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBlcnIgYWRkIFJYIGZtdCBjdGwgREFJID0gJXNcbiIsCisJCQkJX19mdW5jX18sIGRhaS0+bmFtZSk7CisJCQlnb3RvIHJ0bjsKKwkJfQorCX0KKworCWN0cmwgPSBOVUxMOworCWlmIChtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlKSB7CisJCWlmIChkYWktPmlkID09IE1TTV9QUklNX01JMlMpCisJCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzRdOworCQlpZiAoZGFpLT5pZCA9PSBNU01fU0VDX01JMlMpCisJCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzVdOworCQlpZiAoZGFpLT5pZCA9PSBNU01fVEVSVF9NSTJTKQorCQkJY3RybCA9ICZtaTJzX2NvbmZpZ19jb250cm9sc1s2XTsKKwkJaWYgKGRhaS0+aWQgPT0gTVNNX1FVQVRfTUkyUykKKwkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbN107CisJCWlmIChkYWktPmlkID09IE1TTV9RVUlOX01JMlMpCisJCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzldOworCQlpZiAoZGFpLT5pZCA9PSBNU01fU0VOQVJZX01JMlMpCisJCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzEwXTsKKwl9CisKKwlpZiAoY3RybCkgeworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQlzbmRfY3RsX25ldzEoY3RybCwKKwkJCQkmbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEpKTsKKworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJaWYgKGtjb250cm9sKQorCQkJCXNuZF9jdGxfcmVtb3ZlKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkJCWtjb250cm9sKTsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBUWCBmbXQgY3RsIERBSSA9ICVzXG4iLAorCQkJCV9fZnVuY19fLCBkYWktPm5hbWUpOworCQl9CisJfQorCXJjID0gbXNtX2RhaV9xNl9kYWlfYWRkX3JvdXRlKGRhaSk7CitydG46CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9CisJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJaW50IHJjOworCisJLyogSWYgQUZFIHBvcnQgaXMgc3RpbGwgdXAsIGNsb3NlIGl0ICovCisJaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCSAgICAgbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuc3RhdHVzX21hc2spKSB7CisJCXJjID0gYWZlX2Nsb3NlKE1JMlNfUlgpOyAvKiBjYW4gYmxvY2sgKi8KKwkJaWYgKElTX0VSUl9WQUxVRShyYykpCisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBNSTJTX1JYIHBvcnRcbiIpOworCQljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKKwkJCSAgbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuc3RhdHVzX21hc2spOworCX0KKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKKwkJICAgICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzaykpIHsKKwkJcmMgPSBhZmVfY2xvc2UoTUkyU19UWCk7IC8qIGNhbiBibG9jayAqLworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIE1JMlNfVFggcG9ydFxuIik7CisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAorCQkJICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzayk7CisJfQorCWtmcmVlKG1pMnNfZGFpX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtc21fbWkyc19nZXRfcG9ydF9pZCh1MzIgbWkyc19pZCwgaW50IHN0cmVhbSwgdTE2ICpwb3J0X2lkKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChzdHJlYW0pIHsKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6CisJCXN3aXRjaCAobWkyc19pZCkgeworCQljYXNlIE1TTV9QUklNX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9TRUNfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7CisJCQlicmVhazsKKwkJY2FzZSBNU01fVEVSVF9NSTJTOgorCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1FVQVRfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1NFQ19NSTJTX1NEMToKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1FVSU5fTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDBfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDFfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDJfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMl9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDNfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDRfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDVfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNV9NSTJTX1JYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX0lOVDZfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBwbGF5YmFjayBlcnIgaWQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgbWkyc19pZCk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6CisJCXN3aXRjaCAobWkyc19pZCkgeworCQljYXNlIE1TTV9QUklNX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9TRUNfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg7CisJCQlicmVhazsKKwkJY2FzZSBNU01fVEVSVF9NSTJTOgorCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1FVQVRfTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1FVSU5fTUkyUzoKKwkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX1NFTkFSWV9NSTJTOgorCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQwX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQxX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQyX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQzX01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQ0X01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQ1X01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9JTlQ2X01JMlM6CisJCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogY2FwdHVyZSBlcnIgaWQgMHgleFxuIiwgX19mdW5jX18sIG1pMnNfaWQpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGRlZmF1bHQgZXJyICVkXG4iLCBfX2Z1bmNfXywgc3RyZWFtKTsKKwkJcmV0ID0gLTE7CisJYnJlYWs7CisJfQorCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCAqcG9ydF9pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9CisJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkgJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhIDoKKwkJICZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSk7CisJdTE2IHBvcnRfaWQgPSAwOworCWludCByYyA9IDA7CisKKwlpZiAobXNtX21pMnNfZ2V0X3BvcnRfaWQoZGFpLT5pZCwgc3Vic3RyZWFtLT5zdHJlYW0sCisJCQkJICZwb3J0X2lkKSAhPSAwKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogSW52YWxpZCBQb3J0IElEIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGRhaSBpZCAlZCwgYWZlIHBvcnQgaWQgPSAweCV4XG4iCisJCSJkYWlfZGF0YS0+Y2hhbm5lbHMgPSAldSBzYW1wbGVfcmF0ZSA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJZGFpLT5pZCwgcG9ydF9pZCwgZGFpX2RhdGEtPmNoYW5uZWxzLCBkYWlfZGF0YS0+cmF0ZSk7CisKKwlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKKwkJLyogUE9SVCBTVEFSVCBzaG91bGQgYmUgc2V0IGlmIHByZXBhcmUgY2FsbGVkCisJCSAqIGluIGFjdGl2ZSBzdGF0ZS4KKwkJICovCisJCXJjID0gYWZlX3BvcnRfc3RhcnQocG9ydF9pZCwgJmRhaV9kYXRhLT5wb3J0X2NvbmZpZywKKwkJCQkgICAgZGFpX2RhdGEtPnJhdGUpOworCisJCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gb3BlbiBBRkUgcG9ydCAweCV4XG4iLAorCQkJCWRhaS0+aWQpOworCQllbHNlCisJCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKwl9CisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cykpIHsKKwkJc2V0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cyk7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlczogc2V0IGh3ZnJlZV9zdGF0dXMgdG8gc3RhcnRlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2RhdGEgKm1pMnNfZGFpX2RhdGEgPQorCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2NvbmZpZyAqbWkyc19kYWlfY29uZmlnID0KKwkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkmbWkyc19kYWlfZGF0YS0+cnhfZGFpIDogJm1pMnNfZGFpX2RhdGEtPnR4X2RhaSk7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gJm1pMnNfZGFpX2NvbmZpZy0+bWkyc19kYWlfZGF0YTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2kyc19jZmcgKmkycyA9ICZkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzOworCisJZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJc3dpdGNoIChkYWlfZGF0YS0+Y2hhbm5lbHMpIHsKKwljYXNlIDg6CisJY2FzZSA3OgorCQlpZiAobWkyc19kYWlfY29uZmlnLT5wZGF0YV9taTJzX2xpbmVzIDwgQUZFX1BPUlRfSTJTXzhDSFMpCisJCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPSBBRkVfUE9SVF9JMlNfOENIUzsKKwkJYnJlYWs7CisJY2FzZSA2OgorCWNhc2UgNToKKwkJaWYgKG1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lcyA8IEFGRV9QT1JUX0kyU182Q0hTKQorCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7CisJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0gQUZFX1BPUlRfSTJTXzZDSFM7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDM6CisJCWlmIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMgPCBBRkVfUE9SVF9JMlNfUVVBRDAxKQorCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7CisJCWlmIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMgPT0gQUZFX1BPUlRfSTJTX1FVQUQyMykKKwkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0KKwkJCQltaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXM7CisJCWVsc2UKKwkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0KKwkJCQkJQUZFX1BPUlRfSTJTX1FVQUQwMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMToKKwkJaWYgKG1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lcyA8IEFGRV9QT1JUX0kyU19TRDApCisJCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwkJc3dpdGNoIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMpIHsKKwkJY2FzZSBBRkVfUE9SVF9JMlNfU0QwOgorCQljYXNlIEFGRV9QT1JUX0kyU19TRDE6CisJCWNhc2UgQUZFX1BPUlRfSTJTX1NEMjoKKwkJY2FzZSBBRkVfUE9SVF9JMlNfU0QzOgorCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPQorCQkJCW1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lczsKKwkJCWJyZWFrOworCQljYXNlIEFGRV9QT1JUX0kyU19RVUFEMDE6CisJCWNhc2UgQUZFX1BPUlRfSTJTXzZDSFM6CisJCWNhc2UgQUZFX1BPUlRfSTJTXzhDSFM6CisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9CisJCQkJCQlBRkVfUE9SVF9JMlNfU0QwOworCQkJYnJlYWs7CisJCWNhc2UgQUZFX1BPUlRfSTJTX1FVQUQyMzoKKwkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0KKwkJCQkJCUFGRV9QT1JUX0kyU19TRDI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGFpX2RhdGEtPmNoYW5uZWxzID09IDIpCisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLm1vbm9fc3RlcmVvID0KKwkJCQkJCU1TTV9BRkVfQ0hfU1RFUkVPOworCQllbHNlCisJCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLm1vbm9fc3RlcmVvID0gTVNNX0FGRV9NT05POworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBkZWZhdWx0IGVyciBjaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYWlfZGF0YS0+Y2hhbm5lbHMpOworCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwl9CisJZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TUEVDSUFMOgorCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmJpdF93aWR0aCA9IDE2OworCQlkYWlfZGF0YS0+Yml0d2lkdGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5iaXRfd2lkdGggPSAyNDsKKwkJZGFpX2RhdGEtPmJpdHdpZHRoID0gMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGZvcm1hdCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmkyc19jZmdfbWlub3JfdmVyc2lvbiA9CisJCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRzsKKwlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7CisJaWYgKCh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAorCSAgICBtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzaykgJiYKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKKwkgICAgbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuaHdmcmVlX3N0YXR1cykpIHx8CisJICAgICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAorCSAgICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzaykgJiYKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKKwkgICAgbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEuaHdmcmVlX3N0YXR1cykpKSB7CisJCWlmICgobWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEucmF0ZSAhPQorCQkgICAgbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEucmF0ZSkgfHwKKwkJICAgKG1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLmJpdHdpZHRoICE9CisJCSAgICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5iaXR3aWR0aCkpIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogRXJyb3IgbWlzbWF0Y2ggaW4gSFcgcGFyYW1zXG4iCisJCQkJIlR4IHNhbXBsZV9yYXRlID0gJXUgYml0X3dpZHRoID0gJWh1XG4iCisJCQkJIlJ4IHNhbXBsZV9yYXRlID0gJXUgYml0X3dpZHRoID0gJWh1XG4iCisJCQkJLCBfX2Z1bmNfXywKKwkJCQltaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5yYXRlLAorCQkJCW1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLmJpdHdpZHRoLAorCQkJCW1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnJhdGUsCisJCQkJbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuYml0d2lkdGgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBkYWkgaWQgJWQgZGFpX2RhdGEtPmNoYW5uZWxzID0gJWRcbiIKKwkJInNhbXBsZV9yYXRlID0gJXUgaTJzX2NmZ19taW5vcl92ZXJzaW9uID0gMHgleFxuIgorCQkiYml0X3dpZHRoID0gJWh1ICBjaGFubmVsX21vZGUgPSAweCV4IG1vbm9fc3RlcmVvID0gJSN4XG4iCisJCSJ3c19zcmMgPSAweCV4IHNhbXBsZV9yYXRlID0gJXUgZGF0YV9mb3JtYXQgPSAweCV4XG4iCisJCSJyZXNlcnZlZCA9ICV1XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCwgZGFpX2RhdGEtPmNoYW5uZWxzLAorCQlkYWlfZGF0YS0+cmF0ZSwgaTJzLT5pMnNfY2ZnX21pbm9yX3ZlcnNpb24sIGkycy0+Yml0X3dpZHRoLAorCQlpMnMtPmNoYW5uZWxfbW9kZSwgaTJzLT5tb25vX3N0ZXJlbywgaTJzLT53c19zcmMsCisJCWkycy0+c2FtcGxlX3JhdGUsIGkycy0+ZGF0YV9mb3JtYXQsIGkycy0+cmVzZXJ2ZWQpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ludmFsaWRfZGF0YToKKwlwcl9lcnIoIiVzOiBkYWlfZGF0YS0+Y2hhbm5lbHMgPSAlZCBjaGFubmVsX21vZGUgPSAlZFxuIiwgX19mdW5jX18sCisJCSBkYWlfZGF0YS0+Y2hhbm5lbHMsIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2RhdGEgKm1pMnNfZGFpX2RhdGEgPQorCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKKwkgICAgbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuc3RhdHVzX21hc2spIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJICAgIG1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLnN0YXR1c19tYXNrKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGVyciBjaGcgaTJzIG1vZGUgd2hpbGUgZGFpIHJ1bm5pbmciLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCW1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnBvcnRfY29uZmlnLmkycy53c19zcmMgPSAxOworCQltaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5wb3J0X2NvbmZpZy5pMnMud3Nfc3JjID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQltaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5wb3J0X2NvbmZpZy5pMnMud3Nfc3JjID0gMDsKKwkJbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLndzX3NyYyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGZtdCAlZFxuIiwKKwkJCV9fZnVuY19fLCBmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl9taTJzX2RhaV9kYXRhICptaTJzX2RhaV9kYXRhID0KKwkJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkgJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhIDoKKwkJICZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPmh3ZnJlZV9zdGF0dXMpKSB7CisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cyk7CisJCWRldl9kYmcoZGFpLT5kZXYsICIlczogY2xlYXIgaHdmcmVlX3N0YXR1c1xuIiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2RhaV9xNl9taTJzX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9CisJCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9CisJCShzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KKwkJICZtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YSA6CisJCSAmbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEpOworCSB1MTYgcG9ydF9pZCA9IDA7CisJaW50IHJjID0gMDsKKworCWlmIChtc21fbWkyc19nZXRfcG9ydF9pZChkYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkJCQkgJnBvcnRfaWQpICE9IDApIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBJbnZhbGlkIFBvcnQgSUQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJfQorCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBjbG9zaW5nIGFmZSBwb3J0IGlkID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spKSB7CisJCXJjID0gYWZlX2Nsb3NlKHBvcnRfaWQpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFGRSBwb3J0XG4iKTsKKwkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7CisJfQorCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cykpCisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfcTZfbWkyc19vcHMgPSB7CisJLnN0YXJ0dXAJPSBtc21fZGFpX3E2X21pMnNfc3RhcnR1cCwKKwkucHJlcGFyZQk9IG1zbV9kYWlfcTZfbWkyc19wcmVwYXJlLAorCS5od19wYXJhbXMJPSBtc21fZGFpX3E2X21pMnNfaHdfcGFyYW1zLAorCS5od19mcmVlCT0gbXNtX2RhaV9xNl9taTJzX2h3X2ZyZWUsCisJLnNldF9mbXQJPSBtc21fZGFpX3E2X21pMnNfc2V0X2ZtdCwKKwkuc2h1dGRvd24JPSBtc21fZGFpX3E2X21pMnNfc2h1dGRvd24sCit9OworCisvKiBDaGFubmVsIG1pbiBhbmQgbWF4IGFyZSBpbml0aWFsaXplZCBiYXNlIG9uIHBsYXRmb3JtIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfbWkyc19kYWlbXSA9IHsKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfTUkyU19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9QUklNX01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfTUkyU19SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfTUkyU19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9TRUNfTUkyUywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9NSTJTX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKKwkJLmlkID0gTVNNX1RFUlRfTUkyUywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX01JMlNfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfTUkyU19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9RVUFUX01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIFBsYXliYWNrIFNEMSIsCisJCQkuYWlmX25hbWUgPSAiU0VDX01JMlNfUlhfU0QxIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmlkID0gTVNNX1NFQ19NSTJTX1NEMSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1aW5hcnkgTUkyUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVJTl9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1aW5hcnkgTUkyUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRVUlOX01JMlNfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9RVUlOX01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2VuYXJ5X21pMnMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiU0VOQVJZX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAorCQkuaWQgPSBNU01fU0VOQVJZX01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIklOVDAgTUkyUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiSU5UMF9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQwIE1JMlMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiSU5UMF9NSTJTX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAorCQkuaWQgPSBNU01fSU5UMF9NSTJTLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQxIE1JMlMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIklOVDFfTUkyU19SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIklOVDEgTUkyUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJJTlQxX01JMlNfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9JTlQxX01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIklOVDIgTUkyUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiSU5UMl9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UMiBNSTJTIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIklOVDJfTUkyU19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKKwkJLmlkID0gTVNNX0lOVDJfTUkyUywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UMyBNSTJTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJJTlQzX01JMlNfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQzIE1JMlMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiSU5UM19NSTJTX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAorCQkuaWQgPSBNU01fSU5UM19NSTJTLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQ0IE1JMlMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIklOVDRfTUkyU19SWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIklOVDQgTUkyUyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJJTlQ0X01JMlNfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCisJCS5pZCA9IE1TTV9JTlQ0X01JMlMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIklOVDUgTUkyUyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiSU5UNV9NSTJTX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UNSBNSTJTIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIklOVDVfTUkyU19UWCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCisJCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKKwkJLmlkID0gTVNNX0lOVDVfTUkyUywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSU5UNiBNSTJTIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJJTlQ2X01JMlNfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKKwkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAorCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJTlQ2IE1JMlMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiSU5UNl9NSTJTX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkucmF0ZV9taW4gPSAgICAgODAwMCwKKwkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAorCQkuaWQgPSBNU01fSU5UNl9NSTJTLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCisJfSwKK307CisKKworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZ2V0X2xpbmVjb25maWcodTE2IHNkX2xpbmVzLCB1MTYgKmNvbmZpZ19wdHIsCisJCQkJCSAgdW5zaWduZWQgaW50ICpjaF9jbnQpCit7CisJdTggbnVtX29mX3NkX2xpbmVzOworCisJbnVtX29mX3NkX2xpbmVzID0gbnVtX29mX2JpdHNfc2V0KHNkX2xpbmVzKTsKKwlzd2l0Y2ggKG51bV9vZl9zZF9saW5lcykgeworCWNhc2UgMDoKKwkJcHJfZGVidWcoIiVzOiBubyBsaW5lIGlzIGFzc2lnbmVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3dpdGNoIChzZF9saW5lcykgeworCQljYXNlIE1TTV9NSTJTX1NEMDoKKwkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMDsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9NSTJTX1NEMToKKwkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMTsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9NSTJTX1NEMjoKKwkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMjsKKwkJCWJyZWFrOworCQljYXNlIE1TTV9NSTJTX1NEMzoKKwkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogaW52YWxpZCBTRCBsaW5lcyAlZFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgc2RfbGluZXMpOworCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzd2l0Y2ggKHNkX2xpbmVzKSB7CisJCWNhc2UgTVNNX01JMlNfU0QwIHwgTVNNX01JMlNfU0QxOgorCQkJKmNvbmZpZ19wdHIgPSBBRkVfUE9SVF9JMlNfUVVBRDAxOworCQkJYnJlYWs7CisJCWNhc2UgTVNNX01JMlNfU0QyIHwgTVNNX01JMlNfU0QzOgorCQkJKmNvbmZpZ19wdHIgPSBBRkVfUE9SVF9JMlNfUVVBRDIzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7CisJCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6CisJCXN3aXRjaCAoc2RfbGluZXMpIHsKKwkJY2FzZSBNU01fTUkyU19TRDAgfCBNU01fTUkyU19TRDEgfCBNU01fTUkyU19TRDI6CisJCQkqY29uZmlnX3B0ciA9IEFGRV9QT1JUX0kyU182Q0hTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7CisJCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwkJfQorCQlicmVhazsKKwljYXNlIDQ6CisJCXN3aXRjaCAoc2RfbGluZXMpIHsKKwkJY2FzZSBNU01fTUkyU19TRDAgfCBNU01fTUkyU19TRDEgfCBNU01fTUkyU19TRDIgfCBNU01fTUkyU19TRDM6CisJCQkqY29uZmlnX3B0ciA9IEFGRV9QT1JUX0kyU184Q0hTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7CisJCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLCBfX2Z1bmNfXywgbnVtX29mX3NkX2xpbmVzKTsKKwkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7CisJfQorCSpjaF9jbnQgPSBudW1fb2Zfc2RfbGluZXM7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ludmFsaWRfZGF0YToKKwlwcl9lcnIoIiVzOiBpbnZhbGlkIGRhdGFcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfcGxhdGZvcm1fZGF0YV92YWxpZGF0aW9uKAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcml2ZXIpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IG1zbV9taTJzX3BkYXRhICptaTJzX3BkYXRhID0KKwkJCShzdHJ1Y3QgbXNtX21pMnNfcGRhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgaW50IGNoX2NudDsKKwlpbnQgcmMgPSAwOworCXUxNiBzZF9saW5lOworCisJaWYgKG1pMnNfcGRhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBtaTJzX3BkYXRhIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gbXNtX2RhaV9xNl9taTJzX2dldF9saW5lY29uZmlnKG1pMnNfcGRhdGEtPnJ4X3NkX2xpbmVzLAorCQkJCQkgICAgJnNkX2xpbmUsICZjaF9jbnQpOworCisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBNSTJTIFJYIHNkIGxpbmUgY29uZmlnXG4iKTsKKwkJZ290byBydG47CisJfQorCisJaWYgKGNoX2NudCkgeworCQlkYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9CisJCXNkX2xpbmU7CisJCWRhaV9kYXRhLT5yeF9kYWkucGRhdGFfbWkyc19saW5lcyA9IHNkX2xpbmU7CisJCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbiA9IDE7CisJCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21heCA9IGNoX2NudCA8PCAxOworCX0gZWxzZSB7CisJCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbiA9IDA7CisJCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21heCA9IDA7CisJfQorCXJjID0gbXNtX2RhaV9xNl9taTJzX2dldF9saW5lY29uZmlnKG1pMnNfcGRhdGEtPnR4X3NkX2xpbmVzLAorCQkJCQkgICAgJnNkX2xpbmUsICZjaF9jbnQpOworCisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBNSTJTIFRYIHNkIGxpbmUgY29uZmlnXG4iKTsKKwkJZ290byBydG47CisJfQorCisJaWYgKGNoX2NudCkgeworCQlkYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9CisJCXNkX2xpbmU7CisJCWRhaV9kYXRhLT50eF9kYWkucGRhdGFfbWkyc19saW5lcyA9IHNkX2xpbmU7CisJCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluID0gMTsKKwkJZGFpX2RyaXZlci0+Y2FwdHVyZS5jaGFubmVsc19tYXggPSBjaF9jbnQgPDwgMTsKKwl9IGVsc2UgeworCQlkYWlfZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbiA9IDA7CisJCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWF4ID0gMDsKKwl9CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcGxheWJhY2sgc2RsaW5lIDB4JXggY2FwdHVyZSBzZGxpbmUgMHgleFxuIiwKKwkJX19mdW5jX18sIGRhaV9kYXRhLT5yeF9kYWkucGRhdGFfbWkyc19saW5lcywKKwkJZGFpX2RhdGEtPnR4X2RhaS5wZGF0YV9taTJzX2xpbmVzKTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcGxheWJhY2sgY2hfbWF4ICVkIGNhcHR1cmUgY2hfbXggJWRcbiIsCisJCV9fZnVuY19fLCBkYWlfZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19tYXgsCisJCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWF4KTsKK3J0bjoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9xNl9taTJzX2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gIm1zbS1kYWktcTYtbWkycyIsCit9Oworc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqZGFpX2RhdGE7CisJY29uc3QgY2hhciAqcTZfbWkyc19kZXZfaWQgPSAicWNvbSxtc20tZGFpLXE2LW1pMnMtZGV2LWlkIjsKKwl1MzIgdHhfbGluZSA9IDA7CisJdTMyICByeF9saW5lID0gMDsKKwl1MzIgbWkyc19pbnRmID0gMDsKKwlzdHJ1Y3QgbXNtX21pMnNfcGRhdGEgKm1pMnNfcGRhdGE7CisJaW50IHJjOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgcTZfbWkyc19kZXZfaWQsCisJCQkJICAmbWkyc19pbnRmKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzOiBtaXNzaW5nIDB4JXggaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIG1pMnNfaW50Zik7CisJCWdvdG8gcnRuOworCX0KKworCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzIGRldiBpZCAweCV4XG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwKKwkJbWkyc19pbnRmKTsKKworCWlmICgobWkyc19pbnRmIDwgTVNNX01JMlNfTUlOIHx8IG1pMnNfaW50ZiA+IE1TTV9NSTJTX01BWCkKKwkJfHwgKG1pMnNfaW50ZiA+PSBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfbWkyc19kYWkpKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IEludmFsaWQgTUkyUyBJRCAldSBmcm9tIERldmljZSBUcmVlXG4iLAorCQkJX19mdW5jX18sIG1pMnNfaW50Zik7CisJCXJjID0gLUVOWElPOworCQlnb3RvIHJ0bjsKKwl9CisKKwlwZGV2LT5pZCA9IG1pMnNfaW50ZjsKKworCW1pMnNfcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21pMnNfcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1pMnNfcGRhdGEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHJ0bjsKKwl9CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxtc20tbWkycy1yeC1saW5lcyIsCisJCQkJICAmcnhfbGluZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBSeCBsaW5lIGZyb20gRFQgZmlsZSAlc1xuIiwgX19mdW5jX18sCisJCQkicWNvbSxtc20tbWkycy1yeC1saW5lcyIpOworCQlnb3RvIGZyZWVfcGRhdGE7CisJfQorCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInFjb20sbXNtLW1pMnMtdHgtbGluZXMiLAorCQkJCSAgJnR4X2xpbmUpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVHggbGluZSBmcm9tIERUIGZpbGUgJXNcbiIsIF9fZnVuY19fLAorCQkJInFjb20sbXNtLW1pMnMtdHgtbGluZXMiKTsKKwkJZ290byBmcmVlX3BkYXRhOworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJkZXYgbmFtZSAlcyBSeCBsaW5lIDB4JXggLCBUeCBpbmUgMHgleFxuIiwKKwkJZGV2X25hbWUoJnBkZXYtPmRldiksIHJ4X2xpbmUsIHR4X2xpbmUpOworCW1pMnNfcGRhdGEtPnJ4X3NkX2xpbmVzID0gcnhfbGluZTsKKwltaTJzX3BkYXRhLT50eF9zZF9saW5lcyA9IHR4X2xpbmU7CisJbWkyc19wZGF0YS0+aW50Zl9pZCA9IG1pMnNfaW50ZjsKKworCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSksCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhaV9kYXRhKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3BkYXRhOworCX0gZWxzZQorCQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGFpX2RhdGEpOworCisJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBtaTJzX3BkYXRhOworCisJcmMgPSBtc21fZGFpX3E2X21pMnNfcGxhdGZvcm1fZGF0YV92YWxpZGF0aW9uKHBkZXYsCisJCQkmbXNtX2RhaV9xNl9taTJzX2RhaVttaTJzX2ludGZdKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKKwkJZ290byBmcmVlX2RhaV9kYXRhOworCisJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmbXNtX3E2X21pMnNfZGFpX2NvbXBvbmVudCwKKwkmbXNtX2RhaV9xNl9taTJzX2RhaVttaTJzX2ludGZdLCAxKTsKKworCWlmIChJU19FUlJfVkFMVUUocmMpKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWwgdG8gbXNtX2RhaV9xNl9taTJzX2Rldl9wcm9iZVxuIik7CitmcmVlX2RhaV9kYXRhOgorCWtmcmVlKGRhaV9kYXRhKTsKK2ZyZWVfcGRhdGE6CisJa2ZyZWUobWkyc19wZGF0YSk7CitydG46CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2RhaV9xNl9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gIm1zbS1kYWktcTYtZGV2IiwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmMsIGlkLCBpLCBsZW47CisJY29uc3QgY2hhciAqcTZfZGV2X2lkID0gInFjb20sbXNtLWRhaS1xNi1kZXYtaWQiOworCWNoYXIgc3RyZWFtX25hbWVbODBdOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgcTZfZGV2X2lkLCAmaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIHE2X2Rldl9pZCk7CisJCXJldHVybiByYzsKKwl9CisKKwlwZGV2LT5pZCA9IGlkOworCisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlcywgaWQ6JWRcbiIsIF9fZnVuY19fLAorCQkgZGV2X25hbWUoJnBkZXYtPmRldiksIHBkZXYtPmlkKTsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFNMSU1CVVNfMF9SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXMgUGxheWJhY2siLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKKwljYXNlIFNMSU1CVVNfMl9SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXMyIFBsYXliYWNrIiwgODApOworCQlnb3RvIHJlZ2lzdGVyX3NsaW1fcGxheWJhY2s7CisJY2FzZSBTTElNQlVTXzFfUlg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzMSBQbGF5YmFjayIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOworCWNhc2UgU0xJTUJVU18zX1JYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czMgUGxheWJhY2siLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKKwljYXNlIFNMSU1CVVNfNF9SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM0IFBsYXliYWNrIiwgODApOworCQlnb3RvIHJlZ2lzdGVyX3NsaW1fcGxheWJhY2s7CisJY2FzZSBTTElNQlVTXzVfUlg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzNSBQbGF5YmFjayIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOworCWNhc2UgU0xJTUJVU182X1JYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czYgUGxheWJhY2siLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKKwljYXNlIFNMSU1CVVNfN19SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM3IFBsYXliYWNrIiwgc2l6ZW9mKHN0cmVhbV9uYW1lKSk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKKwljYXNlIFNMSU1CVVNfOF9SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM4IFBsYXliYWNrIiwgc2l6ZW9mKHN0cmVhbV9uYW1lKSk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKK3JlZ2lzdGVyX3NsaW1fcGxheWJhY2s6CisJCXJjID0gLUVOT0RFVjsKKwkJbGVuID0gc3RybmxlbihzdHJlYW1fbmFtZSwgODApOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZGFpX3E2X3NsaW1idXNfcnhfZGFpKTsgaSsrKSB7CisJCQlpZiAobXNtX2RhaV9xNl9zbGltYnVzX3J4X2RhaVtpXS5wbGF5YmFjay5zdHJlYW1fbmFtZSAmJgorCQkJCSFzdHJjbXAoc3RyZWFtX25hbWUsCisJCQkJbXNtX2RhaV9xNl9zbGltYnVzX3J4X2RhaVtpXQorCQkJCS5wbGF5YmFjay5zdHJlYW1fbmFtZSkpIHsKKwkJCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LAorCQkJCSZtc21fZGFpX3E2X3NsaW1idXNfcnhfZGFpW2ldLCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBEZXZpY2Ugbm90IGZvdW5kIHN0cmVhbSBuYW1lICVzXG4iLAorCQkJCV9fZnVuY19fLCBzdHJlYW1fbmFtZSk7CisJCWJyZWFrOworCWNhc2UgU0xJTUJVU18wX1RYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1cyBDYXB0dXJlIiwgODApOworCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKKwljYXNlIFNMSU1CVVNfMV9UWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXMxIENhcHR1cmUiLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOworCWNhc2UgU0xJTUJVU18yX1RYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czIgQ2FwdHVyZSIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7CisJY2FzZSBTTElNQlVTXzNfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzMyBDYXB0dXJlIiwgODApOworCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKKwljYXNlIFNMSU1CVVNfNF9UWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM0IENhcHR1cmUiLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOworCWNhc2UgU0xJTUJVU181X1RYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czUgQ2FwdHVyZSIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7CisJY2FzZSBTTElNQlVTXzZfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzNiBDYXB0dXJlIiwgODApOworCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKKwljYXNlIFNMSU1CVVNfN19UWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM3IENhcHR1cmUiLCBzaXplb2Yoc3RyZWFtX25hbWUpKTsKKwkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7CisJY2FzZSBTTElNQlVTXzhfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzOCBDYXB0dXJlIiwgc2l6ZW9mKHN0cmVhbV9uYW1lKSk7CisJCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOworcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOgorCQlyYyA9IC1FTk9ERVY7CisJCWxlbiA9IHN0cm5sZW4oc3RyZWFtX25hbWUsIDgwKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2RhaV9xNl9zbGltYnVzX3R4X2RhaSk7IGkrKykgeworCQkJaWYgKG1zbV9kYWlfcTZfc2xpbWJ1c190eF9kYWlbaV0uY2FwdHVyZS5zdHJlYW1fbmFtZSAmJgorCQkJCSFzdHJjbXAoc3RyZWFtX25hbWUsCisJCQkJbXNtX2RhaV9xNl9zbGltYnVzX3R4X2RhaVtpXQorCQkJCS5jYXB0dXJlLnN0cmVhbV9uYW1lKSkgeworCQkJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsCisJCQkJJm1zbV9kYWlfcTZfc2xpbWJ1c190eF9kYWlbaV0sIDEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IERldmljZSBub3QgZm91bmQgc3RyZWFtIG5hbWUgJXNcbiIsCisJCQkJX19mdW5jX18sIHN0cmVhbV9uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRfQlRfU0NPX1JYOgorCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsICZtc21fZGFpX3E2X2J0X3Njb19yeF9kYWksIDEpOworCQlicmVhazsKKwljYXNlIElOVF9CVF9TQ09fVFg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwgJm1zbV9kYWlfcTZfYnRfc2NvX3R4X2RhaSwgMSk7CisJCWJyZWFrOworCWNhc2UgSU5UX0JUX0EyRFBfUlg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwgJm1zbV9kYWlfcTZfYnRfYTJkcF9yeF9kYWksIDEpOworCQlicmVhazsKKwljYXNlIElOVF9GTV9SWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl9mbV9yeF9kYWksIDEpOworCQlicmVhazsKKwljYXNlIElOVF9GTV9UWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl9mbV90eF9kYWksIDEpOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl91c2JfcnhfZGFpLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwgJm1zbV9kYWlfcTZfdXNiX3R4X2RhaSwgMSk7CisJCWJyZWFrOworCWNhc2UgUlRfUFJPWFlfREFJXzAwMV9SWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIkFGRSBQbGF5YmFjayIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl9hZmVfcGxheWJhY2s7CisJY2FzZSBSVF9QUk9YWV9EQUlfMDAyX1JYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiQUZFLVBST1hZIFJYIiwgODApOworcmVnaXN0ZXJfYWZlX3BsYXliYWNrOgorCQlyYyA9IC1FTk9ERVY7CisJCWxlbiA9IHN0cm5sZW4oc3RyZWFtX25hbWUsIDgwKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2RhaV9xNl9hZmVfcnhfZGFpKTsgaSsrKSB7CisJCQlpZiAobXNtX2RhaV9xNl9hZmVfcnhfZGFpW2ldLnBsYXliYWNrLnN0cmVhbV9uYW1lICYmCisJCQkgICAgIXN0cmNtcChzdHJlYW1fbmFtZSwKKwkJCSAgICBtc21fZGFpX3E2X2FmZV9yeF9kYWlbaV0ucGxheWJhY2suc3RyZWFtX25hbWUpKSB7CisJCQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsCisJCQkJCSZtc21fZGFpX3E2X2FmZV9yeF9kYWlbaV0sIDEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IERldmljZSBub3QgZm91bmQgc3RyZWFtIG5hbWUgJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZWFtX25hbWUpOworCQlicmVhazsKKwljYXNlIFJUX1BST1hZX0RBSV8wMDFfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJBRkUtUFJPWFkgVFgiLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfYWZlX2NhcHR1cmU7CisJY2FzZSBSVF9QUk9YWV9EQUlfMDAyX1RYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiQUZFIENhcHR1cmUiLCA4MCk7CityZWdpc3Rlcl9hZmVfY2FwdHVyZToKKwkJcmMgPSAtRU5PREVWOworCQlsZW4gPSBzdHJubGVuKHN0cmVhbV9uYW1lLCA4MCk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfYWZlX3R4X2RhaSk7IGkrKykgeworCQkJaWYgKG1zbV9kYWlfcTZfYWZlX3R4X2RhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lICYmCisJCQkJIXN0cmNtcChzdHJlYW1fbmFtZSwKKwkJCQltc21fZGFpX3E2X2FmZV90eF9kYWlbaV0uY2FwdHVyZS5zdHJlYW1fbmFtZSkpIHsKKwkJCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwKKwkJCQkJJm1zbV9kYWlfcTZfYWZlX3R4X2RhaVtpXSwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogRGV2aWNlIG5vdCBmb3VuZCBzdHJlYW0gbmFtZSAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlYW1fbmFtZSk7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJWb2ljZSBGYXJlbmQgUGxheWJhY2siLCA4MCk7CisJCWdvdG8gcmVnaXN0ZXJfdm9pY2VfcGxheWJhY2s7CisJY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6CisJCXN0cmxjcHkoc3RyZWFtX25hbWUsICJWb2ljZTIgRmFyZW5kIFBsYXliYWNrIiwgODApOworcmVnaXN0ZXJfdm9pY2VfcGxheWJhY2s6CisJCXJjID0gLUVOT0RFVjsKKwkJbGVuID0gc3RybmxlbihzdHJlYW1fbmFtZSwgODApOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZGFpX3E2X3ZvY19wbGF5YmFja19kYWkpOyBpKyspIHsKKwkJCWlmIChtc21fZGFpX3E2X3ZvY19wbGF5YmFja19kYWlbaV0ucGxheWJhY2suc3RyZWFtX25hbWUKKwkJCSAgICAmJiAhc3RyY21wKHN0cmVhbV9uYW1lLAorCQkJIG1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaVtpXS5wbGF5YmFjay5zdHJlYW1fbmFtZSkpIHsKKwkJCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwKKwkJCQkJJm1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaVtpXSwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlcyBEZXZpY2Ugbm90IGZvdW5kIHN0cmVhbSBuYW1lICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBzdHJlYW1fbmFtZSk7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgorCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiVm9pY2UgRG93bmxpbmsgQ2FwdHVyZSIsIDgwKTsKKwkJZ290byByZWdpc3Rlcl91cGxpbmtfY2FwdHVyZTsKKwljYXNlIFZPSUNFX1JFQ09SRF9UWDoKKwkJc3RybGNweShzdHJlYW1fbmFtZSwgIlZvaWNlIFVwbGluayBDYXB0dXJlIiwgODApOworcmVnaXN0ZXJfdXBsaW5rX2NhcHR1cmU6CisJCXJjID0gLUVOT0RFVjsKKwkJbGVuID0gc3RybmxlbihzdHJlYW1fbmFtZSwgODApOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpKTsgaSsrKSB7CisJCQlpZiAobXNtX2RhaV9xNl9pbmNhbGxfcmVjb3JkX2RhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lCisJCQkgICAgJiYgIXN0cmNtcChzdHJlYW1fbmFtZSwKKwkJCSAgICBtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpW2ldLgorCQkJICAgIGNhcHR1cmUuc3RyZWFtX25hbWUpKSB7CisJCQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsCisJCQkJCSZtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpW2ldLCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBEZXZpY2Ugbm90IGZvdW5kIHN0cmVhbSBuYW1lICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVhbV9uYW1lKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9ERVY7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X2Rldl9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LWRldiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl9kZXZfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3E2X2RldiA9IHsKKwkucHJvYmUgID0gbXNtX2RhaV9xNl9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tZGFpLXE2LWRldiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3E2X2Rldl9kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBtc21fZGFpX3E2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlcywgaWQ6JWRcbiIsIF9fZnVuY19fLAorCQkgZGV2X25hbWUoJnBkZXYtPmRldiksIHBkZXYtPmlkKTsKKwlyYyA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBhZGQgY2hpbGQgbm9kZXMsIHJjPSVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwl9IGVsc2UKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGFkZGVkIGNoaWxkIG5vZGVcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9kYWlfcTZfZHRfbWF0Y2gpOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9xNiA9IHsKKwkucHJvYmUgID0gbXNtX2RhaV9xNl9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2RhaV9xNl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWRhaS1xNiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3E2X2R0X21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfbWkyc19xNl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKworCXJjID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocGRldi0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIGFkZCBjaGlsZCBub2RlcywgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCX0gZWxzZQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogYWRkZWQgY2hpbGQgbm9kZVxuIiwgX19mdW5jX18pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX21pMnNfcTZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfbWkyc19kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLW1pMnMiLCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9taTJzX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9taTJzX3E2ID0geworCS5wcm9iZSAgPSBtc21fZGFpX21pMnNfcTZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfbWkyc19xNl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWRhaS1taTJzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfbWkyc19kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9xNl9taTJzX2Rldl9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LW1pMnMiLCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl9taTJzX2Rldl9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9kYWlfcTZfbWkyc19kcml2ZXIgPSB7CisJLnByb2JlICA9IG1zbV9kYWlfcTZfbWkyc19kZXZfcHJvYmUsCisJLnJlbW92ZSAgPSBtc21fZGFpX3E2X21pMnNfZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tZGFpLXE2LW1pMnMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV9xNl9taTJzX2Rldl9kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKworCXBkZXYtPmlkID0gQUZFX1BPUlRfSURfU1BESUZfUlg7CisKKwlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzLCBpZDolZFxuIiwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGRldi0+aWQpOworCisJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfc3BkaWZfcTZfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfcTZfc3BkaWZfc3BkaWZfcnhfZGFpLCAxKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9xNl9zcGRpZl9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtc3BkaWYifSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9kYWlfcTZfc3BkaWZfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3E2X3NwZGlmX2RyaXZlciA9IHsKKwkucHJvYmUgID0gbXNtX2RhaV9xNl9zcGRpZl9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfcTZfc3BkaWZfZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tZGFpLXE2LXNwZGlmIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfcTZfc3BkaWZfZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV90ZG1fcTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmMgPSAwOworCXUzMiBudW1fcG9ydHMgPSAwOworCWNvbnN0IHVpbnQzMl90ICpwb3J0X2lkX2FycmF5ID0gTlVMTDsKKwl1aW50MzJfdCBhcnJheV9sZW5ndGggPSAwOworCWludCBpID0gMDsKKwlpbnQgZ3JvdXBfaWR4ID0gMDsKKworCS8qIGV4dHJhY3QgdGRtIGdyb3VwIGluZm8gaW50byBzdGF0aWMgKi8KKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1pZCIsCisJCSh1MzIgKikmdGRtX2dyb3VwX2NmZy5ncm91cF9pZCk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBHcm91cCBJRCBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtaWQiKTsKKwkJZ290byBydG47CisJfQorCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBHcm91cCBJRCBmcm9tIERUIGZpbGUgMHgleFxuIiwKKwkJX19mdW5jX18sIHRkbV9ncm91cF9jZmcuZ3JvdXBfaWQpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBkZXZfbmFtZTogJXMgZ3JvdXBfaWQ6IDB4JXhcbiIsCisJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgdGRtX2dyb3VwX2NmZy5ncm91cF9pZCk7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1udW0tcG9ydHMiLAorCQkmbnVtX3BvcnRzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEdyb3VwIE51bSBQb3J0cyBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtbnVtLXBvcnRzIik7CisJCWdvdG8gcnRuOworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogR3JvdXAgTnVtIFBvcnRzIGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgbnVtX3BvcnRzKTsKKworCWlmIChudW1fcG9ydHMgPiBBRkVfR1JPVVBfREVWSUNFX05VTV9QT1JUUykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBHcm91cCBOdW0gUG9ydHMgJWQgZ3JlYXRlciB0aGFuIE1heCAlZFxuIiwKKwkJCV9fZnVuY19fLCBudW1fcG9ydHMsIEFGRV9HUk9VUF9ERVZJQ0VfTlVNX1BPUlRTKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHJ0bjsKKwl9CisKKwlwb3J0X2lkX2FycmF5ID0gb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1wb3J0LWlkIiwKKwkJJmFycmF5X2xlbmd0aCk7CisJaWYgKHBvcnRfaWRfYXJyYXkgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBwb3J0X2lkX2FycmF5IGlzIG5vdCB2YWxpZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHJ0bjsKKwl9CisJaWYgKGFycmF5X2xlbmd0aCAhPSBzaXplb2YodWludDMyX3QpICogbnVtX3BvcnRzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGFycmF5X2xlbmd0aCBpcyAlZCwgZXhwZWN0ZWQgaXMgJXpkXG4iLAorCQkJX19mdW5jX18sIGFycmF5X2xlbmd0aCwgc2l6ZW9mKHVpbnQzMl90KSAqIG51bV9wb3J0cyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBydG47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9wb3J0czsgaSsrKQorCQl0ZG1fZ3JvdXBfY2ZnLnBvcnRfaWRbaV0gPQorCQkJKHUxNiliZTMyX3RvX2NwdShwb3J0X2lkX2FycmF5W2ldKTsKKwkvKiBVbnVzZWQgaW5kZXggc2hvdWxkIGJlIGZpbGxlZCB3aXRoIDAgb3IgQUZFX1BPUlRfSU5WQUxJRCAqLworCWZvciAoaSA9IG51bV9wb3J0czsgaSA8IEFGRV9HUk9VUF9ERVZJQ0VfTlVNX1BPUlRTOyBpKyspCisJCXRkbV9ncm91cF9jZmcucG9ydF9pZFtpXSA9CisJCQlBRkVfUE9SVF9JTlZBTElEOworCisJLyogZXh0cmFjdCB0ZG0gY2xrIGluZm8gaW50byBzdGF0aWMgKi8KKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstcmF0ZSIsCisJCSZ0ZG1fY2xrX3NldC5jbGtfZnJlcV9pbl9oeik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDbGsgUmF0ZSBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sbXNtLWNwdWRhaS10ZG0tY2xrLXJhdGUiKTsKKwkJZ290byBydG47CisJfQorCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBDbGsgUmF0ZSBmcm9tIERUIGZpbGUgJWRcbiIsCisJCV9fZnVuY19fLCB0ZG1fY2xrX3NldC5jbGtfZnJlcV9pbl9oeik7CisKKwkvKiBvdGhlciBpbml0aWFsaXphdGlvbnMgd2l0aGluIGRldmljZSBncm91cCAqLworCWdyb3VwX2lkeCA9IG1zbV9kYWlfcTZfZ2V0X2dyb3VwX2lkeCh0ZG1fZ3JvdXBfY2ZnLmdyb3VwX2lkKTsKKwlpZiAoZ3JvdXBfaWR4IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZ3JvdXAgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIHRkbV9ncm91cF9jZmcuZ3JvdXBfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gcnRuOworCX0KKwlhdG9taWNfc2V0KCZ0ZG1fZ3JvdXBfcmVmW2dyb3VwX2lkeF0sIDApOworCisJLyogcHJvYmUgY2hpbGQgbm9kZSBpbmZvICovCisJcmMgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwgTlVMTCwgTlVMTCwgJnBkZXYtPmRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIGNoaWxkIG5vZGVzLCByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gcnRuOworCX0gZWxzZQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogYWRkZWQgY2hpbGQgbm9kZVxuIiwgX19mdW5jX18pOworCitydG46CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfdGRtX3E2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3RkbV9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXRkbSIsIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9kYWlfdGRtX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV90ZG1fcTYgPSB7CisJLnByb2JlICA9IG1zbV9kYWlfdGRtX3E2X3Byb2JlLAorCS5yZW1vdmUgPSBtc21fZGFpX3RkbV9xNl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWRhaS10ZG0iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV90ZG1fZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5kYXRhX2Zvcm1hdCA9IHZhbHVlOworCXByX2RlYnVnKCIlczogZGF0YV9mb3JtYXQgPSAlZFxuIiwKKwkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uZGF0YV9mb3JtYXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5kYXRhX2Zvcm1hdDsKKwlwcl9kZWJ1ZygiJXM6IGRhdGFfZm9ybWF0ID0gJWRcbiIsCisJCV9fZnVuY19fLCBkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmRhdGFfZm9ybWF0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXIuaGVhZGVyX3R5cGUgPSB2YWx1ZTsKKwlwcl9kZWJ1ZygiJXM6IGhlYWRlcl90eXBlID0gJWRcbiIsCisJCV9fZnVuY19fLAorCQlkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXIuaGVhZGVyX3R5cGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcl90eXBlOworCXByX2RlYnVnKCIlczogaGVhZGVyX3R5cGUgPSAlZFxuIiwKKwkJX19mdW5jX18sCisJCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJfdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUZFX0NVU1RPTV9URE1fSEVBREVSX01BWF9DTlQ7IGkrKykgeworCQlkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXIuaGVhZGVyW2ldID0KKwkJCSh1MTYpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCXByX2RlYnVnKCIlczogaGVhZGVyICMlZCA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaSwKKwkJCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRkVfQ1VTVE9NX1RETV9IRUFERVJfTUFYX0NOVDsgaSsrKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0KKwkJCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJbaV07CisJCXByX2RlYnVnKCIlczogaGVhZGVyICMlZCA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaSwKKwkJCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRkbV9jb25maWdfY29udHJvbHNfZGF0YV9mb3JtYXRbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8yIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF81IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8xIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzMgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF80IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfNSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzYgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF83IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8yIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF81IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8xIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF80IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF83IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8yIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzMgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF81IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzYgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfNSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8xIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF80IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF83IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZG1fY29uZmlnX2NvbnRyb2xzX2hlYWRlcl90eXBlW10gPSB7CisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfNSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzEgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzQgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzcgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzIgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8zIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfNCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzUgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF82IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfNyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfNSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfNCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfNyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzEgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8zIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzQgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF82IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzcgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzIgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzUgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfNCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCisJU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAorCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfNyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGRtX2NvbmZpZ19jb250cm9sc19oZWFkZXJbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF8wIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fUlhfMSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1JYXzIgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF8zIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fUlhfNCBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1JYXzUgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF82IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fUlhfNyBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzAgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9UWF8xIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fVFhfMiBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzMgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9UWF80IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fVFhfNSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzYgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9UWF83IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfMCBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1JYXzEgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9SWF8yIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfMyBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1JYXzQgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9SWF81IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfNiBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1JYXzcgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF8wIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fVFhfMSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1RYXzIgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF8zIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fVFhfNCBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1RYXzUgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF82IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fVFhfNyBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9SWF8wIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzEgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fUlhfMiBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9SWF8zIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzQgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fUlhfNSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9SWF82IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzcgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fVFhfMCBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF8xIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1RYXzIgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fVFhfMyBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF80IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1RYXzUgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fVFhfNiBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF83IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1JYXzAgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfMSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9SWF8yIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1JYXzMgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfNCBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9SWF81IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1JYXzYgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfNyBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9UWF8wIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzEgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fVFhfMiBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9UWF8zIEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzQgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fVFhfNSBIZWFkZXIiLAorCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9UWF82IEhlYWRlciIsCisJCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAorCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzcgSGVhZGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKKwkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCisJCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fc2V0X2NsaygKKwkJc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSwKKwkJdTE2IHBvcnRfaWQsIGJvb2wgZW5hYmxlKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGRhaV9kYXRhLT5ncm91cF9jZmcudGRtX2NmZy5ncm91cF9pZCkgeworCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9SWDoKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fVFg6CisJCWlmIChkYWlfZGF0YS0+Y2xrX3NldC5jbGtfZnJlcV9pbl9oeikgeworCQkJZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQlRNkFGRV9MUEFTU19DTEtfSURfUFJJX1RETV9JQklUOworCQl9IGVsc2UKKwkJCWRhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9CisJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9URE1fRUJJVDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fVFg6CisJCWlmIChkYWlfZGF0YS0+Y2xrX3NldC5jbGtfZnJlcV9pbl9oeikgeworCQkJZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX1RETV9JQklUOworCQl9IGVsc2UKKwkJCWRhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9CisJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19URE1fRUJJVDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1RFUlRJQVJZX1RETV9SWDoKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1RYOgorCQlpZiAoZGFpX2RhdGEtPmNsa19zZXQuY2xrX2ZyZXFfaW5faHopIHsKKwkJCWRhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9CisJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9URE1fSUJJVDsKKwkJfSBlbHNlCisJCQlkYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCVE2QUZFX0xQQVNTX0NMS19JRF9URVJfVERNX0VCSVQ7CisJCWJyZWFrOworCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9SWDoKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fVFg6CisJCWlmIChkYWlfZGF0YS0+Y2xrX3NldC5jbGtfZnJlcV9pbl9oeikgeworCQkJZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KKwkJCQlRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9URE1fSUJJVDsKKwkJfSBlbHNlCisJCQlkYWlfZGF0YS0+Y2xrX3NldC5jbGtfaWQgPQorCQkJCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1RETV9FQklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBwb3J0IGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhaV9kYXRhLT5jbGtfc2V0LmVuYWJsZSA9IGVuYWJsZTsKKworCXJjID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAorCQkmZGFpX2RhdGEtPmNsa19zZXQpOworCWlmIChyYyA8IDApCisJCXByX2VycigiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQsIGVycjolZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICp0ZG1fZGFpX2RhdGEgPQorCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpkYXRhX2Zvcm1hdF9rY29udHJvbCA9IE5VTEw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqaGVhZGVyX3R5cGVfa2NvbnRyb2wgPSBOVUxMOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmhlYWRlcl9rY29udHJvbCA9IE5VTEw7CisJaW50IHBvcnRfaWR4ID0gMDsKKwljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqZGF0YV9mb3JtYXRfY3RybCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmhlYWRlcl90eXBlX2N0cmwgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpoZWFkZXJfY3RybCA9IE5VTEw7CisKKwltc21fZGFpX3E2X3NldF9kYWlfaWQoZGFpKTsKKworCXBvcnRfaWR4ID0gbXNtX2RhaV9xNl9nZXRfcG9ydF9pZHgoZGFpLT5pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMgcG9ydCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBydG47CisJfQorCisJZGF0YV9mb3JtYXRfY3RybCA9CisJCSZ0ZG1fY29uZmlnX2NvbnRyb2xzX2RhdGFfZm9ybWF0W3BvcnRfaWR4XTsKKwloZWFkZXJfdHlwZV9jdHJsID0KKwkJJnRkbV9jb25maWdfY29udHJvbHNfaGVhZGVyX3R5cGVbcG9ydF9pZHhdOworCWhlYWRlcl9jdHJsID0KKwkJJnRkbV9jb25maWdfY29udHJvbHNfaGVhZGVyW3BvcnRfaWR4XTsKKworCWlmIChkYXRhX2Zvcm1hdF9jdHJsKSB7CisJCWRhdGFfZm9ybWF0X2tjb250cm9sID0gc25kX2N0bF9uZXcxKGRhdGFfZm9ybWF0X2N0cmwsCisJCQkJCXRkbV9kYWlfZGF0YSk7CisJCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAorCQkJCSBkYXRhX2Zvcm1hdF9rY29udHJvbCk7CisKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBkYXRhIGZvcm1hdCBjdHJsIERBSSA9ICVzXG4iLAorCQkJCV9fZnVuY19fLCBkYWktPm5hbWUpOworCQkJZ290byBydG47CisJCX0KKwl9CisKKwlpZiAoaGVhZGVyX3R5cGVfY3RybCkgeworCQloZWFkZXJfdHlwZV9rY29udHJvbCA9IHNuZF9jdGxfbmV3MShoZWFkZXJfdHlwZV9jdHJsLAorCQkJCQl0ZG1fZGFpX2RhdGEpOworCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKKwkJCQkgaGVhZGVyX3R5cGVfa2NvbnRyb2wpOworCisJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQlpZiAoZGF0YV9mb3JtYXRfa2NvbnRyb2wpCisJCQkJc25kX2N0bF9yZW1vdmUoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAorCQkJCQlkYXRhX2Zvcm1hdF9rY29udHJvbCk7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGVyciBhZGQgaGVhZGVyIHR5cGUgY3RybCBEQUkgPSAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKKwkJCWdvdG8gcnRuOworCQl9CisJfQorCisJaWYgKGhlYWRlcl9jdHJsKSB7CisJCWhlYWRlcl9rY29udHJvbCA9IHNuZF9jdGxfbmV3MShoZWFkZXJfY3RybCwKKwkJCQkJdGRtX2RhaV9kYXRhKTsKKwkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJIGhlYWRlcl9rY29udHJvbCk7CisKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJCWlmIChoZWFkZXJfdHlwZV9rY29udHJvbCkKKwkJCQlzbmRfY3RsX3JlbW92ZShkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJCWhlYWRlcl90eXBlX2tjb250cm9sKTsKKwkJCWlmIChkYXRhX2Zvcm1hdF9rY29udHJvbCkKKwkJCQlzbmRfY3RsX3JlbW92ZShkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCisJCQkJCWRhdGFfZm9ybWF0X2tjb250cm9sKTsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBoZWFkZXIgY3RybCBEQUkgPSAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKKwkJCWdvdG8gcnRuOworCQl9CisJfQorCisJcmMgPSBtc21fZGFpX3E2X2RhaV9hZGRfcm91dGUoZGFpKTsKKworcnRuOgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKnRkbV9kYWlfZGF0YSA9CisJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJdTE2IGdyb3VwX2lkID0gdGRtX2RhaV9kYXRhLT5ncm91cF9jZmcudGRtX2NmZy5ncm91cF9pZDsKKwlpbnQgZ3JvdXBfaWR4ID0gMDsKKwlhdG9taWNfdCAqZ3JvdXBfcmVmID0gTlVMTDsKKworCWdyb3VwX2lkeCA9IG1zbV9kYWlfcTZfZ2V0X2dyb3VwX2lkeChkYWktPmlkKTsKKwlpZiAoZ3JvdXBfaWR4IDwgMCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMgcG9ydCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdyb3VwX3JlZiA9ICZ0ZG1fZ3JvdXBfcmVmW2dyb3VwX2lkeF07CisKKwkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgdGRtX2RhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKKwkJcmMgPSBhZmVfY2xvc2UoZGFpLT5pZCk7IC8qIGNhbiBibG9jayAqLworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGNsb3NlIEFGRSBwb3J0IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGRhaS0+aWQpOworCQl9CisJCWF0b21pY19kZWMoZ3JvdXBfcmVmKTsKKwkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCQkgIHRkbV9kYWlfZGF0YS0+c3RhdHVzX21hc2spOworCisJCWlmIChhdG9taWNfcmVhZChncm91cF9yZWYpID09IDApIHsKKwkJCXJjID0gYWZlX3BvcnRfZ3JvdXBfZW5hYmxlKGdyb3VwX2lkLAorCQkJCU5VTEwsIGZhbHNlKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gZGlzYWJsZSBBRkUgZ3JvdXAgMHgleFxuIiwKKwkJCQkJZ3JvdXBfaWQpOworCQkJfQorCQkJcmMgPSBtc21fZGFpX3E2X3RkbV9zZXRfY2xrKHRkbV9kYWlfZGF0YSwKKwkJCQlkYWktPmlkLCBmYWxzZSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBkaXNhYmxlIEFGRSBjbGsgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIGRhaS0+aWQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJCXVuc2lnbmVkIGludCB0eF9tYXNrLAorCQkJCXVuc2lnbmVkIGludCByeF9tYXNrLAorCQkJCWludCBzbG90cywgaW50IHNsb3Rfd2lkdGgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2dyb3VwX2RldmljZV90ZG1fY2ZnICp0ZG1fZ3JvdXAgPQorCQkmZGFpX2RhdGEtPmdyb3VwX2NmZy50ZG1fY2ZnOworCXVuc2lnbmVkIGludCBjYXBfbWFzazsKKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOworCisJLyogSFcgb25seSBzdXBwb3J0cyAxNiBhbmQgMzIgYml0IHNsb3Qgd2lkdGggY29uZmlndXJhdGlvbiAqLworCWlmICgoc2xvdF93aWR0aCAhPSAxNikgJiYgKHNsb3Rfd2lkdGggIT0gMzIpKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBzbG90X3dpZHRoICVkXG4iLAorCQkJX19mdW5jX18sIHNsb3Rfd2lkdGgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBIVyBvbmx5IHN1cHBvcnRzIDE2IGFuZCA4IHNsb3RzIGNvbmZpZ3VyYXRpb24gKi8KKwlzd2l0Y2ggKHNsb3RzKSB7CisJY2FzZSA4OgorCQljYXBfbWFzayA9IDB4RkY7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWNhcF9tYXNrID0gMHhGRkZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgc2xvdHMgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2xvdHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKKwkJdGRtX2dyb3VwLT5uc2xvdHNfcGVyX2ZyYW1lID0gc2xvdHM7CisJCXRkbV9ncm91cC0+c2xvdF93aWR0aCA9IHNsb3Rfd2lkdGg7CisJCXRkbV9ncm91cC0+c2xvdF9tYXNrID0gcnhfbWFzayAmIGNhcF9tYXNrOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKKwkJdGRtX2dyb3VwLT5uc2xvdHNfcGVyX2ZyYW1lID0gc2xvdHM7CisJCXRkbV9ncm91cC0+c2xvdF93aWR0aCA9IHNsb3Rfd2lkdGg7CisJCXRkbV9ncm91cC0+c2xvdF9tYXNrID0gdHhfbWFzayAmIGNhcF9tYXNrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgZGFpIGlkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCQkJCXVuc2lnbmVkIGludCByeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPQorCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBhZmVfcGFyYW1faWRfc2xvdF9tYXBwaW5nX2NmZyAqc2xvdF9tYXBwaW5nID0KKwkJJmRhaV9kYXRhLT5wb3J0X2NmZy5zbG90X21hcHBpbmc7CisJaW50IGkgPSAwOworCisJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBkYWkgaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKKwkJaWYgKCFyeF9zbG90KSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IHJ4IHNsb3Qgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocnhfbnVtID4gQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgcnggbnVtICVkXG4iLCBfX2Z1bmNfXywKKwkJCQlyeF9udW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgcnhfbnVtOyBpKyspCisJCQlzbG90X21hcHBpbmctPm9mZnNldFtpXSA9IHJ4X3Nsb3RbaV07CisJCWZvciAoaSA9IHJ4X251bTsgaSA8IEFGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVDsgaSsrKQorCQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbaV0gPQorCQkJCUFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQ7CisKKwkJc2xvdF9tYXBwaW5nLT5udW1fY2hhbm5lbCA9IHJ4X251bTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6CisJCWlmICghdHhfc2xvdCkgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiB0eCBzbG90IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHR4X251bSA+IEFGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVCkgeworCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIHR4IG51bSAlZFxuIiwgX19mdW5jX18sCisJCQkJdHhfbnVtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHR4X251bTsgaSsrKQorCQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbaV0gPSB0eF9zbG90W2ldOworCQlmb3IgKGkgPSB0eF9udW07IGkgPCBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQ7IGkrKykKKwkJCXNsb3RfbWFwcGluZy0+b2Zmc2V0W2ldID0KKwkJCQlBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEOworCisJCXNsb3RfbWFwcGluZy0+bnVtX2NoYW5uZWwgPSB0eF9udW07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBkYWkgaWQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBkYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCXN0cnVjdCBhZmVfcGFyYW1faWRfZ3JvdXBfZGV2aWNlX3RkbV9jZmcgKnRkbV9ncm91cCA9CisJCSZkYWlfZGF0YS0+Z3JvdXBfY2ZnLnRkbV9jZmc7CisJc3RydWN0IGFmZV9wYXJhbV9pZF90ZG1fY2ZnICp0ZG0gPQorCQkmZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbTsKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3Nsb3RfbWFwcGluZ19jZmcgKnNsb3RfbWFwcGluZyA9CisJCSZkYWlfZGF0YS0+cG9ydF9jZmcuc2xvdF9tYXBwaW5nOworCXN0cnVjdCBhZmVfcGFyYW1faWRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnICpjdXN0b21fdGRtX2hlYWRlciA9CisJCSZkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXI7CisKKwlwcl9kZWJ1ZygiJXM6IGRldl9uYW1lOiAlc1xuIiwKKwkJX19mdW5jX18sIGRldl9uYW1lKGRhaS0+ZGV2KSk7CisKKwlpZiAoKHBhcmFtc19jaGFubmVscyhwYXJhbXMpID09IDApIHx8CisJCShwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSA+IDgpKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBwYXJhbSBjaGFubmVscyAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWRhaV9kYXRhLT5iaXR3aWR0aCA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQlkYWlfZGF0YS0+Yml0d2lkdGggPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJZGFpX2RhdGEtPmJpdHdpZHRoID0gMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBwYXJhbSBmb3JtYXQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJLyoKKwkgKiB1cGRhdGUgdGRtIGdyb3VwIGNvbmZpZyBwYXJhbQorCSAqIE5PVEU6IGdyb3VwIGNvbmZpZyBpcyBzZXQgdG8gdGhlIHNhbWUgYXMgc2xvdCBjb25maWcuCisJICovCisJdGRtX2dyb3VwLT5iaXRfd2lkdGggPSB0ZG1fZ3JvdXAtPnNsb3Rfd2lkdGg7CisJdGRtX2dyb3VwLT5udW1fY2hhbm5lbHMgPSB0ZG1fZ3JvdXAtPm5zbG90c19wZXJfZnJhbWU7CisJdGRtX2dyb3VwLT5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOworCisJcHJfZGVidWcoIiVzOiBURE0gR1JPVVA6XG4iCisJCSJudW1fY2hhbm5lbHM9JWQgc2FtcGxlX3JhdGU9JWQgYml0X3dpZHRoPSVkXG4iCisJCSJuc2xvdHNfcGVyX2ZyYW1lPSVkIHNsb3Rfd2lkdGg9JWQgc2xvdF9tYXNrPTB4JXhcbiIsCisJCV9fZnVuY19fLAorCQl0ZG1fZ3JvdXAtPm51bV9jaGFubmVscywKKwkJdGRtX2dyb3VwLT5zYW1wbGVfcmF0ZSwKKwkJdGRtX2dyb3VwLT5iaXRfd2lkdGgsCisJCXRkbV9ncm91cC0+bnNsb3RzX3Blcl9mcmFtZSwKKwkJdGRtX2dyb3VwLT5zbG90X3dpZHRoLAorCQl0ZG1fZ3JvdXAtPnNsb3RfbWFzayk7CisJcHJfZGVidWcoIiVzOiBURE0gR1JPVVA6XG4iCisJCSJwb3J0X2lkWzBdPTB4JXggcG9ydF9pZFsxXT0weCV4IHBvcnRfaWRbMl09MHgleCBwb3J0X2lkWzNdPTB4JXhcbiIKKwkJInBvcnRfaWRbNF09MHgleCBwb3J0X2lkWzVdPTB4JXggcG9ydF9pZFs2XT0weCV4IHBvcnRfaWRbN109MHgleFxuIiwKKwkJX19mdW5jX18sCisJCXRkbV9ncm91cC0+cG9ydF9pZFswXSwKKwkJdGRtX2dyb3VwLT5wb3J0X2lkWzFdLAorCQl0ZG1fZ3JvdXAtPnBvcnRfaWRbMl0sCisJCXRkbV9ncm91cC0+cG9ydF9pZFszXSwKKwkJdGRtX2dyb3VwLT5wb3J0X2lkWzRdLAorCQl0ZG1fZ3JvdXAtPnBvcnRfaWRbNV0sCisJCXRkbV9ncm91cC0+cG9ydF9pZFs2XSwKKwkJdGRtX2dyb3VwLT5wb3J0X2lkWzddKTsKKworCS8qCisJICogdXBkYXRlIHRkbSBjb25maWcgcGFyYW0KKwkgKiBOT1RFOiBjaGFubmVscy9yYXRlL2JpdHdpZHRoIGFyZSBwZXIgc3RyZWFtIHByb3BlcnR5CisJICovCisJdGRtLT5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7CisJdGRtLT5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOworCXRkbS0+Yml0X3dpZHRoID0gZGFpX2RhdGEtPmJpdHdpZHRoOworCS8qCisJICogcG9ydCBzbG90IGNvbmZpZyBpcyB0aGUgc2FtZSBhcyBncm91cCBzbG90IGNvbmZpZworCSAqIHBvcnQgc2xvdCBtYXNrIHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIG9mZnNldAorCSAqLworCXRkbS0+bnNsb3RzX3Blcl9mcmFtZSA9IHRkbV9ncm91cC0+bnNsb3RzX3Blcl9mcmFtZTsKKwl0ZG0tPnNsb3Rfd2lkdGggPSB0ZG1fZ3JvdXAtPnNsb3Rfd2lkdGg7CisJdGRtLT5zbG90X21hc2sgPSB0ZG1fZ3JvdXAtPnNsb3RfbWFzazsKKworCXByX2RlYnVnKCIlczogVERNOlxuIgorCQkibnVtX2NoYW5uZWxzPSVkIHNhbXBsZV9yYXRlPSVkIGJpdF93aWR0aD0lZFxuIgorCQkibnNsb3RzX3Blcl9mcmFtZT0lZCBzbG90X3dpZHRoPSVkIHNsb3RfbWFzaz0weCV4XG4iCisJCSJkYXRhX2Zvcm1hdD0weCV4IHN5bmNfbW9kZT0weCV4IHN5bmNfc3JjPTB4JXhcbiIKKwkJImRhdGFfb3V0PTB4JXggaW52ZXJ0X3N5bmM9MHgleCBkYXRhX2RlbGF5PTB4JXhcbiIsCisJCV9fZnVuY19fLAorCQl0ZG0tPm51bV9jaGFubmVscywKKwkJdGRtLT5zYW1wbGVfcmF0ZSwKKwkJdGRtLT5iaXRfd2lkdGgsCisJCXRkbS0+bnNsb3RzX3Blcl9mcmFtZSwKKwkJdGRtLT5zbG90X3dpZHRoLAorCQl0ZG0tPnNsb3RfbWFzaywKKwkJdGRtLT5kYXRhX2Zvcm1hdCwKKwkJdGRtLT5zeW5jX21vZGUsCisJCXRkbS0+c3luY19zcmMsCisJCXRkbS0+Y3RybF9kYXRhX291dF9lbmFibGUsCisJCXRkbS0+Y3RybF9pbnZlcnRfc3luY19wdWxzZSwKKwkJdGRtLT5jdHJsX3N5bmNfZGF0YV9kZWxheSk7CisKKwkvKgorCSAqIHVwZGF0ZSBzbG90IG1hcHBpbmcgY29uZmlnIHBhcmFtCisJICogTk9URTogY2hhbm5lbHMvcmF0ZS9iaXR3aWR0aCBhcmUgcGVyIHN0cmVhbSBwcm9wZXJ0eQorCSAqLworCXNsb3RfbWFwcGluZy0+Yml0d2lkdGggPSBkYWlfZGF0YS0+Yml0d2lkdGg7CisKKwlwcl9kZWJ1ZygiJXM6IFNMT1QgTUFQUElORzpcbiIKKwkJIm51bV9jaGFubmVsPSVkIGJpdHdpZHRoPSVkIGRhdGFfYWxpZ249MHgleFxuIiwKKwkJX19mdW5jX18sCisJCXNsb3RfbWFwcGluZy0+bnVtX2NoYW5uZWwsCisJCXNsb3RfbWFwcGluZy0+Yml0d2lkdGgsCisJCXNsb3RfbWFwcGluZy0+ZGF0YV9hbGlnbl90eXBlKTsKKwlwcl9kZWJ1ZygiJXM6IFNMT1QgTUFQUElORzpcbiIKKwkJIm9mZnNldFswXT0weCV4IG9mZnNldFsxXT0weCV4IG9mZnNldFsyXT0weCV4IG9mZnNldFszXT0weCV4XG4iCisJCSJvZmZzZXRbNF09MHgleCBvZmZzZXRbNV09MHgleCBvZmZzZXRbNl09MHgleCBvZmZzZXRbN109MHgleFxuIiwKKwkJX19mdW5jX18sCisJCXNsb3RfbWFwcGluZy0+b2Zmc2V0WzBdLAorCQlzbG90X21hcHBpbmctPm9mZnNldFsxXSwKKwkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbMl0sCisJCXNsb3RfbWFwcGluZy0+b2Zmc2V0WzNdLAorCQlzbG90X21hcHBpbmctPm9mZnNldFs0XSwKKwkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbNV0sCisJCXNsb3RfbWFwcGluZy0+b2Zmc2V0WzZdLAorCQlzbG90X21hcHBpbmctPm9mZnNldFs3XSk7CisKKwkvKgorCSAqIHVwZGF0ZSBjdXN0b20gaGVhZGVyIGNvbmZpZyBwYXJhbQorCSAqIE5PVEU6IGNoYW5uZWxzL3JhdGUvYml0d2lkdGggYXJlIHBlciBwbGF5YmFjayBzdHJlYW0gcHJvcGVydHkuCisJICogY3VzdG9tIHRkbSBoZWFkZXIgb25seSBhcHBsaWNhYmxlIHRvIHBsYXliYWNrIHN0cmVhbS4KKwkgKi8KKwlpZiAoY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl90eXBlICE9CisJCUFGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0lOVkFMSUQpIHsKKwkJcHJfZGVidWcoIiVzOiBDVVNUT00gVERNIEhFQURFUjpcbiIKKwkJCSJzdGFydF9vZmZzZXQ9MHgleCBoZWFkZXJfd2lkdGg9JWRcbiIKKwkJCSJudW1fZnJhbWVfcmVwZWF0PSVkIGhlYWRlcl90eXBlPTB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWN1c3RvbV90ZG1faGVhZGVyLT5zdGFydF9vZmZzZXQsCisJCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyX3dpZHRoLAorCQkJY3VzdG9tX3RkbV9oZWFkZXItPm51bV9mcmFtZV9yZXBlYXQsCisJCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyX3R5cGUpOworCQlwcl9kZWJ1ZygiJXM6IENVU1RPTSBURE0gSEVBREVSOlxuIgorCQkJImhlYWRlclswXT0weCV4IGhlYWRlclsxXT0weCV4IGhlYWRlclsyXT0weCV4IGhlYWRlclszXT0weCV4XG4iCisJCQkiaGVhZGVyWzRdPTB4JXggaGVhZGVyWzVdPTB4JXggaGVhZGVyWzZdPTB4JXggaGVhZGVyWzddPTB4JXhcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJbMF0sCisJCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzFdLAorCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlclsyXSwKKwkJCWN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJbM10sCisJCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzRdLAorCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcls1XSwKKwkJCWN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJbNl0sCisJCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzddKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPQorCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXUxNiBncm91cF9pZCA9IGRhaV9kYXRhLT5ncm91cF9jZmcudGRtX2NmZy5ncm91cF9pZDsKKwlpbnQgZ3JvdXBfaWR4ID0gMDsKKwlhdG9taWNfdCAqZ3JvdXBfcmVmID0gTlVMTDsKKworCWdyb3VwX2lkeCA9IG1zbV9kYWlfcTZfZ2V0X2dyb3VwX2lkeChkYWktPmlkKTsKKwlpZiAoZ3JvdXBfaWR4IDwgMCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMgcG9ydCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnRkbV9tdXRleCk7CisKKwlncm91cF9yZWYgPSAmdGRtX2dyb3VwX3JlZltncm91cF9pZHhdOworCisJaWYgKCF0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spKSB7CisJCS8qIFBPUlQgU1RBUlQgc2hvdWxkIGJlIHNldCBpZiBwcmVwYXJlIGNhbGxlZAorCQkgKiBpbiBhY3RpdmUgc3RhdGUuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQoZ3JvdXBfcmVmKSA9PSAwKSB7CisJCQkvKiBUWCBhbmQgUlggc2hhcmUgdGhlIHNhbWUgY2xrLgorCQkJICogQUZFIGNsayBpcyBlbmFibGVkIHBlciBncm91cCB0byBzaW1wbGlmeSB0aGUgbG9naWMuCisJCQkgKiBEU1Agd2lsbCBtb25pdG9yIHRoZSBjbGsgY291bnQuCisJCQkgKi8KKwkJCXJjID0gbXNtX2RhaV9xNl90ZG1fc2V0X2NsayhkYWlfZGF0YSwKKwkJCQlkYWktPmlkLCB0cnVlKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGVuYWJsZSBBRkUgY2xrIDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCBkYWktPmlkKTsKKwkJCQlnb3RvIHJ0bjsKKwkJCX0KKwkJCXJjID0gYWZlX3BvcnRfZ3JvdXBfZW5hYmxlKGdyb3VwX2lkLAorCQkJCSZkYWlfZGF0YS0+Z3JvdXBfY2ZnLCB0cnVlKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGVuYWJsZSBBRkUgZ3JvdXAgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIGdyb3VwX2lkKTsKKwkJCQlnb3RvIHJ0bjsKKwkJCX0KKwkJfQorCisJCXJjID0gYWZlX3RkbV9wb3J0X3N0YXJ0KGRhaS0+aWQsICZkYWlfZGF0YS0+cG9ydF9jZmcsCisJCQlkYWlfZGF0YS0+cmF0ZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoZ3JvdXBfcmVmKSA9PSAwKSB7CisJCQkJYWZlX3BvcnRfZ3JvdXBfZW5hYmxlKGdyb3VwX2lkLAorCQkJCQlOVUxMLCBmYWxzZSk7CisJCQkJbXNtX2RhaV9xNl90ZG1fc2V0X2NsayhkYWlfZGF0YSwKKwkJCQkJZGFpLT5pZCwgZmFsc2UpOworCQkJfQorCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIG9wZW4gQUZFIHBvcnQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCX0gZWxzZSB7CisJCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCisJCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKwkJCWF0b21pY19pbmMoZ3JvdXBfcmVmKTsKKwkJfQorCisJCS8qIFRPRE86IG5lZWQgdG8gbW9uaXRvciBQQ00vTUkyUy9URE0gSFcgc3RhdHVzICovCisJCS8qIE5PVEU6IEFGRSBzaG91bGQgZXJyb3Igb3V0IGlmIEhXIHJlc291cmNlIGNvbnRlbnRpb24gKi8KKworCX0KKworcnRuOgorCW11dGV4X3VubG9jaygmdGRtX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9kYWlfcTZfdGRtX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwl1MTYgZ3JvdXBfaWQgPSBkYWlfZGF0YS0+Z3JvdXBfY2ZnLnRkbV9jZmcuZ3JvdXBfaWQ7CisJaW50IGdyb3VwX2lkeCA9IDA7CisJYXRvbWljX3QgKmdyb3VwX3JlZiA9IE5VTEw7CisKKwlncm91cF9pZHggPSBtc21fZGFpX3E2X2dldF9ncm91cF9pZHgoZGFpLT5pZCk7CisJaWYgKGdyb3VwX2lkeCA8IDApIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzIHBvcnQgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIGRhaS0+aWQpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmdGRtX211dGV4KTsKKworCWdyb3VwX3JlZiA9ICZ0ZG1fZ3JvdXBfcmVmW2dyb3VwX2lkeF07CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgeworCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBjbG9zZSBBRkUgcG9ydCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBkYWktPmlkKTsKKwkJfQorCQlhdG9taWNfZGVjKGdyb3VwX3JlZik7CisJCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAorCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKKworCQlpZiAoYXRvbWljX3JlYWQoZ3JvdXBfcmVmKSA9PSAwKSB7CisJCQlyYyA9IGFmZV9wb3J0X2dyb3VwX2VuYWJsZShncm91cF9pZCwKKwkJCQlOVUxMLCBmYWxzZSk7CisJCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBkaXNhYmxlIEFGRSBncm91cCAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgZ3JvdXBfaWQpOworCQkJfQorCQkJcmMgPSBtc21fZGFpX3E2X3RkbV9zZXRfY2xrKGRhaV9kYXRhLAorCQkJCWRhaS0+aWQsIGZhbHNlKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGRpc2FibGUgQUZFIGNsayAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCQl9CisJCX0KKworCQkvKiBUT0RPOiBuZWVkIHRvIG1vbml0b3IgUENNL01JMlMvVERNIEhXIHN0YXR1cyAqLworCQkvKiBOT1RFOiBBRkUgc2hvdWxkIGVycm9yIG91dCBpZiBIVyByZXNvdXJjZSBjb250ZW50aW9uICovCisKKwl9CisKKwltdXRleF91bmxvY2soJnRkbV9tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfcTZfdGRtX29wcyA9IHsKKwkucHJlcGFyZSAgICAgICAgICA9IG1zbV9kYWlfcTZfdGRtX3ByZXBhcmUsCisJLmh3X3BhcmFtcyAgICAgICAgPSBtc21fZGFpX3E2X3RkbV9od19wYXJhbXMsCisJLnNldF90ZG1fc2xvdCAgICAgPSBtc21fZGFpX3E2X3RkbV9zZXRfdGRtX3Nsb3QsCisJLnNldF9jaGFubmVsX21hcCAgPSBtc21fZGFpX3E2X3RkbV9zZXRfY2hhbm5lbF9tYXAsCisJLnNodXRkb3duICAgICAgICAgPSBtc21fZGFpX3E2X3RkbV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfdGRtX2RhaVtdID0geworCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF8wIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0xIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzEiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF8yIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzIsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfMyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE00IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzQiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF81IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzUsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTYgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfNiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE03IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzciLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfMCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWCwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0xIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfMSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTIgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF8yIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzIsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzMiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMywKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE00IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfNCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTUgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF81IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzUsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNiBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzYiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNiwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE03IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfNyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTEgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF8yIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMiwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0zIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzMiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTQgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF81IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNSwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE02IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzYiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTcgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfMCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzEiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMiBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzIiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzMiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNCBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzQiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzUiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNiBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzYiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzciLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlgsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0xIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF8xIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMiwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTMgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzMiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzMsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE00IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF80IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNSBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfNSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNSwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTYgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzYiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzYsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE03IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF83IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzAiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0xIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzEiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzEsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTIgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfMiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMiwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMyBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF8zIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE00IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzQiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTUgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfNSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNSwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNiBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF82IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE03IENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzciLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzcsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzAiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0xIFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF8xIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzEsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTIgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzIiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMiwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMyBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE00IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF80IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTUgUGxheWJhY2siLAorCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzUiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSA4LAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKKwkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNSwKKwkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAorCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKKwl9LAorCXsKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNiBQbGF5YmFjayIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE03IFBsYXliYWNrIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF83IiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzcsCisJCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKKwkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCisJfSwKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF8wIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCisJCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTEgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTIgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTMgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zLAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTQgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNCIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTUgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTYgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNiIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTcgQ2FwdHVyZSIsCisJCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNyIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDgsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAorCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83LAorCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCisJCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBtc21fcTZfdGRtX2RhaV9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gIm1zbS1kYWktcTYtdGRtIiwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9IE5VTEw7CisJc3RydWN0IGFmZV9wYXJhbV9pZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcgKmN1c3RvbV90ZG1faGVhZGVyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCXUzMiB0ZG1fZGV2X2lkID0gMDsKKwlpbnQgcG9ydF9pZHggPSAwOworCisJLyogcmV0cmlldmUgZGV2aWNlL2FmZSBpZCAqLworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1zbS1jcHVkYWktdGRtLWRldi1pZCIsCisJCSZ0ZG1fZGV2X2lkKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IERldmljZSBJRCBtaXNzaW5nIGluIERUIGZpbGVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gcnRuOworCX0KKwlpZiAoKHRkbV9kZXZfaWQgPCBBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TVEFSVCkgfHwKKwkJKHRkbV9kZXZfaWQgPiBBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9FTkQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBJbnZhbGlkIFRETSBEZXZpY2UgSUQgMHgleCBpbiBEVCBmaWxlXG4iLAorCQkJX19mdW5jX18sIHRkbV9kZXZfaWQpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBydG47CisJfQorCXBkZXYtPmlkID0gdGRtX2Rldl9pZDsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZGV2X25hbWU6ICVzIGRldl9pZDogMHgleFxuIiwKKwkJX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpLCB0ZG1fZGV2X2lkKTsKKworCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWRhaV9kYXRhKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIiVzIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRkbSBkYWlfZGF0YVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBydG47CisJfQorCW1lbXNldChkYWlfZGF0YSwgMCwgc2l6ZW9mKCpkYWlfZGF0YSkpOworCisJLyogVERNIENGRyAqLworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtbW9kZSIsCisJCSh1MzIgKikmZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5zeW5jX21vZGUpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogU3luYyBNb2RlIGZyb20gRFQgZmlsZSAlc1xuIiwKKwkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLW1vZGUiKTsKKwkJZ290byBmcmVlX2RhaV9kYXRhOworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogU3luYyBNb2RlIGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5zeW5jX21vZGUpOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJInFjb20sbXNtLWNwdWRhaS10ZG0tc3luYy1zcmMiLAorCQkodTMyICopJmRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uc3luY19zcmMpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogU3luYyBTcmMgZnJvbSBEVCBmaWxlICVzXG4iLAorCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtc3JjIik7CisJCWdvdG8gZnJlZV9kYWlfZGF0YTsKKwl9CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IFN5bmMgU3JjIGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5zeW5jX3NyYyk7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLW91dCIsCisJCSh1MzIgKikmZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5jdHJsX2RhdGFfb3V0X2VuYWJsZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBEYXRhIE91dCBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1vdXQiKTsKKwkJZ290byBmcmVlX2RhaV9kYXRhOworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogRGF0YSBPdXQgZnJvbSBEVCBmaWxlIDB4JXhcbiIsCisJCV9fZnVuY19fLCBkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmN0cmxfZGF0YV9vdXRfZW5hYmxlKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jIiwKKwkJKHUzMiAqKSZkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmN0cmxfaW52ZXJ0X3N5bmNfcHVsc2UpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogSW52ZXJ0IFN5bmMgZnJvbSBEVCBmaWxlICVzXG4iLAorCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jIik7CisJCWdvdG8gZnJlZV9kYWlfZGF0YTsKKwl9CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IEludmVydCBTeW5jIGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5jdHJsX2ludmVydF9zeW5jX3B1bHNlKTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtZGVsYXkiLAorCQkodTMyICopJmRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uY3RybF9zeW5jX2RhdGFfZGVsYXkpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRGF0YSBEZWxheSBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQlfX2Z1bmNfXywgInFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1kZWxheSIpOworCQlnb3RvIGZyZWVfZGFpX2RhdGE7CisJfQorCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBEYXRhIERlbGF5IGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5jdHJsX3N5bmNfZGF0YV9kZWxheSk7CisKKwkvKiBURE0gQ0ZHIC0tIHNldCBkZWZhdWx0ICovCisJZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5kYXRhX2Zvcm1hdCA9IEFGRV9MSU5FQVJfUENNX0RBVEE7CisJZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS50ZG1fY2ZnX21pbm9yX3ZlcnNpb24gPQorCQlBRkVfQVBJX1ZFUlNJT05fVERNX0NPTkZJRzsKKworCS8qIFRETSBTTE9UIE1BUFBJTkcgQ0ZHICovCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJInFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1hbGlnbiIsCisJCSZkYWlfZGF0YS0+cG9ydF9jZmcuc2xvdF9tYXBwaW5nLmRhdGFfYWxpZ25fdHlwZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBEYXRhIEFsaWduIGZyb20gRFQgZmlsZSAlc1xuIiwKKwkJCV9fZnVuY19fLAorCQkJInFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1hbGlnbiIpOworCQlnb3RvIGZyZWVfZGFpX2RhdGE7CisJfQorCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBEYXRhIEFsaWduIGZyb20gRFQgZmlsZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnNsb3RfbWFwcGluZy5kYXRhX2FsaWduX3R5cGUpOworCisJLyogVERNIFNMT1QgTUFQUElORyBDRkcgLS0gc2V0IGRlZmF1bHQgKi8KKwlkYWlfZGF0YS0+cG9ydF9jZmcuc2xvdF9tYXBwaW5nLm1pbm9yX3ZlcnNpb24gPQorCQlBRkVfQVBJX1ZFUlNJT05fU0xPVF9NQVBQSU5HX0NPTkZJRzsKKworCS8qIENVU1RPTSBURE0gSEVBREVSIENGRyAqLworCWN1c3RvbV90ZG1faGVhZGVyID0gJmRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlcjsKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1zdGFydC1vZmZzZXQiLCBOVUxMKSAmJgorCQlvZl9maW5kX3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNtLWNwdWRhaS10ZG0taGVhZGVyLXdpZHRoIiwgTlVMTCkgJiYKKwkJb2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1udW0tZnJhbWUtcmVwZWF0IiwgTlVMTCkpIHsKKwkJLyogaWYgdGhlIHByb3BlcnR5IGV4aXN0ICovCisJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItc3RhcnQtb2Zmc2V0IiwKKwkJCSh1MzIgKikmY3VzdG9tX3RkbV9oZWFkZXItPnN0YXJ0X29mZnNldCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEhlYWRlciBTdGFydCBPZmZzZXQgZnJvbSBEVCBmaWxlICVzXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1zdGFydC1vZmZzZXQiKTsKKwkJCWdvdG8gZnJlZV9kYWlfZGF0YTsKKwkJfQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogSGVhZGVyIFN0YXJ0IE9mZnNldCBmcm9tIERUIGZpbGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBjdXN0b21fdGRtX2hlYWRlci0+c3RhcnRfb2Zmc2V0KTsKKworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNtLWNwdWRhaS10ZG0taGVhZGVyLXdpZHRoIiwKKwkJCSh1MzIgKikmY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl93aWR0aCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEhlYWRlciBXaWR0aCBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci13aWR0aCIpOworCQkJZ290byBmcmVlX2RhaV9kYXRhOworCQl9CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBIZWFkZXIgV2lkdGggZnJvbSBEVCBmaWxlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl93aWR0aCk7CisKKwkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1udW0tZnJhbWUtcmVwZWF0IiwKKwkJCSh1MzIgKikmY3VzdG9tX3RkbV9oZWFkZXItPm51bV9mcmFtZV9yZXBlYXQpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBIZWFkZXIgTnVtIEZyYW1lIFJlcGVhdCBmcm9tIERUIGZpbGUgJXNcbiIsCisJCQkJX19mdW5jX18sCisJCQkJInFjb20sbXNtLWNwdWRhaS10ZG0taGVhZGVyLW51bS1mcmFtZS1yZXBlYXQiKTsKKwkJCWdvdG8gZnJlZV9kYWlfZGF0YTsKKwkJfQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogSGVhZGVyIE51bSBGcmFtZSBSZXBlYXQgZnJvbSBEVCBmaWxlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY3VzdG9tX3RkbV9oZWFkZXItPm51bV9mcmFtZV9yZXBlYXQpOworCisJCS8qIENVU1RPTSBURE0gSEVBREVSIENGRyAtLSBzZXQgZGVmYXVsdCAqLworCQljdXN0b21fdGRtX2hlYWRlci0+bWlub3JfdmVyc2lvbiA9CisJCQlBRkVfQVBJX1ZFUlNJT05fQ1VTVE9NX1RETV9IRUFERVJfQ09ORklHOworCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyX3R5cGUgPQorCQkJQUZFX0NVU1RPTV9URE1fSEVBREVSX1RZUEVfSU5WQUxJRDsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJIiVzOiBDdXN0b20gdGRtIGhlYWRlciBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCS8qIENVU1RPTSBURE0gSEVBREVSIENGRyAtLSBzZXQgZGVmYXVsdCAqLworCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyX3R5cGUgPQorCQkJQUZFX0NVU1RPTV9URE1fSEVBREVSX1RZUEVfSU5WQUxJRDsKKwkJLyogcHJvY2VlZCB3aXRoIHByb2JlICovCisJfQorCisJLyogY29weSBzdGF0aWMgY2xrIHBlciBwYXJlbnQgbm9kZSAqLworCWRhaV9kYXRhLT5jbGtfc2V0ID0gdGRtX2Nsa19zZXQ7CisJLyogY29weSBzdGF0aWMgZ3JvdXAgY2ZnIHBlciBwYXJlbnQgbm9kZSAqLworCWRhaV9kYXRhLT5ncm91cF9jZmcudGRtX2NmZyA9IHRkbV9ncm91cF9jZmc7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGFpX2RhdGEpOworCisJcG9ydF9pZHggPSBtc21fZGFpX3E2X2dldF9wb3J0X2lkeCh0ZG1fZGV2X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIFBvcnQgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJX19mdW5jX18sIHRkbV9kZXZfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9kYWlfZGF0YTsKKwl9CisKKwlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCSZtc21fcTZfdGRtX2RhaV9jb21wb25lbnQsCisJCSZtc21fZGFpX3E2X3RkbV9kYWlbcG9ydF9pZHhdLCAxKTsKKworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVERNIGRhaSAweCV4IHJlZ2lzdGVyIGZhaWxlZCwgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgdGRtX2Rldl9pZCwgcmMpOworCQlnb3RvIGVycl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorZnJlZV9kYWlfZGF0YToKKwlrZnJlZShkYWlfZGF0YSk7CitydG46CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKworCWtmcmVlKGRhaV9kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X3RkbV9kZXZfZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi10ZG0iLCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fZGFpX3E2X3RkbV9kZXZfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3E2X3RkbV9kcml2ZXIgPSB7CisJLnByb2JlICA9IG1zbV9kYWlfcTZfdGRtX2Rldl9wcm9iZSwKKwkucmVtb3ZlICA9IG1zbV9kYWlfcTZfdGRtX2Rldl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLWRhaS1xNi10ZG0iLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV9xNl90ZG1fZGV2X2R0X21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fZGFpX3E2X2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2F1eHBjbV9kZXZfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogZmFpbCB0byByZWdpc3RlciBhdXhwY20gZGV2IGRyaXZlciIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2KTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogZmFpbCB0byByZWdpc3RlciBkYWkgcTYgZHJpdmVyIiwgX19mdW5jX18pOworCQlnb3RvIGRhaV9xNl9mYWlsOworCX0KKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2X2Rldik7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIHE2IGRldiBkcml2ZXIiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZGFpX3E2X2Rldl9mYWlsOworCX0KKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2X21pMnNfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogZmFpbCB0byByZWdpc3RlciBkYWkgTUkyUyBkZXYgZHJ2XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZGFpX3E2X21pMnNfZHJ2X2ZhaWw7CisJfQorCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfbWkyc19xNik7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIE1JMlNcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkYWlfbWkyc19xNl9mYWlsOworCX0KKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2X3NwZGlmX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIFNQRElGXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZGFpX3NwZGlmX3E2X2ZhaWw7CisJfQorCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfcTZfdGRtX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIFRETSBkZXYgZHJ2XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZGFpX3E2X3RkbV9kcnZfZmFpbDsKKwl9CisKKwlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV90ZG1fcTYpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBURE1cbiIsIF9fZnVuY19fKTsKKwkJZ290byBkYWlfdGRtX3E2X2ZhaWw7CisJfQorCXJldHVybiByYzsKKworZGFpX3RkbV9xNl9mYWlsOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2X3RkbV9kcml2ZXIpOworZGFpX3E2X3RkbV9kcnZfZmFpbDoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl9zcGRpZl9kcml2ZXIpOworZGFpX3NwZGlmX3E2X2ZhaWw6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfbWkyc19xNik7CitkYWlfbWkyc19xNl9mYWlsOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2X21pMnNfZHJpdmVyKTsKK2RhaV9xNl9taTJzX2Rydl9mYWlsOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2X2Rldik7CitkYWlfcTZfZGV2X2ZhaWw6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfcTYpOworZGFpX3E2X2ZhaWw6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9hdXhwY21fZGV2X2RyaXZlcik7CitmYWlsOgorCXJldHVybiByYzsKK30KK21vZHVsZV9pbml0KG1zbV9kYWlfcTZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fZGFpX3E2X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl9kZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2F1eHBjbV9kZXZfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl9zcGRpZl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNtX2RhaV9xNl9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBEU1AgREFJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktc2xpbS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktc2xpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTJjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1zbGltLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xpbWJ1cy9zbGltYnVzLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL21zbS1zbGltLWRtYS5oPgorCisjZGVmaW5lIFNMSU1fREVWX05BTUUgIm1zbS1kYWktc2xpbSIKKworI2RlZmluZSBTTElNX0RBSV9SQVRFUyAoU05EUlZfUENNX1JBVEVfNDgwMDAgfCBcCisJCQlTTkRSVl9QQ01fUkFURV84MDAwIHwgXAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBcCisJCQlTTkRSVl9QQ01fUkFURV85NjAwMCB8IFwKKwkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCB8IFwKKwkJCVNORFJWX1BDTV9SQVRFXzM4NDAwMCkKKworI2RlZmluZSBTTElNX0RBSV9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisjZGVmaW5lIERBSV9TVEFURV9JTklUSUFMSVpFRCAoMHgwMSA8PCAwKQorI2RlZmluZSBEQUlfU1RBVEVfUFJFUEFSRUQgKDB4MDEgPDwgMSkKKyNkZWZpbmUgREFJX1NUQVRFX1JVTk5JTkcgKDB4MDEgPDwgMikKKworI2RlZmluZSBTRVRfREFJX1NUQVRFKHN0YXR1cywgc3RhdGUpIFwKKwkoc3RhdHVzIHw9IHN0YXRlKQorCisjZGVmaW5lIENMUl9EQUlfU1RBVEUoc3RhdHVzLCBzdGF0ZSkgXAorCShzdGF0dXMgPSBzdGF0dXMgJiAofnN0YXRlKSkKKworZW51bSB7CisJTVNNX0RBSV9TTElNMCA9IDAsCisJTlVNX1NMSU1fREFJUywKK307CisKK3N0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSB7CisJdW5zaWduZWQgaW50IGRhaV9pZDsKKwl1MTYgKmNoYW5faDsKKwl1MTYgKnNoX2NoOworCXUxNiBncnBoOworCXUzMiByYXRlOworCXUxNiBiaXRzOworCXUxNiBjaF9jbnQ7CisJdTggc3RhdHVzOworCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnY7CisJc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhIGRtYV9kYXRhOworCXN0cnVjdCBzbGltX3BvcnRfY2ZnIHBvcnRfY2ZnOworfTsKKworc3RydWN0IG1zbV9kYWlfc2xpbV9kcnZfZGF0YSB7CisJc3RydWN0IHNsaW1fZGV2aWNlICpzZGV2OworCXUxNiBudW1fZGFpczsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgc2xpbV9kYWlfZGF0YVtOVU1fU0xJTV9EQUlTXTsKK307CisKK3N0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSAqbXNtX3NsaW1fZ2V0X2RhaV9kYXRhKAorCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhLAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSAqZGFpX2RhdGFfdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkcnZfZGF0YS0+bnVtX2RhaXM7IGkrKykgeworCQlkYWlfZGF0YV90ID0gJmRydl9kYXRhLT5zbGltX2RhaV9kYXRhW2ldOworCQlpZiAoZGFpX2RhdGFfdC0+ZGFpX2lkID09IGRhaS0+aWQpCisJCQlyZXR1cm4gZGFpX2RhdGFfdDsKKwl9CisKKwlkZXZfZXJyKGRhaS0+ZGV2LAorCQkiJXM6IG5vIGRhaSBkYXRhIGZvdW5kIGZvciBkYWlfaWQgJWRcbiIsCisJCV9fZnVuY19fLCBkYWktPmlkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3NsaW1fY2hfY3RsKHN0cnVjdCBtc21fc2xpbV9kbWFfZGF0YSAqZG1hX2RhdGEsCisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBzbGltX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YTsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhOworCWludCByYywgcmMxLCBpOworCisJaWYgKCFkbWFfZGF0YSB8fCAhZG1hX2RhdGEtPnNkZXYpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICAoIWRtYV9kYXRhKSA/ICJkbWFfZGF0YSIgOiAic2xpbV9kZXZpY2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2RldiA9IGRtYV9kYXRhLT5zZGV2OworCWRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKCZzZGV2LT5kZXYpOworCWRhaV9kYXRhID0gbXNtX3NsaW1fZ2V0X2RhaV9kYXRhKGRydl9kYXRhLCBkYWkpOworCisJaWYgKCFkYWlfZGF0YSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGRhaV9kYXRhIGZvciBkYWlfaWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoJnNkZXYtPmRldiwKKwkJIiVzOiBlbmFibGUgPSAlcywgcmF0ZSA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJZW5hYmxlID8gInRydWUiIDogImZhbHNlIiwKKwkJZGFpX2RhdGEtPnJhdGUpOworCisJaWYgKGVuYWJsZSkgeworCQlpZiAoIShkYWlfZGF0YS0+c3RhdHVzICYgREFJX1NUQVRFX1BSRVBBUkVEKSkgeworCQkJZGV2X2Vycigmc2Rldi0+ZGV2LAorCQkJCSIlczogZGFpIGlkICglZCkgaGFzIGludmFsaWQgc3RhdGUgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5pZCwgZGFpX2RhdGEtPnN0YXR1cyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJjID0gc2xpbV9hbGxvY19tZ3Jwb3J0cyhzZGV2LAorCQkJCQkgU0xJTV9SRVFfREVGQVVMVCwgZGFpX2RhdGEtPmNoX2NudCwKKwkJCQkJICYoZG1hX2RhdGEtPnBoKSwKKwkJCQkJIHNpemVvZihkbWFfZGF0YS0+cGgpKTsKKworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJZGV2X2Vycigmc2Rldi0+ZGV2LAorCQkJCSIlczphbGxvYyBtZ3Jwb3J0IGZhaWxlZCByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmMgPSBzbGltX2NvbmZpZ19tZ3Jwb3J0cyhzZGV2LCAmKGRtYV9kYXRhLT5waCksCisJCQkJCSAgZGFpX2RhdGEtPmNoX2NudCwKKwkJCQkJICAmKGRhaV9kYXRhLT5wb3J0X2NmZykpOworCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgeworCQkJZGV2X2Vycigmc2Rldi0+ZGV2LAorCQkJCSIlczogY29uZmlnIG1ncnBvcnQgZmFpbGVkIHJjICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlnb3RvIGVycl9kb25lOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGRhaV9kYXRhLT5jaF9jbnQ7IGkrKykgeworCQkJcmMgPSBzbGltX2Nvbm5lY3Rfc2luayhzZGV2LAorCQkJCQkgICAgICAgJmRtYV9kYXRhLT5waCwgMSwKKwkJCQkJICAgICAgIGRhaV9kYXRhLT5jaGFuX2hbaV0pOworCQkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkJCSIlczogc2xpbV9jb25uZWN0X3NpbmsgZmFpbGVkLCBjaCA9ICVkLCBlcnIgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGksIHJjKTsKKwkJCQlnb3RvIGVycl9kb25lOworCQkJfQorCQl9CisKKwkJcmMgPSBzbGltX2NvbnRyb2xfY2goc2RldiwKKwkJCQkgICAgIGRhaV9kYXRhLT5ncnBoLAorCQkJCSAgICAgU0xJTV9DSF9BQ1RJVkFURSwgdHJ1ZSk7CisJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkJIiVzOiBzbGltIGFjdGl2YXRlIGNoIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZXJyX2RvbmU7CisJCX0KKwkJLyogTWFyayBkYWkgc3RhdHVzIGFzIHJ1bm5pbmcgKi8KKwkJU0VUX0RBSV9TVEFURShkYWlfZGF0YS0+c3RhdHVzLCBEQUlfU1RBVEVfUlVOTklORyk7CisJfSBlbHNlIHsKKwkJaWYgKCEoZGFpX2RhdGEtPnN0YXR1cyAmIERBSV9TVEFURV9SVU5OSU5HKSkgeworCQkJZGV2X2Vycigmc2Rldi0+ZGV2LAorCQkJCSIlczogZGFpIGlkICglZCkgaGFzIGludmFsaWQgc3RhdGUgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgZGFpLT5pZCwgZGFpX2RhdGEtPnN0YXR1cyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJjID0gc2xpbV9jb250cm9sX2NoKHNkZXYsCisJCQkJICAgICBkYWlfZGF0YS0+Z3JwaCwKKwkJCQkgICAgIFNMSU1fQ0hfUkVNT1ZFLCB0cnVlKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJCWRldl9lcnIoJnNkZXYtPmRldiwKKwkJCQkiJXM6IHNsaW0gYWN0aXZhdGUgY2ggZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmMgPSBzbGltX2RlYWxsb2NfbWdycG9ydHMoc2RldiwKKwkJCQkJICAgJmRtYV9kYXRhLT5waCwgMSk7CisJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkJIiVzOiBkZWFsbG9jIG1ncnBvcnQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBkb25lOworCQl9CisJCS8qIGNsZWFyIHJ1bm5pbmcgc3RhdGUgZm9yIGRhaSovCisJCUNMUl9EQUlfU1RBVEUoZGFpX2RhdGEtPnN0YXR1cywgREFJX1NUQVRFX1JVTk5JTkcpOworCX0KKworCXJldHVybiByYzsKKworZXJyX2RvbmU6CisJcmMxID0gc2xpbV9kZWFsbG9jX21ncnBvcnRzKHNkZXYsCisJCQkJICAgJmRtYV9kYXRhLT5waCwgMSk7CisJaWYgKElTX0VSUl9WQUxVRShyYzEpKQorCQlkZXZfZXJyKCZzZGV2LT5kZXYsCisJCQkiJXM6IGRlYWxsb2MgbWdycG9ydCBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjMSk7Citkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3NsaW1faHdfcGFyYW1zKAorCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhOworCWludCByYyA9IDA7CisKKwlkYWlfZGF0YSA9IG1zbV9zbGltX2dldF9kYWlfZGF0YShkcnZfZGF0YSwgZGFpKTsKKwlpZiAoIWRhaV9kYXRhKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsCisJCQkiJXM6IEludmFsaWQgZGFpX2RhdGEgZm9yIGRhaV9pZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYWktPmlkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFkYWlfZGF0YS0+Y2hfY250IHx8IGRhaV9kYXRhLT5jaF9jbnQgIT0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIGNoX2NudCAlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYWlfZGF0YS0+Y2hfY250LCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlkYWlfZGF0YS0+cG9ydF9jZmcucG9ydF9vcHRzID0gU0xJTV9PUFRfTk9ORTsKKwlpZiAoZGFpX2RhdGEtPnJhdGUgPj0gU05EUlZfUENNX1JBVEVfNDgwMDApCisJCWRhaV9kYXRhLT5wb3J0X2NmZy53YXRlcm1hcmsgPSAxNjsKKwllbHNlCisJCWRhaV9kYXRhLT5wb3J0X2NmZy53YXRlcm1hcmsgPSA4OworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlkYWlfZGF0YS0+Yml0cyA9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlkYWlfZGF0YS0+Yml0cyA9IDI0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlkYWlfZGF0YS0+Yml0cyA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgZm9ybWF0ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRldl9kYmcoZGFpLT5kZXYsICIlczogY2hfY250PSV1IHJhdGU9JXUsIGJpdF93aWR0aCA9ICV1XG4iLAorCQlfX2Z1bmNfXywgZGFpX2RhdGEtPmNoX2NudCwgZGFpX2RhdGEtPnJhdGUsCisJCWRhaV9kYXRhLT5iaXRzKTsKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfc2xpbV9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCXVuc2lnbmVkIGludCByeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICpkYWlfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2OworCXU4IGkgPSAwOworCisJZGV2X2RiZyhkYWktPmRldiwKKwkJIiVzOiB0eF9udW09JXUsIHJ4X251bT0ldVxuIiwKKwkJX19mdW5jX18sIHR4X251bSwgcnhfbnVtKTsKKworCWRhaV9kYXRhID0gbXNtX3NsaW1fZ2V0X2RhaV9kYXRhKGRydl9kYXRhLCBkYWkpOworCWlmICghZGFpX2RhdGEpIHsKKwkJZGV2X2VycihkYWktPmRldiwKKwkJCSIlczogSW52YWxpZCBkYWlfZGF0YSBmb3IgZGFpX2lkICVkXG4iLAorCQkJX19mdW5jX18sIGRhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYWlfZHJ2ID0gZGFpX2RhdGEtPmRhaV9kcnY7CisKKwlpZiAodHhfbnVtID4gZGFpX2Rydi0+Y2FwdHVyZS5jaGFubmVsc19tYXgpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiB0eF9udW0gJXUgbWF4IG91dCBtYXN0ZXIgcG9ydCBjbnRcbiIsCisJCQlfX2Z1bmNfXywgdHhfbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHR4X251bTsgaSsrKQorCQlkYWlfZGF0YS0+c2hfY2hbaV0gPSB0eF9zbG90W2ldOworCisJZGFpX2RhdGEtPmNoX2NudCA9IHR4X251bTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZGFpX3NsaW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YTsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc2xpbV9jaCBwcm9wOworCWludCByYzsKKwl1OCBpLCBqOworCisJZGFpX2RhdGEgPSBtc21fc2xpbV9nZXRfZGFpX2RhdGEoZHJ2X2RhdGEsIGRhaSk7CisJaWYgKCFkYWlfZGF0YSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGRhaV9kYXRhIGZvciBkYWkgJWRcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKGRhaV9kYXRhLT5zdGF0dXMgJiBEQUlfU1RBVEVfSU5JVElBTElaRUQpKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsCisJCQkiJXM6IGRhaSBpZCAoJWQpIGhhcyBpbnZhbGlkIHN0YXRlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgZGFpLT5pZCwgZGFpX2RhdGEtPnN0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRtYV9kYXRhID0gJmRhaV9kYXRhLT5kbWFfZGF0YTsKKwlzbmRfc29jX2RhaV9zZXRfZG1hX2RhdGEoZGFpLCBzdWJzdHJlYW0sIGRtYV9kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYWlfZGF0YS0+Y2hfY250OyBpKyspIHsKKwkJcmMgPSBzbGltX3F1ZXJ5X2NoKGRydl9kYXRhLT5zZGV2LCBkYWlfZGF0YS0+c2hfY2hbaV0sCisJCQkJICAgJmRhaV9kYXRhLT5jaGFuX2hbaV0pOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlczpxdWVyeSBjaGFuIGhhbmRsZSBmYWlsZWQgcmMgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWdvdG8gZXJyb3JfY2hhbl9xdWVyeTsKKwkJfQorCX0KKworCXByb3AucHJvdCA9IFNMSU1fQVVUT19JU087CisJcHJvcC5iYXNlciA9IFNMSU1fUkFURV80MDAwSFo7CisJcHJvcC5kYXRhZiA9IFNMSU1fQ0hfREFUQUZfTk9UX0RFRklORUQ7CisJcHJvcC5hdXhmID0gU0xJTV9DSF9BVVhGX05PVF9BUFBMSUNBQkxFOworCXByb3AucmF0ZW0gPSAoZGFpX2RhdGEtPnJhdGUvNDAwMCk7CisJcHJvcC5zYW1wbGVzemJpdHMgPSBkYWlfZGF0YS0+Yml0czsKKworCXJjID0gc2xpbV9kZWZpbmVfY2goZHJ2X2RhdGEtPnNkZXYsICZwcm9wLCBkYWlfZGF0YS0+Y2hhbl9oLAorCQkJICAgIGRhaV9kYXRhLT5jaF9jbnQsIHRydWUsICZkYWlfZGF0YS0+Z3JwaCk7CisKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOmRlZmluZSBjaGFuIGZhaWxlZCByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycm9yX2RlZmluZV9jaGFuOworCX0KKworCS8qIE1hcmsgc3RyZWFtIHN0YXR1cyBhcyBwcmVwYXJlZCAqLworCVNFVF9EQUlfU1RBVEUoZGFpX2RhdGEtPnN0YXR1cywgREFJX1NUQVRFX1BSRVBBUkVEKTsKKworCXJldHVybiByYzsKKworZXJyb3JfZGVmaW5lX2NoYW46CitlcnJvcl9jaGFuX3F1ZXJ5OgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCXNsaW1fZGVhbGxvY19jaChkcnZfZGF0YS0+c2RldiwgZGFpX2RhdGEtPmNoYW5faFtqXSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtc21fZGFpX3NsaW1fc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgKmRtYV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhOworCWludCBpLCByYyA9IDA7CisKKwlkYWlfZGF0YSA9IG1zbV9zbGltX2dldF9kYWlfZGF0YShkcnZfZGF0YSwgZGFpKTsKKwlkbWFfZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0YShkYWksIHN0cmVhbSk7CisJaWYgKCFkbWFfZGF0YSB8fCAhZGFpX2RhdGEpIHsKKwkJZGV2X2VycihkYWktPmRldiwKKwkJCSIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCQkoIWRtYV9kYXRhKSA/ICJkbWFfZGF0YSIgOiAiZGFpX2RhdGEiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoIShkYWlfZGF0YS0+c3RhdHVzICYgREFJX1NUQVRFX1BSRVBBUkVEKSkgfHwKKwkgICAgIGRhaV9kYXRhLT5zdGF0dXMgJiBEQUlfU1RBVEVfUlVOTklORykgeworCQlkZXZfZXJyKGRhaS0+ZGV2LAorCQkJIiVzOiBkYWkgaWQgKCVkKSBoYXMgaW52YWxpZCBzdGF0ZSAweCV4XG4iLAorCQkJX19mdW5jX18sIGRhaS0+aWQsIGRhaV9kYXRhLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRhaV9kYXRhLT5jaF9jbnQ7IGkrKykgeworCQlyYyA9IHNsaW1fZGVhbGxvY19jaChkcnZfZGF0YS0+c2RldiwgZGFpX2RhdGEtPmNoYW5faFtpXSk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihkYWktPmRldiwKKwkJCQkiJXM6IGRlYWxsb2NfY2ggZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQl9CisJfQorCisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3RyZWFtLCBOVUxMKTsKKwkvKiBjbGVhciBwcmVwYXJlZCBzdGF0ZSBmb3IgdGhlIGRhaSAqLworCUNMUl9EQUlfU1RBVEUoZGFpX2RhdGEtPnN0YXR1cywgREFJX1NUQVRFX1BSRVBBUkVEKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2RhaV9zbGltX2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAibXNtLWRhaS1zbGltLWNtcG50IiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfc2xpbV9vcHMgPSB7CisJLnByZXBhcmUJPSBtc21fZGFpX3NsaW1fcHJlcGFyZSwKKwkuaHdfcGFyYW1zCT0gbXNtX2RhaV9zbGltX2h3X3BhcmFtcywKKwkuc2h1dGRvd24JPSBtc21fZGFpX3NsaW1fc2h1dGRvd24sCisJLnNldF9jaGFubmVsX21hcCA9IG1zbV9kYWlfc2xpbV9zZXRfY2hhbm5lbF9tYXAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fc2xpbV9kYWlzW10gPSB7CisJeworCQkvKgorCQkgKiBUaGUgZmlyc3QgZGFpIG5hbWUgc2hvdWxkIGJlIHNhbWUgYXMgZGV2aWNlIG5hbWUKKwkJICogdG8gc3VwcG9ydCByZWdpc3RlcmluZyBzaW5nbGUgYW5kIG11bHRpbGUgZGFpcy4KKwkJICovCisJCS5uYW1lID0gU0xJTV9ERVZfTkFNRSwKKwkJLmlkID0gTVNNX0RBSV9TTElNMCwKKwkJLmNhcHR1cmUgPSB7CisJCQkucmF0ZXMgPSBTTElNX0RBSV9SQVRFUywKKwkJCS5mb3JtYXRzID0gU0xJTV9EQUlfRk9STUFUUywKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLyoKKwkJCSAqIG1heCBjaGFubmVscyBhbGxvd2VkIGlzCisJCQkgKiBkZXBlbmRlbnQgb24gcGxhdGZvcm0gYW5kCisJCQkgKiB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIHRoaXMKKwkJCSAqIGRhaSBkcml2ZXIgaXMgcmVnaXN0ZXJlZC4KKwkJCSAqLworCQkJLmNoYW5uZWxzX21heCA9IDEsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAorCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1fREFJMCBDYXB0dXJlIiwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3NsaW1fb3BzLAorCX0sCisJLyoKKwkgKiBJZiBtdWx0aXBsZSBkYWlzIGFyZSBuZWVkZWQsCisJICogYWRkIGRhaXMgaGVyZSBhbmQgdXBkYXRlIHRoZQorCSAqIGRhaV9pZCBlbnVtLgorCSAqLworfTsKKworc3RhdGljIHZvaWQgbXNtX2RhaV9zbGltX3JlbW92ZV9kYWlfZGF0YSgKKwkJc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhX3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJ2X2RhdGEtPm51bV9kYWlzOyBpKyspIHsKKwkJZGFpX2RhdGFfdCA9ICZkcnZfZGF0YS0+c2xpbV9kYWlfZGF0YVtpXTsKKworCQlrZnJlZShkYWlfZGF0YV90LT5jaGFuX2gpOworCQlkYWlfZGF0YV90LT5jaGFuX2ggPSBOVUxMOworCQlrZnJlZShkYWlfZGF0YV90LT5zaF9jaCk7CisJCWRhaV9kYXRhX3QtPnNoX2NoID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9zbGltX3BvcHVsYXRlX2RhaV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IG1zbV9kYWlfc2xpbV9kcnZfZGF0YSAqZHJ2X2RhdGEpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKKwlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhX3Q7CisJdTggbnVtX2NoOworCWludCBpLCBqLCByYzsKKworCWZvciAoaSA9IDA7IGkgPCBkcnZfZGF0YS0+bnVtX2RhaXM7IGkrKykgeworCQludW1fY2ggPSAwOworCQlkYWlfZHJ2ID0gJm1zbV9zbGltX2RhaXNbaV07CisJCW51bV9jaCArPSBkYWlfZHJ2LT5jYXB0dXJlLmNoYW5uZWxzX21heDsKKwkJbnVtX2NoICs9IGRhaV9kcnYtPnBsYXliYWNrLmNoYW5uZWxzX21heDsKKworCQlkYWlfZGF0YV90ID0gJmRydl9kYXRhLT5zbGltX2RhaV9kYXRhW2ldOworCQlkYWlfZGF0YV90LT5kYWlfZHJ2ID0gZGFpX2RydjsKKwkJZGFpX2RhdGFfdC0+ZGFpX2lkID0gZGFpX2Rydi0+aWQ7CisJCWRhaV9kYXRhX3QtPmRtYV9kYXRhLnNkZXYgPSBkcnZfZGF0YS0+c2RldjsKKwkJZGFpX2RhdGFfdC0+ZG1hX2RhdGEuZGFpX2NoYW5uZWxfY3RsID0KKwkJCQltc21fZGFpX3NsaW1fY2hfY3RsOworCQlTRVRfREFJX1NUQVRFKGRhaV9kYXRhX3QtPnN0YXR1cywKKwkJCSAgICAgIERBSV9TVEFURV9JTklUSUFMSVpFRCk7CisKKwkJZGFpX2RhdGFfdC0+Y2hhbl9oID0gZGV2bV9remFsbG9jKGRldiwKKwkJCQkJc2l6ZW9mKHUxNikgKiBudW1fY2gsCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWRhaV9kYXRhX3QtPmNoYW5faCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIiVzOiBEQUkgSUQgJWQsIEZhaWxlZCB0byBhbGxvYyBjaGFubmVsIGhhbmRsZXNcbiIsCisJCQkJX19mdW5jX18sIGkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBlcnJfbWVtX2FsbG9jOworCQl9CisKKwkJZGFpX2RhdGFfdC0+c2hfY2ggPSBkZXZtX2t6YWxsb2MoZGV2LAorCQkJCQlzaXplb2YodTE2KSAqIG51bV9jaCwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZGFpX2RhdGFfdC0+c2hfY2gpIHsKKwkJCWRldl9lcnIoZGV2LAorCQkJCSIlczogREFJIElEICVkLCBGYWlsZWQgdG8gYWxsb2Mgc2hfY2hcbiIsCisJCQkJX19mdW5jX18sIGkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBlcnJfbWVtX2FsbG9jOworCQl9CisJfQorCXJldHVybiAwOworCitlcnJfbWVtX2FsbG9jOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJZGFpX2RhdGFfdCA9ICZkcnZfZGF0YS0+c2xpbV9kYWlfZGF0YVtpXTsKKworCQlkZXZtX2tmcmVlKGRldiwgZGFpX2RhdGFfdC0+Y2hhbl9oKTsKKwkJZGFpX2RhdGFfdC0+Y2hhbl9oID0gTlVMTDsKKworCQlkZXZtX2tmcmVlKGRldiwgZGFpX2RhdGFfdC0+c2hfY2gpOworCQlkYWlfZGF0YV90LT5zaF9jaCA9IE5VTEw7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3NsaW1fZGV2X3Byb2JlKHN0cnVjdCBzbGltX2RldmljZSAqc2RldikKK3sKKwlpbnQgcmMsIGk7CisJdTggbWF4X2NoYW5uZWxzOworCXUzMiBhcHBzX2NoX3BpcGVzOworCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzZGV2LT5kZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKKworCWlmICghZGV2LT5vZl9ub2RlIHx8CisJICAgICFkZXYtPm9mX25vZGUtPnBhcmVudCkgeworCQlkZXZfZXJyKGRldiwKKwkJCSIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCQkoIWRldi0+b2Zfbm9kZSkgPyAib2Zfbm9kZSIgOiAicGFyZW50X29mX25vZGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUtPnBhcmVudCwKKwkJCQkJICJxY29tLGFwcHMtY2gtcGlwZXMiLAorCQkJCQkgJmFwcHNfY2hfcGlwZXMpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwKKwkJCSIlczogRmFpbGVkIHRvIGxvb2t1cCBwcm9wZXJ0eSAlcyBpbiBub2RlICVzLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCAicWNvbSxhcHBzLWNoLXBpcGVzIiwKKwkJCWRldi0+b2Zfbm9kZS0+cGFyZW50LT5mdWxsX25hbWUsIHJjKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCW1heF9jaGFubmVscyA9IGh3ZWlnaHRfbG9uZyhhcHBzX2NoX3BpcGVzKTsKKwlpZiAobWF4X2NoYW5uZWxzIDw9IDApIHsKKwkJZGV2X2VycihkZXYsCisJCQkiJXM6IEludmFsaWQgYXBwcyBvd25lZCBwb3J0cyAlZFxuIiwKKwkJCV9fZnVuY19fLCBtYXhfY2hhbm5lbHMpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJZGV2X2RiZyhkZXYsICIlczogbWF4IGNoYW5uZWxzID0gJXVcbiIsCisJCV9fZnVuY19fLCBtYXhfY2hhbm5lbHMpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX3NsaW1fZGFpcyk7IGkrKykgeworCQlkYWlfZHJ2ID0gJm1zbV9zbGltX2RhaXNbaV07CisJCWRhaV9kcnYtPmNhcHR1cmUuY2hhbm5lbHNfbWF4ID0gbWF4X2NoYW5uZWxzOworCQlkYWlfZHJ2LT5wbGF5YmFjay5jaGFubmVsc19tYXggPSBtYXhfY2hhbm5lbHM7CisJfQorCisJZHJ2X2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydl9kYXRhKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWRydl9kYXRhLT5zZGV2ID0gc2RldjsKKwlkcnZfZGF0YS0+bnVtX2RhaXMgPSBOVU1fU0xJTV9EQUlTOworCisJcmMgPSBtc21fZGFpX3NsaW1fcG9wdWxhdGVfZGFpX2RhdGEoZGV2LCBkcnZfZGF0YSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gc2V0dXAgZGFpX2RhdGEsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfcG9wdWxhdGVfZGFpOworCX0KKworCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnNkZXYtPmRldiwgJm1zbV9kYWlfc2xpbV9jb21wb25lbnQsCisJCQkJCW1zbV9zbGltX2RhaXMsIE5VTV9TTElNX0RBSVMpOworCisJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIERBSSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycl9yZWdfY29tcDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZfZGF0YSk7CisJcmV0dXJuIHJjOworCitlcnJfcmVnX2NvbXA6CisJbXNtX2RhaV9zbGltX3JlbW92ZV9kYWlfZGF0YShkZXYsIGRydl9kYXRhKTsKKworZXJyX3BvcHVsYXRlX2RhaToKKwlkZXZtX2tmcmVlKGRldiwgZHJ2X2RhdGEpOworCitlcnJfcmV0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3NsaW1fZGV2X3JlbW92ZShzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmc2Rldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbGltX2RldmljZV9pZCBtc21fZGFpX3NsaW1fZHRfbWF0Y2hbXSA9IHsKKwl7U0xJTV9ERVZfTkFNRSwgMCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNsaW1fZHJpdmVyIG1zbV9kYWlfc2xpbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBTTElNX0RFVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1zbV9kYWlfc2xpbV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfc2xpbV9kZXZfcmVtb3ZlLAorCS5pZF90YWJsZSA9IG1zbV9kYWlfc2xpbV9kdF9tYXRjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9kYWlfc2xpbV9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBzbGltX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9zbGltX2RyaXZlcik7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBzbGltYnVzIGRyaXZlciByYyA9ICVkIiwKKwkJCV9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQobXNtX2RhaV9zbGltX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2RhaV9zbGltX2V4aXQodm9pZCkKK3sKK30KK21vZHVsZV9leGl0KG1zbV9kYWlfc2xpbV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfREVTQ1JJUFRJT04oIlNsaW1idXMgYXBwcy1vd25lZCBjaGFubmVsIGhhbmRsaW5nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktc3R1Yi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktc3R1Yi12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmMzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1zdHViLXYyLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitlbnVtIHsKKwlTVFVCX1JYLAorCVNUVUJfVFgsCisJU1RVQl8xX1JYLAorCVNUVUJfMV9UWCwKKwlTVFVCX0RUTUZfVFgsCisJU1RVQl9IT1NUX1JYX0NBUFRVUkVfVFgsCisJU1RVQl9IT1NUX1JYX1BMQVlCQUNLX1JYLAorCVNUVUJfSE9TVF9UWF9DQVBUVVJFX1RYLAorCVNUVUJfSE9TVF9UWF9QTEFZQkFDS19SWCwKK307CisKK3N0YXRpYyBpbnQgbXNtX2RhaV9zdHViX3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAorCQl1bnNpZ25lZCBpbnQgcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCit7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfc3R1Yl9vcHMgPSB7CisJLnNldF9jaGFubmVsX21hcCA9IG1zbV9kYWlfc3R1Yl9zZXRfY2hhbm5lbF9tYXAsCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9hZGRfcm91dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbjsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CisKKwlpZiAoIWRhaSB8fCAhZGFpLT5kcml2ZXIpIHsKKwkJcHJfZXJyKCIlcyBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGFwbSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kYXBtKGRhaS0+Y29tcG9uZW50KTsKKwltZW1zZXQoJmludGVyY29uLCAwLCBzaXplb2YoaW50ZXJjb24pKTsKKwlpZiAoZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lICYmCisJCWRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZSkgeworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgYWRkIHJvdXRlIGZvciB3aWRnZXQgJXMiLAorCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZSk7CisJCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZTsKKwkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZTsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzIHNyYyAlcyBzaW5rICVzXG4iLAorCQkJX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sICZpbnRlcmNvbiwgMSk7CisJfQorCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgorCQlkYWktPmRyaXZlci0+Y2FwdHVyZS5haWZfbmFtZSkgeworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgYWRkIHJvdXRlIGZvciB3aWRnZXQgJXMiLAorCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lKTsKKwkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOworCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZTsKKwkJZGV2X2RiZyhkYWktPmRldiwgIiVzIHNyYyAlcyBzaW5rICVzXG4iLAorCQkJX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sICZpbnRlcmNvbiwgMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcmV0dXJuIG1zbV9kYWlfc3R1Yl9hZGRfcm91dGUoZGFpKTsKK30KKworc3RhdGljIGludCBtc21fZGFpX3N0dWJfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfc3R1Yl9kYWlfcnggPSB7CisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiU3R1YiBQbGF5YmFjayIsCisJCS5haWZfbmFtZSA9ICJTVFVCX1JYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlX21pbiA9IDgwMDAsCisJCS5yYXRlX21heCA9IDQ4MDAwLAorCX0sCisJLm9wcyA9ICZtc21fZGFpX3N0dWJfb3BzLAorCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAorCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3N0dWJfZGFpX3R4W10gPSB7CisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTdHViIENhcHR1cmUiLAorCQkJLmFpZl9uYW1lID0gIlNUVUJfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCisJCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJTdHViMSBDYXB0dXJlIiwKKwkJCS5haWZfbmFtZSA9ICJTVFVCXzFfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCisJCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfc3R1Yl9kdG1mX3R4X2RhaSA9IHsKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkRUTUYgVFgiLAorCQkuYWlmX25hbWUgPSAiU1RVQl9EVE1GX1RYIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZV9taW4gPSA4MDAwLAorCQkucmF0ZV9tYXggPSA0ODAwMCwKKwl9LAorCS5vcHMgPSAmbXNtX2RhaV9zdHViX29wcywKKwkucHJvYmUgPSAmbXNtX2RhaV9zdHViX2RhaV9wcm9iZSwKKwkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9zdHViX2hvc3RfY2FwdHVyZV90eF9kYWlbXSA9IHsKKwl7CisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkNTLVZPSUNFIEhPU1QgUlggQ0FQVFVSRSIsCisJCQkuYWlmX25hbWUgPSAiU1RVQl9IT1NUX1JYX0NBUFRVUkVfVFgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDQ4MDAwLAorCQl9LAorCQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCisJCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAorCQkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAorCX0sCisJeworCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJDUy1WT0lDRSBIT1NUIFRYIENBUFRVUkUiLAorCQkJLmFpZl9uYW1lID0gIlNUVUJfSE9TVF9UWF9DQVBUVVJFX1RYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3N0dWJfb3BzLAorCQkucHJvYmUgPSAmbXNtX2RhaV9zdHViX2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9ICZtc21fZGFpX3N0dWJfZGFpX3JlbW92ZSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9zdHViX2hvc3RfcGxheWJhY2tfcnhfZGFpW10gPSB7CisJeworCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQ1MtVk9JQ0UgSE9TVCBSWCBQTEFZQkFDSyIsCisJCQkuYWlmX25hbWUgPSAiU1RVQl9IT1NUX1JYX1BMQVlCQUNLX1JYIiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZV9taW4gPSA4MDAwLAorCQkJLnJhdGVfbWF4ID0gNDgwMDAsCisJCX0sCisJCS5vcHMgPSAmbXNtX2RhaV9zdHViX29wcywKKwkJLnByb2JlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUsCisJCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCisJfSwKKwl7CisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJDUy1WT0lDRSBIT1NUIFRYIFBMQVlCQUNLIiwKKwkJCS5haWZfbmFtZSA9ICJTVFVCX0hPU1RfVFhfUExBWUJBQ0tfUlgiLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJfSwKKwkJLm9wcyA9ICZtc21fZGFpX3N0dWJfb3BzLAorCQkucHJvYmUgPSAmbXNtX2RhaV9zdHViX2RhaV9wcm9iZSwKKwkJLnJlbW92ZSA9ICZtc21fZGFpX3N0dWJfZGFpX3JlbW92ZSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2RhaV9zdHViX2NvbXBvbmVudCA9IHsKKwkubmFtZQkJPSAibXNtLWRhaS1zdHViLWRldiIsCit9OworCitzdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmMsIGlkID0gLTE7CisJY29uc3QgY2hhciAqc3R1Yl9kZXZfaWQgPSAicWNvbSxtc20tZGFpLXN0dWItZGV2LWlkIjsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIHN0dWJfZGV2X2lkLCAmaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIHN0dWJfZGV2X2lkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBkZXYtPmlkID0gaWQ7CisKKwlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzLCBpZDolZFxuIiwgX19mdW5jX18sCisJCSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGRldi0+aWQpOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgU1RVQl9SWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsICZtc21fZGFpX3N0dWJfZGFpX3J4LCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVFVCX1RYOgorCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkmbXNtX2RhaV9zdHViX2NvbXBvbmVudCwgJm1zbV9kYWlfc3R1Yl9kYWlfdHhbMF0sIDEpOworCQlicmVhazsKKwljYXNlIFNUVUJfMV9UWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsICZtc21fZGFpX3N0dWJfZGFpX3R4WzFdLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVFVCX0RUTUZfVFg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3N0dWJfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfc3R1Yl9kdG1mX3R4X2RhaSwgMSk7CisJCWJyZWFrOworCWNhc2UgU1RVQl9IT1NUX1JYX0NBUFRVUkVfVFg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3N0dWJfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfc3R1Yl9ob3N0X2NhcHR1cmVfdHhfZGFpWzBdLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVFVCX0hPU1RfVFhfQ0FQVFVSRV9UWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsCisJCQkmbXNtX2RhaV9zdHViX2hvc3RfY2FwdHVyZV90eF9kYWlbMV0sIDEpOworCQlicmVhazsKKwljYXNlIFNUVUJfSE9TVF9SWF9QTEFZQkFDS19SWDoKKwkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsCisJCQkmbXNtX2RhaV9zdHViX2hvc3RfcGxheWJhY2tfcnhfZGFpWzBdLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVFVCX0hPU1RfVFhfUExBWUJBQ0tfUlg6CisJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKKwkJCSZtc21fZGFpX3N0dWJfY29tcG9uZW50LAorCQkJJm1zbV9kYWlfc3R1Yl9ob3N0X3BsYXliYWNrX3J4X2RhaVsxXSwgMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZGFpX3N0dWJfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfc3R1Yl9kZXZfZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1zdHViLWRldiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9zdHViX2Rldl9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9kYWlfc3R1Yl9kZXYgPSB7CisJLnByb2JlICA9IG1zbV9kYWlfc3R1Yl9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9kYWlfc3R1Yl9kZXZfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1kYWktc3R1Yi1kZXYiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV9zdHViX2Rldl9kdF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBtc21fZGFpX3N0dWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmMgPSAwOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiZGV2IG5hbWUgJXNcbiIsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKworCXJjID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocGRldi0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIGFkZCBjaGlsZCBub2RlcywgcmM9JWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCX0gZWxzZQorCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogYWRkZWQgY2hpbGQgbm9kZVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9zdHViX2R0X21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1zdHViIn0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9kYWlfc3R1Yl9kdF9tYXRjaCk7CisKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9zdHViX2RyaXZlciA9IHsKKwkucHJvYmUgID0gbXNtX2RhaV9zdHViX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fZGFpX3N0dWJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1kYWktc3R1YiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3N0dWJfZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9kYWlfc3R1Yl9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3N0dWJfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogZmFpbCB0byByZWdpc3RlciBkYWkgcTYgZHJpdmVyIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfc3R1Yl9kZXYpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBxNiBkZXYgZHJpdmVyIiwgX19mdW5jX18pOworCQlnb3RvIGRhaV9zdHViX2Rldl9mYWlsOworCX0KKwlyZXR1cm4gcmM7CisKK2RhaV9zdHViX2Rldl9mYWlsOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3N0dWJfZHJpdmVyKTsKK2ZhaWw6CisJcmV0dXJuIHJjOworfQorbW9kdWxlX2luaXQobXNtX2RhaV9zdHViX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2RhaV9zdHViX2V4aXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9zdHViX2Rldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfc3R1Yl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNtX2RhaV9zdHViX2V4aXQpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9ERVNDUklQVElPTigiTVNNIFN0dWIgRFNQIERBSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZG9sYnktY29tbW9uLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRvbGJ5LWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNGU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRvbGJ5LWNvbW1vbi5oCkBAIC0wLDAgKzEsMjY2IEBACisKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9NU01fRE9MQllfQ09NTU9OX0hfCisjZGVmaW5lIF9NU01fRE9MQllfQ09NTU9OX0hfCisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworCisjZGVmaW5lIERPTEJZX0JVTkRMRV9NT0RVTEVfSUQJCTB4MDAwMTA3MjMKKyNkZWZpbmUgRE9MQllfVklTVUFMSVpFUl9NT0RVTEVfSUQJMHgwMDAxMDcyQgorCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZESEUJCTB4MDAwMTA3NEQKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfVlNQRQkJMHgwMDAxMDc1MAorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EU1NGCQkweDAwMDEwNzUzCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RWTEkJCTB4MDAwMTA3M0UKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFZMTwkJMHgwMDAxMDczRgorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EVkxFCQkweDAwMDEwNzNDCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RWTUMJCTB4MDAwMTA3NDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFZNRQkJMHgwMDAxMDc0MAorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9JRU5CCQkweDAwMDEwNzQ0CisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0lFQkYJCTB4MDAwMTA3NDUKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfSUVPTgkJMHgwMDAxMDc0MworI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ERU9OCQkweDAwMDEwNzM4CisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX05HT04JCTB4MDAwMTA3MzYKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfR0VPTgkJMHgwMDAxMDc0OAorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9HRU5CCQkweDAwMDEwNzQ5CisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0dFQkYJCTB4MDAwMTA3NEEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfQU9OQgkJMHgwMDAxMDc1QgorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BT0JGCQkweDAwMDEwNzVDCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FPQkcJCTB4MDAwMTA3NUQKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfQU9PTgkJMHgwMDAxMDc1OQorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BUk5CCQkweDAwMDEwNzVGCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FSQkYJCTB4MDAwMTA3NjAKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfUExCCQkweDAwMDEwNzY4CisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX1BMTUQJCTB4MDAwMTA3NjcKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfREhTQgkJMHgwMDAxMDc0RQorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ESFJHCQkweDAwMDEwNzRGCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RTU0IJCTB4MDAwMTA3NTEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFNTQQkJMHgwMDAxMDc1MgorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EVkxBCQkweDAwMDEwNzNECisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0lFQlQJCTB4MDAwMTA3NDYKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfSUVBCQkweDAwMDEwNzZBCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RFQQkJMHgwMDAxMDczOQorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ERUQJCTB4MDAwMTA3M0EKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfR0VCRwkJMHgwMDAxMDc0QgorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BT0NDCQkweDAwMDEwNzVBCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FSQkkJCTB4MDAwMTA3NjEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfQVJCTAkJMHgwMDAxMDc2MgorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BUkJICQkweDAwMDEwNzYzCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FST0QJCTB4MDAwMTA3NjQKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfQVJUUAkJMHgwMDAxMDc2NQorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WTU9OCQkweDAwMDEwNzU2CisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZNQgkJMHgwMDAxMDc1NworI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WQ05CCQkweDAwMDEwNzMzCisjZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZDQkYJCTB4MDAwMTA3MzQKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfUFJFRwkJMHgwMDAxMDcyOAorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WRU4JCTB4MDAwMTA3MzIKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfUFNURwkJMHgwMDAxMDcyOQorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFAJMHgwMDAxMDcyNworCisvKiBOb3QgVXNlZCB3aXRoIFNldCBQYXJhbSBrY29udHJvbCwgb25seSB0byBxdWVyeSB1c2luZyBHZXQgUGFyYW0gKi8KKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfVkVSCQkweDAwMDEwNzI2CisKKyNkZWZpbmUgRE9MQllfUEFSQU1fSURfVkNCRwkJMHgwMDAxMDczMAorI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WQ0JFCQkweDAwMDEwNzMxCisKKy8qIERPTEJZIERBUCBjb250cm9sIHBhcmFtcyAqLworI2RlZmluZSBET0xCWV9DT01NSVRfQUxMX1RPX0RTUAkJMHg3MDAwMDAwMQorI2RlZmluZSBET0xCWV9DT01NSVRfVE9fRFNQCQkweDcwMDAwMDAyCisjZGVmaW5lIERPTEJZX1VTRV9DQUNIRQkJCTB4NzAwMDAwMDMKKyNkZWZpbmUgRE9MQllfQVVUT19FTkRQCQkJMHg3MDAwMDAwNAorI2RlZmluZSBET0xCWV9BVVRPX0VORERFUF9QQVJBTVMJMHg3MDAwMDAwNQorI2RlZmluZSBET0xCWV9EQVBfQllQQVNTCQkweDcwMDAwMDA2CisKKyNkZWZpbmUgRE9MQllfRU5BQkxFX0NVU1RPTV9TVEVSRU8JMHgwMDAxMDhjNworCisvKiBET0xCWSBEQVAgb2Zmc2V0cyBzdGFydCAqLworI2RlZmluZSBET0xCWV9QQVJBTV9WREhFX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fVkRIRV9PRkZTRVQgICAwCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZTUEVfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9WU1BFX09GRlNFVCAgIChET0xCWV9QQVJBTV9WREhFX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fVkRIRV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RTU0ZfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EU1NGX09GRlNFVCAgIChET0xCWV9QQVJBTV9WU1BFX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fVlNQRV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RWTElfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EVkxJX09GRlNFVCAgIChET0xCWV9QQVJBTV9EU1NGX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFNTRl9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RWTE9fTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EVkxPX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxJX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFZMSV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RWTEVfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EVkxFX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxPX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFZMT19MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RWTUNfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EVk1DX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxFX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFZMRV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RWTUVfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9EVk1FX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVk1DX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFZNQ19MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0lFTkJfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9JRU5CX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVk1FX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fRFZNRV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0lFQkZfTEVOR1RIICAgNDAKKyNkZWZpbmUgRE9MQllfUEFSQU1fSUVCRl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVOQl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0lFTkJfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9JRU9OX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSUVPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVCRl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0lFQkZfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9ERU9OX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fREVPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVPTl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0lFT05fTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9OR09OX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fREVPTl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RFT05fTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9HRU9OX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fR0VPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX05HT05fTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fR0VOQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fR0VPTl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0dFT05fTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9HRUJGX0xFTkdUSCAgIDQwCisjZGVmaW5lIERPTEJZX1BBUkFNX0dFQkZfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0dFTkJfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQU9OQl9MRU5HVEggICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX0FPTkJfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0dFQkZfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9HRUJGX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQU9CRl9MRU5HVEggICA0MAorI2RlZmluZSBET0xCWV9QQVJBTV9BT0JGX09GRlNFVCAgIChET0xCWV9QQVJBTV9BT05CX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQU9OQl9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0FPQkdfTEVOR1RIICAgMzI5CisjZGVmaW5lIERPTEJZX1BBUkFNX0FPQkdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPQkZfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9BT0JGX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQU9PTl9MRU5HVEggICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX0FPT05fT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPQkdfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9BT0JHX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQVJOQl9MRU5HVEggICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX0FSTkJfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPT05fT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9BT09OX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQVJCRl9MRU5HVEggICA0MAorI2RlZmluZSBET0xCWV9QQVJBTV9BUkJGX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUk5CX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJOQl9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX1BMQl9MRU5HVEggICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9QTEJfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9BUkJGX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJCRl9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX1BMTURfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9QTE1EX09GRlNFVCAgIChET0xCWV9QQVJBTV9QTEJfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9QTEJfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9ESFNCX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fREhTQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fUExNRF9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX1BMTURfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9ESFJHX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fREhSR19PRkZTRVQgICAoRE9MQllfUEFSQU1fREhTQl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RIU0JfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9EU1NCX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fRFNTQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fREhSR19PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RIUkdfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9EU1NBX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fRFNTQV9PRkZTRVQgICAoRE9MQllfUEFSQU1fRFNTQl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RTU0JfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9EVkxBX0xFTkdUSCAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fRFZMQV9PRkZTRVQgICAoRE9MQllfUEFSQU1fRFNTQV9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RTU0FfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9JRUJUX0xFTkdUSCAgIDQwCisjZGVmaW5lIERPTEJZX1BBUkFNX0lFQlRfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0RWTEFfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9EVkxBX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fSUVBX0xFTkdUSCAgICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX0lFQV9PRkZTRVQgICAgKERPTEJZX1BBUkFNX0lFQlRfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9JRUJUX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fREVBX0xFTkdUSCAgICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX0RFQV9PRkZTRVQgICAgKERPTEJZX1BBUkFNX0lFQV9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0lFQV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0RFRF9MRU5HVEggICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9ERURfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9ERUFfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9ERUFfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9HRUJHX0xFTkdUSCAgIDQwCisjZGVmaW5lIERPTEJZX1BBUkFNX0dFQkdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0RFRF9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0RFRF9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0FPQ0NfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9BT0NDX09GRlNFVCAgIChET0xCWV9QQVJBTV9HRUJHX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fR0VCR19MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0FSQklfTEVOR1RIICAgNDAKKyNkZWZpbmUgRE9MQllfUEFSQU1fQVJCSV9PRkZTRVQgICAoRE9MQllfUEFSQU1fQU9DQ19PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX0FPQ0NfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9BUkJMX0xFTkdUSCAgIDQwCisjZGVmaW5lIERPTEJZX1BBUkFNX0FSQkxfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FSQklfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9BUkJJX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fQVJCSF9MRU5HVEggICA0MAorI2RlZmluZSBET0xCWV9QQVJBTV9BUkJIX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUkJMX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJCTF9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0FST0RfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9BUk9EX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUkJIX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJCSF9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX0FSVFBfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9BUlRQX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUk9EX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJPRF9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZNT05fTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9WTU9OX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUlRQX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fQVJUUF9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZNQl9MRU5HVEggICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9WTUJfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9WTU9OX09GRlNFVCArIFwKKwkJCQkJRE9MQllfUEFSQU1fVk1PTl9MRU5HVEgpCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZDTkJfTEVOR1RIICAgMQorI2RlZmluZSBET0xCWV9QQVJBTV9WQ05CX09GRlNFVCAgIChET0xCWV9QQVJBTV9WTUJfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9WTUJfTEVOR1RIKQorI2RlZmluZSBET0xCWV9QQVJBTV9WQ0JGX0xFTkdUSCAgIDIwCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZDQkZfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZDTkJfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9WQ05CX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fUFJFR19MRU5HVEggICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX1BSRUdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZDQkZfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9WQ0JGX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fVkVOX0xFTkdUSCAgICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX1ZFTl9PRkZTRVQgICAgKERPTEJZX1BBUkFNX1BSRUdfT0ZGU0VUICsgXAorCQkJCQlET0xCWV9QQVJBTV9QUkVHX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfUEFSQU1fUFNUR19MRU5HVEggICAxCisjZGVmaW5lIERPTEJZX1BBUkFNX1BTVEdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZFTl9PRkZTRVQgKyBcCisJCQkJCURPTEJZX1BBUkFNX1ZFTl9MRU5HVEgpCisKKyNkZWZpbmUgRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RICQkxCisjZGVmaW5lIERPTEJZX1BBUkFNX1BBWUxPQURfU0laRQkJMworI2RlZmluZSBET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0JMzI5CisKKyNkZWZpbmUgVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNCQk3NDUKKyNkZWZpbmUgRE9MQllfVklTX1BBUkFNX0hFQURFUl9TSVpFCQkyNQorI2RlZmluZSBET0xCWV9QQVJBTV9WQ05CX01BWF9MRU5HVEgJCTQwCisKKyNkZWZpbmUgRE9MQllfSU5WQUxJRF9QT1JUX0lECQkJLTEKKworZW51bSB7CisJREVWSUNFX05PTkUJCQk9IDB4MCwKKwkvKiBvdXRwdXQgZGV2aWNlcyAqLworCUVBUlBJRUNFCQkJPSAweDEsCisJU1BFQUtFUgkJCQk9IDB4MiwKKwlXSVJFRF9IRUFEU0VUCQkJPSAweDQsCisJV0lSRURfSEVBRFBIT05FCQkJPSAweDgsCisJQkxVRVRPT1RIX1NDTwkJCT0gMHgxMCwKKwlCTFVFVE9PVEhfU0NPX0hFQURTRVQJCT0gMHgyMCwKKwlCTFVFVE9PVEhfU0NPX0NBUktJVAkJPSAweDQwLAorCUJMVUVUT09USF9BMkRQCQkJPSAweDgwLAorCUJMVUVUT09USF9BMkRQX0hFQURQSE9ORVMJPSAweDEwMCwKKwlCTFVFVE9PVEhfQTJEUF9TUEVBS0VSCQk9IDB4MjAwLAorCUFVWF9ESUdJVEFMCQkJPSAweDQwMCwKKwlBTkxHX0RPQ0tfSEVBRFNFVAkJPSAweDgwMCwKKwlER1RMX0RPQ0tfSEVBRFNFVAkJPSAweDEwMDAsCisJVVNCX0FDQ0VTU09SWQkJCT0gMHgyMDAwLAorCVVTQl9ERVZJQ0UJCQk9IDB4NDAwMCwKKwlSRU1PVEVfU1VCTUlYCQkJPSAweDgwMDAsCisJQU5DX0hFQURTRVQJCQk9IDB4MTAwMDAsCisJQU5DX0hFQURQSE9ORQkJCT0gMHgyMDAwMCwKKwlQUk9YWQkJCQk9IDB4MjAwMDAwMCwKKwlGTQkJCQk9IDB4MTAwMDAwLAorCUZNX1RYCQkJCT0gMHgxMDAwMDAwLAorCURFVklDRV9PVVRfREVGQVVMVAkJPSAweDQwMDAwMDAwLAorCURFVklDRV9PVVRfQUxMCQkJPSAweDQwM0ZGRkZGLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1kYXAtY29uZmlnLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRvbGJ5LWRhcC1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWExYjNkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1kYXAtY29uZmlnLmMKQEAgLTAsMCArMSwxMDcxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgorCisjaW5jbHVkZSAibXNtLWRvbGJ5LWRhcC1jb25maWcuaCIKKworLyogZG9sYnkgZW5kcCBiYXNlZCBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgZG9sYnlfZGFwX2VuZHBfcGFyYW1zX3MgeworCWludCBkZXZpY2U7CisJaW50IGRldmljZV9jaF9jYXBzOworCWludCBkYXBfZGV2aWNlOworCWludCBwYXJhbXNfaWRbRE9MQllfTlVNX0VORFBfREVQRU5ERU5UX1BBUkFNU107CisJaW50IHBhcmFtc19sZW5bRE9MQllfTlVNX0VORFBfREVQRU5ERU5UX1BBUkFNU107CisJaW50IHBhcmFtc19vZmZzZXRbRE9MQllfTlVNX0VORFBfREVQRU5ERU5UX1BBUkFNU107CisJaW50IHBhcmFtc192YWxbRE9MQllfRU5EREVQX1BBUkFNX0xFTkdUSF07Cit9OworCitjb25zdCBzdHJ1Y3QgZG9sYnlfZGFwX2VuZHBfcGFyYW1zX3MKKwkJCWRvbGJ5X2RhcF9lbmRwX3BhcmFtc1tOVU1fRE9MQllfRU5EUF9ERVZJQ0VdID0geworCXtFQVJQSUVDRSwgMiwgRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCisJCXtET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9WTUJ9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RILCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSH0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX09GRlNFVCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfT0ZGU0VUfSwKKwkJey0zMjAsIC0zMjAsIDE0NH0KKwl9LAorCXtTUEVBS0VSLCAyLCBET0xCWV9FTkRQX0lOVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe1dJUkVEX0hFQURTRVQsCTIsIERPTEJZX0VORFBfSEVBRFBIT05FUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe1dJUkVEX0hFQURQSE9ORSwgMiwgRE9MQllfRU5EUF9IRUFEUEhPTkVTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7QkxVRVRPT1RIX1NDTywJMiwgRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCisJCXtET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9WTUJ9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RILCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSH0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX09GRlNFVCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfT0ZGU0VUfSwKKwkJey0zMjAsIC0zMjAsIDE0NH0KKwl9LAorCXtCTFVFVE9PVEhfU0NPX0hFQURTRVQsCTIsIERPTEJZX0VORFBfRVhUX1NQRUFLRVJTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7QkxVRVRPT1RIX1NDT19DQVJLSVQsIDIsIERPTEJZX0VORFBfRVhUX1NQRUFLRVJTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7QkxVRVRPT1RIX0EyRFAsIDIsIERPTEJZX0VORFBfRVhUX1NQRUFLRVJTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7QkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywgMiwgRE9MQllfRU5EUF9IRUFEUEhPTkVTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7QkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwgMiwgRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCisJCXtET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9WTUJ9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RILCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSH0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX09GRlNFVCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfT0ZGU0VUfSwKKwkJey0zMjAsIC0zMjAsIDE0NH0KKwl9LAorCXtBVVhfRElHSVRBTCwgMiwgRE9MQllfRU5EUF9IRE1JLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstNDk2LCAtNDk2LCAwfQorCX0sCisJe0FVWF9ESUdJVEFMLCA2LCBET0xCWV9FTkRQX0hETUksCisJCXtET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9WTUJ9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RILCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSH0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX09GRlNFVCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfT0ZGU0VUfSwKKwkJey00OTYsIC00OTYsIDB9CisJfSwKKwl7QVVYX0RJR0lUQUwsIDgsIERPTEJZX0VORFBfSERNSSwKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTQ5NiwgLTQ5NiwgMH0KKwl9LAorCXtBTkxHX0RPQ0tfSEVBRFNFVCwgMiwgRE9MQllfRU5EUF9IRUFEUEhPTkVTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7REdUTF9ET0NLX0hFQURTRVQsIDIsIERPTEJZX0VORFBfSEVBRFBIT05FUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe1VTQl9BQ0NFU1NPUlksCTIsIERPTEJZX0VORFBfRVhUX1NQRUFLRVJTLAorCQl7RE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfVk1CfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RILAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9MRU5HVEh9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fT0ZGU0VULCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX09GRlNFVH0sCisJCXstMzIwLCAtMzIwLCAxNDR9CisJfSwKKwl7VVNCX0RFVklDRSwgMiwgRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCisJCXtET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9WTUJ9LAorCQl7RE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RILCBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgsCisJCSBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSH0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX09GRlNFVCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfT0ZGU0VUfSwKKwkJey0zMjAsIC0zMjAsIDE0NH0KKwl9LAorCXtSRU1PVEVfU1VCTUlYLAkyLCBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe1BST1hZLAkyLCBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe1BST1hZLAk2LCBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe0ZNLCAyLCBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCisJe0ZNX1RYLAkyLCBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUywKKwkJe0RPTEJZX1BBUkFNX0lEX0RWTE8sIERPTEJZX1BBUkFNX0lEX0RWTEksIERPTEJZX1BBUkFNX0lEX1ZNQn0sCisJCXtET0xCWV9FTkRERVBfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX0VORERFUF9QQVJBTV9EVkxJX0xFTkdUSCwKKwkJIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIfSwKKwkJe0RPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfT0ZGU0VULAorCQkgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVR9LAorCQl7LTMyMCwgLTMyMCwgMTQ0fQorCX0sCit9OworCisvKiBkb2xieSBwYXJhbSBpZHMgdG8vZnJvbSBkc3AgKi8KK3N0YXRpYyB1aW50MzJfdAlkb2xieV9kYXBfcGFyYW1zX2lkW0FMTF9ET0xCWV9QQVJBTVNdID0geworCURPTEJZX1BBUkFNX0lEX1ZESEUsIERPTEJZX1BBUkFNX0lEX1ZTUEUsIERPTEJZX1BBUkFNX0lEX0RTU0YsCisJRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMRSwKKwlET0xCWV9QQVJBTV9JRF9EVk1DLCBET0xCWV9QQVJBTV9JRF9EVk1FLCBET0xCWV9QQVJBTV9JRF9JRU5CLAorCURPTEJZX1BBUkFNX0lEX0lFQkYsIERPTEJZX1BBUkFNX0lEX0lFT04sIERPTEJZX1BBUkFNX0lEX0RFT04sCisJRE9MQllfUEFSQU1fSURfTkdPTiwgRE9MQllfUEFSQU1fSURfR0VPTiwgRE9MQllfUEFSQU1fSURfR0VOQiwKKwlET0xCWV9QQVJBTV9JRF9HRUJGLCBET0xCWV9QQVJBTV9JRF9BT05CLCBET0xCWV9QQVJBTV9JRF9BT0JGLAorCURPTEJZX1BBUkFNX0lEX0FPQkcsIERPTEJZX1BBUkFNX0lEX0FPT04sIERPTEJZX1BBUkFNX0lEX0FSTkIsCisJRE9MQllfUEFSQU1fSURfQVJCRiwgRE9MQllfUEFSQU1fSURfUExCLCAgRE9MQllfUEFSQU1fSURfUExNRCwKKwlET0xCWV9QQVJBTV9JRF9ESFNCLCBET0xCWV9QQVJBTV9JRF9ESFJHLCBET0xCWV9QQVJBTV9JRF9EU1NCLAorCURPTEJZX1BBUkFNX0lEX0RTU0EsIERPTEJZX1BBUkFNX0lEX0RWTEEsIERPTEJZX1BBUkFNX0lEX0lFQlQsCisJRE9MQllfUEFSQU1fSURfSUVBLCAgRE9MQllfUEFSQU1fSURfREVBLCAgRE9MQllfUEFSQU1fSURfREVELAorCURPTEJZX1BBUkFNX0lEX0dFQkcsIERPTEJZX1BBUkFNX0lEX0FPQ0MsIERPTEJZX1BBUkFNX0lEX0FSQkksCisJRE9MQllfUEFSQU1fSURfQVJCTCwgRE9MQllfUEFSQU1fSURfQVJCSCwgRE9MQllfUEFSQU1fSURfQVJPRCwKKwlET0xCWV9QQVJBTV9JRF9BUlRQLCBET0xCWV9QQVJBTV9JRF9WTU9OLCBET0xCWV9QQVJBTV9JRF9WTUIsCisJRE9MQllfUEFSQU1fSURfVkNOQiwgRE9MQllfUEFSQU1fSURfVkNCRiwgRE9MQllfUEFSQU1fSURfUFJFRywKKwlET0xCWV9QQVJBTV9JRF9WRU4sICBET0xCWV9QQVJBTV9JRF9QU1RHLCBET0xCWV9DT01NSVRfQUxMX1RPX0RTUCwKKwlET0xCWV9DT01NSVRfVE9fRFNQLCBET0xCWV9VU0VfQ0FDSEUsIERPTEJZX0FVVE9fRU5EUCwKKwlET0xCWV9BVVRPX0VORERFUF9QQVJBTVMKK307CisKKy8qIG1vZGlmZWQgc3RhdGU6CTB4MDAwMDAwMDAgLSBOb3QgdXBkYXRlZAorICoJCQk+IDB4MDAwMDAwMDAgJiYgPCAweDAwMDEwMDAwCisgKgkJCQlVcGRhdGVkIGFuZCBub3QgY29tbWl0dGVkIHRvIERTUAorICoJCQkweDAwMDEwMDAxIC0gVXBkYXRlZCBhbmQgY29tbWl0dGVkIHRvIERTUAorICoJCQk+IDB4MDAwMTAwMDEgLSBNb2RpZmllZCB0aGUgY29tbWl0dGVkIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgZG9sYnlfZGFwX3BhcmFtc19tb2RpZmllZFtNQVhfRE9MQllfUEFSQU1TXSA9IHsgMCB9OworLyogcGFyYW0gb2Zmc2V0ICovCitzdGF0aWMgdWludDMyX3QJZG9sYnlfZGFwX3BhcmFtc19vZmZzZXRbTUFYX0RPTEJZX1BBUkFNU10gPSB7CisJRE9MQllfUEFSQU1fVkRIRV9PRkZTRVQsIERPTEJZX1BBUkFNX1ZTUEVfT0ZGU0VULAorCURPTEJZX1BBUkFNX0RTU0ZfT0ZGU0VULCBET0xCWV9QQVJBTV9EVkxJX09GRlNFVCwKKwlET0xCWV9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfUEFSQU1fRFZMRV9PRkZTRVQsCisJRE9MQllfUEFSQU1fRFZNQ19PRkZTRVQsIERPTEJZX1BBUkFNX0RWTUVfT0ZGU0VULAorCURPTEJZX1BBUkFNX0lFTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9JRUJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9JRU9OX09GRlNFVCwgRE9MQllfUEFSQU1fREVPTl9PRkZTRVQsCisJRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQsIERPTEJZX1BBUkFNX0dFT05fT0ZGU0VULAorCURPTEJZX1BBUkFNX0dFTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9HRUJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9BT05CX09GRlNFVCwgRE9MQllfUEFSQU1fQU9CRl9PRkZTRVQsCisJRE9MQllfUEFSQU1fQU9CR19PRkZTRVQsIERPTEJZX1BBUkFNX0FPT05fT0ZGU0VULAorCURPTEJZX1BBUkFNX0FSTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9BUkJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QTEJfT0ZGU0VULCAgRE9MQllfUEFSQU1fUExNRF9PRkZTRVQsCisJRE9MQllfUEFSQU1fREhTQl9PRkZTRVQsIERPTEJZX1BBUkFNX0RIUkdfT0ZGU0VULAorCURPTEJZX1BBUkFNX0RTU0JfT0ZGU0VULCBET0xCWV9QQVJBTV9EU1NBX09GRlNFVCwKKwlET0xCWV9QQVJBTV9EVkxBX09GRlNFVCwgRE9MQllfUEFSQU1fSUVCVF9PRkZTRVQsCisJRE9MQllfUEFSQU1fSUVBX09GRlNFVCwgIERPTEJZX1BBUkFNX0RFQV9PRkZTRVQsCisJRE9MQllfUEFSQU1fREVEX09GRlNFVCwgIERPTEJZX1BBUkFNX0dFQkdfT0ZGU0VULAorCURPTEJZX1BBUkFNX0FPQ0NfT0ZGU0VULCBET0xCWV9QQVJBTV9BUkJJX09GRlNFVCwKKwlET0xCWV9QQVJBTV9BUkJMX09GRlNFVCwgRE9MQllfUEFSQU1fQVJCSF9PRkZTRVQsCisJRE9MQllfUEFSQU1fQVJPRF9PRkZTRVQsIERPTEJZX1BBUkFNX0FSVFBfT0ZGU0VULAorCURPTEJZX1BBUkFNX1ZNT05fT0ZGU0VULCBET0xCWV9QQVJBTV9WTUJfT0ZGU0VULAorCURPTEJZX1BBUkFNX1ZDTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9WQ0JGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QUkVHX09GRlNFVCwgRE9MQllfUEFSQU1fVkVOX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QU1RHX09GRlNFVAorfTsKKy8qIHBhcmFtX2xlbmd0aCAqLworc3RhdGljIHVpbnQzMl90CWRvbGJ5X2RhcF9wYXJhbXNfbGVuZ3RoW01BWF9ET0xCWV9QQVJBTVNdID0geworCURPTEJZX1BBUkFNX1ZESEVfTEVOR1RILCBET0xCWV9QQVJBTV9WU1BFX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9EU1NGX0xFTkdUSCwgRE9MQllfUEFSQU1fRFZMSV9MRU5HVEgsCisJRE9MQllfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX1BBUkFNX0RWTEVfTEVOR1RILAorCURPTEJZX1BBUkFNX0RWTUNfTEVOR1RILCBET0xCWV9QQVJBTV9EVk1FX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9JRU5CX0xFTkdUSCwgRE9MQllfUEFSQU1fSUVCRl9MRU5HVEgsCisJRE9MQllfUEFSQU1fSUVPTl9MRU5HVEgsIERPTEJZX1BBUkFNX0RFT05fTEVOR1RILAorCURPTEJZX1BBUkFNX05HT05fTEVOR1RILCBET0xCWV9QQVJBTV9HRU9OX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCwgRE9MQllfUEFSQU1fR0VCRl9MRU5HVEgsCisJRE9MQllfUEFSQU1fQU9OQl9MRU5HVEgsIERPTEJZX1BBUkFNX0FPQkZfTEVOR1RILAorCURPTEJZX1BBUkFNX0FPQkdfTEVOR1RILCBET0xCWV9QQVJBTV9BT09OX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9BUk5CX0xFTkdUSCwgRE9MQllfUEFSQU1fQVJCRl9MRU5HVEgsCisJRE9MQllfUEFSQU1fUExCX0xFTkdUSCwgIERPTEJZX1BBUkFNX1BMTURfTEVOR1RILAorCURPTEJZX1BBUkFNX0RIU0JfTEVOR1RILCBET0xCWV9QQVJBTV9ESFJHX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9EU1NCX0xFTkdUSCwgRE9MQllfUEFSQU1fRFNTQV9MRU5HVEgsCisJRE9MQllfUEFSQU1fRFZMQV9MRU5HVEgsIERPTEJZX1BBUkFNX0lFQlRfTEVOR1RILAorCURPTEJZX1BBUkFNX0lFQV9MRU5HVEgsICBET0xCWV9QQVJBTV9ERUFfTEVOR1RILAorCURPTEJZX1BBUkFNX0RFRF9MRU5HVEgsICBET0xCWV9QQVJBTV9HRUJHX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9BT0NDX0xFTkdUSCwgRE9MQllfUEFSQU1fQVJCSV9MRU5HVEgsCisJRE9MQllfUEFSQU1fQVJCTF9MRU5HVEgsIERPTEJZX1BBUkFNX0FSQkhfTEVOR1RILAorCURPTEJZX1BBUkFNX0FST0RfTEVOR1RILCBET0xCWV9QQVJBTV9BUlRQX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9WTU9OX0xFTkdUSCwgRE9MQllfUEFSQU1fVk1CX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9WQ05CX0xFTkdUSCwgRE9MQllfUEFSQU1fVkNCRl9MRU5HVEgsCisJRE9MQllfUEFSQU1fUFJFR19MRU5HVEgsIERPTEJZX1BBUkFNX1ZFTl9MRU5HVEgsCisJRE9MQllfUEFSQU1fUFNUR19MRU5HVEgKK307CisKKy8qIHBhcmFtX3ZhbHVlICovCitzdGF0aWMgdWludDMyX3QJZG9sYnlfZGFwX3BhcmFtc192YWx1ZVtUT1RBTF9MRU5HVEhfRE9MQllfUEFSQU1dID0gezB9OworCitzdHJ1Y3QgZG9sYnlfZGFwX3BhcmFtc19nZXRfcyB7CisJaW50MzJfdCAgcG9ydF9pZDsKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CisJdWludDMyX3QgcGFyYW1faWQ7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGxlbmd0aDsKK307CisKK3N0cnVjdCBkb2xieV9kYXBfcGFyYW1zX3N0YXRlc19zIHsKKwlib29sIHVzZV9jYWNoZTsKKwlib29sIGF1dG9fZW5kcDsKKwlib29sIGVuZGRlcF9wYXJhbXM7CisJaW50ICBwb3J0X2lkW0FGRV9NQVhfUE9SVFNdOworCWludCAgY29wcF9pZHhbQUZFX01BWF9QT1JUU107CisJaW50ICBwb3J0X29wZW5fY291bnQ7CisJaW50ICBwb3J0X2lkc19kb2xieV9jYW5fYmVfZW5hYmxlZDsKKwlpbnQgIGRldmljZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG9sYnlfZGFwX3BhcmFtc19nZXRfcyBkb2xieV9kYXBfcGFyYW1zX2dldCA9IHstMSwgREVWSUNFX09VVF9BTEwsCisJCQkJCQkJICAgICAwLCAwLCAwfTsKK3N0YXRpYyBzdHJ1Y3QgZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXNfcyBkb2xieV9kYXBfcGFyYW1zX3N0YXRlcyA9IHsgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCXRydWUsIHtET0xCWV9JTlZBTElEX1BPUlRfSUR9LAorCQkJCQkJey0xfSwgMCwgREVWSUNFX09VVF9BTEwsIDAgfTsKKy8qCisgKiBwb3J0X2lkc19kb2xieV9jYW5fYmVfZW5hYmxlZCBpcyBzZXQgdG8gMHg3RkZGRkZGRi4KKyAqIHRoaXMgbmVlZHMgdG8gYmUgcmVtb3ZlZCBhZnRlciBpbnRlcmZhY2UgdmFsaWRhdGlvbgorICovCisKK3N0YXRpYyBpbnQgbXNtX2RvbGJ5X2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2VuZHBvaW50KGludCBkZXZpY2UpCit7CisJaW50IGksIGRvbGJ5X2RhcF9kZXZpY2UgPSBET0xCWV9FTkRQX0VYVF9TUEVBS0VSUzsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRE9MQllfRU5EUF9ERVZJQ0U7IGkrKykgeworCQlpZiAoZG9sYnlfZGFwX2VuZHBfcGFyYW1zW2ldLmRldmljZSA9PSBkZXZpY2UpIHsKKwkJCWRvbGJ5X2RhcF9kZXZpY2UgPSBkb2xieV9kYXBfZW5kcF9wYXJhbXNbaV0uZGFwX2RldmljZTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGRlZmF1bHQgdGhlIGVuZHBvaW50IHRvIHNwZWFrZXIgaWYgY29ycmVzcG9uZGluZyBkZXZpY2UgZW50cnkgKi8KKwkvKiBub3QgZm91bmQgKi8KKwlpZiAoaSA+PSBOVU1fRE9MQllfRU5EUF9ERVZJQ0UpCisJCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSA9IFNQRUFLRVI7CisJcmV0dXJuIGRvbGJ5X2RhcF9kZXZpY2U7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RvbGJ5X2RhcF9zZW5kX2VuZF9wb2ludChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KQoreworCWludCByYyA9IDA7CisJY2hhciAqcGFyYW1zX3ZhbHVlOworCWludCAqdXBkYXRlX3BhcmFtc192YWx1ZTsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKERPTEJZX1BBUkFNX0lOVF9FTkRQX0xFTkdUSCArCisJCQkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqIHNpemVvZih1aW50MzJfdCk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKSB7CisJCXByX2VycigiJXMsIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdXBkYXRlX3BhcmFtc192YWx1ZSA9IChpbnQgKilwYXJhbXNfdmFsdWU7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX0JVTkRMRV9NT0RVTEVfSUQ7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX1BBUkFNX0lEX0lOSVRfRU5EUDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RIICogc2l6ZW9mKHVpbnQzMl90KTsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0KKwkJIG1zbV9kb2xieV9kYXBfbWFwX2RldmljZV90b19kb2xieV9lbmRwb2ludCgKKwkJCQkJCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSk7CisJcmMgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LCBwYXJhbXNfdmFsdWUsCisJCQkJICAgICAgIHBhcmFtc19sZW5ndGgpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBzZW5kIGRvbGJ5IHBhcmFtcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKwlrZnJlZShwYXJhbXNfdmFsdWUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fZG9sYnlfZGFwX3NlbmRfZW5kZGVwX3BhcmFtcyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCQkgICAgaW50IGRldmljZV9jaGFubmVscykKK3sKKwlpbnQgaSwgaiwgcmMgPSAwLCBpZHgsIG9mZnNldDsKKwljaGFyICpwYXJhbXNfdmFsdWU7CisJaW50ICp1cGRhdGVfcGFyYW1zX3ZhbHVlOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoRE9MQllfRU5EREVQX1BBUkFNX0xFTkdUSCArCisJCQkJCURPTEJZX05VTV9FTkRQX0RFUEVOREVOVF9QQVJBTVMgKgorCQkJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpICoKKwkJCQlzaXplb2YodWludDMyX3QpOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhcmFtc192YWx1ZSkgeworCQlwcl9lcnIoIiVzLCBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTlVNX0RPTEJZX0VORFBfREVWSUNFOyBpZHgrKykgeworCQlpZiAoZG9sYnlfZGFwX2VuZHBfcGFyYW1zW2lkeF0uZGV2aWNlID09CisJCQlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UpIHsKKwkJCWlmIChkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UgPT0gQVVYX0RJR0lUQUwgfHwKKwkJCSAgICBkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UgPT0gUFJPWFkpIHsKKwkJCQlpZiAoZG9sYnlfZGFwX2VuZHBfcGFyYW1zW2lkeF0uZGV2aWNlX2NoX2NhcHMgPT0KKwkJCQkJZGV2aWNlX2NoYW5uZWxzKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKGlkeCA+PSBOVU1fRE9MQllfRU5EUF9ERVZJQ0UpIHsKKwkJcHJfZXJyKCIlczogZGV2aWNlIGlzIG5vdCBzZXQgYWNjb3JkaW5nbHlcbiIsIF9fZnVuY19fKTsKKwkJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBET0xCWV9FTkRERVBfUEFSQU1fTEVOR1RIOyBpKyspIHsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX0JVTkRMRV9NT0RVTEVfSUQ7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPQorCQkJCWRvbGJ5X2RhcF9lbmRwX3BhcmFtc1tpZHhdLnBhcmFtc19pZFtpXTsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9CisJCQlkb2xieV9kYXBfZW5kcF9wYXJhbXNbaWR4XS5wYXJhbXNfbGVuW2ldICoKKwkJCQlzaXplb2YodWludDMyX3QpOworCQlvZmZzZXQgPSBkb2xieV9kYXBfZW5kcF9wYXJhbXNbaWR4XS5wYXJhbXNfb2Zmc2V0W2ldOworCQlmb3IgKGogPSAwOyBqIDwgZG9sYnlfZGFwX2VuZHBfcGFyYW1zW2lkeF0ucGFyYW1zX2xlbltpXTsgaisrKQorCQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9CisJCQkJZG9sYnlfZGFwX2VuZHBfcGFyYW1zW2lkeF0ucGFyYW1zX3ZhbFtvZmZzZXQral07CisJfQorCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwgcGFyYW1zX3ZhbHVlLAorCQkJCSAgICAgICBwYXJhbXNfbGVuZ3RoKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogc2VuZCBkb2xieSBwYXJhbXMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RvbGJ5X2RhcF9zZW5kX2NhY2hlZF9wYXJhbXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkJICAgIGludCBjb21taXQpCit7CisJY2hhciAqcGFyYW1zX3ZhbHVlOworCWludCAqdXBkYXRlX3BhcmFtc192YWx1ZSwgcmMgPSAwOworCXVpbnQzMl90IGluZGV4X29mZnNldCwgaSwgajsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKFRPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArCisJCQkJTUFYX0RPTEJZX1BBUkFNUyAqIERPTEJZX1BBUkFNX1BBWUxPQURfU0laRSkgKgorCQkJCXNpemVvZih1aW50MzJfdCk7CisKKwlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCXBhcmFtc19sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE9MQllfUEFSQU1TOyBpKyspIHsKKwkJaWYgKChkb2xieV9kYXBfcGFyYW1zX21vZGlmaWVkW2ldID09IDApIHx8CisJCSAgICAoKGNvbW1pdCkgJiYKKwkJICAgICAoKGRvbGJ5X2RhcF9wYXJhbXNfbW9kaWZpZWRbaV0gJiAweDAwMDEwMDAwKSAmJgorCQkgICAgICgoZG9sYnlfZGFwX3BhcmFtc19tb2RpZmllZFtpXSAmIDB4MDAwMEZGRkYpIDw9IDEpKSkpCisJCQljb250aW51ZTsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX0JVTkRMRV9NT0RVTEVfSUQ7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkb2xieV9kYXBfcGFyYW1zX2lkW2ldOworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gZG9sYnlfZGFwX3BhcmFtc19sZW5ndGhbaV0gKgorCQkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwkJaW5kZXhfb2Zmc2V0ID0gZG9sYnlfZGFwX3BhcmFtc19vZmZzZXRbaV07CisJCWZvciAoaiA9IDA7IGogPCBkb2xieV9kYXBfcGFyYW1zX2xlbmd0aFtpXTsgaisrKSB7CisJCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0KKwkJCQkJZG9sYnlfZGFwX3BhcmFtc192YWx1ZVtpbmRleF9vZmZzZXQral07CisJCX0KKwkJcGFyYW1zX2xlbmd0aCArPSAoRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFICsKKwkJCQlkb2xieV9kYXBfcGFyYW1zX2xlbmd0aFtpXSkgKiBzaXplb2YodWludDMyX3QpOworCX0KKwlwcl9kZWJ1ZygiJXMsIHZhbGlkIHBhcmFtIGxlbmd0aDogJWQiLCBfX2Z1bmNfXywgcGFyYW1zX2xlbmd0aCk7CisJaWYgKHBhcmFtc19sZW5ndGgpIHsKKwkJcmMgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LCBwYXJhbXNfdmFsdWUsCisJCQkJCQlwYXJhbXNfbGVuZ3RoKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBzZW5kIGRvbGJ5IHBhcmFtcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RPTEJZX1BBUkFNUzsgaSsrKSB7CisJCQlpZiAoKGRvbGJ5X2RhcF9wYXJhbXNfbW9kaWZpZWRbaV0gPT0gMCkgfHwKKwkJCSAgICAoKGNvbW1pdCkgJiYKKwkJCSAgICAgKChkb2xieV9kYXBfcGFyYW1zX21vZGlmaWVkW2ldICYgMHgwMDAxMDAwMCkgJiYKKwkJCSAgICAgKChkb2xieV9kYXBfcGFyYW1zX21vZGlmaWVkW2ldICYgMHgwMDAwRkZGRikgPD0gMSkpCisJCQkgICAgKSkKKwkJCQljb250aW51ZTsKKwkJCWRvbGJ5X2RhcF9wYXJhbXNfbW9kaWZpZWRbaV0gPSAweDAwMDEwMDAxOworCQl9CisJfQorCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtc21fZG9sYnlfZGFwX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGNoYW5uZWxzLAorCQkgICAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX29uKQoreworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisKKwlpZiAoaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZHggJWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBpbmRleCwKKwkJCXBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKChwb3J0X2lkICE9IERPTEJZX0lOVkFMSURfUE9SVF9JRCkgJiYKKwkgICAgKHBvcnRfaWQgJiBkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5wb3J0X2lkc19kb2xieV9jYW5fYmVfZW5hYmxlZCkpIHsKKwkJZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMucG9ydF9pZFtpbmRleF0gPSBwb3J0X2lkOworCQlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5jb3BwX2lkeFtpbmRleF0gPSBjb3BwX2lkeDsKKwkJZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMucG9ydF9vcGVuX2NvdW50Kys7CisJCWlmIChkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5hdXRvX2VuZHApIHsKKwkJCXJldCA9IG1zbV9kb2xieV9kYXBfc2VuZF9lbmRfcG9pbnQocG9ydF9pZCwgY29wcF9pZHgpOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IGVyciBzZW5kaW5nIGVuZHBwb2ludFxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJaWYgKGRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLnVzZV9jYWNoZSkgeworCQkJcmV0ID0gbXNtX2RvbGJ5X2RhcF9zZW5kX2NhY2hlZF9wYXJhbXMocG9ydF9pZCwKKwkJCQkJCQkgICAgICAgY29wcF9pZHgsIDApOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IGVyciBzZW5kaW5nIGNhY2hlZCBwYXJhbXNcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWlmIChkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5lbmRkZXBfcGFyYW1zKSB7CisJCQltc21fZG9sYnlfZGFwX3NlbmRfZW5kZGVwX3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkJCQkgY2hhbm5lbHMpOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IGVyciBzZW5kaW5nIGVuZHAgZGVwZW5kZW50IHBhcmFtc1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJaWYgKGlzX2N1c3RvbV9zdGVyZW9fb24pCisJCQlkb2xieV9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYocG9ydF9pZCwgY29wcF9pZHgsCisJCQkJCQkJICBpc19jdXN0b21fc3RlcmVvX29uKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBtc21fZG9sYnlfZGFwX2RlaW5pdChpbnQgcG9ydF9pZCkKK3sKKwlpbnQgaW5kZXggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCisJaWYgKGluZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgaW5kZXgsCisJCQlwb3J0X2lkKTsKKwkJcmV0dXJuOworCX0KKwlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5wb3J0X29wZW5fY291bnQtLTsKKwlpZiAoKGRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLnBvcnRfaWRbaW5kZXhdID09IHBvcnRfaWQpICYmCisJCSghZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMucG9ydF9vcGVuX2NvdW50KSkgeworCQlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5wb3J0X2lkW2luZGV4XSA9IERPTEJZX0lOVkFMSURfUE9SVF9JRDsKKwkJZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMuY29wcF9pZHhbaW5kZXhdID0gLTE7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9kb2xieV9kYXBfc2V0X3ZzcGVfdmRoZShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCSAgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKK3sKKwljaGFyICpwYXJhbXNfdmFsdWU7CisJaW50ICp1cGRhdGVfcGFyYW1zX3ZhbHVlLCByYyA9IDA7CisJdWludDMyX3QgaW5kZXhfb2Zmc2V0LCBpLCBqOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsKKwkJCQkyICogRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqCisJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKKwkJcHJfZXJyKCIlczogTm90IGEgRG9sYnkgdG9wb2xvZ3kuIERvIG5vdCBzZXQgY3VzdG9tIHN0ZXJlbyBtaXhpbmdcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCXBhcmFtc19sZW5ndGggPSAwOworCS8qIGZvciBWREhFIGFuZCBWU1BFIERBUCBwYXJhbXMgYXQgaW5kZXggMCBhbmQgMSBpbiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX0JVTkRMRV9NT0RVTEVfSUQ7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkb2xieV9kYXBfcGFyYW1zX2lkW2ldOworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gZG9sYnlfZGFwX3BhcmFtc19sZW5ndGhbaV0gKgorCQkJCQlzaXplb2YodWludDMyX3QpOworCQlpbmRleF9vZmZzZXQgPSBkb2xieV9kYXBfcGFyYW1zX29mZnNldFtpXTsKKwkJZm9yIChqID0gMDsgaiA8IGRvbGJ5X2RhcF9wYXJhbXNfbGVuZ3RoW2ldOyBqKyspIHsKKwkJCWlmIChpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCisJCQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IDA7CisJCQllbHNlCisJCQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9CisJCQkJCWRvbGJ5X2RhcF9wYXJhbXNfdmFsdWVbaW5kZXhfb2Zmc2V0K2pdOworCQl9CisJCXBhcmFtc19sZW5ndGggKz0gKERPTEJZX1BBUkFNX1BBWUxPQURfU0laRSArCisJCQkJZG9sYnlfZGFwX3BhcmFtc19sZW5ndGhbaV0pICogc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisJcHJfZGVidWcoIiVzLCB2YWxpZCBwYXJhbSBsZW5ndGg6ICVkIiwgX19mdW5jX18sIHBhcmFtc19sZW5ndGgpOworCWlmIChwYXJhbXNfbGVuZ3RoKSB7CisJCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwgcGFyYW1zX3ZhbHVlLAorCQkJCQkgICAgICAgcGFyYW1zX2xlbmd0aCk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogc2VuZCB2ZGhlL3ZzcGUgcGFyYW1zIGZhaWxlZCB3aXRoIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlrZnJlZShwYXJhbXNfdmFsdWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRvbGJ5X2RhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCSAgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQoreworCWNoYXIgKnBhcmFtc192YWx1ZTsKKwlpbnQgKnVwZGF0ZV9wYXJhbXNfdmFsdWUsIHJjID0gMDsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKFRPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArCisJCQkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqCisJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNtX2RvbGJ5X2RhcF9zZXRfdnNwZV92ZGhlKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCSAgICBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOworCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXNfdmFsdWUpIHsKKwkJcHJfZXJyKCIlcywgcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCXBhcmFtc19sZW5ndGggPSAwOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9FTkFCTEVfQ1VTVE9NX1NURVJFTzsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gc2l6ZW9mKHVpbnQzMl90KTsKKwlpZiAoaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQorCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gMTsKKwllbHNlCisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSAwOworCXBhcmFtc19sZW5ndGggKz0gKERPTEJZX1BBUkFNX1BBWUxPQURfU0laRSArIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKwlwcl9kZWJ1ZygiJXMsIHZhbGlkIHBhcmFtIGxlbmd0aDogJWQiLCBfX2Z1bmNfXywgcGFyYW1zX2xlbmd0aCk7CisJaWYgKHBhcmFtc19sZW5ndGgpIHsKKwkJcmMgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LCBwYXJhbXNfdmFsdWUsCisJCQkJCSAgICAgICBwYXJhbXNfbGVuZ3RoKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGRzMSBjdXN0b20gc3RlcmVvIHBhcmFtIGZhaWxlZCB3aXRoIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlrZnJlZShwYXJhbXNfdmFsdWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZG9sYnlfZGFwX21hcF9kZXZpY2VfdG9fcG9ydF9pZChpbnQgZGV2aWNlKQoreworCWludCBwb3J0X2lkID0gU0xJTUJVU18wX1JYOworCisJZGV2aWNlID0gREVWSUNFX09VVF9BTEw7CisJLyp1cGRhdGUgdGhlIGRldmljZSB3aGVuIHNpbmdsZSBzdHJlYW0gdG8gbXVsdGlwbGUgZGV2aWNlIGlzIGhhbmRsZWQqLworCWlmIChkZXZpY2UgPT0gREVWSUNFX09VVF9BTEwpIHsKKwkJcG9ydF9pZCA9IFBSSU1BUllfSTJTX1JYIHwgU0xJTUJVU18wX1JYIHwgSERNSV9SWCB8CisJCQkJSU5UX0JUX1NDT19SWCB8IElOVF9GTV9SWCB8CisJCQkJUlRfUFJPWFlfUE9SVF8wMDFfUlggfAorCQkJCUFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYIHwKKwkJCQlNSTJTX1JYIHwgU0VDT05EQVJZX0kyU19SWCB8CisJCQkJU0xJTUJVU18xX1JYIHwgU0xJTUJVU180X1JYIHwgU0xJTUJVU18zX1JYIHwKKwkJCQlBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKKwl9IGVsc2UgeworCQkvKiB1cGRhdGUgcG9ydF9pZCBiYXNlZCBvbiB0aGUgZGV2aWNlICovCisJfQorCXJldHVybiBwb3J0X2lkOworfQorCitpbnQgbXNtX2RvbGJ5X2RhcF9wYXJhbV90b19zZXRfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qIG5vdCB1c2VkIHdoaWxlIHNldHRpbmcgdGhlIHBhcmFtZXRlcnMgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfcGFyYW1fdG9fc2V0X2NvbnRyb2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwLCBwb3J0X2lkLCBjb3BwX2lkeDsKKwl1aW50MzJfdCBpZHgsIGo7CisJdWludDMyX3QgZGV2aWNlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdWludDMyX3QgcGFyYW1faWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl1aW50MzJfdCBvZmZzZXQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKwl1aW50MzJfdCBsZW5ndGggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXTsKKworCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLnBvcnRfaWRzX2RvbGJ5X2Nhbl9iZV9lbmFibGVkID0KKwkJCQltc21fZG9sYnlfZGFwX21hcF9kZXZpY2VfdG9fcG9ydF9pZChkZXZpY2UpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgQUxMX0RPTEJZX1BBUkFNUzsgaWR4KyspIHsKKwkJLypwYXJhbWlkIGZyb20gdXNlciBzcGFjZSovCisJCWlmIChwYXJhbV9pZCA9PSBkb2xieV9kYXBfcGFyYW1zX2lkW2lkeF0pCisJCQlicmVhazsKKwl9CisJaWYgKGlkeCA+IEFMTF9ET0xCWV9QQVJBTVMtMSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGlkIDB4JXggdG8gc2V0XG4iLCBfX2Z1bmNfXywKKwkJCXBhcmFtX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN3aXRjaCAoaWR4KSB7CisJCWNhc2UgRE9MQllfQ09NTUlUX0FMTF9JRFg6IHsKKwkJCS8qIENPTUlJVCBBTEw6IFNlbmQgYWxsIHBhcmFtZXRlcnMgdG8gRFNQICovCisJCQlwcl9kZWJ1ZygiJXM6IENPTU1JVF9BTEwgcmVjdmRcbiIsIF9fZnVuY19fKTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgQUZFX01BWF9QT1JUUzsgaWR4KyspIHsKKwkJCQlwb3J0X2lkID0gZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMucG9ydF9pZFtpZHhdOworCQkJCWNvcHBfaWR4ID0KKwkJCQkJZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMuY29wcF9pZHhbaWR4XTsKKwkJCQlpZiAoKGNvcHBfaWR4ID4gMCkgJiYKKwkJCQkgICAgKGNvcHBfaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUKSAmJgorCQkJCSAgICAocG9ydF9pZCAhPSBET0xCWV9JTlZBTElEX1BPUlRfSUQpKQorCQkJCQlyYyB8PSBtc21fZG9sYnlfZGFwX3NlbmRfY2FjaGVkX3BhcmFtcygKKwkJCQkJCQkJICAgICAgcG9ydF9pZCwKKwkJCQkJCQkJICAgICAgY29wcF9pZHgsCisJCQkJCQkJCSAgICAgIDApOworCQkJfQorCQl9CisJCWJyZWFrOworCQljYXNlIERPTEJZX0NPTU1JVF9JRFg6IHsKKwkJCXByX2RlYnVnKCIlczogQ09NTUlUIHJlY3ZkXG4iLCBfX2Z1bmNfXyk7CisJCQkvKiBDT01NSVQ6IFNlbmQgb25seSBtb2RpZmllZCBwYXJhbWV0ZXJzIHRvIERTUCAqLworCQkJZm9yIChpZHggPSAwOyBpZHggPCBBRkVfTUFYX1BPUlRTOyBpZHgrKykgeworCQkJCXBvcnRfaWQgPSBkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5wb3J0X2lkW2lkeF07CisJCQkJY29wcF9pZHggPQorCQkJCQlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5jb3BwX2lkeFtpZHhdOworCQkJCWlmICgoY29wcF9pZHggPiAwKSAmJgorCQkJCSAgICAoY29wcF9pZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQpICYmCisJCQkJICAgIChwb3J0X2lkID09IERPTEJZX0lOVkFMSURfUE9SVF9JRCkpCisJCQkJCXJjIHw9IG1zbV9kb2xieV9kYXBfc2VuZF9jYWNoZWRfcGFyYW1zKAorCQkJCQkJCQkgICAgICBwb3J0X2lkLAorCQkJCQkJCQkgICAgICBjb3BwX2lkeCwKKwkJCQkJCQkJICAgICAgMSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRE9MQllfVVNFX0NBQ0hFX0lEWDogeworCQkJcHJfZGVidWcoIiVzOiBVU0UgQ0FDSEUgcmVjdmQgdmFsOiAlbGRcbiIsIF9fZnVuY19fLAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdKTsKKwkJCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLnVzZV9jYWNoZSA9CisJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF07CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRE9MQllfQVVUT19FTkRQX0lEWDogeworCQkJcHJfZGVidWcoIiVzOiBBVVRPX0VORFAgcmVjdmQgdmFsOiAlbGRcbiIsIF9fZnVuY19fLAorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzRdKTsKKwkJCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLmF1dG9fZW5kcCA9CisJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF07CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRE9MQllfQVVUT19FTkRERVBfSURYOiB7CisJCQlwcl9kZWJ1ZygiJXM6IFVTRV9FTkRERVBfUEFSQU1TIHJlY3ZkIHZhbDogJWxkXG4iLAorCQkJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7CisJCQlkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5lbmRkZXBfcGFyYW1zID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XTsKKwkJfQorCQlicmVhazsKKwkJZGVmYXVsdDogeworCQkJLyogY2FjaGUgdGhlIHBhcmFtZXRlcnMgKi8KKwkJCWRvbGJ5X2RhcF9wYXJhbXNfbW9kaWZpZWRbaWR4XSArPSAxOworCQkJZG9sYnlfZGFwX3BhcmFtc19sZW5ndGhbaWR4XSA9IGxlbmd0aDsKKwkJCXByX2RlYnVnKCIlczogcGFyYW0gcmVjdmQgZGV2aWNlSWQ9MHgleCBwYXJhbUlkPTB4JXggb2Zmc2V0PSVkIGxlbmd0aD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGV2aWNlLCBwYXJhbV9pZCwgb2Zmc2V0LCBsZW5ndGgpOworCQkJZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisJCQkJZG9sYnlfZGFwX3BhcmFtc192YWx1ZVsKKwkJCQkJZG9sYnlfZGFwX3BhcmFtc19vZmZzZXRbaWR4XSArCisJCQkJCW9mZnNldCArIGpdCisJCQkJPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0K2pdOworCQkJCXByX2RlYnVnKCJ2YWx1ZVslZF06ICVsZFxuIiwgaiwKKwkJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNCtqXSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBtc21fZG9sYnlfZGFwX3BhcmFtX3RvX2dldF9jb250cm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJjID0gMCwgaSwgaW5kZXg7CisJY2hhciAqcGFyYW1zX3ZhbHVlOworCWludCAqdXBkYXRlX3BhcmFtc192YWx1ZTsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gRE9MQllfTUFYX0xFTkdUSF9JTkRJVklEVUFMX1BBUkFNICoKKwkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwl1aW50MzJfdCBwYXJhbV9wYXlsb2FkX2xlbiA9CisJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUgKiBzaXplb2YodWludDMyX3QpOworCWludCBwb3J0X2lkID0gZG9sYnlfZGFwX3BhcmFtc19nZXQucG9ydF9pZCwgY29wcF9pZHg7CisKKwlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKKwkJcHJfZXJyKCIlcywgcG9ydF9pZCBub3Qgc2V0LCBkbyBub3QgcXVlcnkgQURNXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpbmRleCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgaW5kZXgsCisJCQlwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvcHBfaWR4ID0gZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMuY29wcF9pZHhbaW5kZXhdOworCWlmICgoY29wcF9pZHggPCAwKSB8fCAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9kZWJ1ZygiJXM6IGdldCBwYXJhbXMgY2FsbGVkIGJlZm9yZSBjb3BwIG9wZW4uY29wcF9pZHg6JWRcbiIsCisJCQkgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXNfdmFsdWUpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGRvbGJ5X2RhcF9wYXJhbXNfZ2V0LnBhcmFtX2lkID09IERPTEJZX1BBUkFNX0lEX1ZFUikgeworCQlyYyA9IGFkbV9nZXRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCSAgICBET0xCWV9CVU5ETEVfTU9EVUxFX0lELCBET0xCWV9QQVJBTV9JRF9WRVIsCisJCQkJICAgIHBhcmFtc19sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKKwkJCQkgICAgcGFyYW1zX3ZhbHVlKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RPTEJZX1BBUkFNUzsgaSsrKQorCQkJaWYgKGRvbGJ5X2RhcF9wYXJhbXNfaWRbaV0gPT0KKwkJCQlkb2xieV9kYXBfcGFyYW1zX2dldC5wYXJhbV9pZCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPiBNQVhfRE9MQllfUEFSQU1TLTEpIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gaWQgdG8gc2V0IiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJcGFyYW1zX2xlbmd0aCA9IChkb2xieV9kYXBfcGFyYW1zX2xlbmd0aFtpXSArCisJCQkJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpICoKKwkJCQkJCXNpemVvZih1aW50MzJfdCk7CisJCQlyYyA9IGFkbV9nZXRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkgICAgRE9MQllfQlVORExFX01PRFVMRV9JRCwKKwkJCQkJICAgIGRvbGJ5X2RhcF9wYXJhbXNfaWRbaV0sCisJCQkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkJCSAgICBwYXJhbXNfdmFsdWUpOworCQl9CisJfQorCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWQgcmM6JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gKGludCAqKXBhcmFtc192YWx1ZTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRvbGJ5X2RhcF9wYXJhbXNfZ2V0LmRldmljZV9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGRvbGJ5X2RhcF9wYXJhbXNfZ2V0LnBhcmFtX2lkOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0gZG9sYnlfZGFwX3BhcmFtc19nZXQub2Zmc2V0OworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gZG9sYnlfZGFwX3BhcmFtc19nZXQubGVuZ3RoOworCisJcHJfZGVidWcoIiVzOiBGUk9NIERTUCB2YWx1ZVswXSAweCV4IHZhbHVlWzFdICVkIHZhbHVlWzJdIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdXBkYXRlX3BhcmFtc192YWx1ZVswXSwKKwkJCXVwZGF0ZV9wYXJhbXNfdmFsdWVbMV0sIHVwZGF0ZV9wYXJhbXNfdmFsdWVbMl0pOworCWZvciAoaSA9IDA7IGkgPCBkb2xieV9kYXBfcGFyYW1zX2dldC5sZW5ndGg7IGkrKykgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUraV0gPQorCQkJdXBkYXRlX3BhcmFtc192YWx1ZVtpXTsKKwkJcHJfZGVidWcoInZhbHVlWyVkXTolZFxuIiwgaSwgdXBkYXRlX3BhcmFtc192YWx1ZVtpXSk7CisJfQorCXByX2RlYnVnKCIlczogUmV0dXJuaW5nIHBhcmFtX2lkPTB4JXggb2Zmc2V0PSVkIGxlbmd0aD0lZFxuIiwKKwkJCV9fZnVuY19fLCBkb2xieV9kYXBfcGFyYW1zX2dldC5wYXJhbV9pZCwKKwkJCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0Lm9mZnNldCwKKwkJCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0Lmxlbmd0aCk7CisJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfcGFyYW1fdG9fZ2V0X2NvbnRyb2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcG9ydF9pZCwgaWR4LCBjb3BwX2lkeDsKKworCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0LmRldmljZV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXBvcnRfaWQgPSBtc21fZG9sYnlfZGFwX21hcF9kZXZpY2VfdG9fcG9ydF9pZCgKKwkJCQkJCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0LmRldmljZV9pZCk7CisJZm9yIChpZHggPSAwOyBpZHggPCBBRkVfTUFYX1BPUlRTOyBpZHgrKykgeworCQlwb3J0X2lkID0gZG9sYnlfZGFwX3BhcmFtc19zdGF0ZXMucG9ydF9pZFtpZHhdOworCQljb3BwX2lkeCA9IGRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLmNvcHBfaWR4W2lkeF07CisJCWlmICgoY29wcF9pZHggPCAwKSB8fAorCQkgICAgKGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgfHwKKwkJICAgIChwb3J0X2lkID09IERPTEJZX0lOVkFMSURfUE9SVF9JRCkpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChpZHggPT0gQUZFX01BWF9QT1JUUykKKwkJcG9ydF9pZCA9IFNMSU1CVVNfMF9SWDsKKwlkb2xieV9kYXBfcGFyYW1zX2dldC5wb3J0X2lkID0gcG9ydF9pZDsKKwlkb2xieV9kYXBfcGFyYW1zX2dldC5wYXJhbV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0Lm9mZnNldCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCWRvbGJ5X2RhcF9wYXJhbXNfZ2V0Lmxlbmd0aCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOworCXByX2RlYnVnKCIlczogcGFyYW1faWQ9MHgleCBvZmZzZXQ9JWQgbGVuZ3RoPSVkXG4iLCBfX2Z1bmNfXywKKwkJZG9sYnlfZGFwX3BhcmFtc19nZXQucGFyYW1faWQsIGRvbGJ5X2RhcF9wYXJhbXNfZ2V0Lm9mZnNldCwKKwkJZG9sYnlfZGFwX3BhcmFtc19nZXQubGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfcGFyYW1fdmlzdWFsaXplcl9jb250cm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWludDMyX3QgbGVuZ3RoID0gZG9sYnlfZGFwX3BhcmFtc192YWx1ZVtET0xCWV9QQVJBTV9WQ05CX09GRlNFVF07CisJY2hhciAqdmlzdWFsaXplcl9kYXRhOworCWludCBpLCByYzsKKwlpbnQgKnVwZGF0ZV92aXN1YWxpemVyX2RhdGE7CisJdWludDMyX3Qgb2Zmc2V0LCBwYXJhbXNfbGVuZ3RoID0KKwkJKDIqbGVuZ3RoICsgRE9MQllfVklTX1BBUkFNX0hFQURFUl9TSVpFKSpzaXplb2YodWludDMyX3QpOworCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0KKwkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFICogc2l6ZW9mKHVpbnQzMl90KTsKKwlpbnQgcG9ydF9pZCwgY29wcF9pZHgsIGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQUZFX01BWF9QT1JUUzsgaWR4KyspIHsKKwkJcG9ydF9pZCA9IGRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLnBvcnRfaWRbaWR4XTsKKwkJY29wcF9pZHggPSBkb2xieV9kYXBfcGFyYW1zX3N0YXRlcy5jb3BwX2lkeFtpZHhdOworCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKKwkJICAgIChjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHx8CisJCSAgICAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpKQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlpZiAoaWR4ID09IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZGVidWcoIiVzLCBwb3J0X2lkIG5vdCBzZXQsIHJldHVybmluZyBlcnJvciIsIF9fZnVuY19fKTsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmlzdWFsaXplcl9kYXRhID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZpc3VhbGl6ZXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvZmZzZXQgPSAwOworCXBhcmFtc19sZW5ndGggPSBsZW5ndGggKiBzaXplb2YodWludDMyX3QpOworCXJjID0gYWRtX2dldF9wYXJhbXMocG9ydF9pZCwgY29wcF9pZHgsIERPTEJZX0JVTkRMRV9NT0RVTEVfSUQsCisJCQkgICAgRE9MQllfUEFSQU1fSURfVkNCRywKKwkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkgICAgdmlzdWFsaXplcl9kYXRhICsgb2Zmc2V0KTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogZ2V0IHBhcmFtZXRlcnMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKHZpc3VhbGl6ZXJfZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9mZnNldCA9IGxlbmd0aCAqIHNpemVvZih1aW50MzJfdCk7CisJcmMgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwgRE9MQllfQlVORExFX01PRFVMRV9JRCwKKwkJCSAgICBET0xCWV9QQVJBTV9JRF9WQ0JFLAorCQkJICAgIHBhcmFtc19sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKKwkJCSAgICB2aXN1YWxpemVyX2RhdGEgKyBvZmZzZXQpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJa2ZyZWUodmlzdWFsaXplcl9kYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyKmxlbmd0aDsKKwlwcl9kZWJ1ZygiJXM6IHZpc3VhbGl6ZXIgZGF0YSBsZW5ndGggJWxkXG4iLCBfX2Z1bmNfXywKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwl1cGRhdGVfdmlzdWFsaXplcl9kYXRhID0gKGludCAqKXZpc3VhbGl6ZXJfZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgMipsZW5ndGg7IGkrKykgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxK2ldID0gdXBkYXRlX3Zpc3VhbGl6ZXJfZGF0YVtpXTsKKwkJcHJfZGVidWcoInZhbHVlWyVkXSAlZFxuIiwgaSwgdXBkYXRlX3Zpc3VhbGl6ZXJfZGF0YVtpXSk7CisJfQorCWtmcmVlKHZpc3VhbGl6ZXJfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtc21fZG9sYnlfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qIG5vdCB1c2VkIHdoaWxlIGdldHRpbmcgdGhlIHZpc3VhbGl6ZXIgZGF0YSAqLworCXJldHVybiAwOworfQorCitpbnQgbXNtX2RvbGJ5X2RhcF9lbmRwb2ludF9jb250cm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogbm90IHVzZWQgd2hpbGUgc2V0dGluZyB0aGUgZW5kcG9pbnQgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfZW5kcG9pbnRfY29udHJvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBkZXZpY2UgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWRvbGJ5X2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSA9IGRldmljZTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfc2VjdXJpdHlfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qIG5vdCB1c2VkIHdoaWxlIHNldHRpbmcgdGhlIG1hbmZyIGlkKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfc2VjdXJpdHlfY29udHJvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBtYW51ZmFjdHVyZXJfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWNvcmVfc2V0X2RvbGJ5X21hbnVmYWN0dXJlcl9pZChtYW51ZmFjdHVyZXJfaWQpOworCXJldHVybiAwOworfQorCitpbnQgbXNtX2RvbGJ5X2RhcF9saWNlbnNlX2NvbnRyb2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCWNvcmVfZ2V0X2xpY2Vuc2Vfc3RhdHVzKERPTEJZX0RTMV9MSUNFTlNFX0lEKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kb2xieV9kYXBfbGljZW5zZV9jb250cm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlyZXR1cm4gY29yZV9zZXRfbGljZW5zZSh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKKwkJCQkJCURPTEJZX0RTMV9MSUNFTlNFX0lEKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRvbGJ5X2xpY2Vuc2VfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiRFMxIExpY2Vuc2UiLCBTTkRfU09DX05PUE0sIDAsCisJMHhGRkZGRkZGRiwgMCwgMSwgbXNtX2RvbGJ5X2RhcF9saWNlbnNlX2NvbnRyb2xfZ2V0LAorCW1zbV9kb2xieV9kYXBfbGljZW5zZV9jb250cm9sX3B1dCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZG9sYnlfc2VjdXJpdHlfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiRFMxIFNlY3VyaXR5IiwgU05EX1NPQ19OT1BNLCAwLAorCTB4RkZGRkZGRkYsIDAsIDEsIG1zbV9kb2xieV9kYXBfc2VjdXJpdHlfY29udHJvbF9nZXQsCisJbXNtX2RvbGJ5X2RhcF9zZWN1cml0eV9jb250cm9sX3B1dCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZG9sYnlfZGFwX3BhcmFtX3RvX3NldF9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEUzEgREFQIFNldCBQYXJhbSIsIFNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwKKwkwLCAxMjgsIG1zbV9kb2xieV9kYXBfcGFyYW1fdG9fc2V0X2NvbnRyb2xfZ2V0LAorCW1zbV9kb2xieV9kYXBfcGFyYW1fdG9fc2V0X2NvbnRyb2xfcHV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkb2xieV9kYXBfcGFyYW1fdG9fZ2V0X2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIkRTMSBEQVAgR2V0IFBhcmFtIiwgU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLAorCTAsIDEyOCwgbXNtX2RvbGJ5X2RhcF9wYXJhbV90b19nZXRfY29udHJvbF9nZXQsCisJbXNtX2RvbGJ5X2RhcF9wYXJhbV90b19nZXRfY29udHJvbF9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRvbGJ5X2RhcF9wYXJhbV92aXN1YWxpemVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIkRTMSBEQVAgR2V0IFZpc3VhbGl6ZXIiLCBTTkRfU09DX05PUE0sIDAsCisJMHhGRkZGRkZGRiwgMCwgNDEsIG1zbV9kb2xieV9kYXBfcGFyYW1fdmlzdWFsaXplcl9jb250cm9sX2dldCwKKwltc21fZG9sYnlfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbF9wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRvbGJ5X2RhcF9wYXJhbV9lbmRfcG9pbnRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiRFMxIERBUCBFbmRwb2ludCIsIFNORF9TT0NfTk9QTSwgMCwKKwkweEZGRkZGRkZGLCAwLCAxLCBtc21fZG9sYnlfZGFwX2VuZHBvaW50X2NvbnRyb2xfZ2V0LAorCW1zbV9kb2xieV9kYXBfZW5kcG9pbnRfY29udHJvbF9wdXQpLAorfTsKKwordm9pZCBtc21fZG9sYnlfZGFwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCisJCQkJZG9sYnlfbGljZW5zZV9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoZG9sYnlfbGljZW5zZV9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCisJCQkJZG9sYnlfc2VjdXJpdHlfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGRvbGJ5X3NlY3VyaXR5X2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKKwkJCQlkb2xieV9kYXBfcGFyYW1fdG9fc2V0X2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShkb2xieV9kYXBfcGFyYW1fdG9fc2V0X2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKKwkJCQlkb2xieV9kYXBfcGFyYW1fdG9fZ2V0X2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShkb2xieV9kYXBfcGFyYW1fdG9fZ2V0X2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKKwkJCQlkb2xieV9kYXBfcGFyYW1fdmlzdWFsaXplcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoZG9sYnlfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJCWRvbGJ5X2RhcF9wYXJhbV9lbmRfcG9pbnRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGRvbGJ5X2RhcF9wYXJhbV9lbmRfcG9pbnRfY29udHJvbHMpKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZG9sYnktZGFwLWNvbmZpZy5oIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1kYXAtY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2MzEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZG9sYnktZGFwLWNvbmZpZy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9NU01fRE9MQllfREFQX0NPTkZJR19IXworI2RlZmluZSBfTVNNX0RPTEJZX0RBUF9DT05GSUdfSF8KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgIm1zbS1kb2xieS1jb21tb24uaCIKKworI2lmZGVmIENPTkZJR19ET0xCWV9EQVAKKy8qIERPTEJZIERPTEJZIEdVSURTICovCisjZGVmaW5lIERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lECTB4MDAwMTAzM0IKKyNkZWZpbmUgTlVNX0RPTEJZX0VORFBfREVWSUNFICAgICAgICAgICAgICAgICAyMworCisjZGVmaW5lIERPTEJZX05VTV9FTkRQX0RFUEVOREVOVF9QQVJBTVMJICAzCisjZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVAkgIDAKKyNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RICSAgMQorI2RlZmluZSBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQgICAgKERPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCArIFwKKwkJCQkJCURPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCkKKyNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RIICAgIDEKKyNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVQgICAgIChET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQgKyBcCisJCQkJCQlET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgpCisjZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIICAgICAxCisjZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9MRU5HVEggICAgICAgICAoRE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RIICsgXAorCQlET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEggKyBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSCkKKworI2RlZmluZSBNQVhfRE9MQllfUEFSQU1TCQkJNDcKKyNkZWZpbmUgTUFYX0RPTEJZX0NUUkxfUEFSQU1TCQkJNQorI2RlZmluZSBBTExfRE9MQllfUEFSQU1TCQkJKE1BWF9ET0xCWV9QQVJBTVMgKyBcCisJCQkJCQkJTUFYX0RPTEJZX0NUUkxfUEFSQU1TKQorI2RlZmluZSBET0xCWV9DT01NSVRfQUxMX0lEWAkJCU1BWF9ET0xCWV9QQVJBTVMKKyNkZWZpbmUgRE9MQllfQ09NTUlUX0lEWAkJCShNQVhfRE9MQllfUEFSQU1TKzEpCisjZGVmaW5lIERPTEJZX1VTRV9DQUNIRV9JRFgJCQkoTUFYX0RPTEJZX1BBUkFNUysyKQorI2RlZmluZSBET0xCWV9BVVRPX0VORFBfSURYCQkJKE1BWF9ET0xCWV9QQVJBTVMrMykKKyNkZWZpbmUgRE9MQllfQVVUT19FTkRERVBfSURYCQkJKE1BWF9ET0xCWV9QQVJBTVMrNCkKKworLyogRE9MQlkgZGV2aWNlIGRlZmluaXRpb25zICovCitlbnVtIHsKKwlET0xCWV9FTkRQX0lOVF9TUEVBS0VSUyA9IDAsCisJRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCisJRE9MQllfRU5EUF9IRUFEUEhPTkVTLAorCURPTEJZX0VORFBfSERNSSwKKwlET0xCWV9FTkRQX1NQRElGLAorCURPTEJZX0VORFBfRExOQSwKKwlET0xCWV9FTkRQX0FOQUxPRywKK307CisKKy8qIERPTEJZIGRldmljZSBkZWZpbml0aW9ucyBlbmQgKi8KKworc3RydWN0IGRvbGJ5X2RhcF9wYXJhbXMgeworCXVpbnQzMl90IHZhbHVlW1RPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArIE1BWF9ET0xCWV9QQVJBTVNdOworfSBfX3BhY2tlZDsKKworaW50IG1zbV9kb2xieV9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCisJCSAgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pOwordm9pZCBtc21fZG9sYnlfZGFwX2RlaW5pdChpbnQgcG9ydF9pZCk7Cit2b2lkIG1zbV9kb2xieV9kYXBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSk7CitpbnQgZG9sYnlfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkJICAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOworLyogRG9sYnkgRE9MQlkgZW5kICovCisjZWxzZQoraW50IG1zbV9kb2xieV9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCisJCSAgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pCit7CisJcmV0dXJuIDA7Cit9Cit2b2lkIG1zbV9kb2xieV9kYXBfZGVpbml0KGludCBwb3J0X2lkKSB7IH0KK3ZvaWQgbXNtX2RvbGJ5X2RhcF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKSB7IH0KK2ludCBkb2xieV9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHMyLWRhcC1jb25maWcuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHMyLWRhcC1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVhNDljCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kczItZGFwLWNvbmZpZy5jCkBAIC0wLDAgKzEsMjI5OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWRtLXYyLmg+CisKKyNpbmNsdWRlICJtc20tZHMyLWRhcC1jb25maWcuaCIKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKKyNpbmNsdWRlIDxzb3VuZC9xNmNvcmUuaD4KKworCisjaWZkZWYgQ09ORklHX0RPTEJZX0RTMgorCisvKiByYW1wIHVwL2Rvd24gZm9yIDMwbXMgICAgKi8KKyNkZWZpbmUgRE9MQllfU09GVF9WT0xVTUVfUEVSSU9ECTQwCisvKiBTdGVwIHZhbHVlIDBtcyBvciAwdXMgKi8KKyNkZWZpbmUgRE9MQllfU09GVF9WT0xVTUVfU1RFUAkJMTAwMAorI2RlZmluZSBET0xCWV9BRERJVElPTkFMX1JBTVBfV0FJVAkxMAorI2RlZmluZSBTT0ZUX1ZPTFVNRV9QQVJBTV9TSVpFCQkzCisjZGVmaW5lIFBBUkFNX1BBWUxPQURfU0laRQkJMworCitlbnVtIHsKKwlET0xCWV9TT0ZUX1ZPTFVNRV9DVVJWRV9MSU5FQVIgPSAwLAorCURPTEJZX1NPRlRfVk9MVU1FX0NVUlZFX0VYUCwKKwlET0xCWV9TT0ZUX1ZPTFVNRV9DVVJWRV9MT0csCit9OworCisjZGVmaW5lIFZPTFVNRV9aRVJPX0dBSU4gICAgIDB4MAorI2RlZmluZSBWT0xVTUVfVU5JVFlfR0FJTiAgICAweDIwMDAKKy8qIFdhaXQgdGltZSBmb3IgbW9kdWxlIGVuYWJsZS9kaXNibGUgKi8KKyNkZWZpbmUgRE9MQllfTU9EVUxFX0VOQUJMRV9QRVJJT0QgICAgIDUwCisKKy8qIERPTEJZIGRldmljZSBkZWZpbml0aW9ucyBlbmQgKi8KK2VudW0geworCURPTEJZX09GRl9DQUNIRSA9IDAsCisJRE9MQllfU1BFQUtFUl9DQUNIRSwKKwlET0xCWV9IRUFEUEhPTkVfQ0FDSEUsCisJRE9MQllfSERNSV9DQUNIRSwKKwlET0xCWV9XRkRfQ0FDSEUsCisJRE9MQllfRk1fQ0FDSEUsCisJRE9MQllfTUFYX0NBQ0hFLAorfTsKKworZW51bSB7CisJREFQX1NPRlRfQllQQVNTID0gMCwKKwlEQVBfSEFSRF9CWVBBU1MsCit9OworCitlbnVtIHsKKwlNT0RVTEVfRElTQUJMRSA9IDAsCisJTU9EVUxFX0VOQUJMRSwKK307CisvKiBkb2xieSBwYXJhbSBpZHMgdG8vZnJvbSBkc3AgKi8KK3N0YXRpYyB1aW50MzJfdAlkczJfZGFwX3BhcmFtc19pZFtNQVhfRFMyX1BBUkFNU10gPSB7CisJRE9MQllfUEFSQU1fSURfVkRIRSwgRE9MQllfUEFSQU1fSURfVlNQRSwgRE9MQllfUEFSQU1fSURfRFNTRiwKKwlET0xCWV9QQVJBTV9JRF9EVkxJLCBET0xCWV9QQVJBTV9JRF9EVkxPLCBET0xCWV9QQVJBTV9JRF9EVkxFLAorCURPTEJZX1BBUkFNX0lEX0RWTUMsIERPTEJZX1BBUkFNX0lEX0RWTUUsIERPTEJZX1BBUkFNX0lEX0lFTkIsCisJRE9MQllfUEFSQU1fSURfSUVCRiwgRE9MQllfUEFSQU1fSURfSUVPTiwgRE9MQllfUEFSQU1fSURfREVPTiwKKwlET0xCWV9QQVJBTV9JRF9OR09OLCBET0xCWV9QQVJBTV9JRF9HRU9OLCBET0xCWV9QQVJBTV9JRF9HRU5CLAorCURPTEJZX1BBUkFNX0lEX0dFQkYsIERPTEJZX1BBUkFNX0lEX0FPTkIsIERPTEJZX1BBUkFNX0lEX0FPQkYsCisJRE9MQllfUEFSQU1fSURfQU9CRywgRE9MQllfUEFSQU1fSURfQU9PTiwgRE9MQllfUEFSQU1fSURfQVJOQiwKKwlET0xCWV9QQVJBTV9JRF9BUkJGLCBET0xCWV9QQVJBTV9JRF9QTEIsICBET0xCWV9QQVJBTV9JRF9QTE1ELAorCURPTEJZX1BBUkFNX0lEX0RIU0IsIERPTEJZX1BBUkFNX0lEX0RIUkcsIERPTEJZX1BBUkFNX0lEX0RTU0IsCisJRE9MQllfUEFSQU1fSURfRFNTQSwgRE9MQllfUEFSQU1fSURfRFZMQSwgRE9MQllfUEFSQU1fSURfSUVCVCwKKwlET0xCWV9QQVJBTV9JRF9JRUEsICBET0xCWV9QQVJBTV9JRF9ERUEsICBET0xCWV9QQVJBTV9JRF9ERUQsCisJRE9MQllfUEFSQU1fSURfR0VCRywgRE9MQllfUEFSQU1fSURfQU9DQywgRE9MQllfUEFSQU1fSURfQVJCSSwKKwlET0xCWV9QQVJBTV9JRF9BUkJMLCBET0xCWV9QQVJBTV9JRF9BUkJILCBET0xCWV9QQVJBTV9JRF9BUk9ELAorCURPTEJZX1BBUkFNX0lEX0FSVFAsIERPTEJZX1BBUkFNX0lEX1ZNT04sIERPTEJZX1BBUkFNX0lEX1ZNQiwKKwlET0xCWV9QQVJBTV9JRF9WQ05CLCBET0xCWV9QQVJBTV9JRF9WQ0JGLCBET0xCWV9QQVJBTV9JRF9QUkVHLAorCURPTEJZX1BBUkFNX0lEX1ZFTiwgIERPTEJZX1BBUkFNX0lEX1BTVEcsIERPTEJZX1BBUkFNX0lEX0lOSVRfRU5EUCwKK307CisKKy8qIG1vZGlmZWQgc3RhdGU6CTB4MDAwMDAwMDAgLSBOb3QgdXBkYXRlZAorICoJCQk+IDB4MDAwMDAwMDAgJiYgPCAweDAwMDEwMDAwCisgKgkJCQlVcGRhdGVkIGFuZCBub3QgY29tbWl0dGVkIHRvIERTUAorICoJCQkweDAwMDEwMDAxIC0gVXBkYXRlZCBhbmQgY29tbWl0dGVkIHRvIERTUAorICoJCQk+IDB4MDAwMTAwMDEgLSBNb2RpZmllZCB0aGUgY29tbWl0dGVkIHZhbHVlCisgKi8KKy8qIHBhcmFtIG9mZnNldCAqLworc3RhdGljIHVpbnQzMl90CWRzMl9kYXBfcGFyYW1zX29mZnNldFtNQVhfRFMyX1BBUkFNU10gPSB7CisJRE9MQllfUEFSQU1fVkRIRV9PRkZTRVQsIERPTEJZX1BBUkFNX1ZTUEVfT0ZGU0VULAorCURPTEJZX1BBUkFNX0RTU0ZfT0ZGU0VULCBET0xCWV9QQVJBTV9EVkxJX09GRlNFVCwKKwlET0xCWV9QQVJBTV9EVkxPX09GRlNFVCwgRE9MQllfUEFSQU1fRFZMRV9PRkZTRVQsCisJRE9MQllfUEFSQU1fRFZNQ19PRkZTRVQsIERPTEJZX1BBUkFNX0RWTUVfT0ZGU0VULAorCURPTEJZX1BBUkFNX0lFTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9JRUJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9JRU9OX09GRlNFVCwgRE9MQllfUEFSQU1fREVPTl9PRkZTRVQsCisJRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQsIERPTEJZX1BBUkFNX0dFT05fT0ZGU0VULAorCURPTEJZX1BBUkFNX0dFTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9HRUJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9BT05CX09GRlNFVCwgRE9MQllfUEFSQU1fQU9CRl9PRkZTRVQsCisJRE9MQllfUEFSQU1fQU9CR19PRkZTRVQsIERPTEJZX1BBUkFNX0FPT05fT0ZGU0VULAorCURPTEJZX1BBUkFNX0FSTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9BUkJGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QTEJfT0ZGU0VULCAgRE9MQllfUEFSQU1fUExNRF9PRkZTRVQsCisJRE9MQllfUEFSQU1fREhTQl9PRkZTRVQsIERPTEJZX1BBUkFNX0RIUkdfT0ZGU0VULAorCURPTEJZX1BBUkFNX0RTU0JfT0ZGU0VULCBET0xCWV9QQVJBTV9EU1NBX09GRlNFVCwKKwlET0xCWV9QQVJBTV9EVkxBX09GRlNFVCwgRE9MQllfUEFSQU1fSUVCVF9PRkZTRVQsCisJRE9MQllfUEFSQU1fSUVBX09GRlNFVCwgIERPTEJZX1BBUkFNX0RFQV9PRkZTRVQsCisJRE9MQllfUEFSQU1fREVEX09GRlNFVCwgIERPTEJZX1BBUkFNX0dFQkdfT0ZGU0VULAorCURPTEJZX1BBUkFNX0FPQ0NfT0ZGU0VULCBET0xCWV9QQVJBTV9BUkJJX09GRlNFVCwKKwlET0xCWV9QQVJBTV9BUkJMX09GRlNFVCwgRE9MQllfUEFSQU1fQVJCSF9PRkZTRVQsCisJRE9MQllfUEFSQU1fQVJPRF9PRkZTRVQsIERPTEJZX1BBUkFNX0FSVFBfT0ZGU0VULAorCURPTEJZX1BBUkFNX1ZNT05fT0ZGU0VULCBET0xCWV9QQVJBTV9WTUJfT0ZGU0VULAorCURPTEJZX1BBUkFNX1ZDTkJfT0ZGU0VULCBET0xCWV9QQVJBTV9WQ0JGX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QUkVHX09GRlNFVCwgRE9MQllfUEFSQU1fVkVOX09GRlNFVCwKKwlET0xCWV9QQVJBTV9QU1RHX09GRlNFVCwgRE9MQllfUEFSQU1fSU5UX0VORFBfT0ZGU0VULAorfTsKKy8qIHBhcmFtX2xlbmd0aCAqLworc3RhdGljIHVpbnQzMl90CWRzMl9kYXBfcGFyYW1zX2xlbmd0aFtNQVhfRFMyX1BBUkFNU10gPSB7CisJRE9MQllfUEFSQU1fVkRIRV9MRU5HVEgsIERPTEJZX1BBUkFNX1ZTUEVfTEVOR1RILAorCURPTEJZX1BBUkFNX0RTU0ZfTEVOR1RILCBET0xCWV9QQVJBTV9EVkxJX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9EVkxPX0xFTkdUSCwgRE9MQllfUEFSQU1fRFZMRV9MRU5HVEgsCisJRE9MQllfUEFSQU1fRFZNQ19MRU5HVEgsIERPTEJZX1BBUkFNX0RWTUVfTEVOR1RILAorCURPTEJZX1BBUkFNX0lFTkJfTEVOR1RILCBET0xCWV9QQVJBTV9JRUJGX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9JRU9OX0xFTkdUSCwgRE9MQllfUEFSQU1fREVPTl9MRU5HVEgsCisJRE9MQllfUEFSQU1fTkdPTl9MRU5HVEgsIERPTEJZX1BBUkFNX0dFT05fTEVOR1RILAorCURPTEJZX1BBUkFNX0dFTkJfTEVOR1RILCBET0xCWV9QQVJBTV9HRUJGX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9BT05CX0xFTkdUSCwgRE9MQllfUEFSQU1fQU9CRl9MRU5HVEgsCisJRE9MQllfUEFSQU1fQU9CR19MRU5HVEgsIERPTEJZX1BBUkFNX0FPT05fTEVOR1RILAorCURPTEJZX1BBUkFNX0FSTkJfTEVOR1RILCBET0xCWV9QQVJBTV9BUkJGX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9QTEJfTEVOR1RILCAgRE9MQllfUEFSQU1fUExNRF9MRU5HVEgsCisJRE9MQllfUEFSQU1fREhTQl9MRU5HVEgsIERPTEJZX1BBUkFNX0RIUkdfTEVOR1RILAorCURPTEJZX1BBUkFNX0RTU0JfTEVOR1RILCBET0xCWV9QQVJBTV9EU1NBX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9EVkxBX0xFTkdUSCwgRE9MQllfUEFSQU1fSUVCVF9MRU5HVEgsCisJRE9MQllfUEFSQU1fSUVBX0xFTkdUSCwgIERPTEJZX1BBUkFNX0RFQV9MRU5HVEgsCisJRE9MQllfUEFSQU1fREVEX0xFTkdUSCwgIERPTEJZX1BBUkFNX0dFQkdfTEVOR1RILAorCURPTEJZX1BBUkFNX0FPQ0NfTEVOR1RILCBET0xCWV9QQVJBTV9BUkJJX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9BUkJMX0xFTkdUSCwgRE9MQllfUEFSQU1fQVJCSF9MRU5HVEgsCisJRE9MQllfUEFSQU1fQVJPRF9MRU5HVEgsIERPTEJZX1BBUkFNX0FSVFBfTEVOR1RILAorCURPTEJZX1BBUkFNX1ZNT05fTEVOR1RILCBET0xCWV9QQVJBTV9WTUJfTEVOR1RILAorCURPTEJZX1BBUkFNX1ZDTkJfTEVOR1RILCBET0xCWV9QQVJBTV9WQ0JGX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9QUkVHX0xFTkdUSCwgRE9MQllfUEFSQU1fVkVOX0xFTkdUSCwKKwlET0xCWV9QQVJBTV9QU1RHX0xFTkdUSCwgRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RILAorfTsKKworc3RydWN0IGRzMl9kYXBfcGFyYW1zX3MgeworCWludDMyX3QgcGFyYW1zX3ZhbFtUT1RBTF9MRU5HVEhfRFMyX1BBUkFNXTsKKwlpbnQzMl90IGRhcF9wYXJhbXNfbW9kaWZpZWRbTUFYX0RTMl9QQVJBTVNdOworfTsKKworc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhIHsKKwljaGFyIGF1ZF9wcm9jX2RhdGFbQVVEX1BST0NfQkxPQ0tfU0laRV07CisJaW50MzJfdCAgYXVkX3Byb2Nfc2l6ZTsKKwljaGFyIGF1ZF92b2xfZGF0YVtBVURfVk9MX0JMT0NLX1NJWkVdOworCWludDMyX3QgYXVkX3ZvbF9zaXplOworfTsKKworc3RhdGljIHN0cnVjdCBkczJfZGFwX3BhcmFtc19zIGRzMl9kYXBfcGFyYW1zW0RPTEJZX01BWF9DQUNIRV07CisKK3N0cnVjdCBkczJfZGV2aWNlX21hcHBpbmcgeworCWludDMyX3QgZGV2aWNlX2lkOyAvKiBhdWRpb19vdXRfLi4uICovCisJaW50IHBvcnRfaWQ7IC8qIGFmZSBwb3J0LiBjb25zdGFudCBmb3IgYSB0YXJnZXQgdmFyaWFudC4gcm91dGluZy12MiovCisJLypPbmx5IG9uZSBEb2xieSBDT1BQICBmb3IgYSBzcGVjaWZpYyBwb3J0Ki8KKwlpbnQgY29wcF9pZHg7IC8qIGlkeCBmb3IgdGhlIGNvcHAgcG9ydCBvbiB3aGljaCBkczIgaXMgYWN0aXZlICovCisJaW50IGNhY2hlX2RldjsgLyogaWR4IHRvIGEgc2hhcmVkIHBhcmFtZXRlciBhcnJheSBkZXBlbmRlbnQgb24gZGV2aWNlKi8KKwl1aW50MzJfdCBzdHJlYW1fcmVmX2NvdW50OworCWJvb2wgYWN0aXZlOworCXZvaWQgKmNhbF9kYXRhOworfTsKKworc3RhdGljIHN0cnVjdCBkczJfZGV2aWNlX21hcHBpbmcgZGV2X21hcFtEUzJfREVWSUNFU19BTExdOworCitzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfc3RhdGVzX3MgeworCWJvb2wgdXNlX2NhY2hlOworCWJvb2wgZGFwX2J5cGFzczsKKwlib29sIGRhcF9ieXBhc3NfdHlwZTsKKwlib29sIG5vZGVfb3BlbmVkOworCWludDMyX3QgIGRldmljZTsKKwlib29sIGN1c3RvbV9zdGVyZW9fb25vZmY7Cit9OworCitzdGF0aWMgc3RydWN0IGRzMl9kYXBfcGFyYW1zX3N0YXRlc19zIGRzMl9kYXBfcGFyYW1zX3N0YXRlcyA9IHt0cnVlLCBmYWxzZSwKKwkJCQlmYWxzZSwgREVWSUNFX05PTkV9OworCitzdGF0aWMgaW50IGFsbF9zdXBwb3J0ZWRfZGV2aWNlcyA9IEVBUlBJRUNFfFNQRUFLRVJ8V0lSRURfSEVBRFNFVHwKKwkJCVdJUkVEX0hFQURQSE9ORXxCTFVFVE9PVEhfU0NPfEFVWF9ESUdJVEFMfAorCQkJQU5MR19ET0NLX0hFQURTRVR8REdUTF9ET0NLX0hFQURTRVR8CisJCQlSRU1PVEVfU1VCTUlYfEFOQ19IRUFEU0VUfEFOQ19IRUFEUEhPTkV8CisJCQlQUk9YWXxGTXxGTV9UWHxERVZJQ0VfTk9ORXwKKwkJCUJMVUVUT09USF9TQ09fSEVBRFNFVHxCTFVFVE9PVEhfU0NPX0NBUktJVDsKKworCitzdGF0aWMgdm9pZCBtc21fZHMyX2RhcF9jaGVja19hbmRfdXBkYXRlX3JhbXBfd2FpdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCQkJICAgaW50ICpyYW1wX3dhaXQpCit7CisKKwlpbnQzMl90ICp1cGRhdGVfcGFyYW1zX3ZhbHVlID0gTlVMTDsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gU09GVF9WT0xVTUVfUEFSQU1fU0laRSAqIHNpemVvZih1aW50MzJfdCk7CisJdWludDMyX3QgcGFyYW1fcGF5bG9hZF9sZW4gPSBQQVJBTV9QQVlMT0FEX1NJWkUgKiBzaXplb2YodWludDMyX3QpOworCWludCByYyA9IDA7CisKKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVwZGF0ZV9wYXJhbXNfdmFsdWUpCisJCWdvdG8gZW5kOworCisJcmMgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCSAgICBBVURQUk9DX01PRFVMRV9JRF9WT0xfQ1RSTCwKKwkJCSAgICBBVURQUk9DX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVRFUlMsCisJCQkgICAgcGFyYW1zX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAorCQkJICAgIChjaGFyICopIHVwZGF0ZV9wYXJhbXNfdmFsdWUpOworCWlmIChyYyA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogcGFyYW1zX3ZhbHVlIFsweCV4LCAweCV4LCAweCV4XVxuIiwKKwkJCV9fZnVuY19fLCB1cGRhdGVfcGFyYW1zX3ZhbHVlWzBdLAorCQkJdXBkYXRlX3BhcmFtc192YWx1ZVsxXSwKKwkJCXVwZGF0ZV9wYXJhbXNfdmFsdWVbMl0pOworCQkqcmFtcF93YWl0ID0gdXBkYXRlX3BhcmFtc192YWx1ZVswXTsKKwl9CitlbmQ6CisJa2ZyZWUodXBkYXRlX3BhcmFtc192YWx1ZSk7CisJLyoKKwkgKiBObyBlcnJvciByZXR1cm5lZCBhcyB3ZSBkbyBub3QgbmVlZCB0byBlcnJvciBvdXQgZnJvbSBkYXAgb24vZGFwCisJICogYnlwYXNzLiBUaGUgZGVmYXVsdCByYW1wIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgdG8gd2FpdCBkdXJpbmcKKwkgKiByYW1wIGRvd24uCisJICovCit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2V0X3ZzcGVfdmRoZShpbnQgZGV2X21hcF9pZHgsCisJCQkJICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKK3sKKwlpbnQzMl90ICp1cGRhdGVfcGFyYW1zX3ZhbHVlID0gTlVMTDsKKwlpbnQzMl90ICpwYXJhbV92YWwgPSBOVUxMOworCWludCBpZHgsIGksIGosIHJjID0gMCwgY2RldjsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKFRPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArCisJCQkJMiAqIERPTEJZX1BBUkFNX1BBWUxPQURfU0laRSkgKgorCQkJCXNpemVvZih1aW50MzJfdCk7CisKKwlpZiAoZGV2X21hcF9pZHggPCAwIHx8IGRldl9tYXBfaWR4ID49IERTMl9ERVZJQ0VTX0FMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRldiBtYXAgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgPT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmICgoZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHggPCAwKSB8fAorCQkoZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfaWR4XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkICE9IFNMSU1CVVNfMF9SWCkgJiYKKwkgICAgIChkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkICE9IFJUX1BST1hZX1BPUlRfMDAxX1JYKSkgeworCQlwcl9kZWJ1ZygiJXM6Tm8gQ3VzdG9tIHN0ZXJlbyBmb3IgcG9ydDoweCV4XG4iLAorCQkJIF9fZnVuY19fLCBkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkKTsKKwkJZ290byBlbmQ7CisJfQorCisJdXBkYXRlX3BhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cGRhdGVfcGFyYW1zX3ZhbHVlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCXBhcmFtc19sZW5ndGggPSAwOworCXBhcmFtX3ZhbCA9IHVwZGF0ZV9wYXJhbXNfdmFsdWU7CisJY2RldiA9IGRldl9tYXBbZGV2X21hcF9pZHhdLmNhY2hlX2RldjsKKwkvKiBmb3IgVkRIRSBhbmQgVlNQRSBEQVAgcGFyYW1zIGF0IGluZGV4IDAgYW5kIDEgaW4gdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gZHMyX2RhcF9wYXJhbXNfaWRbaV07CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkczJfZGFwX3BhcmFtc19sZW5ndGhbaV0gKgorCQkJCQlzaXplb2YodWludDMyX3QpOworCQlpZHggPSBkczJfZGFwX3BhcmFtc19vZmZzZXRbaV07CisJCWZvciAoaiA9IDA7IGogPCBkczJfZGFwX3BhcmFtc19sZW5ndGhbaV07IGorKykgeworCQkJaWYgKGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKKwkJCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gMDsKKwkJCWVsc2UKKwkJCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0KKwkJCQkJZHMyX2RhcF9wYXJhbXNbY2Rldl0ucGFyYW1zX3ZhbFtpZHgral07CisJCX0KKwkJcGFyYW1zX2xlbmd0aCArPSAoRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFICsKKwkJCQkgIGRzMl9kYXBfcGFyYW1zX2xlbmd0aFtpXSkgKgorCQkJCSAgc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHZhbGlkIHBhcmFtIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoKTsKKwlpZiAocGFyYW1zX2xlbmd0aCkgeworCQlyYyA9IGFkbV9kb2xieV9kYXBfc2VuZF9wYXJhbXMoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKKwkJCQkJICAgICAgIGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LAorCQkJCQkgICAgICAgKGNoYXIgKilwYXJhbV92YWwsCisJCQkJCSAgICAgICBwYXJhbXNfbGVuZ3RoKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBzZW5kIHZkaGUvdnNwZSBwYXJhbXMgZmFpbGVkIHdpdGggcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorZW5kOgorCWtmcmVlKHBhcmFtX3ZhbCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcXRpX3NldF9jdXN0b21fc3RlcmVvX29uKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19vbikKK3sKKworCXVpbnQxNl90IG9wX0ZMX2lwX0ZMX3dlaWdodDsKKwl1aW50MTZfdCBvcF9GTF9pcF9GUl93ZWlnaHQ7CisJdWludDE2X3Qgb3BfRlJfaXBfRkxfd2VpZ2h0OworCXVpbnQxNl90IG9wX0ZSX2lwX0ZSX3dlaWdodDsKKworCWludDMyX3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUzMiA9IE5VTEwsIHJjID0gMDsKKwlpbnQzMl90ICpwYXJhbV92YWwgPSBOVUxMOworCWludDE2X3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNiA9IDA7CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aF9ieXRlcyA9IENVU1RPTV9TVEVSRU9fUEFZTE9BRF9TSVpFICoKKwkJCQkgICAgICAgc2l6ZW9mKHVpbnQzMl90KTsKKwl1aW50MzJfdCBhdmFpbF9sZW5ndGggPSBwYXJhbXNfbGVuZ3RoX2J5dGVzOworCisJaWYgKChwb3J0X2lkICE9IFNMSU1CVVNfMF9SWCkgJiYKKwkgICAgIChwb3J0X2lkICE9IFJUX1BST1hZX1BPUlRfMDAxX1JYKSkgeworCQlwcl9kZWJ1ZygiJXM6Tm8gQ3VzdG9tIHN0ZXJlbyBmb3IgcG9ydDoweCV4XG4iLAorCQkJIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJZ290byBza2lwX3NlbmRfY21kOworCX0KKworCXByX2RlYnVnKCIlczogcG9ydCAweCV4LCBjb3BwX2lkeCAlZCwgaXNfY3VzdG9tX3N0ZXJlb19vbiAlZFxuIiwKKwkJIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgaXNfY3VzdG9tX3N0ZXJlb19vbik7CisJaWYgKGlzX2N1c3RvbV9zdGVyZW9fb24pIHsKKwkJb3BfRkxfaXBfRkxfd2VpZ2h0ID0KKwkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKKwkJb3BfRkxfaXBfRlJfd2VpZ2h0ID0KKwkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKKwkJb3BfRlJfaXBfRkxfd2VpZ2h0ID0KKwkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKKwkJb3BfRlJfaXBfRlJfd2VpZ2h0ID0KKwkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKKwl9IGVsc2UgeworCQlvcF9GTF9pcF9GTF93ZWlnaHQgPSBRMTRfR0FJTl9VTklUWTsKKwkJb3BfRkxfaXBfRlJfd2VpZ2h0ID0gMDsKKwkJb3BfRlJfaXBfRkxfd2VpZ2h0ID0gMDsKKwkJb3BfRlJfaXBfRlJfd2VpZ2h0ID0gUTE0X0dBSU5fVU5JVFk7CisJfQorCisJdXBkYXRlX3BhcmFtc192YWx1ZTMyID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoX2J5dGVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVwZGF0ZV9wYXJhbXNfdmFsdWUzMikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gc2tpcF9zZW5kX2NtZDsKKwl9CisJcGFyYW1fdmFsID0gdXBkYXRlX3BhcmFtc192YWx1ZTMyOworCWlmIChhdmFpbF9sZW5ndGggPCAyICogc2l6ZW9mKHVpbnQzMl90KSkKKwkJZ290byBza2lwX3NlbmRfY21kOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMzIrKyA9IE1UTVhfTU9EVUxFX0lEX0RFRkFVTFRfQ0hNSVhFUjsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTMyKysgPSBERUZBVUxUX0NITUlYRVJfUEFSQU1fSURfQ09FRkY7CisJYXZhaWxfbGVuZ3RoID0gYXZhaWxfbGVuZ3RoIC0gKDIgKiBzaXplb2YodWludDMyX3QpKTsKKworCXVwZGF0ZV9wYXJhbXNfdmFsdWUxNiA9IChpbnQxNl90ICopdXBkYXRlX3BhcmFtc192YWx1ZTMyOworCWlmIChhdmFpbF9sZW5ndGggPCAxMCAqIHNpemVvZih1aW50MTZfdCkpCisJCWdvdG8gc2tpcF9zZW5kX2NtZDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBDVVNUT01fU1RFUkVPX0NNRF9QQVJBTV9TSVpFOworCS8qIGZvciBhbGlnbm1lbnQgb25seSovCisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gMDsKKwkvKiBpbmRleCBpcyAzMi1iaXQgcGFyYW0gaW4gbGl0dGxlIGVuZGlhbiovCisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19JTkRFWF9QQVJBTTsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSAwOworCS8qIGZvciBzdGVyZW8gbWl4aW5nIG51bSBvdXQgY2gqLworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fTlVNX09VVF9DSDsKKwkvKiBmb3Igc3RlcmVvIG1peGluZyBudW0gaW4gY2gqLworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fTlVNX0lOX0NIOworCisJLyogT3V0IGNoIG1hcCBGTC9GUiovCisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRkw7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRlI7CisKKwkvKiBJbiBjaCBtYXAgRkwvRlIqLworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IFBDTV9DSEFOTkVMX0ZMOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IFBDTV9DSEFOTkVMX0ZSOworCWF2YWlsX2xlbmd0aCA9IGF2YWlsX2xlbmd0aCAtICgxMCAqIHNpemVvZih1aW50MTZfdCkpOworCS8qIHdlaWdodGluZyBjb2VmZmljaWVudHMgYXMgbmFtZSBzdWdnZXN0cywKKwkgKiBtaXhpbmcgd2lsbCBiZSBkb25lIGFjY29yZGluZyB0byB0aGVzZSBjb2VmZmljaWVudHMKKwkgKi8KKwlpZiAoYXZhaWxfbGVuZ3RoIDwgNCAqIHNpemVvZih1aW50MTZfdCkpCisJCWdvdG8gc2tpcF9zZW5kX2NtZDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBvcF9GTF9pcF9GTF93ZWlnaHQ7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gb3BfRkxfaXBfRlJfd2VpZ2h0OworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZSX2lwX0ZMX3dlaWdodDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBvcF9GUl9pcF9GUl93ZWlnaHQ7CisJYXZhaWxfbGVuZ3RoID0gYXZhaWxfbGVuZ3RoIC0gKDQgKiBzaXplb2YodWludDE2X3QpKTsKKwlpZiAocGFyYW1zX2xlbmd0aF9ieXRlcyAhPSAwKSB7CisJCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkoY2hhciAqKXBhcmFtX3ZhbCwKKwkJCQlwYXJhbXNfbGVuZ3RoX2J5dGVzKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBzZW5kIHBhcmFtcyBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIHNraXBfc2VuZF9jbWQ7CisJCX0KKwl9CisJa2ZyZWUocGFyYW1fdmFsKTsKKwlyZXR1cm4gMDsKK3NraXBfc2VuZF9jbWQ6CisJCXByX2VycigiJXM6IGluc3VmZmljaWVudCBtZW1vcnksIHNlbmQgY21kIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJa2ZyZWUocGFyYW1fdmFsKTsKKwkJcmV0dXJuIHJjOworfQorc3RhdGljIGludCBkYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IGRldl9tYXBfaWR4LAorCQkJCQlib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKK3sKKworCWludDMyX3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBOVUxMLCByYyA9IDA7CisJaW50MzJfdCAqcGFyYW1fdmFsID0gTlVMTDsKKwl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoX2J5dGVzID0gKFRPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArCisJCQkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqIHNpemVvZih1aW50MzJfdCk7CisJaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkICE9IFNMSU1CVVNfMF9SWCkgJiYKKwkgICAgIChkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkICE9IFJUX1BST1hZX1BPUlRfMDAxX1JYKSkgeworCQlwcl9kZWJ1ZygiJXM6Tm8gQ3VzdG9tIHN0ZXJlbyBmb3IgcG9ydDoweCV4XG4iLAorCQkJIF9fZnVuY19fLCBkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA8IDApIHx8CisJCShkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogREFQIGN1c3RvbSBzdGVyZW8gKi8KKwltc21fZHMyX2RhcF9zZXRfdnNwZV92ZGhlKGRldl9tYXBfaWR4LAorCQkJCSAgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKTsKKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoX2J5dGVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVwZGF0ZV9wYXJhbXNfdmFsdWUpIHsKKwkJcHJfZXJyKCIlczogcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisJcGFyYW1zX2xlbmd0aF9ieXRlcyA9IDA7CisJcGFyYW1fdmFsID0gdXBkYXRlX3BhcmFtc192YWx1ZTsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gRE9MQllfQlVORExFX01PRFVMRV9JRDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gRE9MQllfRU5BQkxFX0NVU1RPTV9TVEVSRU87CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IHNpemVvZih1aW50MzJfdCk7CisJaWYgKGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IDE7CisJZWxzZQorCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gMDsKKwlwYXJhbXNfbGVuZ3RoX2J5dGVzICs9IChET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUgKyAxKSAqCisJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwlwcl9kZWJ1ZygiJXM6IHZhbGlkIHBhcmFtIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoX2J5dGVzKTsKKwlpZiAocGFyYW1zX2xlbmd0aF9ieXRlcykgeworCQlyYyA9IGFkbV9kb2xieV9kYXBfc2VuZF9wYXJhbXMoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKKwkJCQkJICAgICAgIGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LAorCQkJCQkgICAgICAgKGNoYXIgKilwYXJhbV92YWwsCisJCQkJCSAgICAgICBwYXJhbXNfbGVuZ3RoX2J5dGVzKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBjdXN0b20gc3RlcmVvIHBhcmFtIGZhaWxlZCB3aXRoIHJjPSVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KK2VuZDoKKwlrZnJlZShwYXJhbV92YWwpOworCXJldHVybiByYzsKKworfQorCisKK3N0YXRpYyBpbnQgc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IGRldl9tYXBfaWR4LAorCQkJCQlib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKK3sKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzOiBtYXAgaW5kZXggJWQsIGN1c3RvbSBzdGVyZW8gJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCwKKwkJIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCk7CisKKwlpZiAoZGV2X21hcF9pZHggPCAwIHx8IGRldl9tYXBfaWR4ID49IERTMl9ERVZJQ0VTX0FMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRldiBtYXAgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgPT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgcG9ydCBpZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmICgoZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHggPCAwKSB8fAorCQkoZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNvcHAgaWR4XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID09IHRydWUgJiYKKwkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PSBEQVBfSEFSRF9CWVBBU1MpIHsKKworCQlyYyA9IHF0aV9zZXRfY3VzdG9tX3N0ZXJlb19vbihkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAorCQkJCQkgICAgICBkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKKwkJCQkJICAgICAgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczpxdGlfc2V0X2N1c3RvbV9zdGVyZW9fb25fY29wcCBmYWlsZWQgQy5TICVkIiwKKwkJCQlfX2Z1bmNfXywgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKTsKKwkJfQorCQlnb3RvIGVuZDsKKworCX0KKworCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9PSBmYWxzZSkgeworCQlyYyA9IGRhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihkZXZfbWFwX2lkeCwKKwkJCQkJCSBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOnF0aV9zZXRfY3VzdG9tX3N0ZXJlb19vbl9jb3BwIGZhaWxlZCBDLlMgJWQiLAorCQkJCV9fZnVuY19fLCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOworCQl9CisJCWdvdG8gZW5kOworCX0KK2VuZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfYWxsb2NfYW5kX3N0b3JlX2NhbF9kYXRhKGludCBkZXZfbWFwX2lkeCwgaW50IHBhdGgsCisJCQkJCSAgICBpbnQgcGVyZl9tb2RlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhICphdWRfY2FsX2RhdGE7CisKKwlwcl9kZWJ1ZygiJXM6IHBhdGggJWQsIHBlcmZfbW9kZSAlZCwgZGV2X21hcF9pZHggJWRcbiIsCisJCV9fZnVuY19fLCBwYXRoLCBwZXJmX21vZGUsIGRldl9tYXBfaWR4KTsKKworCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlhdWRfY2FsX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fcnhfY2FsX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF1ZF9jYWxfZGF0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCXJjID0gYWRtX3N0b3JlX2NhbF9kYXRhKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQsCisJCQkJZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHgsIHBhdGgsIHBlcmZfbW9kZSwKKwkJCQlBRE1fQVVEUFJPQ19DQUwsIGF1ZF9jYWxfZGF0YS0+YXVkX3Byb2NfZGF0YSwKKwkJCQkmYXVkX2NhbF9kYXRhLT5hdWRfcHJvY19zaXplKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHN0b3JlIGNhbCBkYXRhIGVyciAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJa2ZyZWUoYXVkX2NhbF9kYXRhKTsKKwkJZ290byBlbmQ7CisJfQorCisJcmMgPSBhZG1fc3RvcmVfY2FsX2RhdGEoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKKwkJCQlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwgcGF0aCwgcGVyZl9tb2RlLAorCQkJCUFETV9BVURWT0xfQ0FMLCBhdWRfY2FsX2RhdGEtPmF1ZF92b2xfZGF0YSwKKwkJCQkmYXVkX2NhbF9kYXRhLT5hdWRfdm9sX3NpemUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogc3RvcmUgY2FsIGRhdGEgZXJyICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlrZnJlZShhdWRfY2FsX2RhdGEpOworCQlnb3RvIGVuZDsKKwl9CisKKwlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jYWxfZGF0YSA9ICh2b2lkICopYXVkX2NhbF9kYXRhOworCitlbmQ6CisJcHJfZGVidWcoIiVzOiByZXQgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2ZyZWVfY2FsX2RhdGEoaW50IGRldl9tYXBfaWR4KQoreworCWludCByYyA9IDA7CisJc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhICphdWRfY2FsX2RhdGE7CisKKwlwcl9kZWJ1ZygiJXM6IGRldl9tYXBfaWR4ICVkXG4iLCBfX2Z1bmNfXywgZGV2X21hcF9pZHgpOworCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJYXVkX2NhbF9kYXRhID0gKHN0cnVjdCBhdWRpb19yeF9jYWxfZGF0YSAqKQorCQkJCWRldl9tYXBbZGV2X21hcF9pZHhdLmNhbF9kYXRhOworCWtmcmVlKGF1ZF9jYWxfZGF0YSk7CisJZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FsX2RhdGEgPSBOVUxMOworCitlbmQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfY2FsX2RhdGEoaW50IGRldl9tYXBfaWR4KQoreworCWludCByYyA9IDA7CisJc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhICphdWRfY2FsX2RhdGEgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBkZXZtYXAgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7CisJaWYgKGRldl9tYXBfaWR4IDwgMCB8fCBkZXZfbWFwX2lkeCA+PSBEUzJfREVWSUNFU19BTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBkZXYgbWFwIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgZGV2X21hcF9pZHgpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jYWxfZGF0YSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5vIHZhbGlkIGNhbGlicmF0aW9uIGRhdGEgc3RvcmVkIGZvciBpZHggJWRcbiIsCisJCQlfX2Z1bmNfXywgZGV2X21hcF9pZHgpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCS8qIHNlbmQgYXVkIHByb2MgY2FsICovCisJYXVkX2NhbF9kYXRhID0gKHN0cnVjdCBhdWRpb19yeF9jYWxfZGF0YSAqKQorCQkJCWRldl9tYXBbZGV2X21hcF9pZHhdLmNhbF9kYXRhOworCXJjID0gYWRtX3NlbmRfY2FsaWJyYXRpb24oZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKKwkJCQkgIGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LAorCQkJCSAgQURNX1BBVEhfUExBWUJBQ0ssIDAsCisJCQkJICBBRE1fQVVEUFJPQ19DQUwsCisJCQkJICBhdWRfY2FsX2RhdGEtPmF1ZF9wcm9jX2RhdGEsCisJCQkJICBhdWRfY2FsX2RhdGEtPmF1ZF9wcm9jX3NpemUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogYWRtX3NlbmRfY2FsaWJyYXRpb24gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBzZW5kIGF1ZCB2b2x1bWUgY2FsKi8KKwlyYyA9IGFkbV9zZW5kX2NhbGlicmF0aW9uKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQsCisJCQkJICBkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKKwkJCQkgIEFETV9QQVRIX1BMQVlCQUNLLCAwLAorCQkJCSAgQURNX0FVRFZPTF9DQUwsCisJCQkJICBhdWRfY2FsX2RhdGEtPmF1ZF92b2xfZGF0YSwKKwkJCQkgIGF1ZF9jYWxfZGF0YS0+YXVkX3ZvbF9zaXplKTsKKwlpZiAocmMgPCAwKQorCQlwcl9lcnIoIiVzOiBhZG1fc2VuZF9jYWxpYnJhdGlvbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7CitlbmQ6CisJcHJfZGVidWcoIiVzOiByZXR1cm4gICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfY2FuX2VuYWJsZV9tb2R1bGUoaW50MzJfdCBtb2R1bGVfaWQpCit7CisJaWYgKG1vZHVsZV9pZCA9PSBNVE1YX01PRFVMRV9JRF9ERUZBVUxUX0NITUlYRVIgfHwKKwkJbW9kdWxlX2lkID09IEFVRFBST0NfTU9EVUxFX0lEX1JFU0FNUExFUiB8fAorCQltb2R1bGVfaWQgPT0gQVVEUFJPQ19NT0RVTEVfSURfVk9MX0NUUkwpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9pbml0X21vZHVsZXNfaW5fdG9wb2xvZ3koaW50IGRldl9tYXBfaWR4KQoreworCWludCByYyA9IDAsIGkgPSAwLCBwb3J0X2lkLCBjb3BwX2lkeDsKKwkvKiBBY2NvdW50IGZvciAzMiBiaXQgaW50ZWdlciBhbGxvY2F0aW9uICovCisJaW50MzJfdCBwYXJhbV9zeiA9IChBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJaW50MzJfdCAqdXBkYXRlX3BhcmFtX3ZhbCA9IE5VTEw7CisKKwlpZiAoZGV2X21hcF9pZHggPCAwIHx8IGRldl9tYXBfaWR4ID49IERTMl9ERVZJQ0VTX0FMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRldiBtYXAgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJcG9ydF9pZCA9IGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQ7CisJY29wcF9pZHggPSBkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeDsKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCBjb3BwX2lkeCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKwl1cGRhdGVfcGFyYW1fdmFsID0ga3phbGxvYyhBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVwZGF0ZV9wYXJhbV92YWwpIHsKKwkJcHJfZXJyKCIlcywgcGFyYW0gbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWlmICghZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MpIHsKKwkJLyogZ2V0IG1vZHVsZXMgZnJvbSBkc3AgKi8KKwkJcmMgPSBhZG1fZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3QocG9ydF9pZCwgY29wcF9pZHgsCisJCQlBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RILAorCQkJKGNoYXIgKil1cGRhdGVfcGFyYW1fdmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczp0b3BvIGxpc3QgcG9ydCAlZCwgZXJyICVkLGNvcHBfaWR4ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgcmMpOworCQkJZ290byBlbmQ7CisJCX0KKworCQlpZiAodXBkYXRlX3BhcmFtX3ZhbFswXSA+IChwYXJhbV9zeiAtIDEpKSB7CisJCQlwcl9lcnIoIiVzOm1heCBtb2R1bGVzIGV4cC9yZXQgWyVkOiAlZF1cbiIsCisJCQkJX19mdW5jX18sIChwYXJhbV9zeiAtIDEpLAorCQkJCXVwZGF0ZV9wYXJhbV92YWxbMF0pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlbmQ7CisJCX0KKwkJLyogVHVybiBvZmYgbW9kdWxlcyAqLworCQlmb3IgKGkgPSAxOyBpIDwgdXBkYXRlX3BhcmFtX3ZhbFswXTsgaSsrKSB7CisJCQlpZiAoIW1zbV9kczJfZGFwX2Nhbl9lbmFibGVfbW9kdWxlKAorCQkJCXVwZGF0ZV9wYXJhbV92YWxbaV0pIHx8CisJCQkJKHVwZGF0ZV9wYXJhbV92YWxbaV0gPT0gRFMyX01PRFVMRV9JRCkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IERvIG5vdCBlbmFibGUvZGlzYWJsZSAlZFxuIiwKKwkJCQkJIF9fZnVuY19fLCB1cGRhdGVfcGFyYW1fdmFsW2ldKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcHJfZGVidWcoIiVzOiBwYXJhbSBkaXNhYmxlICVkXG4iLAorCQkJCV9fZnVuY19fLCB1cGRhdGVfcGFyYW1fdmFsW2ldKTsKKwkJCWFkbV9wYXJhbV9lbmFibGUocG9ydF9pZCwgY29wcF9pZHgsIHVwZGF0ZV9wYXJhbV92YWxbaV0sCisJCQkJCSBNT0RVTEVfRElTQUJMRSk7CisJCX0KKwl9IGVsc2UgeworCQltc21fZHMyX2RhcF9zZW5kX2NhbF9kYXRhKGRldl9tYXBfaWR4KTsKKworCX0KKwlhZG1fcGFyYW1fZW5hYmxlKHBvcnRfaWQsIGNvcHBfaWR4LCBEUzJfTU9EVUxFX0lELAorCQkJICFkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyk7CitlbmQ6CisJa2ZyZWUodXBkYXRlX3BhcmFtX3ZhbCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgYm9vbCBtc21fZHMyX2RhcF9jaGVja19pc19wYXJhbV9tb2RpZmllZChpbnQzMl90ICpkYXBfcGFyYW1zX21vZGlmaWVkLAorCQkJCSAgICBpbnQzMl90IGlkeCwgaW50MzJfdCBjb21taXQpCit7CisJaWYgKChkYXBfcGFyYW1zX21vZGlmaWVkW2lkeF0gPT0gMCkgfHwKKwkJKGNvbW1pdCAmJgorCQkoKGRhcF9wYXJhbXNfbW9kaWZpZWRbaWR4XSAmIDB4MDAwMTAwMDApICYmCisJCSgoZGFwX3BhcmFtc19tb2RpZmllZFtpZHhdICYgMHgwMDAwRkZGRikgPD0gMSkpKSkgeworCQlwcl9kZWJ1ZygiJXM6IG5vdCBtb2RpZmllZCBhdCBpZHggJWRcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXByX2RlYnVnKCIlczogbW9kaWZpZWQgYXQgaWR4ICVkXG4iLCBfX2Z1bmNfXywgaWR4KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2NhY2hlX2RldmljZXMoaW50MzJfdCBkZXZpY2VfaWQpCit7CisJaW50MzJfdCBjYWNoZV9kZXYgPSAtMTsKKworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJY2FzZSBERVZJQ0VfTk9ORToKKwkJY2FjaGVfZGV2ID0gRE9MQllfT0ZGX0NBQ0hFOworCQlicmVhazsKKwljYXNlIEVBUlBJRUNFOgorCWNhc2UgU1BFQUtFUjoKKwkJY2FjaGVfZGV2ID0gRE9MQllfU1BFQUtFUl9DQUNIRTsKKwkJYnJlYWs7CisJY2FzZSBXSVJFRF9IRUFEU0VUOgorCWNhc2UgV0lSRURfSEVBRFBIT05FOgorCWNhc2UgQU5MR19ET0NLX0hFQURTRVQ6CisJY2FzZSBER1RMX0RPQ0tfSEVBRFNFVDoKKwljYXNlIEFOQ19IRUFEU0VUOgorCWNhc2UgQU5DX0hFQURQSE9ORToKKwljYXNlIEJMVUVUT09USF9TQ086CisJY2FzZSBCTFVFVE9PVEhfU0NPX0hFQURTRVQ6CisJY2FzZSBCTFVFVE9PVEhfU0NPX0NBUktJVDoKKwkJY2FjaGVfZGV2ID0gRE9MQllfSEVBRFBIT05FX0NBQ0hFOworCQlicmVhazsKKwljYXNlIEZNOgorCWNhc2UgRk1fVFg6CisJCWNhY2hlX2RldiA9IERPTEJZX0ZNX0NBQ0hFOworCQlicmVhazsKKwljYXNlIEFVWF9ESUdJVEFMOgorCQljYWNoZV9kZXYgPSBET0xCWV9IRE1JX0NBQ0hFOworCQlicmVhazsKKwljYXNlIFBST1hZOgorCWNhc2UgUkVNT1RFX1NVQk1JWDoKKwkJY2FjaGVfZGV2ID0gRE9MQllfV0ZEX0NBQ0hFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhY2hlIGRldmljZVxuIiwgX19mdW5jX18pOworCX0KKwlwcl9kZWJ1ZygiJXM6IGNhY2hlIGRldmljZSAlZFxuIiwgX19mdW5jX18sIGNhY2hlX2Rldik7CisJcmV0dXJuIGNhY2hlX2RldjsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF91cGRhdGVfbnVtX2RldmljZXMoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEsCisJCQkJICAgICAgaW50MzJfdCAqbnVtX2RldmljZSwgaW50MzJfdCAqZGV2X2FyciwKKwkJCQkgICAgICBpbnQzMl90IGFycmF5X3NpemUpCit7CisJaW50MzJfdCBpZHggPSAwOworCWludCBzdXBwb3J0ZWRfZGV2aWNlcyA9IDA7CisKKwlpZiAoIWFycmF5X3NpemUpIHsKKwkJcHJfZXJyKCIlczogYXJyYXkgc2l6ZSB6ZXJvXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkb2xieV9kYXRhLT5kZXZpY2VfaWQgPT0gREVWSUNFX09VVF9BTEwgfHwKKwkJZG9sYnlfZGF0YS0+ZGV2aWNlX2lkID09IERFVklDRV9PVVRfREVGQVVMVCkKKwkJc3VwcG9ydGVkX2RldmljZXMgPSBhbGxfc3VwcG9ydGVkX2RldmljZXM7CisJZWxzZQorCQlzdXBwb3J0ZWRfZGV2aWNlcyA9IGRvbGJ5X2RhdGEtPmRldmljZV9pZDsKKworCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgRUFSUElFQ0UpKQorCQlkZXZfYXJyW2lkeCsrXSA9IEVBUlBJRUNFOworCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgU1BFQUtFUikpCisJCWRldl9hcnJbaWR4KytdID0gU1BFQUtFUjsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIFdJUkVEX0hFQURTRVQpKQorCQlkZXZfYXJyW2lkeCsrXSA9IFdJUkVEX0hFQURTRVQ7CisJaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBXSVJFRF9IRUFEUEhPTkUpKQorCQlkZXZfYXJyW2lkeCsrXSA9IFdJUkVEX0hFQURQSE9ORTsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEJMVUVUT09USF9TQ08pKQorCQlkZXZfYXJyW2lkeCsrXSA9IEJMVUVUT09USF9TQ087CisJaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBCTFVFVE9PVEhfU0NPX0NBUktJVCkpCisJCWRldl9hcnJbaWR4KytdID0gQkxVRVRPT1RIX1NDT19DQVJLSVQ7CisJaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBCTFVFVE9PVEhfU0NPX0hFQURTRVQpKQorCQlkZXZfYXJyW2lkeCsrXSA9IEJMVUVUT09USF9TQ09fSEVBRFNFVDsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEFVWF9ESUdJVEFMKSkKKwkJZGV2X2FycltpZHgrK10gPSBBVVhfRElHSVRBTDsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEFOTEdfRE9DS19IRUFEU0VUKSkKKwkJZGV2X2FycltpZHgrK10gPSBBTkxHX0RPQ0tfSEVBRFNFVDsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIERHVExfRE9DS19IRUFEU0VUKSkKKwkJZGV2X2FycltpZHgrK10gPSBER1RMX0RPQ0tfSEVBRFNFVDsKKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIFJFTU9URV9TVUJNSVgpKQorCQlkZXZfYXJyW2lkeCsrXSA9IFJFTU9URV9TVUJNSVg7CisJaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBBTkNfSEVBRFNFVCkpCisJCWRldl9hcnJbaWR4KytdID0gQU5DX0hFQURTRVQ7CisJaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBBTkNfSEVBRFBIT05FKSkKKwkJZGV2X2FycltpZHgrK10gPSBBTkNfSEVBRFBIT05FOworCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgUFJPWFkpKQorCQlkZXZfYXJyW2lkeCsrXSA9IFBST1hZOworCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgRk0pKQorCQlkZXZfYXJyW2lkeCsrXSA9IEZNOworCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgRk1fVFgpKQorCQlkZXZfYXJyW2lkeCsrXSA9IEZNX1RYOworCS8qIENIRUNLIGRldmljZSBub25lIHNlcGFyYXRlbHkgKi8KKwlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyA9PSBERVZJQ0VfTk9ORSkpCisJCWRldl9hcnJbaWR4KytdID0gREVWSUNFX05PTkU7CisJcHJfZGVidWcoIiVzOiBkZXYgaWQgMHgleCwgaWR4ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHN1cHBvcnRlZF9kZXZpY2VzLCBpZHgpOworCSpudW1fZGV2aWNlID0gaWR4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2dldF9wb3J0X2lkKAorCQlpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBiZV9pZCkKK3sKKwlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSBiZWRhaXM7CisJaW50IHBvcnRfaWQgPSBET0xCWV9JTlZBTElEX1BPUlRfSUQ7CisJaW50IHBvcnRfdHlwZSA9IDA7CisKKwlpZiAoYmVfaWQgPCAwKSB7CisJCXBvcnRfaWQgPSAtMTsKKwkJZ290byBlbmQ7CisJfQorCisJbXNtX3BjbV9yb3V0aW5nX2dldF9iZWRhaV9pbmZvKGJlX2lkLCAmYmVkYWlzKTsKKwlwcl9kZWJ1ZygiJXM6IGJlIHBvcnRfaWQgJWRcbiIsIF9fZnVuY19fLCBiZWRhaXMucG9ydF9pZCk7CisJcG9ydF9pZCA9IGJlZGFpcy5wb3J0X2lkOworCXBvcnRfdHlwZSA9IGFmZV9nZXRfcG9ydF90eXBlKGJlZGFpcy5wb3J0X2lkKTsKKwlpZiAocG9ydF90eXBlICE9IE1TTV9BRkVfUE9SVF9UWVBFX1JYKQorCQlwb3J0X2lkID0gRE9MQllfSU5WQUxJRF9QT1JUX0lEOworZW5kOgorCXByX2RlYnVnKCIlczogZGV2aWNlX2lkIDB4JXgsIGJlX2lkICVkLCBwb3J0X2lkICVkXG4iLAorCQkgX19mdW5jX18sIGRldmljZV9pZCwgYmVfaWQsIHBvcnRfaWQpOworCXJldHVybiBwb3J0X2lkOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9kZXZfbWFwX3BvcnRfaWQoaW50MzJfdCBkZXZpY2VfaWQsIGludCBwb3J0X2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7CisJCWlmIChkZXZfbWFwW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlkZXZfbWFwW2ldLnBvcnRfaWQgPSBwb3J0X2lkOworCX0KKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgJWQsIGRldmljZV9pZCAweCV4XG4iLAorCQkgX19mdW5jX18sIHBvcnRfaWQsIGRldmljZV9pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzc193YWl0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkJCSAgaW50IHdhaXRfdGltZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWFkbV9zZXRfd2FpdF9wYXJhbWV0ZXJzKHBvcnRfaWQsIGNvcHBfaWR4KTsKKwltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7CisJcmV0ID0gYWRtX3dhaXRfdGltZW91dChwb3J0X2lkLCBjb3BwX2lkeCwgd2FpdF90aW1lKTsKKwltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7CisJLyogUmVzZXQgdGhlIHBhcmFtZXRlcnMgaWYgd2FpdCBoYXMgdGltZWQgb3V0ICovCisJaWYgKHJldCA9PSAwKQorCQlhZG1fcmVzZXRfd2FpdF9wYXJhbWV0ZXJzKHBvcnRfaWQsIGNvcHBfaWR4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2hhbmRsZV9ieXBhc3Moc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEpCit7CisJaW50IHJjID0gMCwgaSA9IDAsIGogPSAwOworCS8qQWNjb3VudCBmb3IgMzIgYml0IGludGVnZXIgYWxsb2NhdGlvbiAgKi8KKwlpbnQzMl90IHBhcmFtX3N6ID0gKEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEggLyBzaXplb2YodWludDMyX3QpKTsKKwlpbnQzMl90ICptb2RfbGlzdCA9IE5VTEw7CisJaW50IHBvcnRfaWQgPSAwLCBjb3BwX2lkeCA9IC0xOworCWJvb2wgY3Nfb25vZmYgPSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuY3VzdG9tX3N0ZXJlb19vbm9mZjsKKwlpbnQgcmFtcF93YWl0ID0gRE9MQllfU09GVF9WT0xVTUVfUEVSSU9EOworCisJcHJfZGVidWcoIiVzOiBieXBhc3MgdHlwZSAlZCBieXBhc3MgJWQgY3VzdG9tIHN0ZXJlbyAlZFxuIiwgX19mdW5jX18sCisJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlLAorCQkgZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MsCisJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuY3VzdG9tX3N0ZXJlb19vbm9mZik7CisJbW9kX2xpc3QgPSBremFsbG9jKEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgsIEdGUF9LRVJORUwpOworCWlmICghbW9kX2xpc3QpIHsKKwkJcHJfZXJyKCIlczogcGFyYW0gbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBEUzJfREVWSUNFU19BTEw7IGkrKykgeworCQlwcl9kZWJ1ZygiJXM6IGFjdGl2ZSBkZXYgJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwW2ldLmFjdGl2ZSk7CisJCWlmIChkZXZfbWFwW2ldLmFjdGl2ZSkgeworCQkJcG9ydF9pZCA9IGRldl9tYXBbaV0ucG9ydF9pZDsKKwkJCWNvcHBfaWR4ID0gZGV2X21hcFtpXS5jb3BwX2lkeDsKKworCQkJaWYgKHBvcnRfaWQgPT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0XG4iLCBfX2Z1bmNfXyk7CisJCQkJcmMgPSAwOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKKwkJCQkoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQkJCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKKwkJCQlyYyA9IDA7CisJCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCS8qIGdldG1vZHVsZXMgZnJvbSBkc3AgKi8KKwkJCXJjID0gYWRtX2dldF9wcF90b3BvX21vZHVsZV9saXN0KHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCSAgICBBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RILAorCQkJCSAgICAoY2hhciAqKW1vZF9saXN0KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOmFkbSBnZXQgdG9wbyBsaXN0IHBvcnQgJWQiLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQkJcHJfZXJyKCJjb3BwX2lkeCAlZCwgZXJyICVkXG4iLAorCQkJCQljb3BwX2lkeCwgcmMpOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJaWYgKG1vZF9saXN0WzBdID4gKHBhcmFtX3N6IC0gMSkpIHsKKwkJCQlwcl9lcnIoIiVzOm1heCBtb2R1bGVzIGV4cC9yZXQgWyVkOiAlZF1cbiIsCisJCQkJCV9fZnVuY19fLCAocGFyYW1fc3ogLSAxKSwKKwkJCQkJbW9kX2xpc3RbMF0pOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJCS8qCisJCQkgKiBnZXQgcmFtcCBwYXJhbWV0ZXJzCisJCQkgKiBjaGVjayBmb3IgY2hhbmdlIGluIHJhbXAgcGFyYW1ldGVycworCQkJICogdXBkYXRlIHJhbXAgd2FpdAorCQkJICovCisJCQltc21fZHMyX2RhcF9jaGVja19hbmRfdXBkYXRlX3JhbXBfd2FpdChwb3J0X2lkLAorCQkJCQkJCSAgICAgICBjb3BwX2lkeCwKKwkJCQkJCQkgICAgICAgJnJhbXBfd2FpdCk7CisKKwkJCS8qIE11dGUgYmVmb3JlIHN3aXRjaGluZyBtb2R1bGVzICovCisJCQlyYyA9IGFkbV9zZXRfdm9sdW1lKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkgICAgVk9MVU1FX1pFUk9fR0FJTik7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJLyoKKwkJCQkgKiBOb3QgRmF0YWwgY2FuIGNvbnRpbnVlIGJ5cGFzcyBvcGVyYXRpb25zLgorCQkJCSAqIERvIG5vdCBuZWVkIHRvIGJsb2NrIHBsYXliYWNrCisJCQkJICovCisJCQkJcHJfaW5mbygiJXMgOlNldCB2b2x1bWUgcG9ydF9pZCAlZCIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJCQlwcl9pbmZvKCJjb3BwX2lkeCAlZCwgZXJyb3IgJWRcbiIsCisJCQkJCWNvcHBfaWR4LCByYyk7CisJCQl9CisKKwkJCXJjID0gbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzc193YWl0KHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkgICAgKHJhbXBfd2FpdCArCisJCQkJCSAgICAgRE9MQllfQURESVRJT05BTF9SQU1QX1dBSVQpKTsKKwkJCWlmIChyYyA9PSAtRUlOVFIpIHsKKwkJCQlwcl9pbmZvKCIlczpieXBhc3MgaW50ZXJydXB0ZWQtaWdub3JlLHBvcnQgJWQiLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQkJcHJfaW5mbygiY29wcF9pZHggJWRcbiIsIGNvcHBfaWR4KTsKKwkJCQlyYyA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGlmIGRhcCBieXBhc3MgaXMgc2V0ICovCisJCQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MpIHsKKwkJCQkvKiBUdXJuIG9mZiBkYXAgbW9kdWxlICovCisJCQkJYWRtX3BhcmFtX2VuYWJsZShwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkJCSBEUzJfTU9EVUxFX0lELCBNT0RVTEVfRElTQUJMRSk7CisJCQkJLyoKKwkJCQkgKiBJZiBjdXN0b20gc3RlcmVvIGlzIG9uIGF0IHRoZSB0aW1lIG9mIGJ5cGFzcywKKwkJCQkgKiBzd2l0Y2ggb2ZmIGN1c3RvbSBzdGVyZW8gb24gZGFwIGFuZCB0dXJuIG9uCisJCQkJICogY3VzdG9tIHN0ZXJlbyBvbiBxdGkgY2hhbm5lbCBtaXhlci4KKwkJCQkgKi8KKwkJCQlpZiAoY3Nfb25vZmYpIHsKKwkJCQkJcmMgPSBkYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaSwKKwkJCQkJCQkJIWNzX29ub2ZmKTsKKwkJCQkJaWYgKHJjIDwgMCkgeworCQkJCQkJcHJfaW5mbygiJXM6RF9DUyBpICVkLHJjICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCBpLCByYyk7CisJCQkJCX0KKwkJCQkJcmMgPSBxdGlfc2V0X2N1c3RvbV9zdGVyZW9fb24ocG9ydF9pZCwKKwkJCQkJCQkJICAgICAgY29wcF9pZHgsCisJCQkJCQkJCSAgICAgIGNzX29ub2ZmKTsKKwkJCQkJaWYgKHJjIDwgMCkgeworCQkJCQkJcHJfaW5mbygiJXM6UV9DUyBwb3J0IGlkIDB4JXgiLAorCQkJCQkJCSBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQkJCQlwcl9pbmZvKCJjb3BwIGlkeCAlZCwgcmMgJWRcbiIsCisJCQkJCQkJY29wcF9pZHgsIHJjKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBBZGQgYWRtIGFwaSB0byByZXNlbmQgY2FsaWJyYXRpb24gb24gcG9ydCAqLworCQkJCXJjID0gbXNtX2RzMl9kYXBfc2VuZF9jYWxfZGF0YShpKTsKKwkJCQlpZiAocmMgPCAwKSB7CisJCQkJCS8qCisJCQkJCSAqIE5vdCBmYXRhbCxjb250aW51ZSBieXBhc3Mgb3BlcmF0aW9ucy4KKwkJCQkJICogRG8gbm90IG5lZWQgdG8gYmxvY2sgcGxheWJhY2sKKwkJCQkJICovCisJCQkJCXByX2luZm8oIiVzOnNlbmQgY2FsIGVyciAlZCBpbmRleCAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByYywgaSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBUdXJuIG9mZiBxdGkgbW9kdWxlcyAqLworCQkJCWZvciAoaiA9IDE7IGogPCBtb2RfbGlzdFswXTsgaisrKSB7CisJCQkJCWlmICghbXNtX2RzMl9kYXBfY2FuX2VuYWJsZV9tb2R1bGUoCisJCQkJCQltb2RfbGlzdFtqXSkgfHwKKwkJCQkJCW1vZF9saXN0W2pdID09CisJCQkJCQlEUzJfTU9EVUxFX0lEKQorCQkJCQkJY29udGludWU7CisJCQkJCXByX2RlYnVnKCIlczogcGFyYW0gZGlzYWJsZSAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBtb2RfbGlzdFtqXSk7CisJCQkJCWFkbV9wYXJhbV9lbmFibGUocG9ydF9pZCwgY29wcF9pZHgsCisJCQkJCQkJIG1vZF9saXN0W2pdLAorCQkJCQkJCSBNT0RVTEVfRElTQUJMRSk7CisJCQkJfQorCisJCQkJLyogRW5hYmxlIERBUCBtb2R1bGVzICovCisJCQkJcHJfZGVidWcoIiVzOkRTMiBwYXJhbSBlbmFibGVcbiIsIF9fZnVuY19fKTsKKwkJCQlhZG1fcGFyYW1fZW5hYmxlKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkJIERTMl9NT0RVTEVfSUQsIE1PRFVMRV9FTkFCTEUpOworCQkJCS8qCisJCQkJICogSWYgY3VzdG9tIHN0ZXJlbyBpcyBvbiBhdCB0aGUgdGltZSBvZiBkYXAgb24sCisJCQkJICogc3dpdGNoIG9mZiBjdXN0b20gc3RlcmVvIG9uIHF0aSBjaGFubmVsIG1peGVyCisJCQkJICogYW5kIHR1cm4gb24gY3VzdG9tIHN0ZXJlbyBvbiBEQVAuCisJCQkJICogbWl4ZXIocXRpKS4KKwkJCQkgKi8KKwkJCQlpZiAoY3Nfb25vZmYpIHsKKwkJCQkJcmMgPSBxdGlfc2V0X2N1c3RvbV9zdGVyZW9fb24ocG9ydF9pZCwKKwkJCQkJCQkJY29wcF9pZHgsCisJCQkJCQkJCSFjc19vbm9mZik7CisJCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJCXByX2luZm8oIiVzOlFfQ1MgcG9ydF9pZCAweCV4IiwKKwkJCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQkJCQlwcl9pbmZvKCJjb3BwX2lkeCAlZCByYyAlZFxuIiwKKwkJCQkJCQljb3BwX2lkeCwgcmMpOworCQkJCQl9CisJCQkJCXJjID0gZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGksCisJCQkJCQkJCWNzX29ub2ZmKTsKKwkJCQkJaWYgKHJjIDwgMCkgeworCQkJCQkJcHJfaW5mbygiJXM6RF9DUyBpICVkLHJjICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCBpLCByYyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJjID0gbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzc193YWl0KHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCURPTEJZX01PRFVMRV9FTkFCTEVfUEVSSU9EKTsKKwkJCWlmIChyYyA9PSAtRUlOVFIpIHsKKwkJCQlwcl9pbmZvKCIlczpieXBhc3MgaW50ZXJydXB0ZWQgcG9ydF9pZCAlZCBjb3BwX2lkeCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJCQkvKiBJbnRlcnJ1cHRlZCBpZ25vcmUgYnlwYXNzICovCisJCQkJcmMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBzZXQgdm9sdW1lIHRvIHVuaXR5IGdhaW4gYWZ0ZXIgbW9kdWxlIG9uL29mZiAqLworCQkJcmMgPSBhZG1fc2V0X3ZvbHVtZShwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkJICAgIFZPTFVNRV9VTklUWV9HQUlOKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQkvKgorCQkJCSAqIE5vdCBGYXRhbCBjYW4gY29udGludWUgYnlwYXNzIG9wZXJhdGlvbnMuCisJCQkJICogRG8gbm90IG5lZWQgdG8gYmxvY2sgcGxheWJhY2sKKwkJCQkgKi8KKwkJCQlwcl9pbmZvKCIlczogU2V0IHZvbCBwb3J0ICVkIGNvcHAgJWQsIHJjICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgsIHJjKTsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwl9CisKK2VuZDoKKwlrZnJlZShtb2RfbGlzdCk7CisJcHJfZGVidWcoIiVzOnJldHVybiByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2VuZF9lbmRfcG9pbnQoaW50IGRldl9tYXBfaWR4LCBpbnQgZW5kcF9pZHgpCit7CisJaW50IHJjID0gMDsKKwlpbnQzMl90ICAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEwsICpwYXJhbXNfdmFsdWUgPSBOVUxMOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RIICsKKwkJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpICogc2l6ZW9mKHVpbnQzMl90KTsKKwlpbnQgY2FjaGVfZGV2aWNlID0gMDsKKwlzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfcyAqZHMyX2FwX3BhcmFtc19vYmogPSBOVUxMOworCWludDMyX3QgKm1vZGlmaWVkX3BhcmFtID0gTlVMTDsKKworCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJY2FjaGVfZGV2aWNlID0gZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FjaGVfZGV2OworCisJZHMyX2FwX3BhcmFtc19vYmogPSAmZHMyX2RhcF9wYXJhbXNbY2FjaGVfZGV2aWNlXTsKKwlwcl9kZWJ1ZygiJXM6IGNhY2hlIGRldiAlZCwgZGV2X21hcF9pZHggJWRcbiIsIF9fZnVuY19fLAorCQkgY2FjaGVfZGV2aWNlLCBkZXZfbWFwX2lkeCk7CisJcHJfZGVidWcoIiVzOiBlbmRwIC0gJXBLICVwS1xuIiwgIF9fZnVuY19fLAorCQkgJmRzMl9kYXBfcGFyYW1zW2NhY2hlX2RldmljZV0sIGRzMl9hcF9wYXJhbXNfb2JqKTsKKworCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXNfdmFsdWUpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA8IDApIHx8CisJCShkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gcGFyYW1zX3ZhbHVlOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFA7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX1BBUkFNX0lOVF9FTkRQX0xFTkdUSCAqIHNpemVvZih1aW50MzJfdCk7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IGRzMl9hcF9wYXJhbXNfb2JqLT5wYXJhbXNfdmFsWworCQkJCQlkczJfZGFwX3BhcmFtc19vZmZzZXRbZW5kcF9pZHhdXTsKKwlwcl9kZWJ1ZygiJXM6IG9mZiAlZCwgbGVuZ3RoICVkXG4iLCBfX2Z1bmNfXywKKwkJIGRzMl9kYXBfcGFyYW1zX29mZnNldFtlbmRwX2lkeF0sCisJCSBkczJfZGFwX3BhcmFtc19sZW5ndGhbZW5kcF9pZHhdKTsKKwlwcl9kZWJ1ZygiJXM6IHBhcmFtIDB4JXgsIHBhcmFtIHZhbCAlZFxuIiwgX19mdW5jX18sCisJCSBkczJfZGFwX3BhcmFtc19pZFtlbmRwX2lkeF0sIGRzMl9hcF9wYXJhbXNfb2JqLT4KKwkJIHBhcmFtc192YWxbZHMyX2RhcF9wYXJhbXNfb2Zmc2V0W2VuZHBfaWR4XV0pOworCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAorCQkJCSAgICAgICBkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKKwkJCQkgICAgICAgKGNoYXIgKilwYXJhbXNfdmFsdWUsIHBhcmFtc19sZW5ndGgpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBzZW5kIGRvbGJ5IHBhcmFtcyBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisJbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKKwlpZiAobW9kaWZpZWRfcGFyYW0gPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBtb2RpZmllZCBwYXJhbSBzdHJ1Y3R1cmUgaW52YWxpZFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAobXNtX2RzMl9kYXBfY2hlY2tfaXNfcGFyYW1fbW9kaWZpZWQobW9kaWZpZWRfcGFyYW0sIGVuZHBfaWR4LCAwKSkKKwkJZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWRbZW5kcF9pZHhdID0gMHgwMDAxMDAwMTsKKworZW5kOgorCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfY2FjaGVkX3BhcmFtcyhpbnQgZGV2X21hcF9pZHgsCisJCQkJCSAgaW50IGNvbW1pdCkKK3sKKwlpbnQzMl90ICp1cGRhdGVfcGFyYW1zX3ZhbHVlID0gTlVMTCwgKnBhcmFtc192YWx1ZSA9IE5VTEw7CisJdWludDMyX3QgaWR4LCBpLCBqLCByZXQgPSAwOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsKKwkJCQkoTUFYX0RTMl9QQVJBTVMgLSAxKSAqCisJCQkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqCisJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwlpbnQgY2FjaGVfZGV2aWNlID0gMDsKKwlzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfcyAqZHMyX2FwX3BhcmFtc19vYmogPSBOVUxMOworCWludDMyX3QgKm1vZGlmaWVkX3BhcmFtID0gTlVMTDsKKworCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCWNhY2hlX2RldmljZSA9IGRldl9tYXBbZGV2X21hcF9pZHhdLmNhY2hlX2RldjsKKworCS8qIFVzZSBvZmYgcHJvZmlsZSBjYWNoZSBpbiBvbmx5IGZvciBzb2Z0IGJ5cGFzcyAqLworCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09IERBUF9TT0ZUX0JZUEFTUyAmJgorCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9PSB0cnVlKSB7CisJCXByX2RlYnVnKCIlczogdXNlIGJ5cGFzcyBjYWNoZSAwXG4iLCBfX2Z1bmNfXyk7CisJCWNhY2hlX2RldmljZSA9ICBkZXZfbWFwWzBdLmNhY2hlX2RldjsKKwl9CisKKwlkczJfYXBfcGFyYW1zX29iaiA9ICZkczJfZGFwX3BhcmFtc1tjYWNoZV9kZXZpY2VdOworCXByX2RlYnVnKCIlczogY2FjaGVkIHBhcmFtIC0gJXBLICVwSywgY2FjaGVfZGV2aWNlICVkXG4iLCBfX2Z1bmNfXywKKwkJICZkczJfZGFwX3BhcmFtc1tjYWNoZV9kZXZpY2VdLCBkczJfYXBfcGFyYW1zX29iaiwKKwkJIGNhY2hlX2RldmljZSk7CisJcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhcmFtc192YWx1ZSkgeworCQlwcl9lcnIoIiVzOiBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgPT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgcG9ydCBpZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4IDwgMCkgfHwKKwkJKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX2lkeFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gcGFyYW1zX3ZhbHVlOworCXBhcmFtc19sZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCAoTUFYX0RTMl9QQVJBTVMtMSk7IGkrKykgeworCQkvKmdldCB0aGUgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gdGhlIGNhY2hlKi8KKwkJbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKKwkJaWYgKG1vZGlmaWVkX3BhcmFtID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IG1vZGlmaWVkIHBhcmFtIHN0cnVjdHVyZSBpbnZhbGlkXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlpZiAoIW1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKG1vZGlmaWVkX3BhcmFtLCBpLAorCQkJCQkJCSBjb21taXQpKQorCQkJY29udGludWU7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gZHMyX2RhcF9wYXJhbXNfaWRbaV07CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkczJfZGFwX3BhcmFtc19sZW5ndGhbaV0gKgorCQkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWR4ID0gZHMyX2RhcF9wYXJhbXNfb2Zmc2V0W2ldOworCQlmb3IgKGogPSAwOyBqIDwgZHMyX2RhcF9wYXJhbXNfbGVuZ3RoW2ldOyBqKyspIHsKKwkJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPQorCQkJCQlkczJfYXBfcGFyYW1zX29iai0+cGFyYW1zX3ZhbFtpZHgral07CisJCQlwcl9kZWJ1ZygiJXM6IGlkIDB4JXgsdmFsICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgZHMyX2RhcF9wYXJhbXNfaWRbaV0sCisJCQkJIGRzMl9hcF9wYXJhbXNfb2JqLT5wYXJhbXNfdmFsW2lkeCtqXSk7CisJCX0KKwkJcGFyYW1zX2xlbmd0aCArPSAoRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFICsKKwkJCQlkczJfZGFwX3BhcmFtc19sZW5ndGhbaV0pICogc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHZhbGlkIHBhcmFtIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoKTsKKwlpZiAocGFyYW1zX2xlbmd0aCkgeworCQlyZXQgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQsCisJCQkJCQlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKKwkJCQkJCShjaGFyICopcGFyYW1zX3ZhbHVlLAorCQkJCQkJcGFyYW1zX2xlbmd0aCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IHNlbmQgZG9sYnkgcGFyYW1zIGZhaWxlZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlbmQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9EUzJfUEFSQU1TLTE7IGkrKykgeworCQkJLypnZXQgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gdGhlIGNhY2hlKi8KKwkJCW1vZGlmaWVkX3BhcmFtID0gZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWQ7CisJCQlpZiAobW9kaWZpZWRfcGFyYW0gPT0gTlVMTCkgeworCQkJCXByX2VycigiJXM6IG1vZGlmaWVkIHBhcmFtIHN0cnVjdCBpbnZhbGlkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJCWlmICghbXNtX2RzMl9kYXBfY2hlY2tfaXNfcGFyYW1fbW9kaWZpZWQoCisJCQkJCW1vZGlmaWVkX3BhcmFtLCBpLCBjb21taXQpKQorCQkJCWNvbnRpbnVlOworCQkJZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWRbaV0gPSAweDAwMDEwMDAxOworCQl9CisJfQorZW5kOgorCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9jb21taXRfcGFyYW1zKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICpkb2xieV9kYXRhLAorCQkJCSBpbnQgY29tbWl0KQoreworCWludCByZXQgPSAwLCBpLCBpZHg7CisJc3RydWN0IGRzMl9kYXBfcGFyYW1zX3MgKmRzMl9hcF9wYXJhbXNfb2JqID0gIE5VTEw7CisJaW50MzJfdCAqbW9kaWZpZWRfcGFyYW0gPSBOVUxMOworCisJLyogRG8gbm90IGNvbW1pdCBwYXJhbXMgaWYgaW4gaGFyZCBieXBhc3MgKi8KKwlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PSBEQVBfSEFSRF9CWVBBU1MgJiYKKwkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbGxlZCBpbiBieXBhc3MiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EUzJfUEFSQU1TOyBpZHgrKykgeworCQlpZiAoZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSA9PSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFApCisJCQlicmVhazsKKwl9CisJaWYgKGlkeCA+PSBNQVhfRFMyX1BBUkFNUyB8fCBpZHggPCAwKSB7CisJCXByX2VycigiJXM6IGluZGV4IG9mIERTMiBQYXJhbSBub3QgZm91bmQgaWR4ICVkXG4iLAorCQkJX19mdW5jX18sIGlkeCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwlwcl9kZWJ1ZygiJXM6IGZvdW5kIGVuZHAgLSBpZHggJWQgMHgleFxuIiwgX19mdW5jX18sIGlkeCwKKwkJZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSk7CisJZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7CisJCXByX2RlYnVnKCIlczpkZXZbMHgleCwweCV4XSxpOiVkLGFjdGl2ZTolZCxieXBhc3M6JWQsdHlwZTolZFxuIiwKKwkJCV9fZnVuY19fLCBkb2xieV9kYXRhLT5kZXZpY2VfaWQsIGRldl9tYXBbaV0uZGV2aWNlX2lkLAorCQkJaSwgZGV2X21hcFtpXS5hY3RpdmUsIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzLAorCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSk7CisKKwkJaWYgKCgoZGV2X21hcFtpXS5kZXZpY2VfaWQgJiBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlKSB8fAorCQkJKChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09CisJCQlEQVBfU09GVF9CWVBBU1MpICYmCisJCQkoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkpKSAmJgorCQkJKGRldl9tYXBbaV0uYWN0aXZlID09IHRydWUpKSB7CisKKwkJCS8qZ2V0IHB0ciB0byB0aGUgY2FjaGUgc3RvcmluZyB0aGUgcGFyYW1zIGZvciBkZXZpY2UqLworCQkJaWYgKChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09CisJCQkJREFQX1NPRlRfQllQQVNTKSAmJgorCQkJCShkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9PSB0cnVlKSkKKwkJCQlkczJfYXBfcGFyYW1zX29iaiA9CisJCQkJCSZkczJfZGFwX3BhcmFtc1tkZXZfbWFwWzBdLmNhY2hlX2Rldl07CisJCQllbHNlCisJCQkJZHMyX2FwX3BhcmFtc19vYmogPQorCQkJCQkmZHMyX2RhcF9wYXJhbXNbZGV2X21hcFtpXS5jYWNoZV9kZXZdOworCisJCQkvKmdldCB0aGUgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gY2FjaGUqLworCQkJbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKKwkJCWlmIChtb2RpZmllZF9wYXJhbSA9PSBOVUxMKSB7CisJCQkJcHJfZXJyKCIlczogbW9kaWZpZWRfcGFyYW0gTlVMTFxuIiwgX19mdW5jX18pOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZW5kIHRoZSBlbmRwIHBhcmFtIGlmIHVzZSBjYWNoZSBpcyBzZXQKKwkJCSAqIG9yIGlmIHBhcmFtIGlzIG1vZGlmaWVkCisJCQkgKi8KKwkJCWlmICghY29tbWl0IHx8IG1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKAorCQkJCQltb2RpZmllZF9wYXJhbSwgaWR4LCBjb21taXQpKSB7CisJCQkJbXNtX2RzMl9kYXBfc2VuZF9lbmRfcG9pbnQoaSwgaWR4KTsKKwkJCQljb21taXQgPSAwOworCQkJfQorCQkJcmV0ID0gbXNtX2RzMl9kYXBfc2VuZF9jYWNoZWRfcGFyYW1zKGksIGNvbW1pdCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiJXM6IHNlbmQgY2FjaGVkIHBhcmFtICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCX0KK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2hhbmRsZV9jb21tYW5kcyh1MzIgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldCAgPSAwLCBwb3J0X2lkID0gMDsKKwlpbnQzMl90IGRhdGE7CisJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKilhcmc7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJmRvbGJ5X2RhdGEtPmRhdGFbMF0pKSB7CisJCXByX2RlYnVnKCIlcyBlcnJvciBnZXR0aW5nIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlbmQ7CisJfQorCisJcHJfZGVidWcoIiVzOiBwYXJhbV9pZCAlZCxiZV9pZCAlZCxkZXZpY2VfaWQgMHgleCxsZW5ndGggJWQsZGF0YSAlZFxuIiwKKwkJIF9fZnVuY19fLCBkb2xieV9kYXRhLT5wYXJhbV9pZCwgZG9sYnlfZGF0YS0+YmVfaWQsCisJCWRvbGJ5X2RhdGEtPmRldmljZV9pZCwgZG9sYnlfZGF0YS0+bGVuZ3RoLCBkYXRhKTsKKworCXN3aXRjaCAoZG9sYnlfZGF0YS0+cGFyYW1faWQpIHsKKwljYXNlIERBUF9DTURfQ09NTUlUX0FMTDoKKwkJbXNtX2RzMl9kYXBfY29tbWl0X3BhcmFtcyhkb2xieV9kYXRhLCAwKTsKKwlicmVhazsKKworCWNhc2UgREFQX0NNRF9DT01NSVRfQ0hBTkdFRDoKKwkJbXNtX2RzMl9kYXBfY29tbWl0X3BhcmFtcyhkb2xieV9kYXRhLCAxKTsKKwlicmVhazsKKworCWNhc2UgREFQX0NNRF9VU0VfQ0FDSEVfRk9SX0lOSVQ6CisJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy51c2VfY2FjaGUgPSBkYXRhOworCWJyZWFrOworCisJY2FzZSBEQVBfQ01EX1NFVF9CWVBBU1M6CisJCXByX2RlYnVnKCIlczogYnlwYXNzICVkIGJ5cGFzcyB0eXBlICVkLCBkYXRhICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcywKKwkJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlLAorCQkJIGRhdGEpOworCQkvKiBEbyBub3QgcGVyZm9ybSBieXBhc3Mgb3BlcmF0aW9uIGlmIGJ5cGFzcyBzdGF0ZSBpcyBzYW1lKi8KKwkJaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID09IGRhdGEpCisJCQlicmVhazsKKwkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPSBkYXRhOworCQkvKiBoYXJkIGJ5cGFzcyAqLworCQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PSBEQVBfSEFSRF9CWVBBU1MpCisJCQltc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzKGRvbGJ5X2RhdGEpOworCQkvKiBzb2Z0IGJ5cGFzcyAqLworCQltc21fZHMyX2RhcF9jb21taXRfcGFyYW1zKGRvbGJ5X2RhdGEsIDApOworCWJyZWFrOworCisJY2FzZSBEQVBfQ01EX1NFVF9CWVBBU1NfVFlQRToKKwkJaWYgKGRhdGEgPT0gdHJ1ZSkKKwkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUgPQorCQkJCURBUF9IQVJEX0JZUEFTUzsKKwkJZWxzZQorCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9CisJCQkJREFQX1NPRlRfQllQQVNTOworCQlwcl9kZWJ1ZygiJXM6IGJ5cGFzcyB0eXBlICVkIiwgX19mdW5jX18sCisJCQkgZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSk7CisJYnJlYWs7CisKKwljYXNlIERBUF9DTURfU0VUX0FDVElWRV9ERVZJQ0U6CisJCXByX2RlYnVnKCIlczogREFQX0NNRF9TRVRfQUNUSVZFX0RFVklDRSBsZW5ndGggJWRcbiIsCisJCQlfX2Z1bmNfXywgZG9sYnlfZGF0YS0+bGVuZ3RoKTsKKwkJLyogVE9ETzogbmVlZCB0byBoYW5kbGUgbXVsdGlwbGUgaW5zdGFuY2UqLworCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlIHw9IGRvbGJ5X2RhdGEtPmRldmljZV9pZDsKKwkJcG9ydF9pZCA9IG1zbV9kczJfZGFwX2dldF9wb3J0X2lkKAorCQkJCQkJICBkb2xieV9kYXRhLT5kZXZpY2VfaWQsCisJCQkJCQkgIGRvbGJ5X2RhdGEtPmJlX2lkKTsKKwkJcHJfZGVidWcoIiVzOiBkZXZpY2UgaWQgMHgleCBhbGxfZGV2IDB4JXggcG9ydF9pZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBkb2xieV9kYXRhLT5kZXZpY2VfaWQsCisJCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlLCBwb3J0X2lkKTsKKwkJbXNtX2RzMl9kYXBfdXBkYXRlX2Rldl9tYXBfcG9ydF9pZChkb2xieV9kYXRhLT5kZXZpY2VfaWQsCisJCQkJCSAgIHBvcnRfaWQpOworCQlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgcG9ydCBpZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZW5kOworCQl9CisJYnJlYWs7CisJfQorZW5kOgorCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9zZXRfcGFyYW0odTMyIGNtZCwgdm9pZCAqYXJnKQoreworCWludCByYyA9IDAsIGlkeCwgaSwgaiwgb2ZmLCBwb3J0X2lkID0gMCwgY2RldiA9IDA7CisJaW50MzJfdCBudW1fZGV2aWNlID0gMDsKKwlpbnQzMl90IGRhdGEgPSAwOworCWludDMyX3QgZGV2X2FycltEUzJfRFNQX1NVUFBPUlRFRF9FTkRQX0RFVklDRV0gPSB7MH07CisJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAgKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICopYXJnOworCisJcmMgPSBtc21fZHMyX2RhcF91cGRhdGVfbnVtX2RldmljZXMoZG9sYnlfZGF0YSwgJm51bV9kZXZpY2UsIGRldl9hcnIsCisJCQkJICAgRFMyX0RTUF9TVVBQT1JURURfRU5EUF9ERVZJQ0UpOworCWlmIChudW1fZGV2aWNlID09IDAgfHwgcmMgPCAwKSB7CisJCXByX2VycigiJXM6IG51bSBkZXZpY2VzIDBcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2U7IGkrKykgeworCQlwb3J0X2lkID0gbXNtX2RzMl9kYXBfZ2V0X3BvcnRfaWQoZGV2X2FycltpXSwKKwkJCQkJCSAgZG9sYnlfZGF0YS0+YmVfaWQpOworCQlpZiAocG9ydF9pZCAhPSBET0xCWV9JTlZBTElEX1BPUlRfSUQpCisJCQltc21fZHMyX2RhcF91cGRhdGVfZGV2X21hcF9wb3J0X2lkKGRldl9hcnJbaV0sIHBvcnRfaWQpOworCisJCWNkZXYgPSBtc21fZHMyX2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2NhY2hlX2RldmljZXMoCisJCQkJCQkJICBkZXZfYXJyW2ldKTsKKwkJaWYgKGNkZXYgPCAwIHx8IGNkZXYgPj0gRE9MQllfTUFYX0NBQ0hFKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNhY2hlIGRldmljZSAlZCBmb3IgZGV2aWNlIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIGNkZXYsIGRldl9hcnJbaV0pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlbmQ7CisJCX0KKwkJcHJfZGVidWcoIiVzOnBvcnQ6JWQsYmU6JWQsZGV2OjB4JXgsY2RldjolZCxwYXJhbToweCV4LGxlbjolZFxuIgorCQkJICwgX19mdW5jX18sIHBvcnRfaWQsIGRvbGJ5X2RhdGEtPmJlX2lkLCBkZXZfYXJyW2ldLAorCQkJIGNkZXYsIGRvbGJ5X2RhdGEtPnBhcmFtX2lkLCBkb2xieV9kYXRhLT5sZW5ndGgpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EUzJfUEFSQU1TOyBpZHgrKykgeworCQkJLypwYXJhbWlkIGZyb20gdXNlciBzcGFjZSovCisJCQlpZiAoZG9sYnlfZGF0YS0+cGFyYW1faWQgPT0gZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaWR4ID4gTUFYX0RTMl9QQVJBTVMtMSkgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBpZCAweCV4IGF0IGlkeCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZG9sYnlfZGF0YS0+cGFyYW1faWQsIGlkeCk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCW9mZiA9IGRzMl9kYXBfcGFyYW1zX29mZnNldFtpZHhdOworCQlpZiAoKGRvbGJ5X2RhdGEtPmxlbmd0aCA8PSAwKSB8fAorCQkJKGRvbGJ5X2RhdGEtPmxlbmd0aCA+IFRPVEFMX0xFTkdUSF9EUzJfUEFSQU0gLSBvZmYpKSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGxlbmd0aCAlZCBhdCBpZHggJWRcbiIsCisJCQkJX19mdW5jX18sIGRvbGJ5X2RhdGEtPmxlbmd0aCwgaWR4KTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJLyogY2FjaGUgdGhlIHBhcmFtZXRlcnMgKi8KKwkJZHMyX2RhcF9wYXJhbXNbY2Rldl0uZGFwX3BhcmFtc19tb2RpZmllZFtpZHhdICs9IDE7CisJCWZvciAoaiA9IDA7IGogPCAgZG9sYnlfZGF0YS0+bGVuZ3RoOyBqKyspIHsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAmZG9sYnlfZGF0YS0+ZGF0YVtqXSkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6ZXJyb3IgZ2V0dGluZyBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJZHMyX2RhcF9wYXJhbXNbY2Rldl0ucGFyYW1zX3ZhbFtvZmYgKyBqXSA9IGRhdGE7CisJCQkJcHJfZGVidWcoIiVzOm9mZiAlZCx2YWxbaS9wOm8vcF0tWyVkIC8gJWRdXG4iLAorCQkJCQkgX19mdW5jX18sIG9mZiwgZGF0YSwKKwkJCQkJIGRzMl9kYXBfcGFyYW1zW2NkZXZdLgorCQkJCQkgcGFyYW1zX3ZhbFtvZmYgKyBqXSk7CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2dldF9wYXJhbSh1MzIgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJjID0gMCwgaSwgcG9ydF9pZCA9IDAsIGNvcHBfaWR4ID0gLTE7CisJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKilhcmc7CisJaW50MzJfdCAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEwsICpwYXJhbXNfdmFsdWUgPSBOVUxMOworCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSBET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0gKgorCQkJCQlzaXplb2YodWludDMyX3QpOworCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0KKwkJCURPTEJZX1BBUkFNX1BBWUxPQURfU0laRSAqIHNpemVvZih1aW50MzJfdCk7CisKKwkvKiBSZXR1cm4gZXJyb3Igb24gZ2V0IHBhcmFtIGluIHNvZnQgb3IgaGFyZCBieXBhc3MgKi8KKwlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkgeworCQlwcl9lcnIoIiVzOiBjYWxsZWQgaW4gYnlwYXNzX3R5cGUgJWQgYnlwYXNzICVkXG4iLCBfX2Z1bmNfXywKKwkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUsCisJCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogUmV0dXJuIGlmIGludmFsaWQgbGVuZ3RoICovCisJaWYgKChkb2xieV9kYXRhLT5sZW5ndGggPgorCSAgICAgIChET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0gLSBET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpKSB8fAorCSAgICAgIChkb2xieV9kYXRhLT5sZW5ndGggPD0gMCkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIGxlbmd0aCAlZCIsIGRvbGJ5X2RhdGEtPmxlbmd0aCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7CisJCWlmICgoZGV2X21hcFtpXS5hY3RpdmUpICYmCisJCQkoZGV2X21hcFtpXS5kZXZpY2VfaWQgJiBkb2xieV9kYXRhLT5kZXZpY2VfaWQpKSB7CisJCQlwb3J0X2lkID0gZGV2X21hcFtpXS5wb3J0X2lkOworCQkJY29wcF9pZHggPSBkZXZfbWFwW2ldLmNvcHBfaWR4OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChjb3BwX2lkeCA8IDApIHx8IChjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgY29wcF9pZHggJWQsIGRldl9tYXBbaV0uZGV2aWNlX2lkICV4XG4iLAorCQkgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBkZXZfbWFwW2ldLmRldmljZV9pZCk7CisKKwlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXBhcmFtc192YWx1ZSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCWlmIChkb2xieV9kYXRhLT5wYXJhbV9pZCA9PSBET0xCWV9QQVJBTV9JRF9WRVIpIHsKKwkJcmMgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkgICAgRE9MQllfQlVORExFX01PRFVMRV9JRCwKKwkJCQkgICAgRE9MQllfUEFSQU1fSURfVkVSLAorCQkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkJICAgIChjaGFyICopcGFyYW1zX3ZhbHVlKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RTMl9QQVJBTVM7IGkrKykKKwkJCWlmIChkczJfZGFwX3BhcmFtc19pZFtpXSA9PQorCQkJCWRvbGJ5X2RhdGEtPnBhcmFtX2lkKQorCQkJCWJyZWFrOworCQlpZiAoaSA+IE1BWF9EUzJfUEFSQU1TLTEpIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gaWQgMHgleCBhdCBpZCAlZFxuIiwgX19mdW5jX18sCisJCQkJZG9sYnlfZGF0YS0+cGFyYW1faWQsIGkpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlbmQ7CisJCX0gZWxzZSB7CisJCQlwYXJhbXNfbGVuZ3RoID0KKwkJCWRzMl9kYXBfcGFyYW1zX2xlbmd0aFtpXSAqIHNpemVvZih1aW50MzJfdCk7CisKKwkJCXJjID0gYWRtX2dldF9wYXJhbXMocG9ydF9pZCwgY29wcF9pZHgsCisJCQkJCSAgICBET0xCWV9CVU5ETEVfTU9EVUxFX0lELAorCQkJCQkgICAgZHMyX2RhcF9wYXJhbXNfaWRbaV0sCisJCQkJCSAgICBwYXJhbXNfbGVuZ3RoICsKKwkJCQkJICAgIHBhcmFtX3BheWxvYWRfbGVuLAorCQkJCQkgICAgKGNoYXIgKilwYXJhbXNfdmFsdWUpOworCQl9CisJfQorCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBwYXJhbXNfdmFsdWU7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWRvbGJ5X2RhdGEtPmRhdGEsCisJCQkmdXBkYXRlX3BhcmFtc192YWx1ZVtET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkVdLAorCQkJKGRvbGJ5X2RhdGEtPmxlbmd0aCAqIHNpemVvZih1aW50MzJfdCkpKSkgeworCQlwcl9lcnIoIiVzOiBlcnJvciBnZXR0aW5nIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBlbmQ7CisJfQorZW5kOgorCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbF9nZXQodTMyIGNtZCwgdm9pZCAqYXJnKQoreworCWludDMyX3QgKnZpc3VhbGl6ZXJfZGF0YSA9IE5VTEw7CisJaW50ICBpID0gMCwgcmV0ID0gMCwgcG9ydF9pZCA9IC0xLCBjYWNoZV9kZXYgPSAtMSwgY29wcF9pZHggPSAtMTsKKwlpbnQzMl90ICp1cGRhdGVfdmlzdWFsaXplcl9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSA9IChzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqKWFyZzsKKwl1aW50MzJfdCBvZmZzZXQsIGxlbmd0aCwgcGFyYW1zX2xlbmd0aDsKKwl1aW50MzJfdCBwYXJhbV9wYXlsb2FkX2xlbiA9CisJCURPTEJZX1BBUkFNX1BBWUxPQURfU0laRSAqIHNpemVvZih1aW50MzJfdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKKwkJaWYgKChkZXZfbWFwW2ldLmFjdGl2ZSkpICB7CisJCQlwb3J0X2lkID0gZGV2X21hcFtpXS5wb3J0X2lkOworCQkJY2FjaGVfZGV2ID0gZGV2X21hcFtpXS5jYWNoZV9kZXY7CisJCQljb3BwX2lkeCA9IGRldl9tYXBbaV0uY29wcF9pZHg7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwb3J0X2lkID09IERPTEJZX0lOVkFMSURfUE9SVF9JRCB8fAorCQkoY29wcF9pZHggPCAwKSB8fCAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlyZXQgPSAwOworCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOworCQlwcl9lcnIoIiVzOiBubyBkZXZpY2UgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZW5kOworCX0KKworCWxlbmd0aCA9IGRzMl9kYXBfcGFyYW1zW2NhY2hlX2Rldl0ucGFyYW1zX3ZhbFtET0xCWV9QQVJBTV9WQ05CX09GRlNFVF07CisKKwlpZiAobGVuZ3RoID4gRE9MQllfUEFSQU1fVkNOQl9NQVhfTEVOR1RIIHx8IGxlbmd0aCA8PSAwKSB7CisJCXJldCA9IDA7CisJCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDA7CisJCXByX2VycigiJXMgSW5jb3JyZWN0IFZDTkIgbGVuZ3RoIiwgX19mdW5jX18pOworCX0KKworCXBhcmFtc19sZW5ndGggPSAoMipsZW5ndGggKyBET0xCWV9WSVNfUEFSQU1fSEVBREVSX1NJWkUpICoKKwkJCQkJCQkgc2l6ZW9mKHVpbnQzMl90KTsKKworCXZpc3VhbGl6ZXJfZGF0YSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aXN1YWxpemVyX2RhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZG9sYnlfZGF0YS0+bGVuZ3RoID0gMDsKKwkJZ290byBlbmQ7CisJfQorCW1lbXNldCh2aXN1YWxpemVyX2RhdGEsIDB4MCwgcGFyYW1zX2xlbmd0aCk7CisKKwkvKiBSZXR1cm4gZXJyb3Igb24gZ2V0IHBhcmFtIGluIHNvZnQgb3IgaGFyZCBieXBhc3MgKi8KKwlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkgeworCQlwcl9kZWJ1ZygiJXM6IHZpc3VhbGl6ZXIgY2FsbGVkIGluIGJ5cGFzcywgcmV0dXJuIDBcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXQgPSAwOworCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOworCQlnb3RvIGVuZDsKKwl9CisKKwlvZmZzZXQgPSAwOworCXBhcmFtc19sZW5ndGggPSBsZW5ndGggKiBzaXplb2YodWludDMyX3QpOworCXJldCA9IGFkbV9nZXRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJICAgIERPTEJZX0JVTkRMRV9NT0RVTEVfSUQsCisJCQkgICAgRE9MQllfUEFSQU1fSURfVkNCRywKKwkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkgICAgKCgoY2hhciAqKSh2aXN1YWxpemVyX2RhdGEpKSArIG9mZnNldCkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZ2V0IHBhcmFtZXRlcnMgZmFpbGVkIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDA7CisJCWdvdG8gZW5kOworCX0KKwlvZmZzZXQgPSBsZW5ndGggKiBzaXplb2YodWludDMyX3QpOworCXJldCA9IGFkbV9nZXRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJICAgIERPTEJZX0JVTkRMRV9NT0RVTEVfSUQsCisJCQkgICAgRE9MQllfUEFSQU1fSURfVkNCRSwKKwkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkgICAgKCgoY2hhciAqKSh2aXN1YWxpemVyX2RhdGEpKSArIG9mZnNldCkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZ2V0IHBhcmFtZXRlcnMgZmFpbGVkIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDA7CisJCWdvdG8gZW5kOworCX0KKwl1cGRhdGVfdmlzdWFsaXplcl9kYXRhID0gdmlzdWFsaXplcl9kYXRhOworCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDIgKiBsZW5ndGg7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkICopZG9sYnlfZGF0YS0+ZGF0YSwKKwkJCSh2b2lkICopdXBkYXRlX3Zpc3VhbGl6ZXJfZGF0YSwKKwkJCShkb2xieV9kYXRhLT5sZW5ndGggKiBzaXplb2YodWludDMyX3QpKSkpIHsKKwkJcHJfZXJyKCIlczogY29weSB0byB1c2VyIGZhaWxlZCBmb3IgZGF0YVxuIiwgX19mdW5jX18pOworCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlrZnJlZSh2aXN1YWxpemVyX2RhdGEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtc21fZHMyX2RhcF9zZXRfc2VjdXJpdHlfY29udHJvbCh1MzIgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UgKmRvbGJ5X2xpY2Vuc2UgPQorCQkJCSAoKHN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlICopYXJnKTsKKwlwcl9kZWJ1ZygiJXM6IGRtaWQgJWQgbGljZW5zZSBrZXkgJWRcbiIsIF9fZnVuY19fLAorCQlkb2xieV9saWNlbnNlLT5kbWlkLCBkb2xieV9saWNlbnNlLT5saWNlbnNlX2tleSk7CisJY29yZV9zZXRfZG9sYnlfbWFudWZhY3R1cmVyX2lkKGRvbGJ5X2xpY2Vuc2UtPmRtaWQpOworCWNvcmVfc2V0X2xpY2Vuc2UoZG9sYnlfbGljZW5zZS0+bGljZW5zZV9rZXksIERPTEJZX0RTMV9MSUNFTlNFX0lEKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9wb3J0X3BhcmFtZXRlcnMoc3RydWN0IHNuZF9od2RlcCAqaHcsICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgYm9vbCBvcGVuKQoreworCWludCAgaSA9IDAsIGRldl9pZCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IG9wZW4gJWRcbiIsIF9fZnVuY19fLCBvcGVuKTsKKwlkczJfZGFwX3BhcmFtc19zdGF0ZXMubm9kZV9vcGVuZWQgPSBvcGVuOworCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID0gdHJ1ZTsKKwlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID0gMDsKKwlkczJfZGFwX3BhcmFtc19zdGF0ZXMudXNlX2NhY2hlID0gMDsKKwlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlID0gMDsKKwlkczJfZGFwX3BhcmFtc19zdGF0ZXMuY3VzdG9tX3N0ZXJlb19vbm9mZiA9IDA7CisJZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7CisJCWlmIChpID09IDApCisJCQlkZXZfbWFwW2ldLmRldmljZV9pZCA9IDA7CisJCWVsc2UgeworCQkJZGV2X2lkID0gKDEgPDwgKGktMSkpOworCQkJaWYgKGFsbF9zdXBwb3J0ZWRfZGV2aWNlcyAmIGRldl9pZCkKKwkJCQlkZXZfbWFwW2ldLmRldmljZV9pZCA9IGRldl9pZDsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCQlkZXZfbWFwW2ldLmNhY2hlX2RldiA9CisJCQltc21fZHMyX2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2NhY2hlX2RldmljZXMoCisJCQkJICAgIGRldl9tYXBbaV0uZGV2aWNlX2lkKTsKKwkJaWYgKGRldl9tYXBbaV0uY2FjaGVfZGV2IDwgMCB8fAorCQkJCWRldl9tYXBbaV0uY2FjaGVfZGV2ID49IERPTEJZX01BWF9DQUNIRSkKKwkJCXByX2VycigiJXM6IEludmFsaWQgY2FjaGUgZGV2aWNlICVkIGZvciBkZXZpY2UgMHgleFxuIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJZGV2X21hcFtpXS5jYWNoZV9kZXYsCisJCQkJCQlkZXZfbWFwW2ldLmRldmljZV9pZCk7CisJCWRldl9tYXBbaV0ucG9ydF9pZCA9IC0xOworCQlkZXZfbWFwW2ldLmFjdGl2ZSA9IGZhbHNlOworCQlkZXZfbWFwW2ldLnN0cmVhbV9yZWZfY291bnQgPSAwOworCQlkZXZfbWFwW2ldLmNhbF9kYXRhID0gTlVMTDsKKwkJZGV2X21hcFtpXS5jb3BwX2lkeCA9IC0xOworCQlwcl9kZWJ1ZygiJXM6IGRldmljZV9pZCAweCV4LCBjYWNoZV9kZXYgJWQgYWN0ICAlZFxuIiwgX19mdW5jX18sCisJCQkgZGV2X21hcFtpXS5kZXZpY2VfaWQsIGRldl9tYXBbaV0uY2FjaGVfZGV2LAorCQkJIGRldl9tYXBbaV0uYWN0aXZlKTsKKwl9CisJcmV0dXJuIDA7CisKK30KKworaW50IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHUzMiBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogY21kOiAweCV4XG4iLCBfX2Z1bmNfXywgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9TRVRfUEFSQU06CisJCXJldCA9IG1zbV9kczJfZGFwX3NldF9wYXJhbShjbWQsIGFyZyk7CisJYnJlYWs7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9QQVJBTToKKwkJcmV0ID0gbXNtX2RzMl9kYXBfZ2V0X3BhcmFtKGNtZCwgYXJnKTsKKwlicmVhazsKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0NPTU1BTkQ6CisJCXJldCA9IG1zbV9kczJfZGFwX2hhbmRsZV9jb21tYW5kcyhjbWQsIGFyZyk7CisJYnJlYWs7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFOgorCQlyZXQgPSBtc21fZHMyX2RhcF9zZXRfc2VjdXJpdHlfY29udHJvbChjbWQsIGFyZyk7CisJYnJlYWs7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSOgorCQlyZXQgPSBtc21fZHMyX2RhcF9wYXJhbV92aXN1YWxpemVyX2NvbnRyb2xfZ2V0KGNtZCwgYXJnKTsKKwlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHgleFxuIiwgX19mdW5jX18sIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBtc21fZHMyX2RhcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHUzMiBjbWQsIHZvaWQgKmFyZykKK3sKKworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOiBjbWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBjbWQpOworCWlmICghYXJnKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIGV2ZW50IHN0YXR1c1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNOgorCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfQ09NTUFORDogeworCQlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSBkb2xieV9kYXRhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZkb2xieV9kYXRhLCAodm9pZCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEpKSkgeworCQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAgLUVGQVVMVDsKKwkJCWdvdG8gZW5kOworCQl9CisJCXJldCA9IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChodywgZmlsZSwgY21kLCAmZG9sYnlfZGF0YSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0xJQ0VOU0U6IHsKKwkJc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UgZG9sYnlfbGljZW5zZTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmZG9sYnlfbGljZW5zZSwgKHZvaWQgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlKSkpIHsKKwkJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZW5kOworCQl9CisJCXJldCA9IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChodywgZmlsZSwgY21kLCAmZG9sYnlfbGljZW5zZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNOgorCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUjogeworCQlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSBkb2xieV9kYXRhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZkb2xieV9kYXRhLCAodm9pZCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEpKSkgeworCQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAgLUVGQVVMVDsKKwkJCWdvdG8gZW5kOworCQl9CisJCXJldCA9IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChodywgZmlsZSwgY21kLCAmZG9sYnlfZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCIlczogaW9jdGwgY21kICVkIHJldHVybmVkIGVyciAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgY21kLCByZXQpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmZG9sYnlfZGF0YSwKKwkJCXNpemVvZihzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSkpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlbmQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGNhbGxlZCB3aXRoIGludmFsaWQgY29udHJvbCAweCV4XG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CitlbmQ6CisJcmV0dXJuIHJldDsKKworfQorI2lmZGVmIENPTkZJR19DT01QQVQKK2ludCBtc21fZHMyX2RhcF9jb21wYXRfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICB1MzIgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGNtZDogMHgleFxuIiwgX19mdW5jX18sIGNtZCk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNMzI6CisJCWNtZCA9IFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNOworCQlnb3RvIGhhbmRsZV9zZXRfaW9jdGw7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EMzI6CisJCWNtZCA9IFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0NPTU1BTkQ7CitoYW5kbGVfc2V0X2lvY3RsOgorCXsKKwkJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMiBkb2xieV9kYXRhMzI7CisJCXN0cnVjdCBkb2xieV9wYXJhbV9kYXRhIGRvbGJ5X2RhdGE7CisKKwkJbWVtc2V0KCZkb2xieV9kYXRhMzIsIDAsIHNpemVvZihkb2xieV9kYXRhMzIpKTsKKwkJbWVtc2V0KCZkb2xieV9kYXRhLCAwLCBzaXplb2YoZG9sYnlfZGF0YSkpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRvbGJ5X2RhdGEzMiwgKHZvaWQgKilhcmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIpKSkgeworCQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAgLUVGQVVMVDsKKwkJCWdvdG8gZW5kOworCQl9CisJCWRvbGJ5X2RhdGEudmVyc2lvbiA9IGRvbGJ5X2RhdGEzMi52ZXJzaW9uOworCQlkb2xieV9kYXRhLmRldmljZV9pZCA9IGRvbGJ5X2RhdGEzMi5kZXZpY2VfaWQ7CisJCWRvbGJ5X2RhdGEuYmVfaWQgPSBkb2xieV9kYXRhMzIuYmVfaWQ7CisJCWRvbGJ5X2RhdGEucGFyYW1faWQgPSBkb2xieV9kYXRhMzIucGFyYW1faWQ7CisJCWRvbGJ5X2RhdGEubGVuZ3RoID0gZG9sYnlfZGF0YTMyLmxlbmd0aDsKKwkJZG9sYnlfZGF0YS5kYXRhID0gY29tcGF0X3B0cihkb2xieV9kYXRhMzIuZGF0YSk7CisKKwkJcmV0ID0gbXNtX2RzMl9kYXBfaW9jdGxfc2hhcmVkKGh3LCBmaWxlLCBjbWQsICZkb2xieV9kYXRhKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU0zMjoKKwkJY21kID0gU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU07CisJCWdvdG8gaGFuZGxlX2dldF9pb2N0bDsKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1ZJU1VBTElaRVIzMjoKKwkJY21kID0gU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUjsKK2hhbmRsZV9nZXRfaW9jdGw6CisJeworCQlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyIGRvbGJ5X2RhdGEzMjsKKwkJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgZG9sYnlfZGF0YTsKKworCQltZW1zZXQoJmRvbGJ5X2RhdGEzMiwgMCwgc2l6ZW9mKGRvbGJ5X2RhdGEzMikpOworCQltZW1zZXQoJmRvbGJ5X2RhdGEsIDAsIHNpemVvZihkb2xieV9kYXRhKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZG9sYnlfZGF0YTMyLCAodm9pZCAqKWFyZywKKwkJCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9ICAtRUZBVUxUOworCQkJZ290byBlbmQ7CisJCX0KKwkJZG9sYnlfZGF0YS52ZXJzaW9uID0gZG9sYnlfZGF0YTMyLnZlcnNpb247CisJCWRvbGJ5X2RhdGEuZGV2aWNlX2lkID0gZG9sYnlfZGF0YTMyLmRldmljZV9pZDsKKwkJZG9sYnlfZGF0YS5iZV9pZCA9IGRvbGJ5X2RhdGEzMi5iZV9pZDsKKwkJZG9sYnlfZGF0YS5wYXJhbV9pZCA9IGRvbGJ5X2RhdGEzMi5wYXJhbV9pZDsKKwkJZG9sYnlfZGF0YS5sZW5ndGggPSBkb2xieV9kYXRhMzIubGVuZ3RoOworCQlkb2xieV9kYXRhLmRhdGEgPSBjb21wYXRfcHRyKGRvbGJ5X2RhdGEzMi5kYXRhKTsKKworCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bF9zaGFyZWQoaHcsIGZpbGUsIGNtZCwgJmRvbGJ5X2RhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IGlvY3RsIGNtZCAlZCwgcmV0dXJuZWQgZXJyICVkXG4iLAorCQkJCV9fZnVuY19fLCBjbWQsIHJldCk7CisJCWRvbGJ5X2RhdGEzMi5sZW5ndGggPSBkb2xieV9kYXRhLmxlbmd0aDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmRvbGJ5X2RhdGEzMiwKKwkJCXNpemVvZihzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyKSkpIHsKKwkJCXByX2VycigiJXM6IENvcHkgdG8gdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFMzI6IHsKKwkJc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UzMiBkb2xieV9saWNlbnNlMzI7CisJCXN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlIGRvbGJ5X2xpY2Vuc2U7CisKKwkJY21kID0gU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfTElDRU5TRTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmRvbGJ5X2xpY2Vuc2UzMiwgKHZvaWQgKilhcmcsCisJCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UzMikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlkb2xieV9saWNlbnNlLmRtaWQgPSBkb2xieV9saWNlbnNlMzIuZG1pZDsKKwkJZG9sYnlfbGljZW5zZS5saWNlbnNlX2tleSA9IGRvbGJ5X2xpY2Vuc2UzMi5saWNlbnNlX2tleTsKKwkJcmV0ID0gbXNtX2RzMl9kYXBfaW9jdGxfc2hhcmVkKGh3LCBmaWxlLCBjbWQsICZkb2xieV9saWNlbnNlKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGNhbGxlZCB3aXRoIGludmFsaWQgY29udHJvbCAweCV4XG4iLAorCQkJX19mdW5jX18sIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorZW5kOgorCXJldHVybiByZXQ7CisKK30KKyNlbmRpZgorCitpbnQgbXNtX2RzMl9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCisJCSAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX29uKQoreworCWludCByZXQgPSAwLCBpZHggPSAtMSwgaTsKKwlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSBkb2xieV9kYXRhOworCisJc3RydWN0IGF1ZHByb2Nfc29mdHZvbHVtZV9wYXJhbXMgc29mdHZvbCA9IHsKKwkJLnBlcmlvZCA9IERPTEJZX1NPRlRfVk9MVU1FX1BFUklPRCwKKwkJLnN0ZXAgPSBET0xCWV9TT0ZUX1ZPTFVNRV9TVEVQLAorCQkucmFtcGluZ2N1cnZlID0gRE9MQllfU09GVF9WT0xVTUVfQ1VSVkVfRVhQLAorCX07CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQgICVkLCBjb3BwX2lkeCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKworCWlmIChwb3J0X2lkICE9IERPTEJZX0lOVkFMSURfUE9SVF9JRCkgeworCQlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKKwkJCWlmICgoZGV2X21hcFtpXS5wb3J0X2lkID09IHBvcnRfaWQpICYmCisJCQkJLyogZGV2aWNlIHBhcnQgb2YgYWN0aXZlIGRldmljZSAqLworCQkJCShkZXZfbWFwW2ldLmRldmljZV9pZCAmCisJCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSkpIHsKKwkJCQlpZHggPSBpOworCQkJCS8qIEdpdmUgcHJpb3JpdHkgdG8gaGVhZHNldCBpbiBjYXNlIG9mCisJCQkJICogY29tYm8gZGV2aWNlCisJCQkJICovCisJCQkJaWYgKGRldl9tYXBbaV0uZGV2aWNlX2lkID09IFNQRUFLRVIpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGlkeCA8IDApIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggZm9yIHBvcnQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZW5kOworCQl9CisJCXByX2RlYnVnKCIlczppbmRleCAlZCwgZGV2WzB4JXgsMHgleF1cbiIsIF9fZnVuY19fLCBpZHgsCisJCQkgZGV2X21hcFtpZHhdLmRldmljZV9pZCwgZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSk7CisJCWRldl9tYXBbaWR4XS5hY3RpdmUgPSB0cnVlOworCQlkZXZfbWFwW2lkeF0uY29wcF9pZHggPSBjb3BwX2lkeDsKKwkJZG9sYnlfZGF0YS5wYXJhbV9pZCA9IERPTEJZX0NPTU1JVF9BTExfVE9fRFNQOworCQlkb2xieV9kYXRhLmxlbmd0aCA9IDA7CisJCWRvbGJ5X2RhdGEuZGF0YSA9IE5VTEw7CisJCWRvbGJ5X2RhdGEuZGV2aWNlX2lkID0gZGV2X21hcFtpZHhdLmRldmljZV9pZDsKKwkJcHJfZGVidWcoIiVzOiAgaWR4ICAlZCwgYWN0aXZlICVkLCBkZXYgaWQgMHgleCwgcmVmIGNvdW50ICVkXG4iLAorCQkJIF9fZnVuY19fLCBpZHgsIGRldl9tYXBbaWR4XS5hY3RpdmUsCisJCQkgZGV2X21hcFtpZHhdLmRldmljZV9pZCwKKwkJCSBkZXZfbWFwW2lkeF0uc3RyZWFtX3JlZl9jb3VudCk7CisJCWlmIChkZXZfbWFwW2lkeF0uc3RyZWFtX3JlZl9jb3VudCA9PSAwKSB7CisJCQkvKnBlcmZvcm0gbmV4dCAzIGZ1bmMgb25seSBpZiBoYXJkIGJ5cGFzcyBlbmFibGVkKi8KKwkJCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09CisJCQkJREFQX0hBUkRfQllQQVNTKSB7CisJCQkJcmV0ID0gbXNtX2RzMl9kYXBfYWxsb2NfYW5kX3N0b3JlX2NhbF9kYXRhKGlkeCwKKwkJCQkJCSAgICAgICBBRE1fUEFUSF9QTEFZQkFDSywgMCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jIGFuZCBzdG9yZSBjYWwgZGF0YSBmb3IgaWR4ICVkLCBkZXZpY2UgJWQsIGNvcHBfaWR4ICVkIiwKKwkJCQkJICAgICAgIF9fZnVuY19fLAorCQkJCQkgICAgICAgaWR4LCBkZXZfbWFwW2lkeF0uZGV2aWNlX2lkLAorCQkJCQkgICAgICAgZGV2X21hcFtpZHhdLmNvcHBfaWR4KTsKKwkJCQkJZGV2X21hcFtpZHhdLmFjdGl2ZSA9IGZhbHNlOworCQkJCQlkZXZfbWFwW2lkeF0uY29wcF9pZHggPSAtMTsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCisJCQkJcmV0ID0gYWRtX3NldF9zb2Z0dm9sdW1lKHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkJCSAmc29mdHZvbCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJcHJfZXJyKCIlczogU29mdCB2b2x1bWUgcmV0IGVycm9yICVkXG4iLAorCQkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJCWRldl9tYXBbaWR4XS5hY3RpdmUgPSBmYWxzZTsKKwkJCQkJZGV2X21hcFtpZHhdLmNvcHBfaWR4ID0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJCXJldCA9IG1zbV9kczJfZGFwX2luaXRfbW9kdWxlc19pbl90b3BvbG9neSgKKwkJCQkJCQlpZHgpOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBpbml0IG1vZHVsZXMgaW4gdG9wb2xvZnkgZm9yIGlkeCAlZCwgZGV2aWNlICVkLCBjb3BwX2lkeCAlZFxuIiwKKwkJCQkJICAgICAgIF9fZnVuY19fLCBpZHgsCisJCQkJCSAgICAgICBkZXZfbWFwW2lkeF0uZGV2aWNlX2lkLAorCQkJCQkgICAgICAgZGV2X21hcFtpZHhdLmNvcHBfaWR4KTsKKwkJCQkJZGV2X21hcFtpZHhdLmFjdGl2ZSA9IGZhbHNlOworCQkJCQlkZXZfbWFwW2lkeF0uY29wcF9pZHggPSAtMTsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCisJCQlyZXQgPSAgbXNtX2RzMl9kYXBfY29tbWl0X3BhcmFtcygmZG9sYnlfZGF0YSwgMCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2RlYnVnKCIlczogY29tbWl0IHBhcmFtcyByZXQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwkJZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQrKzsKKwkJaWYgKGlzX2N1c3RvbV9zdGVyZW9fb24pIHsKKwkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5jdXN0b21fc3RlcmVvX29ub2ZmID0KKwkJCQlpc19jdXN0b21fc3RlcmVvX29uOworCQkJc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaWR4LAorCQkJCQkJaXNfY3VzdG9tX3N0ZXJlb19vbik7CisJCX0KKwl9CisKK2VuZDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1zbV9kczJfZGFwX2RlaW5pdChpbnQgcG9ydF9pZCkKK3sKKwkvKgorCSAqIEdldCB0aGUgYWN0aXZlIHBvcnQgY29ycnJlc3BvbmRpbmcgdG8gdGhlIGFjdGl2ZSBkZXZpY2UKKwkgKiBDaGVjayBpZiB0aGlzIGlzIHNhbWUgYXMgaW5jb21pbmcgcG9ydAorCSAqIFNldCBpdCB0byBpbnZhbGlkCisJICovCisJaW50IGlkeCA9IC0xLCBpOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJaWYgKHBvcnRfaWQgIT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCWZvciAoaSA9IDA7IGkgPCBEUzJfREVWSUNFU19BTEw7IGkrKykgeworCQkJLyogQWN0aXZlIHBvcnQgKi8KKwkJCWlmICgoZGV2X21hcFtpXS5wb3J0X2lkID09IHBvcnRfaWQpICYmCisJCQkJLyogZGV2aWNlIHBhcnQgb2YgYWN0aXZlIGRldmljZSAqLworCQkJCShkZXZfbWFwW2ldLmRldmljZV9pZCAmCisJCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSkgJiYKKwkJCQkvKgorCQkJCSAqIE5lZWQgdGhpcyBjaGVjayB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBvZgorCQkJCSAqIGFjdGl2ZSBkZXZpY2UgYmVpbmcgc2V0IGFuZCBwbGF5YmFjaworCQkJCSAqIGluc3RhbmNlIG9wZW5lZAorCQkJCSAqLworCQkJCS8qIGFjdGl2ZSBkZXZpY2UqLworCQkJCWRldl9tYXBbaV0uYWN0aXZlKSB7CisJCQkJaWR4ID0gaTsKKwkJCQlpZiAoZGV2X21hcFtpXS5kZXZpY2VfaWQgPT0gU1BFQUtFUikKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaWR4IDwgMCkgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCBmb3IgcG9ydCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCQlyZXR1cm47CisJCX0KKwkJcHJfZGVidWcoIiVzOmluZGV4ICVkLCBkZXYgWzB4JXgsIDB4JXhdXG4iLCBfX2Z1bmNfXywgaWR4LAorCQkJIGRldl9tYXBbaWR4XS5kZXZpY2VfaWQsIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UpOworCQlkZXZfbWFwW2lkeF0uc3RyZWFtX3JlZl9jb3VudC0tOworCQlpZiAoZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQgPT0gMCkgeworCQkJLypwZXJmb3JtIG5leHQgZnVuYyBvbmx5IGlmIGhhcmQgYnlwYXNzIGVuYWJsZWQqLworCQkJaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUgPT0KKwkJCQlEQVBfSEFSRF9CWVBBU1MpIHsKKwkJCQltc21fZHMyX2RhcF9mcmVlX2NhbF9kYXRhKGlkeCk7CisJCQl9CisJCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlICY9IH5kZXZfbWFwW2lkeF0uZGV2aWNlX2lkOworCQkJZGV2X21hcFtpZHhdLmFjdGl2ZSA9IGZhbHNlOworCQkJZGV2X21hcFtpZHhdLmNvcHBfaWR4ID0gLTE7CisJCX0KKwkJcHJfZGVidWcoIiVzOmlkeCAgJWQsIGFjdGl2ZSAlZCwgZGV2IGlkIDB4JXggcmVmIGNvdW50ICVkXG4iLAorCQkJIF9fZnVuY19fLCBpZHgsIGRldl9tYXBbaWR4XS5hY3RpdmUsCisJCQkgZGV2X21hcFtpZHhdLmRldmljZV9pZCwgZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQpOworCX0KK30KKworaW50IG1zbV9kczJfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkJCWJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQoreworCWludCBpZHggPSAtMSwgcmMgPSAwLCBpOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJaWYgKHBvcnRfaWQgIT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7CisJCWZvciAoaSA9IDA7IGkgPCBEUzJfREVWSUNFU19BTEw7IGkrKykgeworCQkJaWYgKChkZXZfbWFwW2ldLnBvcnRfaWQgPT0gcG9ydF9pZCkgJiYKKwkJCQkvKiBkZXZpY2UgcGFydCBvZiBhY3RpdmUgZGV2aWNlICovCisJCQkJKGRldl9tYXBbaV0uZGV2aWNlX2lkICYKKwkJCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlKSkgeworCQkJCWlkeCA9IGk7CisJCQkJaWYgKGRldl9tYXBbaV0uZGV2aWNlX2lkID09IFNQRUFLRVIpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGlkeCA8IDApIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggZm9yIHBvcnQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5jdXN0b21fc3RlcmVvX29ub2ZmID0KKwkJCWlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZDsKKwkJcmMgPSBzZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpZHgsCisJCQkJCWlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IEN1c3RvbSBzdGVyZW8gZXJyICVkIG9uIHBvcnQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjLCBwb3J0X2lkKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfYWxsb2NfYW5kX3N0b3JlX2NhbF9kYXRhKGludCBkZXZfbWFwX2lkeCwgaW50IHBhdGgsCisJCQkJCSAgICBpbnQgcGVyZl9tb2RlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2ZyZWVfY2FsX2RhdGEoaW50IGRldl9tYXBfaWR4KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfY2FsX2RhdGEoaW50IGRldl9tYXBfaWR4KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2Nhbl9lbmFibGVfbW9kdWxlKGludDMyX3QgbW9kdWxlX2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2luaXRfbW9kdWxlc19pbl90b3BvbG9neShpbnQgZGV2X21hcF9pZHgpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKGludDMyX3QgKmRhcF9wYXJhbXNfbW9kaWZpZWQsCisJCQkJICAgIGludDMyX3QgaWR4LCBpbnQzMl90IGNvbW1pdCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdGljIGludCBtc21fZHMyX2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2NhY2hlX2RldmljZXMoaW50MzJfdCBkZXZpY2VfaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfdXBkYXRlX251bV9kZXZpY2VzKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICpkb2xieV9kYXRhLAorCQkJCSAgICAgIGludDMyX3QgKm51bV9kZXZpY2UsIGludDMyX3QgKmRldl9hcnIsCisJCQkJICAgICAgaW50MzJfdCBhcnJheV9zaXplKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2NvbW1pdF9wYXJhbXMoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEsCisJCQkJIGludCBjb21taXQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfaGFuZGxlX2NvbW1hbmRzKHUzMiBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9zZXRfcGFyYW0odTMyIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2dldF9wYXJhbSh1MzIgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2VuZF9lbmRfcG9pbnQoaW50IGRldl9tYXBfaWR4LCBpbnQgZW5kcF9pZHgpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2VuZF9jYWNoZWRfcGFyYW1zKGludCBkZXZfbWFwX2lkeCwKKwkJCQkJICBpbnQgY29tbWl0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX3NldF92c3BlX3ZkaGUoaW50IGRldl9tYXBfaWR4LAorCQkJCSAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfcGFyYW1fdmlzdWFsaXplcl9jb250cm9sX2dldCgKKwkJCXUzMiBjbWQsIHZvaWQgKmFyZywKKwkJCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICpiZWRhaXMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2V0X3NlY3VyaXR5X2NvbnRyb2wodTMyIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiAwCit9CisKK3N0YXRpYyBpbnQgbXNtX2RzMl9kYXBfdXBkYXRlX2Rldl9tYXBfcG9ydF9pZChpbnQzMl90IGRldmljZV9pZCwgaW50IHBvcnRfaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IG1zbV9kczJfZGFwX2dldF9wb3J0X2lkKAorCQlpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBiZV9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICpkb2xieV9kYXRhKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kczJfZGFwX2hhbmRsZV9ieXBhc3Nfd2FpdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCQkgIGludCB3YWl0X3RpbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGludCBkZXZfbWFwX2lkeCwKKwkJCQkJYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgcXRpX3NldF9jdXN0b21fc3RlcmVvX29uKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19vbikKK3sKKwlyZXR1cm4gMDsKK30KK2ludCBzZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgZGV2X21hcF9pZHgsCisJCQkgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgbXNtX2RzMl9kYXBfaW9jdGxfc2hhcmVkKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdTMyIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qQ09ORklHX0RPTEJZX0RTMiovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRzMi1kYXAtY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRzMi1kYXAtY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMjA2OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHMyLWRhcC1jb25maWcuaApAQCAtMCwwICsxLDEyMSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX01TTV9EUzJfREFQX0NPTkZJR19IXworI2RlZmluZSBfTVNNX0RTMl9EQVBfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlICJtc20tZG9sYnktY29tbW9uLmgiCisjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KKyNpbmNsdWRlIDx1YXBpL3NvdW5kL2RldmRlcF9wYXJhbXMuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIgeworCXMzMiB2ZXJzaW9uOworCXMzMiBkZXZpY2VfaWQ7CisJczMyIGJlX2lkOworCXMzMiBwYXJhbV9pZDsKKwlzMzIgbGVuZ3RoOworCWNvbXBhdF91cHRyX3QgZGF0YTsKK307CisKK3N0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlMzIgeworCWNvbXBhdF91cHRyX3QgZG1pZDsKKwljb21wYXRfdXB0cl90IGxpY2Vuc2Vfa2V5OworfTsKKworCisjZGVmaW5lIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNMzJcCisJCV9JT1dSKCdVJywgMHgxMCwgc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMikKKyNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU0zMlwKKwkJX0lPUignVScsIDB4MTEsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIpCisjZGVmaW5lIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0NPTU1BTkQzMlwKKwkJX0lPV1IoJ1UnLCAweDEzLCBzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyKQorI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFMzJcCisJCV9JT1dSKCdVJywgMHgxNCwgc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UzMikKKyNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUjMyXAorCQlfSU9SKCdVJywgMHgxNSwgc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMikKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RPTEJZX0RTMgorLyogRE9MQlkgRE9MQlkgR1VJRFMgKi8KKyNkZWZpbmUgRFMyX01PRFVMRV9JRAkJCTB4MDAwMTA3NzUKKworI2RlZmluZSBEUzJfRFNQX1NVUFBPUlRFRF9FTkRQX0RFVklDRQkJMTcKKyNkZWZpbmUgRFMyX0RFVklDRVNfQUxMCQkJCTMyIC8qIGVudW0gdmFsIGlzIDQgYnl0ZXMgKi8KKworZW51bSB7CisKKwlEQVBfQ01EX0NPTU1JVF9BTEwgICAgICAgICA9IDAsCisJREFQX0NNRF9DT01NSVRfQ0hBTkdFRCAgICAgPSAxLAorCURBUF9DTURfVVNFX0NBQ0hFX0ZPUl9JTklUID0gMiwKKwlEQVBfQ01EX1NFVF9CWVBBU1MgICAgICAgICA9IDMsCisJREFQX0NNRF9TRVRfQUNUSVZFX0RFVklDRSAgPSA0LAorCURBUF9DTURfU0VUX0JZUEFTU19UWVBFICAgID0gNSwKK307CisKKyNkZWZpbmUgRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RIICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE9MQllfUEFSQU1fSU5UX0VORFBfT0ZGU0VUCQkoRE9MQllfUEFSQU1fUFNUR19PRkZTRVQgKyBcCisJCQkJCQkJRE9MQllfUEFSQU1fUFNUR19MRU5HVEgpCisjZGVmaW5lIE1BWF9EUzJfUEFSQU1TCQkJCTQ4CisjZGVmaW5lIE1BWF9EUzJfQ1RSTF9QQVJBTVMJCQk0CisjZGVmaW5lIEFMTF9EUzJfUEFSQU1TCQkJCShNQVhfRFMyX1BBUkFNUyArIFwKKwkJCQkJCQlNQVhfRFMyX0NUUkxfUEFSQU1TKQorI2RlZmluZSBUT1RBTF9MRU5HVEhfRFMyX1BBUkFNIChUT1RBTF9MRU5HVEhfRE9MQllfUEFSQU0gKyAxKQorCitpbnQgbXNtX2RzMl9kYXBfdXBkYXRlX3BvcnRfcGFyYW1ldGVycyhzdHJ1Y3Qgc25kX2h3ZGVwICpodywgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBib29sIG9wZW4pOworaW50IG1zbV9kczJfZGFwX2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgdTMyIGNtZCwgdm9pZCAqYXJnKTsKK2ludCBtc21fZHMyX2RhcF9jb21wYXRfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsCisJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICB1MzIgY21kLCB2b2lkICphcmcpOworaW50IG1zbV9kczJfZGFwX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGNoYW5uZWxzLAorCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19vbik7Cit2b2lkIG1zbV9kczJfZGFwX2RlaW5pdChpbnQgcG9ydF9pZCk7CitpbnQgbXNtX2RzMl9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkJYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOworLyogRG9sYnkgRE9MQlkgZW5kICovCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2RzMl9kYXBfdXBkYXRlX3BvcnRfcGFyYW1ldGVycyhzdHJ1Y3Qgc25kX2h3ZGVwICpodywKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgICAgYm9vbCBvcGVuKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBtc21fZHMyX2RhcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIHUzMiBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgdTMyIGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCisJCSAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX29uKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2RzMl9kYXBfZGVpbml0KGludCBwb3J0X2lkKSB7IH0KKworc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtZWFnbGUuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHRzLWVhZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkNTVkYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHRzLWVhZ2xlLmMKQEAgLTAsMCArMSwxNjU5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hdWRpb19lZmZlY3RzLmg+CisjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc20tZHRzLWVhZ2xlLmg+CisjaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+CisKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKKworI2RlZmluZSBJT05fTUVNX1NJWkUgIDEzMTA3MgorI2RlZmluZSBERVBDX01BWF9TSVpFIDUyNDI4OAorCisjZGVmaW5lIE1QU1QJCQkJQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QT1NUTUlYCisjZGVmaW5lIE1QUkUJCQkJQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QUkVNSVgKKworI2RlZmluZSBlYWdsZV92b2xfZGJnKGZtdCwgLi4uKSBcCisJcHJfZGVidWcoIkRUU19FQUdMRV9EUklWRVJfVk9MVU1FOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV92b2xfZXJyKGZtdCwgLi4uKSBcCisJcHJfZXJyKCJEVFNfRUFHTEVfRFJJVkVSX1ZPTFVNRTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfZHJ2X2RiZyhmbXQsIC4uLikgXAorCXByX2RlYnVnKCJEVFNfRUFHTEVfRFJJVkVSOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9kcnZfZXJyKGZtdCwgLi4uKSBcCisJcHJfZXJyKCJEVFNfRUFHTEVfRFJJVkVSOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9wcmVjYWNoZV9kYmcoZm10LCAuLi4pIFwKKwlwcl9kZWJ1ZygiRFRTX0VBR0xFX0RSSVZFUl9TRU5EQ0FDSEVfUFJFOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9wcmVjYWNoZV9lcnIoZm10LCAuLi4pIFwKKwlwcl9lcnIoIkRUU19FQUdMRV9EUklWRVJfU0VORENBQ0hFX1BSRTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfcG9zdGNhY2hlX2RiZyhmbXQsIC4uLikgXAorCXByX2RlYnVnKCJEVFNfRUFHTEVfRFJJVkVSX1NFTkRDQUNIRV9QT1NUOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9wb3N0Y2FjaGVfZXJyKGZtdCwgLi4uKSBcCisJcHJfZXJyKCJEVFNfRUFHTEVfRFJJVkVSX1NFTkRDQUNIRV9QT1NUOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9pb2N0bF9kYmcoZm10LCAuLi4pIFwKKwlwcl9kZWJ1ZygiRFRTX0VBR0xFX0RSSVZFUl9JT0NUTDogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfaW9jdGxfZXJyKGZtdCwgLi4uKSBcCisJcHJfZXJyKCJEVFNfRUFHTEVfRFJJVkVSX0lPQ1RMOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9hc21fZGJnKGZtdCwgLi4uKSBcCisJcHJfZGVidWcoIkRUU19FQUdMRV9EUklWRVJfQVNNOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlYWdsZV9hc21fZXJyKGZtdCwgLi4uKSBcCisJcHJfZXJyKCJEVFNfRUFHTEVfRFJJVkVSX0FTTTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfYWRtX2RiZyhmbXQsIC4uLikgXAorCXByX2RlYnVnKCJEVFNfRUFHTEVfRFJJVkVSX0FETTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfYWRtX2VycihmbXQsIC4uLikgXAorCXByX2VycigiRFRTX0VBR0xFX0RSSVZFUl9BRE06ICIgZm10ICJcbiIsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGVhZ2xlX2VuYWJsZV9kYmcoZm10LCAuLi4pIFwKKwlwcl9kZWJ1ZygiRFRTX0VBR0xFX0VOQUJMRTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfZW5hYmxlX2VycihmbXQsIC4uLikgXAorCXByX2VycigiRFRTX0VBR0xFX0VOQUJMRTogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWFnbGVfaW9jdGxfaW5mbyhmbXQsIC4uLikgXAorCXByX2VycigiRFRTX0VBR0xFX0lPQ1RMOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorCitlbnVtIHsKKwlBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFID0gMCwKKwlBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsCisJQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULAorCUFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLAorCUFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTywKKwlBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCwKKwlBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lULAorCUFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsCisJQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLAorCUFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwKKwlBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMLAorCUFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQsCisJQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCwKKwlBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksCisJQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFLAorCUFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKwlBVURJT19ERVZJQ0VfT1VUX0FOQ19IRUFEU0VULAorCUFVRElPX0RFVklDRV9PVVRfQU5DX0hFQURQSE9ORSwKKwlBVURJT19ERVZJQ0VfT1VUX1BST1hZLAorCUFVRElPX0RFVklDRV9PVVRfRk0sCisJQVVESU9fREVWSUNFX09VVF9GTV9UWCwKKworCUFVRElPX0RFVklDRV9PVVRfQ09VTlQKK307CisKKyNkZWZpbmUgQVVESU9fREVWSUNFX0NPTUJPIDB4NDAwMDAwIC8qIGJpdCAyMyAqLworCitlbnVtIHsgLyogY2FjaGUgYmxvY2sgKi8KKwlDQl8wID0gMCwKKwlDQl8xLAorCUNCXzIsCisJQ0JfMywKKwlDQl80LAorCUNCXzUsCisJQ0JfNiwKKwlDQl83LAorCisJQ0JfQ09VTlQKK307CisKK2VudW0geyAvKiBjYWNoZSBibG9jayBkZXNjcmlwdGlvbiAqLworCUNCRF9ERVZfTUFTSyA9IDAsCisJQ0JEX09GRlNHLAorCUNCRF9DTUQwLAorCUNCRF9TWjAsCisJQ0JEX09GRlMxLAorCUNCRF9DTUQxLAorCUNCRF9TWjEsCisJQ0JEX09GRlMyLAorCUNCRF9DTUQyLAorCUNCRF9TWjIsCisJQ0JEX09GRlMzLAorCUNCRF9DTUQzLAorCUNCRF9TWjMsCisKKwlDQkRfQ09VTlQsCit9OworCitzdGF0aWMgczMyIF9meF9sb2dOKHMzMiB4KQoreworCXMzMiB0LCB5ID0gMHhhNjVhZjsKKworCWlmICh4IDwgMHgwMDAwODAwMCkgeworCQl4IDw8PSAxNjsgeSAtPSAweGIxNzIxOyB9CisJaWYgKHggPCAweDAwODAwMDAwKSB7CisJCXggPDw9IDg7IHkgLT0gMHg1OGI5MTsgfQorCWlmICh4IDwgMHgwODAwMDAwMCkgeworCQl4IDw8PSA0OyB5IC09IDB4MmM1Yzg7IH0KKwlpZiAoeCA8IDB4MjAwMDAwMDApIHsKKwkJeCA8PD0gMjsgeSAtPSAweDE2MmU0OyB9CisJaWYgKHggPCAweDQwMDAwMDAwKSB7CisJCXggPDw9IDE7IHkgLT0gMHgwYjE3MjsgfQorCXQgPSB4ICsgKHggPj4gMSk7CisJaWYgKCh0ICYgMHg4MDAwMDAwMCkgPT0gMCkgeworCQl4ID0gdDsgeSAtPSAweDA2N2NkOyB9CisJdCA9IHggKyAoeCA+PiAyKTsKKwlpZiAoKHQgJiAweDgwMDAwMDAwKSA9PSAwKSB7CisJCXggPSB0OyB5IC09IDB4MDM5MjA7IH0KKwl0ID0geCArICh4ID4+IDMpOworCWlmICgodCAmIDB4ODAwMDAwMDApID09IDApIHsKKwkJeCA9IHQ7IHkgLT0gMHgwMWUyNzsgfQorCXQgPSB4ICsgKHggPj4gNCk7CisJaWYgKCh0ICYgMHg4MDAwMDAwMCkgPT0gMCkgeworCQl4ID0gdDsgeSAtPSAweDAwZjg1OyB9CisJdCA9IHggKyAoeCA+PiA1KTsKKwlpZiAoKHQgJiAweDgwMDAwMDAwKSA9PSAwKSB7CisJCXggPSB0OyB5IC09IDB4MDA3ZTE7IH0KKwl0ID0geCArICh4ID4+IDYpOworCWlmICgodCAmIDB4ODAwMDAwMDApID09IDApIHsKKwkJeCA9IHQ7IHkgLT0gMHgwMDNmODsgfQorCXQgPSB4ICsgKHggPj4gNyk7CisJaWYgKCh0ICYgMHg4MDAwMDAwMCkgPT0gMCkgeworCQl4ID0gdDsgeSAtPSAweDAwMWZlOyB9CisJeCA9IDB4ODAwMDAwMDAgLSB4OworCXkgLT0geCA+PiAxNTsKKwlyZXR1cm4geTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpfZ2V0ZChzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKmRlcGQpCit7CisJcmV0dXJuICh2b2lkICopKCgoY2hhciAqKWRlcGQpICsgc2l6ZW9mKHN0cnVjdCBkdHNfZWFnbGVfcGFyYW1fZGVzYykpOworfQorCitzdGF0aWMgaW50IF9yZWZfY250OworLyogZHRzIGVhZ2xlIHBhcmFtZXRlciBjYWNoZSAqLworc3RhdGljIGNoYXIgKl9kZXBjOworc3RhdGljIHUzMiBfZGVwY19zaXplOworc3RhdGljIHMzMiBfY19ibFtDQl9DT1VOVF1bQ0JEX0NPVU5UXTsKK3N0YXRpYyB1MzIgX2RldmljZV9wcmltYXJ5Oworc3RhdGljIHUzMiBfZGV2aWNlX2FsbDsKKy8qIElPTiBzdGF0ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaW9uX2NsaWVudCAqX2lvbl9jbGllbnQ7CitzdGF0aWMgc3RydWN0IGlvbl9oYW5kbGUgKl9pb25faGFuZGxlOworc3RhdGljIHN0cnVjdCBwYXJhbV9vdXRiYW5kIF9wbzsKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICpfYWNfTlQ7CitzdGF0aWMgc3RydWN0IGlvbl9jbGllbnQgKl9pb25fY2xpZW50X05UOworc3RhdGljIHN0cnVjdCBpb25faGFuZGxlICpfaW9uX2hhbmRsZV9OVDsKK3N0YXRpYyBzdHJ1Y3QgcGFyYW1fb3V0YmFuZCBfcG9fTlQ7CisKKyNkZWZpbmUgU0VDX0JMT0JfTUFYX0NOVCAxMAorI2RlZmluZSBTRUNfQkxPQl9NQVhfU0laRSAweDQwMDQgLypleHRyYSA0IGZvciBzaXplKi8KK3N0YXRpYyBjaGFyICpfc2VjX2Jsb2JbU0VDX0JMT0JfTUFYX0NOVF07CisKKy8qIG11bHRpLWNvcHAgc3VwcG9ydCAqLworc3RhdGljIGludCBfY2lkeFtBRkVfTUFYX1BPUlRTXSA9IHstMX07CisKKy8qIHZvbHVtZSBjb250cm9scyAqLworI2RlZmluZSBWT0xfQ01EX0NOVF9NQVggMTAKK3N0YXRpYyB1MzIgX3ZvbF9jbWRfY250Oworc3RhdGljIHMzMiAqKl92b2xfY21kczsKK3N0cnVjdCB2b2xfY21kc19kIHsKKwlzMzIgZFs0XTsKK307CitzdGF0aWMgc3RydWN0IHZvbF9jbWRzX2QgKl92b2xfY21kc19kOworc3RhdGljIGNvbnN0IHMzMiBfbG9nMTBfMTBfaW52X3gyMCA9IDB4MDAwOGFmODQ7CisKKy8qIGhweCBtYXN0ZXIgY29udHJvbCAqLworc3RhdGljIHUzMiBfaXNfaHB4X2VuYWJsZWQ7CisKK3N0YXRpYyB2b2lkIF92b2x1bWVfY21kc19mcmVlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgX3ZvbF9jbWRfY250OyBpKyspCisJCWtmcmVlKF92b2xfY21kc1tpXSk7CisJX3ZvbF9jbWRfY250ID0gMDsKKwlrZnJlZShfdm9sX2NtZHMpOworCWtmcmVlKF92b2xfY21kc19kKTsKKwlfdm9sX2NtZHMgPSBOVUxMOworCV92b2xfY21kc19kID0gTlVMTDsKK30KKworc3RhdGljIHMzMiBfdm9sdW1lX2NtZHNfYWxsb2MxKHMzMiBzaXplKQoreworCV92b2x1bWVfY21kc19mcmVlKCk7CisJX3ZvbF9jbWRfY250ID0gc2l6ZTsKKwlfdm9sX2NtZHMgPSBremFsbG9jKF92b2xfY21kX2NudCAqIHNpemVvZihpbnQgKiksIEdGUF9LRVJORUwpOworCWlmIChfdm9sX2NtZHMpIHsKKwkJX3ZvbF9jbWRzX2QgPSBremFsbG9jKF92b2xfY21kX2NudCAqIHNpemVvZihzdHJ1Y3Qgdm9sX2NtZHNfZCksCisJCQkJCUdGUF9LRVJORUwpOworCX0KKwlpZiAoX3ZvbF9jbWRzX2QpCisJCXJldHVybiAwOworCV92b2x1bWVfY21kc19mcmVlKCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIGFzc3VtZXMgc2l6ZSBpcyBlcXVhbCBvciBsZXNzIHRoYW4gMHhGRkYgKi8KK3N0YXRpYyBzMzIgX3ZvbHVtZV9jbWRzX2FsbG9jMihzMzIgaWR4LCBzMzIgc2l6ZSkKK3sKKwlrZnJlZShfdm9sX2NtZHNbaWR4XSk7CisJX3ZvbF9jbWRzW2lkeF0gPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChfdm9sX2NtZHNbaWR4XSkKKwkJcmV0dXJuIDA7CisJX3ZvbF9jbWRzX2RbaWR4XS5kWzBdID0gMDsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgX2luaXRfY2JfZGVzY3Modm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDQl9DT1VOVDsgaSsrKSB7CisJCV9jX2JsW2ldW0NCRF9ERVZfTUFTS10gPSAwOworCQlfY19ibFtpXVtDQkRfT0ZGU0ddID0gX2NfYmxbaV1bQ0JEX09GRlMxXSA9CisJCV9jX2JsW2ldW0NCRF9PRkZTMl0gPSBfY19ibFtpXVtDQkRfT0ZGUzNdID0KKwkJMHhGRkZGRkZGRjsKKwkJX2NfYmxbaV1bQ0JEX0NNRDBdID0gX2NfYmxbaV1bQ0JEX1NaMF0gPQorCQlfY19ibFtpXVtDQkRfQ01EMV0gPSBfY19ibFtpXVtDQkRfU1oxXSA9CisJCV9jX2JsW2ldW0NCRF9DTUQyXSA9IF9jX2JsW2ldW0NCRF9TWjJdID0KKwkJX2NfYmxbaV1bQ0JEX0NNRDNdID0gX2NfYmxbaV1bQ0JEX1NaM10gPSAwOworCX0KK30KKworc3RhdGljIHUzMiBfZ2V0X2Rldl9tYXNrX2Zvcl9waWQoaW50IHBpZCkKK3sKKwlzd2l0Y2ggKHBpZCkgeworCWNhc2UgU0xJTUJVU18wX1JYOgorCQlyZXR1cm4gKDEgPDwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgfAorCQkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8CisJCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpIHwKKwkJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSB8CisJCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0FOQ19IRUFEU0VUKSB8CisJCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0FOQ19IRUFEUEhPTkUpOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgSU5UX0JUX1NDT19SWDoKKwkJcmV0dXJuICgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTykgfAorCQkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHwKKwkJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6CisJCXJldHVybiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSB8CisJCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpIHwKKwkJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikgfAorCQkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCkgfAorCQkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCkgfAorCQkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSB8CisJCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UpIHwKKwkJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfUFJPWFkpOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgSERNSV9SWDoKKwkJcmV0dXJuIDEgPDwgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKwljYXNlIElOVF9GTV9SWDoKKwkJcmV0dXJuIDEgPDwgQVVESU9fREVWSUNFX09VVF9GTTsKKwljYXNlIElOVF9GTV9UWDoKKwkJcmV0dXJuIDEgPDwgQVVESU9fREVWSUNFX09VVF9GTV9UWDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX2dldF9waWRfZnJvbV9kZXYodTMyIGRldmljZSkKK3sKKwlpZiAoZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgfHwKKwkgICAgZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8fAorCSAgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpIHx8CisJICAgIGRldmljZSAmICgxIDw8IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSB8fAorCSAgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0FOQ19IRUFEU0VUKSB8fAorCSAgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0FOQ19IRUFEUEhPTkUpKSB7CisJCXJldHVybiBTTElNQlVTXzBfUlg7CisJfSBlbHNlIGlmIChkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pIHx8CisJCSAgIGRldmljZSAmICgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB8fAorCQkgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSkgeworCQlyZXR1cm4gSU5UX0JUX1NDT19SWDsKKwl9IGVsc2UgaWYgKGRldmljZSAmICgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApIHx8CisJCSAgIGRldmljZSAmICgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykgfHwKKwkJICAgZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSB8fAorCQkgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSB8fAorCQkgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSB8fAorCQkgICBkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpIHx8CisJCSAgIGRldmljZSAmICgxIDw8IEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSkgfHwKKwkJICAgZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9QUk9YWSkpIHsKKwkJcmV0dXJuIFJUX1BST1hZX1BPUlRfMDAxX1JYOworCX0gZWxzZSBpZiAoZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCkpIHsKKwkJcmV0dXJuIEhETUlfUlg7CisJfSBlbHNlIGlmIChkZXZpY2UgJiAoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0ZNKSkgeworCQlyZXR1cm4gSU5UX0ZNX1JYOworCX0gZWxzZSBpZiAoZGV2aWNlICYgKDEgPDwgQVVESU9fREVWSUNFX09VVF9GTV9UWCkpIHsKKwkJcmV0dXJuIElOVF9GTV9UWDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgX2dldF9jYl9mb3JfZGV2KGludCBkZXZpY2UpCit7CisJczMyIGk7CisKKwlpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0NPTUJPKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDQl9DT1VOVDsgaSsrKSB7CisJCQlpZiAoKF9jX2JsW2ldW0NCRF9ERVZfTUFTS10gJiBkZXZpY2UpID09IGRldmljZSkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBDQl9DT1VOVDsgaSsrKSB7CisJCQlpZiAoKF9jX2JsW2ldW0NCRF9ERVZfTUFTS10gJiBkZXZpY2UpICYmCisJCQkgICAgIShfY19ibFtpXVtDQkRfREVWX01BU0tdICYgQVVESU9fREVWSUNFX0NPTUJPKSkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwllYWdsZV9kcnZfZXJyKCIlczogZGV2aWNlICVpIG5vdCBmb3VuZCIsIF9fZnVuY19fLCBkZXZpY2UpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IF9pc19wb3J0X29wZW5fYW5kX2VhZ2xlKGludCBwaWQpCit7CisJaWYgKG1zbV9yb3V0aW5nX2NoZWNrX2JhY2tlbmRfZW5hYmxlZChwaWQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfaXNOVERldmljZSh1MzIgZGV2aWNlKQoreworCWlmIChkZXZpY2UgJgorCQkoKDEgPDwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSB8CisJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB8CisJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpIHwKKwkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkgfAorCQkoMSA8PCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpIHwKKwkJKDEgPDwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSB8CisJCSgxIDw8IEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9yZWdfaW9uX21lbSh2b2lkKQoreworCWludCByYzsKKworCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiRFRTX0VBR0xFIiwgJl9pb25fY2xpZW50LCAmX2lvbl9oYW5kbGUsCisJCQkgICAgSU9OX01FTV9TSVpFLCAmX3BvLnBhZGRyLCAmX3BvLnNpemUsICZfcG8ua3ZhZGRyKTsKKwlpZiAocmMpCisJCWVhZ2xlX2Rydl9lcnIoIiVzOiBtc20gYXVkaW8gaW9uIGFsbG9jIGZhaWxlZCB3aXRoICVpIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworfQorCitzdGF0aWMgdm9pZCBfdW5yZWdfaW9uX21lbSh2b2lkKQoreworCWludCByYzsKKworCXJjID0gbXNtX2F1ZGlvX2lvbl9mcmVlKF9pb25fY2xpZW50LCBfaW9uX2hhbmRsZSk7CisJaWYgKHJjKQorCQllYWdsZV9kcnZfZXJyKCIlczogbXNtIGF1ZGlvIGlvbiBhbGxvYyBmYWlsZWQgd2l0aCAlaSIsCisJCQkJX19mdW5jX18sIHJjKTsKK30KKworc3RhdGljIHZvaWQgX3JlZ19pb25fbWVtX05UKHZvaWQpCit7CisJaW50IHJjOworCisJZWFnbGVfZHJ2X2RiZygiJXM6IE5UIGlvbiBtZW0iLCBfX2Z1bmNfXyk7CisJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJEVFNfRUFHTEUiLCAmX2lvbl9jbGllbnRfTlQsCisJCQkJICZfaW9uX2hhbmRsZV9OVCwgSU9OX01FTV9TSVpFLAorCQkJCSAmX3BvX05ULnBhZGRyLCAmX3BvX05ULnNpemUsICZfcG9fTlQua3ZhZGRyKTsKKwlpZiAocmMpIHsKKwkJZWFnbGVfZHJ2X2VycigiJXM6IG1zbSBhdWRpbyBpb24gYWxsb2MgZmFpbGVkIiwJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXJjID0gcTZhc21fbWVtb3J5X21hcChfYWNfTlQsIF9wb19OVC5wYWRkciwKKwkJCSAgICAgIElOLCBfcG9fTlQuc2l6ZSwgMSk7CisJaWYgKHJjIDwgMCkgeworCQllYWdsZV9kcnZfZXJyKCIlczogbWVtb3J5IG1hcCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCW1zbV9hdWRpb19pb25fZnJlZShfaW9uX2NsaWVudF9OVCwgX2lvbl9oYW5kbGVfTlQpOworCQlfaW9uX2NsaWVudF9OVCA9IE5VTEw7CisJCV9pb25faGFuZGxlX05UID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF91bnJlZ19pb25fbWVtX05UKHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBxNmFzbV9tZW1vcnlfdW5tYXAoX2FjX05ULAlfcG9fTlQucGFkZHIsIElOKTsKKwlpZiAocmMgPCAwKQorCQllYWdsZV9kcnZfZXJyKCIlczogbWVtIHVubWFwIGZhaWxlZCIsIF9fZnVuY19fKTsKKwlyYyA9IG1zbV9hdWRpb19pb25fZnJlZShfaW9uX2NsaWVudF9OVCwgX2lvbl9oYW5kbGVfTlQpOworCWlmIChyYyA8IDApCisJCWVhZ2xlX2Rydl9lcnIoIiVzOiBtZW0gZnJlZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKwlfaW9uX2NsaWVudF9OVCA9IE5VTEw7CisJX2lvbl9oYW5kbGVfTlQgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2NsaWVudCAqX2dldE5URGV2aWNlQUModm9pZCkKK3sKKwlyZXR1cm4gX2FjX05UOworfQorCitzdGF0aWMgdm9pZCBfc2V0X2F1ZGlvY2xpZW50KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCV9hY19OVCA9IGFjOworCV9yZWdfaW9uX21lbV9OVCgpOworfQorCitzdGF0aWMgdm9pZCBfY2xlYXJfYXVkaW9jbGllbnQodm9pZCkKK3sKKwlfdW5yZWdfaW9uX21lbV9OVCgpOworCV9hY19OVCA9IE5VTEw7Cit9CisKKworc3RhdGljIGludCBfc2VuZGNhY2hlX3ByZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKK3sKKwl1aW50MzJfdCBvZmZzZXQsIHNpemU7CisJaW50MzJfdCBjaWR4LCBjbWQsIGVyciA9IDA7CisKKwljaWR4ID0gX2dldF9jYl9mb3JfZGV2KF9kZXZpY2VfcHJpbWFyeSk7CisJaWYgKGNpZHggPCAwKSB7CisJCWVhZ2xlX3ByZWNhY2hlX2VycigiJXM6IG5vIGNhY2hlIGZvciBwcmltYXJ5IGRldmljZSAlaSBmb3VuZCIsCisJCQlfX2Z1bmNfXywgX2RldmljZV9wcmltYXJ5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW9mZnNldCA9IF9jX2JsW2NpZHhdW0NCRF9PRkZTR107CisJY21kID0gX2NfYmxbY2lkeF1bQ0JEX0NNRDBdOworCXNpemUgPSBfY19ibFtjaWR4XVtDQkRfU1owXTsKKwkvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworCWlmIChvZmZzZXQgPiAoVUlOVF9NQVggLSBzaXplKSkKKwkJZXJyID0gLUVJTlZBTDsKKwlpZiAoKF9kZXBjX3NpemUgPT0gMCkgfHwgIV9kZXBjIHx8IChzaXplID09IDApIHx8CisJCWNtZCA9PSAwIHx8ICgob2Zmc2V0ICsgc2l6ZSkgPiBfZGVwY19zaXplKSB8fCAoZXJyICE9IDApKSB7CisJCWVhZ2xlX3ByZWNhY2hlX2VycigiJXM6IHByaW1hcnkgZGV2aWNlICVpIGNhY2hlIGluZGV4ICVpIGdlbmVyYWwgZXJyb3IgLSBjYWNoZSBzaXplID0gJXUsIGNhY2hlIHB0ciA9ICVwSywgb2Zmc2V0ID0gJXUsIHNpemUgPSAldSwgY21kID0gJWkiLAorCQkJX19mdW5jX18sIF9kZXZpY2VfcHJpbWFyeSwgY2lkeCwgX2RlcGNfc2l6ZSwgX2RlcGMsCisJCQlvZmZzZXQsIHNpemUsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgob2Zmc2V0IDwgKFVJTlRfTUFYIC0gMTI0KSkgJiYgKChvZmZzZXQgKyAxMjQpIDwgX2RlcGNfc2l6ZSkpCisJCWVhZ2xlX3ByZWNhY2hlX2RiZygiJXM6IGZpcnN0IDYgaW50ZWdlcnMgJWkgJWkgJWkgJWkgJWkgJWkgKDMwdGggJWkpIiwKKwkJCV9fZnVuY19fLCAqKChpbnQgKikmX2RlcGNbb2Zmc2V0XSksCisJCQkqKChpbnQgKikmX2RlcGNbb2Zmc2V0KzRdKSwKKwkJCSooKGludCAqKSZfZGVwY1tvZmZzZXQrOF0pLAorCQkJKigoaW50ICopJl9kZXBjW29mZnNldCsxMl0pLAorCQkJKigoaW50ICopJl9kZXBjW29mZnNldCsxNl0pLAorCQkJKigoaW50ICopJl9kZXBjW29mZnNldCsyMF0pLAorCQkJKigoaW50ICopJl9kZXBjW29mZnNldCsxMjBdKSk7CisJZWFnbGVfcHJlY2FjaGVfZGJnKCIlczogc2VuZGluZyBmdWxsIGRhdGEgYmxvY2sgdG8gcG9ydCwgd2l0aCBjYWNoZSBpbmRleCA9ICVkIGRldmljZSBtYXNrIDB4JVgsIHBhcmFtID0gMHglWCwgb2Zmc2V0ID0gJXUsIGFuZCBzaXplID0gJXUiLAorCQkgIF9fZnVuY19fLCBjaWR4LCBfY19ibFtjaWR4XVtDQkRfREVWX01BU0tdLCBjbWQsIG9mZnNldCwgc2l6ZSk7CisKKwlpZiAocTZhc21fZHRzX2VhZ2xlX3NldChhYywgY21kLCBzaXplLCAodm9pZCAqKSZfZGVwY1tvZmZzZXRdLAorCQkJCU5VTEwsIE1QUkUpKQorCQllYWdsZV9wcmVjYWNoZV9lcnIoIiVzOiBxNmFzbV9kdHNfZWFnbGVfc2V0IGZhaWxlZCB3aXRoIGlkID0gJWQgYW5kIHNpemUgPSAldSIsCisJCQlfX2Z1bmNfXywgY21kLCBzaXplKTsKKwllbHNlCisJCWVhZ2xlX3ByZWNhY2hlX2RiZygiJXM6IHE2YXNtX2R0c19lYWdsZV9zZXQgc3VjY2VlZGVkIHdpdGggaWQgPSAlZCBhbmQgc2l6ZSA9ICV1IiwKKwkJCSBfX2Z1bmNfXywgY21kLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2VuZGNhY2hlX3Bvc3QoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHRvcG9sb2d5KQoreworCWludCBjaWR4ID0gLTEsIGNtZCwgbWFzaywgaW5kZXgsIGVyciA9IDA7CisJdWludDMyX3Qgb2Zmc2V0LCBzaXplOworCisJaWYgKHBvcnRfaWQgPT0gLTEpIHsKKwkJY2lkeCA9IF9nZXRfY2JfZm9yX2RldihfZGV2aWNlX3ByaW1hcnkpOworCQlpZiAoY2lkeCA8IDApIHsKKwkJCWVhZ2xlX3Bvc3RjYWNoZV9lcnIoIiVzOiBubyBjYWNoZSBmb3IgcHJpbWFyeSBkZXZpY2UgJWkgZm91bmQuIFBvcnQgaWQgd2FzIDB4JVgiLAorCQkJCV9fZnVuY19fLCBfZGV2aWNlX3ByaW1hcnksIHBvcnRfaWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZ290byBOVF9NT0RFX0dPVE87CisJfQorCisJaW5kZXggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDApIHsKKwkJZWFnbGVfcG9zdGNhY2hlX2VycigiJXM6IEludmFsaWQgcG9ydCBpZHggJWQgcG9ydF9pZCAlI3giLAorCQkJX19mdW5jX18sIGluZGV4LCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVhZ2xlX3Bvc3RjYWNoZV9kYmcoIiVzOiB2YWxpZCBwb3J0IGlkeCAlZCBmb3IgcG9ydF9pZCAlI3ggc2V0IHRvICVpIiwKKwkJX19mdW5jX18sIGluZGV4LCBwb3J0X2lkLCBjb3BwX2lkeCk7CisJX2NpZHhbaW5kZXhdID0gY29wcF9pZHg7CisKKwltYXNrID0gX2dldF9kZXZfbWFza19mb3JfcGlkKHBvcnRfaWQpOworCWlmIChtYXNrICYgX2RldmljZV9wcmltYXJ5KSB7CisJCWNpZHggPSBfZ2V0X2NiX2Zvcl9kZXYoX2RldmljZV9wcmltYXJ5KTsKKwkJaWYgKGNpZHggPCAwKSB7CisJCQllYWdsZV9wb3N0Y2FjaGVfZXJyKCIlczogbm8gY2FjaGUgZm9yIHByaW1hcnkgZGV2aWNlICVpIGZvdW5kLiBQb3J0IGlkIHdhcyAweCVYIiwKKwkJCQlfX2Z1bmNfXywgX2RldmljZV9wcmltYXJ5LCBwb3J0X2lkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChtYXNrICYgX2RldmljZV9hbGwpIHsKKwkJY2lkeCA9IF9nZXRfY2JfZm9yX2RldihfZGV2aWNlX2FsbCk7CisJCWlmIChjaWR4IDwgMCkgeworCQkJZWFnbGVfcG9zdGNhY2hlX2VycigiJXM6IG5vIGNhY2hlIGZvciBjb21ibyBkZXZpY2UgJWkgZm91bmQuIFBvcnQgaWQgd2FzIDB4JVgiLAorCQkJCV9fZnVuY19fLCBfZGV2aWNlX2FsbCwgcG9ydF9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWVhZ2xlX3Bvc3RjYWNoZV9lcnIoIiVzOiBwb3J0IGlkIDB4JVggbm90IGZvciBwcmltYXJ5IG9yIGNvbWJvIGRldmljZSAlaSIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgX2RldmljZV9wcmltYXJ5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCitOVF9NT0RFX0dPVE86CisJb2Zmc2V0ID0gX2NfYmxbY2lkeF1bQ0JEX09GRlNHXSArIF9jX2JsW2NpZHhdW0NCRF9PRkZTMl07CisJY21kID0gX2NfYmxbY2lkeF1bQ0JEX0NNRDJdOworCXNpemUgPSBfY19ibFtjaWR4XVtDQkRfU1oyXTsKKworCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJaWYgKG9mZnNldCA+IChVSU5UX01BWCAtIHNpemUpKQorCQllcnIgPSAtRUlOVkFMOworCWlmICgoX2RlcGNfc2l6ZSA9PSAwKSB8fCAhX2RlcGMgfHwgKGVyciAhPSAwKSB8fCAoc2l6ZSA9PSAwKSB8fAorCQkoY21kID09IDApIHx8IChvZmZzZXQgKyBzaXplKSA+IF9kZXBjX3NpemUpIHsKKwkJZWFnbGVfcG9zdGNhY2hlX2VycigiJXM6IHByaW1hcnkgZGV2aWNlICVpIGNhY2hlIGluZGV4ICVpIHBvcnRfaWQgMHglWCBnZW5lcmFsIGVycm9yIC0gY2FjaGUgc2l6ZSA9ICV1LCBjYWNoZSBwdHIgPSAlcEssIG9mZnNldCA9ICV1LCBzaXplID0gJXUsIGNtZCA9ICVpIiwKKwkJCV9fZnVuY19fLCBfZGV2aWNlX3ByaW1hcnksIGNpZHgsIHBvcnRfaWQsCisJCQlfZGVwY19zaXplLCBfZGVwYywgb2Zmc2V0LCBzaXplLCBjbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKG9mZnNldCA8IChVSU5UX01BWCAtIDI0KSkgJiYgKChvZmZzZXQgKyAyNCkgPCBfZGVwY19zaXplKSkKKwkJZWFnbGVfcG9zdGNhY2hlX2RiZygiJXM6IGZpcnN0IDYgaW50ZWdlcnMgJWkgJWkgJWkgJWkgJWkgJWkiLAorCQkJX19mdW5jX18sICooKGludCAqKSZfZGVwY1tvZmZzZXRdKSwKKwkJCSooKGludCAqKSZfZGVwY1tvZmZzZXQrNF0pLAorCQkJKigoaW50ICopJl9kZXBjW29mZnNldCs4XSksCisJCQkqKChpbnQgKikmX2RlcGNbb2Zmc2V0KzEyXSksCisJCQkqKChpbnQgKikmX2RlcGNbb2Zmc2V0KzE2XSksCisJCQkqKChpbnQgKikmX2RlcGNbb2Zmc2V0KzIwXSkpOworCWVhZ2xlX3Bvc3RjYWNoZV9kYmcoIiVzOiBzZW5kaW5nIGZ1bGwgZGF0YSBibG9jayB0byBwb3J0LCB3aXRoIGNhY2hlIGluZGV4ID0gJWQgZGV2aWNlIG1hc2sgMHglWCwgcG9ydF9pZCA9IDB4JVgsIHBhcmFtID0gMHglWCwgb2Zmc2V0ID0gJXUsIGFuZCBzaXplID0gJXUiLAorCQlfX2Z1bmNfXywgY2lkeCwgX2NfYmxbY2lkeF1bQ0JEX0RFVl9NQVNLXSwgcG9ydF9pZCwgY21kLAorCQlvZmZzZXQsIHNpemUpOworCisJaWYgKF9hY19OVCkgeworCQllYWdsZV9wb3N0Y2FjaGVfZGJnKCIlczogTlQgUm91dGUgZGV0ZWN0ZWQiLCBfX2Z1bmNfXyk7CisJCWlmIChxNmFzbV9kdHNfZWFnbGVfc2V0KF9nZXROVERldmljZUFDKCksIGNtZCwgc2l6ZSwKKwkJCQkJKHZvaWQgKikmX2RlcGNbb2Zmc2V0XSwKKwkJCQkJJl9wb19OVCwgTVBTVCkpCisJCQllYWdsZV9wb3N0Y2FjaGVfZXJyKCIlczogcTZhc21fZHRzX2VhZ2xlX3NldCBmYWlsZWQgd2l0aCBpZCA9IDB4JVggYW5kIHNpemUgPSAldSIsCisJCQkJX19mdW5jX18sIGNtZCwgc2l6ZSk7CisJfSBlbHNlIGlmIChhZG1fZHRzX2VhZ2xlX3NldChwb3J0X2lkLCBjb3BwX2lkeCwgY21kLAorCQkJICAgICAgKHZvaWQgKikmX2RlcGNbb2Zmc2V0XSwgc2l6ZSkgPCAwKQorCQllYWdsZV9wb3N0Y2FjaGVfZXJyKCIlczogYWRtX2R0c19lYWdsZV9zZXQgZmFpbGVkIHdpdGggaWQgPSAweCVYIGFuZCBzaXplID0gJXUiLAorCQkJX19mdW5jX18sIGNtZCwgc2l6ZSk7CisJZWxzZQorCQllYWdsZV9wb3N0Y2FjaGVfZGJnKCIlczogYWRtX2R0c19lYWdsZV9zZXQgc3VjY2VlZGVkIHdpdGggaWQgPSAweCVYIGFuZCBzaXplID0gJXUiLAorCQkJIF9fZnVuY19fLCBjbWQsIHNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9lbmFibGVfcG9zdF9nZXRfY29udHJvbChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBfaXNfaHB4X2VuYWJsZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2VuYWJsZV9wb3N0X3B1dF9jb250cm9sKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaWR4ID0gMCwgYmVfaW5kZXggPSAwLCBwb3J0X2lkLCB0b3BvbG9neTsKKwlpbnQgZmxhZyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhIG1zbV9iZWRhaTsKKworCWVhZ2xlX2Rydl9kYmcoIiVzOiBmbGFnICVkIiwgX19mdW5jX18sIGZsYWcpOworCisJX2lzX2hweF9lbmFibGVkID0gZmxhZyA/IHRydWUgOiBmYWxzZTsKKwltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7CisJLyogc2VuZCBjYWNoZSBwb3N0bWl4IHBhcmFtcyB3aGVuIGhweCBpcyBzZXQgT24gKi8KKwlmb3IgKGJlX2luZGV4ID0gMDsgYmVfaW5kZXggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pbmRleCsrKSB7CisJCW1zbV9wY21fcm91dGluZ19nZXRfYmVkYWlfaW5mbyhiZV9pbmRleCwgJm1zbV9iZWRhaSk7CisJCXBvcnRfaWQgPSBtc21fYmVkYWkucG9ydF9pZDsKKwkJaWYgKCEoKChwb3J0X2lkID09IFNMSU1CVVNfMF9SWCkgfHwKKwkJICAgICAgKHBvcnRfaWQgPT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpKSAmJgorCQkgICAgICBtc21fYmVkYWkuYWN0aXZlKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaWR4KyspIHsKKwkJCXRvcG9sb2d5ID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeCgKKwkJCQkJCQkJcG9ydF9pZCwgaWR4KTsKKwkJCWlmICh0b3BvbG9neSA9PQorCQkJCUFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFgpIHsKKwkJCQltc21fZHRzX2VhZ2xlX2VuYWJsZV9hZG0ocG9ydF9pZCwgaWR4LAorCQkJCQkJCSBfaXNfaHB4X2VuYWJsZWQpOworCQkJfQorCQl9CisJfQorCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IF9ocHhfZW5hYmxlZF9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJTZXQgSFBYIE9uT2ZmIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAorCV9lbmFibGVfcG9zdF9nZXRfY29udHJvbCwgX2VuYWJsZV9wb3N0X3B1dF9jb250cm9sKQorfTsKKworLyoqCisgKiBtc21fZHRzX2lvbl9tZW1tYXAoKSAtIGhlbHBlciBmdW5jdGlvbiB0byBtYXAgSU9OIG1lbW9yeQorICogQHBvXzoJT3V0IG9mIGJhbmQgbWVtb3J5IHN0cnVjdHVyZSB1c2VkIGFzIG1lbW9yeS4KKyAqCisgKiBBc3NpZ24gYWxyZWFkeSBhbGxvY2F0ZWQgSU9OIG1lbW9yeSBmb3IgbWFwcGluZyBpdCB0byBkc3AuCisgKgorICogUmV0dXJuOiBObyByZXR1cm4gdmFsdWUuCisgKi8KK3ZvaWQgbXNtX2R0c19pb25fbWVtbWFwKHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwb18pCit7CisJcG9fLT5zaXplID0gSU9OX01FTV9TSVpFOworCXBvXy0+a3ZhZGRyID0gX3BvLmt2YWRkcjsKKwlwb18tPnBhZGRyID0gX3BvLnBhZGRyOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfZW5hYmxlX2FzbSgpIC0gRW5hYmxlL2Rpc2FibGUgZHRzIG1vZHVsZQorICogQGFjOglFbmFibGUvZGlzYWJsZSBtb2R1bGUgaW4gQVNNIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXVkaW8gY2xpZW50LgorICogQGVuYWJsZToJRW5hYmxlL2Rpc2FibGUgdGhlIGR0cyBtb2R1bGUuCisgKiBAbW9kdWxlOgltb2R1bGUgaWQuCisgKgorICogRW5hYmxlL2Rpc2FibGUgc3BlY2lmaWVkIGR0cyBtb2R1bGUgaWQgaW4gYXNtLgorICoKKyAqIFJldHVybjogUmV0dXJuIGZhaWx1cmUgaWYgYW55LgorICovCitpbnQgbXNtX2R0c19lYWdsZV9lbmFibGVfYXNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1MzIgZW5hYmxlLCBpbnQgbW9kdWxlKQoreworCWludCByZXQgPSAwOworCisJZWFnbGVfZW5hYmxlX2RiZygiJXM6IGVuYWJsZSA9ICVpIG9uIG1vZHVsZSAlaSIsCisJCSBfX2Z1bmNfXywgZW5hYmxlLCBtb2R1bGUpOworCV9pc19ocHhfZW5hYmxlZCA9IGVuYWJsZTsKKwlyZXQgPSBxNmFzbV9kdHNfZWFnbGVfc2V0KGFjLCBBVURQUk9DX1BBUkFNX0lEX0VOQUJMRSwKKwkJCQkgICAgICBzaXplb2YoZW5hYmxlKSwgJmVuYWJsZSwKKwkJCQkgICAgICBOVUxMLCBtb2R1bGUpOworCWlmIChfaXNfaHB4X2VuYWJsZWQpIHsKKwkJaWYgKG1vZHVsZSA9PSBNUFJFKQorCQkJX3NlbmRjYWNoZV9wcmUoYWMpOworCQllbHNlIGlmIChtb2R1bGUgPT0gTVBTVCkKKwkJCV9zZW5kY2FjaGVfcG9zdCgtMSwgMCwgMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9lbmFibGVfYWRtKCkgLSBFbmFibGUvZGlzYWJsZSBkdHMgbW9kdWxlIGluIGFkbQorICogQHBvcnRfaWQ6CVNlbmQgZW5hYmxlL2Rpc2FibGUgcGFyYW0gdG8gdGhpcyBwb3J0IGlkLgorICogQGNvcHBfaWR4OglTZW5kIGVuYWJsZS9kaXNhYmxlIHBhcmFtIHRvIHRoZSByZWxldmFudCBjb3BwLgorICogQGVuYWJsZToJRW5hYmxlL2Rpc2FibGUgdGhlIGR0cyBtb2R1bGUuCisgKgorICogRW5hYmxlL2Rpc2FibGUgZHRzIG1vZHVsZSBpbiBhZG0uCisgKgorICogUmV0dXJuOiBSZXR1cm4gZmFpbHVyZSBpZiBhbnkuCisgKi8KK2ludCBtc21fZHRzX2VhZ2xlX2VuYWJsZV9hZG0oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgdTMyIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWVhZ2xlX2VuYWJsZV9kYmcoIiVzOiBlbmFibGUgPSAlaSIsIF9fZnVuY19fLCBlbmFibGUpOworCV9pc19ocHhfZW5hYmxlZCA9IGVuYWJsZTsKKwlyZXQgPSBhZG1fZHRzX2VhZ2xlX3NldChwb3J0X2lkLCBjb3BwX2lkeCwgQVVEUFJPQ19QQVJBTV9JRF9FTkFCTEUsCisJCQkgICAgIChjaGFyICopJmVuYWJsZSwgc2l6ZW9mKGVuYWJsZSkpOworCWlmIChfaXNfaHB4X2VuYWJsZWQpCisJCV9zZW5kY2FjaGVfcG9zdChwb3J0X2lkLCBjb3BwX2lkeCwgTVBTVCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtc21fZHRzX2VhZ2xlX2FkZF9jb250cm9scygpIC0gIEFkZCBtaXhlciBjb250cm9sIHRvIEVuYWJsZS9EaXNhYmxlIERUUyBIUFgKKyAqIEBwbGF0Zm9ybToJQWRkIG1peGVyIGNvbnRyb2xzIHRvIHRoaXMgcGxhdGZvcm0uCisgKgorICogQWRkIG1peGVyIGNvbnRyb2wgdG8gRW5hYmxlL0Rpc2FibGUgRFRTIEhQWCBtb2R1bGUgaW4gQURNLgorICoKKyAqIFJldHVybjogTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIG1zbV9kdHNfZWFnbGVfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKK3sKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgX2hweF9lbmFibGVkX2NvbnRyb2xzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUoX2hweF9lbmFibGVkX2NvbnRyb2xzKSk7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9zZXRfc3RyZWFtX2dhaW4oKSAtICBTZXQgc3RyZWFtIGdhaW4gdG8gRFRTIFByZW1peCBtb2R1bGUKKyAqIEBhYzoJU2V0IHN0cmVhbSBnYWluIHRvIEFTTSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF1ZGlvIGNsaWVudC4KKyAqIEBsZ2FpbjoJTGVmdCBnYWluIHZhbHVlLgorICogQHJnYWluOglSaWdodCBnYWluIHZhbHVlLgorICoKKyAqIFNldCBzdHJlYW0gZ2FpbiB0byBEVFMgUHJlbWl4IG1vZHVsZSBpbiBBU00uCisgKgorICogUmV0dXJuOiBmYWlsdXJlIG9yIHN1Y2Nlc3MuCisgKi8KK2ludCBtc21fZHRzX2VhZ2xlX3NldF9zdHJlYW1fZ2FpbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGxnYWluLCBpbnQgcmdhaW4pCit7CisJdTMyIGksIHZhbDsKKwlzMzIgaWR4LCBlcnIgPSAwOworCisJZWFnbGVfdm9sX2RiZygiJXM6IC0gZW50cnk6IHZvbF9jbWRfY250ID0gJXUsIGxnYWluID0gJWksIHJnYWluID0gJWkiLAorCQkgX19mdW5jX18sIF92b2xfY21kX2NudCwgbGdhaW4sIHJnYWluKTsKKworCWlmIChfZGVwY19zaXplID09IDApIHsKKwkJZWFnbGVfdm9sX2RiZygiJXM6IGRyaXZlciBjYWNoZSBub3QgaW5pdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBfdm9sX2NtZF9jbnQ7IGkrKykgeworCQlpZiAoX3ZvbF9jbWRzX2RbaV0uZFswXSAmIDB4ODAwMCkgeworCQkJaWR4ID0gKHNpemVvZihzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MpL3NpemVvZihpbnQpKQorCQkJCSsgKF92b2xfY21kc19kW2ldLmRbMF0gJiAweDNGRik7CisJCQl2YWwgPSBfZnhfbG9nTigoKHMzMikobGdhaW4rcmdhaW4pKSA8PCAyKTsKKwkJCXZhbCA9ICgobG9uZyBsb25nKXZhbCAqIF9sb2cxMF8xMF9pbnZfeDIwKSA+PiAxNjsKKwkJCV92b2xfY21kc1tpXVtpZHhdID0gKHMzMiljbGFtcCgoaW50KSgoKGxvbmcgbG9uZyl2YWwgKgorCQkJCQkJICAgIF92b2xfY21kc19kW2ldLmRbMV0pID4+IDE2KSwKKwkJCQkJCSAgICBfdm9sX2NtZHNfZFtpXS5kWzJdLAorCQkJCQkJICAgIF92b2xfY21kc19kW2ldLmRbM10pOworCQkJIGVhZ2xlX3ZvbF9kYmcoIiVzOiBsb29wICV1IGNtZCBkZXNjIGZvdW5kICVpLCBpZHggPSAlaS4gdm9sdW1lIGluZm86IGxnYWluID0gJWksIHJnYWluID0gJWksIHZvbHVtZSA9ICVpIChzY2FsZSAlaSwgbWluICVpLCBtYXggJWkpIiwKKwkJCQkgX19mdW5jX18sIGksIF92b2xfY21kc19kW2ldLmRbMF0sIGlkeCwgbGdhaW4sCisJCQkJIHJnYWluLCBfdm9sX2NtZHNbaV1baWR4XSwgX3ZvbF9jbWRzX2RbaV0uZFsxXSwKKwkJCQkgX3ZvbF9jbWRzX2RbaV0uZFsyXSwgX3ZvbF9jbWRzX2RbaV0uZFszXSk7CisJCX0KKwkJaWR4ID0gX2dldF9jYl9mb3JfZGV2KF9kZXZpY2VfcHJpbWFyeSk7CisJCWlmIChpZHggPCAwKSB7CisJCQllYWdsZV92b2xfZXJyKCIlczogbm8gY2FjaGUgZm9yIHByaW1hcnkgZGV2aWNlICVpIGZvdW5kIiwKKwkJCQlfX2Z1bmNfXywgX2RldmljZV9wcmltYXJ5KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXZhbCA9IF9jX2JsW2lkeF1bQ0JEX09GRlNHXSArIF92b2xfY21kc1tpXVsyXTsKKwkJLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKwkJaWYgKHZhbCA+IChVSU5UX01BWCAtIF92b2xfY21kc1tpXVsxXSkpCisJCQllcnIgPSAtRUlOVkFMOworCQlpZiAoKGVyciAhPSAwKSB8fCAoKHZhbCArIF92b2xfY21kc1tpXVsxXSkgPiBfZGVwY19zaXplKSkgeworCQkJZWFnbGVfdm9sX2VycigiJXM6IHZvbHVtZSBzaXplICgldSkgKyBvZmZzZXQgKCVpKSBvdXQgb2YgYm91bmRzICVpIiwKKwkJCQlfX2Z1bmNfXywgdmFsLCBfdm9sX2NtZHNbaV1bMV0sIF9kZXBjX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWVtY3B5KCh2b2lkICopJl9kZXBjW3ZhbF0sICZfdm9sX2NtZHNbaV1bNF0sIF92b2xfY21kc1tpXVsxXSk7CisJCWlmIChxNmFzbV9kdHNfZWFnbGVfc2V0KGFjLCBfdm9sX2NtZHNbaV1bMF0sCisJCQlfdm9sX2NtZHNbaV1bMV0sICh2b2lkICopJl9kZXBjW3ZhbF0sIE5VTEwsIE1QUkUpKQorCQkJZWFnbGVfdm9sX2VycigiJXM6IGxvb3AgJXUgLSB2b2x1bWUgc2V0IGZhaWxlZCB3aXRoIGlkIDB4JVgsIHNpemUgJWksIG9mZnNldCAlaSwgY21kX2Rlc2MgJWksIHNjYWxlICVpLCBtaW4gJWksIG1heCAlaSwgZGF0YSguLi4pICVpIiwKKwkJCQlfX2Z1bmNfXywgaSwgX3ZvbF9jbWRzW2ldWzBdLCBfdm9sX2NtZHNbaV1bMV0sCisJCQkJX3ZvbF9jbWRzW2ldWzJdLCBfdm9sX2NtZHNfZFtpXS5kWzBdLAorCQkJCV92b2xfY21kc19kW2ldLmRbMV0sIF92b2xfY21kc19kW2ldLmRbMl0sCisJCQkJX3ZvbF9jbWRzX2RbaV0uZFszXSwgX3ZvbF9jbWRzW2ldWzRdKTsKKwkJZWxzZQorCQkJZWFnbGVfdm9sX2RiZygiJXM6IGxvb3AgJXUgLSB2b2x1bWUgc2V0IHN1Y2NlZWRlZCB3aXRoIGlkIDB4JVgsIHNpemUgJWksIG9mZnNldCAlaSwgY21kX2Rlc2MgJWksIHNjYWxlICVpLCBtaW4gJWksIG1heCAlaSwgZGF0YSguLi4pICVpIiwKKwkJCQkgX19mdW5jX18sIGksIF92b2xfY21kc1tpXVswXSwgX3ZvbF9jbWRzW2ldWzFdLAorCQkJCSBfdm9sX2NtZHNbaV1bMl0sIF92b2xfY21kc19kW2ldLmRbMF0sCisJCQkJIF92b2xfY21kc19kW2ldLmRbMV0sIF92b2xfY21kc19kW2ldLmRbMl0sCisJCQkJIF92b2xfY21kc19kW2ldLmRbM10sIF92b2xfY21kc1tpXVs0XSk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FzbSgpIC0gU2V0IG9yIEdldCBwYXJhbXMgZnJvbSBBU00KKyAqIEBkZXBkOglEVFMgRWFnbGUgUGFyYW1zIHN0cnVjdHVyZS4KKyAqIEBidWY6CUJ1ZmZlciB0byBnZXQgcXVlcmllZCBwYXJhbSB2YWx1ZS4KKyAqIEBmb3JfcHJlOglGb3IgcHJlbWl4IG1vZHVsZSBvciBwb3N0bWl4IG1vZHVsZS4KKyAqIEBnZXQ6CUdldHRpbmcgcGFyYW0gZnJvbSBEU1Agb3Igc2V0dGluZyBwYXJhbS4KKyAqIEBhYzoJU2V0L0dldCBmcm9tIEFTTSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF1ZGlvIGNsaWVudC4KKyAqIEBwbzoJT3V0IG9mIGJhbmQgbWVtb3J5IHRvIHNldCBvciBnZXQgcG9zdG1peCBwYXJhbXMuCisgKgorICogU2V0IG9yIEdldCBwYXJhbXMgZnJvbSBtb2R1bGVzIGluIEFTTSBzZXNzaW9uLgorICoKKyAqIFJldHVybjogUmV0dXJuIGZhaWx1cmUgaWYgYW55LgorICovCitpbnQgbXNtX2R0c19lYWdsZV9oYW5kbGVfYXNtKHN0cnVjdCBkdHNfZWFnbGVfcGFyYW1fZGVzYyAqZGVwZCwgY2hhciAqYnVmLAorCQkJICAgICBib29sIGZvcl9wcmUsIGJvb2wgZ2V0LCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSAgICAgc3RydWN0IHBhcmFtX291dGJhbmQgKnBvKQoreworCXN0cnVjdCBkdHNfZWFnbGVfcGFyYW1fZGVzYyBkZXBkXyA9IHswfTsKKwlzMzIgcmV0ID0gMCwgaXNBTFNBID0gMCwgZXJyID0gMCwgaSwgbW9kID0gZm9yX3ByZSA/IE1QUkUgOiBNUFNUOworCXUzMiBvZmZzZXQ7CisKKwllYWdsZV9hc21fZGJnKCIlczogc2V0L2dldCBhc20iLCBfX2Z1bmNfXyk7CisKKwkvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBBTFNBIHJvdXRlLCB0byBhY2NvbW1vZGF0ZSA2NCBiaXQgcGxhdGZvcm1zICovCisJaWYgKGRlcGQgPT0gTlVMTCkgeworCQlsb25nICphcmdfID0gKGxvbmcgKilidWY7CisKKwkJZGVwZCA9ICZkZXBkXzsKKwkJZGVwZC0+aWQgPSAodTMyKSphcmdfKys7CisJCWRlcGQtPnNpemUgPSAodTMyKSphcmdfKys7CisJCWRlcGQtPm9mZnNldCA9IChzMzIpKmFyZ18rKzsKKwkJZGVwZC0+ZGV2aWNlID0gKHUzMikqYXJnXysrOworCQlidWYgPSAoY2hhciAqKWFyZ187CisJCWlzQUxTQSA9IDE7CisJfQorCisJaWYgKGRlcGQtPnNpemUgJiAxKSB7CisJCWVhZ2xlX2FzbV9lcnIoIiVzOiBwYXJhbWV0ZXIgc2l6ZSAldSBpcyBub3QgYSBtdWx0aXBsZSBvZiAyIiwKKwkJCV9fZnVuY19fLCBkZXBkLT5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGdldCkgeworCQl2b2lkICpidWZfLCAqYnVmX20gPSBOVUxMOworCisJCWVhZ2xlX2FzbV9kYmcoIiVzOiBnZXQgcmVxdWVzdGVkIiwgX19mdW5jX18pOworCQlpZiAoZGVwZC0+b2Zmc2V0ID09IC0xKSB7CisJCQllYWdsZV9hc21fZGJnKCIlczogZ2V0IGZyb20gZHNwIHJlcXVlc3RlZCIsIF9fZnVuY19fKTsKKwkJCWlmIChkZXBkLT5zaXplID4gMCAmJiBkZXBkLT5zaXplIDw9IERFUENfTUFYX1NJWkUpIHsKKwkJCQlidWZfID0gYnVmX20gPSB2emFsbG9jKGRlcGQtPnNpemUpOworCQkJfSBlbHNlIHsKKwkJCQllYWdsZV9hc21fZXJyKCIlczogZ2V0IHNpemUgJXUgaW52YWxpZCIsCisJCQkJCSAgICAgIF9fZnVuY19fLCBkZXBkLT5zaXplKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICghYnVmX20pIHsKKwkJCQllYWdsZV9hc21fZXJyKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0gZWxzZSBpZiAocTZhc21fZHRzX2VhZ2xlX2dldChhYywgZGVwZC0+aWQsCisJCQkJCQkgICAgICAgZGVwZC0+c2l6ZSwgYnVmX20sCisJCQkJCQkgICAgICAgcG8sIG1vZCkgPCAwKSB7CisJCQkJZWFnbGVfYXNtX2VycigiJXM6IGFzbSBnZXQgZmFpbGVkIiwgX19mdW5jX18pOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBEVFNfRUFHTEVfSU9DVExfR0VUX1BBUkFNX1BSRV9FWElUOworCQkJfQorCQkJZWFnbGVfYXNtX2RiZygiJXM6IGdldCByZXN1bHQ6IHBhcmFtIGlkIDB4JXggdmFsdWUgJWQgc2l6ZSAldSIsCisJCQkJIF9fZnVuY19fLCBkZXBkLT5pZCwgKihpbnQgKilidWZfbSwgZGVwZC0+c2l6ZSk7CisJCX0gZWxzZSB7CisJCQlzMzIgdGd0ID0gX2dldF9jYl9mb3JfZGV2KGRlcGQtPmRldmljZSk7CisKKwkJCWlmICh0Z3QgPCAwKSB7CisJCQkJZWFnbGVfYXNtX2VycigiJXM6IG5vIGNhY2hlIGZvciBkZXZpY2UgJXUgZm91bmQiLAorCQkJCQlfX2Z1bmNfXywgZGVwZC0+ZGV2aWNlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCW9mZnNldCA9IF9jX2JsW3RndF1bQ0JEX09GRlNHXSArIGRlcGQtPm9mZnNldDsKKwkJCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJCQlpZiAob2Zmc2V0ID4gKFVJTlRfTUFYIC0gZGVwZC0+c2l6ZSkpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlmICgoZXJyICE9IDApIHx8IChvZmZzZXQgKyBkZXBkLT5zaXplKSA+IF9kZXBjX3NpemUpIHsKKwkJCQllYWdsZV9hc21fZXJyKCIlczogaW52YWxpZCBzaXplICV1IGFuZC9vciBvZmZzZXQgJXUiLAorCQkJCQlfX2Z1bmNfXywgZGVwZC0+c2l6ZSwgb2Zmc2V0KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJ1Zl8gPSAodTMyICopJl9kZXBjW29mZnNldF07CisJCX0KKwkJaWYgKGlzQUxTQSkgeworCQkJaWYgKGRlcGQtPnNpemUgPT0gMikgeworCQkJCSoobG9uZyAqKWJ1ZiA9IChsb25nKSooX191MTYgKilidWZfOworCQkJCWVhZ2xlX2FzbV9kYmcoIiVzOiBhc20gb3V0IDE2IGJpdCB2YWx1ZSAlbGkiLAorCQkJCQkJX19mdW5jX18sICoobG9uZyAqKWJ1Zik7CisJCQl9IGVsc2UgeworCQkJCXMzMiAqcGJ1ZiA9IChzMzIgKilidWZfOworCQkJCWxvbmcgKmJ1ZmwgPSAobG9uZyAqKWJ1ZjsKKworCQkJCWZvciAoaSA9IDA7IGkgPCAoZGVwZC0+c2l6ZSA+PiAyKTsgaSsrKSB7CisJCQkJCSpidWZsKysgPSAobG9uZykqcGJ1ZisrOworCQkJCQllYWdsZV9hc21fZGJnKCIlczogYXNtIG91dCB2YWx1ZSAlbGkiLAorCQkJCQkJCSBfX2Z1bmNfXywgKihidWZsLTEpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQltZW1jcHkoYnVmLCBidWZfLCBkZXBkLT5zaXplKTsKKwkJfQorRFRTX0VBR0xFX0lPQ1RMX0dFVF9QQVJBTV9QUkVfRVhJVDoKKwkJdmZyZWUoYnVmX20pOworCQlyZXR1cm4gKGludClyZXQ7CisJfSBlbHNlIHsKKwkJczMyIHRndCA9IF9nZXRfY2JfZm9yX2RldihkZXBkLT5kZXZpY2UpOworCisJCWlmICh0Z3QgPCAwKSB7CisJCQllYWdsZV9hc21fZXJyKCIlczogbm8gY2FjaGUgZm9yIGRldmljZSAldSBmb3VuZCIsCisJCQkJX19mdW5jX18sIGRlcGQtPmRldmljZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlvZmZzZXQgPSBfY19ibFt0Z3RdW0NCRF9PRkZTR10gKyBkZXBkLT5vZmZzZXQ7CisJCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJCWlmIChvZmZzZXQgPiAoVUlOVF9NQVggLSBkZXBkLT5zaXplKSkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWlmICgoZXJyICE9IDApIHx8ICgob2Zmc2V0ICsgZGVwZC0+c2l6ZSkgPiBfZGVwY19zaXplKSkgeworCQkJZWFnbGVfYXNtX2VycigiJXM6IGludmFsaWQgc2l6ZSAldSBhbmQvb3Igb2Zmc2V0ICV1IGZvciBwYXJhbWV0ZXIgKGNhY2hlIGlzIHNpemUgJXUpIiwKKwkJCQlfX2Z1bmNfXywgZGVwZC0+c2l6ZSwgb2Zmc2V0LCBfZGVwY19zaXplKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChpc0FMU0EpIHsKKwkJCWlmIChkZXBkLT5zaXplID09IDIpIHsKKwkJCQkqKF9fdTE2ICopJl9kZXBjW29mZnNldF0gPSAoX191MTYpKihsb25nICopYnVmOworCQkJCWVhZ2xlX2FzbV9kYmcoIiVzOiBhc20gaW4gMTYgYml0IHZhbHVlICVsaSIsCisJCQkJCQlfX2Z1bmNfXywgKihsb25nICopYnVmKTsKKwkJCX0gZWxzZSB7CisJCQkJczMyICpwYnVmID0gKHMzMiAqKSZfZGVwY1tvZmZzZXRdOworCQkJCWxvbmcgKmJ1ZmwgPSAobG9uZyAqKWJ1ZjsKKworCQkJCWZvciAoaSA9IDA7IGkgPCAoZGVwZC0+c2l6ZSA+PiAyKTsgaSsrKSB7CisJCQkJCSpwYnVmKysgPSAoczMyKSpidWZsKys7CisJCQkJCWVhZ2xlX2FzbV9kYmcoIiVzOiBhc20gaW4gdmFsdWUgJWkiLAorCQkJCQkJCV9fZnVuY19fLCAqKHBidWYtMSkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgmX2RlcGNbb2Zmc2V0XSwgYnVmLCBkZXBkLT5zaXplKTsKKwkJfQorCQllYWdsZV9hc21fZGJnKCIlczogcGFyYW0gaW5mbzogcGFyYW0gPSAweCVYLCBzaXplID0gJXUsIG9mZnNldCA9ICVpLCBkZXZpY2UgPSAldSwgY2FjaGUgYmxvY2sgJWksIGdsb2JhbCBvZmZzZXQgPSAldSwgZmlyc3QgYnl0ZXMgYXMgaW50ZWdlciA9ICVpIiwKKwkJCV9fZnVuY19fLCBkZXBkLT5pZCwgZGVwZC0+c2l6ZSwgZGVwZC0+b2Zmc2V0LAorCQkJZGVwZC0+ZGV2aWNlLAorCQkJdGd0LCBvZmZzZXQsICooaW50ICopJl9kZXBjW29mZnNldF0pOworCQlpZiAocTZhc21fZHRzX2VhZ2xlX3NldChhYywgZGVwZC0+aWQsIGRlcGQtPnNpemUsCisJCQkJCSh2b2lkICopJl9kZXBjW29mZnNldF0sIHBvLCBtb2QpKQorCQkJZWFnbGVfYXNtX2VycigiJXM6IHE2YXNtX2R0c19lYWdsZV9zZXQgZmFpbGVkIHdpdGggaWQgPSAweCVYLCBzaXplID0gJXUsIG9mZnNldCA9ICVkIiwKKwkJCQlfX2Z1bmNfXywgZGVwZC0+aWQsIGRlcGQtPnNpemUsIGRlcGQtPm9mZnNldCk7CisJCWVsc2UKKwkJCWVhZ2xlX2FzbV9kYmcoIiVzOiBxNmFzbV9kdHNfZWFnbGVfc2V0IHN1Y2NlZWRlZCB3aXRoIGlkID0gMHglWCwgc2l6ZSA9ICV1LCBvZmZzZXQgPSAlZCIsCisJCQkJIF9fZnVuY19fLCBkZXBkLT5pZCwgZGVwZC0+c2l6ZSwgZGVwZC0+b2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gKGludClyZXQ7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9oYW5kbGVfYWRtKCkgLSBTZXQgb3IgR2V0IHBhcmFtcyBmcm9tIEFETQorICogQGRlcGQ6CURUUyBFYWdsZSBQYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gc2V0IG9yIGdldC4KKyAqIEBidWY6CUJ1ZmZlciB0byBnZXQgcXVlcmllZCBwYXJhbSB2YWx1ZSBpbiBOVCBtb2RlLgorICogQGZvcl9wcmU6CUZvciBwcmVtaXggbW9kdWxlIG9yIHBvc3RtaXggbW9kdWxlLgorICogQGdldDoJR2V0dGluZyBwYXJhbSBmcm9tIERTUCBvciBzZXR0aW5nIHBhcmFtLgorICoKKyAqIFNldCBvciBHZXQgcGFyYW1zIGZyb20gbW9kdWxlcyBpbiBBRE0gc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm46IFJldHVybiBmYWlsdXJlIGlmIGFueS4KKyAqLworaW50IG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FkbShzdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKmRlcGQsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgYm9vbCBmb3JfcHJlLCBib29sIGdldCkKK3sKKwl1MzIgcGlkID0gX2dldF9waWRfZnJvbV9kZXYoZGVwZC0+ZGV2aWNlKSwgY2lkeDsKKwlzMzIgcmV0ID0gMDsKKworCWVhZ2xlX2FkbV9kYmcoIiVzOiBzZXQvZ2V0IGFkbSIsIF9fZnVuY19fKTsKKworCWlmIChfaXNOVERldmljZShkZXBkLT5kZXZpY2UpKSB7CisJCWVhZ2xlX2FkbV9kYmcoIiVzOiBOVCBSb3V0ZSBkZXRlY3RlZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gbXNtX2R0c19lYWdsZV9oYW5kbGVfYXNtKGRlcGQsIGJ1ZiwgZm9yX3ByZSwgZ2V0LAorCQkJCQkgICAgICAgX2dldE5URGV2aWNlQUMoKSwgJl9wb19OVCk7CisJCWlmIChyZXQgPCAwKQorCQkJZWFnbGVfYWRtX2VycigiJXM6IE5UIFJvdXRlIHNldCBmYWlsZWQgd2l0aCBpZCA9IDB4JVgsIHNpemUgPSAldSwgb2Zmc2V0ID0gJWksIGRldmljZSA9ICV1IiwKKwkJCQlfX2Z1bmNfXywgZGVwZC0+aWQsIGRlcGQtPnNpemUsIGRlcGQtPm9mZnNldCwKKwkJCQlkZXBkLT5kZXZpY2UpOworCX0gZWxzZSBpZiAoZ2V0KSB7CisJCWNpZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBpZCk7CisJCWVhZ2xlX2FkbV9kYmcoIiVzOiBnZXQgZnJvbSBxZHNwIHJlcXVlc3RlZCAocG9ydCBpZCAweCVYKSIsCisJCQkgX19mdW5jX18sIHBpZCk7CisJCWlmIChhZG1fZHRzX2VhZ2xlX2dldChwaWQsIF9jaWR4W2NpZHhdLCBkZXBkLT5pZCwKKwkJCQkgICAgICBidWYsIGRlcGQtPnNpemUpIDwgMCkgeworCQkJZWFnbGVfYWRtX2VycigiJXM6IGdldCBmcm9tIHFkc3AgdmlhIGFkbSB3aXRoIHBvcnQgaWQgMHglWCBmYWlsZWQiLAorCQkJCSBfX2Z1bmNfXywgcGlkKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIGlmIChfaXNfcG9ydF9vcGVuX2FuZF9lYWdsZShwaWQpKSB7CisJCWNpZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBpZCk7CisJCWVhZ2xlX2FkbV9kYmcoIiVzOiBhZG1fZHRzX2VhZ2xlX3NldCBjYWxsZWQgd2l0aCBpZCA9IDB4JVgsIHNpemUgPSAldSwgb2Zmc2V0ID0gJWksIGRldmljZSA9ICV1LCBwb3J0IGlkID0gJXUsIGNvcHAgaW5kZXggPSAldSIsCisJCQkJX19mdW5jX18sIGRlcGQtPmlkLCBkZXBkLT5zaXplLCBkZXBkLT5vZmZzZXQsCisJCQkJZGVwZC0+ZGV2aWNlLCBwaWQsIGNpZHgpOworCQlyZXQgPSBhZG1fZHRzX2VhZ2xlX3NldChwaWQsIF9jaWR4W2NpZHhdLCBkZXBkLT5pZCwKKwkJCQkJKHZvaWQgKilidWYsIGRlcGQtPnNpemUpOworCQlpZiAocmV0IDwgMCkKKwkJCWVhZ2xlX2FkbV9lcnIoIiVzOiBhZG1fZHRzX2VhZ2xlX3NldCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCWVsc2UKKwkJCWVhZ2xlX2FkbV9kYmcoIiVzOiBhZG1fZHRzX2VhZ2xlX3NldCBzdWNjZWVkZWQiLAorCQkJCV9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQllYWdsZV9hZG1fZGJnKCIlczogcG9ydCBpZCAweCVYIG5vdCBhY3RpdmUgb3Igbm90IEVhZ2xlIiwKKwkJCSBfX2Z1bmNfXywgcGlkKTsKKwl9CisJcmV0dXJuIChpbnQpcmV0OworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfaW9jdGwoKSAtIGlvY3RsIGhhbmRsZXIgZnVuY3Rpb24KKyAqIEBjbWQ6CWNtZCB0byBoYW5kbGUuCisgKiBAYXJnOglhcmd1bWVudCB0byB0aGUgY21kLgorICoKKyAqIEhhbmRsZSBEVFMgRWFnbGUgaW9jdGwgY21kcy4KKyAqCisgKiBSZXR1cm46IFJldHVybiBmYWlsdXJlIGlmIGFueS4KKyAqLworaW50IG1zbV9kdHNfZWFnbGVfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJczMyIHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX0dFVF9DQUNIRV9TSVpFOiB7CisJCWVhZ2xlX2lvY3RsX2luZm8oIiVzOiBjYWxsZWQgd2l0aCBjb250cm9sIDB4JVggKGdldCBwYXJhbSBjYWNoZSBzaXplKSIsCisJCQlfX2Z1bmNfXywgY21kKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJl9kZXBjX3NpemUsCisJCQkJIHNpemVvZihfZGVwY19zaXplKSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIHdyaXRpbmcgc2l6ZSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfU0laRTogeworCQl1MzIgc2l6ZSA9IDA7CisKKwkJZWFnbGVfaW9jdGxfaW5mbygiJXM6IGNhbGxlZCB3aXRoIGNvbnRyb2wgMHglWCAoYWxsb2NhdGUgcGFyYW0gY2FjaGUpIiwKKwkJCV9fZnVuY19fLCBjbWQpOworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmc2l6ZSwgKHZvaWQgKilhcmcsIHNpemVvZihzaXplKSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGNvcHlpbmcgc2l6ZSAoc3JjOiVwSywgdGd0OiVwSywgc2l6ZTolenUpIiwKKwkJCQlfX2Z1bmNfXywgKHZvaWQgKilhcmcsICZzaXplLCBzaXplb2Yoc2l6ZSkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZSBpZiAoc2l6ZSA+IERFUENfTUFYX1NJWkUpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGNhY2hlIHNpemUgJXUgbm90IGFsbG93ZWQgKG1pbiAwLCBtYXggJXUpIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZSwgREVQQ19NQVhfU0laRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoX2RlcGMpIHsKKwkJCWVhZ2xlX2lvY3RsX2RiZygiJXM6IHByZXZpb3VzIHBhcmFtIGNhY2hlIG9mIHNpemUgJXUgZnJlZWQiLAorCQkJCV9fZnVuY19fLCBfZGVwY19zaXplKTsKKwkJCV9kZXBjX3NpemUgPSAwOworCQkJdmZyZWUoX2RlcGMpOworCQkJX2RlcGMgPSBOVUxMOworCQl9CisJCWlmIChzaXplKQorCQkJX2RlcGMgPSB2emFsbG9jKHNpemUpOworCQllbHNlCisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiAldSBieXRlcyByZXF1ZXN0ZWQgZm9yIHBhcmFtIGNhY2hlLCBub3RoaW5nIGFsbG9jYXRlZCIsCisJCQkJX19mdW5jX18sIHNpemUpOworCQlpZiAoX2RlcGMpIHsKKwkJCWVhZ2xlX2lvY3RsX2RiZygiJXM6ICV1IGJ5dGVzIGFsbG9jYXRlZCBmb3IgcGFyYW0gY2FjaGUiLAorCQkJCV9fZnVuY19fLCBzaXplKTsKKwkJCV9kZXBjX3NpemUgPSBzaXplOworCQl9IGVsc2UgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyBwYXJhbSBjYWNoZSAodnphbGxvYyBmYWlsZWQgb24gJXUgYnl0ZXMpIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZSk7CisJCQlfZGVwY19zaXplID0gMDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERUU19FQUdMRV9JT0NUTF9HRVRfUEFSQU06IHsKKwkJc3RydWN0IGR0c19lYWdsZV9wYXJhbV9kZXNjIGRlcGQ7CisJCXMzMiBmb3JfcHJlID0gMCwgZ2V0X2Zyb21fY29yZSA9IDAsIGVyciA9IDA7CisJCXUzMiBvZmZzZXQ7CisJCXZvaWQgKmJ1ZiwgKmJ1Zl9tID0gTlVMTDsKKworCQllYWdsZV9pb2N0bF9pbmZvKCIlczogY29udHJvbCAweCVYIChnZXQgcGFyYW0pIiwKKwkJCV9fZnVuY19fLCBjbWQpOworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmZGVwZCwgKHZvaWQgKilhcmcsIHNpemVvZihkZXBkKSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGNvcHlpbmcgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgKHNyYzolcEssIHRndDolcEssIHNpemU6JXp1KSIsCisJCQkJX19mdW5jX18sICh2b2lkICopYXJnLCAmZGVwZCwgc2l6ZW9mKGRlcGQpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChkZXBkLmRldmljZSAmIERUU19FQUdMRV9GTEFHX0lPQ1RMX1BSRSkgeworCQkJZWFnbGVfaW9jdGxfZGJnKCIlczogdXNpbmcgZm9yIHByZW1peCIsIF9fZnVuY19fKTsKKwkJCWZvcl9wcmUgPSAxOworCQl9CisJCWlmIChkZXBkLmRldmljZSAmIERUU19FQUdMRV9GTEFHX0lPQ1RMX0dFVEZST01DT1JFKSB7CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiAnZ2V0IGZyb20gY29yZScgcmVxdWVzdGVkIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnZXRfZnJvbV9jb3JlID0gMTsKKwkJCWRlcGQub2Zmc2V0ID0gLTE7CisJCX0KKwkJZGVwZC5kZXZpY2UgJj0gRFRTX0VBR0xFX0ZMQUdfSU9DVExfTUFTSzsKKwkJaWYgKGRlcGQub2Zmc2V0ID09IC0xKSB7CisJCQlpZiAoZGVwZC5zaXplID4gMCAmJiBkZXBkLnNpemUgPD0gREVQQ19NQVhfU0laRSkgeworCQkJCWJ1ZiA9IGJ1Zl9tID0gdnphbGxvYyhkZXBkLnNpemUpOworCQkJfSBlbHNlIHsKKwkJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBnZXQgc2l6ZSAldSBpbnZhbGlkIiwKKwkJCQkJCV9fZnVuY19fLCBkZXBkLnNpemUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKCFidWZfbSkgeworCQkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IG91dCBvZiBtZW1vcnkiLCBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAoZ2V0X2Zyb21fY29yZSkKKwkJCQlyZXQgPSBjb3JlX2R0c19lYWdsZV9nZXQoZGVwZC5pZCwgZGVwZC5zaXplLAorCQkJCQkJCSBidWYpOworCQkJZWxzZQorCQkJCXJldCA9IG1zbV9kdHNfZWFnbGVfaGFuZGxlX2FkbSgmZGVwZCwgYnVmLAorCQkJCQkJCQlmb3JfcHJlLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXMzMiBjYiA9IF9nZXRfY2JfZm9yX2RldihkZXBkLmRldmljZSk7CisKKwkJCWlmIChjYiA8IDApIHsKKwkJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBubyBjYWNoZSBmb3IgZGV2aWNlICV1IGZvdW5kIiwKKwkJCQkJX19mdW5jX18sIGRlcGQuZGV2aWNlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCW9mZnNldCA9IF9jX2JsW2NiXVtDQkRfT0ZGU0ddICsgZGVwZC5vZmZzZXQ7CisJCQkvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworCQkJaWYgKG9mZnNldCA+IChVSU5UX01BWCAtIGRlcGQuc2l6ZSkpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlmICgoZXJyICE9IDApIHx8CisJCQkgICAgKChvZmZzZXQgKyBkZXBkLnNpemUpID4gX2RlcGNfc2l6ZSkpIHsKKwkJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBpbnZhbGlkIHNpemUgJXUgYW5kL29yIG9mZnNldCAldSIsCisJCQkJCV9fZnVuY19fLCBkZXBkLnNpemUsIG9mZnNldCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlidWYgPSAodm9pZCAqKSZfZGVwY1tvZmZzZXRdOworCQl9CisJCWlmIChyZXQgPCAwKQorCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgJWkgZ2V0dGluZyBkYXRhIiwgX19mdW5jX18sCisJCQkJcmV0KTsKKwkJZWxzZSBpZiAoY29weV90b191c2VyKCh2b2lkICopKCgoY2hhciAqKWFyZykrc2l6ZW9mKGRlcGQpKSwKKwkJCQkJCSAgYnVmLCBkZXBkLnNpemUpKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciBjb3B5aW5nIGdldCBkYXRhIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCQl2ZnJlZShidWZfbSk7CisJCWJyZWFrOworCX0KKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfUEFSQU06IHsKKwkJc3RydWN0IGR0c19lYWdsZV9wYXJhbV9kZXNjIGRlcGQ7CisJCXMzMiBqdXN0X3NldF9jYWNoZSA9IDAsIGZvcl9wcmUgPSAwLCBlcnIgPSAwOworCQl1MzIgb2Zmc2V0OworCQlzMzIgdGd0OworCisJCWVhZ2xlX2lvY3RsX2luZm8oIiVzOiBjb250cm9sIDB4JVggKHNldCBwYXJhbSkiLAorCQkJX19mdW5jX18sIGNtZCk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZkZXBkLCAodm9pZCAqKWFyZywgc2l6ZW9mKGRlcGQpKSkgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgY29weWluZyBkdHNfZWFnbGVfcGFyYW1fZGVzYyAoc3JjOiVwSywgdGd0OiVwSywgc2l6ZTolenUpIiwKKwkJCQlfX2Z1bmNfXywgKHZvaWQgKilhcmcsICZkZXBkLCBzaXplb2YoZGVwZCkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGRlcGQuZGV2aWNlICYgRFRTX0VBR0xFX0ZMQUdfSU9DVExfUFJFKSB7CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiB1c2luZyBmb3IgcHJlbWl4IiwgX19mdW5jX18pOworCQkJZm9yX3ByZSA9IDE7CisJCX0KKwkJaWYgKGRlcGQuZGV2aWNlICYgRFRTX0VBR0xFX0ZMQUdfSU9DVExfSlVTVFNFVENBQ0hFKSB7CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiAnanVzdCBzZXQgY2FjaGUnIHJlcXVlc3RlZCIsCisJCQkJX19mdW5jX18pOworCQkJanVzdF9zZXRfY2FjaGUgPSAxOworCQl9CisJCWRlcGQuZGV2aWNlICY9IERUU19FQUdMRV9GTEFHX0lPQ1RMX01BU0s7CisJCXRndCA9IF9nZXRfY2JfZm9yX2RldihkZXBkLmRldmljZSk7CisJCWlmICh0Z3QgPCAwKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBubyBjYWNoZSBmb3IgZGV2aWNlICV1IGZvdW5kIiwKKwkJCQlfX2Z1bmNfXywgZGVwZC5kZXZpY2UpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJb2Zmc2V0ID0gX2NfYmxbdGd0XVtDQkRfT0ZGU0ddICsgZGVwZC5vZmZzZXQ7CisJCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJCWlmIChvZmZzZXQgPiAoVUlOVF9NQVggLSBkZXBkLnNpemUpKQorCQkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKChlcnIgIT0gMCkgfHwgKChvZmZzZXQgKyBkZXBkLnNpemUpID4gX2RlcGNfc2l6ZSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGludmFsaWQgc2l6ZSAldSBhbmQvb3Igb2Zmc2V0ICV1IGZvciBwYXJhbWV0ZXIgKHRhcmdldCBjYWNoZSBibG9jayAlaSB3aXRoIG9mZnNldCAlaSwgZ2xvYmFsIGNhY2hlIGlzIHNpemUgJXUpIiwKKwkJCQlfX2Z1bmNfXywgZGVwZC5zaXplLCBvZmZzZXQsIHRndCwKKwkJCQlfY19ibFt0Z3RdW0NCRF9PRkZTR10sIF9kZXBjX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJl9kZXBjW29mZnNldF0sCisJCQkJICAgKHZvaWQgKikoKChjaGFyICopYXJnKStzaXplb2YoZGVwZCkpLAorCQkJCQlkZXBkLnNpemUpKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciBjb3B5aW5nIHBhcmFtIHRvIGNhY2hlIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV1KSIsCisJCQkJX19mdW5jX18sICgoY2hhciAqKWFyZykrc2l6ZW9mKGRlcGQpLAorCQkJCSZfZGVwY1tvZmZzZXRdLCBkZXBkLnNpemUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZWFnbGVfaW9jdGxfZGJnKCIlczogcGFyYW0gaW5mbzogcGFyYW0gPSAweCVYLCBzaXplID0gJXUsIG9mZnNldCA9ICVpLCBkZXZpY2UgPSAldSwgY2FjaGUgYmxvY2sgJWksIGdsb2JhbCBvZmZzZXQgPSAldSwgZmlyc3QgYnl0ZXMgYXMgaW50ZWdlciA9ICVpIiwKKwkJCV9fZnVuY19fLCBkZXBkLmlkLCBkZXBkLnNpemUsIGRlcGQub2Zmc2V0LAorCQkJZGVwZC5kZXZpY2UsIHRndCwgb2Zmc2V0LCAqKGludCAqKSZfZGVwY1tvZmZzZXRdKTsKKwkJaWYgKCFqdXN0X3NldF9jYWNoZSkgeworCQkJcmV0ID0gbXNtX2R0c19lYWdsZV9oYW5kbGVfYWRtKCZkZXBkLCAmX2RlcGNbb2Zmc2V0XSwKKwkJCQkJCSAgICAgICBmb3JfcHJlLCBmYWxzZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9CTE9DSzogeworCQl1MzIgYl9bQ0JEX0NPVU5UKzFdLCAqYiA9ICZiX1sxXSwgY2I7CisKKwkJZWFnbGVfaW9jdGxfaW5mbygiJXM6IHdpdGggY29udHJvbCAweCVYIChzZXQgcGFyYW0gY2FjaGUgYmxvY2spIiwKKwkJCSBfX2Z1bmNfXywgY21kKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopYl8sICh2b2lkICopYXJnLCBzaXplb2YoYl8pKSkgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgY29weWluZyBjYWNoZSBibG9jayBkYXRhIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV6dSkiLAorCQkJCV9fZnVuY19fLCAodm9pZCAqKWFyZywgYl8sIHNpemVvZihiXykpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY2IgPSBiX1swXTsKKwkJaWYgKGNiID49IENCX0NPVU5UKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBjYWNoZSBibG9jayAldSBvdXQgb2YgcmFuZ2UgKG1heCAldSkiLAorCQkJCV9fZnVuY19fLCBjYiwgQ0JfQ09VTlQtMSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllYWdsZV9pb2N0bF9kYmcoIiVzOiBjYWNoZSBibG9jayAlaSBzZXQ6IGRldmljZXMgMHglWCwgZ2xvYmFsIG9mZnNldCAlaSwgb2Zmc2V0cyAxOiV1IDI6JXUgMzoldSwgY21kcy9zaXplcyAwOjB4JVggJXUgMToweCVYICV1IDI6MHglWCAldSAzOjB4JVggJXUiLAorCQlfX2Z1bmNfXywgY2IsIF9jX2JsW2NiXVtDQkRfREVWX01BU0tdLCBfY19ibFtjYl1bQ0JEX09GRlNHXSwKKwkJX2NfYmxbY2JdW0NCRF9PRkZTMV0sIF9jX2JsW2NiXVtDQkRfT0ZGUzJdLAorCQlfY19ibFtjYl1bQ0JEX09GRlMzXSwgX2NfYmxbY2JdW0NCRF9DTUQwXSwgX2NfYmxbY2JdW0NCRF9TWjBdLAorCQlfY19ibFtjYl1bQ0JEX0NNRDFdLCBfY19ibFtjYl1bQ0JEX1NaMV0sIF9jX2JsW2NiXVtDQkRfQ01EMl0sCisJCV9jX2JsW2NiXVtDQkRfU1oyXSwgX2NfYmxbY2JdW0NCRF9DTUQzXSwgX2NfYmxbY2JdW0NCRF9TWjNdKTsKKwkJaWYgKChiW0NCRF9PRkZTR10rYltDQkRfT0ZGUzFdK2JbQ0JEX1NaMV0pID4gX2RlcGNfc2l6ZSB8fAorCQkJKGJbQ0JEX09GRlNHXStiW0NCRF9PRkZTMl0rYltDQkRfU1oyXSkgPiBfZGVwY19zaXplIHx8CisJCQkoYltDQkRfT0ZGU0ddK2JbQ0JEX09GRlMzXStiW0NCRF9TWjNdKSA+IF9kZXBjX3NpemUpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGNhY2hlIGJsb2NrIGJvdW5kcyBvdXQgb2YgcmFuZ2UiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZW1jcHkoX2NfYmxbY2JdLCBiLCBzaXplb2YoX2NfYmxbY2JdKSk7CisJCWJyZWFrOworCX0KKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQUNUSVZFX0RFVklDRTogeworCQl1MzIgZGF0YVsyXTsKKworCQllYWdsZV9pb2N0bF9kYmcoIiVzOiB3aXRoIGNvbnRyb2wgMHglWCAoc2V0IGFjdGl2ZSBkZXZpY2UpIiwKKwkJCSBfX2Z1bmNfXywgY21kKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopZGF0YSwgKHZvaWQgKilhcmcsIHNpemVvZihkYXRhKSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGNvcHlpbmcgYWN0aXZlIGRldmljZSBkYXRhIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV6dSkiLAorCQkJCV9fZnVuY19fLCAodm9pZCAqKWFyZywgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChkYXRhWzFdICE9IDApIHsKKwkJCV9kZXZpY2VfcHJpbWFyeSA9IGRhdGFbMF07CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiBwcmltYXJ5IGRldmljZSAlaSIsIF9fZnVuY19fLAorCQkJCSBkYXRhWzBdKTsKKwkJfSBlbHNlIHsKKwkJCV9kZXZpY2VfYWxsID0gZGF0YVswXTsKKwkJCWVhZ2xlX2lvY3RsX2RiZygiJXM6IGFsbCBkZXZpY2VzIDB4JVgiLCBfX2Z1bmNfXywKKwkJCQkgZGF0YVswXSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX0dFVF9MSUNFTlNFOiB7CisJCXUzMiB0YXJnZXQgPSAwLCBzaXplID0gMDsKKwkJczMyIHNpemVfb25seTsKKworCQllYWdsZV9pb2N0bF9kYmcoIiVzOiB3aXRoIGNvbnRyb2wgMHglWCAoZ2V0IGxpY2Vuc2UpIiwKKwkJCSBfX2Z1bmNfXywgY21kKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnRhcmdldCwgKHZvaWQgKilhcmcsCisJCQkJICAgc2l6ZW9mKHRhcmdldCkpKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciByZWFkaW5nIGxpY2Vuc2UgaW5kZXguIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV6dSkiLAorCQkJCV9fZnVuY19fLCAodm9pZCAqKWFyZywgJnRhcmdldCwgc2l6ZW9mKHRhcmdldCkpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJc2l6ZV9vbmx5ID0gdGFyZ2V0ICYgKDE8PDMxKSA/IDEgOiAwOworCQl0YXJnZXQgJj0gMHg3RkZGRkZGRjsKKwkJaWYgKHRhcmdldCA+PSBTRUNfQkxPQl9NQVhfQ05UKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBsaWNlbnNlIGluZGV4ICV1IG91dCBvZiBib3VuZHMgKG1heCBpbmRleCBpcyAlaSkiLAorCQkJCSAgIF9fZnVuY19fLCB0YXJnZXQsIFNFQ19CTE9CX01BWF9DTlQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKF9zZWNfYmxvYlt0YXJnZXRdID09IE5VTEwpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGxpY2Vuc2UgaW5kZXggJXUgbmV2ZXIgaW5pdGlhbGl6ZWQiLAorCQkJCSAgIF9fZnVuY19fLCB0YXJnZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2l6ZSA9ICgodTMyICopX3NlY19ibG9iW3RhcmdldF0pWzBdOworCQlpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPiBTRUNfQkxPQl9NQVhfU0laRSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGxpY2Vuc2Ugc2l6ZSAldSBmb3IgaW5kZXggJXUgaW52YWxpZCAobWluIHNpemUgaXMgMSwgbWF4IHNpemUgaXMgJXUpIiwKKwkJCQkgICBfX2Z1bmNfXywgc2l6ZSwgdGFyZ2V0LCBTRUNfQkxPQl9NQVhfU0laRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoc2l6ZV9vbmx5KSB7CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiByZXBvcnRpbmcgc2l6ZSBvZiBsaWNlbnNlIGRhdGEgb25seSIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoKChjaGFyICopYXJnKStzaXplb2YodGFyZ2V0KSksCisJCQkJICh2b2lkICopJnNpemUsIHNpemVvZihzaXplKSkpIHsKKwkJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciBjb3B5aW5nIGxpY2Vuc2Ugc2l6ZSIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0gZWxzZSBpZiAoY29weV90b191c2VyKCh2b2lkICopKCgoY2hhciAqKWFyZykrc2l6ZW9mKHRhcmdldCkpLAorCQkJICAgKHZvaWQgKikmKCgoczMyICopX3NlY19ibG9iW3RhcmdldF0pWzFdKSwgc2l6ZSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGNvcHlpbmcgbGljZW5zZSBkYXRhIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWVhZ2xlX2lvY3RsX2luZm8oIiVzOiBsaWNlbnNlIGZpbGUgJXUgYnl0ZXMgbG9uZyBmcm9tIGxpY2Vuc2UgaW5kZXggJXUgcmV0dXJuZWQgdG8gdXNlciIsCisJCQkJICBfX2Z1bmNfXywgc2l6ZSwgdGFyZ2V0KTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0xJQ0VOU0U6IHsKKwkJdTMyIHRhcmdldFsyXSA9IHswLCAwfTsKKworCQllYWdsZV9pb2N0bF9kYmcoIiVzOiBjb250cm9sIDB4JVggKHNldCBsaWNlbnNlKSIsIF9fZnVuY19fLAorCQkJCWNtZCk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKXRhcmdldCwgKHZvaWQgKilhcmcsCisJCQkJICAgc2l6ZW9mKHRhcmdldCkpKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciByZWFkaW5nIGxpY2Vuc2UgaW5kZXggKHNyYzolcEssIHRndDolcEssIHNpemU6JXp1KSIsCisJCQkJX19mdW5jX18sICh2b2lkICopYXJnLCB0YXJnZXQsIHNpemVvZih0YXJnZXQpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmICh0YXJnZXRbMF0gPj0gU0VDX0JMT0JfTUFYX0NOVCkgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogbGljZW5zZSBpbmRleCAldSBvdXQgb2YgYm91bmRzIChtYXggaW5kZXggaXMgJXUpIiwKKwkJCQkgICBfX2Z1bmNfXywgdGFyZ2V0WzBdLCBTRUNfQkxPQl9NQVhfQ05ULTEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHRhcmdldFsxXSA9PSAwKSB7CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiByZXF1ZXN0IHRvIGZyZWUgbGljZW5zZSBpbmRleCAldSIsCisJCQkJIF9fZnVuY19fLCB0YXJnZXRbMF0pOworCQkJa2ZyZWUoX3NlY19ibG9iW3RhcmdldFswXV0pOworCQkJX3NlY19ibG9iW3RhcmdldFswXV0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCh0YXJnZXRbMV0gPT0gMCkgfHwgKHRhcmdldFsxXSA+PSBTRUNfQkxPQl9NQVhfU0laRSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGxpY2Vuc2Ugc2l6ZSAldSBmb3IgaW5kZXggJXUgaW52YWxpZCAobWluIHNpemUgaXMgMSwgbWF4IHNpemUgaXMgJXUpIiwKKwkJCQlfX2Z1bmNfXywgdGFyZ2V0WzFdLCB0YXJnZXRbMF0sCisJCQkJU0VDX0JMT0JfTUFYX1NJWkUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKF9zZWNfYmxvYlt0YXJnZXRbMF1dICE9IE5VTEwpIHsKKwkJCWlmICgoKHUzMiAqKV9zZWNfYmxvYlt0YXJnZXRbMF1dKVsxXSAhPSB0YXJnZXRbMV0pIHsKKwkJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiByZXF1ZXN0IG5ldyBzaXplIGZvciBhbHJlYWR5IGFsbG9jYXRlZCBsaWNlbnNlIGluZGV4ICV1IiwKKwkJCQkJIF9fZnVuY19fLCB0YXJnZXRbMF0pOworCQkJCWtmcmVlKF9zZWNfYmxvYlt0YXJnZXRbMF1dKTsKKwkJCQlfc2VjX2Jsb2JbdGFyZ2V0WzBdXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJZWFnbGVfaW9jdGxfZGJnKCIlczogYWxsb2NhdGluZyAldSBieXRlcyBmb3IgbGljZW5zZSBpbmRleCAldSIsCisJCQkJX19mdW5jX18sIHRhcmdldFsxXSwgdGFyZ2V0WzBdKTsKKwkJX3NlY19ibG9iW3RhcmdldFswXV0gPSBremFsbG9jKHRhcmdldFsxXSArIDQsIEdGUF9LRVJORUwpOworCQlpZiAoIV9zZWNfYmxvYlt0YXJnZXRbMF1dKSB7CisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBlcnJvciBhbGxvY2F0aW5nIGxpY2Vuc2UgaW5kZXggJXUgKGt6YWxsb2MgZmFpbGVkIG9uICV1IGJ5dGVzKSIsCisJCQkJCV9fZnVuY19fLCB0YXJnZXRbMF0sIHRhcmdldFsxXSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkoKHUzMiAqKV9zZWNfYmxvYlt0YXJnZXRbMF1dKVswXSA9IHRhcmdldFsxXTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKAorCQkJCSh2b2lkICopJigoKHUzMiAqKV9zZWNfYmxvYlt0YXJnZXRbMF1dKVsxXSksCisJCQkJKHZvaWQgKikoKChjaGFyICopYXJnKStzaXplb2YodGFyZ2V0KSksCisJCQkJdGFyZ2V0WzFdKSkgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgY29weWluZyBsaWNlbnNlIHRvIGluZGV4ICV1LCBzaXplICV1IChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV1KSIsCisJCQkJCV9fZnVuY19fLCB0YXJnZXRbMF0sIHRhcmdldFsxXSwKKwkJCQkJKChjaGFyICopYXJnKStzaXplb2YodGFyZ2V0KSwKKwkJCQkJJigoKHUzMiAqKV9zZWNfYmxvYlt0YXJnZXRbMF1dKVsxXSksCisJCQkJCXRhcmdldFsxXSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQllYWdsZV9pb2N0bF9pbmZvKCIlczogbGljZW5zZSBmaWxlICV1IGJ5dGVzIGxvbmcgY29waWVkIHRvIGluZGV4IGxpY2Vuc2UgaW5kZXggJXUiLAorCQkJCSAgX19mdW5jX18sIHRhcmdldFsxXSwgdGFyZ2V0WzBdKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFTkRfTElDRU5TRTogeworCQl1MzIgdGFyZ2V0ID0gMDsKKworCQllYWdsZV9pb2N0bF9kYmcoIiVzOiBjb250cm9sIDB4JVggKHNlbmQgbGljZW5zZSkiLCBfX2Z1bmNfXywKKwkJCQljbWQpOworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdGFyZ2V0LCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2YodGFyZ2V0KSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIHJlYWRpbmcgbGljZW5zZSBpbmRleCAoc3JjOiVwSywgdGd0OiVwSywgc2l6ZTolenUpIiwKKwkJCQlfX2Z1bmNfXywgKHZvaWQgKilhcmcsICZ0YXJnZXQsIHNpemVvZih0YXJnZXQpKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmICh0YXJnZXQgPj0gU0VDX0JMT0JfTUFYX0NOVCkgeworCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogbGljZW5zZSBpbmRleCAldSBvdXQgb2YgYm91bmRzIChtYXggaW5kZXggaXMgJWkpIiwKKwkJCQkJX19mdW5jX18sIHRhcmdldCwgU0VDX0JMT0JfTUFYX0NOVC0xKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghX3NlY19ibG9iW3RhcmdldF0gfHwKKwkJICAgICgodTMyICopX3NlY19ibG9iW3RhcmdldF0pWzBdID09IDApIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGxpY2Vuc2UgaW5kZXggJXUgaXMgaW52YWxpZCIsCisJCQkJX19mdW5jX18sIHRhcmdldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY29yZV9kdHNfZWFnbGVfc2V0KCgoczMyICopX3NlY19ibG9iW3RhcmdldF0pWzBdLAorCQkJCShjaGFyICopJigoczMyICopX3NlY19ibG9iW3RhcmdldF0pWzFdKSA8IDApCisJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiBjb3JlX2R0c19lYWdsZV9zZXQgZmFpbGVkIHdpdGggaWQgPSAldSIsCisJCQkJX19mdW5jX18sIHRhcmdldCk7CisJCWVsc2UKKwkJCWVhZ2xlX2lvY3RsX2luZm8oIiVzOiBjb3JlX2R0c19lYWdsZV9zZXQgc3VjY2VlZGVkIHdpdGggaWQgPSAldSIsCisJCQkJIF9fZnVuY19fLCB0YXJnZXQpOworCQlicmVhazsKKwl9CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX1ZPTFVNRV9DT01NQU5EUzogeworCQlzMzIgc3BlYyA9IDA7CisKKwkJZWFnbGVfaW9jdGxfaW5mbygiJXM6IGNvbnRyb2wgMHglWCAoc2V0IHZvbHVtZSBjb21tYW5kcykiLAorCQkJCV9fZnVuY19fLCBjbWQpOworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmc3BlYywgKHZvaWQgKilhcmcsCisJCQkJCXNpemVvZihzcGVjKSkpIHsKKwkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIHJlYWRpbmcgdm9sdW1lIGNvbW1hbmQgc3BlY2lmaWVyIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV6dSkiLAorCQkJCV9fZnVuY19fLCAodm9pZCAqKWFyZywgJnNwZWMsIHNpemVvZihzcGVjKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoc3BlYyAmIDB4ODAwMDAwMDApIHsKKwkJCXUzMiBpZHggPSAoc3BlYyAmIDB4MDAwMEYwMDApID4+IDEyOworCQkJczMyIHNpemUgPSBzcGVjICYgMHgwMDAwMEZGRjsKKworCQkJZWFnbGVfaW9jdGxfZGJnKCIlczogc2V0dGluZyB2b2x1bWUgY29tbWFuZCAlaSBzaXplOiAlaSIsCisJCQkJX19mdW5jX18sIGlkeCwgc2l6ZSk7CisJCQlpZiAoaWR4ID49IF92b2xfY21kX2NudCkgeworCQkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IHZvbHVtZSBjb21tYW5kIGluZGV4ICV1IG91dCBvZiBib3VuZHMgKG9ubHkgJXUgYWxsb2NhdGVkKSIsCisJCQkJCV9fZnVuY19fLCBpZHgsIF92b2xfY21kX2NudCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoX3ZvbHVtZV9jbWRzX2FsbG9jMihpZHgsIHNpemUpIDwgMCkgeworCQkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB2b2x1bWUgY29udHJvbHMiLAorCQkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJl92b2xfY21kc19kW2lkeF0sCisJCQkJCSh2b2lkICopKCgoY2hhciAqKWFyZykgKyBzaXplb2YoaW50KSksCisJCQkJCXNpemVvZihzdHJ1Y3Qgdm9sX2NtZHNfZCkpKSB7CisJCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgcmVhZGluZyB2b2x1bWUgY29tbWFuZCBkZXNjcmlwdG9yIChzcmM6JXBLLCB0Z3Q6JXBLLCBzaXplOiV6dSkiLAorCQkJCQlfX2Z1bmNfXywgKChjaGFyICopYXJnKSArIHNpemVvZihpbnQpLAorCQkJCQkmX3ZvbF9jbWRzX2RbaWR4XSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2b2xfY21kc19kKSk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiBzZXR0aW5nIHZvbHVtZSBjb21tYW5kICVpIHNwZWMgKHNpemUgJXp1KTogJWkgJWkgJWkgJWkiLAorCQkJCSAgX19mdW5jX18sIGlkeCwgc2l6ZW9mKHN0cnVjdCB2b2xfY21kc19kKSwKKwkJCQkgIF92b2xfY21kc19kW2lkeF0uZFswXSwgX3ZvbF9jbWRzX2RbaWR4XS5kWzFdLAorCQkJCSAgX3ZvbF9jbWRzX2RbaWR4XS5kWzJdLCBfdm9sX2NtZHNfZFtpZHhdLmRbM10pOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopX3ZvbF9jbWRzW2lkeF0sCisJCQkJCSh2b2lkICopKCgoY2hhciAqKWFyZykgKyAoc2l6ZW9mKGludCkgKworCQkJCQlzaXplb2Yoc3RydWN0IHZvbF9jbWRzX2QpKSksIHNpemUpKSB7CisJCQkJZWFnbGVfaW9jdGxfZXJyKCIlczogZXJyb3IgcmVhZGluZyB2b2x1bWUgY29tbWFuZCBzdHJpbmcgKHNyYzolcEssIHRndDolcEssIHNpemU6JWkpIiwKKwkJCQkJX19mdW5jX18sICgoY2hhciAqKWFyZykgKyAoc2l6ZW9mKGludCkgKworCQkJCQlzaXplb2Yoc3RydWN0IHZvbF9jbWRzX2QpKSwKKwkJCQkJX3ZvbF9jbWRzW2lkeF0sIHNpemUpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9IGVsc2UgeworCQkJZWFnbGVfaW9jdGxfZGJnKCIlczogc2V0dGluZyB2b2x1bWUgY29tbWFuZCBzaXplIiwKKwkJCQkJX19mdW5jX18pOworCQkJaWYgKHNwZWMgPCAwIHx8IHNwZWMgPiBWT0xfQ01EX0NOVF9NQVgpIHsKKwkJCQllYWdsZV9pb2N0bF9lcnIoIiVzOiB2b2x1bWUgY29tbWFuZCBjb3VudCAlaSBvdXQgb2YgYm91bmRzIChtaW4gMCwgbWF4ICVpKSIsCisJCQkJCV9fZnVuY19fLCBzcGVjLCBWT0xfQ01EX0NOVF9NQVgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmIChzcGVjID09IDApIHsKKwkJCQllYWdsZV9pb2N0bF9kYmcoIiVzOiByZXF1ZXN0IHRvIGZyZWUgdm9sdW1lIGNvbW1hbmRzIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQlfdm9sdW1lX2NtZHNfZnJlZSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWFnbGVfaW9jdGxfZGJnKCIlczogc2V0dGluZyB2b2x1bWUgY29tbWFuZCBzaXplIHJlcXVlc3RlZCA9ICVpIiwKKwkJCQkgIF9fZnVuY19fLCBzcGVjKTsKKwkJCWlmIChfdm9sdW1lX2NtZHNfYWxsb2MxKHNwZWMpIDwgMCkgeworCQkJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB2b2x1bWUgY29udHJvbHMiLAorCQkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCWVhZ2xlX2lvY3RsX2VycigiJXM6IGNvbnRyb2wgMHglWCAoaW52YWxpZCBjb250cm9sKSIsCisJCQkgX19mdW5jX18sIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCX0KKwlyZXR1cm4gKGludClyZXQ7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9jb21wYXRfaW9jdGwoKSAtIFRvIGhhbmRsZSAzMmJpdCB0byA2NGJpdCBpb2N0bCBjb21wYXRpYmlsaXR5CisgKiBAY21kOgljbWQgdG8gaGFuZGxlLgorICogQGFyZzoJYXJndW1lbnQgdG8gdGhlIGNtZC4KKyAqCisgKiBIYW5kbGUgRFRTIEVhZ2xlIGlvY3RsIGNtZHMgZnJvbSAzMmJpdCB1c2Vyc3BhY2UuCisgKgorICogUmV0dXJuOiBSZXR1cm4gZmFpbHVyZSBpZiBhbnkuCisgKi8KKyNpZmRlZiBDT05GSUdfQ09NUEFUCitpbnQgbXNtX2R0c19lYWdsZV9jb21wYXRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERUU19FQUdMRV9JT0NUTF9HRVRfQ0FDSEVfU0laRTMyOgorCQljbWQgPSBEVFNfRUFHTEVfSU9DVExfR0VUX0NBQ0hFX1NJWkU7CisJCWJyZWFrOworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9TSVpFMzI6CisJCWNtZCA9IERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfR0VUX1BBUkFNMzI6CisJCWNtZCA9IERUU19FQUdMRV9JT0NUTF9HRVRfUEFSQU07CisJCWJyZWFrOworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9QQVJBTTMyOgorCQljbWQgPSBEVFNfRUFHTEVfSU9DVExfU0VUX1BBUkFNOworCQlicmVhazsKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfQkxPQ0szMjoKKwkJY21kID0gRFRTX0VBR0xFX0lPQ1RMX1NFVF9DQUNIRV9CTE9DSzsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0FDVElWRV9ERVZJQ0UzMjoKKwkJY21kID0gRFRTX0VBR0xFX0lPQ1RMX1NFVF9BQ1RJVkVfREVWSUNFOworCQlicmVhazsKKwljYXNlIERUU19FQUdMRV9JT0NUTF9HRVRfTElDRU5TRTMyOgorCQljbWQgPSBEVFNfRUFHTEVfSU9DVExfR0VUX0xJQ0VOU0U7CisJCWJyZWFrOworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9MSUNFTlNFMzI6CisJCWNtZCA9IERUU19FQUdMRV9JT0NUTF9TRVRfTElDRU5TRTsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VORF9MSUNFTlNFMzI6CisJCWNtZCA9IERUU19FQUdMRV9JT0NUTF9TRU5EX0xJQ0VOU0U7CisJCWJyZWFrOworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9WT0xVTUVfQ09NTUFORFMzMjoKKwkJY21kID0gRFRTX0VBR0xFX0lPQ1RMX1NFVF9WT0xVTUVfQ09NTUFORFM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbXNtX2R0c19lYWdsZV9pb2N0bChjbWQsIGFyZyk7Cit9CisjZW5kaWYKKy8qKgorICogbXNtX2R0c19lYWdsZV9pbml0X3ByZSgpIC0gSW5pdGlhbGl6ZSBEVFMgcHJlbWl4IG1vZHVsZQorICogQGFjOglJbml0aWFsaXplIHByZW1peCBtb2R1bGUgaW4gdGhlIEFTTSBzZXNzaW9uLgorICoKKyAqIEluaXRpYWxpemUgRFRTIHByZW1peCBtb2R1bGUgb24gcHJvdmlkZWQgQVNNIHNlc3Npb24KKyAqCisgKiBSZXR1cm46IFJldHVybiBmYWlsdXJlIGlmIGFueS4KKyAqLworaW50IG1zbV9kdHNfZWFnbGVfaW5pdF9wcmUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJcmV0dXJuIG1zbV9kdHNfZWFnbGVfZW5hYmxlX2FzbShhYywgX2lzX2hweF9lbmFibGVkLAorCQkJCSBBVURQUk9DX01PRFVMRV9JRF9EVFNfSFBYX1BSRU1JWCk7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9kZWluaXRfcHJlKCkgLSBEZWluaXRpYWxpemUgRFRTIHByZW1peCBtb2R1bGUKKyAqIEBhYzoJRGVpbml0aWFsaXplIHByZW1peCBtb2R1bGUgaW4gdGhlIEFTTSBzZXNzaW9uLgorICoKKyAqIERlaW5pdGlhbGl6ZSBEVFMgcHJlbWl4IG1vZHVsZSBvbiBwcm92aWRlZCBBU00gc2Vzc2lvbgorICoKKyAqIFJldHVybjogQ3VycmVudGx5IGRvZXMgbm90aGluZyBzbyAwLgorICovCitpbnQgbXNtX2R0c19lYWdsZV9kZWluaXRfcHJlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfaW5pdF9wb3N0KCkgLSBJbml0aWFsaXplIERUUyBwb3N0bWl4IG1vZHVsZQorICogQHBvcnRfaWQ6CVBvcnQgaWQgZm9yIHRoZSBBRE0gc2Vzc2lvbi4KKyAqIEBjb3BwX2lkeDoJQ29wcCBpZHggZm9yIHRoZSBBRE0gc2Vzc2lvbi4KKyAqCisgKiBJbml0aWFsaXplIERUUyBwb3N0bWl4IG1vZHVsZSBvbiBBRE0gc2Vzc2lvbgorICoKKyAqIFJldHVybjogUmV0dXJuIGZhaWx1cmUgaWYgYW55LgorICovCitpbnQgbXNtX2R0c19lYWdsZV9pbml0X3Bvc3QoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKK3sKKwlyZXR1cm4gbXNtX2R0c19lYWdsZV9lbmFibGVfYWRtKHBvcnRfaWQsIGNvcHBfaWR4LCBfaXNfaHB4X2VuYWJsZWQpOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfZGVpbml0X3Bvc3QoKSAtIERlaW5pdGlhbGl6ZSBEVFMgcG9zdG1peCBtb2R1bGUKKyAqIEBwb3J0X2lkOglQb3J0IGlkIGZvciB0aGUgQURNIHNlc3Npb24uCisgKiBAdG9wb2xvZ3k6CVRvcG9sb2d5IGluIHVzZS4KKyAqCisgKiBEZWluaXRpYWxpemUgRFRTIHBvc3RtaXggbW9kdWxlIG9uIEFETSBzZXNzaW9uCisgKgorICogUmV0dXJuOiBDdXJyZW50bHkgZG9lcyBub3RoaW5nIHNvIDAuCisgKi8KK2ludCBtc21fZHRzX2VhZ2xlX2RlaW5pdF9wb3N0KGludCBwb3J0X2lkLCBpbnQgdG9wb2xvZ3kpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9pbml0X21hc3Rlcl9tb2R1bGUoKSAtIEluaXRpYWxpemUgYm90aCBEVFMgbW9kdWxlcworICogQGFjOglJbml0aWFsaXplIG1vZHVsZXMgaW4gdGhlIEFTTSBzZXNzaW9uLgorICoKKyAqIEluaXRpYWxpemUgRFRTIG1vZHVsZXMgb24gQVNNIHNlc3Npb24KKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3MuCisgKi8KK2ludCBtc21fZHRzX2VhZ2xlX2luaXRfbWFzdGVyX21vZHVsZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKK3sKKwlfc2V0X2F1ZGlvY2xpZW50KGFjKTsKKwltc21fZHRzX2VhZ2xlX2VuYWJsZV9hc20oYWMsIF9pc19ocHhfZW5hYmxlZCwKKwkJCQkgQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QUkVNSVgpOworCW1zbV9kdHNfZWFnbGVfZW5hYmxlX2FzbShhYywgX2lzX2hweF9lbmFibGVkLAorCQkJCSBBVURQUk9DX01PRFVMRV9JRF9EVFNfSFBYX1BPU1RNSVgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfZGVpbml0X21hc3Rlcl9tb2R1bGUoKSAtIERlaW5pdGlhbGl6ZSBib3RoIERUUyBtb2R1bGVzCisgKiBAYWM6CURlaW5pdGlhbGl6ZSBtb2R1bGVzIGluIHRoZSBBU00gc2Vzc2lvbi4KKyAqCisgKiBEZWluaXRpYWxpemUgRFRTIG1vZHVsZXMgb24gQVNNIHNlc3Npb24KKyAqCisgKiBSZXR1cm46IFN1Y2Nlc3MuCisgKi8KK2ludCBtc21fZHRzX2VhZ2xlX2RlaW5pdF9tYXN0ZXJfbW9kdWxlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCW1zbV9kdHNfZWFnbGVfZGVpbml0X3ByZShhYyk7CisJbXNtX2R0c19lYWdsZV9kZWluaXRfcG9zdCgtMSwgMCk7CisJX2NsZWFyX2F1ZGlvY2xpZW50KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXNtX2R0c19lYWdsZV9pc19ocHhfb24oKSAtIENoZWNrIGlmIEhQWCBlZmZlY3RzIGFyZSBPbgorICoKKyAqIENoZWNrIGlmIEhQWCBlZmZlY3RzIGFyZSBPbgorICoKKyAqIFJldHVybjogT24vT2ZmLgorICovCitpbnQgbXNtX2R0c19lYWdsZV9pc19ocHhfb24odm9pZCkKK3sKKwlyZXR1cm4gX2lzX2hweF9lbmFibGVkOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfcGNtX25ldygpIC0gQ3JlYXRlIGh3ZGVwIG5vZGUKKyAqIEBydW50aW1lOglzbmRfc29jX3BjbV9ydW50aW1lIHN0cnVjdHVyZS4KKyAqCisgKiBDcmVhdGUgaHdkZXAgbm9kZQorICoKKyAqIFJldHVybjogU3VjY2Vzcy4KKyAqLworaW50IG1zbV9kdHNfZWFnbGVfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpZiAoIV9yZWZfY250KyspIHsKKwkJX2luaXRfY2JfZGVzY3MoKTsKKwkJX3JlZ19pb25fbWVtKCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG1zbV9kdHNfZWFnbGVfcGNtX2ZyZWUoKSAtIHJlbW92ZSBod2RlcCBub2RlCisgKiBAcnVudGltZToJc25kX3NvY19wY21fcnVudGltZSBzdHJ1Y3R1cmUuCisgKgorICogUmVtb3ZlIGh3ZGVwIG5vZGUKKyAqCisgKiBSZXR1cm46IHZvaWQuCisgKi8KK3ZvaWQgbXNtX2R0c19lYWdsZV9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCWlmICghLS1fcmVmX2NudCkKKwkJX3VucmVnX2lvbl9tZW0oKTsKKwl2ZnJlZShfZGVwYyk7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiRFRTIEVBR0xFIHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtc3JzLXRtLWNvbmZpZy5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtc3JzLXRtLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmYxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWR0cy1zcnMtdG0tY29uZmlnLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc20tZHRzLWVhZ2xlLmg+CisjaW5jbHVkZSAibXNtLWR0cy1zcnMtdG0tY29uZmlnLmgiCisjaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCisKK3N0YXRpYyBpbnQgc3JzX3BvcnRfaWRbQUZFX01BWF9QT1JUU10gPSB7LTF9Oworc3RhdGljIGludCBzcnNfY29wcF9pZHhbQUZFX01BWF9QT1JUU10gPSB7LTF9Oworc3RhdGljIHVuaW9uIHNyc190cnVtZWRpYV9wYXJhbXNfdSBtc21fc3JzX3RydW1lZGlhX3BhcmFtczsKK3N0YXRpYyBzdHJ1Y3QgaW9uX2NsaWVudCAqaW9uX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgcGFyYW1fb3V0YmFuZCBwbzsKK3N0YXRpYyBhdG9taWNfdCByZWZfY250OworI2RlZmluZSBJT05fTUVNX1NJWkUJKDggKiAxMDI0KQorCitzdGF0aWMgaW50IHNldF9wb3J0X2lkKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpCit7CisJaW50IGluZGV4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKworCWlmIChpbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkeCAlZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIGluZGV4LAorCQkJcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcnNfcG9ydF9pZFtpbmRleF0gPSBwb3J0X2lkOworCXNyc19jb3BwX2lkeFtpbmRleF0gPSBjb3BwX2lkeDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2R0c19zcnNfdG1fc2VuZF9wYXJhbXMoX19zMzIgcG9ydF9pZCwgX191MzIgdGVjaHMpCit7CisJX19zMzIgaW5kZXggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCisJaWYgKGluZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpbmRleCwgcG9ydF9pZCk7CisJCXJldHVybjsKKwl9CisJaWYgKChzcnNfY29wcF9pZHhbaW5kZXhdIDwgMCkgfHwKKwkgICAgKHNyc19jb3BwX2lkeFtpbmRleF0gPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9kZWJ1ZygiJXM6IHNlbmQgcGFyYW1zIGNhbGxlZCBiZWZvcmUgY29wcCBvcGVuLiBzbywgY2FjaGluZ1xuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJcHJfZGVidWcoIlNSUyAlczogY2FsbGVkLCBwb3J0X2lkID0gJWQsIHRlY2hzIGZsYWdzID0gJXVcbiIsCisJCV9fZnVuY19fLCBwb3J0X2lkLCB0ZWNocyk7CisJLyogZm9yY2UgYWxsIGlmIHRlY2hzIGlzIHNldCB0byAxICovCisJaWYgKHRlY2hzID09IDEpCisJCXRlY2hzID0gMHhGRkZGRkZGRjsKKworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9XT1dIRCkpCisJCXNyc190cnVtZWRpYV9vcGVuKHBvcnRfaWQsIHNyc19jb3BwX2lkeFtpbmRleF0sIFNSU19JRF9XT1dIRCwKKwkJCSh2b2lkICopJm1zbV9zcnNfdHJ1bWVkaWFfcGFyYW1zLnNyc19wYXJhbXMud293aGQpOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9DU0hQKSkKKwkJc3JzX3RydW1lZGlhX29wZW4ocG9ydF9pZCwgc3JzX2NvcHBfaWR4W2luZGV4XSwgU1JTX0lEX0NTSFAsCisJCQkodm9pZCAqKSZtc21fc3JzX3RydW1lZGlhX3BhcmFtcy5zcnNfcGFyYW1zLmNzaHApOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9IUEYpKQorCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfSFBGLAorCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5ocGYpOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9BRVEpKQorCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfQUVRLAorCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5hZXEpOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9ITCkpCisJCXNyc190cnVtZWRpYV9vcGVuKHBvcnRfaWQsIHNyc19jb3BwX2lkeFtpbmRleF0sIFNSU19JRF9ITCwKKwkJCSh2b2lkICopJm1zbV9zcnNfdHJ1bWVkaWFfcGFyYW1zLnNyc19wYXJhbXMuaGwpOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9HRVEpKQorCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfR0VRLAorCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5nZXEpOworCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9HTE9CQUwpKQorCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfR0xPQkFMLAorCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5nbG9iYWwpOworfQorCisKK3N0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXRfKGludCBwb3J0X2lkLAorCQkJCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCV9fdTE2IG9mZnNldCwgdmFsdWUsIG1heCA9IHNpemVvZihtc21fc3JzX3RydW1lZGlhX3BhcmFtcykgPj4gMTsKKworCWlmIChTUlNfQ01EX1VQTE9BRCA9PQorCQkodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBTUlNfQ01EX1VQTE9BRCkpIHsKKwkJX191MzIgdGVjaHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4RkY7CisJCV9fczMyIGluZGV4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKworCQlpZiAoaW5kZXggPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIGluZGV4LCBwb3J0X2lkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJcHJfZGVidWcoIlNSUyAlczogc2VuZCBwYXJhbXMgcmVxdWVzdCwgZmxhZyA9ICV1XG4iLAorCQkJCQlfX2Z1bmNfXywgdGVjaHMpOworCQlpZiAoc3JzX3BvcnRfaWRbaW5kZXhdID49IDAgJiYgdGVjaHMpCisJCQltc21fZHRzX3Nyc190bV9zZW5kX3BhcmFtcyhwb3J0X2lkLCB0ZWNocyk7CisJCXJldHVybiAwOworCX0KKwlvZmZzZXQgPSAoX191MTYpKCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmCisJCQlTUlNfUEFSQU1fT0ZGU0VUX01BU0spID4+IDE2KTsKKwl2YWx1ZSA9IChfX3UxNikodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJgorCQkJU1JTX1BBUkFNX1ZBTFVFX01BU0spOworCWlmIChvZmZzZXQgPCBtYXgpIHsKKwkJbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMucmF3X3BhcmFtc1tvZmZzZXRdID0gdmFsdWU7CisJCXByX2RlYnVnKCJTUlMgJXM6IGluZGV4IHNldC4uLiAobWF4ICVkLCByZXF1ZXN0ZWQgJWQsIHZhbHVlIDB4JVgpXG4iLAorCQkJIF9fZnVuY19fLCBtYXgsIG9mZnNldCwgdmFsdWUpOworCX0gZWxzZSB7CisJCXByX2VycigiU1JTICVzOiBpbmRleCBvdXQgb2YgYm91bmRzISAobWF4ICVkLCByZXF1ZXN0ZWQgJWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIG1heCwgb2Zmc2V0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgcG9ydF9pZDsKKworCXByX2RlYnVnKCJTUlMgY29udHJvbCBub3JtYWwgY2FsbGVkXG4iKTsKKwltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7CisJcG9ydF9pZCA9IFNMSU1CVVNfMF9SWDsKKwlyZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX3NldF8ocG9ydF9pZCwga2NvbnRyb2wsIHVjb250cm9sKTsKKwltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2kyc19zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgcG9ydF9pZDsKKworCXByX2RlYnVnKCJTUlMgY29udHJvbCBJMlMgY2FsbGVkXG4iKTsKKwltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7CisJcG9ydF9pZCA9IFBSSU1BUllfSTJTX1JYOworCXJldCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0Xyhwb3J0X2lkLCBrY29udHJvbCwgdWNvbnRyb2wpOworCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfbWkyc19zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgcG9ydF9pZDsKKworCXByX2RlYnVnKCJTUlMgY29udHJvbCBNSTJTIGNhbGxlZFxuIik7CisJbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jaygpOworCXBvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJcmV0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXRfKHBvcnRfaWQsIGtjb250cm9sLCB1Y29udHJvbCk7CisJbXNtX3BjbV9yb3V0aW5nX3JlbGVhc2VfbG9jaygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9oZG1pX3NldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgcG9ydF9pZDsKKworCXByX2RlYnVnKCJTUlMgY29udHJvbCBIRE1JIGNhbGxlZFxuIik7CisJbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jaygpOworCXBvcnRfaWQgPSBIRE1JX1JYOworCXJldCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0Xyhwb3J0X2lkLCBrY29udHJvbCwgdWNvbnRyb2wpOworCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHBhX3Nyc190cnVtZWRpYV9jb250cm9sc1tdID0geworCXsuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJTUlMgVHJ1TWVkaWEiLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAorCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywKKwkuZ2V0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQsCisJLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0LAorCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQorCXsucmVnID0gU05EX1NPQ19OT1BNLAorCS5ycmVnID0gU05EX1NPQ19OT1BNLAorCS5zaGlmdCA9IDAsCisJLnJzaGlmdCA9IDAsCisJLm1heCA9IDB4RkZGRkZGRkYsCisJLnBsYXRmb3JtX21heCA9IDB4RkZGRkZGRkYsCisJLmludmVydCA9IDAKKwl9KQorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2hkbWlbXSA9IHsKKwl7LmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiU1JTIFRydU1lZGlhIEhETUkiLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAorCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywKKwkuZ2V0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQsCisJLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfaGRtaV9zZXQsCisJLnByaXZhdGVfdmFsdWUgPSAoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpCisJey5yZWcgPSBTTkRfU09DX05PUE0sCisJLnJyZWcgPSBTTkRfU09DX05PUE0sCisJLnNoaWZ0ID0gMCwKKwkucnNoaWZ0ID0gMCwKKwkubWF4ID0gMHhGRkZGRkZGRiwKKwkucGxhdGZvcm1fbWF4ID0gMHhGRkZGRkZGRiwKKwkuaW52ZXJ0ID0gMAorCX0pCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfaTJzW10gPSB7CisJey5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIlNSUyBUcnVNZWRpYSBJMlMiLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAorCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LAorCS5nZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2dldCwKKwkucHV0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9pMnNfc2V0LAorCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQorCXsucmVnID0gU05EX1NPQ19OT1BNLAorCS5ycmVnID0gU05EX1NPQ19OT1BNLAorCS5zaGlmdCA9IDAsCisJLnJzaGlmdCA9IDAsCisJLm1heCA9IDB4RkZGRkZGRkYsCisJLnBsYXRmb3JtX21heCA9IDB4RkZGRkZGRkYsCisJLmludmVydCA9IDAKKwl9KQorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX21pMnNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJTUlMgVHJ1TWVkaWEgTUkyUyIsCisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAorCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csCisJCS5nZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2dldCwKKwkJLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfbWkyc19zZXQsCisJCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQorCQl7CisJCQkucmVnID0gU05EX1NPQ19OT1BNLAorCQkJLnJyZWcgPSBTTkRfU09DX05PUE0sCisJCQkuc2hpZnQgPSAwLAorCQkJLnJzaGlmdCA9IDAsCisJCQkubWF4ID0gMHhGRkZGRkZGRiwKKwkJCS5wbGF0Zm9ybV9tYXggPSAweEZGRkZGRkZGLAorCQkJLmludmVydCA9IDAKKwkJfSkKKwl9Cit9OworCit2b2lkIG1zbV9kdHNfc3JzX3RtX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCisJCQkJbHBhX3Nyc190cnVtZWRpYV9jb250cm9scywKKwkJCUFSUkFZX1NJWkUobHBhX3Nyc190cnVtZWRpYV9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCisJCQkJbHBhX3Nyc190cnVtZWRpYV9jb250cm9sc19oZG1pLAorCQkJQVJSQVlfU0laRShscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2hkbWkpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJCWxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfaTJzLAorCQkJQVJSQVlfU0laRShscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2kycykpOworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJCWxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfbWkycywKKwkJCUFSUkFZX1NJWkUobHBhX3Nyc190cnVtZWRpYV9jb250cm9sc19taTJzKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2lvbl9tZW0odm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG1zbV9hdWRpb19pb25fYWxsb2MoIlNSU19UUlVNRURJQSIsICZpb25fY2xpZW50LCAmaW9uX2hhbmRsZSwKKwkJCQkgSU9OX01FTV9TSVpFLCAmcG8ucGFkZHIsIChzaXplX3QgKikmcG8uc2l6ZSwKKwkJCQkgJnBvLmt2YWRkcik7CisJaWYgKHJjICE9IDApCisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogZXhpdGVkIGlvbl9jbGllbnQgPSAlcEssIGlvbl9oYW5kbGUgPSAlcEssIHBoeXNfYWRkciA9ICVsdSwgbGVuZ3RoID0gJWQsIHZhZGRyID0gJXBLLCByYyA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaW9uX2NsaWVudCwgaW9uX2hhbmRsZSwgKGxvbmcpcG8ucGFkZHIsCisJCQkodW5zaWduZWQgaW50KXBvLnNpemUsIHBvLmt2YWRkciwgcmMpOworCXJldHVybiByYzsKK30KKwordm9pZCBtc21fZHRzX3Nyc190bV9pb25fbWVtbWFwKHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwb18pCit7CisJaWYgKHBvLmt2YWRkciA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCIlczogY2FsbGluZ3JlZ19pb25fbWVtKClcbiIsIF9fZnVuY19fKTsKKwkJcmVnX2lvbl9tZW0oKTsKKwl9CisJcG9fLT5zaXplID0gSU9OX01FTV9TSVpFOworCXBvXy0+a3ZhZGRyID0gcG8ua3ZhZGRyOworCXBvXy0+cGFkZHIgPSBwby5wYWRkcjsKK30KKworc3RhdGljIHZvaWQgdW5yZWdfaW9uX21lbSh2b2lkKQoreworCW1zbV9hdWRpb19pb25fZnJlZShpb25fY2xpZW50LCBpb25faGFuZGxlKTsKKwlwby5rdmFkZHIgPSBOVUxMOworCXBvLnBhZGRyID0gMDsKKwlwby5zaXplID0gMDsKK30KKwordm9pZCBtc21fZHRzX3Nyc190bV9kZWluaXQoaW50IHBvcnRfaWQpCit7CisJc2V0X3BvcnRfaWQocG9ydF9pZCwgLTEpOworCWF0b21pY19kZWMoJnJlZl9jbnQpOworCWlmIChwby5rdmFkZHIgIT0gTlVMTCkgeworCQlpZiAoIWF0b21pY19yZWFkKCZyZWZfY250KSkgeworCQkJcHJfZGVidWcoIiVzOiBjYWxsaW5nIHVucmVnX2lvbl9tZW0oKVxuIiwgX19mdW5jX18pOworCQkJdW5yZWdfaW9uX21lbSgpOworCQl9CisJfQorfQorCit2b2lkIG1zbV9kdHNfc3JzX3RtX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKK3sKKwlpbnQgY3VyX3JlZl9jbnQgPSAwOworCisJaWYgKHNldF9wb3J0X2lkKHBvcnRfaWQsIGNvcHBfaWR4KSA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkOiAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm47CisJfQorCisJY3VyX3JlZl9jbnQgPSBhdG9taWNfcmVhZCgmcmVmX2NudCk7CisJYXRvbWljX2luYygmcmVmX2NudCk7CisJaWYgKCFjdXJfcmVmX2NudCAmJiBwby5rdmFkZHIgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbGxpbmcgcmVnX2lvbl9tZW0oKVxuIiwgX19mdW5jX18pOworCQlpZiAocmVnX2lvbl9tZW0oKSAhPSAwKSB7CisJCQlhdG9taWNfZGVjKCZyZWZfY250KTsKKwkJCXBvLmt2YWRkciA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbXNtX2R0c19zcnNfdG1fc2VuZF9wYXJhbXMocG9ydF9pZCwgMSk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWR0cy1zcnMtdG0tY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWR0cy1zcnMtdG0tY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkN2FlZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHRzLXNycy10bS1jb25maWcuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfTVNNX0RUU19TUlNfVE1fQ09ORklHX0hfCisjZGVmaW5lIF9NU01fRFRTX1NSU19UTV9DT05GSUdfSF8KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitzdHJ1Y3QgcGFyYW1fb3V0YmFuZDsKKworI2lmZGVmIENPTkZJR19EVFNfU1JTX1RNCisKK3VuaW9uIHNyc190cnVtZWRpYV9wYXJhbXNfdSB7CisJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXMgc3JzX3BhcmFtczsKKwlfX3UxNiByYXdfcGFyYW1zWzFdOworfTsKKwordm9pZCBtc21fZHRzX3Nyc190bV9pb25fbWVtbWFwKHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwb18pOwordm9pZCBtc21fZHRzX3Nyc190bV9pbml0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpOwordm9pZCBtc21fZHRzX3Nyc190bV9kZWluaXQoaW50IHBvcnRfaWQpOwordm9pZCBtc21fZHRzX3Nyc190bV9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2R0c19zcnNfdG1faW9uX21lbW1hcChzdHJ1Y3QgcGFyYW1fb3V0YmFuZCAqcG9fKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fZHRzX3Nyc190bV9pbml0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIG1zbV9kdHNfc3JzX3RtX2RlaW5pdChpbnQgcG9ydF9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX2R0c19zcnNfdG1fYWRkX2NvbnRyb2xzKAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pIHsgfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWxzbS1jbGllbnQuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tbHNtLWNsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOWMzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWxzbS1jbGllbnQuYwpAQCAtMCwwICsxLDE5ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC90aW1lci5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcTZsc20uaD4KKyNpbmNsdWRlIDxzb3VuZC9sc21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorCisjZGVmaW5lIENBUFRVUkVfTUlOX05VTV9QRVJJT0RTICAgICAyCisjZGVmaW5lIENBUFRVUkVfTUFYX05VTV9QRVJJT0RTICAgICA4CisjZGVmaW5lIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFICAgICA0MDk2CisjZGVmaW5lIENBUFRVUkVfTUlOX1BFUklPRF9TSVpFICAgICAzMjAKKyNkZWZpbmUgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFIDI1NgorCisjZGVmaW5lIExBQl9CVUZGRVJfQUxMT0MgMQorI2RlZmluZSBMQUJfQlVGRkVSX0RFQUxMT0MgMAorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkucmF0ZV9taW4gPSAgICAgICAgICAgICAxNjAwMCwKKwkucmF0ZV9tYXggPSAgICAgICAgICAgICAxNjAwMCwKKwkuY2hhbm5lbHNfbWluID0gICAgICAgICAxLAorCS5jaGFubmVsc19tYXggPSAgICAgICAgIDEsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSAgICAgQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgKgorCQkJCUNBUFRVUkVfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JQ0FQVFVSRV9NSU5fUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgICAgQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUsCisJLnBlcmlvZHNfbWluID0gICAgICAgICAgQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gICAgICAgICAgQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKKy8qIENvbnZlbnRpb25hbCBhbmQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKKwkxNjAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCisJLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0cnVjdCBsc21fcHJpdiB7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IGxzbV9jbGllbnQgKmxzbV9jbGllbnQ7CisJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICpldmVudF9zdGF0dXM7CisJc3BpbmxvY2tfdCBldmVudF9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7CisJdW5zaWduZWQgbG9uZyBldmVudF9hdmFpbDsKKwlhdG9taWNfdCBldmVudF93YWl0X3N0b3A7CisJYXRvbWljX3QgYnVmX2NvdW50OworCWF0b21pY190IHJlYWRfYWJvcnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcGVyaW9kX3dhaXQ7CisJaW50IGFwcGxfY250OworCWludCBkbWFfd3JpdGU7Cit9OworCitzdGF0aWMgaW50IG1zbV9sc21fcXVldWVfbGFiX2J1ZmZlcihzdHJ1Y3QgbHNtX3ByaXYgKnBydGQsIGludCBpKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGxzbV9jbWRfcmVhZCBjbWRfcmVhZDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCisJaWYgKCFwcnRkIHx8ICFwcnRkLT5sc21fY2xpZW50KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIHBydGQgJXBLIGxzbSBjbGllbnQgJXBLXG4iLAorCQkJX19mdW5jX18sIHBydGQsICgoIXBydGQpID8gTlVMTCA6IHBydGQtPmxzbV9jbGllbnQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcHJ0ZC0+c3Vic3RyZWFtIHx8ICFwcnRkLT5zdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKKwkJCSghcHJ0ZC0+c3Vic3RyZWFtKSA/ICJzdWJzdHJlYW0iIDogInByaXZhdGVfZGF0YSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcnRkID0gcHJ0ZC0+c3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXIgfHwKKwkJaSA+PSBwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50KSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IExhYiBidWZmZXIgbm90IHNldHVwICVwSyBpbmNvcnJlY3QgaW5kZXggJWQgcGVyaW9kIGNvdW50ICVkXG4iLAorCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXIsIGksCisJCQlwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNtZF9yZWFkLmJ1Zl9hZGRyX2xzdyA9CisJCWxvd2VyXzMyX2JpdHMocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5waHlzKTsKKwljbWRfcmVhZC5idWZfYWRkcl9tc3cgPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyW2ldLnBoeXMpOworCWNtZF9yZWFkLmJ1Zl9zaXplID0gcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5zaXplOworCWNtZF9yZWFkLm1lbV9tYXBfaGFuZGxlID0KKwkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5tZW1fbWFwX2hhbmRsZTsKKwlyYyA9IHE2bHNtX3JlYWQocHJ0ZC0+bHNtX2NsaWVudCwgJmNtZF9yZWFkKTsKKwlpZiAocmMpCisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGVycm9yIGluIHF1ZXVpbmcgdGhlIGxhYiBidWZmZXIgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBsc21fbGFiX2J1ZmZlcl9zYW5pdHkoc3RydWN0IGxzbV9wcml2ICpwcnRkLAorCQlzdHJ1Y3QgbHNtX2NtZF9yZWFkX2RvbmUgKnJlYWRfZG9uZSwgaW50ICppbmRleCkKK3sKKwlpbnQgaSA9IDAsIHJjID0gLUVJTlZBTDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCisJaWYgKCFwcnRkIHx8ICFyZWFkX2RvbmUgfHwgIWluZGV4KSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIHBydGQgJXBLIHJlYWRfZG9uZSAlcEsgaW5kZXggJXBLXG4iLAorCQkJX19mdW5jX18sIHBydGQsIHJlYWRfZG9uZSwgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBydGQtPnN1YnN0cmVhbSB8fCAhcHJ0ZC0+c3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCQkoIXBydGQtPnN1YnN0cmVhbSkgPyAic3Vic3RyZWFtIiA6ICJwcml2YXRlX2RhdGEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ0ZCA9IHBydGQtPnN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcnRkLT5sc21fY2xpZW50LT5sYWJfZW5hYmxlIHx8ICFwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IExhYiBub3QgZW5hYmxlZCAlZCBpbnZhbGlkIGxhYiBidWZmZXIgJXBLXG4iLAorCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPmxhYl9lbmFibGUsCisJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50OyBpKyspIHsKKwkJaWYgKChsb3dlcl8zMl9iaXRzKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ucGh5cykgPT0KKwkJCXJlYWRfZG9uZS0+YnVmX2FkZHJfbHN3KSAmJgorCQkJKG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzCisJCQkJKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ucGh5cykgPT0KKwkJCXJlYWRfZG9uZS0+YnVmX2FkZHJfbXN3KSAmJgorCQkJKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ubWVtX21hcF9oYW5kbGUgPT0KKwkJCXJlYWRfZG9uZS0+bWVtX21hcF9oYW5kbGUpKSB7CisJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJCSIlczogQnVmZmVyIGZvdW5kICVwSyBtZW1tYXAgaGFuZGxlICVkXG4iLAorCQkJCV9fZnVuY19fLCAmcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5waHlzLAorCQkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5tZW1fbWFwX2hhbmRsZSk7CisJCQlpZiAocmVhZF9kb25lLT50b3RhbF9zaXplID4KKwkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyW2ldLnNpemUpIHsKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IFNpemUgbWlzbWF0Y2ggY2FsbCBiYWNrIHNpemUgJWQgYWN0dWFsIHNpemUgJXpkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmVhZF9kb25lLT50b3RhbF9zaXplLAorCQkJCXBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0uc2l6ZSk7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkqaW5kZXggPSBpOworCQkJCXJjID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGxzbV9ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCisJCQkgICAgICB2b2lkICpwYXlsb2FkLCB2b2lkICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcHJpdjsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBydGQtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyAqdGVtcDsKKwl1aW50MTZfdCBzdGF0dXMgPSAwOworCXVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IDA7CisJdWludDE2X3QgaW5kZXggPSAwOworCisJaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAorCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7CisJCXJldHVybjsKKwl9CisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgTFNNX0RBVEFfRVZFTlRfUkVBRF9ET05FOiB7CisJCWludCByYzsKKwkJc3RydWN0IGxzbV9jbWRfcmVhZF9kb25lICpyZWFkX2RvbmUgPSBwYXlsb2FkOworCQlpbnQgYnVmX2luZGV4ID0gMDsKKworCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+c2Vzc2lvbiAhPSB0b2tlbiB8fAorCQkgICAgIXJlYWRfZG9uZSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEVWRU5UX1JFQURfRE9ORSBpbnZhbGlkIGNhbGxiYWNrLCBzZXNzaW9uICVkIGNhbGxiYWNrICVkIHBheWxvYWQgJXBLIiwKKwkJCQlfX2Z1bmNfXywgcHJ0ZC0+bHNtX2NsaWVudC0+c2Vzc2lvbiwKKwkJCQl0b2tlbiwgcmVhZF9kb25lKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnJlYWRfYWJvcnQpKSB7CisJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJCSIlczogcmVhZCBhYm9ydCBzZXQgc2tpcCBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFsc21fbGFiX2J1ZmZlcl9zYW5pdHkocHJ0ZCwgcmVhZF9kb25lLCAmYnVmX2luZGV4KSkgeworCQkJZGV2X2RiZyhydGQtPmRldiwKKwkJCQkiJXM6IHByb2Nlc3MgcmVhZCBkb25lIGluZGV4ICVkXG4iLAorCQkJCV9fZnVuY19fLCBidWZfaW5kZXgpOworCQkJaWYgKGJ1Zl9pbmRleCA+PQorCQkJCXBydGQtPmxzbV9jbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQpIHsKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IEludmFsaWQgaW5kZXggJWQgYnVmX2luZGV4IG1heCBjbnQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBidWZfaW5kZXgsCisJCQkJcHJ0ZC0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHJ0ZC0+ZG1hX3dyaXRlICs9IHJlYWRfZG9uZS0+dG90YWxfc2l6ZTsKKwkJCWF0b21pY19pbmMoJnBydGQtPmJ1Zl9jb3VudCk7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCQl3YWtlX3VwKCZwcnRkLT5wZXJpb2Rfd2FpdCk7CisJCQkvKiBxdWV1ZSB0aGUgbmV4dCBwZXJpb2QgYnVmZmVyICovCisJCQlidWZfaW5kZXggPSAoYnVmX2luZGV4ICsgMSkgJQorCQkJcHJ0ZC0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudDsKKwkJCXJjID0gbXNtX2xzbV9xdWV1ZV9sYWJfYnVmZmVyKHBydGQsIGJ1Zl9pbmRleCk7CisJCQlpZiAocmMpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBlcnJvciBpbiBxdWV1aW5nIHRoZSBsYWIgYnVmZmVyIHJjICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9IGVsc2UKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlczogSW52YWxpZCBsYWIgYnVmZmVyIHJldHVybmVkIGJ5IGRzcFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVUzoKKwkJc3RhdHVzID0gKHVpbnQxNl90KSgodWludDhfdCAqKXBheWxvYWQpWzBdOworCQlwYXlsb2FkX3NpemUgPSAodWludDE2X3QpKCh1aW50OF90ICopcGF5bG9hZClbMl07CisJCWluZGV4ID0gNDsKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogZXZlbnQgZGV0ZWN0IHN0YXR1cyA9ICVkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cywgcGF5bG9hZF9zaXplKTsKKwlicmVhazsKKworCWNhc2UgTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMjoKKwkJc3RhdHVzID0gKHVpbnQxNl90KSgodWludDhfdCAqKXBheWxvYWQpWzBdOworCQlwYXlsb2FkX3NpemUgPSAodWludDE2X3QpKCh1aW50OF90ICopcGF5bG9hZClbMV07CisJCWluZGV4ID0gMjsKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogZXZlbnQgZGV0ZWN0IHN0YXR1cyA9ICVkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cywgcGF5bG9hZF9zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKG9wY29kZSA9PSBMU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTIHx8CisJCW9wY29kZSA9PSBMU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTX1YyKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXRlbXAgPSBrcmVhbGxvYyhwcnRkLT5ldmVudF9zdGF0dXMsCisJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykgKworCQkJCXBheWxvYWRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmICghdGVtcCkgeworCQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGV2ZW50IHN0YXR1c1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKworCQlwcnRkLT5ldmVudF9zdGF0dXMgPSB0ZW1wOworCQlwcnRkLT5ldmVudF9zdGF0dXMtPnN0YXR1cyA9IHN0YXR1czsKKwkJcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemU7CisJCWlmIChsaWtlbHkocHJ0ZC0+ZXZlbnRfc3RhdHVzKSkgeworCQkJbWVtY3B5KHBydGQtPmV2ZW50X3N0YXR1cy0+cGF5bG9hZCwKKwkJCSAgICAgICAmKCh1aW50OF90ICopcGF5bG9hZClbaW5kZXhdLAorCQkJICAgICAgIHBheWxvYWRfc2l6ZSk7CisJCQlwcnRkLT5ldmVudF9hdmFpbCA9IDE7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5ldmVudF9sb2NrLCBmbGFncyk7CisJCQl3YWtlX3VwKCZwcnRkLT5ldmVudF93YWl0KTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSAlZCBieXRlcyBvZiBtZW1vcnlcbiIsCisJCQkJX19mdW5jX18sIHBheWxvYWRfc2l6ZSk7CisJCX0KKwkJaWYgKHN1YnN0cmVhbS0+dGltZXJfcnVubmluZykKKwkJCXNuZF90aW1lcl9pbnRlcnJ1cHQoc3Vic3RyZWFtLT50aW1lciwgMSk7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9sc21fbGFiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgbHNtX3ByaXYgKmxzbSwgaW50IGFsbG9jKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9IE5VTEw7CisKKwlpZiAoIWxzbSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtIGxzbSAlcEtcbiIsIF9fZnVuY19fLCBsc20pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFsbG9jKSB7CisJCWlmICghbHNtLT5zdWJzdHJlYW0pIHsKKwkJCXByX2VycigiJXM6IHN1YnN0cmVhbSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXQgPSBxNmxzbV9sYWJfYnVmZmVyX2FsbG9jKGxzbS0+bHNtX2NsaWVudCwgYWxsb2MpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBhbGxvYyBsYWIgYnVmZmVyIGZhaWxlZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJZG1hX2J1ZiA9ICZsc20tPnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJCWRtYV9idWYtPmRldi5kZXYgPSBsc20tPnN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CisJCWRtYV9idWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCWRtYV9idWYtPmFyZWEgPSBsc20tPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbMF0uZGF0YTsKKwkJZG1hX2J1Zi0+YWRkciA9IGxzbS0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlclswXS5waHlzOworCQlkbWFfYnVmLT5ieXRlcyA9IGxzbS0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zeiAqCisJCWxzbS0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudDsKKwkJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIobHNtLT5zdWJzdHJlYW0sIGRtYV9idWYpOworCX0gZWxzZSB7CisJCXJldCA9IHE2bHNtX2xhYl9idWZmZXJfYWxsb2MobHNtLT5sc21fY2xpZW50LCBhbGxvYyk7CisJCWlmIChyZXQpCisJCQlwcl9lcnIoIiVzOiBmcmVlIGxhYiBidWZmZXIgZmFpbGVkIHJldCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJa2ZyZWUobHNtLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyKTsKKwkJbHNtLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyID0gTlVMTDsKKwl9CitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9nZXRfY29uZl9sZXZlbHMoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKKwkJCQkgICB1OCAqY29uZl9sZXZlbHNfcHRyKQoreworCWludCByYyA9IDA7CisKKwlpZiAoY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IG5vIGNvbmZpZGVuY2UgbGV2ZWxzIHByb3ZpZGVkXG4iLAorCQkJX19mdW5jX18pOworCQljbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzID0gTlVMTDsKKwkJZ290byBkb25lOworCX0KKworCWNsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMgPQorCQlremFsbG9jKChzaXplb2YodWludDhfdCkgKiBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyksCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzKSB7CisJCXByX2VycigiJXM6IE5vIG1lbW9yeSBmb3IgY29uZmlkZW5jZVxuIgorCQkJImxldmVscyBudW0gb2YgbGV2ZWwgZnJvbSB1c2VyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihjbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzLAorCQkJICAgY29uZl9sZXZlbHNfcHRyLAorCQkJICAgY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMpKSB7CisJCXByX2VycigiJXM6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKTsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGNvcHlfZXJyOworCX0KKworCXJldHVybiByYzsKKworY29weV9lcnI6CisJa2ZyZWUoY2xpZW50LT5jb25maWRlbmNlX2xldmVscyk7CisJY2xpZW50LT5jb25maWRlbmNlX2xldmVscyA9IE5VTEw7Citkb25lOgorCXJldHVybiByYzsKKworfQorCitzdGF0aWMgaW50IG1zbV9sc21fc2V0X2VwZChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfbHNtX2VwX2RldF90aHJlcyBlcGRfdGg7CisKKwlpZiAocF9pbmZvLT5wYXJhbV9zaXplICE9IHNpemVvZihlcGRfdGgpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcGFyYW1fc2l6ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmVwZF90aCwgcF9pbmZvLT5wYXJhbV9kYXRhLAorCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAorCQkJCSAmZXBkX3RoLCBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRCk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGVwZCBwYXJhbSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9zZXRfbW9kZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3RfbW9kZSBtb2RlOworCWludCByYyA9IDA7CisKKwlpZiAocF9pbmZvLT5wYXJhbV9zaXplICE9IHNpemVvZihtb2RlKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtX3NpemUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCBwX2luZm8tPnBhcmFtX2RhdGEsCisJCQkgICBzaXplb2YobW9kZSkpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICV6ZFxuIiwKKwkJCV9fZnVuY19fLCBzaXplb2YobW9kZSkpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAorCQkJCSAmbW9kZSwgTFNNX09QRVJBVElPTl9NT0RFKTsKKwlpZiAocmMpCisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBzZXQgZGV0X21vZGUgcGFyYW0sIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9sc21fc2V0X2dhaW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9sc21fZ2FpbiBnYWluOworCWludCByYyA9IDA7CisKKwlpZiAocF9pbmZvLT5wYXJhbV9zaXplICE9IHNpemVvZihnYWluKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtX3NpemUgJWRcbiIsCisJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnYWluLCBwX2luZm8tPnBhcmFtX2RhdGEsCisJCQkgICBzaXplb2YoZ2FpbikpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICV6ZFxuIiwKKwkJCV9fZnVuY19fLCBzaXplb2YoZ2FpbikpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAorCQkJCSAmZ2FpbiwgTFNNX0dBSU4pOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIHNldCBkZXRfbW9kZSBwYXJhbSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9zZXRfY29uZihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJaWYgKHBfaW5mby0+cGFyYW1fc2l6ZSA+IE1BWF9OVU1fQ09ORklERU5DRSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBpbnZhbGlkIGNvbmZpZGVuY2UgbGV2ZWxzICVkXG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBydGQtPmxzbV9jbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQlwX2luZm8tPnBhcmFtX3NpemU7CisJcmMgPSBtc21fbHNtX2dldF9jb25mX2xldmVscyhwcnRkLT5sc21fY2xpZW50LAorCQkJCSAgICAgcF9pbmZvLT5wYXJhbV9kYXRhKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogZ2V0X2NvbmZfbGV2ZWxzIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBxNmxzbV9zZXRfb25lX3BhcmFtKHBydGQtPmxzbV9jbGllbnQsIHBfaW5mbywKKwkJCQkgcHJ0ZC0+bHNtX2NsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMsCisJCQkJIExTTV9NSU5fQ09ORklERU5DRV9MRVZFTFMpOworCWlmIChyYykKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIHNldCBtaW5fY29uZl9sZXZlbHMsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fbHNtX3JlZ19tb2RlbChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCXU4ICpzbmRfbW9kZWxfcHRyOworCXNpemVfdCBvZmZzZXQ7CisKKwlyYyA9IHE2bHNtX3NuZF9tb2RlbF9idWZfYWxsb2MocHJ0ZC0+bHNtX2NsaWVudCwKKwkJCQkgICAgICAgcF9pbmZvLT5wYXJhbV9zaXplLAorCQkJCSAgICAgICB0cnVlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogc25kX21vZGVsIGJ1ZiBhbGxvYyBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcTZsc21fc21fc2V0X3BhcmFtX2RhdGEocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLCAmb2Zmc2V0KTsKKworCS8qCisJICogRm9yIHNldF9wYXJhbSwgYWR2YW5jZSB0aGUgc291bmQgbW9kZWwgZGF0YSB3aXRoIHRoZQorCSAqIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBieSBwYXJhbV9kYXRhLgorCSAqLworCXNuZF9tb2RlbF9wdHIgPSAoKHU4ICopIHBydGQtPmxzbV9jbGllbnQtPnNvdW5kX21vZGVsLmRhdGEpICsgb2Zmc2V0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKHNuZF9tb2RlbF9wdHIsCisJCQkgICBwX2luZm8tPnBhcmFtX2RhdGEsIHBfaW5mby0+cGFyYW1fc2l6ZSkpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogY29weV9mcm9tX3VzZXIgZm9yIHNuZF9tb2RlbCBmYWlsZWQsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2NvcHk7CisJfQorCXJjID0gcTZsc21fc2V0X29uZV9wYXJhbShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sIE5VTEwsCisJCQkJIExTTV9SRUdfU05EX01PREVMKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIHNldCBzb3VuZF9tb2RlbCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycl9jb3B5OworCX0KKwlyZXR1cm4gcmM7CisKK2Vycl9jb3B5OgorCXE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShwcnRkLT5sc21fY2xpZW50KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9kZXJlZ19tb2RlbChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAwOworCisJcmMgPSBxNmxzbV9zZXRfb25lX3BhcmFtKHBydGQtPmxzbV9jbGllbnQsIHBfaW5mbywKKwkJCQkgTlVMTCwgTFNNX0RFUkVHX1NORF9NT0RFTCk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGRldF9tb2RlIHBhcmFtLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisKKwlxNmxzbV9zbmRfbW9kZWxfYnVmX2ZyZWUocHJ0ZC0+bHNtX2NsaWVudCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9zZXRfY3VzdG9tKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXU4ICpkYXRhOworCWludCByYyA9IDA7CisKKwlkYXRhID0ga3phbGxvYyhwX2luZm8tPnBhcmFtX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgcF9pbmZvLT5wYXJhbV9kYXRhLAorCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgZm9yIGN1c3RvbSBwYXJhbXMsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAorCQkJCSBkYXRhLCBMU01fQ1VTVE9NX1BBUkFNUyk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGN1c3RvbSBwYXJhbSwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCitlcnJfcmV0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fbHNtX3Byb2Nlc3NfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zICpwX2RhdGEsCisJCXZvaWQgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvOworCWludCBpOworCWludCByYyA9IDA7CisKKwlwX2luZm8gPSAoc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqKSBwYXJhbXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5udW1fcGFyYW1zOyBpKyspIHsKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogcGFyYW0gKCVkKSwgbW9kdWxlX2lkID0gMHgleCwgcGFyYW1faWQgPSAweCV4LCBwYXJhbV9zaXplID0gMHgleCwgcGFyYW1fdHlwZSA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaSwgcF9pbmZvLT5tb2R1bGVfaWQsCisJCQlwX2luZm8tPnBhcmFtX2lkLCBwX2luZm8tPnBhcmFtX3NpemUsCisJCQlwX2luZm8tPnBhcmFtX3R5cGUpOworCisJCXN3aXRjaCAocF9pbmZvLT5wYXJhbV90eXBlKSB7CisJCWNhc2UgTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQ6CisJCQlyYyA9IG1zbV9sc21fc2V0X2VwZChzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fT1BFUkFUSU9OX01PREU6CisJCQlyYyA9IG1zbV9sc21fc2V0X21vZGUoc3Vic3RyZWFtLCBwX2luZm8pOworCQkJYnJlYWs7CisJCWNhc2UgTFNNX0dBSU46CisJCQlyYyA9IG1zbV9sc21fc2V0X2dhaW4oc3Vic3RyZWFtLCBwX2luZm8pOworCQkJYnJlYWs7CisJCWNhc2UgTFNNX01JTl9DT05GSURFTkNFX0xFVkVMUzoKKwkJCXJjID0gbXNtX2xzbV9zZXRfY29uZihzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fUkVHX1NORF9NT0RFTDoKKwkJCXJjID0gbXNtX2xzbV9yZWdfbW9kZWwoc3Vic3RyZWFtLCBwX2luZm8pOworCQkJYnJlYWs7CisJCWNhc2UgTFNNX0RFUkVHX1NORF9NT0RFTDoKKwkJCXJjID0gbXNtX2xzbV9kZXJlZ19tb2RlbChzdWJzdHJlYW0sIHBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBMU01fQ1VTVE9NX1BBUkFNUzoKKwkJCXJjID0gbXNtX2xzbV9zZXRfY3VzdG9tKHN1YnN0cmVhbSwgcF9pbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEludmFsaWQgcGFyYW1fdHlwZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV90eXBlKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogc2V0X3BhcmFtIGZhaWwgZm9yIHBhcmFtX3R5cGUgJWRcbiIsCisJCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fdHlwZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlwX2luZm8rKzsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyIHNuZF9tb2RlbF92MjsKKwlzdHJ1Y3Qgc25kX2xzbV9zZXNzaW9uX2RhdGEgc2Vzc2lvbl9kYXRhOworCWludCByYyA9IDA7CisJaW50IHhjaGcgPSAwOworCXUzMiBzaXplID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZDsKKwlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKnVzZXIgPSBhcmc7CisJc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyBkZXRfcGFyYW1zOworCXVpbnQ4X3QgKmNvbmZpZGVuY2VfbGV2ZWwgPSBOVUxMOworCisJaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAorCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9MU01fU0VUX1NFU1NJT05fREFUQToKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBzZXQgc2Vzc2lvbiBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCW1lbWNweSgmc2Vzc2lvbl9kYXRhLCBhcmcsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuZF9sc21fc2Vzc2lvbl9kYXRhKSk7CisJCWlmIChzZXNzaW9uX2RhdGEuYXBwX2lkICE9IExTTV9WT0lDRV9XQUtFVVBfQVBQX0lEX1YyKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczpJbnZhbGlkIEFwcCBpZCAlZCBmb3IgTGlzdGVuIGNsaWVudFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgc2Vzc2lvbl9kYXRhLmFwcF9pZCk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXBydGQtPmxzbV9jbGllbnQtPmFwcF9pZCA9IHNlc3Npb25fZGF0YS5hcHBfaWQ7CisJCXJldCA9IHE2bHNtX29wZW4ocHJ0ZC0+bHNtX2NsaWVudCwKKwkJCQkgcHJ0ZC0+bHNtX2NsaWVudC0+YXBwX2lkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBsc20gb3BlbiBmYWlsZWQsICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlwcnRkLT5sc21fY2xpZW50LT5vcGVuZWQgPSB0cnVlOworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IFNlc3Npb25fSUQgPSAlZCwgQVBQIElEID0gJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCXBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sCisJCQlwcnRkLT5sc21fY2xpZW50LT5hcHBfaWQpOworCQlicmVhazsKKwljYXNlIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IFJlZ2lzdGVyaW5nIHNvdW5kIG1vZGVsIFYyXG4iLAorCQkJX19mdW5jX18pOworCQltZW1jcHkoJnNuZF9tb2RlbF92MiwgYXJnLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyKSk7CisJCWlmIChzbmRfbW9kZWxfdjIubnVtX2NvbmZpZGVuY2VfbGV2ZWxzID4KKwkJICAgIE1BWF9OVU1fQ09ORklERU5DRSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEludmFsaWQgY29uZl9sZXZlbHMgPSAlZCwgbWF4aW11bSBhbGxvd2VkID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHNuZF9tb2RlbF92Mi5udW1fY29uZmlkZW5jZV9sZXZlbHMsCisJCQkJTUFYX05VTV9DT05GSURFTkNFKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gcTZsc21fc25kX21vZGVsX2J1Zl9hbGxvYyhwcnRkLT5sc21fY2xpZW50LAorCQkJCQkgICAgICAgc25kX21vZGVsX3YyLmRhdGFfc2l6ZSwgZmFsc2UpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBxNmxzbSBidWZmZXIgYWxsb2MgZmFpbGVkIFYyLCBzaXplICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBzbmRfbW9kZWxfdjIuZGF0YV9zaXplKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihwcnRkLT5sc21fY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhLAorCQkJICAgc25kX21vZGVsX3YyLmRhdGEsIHNuZF9tb2RlbF92Mi5kYXRhX3NpemUpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSBmcm9tIHVzZXIgZGF0YSBmYWlsZWRcbiIKKwkJCSAgICAgICAiZGF0YSAlcEsgc2l6ZSAlZFxuIiwgX19mdW5jX18sCisJCQkgICAgICAgc25kX21vZGVsX3YyLmRhdGEsIHNuZF9tb2RlbF92Mi5kYXRhX3NpemUpOworCQkJcTZsc21fc25kX21vZGVsX2J1Zl9mcmVlKHBydGQtPmxzbV9jbGllbnQpOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiU05EIE1vZGVsIE1hZ2ljIG5vIGJ5dGVbMF0gJXgsXG4iCisJCQkgImJ5dGVbMV0gJXgsIGJ5dGVbMl0gJXggYnl0ZVszXSAleFxuIiwKKwkJCSBzbmRfbW9kZWxfdjIuZGF0YVswXSwgc25kX21vZGVsX3YyLmRhdGFbMV0sCisJCQkgc25kX21vZGVsX3YyLmRhdGFbMl0sIHNuZF9tb2RlbF92Mi5kYXRhWzNdKTsKKwkJcHJ0ZC0+bHNtX2NsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzID0KKwkJCXNuZF9tb2RlbF92Mi5udW1fY29uZmlkZW5jZV9sZXZlbHM7CisKKwkJcmMgPSBtc21fbHNtX2dldF9jb25mX2xldmVscyhwcnRkLT5sc21fY2xpZW50LAorCQkJCXNuZF9tb2RlbF92Mi5jb25maWRlbmNlX2xldmVsKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogZ2V0X2NvbmZfbGV2ZWxzIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmMgPSBxNmxzbV9yZWdpc3Rlcl9zb3VuZF9tb2RlbChwcnRkLT5sc21fY2xpZW50LAorCQkJCQlzbmRfbW9kZWxfdjIuZGV0ZWN0aW9uX21vZGUsCisJCQkJCXNuZF9tb2RlbF92Mi5kZXRlY3RfZmFpbHVyZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBSZWdpc3RlciBzbmQgTW9kZWwgdjIgZmFpbGVkID0lZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQkJa2ZyZWUoY29uZmlkZW5jZV9sZXZlbCk7CisJCQlxNmxzbV9zbmRfbW9kZWxfYnVmX2ZyZWUocHJ0ZC0+bHNtX2NsaWVudCk7CisJCX0KKworCQlrZnJlZShwcnRkLT5sc21fY2xpZW50LT5jb25maWRlbmNlX2xldmVscyk7CisJCXBydGQtPmxzbV9jbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzID0gTlVMTDsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9TRVRfUEFSQU1TOgorCQlpZiAoIWFyZykgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzIEludmFsaWQgYXJndW1lbnRcbiIsCisJCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BBUkFNUyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHNldF9wYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJbWVtY3B5KCZkZXRfcGFyYW1zLCBhcmcsCisJCQlzaXplb2YoZGV0X3BhcmFtcykpOworCQlpZiAoZGV0X3BhcmFtcy5udW1fY29uZmlkZW5jZV9sZXZlbHMgPgorCQkgICAgTUFYX05VTV9DT05GSURFTkNFKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXBydGQtPmxzbV9jbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQlkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVsczsKKworCQlyYyA9IG1zbV9sc21fZ2V0X2NvbmZfbGV2ZWxzKHBydGQtPmxzbV9jbGllbnQsCisJCQkJZGV0X3BhcmFtcy5jb25mX2xldmVsKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogRmFpbGVkIHRvIGdldCBjb25mX2xldmVscywgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmMgPSBxNmxzbV9zZXRfZGF0YShwcnRkLT5sc21fY2xpZW50LAorCQkJICAgICAgIGRldF9wYXJhbXMuZGV0ZWN0X21vZGUsCisJCQkgICAgICAgZGV0X3BhcmFtcy5kZXRlY3RfZmFpbHVyZSk7CisJCWlmIChyYykKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gc2V0IHBhcmFtcywgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKworCQlrZnJlZShwcnRkLT5sc21fY2xpZW50LT5jb25maWRlbmNlX2xldmVscyk7CisJCXBydGQtPmxzbV9jbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzID0gTlVMTDsKKworCQlicmVhazsKKworCWNhc2UgU05EUlZfTFNNX0RFUkVHX1NORF9NT0RFTDoKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBEZXJlZ2lzdGVyaW5nIHNvdW5kIG1vZGVsXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IHE2bHNtX2RlcmVnaXN0ZXJfc291bmRfbW9kZWwocHJ0ZC0+bHNtX2NsaWVudCk7CisJCWlmIChyYykKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBTb3VuZCBtb2RlbCBkZS1yZWdpc3RlciBmYWlsZWQsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IEdldCBldmVudCBzdGF0dXNcbiIsIF9fZnVuY19fKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+ZXZlbnRfd2FpdF9zdG9wLCAwKTsKKwkJcmMgPSB3YWl0X2V2ZW50X2ZyZWV6YWJsZShwcnRkLT5ldmVudF93YWl0LAorCQkJCShjbXB4Y2hnKCZwcnRkLT5ldmVudF9hdmFpbCwgMSwgMCkgfHwKKwkJCQkgKHhjaGcgPSBhdG9taWNfY21weGNoZygmcHJ0ZC0+ZXZlbnRfd2FpdF9zdG9wLAorCQkJCQkJCTEsIDApKSkpOworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHdhaXRfZXZlbnRfZnJlZXphYmxlICVkIGV2ZW50X3dhaXRfc3RvcCAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmMsIHhjaGcpOworCQlpZiAoIXJjICYmICF4Y2hnKSB7CisJCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IE5ldyBldmVudCBhdmFpbGFibGUgJWxkXG4iLAorCQkJCV9fZnVuY19fLCBwcnRkLT5ldmVudF9hdmFpbCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQkJaWYgKHBydGQtPmV2ZW50X3N0YXR1cykgeworCQkJCXNpemUgPSBzaXplb2YoKihwcnRkLT5ldmVudF9zdGF0dXMpKSArCisJCQkJcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemU7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZXZlbnRfbG9jaywKKwkJCQkJCSAgICAgICBmbGFncyk7CisJCQl9IGVsc2UgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmV2ZW50X2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IHBydGQtPmV2ZW50X3N0YXR1cyBpcyBOVUxMXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodXNlci0+cGF5bG9hZF9zaXplIDwKKwkJCSAgICBwcnRkLT5ldmVudF9zdGF0dXMtPnBheWxvYWRfc2l6ZSkgeworCQkJCWRldl9kYmcocnRkLT5kZXYsCisJCQkJCSIlczogcHJvdmlkZWQgJWQgYnl0ZXMgaXNuJ3QgZW5vdWdoLCBuZWVkcyAlZCBieXRlc1xuIiwKKwkJCQkJX19mdW5jX18sIHVzZXItPnBheWxvYWRfc2l6ZSwKKwkJCQkJcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUpOworCQkJCXJjID0gLUVOT01FTTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KHVzZXIsIHBydGQtPmV2ZW50X3N0YXR1cywgc2l6ZSk7CisJCQkJaWYgKHBydGQtPmxzbV9jbGllbnQtPmxhYl9lbmFibGUKKwkJCQkJJiYgIXBydGQtPmxzbV9jbGllbnQtPmxhYl9zdGFydGVkCisJCQkJCSYmIHBydGQtPmV2ZW50X3N0YXR1cy0+c3RhdHVzID09CisJCQkJCUxTTV9WT0lDRV9XQUtFVVBfU1RBVFVTX0RFVEVDVEVEKSB7CisJCQkJCWF0b21pY19zZXQoJnBydGQtPnJlYWRfYWJvcnQsIDApOworCQkJCQlhdG9taWNfc2V0KCZwcnRkLT5idWZfY291bnQsIDApOworCQkJCQlwcnRkLT5hcHBsX2NudCA9IDA7CisJCQkJCXBydGQtPmRtYV93cml0ZSA9IDA7CisJCQkJCXJjID0gbXNtX2xzbV9xdWV1ZV9sYWJfYnVmZmVyKHBydGQsCisJCQkJCQkwKTsKKwkJCQkJaWYgKHJjKQorCQkJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJCQkiJXM6IFF1ZXVlIGJ1ZmZlciBmYWlsZWQgZm9yIGxhYiByYyA9ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJCWVsc2UKKwkJCQkJCXBydGQtPmxzbV9jbGllbnQtPmxhYl9zdGFydGVkCisJCQkJCQk9IHRydWU7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHhjaGcpIHsKKwkJCWRldl9kYmcocnRkLT5kZXYsICIlczogV2FpdCBhYm9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX0xTTV9BQk9SVF9FVkVOVDoKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBBYm9ydGluZyBldmVudCBzdGF0dXMgd2FpdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+ZXZlbnRfd2FpdF9zdG9wLCAxKTsKKwkJd2FrZV91cCgmcHJ0ZC0+ZXZlbnRfd2FpdCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9MU01fU1RBUlQ6CisJCWRldl9kYmcocnRkLT5kZXYsICIlczogU3RhcnRpbmcgTFNNIGNsaWVudCBzZXNzaW9uXG4iLAorCQkJX19mdW5jX18pOworCQlpZiAoIXBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQpIHsKKwkJCXJldCA9IHE2bHNtX3N0YXJ0KHBydGQtPmxzbV9jbGllbnQsIHRydWUpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkID0gdHJ1ZTsKKwkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IExTTSBjbGllbnQgc2Vzc2lvbiBzdGFydGVkXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9MU01fU1RPUDogeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJIiVzOiBTdG9wcGluZyBMU00gY2xpZW50IHNlc3Npb25cbiIsCisJCQlfX2Z1bmNfXyk7CisJCWlmIChwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkKSB7CisJCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZSkgeworCQkJCWF0b21pY19zZXQoJnBydGQtPnJlYWRfYWJvcnQsIDEpOworCQkJCWlmIChwcnRkLT5sc21fY2xpZW50LT5sYWJfc3RhcnRlZCkgeworCQkJCQlyZXQgPSBxNmxzbV9zdG9wX2xhYihwcnRkLT5sc21fY2xpZW50KTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCQkJIiVzOiBzdG9wIGxhYiBmYWlsZWQgcmV0ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfc3RhcnRlZCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldCA9IHE2bHNtX3N0b3AocHJ0ZC0+bHNtX2NsaWVudCwgdHJ1ZSk7CisJCQlpZiAoIXJldCkKKwkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAorCQkJCQkiJXM6IExTTSBjbGllbnQgc2Vzc2lvbiBzdG9wcGVkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQgPSBmYWxzZTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBTTkRSVl9MU01fTEFCX0NPTlRST0w6IHsKKwkJdTMyICplbmFibGUgPSBOVUxMOworCisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogSW52YWxpZCBwYXJhbSBhcmcgZm9yIGlvY3RsICVzIHNlc3Npb24gJWRcbiIsCisJCQkJX19mdW5jX18sICJTTkRSVl9MU01fTEFCX0NPTlRST0wiLAorCQkJCXBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24pOworCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZW5hYmxlID0gKGludCAqKWFyZzsKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBpb2N0bCAlcywgZW5hYmxlID0gJWRcbiIsCisJCQkgX19mdW5jX18sICJTTkRSVl9MU01fTEFCX0NPTlRST0wiLCAqZW5hYmxlKTsKKwkJaWYgKCFwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkKSB7CisJCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZSA9PSAqZW5hYmxlKSB7CisJCQkJZGV2X2RiZyhydGQtPmRldiwKKwkJCQkJIiVzOiBMYWIgZm9yIHNlc3Npb24gJWQgYWxyZWFkeSAlc1xuIiwKKwkJCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sCisJCQkJCSgoKmVuYWJsZSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7CisJCQkJcmMgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJcmMgPSBxNmxzbV9sYWJfY29udHJvbChwcnRkLT5sc21fY2xpZW50LCAqZW5hYmxlKTsKKwkJCWlmIChyYykgeworCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCSIlczogaW9jdGwgJXMgZmFpbGVkIHJjICVkIHRvICVzIGxhYiBmb3Igc2Vzc2lvbiAlZFxuIiwKKwkJCQkJX19mdW5jX18sICJTTkRSVl9MQUJfQ09OVFJPTCIsIHJjLAorCQkJCQkoKCplbmFibGUpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpLAorCQkJCQlwcnRkLT5sc21fY2xpZW50LT5zZXNzaW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSBtc21fbHNtX2xhYl9idWZmZXJfYWxsb2MocHJ0ZCwKKwkJCQkJKCgqZW5hYmxlKSA/IExBQl9CVUZGRVJfQUxMT0MKKwkJCQkJOiBMQUJfQlVGRkVSX0RFQUxMT0MpKTsKKwkJCQlpZiAocmMpCisJCQkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJCQkiJXM6IG1zbV9sc21fbGFiX2J1ZmZlcl9hbGxvYyBmYWlsZWQgcmMgJWQgZm9yICVzIiwKKwkJCQkJCV9fZnVuY19fLCByYywKKwkJCQkJKCgqZW5hYmxlKSA/ICJBTExPQyIgOiAiREVBTExPQyIpKTsKKwkJCQlpZiAoIXJjKQorCQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfZW5hYmxlID0gKmVuYWJsZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlczogaW9jdGwgJXMgaXNzdWVkIGFmdGVyIHN0YXJ0IiwKKwkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9MQUJfQ09OVFJPTCIpOworCQkJcmMgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFNORFJWX0xTTV9TVE9QX0xBQjoKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBzdG9wcGluZyBMQUJcbiIsIF9fZnVuY19fKTsKKwkJaWYgKHBydGQtPmxzbV9jbGllbnQtPmxhYl9lbmFibGUgJiYKKwkJCXBydGQtPmxzbV9jbGllbnQtPmxhYl9zdGFydGVkKSB7CisJCQlhdG9taWNfc2V0KCZwcnRkLT5yZWFkX2Fib3J0LCAxKTsKKwkJCXJjID0gcTZsc21fc3RvcF9sYWIocHJ0ZC0+bHNtX2NsaWVudCk7CisJCQlpZiAocmMpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBMYWIgc3RvcCBmYWlsZWQgZm9yIHNlc3Npb24gJWQgcmMgJWRcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlwcnRkLT5sc21fY2xpZW50LT5zZXNzaW9uLCByYyk7CisJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfc3RhcnRlZCA9IGZhbHNlOworCQl9CisJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogRmFsbGluZyBpbnRvIGRlZmF1bHQgc25kX2xpYl9pb2N0bCBjbWQgMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywgY21kKTsKKwkJcmMgPSBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyYykKKwkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBsZWF2ZSAoJWQpXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwllbHNlCisJCWRldl9lcnIocnRkLT5kZXYsICIlczogY21kIDB4JXggZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIGNtZCwgcmMpOworCisJcmV0dXJuIHJjOworfQorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1czMyIHsKKwl1MTYgc3RhdHVzOworCXUxNiBwYXlsb2FkX3NpemU7CisJdTggcGF5bG9hZFswXTsKK307CisKK3N0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyXzMyIHsKKwljb21wYXRfdXB0cl90IGRhdGE7CisJY29tcGF0X3VwdHJfdCBjb25maWRlbmNlX2xldmVsOworCXUzMiBkYXRhX3NpemU7CisJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0aW9uX21vZGU7CisJdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Cit9OworCitzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyIHsKKwljb21wYXRfdXB0cl90IGNvbmZfbGV2ZWw7CisJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGU7CisJdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOworCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Cit9OworCitzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyIHsKKwl1MzIgbW9kdWxlX2lkOworCXUzMiBwYXJhbV9pZDsKKwl1MzIgcGFyYW1fc2l6ZTsKKwljb21wYXRfdXB0cl90IHBhcmFtX2RhdGE7CisJZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlOworfTsKKworc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtc18zMiB7CisJY29tcGF0X3VwdHJfdCBwYXJhbXM7CisJdTMyIG51bV9wYXJhbXM7CisJdTMyIGRhdGFfc2l6ZTsKK307CisKK2VudW0geworCVNORFJWX0xTTV9FVkVOVF9TVEFUVVMzMiA9CisJCV9JT1coJ1UnLCAweDAyLCBzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMzMiksCisJU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIgPQorCQlfSU9XKCdVJywgMHgwNywgc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjJfMzIpLAorCVNORFJWX0xTTV9TRVRfUEFSQU1TXzMyID0KKwkJX0lPVygnVScsIDB4MEEsIHN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXNfMzIpLAorCVNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNU18zMiA9CisJCV9JT1coJ1UnLCAweDBCLCBzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zXzMyKSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9pb2N0bF9jb21wYXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQ7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlpbnQgZXJyID0gMDsKKwl1MzIgc2l6ZSA9IDA7CisKKwlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKKwkJCSghc3Vic3RyZWFtKSA/ICJzdWJzdHJlYW0iIDogInByaXZhdGVfZGF0YSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX0xTTV9FVkVOVF9TVEFUVVMzMjogeworCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMzMiB1c2VyYXJnMzIsICp1c2VyMzIgPSBOVUxMOworCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKnVzZXIgPSBOVUxMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcmFyZzMyLCBhcmcsIHNpemVvZih1c2VyYXJnMzIpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBlcnIgY29weXVzZXIgaW9jdGwgJXNcbiIsCisJCQkJX19mdW5jX18sICJTTkRSVl9MU01fRVZFTlRfU1RBVFVTMzIiKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKHVzZXJhcmczMi5wYXlsb2FkX3NpemUgPgorCQkgICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7CisJCQlwcl9lcnIoIiVzOiBwYXlsb2FkX3NpemUgJWQgaXMgaW52YWxpZCwgbWF4IGFsbG93ZWQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdXNlcmFyZzMyLnBheWxvYWRfc2l6ZSwKKwkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzaXplID0gc2l6ZW9mKCp1c2VyKSArIHVzZXJhcmczMi5wYXlsb2FkX3NpemU7CisJCXVzZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXVzZXIpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBBbGxvY2F0aW9uIGZhaWxlZCBldmVudCBzdGF0dXMgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWNtZCA9IFNORFJWX0xTTV9FVkVOVF9TVEFUVVM7CisJCQl1c2VyLT5wYXlsb2FkX3NpemUgPSB1c2VyYXJnMzIucGF5bG9hZF9zaXplOworCQkJZXJyID0gbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsIHVzZXIpOworCQl9CisKKwkJLyogVXBkYXRlIHNpemUgd2l0aCBhY3R1YWwgcGF5bG9hZCBzaXplICovCisJCXNpemUgPSBzaXplb2YodXNlcmFyZzMyKSArIHVzZXItPnBheWxvYWRfc2l6ZTsKKwkJaWYgKCFlcnIgJiYgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgc2l6ZSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiB3cml0ZSB2ZXJpZnkgZmFpbGVkIHNpemUgJWRcbiIsCisJCQkJX19mdW5jX18sIHNpemUpOworCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQlpZiAoIWVycikgeworCQkJdXNlcjMyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghdXNlcjMyKSB7CisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBBbGxvY2F0aW9uIGV2ZW50IHVzZXIgc3RhdHVzIHNpemUgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBzaXplKTsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJfSBlbHNlIHsKKwkJCQl1c2VyMzItPnN0YXR1cyA9IHVzZXItPnN0YXR1czsKKwkJCQl1c2VyMzItPnBheWxvYWRfc2l6ZSA9IHVzZXItPnBheWxvYWRfc2l6ZTsKKwkJCQltZW1jcHkodXNlcjMyLT5wYXlsb2FkLAorCQkJCXVzZXItPnBheWxvYWQsIHVzZXIzMi0+cGF5bG9hZF9zaXplKTsKKwkJCX0KKwkJfQorCQlpZiAoIWVyciAmJiAoY29weV90b191c2VyKGFyZywgdXNlcjMyLCBzaXplKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlczogZmFpbGVkIHRvIGNvcHkgcGF5bG9hZCAlZCIsCisJCQkJX19mdW5jX18sIHNpemUpOworCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQlrZnJlZSh1c2VyKTsKKwkJa2ZyZWUodXNlcjMyKTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlczogbHNtZXZlbnQgZmFpbGVkICVkIiwKKwkJCQlfX2Z1bmNfXywgZXJyKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMjogeworCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiBzbmRfbW9kZWx2MjMyOworCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiBzbmRfbW9kZWx2MjsKKworCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgdXNpbmcgdG9wb2xvZ3lcbiIsCisJCQkJX19mdW5jX18sICJSRUdfU05EX01PREVMX1YyIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc25kX21vZGVsdjIzMiwgYXJnLAorCQkJc2l6ZW9mKHNuZF9tb2RlbHYyMzIpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBjb3B5IHVzZXIgZmFpbGVkLCBzaXplICV6ZCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzaXplb2Yoc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjJfMzIpLAorCQkJCSJTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMiIpOworCQl9IGVsc2UgeworCQkJc25kX21vZGVsdjIuY29uZmlkZW5jZV9sZXZlbCA9CisJCQljb21wYXRfcHRyKHNuZF9tb2RlbHYyMzIuY29uZmlkZW5jZV9sZXZlbCk7CisJCQlzbmRfbW9kZWx2Mi5kYXRhID0gY29tcGF0X3B0cihzbmRfbW9kZWx2MjMyLmRhdGEpOworCQkJc25kX21vZGVsdjIuZGF0YV9zaXplID0gc25kX21vZGVsdjIzMi5kYXRhX3NpemU7CisJCQlzbmRfbW9kZWx2Mi5kZXRlY3RfZmFpbHVyZSA9CisJCQlzbmRfbW9kZWx2MjMyLmRldGVjdF9mYWlsdXJlOworCQkJc25kX21vZGVsdjIuZGV0ZWN0aW9uX21vZGUgPQorCQkJc25kX21vZGVsdjIzMi5kZXRlY3Rpb25fbW9kZTsKKwkJCXNuZF9tb2RlbHYyLm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQlzbmRfbW9kZWx2MjMyLm51bV9jb25maWRlbmNlX2xldmVsczsKKwkJCWNtZCA9IFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOworCQkJZXJyID0gbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCisJCQkJJnNuZF9tb2RlbHYyKTsKKwkJCWlmIChlcnIpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBpb2N0bCAlcyBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJCQkiU05ERFJWX0xTTV9SRUdfU05EX01PREVMX1YyXzMyIik7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNU18zMjp7CisJCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXNfMzIgZGV0X3BhcmFtczMyOworCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zIGRldF9wYXJhbXM7CisKKwkJaWYgKHBydGQtPmxzbV9jbGllbnQtPnVzZV90b3BvbG9neSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX1BBUkFNU18zMiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRldF9wYXJhbXMzMiwgYXJnLAorCQkJCSAgIHNpemVvZihkZXRfcGFyYW1zMzIpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVNfMzIiLAorCQkJCXNpemVvZihkZXRfcGFyYW1zMzIpKTsKKwkJfSBlbHNlIHsKKwkJCWRldF9wYXJhbXMuY29uZl9sZXZlbCA9CisJCQkJY29tcGF0X3B0cihkZXRfcGFyYW1zMzIuY29uZl9sZXZlbCk7CisJCQlkZXRfcGFyYW1zLmRldGVjdF9tb2RlID0KKwkJCQlkZXRfcGFyYW1zMzIuZGV0ZWN0X21vZGU7CisJCQlkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVscyA9CisJCQkJZGV0X3BhcmFtczMyLm51bV9jb25maWRlbmNlX2xldmVsczsKKwkJCWRldF9wYXJhbXMuZGV0ZWN0X2ZhaWx1cmUgPQorCQkJCWRldF9wYXJhbXMzMi5kZXRlY3RfZmFpbHVyZTsKKwkJCWNtZCA9IFNORFJWX0xTTV9TRVRfUEFSQU1TOworCQkJZXJyID0gbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCisJCQkJCSZkZXRfcGFyYW1zKTsKKwkJCWlmIChlcnIpCisJCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkJIiVzOiBpb2N0bCAlcyBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJCQkiU05EUlZfTFNNX1NFVF9QQVJBTVMiKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNU18zMjogeworCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zXzMyIHBfZGF0YV8zMjsKKwkJc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtcyBwX2RhdGE7CisJCXU4ICpwYXJhbXMsICpwYXJhbXMzMjsKKwkJc2l6ZV90IHBfc2l6ZTsKKwkJc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMiAqcF9pbmZvXzMyOworCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm87CisJCWludCBpOworCisJCWlmICghcHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgbm90IHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFhcmcpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogTm8gUGFyYW0gZGF0YSB0byBzZXRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNU18zMiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBfZGF0YV8zMiwgYXJnLAorCQkJCSAgIHNpemVvZihwX2RhdGFfMzIpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlemRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNU18zMiIsCisJCQkJc2l6ZW9mKHBfZGF0YV8zMikpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlwX2RhdGEucGFyYW1zID0gY29tcGF0X3B0cihwX2RhdGFfMzIucGFyYW1zKTsKKwkJcF9kYXRhLm51bV9wYXJhbXMgPSBwX2RhdGFfMzIubnVtX3BhcmFtczsKKwkJcF9kYXRhLmRhdGFfc2l6ZSA9IHBfZGF0YV8zMi5kYXRhX3NpemU7CisKKwkJaWYgKHBfZGF0YS5udW1fcGFyYW1zID4gTFNNX1BBUkFNU19NQVgpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogSW52YWxpZCBudW1fcGFyYW1zICVkXG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAorCQkJCXBfZGF0YS5udW1fcGFyYW1zKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHBfZGF0YS5kYXRhX3NpemUgIT0KKwkJICAgIChwX2RhdGEubnVtX3BhcmFtcyAqIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogSW52YWxpZCBzaXplICVkXG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAorCQkJCXBfZGF0YS5kYXRhX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwX3NpemUgPSBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMikgKgorCQkJIHBfZGF0YS5udW1fcGFyYW1zOworCisJCXBhcmFtczMyID0ga3phbGxvYyhwX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtczMyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm8pICogcF9kYXRhLm51bV9wYXJhbXM7CisJCXBhcmFtcyA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYXJhbXMpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBubyBtZW1vcnkgZm9yIHBhcmFtcywgc2l6ZSA9ICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywgcF9zaXplKTsKKwkJCWtmcmVlKHBhcmFtczMyKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtczMyLCBwX2RhdGEucGFyYW1zLAorCQkJCSAgIHBfZGF0YS5kYXRhX3NpemUpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCAicGFyYW1zMzIiLCBwX2RhdGEuZGF0YV9zaXplKTsKKwkJCWtmcmVlKHBhcmFtczMyKTsKKwkJCWtmcmVlKHBhcmFtcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXBfaW5mb18zMiA9IChzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyICopIHBhcmFtczMyOworCQlwX2luZm8gPSAoc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqKSBwYXJhbXM7CisJCWZvciAoaSA9IDA7IGkgPCBwX2RhdGEubnVtX3BhcmFtczsgaSsrKSB7CisJCQlwX2luZm8tPm1vZHVsZV9pZCA9IHBfaW5mb18zMi0+bW9kdWxlX2lkOworCQkJcF9pbmZvLT5wYXJhbV9pZCA9IHBfaW5mb18zMi0+cGFyYW1faWQ7CisJCQlwX2luZm8tPnBhcmFtX3NpemUgPSBwX2luZm9fMzItPnBhcmFtX3NpemU7CisJCQlwX2luZm8tPnBhcmFtX2RhdGEgPSBjb21wYXRfcHRyKHBfaW5mb18zMi0+cGFyYW1fZGF0YSk7CisJCQlwX2luZm8tPnBhcmFtX3R5cGUgPSBwX2luZm9fMzItPnBhcmFtX3R5cGU7CisKKwkJCXBfaW5mb18zMisrOworCQkJcF9pbmZvKys7CisJCX0KKworCQllcnIgPSBtc21fbHNtX3Byb2Nlc3NfcGFyYW1zKHN1YnN0cmVhbSwKKwkJCQkJICAgICAmcF9kYXRhLCBwYXJhbXMpOworCQlpZiAoZXJyKQorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IEZhaWxlZCB0byBwcm9jZXNzIHBhcmFtcywgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCWtmcmVlKHBhcmFtcyk7CisJCWtmcmVlKHBhcmFtczMyKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKyNlbHNlCisjZGVmaW5lIG1zbV9sc21faW9jdGxfY29tcGF0IE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG1zbV9sc21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCBlcnIgPSAwOworCXUzMiBzaXplID0gMDsKKwlzdHJ1Y3Qgc25kX2xzbV9zZXNzaW9uX2RhdGEgc2Vzc2lvbl9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQ7CisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCisJCQkoIXN1YnN0cmVhbSkgPyAic3Vic3RyZWFtIiA6ICJwcml2YXRlX2RhdGEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9MU01fU0VUX1NFU1NJT05fREFUQToKKwkJZGV2X2RiZyhydGQtPmRldiwKKwkJCSIlczogU05EUlZfTFNNX1NFVF9TRVNTSU9OX0RBVEFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2Vzc2lvbl9kYXRhLCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9sc21fc2Vzc2lvbl9kYXRhKSkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX3Nlc3Npb25fZGF0YSkpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFlcnIpCisJCQllcnIgPSBtc21fbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sCisJCQkJCQkgICBjbWQsICZzZXNzaW9uX2RhdGEpOworCQlpZiAoZXJyKQorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXMgUkVHX1NORF9NT0RFTCBmYWlsZWQgZXJyICVkXG4iLAorCQkJCV9fZnVuY19fLCBlcnIpOworCQlicmVhazsKKwljYXNlIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOiB7CisJCXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyIHNuZF9tb2RlbF92MjsKKworCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgdXNpbmcgdG9wb2xvZ3lcbiIsCisJCQkJX19mdW5jX18sICJSRUdfU05EX01PREVMX1YyIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogSW52YWxpZCBwYXJhbXMgc25kX21vZGVsXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnNuZF9tb2RlbF92MiwgYXJnLCBzaXplb2Yoc25kX21vZGVsX3YyKSkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzaXplb2Yoc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIpKTsKKwkJfQorCQlpZiAoIWVycikKKwkJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLAorCQkJCQkJICAgJnNuZF9tb2RlbF92Mik7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlcyBSRUdfU05EX01PREVMIGZhaWxlZCBlcnIgJWRcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNUzogeworCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zIGRldF9wYXJhbXM7CisKKwkJaWYgKHBydGQtPmxzbV9jbGllbnQtPnVzZV90b3BvbG9neSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX1BBUkFNUyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6IFNORFJWX0xTTV9TRVRfUEFSQU1TXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghYXJnKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXMsIEludmFsaWQgcGFyYW1zXG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfcGFyYW1zLCBhcmcsCisJCQkJICAgc2l6ZW9mKGRldF9wYXJhbXMpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiLAorCQkJCXNpemVvZihkZXRfcGFyYW1zKSk7CisJCQllcnIgPSAtRUZBVUxUOworCQl9CisKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBtc21fbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwKKwkJCQkJCSAgICZkZXRfcGFyYW1zKTsKKwkJZWxzZQorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IExTTV9TRVRfUEFSQU1TIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJCV9fZnVuY19fLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWNhc2UgU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TOiB7CisJCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgcF9kYXRhOworCQlzaXplX3QgcF9zaXplOworCQl1OCAqcGFyYW1zOworCisJCWlmICghcHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgbm90IHVzaW5nIHRvcG9sb2d5XG4iLAorCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFhcmcpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogTm8gUGFyYW0gZGF0YSB0byBzZXRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnBfZGF0YSwgYXJnLAorCQkJCSAgIHNpemVvZihwX2RhdGEpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlemRcbiIsCisJCQkJX19mdW5jX18sICJwX2RhdGEiLCBzaXplb2YocF9kYXRhKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChwX2RhdGEubnVtX3BhcmFtcyA+IExTTV9QQVJBTVNfTUFYKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEludmFsaWQgbnVtX3BhcmFtcyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIiwKKwkJCQlwX2RhdGEubnVtX3BhcmFtcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXBfc2l6ZSA9IHBfZGF0YS5udW1fcGFyYW1zICoKKwkJCSBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbXNfaW5mbyk7CisKKwkJaWYgKHBfZGF0YS5kYXRhX3NpemUgIT0gcF9zaXplKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogJXM6IEludmFsaWQgc2l6ZSAlemRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsIHBfc2l6ZSk7CisKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcGFyYW1zID0ga3phbGxvYyhwX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbXMsIHBfZGF0YS5wYXJhbXMsCisJCQkJICAgcF9kYXRhLmRhdGFfc2l6ZSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJWRcbiIsCisJCQkJX19mdW5jX18sICJwYXJhbXMiLCBwX2RhdGEuZGF0YV9zaXplKTsKKwkJCWtmcmVlKHBhcmFtcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWVyciA9IG1zbV9sc21fcHJvY2Vzc19wYXJhbXMoc3Vic3RyZWFtLCAmcF9kYXRhLCBwYXJhbXMpOworCQlpZiAoZXJyKQorCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6ICVzOiBGYWlsZWQgdG8gc2V0IHBhcmFtcywgZXJyID0gJWRcbiIsCisJCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsIGVycik7CisJCWtmcmVlKHBhcmFtcyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVUzogeworCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKnVzZXIgPSBOVUxMLCB1c2VyYXJnOworCisJCWRldl9kYmcocnRkLT5kZXYsCisJCQkiJXM6IFNORFJWX0xTTV9FVkVOVF9TVEFUVVNcbiIsIF9fZnVuY19fKTsKKwkJaWYgKCFhcmcpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBJbnZhbGlkIHBhcmFtcyBldmVudCBzdGF0dXNcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyYXJnLCBhcmcsIHNpemVvZih1c2VyYXJnKSkpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBlcnIgY29weXVzZXIgZXZlbnRfc3RhdHVzXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKHVzZXJhcmcucGF5bG9hZF9zaXplID4KKwkJICAgIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSkgeworCQkJcHJfZXJyKCIlczogcGF5bG9hZF9zaXplICVkIGlzIGludmFsaWQsIG1heCBhbGxvd2VkID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHVzZXJhcmcucGF5bG9hZF9zaXplLAorCQkJCUxJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKSArCisJCXVzZXJhcmcucGF5bG9hZF9zaXplOworCQl1c2VyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1c2VyKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogQWxsb2NhdGlvbiBmYWlsZWQgZXZlbnQgc3RhdHVzIHNpemUgJWRcbiIsCisJCQkJX19mdW5jX18sIHNpemUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdXNlci0+cGF5bG9hZF9zaXplID0gdXNlcmFyZy5wYXlsb2FkX3NpemU7CisJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCB1c2VyKTsKKworCQkvKiBVcGRhdGUgc2l6ZSB3aXRoIGFjdHVhbCBwYXlsb2FkIHNpemUgKi8KKwkJc2l6ZSA9IHNpemVvZigqdXNlcikgKyB1c2VyLT5wYXlsb2FkX3NpemU7CisJCWlmICghZXJyICYmICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemUpKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogd3JpdGUgdmVyaWZ5IGZhaWxlZCBzaXplICVkXG4iLAorCQkJCV9fZnVuY19fLCBzaXplKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJaWYgKCFlcnIgJiYgKGNvcHlfdG9fdXNlcihhcmcsIHVzZXIsIHNpemUpKSkgeworCQkJZGV2X2VycihydGQtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byBjb3B5IHBheWxvYWQgJWQiLAorCQkJCV9fZnVuY19fLCBzaXplKTsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJa2ZyZWUodXNlcik7CisJCWlmIChlcnIpCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJCSIlczogbHNtZXZlbnQgZmFpbGVkICVkIiwgX19mdW5jX18sIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOworCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1zbV9sc21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZDsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHNtX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBydGQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbHNtX3ByaXZcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmcHJ0ZC0+ZXZlbnRfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+ZXZlbnRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+cGVyaW9kX3dhaXQpOworCXBydGQtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwcnRkOworCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKKwkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygiJXM6IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZCByZXQgJWRcbiIsCisJCQkgX19mdW5jX18sIHJldCk7CisJLyogRW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCisJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCIlczogc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIgZmFpbGVkIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAorCQlDQVBUVVJFX01JTl9OVU1fUEVSSU9EUyAqIENBUFRVUkVfTUlOX1BFUklPRF9TSVpFLAorCQlDQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygiJXM6IGNvbnN0cmFpbnQgZm9yIGJ1ZmZlciBieXRlcyBtaW4gbWF4IHJldCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKKwkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oIiVzOiBjb25zdHJhaW50IGZvciBwZXJpb2QgYnl0ZXMgc3RlcCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCX0KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAzMik7CisJaWYgKHJldCA8IDApCisJCXByX2luZm8oIiVzOiBjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgc3RlcCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCXBydGQtPmxzbV9jbGllbnQgPSBxNmxzbV9jbGllbnRfYWxsb2MoCisJCQkJKGxzbV9hcHBfY2IpbHNtX2V2ZW50X2hhbmRsZXIsIHBydGQpOworCWlmICghcHJ0ZC0+bHNtX2NsaWVudCkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKHBydGQpOworCQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJ0ZC0+bHNtX2NsaWVudC0+b3BlbmVkID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisKKwlpZiAoIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZV9kYXRhIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlydGQgPSBwcnRkLT5zdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWlmICghcHJ0ZC0+bHNtX2NsaWVudCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBMU00gY2xpZW50IGRhdGEgcHRyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQgPSBmYWxzZTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwcnRkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9sc21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCWludCByZXQgPSAwOworCisJaWYgKCFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcHJ0ZCB8fCAhcHJ0ZC0+bHNtX2NsaWVudCkgeworCQlwcl9lcnIoIiVzOiBObyBMU00gc2Vzc2lvbiBhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQpIHsKKwkJcmV0ID0gcTZsc21fc3RvcChwcnRkLT5sc21fY2xpZW50LCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBzZXNzaW9uIHN0b3AgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZWxzZQorCQkJZGV2X2RiZyhydGQtPmRldiwKKwkJCQkiJXM6IExTTSBjbGllbnQgc2Vzc2lvbiBzdG9wcGVkICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgcmV0KTsKKworCQkvKgorCQkgKiBHbyBBaGVhZCBhbmQgdHJ5IGRlLXJlZ2lzdGVyIHNvdW5kIG1vZGVsLAorCQkgKiBldmVuIGlmIHN0b3AgZmFpbGVkCisJCSAqLworCQlwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkID0gZmFsc2U7CisKKwkJcmV0ID0gcTZsc21fZGVyZWdpc3Rlcl9zb3VuZF9tb2RlbChwcnRkLT5sc21fY2xpZW50KTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBkZXJlZ19zbmRfbW9kZWwgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZWxzZQorCQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBkZXJlZ19zbmRfbW9kZWwgc3VjY2Vzc2Z1bFxuIiwKKwkJCQkgX19mdW5jX18pOworCX0KKworCWlmIChwcnRkLT5sc21fY2xpZW50LT5vcGVuZWQpIHsKKwkJcTZsc21fY2xvc2UocHJ0ZC0+bHNtX2NsaWVudCk7CisJCXBydGQtPmxzbV9jbGllbnQtPm9wZW5lZCA9IGZhbHNlOworCX0KKwlxNmxzbV9jbGllbnRfZnJlZShwcnRkLT5sc21fY2xpZW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5ldmVudF9sb2NrLCBmbGFncyk7CisJa2ZyZWUocHJ0ZC0+ZXZlbnRfc3RhdHVzKTsKKwlwcnRkLT5ldmVudF9zdGF0dXMgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlrZnJlZShwcnRkKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxzbV9sYWJfaHdfcGFyYW1zICpod19wYXJhbXMgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisKKwlpZiAoIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZV9kYXRhIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXBydGQgfHwgIXBhcmFtcykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBpbnZhbGlkIHBhcmFtcyBwcnRkICVwSyBwYXJhbXMgJXBLIiwKKwkJCSBfX2Z1bmNfXywgcHJ0ZCwgcGFyYW1zKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWh3X3BhcmFtcyA9ICZwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXM7CisJaHdfcGFyYW1zLT5zYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZSA9CisJKHBhcmFtc19mb3JtYXQocGFyYW1zKSA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgPyAxNiA6IDA7CisJaHdfcGFyYW1zLT5wZXJpb2RfY291bnQgPSBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpOworCWlmIChod19wYXJhbXMtPnNhbXBsZV9yYXRlICE9IDE2MDAwIHx8IGh3X3BhcmFtcy0+c2FtcGxlX3NpemUgIT0gMTYgfHwKKwkJaHdfcGFyYW1zLT5wZXJpb2RfY291bnQgPT0gMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIHBhcmFtcyBzYW1wbGUgcmF0ZSAlZCBzYW1wbGUgc2l6ZSAlZCBwZXJpb2QgY291bnQgJWQiLAorCQkJX19mdW5jX18sIGh3X3BhcmFtcy0+c2FtcGxlX3JhdGUsCisJCQlod19wYXJhbXMtPnNhbXBsZV9zaXplLAorCQlod19wYXJhbXMtPnBlcmlvZF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlod19wYXJhbXMtPmJ1Zl9zeiA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvCisJaHdfcGFyYW1zLT5wZXJpb2RfY291bnQ7CisJZGV2X2RiZyhydGQtPmRldiwKKwkJIiVzOiBzYW1wbGUgcmF0ZSAlZCBzYW1wbGUgc2l6ZSAlZCBidWZmZXIgc2l6ZSAlZCBwZXJpb2QgY291bnQgJWRcbiIsCisJCV9fZnVuY19fLCBod19wYXJhbXMtPnNhbXBsZV9yYXRlLCBod19wYXJhbXMtPnNhbXBsZV9zaXplLAorCQlod19wYXJhbXMtPmJ1Zl9zeiwgaHdfcGFyYW1zLT5wZXJpb2RfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX2xzbV9wY21fcG9pbnRlcigKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCisJaWYgKCFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcnRkKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcGFyYW0gJXBLXG4iLCBfX2Z1bmNfXywgcHJ0ZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcnRkLT5kbWFfd3JpdGUgPj0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpCisJCXBydGQtPmRtYV93cml0ZSA9IDA7CisJZGV2X2RiZyhydGQtPmRldiwKKwkJIiVzOiBkbWEgcG9zdCA9ICVkXG4iLCBfX2Z1bmNfXywgcHJ0ZC0+ZG1hX3dyaXRlKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHBydGQtPmRtYV93cml0ZSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9wY21fY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNoLAorCXNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJY2hhciAqcGNtX2J1ZiA9IE5VTEw7CisJaW50IGZieXRlcyA9IDAsIHJjID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCisJaWYgKCFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcnRkKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IEludmFsaWQgcGFyYW0gJXBLXG4iLCBfX2Z1bmNfXywgcHJ0ZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOworCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8CisJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1BSRVBBUkVEKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IHJ1bnRpbWUgc3RhdGUgaW5jb3JyZWN0ICVkIiwgX19mdW5jX18sCisJCQlydW50aW1lLT5zdGF0dXMtPnN0YXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHBydGQtPnBlcmlvZF93YWl0LAorCQkoYXRvbWljX3JlYWQoJnBydGQtPmJ1Zl9jb3VudCkgfAorCQlhdG9taWNfcmVhZCgmcHJ0ZC0+cmVhZF9hYm9ydCkpLCAoMiAqIEhaKSk7CisJaWYgKCFyYykgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LAorCQkJIiVzOiB0aW1lb3V0IGZvciByZWFkIHJldHJ5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnJlYWRfYWJvcnQpKSB7CisJCWRldl9lcnIocnRkLT5kZXYsCisJCQkiJXM6IFJlYWQgYWJvcnQgcmVjZWl2ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBydGQtPmFwcGxfY250ID0gcHJ0ZC0+YXBwbF9jbnQgJQorCQlwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50OworCXBjbV9idWYgPSBwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyW3BydGQtPmFwcGxfY250XS5kYXRhOworCWRldl9kYmcocnRkLT5kZXYsCisJCSIlczogY29weSB0aGUgcGNtIGRhdGEgc2l6ZSAlZFxuIiwKKwkJX19mdW5jX18sIGZieXRlcyk7CisJaWYgKHBjbV9idWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHBjbV9idWYsIGZieXRlcykpIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsCisJCQkJIiVzOiBmYWlsZWQgdG8gY29weSBieXRlcyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZmJ5dGVzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycihydGQtPmRldiwKKwkJCSIlczogSW52YWxpZCBwY20gYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcnRkLT5hcHBsX2NudCA9IChwcnRkLT5hcHBsX2NudCArIDEpICUKKwkJcHJ0ZC0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudDsKKwlhdG9taWNfZGVjKCZwcnRkLT5idWZfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9sc21fb3BzID0geworCS5vcGVuICAgICAgICAgICA9IG1zbV9sc21fb3BlbiwKKwkuY2xvc2UgICAgICAgICAgPSBtc21fbHNtX2Nsb3NlLAorCS5pb2N0bCAgICAgICAgICA9IG1zbV9sc21faW9jdGwsCisJLnByZXBhcmUJPSBtc21fbHNtX3ByZXBhcmUsCisJLmNvbXBhdF9pb2N0bCAgID0gbXNtX2xzbV9pb2N0bF9jb21wYXQsCisJLmh3X3BhcmFtcyAgICAgID0gbXNtX2xzbV9od19wYXJhbXMsCisJLmNvcHkgICAgICAgICAgID0gbXNtX2xzbV9wY21fY29weSwKKwkucG9pbnRlciAgICAgICAgPSBtc21fbHNtX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIGludCBtc21fYXNvY19sc21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKworCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fYXNvY19sc21fcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXByX2RlYnVnKCJlbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZtc21fbHNtX29wcywKKwkucGNtX25ldwk9IG1zbV9hc29jX2xzbV9uZXcsCisJLnByb2JlCQk9IG1zbV9hc29jX2xzbV9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2xzbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJm1zbV9zb2NfcGxhdGZvcm0pOworfQorCitzdGF0aWMgaW50IG1zbV9sc21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9sc21fY2xpZW50X2R0X21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gInFjb20sbXNtLWxzbS1jbGllbnQiIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fbHNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXNtX2xzbV9jbGllbnRfZHRfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gbXNtX2xzbV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2xzbV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fbHNtX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9sc21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTFNNIGNsaWVudCBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9sc21fY2xpZW50X2R0X21hdGNoKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWFmZS12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tYWZlLXYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0MzE4NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWFmZS12Mi5jCkBAIC0wLDAgKzEsOTIxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSAibXNtLXBjbS1hZmUtdjIuaCIKKworI2RlZmluZSBNSU5fUExBWUJBQ0tfUEVSSU9EX1NJWkUgKDEyOCAqIDIpCisjZGVmaW5lIE1BWF9QTEFZQkFDS19QRVJJT0RfU0laRSAoMTI4ICogMiAqIDIgKiA2KQorI2RlZmluZSBNSU5fUExBWUJBQ0tfTlVNX1BFUklPRFMgKDQpCisjZGVmaW5lIE1BWF9QTEFZQkFDS19OVU1fUEVSSU9EUyAoMzg0KQorCisjZGVmaW5lIE1JTl9DQVBUVVJFX1BFUklPRF9TSVpFICgxMjggKiAyKQorI2RlZmluZSBNQVhfQ0FQVFVSRV9QRVJJT0RfU0laRSAoMTkyICogMiAqIDIgKiA4ICogNCkKKyNkZWZpbmUgTUlOX0NBUFRVUkVfTlVNX1BFUklPRFMgKDQpCisjZGVmaW5lIE1BWF9DQVBUVVJFX05VTV9QRVJJT0RTICgzODQpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fYWZlX2hhcmR3YXJlX3BsYXliYWNrID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQpLAorCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCS5yYXRlcyA9ICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfNDgwMDApLAorCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKKwkuY2hhbm5lbHNfbWF4ID0gICAgICAgICA2LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIE1BWF9QTEFZQkFDS19QRVJJT0RfU0laRSAqCisJCQkJTUFYX1BMQVlCQUNLX05VTV9QRVJJT0RTLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gICAgIE1JTl9QTEFZQkFDS19QRVJJT0RfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heCA9ICAgICBNQVhfUExBWUJBQ0tfUEVSSU9EX1NJWkUsCisJLnBlcmlvZHNfbWluID0gICAgICAgICAgTUlOX1BMQVlCQUNLX05VTV9QRVJJT0RTLAorCS5wZXJpb2RzX21heCA9ICAgICAgICAgIE1BWF9QTEFZQkFDS19OVU1fUEVSSU9EUywKKwkuZmlmb19zaXplID0gICAgICAgICAgICAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9hZmVfaGFyZHdhcmVfY2FwdHVyZSA9IHsKKwkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRXwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICAoU05EUlZfUENNX1JBVEVfODAwMCB8CisJCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKKwkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAorCS5yYXRlX21heCA9ICAgICAgICAgICAgIDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCisJLmNoYW5uZWxzX21heCA9ICAgICAgICAgNiwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBNQVhfQ0FQVFVSRV9QRVJJT0RfU0laRSAqCisJCQkJTUFYX0NBUFRVUkVfTlVNX1BFUklPRFMsCisJLnBlcmlvZF9ieXRlc19taW4gPSAgICAgTUlOX0NBUFRVUkVfUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgICAgTUFYX0NBUFRVUkVfUEVSSU9EX1NJWkUsCisJLnBlcmlvZHNfbWluID0gICAgICAgICAgTUlOX0NBUFRVUkVfTlVNX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gICAgICAgICAgTUFYX0NBUFRVUkVfTlVNX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX2NhbGxiYWNrKHN0cnVjdCBocnRpbWVyICpocnQpOworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX3JlY19jYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqaHJ0KTsKKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX2NhbGxiYWNrKHN0cnVjdCBocnRpbWVyICpocnQpCit7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9CisJCWNvbnRhaW5lcl9vZihocnQsIHN0cnVjdCBwY21fYWZlX2luZm8sIGhydCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwcnRkLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1MzIgbWVtX21hcF9oYW5kbGUgPSAwOworCisJbWVtX21hcF9oYW5kbGUgPSBhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCk7CisJaWYgKCFtZW1fbWFwX2hhbmRsZSkKKwkJcHJfZXJyKCIlczogbWVtX21hcF9oYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJaWYgKHBydGQtPnN0YXJ0KSB7CisJCXByX2RlYnVnKCJzZW5kaW5nIGZyYW1lIHRvIERTUDogcG9sbF90aW1lOiAlZFxuIiwKKwkJCQlwcnRkLT5wb2xsX3RpbWUpOworCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQorCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7CisJCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgMHgleFxuIiwgX19mdW5jX18sIG1lbV9tYXBfaGFuZGxlKTsKKwkJYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUoCisJCShwcnRkLT5kbWFfYWRkciArCisJCShwcnRkLT5kc3BfY250ICoKKwkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpKSwgbWVtX21hcF9oYW5kbGUsCisJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhwcnRkLT5zdWJzdHJlYW0pKTsKKwkJcHJ0ZC0+ZHNwX2NudCsrOworCQlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgbnNfdG9fa3RpbWUocHJ0ZC0+cG9sbF90aW1lCisJCQkJCSogMTAwMCkpOworCisJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CisJfSBlbHNlCisJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBhZmVfaHJ0aW1lcl9yZWNfY2FsbGJhY2soc3RydWN0IGhydGltZXIgKmhydCkKK3sKKwlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0KKwkJY29udGFpbmVyX29mKGhydCwgc3RydWN0IHBjbV9hZmVfaW5mbywgaHJ0KTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBydGQtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXUzMiBtZW1fbWFwX2hhbmRsZSA9IDA7CisJaW50IHJldDsKKworCW1lbV9tYXBfaGFuZGxlID0gYWZlX3JlcV9tbWFwX2hhbmRsZShwcnRkLT5hdWRpb19jbGllbnQpOworCWlmICghbWVtX21hcF9oYW5kbGUpCisJCXByX2VycigiJXM6IG1lbV9tYXBfaGFuZGxlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCWlmIChwcnRkLT5zdGFydCkgeworCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQorCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7CisJCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgMHgleFxuIiwgX19mdW5jX18sIG1lbV9tYXBfaGFuZGxlKTsKKwkJcmV0ID0gYWZlX3J0X3Byb3h5X3BvcnRfcmVhZCgKKwkJKHBydGQtPmRtYV9hZGRyICsgKHBydGQtPmRzcF9jbnQKKwkJKiBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocHJ0ZC0+c3Vic3RyZWFtKSkpLCBtZW1fbWFwX2hhbmRsZSwKKwkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogQUZFIHBvcnQgcmVhZCBmYWlsczogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJcHJ0ZC0+c3RhcnQgPSAwOworCQkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworCQl9CisJCXBydGQtPmRzcF9jbnQrKzsKKwkJcHJfZGVidWcoInNlbmRpbmcgZnJhbWUgcmVjIHRvIERTUDogcG9sbF90aW1lOiAlZFxuIiwKKwkJCQlwcnRkLT5wb2xsX3RpbWUpOworCQlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgbnNfdG9fa3RpbWUocHJ0ZC0+cG9sbF90aW1lCisJCQkJKiAxMDAwKSk7CisKKwkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKKwl9IGVsc2UKKwkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworfQorc3RhdGljIHZvaWQgcGNtX2FmZV9wcm9jZXNzX3R4X3BrdCh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwKKwkJIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHByaXY7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBOVUxMOworCXVpbnQxNl90IGV2ZW50OworCXVpbnQ2NF90IHBlcmlvZF9ieXRlczsKKwl1aW50NjRfdCBieXRlc19vbmVfc2VjOworCisJaWYgKHBydGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCXN1YnN0cmVhbSA9ICBwcnRkLT5zdWJzdHJlYW07CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFGRV9FVkVOVF9SVF9QUk9YWV9QT1JUX1NUQVRVUzogeworCQlldmVudCA9ICh1aW50MTZfdCkoKDB4RkZGRjAwMDAgJiBwYXlsb2FkWzBdKSA+PiAweDEwKTsKKwkJCXN3aXRjaCAoZXZlbnQpIHsKKwkJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9TVEFSVDogeworCQkJCXBydGQtPmRzcF9jbnQgPSAwOworCQkJCS8qIENhbGN1bGF0ZSBwb2xsIHRpbWUuCisJCQkJICogU3BsaXQgc3RlcHMgdG8gYXZvaWQgb3ZlcmZsb3cuCisJCQkJICogUG9sbCB0aW1lLXRpbWUgY29ycmVzcG9uZGluZyB0byBvbmUgcGVyaW9kCisJCQkJICogaW4gYnl0ZXMuCisJCQkJICogKFNhbXBsZXJhdGUgKiBjaGFubmVsY291bnQgKiBmb3JtYXQpID0KKwkJCQkgKiBieXRlcyBpbiAxIHNlYy4KKwkJCQkgKiBQb2xsIHRpbWUgPQorCQkJCSAqCShwZXJpb2QgYnl0ZXMgLyBieXRlcyBpbiBvbmUgc2VjKSAqCisJCQkJICoJIDEwMDAwMDAgbWljcm8gc2Vjb25kcy4KKwkJCQkgKiBNdWx0aXBsaWNhdGlvbiBieSAxMDAwMDAwIGlzIGRvbmUgaW4gdHdvCisJCQkJICogc3RlcHMgdG8ga2VlcCB0aGUgYWNjdXJhY3kgb2YgcG9sbCB0aW1lLgorCQkJCSAqLworCQkJCWlmIChwcnRkLT5tbWFwX2ZsYWcpIHsKKwkJCQkJcGVyaW9kX2J5dGVzID0gKCh1aW50NjRfdCkoCisJCQkJCQkoc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKAorCQkJCQkJCXBydGQtPnN1YnN0cmVhbSkpICoKKwkJCQkJCQkxMDAwKSk7CisJCQkJCWJ5dGVzX29uZV9zZWMgPSAocnVudGltZS0+cmF0ZQorCQkJCQkJKiBydW50aW1lLT5jaGFubmVscyAqIDIpOworCQkJCQlieXRlc19vbmVfc2VjID0KKwkJCQkJCWRpdl91NjQoYnl0ZXNfb25lX3NlYywgMTAwMCk7CisJCQkJCXBydGQtPnBvbGxfdGltZSA9CisJCQkJCQlkaXZfdTY0KHBlcmlvZF9ieXRlcywKKwkJCQkJCWJ5dGVzX29uZV9zZWMpOworCQkJCQlwcl9kZWJ1ZygicHJ0ZC0+cG9sbF90aW1lOiAlZCIsCisJCQkJCQkJcHJ0ZC0+cG9sbF90aW1lKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfU1RPUDoKKwkJCQlwcl9kZWJ1ZygiJXM6IGV2ZW50IT0wXG4iLCBfX2Z1bmNfXyk7CisJCQkJcHJ0ZC0+c3RhcnQgPSAwOworCQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfTE9XX1dNOgorCQkJCXByX2RlYnVnKCIlczogVW5kZXJydW5cbiIsIF9fZnVuY19fKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9ISV9XTToKKwkJCQlwcl9kZWJ1ZygiJXM6IE92ZXJydW5cbiIsIF9fZnVuY19fKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwl9CisJY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDogeworCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKKwkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1dSSVRFX1YyOgorCQkJcHJfZGVidWcoIndyaXRlIGRvbmVcbiIpOworCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCisJCQkJCQkJKHBydGQtPnN1YnN0cmVhbSk7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPnN1YnN0cmVhbSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFJFU0VUX0VWRU5UUzoKKwkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCisJCQkJCQkocHJ0ZC0+c3Vic3RyZWFtKTsKKwkJcHJ0ZC0+cmVzZXRfZXZlbnQgPSB0cnVlOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPnN1YnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcGNtX2FmZV9wcm9jZXNzX3J4X3BrdCh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwKKwkJIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHByaXY7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBOVUxMOworCXVpbnQxNl90IGV2ZW50OworCXVpbnQ2NF90IHBlcmlvZF9ieXRlczsKKwl1aW50NjRfdCBieXRlc19vbmVfc2VjOworCXVpbnQzMl90IG1lbV9tYXBfaGFuZGxlID0gMDsKKworCWlmIChwcnRkID09IE5VTEwpCisJCXJldHVybjsKKwlzdWJzdHJlYW0gPSAgcHJ0ZC0+c3Vic3RyZWFtOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBRkVfRVZFTlRfUlRfUFJPWFlfUE9SVF9TVEFUVVM6IHsKKwkJZXZlbnQgPSAodWludDE2X3QpKCgweEZGRkYwMDAwICYgcGF5bG9hZFswXSkgPj4gMHgxMCk7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBBRkVfRVZFTlRfUlRQT1JUX1NUQVJUOiB7CisJCQlwcnRkLT5kc3BfY250ID0gMDsKKwkJCS8qIENhbGN1bGF0ZSBwb2xsIHRpbWUuIFNwbGl0IHN0ZXBzIHRvIGF2b2lkIG92ZXJmbG93LgorCQkJICogUG9sbCB0aW1lLXRpbWUgY29ycmVzcG9uZGluZyB0byBvbmUgcGVyaW9kIGluIGJ5dGVzLgorCQkJICogKFNhbXBsZXJhdGUgKiBjaGFubmVsY291bnQgKiBmb3JtYXQpPWJ5dGVzIGluIDEgc2VjLgorCQkJICogUG9sbCB0aW1lID0gIChwZXJpb2QgYnl0ZXMgLyBieXRlcyBpbiBvbmUgc2VjKSAqCisJCQkgKiAxMDAwMDAwIG1pY3JvIHNlY29uZHMuCisJCQkgKiBNdWx0aXBsaWNhdGlvbiBieSAxMDAwMDAwIGlzIGRvbmUgaW4gdHdvIHN0ZXBzIHRvCisJCQkgKiBrZWVwIHRoZSBhY2N1cmFjeSBvZiBwb2xsIHRpbWUuCisJCQkgKi8KKwkJCWlmIChwcnRkLT5tbWFwX2ZsYWcpIHsKKwkJCQlwZXJpb2RfYnl0ZXMgPSAoKHVpbnQ2NF90KSgKKwkJCQkJKHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKKwkJCQkJcHJ0ZC0+c3Vic3RyZWFtKSkgKiAxMDAwKSk7CisJCQkJYnl0ZXNfb25lX3NlYyA9IChydW50aW1lLT5yYXRlICoKKwkJCQkJCXJ1bnRpbWUtPmNoYW5uZWxzICogMik7CisJCQkJYnl0ZXNfb25lX3NlYyA9IGRpdl91NjQoYnl0ZXNfb25lX3NlYywgMTAwMCk7CisJCQkJcHJ0ZC0+cG9sbF90aW1lID0KKwkJCQkJZGl2X3U2NChwZXJpb2RfYnl0ZXMsIGJ5dGVzX29uZV9zZWMpOworCQkJCXByX2RlYnVnKCJwcnRkLT5wb2xsX3RpbWUgOiAlZFxuIiwKKwkJCQkJcHJ0ZC0+cG9sbF90aW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtX21hcF9oYW5kbGUgPQorCQkJCQlhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCk7CisJCQkJaWYgKCFtZW1fbWFwX2hhbmRsZSkKKwkJCQkJcHJfZXJyKCIlczptZW1fbWFwX2hhbmRsZSBpcyBOVUxMXG4iLAorCQkJCQkJCSBfX2Z1bmNfXyk7CisJCQkJLyogRG8gaW5pdGlhbCByZWFkIHRvIHN0YXJ0IHRyYW5zZmVyICovCisJCQkJYWZlX3J0X3Byb3h5X3BvcnRfcmVhZCgocHJ0ZC0+ZG1hX2FkZHIgKworCQkJCQkocHJ0ZC0+ZHNwX2NudCAqCisJCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKKwkJCQkJCXBydGQtPnN1YnN0cmVhbSkpKSwKKwkJCQkJbWVtX21hcF9oYW5kbGUsCisJCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKKwkJCQkJCXBydGQtPnN1YnN0cmVhbSkpOworCQkJCXBydGQtPmRzcF9jbnQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9TVE9QOgorCQkJcHJfZGVidWcoIiVzOiBldmVudCE9MFxuIiwgX19mdW5jX18pOworCQkJcHJ0ZC0+c3RhcnQgPSAwOworCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1NFVFVQKTsKKwkJCWJyZWFrOworCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfTE9XX1dNOgorCQkJcHJfZGVidWcoIiVzOiBVbmRlcnJ1blxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9ISV9XTToKKwkJCXByX2RlYnVnKCIlczogT3ZlcnJ1blxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDogeworCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKKwkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjI6CisJCQlwcl9kZWJ1ZygiJXMgOlJlYWQgZG9uZVxuIiwgX19mdW5jX18pOworCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCisJCQkJCQkJKHBydGQtPnN1YnN0cmVhbSk7CisJCQlpZiAoIXBydGQtPm1tYXBfZmxhZykgeworCQkJCWF0b21pY19zZXQoJnBydGQtPnJlY19ieXRlc19hdmFpbCwgMSk7CisJCQkJd2FrZV91cCgmcHJ0ZC0+cmVhZF93YWl0KTsKKwkJCX0KKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+c3Vic3RyZWFtKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgUkVTRVRfRVZFTlRTOgorCQlwcnRkLT5wY21faXJxX3BvcyArPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMKKwkJCQkJCQkocHJ0ZC0+c3Vic3RyZWFtKTsKKwkJcHJ0ZC0+cmVzZXRfZXZlbnQgPSB0cnVlOworCQlpZiAoIXBydGQtPm1tYXBfZmxhZykgeworCQkJYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAxKTsKKwkJCXdha2VfdXAoJnBydGQtPnJlYWRfd2FpdCk7CisJCX0KKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChwcnRkLT5zdWJzdHJlYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2FmZV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNhbXBsZV9yYXRlPSVkXG4iLCBfX2Z1bmNfXywgcnVudGltZS0+cmF0ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IGRhaS0+aWQgPSV4XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJcmV0ID0gYWZlX3JlZ2lzdGVyX2dldF9ldmVudHMoZGFpLT5pZCwKKwkJCXBjbV9hZmVfcHJvY2Vzc190eF9wa3QsIHBydGQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiYWZlLXBjbTpyZWdpc3RlciBmb3IgZXZlbnRzIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXByX2RlYnVnKCIlczpzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJcHJ0ZC0+cHJlcGFyZWQrKzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCXByX2RlYnVnKCIlczogZGFpLT5pZCA9JXhcbiIsIF9fZnVuY19fLCBkYWktPmlkKTsKKwlyZXQgPSBhZmVfcmVnaXN0ZXJfZ2V0X2V2ZW50cyhkYWktPmlkLAorCQkJcGNtX2FmZV9wcm9jZXNzX3J4X3BrdCwgcHJ0ZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJhZmUtcGNtOnJlZ2lzdGVyIGZvciBldmVudHMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJfZGVidWcoIiVzOnN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlwcnRkLT5wcmVwYXJlZCsrOworCXJldHVybiAwOworfQorCisvKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7CisJODAwMCwgMTYwMDAsIDQ4MDAwCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAorCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKKwkubWFzayA9IDAsCit9OworCitzdGF0aWMgaW50IG1zbV9hZmVfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBOVUxMOworCWludCByZXQgPSAwOworCisJcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY21fYWZlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJ0ZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwcl9kZWJ1ZygicHJ0ZCAlcEtcbiIsIHBydGQpOworCisJbXV0ZXhfaW5pdCgmcHJ0ZC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBydGQtPmRzcF9sb2NrKTsKKwlwcnRkLT5kc3BfY250ID0gMDsKKworCW11dGV4X2xvY2soJnBydGQtPmxvY2spOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJ1bnRpbWUtPmh3ID0gbXNtX2FmZV9oYXJkd2FyZV9wbGF5YmFjazsKKwllbHNlCisJCXJ1bnRpbWUtPmh3ID0gbXNtX2FmZV9oYXJkd2FyZV9jYXB0dXJlOworCisJcHJ0ZC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisJcHJ0ZC0+YXVkaW9fY2xpZW50ID0gcTZhZmVfYXVkaW9fY2xpZW50X2FsbG9jKHBydGQpOworCWlmICghcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2RlYnVnKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCQlrZnJlZShwcnRkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcnRkLT5yZWFkX3dhaXQpOworCisJaHJ0aW1lcl9pbml0KCZwcnRkLT5ocnQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXBydGQtPmhydC5mdW5jdGlvbiA9IGFmZV9ocnRpbWVyX2NhbGxiYWNrOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcHJ0ZC0+aHJ0LmZ1bmN0aW9uID0gYWZlX2hydGltZXJfcmVjX2NhbGxiYWNrOworCisJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAorCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSZjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7CisJLyogRW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCisJCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApCisJCXByX2Vycigic25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIgZmFpbGVkXG4iKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCU1JTl9DQVBUVVJFX05VTV9QRVJJT0RTICogTUlOX0NBUFRVUkVfUEVSSU9EX1NJWkUsCisJCQlNQVhfQ0FQVFVSRV9OVU1fUEVSSU9EUyAqIE1BWF9DQVBUVVJFX1BFUklPRF9TSVpFKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgbWluIG1heCByZXQgPSAlZFxuIiwKKwkJCSAgICAgIHJldCk7CisJCX0KKwl9CisKKwlwcnRkLT5yZXNldF9ldmVudCA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfcGxheWJhY2tfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlpbnQgY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsCisJCQkJdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpod2J1ZiA9IHJ1bnRpbWUtPmRtYV9hcmVhICsgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGh3b2ZmKTsKKwl1MzIgbWVtX21hcF9oYW5kbGUgPSAwOworCisJcHJfZGVidWcoIiVzIDogYXBwbF9wdHIgMHglbHggaHdfcHRyIDB4JWx4IGRlc3RfdG9fY29weSAweCVwS1xuIiwKKwkJX19mdW5jX18sCisJCXJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyLCBydW50aW1lLT5zdGF0dXMtPmh3X3B0ciwgaHdidWYpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGh3YnVmLCBidWYsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpKSkgeworCQlwcl9lcnIoIiVzIDpGYWlsZWQgdG8gY29weSBhdWRpbyBmcm9tIHVzZXIgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIXBydGQtPm1tYXBfZmxhZykgeworCQltZW1fbWFwX2hhbmRsZSA9IGFmZV9yZXFfbW1hcF9oYW5kbGUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJaWYgKCFtZW1fbWFwX2hhbmRsZSkgeworCQkJcHJfZXJyKCIlczogbWVtX21hcF9oYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXByX2RlYnVnKCIlcyA6IHBydGQtPiBkbWFfYWRkciAweCVseCBkc3BfY250ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBydGQtPmRtYV9hZGRyLCBwcnRkLT5kc3BfY250KTsKKworCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQorCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7CisKKwkJcmV0ID0gYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUoCisJCQkJKHBydGQtPmRtYV9hZGRyICsgKHBydGQtPmRzcF9jbnQgKgorCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhwcnRkLT5zdWJzdHJlYW0pKSksCisJCQkJbWVtX21hcF9oYW5kbGUsCisJCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpOworCisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IEFGRSBwcm94eSBwb3J0IHdyaXRlIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcnRkLT5kc3BfY250Kys7CisJfQorZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCWludCBjaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwKKwkJCQl2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmh3YnVmID0gcnVudGltZS0+ZG1hX2FyZWEgKyBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgaHdvZmYpOworCXUzMiBtZW1fbWFwX2hhbmRsZSA9IDA7CisKKwlpZiAoIXBydGQtPm1tYXBfZmxhZykgeworCQltZW1fbWFwX2hhbmRsZSA9IGFmZV9yZXFfbW1hcF9oYW5kbGUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKworCQlpZiAoIW1lbV9tYXBfaGFuZGxlKSB7CisJCQlwcl9lcnIoIiVzOiBtZW1fbWFwX2hhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKHBydGQtPmRzcF9jbnQgPT0gcnVudGltZS0+cGVyaW9kcykKKwkJCXBydGQtPmRzcF9jbnQgPSAwOworCisJCXJldCA9IGFmZV9ydF9wcm94eV9wb3J0X3JlYWQoKHBydGQtPmRtYV9hZGRyICsKKwkJCQkocHJ0ZC0+ZHNwX2NudCAqCisJCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpKSwKKwkJCQltZW1fbWFwX2hhbmRsZSwKKwkJCQlzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocHJ0ZC0+c3Vic3RyZWFtKSk7CisKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogQUZFIHByb3h5IHBvcnQgcmVhZCBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlwcnRkLT5kc3BfY250Kys7CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcnRkLT5yZWFkX3dhaXQsCisJCQkJYXRvbWljX3JlYWQoJnBydGQtPnJlY19ieXRlc19hdmFpbCksIDUgKiBIWik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50X3RpbWVvdXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAwKTsKKwl9CisJcHJfZGVidWcoIiVzOmFwcGxfcHRyIDB4JWx4IGh3X3B0ciAweCVseCBzcmNfdG9fY29weSAweCVwS1xuIiwKKwkJCV9fZnVuY19fLCBydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciwKKwkJCXJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyLCBod2J1Zik7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgaHdidWYsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpKSkgeworCQlwcl9lcnIoIiVzOiBjb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwkJZ290byBmYWlsOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCisJCQlzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1ZiwKKwkJCXNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwcnRkLT5yZXNldF9ldmVudCkgeworCQlwcl9kZWJ1ZygiJXM6IHJlc2V0IGV2ZW50cyByZWNlaXZlZCBmcm9tIEFEU1AsIHJldHVybiBlcnJvclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTkVUUkVTRVQ7CisJfQorCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJldCA9IG1zbV9hZmVfcGxheWJhY2tfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsIGh3b2ZmLAorCQkJCQlidWYsIGZyYW1lcyk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fYWZlX2NhcHR1cmVfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsIGh3b2ZmLAorCQkJCQlidWYsIGZyYW1lcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYWZlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IE5VTEw7CisJaW50IGRpciA9IElOOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKSB7CisJCXByX2Vycigic3Vic3RyZWFtIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJZGFpID0gcnRkLT5jcHVfZGFpOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCW11dGV4X2xvY2soJnBydGQtPmxvY2spOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJZGlyID0gSU47CisJCXJldCA9ICBhZmVfdW5yZWdpc3Rlcl9nZXRfZXZlbnRzKGRhaS0+aWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiQUZFIHVucmVnaXN0ZXIgZm9yIGV2ZW50cyBmYWlsZWRcbiIpOworCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCWRpciA9IE9VVDsKKwkJcmV0ID0gIGFmZV91bnJlZ2lzdGVyX2dldF9ldmVudHMoZGFpLT5pZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZXJyKCJBRkUgdW5yZWdpc3RlciBmb3IgZXZlbnRzIGZhaWxlZFxuIik7CisJfQorCWlmIChwcnRkLT5tbWFwX2ZsYWcpCisJCWhydGltZXJfY2FuY2VsKCZwcnRkLT5ocnQpOworCisJcmMgPSBhZmVfY21kX21lbW9yeV91bm1hcChhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCkpOworCWlmIChyYyA8IDApCisJCXByX2VycigiQUZFIG1lbW9yeSB1bm1hcCBmYWlsZWRcbiIpOworCisJcHJfZGVidWcoInJlbGVhc2UgYWxsIGJ1ZmZlclxuIik7CisJZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJaWYgKGRtYV9idWYgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiZG1hX2J1ZiBpcyBOVUxMXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoZG1hX2J1Zi0+YXJlYSkKKwkJZG1hX2J1Zi0+YXJlYSA9IE5VTEw7CisJcTZhZmVfYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoZGlyLCBwcnRkLT5hdWRpb19jbGllbnQpOworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IGRhaS0+aWQgPSV4XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJcTZhZmVfYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCXBydGQtPnByZXBhcmVkLS07CisJa2ZyZWUocHJ0ZCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG1zbV9hZmVfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisJaWYgKHBydGQtPnByZXBhcmVkKQorCQlyZXR1cm4gMDsKKwltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmV0ID0gbXNtX2FmZV9wbGF5YmFja19wcmVwYXJlKHN1YnN0cmVhbSk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fYWZlX2NhcHR1cmVfcHJlcGFyZShzdWJzdHJlYW0pOworCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgbXNtX2FmZV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJc3RydWN0IGFmZV9hdWRpb19wb3J0X2RhdGEgKmFwZCA9IGFjLT5wb3J0OworCXN0cnVjdCBhZmVfYXVkaW9fYnVmZmVyICphYjsKKwlpbnQgZGlyID0gLTE7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlwcnRkLT5tbWFwX2ZsYWcgPSAxOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWRpciA9IElOOworCWVsc2UKKwkJZGlyID0gT1VUOworCWFiID0gJihhcGRbZGlyXS5idWZbMF0pOworCisJcmV0dXJuIG1zbV9hdWRpb19pb25fbW1hcCgoc3RydWN0IGF1ZGlvX2J1ZmZlciAqKWFiLCB2bWEpOworfQorc3RhdGljIGludCBtc21fYWZlX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoIiVzOiBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIiwgX19mdW5jX18pOworCQlwcnRkLT5zdGFydCA9IDE7CisJCWlmIChwcnRkLT5tbWFwX2ZsYWcpCisJCQlocnRpbWVyX3N0YXJ0KCZwcnRkLT5ocnQsIG5zX3RvX2t0aW1lKDApLAorCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXByX2RlYnVnKCIlczogU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIiwgX19mdW5jX18pOworCQlwcnRkLT5zdGFydCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCBtc21fYWZlX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWZlX2F1ZGlvX2J1ZmZlciAqYnVmOworCWludCBkaXIsIHJjOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWRpciA9IElOOworCWVsc2UKKwkJZGlyID0gT1VUOworCisJcmMgPSBxNmFmZV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXMoZGlyLAorCQlwcnRkLT5hdWRpb19jbGllbnQsCisJCShwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykgLyBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpKSwKKwkJcGFyYW1zX3BlcmlvZHMocGFyYW1zKSk7CisJcHJfZGVidWcoInBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSA9ICVkXG4iLAorCQkJKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSkpOworCXByX2RlYnVnKCJwYXJhbXNfcGVyaW9kcyhwYXJhbXMpID0gJWRcbiIsCisJCQkocGFyYW1zX3BlcmlvZHMocGFyYW1zKSkpOworCXByX2RlYnVnKCJwYXJhbXNfcGVyaW9kc2l6ZShwYXJhbXMpID0gJWRcbiIsCisJCShwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykgLyBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpKSk7CisKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiQXVkaW8gU3RhcnQ6IEJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLCByYyk7CisJCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWYgPSBwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbZGlyXS5idWY7CisKKwlpZiAoYnVmID09IE5VTEwgfHwgYnVmWzBdLmRhdGEgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6YnVmID0gJXBLXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKwlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWRtYV9idWYtPmFyZWEgPSBidWZbMF0uZGF0YTsKKwlkbWFfYnVmLT5hZGRyID0gYnVmWzBdLnBoeXM7CisKKwlkbWFfYnVmLT5ieXRlcyA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKworCWlmICghZG1hX2J1Zi0+YXJlYSkgeworCQlwcl9lcnIoIiVzOk1TTSBBRkUgcGh5c2ljYWwgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGRtYV9idWYtPmFyZWEsIDAsICBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCisJcHJ0ZC0+ZG1hX2FkZHIgPSAocGh5c19hZGRyX3QpIGRtYV9idWYtPmFkZHI7CisKKwltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKworCXJjID0gYWZlX21lbW9yeV9tYXAoZG1hX2J1Zi0+YWRkciwgZG1hX2J1Zi0+Ynl0ZXMsIHBydGQtPmF1ZGlvX2NsaWVudCk7CisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCJmYWlsIHRvIG1hcCBtZW1vcnkgdG8gRFNQXG4iKTsKKworCXJldHVybiByYzsKK30KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fYWZlX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHBydGQtPnBjbV9pcnFfcG9zID49IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKQorCQlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisKKwlpZiAocHJ0ZC0+cmVzZXRfZXZlbnQpIHsKKwkJcHJfZGVidWcoIiVzOiByZXNldCBldmVudHMgcmVjZWl2ZWQgZnJvbSBBRFNQLCByZXR1cm4gWFJVTlxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKKwl9CisKKwlwcl9kZWJ1ZygicGNtX2lycV9wb3MgPSAlZFxuIiwgcHJ0ZC0+cGNtX2lycV9wb3MpOworCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgKHBydGQtPnBjbV9pcnFfcG9zKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX2FmZV9vcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gbXNtX2FmZV9vcGVuLAorCS5jb3B5ICAgICAgICAgICA9IG1zbV9hZmVfY29weSwKKwkuaHdfcGFyYW1zCT0gbXNtX2FmZV9od19wYXJhbXMsCisJLnRyaWdnZXIJPSBtc21fYWZlX3RyaWdnZXIsCisJLmNsb3NlICAgICAgICAgID0gbXNtX2FmZV9jbG9zZSwKKwkucHJlcGFyZSAgICAgICAgPSBtc21fYWZlX3ByZXBhcmUsCisJLm1tYXAJCT0gbXNtX2FmZV9tbWFwLAorCS5wb2ludGVyCT0gbXNtX2FmZV9wb2ludGVyLAorfTsKKworCitzdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hZmVfYWZlX3Byb2JlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0geworCS5vcHMJCT0gJm1zbV9hZmVfb3BzLAorCS5wY21fbmV3CT0gbXNtX2Fzb2NfcGNtX25ldywKKwkucHJvYmUJCT0gbXNtX2FmZV9hZmVfcHJvYmUsCit9OworCitzdGF0aWMgaW50IG1zbV9hZmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKworCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKKwkJCQkgICAmbXNtX3NvY19wbGF0Zm9ybSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2FmZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fcGNtX2FmZV9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tYWZlIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fcGNtX2FmZV9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9hZmVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1wY20tYWZlIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9wY21fYWZlX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX2FmZV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2FmZV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fYWZlX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9hZmVfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQUZFIFBDTSBtb2R1bGUgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1hZmUtdjIuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWFmZS12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTRjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1hZmUtdjIuaApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsMjAxNS0yMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX01TTV9QQ01fQUZFX0gKKyNkZWZpbmUgX01TTV9QQ01fQUZFX0gKKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorCisKK3N0cnVjdCBwY21fYWZlX2luZm8geworCXVuc2lnbmVkIGxvbmcgZG1hX2FkZHI7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJdW5zaWduZWQgaW50IHBjbV9pcnFfcG9zOyAgICAgICAvKiBJUlEgcG9zaXRpb24gKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzcGlubG9ja190IGRzcF9sb2NrOworCXVpbnQzMl90IHNhbXBfcmF0ZTsKKwl1aW50MzJfdCBjaGFubmVsX21vZGU7CisJdWludDhfdCBzdGFydDsKKwl1aW50MzJfdCBkc3BfY250OworCXVpbnQzMl90IGJ1Zl9waHlzOworCWludDMyX3QgbW1hcF9mbGFnOworCWludCBwcmVwYXJlZDsKKwlzdHJ1Y3QgaHJ0aW1lciBocnQ7CisJaW50IHBvbGxfdGltZTsKKwlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYXVkaW9fY2xpZW50OworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsKKwlhdG9taWNfdCByZWNfYnl0ZXNfYXZhaWw7CisJYm9vbCByZXNldF9ldmVudDsKK307CisKKworI2RlZmluZSBNU01fRVhUKHhuYW1lLCBmcF9pbmZvLCBmcF9nZXQsIGZwX3B1dCwgYWRkcikgXAorCXsuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLCBcCisJLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gZnBfaW5mbyxcCisJLmdldCA9IGZwX2dldCwgLnB1dCA9IGZwX3B1dCwgXAorCS5wcml2YXRlX3ZhbHVlID0gYWRkciwgXAorCX0KKworI2VuZGlmIC8qX01TTV9QQ01fQUZFX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tZHRtZi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tZHRtZi12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTAzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1kdG1mLXYyLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorCisjaW5jbHVkZSAibXNtLXBjbS1xNi12Mi5oIgorI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorI2luY2x1ZGUgInE2dm9pY2UuaCIKKworZW51bSB7CisJRFRNRl9JTl9SWCwKKwlEVE1GX0lOX1RYLAorfTsKKworZW51bSBmb3JtYXQgeworCUZPUk1BVF9TMTZfTEUgPSAyCit9OworCitzdHJ1Y3QgZHRtZl9kZXRfaW5mbyB7CisJY2hhciAgICAgc2Vzc2lvbltNQVhfU0VTU0lPTl9OQU1FX0xFTl07CisJdWludDhfdCAgZGlyOworCXVpbnQxNl90IGhpZ2hfZnJlcTsKKwl1aW50MTZfdCBsb3dfZnJlcTsKK307CisKK3N0cnVjdCBkdG1mX2J1Zl9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGR0bWZfZGV0X2luZm8gZHRtZl9kZXRfcGt0OworfTsKKworZW51bSBkdG1mX3N0YXRlIHsKKwlEVE1GX0dFTl9SWF9TVE9QUEVELAorCURUTUZfR0VOX1JYX1NUQVJURUQsCit9OworCisjZGVmaW5lIERUTUZfTUFYX1FfTEVOIDEwCisjZGVmaW5lIERUTUZfUEtUX1NJWkUgc2l6ZW9mKHN0cnVjdCBkdG1mX2RldF9pbmZvKQorCitzdHJ1Y3QgZHRtZl9kcnZfaW5mbyB7CisJZW51bSAgZHRtZl9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKmNhcHR1cmVfc3Vic3RyZWFtOworCisJc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX291dF9xdWV1ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IG91dF93YWl0OworCisJc3RydWN0IG11dGV4IGxvY2s7CisJc3BpbmxvY2tfdCBkc3BfbG9jazsKKworCXVpbnQ4X3QgY2FwdHVyZV9zdGFydDsKKwl1aW50OF90IGNhcHR1cmVfaW5zdGFuY2U7CisKKwl1bnNpZ25lZCBpbnQgcGNtX2NhcHR1cmVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcGNtX2NhcHR1cmVfY291bnQ7CisJdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX2lycV9wb3M7CisJdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX2J1Zl9wb3M7Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbXNtX3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkuY2hhbm5lbHNfbWluID0gICAgICAgICAxLAorCS5jaGFubmVsc19tYXggPSAgICAgICAgIDEsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoc2l6ZW9mKHN0cnVjdCBkdG1mX2J1Zl9ub2RlKSAqIERUTUZfTUFYX1FfTEVOKSwKKwkucGVyaW9kX2J5dGVzX21pbiA9CURUTUZfUEtUX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPQlEVE1GX1BLVF9TSVpFLAorCS5wZXJpb2RzX21pbiA9CQlEVE1GX01BWF9RX0xFTiwKKwkucGVyaW9kc19tYXggPQkJRFRNRl9NQVhfUV9MRU4sCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKK3N0YXRpYyBpbnQgbXNtX2R0bWZfcnhfZ2VuZXJhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1aW50MTZfdCBsb3dfZnJlcSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXVpbnQxNl90IGhpZ2hfZnJlcSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWludDY0X3QgZHVyYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKwl1aW50MTZfdCBnYWluID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM107CisKKwlwcl9kZWJ1ZygiJXM6IGxvd19mcmVxPSVkIGhpZ2hfZnJlcT0lZCBkdXJhdGlvbj0lZCBnYWluPSVkXG4iLAorCQkgX19mdW5jX18sIGxvd19mcmVxLCBoaWdoX2ZyZXEsIChpbnQpZHVyYXRpb24sIGdhaW4pOworCWFmZV9kdG1mX2dlbmVyYXRlX3J4KGR1cmF0aW9uLCBoaWdoX2ZyZXEsIGxvd19mcmVxLCBnYWluKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZHRtZl9yeF9nZW5lcmF0ZV9nZXQoc3RydWN0ICBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kdG1mX2RldGVjdF92b2ljZV9yeF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBlbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogZW5hYmxlPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwl2b2NfZW5hYmxlX2R0bWZfcnhfZGV0ZWN0aW9uKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRV9TRVNTSU9OX05BTUUpLAorCQkJCSAgICAgZW5hYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kdG1mX2RldGVjdF92b2ljZV9yeF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kdG1mX2RldGVjdF92b2x0ZV9yeF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBlbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogZW5hYmxlPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwl2b2NfZW5hYmxlX2R0bWZfcnhfZGV0ZWN0aW9uKHZvY19nZXRfc2Vzc2lvbl9pZChWT0xURV9TRVNTSU9OX05BTUUpLAorCQkJCSAgICAgZW5hYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9kdG1mX2RldGVjdF92b2x0ZV9yeF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9kdG1mX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIkRUTUZfR2VuZXJhdGUgUnggTG93IEhpZ2ggRHVyYXRpb24gR2FpbiIsCisJCQkgICAgIFNORF9TT0NfTk9QTSwgMCwgNTAwMCwgMCwgNCwKKwkJCSAgICAgbXNtX2R0bWZfcnhfZ2VuZXJhdGVfZ2V0LAorCQkJICAgICBtc21fZHRtZl9yeF9nZW5lcmF0ZV9wdXQpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GX0RldGVjdCBSeCBWb2ljZSBlbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCQkJbXNtX2R0bWZfZGV0ZWN0X3ZvaWNlX3J4X2dldCwKKwkJCQltc21fZHRtZl9kZXRlY3Rfdm9pY2VfcnhfcHV0KSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRl9EZXRlY3QgUnggVm9MVEUgZW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAorCQkJCW1zbV9kdG1mX2RldGVjdF92b2x0ZV9yeF9nZXQsCisJCQkJbXNtX2R0bWZfZGV0ZWN0X3ZvbHRlX3J4X3B1dCksCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fZHRtZl9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV9kdG1mX2NvbnRyb2xzLAorCQkJCSAgICAgIEFSUkFZX1NJWkUobXNtX2R0bWZfY29udHJvbHMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHRtZl9yeF9kZXRlY3RlZF9jYih1aW50OF90ICpwa3QsCisJCQkJY2hhciAqc2Vzc2lvbiwKKwkJCQl2b2lkICpwcml2YXRlX2RhdGEpCit7CisJc3RydWN0IGR0bWZfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgKmR0bWZfZGV0X3BrdCA9CisJCShzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgKilwa3Q7CisJc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBwcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAocHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQ29weSBkdG1mIGRldGVjdGVkIGluZm8gaW50byBvdXRfcXVldWUuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCS8qIGRpc2NhcmRpbmcgZHRtZiBkZXRlY3Rpb24gaW5mbyB0aWxsIHN0YXJ0IGlzIHJlY2VpdmVkICovCisJaWYgKCFsaXN0X2VtcHR5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSkgJiYgcHJ0ZC0+Y2FwdHVyZV9zdGFydCkgeworCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPmZyZWVfb3V0X3F1ZXVlLAorCQkJCQkgICAgc3RydWN0IGR0bWZfYnVmX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQlidWZfbm9kZS0+ZHRtZl9kZXRfcGt0LmhpZ2hfZnJlcSA9IGR0bWZfZGV0X3BrdC0+aGlnaF9mcmVxOworCQlidWZfbm9kZS0+ZHRtZl9kZXRfcGt0Lmxvd19mcmVxID0gZHRtZl9kZXRfcGt0LT5sb3dfZnJlcTsKKwkJaWYgKHNlc3Npb24gIT0gTlVMTCkKKwkJCXN0cmxjcHkoYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5zZXNzaW9uLAorCQkJCXNlc3Npb24sIE1BWF9TRVNTSU9OX05BTUVfTEVOKTsKKworCQlidWZfbm9kZS0+ZHRtZl9kZXRfcGt0LmRpciA9IERUTUZfSU5fUlg7CisJCXByX2RlYnVnKCJoaWdoID0lZCwgbG93PSVkIHNlc3Npb249JXNcbiIsCisJCQkgYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5oaWdoX2ZyZXEsCisJCQkgYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5sb3dfZnJlcSwKKwkJCSBidWZfbm9kZS0+ZHRtZl9kZXRfcGt0LnNlc3Npb24pOworCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJnBydGQtPm91dF9xdWV1ZSk7CisJCXBydGQtPnBjbV9jYXB0dXJlX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJcHJfZXJyKCJEVE1GIGRldGVjdGlvbiBwa3QgaW4gUnggIGRyb3BwZWQsIG5vIGZyZWUgbm9kZSBhdmFpbGFibGVcbiIpOworCX0KKworCXdha2VfdXAoJnBydGQtPm91dF93YWl0KTsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NhcHR1cmVfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlpbnQgY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsCisJCQkJdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCWludCBjb3VudCA9IDA7CisJc3RydWN0IGR0bWZfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBkdG1mX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOworCisJY291bnQgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHBydGQtPm91dF93YWl0LAorCQkJCSghbGlzdF9lbXB0eSgmcHJ0ZC0+b3V0X3F1ZXVlKSksCisJCQkJMSAqIEhaKTsKKworCWlmIChyZXQgPiAwKSB7CisJCWlmIChjb3VudCA8PSBEVE1GX1BLVF9TSVpFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPm91dF9xdWV1ZSwKKwkJCQkJc3RydWN0IGR0bWZfYnVmX25vZGUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwKKwkJCQkJICAgJmJ1Zl9ub2RlLT5kdG1mX2RldF9wa3QsCisJCQkJCSAgIGNvdW50KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgcmV0dXJuZWQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKKwkJCQkgICAgICAmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IFJlYWQgY291bnQgJWQgPiBEVE1GX1BLVF9TSVpFXG4iLAorCQkJCV9fZnVuY19fLCBjb3VudCk7CisJCQlyZXQgPSAtRU5PTUVNOworCQl9CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBObyBVTCBkYXRhIGF2YWlsYWJsZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IFJlYWQgd2FzIGludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAorCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzKCkgRFRNRlxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3Vic3RyZWFtLCBhLCBod29mZiwgYnVmLCBmcmFtZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHRtZl9kcnZfaW5mbyksIEdGUF9LRVJORUwpOworCisJCWlmIChwcnRkID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQltdXRleF9pbml0KCZwcnRkLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBydGQtPmRzcF9sb2NrKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+b3V0X3dhaXQpOworCQlJTklUX0xJU1RfSEVBRCgmcHJ0ZC0+b3V0X3F1ZXVlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnBydGQtPmZyZWVfb3V0X3F1ZXVlKTsKKworCQlydW50aW1lLT5odyA9IG1zbV9wY21faGFyZHdhcmU7CisKKwkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfaW5mbygic25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIgZmFpbGVkXG4iKTsKKworCQlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJcHJ0ZC0+Y2FwdHVyZV9pbnN0YW5jZSsrOworCQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwcnRkOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgZHRtZl9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqY19kbWFfYnVmOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY19zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKworCXByX2RlYnVnKCIlcygpIERUTUZcbiIsIF9fZnVuY19fKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisJCXdha2VfdXAoJnBydGQtPm91dF93YWl0KTsKKworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJcHJ0ZC0+Y2FwdHVyZV9pbnN0YW5jZS0tOworCisJCWlmICghcHJ0ZC0+Y2FwdHVyZV9pbnN0YW5jZSkgeworCQkJaWYgKHBydGQtPnN0YXRlID09IERUTUZfR0VOX1JYX1NUQVJURUQpIHsKKwkJCQlwcnRkLT5zdGF0ZSA9IERUTUZfR0VOX1JYX1NUT1BQRUQ7CisJCQkJdm9jX2Rpc2FibGVfZHRtZl9kZXRfb25fYWN0aXZlX3Nlc3Npb25zKCk7CisJCQkJdm9jX3JlZ2lzdGVyX2R0bWZfcnhfZGV0ZWN0aW9uX2NiKE5VTEwsIE5VTEwpOworCQkJfQorCQkJLyogcmVsZWFzZSBhbGwgYnVmZmVyICovCisJCQkvKiByZWxlYXNlIG91dF9xdWV1ZSBhbmQgZnJlZV9vdXRfcXVldWUgKi8KKwkJCXByX2RlYnVnKCJyZWxlYXNlIGFsbCBidWZmZXJcbiIpOworCQkJY19zdWJzdHJlYW0gPSBwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbTsKKwkJCWlmIChjX3N1YnN0cmVhbSA9PSBOVUxMKSB7CisJCQkJcHJfZGVidWcoImNfc3Vic3RyZWFtIGlzIE5VTExcbiIpOworCQkJCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWNfZG1hX2J1ZiA9ICZjX3N1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJCWlmIChjX2RtYV9idWYgPT0gTlVMTCkgeworCQkJCXByX2RlYnVnKCJjX2RtYV9idWYgaXMgTlVMTC5cbiIpOworCQkJCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChjX2RtYV9idWYtPmFyZWEgIT0gTlVMTCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkJCQkJCSZwcnRkLT5vdXRfcXVldWUpIHsKKwkJCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJCSAgIHN0cnVjdCBkdG1mX2J1Zl9ub2RlLCBsaXN0KTsKKwkJCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCQl9CisKKwkJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkJCQkJICAgJnBydGQtPmZyZWVfb3V0X3F1ZXVlKSB7CisJCQkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsCisJCQkJCQkgICBzdHJ1Y3QgZHRtZl9idWZfbm9kZSwgbGlzdCk7CisJCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssCisJCQkJCQkgICAgICAgZHNwX2ZsYWdzKTsKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChjX3N1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQkJCQkgIHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgsCisJCQkJCQkgIGNfZG1hX2J1Zi0+YXJlYSwKKwkJCQkJCSAgY19kbWFfYnVmLT5hZGRyKTsKKwkJCQljX2RtYV9idWYtPmFyZWEgPSBOVUxMOworCQkJfQorCQl9CisJCXBydGQtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBkdG1mX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc3RydWN0IGR0bWZfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlpbnQgaSA9IDAsIG9mZnNldCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IERUTUZcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCW11dGV4X2xvY2soJnBydGQtPmxvY2spOworCQlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwkJZG1hX2J1Zi0+ZGV2LmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CisJCWRtYV9idWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwkJZG1hX2J1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LAorCQkJCQkJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCwKKwkJCQkJCSZkbWFfYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkbWFfYnVmLT5hcmVhKSB7CisJCQlwcl9lcnIoIiVzOk1TTSBEVE1GIGRtYV9hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRtYV9idWYtPmJ5dGVzID0gcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heDsKKwkJbWVtc2V0KGRtYV9idWYtPmFyZWEsIDAsIHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOworCisJCWZvciAoaSA9IDA7IGkgPCBEVE1GX01BWF9RX0xFTjsgaSsrKSB7CisJCQlwcl9kZWJ1Zygibm9kZSA9JWRcbiIsIGkpOworCQkJYnVmX25vZGUgPSAodm9pZCAqKSBkbWFfYnVmLT5hcmVhICsgb2Zmc2V0OworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCisJCQkJICAgICAgJnBydGQtPmZyZWVfb3V0X3F1ZXVlKTsKKwkJCW9mZnNldCA9IG9mZnNldCArIHNpemVvZihzdHJ1Y3QgZHRtZl9idWZfbm9kZSk7CisJCX0KKworCQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOworCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlczogRFRNRlxuIiwgX19mdW5jX18pOworCXBydGQtPnBjbV9jYXB0dXJlX3NpemUgID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID0gMDsKKwlwcnRkLT5wY21fY2FwdHVyZV9idWZfcG9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlczogRFRNRlxuIiwgX19mdW5jX18pOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKworCQltc21fcGNtX2NhcHR1cmVfcHJlcGFyZShzdWJzdHJlYW0pOworCisJCWlmIChydW50aW1lLT5mb3JtYXQgIT0gRk9STUFUX1MxNl9MRSkgeworCQkJcHJfZXJyKCJmb3JtYXQ6JXUgZG9lc24ndCBtYXRjaCAlZFxuIiwKKwkJCSAgICAgICAodWludDMyX3QpcnVudGltZS0+Zm9ybWF0LCBGT1JNQVRfUzE2X0xFKTsKKwkJCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChwcnRkLT5jYXB0dXJlX2luc3RhbmNlICYmCisJCQkocHJ0ZC0+c3RhdGUgIT0gRFRNRl9HRU5fUlhfU1RBUlRFRCkpIHsKKwkJCXZvY19yZWdpc3Rlcl9kdG1mX3J4X2RldGVjdGlvbl9jYihkdG1mX3J4X2RldGVjdGVkX2NiLAorCQkJCQkJCSAgcHJ0ZCk7CisJCQlwcnRkLT5zdGF0ZSA9IERUTUZfR0VOX1JYX1NUQVJURUQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJcHJfZGVidWcoIiVzOiBUcmlnZ2VyIHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlwcnRkLT5jYXB0dXJlX3N0YXJ0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlwcnRkLT5jYXB0dXJlX3N0YXJ0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG1zbV9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3VmcmFtZXNfdCByZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCWlmIChwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID49IHBydGQtPnBjbV9jYXB0dXJlX3NpemUpCisJCQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID0gMDsKKwkJcmV0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBtc21fcGNtX29wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBtc21fcGNtX29wZW4sCisJLmNvcHkJCT0gbXNtX3BjbV9jb3B5LAorCS5od19wYXJhbXMJPSBtc21fcGNtX2h3X3BhcmFtcywKKwkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX2Nsb3NlLAorCS5wcmVwYXJlICAgICAgICA9IG1zbV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciAgICAgICAgPSBtc21fcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgICAgICAgID0gbXNtX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIGludCBtc21fYXNvY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0geworCS5vcHMJCT0gJm1zbV9wY21fb3BzLAorCS5wY21fbmV3CT0gbXNtX2Fzb2NfcGNtX25ldywKKwkucHJvYmUJCT0gbXNtX3BjbV9kdG1mX3Byb2JlLAorfTsKKworc3RhdGljIGludCBtc21fcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCisJCQkJCSAmbXNtX3NvY19wbGF0Zm9ybSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9wY21fZHRtZl9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tZHRtZiJ9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fcGNtX2R0bWZfZHRfbWF0Y2gpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wY21fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1wY20tZHRtZiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fcGNtX2R0bWZfZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtc21fcGNtX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fcGNtX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEVE1GIHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20taG9zdC12b2ljZS12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20taG9zdC12b2ljZS12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjBkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1ob3N0LXZvaWNlLXYyLmMKQEAgLTAsMCArMSwxNTUzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorI2luY2x1ZGUgInE2dm9pY2UuaCIKKworI2RlZmluZSBIUENNX01BWF9RX0xFTiAyCisjZGVmaW5lIEhQQ01fTUlOX1ZPQ19QS1RfU0laRSAzMjAKKyNkZWZpbmUgSFBDTV9NQVhfVk9DX1BLVF9TSVpFIDY0MAorI2RlZmluZSBWSFBDTV9CTE9DS19TSVpFIDQwOTYKKyNkZWZpbmUgQ0FDSEVfQUxJR05NRU5UX1NJWkUgMTI4CisjZGVmaW5lIENBQ0hFX0FMSUdOTUVOVF9NQVNLIDB4RkZGRkZGODAKKworI2RlZmluZSBWT0lDRV9UWF9DQVBUVVJFX0RBSV9JRCAgIkNTLVZPSUNFIEhPU1QgVFggQ0FQVFVSRSIKKyNkZWZpbmUgVk9JQ0VfVFhfUExBWUJBQ0tfREFJX0lEICJDUy1WT0lDRSBIT1NUIFRYIFBMQVlCQUNLIgorI2RlZmluZSBWT0lDRV9SWF9DQVBUVVJFX0RBSV9JRCAgIkNTLVZPSUNFIEhPU1QgUlggQ0FQVFVSRSIKKyNkZWZpbmUgVk9JQ0VfUlhfUExBWUJBQ0tfREFJX0lEICJDUy1WT0lDRSBIT1NUIFJYIFBMQVlCQUNLIgorCisjZGVmaW5lIFZPTFRFX1RYX0NBUFRVUkVfREFJX0lEICAiVk9MVEUgSE9TVCBUWCBDQVBUVVJFIgorI2RlZmluZSBWT0xURV9UWF9QTEFZQkFDS19EQUlfSUQgIlZPTFRFIEhPU1QgVFggUExBWUJBQ0siCisjZGVmaW5lIFZPTFRFX1JYX0NBUFRVUkVfREFJX0lEICAiVk9MVEUgSE9TVCBSWCBDQVBUVVJFIgorI2RlZmluZSBWT0xURV9SWF9QTEFZQkFDS19EQUlfSUQgIlZPTFRFIEhPU1QgUlggUExBWUJBQ0siCisKKworI2RlZmluZSBWb01Nb2RlMV9UWF9DQVBUVVJFX0RBSV9JRCAgIlZvaWNlTU1vZGUxIEhPU1QgVFggQ0FQVFVSRSIKKyNkZWZpbmUgVm9NTW9kZTFfVFhfUExBWUJBQ0tfREFJX0lEICJWb2ljZU1Nb2RlMSBIT1NUIFRYIFBMQVlCQUNLIgorI2RlZmluZSBWb01Nb2RlMV9SWF9DQVBUVVJFX0RBSV9JRCAgIlZvaWNlTU1vZGUxIEhPU1QgUlggQ0FQVFVSRSIKKyNkZWZpbmUgVm9NTW9kZTFfUlhfUExBWUJBQ0tfREFJX0lEICJWb2ljZU1Nb2RlMSBIT1NUIFJYIFBMQVlCQUNLIgorCisjZGVmaW5lIFZvTU1vZGUyX1RYX0NBUFRVUkVfREFJX0lEICAiVm9pY2VNTW9kZTIgSE9TVCBUWCBDQVBUVVJFIgorI2RlZmluZSBWb01Nb2RlMl9UWF9QTEFZQkFDS19EQUlfSUQgIlZvaWNlTU1vZGUyIEhPU1QgVFggUExBWUJBQ0siCisjZGVmaW5lIFZvTU1vZGUyX1JYX0NBUFRVUkVfREFJX0lEICAiVm9pY2VNTW9kZTIgSE9TVCBSWCBDQVBUVVJFIgorI2RlZmluZSBWb01Nb2RlMl9SWF9QTEFZQkFDS19EQUlfSUQgIlZvaWNlTU1vZGUyIEhPU1QgUlggUExBWUJBQ0siCisKK2VudW0geworCVJYID0gMSwKKwlUWCwKK307CisKK2VudW0geworCVZPSUNFX0lOREVYID0gMCwKKwlWT0xURV9JTkRFWCwKKwlWT01NT0RFMV9JTkRFWCwKKwlWT01NT0RFMl9JTkRFWCwKKwlNQVhfU0VTU0lPTgorfTsKKworZW51bSBocGNtX3N0YXRlIHsKKwlIUENNX1NUT1BQRUQgPSAxLAorCUhQQ01fQ0xPU0VELAorCUhQQ01fUFJFUEFSRUQsCisJSFBDTV9TVEFSVEVELAorfTsKKworc3RydWN0IGhwY21fZnJhbWUgeworCXVpbnQzMl90IGxlbjsKKwl1aW50OF90IHZvY19wa3RbSFBDTV9NQVhfVk9DX1BLVF9TSVpFXTsKK307CisKK3N0cnVjdCBocGNtX2J1Zl9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGhwY21fZnJhbWUgZnJhbWU7Cit9OworCitzdHJ1Y3Qgdm9jcGNtX2lvbl9idWZmZXIgeworCS8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKwlwaHlzX2FkZHJfdCBwYWRkcjsKKwkvKiBLZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCisJdm9pZCAqa3ZhZGRyOworfTsKKworc3RydWN0IGRhaV9kYXRhIHsKKwllbnVtICBocGNtX3N0YXRlIHN0YXRlOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBsaXN0X2hlYWQgZmlsbGVkX3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9xdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZV93YWl0OworCXNwaW5sb2NrX3QgZHNwX2xvY2s7CisJdWludDMyX3QgcGNtX3NpemU7CisJdWludDMyX3QgcGNtX2NvdW50OworCS8qIElSUSBwb3NpdGlvbiAqLworCXVpbnQzMl90IHBjbV9pcnFfcG9zOworCS8qIFBvc2l0aW9uIGluIGJ1ZmZlciAqLworCXVpbnQzMl90IHBjbV9idWZfcG9zOworCXN0cnVjdCB2b2NwY21faW9uX2J1ZmZlciB2b2NwY21faW9uX2J1ZmZlcjsKK307CisKK3N0cnVjdCB0YXBfcG9pbnQgeworCXN0cnVjdCBkYWlfZGF0YSBwbGF5YmFja19kYWlfZGF0YTsKKwlzdHJ1Y3QgZGFpX2RhdGEgY2FwdHVyZV9kYWlfZGF0YTsKK307CisKK3N0cnVjdCBzZXNzaW9uIHsKKwlzdHJ1Y3QgdGFwX3BvaW50IHR4X3RhcF9wb2ludDsKKwlzdHJ1Y3QgdGFwX3BvaW50IHJ4X3RhcF9wb2ludDsKKwlwaHlzX2FkZHJfdCBzZXNzX3BhZGRyOworCXZvaWQgKnNlc3Nfa3ZhZGRyOworCXN0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlOworCXN0cnVjdCBtZW1fbWFwX3RhYmxlIHRwX21lbV90YWJsZTsKK307CisKK3N0cnVjdCB0YXBwbnRfbXhyX2RhdGEgeworCWJvb2wgZW5hYmxlOworCXVpbnQxNl90IGRpcmVjdGlvbjsKKwl1aW50MTZfdCBzYW1wbGVfcmF0ZTsKK307CisKKy8qIFZhbHVlcyBmcm9tIG1peGVyIGN0bCBhcmUgY2FjaGVkIGluIHRoaXMgc3RydWN0dXJlICovCitzdHJ1Y3QgbWl4ZXJfY29uZiB7CisJaW50OF90IHNlc3NfaW5keDsKKwlzdHJ1Y3QgdGFwcG50X214cl9kYXRhIHJ4OworCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgdHg7Cit9OworCitzdHJ1Y3Qgc3RhcnRfY21kIHsKKwlzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCB0YXBfcG50WzJdOworCXVpbnQzMl90IG5vX29mX3RhcG9pbnRzOworfTsKKworc3RydWN0IGhwY21fZHJ2IHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3Qgc2Vzc2lvbiBzZXNzaW9uW01BWF9TRVNTSU9OXTsKKwlzdHJ1Y3QgbWl4ZXJfY29uZiBtaXhlcl9jb25mOworCXN0cnVjdCBpb25fY2xpZW50ICppb25fY2xpZW50OworCXN0cnVjdCBzdGFydF9jbWQgc3RhcnRfY21kOworfTsKKworc3RhdGljIHN0cnVjdCBocGNtX2RydiBocGNtX2RydjsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmUgPSB7CisJLmluZm8gPSAgICAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCksCisJLmZvcm1hdHMgPSAgICAgICAgICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfU1BFQ0lBTCwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAsCisJLnJhdGVfbWluID0gICAgICAgICAgICAgODAwMCwKKwkucmF0ZV9tYXggPSAgICAgICAgICAgICAxNjAwMCwKKwkuY2hhbm5lbHNfbWluID0gICAgICAgICAxLAorCS5jaGFubmVsc19tYXggPSAgICAgICAgIDEsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQlzaXplb2Yoc3RydWN0IGhwY21fYnVmX25vZGUpICogSFBDTV9NQVhfUV9MRU4sCisJLnBlcmlvZF9ieXRlc19taW4gPQlIUENNX01JTl9WT0NfUEtUX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPQlIUENNX01BWF9WT0NfUEtUX1NJWkUsCisJLnBlcmlvZHNfbWluID0JCUhQQ01fTUFYX1FfTEVOLAorCS5wZXJpb2RzX21heCA9CQlIUENNX01BWF9RX0xFTiwKKwkuZmlmb19zaXplID0gICAgICAgICAgICAwLAorfTsKKworc3RhdGljIGNoYXIgKmhwY21fZ2V0X3Nlc3NfbmFtZShpbnQgc2Vzc19pbmR4KQoreworCWNoYXIgKnNlc3NfbmFtZSA9IE5VTEw7CisKKwlpZiAoc2Vzc19pbmR4ID09IFZPSUNFX0lOREVYKQorCQlzZXNzX25hbWUgPSBWT0lDRV9TRVNTSU9OX05BTUU7CisJZWxzZSBpZiAoc2Vzc19pbmR4ID09IFZPTFRFX0lOREVYKQorCQlzZXNzX25hbWUgPSBWT0xURV9TRVNTSU9OX05BTUU7CisJZWxzZSBpZiAoc2Vzc19pbmR4ID09IFZPTU1PREUxX0lOREVYKQorCQlzZXNzX25hbWUgPSBWT0lDRU1NT0RFMV9OQU1FOworCWVsc2UgaWYgKHNlc3NfaW5keCA9PSBWT01NT0RFMl9JTkRFWCkKKwkJc2Vzc19uYW1lID0gVk9JQ0VNTU9ERTJfTkFNRTsKKwllbHNlCisJCXByX2VycigiJXM6LCBJbnZhbGlkIHNlc3NfaW5kZXhcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBzZXNzX25hbWU7Cit9CisKK3N0YXRpYyB2b2lkIGhwY21fcmVzZXRfbWl4ZXJfY29uZmlnKHN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKK3sKKwlwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keCA9IC0xOworCXBydGQtPm1peGVyX2NvbmYucnguZW5hYmxlID0gZmFsc2U7CisJcHJ0ZC0+bWl4ZXJfY29uZi5yeC5kaXJlY3Rpb24gPSAtMTsKKwlwcnRkLT5taXhlcl9jb25mLnJ4LnNhbXBsZV9yYXRlID0gMDsKKworCXBydGQtPm1peGVyX2NvbmYudHguZW5hYmxlID0gZmFsc2U7CisJcHJ0ZC0+bWl4ZXJfY29uZi50eC5kaXJlY3Rpb24gPSAtMTsKKwlwcnRkLT5taXhlcl9jb25mLnR4LnNhbXBsZV9yYXRlID0gMDsKK30KKworLyogQ2hlY2sgZm9yIHZhbGlkIG1peGVyIGNvbnRyb2wgdmFsdWVzICovCitzdGF0aWMgYm9vbCBocGNtX2lzX3ZhbGlkX2NvbmZpZyhpbnQgc2Vzc19pbmR4LCBpbnQgdGFwX3BvaW50LAorCQkJCSB1aW50MTZfdCBkaXJlY3Rpb24sIHVpbnQxNl90IHNhbXBsZXJhdGUpCit7CisJaWYgKHNlc3NfaW5keCA8IFZPSUNFX0lOREVYIHx8IHNlc3NfaW5keCA+IFZPTU1PREUyX0lOREVYKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc19pbmR4IDolZFxuIiwgX19mdW5jX18sIHNlc3NfaW5keCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHNhbXBsZXJhdGUgIT0gVlNTX0lWUENNX1NBTVBMSU5HX1JBVEVfOEsgJiYKKwkgICAgc2FtcGxlcmF0ZSAhPSBWU1NfSVZQQ01fU0FNUExJTkdfUkFURV8xNkspIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzYW1wbGUgcmF0ZSA6JWRcbiIsIF9fZnVuY19fLCBzYW1wbGVyYXRlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKHRhcF9wb2ludCAhPSBSWCkgJiYgKHRhcF9wb2ludCAhPSBUWCkpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCB0YXBwb2ludCA6JWRcbiIsIF9fZnVuY19fLCB0YXBfcG9pbnQpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICgoZGlyZWN0aW9uICE9IFZTU19JVlBDTV9UQVBfUE9JTlRfRElSX0lOKSAmJgorCSAgICAoZGlyZWN0aW9uICE9IFZTU19JVlBDTV9UQVBfUE9JTlRfRElSX09VVCkgJiYKKwkgICAgKGRpcmVjdGlvbiAhPSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVRfSU4pKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgZGlyZWN0aW9uIDolZFxuIiwgX19mdW5jX18sIGRpcmVjdGlvbik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHRydWU7CisKK2Vycm9yOgorCXJldHVybiBmYWxzZTsKK30KKworCitzdGF0aWMgc3RydWN0IGRhaV9kYXRhICpocGNtX2dldF9kYWlfZGF0YShjaGFyICpwY21faWQsIHN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKK3sKKwlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlpZiAocGNtX2lkKSB7CisJCXNpemUgPSBzdHJsZW4ocGNtX2lkKTsKKwkJLyogQ2hlY2sgZm9yIFZvaWNlIERBSSAqLworCQlpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT0lDRV9JTkRFWF0udHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGE7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCWRhaV9kYXRhID0KKwkJJnBydGQtPnNlc3Npb25bVk9JQ0VfSU5ERVhdLnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQlkYWlfZGF0YSA9CisJCSZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT0lDRV9JTkRFWF0ucnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOworCQkvKiBDaGVjayBmb3IgVm9MVEUgREFJICovCisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPTFRFX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT0xURV9JTkRFWF0udHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGE7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPTFRFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCWRhaV9kYXRhID0KKwkJJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQlkYWlfZGF0YSA9CisJCSZwcnRkLT5zZXNzaW9uW1ZPTFRFX0lOREVYXS5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT0xURV9JTkRFWF0ucnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOworCQkvKiBjaGVjayBmb3IgVm9pY2VNTW9kZTEgREFJICovCisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMV9JTkRFWF0udHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGE7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCWRhaV9kYXRhID0KKwkJJnBydGQtPnNlc3Npb25bVk9NTU9ERTFfSU5ERVhdLnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQlkYWlfZGF0YSA9CisJCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMV9JTkRFWF0ucnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOworCQkvKiBjaGVjayBmb3IgVk9pY2VNTW9kZTIgREFJICovCisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0udHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGE7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCWRhaV9kYXRhID0KKwkJJnBydGQtPnNlc3Npb25bVk9NTU9ERTJfSU5ERVhdLnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQlkYWlfZGF0YSA9CisJCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUyX0lOREVYXS5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJZGFpX2RhdGEgPQorCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0ucnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOworCisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBXcm9uZyBkYWkgaWRcbiIsIF9fZnVuY19fKTsKKwkJfQorCX0KKworCXJldHVybiBkYWlfZGF0YTsKK30KKworc3RhdGljIHN0cnVjdCB0YXBfcG9pbnQgKmhwY21fZ2V0X3RhcHBvaW50X2RhdGEoY2hhciAqcGNtX2lkLAorCQkJCQkJc3RydWN0IGhwY21fZHJ2ICpwcnRkKQoreworCXN0cnVjdCB0YXBfcG9pbnQgKnRwID0gTlVMTDsKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlpZiAocGNtX2lkKSB7CisJCXNpemUgPSBzdHJsZW4ocGNtX2lkKTsKKwkJLyogQ2hlY2sgZm9yIFZvaWNlIERBSSAqLworCQlpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT0lDRV9JTkRFWF0udHhfdGFwX3BvaW50OworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0lDRV9UWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS50eF90YXBfcG9pbnQ7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1JYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT0lDRV9JTkRFWF0ucnhfdGFwX3BvaW50OworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0lDRV9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS5yeF90YXBfcG9pbnQ7CisJCS8qIENoZWNrIGZvciBWb0xURSBEQUkgKi8KKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTFRFX0lOREVYXS50eF90YXBfcG9pbnQ7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPTFRFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnR4X3RhcF9wb2ludDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTFRFX0lOREVYXS5yeF90YXBfcG9pbnQ7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPTFRFX1JYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnJ4X3RhcF9wb2ludDsKKwkJLyogY2hlY2sgZm9yIFZvaWNlTU1vZGUxICovCisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMV9JTkRFWF0udHhfdGFwX3BvaW50OworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9UWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS50eF90YXBfcG9pbnQ7CisJCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1JYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMV9JTkRFWF0ucnhfdGFwX3BvaW50OworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7CisJCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS5yeF90YXBfcG9pbnQ7CisJCS8qIGNoZWNrIGZvciBWb2ljZU1Nb2RlMiAqLworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9UWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9NTU9ERTJfSU5ERVhdLnR4X3RhcF9wb2ludDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0udHhfdGFwX3BvaW50OworCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKKwkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9NTU9ERTJfSU5ERVhdLnJ4X3RhcF9wb2ludDsKKwkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgeworCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0ucnhfdGFwX3BvaW50OworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogd3JvbmcgZGFpIGlkXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwlyZXR1cm4gdHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFwcG50X214cl9kYXRhICpocGNtX2dldF90YXBwbnRfbWl4ZXJfZGF0YShjaGFyICpwY21faWQsCisJCQkJCQlzdHJ1Y3QgaHBjbV9kcnYgKnBydGQpCit7CisKKwlpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKKwkgICAgc3RybnN0cihwY21faWQsIFZPSUNFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8CisJICAgIHN0cm5zdHIocGNtX2lkLCBWT0xURV9UWF9DQVBUVVJFX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8CisJICAgIHN0cm5zdHIocGNtX2lkLCBWT0xURV9UWF9QTEFZQkFDS19EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAorCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfQ0FQVFVSRV9EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAorCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfUExBWUJBQ0tfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKKwkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKKwkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpKSB7CisJCXJldHVybiAmcHJ0ZC0+bWl4ZXJfY29uZi50eDsKKwl9IGVsc2UgeworCQlyZXR1cm4gJnBydGQtPm1peGVyX2NvbmYucng7CisJfQorfQorCitzdGF0aWMgaW50IGdldF90YXBwbnRfdmFsdWUoY2hhciAqcGNtX2lkKQoreworCisJaWYgKHN0cm5zdHIocGNtX2lkLCBWT0lDRV9UWF9DQVBUVVJFX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8CisJICAgIHN0cm5zdHIocGNtX2lkLCBWT0lDRV9UWF9QTEFZQkFDS19EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAorCSAgICBzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfQ0FQVFVSRV9EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAorCSAgICBzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfUExBWUJBQ0tfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKKwkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKKwkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8CisJICAgIHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9UWF9DQVBUVVJFX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8CisJICAgIHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9UWF9QTEFZQkFDS19EQUlfSUQsIHN0cmxlbihwY21faWQpKSkgeworCQlyZXR1cm4gVFg7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFJYOworCX0KK30KKworc3RhdGljIGJvb2wgaHBjbV9hbGxfZGFpc19hcmVfcmVhZHkodWludDE2X3QgZGlyZWN0aW9uLCBzdHJ1Y3QgdGFwX3BvaW50ICp0cCwKKwkJCQkgICAgZW51bSBocGNtX3N0YXRlIHN0YXRlKQoreworCWJvb2wgZGFpc19zdGFydGVkID0gZmFsc2U7CisKKwkvKgorCSAqIEJhc2VkIG9uIHRoZSBkaXJlY3Rpb24gc2V0IHBlciB0YXAgcG9pbnQgaW4gdGhlIG1peGVyIGNvbnRyb2wsCisJICogYWxsIHRoZSBkYWlzIHBlciB0YXAgcG9pbnQgc2hvdWxkIG1lZXQgdGhlIHJlcXVpcmVkIHN0YXRlIGZvciB0aGUKKwkgKiBjb21tYW5kcyBzdWNoIGFzIHZwY21fbWFwX21lbW9yeS92cGNtX3N0YXJ0IHRvIGJlIGV4ZWN1dGVkLgorCSAqLworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVRfSU46CisJCWlmICgodHAtPnBsYXliYWNrX2RhaV9kYXRhLnN0YXRlID49IHN0YXRlKSAmJgorCQkgICAgKHRwLT5jYXB0dXJlX2RhaV9kYXRhLnN0YXRlID49IHN0YXRlKSkgeworCQkJZGFpc19zdGFydGVkID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfSU46CisJCWlmICh0cC0+cGxheWJhY2tfZGFpX2RhdGEuc3RhdGUgPj0gc3RhdGUpCisJCQlkYWlzX3N0YXJ0ZWQgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfT1VUOgorCQlpZiAodHAtPmNhcHR1cmVfZGFpX2RhdGEuc3RhdGUgPj0gc3RhdGUpCisJCQlkYWlzX3N0YXJ0ZWQgPSB0cnVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiaW52YWxpZCBkaXJlY3Rpb25cbiIpOworCX0KKworCXJldHVybiBkYWlzX3N0YXJ0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGhwY21fY3JlYXRlX2ZyZWVfcXVldWUoc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmLAorCQkJCSAgIHN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEpCit7CisJc3RydWN0IGhwY21fYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlpbnQgaSA9IDAsIG9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFBDTV9NQVhfUV9MRU47IGkrKykgeworCQlidWZfbm9kZSA9ICh2b2lkICopZG1hX2J1Zi0+YXJlYSArIG9mZnNldDsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCisJCQkgICAgICAmZGFpX2RhdGEtPmZyZWVfcXVldWUpOworCQlvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGhwY21fYnVmX25vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgaHBjbV9mcmVlX2FsbG9jYXRlZF9tZW0oc3RydWN0IGhwY21fZHJ2ICpwcnRkKQoreworCXBoeXNfYWRkcl90IHBhZGRyID0gMDsKKwlzdHJ1Y3QgdGFwX3BvaW50ICp0eHRwID0gTlVMTDsKKwlzdHJ1Y3QgdGFwX3BvaW50ICpyeHRwID0gTlVMTDsKKwlzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcyA9IE5VTEw7CisKKwlzZXNzID0gJnBydGQtPnNlc3Npb25bcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHhdOworCXR4dHAgPSAmc2Vzcy0+dHhfdGFwX3BvaW50OworCXJ4dHAgPSAmc2Vzcy0+cnhfdGFwX3BvaW50OworCXBhZGRyID0gc2Vzcy0+c2Vzc19wYWRkcjsKKworCWlmIChwYWRkcikgeworCQltc21fYXVkaW9faW9uX2ZyZWUocHJ0ZC0+aW9uX2NsaWVudCwgc2Vzcy0+aW9uX2hhbmRsZSk7CisJCXBydGQtPmlvbl9jbGllbnQgPSBOVUxMOworCQlzZXNzLT5pb25faGFuZGxlID0gTlVMTDsKKwkJbXNtX2F1ZGlvX2lvbl9mcmVlKHNlc3MtPnRwX21lbV90YWJsZS5jbGllbnQsCisJCQkJICAgc2Vzcy0+dHBfbWVtX3RhYmxlLmhhbmRsZSk7CisJCXNlc3MtPnRwX21lbV90YWJsZS5jbGllbnQgPSBOVUxMOworCQlzZXNzLT50cF9tZW1fdGFibGUuaGFuZGxlID0gTlVMTDsKKwkJc2Vzcy0+c2Vzc19wYWRkciA9IDA7CisJCXNlc3MtPnNlc3Nfa3ZhZGRyID0gMDsKKwkJc2Vzcy0+aW9uX2hhbmRsZSA9IDA7CisJCXBydGQtPmlvbl9jbGllbnQgPSAwOworCQlzZXNzLT50cF9tZW1fdGFibGUuY2xpZW50ID0gMDsKKwkJc2Vzcy0+dHBfbWVtX3RhYmxlLmhhbmRsZSA9IDA7CisKKwkJdHh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9IDA7CisJCXR4dHAtPmNhcHR1cmVfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0gMDsKKworCQl0eHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9IDA7CisJCXR4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9IDA7CisKKwkJcnh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9IDA7CisJCXJ4dHAtPmNhcHR1cmVfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0gMDsKKworCQlyeHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9IDA7CisJCXJ4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzLCBwYWRkciA9IDAsIG5vdGhpbmcgdG8gZnJlZVxuIiwgX19mdW5jX18pOworCX0KK30KKworc3RhdGljIHZvaWQgaHBjbV91bm1hcF9hbmRfZnJlZV9zaGFyZWRfbWVtb3J5KHN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKKworeworCXBoeXNfYWRkcl90IHBhZGRyID0gMDsKKwljaGFyICpzZXNzX25hbWUgPSBocGNtX2dldF9zZXNzX25hbWUocHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHgpOworCisJaWYgKHBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4ID49IDApCisJCXBhZGRyID0gcHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF0uc2Vzc19wYWRkcjsKKwllbHNlCisJCXBhZGRyID0gMDsKKworCWlmIChwYWRkcikgeworCQl2b2Nfc2VuZF9jdnBfdW5tYXBfdm9jcGNtX21lbW9yeSh2b2NfZ2V0X3Nlc3Npb25faWQoc2Vzc19uYW1lKSk7CisJCWhwY21fZnJlZV9hbGxvY2F0ZWRfbWVtKHBydGQpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlcywgcGFkZHIgPSAwLCBub3RoaW5nIHRvIHVubWFwL2ZyZWVcbiIsIF9fZnVuY19fKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHBjbV9tYXBfdm9jcGNtX21lbW9yeShzdHJ1Y3QgaHBjbV9kcnYgKnBydGQpCit7CisJaW50IHJldCA9IDA7CisJY2hhciAqc2Vzc19uYW1lID0gaHBjbV9nZXRfc2Vzc19uYW1lKHBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4KTsKKwlzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcyA9IE5VTEw7CisKKwlzZXNzID0gJnBydGQtPnNlc3Npb25bcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHhdOworCisJcmV0ID0gdm9jX3NlbmRfY3ZwX21hcF92b2NwY21fbWVtb3J5KHZvY19nZXRfc2Vzc2lvbl9pZChzZXNzX25hbWUpLAorCQkJCQkgICAgICZzZXNzLT50cF9tZW1fdGFibGUsCisJCQkJCSAgICAgc2Vzcy0+c2Vzc19wYWRkciwKKwkJCQkJICAgICBWSFBDTV9CTE9DS19TSVpFKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHBjbV9hbGxvY2F0ZV9zaGFyZWRfbWVtb3J5KHN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKK3sKKwlpbnQgcmVzdWx0OworCWludCByZXQgPSAwOworCXNpemVfdCBtZW1fbGVuOworCXNpemVfdCBsZW47CisJc3RydWN0IHRhcF9wb2ludCAqdHh0cCA9IE5VTEw7CisJc3RydWN0IHRhcF9wb2ludCAqcnh0cCA9IE5VTEw7CisJc3RydWN0IHNlc3Npb24gKnNlc3MgPSBOVUxMOworCisJc2VzcyA9ICZwcnRkLT5zZXNzaW9uW3BydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4XTsKKwl0eHRwID0gJnNlc3MtPnR4X3RhcF9wb2ludDsKKwlyeHRwID0gJnNlc3MtPnJ4X3RhcF9wb2ludDsKKworCXJlc3VsdCA9IG1zbV9hdWRpb19pb25fYWxsb2MoImhvc3RfcGNtX2J1ZmZlciIsCisJCQkJICAgICAmcHJ0ZC0+aW9uX2NsaWVudCwKKwkJCQkgICAgICZzZXNzLT5pb25faGFuZGxlLAorCQkJCSAgICAgVkhQQ01fQkxPQ0tfU0laRSwKKwkJCQkgICAgICZzZXNzLT5zZXNzX3BhZGRyLAorCQkJCSAgICAgJm1lbV9sZW4sCisJCQkJICAgICAmc2Vzcy0+c2Vzc19rdmFkZHIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogbXNtX2F1ZGlvX2lvbl9hbGxvYyBlcnJvciwgcmMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQpOworCQlzZXNzLT5zZXNzX3BhZGRyID0gMDsKKwkJc2Vzcy0+c2Vzc19rdmFkZHIgPSAwOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCXByX2RlYnVnKCIlczogSG9zdCBQQ00gbWVtb3J5IGJsb2NrIGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOworCisJLyogQWxsb2NhdGUgbWVtX21hcF90YWJsZSBmb3IgdGFwIHBvaW50ICovCisJcmVzdWx0ID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiaG9zdF9wY21fdGFibGUiLAorCQkJJnNlc3MtPnRwX21lbV90YWJsZS5jbGllbnQsCisJCQkmc2Vzcy0+dHBfbWVtX3RhYmxlLmhhbmRsZSwKKwkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCksCisJCQkmc2Vzcy0+dHBfbWVtX3RhYmxlLnBoeXMsCisJCQkmbGVuLAorCQkJJnNlc3MtPnRwX21lbV90YWJsZS5kYXRhKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogbXNtX2F1ZGlvX2lvbl9hbGxvYyBlcnJvciwgcmMgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQpOworCQltc21fYXVkaW9faW9uX2ZyZWUocHJ0ZC0+aW9uX2NsaWVudCwgc2Vzcy0+aW9uX2hhbmRsZSk7CisJCXBydGQtPmlvbl9jbGllbnQgPSBOVUxMOworCQlzZXNzLT5pb25faGFuZGxlID0gTlVMTDsKKwkJc2Vzcy0+c2Vzc19wYWRkciA9IDA7CisJCXNlc3MtPnNlc3Nfa3ZhZGRyID0gMDsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwlwcl9kZWJ1ZygiJXM6ICBIb3N0IFBDTSBtZW1vcnkgdGFibGUgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoc2Vzcy0+dHBfbWVtX3RhYmxlLmRhdGEsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCkpOworCisJc2Vzcy0+dHBfbWVtX3RhYmxlLnNpemUgPSBzaXplb2Yoc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX3QpOworCisJcHJfZGVidWcoIiVzOiBkYXRhICVwSyBwaHlzICVwS1xuIiwgX19mdW5jX18sCisJCSBzZXNzLT50cF9tZW1fdGFibGUuZGF0YSwgJnNlc3MtPnRwX21lbV90YWJsZS5waHlzKTsKKworCS8qIFNwbGl0IDQwOTYgYmxvY2sgaW50byBmb3VyIDEwMjQgYnl0ZSBibG9ja3MgZm9yIGVhY2ggZGFpICovCisJdHh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9CisJc2Vzcy0+c2Vzc19wYWRkcjsKKwl0eHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9CisJc2Vzcy0+c2Vzc19rdmFkZHI7CisKKwl0eHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9CisJc2Vzcy0+c2Vzc19wYWRkciArIFZIUENNX0JMT0NLX1NJWkUvNDsKKwl0eHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIgPQorCXNlc3MtPnNlc3Nfa3ZhZGRyICsgVkhQQ01fQkxPQ0tfU0laRS80OworCisJcnh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9CisJc2Vzcy0+c2Vzc19wYWRkciArIChWSFBDTV9CTE9DS19TSVpFLzQpICogMjsKKwlyeHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9CisJc2Vzcy0+c2Vzc19rdmFkZHIgKyAoVkhQQ01fQkxPQ0tfU0laRS80KSAqIDI7CisKKwlyeHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkciA9CisJc2Vzcy0+c2Vzc19wYWRkciArIChWSFBDTV9CTE9DS19TSVpFLzQpICogMzsKKwlyeHRwLT5wbGF5YmFja19kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIgPQorCXNlc3MtPnNlc3Nfa3ZhZGRyICsgKFZIUENNX0JMT0NLX1NJWkUvNCkgKiAzOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHBjbV9zdGFydF92b2NwY20oY2hhciAqcGNtX2lkLCBzdHJ1Y3QgaHBjbV9kcnYgKnBydGQsCisJCQkgICAgIHN0cnVjdCB0YXBfcG9pbnQgKnRwKQoreworCWludCBpbmR4ID0gcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHg7CisJdWludDMyX3QgKm5vX29mX3RwID0gJnBydGQtPnN0YXJ0X2NtZC5ub19vZl90YXBvaW50czsKKwlzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCAqdGFwX3BudCA9ICZwcnRkLT5zdGFydF9jbWQudGFwX3BudFswXTsKKwl1aW50MzJfdCBub19vZl90cF9yZXEgPSAwOworCWNoYXIgKnNlc3NfbmFtZSA9IGhwY21fZ2V0X3Nlc3NfbmFtZShpbmR4KTsKKworCWlmIChwcnRkLT5taXhlcl9jb25mLnJ4LmVuYWJsZSkKKwkJbm9fb2ZfdHBfcmVxKys7CisJaWYgKHBydGQtPm1peGVyX2NvbmYudHguZW5hYmxlKQorCQlub19vZl90cF9yZXErKzsKKworCWlmIChwcnRkLT5taXhlcl9jb25mLnJ4LmVuYWJsZSAmJiAoZ2V0X3RhcHBudF92YWx1ZShwY21faWQpID09IFJYKSkgeworCQlpZiAoaHBjbV9hbGxfZGFpc19hcmVfcmVhZHkocHJ0ZC0+bWl4ZXJfY29uZi5yeC5kaXJlY3Rpb24sCisJCQkJCSAgICB0cCwgSFBDTV9QUkVQQVJFRCkpIHsKKwkJCXByX2RlYnVnKCIlczogUlggY29uZGl0aW9ucyBtZXRcbiIsIF9fZnVuY19fKTsKKwkJCXRhcF9wbnRbKm5vX29mX3RwXS50YXBfcG9pbnQgPQorCQkJCQlWU1NfSVZQQ01fVEFQX1BPSU5UX1JYX0RFRkFVTFQ7CisJCQl0YXBfcG50Wypub19vZl90cF0uZGlyZWN0aW9uID0KKwkJCQkJcHJ0ZC0+bWl4ZXJfY29uZi5yeC5kaXJlY3Rpb247CisJCQl0YXBfcG50Wypub19vZl90cF0uc2FtcGxpbmdfcmF0ZSA9CisJCQkJCXBydGQtPm1peGVyX2NvbmYucnguc2FtcGxlX3JhdGU7CisJCQkoKm5vX29mX3RwKSsrOworCQl9CisJfQorCisJaWYgKHBydGQtPm1peGVyX2NvbmYudHguZW5hYmxlICYmIChnZXRfdGFwcG50X3ZhbHVlKHBjbV9pZCkgPT0gVFgpKSB7CisJCWlmIChocGNtX2FsbF9kYWlzX2FyZV9yZWFkeShwcnRkLT5taXhlcl9jb25mLnR4LmRpcmVjdGlvbiwKKwkJCQkJICAgIHRwLCBIUENNX1BSRVBBUkVEKSkgeworCQkJcHJfZGVidWcoIiVzOiBUWCBjb25kaXRpb25zIG1ldFxuIiwgX19mdW5jX18pOworCQkJdGFwX3BudFsqbm9fb2ZfdHBdLnRhcF9wb2ludCA9CisJCQkJCQlWU1NfSVZQQ01fVEFQX1BPSU5UX1RYX0RFRkFVTFQ7CisJCQl0YXBfcG50Wypub19vZl90cF0uZGlyZWN0aW9uID0KKwkJCQkJCXBydGQtPm1peGVyX2NvbmYudHguZGlyZWN0aW9uOworCQkJdGFwX3BudFsqbm9fb2ZfdHBdLnNhbXBsaW5nX3JhdGUgPQorCQkJCQkJcHJ0ZC0+bWl4ZXJfY29uZi50eC5zYW1wbGVfcmF0ZTsKKwkJCSgqbm9fb2ZfdHApKys7CisJCX0KKwl9CisKKwlpZiAoKHBydGQtPm1peGVyX2NvbmYudHguZW5hYmxlIHx8IHBydGQtPm1peGVyX2NvbmYucnguZW5hYmxlKSAmJgorCSAgICAqbm9fb2ZfdHAgPT0gbm9fb2ZfdHBfcmVxKSB7CisJCXZvY19zZW5kX2N2cF9zdGFydF92b2NwY20odm9jX2dldF9zZXNzaW9uX2lkKHNlc3NfbmFtZSksCisJCQkJCSAgdGFwX3BudCwgKm5vX29mX3RwKTsKKwkJLyogUmVzZXQgdGhlIHN0YXJ0IGNvbW1hbmQgc28gdGhhdCBpdCBpcyBub3QgY2FsbGVkIHR3aWNlICovCisJCW1lbXNldCgmcHJ0ZC0+c3RhcnRfY21kLCAwLCBzaXplb2Yoc3RydWN0IHN0YXJ0X2NtZCkpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogcmVxdWlyZWQgcGNtIGhhbmRsZXMgbm90IG9wZW5lZCB5ZXRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUGxheWJhY2sgcGF0aCovCitzdGF0aWMgdm9pZCBocGNtX2NvcHlfcGxheWJhY2tfZGF0YV9mcm9tX3F1ZXVlKHN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEsCisJCQkJCSAgICAgICB1aW50MzJfdCAqbGVuKQoreworCXN0cnVjdCBocGNtX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisKKwlpZiAoZGFpX2RhdGEtPnN1YnN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KCZkYWlfZGF0YS0+ZmlsbGVkX3F1ZXVlKSkgeworCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmRhaV9kYXRhLT5maWxsZWRfcXVldWUsCisJCQkJc3RydWN0IGhwY21fYnVmX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQkqbGVuID0gYnVmX25vZGUtPmZyYW1lLmxlbjsKKwkJbWVtY3B5KCh1OCAqKWRhaV9kYXRhLT52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIsCisJCSAgICAgICAmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUubGVuKTsKKworCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmRhaV9kYXRhLT5mcmVlX3F1ZXVlKTsKKwkJZGFpX2RhdGEtPnBjbV9pcnFfcG9zICs9IGRhaV9kYXRhLT5wY21fY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChkYWlfZGF0YS0+c3Vic3RyZWFtKTsKKwl9IGVsc2UgeworCQkqbGVuID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQlwcl9lcnIoIklOIGRhdGEgbm90IGF2YWlsYWJsZVxuIik7CisJfQorCisJd2FrZV91cCgmZGFpX2RhdGEtPnF1ZXVlX3dhaXQpOworfQorCisvKiBDYXB0dXJlIHBhdGgqLworc3RhdGljIHZvaWQgaHBjbV9jb3B5X2NhcHR1cmVfZGF0YV90b19xdWV1ZShzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhLAorCQkJCQkgICAgdWludDMyX3QgbGVuKQoreworCXN0cnVjdCBocGNtX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisKKwlpZiAoZGFpX2RhdGEtPnN1YnN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBDb3B5IG91dCBidWZmZXIgcGFja2V0IGludG8gZnJlZV9xdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRhaV9kYXRhLT5mcmVlX3F1ZXVlKSkgeworCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmRhaV9kYXRhLT5mcmVlX3F1ZXVlLAorCQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7CisJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisJCWJ1Zl9ub2RlLT5mcmFtZS5sZW4gPSBsZW47CisJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCSAgICAgICAodWludDhfdCAqKWRhaV9kYXRhLT52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIsCisJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUubGVuKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZkYWlfZGF0YS0+ZmlsbGVkX3F1ZXVlKTsKKwkJZGFpX2RhdGEtPnBjbV9pcnFfcG9zICs9IGRhaV9kYXRhLT5wY21fY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChkYWlfZGF0YS0+c3Vic3RyZWFtKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCXByX2VycigiT1VUUFVUIGRhdGEgZHJvcHBlZFxuIik7CisJfQorCisJd2FrZV91cCgmZGFpX2RhdGEtPnF1ZXVlX3dhaXQpOworfQorCit2b2lkIGhwY21fbm90aWZ5X2V2dF9wcm9jZXNzaW5nKHVpbnQ4X3QgKmRhdGEsIGNoYXIgKnNlc3Npb24sCisJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IChzdHJ1Y3QgaHBjbV9kcnYgKilwcml2YXRlX2RhdGE7CisJc3RydWN0IHZzc19pdnBjbV9ldnRfbm90aWZ5X3YyX3QgKm5vdGlmeV9ldnQgPQorCQkJCShzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9ub3RpZnlfdjJfdCAqKWRhdGE7CisJc3RydWN0IHZzc19pdnBjbV9ldnRfcHVzaF9idWZmZXJfdjJfdCBwdXNoX2J1ZmZfZXZlbnQ7CisJc3RydWN0IHRhcF9wb2ludCAqdHAgPSBOVUxMOworCWludCBpbl9idWZfbGVuID0gMDsKKwlzdHJ1Y3QgdGFwcG50X214cl9kYXRhICp0bWQgPSBOVUxMOworCWNoYXIgKnNlc3NfbmFtZSA9IGhwY21fZ2V0X3Nlc3NfbmFtZShwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keCk7CisKKwkvKiBJZiBpdCdzIG5vdCBhIHRpbWV0aWNrLCBpdCdzIGEgZXJyb3Igbm90aWZpY2F0aW9uLCBkcm9wIHRoZSBldmVudCAqLworCWlmICgobm90aWZ5X2V2dC0+bm90aWZ5X21hc2sgJiBWU1NfSVZQQ01fTk9USUZZX01BU0tfVElNRVRJQ0spID09IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3Igbm90aWZpY2F0aW9uLiBtYXNrPSVkXG4iLCBfX2Z1bmNfXywKKwkJCW5vdGlmeV9ldnQtPm5vdGlmeV9tYXNrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChub3RpZnlfZXZ0LT50YXBfcG9pbnQgPT0gVlNTX0lWUENNX1RBUF9QT0lOVF9UWF9ERUZBVUxUKSB7CisJCXRwID0gJnBydGQtPnNlc3Npb25bcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHhdLnR4X3RhcF9wb2ludDsKKwkJdG1kID0gJnBydGQtPm1peGVyX2NvbmYudHg7CisJfSBlbHNlIGlmIChub3RpZnlfZXZ0LT50YXBfcG9pbnQgPT0gVlNTX0lWUENNX1RBUF9QT0lOVF9SWF9ERUZBVUxUKSB7CisJCXRwID0gJnBydGQtPnNlc3Npb25bcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHhdLnJ4X3RhcF9wb2ludDsKKwkJdG1kID0gJnBydGQtPm1peGVyX2NvbmYucng7CisJfQorCisJaWYgKHRwID09IE5VTEwgfHwgdG1kID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdHAgPSAlcEsgb3IgdG1kID0gJXBLIGlzIG51bGxcbiIsIF9fZnVuY19fLAorCQkgICAgICAgdHAsIHRtZCk7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChub3RpZnlfZXZ0LT5ub3RpZnlfbWFzayAmIFZTU19JVlBDTV9OT1RJRllfTUFTS19PVVRQVVRfQlVGRkVSKSB7CisJCWhwY21fY29weV9jYXB0dXJlX2RhdGFfdG9fcXVldWUoJnRwLT5jYXB0dXJlX2RhaV9kYXRhLAorCQkJCQkJbm90aWZ5X2V2dC0+ZmlsbGVkX291dF9zaXplKTsKKwl9CisKKwlpZiAobm90aWZ5X2V2dC0+bm90aWZ5X21hc2sgJiBWU1NfSVZQQ01fTk9USUZZX01BU0tfSU5QVVRfQlVGRkVSKSB7CisJCWhwY21fY29weV9wbGF5YmFja19kYXRhX2Zyb21fcXVldWUoJnRwLT5wbGF5YmFja19kYWlfZGF0YSwKKwkJCQkJCSAgICZpbl9idWZfbGVuKTsKKwl9CisKKwlzd2l0Y2ggKHRtZC0+ZGlyZWN0aW9uKSB7CisJLyoKKwkgKiBXaGVuIHRoZSBkaXIgaXMgT1VUX0lOLCBmb3IgdGhlIGZpcnN0IG5vdGlmeSBtYXNrLCBwdXNoYnVmIG1hc2sKKwkgKiBzaG91bGQgYmUgc2V0IHRvIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX09VVFBVVF9CVUZGRVIgc2luY2Ugd2UKKwkgKiBhdGxlYXN0IG5lZWQgb25lIGJ1ZmZlcidzIHdvcnRoIGRhdGEgYmVmb3JlIHdlIGNhbiBzZW5kIElOIGJ1ZmZlci4KKwkgKiBGb3IgdGhlIGNvbnNlY3V0aXZlIG5vdGlmeSBldnRzLCB0aGUgcHVzaCBidWYgbWFzayB3aWxsIHNldCBmb3IgYm90aAorCSAqIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX09VVFBVVF9CVUZGRVIgYW5kCisJICogVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfSU5fQlVGRkVSLgorCSAqLworCWNhc2UgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfT1VUX0lOOgorCQlpZiAobm90aWZ5X2V2dC0+bm90aWZ5X21hc2sgPT0KKwkJICAgIFZTU19JVlBDTV9OT1RJRllfTUFTS19USU1FVElDSykgeworCQkJcHVzaF9idWZmX2V2ZW50LnB1c2hfYnVmX21hc2sgPQorCQkJCVZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX09VVFBVVF9CVUZGRVI7CisJCX0gZWxzZSB7CisJCQlwdXNoX2J1ZmZfZXZlbnQucHVzaF9idWZfbWFzayA9CisJCQkgICBWU1NfSVZQQ01fUFVTSF9CVUZGRVJfTUFTS19PVVRQVVRfQlVGRkVSIHwKKwkJCSAgIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX0lOUFVUX0JVRkZFUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfSU46CisJCXB1c2hfYnVmZl9ldmVudC5wdXNoX2J1Zl9tYXNrID0KKwkJCVZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX0lOUFVUX0JVRkZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFZTU19JVlBDTV9UQVBfUE9JTlRfRElSX09VVDoKKwkJcHVzaF9idWZmX2V2ZW50LnB1c2hfYnVmX21hc2sgPQorCQkJIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX09VVFBVVF9CVUZGRVI7CisJCWJyZWFrOworCX0KKworCXB1c2hfYnVmZl9ldmVudC50YXBfcG9pbnQgPSBub3RpZnlfZXZ0LT50YXBfcG9pbnQ7CisJcHVzaF9idWZmX2V2ZW50Lm91dF9idWZfbWVtX2FkZHJlc3MgPQorCQkgICAgICB0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5wYWRkcjsKKwlwdXNoX2J1ZmZfZXZlbnQuaW5fYnVmX21lbV9hZGRyZXNzID0KKwkJICAgICAgdHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyOworCXB1c2hfYnVmZl9ldmVudC5zYW1wbGluZ19yYXRlID0gbm90aWZ5X2V2dC0+c2FtcGxpbmdfcmF0ZTsKKwlwdXNoX2J1ZmZfZXZlbnQubnVtX2luX2NoYW5uZWxzID0gMTsKKworCS8qCisJICogQURTUCBtdXN0IHJlYWQgYW5kIHdyaXRlIGZyb20gYSBjYWNoZSBhbGlnbmVkICgxMjggYnl0ZSkgbG9jYXRpb24sCisJICogYW5kIGluIGJsb2NrcyBvZiB0aGUgY2FjaGUgYWxpZ25tZW50IHNpemUuIFRoZSAxMjggYnl0ZSBjYWNoZQorCSAqIGFsaWdubWVudCByZXF1aXJlbWVudCBpcyBndWFyYW50ZWVkIGR1ZSB0byA0MDk2IGJ5dGUgbWVtb3J5CisJICogYWxpZ25tZW50IHJlcXVpcmVtZW50IGR1cmluZyBtZW1vcnkgYWxsb2NhdGlvbi9tYXBwaW5nLiBUaGUgb3V0cHV0CisJICogYnVmZmVyIChBRFNQIHdyaXRlKSBzaXplIG1hc2sgZW5zdXJlcyB0aGF0IGEgMTI4IGJ5dGUgbXVsdGlwbGUKKwkgKiB3b3J0aCBvZiB3aWxsIGJlIHdyaXR0ZW4uICBJbnRlcm5hbGx5LCB0aGUgaW5wdXQgYnVmZmVyIChBRFNQIHJlYWQpCisJICogc2l6ZSB3aWxsIGFsc28gYmUgYSBtdWx0aXBsZSBvZiAxMjggYnl0ZXMuICBIb3dldmVyIGl0IGlzIHRoZQorCSAqIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIG5vIG90aGVyIGRhdGEgaXMgd3JpdHRlbiBpbgorCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIG9mIG1lbW9yeS4KKwkgKi8KKwlwdXNoX2J1ZmZfZXZlbnQub3V0X2J1Zl9tZW1fc2l6ZSA9ICgobm90aWZ5X2V2dC0+cmVxdWVzdF9idWZfc2l6ZSkgKworCQkJCUNBQ0hFX0FMSUdOTUVOVF9TSVpFKSAmIENBQ0hFX0FMSUdOTUVOVF9NQVNLOworCXB1c2hfYnVmZl9ldmVudC5pbl9idWZfbWVtX3NpemUgPSBpbl9idWZfbGVuOworCisJdm9jX3NlbmRfY3ZwX3ZvY3BjbV9wdXNoX2J1Zl9ldnQodm9jX2dldF9zZXNzaW9uX2lkKHNlc3NfbmFtZSksCisJCQkJCSAmcHVzaF9idWZmX2V2ZW50KTsKK30KKworc3RhdGljIGludCBtc21faHBjbV9jb25maWd1cmVfdm9pY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCWludCB0YXBfcG9pbnQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MTZfdCBkaXJlY3Rpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl1aW50MTZfdCBzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKnRtZCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6IHRhcF9wb2ludCA9ICVkIGRpcmVjdGlvbiA9ICVkIHNhbXBsZV9yYXRlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgdGFwX3BvaW50LCBkaXJlY3Rpb24sIHNhbXBsZV9yYXRlKTsKKworCWlmICghaHBjbV9pc192YWxpZF9jb25maWcoVk9JQ0VfSU5ERVgsIHRhcF9wb2ludCwgZGlyZWN0aW9uLAorCQkJCSAgc2FtcGxlX3JhdGUpKSB7CisJCXByX2VycigiSW52YWxpZCB2cGNtIG1peGVyIGNvbnRyb2wgdm9pY2UgdmFsdWVzXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh0YXBfcG9pbnQgPT0gUlgpCisJCXRtZCA9ICZocGNtX2Rydi5taXhlcl9jb25mLnJ4OworCWVsc2UKKwkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYudHg7CisKKwl0bWQtPmVuYWJsZSA9IHRydWU7CisJdG1kLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJdG1kLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCWhwY21fZHJ2Lm1peGVyX2NvbmYuc2Vzc19pbmR4ID0gVk9JQ0VfSU5ERVg7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9ocGNtX2NvbmZpZ3VyZV92bW1vZGUxX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCWludCB0YXBfcG9pbnQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MTZfdCBkaXJlY3Rpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl1aW50MTZfdCBzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKnRtZCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6IHRhcF9wb2ludCA9ICVkIGRpcmVjdGlvbiA9ICVkIHNhbXBsZV9yYXRlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgdGFwX3BvaW50LCBkaXJlY3Rpb24sIHNhbXBsZV9yYXRlKTsKKworCWlmICghaHBjbV9pc192YWxpZF9jb25maWcoVk9NTU9ERTFfSU5ERVgsIHRhcF9wb2ludCwgZGlyZWN0aW9uLAorCQkJCSAgc2FtcGxlX3JhdGUpKSB7CisJCXByX2VycigiSW52YWxpZCB2cGNtIG1peGVyIGNvbnRyb2wgdm9pY2UgdmFsdWVzXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh0YXBfcG9pbnQgPT0gUlgpCisJCXRtZCA9ICZocGNtX2Rydi5taXhlcl9jb25mLnJ4OworCWVsc2UKKwkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYudHg7CisKKwl0bWQtPmVuYWJsZSA9IHRydWU7CisJdG1kLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJdG1kLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCWhwY21fZHJ2Lm1peGVyX2NvbmYuc2Vzc19pbmR4ID0gVk9NTU9ERTFfSU5ERVg7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9ocGNtX2NvbmZpZ3VyZV92bW1vZGUyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKworCWludCB0YXBfcG9pbnQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MTZfdCBkaXJlY3Rpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl1aW50MTZfdCBzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKnRtZCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6IHRhcF9wb2ludCA9ICVkIGRpcmVjdGlvbiA9ICVkIHNhbXBsZV9yYXRlID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgdGFwX3BvaW50LCBkaXJlY3Rpb24sIHNhbXBsZV9yYXRlKTsKKworCWlmICghaHBjbV9pc192YWxpZF9jb25maWcoVk9NTU9ERTJfSU5ERVgsIHRhcF9wb2ludCwgZGlyZWN0aW9uLAorCQkJCSAgc2FtcGxlX3JhdGUpKSB7CisJCXByX2VycigiSW52YWxpZCB2cGNtIG1peGVyIGNvbnRyb2wgdm9pY2UgdmFsdWVzXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh0YXBfcG9pbnQgPT0gUlgpCisJCXRtZCA9ICZocGNtX2Rydi5taXhlcl9jb25mLnJ4OworCWVsc2UKKwkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYudHg7CisKKwl0bWQtPmVuYWJsZSA9IHRydWU7CisJdG1kLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJdG1kLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCWhwY21fZHJ2Lm1peGVyX2NvbmYuc2Vzc19pbmR4ID0gVk9NTU9ERTJfSU5ERVg7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZocGNtX2Rydi5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9ocGNtX2NvbmZpZ3VyZV92b2x0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCisJaW50IHRhcF9wb2ludCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXVpbnQxNl90IGRpcmVjdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCXVpbnQxNl90IHNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07CisJc3RydWN0IHRhcHBudF9teHJfZGF0YSAqdG1kID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmhwY21fZHJ2LmxvY2spOworCXByX2RlYnVnKCIlczogdGFwX3BvaW50PSVkIGRpcmVjdGlvbj0lZCBzYW1wbGVfcmF0ZT0lZFxuIiwKKwkJIF9fZnVuY19fLCB0YXBfcG9pbnQsIGRpcmVjdGlvbiwgc2FtcGxlX3JhdGUpOworCisJaWYgKCFocGNtX2lzX3ZhbGlkX2NvbmZpZyhWT0xURV9JTkRFWCwgdGFwX3BvaW50LCBkaXJlY3Rpb24sCisJCQkJICBzYW1wbGVfcmF0ZSkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHZwY20gbWl4ZXIgY29udHJvbCB2b2x0ZSB2YWx1ZXNcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHRhcF9wb2ludCA9PSBSWCkKKwkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYucng7CisJZWxzZQorCQl0bWQgPSAmaHBjbV9kcnYubWl4ZXJfY29uZi50eDsKKworCXRtZC0+ZW5hYmxlID0gdHJ1ZTsKKwl0bWQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwl0bWQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisJaHBjbV9kcnYubWl4ZXJfY29uZi5zZXNzX2luZHggPSBWT0xURV9JTkRFWDsKKworZG9uZToKKwltdXRleF91bmxvY2soJmhwY21fZHJ2LmxvY2spOworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9ocGNtX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIkhQQ01fVm9pY2UgdGFwcG9pbnQgZGlyZWN0aW9uIHNhbXBsZXJhdGUiLAorCQkJICAgICBTTkRfU09DX05PUE0sIDAsIDE2MDAwLCAwLCAzLAorCQkJICAgICBOVUxMLCBtc21faHBjbV9jb25maWd1cmVfdm9pY2VfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSFBDTV9Wb0xURSB0YXBwb2ludCBkaXJlY3Rpb24gc2FtcGxlcmF0ZSIsCisJCQkgICAgIFNORF9TT0NfTk9QTSwgMCwgMTYwMDAsIDAsIDMsCisJCQkgICAgIE5VTEwsIG1zbV9ocGNtX2NvbmZpZ3VyZV92b2x0ZV9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJIUENNX1ZNTW9kZTEgdGFwcG9pbnQgZGlyZWN0aW9uIHNhbXBsZXJhdGUiLAorCQkJICAgICBTTkRfU09DX05PUE0sIDAsIDE2MDAwLCAwLCAzLAorCQkJICAgICBOVUxMLCBtc21faHBjbV9jb25maWd1cmVfdm1tb2RlMV9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJIUENNX1ZNTW9kZTIgdGFwcG9pbnQgZGlyZWN0aW9uIHNhbXBsZXJhdGUiLAorCQkJICAgICBTTkRfU09DX05PUE0sIDAsIDE2MDAwLCAwLCAzLAorCQkJICAgICBOVUxMLCBtc21faHBjbV9jb25maWd1cmVfdm1tb2RlMl9wdXQpLAorfTsKKworLyogU2FtcGxlIHJhdGVzIHN1cHBvcnRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7ODAwMCwgMTYwMDB9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAorCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKKwkubWFzayA9IDAsCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgaHBjbV9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZjsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZDsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKwlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgdGFwX3BvaW50ICp0cCA9IE5VTEw7CisJc3RydWN0IHRhcHBudF9teHJfZGF0YSAqdG1kID0gTlVMTDsKKwljaGFyICpzZXNzX25hbWUgPSBOVUxMOworCisJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKSB7CisJCXByX2Vycigic3Vic3RyZWFtIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXMsICVzXG4iLCBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc2Vzc19uYW1lID0gaHBjbV9nZXRfc2Vzc19uYW1lKHBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4KTsKKwlkYWlfZGF0YSA9IGhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXdha2VfdXAoJmRhaV9kYXRhLT5xdWV1ZV93YWl0KTsKKwltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKworCXRtZCA9IGhwY21fZ2V0X3RhcHBudF9taXhlcl9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwl0cCA9IGhwY21fZ2V0X3RhcHBvaW50X2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKKwkvKiBTZW5kIHN0b3AgY29tbWFuZCAqLworCXZvY19zZW5kX2N2cF9zdG9wX3ZvY3BjbSh2b2NfZ2V0X3Nlc3Npb25faWQoc2Vzc19uYW1lKSk7CisJLyogTWVtb3J5IHVubWFwL2ZyZWUgdGFrZXMgcGxhY2Ugb25seSB3aGVuIGNhbGxlZCB0aGUgZmlyc3QgdGltZSAqLworCWhwY21fdW5tYXBfYW5kX2ZyZWVfc2hhcmVkX21lbW9yeShwcnRkKTsKKwkvKiBVbnJlZ2lzdGVyIGhvc3QgUENNIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uICovCisJdm9jX2RlcmVnaXN0ZXJfaHBjbV9ldnRfY2IoKTsKKwkvKiBSZXNldCB0aGUgY2FjaGVkIHN0YXJ0IGNtZCAqLworCW1lbXNldCgmcHJ0ZC0+c3RhcnRfY21kLCAwLCBzaXplb2Yoc3RydWN0IHN0YXJ0X2NtZCkpOworCS8qIFJlbGVhc2UgYWxsIGJ1ZmZlciAqLworCXByX2RlYnVnKCIlczogUmVsZWFzZSBhbGwgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJc3Vic3RyZWFtID0gZGFpX2RhdGEtPnN1YnN0cmVhbTsKKwlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBzdWJzdHJlYW0gaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWRtYV9idWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCWlmIChkbWFfYnVmID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBkbWFfYnVmIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoZG1hX2J1Zi0+YXJlYSAhPSBOVUxMKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZkYWlfZGF0YS0+ZmlsbGVkX3F1ZXVlKSB7CisJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAorCQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7CisJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQl9CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZkYWlfZGF0YS0+ZnJlZV9xdWV1ZSkgeworCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJc3RydWN0IGhwY21fYnVmX25vZGUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCWRtYV9mcmVlX2NvaGVyZW50KHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4LCBkbWFfYnVmLT5hcmVhLAorCQkJZG1hX2J1Zi0+YWRkcik7CisJCWRtYV9idWYtPmFyZWEgPSBOVUxMOworCX0KKwlkYWlfZGF0YS0+c3Vic3RyZWFtID0gTlVMTDsKKwlkYWlfZGF0YS0+cGNtX2J1Zl9wb3MgPSAwOworCWRhaV9kYXRhLT5wY21fY291bnQgPSAwOworCWRhaV9kYXRhLT5wY21faXJxX3BvcyA9IDA7CisJZGFpX2RhdGEtPnBjbV9zaXplID0gMDsKKwlkYWlfZGF0YS0+c3RhdGUgPSBIUENNX0NMT1NFRDsKKwlocGNtX3Jlc2V0X21peGVyX2NvbmZpZyhwcnRkKTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKKwkJCQkgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsIHZvaWQgX191c2VyICpidWYsCisJCQkJIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaHBjbV9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBocGNtX2dldF9kYWlfZGF0YShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQpOworCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOworCisJaW50IGNvdW50ID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGZyYW1lcyk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRhaV9kYXRhLT5xdWV1ZV93YWl0LAorCQkJCSghbGlzdF9lbXB0eSgmZGFpX2RhdGEtPmZyZWVfcXVldWUpIHx8CisJCQkJZGFpX2RhdGEtPnN0YXRlID09IEhQQ01fU1RPUFBFRCksCisJCQkJMSAqIEhaKTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAoY291bnQgPD0gSFBDTV9NQVhfVk9DX1BLVF9TSVpFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQkJYnVmX25vZGUgPQorCQkJCWxpc3RfZmlyc3RfZW50cnkoJmRhaV9kYXRhLT5mcmVlX3F1ZXVlLAorCQkJCQkJc3RydWN0IGhwY21fYnVmX25vZGUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdCwgYnVmLAorCQkJCQkgICAgIGNvdW50KTsKKwkJCWJ1Zl9ub2RlLT5mcmFtZS5sZW4gPSBjb3VudDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmRhaV9kYXRhLT5maWxsZWRfcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogV3JpdGUgY250ICVkIGlzID4gSFBDTV9NQVhfVk9DX1BLVF9TSVpFXG4iLAorCQkJCV9fZnVuY19fLCBjb3VudCk7CisJCQlyZXQgPSAtRU5PTUVNOworCQl9CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBObyBmcmVlIFBsYXliYWNrIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHBsYXliYWNrIGNvcHkgIHdhcyBpbnRlcnJ1cHRlZFxuIiwgX19mdW5jX18pOworCX0KKworZG9uZToKKwlyZXR1cm4gIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NhcHR1cmVfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlpbnQgY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsCisJCQkJdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCWludCBjb3VudCA9IDA7CisJc3RydWN0IGhwY21fYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0gaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKworCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7CisJCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJY291bnQgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRhaV9kYXRhLT5xdWV1ZV93YWl0LAorCQkJCSghbGlzdF9lbXB0eSgmZGFpX2RhdGEtPmZpbGxlZF9xdWV1ZSkgfHwKKwkJCQlkYWlfZGF0YS0+c3RhdGUgPT0gSFBDTV9TVE9QUEVEKSwKKwkJCQkxICogSFopOworCisJaWYgKHJldCA+IDApIHsKKwkJaWYgKGNvdW50IDw9IEhQQ01fTUFYX1ZPQ19QS1RfU0laRSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmZGFpX2RhdGEtPmZpbGxlZF9xdWV1ZSwKKwkJCQkJc3RydWN0IGhwY21fYnVmX25vZGUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdCwKKwkJCQkJICAgYnVmX25vZGUtPmZyYW1lLmxlbik7CisJCQlpZiAocmV0KSB7CisJCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIHJldHVybmVkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmZGFpX2RhdGEtPmZyZWVfcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBSZWFkIGNvdW50ICVkID4gSFBDTV9NQVhfVk9DX1BLVF9TSVpFXG4iLAorCQkJCV9fZnVuY19fLCBjb3VudCk7CisJCQlyZXQgPSAtRU5PTUVNOworCQl9CisKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCXByX2VycigiJXM6IE5vIENhcHV0cmUgZGF0YSBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBSZWFkIHdhcyBpbnRlcnJ1cHRlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY2hhbm5lbCwKKwkJCXNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLAorCQkJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJldCA9IG1zbV9wY21fcGxheWJhY2tfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsCisJCQkJCSAgICBod29mZiwgYnVmLCBmcmFtZXMpOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3Vic3RyZWFtLCBjaGFubmVsLAorCQkJCQkgICBod29mZiwgYnVmLCBmcmFtZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG1zbV9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzbmRfcGNtX3VmcmFtZXNfdCByZXQ7CisKKwlkYWlfZGF0YSA9IGhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChkYWlfZGF0YS0+cGNtX2lycV9wb3MgPj0gZGFpX2RhdGEtPnBjbV9zaXplKQorCQlkYWlfZGF0YS0+cGNtX2lycV9wb3MgPSAwOworCisJcmV0ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChkYWlfZGF0YS0+cGNtX2lycV9wb3MpKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0KKwkJCWhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXByX2RlYnVnKCIlcywgJXNcbiIsIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RBUlRcbiIpOworCQlkYWlfZGF0YS0+c3RhdGUgPSBIUENNX1NUQVJURUQ7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7CisJCWRhaV9kYXRhLT5zdGF0ZSA9IEhQQ01fU1RPUFBFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgaHBjbV9kcnYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRhaV9kYXRhICpkYWlfZGF0YSA9IE5VTEw7CisJc3RydWN0IHRhcF9wb2ludCAqdHAgPSBOVUxMOworCisJcHJfZGVidWcoIiVzLCAlc1xuIiwgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisKKwlkYWlfZGF0YSA9IGhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWRhaV9kYXRhLT5wY21fc2l6ZSAgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlkYWlfZGF0YS0+cGNtX2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJZGFpX2RhdGEtPnBjbV9pcnFfcG9zID0gMDsKKwlkYWlfZGF0YS0+cGNtX2J1Zl9wb3MgPSAwOworCWRhaV9kYXRhLT5zdGF0ZSA9IEhQQ01fUFJFUEFSRUQ7CisKKwkvKiBSZWdpc3RlciBldmVudCBub3RpZnkgcHJvY2Vzc2luZyBjYWxsYmFjayBpbiBwcmVwYXJlIGluc3RlYWQgb2YKKwkgKiBpbml0KCkgYXMgcTZ2b2ljZSBtb2R1bGUncyBpbml0KCkgY2FuIGJlIGNhbGxlZCBhdCBhIGxhdGVyIHBvaW50CisJICovCisJdm9jX3JlZ2lzdGVyX2hwY21fZXZ0X2NiKGhwY21fbm90aWZ5X2V2dF9wcm9jZXNzaW5nLCAmaHBjbV9kcnYpOworCisJdHAgPSBocGNtX2dldF90YXBwb2ludF9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisJaWYgKHRwICE9IE5VTEwpIHsKKwkJcmV0ID0gaHBjbV9zdGFydF92b2NwY20oc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkLCB0cCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZXJyb3Igc2VuZGluZyBzdGFydCBjbWQgZXJyPSVkXG4iLCByZXQpOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlcyB0cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJfQorZG9uZToKKwltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwlzdHJ1Y3QgaHBjbV9kcnYgKnBydGQgPSAoc3RydWN0IGhwY21fZHJ2ICopcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOiAlc1xuIiwgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgbWFwIHZvaWNlIGhvc3QgUENNIGlvbiBidWZmZXIgKi8KKwlpZiAocHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF0uc2Vzc19wYWRkciA9PSAwKSB7CisJCXJldCA9IGhwY21fYWxsb2NhdGVfc2hhcmVkX21lbW9yeShwcnRkKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJlcnJvciBjcmVhdGluZyBzaGFyZWQgbWVtb3J5IGVycj0lZFxuIiwgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IGhwY21fbWFwX3ZvY3BjbV9tZW1vcnkocHJ0ZCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZXJyb3IgbWFwcGluZyBzaGFyZWQgbWVtb3J5IGVycj0lZFxuIiwgcmV0KTsKKwkJCWhwY21fZnJlZV9hbGxvY2F0ZWRfbWVtKHBydGQpOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzLCBWSFBDTSBtZW1vcnkgYWxsb2NhdGlvbi9tYXBwaW5nIG5vdCBwZXJmb3JtZWRcbiIKKwkJCSAsIF9fZnVuY19fKTsKKwl9CisKKwlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKKwlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJZG1hX2J1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LAorCQkJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCwKKwkJCSZkbWFfYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmICghZG1hX2J1Zi0+YXJlYSkgeworCQlwcl9lcnIoIiVzOk1TTSBkbWFfYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkbWFfYnVmLT5ieXRlcyA9IHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXg7CisJbWVtc2V0KGRtYV9idWYtPmFyZWEsIDAsIHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOworCisJaHBjbV9jcmVhdGVfZnJlZV9xdWV1ZShkbWFfYnVmLAorCQlocGNtX2dldF9kYWlfZGF0YShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQpKTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9ICZocGNtX2RydjsKKwlzdHJ1Y3QgdGFwcG50X214cl9kYXRhICp0bWQgPSBOVUxMOworCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCB0cF92YWwgPSAwOworCisJcHJfZGVidWcoIiVzLCAlc1xuIiwgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisKKwlkYWlfZGF0YSA9IGhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7CisKKwlpZiAoZGFpX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzLCBkYWlfZGF0YSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZTsKKworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgJmNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyk7CisJaWYgKHJldCA8IDApCisJCXByX2RlYnVnKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBmYWlsZWRcbiIpOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9kZWJ1Zygic25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIgZmFpbGVkXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXRwX3ZhbCA9IGdldF90YXBwbnRfdmFsdWUoc3Vic3RyZWFtLT5wY20tPmlkKTsKKwl0bWQgPSBocGNtX2dldF90YXBwbnRfbWl4ZXJfZGF0YShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQpOworCisJLyogQ2hlY2sgd2hlYXRoZXIgdGhlIGtjb250cm9sIHZhbHVlcyBzZXQgYXJlIHZhbGlkICovCisJaWYgKCF0bWQgfHwKKwkgICAgISh0bWQtPmVuYWJsZSkgfHwKKwkgICAgIWhwY21faXNfdmFsaWRfY29uZmlnKHBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4LAorCQkJCSAgdHBfdmFsLCB0bWQtPmRpcmVjdGlvbiwKKwkJCQkgIHRtZC0+c2FtcGxlX3JhdGUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkYWlfZGF0YS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0geworCS5vcGVuICAgICAgICAgICA9IG1zbV9wY21fb3BlbiwKKwkuaHdfcGFyYW1zICAgICAgPSBtc21fcGNtX2h3X3BhcmFtcywKKwkucHJlcGFyZSAgICAgICAgPSBtc21fcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgICAgICAgID0gbXNtX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyICAgICAgICA9IG1zbV9wY21fcG9pbnRlciwKKwkuY29weSAgICAgICAgICAgPSBtc21fcGNtX2NvcHksCisJLmNsb3NlICAgICAgICAgID0gbXNtX3BjbV9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21faHBjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV9ocGNtX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUobXNtX2hwY21fY29udHJvbHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXNtX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBtc21fYXNvY19wY21fbmV3LAorCS5wcm9iZQkJPSBtc21fcGNtX2hwY21fcHJvYmUsCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKworCXByX2luZm8oIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmbXNtX3NvY19wbGF0Zm9ybSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV92b2ljZV9ob3N0X3BjbV9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS12b2ljZS1ob3N0LXBjbSJ9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX3ZvaWNlX2hvc3RfcGNtX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXZvaWNlLWhvc3QtcGNtIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV92b2ljZV9ob3N0X3BjbV9kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1zbV9wY21fcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9wY21fcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBzZXNzaW9uICpzID0gTlVMTDsKKworCW1lbXNldCgmaHBjbV9kcnYsIDAsIHNpemVvZihocGNtX2RydikpOworCW11dGV4X2luaXQoJmhwY21fZHJ2LmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9TRVNTSU9OOyBpKyspIHsKKwkJcyA9ICZocGNtX2Rydi5zZXNzaW9uW2ldOworCQlzcGluX2xvY2tfaW5pdCgmcy0+cnhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEuZHNwX2xvY2spOworCQlzcGluX2xvY2tfaW5pdCgmcy0+cnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhLmRzcF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnMtPnR4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhLmRzcF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnMtPnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YS5kc3BfbG9jayk7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgKKwkJCSZzLT5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5xdWV1ZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgKKwkJCSZzLT5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEucXVldWVfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoCisJCQkmcy0+dHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEucXVldWVfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoCisJCQkmcy0+dHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhLnF1ZXVlX3dhaXQpOworCisJCUlOSVRfTElTVF9IRUFEKCZzLT5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5maWxsZWRfcXVldWUpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+cnhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEuZnJlZV9xdWV1ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEuZmlsbGVkX3F1ZXVlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnJ4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YS5mcmVlX3F1ZXVlKTsKKworCQlJTklUX0xJU1RfSEVBRCgmcy0+dHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEuZmlsbGVkX3F1ZXVlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnR4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhLmZyZWVfcXVldWUpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+dHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhLmZpbGxlZF9xdWV1ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT50eF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEuZnJlZV9xdWV1ZSk7CisJfQorCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXNtX3NvY19wbGF0Zm9ybV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1zbV9zb2NfcGxhdGZvcm1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDTSBtb2R1bGUgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1sb29wYmFjay12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tbG9vcGJhY2stdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTgwOWNlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tbG9vcGJhY2stdjIuYwpAQCAtMCwwICsxLDc5MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorCisjZGVmaW5lIExPT1BCQUNLX1ZPTF9NQVhfU1RFUFMgMHgyMDAwCisjZGVmaW5lIExPT1BCQUNLX1NFU1NJT05fTUFYIDQKKworc3RhdGljIERFRklORV9NVVRFWChsb29wYmFja19zZXNzaW9uX2xvY2spOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihsb29wYmFja19yeF92b2xfZ2FpbiwgMCwKKwkJCQlMT09QQkFDS19WT0xfTUFYX1NURVBTKTsKKworc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgeworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGxheWJhY2tfc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9zdWJzdHJlYW07CisKKwlpbnQgaW5zdGFuY2U7CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXVpbnQzMl90IHNhbXBfcmF0ZTsKKwl1aW50MzJfdCBjaGFubmVsX21vZGU7CisKKwlpbnQgcGxheWJhY2tfc3RhcnQ7CisJaW50IGNhcHR1cmVfc3RhcnQ7CisJaW50IHNlc3Npb25faWQ7CisJc3RydWN0IGF1ZGlvX2NsaWVudCAqYXVkaW9fY2xpZW50OworCXVpbnQzMl90IHZvbHVtZTsKK307CisKK3N0cnVjdCBmZV9kYWlfc2Vzc2lvbl9tYXAgeworCWNoYXIgc3RyZWFtX25hbWVbMzJdOworCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpsb29wYmFja19wcml2OworfTsKKworc3RhdGljIHN0cnVjdCBmZV9kYWlfc2Vzc2lvbl9tYXAgc2Vzc2lvbl9tYXBbTE9PUEJBQ0tfU0VTU0lPTl9NQVhdID0geworCXsge30sIE5VTEx9LAorCXsge30sIE5VTEx9LAorCXsge30sIE5VTEx9LAorCXsge30sIE5VTEx9LAorfTsKKworc3RhdGljIHUzMiBoZnBfdHhfbXV0ZTsKKworc3RhdGljIHZvaWQgc3RvcF9wY20oc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBjbSk7CitzdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfZ2V0X3Nlc3Npb24oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKipwY20pOworCitzdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRlX2V2ZW50X2hhbmRsZXIoZW51bSBtc21fcGNtX3JvdXRpbmdfZXZlbnQgZXZlbnQsCisJCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtID0gcHJpdl9kYXRhOworCisJV0FSTl9PTighcGNtKTsKKworCXByX2RlYnVnKCIlczogZXZlbnQgMHgleFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE1TTV9QQ01fUlRfRVZUX0RFVlNXSVRDSDoKKwkJcTZhc21fY21kKHBjbS0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOworCQlxNmFzbV9jbWQocGNtLT5hdWRpb19jbGllbnQsIENNRF9GTFVTSCk7CisJCXE2YXNtX3J1bihwY20tPmF1ZGlvX2NsaWVudCwgMCwgMCwgMCk7CisJCS8qIGZhbGx0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZGVmYXVsdCBldmVudCAweCV4XG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9wY21fbG9vcGJhY2tfZXZlbnRfaGFuZGxlcih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAorCQkJCQkgICB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOiB7CisJCXN3aXRjaCAocGF5bG9hZFswXSkgeworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogTm90IFN1cHBvcnRlZCBFdmVudCBvcGNvZGVbMHgleF1cbiIsCisJCQlfX2Z1bmNfXywgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9sb29wYmFja19zZXNzaW9uX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZnBfdHhfbXV0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fbG9vcGJhY2tfc2Vzc2lvbl9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwLCBuID0gMDsKKwlpbnQgbXV0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwY20gPSBOVUxMOworCisJaWYgKChtdXRlIDwgMCkgfHwgKG11dGUgPiAxKSkgeworCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXByX2RlYnVnKCIlczogbXV0ZT0lZFxuIiwgX19mdW5jX18sIG11dGUpOworCWhmcF90eF9tdXRlID0gbXV0ZTsKKwlmb3IgKG4gPSAwOyBuIDwgTE9PUEJBQ0tfU0VTU0lPTl9NQVg7IG4rKykgeworCQlpZiAoIXN0cmNtcChzZXNzaW9uX21hcFtuXS5zdHJlYW1fbmFtZSwgIk11bHRpTWVkaWE2IikpCisJCQlwY20gPSBzZXNzaW9uX21hcFtuXS5sb29wYmFja19wcml2OworCX0KKwlpZiAocGNtICYmIHBjbS0+YXVkaW9fY2xpZW50KSB7CisJCXJldCA9IHE2YXNtX3NldF9tdXRlKHBjbS0+YXVkaW9fY2xpZW50LCBtdXRlKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBTZW5kIG11dGUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX2xvb3BiYWNrX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkhGUCBUWCBNdXRlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAorCQkJbXNtX2xvb3BiYWNrX3Nlc3Npb25fbXV0ZV9nZXQsCisJCQltc21fbG9vcGJhY2tfc2Vzc2lvbl9tdXRlX3B1dCksCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fbG9vcGJhY2tfY29udHJvbHMsCisJCQkJICAgICAgQVJSQVlfU0laRShtc21fbG9vcGJhY2tfY29udHJvbHMpKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBwY21fbG9vcGJhY2tfc2V0X3ZvbHVtZShzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcHJ0ZCwKKwkJCQkgICB1aW50MzJfdCB2b2x1bWUpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXByX2RlYnVnKCIlczogU2V0dGluZyB2b2x1bWUgMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7CisKKwlpZiAocHJ0ZCAmJiBwcnRkLT5hdWRpb19jbGllbnQpIHsKKwkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgdm9sdW1lKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmMgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXBydGQtPnZvbHVtZSA9IHZvbHVtZTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfZ2V0X3Nlc3Npb24oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKipwY20pCit7CisJaW50IHJldCA9IDA7CisJaW50IG4sIGluZGV4ID0gLTE7CisKKwlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBzdHJlYW0gJXNcbiIsIF9fZnVuY19fLAorCQlydGQtPmRhaV9saW5rLT5zdHJlYW1fbmFtZSk7CisKKwltdXRleF9sb2NrKCZsb29wYmFja19zZXNzaW9uX2xvY2spOworCWZvciAobiA9IDA7IG4gPCBMT09QQkFDS19TRVNTSU9OX01BWDsgbisrKSB7CisJCWlmICghc3RyY21wKHJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLAorCQkgICAgc2Vzc2lvbl9tYXBbbl0uc3RyZWFtX25hbWUpKSB7CisJCQkqcGNtID0gc2Vzc2lvbl9tYXBbbl0ubG9vcGJhY2tfcHJpdjsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkvKgorCQkgKiBTdG9yZSB0aGUgbWluIGluZGV4IHZhbHVlIGZvciBhbGxvY2F0aW5nIGEgbmV3IHNlc3Npb24uCisJCSAqIEhlcmUsIGlmIHNlc3Npb24gc3RyZWFtIG5hbWUgaXMgbm90IGZvdW5kIGluIHRoZQorCQkgKiBleGlzdGluZyBlbnRyaWVzIGFmdGVyIHRoZSBsb29wIGl0ZXJhdGlvbiwgdGhlbiB0aGlzCisJCSAqIGluZGV4IHdpbGwgYmUgdXNlZCB0byBhbGxvY2F0ZSB0aGUgbmV3IHNlc3Npb24uCisJCSAqIFRoaXMgaW5kZXggdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIHRvcG1vc3QKKwkJICogYXZhaWxhYmxlIGZyZWUgc2Vzc2lvbi4KKwkJICovCisJCWlmICghKHNlc3Npb25fbWFwW25dLnN0cmVhbV9uYW1lWzBdKSAmJiAoaW5kZXggPCAwKSkKKwkJCWluZGV4ID0gbjsKKwl9CisKKwlpZiAoaW5kZXggPCAwKSB7CisJCWRldl9lcnIocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IE1heCBTZXNzaW9ucyBhbGxvY2F0ZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBleGl0OworCX0KKworCXNlc3Npb25fbWFwW2luZGV4XS5sb29wYmFja19wcml2ID0ga3phbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCBtc21fcGNtX2xvb3BiYWNrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXNzaW9uX21hcFtpbmRleF0ubG9vcGJhY2tfcHJpdikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RybGNweShzZXNzaW9uX21hcFtpbmRleF0uc3RyZWFtX25hbWUsCisJCXJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLAorCQlzaXplb2Yoc2Vzc2lvbl9tYXBbaW5kZXhdLnN0cmVhbV9uYW1lKSk7CisJZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogc3RyZWFtICVzIGluZGV4ICVkXG4iLAorCQlfX2Z1bmNfXywgc2Vzc2lvbl9tYXBbaW5kZXhdLnN0cmVhbV9uYW1lLCBpbmRleCk7CisKKwltdXRleF9pbml0KCZzZXNzaW9uX21hcFtpbmRleF0ubG9vcGJhY2tfcHJpdi0+bG9jayk7CisJKnBjbSA9IHNlc3Npb25fbWFwW2luZGV4XS5sb29wYmFja19wcml2OworZXhpdDoKKwltdXRleF91bmxvY2soJmxvb3BiYWNrX3Nlc3Npb25fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwY20gPSBOVUxMOworCWludCByZXQgPSAwOworCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2OworCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZXZ0IGV2ZW50OworCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90IGFzbV9tdG14X3N0cnRyX3dpbmRvdzsKKwl1aW50MzJfdCBwYXJhbV9pZDsKKworCXJldCA9ICBtc21fcGNtX2xvb3BiYWNrX2dldF9zZXNzaW9uKHJ0ZCwgJnBjbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJnBjbS0+bG9jayk7CisKKwlwY20tPnZvbHVtZSA9IDB4MjAwMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlwY20tPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXBjbS0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlwY20tPmluc3RhbmNlKys7CisJZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogcGNtIG91dCBvcGVuOiAlZCwlZFxuIiwgX19mdW5jX18sCisJCQlwY20tPmluc3RhbmNlLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKHBjbS0+aW5zdGFuY2UgPT0gMikgeworCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BjbV9yeCA9CisJCQkJcGNtLT5wbGF5YmFja19zdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wY21fdHggPQorCQkJCXBjbS0+Y2FwdHVyZV9zdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwkJaWYgKHBjbS0+YXVkaW9fY2xpZW50ICE9IE5VTEwpCisJCQlzdG9wX3BjbShwY20pOworCisJCXBjbS0+YXVkaW9fY2xpZW50ID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKAorCQkJCShhcHBfY2IpbXNtX3BjbV9sb29wYmFja19ldmVudF9oYW5kbGVyLCBwY20pOworCQlpZiAoIXBjbS0+YXVkaW9fY2xpZW50KSB7CisJCQlkZXZfZXJyKHJ0ZC0+cGxhdGZvcm0tPmRldiwKKwkJCQkiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXBjbS0+c2Vzc2lvbl9pZCA9IHBjbS0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOworCQlwY20tPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gZmFsc2U7CisJCXJldCA9IHE2YXNtX29wZW5fbG9vcGJhY2tfdjIocGNtLT5hdWRpb19jbGllbnQsCisJCQkJCSAgICAgYml0c19wZXJfc2FtcGxlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5wbGF0Zm9ybS0+ZGV2LAorCQkJCSIlczogcGNtIG91dCBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocGNtLT5hdWRpb19jbGllbnQpOworCQkJbXV0ZXhfdW5sb2NrKCZwY20tPmxvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZXZlbnQuZXZlbnRfZnVuYyA9IG1zbV9wY21fcm91dGVfZXZlbnRfaGFuZGxlcjsKKwkJZXZlbnQucHJpdl9kYXRhID0gKHZvaWQgKikgcGNtOworCQltc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oc29jX3BjbV90eC0+ZGFpX2xpbmstPmlkLAorCQkJcGNtLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSwKKwkJCXBjbS0+c2Vzc2lvbl9pZCwgcGNtLT5jYXB0dXJlX3N1YnN0cmVhbS0+c3RyZWFtKTsKKwkJbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtX3YyKHNvY19wY21fcngtPmRhaV9saW5rLT5pZCwKKwkJCXBjbS0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUsCisJCQlwY20tPnNlc3Npb25faWQsIHBjbS0+cGxheWJhY2tfc3Vic3RyZWFtLT5zdHJlYW0sCisJCQlldmVudCk7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCQlwY20tPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJCXJldCA9IHBjbV9sb29wYmFja19zZXRfdm9sdW1lKHBjbSwgcGNtLT52b2x1bWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJZGV2X2VycihydGQtPnBsYXRmb3JtLT5kZXYsCisJCQkJCSJFcnJvciAlZCBzZXR0aW5nIHZvbHVtZSIsIHJldCk7CisJCX0KKwkJLyogU2V0IHRvIGxhcmdlc3QgbmVnYXRpdmUgdmFsdWUgKi8KKwkJYXNtX210bXhfc3RydHJfd2luZG93LndpbmRvd19sc3cgPSAweDAwMDAwMDAwOworCQlhc21fbXRteF9zdHJ0cl93aW5kb3cud2luZG93X21zdyA9IDB4ODAwMDAwMDA7CisJCXBhcmFtX2lkID0gQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX1NUQVJUX1YyOworCQlxNmFzbV9zZW5kX210bXhfc3RydHJfd2luZG93KHBjbS0+YXVkaW9fY2xpZW50LAorCQkJCQkgICAgICZhc21fbXRteF9zdHJ0cl93aW5kb3csCisJCQkJCSAgICAgcGFyYW1faWQpOworCQkvKiBTZXQgdG8gbGFyZ2VzdCBwb3NpdGl2ZSB2YWx1ZSAqLworCQlhc21fbXRteF9zdHJ0cl93aW5kb3cud2luZG93X2xzdyA9IDB4ZmZmZmZmZmY7CisJCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbXN3ID0gMHg3ZmZmZmZmZjsKKwkJcGFyYW1faWQgPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9XSU5ET1dfRU5EX1YyOworCQlxNmFzbV9zZW5kX210bXhfc3RydHJfd2luZG93KHBjbS0+YXVkaW9fY2xpZW50LAorCQkJCQkgICAgICZhc21fbXRteF9zdHJ0cl93aW5kb3csCisJCQkJCSAgICAgcGFyYW1faWQpOworCX0KKwlkZXZfaW5mbyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogSW5zdGFuY2UgPSAlZCwgU3RyZWFtIElEID0gJXNcbiIsCisJCQlfX2Z1bmNfXywgcGNtLT5pbnN0YW5jZSwgc3Vic3RyZWFtLT5wY20tPmlkKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwY207CisKKwltdXRleF91bmxvY2soJnBjbS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcF9wY20oc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BjbV9yeDsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BjbV90eDsKKworCWlmIChwY20tPmF1ZGlvX2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm47CisJcTZhc21fY21kKHBjbS0+YXVkaW9fY2xpZW50LCBDTURfQ0xPU0UpOworCisJaWYgKHBjbS0+cGxheWJhY2tfc3Vic3RyZWFtICE9IE5VTEwpIHsKKwkJc29jX3BjbV9yeCA9IHBjbS0+cGxheWJhY2tfc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJCW1zbV9wY21fcm91dGluZ19kZXJlZ19waHlfc3RyZWFtKHNvY19wY21fcngtPmRhaV9saW5rLT5pZCwKKwkJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKwl9CisJaWYgKHBjbS0+Y2FwdHVyZV9zdWJzdHJlYW0gIT0gTlVMTCkgeworCQlzb2NfcGNtX3R4ID0gcGNtLT5jYXB0dXJlX3N1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCQltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShzb2NfcGNtX3R4LT5kYWlfbGluay0+aWQsCisJCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwl9CisJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocGNtLT5hdWRpb19jbGllbnQpOworCXBjbS0+YXVkaW9fY2xpZW50ID0gTlVMTDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWludCByZXQgPSAwLCBuOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJnBjbS0+bG9jayk7CisKKwlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBlbmQgcGNtIGNhbGw6JWRcbiIsCisJCV9fZnVuY19fLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXBjbS0+cGxheWJhY2tfc3RhcnQgPSAwOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcGNtLT5jYXB0dXJlX3N0YXJ0ID0gMDsKKworCXBjbS0+aW5zdGFuY2UtLTsKKwlpZiAoIXBjbS0+cGxheWJhY2tfc3RhcnQgfHwgIXBjbS0+Y2FwdHVyZV9zdGFydCkgeworCQlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBlbmQgcGNtIGNhbGxcbiIsIF9fZnVuY19fKTsKKwkJc3RvcF9wY20ocGNtKTsKKwl9CisKKwlpZiAoIXBjbS0+aW5zdGFuY2UpIHsKKwkJbXV0ZXhfbG9jaygmbG9vcGJhY2tfc2Vzc2lvbl9sb2NrKTsKKwkJZm9yIChuID0gMDsgbiA8IExPT1BCQUNLX1NFU1NJT05fTUFYOyBuKyspIHsKKwkJCWlmICghc3RyY21wKHJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLAorCQkJCQlzZXNzaW9uX21hcFtuXS5zdHJlYW1fbmFtZSkpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZvdW5kKSB7CisJCQltZW1zZXQoc2Vzc2lvbl9tYXBbbl0uc3RyZWFtX25hbWUsIDAsCisJCQkJc2l6ZW9mKHNlc3Npb25fbWFwW25dLnN0cmVhbV9uYW1lKSk7CisJCQltdXRleF91bmxvY2soJnBjbS0+bG9jayk7CisJCQltdXRleF9kZXN0cm95KCZzZXNzaW9uX21hcFtuXS5sb29wYmFja19wcml2LT5sb2NrKTsKKwkJCXNlc3Npb25fbWFwW25dLmxvb3BiYWNrX3ByaXYgPSBOVUxMOworCQkJa2ZyZWUocGNtKTsKKwkJCWRldl9kYmcocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IHN0cmVhbSBmcmVlZCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgcnRkLT5kYWlfbGluay0+c3RyZWFtX25hbWUpOworCQkJbXV0ZXhfdW5sb2NrKCZsb29wYmFja19zZXNzaW9uX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZsb29wYmFja19zZXNzaW9uX2xvY2spOworCX0KKwltdXRleF91bmxvY2soJnBjbS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwltdXRleF9sb2NrKCZwY20tPmxvY2spOworCisJZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogQVNNIGxvb3BiYWNrIHN0cmVhbTolZFxuIiwKKwkJX19mdW5jX18sIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlpZiAoIXBjbS0+cGxheWJhY2tfc3RhcnQpCisJCQlwY20tPnBsYXliYWNrX3N0YXJ0ID0gMTsKKwl9IGVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlpZiAoIXBjbS0+Y2FwdHVyZV9zdGFydCkKKwkJCXBjbS0+Y2FwdHVyZV9zdGFydCA9IDE7CisJfQorCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsCisJCQkiJXM6IHBsYXliYWNrX3N0YXJ0OiVkLGNhcHR1cmVfc3RhcnQ6JWRcbiIsIF9fZnVuY19fLAorCQkJcGNtLT5wbGF5YmFja19zdGFydCwgcGNtLT5jYXB0dXJlX3N0YXJ0KTsKKwkJaWYgKHBjbS0+cGxheWJhY2tfc3RhcnQgJiYgcGNtLT5jYXB0dXJlX3N0YXJ0KQorCQkJcTZhc21fcnVuX25vd2FpdChwY20tPmF1ZGlvX2NsaWVudCwgMCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwKKwkJCSIlczpQYXVzZS9TdG9wIC0gcGxheWJhY2tfc3RhcnQ6JWQsY2FwdHVyZV9zdGFydDolZFxuIiwKKwkJCV9fZnVuY19fLCBwY20tPnBsYXliYWNrX3N0YXJ0LCBwY20tPmNhcHR1cmVfc3RhcnQpOworCQlpZiAocGNtLT5wbGF5YmFja19zdGFydCAmJiBwY20tPmNhcHR1cmVfc3RhcnQpCisJCQlxNmFzbV9jbWRfbm93YWl0KHBjbS0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBkZWZhdWx0IGNtZCAlZFxuIiwgX19mdW5jX18sIGNtZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0geworCS5vcGVuICAgICAgICAgICA9IG1zbV9wY21fb3BlbiwKKwkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX2Nsb3NlLAorCS5wcmVwYXJlICAgICAgICA9IG1zbV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciAgICAgICAgPSBtc21fcGNtX3RyaWdnZXIsCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHZvbC0+cGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbTsKKwlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcHJ0ZDsKKwlpbnQgdm9sdW1lID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlwcl9kZWJ1ZygiJXM6IHZvbHVtZSA6IDB4JXhcbiIsIF9fZnVuY19fLCB2b2x1bWUpOworCWlmICgoIXN1YnN0cmVhbSkgfHwgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpKSB7CisJCXByX2VycigiJXMgc3Vic3RyZWFtIG9yIHJ1bnRpbWUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKCFwcnRkKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKwlyYyA9IHBjbV9sb29wYmFja19zZXRfdm9sdW1lKHBydGQsIHZvbHVtZSk7CisKK2V4aXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkJdm9sLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwcnRkOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCghc3Vic3RyZWFtKSB8fCAoIXN1YnN0cmVhbS0+cnVudGltZSkpIHsKKwkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gb3IgcnVudGltZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXBydGQpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJ0ZC0+dm9sdW1lOworCitleGl0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fcGNtX2FkZF92b2x1bWVfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY20tPnN0cmVhbXNbMF0ucGNtOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sdW1lX2luZm87CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcocnRkLT5kZXYsICIlcywgVm9sdW1lIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOworCXJldCA9IHNuZF9wY21fYWRkX3ZvbHVtZV9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCQkgICAgICBOVUxMLCAxLAorCQkJCSAgICAgIHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQkJCSAgICAgICZ2b2x1bWVfaW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJa2N0bCA9IHZvbHVtZV9pbmZvLT5rY3RsOworCWtjdGwtPnB1dCA9IG1zbV9wY21fdm9sdW1lX2N0bF9wdXQ7CisJa2N0bC0+Z2V0ID0gbXNtX3BjbV92b2x1bWVfY3RsX2dldDsKKwlrY3RsLT50bHYucCA9IGxvb3BiYWNrX3J4X3ZvbF9nYWluOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBhcHBfdHlwZTsKKwlpbnQgYWNkYl9kZXZfaWQ7CisJaW50IHNhbXBsZV9yYXRlID0gNDgwMDA7CisKKwlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgeworCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhcHBfdHlwZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWFjZGJfZGV2X2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdICE9IDApCisJCXNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07CisJcHJfZGVidWcoIiVzOiBhcHBfdHlwZS0gJWQgYWNkYl9kZXZfaWQtICVkIHNhbXBsZV9yYXRlLSAlZCBzZXNzaW9uX3R5cGUtICVkXG4iLAorCQlfX2Z1bmNfXywgYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1JYKTsKKwltc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIGFwcF90eXBlLAorCQkJYWNkYl9kZXZfaWQsIHNhbXBsZV9yYXRlLCBTRVNTSU9OX1RZUEVfUlgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldCA9IDA7CisJaW50IGFwcF90eXBlOworCWludCBhY2RiX2Rldl9pZDsKKwlpbnQgc2FtcGxlX3JhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgeworCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBTRVNTSU9OX1RZUEVfUlgsCisJCSZhcHBfdHlwZSwgJmFjZGJfZGV2X2lkLCAmc2FtcGxlX3JhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXBwX3R5cGU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhY2RiX2Rldl9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IHNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAorCQlfX2Z1bmNfXywgZmVfaWQsIFNFU1NJT05fVFlQRV9SWCwKKwkJYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgYXBwX3R5cGU7CisJaW50IGFjZGJfZGV2X2lkOworCWludCBzYW1wbGVfcmF0ZSA9IDQ4MDAwOworCisJcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdVxuIiwgX19mdW5jX18sIGZlX2lkKTsKKwlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogUmVjZWl2ZWQgb3V0IG9mIGJvdW5kcyBmZV9pZCAlbGx1XG4iLAorCQkJX19mdW5jX18sIGZlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlhY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQorCQlzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXByX2RlYnVnKCIlczogYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWQgc2Vzc2lvbl90eXBlLSAlZFxuIiwKKwkJX19mdW5jX18sIGFwcF90eXBlLCBhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUsIFNFU1NJT05fVFlQRV9UWCk7CisJbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBhcHBfdHlwZSwKKwkJCWFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1RYKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldCA9IDA7CisJaW50IGFwcF90eXBlOworCWludCBhY2RiX2Rldl9pZDsKKwlpbnQgc2FtcGxlX3JhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgeworCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBTRVNTSU9OX1RZUEVfVFgsCisJCSZhcHBfdHlwZSwgJmFjZGJfZGV2X2lkLCAmc2FtcGxlX3JhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXBwX3R5cGU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhY2RiX2Rldl9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IHNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAorCQlfX2Z1bmNfXywgZmVfaWQsIFNFU1NJT05fVFlQRV9UWCwKKwkJYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9hZGRfYXBwX3R5cGVfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY20tPnN0cmVhbXNbMF0ucGNtOworCXN0cnVjdCBzbmRfcGNtX3VzciAqYXBwX3R5cGVfaW5mbzsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCWNvbnN0IGNoYXIgKnBsYXliYWNrX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSI7CisJY29uc3QgY2hhciAqY2FwdHVyZV9taXhlcl9jdGxfbmFtZQk9ICJBdWRpbyBTdHJlYW0gQ2FwdHVyZSI7CisJY29uc3QgY2hhciAqZGV2aWNlTm8JCT0gIk5OIjsKKwljb25zdCBjaGFyICpzdWZmaXgJCT0gIkFwcCBUeXBlIENmZyI7CisJaW50IGN0bF9sZW4sIHJldCA9IDA7CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkgeworCQljdGxfbGVuID0gc3RybGVuKHBsYXliYWNrX21peGVyX2N0bF9uYW1lKSArIDEgKworCQkJCXN0cmxlbihkZXZpY2VObykgKyAxICsgc3RybGVuKHN1ZmZpeCkgKyAxOworCQlwcl9kZWJ1ZygiJXM6IFBsYXliYWNrIGFwcCB0eXBlIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSBzbmRfcGNtX2FkZF91c3JfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJCU5VTEwsIDEsIGN0bF9sZW4sIHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQkJCQkmYXBwX3R5cGVfaW5mbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJa2N0bCA9IGFwcF90eXBlX2luZm8tPmtjdGw7CisJCXNucHJpbnRmKGtjdGwtPmlkLm5hbWUsIGN0bF9sZW4sICIlcyAlZCAlcyIsCisJCQlwbGF5YmFja19taXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKKwkJa2N0bC0+cHV0ID0gbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX3B1dDsKKwkJa2N0bC0+Z2V0ID0gbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX2dldDsKKwl9CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCWN0bF9sZW4gPSBzdHJsZW4oY2FwdHVyZV9taXhlcl9jdGxfbmFtZSkgKyAxICsKKwkJCQlzdHJsZW4oZGV2aWNlTm8pICsgMSArIHN0cmxlbihzdWZmaXgpICsgMTsKKwkJcHJfZGVidWcoIiVzOiBDYXB0dXJlIGFwcCB0eXBlIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSBzbmRfcGNtX2FkZF91c3JfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkJCQkJTlVMTCwgMSwgY3RsX2xlbiwgcnRkLT5kYWlfbGluay0+aWQsCisJCQkJCSZhcHBfdHlwZV9pbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlrY3RsID0gYXBwX3R5cGVfaW5mby0+a2N0bDsKKwkJc25wcmludGYoa2N0bC0+aWQubmFtZSwgY3RsX2xlbiwgIiVzICVkICVzIiwKKwkJCWNhcHR1cmVfbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7CisJCWtjdGwtPnB1dCA9IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX3B1dDsKKwkJa2N0bC0+Z2V0ID0gbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfZ2V0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXQgPSBtc21fcGNtX2FkZF92b2x1bWVfY29udHJvbHMocnRkKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBwY20gYWRkIHZvbHVtZSBjb250cm9scyBmYWlsZWQ6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwlyZXQgPSBtc21fcGNtX2FkZF9hcHBfdHlwZV9jb250cm9scyhydGQpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IHBjbSBhZGQgYXBwIHR5cGUgY29udHJvbHMgZmFpbGVkOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXNvY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKKwlyZXQgPSBtc21fcGNtX2FkZF9jb250cm9scyhydGQpOworCWlmIChyZXQpCisJCWRldl9lcnIocnRkLT5kZXYsICIlcywga2N0bCBhZGQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0geworCS5vcHMgICAgICAgICAgICA9ICZtc21fcGNtX29wcywKKwkucGNtX25ldyAgICAgICAgPSBtc21fYXNvY19wY21fbmV3LAorCS5wcm9iZSAgICAgICAgICA9IG1zbV9wY21fbG9vcGJhY2tfcHJvYmUsCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogZGV2IG5hbWUgJXNcbiIsCisJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAorCQkJCSAgICZtc21fc29jX3BsYXRmb3JtKTsKK30KKworc3RhdGljIGludCBtc21fcGNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3BjbV9sb29wYmFja19kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tbG9vcGJhY2sifSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXBjbS1sb29wYmFjayIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fcGNtX2xvb3BiYWNrX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUENNIGxvb3BiYWNrIHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtbm9pcnEuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LW5vaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LW5vaXJxLmMKQEAgLTAsMCArMSw4NDUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcTZhdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgIm1zbS1wY20tcTYtdjIuaCIKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKKworI2RlZmluZSBQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMJMHgyMDAwCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1zbV9wY21fdm9sX2dhaW4sIDAsCisJCQlQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMpOworCitzdHJ1Y3Qgc25kX21zbSB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBzbmRfcGNtICpwY207Cit9OworCisjZGVmaW5lIENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIICA1MAorI2RlZmluZSBDTURfRU9TX1RJTUVPVVRfTVVMVElQTElFUiAgKEhaICogNTApCisKKyNkZWZpbmUgQVRSQUNFX0VORCgpIFwKKwl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogRVxuIikKKyNkZWZpbmUgQVRSQUNFX0JFR0lOKG5hbWUpIFwKKwl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogQnwlZHwlc1xuIiwgY3VycmVudC0+dGdpZCwgbmFtZSkKKyNkZWZpbmUgQVRSQUNFX0ZVTkMoKSBBVFJBQ0VfQkVHSU4oX19mdW5jX18pCisjZGVmaW5lIEFUUkFDRV9JTlQobmFtZSwgdmFsdWUpIFwKKwl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogQ3wlZHwlc3wlZFxuIiwgXAorCQkJY3VycmVudC0+dGdpZCwgbmFtZSwgKGludCkodmFsdWUpKQorCisjZGVmaW5lIFNJT19QTEFZQkFDS19NQVhfUEVSSU9EX1NJWkUgUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFCisjZGVmaW5lIFNJT19QTEFZQkFDS19NSU5fUEVSSU9EX1NJWkUgNDgKKyNkZWZpbmUgU0lPX1BMQVlCQUNLX01BWF9OVU1fUEVSSU9EUyA1MTIKKyNkZWZpbmUgU0lPX1BMQVlCQUNLX01JTl9OVU1fUEVSSU9EUyBQTEFZQkFDS19NSU5fTlVNX1BFUklPRFMKKyNkZWZpbmUgU0lPX1BMQVlCQUNLX01JTl9CWVRFUyAoU0lPX1BMQVlCQUNLX01JTl9OVU1fUEVSSU9EUyAqCVwKKwkJCQlTSU9fUExBWUJBQ0tfTUlOX1BFUklPRF9TSVpFKQorCisjZGVmaW5lIFNJT19QTEFZQkFDS19NQVhfQllURVMgKChTSU9fUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTKSAqCVwKKwkJCQkoU0lPX1BMQVlCQUNLX01BWF9QRVJJT0RfU0laRSkpCisKKyNkZWZpbmUgU0lPX0NBUFRVUkVfTUFYX1BFUklPRF9TSVpFIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFCisjZGVmaW5lIFNJT19DQVBUVVJFX01JTl9QRVJJT0RfU0laRSA0OAorI2RlZmluZSBTSU9fQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgNTEyCisjZGVmaW5lIFNJT19DQVBUVVJFX01JTl9OVU1fUEVSSU9EUyBDQVBUVVJFX01JTl9OVU1fUEVSSU9EUworCisjZGVmaW5lIFNJT19DQVBUVVJFX01JTl9CWVRFUyAoU0lPX0NBUFRVUkVfTUlOX05VTV9QRVJJT0RTICoJXAorCQkJICAgICAgIFNJT19DQVBUVVJFX01JTl9QRVJJT0RfU0laRSkKKworI2RlZmluZSBTSU9fQ0FQVFVSRV9NQVhfQllURVMgKFNJT19DQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqCVwKKwkJCQlTSU9fQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX3BsYXliYWNrID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpLAorCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgICAgMTkyMDAwLAorCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCisJLmNoYW5uZWxzX21heCA9ICAgICAgICAgOCwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBTSU9fUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICoKKwkJCQlTSU9fUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JU0lPX1BMQVlCQUNLX01JTl9QRVJJT0RfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heCA9ICAgICBTSU9fUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RzX21pbiA9ICAgICAgICAgIFNJT19QTEFZQkFDS19NSU5fTlVNX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gICAgICAgICAgU0lPX1BMQVlCQUNLX01BWF9OVU1fUEVSSU9EUywKKwkuZmlmb19zaXplID0gICAgICAgICAgICAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmVfY2FwdHVyZSA9IHsKKwkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCisJLmZvcm1hdHMgPSAgICAgICAgICAgICAgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFKSwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKKwkuY2hhbm5lbHNfbWF4ID0gICAgICAgICA0LAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIFNJT19DQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqCisJCQkJU0lPX0NBUFRVUkVfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JU0lPX0NBUFRVUkVfTUlOX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gICAgIFNJT19DQVBUVVJFX01BWF9QRVJJT0RfU0laRSwKKwkucGVyaW9kc19taW4gPSAgICAgICAgICBTSU9fQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gICAgICAgICAgU0lPX0NBUFRVUkVfTUFYX05VTV9QRVJJT0RTLAorCS5maWZvX3NpemUgPSAgICAgICAgICAgIDAsCit9OworCisvKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7CisJODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLAorCTg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDAKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCisJLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyB2b2lkIGV2ZW50X2hhbmRsZXIodWludDMyX3Qgb3Bjb2RlLAorCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpCit7CisJdWludDMyX3QgKnB0cm1lbSA9ICh1aW50MzJfdCAqKXBheWxvYWQ7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQVNNX0RBVEFfRVZFTlRfV0FURVJNQVJLOgorCQlwcl9kZWJ1ZygiJXM6IFdhdGVybWFyayBsZXZlbCA9IDB4JTA4eFxuIiwgX19mdW5jX18sICpwdHJtZW0pOworCQlicmVhazsKKwljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOgorCQlwcl9kZWJ1ZygiJXM6IFBheWxvYWQgPSBbMHgleF1zdGF0WzB4JXhdXG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKKwkJc3dpdGNoIChwYXlsb2FkWzBdKSB7CisJCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JVTl9WMjoKKwkJY2FzZSBBU01fU0VTU0lPTl9DTURfUEFVU0U6CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfRkxVU0g6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJOb3QgU3VwcG9ydGVkIEV2ZW50IG9wY29kZVsweCV4XVxuIiwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisJaW50IHJldCA9IDA7CisKKwlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpbyksIEdGUF9LRVJORUwpOworCisJaWYgKHBydGQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcnRkLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9wbGF5YmFjazsKKwllbHNlCisJCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKKwkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBmYWlsZWRcbiIpOworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlciBmYWlsZWRcbiIpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCVNJT19QTEFZQkFDS19NSU5fQllURVMsCisJCQlTSU9fUExBWUJBQ0tfTUFYX0JZVEVTKTsKKwkJaWYgKHJldCkgeworCQkJcHJfaW5mbygiJXM6IFAgYnVmZmVyIGJ5dGVzIG1pbm1heCBjb25zdHJhaW50IHJldCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJfQorCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCisJCQkgICBTSU9fQ0FQVFVSRV9NSU5fQllURVMsCisJCQkgICBTSU9fQ0FQVFVSRV9NQVhfQllURVMpOworCQlpZiAocmV0KSB7CisJCQlwcl9pbmZvKCIlczogQyBidWZmZXIgYnl0ZXMgbWlubWF4IGNvbnN0cmFpbnQgcmV0ICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQl9CisJfQorCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKKwkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQ29uc3RyYWludCBmb3IgcGVyaW9kIGJ5dGVzIHN0ZXAgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJfQorCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIDMyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvbnN0cmFpbnQgZm9yIGJ1ZmZlciBieXRlcyBzdGVwIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCX0KKwlwcnRkLT5hdWRpb19jbGllbnQgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCisJCQkJKGFwcF9jYilldmVudF9oYW5kbGVyLCBwcnRkKTsKKwlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlwcl9lcnIoIiVzOiBjbGllbnQgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXBydGQtPmRzcF9jbnQgPSAwOworCXBydGQtPnNldF9jaGFubmVsX21hcCA9IGZhbHNlOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisJcmV0dXJuIDA7CisKK2ZhaWxfY21kOgorCWtmcmVlKHBydGQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCisKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9wbGF0X2RhdGEgKnBkYXRhOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOworCXN0cnVjdCBzaGFyZWRfaW9fY29uZmlnIGNvbmZpZzsKKwl1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplOworCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKKwlpbnQgcmV0OworCWludCBkaXIgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPyBJTiA6IE9VVDsKKworCXBkYXRhID0gKHN0cnVjdCBtc21fcGxhdF9kYXRhICopCisJCWRldl9nZXRfZHJ2ZGF0YShzb2NfcHJ0ZC0+cGxhdGZvcm0tPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkYXRhIG5vdCBwb3B1bGF0ZWQgcmV0OiAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIG5lZWQgdG8gc2V0IExPV19MQVRFTkNZX1BDTV9NT0RFIGZvciBjYXB0dXJlIHNpbmNlCisJICogcHVzaCBtb2RlIGRvZXMgbm90IHN1cHBvcnQgVUxMCisJICovCisJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSAoZGlyID09IElOKSA/CisJCQkJCXBkYXRhLT5wZXJmX21vZGUgOgorCQkJCQlMT1dfTEFURU5DWV9QQ01fTU9ERTsKKworCS8qIHJhdGUgYW5kIGNoYW5uZWxzIGFyZSBzZW50IHRvIGF1ZGlvIGRyaXZlciAqLworCXBydGQtPnNhbXBfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJcHJ0ZC0+Y2hhbm5lbF9tb2RlID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJaWYgKHBydGQtPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChydW50aW1lLT5mb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJYml0c19wZXJfc2FtcGxlID0gMjQ7CisJCXNhbXBsZV93b3JkX3NpemUgPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQliaXRzX3Blcl9zYW1wbGUgPSAxNjsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDE2OworCQlicmVhazsKKwl9CisKKwljb25maWcuZm9ybWF0ID0gRk9STUFUX0xJTkVBUl9QQ007CisJY29uZmlnLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKwljb25maWcucmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJY29uZmlnLmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJY29uZmlnLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOworCWNvbmZpZy5idWZzeiA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvIHBhcmFtc19wZXJpb2RzKHBhcmFtcyk7CisJY29uZmlnLmJ1ZmNudCA9IHBhcmFtc19wZXJpb2RzKHBhcmFtcyk7CisKKwlyZXQgPSBxNmFzbV9vcGVuX3NoYXJlZF9pbyhwcnRkLT5hdWRpb19jbGllbnQsICZjb25maWcsIGRpcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBxNmFzbV9vcGVuX3dyaXRlX3NoYXJlZF9pbyBmYWlsZWQgcmV0OiAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBydGQtPnBjbV9zaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOworCXBydGQtPnBjbV9jb3VudCA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKwlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisKKwlidWYgPSBwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbZGlyXS5idWY7CisJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJZG1hX2J1Zi0+ZGV2LmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CisJZG1hX2J1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlkbWFfYnVmLT5hcmVhID0gYnVmLT5kYXRhOworCWRtYV9idWYtPmFkZHIgPSBidWYtPnBoeXM7CisJZG1hX2J1Zi0+Ynl0ZXMgPSBwcnRkLT5wY21fc2l6ZTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gSUQgJWQsIHBlcmYgJWRcbiIsIF9fZnVuY19fLAorCSAgICAgICBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24sCisJCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlKTsKKwlwcnRkLT5zZXNzaW9uX2lkID0gcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOworCisJcHJfZGVidWcoIm1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbSB3LyBpZCAlZFxuIiwKKwkJIHNvY19wcnRkLT5kYWlfbGluay0+aWQpOworCXJldCA9IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQkJCSAgICAgICBwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSwKKwkJCQkgICAgICAgcHJ0ZC0+c2Vzc2lvbl9pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBzdHJlYW0gcmVnIGZhaWxlZCByZXQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWF0b21pY19zZXQoJnBydGQtPm91dF9jb3VudCwgcnVudGltZS0+cGVyaW9kcyk7CisJcHJ0ZC0+ZW5hYmxlZCA9IDE7CisJcHJ0ZC0+Y21kX3BlbmRpbmcgPSAwOworCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZGlyID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8gMCA6IDE7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoIiVzOiAlcyBUcmlnZ2VyIHN0YXJ0XG4iLCBfX2Z1bmNfXywKKwkJCSBkaXIgPT0gMCA/ICJQIiA6ICJDIik7CisJCXJldCA9IHE2YXNtX3J1bihwcnRkLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiJXM6IFNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIsIF9fZnVuY19fKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOworCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOworCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfRkxVU0gpOworCQlidWYgPSBxNmFzbV9zaGFyZWRfaW9fYnVmKHBydGQtPmF1ZGlvX2NsaWVudCwgZGlyKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBzaGFyZWQgSU8gYnVmZmVyIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQoYnVmLT5kYXRhLCAwLCBidWYtPmFjdHVhbF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJcHJfZGVidWcoIiVzOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRVxuIiwgX19mdW5jX18pOworCQlyZXQgPSBxNmFzbV9jbWRfbm93YWl0KHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX1BBVVNFKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2lvY3RsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IGRpciA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/IDAgOiAxOworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1ZjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fSU9DVEwxX1JFU0VUOgorCQlwcl9kZWJ1ZygiJXM6ICVzIFNORFJWX1BDTV9JT0NUTDFfUkVTRVRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgZGlyID09IDAgPyAiUCIgOiAiQyIpOworCQlidWYgPSBxNmFzbV9zaGFyZWRfaW9fYnVmKHBydGQtPmF1ZGlvX2NsaWVudCwgZGlyKTsKKworCQlpZiAoYnVmICYmIGJ1Zi0+ZGF0YSkKKwkJCW1lbXNldChidWYtPmRhdGEsIDAsIGJ1Zi0+YWN0dWFsX3NpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc25kX3BjbV9saWJfaW9jdGwoc3Vic3RyZWFtLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwl1aW50MzJfdCByZWFkX2luZGV4LCB3YWxsX2Nsa19tc3csIHdhbGxfY2xrX2xzdzsKKwkvKnRoZXNlIGFyZSBvZmZzZXRzLCB1bmxpa2UgQVNvQydzIGZ1bGwgdmFsdWVzKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCBod19wdHI7CisJc25kX3BjbV9zZnJhbWVzX3QgcGVyaW9kX3NpemU7CisJaW50IHJldDsKKwlpbnQgcmV0cmllcyA9IDEwOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlwZXJpb2Rfc2l6ZSA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCisJZG8geworCQlyZXQgPSBxNmFzbV9nZXRfc2hhcmVkX3BvcyhwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJCSAgICZyZWFkX2luZGV4LCAmd2FsbF9jbGtfbXN3LAorCQkJCQkgICAmd2FsbF9jbGtfbHN3KTsKKwl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiAmJiAtLXJldHJpZXMpOworCisJaWYgKHJldCB8fCAhcGVyaW9kX3NpemUpIHsKKwkJcHJfZXJyKCJnZXRfc2hhcmVkX3BvcyBlcnJvciBvciB6ZXJvIHBlcmlvZCBzaXplXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaHdfcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkgcmVhZF9pbmRleCk7CisKKwlpZiAocnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgPT0gMCkgeworCQlwcl9kZWJ1ZygicHRyKCVzKTogYXBwbCgwKSwgaHcgPSAlbHUgcmVhZF9pbmRleCA9ICV1XG4iLAorCQkJIHBydGQtPnN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkJICJQIiA6ICJDIiwKKwkJCSBod19wdHIsIHJlYWRfaW5kZXgpOworCX0KKwlyZXR1cm4gKGh3X3B0ci9wZXJpb2Rfc2l6ZSkgKiBwZXJpb2Rfc2l6ZTsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAorCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqYXBkID0gYWMtPnBvcnQ7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7CisJaW50IGRpciA9IC0xOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IG1tYXAgYmVnaW5cbiIsIF9fZnVuY19fKTsKKwlwcnRkLT5tbWFwX2ZsYWcgPSAxOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWRpciA9IElOOworCWVsc2UKKwkJZGlyID0gT1VUOworCisJYWIgPSAmKGFwZFtkaXJdLmJ1ZlswXSk7CisKKwlyZXQgPSBtc21fYXVkaW9faW9uX21tYXAoYWIsIHZtYSk7CisKKwlpZiAocmV0KQorCQlwcnRkLT5tbWFwX2ZsYWcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcnRkIHx8ICFwcnRkLT5tbWFwX2ZsYWcpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJdWludDMyX3QgdGltZW91dDsKKwlpbnQgZGlyID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhYykgeworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCWRpciA9IElOOworCQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlkaXIgPSBPVVQ7CisKKwkJLyogZGV0ZXJtaW5lIHRpbWVvdXQgbGVuZ3RoICovCisJCWlmIChydW50aW1lLT5mcmFtZV9iaXRzID09IDAgfHwgcnVudGltZS0+cmF0ZSA9PSAwKSB7CisJCQl0aW1lb3V0ID0gQ01EX0VPU19NSU5fVElNRU9VVF9MRU5HVEg7CisJCX0gZWxzZSB7CisJCQl0aW1lb3V0ID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICoKKwkJCQkJQ01EX0VPU19USU1FT1VUX01VTFRJUExJRVIpIC8KKwkJCQkJKChydW50aW1lLT5mcmFtZV9iaXRzIC8gOCkgKgorCQkJCQkgcnVudGltZS0+cmF0ZSk7CisJCQlpZiAodGltZW91dCA8IENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIKQorCQkJCXRpbWVvdXQgPSBDTURfRU9TX01JTl9USU1FT1VUX0xFTkdUSDsKKwkJfQorCisJCXE2YXNtX2NtZChhYywgQ01EX0NMT1NFKTsKKworCQlyZXQgPSBxNmFzbV9zaGFyZWRfaW9fZnJlZShhYywgZGlyKTsKKworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY2xvc2UgcHVsbCBtb2RlLCByZXQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQl9CisJCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGFjKTsKKwl9CisJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKKwkJCQkJIGRpciA9PSBJTiA/CisJCQkJCSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLIDoKKwkJCQkJIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJa2ZyZWUocHJ0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9zZXRfdm9sdW1lKHN0cnVjdCBtc21fYXVkaW8gKnBydGQsIHVpbnQzMl90IHZvbHVtZSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHBydGQgJiYgcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2RlYnVnKCIlczogY2hhbm5lbHMgJWQgdm9sdW1lIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCXBydGQtPmNoYW5uZWxfbW9kZSwgdm9sdW1lKTsKKwkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgdm9sdW1lKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkJdm9sLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghc3Vic3RyZWFtLT5ydW50aW1lKSB7CisJCXByX2VycigiJXMgc3Vic3RyZWFtIHJ1bnRpbWUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKHBydGQpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJ0ZC0+dm9sdW1lOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV92b2x1bWUgKnZvbCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CisJCXZvbC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOworCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdm9sdW1lIDogMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7CisJaWYgKCFzdWJzdHJlYW0pIHsKKwkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgeworCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcnRkKSB7CisJCXJjID0gbXNtX3BjbV9zZXRfdm9sdW1lKHBydGQsIHZvbHVtZSk7CisJCXBydGQtPnZvbHVtZSA9IHZvbHVtZTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sdW1lX2luZm87CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKworCWRldl9kYmcocnRkLT5kZXYsICIlcywgVm9sdW1lIGNvbnRyb2wgYWRkXG4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gc25kX3BjbV9hZGRfdm9sdW1lX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJTlVMTCwgMSwgcnRkLT5kYWlfbGluay0+aWQsCisJCQkmdm9sdW1lX2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXMgdm9sdW1lIGNvbnRyb2wgZmFpbGVkIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWtjdGwgPSB2b2x1bWVfaW5mby0+a2N0bDsKKwlrY3RsLT5wdXQgPSBtc21fcGNtX3ZvbHVtZV9jdGxfcHV0OworCWtjdGwtPmdldCA9IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQ7CisJa2N0bC0+dGx2LnAgPSBtc21fcGNtX3ZvbF9nYWluOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2htYXBfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKKworCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKKwlzdWJzdHJlYW0gPSBzbmRfcGNtX2NobWFwX3N1YnN0cmVhbShpbmZvLCBpZHgpOworCWlmICghc3Vic3RyZWFtKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7CisKKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKHBydGQpIHsKKwkJcHJ0ZC0+c2V0X2NoYW5uZWxfbWFwID0gdHJ1ZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTDsgaSsrKQorCQkJCXBydGQtPmNoYW5uZWxfbWFwW2ldID0KKwkJCQkoY2hhcikodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NobWFwX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGk7CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisKKwlwcl9kZWJ1ZygiJXMiLCBfX2Z1bmNfXyk7CisJc3Vic3RyZWFtID0gc25kX3BjbV9jaG1hcF9zdWJzdHJlYW0oaW5mbywgaWR4KTsKKwlpZiAoIXN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWVtc2V0KHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlLCAwLAorCQlzaXplb2YodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUpKTsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7IC8qIG5vIGNoYW5uZWxzIHNldCAqLworCisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHBydGQgJiYgcHJ0ZC0+c2V0X2NoYW5uZWxfbWFwID09IHRydWUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9CisJCQkJCShpbnQpcHJ0ZC0+Y2hhbm5lbF9tYXBbaV07CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9hZGRfY2htYXBfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqY2htYXBfaW5mbzsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCWNoYXIgZGV2aWNlX251bVsxMl07CisJaW50IGksIHJldDsKKworCXByX2RlYnVnKCIlcywgQ2hhbm5lbCBtYXAgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gc25kX3BjbV9hZGRfY2htYXBfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJICAgICBzbmRfcGNtX3N0ZF9jaG1hcHMsCisJCQkJICAgICBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCwgMCwKKwkJCQkgICAgICZjaG1hcF9pbmZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJa2N0bCA9IGNobWFwX2luZm8tPmtjdGw7CisJZm9yIChpID0gMDsgaSA8IGtjdGwtPmNvdW50OyBpKyspCisJCWtjdGwtPnZkW2ldLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEU7CisJc25wcmludGYoZGV2aWNlX251bSwgc2l6ZW9mKGRldmljZV9udW0pLCAiJWQiLCBwY20tPmRldmljZSk7CisJc3RybGNhdChrY3RsLT5pZC5uYW1lLCBkZXZpY2VfbnVtLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCXByX2RlYnVnKCIlcywgT3ZlcndyaXRpbmcgY2hhbm5lbCBtYXAgY29udHJvbCBuYW1lIHRvOiAlcyIsCisJCV9fZnVuY19fLCBrY3RsLT5pZC5uYW1lKTsKKwlrY3RsLT5wdXQgPSBtc21fcGNtX2NobWFwX2N0bF9wdXQ7CisJa2N0bC0+Z2V0ID0gbXNtX3BjbV9jaG1hcF9jdGxfZ2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIiVzICwgcmVnaXN0ZXIgbmV3IGNvbnRyb2xcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJcmV0ID0gbXNtX3BjbV9hZGRfY2htYXBfY29udHJvbChydGQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlcyBmYWlsZWQgdG8gYWRkIGNobWFwIGNudGxzXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gbXNtX3BjbV9hZGRfdm9sdW1lX2NvbnRyb2wocnRkKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgcGNtIFZvbHVtZSBDb250cm9sICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfQorCXBjbS0+bm9uYXRvbWljID0gdHJ1ZTsKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0geworCS5vcGVuICAgICAgICAgICA9IG1zbV9wY21fb3BlbiwKKwkucHJlcGFyZSAgICAgICAgPSBtc21fcGNtX3ByZXBhcmUsCisJLmNvcHkgICAgICAgICAgID0gbXNtX3BjbV9jb3B5LAorCS5od19wYXJhbXMJPSBtc21fcGNtX2h3X3BhcmFtcywKKwkuaW9jdGwgICAgICAgICAgPSBtc21fcGNtX2lvY3RsLAorCS50cmlnZ2VyICAgICAgICA9IG1zbV9wY21fdHJpZ2dlciwKKwkucG9pbnRlciAgICAgICAgPSBtc21fcGNtX3BvaW50ZXIsCisJLm1tYXAgICAgICAgICAgID0gbXNtX3BjbV9tbWFwLAorCS5jbG9zZSAgICAgICAgICA9IG1zbV9wY21fY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXNtX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBtc21fYXNvY19wY21fbmV3LAorfTsKKworc3RhdGljIGludCBtc21fcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YTsKKwljb25zdCBjaGFyICpsYXRlbmN5X2xldmVsOworCWludCBwZXJmX21vZGUgPSBMT1dfTEFURU5DWV9QQ01fTU9ERTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIlB1bGwgbW9kZSBkcml2ZXIgcHJvYmVcbiIpOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICJxY29tLG1zbS1wY20tbG93LWxhdGVuY3kiKSkgeworCisJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkicWNvbSxsYXRlbmN5LWxldmVsIiwgJmxhdGVuY3lfbGV2ZWwpOworCQlpZiAoIXJjICYmICFzdHJjbXAobGF0ZW5jeV9sZXZlbCwgInVsdHJhIikpCisJCQlwZXJmX21vZGUgPSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERTsKKwl9CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJICAgICBzaXplb2Yoc3RydWN0IG1zbV9wbGF0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBkYXRhLT5wZXJmX21vZGUgPSBwZXJmX21vZGU7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgcGRhdGEpOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiBuYW1lICVzXG4iLAorCQkJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHVsbCBtb2RlIGRyaXZlciByZWdpc3RlclxuIik7CisJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCisJCQkJICAgICAgICZtc21fc29jX3BsYXRmb3JtKTsKKworCWlmIChyYykKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHB1bGwgbW9kZSBkcml2ZXJcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9wbGF0X2RhdGEgKnBkYXRhOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHVsbCBtb2RlIHJlbW92ZVxuIik7CisJcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwZGF0YSk7CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3BjbV9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tZHNwLW5vaXJxIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fcGNtX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9kcml2ZXJfbm9pcnEgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3BjbV9kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1zbV9wY21fcHJvYmUsCisJLnJlbW92ZSA9IG1zbV9wY21fcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXJfbm9pcnEpOworfQorbW9kdWxlX2luaXQobXNtX3NvY19wbGF0Zm9ybV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1zbV9zb2NfcGxhdGZvcm1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcl9ub2lycSk7Cit9Cittb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDTSBOT0lSUSBtb2R1bGUgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk5ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtdjIuYwpAQCAtMCwwICsxLDE1MTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvcTZhdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAibXNtLXBjbS1xNi12Mi5oIgorI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorCitlbnVtIHN0cmVhbV9zdGF0ZSB7CisJSURMRSA9IDAsCisJU1RPUFBFRCwKKwlSVU5OSU5HLAorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19sb2NrcyB0aGVfbG9ja3M7CisKKyNkZWZpbmUgUENNX01BU1RFUl9WT0xfTUFYX1NURVBTCTB4MjAwMAorc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihtc21fcGNtX3ZvbF9nYWluLCAwLAorCQkJUENNX01BU1RFUl9WT0xfTUFYX1NURVBTKTsKKworc3RydWN0IHNuZF9tc20geworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworfTsKKworI2RlZmluZSBDTURfRU9TX01JTl9USU1FT1VUX0xFTkdUSCAgNTAKKyNkZWZpbmUgQ01EX0VPU19USU1FT1VUX01VTFRJUExJRVIgIChIWiAqIDUwKQorI2RlZmluZSBNQVhfUEJfQ09QWV9SRVRSSUVTICAgICAgICAgMworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAorCS5yYXRlX21heCA9ICAgICAgICAgICAgIDM4NDAwMCwKKwkuY2hhbm5lbHNfbWluID0gICAgICAgICAxLAorCS5jaGFubmVsc19tYXggPSAgICAgICAgIDQsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSAgICAgQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgKgorCQkJCUNBUFRVUkVfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JQ0FQVFVSRV9NSU5fUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgICAgQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUsCisJLnBlcmlvZHNfbWluID0gICAgICAgICAgQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gICAgICAgICAgQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX3BsYXliYWNrID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKKwkuZm9ybWF0cyA9ICAgICAgICAgICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAorCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKKwkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKKwkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAorCS5yYXRlX21heCA9ICAgICAgICAgICAgIDM4NDAwMCwKKwkuY2hhbm5lbHNfbWluID0gICAgICAgICAxLAorCS5jaGFubmVsc19tYXggPSAgICAgICAgIDgsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSAgICAgUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICoKKwkJCQlQTEFZQkFDS19NQVhfUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19taW4gPQlQTEFZQkFDS19NSU5fUEVSSU9EX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgICAgUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFLAorCS5wZXJpb2RzX21pbiA9ICAgICAgICAgIFBMQVlCQUNLX01JTl9OVU1fUEVSSU9EUywKKwkucGVyaW9kc19tYXggPSAgICAgICAgICBQTEFZQkFDS19NQVhfTlVNX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKKy8qIENvbnZlbnRpb25hbCBhbmQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKKwk4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsCisJODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAorCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKKwkubWFzayA9IDAsCit9OworCitzdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRlX2V2ZW50X2hhbmRsZXIoZW51bSBtc21fcGNtX3JvdXRpbmdfZXZlbnQgZXZlbnQsCisJCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcHJpdl9kYXRhOworCisJV0FSTl9PTighcHJ0ZCk7CisKKwlwcl9kZWJ1ZygiJXM6IGV2ZW50ICV4XG4iLCBfX2Z1bmNfXywgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTVNNX1BDTV9SVF9FVlRfQlVGX1JFQ0ZHOgorCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOworCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfRkxVU0gpOworCQlxNmFzbV9ydW4ocHJ0ZC0+YXVkaW9fY2xpZW50LCAwLCAwLCAwKTsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X2hhbmRsZXIodWludDMyX3Qgb3Bjb2RlLAorCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHByaXY7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwcnRkLT5zdWJzdHJlYW07CisJdWludDMyX3QgKnB0cm1lbSA9ICh1aW50MzJfdCAqKXBheWxvYWQ7CisJdWludDMyX3QgaWR4ID0gMDsKKwl1aW50MzJfdCBzaXplID0gMDsKKwl1aW50OF90IGJ1Zl9pbmRleDsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyOiB7CisJCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyXG4iKTsKKwkJcHJfZGVidWcoIkJ1ZmZlciBDb25zdW1lZCA9IDB4JTA4eFxuIiwgKnB0cm1lbSk7CisJCXBydGQtPnBjbV9pcnFfcG9zICs9IHBydGQtPnBjbV9jb3VudDsKKwkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCWF0b21pY19pbmMoJnBydGQtPm91dF9jb3VudCk7CisJCXdha2VfdXAoJnRoZV9sb2Nrcy53cml0ZV93YWl0KTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQorCQkJYnJlYWs7CisJCWlmICghcHJ0ZC0+bW1hcF9mbGFnIHx8IHBydGQtPnJlc2V0X2V2ZW50KQorCQkJYnJlYWs7CisJCWlmIChxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhJTiwKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJJnNpemUsICZpZHgpKSB7CisJCQlwcl9kZWJ1ZygiJXM6d3JpdGluZyAlZCBieXRlcyBvZiBidWZmZXIgdG8gZHNwIDJcbiIsCisJCQkJCV9fZnVuY19fLCBwcnRkLT5wY21fY291bnQpOworCQkJcTZhc21fd3JpdGVfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQlwcnRkLT5wY21fY291bnQsIDAsIDAsIE5PX1RJTUVTVEFNUCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgorCQlwcl9kZWJ1ZygiQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TXG4iKTsKKwkJY2xlYXJfYml0KENNRF9FT1MsICZwcnRkLT5jbWRfcGVuZGluZyk7CisJCXdha2VfdXAoJnRoZV9sb2Nrcy5lb3Nfd2FpdCk7CisJCWJyZWFrOworCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOiB7CisJCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjJcbiIpOworCQlidWZfaW5kZXggPSBxNmFzbV9nZXRfYnVmX2luZGV4X2Zyb21fdG9rZW4odG9rZW4pOworCQlwcl9kZWJ1ZygiJXM6IHRva2VuPTB4JTA4eCBidWZfaW5kZXg9MHglMDh4XG4iLAorCQkJIF9fZnVuY19fLCB0b2tlbiwgYnVmX2luZGV4KTsKKwkJcHJ0ZC0+aW5fZnJhbWVfaW5mb1tidWZfaW5kZXhdLnNpemUgPSBwYXlsb2FkWzRdOworCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0ub2Zmc2V0ID0gcGF5bG9hZFs1XTsKKwkJLyogYXNzdW1lIGRhdGEgc2l6ZSA9IDAgZHVyaW5nIGZsdXNoaW5nICovCisJCWlmIChwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0uc2l6ZSkgeworCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0KKwkJCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0uc2l6ZTsKKwkJCXByX2RlYnVnKCJwY21faXJxX3Bvcz0lZFxuIiwgcHJ0ZC0+cGNtX2lycV9wb3MpOworCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpCisJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5pbl9jb3VudCkgPD0gcHJ0ZC0+cGVyaW9kcykKKwkJCQlhdG9taWNfaW5jKCZwcnRkLT5pbl9jb3VudCk7CisJCQl3YWtlX3VwKCZ0aGVfbG9ja3MucmVhZF93YWl0KTsKKwkJCWlmIChwcnRkLT5tbWFwX2ZsYWcgJiYKKwkJCSAgICBxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhPVVQsCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCSZzaXplLCAmaWR4KSAmJgorCQkJICAgIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0KKwkJCSAgICAgU05EUlZfUENNX1NUQVRFX1JVTk5JTkcpKQorCQkJCXE2YXNtX3JlYWRfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IHJlY2xhaW0gZmx1c2hlZCBidWYgaW5fY291bnQgJXhcbiIsCisJCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZwcnRkLT5pbl9jb3VudCkpOworCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NvdW50OworCQkJaWYgKHBydGQtPm1tYXBfZmxhZykgeworCQkJCWlmIChxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhPVVQsCisJCQkJICAgIHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQkgICAgJnNpemUsICZpZHgpICYmCisJCQkJICAgIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0KKwkJCQkgICAgU05EUlZfUENNX1NUQVRFX1JVTk5JTkcpKQorCQkJCQlxNmFzbV9yZWFkX25vbG9jayhwcnRkLT5hdWRpb19jbGllbnQpOworCQkJfSBlbHNlIHsKKwkJCQlhdG9taWNfaW5jKCZwcnRkLT5pbl9jb3VudCk7CisJCQl9CisJCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmluX2NvdW50KSA9PSBwcnRkLT5wZXJpb2RzKSB7CisJCQkJcHJfaW5mbygiJXM6IHJlY2xhaW1lZCBhbGwgYnVmc1xuIiwgX19mdW5jX18pOworCQkJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQorCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJCQkJd2FrZV91cCgmdGhlX2xvY2tzLnJlYWRfd2FpdCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVBSX0JBU0lDX1JTUF9SRVNVTFQ6IHsKKwkJc3dpdGNoIChwYXlsb2FkWzBdKSB7CisJCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JVTl9WMjoKKwkJCWlmIChzdWJzdHJlYW0tPnN0cmVhbQorCQkJCSE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocHJ0ZC0+bW1hcF9mbGFnKSB7CisJCQkJcHJfZGVidWcoIiVzOndyaXRpbmcgJWQgYnl0ZXMgb2YgYnVmZmVyIHRvIGRzcFxuIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCXBydGQtPnBjbV9jb3VudCk7CisJCQkJcTZhc21fd3JpdGVfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQkJcHJ0ZC0+cGNtX2NvdW50LAorCQkJCQkwLCAwLCBOT19USU1FU1RBTVApOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoYXRvbWljX3JlYWQoJnBydGQtPm91dF9uZWVkZWQpKSB7CisJCQkJCXByX2RlYnVnKCIlczp3cml0aW5nICVkIGJ5dGVzIG9mIGJ1ZmZlciB0byBkc3BcbiIsCisJCQkJCQlfX2Z1bmNfXywKKwkJCQkJCXBydGQtPnBjbV9jb3VudCk7CisJCQkJCXE2YXNtX3dyaXRlX25vbG9jayhwcnRkLT5hdWRpb19jbGllbnQsCisJCQkJCQlwcnRkLT5wY21fY291bnQsCisJCQkJCQkwLCAwLCBOT19USU1FU1RBTVApOworCQkJCQlhdG9taWNfZGVjKCZwcnRkLT5vdXRfbmVlZGVkKTsKKwkJCQkJd2FrZV91cCgmdGhlX2xvY2tzLndyaXRlX3dhaXQpOworCQkJCX07CisJCQl9CisJCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczpQYXlsb2FkID0gWzB4JXhdc3RhdFsweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVhazsKKwljYXNlIFJFU0VUX0VWRU5UUzoKKwkJcHJfZGVidWcoIiVzIFJFU0VUX0VWRU5UU1xuIiwgX19mdW5jX18pOworCQlwcnRkLT5wY21faXJxX3BvcyArPSBwcnRkLT5wY21fY291bnQ7CisJCWF0b21pY19pbmMoJnBydGQtPm91dF9jb3VudCk7CisJCWF0b21pY19pbmMoJnBydGQtPmluX2NvdW50KTsKKwkJcHJ0ZC0+cmVzZXRfZXZlbnQgPSB0cnVlOworCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwkJd2FrZV91cCgmdGhlX2xvY2tzLmVvc193YWl0KTsKKwkJd2FrZV91cCgmdGhlX2xvY2tzLndyaXRlX3dhaXQpOworCQl3YWtlX3VwKCZ0aGVfbG9ja3MucmVhZF93YWl0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIk5vdCBTdXBwb3J0ZWQgRXZlbnQgb3Bjb2RlWzB4JXhdXG4iLCBvcGNvZGUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGE7CisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXM7CisJaW50IHJldDsKKwl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7CisJdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZTsKKworCXBkYXRhID0gKHN0cnVjdCBtc21fcGxhdF9kYXRhICopCisJCWRldl9nZXRfZHJ2ZGF0YShzb2NfcHJ0ZC0+cGxhdGZvcm0tPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkYXRhIG5vdCBwb3B1bGF0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcHJ0ZCB8fCAhcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2VycigiJXM6IHByaXZhdGUgZGF0YSBudWxsIG9yIGF1ZGlvIGNsaWVudCBmcmVlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtcyA9ICZzb2NfcHJ0ZC0+ZHBjbVtzdWJzdHJlYW0tPnN0cmVhbV0uaHdfcGFyYW1zOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcHJ0ZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21faXJxX3BvcyA9IDA7CisJLyogcmF0ZSBhbmQgY2hhbm5lbHMgYXJlIHNlbnQgdG8gYXVkaW8gZHJpdmVyICovCisJcHJ0ZC0+c2FtcF9yYXRlID0gcnVudGltZS0+cmF0ZTsKKwlwcnRkLT5jaGFubmVsX21vZGUgPSBydW50aW1lLT5jaGFubmVsczsKKwlpZiAocHJ0ZC0+ZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSA9IHBkYXRhLT5wZXJmX21vZGU7CisJcHJfZGVidWcoIiVzOiBwZXJmOiAleFxuIiwgX19mdW5jX18sIHBkYXRhLT5wZXJmX21vZGUpOworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKKwkJYml0c19wZXJfc2FtcGxlID0gMjQ7CisJCXNhbXBsZV93b3JkX3NpemUgPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQliaXRzX3Blcl9zYW1wbGUgPSAxNjsKKwkJc2FtcGxlX3dvcmRfc2l6ZSA9IDE2OworCQlicmVhazsKKwl9CisKKwlyZXQgPSBxNmFzbV9vcGVuX3dyaXRlX3Y0KHBydGQtPmF1ZGlvX2NsaWVudCwKKwkJCQkgIEZPUk1BVF9MSU5FQVJfUENNLCBiaXRzX3Blcl9zYW1wbGUpOworCisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcTZhc21fb3Blbl93cml0ZV92MiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJcHJ0ZC0+YXVkaW9fY2xpZW50ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gcTZhc21fc2VuZF9jYWwocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZGVidWcoIiVzIDogU2VuZCBjYWwgZmFpbGVkIDogJWQiLCBfX2Z1bmNfXywgcmV0KTsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvbiBJRCAlZFxuIiwgX19mdW5jX18sCisJCQlwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24pOworCXBydGQtPnNlc3Npb25faWQgPSBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb247CisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSwKKwkJCXBydGQtPnNlc3Npb25faWQsIHN1YnN0cmVhbS0+c3RyZWFtKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHN0cmVhbSByZWcgZmFpbGVkIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NCgKKwkJCQlwcnRkLT5hdWRpb19jbGllbnQsIHJ1bnRpbWUtPnJhdGUsCisJCQkJcnVudGltZS0+Y2hhbm5lbHMsICFwcnRkLT5zZXRfY2hhbm5lbF9tYXAsCisJCQkJcHJ0ZC0+Y2hhbm5lbF9tYXAsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQlzYW1wbGVfd29yZF9zaXplLCBBU01fTElUVExFX0VORElBTiwKKwkJCQlERUZBVUxUX1FGKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygiJXM6IENNRCBGb3JtYXQgYmxvY2sgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlhdG9taWNfc2V0KCZwcnRkLT5vdXRfY291bnQsIHJ1bnRpbWUtPnBlcmlvZHMpOworCisJcHJ0ZC0+ZW5hYmxlZCA9IDE7CisJcHJ0ZC0+Y21kX3BlbmRpbmcgPSAwOworCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtczsKKwlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2V2dCBldmVudDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlID0gMTY7CisJdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZTsKKworCXBkYXRhID0gKHN0cnVjdCBtc21fcGxhdF9kYXRhICopCisJCWRldl9nZXRfZHJ2ZGF0YShzb2NfcHJ0ZC0+cGxhdGZvcm0tPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybSBkYXRhIG5vdCBwb3B1bGF0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcHJ0ZCB8fCAhcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2VycigiJXM6IHByaXZhdGUgZGF0YSBudWxsIG9yIGF1ZGlvIGNsaWVudCBmcmVlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBydGQtPmVuYWJsZWQgPT0gSURMRSkgeworCQlwcl9kZWJ1ZygiJXM6cGVyZl9tb2RlPSVkIHBlcmlvZHM9JWRcbiIsIF9fZnVuY19fLAorCQkJcGRhdGEtPnBlcmZfbW9kZSwgcnVudGltZS0+cGVyaW9kcyk7CisJCXBhcmFtcyA9ICZzb2NfcHJ0ZC0+ZHBjbVtzdWJzdHJlYW0tPnN0cmVhbV0uaHdfcGFyYW1zOworCQlpZiAoKHBhcmFtc19mb3JtYXQocGFyYW1zKSA9PSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSkgfHwKKwkJCShwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFKSkKKwkJCWJpdHNfcGVyX3NhbXBsZSA9IDI0OworCQllbHNlIGlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCisJCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKKworCQkvKiBVTEwgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIGNhcHR1cmUgcGF0aCAqLworCQlpZiAocGRhdGEtPnBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpCisJCQlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSA9IExFR0FDWV9QQ01fTU9ERTsKKwkJZWxzZQorCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSBMT1dfTEFURU5DWV9QQ01fTU9ERTsKKworCQlwcl9kZWJ1ZygiJXMgT3BlbmluZyAlZC1jaCBQQ00gcmVhZCBzdHJlYW0sIHBlcmZfbW9kZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyksCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUpOworCisJCXJldCA9IHE2YXNtX29wZW5fcmVhZF92NChwcnRkLT5hdWRpb19jbGllbnQsIEZPUk1BVF9MSU5FQVJfUENNLAorCQkJCWJpdHNfcGVyX3NhbXBsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBxNmFzbV9vcGVuX3JlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShwcnRkLT5hdWRpb19jbGllbnQpOworCQkJcHJ0ZC0+YXVkaW9fY2xpZW50ID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcmV0ID0gcTZhc21fc2VuZF9jYWwocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9kZWJ1ZygiJXMgOiBTZW5kIGNhbCBmYWlsZWQgOiAlZCIsIF9fZnVuY19fLCByZXQpOworCisJCXByX2RlYnVnKCIlczogc2Vzc2lvbiBJRCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uKTsKKwkJcHJ0ZC0+c2Vzc2lvbl9pZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbjsKKwkJZXZlbnQuZXZlbnRfZnVuYyA9IG1zbV9wY21fcm91dGVfZXZlbnRfaGFuZGxlcjsKKwkJZXZlbnQucHJpdl9kYXRhID0gKHZvaWQgKikgcHJ0ZDsKKwkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtX3YyKAorCQkJCXNvY19wcnRkLT5kYWlfbGluay0+aWQsCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUsCisJCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwgc3Vic3RyZWFtLT5zdHJlYW0sCisJCQkJZXZlbnQpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBzdHJlYW0gcmVnIGZhaWxlZCByZXQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXBydGQtPnBjbV9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOworCS8qIHJhdGUgYW5kIGNoYW5uZWxzIGFyZSBzZW50IHRvIGF1ZGlvIGRyaXZlciAqLworCXBydGQtPnNhbXBfcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7CisJcHJ0ZC0+Y2hhbm5lbF9tb2RlID0gcnVudGltZS0+Y2hhbm5lbHM7CisKKwlpZiAocHJ0ZC0+ZW5hYmxlZCA9PSBJRExFIHx8IHBydGQtPmVuYWJsZWQgPT0gU1RPUFBFRCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcnVudGltZS0+cGVyaW9kczsgaSsrKQorCQkJcTZhc21fcmVhZChwcnRkLT5hdWRpb19jbGllbnQpOworCQlwcnRkLT5wZXJpb2RzID0gcnVudGltZS0+cGVyaW9kczsKKwl9CisKKwlpZiAocHJ0ZC0+ZW5hYmxlZCAhPSBJRExFKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocnVudGltZS0+Zm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJYml0c19wZXJfc2FtcGxlID0gMzI7CisJCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJYml0c19wZXJfc2FtcGxlID0gMjQ7CisJCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6CisJCWJpdHNfcGVyX3NhbXBsZSA9IDI0OworCQlzYW1wbGVfd29yZF9zaXplID0gMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJZGVmYXVsdDoKKwkJYml0c19wZXJfc2FtcGxlID0gMTY7CisJCXNhbXBsZV93b3JkX3NpemUgPSAxNjsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiBTYW1wX3JhdGUgPSAlZCBDaGFubmVsID0gJWQgYml0IHdpZHRoID0gJWQsIHdvcmQgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBydGQtPnNhbXBfcmF0ZSwgcHJ0ZC0+Y2hhbm5lbF9tb2RlLAorCQkJYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKKwlyZXQgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjQocHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJCQkJICAgICAgcHJ0ZC0+c2FtcF9yYXRlLAorCQkJCQkJICAgICAgcHJ0ZC0+Y2hhbm5lbF9tb2RlLAorCQkJCQkJICAgICAgYml0c19wZXJfc2FtcGxlLAorCQkJCQkJICAgICAgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJCSAgICAgIEFTTV9MSVRUTEVfRU5ESUFOLAorCQkJCQkJICAgICAgREVGQVVMVF9RRik7CisJaWYgKHJldCA8IDApCisJCXByX2RlYnVnKCIlczogY21kIGNmZyBwY20gd2FzIGJsb2NrIGZhaWxlZCIsIF9fZnVuY19fKTsKKworCXBydGQtPmVuYWJsZWQgPSBSVU5OSU5HOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoIiVzOiBUcmlnZ2VyIHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHE2YXNtX3J1bl9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCAwLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7CisJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAwKTsKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJCXBydGQtPmVuYWJsZWQgPSBTVE9QUEVEOworCQkJcmV0ID0gcTZhc21fY21kX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9QQVVTRSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBwZW5kaW5nIENNRF9FT1MgaXNuJ3QgZXhwZWN0ZWQgKi8KKwkJV0FSTl9PTl9PTkNFKHRlc3RfYml0KENNRF9FT1MsICZwcnRkLT5jbWRfcGVuZGluZykpOworCQlzZXRfYml0KENNRF9FT1MsICZwcnRkLT5jbWRfcGVuZGluZyk7CisJCXJldCA9IHE2YXNtX2NtZF9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfRU9TKTsKKwkJaWYgKHJldCkKKwkJCWNsZWFyX2JpdChDTURfRU9TLCAmcHJ0ZC0+Y21kX3BlbmRpbmcpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfUEFVU0VcbiIpOworCQlyZXQgPSBxNmFzbV9jbWRfbm93YWl0KHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX1BBVVNFKTsKKwkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisJaW50IHJldCA9IDA7CisKKwlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpbyksIEdGUF9LRVJORUwpOworCWlmIChwcnRkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJ0ZC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCXBydGQtPmF1ZGlvX2NsaWVudCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygKKwkJCQkoYXBwX2NiKWV2ZW50X2hhbmRsZXIsIHBydGQpOworCWlmICghcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2luZm8oIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKHBydGQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcnRkLT5hdWRpb19jbGllbnQtPmRldiA9IHNvY19wcnRkLT5wbGF0Zm9ybS0+ZGV2OworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9wbGF5YmFjazsKKworCS8qIENhcHR1cmUgcGF0aCAqLworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlX2NhcHR1cmU7CisJZWxzZSB7CisJCXByX2VycigiSW52YWxpZCBTdHJlYW0gdHlwZSAlZFxuIiwgc3Vic3RyZWFtLT5zdHJlYW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAorCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSZjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMpOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBmYWlsZWRcbiIpOworCS8qIEVuc3VyZSB0aGF0IGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgcGVyaW9kIHNpemUgKi8KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlciBmYWlsZWRcbiIpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCVBMQVlCQUNLX01JTl9OVU1fUEVSSU9EUyAqIFBMQVlCQUNLX01JTl9QRVJJT0RfU0laRSwKKwkJCVBMQVlCQUNLX01BWF9OVU1fUEVSSU9EUyAqIFBMQVlCQUNLX01BWF9QRVJJT0RfU0laRSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoImNvbnN0cmFpbnQgZm9yIGJ1ZmZlciBieXRlcyBtaW4gbWF4IHJldCA9ICVkXG4iLAorCQkJCQkJCQkJcmV0KTsKKwkJfQorCX0KKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCUNBUFRVUkVfTUlOX05VTV9QRVJJT0RTICogQ0FQVFVSRV9NSU5fUEVSSU9EX1NJWkUsCisJCQlDQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiY29uc3RyYWludCBmb3IgYnVmZmVyIGJ5dGVzIG1pbiBtYXggcmV0ID0gJWRcbiIsCisJCQkJCQkJCQlyZXQpOworCQl9CisJfQorCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsIDMyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoImNvbnN0cmFpbnQgZm9yIHBlcmlvZCBieXRlcyBzdGVwIHJldCA9ICVkXG4iLAorCQkJCQkJCQlyZXQpOworCX0KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAzMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgc3RlcCByZXQgPSAlZFxuIiwKKwkJCQkJCQkJcmV0KTsKKwl9CisKKwlwcnRkLT5lbmFibGVkID0gSURMRTsKKwlwcnRkLT5kc3BfY250ID0gMDsKKwlwcnRkLT5zZXRfY2hhbm5lbF9tYXAgPSBmYWxzZTsKKwlwcnRkLT5yZXNldF9ldmVudCA9IGZhbHNlOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAorCXNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCit7CisJaW50IHJldCA9IDA7CisJaW50IGZieXRlcyA9IDA7CisJaW50IHhmZXIgPSAwOworCWNoYXIgKmJ1ZnB0ciA9IE5VTEw7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJdWludDMyX3QgaWR4ID0gMDsKKwl1aW50MzJfdCBzaXplID0gMDsKKwl1aW50MzJfdCByZXRyaWVzID0gMDsKKworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWZieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOworCXByX2RlYnVnKCIlczogcHJ0ZC0+b3V0X2NvdW50ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZwcnRkLT5vdXRfY291bnQpKTsKKworCXdoaWxlICgoZmJ5dGVzID4gMCkgJiYgKHJldHJpZXMgPCBNQVhfUEJfQ09QWV9SRVRSSUVTKSkgeworCQlpZiAocHJ0ZC0+cmVzZXRfZXZlbnQpIHsKKwkJCXByX2VycigiJXM6IEluIFNTUiByZXR1cm4gRU5FVFJFU0VUIGJlZm9yZSB3YWl0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5FVFJFU0VUOworCQl9CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoZV9sb2Nrcy53cml0ZV93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmcHJ0ZC0+b3V0X2NvdW50KSksIDUgKiBIWik7CisJCWlmICghcmV0KSB7CisJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50X3RpbWVvdXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJZ290byBmYWlsOworCQl9CisJCXJldCA9IDA7CisKKwkJaWYgKHBydGQtPnJlc2V0X2V2ZW50KSB7CisJCQlwcl9lcnIoIiVzOiBJbiBTU1IgcmV0dXJuIEVORVRSRVNFVCBhZnRlciB3YWl0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5FVFJFU0VUOworCQl9CisKKwkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+b3V0X2NvdW50KSkgeworCQkJcHJfZXJyKCIlczogcGNtIHN0b3BwZWQgb3V0X2NvdW50IDBcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZGF0YSA9IHE2YXNtX2lzX2NwdV9idWZfYXZhaWwoSU4sIHBydGQtPmF1ZGlvX2NsaWVudCwgJnNpemUsCisJCQkmaWR4KTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkgeworCQkJcmV0cmllcysrOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlyZXRyaWVzID0gMDsKKwkJfQorCisJCWlmIChmYnl0ZXMgPiBzaXplKQorCQkJeGZlciA9IHNpemU7CisJCWVsc2UKKwkJCXhmZXIgPSBmYnl0ZXM7CisKKwkJYnVmcHRyID0gZGF0YTsKKwkJaWYgKGJ1ZnB0cikgeworCQkJcHJfZGVidWcoIiVzOmZieXRlcyA9JWQ6IHhmZXI9JWQgc2l6ZT0lZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBmYnl0ZXMsIHhmZXIsIHNpemUpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZnB0ciwgYnVmLCB4ZmVyKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKElOLCBwcnRkLT5hdWRpb19jbGllbnQpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWJ1ZiArPSB4ZmVyOworCQkJZmJ5dGVzIC09IHhmZXI7CisJCQlwcl9kZWJ1ZygiJXM6ZmJ5dGVzID0gJWQ6IHhmZXI9JWRcbiIsIF9fZnVuY19fLCBmYnl0ZXMsCisJCQkJeGZlcik7CisJCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgeworCQkJCXByX2RlYnVnKCIlczp3cml0aW5nICVkIGJ5dGVzIG9mIGJ1ZmZlciB0byBkc3BcbiIsCisJCQkJCQlfX2Z1bmNfXywgeGZlcik7CisJCQkJcmV0ID0gcTZhc21fd3JpdGUocHJ0ZC0+YXVkaW9fY2xpZW50LCB4ZmVyLAorCQkJCQkJCTAsIDAsIE5PX1RJTUVTVEFNUCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKElOLAorCQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJCQkJZ290byBmYWlsOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWF0b21pY19pbmMoJnBydGQtPm91dF9uZWVkZWQpOworCQkJYXRvbWljX2RlYygmcHJ0ZC0+b3V0X2NvdW50KTsKKwkJfQorCX0KK2ZhaWw6CisJaWYgKHJldHJpZXMgPj0gTUFYX1BCX0NPUFlfUkVUUklFUykKKwkJcmV0ID0gLUVOT01FTTsKKworCXJldHVybiAgcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IHRpbWVvdXQ7CisJaW50IGRpciA9IDA7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGNtZF9wZW5kaW5nIDB4JWx4XG4iLCBfX2Z1bmNfXywgcHJ0ZC0+Y21kX3BlbmRpbmcpOworCisJaWYgKHBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlkaXIgPSBJTjsKKworCQkvKiBkZXRlcm1pbmUgdGltZW91dCBsZW5ndGggKi8KKwkJaWYgKHJ1bnRpbWUtPmZyYW1lX2JpdHMgPT0gMCB8fCBydW50aW1lLT5yYXRlID09IDApIHsKKwkJCXRpbWVvdXQgPSBDTURfRU9TX01JTl9USU1FT1VUX0xFTkdUSDsKKwkJfSBlbHNlIHsKKwkJCXRpbWVvdXQgPSAocnVudGltZS0+cGVyaW9kX3NpemUgKgorCQkJCQlDTURfRU9TX1RJTUVPVVRfTVVMVElQTElFUikgLworCQkJCQkoKHJ1bnRpbWUtPmZyYW1lX2JpdHMgLyA4KSAqCisJCQkJCSBydW50aW1lLT5yYXRlKTsKKwkJCWlmICh0aW1lb3V0IDwgQ01EX0VPU19NSU5fVElNRU9VVF9MRU5HVEgpCisJCQkJdGltZW91dCA9IENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIOworCQl9CisJCXByX2RlYnVnKCIlczogQ01EX0VPUyB0aW1lb3V0IGlzICVkXG4iLCBfX2Z1bmNfXywgdGltZW91dCk7CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoZV9sb2Nrcy5lb3Nfd2FpdCwKKwkJCQkJICF0ZXN0X2JpdChDTURfRU9TLCAmcHJ0ZC0+Y21kX3BlbmRpbmcpLAorCQkJCQkgdGltZW91dCk7CisJCWlmICghcmV0KQorCQkJcHJfZXJyKCIlczogQ01EX0VPUyBmYWlsZWQsIGNtZF9wZW5kaW5nIDB4JWx4XG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwcnRkLT5jbWRfcGVuZGluZyk7CisJCXE2YXNtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9DTE9TRSk7CisJCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwKKwkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwl9CisJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKKwkJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCWtmcmVlKHBydGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkgaW50IGNoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLAorCQkJCQkJIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZmJ5dGVzID0gMDsKKwlpbnQgeGZlcjsKKwljaGFyICpidWZwdHI7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJc3RhdGljIHVpbnQzMl90IGlkeDsKKwlzdGF0aWMgdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlmYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKKworCXByX2RlYnVnKCJhcHBsX3B0ciAlZFxuIiwgKGludClydW50aW1lLT5jb250cm9sLT5hcHBsX3B0cik7CisJcHJfZGVidWcoImh3X3B0ciAlZFxuIiwgKGludClydW50aW1lLT5zdGF0dXMtPmh3X3B0cik7CisJcHJfZGVidWcoImF2YWlsX21pbiAlZFxuIiwgKGludClydW50aW1lLT5jb250cm9sLT5hdmFpbF9taW4pOworCisJaWYgKHBydGQtPnJlc2V0X2V2ZW50KSB7CisJCXByX2VycigiJXM6IEluIFNTUiByZXR1cm4gRU5FVFJFU0VUIGJlZm9yZSB3YWl0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5FVFJFU0VUOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhlX2xvY2tzLnJlYWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmcHJ0ZC0+aW5fY291bnQpKSwgNSAqIEhaKTsKKwlpZiAoIXJldCkgeworCQlwcl9kZWJ1ZygiJXM6IHdhaXRfZXZlbnRfdGltZW91dCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAocHJ0ZC0+cmVzZXRfZXZlbnQpIHsKKwkJcHJfZXJyKCIlczogSW4gU1NSIHJldHVybiBFTkVUUkVTRVQgYWZ0ZXIgd2FpdFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+aW5fY291bnQpKSB7CisJCXByX2RlYnVnKCIlczogcGNtIHN0b3BwZWQgaW5fY291bnQgMFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcHJfZGVidWcoIkNoZWNraW5nIGlmIHZhbGlkIGJ1ZmZlciBpcyBhdmFpbGFibGUuLi4lcEtcbiIsCisJCQkJCQlkYXRhKTsKKwlkYXRhID0gcTZhc21faXNfY3B1X2J1Zl9hdmFpbChPVVQsIHBydGQtPmF1ZGlvX2NsaWVudCwgJnNpemUsICZpZHgpOworCWJ1ZnB0ciA9IGRhdGE7CisJcHJfZGVidWcoIlNpemUgPSAlZFxuIiwgc2l6ZSk7CisJcHJfZGVidWcoImZieXRlcyA9ICVkXG4iLCBmYnl0ZXMpOworCXByX2RlYnVnKCJpZHggPSAlZFxuIiwgaWR4KTsKKwlpZiAoYnVmcHRyKSB7CisJCXhmZXIgPSBmYnl0ZXM7CisJCWlmICh4ZmVyID4gc2l6ZSkKKwkJCXhmZXIgPSBzaXplOworCQlvZmZzZXQgPSBwcnRkLT5pbl9mcmFtZV9pbmZvW2lkeF0ub2Zmc2V0OworCQlwcl9kZWJ1ZygiT2Zmc2V0IHZhbHVlID0gJWRcbiIsIG9mZnNldCk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZwdHIrb2Zmc2V0LCB4ZmVyKSkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY29weSBidWYgdG8gdXNlclxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKE9VVCwgcHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlmYnl0ZXMgLT0geGZlcjsKKwkJc2l6ZSAtPSB4ZmVyOworCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2lkeF0ub2Zmc2V0ICs9IHhmZXI7CisJCXByX2RlYnVnKCIlczpmYnl0ZXMgPSAlZDogc2l6ZT0lZDogeGZlcj0lZFxuIiwKKwkJCQkJX19mdW5jX18sIGZieXRlcywgc2l6ZSwgeGZlcik7CisJCXByX2RlYnVnKCIgU2VuZGluZyBuZXh0IGJ1ZmZlciB0byBkc3BcbiIpOworCQltZW1zZXQoJnBydGQtPmluX2ZyYW1lX2luZm9baWR4XSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2luX2ZyYW1lX2luZm8pKTsKKwkJYXRvbWljX2RlYygmcHJ0ZC0+aW5fY291bnQpOworCQlyZXQgPSBxNmFzbV9yZWFkKHBydGQtPmF1ZGlvX2NsaWVudCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoInE2YXNtIHJlYWQgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlxNmFzbV9jcHVfYnVmX3JlbGVhc2UoT1VULCBwcnRkLT5hdWRpb19jbGllbnQpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlCisJCXByX2VycigiTm8gdmFsaWQgYnVmZmVyXG4iKTsKKworCXByX2RlYnVnKCJSZXR1cm5pbmcgZnJvbSBjYXB0dXJlX2NvcHkuLi4gJWRcbiIsIHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgZGlyID0gT1VUOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHBydGQtPmF1ZGlvX2NsaWVudCkgeworCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfQ0xPU0UpOworCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhkaXIsCisJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKKwl9CisKKwltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkLAorCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCWtmcmVlKHBydGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKKwkgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsIHZvaWQgX191c2VyICpidWYsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX2NvcHkoc3Vic3RyZWFtLCBhLCBod29mZiwgYnVmLCBmcmFtZXMpOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3Vic3RyZWFtLCBhLCBod29mZiwgYnVmLCBmcmFtZXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX2Nsb3NlKHN1YnN0cmVhbSk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfY2xvc2Uoc3Vic3RyZWFtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX3ByZXBhcmUoc3Vic3RyZWFtKTsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldCA9IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN1YnN0cmVhbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG1zbV9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChwcnRkLT5wY21faXJxX3BvcyA+PSBwcnRkLT5wY21fc2l6ZSkKKwkJcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOworCisJcHJfZGVidWcoInBjbV9pcnFfcG9zID0gJWRcbiIsIHBydGQtPnBjbV9pcnFfcG9zKTsKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChwcnRkLT5wY21faXJxX3BvcykpOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqYXBkID0gYWMtPnBvcnQ7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7CisJaW50IGRpciA9IC0xOworCisJcHJ0ZC0+bW1hcF9mbGFnID0gMTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlkaXIgPSBJTjsKKwllbHNlCisJCWRpciA9IE9VVDsKKwlhYiA9ICYoYXBkW2Rpcl0uYnVmWzBdKTsKKworCXJldHVybiBtc21fYXVkaW9faW9uX21tYXAoYWIsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOworCWludCBkaXIsIHJldDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlkaXIgPSBJTjsKKwllbHNlCisJCWRpciA9IE9VVDsKKwlyZXQgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXMoZGlyLAorCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LAorCQkJKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvIHBhcmFtc19wZXJpb2RzKHBhcmFtcykpLAorCQkJIHBhcmFtc19wZXJpb2RzKHBhcmFtcykpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiQXVkaW8gU3RhcnQ6IEJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLAorCQkJCQkJCXJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWYgPSBwcnRkLT5hdWRpb19jbGllbnQtPnBvcnRbZGlyXS5idWY7CisJaWYgKGJ1ZiA9PSBOVUxMIHx8IGJ1ZlswXS5kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJfZGVidWcoIiVzOmJ1ZiA9ICVwS1xuIiwgX19mdW5jX18sIGJ1Zik7CisJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJZG1hX2J1Zi0+ZGV2LmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CisJZG1hX2J1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlkbWFfYnVmLT5hcmVhID0gYnVmWzBdLmRhdGE7CisJZG1hX2J1Zi0+YWRkciA9ICBidWZbMF0ucGh5czsKKwlkbWFfYnVmLT5ieXRlcyA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKwlpZiAoIWRtYV9idWYtPmFyZWEpCisJCXJldHVybiAtRU5PTUVNOworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBtc21fcGNtX29wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBtc21fcGNtX29wZW4sCisJLmNvcHkJCT0gbXNtX3BjbV9jb3B5LAorCS5od19wYXJhbXMJPSBtc21fcGNtX2h3X3BhcmFtcywKKwkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX2Nsb3NlLAorCS5pb2N0bCAgICAgICAgICA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5wcmVwYXJlICAgICAgICA9IG1zbV9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciAgICAgICAgPSBtc21fcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgICAgICAgID0gbXNtX3BjbV9wb2ludGVyLAorCS5tbWFwCQk9IG1zbV9wY21fbW1hcCwKK307CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9zZXRfdm9sdW1lKHN0cnVjdCBtc21fYXVkaW8gKnBydGQsIHVpbnQzMl90IHZvbHVtZSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHBydGQgJiYgcHJ0ZC0+YXVkaW9fY2xpZW50KSB7CisJCXByX2RlYnVnKCIlczogY2hhbm5lbHMgJWQgdm9sdW1lIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCXBydGQtPmNoYW5uZWxfbW9kZSwgdm9sdW1lKTsKKwkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgdm9sdW1lKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByYyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkJdm9sLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghc3Vic3RyZWFtLT5ydW50aW1lKSB7CisJCXByX2VycigiJXMgc3Vic3RyZWFtIHJ1bnRpbWUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKHBydGQpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJ0ZC0+dm9sdW1lOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV92b2x1bWUgKnZvbCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CisJCXZvbC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOworCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdm9sdW1lIDogMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7CisJaWYgKCFzdWJzdHJlYW0pIHsKKwkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgeworCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChwcnRkKSB7CisJCXJjID0gbXNtX3BjbV9zZXRfdm9sdW1lKHBydGQsIHZvbHVtZSk7CisJCXBydGQtPnZvbHVtZSA9IHZvbHVtZTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sdW1lX2luZm87CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKworCWRldl9kYmcocnRkLT5kZXYsICIlcywgVm9sdW1lIGNvbnRyb2wgYWRkXG4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gc25kX3BjbV9hZGRfdm9sdW1lX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJTlVMTCwgMSwgcnRkLT5kYWlfbGluay0+aWQsCisJCQkmdm9sdW1lX2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXMgdm9sdW1lIGNvbnRyb2wgZmFpbGVkIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWtjdGwgPSB2b2x1bWVfaW5mby0+a2N0bDsKKwlrY3RsLT5wdXQgPSBtc21fcGNtX3ZvbHVtZV9jdGxfcHV0OworCWtjdGwtPmdldCA9IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQ7CisJa2N0bC0+dGx2LnAgPSBtc21fcGNtX3ZvbF9nYWluOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2htYXBfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKKworCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKKwlzdWJzdHJlYW0gPSBzbmRfcGNtX2NobWFwX3N1YnN0cmVhbShpbmZvLCBpZHgpOworCWlmICghc3Vic3RyZWFtKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7CisKKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKHBydGQpIHsKKwkJcHJ0ZC0+c2V0X2NoYW5uZWxfbWFwID0gdHJ1ZTsKKwkJCWZvciAoaSA9IDA7IGkgPCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTDsgaSsrKQorCQkJCXBydGQtPmNoYW5uZWxfbWFwW2ldID0KKwkJCQkoY2hhcikodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2NobWFwX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGk7CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7CisKKwlwcl9kZWJ1ZygiJXMiLCBfX2Z1bmNfXyk7CisJc3Vic3RyZWFtID0gc25kX3BjbV9jaG1hcF9zdWJzdHJlYW0oaW5mbywgaWR4KTsKKwlpZiAoIXN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbWVtc2V0KHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlLCAwLAorCQlzaXplb2YodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUpKTsKKwlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuIDA7IC8qIG5vIGNoYW5uZWxzIHNldCAqLworCisJcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHBydGQgJiYgcHJ0ZC0+c2V0X2NoYW5uZWxfbWFwID09IHRydWUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9CisJCQkJCShpbnQpcHJ0ZC0+Y2hhbm5lbF9tYXBbaV07CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9hZGRfY2htYXBfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmNobWFwX2luZm87CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwljaGFyIGRldmljZV9udW1bMTJdOworCWludCBpLCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzLCBDaGFubmVsIG1hcCBjbnRybCBhZGRcbiIsIF9fZnVuY19fKTsKKwlyZXQgPSBzbmRfcGNtX2FkZF9jaG1hcF9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCQkgICAgIHNuZF9wY21fc3RkX2NobWFwcywKKwkJCQkgICAgIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMLCAwLAorCQkJCSAgICAgJmNobWFwX2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXMsIGNoYW5uZWwgbWFwIGNudHJsIGFkZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJa2N0bCA9IGNobWFwX2luZm8tPmtjdGw7CisJZm9yIChpID0gMDsgaSA8IGtjdGwtPmNvdW50OyBpKyspCisJCWtjdGwtPnZkW2ldLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEU7CisJc25wcmludGYoZGV2aWNlX251bSwgc2l6ZW9mKGRldmljZV9udW0pLCAiJWQiLCBwY20tPmRldmljZSk7CisJc3RybGNhdChrY3RsLT5pZC5uYW1lLCBkZXZpY2VfbnVtLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCXByX2RlYnVnKCIlcywgT3ZlcndyaXRpbmcgY2hhbm5lbCBtYXAgY29udHJvbCBuYW1lIHRvOiAlc1xuIiwKKwkJX19mdW5jX18sIGtjdGwtPmlkLm5hbWUpOworCWtjdGwtPnB1dCA9IG1zbV9wY21fY2htYXBfY3RsX3B1dDsKKwlrY3RsLT5nZXQgPSBtc21fcGNtX2NobWFwX2N0bF9nZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IGFwcF90eXBlOworCWludCBhY2RiX2Rldl9pZDsKKwlpbnQgc2FtcGxlX3JhdGUgPSA0ODAwMDsKKworCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHVcbiIsIF9fZnVuY19fLCBmZV9pZCk7CisJaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7CisJCXByX2VycigiJXMgUmVjZWl2ZWQgb3V0IG9mIGJvdW5kcyBmZV9pZCAlbGx1XG4iLAorCQkJX19mdW5jX18sIGZlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlhY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQorCQlzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXByX2RlYnVnKCIlczogYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWQgc2Vzc2lvbl90eXBlLSAlZFxuIiwKKwkJX19mdW5jX18sIGFwcF90eXBlLCBhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUsIFNFU1NJT05fVFlQRV9SWCk7CisJbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBhcHBfdHlwZSwKKwkJCWFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1JYKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCByZXQgPSAwOworCWludCBhcHBfdHlwZTsKKwlpbnQgYWNkYl9kZXZfaWQ7CisJaW50IHNhbXBsZV9yYXRlOworCisJcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdVxuIiwgX19mdW5jX18sIGZlX2lkKTsKKwlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlcyBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBTRVNTSU9OX1RZUEVfUlgsCisJCSZhcHBfdHlwZSwgJmFjZGJfZGV2X2lkLCAmc2FtcGxlX3JhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXBwX3R5cGU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhY2RiX2Rldl9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IHNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAorCQlfX2Z1bmNfXywgZmVfaWQsIFNFU1NJT05fVFlQRV9SWCwKKwkJYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgYXBwX3R5cGU7CisJaW50IGFjZGJfZGV2X2lkOworCWludCBzYW1wbGVfcmF0ZSA9IDQ4MDAwOworCisJcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdVxuIiwgX19mdW5jX18sIGZlX2lkKTsKKwlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogUmVjZWl2ZWQgb3V0IG9mIGJvdW5kcyBmZV9pZCAlbGx1XG4iLAorCQkJX19mdW5jX18sIGZlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlhY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQorCQlzYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCXByX2RlYnVnKCIlczogYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWQgc2Vzc2lvbl90eXBlLSAlZFxuIiwKKwkJX19mdW5jX18sIGFwcF90eXBlLCBhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUsIFNFU1NJT05fVFlQRV9UWCk7CisJbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBhcHBfdHlwZSwKKwkJCWFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSwgU0VTU0lPTl9UWVBFX1RYKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldCA9IDA7CisJaW50IGFwcF90eXBlOworCWludCBhY2RiX2Rldl9pZDsKKwlpbnQgc2FtcGxlX3JhdGU7CisKKwlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgeworCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsbHVcbiIsCisJCQlfX2Z1bmNfXywgZmVfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBTRVNTSU9OX1RZUEVfVFgsCisJCSZhcHBfdHlwZSwgJmFjZGJfZGV2X2lkLCAmc2FtcGxlX3JhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXBwX3R5cGU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhY2RiX2Rldl9pZDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IHNhbXBsZV9yYXRlOworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAorCQlfX2Z1bmNfXywgZmVfaWQsIFNFU1NJT05fVFlQRV9UWCwKKwkJYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCBzYW1wbGVfcmF0ZSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9hZGRfYXBwX3R5cGVfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisJc3RydWN0IHNuZF9wY21fdXNyICphcHBfdHlwZV9pbmZvOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJY29uc3QgY2hhciAqcGxheWJhY2tfbWl4ZXJfY3RsX25hbWUJPSAiQXVkaW8gU3RyZWFtIjsKKwljb25zdCBjaGFyICpjYXB0dXJlX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSBDYXB0dXJlIjsKKwljb25zdCBjaGFyICpkZXZpY2VObwkJPSAiTk4iOworCWNvbnN0IGNoYXIgKnN1ZmZpeAkJPSAiQXBwIFR5cGUgQ2ZnIjsKKwlpbnQgY3RsX2xlbiwgcmV0ID0gMDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtKSB7CisJCWN0bF9sZW4gPSBzdHJsZW4ocGxheWJhY2tfbWl4ZXJfY3RsX25hbWUpICsgMSArCisJCQkJc3RybGVuKGRldmljZU5vKSArIDEgKyBzdHJsZW4oc3VmZml4KSArIDE7CisJCXByX2RlYnVnKCIlczogUGxheWJhY2sgYXBwIHR5cGUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHNuZF9wY21fYWRkX3Vzcl9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCQkJTlVMTCwgMSwgY3RsX2xlbiwgcnRkLT5kYWlfbGluay0+aWQsCisJCQkJCSZhcHBfdHlwZV9pbmZvKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHBsYXliYWNrIGFwcCB0eXBlIGNudHJsIGFkZCBmYWlsZWQ6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlrY3RsID0gYXBwX3R5cGVfaW5mby0+a2N0bDsKKwkJc25wcmludGYoa2N0bC0+aWQubmFtZSwgY3RsX2xlbiwgIiVzICVkICVzIiwKKwkJCXBsYXliYWNrX21peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOworCQlrY3RsLT5wdXQgPSBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfcHV0OworCQlrY3RsLT5nZXQgPSBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfZ2V0OworCX0KKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKKwkJY3RsX2xlbiA9IHN0cmxlbihjYXB0dXJlX21peGVyX2N0bF9uYW1lKSArIDEgKworCQkJCXN0cmxlbihkZXZpY2VObykgKyAxICsgc3RybGVuKHN1ZmZpeCkgKyAxOworCQlwcl9kZWJ1ZygiJXM6IENhcHR1cmUgYXBwIHR5cGUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHNuZF9wY21fYWRkX3Vzcl9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAorCQkJCQlOVUxMLCAxLCBjdGxfbGVuLCBydGQtPmRhaV9saW5rLT5pZCwKKwkJCQkJJmFwcF90eXBlX2luZm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogY2FwdHVyZSBhcHAgdHlwZSBjbnRybCBhZGQgZmFpbGVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJa2N0bCA9IGFwcF90eXBlX2luZm8tPmtjdGw7CisJCXNucHJpbnRmKGtjdGwtPmlkLm5hbWUsIGN0bF9sZW4sICIlcyAlZCAlcyIsCisJCQljYXB0dXJlX21peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOworCQlrY3RsLT5wdXQgPSBtc21fcGNtX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2N0bF9wdXQ7CisJCWtjdGwtPmdldCA9IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX2dldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gbXNtX3BjbV9hZGRfY2htYXBfY29udHJvbHMocnRkKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBwY20gYWRkIGNvbnRyb2xzIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0ID0gbXNtX3BjbV9hZGRfYXBwX3R5cGVfY29udHJvbHMocnRkKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBwY20gYWRkIGFwcCB0eXBlIGNvbnRyb2xzIGZhaWxlZDolZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJcmV0ID0gbXNtX3BjbV9hZGRfY29udHJvbHMocnRkKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXMsIGtjdGwgYWRkIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbXNtX3BjbV9hZGRfdm9sdW1lX2NvbnRyb2wocnRkKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIHBjbSBWb2x1bWUgQ29udHJvbCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190IG1zbV9wY21fZGVsYXlfYmxrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7CisJc25kX3BjbV9zZnJhbWVzX3QgZnJhbWVzOworCWludCByZXQ7CisKKwlyZXQgPSBxNmFzbV9nZXRfcGF0aF9kZWxheShwcnRkLT5hdWRpb19jbGllbnQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZ2V0X3BhdGhfZGVsYXkgZmFpbGVkLCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjb252ZXJ0IG1pY3Jvc2Vjb25kcyB0byBmcmFtZXMgKi8KKwlmcmFtZXMgPSBhYy0+cGF0aF9kZWxheSAvIDEwMDAgKiBydW50aW1lLT5yYXRlIC8gMTAwMDsKKworCS8qIGFsc28gY29udmVydCB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGluaXRpYWwgZGl2aXNpb24gKi8KKwlmcmFtZXMgKz0gYWMtPnBhdGhfZGVsYXkgJSAxMDAwICogcnVudGltZS0+cmF0ZSAvIDEwMDAwMDA7CisKKwkvKiBvdmVyY29tcGVuc2F0ZSBmb3IgdGhlIGxvc3Mgb2YgcHJlY2lzaW9uIChlbXBpcmljYWwpICovCisJZnJhbWVzICs9IDI7CisKKwlyZXR1cm4gZnJhbWVzOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXNtX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBtc21fYXNvY19wY21fbmV3LAorCS5kZWxheV9ibGsgICAgICA9IG1zbV9wY21fZGVsYXlfYmxrLAorfTsKKworc3RhdGljIGludCBtc21fcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCWludCBpZDsKKwlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGE7CisJY29uc3QgY2hhciAqbGF0ZW5jeV9sZXZlbDsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sbXNtLXBjbS1kc3AtaWQiLCAmaWQpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcWNvbSxtc20tcGNtLWRzcC1pZCBtaXNzaW5nIGluIERUIG5vZGVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9wbGF0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sbXNtLXBjbS1sb3ctbGF0ZW5jeSIpKSB7CisKKwkJcGRhdGEtPnBlcmZfbW9kZSA9IExPV19MQVRFTkNZX1BDTV9NT0RFOworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbGF0ZW5jeS1sZXZlbCIsICZsYXRlbmN5X2xldmVsKTsKKwkJaWYgKCFyYykgeworCQkJaWYgKCFzdHJjbXAobGF0ZW5jeV9sZXZlbCwgInVsdHJhIikpCisJCQkJcGRhdGEtPnBlcmZfbW9kZSA9IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFOworCQkJZWxzZSBpZiAoIXN0cmNtcChsYXRlbmN5X2xldmVsLCAidWxsLXBwIikpCisJCQkJcGRhdGEtPnBlcmZfbW9kZSA9CisJCQkJCVVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREU7CisJCX0KKwl9IGVsc2UgeworCQlwZGF0YS0+cGVyZl9tb2RlID0gTEVHQUNZX1BDTV9NT0RFOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBwZGF0YSk7CisKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBkZXYgbmFtZSAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldikpOworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCisJCQkJICAgJm1zbV9zb2NfcGxhdGZvcm0pOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9wbGF0X2RhdGEgKnBkYXRhOworCisJcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJa2ZyZWUocGRhdGEpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9wY21fZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLWRzcCJ9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX3BjbV9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wY21fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1wY20tZHNwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9wY21fZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtc21fcGNtX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fcGNtX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9sb2Nrcy5lbmFibGVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2xvY2tzLmVvc193YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3Mud3JpdGVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2xvY2tzLnJlYWRfd2FpdCk7CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUENNIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LXYyLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi12Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTBkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi12Mi5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnLgorICovCisKKyNpZm5kZWYgX01TTV9QQ01fSAorI2RlZmluZSBfTVNNX1BDTV9ICisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKworCisKKy8qIFN1cHBvcnQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGVzIDEyMDAwLCAyNDAwMCBhcyB3ZWxsICovCisjZGVmaW5lIFVTRV9SQVRFICAgICAgICAgICAgICAgIFwKKwkJCShTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfS05PVCkKKworZXh0ZXJuIGludCBjb3B5X2NvdW50OworCitzdHJ1Y3QgYnVmZmVyIHsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCB1c2VkOworCXVuc2lnbmVkIGludCBhZGRyOworfTsKKworc3RydWN0IGJ1ZmZlcl9yZWMgeworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IHJlYWQ7CisJdW5zaWduZWQgaW50IGFkZHI7Cit9OworCitzdHJ1Y3QgYXVkaW9fbG9ja3MgeworCXNwaW5sb2NrX3QgZXZlbnRfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBlb3Nfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBlbmFibGVfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBmbHVzaF93YWl0OworfTsKKworc3RydWN0IG1zbV9hdWRpb19pbl9mcmFtZV9pbmZvIHsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IG9mZnNldDsKK307CisKKyNkZWZpbmUgUExBWUJBQ0tfTUlOX05VTV9QRVJJT0RTICAgIDIKKyNkZWZpbmUgUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICAgIDgKKyNkZWZpbmUgUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFICAgIDEyMjg4MAorI2RlZmluZSBQTEFZQkFDS19NSU5fUEVSSU9EX1NJWkUgICAgMTI4CisjZGVmaW5lIENBUFRVUkVfTUlOX05VTV9QRVJJT0RTICAgICAyCisjZGVmaW5lIENBUFRVUkVfTUFYX05VTV9QRVJJT0RTICAgICA4CisjZGVmaW5lIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFICAgICAxMjI4ODAKKyNkZWZpbmUgQ0FQVFVSRV9NSU5fUEVSSU9EX1NJWkUgICAgIDMyMAorCitzdHJ1Y3QgbXNtX2F1ZGlvIHsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwl1bnNpZ25lZCBpbnQgcGNtX3NpemU7CisJdW5zaWduZWQgaW50IHBjbV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcGNtX2lycV9wb3M7ICAgICAgIC8qIElSUSBwb3NpdGlvbiAqLworCXVpbnQxNl90IHNvdXJjZTsgLyogRW5jb2Rpbmcgc291cmNlIGJpdCBtYXNrICovCisKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7CisKKwl1aW50MTZfdCBzZXNzaW9uX2lkOworCisJdWludDMyX3Qgc2FtcF9yYXRlOworCXVpbnQzMl90IGNoYW5uZWxfbW9kZTsKKwl1aW50MzJfdCBkc3BfY250OworCisJaW50IGFib3J0OyAvKiBzZXQgd2hlbiBlcnJvciwgbGlrZSBzYW1wbGUgcmF0ZSBtaXNtYXRjaCAqLworCisJYm9vbCByZXNldF9ldmVudDsKKwlpbnQgZW5hYmxlZDsKKwlpbnQgY2xvc2VfYWNrOworCWludCBjbWRfYWNrOworCS8qCisJICogY21kX2FjayBkb2Vzbid0IHRlbGwgaWYgcGF0aWN1bGFyIGNvbW1hbmQgaGFzIGJlZW4gc2VudCBzbyBjYW4ndAorCSAqIGRldGVybWluZSBpZiBpdCBuZWVkcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorCSAqIFVzZSBjbWRfcGVuZGluZyBpbnN0ZWFkIHdoZW4gY2hlY2tpbmcgd2hldGhlciBhIGNvbW1hbmQgaXMgYmVlbgorCSAqIHNlbnQgb3Igbm90LgorCSAqLworCXVuc2lnbmVkIGxvbmcgY21kX3BlbmRpbmc7CisJYXRvbWljX3Qgc3RhcnQ7CisJYXRvbWljX3Qgc3RvcDsKKwlhdG9taWNfdCBvdXRfY291bnQ7CisJYXRvbWljX3QgaW5fY291bnQ7CisJYXRvbWljX3Qgb3V0X25lZWRlZDsKKwlhdG9taWNfdCBlb3M7CisJaW50IG91dF9oZWFkOworCWludCBwZXJpb2RzOworCWludCBtbWFwX2ZsYWc7CisJYXRvbWljX3QgcGVuZGluZ19idWZmZXI7CisJYm9vbCBzZXRfY2hhbm5lbF9tYXA7CisJY2hhciBjaGFubmVsX21hcFs4XTsKKwlpbnQgY21kX2ludGVycnVwdDsKKwlib29sIG1ldGFfZGF0YV9tb2RlOworCXVpbnQzMl90IHZvbHVtZTsKKwkvKiBhcnJheSBvZiBmcmFtZSBpbmZvICovCisJc3RydWN0IG1zbV9hdWRpb19pbl9mcmFtZV9pbmZvIGluX2ZyYW1lX2luZm9bQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFNdOworfTsKKworc3RydWN0IG91dHB1dF9tZXRhX2RhdGFfc3QgeworCXVpbnQzMl90IG1ldGFfZGF0YV9sZW5ndGg7CisJdWludDMyX3QgZnJhbWVfc2l6ZTsKKwl1aW50MzJfdCB0aW1lc3RhbXBfbHN3OworCXVpbnQzMl90IHRpbWVzdGFtcF9tc3c7CisJdWludDMyX3QgcmVzZXJ2ZWRbMTJdOworfTsKKworc3RydWN0IG1zbV9wbGF0X2RhdGEgeworCWludCBwZXJmX21vZGU7Cit9OworCisjZW5kaWYgLypfTVNNX1BDTV9IKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctZGV2ZGVwLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1yb3V0aW5nLWRldmRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODZiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1yb3V0aW5nLWRldmRlcC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgorI2luY2x1ZGUgPHNvdW5kL2RldmRlcF9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc20tZHRzLWVhZ2xlLmg+CisKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgiCisjaW5jbHVkZSAibXNtLWRzMi1kYXAtY29uZmlnLmgiCisKKyNpZmRlZiBDT05GSUdfU05EX0hXREVQCitzdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19od2RlcF9vcGVuKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwltc21fZHMyX2RhcF91cGRhdGVfcG9ydF9wYXJhbWV0ZXJzKGh3LCBmaWxlLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfcmVsZWFzZShzdHJ1Y3Qgc25kX2h3ZGVwICpodywKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCW1zbV9kczJfZGFwX3VwZGF0ZV9wb3J0X3BhcmFtZXRlcnMoaHcsIGZpbGUsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXByX2RlYnVnKCIlczpjbWQgJXhcbiIsIF9fZnVuY19fLCBjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTToKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNOgorCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfQ09NTUFORDoKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0xJQ0VOU0U6CisJCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKKwkJcmV0ID0gbXNtX2RzMl9kYXBfaW9jdGwoaHcsIGZpbGUsIGNtZCwgYXJncCk7CisJCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSOgorCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bChodywgZmlsZSwgY21kLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfR0VUX0NBQ0hFX1NJWkU6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0NBQ0hFX1NJWkU6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfR0VUX1BBUkFNOgorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9QQVJBTToKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfQkxPQ0s6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0FDVElWRV9ERVZJQ0U6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfR0VUX0xJQ0VOU0U6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0xJQ0VOU0U6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VORF9MSUNFTlNFOgorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX1NFVF9WT0xVTUVfQ09NTUFORFM6CisJCXJldCA9IG1zbV9kdHNfZWFnbGVfaW9jdGwoY21kLCBhcmcpOworCQlpZiAocmV0ID09IC1FUEVSTSkgeworCQkJcHJfZXJyKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHglWFxuIiwKKwkJCQlfX2Z1bmNfXywgY21kKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHglWFxuIiwgX19mdW5jX18sIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1zbV9wY21fcm91dGluZ19od2RlcF9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJbXNtX2R0c19lYWdsZV9wY21fZnJlZShwY20pOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAorCQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlwcl9kZWJ1ZygiJXM6Y21kICV4XG4iLCBfX2Z1bmNfXywgY21kKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9TRVRfUEFSQU0zMjoKKwljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNMzI6CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EMzI6CisJY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFMzI6CisJCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKKwkJcmV0ID0gbXNtX2RzMl9kYXBfY29tcGF0X2lvY3RsKGh3LCBmaWxlLCBjbWQsIGFyZ3ApOworCQltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUjMyOgorCQlyZXQgPSBtc21fZHMyX2RhcF9jb21wYXRfaW9jdGwoaHcsIGZpbGUsIGNtZCwgYXJncCk7CisJCWJyZWFrOworCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX0dFVF9DQUNIRV9TSVpFMzI6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0NBQ0hFX1NJWkUzMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9HRVRfUEFSQU0zMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfUEFSQU0zMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfQkxPQ0szMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfQUNUSVZFX0RFVklDRTMyOgorCWNhc2UgRFRTX0VBR0xFX0lPQ1RMX0dFVF9MSUNFTlNFMzI6CisJY2FzZSBEVFNfRUFHTEVfSU9DVExfU0VUX0xJQ0VOU0UzMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRU5EX0xJQ0VOU0UzMjoKKwljYXNlIERUU19FQUdMRV9JT0NUTF9TRVRfVk9MVU1FX0NPTU1BTkRTMzI6CisJCXJldCA9IG1zbV9kdHNfZWFnbGVfY29tcGF0X2lvY3RsKGNtZCwgYXJnKTsKKwkJaWYgKHJldCA9PSAtRVBFUk0pIHsKKwkJCXByX2VycigiJXMgY2FsbGVkIHdpdGggaW52YWxpZCBjb250cm9sIDB4JVhcbiIsCisJCQkJX19mdW5jX18sIGNtZCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXMgY2FsbGVkIHdpdGggaW52YWxpZCBjb250cm9sIDB4JVhcbiIsIF9fZnVuY19fLCBjbWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitpbnQgbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSwKKwkJCSAgICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICptc21fYmVkYWlzKQoreworCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ1bnRpbWUtPmRhaV9saW5rOworCWludCByYzsKKworCWlmIChkYWlfbGluay0+aWQgPCAwIHx8CisJCWRhaV9saW5rLT5pZCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB7CisJCXByX2VycigiJXM6QkUgaWQgJWQgaW52YWxpZCBpbmRleFxuIiwKKwkJCV9fZnVuY19fLCBkYWlfbGluay0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzIEJFIGlkICVkXG4iLCBfX2Z1bmNfXywgZGFpX2xpbmstPmlkKTsKKwlyYyA9IHNuZF9od2RlcF9uZXcocnVudGltZS0+Y2FyZC0+c25kX2NhcmQsCisJCQkgICBtc21fYmVkYWlzW2RhaV9saW5rLT5pZF0ubmFtZSwKKwkJCSAgIGRhaV9saW5rLT5pZCwgJmh3ZGVwKTsKKwlpZiAoaHdkZXAgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBod2RlcCBpbnRmIGZhaWxlZCB0byBjcmVhdGUgJXMtIGh3ZGVwIE5VTExcbiIsCisJCQlfX2Z1bmNfXywgbXNtX2JlZGFpc1tkYWlfbGluay0+aWRdLm5hbWUpOworCQlyZXR1cm4gcmM7CisJfQorCWlmIChJU19FUlJfVkFMVUUocmMpKSB7CisJCXByX2VycigiJXM6IGh3ZGVwIGludGYgZmFpbGVkIHRvIGNyZWF0ZSAlcyByYyAlZFxuIiwgX19mdW5jX18sCisJCQltc21fYmVkYWlzW2RhaV9saW5rLT5pZF0ubmFtZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJaHdkZXAtPmlmYWNlID0gU05EUlZfSFdERVBfSUZBQ0VfQVVESU9fQkU7CisJaHdkZXAtPnByaXZhdGVfZGF0YSA9ICZtc21fYmVkYWlzW2RhaV9saW5rLT5pZF07CisJaHdkZXAtPm9wcy5vcGVuID0gbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX29wZW47CisJaHdkZXAtPm9wcy5pb2N0bCA9IG1zbV9wY21fcm91dGluZ19od2RlcF9pb2N0bDsKKwlod2RlcC0+b3BzLnJlbGVhc2UgPSBtc21fcGNtX3JvdXRpbmdfaHdkZXBfcmVsZWFzZTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJaHdkZXAtPm9wcy5pb2N0bF9jb21wYXQgPSBtc21fcGNtX3JvdXRpbmdfaHdkZXBfY29tcGF0X2lvY3RsOworI2VuZGlmCisJcmV0dXJuIG1zbV9kdHNfZWFnbGVfcGNtX25ldyhydW50aW1lKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy1kZXZkZXAuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzZDA0OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX01TTV9QQ01fUk9VVElOR19ERVZERVBfSF8KKyNkZWZpbmUgX01TTV9QQ01fUk9VVElOR19ERVZERVBfSF8KKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorCisjaWZkZWYgQ09ORklHX1NORF9IV0RFUAoraW50IG1zbV9wY21fcm91dGluZ19od2RlcF9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICBzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSAqbXNtX2JlZGFpcyk7Cit2b2lkIG1zbV9wY21fcm91dGluZ19od2RlcF9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9wY21fcm91dGluZ19od2RlcF9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgKm1zbV9iZWRhaXMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTdkNzkwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5jCkBAIC0wLDAgKzEsMTE5MzEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWRtLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmNvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9hdWRpb19jYWxfdXRpbHMuaD4KKyNpbmNsdWRlIDxzb3VuZC9tc20tZHRzLWVhZ2xlLmg+CisjaW5jbHVkZSA8c291bmQvYXVkaW9fZWZmZWN0cy5oPgorI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+CisKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKKyNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgiCisjaW5jbHVkZSAibXNtLXF0aS1wcC1jb25maWcuaCIKKyNpbmNsdWRlICJtc20tZHRzLXNycy10bS1jb25maWcuaCIKKyNpbmNsdWRlICJtc20tZG9sYnktZGFwLWNvbmZpZy5oIgorI2luY2x1ZGUgIm1zbS1kczItZGFwLWNvbmZpZy5oIgorI2luY2x1ZGUgInE2dm9pY2UuaCIKKyNpbmNsdWRlICJzb3VuZC9xNmxzbS5oIgorCitzdGF0aWMgaW50IGdldF9jYWxfcGF0aChpbnQgcGF0aF90eXBlKTsKKworc3RhdGljIHN0cnVjdCBtdXRleCByb3V0aW5nX2xvY2s7CisKK3N0YXRpYyBzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGE7CisKK3N0YXRpYyBpbnQgZm1fc3dpdGNoX2VuYWJsZTsKK3N0YXRpYyBpbnQgaGZwX3N3aXRjaF9lbmFibGU7CitzdGF0aWMgaW50IHByaV9taTJzX3N3aXRjaF9lbmFibGU7CitzdGF0aWMgaW50IHNlY19taTJzX3N3aXRjaF9lbmFibGU7CitzdGF0aWMgaW50IHRlcnRfbWkyc19zd2l0Y2hfZW5hYmxlOworc3RhdGljIGludCBxdWF0X21pMnNfc3dpdGNoX2VuYWJsZTsKK3N0YXRpYyBpbnQgZm1fcGNtcnhfc3dpdGNoX2VuYWJsZTsKK3N0YXRpYyBpbnQgbHNtX211eF9zbGltX3BvcnQ7CitzdGF0aWMgaW50IHNsaW0wX3J4X2FhbmNfZmJfcG9ydDsKK3N0YXRpYyBpbnQgbXNtX3JvdXRlX2VjX3JlZl9yeDsKK3N0YXRpYyB1aW50MzJfdCB2b2Nfc2Vzc2lvbl9pZCA9IEFMTF9TRVNTSU9OX1ZTSUQ7CitzdGF0aWMgaW50IG1zbV9yb3V0ZV9leHRfZWNfcmVmOworc3RhdGljIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19vbjsKK3N0YXRpYyBib29sIGlzX2RzMl9vbjsKKworZW51bSB7CisJTUFETk9ORSwKKwlNQURBVURJTywKKwlNQURCRUFDT04sCisJTUFEVUxUUkFTT1VORCwKKwlNQURTV0FVRElPLAorfTsKKworI2RlZmluZSBTTElNQlVTXzBfVFhfVEVYVCAiU0xJTUJVU18wX1RYIgorI2RlZmluZSBTTElNQlVTXzFfVFhfVEVYVCAiU0xJTUJVU18xX1RYIgorI2RlZmluZSBTTElNQlVTXzJfVFhfVEVYVCAiU0xJTUJVU18yX1RYIgorI2RlZmluZSBTTElNQlVTXzNfVFhfVEVYVCAiU0xJTUJVU18zX1RYIgorI2RlZmluZSBTTElNQlVTXzRfVFhfVEVYVCAiU0xJTUJVU180X1RYIgorI2RlZmluZSBTTElNQlVTXzVfVFhfVEVYVCAiU0xJTUJVU181X1RYIgorI2RlZmluZSBURVJUX01JMlNfVFhfVEVYVCAiVEVSVF9NSTJTX1RYIgorI2RlZmluZSBMU01fRlVOQ1RJT05fVEVYVCAiTFNNIEZ1bmN0aW9uIgorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYWRfYXVkaW9fbXV4X3RleHRbXSA9IHsKKwkiTm9uZSIsCisJU0xJTUJVU18wX1RYX1RFWFQsIFNMSU1CVVNfMV9UWF9URVhULCBTTElNQlVTXzJfVFhfVEVYVCwKKwlTTElNQlVTXzNfVFhfVEVYVCwgU0xJTUJVU180X1RYX1RFWFQsIFNMSU1CVVNfNV9UWF9URVhULAorCVRFUlRfTUkyU19UWF9URVhUCit9OworCitzdHJ1Y3QgbXNtX3BjbV9yb3V0ZV9iZGFpX3BwX3BhcmFtcyB7CisJdTE2IHBvcnRfaWQ7IC8qIEFGRSBwb3J0IElEICovCisJdW5zaWduZWQgbG9uZyBwcF9wYXJhbXNfY29uZmlnOworCWJvb2wgbXV0ZV9vbjsKKwlpbnQgbGF0ZW5jeTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX3BjbV9yb3V0ZV9iZGFpX3BwX3BhcmFtcworCW1zbV9iZWRhaXNfcHBfcGFyYW1zW01TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWF0gPSB7CisJe0hETUlfUlgsIDAsIDAsIDB9LAorCXtESVNQTEFZX1BPUlRfUlgsIDAsIDAsIDB9LAorfTsKKworc3RhdGljIGludCBtc21fcm91dGluZ19zZW5kX2RldmljZV9wcF9wYXJhbXMoaW50IHBvcnRfaWQsICBpbnQgY29wcF9pZHgpOworCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9iaXRfd2lkdGgodW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKwlpbnQgYml0X3dpZHRoOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgorCQliaXRfd2lkdGggPSAyNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlkZWZhdWx0OgorCQliaXRfd2lkdGggPSAxNjsKKwl9CisJcmV0dXJuIGJpdF93aWR0aDsKK30KKworc3RhdGljIGJvb2wgbXNtX2lzX3Jlc2FtcGxlX25lZWRlZChpbnQgaW5wdXRfc3IsIGludCBvdXRwdXRfc3IpCit7CisJYm9vbCByYyA9IGZhbHNlOworCisJaWYgKGlucHV0X3NyICE9IG91dHB1dF9zcikKKwkJcmMgPSB0cnVlOworCisJcHJfZGVidWcoInBlcmZvcm0gcmVzYW1wbGluZyAoJXMpIGZvciBjb3BwIHJhdGUgKCVkKWFmZSByYXRlICglZCkiLAorCQkocmMgPyAib2ggeWVzIiA6ICJub3QgcmVhbGx5IiksCisJCWlucHV0X3NyLCBvdXRwdXRfc3IpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRpbmdfY2ZnX3BwKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCB0b3BvbG9neSwKKwkJCQkgICBpbnQgY2hhbm5lbHMpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAodG9wb2xvZ3kpIHsKKwljYXNlIFNSU19UUlVNRURJQV9UT1BPTE9HWV9JRDoKKwkJcHJfZGVidWcoIiVzOiBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSURcbiIsIF9fZnVuY19fKTsKKwkJbXNtX2R0c19zcnNfdG1faW5pdChwb3J0X2lkLCBjb3BwX2lkeCk7CisJCWJyZWFrOworCWNhc2UgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEOgorCQlwcl9kZWJ1ZygiJXM6IERTMl9BRE1fQ09QUF9UT1BPTE9HWSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEKTsKKwkJcmMgPSBtc21fZHMyX2RhcF9pbml0KHBvcnRfaWQsIGNvcHBfaWR4LCBjaGFubmVscywKKwkJCQkgICAgICBpc19jdXN0b21fc3RlcmVvX29uKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiJXM6IERTMiB0b3BvX2lkIDB4JXgsIHBvcnQgJWQsIENTICVkIHJjICVkXG4iLAorCQkJCV9fZnVuY19fLCB0b3BvbG9neSwgcG9ydF9pZCwKKwkJCQlpc19jdXN0b21fc3RlcmVvX29uLCByYyk7CisJCWJyZWFrOworCWNhc2UgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQ6CisJCWlmIChpc19kczJfb24pIHsKKwkJCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IG1zbV9kczJfZGFwX2luaXQocG9ydF9pZCwgY29wcF9pZHgsIGNoYW5uZWxzLAorCQkJCWlzX2N1c3RvbV9zdGVyZW9fb24pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlwcl9lcnIoIiVzOkRTMiB0b3BvX2lkIDB4JXgsIHBvcnQgJWQsIHJjICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgdG9wb2xvZ3ksIHBvcnRfaWQsIHJjKTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSURcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gbXNtX2RvbGJ5X2RhcF9pbml0KHBvcnRfaWQsIGNvcHBfaWR4LCBjaGFubmVscywKKwkJCQkJCWlzX2N1c3RvbV9zdGVyZW9fb24pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlwcl9lcnIoIiVzOiBEUzEgdG9wb19pZCAweCV4LCBwb3J0ICVkLCByYyAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHRvcG9sb2d5LCBwb3J0X2lkLCByYyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9EVFNfSFBYOgorCQlwcl9kZWJ1ZygiJXM6IERUU19FQUdMRV9DT1BQX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7CisJCW1zbV9kdHNfZWFnbGVfaW5pdF9wb3N0KHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJYnJlYWs7CisJY2FzZSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9BVURJT1NQSEVSRToKKwkJcHJfZGVidWcoIiVzOiBUT1BPTE9HWV9JRF9BVURJT1NQSEVSRVxuIiwgX19mdW5jX18pOworCQlyYyA9IG1zbV9xdGlfcHBfYXNwaGVyZV9pbml0KHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiJXM6IHRvcG9faWQgMHgleCwgcG9ydCAlZCwgY29wcCAlZCwgcmMgJWRcbiIsCisJCQkJX19mdW5jX18sIHRvcG9sb2d5LCBwb3J0X2lkLCBjb3BwX2lkeCwgcmMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBjdXN0b20gdG9wb2xvZ3kgc3BlY2lmaWMgZmVhdHVyZSBwYXJhbSBoYW5kbGVycyAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9wY21fcm91dGluZ19kZWluaXRfcHAoaW50IHBvcnRfaWQsIGludCB0b3BvbG9neSkKK3sKKwlzd2l0Y2ggKHRvcG9sb2d5KSB7CisJY2FzZSBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQ6CisJCXByX2RlYnVnKCIlczogU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7CisJCW1zbV9kdHNfc3JzX3RtX2RlaW5pdChwb3J0X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQ6CisJCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEICVkXG4iLAorCQkJIF9fZnVuY19fLCBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpOworCQltc21fZHMyX2RhcF9kZWluaXQocG9ydF9pZCk7CisJCWJyZWFrOworCWNhc2UgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQ6CisJCWlmIChpc19kczJfb24pIHsKKwkJCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7CisJCQltc21fZHMyX2RhcF9kZWluaXQocG9ydF9pZCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7CisJCQltc21fZG9sYnlfZGFwX2RlaW5pdChwb3J0X2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFg6CisJCXByX2RlYnVnKCIlczogRFRTX0VBR0xFX0NPUFBfVE9QT0xPR1lfSURcbiIsIF9fZnVuY19fKTsKKwkJbXNtX2R0c19lYWdsZV9kZWluaXRfcG9zdChwb3J0X2lkLCB0b3BvbG9neSk7CisJCWJyZWFrOworCWNhc2UgQURNX0NNRF9DT1BQX09QRU5fVE9QT0xPR1lfSURfQVVESU9TUEhFUkU6CisJCXByX2RlYnVnKCIlczogVE9QT0xPR1lfSURfQVVESU9TUEhFUkVcbiIsIF9fZnVuY19fKTsKKwkJbXNtX3F0aV9wcF9hc3BoZXJlX2RlaW5pdChwb3J0X2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogY3VzdG9tIHRvcG9sb2d5IHNwZWNpZmljIGZlYXR1cmUgZGVpbml0IGhhbmRsZXJzICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbXNtX3BjbV9yb3V0bmdfY2ZnX21hdHJpeF9tYXBfcHAoc3RydWN0IHJvdXRlX3BheWxvYWQgcGF5bG9hZCwKKwkJCQkJICAgICBpbnQgcGF0aF90eXBlLCBpbnQgcGVyZl9tb2RlKQoreworCWludCBpdHIgPSAwLCByYyA9IDA7CisKKwlpZiAoKHBhdGhfdHlwZSA9PSBBRE1fUEFUSF9QTEFZQkFDSykgJiYKKwkgICAgKHBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCisJICAgIGlzX2N1c3RvbV9zdGVyZW9fb24pIHsKKwkJZm9yIChpdHIgPSAwOyBpdHIgPCBwYXlsb2FkLm51bV9jb3BwczsgaXRyKyspIHsKKwkJCWlmICgocGF5bG9hZC5wb3J0X2lkW2l0cl0gIT0gU0xJTUJVU18wX1JYKSAmJgorCQkJICAgIChwYXlsb2FkLnBvcnRfaWRbaXRyXSAhPSBSVF9QUk9YWV9QT1JUXzAwMV9SWCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmMgPSBtc21fcXRpX3BwX3NlbmRfc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY21kKAorCQkJCXBheWxvYWQucG9ydF9pZFtpdHJdLAorCQkJCXBheWxvYWQuY29wcF9pZHhbaXRyXSwKKwkJCQlwYXlsb2FkLnNlc3Npb25faWQsCisJCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFLAorCQkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRSwKKwkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkUsCisJCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlczogZXJyIHNldHRpbmcgY3VzdG9tIHN0ZXJlb1xuIiwKKwkJCQkJX19mdW5jX18pOworCQl9CisJfQorfQorCisjZGVmaW5lIFNMSU1CVVNfRVhUUFJPQ19SWCBBRkVfUE9SVF9JTlZBTElECitzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSBtc21fYmVkYWlzW01TTV9CQUNLRU5EX0RBSV9NQVhdID0geworCXsgUFJJTUFSWV9JMlNfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfUFJJX0kyU19SWH0sCisJeyBQUklNQVJZX0kyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9QUklfSTJTX1RYfSwKKwl7IFNMSU1CVVNfMF9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzBfUlh9LAorCXsgU0xJTUJVU18wX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfMF9UWH0sCisJeyBIRE1JX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX0hETUl9LAorCXsgSU5UX0JUX1NDT19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9JTlRfQlRfU0NPX1JYfSwKKwl7IElOVF9CVF9TQ09fVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfSU5UX0JUX1NDT19UWH0sCisJeyBJTlRfRk1fUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfSU5UX0ZNX1JYfSwKKwl7IElOVF9GTV9UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9JTlRfRk1fVFh9LAorCXsgUlRfUFJPWFlfUE9SVF8wMDFfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfQUZFX1BDTV9SWH0sCisJeyBSVF9QUk9YWV9QT1JUXzAwMV9UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9BRkVfUENNX1RYfSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9BVVhQQ01fUlh9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX0FVWFBDTV9UWH0sCisJeyBWT0lDRV9QTEFZQkFDS19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfVk9JQ0VfUExBWUJBQ0tfVFh9LAorCXsgVk9JQ0UyX1BMQVlCQUNLX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFh9LAorCXsgVk9JQ0VfUkVDT1JEX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfUlh9LAorCXsgVk9JQ0VfUkVDT1JEX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfVFh9LAorCXsgTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9NSTJTX1JYfSwKKwl7IE1JMlNfVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfTUkyU19UWH0sCisJeyBTRUNPTkRBUllfSTJTX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NFQ19JMlNfUlh9LAorCXsgU0xJTUJVU18xX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfMV9SWH0sCisJeyBTTElNQlVTXzFfVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU0xJTUJVU18xX1RYfSwKKwl7IFNMSU1CVVNfMl9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzJfUlh9LAorCXsgU0xJTUJVU18yX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfMl9UWH0sCisJeyBTTElNQlVTXzNfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU0xJTUJVU18zX1JYfSwKKwl7IFNMSU1CVVNfM19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzNfVFh9LAorCXsgU0xJTUJVU180X1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfNF9SWH0sCisJeyBTTElNQlVTXzRfVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU0xJTUJVU180X1RYfSwKKwl7IFNMSU1CVVNfNV9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzVfUlh9LAorCXsgU0xJTUJVU181X1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfNV9UWH0sCisJeyBTTElNQlVTXzZfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU0xJTUJVU182X1JYfSwKKwl7IFNMSU1CVVNfNl9UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzZfVFh9LAorCXsgU0xJTUJVU183X1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfN19SWH0sCisJeyBTTElNQlVTXzdfVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU0xJTUJVU183X1RYfSwKKwl7IFNMSU1CVVNfOF9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TTElNQlVTXzhfUlh9LAorCXsgU0xJTUJVU184X1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1NMSU1CVVNfOF9UWH0sCisJeyBTTElNQlVTX0VYVFBST0NfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU1RVQl9SWH0sCisJeyBTTElNQlVTX0VYVFBST0NfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU1RVQl9UWH0sCisJeyBTTElNQlVTX0VYVFBST0NfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfU1RVQl8xX1RYfSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYLCAgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX01JMlNfUlh9LAorCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFgsICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9TRUNfTUkyU19UWH0sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlgsICAgIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWCwgICAgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX01JMlNfVFh9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWCwgICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9URVJUX01JMlNfUlh9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWCwgICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9URVJUX01JMlNfVFh9LAorCXsgQVVESU9fUE9SVF9JRF9JMlNfUlgsICAgICAgICAgICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9BVURJT19JMlNfUlh9LAorCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWCwJICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9TRUNfQVVYUENNX1JYfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFgsICAgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX0FVWFBDTV9UWH0sCisJeyBBRkVfUE9SVF9JRF9TUERJRl9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9TUERJRl9SWH0sCisJeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDEsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1NFQ19NSTJTX1JYX1NEMX0sCisJeyBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVSU5fTUkyU19SWH0sCisJeyBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVSU5fTUkyU19UWH0sCisJeyBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWCwgICAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9TRU5BUllfTUkyU19UWH0sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9SWF8wfSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9QUklfVERNX1RYXzB9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9SWF8xfSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzEsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9URE1fVFhfMX0sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9QUklfVERNX1JYXzJ9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9UWF8yfSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzMsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9URE1fUlhfM30sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9QUklfVERNX1RYXzN9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9SWF80fSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9URE1fVFhfNH0sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81LCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9QUklfVERNX1JYXzV9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9UWF81fSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzYsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9URE1fUlhfNn0sCisJeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82LCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9QUklfVERNX1RYXzZ9LAorCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUFJJX1RETV9SWF83fSwKKwl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzcsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1BSSV9URE1fVFhfN30sCisJeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9TRUNfVERNX1JYXzB9LAorCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF8wfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF8xfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF8xfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF8yfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF8yfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF8zfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF8zfSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF80fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF80fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF81fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF81fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF82fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF82fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9SWF83fSwKKwl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfU0VDX1RETV9UWF83fSwKKwl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfVEVSVF9URE1fUlhfMH0sCisJeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzB9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzEsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzF9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzEsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzF9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzIsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzJ9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzIsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzJ9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzMsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzN9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzMsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzN9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzR9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzR9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzUsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzV9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzUsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzV9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzYsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzZ9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzYsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzZ9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzcsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzd9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzcsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzd9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzB9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzB9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9URE1fUlhfMX0sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9RVUFUX1RETV9UWF8xfSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzIsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzJ9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMiwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9URE1fVFhfMn0sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9RVUFUX1RETV9SWF8zfSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzMsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzN9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9URE1fUlhfNH0sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80LCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9RVUFUX1RETV9UWF80fSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzUsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzV9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNSwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9URE1fVFhfNX0sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82LCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9RVUFUX1RETV9SWF82fSwKKwl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzYsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzZ9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNywgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9URE1fUlhfN30sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83LCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9RVUFUX1RETV9UWF83fSwKKwl7IElOVF9CVF9BMkRQX1JYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX0lOVF9CVF9BMkRQX1JYfSwKKwl7IEFGRV9QT1JUX0lEX1VTQl9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLCBMUEFTU19CRV9VU0JfQVVESU9fUlh9LAorCXsgQUZFX1BPUlRfSURfVVNCX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsIExQQVNTX0JFX1VTQl9BVURJT19UWH0sCisJeyBESVNQTEFZX1BPUlRfUlgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwgTFBBU1NfQkVfRElTUExBWV9QT1JUfSwKKwl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfVEVSVF9BVVhQQ01fUlh9LAorCXsgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYLCAwLCAwLCB7MH0sIDAsIDAsIDAsIDAsIDAsCisJICBMUEFTU19CRV9URVJUX0FVWFBDTV9UWH0sCisJeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlh9LAorCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFgsIDAsIDAsIHswfSwgMCwgMCwgMCwgMCwgMCwKKwkgIExQQVNTX0JFX1FVQVRfQVVYUENNX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMF9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMF9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMV9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMV9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMl9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UMl9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UM19NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UM19NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNF9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNF9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNV9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNV9NSTJTX1RYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNl9NSTJTX1JYfSwKKwl7IEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWCwgMCwgMCwgezB9LCAwLCAwLCAwLCAwLCAwLAorCSAgTFBBU1NfQkVfSU5UNl9NSTJTX1RYfSwKK307CisKKy8qIFRyYWNrIEFTTSBwbGF5YmFjayAmIGNhcHR1cmUgc2Vzc2lvbnMgb2YgREFJICovCitzdGF0aWMgc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEKKwlmZV9kYWlfbWFwW01TTV9GUk9OVEVORF9EQUlfTU1fU0laRV1bMl0gPSB7CisJLyogTVVMVElNRURJQTEgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUEyICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBMyAqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTQgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUE1ICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBNiAqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTcqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTggKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUE5ICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBMTAgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUExMSAqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTEyICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBMTMgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUExNCAqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTE1ICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBMTYgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorCS8qIE1VTFRJTUVESUExNyAqLworCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAorCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCisJLyogTVVMVElNRURJQTE4ICovCisJe3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCisJIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKKwkvKiBNVUxUSU1FRElBMTkgKi8KKwl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKKwkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2Vzc2lvbl9jb3BwX21hcFtNU01fRlJPTlRFTkRfREFJX01NX1NJWkVdWzJdCisJCQkJICAgICBbTVNNX0JBQ0tFTkRfREFJX01BWF07CitzdGF0aWMgc3RydWN0IG1zbV9wY21fcm91dGluZ19hcHBfdHlwZV9kYXRhIGFwcF90eXBlX2NmZ1tNQVhfQVBQX1RZUEVTXTsKK3N0YXRpYyBzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnCisJCQkgZmVfZGFpX2FwcF90eXBlX2NmZ1tNU01fRlJPTlRFTkRfREFJX01NX1NJWkVdWzJdOworCisvKiBUaGUgY2FsbGVyIG9mIHRoaXMgc2hvdWxkIGFxY3VpcmUgcm91dGluZyBsb2NrICovCit2b2lkIG1zbV9wY21fcm91dGluZ19nZXRfYmVkYWlfaW5mbyhpbnQgYmVfaWR4LAorCQkJCSAgICBzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSAqYmVfZGFpKQoreworCWlmIChiZV9pZHggPj0gMCAmJiBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYKQorCQltZW1jcHkoYmVfZGFpLCAmbXNtX2JlZGFpc1tiZV9pZHhdLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhKSk7Cit9CisKKy8qIFRoZSBjYWxsZXIgb2YgdGhpcyBzaG91bGQgYXFjdWlyZSByb3V0aW5nIGxvY2sgKi8KK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX2dldF9mZWRhaV9pbmZvKGludCBmZV9pZHgsIGludCBzZXNzX3R5cGUsCisJCQkJICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhICpmZV9kYWkpCit7CisJaWYgKChzZXNzX3R5cGUgPT0gU0VTU0lPTl9UWVBFX1RYKSB8fCAoc2Vzc190eXBlID09IFNFU1NJT05fVFlQRV9SWCkpCisJCW1lbWNweShmZV9kYWksICZmZV9kYWlfbWFwW2ZlX2lkeF1bc2Vzc190eXBlXSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2ZkYWlfZGF0YSkpOworfQorCit2b2lkIG1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2sodm9pZCkKK3sKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworfQorCit2b2lkIG1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2sodm9pZCkKK3sKKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9yb3V0aW5nX2dldF9hcHBfdHlwZV9pZHgoaW50IGFwcF90eXBlKQoreworCWludCBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6IGFwcF90eXBlOiAlZFxuIiwgX19mdW5jX18sIGFwcF90eXBlKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9BUFBfVFlQRVM7IGlkeCsrKSB7CisJCWlmIChhcHBfdHlwZV9jZmdbaWR4XS5hcHBfdHlwZSA9PSBhcHBfdHlwZSkKKwkJCXJldHVybiBpZHg7CisJfQorCXByX2luZm8oIiVzOiBBcHAgdHlwZSBub3QgYXZhaWxhYmxlLCBmYWxsYmFjayB0byBkZWZhdWx0XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGludCBmZWRhaV9pZCwgaW50IGFwcF90eXBlLAorCWludCBhY2RiX2Rldl9pZCwgaW50IHNhbXBsZV9yYXRlLCBpbnQgc2Vzc2lvbl90eXBlKQoreworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWQsIHNlc3Npb25fdHlwZSAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKKwkJX19mdW5jX18sIGZlZGFpX2lkLCBzZXNzaW9uX3R5cGUsIGFwcF90eXBlLAorCQlhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUpOworCWlmIChmZWRhaV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgbWFjaGluZSBkcml2ZXIgSUQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZmVkYWlfaWQpOworCQlyZXR1cm47CisJfQorCWlmIChzZXNzaW9uX3R5cGUgIT0gU0VTU0lPTl9UWVBFX1JYICYmCisJCXNlc3Npb25fdHlwZSAhPSBTRVNTSU9OX1RZUEVfVFgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzZXNzaW9uIHR5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2Vzc2lvbl90eXBlKTsKKwkJcmV0dXJuOworCX0KKwlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmFwcF90eXBlID0gYXBwX3R5cGU7CisJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5hY2RiX2Rldl9pZCA9IGFjZGJfZGV2X2lkOworCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKK30KKworLyoqCisgKiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcKKyAqCisgKiBSZWNlaXZlcyBmZWRhaV9pZCwgc2Vzc2lvbl90eXBlIGFuZCBwb3B1bGF0ZXMgYXBwX3R5cGUsIGFjZGJfZGV2X2lkLCAmCisgKiBzYW1wbGUgcmF0ZS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE9uIGZhaWx1cmUgcmV0dXJucworICogLUVJTlZBTCBhbmQgZG9lcyBub3QgYWx0ZXIgcGFzc2VkIHZhbHVlcy4KKyAqCisgKiBmZWRhaV9pZCAtIFBhc3NlZCB2YWx1ZSwgZnJvbnQgZW5kIElEIGZvciB3aGljaCBhcHAgdHlwZSBjb25maWcgaXMgd2FudGVkCisgKiBzZXNzaW9uX3R5cGUgLSBQYXNzZWQgdmFsdWUsIHNlc3Npb24gdHlwZSBmb3Igd2hpY2ggYXBwIHR5cGUgY29uZmlnCisgKiAgICAgICAgICAgICAgICBpcyB3YW50ZWQKKyAqIGFwcF90eXBlIC0gUmV0dXJuZWQgdmFsdWUsIGFwcCB0eXBlIHVzZWQgYnkgYXBwIHR5cGUgY29uZmlnCisgKiBhY2RiX2Rldl9pZCAtIFJldHVybmVkIHZhbHVlLCBBQ0RCIGRldmljZSBJRCB1c2VkIGJ5IGFwcCB0eXBlIGNvbmZpZworICogc2FtcGxlX3JhdGUgLSBSZXR1cm5lZCB2YWx1ZSwgc2FtcGxlIHJhdGUgdXNlZCBieSBhcHAgdHlwZSBjb25maWcKKyAqLworaW50IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyhpbnQgZmVkYWlfaWQsIGludCBzZXNzaW9uX3R5cGUsCisJaW50ICphcHBfdHlwZSwgaW50ICphY2RiX2Rldl9pZCwgaW50ICpzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhcHBfdHlwZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5VTEwgcG9pbnRlciBzZW50IGZvciBhcHBfdHlwZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChhY2RiX2Rldl9pZCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5VTEwgcG9pbnRlciBzZW50IGZvciBhY2RiX2Rldl9pZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChzYW1wbGVfcmF0ZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5VTEwgcG9pbnRlciBzZW50IGZvciBzYW1wbGUgcmF0ZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChmZWRhaV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgRkUgSUQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZmVkYWlfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChzZXNzaW9uX3R5cGUgIT0gU0VTU0lPTl9UWVBFX1JYICYmCisJCXNlc3Npb25fdHlwZSAhPSBTRVNTSU9OX1RZUEVfVFgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzZXNzaW9uIHR5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgc2Vzc2lvbl90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwkqYXBwX3R5cGUgPSBmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmFwcF90eXBlOworCSphY2RiX2Rldl9pZCA9IGZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uYWNkYl9kZXZfaWQ7CisJKnNhbXBsZV9yYXRlID0gZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5zYW1wbGVfcmF0ZTsKKworCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWQsIHNlc3Npb25fdHlwZSAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKKwkJX19mdW5jX18sIGZlZGFpX2lkLCBzZXNzaW9uX3R5cGUsCisJCSphcHBfdHlwZSwgKmFjZGJfZGV2X2lkLCAqc2FtcGxlX3JhdGUpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcpOworCitzdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICptc21fcm91dGluZ19maW5kX3RvcG9sb2d5X2J5X3BhdGgoaW50IHBhdGgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCSZjYWxfZGF0YS0+Y2FsX2Jsb2NrcykgeworCisJCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKKworCQlpZiAoKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWRtX3RvcCAqKWNhbF9ibG9jay0+Y2FsX2luZm8pCisJCQktPnBhdGggPT0gcGF0aCkgeworCQkJcmV0dXJuIGNhbF9ibG9jazsKKwkJfQorCX0KKwlwcl9kZWJ1ZygiJXM6IENhbid0IGZpbmQgdG9wb2xvZ3kgZm9yIHBhdGggJWRcbiIsIF9fZnVuY19fLCBwYXRoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqbXNtX3JvdXRpbmdfZmluZF90b3BvbG9neShpbnQgcGF0aCwKKwkJCQkJCQlpbnQgYXBwX3R5cGUsCisJCQkJCQkJaW50IGFjZGJfaWQsCisJCQkJCQkJaW50IHNhbXBsZV9yYXRlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wICpjYWxfaW5mbzsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJJmNhbF9kYXRhLT5jYWxfYmxvY2tzKSB7CisKKwkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOworCisJCWNhbF9pbmZvID0gKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wICopCisJCQljYWxfYmxvY2stPmNhbF9pbmZvOworCQlpZiAoKGNhbF9pbmZvLT5wYXRoID09IHBhdGgpICAmJgorCQkJKGNhbF9pbmZvLT5hcHBfdHlwZSA9PSBhcHBfdHlwZSkgJiYKKwkJCShjYWxfaW5mby0+YWNkYl9pZCA9PSBhY2RiX2lkKSAmJgorCQkJKGNhbF9pbmZvLT5zYW1wbGVfcmF0ZSA9PSBzYW1wbGVfcmF0ZSkpIHsKKwkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0KKwl9CisJcHJfZGVidWcoIiVzOiBDYW4ndCBmaW5kIHRvcG9sb2d5IGZvciBwYXRoICVkLCBhcHAgJWQsIGFjZGJfaWQgJWQgc2FtcGxlX3JhdGUgJWQgZGVmYXVsdGluZyB0byBzZWFyY2ggYnkgcGF0aFxuIiwKKwkJX19mdW5jX18sIHBhdGgsIGFwcF90eXBlLCBhY2RiX2lkLCBzYW1wbGVfcmF0ZSk7CisJcmV0dXJuIG1zbV9yb3V0aW5nX2ZpbmRfdG9wb2xvZ3lfYnlfcGF0aChwYXRoKTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KGludCBwYXRoLCBpbnQgZmVkYWlfaWQsCisJCQkJCWludCBzZXNzaW9uX3R5cGUpCit7CisJaW50IHRvcG9sb2d5ID0gTlVMTF9DT1BQX1RPUE9MT0dZOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlpbnQgYXBwX3R5cGUgPSAwLCBhY2RiX2Rldl9pZCA9IDAsIHNhbXBsZV9yYXRlID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJcGF0aCA9IGdldF9jYWxfcGF0aChwYXRoKTsKKwlpZiAoY2FsX2RhdGEgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJbXV0ZXhfbG9jaygmY2FsX2RhdGEtPmxvY2spOworCisJYXBwX3R5cGUgPSBmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmFwcF90eXBlOworCWFjZGJfZGV2X2lkID0gZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5hY2RiX2Rldl9pZDsKKwlzYW1wbGVfcmF0ZSA9IGZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uc2FtcGxlX3JhdGU7CisKKwljYWxfYmxvY2sgPSBtc21fcm91dGluZ19maW5kX3RvcG9sb2d5KHBhdGgsIGFwcF90eXBlLAorCQkJCQkgICAgICBhY2RiX2Rldl9pZCwgc2FtcGxlX3JhdGUpOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKKwkJZ290byB1bmxvY2s7CisKKwl0b3BvbG9neSA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FkbV90b3AgKikKKwkJY2FsX2Jsb2NrLT5jYWxfaW5mbyktPnRvcG9sb2d5OwordW5sb2NrOgorCW11dGV4X3VubG9jaygmY2FsX2RhdGEtPmxvY2spOworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IFVzaW5nIHRvcG9sb2d5ICVkXG4iLCBfX2Z1bmNfXywgdG9wb2xvZ3kpOworCXJldHVybiB0b3BvbG9neTsKK30KKworc3RhdGljIHVpbnQ4X3QgaXNfYmVfZGFpX2V4dHByb2MoaW50IGJlX2RhaSkKK3sKKwlpZiAoYmVfZGFpID09IE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX1JYIHx8CisJICAgYmVfZGFpID09IE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX1RYIHx8CisJICAgYmVfZGFpID09IE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX0VDX1RYKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRpbmdfYnVpbGRfbWF0cml4KGludCBmZWRhaV9pZCwgaW50IHNlc3NfdHlwZSwKKwkJCQkJIGludCBwYXRoX3R5cGUsIGludCBwZXJmX21vZGUpCit7CisJaW50IGksIHBvcnRfdHlwZSwgaiwgbnVtX2NvcHBzID0gMDsKKwlzdHJ1Y3Qgcm91dGVfcGF5bG9hZCBwYXlsb2FkOworCisJcG9ydF90eXBlID0gKChwYXRoX3R5cGUgPT0gQURNX1BBVEhfUExBWUJBQ0sgIHx8CisJCSAgICAgcGF0aF90eXBlID09IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpID8KKwkJTVNNX0FGRV9QT1JUX1RZUEVfUlggOiBNU01fQUZFX1BPUlRfVFlQRV9UWCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7CisJCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKKwkJICAgKGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCkgPT0gcG9ydF90eXBlKSAmJgorCQkgICAobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCisJCSAgICh0ZXN0X2JpdChmZWRhaV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnMpKSkgeworCQkJZm9yIChqID0gMDsgaiA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaisrKSB7CisJCQkJdW5zaWduZWQgbG9uZyBjb3BwID0KKwkJCQkgICAgICBzZXNzaW9uX2NvcHBfbWFwW2ZlZGFpX2lkXVtzZXNzX3R5cGVdW2ldOworCQkJCWlmICh0ZXN0X2JpdChqLCAmY29wcCkpIHsKKwkJCQkJcGF5bG9hZC5wb3J0X2lkW251bV9jb3Bwc10gPQorCQkJCQkJCW1zbV9iZWRhaXNbaV0ucG9ydF9pZDsKKwkJCQkJcGF5bG9hZC5jb3BwX2lkeFtudW1fY29wcHNdID0gajsKKwkJCQkJbnVtX2NvcHBzKys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKG51bV9jb3BwcykgeworCQlwYXlsb2FkLm51bV9jb3BwcyA9IG51bV9jb3BwczsKKwkJcGF5bG9hZC5zZXNzaW9uX2lkID0gZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc190eXBlXS5zdHJtX2lkOworCQlwYXlsb2FkLmFwcF90eXBlID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3NfdHlwZV0uYXBwX3R5cGU7CisJCXBheWxvYWQuYWNkYl9kZXZfaWQgPQorCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc190eXBlXS5hY2RiX2Rldl9pZDsKKwkJcGF5bG9hZC5zYW1wbGVfcmF0ZSA9CisJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzX3R5cGVdLnNhbXBsZV9yYXRlOworCQlhZG1fbWF0cml4X21hcChwYXRoX3R5cGUsIHBheWxvYWQsIHBlcmZfbW9kZSk7CisJCW1zbV9wY21fcm91dG5nX2NmZ19tYXRyaXhfbWFwX3BwKHBheWxvYWQsIHBhdGhfdHlwZSwgcGVyZl9tb2RlKTsKKwl9Cit9CisKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX3JlZ19wc3Rocl9zdHJlYW0oaW50IGZlZGFpX2lkLCBpbnQgZHNwc3RfaWQsCisJCQkJICAgICAgaW50IHN0cmVhbV90eXBlKQoreworCWludCBpLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgcG9ydF90eXBlOworCXUzMiBtb2RlID0gMDsKKworCWlmIChmZWRhaV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7CisJCS8qIGJhZCBJRCBhc3NpZ25lZCBpbiBtYWNoaW5lIGRyaXZlciAqLworCQlwcl9lcnIoIiVzOiBiYWQgTU0gSURcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJlYW1fdHlwZSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7CisJCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1JYOworCX0gZWxzZSB7CisJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7CisJCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1RYOworCX0KKworCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisKKwlmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLnN0cm1faWQgPSBkc3BzdF9pZDsKKwlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7CisJCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKKwkJICAgIChhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW2ldLnBvcnRfaWQpID09IHBvcnRfdHlwZSkgJiYKKwkJICAgIChtc21fYmVkYWlzW2ldLmFjdGl2ZSkgJiYKKwkJICAgICh0ZXN0X2JpdChmZWRhaV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnMpKSkgeworCQkJbW9kZSA9IGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCk7CisJCQlhZG1fY29ubmVjdF9hZmVfcG9ydChtb2RlLCBkc3BzdF9pZCwKKwkJCQkJICAgICBtc21fYmVkYWlzW2ldLnBvcnRfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworfQorCitpbnQgbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfY29tcHJfc3RyZWFtKGludCBmZV9pZCwgaW50IHBlcmZfbW9kZSwKKwkJCQkJICBpbnQgZHNwc3RfaWQsIGludCBzdHJlYW1fdHlwZSwKKwkJCQkJICB1aW50MzJfdCBjb21wcl9wYXNzdGhyX21vZGUpCit7CisJaW50IGksIGosIHNlc3Npb25fdHlwZSwgcGF0aF90eXBlLCBwb3J0X3R5cGUsIHRvcG9sb2d5LCBudW1fY29wcHMgPSAwOworCXN0cnVjdCByb3V0ZV9wYXlsb2FkIHBheWxvYWQ7CisJdTMyIGNoYW5uZWxzLCBzYW1wbGVfcmF0ZTsKKwl1MTYgYml0X3dpZHRoID0gMTY7CisKKwlwcl9kZWJ1ZygiJXM6ZmVfaWRbJWRdIHBlcmZfbW9kZVslZF0gaWRbJWRdIHN0cmVhbV90eXBlWyVkXSBwYXNzdFslZF0iLAorCQkgX19mdW5jX18sIGZlX2lkLCBwZXJmX21vZGUsIGRzcHN0X2lkLAorCQkgc3RyZWFtX3R5cGUsIGNvbXByX3Bhc3N0aHJfbW9kZSk7CisKKwlpZiAoZmVfaWQgPiBNU01fRlJPTlRFTkRfREFJX01NX01BWF9JRCkgeworCQkvKiBiYWQgSUQgYXNzaWduZWQgaW4gbWFjaGluZSBkcml2ZXIgKi8KKwkJcHJfZXJyKCIlczogYmFkIE1NIElEICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7CisJCWlmIChjb21wcl9wYXNzdGhyX21vZGUgIT0gTEVHQUNZX1BDTSkKKwkJCXBhdGhfdHlwZSA9IEFETV9QQVRIX0NPTVBSRVNTRURfUlg7CisJCWVsc2UKKwkJCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOworCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9SWDsKKwl9IGVsc2UgaWYgKHN0cmVhbV90eXBlID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7CisJCXBhdGhfdHlwZSA9IEFETV9QQVRIX0xJVkVfUkVDOworCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9UWDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLCBfX2Z1bmNfXywgc3RyZWFtX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCisJcGF5bG9hZC5udW1fY29wcHMgPSAwOyAvKiBvbmx5IFJYIG5lZWRzIHRvIHVzZSBwYXlsb2FkICovCisJZmVfZGFpX21hcFtmZV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkID0gZHNwc3RfaWQ7CisJLyogcmUtZW5hYmxlIEVRIGlmIGFjdGl2ZSAqLworCW1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXMoZmVfaWQpOworCWZvciAoaSA9IDA7IGkgPCBNU01fQkFDS0VORF9EQUlfTUFYOyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGZlX2lkLCAmbXNtX2JlZGFpc1tpXS5mZV9zZXNzaW9ucykpCisJCQltc21fYmVkYWlzW2ldLmNvbXByX3Bhc3N0aHJfbW9kZSA9IGNvbXByX3Bhc3N0aHJfbW9kZTsKKworCQlpZiAoIWlzX2JlX2RhaV9leHRwcm9jKGkpICYmCisJCQkoYWZlX2dldF9wb3J0X3R5cGUobXNtX2JlZGFpc1tpXS5wb3J0X2lkKSA9PQorCQkJcG9ydF90eXBlKSAmJgorCQkJKG1zbV9iZWRhaXNbaV0uYWN0aXZlKSAmJgorCQkJKHRlc3RfYml0KGZlX2lkLCAmbXNtX2JlZGFpc1tpXS5mZV9zZXNzaW9ucykpKSB7CisJCQlpbnQgYXBwX3R5cGUsIGFwcF90eXBlX2lkeCwgY29wcF9pZHgsIGFjZGJfZGV2X2lkOworCisJCQkvKgorCQkJICogY2hlY2sgaWYgQURNIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQKKwkJCSAqIGNoYW5uZWwgbWFwcGluZyB0aGFuIGJhY2tlbmQKKwkJCSAqLworCQkJaWYgKCFtc21fYmVkYWlzW2ldLmFkbV9vdmVycmlkZV9jaCkKKwkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbaV0uY2hhbm5lbDsKKwkJCWVsc2UKKwkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbaV0uYWRtX292ZXJyaWRlX2NoOworCisJCQliaXRfd2lkdGggPSBtc21fcm91dGluZ19nZXRfYml0X3dpZHRoKAorCQkJCQkJbXNtX2JlZGFpc1tpXS5mb3JtYXQpOworCQkJYXBwX3R5cGUgPQorCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZV9pZF1bc2Vzc2lvbl90eXBlXS5hcHBfdHlwZTsKKwkJCWlmIChhcHBfdHlwZSkgeworCQkJCWFwcF90eXBlX2lkeCA9CisJCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KAorCQkJCQkJYXBwX3R5cGUpOworCQkJCXNhbXBsZV9yYXRlID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVfaWRdW3Nlc3Npb25fdHlwZV0uc2FtcGxlX3JhdGU7CisJCQkJYml0X3dpZHRoID0KKwkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOworCQkJfSBlbHNlIHsKKwkJCQlzYW1wbGVfcmF0ZSA9IG1zbV9iZWRhaXNbaV0uc2FtcGxlX3JhdGU7CisJCQl9CisJCQlhY2RiX2Rldl9pZCA9CisJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlX2lkXVtzZXNzaW9uX3R5cGVdLmFjZGJfZGV2X2lkOworCQkJdG9wb2xvZ3kgPSBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KHBhdGhfdHlwZSwKKwkJCQkJCWZlX2lkLCBzZXNzaW9uX3R5cGUpOworCQkJaWYgKGNvbXByX3Bhc3N0aHJfbW9kZSA9PSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RTRCkKKwkJCQl0b3BvbG9neSA9IENPTVBSRVNTX1BBU1NUSFJPVUdIX05PTkVfVE9QT0xPR1k7CisJCQlwcl9lcnIoIiVzOiBCZWZvcmUgYWRtIG9wZW4gdG9wb2xvZ3kgJWRcbiIsIF9fZnVuY19fLAorCQkJCXRvcG9sb2d5KTsKKworCQkJY29wcF9pZHggPQorCQkJCWFkbV9vcGVuKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCwKKwkJCQkJIHBhdGhfdHlwZSwgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLAorCQkJCQkgdG9wb2xvZ3ksIHBlcmZfbW9kZSwgYml0X3dpZHRoLAorCQkJCQkgYXBwX3R5cGUsIGFjZGJfZGV2X2lkKTsKKwkJCWlmICgoY29wcF9pZHggPCAwKSB8fAorCQkJCShjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7CisJCQkJcHJfZXJyKCIlczphZG0gb3BlbiBmYWlsZWQgY29wcGlkOiVkXG4iLAorCQkJCV9fZnVuY19fLCBjb3BwX2lkeCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBzZXQgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAorCQkJCSBfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgaSk7CisJCQlzZXRfYml0KGNvcHBfaWR4LAorCQkJCSZzZXNzaW9uX2NvcHBfbWFwW2ZlX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKKworCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCisJCQkJc2FtcGxlX3JhdGUsCisJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSkpCisJCQkJYWRtX2NvcHBfbWZjX2NmZygKKwkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgeworCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9CisJCQkJc2Vzc2lvbl9jb3BwX21hcFtmZV9pZF1bc2Vzc2lvbl90eXBlXVtpXTsKKwkJCQlpZiAodGVzdF9iaXQoaiwgJmNvcHApKSB7CisJCQkJCXBheWxvYWQucG9ydF9pZFtudW1fY29wcHNdID0KKwkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkOworCQkJCQlwYXlsb2FkLmNvcHBfaWR4W251bV9jb3Bwc10gPSBqOworCQkJCQludW1fY29wcHMrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoY29tcHJfcGFzc3Rocl9tb2RlICE9IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfRFNEKSB7CisJCQkJbXNtX3JvdXRpbmdfc2VuZF9kZXZpY2VfcHBfcGFyYW1zKAorCQkJCW1zbV9iZWRhaXNbaV0ucG9ydF9pZCwKKwkJCQljb3BwX2lkeCk7CisJCQl9CisJCX0KKwl9CisJaWYgKG51bV9jb3BwcykgeworCQlwYXlsb2FkLm51bV9jb3BwcyA9IG51bV9jb3BwczsKKwkJcGF5bG9hZC5zZXNzaW9uX2lkID0gZmVfZGFpX21hcFtmZV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkOworCQlwYXlsb2FkLmFwcF90eXBlID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVfaWRdW3Nlc3Npb25fdHlwZV0uYXBwX3R5cGU7CisJCXBheWxvYWQuYWNkYl9kZXZfaWQgPQorCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZV9pZF1bc2Vzc2lvbl90eXBlXS5hY2RiX2Rldl9pZDsKKwkJYWRtX21hdHJpeF9tYXAocGF0aF90eXBlLCBwYXlsb2FkLCBwZXJmX21vZGUpOworCQltc21fcGNtX3JvdXRuZ19jZmdfbWF0cml4X21hcF9wcChwYXlsb2FkLCBwYXRoX3R5cGUsIHBlcmZfbW9kZSk7CisJfQorCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBtc21fcGNtX3JvdXRpbmdfZ2V0X3ZvY19zZXNzaW9uaWQodTE2IHZhbCkKK3sKKwl1MzIgc2Vzc2lvbl9pZDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFOgorCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFX1NFU1NJT05fTkFNRSk7CisJCWJyZWFrOworCWNhc2UgTVNNX0ZST05URU5EX0RBSV9WT0xURToKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0xURV9TRVNTSU9OX05BTUUpOworCQlicmVhazsKKwljYXNlIE1TTV9GUk9OVEVORF9EQUlfVk9XTEFOOgorCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFZPV0xBTl9TRVNTSU9OX05BTUUpOworCQlicmVhazsKKwljYXNlIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyOgorCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFMl9TRVNTSU9OX05BTUUpOworCQlicmVhazsKKwljYXNlIE1TTV9GUk9OVEVORF9EQUlfUUNIQVQ6CisJCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoUUNIQVRfU0VTU0lPTl9OQU1FKTsKKwkJYnJlYWs7CisJY2FzZSBNU01fRlJPTlRFTkRfREFJX1ZPSVA6CisJCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpOworCQlicmVhazsKKwljYXNlIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTE6CisJCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VNTU9ERTFfTkFNRSk7CisJCWJyZWFrOworCWNhc2UgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMjoKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMl9OQU1FKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2Vzc2lvbl9pZCA9IDA7CisJfQorCisJcHJfZGVidWcoIiVzIHNlc3Npb25faWQgMHgleCIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKwlyZXR1cm4gc2Vzc2lvbl9pZDsKK30KKworaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShpbnQgZmVkYWlfaWQsIGludCBwZXJmX21vZGUsCisJCQkJCWludCBkc3BzdF9pZCwgaW50IHN0cmVhbV90eXBlKQoreworCWludCBpLCBqLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgcG9ydF90eXBlLCB0b3BvbG9neSwgbnVtX2NvcHBzID0gMDsKKwlzdHJ1Y3Qgcm91dGVfcGF5bG9hZCBwYXlsb2FkOworCXUzMiBjaGFubmVscywgc2FtcGxlX3JhdGU7CisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlID0gMTY7CisKKwlpZiAoZmVkYWlfaWQgPiBNU01fRlJPTlRFTkRfREFJX01NX01BWF9JRCkgeworCQkvKiBiYWQgSUQgYXNzaWduZWQgaW4gbWFjaGluZSBkcml2ZXIgKi8KKwkJcHJfZXJyKCIlczogYmFkIE1NIElEICVkXG4iLCBfX2Z1bmNfXywgZmVkYWlfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7CisJCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOworCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9SWDsKKwl9IGVsc2UgeworCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7CisJCXBhdGhfdHlwZSA9IEFETV9QQVRIX0xJVkVfUkVDOworCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9UWDsKKwl9CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCisJcGF5bG9hZC5udW1fY29wcHMgPSAwOyAvKiBvbmx5IFJYIG5lZWRzIHRvIHVzZSBwYXlsb2FkICovCisJZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkID0gZHNwc3RfaWQ7CisJZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5wZXJmX21vZGUgPSBwZXJmX21vZGU7CisKKwkvKiByZS1lbmFibGUgRVEgaWYgYWN0aXZlICovCisJbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlcyhmZWRhaV9pZCk7CisJZm9yIChpID0gMDsgaSA8IE1TTV9CQUNLRU5EX0RBSV9NQVg7IGkrKykgeworCQlpZiAoIWlzX2JlX2RhaV9leHRwcm9jKGkpICYmCisJCSAgIChhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW2ldLnBvcnRfaWQpID09IHBvcnRfdHlwZSkgJiYKKwkJICAgKG1zbV9iZWRhaXNbaV0uYWN0aXZlKSAmJgorCQkgICAodGVzdF9iaXQoZmVkYWlfaWQsICZtc21fYmVkYWlzW2ldLmZlX3Nlc3Npb25zKSkpIHsKKwkJCWludCBhcHBfdHlwZSwgYXBwX3R5cGVfaWR4LCBjb3BwX2lkeCwgYWNkYl9kZXZfaWQ7CisJCQkvKgorCQkJICogY2hlY2sgaWYgQURNIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQKKwkJCSAqIGNoYW5uZWwgbWFwcGluZyB0aGFuIGJhY2tlbmQKKwkJCSAqLworCQkJaWYgKCFtc21fYmVkYWlzW2ldLmFkbV9vdmVycmlkZV9jaCkKKwkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbaV0uY2hhbm5lbDsKKwkJCWVsc2UKKwkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbaV0uYWRtX292ZXJyaWRlX2NoOworCQkJbXNtX2JlZGFpc1tpXS5jb21wcl9wYXNzdGhyX21vZGUgPQorCQkJCUxFR0FDWV9QQ007CisKKwkJCWJpdHNfcGVyX3NhbXBsZSA9IG1zbV9yb3V0aW5nX2dldF9iaXRfd2lkdGgoCisJCQkJCQltc21fYmVkYWlzW2ldLmZvcm1hdCk7CisKKwkJCWFwcF90eXBlID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uYXBwX3R5cGU7CisJCQlpZiAoYXBwX3R5cGUpIHsKKwkJCQlhcHBfdHlwZV9pZHggPQorCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKKwkJCQlzYW1wbGVfcmF0ZSA9CisJCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS4KKwkJCQkJc2FtcGxlX3JhdGU7CisJCQkJYml0c19wZXJfc2FtcGxlID0KKwkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOworCQkJfSBlbHNlCisJCQkJc2FtcGxlX3JhdGUgPSBtc21fYmVkYWlzW2ldLnNhbXBsZV9yYXRlOworCisJCQlhY2RiX2Rldl9pZCA9CisJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmFjZGJfZGV2X2lkOworCQkJdG9wb2xvZ3kgPSBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KHBhdGhfdHlwZSwKKwkJCQkJCWZlZGFpX2lkLCBzZXNzaW9uX3R5cGUpOworCQkJY29wcF9pZHggPSBhZG1fb3Blbihtc21fYmVkYWlzW2ldLnBvcnRfaWQsIHBhdGhfdHlwZSwKKwkJCQkJICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdG9wb2xvZ3ksCisJCQkJCSAgICBwZXJmX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgIGFwcF90eXBlLCBhY2RiX2Rldl9pZCk7CisJCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKKwkJCQkoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQkJCXByX2VycigiJXM6IGFkbSBvcGVuIGZhaWxlZCBjb3BwX2lkeDolZFxuIiwKKwkJCQkJX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAorCQkJCSBfX2Z1bmNfXywgZmVkYWlfaWQsIHNlc3Npb25fdHlwZSwgaSk7CisJCQlzZXRfYml0KGNvcHBfaWR4LAorCQkJCSZzZXNzaW9uX2NvcHBfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKKworCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCisJCQkJc2FtcGxlX3JhdGUsCisJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSkpCisJCQkJYWRtX2NvcHBfbWZjX2NmZygKKwkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBjb3BwX2lkeCwKKwkJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgeworCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9CisJCQkJICAgIHNlc3Npb25fY29wcF9tYXBbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV1baV07CisJCQkJaWYgKHRlc3RfYml0KGosICZjb3BwKSkgeworCQkJCQlwYXlsb2FkLnBvcnRfaWRbbnVtX2NvcHBzXSA9CisJCQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkOworCQkJCQlwYXlsb2FkLmNvcHBfaWR4W251bV9jb3Bwc10gPSBqOworCQkJCQludW1fY29wcHMrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoKHBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCisJCQkJKG1zbV9iZWRhaXNbaV0uY29tcHJfcGFzc3Rocl9tb2RlID09CisJCQkJTEVHQUNZX1BDTSkpCisJCQkJbXNtX3BjbV9yb3V0aW5nX2NmZ19wcChtc21fYmVkYWlzW2ldLnBvcnRfaWQsCisJCQkJCQkgICAgICAgY29wcF9pZHgsIHRvcG9sb2d5LAorCQkJCQkJICAgICAgIGNoYW5uZWxzKTsKKwkJfQorCX0KKwlpZiAobnVtX2NvcHBzKSB7CisJCXBheWxvYWQubnVtX2NvcHBzID0gbnVtX2NvcHBzOworCQlwYXlsb2FkLnNlc3Npb25faWQgPSBmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLnN0cm1faWQ7CisJCXBheWxvYWQuYXBwX3R5cGUgPQorCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5hcHBfdHlwZTsKKwkJcGF5bG9hZC5hY2RiX2Rldl9pZCA9CisJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmFjZGJfZGV2X2lkOworCQlwYXlsb2FkLnNhbXBsZV9yYXRlID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uc2FtcGxlX3JhdGU7CisJCWFkbV9tYXRyaXhfbWFwKHBhdGhfdHlwZSwgcGF5bG9hZCwgcGVyZl9tb2RlKTsKKwkJbXNtX3BjbV9yb3V0bmdfY2ZnX21hdHJpeF9tYXBfcHAocGF5bG9hZCwgcGF0aF90eXBlLCBwZXJmX21vZGUpOworCX0KKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW1fdjIoaW50IGZlZGFpX2lkLCBpbnQgcGVyZl9tb2RlLAorCQkJCSAgICAgIGludCBkc3BzdF9pZCwgaW50IHN0cmVhbV90eXBlLAorCQkJCSAgICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZXZ0IGV2ZW50X2luZm8pCit7CisJaWYgKG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShmZWRhaV9pZCwgcGVyZl9tb2RlLCBkc3BzdF9pZCwKKwkJCQkgICAgICAgc3RyZWFtX3R5cGUpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWcgcGh5IHN0cmVhbVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZmVfZGFpX21hcFtmZWRhaV9pZF1bU0VTU0lPTl9UWVBFX1JYXS5ldmVudF9pbmZvID0gZXZlbnRfaW5mbzsKKwllbHNlCisJCWZlX2RhaV9tYXBbZmVkYWlfaWRdW1NFU1NJT05fVFlQRV9UWF0uZXZlbnRfaW5mbyA9IGV2ZW50X2luZm87CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oaW50IGZlZGFpX2lkLCBpbnQgc3RyZWFtX3R5cGUpCit7CisJaW50IGksIHBvcnRfdHlwZSwgc2Vzc2lvbl90eXBlLCBwYXRoX3R5cGUsIHRvcG9sb2d5OworCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhICpmZGFpOworCisJaWYgKGZlZGFpX2lkID4gTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQpIHsKKwkJLyogYmFkIElEIGFzc2lnbmVkIGluIG1hY2hpbmUgZHJpdmVyICovCisJCXByX2VycigiJXM6IGJhZCBNTSBJRFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0cmVhbV90eXBlID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcG9ydF90eXBlID0gTVNNX0FGRV9QT1JUX1RZUEVfUlg7CisJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7CisJfSBlbHNlIHsKKwkJcG9ydF90eXBlID0gTVNNX0FGRV9QT1JUX1RZUEVfVFg7CisJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7CisJfQorCisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7CisJCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKKwkJICAgKGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCkgPT0gcG9ydF90eXBlKSAmJgorCQkgICAobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCisJCSAgICh0ZXN0X2JpdChmZWRhaV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnMpKSkgeworCQkJaW50IGlkeDsKKwkJCXVuc2lnbmVkIGxvbmcgY29wcCA9CisJCQkJc2Vzc2lvbl9jb3BwX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXVtpXTsKKwkJCWZkYWkgPSAmZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXTsKKworCQkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKQorCQkJCWlmICh0ZXN0X2JpdChpZHgsICZjb3BwKSkKKwkJCQkJYnJlYWs7CisKKwkJCWlmIChpZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUIHx8IGlkeCA8IDApIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IGNvcHAgaWR4IGlzIGludmFsaWQsIGV4aXRpbmdcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXRvcG9sb2d5ID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeCgKKwkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBpZHgpOworCQkJYWRtX2Nsb3NlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCwgZmRhaS0+cGVyZl9tb2RlLCBpZHgpOworCQkJcHJfZGVidWcoIiVzOmNvcHA6JWxkLGlkeCBiaXQgZmU6JWQsdHlwZTolZCxiZTolZFxuIiwKKwkJCQkgX19mdW5jX18sIGNvcHAsIGZlZGFpX2lkLCBzZXNzaW9uX3R5cGUsIGkpOworCQkJY2xlYXJfYml0KGlkeCwKKwkJCQkgICZzZXNzaW9uX2NvcHBfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKKwkJCWlmICgodG9wb2xvZ3kgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQgfHwKKwkJCQl0b3BvbG9neSA9PSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpICYmCisJCQkgICAgKGZkYWktPnBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCisJCQkgICAgKG1zbV9iZWRhaXNbaV0uY29tcHJfcGFzc3Rocl9tb2RlID09CisJCQkJCUxFR0FDWV9QQ00pKQorCQkJCW1zbV9wY21fcm91dGluZ19kZWluaXRfcHAobXNtX2JlZGFpc1tpXS5wb3J0X2lkLAorCQkJCQkJCSAgdG9wb2xvZ3kpOworCQl9CisJfQorCisJZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkID0gSU5WQUxJRF9TRVNTSU9OOworCWZlX2RhaV9tYXBbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uYmVfc3JhdGUgPSAwOworCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKK30KKworLyogQ2hlY2sgaWYgRkUvQkUgcm91dGUgaXMgc2V0ICovCitzdGF0aWMgYm9vbCBtc21fcGNtX3JvdXRpbmdfcm91dGVfaXNfc2V0KHUxNiBiZV9pZCwgdTE2IGZlX2lkKQoreworCWJvb2wgcmMgPSBmYWxzZTsKKworCWlmIChmZV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7CisJCS8qIHJlY2hlY2sgRkUgSUQgaW4gdGhlIG1peGVyIGNvbnRyb2wgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KKwkJcHJfZXJyKCIlczogYmFkIE1NIElEXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAodGVzdF9iaXQoZmVfaWQsICZtc21fYmVkYWlzW2JlX2lkXS5mZV9zZXNzaW9ucykpCisJCXJjID0gdHJ1ZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNtX3BjbV9yb3V0aW5nX3Byb2Nlc3NfYXVkaW8odTE2IHJlZywgdTE2IHZhbCwgaW50IHNldCkKK3sKKwlpbnQgc2Vzc2lvbl90eXBlLCBwYXRoX3R5cGUsIHRvcG9sb2d5OworCXUzMiBjaGFubmVscywgc2FtcGxlX3JhdGU7CisJdWludDE2X3QgYml0c19wZXJfc2FtcGxlID0gMTY7CisJc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgKmZkYWk7CisKKwlwcl9kZWJ1ZygiJXM6IHJlZyAleCB2YWwgJXggc2V0ICV4XG4iLCBfX2Z1bmNfXywgcmVnLCB2YWwsIHNldCk7CisKKwlpZiAodmFsID4gTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQpIHsKKwkJLyogcmVjaGVjayBGRSBJRCBpbiB0aGUgbWl4ZXIgY29udHJvbCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLworCQlwcl9lcnIoIiVzOiBiYWQgTU0gSURcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCkgPT0KKwkJTVNNX0FGRV9QT1JUX1RZUEVfUlgpIHsKKwkJc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1JYOworCQlpZiAobXNtX2JlZGFpc1tyZWddLmNvbXByX3Bhc3N0aHJfbW9kZSAhPSBMRUdBQ1lfUENNKQorCQkJcGF0aF90eXBlID0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWDsKKwkJZWxzZQorCQkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7CisJfSBlbHNlIHsKKwkJc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOworCQlwYXRoX3R5cGUgPSBBRE1fUEFUSF9MSVZFX1JFQzsKKwl9CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCWlmIChzZXQpIHsKKwkJaWYgKCF0ZXN0X2JpdCh2YWwsICZtc21fYmVkYWlzW3JlZ10uZmVfc2Vzc2lvbnMpICYmCisJCQkoKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkID09IFZPSUNFX1BMQVlCQUNLX1RYKSB8fAorCQkJKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkID09IFZPSUNFMl9QTEFZQkFDS19UWCkpKQorCQkJdm9jX3N0YXJ0X3BsYXliYWNrKHNldCwgbXNtX2JlZGFpc1tyZWddLnBvcnRfaWQpOworCisJCXNldF9iaXQodmFsLCAmbXNtX2JlZGFpc1tyZWddLmZlX3Nlc3Npb25zKTsKKwkJZmRhaSA9ICZmZV9kYWlfbWFwW3ZhbF1bc2Vzc2lvbl90eXBlXTsKKwkJaWYgKG1zbV9iZWRhaXNbcmVnXS5hY3RpdmUgJiYgZmRhaS0+c3RybV9pZCAhPQorCQkJSU5WQUxJRF9TRVNTSU9OKSB7CisJCQlpbnQgYXBwX3R5cGUsIGFwcF90eXBlX2lkeCwgY29wcF9pZHgsIGFjZGJfZGV2X2lkOworCQkJLyoKKwkJCSAqIGNoZWNrIGlmIEFETSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50CisJCQkgKiBjaGFubmVsIG1hcHBpbmcgdGhhbiBiYWNrZW5kCisJCQkgKi8KKwkJCWlmICghbXNtX2JlZGFpc1tyZWddLmFkbV9vdmVycmlkZV9jaCkKKwkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbcmVnXS5jaGFubmVsOworCQkJZWxzZQorCQkJCWNoYW5uZWxzID0gbXNtX2JlZGFpc1tyZWddLmFkbV9vdmVycmlkZV9jaDsKKwkJCWlmIChzZXNzaW9uX3R5cGUgPT0gU0VTU0lPTl9UWVBFX1RYICYmCisJCQkgICAgZmRhaS0+YmVfc3JhdGUgJiYKKwkJCSAgICAoZmRhaS0+YmVfc3JhdGUgIT0gbXNtX2JlZGFpc1tyZWddLnNhbXBsZV9yYXRlKSkgeworCQkJCXByX2RlYnVnKCIlczogZmx1c2ggc3RybSAlZCBkaWZmIEJFIHJhdGVzXG4iLAorCQkJCQlfX2Z1bmNfXywgZmRhaS0+c3RybV9pZCk7CisKKwkJCQlpZiAoZmRhaS0+ZXZlbnRfaW5mby5ldmVudF9mdW5jKQorCQkJCQlmZGFpLT5ldmVudF9pbmZvLmV2ZW50X2Z1bmMoCisJCQkJCQlNU01fUENNX1JUX0VWVF9CVUZfUkVDRkcsCisJCQkJCQlmZGFpLT5ldmVudF9pbmZvLnByaXZfZGF0YSk7CisJCQkJZmRhaS0+YmVfc3JhdGUgPSAwOyAvKiBtaWdodCBub3QgbmVlZCBpdCAqLworCQkJfQorCisJCQliaXRzX3Blcl9zYW1wbGUgPSBtc21fcm91dGluZ19nZXRfYml0X3dpZHRoKAorCQkJCQkJbXNtX2JlZGFpc1tyZWddLmZvcm1hdCk7CisKKwkJCWFwcF90eXBlID0KKwkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW3ZhbF1bc2Vzc2lvbl90eXBlXS5hcHBfdHlwZTsKKwkJCWlmIChhcHBfdHlwZSkgeworCQkJCWFwcF90eXBlX2lkeCA9CisJCQkJbXNtX3BjbV9yb3V0aW5nX2dldF9hcHBfdHlwZV9pZHgoYXBwX3R5cGUpOworCQkJCXNhbXBsZV9yYXRlID0KKwkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW3ZhbF1bc2Vzc2lvbl90eXBlXS4KKwkJCQkJc2FtcGxlX3JhdGU7CisJCQkJYml0c19wZXJfc2FtcGxlID0KKwkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOworCQkJfSBlbHNlCisJCQkJc2FtcGxlX3JhdGUgPSBtc21fYmVkYWlzW3JlZ10uc2FtcGxlX3JhdGU7CisKKwkJCXRvcG9sb2d5ID0gbXNtX3JvdXRpbmdfZ2V0X2FkbV90b3BvbG9neShwYXRoX3R5cGUsIHZhbCwKKwkJCQkJCXNlc3Npb25fdHlwZSk7CisJCQlhY2RiX2Rldl9pZCA9CisJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW3ZhbF1bc2Vzc2lvbl90eXBlXS5hY2RiX2Rldl9pZDsKKwkJCWNvcHBfaWR4ID0gYWRtX29wZW4obXNtX2JlZGFpc1tyZWddLnBvcnRfaWQsIHBhdGhfdHlwZSwKKwkJCQkJICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdG9wb2xvZ3ksCisJCQkJCSAgICBmZGFpLT5wZXJmX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgIGFwcF90eXBlLCBhY2RiX2Rldl9pZCk7CisJCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKKwkJCSAgICAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQkJCXByX2VycigiJXM6IGFkbSBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAorCQkJCSBfX2Z1bmNfXywgdmFsLCBzZXNzaW9uX3R5cGUsIHJlZyk7CisJCQlzZXRfYml0KGNvcHBfaWR4LAorCQkJCSZzZXNzaW9uX2NvcHBfbWFwW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddKTsKKworCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCisJCQkJc2FtcGxlX3JhdGUsCisJCQkJbXNtX2JlZGFpc1tyZWddLnNhbXBsZV9yYXRlKSkKKwkJCQlhZG1fY29wcF9tZmNfY2ZnKAorCQkJCQltc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgY29wcF9pZHgsCisJCQkJCW1zbV9iZWRhaXNbcmVnXS5zYW1wbGVfcmF0ZSk7CisKKwkJCWlmIChzZXNzaW9uX3R5cGUgPT0gU0VTU0lPTl9UWVBFX1JYICYmCisJCQkgICAgZmRhaS0+ZXZlbnRfaW5mby5ldmVudF9mdW5jKQorCQkJCWZkYWktPmV2ZW50X2luZm8uZXZlbnRfZnVuYygKKwkJCQkJTVNNX1BDTV9SVF9FVlRfREVWU1dJVENILAorCQkJCQlmZGFpLT5ldmVudF9pbmZvLnByaXZfZGF0YSk7CisKKwkJCW1zbV9wY21fcm91dGluZ19idWlsZF9tYXRyaXgodmFsLCBzZXNzaW9uX3R5cGUsCisJCQkJCQkgICAgIHBhdGhfdHlwZSwKKwkJCQkJCSAgICAgZmRhaS0+cGVyZl9tb2RlKTsKKwkJCWlmICgoZmRhaS0+cGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkgJiYKKwkJCQkobXNtX2JlZGFpc1tyZWddLmNvbXByX3Bhc3N0aHJfbW9kZSA9PQorCQkJCQlMRUdBQ1lfUENNKSkKKwkJCQltc21fcGNtX3JvdXRpbmdfY2ZnX3BwKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkLAorCQkJCQkJICAgICAgIGNvcHBfaWR4LCB0b3BvbG9neSwKKwkJCQkJCSAgICAgICBjaGFubmVscyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodGVzdF9iaXQodmFsLCAmbXNtX2JlZGFpc1tyZWddLmZlX3Nlc3Npb25zKSAmJgorCQkJKChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRV9QTEFZQkFDS19UWCkgfHwKKwkJCShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRTJfUExBWUJBQ0tfVFgpKSkKKwkJCXZvY19zdGFydF9wbGF5YmFjayhzZXQsIG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkKTsKKwkJY2xlYXJfYml0KHZhbCwgJm1zbV9iZWRhaXNbcmVnXS5mZV9zZXNzaW9ucyk7CisJCWZkYWkgPSAmZmVfZGFpX21hcFt2YWxdW3Nlc3Npb25fdHlwZV07CisJCWlmIChtc21fYmVkYWlzW3JlZ10uYWN0aXZlICYmIGZkYWktPnN0cm1faWQgIT0KKwkJCUlOVkFMSURfU0VTU0lPTikgeworCQkJaW50IGlkeDsKKwkJCWludCBwb3J0X2lkOworCQkJdW5zaWduZWQgbG9uZyBjb3BwID0KKwkJCQlzZXNzaW9uX2NvcHBfbWFwW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKQorCQkJCWlmICh0ZXN0X2JpdChpZHgsICZjb3BwKSkKKwkJCQkJYnJlYWs7CisKKwkJCXBvcnRfaWQgPSBtc21fYmVkYWlzW3JlZ10ucG9ydF9pZDsKKwkJCXRvcG9sb2d5ID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChwb3J0X2lkLAorCQkJCQkJCQkgICAgICBpZHgpOworCQkJYWRtX2Nsb3NlKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkLCBmZGFpLT5wZXJmX21vZGUsCisJCQkJICBpZHgpOworCQkJcHJfZGVidWcoIiVzOiBjb3BwOiAlbGQsIHJlc2V0IGlkeCBiaXQgZmU6JWQsIHR5cGU6ICVkLCBiZTolZCB0b3BvbG9neT0weCV4XG4iLAorCQkJCSBfX2Z1bmNfXywgY29wcCwgdmFsLCBzZXNzaW9uX3R5cGUsIHJlZywKKwkJCQkgdG9wb2xvZ3kpOworCQkJY2xlYXJfYml0KGlkeCwKKwkJCQkgICZzZXNzaW9uX2NvcHBfbWFwW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddKTsKKwkJCWlmICgodG9wb2xvZ3kgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQgfHwKKwkJCQl0b3BvbG9neSA9PSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpICYmCisJCQkgICAgKGZkYWktPnBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCisJCQkgICAgKG1zbV9iZWRhaXNbcmVnXS5jb21wcl9wYXNzdGhyX21vZGUgPT0KKwkJCQlMRUdBQ1lfUENNKSkKKwkJCQltc21fcGNtX3JvdXRpbmdfZGVpbml0X3BwKAorCQkJCQkJbXNtX2JlZGFpc1tyZWddLnBvcnRfaWQsCisJCQkJCQl0b3BvbG9neSk7CisJCQltc21fcGNtX3JvdXRpbmdfYnVpbGRfbWF0cml4KHZhbCwgc2Vzc2lvbl90eXBlLAorCQkJCQkJICAgICBwYXRoX3R5cGUsCisJCQkJCQkgICAgIGZkYWktPnBlcmZfbW9kZSk7CisJCX0KKwl9CisJaWYgKChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRV9SRUNPUkRfUlgpCisJCQl8fCAobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQgPT0gVk9JQ0VfUkVDT1JEX1RYKSkKKwkJdm9jX3N0YXJ0X3JlY29yZChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgc2V0LCB2b2Nfc2Vzc2lvbl9pZCk7CisKKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlmICh0ZXN0X2JpdChtYy0+c2hpZnQsICZtc21fYmVkYWlzW21jLT5yZWddLmZlX3Nlc3Npb25zKSkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCisJcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmJgorCSAgIG1zbV9wY21fcm91dGluZ19yb3V0ZV9pc19zZXQobWMtPnJlZywgbWMtPnNoaWZ0KSA9PSBmYWxzZSkgeworCQltc21fcGNtX3JvdXRpbmdfcHJvY2Vzc19hdWRpbyhtYy0+cmVnLCBtYy0+c2hpZnQsIDEpOworCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQl1cGRhdGUpOworCX0gZWxzZSBpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmCisJCSAgbXNtX3BjbV9yb3V0aW5nX3JvdXRlX2lzX3NldChtYy0+cmVnLCBtYy0+c2hpZnQpID09IHRydWUpIHsKKwkJbXNtX3BjbV9yb3V0aW5nX3Byb2Nlc3NfYXVkaW8obWMtPnJlZywgbWMtPnNoaWZ0LCAwKTsKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJdXBkYXRlKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbXNtX3BjbV9yb3V0aW5nX3Byb2Nlc3Nfdm9pY2UodTE2IHJlZywgdTE2IHZhbCwgaW50IHNldCkKK3sKKwl1MzIgc2Vzc2lvbl9pZCA9IDA7CisJdTE2IHBhdGhfdHlwZTsKKworCXByX2RlYnVnKCIlczogcmVnICV4IHZhbCAleCBzZXQgJXhcbiIsIF9fZnVuY19fLCByZWcsIHZhbCwgc2V0KTsKKworCXNlc3Npb25faWQgPSBtc21fcGNtX3JvdXRpbmdfZ2V0X3ZvY19zZXNzaW9uaWQodmFsKTsKKworCXByX2RlYnVnKCIlczogRkUgREFJIDB4JXggc2Vzc2lvbl9pZCAweCV4XG4iLAorCQlfX2Z1bmNfXywgdmFsLCBzZXNzaW9uX2lkKTsKKworCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisKKwlpZiAoc2V0KQorCQlzZXRfYml0KHZhbCwgJm1zbV9iZWRhaXNbcmVnXS5mZV9zZXNzaW9ucyk7CisJZWxzZQorCQljbGVhcl9iaXQodmFsLCAmbXNtX2JlZGFpc1tyZWddLmZlX3Nlc3Npb25zKTsKKworCWlmICh2YWwgPT0gTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYICYmCisJICAgIGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkKSA9PQorCQkJCQkJTVNNX0FGRV9QT1JUX1RZUEVfUlgpIHsKKwkJcHJfZGVidWcoIiVzKCk6IHNldD0lZCBwb3J0IGlkPTB4JXggZm9yIGR0bWYgZ2VuZXJhdGlvblxuIiwKKwkJCSBfX2Z1bmNfXywgc2V0LCBtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCk7CisJCWFmZV9zZXRfZHRtZl9nZW5fcnhfcG9ydGlkKG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkLCBzZXQpOworCX0KKworCWlmIChhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCkgPT0KKwkJCQkJCU1TTV9BRkVfUE9SVF9UWVBFX1JYKQorCQlwYXRoX3R5cGUgPSBSWF9QQVRIOworCWVsc2UKKwkJcGF0aF90eXBlID0gVFhfUEFUSDsKKworCWlmIChzZXQpIHsKKwkJaWYgKG1zbV9iZWRhaXNbcmVnXS5hY3RpdmUpIHsKKwkJCXZvY19zZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCBwYXRoX3R5cGUsIDEpOworCQkJdm9jX3NldF9kZXZpY2VfY29uZmlnKHNlc3Npb25faWQsIHBhdGhfdHlwZSwKKwkJCSAgIG1zbV9iZWRhaXNbcmVnXS5jaGFubmVsLCBtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCk7CisKKwkJCWlmICh2b2NfZ2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgVFhfUEFUSCkgJiYKKwkJCQl2b2NfZ2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgUlhfUEFUSCkpCisJCQkJdm9jX2VuYWJsZV9kZXZpY2Uoc2Vzc2lvbl9pZCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXMgQkUgaXMgbm90IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQl9CisJfSBlbHNlIHsKKwkJdm9jX3NldF9yb3V0ZV9mbGFnKHNlc3Npb25faWQsIHBhdGhfdHlwZSwgMCk7CisJCXZvY19kaXNhYmxlX2RldmljZShzZXNzaW9uX2lkKTsKKwl9CisKKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKworCWlmICh0ZXN0X2JpdChtYy0+c2hpZnQsICZtc21fYmVkYWlzW21jLT5yZWddLmZlX3Nlc3Npb25zKSkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCisJcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQltc21fcGNtX3JvdXRpbmdfcHJvY2Vzc192b2ljZShtYy0+cmVnLCBtYy0+c2hpZnQsIDEpOworCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQkJCQl1cGRhdGUpOworCX0gZWxzZSB7CisJCW1zbV9wY21fcm91dGluZ19wcm9jZXNzX3ZvaWNlKG1jLT5yZWcsIG1jLT5zaGlmdCwgMCk7CisJCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMCwKKwkJCQkJCXVwZGF0ZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCisJaWYgKHRlc3RfYml0KG1jLT5zaGlmdCwgJm1zbV9iZWRhaXNbbWMtPnJlZ10uZmVfc2Vzc2lvbnMpKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisKKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisKKwlwcl9kZWJ1ZygiJXM6IHJlZyAleCBzaGlmdCAleCB2YWwgJWxkXG4iLCBfX2Z1bmNfXywgbWMtPnJlZywgbWMtPnNoaWZ0LAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwkJc2V0X2JpdChtYy0+c2hpZnQsICZtc21fYmVkYWlzW21jLT5yZWddLmZlX3Nlc3Npb25zKTsKKwkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCisJCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMSwKKwkJCQkJCXVwZGF0ZSk7CisJfSBlbHNlIHsKKwkJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwkJY2xlYXJfYml0KG1jLT5zaGlmdCwgJm1zbV9iZWRhaXNbbWMtPnJlZ10uZmVfc2Vzc2lvbnMpOworCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJCQkJdXBkYXRlKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHJlZyAleCBzaGlmdCAleCB2YWwgJWxkXG4iLCBfX2Z1bmNfXywgbWMtPnJlZywgbWMtPnNoaWZ0LAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZm1fc3dpdGNoX2VuYWJsZTsKKwlwcl9kZWJ1ZygiJXM6IEZNIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBGTSBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQkJCQl1cGRhdGUpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJCQkJdXBkYXRlKTsKKwlmbV9zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X2hmcF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZnBfc3dpdGNoX2VuYWJsZTsKKwlwcl9kZWJ1ZygiJXM6IEhGUCBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfaGZwX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6IEhGUCBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsCisJCQkJCQkxLCB1cGRhdGUpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAorCQkJCQkJMCwgdXBkYXRlKTsKKwloZnBfc3dpdGNoX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9wcmlfbWkyc19zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcmlfbWkyc19zd2l0Y2hfZW5hYmxlOworCXByX2RlYnVnKCIlczogUFJJIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3ByaV9taTJzX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6IFBSSSBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMSwKKwkJCQkJCXVwZGF0ZSk7CisJZWxzZQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDAsCisJCQkJCQl1cGRhdGUpOworCXByaV9taTJzX3N3aXRjaF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfc2VjX21pMnNfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2VjX21pMnNfc3dpdGNoX2VuYWJsZTsKKwlwcl9kZWJ1ZygiJXM6IFNFQyBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9zZWNfbWkyc19zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBTRUMgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQkJCQl1cGRhdGUpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJCQkJdXBkYXRlKTsKKwlzZWNfbWkyc19zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3RlcnRfbWkyc19zd2l0Y2hfbWl4ZXIoCisJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0ZXJ0X21pMnNfc3dpdGNoX2VuYWJsZTsKKwlwcl9kZWJ1ZygiJXM6IFRFUlQgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfdGVydF9taTJzX3N3aXRjaF9taXhlcigKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6IFRFUlQgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQkJCQl1cGRhdGUpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJCQkJdXBkYXRlKTsKKwl0ZXJ0X21pMnNfc3dpdGNoX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9xdWF0X21pMnNfc3dpdGNoX21peGVyKAorCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcXVhdF9taTJzX3N3aXRjaF9lbmFibGU7CisJcHJfZGVidWcoIiVzOiBRVUFUIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3F1YXRfbWkyc19zd2l0Y2hfbWl4ZXIoCisJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBRVUFUIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAxLAorCQkJCQkJdXBkYXRlKTsKKwllbHNlCisJCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMCwKKwkJCQkJCXVwZGF0ZSk7CisJcXVhdF9taTJzX3N3aXRjaF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfZm1fcGNtcnhfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZm1fcGNtcnhfc3dpdGNoX2VuYWJsZTsKKwlwcl9kZWJ1ZygiJXM6IEZNIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9mbV9wY21yeF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCAqd2xpc3QgPQorCQkJCQlkYXBtX2tjb250cm9sX2dldF93bGlzdChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHdsaXN0LT53aWRnZXRzWzBdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBGTSBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCisJCQkJCQl1cGRhdGUpOworCWVsc2UKKwkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAorCQkJCQkJdXBkYXRlKTsKKwlmbV9wY21yeF9zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfbHNtX211eF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBsc21fbXV4X3NsaW1fcG9ydDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19sc21fbXV4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBtdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWludCBsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl81X1RYOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJcHJfZGVidWcoIiVzOiBMU00gZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCWNhc2UgMToKKwkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMF9UWDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8xX1RYOworCQlicmVhazsKKwljYXNlIDM6CisJCWxzbV9wb3J0ID0gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzJfVFg7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fM19UWDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl80X1RYOworCQlicmVhazsKKwljYXNlIDY6CisJCWxzbV9wb3J0ID0gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzVfVFg7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkRlZmF1bHQgbHNtIHBvcnQiKTsKKwkJYnJlYWs7CisJfQorCXNldF9sc21fcG9ydChsc21fcG9ydCk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJbHNtX211eF9zbGltX3BvcnQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJc25kX3NvY19kYXBtX211eF91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgbXV4LCBlLAorCQkJCQkJdXBkYXRlKTsKKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCBtdXgsIGUsCisJCQkJCQl1cGRhdGUpOworCQlsc21fbXV4X3NsaW1fcG9ydCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGk7CisJdTE2IHBvcnRfaWQ7CisJZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGU7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFkX2F1ZGlvX211eF90ZXh0KTsgaSsrKQorCQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgbWFkX2F1ZGlvX211eF90ZXh0W2ldKSkKKwkJCWJyZWFrOworCisJaWYgKGktLSA9PSBBUlJBWV9TSVpFKG1hZF9hdWRpb19tdXhfdGV4dCkpIHsKKwkJV0FSTigxLCAiSW52YWxpZCBpZCBuYW1lICVzXG4iLCBrY29udHJvbC0+aWQubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qQ2hlY2sgZm9yIFRlcnRpYXJ5IFRYIHBvcnQqLworCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCBtYWRfYXVkaW9fbXV4X3RleHRbN10pKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gTUFEU1dBVURJTzsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydF9pZCA9IGkgKiAyICsgMSArIFNMSU1CVVNfMF9SWDsKKwltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAorCQkgbWFkX3R5cGUpOworCXN3aXRjaCAobWFkX3R5cGUpIHsKKwljYXNlIE1BRF9IV19OT05FOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRE5PTkU7CisJCWJyZWFrOworCWNhc2UgTUFEX0hXX0FVRElPOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BREFVRElPOworCQlicmVhazsKKwljYXNlIE1BRF9IV19CRUFDT046CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gTUFEQkVBQ09OOworCQlicmVhazsKKwljYXNlIE1BRF9IV19VTFRSQVNPVU5EOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRFVMVFJBU09VTkQ7CisJCWJyZWFrOworCWNhc2UgTUFEX1NXX0FVRElPOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRFNXQVVESU87CisJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiVW5rbm93blxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19sc21fZnVuY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpOworCXUxNiBwb3J0X2lkOworCWVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlOworCisJcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hZF9hdWRpb19tdXhfdGV4dCk7IGkrKykKKwkJaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsIG1hZF9hdWRpb19tdXhfdGV4dFtpXSkpCisJCQlicmVhazsKKworCWlmIChpLS0gPT0gQVJSQVlfU0laRShtYWRfYXVkaW9fbXV4X3RleHQpKSB7CisJCVdBUk4oMSwgIkludmFsaWQgaWQgbmFtZSAlc1xuIiwga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwb3J0X2lkID0gaSAqIDIgKyAxICsgU0xJTUJVU18wX1JYOworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwljYXNlIE1BRE5PTkU6CisJCW1hZF90eXBlID0gTUFEX0hXX05PTkU7CisJCWJyZWFrOworCWNhc2UgTUFEQVVESU86CisJCW1hZF90eXBlID0gTUFEX0hXX0FVRElPOworCQlicmVhazsKKwljYXNlIE1BREJFQUNPTjoKKwkJbWFkX3R5cGUgPSBNQURfSFdfQkVBQ09OOworCQlicmVhazsKKwljYXNlIE1BRFVMVFJBU09VTkQ6CisJCW1hZF90eXBlID0gTUFEX0hXX1VMVFJBU09VTkQ7CisJCWJyZWFrOworCWNhc2UgTUFEU1dBVURJTzoKKwkJbWFkX3R5cGUgPSBNQURfU1dfQVVESU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgIlVua25vd25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKkNoZWNrIGZvciBUZXJ0aWFyeSBUWCBwb3J0Ki8KKwlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgbWFkX2F1ZGlvX211eF90ZXh0WzddKSkgeworCQlwb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwkJbWFkX3R5cGUgPSBNQURfU1dfQVVESU87CisJfQorCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkIDB4JXgsIG1hZF90eXBlICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwKKwkJIG1hZF90eXBlKTsKKwlyZXR1cm4gYWZlX3BvcnRfc2V0X21hZF90eXBlKHBvcnRfaWQsIG1hZF90eXBlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkbV9vdmVycmlkZV9jaHNfdGV4dFtdID0geyJaZXJvIiwgIk9uZSIsICJUd28ifTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzdfcnhfYWRtX292ZXJyaWRlX2NocywKKwkJCQlhZG1fb3ZlcnJpZGVfY2hzX3RleHQpOworCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2FkbV9nZXRfYmFja2VuZF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJaW50IGJhY2tlbmRfaWQ7CisKKwlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU03X1JYIiwgc2l6ZW9mKCJTTElNN19SWCIpKSkgeworCQliYWNrZW5kX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBiYWNrZW5kIGlkOiAlcyIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYmFja2VuZF9pZDsKK30KK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfYWRtX2NoYW5uZWxfY29uZmlnX2dldCgKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBiYWNrZW5kX2lkID0gbXNtX3JvdXRpbmdfYWRtX2dldF9iYWNrZW5kX2lkeChrY29udHJvbCk7CisKKwlpZiAoYmFja2VuZF9pZCA+PSAwKSB7CisJCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCSBtc21fYmVkYWlzW2JhY2tlbmRfaWRdLmFkbV9vdmVycmlkZV9jaDsKKwkJcHJfZGVidWcoIiVzOiBhZG0gY2hhbm5lbCBjb3VudCAlbGQgZm9yIEJFOiVkXG4iLCBfX2Z1bmNfXywKKwkJCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgYmFja2VuZF9pZCk7CisJCSBtdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfYWRtX2NoYW5uZWxfY29uZmlnX3B1dCgKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBiYWNrZW5kX2lkID0gbXNtX3JvdXRpbmdfYWRtX2dldF9iYWNrZW5kX2lkeChrY29udHJvbCk7CisKKwlpZiAoYmFja2VuZF9pZCA+PSAwKSB7CisJCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisJCW1zbV9iZWRhaXNbYmFja2VuZF9pZF0uYWRtX292ZXJyaWRlX2NoID0KKwkJCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCXByX2RlYnVnKCIlczp1cGRhdGluZyBCRSA6JWQgIGFkbSBjaGFubmVsczogJWRcbiIsCisJCQkgIF9fZnVuY19fLCBiYWNrZW5kX2lkLAorCQkJICBtc21fYmVkYWlzW2JhY2tlbmRfaWRdLmFkbV9vdmVycmlkZV9jaCk7CisJCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkbV9jaGFubmVsX2NvbmZpZ19jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiU0xJTTdfUlggQURNIENoYW5uZWxzIiwgc2xpbV83X3J4X2FkbV9vdmVycmlkZV9jaHMsCisJCQltc21fcm91dGluZ19hZG1fY2hhbm5lbF9jb25maWdfZ2V0LAorCQkJbXNtX3JvdXRpbmdfYWRtX2NoYW5uZWxfY29uZmlnX3B1dCksCit9OworCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3NsaW1fMF9yeF9hYW5jX211eF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2xpbTBfcnhfYWFuY19mYl9wb3J0OworCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6IEFBTkMgTXV4IFBvcnQgJWxkXG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBtc21fcm91dGluZ19zbGltXzBfcnhfYWFuY19tdXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBhYW5jX2RhdGEgYWFuY19pbmZvOworCisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwltZW1zZXQoJmFhbmNfaW5mbywgMHgwMCwgc2l6ZW9mKGFhbmNfaW5mbykpOworCXByX2RlYnVnKCIlczogQUFOQyBNdXggUG9ydCAlbGRcbiIsIF9fZnVuY19fLAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJc2xpbTBfcnhfYWFuY19mYl9wb3J0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID09IDApIHsKKwkJYWFuY19pbmZvLmFhbmNfYWN0aXZlID0gZmFsc2U7CisJCWFhbmNfaW5mby5hYW5jX3R4X3BvcnQgPSAwOworCQlhYW5jX2luZm8uYWFuY19yeF9wb3J0ID0gMDsKKwl9IGVsc2UgeworCQlhYW5jX2luZm8uYWFuY19hY3RpdmUgPSB0cnVlOworCQlhYW5jX2luZm8uYWFuY19yeF9wb3J0ID0gU0xJTUJVU18wX1JYOworCQlhYW5jX2luZm8uYWFuY190eF9wb3J0ID0KKwkJCShTTElNQlVTXzBfUlggLSAxICsgKHNsaW0wX3J4X2FhbmNfZmJfcG9ydCAqIDIpKTsKKwl9CisJYWZlX3NldF9hYW5jX2luZm8oJmFhbmNfaW5mbyk7CisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCXJldHVybiAwOworfTsKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGlkeCA9IDAsIHNoaWZ0ID0gMDsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwlpZHggPSBtYy0+c2hpZnQvKHNpemVvZihtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfc2Vzc2lvbnNbMF0pICogOCk7CisJc2hpZnQgPSBtYy0+c2hpZnQlKHNpemVvZihtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfc2Vzc2lvbnNbMF0pICogOCk7CisKKwlpZiAoaWR4ID49IEJFX0RBSV9QT1JUX1NFU1NJT05TX0lEWF9NQVgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBpZHggPSAlZFxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0ZXN0X2JpdChzaGlmdCwKKwkJKHVuc2lnbmVkIGxvbmcgKikmbXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X3Nlc3Npb25zW2lkeF0pKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7CisJZWxzZQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHJlZyAleCBzaGlmdCAleCB2YWwgJWxkXG4iLCBfX2Z1bmNfXywgbWMtPnJlZywgbWMtPnNoaWZ0LAorCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpZHggPSAwLCBzaGlmdCA9IDA7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCWlkeCA9IG1jLT5zaGlmdC8oc2l6ZW9mKG1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9zZXNzaW9uc1swXSkgKiA4KTsKKwlzaGlmdCA9IG1jLT5zaGlmdCUoc2l6ZW9mKG1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9zZXNzaW9uc1swXSkgKiA4KTsKKworCWlmIChpZHggPj0gQkVfREFJX1BPUlRfU0VTU0lPTlNfSURYX01BWCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiByZWcgMHgleCBzaGlmdCAweCV4IHZhbCAlbGQgaWR4ICVkIHJlbWluZGVyIHNoaWZ0ICVkXG4iLAorCQkgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKKwkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCBpZHgsIHNoaWZ0KTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQlhZmVfbG9vcGJhY2soMSwgbXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X2lkLAorCQkJICAgIG1zbV9iZWRhaXNbbWMtPnNoaWZ0XS5wb3J0X2lkKTsKKwkJc2V0X2JpdChzaGlmdCwKKwkJKHVuc2lnbmVkIGxvbmcgKikmbXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X3Nlc3Npb25zW2lkeF0pOworCX0gZWxzZSB7CisJCWFmZV9sb29wYmFjaygwLCBtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfaWQsCisJCQkgICAgbXNtX2JlZGFpc1ttYy0+c2hpZnRdLnBvcnRfaWQpOworCQljbGVhcl9iaXQoc2hpZnQsCisJCSh1bnNpZ25lZCBsb25nICopJm1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9zZXNzaW9uc1tpZHhdKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19lY19yZWZfcnhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXByX2RlYnVnKCIlczogZWNfcmVmX3J4ICA9ICVkIiwgX19mdW5jX18sIG1zbV9yb3V0ZV9lY19yZWZfcngpOworCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fcm91dGVfZWNfcmVmX3J4OworCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBlY19yZWZfcG9ydF9pZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJaW50IG11eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAwOgorCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMDsKKwkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JTlZBTElEOworCQlicmVhazsKKwljYXNlIDE6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxOworCQllY19yZWZfcG9ydF9pZCA9IFNMSU1CVVNfMF9SWDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMjsKKwkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDM7CisJCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIDQ6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSA0OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIDU6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSA1OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDY7CisJCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIDc6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSA3OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOworCQlicmVhazsKKwljYXNlIDk6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSA5OworCQllY19yZWZfcG9ydF9pZCA9IFNMSU1CVVNfNV9SWDsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDEwOworCQllY19yZWZfcG9ydF9pZCA9IFNMSU1CVVNfMV9UWDsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDExOworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxMjsKKwkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDEzOworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE7CisJCWJyZWFrOworCWNhc2UgMTQ6CisJCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxNDsKKwkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOworCQlicmVhazsKKwljYXNlIDE1OgorCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMTU7CisJCWVjX3JlZl9wb3J0X2lkID0gU0xJTUJVU182X1JYOworCQlicmVhazsKKwljYXNlIDE2OgorCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMTY7CisJCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDE3OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDE4OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDsKKwkJYnJlYWs7CisJY2FzZSAxOToKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDE5OworCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1VTQl9SWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDA7IC8qIE5PTkUgKi8KKwkJcHJfZXJyKCIlcyBFQyByZWYgcnggJWxkIG5vdCB2YWxpZFxuIiwKKwkJCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSU5WQUxJRDsKKwkJYnJlYWs7CisJfQorCWFkbV9lY19yZWZfcnhfaWQoZWNfcmVmX3BvcnRfaWQpOworCXByX2RlYnVnKCIlczogbXNtX3JvdXRlX2VjX3JlZl9yeCA9ICVkXG4iLAorCSAgICBfX2Z1bmNfXywgbXNtX3JvdXRlX2VjX3JlZl9yeCk7CisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCXNuZF9zb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIG11eCwgZSwgdXBkYXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVjX3JlZl9yeFtdID0geyAiTm9uZSIsICJTTElNX1JYIiwgIkkyU19SWCIsCisJIlBSSV9NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIiwKKwkiVEVSVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCIsICJTRUNfSTJTX1JYIiwgIlBST1hZX1JYIiwKKwkiU0xJTV81X1JYIiwgIlNMSU1fMV9UWCIsICJRVUFUX1RETV9UWF8xIiwKKwkiUVVBVF9URE1fUlhfMCIsICJRVUFUX1RETV9SWF8xIiwgIlFVQVRfVERNX1JYXzIiLCAiU0xJTV82X1JYIiwKKwkiVEVSVF9NSTJTX1JYIiwgIlFVQVRfTUkyU19SWCIsICJURVJUX1RETV9UWF8wIiwgIlVTQl9BVURJT19SWCJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShlY19yZWZfcngpLCBlY19yZWZfcngpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMSA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDEgTVVYIE11eCIsCisJCW1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVswXSwKKwkJbXNtX3JvdXRpbmdfZWNfcmVmX3J4X2dldCwgbXNtX3JvdXRpbmdfZWNfcmVmX3J4X3B1dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDIgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwyIE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWwzID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiQVVESU9fUkVGX0VDX1VMMyBNVVggTXV4IiwKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAorCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsNCA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDQgTVVYIE11eCIsCisJCW1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVswXSwKKwkJbXNtX3JvdXRpbmdfZWNfcmVmX3J4X2dldCwgbXNtX3JvdXRpbmdfZWNfcmVmX3J4X3B1dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDUgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUw1IE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWw2ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiQVVESU9fUkVGX0VDX1VMNiBNVVggTXV4IiwKKwkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAorCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsOCA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDggTVVYIE11eCIsCisJCW1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVswXSwKKwkJbXNtX3JvdXRpbmdfZWNfcmVmX3J4X2dldCwgbXNtX3JvdXRpbmdfZWNfcmVmX3J4X3B1dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDkgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUw5IE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWwxNyA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDE3IE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWwxOCA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDE4IE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWwxOSA9CisJU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDE5IE1VWCBNdXgiLAorCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCisJCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOworCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2V4dF9lY19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlwcl9kZWJ1ZygiJXM6IGV4dF9lY19yZWZfcnggID0gJXhcbiIsIF9fZnVuY19fLCBtc21fcm91dGVfZXh0X2VjX3JlZik7CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3JvdXRlX2V4dF9lY19yZWY7CisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2V4dF9lY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9CisJCQkJCWRhcG1fa2NvbnRyb2xfZ2V0X3dsaXN0KGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJaW50IG11eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCByZXQgPSAxOworCWJvb2wgc3RhdGUgPSB0cnVlOworCXVpbnQxNl90IGV4dF9lY19yZWZfcG9ydF9pZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKKworCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7CisJbXNtX3JvdXRlX2V4dF9lY19yZWYgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXN3aXRjaCAobXNtX3JvdXRlX2V4dF9lY19yZWYpIHsKKwljYXNlIEVYVF9FQ19SRUZfUFJJX01JMlNfVFg6CisJCWV4dF9lY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBFWFRfRUNfUkVGX1NFQ19NSTJTX1RYOgorCQlleHRfZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBFWFRfRUNfUkVGX1RFUlRfTUkyU19UWDoKKwkJZXh0X2VjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwkJYnJlYWs7CisJY2FzZSBFWFRfRUNfUkVGX1FVQVRfTUkyU19UWDoKKwkJZXh0X2VjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOworCQlicmVhazsKKwljYXNlIEVYVF9FQ19SRUZfUVVJTl9NSTJTX1RYOgorCQlleHRfZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg7CisJCWJyZWFrOworCWNhc2UgRVhUX0VDX1JFRl9TTElNXzFfVFg6CisJCWV4dF9lY19yZWZfcG9ydF9pZCA9IFNMSU1CVVNfMV9UWDsKKwkJYnJlYWs7CisJY2FzZSBFWFRfRUNfUkVGX05PTkU6CisJZGVmYXVsdDoKKwkJZXh0X2VjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSU5WQUxJRDsKKwkJc3RhdGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiB2YWwgPSAlZCBleHRfZWNfcmVmX3BvcnRfaWQgPSAweCUweCBzdGF0ZSA9ICVkXG4iLAorCQlfX2Z1bmNfXywgbXNtX3JvdXRlX2V4dF9lY19yZWYsIGV4dF9lY19yZWZfcG9ydF9pZCwgc3RhdGUpOworCisJaWYgKCF2b2Nfc2V0X2V4dF9lY19yZWYoZXh0X2VjX3JlZl9wb3J0X2lkLCBzdGF0ZSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCBtdXgsIGUsCisJCQkJCQl1cGRhdGUpOworCX0gZWxzZSB7CisJCXJldCA9IC1FSU5WQUw7CisJCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRfZWNfcmVmX3J4W10gPSB7Ik5PTkUiLCAiUFJJX01JMlNfVFgiLAorCQkJCQkiU0VDX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIiwKKwkJCQkJIlFVQVRfTUkyU19UWCIsICJRVUlOX01JMlNfVFgiLAorCQkJCQkiU0xJTV8xX1RYIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX3JvdXRlX2V4dF9lY19yZWZfcnhfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShleHRfZWNfcmVmX3J4KSwgZXh0X2VjX3JlZl9yeCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9jX2V4dF9lY19tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJWT0NfRVhUX0VDIE1VWCBNdXgiLCBtc21fcm91dGVfZXh0X2VjX3JlZl9yeF9lbnVtWzBdLAorCQkJICBtc21fcm91dGluZ19leHRfZWNfZ2V0LCBtc21fcm91dGluZ19leHRfZWNfcHV0KTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX2kyc19yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX2kyc19yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3BkaWZfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfMl9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzVfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c19yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaTJzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0ZXJuYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVpbmFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRpYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY29uZGFyeV9taTJzX3J4Ml9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWF9TRDEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2Vjb25kYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmltYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQwX21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50NF9taTJzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhkbWlfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRpc3BsYXlfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKKwkvKiBpbmNhbGwgbXVzaWMgZGVsaXZlcnkgbWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbmNhbGxfbXVzaWNfZGVsaXZlcnlfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRV9QTEFZQkFDS19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW5jYWxsX211c2ljMl9kZWxpdmVyeV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRTJfUExBWUJBQ0tfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRTJfUExBWUJBQ0tfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c180X3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzZfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c183X3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVzYl9hdWRpb19yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnRfYnRfc2NvX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnRfYnRfYTJkcF9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludF9mbV9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZmVfcGNtX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhdXhwY21fcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX2F1eHBjbV9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGVydF9hdXhwY21fcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X2F1eHBjbV9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV90ZG1fcnhfMF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY190ZG1fdHhfMF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8wX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV90eF8wX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8xX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8yX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8zX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8wX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV90eF8wX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8xX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8yX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8zX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsMV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQyX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfVUwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzRfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fNl9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVJTl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCisJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAorCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDJfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVSU5fTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWwzX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5UMl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDJfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDVfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQyX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDZfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQyX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsOF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQyX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfREwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19VTCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzZfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsMTdfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX0RMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWwxOF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfREwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfVUwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDE5X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKKwltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19VTCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfaTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzZfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdXNiX2F1ZGlvX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ0X3Njb19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDBfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1aW5fbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFmZV9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF9hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZG1pX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfN19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzhfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3R1Yl9yeF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c18xX3J4X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWF9Wb2ljZSIsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIE1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsCisJbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF92b2ljZTJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaWNlMiIsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLAorCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvbHRlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFhfVm9MVEUiLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLAorCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYX1ZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX1ZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk1JMlNfVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3Zvd2xhbl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWF9Wb1dMQU4iLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwKKwltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYX1BDTV9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9pY2VtbW9kZTFfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX01Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX01Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfTU1vZGUxIiwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5UX0JUX1NDT19UWF9NTW9kZTEiLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9NTW9kZTEiLAorCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLAorCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9NTW9kZTEiLAorCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsCisJbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9NTW9kZTEiLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX01Nb2RlMSIsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX01Nb2RlMSIsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfTU1vZGUxIiwKKwlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsCisJbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfTU1vZGUxIiwKKwlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKKwkxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWF9NTW9kZTEiLAorCU1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsCisJMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfTU1vZGUxIiwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX01Nb2RlMSIsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWF9NTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvaWNlbW1vZGUyX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9NTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWF9NTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYX01Nb2RlMiIsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVF9CVF9TQ09fVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwKKwltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLAorCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYX1BDTV9UWF9NTW9kZTIiLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWF9NTW9kZTIiLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYX01Nb2RlMiIsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLAorCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYX01Nb2RlMiIsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCisJMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAorCTEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYX01Nb2RlMiIsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKKwkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWF9NTW9kZTIiLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsCisJMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfTU1vZGUyIiwKKwlNU01fQkFDS0VORF9EQUlfVVNCX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAorCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF92b2lwX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvaWNlX3N0dWJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU1RVQl9UWF9ITCIsIE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU1RVQl8xX1RYX0hMIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfRUNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9pY2UyX3N0dWJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU1RVQl9UWF9ITCIsIE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNUVUJfMV9UWF9ITCIsIE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX0VDX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvbHRlX3N0dWJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU1RVQl9UWF9ITCIsIE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTVFVCXzFfVFhfSEwiLCBNU01fQkFDS0VORF9EQUlfRVhUUFJPQ19FQ19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8zX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF9xY2hhdF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYX1FDSEFUIiwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwKKwltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9RQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYX1BDTV9UWF9RQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCisJTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKKwltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYnVzXzBfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKKwlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfUlgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfUlgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19SWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGF1eF9wY21fcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNidXNfMV9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2J1c18zX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9SWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNidXNfNl9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBidF9zY29fcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZmVfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhkbWlfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCisJTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkaXNwbGF5X3BvcnRfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19pMnNfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmltYXJ5X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUlOX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzBfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGVydF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKKwkJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKKwkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzNfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKKwkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfdGRtX3J4XzFfcG9ydF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKKwkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKKwkJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKKwkJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKKwkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKKwkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKKwkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCisJCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCisJCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLCAxLCAwLAorCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKKwltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCisJU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1fZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9zd2l0Y2hfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3N3aXRjaF9taXhlcik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltMV9mbV9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQorCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCisJMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3N3aXRjaF9taXhlciwKKwltc21fcm91dGluZ19wdXRfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW0zX2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyA9CisJU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKKwkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9zd2l0Y2hfbWl4ZXIpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbTRfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9zd2l0Y2hfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3N3aXRjaF9taXhlcik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltNl9mbV9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQorCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCisJMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3N3aXRjaF9taXhlciwKKwltc21fcm91dGluZ19wdXRfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBjbV9yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQorCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCisJMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2ZtX3BjbXJ4X3N3aXRjaF9taXhlciwKKwltc21fcm91dGluZ19wdXRfZm1fcGNtcnhfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV9taTJzX3J4X3N3aXRjaF9taXhlcl9jb250cm9scyA9CisJU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKKwkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcHJpX21pMnNfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9wcmlfbWkyc19zd2l0Y2hfbWl4ZXIpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9zZWNfbWkyc19zd2l0Y2hfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3NlY19taTJzX3N3aXRjaF9taXhlcik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF90ZXJ0X21pMnNfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF90ZXJ0X21pMnNfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQorCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCisJMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3F1YXRfbWkyc19zd2l0Y2hfbWl4ZXIsCisJbXNtX3JvdXRpbmdfcHV0X3F1YXRfbWkyc19zd2l0Y2hfbWl4ZXIpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGZwX3ByaV9hdXhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9oZnBfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9oZnBfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhmcF9hdXhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9oZnBfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9oZnBfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhmcF9pbnRfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KKwlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAorCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9oZnBfc3dpdGNoX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9oZnBfc3dpdGNoX21peGVyKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsc21fbXV4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShtYWRfYXVkaW9fbXV4X3RleHQpLCBtYWRfYXVkaW9fbXV4X3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtMV9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJMU00xIE1VWCIsIGxzbV9tdXhfZW51bSwKKwkJCSAgbXNtX3JvdXRpbmdfbHNtX211eF9nZXQsCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTJfbXV4ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiTFNNMiBNVVgiLCBsc21fbXV4X2VudW0sCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfZ2V0LAorCQkJICBtc21fcm91dGluZ19sc21fbXV4X3B1dCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtM19tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJMU00zIE1VWCIsIGxzbV9tdXhfZW51bSwKKwkJCSAgbXNtX3JvdXRpbmdfbHNtX211eF9nZXQsCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTRfbXV4ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiTFNNNCBNVVgiLCBsc21fbXV4X2VudW0sCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfZ2V0LAorCQkJICBtc21fcm91dGluZ19sc21fbXV4X3B1dCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtNV9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJMU001IE1VWCIsIGxzbV9tdXhfZW51bSwKKwkJCSAgbXNtX3JvdXRpbmdfbHNtX211eF9nZXQsCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTZfbXV4ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiTFNNNiBNVVgiLCBsc21fbXV4X2VudW0sCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfZ2V0LAorCQkJICBtc21fcm91dGluZ19sc21fbXV4X3B1dCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtN19tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJMU003IE1VWCIsIGxzbV9tdXhfZW51bSwKKwkJCSAgbXNtX3JvdXRpbmdfbHNtX211eF9nZXQsCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfcHV0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbThfbXV4ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiTFNNOCBNVVgiLCBsc21fbXV4X2VudW0sCisJCQkgIG1zbV9yb3V0aW5nX2xzbV9tdXhfZ2V0LAorCQkJICBtc21fcm91dGluZ19sc21fbXV4X3B1dCk7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsc21fZnVuY190ZXh0W10gPSB7CisJIk5vbmUiLCAiQVVESU8iLCAiQkVBQ09OIiwgIlVMVFJBU09VTkQiLCAiU1dBVURJTyIsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsc21fZnVuY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUobHNtX2Z1bmNfdGV4dCksIGxzbV9mdW5jX3RleHQpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbV9mdW5jdGlvbltdID0geworCVNPQ19FTlVNX0VYVChTTElNQlVTXzBfVFhfVEVYVCIgIkxTTV9GVU5DVElPTl9URVhULCBsc21fZnVuY19lbnVtLAorCQkgICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKKwlTT0NfRU5VTV9FWFQoU0xJTUJVU18xX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKKwkJICAgICBtc21fcm91dGluZ19sc21fZnVuY19nZXQsIG1zbV9yb3V0aW5nX2xzbV9mdW5jX3B1dCksCisJU09DX0VOVU1fRVhUKFNMSU1CVVNfMl9UWF9URVhUIiAiTFNNX0ZVTkNUSU9OX1RFWFQsIGxzbV9mdW5jX2VudW0sCisJCSAgICAgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfZ2V0LCBtc21fcm91dGluZ19sc21fZnVuY19wdXQpLAorCVNPQ19FTlVNX0VYVChTTElNQlVTXzNfVFhfVEVYVCIgIkxTTV9GVU5DVElPTl9URVhULCBsc21fZnVuY19lbnVtLAorCQkgICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKKwlTT0NfRU5VTV9FWFQoU0xJTUJVU180X1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKKwkJICAgICBtc21fcm91dGluZ19sc21fZnVuY19nZXQsIG1zbV9yb3V0aW5nX2xzbV9mdW5jX3B1dCksCisJU09DX0VOVU1fRVhUKFNMSU1CVVNfNV9UWF9URVhUIiAiTFNNX0ZVTkNUSU9OX1RFWFQsIGxzbV9mdW5jX2VudW0sCisJCSAgICAgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfZ2V0LCBtc21fcm91dGluZ19sc21fZnVuY19wdXQpLAorCVNPQ19FTlVNX0VYVChURVJUX01JMlNfVFhfVEVYVCIgIkxTTV9GVU5DVElPTl9URVhULCBsc21fZnVuY19lbnVtLAorCQkgICAgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfZ2V0LCBtc21fcm91dGluZ19sc21fZnVuY19wdXQpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhYW5jX3NsaW1fMF9yeF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzJfVFgiLCAiU0xJTUJVU18zX1RYIiwKKwkiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzZfVFgiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFhbmNfc2xpbV8wX3J4X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShhYW5jX3NsaW1fMF9yeF90ZXh0KSwKKwkJCQlhYW5jX3NsaW1fMF9yeF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFhbmNfc2xpbV8wX3J4X211eFtdID0geworCVNPQ19FTlVNX0VYVCgiQUFOQ19TTElNXzBfUlggTVVYIiwgYWFuY19zbGltXzBfcnhfZW51bSwKKwkJbXNtX3JvdXRpbmdfc2xpbV8wX3J4X2FhbmNfbXV4X2dldCwKKwkJbXNtX3JvdXRpbmdfc2xpbV8wX3J4X2FhbmNfbXV4X3B1dCkKK307CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2woCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGlzX2N1c3RvbV9zdGVyZW9fb247CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2woCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgZmxhZyA9IDAsIGkgPSAwLCByYyA9IDAsIGlkeCA9IDA7CisJaW50IGJlX2luZGV4ID0gMCwgcG9ydF9pZCwgdG9wb19pZDsKKwl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCA9IDA7CisJdWludDE2X3Qgb3BfRkxfaXBfRkxfd2VpZ2h0ID0gMDsKKwl1aW50MTZfdCBvcF9GTF9pcF9GUl93ZWlnaHQgPSAwOworCXVpbnQxNl90IG9wX0ZSX2lwX0ZMX3dlaWdodCA9IDA7CisJdWludDE2X3Qgb3BfRlJfaXBfRlJfd2VpZ2h0ID0gMDsKKworCWZsYWcgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlwcl9kZWJ1ZygiJXMgRSBmbGFnICVkXG4iLCBfX2Z1bmNfXywgZmxhZyk7CisKKwlpZiAoKGlzX2N1c3RvbV9zdGVyZW9fb24gJiYgZmxhZykgfHwgKCFpc19jdXN0b21fc3RlcmVvX29uICYmICFmbGFnKSkgeworCQlwcl9lcnIoIiVzOiBpc19jdXN0b21fc3RlcmVvX29uICVkLCBmbGFnICVkXG4iLAorCQkJX19mdW5jX18sIGlzX2N1c3RvbV9zdGVyZW9fb24sIGZsYWcpOworCQlyZXR1cm4gMDsKKwl9CisJaXNfY3VzdG9tX3N0ZXJlb19vbiA9IGZsYWcgPyB0cnVlIDogZmFsc2U7CisJcHJfZGVidWcoIiVzOmlzX2N1c3RvbV9zdGVyZW9fb24gJWRcbiIsIF9fZnVuY19fLCBpc19jdXN0b21fc3RlcmVvX29uKTsKKwlmb3IgKGJlX2luZGV4ID0gMDsgYmVfaW5kZXggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pbmRleCsrKSB7CisJCXBvcnRfaWQgPSBtc21fYmVkYWlzW2JlX2luZGV4XS5wb3J0X2lkOworCQlpZiAoIW1zbV9iZWRhaXNbYmVfaW5kZXhdLmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHBvcnRfaWQgIT0gU0xJTUJVU18wX1JYKSAmJgorCQkgICAgIChwb3J0X2lkICE9IFJUX1BST1hZX1BPUlRfMDAxX1JYKSAmJgorCQkJKHBvcnRfaWQgIT0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYKSkKKwkJCWNvbnRpbnVlOworCisJCWZvcl9lYWNoX3NldF9iaXQoaSwgJm1zbV9iZWRhaXNbYmVfaW5kZXhdLmZlX3Nlc3Npb25zLAorCQkJCU1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgeworCQkJaWYgKGZlX2RhaV9tYXBbaV1bU0VTU0lPTl9UWVBFX1JYXS5wZXJmX21vZGUgIT0KKwkJCSAgICBMRUdBQ1lfUENNX01PREUpCisJCQkJZ290byBza2lwX3NlbmRfY3VzdG9tX3N0ZXJlbzsKKwkJCXNlc3Npb25faWQgPQorCQkJCWZlX2RhaV9tYXBbaV1bU0VTU0lPTl9UWVBFX1JYXS5zdHJtX2lkOworCQkJaWYgKGlzX2N1c3RvbV9zdGVyZW9fb24pIHsKKwkJCQlvcF9GTF9pcF9GTF93ZWlnaHQgPQorCQkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkU7CisJCQkJb3BfRkxfaXBfRlJfd2VpZ2h0ID0KKwkJCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOworCQkJCW9wX0ZSX2lwX0ZMX3dlaWdodCA9CisJCQkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKKwkJCQlvcF9GUl9pcF9GUl93ZWlnaHQgPQorCQkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkU7CisJCQl9IGVsc2UgeworCQkJCW9wX0ZMX2lwX0ZMX3dlaWdodCA9IFExNF9HQUlOX1VOSVRZOworCQkJCW9wX0ZMX2lwX0ZSX3dlaWdodCA9IDA7CisJCQkJb3BfRlJfaXBfRkxfd2VpZ2h0ID0gMDsKKwkJCQlvcF9GUl9pcF9GUl93ZWlnaHQgPSBRMTRfR0FJTl9VTklUWTsKKwkJCX0KKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgeworCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9CisJCQkJCXNlc3Npb25fY29wcF9tYXBbaV0KKwkJCQkJW1NFU1NJT05fVFlQRV9SWF1bYmVfaW5kZXhdOworCQkJCWlmICghdGVzdF9iaXQoaWR4LCAmY29wcCkpCisJCQkJCWdvdG8gc2tpcF9zZW5kX2N1c3RvbV9zdGVyZW87CisJCQkJdG9wb19pZCA9IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfY29wcF9pZHgoCisJCQkJCW1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsIGlkeCk7CisJCQkJaWYgKHRvcG9faWQgPCAwKQorCQkJCQlwcl9kZWJ1ZygiJXM6RXJyOmN1c3RvbSBzdGVyZW8gdG9wbyAlZCIsCisJCQkJCQkgX19mdW5jX18sIHRvcG9faWQpOworCQkJCQlwcl9kZWJ1ZygiaWR4ICVkXG4iLCBpZHgpOworCQkJCWlmICh0b3BvX2lkID09IERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRCkKKwkJCQkJcmMgPSBtc21fZHMyX2RhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZgorCQkJCQkJKG1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsCisJCQkJCQlpZHgsIGlzX2N1c3RvbV9zdGVyZW9fb24pOworCQkJCWVsc2UgaWYgKHRvcG9faWQgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQpCisJCQkJCXJjID0gZG9sYnlfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKAorCQkJCQkJbXNtX2JlZGFpc1tiZV9pbmRleF0ucG9ydF9pZCwKKwkJCQkJCWlkeCwgaXNfY3VzdG9tX3N0ZXJlb19vbik7CisJCQkJZWxzZQorCQkJCXJjID0gbXNtX3F0aV9wcF9zZW5kX3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NtZAorCQkJCQkJKG1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsCisJCQkJCQlpZHgsIHNlc3Npb25faWQsCisJCQkJCQlvcF9GTF9pcF9GTF93ZWlnaHQsCisJCQkJCQlvcF9GTF9pcF9GUl93ZWlnaHQsCisJCQkJCQlvcF9GUl9pcF9GTF93ZWlnaHQsCisJCQkJCQlvcF9GUl9pcF9GUl93ZWlnaHQpOworCQkJCWlmIChyYyA8IDApCitza2lwX3NlbmRfY3VzdG9tX3N0ZXJlbzoKKwkJCQkJcHJfZXJyKCIlczogZXJyIHNldHRpbmcgY3VzdG9tIHN0ZXJlb1xuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCX0KKworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVCgiU2V0IEN1c3RvbSBTdGVyZW8gT25PZmYiLCBTTkRfU09DX05PUE0sIDAsCisJMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2wsCisJbXNtX3JvdXRpbmdfcHV0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2wpLAorfTsKKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfYXBwX3R5cGVfY2ZnX2NvbnRyb2woc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2FwcF90eXBlX2NmZ19jb250cm9sKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBpID0gMCwgajsKKwlpbnQgbnVtX2FwcF90eXBlcyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCW1lbXNldChhcHBfdHlwZV9jZmcsIDAsIE1BWF9BUFBfVFlQRVMqCisJCQkJc2l6ZW9mKHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYXBwX3R5cGVfZGF0YSkpOworCWlmIChudW1fYXBwX3R5cGVzID4gTUFYX0FQUF9UWVBFUykgeworCQlwcl9lcnIoIiVzOiBudW1iZXIgb2YgYXBwIHR5cGVzIGV4Y2VlZCB0aGUgbWF4IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvciAoaiA9IDA7IGogPCBudW1fYXBwX3R5cGVzOyBqKyspIHsKKwkJYXBwX3R5cGVfY2ZnW2pdLmFwcF90eXBlID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpKytdOworCQlhcHBfdHlwZV9jZmdbal0uc2FtcGxlX3JhdGUgPQorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107CisJCWFwcF90eXBlX2NmZ1tqXS5iaXRfd2lkdGggPQorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhcHBfdHlwZV9jZmdfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiQXBwIFR5cGUgQ29uZmlnIiwgU05EX1NPQ19OT1BNLCAwLAorCTB4RkZGRkZGRkYsIDAsIDEyOCwgbXNtX3JvdXRpbmdfZ2V0X2FwcF90eXBlX2NmZ19jb250cm9sLAorCW1zbV9yb3V0aW5nX3B1dF9hcHBfdHlwZV9jZmdfY29udHJvbCksCit9OworCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF91c2VfZHMxX29yX2RzMl9jb250cm9sKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBpc19kczJfb247CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3VzZV9kczFfb3JfZHMyX2NvbnRyb2woCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpc19kczJfb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVzZV9kczFfb3JfZHMyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIkRTMiBPbk9mZiIsIFNORF9TT0NfTk9QTSwgMCwKKwkxLCAwLCBtc21fcm91dGluZ19nZXRfdXNlX2RzMV9vcl9kczJfY29udHJvbCwKKwltc21fcm91dGluZ19wdXRfdXNlX2RzMV9vcl9kczJfY29udHJvbCksCit9OworCitpbnQgbXNtX3JvdXRpbmdfZ2V0X3Jtc192YWx1ZV9jb250cm9sKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKSB7CisJaW50IHJjID0gMDsKKwlpbnQgYmVfaWR4ID0gMDsKKwljaGFyICpwYXJhbV92YWx1ZTsKKwlpbnQgKnVwZGF0ZV9wYXJhbV92YWx1ZTsKKwl1aW50MzJfdCBwYXJhbV9sZW5ndGggPSBzaXplb2YodWludDMyX3QpOworCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0gUk1TX1BBWUxPQURfTEVOICogc2l6ZW9mKHVpbnQzMl90KTsKKworCXBhcmFtX3ZhbHVlID0ga3phbGxvYyhwYXJhbV9sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1fdmFsdWUpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykKKwkJaWYgKG1zbV9iZWRhaXNbYmVfaWR4XS5wb3J0X2lkID09IFNMSU1CVVNfMF9UWCkKKwkJCWJyZWFrOworCWlmICgoYmVfaWR4IDwgTVNNX0JBQ0tFTkRfREFJX01BWCkgJiYgbXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSkgeworCQlyYyA9IGFkbV9nZXRfcGFyYW1zKFNMSU1CVVNfMF9UWCwgMCwKKwkJCQlSTVNfTU9EVUxFSURfQVBQSV9QQVNTVEhSVSwKKwkJCQlSTVNfUEFSQU1fRklSU1RfU0FNUExFLAorCQkJCXBhcmFtX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAorCQkJCXBhcmFtX3ZhbHVlKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCQlrZnJlZShwYXJhbV92YWx1ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl1cGRhdGVfcGFyYW1fdmFsdWUgPSAoaW50ICopcGFyYW1fdmFsdWU7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXBkYXRlX3BhcmFtX3ZhbHVlWzBdOworCisJCXByX2RlYnVnKCIlczogRlJPTSBEU1AgdmFsdWVbMF0gMHgleFxuIiwKKwkJCSAgX19mdW5jX18sIHVwZGF0ZV9wYXJhbV92YWx1ZVswXSk7CisJfQorCWtmcmVlKHBhcmFtX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9jX3Nlc3Npb25faWRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdm9jX3Nlc3Npb25faWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdm9jX3Nlc3Npb25faWQ9JXVcbiIsIF9fZnVuY19fLCB2b2Nfc2Vzc2lvbl9pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9jX3Nlc3Npb25faWRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2Nfc2Vzc2lvbl9pZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3ZvY19zZXNzaW9uX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvYyBWU0lEIiwgU05EX1NPQ19OT1BNLCAwLAorCQkJICAgICAweEZGRkZGRkZGLCAwLCAxLCBtc21fdm9jX3Nlc3Npb25faWRfZ2V0LAorCQkJICAgICBtc21fdm9jX3Nlc3Npb25faWRfcHV0KSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3NvdW5kX2ZvY3VzX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CisJdWluZm8tPmNvdW50ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9pY2Vfc291bmRfZm9jdXNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhOworCisJbWVtY3B5KCh2b2lkICopJnNvdW5kRm9jdXNEYXRhLCB1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKKwkJc2l6ZW9mKHN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSkpOworCXJldCA9IHZvY19zZXRfc291bmRfZm9jdXMoc291bmRGb2N1c0RhdGEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRXJyb3Igc2V0dGluZyBTb3VuZCBGb2N1cyBQYXJhbXMsIGVycj0lZFxuIiwKKwkJCSAgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV92b2ljZV9zb3VuZF9mb2N1c19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGE7CisKKwltZW1zZXQoJnNvdW5kRm9jdXNEYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtKSk7CisKKwlyZXQgPSB2b2NfZ2V0X3NvdW5kX2ZvY3VzKCZzb3VuZEZvY3VzRGF0YSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciBnZXR0aW5nIFNvdW5kIEZvY3VzIFBhcmFtcywgZXJyPSVkXG4iLAorCQkJICBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCW1lbWNweSh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwgKHZvaWQgKikmc291bmRGb2N1c0RhdGEsCisJCXNpemVvZihzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0pKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9zb3VyY2VfdHJhY2tpbmdfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CisJdWluZm8tPmNvdW50ID0gc2l6ZW9mKHN0cnVjdCBzb3VyY2VfdHJhY2tpbmdfcGFyYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX3NvdXJjZV90cmFja2luZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtIHNvdXJjZVRyYWNraW5nRGF0YTsKKworCW1lbXNldCgmc291cmNlVHJhY2tpbmdEYXRhLCAwLCBzaXplb2Yoc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSkpOworCisJcmV0ID0gdm9jX2dldF9zb3VyY2VfdHJhY2tpbmcoJnNvdXJjZVRyYWNraW5nRGF0YSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciBnZXR0aW5nIFNvdXJjZSBUcmFja2luZyBQYXJhbXMsIGVycj0lZFxuIiwKKwkJCSAgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsICh2b2lkICopJnNvdXJjZVRyYWNraW5nRGF0YSwKKwkJc2l6ZW9mKHN0cnVjdCBzb3VyY2VfdHJhY2tpbmdfcGFyYW0pKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9hdWRpb19nZXRfY29wcF9pZHhfZnJvbV9wb3J0X2lkKGludCBwb3J0X2lkLCBpbnQgc2Vzc2lvbl90eXBlLAorCQkJCQkgaW50ICpjb3BwX2lkeCkKK3sKKwlpbnQgaSwgaWR4LCBiZV9pZHg7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBjb3BwOworCisJcHJfZGVidWcoIiVzOiBFbnRlciwgcG9ydF9pZD0lZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHBvcnQgdmFsaWRhdGlvbiBmYWlsZWQgaWQgMHgleCByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykgeworCQlpZiAobXNtX2JlZGFpc1tiZV9pZHhdLnBvcnRfaWQgPT0gcG9ydF9pZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoYmVfaWR4ID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBiZSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkeCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaSwgJm1zbV9iZWRhaXNbYmVfaWR4XS5mZV9zZXNzaW9ucywKKwkJCSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKSB7CisJCQljb3BwID0gc2Vzc2lvbl9jb3BwX21hcFtpXQorCQkJCVtzZXNzaW9uX3R5cGVdW2JlX2lkeF07CisJCQlpZiAodGVzdF9iaXQoaWR4LCAmY29wcCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGlkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEZFLCBleGl0aW5nXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwkqY29wcF9pZHggPSBpZHg7CisJcHJfZGVidWcoIiVzOiBjb3BwX2lkeD0lZFxuIiwgX19mdW5jX18sICpjb3BwX2lkeCk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXVkaW9fc291bmRfZm9jdXNfZGVyaXZlX3BvcnRfaWQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgICBjb25zdCBjaGFyICpwcmVmaXgsIGludCAqcG9ydF9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogRW50ZXIsIHByZWZpeDolc1xuIiwgX19mdW5jX18sIHByZWZpeCk7CisKKwkvKgorCSAqIE1peGVyIGNvbnRyb2wgbmFtZSB3aWxsIGJlIGxpa2UgIlNvdW5kIEZvY3VzIEF1ZGlvIFR4IFNMSU1CVVNfMCIKKwkgKiB3aGVyZSB0aGUgcHJlZml4IGlzICJTb3VuZCBGb2N1cyBBdWRpbyBUeCAiLiBTa2lwIHRoZSBwcmVmaXgKKwkgKiBhbmQgY29tcGFyZSB0aGUgc3RyaW5nIHdpdGggdGhlIGJhY2tlbmQgbmFtZSB0byBkZXJpdmUgdGhlIHBvcnQgaWQuCisJICovCisJaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUgKyBzdHJsZW4ocHJlZml4KSwKKwkJCQkJIlNMSU1CVVNfMCIpKSB7CisJCSpwb3J0X2lkID0gU0xJTUJVU18wX1RYOworCX0gZWxzZSBpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSArIHN0cmxlbihwcmVmaXgpLAorCQkJCQkiVEVSVF9NSTJTIikpIHsKKwkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IG1peGVyIGN0bCBuYW1lPSVzLCBjb3VsZCBub3QgZGVyaXZlIHZhbGlkIHBvcnQgaWRcbiIsCisJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJfZGVidWcoIiVzOiBtaXhlciBjdGwgbmFtZT0lcywgZGVyaXZlZCBwb3J0X2lkPSVkXG4iLAorCQkgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSwgKnBvcnRfaWQpOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YTsKKwlpbnQgcG9ydF9pZCwgY29wcF9pZHg7CisKKwlyZXQgPSBtc21fYXVkaW9fc291bmRfZm9jdXNfZGVyaXZlX3BvcnRfaWQoa2NvbnRyb2wsCisJCQkJIlNvdW5kIEZvY3VzIEF1ZGlvIFR4ICIsICZwb3J0X2lkKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgaW4gZGVyaXZpbmcgcG9ydCBpZCwgZXJyPSVkXG4iLAorCQkJICBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX2F1ZGlvX2dldF9jb3BwX2lkeF9mcm9tX3BvcnRfaWQocG9ydF9pZCwgU0VTU0lPTl9UWVBFX1RYLAorCQkJCQkgICAgJmNvcHBfaWR4KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY29wcCBpZHggZm9yIHBvcnRfaWQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW1lbWNweSgodm9pZCAqKSZzb3VuZEZvY3VzRGF0YSwgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsCisJCXNpemVvZihzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0pKTsKKworCXJldCA9IGFkbV9zZXRfc291bmRfZm9jdXMocG9ydF9pZCwgY29wcF9pZHgsIHNvdW5kRm9jdXNEYXRhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEVycm9yIHNldHRpbmcgU291bmQgRm9jdXMgUGFyYW1zLCBlcnI9JWRcbiIsCisJCQkgIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXVkaW9fc291bmRfZm9jdXNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGE7CisJaW50IHBvcnRfaWQsIGNvcHBfaWR4OworCisJcmV0ID0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2Rlcml2ZV9wb3J0X2lkKGtjb250cm9sLAorCQkJCSJTb3VuZCBGb2N1cyBBdWRpbyBUeCAiLCAmcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBkZXJpdmluZyBwb3J0IGlkLCBlcnI9JWRcbiIsCisJCQkgIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBtc21fYXVkaW9fZ2V0X2NvcHBfaWR4X2Zyb21fcG9ydF9pZChwb3J0X2lkLCBTRVNTSU9OX1RZUEVfVFgsCisJCQkJCSAgICAmY29wcF9pZHgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBjb3BwIGlkeCBmb3IgcG9ydF9pZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gYWRtX2dldF9zb3VuZF9mb2N1cyhwb3J0X2lkLCBjb3BwX2lkeCwgJnNvdW5kRm9jdXNEYXRhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgU291bmQgRm9jdXMgUGFyYW1zLCBlcnI9JWRcbiIsCisJCQkgIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsICh2b2lkICopJnNvdW5kRm9jdXNEYXRhLAorCQlzaXplb2Yoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtKSk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fYXVkaW9fc291cmNlX3RyYWNraW5nX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSBzb3VyY2VUcmFja2luZ0RhdGE7CisJaW50IHBvcnRfaWQsIGNvcHBfaWR4OworCisJcmV0ID0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2Rlcml2ZV9wb3J0X2lkKGtjb250cm9sLAorCQkJCSJTb3VyY2UgVHJhY2tpbmcgQXVkaW8gVHggIiwgJnBvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgaW4gZGVyaXZpbmcgcG9ydCBpZCwgZXJyPSVkXG4iLAorCQkJICBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbXNtX2F1ZGlvX2dldF9jb3BwX2lkeF9mcm9tX3BvcnRfaWQocG9ydF9pZCwgU0VTU0lPTl9UWVBFX1RYLAorCQkJCQkgICAgJmNvcHBfaWR4KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY29wcCBpZHggZm9yIHBvcnRfaWQ9JWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGFkbV9nZXRfc291cmNlX3RyYWNraW5nKHBvcnRfaWQsIGNvcHBfaWR4LCAmc291cmNlVHJhY2tpbmdEYXRhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgU291cmNlIFRyYWNraW5nIFBhcmFtcywgZXJyPSVkXG4iLAorCQkJICBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAodm9pZCAqKSZzb3VyY2VUcmFja2luZ0RhdGEsCisJCXNpemVvZihzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtKSk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9zb3VyY2VfdHJhY2tpbmdfY29udHJvbHNbXSA9IHsKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUJPSAiU291bmQgRm9jdXMgVm9pY2UgVHggU0xJTUJVU18wIiwKKwkJLmluZm8JPSBtc21fc291bmRfZm9jdXNfaW5mbywKKwkJLmdldAk9IG1zbV92b2ljZV9zb3VuZF9mb2N1c19nZXQsCisJCS5wdXQJPSBtc21fdm9pY2Vfc291bmRfZm9jdXNfcHV0LAorCX0sCisJeworCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZQk9ICJTb3VyY2UgVHJhY2tpbmcgVm9pY2UgVHggU0xJTUJVU18wIiwKKwkJLmluZm8JPSBtc21fc291cmNlX3RyYWNraW5nX2luZm8sCisJCS5nZXQJPSBtc21fdm9pY2Vfc291cmNlX3RyYWNraW5nX2dldCwKKwl9LAorCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCisJCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZQk9ICJTb3VuZCBGb2N1cyBBdWRpbyBUeCBTTElNQlVTXzAiLAorCQkuaW5mbwk9IG1zbV9zb3VuZF9mb2N1c19pbmZvLAorCQkuZ2V0CT0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2dldCwKKwkJLnB1dAk9IG1zbV9hdWRpb19zb3VuZF9mb2N1c19wdXQsCisJfSwKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lCT0gIlNvdXJjZSBUcmFja2luZyBBdWRpbyBUeCBTTElNQlVTXzAiLAorCQkuaW5mbwk9IG1zbV9zb3VyY2VfdHJhY2tpbmdfaW5mbywKKwkJLmdldAk9IG1zbV9hdWRpb19zb3VyY2VfdHJhY2tpbmdfZ2V0LAorCX0sCisJeworCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lCT0gIlNvdW5kIEZvY3VzIFZvaWNlIFR4IFRFUlRfTUkyUyIsCisJCS5pbmZvCT0gbXNtX3NvdW5kX2ZvY3VzX2luZm8sCisJCS5nZXQJPSBtc21fdm9pY2Vfc291bmRfZm9jdXNfZ2V0LAorCQkucHV0CT0gbXNtX3ZvaWNlX3NvdW5kX2ZvY3VzX3B1dCwKKwl9LAorCXsKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUJPSAiU291cmNlIFRyYWNraW5nIFZvaWNlIFR4IFRFUlRfTUkyUyIsCisJCS5pbmZvCT0gbXNtX3NvdXJjZV90cmFja2luZ19pbmZvLAorCQkuZ2V0CT0gbXNtX3ZvaWNlX3NvdXJjZV90cmFja2luZ19nZXQsCisJfSwKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUJPSAiU291bmQgRm9jdXMgQXVkaW8gVHggVEVSVF9NSTJTIiwKKwkJLmluZm8JPSBtc21fc291bmRfZm9jdXNfaW5mbywKKwkJLmdldAk9IG1zbV9hdWRpb19zb3VuZF9mb2N1c19nZXQsCisJCS5wdXQJPSBtc21fYXVkaW9fc291bmRfZm9jdXNfcHV0LAorCX0sCisJeworCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCisJCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZQk9ICJTb3VyY2UgVHJhY2tpbmcgQXVkaW8gVHggVEVSVF9NSTJTIiwKKwkJLmluZm8JPSBtc21fc291cmNlX3RyYWNraW5nX2luZm8sCisJCS5nZXQJPSBtc21fYXVkaW9fc291cmNlX3RyYWNraW5nX2dldCwKKwl9LAorfTsKKworc3RhdGljIGludCBzcGtyX3Byb3RfcHV0X3ZpX2xjaF9wb3J0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwOworCWludCBpdGVtOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXByX2RlYnVnKCIlcyBpdGVtIGlzICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwlpdGVtID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAoaXRlbSA8IGUtPml0ZW1zKSB7CisJCXByX2RlYnVnKCIlcyBSWCBEQUkgSUQgJWQgVFggREFJIGlkICVkXG4iLAorCQkJX19mdW5jX18sIGUtPnNoaWZ0X2wsIGUtPnZhbHVlc1tpdGVtXSk7CisJCWlmIChlLT5zaGlmdF9sIDwgTVNNX0JBQ0tFTkRfREFJX01BWCAmJgorCQkJZS0+dmFsdWVzW2l0ZW1dIDwgTVNNX0JBQ0tFTkRfREFJX01BWCkKKwkJCS8qIEVuYWJsZSBmZWVkYmFjayBUWCBwYXRoICovCisJCQlyZXQgPSBhZmVfc3BrX3Byb3RfZmVlZF9iYWNrX2NmZygKKwkJCSAgIG1zbV9iZWRhaXNbZS0+dmFsdWVzW2l0ZW1dXS5wb3J0X2lkLAorCQkJICAgbXNtX2JlZGFpc1tlLT5zaGlmdF9sXS5wb3J0X2lkLCAxLCAwLCAxKTsKKwkJZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXMgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2UgaXRlbSAlZFxuIiwKKwkJCV9fZnVuY19fLCBlLT52YWx1ZXNbaXRlbV0pOworCQkJLyogRGlzYWJsZSBmZWVkYmFjayBUWCBwYXRoICovCisJCQlpZiAoZS0+dmFsdWVzW2l0ZW1dID09IE1TTV9CQUNLRU5EX0RBSV9NQVgpCisJCQkJcmV0ID0gYWZlX3Nwa19wcm90X2ZlZWRfYmFja19jZmcoMCwgMCwgMCwgMCwgMCk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXMgaXRlbSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgaXRlbVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzcGtyX3Byb3RfcHV0X3ZpX3JjaF9wb3J0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXRlbTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwlwcl9kZWJ1ZygiJXMgaXRlbSBpcyAlZFxuIiwgX19mdW5jX18sCisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCWl0ZW0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmIChpdGVtIDwgZS0+aXRlbXMpIHsKKwkJcHJfZGVidWcoIiVzIFJYIERBSSBJRCAlZCBUWCBEQUkgaWQgJWRcbiIsCisJCQkJX19mdW5jX18sIGUtPnNoaWZ0X2wsIGUtPnZhbHVlc1tpdGVtXSk7CisJCWlmIChlLT5zaGlmdF9sIDwgTVNNX0JBQ0tFTkRfREFJX01BWCAmJgorCQkJCWUtPnZhbHVlc1tpdGVtXSA8IE1TTV9CQUNLRU5EX0RBSV9NQVgpCisJCQkvKiBFbmFibGUgZmVlZGJhY2sgVFggcGF0aCAqLworCQkJcmV0ID0gYWZlX3Nwa19wcm90X2ZlZWRfYmFja19jZmcoCisJCQkJCW1zbV9iZWRhaXNbZS0+dmFsdWVzW2l0ZW1dXS5wb3J0X2lkLAorCQkJCQltc21fYmVkYWlzW2UtPnNoaWZ0X2xdLnBvcnRfaWQsCisJCQkJCTEsIDEsIDEpOworCQllbHNlIHsKKwkJCXByX2RlYnVnKCIlcyB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZSBpdGVtICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgZS0+dmFsdWVzW2l0ZW1dKTsKKwkJCS8qIERpc2FibGUgZmVlZGJhY2sgVFggcGF0aCAqLworCQkJaWYgKGUtPnZhbHVlc1tpdGVtXSA9PSBNU01fQkFDS0VORF9EQUlfTUFYKQorCQkJCXJldCA9IGFmZV9zcGtfcHJvdF9mZWVkX2JhY2tfY2ZnKDAsCisJCQkJCQkwLCAwLCAwLCAwKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlcyBpdGVtIHZhbHVlIGlzIG91dCBvZiByYW5nZSBpdGVtXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwa3JfcHJvdF9nZXRfdmlfbGNoX3BvcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Brcl9wcm90X2dldF92aV9yY2hfcG9ydChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2xpbTBfcnhfdmlfZmJfdHhfbGNoX211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU0xJTTRfVFgiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNsaW0wX3J4X3ZpX2ZiX3R4X3JjaF9tdXhfdGV4dFtdID0geworCSJaRVJPIiwgIlNMSU00X1RYIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaTJzX3J4X3ZpX2ZiX3R4X211eF90ZXh0W10gPSB7CisJIlpFUk8iLCAiU0VOQVJZX1RYIgorfTsKKworc3RhdGljIGNvbnN0IGludCBjb25zdCBzbGltMF9yeF92aV9mYl90eF9sY2hfdmFsdWVbXSA9IHsKKwlNU01fQkFDS0VORF9EQUlfTUFYLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYCit9OworCitzdGF0aWMgY29uc3QgaW50IGNvbnN0IHNsaW0wX3J4X3ZpX2ZiX3R4X3JjaF92YWx1ZVtdID0geworCU1TTV9CQUNLRU5EX0RBSV9NQVgsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgKK307CisKK3N0YXRpYyBjb25zdCBpbnQgY29uc3QgbWkyc19yeF92aV9mYl90eF92YWx1ZVtdID0geworCU1TTV9CQUNLRU5EX0RBSV9NQVgsIE1TTV9CQUNLRU5EX0RBSV9TRU5BUllfTUkyU19UWAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbGltMF9yeF92aV9mYl9sY2hfbXV4X2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSgwLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLCAwLCAwLAorCUFSUkFZX1NJWkUoc2xpbTBfcnhfdmlfZmJfdHhfbGNoX211eF90ZXh0KSwKKwlzbGltMF9yeF92aV9mYl90eF9sY2hfbXV4X3RleHQsIHNsaW0wX3J4X3ZpX2ZiX3R4X2xjaF92YWx1ZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2xpbTBfcnhfdmlfZmJfcmNoX211eF9lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9ET1VCTEUoMCwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwgMCwgMCwKKwlBUlJBWV9TSVpFKHNsaW0wX3J4X3ZpX2ZiX3R4X3JjaF9tdXhfdGV4dCksCisJc2xpbTBfcnhfdmlfZmJfdHhfcmNoX211eF90ZXh0LCBzbGltMF9yeF92aV9mYl90eF9yY2hfdmFsdWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pMnNfcnhfdmlfZmJfbXV4X2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSgwLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsIDAsIDAsCisJQVJSQVlfU0laRShtaTJzX3J4X3ZpX2ZiX3R4X211eF90ZXh0KSwKKwltaTJzX3J4X3ZpX2ZiX3R4X211eF90ZXh0LCBtaTJzX3J4X3ZpX2ZiX3R4X3ZhbHVlKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW0wX3J4X3ZpX2ZiX2xjaF9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNMF9SWF9WSV9GQl9MQ0hfTVVYIiwKKwlzbGltMF9yeF92aV9mYl9sY2hfbXV4X2VudW0sIHNwa3JfcHJvdF9nZXRfdmlfbGNoX3BvcnQsCisJc3Brcl9wcm90X3B1dF92aV9sY2hfcG9ydCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltMF9yeF92aV9mYl9yY2hfbXV4ID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTTBfUlhfVklfRkJfUkNIX01VWCIsCisJc2xpbTBfcnhfdmlfZmJfcmNoX211eF9lbnVtLCBzcGtyX3Byb3RfZ2V0X3ZpX3JjaF9wb3J0LAorCXNwa3JfcHJvdF9wdXRfdmlfcmNoX3BvcnQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWkyc19yeF92aV9mYl9tdXggPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJQUklfTUkyU19SWF9WSV9GQl9NVVgiLAorCW1pMnNfcnhfdmlfZmJfbXV4X2VudW0sIHNwa3JfcHJvdF9nZXRfdmlfbGNoX3BvcnQsCisJc3Brcl9wcm90X3B1dF92aV9sY2hfcG9ydCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc21fcWRzcDZfd2lkZ2V0c1tdID0geworCS8qIEZyb250ZW5kIEFJRiAqLworCS8qIFdpZGdldCBuYW1lIGVxdWFscyB0byBGcm9udC1FbmQgREFJIG5hbWU8TmVlZCBjb25maXJtYXRpb24+LAorCSAqIFN0cmVhbSBuYW1lIG11c3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIGZyb250LWVuZCBkYWkgbmFtZQorCSAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMSIsICJNdWx0aU1lZGlhMSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMiIsICJNdWx0aU1lZGlhMiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMyIsICJNdWx0aU1lZGlhMyBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMNCIsICJNdWx0aU1lZGlhNCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMNSIsICJNdWx0aU1lZGlhNSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMNiIsICJNdWx0aU1lZGlhNiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMNyIsICJNdWx0aU1lZGlhNyBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMOCIsICJNdWx0aU1lZGlhOCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMOSIsICJNdWx0aU1lZGlhOSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMTAiLCAiTXVsdGlNZWRpYTEwIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxMSIsICJNdWx0aU1lZGlhMTEgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJNTV9ETDEyIiwgIk11bHRpTWVkaWExMiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMTMiLCAiTXVsdGlNZWRpYTEzIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxNCIsICJNdWx0aU1lZGlhMTQgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJNTV9ETDE1IiwgIk11bHRpTWVkaWExNSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMTYiLCAiTXVsdGlNZWRpYTE2IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVk9JUF9ETCIsICJWb0lQIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMSIsICJNdWx0aU1lZGlhMSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMiIsICJNdWx0aU1lZGlhMiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMyIsICJNdWx0aU1lZGlhMyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMNCIsICJNdWx0aU1lZGlhNCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMNSIsICJNdWx0aU1lZGlhNSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMNiIsICJNdWx0aU1lZGlhNiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMOCIsICJNdWx0aU1lZGlhOCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMOSIsICJNdWx0aU1lZGlhOSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMTciLCAiTXVsdGlNZWRpYTE3IENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTU1fVUwxOCIsICJNdWx0aU1lZGlhMTggQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDE5IiwgIk11bHRpTWVkaWExOSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQ1MtVk9JQ0VfREwxIiwgIkNTLVZPSUNFIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkNTLVZPSUNFX1VMMSIsICJDUy1WT0lDRSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVk9JQ0UyX0RMIiwgIlZvaWNlMiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWT0lDRTJfVUwiLCAiVm9pY2UyIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJWb0xURV9ETCIsICJWb0xURSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWb0xURV9VTCIsICJWb0xURSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVm9XTEFOX0RMIiwgIlZvV0xBTiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWb1dMQU5fVUwiLCAiVm9XTEFOIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JUF9VTCIsICJWb0lQIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJWT0lDRU1NT0RFMV9ETCIsCisJCSJWb2ljZU1Nb2RlMSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWT0lDRU1NT0RFMV9VTCIsCisJCSJWb2ljZU1Nb2RlMSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVk9JQ0VNTU9ERTJfREwiLAorCQkiVm9pY2VNTW9kZTIgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0VNTU9ERTJfVUwiLAorCQkiVm9pY2VNTW9kZTIgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU0wX0RMX0hMIiwgIlNMSU1CVVMwX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU0wX1VMX0hMIiwgIlNMSU1CVVMwX0hPU1RMRVNTIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQ1BFX0xTTV9VTF9ITCIsICJDUEUgTFNNIGNhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNMV9ETF9ITCIsICJTTElNQlVTMV9IT1NUTEVTUyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNMV9VTF9ITCIsICJTTElNQlVTMV9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTTNfRExfSEwiLCAiU0xJTUJVUzNfSE9TVExFU1MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTTNfVUxfSEwiLCAiU0xJTUJVUzNfSE9TVExFU1MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU00X0RMX0hMIiwgIlNMSU1CVVM0X0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU00X1VMX0hMIiwgIlNMSU1CVVM0X0hPU1RMRVNTIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNNl9ETF9ITCIsICJTTElNQlVTNl9IT1NUTEVTUyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNNl9VTF9ITCIsICJTTElNQlVTNl9IT1NUTEVTUyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTThfRExfSEwiLCAiU0xJTUJVUzhfSE9TVExFU1MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTThfVUxfSEwiLCAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVEZNX0RMX0hMIiwgIklOVF9GTV9IT1NUTEVTUyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJTlRGTV9VTF9ITCIsICJJTlRfRk1fSE9TVExFU1MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVEhGUF9ETF9ITCIsICJJTlRfSEZQX0JUX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIklOVEhGUF9VTF9ITCIsICJJTlRfSEZQX0JUX0hPU1RMRVNTIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJIRE1JX0RMX0hMIiwgIkhETUlfSE9TVExFU1MgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfSTJTX0RMX0hMIiwgIlNFQ19JMlNfUlhfSE9TVExFU1MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJJTlQwX01JMlNfRExfSEwiLAorCQkiSU5UMCBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiSU5UNF9NSTJTX0RMX0hMIiwKKwkJIklOVDQgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9NSTJTX0RMX0hMIiwKKwkJIlByaW1hcnkgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19NSTJTX0RMX0hMIiwKKwkJIlNlY29uZGFyeSBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9NSTJTX0RMX0hMIiwKKwkJIlRlcnRpYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX01JMlNfRExfSEwiLAorCQkiUXVhdGVybmFyeSBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBVVhQQ01fRExfSEwiLCAiQVVYUENNX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFVWFBDTV9VTF9ITCIsICJBVVhQQ01fSE9TVExFU1MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNSTJTX1VMX0hMIiwgIk1JMlNfVFhfSE9TVExFU1MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX01JMlNfVUxfSEwiLAorCQkiVGVydGlhcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1VMX0hMIiwKKwkJIlNlY29uZGFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX01JMlNfVUxfSEwiLAorCQkiUHJpbWFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTUkyU19ETF9ITCIsICJNSTJTX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiRFRNRl9ETF9ITCIsICJEVE1GX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfTUkyU19VTF9ITCIsCisJCSJRdWF0ZXJuYXJ5IE1JMlNfVFggSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF8wX0RMX0hMIiwKKwkJIlByaW1hcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzBfVUxfSEwiLAorCQkiUHJpbWFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzFfRExfSEwiLAorCQkiUHJpbWFyeSBURE0xIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfMV9VTF9ITCIsCisJCSJQcmltYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fUlhfMl9ETF9ITCIsCisJCSJQcmltYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX1RETV9UWF8yX1VMX0hMIiwKKwkJIlByaW1hcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF8zX0RMX0hMIiwKKwkJIlByaW1hcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzNfVUxfSEwiLAorCQkiUHJpbWFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzRfRExfSEwiLAorCQkiUHJpbWFyeSBURE00IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfNF9VTF9ITCIsCisJCSJQcmltYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fUlhfNV9ETF9ITCIsCisJCSJQcmltYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX1RETV9UWF81X1VMX0hMIiwKKwkJIlByaW1hcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF82X0RMX0hMIiwKKwkJIlByaW1hcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzZfVUxfSEwiLAorCQkiUHJpbWFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzdfRExfSEwiLAorCQkiUHJpbWFyeSBURE03IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfN19VTF9ITCIsCisJCSJQcmltYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMF9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzBfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMV9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzFfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMl9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzJfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfM19ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzNfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNF9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzRfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNV9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzVfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNl9ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzZfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfN19ETF9ITCIsCisJCSJTZWNvbmRhcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzdfVUxfSEwiLAorCQkiU2Vjb25kYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzBfRExfSEwiLAorCQkiVGVydGlhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8wX1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzFfRExfSEwiLAorCQkiVGVydGlhcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8xX1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzJfRExfSEwiLAorCQkiVGVydGlhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8yX1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzNfRExfSEwiLAorCQkiVGVydGlhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8zX1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzRfRExfSEwiLAorCQkiVGVydGlhcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF80X1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzVfRExfSEwiLAorCQkiVGVydGlhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF81X1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzZfRExfSEwiLAorCQkiVGVydGlhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF82X1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzdfRExfSEwiLAorCQkiVGVydGlhcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF83X1VMX0hMIiwKKwkJIlRlcnRpYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzBfRExfSEwiLAorCQkiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzBfVUxfSEwiLAorCQkiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF8xX0RMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF8xX1VMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNMSBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fUlhfMl9ETF9ITCIsCisJCSJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fVFhfMl9VTF9ITCIsCisJCSJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzNfRExfSEwiLAorCQkiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzNfVUxfSEwiLAorCQkiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF80X0RMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF80X1VMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNNCBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fUlhfNV9ETF9ITCIsCisJCSJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fVFhfNV9VTF9ITCIsCisJCSJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzZfRExfSEwiLAorCQkiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKKwkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzZfVUxfSEwiLAorCQkiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAorCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF83X0RMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCisJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF83X1VMX0hMIiwKKwkJIlF1YXRlcm5hcnkgVERNNyBIb3N0bGVzcyBDYXB0dXJlIiwKKwkJMCwgMCwgMCwgMCksCisKKwkvKiBMU00gKi8KKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNMV9VTF9ITCIsICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJICAgICAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNMl9VTF9ITCIsICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJICAgICAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNM19VTF9ITCIsICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJCSAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNNF9VTF9ITCIsICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAorCQkJCQkJIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU001X1VMX0hMIiwgIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkJIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU002X1VMX0hMIiwgIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkJIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU003X1VMX0hMIiwgIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkJIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU004X1VMX0hMIiwgIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCisJCQkgICAgIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFDSEFUX0RMIiwgIlFDSEFUIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFDSEFUX1VMIiwgIlFDSEFUIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwkvKiBCYWNrZW5kIEFJRiAqLworCS8qIFN0cmVhbSBuYW1lIGVxdWFscyB0byBiYWNrZW5kIGRhaSBsaW5rIHN0cmVhbSBuYW1lICovCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9JMlNfUlgiLCAiUHJpbWFyeSBJMlMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX0kyU19SWCIsICJTZWNvbmRhcnkgSTJTIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU1BESUZfUlgiLCAiU1BESUYgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU18wX1JYIiwgIlNsaW1idXMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU18yX1JYIiwgIlNsaW1idXMyIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfNV9SWCIsICJTbGltYnVzNSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJIRE1JIiwgIkhETUkgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiRElTUExBWV9QT1JUIiwgIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCisJCQkgICAgIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNSTJTX1JYIiwgIk1JMlMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9NSTJTX1JYIiwgIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCisJCQkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9NSTJTX1JYIiwgIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAorCQkJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1JYIiwgIlNlY29uZGFyeSBNSTJTIFBsYXliYWNrIiwKKwkJCSAgICAgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1JYX1NEMSIsCisJCQkiU2Vjb25kYXJ5IE1JMlMgUGxheWJhY2sgU0QxIiwKKwkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfTUkyU19SWCIsICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAorCQkJICAgICAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UMF9NSTJTX1JYIiwgIklOVDAgTUkyUyBQbGF5YmFjayIsCisJCQkgICAgIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJTlQ0X01JMlNfUlgiLCAiSU5UNCBNSTJTIFBsYXliYWNrIiwKKwkJCSAgICAgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVSU5fTUkyU19SWCIsICJRdWluYXJ5IE1JMlMgUGxheWJhY2siLAorCQkJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX0kyU19UWCIsICJQcmltYXJ5IEkyUyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiTUkyU19UWCIsICJNSTJTIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX01JMlNfVFgiLCAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAorCQkJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX01JMlNfVFgiLCAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAorCQkJICAgIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfTUkyU19UWCIsICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAorCQkJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiSU5UMl9NSTJTX1RYIiwgIklOVDIgTUkyUyBDYXB0dXJlIiwKKwkJCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVDNfTUkyU19UWCIsICJJTlQzIE1JMlMgQ2FwdHVyZSIsCisJCQkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfTUkyU19UWCIsICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKKwkJCSAgICAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzBfVFgiLCAiU2xpbWJ1cyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU18yX1RYIiwgIlNsaW1idXMyIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUlOX01JMlNfVFgiLCAiUXVpbmFyeSBNSTJTIENhcHR1cmUiLAorCQkJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0VOQVJZX01JMlNfVFgiLCAiU2VuYXJ5IE1JMlMgQ2FwdHVyZSIsCisJCQkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UX0JUX1NDT19SWCIsICJJbnRlcm5hbCBCVC1TQ08gUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVF9CVF9TQ09fVFgiLCAiSW50ZXJuYWwgQlQtU0NPIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJTlRfQlRfQTJEUF9SWCIsICJJbnRlcm5hbCBCVC1BMkRQIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UX0ZNX1JYIiwgIkludGVybmFsIEZNIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJJTlRfRk1fVFgiLCAiSW50ZXJuYWwgRk0gQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBDTV9SWCIsICJBRkUgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBDTV9UWCIsICJBRkUgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMCIsICJQcmltYXJ5IFRETTAgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMCIsICJQcmltYXJ5IFRETTAgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMSIsICJQcmltYXJ5IFRETTEgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMSIsICJQcmltYXJ5IFRETTEgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMiIsICJQcmltYXJ5IFRETTIgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMiIsICJQcmltYXJ5IFRETTIgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMyIsICJQcmltYXJ5IFRETTMgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMyIsICJQcmltYXJ5IFRETTMgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNCIsICJQcmltYXJ5IFRETTQgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNCIsICJQcmltYXJ5IFRETTQgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNSIsICJQcmltYXJ5IFRETTUgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNSIsICJQcmltYXJ5IFRETTUgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNiIsICJQcmltYXJ5IFRETTYgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNiIsICJQcmltYXJ5IFRETTYgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNyIsICJQcmltYXJ5IFRETTcgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNyIsICJQcmltYXJ5IFRETTcgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfMCIsICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF8wIiwgIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzEiLCAiU2Vjb25kYXJ5IFRETTEgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfMSIsICJTZWNvbmRhcnkgVERNMSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX1RETV9SWF8yIiwgIlNlY29uZGFyeSBURE0yIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfVERNX1RYXzIiLCAiU2Vjb25kYXJ5IFRETTIgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfMyIsICJTZWNvbmRhcnkgVERNMyBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF8zIiwgIlNlY29uZGFyeSBURE0zIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzQiLCAiU2Vjb25kYXJ5IFRETTQgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfNCIsICJTZWNvbmRhcnkgVERNNCBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX1RETV9SWF81IiwgIlNlY29uZGFyeSBURE01IFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfVERNX1RYXzUiLCAiU2Vjb25kYXJ5IFRETTUgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfNiIsICJTZWNvbmRhcnkgVERNNiBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF82IiwgIlNlY29uZGFyeSBURE02IENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzciLCAiU2Vjb25kYXJ5IFRETTcgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfNyIsICJTZWNvbmRhcnkgVERNNyBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfMCIsICJUZXJ0aWFyeSBURE0wIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF8wIiwgIlRlcnRpYXJ5IFRETTAgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzEiLCAiVGVydGlhcnkgVERNMSBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfMSIsICJUZXJ0aWFyeSBURE0xIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9SWF8yIiwgIlRlcnRpYXJ5IFRETTIgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1RYXzIiLCAiVGVydGlhcnkgVERNMiBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfMyIsICJUZXJ0aWFyeSBURE0zIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF8zIiwgIlRlcnRpYXJ5IFRETTMgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzQiLCAiVGVydGlhcnkgVERNNCBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfNCIsICJUZXJ0aWFyeSBURE00IENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9SWF81IiwgIlRlcnRpYXJ5IFRETTUgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1RYXzUiLCAiVGVydGlhcnkgVERNNSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfNiIsICJUZXJ0aWFyeSBURE02IFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF82IiwgIlRlcnRpYXJ5IFRETTYgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzciLCAiVGVydGlhcnkgVERNNyBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfNyIsICJUZXJ0aWFyeSBURE03IENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF8wIiwgIlF1YXRlcm5hcnkgVERNMCBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfMCIsICJRdWF0ZXJuYXJ5IFRETTAgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzEiLCAiUXVhdGVybmFyeSBURE0xIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF8xIiwgIlF1YXRlcm5hcnkgVERNMSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fUlhfMiIsICJRdWF0ZXJuYXJ5IFRETTIgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1RYXzIiLCAiUXVhdGVybmFyeSBURE0yIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF8zIiwgIlF1YXRlcm5hcnkgVERNMyBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfMyIsICJRdWF0ZXJuYXJ5IFRETTMgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzQiLCAiUXVhdGVybmFyeSBURE00IFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF80IiwgIlF1YXRlcm5hcnkgVERNNCBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fUlhfNSIsICJRdWF0ZXJuYXJ5IFRETTUgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1RYXzUiLCAiUXVhdGVybmFyeSBURE01IENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF82IiwgIlF1YXRlcm5hcnkgVERNNiBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfNiIsICJRdWF0ZXJuYXJ5IFRETTYgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzciLCAiUXVhdGVybmFyeSBURE03IFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF83IiwgIlF1YXRlcm5hcnkgVERNNyBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwkvKiBpbmNhbGwgKi8KKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0VfUExBWUJBQ0tfVFgiLCAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0UyX1BMQVlCQUNLX1RYIiwgIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNQlVTXzRfUlgiLCAiU2xpbWJ1czQgUGxheWJhY2siLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOQ0FMTF9SRUNPUkRfVFgiLCAiVm9pY2UgVXBsaW5rIENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIklOQ0FMTF9SRUNPUkRfUlgiLCAiVm9pY2UgRG93bmxpbmsgQ2FwdHVyZSIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU180X1RYIiwgIlNsaW1idXM0IENhcHR1cmUiLAorCQkJCTAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFTkFSWV9UWCIsICJTZW5hcnlfbWkycyBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzVfVFgiLCAiU2xpbWJ1czUgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFVWF9QQ01fUlgiLCAiQVVYIFBDTSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIkFVWF9QQ01fVFgiLCAiQVVYIFBDTSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19BVVhfUENNX1JYIiwgIlNlYyBBVVggUENNIFBsYXliYWNrIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfQVVYX1BDTV9UWCIsICJTZWMgQVVYIFBDTSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9BVVhfUENNX1JYIiwgIlRlcnQgQVVYIFBDTSBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9BVVhfUENNX1RYIiwgIlRlcnQgQVVYIFBDTSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9BVVhfUENNX1JYIiwgIlF1YXQgQVVYIFBDTSBQbGF5YmFjayIsCisJCQkJMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9BVVhfUENNX1RYIiwgIlF1YXQgQVVYIFBDTSBDYXB0dXJlIiwKKwkJCQkwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJWT0lDRV9TVFVCX0RMIiwgIlZPSUNFX1NUVUIgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0VfU1RVQl9VTCIsICJWT0lDRV9TVFVCIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJWT0lDRTJfU1RVQl9ETCIsICJWT0lDRTJfU1RVQiBQbGF5YmFjayIsCisJCQkgICAgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlZPSUNFMl9TVFVCX1VMIiwgIlZPSUNFMl9TVFVCIENhcHR1cmUiLAorCQkJICAgIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPTFRFX1NUVUJfREwiLCAiVk9MVEVfU1RVQiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWT0xURV9TVFVCX1VMIiwgIlZPTFRFX1NUVUIgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTVFVCX1JYIiwgIlN0dWIgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTVFVCX1RYIiwgIlN0dWIgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNQlVTXzFfUlgiLCAiU2xpbWJ1czEgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzFfVFgiLCAiU2xpbWJ1czEgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNUVUJfMV9UWCIsICJTdHViMSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfM19SWCIsICJTbGltYnVzMyBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU1CVVNfM19UWCIsICJTbGltYnVzMyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisJLyogSW4tIGNhbGwgcmVjb3JkaW5nICovCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfNl9SWCIsICJTbGltYnVzNiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU1CVVNfNl9UWCIsICJTbGltYnVzNiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU183X1JYIiwgIlNsaW1idXM3IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU183X1RYIiwgIlNsaW1idXM3IENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNQlVTXzhfUlgiLCAiU2xpbWJ1czggUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzhfVFgiLCAiU2xpbWJ1czggQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJVU0JfQVVESU9fUlgiLCAiVVNCIEF1ZGlvIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiVVNCX0FVRElPX1RYIiwgIlVTQiBBdWRpbyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCisKKwkvKiBTd2l0Y2ggRGVmaW5pdGlvbnMgKi8KKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTTElNQlVTX0RMX0hMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCSZzbGltX2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiU0xJTUJVUzFfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW0xX2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiU0xJTUJVUzNfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW0zX2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiU0xJTUJVUzRfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW00X2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiU0xJTUJVUzZfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW02X2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiUENNX1JYX0RMX0hMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCSZwY21fcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJQUklfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmcHJpX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTRUNfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmc2VjX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJURVJUX01JMlNfUlhfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnRlcnRfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIlFVQVRfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmcXVhdF9taTJzX3J4X3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSEZQX1BSSV9BVVhfVUxfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJmhmcF9wcmlfYXV4X3N3aXRjaF9taXhlcl9jb250cm9scyksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSEZQX0FVWF9VTF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmaGZwX2F1eF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkhGUF9JTlRfVUxfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJmhmcF9pbnRfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKKworCS8qIE11eCBEZWZpbml0aW9ucyAqLworCVNORF9TT0NfREFQTV9NVVgoIkxTTTEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtMV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtMl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtM19tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTQgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtNF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtNV9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTYgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtNl9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTcgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtN19tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkxTTTggTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbHNtOF9tdXgpLAorCisJLyogTWl4ZXIgZGVmaW5pdGlvbnMgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlwcmlfaTJzX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHByaV9pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzZWNfaTJzX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNlY19pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfMF9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzbGltYnVzX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNsaW1idXNfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzbGltYnVzXzJfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2xpbWJ1c18yX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJc2xpbWJ1c181X3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNsaW1idXNfNV9yeF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCXNsaW1idXNfN19yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShzbGltYnVzXzdfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkhETUkgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJaGRtaV9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShoZG1pX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJESVNQTEFZX1BPUlQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJZGlzcGxheV9wb3J0X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKGRpc3BsYXlfcG9ydF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJc3BkaWZfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc3BkaWZfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJbWkyc19yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtaTJzX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJcXVhdGVybmFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocXVhdGVybmFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJdGVydGlhcnlfbWkyc19yeF9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHRlcnRpYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgc2Vjb25kYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHNlY29uZGFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfTUkyU19SWF9TRDEgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBzZWNvbmRhcnlfbWkyc19yeDJfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHNlY29uZGFyeV9taTJzX3J4Ml9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBwcmltYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHByaW1hcnlfbWkyc19yeF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiSU5UMF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgaW50MF9taTJzX3J4X21peGVyX2NvbnRyb2xzLAorCQkJICAgQVJSQVlfU0laRShpbnQwX21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklOVDRfTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIGludDRfbWkyc19yeF9taXhlcl9jb250cm9scywKKwkJCSAgIEFSUkFZX1NJWkUoaW50NF9taTJzX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUlOX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJcXVpbmFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocXVpbmFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJcHJpX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocHJpX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJcHJpX3RkbV90eF8wX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocHJpX3RkbV90eF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJc2VjX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUoc2VjX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJc2VjX3RkbV90eF8wX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUoc2VjX3RkbV90eF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXRlcnRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXRlcnRfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X3RkbV90eF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXRlcnRfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8xX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXRlcnRfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8yX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXRlcnRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8zX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShxdWF0X3RkbV9yeF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShxdWF0X3RkbV90eF8wX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShxdWF0X3RkbV9yeF8xX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShxdWF0X3RkbV9yeF8yX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShxdWF0X3RkbV9yeF8zX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltbXVsMV9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsMV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTIgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJbW11bDJfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDJfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWEzIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCW1tdWwzX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWwzX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhNCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltbXVsNF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsNF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTUgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJbW11bDVfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDVfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWE2IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCW1tdWw2X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWw2X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhOCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltbXVsOF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsOF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTE3IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCW1tdWwxN19taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsMTdfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWExOCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwltbXVsMThfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDE4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhMTkgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJbW11bDE5X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWwxOV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlhdXhwY21fcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzZWNfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNlY19hdXhwY21fcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwl0ZXJ0X2F1eHBjbV9yeF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHRlcnRfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJcXVhdF9hdXhwY21fcnhfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRShxdWF0X2F1eHBjbV9yeF9taXhlcl9jb250cm9scykpLAorCS8qIGluY2FsbCAqLworCVNORF9TT0NfREFQTV9NSVhFUigiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCWluY2FsbF9tdXNpY19kZWxpdmVyeV9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKGluY2FsbF9tdXNpY19kZWxpdmVyeV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiSW5jYWxsX011c2ljXzIgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJaW5jYWxsX211c2ljMl9kZWxpdmVyeV9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKGluY2FsbF9tdXNpYzJfZGVsaXZlcnlfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNF9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzbGltYnVzXzRfcnhfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRShzbGltYnVzXzRfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzbGltYnVzXzZfcnhfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRShzbGltYnVzXzZfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwl1c2JfYXVkaW9fcnhfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRSh1c2JfYXVkaW9fcnhfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBWb2ljZSBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUFJJX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsIHByaV9yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHByaV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0VDX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJc2VjX2kyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHNlY19pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJc2VjX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShzZWNfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTV8wX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJc2xpbWJ1c19yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHNsaW1idXNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCWJ0X3Njb19yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKGJ0X3Njb19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCWFmZV9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShhZmVfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKGF1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKKwkJCSAgICAgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgIHNlY19hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJICAgICAgQVJSQVlfU0laRShzZWNfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKKwkJCSAgICAgIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICAgIHRlcnRfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCSAgICAgIEFSUkFZX1NJWkUodGVydF9hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLAorCQkJICAgICAgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgICAgcXVhdF9hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJICAgICAgQVJSQVlfU0laRShxdWF0X2F1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkhETUlfUlhfVm9pY2UgTWl4ZXIiLAorCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQloZG1pX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUoaGRtaV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTUkyU19SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCW1pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShtaTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXByaV9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocHJpX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCWludDBfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKGludDBfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJaW50NF9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUoaW50NF9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLAorCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQl0ZXJ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0ZXJ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfTUkyU19SWF9Wb2ljZSBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCXF1YXRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHF1YXRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJcXVpbl9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUocXVpbl9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJWb2ljZV9UeCBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHR4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJWb2ljZTJfVHggTWl4ZXIiLAorCQkJICAgU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2ljZTJfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHR4X3ZvaWNlMl9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVm9pcF9UeCBNaXhlciIsCisJCQkJU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2lwX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUodHhfdm9pcF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVm9MVEVfVHggTWl4ZXIiLAorCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwgdHhfdm9sdGVfbWl4ZXJfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRSh0eF92b2x0ZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVm9XTEFOX1R4IE1peGVyIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDAsIHR4X3Zvd2xhbl9taXhlcl9jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKHR4X3Zvd2xhbl9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLAorCQkJICAgU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2ljZW1tb2RlMV9taXhlcl9jb250cm9scywKKwkJCSAgIEFSUkFZX1NJWkUodHhfdm9pY2VtbW9kZTFfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlZvaWNlTU1vZGUyX1R4IE1peGVyIiwKKwkJCSAgIFNORF9TT0NfTk9QTSwgMCwgMCwgdHhfdm9pY2VtbW9kZTJfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHR4X3ZvaWNlbW1vZGUyX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJaW50X2J0X3Njb19yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShpbnRfYnRfc2NvX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJaW50X2J0X2EyZHBfcnhfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGludF9idF9hMmRwX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlpbnRfZm1fcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoaW50X2ZtX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCWFmZV9wY21fcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoYWZlX3BjbV9yeF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVm9pY2UgU3R1YiBUeCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwl0eF92b2ljZV9zdHViX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHR4X3ZvaWNlX3N0dWJfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlZvaWNlMiBTdHViIFR4IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgdHhfdm9pY2UyX3N0dWJfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHR4X3ZvaWNlMl9zdHViX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJWb0xURSBTdHViIFR4IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCXR4X3ZvbHRlX3N0dWJfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUodHhfdm9sdGVfc3R1Yl9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1RVQl9SWCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzdHViX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHN0dWJfcnhfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfMV9SWCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzbGltYnVzXzFfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2xpbWJ1c18xX3J4X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzNfUlhfVm9pY2UgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJc2xpbWJ1c18zX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNsaW1idXNfM19yeF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCXNsaW1idXNfNl9yeF92b2ljZV9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoc2xpbWJ1c182X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBzbGltYnVzXzdfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCisJCQkgICBBUlJBWV9TSVpFKHNsaW1idXNfN19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgc2xpbWJ1c184X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCQkJICAgQVJSQVlfU0laRShzbGltYnVzXzhfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBwb3J0IG1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsCisJU05EX1NPQ19OT1BNLCAwLCAwLCBzYnVzXzBfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHNidXNfMF9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBVVhfUENNX1JYIFBvcnQgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgYXV4X3BjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUoYXV4X3BjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgc2VjX2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUoc2VjX2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwKKwlTTkRfU09DX05PUE0sIDAsIDAsIHRlcnRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRSh0ZXJ0X2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwKKwlTTkRfU09DX05PUE0sIDAsIDAsIHF1YXRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRShxdWF0X2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzFfUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlzYnVzXzFfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHNidXNfMV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJTlRFUk5BTF9CVF9TQ09fUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlidF9zY29fcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKGJ0X3Njb19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBRkVfUENNX1JYIFBvcnQgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgYWZlX3BjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUoYWZlX3BjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJIRE1JX1JYIFBvcnQgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgaGRtaV9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUoaGRtaV9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJESVNQTEFZX1BPUlRfUlggUG9ydCBNaXhlciIsCisJU05EX1NPQ19OT1BNLCAwLCAwLCBkaXNwbGF5X3BvcnRfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKGRpc3BsYXlfcG9ydF9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfSTJTX1JYIFBvcnQgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgc2VjX2kyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUoc2VjX2kyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzNfUlggUG9ydCBNaXhlciIsCisJU05EX1NPQ19OT1BNLCAwLCAwLCBzYnVzXzNfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHNidXNfM19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzZfUlggUG9ydCBNaXhlciIsCisJU05EX1NPQ19OT1BNLCAwLCAwLCBzYnVzXzZfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHNidXNfNl9yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJNSTJTX1JYIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1pMnNfcnhfcG9ydF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlwcmltYXJ5X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHByaW1hcnlfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCXNlY19taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCisJQVJSQVlfU0laRShzZWNfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX01JMlNfUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwl0ZXJ0X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHRlcnRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX01JMlNfUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwlxdWF0X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHF1YXRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJdGVydF90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUodGVydF90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJdGVydF90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUodGVydF90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJdGVydF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUodGVydF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJdGVydF90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUodGVydF90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJcXVhdF90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUocXVhdF90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJcXVhdF90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUocXVhdF90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJcXVhdF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUocXVhdF90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJcXVhdF90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUocXVhdF90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJRQ0hBVF9UeCBNaXhlciIsCisJU05EX1NPQ19OT1BNLCAwLCAwLCB0eF9xY2hhdF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHR4X3FjaGF0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJVU0JfQVVESU9fUlhfVm9pY2UgTWl4ZXIiLAorCVNORF9TT0NfTk9QTSwgMCwgMCwgdXNiX2F1ZGlvX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAorCUFSUkFZX1NJWkUodXNiX2F1ZGlvX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCisJLyogVmlydHVhbCBQaW5zIHRvIGZvcmNlIGJhY2tlbmRzIE9OIGF0bSAqLworCVNORF9TT0NfREFQTV9PVVRQVVQoIkJFX09VVCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQkVfSU4iKSwKKworCVNORF9TT0NfREFQTV9NVVgoIlNMSU0wX1JYX1ZJX0ZCX0xDSF9NVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW0wX3J4X3ZpX2ZiX2xjaF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNMSU0wX1JYX1ZJX0ZCX1JDSF9NVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkJJnNsaW0wX3J4X3ZpX2ZiX3JjaF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlBSSV9NSTJTX1JYX1ZJX0ZCX01VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmbWkyc19yeF92aV9mYl9tdXgpLAorCisJU05EX1NPQ19EQVBNX01VWCgiVk9DX0VYVF9FQyBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgJnZvY19leHRfZWNfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsMSksCisJU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMMiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZleHRfZWNfcmVmX211eF91bDIpLAorCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZXh0X2VjX3JlZl9tdXhfdWwzKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUw0IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsNCksCisJU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMNSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZleHRfZWNfcmVmX211eF91bDUpLAorCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDYgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZXh0X2VjX3JlZl9tdXhfdWw2KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUw4IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsOCksCisJU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMOSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZleHRfZWNfcmVmX211eF91bDkpLAorCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDE3IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsMTcpLAorCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDE4IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsMTgpLAorCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDE5IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmV4dF9lY19yZWZfbXV4X3VsMTkpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiUFJJX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiUFJJX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiUFJJX0kyU19SWCIsIE5VTEwsICJQUklfUlggQXVkaW8gTWl4ZXIifSwKKworCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJTRUNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJTRUNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJTRUNfSTJTX1JYIiwgTlVMTCwgIlNFQ19SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlNMSU1CVVNfMF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlNMSU1CVVNfMF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIifSwKKworCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJTTElNQlVTXzJfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJTTElNQlVTXzJfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJTTElNQlVTXzJfUlgiLCBOVUxMLCAiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiU0xJTUJVU181X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiU0xJTUJVU181X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiU0xJTUJVU181X1JYIiwgTlVMTCwgIlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJIRE1JIiwgTlVMTCwgIkhETUkgTWl4ZXIifSwKKworCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJESVNQTEFZX1BPUlQgTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJESVNQTEFZX1BPUlQgTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJESVNQTEFZX1BPUlQiLCBOVUxMLCAiRElTUExBWV9QT1JUIE1peGVyIn0sCisKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJTUERJRl9SWCIsIE5VTEwsICJTUERJRl9SWCBBdWRpbyBNaXhlciJ9LAorCisJLyogaW5jYWxsICovCisJeyJJbmNhbGxfTXVzaWMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJJbmNhbGxfTXVzaWMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJJbmNhbGxfTXVzaWMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJJbmNhbGxfTXVzaWMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJWT0lDRV9QTEFZQkFDS19UWCIsIE5VTEwsICJJbmNhbGxfTXVzaWMgQXVkaW8gTWl4ZXIifSwKKwl7IkluY2FsbF9NdXNpY18yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiSW5jYWxsX011c2ljXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJJbmNhbGxfTXVzaWNfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IkluY2FsbF9NdXNpY18yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiVk9JQ0UyX1BMQVlCQUNLX1RYIiwgTlVMTCwgIkluY2FsbF9NdXNpY18yIEF1ZGlvIE1peGVyIn0sCisJeyJTTElNQlVTXzRfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJTTElNQlVTXzRfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJTTElNQlVTXzRfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTTElNQlVTXzRfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJTTElNQlVTXzRfUlgiLCBOVUxMLCAiU0xJTUJVU180X1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiU0xJTUJVU182X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiU0xJTUJVU182X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiU0xJTUJVU182X1JYIiwgTlVMTCwgIlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlNMSU1CVVNfN19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlNMSU1CVVNfN19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlNMSU1CVVNfN19SWCIsIE5VTEwsICJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIifSwKKworCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJVU0JfQVVESU9fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJVU0JfQVVESU9fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJVU0JfQVVESU9fUlgiLCBOVUxMLCAiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlZPQ19SRUNfVUwiLCAiSU5DQUxMX1JFQ09SRF9UWCJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiVk9DX1JFQ19VTCIsICJJTkNBTExfUkVDT1JEX1RYIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJWT0NfUkVDX1VMIiwgIklOQ0FMTF9SRUNPUkRfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlZPQ19SRUNfREwiLCAiSU5DQUxMX1JFQ09SRF9SWCJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiVk9DX1JFQ19ETCIsICJJTkNBTExfUkVDT1JEX1JYIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJWT0NfUkVDX0RMIiwgIklOQ0FMTF9SRUNPUkRfUlgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNMSU1fNF9UWCIsICJTTElNQlVTXzRfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNMSU1fNl9UWCIsICJTTElNQlVTXzZfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNMSU1fN19UWCIsICJTTElNQlVTXzdfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlNMSU1fNl9UWCIsICJTTElNQlVTXzZfVFgifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlNMSU1fN19UWCIsICJTTElNQlVTXzdfVFgifSwKKwl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWExNyBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJNdWx0aU1lZGlhMTggTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiTXVsdGlNZWRpYTE5IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJNdWx0aU1lZGlhNCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiTXVsdGlNZWRpYTE3IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJNdWx0aU1lZGlhMTggTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExOSBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlNMSU1fN19UWCIsICJTTElNQlVTXzdfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7Ik1JMlNfUlgiLCBOVUxMLCAiTUkyU19SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUVVBVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUVVBVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlFVQVRfTUkyU19SWCIsIE5VTEwsICJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIifSwKKworCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlRFUlRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlRFUlRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJURVJUX01JMlNfUlgiLCBOVUxMLCAiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlNFQ19NSTJTX1JYIiwgTlVMTCwgIlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlNFQ19NSTJTX1JYX1NEMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlNFQ19NSTJTX1JYX1NEMSIsIE5VTEwsICJTRUNfTUkyU19SWF9TRDEgQXVkaW8gTWl4ZXIifSwKKworCXsiU0VDX01JMlNfUlggUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiU0VDX01JMlNfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKworCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJQUklfTUkyU19SWCIsIE5VTEwsICJQUklfTUkyU19SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiSU5UMF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiSU5UMF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IklOVDBfTUkyU19SWCIsIE5VTEwsICJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIifSwKKworCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IklOVDRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IklOVDRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJJTlQ0X01JMlNfUlgiLCBOVUxMLCAiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJRVUlOX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJRVUlOX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiUVVJTl9NSTJTX1JYIiwgTlVMTCwgIlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlBSSV9URE1fUlhfMCIsIE5VTEwsICJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIifSwKKworCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlBSSV9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlBSSV9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJQUklfVERNX1RYXzAiLCBOVUxMLCAiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIn0sCisKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiU0VDX1RETV9SWF8wIiwgTlVMTCwgIlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciJ9LAorCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiU0VDX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiU0VDX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlNFQ19URE1fVFhfMCIsIE5VTEwsICJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIifSwKKworCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiVEVSVF9URE1fUlhfMCIsIE5VTEwsICJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIn0sCisKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlRFUlRfVERNX1RYXzAiLCBOVUxMLCAiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciJ9LAorCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJURVJUX1RETV9SWF8xIiwgTlVMTCwgIlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIifSwKKworCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiVEVSVF9URE1fUlhfMiIsIE5VTEwsICJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIn0sCisKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlRFUlRfVERNX1JYXzMiLCBOVUxMLCAiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciJ9LAorCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJRVUFUX1RETV9SWF8wIiwgTlVMTCwgIlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIifSwKKworCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiUVVBVF9URE1fVFhfMCIsIE5VTEwsICJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIn0sCisKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlFVQVRfVERNX1JYXzEiLCBOVUxMLCAiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciJ9LAorCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJRVUFUX1RETV9SWF8yIiwgTlVMTCwgIlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIifSwKKworCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiUVVBVF9URE1fUlhfMyIsIE5VTEwsICJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIn0sCisKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlBSSV9UWCIsICJQUklfSTJTX1RYIn0sCisJeyJNdWx0aU1lZGlhMSBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCisJeyJNdWx0aU1lZGlhNSBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVSU5fTUkyU19UWCIsICJRVUlOX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlFVSU5fTUkyU19UWCIsICJRVUlOX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiQVVYX1BDTV9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhNSBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhMyBNaXhlciIsICJTRUNfQVVYX1BDTV9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfQVVYUENNX1VMX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVBVF9BVVhQQ01fVUxfVFgiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhMyBNaXhlciIsICJRVUFUX0FVWF9QQ01fVFgiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhNSBNaXhlciIsICJRVUFUX0FVWF9QQ01fVFgiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCisJeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJNdWx0aU1lZGlhNiBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhMSBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhMSBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhMiBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhMiBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhMyBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhMyBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhNCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhNCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhNSBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhNSBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhNiBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhNiBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKwl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKwl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKKworCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fVUw2In0sCisJeyJJTlRfQlRfU0NPX1JYIiwgTlVMTCwgIklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX1VMNiJ9LAorCXsiSU5UX0JUX0EyRFBfUlgiLCBOVUxMLCAiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiSU5UX0ZNX1JYIiwgTlVMTCwgIklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAorCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAorCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAorCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlBDTV9SWCIsIE5VTEwsICJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7Ik11bHRpTWVkaWExIE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJNdWx0aU1lZGlhMyBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7Ik11bHRpTWVkaWExNyBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiTXVsdGlNZWRpYTE4IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJNdWx0aU1lZGlhMTkgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJNdWx0aU1lZGlhNCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7Ik11bHRpTWVkaWExNyBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7Ik11bHRpTWVkaWExOCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7Ik11bHRpTWVkaWExOSBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJNdWx0aU1lZGlhOCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKworCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhNCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTE3IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJNdWx0aU1lZGlhMTggTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7Ik11bHRpTWVkaWExOSBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJNTV9VTDEiLCBOVUxMLCAiTXVsdGlNZWRpYTEgTWl4ZXIifSwKKwl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAorCXsiTU1fVUwyIiwgTlVMTCwgIk11bHRpTWVkaWEyIE1peGVyIn0sCisJeyJNTV9VTDMiLCBOVUxMLCAiTXVsdGlNZWRpYTMgTWl4ZXIifSwKKwl7Ik1NX1VMNCIsIE5VTEwsICJNdWx0aU1lZGlhNCBNaXhlciJ9LAorCXsiTU1fVUw1IiwgTlVMTCwgIk11bHRpTWVkaWE1IE1peGVyIn0sCisJeyJNTV9VTDYiLCBOVUxMLCAiTXVsdGlNZWRpYTYgTWl4ZXIifSwKKwl7Ik1NX1VMOCIsIE5VTEwsICJNdWx0aU1lZGlhOCBNaXhlciJ9LAorCXsiTU1fVUwxNyIsIE5VTEwsICJNdWx0aU1lZGlhMTcgTWl4ZXIifSwKKwl7Ik1NX1VMMTgiLCBOVUxMLCAiTXVsdGlNZWRpYTE4IE1peGVyIn0sCisJeyJNTV9VTDE5IiwgTlVMTCwgIk11bHRpTWVkaWExOSBNaXhlciJ9LAorCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAorCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAorCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAorCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCisJeyJBVVhfUENNX1JYIiwgTlVMTCwgIkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIifSwKKworCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAorCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAorCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAorCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAorCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAorCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlNFQ19BVVhfUENNX1JYIiwgTlVMTCwgIlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIn0sCisKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCisJeyJURVJUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAorCXsiVEVSVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCisJeyJURVJUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKKwl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAorCXsiVEVSVF9BVVhfUENNX1JYIiwgTlVMTCwgIlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciJ9LAorCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKKwl7IlFVQVRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAorCXsiUVVBVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKKwl7IlFVQVRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAorCXsiUVVBVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCisJeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKKwl7IlFVQVRfQVVYX1BDTV9SWCIsIE5VTEwsICJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIifSwKKworCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAorCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJNSTJTX1JYIiwgTlVMTCwgIk1JMlNfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IlBSSV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiUFJJX0kyU19SWCIsIE5VTEwsICJQUklfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJTRUNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJTRUNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJTRUNfSTJTX1JYIiwgTlVMTCwgIlNFQ19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAorCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKKwl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJTRUNfTUkyU19SWCIsIE5VTEwsICJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKKwl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKKwl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiU0xJTV8wX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNXzBfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCisJeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IlNMSU1fNl9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJTTElNQlVTXzZfUlgiLCBOVUxMLCAiU0xJTV82X1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAorCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiIsICJWT0lDRTJfREwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAorCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAorCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJVU0JfQVVESU9fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiVVNCX0FVRElPX1JYIiwgTlVMTCwgIlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiSU5URVJOQUxfQlRfU0NPX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKKwl7IklOVF9CVF9TQ09fUlgiLCBOVUxMLCAiSU5URVJOQUxfQlRfU0NPX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKKwl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IlBDTV9SWCIsIE5VTEwsICJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKKwl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiQVVYX1BDTV9SWCIsIE5VTEwsICJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKKwl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiU0VDX0FVWF9QQ01fUlgiLCBOVUxMLCAiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IlRFUlRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiVEVSVF9BVVhfUENNX1JYIiwgTlVMTCwgIlRFUlRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiUVVBVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJRVUFUX0FVWF9QQ01fUlgiLCBOVUxMLCAiUVVBVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJIRE1JX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKKwl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IkhETUkiLCBOVUxMLCAiSERNSV9SWF9Wb2ljZSBNaXhlciJ9LAorCXsiSERNSSIsIE5VTEwsICJIRE1JX0RMX0hMIn0sCisKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7Ik1JMlNfUlgiLCBOVUxMLCAiTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCisJeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7IlBSSV9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IlBSSV9NSTJTX1JYIiwgTlVMTCwgIlBSSV9NSTJTX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKKwl7IklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiSU5UMF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiSU5UMF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJJTlQwX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IklOVDBfTUkyU19SWCIsIE5VTEwsICJJTlQwX01JMlNfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJJTlQ0X01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJJTlQ0X01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IklOVDRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiSU5UNF9NSTJTX1JYIiwgTlVMTCwgIklOVDRfTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKKwl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiVEVSVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiVEVSVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IlRFUlRfTUkyU19SWCIsIE5VTEwsICJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IlFVQVRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJRVUFUX01JMlNfUlgiLCBOVUxMLCAiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAorCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiIsICJWT0lDRTJfREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAorCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAorCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCisJeyJRVUlOX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKKwl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAorCXsiUVVJTl9NSTJTX1JYIiwgTlVMTCwgIlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJWT0NfRVhUX0VDIE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiVk9DX0VYVF9FQyBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlZPQ19FWFRfRUMgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IlZPQ19FWFRfRUMgTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7IlZPQ19FWFRfRUMgTVVYIiwgIlNMSU1fMV9UWCIsICAgICJTTElNQlVTXzFfVFgifSwKKwl7IkNTLVZPSUNFX1VMMSIsIE5VTEwsICJWT0NfRVhUX0VDIE1VWCJ9LAorCXsiVk9JUF9VTCIsIE5VTEwsICJWT0NfRVhUX0VDIE1VWCJ9LAorCXsiVm9MVEVfVUwiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKKwl7IlZPSUNFMl9VTCIsIE5VTEwsICJWT0NfRVhUX0VDIE1VWCJ9LAorCXsiVk9JQ0VNTU9ERTFfVUwiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKKwl7IlZPSUNFTU1PREUyX1VMIiwgTlVMTCwgIlZPQ19FWFRfRUMgTVVYIn0sCisKKwl7IkFVRElPX1JFRl9FQ19VTDEgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCisJeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJRVUFUX1RETV9SWF8wIiwgIlFVQVRfVERNX1JYXzAifSwKKwl7IkFVRElPX1JFRl9FQ19VTDEgTVVYIiwgIlFVQVRfVERNX1JYXzEiLCAiUVVBVF9URE1fUlhfMSJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9URE1fUlhfMiIsICJRVUFUX1RETV9SWF8yIn0sCisJeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKKworCXsiQVVESU9fUkVGX0VDX1VMMiBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDIgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwyIE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwyIE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisKKwl7IkFVRElPX1JFRl9FQ19VTDMgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwzIE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMyBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMyBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCisJeyJBVURJT19SRUZfRUNfVUw0IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMNCBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDQgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDQgTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKworCXsiQVVESU9fUkVGX0VDX1VMNSBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDUgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUw1IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUw1IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisKKwl7IkFVRElPX1JFRl9FQ19VTDYgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUw2IE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMNiBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMNiBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCisJeyJBVURJT19SRUZfRUNfVUw4IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMOCBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDggTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDggTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKworCXsiQVVESU9fUkVGX0VDX1VMOSBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDkgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUw5IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUw5IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisKKwl7IkFVRElPX1JFRl9FQ19VTDE3IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMTcgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwxNyBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMTcgTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKworCXsiQVVESU9fUkVGX0VDX1VMMTggTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwxOCBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDE4IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJBVURJT19SRUZfRUNfVUwxOCBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCisJeyJBVURJT19SRUZfRUNfVUwxOSBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDE5IE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiQVVESU9fUkVGX0VDX1VMMTkgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IkFVRElPX1JFRl9FQ19VTDE5IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisKKwl7Ik1NX1VMMSIsIE5VTEwsICJBVURJT19SRUZfRUNfVUwxIE1VWCJ9LAorCXsiTU1fVUwyIiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDIgTVVYIn0sCisJeyJNTV9VTDMiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMMyBNVVgifSwKKwl7Ik1NX1VMNCIsIE5VTEwsICJBVURJT19SRUZfRUNfVUw0IE1VWCJ9LAorCXsiTU1fVUw1IiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDUgTVVYIn0sCisJeyJNTV9VTDYiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMNiBNVVgifSwKKwl7Ik1NX1VMOCIsIE5VTEwsICJBVURJT19SRUZfRUNfVUw4IE1VWCJ9LAorCXsiTU1fVUw5IiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDkgTVVYIn0sCisJeyJNTV9VTDE3IiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDE3IE1VWCJ9LAorCXsiTU1fVUwxOCIsIE5VTEwsICJBVURJT19SRUZfRUNfVUwxOCBNVVgifSwKKwl7Ik1NX1VMMTkiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMMTkgTVVYIn0sCisKKwl7IlZvaWNlX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2ljZSIsICJQUklfSTJTX1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb2ljZSIsICJQUklfTUkyU19UWCJ9LAorCXsiVm9pY2VfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb2ljZSIsICJNSTJTX1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfVm9pY2UiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzBfVFhfVm9pY2UiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzdfVFhfVm9pY2UiLCAiU0xJTUJVU183X1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9pY2UiLCAiU0xJTUJVU184X1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJVU0JfQVVESU9fVFhfVm9pY2UiLCAiVVNCX0FVRElPX1RYIn0sCisJeyJWb2ljZV9UeCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFhfVm9pY2UiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiVm9pY2VfVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb2ljZSIsICJQQ01fVFgifSwKKwl7IlZvaWNlX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfVm9pY2UiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2VfVHggTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFhfVm9pY2UiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlZvaWNlX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb2ljZSIsICJURVJUX0FVWF9QQ01fVFgifSwKKwl7IlZvaWNlX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9Wb2ljZSIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlZvaWNlX1R4IE1peGVyIiwgIlNFQ19NSTJTX1RYX1ZvaWNlIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJDUy1WT0lDRV9VTDEiLCBOVUxMLCAiVm9pY2VfVHggTWl4ZXIifSwKKworCXsiVm9pY2UyX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2ljZTIiLCAiUFJJX0kyU19UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIlBSSV9NSTJTX1RYX1ZvaWNlMiIsICJQUklfTUkyU19UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIk1JMlNfVFhfVm9pY2UyIiwgIk1JMlNfVFgifSwKKwl7IlZvaWNlMl9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfVm9pY2UyIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb2ljZTIiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb2ljZTJfVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvaWNlMiIsICJTTElNQlVTXzdfVFgifSwKKwl7IlZvaWNlMl9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9pY2UyIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb2ljZTIiLCAiVVNCX0FVRElPX1RYIn0sCisJeyJWb2ljZTJfVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaWNlMiIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJWb2ljZTJfVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb2ljZTIiLCAiUENNX1RYIn0sCisJeyJWb2ljZTJfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb2ljZTIiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvaWNlMiIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2UyX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb2ljZTIiLCAiVEVSVF9BVVhfUENNX1RYIn0sCisJeyJWb2ljZTJfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvaWNlMiIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlZPSUNFMl9VTCIsIE5VTEwsICJWb2ljZTJfVHggTWl4ZXIifSwKKworCXsiVm9MVEVfVHggTWl4ZXIiLCAiUFJJX1RYX1ZvTFRFIiwgIlBSSV9JMlNfVFgifSwKKwl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb0xURSIsICJTTElNQlVTXzBfVFgifSwKKwl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fN19UWF9Wb0xURSIsICJTTElNQlVTXzdfVFgifSwKKwl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fOF9UWF9Wb0xURSIsICJTTElNQlVTXzhfVFgifSwKKwl7IlZvTFRFX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb0xURSIsICJVU0JfQVVESU9fVFgifSwKKwl7IlZvTFRFX1R4IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWF9Wb0xURSIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJWb0xURV9UeCBNaXhlciIsICJBRkVfUENNX1RYX1ZvTFRFIiwgIlBDTV9UWCJ9LAorCXsiVm9MVEVfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb0xURSIsICJBVVhfUENNX1RYIn0sCisJeyJWb0xURV9UeCBNaXhlciIsICJTRUNfQVVYX1BDTV9UWF9Wb0xURSIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVm9MVEVfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX1ZvTFRFIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiVm9MVEVfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvTFRFIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAorCXsiVm9MVEVfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb0xURSIsICJNSTJTX1RYIn0sCisJeyJWb0xURV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb0xURSIsICJQUklfTUkyU19UWCJ9LAorCXsiVm9MVEVfVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvTFRFIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiVm9MVEVfVUwiLCBOVUxMLCAiVm9MVEVfVHggTWl4ZXIifSwKKworCXsiVm9XTEFOX1R4IE1peGVyIiwgIlBSSV9UWF9Wb1dMQU4iLCAiUFJJX0kyU19UWCJ9LAorCXsiVm9XTEFOX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb1dMQU4iLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvV0xBTiIsICJTTElNQlVTXzdfVFgifSwKKwl7IlZvV0xBTl9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9XTEFOIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiVm9XTEFOX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb1dMQU4iLCAiVVNCX0FVRElPX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvV0xBTiIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb1dMQU4iLCAiUENNX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb1dMQU4iLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9XTEFOX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvV0xBTiIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVm9XTEFOX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb1dMQU4iLCAiVEVSVF9BVVhfUENNX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvV0xBTiIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlZvV0xBTl9UeCBNaXhlciIsICJNSTJTX1RYX1ZvV0xBTiIsICJNSTJTX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiUFJJX01JMlNfVFhfVm9XTEFOIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJWb1dMQU5fVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvV0xBTiIsICJURVJUX01JMlNfVFgifSwKKwl7IlZvV0xBTl9VTCIsIE5VTEwsICJWb1dMQU5fVHggTWl4ZXIifSwKKworCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiUFJJX1RYX01Nb2RlMSIsICJQUklfSTJTX1RYIn0sCisJeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9NTW9kZTEiLCAiUFJJX01JMlNfVFgifSwKKwl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIk1JMlNfVFhfTU1vZGUxIiwgIk1JMlNfVFgifSwKKwl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIlRFUlRfTUkyU19UWF9NTW9kZTEiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJJTlQzX01JMlNfVFhfTU1vZGUxIiwgIklOVDNfTUkyU19UWCJ9LAorCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiU0xJTV8wX1RYX01Nb2RlMSIsICJTTElNQlVTXzBfVFgifSwKKwl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIlNMSU1fN19UWF9NTW9kZTEiLCAiU0xJTUJVU183X1RYIn0sCisJeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJTTElNXzhfVFhfTU1vZGUxIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiVVNCX0FVRElPX1RYX01Nb2RlMSIsICJVU0JfQVVESU9fVFgifSwKKwl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIklOVF9CVF9TQ09fVFhfTU1vZGUxIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIkFGRV9QQ01fVFhfTU1vZGUxIiwgIlBDTV9UWCJ9LAorCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9NTW9kZTEiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFhfTU1vZGUxIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJURVJUX0FVWF9QQ01fVFhfTU1vZGUxIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX01Nb2RlMSIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlZPSUNFTU1PREUxX1VMIiwgTlVMTCwgIlZvaWNlTU1vZGUxX1R4IE1peGVyIn0sCisKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlBSSV9UWF9NTW9kZTIiLCAiUFJJX0kyU19UWCJ9LAorCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiUFJJX01JMlNfVFhfTU1vZGUyIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJNSTJTX1RYX01Nb2RlMiIsICJNSTJTX1RYIn0sCisJeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfTU1vZGUyIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiSU5UM19NSTJTX1RYX01Nb2RlMiIsICJJTlQzX01JMlNfVFgifSwKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9NTW9kZTIiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJTTElNXzdfVFhfTU1vZGUyIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiU0xJTV84X1RYX01Nb2RlMiIsICJTTElNQlVTXzhfVFgifSwKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9NTW9kZTIiLCAiVVNCX0FVRElPX1RYIn0sCisJeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJJTlRfQlRfU0NPX1RYX01Nb2RlMiIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJBRkVfUENNX1RYX01Nb2RlMiIsICJQQ01fVFgifSwKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfTU1vZGUyIiwgIkFVWF9QQ01fVFgifSwKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX01Nb2RlMiIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX01Nb2RlMiIsICJURVJUX0FVWF9QQ01fVFgifSwKKwl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9NTW9kZTIiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJWT0lDRU1NT0RFMl9VTCIsIE5VTEwsICJWb2ljZU1Nb2RlMl9UeCBNaXhlciJ9LAorCisJeyJWb2lwX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2lwIiwgIlBSSV9JMlNfVFgifSwKKwl7IlZvaXBfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb2lwIiwgIk1JMlNfVFgifSwKKwl7IlZvaXBfVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvaXAiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJWb2lwX1R4IE1peGVyIiwgIklOVDNfTUkyU19UWF9Wb2lwIiwgIklOVDNfTUkyU19UWCJ9LAorCXsiVm9pcF9UeCBNaXhlciIsICJTTElNXzBfVFhfVm9pcCIsICJTTElNQlVTXzBfVFgifSwKKwl7IlZvaXBfVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvaXAiLCAiU0xJTUJVU183X1RYIn0sCisJeyJWb2lwX1R4IE1peGVyIiwgIlNMSU1fOF9UWF9Wb2lwIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiVm9pcF9UeCBNaXhlciIsICJVU0JfQVVESU9fVFhfVm9pcCIsICJVU0JfQVVESU9fVFgifSwKKwl7IlZvaXBfVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaXAiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiVm9pcF9UeCBNaXhlciIsICJBRkVfUENNX1RYX1ZvaXAiLCAiUENNX1RYIn0sCisJeyJWb2lwX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfVm9pcCIsICJBVVhfUENNX1RYIn0sCisJeyJWb2lwX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvaXAiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlZvaXBfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX1ZvaXAiLCAiVEVSVF9BVVhfUENNX1RYIn0sCisJeyJWb2lwX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9Wb2lwIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAorCXsiVm9pcF9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb2lwIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJWT0lQX1VMIiwgTlVMTCwgIlZvaXBfVHggTWl4ZXIifSwKKworCXsiU0xJTUJVU19ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTBfRExfSEwifSwKKwl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNQlVTX0RMX0hMIn0sCisJeyJTTElNQlVTMV9ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTFfRExfSEwifSwKKwl7IlNMSU1CVVNfMV9SWCIsIE5VTEwsICJTTElNQlVTMV9ETF9ITCJ9LAorCXsiU0xJTUJVUzNfRExfSEwiLCAiU3dpdGNoIiwgIlNMSU0zX0RMX0hMIn0sCisJeyJTTElNQlVTXzNfUlgiLCBOVUxMLCAiU0xJTUJVUzNfRExfSEwifSwKKwl7IlNMSU1CVVM0X0RMX0hMIiwgIlN3aXRjaCIsICJTTElNNF9ETF9ITCJ9LAorCXsiU0xJTUJVU180X1JYIiwgTlVMTCwgIlNMSU1CVVM0X0RMX0hMIn0sCisJeyJTTElNQlVTNl9ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTBfRExfSEwifSwKKwl7IlNMSU1CVVNfNl9SWCIsIE5VTEwsICJTTElNQlVTNl9ETF9ITCJ9LAorCXsiU0xJTTBfVUxfSEwiLCBOVUxMLCAiU0xJTUJVU18wX1RYIn0sCisJeyJTTElNMV9VTF9ITCIsIE5VTEwsICJTTElNQlVTXzFfVFgifSwKKwl7IlNMSU0zX1VMX0hMIiwgTlVMTCwgIlNMSU1CVVNfM19UWCJ9LAorCXsiU0xJTTRfVUxfSEwiLCBOVUxMLCAiU0xJTUJVU180X1RYIn0sCisJeyJTTElNOF9VTF9ITCIsIE5VTEwsICJTTElNQlVTXzhfVFgifSwKKworCXsiTFNNMSBNVVgiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiTFNNMSBNVVgiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiTFNNMSBNVVgiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAorCXsiTFNNMSBNVVgiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAorCXsiTFNNMSBNVVgiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAorCXsiTFNNMSBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiTFNNMV9VTF9ITCIsIE5VTEwsICJMU00xIE1VWCJ9LAorCisJeyJMU00yIE1VWCIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJMU00yIE1VWCIsICJTTElNQlVTXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCisJeyJMU00yIE1VWCIsICJTTElNQlVTXzNfVFgiLCAiU0xJTUJVU18zX1RYIn0sCisJeyJMU00yIE1VWCIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCisJeyJMU00yIE1VWCIsICJTTElNQlVTXzVfVFgiLCAiU0xJTUJVU181X1RYIn0sCisJeyJMU00yIE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJMU00yX1VMX0hMIiwgTlVMTCwgIkxTTTIgTVVYIn0sCisKKworCXsiTFNNMyBNVVgiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiTFNNMyBNVVgiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiTFNNMyBNVVgiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAorCXsiTFNNMyBNVVgiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAorCXsiTFNNMyBNVVgiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAorCXsiTFNNMyBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiTFNNM19VTF9ITCIsIE5VTEwsICJMU00zIE1VWCJ9LAorCisKKwl7IkxTTTQgTVVYIiwgIlNMSU1CVVNfMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IkxTTTQgTVVYIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IkxTTTQgTVVYIiwgIlNMSU1CVVNfM19UWCIsICJTTElNQlVTXzNfVFgifSwKKwl7IkxTTTQgTVVYIiwgIlNMSU1CVVNfNF9UWCIsICJTTElNQlVTXzRfVFgifSwKKwl7IkxTTTQgTVVYIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKKwl7IkxTTTQgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IkxTTTRfVUxfSEwiLCBOVUxMLCAiTFNNNCBNVVgifSwKKworCXsiTFNNNSBNVVgiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiTFNNNSBNVVgiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiTFNNNSBNVVgiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAorCXsiTFNNNSBNVVgiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAorCXsiTFNNNSBNVVgiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAorCXsiTFNNNSBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiTFNNNV9VTF9ITCIsIE5VTEwsICJMU001IE1VWCJ9LAorCisJeyJMU002IE1VWCIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJMU002IE1VWCIsICJTTElNQlVTXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCisJeyJMU002IE1VWCIsICJTTElNQlVTXzNfVFgiLCAiU0xJTUJVU18zX1RYIn0sCisJeyJMU002IE1VWCIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCisJeyJMU002IE1VWCIsICJTTElNQlVTXzVfVFgiLCAiU0xJTUJVU181X1RYIn0sCisJeyJMU002X1VMX0hMIiwgTlVMTCwgIkxTTTYgTVVYIn0sCisKKworCXsiTFNNNyBNVVgiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiTFNNNyBNVVgiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiTFNNNyBNVVgiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAorCXsiTFNNNyBNVVgiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAorCXsiTFNNNyBNVVgiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAorCXsiTFNNN19VTF9ITCIsIE5VTEwsICJMU003IE1VWCJ9LAorCisKKwl7IkxTTTggTVVYIiwgIlNMSU1CVVNfMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IkxTTTggTVVYIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IkxTTTggTVVYIiwgIlNMSU1CVVNfM19UWCIsICJTTElNQlVTXzNfVFgifSwKKwl7IkxTTTggTVVYIiwgIlNMSU1CVVNfNF9UWCIsICJTTElNQlVTXzRfVFgifSwKKwl7IkxTTTggTVVYIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKKwl7IkxTTThfVUxfSEwiLCBOVUxMLCAiTFNNOCBNVVgifSwKKworCisJeyJDUEVfTFNNX1VMX0hMIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJQUklfVFhfUUNIQVQiLCAiUFJJX0kyU19UWCJ9LAorCXsiUUNIQVRfVHggTWl4ZXIiLCAiU0xJTV8wX1RYX1FDSEFUIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiUUNIQVRfVHggTWl4ZXIiLCAiU0xJTV83X1RYX1FDSEFUIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiUUNIQVRfVHggTWl4ZXIiLCAiU0xJTV84X1RYX1FDSEFUIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiUUNIQVRfVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1FDSEFUIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7IlFDSEFUX1R4IE1peGVyIiwgIkFGRV9QQ01fVFhfUUNIQVQiLCAiUENNX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJBVVhfUENNX1RYX1FDSEFUIiwgIkFVWF9QQ01fVFgifSwKKwl7IlFDSEFUX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1FDSEFUIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJURVJUX0FVWF9QQ01fVFhfUUNIQVQiLCAiVEVSVF9BVVhfUENNX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJRVUFUX0FVWF9QQ01fVFhfUUNIQVQiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJNSTJTX1RYX1FDSEFUIiwgIk1JMlNfVFgifSwKKwl7IlFDSEFUX1R4IE1peGVyIiwgIlBSSV9NSTJTX1RYX1FDSEFUIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfUUNIQVQiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJJTlQzX01JMlNfVFhfUUNIQVQiLCAiSU5UM19NSTJTX1RYIn0sCisJeyJRQ0hBVF9UeCBNaXhlciIsICJVU0JfQVVESU9fVFhfUUNIQVQiLCAiVVNCX0FVRElPX1RYIn0sCisJeyJRQ0hBVF9VTCIsIE5VTEwsICJRQ0hBVF9UeCBNaXhlciJ9LAorCisJeyJJTlRfRk1fUlgiLCBOVUxMLCAiSU5URk1fRExfSEwifSwKKwl7IklOVEZNX1VMX0hMIiwgTlVMTCwgIklOVF9GTV9UWCJ9LAorCXsiSU5USEZQX1VMX0hMIiwgTlVMTCwgIkhGUF9QUklfQVVYX1VMX0hMIn0sCisJeyJIRlBfUFJJX0FVWF9VTF9ITCIsICJTd2l0Y2giLCAiQVVYX1BDTV9UWCJ9LAorCXsiSU5USEZQX1VMX0hMIiwgTlVMTCwgIkhGUF9BVVhfVUxfSEwifSwKKwl7IkhGUF9BVVhfVUxfSEwiLCAiU3dpdGNoIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJJTlRIRlBfVUxfSEwiLCBOVUxMLCAiSEZQX0lOVF9VTF9ITCJ9LAorCXsiSEZQX0lOVF9VTF9ITCIsICJTd2l0Y2giLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiQVVYX1BDTV9SWCIsIE5VTEwsICJBVVhQQ01fRExfSEwifSwKKwl7IkFVWFBDTV9VTF9ITCIsIE5VTEwsICJBVVhfUENNX1RYIn0sCisJeyJNSTJTX1JYIiwgTlVMTCwgIk1JMlNfRExfSEwifSwKKwl7Ik1JMlNfVUxfSEwiLCBOVUxMLCAiTUkyU19UWCJ9LAorCXsiUENNX1JYX0RMX0hMIiwgIlN3aXRjaCIsICJTTElNMF9ETF9ITCJ9LAorCXsiUENNX1JYIiwgTlVMTCwgIlBDTV9SWF9ETF9ITCJ9LAorCXsiSU5UMF9NSTJTX1JYX0RMX0hMIiwgIlN3aXRjaCIsICJJTlQwX01JMlNfRExfSEwifSwKKwl7IklOVDBfTUkyU19SWCIsIE5VTEwsICJJTlQwX01JMlNfUlhfRExfSEwifSwKKwl7IklOVDRfTUkyU19SWF9ETF9ITCIsICJTd2l0Y2giLCAiSU5UNF9NSTJTX0RMX0hMIn0sCisJeyJJTlQ0X01JMlNfUlgiLCBOVUxMLCAiSU5UNF9NSTJTX1JYX0RMX0hMIn0sCisJeyJQUklfTUkyU19SWF9ETF9ITCIsICJTd2l0Y2giLCAiUFJJX01JMlNfRExfSEwifSwKKwl7IlBSSV9NSTJTX1JYIiwgTlVMTCwgIlBSSV9NSTJTX1JYX0RMX0hMIn0sCisJeyJTRUNfTUkyU19SWF9ETF9ITCIsICJTd2l0Y2giLCAiU0VDX01JMlNfRExfSEwifSwKKwl7IlNFQ19NSTJTX1JYIiwgTlVMTCwgIlNFQ19NSTJTX1JYX0RMX0hMIn0sCisJeyJURVJUX01JMlNfUlhfRExfSEwiLCAiU3dpdGNoIiwgIlRFUlRfTUkyU19ETF9ITCJ9LAorCXsiVEVSVF9NSTJTX1JYIiwgTlVMTCwgIlRFUlRfTUkyU19SWF9ETF9ITCJ9LAorCisJeyJRVUFUX01JMlNfUlhfRExfSEwiLCAiU3dpdGNoIiwgIlFVQVRfTUkyU19ETF9ITCJ9LAorCXsiUVVBVF9NSTJTX1JYIiwgTlVMTCwgIlFVQVRfTUkyU19SWF9ETF9ITCJ9LAorCXsiTUkyU19VTF9ITCIsIE5VTEwsICJURVJUX01JMlNfVFgifSwKKwl7IlRFUlRfTUkyU19VTF9ITCIsIE5VTEwsICJURVJUX01JMlNfVFgifSwKKwl7IlNFQ19JMlNfUlgiLCBOVUxMLCAiU0VDX0kyU19ETF9ITCJ9LAorCXsiUFJJX01JMlNfVUxfSEwiLCBOVUxMLCAiUFJJX01JMlNfVFgifSwKKwl7IlNFQ19NSTJTX1JYIiwgTlVMTCwgIlNFQ19NSTJTX0RMX0hMIn0sCisJeyJQUklfTUkyU19SWCIsIE5VTEwsICJQUklfTUkyU19ETF9ITCJ9LAorCXsiVEVSVF9NSTJTX1JYIiwgTlVMTCwgIlRFUlRfTUkyU19ETF9ITCJ9LAorCXsiUVVBVF9NSTJTX1VMX0hMIiwgTlVMTCwgIlFVQVRfTUkyU19UWCJ9LAorCisJeyJQUklfVERNX1RYXzBfVUxfSEwiLCBOVUxMLCAiUFJJX1RETV9UWF8wIn0sCisJeyJQUklfVERNX1JYXzAiLCBOVUxMLCAiUFJJX1RETV9SWF8wX0RMX0hMIn0sCisJeyJTRUNfVERNX1RYXzBfVUxfSEwiLCBOVUxMLCAiU0VDX1RETV9UWF8wIn0sCisJeyJTRUNfVERNX1JYXzAiLCBOVUxMLCAiU0VDX1RETV9SWF8wX0RMX0hMIn0sCisJeyJURVJUX1RETV9UWF8wX1VMX0hMIiwgTlVMTCwgIlRFUlRfVERNX1RYXzAifSwKKwl7IlRFUlRfVERNX1RYXzFfVUxfSEwiLCBOVUxMLCAiVEVSVF9URE1fVFhfMSJ9LAorCXsiVEVSVF9URE1fVFhfMl9VTF9ITCIsIE5VTEwsICJURVJUX1RETV9UWF8yIn0sCisJeyJURVJUX1RETV9UWF8zX1VMX0hMIiwgTlVMTCwgIlRFUlRfVERNX1RYXzMifSwKKwl7IlRFUlRfVERNX1JYXzAiLCBOVUxMLCAiVEVSVF9URE1fUlhfMF9ETF9ITCJ9LAorCXsiVEVSVF9URE1fUlhfMSIsIE5VTEwsICJURVJUX1RETV9SWF8wX0RMX0hMIn0sCisJeyJURVJUX1RETV9SWF8yIiwgTlVMTCwgIlRFUlRfVERNX1JYXzBfRExfSEwifSwKKwl7IlRFUlRfVERNX1JYXzMiLCBOVUxMLCAiVEVSVF9URE1fUlhfMF9ETF9ITCJ9LAorCXsiUVVBVF9URE1fVFhfMF9VTF9ITCIsIE5VTEwsICJRVUFUX1RETV9UWF8wIn0sCisJeyJRVUFUX1RETV9UWF8xX1VMX0hMIiwgTlVMTCwgIlFVQVRfVERNX1RYXzEifSwKKwl7IlFVQVRfVERNX1RYXzJfVUxfSEwiLCBOVUxMLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiUVVBVF9URE1fVFhfM19VTF9ITCIsIE5VTEwsICJRVUFUX1RETV9UWF8zIn0sCisJeyJRVUFUX1RETV9SWF8wIiwgTlVMTCwgIlFVQVRfVERNX1JYXzBfRExfSEwifSwKKwl7IlFVQVRfVERNX1JYXzEiLCBOVUxMLCAiUVVBVF9URE1fUlhfMV9ETF9ITCJ9LAorCXsiUVVBVF9URE1fUlhfMiIsIE5VTEwsICJRVUFUX1RETV9SWF8yX0RMX0hMIn0sCisJeyJRVUFUX1RETV9SWF8zIiwgTlVMTCwgIlFVQVRfVERNX1JYXzNfRExfSEwifSwKKworCXsiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCisJeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisJeyJURVJUX1RETV9SWF8wIiwgTlVMTCwgIlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciJ9LAorCisJeyJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKKwl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKKwl7IlRFUlRfVERNX1JYXzEiLCBOVUxMLCAiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIn0sCisKKwl7IlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7IlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKKwl7IlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzIiLCAiVEVSVF9URE1fVFhfMiJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAorCXsiVEVSVF9URE1fUlhfMiIsIE5VTEwsICJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIifSwKKworCXsiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCisJeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisJeyJURVJUX1RETV9SWF8zIiwgTlVMTCwgIlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciJ9LAorCisJeyJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKKwl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKKwl7IlFVQVRfVERNX1JYXzAiLCBOVUxMLCAiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIn0sCisKKwl7IlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7IlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKKwl7IlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzIiLCAiVEVSVF9URE1fVFhfMiJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAorCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAorCXsiUVVBVF9URE1fUlhfMSIsIE5VTEwsICJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIifSwKKworCXsiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKKwl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCisJeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCisJeyJRVUFUX1RETV9SWF8yIiwgTlVMTCwgIlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciJ9LAorCisJeyJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKKwl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKKwl7IlFVQVRfVERNX1JYXzMiLCBOVUxMLCAiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIn0sCisKKwl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV84X1RYIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9BVVhQQ01fVUxfVFgiLCAiVEVSVF9BVVhfUENNX1RYIn0sCisJeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJRVUFUX0FVWFBDTV9VTF9UWCIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCisJeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisJeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiU0xJTUJVU18wX1JYIiwgTlVMTCwgIlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIn0sCisJeyJBRkVfUENNX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJBRkVfUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiUENNX1JYIiwgTlVMTCwgIkFGRV9QQ01fUlggUG9ydCBNaXhlciJ9LAorCisJeyJBVVhfUENNX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJBVVhfUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiQVVYX1BDTV9SWCBQb3J0IE1peGVyIiwgIlNMSU1fMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IkFVWF9QQ01fUlggUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiQVVYX1BDTV9SWCIsIE5VTEwsICJBVVhfUENNX1JYIFBvcnQgTWl4ZXIifSwKKworCXsiU0VDX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiU0VDX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCisJeyJTRUNfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiU0VDX0FVWF9QQ01fUlgiLCBOVUxMLCAiU0VDX0FVWFBDTV9SWCBQb3J0IE1peGVyIn0sCisKKwl7IlRFUlRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJURVJUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIlRFUlRfQVVYUENNX1VMX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAorCXsiVEVSVF9BVVhQQ01fUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJURVJUX0FVWF9QQ01fUlgiLCBOVUxMLCAiVEVSVF9BVVhQQ01fUlggUG9ydCBNaXhlciJ9LAorCisJeyJRVUFUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiUVVBVF9BVVhQQ01fUlggUG9ydCBNaXhlciIsICJRVUFUX0FVWFBDTV9VTF9UWCIsICJRVUFUX0FVWF9QQ01fVFgifSwKKwl7IlFVQVRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiUVVBVF9BVVhfUENNX1JYIiwgTlVMTCwgIlFVQVRfQVVYUENNX1JYIFBvcnQgTWl4ZXIifSwKKworCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTVFVCX1RYX0hMIiwgIlNUVUJfVFgifSwKKwl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTVFVCXzFfVFhfSEwiLCAiU1RVQl8xX1RYIn0sCisJeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJURVJUX0FVWFBDTV9VTF9UWCIsICJURVJUX0FVWF9QQ01fVFgifSwKKwl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiUVVBVF9BVVhQQ01fVUxfVFgiLCAiUVVBVF9BVVhfUENNX1RYIn0sCisJeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKKwl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNMSU1fM19UWCIsICJTTElNQlVTXzNfVFgifSwKKwl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCisJeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJWT0lDRV9TVFVCX1VMIiwgTlVMTCwgIlZvaWNlIFN0dWIgVHggTWl4ZXIifSwKKworCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTVFVCX1RYX0hMIiwgIlNUVUJfVFgifSwKKwl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAorCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTVFVCXzFfVFhfSEwiLCAiU1RVQl8xX1RYIn0sCisJeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCisJeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlNMSU1fM19UWCIsICJTTElNQlVTXzNfVFgifSwKKwl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCisJeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCisJeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7IlZPTFRFX1NUVUJfVUwiLCBOVUxMLCAiVm9MVEUgU3R1YiBUeCBNaXhlciJ9LAorCisJeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJTVFVCX1RYX0hMIiwgIlNUVUJfVFgifSwKKwl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIlNMSU1fMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIlNUVUJfMV9UWF9ITCIsICJTVFVCXzFfVFgifSwKKwl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAorCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAorCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV84X1RYIiwgIlNMSU1CVVNfOF9UWCJ9LAorCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKKwl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisJeyJWT0lDRTJfU1RVQl9VTCIsIE5VTEwsICJWb2ljZTIgU3R1YiBUeCBNaXhlciJ9LAorCisJeyJTVFVCX1JYIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiU1RVQl9SWCBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAorCXsiU1RVQl9SWCBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKKwl7IlNUVUJfUlgiLCBOVUxMLCAiU1RVQl9SWCBNaXhlciJ9LAorCXsiU0xJTUJVU18xX1JYIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiU0xJTUJVU18xX1JYIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJTTElNQlVTXzFfUlggTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCisJeyJTTElNQlVTXzFfUlgiLCBOVUxMLCAiU0xJTUJVU18xX1JYIE1peGVyIn0sCisJeyJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAorCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKKwl7IlNMSU1CVVNfM19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKKwl7IlNMSU1CVVNfM19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAorCXsiU0xJTUJVU18zX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAorCXsiU0xJTUJVU18zX1JYIiwgTlVMTCwgIlNMSU1CVVNfM19SWF9Wb2ljZSBNaXhlciJ9LAorCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKKwl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKKwl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKKwl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKKwl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAorCXsiU0xJTV83X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCisJeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKKwl7IlNMSU1CVVNfN19SWCIsIE5VTEwsICJTTElNXzdfUlhfVm9pY2UgTWl4ZXIifSwKKworCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCisJeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCisJeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCisJeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCisJeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKKwl7IlNMSU1fOF9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAorCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCisJeyJTTElNQlVTXzhfUlgiLCBOVUxMLCAiU0xJTV84X1JYX1ZvaWNlIE1peGVyIn0sCisKKwl7IlNMSU1CVVNfMV9SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJTTElNQlVTXzFfUlggUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAorCXsiU0xJTUJVU18xX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCisJeyJTTElNQlVTXzFfUlgiLCBOVUxMLCAiU0xJTUJVU18xX1JYIFBvcnQgTWl4ZXIifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IklOVEVSTkFMX0JUX1NDT19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IklOVF9CVF9TQ09fUlgiLCBOVUxMLCAiSU5URVJOQUxfQlRfU0NPX1JYIFBvcnQgTWl4ZXIifSwKKwl7IlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19SWCIsICJJTlRfQlRfU0NPX1JYIn0sCisJeyJTTElNQlVTXzNfUlggUG9ydCBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKKwl7IlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fUlgiLCAiUENNX1JYIn0sCisJeyJTTElNQlVTXzNfUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1JYIiwgIkFVWF9QQ01fUlgifSwKKwl7IlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9SWCIsICJTTElNQlVTXzBfUlgifSwKKwl7IlNMSU1CVVNfM19SWCIsIE5VTEwsICJTTElNQlVTXzNfUlggUG9ydCBNaXhlciJ9LAorCisJeyJTTElNQlVTXzZfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlNMSU1fMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlNMSU1fN19UWCIsICJTTElNQlVTXzdfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAorCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKKwl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJTTElNQlVTXzZfUlgiLCBOVUxMLCAiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIifSwKKworCXsiSERNSV9SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiSERNSSIsIE5VTEwsICJIRE1JX1JYIFBvcnQgTWl4ZXIifSwKKworCXsiRElTUExBWV9QT1JUX1JYIFBvcnQgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCisJeyJESVNQTEFZX1BPUlQiLCBOVUxMLCAiRElTUExBWV9QT1JUX1JYIFBvcnQgTWl4ZXIifSwKKworCXsiU0VDX0kyU19SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAorCXsiU0VDX0kyU19SWCIsIE5VTEwsICJTRUNfSTJTX1JYIFBvcnQgTWl4ZXIifSwKKworCXsiTUkyU19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMV9UWCIsICJTTElNQlVTXzFfVFgifSwKKwl7Ik1JMlNfUlggUG9ydCBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKKwl7Ik1JMlNfUlgiLCBOVUxMLCAiTUkyU19SWCBQb3J0IE1peGVyIn0sCisKKwl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCisJeyJQUklfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJQUklfTUkyU19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCisJeyJQUklfTUkyU19SWCIsIE5VTEwsICJQUklfTUkyU19SWCBQb3J0IE1peGVyIn0sCisKKwl7IlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKKwl7IlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKKwl7IlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiU0VDX01JMlNfUlggUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCisJeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKKwl7IlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJTRUNfTUkyU19SWCIsIE5VTEwsICJTRUNfTUkyU19SWCBQb3J0IE1peGVyIn0sCisKKwl7IlRFUlRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJURVJUX01JMlNfUlggUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiVEVSVF9NSTJTX1JYIiwgTlVMTCwgIlRFUlRfTUkyU19SWCBQb3J0IE1peGVyIn0sCisKKwl7IlFVQVRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCisJeyJRVUFUX01JMlNfUlggUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAorCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAorCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAorCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAorCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCisJeyJRVUFUX01JMlNfUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKKwl7IlFVQVRfTUkyU19SWCIsIE5VTEwsICJRVUFUX01JMlNfUlggUG9ydCBNaXhlciJ9LAorCisJLyogQmFja2VuZCBFbmFibGVtZW50ICovCisKKwl7IkJFX09VVCIsIE5VTEwsICJQUklfSTJTX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiU0VDX0kyU19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMF9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMV9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMl9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNF9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNV9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNl9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfN19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfOF9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlVTQl9BVURJT19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIkhETUkifSwKKwl7IkJFX09VVCIsIE5VTEwsICJESVNQTEFZX1BPUlQifSwKKwl7IkJFX09VVCIsIE5VTEwsICJTUERJRl9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIk1JMlNfUlgifSwKKwl7IkJFX09VVCIsIE5VTEwsICJRVUFUX01JMlNfUlgifSwKKwl7IkJFX09VVCIsIE5VTEwsICJRVUlOX01JMlNfUlgifSwKKwl7IkJFX09VVCIsIE5VTEwsICJURVJUX01JMlNfUlgifSwKKwl7IkJFX09VVCIsIE5VTEwsICJTRUNfTUkyU19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNFQ19NSTJTX1JYX1NEMSJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlBSSV9NSTJTX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiSU5UMF9NSTJTX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiSU5UNF9NSTJTX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0JUX1NDT19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIklOVF9CVF9BMkRQX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0ZNX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiUENNX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiU0xJTUJVU18zX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiQVVYX1BDTV9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNFQ19BVVhfUENNX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9BVVhfUENNX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiUVVBVF9BVVhfUENNX1JYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0JUX1NDT19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIklOVF9GTV9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlBDTV9SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlZPSUNFX1BMQVlCQUNLX1RYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiVk9JQ0UyX1BMQVlCQUNLX1RYIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiUFJJX1RETV9SWF8wIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiU0VDX1RETV9SWF8wIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9URE1fUlhfMCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlRFUlRfVERNX1JYXzEifSwKKwl7IkJFX09VVCIsIE5VTEwsICJURVJUX1RETV9SWF8yIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9URE1fUlhfMyJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlFVQVRfVERNX1JYXzAifSwKKwl7IkJFX09VVCIsIE5VTEwsICJRVUFUX1RETV9SWF8xIn0sCisJeyJCRV9PVVQiLCBOVUxMLCAiUVVBVF9URE1fUlhfMiJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlFVQVRfVERNX1JYXzMifSwKKworCXsiUFJJX0kyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiUVVBVF9NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRVUlOX01JMlNfVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IlBSSV9NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX01JMlNfVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IklOVDJfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiSU5UM19NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJTRUNfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiU0VOQVJZX01JMlNfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzBfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzFfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzNfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzRfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzVfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzZfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzdfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJTTElNQlVTXzhfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJVU0JfQVVESU9fVFgiLCBOVUxMLCAiQkVfSU4iIH0sCisJeyJJTlRfQlRfU0NPX1RYIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJJTlRfRk1fVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IlBDTV9UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIlNUVUJfUlgifSwKKwl7IlNUVUJfVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IlNUVUJfMV9UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIkFVWF9QQ01fUlgifSwKKwl7IkFVWF9QQ01fVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IlNFQ19BVVhfUENNX1RYIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX0FVWF9QQ01fVFgiLCBOVUxMLCAiQkVfSU4ifSwKKwl7IlFVQVRfQVVYX1BDTV9UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiSU5DQUxMX1JFQ09SRF9UWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiSU5DQUxMX1JFQ09SRF9SWCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiU0xJTTBfUlhfVklfRkJfTENIX01VWCIsICJTTElNNF9UWCIsICJTTElNQlVTXzRfVFgifSwKKwl7IlNMSU0wX1JYX1ZJX0ZCX1JDSF9NVVgiLCAiU0xJTTRfVFgiLCAiU0xJTUJVU180X1RYIn0sCisJeyJQUklfTUkyU19SWF9WSV9GQl9NVVgiLCAiU0VOQVJZX1RYIiwgIlNFTkFSWV9UWCJ9LAorCXsiU0xJTUJVU18wX1JYIiwgTlVMTCwgIlNMSU0wX1JYX1ZJX0ZCX0xDSF9NVVgifSwKKwl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNMF9SWF9WSV9GQl9SQ0hfTVVYIn0sCisJeyJQUklfTUkyU19SWCIsIE5VTEwsICJQUklfTUkyU19SWF9WSV9GQl9NVVgifSwKKwl7IlBSSV9URE1fVFhfMCIsIE5VTEwsICJCRV9JTiJ9LAorCXsiU0VDX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX1RETV9UWF8xIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX1RETV9UWF8yIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJURVJUX1RETV9UWF8zIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRVUFUX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRVUFUX1RETV9UWF8xIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRVUFUX1RETV9UWF8yIiwgTlVMTCwgIkJFX0lOIn0sCisJeyJRVUFUX1RETV9UWF8zIiwgTlVMTCwgIkJFX0lOIn0sCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBiZV9pZCA9IHJ0ZC0+ZGFpX2xpbmstPmlkOworCisJaWYgKGJlX2lkID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogdW5leHBlY3RlZCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKKwltc21fYmVkYWlzW2JlX2lkXS5zYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJbXNtX2JlZGFpc1tiZV9pZF0uY2hhbm5lbCA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCW1zbV9iZWRhaXNbYmVfaWRdLmZvcm1hdCA9IHBhcmFtc19mb3JtYXQocGFyYW1zKTsKKwlwcl9kZWJ1ZygiJXM6IEJFIFNhbXBsZSBSYXRlICglZCkgZm9ybWF0ICglZCkgQkUgaWQgJWRcbiIsCisJCV9fZnVuY19fLCBtc21fYmVkYWlzW2JlX2lkXS5zYW1wbGVfcmF0ZSwKKwkJbXNtX2JlZGFpc1tiZV9pZF0uZm9ybWF0LCBiZV9pZCk7CisJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGJlX2lkID0gcnRkLT5kYWlfbGluay0+aWQ7CisJaW50IGksIHNlc3Npb25fdHlwZSwgcGF0aF90eXBlLCB0b3BvbG9neTsKKwlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSAqYmVkYWk7CisJc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgKmZkYWk7CisKKwlwcl9kZWJ1ZygiJXM6IHN1YnN0cmVhbS0+cGNtLT5pZDolc1xuIiwKKwkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCisJaWYgKGJlX2lkID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKKwkJcHJfZXJyKCIlczogdW5leHBlY3RlZCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmVkYWkgPSAmbXNtX2JlZGFpc1tiZV9pZF07CisJc2Vzc2lvbl90eXBlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkwIDogMSk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOworCWVsc2UKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCWZvcl9lYWNoX3NldF9iaXQoaSwgJmJlZGFpLT5mZV9zZXNzaW9ucywgTVNNX0ZST05URU5EX0RBSV9NTV9TSVpFKSB7CisJCWZkYWkgPSAmZmVfZGFpX21hcFtpXVtzZXNzaW9uX3R5cGVdOworCQlpZiAoZmRhaS0+c3RybV9pZCAhPSBJTlZBTElEX1NFU1NJT04pIHsKKwkJCWludCBpZHg7CisJCQlpbnQgcG9ydF9pZDsKKwkJCXVuc2lnbmVkIGxvbmcgY29wcCA9CisJCQkJc2Vzc2lvbl9jb3BwX21hcFtpXVtzZXNzaW9uX3R5cGVdW2JlX2lkXTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykKKwkJCQlpZiAodGVzdF9iaXQoaWR4LCAmY29wcCkpCisJCQkJCWJyZWFrOworCQkJZmRhaS0+YmVfc3JhdGUgPSBiZWRhaS0+c2FtcGxlX3JhdGU7CisJCQlwb3J0X2lkID0gYmVkYWktPnBvcnRfaWQ7CisJCQl0b3BvbG9neSA9IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfY29wcF9pZHgocG9ydF9pZCwKKwkJCQkJCQkJICAgICBpZHgpOworCQkJYWRtX2Nsb3NlKGJlZGFpLT5wb3J0X2lkLCBmZGFpLT5wZXJmX21vZGUsIGlkeCk7CisJCQlwcl9kZWJ1ZygiJXM6IGNvcHA6JWxkLGlkeCBiaXQgZmU6JWQsIHR5cGU6JWQsYmU6JWQgdG9wb2xvZ3k9MHgleFxuIiwKKwkJCQkgX19mdW5jX18sIGNvcHAsIGksIHNlc3Npb25fdHlwZSwgYmVfaWQsCisJCQkJIHRvcG9sb2d5KTsKKwkJCWNsZWFyX2JpdChpZHgsCisJCQkJICAmc2Vzc2lvbl9jb3BwX21hcFtpXVtzZXNzaW9uX3R5cGVdW2JlX2lkXSk7CisJCQlpZiAoKGZkYWktPnBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCisJCQkJKGJlZGFpLT5jb21wcl9wYXNzdGhyX21vZGUgPT0gTEVHQUNZX1BDTSkpCisJCQkJbXNtX3BjbV9yb3V0aW5nX2RlaW5pdF9wcChiZWRhaS0+cG9ydF9pZCwKKwkJCQkJCQkgIHRvcG9sb2d5KTsKKwkJfQorCX0KKworCWJlZGFpLT5jb21wcl9wYXNzdGhyX21vZGUgPSBMRUdBQ1lfUENNOworCWJlZGFpLT5hY3RpdmUgPSAwOworCWJlZGFpLT5zYW1wbGVfcmF0ZSA9IDA7CisJYmVkYWktPmNoYW5uZWwgPSAwOworCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgYmVfaWQgPSBydGQtPmRhaV9saW5rLT5pZDsKKwlpbnQgaSwgcGF0aF90eXBlLCBzZXNzaW9uX3R5cGUsIHRvcG9sb2d5OworCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICpiZWRhaTsKKwl1MzIgY2hhbm5lbHMsIHNhbXBsZV9yYXRlOworCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2LCB2b2NfcGF0aF90eXBlOworCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhICpmZGFpOworCXUzMiBzZXNzaW9uX2lkOworCisJcHJfZGVidWcoIiVzOiBzdWJzdHJlYW0tPnBjbS0+aWQ6JXNcbiIsCisJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKKworCWlmIChiZV9pZCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB7CisJCXByX2VycigiJXM6IHVuZXhwZWN0ZWQgQkUgaWQgJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJlZGFpID0gJm1zbV9iZWRhaXNbYmVfaWRdOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJaWYgKGJlZGFpLT5jb21wcl9wYXNzdGhyX21vZGUgIT0gTEVHQUNZX1BDTSkKKwkJCXBhdGhfdHlwZSA9IEFETV9QQVRIX0NPTVBSRVNTRURfUlg7CisJCWVsc2UKKwkJCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOworCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7CisJfSBlbHNlIHsKKwkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7CisJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKKwl9CisKKwltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOworCWlmIChiZWRhaS0+YWN0aXZlID09IDEpCisJCWdvdG8gZG9uZTsgLyogSWdub3JlIHByZXBhcmUgaWYgYmFjay1lbmQgYWxyZWFkeSBhY3RpdmUgKi8KKworCS8qIEFGRSBwb3J0IGlzIG5vdCBhY3RpdmUgYXQgdGhpcyBwb2ludC4gSG93ZXZlciwgc3RpbGwKKwkgKiBnbyBhaGVhZCBzZXR0aW5nIGFjdGl2ZSBmbGFnIHVuZGVyIHRoZSBub3Rpb24gdGhhdAorCSAqIFFEU1A2IGlzIGFibGUgdG8gaGFuZGxlIEFETSBzdGFydGluZyBiZWZvcmUgQUZFIHBvcnQKKwkgKiBpcyBzdGFydGVkLgorCSAqLworCWJlZGFpLT5hY3RpdmUgPSAxOworCisJZm9yX2VhY2hfc2V0X2JpdChpLCAmYmVkYWktPmZlX3Nlc3Npb25zLCBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKKwkJZmRhaSA9ICZmZV9kYWlfbWFwW2ldW3Nlc3Npb25fdHlwZV07CisJCWlmIChmZGFpLT5zdHJtX2lkICE9IElOVkFMSURfU0VTU0lPTikgeworCQkJaW50IGFwcF90eXBlLCBhcHBfdHlwZV9pZHgsIGNvcHBfaWR4LCBhY2RiX2Rldl9pZDsKKworCQkJaWYgKHNlc3Npb25fdHlwZSA9PSBTRVNTSU9OX1RZUEVfVFggJiYKKwkJCSAgICBmZGFpLT5iZV9zcmF0ZSAmJgorCQkJICAgIChmZGFpLT5iZV9zcmF0ZSAhPSBiZWRhaS0+c2FtcGxlX3JhdGUpKSB7CisJCQkJcHJfZGVidWcoIiVzOiBmbHVzaCBzdHJtICVkIGRpZmYgQkUgcmF0ZXNcbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCQlmZGFpLT5zdHJtX2lkKTsKKworCQkJCWlmIChmZGFpLT5ldmVudF9pbmZvLmV2ZW50X2Z1bmMpCisJCQkJCWZkYWktPmV2ZW50X2luZm8uZXZlbnRfZnVuYygKKwkJCQkJCU1TTV9QQ01fUlRfRVZUX0JVRl9SRUNGRywKKwkJCQkJCWZkYWktPmV2ZW50X2luZm8ucHJpdl9kYXRhKTsKKwkJCQlmZGFpLT5iZV9zcmF0ZSA9IDA7IC8qIG1pZ2h0IG5vdCBuZWVkIGl0ICovCisJCQl9CisJCQliaXRzX3Blcl9zYW1wbGUgPSBtc21fcm91dGluZ19nZXRfYml0X3dpZHRoKAorCQkJCQkJYmVkYWktPmZvcm1hdCk7CisKKwkJCWFwcF90eXBlID0KKwkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ldW3Nlc3Npb25fdHlwZV0uYXBwX3R5cGU7CisJCQlpZiAoYXBwX3R5cGUpIHsKKwkJCQlhcHBfdHlwZV9pZHggPQorCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKKwkJCQlzYW1wbGVfcmF0ZSA9CisJCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbaV1bc2Vzc2lvbl90eXBlXS4KKwkJCQkJCXNhbXBsZV9yYXRlOworCQkJCWJpdHNfcGVyX3NhbXBsZSA9CisJCQkJCWFwcF90eXBlX2NmZ1thcHBfdHlwZV9pZHhdLmJpdF93aWR0aDsKKwkJCX0gZWxzZQorCQkJCXNhbXBsZV9yYXRlID0gYmVkYWktPnNhbXBsZV9yYXRlOworCQkJLyoKKwkJCSAqIGNoZWNrIGlmIEFETSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50CisJCQkgKiBjaGFubmVsIG1hcHBpbmcgdGhhbiBiYWNrZW5kCisJCQkgKi8KKwkJCWlmICghYmVkYWktPmFkbV9vdmVycmlkZV9jaCkKKwkJCQljaGFubmVscyA9IGJlZGFpLT5jaGFubmVsOworCQkJZWxzZQorCQkJCWNoYW5uZWxzID0gYmVkYWktPmFkbV9vdmVycmlkZV9jaDsKKwkJCWFjZGJfZGV2X2lkID0KKwkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbaV1bc2Vzc2lvbl90eXBlXS5hY2RiX2Rldl9pZDsKKwkJCXRvcG9sb2d5ID0gbXNtX3JvdXRpbmdfZ2V0X2FkbV90b3BvbG9neShwYXRoX3R5cGUsIGksCisJCQkJCQlzZXNzaW9uX3R5cGUpOworCQkJY29wcF9pZHggPSBhZG1fb3BlbihiZWRhaS0+cG9ydF9pZCwgcGF0aF90eXBlLAorCQkJCQkgICAgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCB0b3BvbG9neSwKKwkJCQkJICAgIGZkYWktPnBlcmZfbW9kZSwgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgYXBwX3R5cGUsIGFjZGJfZGV2X2lkKTsKKwkJCWlmICgoY29wcF9pZHggPCAwKSB8fAorCQkJCShjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7CisJCQkJcHJfZXJyKCIlczogYWRtIG9wZW4gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBzZXR0aW5nIGlkeCBiaXQgb2YgZmU6JWQsIHR5cGU6ICVkLCBiZTolZFxuIiwKKwkJCQkgX19mdW5jX18sIGksIHNlc3Npb25fdHlwZSwgYmVfaWQpOworCQkJc2V0X2JpdChjb3BwX2lkeCwKKwkJCQkmc2Vzc2lvbl9jb3BwX21hcFtpXVtzZXNzaW9uX3R5cGVdW2JlX2lkXSk7CisKKwkJCWlmIChtc21faXNfcmVzYW1wbGVfbmVlZGVkKAorCQkJCXNhbXBsZV9yYXRlLAorCQkJCWJlZGFpLT5zYW1wbGVfcmF0ZSkpCisJCQkJYWRtX2NvcHBfbWZjX2NmZygKKwkJCQkJYmVkYWktPnBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQliZWRhaS0+c2FtcGxlX3JhdGUpOworCisJCQltc21fcGNtX3JvdXRpbmdfYnVpbGRfbWF0cml4KGksIHNlc3Npb25fdHlwZSwgcGF0aF90eXBlLAorCQkJCQkJICAgICBmZGFpLT5wZXJmX21vZGUpOworCQkJaWYgKChmZGFpLT5wZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSAmJgorCQkJCShiZWRhaS0+Y29tcHJfcGFzc3Rocl9tb2RlID09CisJCQkJCUxFR0FDWV9QQ00pKQorCQkJCW1zbV9wY21fcm91dGluZ19jZmdfcHAoYmVkYWktPnBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQkJICAgICAgIHRvcG9sb2d5LCBjaGFubmVscyk7CisJCX0KKwl9CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZiZWRhaS0+ZmVfc2Vzc2lvbnMsIE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7CisJCXNlc3Npb25faWQgPSBtc21fcGNtX3JvdXRpbmdfZ2V0X3ZvY19zZXNzaW9uaWQoaSk7CisJCWlmIChzZXNzaW9uX2lkKSB7CisJCQlwcl9kZWJ1ZygiJXMgdm9pY2Ugc2Vzc2lvbl9pZDogMHgleCIsCisJCQkJIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQkJaWYgKHNlc3Npb25fdHlwZSA9PSBTRVNTSU9OX1RZUEVfVFgpCisJCQkJdm9jX3BhdGhfdHlwZSA9IFRYX1BBVEg7CisJCQllbHNlCisJCQkJdm9jX3BhdGhfdHlwZSA9IFJYX1BBVEg7CisKKwkJCXZvY19zZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCB2b2NfcGF0aF90eXBlLCAxKTsKKwkJCXZvY19zZXRfZGV2aWNlX2NvbmZpZyhzZXNzaW9uX2lkLCAgdm9jX3BhdGhfdHlwZSwKKwkJCQkJICAgICAgYmVkYWktPmNoYW5uZWwsIGJlZGFpLT5wb3J0X2lkKTsKKworCQkJaWYgKHZvY19nZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCBSWF9QQVRIKSAmJgorCQkJICAgIHZvY19nZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCBUWF9QQVRIKSkKKwkJCQl2b2NfZW5hYmxlX2RldmljZShzZXNzaW9uX2lkKTsKKwkJfQorCX0KKworZG9uZToKKwltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19zZW5kX2RldmljZV9wcF9wYXJhbXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKK3sKKwlpbnQgaW5kZXgsIHRvcG9faWQsIGJlX2lkeDsKKwl1bnNpZ25lZCBsb25nIHBwX2NvbmZpZyA9IDA7CisJYm9vbCBtdXRlX29uOworCWludCBsYXRlbmN5OworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkLCBjb3BwX2lkeCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKworCWlmIChwb3J0X2lkICE9IEhETUlfUlggJiYgcG9ydF9pZCAhPSBESVNQTEFZX1BPUlRfUlgpIHsKKwkJcHJfZXJyKCIlczogRGV2aWNlIHBwIHBhcmFtcyBvbiBpbnZhbGlkIHBvcnQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwlmb3IgKGJlX2lkeCA9IDA7IGJlX2lkeCA8IE1TTV9CQUNLRU5EX0RBSV9NQVg7IGJlX2lkeCsrKSB7CisJCWlmIChwb3J0X2lkID09IG1zbV9iZWRhaXNbYmVfaWR4XS5wb3J0X2lkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGJlX2lkeCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB7CisJCXByX2RlYnVnKCIlczogSW52YWxpZCBiZSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkeCk7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNU01fQkFDS0VORF9EQUlfUFBfUEFSQU1TX1JFUV9NQVg7IGluZGV4KyspIHsKKwkJaWYgKG1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wb3J0X2lkID09IHBvcnRfaWQpCisJCQlicmVhazsKKwl9CisJaWYgKGluZGV4ID49IE1TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJhY2tlbmQgcHAgcGFyYW1zIGluZGV4ICVkXG4iLAorCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG9wb19pZCA9IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfY29wcF9pZHgocG9ydF9pZCwgY29wcF9pZHgpOworCWlmICh0b3BvX2lkICE9IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfREVGQVVMVF9UT1BPTE9HWSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhc3N0aHJvdWdoIHRvcG9sb2d5IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdG9wb19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBwX2NvbmZpZyA9IG1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnOworCWlmICh0ZXN0X2JpdChBRE1fUFBfUEFSQU1fTVVURV9CSVQsICZwcF9jb25maWcpKSB7CisJCXByX2RlYnVnKCIlczogQURNX1BQX1BBUkFNX01VVEVcbiIsIF9fZnVuY19fKTsKKwkJY2xlYXJfYml0KEFETV9QUF9QQVJBTV9NVVRFX0JJVCwgJnBwX2NvbmZpZyk7CisJCW11dGVfb24gPSBtc21fYmVkYWlzX3BwX3BhcmFtc1tpbmRleF0ubXV0ZV9vbjsKKwkJaWYgKChtc21fYmVkYWlzW2JlX2lkeF0uYWN0aXZlKSAmJgorCQkJKG1zbV9iZWRhaXNbYmVfaWR4XS5jb21wcl9wYXNzdGhyX21vZGUgIT0KKwkJCSBMRUdBQ1lfUENNKSkKKwkJCWFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUocG9ydF9pZCwKKwkJCQkJCQkJY29wcF9pZHgsCisJCQkJCQkJCW11dGVfb24pOworCX0KKwlpZiAodGVzdF9iaXQoQURNX1BQX1BBUkFNX0xBVEVOQ1lfQklULCAmcHBfY29uZmlnKSkgeworCQlwcl9kZWJ1ZygiJXM6IEFETV9QUF9QQVJBTV9MQVRFTkNZXG4iLCBfX2Z1bmNfXyk7CisJCWNsZWFyX2JpdChBRE1fUFBfUEFSQU1fTEFURU5DWV9CSVQsCisJCQkgICZwcF9jb25maWcpOworCQlsYXRlbmN5ID0gbXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLmxhdGVuY3k7CisJCWlmICgobXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSkgJiYKKwkJCShtc21fYmVkYWlzW2JlX2lkeF0uY29tcHJfcGFzc3Rocl9tb2RlICE9CisJCQkgTEVHQUNZX1BDTSkpCisJCQlhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9sYXRlbmN5KHBvcnRfaWQsCisJCQkJCQkJICAgY29wcF9pZHgsCisJCQkJCQkJICAgbGF0ZW5jeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9kZXZpY2VfcHBfcGFyYW1zX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcHBfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpbnQgcG9ydF9pZCA9IDA7CisJaW50IGluZGV4LCBiZV9pZHgsIGksIHRvcG9faWQsIGlkeDsKKwlib29sIG11dGU7CisJaW50IGxhdGVuY3k7CisKKwlwcl9kZWJ1ZygiJXM6IHBwX2lkOiAweCV4XG4iLCBfX2Z1bmNfXywgcHBfaWQpOworCisJZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykgeworCQlwb3J0X2lkID0gbXNtX2JlZGFpc1tiZV9pZHhdLnBvcnRfaWQ7CisJCWlmIChwb3J0X2lkID09IEhETUlfUlggfHwgcG9ydF9pZCA9PSBESVNQTEFZX1BPUlRfUlgpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYmVfaWR4ID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKKwkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIGJlIGlkICVkXG4iLCBfX2Z1bmNfXywgYmVfaWR4KTsKKwkJcmV0dXJuICAtRUlOVkFMOworCX0KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWDsgaW5kZXgrKykgeworCQlpZiAobXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLnBvcnRfaWQgPT0gcG9ydF9pZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaW5kZXggPj0gTVNNX0JBQ0tFTkRfREFJX1BQX1BBUkFNU19SRVFfTUFYKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcHAgcGFyYW1zIGJhY2tlbmQgaW5kZXggJWRcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZtc21fYmVkYWlzW2JlX2lkeF0uZmVfc2Vzc2lvbnMsCisJCQkJTVNNX0ZST05URU5EX0RBSV9NTV9TSVpFKSB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgeworCQkJdW5zaWduZWQgbG9uZyBjb3BwID0KKwkJCQlzZXNzaW9uX2NvcHBfbWFwW2ldCisJCQkJW1NFU1NJT05fVFlQRV9SWF1bYmVfaWR4XTsKKwkJCWlmICghdGVzdF9iaXQoaWR4LCAmY29wcCkpCisJCQkJY29udGludWU7CisJCQl0b3BvX2lkID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChwb3J0X2lkLAorCQkJCQkJCQkgICAgIGlkeCk7CisJCQlpZiAodG9wb19pZCAhPSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RFRkFVTFRfVE9QT0xPR1kpCisJCQkJY29udGludWU7CisJCXByX2RlYnVnKCIlczogcG9ydDogMHgleCwgY29wcCAlbGQsIGJlIGFjdGl2ZTogJWQsIHBhc3N0OiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcCwgbXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSwKKwkJCSBtc21fYmVkYWlzW2JlX2lkeF0uY29tcHJfcGFzc3Rocl9tb2RlKTsKKwkJc3dpdGNoIChwcF9pZCkgeworCQljYXNlIEFETV9QUF9QQVJBTV9NVVRFX0lEOgorCQkJcHJfZGVidWcoIiVzOiBBRE1fUFBfUEFSQU1fTVVURVxuIiwgX19mdW5jX18pOworCQkJbXV0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID8gdHJ1ZSA6IGZhbHNlOworCQkJbXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLm11dGVfb24gPSBtdXRlOworCQkJc2V0X2JpdChBRE1fUFBfUEFSQU1fTVVURV9CSVQsCisJCQkJJm1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnKTsKKwkJCWlmICgobXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSkgJiYKKwkJCQkobXNtX2JlZGFpc1tiZV9pZHhdLmNvbXByX3Bhc3N0aHJfbW9kZSAhPQorCQkJCUxFR0FDWV9QQ00pKQorCQkJCWFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUocG9ydF9pZCwKKwkJCQkJaWR4LCBtdXRlKTsKKwkJCWJyZWFrOworCQljYXNlIEFETV9QUF9QQVJBTV9MQVRFTkNZX0lEOgorCQkJcHJfZGVidWcoIiVzOiBBRE1fUFBfUEFSQU1fTEFURU5DWVxuIiwgX19mdW5jX18pOworCQkJbXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLmxhdGVuY3kgPQorCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQkJc2V0X2JpdChBRE1fUFBfUEFSQU1fTEFURU5DWV9CSVQsCisJCQkJJm1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnKTsKKwkJCWxhdGVuY3kgPSBtc21fYmVkYWlzX3BwX3BhcmFtc1tpbmRleF0ubGF0ZW5jeSA9CisJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJCQlpZiAoKG1zbV9iZWRhaXNbYmVfaWR4XS5hY3RpdmUpICYmCisJCQkJKG1zbV9iZWRhaXNbYmVfaWR4XS5jb21wcl9wYXNzdGhyX21vZGUgIT0KKwkJCQlMRUdBQ1lfUENNKSkKKwkJCQlhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9sYXRlbmN5KHBvcnRfaWQsCisJCQkJCWlkeCwgbGF0ZW5jeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2luZm8oIiVzLCBkZXZpY2UgcHAgcGFyYW0gJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcHBfaWQpOworCQkJYnJlYWs7CisJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfZGV2aWNlX3BwX3BhcmFtc19taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJcHJfZGVidWcoIiVzOm1zbV9yb3V0aW5nX2dldF9kZXZpY2VfcHBfcGFyYW1zX21peGVyIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGV2aWNlX3BwX3BhcmFtc19taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEZXZpY2UgUFAgUGFyYW1zIiwgU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLAorCTAsIDMsIG1zbV9yb3V0aW5nX2dldF9kZXZpY2VfcHBfcGFyYW1zX21peGVyLAorCW1zbV9yb3V0aW5nX3B1dF9kZXZpY2VfcHBfcGFyYW1zX21peGVyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3JvdXRpbmdfcGNtX29wcyA9IHsKKwkuaHdfcGFyYW1zCT0gbXNtX3BjbV9yb3V0aW5nX2h3X3BhcmFtcywKKwkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX3JvdXRpbmdfY2xvc2UsCisJLnByZXBhcmUgICAgICAgID0gbXNtX3BjbV9yb3V0aW5nX3ByZXBhcmUsCit9OworCisvKiBOb3QgdXNlZCBidXQgZnJhbWUgc2VlbXMgdG8gcmVxdWlyZSBpdCAqLworc3RhdGljIGludCBtc21fcm91dGluZ19wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scygmcGxhdGZvcm0tPmNvbXBvbmVudC5kYXBtLCBtc21fcWRzcDZfd2lkZ2V0cywKKwkJCSAgIEFSUkFZX1NJWkUobXNtX3Fkc3A2X3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmcGxhdGZvcm0tPmNvbXBvbmVudC5kYXBtLCBpbnRlcmNvbiwKKwkJQVJSQVlfU0laRShpbnRlcmNvbikpOworCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKHBsYXRmb3JtLT5jb21wb25lbnQuZGFwbS5jYXJkKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBsc21fZnVuY3Rpb24sCisJCQkJICAgICAgQVJSQVlfU0laRShsc21fZnVuY3Rpb24pKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBhYW5jX3NsaW1fMF9yeF9tdXgsCisJCQkJICAgICAgQVJSQVlfU0laRShhYW5jX3NsaW1fMF9yeF9tdXgpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fdm9jX3Nlc3Npb25fY29udHJvbHMsCisJCQkJICAgICAgQVJSQVlfU0laRShtc21fdm9jX3Nlc3Npb25fY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBhcHBfdHlwZV9jZmdfY29udHJvbHMsCisJCQkJICAgICAgQVJSQVlfU0laRShhcHBfdHlwZV9jZmdfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJCXN0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShzdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19jb250cm9scykpOworCisJbXNtX3F0aV9wcF9hZGRfY29udHJvbHMocGxhdGZvcm0pOworCisJbXNtX2R0c19zcnNfdG1fYWRkX2NvbnRyb2xzKHBsYXRmb3JtKTsKKworCW1zbV9kb2xieV9kYXBfYWRkX2NvbnRyb2xzKHBsYXRmb3JtKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJdXNlX2RzMV9vcl9kczJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHVzZV9kczFfb3JfZHMyX2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKKwkJCQlkZXZpY2VfcHBfcGFyYW1zX21peGVyX2NvbnRyb2xzLAorCQkJCUFSUkFZX1NJWkUoZGV2aWNlX3BwX3BhcmFtc19taXhlcl9jb250cm9scykpOworCisJbXNtX2R0c19lYWdsZV9hZGRfY29udHJvbHMocGxhdGZvcm0pOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV9zb3VyY2VfdHJhY2tpbmdfY29udHJvbHMsCisJCQkJQVJSQVlfU0laRShtc21fc291cmNlX3RyYWNraW5nX2NvbnRyb2xzKSk7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGFkbV9jaGFubmVsX2NvbmZpZ19jb250cm9scywKKwkJCQlBUlJBWV9TSVpFKGFkbV9jaGFubmVsX2NvbmZpZ19jb250cm9scykpOworCXJldHVybiAwOworfQorCitpbnQgbXNtX3JvdXRpbmdfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlyZXR1cm4gbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX25ldyhydW50aW1lLCBtc21fYmVkYWlzKTsKK30KKwordm9pZCBtc21fcm91dGluZ19wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCW1zbV9wY21fcm91dGluZ19od2RlcF9mcmVlKHBjbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19yb3V0aW5nX3BsYXRmb3JtID0geworCS5vcHMJCT0gJm1zbV9yb3V0aW5nX3BjbV9vcHMsCisJLnByb2JlCQk9IG1zbV9yb3V0aW5nX3Byb2JlLAorCS5wY21fbmV3CT0gbXNtX3JvdXRpbmdfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBtc21fcm91dGluZ19wY21fZnJlZSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJkZXYgbmFtZSAlc1xuIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCisJCQkJICAmbXNtX3NvY19yb3V0aW5nX3BsYXRmb3JtKTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fcGNtX3JvdXRpbmdfZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLXJvdXRpbmcifSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9wY21fcm91dGluZ19kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9yb3V0aW5nX3BjbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9wY21fcm91dGluZ19kdF9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IG1zbV9yb3V0aW5nX3BjbV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3JvdXRpbmdfcGNtX3JlbW92ZSwKK307CisKK2ludCBtc21fcm91dGluZ19jaGVja19iYWNrZW5kX2VuYWJsZWQoaW50IGZlZGFpX2lkKQoreworCWludCBpOworCisJaWYgKGZlZGFpX2lkID4gTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQpIHsKKwkJLyogYmFkIElEIGFzc2lnbmVkIGluIG1hY2hpbmUgZHJpdmVyICovCisJCXByX2VycigiJXM6IGJhZCBNTSBJRFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1TTV9CQUNLRU5EX0RBSV9NQVg7IGkrKykgeworCQlpZiAodGVzdF9iaXQoZmVkYWlfaWQsICZtc21fYmVkYWlzW2ldLmZlX3Nlc3Npb25zKSkKKwkJCXJldHVybiBtc21fYmVkYWlzW2ldLmFjdGl2ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NhbF9wYXRoKGludCBwYXRoX3R5cGUpCit7CisJaWYgKHBhdGhfdHlwZSA9PSBBRE1fUEFUSF9QTEFZQkFDSyB8fAorCSAgICBwYXRoX3R5cGUgPT0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWCkKKwkJcmV0dXJuIFJYX0RFVklDRTsKKwllbHNlCisJCXJldHVybiBUWF9ERVZJQ0U7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRpbmdfc2V0X2NhbChpbnQzMl90IGNhbF90eXBlLAorCQkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsIGNhbF9kYXRhLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX3JvdXRpbmdfZGVsZXRlX2NhbF9kYXRhKHZvaWQpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoMSwgJmNhbF9kYXRhKTsKK30KKworc3RhdGljIGludCBtc21fcm91dGluZ19pbml0X2NhbF9kYXRhKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNhbF90eXBlX2luZm8gY2FsX3R5cGVfaW5mbyA9IHsKKwkJe0FETV9UT1BPTE9HWV9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsCisJCW1zbV9yb3V0aW5nX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0KKwl9OworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoMSwgJmNhbF9kYXRhLAorCQkmY2FsX3R5cGVfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiByZXQ7CitlcnI6CisJbXNtX3JvdXRpbmdfZGVsZXRlX2NhbF9kYXRhKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19yb3V0aW5nX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwltdXRleF9pbml0KCZyb3V0aW5nX2xvY2spOworCWlmIChtc21fcm91dGluZ19pbml0X2NhbF9kYXRhKCkpCisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBpbml0IGNhbCBkYXRhIVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3JvdXRpbmdfcGNtX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc21fc29jX3JvdXRpbmdfcGxhdGZvcm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3JvdXRpbmdfcGxhdGZvcm1fZXhpdCh2b2lkKQoreworCW1zbV9yb3V0aW5nX2RlbGV0ZV9jYWxfZGF0YSgpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fcm91dGluZ19wY21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbV9zb2Nfcm91dGluZ19wbGF0Zm9ybV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gcm91dGluZyBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRmZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oCkBAIC0wLDAgKzEsNDcyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfTVNNX1BDTV9ST1VUSU5HX0gKKyNkZWZpbmUgX01TTV9QQ01fUk9VVElOR19ICisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX0kyU19SWCAiUFJJTUFSWV9JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9JMlNfVFggIlBSSU1BUllfSTJTX1RYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzBfUlggIlNMSU1CVVNfMF9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18wX1RYICJTTElNQlVTXzBfVFgiCisjZGVmaW5lIExQQVNTX0JFX0hETUkgIkhETUkiCisjZGVmaW5lIExQQVNTX0JFX0RJU1BMQVlfUE9SVCAiRElTUExBWV9QT1JUIgorI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfU0NPX1JYICJJTlRfQlRfU0NPX1JYIgorI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfU0NPX1RYICJJTlRfQlRfU0NPX1RYIgorI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfQTJEUF9SWCAiSU5UX0JUX0EyRFBfUlgiCisjZGVmaW5lIExQQVNTX0JFX0lOVF9GTV9SWCAiSU5UX0ZNX1JYIgorI2RlZmluZSBMUEFTU19CRV9JTlRfRk1fVFggIklOVF9GTV9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfQUZFX1BDTV9SWCAiUlRfUFJPWFlfREFJXzAwMV9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfQUZFX1BDTV9UWCAiUlRfUFJPWFlfREFJXzAwMl9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfQVVYUENNX1JYICJBVVhfUENNX1JYIgorI2RlZmluZSBMUEFTU19CRV9BVVhQQ01fVFggIkFVWF9QQ01fVFgiCisjZGVmaW5lIExQQVNTX0JFX1NFQ19BVVhQQ01fUlggIlNFQ19BVVhfUENNX1JYIgorI2RlZmluZSBMUEFTU19CRV9TRUNfQVVYUENNX1RYICJTRUNfQVVYX1BDTV9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfVEVSVF9BVVhQQ01fUlggIlRFUlRfQVVYX1BDTV9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfVEVSVF9BVVhQQ01fVFggIlRFUlRfQVVYX1BDTV9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlggIlFVQVRfQVVYX1BDTV9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFggIlFVQVRfQVVYX1BDTV9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfVk9JQ0VfUExBWUJBQ0tfVFggIlZPSUNFX1BMQVlCQUNLX1RYIgorI2RlZmluZSBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFggIlZPSUNFMl9QTEFZQkFDS19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCAiSU5DQUxMX1JFQ09SRF9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCAiSU5DQUxMX1JFQ09SRF9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX0kyU19SWCAiU0VDT05EQVJZX0kyU19SWCIKKyNkZWZpbmUgTFBBU1NfQkVfU1BESUZfUlggIlNQRElGX1JYIgorCisjZGVmaW5lIExQQVNTX0JFX01JMlNfUlggIk1JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX01JMlNfVFggIk1JMlNfVFgiCisjZGVmaW5lIExQQVNTX0JFX1FVQVRfTUkyU19SWCAiUVVBVF9NSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX01JMlNfVFggIlFVQVRfTUkyU19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX01JMlNfUlggIlNFQ19NSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9TRUNfTUkyU19SWF9TRDEgIlNFQ19NSTJTX1JYX1NEMSIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX01JMlNfVFggIlNFQ19NSTJTX1RYIgorI2RlZmluZSBMUEFTU19CRV9QUklfTUkyU19SWCAiUFJJX01JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9NSTJTX1RYICJQUklfTUkyU19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfVEVSVF9NSTJTX1JYICJURVJUSUFSWV9NSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9URVJUX01JMlNfVFggIlRFUlRJQVJZX01JMlNfVFgiCisjZGVmaW5lIExQQVNTX0JFX0FVRElPX0kyU19SWCAiQVVESU9fSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9TVFVCX1JYICJTVFVCX1JYIgorI2RlZmluZSBMUEFTU19CRV9TVFVCX1RYICJTVFVCX1RYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzFfUlggIlNMSU1CVVNfMV9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18xX1RYICJTTElNQlVTXzFfVFgiCisjZGVmaW5lIExQQVNTX0JFX1NUVUJfMV9UWCAiU1RVQl8xX1RYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzJfUlggIlNMSU1CVVNfMl9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18yX1RYICJTTElNQlVTXzJfVFgiCisjZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfM19SWCAiU0xJTUJVU18zX1JYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzNfVFggIlNMSU1CVVNfM19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU180X1JYICJTTElNQlVTXzRfUlgiCisjZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfNF9UWCAiU0xJTUJVU180X1RYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzVfUlggIlNMSU1CVVNfNV9SWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU181X1RYICJTTElNQlVTXzVfVFgiCisjZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfNl9SWCAiU0xJTUJVU182X1JYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzZfVFggIlNMSU1CVVNfNl9UWCIKKyNkZWZpbmUgTFBBU1NfQkVfUVVJTl9NSTJTX1JYICJRVUlOX01JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX1FVSU5fTUkyU19UWCAiUVVJTl9NSTJTX1RYIgorI2RlZmluZSBMUEFTU19CRV9TRU5BUllfTUkyU19UWCAiU0VOQVJZX01JMlNfVFgiCisKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF8wICJQUklfVERNX1JYXzAiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfMCAiUFJJX1RETV9UWF8wIgorI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzEgIlBSSV9URE1fUlhfMSIKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF8xICJQUklfVERNX1RYXzEiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fUlhfMiAiUFJJX1RETV9SWF8yIgorI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1RYXzIgIlBSSV9URE1fVFhfMiIKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF8zICJQUklfVERNX1JYXzMiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfMyAiUFJJX1RETV9UWF8zIgorI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzQgIlBSSV9URE1fUlhfNCIKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF80ICJQUklfVERNX1RYXzQiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fUlhfNSAiUFJJX1RETV9SWF81IgorI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1RYXzUgIlBSSV9URE1fVFhfNSIKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF82ICJQUklfVERNX1JYXzYiCisjZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfNiAiUFJJX1RETV9UWF82IgorI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzcgIlBSSV9URE1fUlhfNyIKKyNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF83ICJQUklfVERNX1RYXzciCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfMCAiU0VDX1RETV9SWF8wIgorI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzAgIlNFQ19URE1fVFhfMCIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF8xICJTRUNfVERNX1JYXzEiCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfMSAiU0VDX1RETV9UWF8xIgorI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1JYXzIgIlNFQ19URE1fUlhfMiIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9UWF8yICJTRUNfVERNX1RYXzIiCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfMyAiU0VDX1RETV9SWF8zIgorI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzMgIlNFQ19URE1fVFhfMyIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF80ICJTRUNfVERNX1JYXzQiCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfNCAiU0VDX1RETV9UWF80IgorI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1JYXzUgIlNFQ19URE1fUlhfNSIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9UWF81ICJTRUNfVERNX1RYXzUiCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfNiAiU0VDX1RETV9SWF82IgorI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzYgIlNFQ19URE1fVFhfNiIKKyNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF83ICJTRUNfVERNX1JYXzciCisjZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfNyAiU0VDX1RETV9UWF83IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8wICJURVJUX1RETV9SWF8wIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8wICJURVJUX1RETV9UWF8wIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8xICJURVJUX1RETV9SWF8xIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8xICJURVJUX1RETV9UWF8xIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8yICJURVJUX1RETV9SWF8yIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8yICJURVJUX1RETV9UWF8yIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8zICJURVJUX1RETV9SWF8zIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8zICJURVJUX1RETV9UWF8zIgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF80ICJURVJUX1RETV9SWF80IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF80ICJURVJUX1RETV9UWF80IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF81ICJURVJUX1RETV9SWF81IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF81ICJURVJUX1RETV9UWF81IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF82ICJURVJUX1RETV9SWF82IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF82ICJURVJUX1RETV9UWF82IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF83ICJURVJUX1RETV9SWF83IgorI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF83ICJURVJUX1RETV9UWF83IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8wICJRVUFUX1RETV9SWF8wIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8wICJRVUFUX1RETV9UWF8wIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8xICJRVUFUX1RETV9SWF8xIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8xICJRVUFUX1RETV9UWF8xIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8yICJRVUFUX1RETV9SWF8yIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8yICJRVUFUX1RETV9UWF8yIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8zICJRVUFUX1RETV9SWF8zIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8zICJRVUFUX1RETV9UWF8zIgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF80ICJRVUFUX1RETV9SWF80IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF80ICJRVUFUX1RETV9UWF80IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF81ICJRVUFUX1RETV9SWF81IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF81ICJRVUFUX1RETV9UWF81IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF82ICJRVUFUX1RETV9SWF82IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF82ICJRVUFUX1RETV9UWF82IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF83ICJRVUFUX1RETV9SWF83IgorI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF83ICJRVUFUX1RETV9UWF83IgorCisjZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfN19SWCAiU0xJTUJVU183X1JYIgorI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzdfVFggIlNMSU1CVVNfN19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU184X1JYICJTTElNQlVTXzhfUlgiCisjZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfOF9UWCAiU0xJTUJVU184X1RYIgorCisjZGVmaW5lIExQQVNTX0JFX1VTQl9BVURJT19SWCAiVVNCX0FVRElPX1JYIgorI2RlZmluZSBMUEFTU19CRV9VU0JfQVVESU9fVFggIlVTQl9BVURJT19UWCIKKworI2RlZmluZSBMUEFTU19CRV9JTlQwX01JMlNfUlggIklOVDBfTUkyU19SWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5UMF9NSTJTX1RYICJJTlQwX01JMlNfVFgiCisjZGVmaW5lIExQQVNTX0JFX0lOVDFfTUkyU19SWCAiSU5UMV9NSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9JTlQxX01JMlNfVFggIklOVDFfTUkyU19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5UMl9NSTJTX1JYICJJTlQyX01JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX0lOVDJfTUkyU19UWCAiSU5UMl9NSTJTX1RYIgorI2RlZmluZSBMUEFTU19CRV9JTlQzX01JMlNfUlggIklOVDNfTUkyU19SWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5UM19NSTJTX1RYICJJTlQzX01JMlNfVFgiCisjZGVmaW5lIExQQVNTX0JFX0lOVDRfTUkyU19SWCAiSU5UNF9NSTJTX1JYIgorI2RlZmluZSBMUEFTU19CRV9JTlQ0X01JMlNfVFggIklOVDRfTUkyU19UWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5UNV9NSTJTX1JYICJJTlQ1X01JMlNfUlgiCisjZGVmaW5lIExQQVNTX0JFX0lOVDVfTUkyU19UWCAiSU5UNV9NSTJTX1RYIgorI2RlZmluZSBMUEFTU19CRV9JTlQ2X01JMlNfUlggIklOVDZfTUkyU19SWCIKKyNkZWZpbmUgTFBBU1NfQkVfSU5UNl9NSTJTX1RYICJJTlQ2X01JMlNfVFgiCisvKiBGb3IgbXVsdGltZWRpYSBmcm9udC1lbmRzLCBhc20gc2Vzc2lvbiBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKiBIZW5jZSwgYXNtIHNlc3Npb24vbXVsdGltZWRpYSBmcm9udC1lbmQgbWFwcGluZyBoYXMgdG8gYmUgbWFpbnRhaW5lZC4KKyAqIER1ZSB0byB0aGlzIHJlYXNvbiwgYWRkaXRpb25hbCBtdWx0aW1lZGlhIGZyb250LWVuZCBtdXN0IGJlIHBsYWNlZCBiZWZvcmUKKyAqIG5vbi1tdWx0aW1lZGlhIGZyb250LWVuZHMuCisgKi8KKworZW51bSB7CisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSA9IDAsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LAorCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsCisJTVNNX0ZST05URU5EX0RBSV9WT0lQLAorCU1TTV9GUk9OVEVORF9EQUlfQUZFX1JYLAorCU1TTV9GUk9OVEVORF9EQUlfQUZFX1RYLAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwKKwlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLAorCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwKKwlNU01fRlJPTlRFTkRfREFJX1FDSEFULAorCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwKKwlNU01fRlJPTlRFTkRfREFJX0xTTTEsCisJTVNNX0ZST05URU5EX0RBSV9MU00yLAorCU1TTV9GUk9OVEVORF9EQUlfTFNNMywKKwlNU01fRlJPTlRFTkRfREFJX0xTTTQsCisJTVNNX0ZST05URU5EX0RBSV9MU001LAorCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwKKwlNU01fRlJPTlRFTkRfREFJX0xTTTcsCisJTVNNX0ZST05URU5EX0RBSV9MU004LAorCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsCisJTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sCisJTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKKwlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAorCU1TTV9GUk9OVEVORF9EQUlfTUFYLAorfTsKKworI2RlZmluZSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUgKE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5ICsgMSkKKyNkZWZpbmUgTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQgTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTkKKworZW51bSB7CisJTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlggPSAwLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKKwlNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCisJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCisJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9WT0lDRV9QTEFZQkFDS19UWCwKKwlNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfVFgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKKwlNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCisJTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFgsCisJTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfRUNfVFgsCisJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKKwlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKKwlNU01fQkFDS0VORF9EQUlfQVVESU9fSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKKwlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlhfU0QxLAorCU1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwKKwlNU01fQkFDS0VORF9EQUlfU0VOQVJZX01JMlNfVFgsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKKwlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMSwKKwlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKKwlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzQsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfNCwKKwlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF81LAorCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzUsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfNiwKKwlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF82LAorCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzcsCisJTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfNywKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfNCwKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF80LAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzUsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfNSwKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF82LAorCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzYsCisJTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfNywKKwlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF83LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF80LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF80LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF81LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF81LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF82LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF82LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF83LAorCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF83LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF80LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF80LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF81LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF81LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF82LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF82LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF83LAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF83LAorCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKKwlNU01fQkFDS0VORF9EQUlfVVNCX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCisJTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKKwlNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCisJTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKKwlNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlQxX01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVDFfTUkyU19UWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19UWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UNV9NSTJTX1JYLAorCU1TTV9CQUNLRU5EX0RBSV9JTlQ1X01JMlNfVFgsCisJTVNNX0JBQ0tFTkRfREFJX0lOVDZfTUkyU19SWCwKKwlNU01fQkFDS0VORF9EQUlfSU5UNl9NSTJTX1RYLAorCU1TTV9CQUNLRU5EX0RBSV9NQVgsCit9OworCitlbnVtIG1zbV9wY21fcm91dGluZ19ldmVudCB7CisJTVNNX1BDTV9SVF9FVlRfQlVGX1JFQ0ZHLAorCU1TTV9QQ01fUlRfRVZUX0RFVlNXSVRDSCwKKwlNU01fUENNX1JUX0VWVF9NQVgsCit9OworCitlbnVtIHsKKwlFWFRfRUNfUkVGX05PTkUgPSAwLAorCUVYVF9FQ19SRUZfUFJJX01JMlNfVFgsCisJRVhUX0VDX1JFRl9TRUNfTUkyU19UWCwKKwlFWFRfRUNfUkVGX1RFUlRfTUkyU19UWCwKKwlFWFRfRUNfUkVGX1FVQVRfTUkyU19UWCwKKwlFWFRfRUNfUkVGX1FVSU5fTUkyU19UWCwKKwlFWFRfRUNfUkVGX1NMSU1fMV9UWCwKK307CisKKyNkZWZpbmUgSU5WQUxJRF9TRVNTSU9OIC0xCisjZGVmaW5lIFNFU1NJT05fVFlQRV9SWCAwCisjZGVmaW5lIFNFU1NJT05fVFlQRV9UWCAxCisjZGVmaW5lIElOVF9SWF9WT0xfTUFYX1NURVBTIDB4MjAwMAorI2RlZmluZSBJTlRfUlhfVk9MX0dBSU4gMHgyMDAwCisKKyNkZWZpbmUgUkVMRUFTRV9MT0NLCTAKKyNkZWZpbmUgQUNRVUlSRV9MT0NLCTEKKworI2RlZmluZSBNU01fQkFDS0VORF9EQUlfUFBfUEFSQU1TX1JFUV9NQVgJMgorI2RlZmluZSBIRE1JX1JYX0lECQkJCTB4ODAwMQorI2RlZmluZSBBRE1fUFBfUEFSQU1fTVVURV9JRAkJCTAKKyNkZWZpbmUgQURNX1BQX1BBUkFNX01VVEVfQklUCQkJMQorI2RlZmluZSBBRE1fUFBfUEFSQU1fTEFURU5DWV9JRAkJCTEKKyNkZWZpbmUgQURNX1BQX1BBUkFNX0xBVEVOQ1lfQklUCQkyCisjZGVmaW5lIEJFX0RBSV9QT1JUX1NFU1NJT05TX0lEWF9NQVgJCTQKKworc3RydWN0IG1zbV9wY21fcm91dGluZ19ldnQgeworCXZvaWQgKCpldmVudF9mdW5jKShlbnVtIG1zbV9wY21fcm91dGluZ19ldmVudCwgdm9pZCAqKTsKKwl2b2lkICpwcml2X2RhdGE7Cit9OworCitzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSB7CisJdTE2IHBvcnRfaWQ7IC8qIEFGRSBwb3J0IElEICovCisJdTggYWN0aXZlOyAvKiB0cmFjayBpZiB0aGlzIGJhY2tlbmQgaXMgZW5hYmxlZCAqLworCXVuc2lnbmVkIGxvbmcgZmVfc2Vzc2lvbnM7IC8qIEZyb250LWVuZCBzZXNzaW9ucyAqLworCS8qCisJICogVHJhY2sgVHggQkUgcG9ydHMgLT4gUnggQkUgcG9ydHMuCisJICogcG9ydF9zZXNzaW9uc1swXSB1c2VkIHRvIHRyYWNrIEJFIDAgdG8gQkUgNjMuCisJICogcG9ydF9zZXNzaW9uc1sxXSB1c2VkIHRvIHRyYWNrIEJFIDY0IHRvIEJFIDEyNy4KKwkgKiBwb3J0X3Nlc3Npb25zWzJdIHVzZWQgdG8gdHJhY2sgQkUgMTI4IHRvIEJFIDE5MS4KKwkgKiBwb3J0X3Nlc3Npb25zWzNdIHVzZWQgdG8gdHJhY2sgQkUgMTkyIHRvIEJFIDI1NS4KKwkgKi8KKwl1NjQgcG9ydF9zZXNzaW9uc1tCRV9EQUlfUE9SVF9TRVNTSU9OU19JRFhfTUFYXTsKKworCXVuc2lnbmVkIGludCAgc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50ICBjaGFubmVsOworCXVuc2lnbmVkIGludCAgZm9ybWF0OworCXVuc2lnbmVkIGludCAgYWRtX292ZXJyaWRlX2NoOworCXUzMiBjb21wcl9wYXNzdGhyX21vZGU7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhIHsKKwl1MTYgYmVfc3JhdGU7IC8qIHRyYWNrIHByaW9yIGJhY2tlbmQgc2FtcGxlIHJhdGUgZm9yIGZsdXNoaW5nIHB1cnBvc2UgKi8KKwlpbnQgc3RybV9pZDsgLyogQVNNIHN0cmVhbSBJRCAqLworCWludCBwZXJmX21vZGU7CisJc3RydWN0IG1zbV9wY21fcm91dGluZ19ldnQgZXZlbnRfaW5mbzsKK307CisKKyNkZWZpbmUgTUFYX0FQUF9UWVBFUwkxNgorc3RydWN0IG1zbV9wY21fcm91dGluZ19hcHBfdHlwZV9kYXRhIHsKKwlpbnQgYXBwX3R5cGU7CisJdTMyIHNhbXBsZV9yYXRlOworCWludCBiaXRfd2lkdGg7Cit9OworCitzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIHsKKwlpbnQgYXBwX3R5cGU7CisJaW50IGFjZGJfZGV2X2lkOworCWludCBzYW1wbGVfcmF0ZTsKK307CisKKy8qIGRhaV9pZDogZnJvbnQtZW5kIElELAorICogZHNwc3RfaWQ6ICBEU1AgYXVkaW8gc3RyZWFtIElECisgKiBzdHJlYW1fdHlwZTogcGxheWJhY2sgb3IgY2FwdHVyZQorICovCitpbnQgbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKGludCBmZWRhaV9pZCwgaW50IHBlcmZfbW9kZSwgaW50IGRzcHN0X2lkLAorCQkJCSAgIGludCBzdHJlYW1fdHlwZSk7Cit2b2lkIG1zbV9wY21fcm91dGluZ19yZWdfcHN0aHJfc3RyZWFtKGludCBmZWRhaV9pZCwgaW50IGRzcHN0X2lkLAorCQlpbnQgc3RyZWFtX3R5cGUpOworaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X2NvbXByX3N0cmVhbShpbnQgZmVkYWlfaWQsIGludCBwZXJmX21vZGUsCisJCQkJCSAgaW50IGRzcHN0X2lkLCBpbnQgc3RyZWFtX3R5cGUsCisJCQkJCSAgdWludDMyX3QgY29tcHJfcGFzc3Rocik7CisKK2ludCBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW1fdjIoaW50IGZlZGFpX2lkLCBpbnQgcGVyZl9tb2RlLAorCQkJCSAgICAgIGludCBkc3BzdF9pZCwgaW50IHN0cmVhbV90eXBlLAorCQkJCSAgICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZXZ0IGV2ZW50X2luZm8pOworCit2b2lkIG1zbV9wY21fcm91dGluZ19kZXJlZ19waHlfc3RyZWFtKGludCBmZWRhaV9pZCwgaW50IHN0cmVhbV90eXBlKTsKKworaW50IG1zbV9yb3V0aW5nX2NoZWNrX2JhY2tlbmRfZW5hYmxlZChpbnQgZmVkYWlfaWQpOworCisKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX2dldF9iZWRhaV9pbmZvKGludCBiZV9pZHgsCisJCQkJICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICpiZWRhaSk7Cit2b2lkIG1zbV9wY21fcm91dGluZ19nZXRfZmVkYWlfaW5mbyhpbnQgZmVfaWR4LCBpbnQgc2Vzc190eXBlLAorCQkJCSAgICBzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2ZkYWlfZGF0YSAqZmVfZGFpKTsKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jayh2b2lkKTsKK3ZvaWQgbXNtX3BjbV9yb3V0aW5nX3JlbGVhc2VfbG9jayh2b2lkKTsKKwordm9pZCBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoaW50IGZlZGFpX2lkLCBpbnQgYXBwX3R5cGUsCisJCQlpbnQgYWNkYl9kZXZfaWQsIGludCBzYW1wbGVfcmF0ZSwgaW50IHNlc3Npb25fdHlwZSk7CitpbnQgbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGludCBmZWRhaV9pZCwgaW50IHNlc3Npb25fdHlwZSwKKwkJCWludCAqYXBwX3R5cGUsIGludCAqYWNkYl9kZXZfaWQsIGludCAqc2FtcGxlX3JhdGUpOworI2VuZGlmIC8qX01TTV9QQ01fSCovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS12b2ljZS12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pY2UtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTcxZWVhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pY2UtdjIuYwpAQCAtMCwwICsxLDc1MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJtc20tcGNtLXZvaWNlLXYyLmgiCisjaW5jbHVkZSAicTZ2b2ljZS5oIgorCitzdGF0aWMgc3RydWN0IG1zbV92b2ljZSB2b2ljZV9pbmZvW1ZPSUNFX1NFU1NJT05fSU5ERVhfTUFYXTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmUgPSB7CisKKwkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAorCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKKwkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAorCS5yYXRlX21heCA9ICAgICAgICAgICAgIDE2MDAwLAorCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCisJLmNoYW5uZWxzX21heCA9ICAgICAgICAgMSwKKworCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIDQwOTYgKiAyLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gICAgIDIwNDgsCisJLnBlcmlvZF9ieXRlc19tYXggPSAgICAgNDA5NiwKKwkucGVyaW9kc19taW4gPSAgICAgICAgICAyLAorCS5wZXJpb2RzX21heCA9ICAgICAgICAgIDQsCisKKwkuZmlmb19zaXplID0gICAgICAgICAgICAwLAorfTsKK3N0YXRpYyBib29sIGlzX3ZvbHRlKHN0cnVjdCBtc21fdm9pY2UgKnB2b2x0ZSkKK3sKKwlpZiAocHZvbHRlID09ICZ2b2ljZV9pbmZvW1ZPTFRFX1NFU1NJT05fSU5ERVhdKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNfdm9pY2UyKHN0cnVjdCBtc21fdm9pY2UgKnB2b2ljZTIpCit7CisJaWYgKHB2b2ljZTIgPT0gJnZvaWNlX2luZm9bVk9JQ0UyX1NFU1NJT05fSU5ERVhdKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNfcWNoYXQoc3RydWN0IG1zbV92b2ljZSAqcHFjaGF0KQoreworCWlmIChwcWNoYXQgPT0gJnZvaWNlX2luZm9bUUNIQVRfU0VTU0lPTl9JTkRFWF0pCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc192b3dsYW4oc3RydWN0IG1zbV92b2ljZSAqcHZvd2xhbikKK3sKKwlpZiAocHZvd2xhbiA9PSAmdm9pY2VfaW5mb1tWT1dMQU5fU0VTU0lPTl9JTkRFWF0pCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMShzdHJ1Y3QgbXNtX3ZvaWNlICpwdm9pY2VtbW9kZTEpCit7CisJaWYgKHB2b2ljZW1tb2RlMSA9PSAmdm9pY2VfaW5mb1tWT0lDRU1NT0RFMV9JTkRFWF0pCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMihzdHJ1Y3QgbXNtX3ZvaWNlICpwdm9pY2VtbW9kZTIpCit7CisJaWYgKHB2b2ljZW1tb2RlMiA9PSAmdm9pY2VfaW5mb1tWT0lDRU1NT0RFMl9JTkRFWF0pCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdWludDMyX3QgZ2V0X3Nlc3Npb25faWQoc3RydWN0IG1zbV92b2ljZSAqcHZvYykKK3sKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gMDsKKworCWlmIChpc192b2x0ZShwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0xURV9TRVNTSU9OX05BTUUpOworCWVsc2UgaWYgKGlzX3ZvaWNlMihwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRTJfU0VTU0lPTl9OQU1FKTsKKwllbHNlIGlmIChpc19xY2hhdChwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChRQ0hBVF9TRVNTSU9OX05BTUUpOworCWVsc2UgaWYgKGlzX3Zvd2xhbihwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT1dMQU5fU0VTU0lPTl9OQU1FKTsKKwllbHNlIGlmIChpc192b2ljZW1tb2RlMShwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMV9OQU1FKTsKKwllbHNlIGlmIChpc192b2ljZW1tb2RlMihwdm9jKSkKKwkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMl9OQU1FKTsKKwllbHNlCisJCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VfU0VTU0lPTl9OQU1FKTsKKworCXJldHVybiBzZXNzaW9uX2lkOworfQorCisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCFwcnRkLT5wbGF5YmFja19zdGFydCkKKwkJcHJ0ZC0+cGxheWJhY2tfc3RhcnQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXBydGQtPmNhcHR1cmVfc3RhcnQpCisJCXBydGQtPmNhcHR1cmVfc3RhcnQgPSAxOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fdm9pY2UgKnZvaWNlOworCisJaWYgKCFzdHJjbXAoIlZvTFRFIiwgc3Vic3RyZWFtLT5wY20tPmlkKSkgeworCQl2b2ljZSA9ICZ2b2ljZV9pbmZvW1ZPTFRFX1NFU1NJT05fSU5ERVhdOworCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9MVEUgU3Vic3RyZWFtIElkPSVzXG4iLAorCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCX0gZWxzZSBpZiAoIXN0cmNtcCgiVm9pY2UyIiwgc3Vic3RyZWFtLT5wY20tPmlkKSkgeworCQl2b2ljZSA9ICZ2b2ljZV9pbmZvW1ZPSUNFMl9TRVNTSU9OX0lOREVYXTsKKwkJcHJfZGVidWcoIiVzOiBPcGVuIFZvaWNlMiBTdWJzdHJlYW0gSWQ9JXNcbiIsCisJCQkgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJfSBlbHNlIGlmICghc3RyY21wKCJRQ0hBVCIsIHN1YnN0cmVhbS0+cGNtLT5pZCkpIHsKKwkJdm9pY2UgPSAmdm9pY2VfaW5mb1tRQ0hBVF9TRVNTSU9OX0lOREVYXTsKKwkJcHJfZGVidWcoIiVzOiBPcGVuIFFDSEFUIFN1YnN0cmVhbSBJZD0lc1xuIiwKKwkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoIlZvV0xBTiIsIHN1YnN0cmVhbS0+cGNtLT5pZCkpIHsKKwkJdm9pY2UgPSAmdm9pY2VfaW5mb1tWT1dMQU5fU0VTU0lPTl9JTkRFWF07CisJCXByX2RlYnVnKCIlczogT3BlbiBWb1dMQU4gU3Vic3RyZWFtIElkPSVzXG4iLAorCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCX0gZWxzZSBpZiAoIXN0cmNtcCgiVm9pY2VNTW9kZTEiLCBzdWJzdHJlYW0tPnBjbS0+aWQpKSB7CisJCXZvaWNlID0gJnZvaWNlX2luZm9bVk9JQ0VNTU9ERTFfSU5ERVhdOworCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9pY2VNTW9kZTEgU3Vic3RyZWFtIElkPSVzXG4iLAorCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCX0gZWxzZSBpZiAoIXN0cmNtcCgiVm9pY2VNTW9kZTIiLCBzdWJzdHJlYW0tPnBjbS0+aWQpKSB7CisJCXZvaWNlID0gJnZvaWNlX2luZm9bVk9JQ0VNTU9ERTJfSU5ERVhdOworCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9pY2VNTW9kZTIgU3Vic3RyZWFtIElkPSVzXG4iLAorCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOworCX0gZWxzZSB7CisJCXZvaWNlID0gJnZvaWNlX2luZm9bVk9JQ0VfU0VTU0lPTl9JTkRFWF07CisJCXByX2RlYnVnKCIlczogT3BlbiBWT0lDRSBTdWJzdHJlYW0gSWQ9JXNcbiIsCisJCQkgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJfQorCW11dGV4X2xvY2soJnZvaWNlLT5sb2NrKTsKKworCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQl2b2ljZS0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJdm9pY2UtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJdm9pY2UtPmluc3RhbmNlKys7CisJcHJfZGVidWcoIiVzOiBJbnN0YW5jZSA9ICVkLCBTdHJlYW0gSUQgPSAlc1xuIiwKKwkJCV9fZnVuY19fLCB2b2ljZS0+aW5zdGFuY2UsIHN1YnN0cmVhbS0+cGNtLT5pZCk7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gdm9pY2U7CisKKwltdXRleF91bmxvY2soJnZvaWNlLT5sb2NrKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHBydGQtPnBsYXliYWNrX3N0YXJ0KQorCQlwcnRkLT5wbGF5YmFja19zdGFydCA9IDA7CisKKwlwcnRkLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fdm9pY2UgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChwcnRkLT5jYXB0dXJlX3N0YXJ0KQorCQlwcnRkLT5jYXB0dXJlX3N0YXJ0ID0gMDsKKwlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBydGQtPmxvY2spOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX2Nsb3NlKHN1YnN0cmVhbSk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfY2xvc2Uoc3Vic3RyZWFtKTsKKworCXBydGQtPmluc3RhbmNlLS07CisJaWYgKCFwcnRkLT5wbGF5YmFja19zdGFydCAmJiAhcHJ0ZC0+Y2FwdHVyZV9zdGFydCkgeworCQlwcl9kZWJ1ZygiZW5kIHZvaWNlIGNhbGxcbiIpOworCisJCXNlc3Npb25faWQgPSBnZXRfc2Vzc2lvbl9pZChwcnRkKTsKKwkJaWYgKHNlc3Npb25faWQpCisJCQl2b2NfZW5kX3ZvaWNlX2NhbGwoc2Vzc2lvbl9pZCk7CisJfQorCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IHNlc3Npb25faWQgPSAwOworCisJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmV0ID0gbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN1YnN0cmVhbSk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfcHJlcGFyZShzdWJzdHJlYW0pOworCisJaWYgKHBydGQtPnBsYXliYWNrX3N0YXJ0ICYmIHBydGQtPmNhcHR1cmVfc3RhcnQpIHsKKwkJc2Vzc2lvbl9pZCA9IGdldF9zZXNzaW9uX2lkKHBydGQpOworCQlpZiAoc2Vzc2lvbl9pZCkKKwkJCXZvY19zdGFydF92b2ljZV9jYWxsKHNlc3Npb25faWQpOworCX0KKwltdXRleF91bmxvY2soJnBydGQtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKworCXByX2RlYnVnKCIlczogVm9pY2VcbiIsIF9fZnVuY19fKTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IHNlc3Npb25faWQgPSAwOworCisJcHJfZGVidWcoIiVzOiBjbWQgPSAlZFxuIiwgX19mdW5jX18sIGNtZCk7CisKKwlzZXNzaW9uX2lkID0gZ2V0X3Nlc3Npb25faWQocHJ0ZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiU3RhcnQgJiBTdG9wIFZvaWNlIGNhbGwgbm90IGhhbmRsZWQgaW4gVHJpZ2dlci5cbiIpOworCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJcHJfZGVidWcoIiVzOiByZXN1bWUgY2FsbCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIHNlc3Npb25faWQpOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCXJldCA9IG1zbV9wY21fcGxheWJhY2tfcHJlcGFyZShzdWJzdHJlYW0pOworCQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfcHJlcGFyZShzdWJzdHJlYW0pOworCQlpZiAocHJ0ZC0+cGxheWJhY2tfc3RhcnQgJiYgcHJ0ZC0+Y2FwdHVyZV9zdGFydCkgeworCQkJaWYgKHNlc3Npb25faWQpCisJCQkJdm9jX3Jlc3VtZV92b2ljZV9jYWxsKHNlc3Npb25faWQpOworCQl9CisJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJcHJfZGVidWcoIiVzOiBwYXVzZSBjYWxsIHNlc3Npb25faWQ9JWRcbiIsCisJCQkgX19mdW5jX18sIHNlc3Npb25faWQpOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJaWYgKHBydGQtPnBsYXliYWNrX3N0YXJ0KQorCQkJCXBydGQtPnBsYXliYWNrX3N0YXJ0ID0gMDsKKwkJfSBlbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJCWlmIChwcnRkLT5jYXB0dXJlX3N0YXJ0KQorCQkJCXBydGQtPmNhcHR1cmVfc3RhcnQgPSAwOworCQl9CisJCWlmIChzZXNzaW9uX2lkKQorCQkJdm9jX3N0YW5kYnlfdm9pY2VfY2FsbChzZXNzaW9uX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX2lvY3RsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBtc21fdm9pY2UgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdWludDMyX3Qgc2Vzc2lvbl9pZCA9IGdldF9zZXNzaW9uX2lkKHBydGQpOworCWVudW0gdm9pY2VfbGNoX21vZGUgbGNoX21vZGU7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfVk9JQ0VfSU9DVExfTENIOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmxjaF9tb2RlLCAodm9pZCAqKWFyZywKKwkJCQkgICBzaXplb2YoZW51bSB2b2ljZV9sY2hfbW9kZSkpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCBzaXplb2YoZW51bSB2b2ljZV9sY2hfbW9kZSkpOworCisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6ICVzIGxjaF9tb2RlOiVkXG4iLAorCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQsIGxjaF9tb2RlKTsKKworCQlzd2l0Y2ggKGxjaF9tb2RlKSB7CisJCWNhc2UgVk9JQ0VfTENIX1NUQVJUOgorCQljYXNlIFZPSUNFX0xDSF9TVE9QOgorCQkJcmV0ID0gdm9jX3NldF9sY2goc2Vzc2lvbl9pZCwgbGNoX21vZGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6IEludmFsaWQgTENIIE1PREUgJWRcbiIsIF9fZnVuY19fLCBsY2hfbW9kZSk7CisKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXM6IEZhbGxpbmcgaW50byBkZWZhdWx0IHNuZF9saWJfaW9jdGwgY21kIDB4JXhcbiIsCisJCQkgX19mdW5jX18sIGNtZCk7CisKKwkJcmV0ID0gc25kX3BjbV9saWJfaW9jdGwoc3Vic3RyZWFtLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKworCWlmICghcmV0KQorCQlwcl9kZWJ1ZygiJXM6IHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJZWxzZQorCQlwcl9lcnIoIiVzOiBjbWQgMHgleCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBjbWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV92b2ljZV9nYWluX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwOworCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaW50IHJhbXBfZHVyYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKworCWlmICgodm9sdW1lIDwgMCkgfHwgKHJhbXBfZHVyYXRpb24gPCAwKQorCQl8fCAocmFtcF9kdXJhdGlvbiA+IE1BWF9SQU1QX0RVUkFUSU9OKSkgeworCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiB2b2x1bWU6ICVkIHNlc3Npb25faWQ6ICUjeCByYW1wX2R1cmF0aW9uOiAlZFxuIiwgX19mdW5jX18sCisJCXZvbHVtZSwgc2Vzc2lvbl9pZCwgcmFtcF9kdXJhdGlvbik7CisKKwl2b2Nfc2V0X3J4X3ZvbF9zdGVwKHNlc3Npb25faWQsIFJYX1BBVEgsIHZvbHVtZSwgcmFtcF9kdXJhdGlvbik7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fdm9pY2VfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbXV0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXVpbnQzMl90IHNlc3Npb25faWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpbnQgcmFtcF9kdXJhdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCisJaWYgKChtdXRlIDwgMCkgfHwgKG11dGUgPiAxKSB8fCAocmFtcF9kdXJhdGlvbiA8IDApCisJCXx8IChyYW1wX2R1cmF0aW9uID4gTUFYX1JBTVBfRFVSQVRJT04pKSB7CisJCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG11dGU9JWQgc2Vzc2lvbl9pZD0lI3ggcmFtcF9kdXJhdGlvbj0lZFxuIiwgX19mdW5jX18sCisJCW11dGUsIHNlc3Npb25faWQsIHJhbXBfZHVyYXRpb24pOworCisJcmV0ID0gdm9jX3NldF90eF9tdXRlKHNlc3Npb25faWQsIFRYX1BBVEgsIG11dGUsIHJhbXBfZHVyYXRpb24pOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX3R4X2RldmljZV9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJaW50IG11dGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaW50IHJhbXBfZHVyYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKworCWlmICgobXV0ZSA8IDApIHx8IChtdXRlID4gMSkgfHwgKHJhbXBfZHVyYXRpb24gPCAwKSB8fAorCSAgICAocmFtcF9kdXJhdGlvbiA+IE1BWF9SQU1QX0RVUkFUSU9OKSkgeworCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiBtdXRlPSVkIHNlc3Npb25faWQ9JSN4IHJhbXBfZHVyYXRpb249JWRcbiIsIF9fZnVuY19fLAorCQkgbXV0ZSwgc2Vzc2lvbl9pZCwgcmFtcF9kdXJhdGlvbik7CisKKwlyZXQgPSB2b2Nfc2V0X2RldmljZV9tdXRlKHNlc3Npb25faWQsIFZTU19JVk9MVU1FX0RJUkVDVElPTl9UWCwKKwkJCQkgIG11dGUsIHJhbXBfZHVyYXRpb24pOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX3J4X2RldmljZV9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJaW50IG11dGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaW50IHJhbXBfZHVyYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKKworCWlmICgobXV0ZSA8IDApIHx8IChtdXRlID4gMSkgfHwgKHJhbXBfZHVyYXRpb24gPCAwKSB8fAorCSAgICAocmFtcF9kdXJhdGlvbiA+IE1BWF9SQU1QX0RVUkFUSU9OKSkgeworCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiBtdXRlPSVkIHNlc3Npb25faWQ9JSN4IHJhbXBfZHVyYXRpb249JWRcbiIsIF9fZnVuY19fLAorCQkgbXV0ZSwgc2Vzc2lvbl9pZCwgcmFtcF9kdXJhdGlvbik7CisKKwl2b2Nfc2V0X2RldmljZV9tdXRlKHNlc3Npb25faWQsIFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWCwKKwkJCSAgICBtdXRlLCByYW1wX2R1cmF0aW9uKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0dHlfbW9kZVtdID0geyJPRkYiLCAiSENPIiwgIlZDTyIsICJGVUxMIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV90dHlfbW9kZV9lbnVtW10gPSB7CisJCVNPQ19FTlVNX1NJTkdMRV9FWFQoNCwgdHR5X21vZGUpLAorfTsKKworc3RhdGljIGludCBtc21fdm9pY2VfdHR5X21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJdm9jX2dldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VfU0VTU0lPTl9OQU1FKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX3R0eV9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgdHR5X21vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogdHR5X21vZGU9JWRcbiIsIF9fZnVuY19fLCB0dHlfbW9kZSk7CisKKwl2b2Nfc2V0X3R0eV9tb2RlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRV9TRVNTSU9OX05BTUUpLCB0dHlfbW9kZSk7CisJdm9jX3NldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0UyX1NFU1NJT05fTkFNRSksIHR0eV9tb2RlKTsKKwl2b2Nfc2V0X3R0eV9tb2RlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0xURV9TRVNTSU9OX05BTUUpLCB0dHlfbW9kZSk7CisJdm9jX3NldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9XTEFOX1NFU1NJT05fTkFNRSksIHR0eV9tb2RlKTsKKwl2b2Nfc2V0X3R0eV9tb2RlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMV9OQU1FKSwgdHR5X21vZGUpOworCXZvY19zZXRfdHR5X21vZGUodm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFTU1PREUyX05BTUUpLCB0dHlfbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9pY2Vfc2xvd3RhbGtfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHN0X2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXVpbnQzMl90IHNlc3Npb25faWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKworCXByX2RlYnVnKCIlczogc3QgZW5hYmxlPSVkIHNlc3Npb25faWQ9JSN4XG4iLCBfX2Z1bmNfXywgc3RfZW5hYmxlLAorCQkgc2Vzc2lvbl9pZCk7CisKKwl2b2Nfc2V0X3BwX2VuYWJsZShzZXNzaW9uX2lkLAorCQkJICBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULCBzdF9lbmFibGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX2hkX3ZvaWNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwOworCXVpbnQzMl90IGhkX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXVpbnQzMl90IHNlc3Npb25faWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKworCXByX2RlYnVnKCIlczogSEQgVm9pY2UgZW5hYmxlPSVkIHNlc3Npb25faWQ9JSN4XG4iLCBfX2Z1bmNfXywgaGRfZW5hYmxlLAorCQkgc2Vzc2lvbl9pZCk7CisKKwlyZXQgPSB2b2Nfc2V0X2hkX2VuYWJsZShzZXNzaW9uX2lkLCBoZF9lbmFibGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fdm9pY2VfdG9wb2xvZ3lfZGlzYWJsZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJaW50IGRpc2FibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisKKwlpZiAoKGRpc2FibGUgPCAwKSB8fCAoZGlzYWJsZSA+IDEpKSB7CisJCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzOiAlZFxuIiwgX19mdW5jX18sIGRpc2FibGUpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJfZGVidWcoIiVzOiBkaXNhYmxlID0gJWQsIHNlc3Npb25faWQgPSAlZFxuIiwgX19mdW5jX18sIGRpc2FibGUsCisJCSBzZXNzaW9uX2lkKTsKKworCXJldCA9IHZvY19kaXNhYmxlX3RvcG9sb2d5KHNlc3Npb25faWQsIGRpc2FibGUpOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaWNlX2N2ZF92ZXJzaW9uX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKwl1aW5mby0+Y291bnQgPSBDVkRfVkVSU0lPTl9TVFJJTkdfTUFYX1NJWkU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV92b2ljZV9jdmRfdmVyc2lvbl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwljaGFyIGN2ZF92ZXJzaW9uW0NWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRV0gPSBDVkRfVkVSU0lPTl9ERUZBVUxUOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSB2b2NfZ2V0X2N2ZF92ZXJzaW9uKGN2ZF92ZXJzaW9uKTsKKworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEVycm9yIHJldHJpZXZpbmcgQ1ZEIHZlcnNpb24sIGVycm9yOiVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsIGN2ZF92ZXJzaW9uLCBzaXplb2YoY3ZkX3ZlcnNpb24pKTsKKworCXJldHVybiAwOworfQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV92b2ljZV9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2ljZSBSeCBEZXZpY2UgTXV0ZSIsIFNORF9TT0NfTk9QTSwgMCwgVlNJRF9NQVgsCisJCQkJMCwgMywgTlVMTCwgbXNtX3ZvaWNlX3J4X2RldmljZV9tdXRlX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvaWNlIFR4IERldmljZSBNdXRlIiwgU05EX1NPQ19OT1BNLCAwLCBWU0lEX01BWCwKKwkJCQkwLCAzLCBOVUxMLCBtc21fdm9pY2VfdHhfZGV2aWNlX211dGVfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVm9pY2UgVHggTXV0ZSIsIFNORF9TT0NfTk9QTSwgMCwgVlNJRF9NQVgsCisJCQkJMCwgMywgTlVMTCwgbXNtX3ZvaWNlX211dGVfcHV0KSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVm9pY2UgUnggR2FpbiIsIFNORF9TT0NfTk9QTSwgMCwgVlNJRF9NQVgsIDAsIDMsCisJCQkJTlVMTCwgbXNtX3ZvaWNlX2dhaW5fcHV0KSwKKwlTT0NfRU5VTV9FWFQoIlRUWSBNb2RlIiwgbXNtX3R0eV9tb2RlX2VudW1bMF0sIG1zbV92b2ljZV90dHlfbW9kZV9nZXQsCisJCQkJbXNtX3ZvaWNlX3R0eV9tb2RlX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNsb3d0YWxrIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgVlNJRF9NQVgsIDAsIDIsCisJCQkJTlVMTCwgbXNtX3ZvaWNlX3Nsb3d0YWxrX3B1dCksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvaWNlIFRvcG9sb2d5IERpc2FibGUiLCBTTkRfU09DX05PUE0sIDAsCisJCQkgICAgIFZTSURfTUFYLCAwLCAyLCBOVUxMLAorCQkJICAgICBtc21fdm9pY2VfdG9wb2xvZ3lfZGlzYWJsZV9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJIRCBWb2ljZSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIFZTSURfTUFYLCAwLCAyLAorCQkJICAgICBOVUxMLCBtc21fdm9pY2VfaGRfdm9pY2VfcHV0KSwKKwl7CisJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lCT0gIkNWRCBWZXJzaW9uIiwKKwkJLmluZm8JPSBtc21fdm9pY2VfY3ZkX3ZlcnNpb25faW5mbywKKwkJLmdldAk9IG1zbV92b2ljZV9jdmRfdmVyc2lvbl9nZXQsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7CisJLm9wZW4JCQk9IG1zbV9wY21fb3BlbiwKKwkuaHdfcGFyYW1zCQk9IG1zbV9wY21faHdfcGFyYW1zLAorCS5jbG9zZQkJCT0gbXNtX3BjbV9jbG9zZSwKKwkucHJlcGFyZQkJPSBtc21fcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJCT0gbXNtX3BjbV90cmlnZ2VyLAorCS5pb2N0bAkJCT0gbXNtX3BjbV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCQk9IG1zbV9wY21faW9jdGwsCit9OworCisKK3N0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV92b2ljZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV92b2ljZV9jb250cm9scywKKwkJCQkJQVJSQVlfU0laRShtc21fdm9pY2VfY29udHJvbHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXNtX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBtc21fYXNvY19wY21fbmV3LAorCS5wcm9iZQkJPSBtc21fcGNtX3ZvaWNlX3Byb2JlLAorfTsKKworc3RhdGljIGludCBtc21fcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCWJvb2wgZGVzdHJveV9jdmQgPSBmYWxzZTsKKwljb25zdCBjaGFyICppc19kZXN0cm95X2N2ZCA9ICJxY29tLGRlc3Ryb3ktY3ZkIjsKKworCWlmICghaXNfdm9jX2luaXRpYWxpemVkKCkpIHsKKwkJcHJfZGVidWcoIiVzOiB2b2ljZSBtb2R1bGUgbm90IGluaXRpYWxpemVkIHlldCwgZGVmZXJyaW5nIHByb2JlKClcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisKKwkJcmMgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSB2b2NfYWxsb2NfY2FsX3NoYXJlZF9tZW1vcnkoKTsKKwlpZiAocmMgPT0gLUVQUk9CRV9ERUZFUikgeworCQlwcl9kZWJ1ZygiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjYWxpYnJhdGlvbiBkZWZlcnJlZCAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmMpOworCisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY2FsaWJyYXRpb24gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzXG4iLAorCQkJX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlkZXN0cm95X2N2ZCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCWlzX2Rlc3Ryb3lfY3ZkKTsKKwl2b2Nfc2V0X2Rlc3Ryb3lfY3ZkX2ZsYWcoZGVzdHJveV9jdmQpOworCisJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCisJCQkJICAgICAgICZtc21fc29jX3BsYXRmb3JtKTsKKworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV92b2ljZV9kdF9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tdm9pY2UifSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV92b2ljZV9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wY21fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zbS1wY20tdm9pY2UiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3ZvaWNlX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwltZW1zZXQoJnZvaWNlX2luZm8sIDAsIHNpemVvZih2b2ljZV9pbmZvKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVk9JQ0VfU0VTU0lPTl9JTkRFWF9NQVg7IGkrKykKKwkJbXV0ZXhfaW5pdCgmdm9pY2VfaW5mb1tpXS5sb2NrKTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWb2ljZSBQQ00gbW9kdWxlIHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pY2UtdjIuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXZvaWNlLXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwY2ViYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXZvaWNlLXYyLmgKQEAgLTAsMCArMSw0MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX01TTV9QQ01fVk9JQ0VfSAorI2RlZmluZSBfTVNNX1BDTV9WT0lDRV9ICisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisKK2VudW0geworCVZPSUNFX1NFU1NJT05fSU5ERVgsCisJVk9MVEVfU0VTU0lPTl9JTkRFWCwKKwlWT0lDRTJfU0VTU0lPTl9JTkRFWCwKKwlRQ0hBVF9TRVNTSU9OX0lOREVYLAorCVZPV0xBTl9TRVNTSU9OX0lOREVYLAorCVZPSUNFTU1PREUxX0lOREVYLAorCVZPSUNFTU1PREUyX0lOREVYLAorCVZPSUNFX1NFU1NJT05fSU5ERVhfTUFYLAorfTsKKworc3RydWN0IG1zbV92b2ljZSB7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwbGF5YmFja19zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX3N1YnN0cmVhbTsKKworCWludCBpbnN0YW5jZTsKKworCXN0cnVjdCBtdXRleCBsb2NrOworCisJdWludDMyX3Qgc2FtcF9yYXRlOworCXVpbnQzMl90IGNoYW5uZWxfbW9kZTsKKworCWludCBwbGF5YmFja19zdGFydDsKKwlpbnQgY2FwdHVyZV9zdGFydDsKK307CisKKyNlbmRpZiAvKl9NU01fUENNX1ZPSUNFX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pcC12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pcC12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmQxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS12b2lwLXYyLmMKQEAgLTAsMCArMSwxNzA1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJtc20tcGNtLXE2LXYyLmgiCisjaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSAicTZ2b2ljZS5oIgorCisjZGVmaW5lIFNIQVJFRF9NRU1fQlVGIDIKKyNkZWZpbmUgVk9JUF9NQVhfUV9MRU4gMTAKKyNkZWZpbmUgVk9JUF9NQVhfVk9DX1BLVF9TSVpFIDQwOTYKKyNkZWZpbmUgVk9JUF9NSU5fVk9DX1BLVF9TSVpFIDMyMAorCisvKiBMZW5ndGggb2YgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlciBhZGRlZCB0byB0aGUgdm9jIHBhY2tldC4gKi8KKyNkZWZpbmUgRFNQX0ZSQU1FX0hEUl9MRU4gMQorCisjZGVmaW5lIE1PREVfSVMxMjcJCTB4MgorI2RlZmluZSBNT0RFXzRHVl9OQgkJMHgzCisjZGVmaW5lIE1PREVfNEdWX1dCCQkweDQKKyNkZWZpbmUgTU9ERV9BTVIJCTB4NQorI2RlZmluZSBNT0RFX0FNUl9XQgkJMHhECisjZGVmaW5lIE1PREVfUENNCQkweEMKKyNkZWZpbmUgTU9ERV80R1ZfTlcJCTB4RQorI2RlZmluZSBNT0RFX0c3MTEJCTB4QQorI2RlZmluZSBNT0RFX0c3MTFBCQkweEYKKworZW51bSBtc21fYXVkaW9fZzcxMWFfZnJhbWVfdHlwZSB7CisJTVZTX0c3MTFBX1NQRUVDSF9HT09ELAorCU1WU19HNzExQV9TSUQsCisJTVZTX0c3MTFBX05PX0RBVEEsCisJTVZTX0c3MTFBX0VSQVNVUkUKK307CisKK2VudW0gbXNtX2F1ZGlvX2c3MTFhX21vZGUgeworCU1WU19HNzExQV9NT0RFX01VTEFXLAorCU1WU19HNzExQV9NT0RFX0FMQVcKK307CisKK2VudW0gbXNtX2F1ZGlvX2c3MTFfbW9kZSB7CisJTVZTX0c3MTFfTU9ERV9NVUxBVywKKwlNVlNfRzcxMV9NT0RFX0FMQVcKK307CisKKyNkZWZpbmUgVk9JUF9NT0RFX01BWAkJTU9ERV9HNzExQQorI2RlZmluZSBWT0lQX1JBVEVfTUFYCQkyMzg1MAorCitlbnVtIGZvcm1hdCB7CisJRk9STUFUX1MxNl9MRSA9IDIsCisJRk9STUFUX1NQRUNJQUwgPSAzMSwKK307CisKKworZW51bSBhbXJfcmF0ZV90eXBlIHsKKwlBTVJfUkFURV80NzUwLCAvKiBBTVIgNC43NSBrYnBzICovCisJQU1SX1JBVEVfNTE1MCwgLyogQU1SIDUuMTUga2JwcyAqLworCUFNUl9SQVRFXzU5MDAsIC8qIEFNUiA1LjkwIGticHMgKi8KKwlBTVJfUkFURV82NzAwLCAvKiBBTVIgNi43MCBrYnBzICovCisJQU1SX1JBVEVfNzQwMCwgLyogQU1SIDcuNDAga2JwcyAqLworCUFNUl9SQVRFXzc5NTAsIC8qIEFNUiA3Ljk1IGticHMgKi8KKwlBTVJfUkFURV8xMDIwMCwgLyogQU1SIDEwLjIwIGticHMgKi8KKwlBTVJfUkFURV8xMjIwMCwgLyogQU1SIDEyLjIwIGticHMgKi8KKwlBTVJfUkFURV82NjAwLCAvKiBBTVItV0IgNi42MCBrYnBzICovCisJQU1SX1JBVEVfODg1MCwgLyogQU1SLVdCIDguODUga2JwcyAqLworCUFNUl9SQVRFXzEyNjUwLCAvKiBBTVItV0IgMTIuNjUga2JwcyAqLworCUFNUl9SQVRFXzE0MjUwLCAvKiBBTVItV0IgMTQuMjUga2JwcyAqLworCUFNUl9SQVRFXzE1ODUwLCAvKiBBTVItV0IgMTUuODUga2JwcyAqLworCUFNUl9SQVRFXzE4MjUwLCAvKiBBTVItV0IgMTguMjUga2JwcyAqLworCUFNUl9SQVRFXzE5ODUwLCAvKiBBTVItV0IgMTkuODUga2JwcyAqLworCUFNUl9SQVRFXzIzMDUwLCAvKiBBTVItV0IgMjMuMDUga2JwcyAqLworCUFNUl9SQVRFXzIzODUwLCAvKiBBTVItV0IgMjMuODUga2JwcyAqLworCUFNUl9SQVRFX1VOREVGCit9OworCitlbnVtIHZvaXBfc3RhdGUgeworCVZPSVBfU1RPUFBFRCwKKwlWT0lQX1NUQVJURUQsCit9OworCitzdHJ1Y3Qgdm9pcF9mcmFtZV9oZHIgeworCXVpbnQzMl90IHRpbWVzdGFtcDsKKwl1bmlvbiB7CisJCS8qCisJCSAqIEJpdHMgMC0zOiBGcmFtZSB0eXBlCisJCSAqIFtvcHRpb25hbF0gQml0cyAxNi0xOTogRnJhbWUgcmF0ZQorCQkgKi8KKwkJdWludDMyX3QgZnJhbWVfdHlwZTsKKwkJdWludDMyX3QgcGFja2V0X3JhdGU7CisJfTsKK307CitzdHJ1Y3Qgdm9pcF9mcmFtZSB7CisJc3RydWN0IHZvaXBfZnJhbWVfaGRyIGZybV9oZHI7CisJdWludDMyX3QgcGt0bGVuOworCXVpbnQ4X3Qgdm9jX3BrdFtWT0lQX01BWF9WT0NfUEtUX1NJWkVdOworfTsKKworc3RydWN0IHZvaXBfYnVmX25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgdm9pcF9mcmFtZSBmcmFtZTsKK307CisKK3N0cnVjdCB2b2lwX2Rydl9pbmZvIHsKKwllbnVtICB2b2lwX3N0YXRlIHN0YXRlOworCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwbGF5YmFja19zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX3N1YnN0cmVhbTsKKworCXN0cnVjdCBsaXN0X2hlYWQgaW5fcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2luX3F1ZXVlOworCisJc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX291dF9xdWV1ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IG91dF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGluX3dhaXQ7CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXNwaW5sb2NrX3QgZHNwX2xvY2s7CisJc3BpbmxvY2tfdCBkc3BfdWxfbG9jazsKKworCWJvb2wgdm9pcF9yZXNldDsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IHJhdGVfdHlwZTsKKwl1aW50MzJfdCByYXRlOworCXVpbnQzMl90IGR0eF9tb2RlOworCisJdWludDhfdCBjYXB0dXJlX3N0YXJ0OworCXVpbnQ4X3QgcGxheWJhY2tfc3RhcnQ7CisKKwl1aW50OF90IHBsYXliYWNrX3ByZXBhcmU7CisJdWludDhfdCBjYXB0dXJlX3ByZXBhcmU7CisKKwl1bnNpZ25lZCBpbnQgcGxheV9zYW1wX3JhdGU7CisJdW5zaWduZWQgaW50IGNhcF9zYW1wX3JhdGU7CisKKwl1bnNpZ25lZCBpbnQgcGNtX3NpemU7CisJdW5zaWduZWQgaW50IHBjbV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcGNtX3BsYXliYWNrX2lycV9wb3M7ICAgICAgLyogSVJRIHBvc2l0aW9uICovCisJdW5zaWduZWQgaW50IHBjbV9wbGF5YmFja19idWZfcG9zOyAgICAgIC8qIHBvc2l0aW9uIGluIGJ1ZmZlciAqLworCisJdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX3NpemU7CisJdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX2NvdW50OworCXVuc2lnbmVkIGludCBwY21fY2FwdHVyZV9pcnFfcG9zOyAgICAgICAvKiBJUlEgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgcGNtX2NhcHR1cmVfYnVmX3BvczsgICAgICAgLyogcG9zaXRpb24gaW4gYnVmZmVyICovCisKKwl1aW50MzJfdCBldnJjX21pbl9yYXRlOworCXVpbnQzMl90IGV2cmNfbWF4X3JhdGU7Cit9OworCitzdGF0aWMgaW50IHZvaXBfZ2V0X21lZGlhX3R5cGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgcmF0ZV90eXBlLAorCQkJCXVuc2lnbmVkIGludCBzYW1wX3JhdGUsCisJCQkJdW5zaWduZWQgaW50ICptZWRpYV90eXBlKTsKK3N0YXRpYyBpbnQgdm9pcF9nZXRfcmF0ZV90eXBlKHVpbnQzMl90IG1vZGUsCisJCQkJdWludDMyX3QgcmF0ZSwKKwkJCQl1aW50MzJfdCAqcmF0ZV90eXBlKTsKK3N0YXRpYyBpbnQgdm9pcF9jb25maWdfdm9jb2RlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CitzdGF0aWMgaW50IG1zbV92b2lwX21vZGVfY29uZmlnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworc3RhdGljIGludCBtc21fdm9pcF9tb2RlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK3N0YXRpYyBpbnQgbXNtX3ZvaXBfcmF0ZV9jb25maWdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitzdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitzdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CisKK3N0YXRpYyBzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyB2b2lwX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlID0geworCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQpLAorCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1NQRUNJQUwsCisJLnJhdGVzID0gICAgICAgICAgICAgICAgU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKKwkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCisJLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCisJLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKKwkuY2hhbm5lbHNfbWF4ID0gICAgICAgICAxLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0Jc2l6ZW9mKHN0cnVjdCB2b2lwX2J1Zl9ub2RlKSAqIFZPSVBfTUFYX1FfTEVOLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JVk9JUF9NSU5fVk9DX1BLVF9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0JVk9JUF9NQVhfVk9DX1BLVF9TSVpFLAorCS5wZXJpb2RzX21pbiA9CQlWT0lQX01BWF9RX0xFTiwKKwkucGVyaW9kc19tYXggPQkJVk9JUF9NQVhfUV9MRU4sCisJLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKK307CisKKworc3RhdGljIGludCBtc21fdm9pcF9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJaW50IG11dGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpbnQgcmFtcF9kdXJhdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCisJaWYgKChtdXRlIDwgMCkgfHwgKG11dGUgPiAxKSB8fCAocmFtcF9kdXJhdGlvbiA8IDApKSB7CisJCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG11dGU9JWQgcmFtcF9kdXJhdGlvbj0lZFxuIiwgX19mdW5jX18sIG11dGUsCisJCXJhbXBfZHVyYXRpb24pOworCisJdm9jX3NldF90eF9tdXRlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lQX1NFU1NJT05fTkFNRSksIFRYX1BBVEgsIG11dGUsCisJCQkJCXJhbXBfZHVyYXRpb24pOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaXBfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQgPSAwOworCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpbnQgcmFtcF9kdXJhdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCisJaWYgKCh2b2x1bWUgPCAwKSB8fCAocmFtcF9kdXJhdGlvbiA8IDApKSB7CisJCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHZvbHVtZTogJWQgcmFtcF9kdXJhdGlvbjogJWRcbiIsIF9fZnVuY19fLCB2b2x1bWUsCisJCXJhbXBfZHVyYXRpb24pOworCisJdm9jX3NldF9yeF92b2xfc3RlcCh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpLAorCQkJCQkJUlhfUEFUSCwKKwkJCQkJCXZvbHVtZSwKKwkJCQkJCXJhbXBfZHVyYXRpb24pOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaXBfZHR4X21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCW11dGV4X2xvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXZvaXBfaW5mby5kdHhfbW9kZSAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogZHR4OiAlZFxuIiwgX19mdW5jX18sIHZvaXBfaW5mby5kdHhfbW9kZSk7CisKKwltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBtc21fdm9pcF9kdHhfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2lwX2luZm8uZHR4X21vZGU7CisKKwltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3ZvaXBfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVm9pcCBUeCBNdXRlIiwgU05EX1NPQ19OT1BNLCAwLAorCQkJICAgICBNQVhfUkFNUF9EVVJBVElPTiwKKwkJCSAgICAgMCwgMiwgTlVMTCwgbXNtX3ZvaXBfbXV0ZV9wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2lwIFJ4IEdhaW4iLCBTTkRfU09DX05PUE0sIDAsCisJCQkgICAgIE1BWF9SQU1QX0RVUkFUSU9OLAorCQkJICAgICAwLCAyLCBOVUxMLCBtc21fdm9pcF9nYWluX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAgTW9kZSBDb25maWciLCBTTkRfU09DX05PUE0sIDAsIFZPSVBfTU9ERV9NQVgsIDAsCisJCSAgICAgICBtc21fdm9pcF9tb2RlX2NvbmZpZ19nZXQsIG1zbV92b2lwX21vZGVfY29uZmlnX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAgUmF0ZSBDb25maWciLCBTTkRfU09DX05PUE0sIDAsIFZPSVBfUkFURV9NQVgsIDAsCisJCSAgICAgICBOVUxMLCBtc21fdm9pcF9yYXRlX2NvbmZpZ19wdXQpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2lwIEV2cmMgTWluIE1heCBSYXRlIENvbmZpZyIsIFNORF9TT0NfTk9QTSwKKwkJCSAgICAgMCwgVk9DXzFfUkFURSwgMCwgMiwKKwkJCSAgICAgbXNtX3ZvaXBfZXZyY19taW5fbWF4X3JhdGVfY29uZmlnX2dldCwKKwkJCSAgICAgbXNtX3ZvaXBfZXZyY19taW5fbWF4X3JhdGVfY29uZmlnX3B1dCksCisJU09DX1NJTkdMRV9FWFQoIlZvaXAgRHR4IE1vZGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCisJCSAgICAgICBtc21fdm9pcF9kdHhfbW9kZV9nZXQsIG1zbV92b2lwX2R0eF9tb2RlX3B1dCksCit9OworCitzdGF0aWMgaW50IG1zbV9wY21fdm9pcF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV92b2lwX2NvbnRyb2xzLAorCQkJCQlBUlJBWV9TSVpFKG1zbV92b2lwX2NvbnRyb2xzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHs4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwfTsKKworc3RhdGljIHZvaWQgdm9pcF9zc3JfY2JfZm4odWludDMyX3Qgb3Bjb2RlLCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisKKwkvKiBOb3RpZnkgQVNvQyB0byBzZW5kIG5leHQgcGxheWJhY2svQ2FwdHVyZSB0byB1bmJsb2NrIHdyaXRlL3JlYWQgKi8KKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHByaXZhdGVfZGF0YTsKKworCWlmIChvcGNvZGUgPT0gMHhGRkZGRkZGRikgeworCisJCXBydGQtPnZvaXBfcmVzZXQgPSB0cnVlOworCQlwcl9kZWJ1ZygiJXM6IE5vdGlmeSBBU29DIHRvIHNlbmQgbmV4dCBwbGF5YmFjay9DYXB0dXJlXG4iLAorCQkJX19mdW5jX18pOworCisJCXBydGQtPnBjbV9wbGF5YmFja19pcnFfcG9zICs9IHBydGQtPnBjbV9jb3VudDsKKwkJaWYgKHBydGQtPnN0YXRlID09IFZPSVBfU1RBUlRFRCkKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKKwkJd2FrZV91cCgmcHJ0ZC0+b3V0X3dhaXQpOworCisJCXBydGQtPnBjbV9jYXB0dXJlX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQ7CisJCWlmIChwcnRkLT5zdGF0ZSA9PSBWT0lQX1NUQVJURUQpCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwkJd2FrZV91cCgmcHJ0ZC0+aW5fd2FpdCk7CisKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG9wY29kZSBkdXJpbmcgcmVzZXQgOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBvcGNvZGUpOworCX0KK30KKworLyogY2FwdHVyZSBwYXRoICovCitzdGF0aWMgdm9pZCB2b2lwX3Byb2Nlc3NfdWxfcGt0KHVpbnQ4X3QgKnZvY19wa3QsCisJCQkJdWludDMyX3QgcGt0X2xlbiwKKwkJCQl1aW50MzJfdCB0aW1lc3RhbXAsCisJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBwcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisKKwlpZiAocHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQ29weSB1cC1saW5rIHBhY2tldCBpbnRvIG91dF9xdWV1ZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7CisKKwkvKiBkaXNjYXJkaW5nIFVMIHBhY2tldHMgdGlsbCBzdGFydCBpcyByZWNlaXZlZCAqLworCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpICYmIHBydGQtPmNhcHR1cmVfc3RhcnQpIHsKKwkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSwKKwkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQlzd2l0Y2ggKHBydGQtPm1vZGUpIHsKKwkJY2FzZSBNT0RFX0FNUl9XQjoKKwkJY2FzZSBNT0RFX0FNUjogeworCQkJLyogUmVtb3ZlIHRoZSBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuIEhlYWRlciBmb3JtYXQ6CisJCQkgKiBCaXRzIDAtMzogRnJhbWUgcmF0ZQorCQkJICogQml0cyA0LTc6IEZyYW1lIHR5cGUKKwkJCSAqLworCQkJYnVmX25vZGUtPmZyYW1lLmZybV9oZHIudGltZXN0YW1wID0gdGltZXN0YW1wOworCQkJYnVmX25vZGUtPmZyYW1lLmZybV9oZHIuZnJhbWVfdHlwZSA9CisJCQkJCQkoKCp2b2NfcGt0KSAmIDB4RjApID4+IDQ7CisJCQl2b2NfcGt0ID0gdm9jX3BrdCArIERTUF9GUkFNRV9IRFJfTEVOOworCQkJYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA9IHBrdF9sZW4gLSBEU1BfRlJBTUVfSERSX0xFTjsKKwkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCQkJdm9jX3BrdCwKKwkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5vdXRfcXVldWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNT0RFX0lTMTI3OgorCQljYXNlIE1PREVfNEdWX05COgorCQljYXNlIE1PREVfNEdWX1dCOgorCQljYXNlIE1PREVfNEdWX05XOiB7CisJCQkvKiBSZW1vdmUgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlci4KKwkJCSAqIEhlYWRlciBmb3JtYXQ6CisJCQkgKiBCaXRzIDAtMzogZnJhbWUgcmF0ZQorCQkJICovCisJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5wYWNrZXRfcmF0ZSA9ICgqdm9jX3BrdCkgJiAweDBGOworCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKKwkJCWJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4gPSBwa3RfbGVuIC0gRFNQX0ZSQU1FX0hEUl9MRU47CisKKwkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCQkJdm9jX3BrdCwKKwkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5vdXRfcXVldWUpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNT0RFX0c3MTE6CisJCWNhc2UgTU9ERV9HNzExQTp7CisJCQkvKiBHNzExIGZyYW1lcyBhcmUgMTBtcyBlYWNoLCBidXQgdGhlIERTUCB3b3JrcyB3aXRoCisJCQkgKiAyMG1zIGZyYW1lcyBhbmQgc2VuZHMgdHdvIDEwbXMgZnJhbWVzIHBlciBidWZmZXIuCisJCQkgKiBFeHRyYWN0IHRoZSB0d28gZnJhbWVzIGFuZCBwdXQgdGhlbSBpbiBzZXBhcmF0ZQorCQkJICogYnVmZmVycy4KKwkJCSAqLworCQkJLyogUmVtb3ZlIHRoZSBmaXJzdCBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuCisJCQkgKiBIZWFkZXIgZm9ybWF0OiBHNzExQQorCQkJICogQml0cyAwLTE6IEZyYW1lIHR5cGUKKwkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCisJCQkgKgorCQkJICogSGVhZGVyIGZvcm1hdDogRzcxMQorCQkJICogQml0cyAyLTM6IEZyYW1lIHJhdGUKKwkJCSAqLworCQkJaWYgKHBydGQtPm1vZGUgPT0gTU9ERV9HNzExQSkKKwkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlID0KKwkJCQkJCQkoKnZvY19wa3QpICYgMHgwMzsKKwkJCWJ1Zl9ub2RlLT5mcmFtZS5mcm1faGRyLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJCXZvY19wa3QgPSB2b2NfcGt0ICsgRFNQX0ZSQU1FX0hEUl9MRU47CisKKwkJCS8qIFRoZXJlIGFyZSB0d28gZnJhbWVzIGluIHRoZSBidWZmZXIuIExlbmd0aCBvZiB0aGUKKwkJCSAqIGZpcnN0IGZyYW1lOgorCQkJICovCisJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gKHBrdF9sZW4gLQorCQkJCQkJICAyICogRFNQX0ZSQU1FX0hEUl9MRU4pIC8gMjsKKworCQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCSAgICAgICB2b2NfcGt0LAorCQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4pOworCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOworCisJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJnBydGQtPm91dF9xdWV1ZSk7CisKKwkJCS8qIEdldCBhbm90aGVyIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIFEgYW5kIGZpbGwgaW4gdGhlCisJCQkgKiBzZWNvbmQgZnJhbWUuCisJCQkgKi8KKwkJCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpKSB7CisJCQkJYnVmX25vZGUgPQorCQkJCQlsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSwKKwkJCQkJCQkgc3RydWN0IHZvaXBfYnVmX25vZGUsCisJCQkJCQkJIGxpc3QpOworCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisKKwkJCQkvKiBSZW1vdmUgdGhlIHNlY29uZCBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuCisJCQkJICogSGVhZGVyIGZvcm1hdDoKKwkJCQkgKiBCaXRzIDAtMTogRnJhbWUgdHlwZQorCQkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCisJCQkJICovCisKKwkJCQlpZiAocHJ0ZC0+bW9kZSA9PSBNT0RFX0c3MTFBKQorCQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlID0KKwkJCQkJCQkoKnZvY19wa3QpICYgMHgwMzsKKwkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKKworCQkJCS8qIFRoZXJlIGFyZSB0d28gZnJhbWVzIGluIHRoZSBidWZmZXIuIExlbmd0aAorCQkJCSAqIG9mIHRoZSBzZWNvbmQgZnJhbWU6CisJCQkJICovCisJCQkJYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA9IChwa3RfbGVuIC0KKwkJCQkJCTIgKiBEU1BfRlJBTUVfSERSX0xFTikgLyAyOworCisJCQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCQkgICAgICAgdm9jX3BrdCwKKwkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7CisKKwkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKKwkJCQkJICAgICAgJnBydGQtPm91dF9xdWV1ZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIERyb3AgdGhlIHNlY29uZCBmcmFtZSAqLworCQkJCXByX2VycigiJXM6IFVMIGRhdGEgZHJvcHBlZCwgcmVhZCBpcyBzbG93XG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gcGt0X2xlbjsKKwkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCQkgICAgICAgdm9jX3BrdCwKKwkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+b3V0X3F1ZXVlKTsKKwkJfQorCQl9CisJCXByX2RlYnVnKCIlczogcGt0X2xlbiA9JWQsIGZyYW1lLnBrdGxlbj0lZCwgdGltZXN0YW1wPSVkXG4iLAorCQkJIF9fZnVuY19fLCBwa3RfbGVuLCBidWZfbm9kZS0+ZnJhbWUucGt0bGVuLCB0aW1lc3RhbXApOworCisJCWlmIChwcnRkLT5tb2RlID09IE1PREVfUENNKQorCQkJcHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyArPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOworCQllbHNlCisJCQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zICs9IHBydGQtPnBjbV9jYXB0dXJlX2NvdW50OworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF91bF9sb2NrLCBkc3BfZmxhZ3MpOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKKwkJcHJfZXJyKCJVTCBkYXRhIGRyb3BwZWRcbiIpOworCX0KKworCXdha2VfdXAoJnBydGQtPm91dF93YWl0KTsKK30KKworLyogcGxheWJhY2sgcGF0aCAqLworc3RhdGljIHZvaWQgdm9pcF9wcm9jZXNzX2RsX3BrdCh1aW50OF90ICp2b2NfcGt0LCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJc3RydWN0IHZvaXBfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKwl1aW50MzJfdCByYXRlX3R5cGU7CisJdWludDMyX3QgZnJhbWVfcmF0ZTsKKwl1MzIgcGt0X2xlbjsKKwl1OCAqdm9jX2FkZHIgPSBOVUxMOworCisJaWYgKHBydGQtPnBsYXliYWNrX3N1YnN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBydGQtPmluX3F1ZXVlKSAmJiBwcnRkLT5wbGF5YmFja19zdGFydCkgeworCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPmluX3F1ZXVlLAorCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJc3dpdGNoIChwcnRkLT5tb2RlKSB7CisJCWNhc2UgTU9ERV9BTVI6CisJCWNhc2UgTU9ERV9BTVJfV0I6IHsKKwkJCSooKHVpbnQzMl90ICopdm9jX3BrdCkgPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuICsKKwkJCQkJCQlEU1BfRlJBTUVfSERSX0xFTjsKKwkJCS8qIEFkdmFuY2UgdG8gdGhlIGhlYWRlciBvZiB2b2lwIHBhY2tldCAqLworCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBzaXplb2YodWludDMyX3QpOworCQkJLyoKKwkJCSAqIEFkZCB0aGUgRFNQIGZyYW1lIGluZm8gaGVhZGVyLiBIZWFkZXIgZm9ybWF0OgorCQkJICogQml0cyAwLTM6IEZyYW1lIHJhdGUKKwkJCSAqIEJpdHMgNC03OiBGcmFtZSB0eXBlCisJCQkgKi8KKwkJCSp2b2NfcGt0ID0gKChidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYKKwkJCQkgICAweDBGKSA8PCA0KTsKKwkJCWZyYW1lX3JhdGUgPSAoYnVmX25vZGUtPmZyYW1lLmZybV9oZHIuZnJhbWVfdHlwZSAmCisJCQkJICAgICAweEZGRkYwMDAwKSA+PiAxNjsKKwkJCWlmIChmcmFtZV9yYXRlKSB7CisJCQkJaWYgKHZvaXBfZ2V0X3JhdGVfdHlwZShwcnRkLT5tb2RlLCBmcmFtZV9yYXRlLAorCQkJCQkJICAgICAgICZyYXRlX3R5cGUpKSB7CisJCQkJCXByX2VycigiJXMoKTogZmFpbCBhdCBnZXR0aW5nIHJhdGVfdHlwZVxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJCQl9IGVsc2UKKwkJCQkJcHJ0ZC0+cmF0ZV90eXBlID0gcmF0ZV90eXBlOworCQkJfQorCQkJKnZvY19wa3QgfD0gcHJ0ZC0+cmF0ZV90eXBlICYgMHgwRjsKKworCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKKwkJCW1lbWNweSh2b2NfcGt0LAorCQkJCSZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE1PREVfSVMxMjc6CisJCWNhc2UgTU9ERV80R1ZfTkI6CisJCWNhc2UgTU9ERV80R1ZfV0I6CisJCWNhc2UgTU9ERV80R1ZfTlc6IHsKKwkJCSooKHVpbnQzMl90ICopdm9jX3BrdCkgPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuICsKKwkJCQkJCQkgRFNQX0ZSQU1FX0hEUl9MRU47CisJCQkvKiBBZHZhbmNlIHRvIHRoZSBoZWFkZXIgb2Ygdm9pcCBwYWNrZXQgKi8KKwkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKwkJCS8qCisJCQkgKiBBZGQgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlci4gSGVhZGVyIGZvcm1hdDoKKwkJCSAqIEJpdHMgMC0zIDogRnJhbWUgcmF0ZQorCQkJICovCisJCQkqdm9jX3BrdCA9IGJ1Zl9ub2RlLT5mcmFtZS5mcm1faGRyLnBhY2tldF9yYXRlICYgMHgwRjsKKwkJCXZvY19wa3QgPSB2b2NfcGt0ICsgRFNQX0ZSQU1FX0hEUl9MRU47CisKKwkJCW1lbWNweSh2b2NfcGt0LAorCQkJCSZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5mcmVlX2luX3F1ZXVlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTU9ERV9HNzExOgorCQljYXNlIE1PREVfRzcxMUE6eworCQkJLyogRzcxMSBmcmFtZXMgYXJlIDEwbXMgZWFjaCBidXQgdGhlIERTUCBleHBlY3RzIDIwbXMKKwkJCSAqIHdvcnRoIG9mIGRhdGEsIHNvIHNlbmQgdHdvIDEwbXMgZnJhbWVzIHBlciBidWZmZXIuCisJCQkgKi8KKwkJCS8qIEFkZCB0aGUgZmlyc3QgRFNQIGZyYW1lIGluZm8gaGVhZGVyLiBIZWFkZXIgZm9ybWF0OgorCQkJICogQml0cyAwLTE6IEZyYW1lIHR5cGUKKwkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCisJCQkgKi8KKwkJCXZvY19hZGRyID0gdm9jX3BrdDsKKwkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKworCQkJKnZvY19wa3QgPSAoKHBydGQtPnJhdGVfdHlwZSAgJiAweDBGKSA8PCAyKSB8CisJCQkJICAgIChidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYgMHgwMyk7CisJCQl2b2NfcGt0ID0gdm9jX3BrdCArIERTUF9GUkFNRV9IRFJfTEVOOworCisJCQlwa3RfbGVuID0gYnVmX25vZGUtPmZyYW1lLnBrdGxlbiArIERTUF9GUkFNRV9IRFJfTEVOOworCisJCQltZW1jcHkodm9jX3BrdCwKKwkJCSAgICAgICAmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCisJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7CisJCQl2b2NfcGt0ID0gdm9jX3BrdCArIGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW47CisKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7CisKKwkJCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+aW5fcXVldWUpKSB7CisJCQkJLyogR2V0IHRoZSBzZWNvbmQgYnVmZmVyLiAqLworCQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmcHJ0ZC0+aW5fcXVldWUsCisJCQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsCisJCQkJCQkJbGlzdCk7CisJCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKworCQkJCS8qIEFkZCB0aGUgc2Vjb25kIERTUCBmcmFtZSBpbmZvIGhlYWRlci4KKwkJCQkgKiBIZWFkZXIgZm9ybWF0OgorCQkJCSAqIEJpdHMgMC0xOiBGcmFtZSB0eXBlCisJCQkJICogQml0cyAyLTM6IEZyYW1lIHJhdGUKKwkJCQkgKi8KKwkJCQkqdm9jX3BrdCA9ICgocHJ0ZC0+cmF0ZV90eXBlICYgMHgwRikgPDwgMikgfAorCQkJCShidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYgMHgwMyk7CisJCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKKworCQkJCXBrdF9sZW4gPSBwa3RfbGVuICsgYnVmX25vZGUtPmZyYW1lLnBrdGxlbiArCisJCQkJCSAgIERTUF9GUkFNRV9IRFJfTEVOOworCisJCQkJbWVtY3B5KHZvY19wa3QsCisJCQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7CisKKwkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKKwkJCQkJICAgICAgJnBydGQtPmZyZWVfaW5fcXVldWUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBPbmx5IDEwbXMgd29ydGggb2YgZGF0YSBpcyBhdmFpbGFibGUsIHNpZ25hbAorCQkJCSAqIGVyYXN1cmUgZnJhbWUuCisJCQkJICovCisJCQkJKnZvY19wa3QgPSAoKHBydGQtPnJhdGVfdHlwZSAmIDB4MEYpIDw8IDIpIHwKKwkJCQkJICAgIChNVlNfRzcxMUFfRVJBU1VSRSAmIDB4MDMpOworCisJCQkJcGt0X2xlbiA9IHBrdF9sZW4gKyBEU1BfRlJBTUVfSERSX0xFTjsKKwkJCQlwcl9kZWJ1ZygiJXMsIE9ubHkgMTBtcyByZWFkLCBlcmFzZSAybmQgZnJhbWVcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQl9CisJCQkqKCh1aW50MzJfdCAqKXZvY19hZGRyKSA9IHBrdF9sZW47CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQkqKCh1aW50MzJfdCAqKXZvY19wa3QpID0gYnVmX25vZGUtPmZyYW1lLnBrdGxlbjsKKwkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKwkJCW1lbWNweSh2b2NfcGt0LAorCQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKKwkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7CisJCX0KKwkJfQorCQlwcl9kZWJ1ZygiJXM6IGZyYW1lLnBrdGxlbj0lZFxuIiwgX19mdW5jX18sCisJCQkgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7CisKKwkJaWYgKHBydGQtPm1vZGUgPT0gTU9ERV9QQ00pCisJCQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyArPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOworCQllbHNlCisJCQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyArPSBwcnRkLT5wY21fY291bnQ7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKKwl9IGVsc2UgeworCQkqKCh1aW50MzJfdCAqKXZvY19wa3QpID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCXByX2Vycl9yYXRlbGltaXRlZCgiREwgZGF0YSBub3QgYXZhaWxhYmxlXG4iKTsKKwl9CisJd2FrZV91cCgmcHJ0ZC0+aW5fd2FpdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCisJLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAorCS5tYXNrID0gMCwKK307CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlwcnRkLT5wbGF5X3NhbXBfcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7CisJcHJ0ZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyA9IDA7CisJcHJ0ZC0+cGNtX3BsYXliYWNrX2J1Zl9wb3MgPSAwOworCXBydGQtPnBsYXliYWNrX3ByZXBhcmUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXBydGQtPmNhcF9zYW1wX3JhdGUgPSBydW50aW1lLT5yYXRlOworCXBydGQtPnBjbV9jYXB0dXJlX3NpemUgID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKwlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID0gMDsKKwlwcnRkLT5wY21fY2FwdHVyZV9idWZfcG9zID0gMDsKKwlwcnRkLT5jYXB0dXJlX3ByZXBhcmUgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCXByX2RlYnVnKCIlczogVHJpZ2dlciBzdGFydFxuIiwgX19mdW5jX18pOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJcHJ0ZC0+Y2FwdHVyZV9zdGFydCA9IDE7CisJCWVsc2UKKwkJCXBydGQtPnBsYXliYWNrX3N0YXJ0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQkJcHJ0ZC0+cGxheWJhY2tfc3RhcnQgPSAwOworCQllbHNlCisJCQlwcnRkLT5jYXB0dXJlX3N0YXJ0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9ICZ2b2lwX2luZm87CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXMsIFZvSVBcbiIsIF9fZnVuY19fKTsKKwltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKworCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZTsKKworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCisJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZGVidWcoInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZGVidWcoInNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlwcnRkLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJZWxzZQorCQlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKKwlzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKworCWludCBjb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOworCisJcHJfZGVidWcoIiVzOiBjb3VudCA9ICVkLCBmcmFtZXM9JWRcbiIsIF9fZnVuY19fLCBjb3VudCwgKGludClmcmFtZXMpOworCisJaWYgKHBydGQtPnZvaXBfcmVzZXQpIHsKKwkJcHJfZGVidWcoIiVzOiBSRVNFVCBldmVudCBoYXBwZW5lZCBkdXJpbmcgVm9JUFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwcnRkLT5pbl93YWl0LAorCQkJCSghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSkgfHwKKwkJCQlwcnRkLT5zdGF0ZSA9PSBWT0lQX1NUT1BQRUQpLAorCQkJCTEgKiBIWik7CisJaWYgKHBydGQtPnZvaXBfcmVzZXQpIHsKKwkJcHJfZGVidWcoIiVzOiBSRVNFVCBldmVudCBoYXBwZW5lZCBkdXJpbmcgVm9JUFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVORVRSRVNFVDsKKwl9CisKKwlpZiAocmV0ID4gMCkgeworCQlpZiAoY291bnQgPD0gVk9JUF9NQVhfVk9DX1BLVF9TSVpFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlidWZfbm9kZSA9CisJCQkJbGlzdF9maXJzdF9lbnRyeSgmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSwKKwkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKKwkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCWlmIChwcnRkLT5tb2RlID09IE1PREVfUENNKSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0LAorCQkJCQkJCWJ1ZiwgY291bnQpOworCQkJCWJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4gPSBjb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5mcmFtZSwKKwkJCQkJCQlidWYsIGNvdW50KTsKKwkJCQlpZiAoYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA+PSBjb3VudCkKKwkJCQkJYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA9IGNvdW50IC0KKwkJCQkJKHNpemVvZihidWZfbm9kZS0+ZnJhbWUuZnJtX2hkcikgKworCQkJCQkgc2l6ZW9mKGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4pKTsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+aW5fcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBXcml0ZSBjbnQgJWQgaXMgPiBWT0lQX01BWF9WT0NfUEtUX1NJWkVcbiIsCisJCQkJX19mdW5jX18sIGNvdW50KTsKKwkJCXJldCA9IC1FTk9NRU07CisJCX0KKworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJcHJfZXJyKCIlczogTm8gZnJlZSBETCBidWZmc1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHBsYXliYWNrIGNvcHkgd2FzIGludGVycnVwdGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwlyZXR1cm4gIHJldDsKK30KK3N0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCWludCBjaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1ZiwKKwkJCQkJCXNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKKwlpbnQgc2l6ZTsKKworCWNvdW50ID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGZyYW1lcyk7CisKKwlwcl9kZWJ1ZygiJXM6IGNvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisKKwlpZiAocHJ0ZC0+dm9pcF9yZXNldCkgeworCQlwcl9kZWJ1ZygiJXM6IFJFU0VUIGV2ZW50IGhhcHBlbmVkIGR1cmluZyBWb0lQXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5FVFJFU0VUOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHBydGQtPm91dF93YWl0LAorCQkJCSghbGlzdF9lbXB0eSgmcHJ0ZC0+b3V0X3F1ZXVlKSB8fAorCQkJCXBydGQtPnN0YXRlID09IFZPSVBfU1RPUFBFRCksCisJCQkJMSAqIEhaKTsKKworCWlmIChwcnRkLT52b2lwX3Jlc2V0KSB7CisJCXByX2RlYnVnKCIlczogUkVTRVQgZXZlbnQgaGFwcGVuZWQgZHVyaW5nIFZvSVBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTkVUUkVTRVQ7CisJfQorCisJaWYgKHJldCA+IDApIHsKKworCQlpZiAoY291bnQgPD0gVk9JUF9NQVhfVk9DX1BLVF9TSVpFKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7CisJCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPm91dF9xdWV1ZSwKKwkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF91bF9sb2NrLCBkc3BfZmxhZ3MpOworCQkJaWYgKHBydGQtPm1vZGUgPT0gTU9ERV9QQ00pIHsKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLAorCQkJCQkJICAgJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0LAorCQkJCQkJICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7CisJCQl9IGVsc2UgeworCQkJCXNpemUgPSBzaXplb2YoYnVmX25vZGUtPmZyYW1lLmZybV9oZHIpICsKKwkJCQkgICAgICAgc2l6ZW9mKGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4pICsKKwkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbjsKKworCQkJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsCisJCQkJCQkgICAmYnVmX25vZGUtPmZyYW1lLAorCQkJCQkJICAgc2l6ZSk7CisJCQl9CisJCQlpZiAocmV0KSB7CisJCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIHJldHVybmVkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF91bF9sb2NrLCBkc3BfZmxhZ3MpOworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCisJCQkJCQkmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBSZWFkIGNvdW50ICVkID4gVk9JUF9NQVhfVk9DX1BLVF9TSVpFXG4iLAorCQkJCV9fZnVuY19fLCBjb3VudCk7CisJCQlyZXQgPSAtRU5PTUVNOworCQl9CisKKworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCIlczogTm8gVUwgZGF0YSBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBSZWFkIHdhcyBpbnRlcnJ1cHRlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJfQorCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IG1zbV9wY21fY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGEsCisJIHNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmV0ID0gbXNtX3BjbV9wbGF5YmFja19jb3B5KHN1YnN0cmVhbSwgYSwgaHdvZmYsIGJ1ZiwgZnJhbWVzKTsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldCA9IG1zbV9wY21fY2FwdHVyZV9jb3B5KHN1YnN0cmVhbSwgYSwgaHdvZmYsIGJ1ZiwgZnJhbWVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBOVUxMOworCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpwX2RtYV9idWYsICpjX2RtYV9idWY7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwX3N1YnN0cmVhbSwgKmNfc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQ7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisKKwlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJcHJfZXJyKCJzdWJzdHJlYW0gaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwl3YWtlX3VwKCZwcnRkLT5vdXRfd2FpdCk7CisKKwltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlwcnRkLT5wbGF5YmFja19wcmVwYXJlID0gMDsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXBydGQtPmNhcHR1cmVfcHJlcGFyZSA9IDA7CisKKwlpZiAoIXBydGQtPnBsYXliYWNrX3ByZXBhcmUgJiYgIXBydGQtPmNhcHR1cmVfcHJlcGFyZSkgeworCQlpZiAocHJ0ZC0+c3RhdGUgPT0gVk9JUF9TVEFSVEVEKSB7CisJCQlwcnRkLT52b2lwX3Jlc2V0ID0gZmFsc2U7CisJCQlwcnRkLT5zdGF0ZSA9IFZPSVBfU1RPUFBFRDsKKwkJCXZvY19lbmRfdm9pY2VfY2FsbCgKKwkJCQkJdm9jX2dldF9zZXNzaW9uX2lkKFZPSVBfU0VTU0lPTl9OQU1FKSk7CisJCQl2b2NfcmVnaXN0ZXJfbXZzX2NiKE5VTEwsIE5VTEwsIE5VTEwsIHBydGQpOworCQl9CisJCS8qIHJlbGVhc2UgYWxsIGJ1ZmZlciAqLworCQkvKiByZWxlYXNlIGluX3F1ZXVlIGFuZCBmcmVlX2luX3F1ZXVlICovCisJCXByX2RlYnVnKCJyZWxlYXNlIGFsbCBidWZmZXJcbiIpOworCQlwX3N1YnN0cmVhbSA9IHBydGQtPnBsYXliYWNrX3N1YnN0cmVhbTsKKwkJaWYgKHBfc3Vic3RyZWFtID09IE5VTEwpIHsKKwkJCXByX2RlYnVnKCJwX3N1YnN0cmVhbSBpcyBOVUxMXG4iKTsKKwkJCWdvdG8gY2FwdDsKKwkJfQorCQlwX2RtYV9idWYgPSAmcF9zdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJCWlmIChwX2RtYV9idWYgPT0gTlVMTCkgeworCQkJcHJfZGVidWcoInBfZG1hX2J1ZiBpcyBOVUxMXG4iKTsKKwkJCWdvdG8gY2FwdDsKKwkJfQorCQlpZiAocF9kbWFfYnVmLT5hcmVhICE9IE5VTEwpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcnRkLT5pbl9xdWV1ZSkgeworCQkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsCisJCQkJCQlzdHJ1Y3Qgdm9pcF9idWZfbm9kZSwgbGlzdCk7CisJCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCX0KKwkJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcnRkLT5mcmVlX2luX3F1ZXVlKSB7CisJCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKKwkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlkbWFfZnJlZV9jb2hlcmVudChwX3N1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQkJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCwgcF9kbWFfYnVmLT5hcmVhLAorCQkJCXBfZG1hX2J1Zi0+YWRkcik7CisJCQlwX2RtYV9idWYtPmFyZWEgPSBOVUxMOworCQl9CisJCS8qIHJlbGVhc2Ugb3V0X3F1ZXVlIGFuZCBmcmVlX291dF9xdWV1ZSAqLworY2FwdDoJCWNfc3Vic3RyZWFtID0gcHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW07CisJCWlmIChjX3N1YnN0cmVhbSA9PSBOVUxMKSB7CisJCQlwcl9kZWJ1ZygiY19zdWJzdHJlYW0gaXMgTlVMTFxuIik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJY19kbWFfYnVmID0gJmNfc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCQlpZiAoY19zdWJzdHJlYW0gPT0gTlVMTCkgeworCQkJcHJfZGVidWcoImNfZG1hX2J1ZiBpcyBOVUxMLlxuIik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKGNfZG1hX2J1Zi0+YXJlYSAhPSBOVUxMKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmcHJ0ZC0+b3V0X3F1ZXVlKSB7CisJCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKKwkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQkJfQorCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJnBydGQtPmZyZWVfb3V0X3F1ZXVlKSB7CisJCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKKwkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7CisJCQlkbWFfZnJlZV9jb2hlcmVudChjX3N1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCisJCQkJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCwgY19kbWFfYnVmLT5hcmVhLAorCQkJCWNfZG1hX2J1Zi0+YWRkcik7CisJCQljX2RtYV9idWYtPmFyZWEgPSBOVUxMOworCQl9Citkb25lOgorCQlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CisJCXBydGQtPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CisJfQorCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaXBfY29uZmlnX3ZvY29kZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBtZWRpYV90eXBlID0gMDsKKwl1aW50MzJfdCByYXRlX3R5cGUgPSAwOworCXVpbnQzMl90IGV2cmNfbWluX3JhdGVfdHlwZSA9IDA7CisJdWludDMyX3QgZXZyY19tYXhfcmF0ZV90eXBlID0gMDsKKworCXByX2RlYnVnKCIlcygpOiBtb2RlPSVkLCBwbGF5YmFjayByYXRlPSVkLCBjYXB0dXJlIHJhdGU9JWRcbiIsCisJCSBfX2Z1bmNfXywgcHJ0ZC0+bW9kZSwgcHJ0ZC0+cGxheV9zYW1wX3JhdGUsCisJCSBwcnRkLT5jYXBfc2FtcF9yYXRlKTsKKworCWlmICgocnVudGltZS0+Zm9ybWF0ICE9IEZPUk1BVF9TMTZfTEUgJiYKKwkgICAgIHJ1bnRpbWUtPmZvcm1hdCAhPSBGT1JNQVRfU1BFQ0lBTCkgJiYKKwkgICAgKChwcnRkLT5tb2RlID09IE1PREVfQU1SKSB8fCAocHJ0ZC0+bW9kZSA9PSBNT0RFX0FNUl9XQikgfHwKKwkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV9JUzEyNykgfHwgKHBydGQtPm1vZGUgPT0gTU9ERV80R1ZfTkIpIHx8CisJICAgIChwcnRkLT5tb2RlID09IE1PREVfNEdWX1dCKSB8fCAocHJ0ZC0+bW9kZSA9PSBNT0RFXzRHVl9OVykgfHwKKwkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV9HNzExKSB8fCAocHJ0ZC0+bW9kZSA9PSBNT0RFX0c3MTFBKSkpIHsKKwkJcHJfZXJyKCIlcygpOiBtb2RlOiVkIGFuZCBmb3JtYXQ6JXUgYXJlIG5vdCBtYXRjaGVkXG4iLAorCQkJX19mdW5jX18sIHBydGQtPm1vZGUsICh1aW50MzJfdClydW50aW1lLT5mb3JtYXQpOworCisJCXJldCA9ICAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJ1bnRpbWUtPmZvcm1hdCAhPSBGT1JNQVRfUzE2X0xFICYmIChwcnRkLT5tb2RlID09IE1PREVfUENNKSkgeworCQlwcl9lcnIoIiVzKCk6IG1vZGU6JWQgYW5kIGZvcm1hdDoldSBhcmUgbm90IG1hdGNoZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcHJ0ZC0+bW9kZSwgcnVudGltZS0+Zm9ybWF0KTsKKworCQlyZXQgPSAgLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgocHJ0ZC0+bW9kZSA9PSBNT0RFX1BDTSkgfHwKKwkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV9BTVIpIHx8CisJICAgIChwcnRkLT5tb2RlID09IE1PREVfQU1SX1dCKSB8fAorCSAgICAocHJ0ZC0+bW9kZSA9PSBNT0RFX0c3MTEpIHx8CisJICAgIChwcnRkLT5tb2RlID09IE1PREVfRzcxMUEpKSB7CisJCXJldCA9IHZvaXBfZ2V0X3JhdGVfdHlwZShwcnRkLT5tb2RlLAorCQkJCQkgcHJ0ZC0+cmF0ZSwKKwkJCQkJICZyYXRlX3R5cGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlcygpOiBmYWlsIGF0IGdldHRpbmcgcmF0ZV90eXBlLCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcHJ0ZC0+cmF0ZV90eXBlID0gcmF0ZV90eXBlOworCQlwcl9kZWJ1ZygicmF0ZV90eXBlPSVkXG4iLCByYXRlX3R5cGUpOworCisJfSBlbHNlIGlmICgocHJ0ZC0+bW9kZSA9PSBNT0RFX0lTMTI3KSB8fAorCQkgICAocHJ0ZC0+bW9kZSA9PSBNT0RFXzRHVl9OQikgfHwKKwkJICAgKHBydGQtPm1vZGUgPT0gTU9ERV80R1ZfV0IpIHx8CisJCSAgIChwcnRkLT5tb2RlID09IE1PREVfNEdWX05XKSkgeworCQlyZXQgPSB2b2lwX2dldF9yYXRlX3R5cGUocHJ0ZC0+bW9kZSwKKwkJCQkJIHBydGQtPmV2cmNfbWluX3JhdGUsCisJCQkJCSAmZXZyY19taW5fcmF0ZV90eXBlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXMoKTogZmFpbCBhdCBnZXR0aW5nIG1pbiByYXRlLCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKGV2cmNfbWluX3JhdGVfdHlwZSA9PSBWT0NfMF9SQVRFKQorCQkJZXZyY19taW5fcmF0ZV90eXBlID0gVk9DXzhfUkFURTsKKworCQlyZXQgPSB2b2lwX2dldF9yYXRlX3R5cGUocHJ0ZC0+bW9kZSwKKwkJCQkJIHBydGQtPmV2cmNfbWF4X3JhdGUsCisJCQkJCSAmZXZyY19tYXhfcmF0ZV90eXBlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXMoKTogZmFpbCBhdCBnZXR0aW5nIG1heCByYXRlLCByZXQ9JWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKGV2cmNfbWF4X3JhdGVfdHlwZSA9PSBWT0NfMF9SQVRFKQorCQkJZXZyY19tYXhfcmF0ZV90eXBlID0gVk9DXzFfUkFURTsKKworCQlpZiAoZXZyY19tYXhfcmF0ZV90eXBlIDwgZXZyY19taW5fcmF0ZV90eXBlKSB7CisJCQlwcl9lcnIoIiVzKCk6IEludmFsaWQgRVZSQyBtaW4gbWF4IHJhdGVzOiAlZCwgJWRcbiIsCisJCQkJX19mdW5jX18sIGV2cmNfbWluX3JhdGVfdHlwZSwKKwkJCQlldnJjX21heF9yYXRlX3R5cGUpOworCisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisJCXByX2RlYnVnKCIlcygpOiBtaW4gcmF0ZT0lZCwgbWF4IHJhdGU9JWRcbiIsCisJCQkgIF9fZnVuY19fLCBldnJjX21pbl9yYXRlX3R5cGUsIGV2cmNfbWF4X3JhdGVfdHlwZSk7CisJfQorCXJldCA9IHZvaXBfZ2V0X21lZGlhX3R5cGUocHJ0ZC0+bW9kZSwKKwkJCQkgIHBydGQtPnJhdGVfdHlwZSwKKwkJCQkgIHBydGQtPnBsYXlfc2FtcF9yYXRlLAorCQkJCSAgJm1lZGlhX3R5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXMoKTogZmFpbCBhdCBnZXR0aW5nIG1lZGlhX3R5cGUsIHJldD0lZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJfZGVidWcoIiVzKCk6IG1lZGlhX3R5cGU9JWRcbiIsIF9fZnVuY19fLCBtZWRpYV90eXBlKTsKKworCWlmICgocHJ0ZC0+cGxheV9zYW1wX3JhdGUgPT0gODAwMCAmJiBwcnRkLT5jYXBfc2FtcF9yYXRlID09IDgwMDApIHx8CisJICAgIChwcnRkLT5wbGF5X3NhbXBfcmF0ZSA9PSAxNjAwMCAmJiBwcnRkLT5jYXBfc2FtcF9yYXRlID09IDE2MDAwKSB8fAorCSAgICAocHJ0ZC0+cGxheV9zYW1wX3JhdGUgPT0gMzIwMDAgJiYgcHJ0ZC0+Y2FwX3NhbXBfcmF0ZSA9PSAzMjAwMCkgfHwKKwkgICAgKHBydGQtPnBsYXlfc2FtcF9yYXRlID09IDQ4MDAwICYmIHBydGQtPmNhcF9zYW1wX3JhdGUgPT0gNDgwMDApKSB7CisJCXZvY19jb25maWdfdm9jb2RlcihtZWRpYV90eXBlLCByYXRlX3R5cGUsCisJCQkJICAgVlNTX05FVFdPUktfSURfVk9JUCwKKwkJCQkgICB2b2lwX2luZm8uZHR4X21vZGUsCisJCQkJICAgZXZyY19taW5fcmF0ZV90eXBlLAorCQkJCSAgIGV2cmNfbWF4X3JhdGVfdHlwZSk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIHJhdGUgcGxheWJhY2sgJWQsIGNhcHR1cmUgJWRcbiIsCisJCQkgX19mdW5jX18sIHBydGQtPnBsYXlfc2FtcF9yYXRlLAorCQkJIHBydGQtPmNhcF9zYW1wX3JhdGUpOworCisJCXJldCA9IC1FSU5WQUw7CisJfQorZG9uZToKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX3ByZXBhcmUoc3Vic3RyZWFtKTsKKwllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCXJldCA9IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN1YnN0cmVhbSk7CisKKwlpZiAocHJ0ZC0+cGxheWJhY2tfcHJlcGFyZSAmJiBwcnRkLT5jYXB0dXJlX3ByZXBhcmUKKwkgICAgJiYgKHBydGQtPnN0YXRlICE9IFZPSVBfU1RBUlRFRCkpIHsKKwkJcmV0ID0gdm9pcF9jb25maWdfdm9jb2RlcihzdWJzdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlcygpOiBmYWlsIGF0IGNvbmZpZ3VyaW5nIHZvY29kZXIgZm9yIHZvaXAsIHJldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBkb25lOworCQl9CisKKwkJLyogSW5pdGlhbGFpemluZyBjYiB2YXJpYWJsZXMgKi8KKwkJdm9jX3JlZ2lzdGVyX212c19jYih2b2lwX3Byb2Nlc3NfdWxfcGt0LAorCQkJCSAgICB2b2lwX3Byb2Nlc3NfZGxfcGt0LAorCQkJCSAgICB2b2lwX3Nzcl9jYl9mbiwgcHJ0ZCk7CisKKwkJcmV0ID0gdm9jX3N0YXJ0X3ZvaWNlX2NhbGwoCisJCQkJdm9jX2dldF9zZXNzaW9uX2lkKFZPSVBfU0VTU0lPTl9OQU1FKSk7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHZvY19zdGFydF92b2ljZV9jYWxsKCkgZmFpbGVkIGVyciAlZCIsCisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlwcnRkLT5zdGF0ZSA9IFZPSVBfU1RBUlRFRDsKKwl9Citkb25lOgorCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK21zbV9wY21fcGxheWJhY2tfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCB2b2lwX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHBydGQtPnBjbV9wbGF5YmFja19pcnFfcG9zID49IHBydGQtPnBjbV9zaXplKQorCQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAocHJ0ZC0+cGNtX3BsYXliYWNrX2lycV9wb3MpKTsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190Cittc21fcGNtX2NhcHR1cmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCB2b2lwX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHBydGQtPnBjbV9jYXB0dXJlX2lycV9wb3MgPj0gcHJ0ZC0+cGNtX2NhcHR1cmVfc2l6ZSkKKwkJcHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAocHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcykpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXNuZF9wY21fdWZyYW1lc190IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcmV0ID0gbXNtX3BjbV9wbGF5YmFja19wb2ludGVyKHN1YnN0cmVhbSk7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfcG9pbnRlcihzdWJzdHJlYW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWRtYV9tbWFwX2NvaGVyZW50KHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2FkZHIsCisJCQkJICAgICBydW50aW1lLT5kbWFfYnl0ZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwlzdHJ1Y3Qgdm9pcF9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCWludCBpID0gMCwgb2Zmc2V0ID0gMDsKKworCXByX2RlYnVnKCIlczogdm9pcFxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJZG1hX2J1Zi0+ZGV2LmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CisJZG1hX2J1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCWRtYV9idWYtPmFyZWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKKwkJCXJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgsCisJCQkmZG1hX2J1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkbWFfYnVmLT5hcmVhKSB7CisJCXByX2VycigiJXM6TVNNIFZPSVAgZG1hX2FsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hX2J1Zi0+Ynl0ZXMgPSBydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4OworCW1lbXNldChkbWFfYnVmLT5hcmVhLCAwLCBydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4KTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWZvciAoaSA9IDA7IGkgPCBWT0lQX01BWF9RX0xFTjsgaSsrKSB7CisJCQlidWZfbm9kZSA9ICh2b2lkICopZG1hX2J1Zi0+YXJlYSArIG9mZnNldDsKKworCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCisJCQkJCSZ2b2lwX2luZm8uZnJlZV9pbl9xdWV1ZSk7CisJCQlvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IHZvaXBfYnVmX25vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IFZPSVBfTUFYX1FfTEVOOyBpKyspIHsKKwkJCWJ1Zl9ub2RlID0gKHZvaWQgKikgZG1hX2J1Zi0+YXJlYSArIG9mZnNldDsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAorCQkJCQkmdm9pcF9pbmZvLmZyZWVfb3V0X3F1ZXVlKTsKKwkJCW9mZnNldCA9IG9mZnNldCArIHNpemVvZihzdHJ1Y3Qgdm9pcF9idWZfbm9kZSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9pcF9tb2RlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCW11dGV4X2xvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdm9pcF9pbmZvLm1vZGU7CisKKwltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV92b2lwX21vZGVfY29uZmlnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJdm9pcF9pbmZvLm1vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXByX2RlYnVnKCIlczogbW9kZT0lZFxuIiwgX19mdW5jX18sIHZvaXBfaW5mby5tb2RlKTsKKworCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3ZvaXBfcmF0ZV9jb25maWdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJaWYgKHZvaXBfaW5mby5yYXRlICE9IHJhdGUpIHsKKwkJdm9pcF9pbmZvLnJhdGUgPSByYXRlOworCQlwcl9kZWJ1ZygiJXM6IHJhdGU9JWRcbiIsIF9fZnVuY19fLCB2b2lwX2luZm8ucmF0ZSk7CisKKwkJaWYgKHZvaXBfaW5mby5zdGF0ZSA9PSBWT0lQX1NUQVJURUQgJiYKKwkJICAgKHZvaXBfaW5mby5tb2RlID09IE1PREVfQU1SIHx8CisJCSAgICB2b2lwX2luZm8ubW9kZSA9PSBNT0RFX0FNUl9XQikpIHsKKwkJCXJldCA9IHZvaXBfY29uZmlnX3ZvY29kZXIoCisJCQkJCXZvaXBfaW5mby5jYXB0dXJlX3N1YnN0cmVhbSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJfZXJyKCIlczpGYWlsZWQgdG8gY29uZmlndXJlIHZvY29kZXIsIHJldD0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCXJldCA9IHZvY191cGRhdGVfYW1yX3ZvY29kZXJfcmF0ZSgKKwkJCQkJdm9jX2dldF9zZXNzaW9uX2lkKFZPSVBfU0VTU0lPTl9OQU1FKSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJfZXJyKCIlczpGYWlsZWQgdG8gdXBkYXRlIEFNUiByYXRlLCByZXQ9JWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJfQorCQl9CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtc21fdm9pcF9ldnJjX21pbl9tYXhfcmF0ZV9jb25maWdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2lwX2luZm8uZXZyY19taW5fcmF0ZTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHZvaXBfaW5mby5ldnJjX21heF9yYXRlOworCisJbXV0ZXhfdW5sb2NrKCZ2b2lwX2luZm8ubG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fdm9pcF9ldnJjX21pbl9tYXhfcmF0ZV9jb25maWdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJdm9pcF9pbmZvLmV2cmNfbWluX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl2b2lwX2luZm8uZXZyY19tYXhfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCisJcHJfZGVidWcoIiVzKCk6IGV2cmNfbWluX3JhdGU9JWQsZXZyY19tYXhfcmF0ZT0lZFxuIiwgX19mdW5jX18sCisJCSAgdm9pcF9pbmZvLmV2cmNfbWluX3JhdGUsIHZvaXBfaW5mby5ldnJjX21heF9yYXRlKTsKKworCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9pcF9nZXRfcmF0ZV90eXBlKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IHJhdGUsCisJCQkJIHVpbnQzMl90ICpyYXRlX3R5cGUpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1PREVfQU1SOiB7CisJCXN3aXRjaCAocmF0ZSkgeworCQljYXNlIDQ3NTA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNDc1MDsKKwkJCWJyZWFrOworCQljYXNlIDUxNTA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNTE1MDsKKwkJCWJyZWFrOworCQljYXNlIDU5MDA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNTkwMDsKKwkJCWJyZWFrOworCQljYXNlIDY3MDA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNjcwMDsKKwkJCWJyZWFrOworCQljYXNlIDc0MDA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNzQwMDsKKwkJCWJyZWFrOworCQljYXNlIDc5NTA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfNzk1MDsKKwkJCWJyZWFrOworCQljYXNlIDEwMjAwOgorCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzEwMjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTIyMDA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfMTIyMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2Vycigid3JvbmcgcmF0ZSBmb3IgQU1SIE5CLlxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTU9ERV9BTVJfV0I6IHsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgNjYwMDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV82NjAwIC0gQU1SX1JBVEVfNjYwMDsKKwkJCWJyZWFrOworCQljYXNlIDg4NTA6CisJCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfODg1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMjY1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xMjY1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxNDI1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xNDI1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxNTg1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xNTg1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxODI1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xODI1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxOTg1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xOTg1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAyMzA1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8yMzA1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJY2FzZSAyMzg1MDoKKwkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8yMzg1MCAtIEFNUl9SQVRFXzY2MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2Vycigid3JvbmcgcmF0ZSBmb3IgQU1SX1dCLlxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTU9ERV9QQ006IHsKKwkJKnJhdGVfdHlwZSA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIE1PREVfSVMxMjc6CisJY2FzZSBNT0RFXzRHVl9OQjoKKwljYXNlIE1PREVfNEdWX1dCOiB7CisJCXN3aXRjaCAocmF0ZSkgeworCQljYXNlIFZPQ18wX1JBVEU6CisJCWNhc2UgVk9DXzhfUkFURToKKwkJY2FzZSBWT0NfNF9SQVRFOgorCQljYXNlIFZPQ18yX1JBVEU6CisJCWNhc2UgVk9DXzFfUkFURToKKwkJCSpyYXRlX3R5cGUgPSByYXRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIndyb25nIHJhdGUgZm9yIElTMTI3LzRHVl9OQi9XQi5cbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIE1PREVfNEdWX05XOiB7CisJCXN3aXRjaCAocmF0ZSkgeworCQljYXNlIFZPQ18wX1JBVEU6CisJCWNhc2UgVk9DXzhfUkFURToKKwkJY2FzZSBWT0NfNF9SQVRFOgorCQljYXNlIFZPQ18yX1JBVEU6CisJCWNhc2UgVk9DXzFfUkFURToKKwkJY2FzZSBWT0NfOF9SQVRFX05DOgorCQkJKnJhdGVfdHlwZSA9IHJhdGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2Vycigid3JvbmcgcmF0ZSBmb3IgNEdWX05XLlxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTU9ERV9HNzExOgorCWNhc2UgTU9ERV9HNzExQToKKwkJKnJhdGVfdHlwZSA9IHJhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycigid3JvbmcgbW9kZSB0eXBlLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlcywgbW9kZT0lZCwgcmF0ZT0ldSwgcmF0ZV90eXBlPSVkXG4iLAorCQlfX2Z1bmNfXywgbW9kZSwgcmF0ZSwgKnJhdGVfdHlwZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2lwX2dldF9tZWRpYV90eXBlKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IHJhdGVfdHlwZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2FtcF9yYXRlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqbWVkaWFfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogbW9kZT0lZCwgc2FtcF9yYXRlPSVkXG4iLCBfX2Z1bmNfXywKKwkJbW9kZSwgc2FtcF9yYXRlKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1PREVfQU1SOgorCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9BTVJfTkJfTU9ERU07CisJCWJyZWFrOworCWNhc2UgTU9ERV9BTVJfV0I6CisJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX0FNUl9XQl9NT0RFTTsKKwkJYnJlYWs7CisJY2FzZSBNT0RFX1BDTToKKwkJaWYgKHNhbXBfcmF0ZSA9PSA4MDAwKQorCQkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfUENNXzhfS0haOworCQllbHNlIGlmIChzYW1wX3JhdGUgPT0gMTYwMDApCisJCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9QQ01fMTZfS0haOworCQllbHNlIGlmIChzYW1wX3JhdGUgPT0gMzIwMDApCisJCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9QQ01fMzJfS0haOworCQllbHNlCisJCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9QQ01fNDhfS0haOworCQlicmVhazsKKwljYXNlIE1PREVfSVMxMjc6IC8qIEVWUkMtQSAqLworCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9FVlJDX01PREVNOworCQlicmVhazsKKwljYXNlIE1PREVfNEdWX05COiAvKiBFVlJDLUIgKi8KKwkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfNEdWX05CX01PREVNOworCQlicmVhazsKKwljYXNlIE1PREVfNEdWX1dCOiAvKiBFVlJDLVdCICovCisJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEXzRHVl9XQl9NT0RFTTsKKwkJYnJlYWs7CisJY2FzZSBNT0RFXzRHVl9OVzogLyogRVZSQy1OVyAqLworCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF80R1ZfTldfTU9ERU07CisJCWJyZWFrOworCWNhc2UgTU9ERV9HNzExOgorCWNhc2UgTU9ERV9HNzExQToKKwkJaWYgKHJhdGVfdHlwZSA9PSBNVlNfRzcxMUFfTU9ERV9NVUxBVykKKwkJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX0c3MTFfTVVMQVc7CisJCWVsc2UKKwkJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX0c3MTFfQUxBVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiBpbnB1dCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogbWVkaWFfdHlwZSBpcyAweCV4XG4iLCBfX2Z1bmNfXywgKm1lZGlhX3R5cGUpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0geworCS5vcGVuICAgICAgICAgICA9IG1zbV9wY21fb3BlbiwKKwkuY29weQkJPSBtc21fcGNtX2NvcHksCisJLmh3X3BhcmFtcwk9IG1zbV9wY21faHdfcGFyYW1zLAorCS5jbG9zZSAgICAgICAgICA9IG1zbV9wY21fY2xvc2UsCisJLnByZXBhcmUgICAgICAgID0gbXNtX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyICAgICAgICA9IG1zbV9wY21fdHJpZ2dlciwKKwkucG9pbnRlciAgICAgICAgPSBtc21fcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gbXNtX3BjbV9tbWFwLAorfTsKKworc3RhdGljIGludCBtc21fYXNvY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCJtc21fYXNvY19wY21fbmV3XG4iKTsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZtc21fcGNtX29wcywKKwkucGNtX25ldwk9IG1zbV9hc29jX3BjbV9uZXcsCisJLnByb2JlCQk9IG1zbV9wY21fdm9pcF9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbXNtX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYzsKKworCWlmICghaXNfdm9jX2luaXRpYWxpemVkKCkpIHsKKwkJcHJfZGVidWcoIiVzOiB2b2ljZSBtb2R1bGUgbm90IGluaXRpYWxpemVkIHlldCwgZGVmZXJyaW5nIHByb2JlKClcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisKKwkJcmMgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSB2b2NfYWxsb2NfY2FsX3NoYXJlZF9tZW1vcnkoKTsKKwlpZiAocmMgPT0gLUVQUk9CRV9ERUZFUikgeworCQlwcl9kZWJ1ZygiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjYWxpYnJhdGlvbiBkZWZlcnJlZCAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmMpOworCisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY2FsaWJyYXRpb24gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwl9CisKKwlyYyA9IHZvY19hbGxvY192b2lwX3NoYXJlZF9tZW1vcnkoKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGVycm9yIGFsbG9jYXRpbmcgc2hhcmVkIG1lbSBlcnIgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCX0KKworCisJcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKKwkJCQkgICAgICAgJm1zbV9zb2NfcGxhdGZvcm0pOworCitkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fcGNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3ZvaXBfZHRfbWF0Y2hbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tdm9pcC1kc3AifSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV92b2lwX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtLXZvaXAtZHNwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV92b2lwX2R0X21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKKwkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwltZW1zZXQoJnZvaXBfaW5mbywgMCwgc2l6ZW9mKHZvaXBfaW5mbykpOworCXZvaXBfaW5mby5tb2RlID0gTU9ERV9QQ007CisJbXV0ZXhfaW5pdCgmdm9pcF9pbmZvLmxvY2spOworCisJc3Bpbl9sb2NrX2luaXQoJnZvaXBfaW5mby5kc3BfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnZvaXBfaW5mby5kc3BfdWxfbG9jayk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2b2lwX2luZm8ub3V0X3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZvaXBfaW5mby5pbl93YWl0KTsKKworCUlOSVRfTElTVF9IRUFEKCZ2b2lwX2luZm8uaW5fcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZ2b2lwX2luZm8uZnJlZV9pbl9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnZvaXBfaW5mby5vdXRfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZ2b2lwX2luZm8uZnJlZV9vdXRfcXVldWUpOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXNtX3NvY19wbGF0Zm9ybV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1zbV9zb2NfcGxhdGZvcm1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDTSBtb2R1bGUgcGxhdGZvcm0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXF0aS1wcC1jb25maWcuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcXRpLXBwLWNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzYyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXF0aS1wcC1jb25maWcuYwpAQCAtMCwwICsxLDEwMzUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJtc20tcXRpLXBwLWNvbmZpZy5oIgorI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgorCisvKiBFUVVBTElaRVIgKi8KKy8qIEVxdWFsIHRvIEZyb250ZW5kIGFmdGVyIGxhc3Qgb2YgdGhlIE1VTFRJTUVESUEgU0VTU0lPTlMgKi8KKyNkZWZpbmUgTUFYX0VRX1NFU1NJT05TCQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFCisKK2VudW0geworCUVRX0JBTkQxID0gMCwKKwlFUV9CQU5EMiwKKwlFUV9CQU5EMywKKwlFUV9CQU5ENCwKKwlFUV9CQU5ENSwKKwlFUV9CQU5ENiwKKwlFUV9CQU5ENywKKwlFUV9CQU5EOCwKKwlFUV9CQU5EOSwKKwlFUV9CQU5EMTAsCisJRVFfQkFORDExLAorCUVRX0JBTkQxMiwKKwlFUV9CQU5EX01BWCwKK307CisKK3N0cnVjdCBtc21fYXVkaW9fZXFfYmFuZCB7CisJdWludDE2X3QgICAgIGJhbmRfaWR4OyAvKiBUaGUgYmFuZCBpbmRleCwgMCAuLiAxMSAqLworCXVpbnQzMl90ICAgICBmaWx0ZXJfdHlwZTsgLyogRmlsdGVyIGJhbmQgdHlwZSAqLworCXVpbnQzMl90ICAgICBjZW50ZXJfZnJlcV9oejsgLyogRmlsdGVyIGJhbmQgY2VudGVyIGZyZXF1ZW5jeSAqLworCXVpbnQzMl90ICAgICBmaWx0ZXJfZ2FpbjsgLyogRmlsdGVyIGJhbmQgaW5pdGlhbCBnYWluIChkQikgKi8KKwkJCS8qIFJhbmdlIGlzICsxMiBkQiB0byAtMTIgZEIgd2l0aCAxZEIgaW5jcmVtZW50cy4gKi8KKwl1aW50MzJfdCAgICAgcV9mYWN0b3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbXNtX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcgeworCXVpbnQzMl90CWVuYWJsZTsgLyogTnVtYmVyIG9mIGNvbnNlcXV0aXZlIGJhbmRzIHNwZWNpZmllZCAqLworCXVpbnQzMl90CW51bV9iYW5kczsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2VxX2JhbmQJZXFfYmFuZHNbRVFfQkFORF9NQVhdOworfSBfX3BhY2tlZDsKKworLyogQXVkaW8gU3BoZXJlIGRhdGEgc3RydWN0dXJlcyAqLworc3RydWN0IG1zbV9hdWRpb19wcF9hc3BoZXJlX3N0YXRlX3MgeworCXVpbnQzMl90IGVuYWJsZWQ7CisJdWludDMyX3Qgc3RyZW5ndGg7CisJdWludDMyX3QgbW9kZTsKKwl1aW50MzJfdCB2ZXJzaW9uOworCWludCAgcG9ydF9pZFtBRkVfTUFYX1BPUlRTXTsKKwlpbnQgIGNvcHBfaWR4W0FGRV9NQVhfUE9SVFNdOworCWJvb2wgIGluaXRpYWxpemVkOworCXVpbnQzMl90IGVuYWJsZWRfcHJldjsKKwl1aW50MzJfdCBzdHJlbmd0aF9wcmV2OworfTsKKworc3RhdGljIHN0cnVjdCBtc21fYXVkaW9fcHBfYXNwaGVyZV9zdGF0ZV9zIGFzcGhlcmVfc3RhdGU7CisKK3N0cnVjdCBtc21fYXVkaW9fZXFfc3RyZWFtX2NvbmZpZwllcV9kYXRhW01BWF9FUV9TRVNTSU9OU107CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRlX2hmcF92b2xfY29udHJvbDsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoaGZwX3J4X3ZvbF9nYWluLCAwLAorCQkJCUlOVF9SWF9WT0xfTUFYX1NURVBTKTsKKworc3RhdGljIGludCBtc21fcm91dGVfcHJpX2F1eHBjbV9sYl92b2xfY3RybDsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocHJpX2F1eHBjbV9sYl92b2xfZ2FpbiwgMCwKKwkJCQlJTlRfUlhfVk9MX01BWF9TVEVQUyk7CisKK3N0YXRpYyBpbnQgbXNtX3JvdXRlX3NlY19hdXhwY21fbGJfdm9sX2N0cmw7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKHNlY19hdXhwY21fbGJfdm9sX2dhaW4sIDAsCisJCQkJSU5UX1JYX1ZPTF9NQVhfU1RFUFMpOworCitzdGF0aWMgdm9pZCBtc21fcXRpX3BwX3NlbmRfZXFfdmFsdWVzXyhpbnQgZXFfaWR4KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgZmVfZGFpOworCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gTlVMTDsKKworCW1zbV9wY21fcm91dGluZ19nZXRfZmVkYWlfaW5mbyhlcV9pZHgsIFNFU1NJT05fVFlQRV9SWCwgJmZlX2RhaSk7CisJYWMgPSBxNmFzbV9nZXRfYXVkaW9fY2xpZW50KGZlX2RhaS5zdHJtX2lkKTsKKworCWlmIChhYyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgYXVkaW8gY2xpZW50IGZvciBzZXNzaW9uOiAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIGZlX2RhaS5zdHJtX2lkKTsKKwkJZ290byBkb25lOworCX0KKworCXJlc3VsdCA9IHE2YXNtX2VxdWFsaXplcihhYywgJmVxX2RhdGFbZXFfaWR4XSk7CisKKwlpZiAocmVzdWx0IDwgMCkKKwkJcHJfZXJyKCIlczogQ2FsbCB0byBBU00gZXF1YWxpemVyIGZhaWxlZCwgcmV0dXJuZWQgPSAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHJlc3VsdCk7Citkb25lOgorCXJldHVybjsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9lcV9lbmFibGVfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGVxX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCisJaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykpCisJCXJldHVybiAtRUlOVkFMOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBlcV9kYXRhW2VxX2lkeF0uZW5hYmxlOworCisJcHJfZGVidWcoIiVzOiBFUSAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKKwkJZXFfaWR4LCBlcV9kYXRhW2VxX2lkeF0uZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX3B1dF9lcV9lbmFibGVfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IGVxX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCisJCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOworCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykpCisJCXJldHVybiAtRUlOVkFMOworCXByX2RlYnVnKCIlczogRVEgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCisJCWVxX2lkeCwgdmFsdWUpOworCWVxX2RhdGFbZXFfaWR4XS5lbmFibGUgPSB2YWx1ZTsKKwltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7CisJbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlc18oZXFfaWR4KTsKKwltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlcigKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBlcV9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKworCWlmICgoZXFfaWR4IDwgMCkgfHwgKGVxX2lkeCA+PSBNQVhfRVFfU0VTU0lPTlMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVxX2RhdGFbZXFfaWR4XS5udW1fYmFuZHM7CisKKwlwcl9kZWJ1ZygiJXM6IEVRICMlZCBiYW5kcyAlZFxuIiwgX19mdW5jX18sCisJCWVxX2lkeCwgZXFfZGF0YVtlcV9pZHhdLm51bV9iYW5kcyk7CisJcmV0dXJuIGVxX2RhdGFbZXFfaWR4XS5udW1fYmFuZHM7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlcigKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBlcV9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQorCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmICgoZXFfaWR4IDwgMCkgfHwgKGVxX2lkeCA+PSBNQVhfRVFfU0VTU0lPTlMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCIlczogRVEgIyVkIGJhbmRzICVkXG4iLCBfX2Z1bmNfXywKKwkJZXFfaWR4LCB2YWx1ZSk7CisJZXFfZGF0YVtlcV9pZHhdLm51bV9iYW5kcyA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgZXFfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKworCWlmICgoZXFfaWR4IDwgMCkgfHwgKGVxX2lkeCA+PSBNQVhfRVFfU0VTU0lPTlMpIHx8CisJICAgIChiYW5kX2lkeCA8IEVRX0JBTkQxKSB8fCAoYmFuZF9pZHggPj0gRVFfQkFORF9NQVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uYmFuZF9pZHg7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5maWx0ZXJfdHlwZTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9CisJCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmNlbnRlcl9mcmVxX2h6OworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0KKwkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uZmlsdGVyX2dhaW47CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0gPQorCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5xX2ZhY3RvcjsKKworCXByX2RlYnVnKCIlczogYmFuZF9pZHggPSAlZFxuIiwgX19mdW5jX18sCisJCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmJhbmRfaWR4KTsKKwlwcl9kZWJ1ZygiJXM6IGZpbHRlcl90eXBlID0gJWRcbiIsIF9fZnVuY19fLAorCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5maWx0ZXJfdHlwZSk7CisJcHJfZGVidWcoIiVzOiBjZW50ZXJfZnJlcV9oeiA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uY2VudGVyX2ZyZXFfaHopOworCXByX2RlYnVnKCIlczogZmlsdGVyX2dhaW4gPSAlZFxuIiwgX19mdW5jX18sCisJCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmZpbHRlcl9nYWluKTsKKwlwcl9kZWJ1ZygiJXM6IHFfZmFjdG9yID0gJWRcbiIsIF9fZnVuY19fLAorCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5xX2ZhY3Rvcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgZXFfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7CisJaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKKwkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKKworCWlmICgoZXFfaWR4IDwgMCkgfHwgKGVxX2lkeCA+PSBNQVhfRVFfU0VTU0lPTlMpIHx8CisJICAgIChiYW5kX2lkeCA8IEVRX0JBTkQxKSB8fCAoYmFuZF9pZHggPj0gRVFfQkFORF9NQVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uYmFuZF9pZHggPQorCQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmZpbHRlcl90eXBlID0KKwkJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5jZW50ZXJfZnJlcV9oeiA9CisJCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOworCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uZmlsdGVyX2dhaW4gPQorCQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXTsKKwllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLnFfZmFjdG9yID0KKwkJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF07CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUVRJX1BQCit2b2lkIG1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXMoaW50IGZlZGFpX2lkKQoreworCWlmIChlcV9kYXRhW2ZlZGFpX2lkXS5lbmFibGUpCisJCW1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXNfKGZlZGFpX2lkKTsKK30KKworLyogQ1VTVE9NIE1JWElORyAqLworaW50IG1zbV9xdGlfcHBfc2VuZF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19jbWQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkJCXVuc2lnbmVkIGludCBzZXNzaW9uX2lkLAorCQkJCQkJdWludDE2X3Qgb3BfRkxfaXBfRkxfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRkxfaXBfRlJfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRlJfaXBfRkxfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRlJfaXBfRlJfd2VpZ2h0KQoreworCWNoYXIgKnBhcmFtc192YWx1ZTsKKwlpbnQgKnVwZGF0ZV9wYXJhbXNfdmFsdWUzMiwgcmMgPSAwOworCWludDE2X3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNiA9IDA7CisJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IENVU1RPTV9TVEVSRU9fUEFZTE9BRF9TSVpFICogc2l6ZW9mKHVpbnQzMl90KTsKKwl1aW50MzJfdCBhdmFpbF9sZW5ndGggPSBwYXJhbXNfbGVuZ3RoOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkIC0gJWQsIHNlc3Npb24gaWQgLSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsCisJCSBzZXNzaW9uX2lkKTsKKwlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKSB7CisJCXByX2VycigiJXMsIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl1cGRhdGVfcGFyYW1zX3ZhbHVlMzIgPSAoaW50ICopcGFyYW1zX3ZhbHVlOworCWlmIChhdmFpbF9sZW5ndGggPCAyICogc2l6ZW9mKHVpbnQzMl90KSkKKwkJZ290byBza2lwX3NlbmRfY21kOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMzIrKyA9IE1UTVhfTU9EVUxFX0lEX0RFRkFVTFRfQ0hNSVhFUjsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTMyKysgPSBERUZBVUxUX0NITUlYRVJfUEFSQU1fSURfQ09FRkY7CisJYXZhaWxfbGVuZ3RoID0gYXZhaWxfbGVuZ3RoIC0gKDIgKiBzaXplb2YodWludDMyX3QpKTsKKworCXVwZGF0ZV9wYXJhbXNfdmFsdWUxNiA9IChpbnQxNl90ICopdXBkYXRlX3BhcmFtc192YWx1ZTMyOworCWlmIChhdmFpbF9sZW5ndGggPCAxMCAqIHNpemVvZih1aW50MTZfdCkpCisJCWdvdG8gc2tpcF9zZW5kX2NtZDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBDVVNUT01fU1RFUkVPX0NNRF9QQVJBTV9TSVpFOworCS8qZm9yIGFsaWdubWVudCBvbmx5Ki8KKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSAwOworCS8qaW5kZXggaXMgMzItYml0IHBhcmFtIGluIGxpdHRsZSBlbmRpYW4qLworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fSU5ERVhfUEFSQU07CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gMDsKKwkvKmZvciBzdGVyZW8gbWl4aW5nIG51bSBvdXQgY2gqLworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fTlVNX09VVF9DSDsKKwkvKmZvciBzdGVyZW8gbWl4aW5nIG51bSBpbiBjaCovCisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19OVU1fSU5fQ0g7CisKKwkvKiBPdXQgY2ggbWFwIEZML0ZSKi8KKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GTDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GUjsKKworCS8qIEluIGNoIG1hcCBGTC9GUiovCisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRkw7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRlI7CisJYXZhaWxfbGVuZ3RoID0gYXZhaWxfbGVuZ3RoIC0gKDEwICogc2l6ZW9mKHVpbnQxNl90KSk7CisJLyogd2VpZ2h0aW5nIGNvZWZmaWNpZW50cyBhcyBuYW1lIHN1Z2dlc3RzLAorCSAqIG1peGluZyB3aWxsIGJlIGRvbmUgYWNjb3JkaW5nIHRvIHRoZXNlIGNvZWZmaWNpZW50cworCSAqLworCWlmIChhdmFpbF9sZW5ndGggPCA0ICogc2l6ZW9mKHVpbnQxNl90KSkKKwkJZ290byBza2lwX3NlbmRfY21kOworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZMX2lwX0ZMX3dlaWdodDsKKwkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBvcF9GTF9pcF9GUl93ZWlnaHQ7CisJKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gb3BfRlJfaXBfRkxfd2VpZ2h0OworCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZSX2lwX0ZSX3dlaWdodDsKKwlhdmFpbF9sZW5ndGggPSBhdmFpbF9sZW5ndGggLSAoNCAqIHNpemVvZih1aW50MTZfdCkpOworCWlmIChwYXJhbXNfbGVuZ3RoKSB7CisJCXJjID0gYWRtX3NldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlbyhwb3J0X2lkLAorCQkJCQkJICAgICBjb3BwX2lkeCwKKwkJCQkJCSAgICAgc2Vzc2lvbl9pZCwKKwkJCQkJCSAgICAgcGFyYW1zX3ZhbHVlLAorCQkJCQkJICAgICBwYXJhbXNfbGVuZ3RoKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIiVzOiBzZW5kIHBhcmFtcyBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCQlrZnJlZShwYXJhbXNfdmFsdWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwlyZXR1cm4gMDsKK3NraXBfc2VuZF9jbWQ6CisJCXByX2VycigiJXM6IGluc3VmZmljaWVudCBtZW1vcnksIHNlbmQgY21kIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKKwkJcmV0dXJuIC1FTk9NRU07Cit9CisjZW5kaWYgLyogQ09ORklHX1FUSV9QUCAqLworCisvKiBSTVMgKi8KK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfcm1zX3ZhbHVlX2NvbnRyb2woc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmMgPSAwOworCWludCBiZV9pZHggPSAwLCBjb3BwX2lkeDsKKwljaGFyICpwYXJhbV92YWx1ZTsKKwlpbnQgKnVwZGF0ZV9wYXJhbV92YWx1ZTsKKwl1aW50MzJfdCBwYXJhbV9sZW5ndGggPSBzaXplb2YodWludDMyX3QpOworCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0gUk1TX1BBWUxPQURfTEVOICogc2l6ZW9mKHVpbnQzMl90KTsKKwlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSBtc21fYmVkYWk7CisKKwlwYXJhbV92YWx1ZSA9IGt6YWxsb2MocGFyYW1fbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhcmFtX3ZhbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKKwlmb3IgKGJlX2lkeCA9IDA7IGJlX2lkeCA8IE1TTV9CQUNLRU5EX0RBSV9NQVg7IGJlX2lkeCsrKSB7CisJCW1zbV9wY21fcm91dGluZ19nZXRfYmVkYWlfaW5mbyhiZV9pZHgsICZtc21fYmVkYWkpOworCQlpZiAobXNtX2JlZGFpLnBvcnRfaWQgPT0gU0xJTUJVU18wX1RYKQorCQkJYnJlYWs7CisJfQorCWlmICgoYmVfaWR4ID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHx8ICFtc21fYmVkYWkuYWN0aXZlKSB7CisJCXByX2VycigiJXMsIGJhY2sgbm90IGFjdGl2ZSB0byBxdWVyeSBybXMgYmVfaWR4OiVkXG4iLAorCQkJX19mdW5jX18sIGJlX2lkeCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBnZXRfcm1zX3ZhbHVlX2VycjsKKwl9CisJY29wcF9pZHggPSBhZG1fZ2V0X2RlZmF1bHRfY29wcF9pZHgoU0xJTUJVU18wX1RYKTsKKwlpZiAoKGNvcHBfaWR4IDwgMCkgfHwgKGNvcHBfaWR4ID4gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9lcnIoIiVzLCBubyBhY3RpdmUgY29wcCB0byBxdWVyeSBybXMgY29wcF9pZHg6JWRcbiIsCisJCQlfX2Z1bmNfXywgY29wcF9pZHgpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZ2V0X3Jtc192YWx1ZV9lcnI7CisJfQorCXJjID0gYWRtX2dldF9wYXJhbXMoU0xJTUJVU18wX1RYLCBjb3BwX2lkeCwKKwkJCVJNU19NT0RVTEVJRF9BUFBJX1BBU1NUSFJVLAorCQkJUk1TX1BBUkFNX0ZJUlNUX1NBTVBMRSwKKwkJCXBhcmFtX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAorCQkJcGFyYW1fdmFsdWUpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBnZXRfcm1zX3ZhbHVlX2VycjsKKwl9CisJdXBkYXRlX3BhcmFtX3ZhbHVlID0gKGludCAqKXBhcmFtX3ZhbHVlOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXBkYXRlX3BhcmFtX3ZhbHVlWzBdOworCisJcHJfZGVidWcoIiVzOiBGUk9NIERTUCB2YWx1ZVswXSAweCV4XG4iLAorCQlfX2Z1bmNfXywgdXBkYXRlX3BhcmFtX3ZhbHVlWzBdKTsKK2dldF9ybXNfdmFsdWVfZXJyOgorCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKKwlrZnJlZShwYXJhbV92YWx1ZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfcHV0X3Jtc192YWx1ZV9jb250cm9sKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogbm90IHVzZWQgKi8KKwlyZXR1cm4gMDsKK30KKworLyogVk9MVU1FICovCitzdGF0aWMgaW50IG1zbV9yb3V0ZV9mbV92b2xfY29udHJvbDsKK3N0YXRpYyBpbnQgbXNtX2FmZV9sYl92b2xfY3RybDsKK3N0YXRpYyBpbnQgbXNtX2FmZV9zZWNfbWkyc19sYl92b2xfY3RybDsKK3N0YXRpYyBpbnQgbXNtX2FmZV90ZXJ0X21pMnNfbGJfdm9sX2N0cmw7CitzdGF0aWMgaW50IG1zbV9hZmVfcXVhdF9taTJzX2xiX3ZvbF9jdHJsOworc3RhdGljIGludCBtc21fYWZlX3NsaW1idXNfOF9sYl92b2xfY3RybDsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoZm1fcnhfdm9sX2dhaW4sIDAsIElOVF9SWF9WT0xfTUFYX1NURVBTKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoYWZlX2xiX3ZvbF9nYWluLCAwLCBJTlRfUlhfVk9MX01BWF9TVEVQUyk7CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfZm1fdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9yb3V0ZV9mbV92b2xfY29udHJvbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX3NldF9mbV92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJYWZlX2xvb3BiYWNrX2dhaW4oSU5UX0ZNX1RYLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwltc21fcm91dGVfZm1fdm9sX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X3ByaV9taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fYWZlX2xiX3ZvbF9jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3ByaV9taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlhZmVfbG9vcGJhY2tfZ2FpbihBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFgsCisJCQkgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKworCW1zbV9hZmVfbGJfdm9sX2N0cmwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X3NlY19taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fYWZlX3NlY19taTJzX2xiX3ZvbF9jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3NlY19taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlhZmVfbG9vcGJhY2tfZ2FpbihBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWCwKKwkJCSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCW1zbV9hZmVfc2VjX21pMnNfbGJfdm9sX2N0cmwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X3RlcnRfbWkyc19sYl92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX2FmZV90ZXJ0X21pMnNfbGJfdm9sX2N0cmw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfdGVydF9taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlhZmVfbG9vcGJhY2tfZ2FpbihBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYLAorCQkJICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJbXNtX2FmZV90ZXJ0X21pMnNfbGJfdm9sX2N0cmwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9zbGltYnVzXzhfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hZmVfc2xpbWJ1c184X2xiX3ZvbF9jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3NsaW1idXNfOF9sYl92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBhZmVfbG9vcGJhY2tfZ2FpbihTTElNQlVTXzhfVFgsCisJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBMQiB2b2wgZm9yIFNMSU1CVVNfOF9UWCIsIF9fZnVuY19fKTsKKwllbHNlCisJCW1zbV9hZmVfc2xpbWJ1c184X2xiX3ZvbF9jdHJsID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfcXVhdF9taTJzX2ZtX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fYWZlX3F1YXRfbWkyc19sYl92b2xfY3RybDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX3NldF9xdWF0X21pMnNfZm1fdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWFmZV9sb29wYmFja19nYWluKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCwKKwkJCSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXNtX2FmZV9xdWF0X21pMnNfbGJfdm9sX2N0cmwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X2hmcF92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3JvdXRlX2hmcF92b2xfY29udHJvbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX3NldF9oZnBfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlhZmVfbG9vcGJhY2tfZ2FpbihJTlRfQlRfU0NPX1RYLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwltc21fcm91dGVfaGZwX3ZvbF9jb250cm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9wcmlfYXV4cGNtX2xiX3ZvbF9taXhlcigKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3JvdXRlX3ByaV9hdXhwY21fbGJfdm9sX2N0cmw7CisJcHJfZGVidWcoIiVzOiBWb2x1bWUgPSAlbGRcbiIsIF9fZnVuY19fLAorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfcHJpX2F1eHBjbV9sYl92b2xfbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwlhZmVfbG9vcGJhY2tfZ2FpbihtYy0+cmVnLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisKKwltc21fcm91dGVfcHJpX2F1eHBjbV9sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfc2VjX2F1eHBjbV9sYl92b2xfbWl4ZXIoCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9yb3V0ZV9zZWNfYXV4cGNtX2xiX3ZvbF9jdHJsOworCXByX2RlYnVnKCIlczogVm9sdW1lID0gJWxkXG4iLCBfX2Z1bmNfXywKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3NlY19hdXhwY21fbGJfdm9sX21peGVyKAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJYWZlX2xvb3BiYWNrX2dhaW4obWMtPnJlZywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJbXNtX3JvdXRlX3NlY19hdXhwY21fbGJfdm9sX2N0cmwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X2NoYW5uZWxfbWFwX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJY2hhciBjaGFubmVsX21hcFtQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07CisJaW50IGk7CisKKwlhZG1fZ2V0X211bHRpX2NoX21hcChjaGFubmVsX21hcCwgQURNX1BBVEhfUExBWUJBQ0spOworCWZvciAoaSA9IDA7IGkgPCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTDsgaSsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9CisJCQkodW5zaWduZWQgaW50KSBjaGFubmVsX21hcFtpXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX3B1dF9jaGFubmVsX21hcF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWNoYXIgY2hhbm5lbF9tYXBbUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUxdOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCisJCWNoYW5uZWxfbWFwW2ldID0gKGNoYXIpKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldKTsKKwlhZG1fc2V0X211bHRpX2NoX21hcChjaGFubmVsX21hcCwgQURNX1BBVEhfUExBWUJBQ0spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEF1ZGlvIFNwaGVyZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgbXNtX3F0aV9wcF9hc3BoZXJlX2luaXRfc3RhdGUodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChhc3BoZXJlX3N0YXRlLmluaXRpYWxpemVkKQorCQlyZXR1cm47CisJYXNwaGVyZV9zdGF0ZS5pbml0aWFsaXplZCA9IHRydWU7CisJZm9yIChpID0gMDsgaSA8IEFGRV9NQVhfUE9SVFM7IGkrKykgeworCQlhc3BoZXJlX3N0YXRlLnBvcnRfaWRbaV0gPSAtMTsKKwkJYXNwaGVyZV9zdGF0ZS5jb3BwX2lkeFtpXSA9IC0xOworCX0KKwlhc3BoZXJlX3N0YXRlLmVuYWJsZWQgPSAwOworCWFzcGhlcmVfc3RhdGUuc3RyZW5ndGggPSAwOworCWFzcGhlcmVfc3RhdGUubW9kZSA9IDA7CisJYXNwaGVyZV9zdGF0ZS52ZXJzaW9uID0gMDsKKwlhc3BoZXJlX3N0YXRlLmVuYWJsZWRfcHJldiA9IDA7CisJYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aF9wcmV2ID0gMDsKK30KKworc3RhdGljIGludCBtc21fcXRpX3BwX2FzcGhlcmVfc2VuZF9wYXJhbXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgYm9vbCBmb3JjZSkKK3sKKwljaGFyICpwYXJhbXNfdmFsdWUgPSBOVUxMOworCXVpbnQzMl90ICp1cGRhdGVfcGFyYW1zX3ZhbHVlID0gTlVMTDsKKwl1aW50MzJfdCBwYXJhbV9zaXplID0gc2l6ZW9mKHVpbnQzMl90KSArCisJCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KTsKKwlpbnQgcGFyYW1zX2xlbmd0aCA9IDAsIHBhcmFtX2NvdW50ID0gMCwgcmV0ID0gMDsKKwlib29sIHNldF9lbmFibGUgPSBmb3JjZSB8fAorCQkJKGFzcGhlcmVfc3RhdGUuZW5hYmxlZCAhPSBhc3BoZXJlX3N0YXRlLmVuYWJsZWRfcHJldik7CisJYm9vbCBzZXRfc3RyZW5ndGggPSBhc3BoZXJlX3N0YXRlLmVuYWJsZWQgPT0gMSAmJiAoc2V0X2VuYWJsZSB8fAorCQkoYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aCAhPSBhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoX3ByZXYpKTsKKworCWlmIChzZXRfZW5hYmxlKQorCQlwYXJhbV9jb3VudCsrOworCWlmIChzZXRfc3RyZW5ndGgpCisJCXBhcmFtX2NvdW50Kys7CisJcGFyYW1zX2xlbmd0aCA9IHBhcmFtX2NvdW50ICogcGFyYW1fc2l6ZTsKKworCXByX2RlYnVnKCIlczogcG9ydF9pZCAlZCwgY29wcF9pZCAlZCwgZm9yY2VkICVkLCBwYXJhbV9jb3VudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgZm9yY2UsIHBhcmFtX2NvdW50KTsKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZSBwcmV2OiV1IGN1cjoldSwgc3RyZW5ndGggcHJldjoldSBjdXI6JXVcbiIsCisJCV9fZnVuY19fLCBhc3BoZXJlX3N0YXRlLmVuYWJsZWRfcHJldiwgYXNwaGVyZV9zdGF0ZS5lbmFibGVkLAorCQlhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoX3ByZXYsIGFzcGhlcmVfc3RhdGUuc3RyZW5ndGgpOworCisJaWYgKHBhcmFtc19sZW5ndGggPiAwKQorCQlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKSB7CisJCXByX2VycigiJXMsIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gKHVpbnQzMl90ICopcGFyYW1zX3ZhbHVlOworCXBhcmFtc19sZW5ndGggPSAwOworCWlmIChzZXRfc3RyZW5ndGgpIHsKKwkJLyogYWRkIHN0cmVuZ3RoIGNvbW1hbmQgKi8KKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IEFVRFBST0NfTU9EVUxFX0lEX0FVRElPU1BIRVJFOworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9TVFJFTkdUSDsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IHNpemVvZih1aW50MzJfdCk7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoOworCQlwYXJhbXNfbGVuZ3RoICs9IHBhcmFtX3NpemU7CisJfQorCWlmIChzZXRfZW5hYmxlKSB7CisJCS8qIGFkZCBlbmFibGUgY29tbWFuZCAqLworCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gQVVEUFJPQ19NT0RVTEVfSURfQVVESU9TUEhFUkU7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0VOQUJMRTsKKwkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IHNpemVvZih1aW50MzJfdCk7CisJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBhc3BoZXJlX3N0YXRlLmVuYWJsZWQ7CisJCXBhcmFtc19sZW5ndGggKz0gcGFyYW1fc2l6ZTsKKwl9CisJcHJfZGVidWcoIiVzLCBwYXJhbSBsZW5ndGg6ICVkXG4iLCBfX2Z1bmNfXywgcGFyYW1zX2xlbmd0aCk7CisJaWYgKHBhcmFtc19sZW5ndGgpIHsKKwkJcmV0ID0gYWRtX3NlbmRfcGFyYW1zX3Y1KHBvcnRfaWQsIGNvcHBfaWR4LAorCQkJCQlwYXJhbXNfdmFsdWUsIHBhcmFtc19sZW5ndGgpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBzZXR0aW5nIHBhcmFtIGZhaWxlZCB3aXRoIGVycj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlrZnJlZShwYXJhbXNfdmFsdWUpOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUVRJX1BQKSAmJiBkZWZpbmVkKENPTkZJR19RVElfUFBfQVVESU9TUEhFUkUpCitpbnQgbXNtX3F0aV9wcF9hc3BoZXJlX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKK3sKKwlpbnQgaW5kZXggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCisJcHJfZGVidWcoIiVzLCBwb3J0X2lkICVkLCBjb3BwX2lkICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOworCWlmIChpbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkeCAlZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIGluZGV4LAorCQkJcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltc21fcXRpX3BwX2FzcGhlcmVfaW5pdF9zdGF0ZSgpOworCisJYXNwaGVyZV9zdGF0ZS5wb3J0X2lkW2luZGV4XSA9IHBvcnRfaWQ7CisJYXNwaGVyZV9zdGF0ZS5jb3BwX2lkeFtpbmRleF0gPSBjb3BwX2lkeDsKKworCWlmIChhc3BoZXJlX3N0YXRlLmVuYWJsZWQpCisJCW1zbV9xdGlfcHBfYXNwaGVyZV9zZW5kX3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtc21fcXRpX3BwX2FzcGhlcmVfZGVpbml0KGludCBwb3J0X2lkKQoreworCWludCBpbmRleCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisKKwlwcl9kZWJ1ZygiJXMsIHBvcnRfaWQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZHggJWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBpbmRleCwKKwkJCXBvcnRfaWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGFzcGhlcmVfc3RhdGUucG9ydF9pZFtpbmRleF0gPT0gcG9ydF9pZCkgeworCQlhc3BoZXJlX3N0YXRlLnBvcnRfaWRbaW5kZXhdID0gLTE7CisJCWFzcGhlcmVfc3RhdGUuY29wcF9pZHhbaW5kZXhdID0gLTE7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXNtX3F0aV9wcF9hc3BoZXJlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWlmICghYXNwaGVyZV9zdGF0ZS5pbml0aWFsaXplZCkKKwkJcmV0dXJuIC1FQUdBSU47CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhc3BoZXJlX3N0YXRlLmVuYWJsZWQ7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoOworCXByX2RlYnVnKCIlcywgZW5hYmxlICV1LCBzdHJlbmd0aCAldVxuIiwgX19mdW5jX18sCisJCQlhc3BoZXJlX3N0YXRlLmVuYWJsZWQsIGFzcGhlcmVfc3RhdGUuc3RyZW5ndGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9xdGlfcHBfYXNwaGVyZV9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQzMl90IGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWludDMyX3Qgc3RyZW5ndGggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpbnQgaTsKKworCXByX2RlYnVnKCIlcywgZW5hYmxlICV1LCBzdHJlbmd0aCAldVxuIiwgX19mdW5jX18sIGVuYWJsZSwgc3RyZW5ndGgpOworCisJbXNtX3F0aV9wcF9hc3BoZXJlX2luaXRfc3RhdGUoKTsKKworCWlmIChlbmFibGUgPT0gMCB8fCBlbmFibGUgPT0gMSkgeworCQlhc3BoZXJlX3N0YXRlLmVuYWJsZWRfcHJldiA9IGFzcGhlcmVfc3RhdGUuZW5hYmxlZDsKKwkJYXNwaGVyZV9zdGF0ZS5lbmFibGVkID0gZW5hYmxlOworCX0KKworCWlmIChzdHJlbmd0aCA+PSAwICYmIHN0cmVuZ3RoIDw9IDEwMDApIHsKKwkJYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aF9wcmV2ID0gYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aDsKKwkJYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aCA9IHN0cmVuZ3RoOworCX0KKworCWlmIChhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoICE9IGFzcGhlcmVfc3RhdGUuc3RyZW5ndGhfcHJldiB8fAorCQlhc3BoZXJlX3N0YXRlLmVuYWJsZWQgIT0gYXNwaGVyZV9zdGF0ZS5lbmFibGVkX3ByZXYpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFGRV9NQVhfUE9SVFM7IGkrKykgeworCQkJaWYgKGFzcGhlcmVfc3RhdGUucG9ydF9pZFtpXSA+PSAwKQorCQkJCW1zbV9xdGlfcHBfYXNwaGVyZV9zZW5kX3BhcmFtcygKKwkJCQkJYXNwaGVyZV9zdGF0ZS5wb3J0X2lkW2ldLAorCQkJCQlhc3BoZXJlX3N0YXRlLmNvcHBfaWR4W2ldLAorCQkJCQlmYWxzZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnRfZm1fdm9sX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFRfVExWKCJJbnRlcm5hbCBGTSBSWCBWb2x1bWUiLCBTTkRfU09DX05PUE0sIDAsCisJSU5UX1JYX1ZPTF9HQUlOLCAwLCBtc21fcXRpX3BwX2dldF9mbV92b2xfbWl4ZXIsCisJbXNtX3F0aV9wcF9zZXRfZm1fdm9sX21peGVyLCBmbV9yeF92b2xfZ2FpbiksCisJU09DX1NJTkdMRV9FWFRfVExWKCJRdWF0IE1JMlMgRk0gUlggVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAorCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfcXVhdF9taTJzX2ZtX3ZvbF9taXhlciwKKwltc21fcXRpX3BwX3NldF9xdWF0X21pMnNfZm1fdm9sX21peGVyLCBmbV9yeF92b2xfZ2FpbiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX21pMnNfbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFRfVExWKCJQUkkgTUkyUyBMT09QQkFDSyBWb2x1bWUiLCBTTkRfU09DX05PUE0sIDAsCisJSU5UX1JYX1ZPTF9HQUlOLCAwLCBtc21fcXRpX3BwX2dldF9wcmlfbWkyc19sYl92b2xfbWl4ZXIsCisJbXNtX3F0aV9wcF9zZXRfcHJpX21pMnNfbGJfdm9sX21peGVyLCBhZmVfbGJfdm9sX2dhaW4pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19taTJzX2xiX3ZvbF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUX1RMVigiU0VDIE1JMlMgTE9PUEJBQ0sgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAorCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfc2VjX21pMnNfbGJfdm9sX21peGVyLAorCW1zbV9xdGlfcHBfc2V0X3NlY19taTJzX2xiX3ZvbF9taXhlciwgYWZlX2xiX3ZvbF9nYWluKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X21pMnNfbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFRfVExWKCJUZXJ0IE1JMlMgTE9PUEJBQ0sgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAorCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfdGVydF9taTJzX2xiX3ZvbF9taXhlciwKKwltc21fcXRpX3BwX3NldF90ZXJ0X21pMnNfbGJfdm9sX21peGVyLCBhZmVfbGJfdm9sX2dhaW4pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfOF9sYl92b2xfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVF9UTFYoIlNMSU1CVVNfOCBMT09QQkFDSyBWb2x1bWUiLCBTTkRfU09DX05PUE0sIDAsCisJSU5UX1JYX1ZPTF9HQUlOLCAwLCBtc21fcXRpX3BwX2dldF9zbGltYnVzXzhfbGJfdm9sX21peGVyLAorCW1zbV9xdGlfcHBfc2V0X3NsaW1idXNfOF9sYl92b2xfbWl4ZXIsIGFmZV9sYl92b2xfZ2FpbiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50X2hmcF92b2xfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVF9UTFYoIkludGVybmFsIEhGUCBSWCBWb2x1bWUiLCBTTkRfU09DX05PUE0sIDAsCisJSU5UX1JYX1ZPTF9HQUlOLCAwLCBtc21fcXRpX3BwX2dldF9oZnBfdm9sX21peGVyLAorCW1zbV9xdGlfcHBfc2V0X2hmcF92b2xfbWl4ZXIsIGhmcF9yeF92b2xfZ2FpbiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX2F1eHBjbV9sYl92b2xfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX0VYVF9UTFYoIlBSSSBBVVhQQ00gTE9PUEJBQ0sgVm9sdW1lIiwKKwlBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCwgMCwgSU5UX1JYX1ZPTF9HQUlOLCAwLAorCW1zbV9xdGlfcHBfZ2V0X3ByaV9hdXhwY21fbGJfdm9sX21peGVyLAorCW1zbV9xdGlfcHBfc2V0X3ByaV9hdXhwY21fbGJfdm9sX21peGVyLAorCXByaV9hdXhwY21fbGJfdm9sX2dhaW4pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19hdXhwY21fbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFRfVExWKCJTRUMgQVVYUENNIExPT1BCQUNLIFZvbHVtZSIsCisJQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWCwgMCwgSU5UX1JYX1ZPTF9HQUlOLCAwLAorCW1zbV9xdGlfcHBfZ2V0X3NlY19hdXhwY21fbGJfdm9sX21peGVyLAorCW1zbV9xdGlfcHBfc2V0X3NlY19hdXhwY21fbGJfdm9sX21peGVyLAorCXNlY19hdXhwY21fbGJfdm9sX2dhaW4pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG11bHRpX2NoX2NoYW5uZWxfbWFwX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBsYXliYWNrIERldmljZSBDaGFubmVsIE1hcCIsIFNORF9TT0NfTk9QTSwgMCwgMTYsCisJMCwgOCwgbXNtX3F0aV9wcF9nZXRfY2hhbm5lbF9tYXBfbWl4ZXIsCisJbXNtX3F0aV9wcF9wdXRfY2hhbm5lbF9tYXBfbWl4ZXIpLAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZ2V0X3Jtc19jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJHZXQgUk1TIiwgU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLAorCTAsIG1zbV9xdGlfcHBfZ2V0X3Jtc192YWx1ZV9jb250cm9sLCBtc21fcXRpX3BwX3B1dF9ybXNfdmFsdWVfY29udHJvbCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXFfZW5hYmxlX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIEVRIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcXRpX3BwX2dldF9lcV9lbmFibGVfbWl4ZXIsCisJbXNtX3F0aV9wcF9wdXRfZXFfZW5hYmxlX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIgRVEgRW5hYmxlIiwgU05EX1NPQ19OT1BNLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9xdGlfcHBfZ2V0X2VxX2VuYWJsZV9taXhlciwKKwltc21fcXRpX3BwX3B1dF9lcV9lbmFibGVfbWl4ZXIpLAorCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyBFUSBFbmFibGUiLCBTTkRfU09DX05PUE0sCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3F0aV9wcF9nZXRfZXFfZW5hYmxlX21peGVyLAorCW1zbV9xdGlfcHBfcHV0X2VxX2VuYWJsZV9taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXFfYmFuZF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kIENvdW50IiwgU05EX1NPQ19OT1BNLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDExLCAwLAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfY291bnRfYXVkaW9fbWl4ZXIsCisJbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQgQ291bnQiLCBTTkRfU09DX05PUE0sCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMTEsIDAsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlciwKKwltc21fcXRpX3BwX3B1dF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZCBDb3VudCIsIFNORF9TT0NfTk9QTSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxMSwgMCwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyLAorCW1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfY291bnRfYXVkaW9fbWl4ZXIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVxX2NvZWZmX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQxIiwgRVFfQkFORDEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kMiIsIEVRX0JBTkQyLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDMiLCBFUV9CQU5EMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQ0IiwgRVFfQkFORDQsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kNSIsIEVRX0JBTkQ1LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDYiLCBFUV9CQU5ENiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQ3IiwgRVFfQkFORDcsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kOCIsIEVRX0JBTkQ4LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDkiLCBFUV9CQU5EOSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQxMCIsIEVRX0JBTkQxMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQxMSIsIEVRX0JBTkQxMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQxMiIsIEVRX0JBTkQxMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQxIiwgRVFfQkFORDEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kMiIsIEVRX0JBTkQyLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDMiLCBFUV9CQU5EMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQ0IiwgRVFfQkFORDQsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kNSIsIEVRX0JBTkQ1LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDYiLCBFUV9CQU5ENiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQ3IiwgRVFfQkFORDcsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kOCIsIEVRX0JBTkQ4LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDkiLCBFUV9CQU5EOSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQxMCIsIEVRX0JBTkQxMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQxMSIsIEVRX0JBTkQxMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQxMiIsIEVRX0JBTkQxMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQxIiwgRVFfQkFORDEsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kMiIsIEVRX0JBTkQyLAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDMiLCBFUV9CQU5EMywKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQ0IiwgRVFfQkFORDQsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kNSIsIEVRX0JBTkQ1LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDYiLCBFUV9CQU5ENiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQ3IiwgRVFfQkFORDcsCisJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAorCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAorCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kOCIsIEVRX0JBTkQ4LAorCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKKwltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKKwlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDkiLCBFUV9CQU5EOSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQxMCIsIEVRX0JBTkQxMCwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQxMSIsIEVRX0JBTkQxMSwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCisJU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQxMiIsIEVRX0JBTkQxMiwKKwlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCisJbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXNwaGVyZV9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNU00gQVNwaGVyZSBTZXQgUGFyYW0iLCBTTkRfU09DX05PUE0sIDAsCisJMHhGRkZGRkZGRiwgMCwgMiwgbXNtX3F0aV9wcF9hc3BoZXJlX2dldCwgbXNtX3F0aV9wcF9hc3BoZXJlX3NldCksCit9OworCisjaWZkZWYgQ09ORklHX1FUSV9QUAordm9pZCBtc21fcXRpX3BwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGludF9mbV92b2xfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGludF9mbV92b2xfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBwcmlfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHByaV9taTJzX2xiX3ZvbF9taXhlcl9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIHNlY19taTJzX2xiX3ZvbF9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoc2VjX21pMnNfbGJfdm9sX21peGVyX2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgdGVydF9taTJzX2xiX3ZvbF9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUodGVydF9taTJzX2xiX3ZvbF9taXhlcl9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIHNsaW1idXNfOF9sYl92b2xfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHNsaW1idXNfOF9sYl92b2xfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBpbnRfaGZwX3ZvbF9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoaW50X2hmcF92b2xfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJcHJpX2F1eHBjbV9sYl92b2xfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHByaV9hdXhwY21fbGJfdm9sX21peGVyX2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKKwkJCQlzZWNfYXV4cGNtX2xiX3ZvbF9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoc2VjX2F1eHBjbV9sYl92b2xfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAorCQkJCW11bHRpX2NoX2NoYW5uZWxfbWFwX21peGVyX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShtdWx0aV9jaF9jaGFubmVsX21hcF9taXhlcl9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGdldF9ybXNfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGdldF9ybXNfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBlcV9lbmFibGVfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGVxX2VuYWJsZV9taXhlcl9jb250cm9scykpOworCisJc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGVxX2JhbmRfbWl4ZXJfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGVxX2JhbmRfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBlcV9jb2VmZl9taXhlcl9jb250cm9scywKKwkJCUFSUkFZX1NJWkUoZXFfY29lZmZfbWl4ZXJfY29udHJvbHMpKTsKKworCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBhc3BoZXJlX21peGVyX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhc3BoZXJlX21peGVyX2NvbnRyb2xzKSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1FUSV9QUCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXF0aS1wcC1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVmYjNlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9NU01fUVRJX1BQX0hfCisjZGVmaW5lIF9NU01fUVRJX1BQX0hfCisKKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2lmZGVmIENPTkZJR19RVElfUFAKK3ZvaWQgbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlcyhpbnQgZmVkYWlfaWQpOworaW50IG1zbV9xdGlfcHBfc2VuZF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19jbWQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCQkJCXVuc2lnbmVkIGludCBzZXNzaW9uX2lkLAorCQkJCQkJdWludDE2X3Qgb3BfRkxfaXBfRkxfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRkxfaXBfRlJfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRlJfaXBfRkxfd2VpZ2h0LAorCQkJCQkJdWludDE2X3Qgb3BfRlJfaXBfRlJfd2VpZ2h0KTsKK3ZvaWQgbXNtX3F0aV9wcF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKTsKKyNlbHNlIC8qIENPTkZJR19RVElfUFAgKi8KKyNkZWZpbmUgbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlcyhmZWRhaV9pZCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1zbV9xdGlfcHBfc2VuZF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19jbWQocG9ydF9pZCwgY29wcF9pZHgsIFwKKwkJCXNlc3Npb25faWQsIG9wX0ZMX2lwX0ZMX3dlaWdodCwgb3BfRkxfaXBfRlJfd2VpZ2h0LCBcCisJCQlvcF9GUl9pcF9GTF93ZWlnaHQsIG9wX0ZSX2lwX0ZSX3dlaWdodCkgKDApCisjZGVmaW5lIG1zbV9xdGlfcHBfYWRkX2NvbnRyb2xzKHBsYXRmb3JtKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfUVRJX1BQICovCisKKworI2lmIGRlZmluZWQoQ09ORklHX1FUSV9QUCkgJiYgZGVmaW5lZChDT05GSUdfUVRJX1BQX0FVRElPU1BIRVJFKQoraW50IG1zbV9xdGlfcHBfYXNwaGVyZV9pbml0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpOwordm9pZCBtc21fcXRpX3BwX2FzcGhlcmVfZGVpbml0KGludCBwb3J0X2lkKTsKKyNlbHNlCisjZGVmaW5lIG1zbV9xdGlfcHBfYXNwaGVyZV9pbml0KHBvcnRfaWQsIGNvcHBfaWR4KSAoMCkKKyNkZWZpbmUgbXNtX3F0aV9wcF9hc3BoZXJlX2RlaW5pdChwb3J0X2lkKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogX01TTV9RVElfUFBfSF8gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFkbS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YWRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkMmI4MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFkbS5jCkBAIC0wLDAgKzEsNDQwNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorI2luY2x1ZGUgPHNvdW5kL21zbS1kdHMtZWFnbGUuaD4KKyNpbmNsdWRlICJtc20tZHRzLXNycy10bS1jb25maWcuaCIKKyNpbmNsdWRlIDxzb3VuZC9hZHNwX2Vyci5oPgorCisjZGVmaW5lIFRJTUVPVVRfTVMgMTAwMAorCisjZGVmaW5lIFJFU0VUX0NPUFBfSUQgOTkKKyNkZWZpbmUgSU5WQUxJRF9DT1BQX0lEIDB4RkYKKy8qIFVzZWQgZm9yIGluYmFuZCBwYXlsb2FkIGNvcHksIG1heCBzaXplIGlzIDRrICovCisvKiAyIGlzIHRvIGFjY291bnQgZm9yIG1vZHVsZSAmIHBhcmFtIElEIGluIHBheWxvYWQgKi8KKyNkZWZpbmUgQURNX0dFVF9QQVJBTUVURVJfTEVOR1RIICAoNDA5NiAtIEFQUl9IRFJfU0laRSAtIDIgKiBzaXplb2YodWludDMyX3QpKQorCisjZGVmaW5lIFVMTF9TVVBQT1JURURfQklUU19QRVJfU0FNUExFIDE2CisjZGVmaW5lIFVMTF9TVVBQT1JURURfU0FNUExFX1JBVEUgNDgwMDAKKworLyogRU5VTSBmb3IgYWRtX3N0YXR1cyAqLworZW51bSBhZG1fY2FsX3N0YXR1cyB7CisJQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRCA9IDAsCisJQURNX1NUQVRVU19NQVgsCit9OworCitzdHJ1Y3QgYWRtX2NvcHAgeworCisJYXRvbWljX3QgaWRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwlhdG9taWNfdCBjbnRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwlhdG9taWNfdCB0b3BvbG9neVtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOworCWF0b21pY190IG1vZGVbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwlhdG9taWNfdCBzdGF0W0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07CisJYXRvbWljX3QgcmF0ZVtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOworCWF0b21pY190IGJpdF93aWR0aFtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOworCWF0b21pY190IGNoYW5uZWxzW0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07CisJYXRvbWljX3QgYXBwX3R5cGVbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwlhdG9taWNfdCBhY2RiX2lkW0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdFtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOworCXdhaXRfcXVldWVfaGVhZF90IGFkbV9kZWxheV93YWl0W0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07CisJYXRvbWljX3QgYWRtX2RlbGF5X3N0YXRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwl1aW50MzJfdCBhZG1fZGVsYXlbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKKwl1bnNpZ25lZCBsb25nIGFkbV9zdGF0dXNbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKK307CisKK3N0cnVjdCBzb3VyY2VfdHJhY2tpbmdfZGF0YSB7CisJc3RydWN0IGlvbl9jbGllbnQgKmlvbl9jbGllbnQ7CisJc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGU7CisJc3RydWN0IHBhcmFtX291dGJhbmQgbWVtbWFwOworCWludCBhcHJfY21kX3N0YXR1czsKK307CisKK3N0cnVjdCBhZG1fY3RsIHsKKwl2b2lkICphcHI7CisKKwlzdHJ1Y3QgYWRtX2NvcHAgY29wcDsKKworCWF0b21pY190IG1hdHJpeF9tYXBfc3RhdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBtYXRyaXhfbWFwX3dhaXQ7CisKKwlhdG9taWNfdCBhZG1fc3RhdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBhZG1fd2FpdDsKKworCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfZGF0YVtBRE1fTUFYX0NBTF9UWVBFU107CisKKwlhdG9taWNfdCBtZW1fbWFwX2hhbmRsZXNbQURNX01FTV9NQVBfSU5ERVhfTUFYXTsKKwlhdG9taWNfdCBtZW1fbWFwX2luZGV4OworCisJc3RydWN0IHBhcmFtX291dGJhbmQgb3V0YmFuZF9tZW1tYXA7CisJc3RydWN0IHNvdXJjZV90cmFja2luZ19kYXRhIHNvdXJjZVRyYWNraW5nRGF0YTsKKworCWludCBzZXRfY3VzdG9tX3RvcG9sb2d5OworCWludCBlY19yZWZfcng7Cit9OworCitzdGF0aWMgc3RydWN0IGFkbV9jdGwJCQl0aGlzX2FkbTsKKworc3RydWN0IGFkbV9tdWx0aV9jaF9tYXAgeworCWJvb2wgc2V0X2NoYW5uZWxfbWFwOworCWNoYXIgY2hhbm5lbF9tYXBwaW5nW1BDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMXTsKK307CisKKyNkZWZpbmUgQURNX01DSF9NQVBfSURYX1BMQVlCQUNLIDAKKyNkZWZpbmUgQURNX01DSF9NQVBfSURYX1JFQyAxCitzdGF0aWMgc3RydWN0IGFkbV9tdWx0aV9jaF9tYXAgbXVsdGlfY2hfbWFwc1syXSA9IHsKKwkJCQkJCQl7IGZhbHNlLAorCQkJCQkJCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorCQkJCQkJCX0sCisJCQkJCQkJeyBmYWxzZSwKKwkJCQkJCQl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwkJCQkJCQl9Cit9OworCitzdGF0aWMgaW50IGFkbV9nZXRfcGFyYW1ldGVyc1tNQVhfQ09QUFNfUEVSX1BPUlQgKiBBRE1fR0VUX1BBUkFNRVRFUl9MRU5HVEhdOworc3RhdGljIGludCBhZG1fbW9kdWxlX3RvcG9fbGlzdFsKKwlNQVhfQ09QUFNfUEVSX1BPUlQgKiBBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIXTsKKworaW50IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgoaW50IHBvcnRfaWQpCit7CisJaW50IGluZGV4OworCWludCByZXQ7CisKKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcG9ydCB2YWxpZGF0aW9uIGZhaWxlZCBpZCAweCV4IHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkeCAlZCBwb3J0X2lkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaW5kZXgsCisJCQlwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogcG9ydF9pZHgtICVkXG4iLCBfX2Z1bmNfXywgaW5kZXgpOworCXJldHVybiBpbmRleDsKK30KKworaW50IGFkbV9nZXRfZGVmYXVsdF9jb3BwX2lkeChpbnQgcG9ydF9pZCkKK3sKKwlpbnQgcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpLCBpZHg7CisKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZDogMHgleCIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogcG9ydF9pZHg6JWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkeCk7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKSB7CisJCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1baWR4XSkgIT0KKwkJCVJFU0VUX0NPUFBfSUQpCisJCQlyZXR1cm4gaWR4OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfZnJvbV9jb3BwX2lkKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZCkKK3sKKwlpbnQgcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpLCBpZHg7CisKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZDogMHgleCIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykKKwkJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtpZHhdKSA9PSBjb3BwX2lkKQorCQkJcmV0dXJuIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XQorCQkJCQkJCQkgIFtpZHhdKTsKKwlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfaWQgJWQgcG9ydF9pZCAweCV4XG4iLAorCQlfX2Z1bmNfXywgY29wcF9pZCwgcG9ydF9pZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2NvcHBfaWR4KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpCit7CisJaW50IHBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKworCWlmIChwb3J0X2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydDogMHgleCBjb3BwIGlkOiAweCV4IiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtjb3BwX2lkeF0pOworfQorCitpbnQgYWRtX2dldF9pbmRleGVzX2Zyb21fY29wcF9pZChpbnQgY29wcF9pZCwgaW50ICpjb3BwX2lkeCwgaW50ICpwb3J0X2lkeCkKK3sKKwlpbnQgcF9pZHgsIGNfaWR4OworCisJZm9yIChwX2lkeCA9IDA7IHBfaWR4IDwgQUZFX01BWF9QT1JUUzsgcF9pZHgrKykgeworCQlmb3IgKGNfaWR4ID0gMDsgY19pZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGNfaWR4KyspIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwX2lkeF1bY19pZHhdKQorCQkJCQkJCQk9PSBjb3BwX2lkKSB7CisJCQkJaWYgKGNvcHBfaWR4ICE9IE5VTEwpCisJCQkJCSpjb3BwX2lkeCA9IGNfaWR4OworCQkJCWlmIChwb3J0X2lkeCAhPSBOVUxMKQorCQkJCQkqcG9ydF9pZHggPSBwX2lkeDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZG1fZ2V0X2NvcHBfaWQoaW50IHBvcnRfaWR4LCBpbnQgY29wcF9pZHgpCit7CisJcHJfZGVidWcoIiVzOiBwb3J0X2lkeDolZCBjb3BwX2lkeDolZFxuIiwgX19mdW5jX18sIHBvcnRfaWR4LCBjb3BwX2lkeCk7CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKK30KKworc3RhdGljIGludCBhZG1fZ2V0X2lkeF9pZl9jb3BwX2V4aXN0cyhpbnQgcG9ydF9pZHgsIGludCB0b3BvbG9neSwgaW50IG1vZGUsCisJCQkJIGludCByYXRlLCBpbnQgYml0X3dpZHRoLCBpbnQgYXBwX3R5cGUpCit7CisJaW50IGlkeDsKKworCXByX2RlYnVnKCIlczogcG9ydF9pZHgtJWQsIHRvcG9sb2d5LTB4JXgsIG1vZGUtJWQsIHJhdGUtJWQsIGJpdF93aWR0aC0lZFxuIiwKKwkJIF9fZnVuY19fLCBwb3J0X2lkeCwgdG9wb2xvZ3ksIG1vZGUsIHJhdGUsIGJpdF93aWR0aCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaWR4KyspCisJCWlmICgodG9wb2xvZ3kgPT0KKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtpZHhdKSkgJiYKKwkJICAgIChtb2RlID09IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLm1vZGVbcG9ydF9pZHhdW2lkeF0pKSAmJgorCQkgICAgKHJhdGUgPT0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAucmF0ZVtwb3J0X2lkeF1baWR4XSkpICYmCisJCSAgICAoYml0X3dpZHRoID09CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5iaXRfd2lkdGhbcG9ydF9pZHhdW2lkeF0pKSAmJgorCQkgICAgKGFwcF90eXBlID09CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtwb3J0X2lkeF1baWR4XSkpKQorCQkJcmV0dXJuIGlkeDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZG1fZ2V0X25leHRfYXZhaWxhYmxlX2NvcHAoaW50IHBvcnRfaWR4KQoreworCWludCBpZHg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKSB7CisJCXByX2RlYnVnKCIlczogY29wcF9pZDoweCV4IHBvcnRfaWR4OiVkIGlkeDolZFxuIiwgX19mdW5jX18sCisJCQkgYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2lkeF0pLAorCQkJIHBvcnRfaWR4LCBpZHgpOworCQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2lkeF0pID09CisJCQkJCQkJCVJFU0VUX0NPUFBfSUQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGlkeDsKK30KKworaW50IGFkbV9kdHNfZWFnbGVfc2V0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXJhbV9pZCwKKwkJICAgICAgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1CWFkbXA7CisJaW50IHBfaWR4LCByZXQgPSAwLCAqb2JfcGFyYW1zOworCisJcHJfZGVidWcoIkRUU19FQUdMRV9BRE06ICVzIC0gcG9ydCBpZCAlaSwgY29wcCBpZHggJWksIHBhcmFtIGlkIDB4JVggc2l6ZSAldVxuIiwKKwkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBwYXJhbV9pZCwgc2l6ZSk7CisKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCXByX2RlYnVnKCJEVFNfRUFHTEVfQURNOiAlcyAtIGFmdGVyIGxvb2t1cCwgcG9ydCBpZCAlaSwgcG9ydCBpZHggJWlcbiIsCisJCV9fZnVuY19fLCBwb3J0X2lkLCBwX2lkeCk7CisKKwlpZiAocF9pZHggPCAwKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FETTogJXM6IGludmFsaWQgcG9ydCBpbmRleCAweCV4LCBwb3J0IGlkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcF9pZHgsIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BRE06ICVzOiBJbnZhbGlkIGNvcHBfaWR4OiAlZFxuIiwgX19mdW5jX18sCisJCQljb3BwX2lkeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9iX3BhcmFtcyA9IChpbnQgKil0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5rdmFkZHI7CisJaWYgKG9iX3BhcmFtcyA9PSBOVUxMKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FETTogJXMgLSBOVUxMIG1lbW1hcC4gTm9uIEVhZ2xlIHRvcG9sb2d5IHNlbGVjdGVkP1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKwlpZiAoc2l6ZSA+IChVSU5UX01BWCAtIEFQUl9DTURfT0JfSERSX1NaKSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoKHJldCA8IDApIHx8CisJICAgIChzaXplICsgQVBSX0NNRF9PQl9IRFJfU1ogPiB0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5zaXplKSkgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BRE0gLSAlczogaW9uIGFsbG9jIG9mIHNpemUgJXp1IHRvbyBzbWFsbCBmb3Igc2l6ZSByZXF1ZXN0ZWQgJXVcbiIsCisJCQlfX2Z1bmNfXywgdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAuc2l6ZSwKKwkJCXNpemUgKyBBUFJfQ01EX09CX0hEUl9TWik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCSpvYl9wYXJhbXMrKyA9IEFVRFBST0NfTU9EVUxFX0lEX0RUU19IUFhfUE9TVE1JWDsKKwkqb2JfcGFyYW1zKysgPSBwYXJhbV9pZDsKKwkqb2JfcGFyYW1zKysgPSBzaXplOworCW1lbWNweShvYl9wYXJhbXMsIGRhdGEsIHNpemUpOworCisJYWRtcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWFkbXAuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFkbXApOworCWFkbXAuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbXAuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWFkbXAuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbXAuaGRyLmRlc3RfcG9ydCA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BfaWR4XVtjb3BwX2lkeF0pOworCWFkbXAuaGRyLnRva2VuID0gcF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhZG1wLmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7CisJYWRtcC5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyh0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkcik7CisJYWRtcC5wYXlsb2FkX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJCQl0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkcik7CisJYWRtcC5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCisJCQkJCSAgQURNX0RUU19FQUdMRV0pOworCWFkbXAucGF5bG9hZF9zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCisJcHJfZGVidWcoIkRUU19FQUdMRV9BRE06ICVzIC0gQ29tbWFuZCB3YXMgc2VudCBub3cgY2hlY2sgUTYgLSBwb3J0IGlkID0gJWQsIHNpemUgJWQsIG1vZHVsZSBpZCAleCwgcGFyYW0gaWQgJXguXG4iLAorCQkJX19mdW5jX18sIGFkbXAuaGRyLmRlc3RfcG9ydCwKKwkJCWFkbXAucGF5bG9hZF9zaXplLCBBVURQUk9DX01PRFVMRV9JRF9EVFNfSFBYX1BPU1RNSVgsCisJCQlwYXJhbV9pZCk7CisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmYWRtcCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQURNOiAlcyAtIEFETSBlbmFibGUgZm9yIHBvcnQgJWQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BfaWR4XVtjb3BwX2lkeF0sCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQlbcF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FETTogJXMgLSBzZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BfaWR4XVtjb3BwX2lkeF0pID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BfaWR4XVtjb3BwX2lkeF0pKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwX2lkeF1bY29wcF9pZHhdKSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gMDsKKwl9CisKK2ZhaWxfY21kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fZHRzX2VhZ2xlX2dldChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgcGFyYW1faWQsCisJCSAgICAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NQlhZG1wOworCWludCBwX2lkeCwgcmV0ID0gMCwgKm9iX3BhcmFtczsKKwl1aW50MzJfdCBvcmlnX3NpemUgPSBzaXplOworCisJcHJfZGVidWcoIkRUU19FQUdMRV9BRE06ICVzIC0gcG9ydCBpZCAlaSwgY29wcCBpZHggJWksIHBhcmFtIGlkIDB4JVhcbiIsCisJCSBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgsIHBhcmFtX2lkKTsKKworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwX2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBfaWR4IDwgMCkgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BRE06ICVzIC0gaW52YWxpZCBwb3J0IGluZGV4ICVpLCBwb3J0IGlkICVpLCBjb3BwIGlkeCAlaVxuIiwKKwkJCQlfX2Z1bmNfXywgcF9pZHgsIHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQURNOiAlczogSW52YWxpZCBjb3BwX2lkeDogJWRcbiIsIF9fZnVuY19fLAorCQkJY29wcF9pZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHNpemUgPT0gMCkgfHwgIWRhdGEpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQURNOiAlcyAtIGludmFsaWQgc2l6ZSAldSBvciBwb2ludGVyICVwSy5cbiIsCisJCQlfX2Z1bmNfXywgc2l6ZSwgZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSAoc2l6ZSszKSAmIDB4RkZGRkZGRkM7CisKKwlvYl9wYXJhbXMgPSAoaW50ICopKHRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLmt2YWRkcik7CisJaWYgKG9iX3BhcmFtcyA9PSBOVUxMKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FETTogJXMgLSBOVUxMIG1lbW1hcC4gTm9uIEVhZ2xlIHRvcG9sb2d5IHNlbGVjdGVkPyIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJaWYgKHNpemUgPiAoVUlOVF9NQVggLSBBUFJfQ01EX09CX0hEUl9TWikpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKChyZXQgPCAwKSB8fAorCSAgICAoc2l6ZSArIEFQUl9DTURfT0JfSERSX1NaID4gdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAuc2l6ZSkpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQURNIC0gJXM6IGlvbiBhbGxvYyBvZiBzaXplICV6dSB0b28gc21hbGwgZm9yIHNpemUgcmVxdWVzdGVkICV1XG4iLAorCQkJX19mdW5jX18sIHRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnNpemUsCisJCQlzaXplICsgQVBSX0NNRF9PQl9IRFJfU1opOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwkqb2JfcGFyYW1zKysgPSBBVURQUk9DX01PRFVMRV9JRF9EVFNfSFBYX1BPU1RNSVg7CisJKm9iX3BhcmFtcysrID0gcGFyYW1faWQ7CisJKm9iX3BhcmFtcysrID0gc2l6ZTsKKworCWFkbXAuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1wLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihhZG1wKTsKKwlhZG1wLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtcC5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlhZG1wLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7CisJYWRtcC5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1wLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlhZG1wLmhkci5kZXN0X3BvcnQgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwX2lkeF1bY29wcF9pZHhdKTsKKwlhZG1wLmhkci50b2tlbiA9IHBfaWR4IDw8IDE2IHwgY29wcF9pZHg7CisJYWRtcC5oZHIub3Bjb2RlID0gQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1OworCWFkbXAuZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0KKwkJCQlsb3dlcl8zMl9iaXRzKHRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyKTsKKwlhZG1wLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9CisJCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJCQl0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkcik7CisJYWRtcC5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCisJCQkJCSAgQURNX0RUU19FQUdMRV0pOworCWFkbXAubW9kdWxlX2lkID0gQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QT1NUTUlYOworCWFkbXAucGFyYW1faWQgPSBwYXJhbV9pZDsKKwlhZG1wLnBhcmFtX21heF9zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCWFkbXAucmVzZXJ2ZWQgPSAwOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZhZG1wKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BRE06ICVzIC0gRmFpbGVkIHRvIGdldCBFQUdMRSBQYXJhbXMgb24gcG9ydCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwX2lkeF1bY29wcF9pZHhdLAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJW3BfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BRE06ICVzIC0gRUFHTEUgZ2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwX2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwX2lkeF1bY29wcF9pZHhdKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwltZW1jcHkoZGF0YSwgb2JfcGFyYW1zLCBvcmlnX3NpemUpOworCXJldCA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3JzX3RydW1lZGlhX29wZW4oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgX19zMzIgc3JzX3RlY2hfaWQsCisJCSAgICAgIHZvaWQgKnNyc19wYXJhbXMpCit7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUgKmFkbV9wYXJhbXMgPSBOVUxMOworCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgKmFkbV9wYXJhbXNfID0gTlVMTDsKKwlfX3MzMiBzeiA9IDAsIHBhcmFtX2lkLCBtb2R1bGVfaWQgPSBTUlNfVFJVTUVESUFfTU9EVUxFX0lELCBvdXRiYW5kID0gMDsKKwlpbnQgcmV0ID0gMCwgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiU1JTIC0gJXMiLCBfX2Z1bmNfXyk7CisKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoIChzcnNfdGVjaF9pZCkgeworCWNhc2UgU1JTX0lEX0dMT0JBTDogeworCQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwgKmdsYl9wYXJhbXMgPSBOVUxMOworCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0xPQkFMKTsKKwkJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCQlpZiAoIWFkbV9wYXJhbXMpIHsKKwkJCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCkgKworCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSk7CisJCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNUzsKKwkJYWRtX3BhcmFtcy0+cGFyYW1zLnBhcmFtX3NpemUgPQorCQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwpOworCQlnbGJfcGFyYW1zID0gKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCAqKQorCQkJKCh1OCAqKWFkbV9wYXJhbXMgKworCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSk7CisJCW1lbWNweShnbGJfcGFyYW1zLCBzcnNfcGFyYW1zLAorCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCkpOworCQlicmVhazsKKwl9CisJY2FzZSBTUlNfSURfV09XSEQ6IHsKKwkJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQgKndoZF9wYXJhbXMgPSBOVUxMOworCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQpOworCQlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYWRtX3BhcmFtcykgeworCQkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQpICsKKwkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfV09XSEQ7CisJCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9zaXplID0KKwkJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQpOworCQl3aGRfcGFyYW1zID0gKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1dPV0hEICopCisJCQkoKHU4ICopYWRtX3BhcmFtcyArCisJCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpKTsKKwkJbWVtY3B5KHdoZF9wYXJhbXMsIHNyc19wYXJhbXMsCisJCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1dPV0hEKSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNSU19JRF9DU0hQOiB7CisJCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFAgKmNocF9wYXJhbXMgPSBOVUxMOworCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUCk7CisJCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZG1fcGFyYW1zKSB7CisJCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQKSArCisJCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KTsKKwkJcGFyYW1faWQgPSBTUlNfVFJVTUVESUFfUEFSQU1TX0NTSFA7CisJCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9zaXplID0KKwkJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUCk7CisJCWNocF9wYXJhbXMgPSAoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUCAqKQorCQkJKCh1OCAqKWFkbV9wYXJhbXMgKworCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSk7CisJCW1lbWNweShjaHBfcGFyYW1zLCBzcnNfcGFyYW1zLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQKSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNSU19JRF9IUEY6IHsKKwkJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGICpocGZfcGFyYW1zID0gTlVMTDsKKworCQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSkgKworCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRik7CisJCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZG1fcGFyYW1zKSB7CisJCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYpICsKKwkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfSFBGOworCQlhZG1fcGFyYW1zLT5wYXJhbXMucGFyYW1fc2l6ZSA9CisJCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRik7CisJCWhwZl9wYXJhbXMgPSAoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGICopCisJCQkoKHU4ICopYWRtX3BhcmFtcyArCisJCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpKTsKKwkJbWVtY3B5KGhwZl9wYXJhbXMsIHNyc19wYXJhbXMsCisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGKSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNSU19JRF9BRVE6IHsKKwkJaW50ICp1cGRhdGVfcGFyYW1zX3B0ciA9IChpbnQgKil0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5rdmFkZHI7CisKKwkJb3V0YmFuZCA9IDE7CisJCWFkbV9wYXJhbXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCQlhZG1fcGFyYW1zXyA9IChzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1ICopYWRtX3BhcmFtczsKKwkJaWYgKCFhZG1fcGFyYW1zXykgeworCQkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc3ogPSBzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQUVRKTsKKwkJaWYgKHVwZGF0ZV9wYXJhbXNfcHRyID09IE5VTEwpIHsKKwkJCXByX2VycigiQURNX1NSU19UUlVNRURJQSAtICVzOiBudWxsIG1lbW1hcCBmb3IgQUVRIHBhcmFtc1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfQUVROworCQkqdXBkYXRlX3BhcmFtc19wdHIrKyA9IG1vZHVsZV9pZDsKKwkJKnVwZGF0ZV9wYXJhbXNfcHRyKysgPSBwYXJhbV9pZDsKKwkJKnVwZGF0ZV9wYXJhbXNfcHRyKysgPSBzejsKKwkJbWVtY3B5KHVwZGF0ZV9wYXJhbXNfcHRyLCBzcnNfcGFyYW1zLCBzeik7CisKKwkJYWRtX3BhcmFtc18tPnBheWxvYWRfc2l6ZSA9IHN6ICsgMTI7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgU1JTX0lEX0hMOiB7CisJCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMICpobF9wYXJhbXMgPSBOVUxMOworCisJCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwpOworCQlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYWRtX3BhcmFtcykgeworCQkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwpICsKKwkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfSEw7CisJCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITCk7CisJCWhsX3BhcmFtcyA9IChzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITCAqKQorCQkJKCh1OCAqKWFkbV9wYXJhbXMgKworCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSk7CisJCW1lbWNweShobF9wYXJhbXMsIHNyc19wYXJhbXMsCisJCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMKSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNSU19JRF9HRVE6IHsKKwkJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0VRICpnZXFfcGFyYW1zID0gTlVMTDsKKworCQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSkgKworCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUSk7CisJCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZG1fcGFyYW1zKSB7CisJCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEpICsKKwkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOworCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfR0VROworCQlhZG1fcGFyYW1zLT5wYXJhbXMucGFyYW1fc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0VRKTsKKwkJZ2VxX3BhcmFtcyA9IChzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEgKikKKwkJCSgodTggKilhZG1fcGFyYW1zICsKKwkJCXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSkpOworCQltZW1jcHkoZ2VxX3BhcmFtcywgc3JzX3BhcmFtcywKKwkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEpKTsKKwkJcHJfZGVidWcoIlNSUyAtICVzOiBHRVEgcGFyYW1zIHByZXBhcmVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlnb3RvIGZhaWxfY21kOworCX0KKworCWFkbV9wYXJhbXMtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7CisJYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPQorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJYWRtX3BhcmFtcy0+aGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhZG1fcGFyYW1zLT5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OworCWlmIChvdXRiYW5kICYmIHRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyKSB7CisJCWFkbV9wYXJhbXMtPmhkci5wa3Rfc2l6ZSA9CisJCQkJCXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KTsKKwkJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoCisJCQkJCQl0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkcik7CisJCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJCXRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyKTsKKwkJYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uCisJCQkJCW1lbV9tYXBfaGFuZGxlc1tBRE1fU1JTX1RSVU1FRElBXSk7CisJfSBlbHNlIHsKKwkJYWRtX3BhcmFtcy0+aGRyLnBrdF9zaXplID0gc3o7CisJCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9sc3cgPSAwOworCQlhZG1fcGFyYW1zLT5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwkJYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSAwOworCisJCWFkbV9wYXJhbXMtPnBhcmFtcy5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9pZCA9IHBhcmFtX2lkOworCQlhZG1fcGFyYW1zLT5wYXJhbXMucmVzZXJ2ZWQgPSAwOworCX0KKworCXByX2RlYnVnKCJTUlMgLSAlczogQ29tbWFuZCB3YXMgc2VudCBub3cgY2hlY2sgUTYgLSBwb3J0IGlkID0gJWQsIHNpemUgJWQsIG1vZHVsZSBpZCAleCwgcGFyYW0gaWQgJXguXG4iLAorCQkJX19mdW5jX18sIGFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQsCisJCQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUsIG1vZHVsZV9pZCwgcGFyYW1faWQpOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKilhZG1fcGFyYW1zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIlNSUyAtICVzOiBBRE0gZW5hYmxlIGZvciBwb3J0ICVkIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCQlwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogU1JTIHNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwlrZnJlZShhZG1fcGFyYW1zKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRtX3NldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlbyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCwgY2hhciAqcGFyYW1zLAorCQkJCSAgICB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKQoreworCXN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1ICphZG1fcGFyYW1zID0gTlVMTDsKKwlpbnQgc3osIHJjID0gMCwgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KSArCisJCXBhcmFtc19sZW5ndGg7CisJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghYWRtX3BhcmFtcykgeworCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsKKwkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KSksCisJCXBhcmFtcywgcGFyYW1zX2xlbmd0aCk7CisJYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKKwlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7CisJYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPSAwOyAvKiBJZ25vcmVkICovOworCWFkbV9wYXJhbXMtPmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7CisJYWRtX3BhcmFtcy0+aGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BTUERfTVRNWF9TVFJUUl9QQVJBTVNfVjU7CisJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX21zdyA9IDA7CisJYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSAwOworCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9IHBhcmFtc19sZW5ndGg7CisJLyogZGlyZWN0aW9uIFJYIGFzIDAgKi8KKwlhZG1fcGFyYW1zLT5kaXJlY3Rpb24gPSBBRE1fTUFUUklYX0lEX0FVRElPX1JYOworCS8qIHNlc3Npb24gaWQgZm9yIHRoaXMgY21kIHRvIGJlIGFwcGxpZWQgb24gKi8KKwlhZG1fcGFyYW1zLT5zZXNzaW9uaWQgPSBzZXNzaW9uX2lkOworCWFkbV9wYXJhbXMtPmRldmljZWlkID0KKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCWFkbV9wYXJhbXMtPnJlc2VydmVkID0gMDsKKwlwcl9kZWJ1ZygiJXM6IGRldmljZWlkICVkLCBzZXNzaW9uX2lkICVkLCBzcmNfcG9ydCAlZCwgZGVzdF9wb3J0ICVkXG4iLAorCQlfX2Z1bmNfXywgYWRtX3BhcmFtcy0+ZGV2aWNlaWQsIGFkbV9wYXJhbXMtPnNlc3Npb25pZCwKKwkJYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0LCBhZG1fcGFyYW1zLT5oZHIuZGVzdF9wb3J0KTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gMHgleCByYyAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBzZXRfc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fcmV0dXJuOworCX0KKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleFxuIiwgX19mdW5jX18sCisJCQlwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHNldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19yZXR1cm47CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLCBfX2Z1bmNfXywKKwkJCWFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAorCQkJJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gc2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX3JldHVybjsKKwl9CisJcmMgPSAwOworc2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX3JldHVybjoKKwlrZnJlZShhZG1fcGFyYW1zKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGNoYXIgKnBhcmFtcywKKwkJCSAgICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpCit7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NQkqYWRtX3BhcmFtcyA9IE5VTEw7CisJaW50IHN6LCByYyA9IDA7CisJaW50IHBvcnRfaWR4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSArIHBhcmFtc19sZW5ndGg7CisJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghYWRtX3BhcmFtcykgeworCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbWNweSgoKHU4ICopYWRtX3BhcmFtcyArIHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSksCisJCQlwYXJhbXMsIHBhcmFtc19sZW5ndGgpOworCWFkbV9wYXJhbXMtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKKwlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7CisJYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPQorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJYWRtX3BhcmFtcy0+aGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhZG1fcGFyYW1zLT5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OworCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9sc3cgPSAwOworCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9tc3cgPSAwOworCWFkbV9wYXJhbXMtPm1lbV9tYXBfaGFuZGxlID0gMDsKKwlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPSBwYXJhbXNfbGVuZ3RoOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wYXJhbXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9IDB4JXggcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZG9sYnlfZGFwX3NlbmRfcGFyYW1fcmV0dXJuOworCX0KKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbGJ5X2RhcF9zZW5kX3BhcmFtX3JldHVybjsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBkb2xieV9kYXBfc2VuZF9wYXJhbV9yZXR1cm47CisJfQorCXJjID0gMDsKK2RvbGJ5X2RhcF9zZW5kX3BhcmFtX3JldHVybjoKKwlrZnJlZShhZG1fcGFyYW1zKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhZG1fc2VuZF9wYXJhbXNfdjUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgY2hhciAqcGFyYW1zLAorCQkJICAgICAgdWludDMyX3QgcGFyYW1zX2xlbmd0aCkKK3sKKwlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1CSphZG1fcGFyYW1zID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBzeiwgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpICsgcGFyYW1zX2xlbmd0aDsKKwlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZG1fcGFyYW1zKSB7CisJCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpKSwKKwkJCXBhcmFtcywgcGFyYW1zX2xlbmd0aCk7CisJYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWFkbV9wYXJhbXMtPmhkci5wa3Rfc2l6ZSA9IHN6OworCWFkbV9wYXJhbXMtPmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1fcGFyYW1zLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcGFyYW1zLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhZG1fcGFyYW1zLT5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7CisJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX21zdyA9IDA7CisJYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSAwOworCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9IHBhcmFtc19sZW5ndGg7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gMHgleCByYyAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleFxuIiwKKwkJCSBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKKwl9CisJcmMgPSAwOworc2VuZF9wYXJhbV9yZXR1cm46CisJa2ZyZWUoYWRtX3BhcmFtcyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgYWRtX2dldF9wYXJhbXNfdjIoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgdWludDMyX3QgbW9kdWxlX2lkLAorCQkgICAgICB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgcGFyYW1zX2xlbmd0aCwKKwkJICAgICAgY2hhciAqcGFyYW1zLCB1aW50MzJfdCBjbGllbnRfaWQpCit7CisJc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSAqYWRtX3BhcmFtcyA9IE5VTEw7CisJaW50IHN6LCByYyA9IDAsIGkgPSAwOworCWludCBwb3J0X2lkeCwgaWR4OworCWludCAqcGFyYW1zX2RhdGEgPSAoaW50ICopcGFyYW1zOworCisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX2dldF9wcF9wYXJhbXNfdjUpICsgcGFyYW1zX2xlbmd0aDsKKwlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZG1fcGFyYW1zKSB7CisJCXByX2VycigiJXM6IGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhZG1fY21kX2dldF9wcF9wYXJhbXNfdjUpKSwKKwkJcGFyYW1zLCBwYXJhbXNfbGVuZ3RoKTsKKwlhZG1fcGFyYW1zLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYWRtX3BhcmFtcy0+aGRyLnBrdF9zaXplID0gc3o7CisJYWRtX3BhcmFtcy0+aGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcGFyYW1zLT5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlhZG1fcGFyYW1zLT5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOworCWFkbV9wYXJhbXMtPmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wYXJhbXMtPmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlhZG1fcGFyYW1zLT5oZHIuZGVzdF9wb3J0ID0KKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCWFkbV9wYXJhbXMtPmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY2xpZW50X2lkIDw8IDggfCBjb3BwX2lkeDsKKwlhZG1fcGFyYW1zLT5oZHIub3Bjb2RlID0gQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1OworCWFkbV9wYXJhbXMtPmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJYWRtX3BhcmFtcy0+ZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwlhZG1fcGFyYW1zLT5tZW1fbWFwX2hhbmRsZSA9IDA7CisJYWRtX3BhcmFtcy0+bW9kdWxlX2lkID0gbW9kdWxlX2lkOworCWFkbV9wYXJhbXMtPnBhcmFtX2lkID0gcGFyYW1faWQ7CisJYWRtX3BhcmFtcy0+cGFyYW1fbWF4X3NpemUgPSBwYXJhbXNfbGVuZ3RoOworCWFkbV9wYXJhbXMtPnJlc2VydmVkID0gMDsKKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisJcmMgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKilhZG1fcGFyYW1zKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBHZXQgUGFyYW1zIG9uIHBvcnRfaWQgMHgleCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBhZG1fZ2V0X3BhcmFtX3JldHVybjsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sCisJCQlwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGFkbV9nZXRfcGFyYW1fcmV0dXJuOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOworCQlnb3RvIGFkbV9nZXRfcGFyYW1fcmV0dXJuOworCX0KKwlpZHggPSBBRE1fR0VUX1BBUkFNRVRFUl9MRU5HVEggKiBjb3BwX2lkeDsKKworCWlmIChhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSA8IDApIHsKKwkJcHJfZXJyKCIlczogU2l6ZSBpcyBpbnZhbGlkICVkXG4iLCBfX2Z1bmNfXywKKwkJCWFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGFkbV9nZXRfcGFyYW1fcmV0dXJuOworCX0KKwlpZiAoKHBhcmFtc19kYXRhKSAmJgorCQkoQVJSQVlfU0laRShhZG1fZ2V0X3BhcmFtZXRlcnMpID4KKwkJaWR4KSAmJgorCQkoQVJSQVlfU0laRShhZG1fZ2V0X3BhcmFtZXRlcnMpID49CisJCTErYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0raWR4KSAmJgorCQkocGFyYW1zX2xlbmd0aC9zaXplb2YodWludDMyX3QpID49CisJCWFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF07IGkrKykKKwkJCXBhcmFtc19kYXRhW2ldID0gYWRtX2dldF9wYXJhbWV0ZXJzWzEraStpZHhdOworCisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogR2V0IHBhcmFtIGRhdGEgbm90IGNvcGllZCEgZ2V0X3BhcmFtIGFycmF5IHNpemUgJXpkLCBpbmRleCAlZCwgcGFyYW1zIGFycmF5IHNpemUgJXpkLCBpbmRleCAlZFxuIiwKKwkJX19mdW5jX18sIEFSUkFZX1NJWkUoYWRtX2dldF9wYXJhbWV0ZXJzKSwKKwkJKDErYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0raWR4KSwKKwkJcGFyYW1zX2xlbmd0aC9zaXplb2YoaW50KSwKKwkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0pOworCX0KKwlyYyA9IDA7CithZG1fZ2V0X3BhcmFtX3JldHVybjoKKwlrZnJlZShhZG1fcGFyYW1zKTsKKworCXJldHVybiByYzsKK30KKworaW50IGFkbV9nZXRfcGFyYW1zKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIHVpbnQzMl90IG1vZHVsZV9pZCwKKwkJICAgdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IHBhcmFtc19sZW5ndGgsIGNoYXIgKnBhcmFtcykKK3sKKwlyZXR1cm4gYWRtX2dldF9wYXJhbXNfdjIocG9ydF9pZCwgY29wcF9pZHgsIG1vZHVsZV9pZCwgcGFyYW1faWQsCisJCQkJIHBhcmFtc19sZW5ndGgsIHBhcmFtcywgMCk7Cit9CisKK2ludCBhZG1fZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3QoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50MzJfdCBwYXJhbV9sZW5ndGgsCisJCQkJY2hhciAqcGFyYW1zKQoreworCXN0cnVjdCBhZG1fY21kX2dldF9wcF90b3BvX21vZHVsZV9saXN0X3QgKmFkbV9wcF9tb2R1bGVfbGlzdCA9IE5VTEw7CisJaW50IHN6LCByYyA9IDAsIGkgPSAwOworCWludCBwb3J0X2lkeCwgaWR4OworCWludDMyX3QgKnBhcmFtc19kYXRhID0gKGludDMyX3QgKilwYXJhbXM7CisJaW50ICp0b3BvX2xpc3Q7CisKKwlwcl9kZWJ1ZygiJXMgOiBwb3J0X2lkICV4IiwgX19mdW5jX18sIHBvcnRfaWQpOworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3RfdCkgKyBwYXJhbV9sZW5ndGg7CisJYWRtX3BwX21vZHVsZV9saXN0ID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZG1fcHBfbW9kdWxlX2xpc3QpIHsKKwkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoKCh1OCAqKWFkbV9wcF9tb2R1bGVfbGlzdCArCisJCXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdF90KSksCisJCXBhcmFtcywgcGFyYW1fbGVuZ3RoKTsKKwlhZG1fcHBfbW9kdWxlX2xpc3QtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1fcHBfbW9kdWxlX2xpc3QtPmhkci5wa3Rfc2l6ZSA9IHN6OworCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcHBfbW9kdWxlX2xpc3QtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1fcHBfbW9kdWxlX2xpc3QtPmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhZG1fcHBfbW9kdWxlX2xpc3QtPmhkci50b2tlbiA9ICBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLm9wY29kZSA9IEFETV9DTURfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1Q7CisJYWRtX3BwX21vZHVsZV9saXN0LT5wYXJhbV9tYXhfc2l6ZSA9IHBhcmFtX2xlbmd0aDsKKwkvKiBQYXlsb2FkIGFkZHJlc3MgYW5kIG1tYXAgaGFuZGxlIHNldCB0byB6ZXJvIGJ5IGt6YWxsb2MgKi8KKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wcF9tb2R1bGVfbGlzdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gR2V0IFBhcmFtcyBvbiBwb3J0ICVkXG4iLCBfX2Z1bmNfXywKKwkJCXBvcnRfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gYWRtX3BwX21vZHVsZV9saXN0X2w7CisJfQorCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayB3aXRoIGNvcHAgaWQgKi8KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IGdldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlZFxuIiwgX19mdW5jX18sCisJCQlwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGFkbV9wcF9tb2R1bGVfbGlzdF9sOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOworCQlnb3RvIGFkbV9wcF9tb2R1bGVfbGlzdF9sOworCX0KKwlpZiAocGFyYW1zX2RhdGEpIHsKKwkJaWR4ID0gQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCAqIGNvcHBfaWR4OworCQl0b3BvX2xpc3QgPSAoaW50ICopKGFkbV9tb2R1bGVfdG9wb19saXN0ICsgaWR4KTsKKwkJaWYgKHBhcmFtX2xlbmd0aCA8PSBBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIICYmCisJCQlpZHggPAorCQkJKE1BWF9DT1BQU19QRVJfUE9SVCAqIEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgpKQorCQkJbWVtY3B5KHBhcmFtc19kYXRhLCB0b3BvX2xpc3QsIHBhcmFtX2xlbmd0aCk7CisJCWVsc2UKKwkJCXByX2RlYnVnKCIlczogaS9wIHNpemU6JWQgPiBNQVggcGFyYW0gc2l6ZTolZFxuIiwKKwkJCQkgX19mdW5jX18sIHBhcmFtX2xlbmd0aCwKKwkJCQkgKGludClBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIKTsKKwkJZm9yIChpID0gMTsgaSA8PSBwYXJhbXNfZGF0YVswXTsgaSsrKQorCQkJcHJfZGVidWcoIm1vZHVsZSA9IDB4JXhcbiIsIHBhcmFtc19kYXRhW2ldKTsKKwl9CisJcmMgPSAwOworYWRtX3BwX21vZHVsZV9saXN0X2w6CisJa2ZyZWUoYWRtX3BwX21vZHVsZV9saXN0KTsKKwlwcl9kZWJ1ZygiJXMgOiByYyA9ICVkICIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIHZvaWQgYWRtX2NhbGxiYWNrX2RlYnVnX3ByaW50KHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEpCit7CisJdWludDMyX3QgKnBheWxvYWQ7CisKKwlwYXlsb2FkID0gZGF0YS0+cGF5bG9hZDsKKworCWlmIChkYXRhLT5wYXlsb2FkX3NpemUgPj0gOCkKKwkJcHJfZGVidWcoIiVzOiBjb2RlID0gMHgleCBQTCMwWzB4JXhdLCBQTCMxWzB4JXhdLCBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLAorCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwllbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgPj0gNCkKKwkJcHJfZGVidWcoIiVzOiBjb2RlID0gMHgleCBQTCMwWzB4JXhdLCBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLCBwYXlsb2FkWzBdLAorCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogY29kZSA9IDB4JXgsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIGRhdGEtPnBheWxvYWRfc2l6ZSk7Cit9CisKK2ludCBhZG1fc2V0X211bHRpX2NoX21hcChjaGFyICpjaGFubmVsX21hcCwgaW50IHBhdGgpCit7CisJaW50IGlkeDsKKworCWlmIChwYXRoID09IEFETV9QQVRIX1BMQVlCQUNLKSB7CisJCWlkeCA9IEFETV9NQ0hfTUFQX0lEWF9QTEFZQkFDSzsKKwl9IGVsc2UgaWYgKHBhdGggPT0gQURNX1BBVEhfTElWRV9SRUMpIHsKKwkJaWR4ID0gQURNX01DSF9NQVBfSURYX1JFQzsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGF0dGVtcHQgdG8gc2V0IHBhdGggJWRcbiIsIF9fZnVuY19fLCBwYXRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtY3B5KG11bHRpX2NoX21hcHNbaWR4XS5jaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQlQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisJbXVsdGlfY2hfbWFwc1tpZHhdLnNldF9jaGFubmVsX21hcCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFkbV9nZXRfbXVsdGlfY2hfbWFwKGNoYXIgKmNoYW5uZWxfbWFwLCBpbnQgcGF0aCkKK3sKKwlpbnQgaWR4OworCisJaWYgKHBhdGggPT0gQURNX1BBVEhfUExBWUJBQ0spIHsKKwkJaWR4ID0gQURNX01DSF9NQVBfSURYX1BMQVlCQUNLOworCX0gZWxzZSBpZiAocGF0aCA9PSBBRE1fUEFUSF9MSVZFX1JFQykgeworCQlpZHggPSBBRE1fTUNIX01BUF9JRFhfUkVDOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGludmFsaWQgYXR0ZW1wdCB0byBnZXQgcGF0aCAlZFxuIiwgX19mdW5jX18sIHBhdGgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobXVsdGlfY2hfbWFwc1tpZHhdLnNldF9jaGFubmVsX21hcCkgeworCQltZW1jcHkoY2hhbm5lbF9tYXAsIG11bHRpX2NoX21hcHNbaWR4XS5jaGFubmVsX21hcHBpbmcsCisJCSAgICAgICBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IGFkbV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXVpbnQzMl90ICpwYXlsb2FkOworCWludCBpLCBqLCBwb3J0X2lkeCwgY29wcF9pZHgsIGlkeCwgY2xpZW50X2lkOworCisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBkYXRhIHBhcmFtZXRlciBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOworCisJaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKKwkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCBpcyByZWNlaXZlZDogJWQgJWQgYXByWyVwS11cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWRhdGEtPnJlc2V0X2V2ZW50LCBkYXRhLT5yZXNldF9wcm9jLCB0aGlzX2FkbS5hcHIpOworCQlpZiAodGhpc19hZG0uYXByKSB7CisJCQlhcHJfcmVzZXQodGhpc19hZG0uYXByKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBRkVfTUFYX1BPUlRTOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBqKyspIHsKKwkJCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5pZFtpXVtqXSwKKwkJCQkJCSAgIFJFU0VUX0NPUFBfSUQpOworCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNudFtpXVtqXSwgMCk7CisJCQkJCWF0b21pY19zZXQoCisJCQkJCSAgICZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W2ldW2pdLCAwKTsKKwkJCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5tb2RlW2ldW2pdLAorCQkJCQkJICAgMCk7CisJCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtpXVtqXSwKKwkJCQkJCSAgIDApOworCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnJhdGVbaV1bal0sCisJCQkJCQkgICAwKTsKKwkJCQkJYXRvbWljX3NldCgKKwkJCQkJJnRoaXNfYWRtLmNvcHAuY2hhbm5lbHNbaV1bal0sCisJCQkJCQkgICAwKTsKKwkJCQkJYXRvbWljX3NldCgKKwkJCQkJICAgICZ0aGlzX2FkbS5jb3BwLmJpdF93aWR0aFtpXVtqXSwgMCk7CisJCQkJCWF0b21pY19zZXQoCisJCQkJCSAgICAmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtpXVtqXSwgMCk7CisJCQkJCWF0b21pY19zZXQoCisJCQkJCSAgICZ0aGlzX2FkbS5jb3BwLmFjZGJfaWRbaV1bal0sIDApOworCQkJCQl0aGlzX2FkbS5jb3BwLmFkbV9zdGF0dXNbaV1bal0gPQorCQkJCQkJQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRDsKKwkJCQl9CisJCQl9CisJCQl0aGlzX2FkbS5hcHIgPSBOVUxMOworCQkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoQURNX01BWF9DQUxfVFlQRVMsCisJCQkJdGhpc19hZG0uY2FsX2RhdGEpOworCQkJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGEKKwkJCQlbQURNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7CisJCQl0aGlzX2FkbS5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKKwkJCW11dGV4X3VubG9jaygmdGhpc19hZG0uY2FsX2RhdGFbCisJCQkJQURNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7CisJCQlydGFjX2NsZWFyX21hcHBpbmcoQURNX1JUQUNfQ0FMKTsKKwkJCS8qCisJCQkgKiBGcmVlIHRoZSBJT04gbWVtb3J5IGFuZCBjbGVhciB0aGUgbWFwIGhhbmRsZXMKKwkJCSAqIGZvciBTb3VyY2UgVHJhY2tpbmcKKwkJCSAqLworCQkJaWYgKHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIgIT0gMCkgeworCQkJCW1zbV9hdWRpb19pb25fZnJlZSgKKwkJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9jbGllbnQsCisJCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlKTsKKwkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2NsaWVudCA9IE5VTEw7CisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9oYW5kbGUgPSBOVUxMOworCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7CisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5rdmFkZHIgPQorCQkJCQkJCQkJIE5VTEw7CisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciA9IDA7CisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzID0gLTE7CisJCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzWworCQkJCQlBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddLCAwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlhZG1fY2FsbGJhY2tfZGVidWdfcHJpbnQoZGF0YSk7CisJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSkgeworCQljb3BwX2lkeCA9IChkYXRhLT50b2tlbikgJiAwWEZGOworCQlwb3J0X2lkeCA9ICgoZGF0YS0+dG9rZW4pID4+IDE2KSAmIDB4RkY7CisJCWNsaWVudF9pZCA9ICgoZGF0YS0+dG9rZW4pID4+IDgpICYgMHhGRjsKKwkJaWYgKHBvcnRfaWR4IDwgMCB8fCBwb3J0X2lkeCA+PSBBRkVfTUFYX1BPUlRTKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHRva2VuICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkeCwgZGF0YS0+dG9rZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgY29wcCBpZHggJWQgdG9rZW4gJWRcbiIsCisJCQkJX19mdW5jX18sIGNvcHBfaWR4LCBkYXRhLT50b2tlbik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY2xpZW50X2lkIDwgMCB8fCBjbGllbnRfaWQgPj0gQURNX0NMSUVOVF9JRF9NQVgpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgY2xpZW50IGlkICVkXG4iLCBfX2Z1bmNfXywKKwkJCQljbGllbnRfaWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgeworCQkJcHJfZGVidWcoIiVzOiBBUFJfQkFTSUNfUlNQX1JFU1VMVCBpZCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKKwkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBjbWQgPSAweCV4IHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOworCQkJfQorCQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7CisJCQljYXNlIEFETV9DTURfU0VUX1BQX1BBUkFNU19WNToKKwkJCQlwcl9kZWJ1ZygiJXM6IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWlmIChjbGllbnRfaWQgPT0gQURNX0NMSUVOVF9JRF9TT1VSQ0VfVFJBQ0tJTkcpCisJCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS4KKwkJCQkJCWFwcl9jbWRfc3RhdHVzID0gcGF5bG9hZFsxXTsKKwkJCQllbHNlIGlmIChydGFjX21ha2VfYWRtX2NhbGxiYWNrKHBheWxvYWQsCisJCQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKSkKKwkJCQkJYnJlYWs7CisJCQkJLyoKKwkJCQkgKiBpZiBzb2Z0IHZvbHVtZSBpcyBjYWxsZWQgYW5kIGFscmVhZHkKKwkJCQkgKiBpbnRlcnJ1cHRlZCBicmVhayBvdXQgb2YgdGhlIHNlcXVlbmNlIGhlcmUKKwkJCQkgKi8KKwkJCWNhc2UgQURNX0NNRF9ERVZJQ0VfT1BFTl9WNToKKwkJCWNhc2UgQURNX0NNRF9ERVZJQ0VfQ0xPU0VfVjU6CisJCQkJcHJfZGVidWcoIiVzOiBCYXNpYyBjYWxsYmFjayByZWNlaXZlZCwgd2FrZSB1cC5cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdCisJCQkJCQlbY29wcF9pZHhdLCBwYXlsb2FkWzFdKTsKKwkJCQl3YWtlX3VwKAorCQkJCSZ0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFETV9DTURfQUREX1RPUE9MT0dJRVM6CisJCQkJcHJfZGVidWcoIiVzOiBjYWxsYmFjayByZWNlaXZlZCwgQURNX0NNRF9BRERfVE9QT0xPR0lFUy5cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgcGF5bG9hZFsxXSk7CisJCQkJd2FrZV91cCgmdGhpc19hZG0uYWRtX3dhaXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRE1fQ01EX01BVFJJWF9NQVBfUk9VVElOR1NfVjU6CisJCQljYXNlIEFETV9DTURfU1RSRUFNX0RFVklDRV9NQVBfUk9VVElOR1NfVjU6CisJCQkJcHJfZGVidWcoIiVzOiBCYXNpYyBjYWxsYmFjayByZWNlaXZlZCwgd2FrZSB1cC5cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3N0YXQsCisJCQkJCXBheWxvYWRbMV0pOworCQkJCXdha2VfdXAoJnRoaXNfYWRtLm1hdHJpeF9tYXBfd2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFETV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOgorCQkJCXByX2RlYnVnKCIlczogQURNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlNcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgcGF5bG9hZFsxXSk7CisJCQkJd2FrZV91cCgmdGhpc19hZG0uYWRtX3dhaXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6CisJCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlNcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQkvKiBTaG91bGQgb25seSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYW4gQVBSICovCisJCQkJLyogZXJyb3Igb3IgbWFsZm9ybWVkIEFQUiBwYWNrZXQuIE90aGVyd2lzZSAqLworCQkJCS8qIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgKi8KKwkJCQlpZiAocGF5bG9hZFsxXSAhPSAwKSB7CisJCQkJCXByX2VycigiJXM6IEFETSBtYXAgZXJyb3IsIHJlc3VtaW5nXG4iLAorCQkJCQkJX19mdW5jX18pOworCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwKKwkJCQkJCXBheWxvYWRbMV0pOworCQkJCQl3YWtlX3VwKCZ0aGlzX2FkbS5hZG1fd2FpdCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjU6CisJCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQkvKiBTaG91bGQgb25seSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYW4gQVBSICovCisJCQkJLyogZXJyb3Igb3IgbWFsZm9ybWVkIEFQUiBwYWNrZXQuIE90aGVyd2lzZSAqLworCQkJCS8qIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgKi8KKwkJCQkvKiBBRE1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjUgKi8KKwkJCQlpZiAoY2xpZW50X2lkID09CisJCQkJCUFETV9DTElFTlRfSURfU09VUkNFX1RSQUNLSU5HKSB7CisJCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS4KKwkJCQkJCWFwcl9jbWRfc3RhdHVzID0gcGF5bG9hZFsxXTsKKwkJCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkKKwkJCQkJCXByX2VycigiJXM6IEFETSBnZXQgcGFyYW0gZXJyb3IgPSAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFsxXSk7CisKKwkJCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCQkJCXBheWxvYWRbMV0pOworCQkJCQl3YWtlX3VwKCZ0aGlzX2FkbS5jb3BwLndhaXQKKwkJCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkgeworCQkJCQkJcHJfZXJyKCIlczogQURNIGdldCBwYXJhbSBlcnJvciA9ICVkLCByZXN1bWluZ1xuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFsxXSk7CisKKwkJCQkJCXJ0YWNfbWFrZV9hZG1fY2FsbGJhY2socGF5bG9hZCwKKwkJCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBBRE1fQ01EX1NFVF9QU1BEX01UTVhfU1RSVFJfUEFSQU1TX1Y1OgorCQkJCXByX2RlYnVnKCIlczogQURNX0NNRF9TRVRfUFNQRF9NVE1YX1NUUlRSX1BBUkFNU19WNVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF0KKwkJCQkJCVtjb3BwX2lkeF0sIHBheWxvYWRbMV0pOworCQkJCXdha2VfdXAoCisJCQkJJnRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQURNX0NNRF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVDoKKwkJCQlwcl9kZWJ1ZygiJXM6QURNX0NNRF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVFxuIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCQlpZiAocGF5bG9hZFsxXSAhPSAwKQorCQkJCQlwcl9lcnIoIiVzOiBBRE0gZ2V0IHRvcG8gbGlzdCBlcnJvciA9ICVkLFxuIiwKKwkJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzFdKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZXJyKCIlczogVW5rbm93biBDbWQ6IDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCQkJCQlwYXlsb2FkWzBdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisKKwkJc3dpdGNoIChkYXRhLT5vcGNvZGUpIHsKKwkJY2FzZSBBRE1fQ01EUlNQX0RFVklDRV9PUEVOX1Y1OiB7CisJCQlzdHJ1Y3QgYWRtX2NtZF9yc3BfZGV2aWNlX29wZW5fdjUgKm9wZW4gPQorCQkJKHN0cnVjdCBhZG1fY21kX3JzcF9kZXZpY2Vfb3Blbl92NSAqKWRhdGEtPnBheWxvYWQ7CisKKwkJCWlmIChvcGVuLT5jb3BwX2lkID09IElOVkFMSURfQ09QUF9JRCkgeworCQkJCXByX2VycigiJXM6IGludmFsaWQgY29wcGlkIHJ4ZWQgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBvcGVuLT5jb3BwX2lkKTsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdCisJCQkJCQlbY29wcF9pZHhdLCBBRFNQX0VCQURQQVJBTSk7CisJCQkJd2FrZV91cCgKKwkJCQkmdGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCQkJCWJyZWFrOworCQkJfQorCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0sIHBheWxvYWRbMF0pOworCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQkJCSAgIG9wZW4tPmNvcHBfaWQpOworCQkJcHJfZGVidWcoIiVzOiBjb3BwaWQgcnhlZD0lZFxuIiwgX19mdW5jX18sCisJCQkJIG9wZW4tPmNvcHBfaWQpOworCQkJd2FrZV91cCgmdGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQURNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1Y1OgorCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjVcbiIsIF9fZnVuY19fKTsKKwkJCWlmIChwYXlsb2FkWzBdICE9IDApCisJCQkJcHJfZXJyKCIlczogQURNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1Y1IHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0pOworCQkJaWYgKGNsaWVudF9pZCA9PSBBRE1fQ0xJRU5UX0lEX1NPVVJDRV9UUkFDS0lORykKKwkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMgPQorCQkJCQkJCQlwYXlsb2FkWzBdOworCQkJZWxzZSBpZiAocnRhY19tYWtlX2FkbV9jYWxsYmFjayhwYXlsb2FkLAorCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQorCQkJCWJyZWFrOworCisJCQlpZHggPSBBRE1fR0VUX1BBUkFNRVRFUl9MRU5HVEggKiBjb3BwX2lkeDsKKwkJCWlmICgocGF5bG9hZFswXSA9PSAwKSAmJiAoZGF0YS0+cGF5bG9hZF9zaXplID4KKwkJCQkoNCAqIHNpemVvZigqcGF5bG9hZCkpKSAmJgorCQkJCShkYXRhLT5wYXlsb2FkX3NpemUgLSA0ID49CisJCQkJcGF5bG9hZFszXSkgJiYKKwkJCQkoQVJSQVlfU0laRShhZG1fZ2V0X3BhcmFtZXRlcnMpID4KKwkJCQlpZHgpICYmCisJCQkJKEFSUkFZX1NJWkUoYWRtX2dldF9wYXJhbWV0ZXJzKS1pZHgtMSA+PQorCQkJCXBheWxvYWRbM10pKSB7CisJCQkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0gPSBwYXlsb2FkWzNdIC8KKwkJCQkJCQlzaXplb2YodWludDMyX3QpOworCQkJCS8qCisJCQkJICogcGF5bG9hZFszXSBpcyBwYXJhbV9zaXplIHdoaWNoIGlzCisJCQkJICogZXhwcmVzc2VkIGluIG51bWJlciBvZiBieXRlcworCQkJCSAqLworCQkJCXByX2RlYnVnKCIlczogR0VUX1BQIFBBUkFNOnJlY2VpdmVkIHBhcmFtZXRlciBsZW5ndGg6IDB4JXhcbiIsCisJCQkJCV9fZnVuY19fLCBhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSk7CisJCQkJLyogc3RvcmluZyBwYXJhbSBzaXplIHRoZW4gcGFyYW1zICovCisJCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRbM10gLworCQkJCQkJc2l6ZW9mKHVpbnQzMl90KTsgaSsrKQorCQkJCQlhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4KzEraV0gPQorCQkJCQkJCXBheWxvYWRbNCtpXTsKKwkJCX0gZWxzZSBpZiAocGF5bG9hZFswXSA9PSAwKSB7CisJCQkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0gPSAtMTsKKwkJCQlwcl9lcnIoIiVzOiBPdXQgb2YgYmFuZCBjYXNlLCBzZXR0aW5nIHNpemUgdG8gJWRcbiIsCisJCQkJCV9fZnVuY19fLCBhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSk7CisJCQl9IGVsc2UgeworCQkJCWFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdID0gLTE7CisJCQkJcHJfZXJyKCIlczogR0VUX1BQX1BBUkFNUyBmYWlsZWQsIHNldHRpbmcgc2l6ZSB0byAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdKTsKKwkJCX0KKwkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdLCBwYXlsb2FkWzBdKTsKKwkJCXdha2VfdXAoJnRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwkJCWJyZWFrOworCQljYXNlIEFETV9DTURSU1BfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1Q6CisJCQlwcl9kZWJ1ZygiJXM6IEFETV9DTURSU1BfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1RcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJCWlmIChwYXlsb2FkWzBdICE9IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBBRE1fQ01EUlNQX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCQlwcl9lcnIoIjplcnIgPSAweCV4XG4iLCBwYXlsb2FkWzBdKTsKKwkJCX0gZWxzZSBpZiAocGF5bG9hZFsxXSA+CisJCQkJICAgKChBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIIC8KKwkJCQkgICBzaXplb2YodWludDMyX3QpKSAtIDEpKSB7CisJCQkJcHJfZXJyKCIlczogQURNX0NNRFJTUF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVCIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJcHJfZXJyKCI6c2l6ZSA9ICVkXG4iLCBwYXlsb2FkWzFdKTsKKwkJCX0gZWxzZSB7CisJCQkJaWR4ID0gQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCAqCisJCQkJCWNvcHBfaWR4OworCQkJCXByX2RlYnVnKCIlczpOdW0gbW9kdWxlcyBwYXlsb2FkWzFdICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHBheWxvYWRbMV0pOworCQkJCWFkbV9tb2R1bGVfdG9wb19saXN0W2lkeF0gPSBwYXlsb2FkWzFdOworCQkJCWZvciAoaSA9IDE7IGkgPD0gcGF5bG9hZFsxXTsgaSsrKSB7CisJCQkJCWFkbV9tb2R1bGVfdG9wb19saXN0W2lkeCtpXSA9CisJCQkJCQlwYXlsb2FkWzEraV07CisJCQkJCXByX2RlYnVnKCIlczpwYXlsb2FkWyVkXSA9ICV4XG4iLAorCQkJCQkJIF9fZnVuY19fLCAoaSsxKSwgcGF5bG9hZFsxK2ldKTsKKwkJCQl9CisJCQl9CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSwgcGF5bG9hZFswXSk7CisJCQl3YWtlX3VwKCZ0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJCQlicmVhazsKKwkJY2FzZSBBRE1fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6CisJCQlwcl9kZWJ1ZygiJXM6IEFETV9DTURSU1BfU0hBUkVEX01FTV9NQVBfUkVHSU9OU1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCisJCQkJICAgYXRvbWljX3JlYWQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgpXSwKKwkJCQkgICAqcGF5bG9hZCk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgMCk7CisJCQl3YWtlX3VwKCZ0aGlzX2FkbS5hZG1fd2FpdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiJXM6IFVua25vd24gY21kOjB4JXhcbiIsIF9fZnVuY19fLAorCQkJCWRhdGEtPm9wY29kZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZG1fbWVtb3J5X21hcF9yZWdpb25zKHBoeXNfYWRkcl90ICpidWZfYWRkLCB1aW50MzJfdCBtZW1wb29sX2lkLAorCQkJICAgdWludDMyX3QgKmJ1ZnN6LCB1aW50MzJfdCBidWZjbnQpCit7CisJc3RydWN0ICBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKm1tYXBfcmVnaW9ucyA9IE5VTEw7CisJc3RydWN0ICBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqbXJlZ2lvbnMgPSBOVUxMOworCXZvaWQgICAgKm1tYXBfcmVnaW9uX2NtZCA9IE5VTEw7CisJdm9pZCAgICAqcGF5bG9hZCA9IE5VTEw7CisJaW50ICAgICByZXQgPSAwOworCWludCAgICAgaSA9IDA7CisJaW50ICAgICBjbWRfc2l6ZSA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWRtLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRE0iLCBhZG1fY2FsbGJhY2ssCisJCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZG0pOworCQlpZiAodGhpc19hZG0uYXByID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRE1cbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJ0YWNfc2V0X2FkbV9oYW5kbGUodGhpc19hZG0uYXByKTsKKwl9CisKKwljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQorCQkJKyBzaXplb2Yoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkKQorCQkJKiBidWZjbnQ7CisKKwltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1tYXBfcmVnaW9uX2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbWFwX3JlZ2lvbnMgPSAoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqKW1tYXBfcmVnaW9uX2NtZDsKKwltbWFwX3JlZ2lvbnMtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCQkJQVBSX1BLVF9WRVIpOworCW1tYXBfcmVnaW9ucy0+aGRyLnBrdF9zaXplID0gY21kX3NpemU7CisJbW1hcF9yZWdpb25zLT5oZHIuc3JjX3BvcnQgPSAwOworCisJbW1hcF9yZWdpb25zLT5oZHIuZGVzdF9wb3J0ID0gMDsKKwltbWFwX3JlZ2lvbnMtPmhkci50b2tlbiA9IDA7CisJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOworCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0wgJiAweDAwZmY7CisJbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudCAmIDB4MDBmZjsKKwltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCisJcHJfZGVidWcoIiVzOiBtYXBfcmVnaW9ucy0+bnVtX3JlZ2lvbnMgPSAlZFxuIiwgX19mdW5jX18sCisJCQkJbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyk7CisJcGF5bG9hZCA9ICgodTggKikgbW1hcF9yZWdpb25fY21kICsKKwkJCQlzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOworCW1yZWdpb25zID0gKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqKXBheWxvYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmY250OyBpKyspIHsKKwkJbXJlZ2lvbnMtPnNobV9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2FkZFtpXSk7CisJCW1yZWdpb25zLT5zaG1fYWRkcl9tc3cgPQorCQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRbaV0pOworCQltcmVnaW9ucy0+bWVtX3NpemVfYnl0ZXMgPSBidWZzeltpXTsKKwkJKyttcmVnaW9uczsKKwl9CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgLTEpOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSBtbWFwX3JlZ2lvbl9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1tYXBfcmVnaW9ucyBvcFsweCV4XXJjWyVkXVxuIiwgX19mdW5jX18sCisJCQkJCW1tYXBfcmVnaW9ucy0+aGRyLm9wY29kZSwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uYWRtX3dhaXQsCisJCQkJIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPj0gMCwKKwkJCQkgNSAqIEhaKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeV9tYXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CitmYWlsX2NtZDoKKwlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRtX21lbW9yeV91bm1hcF9yZWdpb25zKHZvaWQpCit7CisJc3RydWN0ICBhdnNfY21kX3NoYXJlZF9tZW1fdW5tYXBfcmVnaW9ucyB1bm1hcF9yZWdpb25zOworCWludCAgICAgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKwlpZiAodGhpc19hZG0uYXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVubWFwX3JlZ2lvbnMuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJCUFQUl9QS1RfVkVSKTsKKwl1bm1hcF9yZWdpb25zLmhkci5wa3Rfc2l6ZSA9IHNpemVvZih1bm1hcF9yZWdpb25zKTsKKwl1bm1hcF9yZWdpb25zLmhkci5zcmNfcG9ydCA9IDA7CisJdW5tYXBfcmVnaW9ucy5oZHIuZGVzdF9wb3J0ID0gMDsKKwl1bm1hcF9yZWdpb25zLmhkci50b2tlbiA9IDA7CisJdW5tYXBfcmVnaW9ucy5oZHIub3Bjb2RlID0gQURNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM7CisJdW5tYXBfcmVnaW9ucy5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS4KKwkJbWVtX21hcF9oYW5kbGVzW2F0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4KV0pOworCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LCAtMSk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopICZ1bm1hcF9yZWdpb25zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCXVubWFwX3JlZ2lvbnMuaGRyLm9wY29kZSwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uYWRtX3dhaXQsCisJCQkJIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPj0gMCwKKwkJCQkgNSAqIEhaKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeV91bm1hcFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IFVubWFwIGhhbmRsZSAweCV4IHN1Y2NlZWRlZFxuIiwgX19mdW5jX18sCisJCQkgdW5tYXBfcmVnaW9ucy5tZW1fbWFwX2hhbmRsZSk7CisJfQorZmFpbF9jbWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZW1hcF9jYWxfZGF0YShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgaW50IGNhbF9pbmRleCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBObyBJT04gYWxsb2NhdGlvbiBmb3IgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKKwkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgsIGNhbF9pbmRleCk7CisJCXJldCA9IGFkbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsIDAsCisJCQkJKHVpbnQzMl90ICopJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogQURNIG1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkIHJldCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCByZXQpOworCQkJcHJfZGVidWcoIiVzOiBBRE0gbW1hcCBkaWQgbm90IHdvcmshIGFkZHIgPSAweCVwSywgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCisJCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS4KKwkJCW1lbV9tYXBfaGFuZGxlc1tjYWxfaW5kZXhdKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfYWRtX2N1c3RvbV90b3BvbG9neSh2b2lkKQoreworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgY21kX3NldF90b3BvbG9naWVzIGFkbV90b3A7CisJaW50IGNhbF9pbmRleCA9IEFETV9DVVNUT01fVE9QX0NBTDsKKwlpbnQgcmVzdWx0OworCisJaWYgKHRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7CisJaWYgKCF0aGlzX2FkbS5zZXRfY3VzdG9tX3RvcG9sb2d5KQorCQlnb3RvIHVubG9jazsKKwl0aGlzX2FkbS5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMDsKKworCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2sodGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIHVubG9jazsKKworCXByX2RlYnVnKCIlczogU2VuZGluZyBjYWxfaW5kZXggJWRcbiIsIF9fZnVuY19fLCBjYWxfaW5kZXgpOworCisJcmVzdWx0ID0gcmVtYXBfY2FsX2RhdGEoY2FsX2Jsb2NrLCBjYWxfaW5kZXgpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOworCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaGFuZGxlc1tjYWxfaW5kZXhdLAorCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBBRE0gY2FsIHRvIHNlbmRcbiIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJYWRtX3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJQVBSX0hEUl9MRU4oMjApLCBBUFJfUEtUX1ZFUik7CisJYWRtX3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2YoYWRtX3RvcCk7CisJYWRtX3RvcC5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV90b3AuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJYWRtX3RvcC5oZHIuc3JjX3BvcnQgPSAwOworCWFkbV90b3AuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3RvcC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJYWRtX3RvcC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlhZG1fdG9wLmhkci50b2tlbiA9IDA7CisJYWRtX3RvcC5oZHIub3Bjb2RlID0gQURNX0NNRF9BRERfVE9QT0xPR0lFUzsKKwlhZG1fdG9wLnBheWxvYWRfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWFkbV90b3AucGF5bG9hZF9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAorCQkJCQkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJYWRtX3RvcC5tZW1fbWFwX2hhbmRsZSA9IGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOworCWFkbV90b3AucGF5bG9hZF9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uYWRtX3N0YXQsIC0xKTsKKwlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgQURNX0NNRF9BRERfVE9QT0xPR0lFUyBwYXlsb2FkID0gMHglcEssIHNpemUgPSAlZFxuIiwKKwkJX19mdW5jX18sICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQlhZG1fdG9wLnBheWxvYWRfc2l6ZSk7CisJcmVzdWx0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmFkbV90b3ApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCB0b3BvbG9naWVzIGZhaWxlZCBwYXlsb2FkIHNpemUgPSAlemQgcmVzdWx0ICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwgcmVzdWx0KTsKKwkJZ290byB1bmxvY2s7CisJfQorCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLworCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5hZG1fd2FpdCwKKwkJCQkgICAgYXRvbWljX3JlYWQoJnRoaXNfYWRtLmFkbV9zdGF0KSA+PSAwLAorCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJlc3VsdCkgeworCQlwcl9lcnIoIiVzOiBTZXQgdG9wb2xvZ2llcyB0aW1lZCBvdXQgcGF5bG9hZCBzaXplID0gJXpkXG4iLAorCQkJX19mdW5jX18sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7CisJCWdvdG8gdW5sb2NrOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmFkbV9zdGF0KSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmFkbV9zdGF0KSkpOworCQlyZXN1bHQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkpOworCQlnb3RvIHVubG9jazsKKwl9Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHNlbmRfYWRtX2NhbF9ibG9jayhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJICAgICAgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssIGludCBwZXJmX21vZGUsCisJCQkgICAgICBpbnQgYXBwX3R5cGUsIGludCBhY2RiX2lkLCBpbnQgc2FtcGxlX3JhdGUpCit7CisJczMyIHJlc3VsdCA9IDA7CisJc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NQlhZG1fcGFyYW1zOworCWludCBwb3J0X2lkeDsKKworCXByX2RlYnVnKCIlczogUG9ydCBpZCAweCV4IHNhbXBsZV9yYXRlICVkICxcbiIsIF9fZnVuY19fLAorCQkJcG9ydF9pZCwgc2FtcGxlX3JhdGUpOworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFjYWxfYmxvY2spIHsKKwkJcHJfZGVidWcoIiVzOiBObyBBRE0gY2FsIHRvIHNlbmQgZm9yIHBvcnRfaWQgPSAweCV4IVxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBBRE0gY2FsIHNlbmQgZm9yIHBvcnRfaWQgPSAweCV4IVxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChwZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFICYmCisJCSgoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSkpID09CisJCQlEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpKSB7CisJCXByX2VycigiJXM6IHBlcmZfbW9kZSAlZCwgdG9wb2xvZ3kgMHgleFxuIiwgX19mdW5jX18sIHBlcmZfbW9kZSwKKwkJCWF0b21pY19yZWFkKAorCQkJCSZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBkb25lOworCX0KKworCWFkbV9wYXJhbXMuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCUFQUl9IRFJfTEVOKDIwKSwgQVBSX1BLVF9WRVIpOworCWFkbV9wYXJhbXMuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFkbV9wYXJhbXMpOworCWFkbV9wYXJhbXMuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcGFyYW1zLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wYXJhbXMuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1fcGFyYW1zLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWFkbV9wYXJhbXMuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCisJYWRtX3BhcmFtcy5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCWFkbV9wYXJhbXMuaGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhZG1fcGFyYW1zLmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7CisJYWRtX3BhcmFtcy5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwlhZG1fcGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWFkbV9wYXJhbXMubWVtX21hcF9oYW5kbGUgPSBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKKwlhZG1fcGFyYW1zLnBheWxvYWRfc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisJcHJfZGVidWcoIiVzOiBTZW5kaW5nIFNFVF9QQVJBTVMgcGF5bG9hZCA9IDB4JXBLLCBzaXplID0gJWRcbiIsCisJCV9fZnVuY19fLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJYWRtX3BhcmFtcy5wYXlsb2FkX3NpemUpOworCXJlc3VsdCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZhZG1fcGFyYW1zKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0IDB4JXggcmVzdWx0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXN1bHQpOworCQlwcl9kZWJ1ZygiJXM6IFNldCBwYXJhbXMgZmFpbGVkIHBvcnQgPSAweCV4IHBheWxvYWQgPSAweCVwSyByZXN1bHQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmVzdWx0KSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcHJfZGVidWcoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleCwgcGF5bG9hZCA9IDB4JXBLXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOworCQlyZXN1bHQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICphZG1fZmluZF9jYWxfYnlfcGF0aChpbnQgY2FsX2luZGV4LCBpbnQgcGF0aCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkcHJvYyAqYXVkcHJvY19jYWxfaW5mbyA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbCAqYXVkdm9sX2NhbF9pbmZvID0gTlVMTDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCisJCSZ0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdLT5jYWxfYmxvY2tzKSB7CisKKwkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOworCisJCWlmIChjYWxfaW5kZXggPT0gQURNX0FVRFBST0NfQ0FMKSB7CisJCQlhdWRwcm9jX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKKwkJCWlmICgoYXVkcHJvY19jYWxfaW5mby0+cGF0aCA9PSBwYXRoKSAmJgorCQkJICAgIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiAwKSkKKwkJCQlyZXR1cm4gY2FsX2Jsb2NrOworCQl9IGVsc2UgaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEVk9MX0NBTCkgeworCQkJYXVkdm9sX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKKwkJCWlmICgoYXVkdm9sX2NhbF9pbmZvLT5wYXRoID09IHBhdGgpICYmCisJCQkgICAgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IDApKQorCQkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0KKwl9CisJcHJfZGVidWcoIiVzOiBDYW4ndCBmaW5kIEFETSBjYWwgZm9yIGNhbF9pbmRleCAlZCwgcGF0aCAlZFxuIiwKKwkJX19mdW5jX18sIGNhbF9pbmRleCwgcGF0aCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmFkbV9maW5kX2NhbF9ieV9hcHBfdHlwZShpbnQgY2FsX2luZGV4LCBpbnQgcGF0aCwKKwkJCQkJCQkJaW50IGFwcF90eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jICphdWRwcm9jX2NhbF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkdm9sICphdWR2b2xfY2FsX2luZm8gPSBOVUxMOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+Y2FsX2Jsb2NrcykgeworCisJCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKKworCQlpZiAoY2FsX2luZGV4ID09IEFETV9BVURQUk9DX0NBTCkgeworCQkJYXVkcHJvY19jYWxfaW5mbyA9IGNhbF9ibG9jay0+Y2FsX2luZm87CisJCQlpZiAoKGF1ZHByb2NfY2FsX2luZm8tPnBhdGggPT0gcGF0aCkgJiYKKwkJCSAgICAoYXVkcHJvY19jYWxfaW5mby0+YXBwX3R5cGUgPT0gYXBwX3R5cGUpICYmCisJCQkgICAgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IDApKQorCQkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0gZWxzZSBpZiAoY2FsX2luZGV4ID09IEFETV9BVURWT0xfQ0FMKSB7CisJCQlhdWR2b2xfY2FsX2luZm8gPSBjYWxfYmxvY2stPmNhbF9pbmZvOworCQkJaWYgKChhdWR2b2xfY2FsX2luZm8tPnBhdGggPT0gcGF0aCkgJiYKKwkJCSAgICAoYXVkdm9sX2NhbF9pbmZvLT5hcHBfdHlwZSA9PSBhcHBfdHlwZSkgJiYKKwkJCSAgICAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID4gMCkpCisJCQkJcmV0dXJuIGNhbF9ibG9jazsKKwkJfQorCX0KKwlwcl9kZWJ1ZygiJXM6IENhbid0IGZpbmQgQURNIGNhbGkgZm9yIGNhbF9pbmRleCAlZCwgcGF0aCAlZCwgYXBwICVkLCBkZWZhdWx0aW5nIHRvIHNlYXJjaCBieSBwYXRoXG4iLAorCQlfX2Z1bmNfXywgY2FsX2luZGV4LCBwYXRoLCBhcHBfdHlwZSk7CisJcmV0dXJuIGFkbV9maW5kX2NhbF9ieV9wYXRoKGNhbF9pbmRleCwgcGF0aCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWRtX2ZpbmRfY2FsKGludCBjYWxfaW5kZXgsIGludCBwYXRoLAorCQkJCQkgICBpbnQgYXBwX3R5cGUsIGludCBhY2RiX2lkLAorCQkJCQkgICBpbnQgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHByb2MgKmF1ZHByb2NfY2FsX2luZm8gPSBOVUxMOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWR2b2wgKmF1ZHZvbF9jYWxfaW5mbyA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+Y2FsX2Jsb2NrcykgeworCisJCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKKworCQlpZiAoY2FsX2luZGV4ID09IEFETV9BVURQUk9DX0NBTCkgeworCQkJYXVkcHJvY19jYWxfaW5mbyA9IGNhbF9ibG9jay0+Y2FsX2luZm87CisJCQlpZiAoKGF1ZHByb2NfY2FsX2luZm8tPnBhdGggPT0gcGF0aCkgJiYKKwkJCSAgICAoYXVkcHJvY19jYWxfaW5mby0+YXBwX3R5cGUgPT0gYXBwX3R5cGUpICYmCisJCQkgICAgKGF1ZHByb2NfY2FsX2luZm8tPmFjZGJfaWQgPT0gYWNkYl9pZCkgJiYKKwkJCSAgICAoYXVkcHJvY19jYWxfaW5mby0+c2FtcGxlX3JhdGUgPT0gc2FtcGxlX3JhdGUpICYmCisJCQkgICAgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IDApKQorCQkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0gZWxzZSBpZiAoY2FsX2luZGV4ID09IEFETV9BVURWT0xfQ0FMKSB7CisJCQlhdWR2b2xfY2FsX2luZm8gPSBjYWxfYmxvY2stPmNhbF9pbmZvOworCQkJaWYgKChhdWR2b2xfY2FsX2luZm8tPnBhdGggPT0gcGF0aCkgJiYKKwkJCSAgICAoYXVkdm9sX2NhbF9pbmZvLT5hcHBfdHlwZSA9PSBhcHBfdHlwZSkgJiYKKwkJCSAgICAoYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkID09IGFjZGJfaWQpICYmCisJCQkgICAgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IDApKQorCQkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0KKwl9CisJcHJfZGVidWcoIiVzOiBDYW4ndCBmaW5kIEFETSBjYWwgZm9yIGNhbF9pbmRleCAlZCwgcGF0aCAlZCwgYXBwICVkLCBhY2RiX2lkICVkIHNhbXBsZV9yYXRlICVkIGRlZmF1bHRpbmcgdG8gc2VhcmNoIGJ5IGFwcCB0eXBlXG4iLAorCQlfX2Z1bmNfXywgY2FsX2luZGV4LCBwYXRoLCBhcHBfdHlwZSwgYWNkYl9pZCwgc2FtcGxlX3JhdGUpOworCXJldHVybiBhZG1fZmluZF9jYWxfYnlfYXBwX3R5cGUoY2FsX2luZGV4LCBwYXRoLCBhcHBfdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgYWRtX3JlbWFwX2FuZF9zZW5kX2NhbF9ibG9jayhpbnQgY2FsX2luZGV4LCBpbnQgcG9ydF9pZCwKKwlpbnQgY29wcF9pZHgsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLCBpbnQgcGVyZl9tb2RlLAorCWludCBhcHBfdHlwZSwgaW50IGFjZGJfaWQsIGludCBzYW1wbGVfcmF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogU2VuZGluZyBjYWxfaW5kZXggY2FsICVkXG4iLCBfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwlyZXQgPSByZW1hcF9jYWxfZGF0YShjYWxfYmxvY2ssIGNhbF9pbmRleCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBSZW1hcF9jYWxfZGF0YSBmYWlsZWQgZm9yIGNhbCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSBzZW5kX2FkbV9jYWxfYmxvY2socG9ydF9pZCwgY29wcF9pZHgsIGNhbF9ibG9jaywgcGVyZl9tb2RlLAorCQkJCWFwcF90eXBlLCBhY2RiX2lkLCBzYW1wbGVfcmF0ZSk7CisJaWYgKHJldCA8IDApCisJCXByX2RlYnVnKCIlczogTm8gY2FsIHNlbnQgZm9yIGNhbF9pbmRleCAlZCwgcG9ydF9pZCA9IDB4JXghIHJldCAlZCBzYW1wbGVfcmF0ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgsIHBvcnRfaWQsIHJldCwgc2FtcGxlX3JhdGUpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZW5kX2FkbV9jYWxfdHlwZShpbnQgY2FsX2luZGV4LCBpbnQgcGF0aCwgaW50IHBvcnRfaWQsCisJCQkgICAgICBpbnQgY29wcF9pZHgsIGludCBwZXJmX21vZGUsIGludCBhcHBfdHlwZSwKKwkJCSAgICAgIGludCBhY2RiX2lkLCBpbnQgc2FtcGxlX3JhdGUpCit7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIiVzOiBjYWwgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBjYWxfaW5kZXgpOworCisJaWYgKHRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbF9pbmRleCAlZCBub3QgYWxsb2NhdGVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7CisJY2FsX2Jsb2NrID0gYWRtX2ZpbmRfY2FsKGNhbF9pbmRleCwgcGF0aCwgYXBwX3R5cGUsIGFjZGJfaWQsCisJCQkJc2FtcGxlX3JhdGUpOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKKwkJZ290byB1bmxvY2s7CisKKwlyZXQgPSBhZG1fcmVtYXBfYW5kX3NlbmRfY2FsX2Jsb2NrKGNhbF9pbmRleCwgcG9ydF9pZCwgY29wcF9pZHgsCisJCWNhbF9ibG9jaywgcGVyZl9tb2RlLCBhcHBfdHlwZSwgYWNkYl9pZCwgc2FtcGxlX3JhdGUpOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Citkb25lOgorCXJldHVybjsKK30KKworc3RhdGljIGludCBnZXRfY2FsX3BhdGgoaW50IHBhdGgpCit7CisJaWYgKHBhdGggPT0gMHgxKQorCQlyZXR1cm4gUlhfREVWSUNFOworCWVsc2UKKwkJcmV0dXJuIFRYX0RFVklDRTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9hZG1fY2FsKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXRoLCBpbnQgcGVyZl9tb2RlLAorCQkJIGludCBhcHBfdHlwZSwgaW50IGFjZGJfaWQsIGludCBzYW1wbGVfcmF0ZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQgMHgleCBjb3BwX2lkeCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKworCXNlbmRfYWRtX2NhbF90eXBlKEFETV9BVURQUk9DX0NBTCwgcGF0aCwgcG9ydF9pZCwgY29wcF9pZHgsIHBlcmZfbW9kZSwKKwkJCSAgYXBwX3R5cGUsIGFjZGJfaWQsIHNhbXBsZV9yYXRlKTsKKwlzZW5kX2FkbV9jYWxfdHlwZShBRE1fQVVEVk9MX0NBTCwgcGF0aCwgcG9ydF9pZCwgY29wcF9pZHgsIHBlcmZfbW9kZSwKKwkJCSAgYXBwX3R5cGUsIGFjZGJfaWQsIHNhbXBsZV9yYXRlKTsKK30KKworaW50IGFkbV9jb25uZWN0X2FmZV9wb3J0KGludCBtb2RlLCBpbnQgc2Vzc2lvbl9pZCwgaW50IHBvcnRfaWQpCit7CisJc3RydWN0IGFkbV9jbWRfY29ubmVjdF9hZmVfcG9ydF92NQljbWQ7CisJaW50IHJldCA9IDA7CisJaW50IHBvcnRfaWR4LCBjb3BwX2lkeCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQ6IDB4JXggc2Vzc2lvbiBpZDolZCBtb2RlOiVkXG4iLCBfX2Z1bmNfXywKKwkJCQlwb3J0X2lkLCBzZXNzaW9uX2lkLCBtb2RlKTsKKworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGhpc19hZG0uYXByID09IE5VTEwpIHsKKwkJdGhpc19hZG0uYXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkFETSIsIGFkbV9jYWxsYmFjaywKKwkJCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FkbSk7CisJCWlmICh0aGlzX2FkbS5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFETVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcnRhY19zZXRfYWRtX2hhbmRsZSh0aGlzX2FkbS5hcHIpOworCX0KKwlwcl9kZWJ1ZygiJXM6IFBvcnQgSUQgMHgleCwgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCBwb3J0X2lkeCk7CisKKwljbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY21kLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjbWQpOworCWNtZC5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWNtZC5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwljbWQuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwljbWQuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJY21kLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwljbWQuaGRyLmRlc3RfcG9ydCA9IDA7IC8qIElnbm9yZWQgKi8KKwljbWQuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwljbWQuaGRyLm9wY29kZSA9IEFETV9DTURfQ09OTkVDVF9BRkVfUE9SVF9WNTsKKworCWNtZC5tb2RlID0gbW9kZTsKKwljbWQuc2Vzc2lvbl9pZCA9IHNlc3Npb25faWQ7CisJY21kLmFmZV9wb3J0X2lkID0gcG9ydF9pZDsKKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmNtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQURNIGVuYWJsZSBmb3IgcG9ydF9pZDogMHgleCBmYWlsZWQgcmV0ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBBRE0gY29ubmVjdCB0aW1lZG91dCBmb3IgcG9ydF9pZDogMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWF0b21pY19pbmMoJnRoaXNfYWRtLmNvcHAuY250W3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCXJldHVybiAwOworCitmYWlsX2NtZDoKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fYXJyYW5nZV9tY2hfbWFwKHN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1ICpvcGVuLCBpbnQgcGF0aCwKKwkJCSBpbnQgY2hhbm5lbF9tb2RlKQoreworCWludCByYyA9IDAsIGlkeDsKKworCW1lbXNldChvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisJc3dpdGNoIChwYXRoKSB7CisJY2FzZSBBRE1fUEFUSF9QTEFZQkFDSzoKKwkJaWR4ID0gQURNX01DSF9NQVBfSURYX1BMQVlCQUNLOworCQlicmVhazsKKwljYXNlIEFETV9QQVRIX0xJVkVfUkVDOgorCWNhc2UgQURNX1BBVEhfTk9OTElWRV9SRUM6CisJCWlkeCA9IEFETV9NQ0hfTUFQX0lEWF9SRUM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gbm9uX21jaF9wYXRoOworCX07CisJaWYgKChvcGVuLT5kZXZfbnVtX2NoYW5uZWwgPiAyKSAmJiBtdWx0aV9jaF9tYXBzW2lkeF0uc2V0X2NoYW5uZWxfbWFwKSB7CisJCW1lbWNweShvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nLAorCQkJbXVsdGlfY2hfbWFwc1tpZHhdLmNoYW5uZWxfbWFwcGluZywKKwkJCVBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9IGVsc2UgeworCQlpZiAoY2hhbm5lbF9tb2RlID09IDEpIHsKKwkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gMikgeworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOworCQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSAzKSB7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRkM7CisJCX0gZWxzZSBpZiAoY2hhbm5lbF9tb2RlID09IDQpIHsKKwkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9SUzsKKwkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gNSkgeworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOworCQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA2KSB7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfTEZFOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0ZDOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0xTOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX1JTOworCQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA3KSB7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRkM7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTEZFOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0xCOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX1JCOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s2XSA9IFBDTV9DSEFOTkVMX0NTOworCQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA4KSB7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfTEZFOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0ZDOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0xTOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX1JTOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s2XSA9IFBDTV9DSEFOTkVMX0xCOworCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1s3XSA9IFBDTV9DSEFOTkVMX1JCOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBudW1fY2hhbiAlZFxuIiwgX19mdW5jX18sCisJCQkJY2hhbm5lbF9tb2RlKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gaW52YWxfY2hfbW9kOworCQl9CisJfQorCitub25fbWNoX3BhdGg6CitpbnZhbF9jaF9tb2Q6CisJcmV0dXJuIHJjOworfQorCitpbnQgYWRtX29wZW4oaW50IHBvcnRfaWQsIGludCBwYXRoLCBpbnQgcmF0ZSwgaW50IGNoYW5uZWxfbW9kZSwgaW50IHRvcG9sb2d5LAorCSAgICAgaW50IHBlcmZfbW9kZSwgdWludDE2X3QgYml0X3dpZHRoLCBpbnQgYXBwX3R5cGUsIGludCBhY2RiX2lkKQoreworCXN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1CW9wZW47CisJaW50IHJldCA9IDA7CisJaW50IHBvcnRfaWR4LCBjb3BwX2lkeCwgZmxhZ3M7CisJaW50IHRtcF9wb3J0ID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKworCXByX2RlYnVnKCIlczpwb3J0ICUjeCBwYXRoOiVkIHJhdGU6JWQgbW9kZTolZCBwZXJmX21vZGU6JWQsdG9wb19pZCAlZFxuIiwKKwkJIF9fZnVuY19fLCBwb3J0X2lkLCBwYXRoLCByYXRlLCBjaGFubmVsX21vZGUsIHBlcmZfbW9kZSwKKwkJIHRvcG9sb2d5KTsKKworCS8qIEZvciBEVFMgRUFHTEUgb25seSwgZm9yY2UgMjQgYml0ICovCisJaWYgKCh0b3BvbG9neSA9PSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9EVFNfSFBYKSAmJgorCQkocGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkpIHsKKwkJYml0X3dpZHRoID0gMjQ7CisJCXByX2RlYnVnKCIlczogRm9yY2Ugb3BlbiBhZG0gaW4gMjQtYml0IGZvciBEVFMgSFBYIHRvcG9sb2d5IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdG9wb2xvZ3kpOworCX0KKwlwb3J0X2lkID0gcTZhdWRpb19jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0aGlzX2FkbS5hcHIgPT0gTlVMTCkgeworCQl0aGlzX2FkbS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQURNIiwgYWRtX2NhbGxiYWNrLAorCQkJCQkJMHhGRkZGRkZGRiwgJnRoaXNfYWRtKTsKKwkJaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQURNXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlydGFjX3NldF9hZG1faGFuZGxlKHRoaXNfYWRtLmFwcik7CisJfQorCisJaWYgKHBlcmZfbW9kZSA9PSBVTExfUE9TVF9QUk9DRVNTSU5HX1BDTV9NT0RFKSB7CisJCWZsYWdzID0gQURNX1VMTF9QT1NUX1BST0NFU1NJTkdfREVWSUNFX1NFU1NJT047CisJCWlmICgodG9wb2xvZ3kgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQpIHx8CisJCSAgICAodG9wb2xvZ3kgPT0gRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEKSB8fAorCQkgICAgKHRvcG9sb2d5ID09IFNSU19UUlVNRURJQV9UT1BPTE9HWV9JRCkgfHwKKwkJICAgICh0b3BvbG9neSA9PSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9EVFNfSFBYKSkKKwkJCXRvcG9sb2d5ID0gREVGQVVMVF9DT1BQX1RPUE9MT0dZOworCX0gZWxzZSBpZiAocGVyZl9tb2RlID09IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFKSB7CisJCWZsYWdzID0gQURNX1VMVFJBX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OOworCQl0b3BvbG9neSA9IE5VTExfQ09QUF9UT1BPTE9HWTsKKwkJcmF0ZSA9IFVMTF9TVVBQT1JURURfU0FNUExFX1JBVEU7CisJCWJpdF93aWR0aCA9IFVMTF9TVVBQT1JURURfQklUU19QRVJfU0FNUExFOworCX0gZWxzZSBpZiAocGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKSB7CisJCWZsYWdzID0gQURNX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OOworCQlpZiAoKHRvcG9sb2d5ID09IERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lEKSB8fAorCQkgICAgKHRvcG9sb2d5ID09IERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRCkgfHwKKwkJICAgICh0b3BvbG9neSA9PSBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQpIHx8CisJCSAgICAodG9wb2xvZ3kgPT0gQURNX0NNRF9DT1BQX09QRU5fVE9QT0xPR1lfSURfRFRTX0hQWCkpCisJCQl0b3BvbG9neSA9IERFRkFVTFRfQ09QUF9UT1BPTE9HWTsKKwl9IGVsc2UgeworCQlpZiAocGF0aCA9PSBBRE1fUEFUSF9DT01QUkVTU0VEX1JYKQorCQkJZmxhZ3MgPSAwOworCQllbHNlCisJCQlmbGFncyA9IEFETV9MRUdBQ1lfREVWSUNFX1NFU1NJT047CisJfQorCisJaWYgKCh0b3BvbG9neSA9PSBWUE1fVFhfU01fRUNOU19DT1BQX1RPUE9MT0dZKSB8fAorCSAgICAodG9wb2xvZ3kgPT0gVlBNX1RYX0RNX0ZMVUVOQ0VfQ09QUF9UT1BPTE9HWSkgfHwKKwkgICAgKHRvcG9sb2d5ID09IFZQTV9UWF9ETV9SRkVDTlNfQ09QUF9UT1BPTE9HWSkpCisJCXJhdGUgPSAxNjAwMDsKKworCWNvcHBfaWR4ID0gYWRtX2dldF9pZHhfaWZfY29wcF9leGlzdHMocG9ydF9pZHgsIHRvcG9sb2d5LCBwZXJmX21vZGUsCisJCQkJCQlyYXRlLCBiaXRfd2lkdGgsIGFwcF90eXBlKTsKKwlpZiAoY29wcF9pZHggPCAwKSB7CisJCWNvcHBfaWR4ID0gYWRtX2dldF9uZXh0X2F2YWlsYWJsZV9jb3BwKHBvcnRfaWR4KTsKKwkJaWYgKGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQkJcHJfZXJyKCIlczogZXhjZWVkZWQgY29wcCBpZCAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuY250W3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQkgICB0b3BvbG9neSk7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAubW9kZVtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQkJICAgcGVyZl9tb2RlKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5yYXRlW3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQkgICByYXRlKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5jaGFubmVsc1twb3J0X2lkeF1bY29wcF9pZHhdLAorCQkJICAgY2hhbm5lbF9tb2RlKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5iaXRfd2lkdGhbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCSAgIGJpdF93aWR0aCk7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYXBwX3R5cGVbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCSAgIGFwcF90eXBlKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hY2RiX2lkW3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQkgICBhY2RiX2lkKTsKKwkJc2V0X2JpdChBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVELAorCQkodm9pZCAqKSZ0aGlzX2FkbS5jb3BwLmFkbV9zdGF0dXNbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJCWlmIChwYXRoICE9IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpCisJCQlzZW5kX2FkbV9jdXN0b21fdG9wb2xvZ3koKTsKKwl9CisKKwlpZiAodGhpc19hZG0uY29wcC5hZG1fZGVsYXlbcG9ydF9pZHhdW2NvcHBfaWR4XSAmJgorCQlwZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSB7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3N0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCSAgIDEpOworCQl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtwb3J0X2lkeF1bY29wcF9pZHhdID0gMDsKKwkJd2FrZV91cCgmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfd2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwl9CisKKwkvKiBDcmVhdGUgYSBDT1BQIGlmIHBvcnQgaWQgYXJlIG5vdCBlbmFibGVkICovCisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmNudFtwb3J0X2lkeF1bY29wcF9pZHhdKSA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogb3BlbiBBRE06IHBvcnRfaWR4OiAlZCwgY29wcF9pZHg6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBwb3J0X2lkeCwgY29wcF9pZHgpOworCWlmICgodG9wb2xvZ3kgPT0gU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lEKSAmJgorCSAgICAgcGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkgeworCQlpbnQgcmVzOworCisJCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgsIEFETV9TUlNfVFJVTUVESUEpOworCQltc21fZHRzX3Nyc190bV9pb25fbWVtbWFwKCZ0aGlzX2FkbS5vdXRiYW5kX21lbW1hcCk7CisJCXJlcyA9IGFkbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJnRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyLCAwLAorCQkodWludDMyX3QgKikmdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAuc2l6ZSwgMSk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBTUlMgYWRtX21lbW9yeV9tYXBfcmVnaW9ucyBmYWlsZWQgISBhZGRyID0gMHglcEssIHNpemUgPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgKHZvaWQgKil0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkciwKKwkJKHVpbnQzMl90KXRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnNpemUpOworCQl9CisJfQorCQlpZiAoKHRvcG9sb2d5ID09IEFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFgpICYmCisJCSAgICAocGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkpIHsKKwkJCWludCByZXMgPSAwOworCisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBBRE1fRFRTX0VBR0xFKTsKKwkJCW1zbV9kdHNfaW9uX21lbW1hcCgmdGhpc19hZG0ub3V0YmFuZF9tZW1tYXApOworCQkJcmVzID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygKKwkJCQkgICAgICAmdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAucGFkZHIsCisJCQkJICAgICAgMCwKKwkJCQkgICAgICAodWludDMyX3QgKikmdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAuc2l6ZSwKKwkJCQkgICAgICAxKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXByX2VycigiJXM6IERUU19FQUdMRSBtbWFwIGRpZCBub3Qgd29yayEiLAorCQkJCQlfX2Z1bmNfXyk7CisJCX0KKwkJb3Blbi5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCSAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQkgICBBUFJfUEtUX1ZFUik7CisJCW9wZW4uaGRyLnBrdF9zaXplID0gc2l6ZW9mKG9wZW4pOworCQlvcGVuLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJCW9wZW4uaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJCW9wZW4uaGRyLnNyY19wb3J0ID0gdG1wX3BvcnQ7CisJCW9wZW4uaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJCW9wZW4uaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCQlvcGVuLmhkci5kZXN0X3BvcnQgPSB0bXBfcG9ydDsKKwkJb3Blbi5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCQlvcGVuLmhkci5vcGNvZGUgPSBBRE1fQ01EX0RFVklDRV9PUEVOX1Y1OworCQlvcGVuLmZsYWdzID0gZmxhZ3M7CisJCW9wZW4ubW9kZV9vZl9vcGVyYXRpb24gPSBwYXRoOworCQlvcGVuLmVuZHBvaW50X2lkXzEgPSB0bXBfcG9ydDsKKworCQlpZiAodGhpc19hZG0uZWNfcmVmX3J4ID09IC0xKSB7CisJCQlvcGVuLmVuZHBvaW50X2lkXzIgPSAweEZGRkY7CisJCX0gZWxzZSBpZiAodGhpc19hZG0uZWNfcmVmX3J4ICYmIChwYXRoICE9IDEpKSB7CisJCQlvcGVuLmVuZHBvaW50X2lkXzIgPSB0aGlzX2FkbS5lY19yZWZfcng7CisJCQl0aGlzX2FkbS5lY19yZWZfcnggPSAtMTsKKwkJfQorCisJCW9wZW4udG9wb2xvZ3lfaWQgPSB0b3BvbG9neTsKKworCQlvcGVuLmRldl9udW1fY2hhbm5lbCA9IGNoYW5uZWxfbW9kZSAmIDB4MDBGRjsKKwkJb3Blbi5iaXRfd2lkdGggPSBiaXRfd2lkdGg7CisJCVdBUk5fT04oKHBlcmZfbW9kZSA9PSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERSkgJiYKKwkJCShyYXRlICE9IFVMTF9TVVBQT1JURURfU0FNUExFX1JBVEUpKTsKKwkJb3Blbi5zYW1wbGVfcmF0ZSAgPSByYXRlOworCisJCXJldCA9IGFkbV9hcnJhbmdlX21jaF9tYXAoJm9wZW4sIHBhdGgsIGNoYW5uZWxfbW9kZSk7CisKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcHJfZGVidWcoIiVzOiBwb3J0X2lkPTB4JXggcmF0ZT0lZCB0b3BvbG9neV9pZD0weCVYXG4iLAorCQkJX19mdW5jX18sIG9wZW4uZW5kcG9pbnRfaWRfMSwgb3Blbi5zYW1wbGVfcmF0ZSwKKwkJCW9wZW4udG9wb2xvZ3lfaWQpOworCisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisKKwkJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJm9wZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogcG9ydF9pZDogMHgleCBmb3JbMHgleF0gZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHRtcF9wb3J0LCBwb3J0X2lkLCByZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogQURNIG9wZW4gdGltZWRvdXQgZm9yIHBvcnRfaWQ6IDB4JXggZm9yIFsweCV4XVxuIiwKKwkJCQkJCV9fZnVuY19fLCB0bXBfcG9ydCwgcG9ydF9pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJCXJldHVybiBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOworCQl9CisJfQorCWF0b21pY19pbmMoJnRoaXNfYWRtLmNvcHAuY250W3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCXJldHVybiBjb3BwX2lkeDsKK30KKworCit2b2lkIGFkbV9jb3BwX21mY19jZmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGRzdF9zYW1wbGVfcmF0ZSkKK3sKKwlzdHJ1Y3QgYXVkcHJvY19tZmNfb3V0cHV0X21lZGlhX2ZtdCBtZmNfY2ZnOworCXN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1IG9wZW47CisJaW50IHBvcnRfaWR4OworCWludCBzeiA9IDA7CisJaW50IHJjICA9IDA7CisJaW50IGkgID0gMDsKKworCXBvcnRfaWQgPSBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGF1ZHByb2NfbWZjX291dHB1dF9tZWRpYV9mbXQpOworCisJbWZjX2NmZy5wYXJhbXMuaGRyLmhkcl9maWVsZCA9CisJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJbWZjX2NmZy5wYXJhbXMuaGRyLnBrdF9zaXplID0gc3o7CisJbWZjX2NmZy5wYXJhbXMuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwltZmNfY2ZnLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwltZmNfY2ZnLnBhcmFtcy5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOworCW1mY19jZmcucGFyYW1zLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCW1mY19jZmcucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwltZmNfY2ZnLnBhcmFtcy5oZHIuZGVzdF9wb3J0ID0KKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCW1mY19jZmcucGFyYW1zLmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7CisJbWZjX2NmZy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKKwltZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwltZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwltZmNfY2ZnLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7CisJbWZjX2NmZy5wYXJhbXMucGF5bG9hZF9zaXplID0gc2l6ZW9mKG1mY19jZmcpIC0KKwkJCQlzaXplb2YobWZjX2NmZy5wYXJhbXMpOworCW1mY19jZmcuZGF0YS5tb2R1bGVfaWQgPSBBVURQUk9DX01PRFVMRV9JRF9NRkM7CisJbWZjX2NmZy5kYXRhLnBhcmFtX2lkID0KKwkJCUFVRFBST0NfUEFSQU1fSURfTUZDX09VVFBVVF9NRURJQV9GT1JNQVQ7CisJbWZjX2NmZy5kYXRhLnBhcmFtX3NpemUgPSBtZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX3NpemUgLQorCQkJCXNpemVvZihtZmNfY2ZnLmRhdGEpOworCW1mY19jZmcuZGF0YS5yZXNlcnZlZCA9IDA7CisJbWZjX2NmZy5zYW1wbGluZ19yYXRlID0gZHN0X3NhbXBsZV9yYXRlOworCW1mY19jZmcuYml0c19wZXJfc2FtcGxlID0KKwkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuYml0X3dpZHRoW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCW9wZW4uZGV2X251bV9jaGFubmVsID0gbWZjX2NmZy5udW1fY2hhbm5lbHMgPQorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5jaGFubmVsc1twb3J0X2lkeF1bY29wcF9pZHhdKTsKKworCXJjID0gYWRtX2FycmFuZ2VfbWNoX21hcCgmb3BlbiwgQURNX1BBVEhfUExBWUJBQ0ssCisJCW1mY19jZmcubnVtX2NoYW5uZWxzKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgY2hhbm5hbCBtYXBcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWZjX2NmZy5udW1fY2hhbm5lbHM7IGkrKykKKwkJbWZjX2NmZy5jaGFubmVsX3R5cGVbaV0gPQorCQkJKHVpbnQxNl90KSBvcGVuLmRldl9jaGFubmVsX21hcHBpbmdbaV07CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCisJcHJfZGVidWcoIiVzOiBtZmMgY29uZmlnOiBwb3J0X2lkeCAlZCBjb3BwX2lkeCAgJWQgY29wcCBTUiAlZCBjb3BwIEJXICVkIGNvcHAgY2hhbiAlZCBvL3AgU1IgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZHgsIGNvcHBfaWR4LAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAucmF0ZVtwb3J0X2lkeF1bY29wcF9pZHhdKSwKKwkJCW1mY19jZmcuYml0c19wZXJfc2FtcGxlLCBtZmNfY2ZnLm51bV9jaGFubmVscywKKwkJCW1mY19jZmcuc2FtcGxpbmdfcmF0ZSk7CisKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZtZmNfY2ZnKTsKKworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogcG9ydF9pZDogZm9yWzB4JXhdIGZhaWxlZCAlZFxuIiwKKwkJX19mdW5jX18sIHBvcnRfaWQsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IG1mY19jZmcgU2V0IHBhcmFtcyB0aW1lZCBvdXQgZm9yIHBvcnRfaWQ6IGZvciBbMHgleF1cbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJcmV0dXJuOworfQorCisKK2ludCBhZG1fbWF0cml4X21hcChpbnQgcGF0aCwgc3RydWN0IHJvdXRlX3BheWxvYWQgcGF5bG9hZF9tYXAsIGludCBwZXJmX21vZGUpCit7CisJc3RydWN0IGFkbV9jbWRfbWF0cml4X21hcF9yb3V0aW5nc192NQkqcm91dGU7CisJc3RydWN0IGFkbV9zZXNzaW9uX21hcF9ub2RlX3Y1ICpub2RlOworCXVpbnQxNl90ICpjb3Bwc19saXN0OworCWludCBjbWRfc2l6ZSA9IDA7CisJaW50IHJldCA9IDAsIGkgPSAwOworCXZvaWQgKnBheWxvYWQgPSBOVUxMOworCXZvaWQgKm1hdHJpeF9tYXAgPSBOVUxMOworCWludCBwb3J0X2lkeCwgY29wcF9pZHg7CisKKwkvKiBBc3N1bWVzIHBvcnRfaWRzIGhhdmUgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBkdXJpbmcgYWRtX29wZW4gKi8KKwljbWRfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGFkbV9jbWRfbWF0cml4X21hcF9yb3V0aW5nc192NSkgKworCQkJc2l6ZW9mKHN0cnVjdCBhZG1fc2Vzc2lvbl9tYXBfbm9kZV92NSkgKworCQkJKHNpemVvZih1aW50MzJfdCkgKiBwYXlsb2FkX21hcC5udW1fY29wcHMpKTsKKwltYXRyaXhfbWFwID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1hdHJpeF9tYXAgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBNZW0gYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCXJldHVybiByZXQ7CisJfQorCXJvdXRlID0gKHN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUgKiltYXRyaXhfbWFwOworCisJcm91dGUtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlyb3V0ZS0+aGRyLnBrdF9zaXplID0gY21kX3NpemU7CisJcm91dGUtPmhkci5zcmNfc3ZjID0gMDsKKwlyb3V0ZS0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJcm91dGUtPmhkci5zcmNfcG9ydCA9IDA7IC8qIElnbm9yZWQgKi87CisJcm91dGUtPmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCXJvdXRlLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJcm91dGUtPmhkci5kZXN0X3BvcnQgPSAwOyAvKiBJZ25vcmVkICovOworCXJvdXRlLT5oZHIudG9rZW4gPSAwOworCWlmIChwYXRoID09IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpIHsKKwkJcHJfZGVidWcoIiVzOiBBRE1fQ01EX1NUUkVBTV9ERVZJQ0VfTUFQX1JPVVRJTkdTX1Y1IDB4JXhcbiIsCisJCQkgX19mdW5jX18sIEFETV9DTURfU1RSRUFNX0RFVklDRV9NQVBfUk9VVElOR1NfVjUpOworCQlyb3V0ZS0+aGRyLm9wY29kZSA9IEFETV9DTURfU1RSRUFNX0RFVklDRV9NQVBfUk9VVElOR1NfVjU7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNSAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBBRE1fQ01EX01BVFJJWF9NQVBfUk9VVElOR1NfVjUpOworCQlyb3V0ZS0+aGRyLm9wY29kZSA9IEFETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNTsKKwl9CisJcm91dGUtPm51bV9zZXNzaW9ucyA9IDE7CisKKwlzd2l0Y2ggKHBhdGgpIHsKKwljYXNlIEFETV9QQVRIX1BMQVlCQUNLOgorCQlyb3V0ZS0+bWF0cml4X2lkID0gQURNX01BVFJJWF9JRF9BVURJT19SWDsKKwkJYnJlYWs7CisJY2FzZSBBRE1fUEFUSF9MSVZFX1JFQzoKKwljYXNlIEFETV9QQVRIX05PTkxJVkVfUkVDOgorCQlyb3V0ZS0+bWF0cml4X2lkID0gQURNX01BVFJJWF9JRF9BVURJT19UWDsKKwkJYnJlYWs7CisJY2FzZSBBRE1fUEFUSF9DT01QUkVTU0VEX1JYOgorCQlyb3V0ZS0+bWF0cml4X2lkID0gQURNX01BVFJJWF9JRF9DT01QUkVTU0VEX0FVRElPX1JYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBXcm9uZyBwYXRoIHNldFslZF1cbiIsIF9fZnVuY19fLCBwYXRoKTsKKwkJYnJlYWs7CisJfQorCXBheWxvYWQgPSAoKHU4ICopbWF0cml4X21hcCArCisJCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfbWF0cml4X21hcF9yb3V0aW5nc192NSkpOworCW5vZGUgPSAoc3RydWN0IGFkbV9zZXNzaW9uX21hcF9ub2RlX3Y1ICopcGF5bG9hZDsKKworCW5vZGUtPnNlc3Npb25faWQgPSBwYXlsb2FkX21hcC5zZXNzaW9uX2lkOworCW5vZGUtPm51bV9jb3BwcyA9IHBheWxvYWRfbWFwLm51bV9jb3BwczsKKwlwYXlsb2FkID0gKHU4ICopbm9kZSArIHNpemVvZihzdHJ1Y3QgYWRtX3Nlc3Npb25fbWFwX25vZGVfdjUpOworCWNvcHBzX2xpc3QgPSAodWludDE2X3QgKilwYXlsb2FkOworCWZvciAoaSA9IDA7IGkgPCBwYXlsb2FkX21hcC5udW1fY29wcHM7IGkrKykgeworCQlwb3J0X2lkeCA9CisJCWFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocGF5bG9hZF9tYXAucG9ydF9pZFtpXSk7CisJCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQlwYXlsb2FkX21hcC5wb3J0X2lkW2ldKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJCWNvcHBfaWR4ID0gcGF5bG9hZF9tYXAuY29wcF9pZHhbaV07CisJCWNvcHBzX2xpc3RbaV0gPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF0KKwkJCQkJCQkgICAgIFtjb3BwX2lkeF0pOworCX0KKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3N0YXQsIC0xKTsKKworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKW1hdHJpeF9tYXApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHJvdXRpbmcgZm9yIHN5cmVhbSAlZCBmYWlsZWQgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHBheWxvYWRfbWFwLnNlc3Npb25faWQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5tYXRyaXhfbWFwX3dhaXQsCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLm1hdHJpeF9tYXBfc3RhdCkgPj0gMCwKKwkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiByb3V0aW5nIGZvciBzeXJlYW0gJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCXBheWxvYWRfbWFwLnNlc3Npb25faWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLm1hdHJpeF9tYXBfc3RhdCkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsIF9fZnVuY19fLAorCQkJYWRzcF9lcnJfZ2V0X2Vycl9zdHIoYXRvbWljX3JlYWQoCisJCQkmdGhpc19hZG0ubWF0cml4X21hcF9zdGF0KSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3N0YXQpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoKHBlcmZfbW9kZSAhPSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERSkgJiYKKwkJIChwYXRoICE9IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwYXlsb2FkX21hcC5udW1fY29wcHM7IGkrKykgeworCQkJcG9ydF9pZHggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocGF5bG9hZF9tYXAucG9ydF9pZFtpXSk7CisJCQljb3BwX2lkeCA9IHBheWxvYWRfbWFwLmNvcHBfaWR4W2ldOworCQkJaWYgKHBvcnRfaWR4IDwgMCB8fCBjb3BwX2lkeCA8IDAgfHwKKwkJCSAgICAoY29wcF9pZHggPiBNQVhfQ09QUFNfUEVSX1BPUlQgLSAxKSkgeworCQkJCXByX2VycigiJXM6IEludmFsaWQgaWR4IHBvcnRfaWR4ICVkIGNvcHBfaWR4ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcG9ydF9pZHgsIGNvcHBfaWR4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChhdG9taWNfcmVhZCgKKwkJCQkmdGhpc19hZG0uY29wcC50b3BvbG9neVtwb3J0X2lkeF1bY29wcF9pZHhdKSA9PQorCQkJCUFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFgpCisJCQkJY29udGludWU7CisJCQlydGFjX2FkZF9hZG1fZGV2aWNlKHBheWxvYWRfbWFwLnBvcnRfaWRbaV0sCisJCQkJCSAgICBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZAorCQkJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSwKKwkJCQkJICAgIGdldF9jYWxfcGF0aChwYXRoKSwKKwkJCQkJICAgIHBheWxvYWRfbWFwLnNlc3Npb25faWQsCisJCQkJCSAgICBwYXlsb2FkX21hcC5hcHBfdHlwZSwKKwkJCQkJICAgIHBheWxvYWRfbWFwLmFjZGJfZGV2X2lkKTsKKworCQkJaWYgKCF0ZXN0X2JpdChBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVELAorCQkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1twb3J0X2lkeF0KKwkJCQkJCQkJW2NvcHBfaWR4XSkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IGFkbSBjb3BwWzB4JXhdWyVkXSBhbHJlYWR5IHNlbnQiLAorCQkJCQkJX19mdW5jX18sIHBvcnRfaWR4LCBjb3BwX2lkeCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzZW5kX2FkbV9jYWwocGF5bG9hZF9tYXAucG9ydF9pZFtpXSwgY29wcF9pZHgsCisJCQkJICAgICBnZXRfY2FsX3BhdGgocGF0aCksIHBlcmZfbW9kZSwKKwkJCQkgICAgIHBheWxvYWRfbWFwLmFwcF90eXBlLAorCQkJCSAgICAgcGF5bG9hZF9tYXAuYWNkYl9kZXZfaWQsCisJCQkJICAgICBwYXlsb2FkX21hcC5zYW1wbGVfcmF0ZSk7CisJCQkvKiBBRE0gQ09QUCBjYWxpYnJhdGlvbiBpcyBhbHJlYWR5IHNlbnQgKi8KKwkJCWNsZWFyX2JpdChBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVELAorCQkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuCisJCQkJYWRtX3N0YXR1c1twb3J0X2lkeF1bY29wcF9pZHhdKTsKKwkJCXByX2RlYnVnKCIlczogY29wcF9pZDogJWRcbiIsIF9fZnVuY19fLAorCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF0KKwkJCQkJCQkgICAgICBbY29wcF9pZHhdKSk7CisJCX0KKwl9CisKK2ZhaWxfY21kOgorCWtmcmVlKG1hdHJpeF9tYXApOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYWRtX2VjX3JlZl9yeF9pZChpbnQgcG9ydF9pZCkKK3sKKwl0aGlzX2FkbS5lY19yZWZfcnggPSBwb3J0X2lkOworCXByX2RlYnVnKCIlczogZWNfcmVmX3J4OiVkIiwgX19mdW5jX18sIHRoaXNfYWRtLmVjX3JlZl9yeCk7Cit9CisKK2ludCBhZG1fY2xvc2UoaW50IHBvcnRfaWQsIGludCBwZXJmX21vZGUsIGludCBjb3BwX2lkeCkKK3sKKwlzdHJ1Y3QgYXByX2hkciBjbG9zZTsKKworCWludCByZXQgPSAwLCBwb3J0X2lkeDsKKwlpbnQgY29wcF9pZCA9IFJFU0VUX0NPUFBfSUQ7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQ9MHgleCBwZXJmX21vZGU6ICVkIGNvcHBfaWR4OiAlZFxuIiwgX19mdW5jX18sCisJCSBwb3J0X2lkLCBwZXJmX21vZGUsIGNvcHBfaWR4KTsKKworCXBvcnRfaWQgPSBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoY29wcF9pZHggPCAwKSB8fCAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHAgaWR4OiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5W3BvcnRfaWR4XVtjb3BwX2lkeF0gJiYgcGVyZl9tb2RlCisJCT09IExFR0FDWV9QQ01fTU9ERSkgeworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV9zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQkgICAxKTsKKwkJdGhpc19hZG0uY29wcC5hZG1fZGVsYXlbcG9ydF9pZHhdW2NvcHBfaWR4XSA9IDA7CisJCXdha2VfdXAoJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3dhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJfQorCisJYXRvbWljX2RlYygmdGhpc19hZG0uY29wcC5jbnRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJaWYgKCEoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuY250W3BvcnRfaWR4XVtjb3BwX2lkeF0pKSkgeworCQljb3BwX2lkID0gYWRtX2dldF9jb3BwX2lkKHBvcnRfaWR4LCBjb3BwX2lkeCk7CisJCXByX2RlYnVnKCIlczogQ2xvc2luZyBBRE0gcG9ydF9pZHg6JWQgY29wcF9pZHg6JWQgY29wcF9pZDoweCV4XG4iLAorCQkJIF9fZnVuY19fLCBwb3J0X2lkeCwgY29wcF9pZHgsIGNvcHBfaWQpOworCQlpZiAoKCFwZXJmX21vZGUpICYmICh0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkciAhPSAwKSAmJgorCQkgICAgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtjb3BwX2lkeF0pID09CisJCQlTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQpKSB7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LAorCQkJCUFETV9TUlNfVFJVTUVESUEpOworCQkJcmV0ID0gYWRtX21lbW9yeV91bm1hcF9yZWdpb25zKCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiJXM6IGFkbSBtZW0gdW5tbWFwIGVyciAlZCIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXMKKwkJCQkJICAgW0FETV9TUlNfVFJVTUVESUFdLCAwKTsKKwkJCX0KKwkJfQorCisJCWlmICgocGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkgJiYKKwkJICAgICh0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5wYWRkciAhPSAwKSAmJgorCQkgICAgKGF0b21pY19yZWFkKAorCQkJJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPT0KKwkJCUFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFgpKSB7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBBRE1fRFRTX0VBR0xFKTsKKwkJCXJldCA9IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBhZG0gbWVtIHVubW1hcCBlcnIgJWQiLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCX0gZWxzZSB7CisJCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzCisJCQkJCSAgIFtBRE1fRFRTX0VBR0xFXSwgMCk7CisJCQl9CisJCX0KKworCQlpZiAoKGFmZV9nZXRfcG9ydF90eXBlKHBvcnRfaWQpID09IE1TTV9BRkVfUE9SVF9UWVBFX1RYKSAmJgorCQkgICAgdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkcikgeworCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwKKwkJCQkgICBBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkcpOworCQkJcmV0ID0gYWRtX21lbW9yeV91bm1hcF9yZWdpb25zKCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiJXM6IGFkbSBtZW0gdW5tbWFwIGVyciAlZCIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJfQorCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAorCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAorCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlKTsKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50ID0gTlVMTDsKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlID0gTlVMTDsKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7CisJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciA9IE5VTEw7CisJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyID0gMDsKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cyA9IC0xOworCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzWworCQkJCQlBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddLCAwKTsKKwkJfQorCisJCWNsb3NlLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCQljbG9zZS5wa3Rfc2l6ZSA9IHNpemVvZihjbG9zZSk7CisJCWNsb3NlLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwkJY2xvc2Uuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwkJY2xvc2Uuc3JjX3BvcnQgPSBwb3J0X2lkOworCQljbG9zZS5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCQljbG9zZS5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwkJY2xvc2UuZGVzdF9wb3J0ID0gY29wcF9pZDsKKwkJY2xvc2UudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCQljbG9zZS5vcGNvZGUgPSBBRE1fQ01EX0RFVklDRV9DTE9TRV9WNTsKKworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCQkgICBSRVNFVF9DT1BQX0lEKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5jbnRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7CisJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAubW9kZVtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5yYXRlW3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNoYW5uZWxzW3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmJpdF93aWR0aFtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKKworCQljbGVhcl9iaXQoQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRCwKKwkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1twb3J0X2lkeF1bY29wcF9pZHhdKTsKKworCQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmY2xvc2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogQURNIGNsb3NlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCWlmICghcmV0KSB7CisJCQlwcl9lcnIoIiVzOiBBRE0gY21kIFJvdXRlIHRpbWVkb3V0IGZvciBwb3J0IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7CisJCQlyZXR1cm4gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJfQorCX0KKworCWlmIChwZXJmX21vZGUgIT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpIHsKKwkJcHJfZGVidWcoIiVzOiByZW1vdmUgYWRtIGRldmljZSBmcm9tIHJ0YWNcbiIsIF9fZnVuY19fKTsKKwkJcnRhY19yZW1vdmVfYWRtX2RldmljZShwb3J0X2lkLCBjb3BwX2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZW5kX3J0YWNfYXVkdm9sX2NhbCh2b2lkKQoreworCWludCByZXQgPSAwOworCWludCByZXQyID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGNvcHBfaWR4LCBwb3J0X2lkeCwgYWNkYl9pZCwgYXBwX2lkLCBwYXRoOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkdm9sICphdWR2b2xfY2FsX2luZm8gPSBOVUxMOworCXN0cnVjdCBydGFjX2FkbSBydGFjX2FkbV9kYXRhOworCisJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbQURNX1JUQUNfQVVEVk9MX0NBTF0tPmxvY2spOworCisJY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJdGhpc19hZG0uY2FsX2RhdGFbQURNX1JUQUNfQVVEVk9MX0NBTF0pOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYW4ndCBmaW5kIGNhbCBibG9jayFcbiIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJYXVkdm9sX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKKwlpZiAoYXVkdm9sX2NhbF9pbmZvID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogYXVkdm9sX2NhbF9pbmZvIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWdldF9ydGFjX2FkbV9kYXRhKCZydGFjX2FkbV9kYXRhKTsKKwlmb3IgKDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7CisKKwkJYWNkYl9pZCA9IHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFjZGJfZGV2X2lkOworCQlpZiAoYWNkYl9pZCA9PSAwKQorCQkJYWNkYl9pZCA9IGF1ZHZvbF9jYWxfaW5mby0+YWNkYl9pZDsKKworCQlhcHBfaWQgPSBydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hcHBfdHlwZTsKKwkJaWYgKGFwcF9pZCA9PSAwKQorCQkJYXBwX2lkID0gYXVkdm9sX2NhbF9pbmZvLT5hcHBfdHlwZTsKKworCQlwYXRoID0gYWZlX2dldF9wb3J0X3R5cGUocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQpOworCQlpZiAoKGFjZGJfaWQgPT0gYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkKSAmJgorCQkJKGFwcF9pZCA9PSBhdWR2b2xfY2FsX2luZm8tPmFwcF90eXBlKSAmJgorCQkJKHBhdGggPT0gYXVkdm9sX2NhbF9pbmZvLT5wYXRoKSkgeworCisJCQlpZiAoYWRtX2dldF9pbmRleGVzX2Zyb21fY29wcF9pZChydGFjX2FkbV9kYXRhLgorCQkJCWRldmljZVtpXS5jb3BwLCAmY29wcF9pZHgsICZwb3J0X2lkeCkgIT0gMCkgeworCQkJCXByX2RlYnVnKCIlczogQ29wcCBJZCAlZCBpcyBub3QgYWN0aXZlXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uY29wcCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXJldDIgPSBhZG1fcmVtYXBfYW5kX3NlbmRfY2FsX2Jsb2NrKEFETV9SVEFDX0FVRFZPTF9DQUwsCisJCQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQsCisJCQkJY29wcF9pZHgsIGNhbF9ibG9jaywKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC4KKwkJCQltb2RlW3BvcnRfaWR4XVtjb3BwX2lkeF0pLAorCQkJCWF1ZHZvbF9jYWxfaW5mby0+YXBwX3R5cGUsCisJCQkJYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkLAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLgorCQkJCXJhdGVbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOworCQkJaWYgKHJldDIgPCAwKSB7CisJCQkJcHJfZGVidWcoIiVzOiByZW1hcCBhbmQgc2VuZCBmYWlsZWQgZm9yIGNvcHAgSWQgJWQsIGFjZGIgaWQgJWQsIGFwcCB0eXBlICVkLCBwYXRoICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uY29wcCwKKwkJCQkJYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkLAorCQkJCQlhdWR2b2xfY2FsX2luZm8tPmFwcF90eXBlLAorCQkJCQlhdWR2b2xfY2FsX2luZm8tPnBhdGgpOworCQkJCXJldCA9IHJldDI7CisJCQl9CisJCX0KKwl9Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YVtBRE1fUlRBQ19BVURWT0xfQ0FMXS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkbV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBhZGRyZXNzIHRvIG1hcCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogbWFwIHNpemUgaXMgMCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiB2YWxpZCBwb3J0IElEIG5lZWRlZCBmb3IgY2FsbGJhY2sgdXNlIHByaW1hcnkgSTJTICovCisJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwgQURNX1JUQUNfQVBSX0NBTCk7CisJcmVzdWx0ID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwgMCwKKwkJCQkJJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIDEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IFJUQUMgbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlZCByZXN1bHQgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJlc3VsdCk7CisJCXByX2RlYnVnKCIlczogUlRBQyBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgKKwkJJnRoaXNfYWRtLm1lbV9tYXBfaGFuZGxlc1tBRE1fUlRBQ19BUFJfQ0FMXSk7Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBhZG1fdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAobWVtX21hcF9oYW5kbGUgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqbWVtX21hcF9oYW5kbGUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgMCwgbm90aGluZyB0byB1bm1hcFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqbWVtX21hcF9oYW5kbGUgIT0gYXRvbWljX3JlYWQoCisJCQkmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW0FETV9SVEFDX0FQUl9DQUxdKSkgeworCQlwcl9lcnIoIiVzOiBNYXAgaGFuZGxlcyBkbyBub3QgbWF0Y2ghIFVubWFwcGluZyBSVEFDLCBSVEFDIG1hcCAweCV4LCBBRE0gbWFwIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgKm1lbV9tYXBfaGFuZGxlLCBhdG9taWNfcmVhZCgKKwkJCSZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbQURNX1JUQUNfQVBSX0NBTF0pKTsKKworCQkvKiBpZiBtaXNtYXRjaCB1c2UgaGFuZGxlIHBhc3NlZCBpbiB0byB1bm1hcCAqLworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbQURNX1JUQUNfQVBSX0NBTF0sCisJCQkgICAqbWVtX21hcF9oYW5kbGUpOworCX0KKworCS8qIHZhbGlkIHBvcnQgSUQgbmVlZGVkIGZvciBjYWxsYmFjayB1c2UgcHJpbWFyeSBJMlMgKi8KKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBBRE1fUlRBQ19BUFJfQ0FMKTsKKwlyZXN1bHQgPSBhZG1fbWVtb3J5X3VubWFwX3JlZ2lvbnMoKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9kZWJ1ZygiJXM6IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyBmYWlsZWQsIGVycm9yICVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfSBlbHNlIHsKKwkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW0FETV9SVEFDX0FQUl9DQUxdLCAwKTsKKwkJKm1lbV9tYXBfaGFuZGxlID0gMDsKKwl9Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNhbF90eXBlKSB7CisJY2FzZSBBRE1fQVVEUFJPQ19DQUxfVFlQRToKKwkJcmV0ID0gQURNX0FVRFBST0NfQ0FMOworCQlicmVhazsKKwljYXNlIEFETV9BVURWT0xfQ0FMX1RZUEU6CisJCXJldCA9IEFETV9BVURWT0xfQ0FMOworCQlicmVhazsKKwljYXNlIEFETV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlyZXQgPSBBRE1fQ1VTVE9NX1RPUF9DQUw7CisJCWJyZWFrOworCWNhc2UgQURNX1JUQUNfSU5GT19DQUxfVFlQRToKKwkJcmV0ID0gQURNX1JUQUNfSU5GT19DQUw7CisJCWJyZWFrOworCWNhc2UgQURNX1JUQUNfQVBSX0NBTF9UWVBFOgorCQlyZXQgPSBBRE1fUlRBQ19BUFJfQ0FMOworCQlicmVhazsKKwljYXNlIEFETV9SVEFDX0FVRFZPTF9DQUxfVFlQRToKKwkJcmV0ID0gQURNX1JUQUNfQVVEVk9MX0NBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZCFcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRtX2FsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZG1fZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNhbF91dGlsc19kZWFsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19kZWFsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkbV9zZXRfY2FsKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9pbmRleCA9PSBBRE1fQ1VTVE9NX1RPUF9DQUwpIHsKKwkJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbQURNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7CisJCXRoaXNfYWRtLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOworCQltdXRleF91bmxvY2soJnRoaXNfYWRtLmNhbF9kYXRhW0FETV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOworCX0gZWxzZSBpZiAoY2FsX2luZGV4ID09IEFETV9SVEFDX0FVRFZPTF9DQUwpIHsKKwkJc2VuZF9ydGFjX2F1ZHZvbF9jYWwoKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRtX21hcF9jYWxfZGF0YShpbnQzMl90IGNhbF90eXBlLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOworCXJldCA9IGFkbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsIDAsCisJCSh1aW50MzJfdCAqKSZjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBtYXAgZGlkIG5vdCB3b3JrISBjYWxfdHlwZSAlaSByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4LCByZXQpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLgorCQltZW1fbWFwX2hhbmRsZXNbY2FsX2luZGV4XSk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRtX3VubWFwX2NhbF9kYXRhKGludDMyX3QgY2FsX3R5cGUsCisJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBDYWwgYmxvY2sgaXMgTlVMTCFcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW2NhbF9pbmRleF0sCisJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOworCXJldCA9IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgY2FsX3R5cGUgJWkgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcmV0KTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkbV9kZWxldGVfY2FsX2RhdGEodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoQURNX01BWF9DQUxfVFlQRVMsIHRoaXNfYWRtLmNhbF9kYXRhKTsKK30KKworc3RhdGljIGludCBhZG1faW5pdF9jYWxfZGF0YSh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjYWxfdHlwZV9pbmZvCWNhbF90eXBlX2luZm9bXSA9IHsKKwkJe3tBRE1fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRSwKKwkJe2FkbV9hbGxvY19jYWwsIGFkbV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJYWRtX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXthZG1fbWFwX2NhbF9kYXRhLCBhZG1fdW5tYXBfY2FsX2RhdGEsCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QURNX0FVRFBST0NfQ0FMX1RZUEUsCisJCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCisJCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FETV9BVURWT0xfQ0FMX1RZUEUsCisJCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCisJCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FETV9SVEFDX0lORk9fQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tBRE1fUlRBQ19BUFJfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tEVFNfRUFHTEVfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tTUlNfVFJVTUVESUFfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEUsCisJCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCisJCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKwl9OworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKEFETV9NQVhfQ0FMX1RZUEVTLCB0aGlzX2FkbS5jYWxfZGF0YSwKKwkJY2FsX3R5cGVfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSEgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiByZXQ7CitlcnI6CisJYWRtX2RlbGV0ZV9jYWxfZGF0YSgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fc2V0X3ZvbHVtZShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgdm9sdW1lKQoreworCXN0cnVjdCBhdWRwcm9jX3ZvbHVtZV9jdHJsX21hc3Rlcl9nYWluIGF1ZHByb2Nfdm9sOworCWludCBzeiA9IDA7CisJaW50IHJjICA9IDA7CisJaW50IHBvcnRfaWR4OworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkLCB2b2x1bWUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCB2b2x1bWUpOworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGF1ZHByb2Nfdm9sdW1lX2N0cmxfbWFzdGVyX2dhaW4pOworCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYXVkcHJvY192b2wucGFyYW1zLmhkci5wa3Rfc2l6ZSA9IHN6OworCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJYXVkcHJvY192b2wucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKKwlhdWRwcm9jX3ZvbC5wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOworCWF1ZHByb2Nfdm9sLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7CisJYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfc2l6ZSA9IHNpemVvZihhdWRwcm9jX3ZvbCkgLQorCQkJCXNpemVvZihhdWRwcm9jX3ZvbC5wYXJhbXMpOworCWF1ZHByb2Nfdm9sLmRhdGEubW9kdWxlX2lkID0gQVVEUFJPQ19NT0RVTEVfSURfVk9MX0NUUkw7CisJYXVkcHJvY192b2wuZGF0YS5wYXJhbV9pZCA9IEFVRFBST0NfUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU47CisJYXVkcHJvY192b2wuZGF0YS5wYXJhbV9zaXplID0gYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfc2l6ZSAtCisJCQkJCQlzaXplb2YoYXVkcHJvY192b2wuZGF0YSk7CisJYXVkcHJvY192b2wuZGF0YS5yZXNlcnZlZCA9IDA7CisJYXVkcHJvY192b2wubWFzdGVyX2dhaW4gPSB2b2x1bWU7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmF1ZHByb2Nfdm9sKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgZmFpbGVkIHBvcnQgPSAlI3hcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiBWb2wgY250cmwgU2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICUjeFxuIiwKKwkJCSBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgYWRtX3NldF9zb2Z0dm9sdW1lKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQlzdHJ1Y3QgYXVkcHJvY19zb2Z0dm9sdW1lX3BhcmFtcyAqc29mdHZvbF9wYXJhbSkKK3sKKwlzdHJ1Y3QgYXVkcHJvY19zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyBhdWRwcm9jX3NvZnR2b2w7CisJaW50IHN6ID0gMDsKKwlpbnQgcmMgID0gMDsKKwlpbnQgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXM6IHBlcmlvZCAlZCBzdGVwICVkIGN1cnZlICVkXG4iLCBfX2Z1bmNfXywKKwkJIHNvZnR2b2xfcGFyYW0tPnBlcmlvZCwgc29mdHZvbF9wYXJhbS0+c3RlcCwKKwkJIHNvZnR2b2xfcGFyYW0tPnJhbXBpbmdjdXJ2ZSk7CisKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhdWRwcm9jX3NvZnRfc3RlcF92b2x1bWVfcGFyYW1zKTsKKworCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMuaGRyLmhkcl9maWVsZCA9CisJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKKwlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5kZXN0X3BvcnQgPQorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKKwlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLnBheWxvYWRfYWRkcl9sc3cgPSAwOworCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMucGF5bG9hZF9hZGRyX21zdyA9IDA7CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7CisJYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5wYXlsb2FkX3NpemUgPSBzaXplb2YoYXVkcHJvY19zb2Z0dm9sKSAtCisJCQkJc2l6ZW9mKGF1ZHByb2Nfc29mdHZvbC5wYXJhbXMpOworCWF1ZHByb2Nfc29mdHZvbC5kYXRhLm1vZHVsZV9pZCA9IEFVRFBST0NfTU9EVUxFX0lEX1ZPTF9DVFJMOworCWF1ZHByb2Nfc29mdHZvbC5kYXRhLnBhcmFtX2lkID0KKwkJCUFVRFBST0NfUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUzsKKwlhdWRwcm9jX3NvZnR2b2wuZGF0YS5wYXJhbV9zaXplID0gYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5wYXlsb2FkX3NpemUgLQorCQkJCXNpemVvZihhdWRwcm9jX3NvZnR2b2wuZGF0YSk7CisJYXVkcHJvY19zb2Z0dm9sLmRhdGEucmVzZXJ2ZWQgPSAwOworCWF1ZHByb2Nfc29mdHZvbC5wZXJpb2QgPSBzb2Z0dm9sX3BhcmFtLT5wZXJpb2Q7CisJYXVkcHJvY19zb2Z0dm9sLnN0ZXAgPSBzb2Z0dm9sX3BhcmFtLT5zdGVwOworCWF1ZHByb2Nfc29mdHZvbC5yYW1waW5nX2N1cnZlID0gc29mdHZvbF9wYXJhbS0+cmFtcGluZ2N1cnZlOworCisJcHJfZGVidWcoIiVzOiBwZXJpb2QgJWQsIHN0ZXAgJWQsIGN1cnZlICVkXG4iLCBfX2Z1bmNfXywKKwkJIGF1ZHByb2Nfc29mdHZvbC5wZXJpb2QsIGF1ZHByb2Nfc29mdHZvbC5zdGVwLAorCQkgYXVkcHJvY19zb2Z0dm9sLnJhbXBpbmdfY3VydmUpOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZhdWRwcm9jX3NvZnR2b2wpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKKwkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IFNvZnQgdm9sdW1lIFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlI3hcbiIsCisJCQkgX19mdW5jX18sIHBvcnRfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IGFkbV9wYXJhbV9lbmFibGUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IG1vZHVsZV9pZCwgIGludCBlbmFibGUpCit7CisJc3RydWN0IGF1ZHByb2NfZW5hYmxlX3BhcmFtX3QgYWRtX21vZF9lbmFibGU7CisJaW50IHN6ID0gMDsKKwlpbnQgcmMgID0gMDsKKwlpbnQgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXMgcG9ydF9pZCAlZCwgbW9kdWxlX2lkIDB4JXgsIGVuYWJsZSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwb3J0X2lkLCAgbW9kdWxlX2lkLCAgZW5hYmxlKTsKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhdWRwcm9jX2VuYWJsZV9wYXJhbV90KTsKKworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIuaGRyX2ZpZWxkID0KKwkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMuaGRyLnBrdF9zaXplID0gc3o7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIuZGVzdF9wb3J0ID0KKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIudG9rZW4gPSAgcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKKwlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBheWxvYWRfc2l6ZSA9IHNpemVvZihhZG1fbW9kX2VuYWJsZSkgLQorCQkJCXNpemVvZihhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMpICsKKwkJCQlzaXplb2YoYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcyk7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcy5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcy5wYXJhbV9pZCA9IEFVRFBST0NfUEFSQU1fSURfRU5BQkxFOworCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5wYXJhbXMucGFyYW1fc2l6ZSA9CisJCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5wYXlsb2FkX3NpemUgLQorCQlzaXplb2YoYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcyk7CisJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcy5yZXNlcnZlZCA9IDA7CisJYWRtX21vZF9lbmFibGUuZW5hYmxlID0gZW5hYmxlOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKworCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmFkbV9tb2RfZW5hYmxlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgZmFpbGVkIHBvcnQgPSAlI3hcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiAgbW9kdWxlICV4ICBlbmFibGUgJWQgdGltZWQgb3V0IG9uIHBvcnQgPSAlI3hcbiIsCisJCQkgX19mdW5jX18sIG1vZHVsZV9pZCwgZW5hYmxlLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAorCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7CisKK30KKworaW50IGFkbV9zZW5kX2NhbGlicmF0aW9uKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXRoLCBpbnQgcGVyZl9tb2RlLAorCQkJIGludCBjYWxfdHlwZSwgY2hhciAqcGFyYW1zLCBpbnQgc2l6ZSkKK3sKKworCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUJKmFkbV9wYXJhbXMgPSBOVUxMOworCWludCBzeiwgcmMgPSAwOworCWludCBwb3J0X2lkeDsKKworCXByX2RlYnVnKCIlczpwb3J0X2lkICVkLCBwYXRoICVkLCBwZXJmX21vZGUgJWQsIGNhbF90eXBlICVkLCBzaXplICVkXG4iLAorCQkgX19mdW5jX18sIHBvcnRfaWQsIHBhdGgsIHBlcmZfbW9kZSwgY2FsX3R5cGUsIHNpemUpOworCisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWFwcyBhdWRpb19kZXZfY3RybCBwYXRoIGRlZmluaXRpb24gdG8gQUNEQiBkZWZpbml0aW9uICovCisJaWYgKGdldF9jYWxfcGF0aChwYXRoKSAhPSBSWF9ERVZJQ0UpIHsKKwkJcHJfZXJyKCIlczogYWNkYl9wYXRoICVkXG4iLCBfX2Z1bmNfXywgcGF0aCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSkgKyBzaXplOworCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkbV9wYXJhbXMpIHsKKwkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCW1lbWNweSgoKHU4ICopYWRtX3BhcmFtcyArIHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSksCisJCQlwYXJhbXMsIHNpemUpOworCisJYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWFkbV9wYXJhbXMtPmhkci5wa3Rfc2l6ZSA9IHN6OworCWFkbV9wYXJhbXMtPmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1fcGFyYW1zLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcGFyYW1zLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhZG1fcGFyYW1zLT5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OworCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7CisJLyogcGF5bG9hZCBhZGRyZXNzIGFuZCBtbWFwIGhhbmRsZSBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IGt6YWxsb2MgKi8KKwlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPSBzaXplOworCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKKwlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wYXJhbXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCisJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gJSN4XG4iLAorCQkJIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKKwkJZ290byBlbmQ7CisJfQorCXJjID0gMDsKKworZW5kOgorCWtmcmVlKGFkbV9wYXJhbXMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIGFkbV91cGRhdGVfd2FpdF9wYXJhbWV0ZXJzIG11c3QgYmUgY2FsbGVkIHdpdGggcm91dGluZyBkcml2ZXIgbG9ja3MuCisgKiBhZG1fcmVzZXRfd2FpdF9wYXJhbWV0ZXJzIG11c3QgYmUgY2FsbGVkIHdpdGggcm91dGluZyBkcml2ZXIgbG9ja3MuCisgKiBzZXQgYW5kIHJlc2V0IHBhcm1ldGVycyBhcmUgc2VwYXJhdGVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgY2FsbGVkCisgKiB1bmRlciByb3V0aW5nIGRyaXZlciBsb2NrLgorICogYWRtX3dhaXRfdGltZW91dCBpcyB0byBibG9jayB1bnRpbCB0aW1lb3V0IG9yIGludGVycnVwdGVkLiBUaW1lb3V0IGlzCisgKiBub3QgYSBhbiBlcnJvci4KKyAqLworaW50IGFkbV9zZXRfd2FpdF9wYXJhbWV0ZXJzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpCit7CisKKwlpbnQgcmV0ID0gMCwgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgY29wcF9pZHggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAorCQkgY29wcF9pZHgpOworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtwb3J0X2lkeF1bY29wcF9pZHhdID0gMTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV9zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOworCitlbmQ6CisJcmV0dXJuIHJldDsKKworfQorCitpbnQgYWRtX3Jlc2V0X3dhaXRfcGFyYW1ldGVycyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KQoreworCWludCByZXQgPSAwLCBwb3J0X2lkeDsKKworCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4IGNvcHBfaWR4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwKKwkJIGNvcHBfaWR4KTsKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAxKTsKKwl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtwb3J0X2lkeF1bY29wcF9pZHhdID0gMDsKKworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fd2FpdF90aW1lb3V0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCB3YWl0X3RpbWUpCit7CisJaW50IHJldCA9IDAsIHBvcnRfaWR4OworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkIDB4JXgsIGNvcHBfaWR4ICVkLCB3YWl0X3RpbWUgJWRcbiIsIF9fZnVuY19fLAorCQkgcG9ydF9pZCwgY29wcF9pZHgsIHdhaXRfdGltZSk7CisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocG9ydF9pZHggPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCgKKwkJdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfd2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSwKKwkJbXNlY3NfdG9famlmZmllcyh3YWl0X3RpbWUpKTsKKwlwcl9kZWJ1ZygiJXM6IHJldHVybiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXQgPSAtRUlOVFI7CitlbmQ6CisJcHJfZGVidWcoIiVzOiByZXR1cm4gJWQtLVxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkbV9zdG9yZV9jYWxfZGF0YShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgcGF0aCwgaW50IHBlcmZfbW9kZSwKKwkJICAgICAgIGludCBjYWxfaW5kZXgsIGNoYXIgKnBhcmFtcywgaW50ICpzaXplKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKKwlpbnQgYXBwX3R5cGUsIGFjZGJfaWQsIHBvcnRfaWR4LCBzYW1wbGVfcmF0ZTsKKworCWlmICh0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBjYWxfaW5kZXggJWQgbm90IGFsbG9jYXRlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKGdldF9jYWxfcGF0aChwYXRoKSAhPSBSWF9ERVZJQ0UpIHsKKwkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIHBhdGggdG8gc3RvcmUgY2FsaWJyYXRpb24gJWRcbiIsCisJCQkgX19mdW5jX18sIHBhdGgpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKKwlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKHBvcnRfaWR4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhY2RiX2lkID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuYWNkYl9pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlhcHBfdHlwZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmFwcF90eXBlW3BvcnRfaWR4XVtjb3BwX2lkeF0pOworCXNhbXBsZV9yYXRlID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAucmF0ZVtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKworCW11dGV4X2xvY2soJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOworCWNhbF9ibG9jayA9IGFkbV9maW5kX2NhbChjYWxfaW5kZXgsIGdldF9jYWxfcGF0aChwYXRoKSwgYXBwX3R5cGUsCisJCQkJYWNkYl9pZCwgc2FtcGxlX3JhdGUpOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBBRE0gY2FsIHNlbmQgZm9yIHBvcnRfaWQgPSAweCV4IVxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoY2FsX2luZGV4ID09IEFETV9BVURQUk9DX0NBTCkgeworCQlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID4gQVVEX1BST0NfQkxPQ0tfU0laRSkgeworCQkJcHJfZXJyKCIlczphdWRwcm9jOmludmFsaWQgc2l6ZSBleHAvYWN0dWFsWyV6ZCwgJWRdXG4iLAorCQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsICpzaXplKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfSBlbHNlIGlmIChjYWxfaW5kZXggPT0gQURNX0FVRFZPTF9DQUwpIHsKKwkJaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IEFVRF9WT0xfQkxPQ0tfU0laRSkgeworCQkJcHJfZXJyKCIlczphdWRfdm9sOmludmFsaWQgc2l6ZSBleHAvYWN0dWFsWyV6ZCwgJWRdXG4iLAorCQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsICpzaXplKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBOb3QgdmFsaWQgY2FsaWJyYXRpb24gZm9yIGRvbGJ5IHRvcG9sZ3lcbiIsCisJCQkgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwltZW1jcHkocGFyYW1zLCBjYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkciwgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkqc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCXByX2RlYnVnKCIlczpwb3J0X2lkICVkLCBjb3BwX2lkeCAlZCwgcGF0aCAlZCIsCisJCSBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgsIHBhdGgpOworCXByX2RlYnVnKCJwZXJmX21vZGUgJWQsIGNhbF90eXBlICVkLCBzaXplICVkXG4iLAorCQkgcGVyZl9tb2RlLCBjYWxfaW5kZXgsICpzaXplKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7CitlbmQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgYWRtX3NlbmRfY29tcHJlc3NlZF9kZXZpY2VfbXV0ZShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBib29sIG11dGVfb24pCit7CisJc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbXV0ZSBtdXRlX3BhcmFtczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcG9ydF9pZHg7CisKKwlwcl9kZWJ1ZygiJXMgcG9ydF9pZDogMHgleCwgY29wcF9pZHggJWQsIG11dGVfb246ICVkXG4iLAorCQkgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBtdXRlX29uKTsKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDAgfHwgcG9ydF9pZHggPj0gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4IGNvcHBfaWR4ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIuaGRyX2ZpZWxkID0KKwkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIucGt0X3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBhZG1fc2V0X2NvbXByZXNzZWRfZGV2aWNlX211dGUpOworCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwltdXRlX3BhcmFtcy5jb21tYW5kLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwltdXRlX3BhcmFtcy5jb21tYW5kLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwltdXRlX3BhcmFtcy5jb21tYW5kLmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7CisJbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OworCW11dGVfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJbXV0ZV9wYXJhbXMuY29tbWFuZC5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwltdXRlX3BhcmFtcy5jb21tYW5kLm1lbV9tYXBfaGFuZGxlID0gMDsKKwltdXRlX3BhcmFtcy5jb21tYW5kLnBheWxvYWRfc2l6ZSA9IHNpemVvZihtdXRlX3BhcmFtcykgLQorCQkJCQkJc2l6ZW9mKG11dGVfcGFyYW1zLmNvbW1hbmQpOworCW11dGVfcGFyYW1zLnBhcmFtcy5tb2R1bGVfaWQgPSBBVURQUk9DX01PRFVMRV9JRF9DT01QUkVTU0VEX01VVEU7CisJbXV0ZV9wYXJhbXMucGFyYW1zLnBhcmFtX2lkID0gQVVEUFJPQ19QQVJBTV9JRF9DT01QUkVTU0VEX01VVEU7CisJbXV0ZV9wYXJhbXMucGFyYW1zLnBhcmFtX3NpemUgPSBtdXRlX3BhcmFtcy5jb21tYW5kLnBheWxvYWRfc2l6ZSAtCisJCQkJCXNpemVvZihtdXRlX3BhcmFtcy5wYXJhbXMpOworCW11dGVfcGFyYW1zLnBhcmFtcy5yZXNlcnZlZCA9IDA7CisJbXV0ZV9wYXJhbXMubXV0ZV9vbiA9IG11dGVfb247CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZtdXRlX3BhcmFtcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZGV2aWNlIG11dGUgZm9yIHBvcnQgJWQgY29wcCAlZCBmYWlsZWQsIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHNlbmQgZGV2aWNlIG11dGUgZm9yIHBvcnQgJWQgY29wcCAlZCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZW5kOworCX0KKwlyZXQgPSAwOworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9sYXRlbmN5KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBsYXRlbmN5KQoreworCXN0cnVjdCBhZG1fc2V0X2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3kgbGF0ZW5jeV9wYXJhbXM7CisJaW50IHBvcnRfaWR4OworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzIHBvcnRfaWQ6IDB4JXgsIGNvcHBfaWR4ICVkIGxhdGVuY3k6ICVkXG4iLCBfX2Z1bmNfXywKKwkJIHBvcnRfaWQsIGNvcHBfaWR4LCBsYXRlbmN5KTsKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDAgfHwgcG9ydF9pZHggPj0gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4IGNvcHBfaWR4ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIuaGRyX2ZpZWxkID0KKwkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIucGt0X3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBhZG1fc2V0X2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3kpOworCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7CisJbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OworCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLm1lbV9tYXBfaGFuZGxlID0gMDsKKwlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLnBheWxvYWRfc2l6ZSA9IHNpemVvZihsYXRlbmN5X3BhcmFtcykgLQorCQkJCQkJc2l6ZW9mKGxhdGVuY3lfcGFyYW1zLmNvbW1hbmQpOworCWxhdGVuY3lfcGFyYW1zLnBhcmFtcy5tb2R1bGVfaWQgPSBBVURQUk9DX01PRFVMRV9JRF9DT01QUkVTU0VEX0xBVEVOQ1k7CisJbGF0ZW5jeV9wYXJhbXMucGFyYW1zLnBhcmFtX2lkID0gQVVEUFJPQ19QQVJBTV9JRF9DT01QUkVTU0VEX0xBVEVOQ1k7CisJbGF0ZW5jeV9wYXJhbXMucGFyYW1zLnBhcmFtX3NpemUgPSBsYXRlbmN5X3BhcmFtcy5jb21tYW5kLnBheWxvYWRfc2l6ZSAtCisJCQkJCXNpemVvZihsYXRlbmN5X3BhcmFtcy5wYXJhbXMpOworCWxhdGVuY3lfcGFyYW1zLnBhcmFtcy5yZXNlcnZlZCA9IDA7CisJbGF0ZW5jeV9wYXJhbXMubGF0ZW5jeSA9IGxhdGVuY3k7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZsYXRlbmN5X3BhcmFtcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogc2VuZCBkZXZpY2UgbGF0ZW5jeSBlcnIgJWQgZm9yIHBvcnQgJWQgY29wcCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHNlbmQgZGV2aWNlIGxhdGVuY3kgZm9yIHBvcnQgJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCXBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZW5kOworCX0KKwlyZXQgPSAwOworZW5kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZG1fc2V0X3NvdW5kX2ZvY3VzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCisJCQlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGEpCit7CisJc3RydWN0IGFkbV9zZXRfZmx1ZW5jZV9zb3VuZGZvY3VzX3BhcmFtIHNvdW5kZm9jdXNfcGFyYW1zOworCWludCBzeiA9IDA7CisJaW50IHJldCAgPSAwOworCWludCBwb3J0X2lkeDsKKwlpbnQgaTsKKworCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkXG4iLAorCQkgIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7CisKKwlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChwb3J0X2lkeCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9zZXRfZmx1ZW5jZV9zb3VuZGZvY3VzX3BhcmFtKTsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmhkcl9maWVsZCA9CisJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkgICAgICBBUFJfUEtUX1ZFUik7CisJc291bmRmb2N1c19wYXJhbXMucGFyYW1zLmhkci5wa3Rfc2l6ZSA9IHN6OworCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOworCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07CisJc291bmRmb2N1c19wYXJhbXMucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmRlc3RfcG9ydCA9CisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfAorCQkJCUFETV9DTElFTlRfSURfU09VUkNFX1RSQUNLSU5HIDw8IDggfCBjb3BwX2lkeDsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKKwlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJc291bmRmb2N1c19wYXJhbXMucGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOworCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7CisJc291bmRmb2N1c19wYXJhbXMucGFyYW1zLnBheWxvYWRfc2l6ZSA9IHNpemVvZihzb3VuZGZvY3VzX3BhcmFtcykgLQorCQkJCXNpemVvZihzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMpOworCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEubW9kdWxlX2lkID0gVk9JQ0VQUk9DX01PRFVMRV9JRF9HRU5FUklDX1RYOworCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEucGFyYW1faWQgPSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VOREZPQ1VTOworCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEucGFyYW1fc2l6ZSA9CisJCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5wYXlsb2FkX3NpemUgLQorCQlzaXplb2Yoc291bmRmb2N1c19wYXJhbXMuZGF0YSk7CisJc291bmRmb2N1c19wYXJhbXMuZGF0YS5yZXNlcnZlZCA9IDA7CisKKwltZW1zZXQoJihzb3VuZGZvY3VzX3BhcmFtcy5zb3VuZGZvY3VzX2RhdGEpLCAweEZGLAorCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdW5kZm9jdXNfdCkpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7CisJCXNvdW5kZm9jdXNfcGFyYW1zLnNvdW5kZm9jdXNfZGF0YS5zdGFydF9hbmdsZXNbaV0gPQorCQkJc291bmRGb2N1c0RhdGEuc3RhcnRfYW5nbGVbaV07CisJCXNvdW5kZm9jdXNfcGFyYW1zLnNvdW5kZm9jdXNfZGF0YS5lbmFibGVzW2ldID0KKwkJCXNvdW5kRm9jdXNEYXRhLmVuYWJsZVtpXTsKKwkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKKwkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLnN0YXJ0X2FuZ2xlW2ldKTsKKwkJcHJfZGVidWcoIiVzOiBlbmFibGVbJWRdID0gJWRcbiIsCisJCQkgIF9fZnVuY19fLCBpLCBzb3VuZEZvY3VzRGF0YS5lbmFibGVbaV0pOworCX0KKwlzb3VuZGZvY3VzX3BhcmFtcy5zb3VuZGZvY3VzX2RhdGEuZ2Fpbl9zdGVwID0KKwkJCQkJc291bmRGb2N1c0RhdGEuZ2Fpbl9zdGVwOworCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLCBzb3VuZEZvY3VzRGF0YS5nYWluX3N0ZXApOworCisJc291bmRmb2N1c19wYXJhbXMuc291bmRmb2N1c19kYXRhLnJlc2VydmVkID0gMDsKKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJnNvdW5kZm9jdXNfcGFyYW1zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAorCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCisJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMgIT0gMCkgeworCQlwcl9lcnIoIiVzIC0gc2V0IHBhcmFtcyByZXR1cm5lZCBlcnJvciBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKSk7CisKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gMDsKKworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRtX2dldF9zb3VuZF9mb2N1cyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAorCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSkKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwljaGFyICpwYXJhbXNfdmFsdWU7CisJdWludDMyX3QgcGFyYW1fcGF5bG9hZF9sZW4gPSBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QpOworCXN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgKnNvdW5kZm9jdXNfcGFyYW1zOworCisJcHJfZGVidWcoIiVzOiBFbnRlciwgcG9ydF9pZCAlZCwgY29wcF9pZHggJWRcbiIsCisJCSAgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKKworCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1fcGF5bG9hZF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcGFyYW1zX3ZhbHVlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gYWRtX2dldF9wYXJhbXNfdjIocG9ydF9pZCwgY29wcF9pZHgsCisJCQkJVk9JQ0VQUk9DX01PRFVMRV9JRF9HRU5FUklDX1RYLAorCQkJCVZPSUNFUFJPQ19QQVJBTV9JRF9GTFVFTkNFX1NPVU5ERk9DVVMsCisJCQkJcGFyYW1fcGF5bG9hZF9sZW4sCisJCQkJcGFyYW1zX3ZhbHVlLAorCQkJCUFETV9DTElFTlRfSURfU09VUkNFX1RSQUNLSU5HKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGdldCBwYXJhbWV0ZXJzIGZhaWxlZCByZXQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAodGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzICE9IDApIHsKKwkJcHJfZXJyKCIlcyAtIGdldCBwYXJhbXMgcmV0dXJuZWQgZXJyb3IgWyVzXVxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cykpOworCisJCWtmcmVlKHBhcmFtc192YWx1ZSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKTsKKwkJZ290byBkb25lOworCX0KKworCXNvdW5kZm9jdXNfcGFyYW1zID0gKHN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgKikKKwkJCQkJCQkJcGFyYW1zX3ZhbHVlOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7CisJCXNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSA9CisJCQkJCXNvdW5kZm9jdXNfcGFyYW1zLT5zdGFydF9hbmdsZXNbaV07CisJCXNvdW5kRm9jdXNEYXRhLT5lbmFibGVbaV0gPSBzb3VuZGZvY3VzX3BhcmFtcy0+ZW5hYmxlc1tpXTsKKwkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKKwkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSk7CisJCXByX2RlYnVnKCIlczogZW5hYmxlWyVkXSA9ICVkXG4iLAorCQkJICBfX2Z1bmNfXywgaSwgc291bmRGb2N1c0RhdGEtPmVuYWJsZVtpXSk7CisJfQorCXNvdW5kRm9jdXNEYXRhLT5nYWluX3N0ZXAgPSBzb3VuZGZvY3VzX3BhcmFtcy0+Z2Fpbl9zdGVwOworCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLCBzb3VuZEZvY3VzRGF0YS0+Z2Fpbl9zdGVwKTsKKworCWtmcmVlKHBhcmFtc192YWx1ZSk7CisKK2RvbmU6CisJcHJfZGVidWcoIiVzOiBFeGl0LCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkbV9zb3VyY2VfdHJhY2tpbmdfYWxsb2NfbWFwX21lbW9yeSh2b2lkKQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJTT1VSQ0VfVFJBQ0tJTkciLAorCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAorCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlLAorCQkJCSAgQVVEX1BST0NfQkxPQ0tfU0laRSwKKwkJCQkgICZ0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyLAorCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSwKKwkJCQkgICZ0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgsIEFETV9NRU1fTUFQX0lOREVYX1NPVVJDRV9UUkFDS0lORyk7CisJcmV0ID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygmdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciwKKwkJCTAsCisJCQkodWludDMyX3QgKikmdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplLAorCQkJMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBtZW1vcnksIHBhZGRyID0gMHglcEssIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJKHZvaWQgKil0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyLAorCQkJKHVpbnQzMl90KXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSk7CisKKwkJbXNtX2F1ZGlvX2lvbl9mcmVlKHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAorCQkJCSAgIHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlKTsKKwkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9jbGllbnQgPSBOVUxMOworCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7CisJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7CisJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAua3ZhZGRyID0gTlVMTDsKKwkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciA9IDA7CisJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cyA9IC0xOworCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXMKKwkJCQlbQURNX01FTV9NQVBfSU5ERVhfU09VUkNFX1RSQUNLSU5HXSwgMCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSAwOworCXByX2RlYnVnKCIlczogcGFkZHIgPSAweCVwSywgc2l6ZSA9ICVkLCBtZW1fbWFwX2hhbmRsZSA9IDB4JXhcbiIsCisJCSAgX19mdW5jX18sICh2b2lkICopdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciwKKwkJICAodWludDMyX3QpdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplLAorCQkgIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXMKKwkJCSAgICAgIFtBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddKSk7CisKK2RvbmU6CisJcHJfZGVidWcoIiVzOiBFeGl0LCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRtX2dldF9zb3VyY2VfdHJhY2tpbmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKKwkJCSAgICBzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpCit7CisJc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSBhZG1wOworCWludCBwX2lkeCwgcmV0ID0gMCwgaTsKKwlzdHJ1Y3QgYWRtX3BhcmFtX2ZsdWVuY2Vfc291cmNldHJhY2tpbmdfdCAqc291cmNlX3RyYWNraW5nX3BhcmFtczsKKworCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkXG4iLAorCQkgIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7CisKKwlpZiAoIXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIpIHsKKwkJLyogQWxsb2NhdGUgYW5kIG1hcCBzaGFyZWQgbWVtb3J5IGZvciBvdXQgb2YgYmFuZCB1c2FnZSAqLworCQlyZXQgPSBhZG1fc291cmNlX3RyYWNraW5nX2FsbG9jX21hcF9tZW1vcnkoKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCXBfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAocF9pZHggPCAwKSB7CisJCXByX2VycigiJXMgLSBpbnZhbGlkIHBvcnQgaW5kZXggJWksIHBvcnQgaWQgJWksIGNvcHAgaWR4ICVpXG4iLAorCQkJX19mdW5jX18sIHBfaWR4LCBwb3J0X2lkLCBjb3BwX2lkeCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWFkbXAuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWFkbXAuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFkbXApOworCWFkbXAuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbXAuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKKwlhZG1wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOworCWFkbXAuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbXAuaGRyLmRlc3RfcG9ydCA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BfaWR4XVtjb3BwX2lkeF0pOworCWFkbXAuaGRyLnRva2VuID0gcF9pZHggPDwgMTYgfCBBRE1fQ0xJRU5UX0lEX1NPVVJDRV9UUkFDS0lORyA8PCA4IHwKKwkJCSBjb3BwX2lkeDsKKwlhZG1wLmhkci5vcGNvZGUgPSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjU7CisJYWRtcC5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPQorCQlsb3dlcl8zMl9iaXRzKHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIpOworCWFkbXAuZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0KKwkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkcik7CisJYWRtcC5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCisJCQkJCSAgQURNX01FTV9NQVBfSU5ERVhfU09VUkNFX1RSQUNLSU5HXSk7CisJYWRtcC5tb2R1bGVfaWQgPSBWT0lDRVBST0NfTU9EVUxFX0lEX0dFTkVSSUNfVFg7CisJYWRtcC5wYXJhbV9pZCA9IFZPSUNFUFJPQ19QQVJBTV9JRF9GTFVFTkNFX1NPVVJDRVRSQUNLSU5HOworCWFkbXAucGFyYW1fbWF4X3NpemUgPSBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QpCisJCQkJKyBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KTsKKwlhZG1wLnJlc2VydmVkID0gMDsKKworCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwX2lkeF1bY29wcF9pZHhdLCAtMSk7CisKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmYWRtcCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBnZXQgU291cmNlIFRyYWNraW5nIFBhcmFtc1xuIiwKKwkJCV9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcF9pZHhdW2NvcHBfaWR4XSwKKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXMgLSBnZXQgcGFyYW1zIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKKwkJCQlbcF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQlbcF9pZHhdW2NvcHBfaWR4XSkpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0CisJCQkJCVtwX2lkeF1bY29wcF9pZHhdKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAodGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzICE9IDApIHsKKwkJcHJfZXJyKCIlcyAtIGdldCBwYXJhbXMgcmV0dXJuZWQgZXJyb3IgWyVzXVxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cykpOworCisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKTsKKwkJZ290byBkb25lOworCX0KKworCXNvdXJjZV90cmFja2luZ19wYXJhbXMgPSAoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QgKikKKwkJCSh0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciArCisJCQkgc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSkpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7CisJCXNvdXJjZVRyYWNraW5nRGF0YS0+dmFkW2ldID0gc291cmNlX3RyYWNraW5nX3BhcmFtcy0+dmFkW2ldOworCQlwcl9kZWJ1ZygiJXM6IHZhZFslZF0gPSAlZFxuIiwKKwkJCSAgX19mdW5jX18sIGksIHNvdXJjZVRyYWNraW5nRGF0YS0+dmFkW2ldKTsKKwl9CisJc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffc3BlZWNoID0gc291cmNlX3RyYWNraW5nX3BhcmFtcy0+ZG9hX3NwZWVjaDsKKwlwcl9kZWJ1ZygiJXM6IGRvYV9zcGVlY2ggPSAlZFxuIiwKKwkJICBfX2Z1bmNfXywgc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffc3BlZWNoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlM7IGkrKykgeworCQlzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9ub2lzZVtpXSA9CisJCQkJCXNvdXJjZV90cmFja2luZ19wYXJhbXMtPmRvYV9ub2lzZVtpXTsKKwkJcHJfZGVidWcoIiVzOiBkb2Ffbm9pc2VbJWRdID0gJWRcbiIsCisJCQkgIF9fZnVuY19fLCBpLCBzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9ub2lzZVtpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9MQVJfQUNUSVZJVFlfSU5ESUNBVE9SUzsgaSsrKSB7CisJCXNvdXJjZVRyYWNraW5nRGF0YS0+cG9sYXJfYWN0aXZpdHlbaV0gPQorCQkJCXNvdXJjZV90cmFja2luZ19wYXJhbXMtPnBvbGFyX2FjdGl2aXR5W2ldOworCQlwcl9kZWJ1ZygiJXM6IHBvbGFyX2FjdGl2aXR5WyVkXSA9ICVkXG4iLAorCQkJICBfX2Z1bmNfXywgaSwgc291cmNlVHJhY2tpbmdEYXRhLT5wb2xhcl9hY3Rpdml0eVtpXSk7CisJfQorCisJcmV0ID0gMDsKKworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZG1faW5pdCh2b2lkKQoreworCWludCBpID0gMCwgajsKKworCXRoaXNfYWRtLmFwciA9IE5VTEw7CisJdGhpc19hZG0uZWNfcmVmX3J4ID0gLTE7CisJYXRvbWljX3NldCgmdGhpc19hZG0ubWF0cml4X21hcF9zdGF0LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3dhaXQpOworCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGlzX2FkbS5hZG1fd2FpdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUZFX01BWF9QT1JUUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgeworCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5pZFtpXVtqXSwgUkVTRVRfQ09QUF9JRCk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNudFtpXVtqXSwgMCk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W2ldW2pdLCAwKTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAubW9kZVtpXVtqXSwgMCk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbaV1bal0sIDApOworCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5yYXRlW2ldW2pdLCAwKTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuY2hhbm5lbHNbaV1bal0sIDApOworCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5iaXRfd2lkdGhbaV1bal0sIDApOworCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtpXVtqXSwgMCk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFjZGJfaWRbaV1bal0sIDApOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpc19hZG0uY29wcC53YWl0W2ldW2pdKTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3N0YXRbaV1bal0sIDApOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgKKwkJCQkmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfd2FpdFtpXVtqXSk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W2ldW2pdLCAwKTsKKwkJCXRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5W2ldW2pdID0gMDsKKwkJCXRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1tpXVtqXSA9CisJCQkJQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRDsKKwkJfQorCX0KKworCWlmIChhZG1faW5pdF9jYWxfZGF0YSgpKQorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgaW5pdCBjYWwgZGF0YSFcbiIsIF9fZnVuY19fKTsKKworCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50ID0gTlVMTDsKKwl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7CisJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplID0gMDsKKwl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciA9IE5VTEw7CisJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciA9IDA7CisJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzID0gLTE7CisJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW0FETV9NRU1fTUFQX0lOREVYX1NPVVJDRV9UUkFDS0lOR10sCisJCSAgIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZG1fZXhpdCh2b2lkKQoreworCWFkbV9kZWxldGVfY2FsX2RhdGEoKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGFkbV9pbml0KTsKK21vZHVsZV9leGl0KGFkbV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFmZS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjMzlkMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFmZS5jCkBAIC0wLDAgKzEsNjYyNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+CisjaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+CisjaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwcl90YWwuaD4KKworI2RlZmluZSBXQUtFTE9DS19USU1FT1VUCTUwMDAKK2VudW0geworCUFGRV9DT01NT05fUlhfQ0FMID0gMCwKKwlBRkVfQ09NTU9OX1RYX0NBTCwKKwlBRkVfQUFOQ19DQUwsCisJQUZFX0ZCX1NQS1JfUFJPVF9DQUwsCisJQUZFX0hXX0RFTEFZX0NBTCwKKwlBRkVfU0lERVRPTkVfQ0FMLAorCUFGRV9UT1BPTE9HWV9DQUwsCisJQUZFX0NVU1RfVE9QT0xPR1lfQ0FMLAorCUFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMLAorCUFGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMLAorCU1BWF9BRkVfQ0FMX1RZUEVTCit9OworCitlbnVtIGZic3Bfc3RhdGUgeworCUZCU1BfSU5DT1JSRUNUX09QX01PREUsCisJRkJTUF9JTkFDVElWRSwKKwlGQlNQX1dBUk1VUCwKKwlGQlNQX0lOX1BST0dSRVNTLAorCUZCU1BfU1VDQ0VTUywKKwlGQlNQX0ZBSUxFRCwKKwlNQVhfRkJTUF9TVEFURQorfTsKKworc3RhdGljIGNoYXIgZmJzcF9zdGF0ZVtNQVhfRkJTUF9TVEFURV1bNTBdID0geworCVtGQlNQX0lOQ09SUkVDVF9PUF9NT0RFXSA9ICJpbmNvcnJlY3Qgb3BlcmF0aW9uIG1vZGUiLAorCVtGQlNQX0lOQUNUSVZFXSA9ICJwb3J0IG5vdCBzdGFydGVkIiwKKwlbRkJTUF9XQVJNVVBdID0gIndhaXRpbmcgZm9yIHdhcm11cCIsCisJW0ZCU1BfSU5fUFJPR1JFU1NdID0gImluIHByb2dyZXNzIHN0YXRlIiwKKwlbRkJTUF9TVUNDRVNTXSA9ICJzdWNjZXNzIiwKKwlbRkJTUF9GQUlMRURdID0gImZhaWxlZCIKK307CisKK2VudW0geworCVVTRV9DQUxJQlJBVEVEX1IwVE8sCisJVVNFX1NBRkVfUjBUTworfTsKKworZW51bSB7CisJUVVJQ0tfQ0FMSUJfRElTQUJMRSwKKwlRVUlDS19DQUxJQl9FTkFCTEUKK307CisKK2VudW0geworCVE2QUZFX01TTV9TUEtSX1BST0NFU1NJTkcgPSAwLAorCVE2QUZFX01TTV9TUEtSX0NBTElCUkFUSU9OLAorCVE2QUZFX01TTV9TUEtSX0ZUTV9NT0RFCit9OworCitzdHJ1Y3Qgd2xvY2sgeworCXN0cnVjdCB3YWtldXBfc291cmNlIHdzOworfTsKKworc3RhdGljIHN0cnVjdCB3bG9jayB3bDsKKworc3RydWN0IGFmZV9jdGwgeworCXZvaWQgKmFwcjsKKwlhdG9taWNfdCBzdGF0ZTsKKwlhdG9taWNfdCBzdGF0dXM7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdFtBRkVfTUFYX1BPUlRTXTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdm9pZCAoKnR4X2NiKSh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7CisJdm9pZCAoKnJ4X2NiKSh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7CisJdm9pZCAqdHhfcHJpdmF0ZV9kYXRhOworCXZvaWQgKnJ4X3ByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBtbWFwX2hhbmRsZTsKKworCWludAl0b3BvbG9neVtBRkVfTUFYX1BPUlRTXTsKKwlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbTUFYX0FGRV9DQUxfVFlQRVNdOworCisJYXRvbWljX3QgbWVtX21hcF9jYWxfaGFuZGxlc1tNQVhfQUZFX0NBTF9UWVBFU107CisJYXRvbWljX3QgbWVtX21hcF9jYWxfaW5kZXg7CisJdTMyIGFmZV9jYWxfbW9kZVtBRkVfTUFYX1BPUlRTXTsKKworCXUxNiBkdG1mX2dlbl9yeF9wb3J0aWQ7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3Nwa19wcm90X2NmZwlwcm90X2NmZzsKKwlzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9jYWxpYl9nZXRfcmVzcAljYWxpYl9kYXRhOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19zcF90aF92aV9mdG1fY2ZnCXRoX2Z0bV9jZmc7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX2Z0bV9jZmcJZXhfZnRtX2NmZzsKKwlzdHJ1Y3QgYWZlX3NwX3RoX3ZpX2dldF9wYXJhbV9yZXNwCXRoX3ZpX3Jlc3A7CisJc3RydWN0IGFmZV9zcF9leF92aV9nZXRfcGFyYW1fcmVzcAlleF92aV9yZXNwOworCWludCB2aV90eF9wb3J0OworCWludCB2aV9yeF9wb3J0OworCXVpbnQzMl90IGFmZV9zYW1wbGVfcmF0ZXNbQUZFX01BWF9QT1JUU107CisJc3RydWN0IGFhbmNfZGF0YSBhYW5jX2luZm87CisJc3RydWN0IG11dGV4IGFmZV9jbWRfbG9jazsKKwlpbnQgc2V0X2N1c3RvbV90b3BvbG9neTsKK307CisKK3N0YXRpYyBhdG9taWNfdCBhZmVfcG9ydHNfbWFkX3R5cGVbU0xJTUJVU19QT1JUX0xBU1QgLSBTTElNQlVTXzBfUlhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWZlX2NvbmZpZ3VyZWRfY21kOworCitzdGF0aWMgc3RydWN0IGFmZV9jdGwgdGhpc19hZmU7CisKKyNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCisjZGVmaW5lIFE2QUZFX01BWF9WT0xVTUUgMHgzRkZGCisKK3N0YXRpYyBpbnQgcGNtX2FmZV9pbnN0YW5jZVsyXTsKK3N0YXRpYyBpbnQgcHJveHlfYWZlX2luc3RhbmNlWzJdOworYm9vbCBhZmVfY2xvc2VfZG9uZVsyXSA9IHt0cnVlLCB0cnVlfTsKKworI2RlZmluZSBTSVpFT0ZfQ0ZHX0NNRCh5KSBcCisJCShzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsgc2l6ZW9mKHUxNikgKyAoc2l6ZW9mKHN0cnVjdCB5KSkpCisKK3N0YXRpYyBpbnQgYWZlX2dldF9jYWxfaHdfZGVsYXkoaW50MzJfdCBwYXRoLAorCQkJCXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZW50cnkgKmVudHJ5KTsKK3N0YXRpYyBpbnQgcmVtYXBfY2FsX2RhdGEoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssIGludCBjYWxfaW5kZXgpOworCitpbnQgYWZlX2dldF90b3BvbG9neShpbnQgcG9ydF9pZCkKK3sKKwlpbnQgdG9wb2xvZ3k7CisJaW50IHBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisKKwlpZiAoKHBvcnRfaW5kZXggPCAwKSB8fCAocG9ydF9pbmRleCA+IEFGRV9NQVhfUE9SVFMpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpbmRleCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaW5kZXgpOworCQl0b3BvbG9neSA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0b3BvbG9neSA9IHRoaXNfYWZlLnRvcG9sb2d5W3BvcnRfaW5kZXhdOworZG9uZToKKwlyZXR1cm4gdG9wb2xvZ3k7Cit9CisKK3ZvaWQgYWZlX3NldF9hYW5jX2luZm8oc3RydWN0IGFhbmNfZGF0YSAqcTZfYWFuY19pbmZvKQoreworCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSA9IHE2X2FhbmNfaW5mby0+YWFuY19hY3RpdmU7CisJdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydCA9IHE2X2FhbmNfaW5mby0+YWFuY19yeF9wb3J0OworCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnQgPSBxNl9hYW5jX2luZm8tPmFhbmNfdHhfcG9ydDsKKworCXByX2RlYnVnKCIlczogYWFuYyBhY3RpdmUgaXMgJWQgcnggcG9ydCBpcyAweCV4LCB0eCBwb3J0IGlzIDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19hY3RpdmUsCisJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnQsCisJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBhZmVfY2FsbGJhY2tfZGVidWdfcHJpbnQoc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSkKK3sKKwl1aW50MzJfdCAqcGF5bG9hZDsKKworCXBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOworCisJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA4KQorCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIFBMIzFbMHgleF0sIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCisJCQlkYXRhLT5wYXlsb2FkX3NpemUpOworCWVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA0KQorCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sCisJCQlkYXRhLT5wYXlsb2FkX3NpemUpOworCWVsc2UKKwkJcHJfZGVidWcoIiVzOiBjb2RlID0gMHgleCwgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIGRhdGEtPm9wY29kZSwgZGF0YS0+cGF5bG9hZF9zaXplKTsKK30KKworc3RhdGljIGludDMyX3Qgc3BfbWFrZV9hZmVfY2FsbGJhY2sodWludDMyX3QgKnBheWxvYWQsIHVpbnQzMl90IHBheWxvYWRfc2l6ZSkKK3sKKwl1MzIgcGFyYW1faWQ7CisJc3RydWN0IGFmZV9zcGtyX3Byb3RfY2FsaWJfZ2V0X3Jlc3AgKnJlc3AgPQorCQkoc3RydWN0IGFmZV9zcGtyX3Byb3RfY2FsaWJfZ2V0X3Jlc3AgKikgcGF5bG9hZDsKKworCWlmICghKCYocmVzcC0+cGRhdGEpKSkgeworCQlwcl9lcnIoIiVzOiBFcnJvcjogcmVzcCBwZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmFtX2lkID0gcmVzcC0+cGRhdGEucGFyYW1faWQ7CisJaWYgKHBhcmFtX2lkID09IEFGRV9QQVJBTV9JRF9DQUxJQl9SRVNfQ0ZHX1YyKSB7CisJCWlmIChwYXlsb2FkX3NpemUgPCBzaXplb2YodGhpc19hZmUuY2FsaWJfZGF0YSkpIHsKKwkJCXByX2VycigiJXM6IEVycm9yOiByZWNlaXZlZCBzaXplICVkLCBjYWxpYl9kYXRhIHNpemUgJXp1XG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUsCisJCQkJc2l6ZW9mKHRoaXNfYWZlLmNhbGliX2RhdGEpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1lbWNweSgmdGhpc19hZmUuY2FsaWJfZGF0YSwgcGF5bG9hZCwKKwkJCXNpemVvZih0aGlzX2FmZS5jYWxpYl9kYXRhKSk7CisJCWlmICghdGhpc19hZmUuY2FsaWJfZGF0YS5zdGF0dXMpIHsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogY2FsaWIgcmVzcCBzdGF0dXM6ICVkIiwgX19mdW5jX18sCisJCQkJICB0aGlzX2FmZS5jYWxpYl9kYXRhLnN0YXR1cyk7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgLTEpOworCQl9CisJfQorCWlmIChwYXJhbV9pZCA9PSBBRkVfUEFSQU1fSURfU1BfVjJfVEhfVklfRlRNX1BBUkFNUykgeworCQlpZiAocGF5bG9hZF9zaXplIDwgc2l6ZW9mKHRoaXNfYWZlLnRoX3ZpX3Jlc3ApKSB7CisJCQlwcl9lcnIoIiVzOiBFcnJvcjogcmVjZWl2ZWQgc2l6ZSAlZCwgdGhfdmlfcmVzcCBzaXplICV6dVxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZF9zaXplLAorCQkJCXNpemVvZih0aGlzX2FmZS50aF92aV9yZXNwKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZW1jcHkoJnRoaXNfYWZlLnRoX3ZpX3Jlc3AsIHBheWxvYWQsCisJCQlzaXplb2YodGhpc19hZmUudGhfdmlfcmVzcCkpOworCQlpZiAoIXRoaXNfYWZlLnRoX3ZpX3Jlc3Auc3RhdHVzKSB7CisJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IHRoIHZpIHJlc3Agc3RhdHVzOiAlZCIsIF9fZnVuY19fLAorCQkJCSAgdGhpc19hZmUudGhfdmlfcmVzcC5zdGF0dXMpOworCQkJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIC0xKTsKKwkJfQorCX0KKwlpZiAocGFyYW1faWQgPT0gQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX0ZUTV9QQVJBTVMpIHsKKwkJaWYgKHBheWxvYWRfc2l6ZSA8IHNpemVvZih0aGlzX2FmZS5leF92aV9yZXNwKSkgeworCQkJcHJfZXJyKCIlczogRXJyb3I6IHJlY2VpdmVkIHNpemUgJWQsIGV4X3ZpX3Jlc3Agc2l6ZSAlenVcbiIsCisJCQkJX19mdW5jX18sIHBheWxvYWRfc2l6ZSwKKwkJCQlzaXplb2YodGhpc19hZmUuZXhfdmlfcmVzcCkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWVtY3B5KCZ0aGlzX2FmZS5leF92aV9yZXNwLCBwYXlsb2FkLAorCQkJc2l6ZW9mKHRoaXNfYWZlLmV4X3ZpX3Jlc3ApKTsKKwkJaWYgKCF0aGlzX2FmZS5leF92aV9yZXNwLnN0YXR1cykgeworCQkJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDApOworCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzOiBleCB2aSByZXNwIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKKwkJCQkgIHRoaXNfYWZlLmV4X3ZpX3Jlc3Auc3RhdHVzKTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAtMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgYWZlX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCit7CisJaWYgKCFkYXRhKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW0gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKKwkJcHJfZGVidWcoIiVzOiByZXNldCBldmVudCA9ICVkICVkIGFwclslcEtdXG4iLAorCQkJX19mdW5jX18sCisJCQlkYXRhLT5yZXNldF9ldmVudCwgZGF0YS0+cmVzZXRfcHJvYywgdGhpc19hZmUuYXByKTsKKworCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhNQVhfQUZFX0NBTF9UWVBFUywKKwkJCXRoaXNfYWZlLmNhbF9kYXRhKTsKKworCQkvKiBSZXNldCB0aGUgY3VzdG9tIHRvcG9sb2d5IG1vZGU6IHRvIHJlc2VuZCBhZ2FpbiB0byBBRkUuICovCisJCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9DVVNUX1RPUE9MT0dZX0NBTF0tPmxvY2spOworCQl0aGlzX2FmZS5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfQ1VTVF9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKKworCQlpZiAodGhpc19hZmUuYXByKSB7CisJCQlhcHJfcmVzZXQodGhpc19hZmUuYXByKTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKKwkJCXRoaXNfYWZlLmFwciA9IE5VTEw7CisJCQlydGFjX3NldF9hZmVfaGFuZGxlKHRoaXNfYWZlLmFwcik7CisJCX0KKwkJLyogc2VuZCBpbmZvIHRvIHVzZXIgKi8KKwkJaWYgKHRoaXNfYWZlLnRhc2sgPT0gTlVMTCkKKwkJCXRoaXNfYWZlLnRhc2sgPSBjdXJyZW50OworCQlwcl9kZWJ1ZygiJXM6IHRhc2tfbmFtZSA9ICVzIHBpZCA9ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQl0aGlzX2FmZS50YXNrLT5jb21tLCB0aGlzX2FmZS50YXNrLT5waWQpOworCisJCS8qCisJCSAqIFBhc3MgcmVzZXQgZXZlbnRzIHRvIHByb3h5IGRyaXZlciwgaWYgY2IgaXMgcmVnaXN0ZXJlZAorCQkgKi8KKwkJaWYgKHRoaXNfYWZlLnR4X2NiKSB7CisJCQl0aGlzX2FmZS50eF9jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCQlkYXRhLT5wYXlsb2FkLAorCQkJCQl0aGlzX2FmZS50eF9wcml2YXRlX2RhdGEpOworCQkJdGhpc19hZmUudHhfY2IgPSBOVUxMOworCQl9CisJCWlmICh0aGlzX2FmZS5yeF9jYikgeworCQkJdGhpc19hZmUucnhfY2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKKwkJCQkJZGF0YS0+cGF5bG9hZCwKKwkJCQkJdGhpc19hZmUucnhfcHJpdmF0ZV9kYXRhKTsKKwkJCXRoaXNfYWZlLnJ4X2NiID0gTlVMTDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwlhZmVfY2FsbGJhY2tfZGVidWdfcHJpbnQoZGF0YSk7CisJaWYgKGRhdGEtPm9wY29kZSA9PSBBRkVfUE9SVF9DTURSU1BfR0VUX1BBUkFNX1YyKSB7CisJCXU4ICpwYXlsb2FkID0gZGF0YS0+cGF5bG9hZDsKKworCQlpZiAocnRhY19tYWtlX2FmZV9jYWxsYmFjayhkYXRhLT5wYXlsb2FkLCBkYXRhLT5wYXlsb2FkX3NpemUpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKCFwYXlsb2FkIHx8IChkYXRhLT50b2tlbiA+PSBBRkVfTUFYX1BPUlRTKSkgeworCQkJcHJfZXJyKCIlczogRXJyb3I6IHNpemUgJWQgcGF5bG9hZCAlcEsgdG9rZW4gJWRcbiIsCisJCQkJX19mdW5jX18sIGRhdGEtPnBheWxvYWRfc2l6ZSwKKwkJCQlwYXlsb2FkLCBkYXRhLT50b2tlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoc3BfbWFrZV9hZmVfY2FsbGJhY2soZGF0YS0+cGF5bG9hZCwgZGF0YS0+cGF5bG9hZF9zaXplKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXdha2VfdXAoJnRoaXNfYWZlLndhaXRbZGF0YS0+dG9rZW5dKTsKKwl9IGVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSkgeworCQl1aW50MzJfdCAqcGF5bG9hZDsKKwkJdWludDE2X3QgcG9ydF9pZCA9IDA7CisKKwkJcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7CisJCWlmIChkYXRhLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKKwkJCXByX2RlYnVnKCIlczpvcGNvZGUgPSAweCV4IGNtZCA9IDB4JXggc3RhdHVzID0gMHgleCB0b2tlbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLAorCQkJCXBheWxvYWRbMF0sIHBheWxvYWRbMV0sIGRhdGEtPnRva2VuKTsKKwkJCS8qIHBheWxvYWRbMV0gY29udGFpbnMgdGhlIGVycm9yIHN0YXR1cyBmb3IgcmVzcG9uc2UgKi8KKwkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIHBheWxvYWRbMV0pOworCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCQl9CisJCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKKwkJCWNhc2UgQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjoKKwkJCQlpZiAocnRhY19tYWtlX2FmZV9jYWxsYmFjayhwYXlsb2FkLAorCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQorCQkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgQUZFX1BPUlRfQ01EX0RFVklDRV9TVE9QOgorCQkJY2FzZSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUOgorCQkJY2FzZSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQ6CisJCQljYXNlIEFGRV9QU0VVRE9QT1JUX0NNRF9TVE9QOgorCQkJY2FzZSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKKwkJCWNhc2UgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzoKKwkJCWNhc2UgQUZFX1NFUlZJQ0VfQ01EX1VOUkVHSVNURVJfUlRfUE9SVF9EUklWRVI6CisJCQljYXNlIEFGRV9QT1JUU19DTURfRFRNRl9DVEw6CisJCQljYXNlIEFGRV9TVkNfQ01EX1NFVF9QQVJBTToKKwkJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMCk7CisJCQkJd2FrZV91cCgmdGhpc19hZmUud2FpdFtkYXRhLT50b2tlbl0pOworCQkJCWJyZWFrOworCQkJY2FzZSBBRkVfU0VSVklDRV9DTURfUkVHSVNURVJfUlRfUE9SVF9EUklWRVI6CisJCQkJYnJlYWs7CisJCQljYXNlIEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfV1JJVEVfVjI6CisJCQkJcG9ydF9pZCA9IFJUX1BST1hZX1BPUlRfMDAxX1RYOworCQkJCWJyZWFrOworCQkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjI6CisJCQkJcG9ydF9pZCA9IFJUX1BST1hZX1BPUlRfMDAxX1JYOworCQkJCWJyZWFrOworCQkJY2FzZSBBRkVfQ01EX0FERF9UT1BPTE9HSUVTOgorCQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKKwkJCQl3YWtlX3VwKCZ0aGlzX2FmZS53YWl0W2RhdGEtPnRva2VuXSk7CisJCQkJcHJfZGVidWcoIiVzOiBBRkVfQ01EX0FERF9UT1BPTE9HSUVTIGNtZCAweCV4XG4iLAorCQkJCQkJX19mdW5jX18sIHBheWxvYWRbMV0pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9lcnIoIiVzOiBVbmtub3duIGNtZCAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkJCXBheWxvYWRbMF0pOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PQorCQkJCUFGRV9TRVJWSUNFX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TKSB7CisJCQlwcl9kZWJ1ZygiJXM6IG1tYXBfaGFuZGxlOiAweCV4LCBjYWwgaW5kZXggJWRcbiIsCisJCQkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLAorCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpICE9IC0xKQorCQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLm1lbV9tYXBfY2FsX2hhbmRsZXNbCisJCQkJCWF0b21pY19yZWFkKAorCQkJCQkmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpXSwKKwkJCQkJKHVpbnQzMl90KXBheWxvYWRbMF0pOworCQkJZWxzZQorCQkJCXRoaXNfYWZlLm1tYXBfaGFuZGxlID0gcGF5bG9hZFswXTsKKwkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKKwkJCXdha2VfdXAoJnRoaXNfYWZlLndhaXRbZGF0YS0+dG9rZW5dKTsKKwkJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTKSB7CisJCQlwb3J0X2lkID0gKHVpbnQxNl90KSgweDAwMDBGRkZGICYgcGF5bG9hZFswXSk7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlzd2l0Y2ggKHBvcnRfaWQpIHsKKwkJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9UWDogeworCQkJaWYgKHRoaXNfYWZlLnR4X2NiKSB7CisJCQkJdGhpc19hZmUudHhfY2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKKwkJCQkJZGF0YS0+cGF5bG9hZCwKKwkJCQkJdGhpc19hZmUudHhfcHJpdmF0ZV9kYXRhKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6IHsKKwkJCWlmICh0aGlzX2FmZS5yeF9jYikgeworCQkJCXRoaXNfYWZlLnJ4X2NiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCisJCQkJCWRhdGEtPnBheWxvYWQsCisJCQkJCXRoaXNfYWZlLnJ4X3ByaXZhdGVfZGF0YSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJfZGVidWcoIiVzOiBkZWZhdWx0IGNhc2UgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhZmVfZ2V0X3BvcnRfdHlwZSh1MTYgcG9ydF9pZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBQUklNQVJZX0kyU19SWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6CisJY2FzZSBNSTJTX1JYOgorCWNhc2UgSERNSV9SWDoKKwljYXNlIERJU1BMQVlfUE9SVF9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NQRElGX1JYOgorCWNhc2UgU0xJTUJVU18wX1JYOgorCWNhc2UgU0xJTUJVU18xX1JYOgorCWNhc2UgU0xJTUJVU18yX1JYOgorCWNhc2UgU0xJTUJVU18zX1JYOgorCWNhc2UgU0xJTUJVU180X1JYOgorCWNhc2UgU0xJTUJVU181X1JYOgorCWNhc2UgU0xJTUJVU182X1JYOgorCWNhc2UgU0xJTUJVU183X1JYOgorCWNhc2UgU0xJTUJVU184X1JYOgorCWNhc2UgSU5UX0JUX1NDT19SWDoKKwljYXNlIElOVF9CVF9BMkRQX1JYOgorCWNhc2UgSU5UX0ZNX1JYOgorCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6CisJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDoKKwljYXNlIEFVRElPX1BPUlRfSURfSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6CisJCXJldCA9IE1TTV9BRkVfUE9SVF9UWVBFX1JYOworCQlicmVhazsKKworCWNhc2UgUFJJTUFSWV9JMlNfVFg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1RYOgorCWNhc2UgTUkyU19UWDoKKwljYXNlIERJR0lfTUlDX1RYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgorCWNhc2UgU0xJTUJVU18wX1RYOgorCWNhc2UgU0xJTUJVU18xX1RYOgorCWNhc2UgU0xJTUJVU18yX1RYOgorCWNhc2UgU0xJTUJVU18zX1RYOgorCWNhc2UgU0xJTUJVU180X1RYOgorCWNhc2UgU0xJTUJVU181X1RYOgorCWNhc2UgU0xJTUJVU182X1RYOgorCWNhc2UgU0xJTUJVU183X1RYOgorCWNhc2UgU0xJTUJVU184X1RYOgorCWNhc2UgSU5UX0ZNX1RYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgorCWNhc2UgSU5UX0JUX1NDT19UWDoKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKKwkJcmV0ID0gTVNNX0FGRV9QT1JUX1RZUEVfVFg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3NpemVvZl9jZmdfY21kKHUxNiBwb3J0X2lkKQoreworCWludCByZXRfc2l6ZTsKKworCXN3aXRjaCAocG9ydF9pZCkgeworCWNhc2UgUFJJTUFSWV9JMlNfUlg6CisJY2FzZSBQUklNQVJZX0kyU19UWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1RYOgorCWNhc2UgTUkyU19SWDoKKwljYXNlIE1JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg6CisJCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX2kyc19jZmcpOworCQlicmVhazsKKwljYXNlIEhETUlfUlg6CisJY2FzZSBESVNQTEFZX1BPUlRfUlg6CisJCXJldF9zaXplID0KKwkJU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX2hkbWlfbXVsdGlfY2hhbl9hdWRpb19jZmcpOworCQlicmVhazsKKwljYXNlIFNMSU1CVVNfMF9SWDoKKwljYXNlIFNMSU1CVVNfMF9UWDoKKwljYXNlIFNMSU1CVVNfMV9SWDoKKwljYXNlIFNMSU1CVVNfMV9UWDoKKwljYXNlIFNMSU1CVVNfMl9SWDoKKwljYXNlIFNMSU1CVVNfMl9UWDoKKwljYXNlIFNMSU1CVVNfM19SWDoKKwljYXNlIFNMSU1CVVNfM19UWDoKKwljYXNlIFNMSU1CVVNfNF9SWDoKKwljYXNlIFNMSU1CVVNfNF9UWDoKKwljYXNlIFNMSU1CVVNfNV9SWDoKKwljYXNlIFNMSU1CVVNfNV9UWDoKKwljYXNlIFNMSU1CVVNfNl9SWDoKKwljYXNlIFNMSU1CVVNfNl9UWDoKKwljYXNlIFNMSU1CVVNfN19SWDoKKwljYXNlIFNMSU1CVVNfN19UWDoKKwljYXNlIFNMSU1CVVNfOF9SWDoKKwljYXNlIFNMSU1CVVNfOF9UWDoKKwkJcmV0X3NpemUgPSBTSVpFT0ZfQ0ZHX0NNRChhZmVfcGFyYW1faWRfc2xpbWJ1c19jZmcpOworCQlicmVhazsKKwljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOgorCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgorCQlyZXRfc2l6ZSA9IFNJWkVPRl9DRkdfQ01EKGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcpOworCQlicmVhazsKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOgorCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6CisJCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX3J0X3Byb3h5X3BvcnRfY2ZnKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX3VzYl9hdWRpb19jZmcpOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoIiVzOiBkZWZhdWx0IGNhc2UgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXRfc2l6ZSA9IFNJWkVPRl9DRkdfQ01EKGFmZV9wYXJhbV9pZF9wY21fY2ZnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXRfc2l6ZTsKK30KKworaW50IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCisJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOworCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCX0KKwkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWZlX2Fwcl9zZW5kX3BrdCA6IHJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgYWZlX2Fwcl9zZW5kX3BrdCh2b2lkICpkYXRhLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHdhaXQpCisJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsIGRhdGEpOworCWlmIChyZXQgPiAwKSB7CisJCWlmICh3YWl0KSB7CisJCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoKndhaXQsCisJCQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwkJCWlmICghcmV0KSB7CisJCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwgX19mdW5jX18sCisJCQkJCWFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAorCQkJCQkmdGhpc19hZmUuc3RhdHVzKSkpOworCQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBwYWNrZXQgbm90IHRyYW5zbWl0dGVkXG4iLCBfX2Z1bmNfXyk7CisJCS8qIGFwcl9zZW5kX3BrdCBjYW4gcmV0dXJuIDAgd2hlbiBub3RoaW5nIGlzIHRyYW5zbWl0dGVkICovCisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfc2VuZF9jYWxfYmxvY2sodTE2IHBvcnRfaWQsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludAkJCQkJCXJlc3VsdCA9IDA7CisJaW50CQkJCQkJaW5kZXggPSAwOworCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZF9ub19wYXlsb2FkCWFmZV9jYWw7CisKKwlpZiAoIWNhbF9ibG9jaykgeworCQlwcl9kZWJ1ZygiJXM6IE5vIEFGRSBjYWwgdG8gc2VuZCFcbiIsIF9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBBRkUgY2FsIGhhcyBpbnZhbGlkIHNpemUhXG4iLCBfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZmVfY2FsLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhZmVfY2FsLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihhZmVfY2FsKTsKKwlhZmVfY2FsLmhkci5zcmNfcG9ydCA9IDA7CisJYWZlX2NhbC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlhZmVfY2FsLmhkci50b2tlbiA9IGluZGV4OworCWFmZV9jYWwuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJYWZlX2NhbC5wYXJhbS5wb3J0X2lkID0gcG9ydF9pZDsKKwlhZmVfY2FsLnBhcmFtLnBheWxvYWRfc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKwlhZmVfY2FsLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPQorCQlsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWFmZV9jYWwucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9CisJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWFmZV9jYWwucGFyYW0ubWVtX21hcF9oYW5kbGUgPSBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKKworCXByX2RlYnVnKCIlczogQUZFIGNhbCBzZW50IGZvciBkZXZpY2UgcG9ydCA9IDB4JXgsIGNhbCBzaXplID0gJXpkLCBjYWwgYWRkciA9IDB4JXBLXG4iLAorCQlfX2Z1bmNfXywgcG9ydF9pZCwKKwkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisKKwlyZXN1bHQgPSBhZmVfYXByX3NlbmRfcGt0KCZhZmVfY2FsLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXN1bHQpCisJCXByX2VycigiJXM6IEFGRSBjYWwgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmVzdWx0KTsKKworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgYWZlX3NlbmRfY3VzdG9tX3RvcG9sb2d5X2Jsb2NrKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludAlyZXN1bHQgPSAwOworCWludAlpbmRleCA9IDA7CisJc3RydWN0IGNtZF9zZXRfdG9wb2xvZ2llcyBhZmVfY2FsOworCisJaWYgKCFjYWxfYmxvY2spIHsKKwkJcHJfZXJyKCIlczogTm8gQUZFIFNWQyBjYWwgdG8gc2VuZCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBBRkUgU1ZDIGNhbCBoYXMgaW52YWxpZCBzaXplOiAlemQhXG4iLAorCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWZlX2NhbC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYWZlX2NhbC5oZHIucGt0X3NpemUgPSBzaXplb2YoYWZlX2NhbCk7CisJYWZlX2NhbC5oZHIuc3JjX3BvcnQgPSAwOworCWFmZV9jYWwuaGRyLmRlc3RfcG9ydCA9IDA7CisJYWZlX2NhbC5oZHIudG9rZW4gPSBpbmRleDsKKwlhZmVfY2FsLmhkci5vcGNvZGUgPSBBRkVfQ01EX0FERF9UT1BPTE9HSUVTOworCisJYWZlX2NhbC5wYXlsb2FkX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7CisJYWZlX2NhbC5wYXlsb2FkX2FkZHJfbHN3ID0KKwkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwlhZmVfY2FsLnBheWxvYWRfYWRkcl9tc3cgPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwlhZmVfY2FsLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7CisKKwlwcl9kZWJ1ZygiJXM6Y21kX2lkOjB4JXggY2Fsc2l6ZTolemQgbWVtbWFwX2hkbDoweCV4IGNhbGFkZHI6MHglcEsiLAorCQlfX2Z1bmNfXywgQUZFX0NNRF9BRERfVE9QT0xPR0lFUywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplLAorCQlhZmVfY2FsLm1lbV9tYXBfaGFuZGxlLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisKKwlyZXN1bHQgPSBhZmVfYXByX3NlbmRfcGt0KCZhZmVfY2FsLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXN1bHQpCisJCXByX2VycigiJXM6IEFGRSBzZW5kIHRvcG9sb2d5IGZvciBjb21tYW5kIDB4JXggZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIEFGRV9DTURfQUREX1RPUE9MT0dJRVMsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBhZmVfc2VuZF9jdXN0b21fdG9wb2xvZ3kodm9pZCkKK3sKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgICAqY2FsX2Jsb2NrID0gTlVMTDsKKwlpbnQgY2FsX2luZGV4ID0gQUZFX0NVU1RfVE9QT0xPR1lfQ0FMOworCWludCByZXQ7CisKKwlpZiAodGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF9pbmRleCAlZCBub3QgYWxsb2NhdGVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXR1cm47CisJfQorCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOworCisJaWYgKCF0aGlzX2FmZS5zZXRfY3VzdG9tX3RvcG9sb2d5KQorCQlnb3RvIHVubG9jazsKKwl0aGlzX2FmZS5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMDsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKHRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0pOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzIGNhbF9ibG9jayBub3QgZm91bmQhIVxuIiwgX19mdW5jX18pOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgY2FsX2luZGV4IGNhbCAlZFxuIiwgX19mdW5jX18sIGNhbF9pbmRleCk7CisKKwlyZXQgPSByZW1hcF9jYWxfZGF0YShjYWxfYmxvY2ssIGNhbF9pbmRleCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBSZW1hcF9jYWxfZGF0YSBmYWlsZWQgZm9yIGNhbCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IGFmZV9zZW5kX2N1c3RvbV90b3BvbG9neV9ibG9jayhjYWxfYmxvY2spOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IE5vIGNhbCBzZW50IGZvciBjYWxfaW5kZXggJWQhIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgsIHJldCk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlwcl9kZWJ1ZygiJXM6c2VudCBjdXN0b20gdG9wb2xvZ3kgZm9yIEFGRVxuIiwgX19mdW5jX18pOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYWZlX3Nwa19yYW1wX2RuX2NmZyhpbnQgcG9ydCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgaW5kZXggPSAwOworCXN0cnVjdCBhZmVfc3Brcl9wcm90X2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKKworCWlmIChhZmVfZ2V0X3BvcnRfdHlwZShwb3J0KSAhPSBNU01fQUZFX1BPUlRfVFlQRV9SWCkgeworCQlwcl9kZWJ1ZygiJXM6IHBvcnQgZG9lc24ndCBtYXRjaCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydCk7CisJCXJldHVybiAwOworCX0KKwlpZiAodGhpc19hZmUucHJvdF9jZmcubW9kZSA9PSBNU01fU1BLUl9QUk9UX0RJU0FCTEVEIHx8CisJCSh0aGlzX2FmZS52aV9yeF9wb3J0ICE9IHBvcnQpKSB7CisJCXByX2RlYnVnKCIlczogc3BrciBwcm90ZWN0aW9uIGRpc2FibGVkIHBvcnQgMHgleCAlZCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwb3J0LCByZXQsIHRoaXNfYWZlLnZpX3J4X3BvcnQpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkIiwgX19mdW5jX18sIHBvcnQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0KTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IGluZGV4OworCisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0KTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0KKwkJc2l6ZW9mKGNvbmZpZykgLSBzaXplb2YoY29uZmlnLmhkcikgLSBzaXplb2YoY29uZmlnLnBhcmFtKQorCQktIHNpemVvZihjb25maWcucHJvdF9jb25maWcpOworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0ZCX1NQS1JfUFJPVF9WMl9SWDsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfRkJTUF9QVE9ORV9SQU1QX0NGRzsKKwljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IDA7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHBvcnQgPSAweCV4IHBhcmFtID0gMHgleCBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnQsIGNvbmZpZy5wZGF0YS5wYXJhbV9pZCwgcmV0KTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCS8qIGRzcCBuZWVkcyBhdGxlYXN0IDE1bXMgdG8gcmFtcCBkb3duIHBpbG90IHRvbmUqLworCXVzbGVlcF9yYW5nZSgxNTAwMCwgMTUwMTApOworCXJldCA9IDA7CitmYWlsX2NtZDoKKwlwcl9kZWJ1ZygiJXM6IGNvbmZpZy5wZGF0YS5wYXJhbV9pZCAweCV4IHN0YXR1cyAlZFxuIiwKKwkJX19mdW5jX18sIGNvbmZpZy5wZGF0YS5wYXJhbV9pZCwgcmV0KTsKK3JldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWZlX3Nwa19wcm90X3ByZXBhcmUoaW50IHNyY19wb3J0LCBpbnQgZHN0X3BvcnQsIGludCBwYXJhbV9pZCwKKwkJdW5pb24gYWZlX3Nwa3JfcHJvdF9jb25maWcgKnByb3RfY29uZmlnKQoreworCWludCByZXQgPSAtRUlOVkFMOworCWludCBpbmRleCA9IDA7CisJc3RydWN0IGFmZV9zcGtyX3Byb3RfY29uZmlnX2NvbW1hbmQgY29uZmlnOworCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwlpZiAoIXByb3RfY29uZmlnKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChzcmNfcG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzcmMgcG9ydCAweCV4IHJldCAlZCIsCisJCQkJX19mdW5jX18sIHNyY19wb3J0LCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQoZHN0X3BvcnQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZHN0IHBvcnQgMHgleCByZXQgJWQiLCBfX2Z1bmNfXywKKwkJCQlkc3RfcG9ydCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHNyY19wb3J0KTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJc3dpdGNoIChwYXJhbV9pZCkgeworCWNhc2UgQUZFX1BBUkFNX0lEX0ZCU1BfTU9ERV9SWF9DRkc6CisJCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0ZCX1NQS1JfUFJPVF9WMl9SWDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUEFSQU1fSURfRkVFREJBQ0tfUEFUSF9DRkc6CisJCXRoaXNfYWZlLnZpX3R4X3BvcnQgPSBzcmNfcG9ydDsKKwkJdGhpc19hZmUudmlfcnhfcG9ydCA9IGRzdF9wb3J0OworCQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9GRUVEQkFDSzsKKwkJYnJlYWs7CisJLyoKKwkgKiBBRkVfUEFSQU1fSURfU1BLUl9DQUxJQl9WSV9QUk9DX0NGR19WMiBpcyBzYW1lIGFzCisJICogQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX01PREVfQ0ZHCisJICovCisJY2FzZSBBRkVfUEFSQU1fSURfU1BLUl9DQUxJQl9WSV9QUk9DX0NGR19WMjoKKwljYXNlIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fQ0ZHOgorCQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9TUEVBS0VSX1BST1RFQ1RJT05fVjJfVEhfVkk7CisJCWJyZWFrOworCWNhc2UgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX01PREVfQ0ZHOgorCWNhc2UgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX0ZUTV9DRkc6CisJCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9FWF9WSTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZGVmYXVsdCBjYXNlIDB4JXhcbiIsIF9fZnVuY19fLCBwYXJhbV9pZCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKKworCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKKwljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQoc3JjX3BvcnQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihjb25maWcuaGRyKQorCQktIHNpemVvZihjb25maWcucGFyYW0pOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IHBhcmFtX2lkOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wcm90X2NvbmZpZyk7CisJY29uZmlnLnByb3RfY29uZmlnID0gKnByb3RfY29uZmlnOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY29uZmlnKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0ID0gMHgleCBwYXJhbSA9IDB4JXggZmFpbGVkICVkXG4iLAorCQlfX2Z1bmNfXywgc3JjX3BvcnQsIHBhcmFtX2lkLCByZXQpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldCA9IDA7CitmYWlsX2NtZDoKKwlwcl9kZWJ1ZygiJXM6IGNvbmZpZy5wZGF0YS5wYXJhbV9pZCAweCV4IHN0YXR1cyAlZCAweCV4XG4iLAorCV9fZnVuY19fLCBjb25maWcucGRhdGEucGFyYW1faWQsIHJldCwgc3JjX3BvcnQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFmZV9zZW5kX2NhbF9zcGtyX3Byb3RfdHgoaW50IHBvcnRfaWQpCit7CisJdW5pb24gYWZlX3Nwa3JfcHJvdF9jb25maWcgYWZlX3Nwa19jb25maWc7CisKKwlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdID09IE5VTEwgfHwKKwkgICAgdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdID09IE5VTEwgfHwKKwkgICAgdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdID09IE5VTEwpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7CisJaWYgKCh0aGlzX2FmZS5wcm90X2NmZy5tb2RlICE9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQpICYmCisJCSh0aGlzX2FmZS52aV90eF9wb3J0ID09IHBvcnRfaWQpKSB7CisJCWlmICh0aGlzX2FmZS5wcm90X2NmZy5tb2RlID09CisJCQlNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTKSB7CisJCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9CisJCQkJCVE2QUZFX01TTV9TUEtSX0NBTElCUkFUSU9OOworCQkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcucXVpY2tfY2FsaWJfZmxhZyA9CisJCQkJCXRoaXNfYWZlLnByb3RfY2ZnLnF1aWNrX2NhbGliX2ZsYWc7CisJCX0gZWxzZSB7CisJCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9CisJCQkJCVE2QUZFX01TTV9TUEtSX1BST0NFU1NJTkc7CisJCX0KKworCQlpZiAodGhpc19hZmUudGhfZnRtX2NmZy5tb2RlID09IE1TTV9TUEtSX1BST1RfSU5fRlRNX01PREUpCisJCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9CisJCQkJCSAgICBRNkFGRV9NU01fU1BLUl9GVE1fTU9ERTsKKwkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcubWlub3JfdmVyc2lvbiA9IDE7CisJCWFmZV9zcGtfY29uZmlnLnZpX3Byb2NfY2ZnLnIwX2NhbGlfcTI0W1NQX1YyX1NQS1JfMV0gPQorCQkJKHVpbnQzMl90KSB0aGlzX2FmZS5wcm90X2NmZy5yMFtTUF9WMl9TUEtSXzFdOworCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5yMF9jYWxpX3EyNFtTUF9WMl9TUEtSXzJdID0KKwkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcucjBbU1BfVjJfU1BLUl8yXTsKKwkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcudDBfY2FsaV9xNltTUF9WMl9TUEtSXzFdID0KKwkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcudDBbU1BfVjJfU1BLUl8xXTsKKwkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcudDBfY2FsaV9xNltTUF9WMl9TUEtSXzJdID0KKwkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcudDBbU1BfVjJfU1BLUl8yXTsKKwkJaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgIT0gTVNNX1NQS1JfUFJPVF9OT1RfQ0FMSUJSQVRFRCkgeworCQkJc3RydWN0IGFzbV9zcGtyX2NhbGliX3ZpX3Byb2NfY2ZnICp2aV9wcm9jX2NmZzsKKworCQkJdmlfcHJvY19jZmcgPSAmYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmc7CisJCQl2aV9wcm9jX2NmZy0+cjBfdDBfc2VsZWN0aW9uX2ZsYWdbU1BfVjJfU1BLUl8xXSA9CisJCQkJCSAgICBVU0VfQ0FMSUJSQVRFRF9SMFRPOworCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMl0gPQorCQkJCQkgICAgVVNFX0NBTElCUkFURURfUjBUTzsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBhc21fc3Brcl9jYWxpYl92aV9wcm9jX2NmZyAqdmlfcHJvY19jZmc7CisKKwkJCXZpX3Byb2NfY2ZnID0gJmFmZV9zcGtfY29uZmlnLnZpX3Byb2NfY2ZnOworCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMV0gPQorCQkJCQkJCSAgICBVU0VfU0FGRV9SMFRPOworCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMl0gPQorCQkJCQkJCSAgICBVU0VfU0FGRV9SMFRPOworCQl9CisJCWlmIChhZmVfc3BrX3Byb3RfcHJlcGFyZShwb3J0X2lkLCAwLAorCQkJQUZFX1BBUkFNX0lEX1NQS1JfQ0FMSUJfVklfUFJPQ19DRkdfVjIsCisJCQkJJmFmZV9zcGtfY29uZmlnKSkKKwkJCXByX2VycigiJXM6IFNQS1JfQ0FMSUJfVklfUFJPQ19DRkcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOworCisJbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKKwlpZiAoKHRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9PSBNU01fU1BLUl9QUk9UX0lOX0ZUTV9NT0RFKSAmJgorCSAgICAodGhpc19hZmUudmlfdHhfcG9ydCA9PSBwb3J0X2lkKSkgeworCQlhZmVfc3BrX2NvbmZpZy50aF92aV9mdG1fY2ZnLm1pbm9yX3ZlcnNpb24gPSAxOworCQlhZmVfc3BrX2NvbmZpZy50aF92aV9mdG1fY2ZnLndhaXRfdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KKwkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcud2FpdF90aW1lW1NQX1YyX1NQS1JfMV07CisJCWFmZV9zcGtfY29uZmlnLnRoX3ZpX2Z0bV9jZmcud2FpdF90aW1lX21zW1NQX1YyX1NQS1JfMl0gPQorCQkJdGhpc19hZmUudGhfZnRtX2NmZy53YWl0X3RpbWVbU1BfVjJfU1BLUl8yXTsKKwkJYWZlX3Nwa19jb25maWcudGhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KKwkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8xXTsKKwkJYWZlX3Nwa19jb25maWcudGhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzJdID0KKwkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8yXTsKKworCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKKwkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fQ0ZHLAorCQkJCQkgJmFmZV9zcGtfY29uZmlnKSkKKwkJCXByX2VycigiJXM6IHRoIHZpIGZ0bSBjZmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7CisJfQorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXS0+bG9jayk7CisJaWYgKCh0aGlzX2FmZS5leF9mdG1fY2ZnLm1vZGUgPT0gTVNNX1NQS1JfUFJPVF9JTl9GVE1fTU9ERSkgJiYKKwkgICAgKHRoaXNfYWZlLnZpX3R4X3BvcnQgPT0gcG9ydF9pZCkpIHsKKwkJYWZlX3Nwa19jb25maWcuZXhfdmlfbW9kZV9jZmcubWlub3JfdmVyc2lvbiA9IDE7CisJCWFmZV9zcGtfY29uZmlnLmV4X3ZpX21vZGVfY2ZnLm9wZXJhdGlvbl9tb2RlID0KKwkJCQkJCVE2QUZFX01TTV9TUEtSX0ZUTV9NT0RFOworCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKKwkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9NT0RFX0NGRywKKwkJCQkJICZhZmVfc3BrX2NvbmZpZykpCisJCQlwcl9lcnIoIiVzOiBleCB2aSBtb2RlIGNmZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCQlhZmVfc3BrX2NvbmZpZy5leF92aV9mdG1fY2ZnLm1pbm9yX3ZlcnNpb24gPSAxOworCQlhZmVfc3BrX2NvbmZpZy5leF92aV9mdG1fY2ZnLndhaXRfdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KKwkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcud2FpdF90aW1lW1NQX1YyX1NQS1JfMV07CisJCWFmZV9zcGtfY29uZmlnLmV4X3ZpX2Z0bV9jZmcud2FpdF90aW1lX21zW1NQX1YyX1NQS1JfMl0gPQorCQkJdGhpc19hZmUuZXhfZnRtX2NmZy53YWl0X3RpbWVbU1BfVjJfU1BLUl8yXTsKKwkJYWZlX3Nwa19jb25maWcuZXhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KKwkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8xXTsKKwkJYWZlX3Nwa19jb25maWcuZXhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzJdID0KKwkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8yXTsKKworCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKKwkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fQ0ZHLAorCQkJCQkgJmFmZV9zcGtfY29uZmlnKSkKKwkJCXByX2VycigiJXM6IGV4IHZpIGZ0bSBjZmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXRoaXNfYWZlLmV4X2Z0bV9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7CisJfQorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdLT5sb2NrKTsKKworfQorCitzdGF0aWMgdm9pZCBhZmVfc2VuZF9jYWxfc3Brcl9wcm90X3J4KGludCBwb3J0X2lkKQoreworCXVuaW9uIGFmZV9zcGtyX3Byb3RfY29uZmlnIGFmZV9zcGtfY29uZmlnOworCisJaWYgKHRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXSA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOworCisJaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgIT0gTVNNX1NQS1JfUFJPVF9ESVNBQkxFRCAmJgorCQkodGhpc19hZmUudmlfcnhfcG9ydCA9PSBwb3J0X2lkKSkgeworCQlpZiAodGhpc19hZmUucHJvdF9jZmcubW9kZSA9PQorCQkJTVNNX1NQS1JfUFJPVF9DQUxJQlJBVElPTl9JTl9QUk9HUkVTUykKKwkJCWFmZV9zcGtfY29uZmlnLm1vZGVfcnhfY2ZnLm1vZGUgPQorCQkJCVE2QUZFX01TTV9TUEtSX0NBTElCUkFUSU9OOworCQllbHNlCisJCQlhZmVfc3BrX2NvbmZpZy5tb2RlX3J4X2NmZy5tb2RlID0KKwkJCQlRNkFGRV9NU01fU1BLUl9QUk9DRVNTSU5HOworCQlhZmVfc3BrX2NvbmZpZy5tb2RlX3J4X2NmZy5taW5vcl92ZXJzaW9uID0gMTsKKwkJaWYgKGFmZV9zcGtfcHJvdF9wcmVwYXJlKHBvcnRfaWQsIDAsCisJCQlBRkVfUEFSQU1fSURfRkJTUF9NT0RFX1JYX0NGRywKKwkJCSZhZmVfc3BrX2NvbmZpZykpCisJCQlwcl9lcnIoIiVzOiBSWCBNT0RFX1ZJX1BST0NfQ0ZHIGZhaWxlZFxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJfQorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX2h3X2RlbGF5KHUxNiBwb3J0X2lkLCB1MzIgcmF0ZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fY2FsX2h3X2RlbGF5X2VudHJ5CQlkZWxheV9lbnRyeTsKKwlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQJY29uZmlnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlkZWxheV9lbnRyeS5zYW1wbGVfcmF0ZSA9IHJhdGU7CisJaWYgKGFmZV9nZXRfcG9ydF90eXBlKHBvcnRfaWQpID09IE1TTV9BRkVfUE9SVF9UWVBFX1RYKQorCQlyZXQgPSBhZmVfZ2V0X2NhbF9od19kZWxheShUWF9ERVZJQ0UsICZkZWxheV9lbnRyeSk7CisJZWxzZSBpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpCisJCXJldCA9IGFmZV9nZXRfY2FsX2h3X2RlbGF5KFJYX0RFVklDRSwgJmRlbGF5X2VudHJ5KTsKKworCS8qCisJICogSFcgZGVsYXkgaXMgb25seSB1c2VkIGZvciBJTVMgY2FsbHMgdG8gc3luYyBhdWRpbyB3aXRoIHZpZGVvCisJICogSXQgaXMgb25seSBuZWVkZWQgZm9yIGRldmljZXMgJiBzYW1wbGUgcmF0ZXMgdXNlZCBmb3IgSU1TIHZpZGVvCisJICogY2FsbHMuIFZhbHVlcyBhcmUgcmVjZWl2ZWQgZnJvbSBBQ0RCIGNhbGJyYXRpb24gZmlsZXMKKwkgKi8KKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBkZWJ1ZzogSFcgZGVsYXkgaW5mbyBub3QgYXZhaWxhYmxlICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gaW5kZXg7CisKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfREVWSUNFX0hXX0RFTEFZOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0KTsKKworCWNvbmZpZy5wb3J0Lmh3X2RlbGF5LmRlbGF5X2luX3VzID0gZGVsYXlfZW50cnkuZGVsYXlfdXNlYzsKKwljb25maWcucG9ydC5od19kZWxheS5kZXZpY2VfaHdfZGVsYXlfbWlub3JfdmVyc2lvbiA9CisJCQkJQUZFX0FQSV9WRVJTSU9OX0RFVklDRV9IV19ERUxBWTsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBodyBkZWxheSBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworZmFpbF9jbWQ6CisJcHJfZGVidWcoIiVzOiBwb3J0X2lkIDB4JXggcmF0ZSAldSBkZWxheV91c2VjICVkIHN0YXR1cyAlZFxuIiwKKwlfX2Z1bmNfXywgcG9ydF9pZCwgcmF0ZSwgZGVsYXlfZW50cnkuZGVsYXlfdXNlYywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICphZmVfZmluZF9jYWxfdG9wb19pZF9ieV9wb3J0KAorCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLCB1MTYgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJKmNhbF9ibG9jayA9IE5VTEw7CisJaW50MzJfdCBwYXRoOworCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hZmVfdG9wICphZmVfdG9wOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJJmNhbF90eXBlLT5jYWxfYmxvY2tzKSB7CisJCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAorCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKKworCQlwYXRoID0gKChhZmVfZ2V0X3BvcnRfdHlwZShwb3J0X2lkKSA9PQorCQkJTVNNX0FGRV9QT1JUX1RZUEVfVFgpPyhUWF9ERVZJQ0UpOihSWF9ERVZJQ0UpKTsKKwkJYWZlX3RvcCA9CisJCShzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcCAqKWNhbF9ibG9jay0+Y2FsX2luZm87CisJCWlmIChhZmVfdG9wLT5wYXRoID09IHBhdGgpIHsKKwkJCXByX2RlYnVnKCIlczogdG9wX2lkOiV4IGFjZGJfaWQ6JWQgYWZlX3BvcnQ6JWRcbiIsCisJCQlfX2Z1bmNfXywgYWZlX3RvcC0+dG9wb2xvZ3ksIGFmZV90b3AtPmFjZGJfaWQsCisJCQlxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpKTsKKwkJCXJldHVybiBjYWxfYmxvY2s7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYWZlX2dldF9jYWxfdG9wb2xvZ3lfaWQodTE2IHBvcnRfaWQsIHUzMiAqdG9wb2xvZ3lfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgICAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcCAgICphZmVfdG9wX2luZm8gPSBOVUxMOworCisJaWYgKHRoaXNfYWZlLmNhbF9kYXRhW0FGRV9UT1BPTE9HWV9DQUxdID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogW0FGRV9UT1BPTE9HWV9DQUxdIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHRvcG9sb2d5X2lkID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdG9wb2xvZ3lfaWQgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJKnRvcG9sb2d5X2lkID0gMDsKKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBhZmVfZmluZF9jYWxfdG9wb19pZF9ieV9wb3J0KAorCQl0aGlzX2FmZS5jYWxfZGF0YVtBRkVfVE9QT0xPR1lfQ0FMXSwgcG9ydF9pZCk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFtBRkVfVE9QT0xPR1lfQ0FMXSBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoaXMgcG9ydCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWFmZV90b3BfaW5mbyA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZV90b3AgKikKKwkJY2FsX2Jsb2NrLT5jYWxfaW5mbyk7CisJaWYgKCFhZmVfdG9wX2luZm8tPnRvcG9sb2d5KSB7CisJCXByX2VycigiJXM6IGludmFsaWQgdG9wb2xvZ3kgaWQgOiBbJWQsICVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBhZmVfdG9wX2luZm8tPmFjZGJfaWQsIGFmZV90b3BfaW5mby0+dG9wb2xvZ3kpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisJKnRvcG9sb2d5X2lkID0gKHUzMilhZmVfdG9wX2luZm8tPnRvcG9sb2d5OworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gJXUgYWNkYl9pZCA9ICVkIHRvcG9sb2d5X2lkID0gJXUgcmV0PSVkXG4iLAorCQlfX2Z1bmNfXywgcG9ydF9pZCwgYWZlX3RvcF9pbmZvLT5hY2RiX2lkLAorCQlhZmVfdG9wX2luZm8tPnRvcG9sb2d5LCByZXQpOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX1RPUE9MT0dZX0NBTF0tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWZlX3NlbmRfcG9ydF90b3BvbG9neV9pZCh1MTYgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQJY29uZmlnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IDA7CisJdTMyIHRvcG9sb2d5X2lkID0gMDsKKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUyAtIDEpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9nZXRfY2FsX3RvcG9sb2d5X2lkKHBvcnRfaWQsICZ0b3BvbG9neV9pZCk7CisJaWYgKHJldCB8fCAhdG9wb2xvZ3lfaWQpIHsKKwkJcHJfZGVidWcoIiVzOiBBRkUgcG9ydFslZF0gZ2V0X2NhbF90b3BvbG9neVslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQsIHRvcG9sb2d5X2lkKTsKKwkJZ290byBkb25lOworCX0KKworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gaW5kZXg7CisKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljb25maWcucGRhdGEucGFyYW1faWQgICA9IEFGRV9QQVJBTV9JRF9TRVRfVE9QT0xPR1k7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNvbmZpZy5wb3J0KTsKKwljb25maWcucG9ydC50b3BvbG9neS5taW5vcl92ZXJzaW9uID0gQUZFX0FQSV9WRVJTSU9OX1RPUE9MT0dZX1YxOworCWNvbmZpZy5wb3J0LnRvcG9sb2d5LnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQ7CisKKwlwcl9kZWJ1ZygiJXM6IHBhcmFtIFBMIHNpemU9JWQgaXBhcmFtX3NpemVbJWRdWyV6ZCAlemQgJXpkICV6ZF0gcGFyYW1faWRbMHgleF1cbiIsCisJCV9fZnVuY19fLCBjb25maWcucGFyYW0ucGF5bG9hZF9zaXplLCBjb25maWcucGRhdGEucGFyYW1fc2l6ZSwKKwkJc2l6ZW9mKGNvbmZpZyksIHNpemVvZihjb25maWcucGFyYW0pLCBzaXplb2YoY29uZmlnLnBvcnQpLAorCQlzaXplb2Yoc3RydWN0IGFwcl9oZHIpLCBjb25maWcucGRhdGEucGFyYW1faWQpOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFIHNldCB0b3BvbG9neSBpZCBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXRoaXNfYWZlLnRvcG9sb2d5W2luZGV4XSA9IHRvcG9sb2d5X2lkOworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEFGRSBzZXQgdG9wb2xvZ3kgaWQgMHgleCAgZW5hYmxlIGZvciBwb3J0IDB4JXggcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHRvcG9sb2d5X2lkLCBwb3J0X2lkLCByZXQpOworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCByZW1hcF9jYWxfZGF0YShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgaW50IGNhbF9pbmRleCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBObyBJT04gYWxsb2NhdGlvbiBmb3IgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKKwkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7CisJCWF0b21pY19zZXQoJnRoaXNfYWZlLm1lbV9tYXBfY2FsX2luZGV4LCBjYWxfaW5kZXgpOworCQlyZXQgPSBhZmVfY21kX21lbW9yeV9tYXAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKKwkJYXRvbWljX3NldCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgsIC0xKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkIHJldCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCByZXQpOworCQkJcHJfZGVidWcoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOworCQkJZ290byBkb25lOworCQl9CisJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gYXRvbWljX3JlYWQoJnRoaXNfYWZlLgorCQkJbWVtX21hcF9jYWxfaGFuZGxlc1tjYWxfaW5kZXhdKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfYWZlX2NhbF90eXBlKGludCBjYWxfaW5kZXgsIGludCBwb3J0X2lkKQoreworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YQkJKmNhbF9ibG9jayA9IE5VTEw7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpIHsKKwkJcHJfd2FybigiJXM6IGNhbF9pbmRleCAlZCBub3QgYWxsb2NhdGVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7CisJY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jayh0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlcyBjYWxfYmxvY2sgbm90IGZvdW5kISFcbiIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcHJfZGVidWcoIiVzOiBTZW5kaW5nIGNhbF9pbmRleCBjYWwgJWRcbiIsIF9fZnVuY19fLCBjYWxfaW5kZXgpOworCisJcmV0ID0gcmVtYXBfY2FsX2RhdGEoY2FsX2Jsb2NrLCBjYWxfaW5kZXgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSBhZmVfc2VuZF9jYWxfYmxvY2socG9ydF9pZCwgY2FsX2Jsb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZGVidWcoIiVzOiBObyBjYWwgc2VudCBmb3IgY2FsX2luZGV4ICVkLCBwb3J0X2lkID0gMHgleCEgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcG9ydF9pZCwgcmV0KTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOworZG9uZToKKwlyZXR1cm47Cit9CisKK3ZvaWQgYWZlX3NlbmRfY2FsKHUxNiBwb3J0X2lkKQoreworCXByX2RlYnVnKCIlczogcG9ydF9pZD0weCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisKKwlpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfVFgpIHsKKwkJYWZlX3NlbmRfY2FsX3Nwa3JfcHJvdF90eChwb3J0X2lkKTsKKwkJc2VuZF9hZmVfY2FsX3R5cGUoQUZFX0NPTU1PTl9UWF9DQUwsIHBvcnRfaWQpOworCX0gZWxzZSBpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpIHsKKwkJYWZlX3NlbmRfY2FsX3Nwa3JfcHJvdF9yeChwb3J0X2lkKTsKKwkJc2VuZF9hZmVfY2FsX3R5cGUoQUZFX0NPTU1PTl9SWF9DQUwsIHBvcnRfaWQpOworCX0KK30KKworaW50IGFmZV90dXJuX29ub2ZmX2h3X21hZCh1MTYgbWFkX3R5cGUsIHUxNiBlbmFibGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWZlX2NtZF9od19tYWRfY3RybCBjb25maWc7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJICAgICBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7CisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gU0xJTUJVU181X1RYOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfSFdfTUFEOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9IV19NQURfQ1RSTDsKKwljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcucGF5bG9hZCk7CisJY29uZmlnLnBheWxvYWQubWlub3JfdmVyc2lvbiA9IDE7CisJY29uZmlnLnBheWxvYWQubWFkX3R5cGUgPSBtYWRfdHlwZTsKKwljb25maWcucGF5bG9hZC5tYWRfZW5hYmxlID0gZW5hYmxlOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9IV19NQURfQ1RSTCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfY2ZnKAorCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnICpzYl9zbGF2ZV9jZmcpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2Jfc2xhdmVfY2ZnIGNvbmZpZzsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KKwkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9DRENfU0xJTUJVU19TTEFWRV9DRkc7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPQorCSAgICBzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcpOworCWNvbmZpZy5zYl9zbGF2ZV9jZmcgPSAqc2Jfc2xhdmVfY2ZnOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9DRENfU0xJTUJVU19TTEFWRV9DRkcgZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX2NvZGVjX3JlZ19wYWdlX2NvbmZpZygKKwlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgKmNkY19yZWdfcGFnZV9jZmcpCit7CisJc3RydWN0IGFmZV9zdmNfY21kX2NkY19yZWdfcGFnZV9jZmcgY29uZmlnOworCWludCByZXQ7CisKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJICAgICBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7CisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07CisJY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCisJCQkJICAgIHNpemVvZihjb25maWcucGFyYW0pOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9DRENfREVWX0NGRzsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0RDX1JFR19QQUdFX0NGRzsKKwljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9CisJICAgIHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcpOworCWNvbmZpZy5jZGNfcmVnX3BhZ2VfY2ZnID0gKmNkY19yZWdfcGFnZV9jZmc7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W0lEWF9HTE9CQUxfQ0ZHXSk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19SRUdfUEFHRV9DRkcgZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX2NvZGVjX3JlZ19jb25maWcoCisJc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhICpjZGNfcmVnX2NmZykKK3sKKwlpbnQgaSwgaiwgcmV0ID0gLUVJTlZBTDsKKwlpbnQgcGt0X3NpemUsIHBheWxvYWRfc2l6ZSwgcmVnX3Blcl9wa3QsIG51bV9wa3RzLCBudW1fcmVnczsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfY2RjX3JlZ19jZmcgKmNvbmZpZzsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtICpwYXJhbTsKKworCXJlZ19wZXJfcGt0ID0gKEFQUl9NQVhfQlVGIC0gc2l6ZW9mKCpjb25maWcpKSAvCisJCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19wYXlsb2FkKTsKKwlpZiAocmVnX3Blcl9wa3QgPiAwKSB7CisJCW51bV9wa3RzID0gKGNkY19yZWdfY2ZnLT5udW1fcmVnaXN0ZXJzIC8gcmVnX3Blcl9wa3QpICsKKwkJCShjZGNfcmVnX2NmZy0+bnVtX3JlZ2lzdGVycyAlIHJlZ19wZXJfcGt0ID09IDAgPyAwIDogMSk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGJ1aWxkIGNvZGVjIHJlZyBjb25maWcgQVBSIHBhY2tldFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChqID0gMDsgaiA8IG51bV9wa3RzOyArK2opIHsKKwkJLyoKKwkJICogbnVtX3JlZ3MgaXMgc2V0IHRvIHJlZ19wZXJfcGt0IG9uIGVhY2ggcGFzcyB0aHJvdWdoIHRoZSBsb29wCisJCSAqIGV4Y2VwdCB0aGUgbGFzdCwgd2hlbiBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiByZWdpc3RlcnMKKwkJICogcmVtYWluaW5nIGZyb20gdGhlIHRvdGFsCisJCSAqLworCQludW1fcmVncyA9IChqIDwgKG51bV9wa3RzIC0gMSkgPyByZWdfcGVyX3BrdCA6CisJCQkJY2RjX3JlZ19jZmctPm51bV9yZWdpc3RlcnMgLSAocmVnX3Blcl9wa3QgKiBqKSk7CisJCXBheWxvYWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX3BheWxvYWQpICoKKwkJCQludW1fcmVnczsKKwkJcGt0X3NpemUgPSBzaXplb2YoKmNvbmZpZykgKyBwYXlsb2FkX3NpemU7CisJCXByX2RlYnVnKCIlczogcGt0X3NpemUgJWQsIHBheWxvYWRfc2l6ZSAlZFxuIiwgX19mdW5jX18sCisJCQkgcGt0X3NpemUsIHBheWxvYWRfc2l6ZSk7CisJCWNvbmZpZyA9IGt6YWxsb2MocGt0X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbmZpZykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNvbmZpZy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQkgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJICAgICAgQVBSX1BLVF9WRVIpOworCQljb25maWctPmhkci5wa3Rfc2l6ZSA9IHBrdF9zaXplOworCQljb25maWctPmhkci5zcmNfcG9ydCA9IDA7CisJCWNvbmZpZy0+aGRyLmRlc3RfcG9ydCA9IDA7CisJCWNvbmZpZy0+aGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7CisJCWNvbmZpZy0+aGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKKworCQlwYXJhbSA9ICZjb25maWctPnBhcmFtOworCQlwYXJhbS0+cGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplOworCQlwYXJhbS0+cGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJCXBhcmFtLT5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwkJcGFyYW0tPm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgeworCQkJY29uZmlnLT5yZWdfZGF0YVtpXS5jb21tb24ubW9kdWxlX2lkID0KKwkJCQkJCUFGRV9NT0RVTEVfQ0RDX0RFVl9DRkc7CisJCQljb25maWctPnJlZ19kYXRhW2ldLmNvbW1vbi5wYXJhbV9pZCA9CisJCQkJCQlBRkVfUEFSQU1fSURfQ0RDX1JFR19DRkc7CisJCQljb25maWctPnJlZ19kYXRhW2ldLmNvbW1vbi5wYXJhbV9zaXplID0KKwkJCSAgICBzaXplb2YoY29uZmlnLT5yZWdfZGF0YVtpXS5yZWdfY2ZnKTsKKwkJCWNvbmZpZy0+cmVnX2RhdGFbaV0ucmVnX2NmZyA9CisJCQkJY2RjX3JlZ19jZmctPnJlZ19kYXRhW2kgKyAoaiAqIHJlZ19wZXJfcGt0KV07CisJCX0KKworCQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KGNvbmZpZywgJnRoaXNfYWZlLndhaXRbSURYX0dMT0JBTF9DRkddKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWtmcmVlKGNvbmZpZyk7CisJCQlicmVhazsKKwkJfQorCQlrZnJlZShjb25maWcpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWZlX2luaXRfY2RjX3JlZ19jb25maWcodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZmVfc3ZjX2NtZF9pbml0X2NkY19yZWdfY2ZnIGNvbmZpZzsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJICAgICBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7CisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07CisKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisKKwljb25maWcuaW5pdC5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOworCWNvbmZpZy5pbml0LnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHX0lOSVQ7CisJY29uZmlnLmluaXQucGFyYW1fc2l6ZSA9IDA7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W0lEWF9HTE9CQUxfQ0ZHXSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBBRkVfUEFSQU1fSURfQ0RDX0lOSVRfUkVHX0NGRyBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcoCisJc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnICpwb3J0X2NvbmZpZywgdTE2IHBvcnRfaWQpCit7CisJaW50IHJldCwgaW5kZXg7CisJc3RydWN0IGFmZV9jbWRfaHdfbWFkX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgY29uZmlnOworCisJcHJfZGVidWcoIiVzOiBlbnRlciwgcG9ydF9pZCA9ICAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHBvcnQgaWQgPSAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBwb3J0X2lkOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfSFdfTUFEOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TTElNQlVTX1NMQVZFX1BPUlRfQ0ZHOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKCpwb3J0X2NvbmZpZyk7CisJY29uZmlnLnNiX3BvcnRfY2ZnID0gKnBvcnRfY29uZmlnOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX1NMSU1CVVNfU0xBVkVfUE9SVF9DRkcgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJfQorCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IGFmZV9hYW5jX3BvcnRfY2ZnKHZvaWQgKmFwciwgdWludDE2X3QgdHhfcG9ydCwgdWludDE2X3QgcnhfcG9ydCkKK3sKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9hYW5jX3BhcmFtIGNmZzsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJcHJfZGVidWcoIiVzOiB0eF9wb3J0IDB4JXgsIHJ4X3BvcnQgMHgleFxuIiwKKwkJX19mdW5jX18sIHR4X3BvcnQsIHJ4X3BvcnQpOworCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleCh0eF9wb3J0KTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydCh0eF9wb3J0KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHR4X3BvcnQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IEFBTkMgc2FtcGxlIHJhdGUgdHggcmF0ZTogJWQgcnggcmF0ZSAlZFxuIiwKKwkJX19mdW5jX18sIHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnRfc2FtcGxlX3JhdGUsCisJICAgICAgIHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnRfc2FtcGxlX3JhdGUpOworCS8qCisJICogSWYgYWFuYyB0eCBzYW1wbGUgcmF0ZSBvciByeCBzYW1wbGUgcmF0ZSBpcyB6ZXJvLCBza2lwIGFhbmMKKwkgKiBjb25maWd1cmF0aW9uIGFzIEFGRSByZXNhbXBsZXIgd2lsbCBmYWlsIGZvciBpbnZhbGlkIHNhbXBsZQorCSAqIHJhdGVzLgorCSAqLworCWlmICghdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydF9zYW1wbGVfcmF0ZSB8fAorCSAgICAhdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydF9zYW1wbGVfcmF0ZSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY2ZnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjZmcpOworCWNmZy5oZHIuc3JjX3BvcnQgPSAwOworCWNmZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljZmcuaGRyLnRva2VuID0gaW5kZXg7CisJY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCisJY2ZnLnBhcmFtLnBvcnRfaWQgPSB0eF9wb3J0OworCWNmZy5wYXJhbS5wYXlsb2FkX3NpemUgICAgICAgID0gc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2FhbmNfcG9ydF9jZmcpOworCWNmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ICAgICA9IDA7CisJY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgICAgID0gMDsKKwljZmcucGFyYW0ubWVtX21hcF9oYW5kbGUJICA9IDA7CisKKwljZmcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BQU5DOworCWNmZy5wZGF0YS5wYXJhbV9pZCAgICA9IEFGRV9QQVJBTV9JRF9BQU5DX1BPUlRfQ09ORklHOworCWNmZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfcGFyYW1fYWFuY19wb3J0X2NmZyk7CisJY2ZnLnBkYXRhLnJlc2VydmVkICAgID0gMDsKKworCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcuYWFuY19wb3J0X2NmZ19taW5vcl92ZXJzaW9uID0KKwkJQUZFX0FQSV9WRVJTSU9OX0FBTkNfUE9SVF9DT05GSUc7CisJY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy50eF9wb3J0X3NhbXBsZV9yYXRlID0KKwkJdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydF9zYW1wbGVfcmF0ZTsKKwljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbMF0gPSBBQU5DX1RYX1ZPSUNFX01JQzsKKwljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbMV0gPSBBQU5DX1RYX05PSVNFX01JQzsKKwljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbMl0gPSBBQU5DX1RYX0VSUk9SX01JQzsKKwljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbM10gPSBBQU5DX1RYX01JQ19VTlVTRUQ7CisJY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy50eF9wb3J0X2NoYW5uZWxfbWFwWzRdID0gQUFOQ19UWF9NSUNfVU5VU0VEOworCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFs1XSA9IEFBTkNfVFhfTUlDX1VOVVNFRDsKKwljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbNl0gPSBBQU5DX1RYX01JQ19VTlVTRUQ7CisJY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy50eF9wb3J0X2NoYW5uZWxfbWFwWzddID0gQUFOQ19UWF9NSUNfVU5VU0VEOworCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9udW1fY2hhbm5lbHMgPSAzOworCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcucnhfcGF0aF9yZWZfcG9ydF9pZCA9IHJ4X3BvcnQ7CisJY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy5yZWZfcG9ydF9zYW1wbGVfcmF0ZSA9CisJCSB0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0X3NhbXBsZV9yYXRlOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgodWludDMyX3QgKikgJmNmZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBBQU5DIHBvcnQgY29uZmlnIGZhaWxlZCBmb3IgdHhfcG9ydCAweCV4LCByeF9wb3J0IDB4JXggcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHR4X3BvcnQsIHJ4X3BvcnQsIHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfYWFuY19tb2RfZW5hYmxlKHZvaWQgKmFwciwgdWludDE2X3QgdHhfcG9ydCwgdWludDE2X3QgZW5hYmxlKQoreworCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X2FhbmNfcGFyYW0gY2ZnOworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHR4X3BvcnQgMHgleFxuIiwKKwkJX19mdW5jX18sIHR4X3BvcnQpOworCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleCh0eF9wb3J0KTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydCh0eF9wb3J0KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHR4X3BvcnQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNmZyk7CisJY2ZnLmhkci5zcmNfcG9ydCA9IDA7CisJY2ZnLmhkci5kZXN0X3BvcnQgPSAwOworCWNmZy5oZHIudG9rZW4gPSBpbmRleDsKKwljZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisKKwljZmcucGFyYW0ucG9ydF9pZCA9IHR4X3BvcnQ7CisJY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSAgICAgICAgPSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhZmVfbW9kX2VuYWJsZV9wYXJhbSk7CisJY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgICAgID0gMDsKKwljZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyAgICAgPSAwOworCWNmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSAgICAgICAgICA9IDA7CisKKwljZmcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BQU5DOworCWNmZy5wZGF0YS5wYXJhbV9pZCAgICA9IEFGRV9QQVJBTV9JRF9FTkFCTEU7CisJY2ZnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9tb2RfZW5hYmxlX3BhcmFtKTsKKwljZmcucGRhdGEucmVzZXJ2ZWQgICAgPSAwOworCisJY2ZnLmRhdGEubW9kX2VuYWJsZS5lbmFibGUgPSBlbmFibGU7CisJY2ZnLmRhdGEubW9kX2VuYWJsZS5yZXNlcnZlZCA9IDA7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCh1aW50MzJfdCAqKSAmY2ZnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFIEFBTkMgZW5hYmxlIGZhaWxlZCBmb3IgdHhfcG9ydCAweCV4IHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCB0eF9wb3J0LCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9zZW5kX2Jhbmtfc2VsZWN0aW9uX2NsaXAoCisJCXN0cnVjdCBhZmVfcGFyYW1faWRfY2xpcF9iYW5rX3NlbCAqcGFyYW0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X2NsaXBfYmFua19zZWxlY3Rpb24gY29uZmlnOworCisJaWYgKCFwYXJhbSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisKKwljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9DRENfREVWX0NGRzsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0xJUF9CQU5LX1NFTF9DRkc7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPQorCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsKTsKKwljb25maWcuYmFua19zZWwgPSAqcGFyYW07CisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NMSVBfQkFOS19TRUxfQ0ZHIGZhaWxlZCAlZFxuIiwKKwkJX19mdW5jX18sIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CitpbnQgYWZlX3NlbmRfYWFuY192ZXJzaW9uKAorCXN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbiAqdmVyc2lvbl9jZmcpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWZlX3N2Y19jbWRfY2RjX2FhbmNfdmVyc2lvbiBjb25maWc7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IElEWF9HTE9CQUxfQ0ZHOworCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1NWQ19DTURfU0VUX1BBUkFNOworCisJY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MikgKworCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NkY19hYW5jX3ZlcnNpb24pOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9DRENfQUFOQ19WRVJTSU9OOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0KKwkJc2l6ZW9mKHN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbik7CisJY29uZmlnLnZlcnNpb24gPSAqdmVyc2lvbl9jZmc7CisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19BQU5DX1ZFUlNJT04gZmFpbGVkICVkXG4iLAorCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9wb3J0X3NldF9tYWRfdHlwZSh1MTYgcG9ydF9pZCwgZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGUpCit7CisJaW50IGk7CisKKwlpZiAocG9ydF9pZCA9PSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYKSB7CisJCW1hZF90eXBlID0gTUFEX1NXX0FVRElPOworCQlyZXR1cm4gMDsKKwl9CisKKwlpID0gcG9ydF9pZCAtIFNMSU1CVVNfMF9SWDsKKwlpZiAoaSA8IDAgfHwgaSA+PSBBUlJBWV9TSVpFKGFmZV9wb3J0c19tYWRfdHlwZSkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWF0b21pY19zZXQoJmFmZV9wb3J0c19tYWRfdHlwZVtpXSwgbWFkX3R5cGUpOworCXJldHVybiAwOworfQorCitlbnVtIGFmZV9tYWRfdHlwZSBhZmVfcG9ydF9nZXRfbWFkX3R5cGUodTE2IHBvcnRfaWQpCit7CisJaW50IGk7CisKKwlpZiAocG9ydF9pZCA9PSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYKQorCQlyZXR1cm4gTUFEX1NXX0FVRElPOworCisJaSA9IHBvcnRfaWQgLSBTTElNQlVTXzBfUlg7CisJaWYgKGkgPCAwIHx8IGkgPj0gQVJSQVlfU0laRShhZmVfcG9ydHNfbWFkX3R5cGUpKSB7CisJCXByX2RlYnVnKCIlczogTm9uIFNsaW1idXMgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiBNQURfSFdfTk9ORTsKKwl9CisJcmV0dXJuIChlbnVtIGFmZV9tYWRfdHlwZSkgYXRvbWljX3JlYWQoJmFmZV9wb3J0c19tYWRfdHlwZVtpXSk7Cit9CisKK2ludCBhZmVfc2V0X2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWdfdHlwZSwgdm9pZCAqY29uZmlnX2RhdGEsIGludCBhcmcpCit7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczogZW50ZXIgY29uZmlnX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBjb25maWdfdHlwZSk7CisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN3aXRjaCAoY29uZmlnX3R5cGUpIHsKKwljYXNlIEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRzoKKwkJcmV0ID0gYWZlX3NlbmRfc2xpbWJ1c19zbGF2ZV9jZmcoY29uZmlnX2RhdGEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGFmZV9pbml0X2NkY19yZWdfY29uZmlnKCk7CisJCWVsc2UKKwkJCXByX2VycigiJXM6IFNlbmRpbmcgc2xpbWJ1cyBzbGF2ZSBjb25maWcgZmFpbGVkICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlicmVhazsKKwljYXNlIEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRzoKKwkJcmV0ID0gYWZlX3NlbmRfY29kZWNfcmVnX2NvbmZpZyhjb25maWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6CisJCXJldCA9IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcoY29uZmlnX2RhdGEsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQUZFX0FBTkNfVkVSU0lPTjoKKwkJcmV0ID0gYWZlX3NlbmRfYWFuY192ZXJzaW9uKGNvbmZpZ19kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQ0xJUF9CQU5LX1NFTDoKKwkJcmV0ID0gYWZlX3NlbmRfYmFua19zZWxlY3Rpb25fY2xpcChjb25maWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUc6CisJCXJldCA9IGFmZV9zZW5kX2NvZGVjX3JlZ19jb25maWcoY29uZmlnX2RhdGEpOworCQlicmVhazsKKwljYXNlIEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUc6CisJCXJldCA9IGFmZV9zZW5kX2NvZGVjX3JlZ19wYWdlX2NvbmZpZyhjb25maWdfZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IHVua25vd24gY29uZmlndXJhdGlvbiB0eXBlICVkIiwKKwkJCV9fZnVuY19fLCBjb25maWdfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaWYgKCFyZXQpCisJCXNldF9iaXQoY29uZmlnX3R5cGUsICZhZmVfY29uZmlndXJlZF9jbWQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFmZV9jbGVhcl9jb25maWcgLSBJZiBTU1IgaGFwcGVucyBBRFNQIGxvc2VzIEFGRSBjb25maWdzLCBsZXQgQUZFIGRyaXZlciBrbm93CisgKgkJICAgICAgYWJvdXQgdGhlIHN0YXRlIHNvIGNsaWVudCBkcml2ZXIgY2FuIHdhaXQgdW50aWwgQUZFIGlzCisgKgkJICAgICAgcmVjb25maWd1cmVkLgorICovCit2b2lkIGFmZV9jbGVhcl9jb25maWcoZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnKQoreworCWNsZWFyX2JpdChjb25maWcsICZhZmVfY29uZmlndXJlZF9jbWQpOworfQorCitib29sIGFmZV9oYXNfY29uZmlnKGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZykKK3sKKwlyZXR1cm4gISF0ZXN0X2JpdChjb25maWcsICZhZmVfY29uZmlndXJlZF9jbWQpOworfQorCitpbnQgYWZlX3NlbmRfc3BkaWZfY2xrX2NmZyhzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2Nsa19jZmcgKmNmZywKKwkJdTE2IHBvcnRfaWQpCit7CisJc3RydWN0IGFmZV9zcGRpZl9jbGtfY29uZmlnX2NvbW1hbmQgY2xrX2NmZzsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKCFjZmcpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcG9ydCBpZDogMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY2xrX2NmZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY2xrX2NmZyk7CisJY2xrX2NmZy5oZHIuc3JjX3BvcnQgPSAwOworCWNsa19jZmcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY2xrX2NmZy5oZHIudG9rZW4gPSBpbmRleDsKKworCWNsa19jZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY2xrX2NmZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY2xrX2NmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY2xrX2NmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUERJRl9DTEtfQ09ORklHOworCWNsa19jZmcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2xrX2NmZy5jbGtfY2ZnKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKKwkJLSBzaXplb2YoY2xrX2NmZy5wYXJhbSk7CisJY2xrX2NmZy5jbGtfY2ZnID0gKmNmZzsKKworCXByX2RlYnVnKCIlczogTWlub3IgdmVyc2lvbiA9IDB4JXggY2xrIHZhbCA9ICVkXG4iCisJCQkiY2xrIHJvb3QgPSAweCV4XG4gcG9ydCBpZCA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgY2ZnLT5jbGtfY2ZnX21pbm9yX3ZlcnNpb24sCisJCQljZmctPmNsa192YWx1ZSwgY2ZnLT5jbGtfcm9vdCwKKwkJCXE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCkpOworCisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjbGtfY2ZnKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBBRkUgc2VuZCBjbG9jayBjb25maWcgZm9yIHBvcnQgMHgleCBmYWlsZWQgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKK2ZhaWxfY21kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfc2VuZF9zcGRpZl9jaF9zdGF0dXNfY2ZnKHN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2hfc3RhdHVzX2NmZworCQkqY2hfc3RhdHVzX2NmZywJdTE2IHBvcnRfaWQpCit7CisJc3RydWN0IGFmZV9zcGRpZl9jaHN0YXR1c19jb25maWdfY29tbWFuZCBjaF9zdGF0dXM7CisJaW50IHJldCA9IDA7CisJaW50IGluZGV4ID0gMDsKKworCWlmICghY2hfc3RhdHVzX2NmZykgeworCQlwcl9lcnIoIiVzOiBFcnJvciwgbm8gY29uZmlndXJhdGlvbiBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCXJldHVybiByZXQ7CisJfQorCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwljaF9zdGF0dXMuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY2hfc3RhdHVzLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjaF9zdGF0dXNfY2ZnKTsKKwljaF9zdGF0dXMuaGRyLnNyY19wb3J0ID0gMDsKKwljaF9zdGF0dXMuaGRyLmRlc3RfcG9ydCA9IDA7CisJY2hfc3RhdHVzLmhkci50b2tlbiA9IGluZGV4OworCisJY2hfc3RhdHVzLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNoX3N0YXR1cy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljaF9zdGF0dXMucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY2hfc3RhdHVzLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNoX3N0YXR1cy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY2hfc3RhdHVzLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljaF9zdGF0dXMucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BESUZfQ0xLX0NPTkZJRzsKKwljaF9zdGF0dXMucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2hfc3RhdHVzLmNoX3N0YXR1cyk7CisJY2hfc3RhdHVzLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjaF9zdGF0dXMpCisJCS0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtIHNpemVvZihjaF9zdGF0dXMucGFyYW0pOworCWNoX3N0YXR1cy5jaF9zdGF0dXMgPSAqY2hfc3RhdHVzX2NmZzsKKworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2hfc3RhdHVzKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBBRkUgc2VuZCBjaGFubmVsIHN0YXR1cyBmb3IgcG9ydCAweCV4IGZhaWxlZCByZXQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSA+IDApIHsKKwkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWQgWyVzXVxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworZmFpbF9jbWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfc2VuZF9jbWRfcG9ydF9zdGFydCh1MTYgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdGFydCBzdGFydDsKKwlpbnQgcmV0LCBpbmRleDsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcG9ydCBpZDogMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGFydC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCSAgICBBUFJfUEtUX1ZFUik7CisJc3RhcnQuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0YXJ0KTsKKwlzdGFydC5oZHIuc3JjX3BvcnQgPSAwOworCXN0YXJ0Lmhkci5kZXN0X3BvcnQgPSAwOworCXN0YXJ0Lmhkci50b2tlbiA9IGluZGV4OworCXN0YXJ0Lmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUOworCXN0YXJ0LnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCXByX2RlYnVnKCIlczogY21kIGRldmljZSBzdGFydCBvcGNvZGVbMHgleF0gcG9ydCBpZFsweCV4XVxuIiwKKwkJIF9fZnVuY19fLCBzdGFydC5oZHIub3Bjb2RlLCBzdGFydC5wb3J0X2lkKTsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0YXJ0LCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBwb3J0X2lkLCByZXQpOworCX0gZWxzZSBpZiAodGhpc19hZmUudGFzayAhPSBjdXJyZW50KSB7CisJCXRoaXNfYWZlLnRhc2sgPSBjdXJyZW50OworCQlwcl9kZWJ1ZygidGFza19uYW1lID0gJXMgcGlkID0gJWRcbiIsCisJCQkgdGhpc19hZmUudGFzay0+Y29tbSwgdGhpc19hZmUudGFzay0+cGlkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9hYW5jX3N0YXJ0KHVpbnQxNl90IHR4X3BvcnRfaWQsIHVpbnQxNl90IHJ4X3BvcnRfaWQpCit7CisJaW50IHJldDsKKworCXByX2RlYnVnKCIlczogIFR4IHBvcnQgaXMgMHgleCwgUnggcG9ydCBpcyAweCV4XG4iLAorCQkgX19mdW5jX18sIHR4X3BvcnRfaWQsIHJ4X3BvcnRfaWQpOworCXJldCA9IGFmZV9hYW5jX3BvcnRfY2ZnKHRoaXNfYWZlLmFwciwgdHhfcG9ydF9pZCwgcnhfcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBTZW5kIEFBTkMgUG9ydCBDb25maWcgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXNlbmRfYWZlX2NhbF90eXBlKEFGRV9BQU5DX0NBTCwgdHhfcG9ydF9pZCk7CisKK2ZhaWxfY21kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfc3BkaWZfcG9ydF9zdGFydCh1MTYgcG9ydF9pZCwgc3RydWN0IGFmZV9zcGRpZl9wb3J0X2NvbmZpZyAqc3BkaWZfcG9ydCwKKwkJdTMyIHJhdGUpCit7CisJc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCXVpbnQxNl90IHBvcnRfaW5kZXg7CisKKwlpZiAoIXNwZGlmX3BvcnQpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKworCXByX2RlYnVnKCIlczogcG9ydCBpZDogMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWZlX3NlbmRfY2FsKHBvcnRfaWQpOworCWFmZV9zZW5kX2h3X2RlbGF5KHBvcnRfaWQsIHJhdGUpOworCisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IGluZGV4OworCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKKwljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCisJCXNpemVvZihjb25maWcucGFyYW0pOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUERJRl9DT05GSUc7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnBvcnQpOworCWNvbmZpZy5wb3J0LnNwZGlmID0gc3BkaWZfcG9ydC0+Y2ZnOworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoKHBvcnRfaW5kZXggPj0gMCkgJiYgKHBvcnRfaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgeworCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW3BvcnRfaW5kZXhdID0gcmF0ZTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSBhZmVfc2VuZF9zcGRpZl9jaF9zdGF0dXNfY2ZnKCZzcGRpZl9wb3J0LT5jaF9zdGF0dXMsIHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGFmZSBzZW5kIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0dXJuIGFmZV9zZW5kX2NtZF9wb3J0X3N0YXJ0KHBvcnRfaWQpOworCitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3NlbmRfc2xvdF9tYXBwaW5nX2NmZygKKwlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3Nsb3RfbWFwcGluZ19jZmcgKnNsb3RfbWFwcGluZ19jZmcsCisJdTE2IHBvcnRfaWQpCit7CisJc3RydWN0IGFmZV9zbG90X21hcHBpbmdfY29uZmlnX2NvbW1hbmQgY29uZmlnOworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlpZiAoIXNsb3RfbWFwcGluZ19jZmcpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IGluZGV4OworCisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykKKwkJLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0gc2l6ZW9mKGNvbmZpZy5wYXJhbSk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1RETTsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfUE9SVF9TTE9UX01BUFBJTkdfQ09ORklHOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjb25maWcuc2xvdF9tYXBwaW5nKTsKKwljb25maWcuc2xvdF9tYXBwaW5nID0gKnNsb3RfbWFwcGluZ19jZmc7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNvbmZpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQUZFIHNlbmQgc2xvdCBtYXBwaW5nIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKKwkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3NlbmRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnKAorCXN0cnVjdCBhZmVfcGFyYW1faWRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnICpjdXN0b21fdGRtX2hlYWRlcl9jZmcsCisJdTE2IHBvcnRfaWQpCit7CisJc3RydWN0IGFmZV9jdXN0b21fdGRtX2hlYWRlcl9jb25maWdfY29tbWFuZCBjb25maWc7CisJaW50IHJldCA9IDA7CisJaW50IGluZGV4ID0gMDsKKworCWlmICghY3VzdG9tX3RkbV9oZWFkZXJfY2ZnKSB7CisJCXByX2VycigiJXM6IEVycm9yLCBubyBjb25maWd1cmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiBwb3J0IGlkOiAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcG9ydCBpZDogMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKKworCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKKwljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpCisJCS0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtIHNpemVvZihjb25maWcucGFyYW0pOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9URE07CisJY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NVU1RPTV9URE1fSEVBREVSX0NPTkZJRzsKKwljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY29uZmlnLmN1c3RvbV90ZG1faGVhZGVyKTsKKwljb25maWcuY3VzdG9tX3RkbV9oZWFkZXIgPSAqY3VzdG9tX3RkbV9oZWFkZXJfY2ZnOworCisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEFGRSBzZW5kIGN1c3RvbSB0ZG0gaGVhZGVyIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKKwkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3RkbV9wb3J0X3N0YXJ0KHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX3RkbV9wb3J0X2NvbmZpZyAqdGRtX3BvcnQsCisJCXUzMiByYXRlKQoreworCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZCBjb25maWc7CisJaW50IHJldCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwl1aW50MTZfdCBwb3J0X2luZGV4ID0gMDsKKwllbnVtIGFmZV9tYWRfdHlwZSBtYWRfdHlwZSA9IE1BRF9IV19OT05FOworCisJaWYgKCF0ZG1fcG9ydCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciwgbm8gY29uZmlndXJhdGlvbiBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogcG9ydCBpZDogMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQWxzbyBzZW5kIHRoZSB0b3BvbG9neSBpZCBoZXJlOiAqLworCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKCEodGhpc19hZmUuYWZlX2NhbF9tb2RlW3BvcnRfaW5kZXhdID09IEFGRV9DQUxfTU9ERV9OT05FKSkgeworCQkvKiBPbmUgdGltZSBjYWxsOiBvbmx5IGZvciBmaXJzdCB0aW1lICovCisJCWFmZV9zZW5kX2N1c3RvbV90b3BvbG9neSgpOworCQlhZmVfc2VuZF9wb3J0X3RvcG9sb2d5X2lkKHBvcnRfaWQpOworCQlhZmVfc2VuZF9jYWwocG9ydF9pZCk7CisJCWFmZV9zZW5kX2h3X2RlbGF5KHBvcnRfaWQsIHJhdGUpOworCX0KKworCS8qIFN0YXJ0IFNXIE1BRCBtb2R1bGUgKi8KKwltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAorCQkgbWFkX3R5cGUpOworCWlmIChtYWRfdHlwZSAhPSBNQURfSFdfTk9ORSAmJiBtYWRfdHlwZSAhPSBNQURfU1dfQVVESU8pIHsKKwkJaWYgKCFhZmVfaGFzX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpIHx8CisJCQkhYWZlX2hhc19jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKSkgeworCQkJcHJfZXJyKCIlczogQUZFIGlzbid0IGNvbmZpZ3VyZWQgeWV0IGZvclxuIgorCQkJCSJIVyBNQUQgdHJ5IEFnYWluXG4iLCBfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIGZhaWxfY21kOworCQl9CisJCXJldCA9IGFmZV90dXJuX29ub2ZmX2h3X21hZChtYWRfdHlwZSwgdHJ1ZSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGFmZV90dXJuX29ub2ZmX2h3X21hZCBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJfQorCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gaW5kZXg7CisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KKwkJc2l6ZW9mKGNvbmZpZy5wYXJhbSk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7CisJY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX1RETV9DT05GSUc7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnBvcnQpOworCWNvbmZpZy5wb3J0LnRkbSA9IHRkbV9wb3J0LT50ZG07CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKChwb3J0X2luZGV4ID49IDApICYmIChwb3J0X2luZGV4IDwgQUZFX01BWF9QT1JUUykpIHsKKwkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1twb3J0X2luZGV4XSA9IHJhdGU7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0ID0gYWZlX3NlbmRfc2xvdF9tYXBwaW5nX2NmZygmdGRtX3BvcnQtPnNsb3RfbWFwcGluZywgcG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogYWZlIHNlbmQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAodGRtX3BvcnQtPmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcl90eXBlKSB7CisJCXJldCA9IGFmZV9zZW5kX2N1c3RvbV90ZG1faGVhZGVyX2NmZygKKwkJCSZ0ZG1fcG9ydC0+Y3VzdG9tX3RkbV9oZWFkZXIsIHBvcnRfaWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogYWZlIHNlbmQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwl9CisKKwlyZXQgPSBhZmVfc2VuZF9jbWRfcG9ydF9zdGFydChwb3J0X2lkKTsKKworZmFpbF9jbWQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZmVfc2V0X2NhbF9tb2RlKHUxNiBwb3J0X2lkLCBlbnVtIGFmZV9jYWxfbW9kZSBhZmVfY2FsX21vZGUpCit7CisJdWludDE2X3QgcG9ydF9pbmRleDsKKworCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJdGhpc19hZmUuYWZlX2NhbF9tb2RlW3BvcnRfaW5kZXhdID0gYWZlX2NhbF9tb2RlOworfQorCitpbnQgYWZlX3BvcnRfc2VuZF91c2JfZGV2X3BhcmFtKHUxNiBwb3J0X2lkLCB1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcpCit7CisJc3RydWN0IGFmZV91c2JfYXVkaW9fZGV2X3BhcmFtX2NvbW1hbmQgY29uZmlnOworCWludCByZXQgPSAwLCBpbmRleCA9IDA7CisKKwlpZiAoIWFmZV9jb25maWcpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCEgZm9yIHBvcnQgSUQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgsIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0RFVl9QQVJBTVM7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnVzYl9kZXYpOworCWNvbmZpZy51c2JfZGV2LmNmZ19taW5vcl92ZXJzaW9uID0KKwkJCQlBRkVfQVBJX01JTklPUl9WRVJTSU9OX1VTQl9BVURJT19DT05GSUc7CisJY29uZmlnLnVzYl9kZXYuZGV2X3Rva2VuID0gYWZlX2NvbmZpZy0+dXNiX2F1ZGlvLmRldl90b2tlbjsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBkZXZpY2UgcGFyYW0gY21kIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHE2YWZlX3NlbmRfZW5jX2NvbmZpZyh1MTYgcG9ydF9pZCwKKwkJCQkgdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSAqY2ZnLCB1MzIgZm9ybWF0LAorCQkJCSB1bmlvbiBhZmVfcG9ydF9jb25maWcgYWZlX2NvbmZpZywKKwkJCQkgdTE2IGFmZV9pbl9jaGFubmVscywgdTE2IGFmZV9pbl9iaXRfd2lkdGgpCit7CisJc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKKwlpbnQgaW5kZXg7CisJaW50IHJldDsKKwlpbnQgcGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KKwkJCQlzaXplb2YoY29uZmlnLnBhcmFtKSAtIHNpemVvZihjb25maWcucG9ydCk7CisKKwlwcl9kZWJ1ZygiJXM6dXBkYXRlIERTUCBmb3IgZW5jIGZvcm1hdCA9ICVkXG4iLCBfX2Z1bmNfXywgZm9ybWF0KTsKKwlpZiAoZm9ybWF0ICE9IEFTTV9NRURJQV9GTVRfU0JDICYmIGZvcm1hdCAhPSBBU01fTUVESUFfRk1UX0FBQ19WMiAmJgorCSAgICBmb3JtYXQgIT0gQVNNX01FRElBX0ZNVF9BUFRYICYmIGZvcm1hdCAhPSBBU01fTUVESUFfRk1UX0FQVFhfSEQpIHsKKwkJcHJfZXJyKCIlczpVbnN1cHBwb3J0ZWQgZm9ybWF0IElnbm9yZSBBRkUgY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IGluZGV4OworCisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19mbXQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9JRF9FTkNPREVSOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19GTVRfSUQ7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnBvcnQuZW5jX2ZtdCk7CisJY29uZmlnLnBvcnQuZW5jX2ZtdC5mbXRfaWQgPSBmb3JtYXQ7CisJcHJfZGVidWcoIiVzOnNlbmRpbmcgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCBwYXlsb2FkOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBjb25maWcucGFyYW0ucGF5bG9hZF9zaXplKTsKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOnVuYWJsZSB0byBzZW5kIEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19GTVRfSUQiLAorCQkJCV9fZnVuY19fKTsKKwkJZ290byBleGl0OworCX0KKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemUKKwkJCQkJKyBzaXplb2YoY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbSk7CisJcHJfZGVidWcoIiVzOnNlbmQgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgdG8gRFNQIHBheWxvYWQ6JWRcbiIsCisJCQkJX19mdW5jX18sIGNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUpOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19DRkdfQkxLOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19ibGtfcGFyYW0pOworCWNvbmZpZy5wb3J0LmVuY19ibGtfcGFyYW0uZW5jX2NmZ19ibGtfc2l6ZSA9CisJCQlzaXplb2YoY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbS5lbmNfYmxrX2NvbmZpZyk7CisJY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbS5lbmNfYmxrX2NvbmZpZyA9ICpjZmc7CisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPQorCQkJcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0pOworCXByX2RlYnVnKCIlczpzZW5kaW5nIEFGRV9FTkNPREVSX1BBUkFNX0lEX1BBQ0tFVElaRVIgdG8gRFNQIHBheWxvYWQgPSAlZCIsCisJCQkJCV9fZnVuY19fLCBjb25maWcucGFyYW0ucGF5bG9hZF9zaXplKTsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0pOworCWNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0uZW5jX3BhY2tldGl6ZXJfaWQgPQorCQkJCQlBRkVfTU9EVUxFX0lEX1BBQ0tFVElaRVJfQ09QOworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRV9FTkNPREVSX1BBUkFNX0lEX1BBQ0tFVElaRVIgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPQorCQkJcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUpOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUpOworCisJcHJfZGVidWcoIiVzOlNlbmRpbmcgQUZFX0FQSV9WRVJTSU9OX1BPUlRfTUVESUFfVFlQRSB0byBEU1AiLCBfX2Z1bmNfXyk7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfUE9SVDsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFOworCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUubWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEU7CisJY29uZmlnLnBvcnQubWVkaWFfdHlwZS5zYW1wbGVfcmF0ZSA9IGFmZV9jb25maWcuc2xpbV9zY2guc2FtcGxlX3JhdGU7CisJaWYgKGFmZV9pbl9iaXRfd2lkdGgpCisJCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUuYml0X3dpZHRoID0gYWZlX2luX2JpdF93aWR0aDsKKwllbHNlCisJCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUuYml0X3dpZHRoID0KKwkJCQkJYWZlX2NvbmZpZy5zbGltX3NjaC5iaXRfd2lkdGg7CisKKwlpZiAoYWZlX2luX2NoYW5uZWxzKQorCQljb25maWcucG9ydC5tZWRpYV90eXBlLm51bV9jaGFubmVscyA9IGFmZV9pbl9jaGFubmVsczsKKwllbHNlCisJCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUubnVtX2NoYW5uZWxzID0KKwkJCQkJYWZlX2NvbmZpZy5zbGltX3NjaC5udW1fY2hhbm5lbHM7CisJY29uZmlnLnBvcnQubWVkaWFfdHlwZS5kYXRhX2Zvcm1hdCA9IEFGRV9QT1JUX0RBVEFfRk9STUFUX1BDTTsKKwljb25maWcucG9ydC5tZWRpYV90eXBlLnJlc2VydmVkID0gMDsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fYWZlX3BvcnRfc3RhcnQodTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywKKwkJCSAgICB1MzIgcmF0ZSwgdTE2IGFmZV9pbl9jaGFubmVscywgdTE2IGFmZV9pbl9iaXRfd2lkdGgsCisJCQkgICAgdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSAqY2ZnLCB1MzIgZW5jX2Zvcm1hdCkKK3sKKwlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQgY29uZmlnOworCWludCByZXQgPSAwOworCWludCBjZmdfdHlwZTsKKwlpbnQgaW5kZXggPSAwOworCWVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlOworCXVpbnQxNl90IHBvcnRfaW5kZXg7CisKKwlpZiAoIWFmZV9jb25maWcpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1JYKSB8fAorCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1RYKSkgeworCQlwcl9kZWJ1ZygiJXM6IGJlZm9yZSBpbmNyZW1lbnRpbmcgcGNtX2FmZV9pbnN0YW5jZSAlZCIsCisJCQkiIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sCisJCQlwY21fYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdLCBwb3J0X2lkKTsKKwkJcG9ydF9pZCA9IFZJUlRVQUxfSURfVE9fUE9SVElEKHBvcnRfaWQpOworCQlwY21fYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdKys7CisJCXJldHVybiAwOworCX0KKwlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9SWCkgfHwKKwkJCShwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDFfVFgpKSB7CisJCXByX2RlYnVnKCIlczogYmVmb3JlIGluY3JlbWVudGluZyBwcm94eV9hZmVfaW5zdGFuY2UgJWQiLAorCQkJIiBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJcHJveHlfYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdLCBwb3J0X2lkKTsKKworCQlpZiAoIWFmZV9jbG9zZV9kb25lW3BvcnRfaWQgJiAweDFdKSB7CisJCQkvKmNsb3NlIHBjbSBkYWkgY29ycmVzcG9uZGluZyB0byB0aGUgcHJveHkgZGFpKi8KKwkJCWFmZV9jbG9zZShwb3J0X2lkIC0gMHgxMCk7CisJCQlwY21fYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdKys7CisJCQlwcl9kZWJ1ZygiJXM6IHJlY29uZmlndXJlIGFmZSBwb3J0IGFnYWluXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJcHJveHlfYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdKys7CisJCWFmZV9jbG9zZV9kb25lW3BvcnRfaWQgJiAweDFdID0gZmFsc2U7CisJCXBvcnRfaWQgPSBWSVJUVUFMX0lEX1RPX1BPUlRJRChwb3J0X2lkKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisJLyogQWxzbyBzZW5kIHRoZSB0b3BvbG9neSBpZCBoZXJlOiAqLworCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKCEodGhpc19hZmUuYWZlX2NhbF9tb2RlW3BvcnRfaW5kZXhdID09IEFGRV9DQUxfTU9ERV9OT05FKSkgeworCQkvKiBPbmUgdGltZSBjYWxsOiBvbmx5IGZvciBmaXJzdCB0aW1lICovCisJCWFmZV9zZW5kX2N1c3RvbV90b3BvbG9neSgpOworCQlhZmVfc2VuZF9wb3J0X3RvcG9sb2d5X2lkKHBvcnRfaWQpOworCQlhZmVfc2VuZF9jYWwocG9ydF9pZCk7CisJCWFmZV9zZW5kX2h3X2RlbGF5KHBvcnRfaWQsIHJhdGUpOworCX0KKworCS8qIFN0YXJ0IFNXIE1BRCBtb2R1bGUgKi8KKwltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAorCQkgbWFkX3R5cGUpOworCWlmIChtYWRfdHlwZSAhPSBNQURfSFdfTk9ORSAmJiBtYWRfdHlwZSAhPSBNQURfU1dfQVVESU8pIHsKKwkJaWYgKCFhZmVfaGFzX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpIHx8CisJCQkhYWZlX2hhc19jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKSkgeworCQkJcHJfZXJyKCIlczogQUZFIGlzbid0IGNvbmZpZ3VyZWQgeWV0IGZvclxuIgorCQkJCSJIVyBNQUQgdHJ5IEFnYWluXG4iLCBfX2Z1bmNfXyk7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIGZhaWxfY21kOworCQl9CisJCXJldCA9IGFmZV90dXJuX29ub2ZmX2h3X21hZChtYWRfdHlwZSwgdHJ1ZSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IGFmZV90dXJuX29ub2ZmX2h3X21hZCBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJfQorCisJaWYgKCh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19hY3RpdmUpICYmCisJICAgICh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY190eF9wb3J0ID09IHBvcnRfaWQpKSB7CisJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnRfc2FtcGxlX3JhdGUgPSByYXRlOworCQlwb3J0X2luZGV4ID0KKwkJCWFmZV9nZXRfcG9ydF9pbmRleCh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0KTsKKwkJaWYgKChwb3J0X2luZGV4ID49IDApICYmIChwb3J0X2luZGV4IDwgQUZFX01BWF9QT1JUUykpIHsKKwkJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnRfc2FtcGxlX3JhdGUgPQorCQkJCXRoaXNfYWZlLmFmZV9zYW1wbGVfcmF0ZXNbcG9ydF9pbmRleF07CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaW5kZXggJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaW5kZXgpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwkJcmV0ID0gYWZlX2FhbmNfc3RhcnQodGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydCwKKwkJCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0KTsKKwkJcHJfZGVidWcoIiVzOiBhZmVfYWFuY19zdGFydCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCX0KKworCWlmICgocG9ydF9pZCA9PSBBRkVfUE9SVF9JRF9VU0JfUlgpIHx8CisJICAgIChwb3J0X2lkID09IEFGRV9QT1JUX0lEX1VTQl9UWCkpIHsKKwkJcmV0ID0gYWZlX3BvcnRfc2VuZF91c2JfZGV2X3BhcmFtKHBvcnRfaWQsIGFmZV9jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBBRkUgZGV2aWNlIHBhcmFtIGZvciBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwl9CisKKwljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKKwljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKKwljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY29uZmlnLmhkci50b2tlbiA9IGluZGV4OworCisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9QQ01fQ09ORklHOworCQlicmVhazsKKwljYXNlIFBSSU1BUllfSTJTX1JYOgorCWNhc2UgUFJJTUFSWV9JMlNfVFg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1JYOgorCWNhc2UgU0VDT05EQVJZX0kyU19UWDoKKwljYXNlIE1JMlNfUlg6CisJY2FzZSBNSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6CisJCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX0kyU19DT05GSUc7CisJCWJyZWFrOworCWNhc2UgSERNSV9SWDoKKwljYXNlIERJU1BMQVlfUE9SVF9SWDoKKwkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfSERNSV9DT05GSUc7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRV9SRUNPUkRfUlg6CisJY2FzZSBWT0lDRV9SRUNPUkRfVFg6CisJCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1BTRVVET19QT1JUX0NPTkZJRzsKKwkJYnJlYWs7CisJY2FzZSBTTElNQlVTXzBfUlg6CisJY2FzZSBTTElNQlVTXzBfVFg6CisJY2FzZSBTTElNQlVTXzFfUlg6CisJY2FzZSBTTElNQlVTXzFfVFg6CisJY2FzZSBTTElNQlVTXzJfUlg6CisJY2FzZSBTTElNQlVTXzJfVFg6CisJY2FzZSBTTElNQlVTXzNfUlg6CisJY2FzZSBTTElNQlVTXzNfVFg6CisJY2FzZSBTTElNQlVTXzRfUlg6CisJY2FzZSBTTElNQlVTXzRfVFg6CisJY2FzZSBTTElNQlVTXzVfUlg6CisJY2FzZSBTTElNQlVTXzVfVFg6CisJY2FzZSBTTElNQlVTXzZfUlg6CisJY2FzZSBTTElNQlVTXzZfVFg6CisJY2FzZSBTTElNQlVTXzdfUlg6CisJY2FzZSBTTElNQlVTXzdfVFg6CisJY2FzZSBTTElNQlVTXzhfUlg6CisJY2FzZSBTTElNQlVTXzhfVFg6CisJCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1NMSU1CVVNfQ09ORklHOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKKwkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0NPTkZJRzsKKwkJYnJlYWs7CisJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDoKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9SVF9QUk9YWV9DT05GSUc7CisJCWJyZWFrOworCWNhc2UgSU5UX0JUX1NDT19SWDoKKwljYXNlIElOVF9CVF9BMkRQX1JYOgorCWNhc2UgSU5UX0JUX1NDT19UWDoKKwljYXNlIElOVF9GTV9SWDoKKwljYXNlIElOVF9GTV9UWDoKKwkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfSU5URVJOQUxfQlRfRk1fQ09ORklHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljb25maWcucGRhdGEucGFyYW1faWQgPSBjZmdfdHlwZTsKKwljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcucG9ydCk7CisKKwljb25maWcucG9ydCA9ICphZmVfY29uZmlnOworCWlmICgoZW5jX2Zvcm1hdCAhPSBBU01fTUVESUFfRk1UX05PTkUpICYmCisJICAgIChjZmdfdHlwZSA9PSBBRkVfUEFSQU1fSURfU0xJTUJVU19DT05GSUcpKSB7CisJCWNvbmZpZy5wb3J0LnNsaW1fc2NoLmRhdGFfZm9ybWF0ID0KKwkJCQlBRkVfU0JfREFUQV9GT1JNQVRfR0VORVJJQ19DT01QUkVTU0VEOworCX0KKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKChlbmNfZm9ybWF0ICE9IEFTTV9NRURJQV9GTVRfTk9ORSkgJiYKKwkgICAgKGNmZ190eXBlID09IEFGRV9QQVJBTV9JRF9TTElNQlVTX0NPTkZJRykpIHsKKwkJcHJfZGVidWcoIiVzOiBGb3VuZCBBRkUgZW5jb2RlciBzdXBwb3J0IGZvciBTTElNQlVTIGVuY19mb3JtYXQgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGVuY19mb3JtYXQpOworCQlyZXQgPSBxNmFmZV9zZW5kX2VuY19jb25maWcocG9ydF9pZCwgY2ZnLCBlbmNfZm9ybWF0LAorCQkJCQkgICAgKmFmZV9jb25maWcsIGFmZV9pbl9jaGFubmVscywKKwkJCQkJICAgIGFmZV9pbl9iaXRfd2lkdGgpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBBRkUgZW5jb2RlciBjb25maWcgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJfQorCisJcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoKHBvcnRfaW5kZXggPj0gMCkgJiYgKHBvcnRfaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgeworCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW3BvcnRfaW5kZXhdID0gcmF0ZTsKKwkJLyoKKwkJICogSWYgYWZlX3BvcnRfc3RhcnQoKSBmb3IgdHggcG9ydCBjYWxsZWQgYmVmb3JlCisJCSAqIHJ4IHBvcnQsIHRoZW4gYWFuYyByeCBzYW1wbGUgcmF0ZSBpcyB6ZXJvLiBTbywKKwkJICogQUFOQyBzdGF0ZSBtYWNoaW5lIGluIEFGRSB3aWxsIG5vdCBnZXQgdHJpZ2dlcmVkLgorCQkgKiBNYWtlIHN1cmUgdG8gY2hlY2sgd2hldGhlciBhYW5jIGlzIGFjdGl2ZSBkdXJpbmcKKwkJICogYWZlX3BvcnRfc3RhcnQoKSBmb3IgcnggcG9ydCBhbmQgaWYgYWFuYyByeAorCQkgKiBzYW1wbGUgcmF0ZSBpcyB6ZXJvLCBjYWxsIGFmZV9hYW5jX3N0YXJ0IHRvIGNvbmZpZ3VyZQorCQkgKiBhYW5jIHdpdGggdmFsaWQgc2FtcGxlIHJhdGVzLgorCQkgKi8KKwkJaWYgKHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSAmJgorCQkgICAgIXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnRfc2FtcGxlX3JhdGUpIHsKKwkJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnRfc2FtcGxlX3JhdGUgPQorCQkJCXRoaXNfYWZlLmFmZV9zYW1wbGVfcmF0ZXNbcG9ydF9pbmRleF07CisJCQlyZXQgPSBhZmVfYWFuY19zdGFydCh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY190eF9wb3J0LAorCQkJCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0KTsKKwkJCXByX2RlYnVnKCIlczogYWZlX2FhbmNfc3RhcnQgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJfQorCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpbmRleCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXQgPSBhZmVfc2VuZF9jbWRfcG9ydF9zdGFydChwb3J0X2lkKTsKKworZmFpbF9jbWQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWZlX3BvcnRfc3RhcnQgLSB0byBjb25maWd1cmUgQUZFIHNlc3Npb24gd2l0aAorICogc3BlY2lmaWVkIHBvcnQgY29uZmlndXJhdGlvbgorICoKKyAqIEBwb3J0X2lkOiBBRkUgcG9ydCBpZCBudW1iZXIKKyAqIEBhZmVfY29uZmlnOiBwb3J0IGNvbmZpZ3V0YXRpb24KKyAqIEByYXRlOiBzYW1wbGluZyByYXRlIG9mIHBvcnQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBlcnJvciB2YWx1ZSBvbiBwb3J0IHN0YXJ0IGZhaWx1cmUuCisgKi8KK2ludCBhZmVfcG9ydF9zdGFydCh1MTYgcG9ydF9pZCwgdW5pb24gYWZlX3BvcnRfY29uZmlnICphZmVfY29uZmlnLAorCQkgICB1MzIgcmF0ZSkKK3sKKwlyZXR1cm4gX19hZmVfcG9ydF9zdGFydChwb3J0X2lkLCBhZmVfY29uZmlnLCByYXRlLAorCQkJCTAsIDAsIE5VTEwsIEFTTV9NRURJQV9GTVRfTk9ORSk7Cit9CitFWFBPUlRfU1lNQk9MKGFmZV9wb3J0X3N0YXJ0KTsKKworLyoqCisgKiBhZmVfcG9ydF9zdGFydF92MiAtIHRvIGNvbmZpZ3VyZSBBRkUgc2Vzc2lvbiB3aXRoCisgKiBzcGVjaWZpZWQgcG9ydCBjb25maWd1cmF0aW9uIGFuZCBlbmNvZGVyIHBhcmFtcworICoKKyAqIEBwb3J0X2lkOiBBRkUgcG9ydCBpZCBudW1iZXIKKyAqIEBhZmVfY29uZmlnOiBwb3J0IGNvbmZpZ3V0YXRpb24KKyAqIEByYXRlOiBzYW1wbGluZyByYXRlIG9mIHBvcnQKKyAqIEBjZmc6IEFGRSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gc2V0dXAgZW5jb2RlcgorICogQGFmZV9pbl9jaGFubmVsczogQUZFIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiwgdGhpcyBuZWVkcworICogIHVwZGF0ZSBvbmx5IGlmIGlucHV0IGNoYW5uZWwgaXMgZGlmZmVyIGZyb20gQUZFIG91dHB1dAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGVycm9yIHZhbHVlIG9uIHBvcnQgc3RhcnQgZmFpbHVyZS4KKyAqLworaW50IGFmZV9wb3J0X3N0YXJ0X3YyKHUxNiBwb3J0X2lkLCB1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcsCisJCSAgICAgIHUzMiByYXRlLCB1MTYgYWZlX2luX2NoYW5uZWxzLCB1MTYgYWZlX2luX2JpdF93aWR0aCwKKwkJICAgICAgc3RydWN0IGFmZV9lbmNfY29uZmlnICplbmNfY2ZnKQoreworCXJldHVybiBfX2FmZV9wb3J0X3N0YXJ0KHBvcnRfaWQsIGFmZV9jb25maWcsIHJhdGUsCisJCQkJYWZlX2luX2NoYW5uZWxzLCBhZmVfaW5fYml0X3dpZHRoLAorCQkJCSZlbmNfY2ZnLT5kYXRhLCBlbmNfY2ZnLT5mb3JtYXQpOworfQorRVhQT1JUX1NZTUJPTChhZmVfcG9ydF9zdGFydF92Mik7CisKK2ludCBhZmVfZ2V0X3BvcnRfaW5kZXgodTE2IHBvcnRfaWQpCit7CisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBQUklNQVJZX0kyU19SWDogcmV0dXJuIElEWF9QUklNQVJZX0kyU19SWDsKKwljYXNlIFBSSU1BUllfSTJTX1RYOiByZXR1cm4gSURYX1BSSU1BUllfSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDsKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6IHJldHVybiBJRFhfU0VDT05EQVJZX0kyU19SWDsKKwljYXNlIFNFQ09OREFSWV9JMlNfVFg6IHJldHVybiBJRFhfU0VDT05EQVJZX0kyU19UWDsKKwljYXNlIE1JMlNfUlg6IHJldHVybiBJRFhfTUkyU19SWDsKKwljYXNlIE1JMlNfVFg6IHJldHVybiBJRFhfTUkyU19UWDsKKwljYXNlIEhETUlfUlg6IHJldHVybiBJRFhfSERNSV9SWDsKKwljYXNlIERJU1BMQVlfUE9SVF9SWDogcmV0dXJuIElEWF9ESVNQTEFZX1BPUlRfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9TUERJRl9SWDogcmV0dXJuIElEWF9TUERJRl9SWDsKKwljYXNlIFJTVkRfMjogcmV0dXJuIElEWF9SU1ZEXzI7CisJY2FzZSBSU1ZEXzM6IHJldHVybiBJRFhfUlNWRF8zOworCWNhc2UgRElHSV9NSUNfVFg6IHJldHVybiBJRFhfRElHSV9NSUNfVFg7CisJY2FzZSBWT0lDRV9SRUNPUkRfUlg6IHJldHVybiBJRFhfVk9JQ0VfUkVDT1JEX1JYOworCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOiByZXR1cm4gSURYX1ZPSUNFX1JFQ09SRF9UWDsKKwljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOiByZXR1cm4gSURYX1ZPSUNFX1BMQVlCQUNLX1RYOworCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOiByZXR1cm4gSURYX1ZPSUNFMl9QTEFZQkFDS19UWDsKKwljYXNlIFNMSU1CVVNfMF9SWDogcmV0dXJuIElEWF9TTElNQlVTXzBfUlg7CisJY2FzZSBTTElNQlVTXzBfVFg6IHJldHVybiBJRFhfU0xJTUJVU18wX1RYOworCWNhc2UgU0xJTUJVU18xX1JYOiByZXR1cm4gSURYX1NMSU1CVVNfMV9SWDsKKwljYXNlIFNMSU1CVVNfMV9UWDogcmV0dXJuIElEWF9TTElNQlVTXzFfVFg7CisJY2FzZSBTTElNQlVTXzJfUlg6IHJldHVybiBJRFhfU0xJTUJVU18yX1JYOworCWNhc2UgU0xJTUJVU18yX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfMl9UWDsKKwljYXNlIFNMSU1CVVNfM19SWDogcmV0dXJuIElEWF9TTElNQlVTXzNfUlg7CisJY2FzZSBTTElNQlVTXzNfVFg6IHJldHVybiBJRFhfU0xJTUJVU18zX1RYOworCWNhc2UgSU5UX0JUX1NDT19SWDogcmV0dXJuIElEWF9JTlRfQlRfU0NPX1JYOworCWNhc2UgSU5UX0JUX1NDT19UWDogcmV0dXJuIElEWF9JTlRfQlRfU0NPX1RYOworCWNhc2UgSU5UX0JUX0EyRFBfUlg6IHJldHVybiBJRFhfSU5UX0JUX0EyRFBfUlg7CisJY2FzZSBJTlRfRk1fUlg6IHJldHVybiBJRFhfSU5UX0ZNX1JYOworCWNhc2UgSU5UX0ZNX1RYOiByZXR1cm4gSURYX0lOVF9GTV9UWDsKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOiByZXR1cm4gSURYX1JUX1BST1hZX1BPUlRfMDAxX1JYOworCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6IHJldHVybiBJRFhfUlRfUFJPWFlfUE9SVF8wMDFfVFg7CisJY2FzZSBTTElNQlVTXzRfUlg6IHJldHVybiBJRFhfU0xJTUJVU180X1JYOworCWNhc2UgU0xJTUJVU180X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfNF9UWDsKKwljYXNlIFNMSU1CVVNfNV9SWDogcmV0dXJuIElEWF9TTElNQlVTXzVfUlg7CisJY2FzZSBTTElNQlVTXzVfVFg6IHJldHVybiBJRFhfU0xJTUJVU181X1RYOworCWNhc2UgU0xJTUJVU182X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfNl9SWDsKKwljYXNlIFNMSU1CVVNfNl9UWDogcmV0dXJuIElEWF9TTElNQlVTXzZfVFg7CisJY2FzZSBTTElNQlVTXzdfUlg6IHJldHVybiBJRFhfU0xJTUJVU183X1JYOworCWNhc2UgU0xJTUJVU183X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfN19UWDsKKwljYXNlIFNMSU1CVVNfOF9SWDogcmV0dXJuIElEWF9TTElNQlVTXzhfUlg7CisJY2FzZSBTTElNQlVTXzhfVFg6IHJldHVybiBJRFhfU0xJTUJVU184X1RYOworCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOiByZXR1cm4gSURYX0FGRV9QT1JUX0lEX1VTQl9SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDogcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9VU0JfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8wOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNTsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogcG9ydCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50IGFmZV9vcGVuKHUxNiBwb3J0X2lkLAorCQl1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcsIGludCByYXRlKQoreworCXN0cnVjdCBhZmVfcG9ydF9jbWRfZGV2aWNlX3N0YXJ0IHN0YXJ0OworCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZCBjb25maWc7CisJaW50IHJldCA9IDA7CisJaW50IGNmZ190eXBlOworCWludCBpbmRleCA9IDA7CisKKwlpZiAoIWFmZV9jb25maWcpIHsKKwkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKworCXByX2VycigiJXM6IHBvcnRfaWQgMHgleCByYXRlICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmF0ZSk7CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1JYKSB8fAorCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1RYKSkgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBwb3J0IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAorCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYKSkKKwkJcG9ydF9pZCA9IFZJUlRVQUxfSURfVE9fUE9SVElEKHBvcnRfaWQpOworCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBBbHNvIHNlbmQgdGhlIHRvcG9sb2d5IGlkIGhlcmU6ICovCisJYWZlX3NlbmRfY3VzdG9tX3RvcG9sb2d5KCk7IC8qIE9uZSB0aW1lIGNhbGw6IG9ubHkgZm9yIGZpcnN0IHRpbWUgICovCisJYWZlX3NlbmRfcG9ydF90b3BvbG9neV9pZChwb3J0X2lkKTsKKworCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgOiBJbnZhbGlkIFBvcnQgaWQgPSAweCV4IHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXV0ZXhfbG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKKworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOworCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOworCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljb25maWcuaGRyLnRva2VuID0gaW5kZXg7CisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBQUklNQVJZX0kyU19SWDoKKwljYXNlIFBSSU1BUllfSTJTX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9JMlNfQ09ORklHOworCQlicmVhazsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6CisJCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1BDTV9DT05GSUc7CisJCWJyZWFrOworCWNhc2UgU0VDT05EQVJZX0kyU19SWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6CisJY2FzZSBNSTJTX1JYOgorCWNhc2UgTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9JMlNfQ09ORklHOworCQlicmVhazsKKwljYXNlIEhETUlfUlg6CisJY2FzZSBESVNQTEFZX1BPUlRfUlg6CisJCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX0hETUlfQ09ORklHOworCQlicmVhazsKKwljYXNlIFNMSU1CVVNfMF9SWDoKKwljYXNlIFNMSU1CVVNfMF9UWDoKKwljYXNlIFNMSU1CVVNfMV9SWDoKKwljYXNlIFNMSU1CVVNfMV9UWDoKKwljYXNlIFNMSU1CVVNfMl9SWDoKKwljYXNlIFNMSU1CVVNfMl9UWDoKKwljYXNlIFNMSU1CVVNfM19SWDoKKwljYXNlIFNMSU1CVVNfM19UWDoKKwljYXNlIFNMSU1CVVNfNF9SWDoKKwljYXNlIFNMSU1CVVNfNF9UWDoKKwljYXNlIFNMSU1CVVNfNV9SWDoKKwljYXNlIFNMSU1CVVNfNl9SWDoKKwljYXNlIFNMSU1CVVNfNl9UWDoKKwljYXNlIFNMSU1CVVNfN19SWDoKKwljYXNlIFNMSU1CVVNfN19UWDoKKwljYXNlIFNMSU1CVVNfOF9SWDoKKwljYXNlIFNMSU1CVVNfOF9UWDoKKwkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfU0xJTUJVU19DT05GSUc7CisJCWJyZWFrOworCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVVNCX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fQ09ORklHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCisJCQkJIC0gc2l6ZW9mKGNvbmZpZy5wYXJhbSk7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7CisJY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gY2ZnX3R5cGU7CisJY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNvbmZpZy5wb3J0KTsKKworCWNvbmZpZy5wb3J0ID0gKmFmZV9jb25maWc7CisJcHJfZGVidWcoIiVzOiBwYXJhbSBQTCBzaXplPSVkIGlwYXJhbV9zaXplWyVkXVslemQgJXpkICV6ZCAlemRdIHBhcmFtX2lkWzB4JXhdXG4iLAorCQlfX2Z1bmNfXywgY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSwgY29uZmlnLnBkYXRhLnBhcmFtX3NpemUsCisJCXNpemVvZihjb25maWcpLCBzaXplb2YoY29uZmlnLnBhcmFtKSwgc2l6ZW9mKGNvbmZpZy5wb3J0KSwKKwkJc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSwgY29uZmlnLnBkYXRhLnBhcmFtX2lkKTsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBvcGNvZGVbMHgleF1mYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgY2ZnX3R5cGUsIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXN0YXJ0Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlzdGFydC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RhcnQpOworCXN0YXJ0Lmhkci5zcmNfcG9ydCA9IDA7CisJc3RhcnQuaGRyLmRlc3RfcG9ydCA9IDA7CisJc3RhcnQuaGRyLnRva2VuID0gaW5kZXg7CisJc3RhcnQuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RBUlQ7CisJc3RhcnQucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7CisJcHJfZGVidWcoIiVzOiBjbWQgZGV2aWNlIHN0YXJ0IG9wY29kZVsweCV4XSBwb3J0IGlkWzB4JXhdXG4iLAorCQlfX2Z1bmNfXywgc3RhcnQuaGRyLm9wY29kZSwgc3RhcnQucG9ydF9pZCk7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzdGFydCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJCXBvcnRfaWQsIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9sb29wYmFjayh1MTYgZW5hYmxlLCB1MTYgcnhfcG9ydCwgdTE2IHR4X3BvcnQpCit7CisJc3RydWN0IGFmZV9sb29wYmFja19jZmdfdjEgbGJfY21kOworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlpZiAocnhfcG9ydCA9PSBNSTJTX1JYKQorCQlyeF9wb3J0ID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOworCWlmICh0eF9wb3J0ID09IE1JMlNfVFgpCisJCXR4X3BvcnQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7CisKKwlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocnhfcG9ydCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocnhfcG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkIiwgX19mdW5jX18sIHJ4X3BvcnQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxiX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKDIwKSwgQVBSX1BLVF9WRVIpOworCWxiX2NtZC5oZHIucGt0X3NpemUgPSBzaXplb2YobGJfY21kKTsKKwlsYl9jbWQuaGRyLnNyY19wb3J0ID0gMDsKKwlsYl9jbWQuaGRyLmRlc3RfcG9ydCA9IDA7CisJbGJfY21kLmhkci50b2tlbiA9IGluZGV4OworCWxiX2NtZC5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKKwlsYl9jbWQucGFyYW0ucG9ydF9pZCA9IHR4X3BvcnQ7CisJbGJfY21kLnBhcmFtLnBheWxvYWRfc2l6ZSA9IChzaXplb2YobGJfY21kKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyKSk7CisJbGJfY21kLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWxiX2NtZC5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwlsYl9jbWQucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWxiX2NtZC5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0xPT1BCQUNLOworCWxiX2NtZC5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9MT09QQkFDS19DT05GSUc7CisJbGJfY21kLnBkYXRhLnBhcmFtX3NpemUgPSBsYl9jbWQucGFyYW0ucGF5bG9hZF9zaXplIC0KKwkJCQkgIHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92Mik7CisKKwlsYl9jbWQuZHN0X3BvcnRfaWQgPSByeF9wb3J0OworCWxiX2NtZC5yb3V0aW5nX21vZGUgPSBMQl9NT0RFX0RFRkFVTFQ7CisJbGJfY21kLmVuYWJsZSA9IChlbmFibGUgPyAxIDogMCk7CisJbGJfY21kLmxvb3BiYWNrX2NmZ19taW5vcl92ZXJzaW9uID0gQUZFX0FQSV9WRVJTSU9OX0xPT1BCQUNLX0NPTkZJRzsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmxiX2NtZCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgbG9vcGJhY2sgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX2xvb3BiYWNrX2dhaW4odTE2IHBvcnRfaWQsIHUxNiB2b2x1bWUpCit7CisJc3RydWN0IGFmZV9sb29wYmFja19nYWluX3Blcl9wYXRoX3BhcmFtIHNldF9wYXJhbTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCisJCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7CisJCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOworCX0KKworCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgOiBJbnZhbGlkIFBvcnQgaWQgPSAweCV4IHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkIiwKKwkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSWCBwb3J0cyBudW1iZXJzIGFyZSBldmVuIC5UWCBwb3J0cyBudW1iZXJzIGFyZSBvZGQuICovCisJaWYgKHBvcnRfaWQgJSAyID09IDApIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIDogYWZlIGxvb3BiYWNrIGdhaW4gb25seSBmb3IgVFggcG9ydHMuIHBvcnRfaWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXByX2RlYnVnKCIlczogcG9ydCAweCV4IHZvbHVtZSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHZvbHVtZSk7CisKKwlzZXRfcGFyYW0uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCXNldF9wYXJhbS5oZHIucGt0X3NpemUgPSBzaXplb2Yoc2V0X3BhcmFtKTsKKwlzZXRfcGFyYW0uaGRyLnNyY19wb3J0ID0gMDsKKwlzZXRfcGFyYW0uaGRyLmRlc3RfcG9ydCA9IDA7CisJc2V0X3BhcmFtLmhkci50b2tlbiA9IGluZGV4OworCXNldF9wYXJhbS5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKKworCXNldF9wYXJhbS5wYXJhbS5wb3J0X2lkCT0gcG9ydF9pZDsKKwlzZXRfcGFyYW0ucGFyYW0ucGF5bG9hZF9zaXplID0KKwkgICAgKHNpemVvZihzdHJ1Y3QgYWZlX2xvb3BiYWNrX2dhaW5fcGVyX3BhdGhfcGFyYW0pIC0KKwkgICAgIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIpKTsKKwlzZXRfcGFyYW0ucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdwk9IDA7CisJc2V0X3BhcmFtLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cJPSAwOworCXNldF9wYXJhbS5wYXJhbS5tZW1fbWFwX2hhbmRsZSAgICAgICAgPSAwOworCisJc2V0X3BhcmFtLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfTE9PUEJBQ0s7CisJc2V0X3BhcmFtLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0dBSU5fUEVSX1BBVEg7CisJc2V0X3BhcmFtLnBkYXRhLnBhcmFtX3NpemUgPQorCSAgICAoc2V0X3BhcmFtLnBhcmFtLnBheWxvYWRfc2l6ZSAtCisJICAgICBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpKTsKKwlzZXRfcGFyYW0ucnhfcG9ydF9pZCA9IHBvcnRfaWQ7CisJc2V0X3BhcmFtLmdhaW4gPSB2b2x1bWU7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzZXRfcGFyYW0sICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBBRkUgcGFyYW0gc2V0IGZhaWxlZCBmb3IgcG9ydCAweCV4IHJldCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3BzZXVkb19wb3J0X3N0YXJ0X25vd2FpdCh1MTYgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RhcnRfY29tbWFuZCBzdGFydDsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogcG9ydF9pZD0weCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFGRSBBUFIgaXMgbm90IHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisKKwlzdGFydC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJc3RhcnQuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0YXJ0KTsKKwlzdGFydC5oZHIuc3JjX3BvcnQgPSAwOworCXN0YXJ0Lmhkci5kZXN0X3BvcnQgPSAwOworCXN0YXJ0Lmhkci50b2tlbiA9IDA7CisJc3RhcnQuaGRyLm9wY29kZSA9IEFGRV9QU0VVRE9QT1JUX0NNRF9TVEFSVDsKKwlzdGFydC5wb3J0X2lkID0gcG9ydF9pZDsKKwlzdGFydC50aW1pbmcgPSAxOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmc3RhcnQsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFmZV9zdGFydF9wc2V1ZG9fcG9ydCh1MTYgcG9ydF9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RhcnRfY29tbWFuZCBzdGFydDsKKwlpbnQgaW5kZXggPSAwOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhcnQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCXN0YXJ0Lmhkci5wa3Rfc2l6ZSA9IHNpemVvZihzdGFydCk7CisJc3RhcnQuaGRyLnNyY19wb3J0ID0gMDsKKwlzdGFydC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlzdGFydC5oZHIudG9rZW4gPSAwOworCXN0YXJ0Lmhkci5vcGNvZGUgPSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQ7CisJc3RhcnQucG9ydF9pZCA9IHBvcnRfaWQ7CisJc3RhcnQudGltaW5nID0gMTsKKwlzdGFydC5oZHIudG9rZW4gPSBpbmRleDsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0YXJ0LCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3BzZXVkb19wb3J0X3N0b3Bfbm93YWl0KHUxNiBwb3J0X2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdG9wX2NvbW1hbmQgc3RvcDsKKwlpbnQgaW5kZXggPSAwOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFGRSBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsCisJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJc3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RvcCk7CisJc3RvcC5oZHIuc3JjX3BvcnQgPSAwOworCXN0b3AuaGRyLmRlc3RfcG9ydCA9IDA7CisJc3RvcC5oZHIudG9rZW4gPSAwOworCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QU0VVRE9QT1JUX0NNRF9TVE9QOworCXN0b3AucG9ydF9pZCA9IHBvcnRfaWQ7CisJc3RvcC5yZXNlcnZlZCA9IDA7CisJc3RvcC5oZHIudG9rZW4gPSBpbmRleDsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0b3AsIE5VTEwpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRSBjbG9zZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9wb3J0X2dyb3VwX3NldF9wYXJhbSh1MTYgZ3JvdXBfaWQsCisJdW5pb24gYWZlX3BvcnRfZ3JvdXBfY29uZmlnICphZmVfZ3JvdXBfY29uZmlnKQoreworCWludCByZXQ7CisJc3RydWN0IGFmZV9wb3J0X2dyb3VwX2NyZWF0ZSBjb25maWc7CisJaW50IGNmZ190eXBlOworCisJaWYgKCFhZmVfZ3JvdXBfY29uZmlnKSB7CisJCXByX2VycigiJXM6IEVycm9yLCBubyBjb25maWd1cmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiBncm91cCBpZDogMHgleFxuIiwgX19mdW5jX18sIGdyb3VwX2lkKTsKKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN3aXRjaCAoZ3JvdXBfaWQpIHsKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fUlg6CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1RYOgorCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1JYOgorCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fUlg6CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1RFUlRJQVJZX1RETV9UWDoKKwljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfVERNX0NPTkZJRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBncm91cCBpZCAweCV4XG4iLCBfX2Z1bmNfXywgZ3JvdXBfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfR1JPVVBfREVWSUNFOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IGNmZ190eXBlOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5kYXRhKTsKKwljb25maWcuZGF0YSA9ICphZmVfZ3JvdXBfY29uZmlnOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfQ0ZHIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9wb3J0X2dyb3VwX2VuYWJsZSh1MTYgZ3JvdXBfaWQsCisJdW5pb24gYWZlX3BvcnRfZ3JvdXBfY29uZmlnICphZmVfZ3JvdXBfY29uZmlnLAorCXUxNiBlbmFibGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWZlX3BvcnRfZ3JvdXBfY3JlYXRlIGNvbmZpZzsKKworCXByX2RlYnVnKCIlczogZ3JvdXAgaWQ6IDB4JXggZW5hYmxlOiAlZFxuIiwgX19mdW5jX18sCisJCWdyb3VwX2lkLCBlbmFibGUpOworCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBhZmVfcG9ydF9ncm91cF9zZXRfcGFyYW0oZ3JvdXBfaWQsIGFmZV9ncm91cF9jb25maWcpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogYWZlIHNlbmQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKKwljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7CisJY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7CisJY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOworCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKKwljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKKworCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQorCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKKwljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfR1JPVVBfREVWSUNFOworCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfRU5BQkxFOworCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5kYXRhKTsKKwljb25maWcuZGF0YS5ncm91cF9lbmFibGUuZ3JvdXBfaWQgPSBncm91cF9pZDsKKwljb25maWcuZGF0YS5ncm91cF9lbmFibGUuZW5hYmxlID0gZW5hYmxlOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfRU5BQkxFIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9zdG9wX3BzZXVkb19wb3J0KHUxNiBwb3J0X2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdG9wX2NvbW1hbmQgc3RvcDsKKwlpbnQgaW5kZXggPSAwOworCisJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFGRSBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0b3AuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCXN0b3AuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0b3ApOworCXN0b3AuaGRyLnNyY19wb3J0ID0gMDsKKwlzdG9wLmhkci5kZXN0X3BvcnQgPSAwOworCXN0b3AuaGRyLnRva2VuID0gMDsKKwlzdG9wLmhkci5vcGNvZGUgPSBBRkVfUFNFVURPUE9SVF9DTURfU1RPUDsKKwlzdG9wLnBvcnRfaWQgPSBwb3J0X2lkOworCXN0b3AucmVzZXJ2ZWQgPSAwOworCXN0b3AuaGRyLnRva2VuID0gaW5kZXg7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzdG9wLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRSBjbG9zZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwordWludDMyX3QgYWZlX3JlcV9tbWFwX2hhbmRsZShzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpCit7CisJcmV0dXJuIGFjLT5tZW1fbWFwX2hhbmRsZTsKK30KKworc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKnE2YWZlX2F1ZGlvX2NsaWVudF9hbGxvYyh2b2lkICpwcml2KQoreworCXN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYzsKKwlpbnQgbGNudCA9IDA7CisKKwlhYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZmVfYXVkaW9fY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhYykKKwkJcmV0dXJuIE5VTEw7CisKKwlhYy0+cHJpdiA9IHByaXY7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhYy0+Y21kX3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZhYy0+cG9ydFswXS5tZW1fbWFwX2hhbmRsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmFjLT5wb3J0WzFdLm1lbV9tYXBfaGFuZGxlKTsKKwlwcl9kZWJ1ZygiJXM6IG1lbV9tYXBfaGFuZGxlIGxpc3QgaW5pdCdlZFxuIiwgX19mdW5jX18pOworCW11dGV4X2luaXQoJmFjLT5jbWRfbG9jayk7CisJZm9yIChsY250ID0gMDsgbGNudCA8PSBPVVQ7IGxjbnQrKykgeworCQltdXRleF9pbml0KCZhYy0+cG9ydFtsY250XS5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmFjLT5wb3J0W2xjbnRdLmRzcF9sb2NrKTsKKwl9CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMCk7CisKKwlyZXR1cm4gYWM7Cit9CisKK2ludCBxNmFmZV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYywKKwkJCXVuc2lnbmVkIGludCBidWZzeiwKKwkJCXVuc2lnbmVkIGludCBidWZjbnQpCit7CisJaW50IGNudCA9IDA7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYWZlX2F1ZGlvX2J1ZmZlciAqYnVmOworCXNpemVfdCBsZW47CisKKwlpZiAoIShhYykgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGJ1ZnN6WyVkXWJ1ZmNudFslZF1cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWJ1ZnN6LCBidWZjbnQpOworCisJaWYgKGFjLT5wb3J0W2Rpcl0uYnVmKSB7CisJCXByX2RlYnVnKCIlczogYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCWJ1ZiA9IGt6YWxsb2MoKChzaXplb2Yoc3RydWN0IGFmZV9hdWRpb19idWZmZXIpKSpidWZjbnQpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoIiVzOiBudWxsIGJ1ZlxuIiwgX19mdW5jX18pOworCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlhYy0+cG9ydFtkaXJdLmJ1ZiA9IGJ1ZjsKKworCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiYWZlX2NsaWVudCIsICZidWZbMF0uY2xpZW50LAorCQkJCSZidWZbMF0uaGFuZGxlLCBidWZzeipidWZjbnQsCisJCQkJJmJ1ZlswXS5waHlzLCAmbGVuLAorCQkJCSZidWZbMF0uZGF0YSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlidWZbMF0udXNlZCA9IGRpciBeIDE7CisJYnVmWzBdLnNpemUgPSBidWZzejsKKwlidWZbMF0uYWN0dWFsX3NpemUgPSBidWZzejsKKwljbnQgPSAxOworCXdoaWxlIChjbnQgPCBidWZjbnQpIHsKKwkJaWYgKGJ1ZnN6ID4gMCkgeworCQkJYnVmW2NudF0uZGF0YSA9ICBidWZbMF0uZGF0YSArIChjbnQgKiBidWZzeik7CisJCQlidWZbY250XS5waHlzID0gIGJ1ZlswXS5waHlzICsgKGNudCAqIGJ1ZnN6KTsKKwkJCWlmICghYnVmW2NudF0uZGF0YSkgeworCQkJCXByX2VycigiJXM6IEJ1ZiBhbGxvYyBmYWlsZWRcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlidWZbY250XS51c2VkID0gZGlyIF4gMTsKKwkJCWJ1ZltjbnRdLnNpemUgPSBidWZzejsKKwkJCWJ1ZltjbnRdLmFjdHVhbF9zaXplID0gYnVmc3o7CisJCQlwcl9kZWJ1ZygiJXM6ICBkYXRhWyVwS11waHlzWyVwS11bJXBLXVxuIiwgX19mdW5jX18sCisJCQkJICAgYnVmW2NudF0uZGF0YSwKKwkJCQkgICAmYnVmW2NudF0ucGh5cywKKwkJCQkgICAmYnVmW2NudF0ucGh5cyk7CisJCX0KKwkJY250Kys7CisJfQorCWFjLT5wb3J0W2Rpcl0ubWF4X2J1Zl9jbnQgPSBjbnQ7CisJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCXJldHVybiAwOworZmFpbDoKKwlwcl9lcnIoIiVzOiBqdW1wIGZhaWxcbiIsIF9fZnVuY19fKTsKKwlxNmFmZV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhkaXIsIGFjKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFmZV9tZW1vcnlfbWFwKHBoeXNfYWRkcl90IGRtYV9hZGRyX3AsIHUzMiBkbWFfYnVmX3N6LAorCQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKKwlhYy0+bWVtX21hcF9oYW5kbGUgPSAwOworCXJldCA9IGFmZV9jbWRfbWVtb3J5X21hcChkbWFfYWRkcl9wLCBkbWFfYnVmX3N6KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBhZmVfY21kX21lbW9yeV9tYXAgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwlhYy0+bWVtX21hcF9oYW5kbGUgPSB0aGlzX2FmZS5tbWFwX2hhbmRsZTsKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX2NtZF9tZW1vcnlfbWFwKHBoeXNfYWRkcl90IGRtYV9hZGRyX3AsIHUzMiBkbWFfYnVmX3N6KQoreworCWludCByZXQgPSAwOworCWludCBjbWRfc2l6ZSA9IDA7CisJdm9pZCAgICAqcGF5bG9hZCA9IE5VTEw7CisJdm9pZCAgICAqbW1hcF9yZWdpb25fY21kID0gTlVMTDsKKwlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKm1yZWdpb24gPSBOVUxMOworCXN0cnVjdCAgYWZlX3NlcnZpY2Vfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqbXJlZ2lvbl9wbCA9IE5VTEw7CisJaW50IGluZGV4ID0gMDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAorCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOworCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKKwl9CisJaWYgKGRtYV9idWZfc3ogJSBTWl80SyAhPSAwKSB7CisJCS8qCisJCSAqIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IG1zbV9hdWRpb19pb25fYWxsb2MgaXMgYWx3YXlzIDRrQgorCQkgKiBhbGlnbmVkLCBBRFNQIGV4cGVjdHMgdGhlIHNpemUgdG8gYmUgNGtCIGFsaWduZWQgYXMgd2VsbAorCQkgKiBzbyByZS1hZGp1c3RzIHRoZSAgYnVmZmVyIHNpemUgYmVmb3JlIHBhc3NpbmcgdG8gQURTUC4KKwkJICovCisJCWRtYV9idWZfc3ogPSBQQUdFX0FMSUdOKGRtYV9idWZfc3opOworCX0KKworCWNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykKKwkJKyBzaXplb2Yoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQpOworCisJbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtbWFwX3JlZ2lvbl9jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbXJlZ2lvbiA9IChzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKikKKwkJCQkJCQltbWFwX3JlZ2lvbl9jbWQ7CisJbXJlZ2lvbi0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCW1yZWdpb24tPmhkci5wa3Rfc2l6ZSA9IGNtZF9zaXplOworCW1yZWdpb24tPmhkci5zcmNfcG9ydCA9IDA7CisJbXJlZ2lvbi0+aGRyLmRlc3RfcG9ydCA9IDA7CisJbXJlZ2lvbi0+aGRyLnRva2VuID0gMDsKKwltcmVnaW9uLT5oZHIub3Bjb2RlID0gQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM7CisJbXJlZ2lvbi0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7CisJbXJlZ2lvbi0+bnVtX3JlZ2lvbnMgPSAxOworCW1yZWdpb24tPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCS8qIFRvZG8gKi8KKwlpbmRleCA9IG1yZWdpb24tPmhkci50b2tlbiA9IElEWF9SU1ZEXzI7CisKKwlwYXlsb2FkID0gKCh1OCAqKSBtbWFwX3JlZ2lvbl9jbWQgKworCQkgICBzaXplb2Yoc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSk7CisKKwltcmVnaW9uX3BsID0gKHN0cnVjdCBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICopcGF5bG9hZDsKKworCW1yZWdpb25fcGwtPnNobV9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHJfcCk7CisJbXJlZ2lvbl9wbC0+c2htX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoZG1hX2FkZHJfcCk7CisJbXJlZ2lvbl9wbC0+bWVtX3NpemVfYnl0ZXMgPSBkbWFfYnVmX3N6OworCisJcHJfZGVidWcoIiVzOiBkbWFfYWRkcl9wIDB4JXBLICwgc2l6ZSAlZFxuIiwgX19mdW5jX18sCisJCQkJCSZkbWFfYWRkcl9wLCBkbWFfYnVmX3N6KTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwl0aGlzX2FmZS5tbWFwX2hhbmRsZSA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopIG1tYXBfcmVnaW9uX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQUZFIG1lbW9yeSBtYXAgY21kIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKKwkJCQkgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOworCXJldHVybiAwOworZmFpbF9jbWQ6CisJa2ZyZWUobW1hcF9yZWdpb25fY21kKTsKKwlwcl9lcnIoIiVzOiBmYWlsX2NtZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfY21kX21lbW9yeV9tYXBfbm93YWl0KGludCBwb3J0X2lkLCBwaHlzX2FkZHJfdCBkbWFfYWRkcl9wLAorCQl1MzIgZG1hX2J1Zl9zeikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY21kX3NpemUgPSAwOworCXZvaWQgICAgKnBheWxvYWQgPSBOVUxMOworCXZvaWQgICAgKm1tYXBfcmVnaW9uX2NtZCA9IE5VTEw7CisJc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICptcmVnaW9uID0gTlVMTDsKKwlzdHJ1Y3QgIGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKm1yZWdpb25fcGwgPSBOVUxMOworCWludCBpbmRleCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJdGhpc19hZmUuYXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkFGRSIsIGFmZV9jYWxsYmFjaywKKwkJCQkJMHhGRkZGRkZGRiwgJnRoaXNfYWZlKTsKKwkJcHJfZGVidWcoIiVzOiBSZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKKwkJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PREVWOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlydGFjX3NldF9hZmVfaGFuZGxlKHRoaXNfYWZlLmFwcik7CisJfQorCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWQiLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykKKwkJKyBzaXplb2Yoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQpOworCisJbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtbWFwX3JlZ2lvbl9jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbXJlZ2lvbiA9IChzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKikKKwkJCQkJCW1tYXBfcmVnaW9uX2NtZDsKKwltcmVnaW9uLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJbXJlZ2lvbi0+aGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOworCW1yZWdpb24tPmhkci5zcmNfcG9ydCA9IDA7CisJbXJlZ2lvbi0+aGRyLmRlc3RfcG9ydCA9IDA7CisJbXJlZ2lvbi0+aGRyLnRva2VuID0gMDsKKwltcmVnaW9uLT5oZHIub3Bjb2RlID0gQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM7CisJbXJlZ2lvbi0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7CisJbXJlZ2lvbi0+bnVtX3JlZ2lvbnMgPSAxOworCW1yZWdpb24tPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCisJcGF5bG9hZCA9ICgodTggKikgbW1hcF9yZWdpb25fY21kICsKKwkJc2l6ZW9mKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOworCW1yZWdpb25fcGwgPSAoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOworCisJbXJlZ2lvbl9wbC0+c2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKKwltcmVnaW9uX3BsLT5zaG1fYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKKwltcmVnaW9uX3BsLT5tZW1fc2l6ZV9ieXRlcyA9IGRtYV9idWZfc3o7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KG1tYXBfcmVnaW9uX2NtZCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogQUZFIG1lbW9yeSBtYXAgY21kIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCWtmcmVlKG1tYXBfcmVnaW9uX2NtZCk7CisJcmV0dXJuIHJldDsKK30KK2ludCBxNmFmZV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyh1bnNpZ25lZCBpbnQgZGlyLAorCQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBhZmVfYXVkaW9fcG9ydF9kYXRhICpwb3J0OworCWludCBjbnQgPSAwOworCisJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07CisJaWYgKCFwb3J0LT5idWYpIHsKKwkJcHJfZXJyKCIlczogYnVmIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJY250ID0gcG9ydC0+bWF4X2J1Zl9jbnQgLSAxOworCisJaWYgKHBvcnQtPmJ1ZlswXS5kYXRhKSB7CisJCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS10gLCBjbGllbnRbJXBLXSBoYW5kbGVbJXBLXVxuIiwKKwkJCV9fZnVuY19fLAorCQkJcG9ydC0+YnVmWzBdLmRhdGEsCisJCQkmcG9ydC0+YnVmWzBdLnBoeXMsCisJCQkmcG9ydC0+YnVmWzBdLnBoeXMsCisJCQlwb3J0LT5idWZbMF0uY2xpZW50LAorCQkJcG9ydC0+YnVmWzBdLmhhbmRsZSk7CisJCW1zbV9hdWRpb19pb25fZnJlZShwb3J0LT5idWZbMF0uY2xpZW50LCBwb3J0LT5idWZbMF0uaGFuZGxlKTsKKwkJcG9ydC0+YnVmWzBdLmNsaWVudCA9IE5VTEw7CisJCXBvcnQtPmJ1ZlswXS5oYW5kbGUgPSBOVUxMOworCX0KKworCXdoaWxlIChjbnQgPj0gMCkgeworCQlwb3J0LT5idWZbY250XS5kYXRhID0gTlVMTDsKKwkJcG9ydC0+YnVmW2NudF0ucGh5cyA9IDA7CisJCWNudC0tOworCX0KKwlwb3J0LT5tYXhfYnVmX2NudCA9IDA7CisJa2ZyZWUocG9ydC0+YnVmKTsKKwlwb3J0LT5idWYgPSBOVUxMOworCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBxNmFmZV9hdWRpb19jbGllbnRfZnJlZShzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IGxvb3BjbnQ7CisJc3RydWN0IGFmZV9hdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJZm9yIChsb29wY250ID0gMDsgbG9vcGNudCA8PSBPVVQ7IGxvb3BjbnQrKykgeworCQlwb3J0ID0gJmFjLT5wb3J0W2xvb3BjbnRdOworCQlpZiAoIXBvcnQtPmJ1ZikKKwkJCWNvbnRpbnVlOworCQlwcl9kZWJ1ZygiJXM6IGxvb3BjbnQgPSAlZFxuIiwgX19mdW5jX18sIGxvb3BjbnQpOworCQlxNmFmZV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhsb29wY250LCBhYyk7CisJfQorCWtmcmVlKGFjKTsKK30KKworaW50IGFmZV9jbWRfbWVtb3J5X3VubWFwKHUzMiBtZW1fbWFwX2hhbmRsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fdW5tYXBfcmVnaW9ucyBtcmVnaW9uOworCWludCBpbmRleCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGhhbmRsZSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtX21hcF9oYW5kbGUpOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCisJCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7CisJCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOworCX0KKworCW1yZWdpb24uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCW1yZWdpb24uaGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOworCW1yZWdpb24uaGRyLnNyY19wb3J0ID0gMDsKKwltcmVnaW9uLmhkci5kZXN0X3BvcnQgPSAwOworCW1yZWdpb24uaGRyLnRva2VuID0gMDsKKwltcmVnaW9uLmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOworCW1yZWdpb24ubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKKworCS8qIFRvZG8gKi8KKwlpbmRleCA9IG1yZWdpb24uaGRyLnRva2VuID0gSURYX1JTVkRfMjsKKworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmbXJlZ2lvbiwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgbWVtb3J5IHVubWFwIGNtZCBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfY21kX21lbW9yeV91bm1hcF9ub3dhaXQodTMyIG1lbV9tYXBfaGFuZGxlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIG1yZWdpb247CisKKwlwcl9kZWJ1ZygiJXM6IGhhbmRsZSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtX21hcF9oYW5kbGUpOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCisJCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7CisJCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOworCX0KKworCW1yZWdpb24uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCW1yZWdpb24uaGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOworCW1yZWdpb24uaGRyLnNyY19wb3J0ID0gMDsKKwltcmVnaW9uLmhkci5kZXN0X3BvcnQgPSAwOworCW1yZWdpb24uaGRyLnRva2VuID0gMDsKKwltcmVnaW9uLmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOworCW1yZWdpb24ubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJm1yZWdpb24sIE5VTEwpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IEFGRSBtZW1vcnkgdW5tYXAgY21kIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfcmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCwKKwkJdm9pZCAoKmNiKSh1aW50MzJfdCBvcGNvZGUsCisJCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdiksCisJCXZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3JlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHJ0cHJveHk7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKworCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAorCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOworCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKKwl9CisJaWYgKChwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfUlgpIHx8CisJCShwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDFfVFgpKSB7CisJCXBvcnRfaWQgPSBWSVJUVUFMX0lEX1RPX1BPUlRJRChwb3J0X2lkKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiB3cm9uZyBwb3J0IGlkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfUE9SVF8wMDFfVFgpIHsKKwkJdGhpc19hZmUudHhfY2IgPSBjYjsKKwkJdGhpc19hZmUudHhfcHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCX0gZWxzZSBpZiAocG9ydF9pZCA9PSBSVF9QUk9YWV9QT1JUXzAwMV9SWCkgeworCQl0aGlzX2FmZS5yeF9jYiA9IGNiOworCQl0aGlzX2FmZS5yeF9wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CisJfQorCisJcnRwcm94eS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJcnRwcm94eS5oZHIucGt0X3NpemUgPSBzaXplb2YocnRwcm94eSk7CisJcnRwcm94eS5oZHIuc3JjX3BvcnQgPSAxOworCXJ0cHJveHkuaGRyLmRlc3RfcG9ydCA9IDE7CisJcnRwcm94eS5oZHIub3Bjb2RlID0gQUZFX1NFUlZJQ0VfQ01EX1JFR0lTVEVSX1JUX1BPUlRfRFJJVkVSOworCXJ0cHJveHkucG9ydF9pZCA9IHBvcnRfaWQ7CisJcnRwcm94eS5yZXNlcnZlZCA9IDA7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZydHByb3h5LCBOVUxMKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgIHJlZy4gcnRwcm94eV9ldmVudCBmYWlsZWQgJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3VucmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3VucmVnaXN0ZXJfcnRfcG9ydF9kcml2ZXIgcnRwcm94eTsKKwlpbnQgaW5kZXggPSAwOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCisJCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7CisJCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOworCX0KKworCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAorCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYKSkgeworCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogd3JvbmcgcG9ydCBpZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWQiLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnRwcm94eS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJcnRwcm94eS5oZHIucGt0X3NpemUgPSBzaXplb2YocnRwcm94eSk7CisJcnRwcm94eS5oZHIuc3JjX3BvcnQgPSAwOworCXJ0cHJveHkuaGRyLmRlc3RfcG9ydCA9IDA7CisJcnRwcm94eS5oZHIudG9rZW4gPSAwOworCXJ0cHJveHkuaGRyLm9wY29kZSA9IEFGRV9TRVJWSUNFX0NNRF9VTlJFR0lTVEVSX1JUX1BPUlRfRFJJVkVSOworCXJ0cHJveHkucG9ydF9pZCA9IHBvcnRfaWQ7CisJcnRwcm94eS5yZXNlcnZlZCA9IDA7CisKKwlydHByb3h5Lmhkci50b2tlbiA9IGluZGV4OworCisJaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfUE9SVF8wMDFfVFgpIHsKKwkJdGhpc19hZmUudHhfY2IgPSBOVUxMOworCQl0aGlzX2FmZS50eF9wcml2YXRlX2RhdGEgPSBOVUxMOworCX0gZWxzZSBpZiAocG9ydF9pZCA9PSBSVF9QUk9YWV9QT1JUXzAwMV9SWCkgeworCQl0aGlzX2FmZS5yeF9jYiA9IE5VTEw7CisJCXRoaXNfYWZlLnJ4X3ByaXZhdGVfZGF0YSA9IE5VTEw7CisJfQorCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmcnRwcm94eSwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIFVucmVnLiBydHByb3h5X2V2ZW50IGZhaWxlZCAlZFxuIiwKKwkJCSAgIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfcnRfcHJveHlfcG9ydF93cml0ZShwaHlzX2FkZHJfdCBidWZfYWRkcl9wLAorCQl1MzIgbWVtX21hcF9oYW5kbGUsIGludCBieXRlcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWZlX3BvcnRfZGF0YV9jbWRfcnRfcHJveHlfcG9ydF93cml0ZV92MiBhZmVjbWRfd3I7CisKKwlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogcmVnaXN0ZXIgdG8gQUZFIGlzIG5vdCBkb25lXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9ERVY7CisJCXJldHVybiByZXQ7CisJfQorCXByX2RlYnVnKCIlczogYnVmX2FkZHJfcCA9IDB4JXBLIGJ5dGVzID0gJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJJmJ1Zl9hZGRyX3AsIGJ5dGVzKTsKKworCWFmZWNtZF93ci5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYWZlY21kX3dyLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihhZmVjbWRfd3IpOworCWFmZWNtZF93ci5oZHIuc3JjX3BvcnQgPSAwOworCWFmZWNtZF93ci5oZHIuZGVzdF9wb3J0ID0gMDsKKwlhZmVjbWRfd3IuaGRyLnRva2VuID0gMDsKKwlhZmVjbWRfd3IuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfV1JJVEVfVjI7CisJYWZlY21kX3dyLnBvcnRfaWQgPSBSVF9QUk9YWV9QT1JUXzAwMV9UWDsKKwlhZmVjbWRfd3IuYnVmZmVyX2FkZHJlc3NfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcl9wKTsKKwlhZmVjbWRfd3IuYnVmZmVyX2FkZHJlc3NfbXN3ID0KKwkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyX3ApOworCWFmZWNtZF93ci5tZW1fbWFwX2hhbmRsZSA9IG1lbV9tYXBfaGFuZGxlOworCWFmZWNtZF93ci5hdmFpbGFibGVfYnl0ZXMgPSBieXRlczsKKwlhZmVjbWRfd3IucmVzZXJ2ZWQgPSAwOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmYWZlY21kX3dyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgcnRwcm94eSB3cml0ZSB0byBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAorCQkJICAgX19mdW5jX18sIGFmZWNtZF93ci5wb3J0X2lkLCByZXQpOworCXJldHVybiByZXQ7CisKK30KKworaW50IGFmZV9ydF9wcm94eV9wb3J0X3JlYWQocGh5c19hZGRyX3QgYnVmX2FkZHJfcCwKKwkJdTMyIG1lbV9tYXBfaGFuZGxlLCBpbnQgYnl0ZXMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFmZV9wb3J0X2RhdGFfY21kX3J0X3Byb3h5X3BvcnRfcmVhZF92MiBhZmVjbWRfcmQ7CisKKwlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogcmVnaXN0ZXIgdG8gQUZFIGlzIG5vdCBkb25lXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9ERVY7CisJCXJldHVybiByZXQ7CisJfQorCXByX2RlYnVnKCIlczogYnVmX2FkZHJfcCA9IDB4JXBLIGJ5dGVzID0gJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJJmJ1Zl9hZGRyX3AsIGJ5dGVzKTsKKworCWFmZWNtZF9yZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJYWZlY21kX3JkLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihhZmVjbWRfcmQpOworCWFmZWNtZF9yZC5oZHIuc3JjX3BvcnQgPSAwOworCWFmZWNtZF9yZC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlhZmVjbWRfcmQuaGRyLnRva2VuID0gMDsKKwlhZmVjbWRfcmQuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfUkVBRF9WMjsKKwlhZmVjbWRfcmQucG9ydF9pZCA9IFJUX1BST1hZX1BPUlRfMDAxX1JYOworCWFmZWNtZF9yZC5idWZmZXJfYWRkcmVzc19sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGRyX3ApOworCWFmZWNtZF9yZC5idWZmZXJfYWRkcmVzc19tc3cgPQorCQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyX3ApOworCWFmZWNtZF9yZC5hdmFpbGFibGVfYnl0ZXMgPSBieXRlczsKKwlhZmVjbWRfcmQubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKKworCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmFmZWNtZF9yZCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogQUZFIHJ0cHJveHkgcmVhZCAgY21kIHRvIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgYWZlY21kX3JkLnBvcnRfaWQsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYWZlbGI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19hZmVsYl9nYWluOworCitzdGF0aWMgaW50IGFmZV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcHJfaW5mbygiJXM6IGRlYnVnIGludGYgJXNcbiIsIF9fZnVuY19fLCAoY2hhciAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFmZV9nZXRfcGFyYW1ldGVycyhjaGFyICpidWYsIGxvbmcgaW50ICpwYXJhbTEsIGludCBudW1fb2ZfcGFyKQoreworCWNoYXIgKnRva2VuOworCWludCBiYXNlLCBjbnQ7CisKKwl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBudW1fb2ZfcGFyOyBjbnQrKykgeworCQlpZiAodG9rZW4gIT0gTlVMTCkgeworCQkJaWYgKCh0b2tlblsxXSA9PSAneCcpIHx8ICh0b2tlblsxXSA9PSAnWCcpKQorCQkJCWJhc2UgPSAxNjsKKwkJCWVsc2UKKwkJCQliYXNlID0gMTA7CisKKwkJCWlmIChrc3RydG91bCh0b2tlbiwgYmFzZSwgJnBhcmFtMVtjbnRdKSAhPSAwKSB7CisJCQkJcHJfZXJyKCIlczoga3N0cnRvdWwgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCXRva2VuID0gc3Ryc2VwKCZidWYsICIgIik7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiB0b2tlbiBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNkZWZpbmUgQUZFX0xPT1BCQUNLX09OICgxKQorI2RlZmluZSBBRkVfTE9PUEJBQ0tfT0ZGICgwKQorc3RhdGljIHNzaXplX3QgYWZlX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAorCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqbGJfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIgbGJ1ZlszMl07CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgcGFyYW1bNV07CisKKwlpZiAoY250ID4gc2l6ZW9mKGxidWYpIC0gMSkgeworCQlwcl9lcnIoIiVzOiBjbnQgJXpkIHNpemUgJXpkXG4iLCBfX2Z1bmNfXywgY250LCBzaXplb2YobGJ1ZiktMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsYnVmW2NudF0gPSAnXDAnOworCisJaWYgKCFzdHJjbXAobGJfc3RyLCAiYWZlX2xvb3BiYWNrIikpIHsKKwkJcmMgPSBhZmVfZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDMpOworCQlpZiAoIXJjKSB7CisJCQlwcl9pbmZvKCIlczogJWx1ICVsdSAlbHVcbiIsIGxiX3N0ciwgcGFyYW1bMF0sIHBhcmFtWzFdLAorCQkJCXBhcmFtWzJdKTsKKworCQkJaWYgKChwYXJhbVswXSAhPSBBRkVfTE9PUEJBQ0tfT04pICYmIChwYXJhbVswXSAhPQorCQkJCUFGRV9MT09QQkFDS19PRkYpKSB7CisJCQkJcHJfZXJyKCIlczogRXJyb3IsIHBhcmFtZXRlciAwIGluY29ycmVjdFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGFmZV9lcnJvcjsKKwkJCX0KKwkJCWlmICgocTZhdWRpb192YWxpZGF0ZV9wb3J0KHBhcmFtWzFdKSA8IDApIHx8CisJCQkgICAgKHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwYXJhbVsyXSkpIDwgMCkgeworCQkJCXByX2VycigiJXM6IEVycm9yLCBpbnZhbGlkIGFmZSBwb3J0XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQl9CisJCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJCQlwcl9lcnIoIiVzOiBFcnJvciwgQUZFIG5vdCBvcGVuZWRcbiIsIF9fZnVuY19fKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXJjID0gYWZlX2xvb3BiYWNrKHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogRXJyb3IsIGludmFsaWQgcGFyYW1ldGVyc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQl9CisKKwl9IGVsc2UgaWYgKCFzdHJjbXAobGJfc3RyLCAiYWZlX2xvb3BiYWNrX2dhaW4iKSkgeworCQlyYyA9IGFmZV9nZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMik7CisJCWlmICghcmMpIHsKKwkJCXByX2luZm8oIiVzOiAlcyAlbHUgJWx1XG4iLAorCQkJCV9fZnVuY19fLCBsYl9zdHIsIHBhcmFtWzBdLCBwYXJhbVsxXSk7CisKKwkJCXJjID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBhcmFtWzBdKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBFcnJvciwgaW52YWxpZCBhZmUgcG9ydCAlZCAlbHVcbiIsCisJCQkJCV9fZnVuY19fLCByYywgcGFyYW1bMF0pOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGFmZV9lcnJvcjsKKwkJCX0KKworCQkJaWYgKHBhcmFtWzFdID4gMTAwKSB7CisJCQkJcHJfZXJyKCIlczogRXJyb3IsIHZvbHVtZSBzaG91bGQgYmUgMCB0byAxMDAgcGVyY2VudGFnZSBwYXJhbSA9ICVsdVxuIiwKKwkJCQkJX19mdW5jX18sIHBhcmFtWzFdKTsKKwkJCQlyYyA9IC1FSU5WQUw7CisJCQkJZ290byBhZmVfZXJyb3I7CisJCQl9CisKKwkJCXBhcmFtWzFdID0gKFE2QUZFX01BWF9WT0xVTUUgKiBwYXJhbVsxXSkgLyAxMDA7CisKKwkJCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQkJCXByX2VycigiJXM6IEVycm9yLCBBRkUgbm90IG9wZW5lZFxuIiwgX19mdW5jX18pOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSBhZmVfbG9vcGJhY2tfZ2FpbihwYXJhbVswXSwgcGFyYW1bMV0pOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogRXJyb3IsIGludmFsaWQgcGFyYW1ldGVyc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQl9CisJfQorCithZmVfZXJyb3I6CisJaWYgKHJjID09IDApCisJCXJjID0gY250OworCWVsc2UKKwkJcHJfZXJyKCIlczogcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZlX2RlYnVnX2ZvcHMgPSB7CisJLm9wZW4gPSBhZmVfZGVidWdfb3BlbiwKKwkud3JpdGUgPSBhZmVfZGVidWdfd3JpdGUKK307CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCit7CisJZGVidWdmc19hZmVsYiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFmZV9sb29wYmFjayIsCisJMDY2NCwgTlVMTCwgKHZvaWQgKikgImFmZV9sb29wYmFjayIsCisJJmFmZV9kZWJ1Z19mb3BzKTsKKworCWRlYnVnZnNfYWZlbGJfZ2FpbiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFmZV9sb29wYmFja19nYWluIiwKKwkwNjY0LCBOVUxMLCAodm9pZCAqKSAiYWZlX2xvb3BiYWNrX2dhaW4iLAorCSZhZmVfZGVidWdfZm9wcyk7Cit9CitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfZXhpdCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlKGRlYnVnZnNfYWZlbGIpOworCWRlYnVnZnNfcmVtb3ZlKGRlYnVnZnNfYWZlbGJfZ2Fpbik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX2luaXQodm9pZCkKK3sKK30KK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19leGl0KHZvaWQpCit7Cit9CisjZW5kaWYKKwordm9pZCBhZmVfc2V0X2R0bWZfZ2VuX3J4X3BvcnRpZCh1MTYgcG9ydF9pZCwgaW50IHNldCkKK3sKKwlpZiAoc2V0KQorCQl0aGlzX2FmZS5kdG1mX2dlbl9yeF9wb3J0aWQgPSBwb3J0X2lkOworCWVsc2UgaWYgKHRoaXNfYWZlLmR0bWZfZ2VuX3J4X3BvcnRpZCA9PSBwb3J0X2lkKQorCQl0aGlzX2FmZS5kdG1mX2dlbl9yeF9wb3J0aWQgPSAtMTsKK30KKworaW50IGFmZV9kdG1mX2dlbmVyYXRlX3J4KGludDY0X3QgZHVyYXRpb25faW5fbXMsCisJCQkgdWludDE2X3QgaGlnaF9mcmVxLAorCQkJIHVpbnQxNl90IGxvd19mcmVxLCB1aW50MTZfdCBnYWluKQoreworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisJc3RydWN0IGFmZV9kdG1mX2dlbmVyYXRpb25fY29tbWFuZCBjbWRfZHRtZjsKKworCXByX2RlYnVnKCIlczogRFRNRiBBRkUgR2VuXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoYWZlX3ZhbGlkYXRlX3BvcnQodGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkKSA8IDApIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIDogSW52YWxpZCBQb3J0IGlkID0gMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB0aGlzX2FmZS5kdG1mX2dlbl9yeF9wb3J0aWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgeworCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAorCQkJCQkgICAgMHhGRkZGRkZGRiwgJnRoaXNfYWZlKTsKKwkJcHJfZGVidWcoIiVzOiBSZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKKwkJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PREVWOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlydGFjX3NldF9hZmVfaGFuZGxlKHRoaXNfYWZlLmFwcik7CisJfQorCisJcHJfZGVidWcoIiVzOiBkdXI9JWxsZDogaGZyZXE9JWQgbGZyZXE9JWQgZ2Fpbj0lZCBwb3J0aWQ9MHgleFxuIiwKKwkJX19mdW5jX18sCisJCWR1cmF0aW9uX2luX21zLCBoaWdoX2ZyZXEsIGxvd19mcmVxLCBnYWluLAorCQl0aGlzX2FmZS5kdG1mX2dlbl9yeF9wb3J0aWQpOworCisJY21kX2R0bWYuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNtZF9kdG1mLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjbWRfZHRtZik7CisJY21kX2R0bWYuaGRyLnNyY19wb3J0ID0gMDsKKwljbWRfZHRtZi5oZHIuZGVzdF9wb3J0ID0gMDsKKwljbWRfZHRtZi5oZHIudG9rZW4gPSAwOworCWNtZF9kdG1mLmhkci5vcGNvZGUgPSBBRkVfUE9SVFNfQ01EX0RUTUZfQ1RMOworCWNtZF9kdG1mLmR1cmF0aW9uX2luX21zID0gZHVyYXRpb25faW5fbXM7CisJY21kX2R0bWYuaGlnaF9mcmVxID0gaGlnaF9mcmVxOworCWNtZF9kdG1mLmxvd19mcmVxID0gbG93X2ZyZXE7CisJY21kX2R0bWYuZ2FpbiA9IGdhaW47CisJY21kX2R0bWYubnVtX3BvcnRzID0gMTsKKwljbWRfZHRtZi5wb3J0X2lkcyA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQodGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkKTsKKworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY21kX2R0bWYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEFGRSBEVE1GIGZhaWxlZCBmb3IgbnVtX3BvcnRzOiVkIGlkczoweCV4XG4iLAorCQkgICAgICAgX19mdW5jX18sIGNtZF9kdG1mLm51bV9wb3J0cywgY21kX2R0bWYucG9ydF9pZHMpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgodGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkKTsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gQUZFX01BWF9QT1JUUykgeworCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCisJCQkJX19mdW5jX18sIGluZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CisKK2ZhaWxfY21kOgorCXByX2VycigiJXM6IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9zaWRldG9uZSh1MTYgdHhfcG9ydF9pZCwgdTE2IHJ4X3BvcnRfaWQsIHUxNiBlbmFibGUsIHVpbnQxNl90IGdhaW4pCit7CisJc3RydWN0IGFmZV9sb29wYmFja19jZmdfdjEgY21kX3NpZGV0b25lOworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlwcl9pbmZvKCIlczogdHhfcG9ydF9pZDogMHgleCByeF9wb3J0X2lkOiAweCV4IGVuYWJsZTolZCBnYWluOiVkXG4iLAorCQkJX19mdW5jX18sIHR4X3BvcnRfaWQsIHJ4X3BvcnRfaWQsIGVuYWJsZSwgZ2Fpbik7CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHJ4X3BvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHJ4X3BvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4ICVkIiwgX19mdW5jX18sIHJ4X3BvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNtZF9zaWRldG9uZS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY21kX3NpZGV0b25lLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjbWRfc2lkZXRvbmUpOworCWNtZF9zaWRldG9uZS5oZHIuc3JjX3BvcnQgPSAwOworCWNtZF9zaWRldG9uZS5oZHIuZGVzdF9wb3J0ID0gMDsKKwljbWRfc2lkZXRvbmUuaGRyLnRva2VuID0gMDsKKwljbWRfc2lkZXRvbmUuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJLyogc2hvdWxkIGl0IGJlIHJ4IG9yIHR4IHBvcnQgaWQgPz8gLCBiaGFyYXRoKi8KKwljbWRfc2lkZXRvbmUucGFyYW0ucG9ydF9pZCA9IHR4X3BvcnRfaWQ7CisJLyogc2l6ZSBvZiBkYXRhIHBhcmFtICYgcGF5bG9hZCAqLworCWNtZF9zaWRldG9uZS5wYXJhbS5wYXlsb2FkX3NpemUgPSAoc2l6ZW9mKGNtZF9zaWRldG9uZSkgLQorCQkJc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCisJCQlzaXplb2Yoc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIpKTsKKwljbWRfc2lkZXRvbmUucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY21kX3NpZGV0b25lLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNtZF9zaWRldG9uZS5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY21kX3NpZGV0b25lLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfTE9PUEJBQ0s7CisJY21kX3NpZGV0b25lLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0NPTkZJRzsKKwkvKiBzaXplIG9mIGFjdHVhbCBwYXlsb2FkIG9ubHkgKi8KKwljbWRfc2lkZXRvbmUucGRhdGEucGFyYW1fc2l6ZSA9ICBjbWRfc2lkZXRvbmUucGFyYW0ucGF5bG9hZF9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpOworCisJY21kX3NpZGV0b25lLmxvb3BiYWNrX2NmZ19taW5vcl92ZXJzaW9uID0KKwkJCQkJQUZFX0FQSV9WRVJTSU9OX0xPT1BCQUNLX0NPTkZJRzsKKwljbWRfc2lkZXRvbmUuZHN0X3BvcnRfaWQgPSByeF9wb3J0X2lkOworCWNtZF9zaWRldG9uZS5yb3V0aW5nX21vZGUgPSBMQl9NT0RFX1NJREVUT05FOworCWNtZF9zaWRldG9uZS5lbmFibGUgPSBlbmFibGU7CisKKwlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjbWRfc2lkZXRvbmUsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogc2lkZXRvbmUgZmFpbGVkIHR4X3BvcnQ6MHgleCByeF9wb3J0OjB4JXggcmV0JWRcbiIsCisJCV9fZnVuY19fLCB0eF9wb3J0X2lkLCByeF9wb3J0X2lkLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfdmFsaWRhdGVfcG9ydCh1MTYgcG9ydF9pZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBQUklNQVJZX0kyU19SWDoKKwljYXNlIFBSSU1BUllfSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1RYOgorCWNhc2UgTUkyU19SWDoKKwljYXNlIE1JMlNfVFg6CisJY2FzZSBIRE1JX1JYOgorCWNhc2UgRElTUExBWV9QT1JUX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU1BESUZfUlg6CisJY2FzZSBSU1ZEXzI6CisJY2FzZSBSU1ZEXzM6CisJY2FzZSBESUdJX01JQ19UWDoKKwljYXNlIFZPSUNFX1JFQ09SRF9SWDoKKwljYXNlIFZPSUNFX1JFQ09SRF9UWDoKKwljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOgorCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOgorCWNhc2UgU0xJTUJVU18wX1JYOgorCWNhc2UgU0xJTUJVU18wX1RYOgorCWNhc2UgU0xJTUJVU18xX1JYOgorCWNhc2UgU0xJTUJVU18xX1RYOgorCWNhc2UgU0xJTUJVU18yX1JYOgorCWNhc2UgU0xJTUJVU18yX1RYOgorCWNhc2UgU0xJTUJVU18zX1JYOgorCWNhc2UgSU5UX0JUX1NDT19SWDoKKwljYXNlIElOVF9CVF9TQ09fVFg6CisJY2FzZSBJTlRfQlRfQTJEUF9SWDoKKwljYXNlIElOVF9GTV9SWDoKKwljYXNlIElOVF9GTV9UWDoKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOgorCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6CisJY2FzZSBTTElNQlVTXzRfUlg6CisJY2FzZSBTTElNQlVTXzRfVFg6CisJY2FzZSBTTElNQlVTXzVfUlg6CisJY2FzZSBTTElNQlVTXzZfUlg6CisJY2FzZSBTTElNQlVTXzZfVFg6CisJY2FzZSBTTElNQlVTXzdfUlg6CisJY2FzZSBTTElNQlVTXzdfVFg6CisJY2FzZSBTTElNQlVTXzhfUlg6CisJY2FzZSBTTElNQlVTXzhfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKKwl7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGRlZmF1bHQgcmV0IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQodTE2IHBvcnRfaWQpCit7CisJaW50IHJldDsKKworCS8qCisJICogaWYgcG9ydF9pZCBpcyB2aXJ0dWFsLCBjb252ZXJ0IHRvIHBoeXNpY2FsLi4KKwkgKiBpZiBwb3J0X2lkIGlzIGFscmVhZHkgcGh5c2ljYWwsIHJldHVybiBwaHlzaWNhbAorCSAqLworCWlmIChhZmVfdmFsaWRhdGVfcG9ydChwb3J0X2lkKSA8IDApIHsKKwkJaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCB8fAorCQkgICAgcG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYIHx8CisJCSAgICBwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfUlggfHwKKwkJICAgIHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9UWCkgeworCQkJcmV0ID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiB3cm9uZyBwb3J0IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHBvcnRfaWQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSBwb3J0X2lkOworCisJcmV0dXJuIHJldDsKK30KK2ludCBhZmVfcG9ydF9zdG9wX25vd2FpdChpbnQgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHN0b3A7CisJaW50IHJldCA9IDA7CisKKwlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUZFIGlzIGFscmVhZHkgY2xvc2VkXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwlwb3J0X2lkID0gcTZhdWRpb19jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOworCisJc3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJc3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RvcCk7CisJc3RvcC5oZHIuc3JjX3BvcnQgPSAwOworCXN0b3AuaGRyLmRlc3RfcG9ydCA9IDA7CisJc3RvcC5oZHIudG9rZW4gPSAwOworCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RPUDsKKwlzdG9wLnBvcnRfaWQgPSBwb3J0X2lkOworCXN0b3AucmVzZXJ2ZWQgPSAwOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmc3RvcCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogQUZFIGNsb3NlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKK2ZhaWxfY21kOgorCXJldHVybiByZXQ7CisKK30KKworaW50IGFmZV9jbG9zZShpbnQgcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHN0b3A7CisJZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGU7CisJaW50IHJldCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwl1aW50MTZfdCBwb3J0X2luZGV4OworCisJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFGRSBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOworCQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCkgfHwKKwkJICAgIChwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfVFgpKQorCQkJcGNtX2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSA9IDA7CisJCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAorCQkgICAgKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpCisJCQlwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPSAwOworCQlhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSA9IHRydWU7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKKwlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCkgfHwKKwkJCShwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfVFgpKSB7CisJCXByX2RlYnVnKCIlczogYmVmb3JlIGRlY3JlbWVudGluZyBwY21fYWZlX2luc3RhbmNlICVkXG4iLAorCQkJX19mdW5jX18sIHBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0pOworCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7CisJCXBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0tLTsKKwkJaWYgKCghKHBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPT0gMCAmJgorCQkJcHJveHlfYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdID09IDApKSB8fAorCQkJYWZlX2Nsb3NlX2RvbmVbcG9ydF9pZCAmIDB4MV0gPT0gdHJ1ZSkKKwkJCXJldHVybiAwOworCisJCWFmZV9jbG9zZV9kb25lW3BvcnRfaWQgJiAweDFdID0gdHJ1ZTsKKwl9CisKKwlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9SWCkgfHwKKwkJKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpIHsKKwkJcHJfZGVidWcoIiVzOiBiZWZvcmUgZGVjcmVtZW50aW5nIHByb3h5X2FmZV9pbnN0YW5jZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0pOworCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7CisJCXByb3h5X2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXS0tOworCQlpZiAoKCEocGNtX2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSA9PSAwICYmCisJCQlwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPT0gMCkpIHx8CisJCQlhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSA9PSB0cnVlKQorCQkJcmV0dXJuIDA7CisKKwkJYWZlX2Nsb3NlX2RvbmVbcG9ydF9pZCAmIDB4MV0gPSB0cnVlOworCX0KKworCXBvcnRfaWQgPSBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX3dhcm4oIiVzOiBOb3QgYSB2YWxpZCBwb3J0IGlkIDB4JXggcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hZF90eXBlID0gYWZlX3BvcnRfZ2V0X21hZF90eXBlKHBvcnRfaWQpOworCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4LCBtYWRfdHlwZSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsCisJCSBtYWRfdHlwZSk7CisJaWYgKG1hZF90eXBlICE9IE1BRF9IV19OT05FICYmIG1hZF90eXBlICE9IE1BRF9TV19BVURJTykgeworCQlwcl9kZWJ1ZygiJXM6IFR1cm4gb2ZmIE1BRFxuIiwgX19mdW5jX18pOworCQlyZXQgPSBhZmVfdHVybl9vbm9mZl9od19tYWQobWFkX3R5cGUsIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogYWZlX3R1cm5fb25vZmZfaHdfbWFkIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IE5vdCBhIE1BRCBwb3J0XG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKKwlpZiAoKHBvcnRfaW5kZXggPj0gMCkgJiYgKHBvcnRfaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgeworCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW3BvcnRfaW5kZXhdID0gMDsKKwkJdGhpc19hZmUudG9wb2xvZ3lbcG9ydF9pbmRleF0gPSAwOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHBvcnQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoKHBvcnRfaWQgPT0gdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydCkgJiYKKwkgICAgKHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSkpIHsKKwkJbWVtc2V0KCZ0aGlzX2FmZS5hYW5jX2luZm8sIDB4MDAsIHNpemVvZih0aGlzX2FmZS5hYW5jX2luZm8pKTsKKwkJcmV0ID0gYWZlX2FhbmNfbW9kX2VuYWJsZSh0aGlzX2FmZS5hcHIsIHBvcnRfaWQsIDApOworCQlpZiAocmV0KQorCQkJcHJfZXJyKCIlczogQUZFIG1vZCBkaXNhYmxlIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwkvKgorCSAqIGV2ZW4gaWYgcmFtcCBkb3duIGNvbmZpZ3VyYXRpb24gZmFpbGVkIGl0IGlzIG5vdCBzZXJpb3VzIGVub3VnaCB0bworCSAqIHdhcnJhbnQgYmFpbGFpbmcgb3V0LgorCSAqLworCWlmIChhZmVfc3BrX3JhbXBfZG5fY2ZnKHBvcnRfaWQpIDwgMCkKKwkJcHJfZXJyKCIlczogcmFtcCBkb3duIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlzdG9wLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlzdG9wLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihzdG9wKTsKKwlzdG9wLmhkci5zcmNfcG9ydCA9IDA7CisJc3RvcC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlzdG9wLmhkci50b2tlbiA9IGluZGV4OworCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RPUDsKKwlzdG9wLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCXN0b3AucmVzZXJ2ZWQgPSAwOworCisJcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmc3RvcCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBBRkUgY2xvc2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworZmFpbF9jbWQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9zZXRfZGlnaXRhbF9jb2RlY19jb3JlX2Nsb2NrKHUxNiBwb3J0X2lkLAorCQkJCXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnICpjZmcpCit7CisJc3RydWN0IGFmZV9scGFzc19kaWdpdGFsX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNmZykgeworCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOworCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKKwljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOworCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7CisKKwljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCS8qZGVmYXVsdCByeCBwb3J0IGlzIHRha2VuIHRvIGVuYWJsZSB0aGUgY29kZWMgZGlnaXRhbCBjbG9jayovCisJY2xrX2NmZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKKwkJCQkJCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljbGtfY2ZnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljbGtfY2ZnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljbGtfY2ZnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0lOVEVSTkFMX0RJR0lBVExfQ0RDX0NMS19DT05GSUc7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjbGtfY2ZnLmNsa19jZmcpOworCWNsa19jZmcuY2xrX2NmZyA9ICpjZmc7CisKKwlwcl9kZWJ1ZygiJXM6IE1pbm9yIHZlcnNpb24gPTB4JXggY2xrIHZhbCA9ICVkXG4iCisJCSAiY2xrIHJvb3QgPSAweCV4IHJlc3J2ID0gMHgleFxuIiwKKwkJIF9fZnVuY19fLCBjZmctPmkyc19jZmdfbWlub3JfdmVyc2lvbiwKKwkJIGNmZy0+Y2xrX3ZhbCwgY2ZnLT5jbGtfcm9vdCwgY2ZnLT5yZXNlcnZlZCk7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNsa19jZmcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCByZXQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKK2ZhaWxfY21kOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfc2V0X2xwYXNzX2Nsb2NrKHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX2Nsa19jZmcgKmNmZykKK3sKKwlzdHJ1Y3QgYWZlX2xwYXNzX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNmZykgeworCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZShwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZSBmYWlsICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisJY2xrX2NmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY2xrX2NmZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY2xrX2NmZyk7CisJY2xrX2NmZy5oZHIuc3JjX3BvcnQgPSAwOworCWNsa19jZmcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY2xrX2NmZy5oZHIudG9rZW4gPSBpbmRleDsKKworCWNsa19jZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY2xrX2NmZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKKwkJCQkJCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljbGtfY2ZnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljbGtfY2ZnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljbGtfY2ZnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0xQQUlGX0NMS19DT05GSUc7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjbGtfY2ZnLmNsa19jZmcpOworCWNsa19jZmcuY2xrX2NmZyA9ICpjZmc7CisKKwlwcl9kZWJ1ZygiJXM6IE1pbm9yIHZlcnNpb24gPTB4JXggY2xrIHZhbDEgPSAlZFxuIgorCQkgImNsayB2YWwyID0gJWQsIGNsayBzcmMgPSAweCV4XG4iCisJCSAiY2xrIHJvb3QgPSAweCV4IGNsayBtb2RlID0gMHgleCByZXNydiA9IDB4JXhcbiIKKwkJICJwb3J0IGlkID0gMHgleFxuIiwKKwkJIF9fZnVuY19fLCBjZmctPmkyc19jZmdfbWlub3JfdmVyc2lvbiwKKwkJIGNmZy0+Y2xrX3ZhbDEsIGNmZy0+Y2xrX3ZhbDIsIGNmZy0+Y2xrX3NyYywKKwkJIGNmZy0+Y2xrX3Jvb3QsIGNmZy0+Y2xrX3NldF9tb2RlLAorCQkgY2ZnLT5yZXNlcnZlZCwgcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKSk7CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNsa19jZmcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCByZXQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKK2ZhaWxfY21kOgorCW11dGV4X3VubG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3NldF9scGFzc19jbGtfY2ZnKGludCBpbmRleCwgc3RydWN0IGFmZV9jbGtfc2V0ICpjZmcpCit7CisJc3RydWN0IGFmZV9scGFzc19jbGtfY29uZmlnX2NvbW1hbmRfdjIgY2xrX2NmZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2ZnKSB7CisJCXByX2VycigiJXM6IGNsb2NrIGNmZyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwgX19mdW5jX18sIGluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKKwljbGtfY2ZnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljbGtfY2ZnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKTsKKwljbGtfY2ZnLmhkci5zcmNfcG9ydCA9IDA7CisJY2xrX2NmZy5oZHIuZGVzdF9wb3J0ID0gMDsKKwljbGtfY2ZnLmhkci50b2tlbiA9IGluZGV4OworCisJY2xrX2NmZy5oZHIub3Bjb2RlID0gQUZFX1NWQ19DTURfU0VUX1BBUkFNOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNsa19jZmcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKQorCQkJCQkJLSBzaXplb2YoY2xrX2NmZy5wYXJhbSk7CisJY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOworCWNsa19jZmcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOworCWNsa19jZmcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9DTE9DS19TRVQ7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9DTE9DS19TRVQ7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjbGtfY2ZnLmNsa19jZmcpOworCWNsa19jZmcuY2xrX2NmZyA9ICpjZmc7CisKKworCXByX2RlYnVnKCIlczogTWlub3IgdmVyc2lvbiA9MHgleCBjbGsgaWQgPSAlZFxuIgorCQkgImNsayBmcmVxIChIeikgPSAlZCwgY2xrIGF0dHJpID0gMHgleFxuIgorCQkgImNsayByb290ID0gMHgleCBjbGsgZW5hYmxlID0gMHgleFxuIiwKKwkJIF9fZnVuY19fLCBjZmctPmNsa19zZXRfbWlub3JfdmVyc2lvbiwKKwkJIGNmZy0+Y2xrX2lkLCBjZmctPmNsa19mcmVxX2luX2h6LCBjZmctPmNsa19hdHRyaSwKKwkJIGNmZy0+Y2xrX3Jvb3QsIGNmZy0+ZW5hYmxlKTsKKworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2xrX2NmZyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQUZFIGNsayBjZmcgZmFpbGVkIHdpdGggcmV0ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgeworCQkvKiBzZXQgcmV0IHRvIDAgYXMgbm8gdGltZW91dCBoYXBwZW5lZCAqLworCQlyZXQgPSAwOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworZmFpbF9jbWQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX2Nsa19zZXQgKmNmZykKK3sKKwlpbnQgaW5kZXggPSAwOworCWludCByZXQgPSAwOworCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UocG9ydF9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UgZmFpbCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoaW5kZXgsIGNmZyk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogYWZlX3NldF9scGFzc19jbGtfY2ZnX3YyIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9zZXRfbHBhc3NfaW50ZXJuYWxfZGlnaXRhbF9jb2RlY19jbG9jayh1MTYgcG9ydF9pZCwKKwkJCXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnICpjZmcpCit7CisJc3RydWN0IGFmZV9scGFzc19kaWdpdGFsX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNmZykgeworCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZShwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZSBmYWlsICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOworCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKKwljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOworCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7CisKKwljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOworCWNsa19jZmcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7CisJY2xrX2NmZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY2xrX2NmZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCisJCQkJCQktIHNpemVvZihjbGtfY2ZnLnBhcmFtKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7CisJY2xrX2NmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7CisJY2xrX2NmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7CisJY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9JTlRFUk5BTF9ESUdJQVRMX0NEQ19DTEtfQ09ORklHOworCWNsa19jZmcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2xrX2NmZy5jbGtfY2ZnKTsKKwljbGtfY2ZnLmNsa19jZmcgPSAqY2ZnOworCisJcHJfZGVidWcoIiVzOiBNaW5vciB2ZXJzaW9uID0weCV4IGNsayB2YWwgPSAlZFxuIgorCQkgImNsayByb290ID0gMHgleCByZXNydiA9IDB4JXggcG9ydCBpZCA9IDB4JXhcbiIsCisJCSBfX2Z1bmNfXywgY2ZnLT5pMnNfY2ZnX21pbm9yX3ZlcnNpb24sCisJCSBjZmctPmNsa192YWwsIGNmZy0+Y2xrX3Jvb3QsIGNmZy0+cmVzZXJ2ZWQsCisJCSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpKTsKKworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2xrX2NmZyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweDB4JXggcmV0ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX2VuYWJsZV9scGFzc19jb3JlX3NoYXJlZF9jbG9jayh1MTYgcG9ydF9pZCwgdTMyIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYWZlX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOworCWludCBpbmRleCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IEFGRV9NQVhfUE9SVFMpIHsKKwkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAorCQkJCV9fZnVuY19fLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZShwb3J0X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZSBmYWlsICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisJY2xrX2NmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY2xrX2NmZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY2xrX2NmZyk7CisJY2xrX2NmZy5oZHIuc3JjX3BvcnQgPSAwOworCWNsa19jZmcuaGRyLmRlc3RfcG9ydCA9IDA7CisJY2xrX2NmZy5oZHIudG9rZW4gPSBpbmRleDsKKworCWNsa19jZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7CisJY2xrX2NmZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKKwkJCQkJCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOworCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7CisJY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKKwljbGtfY2ZnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKKwljbGtfY2ZnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKKwljbGtfY2ZnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0xQQVNTX0NPUkVfU0hBUkVEX0NMT0NLX0NPTkZJRzsKKwljbGtfY2ZnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNsa19jZmcuY2xrX2NmZyk7CisJY2xrX2NmZy5jbGtfY2ZnLmxwYXNzX2NvcmVfc2hhcmVkX2Nsa19jZmdfbWlub3JfdmVyc2lvbiA9CisJCQkJQUZFX0FQSV9WRVJTSU9OX0xQQVNTX0NPUkVfU0hBUkVEX0NMS19DT05GSUc7CisJY2xrX2NmZy5jbGtfY2ZnLmVuYWJsZSA9IGVuYWJsZTsKKworCXByX2RlYnVnKCIlczogcG9ydCBpZCA9ICVkLCBlbmFibGUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpLCBlbmFibGUpOworCisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjbGtfY2ZnKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggcmV0ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCitmYWlsX2NtZDoKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHE2YWZlX2NoZWNrX29zcl9jbGtfZnJlcSh1MzIgZnJlcSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgUTZBRkVfTFBBU1NfT1NSX0NMS18xMl9QMjg4X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfOF9QMTkyX01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfNl9QMTQ0X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfNF9QMDk2X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfM19QMDcyX01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfMl9QMDQ4X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfMV9QNTM2X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfMV9QMDI0X01IWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfNzY4X2tIWjoKKwljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfNTEyX2tIWjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogZGVhZmF1bHQgZnJlcSAweCV4XG4iLAorCQkJX19mdW5jX18sIGZyZXEpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX2dldF9zcF90aF92aV9mdG1fZGF0YShzdHJ1Y3QgYWZlX3NwX3RoX3ZpX2dldF9wYXJhbSAqdGhfdmkpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGluZGV4ID0gMCwgcG9ydCA9IFNMSU1CVVNfNF9UWDsKKworCWlmICghdGhfdmkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAodGhpc19hZmUudmlfdHhfcG9ydCAhPSAtMSkKKwkJcG9ydCA9IHRoaXNfYWZlLnZpX3R4X3BvcnQ7CisKKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydCwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKwlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydCk7CisJaWYgKGluZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBvcnQgMHgleCwgaW5kZXggJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydCwgaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXRoX3ZpLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJdGhfdmktPmhkci5wa3Rfc2l6ZSA9IHNpemVvZigqdGhfdmkpOworCXRoX3ZpLT5oZHIuc3JjX3BvcnQgPSAwOworCXRoX3ZpLT5oZHIuZGVzdF9wb3J0ID0gMDsKKwl0aF92aS0+aGRyLnRva2VuID0gaW5kZXg7CisJdGhfdmktPmhkci5vcGNvZGUgPSAgQUZFX1BPUlRfQ01EX0dFVF9QQVJBTV9WMjsKKwl0aF92aS0+Z2V0X3BhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKKwl0aF92aS0+Z2V0X3BhcmFtLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX1RIX1ZJOworCXRoX3ZpLT5nZXRfcGFyYW0ucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BfVjJfVEhfVklfRlRNX1BBUkFNUzsKKwl0aF92aS0+Z2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAwOworCXRoX3ZpLT5nZXRfcGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDA7CisJdGhfdmktPmdldF9wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoKnRoX3ZpKQorCQkJCS0gc2l6ZW9mKHRoX3ZpLT5nZXRfcGFyYW0pIC0gc2l6ZW9mKHRoX3ZpLT5oZHIpOworCXRoX3ZpLT5nZXRfcGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydCk7CisJdGhfdmktPnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX1RIX1ZJOworCXRoX3ZpLT5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fUEFSQU1TOworCXRoX3ZpLT5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKHRoX3ZpLT5wYXJhbSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopdGhfdmkpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGdldCBwYXJhbSBwb3J0IDB4JXggcGFyYW0gaWRbMHgleF1mYWlsZWQgJWRcbiIsCisJCQkgX19mdW5jX18sIHBvcnQsIHRoX3ZpLT5nZXRfcGFyYW0ucGFyYW1faWQsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAorCQkJCSAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZG9uZTsKKwl9CisJbWVtY3B5KCZ0aF92aS0+cGFyYW0sICZ0aGlzX2FmZS50aF92aV9yZXNwLnBhcmFtLAorCQlzaXplb2YodGhpc19hZmUudGhfdmlfcmVzcC5wYXJhbSkpOworCXByX2RlYnVnKCIlczogREMgcmVzaXN0YW5jZSAlZCAlZCB0ZW1wICVkICVkIHN0YXR1cyAlZCAlZFxuIiwKKwkJIF9fZnVuY19fLCB0aF92aS0+cGFyYW0uZGNfcmVzX3EyNFtTUF9WMl9TUEtSXzFdLAorCQkgdGhfdmktPnBhcmFtLmRjX3Jlc19xMjRbU1BfVjJfU1BLUl8yXSwKKwkJIHRoX3ZpLT5wYXJhbS50ZW1wX3EyMltTUF9WMl9TUEtSXzFdLAorCQkgdGhfdmktPnBhcmFtLnRlbXBfcTIyW1NQX1YyX1NQS1JfMl0sCisJCSB0aF92aS0+cGFyYW0uc3RhdHVzW1NQX1YyX1NQS1JfMV0sCisJCSB0aF92aS0+cGFyYW0uc3RhdHVzW1NQX1YyX1NQS1JfMl0pOworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZmVfZ2V0X3NwX2V4X3ZpX2Z0bV9kYXRhKHN0cnVjdCBhZmVfc3BfZXhfdmlfZ2V0X3BhcmFtICpleF92aSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgaW5kZXggPSAwLCBwb3J0ID0gU0xJTUJVU180X1RYOworCisJaWYgKCFleF92aSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh0aGlzX2FmZS52aV90eF9wb3J0ICE9IC0xKQorCQlwb3J0ID0gdGhpc19hZmUudmlfdHhfcG9ydDsKKworCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBvcnQgMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0LCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnQpOworCWlmIChpbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAlZCBwb3J0IDB4JXhcbiIsIF9fZnVuY19fLAorCQkJaW5kZXgsIHBvcnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJZXhfdmktPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlleF92aS0+aGRyLnBrdF9zaXplID0gc2l6ZW9mKCpleF92aSk7CisJZXhfdmktPmhkci5zcmNfcG9ydCA9IDA7CisJZXhfdmktPmhkci5kZXN0X3BvcnQgPSAwOworCWV4X3ZpLT5oZHIudG9rZW4gPSBpbmRleDsKKwlleF92aS0+aGRyLm9wY29kZSA9ICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyOworCWV4X3ZpLT5nZXRfcGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOworCWV4X3ZpLT5nZXRfcGFyYW0ubW9kdWxlX2lkID0gQUZFX01PRFVMRV9TUEVBS0VSX1BST1RFQ1RJT05fVjJfRVhfVkk7CisJZXhfdmktPmdldF9wYXJhbS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fUEFSQU1TOworCWV4X3ZpLT5nZXRfcGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDA7CisJZXhfdmktPmdldF9wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMDsKKwlleF92aS0+Z2V0X3BhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZigqZXhfdmkpCisJCS0gc2l6ZW9mKGV4X3ZpLT5nZXRfcGFyYW0pIC0gc2l6ZW9mKGV4X3ZpLT5oZHIpOworCWV4X3ZpLT5nZXRfcGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydCk7CisJZXhfdmktPnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX0VYX1ZJOworCWV4X3ZpLT5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fUEFSQU1TOworCWV4X3ZpLT5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGV4X3ZpLT5wYXJhbSk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7CisJcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopZXhfdmkpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGdldCBwYXJhbSBwb3J0IDB4JXggcGFyYW0gaWRbMHgleF1mYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9ydCwgZXhfdmktPmdldF9wYXJhbS5wYXJhbV9pZCwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCQkJIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7CisJCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKKwkJZ290byBkb25lOworCX0KKwltZW1jcHkoJmV4X3ZpLT5wYXJhbSwgJnRoaXNfYWZlLmV4X3ZpX3Jlc3AucGFyYW0sCisJCXNpemVvZih0aGlzX2FmZS5leF92aV9yZXNwLnBhcmFtKSk7CisJcHJfZGVidWcoIiVzOiBmcmVxICVkICVkIHJlc2lzdGFuY2UgJWQgJWQgcWZhY3RvciAlZCAlZCBzdGF0ZSAlZCAlZFxuIiwKKwkJIF9fZnVuY19fLCBleF92aS0+cGFyYW0uZnJlcV9xMjBbU1BfVjJfU1BLUl8xXSwKKwkJIGV4X3ZpLT5wYXJhbS5mcmVxX3EyMFtTUF9WMl9TUEtSXzJdLAorCQkgZXhfdmktPnBhcmFtLnJlc2lzX3EyNFtTUF9WMl9TUEtSXzFdLAorCQkgZXhfdmktPnBhcmFtLnJlc2lzX3EyNFtTUF9WMl9TUEtSXzJdLAorCQkgZXhfdmktPnBhcmFtLnFtY3RfcTI0W1NQX1YyX1NQS1JfMV0sCisJCSBleF92aS0+cGFyYW0ucW1jdF9xMjRbU1BfVjJfU1BLUl8yXSwKKwkJIGV4X3ZpLT5wYXJhbS5zdGF0dXNbU1BfVjJfU1BLUl8xXSwKKwkJIGV4X3ZpLT5wYXJhbS5zdGF0dXNbU1BfVjJfU1BLUl8yXSk7CisJcmV0ID0gMDsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9zcGtfcHJvdF9nZXRfY2FsaWJfZGF0YShzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9nZXRfdmlfY2FsaWIgKmNhbGliX3Jlc3ApCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGluZGV4ID0gMCwgcG9ydCA9IFNMSU1CVVNfNF9UWDsKKworCWlmICghY2FsaWJfcmVzcCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAodGhpc19hZmUudmlfdHhfcG9ydCAhPSAtMSkKKwkJcG9ydCA9IHRoaXNfYWZlLnZpX3R4X3BvcnQ7CisKKwlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydCwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnQpOworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwljYWxpYl9yZXNwLT5oZHIuaGRyX2ZpZWxkID0KKwlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljYWxpYl9yZXNwLT5oZHIucGt0X3NpemUgPSBzaXplb2YoKmNhbGliX3Jlc3ApOworCWNhbGliX3Jlc3AtPmhkci5zcmNfcG9ydCA9IDA7CisJY2FsaWJfcmVzcC0+aGRyLmRlc3RfcG9ydCA9IDA7CisJY2FsaWJfcmVzcC0+aGRyLnRva2VuID0gaW5kZXg7CisJY2FsaWJfcmVzcC0+aGRyLm9wY29kZSA9ICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyOworCWNhbGliX3Jlc3AtPmdldF9wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7CisJY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1ZJX1BST0NfVjI7CisJY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NBTElCX1JFU19DRkdfVjI7CisJY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAwOworCWNhbGliX3Jlc3AtPmdldF9wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMDsKKwljYWxpYl9yZXNwLT5nZXRfcGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKCpjYWxpYl9yZXNwKQorCQktIHNpemVvZihjYWxpYl9yZXNwLT5nZXRfcGFyYW0pIC0gc2l6ZW9mKGNhbGliX3Jlc3AtPmhkcik7CisJY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOworCWNhbGliX3Jlc3AtPnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1ZJX1BST0NfVjI7CisJY2FsaWJfcmVzcC0+cGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0FMSUJfUkVTX0NGR19WMjsKKwljYWxpYl9yZXNwLT5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNhbGliX3Jlc3AtPnJlc19jZmcpOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOworCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKWNhbGliX3Jlc3ApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGdldCBwYXJhbSBwb3J0IDB4JXggcGFyYW0gaWRbMHgleF1mYWlsZWQgJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcG9ydCwgY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBhcmFtX2lkLCByZXQpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCisJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgeworCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCW1lbWNweSgmY2FsaWJfcmVzcC0+cmVzX2NmZywgJnRoaXNfYWZlLmNhbGliX2RhdGEucmVzX2NmZywKKwkJc2l6ZW9mKHRoaXNfYWZlLmNhbGliX2RhdGEucmVzX2NmZykpOworCXByX2luZm8oIiVzOiBzdGF0ZSAlcyByZXNpc3RhbmNlICVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBmYnNwX3N0YXRlW2NhbGliX3Jlc3AtPnJlc19jZmcudGhfdmlfY2Ffc3RhdGVdLAorCQkJIGNhbGliX3Jlc3AtPnJlc19jZmcucjBfY2FsaV9xMjRbU1BfVjJfU1BLUl8xXSwKKwkJCSBjYWxpYl9yZXNwLT5yZXNfY2ZnLnIwX2NhbGlfcTI0W1NQX1YyX1NQS1JfMl0pOworCXJldCA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWZlX3Nwa19wcm90X2ZlZWRfYmFja19jZmcoaW50IHNyY19wb3J0LCBpbnQgZHN0X3BvcnQsCisJaW50IGxfY2gsIGludCByX2NoLCB1MzIgZW5hYmxlKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXVuaW9uIGFmZV9zcGtyX3Byb3RfY29uZmlnIHByb3RfY29uZmlnOworCWludCBpbmRleCA9IDA7CisKKwlpZiAoIWVuYWJsZSkgeworCQlwcl9kZWJ1ZygiJXM6IERpc2FibGUgRmVlZGJhY2sgdHggcGF0aCIsIF9fZnVuY19fKTsKKwkJdGhpc19hZmUudmlfdHhfcG9ydCA9IC0xOworCQl0aGlzX2FmZS52aV9yeF9wb3J0ID0gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmICgocTZhdWRpb192YWxpZGF0ZV9wb3J0KHNyY19wb3J0KSA8IDApIHx8CisJCShxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQoZHN0X3BvcnQpIDwgMCkpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0cyBzcmMgMHgleCBkc3QgMHgleCIsCisJCQlfX2Z1bmNfXywgc3JjX3BvcnQsIGRzdF9wb3J0KTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKCFsX2NoICYmICFyX2NoKSB7CisJCXByX2VycigiJXM6IGVycm9yIGNoIHZhbHVlcyB6ZXJvXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXByX2RlYnVnKCIlczogc3JjX3BvcnQgMHgleCAgZHN0X3BvcnQgMHgleCBsX2NoICVkIHJfY2ggJWRcbiIsCisJCSBfX2Z1bmNfXywgc3JjX3BvcnQsIGRzdF9wb3J0LCBsX2NoLCByX2NoKTsKKwltZW1zZXQoJnByb3RfY29uZmlnLCAwLCBzaXplb2YocHJvdF9jb25maWcpKTsKKwlwcm90X2NvbmZpZy5mZWVkYmFja19wYXRoX2NmZy5kc3RfcG9ydGlkID0KKwkJcTZhdWRpb19nZXRfcG9ydF9pZChkc3RfcG9ydCk7CisJaWYgKGxfY2gpIHsKKwkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMTsKKwkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMjsKKwl9CisJaWYgKHJfY2gpIHsKKwkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMzsKKwkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gNDsKKwl9CisJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcubnVtX2NoYW5uZWxzID0gaW5kZXg7CisJcHJfZGVidWcoIiVzIG5vIG9mIGNoYW5uZWxzOiAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKKwlwcm90X2NvbmZpZy5mZWVkYmFja19wYXRoX2NmZy5taW5vcl92ZXJzaW9uID0gMTsKKwlyZXQgPSBhZmVfc3BrX3Byb3RfcHJlcGFyZShzcmNfcG9ydCwgZHN0X3BvcnQsCisJCQlBRkVfUEFSQU1fSURfRkVFREJBQ0tfUEFUSF9DRkcsICZwcm90X2NvbmZpZyk7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9jYWxfdHlwZV9pbmRleChpbnQzMl90IGNhbF90eXBlKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChjYWxfdHlwZSkgeworCWNhc2UgQUZFX0NPTU1PTl9SWF9DQUxfVFlQRToKKwkJcmV0ID0gQUZFX0NPTU1PTl9SWF9DQUw7CisJCWJyZWFrOworCWNhc2UgQUZFX0NPTU1PTl9UWF9DQUxfVFlQRToKKwkJcmV0ID0gQUZFX0NPTU1PTl9UWF9DQUw7CisJCWJyZWFrOworCWNhc2UgQUZFX0FBTkNfQ0FMX1RZUEU6CisJCXJldCA9IEFGRV9BQU5DX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfSFdfREVMQVlfQ0FMX1RZUEU6CisJCXJldCA9IEFGRV9IV19ERUxBWV9DQUw7CisJCWJyZWFrOworCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9DQUxfVFlQRToKKwkJcmV0ID0gQUZFX0ZCX1NQS1JfUFJPVF9DQUw7CisJCWJyZWFrOworCWNhc2UgQUZFX1NJREVUT05FX0NBTF9UWVBFOgorCQlyZXQgPSBBRkVfU0lERVRPTkVfQ0FMOworCQlicmVhazsKKwljYXNlIEFGRV9UT1BPTE9HWV9DQUxfVFlQRToKKwkJcmV0ID0gQUZFX1RPUE9MT0dZX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBBRkVfQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKKwkJcmV0ID0gQUZFX0NVU1RfVE9QT0xPR1lfQ0FMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50CQkJCXJldCA9IDA7CisJaW50CQkJCWNhbF9pbmRleDsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkIGNhbF9pbmRleCA9ICVkXG4iLAorCQkgIF9fZnVuY19fLCBjYWxfdHlwZSwgY2FsX2luZGV4KTsKKworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJCQl2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2RlYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKKwkJdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWZlX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9pbmRleCA9PSBBRkVfQ1VTVF9UT1BPTE9HWV9DQUwpIHsKKwkJbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0NVU1RfVE9QT0xPR1lfQ0FMXS0+bG9jayk7CisJCXRoaXNfYWZlLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOworCQlwcl9kZWJ1ZygiJXM6W0FGRV9DVVNUT01fVE9QT0xPR1ldIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfQ1VTVF9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWZlX2ZpbmRfaHdfZGVsYXlfYnlfcGF0aCgKKwkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwgaW50IHBhdGgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkmY2FsX3R5cGUtPmNhbF9ibG9ja3MpIHsKKworCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7CisKKwkJaWYgKCgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5ICopY2FsX2Jsb2NrLT5jYWxfaW5mbykKKwkJCS0+cGF0aCA9PSBwYXRoKSB7CisJCQlyZXR1cm4gY2FsX2Jsb2NrOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFmZV9nZXRfY2FsX2h3X2RlbGF5KGludDMyX3QgcGF0aCwKKwkJCQlzdHJ1Y3QgYXVkaW9fY2FsX2h3X2RlbGF5X2VudHJ5ICplbnRyeSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOworCXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZGF0YQkqaHdfZGVsYXlfaW5mbyA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0hXX0RFTEFZX0NBTF0gPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBRkVfSFdfREVMQVlfQ0FMIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGVudHJ5IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoKHBhdGggPj0gTUFYX1BBVEhfVFlQRSkgfHwgKHBhdGggPCAwKSkgeworCQlwcl9lcnIoIiVzOiBiYWQgcGF0aDogJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcGF0aCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfSFdfREVMQVlfQ0FMXS0+bG9jayk7CisJY2FsX2Jsb2NrID0gYWZlX2ZpbmRfaHdfZGVsYXlfYnlfcGF0aCgKKwkJdGhpc19hZmUuY2FsX2RhdGFbQUZFX0hXX0RFTEFZX0NBTF0sIHBhdGgpOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKKwkJZ290byB1bmxvY2s7CisKKwlod19kZWxheV9pbmZvID0gJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5ICopCisJCWNhbF9ibG9jay0+Y2FsX2luZm8pLT5kYXRhOworCWlmIChod19kZWxheV9pbmZvLT5udW1fZW50cmllcyA+IE1BWF9IV19ERUxBWV9FTlRSSUVTKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgbnVtIGVudHJpZXM6ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKGh3X2RlbGF5X2luZm8tPmVudHJ5W2ldLnNhbXBsZV9yYXRlID09CisJCQllbnRyeS0+c2FtcGxlX3JhdGUpIHsKKwkJCWVudHJ5LT5kZWxheV91c2VjID0gaHdfZGVsYXlfaW5mby0+ZW50cnlbaV0uZGVsYXlfdXNlYzsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBmaW5kIGRlbGF5IGZvciBzYW1wbGUgcmF0ZSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBlbnRyeS0+c2FtcGxlX3JhdGUpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIHVubG9jazsKKwl9CisJcHJfZGVidWcoIiVzOiBQYXRoID0gJWQgc2FtcGxlcmF0ZSA9ICV1IHVzZWMgPSAldSBzdGF0dXMgJWRcbiIsCisJCSBfX2Z1bmNfXywgcGF0aCwgZW50cnktPnNhbXBsZV9yYXRlLCBlbnRyeS0+ZGVsYXlfdXNlYywgcmV0KTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9IV19ERUxBWV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfc2V0X2NhbF9zcF90aF92aV9mdG1fY2ZnKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX2Z0bV9jZmcgKmNhbF9kYXRhID0gZGF0YTsKKworCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF0gPT0gTlVMTCB8fAorCSAgICBjYWxfZGF0YSA9PSBOVUxMIHx8CisJICAgIGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKKwkJZ290byBkb25lOworCisJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMXS0+bG9jayk7CisJbWVtY3B5KCZ0aGlzX2FmZS50aF9mdG1fY2ZnLCAmY2FsX2RhdGEtPmNhbF9pbmZvLAorCQlzaXplb2YodGhpc19hZmUudGhfZnRtX2NmZykpOworCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfc2V0X2NhbF9zcF9leF92aV9mdG1fY2ZnKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX2Z0bV9jZmcgKmNhbF9kYXRhID0gZGF0YTsKKworCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF0gPT0gTlVMTCB8fAorCSAgICBjYWxfZGF0YSA9PSBOVUxMIHx8CisJICAgIGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKKwkJZ290byBkb25lOworCisJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXS0+bG9jayk7CisJbWVtY3B5KCZ0aGlzX2FmZS5leF9mdG1fY2ZnLCAmY2FsX2RhdGEtPmNhbF9pbmZvLAorCQlzaXplb2YodGhpc19hZmUuZXhfZnRtX2NmZykpOworCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfc2V0X2NhbF9mYl9zcGtyX3Byb3QoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJCQkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3RfY2ZnCSpjYWxfZGF0YSA9IGRhdGE7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKwlpZiAoY2FsX2RhdGEgPT0gTlVMTCkKKwkJZ290byBkb25lOworCWlmIChkYXRhX3NpemUgIT0gc2l6ZW9mKCpjYWxfZGF0YSkpCisJCWdvdG8gZG9uZTsKKworCWlmIChjYWxfZGF0YS0+Y2FsX2luZm8ubW9kZSA9PSBNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTKQorCQlfX3BtX3dha2V1cF9ldmVudCgmd2wud3MsIGppZmZpZXNfdG9fbXNlY3MoV0FLRUxPQ0tfVElNRU9VVCkpOworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7CisJbWVtY3B5KCZ0aGlzX2FmZS5wcm90X2NmZywgJmNhbF9kYXRhLT5jYWxfaW5mbywKKwkJc2l6ZW9mKHRoaXNfYWZlLnByb3RfY2ZnKSk7CisJdGhpc19hZmUudGhfZnRtX2NmZy5tb2RlID0gdGhpc19hZmUucHJvdF9jZmcubW9kZTsKKwl0aGlzX2FmZS5leF9mdG1fY2ZnLm1vZGUgPSB0aGlzX2FmZS5wcm90X2NmZy5tb2RlOworCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfZ2V0X2NhbF9zcF90aF92aV9mdG1fcGFyYW0oaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJICB2b2lkICpkYXRhKQoreworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9wYXJhbSAqY2FsX2RhdGEgPSBkYXRhOworCXN0cnVjdCBhZmVfc3BfdGhfdmlfZ2V0X3BhcmFtIHRoX3ZpOworCisJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOworCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF0gPT0gTlVMTCB8fAorCSAgICBjYWxfZGF0YSA9PSBOVUxMIHx8CisJICAgIGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKKwkJZ290byBkb25lOworCisJbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1BfVjJfTlVNX01BWF9TUEtSUzsgaSsrKSB7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXNbaV0gPSAtRUlOVkFMOworCQljYWxfZGF0YS0+Y2FsX2luZm8ucl9kY19xMjRbaV0gPSAtMTsKKwkJY2FsX2RhdGEtPmNhbF9pbmZvLnRlbXBfcTIyW2ldID0gLTE7CisJfQorCWlmICghYWZlX2dldF9zcF90aF92aV9mdG1fZGF0YSgmdGhfdmkpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTUF9WMl9OVU1fTUFYX1NQS1JTOyBpKyspIHsKKwkJCXByX2RlYnVnKCIlczogZnRtIHBhcmFtIHN0YXR1cyA9ICVkXG4iLAorCQkJCSAgX19mdW5jX18sIHRoX3ZpLnBhcmFtLnN0YXR1c1tpXSk7CisJCQlpZiAodGhfdmkucGFyYW0uc3RhdHVzW2ldID09IEZCU1BfSU5fUFJPR1JFU1MpIHsKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzW2ldID0gLUVBR0FJTjsKKwkJCX0gZWxzZSBpZiAodGhfdmkucGFyYW0uc3RhdHVzW2ldID09IEZCU1BfU1VDQ0VTUykgeworCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXNbaV0gPSAwOworCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yX2RjX3EyNFtpXSA9CisJCQkJCXRoX3ZpLnBhcmFtLmRjX3Jlc19xMjRbaV07CisJCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnRlbXBfcTIyW2ldID0KKwkJCQkJdGhfdmkucGFyYW0udGVtcF9xMjJbaV07CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF0tPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9nZXRfY2FsX3NwX2V4X3ZpX2Z0bV9wYXJhbShpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLAorCQkJCQkgIHZvaWQgKmRhdGEpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX3BhcmFtICpjYWxfZGF0YSA9IGRhdGE7CisJc3RydWN0IGFmZV9zcF9leF92aV9nZXRfcGFyYW0gZXhfdmk7CisKKwlwcl9kZWJ1ZygiJXM6IGNhbF90eXBlID0gJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJaWYgKHRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXSA9PSBOVUxMIHx8CisJICAgIGNhbF9kYXRhID09IE5VTEwgfHwKKwkgICAgZGF0YV9zaXplICE9IHNpemVvZigqY2FsX2RhdGEpKQorCQlnb3RvIGRvbmU7CisKKwltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF0tPmxvY2spOworCWZvciAoaSA9IDA7IGkgPCBTUF9WMl9OVU1fTUFYX1NQS1JTOyBpKyspIHsKKwkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1c1tpXSA9IC1FSU5WQUw7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5mcmVxX3EyMFtpXSA9IC0xOworCQljYWxfZGF0YS0+Y2FsX2luZm8ucmVzaXNfcTI0W2ldID0gLTE7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5xbWN0X3EyNFtpXSA9IC0xOworCX0KKwlpZiAoIWFmZV9nZXRfc3BfZXhfdmlfZnRtX2RhdGEoJmV4X3ZpKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgU1BfVjJfTlVNX01BWF9TUEtSUzsgaSsrKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGZ0bSBwYXJhbSBzdGF0dXMgPSAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBleF92aS5wYXJhbS5zdGF0dXNbaV0pOworCQkJaWYgKGV4X3ZpLnBhcmFtLnN0YXR1c1tpXSA9PSBGQlNQX0lOX1BST0dSRVNTKSB7CisJCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1c1tpXSA9IC1FQUdBSU47CisJCQl9IGVsc2UgaWYgKGV4X3ZpLnBhcmFtLnN0YXR1c1tpXSA9PSBGQlNQX1NVQ0NFU1MpIHsKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzW2ldID0gMDsKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8uZnJlcV9xMjBbaV0gPQorCQkJCQlleF92aS5wYXJhbS5mcmVxX3EyMFtpXTsKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8ucmVzaXNfcTI0W2ldID0KKwkJCQkJZXhfdmkucGFyYW0ucmVzaXNfcTI0W2ldOworCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5xbWN0X3EyNFtpXSA9CisJCQkJCWV4X3ZpLnBhcmFtLnFtY3RfcTI0W2ldOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZmVfZ2V0X2NhbF9mYl9zcGtyX3Byb3QoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCQkJCQkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3Rfc3RhdHVzICpjYWxfZGF0YSA9IGRhdGE7CisJc3RydWN0IGFmZV9zcGtyX3Byb3RfZ2V0X3ZpX2NhbGliIGNhbGliX3Jlc3A7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKwlpZiAoY2FsX2RhdGEgPT0gTlVMTCkKKwkJZ290byBkb25lOworCWlmIChkYXRhX3NpemUgIT0gc2l6ZW9mKCpjYWxfZGF0YSkpCisJCWdvdG8gZG9uZTsKKworCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7CisJaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgPT0gTVNNX1NQS1JfUFJPVF9DQUxJQlJBVEVEKSB7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzFdID0KKwkJCXRoaXNfYWZlLnByb3RfY2ZnLnIwW1NQX1YyX1NQS1JfMV07CisJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzJdID0KKwkJCXRoaXNfYWZlLnByb3RfY2ZnLnIwW1NQX1YyX1NQS1JfMl07CisJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXMgPSAwOworCX0gZWxzZSBpZiAodGhpc19hZmUucHJvdF9jZmcubW9kZSA9PQorCQkJTVNNX1NQS1JfUFJPVF9DQUxJQlJBVElPTl9JTl9QUk9HUkVTUykgeworCQkvKkNhbGwgQUZFIHRvIHF1ZXJ5IHRoZSBzdGF0dXMqLworCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzID0gLUVJTlZBTDsKKwkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMV0gPSAtMTsKKwkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMl0gPSAtMTsKKwkJaWYgKCFhZmVfc3BrX3Byb3RfZ2V0X2NhbGliX2RhdGEoJmNhbGliX3Jlc3ApKSB7CisJCQlpZiAoY2FsaWJfcmVzcC5yZXNfY2ZnLnRoX3ZpX2NhX3N0YXRlID09CisJCQkJCQkJRkJTUF9JTl9QUk9HUkVTUykKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzID0gLUVBR0FJTjsKKwkJCWVsc2UgaWYgKGNhbGliX3Jlc3AucmVzX2NmZy50aF92aV9jYV9zdGF0ZSA9PQorCQkJCQkJCUZCU1BfU1VDQ0VTUykgeworCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXMgPSAwOworCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzFdID0KKwkJCQljYWxpYl9yZXNwLnJlc19jZmcucjBfY2FsaV9xMjRbU1BfVjJfU1BLUl8xXTsKKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8ucjBbU1BfVjJfU1BLUl8yXSA9CisJCQkJY2FsaWJfcmVzcC5yZXNfY2ZnLnIwX2NhbGlfcTI0W1NQX1YyX1NQS1JfMl07CisJCQl9CisJCX0KKwkJaWYgKCFjYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzKSB7CisJCQl0aGlzX2FmZS5wcm90X2NmZy5tb2RlID0KKwkJCQlNU01fU1BLUl9QUk9UX0NBTElCUkFURUQ7CisJCQl0aGlzX2FmZS5wcm90X2NmZy5yMFtTUF9WMl9TUEtSXzFdID0KKwkJCQljYWxfZGF0YS0+Y2FsX2luZm8ucjBbU1BfVjJfU1BLUl8xXTsKKwkJCXRoaXNfYWZlLnByb3RfY2ZnLnIwW1NQX1YyX1NQS1JfMl0gPQorCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzJdOworCQl9CisJfSBlbHNlIHsKKwkJLypJbmRpY2F0ZXMgY2FsaWJyYXRpb24gZGF0YSBpcyBpbnZhbGlkKi8KKwkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1cyA9IC1FSU5WQUw7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzFdID0gLTE7CisJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzJdID0gLTE7CisJfQorCXRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9IHRoaXNfYWZlLnByb3RfY2ZnLm1vZGU7CisJdGhpc19hZmUuZXhfZnRtX2NmZy5tb2RlID0gdGhpc19hZmUucHJvdF9jZmcubW9kZTsKKwltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7CisJX19wbV9yZWxheCgmd2wud3MpOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV9tYXBfY2FsX2RhdGEoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCisJYXRvbWljX3NldCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgsIGNhbF9pbmRleCk7CisJcmV0ID0gYWZlX2NtZF9tZW1vcnlfbWFwKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCisJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgLTEpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkIHJldCAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgcmV0KTsKKwkJcHJfZGVidWcoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJXpkXG4iLAorCQkJX19mdW5jX18sCisJCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOworCQlnb3RvIGRvbmU7CisJfQorCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gYXRvbWljX3JlYWQoJnRoaXNfYWZlLgorCQltZW1fbWFwX2NhbF9oYW5kbGVzW2NhbF9pbmRleF0pOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmZV91bm1hcF9jYWxfZGF0YShpbnQzMl90IGNhbF90eXBlLAorCQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENhbCBibG9jayBpcyBOVUxMIVxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9PSAwKSB7CisJCXByX2VycigiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9oYW5kbGVzW2NhbF9pbmRleF0sCisJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgY2FsX2luZGV4KTsKKwlyZXQgPSBhZmVfY21kX21lbW9yeV91bm1hcF9ub3dhaXQoCisJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKKwlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgLTEpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgY2FsX3R5cGUgJWkgcmV0ICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcmV0KTsKKwl9CisJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSAwOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhZmVfZGVsZXRlX2NhbF9kYXRhKHZvaWQpCit7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKE1BWF9BRkVfQ0FMX1RZUEVTLCB0aGlzX2FmZS5jYWxfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgYWZlX2luaXRfY2FsX2RhdGEodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FsX3R5cGVfaW5mbwljYWxfdHlwZV9pbmZvW10gPSB7CisJCXt7QUZFX0NPTU1PTl9SWF9DQUxfVFlQRSwKKwkJe2FmZV9hbGxvY19jYWwsIGFmZV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXthZmVfbWFwX2NhbF9kYXRhLCBhZmVfdW5tYXBfY2FsX2RhdGEsCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QUZFX0NPTU1PTl9UWF9DQUxfVFlQRSwKKwkJe2FmZV9hbGxvY19jYWwsIGFmZV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXthZmVfbWFwX2NhbF9kYXRhLCBhZmVfdW5tYXBfY2FsX2RhdGEsCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QUZFX0FBTkNfQ0FMX1RZUEUsCisJCXthZmVfYWxsb2NfY2FsLCBhZmVfZGVhbGxvY19jYWwsIE5VTEwsCisJCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7YWZlX21hcF9jYWxfZGF0YSwgYWZlX3VubWFwX2NhbF9kYXRhLAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FGRV9GQl9TUEtSX1BST1RfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBhZmVfc2V0X2NhbF9mYl9zcGtyX3Byb3QsCisJCWFmZV9nZXRfY2FsX2ZiX3Nwa3JfcHJvdCwgTlVMTH0gfSwKKwkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QUZFX0hXX0RFTEFZX0NBTF9UWVBFLAorCQl7TlVMTCwgTlVMTCwgTlVMTCwKKwkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FGRV9TSURFVE9ORV9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsCisJCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tBRkVfVE9QT0xPR1lfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLAorCQlhZmVfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIE5VTEwsCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QUZFX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCisJCXthZmVfYWxsb2NfY2FsLCBhZmVfZGVhbGxvY19jYWwsIE5VTEwsCisJCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7YWZlX21hcF9jYWxfZGF0YSwgYWZlX3VubWFwX2NhbF9kYXRhLAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBhZmVfc2V0X2NhbF9zcF90aF92aV9mdG1fY2ZnLAorCQlhZmVfZ2V0X2NhbF9zcF90aF92aV9mdG1fcGFyYW0sIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBhZmVfc2V0X2NhbF9zcF9leF92aV9mdG1fY2ZnLAorCQlhZmVfZ2V0X2NhbF9zcF9leF92aV9mdG1fcGFyYW0sIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKwl9OworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKE1BWF9BRkVfQ0FMX1RZUEVTLCB0aGlzX2FmZS5jYWxfZGF0YSwKKwkJY2FsX3R5cGVfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSEgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHJldDsKK2VycjoKKwlhZmVfZGVsZXRlX2NhbF9kYXRhKCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFmZV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBhZGRyZXNzIHRvIG1hcCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogbWFwIHNpemUgaXMgMCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBhZmVfY21kX21lbW9yeV9tYXAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyKCIlczogYWZlX2NtZF9tZW1vcnlfbWFwIGZhaWxlZCBmb3IgYWRkciA9IDB4JXBLLCBzaXplID0gJWQsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX2hhbmRsZSA9IHRoaXNfYWZlLm1tYXBfaGFuZGxlOworCitkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBhZmVfdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAobWVtX21hcF9oYW5kbGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKm1lbV9tYXBfaGFuZGxlID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIDAsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBhZmVfY21kX21lbW9yeV91bm1hcCgqbWVtX21hcF9oYW5kbGUpOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogQUZFIG1lbW9yeSB1bm1hcCBmYWlsZWQgJWQsIGhhbmRsZSAweCV4XG4iLAorCQkgICAgIF9fZnVuY19fLCByZXN1bHQsICptZW1fbWFwX2hhbmRsZSk7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQkqbWVtX21hcF9oYW5kbGUgPSAwOworCX0KKworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZmVfaW5pdCh2b2lkKQoreworCWludCBpID0gMCwgcmV0OworCisJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDApOworCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7CisJYXRvbWljX3NldCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgsIC0xKTsKKwl0aGlzX2FmZS5hcHIgPSBOVUxMOworCXRoaXNfYWZlLmR0bWZfZ2VuX3J4X3BvcnRpZCA9IC0xOworCXRoaXNfYWZlLm1tYXBfaGFuZGxlID0gMDsKKwl0aGlzX2FmZS52aV90eF9wb3J0ID0gLTE7CisJdGhpc19hZmUudmlfcnhfcG9ydCA9IC0xOworCXRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgPSBNU01fU1BLUl9QUk9UX0RJU0FCTEVEOworCXRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7CisJdGhpc19hZmUuZXhfZnRtX2NmZy5tb2RlID0gTVNNX1NQS1JfUFJPVF9ESVNBQkxFRDsKKwltdXRleF9pbml0KCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBBRkVfTUFYX1BPUlRTOyBpKyspIHsKKwkJdGhpc19hZmUuYWZlX2NhbF9tb2RlW2ldID0gQUZFX0NBTF9NT0RFX0RFRkFVTFQ7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoaXNfYWZlLndhaXRbaV0pOworCX0KKwl3YWtldXBfc291cmNlX2luaXQoJndsLndzLCAic3Brci1wcm90Iik7CisJcmV0ID0gYWZlX2luaXRfY2FsX2RhdGEoKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgaW5pdCBjYWwgZGF0YSEgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJY29uZmlnX2RlYnVnX2ZzX2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFmZV9leGl0KHZvaWQpCit7CisJYWZlX2RlbGV0ZV9jYWxfZGF0YSgpOworCisJY29uZmlnX2RlYnVnX2ZzX2V4aXQoKTsKKwltdXRleF9kZXN0cm95KCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOworCXdha2V1cF9zb3VyY2VfdHJhc2goJndsLndzKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGFmZV9pbml0KTsKK19fZXhpdGNhbGwoYWZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YXNtLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzliZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YXNtLmMKQEAgLTAsMCArMSw4NTc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgorCisjaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+CisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+CisjaW5jbHVkZSA8c291bmQvbXNtLWR0cy1lYWdsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fkc3BfZXJyLmg+CisKKyNkZWZpbmUgVFJVRSAgICAgICAgMHgwMQorI2RlZmluZSBGQUxTRSAgICAgICAweDAwCisjZGVmaW5lIFNFU1NJT05fTUFYIDgKKworZW51bSB7CisJQVNNX1RPUE9MT0dZX0NBTCA9IDAsCisJQVNNX0NVU1RPTV9UT1BfQ0FMLAorCUFTTV9BVURTVFJNX0NBTCwKKwlBU01fUlRBQ19BUFJfQ0FMLAorCUFTTV9NQVhfQ0FMX1RZUEVTCit9OworCit1bmlvbiBhc21fdG9rZW5fc3RydWN0IHsKKwlzdHJ1Y3QgeworCQl1OCBzdHJlYW1faWQ7CisJCXU4IHNlc3Npb25faWQ7CisJCXU4IGJ1Zl9pbmRleDsKKwkJdTggZmxhZ3M7CisJfSBfdG9rZW47CisJdTMyIHRva2VuOworfSBfX3BhY2tlZDsKKworCitlbnVtIHsKKwlBU01fRElSRUNUSU9OX09GRlNFVCwKKwlBU01fQ01EX05PX1dBSVRfT0ZGU0VULAorCS8qCisJICogT2Zmc2V0IGlzIGxpbWl0ZWQgdG8gNyBiZWNhdXNlIGZsYWdzIGlzIHN0b3JlZCBpbiB1OAorCSAqIGZpZWxkIGluIGFzbV90b2tlbl9zdHJ1Y3R1cmUgZGVmaW5lZCBhYm92ZS4gVGhlIG9mZnNldAorCSAqIHN0YXJ0cyBmcm9tIDAuCisJICovCisJQVNNX01BWF9PRkZTRVQgPSA3LAorfTsKKworZW51bSB7CisJV0FJVF9DTUQsCisJTk9fV0FJVF9DTUQKK307CisKKyNkZWZpbmUgQVNNX1NFVF9CSVQobiwgeCkJKG4gfD0gMSA8PCB4KQorI2RlZmluZSBBU01fVEVTVF9CSVQobiwgeCkJKChuID4+IHgpICYgMSkKKworLyogVE9ETywgY29tYmluZSB0aGVtIHRvZ2V0aGVyICovCitzdGF0aWMgREVGSU5FX01VVEVYKHNlc3Npb25fbG9jayk7CitzdHJ1Y3QgYXNtX21tYXAgeworCWF0b21pY190IHJlZl9jbnQ7CisJdm9pZCAqYXByOworfTsKKworc3RhdGljIHN0cnVjdCBhc21fbW1hcCB0aGlzX21tYXA7CisvKiBzZXNzaW9uIGlkOiAwIHJlc2VydmVkICovCitzdGF0aWMgc3RydWN0IGF1ZGlvX2NsaWVudCAqc2Vzc2lvbltBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCArIDFdOworCitzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJcGh5c19hZGRyX3QgYnVmX3BoeXNfYWRkcjsKKwl1aW50MzJfdCAgbW1hcF9oZGw7Cit9Oworc3RhdGljIGludDMyX3QgcTZhc21fc3J2Y19jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKK3N0YXRpYyBpbnQzMl90IHE2YXNtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOworc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKTsKK3N0YXRpYyB2b2lkIHE2YXNtX2FkZF9oZHJfY3VzdG9tX3RvcG9sb2d5KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgIHN0cnVjdCBhcHJfaGRyICpoZHIsCisJCQkJCSAgdWludDMyX3QgcGt0X3NpemUpOworc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcl9hc3luYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKTsKK3N0YXRpYyBpbnQgcTZhc21fbWVtb3J5X21hcF9yZWdpb25zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgZGlyLAorCQkJCXVpbnQzMl90IGJ1ZnN6LCB1aW50MzJfdCBidWZjbnQsCisJCQkJYm9vbCBpc19jb250aWd1b3VzKTsKK3N0YXRpYyBpbnQgcTZhc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpOworc3RhdGljIHZvaWQgcTZhc21fcmVzZXRfYnVmX3N0YXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKKworc3RhdGljIGludCBxNmFzbV9tYXBfY2hhbm5lbHModTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJYm9vbCB1c2VfYmFja19mbGF2b3IpOwordm9pZCAqcTZhc21fbW1hcF9hcHJfcmVnKHZvaWQpOworCitzdGF0aWMgaW50IHE2YXNtX2lzX3ZhbGlkX3Nlc3Npb24oc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdik7CitzdGF0aWMgaW50IHE2YXNtX2dldF9hc21fdG9wb2xvZ3lfY2FsKHZvaWQpOworc3RhdGljIGludCBxNmFzbV9nZXRfYXNtX2FwcF90eXBlX2NhbCh2b2lkKTsKKworLyogZm9yIEFTTSBjdXN0b20gdG9wb2xvZ3kgKi8KK3N0YXRpYyBzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbQVNNX01BWF9DQUxfVFlQRVNdOworc3RhdGljIHN0cnVjdCBhdWRpb19idWZmZXIgY29tbW9uX2J1ZlsyXTsKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50IGNvbW1vbl9jbGllbnQ7CitzdGF0aWMgaW50IHNldF9jdXN0b21fdG9wb2xvZ3k7CitzdGF0aWMgaW50IHRvcG9sb2d5X21hcF9oYW5kbGU7CisKK3N0cnVjdCBnZW5lcmljX2dldF9kYXRhXyB7CisJaW50IHZhbGlkOworCWludCBpc19pbmJhbmQ7CisJaW50IHNpemVfaW5faW50czsKKwlpbnQgaW50c1tdOworfTsKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19nZXRfZGF0YV8gKmdlbmVyaWNfZ2V0X2RhdGE7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKyNkZWZpbmUgT1VUX0JVRkZFUl9TSVpFIDU2CisjZGVmaW5lIElOX0JVRkZFUl9TSVpFIDI0CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBvdXRfY29sZF90djsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBvdXRfd2FybV90djsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBvdXRfY29udF90djsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBpbl9jb250X3R2Oworc3RhdGljIGxvbmcgb3V0X2VuYWJsZV9mbGFnOworc3RhdGljIGxvbmcgaW5fZW5hYmxlX2ZsYWc7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqb3V0X2RlbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppbl9kZW50cnk7CitzdGF0aWMgaW50IGluX2NvbnRfaW5kZXg7CisvKlRoaXMgdmFyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBmaXJzdCB3cml0ZSBkb25lIGZvciBjb2xkIG91dHB1dCBsYXRlbmN5ICovCitzdGF0aWMgaW50IG91dF9jb2xkX2luZGV4Oworc3RhdGljIGNoYXIgKm91dF9idWZmZXI7CitzdGF0aWMgY2hhciAqaW5fYnVmZmVyOworCitzdGF0aWMgaW5saW5lIHZvaWQgcTZhc21fc2V0X2ZsYWdfaW5fdG9rZW4odW5pb24gYXNtX3Rva2VuX3N0cnVjdCAqYXNtX3Rva2VuLAorCQkJCQkgICBpbnQgZmxhZywgaW50IGZsYWdfb2Zmc2V0KQoreworCWlmIChmbGFnKQorCQlBU01fU0VUX0JJVChhc21fdG9rZW4tPl90b2tlbi5mbGFncywgZmxhZ19vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBxNmFzbV9nZXRfZmxhZ19mcm9tX3Rva2VuKHVuaW9uIGFzbV90b2tlbl9zdHJ1Y3QgKmFzbV90b2tlbiwKKwkJCQkJICAgIGludCBmbGFnX29mZnNldCkKK3sKKwlyZXR1cm4gQVNNX1RFU1RfQklUKGFzbV90b2tlbi0+X3Rva2VuLmZsYWdzLCBmbGFnX29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxNmFzbV91cGRhdGVfdG9rZW4odTMyICp0b2tlbiwgdTggc2Vzc2lvbl9pZCwgdTggc3RyZWFtX2lkLAorCQkJCSAgICAgIHU4IGJ1Zl9pbmRleCwgdTggZGlyLCB1OCBub3dhaXRfZmxhZykKK3sKKwl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKKworCWFzbV90b2tlbi50b2tlbiA9IDA7CisJYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKwlhc21fdG9rZW4uX3Rva2VuLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKwlhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleCA9IGJ1Zl9pbmRleDsKKwlxNmFzbV9zZXRfZmxhZ19pbl90b2tlbigmYXNtX3Rva2VuLCBkaXIsIEFTTV9ESVJFQ1RJT05fT0ZGU0VUKTsKKwlxNmFzbV9zZXRfZmxhZ19pbl90b2tlbigmYXNtX3Rva2VuLCBub3dhaXRfZmxhZywKKwkJCQkgIEFTTV9DTURfTk9fV0FJVF9PRkZTRVQpOworCSp0b2tlbiA9IGFzbV90b2tlbi50b2tlbjsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBxNmFzbV9nZXRfcGNtX2Zvcm1hdF9pZCh1aW50MzJfdCBtZWRpYV9mb3JtYXRfYmxvY2tfdmVyKQoreworCXVpbnQzMl90IHBjbV9mb3JtYXRfaWQ7CisKKwlzd2l0Y2ggKG1lZGlhX2Zvcm1hdF9ibG9ja192ZXIpIHsKKwljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjQ6CisJCXBjbV9mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1Y0OworCQlicmVhazsKKwljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjM6CisJCXBjbV9mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzOworCQlicmVhazsKKwljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjI6CisJZGVmYXVsdDoKKwkJcGNtX2Zvcm1hdF9pZCA9IEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjI7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcGNtX2Zvcm1hdF9pZDsKK30KKworLyoKKyAqIHE2YXNtX2dldF9idWZfaW5kZXhfZnJvbV90b2tlbjoKKyAqICAgICAgIFJldHJpZXZlIGJ1ZmZlciBpbmRleCBmcm9tIHRva2VuLgorICoKKyAqIEB0b2tlbjogdG9rZW4gdmFsdWUgc2VudCB0byBBU00gc2VydmljZSBvbiBxNi4KKyAqIFJldHVybnMgYnVmZmVyIGluZGV4IGluIHRoZSByZWFkL3dyaXRlIGNvbW1hbmRzLgorICovCit1aW50OF90IHE2YXNtX2dldF9idWZfaW5kZXhfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbikKK3sKKwl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKKworCWFzbV90b2tlbi50b2tlbiA9IHRva2VuOworCXJldHVybiBhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleDsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fZ2V0X2J1Zl9pbmRleF9mcm9tX3Rva2VuKTsKKworLyoKKyAqIHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbjoKKyAqICAgICAgIFJldHJpZXZlIHN0cmVhbSBpZCBmcm9tIHRva2VuLgorICoKKyAqIEB0b2tlbjogdG9rZW4gdmFsdWUgc2VudCB0byBBU00gc2VydmljZSBvbiBxNi4KKyAqIFJldHVybnMgc3RyZWFtIGlkLgorICovCit1aW50OF90IHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbikKK3sKKwl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKKworCWFzbV90b2tlbi50b2tlbiA9IHRva2VuOworCXJldHVybiBhc21fdG9rZW4uX3Rva2VuLnN0cmVhbV9pZDsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fZ2V0X3N0cmVhbV9pZF9mcm9tX3Rva2VuKTsKKworc3RhdGljIGludCBhdWRpb19vdXRwdXRfbGF0ZW5jeV9kYmdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBzc2l6ZV90IGF1ZGlvX291dHB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKG91dF9idWZmZXIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBvdXRfYnVmZmVyIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCXNucHJpbnRmKG91dF9idWZmZXIsIE9VVF9CVUZGRVJfU0laRSwgIiVsZCwlbGQsJWxkLCVsZCwlbGQsJWxkLCIsCisJCW91dF9jb2xkX3R2LnR2X3NlYywgb3V0X2NvbGRfdHYudHZfdXNlYywgb3V0X3dhcm1fdHYudHZfc2VjLAorCQlvdXRfd2FybV90di50dl91c2VjLCBvdXRfY29udF90di50dl9zZWMsIG91dF9jb250X3R2LnR2X3VzZWMpOworCXJldHVybiAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBPVVRfQlVGRkVSX1NJWkUsIHBwb3MsCisJCQkJCQlvdXRfYnVmZmVyLCBPVVRfQlVGRkVSX1NJWkUpOworfQorc3RhdGljIHNzaXplX3QgYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICp0ZW1wOworCisJaWYgKGNvdW50ID4gMipzaXplb2YoY2hhcikpIHsKKwkJcHJfZXJyKCIlczogZXJyIGNvdW50IGlzIG1vcmUgJXpkXG4iLCBfX2Z1bmNfXywgY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGVtcCAgPSBrbWFsbG9jKDIqc2l6ZW9mKGNoYXIpLCBHRlBfS0VSTkVMKTsKKworCW91dF9jb2xkX2luZGV4ID0gMDsKKworCWlmICh0ZW1wKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih0ZW1wLCBidWYsIDIqc2l6ZW9mKGNoYXIpKSkgeworCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywgMipzaXplb2YoY2hhcikpOworCQkJa2ZyZWUodGVtcCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoIWtzdHJ0b2wodGVtcCwgMTAsICZvdXRfZW5hYmxlX2ZsYWcpKSB7CisJCQlrZnJlZSh0ZW1wKTsKKwkJCXJldHVybiBjb3VudDsKKwkJfQorCQlrZnJlZSh0ZW1wKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19vdXRwdXRfbGF0ZW5jeV9kZWJ1Z19mb3BzID0geworCS5vcGVuID0gYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfb3BlbiwKKwkucmVhZCA9IGF1ZGlvX291dHB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQsCisJLndyaXRlID0gYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUKK307CitzdGF0aWMgaW50IGF1ZGlvX2lucHV0X2xhdGVuY3lfZGJnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgc3NpemVfdCBhdWRpb19pbnB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGluX2J1ZmZlciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGluX2J1ZmZlciBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlzbnByaW50Zihpbl9idWZmZXIsIElOX0JVRkZFUl9TSVpFLCAiJWxkLCVsZCwiLAorCQkJCWluX2NvbnRfdHYudHZfc2VjLCBpbl9jb250X3R2LnR2X3VzZWMpOworCXJldHVybiAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBJTl9CVUZGRVJfU0laRSwgcHBvcywKKwkJCQkJCWluX2J1ZmZlciwgSU5fQlVGRkVSX1NJWkUpOworfQorc3RhdGljIHNzaXplX3QgYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnRlbXA7CisKKwlpZiAoY291bnQgPiAyKnNpemVvZihjaGFyKSkgeworCQlwcl9lcnIoIiVzOiBlcnIgY291bnQgaXMgbW9yZSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0ZW1wICA9IGttYWxsb2MoMipzaXplb2YoY2hhciksIEdGUF9LRVJORUwpOworCisJaWYgKHRlbXApIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHRlbXAsIGJ1ZiwgMipzaXplb2YoY2hhcikpKSB7CisJCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQgZm9yIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCAyKnNpemVvZihjaGFyKSk7CisJCQlrZnJlZSh0ZW1wKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmICgha3N0cnRvbCh0ZW1wLCAxMCwgJmluX2VuYWJsZV9mbGFnKSkgeworCQkJa2ZyZWUodGVtcCk7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJa2ZyZWUodGVtcCk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5wdXRfbGF0ZW5jeV9kZWJ1Z19mb3BzID0geworCS5vcGVuID0gYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc19vcGVuLAorCS5yZWFkID0gYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc19yZWFkLAorCS53cml0ZSA9IGF1ZGlvX2lucHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUKK307CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc193cml0ZV9jYih2b2lkKQoreworCWlmIChvdXRfZW5hYmxlX2ZsYWcpIHsKKwkJLyogRm9yIGZpcnN0IFdyaXRlIGRvbmUgbG9nIHRoZSB0aW1lIGFuZCByZXNldAorCQkgKiBvdXRfY29sZF9pbmRleAorCQkgKi8KKwkJaWYgKG91dF9jb2xkX2luZGV4ICE9IDEpIHsKKwkJCWRvX2dldHRpbWVvZmRheSgmb3V0X2NvbGRfdHYpOworCQkJcHJfZGVidWcoIkNPTEQ6IGFwcl9zZW5kX3BrdCBhdCAlbGQgc2VjICVsZCBtaWNyb3NlY1xuIiwKKwkJCQlvdXRfY29sZF90di50dl9zZWMsCisJCQkJb3V0X2NvbGRfdHYudHZfdXNlYyk7CisJCQlvdXRfY29sZF9pbmRleCA9IDE7CisJCX0KKwkJcHJfZGVidWcoIiVzOiBvdXRfZW5hYmxlX2ZsYWcgJWxkXG4iLAorCQkJX19mdW5jX18sIG91dF9lbmFibGVfZmxhZyk7CisJfQorfQorc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX3JlYWRfY2Iodm9pZCkKK3sKKwlpZiAoaW5fZW5hYmxlX2ZsYWcpIHsKKwkJLyogd2hlbiBpbl9jb250X2luZGV4ID09IDcsIERTUCB3b3VsZCBiZQorCQkgKiB3cml0aW5nIGludG8gdGhlIDh0aCA1MTIgYnl0ZSBidWZmZXIgYW5kIHRoaXMKKwkJICogdGltZXN0YW1wIGlzIHRhcHBlZCBoZXJlLk9uY2UgZG9uZSBpdCB0aGVuIHdyaXRlcworCQkgKiB0byA5dGggNTEyIGJ5dGUgYnVmZmVyLlRoZXNlIHR3byBidWZmZXJzKDh0aCwgOXRoKQorCQkgKiByZWFjaCB0aGUgdGVzdCBhcHBsaWNhdGlvbiBpbiA1dGggaXRlcmF0aW9uIGFuZCB0aGF0CisJCSAqIHRpbWVzdGFtcCBpcyB0YXBwZWQgYXQgdXNlciBsZXZlbC4gVGhlIGRpZmZlcmVuY2UKKwkJICogb2YgdGhlc2UgdHdvIHRpbWVzdGFtcHMgZ2l2ZXMgdXMgdGhlIHRpbWUgYmV0d2VlbgorCQkgKiB0aGUgdGltZSBhdCB3aGljaCBkc3Agc3RhcnRlZCBmaWxsaW5nIHRoZSBzYW1wbGUKKwkJICogcmVxdWlyZWQgYW5kIHdoZW4gaXQgcmVhY2hlZCB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KKwkJICogSGVuY2UgY29udGludW91cyBpbnB1dCBsYXRlbmN5CisJCSAqLworCQlpZiAoaW5fY29udF9pbmRleCA9PSA3KSB7CisJCQlkb19nZXR0aW1lb2ZkYXkoJmluX2NvbnRfdHYpOworCQkJcHJfaW5mbygiJXM6IHJlYWQgYnVmZmVyIGF0ICVsZCBzZWMgJWxkIG1pY3Jvc2VjXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWluX2NvbnRfdHYudHZfc2VjLCBpbl9jb250X3R2LnR2X3VzZWMpOworCQl9CisJCWluX2NvbnRfaW5kZXgrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19yZXNldF9pbmRleCh2b2lkKQoreworCWluX2NvbnRfaW5kZXggPSAwOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcnVuKHZvaWQpCit7CisJaWYgKG91dF9lbmFibGVfZmxhZykgeworCQlkb19nZXR0aW1lb2ZkYXkoJm91dF9jb2xkX3R2KTsKKwkJcHJfZGVidWcoIiVzOiBDT0xEIGFwcl9zZW5kX3BrdCBhdCAlbGQgc2VjICVsZCBtaWNyb3NlY1xuIiwKKwkJCV9fZnVuY19fLCBvdXRfY29sZF90di50dl9zZWMsIG91dF9jb2xkX3R2LnR2X3VzZWMpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX3dyaXRlKHN0cnVjdCBhdWRpb19idWZmZXIgKmFiKQoreworCWlmIChvdXRfZW5hYmxlX2ZsYWcpIHsKKwkJY2hhciB6ZXJvX3BhdHRlcm5bMl0gPSB7MHgwMCwgMHgwMH07CisJCS8qIElmIEZpcnN0IHR3byBieXRlIGlzIG5vbiB6ZXJvIGFuZCBsYXN0IHR3byBieXRlCisJCSAqIGlzIHplcm8gdGhlbiBpdCBpcyB3YXJtIG91dHB1dCBwYXR0ZXJuCisJCSAqLworCQlpZiAoKHN0cmNtcCgoKGNoYXIgKilhYi0+ZGF0YSksIHplcm9fcGF0dGVybikpICYmCisJCSghc3RyY21wKCgoY2hhciAqKWFiLT5kYXRhICsgMiksIHplcm9fcGF0dGVybikpKSB7CisJCQlkb19nZXR0aW1lb2ZkYXkoJm91dF93YXJtX3R2KTsKKwkJCXByX2RlYnVnKCIlczogV0FSTTphcHJfc2VuZF9wa3QgYXQgJWxkIHNlYyAlbGQgbWljcm9zZWNcbiIsCisJCQkgX19mdW5jX18sCisJCQkgb3V0X3dhcm1fdHYudHZfc2VjLAorCQkJb3V0X3dhcm1fdHYudHZfdXNlYyk7CisJCQlwcl9kZWJ1ZygiJXM6IFdhcm0gUGF0dGVybiBNYXRjaGVkXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwkJLyogSWYgRmlyc3QgdHdvIGJ5dGUgaXMgemVybyBhbmQgbGFzdCB0d28gYnl0ZSBpcworCQkgKiBub24gemVybyB0aGVuIGl0IGlzIGNvbnQgb3V0cHV0IHBhdHRlcm4KKwkJICovCisJCWVsc2UgaWYgKCghc3RyY21wKCgoY2hhciAqKWFiLT5kYXRhKSwgemVyb19wYXR0ZXJuKSkKKwkJJiYgKHN0cmNtcCgoKGNoYXIgKilhYi0+ZGF0YSArIDIpLCB6ZXJvX3BhdHRlcm4pKSkgeworCQkJZG9fZ2V0dGltZW9mZGF5KCZvdXRfY29udF90dik7CisJCQlwcl9kZWJ1ZygiJXM6IENPTlQ6YXByX3NlbmRfcGt0IGF0ICVsZCBzZWMgJWxkIG1pY3Jvc2VjXG4iLAorCQkJX19mdW5jX18sCisJCQlvdXRfY29udF90di50dl9zZWMsCisJCQlvdXRfY29udF90di50dl91c2VjKTsKKwkJCXByX2RlYnVnKCIlczogQ29udCBQYXR0ZXJuIE1hdGNoZWRcbiIsIF9fZnVuY19fKTsKKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCit7CisJb3V0X2J1ZmZlciA9IGt6YWxsb2MoT1VUX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAob3V0X2J1ZmZlciA9PSBOVUxMKQorCQlnb3RvIG91dGJ1Zl9mYWlsOworCisJaW5fYnVmZmVyID0ga3phbGxvYyhJTl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluX2J1ZmZlciA9PSBOVUxMKQorCQlnb3RvIGluYnVmX2ZhaWw7CisKKwlvdXRfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXVkaW9fb3V0X2xhdGVuY3lfbWVhc3VyZW1lbnRfbm9kZSIsCisJCQkJMDY2NCwKKwkJCQlOVUxMLCBOVUxMLCAmYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGVidWdfZm9wcyk7CisJaWYgKElTX0VSUihvdXRfZGVudHJ5KSkgeworCQlwcl9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZpbGVfZmFpbDsKKwl9CisJaW5fZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXVkaW9faW5fbGF0ZW5jeV9tZWFzdXJlbWVudF9ub2RlIiwKKwkJCQkwNjY0LAorCQkJCU5VTEwsIE5VTEwsICZhdWRpb19pbnB1dF9sYXRlbmN5X2RlYnVnX2ZvcHMpOworCWlmIChJU19FUlIoaW5fZGVudHJ5KSkgeworCQlwcl9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZpbGVfZmFpbDsKKwl9CisJcmV0dXJuOworZmlsZV9mYWlsOgorCWtmcmVlKGluX2J1ZmZlcik7CitpbmJ1Zl9mYWlsOgorCWtmcmVlKG91dF9idWZmZXIpOworb3V0YnVmX2ZhaWw6CisJaW5fYnVmZmVyID0gTlVMTDsKKwlvdXRfYnVmZmVyID0gTlVMTDsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfd3JpdGUoc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIpCit7Cit9CitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcnVuKHZvaWQpCit7Cit9CitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcmVzZXRfaW5kZXgodm9pZCkKK3sKK30KK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19yZWFkX2NiKHZvaWQpCit7Cit9CitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfd3JpdGVfY2Iodm9pZCkKK3sKK30KK3N0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCit7Cit9CisjZW5kaWYKKworaW50IHE2YXNtX21tYXBfYXByX2RlcmVnKHZvaWQpCit7CisJaW50IGM7CisKKwljID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwgJnRoaXNfbW1hcC5yZWZfY250KTsKKwlpZiAoYyA9PSAwKSB7CisJCWFwcl9kZXJlZ2lzdGVyKHRoaXNfbW1hcC5hcHIpOworCQljb21tb25fY2xpZW50Lm1tYXBfYXByID0gTlVMTDsKKwkJcHJfZGVidWcoIiVzOiBBUFIgRGUtUmVnaXN0ZXIgY29tbW9uIHBvcnRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKGMgPCAwKSB7CisJCXByX2VycigiJXM6IEFQUiBDb21tb24gUG9ydCBBbHJlYWR5IENsb3NlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjKTsKKwkJYXRvbWljX3NldCgmdGhpc19tbWFwLnJlZl9jbnQsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHE2YXNtX3Nlc3Npb25fYWxsb2Moc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAxOyBuIDw9IEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEOyBuKyspIHsKKwkJaWYgKCFzZXNzaW9uW25dKSB7CisJCQlzZXNzaW9uW25dID0gYWM7CisJCQlyZXR1cm4gbjsKKwkJfQorCX0KKwlwcl9lcnIoIiVzOiBzZXNzaW9uIG5vdCBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGJvb2wgcTZhc21faXNfdmFsaWRfYXVkaW9fY2xpZW50KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCWludCBuOworCisJZm9yIChuID0gMTsgbiA8PSBBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRDsgbisrKSB7CisJCWlmIChzZXNzaW9uW25dID09IGFjKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxNmFzbV9zZXNzaW9uX2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uaWRbJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOworCXJ0YWNfcmVtb3ZlX3BvcHBfZnJvbV9hZG1fZGV2aWNlcyhhYy0+c2Vzc2lvbik7CisJc2Vzc2lvblthYy0+c2Vzc2lvbl0gPSAwOworCWFjLT5zZXNzaW9uID0gMDsKKwlhYy0+cGVyZl9tb2RlID0gTEVHQUNZX1BDTV9NT0RFOworCWFjLT5mcHRyX2NhY2hlX29wcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBxNmFzbV9nZXRfbmV4dF9idWYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCXVpbnQzMl90IGN1cnJfYnVmLCB1aW50MzJfdCBtYXhfYnVmX2NudCkKK3sKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IGN1cnJfYnVmID0gJWQsIG1heF9idWZfY250ID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY3Vycl9idWYsIG1heF9idWZfY250KTsKKwljdXJyX2J1ZiArPSAxOworCXJldHVybiAoY3Vycl9idWYgPj0gbWF4X2J1Zl9jbnQpID8gMCA6IGN1cnJfYnVmOworfQorCitzdGF0aWMgaW50IHE2YXNtX21hcF9jYWxfbWVtb3J5KGludDMyX3QgY2FsX3R5cGUsCisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IE5vIGFkZHJlc3MgdG8gbWFwIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWNvbW1vbl9jbGllbnQubW1hcF9hcHIgPSBxNmFzbV9tbWFwX2Fwcl9yZWcoKTsKKwlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHE2YXNtX21tYXBfYXByX3JlZyBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FUEVSTTsKKwkJZ290byBkb25lOworCX0KKwljb21tb25fY2xpZW50LmFwciA9IGNvbW1vbl9jbGllbnQubW1hcF9hcHI7CisJaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IG1hcCBzaXplIGlzIDAhXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVXNlIHNlY29uZCBhc20gYnVmIHRvIG1hcCBtZW1vcnkgKi8KKwlpZiAoY29tbW9uX2NsaWVudC5wb3J0W0lOXS5idWYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjb21tb24gYnVmIGlzIE5VTExcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljb21tb25fY2xpZW50LnBvcnRbSU5dLmJ1Zi0+cGh5cyA9IGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHI7CisKKwlyZXN1bHQgPSBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJmNvbW1vbl9jbGllbnQsCisJCQlJTiwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgMSwgMSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyKCIlczogbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlemQgcmVzdWx0ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCByZXN1bHQpOworCQlwcl9kZWJ1ZygiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBhZGRyID0gMHglcEssIHNpemUgPSAlemRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAorCQkmY29tbW9uX2NsaWVudC5wb3J0W0lOXS5tZW1fbWFwX2hhbmRsZSkgeworCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpIHsKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gIGJ1Zl9ub2RlLT5tbWFwX2hkbDsKKwkJCWJyZWFrOworCQl9CisJfQorZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJlbWFwX2NhbF9kYXRhKGludDMyX3QgY2FsX3R5cGUsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXQgPSAwOworCisJaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5vIElPTiBhbGxvY2F0aW9uIGZvciBjYWwgdHlwZSAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKKwkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7CisKKwkJcmV0ID0gcTZhc21fbWFwX2NhbF9tZW1vcnkoY2FsX3R5cGUsIGNhbF9ibG9jayk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcTZhc21fdW5tYXBfY2FsX21lbW9yeShpbnQzMl90IGNhbF90eXBlLAorCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludAkJCXJlc3VsdCA9IDA7CisJaW50CQkJcmVzdWx0MiA9IDA7CisKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBObyBhZGRyZXNzIHRvIHVubWFwIVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb21tb25fY2xpZW50Lm1tYXBfYXByID09IE5VTEwpIHsKKwkJY29tbW9uX2NsaWVudC5tbWFwX2FwciA9IHE2YXNtX21tYXBfYXByX3JlZygpOworCQlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBxNmFzbV9tbWFwX2Fwcl9yZWcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXJlc3VsdDIgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwgSU4pOworCWlmIChyZXN1bHQyIDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bm1hcCBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQyKTsKKwkJcmVzdWx0ID0gcmVzdWx0MjsKKwl9CisKKwljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBxNmFzbV91bm1hcF9jYWxfZGF0YShpbnQgY2FsX3R5cGUsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludCByZXQgPSAwOworCisJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKKwkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlICE9IDApKSB7CisKKwkJcmV0ID0gcTZhc21fdW5tYXBfY2FsX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBzZW5kX2FzbV9jdXN0b21fdG9wb2xvZ3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgY21kX3NldF90b3BvbG9naWVzCWFzbV90b3A7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDEgPSAwOworCisJaWYgKGNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0gPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJbXV0ZXhfbG9jaygmY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7CisJaWYgKCFzZXRfY3VzdG9tX3RvcG9sb2d5KQorCQlnb3RvIHVubG9jazsKKwlzZXRfY3VzdG9tX3RvcG9sb2d5ID0gMDsKKworCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIHVubG9jazsKKworCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IE5vIGNhbCB0byBzZW5kIVxuIiwgX19mdW5jX18pOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgY2FsX2luZGV4ICVkXG4iLCBfX2Z1bmNfXywgQVNNX0NVU1RPTV9UT1BfQ0FMKTsKKworCXJlc3VsdCA9IHJlbWFwX2NhbF9kYXRhKEFTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLCBjYWxfYmxvY2spOworCWlmIChyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIEFTTV9DVVNUT01fVE9QX0NBTCk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXE2YXNtX2FkZF9oZHJfY3VzdG9tX3RvcG9sb2d5KGFjLCAmYXNtX3RvcC5oZHIsIHNpemVvZihhc21fdG9wKSk7CisJYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOworCWFzbV90b3AuaGRyLm9wY29kZSA9IEFTTV9DTURfQUREX1RPUE9MT0dJRVM7CisJYXNtX3RvcC5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwlhc21fdG9wLnBheWxvYWRfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWFzbV90b3AubWVtX21hcF9oYW5kbGUgPSBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKKwlhc21fdG9wLnBheWxvYWRfc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCSBwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgQVNNX0NNRF9BRERfVE9QT0xPR0lFUyBwYXlsb2FkID0gJXBLLCBzaXplID0gJWQsIG1hcCBoYW5kbGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCisJCWFzbV90b3AucGF5bG9hZF9zaXplLCBhc21fdG9wLm1lbV9tYXBfaGFuZGxlKTsKKworCXJlc3VsdCA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmFzbV90b3ApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCB0b3BvbG9naWVzIGZhaWxlZCByZXN1bHQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcHJfZGVidWcoIiVzOiBTZXQgdG9wb2xvZ2llcyBmYWlsZWQgcGF5bG9hZCA9IDB4JXBLXG4iLAorCQkJX19mdW5jX18sICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwkJZ290byB1bm1hcDsKKworCX0KKworCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+bWVtX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJlc3VsdCkgeworCQlwcl9lcnIoIiVzOiBTZXQgdG9wb2xvZ2llcyBmYWlsZWQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IFNldCB0b3BvbG9naWVzIGZhaWxlZCBhZnRlciB0aW1lZG91dCBwYXlsb2FkID0gMHglcEtcbiIsCisJCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCQlnb3RvIHVubWFwOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7CisJCXJlc3VsdCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpOworCQlnb3RvIHVubWFwOworCX0KKwordW5tYXA6CisJcmVzdWx0MSA9IHE2YXNtX3VubWFwX2NhbF9tZW1vcnkoQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCisJCWNhbF9ibG9jayk7CisJaWYgKHJlc3VsdDEgPCAwKSB7CisJCXJlc3VsdCA9IHJlc3VsdDE7CisJCXByX2RlYnVnKCIlczogdW5tYXAgY2FsIGZhaWxlZCEgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOworCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcTZhc21fbWFwX3J0YWNfYmxvY2soc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYWxfYmxvY2sgaXMgTlVMTCFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogTm8gYWRkcmVzcyB0byBtYXAhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvbW1vbl9jbGllbnQubW1hcF9hcHIgPT0gTlVMTCkgeworCQljb21tb25fY2xpZW50Lm1tYXBfYXByID0gcTZhc21fbW1hcF9hcHJfcmVnKCk7CisJCWlmIChjb21tb25fY2xpZW50Lm1tYXBfYXByID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IHE2YXNtX21tYXBfYXByX3JlZyBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IG1hcCBzaXplIGlzIDAhXG4iLAorCQkJX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVXNlIHNlY29uZCBhc20gYnVmIHRvIG1hcCBtZW1vcnkgKi8KKwlpZiAoY29tbW9uX2NsaWVudC5wb3J0W09VVF0uYnVmID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY29tbW9uIGJ1ZiBpcyBOVUxMXG4iLAorCQkJX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJY29tbW9uX2NsaWVudC5wb3J0W09VVF0uYnVmLT5waHlzID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcjsKKworCXJlc3VsdCA9IHE2YXNtX21lbW9yeV9tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwKKwkJCU9VVCwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgMSwgMSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyKCIlczogbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlZCByZXN1bHQgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJlc3VsdCk7CisJCXByX2RlYnVnKCIlczogbW1hcCBkaWQgbm90IHdvcmshIGFkZHIgPSAweCVwSywgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOworCQlnb3RvIGRvbmU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJJmNvbW1vbl9jbGllbnQucG9ydFtPVVRdLm1lbV9tYXBfaGFuZGxlKSB7CisJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJCWxpc3QpOworCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcikgeworCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfaGFuZGxlID0gIGJ1Zl9ub2RlLT5tbWFwX2hkbDsKKwkJCWJyZWFrOworCQl9CisJfQorZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcTZhc21fdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDIgPSAwOworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKG1lbV9tYXBfaGFuZGxlID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKm1lbV9tYXBfaGFuZGxlID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIDAsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7CisJCWNvbW1vbl9jbGllbnQubW1hcF9hcHIgPSBxNmFzbV9tbWFwX2Fwcl9yZWcoKTsKKwkJaWYgKGNvbW1vbl9jbGllbnQubW1hcF9hcHIgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogcTZhc21fbW1hcF9hcHJfcmVnIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKworCXJlc3VsdDIgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwgT1VUKTsKKwlpZiAocmVzdWx0MiA8IDApIHsKKwkJcHJfZXJyKCIlczogdW5tYXAgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0Mik7CisJCXJlc3VsdCA9IHJlc3VsdDI7CisJfSBlbHNlIHsKKwkJbWVtX21hcF9oYW5kbGUgPSAwOworCX0KKworCXJlc3VsdDIgPSBxNmFzbV9tbWFwX2Fwcl9kZXJlZygpOworCWlmIChyZXN1bHQyIDwgMCkgeworCQlwcl9lcnIoIiVzOiBxNmFzbV9tbWFwX2Fwcl9kZXJlZyBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQyKTsKKwkJcmVzdWx0ID0gcmVzdWx0MjsKKwl9Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWUodW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJaW50IGNudCA9IDA7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogU2Vzc2lvbiBpZCAlZFxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKwltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07CisJCWlmICghcG9ydC0+YnVmKSB7CisJCQlwcl9lcnIoIiVzOiBidWYgTlVMTFxuIiwgX19mdW5jX18pOworCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY250ID0gcG9ydC0+bWF4X2J1Zl9jbnQgLSAxOworCisJCWlmIChjbnQgPj0gMCkgeworCQkJcmMgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhhYywgZGlyKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcHJfZXJyKCIlczogTWVtb3J5X3VubWFwX3JlZ2lvbnMgZmFpbGVkICVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXywgcmMpOworCQl9CisKKwkJd2hpbGUgKGNudCA+PSAwKSB7CisJCQlpZiAocG9ydC0+YnVmW2NudF0uZGF0YSkgeworCQkJCWlmICghcmMgfHwgYXRvbWljX3JlYWQoJmFjLT5yZXNldCkpCisJCQkJCW1zbV9hdWRpb19pb25fZnJlZSgKKwkJCQkJCXBvcnQtPmJ1ZltjbnRdLmNsaWVudCwKKwkJCQkJCXBvcnQtPmJ1ZltjbnRdLmhhbmRsZSk7CisKKwkJCQlwb3J0LT5idWZbY250XS5jbGllbnQgPSBOVUxMOworCQkJCXBvcnQtPmJ1ZltjbnRdLmhhbmRsZSA9IE5VTEw7CisJCQkJcG9ydC0+YnVmW2NudF0uZGF0YSA9IE5VTEw7CisJCQkJcG9ydC0+YnVmW2NudF0ucGh5cyA9IDA7CisJCQkJLS0ocG9ydC0+bWF4X2J1Zl9jbnQpOworCQkJfQorCQkJLS1jbnQ7CisJCX0KKwkJa2ZyZWUocG9ydC0+YnVmKTsKKwkJcG9ydC0+YnVmID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJaW50IGNudCA9IDA7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogU2Vzc2lvbiBpZCAlZFxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKwltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKKwlpZiAoIXBvcnQtPmJ1ZikgeworCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJCXJldHVybiAwOworCX0KKwljbnQgPSBwb3J0LT5tYXhfYnVmX2NudCAtIDE7CisKKwlpZiAoY250ID49IDApIHsKKwkJcmMgPSBxNmFzbV9tZW1vcnlfdW5tYXAoYWMsIHBvcnQtPmJ1ZlswXS5waHlzLCBkaXIpOworCQlpZiAocmMgPCAwKQorCQkJcHJfZXJyKCIlczogTWVtb3J5X3VubWFwX3JlZ2lvbnMgZmFpbGVkICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCByYyk7CisJfQorCisJaWYgKHBvcnQtPmJ1ZlswXS5kYXRhKSB7CisJCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS10gLCBjbGllbnRbJXBLXSBoYW5kbGVbJXBLXVxuIiwKKwkJCV9fZnVuY19fLAorCQkJcG9ydC0+YnVmWzBdLmRhdGEsCisJCQkmcG9ydC0+YnVmWzBdLnBoeXMsCisJCQkmcG9ydC0+YnVmWzBdLnBoeXMsCisJCQlwb3J0LT5idWZbMF0uY2xpZW50LAorCQkJcG9ydC0+YnVmWzBdLmhhbmRsZSk7CisJCWlmICghcmMgfHwgYXRvbWljX3JlYWQoJmFjLT5yZXNldCkpCisJCQltc21fYXVkaW9faW9uX2ZyZWUocG9ydC0+YnVmWzBdLmNsaWVudCwKKwkJCQkJICAgcG9ydC0+YnVmWzBdLmhhbmRsZSk7CisJCXBvcnQtPmJ1ZlswXS5jbGllbnQgPSBOVUxMOworCQlwb3J0LT5idWZbMF0uaGFuZGxlID0gTlVMTDsKKwl9CisKKwl3aGlsZSAoY250ID49IDApIHsKKwkJcG9ydC0+YnVmW2NudF0uZGF0YSA9IE5VTEw7CisJCXBvcnQtPmJ1ZltjbnRdLnBoeXMgPSAwOworCQljbnQtLTsKKwl9CisJcG9ydC0+bWF4X2J1Zl9jbnQgPSAwOworCWtmcmVlKHBvcnQtPmJ1Zik7CisJcG9ydC0+YnVmID0gTlVMTDsKKwltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IGxvb3BjbnQ7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKKworCWlmICghYWMpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLXG4iLCBfX2Z1bmNfXywgYWMpOworCQlyZXR1cm47CisJfQorCWlmICghYWMtPnNlc3Npb24pIHsKKwkJcHJfZXJyKCIlczogYWMgc2Vzc2lvbiBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOworCisJcHJfZGVidWcoIiVzOiBTZXNzaW9uIGlkICVkXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlmb3IgKGxvb3BjbnQgPSAwOyBsb29wY250IDw9IE9VVDsgbG9vcGNudCsrKSB7CisJCQlwb3J0ID0gJmFjLT5wb3J0W2xvb3BjbnRdOworCQkJaWYgKCFwb3J0LT5idWYpCisJCQkJY29udGludWU7CisJCQlwcl9kZWJ1ZygiJXM6IGxvb3BjbnQgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbG9vcGNudCk7CisJCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWUobG9vcGNudCwgYWMpOworCQl9CisJfQorCisJcnRhY19zZXRfYXNtX2hhbmRsZShhYy0+c2Vzc2lvbiwgTlVMTCk7CisJYXByX2RlcmVnaXN0ZXIoYWMtPmFwcjIpOworCWFwcl9kZXJlZ2lzdGVyKGFjLT5hcHIpOworCXE2YXNtX21tYXBfYXByX2RlcmVnKCk7CisJYWMtPmFwcjIgPSBOVUxMOworCWFjLT5hcHIgPSBOVUxMOworCWFjLT5tbWFwX2FwciA9IE5VTEw7CisJcTZhc21fc2Vzc2lvbl9mcmVlKGFjKTsKKworCXByX2RlYnVnKCIlczogQVBSIERlLVJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CisKKy8qZG9uZToqLworCWtmcmVlKGFjKTsKKwlhYyA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOworfQorCitpbnQgcTZhc21fc2V0X2lvX21vZGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IG1vZGUxKQoreworCXVpbnQzMl90IG1vZGU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWMtPmlvX21vZGUgJj0gMHhGRjAwOworCW1vZGUgPSAobW9kZTEgJiAweEYpOworCisJcHJfZGVidWcoIiVzOiBhYy0+bW9kZSBhZnRlciBhbmRpbmcgd2l0aCBGRjAwOjB4JXgsXG4iLAorCQlfX2Z1bmNfXywgYWMtPmlvX21vZGUpOworCisJaWYgKChtb2RlID09IEFTWU5DX0lPX01PREUpIHx8IChtb2RlID09IFNZTkNfSU9fTU9ERSkpIHsKKwkJYWMtPmlvX21vZGUgfD0gbW9kZTE7CisJCXByX2RlYnVnKCIlczogU2V0IE1vZGUgdG8gMHgleFxuIiwgX19mdW5jX18sIGFjLT5pb19tb2RlKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBOb3QgYW4gdmFsaWQgSU8gTW9kZTolZFxuIiwgX19mdW5jX18sIGFjLT5pb19tb2RlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpxNmFzbV9tbWFwX2Fwcl9yZWcodm9pZCkKK3sKKwlpZiAoKGF0b21pY19yZWFkKCZ0aGlzX21tYXAucmVmX2NudCkgPT0gMCkgfHwKKwkgICAgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkpIHsKKwkJdGhpc19tbWFwLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBU00iLAorCQkJCQkoYXByX2ZuKXE2YXNtX3NydmNfY2FsbGJhY2ssCisJCQkJCTB4MEZGRkZGRkZGLCAmdGhpc19tbWFwKTsKKwkJaWYgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkgeworCQkJcHJfZGVidWcoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQVBSIEFTTSBjb21tb24gcG9ydFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJYXRvbWljX2luYygmdGhpc19tbWFwLnJlZl9jbnQpOworCisJcmV0dXJuIHRoaXNfbW1hcC5hcHI7CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoYXBwX2NiIGNiLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOworCWludCBuOworCWludCBsY250ID0gMDsKKwlpbnQgcmMgPSAwOworCisJYWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhYykKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOworCW4gPSBxNmFzbV9zZXNzaW9uX2FsbG9jKGFjKTsKKwlpZiAobiA8PSAwKSB7CisJCXByX2VycigiJXM6IEFTTSBTZXNzaW9uIGFsbG9jIGZhaWwgbj0lZFxuIiwgX19mdW5jX18sIG4pOworCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJCWdvdG8gZmFpbF9zZXNzaW9uOworCX0KKwlhYy0+c2Vzc2lvbiA9IG47CisJYWMtPmNiID0gY2I7CisJYWMtPnBhdGhfZGVsYXkgPSBVSU5UX01BWDsKKwlhYy0+cHJpdiA9IHByaXY7CisJYWMtPmlvX21vZGUgPSBTWU5DX0lPX01PREU7CisJYWMtPnBlcmZfbW9kZSA9IExFR0FDWV9QQ01fTU9ERTsKKwlhYy0+ZnB0cl9jYWNoZV9vcHMgPSBOVUxMOworCS8qIERTUCBleHBlY3RzIHN0cmVhbSBpZCBmcm9tIDEgKi8KKwlhYy0+c3RyZWFtX2lkID0gMTsKKwlhYy0+YXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkFTTSIsCisJCQkoYXByX2ZuKXE2YXNtX2NhbGxiYWNrLAorCQkJKChhYy0+c2Vzc2lvbikgPDwgOCB8IDB4MDAwMSksCisJCQlhYyk7CisKKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFJlZ2lzdHJhdGlvbiB3aXRoIEFQUiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOworCQlnb3RvIGZhaWxfYXByMTsKKwl9CisJYWMtPmFwcjIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQVNNIiwKKwkJCShhcHJfZm4pcTZhc21fY2FsbGJhY2ssCisJCQkoKGFjLT5zZXNzaW9uKSA8PCA4IHwgMHgwMDAyKSwKKwkJCWFjKTsKKworCWlmIChhYy0+YXByMiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IFJlZ2lzdHJhdGlvbiB3aXRoIEFQUi0yIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJCWdvdG8gZmFpbF9hcHIyOworCX0KKworCXJ0YWNfc2V0X2FzbV9oYW5kbGUobiwgYWMtPmFwcik7CisKKwlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIHRoZSBjb21tb24gcG9ydCB3aXRoIEFQUlxuIiwgX19mdW5jX18pOworCWFjLT5tbWFwX2FwciA9IHE2YXNtX21tYXBfYXByX3JlZygpOworCWlmIChhYy0+bW1hcF9hcHIgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJCWdvdG8gZmFpbF9tbWFwOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFjLT5jbWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWMtPnRpbWVfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWMtPm1lbV93YWl0KTsKKwlhdG9taWNfc2V0KCZhYy0+dGltZV9mbGFnLCAxKTsKKwlhdG9taWNfc2V0KCZhYy0+cmVzZXQsIDApOworCUlOSVRfTElTVF9IRUFEKCZhYy0+cG9ydFswXS5tZW1fbWFwX2hhbmRsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmFjLT5wb3J0WzFdLm1lbV9tYXBfaGFuZGxlKTsKKwlwcl9kZWJ1ZygiJXM6IG1lbV9tYXBfaGFuZGxlIGxpc3QgaW5pdCdlZFxuIiwgX19mdW5jX18pOworCW11dGV4X2luaXQoJmFjLT5jbWRfbG9jayk7CisJZm9yIChsY250ID0gMDsgbGNudCA8PSBPVVQ7IGxjbnQrKykgeworCQltdXRleF9pbml0KCZhYy0+cG9ydFtsY250XS5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmFjLT5wb3J0W2xjbnRdLmRzcF9sb2NrKTsKKwl9CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMCk7CisJYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgMCk7CisKKwlyYyA9IHNlbmRfYXNtX2N1c3RvbV90b3BvbG9neShhYyk7CisJaWYgKHJjIDwgMCkgeworCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisJCWdvdG8gZmFpbF9tbWFwOworCX0KKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7CisKKwltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7CisKKwlyZXR1cm4gYWM7CitmYWlsX21tYXA6CisJYXByX2RlcmVnaXN0ZXIoYWMtPmFwcjIpOworZmFpbF9hcHIyOgorCWFwcl9kZXJlZ2lzdGVyKGFjLT5hcHIpOworZmFpbF9hcHIxOgorCXE2YXNtX3Nlc3Npb25fZnJlZShhYyk7CitmYWlsX3Nlc3Npb246CisJa2ZyZWUoYWMpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmFzbV9nZXRfYXVkaW9fY2xpZW50KGludCBzZXNzaW9uX2lkKQoreworCWlmIChzZXNzaW9uX2lkID09IEFTTV9DT05UUk9MX1NFU1NJT04pCisJCXJldHVybiAmY29tbW9uX2NsaWVudDsKKworCWlmICgoc2Vzc2lvbl9pZCA8PSAwKSB8fCAoc2Vzc2lvbl9pZCA+IEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEKSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb246ICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghc2Vzc2lvbltzZXNzaW9uX2lkXSkgeworCQlwcl9lcnIoIiVzOiBzZXNzaW9uIG5vdCBhY3RpdmU6ICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gc2Vzc2lvbltzZXNzaW9uX2lkXTsKK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2ModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAorCQkJdWludDMyX3QgYnVmY250KQoreworCWludCBjbnQgPSAwOworCWludCByYyA9IDA7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOworCXNpemVfdCBsZW47CisKKwlpZiAoIShhYykgfHwgIShidWZzeikgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLIGJ1ZnN6ICVkIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBidWZzeiwKKwkJCWRpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1idWZzelslZF1idWZjbnRbJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24sCisJCWJ1ZnN6LCBidWZjbnQpOworCisJaWYgKGFjLT5zZXNzaW9uIDw9IDAgfHwgYWMtPnNlc3Npb24gPiA4KSB7CisJCXByX2VycigiJXM6IFNlc3Npb24gSUQgaXMgaW52YWxpZCwgc2Vzc2lvbiA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWFjLT5zZXNzaW9uKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlpZiAoYWMtPnBvcnRbZGlyXS5idWYpIHsKKwkJCXByX2RlYnVnKCIlczogYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCQlpZiAoYnVmY250ID4gKFUzMl9NQVgvc2l6ZW9mKHN0cnVjdCBhdWRpb19idWZmZXIpKSkgeworCQkJcHJfZXJyKCIlczogQnVmZmVyIHNpemUgb3ZlcmZsb3dzIiwgX19mdW5jX18pOworCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQkJZ290byBmYWlsOworCQl9CisJCWJ1ZiA9IGt6YWxsb2MoKChzaXplb2Yoc3RydWN0IGF1ZGlvX2J1ZmZlcikpKmJ1ZmNudCksCisJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFidWYpIHsKKwkJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWFjLT5wb3J0W2Rpcl0uYnVmID0gYnVmOworCisJCXdoaWxlIChjbnQgPCBidWZjbnQpIHsKKwkJCWlmIChidWZzeiA+IDApIHsKKwkJCQlpZiAoIWJ1ZltjbnRdLmRhdGEpIHsKKwkJCQkJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJhc21fY2xpZW50IiwKKwkJCQkJJmJ1ZltjbnRdLmNsaWVudCwgJmJ1ZltjbnRdLmhhbmRsZSwKKwkJCQkJICAgICAgYnVmc3osCisJCQkJCSAgICAgIChpb25fcGh5c19hZGRyX3QgKikmYnVmW2NudF0ucGh5cywKKwkJCQkJICAgICAgJmxlbiwKKwkJCQkJICAgICAgJmJ1ZltjbnRdLmRhdGEpOworCQkJCQlpZiAocmMpIHsKKwkJCQkJCXByX2VycigiJXM6IElPTiBHZXQgUGh5c2ljYWwgZm9yIEFVRElPIGZhaWxlZCwgcmMgPSAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcmMpOworCQkJCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQkJCQlnb3RvIGZhaWw7CisJCQkJCX0KKworCQkJCQlidWZbY250XS51c2VkID0gMTsKKwkJCQkJYnVmW2NudF0uc2l6ZSA9IGJ1ZnN6OworCQkJCQlidWZbY250XS5hY3R1YWxfc2l6ZSA9IGJ1ZnN6OworCQkJCQlwcl9kZWJ1ZygiJXM6IGRhdGFbJXBLXXBoeXNbJXBLXVslcEtdXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCSAgIGJ1ZltjbnRdLmRhdGEsCisJCQkJCSAgICZidWZbY250XS5waHlzLAorCQkJCQkgICAmYnVmW2NudF0ucGh5cyk7CisJCQkJCWNudCsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlhYy0+cG9ydFtkaXJdLm1heF9idWZfY250ID0gY250OworCisJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJcmMgPSBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoYWMsIGRpciwgYnVmc3osIGNudCwgMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IENNRCBNZW1vcnlfbWFwX3JlZ2lvbnMgZmFpbGVkICVkIGZvciBzaXplICVkXG4iLAorCQkJCV9fZnVuY19fLCByYywgYnVmc3opOworCQkJZ290byBmYWlsOworCQl9CisJfQorCXJldHVybiAwOworZmFpbDoKKwlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWUoZGlyLCBhYyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKKwkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAorCQkJdW5zaWduZWQgaW50IGJ1ZmNudCkKK3sKKwlpbnQgY250ID0gMDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1ZjsKKwlzaXplX3QgbGVuOworCWludCBieXRlc190b19hbGxvYzsKKworCWlmICghKGFjKSB8fCAoKGRpciAhPSBJTikgJiYgKGRpciAhPSBPVVQpKSkgeworCQlwcl9lcnIoIiVzOiBhYyAlcEsgZGlyICVkXG4iLCBfX2Z1bmNfXywgYWMsIGRpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1idWZzelslZF1idWZjbnRbJWRdXG4iLAorCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLAorCQkJYnVmc3osIGJ1ZmNudCk7CisKKwlpZiAoYWMtPnNlc3Npb24gPD0gMCB8fCBhYy0+c2Vzc2lvbiA+IDgpIHsKKwkJcHJfZXJyKCIlczogU2Vzc2lvbiBJRCBpcyBpbnZhbGlkLCBzZXNzaW9uID0gJWRcbiIsIF9fZnVuY19fLAorCQkJYWMtPnNlc3Npb24pOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGFjLT5wb3J0W2Rpcl0uYnVmKSB7CisJCXByX2VycigiJXM6IGJ1ZmZlciBhbHJlYWR5IGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwlidWYgPSBremFsbG9jKCgoc2l6ZW9mKHN0cnVjdCBhdWRpb19idWZmZXIpKSpidWZjbnQpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikgeworCQlwcl9lcnIoIiVzOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQlnb3RvIGZhaWw7CisJfQorCisJYWMtPnBvcnRbZGlyXS5idWYgPSBidWY7CisKKwkvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworCWlmICgoYnVmY250ID4gMCkgJiYgKChJTlRfTUFYIC8gYnVmY250KSA8IGJ1ZnN6KSkgeworCQlwcl9lcnIoIiVzOiBpbnRlZ2VyIG92ZXJmbG93XG4iLCBfX2Z1bmNfXyk7CisJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJZ290byBmYWlsOworCX0KKwlieXRlc190b19hbGxvYyA9IGJ1ZnN6ICogYnVmY250OworCisJLyogVGhlIHNpemUgdG8gYWxsb2NhdGUgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDRLIGJ5dGVzICovCisJYnl0ZXNfdG9fYWxsb2MgPSBQQUdFX0FMSUdOKGJ5dGVzX3RvX2FsbG9jKTsKKworCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiYXNtX2NsaWVudCIsICZidWZbMF0uY2xpZW50LCAmYnVmWzBdLmhhbmRsZSwKKwkJYnl0ZXNfdG9fYWxsb2MsCisJCShpb25fcGh5c19hZGRyX3QgKikmYnVmWzBdLnBoeXMsICZsZW4sCisJCSZidWZbMF0uZGF0YSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IEF1ZGlvIElPTiBhbGxvYyBpcyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlidWZbMF0udXNlZCA9IGRpciBeIDE7CisJYnVmWzBdLnNpemUgPSBidWZzejsKKwlidWZbMF0uYWN0dWFsX3NpemUgPSBidWZzejsKKwljbnQgPSAxOworCXdoaWxlIChjbnQgPCBidWZjbnQpIHsKKwkJaWYgKGJ1ZnN6ID4gMCkgeworCQkJYnVmW2NudF0uZGF0YSA9ICBidWZbMF0uZGF0YSArIChjbnQgKiBidWZzeik7CisJCQlidWZbY250XS5waHlzID0gIGJ1ZlswXS5waHlzICsgKGNudCAqIGJ1ZnN6KTsKKwkJCWlmICghYnVmW2NudF0uZGF0YSkgeworCQkJCXByX2VycigiJXM6IEJ1ZiBhbGxvYyBmYWlsZWRcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlidWZbY250XS51c2VkID0gZGlyIF4gMTsKKwkJCWJ1ZltjbnRdLnNpemUgPSBidWZzejsKKwkJCWJ1ZltjbnRdLmFjdHVhbF9zaXplID0gYnVmc3o7CisJCQlwcl9kZWJ1ZygiJXM6IGRhdGFbJXBLXXBoeXNbJXBLXVslcEtdXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWJ1ZltjbnRdLmRhdGEsCisJCQkJJmJ1ZltjbnRdLnBoeXMsCisJCQkJJmJ1ZltjbnRdLnBoeXMpOworCQl9CisJCWNudCsrOworCX0KKwlhYy0+cG9ydFtkaXJdLm1heF9idWZfY250ID0gY250OworCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwlyYyA9IHE2YXNtX21lbW9yeV9tYXBfcmVnaW9ucyhhYywgZGlyLCBidWZzeiwgY250LCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENNRCBNZW1vcnlfbWFwX3JlZ2lvbnMgZmFpbGVkICVkIGZvciBzaXplICVkXG4iLAorCQkJX19mdW5jX18sIHJjLCBidWZzeik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDA7CitmYWlsOgorCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwgYWMpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50MzJfdCBxNmFzbV9zcnZjX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCit7CisJdWludDMyX3QgZGlyID0gMDsKKwl1aW50MzJfdCBpID0gSU47CisJdWludDMyX3QgKnBheWxvYWQ7CisJdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7CisJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJdW5pb24gYXNtX3Rva2VuX3N0cnVjdCBhc21fdG9rZW47CisKKwlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKKworCWlmICghZGF0YSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIENCXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOworCisJaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKKwkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCBpcyByZWNlaXZlZDogJWQgJWQgYXByWyVwS11cbiIsCisJCQkJX19mdW5jX18sCisJCQkJZGF0YS0+cmVzZXRfZXZlbnQsCisJCQkJZGF0YS0+cmVzZXRfcHJvYywKKwkJCQl0aGlzX21tYXAuYXByKTsKKwkJYXRvbWljX3NldCgmdGhpc19tbWFwLnJlZl9jbnQsIDApOworCQlhcHJfcmVzZXQodGhpc19tbWFwLmFwcik7CisJCXRoaXNfbW1hcC5hcHIgPSBOVUxMOworCQlmb3IgKDsgaSA8PSBPVVQ7IGkrKykgeworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKKwkJCQkmY29tbW9uX2NsaWVudC5wb3J0W2ldLm1lbV9tYXBfaGFuZGxlKSB7CisJCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKKwkJCQkJCXN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJCQlsaXN0KTsKKwkJCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0KKwkJCQljb21tb25fY2xpZW50LnBvcnRbaV0uYnVmLT5waHlzKSB7CisJCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisJCQkJCWtmcmVlKGJ1Zl9ub2RlKTsKKwkJCQl9CisJCQl9CisJCQlwcl9kZWJ1ZygiJXM6IENsZWFyaW5nIGN1c3RvbSB0b3BvbG9neVxuIiwgX19mdW5jX18pOworCQl9CisJCXRoaXNfbW1hcC5hcHIgPSBOVUxMOworCisJCWNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKEFTTV9NQVhfQ0FMX1RZUEVTLCBjYWxfZGF0YSk7CisJCWNvbW1vbl9jbGllbnQubW1hcF9hcHIgPSBOVUxMOworCQltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fQ1VTVE9NX1RPUF9DQUxdLT5sb2NrKTsKKwkJc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7CisJCW11dGV4X3VubG9jaygmY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7CisJCXRvcG9sb2d5X21hcF9oYW5kbGUgPSAwOworCQlydGFjX2NsZWFyX21hcHBpbmcoQVNNX1JUQUNfQ0FMKTsKKwkJcmV0dXJuIDA7CisJfQorCWFzbV90b2tlbi50b2tlbiA9IGRhdGEtPnRva2VuOworCWFjID0gcTZhc21fZ2V0X2F1ZGlvX2NsaWVudChhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQpOworCWRpciA9IHE2YXNtX2dldF9mbGFnX2Zyb21fdG9rZW4oJmFzbV90b2tlbiwgQVNNX0RJUkVDVElPTl9PRkZTRVQpOworCisJaWYgKCFhYykgeworCQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIGFscmVhZHkgZnJlZWRcbiIsCisJCQkgX19mdW5jX18sIGFzbV90b2tlbi5fdG9rZW4uc2Vzc2lvbl9pZCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkYXRhLT5wYXlsb2FkX3NpemUgPiBzaXplb2YoaW50KSkgeworCQlwcl9kZWJ1ZygiJXM6cHRyMFsweCV4XXB0cjFbMHgleF1vcGNvZGVbMHgleF0gdG9rZW5bMHgleF1wYXlsb2FkX3NbJWRdIHNyY1slZF0gZGVzdFslZF1zaWRbJWRdZGlyWyVkXVxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLCBkYXRhLT5vcGNvZGUsCisJCQlkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5zcmNfcG9ydCwKKwkJCWRhdGEtPmRlc3RfcG9ydCwgYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkLCBkaXIpOworCQlwcl9kZWJ1ZygiJXM6UGF5bG9hZCA9IFsweCV4XSBzdGF0dXNbMHgleF1cbiIsCisJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJfSBlbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgPT0gc2l6ZW9mKGludCkpIHsKKwkJcHJfZGVidWcoIiVzOnB0cjBbMHgleF1vcGNvZGVbMHgleF0gdG9rZW5bMHgleF1wYXlsb2FkX3NbJWRdIHNyY1slZF0gZGVzdFslZF1zaWRbJWRdZGlyWyVkXVxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBkYXRhLT5vcGNvZGUsCisJCQlkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5zcmNfcG9ydCwKKwkJCWRhdGEtPmRlc3RfcG9ydCwgYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkLCBkaXIpOworCQlwcl9kZWJ1ZygiJXM6UGF5bG9hZCA9IFsweCV4XVxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKKwl9CisKKwlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7CisJCXN3aXRjaCAocGF5bG9hZFswXSkgeworCQljYXNlIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKKwkJY2FzZSBBU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzoKKwkJY2FzZSBBU01fQ01EX0FERF9UT1BPTE9HSUVTOgorCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkgeworCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4IHNpZDolZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCisJCQkJICAgICAgIGFzbV90b2tlbi5fdG9rZW4uc2Vzc2lvbl9pZCk7CisJCQkJaWYgKHBheWxvYWRbMF0gPT0KKwkJCQkgICAgQVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlMpCisJCQkJCWF0b21pY19zZXQoJmFjLT51bm1hcF9jYl9zdWNjZXNzLCAwKTsKKworCQkJCWF0b21pY19zZXQoJmFjLT5tZW1fc3RhdGUsIHBheWxvYWRbMV0pOworCQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChwYXlsb2FkWzBdID09CisJCQkJICAgIEFTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TKQorCQkJCQlhdG9taWNfc2V0KCZhYy0+dW5tYXBfY2Jfc3VjY2VzcywgMSk7CisJCQl9CisKKwkJCWlmIChhdG9taWNfY21weGNoZygmYWMtPm1lbV9zdGF0ZSwgLTEsIDApID09IC0xKQorCQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7CisJCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IFBheWxvYWQgPSBbMHgleF0gc3RhdHVzWzB4JXhdXG4iLAorCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczogY29tbWFuZFsweCV4XSBub3QgZXhwZWN0aW5nIHJzcFxuIiwKKwkJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKworCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKKworCXN3aXRjaCAoZGF0YS0+b3Bjb2RlKSB7CisJY2FzZSBBU01fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6eworCQlwcl9kZWJ1ZygiJXM6UEwjMFsweCV4XSBkaXI9MHgleCBzX2lkPTB4JXhcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcGF5bG9hZFswXSwgZGlyLCBhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCWlmIChhdG9taWNfY21weGNoZygmYWMtPm1lbV9zdGF0ZSwgLTEsIDApID09IC0xKSB7CisJCQlhYy0+cG9ydFtkaXJdLnRtcF9oZGwgPSBwYXlsb2FkWzBdOworCQkJd2FrZV91cCgmYWMtPm1lbV93YWl0KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM6eworCQlwcl9kZWJ1ZygiJXM6IFBMIzBbMHgleF1QTCMxIFsweCV4XVxuIiwKKwkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCWlmIChhdG9taWNfY21weGNoZygmYWMtPm1lbV9zdGF0ZSwgLTEsIDApID09IC0xKQorCQkJd2FrZV91cCgmYWMtPm1lbV93YWl0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByX2RlYnVnKCIlczogY29tbWFuZFsweCV4XXN1Y2Nlc3MgWzB4JXhdXG4iLAorCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJfQorCWlmIChhYy0+Y2IpCisJCWFjLT5jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJZGF0YS0+cGF5bG9hZCwgYWMtPnByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxNmFzbV9wcm9jZXNzX210bXhfZ2V0X3BhcmFtX3JzcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlzdHJ1Y3QgYXNtX210bXhfc3RydHJfZ2V0X3BhcmFtc19jbWRyc3AgKmNtZHJzcCkKK3sKKwlzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9zZXNzaW9uX3RpbWVfdjNfdCAqdGltZTsKKworCWlmIChjbWRyc3AtPmVycl9jb2RlKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoYWMtPmRldiwKKwkJCQkgICAgIiVzOiBlcnI9JXgsIG1vZF9pZD0leCwgcGFyYW1faWQ9JXhcbiIsCisJCQkJICAgIF9fZnVuY19fLCBjbWRyc3AtPmVycl9jb2RlLAorCQkJCSAgICBjbWRyc3AtPnBhcmFtX2luZm8ubW9kdWxlX2lkLAorCQkJCSAgICBjbWRyc3AtPnBhcmFtX2luZm8ucGFyYW1faWQpOworCQlyZXR1cm47CisJfQorCWRldl9kYmdfcmF0ZWxpbWl0ZWQoYWMtPmRldiwKKwkJCSAgICAiJXM6IG1vZF9pZD0leCwgcGFyYW1faWQ9JXhcbiIsIF9fZnVuY19fLAorCQkJICAgIGNtZHJzcC0+cGFyYW1faW5mby5tb2R1bGVfaWQsCisJCQkgICAgY21kcnNwLT5wYXJhbV9pbmZvLnBhcmFtX2lkKTsKKworCXN3aXRjaCAoY21kcnNwLT5wYXJhbV9pbmZvLm1vZHVsZV9pZCkgeworCWNhc2UgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DOgorCQlzd2l0Y2ggKGNtZHJzcC0+cGFyYW1faW5mby5wYXJhbV9pZCkgeworCQljYXNlIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fU0VTU0lPTl9USU1FX1YzOgorCQkJdGltZSA9ICZjbWRyc3AtPnBhcmFtX2RhdGEuc2Vzc2lvbl90aW1lOworCQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBHRVRfVElNRV9WMywgdGltZV9sc3c9JXgsIHRpbWVfbXN3PSV4XG4iLAorCQkJCSBfX2Z1bmNfXywgdGltZS0+c2Vzc2lvbl90aW1lX2xzdywKKwkJCQkgdGltZS0+c2Vzc2lvbl90aW1lX21zdyk7CisJCQlhYy0+dGltZV9zdGFtcCA9ICh1aW50NjRfdCkoKCh1aW50NjRfdCkKKwkJCQkJIHRpbWUtPnNlc3Npb25fdGltZV9tc3cgPDwgMzIpIHwKKwkJCQkJIHRpbWUtPnNlc3Npb25fdGltZV9sc3cpOworCQkJaWYgKHRpbWUtPmZsYWdzICYKKwkJCSAgICBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NUSU1FX1RTVE1QX0ZMR19CTUFTSykKKwkJCQlkZXZfd2Fybl9yYXRlbGltaXRlZChhYy0+ZGV2LAorCQkJCQkJICAgICAiJXM6IHJlY3YgaW52YWwgdHN0bXBcbiIsCisJCQkJCQkgICAgIF9fZnVuY19fKTsKKwkJCWlmIChhdG9taWNfY21weGNoZygmYWMtPnRpbWVfZmxhZywgMSwgMCkpCisJCQkJd2FrZV91cCgmYWMtPnRpbWVfd2FpdCk7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IHVuZXhwZWN0ZWQgcGFyYW1faWQgJXhcbiIsCisJCQkJX19mdW5jX18sIGNtZHJzcC0+cGFyYW1faW5mby5wYXJhbV9pZCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGFjLT5kZXYsICIlczogdW5leHBlY3RlZCBtb2RfaWQgJXhcbiIsICBfX2Z1bmNfXywKKwkJCWNtZHJzcC0+cGFyYW1faW5mby5tb2R1bGVfaWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQzMl90IHE2YXNtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gKHN0cnVjdCBhdWRpb19jbGllbnQgKilwcml2OworCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOworCXVpbnQzMl90ICpwYXlsb2FkOworCXVpbnQzMl90IHdha2V1cF9mbGFnID0gMTsKKwlpbnQzMl90ICByZXQgPSAwOworCXVuaW9uIGFzbV90b2tlbl9zdHJ1Y3QgYXNtX3Rva2VuOworCXVpbnQ4X3QgYnVmX2luZGV4OworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogYWMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBkYXRhIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghcTZhc21faXNfdmFsaWRfYXVkaW9fY2xpZW50KGFjKSkgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgcG9pbnRlciBpcyBpbnZhbGlkLCBhYyA9ICVwS1xuIiwKKwkJCQlfX2Z1bmNfXywgYWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWMtPnNlc3Npb24gPD0gMCB8fCBhYy0+c2Vzc2lvbiA+IDgpIHsKKwkJcHJfZXJyKCIlczogU2Vzc2lvbiBJRCBpcyBpbnZhbGlkLCBzZXNzaW9uID0gJWRcbiIsIF9fZnVuY19fLAorCQkJYWMtPnNlc3Npb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXlsb2FkID0gZGF0YS0+cGF5bG9hZDsKKwlhc21fdG9rZW4udG9rZW4gPSBkYXRhLT50b2tlbjsKKwlpZiAocTZhc21fZ2V0X2ZsYWdfZnJvbV90b2tlbigmYXNtX3Rva2VuLCBBU01fQ01EX05PX1dBSVRfT0ZGU0VUKSkgeworCQlwcl9kZWJ1ZygiJXM6IE5vIHdhaXQgY29tbWFuZCBvcGNvZGVbMHgleF0gY21kX29wY29kZToleFxuIiwKKwkJCSBfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLCBwYXlsb2FkID8gcGF5bG9hZFswXSA6IDApOworCQl3YWtldXBfZmxhZyA9IDA7CisJfQorCisJaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKKwkJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJYXRvbWljX3NldCgmYWMtPnJlc2V0LCAxKTsKKwkJaWYgKGFjLT5hcHIgPT0gTlVMTCkKKwkJCWFjLT5hcHIgPSBhYy0+YXByMjsKKwkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCBpcyByZWNlaXZlZDogJWQgJWQgYXByWyVwS11cbiIsCisJCQlfX2Z1bmNfXywKKwkJCWRhdGEtPnJlc2V0X2V2ZW50LCBkYXRhLT5yZXNldF9wcm9jLCBhYy0+YXByKTsKKwkJaWYgKGFjLT5jYikKKwkJCWFjLT5jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCSh1aW50MzJfdCAqKWRhdGEtPnBheWxvYWQsIGFjLT5wcml2KTsKKwkJYXByX3Jlc2V0KGFjLT5hcHIpOworCQlhYy0+YXByID0gTlVMTDsKKwkJYXRvbWljX3NldCgmYWMtPnRpbWVfZmxhZywgMCk7CisJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOworCQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAwKTsKKwkJd2FrZV91cCgmYWMtPnRpbWVfd2FpdCk7CisJCXdha2VfdXAoJmFjLT5jbWRfd2FpdCk7CisJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7CisJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXW9wY29kZVsweCV4XSB0b2tlblsweCV4XXBheWxvYWRfc2l6ZVslZF0gc3JjWyVkXSBkZXN0WyVkXVxuIiwKKwkJIF9fZnVuY19fLAorCQlhYy0+c2Vzc2lvbiwgZGF0YS0+b3Bjb2RlLAorCQlkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5zcmNfcG9ydCwKKwkJZGF0YS0+ZGVzdF9wb3J0KTsKKwlpZiAoKGRhdGEtPm9wY29kZSAhPSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1MpICYmCisJICAgIChkYXRhLT5vcGNvZGUgIT0gQVNNX0RBVEFfRVZFTlRfRU9TKSAmJgorCSAgICAoZGF0YS0+b3Bjb2RlICE9IEFTTV9TRVNTSU9OX0VWRU5UX1JYX1VOREVSRkxPVykpIHsKKwkJaWYgKHBheWxvYWQgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogcGF5bG9hZCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IFBheWxvYWQgPSBbMHgleF0gc3RhdHVzWzB4JXhdIG9wY29kZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIGRhdGEtPm9wY29kZSk7CisJfQorCWlmIChkYXRhLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKKwkJc3dpdGNoIChwYXlsb2FkWzBdKSB7CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjoKKwkJCWlmIChydGFjX21ha2VfYXNtX2NhbGxiYWNrKGFjLT5zZXNzaW9uLCBwYXlsb2FkLAorCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQorCQkJCWJyZWFrOworCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9QQVVTRToKKwkJY2FzZSBBU01fU0VTU0lPTl9DTURfU1VTUEVORDoKKwkJY2FzZSBBU01fREFUQV9DTURfRU9TOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX0NMT1NFOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX0ZMVVNIOgorCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI6CisJCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX0ZPUlhfT1ZFUkZMT1dfRVZFTlRTOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX0ZMVVNIX1JFQURCVUZTOgorCQlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gJWQgb3Bjb2RlIDB4JXggdG9rZW4gMHgleCBQYXlsb2FkID0gWzB4JXhdIHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJcGF5bG9hZFswXSwgZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7CisJCXJldCA9IHE2YXNtX2lzX3ZhbGlkX3Nlc3Npb24oZGF0YSwgcHJpdik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCIlczogc2Vzc2lvbiBpbnZhbGlkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY2FzZSBBU01fU0VTU0lPTl9DTURfU0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9WMzoKKwkJY2FzZSBBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX1YzOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVMTF9NT0RFX1dSSVRFOgorCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVTSF9NT0RFX1JFQUQ6CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEVfVjI6CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfT1BFTl9MT09QQkFDS19WMjoKKwkJY2FzZSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjoKKwkJY2FzZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOgorCQljYXNlIEFTTV9EQVRBX0NNRF9SRU1PVkVfSU5JVElBTF9TSUxFTkNFOgorCQljYXNlIEFTTV9EQVRBX0NNRF9SRU1PVkVfVFJBSUxJTkdfU0lMRU5DRToKKwkJY2FzZSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SX1JYX1VOREVSRkxPV19FVkVOVFM6CisJCWNhc2UgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VEOgorCQkJcHJfZGVidWcoIiVzOiBzZXNzaW9uICVkIG9wY29kZSAweCV4IHRva2VuIDB4JXggUGF5bG9hZCA9IFsweCV4XSBzdGF0IDB4JXggc3JjICVkIGRlc3QgJWRcbiIsCisJCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLAorCQkJCWRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCisJCQkJcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwKKwkJCQlkYXRhLT5zcmNfcG9ydCwgZGF0YS0+ZGVzdF9wb3J0KTsKKwkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBjbWQgPSAweCV4IHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOworCQkJCWlmICh3YWtldXBfZmxhZykgeworCQkJCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCBwYXlsb2FkWzFdKTsKKwkJCQkJd2FrZV91cCgmYWMtPmNtZF93YWl0KTsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpICYmIHdha2V1cF9mbGFnKSB7CisJCQkJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMCk7CisJCQkJd2FrZV91cCgmYWMtPmNtZF93YWl0KTsKKwkJCX0KKwkJCWlmIChhYy0+Y2IpCisJCQkJYWMtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCisJCQkJCSh1aW50MzJfdCAqKWRhdGEtPnBheWxvYWQsIGFjLT5wcml2KTsKKwkJCWJyZWFrOworCQljYXNlIEFTTV9DTURfQUREX1RPUE9MT0dJRVM6CisJCQlwcl9kZWJ1ZygiJXM6UGF5bG9hZCA9IFsweCV4XXN0YXRbMHgleF1cbiIsCisJCQkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKKwkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBjbWQgPSAweCV4IHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKKwkJCQlpZiAod2FrZXVwX2ZsYWcpIHsKKwkJCQkJYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgcGF5bG9hZFsxXSk7CisJCQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSAmJiB3YWtldXBfZmxhZykgeworCQkJCWF0b21pY19zZXQoJmFjLT5tZW1fc3RhdGUsIDApOworCQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7CisJCQl9CisJCQlpZiAoYWMtPmNiKQorCQkJCWFjLT5jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCQkodWludDMyX3QgKilkYXRhLT5wYXlsb2FkLCBhYy0+cHJpdik7CisJCQlicmVhazsKKwkJY2FzZSBBU01fREFUQV9FVkVOVF9XQVRFUk1BUks6IHsKKwkJCXByX2RlYnVnKCIlczogV2F0ZXJtYXJrIG9wY29kZVsweCV4XSBzdGF0dXNbMHgleF0iLAorCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFTTV9TVFJFQU1fQ01EX0dFVF9QUF9QQVJBTVNfVjI6CisJCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fQ01EX0dFVF9QUF9QQVJBTVNfVjIgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKKwkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOworCQkJLyogU2hvdWxkIG9ubHkgY29tZSBoZXJlIGlmIHRoZXJlIGlzIGFuIEFQUiAqLworCQkJLyogZXJyb3Igb3IgbWFsZm9ybWVkIEFQUiBwYWNrZXQuIE90aGVyd2lzZSAqLworCQkJLyogcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCBhcyAqLworCQkJLyogQVNNX1NUUkVBTV9DTURSU1BfR0VUX1BQX1BBUkFNU19WMiAqLworCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkgeworCQkJCXByX2VycigiJXM6IEFTTSBnZXQgcGFyYW0gZXJyb3IgPSAlZCwgcmVzdW1pbmdcbiIsCisJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzFdKTsKKwkJCQlydGFjX21ha2VfYXNtX2NhbGxiYWNrKGFjLT5zZXNzaW9uLCBwYXlsb2FkLAorCQkJCQkJCWRhdGEtPnBheWxvYWRfc2l6ZSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2RlYnVnKCIlczogY29tbWFuZFsweCV4XSBub3QgZXhwZWN0aW5nIHJzcFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgeworCWNhc2UgQVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORV9WMjp7CisJCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSAmYWMtPnBvcnRbSU5dOworCisJCWRldl92ZGJnKGFjLT5kZXYsICIlczogUnhlZCBvcGNvZGVbMHgleF0gc3RhdHVzWzB4JXhdIHRva2VuWyVkXSIsCisJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCisJCQkJZGF0YS0+dG9rZW4pOworCQlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKKwkJCWlmIChwb3J0LT5idWYgPT0gTlVMTCkgeworCQkJCXByX2VycigiJXM6IFVuZXhwZWN0ZWQgV3JpdGUgRG9uZVxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOworCQkJYnVmX2luZGV4ID0gYXNtX3Rva2VuLl90b2tlbi5idWZfaW5kZXg7CisJCQlpZiAobG93ZXJfMzJfYml0cyhwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKSAhPQorCQkJcGF5bG9hZFswXSB8fAorCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJcG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cykgIT0JcGF5bG9hZFsxXSkgeworCQkJCXByX2RlYnVnKCIlczogRXhwZWN0ZWQgYWRkciAlcEtcbiIsCisJCQkJX19mdW5jX18sICZwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKTsKKwkJCQlwcl9lcnIoIiVzOiByeGVkbFsweCV4XSByeGVkdSBbMHgleF1cbiIsCisJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKKwkJCQkJCQkJZHNwX2ZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXBvcnQtPmJ1ZltidWZfaW5kZXhdLnVzZWQgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisKKwkJCWNvbmZpZ19kZWJ1Z19mc193cml0ZV9jYigpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bWF4X2J1Zl9jbnQ7IGkrKykKKwkJCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXMgJWRcbiIsCisJCQkJCV9fZnVuY19fLCBwb3J0LT5idWZbaV0udXNlZCk7CisKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1YyOgorCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjIgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZGF0YS0+b3Bjb2RlLAorCQkJCWRhdGEtPnRva2VuLAorCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOworCQlpZiAocGF5bG9hZFswXSAhPSAwKSB7CisJCQlwcl9lcnIoIiVzOiBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1YyIHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7CisJCX0gZWxzZSBpZiAoZ2VuZXJpY19nZXRfZGF0YSkgeworCQkJZ2VuZXJpY19nZXRfZGF0YS0+dmFsaWQgPSAxOworCQkJaWYgKGdlbmVyaWNfZ2V0X2RhdGEtPmlzX2luYmFuZCkgeworCQkJCXByX2RlYnVnKCIlczogcGF5bG9hZFsxXSA9IDB4JXgsIHBheWxvYWRbMl09MHgleCwgcGF5bG9hZFszXT0weCV4XG4iLAorCQkJCSAgX19mdW5jX18sIHBheWxvYWRbMV0sIHBheWxvYWRbMl0sIHBheWxvYWRbM10pOworCQkJCWdlbmVyaWNfZ2V0X2RhdGEtPnNpemVfaW5faW50cyA9IHBheWxvYWRbM10+PjI7CisJCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRbM10+PjI7IGkrKykgeworCQkJCQlnZW5lcmljX2dldF9kYXRhLT5pbnRzW2ldID0KKwkJCQkJCQkJICAgcGF5bG9hZFs0K2ldOworCQkJCQlwcl9kZWJ1ZygiJXM6IEFTTSBjYWxsYmFjayB2YWwgJWkgPSAlaVxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgaSwgcGF5bG9hZFs0K2ldKTsKKwkJCQl9CisJCQkJcHJfZGVidWcoIiVzOiBjYWxsYmFjayBzaXplIGluIGludHMgPSAlaVxuIiwKKwkJCQkJIF9fZnVuY19fLAorCQkJCQlnZW5lcmljX2dldF9kYXRhLT5zaXplX2luX2ludHMpOworCQkJfQorCQkJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSAmJiB3YWtldXBfZmxhZykgeworCQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOworCQkJCXdha2VfdXAoJmFjLT5jbWRfd2FpdCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlydGFjX21ha2VfYXNtX2NhbGxiYWNrKGFjLT5zZXNzaW9uLCBwYXlsb2FkLAorCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6eworCisJCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSAmYWMtPnBvcnRbT1VUXTsKKworCQljb25maWdfZGVidWdfZnNfcmVhZF9jYigpOworCisJCWRldl92ZGJnKGFjLT5kZXYsICIlczogUmVhZERvbmU6IHN0YXR1cz0lZCBidWZmX2FkZD0weCV4IGFjdF9zaXplPSVkIG9mZnNldD0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZFtSRUFERE9ORV9JRFhfU1RBVFVTXSwKKwkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9CVUZBRERfTFNXXSwKKwkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9TSVpFXSwKKwkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9PRkZTRVRdKTsKKworCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IFJlYWREb25lOm1zd190cz0lZCBsc3dfdHM9JWQgbWVtbWFwX2hkbD0weCV4IGZsYWdzPSVkIGlkPSVkIG51bT0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZFtSRUFERE9ORV9JRFhfTVNXX1RTXSwKKwkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9MU1dfVFNdLAorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX01FTU1BUF9IRExdLAorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0ZMQUdTXSwKKwkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9TRVFfSURdLAorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX05VTUZSQU1FU10pOworCisJCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQkJaWYgKHBvcnQtPmJ1ZiA9PSBOVUxMKSB7CisJCQkJcHJfZXJyKCIlczogVW5leHBlY3RlZCBXcml0ZSBEb25lXG4iLCBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCQlidWZfaW5kZXggPSBhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleDsKKwkJCXBvcnQtPmJ1ZltidWZfaW5kZXhdLnVzZWQgPSAwOworCQkJaWYgKGxvd2VyXzMyX2JpdHMocG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cykgIT0KKwkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9MU1ddIHx8CisJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQlwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKSAhPQorCQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9CVUZBRERfTVNXXSkgeworCQkJCWRldl92ZGJnKGFjLT5kZXYsICIlczogRXhwZWN0ZWQgYWRkciAlcEtcbiIsCisJCQkJCV9fZnVuY19fLCAmcG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cyk7CisJCQkJcHJfZXJyKCIlczogcnhlZGxbMHgleF0gcnhlZHVbMHgleF1cbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9MU1ddLAorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9NU1ddKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKKwkJCQkJCQlkc3BfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQkJcG9ydC0+YnVmW2J1Zl9pbmRleF0uYWN0dWFsX3NpemUgPQorCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX1NJWkVdOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQVNNX0RBVEFfRVZFTlRfRU9TOgorCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgorCQlwcl9kZWJ1ZygiJXM6IEVPUyBBQ0sgcmVjZWl2ZWQ6IHJ4ZWQgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKKwkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOworCQlicmVhazsKKwljYXNlIEFTTV9TRVNTSU9OX0VWRU5UWF9PVkVSRkxPVzoKKwkJcHJfZGVidWcoIiVzOiBBU01fU0VTU0lPTl9FVkVOVFhfT1ZFUkZMT1cgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKKwkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOworCQlicmVhazsKKwljYXNlIEFTTV9TRVNTSU9OX0VWRU5UX1JYX1VOREVSRkxPVzoKKwkJcHJfZGVidWcoIiVzOiBBU01fU0VTU0lPTl9FVkVOVF9SWF9VTkRFUkZMT1cgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAorCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKKwkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAorCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOworCQlicmVhazsKKwljYXNlIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTlRJTUVfVjM6CisJCWRldl92ZGJnKGFjLT5kZXYsICIlczogQVNNX1NFU1NJT05fQ01EUlNQX0dFVF9TRVNTSU9OVElNRV9WMywgcGF5bG9hZFswXSA9ICVkLCBwYXlsb2FkWzFdID0gJWQsIHBheWxvYWRbMl0gPSAlZFxuIiwKKwkJCQkgX19mdW5jX18sCisJCQkJIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIHBheWxvYWRbMl0pOworCQlhYy0+dGltZV9zdGFtcCA9ICh1aW50NjRfdCkoKCh1aW50NjRfdClwYXlsb2FkWzJdIDw8IDMyKSB8CisJCQkJcGF5bG9hZFsxXSk7CisJCWlmIChhdG9taWNfY21weGNoZygmYWMtPnRpbWVfZmxhZywgMSwgMCkpCisJCQl3YWtlX3VwKCZhYy0+dGltZV93YWl0KTsKKwkJYnJlYWs7CisJY2FzZSBBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZOgorCWNhc2UgQVNNX0RBVEFfRVZFTlRfRU5DX1NSX0NNX0NIQU5HRV9OT1RJRlk6CisJCXByX2RlYnVnKCIlczogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSBzZXNzaW9uICVkIG9wY29kZSAweCV4IHRva2VuIDB4JXggc3JjICVkIGRlc3QgJWRcbiIsCisJCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLAorCQkJCWRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCisJCQkJZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7CisJCXByX2RlYnVnKCIlczogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSwgcGF5bG9hZFswXSA9ICVkLCBwYXlsb2FkWzFdID0gJWQsIHBheWxvYWRbMl0gPSAlZCwgcGF5bG9hZFszXSA9ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywKKwkJCQlwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLCBwYXlsb2FkWzJdLAorCQkJCXBheWxvYWRbM10pOworCQlicmVhazsKKwljYXNlIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI6CisJCXE2YXNtX3Byb2Nlc3NfbXRteF9nZXRfcGFyYW1fcnNwKGFjLCAodm9pZCAqKSBwYXlsb2FkKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1BBVEhfREVMQVlfVjI6CisJCXByX2RlYnVnKCIlczogQVNNX1NFU1NJT05fQ01EUlNQX0dFVF9QQVRIX0RFTEFZX1YyIHNlc3Npb24gJWQgc3RhdHVzIDB4JXggbXN3ICV1IGxzdyAldVxuIiwKKwkJCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sIHBheWxvYWRbMF0sIHBheWxvYWRbMl0sCisJCQkJcGF5bG9hZFsxXSk7CisJCWlmIChwYXlsb2FkWzBdID09IDApIHsKKwkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOworCQkJLyogaWdub3JlIG1zdywgYXMgYSBkZWxheSB0aGF0IGxhcmdlIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCWFjLT5wYXRoX2RlbGF5ID0gcGF5bG9hZFsxXTsKKwkJfSBlbHNlIHsKKwkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIHBheWxvYWRbMF0pOworCQkJYWMtPnBhdGhfZGVsYXkgPSBVSU5UX01BWDsKKwkJfQorCQl3YWtlX3VwKCZhYy0+Y21kX3dhaXQpOworCQlicmVhazsKKwl9CisJaWYgKGFjLT5jYikKKwkJYWMtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCisJCQlkYXRhLT5wYXlsb2FkLCBhYy0+cHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqcTZhc21faXNfY3B1X2J1Zl9hdmFpbChpbnQgZGlyLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgKnNpemUsCisJCQkJdWludDMyX3QgKmluZGV4KQoreworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgY2hhciBpZHg7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKKworCWlmICghYWMgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKKwkJcG9ydCA9ICZhYy0+cG9ydFtkaXJdOworCisJCW11dGV4X2xvY2soJnBvcnQtPmxvY2spOworCQlpZHggPSBwb3J0LT5jcHVfYnVmOworCQlpZiAocG9ydC0+YnVmID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IEJ1ZmZlciBwb2ludGVyIG51bGxcbiIsIF9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmcG9ydC0+bG9jayk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBkaXIgMDogdXNlZCA9IDAgbWVhbnMgYnVmIGluIHVzZQorCQkgKiBkaXIgMTogdXNlZCA9IDEgbWVhbnMgYnVmIGluIHVzZQorCQkgKi8KKwkJaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gZGlyKSB7CisJCQkvKiBUbyBtYWtlIGl0IG1vcmUgcm9idXN0LCB3ZSBjb3VsZCBsb29wIGFuZCBnZXQgdGhlCisJCQkgKiBuZXh0IGF2YWlsIGJ1ZiwgaXRzIHJpc2t5IHRob3VnaAorCQkJICovCisJCQlwcl9lcnIoIiVzOiBOZXh0IGJ1ZiBpZHhbMHgleF0gbm90IGF2YWlsYWJsZSwgZGlyWyVkXVxuIiwKKwkJCSBfX2Z1bmNfXywgaWR4LCBkaXIpOworCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSpzaXplID0gcG9ydC0+YnVmW2lkeF0uYWN0dWFsX3NpemU7CisJCSppbmRleCA9IHBvcnQtPmNwdV9idWY7CisJCWRhdGEgPSBwb3J0LT5idWZbaWR4XS5kYXRhOworCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdaW5kZXhbJWRdIGRhdGFbJXBLXXNpemVbJWRdXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlhYy0+c2Vzc2lvbiwKKwkJCQkJCXBvcnQtPmNwdV9idWYsCisJCQkJCQlkYXRhLCAqc2l6ZSk7CisJCS8qIEJ5IGRlZmF1bHQgaW5jcmVhc2UgdGhlIGNwdV9idWYgY250CisJCSAqIHVzZXIgYWNjZXNzZXMgdGhpcyBmdW5jdGlvbixpbmNyZWFzZSBjcHUKKwkJICogYnVmKHRvIGF2b2lkIGFub3RoZXIgYXBpKQorCQkgKi8KKwkJcG9ydC0+YnVmW2lkeF0udXNlZCA9IGRpcjsKKwkJcG9ydC0+Y3B1X2J1ZiA9IHE2YXNtX2dldF9uZXh0X2J1ZihhYywgcG9ydC0+Y3B1X2J1ZiwKKwkJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgcTZhc21fY3B1X2J1Zl9yZWxlYXNlKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJaW50IHJldCA9IDA7CisJaW50IGlkeDsKKworCWlmICghYWMgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGFjLT5pb19tb2RlICYgU1lOQ19JT19NT0RFKSB7CisJCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKKwkJbXV0ZXhfbG9jaygmcG9ydC0+bG9jayk7CisJCWlkeCA9IHBvcnQtPmNwdV9idWY7CisJCWlmIChwb3J0LT5jcHVfYnVmID09IDApIHsKKwkJCXBvcnQtPmNwdV9idWYgPSBwb3J0LT5tYXhfYnVmX2NudCAtIDE7CisJCX0gZWxzZSBpZiAocG9ydC0+Y3B1X2J1ZiA8IHBvcnQtPm1heF9idWZfY250KSB7CisJCQlwb3J0LT5jcHVfYnVmID0gcG9ydC0+Y3B1X2J1ZiAtIDE7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBidWZmZXIgaW5kZXgoJWQpIG91dCBvZiByYW5nZVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcG9ydC0+Y3B1X2J1Zik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlwb3J0LT5idWZbcG9ydC0+Y3B1X2J1Zl0udXNlZCA9IGRpciBeIDE7CisJCW11dGV4X3VubG9jaygmcG9ydC0+bG9jayk7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhpbnQgZGlyLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJdWludDMyX3QgKnNpemUsIHVpbnQzMl90ICppbmRleCkKK3sKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGNoYXIgaWR4OworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisKKwlpZiAoIWFjIHx8ICgoZGlyICE9IElOKSAmJiAoZGlyICE9IE9VVCkpKSB7CisJCXByX2VycigiJXM6IGFjICVwSyBkaXIgJWRcbiIsIF9fZnVuY19fLCBhYywgZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcG9ydCA9ICZhYy0+cG9ydFtkaXJdOworCisJaWR4ID0gcG9ydC0+Y3B1X2J1ZjsKKwlpZiAocG9ydC0+YnVmID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQnVmZmVyIHBvaW50ZXIgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyoKKwkgKiBkaXIgMDogdXNlZCA9IDAgbWVhbnMgYnVmIGluIHVzZQorCSAqIGRpciAxOiB1c2VkID0gMSBtZWFucyBidWYgaW4gdXNlCisJICovCisJaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gZGlyKSB7CisJCS8qCisJCSAqIFRvIG1ha2UgaXQgbW9yZSByb2J1c3QsIHdlIGNvdWxkIGxvb3AgYW5kIGdldCB0aGUKKwkJICogbmV4dCBhdmFpbCBidWYsIGl0cyByaXNreSB0aG91Z2gKKwkJICovCisJCXByX2VycigiJXM6IE5leHQgYnVmIGlkeFsweCV4XSBub3QgYXZhaWxhYmxlLCBkaXJbJWRdXG4iLAorCQkgX19mdW5jX18sIGlkeCwgZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpzaXplID0gcG9ydC0+YnVmW2lkeF0uYWN0dWFsX3NpemU7CisJKmluZGV4ID0gcG9ydC0+Y3B1X2J1ZjsKKwlkYXRhID0gcG9ydC0+YnVmW2lkeF0uZGF0YTsKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdaW5kZXhbJWRdIGRhdGFbJXBLXXNpemVbJWRdXG4iLAorCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sIHBvcnQtPmNwdV9idWYsCisJCWRhdGEsICpzaXplKTsKKwkvKgorCSAqIEJ5IGRlZmF1bHQgaW5jcmVhc2UgdGhlIGNwdV9idWYgY250CisJICogdXNlciBhY2Nlc3NlcyB0aGlzIGZ1bmN0aW9uLGluY3JlYXNlIGNwdQorCSAqIGJ1Zih0byBhdm9pZCBhbm90aGVyIGFwaSkKKwkgKi8KKwlwb3J0LT5idWZbaWR4XS51c2VkID0gZGlyOworCXBvcnQtPmNwdV9idWYgPSBxNmFzbV9nZXRfbmV4dF9idWYoYWMsIHBvcnQtPmNwdV9idWYsCisJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKKwlyZXR1cm4gZGF0YTsKK30KKworaW50IHE2YXNtX2lzX2RzcF9idWZfYXZhaWwoaW50IGRpciwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJdWludDMyX3QgaWR4OworCisJaWYgKCFhYyB8fCAoZGlyICE9IE9VVCkpIHsKKwkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07CisKKwkJbXV0ZXhfbG9jaygmcG9ydC0+bG9jayk7CisJCWlkeCA9IHBvcnQtPmRzcF9idWY7CisKKwkJaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gKGRpciBeIDEpKSB7CisJCQkvKiBUbyBtYWtlIGl0IG1vcmUgcm9idXN0LCB3ZSBjb3VsZCBsb29wIGFuZCBnZXQgdGhlCisJCQkgKiBuZXh0IGF2YWlsIGJ1ZiwgaXRzIHJpc2t5IHRob3VnaAorCQkJICovCisJCQlwcl9lcnIoIiVzOiBOZXh0IGJ1ZiBpZHhbMHgleF0gbm90IGF2YWlsYWJsZSwgZGlyWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgaWR4LCBkaXIpOworCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXWRzcF9idWY9JWQgY3B1X2J1Zj0lZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYWMtPnNlc3Npb24sIHBvcnQtPmRzcF9idWYsIHBvcnQtPmNwdV9idWYpOworCQlyZXQgPSAoKHBvcnQtPmRzcF9idWYgIT0gcG9ydC0+Y3B1X2J1ZikgPyAwIDogLTEpOworCQltdXRleF91bmxvY2soJnBvcnQtPmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX3E2YXNtX2FkZF9oZHIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHN0cnVjdCBhcHJfaGRyICpoZHIsCisJCQl1aW50MzJfdCBwa3Rfc2l6ZSwgdWludDMyX3QgY21kX2ZsZywgdWludDMyX3Qgc3RyZWFtX2lkKQoreworCWRldl92ZGJnKGFjLT5kZXYsICIlczogcGt0X3NpemU9JWQgY21kX2ZsZz0lZCBzZXNzaW9uPSVkIHN0cmVhbV9pZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnNlc3Npb24sIHN0cmVhbV9pZCk7CisJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTCIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCisJCQlBUFJfUEtUX1ZFUik7CisJaGRyLT5zcmNfc3ZjID0gKChzdHJ1Y3QgYXByX3N2YyAqKWFjLT5hcHIpLT5pZDsKKwloZHItPnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJaGRyLT5kZXN0X3N2YyA9IEFQUl9TVkNfQVNNOworCWhkci0+ZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJaGRyLT5zcmNfcG9ydCA9ICgoYWMtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgKHN0cmVhbV9pZCk7CisJaGRyLT5kZXN0X3BvcnQgPSAoKGFjLT5zZXNzaW9uIDw8IDgpICYgMHhGRjAwKSB8IChzdHJlYW1faWQpOworCWlmIChjbWRfZmxnKQorCQlxNmFzbV91cGRhdGVfdG9rZW4oJmhkci0+dG9rZW4sCisJCQkJICAgYWMtPnNlc3Npb24sCisJCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCisJCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCisJCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KKwkJCQkgICBXQUlUX0NNRCk7CisKKwloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOworCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKQoreworCV9fcTZhc21fYWRkX2hkcihhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnN0cmVhbV9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIHE2YXNtX3N0cmVhbV9hZGRfaGRyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcsIGludDMyX3Qgc3RyZWFtX2lkKQoreworCV9fcTZhc21fYWRkX2hkcihhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywgc3RyZWFtX2lkKTsKK30KKworc3RhdGljIHZvaWQgX19xNmFzbV9hZGRfaGRyX2FzeW5jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJCSAgdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcsCisJCQkJICB1aW50MzJfdCBzdHJlYW1faWQsIHU4IG5vX3dhaXRfZmxhZykKK3sKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHBrdF9zaXplID0gJWQsIGNtZF9mbGcgPSAlZCwgc2Vzc2lvbiA9ICVkIHN0cmVhbV9pZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnNlc3Npb24sIHN0cmVhbV9pZCk7CisJaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCisJCQlBUFJfUEtUX1ZFUik7CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwloZHItPnNyY19zdmMgPSAoKHN0cnVjdCBhcHJfc3ZjICopYWMtPmFwciktPmlkOworCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwloZHItPmRlc3Rfc3ZjID0gQVBSX1NWQ19BU007CisJaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwloZHItPnNyY19wb3J0ID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkYwMCkgfCAoc3RyZWFtX2lkKTsKKwloZHItPmRlc3RfcG9ydCA9ICgoYWMtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgKHN0cmVhbV9pZCk7CisJaWYgKGNtZF9mbGcpIHsKKwkJcTZhc21fdXBkYXRlX3Rva2VuKCZoZHItPnRva2VuLAorCQkJCSAgIGFjLT5zZXNzaW9uLAorCQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIEJ1ZmZlciBpbmRleCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCisJCQkJICAgbm9fd2FpdF9mbGFnKTsKKworCX0KKwloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOworfQorCitzdGF0aWMgdm9pZCBxNmFzbV9hZGRfaGRyX2FzeW5jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKQoreworCV9fcTZhc21fYWRkX2hkcl9hc3luYyhhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywKKwkJCSAgICAgIGFjLT5zdHJlYW1faWQsIFdBSVRfQ01EKTsKK30KKworc3RhdGljIHZvaWQgcTZhc21fc3RyZWFtX2FkZF9oZHJfYXN5bmMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCXN0cnVjdCBhcHJfaGRyICpoZHIsIHVpbnQzMl90IHBrdF9zaXplLAorCQkJCQl1aW50MzJfdCBjbWRfZmxnLCBpbnQzMl90IHN0cmVhbV9pZCkKK3sKKwlfX3E2YXNtX2FkZF9oZHJfYXN5bmMoYWMsIGhkciwgcGt0X3NpemUsIGNtZF9mbGcsCisJCQkgICAgICBzdHJlYW1faWQsIE5PX1dBSVRfQ01EKTsKK30KKworc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcl9jdXN0b21fdG9wb2xvZ3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCQkJICB1aW50MzJfdCBwa3Rfc2l6ZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IHBrdF9zaXplPSVkIHNlc3Npb249JWRcbiIsCisJCQlfX2Z1bmNfXywgcGt0X3NpemUsIGFjLT5zZXNzaW9uKTsKKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwloZHItPmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQlBUFJfSERSX0xFTihzaXplb2Yoc3RydWN0IGFwcl9oZHIpKSwKKwkJCUFQUl9QS1RfVkVSKTsKKwloZHItPnNyY19zdmMgPSAoKHN0cnVjdCBhcHJfc3ZjICopYWMtPmFwciktPmlkOworCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwloZHItPmRlc3Rfc3ZjID0gQVBSX1NWQ19BU007CisJaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwloZHItPnNyY19wb3J0ID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkYwMCkgfCAweDAxOworCWhkci0+ZGVzdF9wb3J0ID0gMDsKKwlxNmFzbV91cGRhdGVfdG9rZW4oJmhkci0+dG9rZW4sCisJCQkgICBhYy0+c2Vzc2lvbiwKKwkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLworCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCisJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLworCQkJICAgV0FJVF9DTUQpOworCWhkci0+cGt0X3NpemUgID0gcGt0X3NpemU7CisJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBxNmFzbV9hZGRfbW1hcGhkcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKKwkJCXUzMiBwa3Rfc2l6ZSwgaW50IGRpcikKK3sKKwlwcl9kZWJ1ZygiJXM6IHBrdCBzaXplPSVkXG4iLAorCQlfX2Z1bmNfXywgcGt0X3NpemUpOworCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJaGRyLT5zcmNfcG9ydCA9IDA7CisJaGRyLT5kZXN0X3BvcnQgPSAwOworCXE2YXNtX3VwZGF0ZV90b2tlbigmaGRyLT50b2tlbiwKKwkJCSAgIGFjLT5zZXNzaW9uLAorCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCisJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KKwkJCSAgIGRpciwKKwkJCSAgIFdBSVRfQ01EKTsKKwloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOworfQorCitzdGF0aWMgaW50IF9fcTZhc21fb3Blbl9yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCSAgICAgdWludDMyX3QgcGNtX2Zvcm1hdF9ibG9ja192ZXIsCisJCQkgICAgIGJvb2wgdHNfbW9kZSkKK3sKKwlpbnQgcmMgPSAweDAwOworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWRfdjMgb3BlbjsKKworCWNvbmZpZ19kZWJ1Z19mc19yZXNldF9pbmRleCgpOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEX1YzOworCS8qIFN0cmVhbSBwcmlvIDogSGlnaCwgcHJvdmlkZSBtZXRhIGluZm8gd2l0aCBlbmNvZGVkIGZyYW1lcyAqLworCW9wZW4uc3JjX2VuZHBvaW50eXBlID0gQVNNX0VORF9QT0lOVF9ERVZJQ0VfTUFUUklYOworCisJb3Blbi5wcmVwcm9jb3BvX2lkID0gcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwoKTsKKwlpZiAoKG9wZW4ucHJlcHJvY29wb19pZCA9PSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfRFRTX0hQWCkgfHwKKwkgICAgKG9wZW4ucHJlcHJvY29wb19pZCA9PSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX1BMVVMpKQorCQlvcGVuLnByZXByb2NvcG9faWQgPSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX05PTkU7CisJb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisJb3Blbi5tb2RlX2ZsYWdzID0gMHgwOworCisJYWMtPnRvcG9sb2d5ID0gb3Blbi5wcmVwcm9jb3BvX2lkOworCWFjLT5hcHBfdHlwZSA9IHE2YXNtX2dldF9hc21fYXBwX3R5cGVfY2FsKCk7CisJaWYgKGFjLT5wZXJmX21vZGUgPT0gTE9XX0xBVEVOQ1lfUENNX01PREUpIHsKKwkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9MT1dfTEFURU5DWV9UWF9TVFJFQU1fU0VTU0lPTiA8PAorCQkJQVNNX1NISUZUX1NUUkVBTV9QRVJGX01PREVfRkxBR19JTl9PUEVOX1JFQUQ7CisJfSBlbHNlIHsKKwkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9MRUdBQ1lfU1RSRUFNX1NFU1NJT04gPDwKKwkJCUFTTV9TSElGVF9TVFJFQU1fUEVSRl9NT0RFX0ZMQUdfSU5fT1BFTl9SRUFEOworCX0KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBGT1JNQVRfTElORUFSX1BDTToKKwkJb3Blbi5tb2RlX2ZsYWdzIHw9IDB4MDA7CisJCW9wZW4uZW5jX2NmZ19pZCA9IHE2YXNtX2dldF9wY21fZm9ybWF0X2lkKHBjbV9mb3JtYXRfYmxvY2tfdmVyKTsKKwkJaWYgKHRzX21vZGUpCisJCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQUJTT0xVVEVfVElNRVNUQU1QX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOworCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRzcxMV9BTEFXX0ZTOgorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOworCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRzcxMV9NTEFXX0ZTOgorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOworCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0c3MTFfTUxBV19GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVjEzSzoKKwkJb3Blbi5tb2RlX2ZsYWdzIHw9IEJVRkZFUl9NRVRBX0VOQUJMRTsKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9WMTNLX0ZTOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9FVlJDOgorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOworCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0VWUkNfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0FNUk5COgorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOworCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9BTVJXQjoKKwkJb3Blbi5tb2RlX2ZsYWdzIHw9IEJVRkZFUl9NRVRBX0VOQUJMRTsKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9BTVJXQl9GUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXQgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBmb3JtYXQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBvcGVuIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG9wZW4gcmVhZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWFjLT5pb19tb2RlIHw9IFRVTl9SRUFEX0lPX01PREU7CisKKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX29wZW5fcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJdWludDMyX3QgZm9ybWF0KQoreworCXJldHVybiBfX3E2YXNtX29wZW5fcmVhZChhYywgZm9ybWF0LCAxNiwKKwkJCQlQQ01fTUVESUFfRk9STUFUX1YyIC8qbWVkaWEgZm10IGJsb2NrIHZlciovLAorCQkJCWZhbHNlLyp0c19tb2RlKi8pOworfQorCitpbnQgcTZhc21fb3Blbl9yZWFkX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkKGFjLCBmb3JtYXQsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgUENNX01FRElBX0ZPUk1BVF9WMiAvKm1lZGlhIGZtdCBibG9jayB2ZXIqLywKKwkJCQkgZmFsc2UvKnRzX21vZGUqLyk7Cit9CisKKy8qCisgKiBhc21fb3Blbl9yZWFkX3YzIC0gT3BlbnMgYXVkaW8gY2FwdHVyZSBzZXNzaW9uCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEBmb3JtYXQ6IGVuY29kZXIgZm9ybWF0CisgKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgY2FwdHVyZSBzZXNzaW9uCisgKi8KK2ludCBxNmFzbV9vcGVuX3JlYWRfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKKwkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKK3sKKwlyZXR1cm4gX19xNmFzbV9vcGVuX3JlYWQoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAorCQkJCSBQQ01fTUVESUFfRk9STUFUX1YzLyptZWRpYSBmbXQgYmxvY2sgdmVyKi8sCisJCQkJIGZhbHNlLyp0c19tb2RlKi8pOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9vcGVuX3JlYWRfdjMpOworCisvKgorICogYXNtX29wZW5fcmVhZF92NCAtIE9wZW5zIGF1ZGlvIGNhcHR1cmUgc2Vzc2lvbgorICoKKyAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCisgKiBAZm9ybWF0OiBlbmNvZGVyIGZvcm1hdAorICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIGNhcHR1cmUgc2Vzc2lvbgorICovCitpbnQgcTZhc21fb3Blbl9yZWFkX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkKGFjLCBmb3JtYXQsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgUENNX01FRElBX0ZPUk1BVF9WNCAvKm1lZGlhIGZtdCBibG9jayB2ZXIqLywKKwkJCQkgdHJ1ZS8qdHNfbW9kZSovKTsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fb3Blbl9yZWFkX3Y0KTsKKworaW50IHE2YXNtX29wZW5fd3JpdGVfY29tcHJlc3NlZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJCXVpbnQzMl90IHBhc3N0aHJvdWdoX2ZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl93cml0ZV9jb21wcmVzc2VkIG9wZW47CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBhY1slcEtdIE5VTExcbiIsICBfX2Z1bmNfXywgYWMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlWyVwS10gTlVMTFxuIiwgX19mdW5jX18sICBhYy0+YXByKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIHdyX2Zvcm1hdFsweCV4XSIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKKwkJZm9ybWF0KTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFKTsKKwlvcGVuLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQ7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEZPUk1BVF9BQzM6CisJCW9wZW4uZm10X2lkID0gQVNNX01FRElBX0ZNVF9BQzM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0VBQzM6CisJCW9wZW4uZm10X2lkID0gQVNNX01FRElBX0ZNVF9FQUMzOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9EVFM6CisJCW9wZW4uZm10X2lkID0gQVNNX01FRElBX0ZNVF9EVFM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0RTRDoKKwkJb3Blbi5mbXRfaWQgPSBBU01fTUVESUFfRk1UX0RTRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgZm9ybWF0KTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwkvKiBCZWxvdyBmbGFnIGluZGljYXRlcyB0aGUgRFNQIHRoYXQgQ29tcHJlc3NlZCBhdWRpbyBpbnB1dAorCSAqIHN0cmVhbSBpcyBub3QgSUVDIDYxOTM3IG9yIElFQyA2MDk1OCBwYWNrZXRpemllZAorCSAqLworCWlmIChwYXNzdGhyb3VnaF9mbGFnID09IENPTVBSRVNTRURfUEFTU1RIUk9VR0ggfHwKKwkJcGFzc3Rocm91Z2hfZmxhZyA9PSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RTRCkgeworCQlvcGVuLmZsYWdzID0gMHgwOworCQlwcl9kZWJ1ZygiJXM6IEZsYWcgMCBDT01QUkVTU0VEX1BBU1NUSFJPVUdIXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIGlmIChwYXNzdGhyb3VnaF9mbGFnID09IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfQ09OVkVSVCkgeworCQlvcGVuLmZsYWdzID0gMHg4OworCQlwcl9kZWJ1ZygiJXM6IEZsYWcgOCAtIENPTVBSRVNTRURfUEFTU1RIUk9VR0hfQ09OVkVSVFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBwYXNzdGhyb3VnaCB0eXBlWyVkXVxuIiwKKwkJCV9fZnVuY19fLCBwYXNzdGhyb3VnaF9mbGFnKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm9wZW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogb3BlbiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCisJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCAxKkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgT1BFTl9XUklURV9DT01QUiByY1slZF1cbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJldHVybiAwOworCitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9vcGVuX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQkgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIHVpbnQzMl90IHN0cmVhbV9pZCwKKwkJCSAgICAgIGJvb2wgaXNfZ2FwbGVzc19tb2RlLAorCQkJICAgICAgdWludDMyX3QgcGNtX2Zvcm1hdF9ibG9ja192ZXIpCit7CisJaW50IHJjID0gMHgwMDsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl93cml0ZV92MyBvcGVuOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdIHdyX2Zvcm1hdFsweCV4XVxuIiwKKwkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBmb3JtYXQpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwkvKgorCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKKwkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKKwkgKiBhc3NvY2lhdGVkCisJICovCisJaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCisJCXE2YXNtX3VwZGF0ZV90b2tlbigmb3Blbi5oZHIudG9rZW4sCisJCQkJICAgYWMtPnNlc3Npb24sCisJCQkJICAgc3RyZWFtX2lkLAorCQkJCSAgIDAsIC8qIEJ1ZmZlciBpbmRleCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCisJCQkJICAgV0FJVF9DTUQpOworCisJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiB0b2tlbiA9IDB4JXgsIHN0cmVhbV9pZCAgJWQsIHNlc3Npb24gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBvcGVuLmhkci50b2tlbiwgc3RyZWFtX2lkLCBhYy0+c2Vzc2lvbik7CisJb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMzsKKwlvcGVuLm1vZGVfZmxhZ3MgPSAweDAwOworCWlmIChhYy0+cGVyZl9tb2RlID09IFVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREUpCisJCW9wZW4ubW9kZV9mbGFncyB8PSBBU01fVUxMX1BPU1RfUFJPQ0VTU0lOR19TVFJFQU1fU0VTU0lPTjsKKwllbHNlIGlmIChhYy0+cGVyZl9tb2RlID09IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFKQorCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX1VMVFJBX0xPV19MQVRFTkNZX1NUUkVBTV9TRVNTSU9OOworCWVsc2UgaWYgKGFjLT5wZXJmX21vZGUgPT0gTE9XX0xBVEVOQ1lfUENNX01PREUpCisJCW9wZW4ubW9kZV9mbGFncyB8PSBBU01fTE9XX0xBVEVOQ1lfU1RSRUFNX1NFU1NJT047CisJZWxzZSB7CisJCW9wZW4ubW9kZV9mbGFncyB8PSBBU01fTEVHQUNZX1NUUkVBTV9TRVNTSU9OOworCQlpZiAoaXNfZ2FwbGVzc19tb2RlKQorCQkJb3Blbi5tb2RlX2ZsYWdzIHw9IDEgPDwgQVNNX1NISUZUX0dBUExFU1NfTU9ERV9GTEFHOworCX0KKworCS8qIHNvdXJjZSBlbmRwb2ludCA6IG1hdHJpeCAqLworCW9wZW4uc2lua19lbmRwb2ludHlwZSA9IEFTTV9FTkRfUE9JTlRfREVWSUNFX01BVFJJWDsKKwlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKworCW9wZW4ucG9zdHByb2NvcG9faWQgPSBxNmFzbV9nZXRfYXNtX3RvcG9sb2d5X2NhbCgpOworCWlmICgoYWMtPnBlcmZfbW9kZSAhPSBMRUdBQ1lfUENNX01PREUpICYmCisJICAgICgob3Blbi5wb3N0cHJvY29wb19pZCA9PSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfRFRTX0hQWCkgfHwKKwkgICAgIChvcGVuLnBvc3Rwcm9jb3BvX2lkID09IEFTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9IUFhfUExVUykpKQorCQlvcGVuLnBvc3Rwcm9jb3BvX2lkID0gQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9OT05FOworCisJLyogRm9yIERUUyBFQUdMRSBvbmx5LCBmb3JjZSAyNCBiaXQgKi8KKwlpZiAoKG9wZW4ucG9zdHByb2NvcG9faWQgPT0gQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0RUU19IUFgpIHx8CisJICAgICAob3Blbi5wb3N0cHJvY29wb19pZCA9PSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX1BMVVMpKQorCQlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IDI0OworCisJcHJfZGVidWcoIiVzOiBwZXJmX21vZGUgJWQgYXNtX3RvcG9sb2d5IDB4JXggYnBzICVkXG4iLCBfX2Z1bmNfXywKKwkJIGFjLT5wZXJmX21vZGUsIG9wZW4ucG9zdHByb2NvcG9faWQsIG9wZW4uYml0c19wZXJfc2FtcGxlKTsKKworCS8qCisJICogRm9yIEdhcGxlc3MgcGxheWJhY2sgaXQgd2lsbCB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBmb3IgbmV4dCBzdHJlYW0sCisJICogU28gdXNlIHRoZSBzYW1lIHRvcG9sb2d5CisJICovCisJaWYgKCFhYy0+dG9wb2xvZ3kpIHsKKwkJYWMtPnRvcG9sb2d5ID0gb3Blbi5wb3N0cHJvY29wb19pZDsKKwkJYWMtPmFwcF90eXBlID0gcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwoKTsKKwl9CisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEZPUk1BVF9MSU5FQVJfUENNOgorCQlvcGVuLmRlY19mbXRfaWQgPSBxNmFzbV9nZXRfcGNtX2Zvcm1hdF9pZChwY21fZm9ybWF0X2Jsb2NrX3Zlcik7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX01QRUc0X0FBQzoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BQUNfVjI7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX01QRUc0X01VTFRJX0FBQzoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BQUNfVjI7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX1dNQV9WOToKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9XTUFfVjlfVjI7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX1dNQV9WMTBQUk86CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfV01BX1YxMFBST19WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfTVAzOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX01QMzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfQUMzOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FDMzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRUFDMzoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9FQUMzOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9NUDI6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfTVAyOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9GTEFDOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0ZMQUM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0FMQUM6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQUxBQzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVk9SQklTOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX1ZPUkJJUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfQVBFOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FQRTsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRFNEOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0RTRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXQgMHgleFxuIiwgX19mdW5jX18sIGZvcm1hdCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZvcGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3Igb3BlbiB3cml0ZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJYWMtPmlvX21vZGUgfD0gVFVOX1dSSVRFX0lPX01PREU7CisKKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX29wZW5fd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCkKK3sKKwlyZXR1cm4gX19xNmFzbV9vcGVuX3dyaXRlKGFjLCBmb3JtYXQsIDE2LCBhYy0+c3RyZWFtX2lkLAorCQkJCSAgZmFsc2UgLypnYXBsZXNzKi8sCisJCQkJICBQQ01fTUVESUFfRk9STUFUX1YyIC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Cit9CisKK2ludCBxNmFzbV9vcGVuX3dyaXRlX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJICBhYy0+c3RyZWFtX2lkLCBmYWxzZSAvKmdhcGxlc3MqLywKKwkJCQkgIFBDTV9NRURJQV9GT1JNQVRfVjIgLypwY21fZm9ybWF0X2Jsb2NrX3ZlciovKTsKK30KKworLyoKKyAqIHE2YXNtX29wZW5fd3JpdGVfdjMgLSBPcGVucyBhdWRpbyBwbGF5YmFjayBzZXNzaW9uCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEBmb3JtYXQ6IGRlY29kZXIgZm9ybWF0CisgKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgcGxheWJhY2sgc2Vzc2lvbgorICovCitpbnQgcTZhc21fb3Blbl93cml0ZV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQoreworCXJldHVybiBfX3E2YXNtX29wZW5fd3JpdGUoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAorCQkJCSAgYWMtPnN0cmVhbV9pZCwgZmFsc2UgLypnYXBsZXNzKi8sCisJCQkJICBQQ01fTUVESUFfRk9STUFUX1YzIC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX29wZW5fd3JpdGVfdjMpOworCisvKgorICogcTZhc21fb3Blbl93cml0ZV92NCAtIE9wZW5zIGF1ZGlvIHBsYXliYWNrIHNlc3Npb24KKyAqCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQGZvcm1hdDogZGVjb2RlciBmb3JtYXQKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBwbGF5YmFjayBzZXNzaW9uCisgKi8KK2ludCBxNmFzbV9vcGVuX3dyaXRlX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJICBhYy0+c3RyZWFtX2lkLCBmYWxzZSAvKmdhcGxlc3MqLywKKwkJCQkgIFBDTV9NRURJQV9GT1JNQVRfVjQgLypwY21fZm9ybWF0X2Jsb2NrX3ZlciovKTsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fb3Blbl93cml0ZV92NCk7CisKK2ludCBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50MzJfdCBzdHJlYW1faWQsCisJCQkgICAgICAgYm9vbCBpc19nYXBsZXNzX21vZGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJICBzdHJlYW1faWQsIGlzX2dhcGxlc3NfbW9kZSwKKwkJCQkgIFBDTV9NRURJQV9GT1JNQVRfVjIgLypwY21fZm9ybWF0X2Jsb2NrX3ZlciovKTsKK30KKworLyoKKyAqIHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YzIC0gQ3JlYXRlcyBhdWRpbyBzdHJlYW0gZm9yIHBsYXliYWNrCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEBmb3JtYXQ6IGFzbSBwbGF5YmFjayBmb3JtYXQKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiByZXF1ZXN0ZWQgc3RyZWFtCisgKiBAc3RyZWFtX2lkOiBzdHJlYW0gaWQgb2Ygc3RyZWFtIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24KKyAqIEBpc19nYXBsZXNzX21vZGU6IHRydWUgaWYgZ2FwbGVzcyBtb2RlIG5lZWRzIHRvIGJlIGVuYWJsZWQKKyAqLworaW50IHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCisJCQkgICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBpbnQzMl90IHN0cmVhbV9pZCwKKwkJCSAgICAgICBib29sIGlzX2dhcGxlc3NfbW9kZSkKK3sKKwlyZXR1cm4gX19xNmFzbV9vcGVuX3dyaXRlKGFjLCBmb3JtYXQsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgIHN0cmVhbV9pZCwgaXNfZ2FwbGVzc19tb2RlLAorCQkJCSAgUENNX01FRElBX0ZPUk1BVF9WMyAvKnBjbV9mb3JtYXRfYmxvY2tfdmVyKi8pOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92Myk7CisKKy8qCisgKiBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92NCAtIENyZWF0ZXMgYXVkaW8gc3RyZWFtIGZvciBwbGF5YmFjaworICoKKyAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCisgKiBAZm9ybWF0OiBhc20gcGxheWJhY2sgZm9ybWF0CisgKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgcmVxdWVzdGVkIHN0cmVhbQorICogQHN0cmVhbV9pZDogc3RyZWFtIGlkIG9mIHN0cmVhbSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCisgKiBAaXNfZ2FwbGVzc19tb2RlOiB0cnVlIGlmIGdhcGxlc3MgbW9kZSBuZWVkcyB0byBiZSBlbmFibGVkCisgKi8KK2ludCBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAorCQkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50MzJfdCBzdHJlYW1faWQsCisJCQkgICAgICAgYm9vbCBpc19nYXBsZXNzX21vZGUpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJICBzdHJlYW1faWQsIGlzX2dhcGxlc3NfbW9kZSwKKwkJCQkgIFBDTV9NRURJQV9GT1JNQVRfVjQgLypwY21fZm9ybWF0X2Jsb2NrX3ZlciovKTsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQpOworCitzdGF0aWMgaW50IF9fcTZhc21fb3Blbl9yZWFkX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCByZF9mb3JtYXQsCisJCQkJICAgdWludDMyX3Qgd3JfZm9ybWF0LCBib29sIGlzX21ldGFfZGF0YV9tb2RlLAorCQkJCSAgIHVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgICBib29sIG92ZXJ3cml0ZV90b3BvbG9neSwgaW50IHRvcG9sb2d5KQoreworCWludCByYyA9IDB4MDA7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZHdyaXRlX3YyIG9wZW47CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOworCXByX2RlYnVnKCIlczogd3JfZm9ybWF0WzB4JXhdcmRfZm9ybWF0WzB4JXhdXG4iLAorCQkJX19mdW5jX18sIHdyX2Zvcm1hdCwgcmRfZm9ybWF0KTsKKworCWFjLT5pb19tb2RlIHw9IE5UX01PREU7CisJcTZhc21fYWRkX2hkcihhYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwlvcGVuLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURXUklURV9WMjsKKworCW9wZW4ubW9kZV9mbGFncyA9IGlzX21ldGFfZGF0YV9tb2RlID8gQlVGRkVSX01FVEFfRU5BQkxFIDogMDsKKwlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKwkvKiBzb3VyY2UgZW5kcG9pbnQgOiBtYXRyaXggKi8KKwlvcGVuLnBvc3Rwcm9jb3BvX2lkID0gcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwoKTsKKworCW9wZW4ucG9zdHByb2NvcG9faWQgPSBvdmVyd3JpdGVfdG9wb2xvZ3kgPworCQkJICAgICAgdG9wb2xvZ3kgOiBvcGVuLnBvc3Rwcm9jb3BvX2lkOworCWFjLT50b3BvbG9neSA9IG9wZW4ucG9zdHByb2NvcG9faWQ7CisJYWMtPmFwcF90eXBlID0gcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwoKTsKKworCS8qIEZvciBEVFMgRUFHTEUgb25seSwgZm9yY2UgMjQgYml0ICovCisJaWYgKChvcGVuLnBvc3Rwcm9jb3BvX2lkID09IEFTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9EVFNfSFBYKSB8fAorCSAgICAgKG9wZW4ucG9zdHByb2NvcG9faWQgPT0gQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVIpKQorCQlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IDI0OworCisJc3dpdGNoICh3cl9mb3JtYXQpIHsKKwljYXNlIEZPUk1BVF9MSU5FQVJfUENNOgorCWNhc2UgRk9STUFUX01VTFRJX0NIQU5ORUxfTElORUFSX1BDTToKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfTVBFRzRfTVVMVElfQUFDOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfV01BX1Y5OgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX1dNQV9WOV9WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfV01BX1YxMFBSTzoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9XTUFfVjEwUFJPX1YyOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9BTVJOQjoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BTVJOQl9GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfQU1SV0I6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQU1SV0JfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0FNUl9XQl9QTFVTOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FNUl9XQl9QTFVTX1YyOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9WMTNLOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX1YxM0tfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0VWUkM6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRVZSQ19GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRVZSQ0I6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRVZSQ0JfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0VWUkNXQjoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9FVlJDV0JfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX01QMzoKKwkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9NUDM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0FMQUM6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQUxBQzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfQVBFOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FQRTsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRFNEOgorCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0RTRDsKKwljYXNlIEZPUk1BVF9HNzExX0FMQVdfRlM6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9BTEFXX0ZTOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9HNzExX01MQVdfRlM6CisJCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9NTEFXX0ZTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGZvcm1hdCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCB3cl9mb3JtYXQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJc3dpdGNoIChyZF9mb3JtYXQpIHsKKwljYXNlIEZPUk1BVF9MSU5FQVJfUENNOgorCWNhc2UgRk9STUFUX01VTFRJX0NIQU5ORUxfTElORUFSX1BDTToKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgorCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRzcxMV9BTEFXX0ZTOgorCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfRzcxMV9NTEFXX0ZTOgorCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0c3MTFfTUxBV19GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfVjEzSzoKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9WMTNLX0ZTOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9FVlJDOgorCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0VWUkNfRlM7CisJCWJyZWFrOworCWNhc2UgRk9STUFUX0FNUk5COgorCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9BTVJXQjoKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9BTVJXQl9GUzsKKwkJYnJlYWs7CisJY2FzZSBGT1JNQVRfQUxBQzoKKwkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9BTEFDOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9BUEU6CisJCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfQVBFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGZvcm1hdCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCByZF9mb3JtYXQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWRldl92ZGJnKGFjLT5kZXYsICIlczogcmRmb3JtYXRbMHgleF13cmZvcm1hdFsweCV4XVxuIiwgX19mdW5jX18sCisJCQlvcGVuLmVuY19jZmdfaWQsIG9wZW4uZGVjX2ZtdF9pZCk7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm9wZW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogb3BlbiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJX19mdW5jX18sIG9wZW4uaGRyLm9wY29kZSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBvcGVuIHJlYWQtd3JpdGVcbiIsCisJCQkJX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX29wZW5fcmVhZF93cml0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmRfZm9ybWF0LAorCQkJICB1aW50MzJfdCB3cl9mb3JtYXQpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkX3dyaXRlKGFjLCByZF9mb3JtYXQsIHdyX2Zvcm1hdCwKKwkJCQkgICAgICAgdHJ1ZS8qbWV0YSBkYXRhIG1vZGUqLywKKwkJCQkgICAgICAgMTYgLypiaXRzX3Blcl9zYW1wbGUqLywKKwkJCQkgICAgICAgZmFsc2UgLypvdmVyd3JpdGVfdG9wb2xvZ3kqLywgMCk7Cit9CisKK2ludCBxNmFzbV9vcGVuX3JlYWRfd3JpdGVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IHJkX2Zvcm1hdCwKKwkJCSAgICAgdWludDMyX3Qgd3JfZm9ybWF0LCBib29sIGlzX21ldGFfZGF0YV9tb2RlLAorCQkJICAgICB1aW50MzJfdCBiaXRzX3Blcl9zYW1wbGUsIGJvb2wgb3ZlcndyaXRlX3RvcG9sb2d5LAorCQkJICAgICBpbnQgdG9wb2xvZ3kpCit7CisJcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkX3dyaXRlKGFjLCByZF9mb3JtYXQsIHdyX2Zvcm1hdCwKKwkJCQkgICAgICAgaXNfbWV0YV9kYXRhX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgICAgICAgb3ZlcndyaXRlX3RvcG9sb2d5LCB0b3BvbG9neSk7Cit9CisKK2ludCBxNmFzbV9vcGVuX2xvb3BiYWNrX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJaW50IHJjID0gMHgwMDsKKwlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9sb29wYmFja192MiBvcGVuOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9MT09QQkFDS19WMjsKKworCW9wZW4ubW9kZV9mbGFncyA9IDA7CisJb3Blbi5zcmNfZW5kcG9pbnR5cGUgPSAwOworCW9wZW4uc2lua19lbmRwb2ludHlwZSA9IDA7CisJLyogc291cmNlIGVuZHBvaW50IDogbWF0cml4ICovCisJb3Blbi5wb3N0cHJvY29wb19pZCA9IHE2YXNtX2dldF9hc21fdG9wb2xvZ3lfY2FsKCk7CisKKwlhYy0+YXBwX3R5cGUgPSBxNmFzbV9nZXRfYXNtX2FwcF90eXBlX2NhbCgpOworCWFjLT50b3BvbG9neSA9IG9wZW4ucG9zdHByb2NvcG9faWQ7CisJb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisJb3Blbi5yZXNlcnZlZCA9IDA7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm9wZW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogb3BlbiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCW9wZW4uaGRyLm9wY29kZSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG9wZW5fbG9vcGJhY2tcbiIsCisJCQkJX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworc3RhdGljCitpbnQgcTZhc21fc2V0X3NoYXJlZF9jaXJjX2J1ZmYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkgICAgICAgc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fc2hhcmVkX2lvICpvcGVuLAorCQkJICAgICAgIGludCBidWZzeiwgaW50IGJ1ZmNudCwKKwkJCSAgICAgICBpbnQgZGlyKQoreworCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1Zl9jaXJjOworCWludCBieXRlc190b19hbGxvYywgcmM7CisJc2l6ZV90IGxlbjsKKworCWJ1Zl9jaXJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX2J1ZmZlciksIEdGUF9LRVJORUwpOworCisJaWYgKCFidWZfY2lyYykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCisJYWMtPnBvcnRbZGlyXS5idWYgPSBidWZfY2lyYzsKKworCWJ5dGVzX3RvX2FsbG9jID0gYnVmc3ogKiBidWZjbnQ7CisJYnl0ZXNfdG9fYWxsb2MgPSBQQUdFX0FMSUdOKGJ5dGVzX3RvX2FsbG9jKTsKKworCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiYXVkaW9fY2xpZW50IiwgJmJ1Zl9jaXJjLT5jbGllbnQsCisJCQkmYnVmX2NpcmMtPmhhbmRsZSwgYnl0ZXNfdG9fYWxsb2MsCisJCQkoaW9uX3BoeXNfYWRkcl90ICopJmJ1Zl9jaXJjLT5waHlzLAorCQkJJmxlbiwgJmJ1Zl9jaXJjLT5kYXRhKTsKKworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBBdWRpbyBJT04gYWxsb2MgaXMgZmFpbGVkLCByYyA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQlyYyk7CisJCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJa2ZyZWUoYnVmX2NpcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJYnVmX2NpcmMtPnVzZWQgPSBkaXIgXiAxOworCWJ1Zl9jaXJjLT5zaXplID0gYnl0ZXNfdG9fYWxsb2M7CisJYnVmX2NpcmMtPmFjdHVhbF9zaXplID0gYnl0ZXNfdG9fYWxsb2M7CisJbWVtc2V0KGJ1Zl9jaXJjLT5kYXRhLCAwLCBidWZfY2lyYy0+YWN0dWFsX3NpemUpOworCisJYWMtPnBvcnRbZGlyXS5tYXhfYnVmX2NudCA9IDE7CisKKwlvcGVuLT5zaGFyZWRfY2lyY19idWZfbWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7CisJb3Blbi0+c2hhcmVkX2NpcmNfYnVmX251bV9yZWdpb25zID0gMTsKKwlvcGVuLT5zaGFyZWRfY2lyY19idWZfcHJvcGVydHlfZmxhZyA9IDB4MDA7CisJb3Blbi0+c2hhcmVkX2NpcmNfYnVmX3N0YXJ0X3BoeV9hZGRyX2xzdyA9CisJCQlsb3dlcl8zMl9iaXRzKGJ1Zl9jaXJjLT5waHlzKTsKKwlvcGVuLT5zaGFyZWRfY2lyY19idWZfc3RhcnRfcGh5X2FkZHJfbXN3ID0KKwkJCXVwcGVyXzMyX2JpdHMoYnVmX2NpcmMtPnBoeXMpOworCW9wZW4tPnNoYXJlZF9jaXJjX2J1Zl9zaXplID0gYnVmc3ogKiBidWZjbnQ7CisKKwlvcGVuLT5tYXBfcmVnaW9uX2NpcmNfYnVmLnNobV9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2NpcmMtPnBoeXMpOworCW9wZW4tPm1hcF9yZWdpb25fY2lyY19idWYuc2htX2FkZHJfbXN3ID0gdXBwZXJfMzJfYml0cyhidWZfY2lyYy0+cGh5cyk7CisJb3Blbi0+bWFwX3JlZ2lvbl9jaXJjX2J1Zi5tZW1fc2l6ZV9ieXRlcyA9IGJ5dGVzX3RvX2FsbG9jOworCisJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljCitpbnQgcTZhc21fc2V0X3NoYXJlZF9wb3NfYnVmZihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSAgICAgICBzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8gKm9wZW4sCisJCQkgICAgICAgaW50IGRpcikKK3sKKwlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWZfcG9zID0gJmFjLT5zaGFyZWRfcG9zX2J1ZjsKKwlpbnQgcmM7CisJc2l6ZV90IGxlbjsKKwlpbnQgYnl0ZXNfdG9fYWxsb2MgPSBzaXplb2Yoc3RydWN0IGFzbV9zaGFyZWRfcG9zaXRpb25fYnVmZmVyKTsKKworCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7CisKKwlieXRlc190b19hbGxvYyA9IFBBR0VfQUxJR04oYnl0ZXNfdG9fYWxsb2MpOworCisJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJhdWRpb19jbGllbnQiLCAmYnVmX3Bvcy0+Y2xpZW50LAorCQkJJmJ1Zl9wb3MtPmhhbmRsZSwgYnl0ZXNfdG9fYWxsb2MsCisJCQkoaW9uX3BoeXNfYWRkcl90ICopJmJ1Zl9wb3MtPnBoeXMsICZsZW4sCisJCQkmYnVmX3Bvcy0+ZGF0YSk7CisKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogQXVkaW8gcG9zIGJ1ZiBJT04gYWxsb2MgaXMgZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlidWZfcG9zLT51c2VkID0gZGlyIF4gMTsKKwlidWZfcG9zLT5zaXplID0gYnl0ZXNfdG9fYWxsb2M7CisJYnVmX3Bvcy0+YWN0dWFsX3NpemUgPSBieXRlc190b19hbGxvYzsKKworCW9wZW4tPnNoYXJlZF9wb3NfYnVmX21lbV9wb29sX2lkID0gQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MOworCW9wZW4tPnNoYXJlZF9wb3NfYnVmX251bV9yZWdpb25zID0gMTsKKwlvcGVuLT5zaGFyZWRfcG9zX2J1Zl9wcm9wZXJ0eV9mbGFnID0gMHgwMDsKKwlvcGVuLT5zaGFyZWRfcG9zX2J1Zl9waHlfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9wb3MtPnBoeXMpOworCW9wZW4tPnNoYXJlZF9wb3NfYnVmX3BoeV9hZGRyX21zdyA9IHVwcGVyXzMyX2JpdHMoYnVmX3Bvcy0+cGh5cyk7CisKKwlvcGVuLT5tYXBfcmVnaW9uX3Bvc19idWYuc2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfcG9zLT5waHlzKTsKKwlvcGVuLT5tYXBfcmVnaW9uX3Bvc19idWYuc2htX2FkZHJfbXN3ID0gdXBwZXJfMzJfYml0cyhidWZfcG9zLT5waHlzKTsKKwlvcGVuLT5tYXBfcmVnaW9uX3Bvc19idWYubWVtX3NpemVfYnl0ZXMgPSBieXRlc190b19hbGxvYzsKKworZG9uZToKKwltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogcTZhc21fb3Blbl9zaGFyZWRfaW86IE9wZW4gYW4gQVNNIHNlc3Npb24gZm9yIHB1bGwgbW9kZSAocGxheWJhY2spCisgKiBvciBwdXNoIG1vZGUgKGNhcHR1cmUpLgorICogcGFyYW1ldGVycworICogICBjb25maWcgLSBzZXNzaW9uIHBhcmFtZXRlcnMgKGNoYW5uZWxzLCBiaXRzX3Blcl9zYW1wbGUsIHNyKQorICogICBkaXIgLSBzdHJlYW0gZGlyZWN0aW9uIChJTiBmb3IgcGxheWJhY2ssIE9VVCBmb3IgY2FwdHVyZSkKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitpbnQgcTZhc21fb3Blbl9zaGFyZWRfaW8oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkgc3RydWN0IHNoYXJlZF9pb19jb25maWcgKmNvbmZpZywKKwkJCSBpbnQgZGlyKQoreworCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3NoYXJlZF9pbyAqb3BlbjsKKwl1OCAqY2hhbm5lbF9tYXBwaW5nOworCWludCBpLCBzaXplX29mX29wZW4sIG51bV93YXRlcm1hcmtzLCBidWZzeiwgYnVmY250LCByYywgZmxhZ3MgPSAwOworCisJaWYgKCFhYyB8fCAhY29uZmlnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZnN6ID0gY29uZmlnLT5idWZzejsKKwlidWZjbnQgPSBjb25maWctPmJ1ZmNudDsKKwludW1fd2F0ZXJtYXJrcyA9IDA7CisKKwlhYy0+Y29uZmlnID0gKmNvbmZpZzsKKworCWlmIChhYy0+c2Vzc2lvbiA8PSAwIHx8IGFjLT5zZXNzaW9uID4gU0VTU0lPTl9NQVgpIHsKKwkJcHJfZXJyKCIlczogU2Vzc2lvbiAlZCBpcyBvdXQgb2YgYm91bmRzXG4iLAorCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2l6ZV9vZl9vcGVuID0gc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3NoYXJlZF9pbykgKworCQkoc2l6ZW9mKHN0cnVjdCBhc21fc2hhcmVkX3dhdGVybWFya19sZXZlbCkgKiBudW1fd2F0ZXJtYXJrcyk7CisKKwlvcGVuID0ga3phbGxvYyhQQUdFX0FMSUdOKHNpemVfb2Zfb3BlbiksIEdGUF9LRVJORUwpOworCWlmICghb3BlbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJm9wZW4tPmhkciwgc2l6ZV9vZl9vcGVuLCBUUlVFLAorCQkJCWFjLT5zdHJlYW1faWQpOworCisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMSk7CisKKwlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICVkLCBzZXNzaW9uIDB4JXgsIHBlcmYgJWRcbiIsCisJCSBfX2Z1bmNfXywgb3Blbi0+aGRyLnRva2VuLCBhYy0+c3RyZWFtX2lkLCBhYy0+c2Vzc2lvbiwKKwkJIGFjLT5wZXJmX21vZGUpOworCisJb3Blbi0+aGRyLm9wY29kZSA9CisJCWRpciA9PSBJTiA/IEFTTV9TVFJFQU1fQ01EX09QRU5fUFVMTF9NT0RFX1dSSVRFIDoKKwkJQVNNX1NUUkVBTV9DTURfT1BFTl9QVVNIX01PREVfUkVBRDsKKworCXByX2RlYnVnKCIlcyBwZXJmX21vZGUgJWRcbiIsIF9fZnVuY19fLCBhYy0+cGVyZl9tb2RlKTsKKwlpZiAoZGlyID09IElOKQorCQlpZiAoYWMtPnBlcmZfbW9kZSA9PSBVTExfUE9TVF9QUk9DRVNTSU5HX1BDTV9NT0RFKQorCQkJZmxhZ3MgPSA0IDw8IEFTTV9TSElGVF9TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURTsKKwkJZWxzZSBpZiAoYWMtPnBlcmZfbW9kZSA9PSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERSkKKwkJCWZsYWdzID0gMiA8PCBBU01fU0hJRlRfU1RSRUFNX1BFUkZfRkxBR19QVUxMX01PREVfV1JJVEU7CisJCWVsc2UgaWYgKGFjLT5wZXJmX21vZGUgPT0gTE9XX0xBVEVOQ1lfUENNX01PREUpCisJCQlmbGFncyA9IDEgPDwgQVNNX1NISUZUX1NUUkVBTV9QRVJGX0ZMQUdfUFVMTF9NT0RFX1dSSVRFOworCQllbHNlCisJCQlwcl9lcnIoIkludmFsaWQgcGVyZiBtb2RlIGZvciBwdWxsIHdyaXRlXG4iKTsKKwllbHNlCisJCWlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKQorCQkJZmxhZ3MgPSBBU01fTE9XX0xBVEVOQ1lfVFhfU1RSRUFNX1NFU1NJT04gPDwKKwkJCQlBU01fU0hJRlRfU1RSRUFNX1BFUkZfRkxBR19QVVNIX01PREVfUkVBRDsKKwkJZWxzZQorCQkJcHJfZXJyKCJJbnZhbGlkIHBlcmYgbW9kZSBmb3IgcHVzaCByZWFkXG4iKTsKKworCWlmIChmbGFncyA9PSAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgbW9kZVslZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgYWMtPnBlcmZfbW9kZSk7CisJCWtmcmVlKG9wZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCXByX2RlYnVnKCJvcGVuLm1vZGVfZmxhZ3MgPSAweCV4XG4iLCBmbGFncyk7CisJb3Blbi0+bW9kZV9mbGFncyA9IGZsYWdzOworCW9wZW4tPmVuZHBvaW50X3R5cGUgPSBBU01fRU5EX1BPSU5UX0RFVklDRV9NQVRSSVg7CisJb3Blbi0+dG9wb19iaXRzX3Blcl9zYW1wbGUgPSBjb25maWctPmJpdHNfcGVyX3NhbXBsZTsKKworCW9wZW4tPnRvcG9faWQgPSBxNmFzbV9nZXRfYXNtX3RvcG9sb2d5X2NhbCgpOworCisJaWYgKGNvbmZpZy0+Zm9ybWF0ID09IEZPUk1BVF9MSU5FQVJfUENNKQorCQlvcGVuLT5mbXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzOworCWVsc2UgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGZvcm1hdFslZF1cbiIsIF9fZnVuY19fLCBjb25maWctPmZvcm1hdCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChhYy0+cG9ydFtkaXJdLmJ1ZikgeworCQlwcl9lcnIoIiVzOiBCdWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSBxNmFzbV9zZXRfc2hhcmVkX2NpcmNfYnVmZihhYywgb3BlbiwgYnVmc3osIGJ1ZmNudCwgZGlyKTsKKworCWlmIChyYykKKwkJZ290byBkb25lOworCisJYWMtPnBvcnRbZGlyXS50bXBfaGRsID0gMDsKKworCXJjID0gcTZhc21fc2V0X3NoYXJlZF9wb3NfYnVmZihhYywgb3BlbiwgZGlyKTsKKworCWlmIChyYykKKwkJZ290byBkb25lOworCisJLyogYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfdjMgKi8KKwlvcGVuLT5mbXQubnVtX2NoYW5uZWxzID0gY29uZmlnLT5jaGFubmVsczsKKwlvcGVuLT5mbXQuYml0c19wZXJfc2FtcGxlID0gY29uZmlnLT5iaXRzX3Blcl9zYW1wbGU7CisJb3Blbi0+Zm10LnNhbXBsZV9yYXRlID0gY29uZmlnLT5yYXRlOworCW9wZW4tPmZtdC5pc19zaWduZWQgPSAxOworCW9wZW4tPmZtdC5zYW1wbGVfd29yZF9zaXplID0gY29uZmlnLT5zYW1wbGVfd29yZF9zaXplOworCisJY2hhbm5lbF9tYXBwaW5nID0gb3Blbi0+Zm10LmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCXJjID0gcTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY29uZmlnLT5jaGFubmVscywgZmFsc2UpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBNYXAgY2hhbm5lbHMgZmFpbGVkLCByZXQ6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJb3Blbi0+bnVtX3dhdGVybWFya19sZXZlbHMgPSBudW1fd2F0ZXJtYXJrczsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3dhdGVybWFya3M7IGkrKykgeworCQlvcGVuLT53YXRlcm1hcmtbaV0ud2F0ZXJtYXJrX2xldmVsX2J5dGVzID0gaSAqCisJCQkJKChidWZzeiAqIGJ1ZmNudCkgLyBudW1fd2F0ZXJtYXJrcyk7CisJCXByX2RlYnVnKCIlczogV2F0ZXJtYXJrIGxldmVsIHNldCBmb3IgJWlcbiIsCisJCQkJX19mdW5jX18sCisJCQkJb3Blbi0+d2F0ZXJtYXJrW2ldLndhdGVybWFya19sZXZlbF9ieXRlcyk7CisJfQorCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopIG9wZW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogT3BlbiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgb3Blbi0+aGRyLm9wY29kZSwgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJcHJfZGVidWcoIiVzOiBzZW50IG9wZW4gYXByIHBrdFxuIiwgX19mdW5jX18pOworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPD0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogVGltZW91dC4gV2FpdGVkIGZvciBvcGVuIHdyaXRlIGFwciBwa3QgcmNbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA8IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yIFslZF1cbiIsIF9fZnVuY19fLAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWFjLT5pb19tb2RlIHw9IFRVTl9XUklURV9JT19NT0RFOworCXJjID0gMDsKK2RvbmU6CisJa2ZyZWUob3Blbik7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9vcGVuX3NoYXJlZF9pbyk7CisKKy8qCisgKiBxNmFzbV9zaGFyZWRfaW9fYnVmOiBSZXR1cm5zIGhhbmRsZSB0byB0aGUgc2hhcmVkIGNpcmN1bGFyIGJ1ZmZlciBiZWluZworICogdXNlZCBmb3IgcHVsbC9wdXNoIG1vZGUuCisgKiBwYXJhbWV0ZXJzCisgKiAgIGRpciAtIHVzZWQgdG8gaWRlbnRpZnkgaW5wdXQvb3V0cHV0IHBvcnQKKyAqIHJldHVybnMgYnVmZmVyIGhhbmRsZQorICovCitzdHJ1Y3QgYXVkaW9fYnVmZmVyICpxNmFzbV9zaGFyZWRfaW9fYnVmKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgaW50IGRpcikKK3sKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0OworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBhYyBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07CisJcmV0dXJuIHBvcnQtPmJ1ZjsKK30KK0VYUE9SVF9TWU1CT0wocTZhc21fc2hhcmVkX2lvX2J1Zik7CisKKy8qCisgKiBxNmFzbV9zaGFyZWRfaW9fZnJlZTogRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBwdWxsL3B1c2ggc2Vzc2lvbgorICogcGFyYW1ldGVycworICogIGRpciAtIHBvcnQgZGlyZWN0aW9uCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgZXJyb3Igb3RoZXJ3aXNlCisgKi8KK2ludCBxNmFzbV9zaGFyZWRfaW9fZnJlZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGRpcikKK3sKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0OworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcG9ydCA9ICZhYy0+cG9ydFtkaXJdOworCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7CisJaWYgKHBvcnQtPmJ1ZiAmJiBwb3J0LT5idWYtPmRhdGEpIHsKKwkJbXNtX2F1ZGlvX2lvbl9mcmVlKHBvcnQtPmJ1Zi0+Y2xpZW50LCBwb3J0LT5idWYtPmhhbmRsZSk7CisJCXBvcnQtPmJ1Zi0+Y2xpZW50ID0gTlVMTDsKKwkJcG9ydC0+YnVmLT5oYW5kbGUgPSBOVUxMOworCQlwb3J0LT5tYXhfYnVmX2NudCA9IDA7CisJCWtmcmVlKHBvcnQtPmJ1Zik7CisJCXBvcnQtPmJ1ZiA9IE5VTEw7CisJfQorCWlmIChhYy0+c2hhcmVkX3Bvc19idWYuZGF0YSkgeworCQltc21fYXVkaW9faW9uX2ZyZWUoYWMtPnNoYXJlZF9wb3NfYnVmLmNsaWVudCwKKwkJCQlhYy0+c2hhcmVkX3Bvc19idWYuaGFuZGxlKTsKKwkJYWMtPnNoYXJlZF9wb3NfYnVmLmNsaWVudCA9IE5VTEw7CisJCWFjLT5zaGFyZWRfcG9zX2J1Zi5oYW5kbGUgPSBOVUxMOworCX0KKwltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX3NoYXJlZF9pb19mcmVlKTsKKworLyoKKyAqIHE2YXNtX2dldF9zaGFyZWRfcG9zOiBSZXR1cm5zIGN1cnJlbnQgcmVhZCBpbmRleC93cml0ZSBpbmRleCBhcyBvYnNlcnZlZAorICogYnkgdGhlIERTUC4gTm90ZSB0aGF0IHRoaXMgaXMgYW4gb2Zmc2V0IGFuZCBpdGVyYXRlcyBmcm9tIFswLEJVRl9TSVpFIC0gMV0KKyAqIHBhcmFtZXRlcnMgLSAoYWxsIG91dHB1dCkKKyAqICAgcmVhZF9pbmRleCAtIG9mZnNldAorICogICB3YWxsX2Nsa19tc3cxIC0gQURTUCB3YWxsY2xvY2sgbXN3CisgKiAgIHdhbGxfY2xrX2xzdzEgLSBBRFNQIHdhbGxjbG9jayBsc3cKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtRUFHQUlOIGlmIERTUCBmYWlsZWQgdG8gdXBkYXRlIGFmdGVyIHNvbWUKKyAqIHJldHJpZXMKKyAqLworaW50IHE2YXNtX2dldF9zaGFyZWRfcG9zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCAqcmVhZF9pbmRleCwKKwkJCSB1aW50MzJfdCAqd2FsbF9jbGtfbXN3MSwgdWludDMyX3QgKndhbGxfY2xrX2xzdzEpCit7CisJc3RydWN0IGFzbV9zaGFyZWRfcG9zaXRpb25fYnVmZmVyICpwb3NfYnVmOworCXVpbnQzMl90IGZyYW1lX2NudDEsIGZyYW1lX2NudDI7CisJaW50IGksIGo7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBvc19idWYgPSBhYy0+c2hhcmVkX3Bvc19idWYuZGF0YTsKKworCS8qIGFsd2F5cyB0cnkgdG8gZ2V0IHRoZSBsYXRlc3QgdXBkYXRlIGluIHRoZSBzaGFyZWQgcG9zIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJLyogcmV0cnkgdW50aWwgdGhlcmUgaXMgYW4gdXBkYXRlIGZyb20gRFNQICovCisJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKwkJCWZyYW1lX2NudDEgPSBwb3NfYnVmLT5mcmFtZV9jb3VudGVyOworCQkJaWYgKGZyYW1lX2NudDEgIT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCSp3YWxsX2Nsa19tc3cxID0gcG9zX2J1Zi0+d2FsbF9jbG9ja191c19tc3c7CisJCSp3YWxsX2Nsa19sc3cxID0gcG9zX2J1Zi0+d2FsbF9jbG9ja191c19sc3c7CisJCSpyZWFkX2luZGV4ID0gcG9zX2J1Zi0+aW5kZXg7CisJCWZyYW1lX2NudDIgPSBwb3NfYnVmLT5mcmFtZV9jb3VudGVyOworCisJCWlmIChmcmFtZV9jbnQxICE9IGZyYW1lX2NudDIpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIDA7CisJfQorCXByX2VycigiJXMgb3V0IG9mIHRyaWVzIHRyeWluZyB0byBnZXQgYSBnb29kIHJlYWQsIHRyeSBhZ2FpblxuIiwKKwkgICAgICAgX19mdW5jX18pOworCXJldHVybiAtRUFHQUlOOworfQorCitpbnQgcTZhc21fcnVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKKwkJdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMpCit7CisJc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9ydW5fdjIgcnVuOworCWludCByYzsKKworCWlmIChhYyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7CisKKwlxNmFzbV9hZGRfaGRyKGFjLCAmcnVuLmhkciwgc2l6ZW9mKHJ1biksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCXJ1bi5oZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1JVTl9WMjsKKwlydW4uZmxhZ3MgICAgPSBmbGFnczsKKwlydW4udGltZV9sc3cgPSBsc3dfdHM7CisJcnVuLnRpbWVfbXN3ID0gbXN3X3RzOworCisJY29uZmlnX2RlYnVnX2ZzX3J1bigpOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZydW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbW1hbmQgcnVuIGZhaWxlZFslZF0iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgcnVuIHN1Y2Nlc3MiLAorCQkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9ydW5fbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKKwkJdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMsIHVpbnQzMl90IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX3J1bl92MiBydW47CisJaW50IHJjOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKworCXE2YXNtX3N0cmVhbV9hZGRfaGRyX2FzeW5jKGFjLCAmcnVuLmhkciwgc2l6ZW9mKHJ1biksIFRSVUUsIHN0cmVhbV9pZCk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMSk7CisJcnVuLmhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfUlVOX1YyOworCXJ1bi5mbGFncyAgICA9IGZsYWdzOworCXJ1bi50aW1lX2xzdyA9IGxzd190czsKKwlydW4udGltZV9tc3cgPSBtc3dfdHM7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnJ1bik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21tbWFuZCBydW4gZmFpbGVkWyVkXSIsIF9fZnVuY19fLCByYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHE2YXNtX3J1bl9ub3dhaXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZsYWdzLAorCQkJdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMpCit7CisJcmV0dXJuIF9fcTZhc21fcnVuX25vd2FpdChhYywgZmxhZ3MsIG1zd190cywgbHN3X3RzLCBhYy0+c3RyZWFtX2lkKTsKK30KKworaW50IHE2YXNtX3N0cmVhbV9ydW5fbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKKwkJCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBzdHJlYW1faWQpCit7CisJcmV0dXJuIF9fcTZhc21fcnVuX25vd2FpdChhYywgZmxhZ3MsIG1zd190cywgbHN3X3RzLCBzdHJlYW1faWQpOworfQorCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfYWFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAorCQkJdWludDMyX3Qgc2FtcGxlX3JhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJdWludDMyX3QgYml0X3JhdGUsIHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IGZvcm1hdCkKK3sKKwlzdHJ1Y3QgYXNtX2FhY19lbmNfY2ZnX3YyIGVuY19jZmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1mcmFtZXNbJWRdU1JbJWRdY2hbJWRdYml0cmF0ZVslZF1tb2RlWyVkXSBmb3JtYXRbJWRdXG4iLAorCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLCBmcmFtZXNfcGVyX2J1ZiwKKwkJc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBiaXRfcmF0ZSwgbW9kZSwgZm9ybWF0KTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhc21fYWFjX2VuY19jZmdfdjIpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0pOworCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7CisJZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7CisJZW5jX2NmZy5iaXRfcmF0ZSA9IGJpdF9yYXRlOworCWVuY19jZmcuZW5jX21vZGUgPSBtb2RlOworCWVuY19jZmcuYWFjX2ZtdF9mbGFnID0gZm9ybWF0OworCWVuY19jZmcuY2hhbm5lbF9jZmcgPSBjaGFubmVsczsKKwllbmNfY2ZnLnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCAlZCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19nNzExKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdWludDMyX3QgZnJhbWVzX3Blcl9idWYsCisJCQl1aW50MzJfdCBzYW1wbGVfcmF0ZSkKK3sKKwlzdHJ1Y3QgYXNtX2c3MTFfZW5jX2NmZ192MiBlbmNfY2ZnOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXVNSWyVkXVxuIiwKKwkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZnJhbWVzX3Blcl9idWYsCisJCXNhbXBsZV9yYXRlKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhc21fZzcxMV9lbmNfY2ZnX3YyKSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKTsKKwllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOworCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOworCWVuY19jZmcuc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZW5jX2NmZyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kICVkIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX3NldF9lbmNkZWNfY2hhbl9tYXAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQl1aW50MzJfdCBudW1fY2hhbm5lbHMpCit7CisJc3RydWN0IGFzbV9kZWNfb3V0X2NoYW5fbWFwX3BhcmFtIGNoYW5fbWFwOworCXU4ICpjaGFubmVsX21hcHBpbmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogU2Vzc2lvbiAlZCwgbnVtX2NoYW5uZWxzID0gJWRcbiIsCisJCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLCBudW1fY2hhbm5lbHMpOworCXE2YXNtX2FkZF9oZHIoYWMsICZjaGFuX21hcC5oZHIsIHNpemVvZihjaGFuX21hcCksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwljaGFuX21hcC5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwljaGFuX21hcC5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfREVDX09VVFBVVF9DSEFOX01BUDsKKwljaGFuX21hcC5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2RlY19vdXRfY2hhbl9tYXBfcGFyYW0pIC0KKwkJCSAoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCQkgc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKSk7CisJY2hhbl9tYXAubnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOworCWNoYW5uZWxfbWFwcGluZyA9IGNoYW5fbWFwLmNoYW5uZWxfbWFwcGluZzsKKwltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCBQQ01fQ0hBTk5FTF9OVUxMLCBNQVhfQ0hBTl9NQVBfQ0hBTk5FTFMpOworCisJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIG51bV9jaGFubmVscywgZmFsc2UpKSB7CisJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBudW1fY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmNoYW5fbWFwKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgb3Bjb2RlWzB4JXhdcGFyYW1pZFsweCV4XSBmYWlsZWQgJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwKKwkJCSAgIEFTTV9QQVJBTV9JRF9ERUNfT1VUUFVUX0NIQU5fTUFQLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCQkgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQkgICBjaGFuX21hcC5oZHIub3Bjb2RlKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJCXJldHVybiByYzsKK30KKworLyoKKyAqIHE2YXNtX2VuY19jZmdfYmxrX3BjbV92NCAtIHNlbmRzIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEByYXRlOiBzYW1wbGUgcmF0ZQorICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KKyAqIEB1c2VfZGVmYXVsdF9jaG1hcDogdHJ1ZSBpZiBkZWZhdWx0IGNoYW5uZWwgbWFwICB0byBiZSB1c2VkCisgKiBAdXNlX2JhY2tfZmxhdm9yOiB0byBjb25maWd1cmUgYmFjayBsZWZ0IGFuZCByaWdodCBjaGFubmVsCisgKiBAY2hhbm5lbF9tYXA6IGlucHV0IGNoYW5uZWwgbWFwCisgKiBAc2FtcGxlX3dvcmRfc2l6ZTogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsCisgKiBAZW5kaWFubmVzczogZW5kaWFubmVzcyBvZiB0aGUgcGNtIGRhdGEKKyAqIEBtb2RlOiBNb2RlIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBwY20gaW5wdXQgZGF0YQorICovCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCSAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJICAgICBib29sIHVzZV9iYWNrX2ZsYXZvciwgdTggKmNoYW5uZWxfbWFwLAorCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLCB1aW50MTZfdCBlbmRpYW5uZXNzLAorCQkJICAgICB1aW50MTZfdCBtb2RlKQoreworCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZW5jX2NmZ192NCBlbmNfY2ZnOworCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIgZW5jX2ZnX2JsazsKKwl1OCAqY2hhbm5lbF9tYXBwaW5nOworCXUzMiBmcmFtZXNfcGVyX2J1ZiA9IDA7CisJaW50IHJjOworCisJaWYgKCF1c2VfZGVmYXVsdF9jaG1hcCAmJiAoY2hhbm5lbF9tYXAgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogTm8gdmFsaWQgY2hhbiBtYXAgYW5kIGNhbid0IHVzZSBkZWZhdWx0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXWJwc1slZF13b3Jkc2l6ZVslZF1cbiIsIF9fZnVuY19fLAorCQkgYWMtPnNlc3Npb24sIHJhdGUsIGNoYW5uZWxzLAorCQkgYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKKworCW1lbXNldCgmZW5jX2NmZywgMCwgc2l6ZW9mKGVuY19jZmcpKTsKKwlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07CisJZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2YoZW5jX2NmZykgLSBzaXplb2YoZW5jX2NmZy5oZHIpIC0KKwkJCQkgICAgc2l6ZW9mKGVuY19jZmcuZW5jZGVjKTsKKwllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOworCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQkJICBzaXplb2YoZW5jX2ZnX2Jsayk7CisJZW5jX2NmZy5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKwllbmNfY2ZnLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKwllbmNfY2ZnLnNhbXBsZV9yYXRlID0gcmF0ZTsKKwllbmNfY2ZnLmlzX3NpZ25lZCA9IDE7CisJZW5jX2NmZy5zYW1wbGVfd29yZF9zaXplID0gc2FtcGxlX3dvcmRfc2l6ZTsKKwllbmNfY2ZnLmVuZGlhbm5lc3MgPSBlbmRpYW5uZXNzOworCWVuY19jZmcubW9kZSA9IG1vZGU7CisJY2hhbm5lbF9tYXBwaW5nID0gZW5jX2NmZy5jaGFubmVsX21hcHBpbmc7CisKKwltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisKKwlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKKwkJcHJfZGVidWcoIiVzOiBzZXR0aW5nIGRlZmF1bHQgY2hhbm5lbCBtYXAgZm9yICVkIGNoYW5uZWxzIiwKKwkJCSBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsCisJCQkJCXVzZV9iYWNrX2ZsYXZvcikpIHsKKwkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IFVzaW5nIHByZS1kZWZpbmVkIGNoYW5uZWwgbWFwIiwgX19mdW5jX18pOworCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKKwkJCVBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBlbmNfY2ZnLmhkci5vcGNvZGUpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCSAgICAgICBhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjQpOworCisvKgorICogcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YzIC0gc2VuZHMgZW5jb2RlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQHJhdGU6IHNhbXBsZSByYXRlCisgKiBAY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscworICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIGVuY29kZXIgc2Vzc2lvbgorICogQHVzZV9kZWZhdWx0X2NobWFwOiB0cnVlIGlmIGRlZmF1bHQgY2hhbm5lbCBtYXAgIHRvIGJlIHVzZWQKKyAqIEB1c2VfYmFja19mbGF2b3I6IHRvIGNvbmZpZ3VyZSBiYWNrIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwKKyAqIEBjaGFubmVsX21hcDogaW5wdXQgY2hhbm5lbCBtYXAKKyAqIEBzYW1wbGVfd29yZF9zaXplOiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwKKyAqLworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCSAgICAgYm9vbCB1c2VfYmFja19mbGF2b3IsIHU4ICpjaGFubmVsX21hcCwKKwkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjMgZW5jX2NmZzsKKwlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIGVuY19mZ19ibGs7CisJdTggKmNoYW5uZWxfbWFwcGluZzsKKwl1MzIgZnJhbWVzX3Blcl9idWYgPSAwOworCWludCByYzsKKworCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1icHNbJWRdd29yZHNpemVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscywKKwkJIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7CisKKwltZW1zZXQoJmVuY19jZmcsIDAsIHNpemVvZihlbmNfY2ZnKSk7CisJcTZhc21fYWRkX2hkcihhYywgJmVuY19jZmcuaGRyLCBzaXplb2YoZW5jX2NmZyksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKGVuY19jZmcpIC0gc2l6ZW9mKGVuY19jZmcuaGRyKSAtCisJCQkJICAgIHNpemVvZihlbmNfY2ZnLmVuY2RlYyk7CisJZW5jX2NmZy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKKwllbmNfY2ZnLmVuY2Jsay5lbmNfY2ZnX2Jsa19zaXplID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCisJCQkJCSAgc2l6ZW9mKGVuY19mZ19ibGspOworCWVuY19jZmcubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7CisJZW5jX2NmZy5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisJZW5jX2NmZy5zYW1wbGVfcmF0ZSA9IHJhdGU7CisJZW5jX2NmZy5pc19zaWduZWQgPSAxOworCWVuY19jZmcuc2FtcGxlX3dvcmRfc2l6ZSA9IHNhbXBsZV93b3JkX3NpemU7CisJY2hhbm5lbF9tYXBwaW5nID0gZW5jX2NmZy5jaGFubmVsX21hcHBpbmc7CisKKwltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisKKwlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKKwkJcHJfZGVidWcoIiVzOiBzZXR0aW5nIGRlZmF1bHQgY2hhbm5lbCBtYXAgZm9yICVkIGNoYW5uZWxzIiwKKwkJCSBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsCisJCQkJCXVzZV9iYWNrX2ZsYXZvcikpIHsKKwkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IFVzaW5nIHByZS1kZWZpbmVkIGNoYW5uZWwgbWFwIiwgX19mdW5jX18pOworCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKKwkJCVBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBlbmNfY2ZnLmhkci5vcGNvZGUpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCSAgICAgICBhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMpOworCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBib29sIHVzZV9iYWNrX2ZsYXZvciwgdTggKmNoYW5uZWxfbWFwKQoreworCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZW5jX2NmZ192MiAgZW5jX2NmZzsKKwl1OCAqY2hhbm5lbF9tYXBwaW5nOworCXUzMiBmcmFtZXNfcGVyX2J1ZiA9IDA7CisKKwlpbnQgcmMgPSAwOworCisJaWYgKCF1c2VfZGVmYXVsdF9jaG1hcCAmJiAoY2hhbm5lbF9tYXAgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogTm8gdmFsaWQgY2hhbiBtYXAgYW5kIGNhbid0IHVzZSBkZWZhdWx0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiBTZXNzaW9uICVkLCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsIF9fZnVuY19fLAorCQkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscyk7CisKKwlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07CisJZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2YoZW5jX2NmZykgLSBzaXplb2YoZW5jX2NmZy5oZHIpIC0KKwkJCQlzaXplb2YoZW5jX2NmZy5lbmNkZWMpOworCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7CisJZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOworCisJZW5jX2NmZy5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKwllbmNfY2ZnLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKwllbmNfY2ZnLnNhbXBsZV9yYXRlID0gcmF0ZTsKKwllbmNfY2ZnLmlzX3NpZ25lZCA9IDE7CisJY2hhbm5lbF9tYXBwaW5nID0gZW5jX2NmZy5jaGFubmVsX21hcHBpbmc7CisKKwltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisKKwlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKKwkJcHJfZGVidWcoIiVzOiBzZXR0aW5nIGRlZmF1bHQgY2hhbm5lbCBtYXAgZm9yICVkIGNoYW5uZWxzIiwKKwkJX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLAorCQkJCQl1c2VfYmFja19mbGF2b3IpKSB7CisJCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLAorCQkJIF9fZnVuY19fLCBjaGFubmVscyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlczogVXNpbmcgcHJlLWRlZmluZWQgY2hhbm5lbCBtYXAiLCBfX2Z1bmNfXyk7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOworCX0KKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZW5jX2NmZyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsCisJCQlfX2Z1bmNfXywgZW5jX2NmZy5oZHIub3Bjb2RlKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fcTZhc21fZW5jX2NmZ19ibGtfcGNtX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCSAgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCSAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkgICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAorCQkJCSAgICAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCisJCQkJICAgICAgdWludDE2X3QgbW9kZSkKK3sKKwlyZXR1cm4gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3Y0KGFjLCByYXRlLCBjaGFubmVscywKKwkJCQkJYml0c19wZXJfc2FtcGxlLCB0cnVlLCBmYWxzZSwgTlVMTCwKKwkJCQkJc2FtcGxlX3dvcmRfc2l6ZSwgZW5kaWFubmVzcywgbW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJICAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQkJCSAgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpCit7CisJcmV0dXJuIHE2YXNtX2VuY19jZmdfYmxrX3BjbV92MyhhYywgcmF0ZSwgY2hhbm5lbHMsCisJCQkJCWJpdHNfcGVyX3NhbXBsZSwgdHJ1ZSwgZmFsc2UsIE5VTEwsCisJCQkJCXNhbXBsZV93b3JkX3NpemUpOworfQorCitzdGF0aWMgaW50IF9fcTZhc21fZW5jX2NmZ19ibGtfcGNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywgdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQoreworCXJldHVybiBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjIoYWMsIHJhdGUsIGNoYW5uZWxzLAorCQkJCQliaXRzX3Blcl9zYW1wbGUsIHRydWUsIGZhbHNlLCBOVUxMKTsKK30KKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQoreworCXJldHVybiBfX3E2YXNtX2VuY19jZmdfYmxrX3BjbShhYywgcmF0ZSwgY2hhbm5lbHMsIDE2KTsKK30KKworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKK3sKKwlyZXR1cm4gX19xNmFzbV9lbmNfY2ZnX2Jsa19wY20oYWMsIHJhdGUsIGNoYW5uZWxzLCBiaXRzX3Blcl9zYW1wbGUpOworfQorCisvKgorICogcTZhc21fZW5jX2NmZ19ibGtfcGNtX2Zvcm1hdF9zdXBwb3J0X3YzIC0gc2VuZHMgZW5jb2RlciBjb25maWd1cmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEByYXRlOiBzYW1wbGUgcmF0ZQorICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KKyAqIEBzYW1wbGVfd29yZF9zaXplOiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwKKyAqLworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCQkgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSkKK3sKKwlyZXR1cm4gX19xNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMoYWMsIHJhdGUsIGNoYW5uZWxzLAorCQkJCQkgIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92Myk7CisKKy8qCisgKiBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjQgLSBzZW5kcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAqCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQHJhdGU6IHNhbXBsZSByYXRlCisgKiBAY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscworICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIGVuY29kZXIgc2Vzc2lvbgorICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAorICogQGVuZGlhbm5lc3M6IGVuZGlhbm5lc3Mgb2YgdGhlIHBjbSBkYXRhCisgKiBAbW9kZTogTW9kZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgcGNtIGlucHV0IGRhdGEKKyAqLworaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCQkgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJICAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCisJCQkJCSAgICB1aW50MTZfdCBtb2RlKQoreworCXJldHVybiBfX3E2YXNtX2VuY19jZmdfYmxrX3BjbV92NChhYywgcmF0ZSwgY2hhbm5lbHMsCisJCQkJCSAgIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJICAgZW5kaWFubmVzcywgbW9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92NCk7CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fbmF0aXZlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMpCit7CisJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9lbmNfY2ZnX3YyICBlbmNfY2ZnOworCXU4ICpjaGFubmVsX21hcHBpbmc7CisJdTMyIGZyYW1lc19wZXJfYnVmID0gMDsKKworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwgX19mdW5jX18sCisJCQkgYWMtPnNlc3Npb24sIHJhdGUsIGNoYW5uZWxzKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7CisJZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihlbmNfY2ZnKSAtIHNpemVvZihlbmNfY2ZnLmhkcikgLQorCQkJCSBzaXplb2YoZW5jX2NmZy5lbmNkZWMpOworCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7CisJZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7CisKKwllbmNfY2ZnLm51bV9jaGFubmVscyA9IDA7LypjaGFubmVsczsqLworCWVuY19jZmcuYml0c19wZXJfc2FtcGxlID0gMTY7CisJZW5jX2NmZy5zYW1wbGVfcmF0ZSA9IDA7LypyYXRlOyovCisJZW5jX2NmZy5pc19zaWduZWQgPSAxOworCWNoYW5uZWxfbWFwcGluZyA9IGVuY19jZmcuY2hhbm5lbF9tYXBwaW5nOworCisKKwltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisKKwlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQgb3Bjb2RlWzB4JXhdXG4iLAorCQkJX19mdW5jX18sIGVuY19jZmcuaGRyLm9wY29kZSk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxNmFzbV9tYXBfY2hhbm5lbHModTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMsCisJCWJvb2wgdXNlX2JhY2tfZmxhdm9yKQoreworCXU4ICpsY2hhbm5lbF9tYXBwaW5nOworCisJbGNoYW5uZWxfbWFwcGluZyA9IGNoYW5uZWxfbWFwcGluZzsKKwlwcl9kZWJ1ZygiJXM6ICBjaGFubmVscyBwYXNzZWQ6ICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbHMpOworCWlmIChjaGFubmVscyA9PSAxKSAgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSAyKSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMykgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNCkgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IHVzZV9iYWNrX2ZsYXZvciA/CisJCQlQQ01fQ0hBTk5FTF9MQiA6IFBDTV9DSEFOTkVMX0xTOworCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gdXNlX2JhY2tfZmxhdm9yID8KKwkJCVBDTV9DSEFOTkVMX1JCIDogUENNX0NIQU5ORUxfUlM7CisJfSBlbHNlIGlmIChjaGFubmVscyA9PSA1KSB7CisJCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKKwkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOworCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRkM7CisJCWxjaGFubmVsX21hcHBpbmdbM10gPSB1c2VfYmFja19mbGF2b3IgPworCQkJUENNX0NIQU5ORUxfTEIgOiBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IHVzZV9iYWNrX2ZsYXZvciA/CisJCQlQQ01fQ0hBTk5FTF9SQiA6IFBDTV9DSEFOTkVMX1JTOworCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNikgeworCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7CisJCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKKwkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOworCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTEZFOworCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gdXNlX2JhY2tfZmxhdm9yID8KKwkJCVBDTV9DSEFOTkVMX0xCIDogUENNX0NIQU5ORUxfTFM7CisJCWxjaGFubmVsX21hcHBpbmdbNV0gPSB1c2VfYmFja19mbGF2b3IgPworCQkJUENNX0NIQU5ORUxfUkIgOiBQQ01fQ0hBTk5FTF9SUzsKKwl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDgpIHsKKwkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOworCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7CisJCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GQzsKKwkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xGRTsKKwkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0xCOworCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfUkI7CisJCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9MUzsKKwkJbGNoYW5uZWxfbWFwcGluZ1s3XSA9IFBDTV9DSEFOTkVMX1JTOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEVSUk9SLnVuc3VwcG9ydGVkIG51bV9jaCA9ICV1XG4iLAorCQkgX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcTZhc21fZW5hYmxlX3NicnBzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJdWludDMyX3Qgc2JyX3BzX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgYXNtX2FhY19zYnJfcHNfZmxhZ19wYXJhbSAgc2JycHM7CisJdTMyIGZyYW1lc19wZXJfYnVmID0gMDsKKworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWRcbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7CisKKwlxNmFzbV9hZGRfaGRyKGFjLCAmc2JycHMuaGRyLCBzaXplb2Yoc2JycHMpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlzYnJwcy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwlzYnJwcy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfQUFDX1NCUl9QU19GTEFHOworCXNicnBzLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhc21fYWFjX3Nicl9wc19mbGFnX3BhcmFtKSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKTsKKwlzYnJwcy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKKwlzYnJwcy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBzYnJwcy5lbmNkZWMucGFyYW1fc2l6ZSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOworCisJc2JycHMuc2JyX3BzX2ZsYWcgPSBzYnJfcHNfZW5hYmxlOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZzYnJwcyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIG9wY29kZVsweCV4XXBhcmFtaWRbMHgleF0gZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCUFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sCisJCQkJQVNNX1BBUkFNX0lEX0FBQ19TQlJfUFNfRkxBRywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF0gIiwgX19mdW5jX18sIHNicnBzLmhkci5vcGNvZGUpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9jZmdfZHVhbF9tb25vX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCXVpbnQxNl90IHNjZV9sZWZ0LCB1aW50MTZfdCBzY2VfcmlnaHQpCit7CisJc3RydWN0IGFzbV9hYWNfZHVhbF9tb25vX21hcHBpbmdfcGFyYW0gZHVhbF9tb25vOworCisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogU2Vzc2lvbiAlZCwgc2NlX2xlZnQgPSAlZCwgc2NlX3JpZ2h0ID0gJWRcbiIsCisJCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLCBzY2VfbGVmdCwgc2NlX3JpZ2h0KTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZkdWFsX21vbm8uaGRyLCBzaXplb2YoZHVhbF9tb25vKSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCisJZHVhbF9tb25vLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWR1YWxfbW9uby5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfQUFDX0RVQUxfTU9OT19NQVBQSU5HOworCWR1YWxfbW9uby5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihkdWFsX21vbm8ubGVmdF9jaGFubmVsX3NjZSkgKworCQkJCSAgICAgIHNpemVvZihkdWFsX21vbm8ucmlnaHRfY2hhbm5lbF9zY2UpOworCWR1YWxfbW9uby5sZWZ0X2NoYW5uZWxfc2NlID0gc2NlX2xlZnQ7CisJZHVhbF9tb25vLnJpZ2h0X2NoYW5uZWxfc2NlID0gc2NlX3JpZ2h0OworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZkdWFsX21vbm8pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCBvcGNvZGVbMHgleF1wYXJhbWlkWzB4JXhdIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwKKwkJCQlBU01fUEFSQU1fSURfQUFDX0RVQUxfTU9OT19NQVBQSU5HLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQkJCQlkdWFsX21vbm8uaGRyLm9wY29kZSk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworLyogU3VwcG9ydCBmb3Igc2VsZWN0aW5nIHN0ZXJlbyBtaXhpbmcgY29lZmZpY2llbnRzIGZvciBCIGZhbWlseSBub3QgZG9uZSAqLworaW50IHE2YXNtX2NmZ19hYWNfc2VsX21peF9jb2VmKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBtaXhfY29lZmYpCit7CisJc3RydWN0IGFzbV9hYWNfc3RlcmVvX21peF9jb2VmZl9zZWxlY3Rpb25fcGFyYW1fdjIgYWFjX21peF9jb2VmZjsKKwlpbnQgcmMgPSAwOworCisJcTZhc21fYWRkX2hkcihhYywgJmFhY19taXhfY29lZmYuaGRyLCBzaXplb2YoYWFjX21peF9jb2VmZiksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwlhYWNfbWl4X2NvZWZmLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWFhY19taXhfY29lZmYucGFyYW1faWQgPQorCQlBU01fUEFSQU1fSURfQUFDX1NURVJFT19NSVhfQ09FRkZfU0VMRUNUSU9OX0ZMQUdfVjI7CisJYWFjX21peF9jb2VmZi5wYXJhbV9zaXplID0KKwkJc2l6ZW9mKHN0cnVjdCBhc21fYWFjX3N0ZXJlb19taXhfY29lZmZfc2VsZWN0aW9uX3BhcmFtX3YyKTsKKwlhYWNfbWl4X2NvZWZmLmFhY19zdGVyZW9fbWl4X2NvZWZmX2ZsYWcgPSBtaXhfY29lZmY7CisJcHJfZGVidWcoIiVzOiBtaXhfY29lZmYgPSAldVxuIiwgX19mdW5jX18sIG1peF9jb2VmZik7CisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZhYWNfbWl4X2NvZWZmKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgb3Bjb2RlWzB4JXhdcGFyYW1pZFsweCV4XSBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwKKwkJCUFTTV9QQVJBTV9JRF9BQUNfU1RFUkVPX01JWF9DT0VGRl9TRUxFQ1RJT05fRkxBR19WMiwKKwkJCXJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsCisJCQlfX2Z1bmNfXywgYWFjX21peF9jb2VmZi5oZHIub3Bjb2RlKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfcWNlbHAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAorCQl1aW50MTZfdCBtaW5fcmF0ZSwgdWludDE2X3QgbWF4X3JhdGUsCisJCXVpbnQxNl90IHJlZHVjZWRfcmF0ZV9sZXZlbCwgdWludDE2X3QgcmF0ZV9tb2R1bGF0aW9uX2NtZCkKK3sKKwlzdHJ1Y3QgYXNtX3YxM2tfZW5jX2NmZyBlbmNfY2ZnOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXW1pbl9yYXRlWzB4JTR4XW1heF9yYXRlWzB4JTR4XSByZWR1Y2VkX3JhdGVfbGV2ZWxbMHglNHhdcmF0ZV9tb2R1bGF0aW9uX2NtZFsweCU0eF1cbiIsCisJCSBfX2Z1bmNfXywKKwkJYWMtPnNlc3Npb24sIGZyYW1lc19wZXJfYnVmLCBtaW5fcmF0ZSwgbWF4X3JhdGUsCisJCXJlZHVjZWRfcmF0ZV9sZXZlbCwgcmF0ZV9tb2R1bGF0aW9uX2NtZCk7CisKKwlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07CisJZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV92MTNrX2VuY19jZmcpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0pOworCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7CisJZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7CisKKwllbmNfY2ZnLm1pbl9yYXRlID0gbWluX3JhdGU7CisJZW5jX2NmZy5tYXhfcmF0ZSA9IG1heF9yYXRlOworCWVuY19jZmcucmVkdWNlZF9yYXRlX2NtZCA9IHJlZHVjZWRfcmF0ZV9sZXZlbDsKKwllbmNfY2ZnLnJhdGVfbW9kX2NtZCA9IHJhdGVfbW9kdWxhdGlvbl9jbWQ7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCAlZCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBzZXRlbmNkZWMgdjEzayByZXNwXG4iLAorCQkJX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19ldnJjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKKwkJdWludDE2X3QgbWluX3JhdGUsIHVpbnQxNl90IG1heF9yYXRlLAorCQl1aW50MTZfdCByYXRlX21vZHVsYXRpb25fY21kKQoreworCXN0cnVjdCBhc21fZXZyY19lbmNfY2ZnIGVuY19jZmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1mcmFtZXNbJWRdbWluX3JhdGVbMHglNHhdbWF4X3JhdGVbMHglNHhdIHJhdGVfbW9kdWxhdGlvbl9jbWRbMHglNHhdXG4iLAorCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLAorCQlmcmFtZXNfcGVyX2J1ZiwJbWluX3JhdGUsIG1heF9yYXRlLCByYXRlX21vZHVsYXRpb25fY21kKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7CisJZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2V2cmNfZW5jX2NmZykgLQorCQkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSk7CisJZW5jX2NmZy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKKwllbmNfY2ZnLmVuY2Jsay5lbmNfY2ZnX2Jsa19zaXplICA9IGVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgLQorCQkJCXNpemVvZihzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyKTsKKworCWVuY19jZmcubWluX3JhdGUgPSBtaW5fcmF0ZTsKKwllbmNfY2ZnLm1heF9yYXRlID0gbWF4X3JhdGU7CisJZW5jX2NmZy5yYXRlX21vZF9jbWQgPSByYXRlX21vZHVsYXRpb25fY21kOworCWVuY19jZmcucmVzZXJ2ZWQgPSAwOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbWFtbmQgJWQgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZW5jZGVjIGV2cmNcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fZW5jX2NmZ19ibGtfYW1ybmIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAorCQkJdWludDE2X3QgYmFuZF9tb2RlLCB1aW50MTZfdCBkdHhfZW5hYmxlKQoreworCXN0cnVjdCBhc21fYW1ybmJfZW5jX2NmZyBlbmNfY2ZnOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXWJhbmRfbW9kZVsweCU0eF1kdHhfZW5hYmxlWzB4JTR4XVxuIiwKKwkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBmcmFtZXNfcGVyX2J1ZiwgYmFuZF9tb2RlLCBkdHhfZW5hYmxlKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7CisJZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2Ftcm5iX2VuY19jZmcpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0pOworCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7CisJZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7CisKKwllbmNfY2ZnLmVuY19tb2RlID0gYmFuZF9tb2RlOworCWVuY19jZmcuZHR4X21vZGUgPSBkdHhfZW5hYmxlOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbWFtbmQgJWQgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3Igc2V0IGVuY2RlYyBhbXJuYlxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9lbmNfY2ZnX2Jsa19hbXJ3YihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZnJhbWVzX3Blcl9idWYsCisJCQl1aW50MTZfdCBiYW5kX21vZGUsIHVpbnQxNl90IGR0eF9lbmFibGUpCit7CisJc3RydWN0IGFzbV9hbXJ3Yl9lbmNfY2ZnIGVuY19jZmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1mcmFtZXNbJWRdYmFuZF9tb2RlWzB4JTR4XWR0eF9lbmFibGVbMHglNHhdXG4iLAorCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sIGZyYW1lc19wZXJfYnVmLCBiYW5kX21vZGUsIGR0eF9lbmFibGUpOworCisJcTZhc21fYWRkX2hkcihhYywgJmVuY19jZmcuaGRyLCBzaXplb2YoZW5jX2NmZyksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOworCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKKwllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhc21fYW1yd2JfZW5jX2NmZykgLQorCQkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSk7CisJZW5jX2NmZy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKKwllbmNfY2ZnLmVuY2Jsay5lbmNfY2ZnX2Jsa19zaXplICA9IGVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgLQorCQkJCXNpemVvZihzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyKTsKKworCWVuY19jZmcuZW5jX21vZGUgPSBiYW5kX21vZGU7CisJZW5jX2NmZy5kdHhfbW9kZSA9IGR0eF9lbmFibGU7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCAlZCBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludCBzdHJlYW1faWQsCisJCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhciAqY2hhbm5lbF9tYXApCit7CisJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YyIGZtdDsKKwl1OCAqY2hhbm5lbF9tYXBwaW5nOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgcmF0ZSwKKwkJY2hhbm5lbHMpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJLyoKKwkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCisJICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCisJICogYXNzb2NpYXRlZAorCSAqLworCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQorCQlxNmFzbV91cGRhdGVfdG9rZW4oJmZtdC5oZHIudG9rZW4sCisJCQkJICAgYWMtPnNlc3Npb24sCisJCQkJICAgc3RyZWFtX2lkLAorCQkJCSAgIDAsIC8qIEJ1ZmZlciBpbmRleCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCisJCQkJICAgV0FJVF9DTUQpOworCisJcHJfZGVidWcoIiVzOiB0b2tlbiA9IDB4JXgsIHN0cmVhbV9pZCAgJWQsIHNlc3Npb24gMHgleFxuIiwKKwkJICBfX2Z1bmNfXywgZm10Lmhkci50b2tlbiwgc3RyZWFtX2lkLCBhYy0+c2Vzc2lvbik7CisKKwlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOworCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KKwkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKKwlmbXQubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7CisJZm10LmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKwlmbXQuc2FtcGxlX3JhdGUgPSByYXRlOworCWZtdC5pc19zaWduZWQgPSAxOworCisJY2hhbm5lbF9tYXBwaW5nID0gZm10LmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgeworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKKwkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7CisJfQorCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgICBpbnQgc3RyZWFtX2lkLAorCQkJCQkgICAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCisJCQkJCSAgICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfcGFyYW1fdjMgZm10OworCXU4ICpjaGFubmVsX21hcHBpbmc7CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdYnBzWyVkXXdvcmRzaXplWyVkXVxuIiwgX19mdW5jX18sCisJCSBhYy0+c2Vzc2lvbiwgcmF0ZSwgY2hhbm5lbHMsCisJCSBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOworCisJbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwkvKgorCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKKwkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKKwkgKiBhc3NvY2lhdGVkCisJICovCisJaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCisJCWZtdC5oZHIudG9rZW4gPSAoKGFjLT5zZXNzaW9uIDw8IDgpICYgMHhGRkZGMDApIHwKKwkJCQkoc3RyZWFtX2lkICYgMHhGRik7CisKKwlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAorCQkgX19mdW5jX18sIGZtdC5oZHIudG9rZW4sIHN0cmVhbV9pZCwgYWMtPnNlc3Npb24pOworCisJZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKKwlmbXQuZm10X2Jsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCQkJCXNpemVvZihmbXQuZm10X2Jsayk7CisJZm10LnBhcmFtLm51bV9jaGFubmVscyA9IGNoYW5uZWxzOworCWZtdC5wYXJhbS5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisJZm10LnBhcmFtLnNhbXBsZV9yYXRlID0gcmF0ZTsKKwlmbXQucGFyYW0uaXNfc2lnbmVkID0gMTsKKwlmbXQucGFyYW0uc2FtcGxlX3dvcmRfc2l6ZSA9IHNhbXBsZV93b3JkX3NpemU7CisJY2hhbm5lbF9tYXBwaW5nID0gZm10LnBhcmFtLmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgeworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBmb3JtYXQgdXBkYXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgICBpbnQgc3RyZWFtX2lkLAorCQkJCQkgICAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCisJCQkJCSAgICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJICAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAorCQkJCQkgICAgIHVpbnQxNl90IG1vZGUpCit7CisJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3BhcmFtX3Y0IGZtdDsKKwl1OCAqY2hhbm5lbF9tYXBwaW5nOworCWludCByYzsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXWJwc1slZF13b3Jkc2l6ZVslZF1cbiIsIF9fZnVuY19fLAorCQkgYWMtPnNlc3Npb24sIHJhdGUsIGNoYW5uZWxzLAorCQkgYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKKworCW1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7CisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJLyoKKwkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCisJICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCisJICogYXNzb2NpYXRlZAorCSAqLworCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQorCQlmbXQuaGRyLnRva2VuID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkZGRjAwKSB8CisJCQkJKHN0cmVhbV9pZCAmIDB4RkYpOworCisJcHJfZGVidWcoIiVzOiB0b2tlbiA9IDB4JXgsIHN0cmVhbV9pZCAgJWQsIHNlc3Npb24gMHgleFxuIiwKKwkJIF9fZnVuY19fLCBmbXQuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdF9ibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQlzaXplb2YoZm10LmZtdF9ibGspOworCWZtdC5wYXJhbS5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKwlmbXQucGFyYW0uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOworCWZtdC5wYXJhbS5zYW1wbGVfcmF0ZSA9IHJhdGU7CisJZm10LnBhcmFtLmlzX3NpZ25lZCA9IDE7CisJZm10LnBhcmFtLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOworCWZtdC5wYXJhbS5lbmRpYW5uZXNzID0gZW5kaWFubmVzczsKKwlmbXQucGFyYW0ubW9kZSA9IG1vZGU7CisJY2hhbm5lbF9tYXBwaW5nID0gZm10LnBhcmFtLmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgeworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBmb3JtYXQgdXBkYXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQoreworCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYWMsIHJhdGUsCisJCQkJY2hhbm5lbHMsIDE2LCBhYy0+c3RyZWFtX2lkLAorCQkJCXRydWUsIE5VTEwpOworfQorCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhYywgcmF0ZSwKKwkJCQljaGFubmVscywgYml0c19wZXJfc2FtcGxlLCBhYy0+c3RyZWFtX2lkLAorCQkJCXRydWUsIE5VTEwpOworfQorCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludCBzdHJlYW1faWQsCisJCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhciAqY2hhbm5lbF9tYXApCit7CisJaWYgKCF1c2VfZGVmYXVsdF9jaG1hcCAmJiAoY2hhbm5lbF9tYXAgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogTm8gdmFsaWQgY2hhbiBtYXAgYW5kIGNhbid0IHVzZSBkZWZhdWx0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhYywgcmF0ZSwKKwkJCQljaGFubmVscywgYml0c19wZXJfc2FtcGxlLCBzdHJlYW1faWQsCisJCQkJdXNlX2RlZmF1bHRfY2htYXAsIGNoYW5uZWxfbWFwKTsKK30KKworLyoKKyAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjMtIHNlbmRzIHBjbSBkZWNvZGVyCisgKgkJCQkJCSAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQHJhdGU6IHNhbXBsZSByYXRlCisgKiBAY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscworICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIGVuY29kZXIgc2Vzc2lvbgorICogQHN0cmVhbV9pZDogc3RyZWFtIGlkIG9mIHN0cmVhbSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCisgKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCAgdG8gYmUgdXNlZAorICogQGNoYW5uZWxfbWFwOiBpbnB1dCBjaGFubmVsIG1hcAorICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAorICovCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJCSAgIHVpbnQzMl90IHJhdGUsCisJCQkJCQkgICB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJCSAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSAgIGludCBzdHJlYW1faWQsCisJCQkJCQkgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkJICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCQkgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKQoreworCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fdjMoYWMsIHJhdGUsCisJCQkJY2hhbm5lbHMsIGJpdHNfcGVyX3NhbXBsZSwgc3RyZWFtX2lkLAorCQkJCXVzZV9kZWZhdWx0X2NobWFwLCBjaGFubmVsX21hcCwKKwkJCQlzYW1wbGVfd29yZF9zaXplKTsKKworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3YzKTsKKworLyoKKyAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjQtIHNlbmRzIHBjbSBkZWNvZGVyCisgKgkJCQkJCSAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQHJhdGU6IHNhbXBsZSByYXRlCisgKiBAY2hhbm5lbHM6IG51bWJlciBvZiBjaGFubmVscworICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIGVuY29kZXIgc2Vzc2lvbgorICogQHN0cmVhbV9pZDogc3RyZWFtIGlkIG9mIHN0cmVhbSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCisgKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCAgdG8gYmUgdXNlZAorICogQGNoYW5uZWxfbWFwOiBpbnB1dCBjaGFubmVsIG1hcAorICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAorICogQGVuZGlhbm5lc3M6IGVuZGlhbm5lc3Mgb2YgdGhlIHBjbSBkYXRhCisgKiBAbW9kZTogTW9kZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgcGNtIGlucHV0IGRhdGEKKyAqLworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCQkgICB1aW50MzJfdCByYXRlLAorCQkJCQkJICAgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJCQkgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCQkgICBpbnQgc3RyZWFtX2lkLAorCQkJCQkJICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCQkJCSAgIGNoYXIgKmNoYW5uZWxfbWFwLAorCQkJCQkJICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKKwkJCQkJCSAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCisJCQkJCQkgICB1aW50MTZfdCBtb2RlKQoreworCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7CisJCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fdjQoYWMsIHJhdGUsCisJCQkJY2hhbm5lbHMsIGJpdHNfcGVyX3NhbXBsZSwgc3RyZWFtX2lkLAorCQkJCXVzZV9kZWZhdWx0X2NobWFwLCBjaGFubmVsX21hcCwKKwkJCQlzYW1wbGVfd29yZF9zaXplLCBlbmRpYW5uZXNzLAorCQkJCW1vZGUpOworCit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjQpOworCisKK3N0YXRpYyBpbnQgX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwLAorCQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKK3sKKwlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfdjIgZm10OworCXU4ICpjaGFubmVsX21hcHBpbmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uLCByYXRlLAorCQljaGFubmVscyk7CisKKwlxNmFzbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdF9ibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQlzaXplb2YoZm10LmZtdF9ibGspOworCWZtdC5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKwlmbXQuYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOworCWZtdC5zYW1wbGVfcmF0ZSA9IHJhdGU7CisJZm10LmlzX3NpZ25lZCA9IDE7CisKKwljaGFubmVsX21hcHBpbmcgPSBmbXQuY2hhbm5lbF9tYXBwaW5nOworCisJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOworCisJaWYgKHVzZV9kZWZhdWx0X2NobWFwKSB7CisJCWlmIChxNmFzbV9tYXBfY2hhbm5lbHMoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVscywgZmFsc2UpKSB7CisJCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCBjaGFubmVscyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBmb3JtYXQgdXBkYXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCQkgICAgICB1aW50MzJfdCByYXRlLAorCQkJCQkJICAgICAgdWludDMyX3QgY2hhbm5lbHMsCisJCQkJCQkgICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkJICAgICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCQkgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCQkgICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKQoreworCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa19wYXJhbV92MyBmbXQ7CisJdTggKmNoYW5uZWxfbWFwcGluZzsKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1icHNbJWRdd29yZHNpemVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscywKKwkJIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7CisKKwltZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOworCXE2YXNtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCisJZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKKwlmbXQuZm10X2Jsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCQkJCXNpemVvZihmbXQuZm10X2Jsayk7CisJZm10LnBhcmFtLm51bV9jaGFubmVscyA9IGNoYW5uZWxzOworCWZtdC5wYXJhbS5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisJZm10LnBhcmFtLnNhbXBsZV9yYXRlID0gcmF0ZTsKKwlmbXQucGFyYW0uaXNfc2lnbmVkID0gMTsKKwlmbXQucGFyYW0uc2FtcGxlX3dvcmRfc2l6ZSA9IHNhbXBsZV93b3JkX3NpemU7CisJY2hhbm5lbF9tYXBwaW5nID0gZm10LnBhcmFtLmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgeworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCSAgICAgICBhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJCSAgICAgIHVpbnQzMl90IHJhdGUsCisJCQkJCQkgICAgICB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJCSAgICAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCisJCQkJCQkgICAgICBjaGFyICpjaGFubmVsX21hcCwKKwkJCQkJCSAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJCSAgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUsCisJCQkJCQkgICAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAorCQkJCQkJICAgICAgdWludDE2X3QgbW9kZSkKK3sKKwlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfcGFyYW1fdjQgZm10OworCXU4ICpjaGFubmVsX21hcHBpbmc7CisJaW50IHJjOworCisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdYnBzWyVkXXdvcmRzaXplWyVkXVxuIiwgX19mdW5jX18sCisJCSBhYy0+c2Vzc2lvbiwgcmF0ZSwgY2hhbm5lbHMsCisJCSBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOworCisJbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKwlxNmFzbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdF9ibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQlzaXplb2YoZm10LmZtdF9ibGspOworCWZtdC5wYXJhbS5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKwlmbXQucGFyYW0uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOworCWZtdC5wYXJhbS5zYW1wbGVfcmF0ZSA9IHJhdGU7CisJZm10LnBhcmFtLmlzX3NpZ25lZCA9IDE7CisJZm10LnBhcmFtLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOworCWZtdC5wYXJhbS5lbmRpYW5uZXNzID0gZW5kaWFubmVzczsKKwlmbXQucGFyYW0ubW9kZSA9IG1vZGU7CisJY2hhbm5lbF9tYXBwaW5nID0gZm10LnBhcmFtLmNoYW5uZWxfbWFwcGluZzsKKworCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKworCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgeworCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgeworCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbHMpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAorCQkJIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKKwl9CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCSAgICAgICBhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwKQoreworCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY20oYWMsIHJhdGUsCisJCQljaGFubmVscywgdXNlX2RlZmF1bHRfY2htYXAsIGNoYW5uZWxfbWFwLCAxNik7Cit9CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3YyKAorCQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCisJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwLAorCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCit7CisJcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbShhYywgcmF0ZSwKKwkJCWNoYW5uZWxzLCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhbm5lbF9tYXAsCisJCQliaXRzX3Blcl9zYW1wbGUpOworfQorCisvKgorICogcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MyAtIHNlbmRzIHBjbSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEByYXRlOiBzYW1wbGUgcmF0ZQorICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KKyAqIEB1c2VfZGVmYXVsdF9jaG1hcDogdHJ1ZSBpZiBkZWZhdWx0IGNoYW5uZWwgbWFwICB0byBiZSB1c2VkCisgKiBAY2hhbm5lbF9tYXA6IGlucHV0IGNoYW5uZWwgbWFwCisgKiBAc2FtcGxlX3dvcmRfc2l6ZTogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsCisgKi8KK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAorCQkJCQkgICAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCisJCQkJCSAgICAgY2hhciAqY2hhbm5lbF9tYXAsCisJCQkJCSAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAorCQkJCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpCit7CisJcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MyhhYywgcmF0ZSwgY2hhbm5lbHMsCisJCQkJCQkJICB1c2VfZGVmYXVsdF9jaG1hcCwKKwkJCQkJCQkgIGNoYW5uZWxfbWFwLAorCQkJCQkJCSAgYml0c19wZXJfc2FtcGxlLAorCQkJCQkJCSAgc2FtcGxlX3dvcmRfc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjMpOworCisvKgorICogcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NCAtIHNlbmRzIHBjbSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgKgorICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKKyAqIEByYXRlOiBzYW1wbGUgcmF0ZQorICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KKyAqIEB1c2VfZGVmYXVsdF9jaG1hcDogdHJ1ZSBpZiBkZWZhdWx0IGNoYW5uZWwgbWFwICB0byBiZSB1c2VkCisgKiBAY2hhbm5lbF9tYXA6IGlucHV0IGNoYW5uZWwgbWFwCisgKiBAc2FtcGxlX3dvcmRfc2l6ZTogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsCisgKiBAZW5kaWFubmVzczogZW5kaWFubmVzcyBvZiB0aGUgcGNtIGRhdGEKKyAqIEBtb2RlOiBNb2RlIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBwY20gaW5wdXQgZGF0YQorICovCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKKwkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAorCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKKwkJCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAorCQkJCQkgICAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCisJCQkJCSAgICAgdWludDE2X3QgbW9kZSkKK3sKKwlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3Y0KGFjLCByYXRlLCBjaGFubmVscywKKwkJCQkJCQkgIHVzZV9kZWZhdWx0X2NobWFwLAorCQkJCQkJCSAgY2hhbm5lbF9tYXAsCisJCQkJCQkJICBiaXRzX3Blcl9zYW1wbGUsCisJCQkJCQkJICBzYW1wbGVfd29yZF9zaXplLAorCQkJCQkJCSAgZW5kaWFubmVzcywKKwkJCQkJCQkgIG1vZGUpOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3Y0KTsKKworc3RhdGljIGludCBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IGFzbV9hYWNfZm10X2Jsa192MiBmbXQ7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uLAorCQljZmctPnNhbXBsZV9yYXRlLCBjZmctPmNoX2NmZyk7CisKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwkvKgorCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKKwkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKKwkgKiBhc3NvY2lhdGVkCisJICovCisJaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCisJCXE2YXNtX3VwZGF0ZV90b2tlbigmZm10Lmhkci50b2tlbiwKKwkJCQkgICBhYy0+c2Vzc2lvbiwKKwkJCQkgICBzdHJlYW1faWQsCisJCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCisJCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KKwkJCQkgICBXQUlUX0NNRCk7CisKKwlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAorCQkgIF9fZnVuY19fLCBmbXQuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKKwlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOworCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KKwkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKKwlmbXQuYWFjX2ZtdF9mbGFnID0gY2ZnLT5mb3JtYXQ7CisJZm10LmF1ZGlvX29ianlwZSA9IGNmZy0+YW90OworCS8qIElmIHplcm8sIFBDRSBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiBiaXRzdHJlYW0qLworCWZtdC50b3RhbF9zaXplX29mX1BDRV9iaXRzID0gMDsKKwlmbXQuY2hhbm5lbF9jb25maWcgPSBjZmctPmNoX2NmZzsKKwlmbXQuc2FtcGxlX3JhdGUgPSBjZmctPnNhbXBsZV9yYXRlOworCisJcHJfZGVidWcoIiVzOiBmb3JtYXQ9MHgleCBjZmdfc2l6ZT0lZCBhYWMtY2ZnPTB4JXggYW90PSVkIGNoPSVkIHNyPSVkXG4iLAorCQkJX19mdW5jX18sIGZtdC5hYWNfZm10X2ZsYWcsIGZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSwKKwkJCWZtdC5hYWNfZm10X2ZsYWcsCisJCQlmbXQuYXVkaW9fb2JqeXBlLAorCQkJZm10LmNoYW5uZWxfY29uZmlnLAorCQkJZm10LnNhbXBsZV9yYXRlKTsKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcpCit7CisJcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2FhYyhhYywgY2ZnLCBhYy0+c3RyZWFtX2lkKTsKK30KKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQlzdHJ1Y3QgYXNtX2FhY19jZmcgKmNmZykKK3sKKwlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKGFjLCBjZmcsIGFjLT5zdHJlYW1faWQpOworfQorCitpbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQlzdHJ1Y3QgYXNtX2FhY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKGFjLCBjZmcsIHN0cmVhbV9pZCk7Cit9CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfd21hKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXZvaWQgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX3dtYXN0ZHY5X2ZtdF9ibGtfdjIgZm10OworCXN0cnVjdCBhc21fd21hX2NmZyAqd21hX2NmZyA9IChzdHJ1Y3QgYXNtX3dtYV9jZmcgKiljZmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCJzZXNzaW9uWyVkXWZvcm1hdF90YWdbMHglNHhdIHJhdGVbJWRdIGNoWzB4JTR4XSBicHNbJWRdLCBiYWxpZ25bMHglNHhdLCBiaXRfc2FtcGxlWzB4JTR4XSwgY2hfbXNrWyVkXSwgZW5jX29wdFsweCU0eF1cbiIsCisJCWFjLT5zZXNzaW9uLCB3bWFfY2ZnLT5mb3JtYXRfdGFnLCB3bWFfY2ZnLT5zYW1wbGVfcmF0ZSwKKwkJd21hX2NmZy0+Y2hfY2ZnLCB3bWFfY2ZnLT5hdmdfYnl0ZXNfcGVyX3NlYywKKwkJd21hX2NmZy0+YmxvY2tfYWxpZ24sIHdtYV9jZmctPnZhbGlkX2JpdHNfcGVyX3NhbXBsZSwKKwkJd21hX2NmZy0+Y2hfbWFzaywgd21hX2NmZy0+ZW5jb2RlX29wdCk7CisKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCQkJCXNpemVvZihmbXQuZm10YmxrKTsKKwlmbXQuZm10YWcgPSB3bWFfY2ZnLT5mb3JtYXRfdGFnOworCWZtdC5udW1fY2hhbm5lbHMgPSB3bWFfY2ZnLT5jaF9jZmc7CisJZm10LnNhbXBsZV9yYXRlID0gd21hX2NmZy0+c2FtcGxlX3JhdGU7CisJZm10LmF2Z19ieXRlc19wZXJfc2VjID0gd21hX2NmZy0+YXZnX2J5dGVzX3Blcl9zZWM7CisJZm10LmJsa19hbGlnbiA9IHdtYV9jZmctPmJsb2NrX2FsaWduOworCWZtdC5iaXRzX3Blcl9zYW1wbGUgPQorCQkJd21hX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlOworCWZtdC5jaGFubmVsX21hc2sgPSB3bWFfY2ZnLT5jaF9tYXNrOworCWZtdC5lbmNfb3B0aW9ucyA9IHdtYV9jZmctPmVuY29kZV9vcHQ7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWFwcm8oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJdm9pZCAqY2ZnLCBpbnQgc3RyZWFtX2lkKQoreworCXN0cnVjdCBhc21fd21hcHJvdjEwX2ZtdF9ibGtfdjIgZm10OworCXN0cnVjdCBhc21fd21hcHJvX2NmZyAqd21hcHJvX2NmZyA9IChzdHJ1Y3QgYXNtX3dtYXByb19jZmcgKiljZmc7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1mb3JtYXRfdGFnWzB4JTR4XSByYXRlWyVkXSBjaFsweCU0eF0gYnBzWyVkXSwgYmFsaWduWzB4JTR4XSwgYml0X3NhbXBsZVsweCU0eF0sIGNoX21za1slZF0sIGVuY19vcHRbMHglNHhdLCBhZHZfZW5jX29wdFsweCU0eF0sIGFkdl9lbmNfb3B0MlsweCU4eF1cbiIsCisJCV9fZnVuY19fLAorCQlhYy0+c2Vzc2lvbiwgd21hcHJvX2NmZy0+Zm9ybWF0X3RhZywgd21hcHJvX2NmZy0+c2FtcGxlX3JhdGUsCisJCXdtYXByb19jZmctPmNoX2NmZywgIHdtYXByb19jZmctPmF2Z19ieXRlc19wZXJfc2VjLAorCQl3bWFwcm9fY2ZnLT5ibG9ja19hbGlnbiwgd21hcHJvX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlLAorCQl3bWFwcm9fY2ZnLT5jaF9tYXNrLCB3bWFwcm9fY2ZnLT5lbmNvZGVfb3B0LAorCQl3bWFwcm9fY2ZnLT5hZHZfZW5jb2RlX29wdCwgd21hcHJvX2NmZy0+YWR2X2VuY29kZV9vcHQyKTsKKworCXE2YXNtX3N0cmVhbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUsIHN0cmVhbV9pZCk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCisJZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKKwlmbXQuZm10YmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KKwkJCQkJCXNpemVvZihmbXQuZm10YmxrKTsKKworCWZtdC5mbXRhZyA9IHdtYXByb19jZmctPmZvcm1hdF90YWc7CisJZm10Lm51bV9jaGFubmVscyA9IHdtYXByb19jZmctPmNoX2NmZzsKKwlmbXQuc2FtcGxlX3JhdGUgPSB3bWFwcm9fY2ZnLT5zYW1wbGVfcmF0ZTsKKwlmbXQuYXZnX2J5dGVzX3Blcl9zZWMgPQorCQkJCXdtYXByb19jZmctPmF2Z19ieXRlc19wZXJfc2VjOworCWZtdC5ibGtfYWxpZ24gPSB3bWFwcm9fY2ZnLT5ibG9ja19hbGlnbjsKKwlmbXQuYml0c19wZXJfc2FtcGxlID0gd21hcHJvX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlOworCWZtdC5jaGFubmVsX21hc2sgPSB3bWFwcm9fY2ZnLT5jaF9tYXNrOworCWZtdC5lbmNfb3B0aW9ucyA9IHdtYXByb19jZmctPmVuY29kZV9vcHQ7CisJZm10LnVzQWR2YW5jZWRFbmNvZGVPcHQgPSB3bWFwcm9fY2ZnLT5hZHZfZW5jb2RlX29wdDsKKwlmbXQuYWR2YW5jZWRfZW5jX29wdGlvbnMyID0gd21hcHJvX2NmZy0+YWR2X2VuY29kZV9vcHQyOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYW1yd2JwbHVzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXN0cnVjdCBhc21fYW1yd2JwbHVzX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhc21fYW1yd2JwbHVzX2ZtdF9ibGtfdjIgZm10OworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdYmFuZC1tb2RlWyVkXWZyYW1lLWZtdFslZF1jaFslZF1cbiIsCisJCV9fZnVuY19fLAorCQlhYy0+c2Vzc2lvbiwKKwkJY2ZnLT5hbXJfYmFuZF9tb2RlLAorCQljZmctPmFtcl9mcmFtZV9mbXQsCisJCWNmZy0+bnVtX2NoYW5uZWxzKTsKKworCXE2YXNtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCisJZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKKwlmbXQuZm10YmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KKwkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOworCWZtdC5hbXJfZnJhbWVfZm10ID0gY2ZnLT5hbXJfZnJhbWVfZm10OworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tYW1uZCBtZWRpYSBmb3JtYXQgdXBkYXRlIGZhaWxlZC4uICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19mbGFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXN0cnVjdCBhc21fZmxhY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX2ZsYWNfZm10X2Jsa192MiBmbXQ7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlcyA6c2Vzc2lvblslZF0gcmF0ZVslZF0gY2hbJWRdIHNpemVbJWRdIHN0cmVhbV9pZFslZF1cbiIsCisJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5jaF9jZmcsCisJCWNmZy0+c2FtcGxlX3NpemUsIHN0cmVhbV9pZCk7CisKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCQkJCQlzaXplb2YoZm10LmZtdGJsayk7CisKKwlmbXQuaXNfc3RyZWFtX2luZm9fcHJlc2VudCA9IGNmZy0+c3RyZWFtX2luZm9fcHJlc2VudDsKKwlmbXQubnVtX2NoYW5uZWxzID0gY2ZnLT5jaF9jZmc7CisJZm10Lm1pbl9ibGtfc2l6ZSA9IGNmZy0+bWluX2Jsa19zaXplOworCWZtdC5tYXhfYmxrX3NpemUgPSBjZmctPm1heF9ibGtfc2l6ZTsKKwlmbXQuc2FtcGxlX3JhdGUgPSBjZmctPnNhbXBsZV9yYXRlOworCWZtdC5taW5fZnJhbWVfc2l6ZSA9IGNmZy0+bWluX2ZyYW1lX3NpemU7CisJZm10Lm1heF9mcmFtZV9zaXplID0gY2ZnLT5tYXhfZnJhbWVfc2l6ZTsKKwlmbXQuc2FtcGxlX3NpemUgPSBjZmctPnNhbXBsZV9zaXplOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlcyA6Q29tYW1uZCBtZWRpYSBmb3JtYXQgdXBkYXRlIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzIDp0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYWxhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlzdHJ1Y3QgYXNtX2FsYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IGFzbV9hbGFjX2ZtdF9ibGtfdjIgZm10OworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXMgOnNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1cbiIsIF9fZnVuY19fLAorCQlhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5udW1fY2hhbm5lbHMpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOworCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOworCisJZm10LmZyYW1lX2xlbmd0aCA9IGNmZy0+ZnJhbWVfbGVuZ3RoOworCWZtdC5jb21wYXRpYmxlX3ZlcnNpb24gPSBjZmctPmNvbXBhdGlibGVfdmVyc2lvbjsKKwlmbXQuYml0X2RlcHRoID0gY2ZnLT5iaXRfZGVwdGg7CisJZm10LnBiID0gY2ZnLT5wYjsKKwlmbXQubWIgPSBjZmctPm1iOworCWZtdC5rYiA9IGNmZy0+a2I7CisJZm10Lm51bV9jaGFubmVscyA9IGNmZy0+bnVtX2NoYW5uZWxzOworCWZtdC5tYXhfcnVuID0gY2ZnLT5tYXhfcnVuOworCWZtdC5tYXhfZnJhbWVfYnl0ZXMgPSBjZmctPm1heF9mcmFtZV9ieXRlczsKKwlmbXQuYXZnX2JpdF9yYXRlID0gY2ZnLT5hdmdfYml0X3JhdGU7CisJZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKKwlmbXQuY2hhbm5lbF9sYXlvdXRfdGFnID0gY2ZnLT5jaGFubmVsX2xheW91dF90YWc7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzIDpDb21hbW5kIG1lZGlhIGZvcm1hdCB1cGRhdGUgZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXMgOnRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworLyoKKyAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExIC0gc2VuZHMgZzcxMSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQorICogQGNmZzogQXVkaW8gc3RyZWFtIG1hbmFnZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAc3RyZWFtX2lkOiBTdHJlYW0gaWQKKyAqLworaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCXN0cnVjdCBhc21fZzcxMV9kZWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCit7CisJc3RydWN0IGFzbV9nNzExX2RlY19mbXRfYmxrX3YyIGZtdDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFjZmcpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBBU00gY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJlYW1faWQgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSBpZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXMgOnNlc3Npb25bJWRdcmF0ZVslZF1cbiIsIF9fZnVuY19fLAorCQlhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSk7CisKKwltZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKHN0cnVjdCBhc21fZzcxMV9kZWNfZm10X2Jsa192MikpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOworCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOworCisJZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXMgOkNvbW1hbmQgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfZzcxMSk7CisKK2ludCBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX3ZvcmJpcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlzdHJ1Y3QgYXNtX3ZvcmJpc19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX3ZvcmJpc19mbXRfYmxrX3YyIGZtdDsKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzIDpzZXNzaW9uWyVkXSBiaXRfc3RyZWFtX2ZtdFslZF0gc3RyZWFtX2lkWyVkXVxuIiwKKwkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBjZmctPmJpdF9zdHJlYW1fZm10LCBzdHJlYW1faWQpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOworCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQorCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOworCisJZm10LmJpdF9zdHJlYW1fZm10ID0gY2ZnLT5iaXRfc3RyZWFtX2ZtdDsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXMgOkNvbWFtbmQgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlzdHJ1Y3QgYXNtX2FwZV9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX2FwZV9mbXRfYmxrX3YyIGZtdDsKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIiVzIDpzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCWFjLT5zZXNzaW9uLCBjZmctPnNhbXBsZV9yYXRlLCBjZmctPm51bV9jaGFubmVscyk7CisKKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCXNpemVvZihmbXQuZm10YmxrKTsKKworCWZtdC5jb21wYXRpYmxlX3ZlcnNpb24gPSBjZmctPmNvbXBhdGlibGVfdmVyc2lvbjsKKwlmbXQuY29tcHJlc3Npb25fbGV2ZWwgPSBjZmctPmNvbXByZXNzaW9uX2xldmVsOworCWZtdC5mb3JtYXRfZmxhZ3MgPSBjZmctPmZvcm1hdF9mbGFnczsKKwlmbXQuYmxvY2tzX3Blcl9mcmFtZSA9IGNmZy0+YmxvY2tzX3Blcl9mcmFtZTsKKwlmbXQuZmluYWxfZnJhbWVfYmxvY2tzID0gY2ZnLT5maW5hbF9mcmFtZV9ibG9ja3M7CisJZm10LnRvdGFsX2ZyYW1lcyA9IGNmZy0+dG90YWxfZnJhbWVzOworCWZtdC5iaXRzX3Blcl9zYW1wbGUgPSBjZmctPmJpdHNfcGVyX3NhbXBsZTsKKwlmbXQubnVtX2NoYW5uZWxzID0gY2ZnLT5udW1fY2hhbm5lbHM7CisJZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKKwlmbXQuc2Vla190YWJsZV9wcmVzZW50ID0gY2ZnLT5zZWVrX3RhYmxlX3ByZXNlbnQ7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzIDpDb21hbW5kIG1lZGlhIGZvcm1hdCB1cGRhdGUgZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCisvKgorICogcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2RzZC0gU2VuZHMgRFNEIERlY29kZXIKKyAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCisgKiBAY2ZnOiBEU0QgTWVkaWEgRm9ybWF0IENvbmZpZ3VyYXRpb24uCisgKiBAc3RyZWFtX2lkOiBzdHJlYW0gaWQgb2Ygc3RyZWFtIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2RzZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQlzdHJ1Y3QgYXNtX2RzZF9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX2RzZF9mbXRfYmxrX3YyIGZtdDsKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIGRhdGFfcmF0ZVslZF0gY2hbJWRdXG4iLCBfX2Z1bmNfXywKKwkJIGFjLT5zZXNzaW9uLCBjZmctPmRzZF9kYXRhX3JhdGUsIGNmZy0+bnVtX2NoYW5uZWxzKTsKKworCW1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7CisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKKworCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7CisJZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCisJCQkJCXNpemVvZihmbXQuZm10YmxrKTsKKworCWZtdC5udW1fdmVyc2lvbiA9IGNmZy0+bnVtX3ZlcnNpb247CisJZm10LmlzX2JpdHdpc2VfYmlnX2VuZGlhbiA9IGNmZy0+aXNfYml0d2lzZV9iaWdfZW5kaWFuOworCWZtdC5kc2RfY2hhbm5lbF9ibG9ja19zaXplID0gY2ZnLT5kc2RfY2hhbm5lbF9ibG9ja19zaXplOworCWZtdC5udW1fY2hhbm5lbHMgPSBjZmctPm51bV9jaGFubmVsczsKKwlmbXQuZHNkX2RhdGFfcmF0ZSA9IGNmZy0+ZHNkX2RhdGFfcmF0ZTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCBEU0QgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQsIGVycjogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGRvbmU7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRFNEIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGRvbmU7CisJfQorCXJldHVybiAwOworZG9uZToKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19kc2QpOworCitzdGF0aWMgaW50IF9fcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHBhcmFtX2lkLAorCQkJCWludCBwYXJhbV92YWx1ZSwgaW50IHN0cmVhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX2RlY19kZHBfZW5kcF9wYXJhbV92MiBkZHBfY2ZnOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIHN0cmVhbVslZF0scGFyYW1faWRbJWRdcGFyYW1fdmFsdWVbJWRdIiwKKwkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgc3RyZWFtX2lkLCBwYXJhbV9pZCwgcGFyYW1fdmFsdWUpOworCisJcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZkZHBfY2ZnLmhkciwgc2l6ZW9mKGRkcF9jZmcpLCBUUlVFLAorCQkJICAgICBzdHJlYW1faWQpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwkvKgorCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKKwkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSBzdHJlYW0gd2l0aCB3aGljaCB0aGUgY29tbWFuZCBpcworCSAqIGFzc29jaWF0ZWQKKwkgKi8KKwlpZiAoYWMtPmlvX21vZGUgJiBDT01QUkVTU0VEX1NUUkVBTV9JTykKKwkJcTZhc21fdXBkYXRlX3Rva2VuKCZkZHBfY2ZnLmhkci50b2tlbiwKKwkJCQkgICBhYy0+c2Vzc2lvbiwKKwkJCQkgICBzdHJlYW1faWQsCisJCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCisJCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KKwkJCQkgICBXQUlUX0NNRCk7CisJZGRwX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKKwlkZHBfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IHBhcmFtX2lkOworCWRkcF9jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV9kZWNfZGRwX2VuZHBfcGFyYW1fdjIpIC0KKwkJCQkoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKSk7CisJZGRwX2NmZy5lbmRwX3BhcmFtX3ZhbHVlID0gcGFyYW1fdmFsdWU7CisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZkZHBfY2ZnKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgb3Bjb2RlWzB4JXhdIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQlkZHBfY2ZnLmhkci5vcGNvZGUpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9kczFfc2V0X2VuZHBfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJICAgICAgaW50IHBhcmFtX2lkLCBpbnQgcGFyYW1fdmFsdWUpCit7CisJcmV0dXJuIF9fcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhhYywgcGFyYW1faWQsIHBhcmFtX3ZhbHVlLAorCQkJCQkgICBhYy0+c3RyZWFtX2lkKTsKK30KKworaW50IHE2YXNtX2RzMV9zZXRfc3RyZWFtX2VuZHBfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJCSAgICAgaW50IHBhcmFtX2lkLCBpbnQgcGFyYW1fdmFsdWUsCisJCQkJICAgICBpbnQgc3RyZWFtX2lkKQoreworCXJldHVybiBfX3E2YXNtX2RzMV9zZXRfZW5kcF9wYXJhbXMoYWMsIHBhcmFtX2lkLCBwYXJhbV92YWx1ZSwKKwkJCQkJICAgc3RyZWFtX2lkKTsKK30KKworaW50IHE2YXNtX21lbW9yeV9tYXAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHBoeXNfYWRkcl90IGJ1Zl9hZGQsIGludCBkaXIsCisJCQkJdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCkKK3sKKwlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICptbWFwX3JlZ2lvbnMgPSBOVUxMOworCXN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAgKm1yZWdpb25zID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwl2b2lkCSptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOworCXZvaWQJKnBheWxvYWQgPSBOVUxMOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1ZmZlcl9ub2RlID0gTlVMTDsKKwlpbnQJcmMgPSAwOworCWludAljbWRfc2l6ZSA9IDA7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjLT5tbWFwX2FwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IG1tYXAgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IFNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOworCisJYnVmZmVyX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXJfbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQorCQkJKyBzaXplb2Yoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkKSAqIGJ1ZmNudDsKKworCW1tYXBfcmVnaW9uX2NtZCA9IGt6YWxsb2MoY21kX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChtbWFwX3JlZ2lvbl9jbWQgPT0gTlVMTCkgeworCQlyYyA9IC1FSU5WQUw7CisJCWtmcmVlKGJ1ZmZlcl9ub2RlKTsKKwkJcmV0dXJuIHJjOworCX0KKwltbWFwX3JlZ2lvbnMgPSAoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqKQorCQkJCQkJCW1tYXBfcmVnaW9uX2NtZDsKKwlxNmFzbV9hZGRfbW1hcGhkcihhYywgJm1tYXBfcmVnaW9ucy0+aGRyLCBjbWRfc2l6ZSwgZGlyKTsKKwlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAtMSk7CisJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOworCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7CisJbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudCAmIDB4MDBmZjsKKwltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCXBheWxvYWQgPSAoKHU4ICopIG1tYXBfcmVnaW9uX2NtZCArCisJCXNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSk7CisJbXJlZ2lvbnMgPSAoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICopcGF5bG9hZDsKKworCWFjLT5wb3J0W2Rpcl0udG1wX2hkbCA9IDA7CisJcG9ydCA9ICZhYy0+cG9ydFtkaXJdOworCXByX2RlYnVnKCIlczogYnVmX2FkZCAweCVwSywgYnVmc3o6ICVkXG4iLCBfX2Z1bmNfXywKKwkJJmJ1Zl9hZGQsIGJ1ZnN6KTsKKwltcmVnaW9ucy0+c2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkKTsKKwltcmVnaW9ucy0+c2htX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX2FkZCk7CisJbXJlZ2lvbnMtPm1lbV9zaXplX2J5dGVzID0gYnVmc3o7CisJKyttcmVnaW9uczsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopIG1tYXBfcmVnaW9uX2NtZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtbWFwIG9wWzB4JXhdcmNbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQkJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJa2ZyZWUoYnVmZmVyX25vZGUpOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5tZW1fd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkgPj0gMCAmJgorCQkJIGFjLT5wb3J0W2Rpcl0udG1wX2hkbCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfbWFwXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJa2ZyZWUoYnVmZmVyX25vZGUpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIGZvciBtZW1vcnlfbWFwXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCWF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSk7CisJCWtmcmVlKGJ1ZmZlcl9ub2RlKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJYnVmZmVyX25vZGUtPmJ1Zl9waHlzX2FkZHIgPSBidWZfYWRkOworCWJ1ZmZlcl9ub2RlLT5tbWFwX2hkbCA9IGFjLT5wb3J0W2Rpcl0udG1wX2hkbDsKKwlsaXN0X2FkZF90YWlsKCZidWZmZXJfbm9kZS0+bGlzdCwgJmFjLT5wb3J0W2Rpcl0ubWVtX21hcF9oYW5kbGUpOworCWFjLT5wb3J0W2Rpcl0udG1wX2hkbCA9IDA7CisJcmMgPSAwOworCitmYWlsX2NtZDoKKwlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOworCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX21lbW9yeV91bm1hcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgcGh5c19hZGRyX3QgYnVmX2FkZCwgaW50IGRpcikKK3sKKwlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgbWVtX3VubWFwOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCisJaW50IHJjID0gMDsKKworCWlmICghYWMpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodGhpc19tbWFwLmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBTZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKworCXE2YXNtX2FkZF9tbWFwaGRyKGFjLCAmbWVtX3VubWFwLmhkciwKKwkJCXNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMpLAorCQkJZGlyKTsKKwlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAtMSk7CisJbWVtX3VubWFwLmhkci5vcGNvZGUgPSBBU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzsKKwltZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPSAwOworCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKSB7CisJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJCQlsaXN0KTsKKwkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGJ1Zl9hZGQpIHsKKwkJCXByX2RlYnVnKCIlczogRm91bmQgdGhlIGVsZW1lbnRcbiIsIF9fZnVuY19fKTsKKwkJCW1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKKwkJCWJyZWFrOworCQl9CisJfQorCXByX2RlYnVnKCIlczogbWVtX3VubWFwLW1lbV9tYXBfaGFuZGxlOiAweCV4XG4iLAorCQlfX2Z1bmNfXywgbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKKworCWlmIChtZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBEbyBub3Qgc2VuZCBudWxsIG1lbSBoYW5kbGUgdG8gRFNQXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gMDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPm1tYXBfYXByLCAodWludDMyX3QgKikgJm1lbV91bm1hcCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtZW1fdW5tYXAgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCQltZW1fdW5tYXAuaGRyLm9wY29kZSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPm1lbV93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+PSAwKSwgNSAqIEhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X3VubWFwIG9mIGhhbmRsZSAweCV4XG4iLAorCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlcyBEU1AgcmV0dXJuZWQgZXJyb3IgWyVzXSBtYXAgaGFuZGxlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpLAorCQkJbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+dW5tYXBfY2Jfc3VjY2VzcykgPT0gMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBtZW0gdW5tYXAgY2FsbGJhY2sgb2YgaGFuZGxlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gMDsKK2ZhaWxfY21kOgorCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKSB7CisJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJCQlsaXN0KTsKKwkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGJ1Zl9hZGQpIHsKKwkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7CisJCQlrZnJlZShidWZfbm9kZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIsCisJCQkJdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCwKKwkJCQlib29sIGlzX2NvbnRpZ3VvdXMpCit7CisJc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqbW1hcF9yZWdpb25zID0gTlVMTDsKKwlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgICptcmVnaW9ucyA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIgPSBOVUxMOworCXZvaWQJKm1tYXBfcmVnaW9uX2NtZCA9IE5VTEw7CisJdm9pZAkqcGF5bG9hZCA9IE5VTEw7CisJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmZmVyX25vZGUgPSBOVUxMOworCWludAlyYyA9IDA7CisJaW50ICAgIGkgPSAwOworCXVpbnQzMl90IGNtZF9zaXplID0gMDsKKwl1aW50MzJfdCBidWZjbnRfdDsKKwl1aW50MzJfdCBidWZzel90OworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+bW1hcF9hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBtbWFwIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBTZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKworCWJ1ZmNudF90ID0gKGlzX2NvbnRpZ3VvdXMpID8gMSA6IGJ1ZmNudDsKKwlidWZzel90ID0gKGlzX2NvbnRpZ3VvdXMpID8gKGJ1ZnN6ICogYnVmY250KSA6IGJ1ZnN6OworCisJaWYgKGlzX2NvbnRpZ3VvdXMpIHsKKwkJLyogVGhlIHNpemUgdG8gbWVtb3J5IG1hcCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNEsgYnl0ZXMgKi8KKwkJYnVmc3pfdCA9IFBBR0VfQUxJR04oYnVmc3pfdCk7CisJfQorCisJaWYgKGJ1ZmNudF90ID4gKFVJTlRfTUFYCisJCQktIHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSkKKwkJCS8gc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkpIHsKKwkJcHJfZXJyKCIlczogVW5zaWduZWQgSW50ZWdlciBPdmVyZmxvdy4gYnVmY250X3QgPSAldVxuIiwKKwkJCQlfX2Z1bmNfXywgYnVmY250X3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQorCQkJKyAoc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkKKwkJCQkJCQkqIGJ1ZmNudF90KTsKKworCisJaWYgKGJ1ZmNudCA+IChVSU5UX01BWCAvIHNpemVvZihzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlKSkpIHsKKwkJcHJfZXJyKCIlczogVW5zaWduZWQgSW50ZWdlciBPdmVyZmxvdy4gYnVmY250ID0gJXVcbiIsCisJCQkJX19mdW5jX18sIGJ1ZmNudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1ZmZlcl9ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzbV9idWZmZXJfbm9kZSkgKiBidWZjbnQsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXJfbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAobW1hcF9yZWdpb25fY21kID09IE5VTEwpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlrZnJlZShidWZmZXJfbm9kZSk7CisJCXJldHVybiByYzsKKwl9CisJbW1hcF9yZWdpb25zID0gKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKikKKwkJCQkJCQltbWFwX3JlZ2lvbl9jbWQ7CisJcTZhc21fYWRkX21tYXBoZHIoYWMsICZtbWFwX3JlZ2lvbnMtPmhkciwgY21kX3NpemUsIGRpcik7CisJYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOworCXByX2RlYnVnKCIlczogbW1hcF9yZWdpb249MHglcEsgdG9rZW49MHgleFxuIiwgX19mdW5jX18sCisJCW1tYXBfcmVnaW9ucywgKChhYy0+c2Vzc2lvbiA8PCA4KSB8IGRpcikpOworCisJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOworCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7CisJbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudF90OyAvKmJ1ZmNudCAmIDB4MDBmZjsgKi8KKwltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCXByX2RlYnVnKCIlczogbWFwX3JlZ2lvbnMtPm5yZWdpb25zID0gJWRcbiIsIF9fZnVuY19fLAorCQltbWFwX3JlZ2lvbnMtPm51bV9yZWdpb25zKTsKKwlwYXlsb2FkID0gKCh1OCAqKSBtbWFwX3JlZ2lvbl9jbWQgKworCQlzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOworCW1yZWdpb25zID0gKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqKXBheWxvYWQ7CisKKwlhYy0+cG9ydFtkaXJdLnRtcF9oZGwgPSAwOworCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmY250X3Q7IGkrKykgeworCQlhYiA9ICZwb3J0LT5idWZbaV07CisJCW1yZWdpb25zLT5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGFiLT5waHlzKTsKKwkJbXJlZ2lvbnMtPnNobV9hZGRyX21zdyA9CisJCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYWItPnBoeXMpOworCQltcmVnaW9ucy0+bWVtX3NpemVfYnl0ZXMgPSBidWZzel90OworCQkrK21yZWdpb25zOworCX0KKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopIG1tYXBfcmVnaW9uX2NtZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCQltbWFwX3JlZ2lvbnMtPmhkci5vcGNvZGUsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlrZnJlZShidWZmZXJfbm9kZSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPm1lbV93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+PSAwKQorCQkJICwgNSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeV9tYXBcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlrZnJlZShidWZmZXJfbm9kZSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXMgRFNQIHJldHVybmVkIGVycm9yIGZvciBtZW1vcnlfbWFwIFslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKTsKKwkJa2ZyZWUoYnVmZmVyX25vZGUpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGJ1ZmNudDsgaSsrKSB7CisJCWFiID0gJnBvcnQtPmJ1ZltpXTsKKwkJYnVmZmVyX25vZGVbaV0uYnVmX3BoeXNfYWRkciA9IGFiLT5waHlzOworCQlidWZmZXJfbm9kZVtpXS5tbWFwX2hkbCA9IGFjLT5wb3J0W2Rpcl0udG1wX2hkbDsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmZmVyX25vZGVbaV0ubGlzdCwKKwkJCSZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKTsKKwkJcHJfZGVidWcoIiVzOiBpPSVkLCBidWZhZGRbaV0gPSAweCVwSywgbWFwaGRsW2ldID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBpLCAmYnVmZmVyX25vZGVbaV0uYnVmX3BoeXNfYWRkciwKKwkJCWJ1ZmZlcl9ub2RlW2ldLm1tYXBfaGRsKTsKKwl9CisJYWMtPnBvcnRbZGlyXS50bXBfaGRsID0gMDsKKwltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7CisJcmMgPSAwOworZmFpbF9jbWQ6CisJa2ZyZWUobW1hcF9yZWdpb25fY21kKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcTZhc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpCit7CisJc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIG1lbV91bm1hcDsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlwaHlzX2FkZHJfdCBidWZfYWRkOworCWludAlyYyA9IDA7CisJaW50CWNtZF9zaXplID0gMDsKKworCWlmICghYWMpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPm1tYXBfYXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogbW1hcCBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogU2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7CisKKwljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMpOworCXE2YXNtX2FkZF9tbWFwaGRyKGFjLCAmbWVtX3VubWFwLmhkciwgY21kX3NpemUsIGRpcik7CisJYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOworCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKKwlidWZfYWRkID0gcG9ydC0+YnVmLT5waHlzOworCW1lbV91bm1hcC5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM7CisJbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlID0gMDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYWMtPnBvcnRbZGlyXS5tZW1fbWFwX2hhbmRsZSkgeworCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAorCQkJCQkJbGlzdCk7CisJCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBidWZfYWRkKSB7CisJCQlwcl9kZWJ1ZygiJXM6IEZvdW5kIHRoZSBlbGVtZW50XG4iLCBfX2Z1bmNfXyk7CisJCQltZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXByX2RlYnVnKCIlczogbWVtX3VubWFwLW1lbV9tYXBfaGFuZGxlOiAweCV4XG4iLAorCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7CisKKwlpZiAobWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlID09IDApIHsKKwkJcHJfZXJyKCIlczogRG8gbm90IHNlbmQgbnVsbCBtZW0gaGFuZGxlIHRvIERTUFxuIiwgX19mdW5jX18pOworCQlyYyA9IDA7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopICZtZW1fdW5tYXApOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCJtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJbWVtX3VubWFwLmhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+bWVtX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X3VubWFwIG9mIGhhbmRsZSAweCV4XG4iLAorCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmFjLT51bm1hcF9jYl9zdWNjZXNzKSA9PSAwKSB7CisJCXByX2VycigiJXM6IEVycm9yIGluIG1lbSB1bm1hcCBjYWxsYmFjayBvZiBoYW5kbGUgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBtZW1fdW5tYXAubWVtX21hcF9oYW5kbGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gMDsKKworZmFpbF9jbWQ6CisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmFjLT5wb3J0W2Rpcl0ubWVtX21hcF9oYW5kbGUpIHsKKwkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKKwkJCQkJCWxpc3QpOworCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gYnVmX2FkZCkgeworCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKKwkJCWtmcmVlKGJ1Zl9ub2RlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX3NldF9scmdhaW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBsZWZ0X2dhaW4sIGludCByaWdodF9nYWluKQoreworCXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbXVsdGljaGFubmVsX2dhaW4gbXVsdGlfY2hfZ2FpbjsKKwlpbnQgc3ogPSAwOworCWludCByYyAgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCW1lbXNldCgmbXVsdGlfY2hfZ2FpbiwgMCwgc2l6ZW9mKG11bHRpX2NoX2dhaW4pKTsKKwlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX211bHRpY2hhbm5lbF9nYWluKTsKKwlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmbXVsdGlfY2hfZ2Fpbi5oZHIsIHN6LCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJbXVsdGlfY2hfZ2Fpbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKKwltdWx0aV9jaF9nYWluLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJbXVsdGlfY2hfZ2Fpbi5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOworCW11bHRpX2NoX2dhaW4ucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOworCW11bHRpX2NoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2YobXVsdGlfY2hfZ2FpbikgLQorCQlzaXplb2YobXVsdGlfY2hfZ2Fpbi5oZHIpIC0gc2l6ZW9mKG11bHRpX2NoX2dhaW4ucGFyYW0pOworCW11bHRpX2NoX2dhaW4uZGF0YS5tb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOworCW11bHRpX2NoX2dhaW4uZGF0YS5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTjsKKwltdWx0aV9jaF9nYWluLmRhdGEucGFyYW1fc2l6ZSA9IG11bHRpX2NoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQorCQlzaXplb2YobXVsdGlfY2hfZ2Fpbi5kYXRhKTsKKwltdWx0aV9jaF9nYWluLmRhdGEucmVzZXJ2ZWQgPSAwOworCW11bHRpX2NoX2dhaW4uZ2Fpbl9kYXRhWzBdLmNoYW5uZWx0eXBlID0gUENNX0NIQU5ORUxfRkw7CisJbXVsdGlfY2hfZ2Fpbi5nYWluX2RhdGFbMF0uZ2FpbiA9IGxlZnRfZ2FpbiA8PCAxNTsKKwltdWx0aV9jaF9nYWluLmdhaW5fZGF0YVsxXS5jaGFubmVsdHlwZSA9IFBDTV9DSEFOTkVMX0ZSOworCW11bHRpX2NoX2dhaW4uZ2Fpbl9kYXRhWzFdLmdhaW4gPSByaWdodF9nYWluIDw8IDE1OworCW11bHRpX2NoX2dhaW4ubnVtX2NoYW5uZWxzID0gMjsKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm11bHRpX2NoX2dhaW4pOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogc2V0LXBhcmFtcyBzZW5kIGZhaWxlZCBwYXJhbWlkWzB4JXhdIHJjICVkXG4iLAorCQkJCV9fZnVuY19fLCBtdWx0aV9jaF9nYWluLmRhdGEucGFyYW1faWQsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCQltdWx0aV9jaF9nYWluLmRhdGEucGFyYW1faWQpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gLCBzZXQtcGFyYW1zIHBhcmFtaWRbMHgleF1cbiIsCisJCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSwKKwkJCQkJbXVsdGlfY2hfZ2Fpbi5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworLyoKKyAqIHE2YXNtX3NldF9tdWx0aWNoX2dhaW46IHNldCBtdWx0aXBsZSBjaGFubmVsIGdhaW5zIG9uIGFuIEFTTSBzZXNzaW9uCisgKiBAYWM6IGF1ZGlvIGNsaWVudCBoYW5kbGUKKyAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIGNhbGxlciBpbnRlbmRzIHRvIHNldCBnYWlucworICogQGdhaW5zOiBsaXN0IG9mIGdhaW5zIG9mIGF1ZGlvIGNoYW5uZWxzCisgKiBAY2hfbWFwOiBsaXN0IG9mIGNoYW5uZWwgbWFwcGluZy4gT25seSB2YWxpZCBpZiB1c2VfZGVmYXVsdCBpcyBmYWxzZQorICogQHVzZV9kZWZhdWx0OiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgbWFwcGluZworICovCitpbnQgcTZhc21fc2V0X211bHRpY2hfZ2FpbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgY2hhbm5lbHMsCisJCQkgICB1aW50MzJfdCAqZ2FpbnMsIHVpbnQ4X3QgKmNoX21hcCwgYm9vbCB1c2VfZGVmYXVsdCkKK3sKKwlzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX211bHRpY2hhbm5lbF9nYWluIG11bHRpY2hfZ2FpbjsKKwlpbnQgc3ogPSAwOworCWludCByYyAgPSAwOworCWludCBpOworCXU4IGRlZmF1bHRfY2htYXBbVk9MVU1FX0NPTlRST0xfTUFYX0NIQU5ORUxTXTsKKworCWlmIChhYyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGFjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGdhaW5zID09IE5VTEwpIHsKKwkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IGdhaW5fbGlzdCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoY2hhbm5lbHMgPiBWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFMpIHsKKwkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IEludmFsaWQgY2hhbm5lbCBjb3VudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFubmVscyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIXVzZV9kZWZhdWx0ICYmIGNoX21hcCA9PSBOVUxMKSB7CisJCWRldl9lcnIoYWMtPmRldiwgIiVzOiBOVUxMIGNoYW5uZWwgbWFwXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW1lbXNldCgmbXVsdGljaF9nYWluLCAwLCBzaXplb2YobXVsdGljaF9nYWluKSk7CisJc3ogPSBzaXplb2Yoc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfZ2Fpbik7CisJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJm11bHRpY2hfZ2Fpbi5oZHIsIHN6LCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAxKTsKKwltdWx0aWNoX2dhaW4uaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjI7CisJbXVsdGljaF9nYWluLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJbXVsdGljaF9nYWluLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7CisJbXVsdGljaF9nYWluLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKKwltdWx0aWNoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2YobXVsdGljaF9nYWluKSAtCisJCXNpemVvZihtdWx0aWNoX2dhaW4uaGRyKSAtIHNpemVvZihtdWx0aWNoX2dhaW4ucGFyYW0pOworCW11bHRpY2hfZ2Fpbi5kYXRhLm1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfVk9MX0NUUkw7CisJbXVsdGljaF9nYWluLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU47CisJbXVsdGljaF9nYWluLmRhdGEucGFyYW1fc2l6ZSA9IG11bHRpY2hfZ2Fpbi5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSAtCisJCXNpemVvZihtdWx0aWNoX2dhaW4uZGF0YSk7CisJbXVsdGljaF9nYWluLmRhdGEucmVzZXJ2ZWQgPSAwOworCisJaWYgKHVzZV9kZWZhdWx0KSB7CisJCXJjID0gcTZhc21fbWFwX2NoYW5uZWxzKGRlZmF1bHRfY2htYXAsIGNoYW5uZWxzLCBmYWxzZSk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGRvbmU7CisJCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisJCQltdWx0aWNoX2dhaW4uZ2Fpbl9kYXRhW2ldLmNoYW5uZWx0eXBlID0KKwkJCQlkZWZhdWx0X2NobWFwW2ldOworCQkJbXVsdGljaF9nYWluLmdhaW5fZGF0YVtpXS5nYWluID0gZ2FpbnNbaV0gPDwgMTU7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworCQkJbXVsdGljaF9nYWluLmdhaW5fZGF0YVtpXS5jaGFubmVsdHlwZSA9IGNoX21hcFtpXTsKKwkJCW11bHRpY2hfZ2Fpbi5nYWluX2RhdGFbaV0uZ2FpbiA9IGdhaW5zW2ldIDw8IDE1OworCQl9CisJfQorCW11bHRpY2hfZ2Fpbi5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmbXVsdGljaF9nYWluKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbXVsdGljaF9nYWluLmRhdGEucGFyYW1faWQsIHJjKTsKKwkJZ290byBkb25lOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPD0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCQltdWx0aWNoX2dhaW4uZGF0YS5wYXJhbV9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpIDwgMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJWRdICwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAorCQkJCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpLAorCQkJCQltdWx0aWNoX2dhaW4uZGF0YS5wYXJhbV9pZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlyYyA9IDA7Citkb25lOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX3NldF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgbXV0ZWZsYWcpCit7CisJc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZyBtdXRlOworCWludCBzeiA9IDA7CisJaW50IHJjICA9IDA7CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZyk7CisJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJm11dGUuaGRyLCBzeiwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCW11dGUuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjI7CisJbXV0ZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOworCW11dGUucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwltdXRlLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKKwltdXRlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKG11dGUpIC0KKwkJc2l6ZW9mKG11dGUuaGRyKSAtIHNpemVvZihtdXRlLnBhcmFtKTsKKwltdXRlLmRhdGEubW9kdWxlX2lkID0gQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKKwltdXRlLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfVk9MX0NUUkxfTVVURV9DT05GSUc7CisJbXV0ZS5kYXRhLnBhcmFtX3NpemUgPSBtdXRlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplIC0gc2l6ZW9mKG11dGUuZGF0YSk7CisJbXV0ZS5kYXRhLnJlc2VydmVkID0gMDsKKwltdXRlLm11dGVfZmxhZyA9IG11dGVmbGFnOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtdXRlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbXV0ZS5kYXRhLnBhcmFtX2lkLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCisJCQkJbXV0ZS5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSwKKwkJCQltdXRlLmRhdGEucGFyYW1faWQpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZhc21fZHRzX2VhZ2xlX3NldChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHBhcmFtX2lkLCB1aW50MzJfdCBzaXplLAorCQkJdm9pZCAqZGF0YSwgc3RydWN0IHBhcmFtX291dGJhbmQgKnBvLCBpbnQgbV9pZCkKK3sKKwlpbnQgcmMgPSAwLCAqb2JfcGFyYW1zID0gTlVMTDsKKwl1aW50MzJfdCBzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX2R0c19lYWdsZV9wYXJhbSkgKyAocG8gPyAwIDogc2l6ZSk7CisJc3RydWN0IGFzbV9kdHNfZWFnbGVfcGFyYW0gKmFkOworCisJaWYgKCFhYyB8fCBhYy0+YXByID09IE5VTEwgfHwgKHNpemUgPT0gMCkgfHwgIWRhdGEpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQVNNIC0gJXM6IEFQUiBoYW5kbGUgTlVMTCwgaW52YWxpZCBzaXplICV1IG9yIHBvaW50ZXIgJXBLLlxuIiwKKwkJCV9fZnVuY19fLCBzaXplLCBkYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWQgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCJEVFNfRUFHTEVfQVNNIC0gJXM6IGFjICVwSyBwYXJhbV9pZCAweCV4IHNpemUgJXUgZGF0YSAlcEsgbV9pZCAweCV4XG4iLAorCQlfX2Z1bmNfXywgYWMsIHBhcmFtX2lkLCBzaXplLCBkYXRhLCBtX2lkKTsKKwlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmYWQtPmhkciwgc3osIDEpOworCWFkLT5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKKwlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKworCWFkLT5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7CisJYWQtPnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZSArCisJCQkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyKTsKKwlhZC0+ZGF0YS5tb2R1bGVfaWQgPSBtX2lkOworCWFkLT5kYXRhLnBhcmFtX2lkID0gcGFyYW1faWQ7CisJYWQtPmRhdGEucGFyYW1fc2l6ZSA9IHNpemU7CisJYWQtPmRhdGEucmVzZXJ2ZWQgPSAwOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCWlmIChwbykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpub2RlOworCisJCXByX2RlYnVnKCJEVFNfRUFHTEVfQVNNIC0gJXM6IHVzaW5nIG91dCBvZiBiYW5kIG1lbW9yeSAodmlydHVhbCAlcEssIHBoeXNpY2FsICVsdSlcbiIsCisJCQlfX2Z1bmNfXywgcG8tPmt2YWRkciwgKGxvbmcpcG8tPnBhZGRyKTsKKwkJYWQtPnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMocG8tPnBhZGRyKTsKKwkJYWQtPnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9CisJCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMocG8tPnBhZGRyKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmFjLT5wb3J0W0lOXS5tZW1fbWFwX2hhbmRsZSkgeworCQkJbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLCBsaXN0KTsKKwkJCWlmIChub2RlLT5idWZfcGh5c19hZGRyID09IHBvLT5wYWRkcikgeworCQkJCWFkLT5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IG5vZGUtPm1tYXBfaGRsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChhZC0+cGFyYW0ubWVtX21hcF9oYW5kbGUgPT0gMCkgeworCQkJcHJfZXJyKCJEVFNfRUFHTEVfQVNNIC0gJXM6IG1lbSBtYXAgaGFuZGxlIG5vdCBmb3VuZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJCWlmIChzaXplID4gKFVJTlRfTUFYIC0gQVBSX0NNRF9PQl9IRFJfU1opKQorCQkJcmMgPSAtRUlOVkFMOworCQlpZiAoKHJjIDwgMCkgfHwgKHNpemUgKyBBUFJfQ01EX09CX0hEUl9TWiA+IHBvLT5zaXplKSkgeworCQkJcHJfZXJyKCJEVFNfRUFHTEVfQVNNIC0gJXM6IGlvbiBhbGxvYyBvZiBzaXplICV6dSB0b28gc21hbGwgZm9yIHNpemUgcmVxdWVzdGVkICV1XG4iLAorCQkJCV9fZnVuY19fLCBwby0+c2l6ZSwgc2l6ZSArIEFQUl9DTURfT0JfSERSX1NaKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwkJb2JfcGFyYW1zID0gKGludCAqKXBvLT5rdmFkZHI7CisJCSpvYl9wYXJhbXMrKyA9IG1faWQ7CisJCSpvYl9wYXJhbXMrKyA9IHBhcmFtX2lkOworCQkqb2JfcGFyYW1zKysgPSBzaXplOworCQltZW1jcHkob2JfcGFyYW1zLCBkYXRhLCBzaXplKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiRFRTX0VBR0xFX0FTTSAtICVzOiB1c2luZyBpbiBiYW5kXG4iLCBfX2Z1bmNfXyk7CisJCW1lbWNweSgoKGNoYXIgKilhZCkgKyBzaXplb2Yoc3RydWN0IGFzbV9kdHNfZWFnbGVfcGFyYW0pLAorCQkJZGF0YSwgc2l6ZSk7CisJfQorCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKWFkKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FTTSAtICVzOiBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkIHBhcmFtaWRbMHgleF1cbiIsCisJCQlfX2Z1bmNfXywgYWQtPmRhdGEucGFyYW1faWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgMSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BU00gLSAlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAorCQkJX19mdW5jX18sIGFkLT5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJa2ZyZWUoYWQpOworCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX2R0c19lYWdsZV9nZXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBwYXJhbV9pZCwgdWludDMyX3Qgc2l6ZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbywgaW50IG1faWQpCit7CisJc3RydWN0IGFzbV9kdHNfZWFnbGVfcGFyYW1fZ2V0ICphZDsKKwlpbnQgcmMgPSAwLCAqb2JfcGFyYW1zID0gTlVMTDsKKwl1aW50MzJfdCBzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX2R0c19lYWdsZV9wYXJhbSkgKyBBUFJfQ01EX0dFVF9IRFJfU1ogKworCQkgKHBvID8gMCA6IHNpemUpOworCisJaWYgKCFhYyB8fCBhYy0+YXByID09IE5VTEwgfHwgKHNpemUgPT0gMCkgfHwgIWRhdGEpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQVNNIC0gJXM6IEFQUiBoYW5kbGUgTlVMTCwgaW52YWxpZCBzaXplICV1IG9yIHBvaW50ZXIgJXBLXG4iLAorCQkJX19mdW5jX18sIHNpemUsIGRhdGEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYWQgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByX2RlYnVnKCJEVFNfRUFHTEVfQVNNIC0gJXM6IGFjICVwSyBwYXJhbV9pZCAweCV4IHNpemUgJXUgZGF0YSAlcEsgbV9pZCAweCV4XG4iLAorCQlfX2Z1bmNfXywgYWMsIHBhcmFtX2lkLCBzaXplLCBkYXRhLCBtX2lkKTsKKwlxNmFzbV9hZGRfaGRyKGFjLCAmYWQtPmhkciwgc3osIFRSVUUpOworCWFkLT5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfR0VUX1BQX1BBUkFNU19WMjsKKwlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwlhZC0+cGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOworCWFkLT5wYXJhbS5tb2R1bGVfaWQgPSBtX2lkOworCWFkLT5wYXJhbS5wYXJhbV9pZCA9IHBhcmFtX2lkOworCWFkLT5wYXJhbS5wYXJhbV9tYXhfc2l6ZSA9IHNpemUgKyBBUFJfQ01EX0dFVF9IRFJfU1o7CisJYWQtPnBhcmFtLnJlc2VydmVkID0gMDsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlnZW5lcmljX2dldF9kYXRhID0ga3phbGxvYyhzaXplICsgc2l6ZW9mKHN0cnVjdCBnZW5lcmljX2dldF9kYXRhXyksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFnZW5lcmljX2dldF9kYXRhKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAocG8pIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwkJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqbm9kZTsKKworCQlwcl9kZWJ1ZygiRFRTX0VBR0xFX0FTTSAtICVzOiB1c2luZyBvdXQgb2YgYmFuZCBtZW1vcnkgKHZpcnR1YWwgJXBLLCBwaHlzaWNhbCAlbHUpXG4iLAorCQkJIF9fZnVuY19fLCBwby0+a3ZhZGRyLCAobG9uZylwby0+cGFkZHIpOworCQlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhwby0+cGFkZHIpOworCQlhZC0+cGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0KKwkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhwby0+cGFkZHIpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYWMtPnBvcnRbSU5dLm1lbV9tYXBfaGFuZGxlKSB7CisJCQlub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsIGxpc3QpOworCQkJaWYgKG5vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gcG8tPnBhZGRyKSB7CisJCQkJYWQtPnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gbm9kZS0+bW1hcF9oZGw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGFkLT5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9PSAwKSB7CisJCQlwcl9lcnIoIkRUU19FQUdMRV9BU00gLSAlczogbWVtIG1hcCBoYW5kbGUgbm90IGZvdW5kXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwkJLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKwkJaWYgKHNpemUgPiAoVUlOVF9NQVggLSBBUFJfQ01EX09CX0hEUl9TWikpCisJCQlyYyA9IC1FSU5WQUw7CisJCWlmICgocmMgPCAwKSB8fCAoc2l6ZSArIEFQUl9DTURfT0JfSERSX1NaID4gcG8tPnNpemUpKSB7CisJCQlwcl9lcnIoIkRUU19FQUdMRV9BU00gLSAlczogaW9uIGFsbG9jIG9mIHNpemUgJXp1IHRvbyBzbWFsbCBmb3Igc2l6ZSByZXF1ZXN0ZWQgJXVcbiIsCisJCQkJX19mdW5jX18sIHBvLT5zaXplLCBzaXplICsgQVBSX0NNRF9PQl9IRFJfU1opOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCQlvYl9wYXJhbXMgPSAoaW50ICopcG8tPmt2YWRkcjsKKwkJKm9iX3BhcmFtcysrID0gbV9pZDsKKwkJKm9iX3BhcmFtcysrID0gcGFyYW1faWQ7CisJCSpvYl9wYXJhbXMrKyA9IHNpemU7CisJCWdlbmVyaWNfZ2V0X2RhdGEtPmlzX2luYmFuZCA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIkRUU19FQUdMRV9BU00gLSAlczogdXNpbmcgaW4gYmFuZFxuIiwgX19mdW5jX18pOworCQlnZW5lcmljX2dldF9kYXRhLT5pc19pbmJhbmQgPSAxOworCX0KKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKWFkKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0FTTSAtICVzOiBDb21tbWFuZCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18sCisJCQlhZC0+aGRyLm9wY29kZSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgMSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIkRUU19FQUdMRV9BU00gLSAlczogdGltZW91dCBpbiBnZXRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGdlbmVyaWNfZ2V0X2RhdGEtPnZhbGlkKSB7CisJCXJjID0gMDsKKwkJbWVtY3B5KGRhdGEsIHBvID8gb2JfcGFyYW1zIDogZ2VuZXJpY19nZXRfZGF0YS0+aW50cywgc2l6ZSk7CisJfSBlbHNlIHsKKwkJcmMgPSAtRUlOVkFMOworCQlwcl9lcnIoIkRUU19FQUdMRV9BU00gLSAlczogRUFHTEUgZ2V0IHBhcmFtcyBwcm9ibGVtIGdldHRpbmcgZGF0YSAtIGNoZWNrIGNhbGxiYWNrIGVycm9yIHZhbHVlXG4iLAorCQkJX19mdW5jX18pOworCX0KK2ZhaWxfY21kOgorCWtmcmVlKGFkKTsKKwlrZnJlZShnZW5lcmljX2dldF9kYXRhKTsKKwlnZW5lcmljX2dldF9kYXRhID0gTlVMTDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9zZXRfdm9sdW1lKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgdm9sdW1lLCBpbnQgaW5zdGFuY2UpCit7CisJc3RydWN0IGFzbV92b2x1bWVfY3RybF9tYXN0ZXJfZ2FpbiB2b2w7CisJaW50IHN6ID0gMDsKKwlpbnQgcmMgID0gMDsKKwlpbnQgbW9kdWxlX2lkOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UpIHsKKwljYXNlIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzI6CisJCW1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfVk9MX0NUUkwyOworCQlicmVhazsKKwljYXNlIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzE6CisJZGVmYXVsdDoKKwkJbW9kdWxlX2lkID0gQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKKwkJYnJlYWs7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IGFzbV92b2x1bWVfY3RybF9tYXN0ZXJfZ2Fpbik7CisJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnZvbC5oZHIsIHN6LCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisJdm9sLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOworCXZvbC5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOworCXZvbC5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOworCXZvbC5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7CisJdm9sLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKHZvbCkgLQorCQlzaXplb2Yodm9sLmhkcikgLSBzaXplb2Yodm9sLnBhcmFtKTsKKwl2b2wuZGF0YS5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJdm9sLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU47CisJdm9sLmRhdGEucGFyYW1fc2l6ZSA9IHZvbC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSAtIHNpemVvZih2b2wuZGF0YSk7CisJdm9sLmRhdGEucmVzZXJ2ZWQgPSAwOworCXZvbC5tYXN0ZXJfZ2FpbiA9IHZvbHVtZTsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmdm9sKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdm9sLmRhdGEucGFyYW1faWQsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCQl2b2wuZGF0YS5wYXJhbV9pZCk7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXSBzZXQtcGFyYW1zIHBhcmFtaWRbMHgleF1cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSksCisJCQkJdm9sLmRhdGEucGFyYW1faWQpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9zZXRfdm9sdW1lKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgdm9sdW1lKQoreworCXJldHVybiBfX3E2YXNtX3NldF92b2x1bWUoYWMsIHZvbHVtZSwgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMSk7Cit9CisKK2ludCBxNmFzbV9zZXRfdm9sdW1lX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgdm9sdW1lLCBpbnQgaW5zdGFuY2UpCit7CisJcmV0dXJuIF9fcTZhc21fc2V0X3ZvbHVtZShhYywgdm9sdW1lLCBpbnN0YW5jZSk7Cit9CisKK2ludCBxNmFzbV9zZXRfc29mdHBhdXNlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQkJc3RydWN0IGFzbV9zb2Z0cGF1c2VfcGFyYW1zICpwYXVzZV9wYXJhbSkKK3sKKwlzdHJ1Y3QgYXNtX3NvZnRfcGF1c2VfcGFyYW1zIHNvZnRwYXVzZTsKKwlpbnQgc3ogPSAwOworCWludCByYyAgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fc29mdF9wYXVzZV9wYXJhbXMpOworCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZzb2Z0cGF1c2UuaGRyLCBzeiwgVFJVRSk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCXNvZnRwYXVzZS5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKKworCXNvZnRwYXVzZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOworCXNvZnRwYXVzZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOworCXNvZnRwYXVzZS5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7CisJc29mdHBhdXNlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKHNvZnRwYXVzZSkgLQorCQlzaXplb2Yoc29mdHBhdXNlLmhkcikgLSBzaXplb2Yoc29mdHBhdXNlLnBhcmFtKTsKKwlzb2Z0cGF1c2UuZGF0YS5tb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOworCXNvZnRwYXVzZS5kYXRhLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX1NPRlRfUEFVU0VfUEFSQU1FVEVSUzsKKwlzb2Z0cGF1c2UuZGF0YS5wYXJhbV9zaXplID0gc29mdHBhdXNlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplIC0KKwkJc2l6ZW9mKHNvZnRwYXVzZS5kYXRhKTsKKwlzb2Z0cGF1c2UuZGF0YS5yZXNlcnZlZCA9IDA7CisJc29mdHBhdXNlLmVuYWJsZV9mbGFnID0gcGF1c2VfcGFyYW0tPmVuYWJsZTsKKwlzb2Z0cGF1c2UucGVyaW9kID0gcGF1c2VfcGFyYW0tPnBlcmlvZDsKKwlzb2Z0cGF1c2Uuc3RlcCA9IHBhdXNlX3BhcmFtLT5zdGVwOworCXNvZnRwYXVzZS5yYW1waW5nX2N1cnZlID0gcGF1c2VfcGFyYW0tPnJhbXBpbmdjdXJ2ZTsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmc29mdHBhdXNlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc29mdHBhdXNlLmRhdGEucGFyYW1faWQsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCXNvZnRwYXVzZS5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSwKKwkJCQlzb2Z0cGF1c2UuZGF0YS5wYXJhbV9pZCk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9zZXRfc29mdHZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCQkgIHN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgKnNvZnR2b2xfcGFyYW0sCisJCQkJICBpbnQgaW5zdGFuY2UpCit7CisJc3RydWN0IGFzbV9zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyBzb2Z0dm9sOworCWludCBzeiA9IDA7CisJaW50IHJjICA9IDA7CisJaW50IG1vZHVsZV9pZDsKKworCWlmIChhYyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlzd2l0Y2ggKGluc3RhbmNlKSB7CisJY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yOgorCQltb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKKwkJYnJlYWs7CisJY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xOgorCWRlZmF1bHQ6CisJCW1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfVk9MX0NUUkw7CisJCWJyZWFrOworCX0KKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fc29mdF9zdGVwX3ZvbHVtZV9wYXJhbXMpOworCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZzb2Z0dm9sLmhkciwgc3osIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwlzb2Z0dm9sLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOworCXNvZnR2b2wucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwlzb2Z0dm9sLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7CisJc29mdHZvbC5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7CisJc29mdHZvbC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZihzb2Z0dm9sKSAtCisJCXNpemVvZihzb2Z0dm9sLmhkcikgLSBzaXplb2Yoc29mdHZvbC5wYXJhbSk7CisJc29mdHZvbC5kYXRhLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKKwlzb2Z0dm9sLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUzsKKwlzb2Z0dm9sLmRhdGEucGFyYW1fc2l6ZSA9IHNvZnR2b2wucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQorCQlzaXplb2Yoc29mdHZvbC5kYXRhKTsKKwlzb2Z0dm9sLmRhdGEucmVzZXJ2ZWQgPSAwOworCXNvZnR2b2wucGVyaW9kID0gc29mdHZvbF9wYXJhbS0+cGVyaW9kOworCXNvZnR2b2wuc3RlcCA9IHNvZnR2b2xfcGFyYW0tPnN0ZXA7CisJc29mdHZvbC5yYW1waW5nX2N1cnZlID0gc29mdHZvbF9wYXJhbS0+cmFtcGluZ2N1cnZlOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZzb2Z0dm9sKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc29mdHZvbC5kYXRhLnBhcmFtX2lkLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCisJCQkJCQlzb2Z0dm9sLmRhdGEucGFyYW1faWQpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpLAorCQkJCXNvZnR2b2wuZGF0YS5wYXJhbV9pZCk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlyYyA9IDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9zZXRfc29mdHZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKKwkJCSBzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zICpzb2Z0dm9sX3BhcmFtKQoreworCXJldHVybiBfX3E2YXNtX3NldF9zb2Z0dm9sdW1lKGFjLCBzb2Z0dm9sX3BhcmFtLAorCQkJCSAgICAgIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzEpOworfQorCitpbnQgcTZhc21fc2V0X3NvZnR2b2x1bWVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkgICAgc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyAqc29mdHZvbF9wYXJhbSwKKwkJCSAgICBpbnQgaW5zdGFuY2UpCit7CisJcmV0dXJuIF9fcTZhc21fc2V0X3NvZnR2b2x1bWUoYWMsIHNvZnR2b2xfcGFyYW0sIGluc3RhbmNlKTsKK30KKworaW50IHE2YXNtX2VxdWFsaXplcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqZXFfcCkKK3sKKwlzdHJ1Y3QgYXNtX2VxX3BhcmFtcyBlcTsKKwlzdHJ1Y3QgbXNtX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcgKmVxX3BhcmFtcyA9IE5VTEw7CisJaW50IGkgID0gMDsKKwlpbnQgc3ogPSAwOworCWludCByYyAgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWlmIChlcV9wID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogWyVkXTogSW52YWxpZCBFcSBwYXJhbVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX2VxX3BhcmFtcyk7CisJZXFfcGFyYW1zID0gKHN0cnVjdCBtc21fYXVkaW9fZXFfc3RyZWFtX2NvbmZpZyAqKSBlcV9wOworCXE2YXNtX2FkZF9oZHIoYWMsICZlcS5oZHIsIHN6LCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwllcS5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKKwllcS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOworCWVxLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7CisJZXEucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOworCWVxLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKGVxKSAtCisJCXNpemVvZihlcS5oZHIpIC0gc2l6ZW9mKGVxLnBhcmFtKTsKKwllcS5kYXRhLm1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfRVFVQUxJWkVSOworCWVxLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRVFVQUxJWkVSX1BBUkFNRVRFUlM7CisJZXEuZGF0YS5wYXJhbV9zaXplID0gZXEucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLSBzaXplb2YoZXEuZGF0YSk7CisJZXEuZW5hYmxlX2ZsYWcgPSBlcV9wYXJhbXMtPmVuYWJsZTsKKwllcS5udW1fYmFuZHMgPSBlcV9wYXJhbXMtPm51bV9iYW5kczsKKworCXByX2RlYnVnKCIlczogZW5hYmxlOiVkIG51bWJhbmRzOiVkXG4iLCBfX2Z1bmNfXywgZXFfcGFyYW1zLT5lbmFibGUsCisJCQllcV9wYXJhbXMtPm51bV9iYW5kcyk7CisJZm9yIChpID0gMDsgaSA8IGVxX3BhcmFtcy0+bnVtX2JhbmRzOyBpKyspIHsKKwkJZXEuZXFfYmFuZHNbaV0uYmFuZF9pZHggPQorCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5iYW5kX2lkeDsKKwkJZXEuZXFfYmFuZHNbaV0uZmlsdGVyeXBlID0KKwkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uZmlsdGVyX3R5cGU7CisJCWVxLmVxX2JhbmRzW2ldLmNlbnRlcl9mcmVxX2h6ID0KKwkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uY2VudGVyX2ZyZXFfaHo7CisJCWVxLmVxX2JhbmRzW2ldLmZpbHRlcl9nYWluID0KKwkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uZmlsdGVyX2dhaW47CisJCWVxLmVxX2JhbmRzW2ldLnFfZmFjdG9yID0KKwkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0ucV9mYWN0b3I7CisJCXByX2RlYnVnKCIlczogZmlsdGVyX3R5cGU6JXUgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCisJCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5maWx0ZXJfdHlwZSwgaSk7CisJCXByX2RlYnVnKCIlczogY2VudGVyX2ZyZXFfaHo6JXUgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCisJCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5jZW50ZXJfZnJlcV9oeiwgaSk7CisJCXByX2RlYnVnKCIlczogZmlsdGVyX2dhaW46JWQgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCisJCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5maWx0ZXJfZ2FpbiwgaSk7CisJCXByX2RlYnVnKCIlczogcV9mYWN0b3I6JWQgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCisJCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5xX2ZhY3RvciwgaSk7CisJfQorCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSZlcSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkIHBhcmFtaWRbMHgleF0gcmMgJWRcbiIsCisJCQkJX19mdW5jX18sIGVxLmRhdGEucGFyYW1faWQsIHJjKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJCQkJCWVxLmRhdGEucGFyYW1faWQpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpLAorCQkJCWVxLmRhdGEucGFyYW1faWQpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fcTZhc21fcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgYm9vbCBpc19jdXN0b21fbGVuX3JlcWQsCisJCQlpbnQgbGVuKQoreworCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVhZF92MiByZWFkOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKKwlpbnQgZHNwX2J1ZjsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKKwlpbnQgcmM7CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlwb3J0ID0gJmFjLT5wb3J0W09VVF07CisKKwkJcTZhc21fYWRkX2hkcihhYywgJnJlYWQuaGRyLCBzaXplb2YocmVhZCksIEZBTFNFKTsKKworCQltdXRleF9sb2NrKCZwb3J0LT5sb2NrKTsKKworCQlkc3BfYnVmID0gcG9ydC0+ZHNwX2J1ZjsKKwkJaWYgKHBvcnQtPmJ1ZiA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBidWYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWFiID0gJnBvcnQtPmJ1Zltkc3BfYnVmXTsKKworCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdZHNwLWJ1ZlslZF1bJXBLXWNwdV9idWZbJWRdWyVwS11cbiIsCisJCQkJX19mdW5jX18sCisJCQkJYWMtPnNlc3Npb24sCisJCQkJZHNwX2J1ZiwKKwkJCQlwb3J0LT5idWZbZHNwX2J1Zl0uZGF0YSwKKwkJCQlwb3J0LT5jcHVfYnVmLAorCQkJCSZwb3J0LT5idWZbcG9ydC0+Y3B1X2J1Zl0ucGh5cyk7CisKKwkJcmVhZC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX1JFQURfVjI7CisJCXJlYWQuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhhYi0+cGh5cyk7CisJCXJlYWQuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYWItPnBoeXMpOworCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtPVVRdLm1lbV9tYXBfaGFuZGxlKSB7CisJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBhYi0+cGh5cykKKwkJCQlyZWFkLm1lbV9tYXBfaGFuZGxlID0gYnVmX25vZGUtPm1tYXBfaGRsOworCQl9CisJCWRldl92ZGJnKGFjLT5kZXYsICJtZW1vcnlfbWFwIGhhbmRsZSBpbiBxNmFzbV9yZWFkOiBbJTB4XToiLAorCQkJCXJlYWQubWVtX21hcF9oYW5kbGUpOworCQlyZWFkLmJ1Zl9zaXplID0gaXNfY3VzdG9tX2xlbl9yZXFkID8gbGVuIDogYWItPnNpemU7CisJCXJlYWQuc2VxX2lkID0gcG9ydC0+ZHNwX2J1ZjsKKwkJcTZhc21fdXBkYXRlX3Rva2VuKCZyZWFkLmhkci50b2tlbiwKKwkJCQkgICAwLCAvKiBTZXNzaW9uIElEIGlzIE5BICovCisJCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCisJCQkJICAgcG9ydC0+ZHNwX2J1ZiwKKwkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLworCQkJCSAgIFdBSVRfQ01EKTsKKwkJcG9ydC0+ZHNwX2J1ZiA9IHE2YXNtX2dldF9uZXh0X2J1ZihhYywgcG9ydC0+ZHNwX2J1ZiwKKwkJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBidWYgYWRkWyVwS10gdG9rZW5bMHgleF0gdWlkWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgJmFiLT5waHlzLCByZWFkLmhkci50b2tlbiwKKwkJCQlyZWFkLnNlcV9pZCk7CisJCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmcmVhZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IHJlYWQgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJCV9fZnVuY19fLCByZWFkLmhkci5vcGNvZGUsIHJjKTsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorZmFpbF9jbWQ6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBxNmFzbV9yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXJldHVybiBfX3E2YXNtX3JlYWQoYWMsIGZhbHNlLyppc19jdXN0b21fbGVuX3JlcWQqLywgMCk7Cit9CitpbnQgcTZhc21fcmVhZF92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbGVuKQoreworCXJldHVybiBfX3E2YXNtX3JlYWQoYWMsIHRydWUgLyppc19jdXN0b21fbGVuX3JlcWQqLywgbGVuKTsKK30KKworaW50IHE2YXNtX3JlYWRfbm9sb2NrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVhZF92MiByZWFkOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKKwlpbnQgZHNwX2J1ZjsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKKwlpbnQgcmM7CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgeworCQlwb3J0ID0gJmFjLT5wb3J0W09VVF07CisKKwkJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnJlYWQuaGRyLCBzaXplb2YocmVhZCksIEZBTFNFKTsKKworCisJCWRzcF9idWYgPSBwb3J0LT5kc3BfYnVmOworCQlhYiA9ICZwb3J0LT5idWZbZHNwX2J1Zl07CisKKwkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXWRzcC1idWZbJWRdWyVwS11jcHVfYnVmWyVkXVslcEtdXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCWFjLT5zZXNzaW9uLAorCQkJCWRzcF9idWYsCisJCQkJcG9ydC0+YnVmW2RzcF9idWZdLmRhdGEsCisJCQkJcG9ydC0+Y3B1X2J1ZiwKKwkJCQkmcG9ydC0+YnVmW3BvcnQtPmNwdV9idWZdLnBoeXMpOworCisJCXJlYWQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9SRUFEX1YyOworCQlyZWFkLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYWItPnBoeXMpOworCQlyZWFkLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGFiLT5waHlzKTsKKwkJcmVhZC5idWZfc2l6ZSA9IGFiLT5zaXplOworCQlyZWFkLnNlcV9pZCA9IHBvcnQtPmRzcF9idWY7CisJCXE2YXNtX3VwZGF0ZV90b2tlbigmcmVhZC5oZHIudG9rZW4sCisJCQkJICAgMCwgLyogU2Vzc2lvbiBJRCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLworCQkJCSAgIHBvcnQtPmRzcF9idWYsCisJCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KKwkJCQkgICBXQUlUX0NNRCk7CisKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmFjLT5wb3J0W09VVF0ubWVtX21hcF9oYW5kbGUpIHsKKwkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJCWxpc3QpOworCQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGFiLT5waHlzKSB7CisJCQkJcmVhZC5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXBvcnQtPmRzcF9idWYgPSBxNmFzbV9nZXRfbmV4dF9idWYoYWMsIHBvcnQtPmRzcF9idWYsCisJCQkJCQkgICBwb3J0LT5tYXhfYnVmX2NudCk7CisJCWRldl92ZGJnKGFjLT5kZXYsICIlczogYnVmIGFkZFslcEtdIHRva2VuWzB4JXhdIHVpZFslZF1cbiIsCisJCQkJX19mdW5jX18sICZhYi0+cGh5cywgcmVhZC5oZHIudG9rZW4sCisJCQkJcmVhZC5zZXFfaWQpOworCQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnJlYWQpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiByZWFkIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkJCQlfX2Z1bmNfXywgcmVhZC5oZHIub3Bjb2RlLCByYyk7CisJCQlnb3RvIGZhaWxfY21kOworCQl9CisJCXJldHVybiAwOworCX0KK2ZhaWxfY21kOgorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgcTZhc21fYXN5bmNfd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSAqcGFyYW0pCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYXNtX2RhdGFfY21kX3dyaXRlX3YyIHdyaXRlOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKKwlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKKwlwaHlzX2FkZHJfdCBsYnVmX3BoeXNfYWRkcjsKKwl1MzIgbGlvbW9kZTsKKwl1MzIgaW9fY29tcHJlc3NlZDsKKwl1MzIgaW9fY29tcHJlc3NlZF9zdHJlYW07CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXE2YXNtX3N0cmVhbV9hZGRfaGRyX2FzeW5jKAorCQkJYWMsICZ3cml0ZS5oZHIsIHNpemVvZih3cml0ZSksIEZBTFNFLCBhYy0+c3RyZWFtX2lkKTsKKwlwb3J0ID0gJmFjLT5wb3J0W0lOXTsKKwlhYiA9ICZwb3J0LT5idWZbcG9ydC0+ZHNwX2J1Zl07CisKKwkvKiBQYXNzIHNlc3Npb24gaWQgYXMgdG9rZW4gZm9yIEFJTyBzY2hlbWUgKi8KKwl3cml0ZS5oZHIudG9rZW4gPSBwYXJhbS0+dWlkOworCXdyaXRlLmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfV1JJVEVfVjI7CisJd3JpdGUuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhwYXJhbS0+cGFkZHIpOworCXdyaXRlLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKHBhcmFtLT5wYWRkcik7CisJd3JpdGUuYnVmX3NpemUgPSBwYXJhbS0+bGVuOworCXdyaXRlLnRpbWVzdGFtcF9tc3cgPSBwYXJhbS0+bXN3X3RzOworCXdyaXRlLnRpbWVzdGFtcF9sc3cgPSBwYXJhbS0+bHN3X3RzOworCWxpb21vZGUgPSAoQVNZTkNfSU9fTU9ERSB8IE5UX01PREUpOworCWlvX2NvbXByZXNzZWQgPSAoQVNZTkNfSU9fTU9ERSB8IENPTVBSRVNTRURfSU8pOworCWlvX2NvbXByZXNzZWRfc3RyZWFtID0gKEFTWU5DX0lPX01PREUgfCBDT01QUkVTU0VEX1NUUkVBTV9JTyk7CisKKwlpZiAoYWMtPmlvX21vZGUgPT0gbGlvbW9kZSkKKwkJbGJ1Zl9waHlzX2FkZHIgPSAocGFyYW0tPnBhZGRyIC0gMzIpOworCWVsc2UgaWYgKGFjLT5pb19tb2RlID09IGlvX2NvbXByZXNzZWQgfHwKKwkJCWFjLT5pb19tb2RlID09IGlvX2NvbXByZXNzZWRfc3RyZWFtKQorCQlsYnVmX3BoeXNfYWRkciA9IChwYXJhbS0+cGFkZHIgLSBwYXJhbS0+bWV0YWRhdGFfbGVuKTsKKwllbHNlCisJCWxidWZfcGh5c19hZGRyID0gcGFyYW0tPnBhZGRyOworCisJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiB0b2tlblsweCV4XSwgYnVmX2FkZHJbJXBLXSwgYnVmX3NpemVbMHgleF0sIHRzX21zd1sweCV4XSwgdHNfbHN3WzB4JXhdLCBsYnVmX3BoeXNfYWRkcjogMHhbJXBLXVxuIiwKKwkJCV9fZnVuY19fLAorCQkJd3JpdGUuaGRyLnRva2VuLCAmcGFyYW0tPnBhZGRyLAorCQkJd3JpdGUuYnVmX3NpemUsIHdyaXRlLnRpbWVzdGFtcF9tc3csCisJCQl3cml0ZS50aW1lc3RhbXBfbHN3LCAmbGJ1Zl9waHlzX2FkZHIpOworCisJLyogVXNlIDB4RkYwMCBmb3IgZGlzYWJsaW5nIHRpbWVzdGFtcHMgKi8KKwlpZiAocGFyYW0tPmZsYWdzID09IDB4RkYwMCkKKwkJd3JpdGUuZmxhZ3MgPSAoMHgwMDAwMDAwMCB8IChwYXJhbS0+ZmxhZ3MgJiAweDgwMDAwMEZGKSk7CisJZWxzZQorCQl3cml0ZS5mbGFncyA9ICgweDgwMDAwMDAwIHwgcGFyYW0tPmZsYWdzKTsKKwl3cml0ZS5mbGFncyB8PSBwYXJhbS0+bGFzdF9idWZmZXIgPDwgQVNNX1NISUZUX0xBU1RfQlVGRkVSX0ZMQUc7CisJd3JpdGUuc2VxX2lkID0gcGFyYW0tPnVpZDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYWMtPnBvcnRbSU5dLm1lbV9tYXBfaGFuZGxlKSB7CisJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCisJCQkJbGlzdCk7CisJCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBsYnVmX3BoeXNfYWRkcikgeworCQkJd3JpdGUubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmd3JpdGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogd3JpdGUgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAorCQkJCXdyaXRlLmhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHE2YXNtX2FzeW5jX3JlYWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCisJCQkJCSAgc3RydWN0IGF1ZGlvX2Fpb19yZWFkX3BhcmFtICpwYXJhbSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVhZF92MiByZWFkOworCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OworCXBoeXNfYWRkcl90IGxidWZfcGh5c19hZGRyOworCXUzMiBsaW9tb2RlOworCXUzMiBpb19jb21wcmVzc2VkOworCWludCBkaXIgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmcmVhZC5oZHIsIHNpemVvZihyZWFkKSwgRkFMU0UpOworCisJLyogUGFzcyBzZXNzaW9uIGlkIGFzIHRva2VuIGZvciBBSU8gc2NoZW1lICovCisJcmVhZC5oZHIudG9rZW4gPSBwYXJhbS0+dWlkOworCXJlYWQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9SRUFEX1YyOworCXJlYWQuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhwYXJhbS0+cGFkZHIpOworCXJlYWQuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMocGFyYW0tPnBhZGRyKTsKKwlyZWFkLmJ1Zl9zaXplID0gcGFyYW0tPmxlbjsKKwlyZWFkLnNlcV9pZCA9IHBhcmFtLT51aWQ7CisJbGlvbW9kZSA9IChOVF9NT0RFIHwgQVNZTkNfSU9fTU9ERSk7CisJaW9fY29tcHJlc3NlZCA9IChBU1lOQ19JT19NT0RFIHwgQ09NUFJFU1NFRF9JTyk7CisJaWYgKGFjLT5pb19tb2RlID09IGxpb21vZGUpIHsKKwkJbGJ1Zl9waHlzX2FkZHIgPSAocGFyYW0tPnBhZGRyIC0gMzIpOworCQkvKmxlZ2FjeSB3bWEgZHJpdmVyIGNhc2UqLworCQlkaXIgPSBJTjsKKwl9IGVsc2UgaWYgKGFjLT5pb19tb2RlID09IGlvX2NvbXByZXNzZWQpIHsKKwkJbGJ1Zl9waHlzX2FkZHIgPSAocGFyYW0tPnBhZGRyIC0gNjQpOworCQlkaXIgPSBPVVQ7CisJfSBlbHNlIHsKKwkJaWYgKHBhcmFtLT5mbGFncyAmIENPTVBSRVNTRURfVElNRVNUQU1QX0ZMQUcpCisJCQlsYnVmX3BoeXNfYWRkciA9IHBhcmFtLT5wYWRkciAtCisJCQkJIHNpemVvZihzdHJ1Y3Qgc25kX2NvZGVjX21ldGFkYXRhKTsKKwkJZWxzZQorCQkJbGJ1Zl9waHlzX2FkZHIgPSBwYXJhbS0+cGFkZHI7CisJCWRpciA9IE9VVDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYWMtPnBvcnRbZGlyXS5tZW1fbWFwX2hhbmRsZSkgeworCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAorCQkJCWxpc3QpOworCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gbGJ1Zl9waHlzX2FkZHIpIHsKKwkJCXJlYWQubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmcmVhZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiByZWFkIG9wWzB4JXhdcmNbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlyZWFkLmhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHE2YXNtX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IG1zd190cywKKwkJdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBmbGFncykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhc21fZGF0YV9jbWRfd3JpdGVfdjIgd3JpdGU7CisJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAgICAqYWI7CisJaW50IGRzcF9idWYgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdIGxlbj0lZFxuIiwKKwkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgbGVuKTsKKwlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKKwkJcG9ydCA9ICZhYy0+cG9ydFtJTl07CisKKwkJcTZhc21fYWRkX2hkcihhYywgJndyaXRlLmhkciwgc2l6ZW9mKHdyaXRlKSwKKwkJCQlGQUxTRSk7CisJCW11dGV4X2xvY2soJnBvcnQtPmxvY2spOworCisJCWRzcF9idWYgPSBwb3J0LT5kc3BfYnVmOworCQlhYiA9ICZwb3J0LT5idWZbZHNwX2J1Zl07CisKKwkJcTZhc21fdXBkYXRlX3Rva2VuKCZ3cml0ZS5oZHIudG9rZW4sCisJCQkJICAgMCwgLyogU2Vzc2lvbiBJRCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLworCQkJCSAgIHBvcnQtPmRzcF9idWYsCisJCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KKwkJCQkgICBXQUlUX0NNRCk7CisJCXdyaXRlLmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfV1JJVEVfVjI7CisJCXdyaXRlLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYWItPnBoeXMpOworCQl3cml0ZS5idWZfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhhYi0+cGh5cyk7CisJCXdyaXRlLmJ1Zl9zaXplID0gbGVuOworCQl3cml0ZS5zZXFfaWQgPSBwb3J0LT5kc3BfYnVmOworCQl3cml0ZS50aW1lc3RhbXBfbHN3ID0gbHN3X3RzOworCQl3cml0ZS50aW1lc3RhbXBfbXN3ID0gbXN3X3RzOworCQkvKiBVc2UgMHhGRjAwIGZvciBkaXNhYmxpbmcgdGltZXN0YW1wcyAqLworCQlpZiAoZmxhZ3MgPT0gMHhGRjAwKQorCQkJd3JpdGUuZmxhZ3MgPSAoMHgwMDAwMDAwMCB8IChmbGFncyAmIDB4ODAwMDAwRkYpKTsKKwkJZWxzZQorCQkJd3JpdGUuZmxhZ3MgPSAoMHg4MDAwMDAwMCB8IGZsYWdzKTsKKwkJcG9ydC0+ZHNwX2J1ZiA9IHE2YXNtX2dldF9uZXh0X2J1ZihhYywgcG9ydC0+ZHNwX2J1ZiwKKwkJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKKwkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhYy0+cG9ydFtJTl0ubWVtX21hcF9oYW5kbGUsCisJCQkJc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKKwkJCQlsaXN0KTsKKwkJd3JpdGUubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7CisKKwkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBhYi0+cGh5c1slcEtdYnVmYWRkWzB4JXhdIHRva2VuWzB4JXhdYnVmX2lkWzB4JXhdYnVmX3NpemVbMHgleF1tbWFwaGRsWzB4JXhdIgorCQkJCSwgX19mdW5jX18sCisJCQkJJmFiLT5waHlzLAorCQkJCXdyaXRlLmJ1Zl9hZGRyX2xzdywKKwkJCQl3cml0ZS5oZHIudG9rZW4sCisJCQkJd3JpdGUuc2VxX2lkLAorCQkJCXdyaXRlLmJ1Zl9zaXplLAorCQkJCXdyaXRlLm1lbV9tYXBfaGFuZGxlKTsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKKworCQljb25maWdfZGVidWdfZnNfd3JpdGUoYWIpOworCisJCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmd3JpdGUpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiB3cml0ZSBvcFsweCV4XXJjWyVkXVxuIiwKKwkJCQkJX19mdW5jX18sIHdyaXRlLmhkci5vcGNvZGUsIHJjKTsKKwkJCWdvdG8gZmFpbF9jbWQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorZmFpbF9jbWQ6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBxNmFzbV93cml0ZV9ub2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGxlbiwgdWludDMyX3QgbXN3X3RzLAorCQkJdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBmbGFncykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhc21fZGF0YV9jbWRfd3JpdGVfdjIgd3JpdGU7CisJc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7CisJc3RydWN0IGF1ZGlvX2J1ZmZlciAgICAqYWI7CisJaW50IGRzcF9idWYgPSAwOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdIGxlbj0lZFxuIiwKKwkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgbGVuKTsKKwlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKKwkJcG9ydCA9ICZhYy0+cG9ydFtJTl07CisKKwkJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJndyaXRlLmhkciwgc2l6ZW9mKHdyaXRlKSwKKwkJCQlGQUxTRSk7CisKKwkJZHNwX2J1ZiA9IHBvcnQtPmRzcF9idWY7CisJCWFiID0gJnBvcnQtPmJ1Zltkc3BfYnVmXTsKKworCQlxNmFzbV91cGRhdGVfdG9rZW4oJndyaXRlLmhkci50b2tlbiwKKwkJCQkgICAwLCAvKiBTZXNzaW9uIElEIGlzIE5BICovCisJCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCisJCQkJICAgcG9ydC0+ZHNwX2J1ZiwKKwkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLworCQkJCSAgIFdBSVRfQ01EKTsKKworCQl3cml0ZS5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX1dSSVRFX1YyOworCQl3cml0ZS5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGFiLT5waHlzKTsKKwkJd3JpdGUuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYWItPnBoeXMpOworCQl3cml0ZS5idWZfc2l6ZSA9IGxlbjsKKwkJd3JpdGUuc2VxX2lkID0gcG9ydC0+ZHNwX2J1ZjsKKwkJd3JpdGUudGltZXN0YW1wX2xzdyA9IGxzd190czsKKwkJd3JpdGUudGltZXN0YW1wX21zdyA9IG1zd190czsKKwkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhYy0+cG9ydFtJTl0ubWVtX21hcF9oYW5kbGUsCisJCQkJc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKKwkJCQlsaXN0KTsKKwkJd3JpdGUubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7CisJCS8qIFVzZSAweEZGMDAgZm9yIGRpc2FibGluZyB0aW1lc3RhbXBzICovCisJCWlmIChmbGFncyA9PSAweEZGMDApCisJCQl3cml0ZS5mbGFncyA9ICgweDAwMDAwMDAwIHwgKGZsYWdzICYgMHg4MDAwMDBGRikpOworCQllbHNlCisJCQl3cml0ZS5mbGFncyA9ICgweDgwMDAwMDAwIHwgZmxhZ3MpOworCQlwb3J0LT5kc3BfYnVmID0gcTZhc21fZ2V0X25leHRfYnVmKGFjLCBwb3J0LT5kc3BfYnVmLAorCQkJCQkJICAgcG9ydC0+bWF4X2J1Zl9jbnQpOworCisJCWRldl92ZGJnKGFjLT5kZXYsICIlczogYWItPnBoeXNbJXBLXWJ1ZmFkZFsweCV4XXRva2VuWzB4JXhdIGJ1Zl9pZFsweCV4XWJ1Zl9zaXplWzB4JXhdbW1hcGhkbFsweCV4XSIKKwkJCQksIF9fZnVuY19fLAorCQkJCSZhYi0+cGh5cywKKwkJCQl3cml0ZS5idWZfYWRkcl9sc3csCisJCQkJd3JpdGUuaGRyLnRva2VuLAorCQkJCXdyaXRlLnNlcV9pZCwKKwkJCQl3cml0ZS5idWZfc2l6ZSwKKwkJCQl3cml0ZS5tZW1fbWFwX2hhbmRsZSk7CisKKwkJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZ3cml0ZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiJXM6IHdyaXRlIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkJCQlfX2Z1bmNfXywgd3JpdGUuaGRyLm9wY29kZSwgcmMpOworCQkJZ290byBmYWlsX2NtZDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CitmYWlsX2NtZDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHE2YXNtX2dldF9zZXNzaW9uX3RpbWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQ2NF90ICp0c3RhbXApCit7CisJc3RydWN0IGFzbV9tdG14X3N0cnRyX2dldF9wYXJhbXMgbXRteF9wYXJhbXM7CisJaW50IHJjOworCisJaWYgKGFjID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHRzdGFtcCA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHRzdGFtcCBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXE2YXNtX2FkZF9oZHIoYWMsICZtdG14X3BhcmFtcy5oZHIsIHNpemVvZihtdG14X3BhcmFtcyksIFRSVUUpOworCW10bXhfcGFyYW1zLmhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfR0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyOworCW10bXhfcGFyYW1zLnBhcmFtX2luZm8uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwltdG14X3BhcmFtcy5wYXJhbV9pbmZvLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7CisJbXRteF9wYXJhbXMucGFyYW1faW5mby5tZW1fbWFwX2hhbmRsZSA9IDA7CisJbXRteF9wYXJhbXMucGFyYW1faW5mby5kaXJlY3Rpb24gPSAoYWMtPmlvX21vZGUgJiBUVU5fUkVBRF9JT19NT0RFCisJCQkJCSAgICA/IDEgOiAwKTsKKwltdG14X3BhcmFtcy5wYXJhbV9pbmZvLm1vZHVsZV9pZCA9CisJCUFTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQzsKKwltdG14X3BhcmFtcy5wYXJhbV9pbmZvLnBhcmFtX2lkID0KKwkJQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9TRVNTSU9OX1RJTUVfVjM7CisJbXRteF9wYXJhbXMucGFyYW1faW5mby5wYXJhbV9tYXhfc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyKSArCisJCXNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9zZXNzaW9uX3RpbWVfdjNfdCk7CisJYXRvbWljX3NldCgmYWMtPnRpbWVfZmxhZywgMSk7CisKKwlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKKwkJIGFjLT5zZXNzaW9uLCBtdG14X3BhcmFtcy5oZHIub3Bjb2RlKTsKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm10bXhfcGFyYW1zKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1tYW5kIDB4JXggZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG10bXhfcGFyYW1zLmhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPnRpbWVfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPnRpbWVfZmxhZykgPT0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCBpbiBnZXR0aW5nIHNlc3Npb24gdGltZSBmcm9tIERTUFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJKnRzdGFtcCA9IGFjLT50aW1lX3N0YW1wOworCXJldHVybiAwOworCitmYWlsX2NtZDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHE2YXNtX2dldF9zZXNzaW9uX3RpbWVfbGVnYWN5KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50NjRfdCAqdHN0YW1wKQoreworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlpbnQgcmM7CisKKwlpZiAoYWMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodHN0YW1wID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdHN0YW1wIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcTZhc21fYWRkX2hkcihhYywgJmhkciwgc2l6ZW9mKGhkciksIFRSVUUpOworCWhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfR0VUX1NFU1NJT05USU1FX1YzOworCWF0b21pY19zZXQoJmFjLT50aW1lX2ZsYWcsIDEpOworCisJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXW9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQlhYy0+c2Vzc2lvbiwKKwkJCWhkci5vcGNvZGUpOworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmaGRyKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1tYW5kIDB4JXggZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT50aW1lX3dhaXQsCisJCQkoYXRvbWljX3JlYWQoJmFjLT50aW1lX2ZsYWcpID09IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQgaW4gZ2V0dGluZyBzZXNzaW9uIHRpbWUgZnJvbSBEU1BcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCSp0c3RhbXAgPSBhYy0+dGltZV9zdGFtcDsKKwlyZXR1cm4gMDsKKworZmFpbF9jbWQ6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworaW50IHE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGNoYXIgKnBhcmFtcywKKwkJCQkgICAgdWludDMyX3QgcGFyYW1zX2xlbmd0aCkKK3sKKwljaGFyICphc21fcGFyYW1zID0gTlVMTDsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGF5bG9hZF9wYXJhbXM7CisJaW50IHN6LCByYzsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwYXJhbXMgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBwYXJhbXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3ogPSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsKKwkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyKSArCisJCXBhcmFtc19sZW5ndGg7CisJYXNtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghYXNtX3BhcmFtcykgeworCQlwcl9lcnIoIiVzLCBhc20gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmaGRyLCAoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyKSArCisJCQkJcGFyYW1zX2xlbmd0aCksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwloZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKKwlwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOworCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7CisJcGF5bG9hZF9wYXJhbXMubWVtX21hcF9oYW5kbGUgPSAwOworCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9zaXplID0gcGFyYW1zX2xlbmd0aDsKKwltZW1jcHkoKCh1OCAqKWFzbV9wYXJhbXMpLCAmaGRyLCBzaXplb2Yoc3RydWN0IGFwcl9oZHIpKTsKKwltZW1jcHkoKCh1OCAqKWFzbV9wYXJhbXMgKyBzaXplb2Yoc3RydWN0IGFwcl9oZHIpKSwgJnBheWxvYWRfcGFyYW1zLAorCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyKSk7CisJbWVtY3B5KCgodTggKilhc21fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyKSksCisJCQlwYXJhbXMsIHBhcmFtc19sZW5ndGgpOworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSBhc21fcGFyYW1zKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGVmZmVjdHMgc2V0LXBhcmFtcyBzZW5kIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9zZW5kX3BhcmFtOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgMSpIWik7CisJaWYgKCFyYykgeworCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCBhdWRpbyBlZmZlY3RzIHNldC1wYXJhbXNcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfc2VuZF9wYXJhbTsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXSBzZXQtcGFyYW1zXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9zZW5kX3BhcmFtOworCX0KKworCXJjID0gMDsKK2ZhaWxfc2VuZF9wYXJhbToKKwlrZnJlZShhc21fcGFyYW1zKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9zZW5kX210bXhfc3RydHJfd2luZG93KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAorCQlzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV93aW5kb3dfdjJfdCAqd2luZG93X3BhcmFtLAorCQl1aW50MzJfdCBwYXJhbV9pZCkKK3sKKwlzdHJ1Y3QgYXNtX210bXhfc3RydHJfcGFyYW1zIG1hdHJpeDsKKwlpbnQgc3ogPSAwOworCWludCByYyAgPSAwOworCisJcHJfZGVidWcoIiVzOiBXaW5kb3cgbHN3IGlzICVkLCB3aW5kb3cgbXN3IGlzICVkXG4iLCBfX2Z1bmNfXywKKwkJICB3aW5kb3dfcGFyYW0tPndpbmRvd19sc3csIHdpbmRvd19wYXJhbS0+d2luZG93X21zdyk7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBoYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBhYy0+YXByIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX210bXhfc3RydHJfcGFyYW1zKTsKKwlxNmFzbV9hZGRfaGRyKGFjLCAmbWF0cml4Lmhkciwgc3osIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKwltYXRyaXguaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI7CisKKwltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKKwltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKKwltYXRyaXgucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOworCW1hdHJpeC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZihtYXRyaXgpIC0KKwkJCXNpemVvZihtYXRyaXguaGRyKSAtIHNpemVvZihtYXRyaXgucGFyYW0pOworCW1hdHJpeC5wYXJhbS5kaXJlY3Rpb24gPSAwOyAvKiBSWCAqLworCW1hdHJpeC5kYXRhLm1vZHVsZV9pZCA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQzsKKwltYXRyaXguZGF0YS5wYXJhbV9pZCA9IHBhcmFtX2lkOworCW1hdHJpeC5kYXRhLnBhcmFtX3NpemUgPSBtYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQorCQkJc2l6ZW9mKG1hdHJpeC5kYXRhKTsKKwltYXRyaXguZGF0YS5yZXNlcnZlZCA9IDA7CisJbWF0cml4LndpbmRvd19sc3cgPSB3aW5kb3dfcGFyYW0tPndpbmRvd19sc3c7CisJbWF0cml4LndpbmRvd19tc3cgPSB3aW5kb3dfcGFyYW0tPndpbmRvd19tc3c7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm1hdHJpeCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBSZW5kZXIgd2luZG93IHN0YXJ0IHNlbmQgZmFpbGVkIHBhcmFtaWQgWzB4JXhdXG4iLAorCQkJX19mdW5jX18sIG1hdHJpeC5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOworCWlmICghcmMpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dCwgUmVuZGVyIHdpbmRvdyBzdGFydCBwYXJhbWlkWzB4JXhdXG4iLAorCQkJX19mdW5jX18sIG1hdHJpeC5kYXRhLnBhcmFtX2lkKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOworCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSAwOworZmFpbF9jbWQ6CisJcmV0dXJuIHJjOworfTsKKworc3RhdGljIGludCBfX3E2YXNtX2NtZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCwgdWludDMyX3Qgc3RyZWFtX2lkKQoreworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlpbnQgcmM7CisJYXRvbWljX3QgKnN0YXRlOworCWludCBjbnQgPSAwOworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmhkciwgc2l6ZW9mKGhkciksIFRSVUUsIHN0cmVhbV9pZCk7CisJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOworCS8qCisJICogVXBkYXRlZCB0aGUgdG9rZW4gZmllbGQgd2l0aCBzdHJlYW0vc2Vzc2lvbiBmb3IgY29tcHJlc3NlZCBwbGF5YmFjaworCSAqIFBsYXRmb3JtIGRyaXZlciBtdXN0IGtub3cgdGhlIHRoZSBzdHJlYW0gd2l0aCB3aGljaCB0aGUgY29tbWFuZCBpcworCSAqIGFzc29jaWF0ZWQKKwkgKi8KKwlpZiAoYWMtPmlvX21vZGUgJiBDT01QUkVTU0VEX1NUUkVBTV9JTykKKwkJcTZhc21fdXBkYXRlX3Rva2VuKCZoZHIudG9rZW4sCisJCQkJICAgYWMtPnNlc3Npb24sCisJCQkJICAgc3RyZWFtX2lkLAorCQkJCSAgIDAsIC8qIEJ1ZmZlciBpbmRleCBpcyBOQSAqLworCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCisJCQkJICAgV0FJVF9DTUQpOworCXByX2RlYnVnKCIlczogdG9rZW4gPSAweCV4LCBzdHJlYW1faWQgICVkLCBzZXNzaW9uIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ01EX1BBVVNFOgorCQlwcl9kZWJ1ZygiJXM6IENNRF9QQVVTRVxuIiwgX19mdW5jX18pOworCQloZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1BBVVNFOworCQlzdGF0ZSA9ICZhYy0+Y21kX3N0YXRlOworCQlicmVhazsKKwljYXNlIENNRF9TVVNQRU5EOgorCQlwcl9kZWJ1ZygiJXM6IENNRF9TVVNQRU5EXG4iLCBfX2Z1bmNfXyk7CisJCWhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfU1VTUEVORDsKKwkJc3RhdGUgPSAmYWMtPmNtZF9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRkxVU0g6CisJCXByX2RlYnVnKCIlczogQ01EX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7CisJCWhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9GTFVTSDsKKwkJc3RhdGUgPSAmYWMtPmNtZF9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBDTURfT1VUX0ZMVVNIOgorCQlwcl9kZWJ1ZygiJXM6IENNRF9PVVRfRkxVU0hcbiIsIF9fZnVuY19fKTsKKwkJaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX0ZMVVNIX1JFQURCVUZTOworCQlzdGF0ZSA9ICZhYy0+Y21kX3N0YXRlOworCQlicmVhazsKKwljYXNlIENNRF9FT1M6CisJCXByX2RlYnVnKCIlczogQ01EX0VPU1xuIiwgX19mdW5jX18pOworCQloZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX0VPUzsKKwkJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMCk7CisJCXN0YXRlID0gJmFjLT5jbWRfc3RhdGU7CisJCWJyZWFrOworCWNhc2UgQ01EX0NMT1NFOgorCQlwcl9kZWJ1ZygiJXM6IENNRF9DTE9TRVxuIiwgX19mdW5jX18pOworCQloZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfQ0xPU0U7CisJCXN0YXRlID0gJmFjLT5jbWRfc3RhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0WyVkXVxuIiwgX19mdW5jX18sIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXW9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQlhYy0+c2Vzc2lvbiwKKwkJCWhkci5vcGNvZGUpOworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmaGRyKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1tYW5kIDB4JXggZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlLCByYyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LCAoYXRvbWljX3JlYWQoc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgcmVzcG9uc2Ugb3Bjb2RlWzB4JXhdXG4iLAorCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIG9wY29kZSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCQlhdG9taWNfcmVhZChzdGF0ZSkpLAorCQkJCQloZHIub3Bjb2RlKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKGF0b21pY19yZWFkKHN0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJaWYgKGNtZCA9PSBDTURfRkxVU0gpCisJCXE2YXNtX3Jlc2V0X2J1Zl9zdGF0ZShhYyk7CisJaWYgKGNtZCA9PSBDTURfQ0xPU0UpIHsKKwkJLyogY2hlY2sgaWYgRFNQIHJldHVybiBhbGwgYnVmZmVycyAqLworCQlpZiAoYWMtPnBvcnRbSU5dLmJ1ZikgeworCQkJZm9yIChjbnQgPSAwOyBjbnQgPCBhYy0+cG9ydFtJTl0ubWF4X2J1Zl9jbnQ7CisJCQkJCWNudCsrKSB7CisJCQkJaWYgKGFjLT5wb3J0W0lOXS5idWZbY250XS51c2VkID09IElOKSB7CisJCQkJCWRldl92ZGJnKGFjLT5kZXYsICJXcml0ZSBCdWZbJWRdIG5vdCByZXR1cm5lZFxuIiwKKwkJCQkJCQljbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYWMtPnBvcnRbT1VUXS5idWYpIHsKKwkJCWZvciAoY250ID0gMDsgY250IDwgYWMtPnBvcnRbT1VUXS5tYXhfYnVmX2NudDsgY250KyspIHsKKwkJCQlpZiAoYWMtPnBvcnRbT1VUXS5idWZbY250XS51c2VkID09IE9VVCkgeworCQkJCQlkZXZfdmRiZyhhYy0+ZGV2LCAiUmVhZCBCdWZbJWRdIG5vdCByZXR1cm5lZFxuIiwKKwkJCQkJCQljbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiByYzsKK30KKworaW50IHE2YXNtX2NtZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCkKK3sKKwlyZXR1cm4gX19xNmFzbV9jbWQoYWMsIGNtZCwgYWMtPnN0cmVhbV9pZCk7Cit9CisKK2ludCBxNmFzbV9zdHJlYW1fY21kKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kLCB1aW50MzJfdCBzdHJlYW1faWQpCit7CisJcmV0dXJuIF9fcTZhc21fY21kKGFjLCBjbWQsIHN0cmVhbV9pZCk7Cit9CisKK3N0YXRpYyBpbnQgX19xNmFzbV9jbWRfbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kLAorCQkJICAgICAgdWludDMyX3Qgc3RyZWFtX2lkKQoreworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlpbnQgcmM7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXE2YXNtX3N0cmVhbV9hZGRfaGRyX2FzeW5jKGFjLCAmaGRyLCBzaXplb2YoaGRyKSwgVFJVRSwgc3RyZWFtX2lkKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAxKTsKKwkvKgorCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKKwkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKKwkgKiBhc3NvY2lhdGVkCisJICovCisJaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCisJCXE2YXNtX3VwZGF0ZV90b2tlbigmaGRyLnRva2VuLAorCQkJCSAgIGFjLT5zZXNzaW9uLAorCQkJCSAgIHN0cmVhbV9pZCwKKwkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KKwkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLworCQkJCSAgIFdBSVRfQ01EKTsKKworCXByX2RlYnVnKCIlczogdG9rZW4gPSAweCV4LCBzdHJlYW1faWQgICVkLCBzZXNzaW9uIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ01EX1BBVVNFOgorCQlwcl9kZWJ1ZygiJXM6IENNRF9QQVVTRVxuIiwgX19mdW5jX18pOworCQloZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1BBVVNFOworCQlicmVhazsKKwljYXNlIENNRF9FT1M6CisJCXByX2RlYnVnKCIlczogQ01EX0VPU1xuIiwgX19mdW5jX18pOworCQloZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX0VPUzsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ0xPU0U6CisJCXByX2RlYnVnKCIlczogQ01EX0NMT1NFXG4iLCBfX2Z1bmNfXyk7CisJCWhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9DTE9TRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgY21kKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXW9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCisJCQlhYy0+c2Vzc2lvbiwKKwkJCWhkci5vcGNvZGUpOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZoZHIpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbW1hbmQgMHgleCBmYWlsZWQgJWRcbiIsCisJCQkJX19mdW5jX18sIGhkci5vcGNvZGUsIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHE2YXNtX2NtZF9ub3dhaXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBjbWQpCit7CisJcHJfZGVidWcoIiVzOiBzdHJlYW1faWQ6ICVkXG4iLCBfX2Z1bmNfXywgYWMtPnN0cmVhbV9pZCk7CisJcmV0dXJuIF9fcTZhc21fY21kX25vd2FpdChhYywgY21kLCBhYy0+c3RyZWFtX2lkKTsKK30KKworaW50IHE2YXNtX3N0cmVhbV9jbWRfbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kLAorCQkJICAgIHVpbnQzMl90IHN0cmVhbV9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6IHN0cmVhbV9pZDogJWRcbiIsIF9fZnVuY19fLCBzdHJlYW1faWQpOworCXJldHVybiBfX3E2YXNtX2NtZF9ub3dhaXQoYWMsIGNtZCwgc3RyZWFtX2lkKTsKK30KKworaW50IF9fcTZhc21fc2VuZF9tZXRhX2RhdGEoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IHN0cmVhbV9pZCwKKwkJCSAgdWludDMyX3QgaW5pdGlhbF9zYW1wbGVzLCB1aW50MzJfdCB0cmFpbGluZ19zYW1wbGVzKQoreworCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVtb3ZlX3NpbGVuY2Ugc2lsZW5jZTsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFhYykgeworCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOworCXE2YXNtX3N0cmVhbV9hZGRfaGRyX2FzeW5jKGFjLCAmc2lsZW5jZS5oZHIsIHNpemVvZihzaWxlbmNlKSwgRkFMU0UsCisJCQlzdHJlYW1faWQpOworCisJLyoKKwkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCisJICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCisJICogYXNzb2NpYXRlZAorCSAqLworCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQorCQlxNmFzbV91cGRhdGVfdG9rZW4oJnNpbGVuY2UuaGRyLnRva2VuLAorCQkJCSAgIGFjLT5zZXNzaW9uLAorCQkJCSAgIHN0cmVhbV9pZCwKKwkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KKwkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLworCQkJCSAgIFdBSVRfQ01EKTsKKwlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAorCQkJX19mdW5jX18sIHNpbGVuY2UuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKKworCXNpbGVuY2UuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9SRU1PVkVfSU5JVElBTF9TSUxFTkNFOworCXNpbGVuY2UubnVtX3NhbXBsZXNfdG9fcmVtb3ZlICAgID0gaW5pdGlhbF9zYW1wbGVzOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZzaWxlbmNlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IENvbW1tYW5kIHNpbGVuY2UgZmFpbGVkWyVkXSIsIF9fZnVuY19fLCByYyk7CisKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlzaWxlbmNlLmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfUkVNT1ZFX1RSQUlMSU5HX1NJTEVOQ0U7CisJc2lsZW5jZS5udW1fc2FtcGxlc190b19yZW1vdmUgICAgPSB0cmFpbGluZ19zYW1wbGVzOworCisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnNpbGVuY2UpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogQ29tbW1hbmQgc2lsZW5jZSBmYWlsZWRbJWRdIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWxfY21kOgorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgcTZhc21fc3RyZWFtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBzdHJlYW1faWQsCisJCXVpbnQzMl90IGluaXRpYWxfc2FtcGxlcywgdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlcykKK3sKKwlyZXR1cm4gX19xNmFzbV9zZW5kX21ldGFfZGF0YShhYywgc3RyZWFtX2lkLCBpbml0aWFsX3NhbXBsZXMsCisJCQkJICAgICB0cmFpbGluZ19zYW1wbGVzKTsKK30KKworaW50IHE2YXNtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBpbml0aWFsX3NhbXBsZXMsCisJCXVpbnQzMl90IHRyYWlsaW5nX3NhbXBsZXMpCit7CisJcmV0dXJuIF9fcTZhc21fc2VuZF9tZXRhX2RhdGEoYWMsIGFjLT5zdHJlYW1faWQsIGluaXRpYWxfc2FtcGxlcywKKwkJCQkgICAgIHRyYWlsaW5nX3NhbXBsZXMpOworfQorCitzdGF0aWMgdm9pZCBxNmFzbV9yZXNldF9idWZfc3RhdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IGNudCA9IDA7CisJaW50IGxvb3BjbnQgPSAwOworCWludCB1c2VkOworCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSBOVUxMOworCisJaWYgKGFjLT5pb19tb2RlICYgU1lOQ19JT19NT0RFKSB7CisJCXVzZWQgPSAoYWMtPmlvX21vZGUgJiBUVU5fV1JJVEVfSU9fTU9ERSA/IDEgOiAwKTsKKwkJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKKwkJZm9yIChsb29wY250ID0gMDsgbG9vcGNudCA8PSBPVVQ7IGxvb3BjbnQrKykgeworCQkJcG9ydCA9ICZhYy0+cG9ydFtsb29wY250XTsKKwkJCWNudCA9IHBvcnQtPm1heF9idWZfY250IC0gMTsKKwkJCXBvcnQtPmRzcF9idWYgPSAwOworCQkJcG9ydC0+Y3B1X2J1ZiA9IDA7CisJCQl3aGlsZSAoY250ID49IDApIHsKKwkJCQlpZiAoIXBvcnQtPmJ1ZikKKwkJCQkJY29udGludWU7CisJCQkJcG9ydC0+YnVmW2NudF0udXNlZCA9IHVzZWQ7CisJCQkJY250LS07CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOworCX0KK30KKworaW50IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDE2X3QgZW5hYmxlKQoreworCXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcmVneF9vdmVyZmxvdyB0eF9vdmVyZmxvdzsKKwlpbnQgcmM7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCWFjLT5zZXNzaW9uLCBlbmFibGUpOworCXE2YXNtX2FkZF9oZHIoYWMsICZ0eF9vdmVyZmxvdy5oZHIsIHNpemVvZih0eF9vdmVyZmxvdyksIFRSVUUpOworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKKworCXR4X292ZXJmbG93Lmhkci5vcGNvZGUgPQorCQkJCSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SWF9PVkVSRkxPV19FVkVOVFM7CisJLyogdHggb3ZlcmZsb3cgZXZlbnQ6IGVuYWJsZSAqLworCXR4X292ZXJmbG93LmVuYWJsZV9mbGFnID0gZW5hYmxlOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZ0eF9vdmVyZmxvdyk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiB0eCBvdmVyZmxvdyBvcFsweCV4XXJjWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgdHhfb3ZlcmZsb3cuaGRyLm9wY29kZSwgcmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKKwkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgdHggb3ZlcmZsb3dcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZhaWxfY21kOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKKwkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcmV0dXJuIDA7CitmYWlsX2NtZDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmFzbV9yZWdfcnhfdW5kZXJmbG93KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBlbmFibGUpCit7CisJc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9yZ3N0cl9yeF91bmRlcmZsb3cgcnhfdW5kZXJmbG93OworCWludCByYzsKKworCWlmICghYWMpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWMtPmFwciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAorCQkJYWMtPnNlc3Npb24sIGVuYWJsZSk7CisJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnJ4X3VuZGVyZmxvdy5oZHIsIHNpemVvZihyeF91bmRlcmZsb3cpLCBGQUxTRSk7CisKKwlyeF91bmRlcmZsb3cuaGRyLm9wY29kZSA9CisJCUFTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9GT1JfUlhfVU5ERVJGTE9XX0VWRU5UUzsKKwkvKiB0eCBvdmVyZmxvdyBldmVudDogZW5hYmxlICovCisJcnhfdW5kZXJmbG93LmVuYWJsZV9mbGFnID0gZW5hYmxlOworCisJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZyeF91bmRlcmZsb3cpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogdHggb3ZlcmZsb3cgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJX19mdW5jX18sIHJ4X3VuZGVyZmxvdy5oZHIub3Bjb2RlLCByYyk7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXJldHVybiAwOworZmFpbF9jbWQ6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBxNmFzbV9nZXRfcGF0aF9kZWxheSgpIC0gZ2V0IHRoZSBwYXRoIGRlbGF5IGZvciBhbiBhdWRpbyBzZXNzaW9uCisgKiBAYWM6IGF1ZGlvIGNsaWVudCBoYW5kbGUKKyAqCisgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgYXVkaW8gRFNQIHBhdGggZGVsYXkgZm9yIHRoZSBnaXZlbiBhdWRpbyBzZXNzaW9uLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitpbnQgcTZhc21fZ2V0X3BhdGhfZGVsYXkoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisKKwlpZiAoIWFjIHx8IGFjLT5hcHIgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGF1ZGlvIGNsaWVudFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX0dFVF9QQVRIX0RFTEFZX1YyOworCXE2YXNtX2FkZF9oZHIoYWMsICZoZHIsIHNpemVvZihoZHIpLCBUUlVFKTsKKwlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7CisKKwlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmhkcik7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBDb21tbWFuZCAweCV4IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQkJaGRyLm9wY29kZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAorCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSAqIEhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgcmVzcG9uc2Ugb3Bjb2RlWzB4JXhdXG4iLAorCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7CisJCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBxNmFzbV9nZXRfYXByX3NlcnZpY2VfaWQoaW50IHNlc3Npb25faWQpCit7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKHNlc3Npb25faWQgPD0gMCB8fCBzZXNzaW9uX2lkID4gQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuICgoc3RydWN0IGFwcl9zdmMgKilzZXNzaW9uW3Nlc3Npb25faWRdLT5hcHIpLT5pZDsKK30KKworaW50IHE2YXNtX2dldF9hc21fdG9wb2xvZ3koaW50IHNlc3Npb25faWQpCit7CisJaW50IHRvcG9sb2d5OworCisJaWYgKHNlc3Npb25faWQgPD0gMCB8fCBzZXNzaW9uX2lkID4gQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKwkJdG9wb2xvZ3kgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJdG9wb2xvZ3kgPSBzZXNzaW9uW3Nlc3Npb25faWRdLT50b3BvbG9neTsKK2RvbmU6CisJcmV0dXJuIHRvcG9sb2d5OworfQorCitpbnQgcTZhc21fZ2V0X2FzbV9hcHBfdHlwZShpbnQgc2Vzc2lvbl9pZCkKK3sKKwlpbnQgYXBwX3R5cGU7CisKKwlpZiAoc2Vzc2lvbl9pZCA8PSAwIHx8IHNlc3Npb25faWQgPiBBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgPSAlZFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCQlhcHBfdHlwZSA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhcHBfdHlwZSA9IHNlc3Npb25bc2Vzc2lvbl9pZF0tPmFwcF90eXBlOworZG9uZToKKwlyZXR1cm4gYXBwX3R5cGU7Cit9CisKK3N0YXRpYyBpbnQgcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwodm9pZCkKK3sKKwlpbnQgdG9wb2xvZ3kgPSBERUZBVUxUX1BPUFBfVE9QT0xPR1k7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCisJaWYgKGNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCW11dGV4X2xvY2soJmNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKGNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdKTsKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpCisJCWdvdG8gdW5sb2NrOworCisJdG9wb2xvZ3kgPSAoKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hc21fdG9wICopCisJCWNhbF9ibG9jay0+Y2FsX2luZm8pLT50b3BvbG9neTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcHJfZGVidWcoIiVzOiBVc2luZyB0b3BvbG9neSAlZFxuIiwgX19mdW5jX18sIHRvcG9sb2d5KTsKKwlyZXR1cm4gdG9wb2xvZ3k7Cit9CisKK3N0YXRpYyBpbnQgcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwodm9pZCkKK3sKKwlpbnQgYXBwX3R5cGUgPSBERUZBVUxUX0FQUF9UWVBFOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKworCWlmIChjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXSA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXS0+bG9jayk7CisJY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jayhjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIHVubG9jazsKKworCWFwcF90eXBlID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXNtX3RvcCAqKQorCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+YXBwX3R5cGU7CisKKwlpZiAoYXBwX3R5cGUgPT0gMCkKKwkJYXBwX3R5cGUgPSBERUZBVUxUX0FQUF9UWVBFOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmY2FsX2RhdGFbQVNNX1RPUE9MT0dZX0NBTF0tPmxvY2spOworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IFVzaW5nIGFwcF90eXBlICVkXG4iLCBfX2Z1bmNfXywgYXBwX3R5cGUpOworCXJldHVybiBhcHBfdHlwZTsKK30KKworaW50IHE2YXNtX3NlbmRfY2FsKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQoreworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgYXByX2hkcgloZHI7CisJY2hhciAqYXNtX3BhcmFtcyA9IE5VTEw7CisJc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGF5bG9hZF9wYXJhbXM7CisJaW50IHN6LCByYyA9IC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWFjKSB7CisJCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChhYy0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKGFjLT5pb19tb2RlICYgTlRfTU9ERSkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbGxlZCBmb3IgTlQgTU9ERSwgZXhpdGluZ1xuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9kYXRhW0FTTV9BVURTVFJNX0NBTF0gPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJaWYgKGFjLT5wZXJmX21vZGUgPT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpIHsKKwkJcmMgPSAwOyAvKiBubyBjYWwgaXMgcmVxdWlyZWQsIG5vdCBlcnJvciBjYXNlICovCisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fQVVEU1RSTV9DQUxdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKGNhbF9kYXRhW0FTTV9BVURTVFJNX0NBTF0pOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBjYWxfYmxvY2sgaXMgTlVMTFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7CisJCXJjID0gMDsgLyogbm90IGVycm9yIGNhc2UgKi8KKwkJcHJfZGVidWcoIiVzOiBjYWxfZGF0YS5zaXplIGlzIDAsIGRvbid0IHNlbmQgY2FsIGRhdGFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJjID0gcmVtYXBfY2FsX2RhdGEoQVNNX0FVRFNUUk1fQ0FMX1RZUEUsIGNhbF9ibG9jayk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IFJlbWFwX2NhbF9kYXRhIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKKwkJCV9fZnVuY19fLCBBU01fQVVEU1RSTV9DQUwpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlzeiA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKworCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpOworCWFzbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzbV9wYXJhbXMpIHsKKwkJcHJfZXJyKCIlcywgYXNtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgaGFzIG5vIEFQUiBoZWFkZXIgaW4gaXQgKi8KKwlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmaGRyLCAoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MikpLCBUUlVFKTsKKworCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDEpOworCWhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOworCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9CisJCQlsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9CisJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCXBheWxvYWRfcGFyYW1zLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7CisJcGF5bG9hZF9wYXJhbXMuZGF0YV9wYXlsb2FkX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7CisJbWVtY3B5KCgodTggKilhc21fcGFyYW1zKSwgJmhkciwgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSk7CisJbWVtY3B5KCgodTggKilhc21fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksICZwYXlsb2FkX3BhcmFtcywKKwkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MikpOworCisJcHJfZGVidWcoIiVzOiBwaHlhZGRyIGxzdyA9ICV4IG1zdyA9ICV4LCBtYXBoZGwgPSAleCBjYWxzaXplID0gJWRcbiIsCisJCV9fZnVuY19fLCBwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfYWRkcl9sc3csCisJCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9hZGRyX21zdywKKwkJcGF5bG9hZF9wYXJhbXMubWVtX21hcF9oYW5kbGUsCisJCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9zaXplKTsKKworCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSBhc21fcGFyYW1zKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIGF1ZHN0cm0gY2FsIHNlbmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmcmVlOworCX0KKwlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCisJCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA8PSAwKSwgNSAqIEhaKTsKKwlpZiAoIXJjKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQsIGF1ZGlvIGF1ZHN0cm0gY2FsIHNlbmRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGZyZWU7CisJfQorCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPCAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslZF0gYXVkaW8gYXVkc3RybSBjYWwgc2VuZFxuIiwKKwkJCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZyZWU7CisJfQorCisJcmMgPSAwOworCitmcmVlOgorCWtmcmVlKGFzbV9wYXJhbXMpOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmY2FsX2RhdGFbQVNNX0FVRFNUUk1fQ0FMXS0+bG9jayk7Citkb25lOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnZXRfY2FsX3R5cGVfaW5kZXgoaW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoY2FsX3R5cGUpIHsKKwljYXNlIEFTTV9UT1BPTE9HWV9DQUxfVFlQRToKKwkJcmV0ID0gQVNNX1RPUE9MT0dZX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBBU01fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKKwkJcmV0ID0gQVNNX0NVU1RPTV9UT1BfQ0FMOworCQlicmVhazsKKwljYXNlIEFTTV9BVURTVFJNX0NBTF9UWVBFOgorCQlyZXQgPSBBU01fQVVEU1RSTV9DQUw7CisJCWJyZWFrOworCWNhc2UgQVNNX1JUQUNfQVBSX0NBTF9UWVBFOgorCQlyZXQgPSBBU01fUlRBQ19BUFJfQ0FMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmFzbV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCWNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmFzbV9kZWFsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLAorCQkJCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfZGVhbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAorCQljYWxfZGF0YVtjYWxfaW5kZXhdKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfZGVhbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmFzbV9zZXRfY2FsKGludDMyX3QgY2FsX3R5cGUsCisJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX3NldF9jYWwoZGF0YV9zaXplLCBkYXRhLAorCQljYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfaW5kZXggPT0gQVNNX0NVU1RPTV9UT1BfQ0FMKSB7CisJCW11dGV4X2xvY2soJmNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOworCQlzZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZjYWxfZGF0YVtBU01fQ1VTVE9NX1RPUF9DQUxdLT5sb2NrKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHE2YXNtX2RlbGV0ZV9jYWxfZGF0YSh2b2lkKQoreworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKwljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoQVNNX01BWF9DQUxfVFlQRVMsIGNhbF9kYXRhKTsKK30KKworc3RhdGljIGludCBxNmFzbV9pbml0X2NhbF9kYXRhKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNhbF90eXBlX2luZm8JY2FsX3R5cGVfaW5mb1tdID0geworCQl7e0FTTV9UT1BPTE9HWV9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsCisJCXE2YXNtX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0FTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAorCQl7cTZhc21fYWxsb2NfY2FsLCBxNmFzbV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJcTZhc21fc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIHE2YXNtX3VubWFwX2NhbF9tZW1vcnksIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7QVNNX0FVRFNUUk1fQ0FMX1RZUEUsCisJCXtxNmFzbV9hbGxvY19jYWwsIHE2YXNtX2RlYWxsb2NfY2FsLCBOVUxMLAorCQlxNmFzbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgcTZhc21fdW5tYXBfY2FsX21lbW9yeSwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tBU01fUlRBQ19BUFJfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0KKwl9OworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoQVNNX01BWF9DQUxfVFlQRVMsIGNhbF9kYXRhLAorCQljYWxfdHlwZV9pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgY3JlYXRlIGNhbCB0eXBlISAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gcmV0OworZXJyOgorCXE2YXNtX2RlbGV0ZV9jYWxfZGF0YSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcTZhc21faXNfdmFsaWRfc2Vzc2lvbihzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gKHN0cnVjdCBhdWRpb19jbGllbnQgKilwcml2OworCXVuaW9uIGFzbV90b2tlbl9zdHJ1Y3QgYXNtX3Rva2VuOworCisJYXNtX3Rva2VuLnRva2VuID0gZGF0YS0+dG9rZW47CisJaWYgKGFzbV90b2tlbi5fdG9rZW4uc2Vzc2lvbl9pZCAhPSBhYy0+c2Vzc2lvbikgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb25bJWRdIHJ4ZWQgZXhwZWN0ZWRbJWRdIiwKKwkJCV9fZnVuY19fLCBhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQsIGFjLT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxNmFzbV9pbml0KHZvaWQpCit7CisJaW50IGxjbnQsIHJldDsKKworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc2Vzc2lvbikpOworCXNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOworCisJLypzZXR1cCBjb21tb24gY2xpZW50IHVzZWQgZm9yIGNhbCBtZW0gbWFwICovCisJY29tbW9uX2NsaWVudC5zZXNzaW9uID0gQVNNX0NPTlRST0xfU0VTU0lPTjsKKwljb21tb25fY2xpZW50LnBvcnRbMF0uYnVmID0gJmNvbW1vbl9idWZbMF07CisJY29tbW9uX2NsaWVudC5wb3J0WzFdLmJ1ZiA9ICZjb21tb25fYnVmWzFdOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbW1vbl9jbGllbnQuY21kX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbW1vbl9jbGllbnQudGltZV93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb25fY2xpZW50Lm1lbV93YWl0KTsKKwlhdG9taWNfc2V0KCZjb21tb25fY2xpZW50LnRpbWVfZmxhZywgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbW1vbl9jbGllbnQucG9ydFswXS5tZW1fbWFwX2hhbmRsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbW1vbl9jbGllbnQucG9ydFsxXS5tZW1fbWFwX2hhbmRsZSk7CisJbXV0ZXhfaW5pdCgmY29tbW9uX2NsaWVudC5jbWRfbG9jayk7CisJZm9yIChsY250ID0gMDsgbGNudCA8PSBPVVQ7IGxjbnQrKykgeworCQltdXRleF9pbml0KCZjb21tb25fY2xpZW50LnBvcnRbbGNudF0ubG9jayk7CisJCXNwaW5fbG9ja19pbml0KCZjb21tb25fY2xpZW50LnBvcnRbbGNudF0uZHNwX2xvY2spOworCX0KKwlhdG9taWNfc2V0KCZjb21tb25fY2xpZW50LmNtZF9zdGF0ZSwgMCk7CisJYXRvbWljX3NldCgmY29tbW9uX2NsaWVudC5tZW1fc3RhdGUsIDApOworCisJcmV0ID0gcTZhc21faW5pdF9jYWxfZGF0YSgpOworCWlmIChyZXQpCisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBpbml0IGNhbCBkYXRhISByZXQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCWNvbmZpZ19kZWJ1Z19mc19pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHE2YXNtX2V4aXQodm9pZCkKK3sKKwlxNmFzbV9kZWxldGVfY2FsX2RhdGEoKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHE2YXNtX2luaXQpOworX19leGl0Y2FsbChxNmFzbV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmF1ZGlvLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhdWRpby12Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzhlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhdWRpby12Mi5jCkBAIC0wLDAgKzEsODA3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+CisKK2ludCBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHUxNiBwb3J0X2lkKQoreworCXN3aXRjaCAocG9ydF9pZCkgeworCWNhc2UgUFJJTUFSWV9JMlNfUlg6IHJldHVybiBJRFhfUFJJTUFSWV9JMlNfUlg7CisJY2FzZSBQUklNQVJZX0kyU19UWDogcmV0dXJuIElEWF9QUklNQVJZX0kyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg7CisJY2FzZSBTRUNPTkRBUllfSTJTX1JYOiByZXR1cm4gSURYX1NFQ09OREFSWV9JMlNfUlg7CisJY2FzZSBTRUNPTkRBUllfSTJTX1RYOiByZXR1cm4gSURYX1NFQ09OREFSWV9JMlNfVFg7CisJY2FzZSBNSTJTX1JYOiByZXR1cm4gSURYX01JMlNfUlg7CisJY2FzZSBNSTJTX1RYOiByZXR1cm4gSURYX01JMlNfVFg7CisJY2FzZSBIRE1JX1JYOiByZXR1cm4gSURYX0hETUlfUlg7CisJY2FzZSBESVNQTEFZX1BPUlRfUlg6IHJldHVybiBJRFhfRElTUExBWV9QT1JUX1JYOworCWNhc2UgQUZFX1BPUlRfSURfU1BESUZfUlg6IHJldHVybiBJRFhfU1BESUZfUlg7CisJY2FzZSBSU1ZEXzI6IHJldHVybiBJRFhfUlNWRF8yOworCWNhc2UgUlNWRF8zOiByZXR1cm4gSURYX1JTVkRfMzsKKwljYXNlIERJR0lfTUlDX1RYOiByZXR1cm4gSURYX0RJR0lfTUlDX1RYOworCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOiByZXR1cm4gSURYX1ZPSUNFX1JFQ09SRF9SWDsKKwljYXNlIFZPSUNFX1JFQ09SRF9UWDogcmV0dXJuIElEWF9WT0lDRV9SRUNPUkRfVFg7CisJY2FzZSBWT0lDRV9QTEFZQkFDS19UWDogcmV0dXJuIElEWF9WT0lDRV9QTEFZQkFDS19UWDsKKwljYXNlIFZPSUNFMl9QTEFZQkFDS19UWDogcmV0dXJuIElEWF9WT0lDRTJfUExBWUJBQ0tfVFg7CisJY2FzZSBTTElNQlVTXzBfUlg6IHJldHVybiBJRFhfU0xJTUJVU18wX1JYOworCWNhc2UgU0xJTUJVU18wX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfMF9UWDsKKwljYXNlIFNMSU1CVVNfMV9SWDogcmV0dXJuIElEWF9TTElNQlVTXzFfUlg7CisJY2FzZSBTTElNQlVTXzFfVFg6IHJldHVybiBJRFhfU0xJTUJVU18xX1RYOworCWNhc2UgU0xJTUJVU18yX1JYOiByZXR1cm4gSURYX1NMSU1CVVNfMl9SWDsKKwljYXNlIFNMSU1CVVNfMl9UWDogcmV0dXJuIElEWF9TTElNQlVTXzJfVFg7CisJY2FzZSBTTElNQlVTXzNfUlg6IHJldHVybiBJRFhfU0xJTUJVU18zX1JYOworCWNhc2UgU0xJTUJVU18zX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfM19UWDsKKwljYXNlIFNMSU1CVVNfNF9SWDogcmV0dXJuIElEWF9TTElNQlVTXzRfUlg7CisJY2FzZSBTTElNQlVTXzRfVFg6IHJldHVybiBJRFhfU0xJTUJVU180X1RYOworCWNhc2UgU0xJTUJVU181X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfNV9SWDsKKwljYXNlIFNMSU1CVVNfNV9UWDogcmV0dXJuIElEWF9TTElNQlVTXzVfVFg7CisJY2FzZSBTTElNQlVTXzZfUlg6IHJldHVybiBJRFhfU0xJTUJVU182X1JYOworCWNhc2UgU0xJTUJVU182X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfNl9UWDsKKwljYXNlIFNMSU1CVVNfN19SWDogcmV0dXJuIElEWF9TTElNQlVTXzdfUlg7CisJY2FzZSBTTElNQlVTXzdfVFg6IHJldHVybiBJRFhfU0xJTUJVU183X1RYOworCWNhc2UgU0xJTUJVU184X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfOF9SWDsKKwljYXNlIFNMSU1CVVNfOF9UWDogcmV0dXJuIElEWF9TTElNQlVTXzhfVFg7CisJY2FzZSBJTlRfQlRfU0NPX1JYOiByZXR1cm4gSURYX0lOVF9CVF9TQ09fUlg7CisJY2FzZSBJTlRfQlRfU0NPX1RYOiByZXR1cm4gSURYX0lOVF9CVF9TQ09fVFg7CisJY2FzZSBJTlRfQlRfQTJEUF9SWDogcmV0dXJuIElEWF9JTlRfQlRfQTJEUF9SWDsKKwljYXNlIElOVF9GTV9SWDogcmV0dXJuIElEWF9JTlRfRk1fUlg7CisJY2FzZSBJTlRfRk1fVFg6IHJldHVybiBJRFhfSU5UX0ZNX1RYOworCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6IHJldHVybiBJRFhfUlRfUFJPWFlfUE9SVF8wMDFfUlg7CisJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9UWDogcmV0dXJuIElEWF9SVF9QUk9YWV9QT1JUXzAwMV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOworCWNhc2UgQVVESU9fUE9SVF9JRF9JMlNfUlg6CisJCXJldHVybiBJRFhfQVVESU9fUE9SVF9JRF9JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8wOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNTsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzA7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9VU0JfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVVNCX1RYOworCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMl9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6CisJCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOgorCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKKwkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg7CisJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitpbnQgcTZhdWRpb19nZXRfcG9ydF9pZCh1MTYgcG9ydF9pZCkKK3sKKwlzd2l0Y2ggKHBvcnRfaWQpIHsKKwljYXNlIFBSSU1BUllfSTJTX1JYOiByZXR1cm4gUFJJTUFSWV9JMlNfUlg7CisJY2FzZSBQUklNQVJZX0kyU19UWDogcmV0dXJuIFBSSU1BUllfSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKKwkJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKKwkJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKKwkJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDsKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKKwljYXNlIFNFQ09OREFSWV9JMlNfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKKwljYXNlIE1JMlNfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7CisJY2FzZSBNSTJTX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOworCWNhc2UgSERNSV9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX01VTFRJQ0hBTl9IRE1JX1JYOworCWNhc2UgRElTUExBWV9QT1JUX1JYOgorCQkJcmV0dXJuIEFGRV9QT1JUX0lEX0hETUlfT1ZFUl9EUF9SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1NQRElGX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU1BESUZfUlg7CisJY2FzZSBSU1ZEXzI6IHJldHVybiBJRFhfUlNWRF8yOworCWNhc2UgUlNWRF8zOiByZXR1cm4gSURYX1JTVkRfMzsKKwljYXNlIERJR0lfTUlDX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfRElHSVRBTF9NSUNfVFg7CisJY2FzZSBWT0lDRV9SRUNPUkRfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9WT0lDRV9SRUNPUkRfUlg7CisJY2FzZSBWT0lDRV9SRUNPUkRfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9WT0lDRV9SRUNPUkRfVFg7CisJY2FzZSBWT0lDRV9QTEFZQkFDS19UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1ZPSUNFX1BMQVlCQUNLX1RYOworCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfVk9JQ0UyX1BMQVlCQUNLX1RYOworCWNhc2UgU0xJTUJVU18wX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzBfUlg7CisJY2FzZSBTTElNQlVTXzBfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMF9UWDsKKwljYXNlIFNMSU1CVVNfMV9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8xX1JYOworCWNhc2UgU0xJTUJVU18xX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzFfVFg7CisJY2FzZSBTTElNQlVTXzJfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMl9SWDsKKwljYXNlIFNMSU1CVVNfMl9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8yX1RYOworCWNhc2UgU0xJTUJVU18zX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzNfUlg7CisJY2FzZSBTTElNQlVTXzNfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fM19UWDsKKwljYXNlIFNMSU1CVVNfNF9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl80X1JYOworCWNhc2UgU0xJTUJVU180X1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzRfVFg7CisJY2FzZSBTTElNQlVTXzVfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNV9SWDsKKwljYXNlIFNMSU1CVVNfNV9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl81X1RYOworCWNhc2UgU0xJTUJVU182X1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzZfUlg7CisJY2FzZSBTTElNQlVTXzZfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNl9UWDsKKwljYXNlIFNMSU1CVVNfN19SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl83X1JYOworCWNhc2UgU0xJTUJVU183X1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzdfVFg7CisJY2FzZSBTTElNQlVTXzhfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fOF9SWDsKKwljYXNlIFNMSU1CVVNfOF9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl84X1RYOworCWNhc2UgSU5UX0JUX1NDT19SWDogcmV0dXJuIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX1NDT19SWDsKKwljYXNlIElOVF9CVF9TQ09fVFg6IHJldHVybiBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9TQ09fVFg7CisJY2FzZSBJTlRfQlRfQTJEUF9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0EyRFBfUlg7CisJY2FzZSBJTlRfRk1fUlg6IHJldHVybiBBRkVfUE9SVF9JRF9JTlRFUk5BTF9GTV9SWDsKKwljYXNlIElOVF9GTV9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0ZNX1RYOworCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUXzAwMV9SWDsKKwljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF8wMDFfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgorCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDoKKwkJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDoKKwkJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6CisJCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKKwljYXNlIEFVRElPX1BPUlRfSURfSTJTX1JYOgorCQkJcmV0dXJuIEFVRElPX1BPUlRfSURfSTJTX1JYOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOgorCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMTsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6CisJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjsKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6CisJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOworCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6CisJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjsKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY7CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OworCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6CisJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMTsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6CisJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjsKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6CisJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OworCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKKwkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc7CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgorCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzsKKwljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgorCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9VU0JfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9VU0JfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQxX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg7CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg6CisJCXJldHVybiBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg7CisJZGVmYXVsdDoKKwkJcHJfd2FybigiJXM6IEludmFsaWQgcG9ydF9pZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CitpbnQgcTZhdWRpb19jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHUxNiBwb3J0X2lkKQoreworCWludCByZXQ7CisKKwkvKiBpZiBwb3J0X2lkIGlzIHZpcnR1YWwsIGNvbnZlcnQgdG8gcGh5c2ljYWwuLgorCSAqIGlmIHBvcnRfaWQgaXMgYWxyZWFkeSBwaHlzaWNhbCwgcmV0dXJuIHBoeXNpY2FsCisJICovCisJaWYgKHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKSA8IDApIHsKKwkJaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCB8fAorCQkJcG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYIHx8CisJCQlwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfUlggfHwKKwkJCXBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9UWCkKKwkJCXJldCA9IFZJUlRVQUxfSURfVE9fUE9SVElEKHBvcnRfaWQpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyZXQgPSBwb3J0X2lkOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHE2YXVkaW9faXNfZGlnaXRhbF9wY21faW50ZXJmYWNlKHUxNiBwb3J0X2lkKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwb3J0X2lkKSB7CisJY2FzZSBQUklNQVJZX0kyU19SWDoKKwljYXNlIFBSSU1BUllfSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKKwljYXNlIFNFQ09OREFSWV9JMlNfUlg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1RYOgorCWNhc2UgTUkyU19SWDoKKwljYXNlIE1JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6CisJY2FzZSBBVURJT19QT1JUX0lEX0kyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMl9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UMl9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1RYOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQodTE2IHBvcnRfaWQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocG9ydF9pZCkgeworCWNhc2UgUFJJTUFSWV9JMlNfUlg6CisJY2FzZSBQUklNQVJZX0kyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6CisJY2FzZSBTRUNPTkRBUllfSTJTX1JYOgorCWNhc2UgU0VDT05EQVJZX0kyU19UWDoKKwljYXNlIE1JMlNfUlg6CisJY2FzZSBNSTJTX1RYOgorCWNhc2UgSERNSV9SWDoKKwljYXNlIERJU1BMQVlfUE9SVF9SWDoKKwljYXNlIFJTVkRfMjoKKwljYXNlIFJTVkRfMzoKKwljYXNlIERJR0lfTUlDX1RYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgorCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgorCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6CisJY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6CisJY2FzZSBTTElNQlVTXzBfUlg6CisJY2FzZSBTTElNQlVTXzBfVFg6CisJY2FzZSBTTElNQlVTXzFfUlg6CisJY2FzZSBTTElNQlVTXzFfVFg6CisJY2FzZSBTTElNQlVTXzJfUlg6CisJY2FzZSBTTElNQlVTXzJfVFg6CisJY2FzZSBTTElNQlVTXzNfUlg6CisJY2FzZSBTTElNQlVTXzNfVFg6CisJY2FzZSBTTElNQlVTXzRfUlg6CisJY2FzZSBTTElNQlVTXzRfVFg6CisJY2FzZSBTTElNQlVTXzVfUlg6CisJY2FzZSBTTElNQlVTXzVfVFg6CisJY2FzZSBTTElNQlVTXzZfUlg6CisJY2FzZSBTTElNQlVTXzZfVFg6CisJY2FzZSBTTElNQlVTXzdfUlg6CisJY2FzZSBTTElNQlVTXzdfVFg6CisJY2FzZSBTTElNQlVTXzhfUlg6CisJY2FzZSBTTElNQlVTXzhfVFg6CisJY2FzZSBJTlRfQlRfU0NPX1JYOgorCWNhc2UgSU5UX0JUX1NDT19UWDoKKwljYXNlIElOVF9CVF9BMkRQX1JYOgorCWNhc2UgSU5UX0ZNX1JYOgorCWNhc2UgSU5UX0ZNX1RYOgorCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6CisJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TUERJRl9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKKwljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6CisJY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKKwljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNToKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgorCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKKwljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6CisJY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgorCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6CisJY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg6CisJeworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZjb3JlLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzZGQwZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmNvcmUuYwpAQCAtMCwwICsxLDk1MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+CisjaW5jbHVkZSA8c29jL3Fjb20vc21kLmg+CisjaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+CisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+CisKKyNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCisvKgorICogQVZTIGJyaW5nIHVwIGluIHRoZSBtb2RlbSBpcyBvcHRpbWl0aXplZCBmb3IgdGhlIG5ldworICogU3ViIFN5c3RlbSBSZXN0YXJ0IGRlc2lnbiBhbmQgMTAwIG1pbGxpc2Vjb25kcyB0aW1lb3V0CisgKiBpcyBzdWZmaWNpZW50IHRvIG1ha2Ugc3VyZSB0aGUgUTYgd2lsbCBiZSByZWFkeS4KKyAqLworI2RlZmluZSBRNl9SRUFEWV9USU1FT1VUX01TIDEwMAorCitlbnVtIHsKKwlNRVRBX0NBTCwKKwlDVVNUX1RPUF9DQUwsCisJQ09SRV9NQVhfQ0FMCit9OworCitzdHJ1Y3QgcTZjb3JlX3N0ciB7CisJc3RydWN0IGFwcl9zdmMgKmNvcmVfaGFuZGxlX3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QgYnVzX2J3X3JlcV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGNtZF9yZXFfd2FpdDsKKwl1MzIgYnVzX2J3X3Jlc3BfcmVjZWl2ZWQ7CisJZW51bSBjbWRfZmxhZ3MgeworCQlGTEFHX05PTkUsCisJCUZMQUdfQ01EUlNQX0xJQ0VOU0VfUkVTVUxUCisJfSBjbWRfcmVzcF9yZWNlaXZlZF9mbGFnOworCXN0cnVjdCBtdXRleCBjbWRfbG9jazsKKwl1bmlvbiB7CisJCXN0cnVjdCBhdmNzX2NtZHJzcF9nZXRfbGljZW5zZV92YWxpZGF0aW9uX3Jlc3VsdAorCQkJCQkJY21kcnNwX2xpY2Vuc2VfcmVzdWx0OworCX0gY21kX3Jlc3BfcGF5bG9hZDsKKwl1MzIgcGFyYW07CisJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF9kYXRhW0NPUkVfTUFYX0NBTF07CisJdWludDMyX3QgbWVtX21hcF9jYWxfaGFuZGxlOworCWludDMyX3QgYWRzcF9zdGF0dXM7Cit9OworCitzdGF0aWMgc3RydWN0IHE2Y29yZV9zdHIgcTZjb3JlX2xjbDsKKworc3RydWN0IGdlbmVyaWNfZ2V0X2RhdGFfIHsKKwlpbnQgdmFsaWQ7CisJaW50IHNpemVfaW5faW50czsKKwlpbnQgaW50c1tdOworfTsKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19nZXRfZGF0YV8gKmdlbmVyaWNfZ2V0X2RhdGE7CisKK3N0YXRpYyBpbnQzMl90IGFwcnYyX2NvcmVfZm5fcShzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXVpbnQzMl90ICpwYXlsb2FkMTsKKworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogZGF0YSBhcmd1bWVudCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogY29yZSBtc2c6IHBheWxvYWQgbGVuID0gJXUsIGFwciByZXNwIG9wY29kZSA9IDB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlkYXRhLT5wYXlsb2FkX3NpemUsIGRhdGEtPm9wY29kZSk7CisKKwlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgeworCisJY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDp7CisKKwkJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA9PSAwKSB7CisJCQlwcl9lcnIoIiVzOiBBUFJfQkFTSUNfUlNQX1JFU1VMVCBObyBQYXlsb2FkICIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcGF5bG9hZDEgPSBkYXRhLT5wYXlsb2FkOworCisJCXN3aXRjaCAocGF5bG9hZDFbMF0pIHsKKworCQljYXNlIEFWQ1NfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzoKKwkJCXByX2RlYnVnKCIlczogQ21kID0gQVZDU19DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TIHN0YXR1c1sweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMV0pOworCQkJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDE7CisJCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7CisJCQlicmVhazsKKwkJY2FzZSBBVkNTX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOgorCQkJcHJfZGVidWcoIiVzOiBDbWQgPSBBVkNTX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIHN0YXR1c1sweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMV0pOworCQkJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDE7CisJCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7CisJCQlicmVhazsKKwkJY2FzZSBBVkNTX0NNRF9SRUdJU1RFUl9UT1BPTE9HSUVTOgorCQkJcHJfZGVidWcoIiVzOiBDbWQgPSBBVkNTX0NNRF9SRUdJU1RFUl9UT1BPTE9HSUVTIHN0YXR1c1sweCV4XVxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMV0pOworCQkJLyogLUFEU1Agc3RhdHVzIHRvIG1hdGNoIExpbnV4IGVycm9yIHN0YW5kYXJkICovCisJCQlxNmNvcmVfbGNsLmFkc3Bfc3RhdHVzID0gLXBheWxvYWQxWzFdOworCQkJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDE7CisJCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7CisJCQlicmVhazsKKwkJY2FzZSBBVkNTX0NNRF9ERVJFR0lTVEVSX1RPUE9MT0dJRVM6CisJCQlwcl9kZWJ1ZygiJXM6IENtZCA9IEFWQ1NfQ01EX0RFUkVHSVNURVJfVE9QT0xPR0lFUyBzdGF0dXNbMHgleF1cbiIsCisJCQkJX19mdW5jX18sIHBheWxvYWQxWzFdKTsKKwkJCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAxOworCQkJd2FrZV91cCgmcTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNtZCByc3BbMHgleF1bMHgleF0gb3Bjb2RlICVkXG4iLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJcGF5bG9hZDFbMF0sIHBheWxvYWQxWzFdLCBkYXRhLT5vcGNvZGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBSRVNFVF9FVkVOVFM6eworCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGV2ZW50IHJlY2VpdmVkIGluIENvcmUgc2VydmljZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJYXByX3Jlc2V0KHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSk7CisJCXE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSA9IE5VTEw7CisJCWJyZWFrOworCX0KKwljYXNlIEFWQ1NfQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6CisJCXBheWxvYWQxID0gZGF0YS0+cGF5bG9hZDsKKwkJcHJfZGVidWcoIiVzOiBBVkNTX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGhhbmRsZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBwYXlsb2FkMVswXSk7CisJCXE2Y29yZV9sY2wubWVtX21hcF9jYWxfaGFuZGxlID0gcGF5bG9hZDFbMF07CisJCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAxOworCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7CisJCWJyZWFrOworCWNhc2UgQVZDU19DTURSU1BfQURTUF9FVkVOVF9HRVRfU1RBVEU6CisJCXBheWxvYWQxID0gZGF0YS0+cGF5bG9hZDsKKwkJcTZjb3JlX2xjbC5wYXJhbSA9IHBheWxvYWQxWzBdOworCQlwcl9kZWJ1ZygiJXM6IFJlY2VpdmVkIEFEU1AgZ2V0IHN0YXRlIHJlc3BvbnNlIDB4JXhcbiIsCisJCQkgX19mdW5jX18sIHE2Y29yZV9sY2wucGFyYW0pOworCQkvKiBlbnN1cmUgLnBhcmFtIGlzIHVwZGF0ZWQgcHJpb3IgdG8gLmJ1c19id19yZXNwX3JlY2VpdmVkICovCisJCXdtYigpOworCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMTsKKwkJd2FrZV91cCgmcTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQpOworCQlicmVhazsKKwljYXNlIEFWQ1NfQ01EUlNQX0dFVF9MSUNFTlNFX1ZBTElEQVRJT05fUkVTVUxUOgorCQlwYXlsb2FkMSA9IGRhdGEtPnBheWxvYWQ7CisJCXByX2RlYnVnKCIlczogY21kID0gTElDRU5TRV9WQUxJREFUSU9OX1JFU1VMVCwgcmVzdWx0ID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMF0pOworCQlxNmNvcmVfbGNsLmNtZF9yZXNwX3BheWxvYWQuY21kcnNwX2xpY2Vuc2VfcmVzdWx0LnJlc3VsdAorCQkJCQkJCQk9IHBheWxvYWQxWzBdOworCQlxNmNvcmVfbGNsLmNtZF9yZXNwX3JlY2VpdmVkX2ZsYWcgPSBGTEFHX0NNRFJTUF9MSUNFTlNFX1JFU1VMVDsKKwkJd2FrZV91cCgmcTZjb3JlX2xjbC5jbWRfcmVxX3dhaXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBNZXNzYWdlIGlkIGZyb20gYWRzcCBjb3JlIHN2YzogMHgleFxuIiwKKwkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUpOworCQlpZiAoZ2VuZXJpY19nZXRfZGF0YSkgeworCQkJZ2VuZXJpY19nZXRfZGF0YS0+dmFsaWQgPSAxOworCQkJZ2VuZXJpY19nZXRfZGF0YS0+c2l6ZV9pbl9pbnRzID0KKwkJCQlkYXRhLT5wYXlsb2FkX3NpemUvc2l6ZW9mKGludCk7CisJCQlwcl9kZWJ1ZygiRFRTX0VBR0xFX0NPUkUgY2FsbGJhY2sgc2l6ZSA9ICVpXG4iLAorCQkJCSBkYXRhLT5wYXlsb2FkX3NpemUpOworCQkJbWVtY3B5KGdlbmVyaWNfZ2V0X2RhdGEtPmludHMsIGRhdGEtPnBheWxvYWQsCisJCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwkJCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAxOworCQkJd2FrZV91cCgmcTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb2NtX2NvcmVfb3Blbih2b2lkKQoreworCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPT0gTlVMTCkKKwkJcTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkNPUkUiLAorCQkJCQlhcHJ2Ml9jb3JlX2ZuX3EsIDB4RkZGRkZGRkYsIE5VTEwpOworCXByX2RlYnVnKCIlczogT3Blbl9xICVwS1xuIiwgX19mdW5jX18sIHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSk7CisJaWYgKHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSA9PSBOVUxMKQorCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQ09SRVxuIiwgX19mdW5jX18pOworfQorCitpbnQzMl90IGNvcmVfc2V0X2xpY2Vuc2UodWludDMyX3Qga2V5LCB1aW50MzJfdCBtb2R1bGVfaWQpCit7CisJc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlICpjbWRfc2V0bCA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21ldGFpbmZvICptZXRhaW5mbyA9IE5VTEw7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCWludCByYyA9IDAsIHBhY2tldF9zaXplID0gMDsKKworCXByX2RlYnVnKCIlczoga2V5OjB4JXgsIGlkOjB4JXhcbiIsIF9fZnVuY19fLCBrZXksIG1vZHVsZV9pZCk7CisKKwltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOworCWlmIChxNmNvcmVfbGNsLmNhbF9kYXRhW01FVEFfQ0FMXSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbF9kYXRhIG5vdCBpbml0aWFsaXplZCB5ZXQhIVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gY21kX3VubG9jazsKKwl9CisKKwltdXRleF9sb2NrKCYoKHE2Y29yZV9sY2wuY2FsX2RhdGFbTUVUQV9DQUxdKS0+bG9jaykpOworCWNhbF9ibG9jayA9CisJCWNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2socTZjb3JlX2xjbC5jYWxfZGF0YVtNRVRBX0NBTF0pOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCB8fAorCQljYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkciA9PSBOVUxMIHx8CisJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA8PSAwKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgY2FsIGJsb2NrIHRvIHNlbmQiLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBjYWxfZGF0YV91bmxvY2s7CisJfQorCW1ldGFpbmZvID0gKHN0cnVjdCBhdWRpb19jYWxfaW5mb19tZXRhaW5mbyAqKWNhbF9ibG9jay0+Y2FsX2luZm87CisJaWYgKG1ldGFpbmZvID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogTm8gbWV0YWluZm8hISEiLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBjYWxfZGF0YV91bmxvY2s7CisJfQorCWlmIChtZXRhaW5mby0+bktleSAhPSBrZXkpIHsKKwkJcHJfZXJyKCIlczogbWV0YWluZm8ga2V5IG1pc21hdGNoISEhIGZvdW5kOiV4LCBuZWVkZWQ6JXhcbiIsCisJCQkJX19mdW5jX18sIG1ldGFpbmZvLT5uS2V5LCBrZXkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gY2FsX2RhdGFfdW5sb2NrOworCX0gZWxzZSBpZiAoa2V5ID09IDApIHsKKwkJcHJfZXJyKCIlczogbWV0YWluZm8ga2V5IGlzICVkIGEgaW52YWxpZCBrZXkiLCBfX2Z1bmNfXywga2V5KTsKKwkJZ290byBjYWxfZGF0YV91bmxvY2s7CisJfQorCisJcGFja2V0X3NpemUgPSBzaXplb2Yoc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlKSArCisJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKwkvKnJvdW5kIHVwIHRvdGFsIHBhY2tldF9zaXplIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5Ki8KKwlwYWNrZXRfc2l6ZSA9ICgocGFja2V0X3NpemUgKyAweDMpPj4yKTw8MjsKKworCWNtZF9zZXRsID0ga3phbGxvYyhwYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZF9zZXRsID09IE5VTEwpIHsKKwkJcmMgID0gLUVOT01FTTsKKwkJZ290byBjYWxfZGF0YV91bmxvY2s7CisJfQorCisJb2NtX2NvcmVfb3BlbigpOworCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBhcHIgcmVnaXN0cmF0aW9uIGZvciBDT1JFIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyYyAgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfY21kOworCX0KKworCWNtZF9zZXRsLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfRVZFTlQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWNtZF9zZXRsLT5oZHIucGt0X3NpemUgPSBwYWNrZXRfc2l6ZTsKKwljbWRfc2V0bC0+aGRyLnNyY19wb3J0ID0gMDsKKwljbWRfc2V0bC0+aGRyLmRlc3RfcG9ydCA9IDA7CisJY21kX3NldGwtPmhkci50b2tlbiA9IDA7CisJY21kX3NldGwtPmhkci5vcGNvZGUgPSBBVkNTX0NNRF9TRVRfTElDRU5TRTsKKwljbWRfc2V0bC0+aWQgPSBtb2R1bGVfaWQ7CisJY21kX3NldGwtPm92ZXJ3cml0ZSA9IDE7CisJY21kX3NldGwtPnNpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7CisJbWVtY3B5KCh1aW50OF90ICopY21kX3NldGwgKyBzaXplb2Yoc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlKSwKKwkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5rdmFkZHIsCisJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7CisJcHJfaW5mbygiJXM6IFNldCBsaWNlbnNlIG9wY29kZT0weCV4ICxrZXk9MHgleCwgaWQgPTB4JXgsIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjbWRfc2V0bC0+aGRyLm9wY29kZSwKKwkJCW1ldGFpbmZvLT5uS2V5LCBjbWRfc2V0bC0+aWQsIGNtZF9zZXRsLT5zaXplKTsKKwlyYyA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsICh1aW50MzJfdCAqKWNtZF9zZXRsKTsKKwlpZiAocmMgPCAwKQorCQlwcl9lcnIoIiVzOiBTRVRfTElDRU5TRSBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJCV9fZnVuY19fLCBjbWRfc2V0bC0+aGRyLm9wY29kZSwgcmMpOworCitmYWlsX2NtZDoKKwlrZnJlZShjbWRfc2V0bCk7CitjYWxfZGF0YV91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCYoKHE2Y29yZV9sY2wuY2FsX2RhdGFbTUVUQV9DQUxdKS0+bG9jaykpOworY21kX3VubG9jazoKKwltdXRleF91bmxvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgY29yZV9nZXRfbGljZW5zZV9zdGF0dXModWludDMyX3QgbW9kdWxlX2lkKQoreworCXN0cnVjdCBhdmNzX2NtZF9nZXRfbGljZW5zZV92YWxpZGF0aW9uX3Jlc3VsdCBnZXRfbHZyX2NtZDsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlczogbW9kdWxlX2lkIDB4JXgiLCBfX2Z1bmNfXywgbW9kdWxlX2lkKTsKKworCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisJb2NtX2NvcmVfb3BlbigpOworCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBhcHIgcmVnaXN0cmF0aW9uIGZvciBDT1JFIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXQgID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2NtZDsKKwl9CisKKwlnZXRfbHZyX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJZ2V0X2x2cl9jbWQuaGRyLnBrdF9zaXplID0KKwkJc2l6ZW9mKHN0cnVjdCBhdmNzX2NtZF9nZXRfbGljZW5zZV92YWxpZGF0aW9uX3Jlc3VsdCk7CisKKwlnZXRfbHZyX2NtZC5oZHIuc3JjX3BvcnQgPSAwOworCWdldF9sdnJfY21kLmhkci5kZXN0X3BvcnQgPSAwOworCWdldF9sdnJfY21kLmhkci50b2tlbiA9IDA7CisJZ2V0X2x2cl9jbWQuaGRyLm9wY29kZSA9IEFWQ1NfQ01EX0dFVF9MSUNFTlNFX1ZBTElEQVRJT05fUkVTVUxUOworCWdldF9sdnJfY21kLmlkID0gbW9kdWxlX2lkOworCisKKwlyZXQgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKikgJmdldF9sdnJfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBsaWNlbnNlX3ZhbGlkYXRpb24gcmVxdWVzdCBmYWlsZWQsIGVyciAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0ID0gLUVSRU1PVEU7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCisJcTZjb3JlX2xjbC5jbWRfcmVzcF9yZWNlaXZlZF9mbGFnICY9IH4oRkxBR19DTURSU1BfTElDRU5TRV9SRVNVTFQpOworCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5jbWRfcmVxX3dhaXQsCisJCQkocTZjb3JlX2xjbC5jbWRfcmVzcF9yZWNlaXZlZF9mbGFnID09CisJCQkJRkxBR19DTURSU1BfTElDRU5TRV9SRVNVTFQpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0IGZvciBDTURSU1BfTElDRU5TRV9SRVNVTFRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUU7CisJCWdvdG8gZmFpbF9jbWQ7CisJfQorCXE2Y29yZV9sY2wuY21kX3Jlc3BfcmVjZWl2ZWRfZmxhZyAmPSB+KEZMQUdfQ01EUlNQX0xJQ0VOU0VfUkVTVUxUKTsKKwlyZXQgPSBxNmNvcmVfbGNsLmNtZF9yZXNwX3BheWxvYWQuY21kcnNwX2xpY2Vuc2VfcmVzdWx0LnJlc3VsdDsKKworZmFpbF9jbWQ6CisJbXV0ZXhfdW5sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOworCXByX2luZm8oIiVzOiBjbWRyc3BfbGljZW5zZV9yZXN1bHQucmVzdWx0ID0gMHgleCBmb3IgbW9kdWxlIDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHJldCwgbW9kdWxlX2lkKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY29yZV9kdHNfZWFnbGVfc2V0KGludCBzaXplLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBhZHNwX2R0c19lYWdsZSAqcGF5bG9hZCA9IE5VTEw7CisJaW50IHJjID0gMCwgc2l6ZV9hbGlnbmVkNGJ5dGU7CisKKwlwcl9kZWJ1ZygiRFRTX0VBR0xFX0NPUkUgLSAlc1xuIiwgX19mdW5jX18pOworCWlmIChzaXplIDw9IDAgfHwgIWRhdGEpIHsKKwkJcHJfZXJyKCJEVFNfRUFHTEVfQ09SRSAtICVzOiBpbnZhbGlkIHNpemUgJWkgb3IgcG9pbnRlciAlcEsuXG4iLAorCQkJX19mdW5jX18sIHNpemUsIGRhdGEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaXplX2FsaWduZWQ0Ynl0ZSA9IChzaXplKzMpICYgMHhGRkZGRkZGQzsKKwltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOworCW9jbV9jb3JlX29wZW4oKTsKKwlpZiAocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xKSB7CisJCXBheWxvYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRzcF9kdHNfZWFnbGUpICsKKwkJCQkgIHNpemVfYWxpZ25lZDRieXRlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYXlsb2FkKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJcGF5bG9hZC0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX0VWRU5ULAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwkJcGF5bG9hZC0+aGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZHNwX2R0c19lYWdsZSkgKworCQkJCQkgICAgICAgc2l6ZV9hbGlnbmVkNGJ5dGU7CisJCXBheWxvYWQtPmhkci5zcmNfcG9ydCA9IDA7CisJCXBheWxvYWQtPmhkci5kZXN0X3BvcnQgPSAwOworCQlwYXlsb2FkLT5oZHIudG9rZW4gPSAwOworCQlwYXlsb2FkLT5oZHIub3Bjb2RlID0gQURTUF9DTURfU0VUX0RUU19FQUdMRV9EQVRBX0lEOworCQlwYXlsb2FkLT5pZCA9IERUU19FQUdMRV9MSUNFTlNFX0lEOworCQlwYXlsb2FkLT5vdmVyd3JpdGUgPSAxOworCQlwYXlsb2FkLT5zaXplID0gc2l6ZTsKKwkJbWVtY3B5KHBheWxvYWQtPmRhdGEsIGRhdGEsIHNpemUpOworCQlyYyA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsCisJCQkJKHVpbnQzMl90ICopcGF5bG9hZCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiRFRTX0VBR0xFX0NPUkUgLSAlczogZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkLT5oZHIub3Bjb2RlLCByYyk7CisJCX0KKwkJa2ZyZWUocGF5bG9hZCk7CisJfQorCitleGl0OgorCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjb3JlX2R0c19lYWdsZV9nZXQoaW50IGlkLCBpbnQgc2l6ZSwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXByX2hkciBhaDsKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoIkRUU19FQUdMRV9DT1JFIC0gJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoc2l6ZSA8PSAwIHx8ICFkYXRhKSB7CisJCXByX2VycigiRFRTX0VBR0xFX0NPUkUgLSAlczogaW52YWxpZCBzaXplICVpIG9yIHBvaW50ZXIgJXBLLlxuIiwKKwkJCV9fZnVuY19fLCBzaXplLCBkYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisJb2NtX2NvcmVfb3BlbigpOworCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EpIHsKKwkJYWguaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfRVZFTlQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCQlhaC5wa3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcik7CisJCWFoLnNyY19wb3J0ID0gMDsKKwkJYWguZGVzdF9wb3J0ID0gMDsKKwkJYWgudG9rZW4gPSAwOworCQlhaC5vcGNvZGUgPSBpZDsKKworCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKKwkJZ2VuZXJpY19nZXRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZW5lcmljX2dldF9kYXRhXykKKwkJCQkJICAgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFnZW5lcmljX2dldF9kYXRhKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlyYyA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsCisJCQkJKHVpbnQzMl90ICopJmFoKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJEVFNfRUFHTEVfQ09SRSAtICVzOiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCisJCQkJX19mdW5jX18sIGFoLm9wY29kZSwgcmMpOworCQkJZ290byBleGl0OworCQl9CisKKwkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQsCisJCQkJKHE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPT0gMSksCisJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCWlmICghcmMpIHsKKwkJCXByX2VycigiRFRTX0VBR0xFX0NPUkUgLSAlczogRUFHTEUgZ2V0IHBhcmFtcyB0aW1lZCBvdXRcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBleGl0OworCQl9CisJCWlmIChnZW5lcmljX2dldF9kYXRhLT52YWxpZCkgeworCQkJcmMgPSAwOworCQkJbWVtY3B5KGRhdGEsIGdlbmVyaWNfZ2V0X2RhdGEtPmludHMsIHNpemUpOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlOVkFMOworCQkJcHJfZXJyKCJEVFNfRUFHTEVfQ09SRSAtICVzOiBFQUdMRSBnZXQgcGFyYW1zIHByb2JsZW0gZ2V0dGluZyBkYXRhIC0gY2hlY2sgY2FsbGJhY2sgZXJyb3IgdmFsdWVcbiIsCisJCQkJX19mdW5jX18pOworCQl9CisJfQorCitleGl0OgorCWtmcmVlKGdlbmVyaWNfZ2V0X2RhdGEpOworCWdlbmVyaWNfZ2V0X2RhdGEgPSBOVUxMOworCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKKwlyZXR1cm4gcmM7Cit9CisKK3VpbnQzMl90IGNvcmVfc2V0X2RvbGJ5X21hbnVmYWN0dXJlcl9pZChpbnQgbWFudWZhY3R1cmVyX2lkKQoreworCXN0cnVjdCBhZHNwX2RvbGJ5X21hbnVmYWN0dXJlcl9pZCBwYXlsb2FkOworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IG1hbnVmYWN0dXJlcl9pZCA6JWRcbiIsIF9fZnVuY19fLCBtYW51ZmFjdHVyZXJfaWQpOworCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisJb2NtX2NvcmVfb3BlbigpOworCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EpIHsKKwkJcGF5bG9hZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfRVZFTlQsCisJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJCXBheWxvYWQuaGRyLnBrdF9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3QgYWRzcF9kb2xieV9tYW51ZmFjdHVyZXJfaWQpOworCQlwYXlsb2FkLmhkci5zcmNfcG9ydCA9IDA7CisJCXBheWxvYWQuaGRyLmRlc3RfcG9ydCA9IDA7CisJCXBheWxvYWQuaGRyLnRva2VuID0gMDsKKwkJcGF5bG9hZC5oZHIub3Bjb2RlID0gQURTUF9DTURfU0VUX0RPTEJZX01BTlVGQUNUVVJFUl9JRDsKKwkJcGF5bG9hZC5tYW51ZmFjdHVyZXJfaWQgPSBtYW51ZmFjdHVyZXJfaWQ7CisJCXByX2RlYnVnKCIlczogU2VuZCBEb2xieSBzZWN1cml0eSBvcGNvZGU9MHgleCBtYW51ZmFjdHVyZXIgSUQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJcGF5bG9hZC5oZHIub3Bjb2RlLCBwYXlsb2FkLm1hbnVmYWN0dXJlcl9pZCk7CisJCXJjID0gYXByX3NlbmRfcGt0KHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSwKKwkJCQkJCSh1aW50MzJfdCAqKSZwYXlsb2FkKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiJXM6IFNFVF9ET0xCWV9NQU5VRkFDVFVSRVJfSUQgZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkLmhkci5vcGNvZGUsIHJjKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOworCXJldHVybiByYzsKK30KKworYm9vbCBxNmNvcmVfaXNfYWRzcF9yZWFkeSh2b2lkKQoreworCWludCByYzsKKwlib29sIHJldCA9IGZhbHNlOworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKworCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCWhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwloZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLCAwKTsKKwloZHIub3Bjb2RlID0gQVZDU19DTURfQURTUF9FVkVOVF9HRVRfU1RBVEU7CisKKwltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOworCW9jbV9jb3JlX29wZW4oKTsKKwlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKKwlyYyA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsICh1aW50MzJfdCAqKSZoZHIpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCIlczogR2V0IEFEU1Agc3RhdGUgQVBSIHBhY2tldCBzZW5kIGV2ZW50ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBiYWlsOworCX0KKworCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0LAorCQkJCShxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID09IDEpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoUTZfUkVBRFlfVElNRU9VVF9NUykpOworCWlmIChyYyA+IDAgJiYgcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCkgeworCQkvKiBlbnN1cmUgdG8gcmVhZCB1cGRhdGVkIHBhcmFtIGJ5IGNhbGxiYWNrIHRocmVhZCAqLworCQlybWIoKTsKKwkJcmV0ID0gISFxNmNvcmVfbGNsLnBhcmFtOworCX0KK2JhaWw6CisJcHJfZGVidWcoIiVzOiBsZWF2ZSwgcmMgJWQsIGFkc3AgcmVhZHkgJWRcbiIsIF9fZnVuY19fLCByYywgcmV0KTsKKwltdXRleF91bmxvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHE2Y29yZV9tYXBfbWVtb3J5X3JlZ2lvbnMocGh5c19hZGRyX3QgKmJ1Zl9hZGQsIHVpbnQzMl90IG1lbXBvb2xfaWQsCisJCQl1aW50MzJfdCAqYnVmc3osIHVpbnQzMl90IGJ1ZmNudCwgdWludDMyX3QgKm1hcF9oYW5kbGUpCit7CisJc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqbW1hcF9yZWdpb25zID0gTlVMTDsKKwlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKm1yZWdpb25zID0gTlVMTDsKKwl2b2lkICptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOworCXZvaWQgKnBheWxvYWQgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKwlpbnQgY21kX3NpemUgPSAwOworCisJY21kX3NpemUgPSBzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykKKwkJCSsgc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkKKwkJCSogYnVmY250OworCisJbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG1tYXBfcmVnaW9uX2NtZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1tYXBfcmVnaW9ucyA9IChzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICopbW1hcF9yZWdpb25fY21kOworCW1tYXBfcmVnaW9ucy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJCQlBUFJfUEtUX1ZFUik7CisJbW1hcF9yZWdpb25zLT5oZHIucGt0X3NpemUgPSBjbWRfc2l6ZTsKKwltbWFwX3JlZ2lvbnMtPmhkci5zcmNfcG9ydCA9IDA7CisJbW1hcF9yZWdpb25zLT5oZHIuZGVzdF9wb3J0ID0gMDsKKwltbWFwX3JlZ2lvbnMtPmhkci50b2tlbiA9IDA7CisJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQVZDU19DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzsKKwltbWFwX3JlZ2lvbnMtPm1lbV9wb29sX2lkID0gQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MICYgMHgwMGZmOworCW1tYXBfcmVnaW9ucy0+bnVtX3JlZ2lvbnMgPSBidWZjbnQgJiAweDAwZmY7CisJbW1hcF9yZWdpb25zLT5wcm9wZXJ0eV9mbGFnID0gMHgwMDsKKworCXBheWxvYWQgPSAoKHU4ICopIG1tYXBfcmVnaW9uX2NtZCArCisJCQkJc2l6ZW9mKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMpKTsKKwltcmVnaW9ucyA9IChzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOworCisJZm9yIChpID0gMDsgaSA8IGJ1ZmNudDsgaSsrKSB7CisJCW1yZWdpb25zLT5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGRbaV0pOworCQltcmVnaW9ucy0+c2htX2FkZHJfbXN3ID0KKwkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkW2ldKTsKKwkJbXJlZ2lvbnMtPm1lbV9zaXplX2J5dGVzID0gYnVmc3pbaV07CisJCSsrbXJlZ2lvbnM7CisJfQorCisJcHJfZGVidWcoIiVzOiBzZW5kaW5nIG1lbW9yeSBtYXAsIGFkZHIgJXBLLCBzaXplICVkLCBidWZjbnQgPSAlZFxuIiwKKwkJX19mdW5jX18sIGJ1Zl9hZGQsIGJ1ZnN6WzBdLCBtbWFwX3JlZ2lvbnMtPm51bV9yZWdpb25zKTsKKworCSptYXBfaGFuZGxlID0gMDsKKwlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKikKKwkJbW1hcF9yZWdpb25zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBtbWFwIHJlZ2lvbnMgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQsCisJCQkJKHE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPT0gMSksCisJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnkgbWFwXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FVElNRTsKKwkJZ290byBkb25lOworCX0KKworCSptYXBfaGFuZGxlID0gcTZjb3JlX2xjbC5tZW1fbWFwX2NhbF9oYW5kbGU7Citkb25lOgorCWtmcmVlKG1tYXBfcmVnaW9uX2NtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmNvcmVfbWVtb3J5X3VubWFwX3JlZ2lvbnModWludDMyX3QgbWVtX21hcF9oYW5kbGUpCit7CisJc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIHVubWFwX3JlZ2lvbnM7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJnVubWFwX3JlZ2lvbnMsIDAsIHNpemVvZih1bm1hcF9yZWdpb25zKSk7CisJdW5tYXBfcmVnaW9ucy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCXVubWFwX3JlZ2lvbnMuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHVubWFwX3JlZ2lvbnMpOworCXVubWFwX3JlZ2lvbnMuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FEU1BfQ09SRTsKKwl1bm1hcF9yZWdpb25zLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCXVubWFwX3JlZ2lvbnMuaGRyLnNyY19wb3J0ID0gMDsKKwl1bm1hcF9yZWdpb25zLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOworCXVubWFwX3JlZ2lvbnMuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCXVubWFwX3JlZ2lvbnMuaGRyLmRlc3RfcG9ydCA9IDA7CisJdW5tYXBfcmVnaW9ucy5oZHIudG9rZW4gPSAwOworCXVubWFwX3JlZ2lvbnMuaGRyLm9wY29kZSA9IEFWQ1NfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzsKKwl1bm1hcF9yZWdpb25zLm1lbV9tYXBfaGFuZGxlID0gbWVtX21hcF9oYW5kbGU7CisKKwlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKKworCXByX2RlYnVnKCIlczogdW5tYXAgcmVnaW9ucyBtYXAgaGFuZGxlICVkXG4iLAorCQlfX2Z1bmNfXywgbWVtX21hcF9oYW5kbGUpOworCisJcmV0ID0gYXByX3NlbmRfcGt0KHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSwgKHVpbnQzMl90ICopCisJCSZ1bm1hcF9yZWdpb25zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiB1bm1hcCByZWdpb25zIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0LAorCQkJCShxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID09IDEpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X3VubWFwXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXQgPSAtRVRJTUU7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcTZjb3JlX2RlcmVnX2FsbF9jdXN0b21fdG9wb2xvZ2llcyh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhdmNzX2NtZF9kZXJlZ2lzdGVyX3RvcG9sb2dpZXMgZGVyZWdfdG9wOworCisJbWVtc2V0KCZkZXJlZ190b3AsIDAsIHNpemVvZihkZXJlZ190b3ApKTsKKwlkZXJlZ190b3AuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlkZXJlZ190b3AuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGRlcmVnX3RvcCk7CisJZGVyZWdfdG9wLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRFNQX0NPUkU7CisJZGVyZWdfdG9wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWRlcmVnX3RvcC5oZHIuc3JjX3BvcnQgPSAwOworCWRlcmVnX3RvcC5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FEU1BfQ09SRTsKKwlkZXJlZ190b3AuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWRlcmVnX3RvcC5oZHIuZGVzdF9wb3J0ID0gMDsKKwlkZXJlZ190b3AuaGRyLnRva2VuID0gMDsKKwlkZXJlZ190b3AuaGRyLm9wY29kZSA9IEFWQ1NfQ01EX0RFUkVHSVNURVJfVE9QT0xPR0lFUzsKKwlkZXJlZ190b3AucGF5bG9hZF9hZGRyX2xzdyA9IDA7CisJZGVyZWdfdG9wLnBheWxvYWRfYWRkcl9tc3cgPSAwOworCWRlcmVnX3RvcC5tZW1fbWFwX2hhbmRsZSA9IDA7CisJZGVyZWdfdG9wLnBheWxvYWRfc2l6ZSA9IDA7CisJZGVyZWdfdG9wLm1vZGUgPSBBVkNTX01PREVfREVSRUdJU1RFUl9BTExfQ1VTVE9NX1RPUE9MT0dJRVM7CisKKwlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKKworCXByX2RlYnVnKCIlczogRGVyZWdpc3RlciB0b3BvbG9naWVzIG1vZGUgJWRcbiIsCisJCV9fZnVuY19fLCBkZXJlZ190b3AubW9kZSk7CisKKwlyZXQgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKikgJmRlcmVnX3RvcCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRGVyZWdpc3RlciB0b3BvbG9naWVzIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0LAorCQkJCShxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID09IDEpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCBmb3IgRGVyZWdpc3RlciB0b3BvbG9naWVzXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHE2Y29yZV9zZW5kX2N1c3RvbV90b3BvbG9naWVzKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJldDIgPSAwOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgYXZjc19jbWRfcmVnaXN0ZXJfdG9wb2xvZ2llcyByZWdfdG9wOworCisJaWYgKCFxNmNvcmVfaXNfYWRzcF9yZWFkeSgpKSB7CisJCXByX2VycigiJXM6IEFEU1AgaXMgbm90IHJlYWR5IVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1zZXQoJnJlZ190b3AsIDAsIHNpemVvZihyZWdfdG9wKSk7CisJbXV0ZXhfbG9jaygmcTZjb3JlX2xjbC5jYWxfZGF0YVtDVVNUX1RPUF9DQUxdLT5sb2NrKTsKKwltdXRleF9sb2NrKCZxNmNvcmVfbGNsLmNtZF9sb2NrKTsKKworCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCisJCXE2Y29yZV9sY2wuY2FsX2RhdGFbQ1VTVF9UT1BfQ0FMXSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCIlczogY2FsIGJsb2NrIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBjYWwgc2l6ZSBpcyAlemQgbm90IHNlbmRpbmdcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcTZjb3JlX2RlcmVnX2FsbF9jdXN0b21fdG9wb2xvZ2llcygpOworCisJcmV0ID0gcTZjb3JlX21hcF9tZW1vcnlfcmVnaW9ucygmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwgMCwKKwkJKHVpbnQzMl90ICopJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIDEsCisJCSZjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7CisJaWYgKCFyZXQpICB7CisJCXByX2VycigiJXM6IHE2Y29yZV9tYXBfbWVtb3J5X3JlZ2lvbnMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJlZ190b3AuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlyZWdfdG9wLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihyZWdfdG9wKTsKKwlyZWdfdG9wLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRFNQX0NPUkU7CisJcmVnX3RvcC5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlyZWdfdG9wLmhkci5zcmNfcG9ydCA9IDA7CisJcmVnX3RvcC5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FEU1BfQ09SRTsKKwlyZWdfdG9wLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlyZWdfdG9wLmhkci5kZXN0X3BvcnQgPSAwOworCXJlZ190b3AuaGRyLnRva2VuID0gMDsKKwlyZWdfdG9wLmhkci5vcGNvZGUgPSBBVkNTX0NNRF9SRUdJU1RFUl9UT1BPTE9HSUVTOworCXJlZ190b3AucGF5bG9hZF9hZGRyX2xzdyA9CisJCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJcmVnX3RvcC5wYXlsb2FkX2FkZHJfbXN3ID0KKwkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJcmVnX3RvcC5tZW1fbWFwX2hhbmRsZSA9IGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOworCXJlZ190b3AucGF5bG9hZF9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOworCisJcTZjb3JlX2xjbC5hZHNwX3N0YXR1cyA9IDA7CisJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIHRvcG9sb2dpZXMgYWRkciAlcEssIHNpemUgJXpkLCBtYXAgaGFuZGxlICVkXG4iLAorCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOworCisJcmV0ID0gYXByX3NlbmRfcGt0KHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSwgKHVpbnQzMl90ICopICZyZWdfdG9wKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBSZWdpc3RlciB0b3BvbG9naWVzIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXQpOworCQlnb3RvIHVubWFwOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCwKKwkJCQkocTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9PSAxKSwKKwkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgZm9yIFJlZ2lzdGVyIHRvcG9sb2dpZXNcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gdW5tYXA7CisJfQorCisJaWYgKHE2Y29yZV9sY2wuYWRzcF9zdGF0dXMgPCAwKQorCQlyZXQgPSBxNmNvcmVfbGNsLmFkc3Bfc3RhdHVzOwordW5tYXA6CisJcmV0MiA9IHE2Y29yZV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7CisJaWYgKCFyZXQyKSAgeworCQlwcl9lcnIoIiVzOiBxNmNvcmVfbWVtb3J5X3VubWFwX3JlZ2lvbnMgZmFpbGVkIGZvciBtYXAgaGFuZGxlICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKKwkJcmV0ID0gcmV0MjsKKwkJZ290byB1bmxvY2s7CisJfQorCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZxNmNvcmVfbGNsLmNtZF9sb2NrKTsKKwltdXRleF91bmxvY2soJnE2Y29yZV9sY2wuY2FsX2RhdGFbQ1VTVF9UT1BfQ0FMXS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9jYWxfdHlwZV9pbmRleChpbnQzMl90IGNhbF90eXBlKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChjYWxfdHlwZSkgeworCWNhc2UgQVVESU9fQ09SRV9NRVRBSU5GT19DQUxfVFlQRToKKwkJcmV0ID0gTUVUQV9DQUw7CisJCWJyZWFrOworCWNhc2UgQ09SRV9DVVNUT01fVE9QT0xPR0lFU19DQUxfVFlQRToKKwkJcmV0ID0gQ1VTVF9UT1BfQ0FMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmNvcmVfYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsCisJCQkgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCXE2Y29yZV9sY2wuY2FsX2RhdGFbY2FsX2luZGV4XSwgMCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2FsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHE2Y29yZV9kZWFsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLAorCQkJICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCisJcmV0ID0gY2FsX3V0aWxzX2RlYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKKwkJCQkJcTZjb3JlX2xjbC5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfZGVhbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmNvcmVfc2V0X2NhbChpbnQzMl90IGNhbF90eXBlLAorCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKworCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7CisJaWYgKGNhbF9pbmRleCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCXJldCA9IGNhbF91dGlsc19zZXRfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKKwkJCQkgICAgcTZjb3JlX2xjbC5jYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNhbF9pbmRleCA9PSBDVVNUX1RPUF9DQUwpCisJCXJldCA9IHE2Y29yZV9zZW5kX2N1c3RvbV90b3BvbG9naWVzKCk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHE2Y29yZV9kZWxldGVfY2FsX2RhdGEodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoQ09SRV9NQVhfQ0FMLCBxNmNvcmVfbGNsLmNhbF9kYXRhKTsKK30KKworCitzdGF0aWMgaW50IHE2Y29yZV9pbml0X2NhbF9kYXRhKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNhbF90eXBlX2luZm8gICAgY2FsX3R5cGVfaW5mb1tdID0geworCQl7e0FVRElPX0NPUkVfTUVUQUlORk9fQ0FMX1RZUEUsCisJCXtxNmNvcmVfYWxsb2NfY2FsLCBxNmNvcmVfZGVhbGxvY19jYWwsIE5VTEwsCisJCXE2Y29yZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tDT1JFX0NVU1RPTV9UT1BPTE9HSUVTX0NBTF9UWVBFLAorCQl7cTZjb3JlX2FsbG9jX2NhbCwgcTZjb3JlX2RlYWxsb2NfY2FsLCBOVUxMLAorCQlxNmNvcmVfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9CisJfTsKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBjYWxfdXRpbHNfY3JlYXRlX2NhbF90eXBlcyhDT1JFX01BWF9DQUwsCisJCXE2Y29yZV9sY2wuY2FsX2RhdGEsIGNhbF90eXBlX2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBjcmVhdGUgY2FsIHR5cGUhXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gcmV0OworZXJyOgorCXE2Y29yZV9kZWxldGVfY2FsX2RhdGEoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb3JlX2luaXQodm9pZCkKK3sKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7CisJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDA7CisKKwlxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPSBOVUxMOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcTZjb3JlX2xjbC5jbWRfcmVxX3dhaXQpOworCXE2Y29yZV9sY2wuY21kX3Jlc3BfcmVjZWl2ZWRfZmxhZyA9IEZMQUdfTk9ORTsKKwltdXRleF9pbml0KCZxNmNvcmVfbGNsLmNtZF9sb2NrKTsKKwlxNmNvcmVfbGNsLm1lbV9tYXBfY2FsX2hhbmRsZSA9IDA7CisJcTZjb3JlX2xjbC5hZHNwX3N0YXR1cyA9IDA7CisKKwlxNmNvcmVfaW5pdF9jYWxfZGF0YSgpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoY29yZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGNvcmVfZXhpdCh2b2lkKQoreworCW11dGV4X2Rlc3Ryb3koJnE2Y29yZV9sY2wuY21kX2xvY2spOworCXE2Y29yZV9kZWxldGVfY2FsX2RhdGEoKTsKK30KK21vZHVsZV9leGl0KGNvcmVfZXhpdCk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFEU1AgY29yZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmxzbS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2bHNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2MWNmNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmxzbS5jCkBAIC0wLDAgKzEsMTk1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL2xzbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmNvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmxzbS5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hdWRpb19jYWxfdXRpbHMuaD4KKyNpbmNsdWRlIDxzb3VuZC9hZHNwX2Vyci5oPgorCisjZGVmaW5lIEFQUl9USU1FT1VUCSg1ICogSFopCisjZGVmaW5lIExTTV9BTElHTl9CT1VOREFSWSA1MTIKKyNkZWZpbmUgTFNNX1NBTVBMRV9SQVRFIDE2MDAwCisjZGVmaW5lIFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTiAxCitzdGF0aWMgaW50IGxzbV9hZmVfcG9ydDsKKworZW51bSB7CisJTFNNX0NVU1RPTV9UT1BfSURYLAorCUxTTV9UT1BfSURYLAorCUxTTV9DQUxfSURYLAorCUxTTV9NQVhfQ0FMX0lEWAorfTsKKworZW51bSB7CisJQ01EX1NUQVRFX0NMRUFSRUQgPSAwLAorCUNNRF9TVEFURV9XQUlUX1JFU1AgPSAxLAorfTsKKworZW51bSB7CisJTFNNX0lOVkFMSURfU0VTU0lPTl9JRCA9IDAsCisJTFNNX01JTl9TRVNTSU9OX0lEID0gMSwKKwlMU01fTUFYX1NFU1NJT05fSUQgPSA4LAorCUxTTV9DT05UUk9MX1NFU1NJT04gPSAweDBGLAorfTsKKworI2RlZmluZSBDSEVDS19TRVNTSU9OKHgpICh4IDwgTFNNX01JTl9TRVNTSU9OX0lEIHx8IHggPiBMU01fTUFYX1NFU1NJT05fSUQpCitzdHJ1Y3QgbHNtX2NvbW1vbiB7CisJdm9pZCAqYXByOworCWF0b21pY190IGFwcl91c2VyczsKKwlzdHJ1Y3QgbHNtX2NsaWVudAljb21tb25fY2xpZW50W0xTTV9NQVhfU0VTU0lPTl9JRCArIDFdOworCisJaW50IHNldF9jdXN0b21fdG9wb2xvZ3k7CisJc3RydWN0IGNhbF90eXBlX2RhdGEJKmNhbF9kYXRhW0xTTV9NQVhfQ0FMX0lEWF07CisKKwlzdHJ1Y3QgbXV0ZXggYXByX2xvY2s7Cit9OworCitzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgeworCXVpbnQzMl90IG1vZHVsZV9pZDsKKwl1aW50MzJfdCBwYXJhbV9pZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbHNtX2NvbW1vbiBsc21fY29tbW9uOworLyoKKyAqIG1tYXBfaGFuZGxlX3AgY2FuIHBvaW50IGVpdGhlciBjbGllbnQtPnNvdW5kX21vZGVsLm1lbV9tYXBfaGFuZGxlIG9yCisgKiBsc21fY29tbW9uLm1tYXBfaGFuZGxlX2Zvcl9jYWwuCisgKiBtbWFwX2xvY2sgbXVzdCBiZSBoZWxkIHdoaWxlIGFjY2Vzc2luZyB0aGlzLgorICovCitzdGF0aWMgc3BpbmxvY2tfdCBtbWFwX2xvY2s7CitzdGF0aWMgdWludDMyX3QgKm1tYXBfaGFuZGxlX3A7CisKK3N0YXRpYyBzcGlubG9ja190IGxzbV9zZXNzaW9uX2xvY2s7CitzdGF0aWMgc3RydWN0IGxzbV9jbGllbnQgKmxzbV9zZXNzaW9uW0xTTV9NQVhfU0VTU0lPTl9JRCArIDFdOworCitzdGF0aWMgaW50IHE2bHNtX21tYXBjYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKK3N0YXRpYyBpbnQgcTZsc21fc2VuZF9jYWwoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgdTMyIHNldF9wYXJhbXNfb3Bjb2RlKTsKK3N0YXRpYyBpbnQgcTZsc21fbWVtb3J5X21hcF9yZWdpb25zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkJICAgIGRtYV9hZGRyX3QgZG1hX2FkZHJfcCwgdWludDMyX3QgZG1hX2J1Zl9zeiwKKwkJCQkgICAgdWludDMyX3QgKm1tYXBfcCk7CitzdGF0aWMgaW50IHE2bHNtX21lbW9yeV91bm1hcF9yZWdpb25zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgdWludDMyX3QgaGFuZGxlKTsKKworc3RhdGljIHZvaWQgcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKAorCQlzdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyICpwYXJhbV9oZHIsCisJCXUzMiBwYXlsb2FkX3NpemUsIHUzMiBhZGRyX2xzdywgdTMyIGFkZHJfbXN3LAorCQl1MzIgbW1hcF9oYW5kbGUpCit7CisJcGFyYW1faGRyLT5kYXRhX3BheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKwlwYXJhbV9oZHItPmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IGFkZHJfbHN3OworCXBhcmFtX2hkci0+ZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gYWRkcl9tc3c7CisJcGFyYW1faGRyLT5tZW1fbWFwX2hhbmRsZSA9IG1tYXBfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBxNmxzbV9zZXRfcGFyYW1fY29tbW9uKAorCQlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uICpjb21tb24sCisJCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyAqaWRzLAorCQl1MzIgcGFyYW1fc2l6ZSwgdTMyIHNldF9wYXJhbV92ZXJzaW9uKQoreworCWNvbW1vbi0+bW9kdWxlX2lkID0gaWRzLT5tb2R1bGVfaWQ7CisJY29tbW9uLT5wYXJhbV9pZCA9IGlkcy0+cGFyYW1faWQ7CisKKwlzd2l0Y2ggKHNldF9wYXJhbV92ZXJzaW9uKSB7CisJY2FzZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjoKKwkJY29tbW9uLT5wX3NpemUucGFyYW1fc2l6ZSA9IHBhcmFtX3NpemU7CisJCWJyZWFrOworCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVM6CisJZGVmYXVsdDoKKwkJY29tbW9uLT5wX3NpemUuc3IucGFyYW1fc2l6ZSA9CisJCQkodTE2KSBwYXJhbV9zaXplOworCQljb21tb24tPnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBxNmxzbV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQgPSAoc3RydWN0IGxzbV9jbGllbnQgKilwcml2OworCXVpbnQzMl90IHRva2VuOworCXVpbnQzMl90ICpwYXlsb2FkOworCisJaWYgKCFjbGllbnQgfHwgIWRhdGEpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50ICVwSyBkYXRhICVwS1xuIiwKKwkJCV9fZnVuY19fLCBjbGllbnQsIGRhdGEpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGF0YS0+b3Bjb2RlID09IFJFU0VUX0VWRU5UUykgeworCQlwcl9kZWJ1ZygiJXM6IFNTUiBldmVudCByZWNlaXZlZCAweCV4LCBldmVudCAweCV4LCBwcm9jIDB4JXhcbiIsCisJCQkgX19mdW5jX18sIGRhdGEtPm9wY29kZSwgZGF0YS0+cmVzZXRfZXZlbnQsCisJCQkgZGF0YS0+cmVzZXRfcHJvYyk7CisKKwkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoTFNNX01BWF9DQUxfSURYLAorCQkJbHNtX2NvbW1vbi5jYWxfZGF0YSk7CisJCW11dGV4X2xvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXS0+bG9jayk7CisJCWxzbV9jb21tb24uc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7CisJCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ1VTVE9NX1RPUF9JRFhdLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7CisJcHJfZGVidWcoIiVzOiBTZXNzaW9uICVkIG9wY29kZSAweCV4IHRva2VuIDB4JXggcGF5bG9hZCBzaXplICVkXG4iCisJCQkgInBheWxvYWQgWzBdID0gMHgleFxuIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbiwKKwkJZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLCBwYXlsb2FkWzBdKTsKKwlpZiAoZGF0YS0+b3Bjb2RlID09IExTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSkgeworCQlzdHJ1Y3QgbHNtX2NtZF9yZWFkX2RvbmUgcmVhZF9kb25lOworCisJCXRva2VuID0gZGF0YS0+dG9rZW47CisJCWlmIChkYXRhLT5wYXlsb2FkX3NpemUgPiBzaXplb2YocmVhZF9kb25lKSkgeworCQkJcHJfZXJyKCIlczogcmVhZCBkb25lIGVycm9yIHBheWxvYWQgc2l6ZSAlZCBleHBlY3RlZCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGF0YS0+cGF5bG9hZF9zaXplLAorCQkJCXNpemVvZihyZWFkX2RvbmUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXByX2RlYnVnKCIlczogb3Bjb2RlICV4IHN0YXR1cyAleCBsc3cgJXggbXN3ICV4IG1lbV9tYXAgaGFuZGxlICV4XG4iLAorCQkJX19mdW5jX18sIGRhdGEtPm9wY29kZSwgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwKKwkJCXBheWxvYWRbMl0sIHBheWxvYWRbM10pOworCQlyZWFkX2RvbmUuc3RhdHVzID0gcGF5bG9hZFswXTsKKwkJcmVhZF9kb25lLmJ1Zl9hZGRyX2xzdyA9IHBheWxvYWRbMV07CisJCXJlYWRfZG9uZS5idWZfYWRkcl9tc3cgPSBwYXlsb2FkWzJdOworCQlyZWFkX2RvbmUubWVtX21hcF9oYW5kbGUgPSBwYXlsb2FkWzNdOworCQlyZWFkX2RvbmUudG90YWxfc2l6ZSA9IHBheWxvYWRbNF07CisJCXJlYWRfZG9uZS5vZmZzZXQgPSBwYXlsb2FkWzVdOworCQlpZiAoY2xpZW50LT5jYikKKwkJCWNsaWVudC0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKKwkJCQkJKHZvaWQgKikmcmVhZF9kb25lLAorCQkJCQljbGllbnQtPnByaXYpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgeworCQl0b2tlbiA9IGRhdGEtPnRva2VuOworCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKKwkJY2FzZSBMU01fU0VTU0lPTl9DTURfU1RBUlQ6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NUT1A6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVM6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX09QRU5fVFg6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX0NMT1NFX1RYOgorCQljYXNlIExTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9TT1VORF9NT0RFTDoKKwkJY2FzZSBMU01fU0VTU0lPTl9DTURfREVSRUdJU1RFUl9TT1VORF9NT0RFTDoKKwkJY2FzZSBMU01fU0VTU0lPTl9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOgorCQljYXNlIExTTV9TRVNTSU9OX0NNRF9FT0I6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX1JFQUQ6CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX09QRU5fVFhfVjI6CisJCWNhc2UgTFNNX0NNRF9BRERfVE9QT0xPR0lFUzoKKwkJY2FzZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjoKKwkJCWlmICh0b2tlbiAhPSBjbGllbnQtPnNlc3Npb24gJiYKKwkJCSAgICBwYXlsb2FkWzBdICE9CisJCQkJTFNNX1NFU1NJT05fQ01EX0RFUkVHSVNURVJfU09VTkRfTU9ERUwpIHsKKwkJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb24gJWQgcmVjZWl2Y2VkIGV4cGVjdGVkICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgdG9rZW4sIGNsaWVudC0+c2Vzc2lvbik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQljbGllbnQtPmNtZF9lcnJfY29kZSA9IHBheWxvYWRbMV07CisJCQlpZiAoY2xpZW50LT5jbWRfZXJyX2NvZGUpCisJCQkJcHJfZXJyKCIlczogY21kIDB4JXggZmFpbGVkIHN0YXR1cyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgY2xpZW50LT5jbWRfZXJyX2NvZGUpOworCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZjbGllbnQtPmNtZF9zdGF0ZSwKKwkJCQkJICAgQ01EX1NUQVRFX1dBSVRfUkVTUCwKKwkJCQkJICAgQ01EX1NUQVRFX0NMRUFSRUQpID09CisJCQkJCSAgICAgICBDTURfU1RBVEVfV0FJVF9SRVNQKQorCQkJCXdha2VfdXAoJmNsaWVudC0+Y21kX3dhaXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9kZWJ1ZygiJXM6IFVua25vd24gY29tbWFuZCAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChjbGllbnQtPmNiKQorCQljbGllbnQtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sIGRhdGEtPnBheWxvYWQsCisJCQkgICBjbGllbnQtPnByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcTZsc21fc2Vzc2lvbl9hbGxvYyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG4sIHJldCA9IC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHNtX3Nlc3Npb25fbG9jaywgZmxhZ3MpOworCWZvciAobiA9IExTTV9NSU5fU0VTU0lPTl9JRDsgbiA8PSBMU01fTUFYX1NFU1NJT05fSUQ7IG4rKykgeworCQlpZiAoIWxzbV9zZXNzaW9uW25dKSB7CisJCQlsc21fc2Vzc2lvbltuXSA9IGNsaWVudDsKKwkJCXJldCA9IG47CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsc21fc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJcHJfZGVidWcoIiVzOiBBbGxvYyBTZXNzaW9uICVkIiwgX19mdW5jX18sIG4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHE2bHNtX3Nlc3Npb25fZnJlZShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6IEZyZWVpbmcgc2Vzc2lvbiBJRCAlZFxuIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxzbV9zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwlsc21fc2Vzc2lvbltjbGllbnQtPnNlc3Npb25dID0gTFNNX0lOVkFMSURfU0VTU0lPTl9JRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsc21fc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisJY2xpZW50LT5zZXNzaW9uID0gTFNNX0lOVkFMSURfU0VTU0lPTl9JRDsKK30KKworc3RhdGljIHZvaWQgKnE2bHNtX21tYXBfYXByX3JlZyh2b2lkKQoreworCWlmIChhdG9taWNfaW5jX3JldHVybigmbHNtX2NvbW1vbi5hcHJfdXNlcnMpID09IDEpIHsKKwkJbHNtX2NvbW1vbi5hcHIgPQorCQkgICAgYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkxTTSIsIHE2bHNtX21tYXBjYWxsYmFjaywKKwkJCQkgMHgwRkZGRkZGRkYsICZsc21fY29tbW9uKTsKKwkJaWYgKCFsc21fY29tbW9uLmFwcikgeworCQkJcHJfZGVidWcoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQVBSIExTTSBjb21tb24gcG9ydFxuIiwKKwkJCQkgX19mdW5jX18pOworCQkJYXRvbWljX2RlYygmbHNtX2NvbW1vbi5hcHJfdXNlcnMpOworCQl9CisJfQorCXJldHVybiBsc21fY29tbW9uLmFwcjsKK30KKworc3RhdGljIGludCBxNmxzbV9tbWFwX2Fwcl9kZXJlZyh2b2lkKQoreworCWlmIChhdG9taWNfcmVhZCgmbHNtX2NvbW1vbi5hcHJfdXNlcnMpIDw9IDApIHsKKwkJV0FSTigiJXM6IEFQUiBjb21tb24gcG9ydCBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOworCX0gZWxzZSB7CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmbHNtX2NvbW1vbi5hcHJfdXNlcnMpID09IDApIHsKKwkJCWFwcl9kZXJlZ2lzdGVyKGxzbV9jb21tb24uYXByKTsKKwkJCXByX2RlYnVnKCIlczogQVBSIERlLVJlZ2lzdGVyIGNvbW1vbiBwb3J0XG4iLCBfX2Z1bmNfXyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsc21fY2xpZW50ICpxNmxzbV9jbGllbnRfYWxsb2MobHNtX2FwcF9jYiBjYiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50OworCWludCBuOworCisJY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxzbV9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuIE5VTEw7CisJbiA9IHE2bHNtX3Nlc3Npb25fYWxsb2MoY2xpZW50KTsKKwlpZiAobiA8PSAwKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiBOVUxMOworCX0KKwljbGllbnQtPnNlc3Npb24gPSBuOworCWNsaWVudC0+Y2IgPSBjYjsKKwljbGllbnQtPnByaXYgPSBwcml2OworCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKKwkJcHJfZXJyKCIlczogQ2xpZW50IHNlc3Npb24gJWRcbiIsCisJCQlfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXByX2RlYnVnKCIlczogQ2xpZW50IFNlc3Npb24gJWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPnNlc3Npb24pOworCWNsaWVudC0+YXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkxTTSIsIHE2bHNtX2NhbGxiYWNrLAorCQkJCSAgICgoY2xpZW50LT5zZXNzaW9uKSA8PCA4IHwgY2xpZW50LT5zZXNzaW9uKSwKKwkJCQkgICBjbGllbnQpOworCisJaWYgKGNsaWVudC0+YXByID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogUmVnaXN0cmF0aW9uIHdpdGggQVBSIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyB0aGUgY29tbW9uIHBvcnQgd2l0aCBBUFJcbiIsIF9fZnVuY19fKTsKKwljbGllbnQtPm1tYXBfYXByID0gcTZsc21fbW1hcF9hcHJfcmVnKCk7CisJaWYgKCFjbGllbnQtPm1tYXBfYXByKSB7CisJCXByX2VycigiJXM6IEFQUiByZWdpc3RyYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjbGllbnQtPmNtZF93YWl0KTsKKwltdXRleF9pbml0KCZjbGllbnQtPmNtZF9sb2NrKTsKKwlhdG9taWNfc2V0KCZjbGllbnQtPmNtZF9zdGF0ZSwgQ01EX1NUQVRFX0NMRUFSRUQpOworCXByX2RlYnVnKCIlczogTmV3IGNsaWVudCBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gY2xpZW50OworZmFpbDoKKwlxNmxzbV9jbGllbnRfZnJlZShjbGllbnQpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHE2bHNtX2NsaWVudF9mcmVlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCit7CisJaWYgKCFjbGllbnQpCisJCXJldHVybjsKKwlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgU2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7CisJCXJldHVybjsKKwl9CisJYXByX2RlcmVnaXN0ZXIoY2xpZW50LT5hcHIpOworCWNsaWVudC0+bW1hcF9hcHIgPSBOVUxMOworCXE2bHNtX3Nlc3Npb25fZnJlZShjbGllbnQpOworCXE2bHNtX21tYXBfYXByX2RlcmVnKCk7CisJbXV0ZXhfZGVzdHJveSgmY2xpZW50LT5jbWRfbG9jayk7CisJa2ZyZWUoY2xpZW50KTsKKwljbGllbnQgPSBOVUxMOworfQorCisvKgorICogcTZsc21fYXByX3NlbmRfcGt0IDogSWYgd2FpdCA9PSB0cnVlLCBob2xkIG11dGV4IHRvIHByZXZlbnQgZnJvbSBwcmVlbXB0aW5nCisgKgkJCW90aGVyIHRocmVhZCdzIHdhaXQuCisgKgkJCUlmIG1tYXBfaGFuZGxlX3AgIT0gTlVMTCwgZGlzYWJsZSBpcnEgYW5kIHNwaW4gbG9jayB0bworICoJCQlwcm90ZWN0IG1tYXBfaGFuZGxlX3AKKyAqLworc3RhdGljIGludCBxNmxzbV9hcHJfc2VuZF9wa3Qoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgdm9pZCAqaGFuZGxlLAorCQkJICAgICAgdm9pZCAqZGF0YSwgYm9vbCB3YWl0LCB1aW50MzJfdCAqbW1hcF9wKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGFwcl9oZHIgKm1zZ19oZHIgPSAoc3RydWN0IGFwcl9oZHIgKikgZGF0YTsKKworCXByX2RlYnVnKCIlczogZW50ZXIgd2FpdCAlZFxuIiwgX19mdW5jX18sIHdhaXQpOworCWlmICh3YWl0KQorCQltdXRleF9sb2NrKCZsc21fY29tbW9uLmFwcl9sb2NrKTsKKwlpZiAobW1hcF9wKSB7CisJCVdBUk5fT04oIXdhaXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbW1hcF9sb2NrLCBmbGFncyk7CisJCW1tYXBfaGFuZGxlX3AgPSBtbWFwX3A7CisJfQorCWF0b21pY19zZXQoJmNsaWVudC0+Y21kX3N0YXRlLCBDTURfU1RBVEVfV0FJVF9SRVNQKTsKKwljbGllbnQtPmNtZF9lcnJfY29kZSA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGhhbmRsZSwgZGF0YSk7CisJaWYgKG1tYXBfcCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW1hcF9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBhcHJfc2VuZF9wa3QgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwl9IGVsc2UgaWYgKHdhaXQpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGNsaWVudC0+Y21kX3dhaXQsCisJCQkJCSAoYXRvbWljX3JlYWQoJmNsaWVudC0+Y21kX3N0YXRlKSA9PQorCQkJCQkgICAgICBDTURfU1RBVEVfQ0xFQVJFRCksCisJCQkJCSBBUFJfVElNRU9VVCk7CisJCWlmIChsaWtlbHkocmV0KSkgeworCQkJLyogcTYgcmV0dXJuZWQgZXJyb3IgKi8KKwkJCWlmIChjbGllbnQtPmNtZF9lcnJfY29kZSkgeworCQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQkJY2xpZW50LT5jbWRfZXJyX2NvZGUpKTsKKwkJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQkJY2xpZW50LT5jbWRfZXJyX2NvZGUpOworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogd2FpdCB0aW1lZG91dCwgYXByX29wY29kZSA9IDB4JXgsIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbXNnX2hkci0+b3Bjb2RlLCBtc2dfaGRyLT5wa3Rfc2l6ZSk7CisJCQkvKiByZXQgPSAwIG1lYW5zIHdhaXQgdGltZWQgb3V0ICovCisJCQlyZXQgPSAtRVRJTUVET1VUOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKHdhaXQpCisJCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5hcHJfbG9jayk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcTZsc21fYWRkX2hkcihzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJdWludDMyX3QgcGt0X3NpemUsIGJvb2wgY21kX2ZsZykKK3sKKwlwcl9kZWJ1ZygiJXM6IHBrdF9zaXplICVkIGNtZF9mbGcgJWQgc2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sCisJCXBrdF9zaXplLCBjbWRfZmxnLCBjbGllbnQtPnNlc3Npb24pOworCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkgICAgICAgQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCisJCQkJICAgICAgIEFQUl9QS1RfVkVSKTsKKwloZHItPnNyY19zdmMgPSBBUFJfU1ZDX0xTTTsKKwloZHItPnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJaGRyLT5kZXN0X3N2YyA9IEFQUl9TVkNfTFNNOworCWhkci0+ZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7CisJaGRyLT5zcmNfcG9ydCA9ICgoY2xpZW50LT5zZXNzaW9uIDw8IDgpICYgMHhGRjAwKSB8IGNsaWVudC0+c2Vzc2lvbjsKKwloZHItPmRlc3RfcG9ydCA9ICgoY2xpZW50LT5zZXNzaW9uIDw8IDgpICYgMHhGRjAwKSB8IGNsaWVudC0+c2Vzc2lvbjsKKwloZHItPnBrdF9zaXplID0gcGt0X3NpemU7CisJaWYgKGNtZF9mbGcpCisJCWhkci0+dG9rZW4gPSBjbGllbnQtPnNlc3Npb247Cit9CisKKworc3RhdGljIGludCBxNmxzbV9zZW5kX2N1c3RvbV90b3BvbG9naWVzKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJjOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlzdHJ1Y3QgbHNtX2N1c3RvbV90b3BvbG9naWVzIGNzdG1fdG9wOworCisJaWYgKGxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IExTTV9DVVNUT01fVE9QX0lEWCBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWxzbV9jb21tb24uc2V0X2N1c3RvbV90b3BvbG9neSA9IDA7CisKKwltdXRleF9sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DVVNUT01fVE9QX0lEWF0tPmxvY2spOworCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCisJCQlsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DVVNUT01fVE9QX0lEWF0pOworCWlmICghY2FsX2Jsb2NrKSB7CisJCXByX2VycigiJXM6IENhbCBibG9jayBmb3IgTFNNX0NVU1RPTV9UT1BfSURYIG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBzaXplIGZvciBMU01fQ1VTVE9NX1RPUCAlemRcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwltZW1zZXQoJmNzdG1fdG9wLCAwLCBzaXplb2YoY3N0bV90b3ApKTsKKwkvKiBNYXAgdGhlIG1lbW9yeSBmb3Igb3V0LW9mLWJhbmQgZGF0YSAqLworCXJjID0gcTZsc21fbWVtb3J5X21hcF9yZWdpb25zKGNsaWVudCwgY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCQkgICAgICBjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLAorCQkJCSAgICAgICZjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gbWFwIGN1c3RvbSB0b3BvbG9naWVkLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmY3N0bV90b3AuaGRyLAorCQkgICAgICBzaXplb2YoY3N0bV90b3ApLCB0cnVlKTsKKwljc3RtX3RvcC5oZHIub3Bjb2RlID0gTFNNX0NNRF9BRERfVE9QT0xPR0lFUzsKKworCS8qCisJICogRm9yIEFERF9UT1BPTE9HSUVTLCB0aGUgZGVzdF9wb3J0IHNob3VsZCBiZSAwCisJICogTm90ZSB0aGF0IHNvdXJjZSBwb3J0IGNhbm5vdCBiZSB6ZXJvIGFzIGl0IGlzIHVzZWQKKwkgKiB0byByb3V0ZSB0aGUgcmVzcG9uc2UgdG8gYSBzcGVjaWZpYyBjbGllbnQgcmVnaXN0ZXJlZAorCSAqIG9uIEFQUgorCSAqLworCWNzdG1fdG9wLmhkci5kZXN0X3BvcnQgPSAwOworCisJY3N0bV90b3AuZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0KKwkJCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJY3N0bV90b3AuZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0KKwkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAorCQkJCQljYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwljc3RtX3RvcC5tZW1fbWFwX2hhbmRsZSA9IGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOworCWNzdG1fdG9wLmJ1ZmZlcl9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOworCisJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKKwkJCQkmY3N0bV90b3AsIHRydWUsIE5VTEwpOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFkZCBjdXN0b20gdG9wLCBlcnIgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJLyogZ28gYWhlYWQgYW5kIHVubWFwIGV2ZW4gaWYgY3VzdG9tIHRvcCBmYWlsZWQgKi8KKwlyYyA9IHE2bHNtX21lbW9yeV91bm1hcF9yZWdpb25zKGNsaWVudCwKKwkJCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gdW5tYXAsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJLyogRXZlbiBpZiBtZW0gdW5tYXAgZmFpbGVkLCB0cmVhdCB0aGUgY21kIGFzIHN1Y2Nlc3MgKi8KKwkJcmMgPSAwOworCX0KKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ1VTVE9NX1RPUF9JRFhdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHE2bHNtX2RvX29wZW5fdjIoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKKwkJdWludDE2X3QgYXBwX2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisJc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbV90b3AgKmxzbV90b3A7CisJc3RydWN0IGxzbV9zdHJlYW1fY21kX29wZW5fdHhfdjIgb3Blbl92MjsKKworCWlmIChsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9UT1BfSURYXSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IExTTV9UT1BfSURYIGludmFsaWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fVE9QX0lEWF0tPmxvY2spOworCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCisJCQlsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9UT1BfSURYXSk7CisJaWYgKCFjYWxfYmxvY2spIHsKKwkJcHJfZXJyKCIlczogQ2FsIGJsb2NrIGZvciBMU01fVE9QX0lEWCBub3QgZm91bmRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJbHNtX3RvcCA9IChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCAqKQorCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbzsKKwlpZiAoIWxzbV90b3ApIHsKKwkJcHJfZXJyKCIlczogY2FsX2luZm8gZm9yIExTTV9UT1BfSURYIG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHRvcG9sb2d5X2lkID0gMHgleCwgYWNkYl9pZCA9IDB4JXgsIGFwcF90eXBlID0gMHgleFxuIiwKKwkJIF9fZnVuY19fLCBsc21fdG9wLT50b3BvbG9neSwgbHNtX3RvcC0+YWNkYl9pZCwKKwkJIGxzbV90b3AtPmFwcF90eXBlKTsKKworCWlmIChsc21fdG9wLT50b3BvbG9neSA9PSAwKSB7CisJCXByX2VycigiJXM6IHRvcGxvZ3kgaWQgbm90IHNlbnQgZm9yIGFwcF90eXBlIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgbHNtX3RvcC0+YXBwX3R5cGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWNsaWVudC0+YXBwX2lkID0gbHNtX3RvcC0+YXBwX3R5cGU7CisJbWVtc2V0KCZvcGVuX3YyLCAwLCBzaXplb2Yob3Blbl92MikpOworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmb3Blbl92Mi5oZHIsCisJCSAgICAgIHNpemVvZihvcGVuX3YyKSwgdHJ1ZSk7CisJb3Blbl92Mi50b3BvbG9neV9pZCA9IGxzbV90b3AtPnRvcG9sb2d5OworCW9wZW5fdjIuaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9PUEVOX1RYX1YyOworCisJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKKwkJCQkmb3Blbl92MiwgdHJ1ZSwgTlVMTCk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBvcGVuX3YyIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCWVsc2UKKwkJY2xpZW50LT51c2VfdG9wb2xvZ3kgPSB0cnVlOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fVE9QX0lEWF0tPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmM7CisKK30KKwordm9pZCBxNmxzbV9zbV9zZXRfcGFyYW1fZGF0YShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAorCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8sCisJCXNpemVfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gKnBhcmFtOworCisJcGFyYW0gPSAoc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiAqKQorCQkJY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhOworCXBhcmFtLT5tb2R1bGVfaWQgPSBwX2luZm8tPm1vZHVsZV9pZDsKKwlwYXJhbS0+cGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCXBhcmFtLT5wX3NpemUucGFyYW1fc2l6ZSA9IGNsaWVudC0+c291bmRfbW9kZWwuc2l6ZTsKKwkqb2Zmc2V0ID0gc2l6ZW9mKCpwYXJhbSk7Cit9CisKK2ludCBxNmxzbV9vcGVuKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHVpbnQxNl90IGFwcF9pZCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBsc21fc3RyZWFtX2NtZF9vcGVuX3R4IG9wZW47CisKKwkvKiBBZGQgQ3VzdG9tIHRvcG9sb2dpZXMgaWYgbmVlZGVkICovCisJaWYgKGxzbV9jb21tb24uc2V0X2N1c3RvbV90b3BvbG9neSkgeworCQlyYyA9IHE2bHNtX3NlbmRfY3VzdG9tX3RvcG9sb2dpZXMoY2xpZW50KTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNlbmQgY3VzdF90b3AsIGVyciA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJfQorCisJLyogVHJ5IHRvIG9wZW4gd2l0aCB0b3BvbG9neSBmaXJzdCAqLworCXJjID0gcTZsc21fZG9fb3Blbl92MihjbGllbnQsIGFwcF9pZCk7CisJaWYgKCFyYykKKwkJLyogb3Blbl92MiB3YXMgc3VjY2Vzc2Z1bCAqLworCQlnb3RvIGRvbmU7CisKKwlwcl9kZWJ1ZygiJXM6IHRyeSB3aXRob3V0IHRvcG9sb2d5XG4iLAorCQkgX19mdW5jX18pOworCisJbWVtc2V0KCZvcGVuLCAwLCBzaXplb2Yob3BlbikpOworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmb3Blbi5oZHIsIHNpemVvZihvcGVuKSwgdHJ1ZSk7CisJc3dpdGNoIChjbGllbnQtPmFwcF9pZCkgeworCWNhc2UgTFNNX1ZPSUNFX1dBS0VVUF9BUFBfSURfVjI6CisJCW9wZW4uYXBwX2lkID0gY2xpZW50LT5hcHBfaWQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6ICBkZWZhdWx0IGVyciAweCV4XG4iLCBfX2Z1bmNfXywgY2xpZW50LT5hcHBfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCW9wZW4uc2FtcGxpbmdfcmF0ZSA9IExTTV9TQU1QTEVfUkFURTsKKwlvcGVuLmhkci5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfT1BFTl9UWDsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAorCQkJCSZvcGVuLCB0cnVlLCBOVUxMKTsKKwlpZiAocmMpCisJCXByX2VycigiJXM6IE9wZW4gZmFpbGVkIG9wY29kZSAweCV4LCByYyAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKKwllbHNlCisJCWNsaWVudC0+dXNlX3RvcG9sb2d5ID0gZmFsc2U7Citkb25lOgorCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHE2bHNtX3NlbmRfY29uZmlkZW5jZV9sZXZlbHMoCisJCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyAqaWRzLAorCQl1MzIgc2V0X3BhcmFtX29wY29kZSkKK3sKKwl1OCAqcGFja2V0OworCXNpemVfdCBwa3Rfc2l6ZTsKKwlzdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zX2NvbmYgKmNvbmZfcGFyYW1zOworCXN0cnVjdCBhcHJfaGRyICptc2dfaGRyOworCXN0cnVjdCBsc21fcGFyYW1fbWluX2NvbmZpZGVuY2VfbGV2ZWxzICpjZmw7CisJdWludDhfdCBpID0gMDsKKwl1aW50OF90IHBhZGRfc2l6ZSA9IDA7CisJdTggKmNvbmZfbGV2ZWxzOworCWludCByYzsKKwl1MzIgcGF5bG9hZF9zaXplLCBwYXJhbV9zaXplOworCisJcGFkZF9zaXplID0gKDQgLSAoY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMgJSA0KSkgLSAxOworCXBrdF9zaXplID0gc2l6ZW9mKCpjb25mX3BhcmFtcykgKyBwYWRkX3NpemUgKworCQkgICBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVsczsKKworCXBhY2tldCA9IGt6YWxsb2MocGt0X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcGFja2V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbmZfcGFyYW1zID0gKHN0cnVjdCBsc21fY21kX3NldF9wYXJhbXNfY29uZiAqKSBwYWNrZXQ7CisJY29uZl9sZXZlbHMgPSAodTggKikgKHBhY2tldCArIHNpemVvZigqY29uZl9wYXJhbXMpKTsKKwltc2dfaGRyID0gJmNvbmZfcGFyYW1zLT5tc2dfaGRyOworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBtc2dfaGRyLAorCQkgICAgICBwa3Rfc2l6ZSwgdHJ1ZSk7CisJbXNnX2hkci0+b3Bjb2RlID0gc2V0X3BhcmFtX29wY29kZTsKKwlwYXlsb2FkX3NpemUgPSBwa3Rfc2l6ZSAtIHNpemVvZigqbXNnX2hkcikgLQorCQkgICAgICAgc2l6ZW9mKGNvbmZfcGFyYW1zLT5wYXJhbXNfaGRyKTsKKwlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oJmNvbmZfcGFyYW1zLT5wYXJhbXNfaGRyLAorCQkJCSBwYXlsb2FkX3NpemUsIDAsIDAsIDApOworCWNmbCA9ICZjb25mX3BhcmFtcy0+Y29uZl9wYXlsb2FkOworCXBhcmFtX3NpemUgPSAoKHNpemVvZih1aW50OF90KSArIHBhZGRfc2l6ZSArCisJCSAgICAgICBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscykpICoKKwkJICAgICAgc2l6ZW9mKHVpbnQ4X3QpOworCXE2bHNtX3NldF9wYXJhbV9jb21tb24oJmNmbC0+Y29tbW9uLCBpZHMsCisJCQkgICAgICAgcGFyYW1fc2l6ZSwgc2V0X3BhcmFtX29wY29kZSk7CisJY2ZsLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPSBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVsczsKKworCXByX2RlYnVnKCIlczogQ01EIFBBUkFNIFNJWkUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwYXJhbV9zaXplKTsKKwlwcl9kZWJ1ZygiJXM6IE51bSBjb25mX2xldmVsID0gJWRcbiIsCisJCSBfX2Z1bmNfXywgY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMpOworCisJbWVtY3B5KGNvbmZfbGV2ZWxzLCBjbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzLAorCSAgICAgICBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyk7CisJZm9yIChpID0gMDsgaSA8IGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzOyBpKyspCisJCXByX2RlYnVnKCIlczogQ29uZmlkZW5jZV9sZXZlbFslZF0gPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgaSwgY29uZl9sZXZlbHNbaV0pOworCisJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKKwkJCQlwYWNrZXQsIHRydWUsIE5VTEwpOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogY29uZmlkZW5jZV9sZXZlbHMgY21kIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCWtmcmVlKHBhY2tldCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHE2bHNtX3NlbmRfcGFyYW1zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyAqb3Btb2RlX2lkcywKKwkJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzICpjb25uZWN0cG9ydF9pZHMsCisJCXUzMiBzZXRfcGFyYW1fb3Bjb2RlKQoreworCWludCByYzsKKwlzdHJ1Y3QgbHNtX2NtZF9zZXRfb3Btb2RlX2Nvbm5lY3Rwb3J0IG9wbW9kZV9jb25uZWN0cG9ydDsKKwlzdHJ1Y3QgYXByX2hkciAgKm1zZ19oZHI7CisJc3RydWN0IGxzbV9wYXJhbV9jb25uZWN0X3RvX3BvcnQgKmNvbm5lY3RfdG9fcG9ydDsKKwlzdHJ1Y3QgbHNtX3BhcmFtX29wX21vZGUgKm9wX21vZGU7CisJdTMyIGRhdGFfcGF5bG9hZF9zaXplLCBwYXJhbV9zaXplOworCisJbXNnX2hkciA9ICZvcG1vZGVfY29ubmVjdHBvcnQubXNnX2hkcjsKKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgbXNnX2hkciwKKwkJICAgICAgc2l6ZW9mKG9wbW9kZV9jb25uZWN0cG9ydCksIHRydWUpOworCW1zZ19oZHItPm9wY29kZSA9IHNldF9wYXJhbV9vcGNvZGU7CisJZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2Yob3Btb2RlX2Nvbm5lY3Rwb3J0KSAtCisJCQkgICAgc2l6ZW9mKCptc2dfaGRyKSAtCisJCQkgICAgc2l6ZW9mKG9wbW9kZV9jb25uZWN0cG9ydC5wYXJhbXNfaGRyKTsKKwlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oJm9wbW9kZV9jb25uZWN0cG9ydC5wYXJhbXNfaGRyLAorCQkJCSBkYXRhX3BheWxvYWRfc2l6ZSwgMCwgMCwgMCk7CisJY29ubmVjdF90b19wb3J0ID0gJm9wbW9kZV9jb25uZWN0cG9ydC5jb25uZWN0X3RvX3BvcnQ7CisJb3BfbW9kZSA9ICZvcG1vZGVfY29ubmVjdHBvcnQub3BfbW9kZTsKKworCXBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbV9vcF9tb2RlKSAtCisJCSAgICAgc2l6ZW9mKG9wX21vZGUtPmNvbW1vbik7CisJcTZsc21fc2V0X3BhcmFtX2NvbW1vbigmb3BfbW9kZS0+Y29tbW9uLAorCQkJICAgICAgIG9wbW9kZV9pZHMsIHBhcmFtX3NpemUsCisJCQkgICAgICAgc2V0X3BhcmFtX29wY29kZSk7CisJb3BfbW9kZS0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTjsKKwlvcF9tb2RlLT5tb2RlID0gY2xpZW50LT5tb2RlOworCW9wX21vZGUtPnJlc2VydmVkID0gMDsKKwlwcl9kZWJ1ZygiJXM6IG1vZGUgPSAweCV4IiwgX19mdW5jX18sIG9wX21vZGUtPm1vZGUpOworCisJcGFyYW1fc2l6ZSA9IChzaXplb2Yoc3RydWN0IGxzbV9wYXJhbV9jb25uZWN0X3RvX3BvcnQpIC0KKwkJICAgICAgc2l6ZW9mKGNvbm5lY3RfdG9fcG9ydC0+Y29tbW9uKSk7CisJcTZsc21fc2V0X3BhcmFtX2NvbW1vbigmY29ubmVjdF90b19wb3J0LT5jb21tb24sCisJCQkgICAgICAgY29ubmVjdHBvcnRfaWRzLCBwYXJhbV9zaXplLAorCQkJICAgICAgIHNldF9wYXJhbV9vcGNvZGUpOworCWNvbm5lY3RfdG9fcG9ydC0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTjsKKwljb25uZWN0X3RvX3BvcnQtPnBvcnRfaWQgPSBjbGllbnQtPmNvbm5lY3RfdG9fcG9ydDsKKwljb25uZWN0X3RvX3BvcnQtPnJlc2VydmVkID0gMDsKKwlwcl9kZWJ1ZygiJXM6IHBvcnQ9ICVkIiwgX19mdW5jX18sIGNvbm5lY3RfdG9fcG9ydC0+cG9ydF9pZCk7CisKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAorCQkJCSZvcG1vZGVfY29ubmVjdHBvcnQsIHRydWUsIE5VTEwpOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogRmFpbGVkIHNldF9wYXJhbXMgb3Bjb2RlIDB4JXgsIHJjICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIG1zZ19oZHItPm9wY29kZSwgcmMpOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgc2V0X2xzbV9wb3J0KGludCBsc21fcG9ydCkKK3sKKwlsc21fYWZlX3BvcnQgPSBsc21fcG9ydDsKK30KKworaW50IGdldF9sc21fcG9ydCh2b2lkKQoreworCXJldHVybiBsc21fYWZlX3BvcnQ7Cit9CisKK2ludCBxNmxzbV9zZXRfZGF0YShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAorCQkJICAgZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgbW9kZSwKKwkJCSAgIGJvb2wgZGV0ZWN0ZmFpbHVyZSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyBvcG1vZGVfaWRzLCBjb25uZWN0cG9ydF9pZHM7CisJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzIGNvbmZfbGV2ZWxzX2lkczsKKworCWlmICghY2xpZW50LT5jb25maWRlbmNlX2xldmVscykgeworCQkvKgorCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNvbmZpZGVuY2UgbGV2ZWxzIGFyZQorCQkgKiBub3QgcHJvdmlkZWQuIFRoaXMgaXMgbm90IGEgZXJyb3IgY29uZGl0aW9uLgorCQkgKiBSZXR1cm4gZ3JhY2VmdWxseSB3aXRob3V0IGFueSBlcnJvcgorCQkgKi8KKwkJcHJfZGVidWcoIiVzOiBubyBjb25mIGxldmVscyB0byBzZXRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAobW9kZSA9PSBMU01fTU9ERV9LRVlXT1JEX09OTFlfREVURUNUSU9OKSB7CisJCWNsaWVudC0+bW9kZSA9IDB4MDE7CisJfSBlbHNlIGlmIChtb2RlID09IExTTV9NT0RFX1VTRVJfS0VZV09SRF9ERVRFQ1RJT04pIHsKKwkJY2xpZW50LT5tb2RlID0gMHgwMzsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZGV0ZWN0aW9uIG1vZGUgJWRcbiIsIF9fZnVuY19fLCBtb2RlKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZXQ7CisJfQorCWNsaWVudC0+bW9kZSB8PSBkZXRlY3RmYWlsdXJlIDw8IDI7CisJY2xpZW50LT5jb25uZWN0X3RvX3BvcnQgPSBnZXRfbHNtX3BvcnQoKTsKKworCW9wbW9kZV9pZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVA7CisJb3Btb2RlX2lkcy5wYXJhbV9pZCA9IExTTV9QQVJBTV9JRF9PUEVSQVRJT05fTU9ERTsKKworCWNvbm5lY3Rwb3J0X2lkcy5tb2R1bGVfaWQgPSBMU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUDsKKwljb25uZWN0cG9ydF9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfQ09OTkVDVF9UT19QT1JUOworCisJcmMgPSBxNmxzbV9zZW5kX3BhcmFtcyhjbGllbnQsICZvcG1vZGVfaWRzLCAmY29ubmVjdHBvcnRfaWRzLAorCQkJICAgICAgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMpOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGxzbSBjb25maWcgcGFyYW1zICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWNvbmZfbGV2ZWxzX2lkcy5tb2R1bGVfaWQgPSBMU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUDsKKwljb25mX2xldmVsc19pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfTUlOX0NPTkZJREVOQ0VfTEVWRUxTOworCisJcmMgPSBxNmxzbV9zZW5kX2NvbmZpZGVuY2VfbGV2ZWxzKGNsaWVudCwgJmNvbmZfbGV2ZWxzX2lkcywKKwkJCQkJIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNlbmQgY29uZl9sZXZlbHMsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXJjID0gcTZsc21fc2VuZF9jYWwoY2xpZW50LCBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUyk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZW5kIGNhbGlicmF0aW9uIGRhdGEgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCitlcnJfcmV0OgorCXJldHVybiByYzsKK30KKworaW50IHE2bHNtX3JlZ2lzdGVyX3NvdW5kX21vZGVsKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgbW9kZSwKKwkJCSAgICAgICBib29sIGRldGVjdGZhaWx1cmUpCit7CisJaW50IHJjOworCXN0cnVjdCBsc21fY21kX3JlZ19zbmRfbW9kZWwgY21kOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlyYyA9IHE2bHNtX3NldF9kYXRhKGNsaWVudCwgbW9kZSwgZGV0ZWN0ZmFpbHVyZSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgbHNtIGRhdGEsIGVyciA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmY21kLmhkciwgc2l6ZW9mKGNtZCksIHRydWUpOworCWNtZC5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX1NPVU5EX01PREVMOworCWNtZC5tb2RlbF9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzKTsKKwljbWQubW9kZWxfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJCWNsaWVudC0+c291bmRfbW9kZWwucGh5cyk7CisJY21kLm1vZGVsX3NpemUgPSBjbGllbnQtPnNvdW5kX21vZGVsLnNpemU7CisJLyogcmVhZCB1cGRhdGVkIG1lbV9tYXBfaGFuZGxlIGJ5IHE2bHNtX21tYXBjYWxsYmFjayAqLworCXJtYigpOworCWNtZC5tZW1fbWFwX2hhbmRsZSA9IGNsaWVudC0+c291bmRfbW9kZWwubWVtX21hcF9oYW5kbGU7CisKKwlwcl9kZWJ1ZygiJXM6IGFkZHIgJXBLLCBzaXplICVkLCBoYW5kbGUgMHgleFxuIiwgX19mdW5jX18sCisJCSZjbGllbnQtPnNvdW5kX21vZGVsLnBoeXMsIGNtZC5tb2RlbF9zaXplLCBjbWQubWVtX21hcF9oYW5kbGUpOworCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsICZjbWQsIHRydWUsIE5VTEwpOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogRmFpbGVkIGNtZCBvcFsweCV4XXJjWyVkXVxuIiwgX19mdW5jX18sCisJCSAgICAgICBjbWQuaGRyLm9wY29kZSwgcmMpOworCWVsc2UKKwkJcHJfZGVidWcoIiVzOiBSZWdpc3RlciBzb3VuZCBtb2RlbCBzdWNjZWVkZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiByYzsKK30KKworaW50IHE2bHNtX2RlcmVnaXN0ZXJfc291bmRfbW9kZWwoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGxzbV9jbWRfcmVnX3NuZF9tb2RlbCBjbWQ7CisKKwlpZiAoIWNsaWVudCkgeworCQlwcl9lcnIoIkFQUiBoYW5kbGUgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNsaWVudC0+YXByKSB7CisJCXByX2VycigiQVBSIGNsaWVudCBoYW5kbGUgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKKwkJcHJfZXJyKCIlczogc2Vzc2lvblslZF0iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJmNtZC5oZHIsIHNpemVvZihjbWQuaGRyKSwgZmFsc2UpOworCWNtZC5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX0RFUkVHSVNURVJfU09VTkRfTU9ERUw7CisKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCAmY21kLmhkciwgdHJ1ZSwgTlVMTCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCBjbWQgb3Bjb2RlIDB4JXgsIHJjICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGNtZC5oZHIub3Bjb2RlLCByYyk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBEZXJlZ2lzdGVyIHNvdW5kIG1vZGVsIHN1Y2NlZWRlZFxuIiwgX19mdW5jX18pOworCX0KKworCXE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShjbGllbnQpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBxNmxzbV9hZGRfbW1hcGhkcihzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYXByX2hkciAqaGRyLAorCQkJICAgICAgdTMyIHBrdF9zaXplLCB1MzIgY21kX2ZsZywgdTMyIHRva2VuKQoreworCXByX2RlYnVnKCIlczogcGt0IHNpemU9JWQgY21kX2ZsZz0lZCBzZXNzaW9uPSVkXG4iLCBfX2Z1bmNfXywgcGt0X3NpemUsCisJCSBjbWRfZmxnLCBjbGllbnQtPnNlc3Npb24pOworCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkgICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCWhkci0+c3JjX3BvcnQgPSAweDAwOworCWhkci0+ZGVzdF9wb3J0ID0gY2xpZW50LT5zZXNzaW9uOworCWlmIChjbWRfZmxnKQorCQloZHItPnRva2VuID0gdG9rZW47CisJaGRyLT5wa3Rfc2l6ZSA9IHBrdF9zaXplOworfQorCitzdGF0aWMgaW50IHE2bHNtX21lbW9yeV9tYXBfcmVnaW9ucyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICBkbWFfYWRkcl90IGRtYV9hZGRyX3AsIHVpbnQzMl90IGRtYV9idWZfc3osCisJCQkJICAgIHVpbnQzMl90ICptbWFwX3ApCit7CisJc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqbW1hcF9yZWdpb25zID0gTlVMTDsKKwlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKm1yZWdpb25zID0gTlVMTDsKKwl2b2lkICptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOworCXZvaWQgKnBheWxvYWQgPSBOVUxMOworCWludCByYzsKKwlpbnQgY21kX3NpemUgPSAwOworCisJcHJfZGVidWcoIiVzOiBkbWFfYWRkcl9wIDB4JXBLLCBkbWFfYnVmX3N6ICVkLCBtbWFwX3AgMHglcEssIHNlc3Npb24gJWRcbiIsCisJCV9fZnVuY19fLCAmZG1hX2FkZHJfcCwgZG1hX2J1Zl9zeiwgbW1hcF9wLAorCQljbGllbnQtPnNlc3Npb24pOworCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKKwkJcHJfZXJyKCIlczogc2Vzc2lvblslZF0iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMpICsKKwkJICAgc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCk7CisKKwltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1tYXBfcmVnaW9uX2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbWFwX3JlZ2lvbnMgPSAoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqKW1tYXBfcmVnaW9uX2NtZDsKKwlxNmxzbV9hZGRfbW1hcGhkcihjbGllbnQsICZtbWFwX3JlZ2lvbnMtPmhkciwgY21kX3NpemUsIHRydWUsCisJCQkgIChjbGllbnQtPnNlc3Npb24gPDwgOCkpOworCisJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM7CisJbW1hcF9yZWdpb25zLT5tZW1fcG9vbF9pZCA9IEFEU1BfTUVNT1JZX01BUF9TSE1FTThfNEtfUE9PTDsKKwltbWFwX3JlZ2lvbnMtPm51bV9yZWdpb25zID0gMTsKKwltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOworCXBheWxvYWQgPSAoKHU4ICopbW1hcF9yZWdpb25fY21kICsKKwkJICAgc2l6ZW9mKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMpKTsKKwltcmVnaW9ucyA9IChzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOworCisJbXJlZ2lvbnMtPnNobV9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoZG1hX2FkZHJfcCk7CisJbXJlZ2lvbnMtPnNobV9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGRtYV9hZGRyX3ApOworCW1yZWdpb25zLT5tZW1fc2l6ZV9ieXRlcyA9IGRtYV9idWZfc3o7CisKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+bW1hcF9hcHIsIG1tYXBfcmVnaW9uX2NtZCwKKwkJCQl0cnVlLCBtbWFwX3ApOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogRmFpbGVkIG1tYXBfcmVnaW9ucyBvcGNvZGUgMHgleCwgcmMgJWRcbiIsCisJCQlfX2Z1bmNfXywgbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlLCByYyk7CisKKwlwcl9kZWJ1ZygiJXM6IGxlYXZlICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCWtmcmVlKG1tYXBfcmVnaW9uX2NtZCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHE2bHNtX21lbW9yeV91bm1hcF9yZWdpb25zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgdWludDMyX3QgaGFuZGxlKQoreworCXN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fdW5tYXBfcmVnaW9ucyB1bm1hcDsKKwlpbnQgcmMgPSAwOworCWludCBjbWRfc2l6ZSA9IDA7CisKKwlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7CisJCXByX2VycigiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMpOworCXE2bHNtX2FkZF9tbWFwaGRyKGNsaWVudCwgJnVubWFwLmhkciwgY21kX3NpemUsCisJCQkgIHRydWUsIChjbGllbnQtPnNlc3Npb24gPDwgOCkpOworCXVubWFwLmhkci5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOworCXVubWFwLm1lbV9tYXBfaGFuZGxlID0gaGFuZGxlOworCisJcHJfZGVidWcoIiVzOiB1bm1hcCBoYW5kbGUgMHgleFxuIiwgX19mdW5jX18sIHVubWFwLm1lbV9tYXBfaGFuZGxlKTsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+bW1hcF9hcHIsICZ1bm1hcCwgdHJ1ZSwKKwkJCQlOVUxMKTsKKwlpZiAocmMpCisJCXByX2VycigiJXM6IEZhaWxlZCBtbWFwX3JlZ2lvbnMgb3Bjb2RlIDB4JXggcmMgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgdW5tYXAuaGRyLm9wY29kZSwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHE2bHNtX3NlbmRfY2FsKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCQkgIHUzMiBzZXRfcGFyYW1zX29wY29kZSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBsc21fY21kX3NldF9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgKnBhcmFtc19oZHIgPSAmcGFyYW1zLnBhcmFtX2hkcjsKKwlzdHJ1Y3QgYXByX2hkciAqbXNnX2hkciA9ICZwYXJhbXMubXNnX2hkcjsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gaWQgJWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPnNlc3Npb24pOworCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKKwkJcHJfZXJyKCIlczogc2Vzc2lvblslZF0iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NBTF9JRFhdID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCW11dGV4X2xvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NBTF9JRFhdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAorCQlsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIHVubG9jazsKKworCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPD0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IE5vIGNhbCB0byBzZW5kIVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplICE9IGNsaWVudC0+bHNtX2NhbF9zaXplKSB7CisJCXByX2VycigiJXM6IENhbCBzaXplICV6ZCBkb2Vzbid0IG1hdGNoIGxzbSBjYWwgc2l6ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsCisJCQljbGllbnQtPmxzbV9jYWxfc2l6ZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCS8qIENhY2hlIG1tYXAgYWRkcmVzcywgb25seSBtYXAgb25jZSBvciBpZiBuZXcgYWRkciAqLworCWxzbV9jb21tb24uY29tbW9uX2NsaWVudFtjbGllbnQtPnNlc3Npb25dLnNlc3Npb24gPSBjbGllbnQtPnNlc3Npb247CisJcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsIHNpemVvZihwYXJhbXMpLCB0cnVlKTsKKwltc2dfaGRyLT5vcGNvZGUgPSBzZXRfcGFyYW1zX29wY29kZTsKKwlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8ocGFyYW1zX2hkciwKKwkJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwKKwkJCWxvd2VyXzMyX2JpdHMoY2xpZW50LT5sc21fY2FsX3BoeV9hZGRyKSwKKwkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAorCQkJCWNsaWVudC0+bHNtX2NhbF9waHlfYWRkciksCisJCQljbGllbnQtPnNvdW5kX21vZGVsLm1lbV9tYXBfaGFuZGxlKTsKKworCXByX2RlYnVnKCIlczogQ2FsIFNpemUgPSAlemQiLCBfX2Z1bmNfXywKKwkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCAmcGFyYW1zLCB0cnVlLCBOVUxMKTsKKwlpZiAocmMpCisJCXByX2VycigiJXM6IEZhaWxlZCBzZXRfcGFyYW1zIG9wY29kZSAweCV4LCByYyAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBtc2dfaGRyLT5vcGNvZGUsIHJjKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NBTF9JRFhdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCisKK2ludCBxNmxzbV9zbmRfbW9kZWxfYnVmX2ZyZWUoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gaWQgJWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPnNlc3Npb24pOworCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKKwkJcHJfZXJyKCIlczogc2Vzc2lvblslZF0iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmY2xpZW50LT5jbWRfbG9jayk7CisJcmMgPSBxNmxzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhjbGllbnQsCisJCQkJCWNsaWVudC0+c291bmRfbW9kZWwubWVtX21hcF9oYW5kbGUpOworCWlmIChyYykKKwkJcHJfZXJyKCIlczogQ01EIE1lbW9yeV91bm1hcF9yZWdpb25zIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisKKwlpZiAoY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhKSB7CisJCW1zbV9hdWRpb19pb25fZnJlZShjbGllbnQtPnNvdW5kX21vZGVsLmNsaWVudCwKKwkJCQkgY2xpZW50LT5zb3VuZF9tb2RlbC5oYW5kbGUpOworCQljbGllbnQtPnNvdW5kX21vZGVsLmNsaWVudCA9IE5VTEw7CisJCWNsaWVudC0+c291bmRfbW9kZWwuaGFuZGxlID0gTlVMTDsKKwkJY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhID0gTlVMTDsKKwkJY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzID0gMDsKKwkJY2xpZW50LT5sc21fY2FsX3BoeV9hZGRyID0gMDsKKwkJY2xpZW50LT5sc21fY2FsX3NpemUgPSAwOworCX0KKwltdXRleF91bmxvY2soJmNsaWVudC0+Y21kX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBsc21fY2xpZW50ICpxNmxzbV9nZXRfbHNtX2NsaWVudChpbnQgc2Vzc2lvbl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxzbV9zZXNzaW9uX2xvY2ssIGZsYWdzKTsKKwlpZiAoc2Vzc2lvbl9pZCA8IExTTV9NSU5fU0VTU0lPTl9JRCB8fCBzZXNzaW9uX2lkID4gTFNNX01BWF9TRVNTSU9OX0lEKQorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb24gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKwllbHNlIGlmICghbHNtX3Nlc3Npb25bc2Vzc2lvbl9pZF0pCisJCXByX2VycigiJXM6IE5vdCBhbiBhY3RpdmUgc2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCWVsc2UKKwkJY2xpZW50ID0gbHNtX3Nlc3Npb25bc2Vzc2lvbl9pZF07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHNtX3Nlc3Npb25fbG9jaywgZmxhZ3MpOworCXJldHVybiBjbGllbnQ7Cit9CisKKy8qCisgKiBxNmxzbV9tbWFwY2FsbGJhY2sgOiBhdG9taWMgY29udGV4dAorICovCitzdGF0aWMgaW50IHE2bHNtX21tYXBjYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgY29tbWFuZDsKKwl1aW50MzJfdCByZXRjb2RlOworCXVpbnQzMl90IHNpZDsKKwljb25zdCB1aW50MzJfdCAqcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7CisJc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCA9IE5VTEw7CisKKwlpZiAoZGF0YS0+b3Bjb2RlID09IFJFU0VUX0VWRU5UUykgeworCQlzaWQgPSAoZGF0YS0+dG9rZW4gPj4gOCkgJiAweDBGOworCQlwcl9kZWJ1ZygiJXM6IFNTUiBldmVudCByZWNlaXZlZCAweCV4LCBldmVudCAweCV4LFxuIgorCQkJICJwcm9jIDB4JXggU0lEIDB4JXhcbiIsIF9fZnVuY19fLCBkYXRhLT5vcGNvZGUsCisJCQkgZGF0YS0+cmVzZXRfZXZlbnQsIGRhdGEtPnJlc2V0X3Byb2MsIHNpZCk7CisJCWxzbV9jb21tb24uY29tbW9uX2NsaWVudFtzaWRdLmxzbV9jYWxfcGh5X2FkZHIgPSAwOworCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhMU01fTUFYX0NBTF9JRFgsCisJCQlsc21fY29tbW9uLmNhbF9kYXRhKTsKKwkJbHNtX2NvbW1vbi5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tbWFuZCA9IHBheWxvYWRbMF07CisJcmV0Y29kZSA9IHBheWxvYWRbMV07CisJc2lkID0gKGRhdGEtPnRva2VuID4+IDgpICYgMHgwRjsKKwlwcl9kZWJ1ZygiJXM6IG9wY29kZSAweCV4IGNvbW1hbmQgMHgleCByZXR1cm4gY29kZSAweCV4IFNJRCAweCV4XG4iLAorCQkgX19mdW5jX18sIGRhdGEtPm9wY29kZSwgY29tbWFuZCwgcmV0Y29kZSwgc2lkKTsKKwljbGllbnQgPSBxNmxzbV9nZXRfbHNtX2NsaWVudChzaWQpOworCWlmICghY2xpZW50KSB7CisJCXByX2RlYnVnKCIlczogU2Vzc2lvbiAlZCBhbHJlYWR5IGZyZWVkXG4iLCBfX2Z1bmNfXywgc2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChkYXRhLT5vcGNvZGUpIHsKKwljYXNlIExTTV9TRVNTSU9OX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TOgorCQlpZiAoYXRvbWljX3JlYWQoJmNsaWVudC0+Y21kX3N0YXRlKSA9PSBDTURfU1RBVEVfV0FJVF9SRVNQKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbW1hcF9sb2NrLCBmbGFncyk7CisJCQkqbW1hcF9oYW5kbGVfcCA9IGNvbW1hbmQ7CisJCQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlIGltcGxpZXMgYmFycmllciAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW1hcF9sb2NrLCBmbGFncyk7CisJCQlhdG9taWNfc2V0KCZjbGllbnQtPmNtZF9zdGF0ZSwgQ01EX1NUQVRFX0NMRUFSRUQpOworCQkJd2FrZV91cCgmY2xpZW50LT5jbWRfd2FpdCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDoKKwkJc3dpdGNoIChjb21tYW5kKSB7CisJCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzoKKwkJCWF0b21pY19zZXQoJmNsaWVudC0+Y21kX3N0YXRlLCBDTURfU1RBVEVfQ0xFQVJFRCk7CisJCQl3YWtlX3VwKCZjbGllbnQtPmNtZF93YWl0KTsKKwkJCWJyZWFrOworCQljYXNlIExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOgorCQkJaWYgKHJldGNvZGUgIT0gMCkgeworCQkJCS8qIGVycm9yIHN0YXRlLCBzaWduYWwgdG8gc3RvcCB3YWl0aW5nICovCisJCQkJaWYgKGF0b21pY19yZWFkKCZjbGllbnQtPmNtZF9zdGF0ZSkgPT0KKwkJCQkJQ01EX1NUQVRFX1dBSVRfUkVTUCkgeworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbW1hcF9sb2NrLCBmbGFncyk7CisJCQkJCS8qIGltcGxpZXMgYmFycmllciAqLworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtbWFwX2xvY2ssCisJCQkJCQlmbGFncyk7CisJCQkJCWF0b21pY19zZXQoJmNsaWVudC0+Y21kX3N0YXRlLAorCQkJCQkJQ01EX1NUQVRFX0NMRUFSRUQpOworCQkJCQl3YWtlX3VwKCZjbGllbnQtPmNtZF93YWl0KTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX3dhcm4oIiVzOiBVbmV4cGVjdGVkIGNvbW1hbmQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJY29tbWFuZCk7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXM6IGNvbW1hbmQgMHgleCByZXR1cm4gY29kZSAweCV4IG9wY29kZSAweCV4XG4iLAorCQkJIF9fZnVuY19fLCBjb21tYW5kLCByZXRjb2RlLCBkYXRhLT5vcGNvZGUpOworCQlicmVhazsKKwl9CisJaWYgKGNsaWVudC0+Y2IpCisJCWNsaWVudC0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKKwkJCSAgIGRhdGEtPnBheWxvYWQsIGNsaWVudC0+cHJpdik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBxNmxzbV9zbmRfbW9kZWxfYnVmX2FsbG9jKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHNpemVfdCBsZW4sCisJCQkgICAgICBib29sIGFsbG9jYXRlX21vZHVsZV9kYXRhKQoreworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKKworCXNpemVfdCBwYWRfemVybyA9IDAsIHRvdGFsX21lbSA9IDA7CisKKwlpZiAoIWNsaWVudCB8fCBsZW4gPD0gTFNNX0FMSUdOX0JPVU5EQVJZKQorCQlyZXR1cm4gcmM7CisKKwltdXRleF9sb2NrKCZjbGllbnQtPmNtZF9sb2NrKTsKKworCW11dGV4X2xvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NBTF9JRFhdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAorCQlsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlwcl9kZWJ1ZygiJXM6U25kIE1vZGVsIGxlbiA9ICV6ZCBjYWwgc2l6ZSAlemQgcGh5cyBhZGRyICVwSyIsIF9fZnVuY19fLAorCQlsZW4sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwKKwkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWlmICghY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcikgeworCQlwcl9lcnIoIiVzOiBObyBMU00gY2FsaWJyYXRpb24gc2V0IGZvciBzZXNzaW9uIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKCFjbGllbnQtPnNvdW5kX21vZGVsLmRhdGEpIHsKKworCQkvKgorCQkgKiBpZiBzb3VuZCBtb2R1bGUgaXMgc2VudCBhcyBzZXRfcGFyYW0KKwkJICogVGhlbiBtZW1vcnkgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvcgorCQkgKiBzZXRfcGFyYW0gcGF5bG9hZCBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKGFsbG9jYXRlX21vZHVsZV9kYXRhKQorCQkJbGVuICs9IHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uKTsKKworCQljbGllbnQtPnNvdW5kX21vZGVsLnNpemUgPSBsZW47CisJCXBhZF96ZXJvID0gKExTTV9BTElHTl9CT1VOREFSWSAtCisJCQkgICAgKGxlbiAlIExTTV9BTElHTl9CT1VOREFSWSkpOworCQlpZiAoKGxlbiA+IFNJWkVfTUFYIC0gcGFkX3plcm8pIHx8CisJCSAgICAobGVuICsgcGFkX3plcm8gPgorCQkgICAgIFNJWkVfTUFYIC0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKSkgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBhbGxvY2F0aW9uIHNpemUsIGxlbiA9ICV6ZCwgcGFkX3plcm8gPSV6ZCwgY2FsX3NpemUgPSAlemRcbiIsCisJCQkJX19mdW5jX18sIGxlbiwgcGFkX3plcm8sCisJCQkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXRvdGFsX21lbSA9IFBBR0VfQUxJR04ocGFkX3plcm8gKyBsZW4gKworCQkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKKwkJcHJfZGVidWcoIiVzOiBQYWQgemVyb3Mgc291bmQgbW9kZWwgJXpkIFRvdGFsIG1lbSAlemRcbiIsCisJCQkJIF9fZnVuY19fLCBwYWRfemVybywgdG90YWxfbWVtKTsKKwkJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJsc21fY2xpZW50IiwKKwkJCQkmY2xpZW50LT5zb3VuZF9tb2RlbC5jbGllbnQsCisJCQkJJmNsaWVudC0+c291bmRfbW9kZWwuaGFuZGxlLAorCQkJCXRvdGFsX21lbSwKKwkJCQkmY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzLAorCQkJCSZsZW4sCisJCQkJJmNsaWVudC0+c291bmRfbW9kZWwuZGF0YSk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogQXVkaW8gSU9OIGFsbG9jIGlzIGZhaWxlZCwgcmMgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBmYWlsOworCQl9CisJcHJfZGVidWcoIiVzOiBMZW5ndGggPSAlemRcbiIsIF9fZnVuY19fLCBsZW4pOworCWNsaWVudC0+bHNtX2NhbF9waHlfYWRkciA9IChwYWRfemVybyArCisJCQkJICAgIGNsaWVudC0+c291bmRfbW9kZWwucGh5cyArCisJCQkJICAgIGNsaWVudC0+c291bmRfbW9kZWwuc2l6ZSk7CisJY2xpZW50LT5sc21fY2FsX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7CisJbWVtY3B5KChjbGllbnQtPnNvdW5kX21vZGVsLmRhdGEgKyBwYWRfemVybyArCisJCWNsaWVudC0+c291bmRfbW9kZWwuc2l6ZSksCisJICAgICAgICh1aW50MzJfdCAqKWNhbF9ibG9jay0+Y2FsX2RhdGEua3ZhZGRyLCBjbGllbnQtPmxzbV9jYWxfc2l6ZSk7CisJcHJfZGVidWcoIiVzOiBDb3B5IGNhbCBzdGFydCB2aXJ0X2FkZHIgJXBLIHBoeV9hZGRyICVwS1xuIgorCQkJICJPZmZzZXQgY2FsIHZpcnR1YWwgQWRkciAlcEtcbiIsIF9fZnVuY19fLAorCQkJIGNsaWVudC0+c291bmRfbW9kZWwuZGF0YSwgJmNsaWVudC0+c291bmRfbW9kZWwucGh5cywKKwkJCSAocGFkX3plcm8gKyBjbGllbnQtPnNvdW5kX21vZGVsLmRhdGEgKworCQkJIGNsaWVudC0+c291bmRfbW9kZWwuc2l6ZSkpOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHNvdW5kIG1vZGVsIGJ1c3lcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gZmFpbDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXS0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmNtZF9sb2NrKTsKKworCXJjID0gcTZsc21fbWVtb3J5X21hcF9yZWdpb25zKGNsaWVudCwgY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzLAorCQkJCSAgICAgIGxlbiwKKwkJCQkgICAgICAmY2xpZW50LT5zb3VuZF9tb2RlbC5tZW1fbWFwX2hhbmRsZSk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IENNRCBNZW1vcnlfbWFwX3JlZ2lvbnMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0dXJuIDA7CitmYWlsOgorCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ0FMX0lEWF0tPmxvY2spOworCW11dGV4X3VubG9jaygmY2xpZW50LT5jbWRfbG9jayk7CitleGl0OgorCXE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShjbGllbnQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxNmxzbV9jbWQoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgaW50IG9wY29kZSwgYm9vbCB3YWl0KQoreworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlpbnQgcmM7CisKKwlwcl9kZWJ1ZygiJXM6IGVudGVyIG9wY29kZSAleCB3YWl0ICVkXG4iLCBfX2Z1bmNfXywgb3Bjb2RlLCB3YWl0KTsKKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJmhkciwgc2l6ZW9mKGhkciksIHRydWUpOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBMU01fU0VTU0lPTl9DTURfU1RBUlQ6CisJY2FzZSBMU01fU0VTU0lPTl9DTURfU1RPUDoKKwljYXNlIExTTV9TRVNTSU9OX0NNRF9DTE9TRV9UWDoKKwljYXNlIExTTV9TRVNTSU9OX0NNRF9FT0I6CisJCWhkci5vcGNvZGUgPSBvcGNvZGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgb3Bjb2RlIDB4JXhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgJmhkciwgd2FpdCwgTlVMTCk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgY29tbW1hbmQgMHgleFxuIiwgX19mdW5jX18sIGhkci5vcGNvZGUpOworCisJcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcTZsc21fc2VuZF9wYXJhbV9lcGRfdGhyZXMoCisJCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyAqaWRzKQoreworCXN0cnVjdCBzbmRfbHNtX2VwX2RldF90aHJlcyAqZXBfZGV0X2RhdGE7CisJc3RydWN0IGxzbV9jbWRfc2V0X2VwZF90aHJlc2hvbGQgZXBkX2NtZDsKKwlzdHJ1Y3QgYXByX2hkciAqbXNnX2hkciA9ICZlcGRfY21kLm1zZ19oZHI7CisJc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciAqcGFyYW1faGRyID0KKwkJCSZlcGRfY21kLnBhcmFtX2hkcjsKKwlzdHJ1Y3QgbHNtX3BhcmFtX2VwZF90aHJlcyAqZXBkX3RocmVzID0KKwkJCSZlcGRfY21kLmVwZF90aHJlczsKKwlpbnQgcmM7CisKKwllcF9kZXRfZGF0YSA9IChzdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgKikgZGF0YTsKKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgbXNnX2hkciwKKwkJICAgICAgc2l6ZW9mKGVwZF9jbWQpLCB0cnVlKTsKKwltc2dfaGRyLT5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjsKKwlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8ocGFyYW1faGRyLAorCQlzaXplb2YoKmVwZF90aHJlcyksIDAsIDAsIDApOworCXE2bHNtX3NldF9wYXJhbV9jb21tb24oJmVwZF90aHJlcy0+Y29tbW9uLCBpZHMsCisJCXNpemVvZigqZXBkX3RocmVzKSAtIHNpemVvZihlcGRfdGhyZXMtPmNvbW1vbiksCisJCUxTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKwllcGRfdGhyZXMtPm1pbm9yX3ZlcnNpb24gPSBRTFNNX1BBUkFNX0lEX01JTk9SX1ZFUlNJT047CisJZXBkX3RocmVzLT5lcGRfYmVnaW4gPSBlcF9kZXRfZGF0YS0+ZXBkX2JlZ2luOworCWVwZF90aHJlcy0+ZXBkX2VuZCA9IGVwX2RldF9kYXRhLT5lcGRfZW5kOworCisJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKKwkJCQkmZXBkX2NtZCwgdHJ1ZSwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcHJfZXJyKCIlczogRVBEX1RIUkVTSE9MRCBmYWlsZWQsIHJjICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcTZsc21fc2VuZF9wYXJhbV9nYWluKAorCQlzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAorCQl1MTYgZ2Fpbiwgc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzICppZHMpCit7CisJc3RydWN0IGxzbV9jbWRfc2V0X2dhaW4gbHNtX2NtZF9nYWluOworCXN0cnVjdCBhcHJfaGRyICptc2dfaGRyID0gJmxzbV9jbWRfZ2Fpbi5tc2dfaGRyOworCXN0cnVjdCBsc21fcGFyYW1fZ2FpbiAqbHNtX2dhaW4gPSAmbHNtX2NtZF9nYWluLmxzbV9nYWluOworCWludCByYzsKKworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBtc2dfaGRyLAorCQkgICAgICBzaXplb2YobHNtX2NtZF9nYWluKSwgdHJ1ZSk7CisJbXNnX2hkci0+b3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI7CisJcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZsc21fY21kX2dhaW4ucGFyYW1faGRyLAorCQkJc2l6ZW9mKCpsc21fZ2FpbiksIDAsIDAsIDApOworCXE2bHNtX3NldF9wYXJhbV9jb21tb24oJmxzbV9nYWluLT5jb21tb24sIGlkcywKKwkJc2l6ZW9mKCpsc21fZ2FpbikgLSBzaXplb2YobHNtX2dhaW4tPmNvbW1vbiksCisJCUxTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKwlsc21fZ2Fpbi0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTjsKKwlsc21fZ2Fpbi0+Z2FpbiA9IGdhaW47CisJbHNtX2dhaW4tPnJlc2VydmVkID0gMDsKKworCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCisJCQkJJmxzbV9jbWRfZ2FpbiwgdHJ1ZSwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcHJfZXJyKCIlczogTFNNX0dBSU4gQ01EIHNlbmQgZmFpbGVkLCByYyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKworaW50IHE2bHNtX3NldF9vbmVfcGFyYW0oc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKKwlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8sIHZvaWQgKmRhdGEsCisJZW51bSBMU01fUEFSQU1fVFlQRSBwYXJhbV90eXBlKQoreworCWludCByYyA9IDAsIHBrdF9zejsKKwlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgaWRzOworCXU4ICpwYWNrZXQ7CisKKwltZW1zZXQoJmlkcywgMCwgc2l6ZW9mKGlkcykpOworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQ6IHsKKwkJaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOworCQlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCQlyYyA9IHE2bHNtX3NlbmRfcGFyYW1fZXBkX3RocmVzKGNsaWVudCwgZGF0YSwKKwkJCQkJCSZpZHMpOworCQlicmVhazsKKwl9CisKKwljYXNlIExTTV9PUEVSQVRJT05fTU9ERTogeworCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3RfbW9kZSAqZGV0X21vZGUgPSBkYXRhOworCQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgb3Btb2RlX2lkczsKKwkJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzIGNvbm5lY3Rwb3J0X2lkczsKKworCQlpZiAoZGV0X21vZGUtPm1vZGUgPT0gTFNNX01PREVfS0VZV09SRF9PTkxZX0RFVEVDVElPTikgeworCQkJY2xpZW50LT5tb2RlID0gMHgwMTsKKwkJfSBlbHNlIGlmIChkZXRfbW9kZS0+bW9kZSA9PSBMU01fTU9ERV9VU0VSX0tFWVdPUkRfREVURUNUSU9OKSB7CisJCQljbGllbnQtPm1vZGUgPSAweDAzOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogSW5jb3JyZWN0IGRldGVjdGlvbiBtb2RlICVkXG4iLAorCQkJCV9fZnVuY19fLCBkZXRfbW9kZS0+bW9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNsaWVudC0+bW9kZSB8PSBkZXRfbW9kZS0+ZGV0ZWN0X2ZhaWx1cmUgPDwgMjsKKwkJY2xpZW50LT5jb25uZWN0X3RvX3BvcnQgPSBnZXRfbHNtX3BvcnQoKTsKKworCQlvcG1vZGVfaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOworCQlvcG1vZGVfaWRzLnBhcmFtX2lkID0gcF9pbmZvLT5wYXJhbV9pZDsKKworCQljb25uZWN0cG9ydF9pZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9GUkFNRVdPUks7CisJCWNvbm5lY3Rwb3J0X2lkcy5wYXJhbV9pZCA9IExTTV9QQVJBTV9JRF9DT05ORUNUX1RPX1BPUlQ7CisKKwkJcmMgPSBxNmxzbV9zZW5kX3BhcmFtcyhjbGllbnQsICZvcG1vZGVfaWRzLCAmY29ubmVjdHBvcnRfaWRzLAorCQkJCSAgICAgICBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IE9QRVJBVElPTl9NT0RFIGZhaWxlZCwgcmMgJWRcbiIsCisJCQkJX19mdW5jX18sIHJjKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBMU01fR0FJTjogeworCQlzdHJ1Y3Qgc25kX2xzbV9nYWluICpsc21fZ2FpbiA9IChzdHJ1Y3Qgc25kX2xzbV9nYWluICopIGRhdGE7CisKKwkJaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOworCQlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCQlyYyA9IHE2bHNtX3NlbmRfcGFyYW1fZ2FpbihjbGllbnQsIGxzbV9nYWluLT5nYWluLCAmaWRzKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogTFNNX0dBSU4gY29tbWFuZCBmYWlsZWQsIHJjICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgTFNNX01JTl9DT05GSURFTkNFX0xFVkVMUzoKKwkJaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOworCQlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCQlyYyA9IHE2bHNtX3NlbmRfY29uZmlkZW5jZV9sZXZlbHMoY2xpZW50LCAmaWRzLAorCQkJCUxTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCIlczogQ09ORklERU5DRV9MRVZFTFMgY21kIGZhaWxlZCwgcmMgJWRcbiIsCisJCQkJIF9fZnVuY19fLCByYyk7CisJCWJyZWFrOworCWNhc2UgTFNNX1JFR19TTkRfTU9ERUw6IHsKKwkJc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtcyBtb2RlbF9wYXJhbTsKKwkJdTMyIHBheWxvYWRfc2l6ZTsKKworCQltZW1zZXQoJm1vZGVsX3BhcmFtLCAwLCBzaXplb2YobW9kZWxfcGFyYW0pKTsKKwkJcTZsc21fYWRkX2hkcihjbGllbnQsICZtb2RlbF9wYXJhbS5tc2dfaGRyLAorCQkJICAgICAgc2l6ZW9mKG1vZGVsX3BhcmFtKSwgdHJ1ZSk7CisJCW1vZGVsX3BhcmFtLm1zZ19oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI7CisJCXBheWxvYWRfc2l6ZSA9IHBfaW5mby0+cGFyYW1fc2l6ZSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24pOworCQlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oJm1vZGVsX3BhcmFtLnBhcmFtX2hkciwKKwkJCQlwYXlsb2FkX3NpemUsCisJCQkJbG93ZXJfMzJfYml0cyhjbGllbnQtPnNvdW5kX21vZGVsLnBoeXMpLAorCQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAorCQkJCQljbGllbnQtPnNvdW5kX21vZGVsLnBoeXMpLAorCQkJCWNsaWVudC0+c291bmRfbW9kZWwubWVtX21hcF9oYW5kbGUpOworCisJCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCisJCQkJCSZtb2RlbF9wYXJhbSwgdHJ1ZSwgTlVMTCk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCIlczogUkVHX1NORF9NT0RFTCBmYWlsZWQsIHJjICVkXG4iLAorCQkJCV9fZnVuY19fLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlyYyA9IHE2bHNtX3NlbmRfY2FsKGNsaWVudCwgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2VuZCBsc20gY2FsLCBlcnIgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlicmVhazsKKwl9CisKKwljYXNlIExTTV9ERVJFR19TTkRfTU9ERUw6IHsKKwkJc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiAqY29tbW9uOworCQlzdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zICpwYXJhbTsKKworCQlwa3Rfc3ogPSBzaXplb2YoKnBhcmFtKSArIHNpemVvZigqY29tbW9uKTsKKwkJcGFja2V0ID0ga3phbGxvYyhwa3Rfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIXBhY2tldCkgeworCQkJcHJfZXJyKCIlczogTm8gbWVtb3J5IGZvciBERVJFR19TTkRfTU9ERUwgcGt0LCBzaXplID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHBrdF9zeik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXBhcmFtID0gKHN0cnVjdCBsc21fY21kX3NldF9wYXJhbXMgKikgcGFja2V0OworCQljb21tb24gPSAoc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiAqKQorCQkJCShwYWNrZXQgKyBzaXplb2YoKnBhcmFtKSk7CisJCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmcGFyYW0tPm1zZ19oZHIsIHBrdF9zeiwgdHJ1ZSk7CisJCXBhcmFtLT5tc2dfaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOworCQlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oJnBhcmFtLT5wYXJhbV9oZHIsCisJCQkJCSBzaXplb2YoKmNvbW1vbiksCisJCQkJCSAwLCAwLCAwKTsKKwkJaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOworCQlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOworCQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKGNvbW1vbiwgJmlkcywgMCwKKwkJCQkgICAgICAgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOworCQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAorCQkJCQlwYWNrZXQsIHRydWUsIE5VTEwpOworCQlpZiAocmMpCisJCQlwcl9lcnIoIiVzOiBERVJFR19TTkRfTU9ERUwgZmFpbGVkLCByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlrZnJlZShwYWNrZXQpOworCQlicmVhazsKKwl9CisKKwljYXNlIExTTV9DVVNUT01fUEFSQU1TOiB7CisJCXN0cnVjdCBhcHJfaGRyICpoZHI7CisJCXU4ICpjdXN0b21fZGF0YTsKKworCQlpZiAocF9pbmZvLT5wYXJhbV9zaXplIDwKKwkJICAgIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uKSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAorCQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwa3Rfc3ogPSBwX2luZm8tPnBhcmFtX3NpemUgKyBzaXplb2YoKmhkcik7CisJCXBhY2tldCA9IGt6YWxsb2MocGt0X3N6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYWNrZXQpIHsKKwkJCXByX2VycigiJXM6IG5vIG1lbW9yeSBmb3IgQ1VTVE9NX1BBUkFNUywgc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwa3Rfc3opOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQloZHIgPSAoc3RydWN0IGFwcl9oZHIgKikgcGFja2V0OworCQljdXN0b21fZGF0YSA9ICh1OCAqKSAocGFja2V0ICsgc2l6ZW9mKCpoZHIpKTsKKwkJcTZsc21fYWRkX2hkcihjbGllbnQsIGhkciwgcGt0X3N6LCB0cnVlKTsKKwkJaGRyLT5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjsKKwkJbWVtY3B5KGN1c3RvbV9kYXRhLCBkYXRhLCBwX2luZm8tPnBhcmFtX3NpemUpOworCisJCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCisJCQkJCXBhY2tldCwgdHJ1ZSwgTlVMTCk7CisJCWlmIChyYykKKwkJCXByX2VycigiJXM6IENVU1RPTV9QQVJBTVMgZmFpbGVkLCByYyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQlrZnJlZShwYWNrZXQpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogd3JvbmcgcGFyYW1fdHlwZSAweCV4XG4iLAorCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fdHlwZSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisKK2ludCBxNmxzbV9zdGFydChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBib29sIHdhaXQpCit7CisJcmV0dXJuIHE2bHNtX2NtZChjbGllbnQsIExTTV9TRVNTSU9OX0NNRF9TVEFSVCwgd2FpdCk7Cit9CisKK2ludCBxNmxzbV9zdG9wKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIGJvb2wgd2FpdCkKK3sKKwlyZXR1cm4gcTZsc21fY21kKGNsaWVudCwgTFNNX1NFU1NJT05fQ01EX1NUT1AsIHdhaXQpOworfQorCitpbnQgcTZsc21fY2xvc2Uoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gcTZsc21fY21kKGNsaWVudCwgTFNNX1NFU1NJT05fQ01EX0NMT1NFX1RYLCB0cnVlKTsKK30KKworaW50IHE2bHNtX2xhYl9jb250cm9sKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHUzMiBlbmFibGUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbHNtX3BhcmFtc19sYWJfZW5hYmxlIGxhYl9lbmFibGU7CisJc3RydWN0IGxzbV9wYXJhbXNfbGFiX2NvbmZpZyBsYWJfY29uZmlnOworCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyBsYWJfaWRzOworCXUzMiBwYXJhbV9zaXplOworCisJaWYgKCFjbGllbnQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBjbGllbnQgJXBLXG4iLCBfX2Z1bmNfXywgY2xpZW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGVuYWJsZS9kaXNhYmxlIGxhYiBvbiBkc3AgKi8KKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJmxhYl9lbmFibGUubXNnX2hkciwgc2l6ZW9mKGxhYl9lbmFibGUpLCB0cnVlKTsKKwlsYWJfZW5hYmxlLm1zZ19oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVM7CisJcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZsYWJfZW5hYmxlLnBhcmFtc19oZHIsCisJCQkJIHNpemVvZihzdHJ1Y3QgbHNtX2xhYl9lbmFibGUpLAorCQkJCSAwLCAwLCAwKTsKKwlwYXJhbV9zaXplID0gKHNpemVvZihzdHJ1Y3QgbHNtX2xhYl9lbmFibGUpIC0KKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24pKTsKKwlsYWJfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfTEFCOworCWxhYl9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfTEFCX0VOQUJMRTsKKwlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZsYWJfZW5hYmxlLmxhYl9lbmFibGUuY29tbW9uLAorCQkJCSZsYWJfaWRzLCBwYXJhbV9zaXplLAorCQkJCUxTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKKwlsYWJfZW5hYmxlLmxhYl9lbmFibGUuZW5hYmxlID0gKGVuYWJsZSkgPyAxIDogMDsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCAmbGFiX2VuYWJsZSwgdHJ1ZSwgTlVMTCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IExhYiBlbmFibGUgZmFpbGVkIHJjICVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCWlmICghZW5hYmxlKQorCQlnb3RvIGV4aXQ7CisJLyogbGFiIHNlc3Npb24gaXMgYmVpbmcgZW5hYmxlZCBzZXQgdGhlIGNvbmZpZyB2YWx1ZXMgKi8KKwlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJmxhYl9jb25maWcubXNnX2hkciwgc2l6ZW9mKGxhYl9jb25maWcpLCB0cnVlKTsKKwlsYWJfY29uZmlnLm1zZ19oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVM7CisJcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZsYWJfY29uZmlnLnBhcmFtc19oZHIsCisJCQkJIHNpemVvZihzdHJ1Y3QgbHNtX2xhYl9jb25maWcpLAorCQkJCSAwLCAwLCAwKTsKKwlsYWJfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfTEFCOworCWxhYl9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfTEFCX0NPTkZJRzsKKwlwYXJhbV9zaXplID0gKHNpemVvZihzdHJ1Y3QgbHNtX2xhYl9jb25maWcpIC0KKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24pKTsKKwlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZsYWJfY29uZmlnLmxhYl9jb25maWcuY29tbW9uLAorCQkJICAgICAgICZsYWJfaWRzLCBwYXJhbV9zaXplLAorCQkJICAgICAgIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKKwlsYWJfY29uZmlnLmxhYl9jb25maWcubWlub3JfdmVyc2lvbiA9IDE7CisJbGFiX2NvbmZpZy5sYWJfY29uZmlnLndha2VfdXBfbGF0ZW5jeV9tcyA9IDI1MDsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCAmbGFiX2NvbmZpZywgdHJ1ZSwgTlVMTCk7CisJaWYgKHJjKSB7CisJCXByX2VycigiJXM6IExhYiBjb25maWcgZmFpbGVkIHJjICVkIGRpc2FibGUgbGFiXG4iLAorCQkgX19mdW5jX18sIHJjKTsKKwkJLyogTGFiIGNvbmZpZyBmYWlsZWQgZGlzYWJsZSBsYWIgKi8KKwkJbGFiX2VuYWJsZS5sYWJfZW5hYmxlLmVuYWJsZSA9IDA7CisJCWlmIChxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKKwkJCSZsYWJfZW5hYmxlLCB0cnVlLCBOVUxMKSkKKwkJCXByX2VycigiJXM6IExhYiBkaXNhYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCX0KK2V4aXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZsc21fc3RvcF9sYWIoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFjbGllbnQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBjbGllbnQgJXBLXG4iLCBfX2Z1bmNfXywgY2xpZW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJjID0gcTZsc21fY21kKGNsaWVudCwgTFNNX1NFU1NJT05fQ01EX0VPQiwgdHJ1ZSk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiBMYWIgc3RvcCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcTZsc21fcmVhZChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbHNtX2NtZF9yZWFkICpyZWFkKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIWNsaWVudCB8fCAhcmVhZCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBjbGllbnQgJXBLIHJlYWQgJXBLXG4iLCBfX2Z1bmNfXywKKwkJCWNsaWVudCwgcmVhZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IHJlYWQgY2FsbCBtZW1tYXAgaGFuZGxlICV4IGFkZHJlc3MgJXgleCBzaXplICVkXG4iLAorCQkgX19mdW5jX18sIHJlYWQtPm1lbV9tYXBfaGFuZGxlLCByZWFkLT5idWZfYWRkcl9tc3csCisJCXJlYWQtPmJ1Zl9hZGRyX2xzdywgcmVhZC0+YnVmX3NpemUpOworCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmcmVhZC0+aGRyLCBzaXplb2Yoc3RydWN0IGxzbV9jbWRfcmVhZCksIHRydWUpOworCXJlYWQtPmhkci5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfUkVBRDsKKwlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCByZWFkLCBmYWxzZSwgTlVMTCk7CisJaWYgKHJjKQorCQlwcl9lcnIoIiVzOiByZWFkIGJ1ZmZlciBjYWxsIGZhaWxlZCByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxNmxzbV9sYWJfYnVmZmVyX2FsbG9jKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIGJvb2wgYWxsb2MpCit7CisJaW50IHJldCA9IDAsIGkgPSAwOworCXNpemVfdCBhbGxvY2F0ZV9zaXplID0gMCwgbGVuID0gMDsKKworCWlmICghY2xpZW50KSB7CisJCXByX2VycigiJXM6IGludmFsaWQgY2xpZW50XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWxsb2MpIHsKKwkJaWYgKGNsaWVudC0+bGFiX2J1ZmZlcikgeworCQkJcHJfZXJyKCIlczogYnVmZmVycyBhcmUgYWxsb2NhdGVkIHBlcmlvZCBjb3VudCAlZCBwZXJpb2Qgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQljbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQsCisJCQkJY2xpZW50LT5od19wYXJhbXMuYnVmX3N6KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWFsbG9jYXRlX3NpemUgPSBjbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQgKgorCQkJCWNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zejsKKwkJYWxsb2NhdGVfc2l6ZSA9IFBBR0VfQUxJR04oYWxsb2NhdGVfc2l6ZSk7CisJCWNsaWVudC0+bGFiX2J1ZmZlciA9CisJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbHNtX2xhYl9idWZmZXIpICoKKwkJCWNsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2xpZW50LT5sYWJfYnVmZmVyKSB7CisJCQlwcl9lcnIoIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGFiIGJ1ZmZlciBmYWlsZWQgY291bnQgJWRcbiIKKwkJCQksIF9fZnVuY19fLAorCQkJCWNsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJsc21fbGFiIiwKKwkJCSZjbGllbnQtPmxhYl9idWZmZXJbMF0uY2xpZW50LAorCQkJJmNsaWVudC0+bGFiX2J1ZmZlclswXS5oYW5kbGUsCisJCQlhbGxvY2F0ZV9zaXplLCAmY2xpZW50LT5sYWJfYnVmZmVyWzBdLnBoeXMsCisJCQkmbGVuLAorCQkJJmNsaWVudC0+bGFiX2J1ZmZlclswXS5kYXRhKTsKKwkJaWYgKHJldCkKKwkJCXByX2VycigiJXM6IGlvbiBhbGxvYyBmYWlsZWQgcmV0ICVkIHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCByZXQsIGFsbG9jYXRlX3NpemUpOworCQllbHNlIHsKKwkJCXJldCA9IHE2bHNtX21lbW9yeV9tYXBfcmVnaW9ucyhjbGllbnQsCisJCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLnBoeXMsIGxlbiwKKwkJCQkmY2xpZW50LT5sYWJfYnVmZmVyWzBdLm1lbV9tYXBfaGFuZGxlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBtZW1vcnkgbWFwIGZpbGVkIHJldCAlZCBzaXplICV6ZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCwgbGVuKTsKKwkJCQltc21fYXVkaW9faW9uX2ZyZWUoCisJCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLmNsaWVudCwKKwkJCQljbGllbnQtPmxhYl9idWZmZXJbMF0uaGFuZGxlKTsKKwkJCX0KKwkJfQorCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBhbGxvYyBsYWIgYnVmZmVyIGZhaWxlZCByZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlrZnJlZShjbGllbnQtPmxhYl9idWZmZXIpOworCQkJY2xpZW50LT5sYWJfYnVmZmVyID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogTWVtb3J5IG1hcCBoYW5kbGUgJXggcGh5cyAlcEsgc2l6ZSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQljbGllbnQtPmxhYl9idWZmZXJbMF0ubWVtX21hcF9oYW5kbGUsCisJCQkJJmNsaWVudC0+bGFiX2J1ZmZlclswXS5waHlzLAorCQkJCWNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zeik7CisJCQlmb3IgKGkgPSAwOyBpIDwgY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50OyBpKyspIHsKKwkJCQljbGllbnQtPmxhYl9idWZmZXJbaV0ucGh5cyA9CisJCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLnBoeXMgKworCQkJCShpICogY2xpZW50LT5od19wYXJhbXMuYnVmX3N6KTsKKwkJCQljbGllbnQtPmxhYl9idWZmZXJbaV0uc2l6ZSA9CisJCQkJY2xpZW50LT5od19wYXJhbXMuYnVmX3N6OworCQkJCWNsaWVudC0+bGFiX2J1ZmZlcltpXS5kYXRhID0KKwkJCQkodTggKikoY2xpZW50LT5sYWJfYnVmZmVyWzBdLmRhdGEpICsKKwkJCQkoaSAqIGNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zeik7CisJCQkJY2xpZW50LT5sYWJfYnVmZmVyW2ldLm1lbV9tYXBfaGFuZGxlID0KKwkJCQljbGllbnQtPmxhYl9idWZmZXJbMF0ubWVtX21hcF9oYW5kbGU7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBxNmxzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhjbGllbnQsCisJCQljbGllbnQtPmxhYl9idWZmZXJbMF0ubWVtX21hcF9oYW5kbGUpOworCQlpZiAoIXJldCkKKwkJCW1zbV9hdWRpb19pb25fZnJlZSgKKwkJCWNsaWVudC0+bGFiX2J1ZmZlclswXS5jbGllbnQsCisJCQljbGllbnQtPmxhYl9idWZmZXJbMF0uaGFuZGxlKTsKKwkJZWxzZQorCQkJcHJfZXJyKCIlczogdW5tYXAgZmFpbGVkIG5vdCBmcmVlaW5nIG1lbW9yeVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJa2ZyZWUoY2xpZW50LT5sYWJfYnVmZmVyKTsKKwkJY2xpZW50LT5sYWJfYnVmZmVyID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfY2FsX3R5cGVfaW5kZXgoaW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoY2FsX3R5cGUpIHsKKwljYXNlIExTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlyZXQgPSBMU01fQ1VTVE9NX1RPUF9JRFg7CisJCWJyZWFrOworCWNhc2UgTFNNX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlyZXQgPSBMU01fVE9QX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBMU01fQ0FMX1RZUEU6CisJCXJldCA9IExTTV9DQUxfSURYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxNmxzbV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCWludCBjYWxfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCWxzbV9jb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XSwgMCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2FsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAorCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHE2bHNtX2RlYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsCisJCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNhbF91dGlsc19kZWFsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCWxzbV9jb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcTZsc21fc2V0X2NhbChpbnQzMl90IGNhbF90eXBlLAorCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOworCisJY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKKwlpZiAoY2FsX2luZGV4IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGNhbF91dGlsc19zZXRfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKKwkJbHNtX2NvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfaW5kZXggPT0gTFNNX0NVU1RPTV9UT1BfSURYKSB7CisJCW11dGV4X2xvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXS0+bG9jayk7CisJCWxzbV9jb21tb24uc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7CisJCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ1VTVE9NX1RPUF9JRFhdLT5sb2NrKTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbHNtX2RlbGV0ZV9jYWxfZGF0YSh2b2lkKQoreworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWNhbF91dGlsc19kZXN0cm95X2NhbF90eXBlcyhMU01fTUFYX0NBTF9JRFgsIGxzbV9jb21tb24uY2FsX2RhdGEpOworfQorCitzdGF0aWMgaW50IHE2bHNtX2luaXRfY2FsX2RhdGEodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FsX3R5cGVfaW5mbwljYWxfdHlwZV9pbmZvW10gPSB7CisJCXt7TFNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCisJCXtxNmxzbV9hbGxvY19jYWwsIHE2bHNtX2RlYWxsb2NfY2FsLCBOVUxMLAorCQlxNmxzbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tMU01fVE9QT0xPR1lfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLAorCQlxNmxzbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tMU01fQ0FMX1RZUEUsCisJCXtxNmxzbV9hbGxvY19jYWwsIHE2bHNtX2RlYWxsb2NfY2FsLCBOVUxMLAorCQlxNmxzbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0KKwl9OworCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKExTTV9NQVhfQ0FMX0lEWCwKKwkJbHNtX2NvbW1vbi5jYWxfZGF0YSwgY2FsX3R5cGVfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiByZXQ7CitlcnI6CisJbHNtX2RlbGV0ZV9jYWxfZGF0YSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHE2bHNtX2luaXQodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJc3Bpbl9sb2NrX2luaXQoJmxzbV9zZXNzaW9uX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtbWFwX2xvY2spOworCW11dGV4X2luaXQoJmxzbV9jb21tb24uYXByX2xvY2spOworCWZvciAoOyBpIDw9IExTTV9NQVhfU0VTU0lPTl9JRDsgaSsrKSB7CisJCWxzbV9jb21tb24uY29tbW9uX2NsaWVudFtpXS5zZXNzaW9uID0gTFNNX0NPTlRST0xfU0VTU0lPTjsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbHNtX2NvbW1vbi5jb21tb25fY2xpZW50W2ldLmNtZF93YWl0KTsKKwkJbXV0ZXhfaW5pdCgmbHNtX2NvbW1vbi5jb21tb25fY2xpZW50W2ldLmNtZF9sb2NrKTsKKwkJYXRvbWljX3NldCgmbHNtX2NvbW1vbi5jb21tb25fY2xpZW50W2ldLmNtZF9zdGF0ZSwKKwkJCSAgIENNRF9TVEFURV9DTEVBUkVEKTsKKwl9CisKKwlpZiAocTZsc21faW5pdF9jYWxfZGF0YSgpKQorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgaW5pdCBjYWwgZGF0YSFcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcTZsc21fZXhpdCh2b2lkKQoreworCWxzbV9kZWxldGVfY2FsX2RhdGEoKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHE2bHNtX2luaXQpOworX19leGl0Y2FsbChxNmxzbV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNnZvaWNlLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGIxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5jCkBAIC0wLDAgKzEsODM4MSBAQAorLyogIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgorCisjaW5jbHVkZSA8c29jL3Fjb20vc29jaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgorCisjaW5jbHVkZSAic291bmQvcTZhdWRpby12Mi5oIgorI2luY2x1ZGUgInNvdW5kL2Fwcl9hdWRpby12Mi5oIgorI2luY2x1ZGUgInNvdW5kL3E2YWZlLXYyLmgiCisjaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+CisjaW5jbHVkZSAicTZ2b2ljZS5oIgorI2luY2x1ZGUgPHNvdW5kL2Fkc3BfZXJyLmg+CisKKyNkZWZpbmUgVElNRU9VVF9NUyAzMDAKKworCisjZGVmaW5lIENNRF9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIENNRF9TVEFUVVNfRkFJTCAxCisKK2VudW0geworCVZPQ19UT0tFTl9OT05FLAorCVZPSVBfTUVNX01BUF9UT0tFTiwKKwlWT0NfQ0FMX01FTV9NQVBfVE9LRU4sCisJVk9DX1ZPSUNFX0hPU1RfUENNX01BUF9UT0tFTiwKKwlWT0NfUlRBQ19NRU1fTUFQX1RPS0VOLAorCVZPQ19TT1VSQ0VfVFJBQ0tJTkdfTUVNX01BUF9UT0tFTgorfTsKKworc3RydWN0IGN2ZF92ZXJzaW9uX3RhYmxlIGN2ZF92ZXJzaW9uX3RhYmxlX21hcHBpbmdbQ1ZEX0lOVF9WRVJTSU9OX01BWF0gPSB7CisJCXtDVkRfVkVSU0lPTl9ERUZBVUxULCBDVkRfSU5UX1ZFUlNJT05fREVGQVVMVH0sCisJCXtDVkRfVkVSU0lPTl8wXzAsIENWRF9JTlRfVkVSU0lPTl8wXzB9LAorCQl7Q1ZEX1ZFUlNJT05fMl8xLCBDVkRfSU5UX1ZFUlNJT05fMl8xfSwKKwkJe0NWRF9WRVJTSU9OXzJfMiwgQ1ZEX0lOVF9WRVJTSU9OXzJfMn0sCisJCXtDVkRfVkVSU0lPTl8yXzMsIENWRF9JTlRfVkVSU0lPTl8yXzN9LAorfTsKKworc3RhdGljIHN0cnVjdCBjb21tb25fZGF0YSBjb21tb247CitzdGF0aWMgYm9vbCBtb2R1bGVfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9lbmFibGVfdm9jcHJvY19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX25ldGlkX3RpbWluZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX2F0dGFjaF92b2Nwcm9jX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfc2V0X2RldmljZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX3ZvbF9zdGVwX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCisJCQkJCQkgICAgdWludDMyX3QgbWVtX2hhbmRsZSk7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX2NhbF9uZXR3b3JrX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfZGF0YV9leGNoYW5nZV9tb2RlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX3BhY2tldF9leGNoYW5nZV9jb25maWdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX2FuZF9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCQkJCSAgICAgdWludDMyX3QgbW9kZSk7CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX2RlcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2NyZWF0ZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9kZXZfY2ZnX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfdm9sX2NhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGV2aWNlX2NoYW5uZWxzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworCitzdGF0aWMgaW50IHZvaWNlX2N2c19zdG9wX3BsYXliYWNrKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0YXJ0X3BsYXliYWNrKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKK3N0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0YXJ0X3JlY29yZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdWludDMyX3QgcmVjX21vZGUpOworc3RhdGljIGludCB2b2ljZV9jdnNfc3RvcF9yZWNvcmQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOworCitzdGF0aWMgaW50MzJfdCBxZHNwX212bV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKK3N0YXRpYyBpbnQzMl90IHFkc3BfY3ZzX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOworc3RhdGljIGludDMyX3QgcWRzcF9jdnBfY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdik7CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKKwkJCQkJdWludDMyX3QgbW9kdWxlX2lkLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyBpbnQgaXNfY2FsX21lbW9yeV9hbGxvY2F0ZWQodm9pZCk7CitzdGF0aWMgYm9vbCBpc19jdmRfdmVyc2lvbl9xdWVyaWVkKHZvaWQpOworc3RhdGljIGludCBpc192b2lwX21lbW9yeV9hbGxvY2F0ZWQodm9pZCk7CitzdGF0aWMgaW50IHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY2hhciAqY3ZkX3Zlcl9zdHJpbmcpOworc3RhdGljIGludCB2b2ljZV9hbGxvY19jYWxfbWVtX21hcF90YWJsZSh2b2lkKTsKK3N0YXRpYyBpbnQgdm9pY2VfYWxsb2NfcnRhY19tZW1fbWFwX3RhYmxlKHZvaWQpOworc3RhdGljIGludCB2b2ljZV9hbGxvY19vb2Jfc2hhcmVkX21lbSh2b2lkKTsKK3N0YXRpYyBpbnQgdm9pY2VfZnJlZV9vb2Jfc2hhcmVkX21lbSh2b2lkKTsKK3N0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfb29iX21lbV90YWJsZSh2b2lkKTsKK3N0YXRpYyBpbnQgdm9pY2VfYWxsb2NfYW5kX21hcF9vb2JfbWVtKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKKworc3RhdGljIHN0cnVjdCB2b2ljZV9kYXRhICp2b2ljZV9nZXRfc2Vzc2lvbl9ieV9pZHgoaW50IGlkeCk7CisKK3N0YXRpYyBpbnQgcmVtYXBfY2FsX2RhdGEoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssCisJCQkgIHVpbnQzMl90IHNlc3Npb25faWQpOworc3RhdGljIGludCB2b2ljZV91bm1hcF9jYWxfbWVtb3J5KGludDMyX3QgY2FsX3R5cGUsCisJCQkJICBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayk7CisKK3N0YXRpYyBpbnQgaXNfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vbXJ5X2FsbG9jYXRlZCh2b2lkKTsKK3N0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkodm9pZCk7CitzdGF0aWMgaW50IHZvaWNlX2FsbG9jX2FuZF9tYXBfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkoCisJCQkJCQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7CitzdGF0aWMgaW50IHZvaWNlX3VubWFwX2FuZF9mcmVlX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KAorCQkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKnYpOworc3RhdGljIGludCB2b2ljZV9zZW5kX3NldF9zb3VuZF9mb2N1c19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCisJCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhKTsKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9nZXRfc291bmRfZm9jdXNfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAorCQkJCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSAqc291bmRGb2N1c0RhdGEpOworc3RhdGljIGludCB2b2ljZV9zZW5kX2dldF9zb3VyY2VfdHJhY2tpbmdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAorCQkJc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSAqc291cmNlVHJhY2tpbmdEYXRhKTsKKworc3RhdGljIHZvaWQgdm9pY2VfaXRyX2luaXQoc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyICppdHIsCisJCQkgICB1MzIgc2Vzc2lvbl9pZCkKK3sKKwlpZiAoaXRyID09IE5VTEwpCisJCXJldHVybjsKKwlpdHItPnNlc3Npb25faWR4ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbl9pZCA9PSBBTExfU0VTU0lPTl9WU0lEKQorCQlpdHItPmN1cl9pZHggPSAwOworCWVsc2UKKwkJaXRyLT5jdXJfaWR4ID0gaXRyLT5zZXNzaW9uX2lkeDsKKworfQorCitzdGF0aWMgYm9vbCB2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbihzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgKml0ciwKKwkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKip2b2ljZSkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCisJaWYgKGl0ciA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CisJcHJfZGVidWcoIiVzIDogY3VyIGlkeCA9ICVkIHNlc3Npb24gaWR4ID0gJWRcbiIsCisJCQkgX19mdW5jX18sIGl0ci0+Y3VyX2lkeCwgaXRyLT5zZXNzaW9uX2lkeCk7CisKKwlpZiAoaXRyLT5jdXJfaWR4IDw9IGl0ci0+c2Vzc2lvbl9pZHgpIHsKKwkJcmV0ID0gdHJ1ZTsKKwkJKnZvaWNlID0gdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGl0ci0+Y3VyX2lkeCk7CisJCWl0ci0+Y3VyX2lkeCsrOworCX0gZWxzZSB7CisJCSp2b2ljZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgdm9pY2VfaXNfdmFsaWRfc2Vzc2lvbl9pZCh1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlzd2l0Y2ggKHNlc3Npb25faWQpIHsKKwljYXNlIFZPSUNFX1NFU1NJT05fVlNJRDoKKwljYXNlIFZPSUNFMl9TRVNTSU9OX1ZTSUQ6CisJY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6CisJY2FzZSBWT0lQX1NFU1NJT05fVlNJRDoKKwljYXNlIFFDSEFUX1NFU1NJT05fVlNJRDoKKwljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6CisJY2FzZSBWT0lDRU1NT0RFMV9WU0lEOgorCWNhc2UgVk9JQ0VNTU9ERTJfVlNJRDoKKwljYXNlIEFMTF9TRVNTSU9OX1ZTSUQ6CisJCXJldCA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCA6ICV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUxNiB2b2ljZV9nZXRfbXZtX2hhbmRsZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG12bV9oYW5kbGUgJWRcbiIsIF9fZnVuY19fLCB2LT5tdm1faGFuZGxlKTsKKworCXJldHVybiB2LT5tdm1faGFuZGxlOworfQorCitzdGF0aWMgdm9pZCB2b2ljZV9zZXRfbXZtX2hhbmRsZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdTE2IG12bV9oYW5kbGUpCit7CisJcHJfZGVidWcoIiVzOiBtdm1faGFuZGxlICVkXG4iLCBfX2Z1bmNfXywgbXZtX2hhbmRsZSk7CisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXYtPm12bV9oYW5kbGUgPSBtdm1faGFuZGxlOworfQorCitzdGF0aWMgdTE2IHZvaWNlX2dldF9jdnNfaGFuZGxlKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXByX2RlYnVnKCIlczogY3ZzX2hhbmRsZSAlZFxuIiwgX19mdW5jX18sIHYtPmN2c19oYW5kbGUpOworCisJcmV0dXJuIHYtPmN2c19oYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIHZvaWNlX3NldF9jdnNfaGFuZGxlKHN0cnVjdCB2b2ljZV9kYXRhICp2LCB1MTYgY3ZzX2hhbmRsZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IGN2c19oYW5kbGUgJWRcbiIsIF9fZnVuY19fLCBjdnNfaGFuZGxlKTsKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJdi0+Y3ZzX2hhbmRsZSA9IGN2c19oYW5kbGU7Cit9CisKK3N0YXRpYyB1MTYgdm9pY2VfZ2V0X2N2cF9oYW5kbGUoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJfZGVidWcoIiVzOiBjdnBfaGFuZGxlICVkXG4iLCBfX2Z1bmNfXywgdi0+Y3ZwX2hhbmRsZSk7CisKKwlyZXR1cm4gdi0+Y3ZwX2hhbmRsZTsKK30KKworc3RhdGljIHZvaWQgdm9pY2Vfc2V0X2N2cF9oYW5kbGUoc3RydWN0IHZvaWNlX2RhdGEgKnYsIHUxNiBjdnBfaGFuZGxlKQoreworCXByX2RlYnVnKCIlczogY3ZwX2hhbmRsZSAlZFxuIiwgX19mdW5jX18sIGN2cF9oYW5kbGUpOworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl2LT5jdnBfaGFuZGxlID0gY3ZwX2hhbmRsZTsKK30KKworY2hhciAqdm9jX2dldF9zZXNzaW9uX25hbWUodTMyIHNlc3Npb25faWQpCit7CisJY2hhciAqc2Vzc2lvbl9uYW1lID0gTlVMTDsKKworCWlmIChzZXNzaW9uX2lkID09IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7CisJCXNlc3Npb25fbmFtZSA9IFZPSUNFX1NFU1NJT05fTkFNRTsKKwl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0xURV9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7CisJCXNlc3Npb25fbmFtZSA9IFZPTFRFX1NFU1NJT05fTkFNRTsKKwl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9RQ0hBVF9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7CisJCXNlc3Npb25fbmFtZSA9IFFDSEFUX1NFU1NJT05fTkFNRTsKKwl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRV0uc2Vzc2lvbl9pZCkgeworCQlzZXNzaW9uX25hbWUgPSBWT1dMQU5fU0VTU0lPTl9OQU1FOworCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PQorCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTFfUEFTU0lWRV0uc2Vzc2lvbl9pZCkgeworCQlzZXNzaW9uX25hbWUgPSBWT0lDRU1NT0RFMV9OQU1FOworCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PQorCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTJfUEFTU0lWRV0uc2Vzc2lvbl9pZCkgeworCQlzZXNzaW9uX25hbWUgPSBWT0lDRU1NT0RFMl9OQU1FOworCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PSBjb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCkgeworCQlzZXNzaW9uX25hbWUgPSBWT0lQX1NFU1NJT05fTkFNRTsKKwl9CisJcmV0dXJuIHNlc3Npb25fbmFtZTsKK30KKwordWludDMyX3Qgdm9jX2dldF9zZXNzaW9uX2lkKGNoYXIgKm5hbWUpCit7CisJdTMyIHNlc3Npb25faWQgPSAwOworCisJaWYgKG5hbWUgIT0gTlVMTCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCAiVm9pY2Ugc2Vzc2lvbiIpKQorCQkJc2Vzc2lvbl9pZCA9IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS5zZXNzaW9uX2lkOworCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJWb2ljZTIgc2Vzc2lvbiIpKQorCQkJc2Vzc2lvbl9pZCA9CisJCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0UyX1BBU1NJVkVdLnNlc3Npb25faWQ7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvTFRFIHNlc3Npb24iKSkKKwkJCXNlc3Npb25faWQgPQorCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdLnNlc3Npb25faWQ7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlFDSEFUIHNlc3Npb24iKSkKKwkJCXNlc3Npb25faWQgPQorCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1FDSEFUX1BBU1NJVkVdLnNlc3Npb25faWQ7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvV0xBTiBzZXNzaW9uIikpCisJCQlzZXNzaW9uX2lkID0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRV0uc2Vzc2lvbl9pZDsKKwkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVm9pY2VNTW9kZTEiKSkKKwkJCXNlc3Npb25faWQgPQorCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkVdLnNlc3Npb25faWQ7CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvaWNlTU1vZGUyIikpCisJCQlzZXNzaW9uX2lkID0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMl9QQVNTSVZFXS5zZXNzaW9uX2lkOworCQllbHNlCisJCQlzZXNzaW9uX2lkID0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQ7CisKKwkJcHJfZGVidWcoIiVzOiAlcyBoYXMgc2Vzc2lvbiBpZCAweCV4XG4iLCBfX2Z1bmNfXywgbmFtZSwKKwkJCQlzZXNzaW9uX2lkKTsKKwl9CisKKwlyZXR1cm4gc2Vzc2lvbl9pZDsKK30KKworc3RhdGljIHN0cnVjdCB2b2ljZV9kYXRhICp2b2ljZV9nZXRfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisKKwlzd2l0Y2ggKHNlc3Npb25faWQpIHsKKwljYXNlIFZPSUNFX1NFU1NJT05fVlNJRDoKKwkJdiA9ICZjb21tb24udm9pY2VbVk9DX1BBVEhfUEFTU0lWRV07CisJCWJyZWFrOworCisJY2FzZSBWT0lDRTJfU0VTU0lPTl9WU0lEOgorCQl2ID0gJmNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRTJfUEFTU0lWRV07CisJCWJyZWFrOworCisJY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6CisJCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdOworCQlicmVhazsKKworCWNhc2UgVk9JUF9TRVNTSU9OX1ZTSUQ6CisJCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdOworCQlicmVhazsKKworCWNhc2UgUUNIQVRfU0VTU0lPTl9WU0lEOgorCQl2ID0gJmNvbW1vbi52b2ljZVtWT0NfUEFUSF9RQ0hBVF9QQVNTSVZFXTsKKwkJYnJlYWs7CisKKwljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6CisJCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFXTsKKwkJYnJlYWs7CisKKwljYXNlIFZPSUNFTU1PREUxX1ZTSUQ6CisJCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkVdOworCQlicmVhazsKKworCWNhc2UgVk9JQ0VNTU9ERTJfVlNJRDoKKwkJdiA9ICZjb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTJfUEFTU0lWRV07CisJCWJyZWFrOworCisJY2FzZSBBTExfU0VTU0lPTl9WU0lEOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCA6ICV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOnNlc3Npb25faWQgMHgleCBzZXNzaW9uIGhhbmRsZSAlcEtcbiIsCisJCV9fZnVuY19fLCBzZXNzaW9uX2lkLCB2KTsKKworCXJldHVybiB2OworfQorCitpbnQgdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlpbnQgaWR4ID0gMDsKKworCXN3aXRjaCAoc2Vzc2lvbl9pZCkgeworCWNhc2UgVk9JQ0VfU0VTU0lPTl9WU0lEOgorCQlpZHggPSBWT0NfUEFUSF9QQVNTSVZFOworCQlicmVhazsKKworCWNhc2UgVk9JQ0UyX1NFU1NJT05fVlNJRDoKKwkJaWR4ID0gVk9DX1BBVEhfVk9JQ0UyX1BBU1NJVkU7CisJCWJyZWFrOworCisJY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6CisJCWlkeCA9IFZPQ19QQVRIX1ZPTFRFX1BBU1NJVkU7CisJCWJyZWFrOworCisJY2FzZSBWT0lQX1NFU1NJT05fVlNJRDoKKwkJaWR4ID0gVk9DX1BBVEhfRlVMTDsKKwkJYnJlYWs7CisKKwljYXNlIFFDSEFUX1NFU1NJT05fVlNJRDoKKwkJaWR4ID0gVk9DX1BBVEhfUUNIQVRfUEFTU0lWRTsKKwkJYnJlYWs7CisKKwljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6CisJCWlkeCA9IFZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFOworCQlicmVhazsKKworCWNhc2UgVk9JQ0VNTU9ERTFfVlNJRDoKKwkJaWR4ID0gVk9DX1BBVEhfVk9JQ0VNTU9ERTFfUEFTU0lWRTsKKwkJYnJlYWs7CisKKwljYXNlIFZPSUNFTU1PREUyX1ZTSUQ6CisJCWlkeCA9IFZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkU7CisJCWJyZWFrOworCisJY2FzZSBBTExfU0VTU0lPTl9WU0lEOgorCQlpZHggPSBNQVhfVk9DX1NFU1NJT05TIC0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb25faWQgOiAleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCisJCWJyZWFrOworCX0KKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm9pY2VfZGF0YSAqdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGludCBpZHgpCit7CisJcmV0dXJuICgoaWR4IDwgMCB8fCBpZHggPj0gTUFYX1ZPQ19TRVNTSU9OUykgPworCQkJCU5VTEwgOiAmY29tbW9uLnZvaWNlW2lkeF0pOworfQorCitzdGF0aWMgYm9vbCBpc192b2lwX3Nlc3Npb24odTMyIHNlc3Npb25faWQpCit7CisJcmV0dXJuIChzZXNzaW9uX2lkID09IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9GVUxMXS5zZXNzaW9uX2lkKTsKK30KKworc3RhdGljIGJvb2wgaXNfdm9sdGVfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdLnNlc3Npb25faWQpOworfQorCitzdGF0aWMgYm9vbCBpc192b2ljZTJfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFMl9QQVNTSVZFXS5zZXNzaW9uX2lkKTsKK30KKworc3RhdGljIGJvb2wgaXNfcWNoYXRfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1FDSEFUX1BBU1NJVkVdLnNlc3Npb25faWQpOworfQorCitzdGF0aWMgYm9vbCBpc192b3dsYW5fc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFXS5zZXNzaW9uX2lkKTsKK30KKworc3RhdGljIGJvb2wgaXNfdm9pY2VtbW9kZTEodTMyIHNlc3Npb25faWQpCit7CisJcmV0dXJuIHNlc3Npb25faWQgPT0KKwkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMV9QQVNTSVZFXS5zZXNzaW9uX2lkOworfQorCitzdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMih1MzIgc2Vzc2lvbl9pZCkKK3sKKwlyZXR1cm4gc2Vzc2lvbl9pZCA9PQorCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkVdLnNlc3Npb25faWQ7Cit9CisKK3N0YXRpYyBib29sIGlzX3ZvY19zdGF0ZV9hY3RpdmUoaW50IHZvY19zdGF0ZSkKK3sKKwlpZiAoKHZvY19zdGF0ZSA9PSBWT0NfUlVOKSB8fAorCQkodm9jX3N0YXRlID09IFZPQ19DSEFOR0UpIHx8CisJCSh2b2Nfc3RhdGUgPT0gVk9DX1NUQU5EQlkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdm9jX3NldF9lcnJvcl9zdGF0ZSh1aW50MTZfdCByZXNldF9wcm9jKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKKwkJdiA9ICZjb21tb24udm9pY2VbaV07CisJCWlmICh2ICE9IE5VTEwpCisJCQl2LT52b2Nfc3RhdGUgPSBWT0NfRVJST1I7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19vdGhlcl9zZXNzaW9uX2FjdGl2ZSh1MzIgc2Vzc2lvbl9pZCkKK3sKKwlpbnQgaTsKKwlib29sIHJldCA9IGZhbHNlOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgb3RoZXIgYWN0aXZlIHNlc3Npb24gZXhjZXB0IHRoZSBpbnB1dCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZPQ19TRVNTSU9OUzsgaSsrKSB7CisJCWlmIChjb21tb24udm9pY2VbaV0uc2Vzc2lvbl9pZCA9PSBzZXNzaW9uX2lkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUoY29tbW9uLnZvaWNlW2ldLnZvY19zdGF0ZSkpIHsKKwkJCXJldCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcl9kZWJ1ZygiJXM6IHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBpc19zdWIxX3ZzaWQodTMyIHNlc3Npb25faWQpCit7CisJYm9vbCByZXQ7CisKKwlzd2l0Y2ggKHNlc3Npb25faWQpIHsKKwljYXNlIFZPSUNFX1NFU1NJT05fVlNJRDoKKwljYXNlIFZPTFRFX1NFU1NJT05fVlNJRDoKKwljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6CisJY2FzZSBWT0lDRU1NT0RFMV9WU0lEOgorCQlyZXQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBpc19zdWIyX3ZzaWQodTMyIHNlc3Npb25faWQpCit7CisJYm9vbCByZXQ7CisKKwlzd2l0Y2ggKHNlc3Npb25faWQpIHsKKwljYXNlIFZPSUNFMl9TRVNTSU9OX1ZTSUQ6CisJY2FzZSBWT0lDRU1NT0RFMl9WU0lEOgorCQlyZXQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBpc192b2ljZV9hcHBfaWQodTMyIHNlc3Npb25faWQpCit7CisJcmV0dXJuIGlzX3N1YjFfdnNpZChzZXNzaW9uX2lkKSB8fCBpc19zdWIyX3ZzaWQoc2Vzc2lvbl9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfc2Vzc2lvbl9pZCh2b2lkKQoreworCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS5zZXNzaW9uX2lkID0gVk9JQ0VfU0VTU0lPTl9WU0lEOworCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0xURV9QQVNTSVZFXS5zZXNzaW9uX2lkID0gVk9MVEVfU0VTU0lPTl9WU0lEOworCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRTJfUEFTU0lWRV0uc2Vzc2lvbl9pZCA9IFZPSUNFMl9TRVNTSU9OX1ZTSUQ7CisJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQgPSBWT0lQX1NFU1NJT05fVlNJRDsKKwljb21tb24udm9pY2VbVk9DX1BBVEhfUUNIQVRfUEFTU0lWRV0uc2Vzc2lvbl9pZCA9IFFDSEFUX1NFU1NJT05fVlNJRDsKKwljb21tb24udm9pY2VbVk9DX1BBVEhfVk9XTEFOX1BBU1NJVkVdLnNlc3Npb25faWQgPSBWT1dMQU5fU0VTU0lPTl9WU0lEOworCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMV9QQVNTSVZFXS5zZXNzaW9uX2lkID0KKwkJCQkJCQlWT0lDRU1NT0RFMV9WU0lEOworCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMl9QQVNTSVZFXS5zZXNzaW9uX2lkID0KKwkJCQkJCQlWT0lDRU1NT0RFMl9WU0lEOworfQorCitzdGF0aWMgYm9vbCBpc19jdmRfdmVyc2lvbl9xdWVyaWVkKHZvaWQpCit7CisJYm9vbCByZXQgPSAwOworCisJaWYgKCFzdHJjbXAoY29tbW9uLmN2ZF92ZXJzaW9uLCBDVkRfVkVSU0lPTl9ERUZBVUxUKSkKKwkJcmV0ID0gZmFsc2U7CisJZWxzZQorCQlyZXQgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9nZXRfY3ZkX2ludF92ZXJzaW9uKGNoYXIgKmN2ZF92ZXJfc3RyaW5nKQoreworCXVuc2lnbmVkIGludCBpZHg7CisJaW50IGN2ZF9pbnRfdmVyID0gQ1ZEX0lOVF9WRVJTSU9OX0RFRkFVTFQ7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IENWRF9JTlRfVkVSU0lPTl9NQVg7IGlkeCsrKSB7CisJCWlmIChzdHJjbXAoKGNoYXIgKiljdmRfdmVyX3N0cmluZywKKwkJCSAgY3ZkX3ZlcnNpb25fdGFibGVfbWFwcGluZ1tpZHhdLmN2ZF92ZXIpID09IDApIHsKKwkJCWN2ZF9pbnRfdmVyID0KKwkJCWN2ZF92ZXJzaW9uX3RhYmxlX21hcHBpbmdbaWR4XS5jdmRfdmVyX2ludDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjdmRfaW50X3ZlcjsKK30KKworc3RhdGljIGludCB2b2ljZV9hcHJfcmVnaXN0ZXIodWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKworCS8qIHJlZ2lzdGVyIGNhbGxiYWNrIHRvIEFQUiAqLworCWlmIChjb21tb24uYXByX3E2X212bSA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCIlczogU3RhcnQgdG8gcmVnaXN0ZXIgTVZNIGNhbGxiYWNrXG4iLCBfX2Z1bmNfXyk7CisKKwkJY29tbW9uLmFwcl9xNl9tdm0gPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiTVZNIiwKKwkJCQkJCSBxZHNwX212bV9jYWxsYmFjaywKKwkJCQkJCSAweEZGRkZGRkZGLCAmY29tbW9uKTsKKworCQlpZiAoY29tbW9uLmFwcl9xNl9tdm0gPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIE1WTVxuIiwgX19mdW5jX18pOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoY29tbW9uLmFwcl9xNl9jdnMgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IFN0YXJ0IHRvIHJlZ2lzdGVyIENWUyBjYWxsYmFja1xuIiwgX19mdW5jX18pOworCisJCWNvbW1vbi5hcHJfcTZfY3ZzID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkNWUyIsCisJCQkJCQkgcWRzcF9jdnNfY2FsbGJhY2ssCisJCQkJCQkgMHhGRkZGRkZGRiwgJmNvbW1vbik7CisKKwkJaWYgKGNvbW1vbi5hcHJfcTZfY3ZzID09IE5VTEwpIHsKKwkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBDVlNcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXJ0YWNfc2V0X3ZvaWNlX2hhbmRsZShSVEFDX0NWUywgY29tbW9uLmFwcl9xNl9jdnMpOworCX0KKworCWlmIChjb21tb24uYXByX3E2X2N2cCA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCIlczogU3RhcnQgdG8gcmVnaXN0ZXIgQ1ZQIGNhbGxiYWNrXG4iLCBfX2Z1bmNfXyk7CisKKwkJY29tbW9uLmFwcl9xNl9jdnAgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQ1ZQIiwKKwkJCQkJCSBxZHNwX2N2cF9jYWxsYmFjaywKKwkJCQkJCSAweEZGRkZGRkZGLCAmY29tbW9uKTsKKworCQlpZiAoY29tbW9uLmFwcl9xNl9jdnAgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIENWUFxuIiwgX19mdW5jX18pOworCQkJZ290byBlcnI7CisJCX0KKwkJcnRhY19zZXRfdm9pY2VfaGFuZGxlKFJUQUNfQ1ZQLCBjb21tb24uYXByX3E2X2N2cCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAoY29tbW9uLmFwcl9xNl9jdnMgIT0gTlVMTCkgeworCQlhcHJfZGVyZWdpc3Rlcihjb21tb24uYXByX3E2X2N2cyk7CisJCWNvbW1vbi5hcHJfcTZfY3ZzID0gTlVMTDsKKwkJcnRhY19zZXRfdm9pY2VfaGFuZGxlKFJUQUNfQ1ZTLCBOVUxMKTsKKwl9CisJaWYgKGNvbW1vbi5hcHJfcTZfbXZtICE9IE5VTEwpIHsKKwkJYXByX2RlcmVnaXN0ZXIoY29tbW9uLmFwcl9xNl9tdm0pOworCQljb21tb24uYXByX3E2X212bSA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCWludCByZXQ7CisJc3RydWN0IGFwcl9oZHIgY3ZkX3ZlcnNpb25fZ2V0X2NtZDsKKwl2b2lkICphcHJfbXZtOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOworCWlmICghYXByX212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIFNlbmQgY29tbWFuZCB0byBDVkQgdG8gcmV0cmlldmUgVmVyc2lvbiAqLworCWN2ZF92ZXJzaW9uX2dldF9jbWQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRCgKKwkJCQlBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCUFQUl9QS1RfVkVSKTsKKwljdmRfdmVyc2lvbl9nZXRfY21kLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKAorCQkJCUFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZkX3ZlcnNpb25fZ2V0X2NtZCkgLQorCQkJCUFQUl9IRFJfU0laRSk7CisJY3ZkX3ZlcnNpb25fZ2V0X2NtZC5zcmNfcG9ydCA9CisJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZkX3ZlcnNpb25fZ2V0X2NtZC5kZXN0X3BvcnQgPSAwOworCWN2ZF92ZXJzaW9uX2dldF9jbWQudG9rZW4gPSAwOworCWN2ZF92ZXJzaW9uX2dldF9jbWQub3Bjb2RlID0gVlNTX0lWRVJTSU9OX0NNRF9HRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IHNlbmQgQ1ZEIHZlcnNpb24gZ2V0IGNtZCwgcGt0IHNpemUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjdmRfdmVyc2lvbl9nZXRfY21kLnBrdF9zaXplKTsKKworCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLAorCQkJICAgKHVpbnQzMl90ICopICZjdmRfdmVyc2lvbl9nZXRfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciBzZW5kaW5nIGNvbW1hbmRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0LCBmYWxsIGJhY2sgdG8gZGVmYXVsdFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gMDsKKworZG9uZToKKwlpZiAocmV0KSB7CisJCXN0cmxjcHkoY29tbW9uLmN2ZF92ZXJzaW9uLCBDVkRfVkVSU0lPTl8wXzAsCisJCQkJc2l6ZW9mKGNvbW1vbi5jdmRfdmVyc2lvbikpOworCX0KKwlwcl9kZWJ1ZygiJXM6IENWRCBWZXJzaW9uIHJldHJpZXZlZD0lc1xuIiwKKwkJIF9fZnVuY19fLCBjb21tb24uY3ZkX3ZlcnNpb24pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2R1YWxfY29udHJvbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG12bV9tb2RlbV9kdWFsX2NvbnRyb2xfc2Vzc2lvbl9jbWQgbXZtX3ZvaWNlX2N0bF9jbWQ7CisJdm9pZCAqYXByX212bTsKKwl1MTYgbXZtX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07CisJaWYgKCFhcHJfbXZtKSB7CisJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCIlczogU2VuZCBEdWFsIENvbnRyb2wgY29tbWFuZCB0byBNVk1cbiIsIF9fZnVuY19fKTsKKwlpZiAoIWlzX3ZvaXBfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgeworCQltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisJCW12bV92b2ljZV9jdGxfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAorCQkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCQltdm1fdm9pY2VfY3RsX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoCisJCQkJCQlBUFJfSERSX1NJWkUsCisJCQkJCQlzaXplb2YobXZtX3ZvaWNlX2N0bF9jbWQpIC0KKwkJCQkJCUFQUl9IRFJfU0laRSk7CisJCXByX2RlYnVnKCIlczogc2VuZCBtdm0gVm9pY2UgQ3RsIHBrdCBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgbXZtX3ZvaWNlX2N0bF9jbWQuaGRyLnBrdF9zaXplKTsKKwkJbXZtX3ZvaWNlX2N0bF9jbWQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQltdm1fdm9pY2VfY3RsX2NtZC5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwkJbXZtX3ZvaWNlX2N0bF9jbWQuaGRyLnRva2VuID0gMDsKKwkJbXZtX3ZvaWNlX2N0bF9jbWQuaGRyLm9wY29kZSA9CisJCQkJCVZTU19JTVZNX0NNRF9TRVRfUE9MSUNZX0RVQUxfQ09OVFJPTDsKKwkJbXZtX3ZvaWNlX2N0bF9jbWQudm9pY2VfY3RsLmVuYWJsZV9mbGFnID0gdHJ1ZTsKKwkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCQl2LT5hc3luY19lcnIgPSAwOworCisJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV92b2ljZV9jdGxfY21kKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IEVycm9yIHNlbmRpbmcgTVZNIFZvaWNlIENUTCBDTURcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCQkJKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJCXYtPmFzeW5jX2Vycik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcmV0ID0gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHZvaWNlX2NyZWF0ZV9tdm1fY3ZzX3Nlc3Npb24oc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG12bV9jcmVhdGVfY3RsX3Nlc3Npb25fY21kIG12bV9zZXNzaW9uX2NtZDsKKwlzdHJ1Y3QgY3ZzX2NyZWF0ZV9wYXNzaXZlX2N0bF9zZXNzaW9uX2NtZCBjdnNfc2Vzc2lvbl9jbWQ7CisJc3RydWN0IGN2c19jcmVhdGVfZnVsbF9jdGxfc2Vzc2lvbl9jbWQgY3ZzX2Z1bGxfY3RsX2NtZDsKKwlzdHJ1Y3QgbXZtX2F0dGFjaF9zdHJlYW1fY21kIGF0dGFjaF9zdHJlYW1fY21kOworCXZvaWQgKmFwcl9tdm0sICphcHJfY3ZzLCAqYXByX2N2cDsKKwl1MTYgbXZtX2hhbmRsZSwgY3ZzX2hhbmRsZSwgY3ZwX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07CisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKworCWlmICghYXByX212bSB8fCAhYXByX2N2cyB8fCAhYXByX2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIG9yIGFwcl9jdnMgb3IgYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKworCXByX2RlYnVnKCIlczogbXZtX2hkbD0lZCwgY3ZzX2hkbD0lZFxuIiwgX19mdW5jX18sCisJCW12bV9oYW5kbGUsIGN2c19oYW5kbGUpOworCS8qIHNlbmQgY21kIHRvIGNyZWF0ZSBtdm0gc2Vzc2lvbiBhbmQgd2FpdCBmb3IgcmVzcG9uc2UgKi8KKworCWlmICghbXZtX2hhbmRsZSkgeworCQltZW1zZXQobXZtX3Nlc3Npb25fY21kLm12bV9zZXNzaW9uLm5hbWUsIDAsCisJCQlzaXplb2YobXZtX3Nlc3Npb25fY21kLm12bV9zZXNzaW9uLm5hbWUpKTsKKwkJaWYgKCFpc192b2lwX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKKwkJCW12bV9zZXNzaW9uX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRCgKKwkJCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwkJCW12bV9zZXNzaW9uX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoCisJCQkJCQlBUFJfSERSX1NJWkUsCisJCQkJCQlzaXplb2YobXZtX3Nlc3Npb25fY21kKSAtCisJCQkJCQlBUFJfSERSX1NJWkUpOworCQkJcHJfZGVidWcoIiVzOiBzZW5kIG12bSBjcmVhdGUgc2Vzc2lvbiBwa3Qgc2l6ZSA9ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgbXZtX3Nlc3Npb25fY21kLmhkci5wa3Rfc2l6ZSk7CisJCQltdm1fc2Vzc2lvbl9jbWQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQkJbXZtX3Nlc3Npb25fY21kLmhkci5kZXN0X3BvcnQgPSAwOworCQkJbXZtX3Nlc3Npb25fY21kLmhkci50b2tlbiA9IDA7CisJCQltdm1fc2Vzc2lvbl9jbWQuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lNVk1fQ01EX0NSRUFURV9QQVNTSVZFX0NPTlRST0xfU0VTU0lPTjsKKwkJCWlmIChpc192b2x0ZV9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQkiZGVmYXVsdCB2b2x0ZSB2b2ljZSIsCisJCQkJc3RybGVuKCJkZWZhdWx0IHZvbHRlIHZvaWNlIikrMSk7CisJCQl9IGVsc2UgaWYgKGlzX3ZvaWNlMl9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQlWT0lDRTJfU0VTU0lPTl9WU0lEX1NUUiwKKwkJCQlzdHJsZW4oVk9JQ0UyX1NFU1NJT05fVlNJRF9TVFIpKzEpOworCQkJfSBlbHNlIGlmIChpc19xY2hhdF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQlRQ0hBVF9TRVNTSU9OX1ZTSURfU1RSLAorCQkJCXN0cmxlbihRQ0hBVF9TRVNTSU9OX1ZTSURfU1RSKSsxKTsKKwkJCX0gZWxzZSBpZiAoaXNfdm93bGFuX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAorCQkJCVZPV0xBTl9TRVNTSU9OX1ZTSURfU1RSLAorCQkJCXN0cmxlbihWT1dMQU5fU0VTU0lPTl9WU0lEX1NUUikrMSk7CisJCQl9IGVsc2UgaWYgKGlzX3ZvaWNlbW1vZGUxKHYtPnNlc3Npb25faWQpKSB7CisJCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQlWT0lDRU1NT0RFMV9WU0lEX1NUUiwKKwkJCQlzdHJsZW4oVk9JQ0VNTU9ERTFfVlNJRF9TVFIpICsgMSk7CisJCQl9IGVsc2UgaWYgKGlzX3ZvaWNlbW1vZGUyKHYtPnNlc3Npb25faWQpKSB7CisJCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQlWT0lDRU1NT0RFMl9WU0lEX1NUUiwKKwkJCQlzdHJsZW4oVk9JQ0VNTU9ERTJfVlNJRF9TVFIpICsgMSk7CisJCQl9IGVsc2UgeworCQkJCXN0cmxjcHkobXZtX3Nlc3Npb25fY21kLm12bV9zZXNzaW9uLm5hbWUsCisJCQkJImRlZmF1bHQgbW9kZW0gdm9pY2UiLAorCQkJCXN0cmxlbigiZGVmYXVsdCBtb2RlbSB2b2ljZSIpKzEpOworCQkJfQorCisJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCQl2LT5hc3luY19lcnIgPSAwOworCisJCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwKKwkJCQkJKHVpbnQzMl90ICopICZtdm1fc2Vzc2lvbl9jbWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBFcnJvciBzZW5kaW5nIE1WTV9DT05UUk9MX1NFU1NJT05cbiIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCQkJCSh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCQlpZiAoIXJldCkgeworCQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCQl2LT5hc3luY19lcnIpKTsKKwkJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQkJdi0+YXN5bmNfZXJyKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiJXM6IGNyZWF0aW5nIE1WTSBmdWxsIGN0cmxcbiIsIF9fZnVuY19fKTsKKwkJCW12bV9zZXNzaW9uX2NtZC5oZHIuaGRyX2ZpZWxkID0KKwkJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCQkJbXZtX3Nlc3Npb25fY21kLmhkci5wa3Rfc2l6ZSA9CisJCQkJCUFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihtdm1fc2Vzc2lvbl9jbWQpIC0KKwkJCQkJQVBSX0hEUl9TSVpFKTsKKwkJCW12bV9zZXNzaW9uX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCQltdm1fc2Vzc2lvbl9jbWQuaGRyLmRlc3RfcG9ydCA9IDA7CisJCQltdm1fc2Vzc2lvbl9jbWQuaGRyLnRva2VuID0gMDsKKwkJCW12bV9zZXNzaW9uX2NtZC5oZHIub3Bjb2RlID0KKwkJCQlWU1NfSU1WTV9DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OOworCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKKwkJCQkiZGVmYXVsdCB2b2lwIiwKKwkJCQlzdHJsZW4oImRlZmF1bHQgdm9pcCIpKzEpOworCisJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCQl2LT5hc3luY19lcnIgPSAwOworCisJCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwKKwkJCQkJKHVpbnQzMl90ICopICZtdm1fc2Vzc2lvbl9jbWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBNVk1fQ09OVFJPTF9TRVNTSU9OXG4iKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwkJCWlmICghcmV0KSB7CisJCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJCXYtPmFzeW5jX2VycikpOworCQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJCQl2LT5hc3luY19lcnIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQkvKiBHZXQgdGhlIGNyZWF0ZWQgTVZNIGhhbmRsZS4gKi8KKwkJbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOworCX0KKwkvKiBzZW5kIGNtZCB0byBjcmVhdGUgY3ZzIHNlc3Npb24gKi8KKwlpZiAoIWN2c19oYW5kbGUpIHsKKwkJbWVtc2V0KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLCAwLAorCQkJc2l6ZW9mKGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lKSk7CisJCWlmICghaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGNyZWF0aW5nIENWUyBwYXNzaXZlIHNlc3Npb25cbiIsCisJCQkJIF9fZnVuY19fKTsKKworCQkJY3ZzX3Nlc3Npb25fY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAorCQkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCQkJY3ZzX3Nlc3Npb25fY21kLmhkci5wa3Rfc2l6ZSA9CisJCQkJCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCQkJc2l6ZW9mKGN2c19zZXNzaW9uX2NtZCkgLQorCQkJCQkJQVBSX0hEUl9TSVpFKTsKKwkJCWN2c19zZXNzaW9uX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCQljdnNfc2Vzc2lvbl9jbWQuaGRyLmRlc3RfcG9ydCA9IDA7CisJCQljdnNfc2Vzc2lvbl9jbWQuaGRyLnRva2VuID0gMDsKKwkJCWN2c19zZXNzaW9uX2NtZC5oZHIub3Bjb2RlID0KKwkJCQlWU1NfSVNUUkVBTV9DTURfQ1JFQVRFX1BBU1NJVkVfQ09OVFJPTF9TRVNTSU9OOworCQkJaWYgKGlzX3ZvbHRlX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCSJkZWZhdWx0IHZvbHRlIHZvaWNlIiwKKwkJCQlzdHJsZW4oImRlZmF1bHQgdm9sdGUgdm9pY2UiKSsxKTsKKwkJCX0gZWxzZSBpZiAoaXNfdm9pY2UyX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCVZPSUNFMl9TRVNTSU9OX1ZTSURfU1RSLAorCQkJCXN0cmxlbihWT0lDRTJfU0VTU0lPTl9WU0lEX1NUUikrMSk7CisJCQl9IGVsc2UgaWYgKGlzX3FjaGF0X3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCVFDSEFUX1NFU1NJT05fVlNJRF9TVFIsCisJCQkJc3RybGVuKFFDSEFUX1NFU1NJT05fVlNJRF9TVFIpKzEpOworCQkJfSBlbHNlIGlmIChpc192b3dsYW5fc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgeworCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCisJCQkJVk9XTEFOX1NFU1NJT05fVlNJRF9TVFIsCisJCQkJc3RybGVuKFZPV0xBTl9TRVNTSU9OX1ZTSURfU1RSKSsxKTsKKwkJCX0gZWxzZSBpZiAoaXNfdm9pY2VtbW9kZTEodi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCVZPSUNFTU1PREUxX1ZTSURfU1RSLAorCQkJCXN0cmxlbihWT0lDRU1NT0RFMV9WU0lEX1NUUikgKyAxKTsKKwkJCX0gZWxzZSBpZiAoaXNfdm9pY2VtbW9kZTIodi0+c2Vzc2lvbl9pZCkpIHsKKwkJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCVZPSUNFTU1PREUyX1ZTSURfU1RSLAorCQkJCXN0cmxlbihWT0lDRU1NT0RFMl9WU0lEX1NUUikgKyAxKTsKKwkJCX0gZWxzZSB7CisJCQlzdHJsY3B5KGN2c19zZXNzaW9uX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCSJkZWZhdWx0IG1vZGVtIHZvaWNlIiwKKwkJCQlzdHJsZW4oImRlZmF1bHQgbW9kZW0gdm9pY2UiKSsxKTsKKwkJCX0KKwkJCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwkJCXYtPmFzeW5jX2VyciA9IDA7CisKKwkJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLAorCQkJCQkodWludDMyX3QgKikgJmN2c19zZXNzaW9uX2NtZCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFNUUkVBTV9DT05UUk9MX1NFU1NJT05cbiIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJCXYtPmFzeW5jX2Vycik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJLyogR2V0IHRoZSBjcmVhdGVkIENWUyBoYW5kbGUuICovCisJCQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwkJfSBlbHNlIHsKKwkJCXByX2RlYnVnKCIlczogY3JlYXRpbmcgQ1ZTIGZ1bGwgc2Vzc2lvblxuIiwgX19mdW5jX18pOworCisJCQljdnNfZnVsbF9jdGxfY21kLmhkci5oZHJfZmllbGQgPQorCQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQlBUFJfUEtUX1ZFUik7CisKKwkJCWN2c19mdWxsX2N0bF9jbWQuaGRyLnBrdF9zaXplID0KKwkJCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJc2l6ZW9mKGN2c19mdWxsX2N0bF9jbWQpIC0KKwkJCQkJQVBSX0hEUl9TSVpFKTsKKworCQkJY3ZzX2Z1bGxfY3RsX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCQljdnNfZnVsbF9jdGxfY21kLmhkci5kZXN0X3BvcnQgPSAwOworCQkJY3ZzX2Z1bGxfY3RsX2NtZC5oZHIudG9rZW4gPSAwOworCQkJY3ZzX2Z1bGxfY3RsX2NtZC5oZHIub3Bjb2RlID0KKwkJCQlWU1NfSVNUUkVBTV9DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OOworCQkJY3ZzX2Z1bGxfY3RsX2NtZC5jdnNfc2Vzc2lvbi5kaXJlY3Rpb24gPSAyOworCQkJY3ZzX2Z1bGxfY3RsX2NtZC5jdnNfc2Vzc2lvbi5lbmNfbWVkaWFfdHlwZSA9CisJCQkJCQljb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZTsKKwkJCWN2c19mdWxsX2N0bF9jbWQuY3ZzX3Nlc3Npb24uZGVjX21lZGlhX3R5cGUgPQorCQkJCQkJY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGU7CisJCQljdnNfZnVsbF9jdGxfY21kLmN2c19zZXNzaW9uLm5ldHdvcmtfaWQgPQorCQkJCQkgICAgICAgY29tbW9uLm12c19pbmZvLm5ldHdvcmtfdHlwZTsKKwkJCXN0cmxjcHkoY3ZzX2Z1bGxfY3RsX2NtZC5jdnNfc2Vzc2lvbi5uYW1lLAorCQkJCSJkZWZhdWx0IHE2IHZvaWNlIiwKKwkJCQlzdHJsZW4oImRlZmF1bHQgcTYgdm9pY2UiKSsxKTsKKworCQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCQkJdi0+YXN5bmNfZXJyID0gMDsKKworCQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsCisJCQkJCSAgICh1aW50MzJfdCAqKSAmY3ZzX2Z1bGxfY3RsX2NtZCk7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogRXJyICVkIHNlbmRpbmcgQ1JFQVRFX0ZVTExfQ1RSTFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAorCQkJCQkodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJCXYtPmFzeW5jX2Vycik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJLyogR2V0IHRoZSBjcmVhdGVkIENWUyBoYW5kbGUuICovCisJCQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwkJCS8qIEF0dGFjaCBNVk0gdG8gQ1ZTLiAqLworCQkJcHJfZGVidWcoIiVzOiBBdHRhY2ggTVZNIHRvIHN0cmVhbVxuIiwgX19mdW5jX18pOworCisJCQlhdHRhY2hfc3RyZWFtX2NtZC5oZHIuaGRyX2ZpZWxkID0KKwkJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJQVBSX1BLVF9WRVIpOworCQkJYXR0YWNoX3N0cmVhbV9jbWQuaGRyLnBrdF9zaXplID0KKwkJCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJc2l6ZW9mKGF0dGFjaF9zdHJlYW1fY21kKSAtCisJCQkJCUFQUl9IRFJfU0laRSk7CisJCQlhdHRhY2hfc3RyZWFtX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCQlhdHRhY2hfc3RyZWFtX2NtZC5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwkJCWF0dGFjaF9zdHJlYW1fY21kLmhkci50b2tlbiA9IDA7CisJCQlhdHRhY2hfc3RyZWFtX2NtZC5oZHIub3Bjb2RlID0KKwkJCQkJCVZTU19JTVZNX0NNRF9BVFRBQ0hfU1RSRUFNOworCQkJYXR0YWNoX3N0cmVhbV9jbWQuYXR0YWNoX3N0cmVhbS5oYW5kbGUgPSBjdnNfaGFuZGxlOworCisJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCQl2LT5hc3luY19lcnIgPSAwOworCQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sCisJCQkJCSAgICh1aW50MzJfdCAqKSAmYXR0YWNoX3N0cmVhbV9jbWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIEFUVEFDSF9TVFJFQU1cbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJCXYtPmFzeW5jX2Vycik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfdW5tYXBfY2FsX2Jsb2NrKHN0cnVjdCB2b2ljZV9kYXRhICp2LCBpbnQgY2FsX2luZGV4KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOworCisJaWYgKGNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQ2FsIHR5cGUgaXMgTlVMTCwgaW5kZXggJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9pbmRleCk7CisKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKKwljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAorCQljb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XSk7CisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENhbCBibG9jayBpcyBOVUxMLCBpbmRleCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKKworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IFE2IGhhbmRsZSBpcyBub3Qgc2V0IVxuIiwgX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJcmVzdWx0ID0gdm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCgKKwkJdiwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOworCWlmIChyZXN1bHQpCisJCXByX2VycigiJXM6IFZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQgZmFpbGVkIGZvciBzZXNzaW9uIDB4JXgsIGVyciAlZCFcbiIsCisJCQlfX2Z1bmNfXywgdi0+c2Vzc2lvbl9pZCwgcmVzdWx0KTsKKworCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gMDsKKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfZGVzdHJveV9tdm1fY3ZzX3Nlc3Npb24oc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG12bV9kZXRhY2hfc3RyZWFtX2NtZCBkZXRhY2hfc3RyZWFtOworCXN0cnVjdCBhcHJfaGRyIG12bV9kZXN0cm95OworCXN0cnVjdCBhcHJfaGRyIGN2c19kZXN0cm95OworCXZvaWQgKmFwcl9tdm0sICphcHJfY3ZzOworCXUxNiBtdm1faGFuZGxlLCBjdnNfaGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKwlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwlpZiAoIWFwcl9tdm0gfHwgIWFwcl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX212bSBvciBhcHJfY3ZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKKwljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwkvKiBNVk0sIENWUyBzZXNzaW9ucyBhcmUgZGVzdHJveWVkIG9ubHkgZm9yIEZ1bGwgY29udHJvbCBzZXNzaW9ucy4gKi8KKwlpZiAoaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCXByX2RlYnVnKCIlczogTVZNIGRldGFjaCBzdHJlYW0sIFZPQ19TVEFURTogJWRcbiIsIF9fZnVuY19fLAorCQkJCXYtPnZvY19zdGF0ZSk7CisKKwkJLyogRGV0YWNoIHZvaWNlIHN0cmVhbS4gKi8KKwkJZGV0YWNoX3N0cmVhbS5oZHIuaGRyX2ZpZWxkID0KKwkJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJQVBSX1BLVF9WRVIpOworCQlkZXRhY2hfc3RyZWFtLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihkZXRhY2hfc3RyZWFtKSAtIEFQUl9IRFJfU0laRSk7CisJCWRldGFjaF9zdHJlYW0uaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQlkZXRhY2hfc3RyZWFtLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOworCQlkZXRhY2hfc3RyZWFtLmhkci50b2tlbiA9IDA7CisJCWRldGFjaF9zdHJlYW0uaGRyLm9wY29kZSA9IFZTU19JTVZNX0NNRF9ERVRBQ0hfU1RSRUFNOworCQlkZXRhY2hfc3RyZWFtLmRldGFjaF9zdHJlYW0uaGFuZGxlID0gY3ZzX2hhbmRsZTsKKworCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCXYtPmFzeW5jX2VyciA9IDA7CisJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJmRldGFjaF9zdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBERVRBQ0hfU1RSRUFNXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJCWlmICghcmV0KSB7CisJCQlwcl9lcnIoIiVzOiB3YWl0IGV2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQkJZ290byBmYWlsOworCQl9CisJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJCXYtPmFzeW5jX2Vycik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQkvKiBVbm1hcCBtZW1vcnkgKi8KKwkJaWYgKHYtPnNobWVtX2luZm8ubWVtX2hhbmRsZSAhPSAwKSB7CisJCQlyZXQgPSB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKHYsCisJCQkJCQl2LT5zaG1lbV9pbmZvLm1lbV9oYW5kbGUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzIE1lbW9yeV91bm1hcCBmb3Igdm9pcCBmYWlsZWQgJWRcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCisJCQkJZ290byBmYWlsOworCQkJfQorCQkJdi0+c2htZW1faW5mby5tZW1faGFuZGxlID0gMDsKKwkJfQorCX0KKworCS8qIFVubWFwIFNvdXJjZSBUcmFja2luZyBzaGFyZWQgbWVtb3J5IGlmIG1hcHBlZCBlYXJsaWVyICovCisJdm9pY2VfdW5tYXBfYW5kX2ZyZWVfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkodik7CisKKwlpZiAoaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpIHx8CisJICAgIGlzX3FjaGF0X3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkgfHwKKwkgICAgaXNfdm9sdGVfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSB8fAorCSAgICBpc192b3dsYW5fc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSB8fAorCSAgICB2LT52b2Nfc3RhdGUgPT0gVk9DX0VSUk9SIHx8IGNvbW1vbi5pc19kZXN0cm95X2N2ZCkgeworCQkvKiBEZXN0cm95IENWUy4gKi8KKwkJcHJfZGVidWcoIiVzOiBDVlMgZGVzdHJveSBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7CisKKwkJY3ZzX2Rlc3Ryb3kuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQkgICAgICBBUFJfUEtUX1ZFUik7CisJCWN2c19kZXN0cm95LnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJc2l6ZW9mKGN2c19kZXN0cm95KSAtIEFQUl9IRFJfU0laRSk7CisJCWN2c19kZXN0cm95LnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQljdnNfZGVzdHJveS5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCQljdnNfZGVzdHJveS50b2tlbiA9IDA7CisJCWN2c19kZXN0cm95Lm9wY29kZSA9IEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOworCisJCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwkJdi0+YXN5bmNfZXJyID0gMDsKKwkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX2Rlc3Ryb3kpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBDVlMgREVTVFJPWVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBmYWlsOworCQl9CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdCBldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisJCWN2c19oYW5kbGUgPSAwOworCQl2b2ljZV9zZXRfY3ZzX2hhbmRsZSh2LCBjdnNfaGFuZGxlKTsKKworCQkvKiBVbm1hcCBwaHlzaWNhbCBtZW1vcnkgZm9yIGFsbCBjYWxpYnJhdGlvbiBidWZmZXJzICovCisJCWlmICghaXNfb3RoZXJfc2Vzc2lvbl9hY3RpdmUodi0+c2Vzc2lvbl9pZCkpIHsKKwkJCWlmICh2b2ljZV91bm1hcF9jYWxfYmxvY2sodiwgQ1ZQX1ZPQ1BST0NfQ0FMKSkKKwkJCQlwcl9lcnIoIiVzOiBVbm1hcCBWT0NQUk9DIGNhbCBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWlmICh2b2ljZV91bm1hcF9jYWxfYmxvY2sodiwgQ1ZQX1ZPQ1ZPTF9DQUwpKQorCQkJCXByX2VycigiJXM6IFVubWFwIFZPQ1ZPTCBjYWwgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlpZiAodm9pY2VfdW5tYXBfY2FsX2Jsb2NrKHYsIENWUF9WT0NERVZfQ0ZHX0NBTCkpCisJCQkJcHJfZXJyKCIlczogVW5tYXAgVk9DREVWX0NGRyBjYWwgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlpZiAodm9pY2VfdW5tYXBfY2FsX2Jsb2NrKHYsIENWU19WT0NTVFJNX0NBTCkpCisJCQkJcHJfZXJyKCIlczogVW5tYXAgVk9DU1RSTSBjYWwgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCX0KKworCQkvKiBEZXN0cm95IE1WTS4gKi8KKwkJcHJfZGVidWcoIiVzOiBNVk0gZGVzdHJveSBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7CisKKwkJbXZtX2Rlc3Ryb3kuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQkgICAgICBBUFJfUEtUX1ZFUik7CisJCW12bV9kZXN0cm95LnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJICAgIHNpemVvZihtdm1fZGVzdHJveSkgLSBBUFJfSERSX1NJWkUpOworCQltdm1fZGVzdHJveS5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwkJbXZtX2Rlc3Ryb3kuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwkJbXZtX2Rlc3Ryb3kudG9rZW4gPSAwOworCQltdm1fZGVzdHJveS5vcGNvZGUgPSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTjsKKworCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCXYtPmFzeW5jX2VyciA9IDA7CisKKwkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX2Rlc3Ryb3kpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBNVk0gREVTVFJPWVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBmYWlsOworCQl9CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdCBldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJdi0+YXN5bmNfZXJyKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQltdm1faGFuZGxlID0gMDsKKwkJdm9pY2Vfc2V0X212bV9oYW5kbGUodiwgbXZtX2hhbmRsZSk7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfdHR5X21vZGVfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtdm1fc2V0X3R0eV9tb2RlX2NtZCBtdm1fdHR5X21vZGVfY21kOworCXZvaWQgKmFwcl9tdm07CisJdTE2IG12bV9oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOworCisJaWYgKCFhcHJfbXZtKSB7CisJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKKworCS8qIHNlbmQgdHR5IG1vZGUgY21kIHRvIG12bSAqLworCW12bV90dHlfbW9kZV9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoCisJCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQlBUFJfUEtUX1ZFUik7CisJbXZtX3R0eV9tb2RlX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCQlzaXplb2YobXZtX3R0eV9tb2RlX2NtZCkgLQorCQkJCQlBUFJfSERSX1NJWkUpOworCXByX2RlYnVnKCIlczogcGt0IHNpemUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBtdm1fdHR5X21vZGVfY21kLmhkci5wa3Rfc2l6ZSk7CisJbXZtX3R0eV9tb2RlX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwltdm1fdHR5X21vZGVfY21kLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOworCW12bV90dHlfbW9kZV9jbWQuaGRyLnRva2VuID0gMDsKKwltdm1fdHR5X21vZGVfY21kLmhkci5vcGNvZGUgPSBWU1NfSVNUUkVBTV9DTURfU0VUX1RUWV9NT0RFOworCW12bV90dHlfbW9kZV9jbWQudHR5X21vZGUubW9kZSA9IHYtPnR0eV9tb2RlOworCXByX2RlYnVnKCJ0dHkgbW9kZSA9JWRcbiIsIG12bV90dHlfbW9kZV9jbWQudHR5X21vZGUubW9kZSk7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fdHR5X21vZGVfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9UVFlfTU9ERVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCisJCQkJCXVpbnQzMl90IG1vZHVsZV9pZCwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgY3ZzX3NldF9wcF9lbmFibGVfY21kIGN2c19zZXRfcHBfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnM7CisJdTE2IGN2c19oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCisJaWYgKCFhcHJfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKworCWN2c19zZXRfcHBfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJICAgICBBUFJfUEtUX1ZFUik7CisJY3ZzX3NldF9wcF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJCSAgIHNpemVvZihjdnNfc2V0X3BwX2NtZCkgLQorCQkJCQkJICAgQVBSX0hEUl9TSVpFKTsKKwljdnNfc2V0X3BwX2NtZC5oZHIuc3JjX3BvcnQgPSB2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2c19zZXRfcHBfY21kLmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCWN2c19zZXRfcHBfY21kLmhkci50b2tlbiA9IDA7CisJY3ZzX3NldF9wcF9jbWQuaGRyLm9wY29kZSA9IFZTU19JQ09NTU9OX0NNRF9TRVRfVUlfUFJPUEVSVFk7CisKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLnBhcmFtX2lkID0gVk9JQ0VfUEFSQU1fTU9EX0VOQUJMRTsKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLnBhcmFtX3NpemUgPSBNT0RfRU5BQkxFX1BBUkFNX0xFTjsKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLnJlc2VydmVkID0gMDsKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLmVuYWJsZSA9IGVuYWJsZTsKKwljdnNfc2V0X3BwX2NtZC52c3Nfc2V0X3BwLnJlc2VydmVkX2ZpZWxkID0gMDsKKwlwcl9kZWJ1Zygidm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZCwgbW9kdWxlX2lkPSVkLCBlbmFibGU9JWRcbiIsCisJCW1vZHVsZV9pZCwgZW5hYmxlKTsKKworCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zZXRfcHBfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWw6IHNlbmRpbmcgY3ZzIHNldCBwcCBlbmFibGUsXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCisJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2hkX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbXZtX3NldF9oZF9lbmFibGVfY21kIG12bV9zZXRfaGRfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9tdm07CisJdTE2IG12bV9oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07CisJaWYgKCFhcHJfbXZtKSB7CisJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOworCWlmICghbXZtX2hhbmRsZSkgeworCQlwcl9lcnIoIiVzOiBtdm1faGFuZGxlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXZtX3NldF9oZF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQkgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKKwltdm1fc2V0X2hkX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCQkJICAgc2l6ZW9mKG12bV9zZXRfaGRfY21kKSAtCisJCQkJCQkgICBBUFJfSERSX1NJWkUpOworCW12bV9zZXRfaGRfY21kLmhkci5zcmNfcG9ydCA9IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJbXZtX3NldF9oZF9jbWQuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7CisJbXZtX3NldF9oZF9jbWQuaGRyLnRva2VuID0gMDsKKworCWlmIChlbmFibGUpCisJCW12bV9zZXRfaGRfY21kLmhkci5vcGNvZGUgPSBWU1NfSUhEVk9JQ0VfQ01EX0VOQUJMRTsKKwllbHNlCisJCW12bV9zZXRfaGRfY21kLmhkci5vcGNvZGUgPSBWU1NfSUhEVk9JQ0VfQ01EX0RJU0FCTEU7CisKKwlwcl9kZWJ1ZygiJXM6IGVuYWJsZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc2V0X2hkX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNlbmRpbmcgbXZtIHNldCBIRCBWb2ljZSBlbmFibGUgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NldF9kdHgoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKwlzdHJ1Y3QgY3ZzX3NldF9lbmNfZHR4X21vZGVfY21kIGN2c19zZXRfZHR4OworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKKworCWlmICghYXByX2N2cykgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKworCS8qIFNldCBEVFggKi8KKwljdnNfc2V0X2R0eC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJICAgICAgQVBSX1BLVF9WRVIpOworCWN2c19zZXRfZHR4Lmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihjdnNfc2V0X2R0eCkgLSBBUFJfSERSX1NJWkUpOworCWN2c19zZXRfZHR4Lmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnNfc2V0X2R0eC5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKKwljdnNfc2V0X2R0eC5oZHIudG9rZW4gPSAwOworCWN2c19zZXRfZHR4Lmhkci5vcGNvZGUgPSBWU1NfSVNUUkVBTV9DTURfU0VUX0VOQ19EVFhfTU9ERTsKKwljdnNfc2V0X2R0eC5kdHhfbW9kZS5lbmFibGUgPSBjb21tb24ubXZzX2luZm8uZHR4X21vZGU7CisKKwlwcl9kZWJ1ZygiJXM6IFNldHRpbmcgRFRYICVkXG4iLCBfX2Z1bmNfXywgY29tbW9uLm12c19pbmZvLmR0eF9tb2RlKTsKKworCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3NldF9kdHgpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX0RUWFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fbWVkaWFfdHlwZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IHZzc19pbXZtX2NtZF9zZXRfY2FsX21lZGlhX3R5cGVfdCBtdm1fc2V0X2NhbF9tZWRpYV90eXBlOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9tdm07CisJdTE2IG12bV9oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOworCisJaWYgKCFhcHJfbXZtKSB7CisJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKKworCW12bV9zZXRfY2FsX21lZGlhX3R5cGUuaGRyLmhkcl9maWVsZCA9CisJCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCUFQUl9QS1RfVkVSKTsKKwltdm1fc2V0X2NhbF9tZWRpYV90eXBlLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihtdm1fc2V0X2NhbF9tZWRpYV90eXBlKSAtCisJCQkJCUFQUl9IRFJfU0laRSk7CisJbXZtX3NldF9jYWxfbWVkaWFfdHlwZS5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJbXZtX3NldF9jYWxfbWVkaWFfdHlwZS5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwltdm1fc2V0X2NhbF9tZWRpYV90eXBlLmhkci50b2tlbiA9IDA7CisJbXZtX3NldF9jYWxfbWVkaWFfdHlwZS5oZHIub3Bjb2RlID0gVlNTX0lNVk1fQ01EX1NFVF9DQUxfTUVESUFfVFlQRTsKKwltdm1fc2V0X2NhbF9tZWRpYV90eXBlLm1lZGlhX2lkID0gY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGU7CisJcHJfZGVidWcoIiVzOiBzZXR0aW5nIG1lZGlhX2lkIGFzICV4XG4iLAorCQkgX19mdW5jX18sIG12bV9zZXRfY2FsX21lZGlhX3R5cGUubWVkaWFfaWQpOworCisJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3NldF9jYWxfbWVkaWFfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBtZWRpYSB0eXBlXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2R0bWZfcnhfZGV0ZWN0aW9uX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKKwkJCQkJICAgIHVpbnQzMl90IGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZzOworCXUxNiBjdnNfaGFuZGxlOworCXN0cnVjdCBjdnNfc2V0X3J4X2R0bWZfZGV0ZWN0aW9uX2NtZCBjdnNfZHRtZl9yeF9kZXRlY3Rpb247CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCisJaWYgKCFhcHJfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJLyogU2V0IFNFVF9EVE1GX1JYX0RFVEVDVElPTiAqLworCWN2c19kdG1mX3J4X2RldGVjdGlvbi5oZHIuaGRyX2ZpZWxkID0KKwkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgICBBUFJfUEtUX1ZFUik7CisJY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmhkci5wa3Rfc2l6ZSA9CisJCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnNfZHRtZl9yeF9kZXRlY3Rpb24uaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmhkci50b2tlbiA9IDA7CisJY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmhkci5vcGNvZGUgPQorCQkJCQlWU1NfSVNUUkVBTV9DTURfU0VUX1JYX0RUTUZfREVURUNUSU9OOworCWN2c19kdG1mX3J4X2RldGVjdGlvbi5jdnNfZHRtZl9kZXQuZW5hYmxlID0gZW5hYmxlOworCisJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfZHRtZl9yeF9kZXRlY3Rpb24pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX0RUTUZfUlhfREVURUNUSU9OXG4iLAorCQkgICAgICAgX19mdW5jX18sCisJCSAgICAgICByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCisJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCB2b2NfZGlzYWJsZV9kdG1mX2RldF9vbl9hY3RpdmVfc2Vzc2lvbnModm9pZCkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZPQ19TRVNTSU9OUzsgaSsrKSB7CisJCXYgPSAmY29tbW9uLnZvaWNlW2ldOworCQlpZiAoKHYtPmR0bWZfcnhfZGV0ZWN0X2VuKSAmJgorCQkJaXNfdm9jX3N0YXRlX2FjdGl2ZSh2LT52b2Nfc3RhdGUpKSB7CisKKwkJCXByX2RlYnVnKCJkaXNhYmxlIGR0bWYgZGV0IG9uIHNlc19pZD0lZFxuIiwKKwkJCQkgdi0+c2Vzc2lvbl9pZCk7CisJCQl2b2ljZV9zZW5kX2R0bWZfcnhfZGV0ZWN0aW9uX2NtZCh2LCAwKTsKKwkJfQorCX0KK30KKworaW50IHZvY19lbmFibGVfZHRtZl9yeF9kZXRlY3Rpb24odWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZW5hYmxlKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnYtPmxvY2spOworCXYtPmR0bWZfcnhfZGV0ZWN0X2VuID0gZW5hYmxlOworCisJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSkKKwkJcmV0ID0gdm9pY2Vfc2VuZF9kdG1mX3J4X2RldGVjdGlvbl9jbWQodiwKKwkJCQkJCSAgICAgICB2LT5kdG1mX3J4X2RldGVjdF9lbik7CisKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCB2b2Nfc2V0X2Rlc3Ryb3lfY3ZkX2ZsYWcoYm9vbCBpc19kZXN0cm95X2N2ZCkKK3sKKwlwcl9kZWJ1ZygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaXNfZGVzdHJveV9jdmQpOworCWNvbW1vbi5pc19kZXN0cm95X2N2ZCA9IGlzX2Rlc3Ryb3lfY3ZkOworfQorCitpbnQgdm9jX2FsbG9jX2NhbF9zaGFyZWRfbWVtb3J5KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJaWYgKGlzX2NhbF9tZW1vcnlfYWxsb2NhdGVkKCkpIHsKKwkJcHJfZGVidWcoIiVzOiBDYWxpYnJhdGlvbiBzaGFyZWQgYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkIiwKKwkJCSBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBjYWxpYnJhdGlvbiBtZW1vcnkgbWFwIHRhYmxlLiAqLworCQlyYyA9IHZvaWNlX2FsbG9jX2NhbF9tZW1fbWFwX3RhYmxlKCk7CisJCWlmICgocmMgPCAwKSAmJiAocmMgIT0gLUVQUk9CRV9ERUZFUikpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBjYWwgbWVtb3J5LCBlcnI9JWQiLAorCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitpbnQgdm9jX2FsbG9jX3ZvaXBfc2hhcmVkX21lbW9yeSh2b2lkKQoreworCWludCByYyA9IDA7CisKKwkvKiBBbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciBPT0IgVm9pcCAqLworCXJjID0gdm9pY2VfYWxsb2Nfb29iX3NoYXJlZF9tZW0oKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvYyBzaGFyZWQgbWVtb3J5IGZvciBPT0IgcmM6JWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmMpOworCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIG1lbSBtYXAgdGFibGUgZm9yIE9PQiAqLworCQlyYyA9IHZvaWNlX2FsbG9jX29vYl9tZW1fdGFibGUoKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jIG1lbSBtYXAgdGFsYmUgcmM6JWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJjKTsKKworCQkJdm9pY2VfZnJlZV9vb2Jfc2hhcmVkX21lbSgpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlzX2NhbF9tZW1vcnlfYWxsb2NhdGVkKHZvaWQpCit7CisJYm9vbCByZXQ7CisKKwlpZiAoY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmNsaWVudCAhPSBOVUxMICYmCisJICAgIGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5oYW5kbGUgIT0gTlVMTCkKKwkJcmV0ID0gdHJ1ZTsKKwllbHNlCisJCXJldCA9IGZhbHNlOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGZyZWVfY2FsX21hcF90YWJsZSh2b2lkKQoreworCWludCByZXQgPSAwOworCisJaWYgKChjb21tb24uY2FsX21lbV9tYXBfdGFibGUuY2xpZW50ID09IE5VTEwpIHx8CisJCShjb21tb24uY2FsX21lbV9tYXBfdGFibGUuaGFuZGxlID09IE5VTEwpKQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBtc21fYXVkaW9faW9uX2ZyZWUoY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmNsaWVudCwKKwkJY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmhhbmRsZSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiJXM6IG1zbV9hdWRpb19pb25fZnJlZSBmYWlsZWQ6XG4iLCBfX2Z1bmNfXyk7CisKK2RvbmU6CisJY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmNsaWVudCA9IE5VTEw7CisJY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmhhbmRsZSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc19ydGFjX21lbW9yeV9hbGxvY2F0ZWQodm9pZCkKK3sKKwlib29sIHJldDsKKworCWlmIChjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmNsaWVudCAhPSBOVUxMICYmCisJICAgIGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuaGFuZGxlICE9IE5VTEwpCisJCXJldCA9IHRydWU7CisJZWxzZQorCQlyZXQgPSBmYWxzZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnJlZV9ydGFjX21hcF90YWJsZSh2b2lkKQoreworCWludCByZXQgPSAwOworCisJaWYgKChjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmNsaWVudCA9PSBOVUxMKSB8fAorCQkoY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5oYW5kbGUgPT0gTlVMTCkpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG1zbV9hdWRpb19pb25fZnJlZShjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmNsaWVudCwKKwkJY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5oYW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBtc21fYXVkaW9faW9uX2ZyZWUgZmFpbGVkOlxuIiwgX19mdW5jX18pOworCitkb25lOgorCWNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuY2xpZW50ID0gTlVMTDsKKwljb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmhhbmRsZSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGlzX3ZvaXBfbWVtb3J5X2FsbG9jYXRlZCh2b2lkKQoreworCWJvb2wgcmV0OworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oCisJCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQpOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTEwsIHNlc3Npb25faWQ6JWRcbiIsIF9fZnVuY19fLAorCQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCk7CisKKwkJcmV0ID0gZmFsc2U7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCWlmICh2LT5zaG1lbV9pbmZvLnNoX2J1Zi5jbGllbnQgIT0gTlVMTCAmJgorCSAgICB2LT5zaG1lbV9pbmZvLnNoX2J1Zi5oYW5kbGUgIT0gTlVMTCkKKwkJcmV0ID0gdHJ1ZTsKKwllbHNlCisJCXJldCA9IGZhbHNlOworCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX2NvbmZpZ19jdnNfdm9jb2Rlcl9hbXJfcmF0ZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZzOworCXUxNiBjdnNfaGFuZGxlOworCXN0cnVjdCBjdnNfc2V0X2Ftcl9lbmNfcmF0ZV9jbWQgY3ZzX3NldF9hbXJfcmF0ZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwlpZiAoIWFwcl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwlwcl9kZWJ1ZygiJXM6IFNldHRpbmcgQU1SIHJhdGUuIE1lZGlhIFR5cGU6ICVkXG4iLCBfX2Z1bmNfXywKKwkJIGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlKTsKKworCWN2c19zZXRfYW1yX3JhdGUuaGRyLmhkcl9maWVsZCA9CisJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCUFQUl9QS1RfVkVSKTsKKwljdnNfc2V0X2Ftcl9yYXRlLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkgICAgICAgc2l6ZW9mKGN2c19zZXRfYW1yX3JhdGUpIC0gQVBSX0hEUl9TSVpFKTsKKwljdnNfc2V0X2Ftcl9yYXRlLmhkci5zcmNfcG9ydCA9CisJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2c19zZXRfYW1yX3JhdGUuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJY3ZzX3NldF9hbXJfcmF0ZS5oZHIudG9rZW4gPSAwOworCisJaWYgKGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlID09IFZTU19NRURJQV9JRF9BTVJfTkJfTU9ERU0pCisJCWN2c19zZXRfYW1yX3JhdGUuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lTVFJFQU1fQ01EX1ZPQ19BTVJfU0VUX0VOQ19SQVRFOworCWVsc2UgaWYgKGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlID09IFZTU19NRURJQV9JRF9BTVJfV0JfTU9ERU0pCisJCWN2c19zZXRfYW1yX3JhdGUuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lTVFJFQU1fQ01EX1ZPQ19BTVJXQl9TRVRfRU5DX1JBVEU7CisKKwljdnNfc2V0X2Ftcl9yYXRlLmFtcl9yYXRlLm1vZGUgPSBjb21tb24ubXZzX2luZm8ucmF0ZTsKKworCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3NldF9hbXJfcmF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTRVRfQU1SX1JBVEVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXR1cm4gMDsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9jb25maWdfY3ZzX3ZvY29kZXIoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKwkvKiBTZXQgbWVkaWEgdHlwZS4gKi8KKwlzdHJ1Y3QgY3ZzX3NldF9tZWRpYV90eXBlX2NtZCBjdnNfc2V0X21lZGlhX2NtZDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwlpZiAoIWFwcl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwljdnNfc2V0X21lZGlhX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQlBUFJfUEtUX1ZFUik7CisJY3ZzX3NldF9tZWRpYV9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJCXNpemVvZihjdnNfc2V0X21lZGlhX2NtZCkgLQorCQkJCQkJQVBSX0hEUl9TSVpFKTsKKwljdnNfc2V0X21lZGlhX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZzX3NldF9tZWRpYV9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJY3ZzX3NldF9tZWRpYV9jbWQuaGRyLnRva2VuID0gMDsKKwljdnNfc2V0X21lZGlhX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lTVFJFQU1fQ01EX1NFVF9NRURJQV9UWVBFOworCWN2c19zZXRfbWVkaWFfY21kLm1lZGlhX3R5cGUudHhfbWVkaWFfaWQgPSBjb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZTsKKwljdnNfc2V0X21lZGlhX2NtZC5tZWRpYV90eXBlLnJ4X21lZGlhX2lkID0gY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGU7CisKKwl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zZXRfbWVkaWFfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9NRURJQV9UWVBFXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCisJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCS8qIFNldCBlbmNvZGVyIHByb3BlcnRpZXMuICovCisJc3dpdGNoIChjb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZSkgeworCWNhc2UgVlNTX01FRElBX0lEX0VWUkNfTU9ERU06CisJY2FzZSBWU1NfTUVESUFfSURfNEdWX05CX01PREVNOgorCWNhc2UgVlNTX01FRElBX0lEXzRHVl9XQl9NT0RFTToKKwljYXNlIFZTU19NRURJQV9JRF80R1ZfTldfTU9ERU06IHsKKwkJc3RydWN0IGN2c19zZXRfY2RtYV9lbmNfbWlubWF4X3JhdGVfY21kIGN2c19zZXRfY2RtYV9yYXRlOworCisJCXByX2RlYnVnKCJTZXR0aW5nIEVWUkMgbWluLW1heCByYXRlXG4iKTsKKworCQljdnNfc2V0X2NkbWFfcmF0ZS5oZHIuaGRyX2ZpZWxkID0KKwkJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJQVBSX1BLVF9WRVIpOworCQljdnNfc2V0X2NkbWFfcmF0ZS5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCSAgICAgIHNpemVvZihjdnNfc2V0X2NkbWFfcmF0ZSkgLSBBUFJfSERSX1NJWkUpOworCQljdnNfc2V0X2NkbWFfcmF0ZS5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCWN2c19zZXRfY2RtYV9yYXRlLmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCQljdnNfc2V0X2NkbWFfcmF0ZS5oZHIudG9rZW4gPSAwOworCQljdnNfc2V0X2NkbWFfcmF0ZS5oZHIub3Bjb2RlID0KKwkJCQlWU1NfSVNUUkVBTV9DTURfQ0RNQV9TRVRfRU5DX01JTk1BWF9SQVRFOworCQljdnNfc2V0X2NkbWFfcmF0ZS5jZG1hX3JhdGUubWluX3JhdGUgPQorCQkJCWNvbW1vbi5tdnNfaW5mby5ldnJjX21pbl9yYXRlOworCQljdnNfc2V0X2NkbWFfcmF0ZS5jZG1hX3JhdGUubWF4X3JhdGUgPQorCQkJCWNvbW1vbi5tdnNfaW5mby5ldnJjX21heF9yYXRlOworCisJCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwkJdi0+YXN5bmNfZXJyID0gMDsKKworCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfc2V0X2NkbWFfcmF0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9FVlJDX01JTk1BWF9SQVRFXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlICE9IFZTU19NRURJQV9JRF9FVlJDX01PREVNKSB7CisJCQlyZXQgPSB2b2ljZV9zZXRfZHR4KHYpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBmYWlsOworCQl9CisKKwkJYnJlYWs7CisJfQorCWNhc2UgVlNTX01FRElBX0lEX0FNUl9OQl9NT0RFTToKKwljYXNlIFZTU19NRURJQV9JRF9BTVJfV0JfTU9ERU06IHsKKwkJcmV0ID0gdm9pY2VfY29uZmlnX2N2c192b2NvZGVyX2Ftcl9yYXRlKHYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIHZvY29kZXIgcmF0ZS4gJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IHZvaWNlX3NldF9kdHgodik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmYWlsOworCisJCWJyZWFrOworCX0KKwljYXNlIFZTU19NRURJQV9JRF9HNzI5OgorCWNhc2UgVlNTX01FRElBX0lEX0c3MTFfQUxBVzoKKwljYXNlIFZTU19NRURJQV9JRF9HNzExX01VTEFXOiB7CisJCXJldCA9IHZvaWNlX3NldF9kdHgodik7CisKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCS8qIERvIG5vdGhpbmcuICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3VwZGF0ZV9hbXJfdm9jb2Rlcl9yYXRlKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZvaWNlX2RhdGEgKnY7CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25faWQ6JWQiLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwl2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTCwgc2Vzc2lvbl9pZDolZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBzZXNzaW9uX2lkKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJcmV0ID0gdm9pY2VfY29uZmlnX2N2c192b2NvZGVyX2Ftcl9yYXRlKHYpOworCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlzdHJ1Y3QgYXByX2hkciBtdm1fc3RhcnRfdm9pY2VfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9tdm07CisJdTE2IG12bV9oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOworCisJaWYgKCFhcHJfbXZtKSB7CisJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKKworCW12bV9zdGFydF92b2ljZV9jbWQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQlBUFJfUEtUX1ZFUik7CisJbXZtX3N0YXJ0X3ZvaWNlX2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKG12bV9zdGFydF92b2ljZV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwlwcl9kZWJ1Zygic2VuZCBtdm1fc3RhcnRfdm9pY2VfY21kIHBrdCBzaXplID0gJWRcbiIsCisJCQkJbXZtX3N0YXJ0X3ZvaWNlX2NtZC5wa3Rfc2l6ZSk7CisJbXZtX3N0YXJ0X3ZvaWNlX2NtZC5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwltdm1fc3RhcnRfdm9pY2VfY21kLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7CisJbXZtX3N0YXJ0X3ZvaWNlX2NtZC50b2tlbiA9IDA7CisJbXZtX3N0YXJ0X3ZvaWNlX2NtZC5vcGNvZGUgPSBWU1NfSU1WTV9DTURfU1RBUlRfVk9JQ0U7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc3RhcnRfdm9pY2VfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSU1WTV9DTURfU1RBUlRfVk9JQ0VcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2b2NfZ2V0X3R4X3J4X3RvcG9sb2d5KHN0cnVjdCB2b2ljZV9kYXRhICp2LAorCQkJCSAgIHVpbnQzMl90ICp0eF90b3BvbG9neV9pZCwKKwkJCQkgICB1aW50MzJfdCAqcnhfdG9wb2xvZ3lfaWQpCit7CisJdWludDMyX3QgdHhfaWQgPSAwOworCXVpbnQzMl90IHJ4X2lkID0gMDsKKworCWlmICh2LT5sY2hfbW9kZSA9PSBWT0lDRV9MQ0hfU1RBUlQgfHwgdi0+ZGlzYWJsZV90b3BvbG9neSkgeworCQlwcl9kZWJ1ZygiJXM6IFNldHRpbmcgVFggYW5kIFJYIHRvcG9sb2d5IHRvIE5PTkUgZm9yIExDSFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisKKwkJdHhfaWQgPSBWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfTk9ORTsKKwkJcnhfaWQgPSBWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfTk9ORTsKKwl9IGVsc2UgeworCQl0eF9pZCA9IHZvaWNlX2dldF90b3BvbG9neShDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTCk7CisJCXJ4X2lkID0gdm9pY2VfZ2V0X3RvcG9sb2d5KENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMKTsKKwl9CisKKwkqdHhfdG9wb2xvZ3lfaWQgPSB0eF9pZDsKKwkqcnhfdG9wb2xvZ3lfaWQgPSByeF9pZDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX3NldF9kZXZpY2VfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCBjdnBfc2V0X2RldmljZV9jbWQgIGN2cF9zZXRkZXZfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnA7CisJdTE2IGN2cF9oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOworCisJaWYgKCFhcHJfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKworCS8qIHNldCBkZXZpY2UgYW5kIHdhaXQgZm9yIHJlc3BvbnNlICovCisJY3ZwX3NldGRldl9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCWN2cF9zZXRkZXZfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF9zZXRkZXZfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJcHJfZGVidWcoIiBzZW5kIGNyZWF0ZSBjdnAgc2V0ZGV2LCBwa3Qgc2l6ZSA9ICVkXG4iLAorCQkJY3ZwX3NldGRldl9jbWQuaGRyLnBrdF9zaXplKTsKKwljdnBfc2V0ZGV2X2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX3NldGRldl9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7CisJY3ZwX3NldGRldl9jbWQuaGRyLnRva2VuID0gMDsKKworCWlmICh2b2ljZV9nZXRfY3ZkX2ludF92ZXJzaW9uKGNvbW1vbi5jdmRfdmVyc2lvbikgPj0KKwkgICAgQ1ZEX0lOVF9WRVJTSU9OXzJfMikKKwkJY3ZwX3NldGRldl9jbWQuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lWT0NQUk9DX0NNRF9TRVRfREVWSUNFX1YzOworCWVsc2UKKwkJY3ZwX3NldGRldl9jbWQuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lWT0NQUk9DX0NNRF9TRVRfREVWSUNFX1YyOworCisJdm9jX2dldF90eF9yeF90b3BvbG9neSh2LAorCQkJJmN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnR4X3RvcG9sb2d5X2lkLAorCQkJJmN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnJ4X3RvcG9sb2d5X2lkKTsKKworCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnR4X3BvcnRfaWQgPSB2LT5kZXZfdHgucG9ydF9pZDsKKwljdnBfc2V0ZGV2X2NtZC5jdnBfc2V0X2RldmljZV92Mi5yeF9wb3J0X2lkID0gdi0+ZGV2X3J4LnBvcnRfaWQ7CisKKwlpZiAoY29tbW9uLmVjX3JlZl9leHQpIHsKKwkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIudm9jcHJvY19tb2RlID0KKwkJCQlWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkc7CisJCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLmVjX3JlZl9wb3J0X2lkID0KKwkJCQljb21tb24uZWNfcG9ydF9pZDsKKwl9IGVsc2UgeworCQljdnBfc2V0ZGV2X2NtZC5jdnBfc2V0X2RldmljZV92Mi52b2Nwcm9jX21vZGUgPQorCQkJCSAgICBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0lOVF9NSVhJTkc7CisJCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLmVjX3JlZl9wb3J0X2lkID0KKwkJCQkgICAgVlNTX0lWT0NQUk9DX1BPUlRfSURfTk9ORTsKKwl9CisJcHJfZGVidWcoInRvcG9sb2d5PSVkICwgdHhfcG9ydF9pZD0lZCwgcnhfcG9ydF9pZD0lZFxuIiwKKwkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIudHhfdG9wb2xvZ3lfaWQsCisJCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnR4X3BvcnRfaWQsCisJCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnJ4X3BvcnRfaWQpOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX3NldGRldl9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZTU19JVk9DUFJPQ19DTURfU0VUX0RFVklDRVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCisJCQkodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zdG9wX3ZvaWNlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlzdHJ1Y3QgYXByX2hkciBtdm1fc3RvcF92b2ljZV9jbWQ7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX212bTsKKwl1MTYgbXZtX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07CisKKwlpZiAoIWFwcl9tdm0pIHsKKwkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOworCisJbXZtX3N0b3Bfdm9pY2VfY21kLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCW12bV9zdG9wX3ZvaWNlX2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKG12bV9zdG9wX3ZvaWNlX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCXByX2RlYnVnKCJzZW5kIG12bV9zdG9wX3ZvaWNlX2NtZCBwa3Qgc2l6ZSA9ICVkXG4iLAorCQkJCW12bV9zdG9wX3ZvaWNlX2NtZC5wa3Rfc2l6ZSk7CisJbXZtX3N0b3Bfdm9pY2VfY21kLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCW12bV9zdG9wX3ZvaWNlX2NtZC5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOworCW12bV9zdG9wX3ZvaWNlX2NtZC50b2tlbiA9IDA7CisJbXZtX3N0b3Bfdm9pY2VfY21kLm9wY29kZSA9IFZTU19JTVZNX0NNRF9TVE9QX1ZPSUNFOworCisJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3N0b3Bfdm9pY2VfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSU1WTV9DTURfU1RPUF9WT0lDRVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgdm9pY2VfZ2V0X2NhbChzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKipjYWxfYmxvY2ssCisJCQkgaW50IGNhbF9ibG9ja19pZHgsCisJCQkgc3RydWN0IGNhbF9ibG9ja19kYXRhICoqY29sX2RhdGEsCisJCQkgaW50IGNvbF9kYXRhX2lkeCwgaW50IHNlc3Npb25faWQpCit7CisJaW50IHJldCA9IDA7CisKKwkqY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJY29tbW9uLmNhbF9kYXRhW2NhbF9ibG9ja19pZHhdKTsKKwlpZiAoKmNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IE5vIGNhbCBkYXRhIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9ibG9ja19pZHgpOworCisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gcmVtYXBfY2FsX2RhdGEoKmNhbF9ibG9jaywgc2Vzc2lvbl9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIGNhbF9ibG9ja19pZHgpOworCisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29sX2RhdGEgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJKmNvbF9kYXRhID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJY29tbW9uLmNhbF9kYXRhW2NvbF9kYXRhX2lkeF0pOworCWlmICgqY29sX2RhdGEgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBObyBjYWwgZGF0YSBmb3IgY2FsICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjb2xfZGF0YV9pZHgpOworCisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlzdHJ1Y3QgY3ZzX3JlZ2lzdGVyX2NhbF9kYXRhX2NtZCBjdnNfcmVnX2NhbF9jbWQ7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY29sX2RhdGEgPSBOVUxMOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZjdnNfcmVnX2NhbF9jbWQsIDAsIHNpemVvZihjdnNfcmVnX2NhbF9jbWQpKTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY29tbW9uLmFwcl9xNl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlNfVk9DU1RSTV9DQUxdLT5sb2NrKTsKKwltdXRleF9sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZTX1ZPQ1NUUk1fQ09MX0NBTF0tPmxvY2spOworCisJcmV0ID0gdm9pY2VfZ2V0X2NhbCgmY2FsX2Jsb2NrLCBDVlNfVk9DU1RSTV9DQUwsICZjb2xfZGF0YSwKKwkJQ1ZTX1ZPQ1NUUk1fQ09MX0NBTCwgdi0+c2Vzc2lvbl9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogVm9pY2VfZ2V0X2NhbCBmYWlsZWQgZm9yIGNhbCAlZCFcbiIsCisJCQlfX2Z1bmNfXywgQ1ZTX1ZPQ1NUUk1fQ0FMKTsKKworCQlnb3RvIHVubG9jazsKKwl9CisKKwltZW1jcHkoJmN2c19yZWdfY2FsX2NtZC5jdnNfY2FsX2RhdGEuY29sdW1uX2luZm9bMF0sCisJICAgICAgICh2b2lkICopICYoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sICopCisJICAgICAgIGNvbF9kYXRhLT5jYWxfaW5mbyktPmRhdGEsCisJICAgICAgIGNvbF9kYXRhLT5jYWxfZGF0YS5zaXplKTsKKworCWN2c19yZWdfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZzX3JlZ19jYWxfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2c19yZWdfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCWN2c19yZWdfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZzX3JlZ19jYWxfY21kLmhkci5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKwljdnNfcmVnX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKKwlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQorCQljdnNfcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE7CisJZWxzZQorCQljdnNfcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQV9WMjsKKworCWN2c19yZWdfY2FsX2NtZC5jdnNfY2FsX2RhdGEuY2FsX21lbV9oYW5kbGUgPQorCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKKwljdnNfcmVnX2NhbF9jbWQuY3ZzX2NhbF9kYXRhLmNhbF9tZW1fYWRkcmVzc19sc3cgPQorCQlsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWN2c19yZWdfY2FsX2NtZC5jdnNfY2FsX2RhdGEuY2FsX21lbV9hZGRyZXNzX21zdyA9CisJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWN2c19yZWdfY2FsX2NtZC5jdnNfY2FsX2RhdGEuY2FsX21lbV9zaXplID0KKwkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOworCisJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZzLCAodWludDMyX3QgKikgJmN2c19yZWdfY2FsX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgcmVnaXN0ZXJpbmcgQ1ZTIGNhbFxuIiwgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byB1bmxvY2s7CisJfQordW5sb2NrOgorCW11dGV4X3VubG9jaygmY29tbW9uLmNhbF9kYXRhW0NWU19WT0NTVFJNX0NPTF9DQUxdLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlNfVk9DU1RSTV9DQUxdLT5sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2c19kZXJlZ2lzdGVyX2NhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IGN2c19kZXJlZ2lzdGVyX2NhbF9kYXRhX2NtZCBjdnNfZGVyZWdfY2FsX2NtZDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmY3ZzX2RlcmVnX2NhbF9jbWQsIDAsIHNpemVvZihjdnNfZGVyZWdfY2FsX2NtZCkpOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFjb21tb24uYXByX3E2X2N2cykgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwljdnNfZGVyZWdfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZzX2RlcmVnX2NhbF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZzX2RlcmVnX2NhbF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwljdnNfZGVyZWdfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZzX2RlcmVnX2NhbF9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCWN2c19kZXJlZ19jYWxfY21kLmhkci50b2tlbiA9IDA7CisJaWYgKGNvbW1vbi5pc19wZXJfdm9jb2Rlcl9jYWxfZW5hYmxlZCkKKwkJY3ZzX2RlcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVNUUkVBTV9DTURfREVSRUdJU1RFUl9TVEFUSUNfQ0FMSUJSQVRJT05fREFUQTsKKwllbHNlCisJCWN2c19kZXJlZ19jYWxfY21kLmhkci5vcGNvZGUgPQorCQkJVlNTX0lTVFJFQU1fQ01EX0RFUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQTsKKworCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cywgKHVpbnQzMl90ICopICZjdnNfZGVyZWdfY2FsX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgZGUtcmVnaXN0ZXJpbmcgQ1ZTIGNhbFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAorCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9jcmVhdGVfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCBjdnBfY3JlYXRlX2Z1bGxfY3RsX3Nlc3Npb25fY21kIGN2cF9zZXNzaW9uX2NtZDsKKwl2b2lkICphcHJfY3ZwOworCWludCByZXQgPSAwOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKwlpZiAoIWFwcl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBjcmVhdGUgY3ZwIHNlc3Npb24gYW5kIHdhaXQgZm9yIHJlc3BvbnNlICovCisJY3ZwX3Nlc3Npb25fY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwljdnBfc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZwX3Nlc3Npb25fY21kKSAtIEFQUl9IRFJfU0laRSk7CisJcHJfZGVidWcoIiVzOiBzZW5kIGNyZWF0ZSBjdnAgc2Vzc2lvbiwgcGt0IHNpemUgPSAlZFxuIiwKKwkJIF9fZnVuY19fLCBjdnBfc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplKTsKKwljdnBfc2Vzc2lvbl9jbWQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2cF9zZXNzaW9uX2NtZC5oZHIuZGVzdF9wb3J0ID0gMDsKKwljdnBfc2Vzc2lvbl9jbWQuaGRyLnRva2VuID0gMDsKKworCWlmICh2b2ljZV9nZXRfY3ZkX2ludF92ZXJzaW9uKGNvbW1vbi5jdmRfdmVyc2lvbikgPj0KKwkgICAgQ1ZEX0lOVF9WRVJTSU9OXzJfMikKKwkJY3ZwX3Nlc3Npb25fY21kLmhkci5vcGNvZGUgPQorCQkJCVZTU19JVk9DUFJPQ19DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OX1YzOworCWVsc2UKKwkJY3ZwX3Nlc3Npb25fY21kLmhkci5vcGNvZGUgPQorCQkJCVZTU19JVk9DUFJPQ19DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OX1YyOworCisJdm9jX2dldF90eF9yeF90b3BvbG9neSh2LAorCQkJJmN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi50eF90b3BvbG9neV9pZCwKKwkJCSZjdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24ucnhfdG9wb2xvZ3lfaWQpOworCisJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLmRpcmVjdGlvbiA9IDI7IC8qdHggYW5kIHJ4Ki8KKwljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24udHhfcG9ydF9pZCA9IHYtPmRldl90eC5wb3J0X2lkOworCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi5yeF9wb3J0X2lkID0gdi0+ZGV2X3J4LnBvcnRfaWQ7CisJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnByb2ZpbGVfaWQgPQorCQkJCQkgVlNTX0lDT01NT05fQ0FMX05FVFdPUktfSURfTk9ORTsKKwlpZiAoY29tbW9uLmVjX3JlZl9leHQpIHsKKwkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnZvY3Byb2NfbW9kZSA9CisJCQkJVlNTX0lWT0NQUk9DX1ZPQ1BST0NfTU9ERV9FQ19FWFRfTUlYSU5HOworCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24uZWNfcmVmX3BvcnRfaWQgPQorCQkJCQljb21tb24uZWNfcG9ydF9pZDsKKwl9IGVsc2UgeworCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24udm9jcHJvY19tb2RlID0KKwkJCQkgVlNTX0lWT0NQUk9DX1ZPQ1BST0NfTU9ERV9FQ19JTlRfTUlYSU5HOworCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24uZWNfcmVmX3BvcnRfaWQgPQorCQkJCQkJIFZTU19JVk9DUFJPQ19QT1JUX0lEX05PTkU7CisJfQorCisJcHJfZGVidWcoInR4X3RvcG9sb2d5OiAlZCB0eF9wb3J0X2lkPSVkLCByeF9wb3J0X2lkPSVkLCBtb2RlOiAweCV4XG4iLAorCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24udHhfdG9wb2xvZ3lfaWQsCisJCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi50eF9wb3J0X2lkLAorCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24ucnhfcG9ydF9pZCwKKwkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnZvY3Byb2NfbW9kZSk7CisJcHJfZGVidWcoInJ4X3RvcG9sb2d5OiAlZCwgcHJvZmlsZV9pZDogMHgleCwgcGt0X3NpemU6ICVkXG4iLAorCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24ucnhfdG9wb2xvZ3lfaWQsCisJCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi5wcm9maWxlX2lkLAorCQljdnBfc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplKTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF9zZXNzaW9uX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVk9DUFJPQ19GVUxMX0NPTlRST0xfU0VTU0lPTlxuIik7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfZGV2X2NmZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IGN2cF9yZWdpc3Rlcl9kZXZfY2ZnX2NtZCBjdnBfcmVnX2Rldl9jZmdfY21kOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmY3ZwX3JlZ19kZXZfY2ZnX2NtZCwgMCwgc2l6ZW9mKGN2cF9yZWdfZGV2X2NmZ19jbWQpKTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY29tbW9uLmFwcl9xNl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NERVZfQ0ZHX0NBTF0tPmxvY2spOworCisJcmV0ID0gdm9pY2VfZ2V0X2NhbCgmY2FsX2Jsb2NrLCBDVlBfVk9DREVWX0NGR19DQUwsIE5VTEwsCisJCTAsIHYtPnNlc3Npb25faWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IFZvaWNlX2dldF9jYWwgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIENWUF9WT0NERVZfQ0ZHX0NBTCk7CisKKwkJZ290byB1bmxvY2s7CisJfQorCisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCXNpemVvZihjdnBfcmVnX2Rldl9jZmdfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5oZHIudG9rZW4gPSAwOworCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLm9wY29kZSA9CisJCQkJCVZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfREVWSUNFX0NPTkZJRzsKKworCWN2cF9yZWdfZGV2X2NmZ19jbWQuY3ZwX2Rldl9jZmdfZGF0YS5tZW1faGFuZGxlID0KKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5jdnBfZGV2X2NmZ19kYXRhLm1lbV9hZGRyZXNzX2xzdyA9CisJCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJY3ZwX3JlZ19kZXZfY2ZnX2NtZC5jdnBfZGV2X2NmZ19kYXRhLm1lbV9hZGRyZXNzX21zdyA9CisJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWN2cF9yZWdfZGV2X2NmZ19jbWQuY3ZwX2Rldl9jZmdfZGF0YS5tZW1fc2l6ZSA9CisJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cCwKKwkJCSAgICh1aW50MzJfdCAqKSAmY3ZwX3JlZ19kZXZfY2ZnX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgcmVnaXN0ZXJpbmcgQ1ZQIGRldiBjZmcgY2FsXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byB1bmxvY2s7CisJfQordW5sb2NrOgorCW11dGV4X3VubG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NERVZfQ0ZHX0NBTF0tPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IGN2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kIGN2cF9kZXJlZ19kZXZfY2ZnX2NtZDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmY3ZwX2RlcmVnX2Rldl9jZmdfY21kLCAwLCBzaXplb2YoY3ZwX2RlcmVnX2Rldl9jZmdfY21kKSk7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBkb25lOworCX0KKworCWN2cF9kZXJlZ19kZXZfY2ZnX2NtZC5oZHIuaGRyX2ZpZWxkID0KKwkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZwX2RlcmVnX2Rldl9jZmdfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF9kZXJlZ19kZXZfY2ZnX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCWN2cF9kZXJlZ19kZXZfY2ZnX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX2RlcmVnX2Rldl9jZmdfY21kLmhkci5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKwljdnBfZGVyZWdfZGV2X2NmZ19jbWQuaGRyLnRva2VuID0gMDsKKwljdnBfZGVyZWdfZGV2X2NmZ19jbWQuaGRyLm9wY29kZSA9CisJCQkJVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0RFVklDRV9DT05GSUc7CisKKwl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnAsCisJCQkgICAodWludDMyX3QgKikgJmN2cF9kZXJlZ19kZXZfY2ZnX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgZGUtcmVnaXN0ZXJpbmcgQ1ZQIGRldiBjZmcgY2FsXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCBjdnBfcmVnaXN0ZXJfY2FsX2RhdGFfY21kIGN2cF9yZWdfY2FsX2NtZDsKKwlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjb2xfZGF0YSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJmN2cF9yZWdfY2FsX2NtZCwgMCwgc2l6ZW9mKGN2cF9yZWdfY2FsX2NtZCkpOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFjb21tb24uYXByX3E2X2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NQUk9DX0NBTF0tPmxvY2spOworCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DUFJPQ19DT0xfQ0FMXS0+bG9jayk7CisKKwlyZXQgPSB2b2ljZV9nZXRfY2FsKCZjYWxfYmxvY2ssIENWUF9WT0NQUk9DX0NBTCwgJmNvbF9kYXRhLAorCQlDVlBfVk9DUFJPQ19DT0xfQ0FMLCB2LT5zZXNzaW9uX2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBWb2ljZV9nZXRfY2FsIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKKwkJCV9fZnVuY19fLCBDVlBfVk9DUFJPQ19DQUwpOworCisJCWdvdG8gdW5sb2NrOworCX0KKworCXYtPmRldl90eC5kZXZfaWQgPSAoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2Nwcm9jICopCisJCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbyktPnR4X2FjZGJfaWQ7CisJdi0+ZGV2X3J4LmRldl9pZCA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3Byb2MgKikKKwkJCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+cnhfYWNkYl9pZDsKKwlwcl9kZWJ1ZygiJXM6ICVzOiBUeCBhY2RiIGlkID0gJWQgYW5kIFJ4IGFjZGIgaWQgPSAlZCIsIF9fZnVuY19fLAorCQkgdm9jX2dldF9zZXNzaW9uX25hbWUodi0+c2Vzc2lvbl9pZCksIHYtPmRldl90eC5kZXZfaWQsCisJCSB2LT5kZXZfcnguZGV2X2lkKTsKKworCW1lbWNweSgmY3ZwX3JlZ19jYWxfY21kLmN2cF9jYWxfZGF0YS5jb2x1bW5faW5mb1swXSwKKwkgICAgICAgKHZvaWQgKikgJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wgKikKKwkgICAgICAgY29sX2RhdGEtPmNhbF9pbmZvKS0+ZGF0YSwKKwkgICAgICAgY29sX2RhdGEtPmNhbF9kYXRhLnNpemUpOworCisJY3ZwX3JlZ19jYWxfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljdnBfcmVnX2NhbF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZwX3JlZ19jYWxfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3JlZ19jYWxfY21kLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnBfcmVnX2NhbF9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOworCWN2cF9yZWdfY2FsX2NtZC5oZHIudG9rZW4gPSAwOworCWlmIChjb21tb24uaXNfcGVyX3ZvY29kZXJfY2FsX2VuYWJsZWQpCisJCWN2cF9yZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KKwkJCVZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE7CisJZWxzZQorCQljdnBfcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEFfVjI7CisKKwljdnBfcmVnX2NhbF9jbWQuY3ZwX2NhbF9kYXRhLmNhbF9tZW1faGFuZGxlID0KKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7CisJY3ZwX3JlZ19jYWxfY21kLmN2cF9jYWxfZGF0YS5jYWxfbWVtX2FkZHJlc3NfbHN3ID0KKwkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwljdnBfcmVnX2NhbF9jbWQuY3ZwX2NhbF9kYXRhLmNhbF9tZW1fYWRkcmVzc19tc3cgPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKKwljdnBfcmVnX2NhbF9jbWQuY3ZwX2NhbF9kYXRhLmNhbF9tZW1fc2l6ZSA9CisJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cCwgKHVpbnQzMl90ICopICZjdnBfcmVnX2NhbF9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHJlZ2lzdGVyaW5nIENWUCBjYWxcbiIsIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCisJCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gdW5sb2NrOworCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DUFJPQ19DT0xfQ0FMXS0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZQX1ZPQ1BST0NfQ0FMXS0+bG9jayk7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCBjdnBfZGVyZWdpc3Rlcl9jYWxfZGF0YV9jbWQgY3ZwX2RlcmVnX2NhbF9jbWQ7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJmN2cF9kZXJlZ19jYWxfY21kLCAwLCBzaXplb2YoY3ZwX2RlcmVnX2NhbF9jbWQpKTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY29tbW9uLmFwcl9xNl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBkb25lOworCX0KKworCWN2cF9kZXJlZ19jYWxfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwljdnBfZGVyZWdfY2FsX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCXNpemVvZihjdnBfZGVyZWdfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCWN2cF9kZXJlZ19jYWxfY21kLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnBfZGVyZWdfY2FsX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisJY3ZwX2RlcmVnX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKKwlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQorCQljdnBfZGVyZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KKwkJCVZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9TVEFUSUNfQ0FMSUJSQVRJT05fREFUQTsKKwllbHNlCisJCWN2cF9kZXJlZ19jYWxfY21kLmhkci5vcGNvZGUgPQorCQkJVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEE7CisKKwl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX2RlcmVnX2NhbF9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIGRlLXJlZ2lzdGVyaW5nIENWUCBjYWxcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfdm9sX2NhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IGN2cF9yZWdpc3Rlcl92b2xfY2FsX2RhdGFfY21kIGN2cF9yZWdfdm9sX2NhbF9jbWQ7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY29sX2RhdGEgPSBOVUxMOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZjdnBfcmVnX3ZvbF9jYWxfY21kLCAwLCBzaXplb2YoY3ZwX3JlZ192b2xfY2FsX2NtZCkpOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFjb21tb24uYXByX3E2X2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NWT0xfQ0FMXS0+bG9jayk7CisJbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NWT0xfQ09MX0NBTF0tPmxvY2spOworCisJcmV0ID0gdm9pY2VfZ2V0X2NhbCgmY2FsX2Jsb2NrLCBDVlBfVk9DVk9MX0NBTCwgJmNvbF9kYXRhLAorCQlDVlBfVk9DVk9MX0NPTF9DQUwsIHYtPnNlc3Npb25faWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IFZvaWNlX2dldF9jYWwgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAorCQkJX19mdW5jX18sIENWUF9WT0NWT0xfQ0FMKTsKKworCQlnb3RvIHVubG9jazsKKwl9CisKKwltZW1jcHkoJmN2cF9yZWdfdm9sX2NhbF9jbWQuY3ZwX3ZvbF9jYWxfZGF0YS5jb2x1bW5faW5mb1swXSwKKwkgICAgICAgKHZvaWQgKikgJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wgKikKKwkgICAgICAgY29sX2RhdGEtPmNhbF9pbmZvKS0+ZGF0YSwKKwkgICAgICAgY29sX2RhdGEtPmNhbF9kYXRhLnNpemUpOworCisJY3ZwX3JlZ192b2xfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCXNpemVvZihjdnBfcmVnX3ZvbF9jYWxfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5oZHIudG9rZW4gPSAwOworCWlmIChjb21tb24uaXNfcGVyX3ZvY29kZXJfY2FsX2VuYWJsZWQpCisJCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQTsKKwllbHNlCisJCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX1ZPTF9DQUxJQlJBVElPTl9EQVRBOworCisJY3ZwX3JlZ192b2xfY2FsX2NtZC5jdnBfdm9sX2NhbF9kYXRhLmNhbF9tZW1faGFuZGxlID0KKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5jdnBfdm9sX2NhbF9kYXRhLmNhbF9tZW1fYWRkcmVzc19sc3cgPQorCQlsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOworCWN2cF9yZWdfdm9sX2NhbF9jbWQuY3ZwX3ZvbF9jYWxfZGF0YS5jYWxfbWVtX2FkZHJlc3NfbXN3ID0KKwkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7CisJY3ZwX3JlZ192b2xfY2FsX2NtZC5jdnBfdm9sX2NhbF9kYXRhLmNhbF9tZW1fc2l6ZSA9CisJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cCwKKwkJCSAgICh1aW50MzJfdCAqKSAmY3ZwX3JlZ192b2xfY2FsX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgcmVnaXN0ZXJpbmcgQ1ZQIHZvbCBjYWxcbiIsIF9fZnVuY19fLCByZXQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCisJCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gdW5sb2NrOworCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DVk9MX0NPTF9DQUxdLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DVk9MX0NBTF0tPmxvY2spOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfdm9sX2NhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJc3RydWN0IGN2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfZGF0YV9jbWQgY3ZwX2RlcmVnX3ZvbF9jYWxfY21kOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZjdnBfZGVyZWdfdm9sX2NhbF9jbWQsIDAsIHNpemVvZihjdnBfZGVyZWdfdm9sX2NhbF9jbWQpKTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghY29tbW9uLmFwcl9xNl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIGRvbmU7CisJfQorCisJY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci5oZHJfZmllbGQgPQorCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF9kZXJlZ192b2xfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCWN2cF9kZXJlZ192b2xfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKwljdnBfZGVyZWdfdm9sX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKKwlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQorCQljdnBfZGVyZWdfdm9sX2NhbF9jbWQuaGRyLm9wY29kZSA9CisJCQlWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfRFlOQU1JQ19DQUxJQlJBVElPTl9EQVRBOworCWVsc2UKKwkJY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci5vcGNvZGUgPQorCQkJVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX1ZPTF9DQUxJQlJBVElPTl9EQVRBOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZwLAorCQkJICAgKHVpbnQzMl90ICopICZjdnBfZGVyZWdfdm9sX2NhbF9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIGRlLXJlZ2lzdGVyaW5nIENWUCB2b2wgY2FsXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKKwkJCQkJIHN0cnVjdCBtZW1fbWFwX3RhYmxlICp0YWJsZV9pbmZvLAorCQkJCQkgZG1hX2FkZHJfdCBwaHlzLAorCQkJCQkgdWludDMyX3Qgc2l6ZSwKKwkJCQkJIHVpbnQzMl90IHRva2VuKQoreworCXN0cnVjdCB2c3NfaW1lbW9yeV9jbWRfbWFwX3BoeXNpY2FsX3QgbXZtX21hcF9waHlzX2NtZDsKKwl1aW50MzJfdCAqbWVtdGFibGU7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFjb21tb24uYXByX3E2X212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIXRhYmxlX2luZm8tPmRhdGEpIHsKKwkJcHJfZXJyKCIlczogbWVtb3J5IHRhYmxlIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZW10YWJsZSA9ICh1aW50MzJfdCAqKSB0YWJsZV9pbmZvLT5kYXRhOworCisJLyoKKwkgKiBTdG9yZSBuZXh0IHRhYmxlIGRlc2NyaXB0b3IncyBhZGRyZXNzKDY0IGJpdCkgYXMgTlVMTCBhcyB0aGVyZQorCSAqIGlzIG9ubHkgb25lIG1lbW9yeSBibG9jaworCSAqLworCW1lbXRhYmxlWzBdID0gMDsKKwltZW10YWJsZVsxXSA9IDA7CisKKwkvKiBTdG9yZSBuZXh0IHRhYmxlIGRlc2NyaXB0b3IncyBzaXplICovCisJbWVtdGFibGVbMl0gPSAwOworCisJLyogU3RvcmUgc2hhcmVkIG1lbSBhZGRkcmVzcyAoNjQgYml0KSAqLworCW1lbXRhYmxlWzNdID0gbG93ZXJfMzJfYml0cyhwaHlzKTsKKwltZW10YWJsZVs0XSA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKHBoeXMpOworCisJLyogU3RvcmUgc2hhcmVkIG1lbW9yeSBzaXplICovCisJbWVtdGFibGVbNV0gPSBzaXplOworCisJbXZtX21hcF9waHlzX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJbXZtX21hcF9waHlzX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCXNpemVvZihtdm1fbWFwX3BoeXNfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJbXZtX21hcF9waHlzX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJbXZtX21hcF9waHlzX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisJbXZtX21hcF9waHlzX2NtZC5oZHIudG9rZW4gPSB0b2tlbjsKKwltdm1fbWFwX3BoeXNfY21kLmhkci5vcGNvZGUgPSBWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMOworCisJbXZtX21hcF9waHlzX2NtZC50YWJsZV9kZXNjcmlwdG9yLm1lbV9hZGRyZXNzX2xzdyA9CisJCQlsb3dlcl8zMl9iaXRzKHRhYmxlX2luZm8tPnBoeXMpOworCW12bV9tYXBfcGh5c19jbWQudGFibGVfZGVzY3JpcHRvci5tZW1fYWRkcmVzc19tc3cgPQorCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHModGFibGVfaW5mby0+cGh5cyk7CisJbXZtX21hcF9waHlzX2NtZC50YWJsZV9kZXNjcmlwdG9yLm1lbV9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfYmxvY2tfdCkgKworCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV9kZXNjcmlwdG9yX3QpOworCW12bV9tYXBfcGh5c19jbWQuaXNfY2FjaGVkID0gdHJ1ZTsKKwltdm1fbWFwX3BoeXNfY21kLmNhY2hlX2xpbmVfc2l6ZSA9IDEyODsKKwltdm1fbWFwX3BoeXNfY21kLmFjY2Vzc19tYXNrID0gMzsKKwltdm1fbWFwX3BoeXNfY21kLnBhZ2VfYWxpZ24gPSA0MDk2OworCW12bV9tYXBfcGh5c19jbWQubWluX2RhdGFfd2lkdGggPSA4OworCW12bV9tYXBfcGh5c19jbWQubWF4X2RhdGFfd2lkdGggPSA2NDsKKworCXByX2RlYnVnKCIlczogbmV4dCB0YWJsZSBkZXNjOiBhZGQ6ICVsbGQsIHNpemU6ICVkXG4iLAorCQkgX19mdW5jX18sICooKHVpbnQ2NF90ICopIG1lbXRhYmxlKSwKKwkJICooKCh1aW50MzJfdCAqKSBtZW10YWJsZSkgKyAyKSk7CisJcHJfZGVidWcoIiVzOiBwaHkgYWRkIG9mIG9mIG1lbSBiZWluZyBtYXBwZWQgTFNXOjB4JXgsIE1TVzoweCV4IHNpemU6ICVkXG4iLAorCQkgX19mdW5jX18sICooKCh1aW50MzJfdCAqKSBtZW10YWJsZSkgKyAzKSwKKwkJKigoKHVpbnQzMl90ICopIG1lbXRhYmxlKSArIDQpLCAqKCgodWludDMyX3QgKikgbWVtdGFibGUpICsgNSkpOworCisJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfbXZtLCAodWludDMyX3QgKikgJm12bV9tYXBfcGh5c19jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgbXZtIG1hcCBwaHkgY21kXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfcGF1c2Vfdm9pY2VfY2FsbChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlzdHJ1Y3QgYXByX2hkcgltdm1fcGF1c2Vfdm9pY2VfY21kOworCXZvaWQJCSphcHJfbXZtOworCWludAkJcmV0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBWb2ljZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOworCWlmICghYXByX212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW12bV9wYXVzZV92b2ljZV9jbWQuaGRyX2ZpZWxkID0KKwkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCW12bV9wYXVzZV92b2ljZV9jbWQucGt0X3NpemUgPQorCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQlzaXplb2YobXZtX3BhdXNlX3ZvaWNlX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCW12bV9wYXVzZV92b2ljZV9jbWQuc3JjX3BvcnQgPQorCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwltdm1fcGF1c2Vfdm9pY2VfY21kLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOworCW12bV9wYXVzZV92b2ljZV9jbWQudG9rZW4gPSAwOworCW12bV9wYXVzZV92b2ljZV9jbWQub3Bjb2RlID0gVlNTX0lNVk1fQ01EX1BBVVNFX1ZPSUNFOworCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCisJcHJfZGVidWcoIiVzOiBzZW5kIG12bV9wYXVzZV92b2ljZV9jbWQgcGt0IHNpemUgPSAlZFxuIiwKKwkJX19mdW5jX18sIG12bV9wYXVzZV92b2ljZV9jbWQucGt0X3NpemUpOworCisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sCisJCSh1aW50MzJfdCAqKSZtdm1fcGF1c2Vfdm9pY2VfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSU1WTV9DTURfUEFVU0VfVk9JQ0VcbiIpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCSh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfbWFwX2NhbF9tZW1vcnkoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssCisJCQkJdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgdm9jX2luZGV4OworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENhbCBibG9jayBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogTm8gYWRkcmVzcyB0byBtYXAhXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBNYXAgc2l6ZSBpcyAwIVxuIiwgX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl2b2NfaW5kZXggPSB2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHNlc3Npb25faWQpOworCWlmICh2b2NfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6ICBJbnZhbGlkIHNlc3Npb24gSUQgJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwl2ID0gJmNvbW1vbi52b2ljZVt2b2NfaW5kZXhdOworCisJcmVzdWx0ID0gdm9pY2VfbWFwX21lbW9yeV9waHlzaWNhbF9jbWQodiwKKwkJJmNvbW1vbi5jYWxfbWVtX21hcF90YWJsZSwKKwkJKGRtYV9hZGRyX3QpY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwKKwkJVk9DX0NBTF9NRU1fTUFQX1RPS0VOKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBNbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJXpkXG4iLAorCQkJX19mdW5jX18sCisJCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOworCisJCWdvdG8gZG9uZV91bmxvY2s7CisJfQorCisJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSBjb21tb24uY2FsX21lbV9oYW5kbGU7Citkb25lX3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcmVtYXBfY2FsX2RhdGEoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssCisJCQkgICB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogTm8gSU9OIGFsbG9jYXRpb24gZm9yIHNlc3Npb25faWQgJWQhXG4iLAorCQkJX19mdW5jX18sIHNlc3Npb25faWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKKwkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7CisKKwkJLyogY2FsIHR5cGUgbm90IHVzZWQgKi8KKwkJcmV0ID0gdm9pY2VfbWFwX2NhbF9tZW1vcnkoY2FsX2Jsb2NrLCBzZXNzaW9uX2lkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IE1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkXG4iLAorCQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKKworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiAgQ2FsIGJsb2NrIDB4JXBLLCBzaXplICV6ZCBhbHJlYWR5IG1hcHBlZC4gUTYgbWFwIGhhbmRsZSA9ICVkXG4iLAorCQkJX19mdW5jX18sICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwKKwkJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfdW5tYXBfY2FsX21lbW9yeShpbnQzMl90IGNhbF90eXBlLAorCQkJCSAgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDIgPSAwOworCWludCBpOworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENhbCBibG9jayBpcyBOVUxMIVxuIiwgX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IFE2IGhhbmRsZSBpcyBub3Qgc2V0IVxuIiwgX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykgeworCQl2ID0gJmNvbW1vbi52b2ljZVtpXTsKKworCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKwkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSkgeworCQkJcmVzdWx0MiA9IHZvaWNlX3BhdXNlX3ZvaWNlX2NhbGwodik7CisJCQlpZiAocmVzdWx0MiA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBWb2ljZV9wYXVzZV92b2ljZV9jYWxsIGZhaWxlZCBmb3Igc2Vzc2lvbiAweCV4LCBlcnIgJWQhXG4iLAorCQkJCQlfX2Z1bmNfXywgdi0+c2Vzc2lvbl9pZCwgcmVzdWx0Mik7CisKKwkJCQlyZXN1bHQgPSByZXN1bHQyOworCQkJfQorCisJCQlpZiAoY2FsX3R5cGUgPT0gQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DQUxfVFlQRSkKKwkJCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHYpOworCQkJZWxzZSBpZiAoY2FsX3R5cGUgPT0gQ1ZQX1ZPQ1BST0NfU1RBVElDX0NBTF9UWVBFKQorCQkJCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfY2FsX2NtZCh2KTsKKwkJCWVsc2UgaWYgKGNhbF90eXBlID09IENWUF9WT0NERVZfQ0ZHX0NBTF9UWVBFKQorCQkJCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQodik7CisJCQllbHNlIGlmIChjYWxfdHlwZSA9PSBDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEUpCisJCQkJdm9pY2Vfc2VuZF9jdnNfZGVyZWdpc3Rlcl9jYWxfY21kKHYpOworCQkJZWxzZQorCQkJCXByX2VycigiJXM6IEludmFsaWQgY2FsIHR5cGUgJWQhXG4iLAorCQkJCQlfX2Z1bmNfXywgY2FsX3R5cGUpOworCisJCQlyZXN1bHQyID0gdm9pY2Vfc2VuZF9zdGFydF92b2ljZV9jbWQodik7CisJCQlpZiAocmVzdWx0MikgeworCQkJCXByX2VycigiJXM6IFZvaWNlX3NlbmRfc3RhcnRfdm9pY2VfY21kIGZhaWxlZCBmb3Igc2Vzc2lvbiAweCV4LCBlcnIgJWQhXG4iLAorCQkJCQlfX2Z1bmNfXywgdi0+c2Vzc2lvbl9pZCwgcmVzdWx0Mik7CisKKwkJCQlyZXN1bHQgPSByZXN1bHQyOworCQkJfQorCQl9CisKKwkJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSAhPSAwKSAmJgorCQkJKCFpc19vdGhlcl9zZXNzaW9uX2FjdGl2ZSh2LT5zZXNzaW9uX2lkKSkpIHsKKworCQkJcmVzdWx0MiA9IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQoCisJCQkJdiwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOworCQkJaWYgKHJlc3VsdDIpIHsKKwkJCQlwcl9lcnIoIiVzOiBWb2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kIGZhaWxlZCBmb3Igc2Vzc2lvbiAweCV4LCBlcnIgJWQhXG4iLAorCQkJCQlfX2Z1bmNfXywgdi0+c2Vzc2lvbl9pZCwgcmVzdWx0Mik7CisKKwkJCQlyZXN1bHQgPSByZXN1bHQyOworCQkJfQorCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSAwOworCQl9CisJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJfQorCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHZvY19yZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSh2b2lkKQoreworCWludAkJCXJlc3VsdCA9IDA7CisJaW50CQkJcmVzdWx0MiA9IDA7CisJaW50CQkJaTsKKwlzdHJ1Y3Qgdm9pY2VfZGF0YQkqdiA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykgeworCQl2ID0gJmNvbW1vbi52b2ljZVtpXTsKKworCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKwkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSkgeworCQkJcmVzdWx0MiA9IHZvaWNlX3NlbmRfY3ZwX3JlZ2lzdGVyX3ZvbF9jYWxfY21kKHYpOworCQkJaWYgKHJlc3VsdDIgPCAwKSB7CisJCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIHZvY3ZvbCB0YWJsZSBmb3Igc2Vzc2lvbiAweCV4IVxuIiwKKwkJCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQpOworCisJCQkJcmVzdWx0ID0gcmVzdWx0MjsKKwkJCQkvKiBTdGlsbCB0cnkgdG8gcmVnaXN0ZXIgb3RoZXIgc2Vzc2lvbnMgKi8KKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJnYtPmxvY2spOworCX0KKworCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgdm9jX2RlcmVnaXN0ZXJfdm9jcHJvY192b2xfdGFibGUodm9pZCkKK3sKKwlpbnQJCQlyZXN1bHQgPSAwOworCWludAkJCXN1Y2Nlc3MgPSAwOworCWludAkJCWk7CisJc3RydWN0IHZvaWNlX2RhdGEJKnYgPSBOVUxMOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKKwkJdiA9ICZjb21tb24udm9pY2VbaV07CisKKwkJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkpIHsKKwkJCXJlc3VsdCA9IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfdm9sX2NhbF9jbWQodik7CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBkZXJlZ2lzdGVyIHZvY3ZvbCB0YWJsZSBmb3Igc2Vzc2lvbiAweCV4IVxuIiwKKwkJCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQpOworCisJCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKwkJCQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJCQkJaWYgKHN1Y2Nlc3MpIHsKKwkJCQkJcHJfZXJyKCIlczogVHJ5IHRvIHJlLXJlZ2lzdGVyIGFsbCBkZXJlZ2lzdGVyZWQgc2Vzc2lvbnMhXG4iLAorCQkJCQkJX19mdW5jX18pOworCisJCQkJCXZvY19yZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSgpOworCQkJCX0KKwkJCQlnb3RvIGRvbmU7CisJCQl9IGVsc2UgeworCQkJCXN1Y2Nlc3MgPSAxOworCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJfQorCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKK2RvbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHZvY19tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQoreworCWludAkJCXJlc3VsdCA9IDA7CisJc3RydWN0IHZvaWNlX2RhdGEJKnYgPSBOVUxMOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAorCQkJX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogTm8gYWRkcmVzcyB0byBtYXAhXG4iLAorCQkJX19mdW5jX18pOworCisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogbWFwIHNpemUgaXMgMCFcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJLyogdXNlIGZpcnN0IHNlc3Npb24gKi8KKwl2ID0gJmNvbW1vbi52b2ljZVswXTsKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKworCWlmICghaXNfcnRhY19tZW1vcnlfYWxsb2NhdGVkKCkpIHsKKwkJcmVzdWx0ID0gdm9pY2VfYWxsb2NfcnRhY19tZW1fbWFwX3RhYmxlKCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBSVEFDIGFsbG9jIG1lbSBtYXAgdGFibGUgZGlkIG5vdCB3b3JrISBhZGRyID0gMHglcEssIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKKwkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKKworCQkJZ290byBkb25lX3VubG9jazsKKwkJfQorCX0KKworCXJlc3VsdCA9IHZvaWNlX21hcF9tZW1vcnlfcGh5c2ljYWxfY21kKHYsCisJCSZjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLAorCQkoZG1hX2FkZHJfdCljYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAorCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLAorCQlWT0NfUlRBQ19NRU1fTUFQX1RPS0VOKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBSVEFDIG1tYXAgZGlkIG5vdCB3b3JrISBhZGRyID0gMHglcEssIHNpemUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCisJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKKworCQlmcmVlX3J0YWNfbWFwX3RhYmxlKCk7CisJCWdvdG8gZG9uZV91bmxvY2s7CisJfQorCisJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfaGFuZGxlID0gY29tbW9uLnJ0YWNfbWVtX2hhbmRsZTsKK2RvbmVfdW5sb2NrOgorCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgdm9jX3VubWFwX3J0YWNfYmxvY2sodWludDMyX3QgKm1lbV9tYXBfaGFuZGxlKQoreworCWludAkJCXJlc3VsdCA9IDA7CisJc3RydWN0IHZvaWNlX2RhdGEJKnYgPSBOVUxMOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAobWVtX21hcF9oYW5kbGUgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKKwkJCV9fZnVuY19fKTsKKworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCptZW1fbWFwX2hhbmRsZSA9PSAwKSB7CisJCXByX2RlYnVnKCIlczogTWFwIGhhbmRsZSBpcyAwLCBub3RoaW5nIHRvIHVubWFwXG4iLAorCQkJX19mdW5jX18pOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCS8qIFVzZSBmaXJzdCBzZXNzaW9uICovCisJLyogT25seSB1c2VkIGZvciBhcHIgd2FpdCBsb2NrICovCisJdiA9ICZjb21tb24udm9pY2VbMF07CisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisKKwlyZXN1bHQgPSB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKAorCQkJdiwgKm1lbV9tYXBfaGFuZGxlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByX2VycigiJXM6IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQgRmFpbGVkIGZvciBzZXNzaW9uIDB4JXghXG4iLAorCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQpOworCX0gZWxzZSB7CisJCSptZW1fbWFwX2hhbmRsZSA9IDA7CisJCWNvbW1vbi5ydGFjX21lbV9oYW5kbGUgPSAwOworCQlmcmVlX3J0YWNfbWFwX3RhYmxlKCk7CisJfQorCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NldHVwX3ZvY3Byb2Moc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB2b2ljZV9zZW5kX2N2cF9jcmVhdGVfY21kKHYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IENWUCBjcmVhdGUgZmFpbGVkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSB2b2ljZV9zZW5kX2N2cF9kZXZpY2VfY2hhbm5lbHNfY21kKHYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCBkZXZpY2UgY2hhbm5lbHMgZmFpbGVkIGVycjolZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gdm9pY2Vfc2VuZF9jdnBfdG9wb2xvZ3lfY29tbWl0X2NtZCh2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBTZXQgdG9wb2xvZ3kgY29tbWl0IGZhaWxlZCBlcnI6JWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXZvaWNlX3NlbmRfY3ZzX3JlZ2lzdGVyX2NhbF9jbWQodik7CisJdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfZGV2X2NmZ19jbWQodik7CisJdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfY2FsX2NtZCh2KTsKKwl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKKworCS8qIGVuYWJsZSB2b2Nwcm9jICovCisJcmV0ID0gdm9pY2Vfc2VuZF9lbmFibGVfdm9jcHJvY19jbWQodik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIGF0dGFjaCB2b2Nwcm9jICovCisJcmV0ID0gdm9pY2Vfc2VuZF9hdHRhY2hfdm9jcHJvY19jbWQodik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIHNlbmQgdHR5IG1vZGUgaWYgdHR5IGRldmljZSBpcyB1c2VkICovCisJdm9pY2Vfc2VuZF90dHlfbW9kZV9jbWQodik7CisKKwlpZiAoaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7CisJCXJldCA9IHZvaWNlX3NlbmRfbXZtX2NhbF9uZXR3b3JrX2NtZCh2KTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiB2b2ljZV9zZW5kX212bV9jYWxfbmV0d29ya19jbWQ6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCisJCXJldCA9IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kKHYpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCQl2b2ljZV9zZW5kX25ldGlkX3RpbWluZ19jbWQodik7CisJfQorCisJaWYgKHYtPnN0X2VuYWJsZSAmJiAhdi0+dHR5X21vZGUpCisJCXZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwKKwkJCQkJICAgICBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULAorCQkJCQkgICAgIHYtPnN0X2VuYWJsZSk7CisJLyogU3RhcnQgaW4tY2FsbCBtdXNpYyBkZWxpdmVyeSBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCAqLworCWlmICh2LT5tdXNpY19pbmZvLnBsYXlfZW5hYmxlKQorCQl2b2ljZV9jdnNfc3RhcnRfcGxheWJhY2sodik7CisKKwkvKiBTdGFydCBpbi1jYWxsIHJlY29yZGluZyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCAqLworCWlmICh2LT5yZWNfaW5mby5yZWNfZW5hYmxlKQorCQl2b2ljZV9jdnNfc3RhcnRfcmVjb3JkKHYsIHYtPnJlY19pbmZvLnJlY19tb2RlKTsKKworCWlmICh2LT5kdG1mX3J4X2RldGVjdF9lbikKKwkJdm9pY2Vfc2VuZF9kdG1mX3J4X2RldGVjdGlvbl9jbWQodiwgdi0+ZHRtZl9yeF9kZXRlY3RfZW4pOworCisJaWYgKHYtPmhkX2VuYWJsZSkKKwkJdm9pY2Vfc2VuZF9oZF9jbWQodiwgdi0+aGRfZW5hYmxlKTsKKworCXJ0YWNfYWRkX3ZvaWNlKHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpLAorCQl2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KSwKKwkJdi0+ZGV2X3J4LnBvcnRfaWQsIHYtPmRldl90eC5wb3J0X2lkLAorCQl2LT5kZXZfcnguZGV2X2lkLCB2LT5kZXZfdHguZGV2X2lkLAorCQl2LT5zZXNzaW9uX2lkKTsKKworCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGV2aWNlX2NoYW5uZWxzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgIGN2cF9zZXRfZGV2X2NoYW5uZWxzX2NtZCBjdnBfc2V0X2Rldl9jaGFubmVsc19jbWQ7CisJdm9pZCAqYXByX2N2cDsKKwl1MTYgY3ZwX2hhbmRsZTsKKworCWlmICghKHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY29tbW9uLmN2ZF92ZXJzaW9uKSA+PQorCSAgICAgIENWRF9JTlRfVkVSU0lPTl8yXzIpKSB7CisJCXByX2RlYnVnKCIlcyBDVkQgdmVyICVzIGRvZXNuJ3Qgc3VwcG9ydCBzZW5kX2RldmljZV9jaGFubmVscyBjbWRcbiIsCisJCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7CisKKwkJZ290byBkb25lOworCX0KKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKwlpZiAoIWFwcl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5oZHJfZmllbGQgPQorCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQlBUFJfUEtUX1ZFUik7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQlzaXplb2YoY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnBfc2V0X2Rldl9jaGFubmVsc19jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci50b2tlbiA9IDA7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5vcGNvZGUgPQorCQkJCVZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfU0VUX0RFVl9DSEFOTkVMUzsKKwljdnBfc2V0X2Rldl9jaGFubmVsc19jbWQuY3ZwX3NldF9jaGFubmVscy5yeF9udW1fY2hhbm5lbHMgPQorCQkJCVZTU19OVU1fREVWX0NIQU5ORUxTXzE7CisJY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmN2cF9zZXRfY2hhbm5lbHMudHhfbnVtX2NoYW5uZWxzID0KKwkJCQl2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHM7CisKKwl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc2V0X2Rldl9jaGFubmVsc19jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEZhaWwgaW4gc2VuZGluZyBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX1NFVF9ERVZfQ0hBTk5FTFNcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFwcl9oZHIgY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQ7CisJdm9pZCAqYXByX2N2cDsKKwl1MTYgY3ZwX2hhbmRsZTsKKworCWlmICghKHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY29tbW9uLmN2ZF92ZXJzaW9uKSA+PQorCSAgICAgIENWRF9JTlRfVkVSU0lPTl8yXzIpKSB7CisJCXByX2RlYnVnKCIlcyBDVkQgdmVyc2lvbiBzdHJpbmcgJXMgZG9lc24ndCBzdXBwb3J0IHRoaXMgY29tbWFuZFxuIiwKKwkJCSBfX2Z1bmNfXywgY29tbW9uLmN2ZF92ZXJzaW9uKTsKKworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOworCWlmICghYXByX2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKwljdnBfdG9wb2xvZ3lfY29tbWl0X2NtZC5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwljdnBfdG9wb2xvZ3lfY29tbWl0X2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF90b3BvbG9neV9jb21taXRfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKKwljdnBfdG9wb2xvZ3lfY29tbWl0X2NtZC50b2tlbiA9IDA7CisJY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQub3Bjb2RlID0gVlNTX0lWT0NQUk9DX0NNRF9UT1BPTE9HWV9DT01NSVQ7CisKKwl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfdG9wb2xvZ3lfY29tbWl0X2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRmFpbCBpbiBzZW5kaW5nIFZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfQ09NTUlUXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCisJCQkJKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9lbmFibGVfdm9jcHJvY19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFwcl9oZHIgY3ZwX2VuYWJsZV9jbWQ7CisJdm9pZCAqYXByX2N2cDsKKwl1MTYgY3ZwX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7CisKKwlpZiAoIWFwcl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOworCisJLyogZW5hYmxlIHZvY3Byb2MgYW5kIHdhaXQgZm9yIHJlc3Bvc2UgKi8KKwljdnBfZW5hYmxlX2NtZC5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwljdnBfZW5hYmxlX2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF9lbmFibGVfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJcHJfZGVidWcoImN2cF9lbmFibGVfY21kIHBrdCBzaXplID0gJWQsIGN2cF9oYW5kbGU9JWRcbiIsCisJCWN2cF9lbmFibGVfY21kLnBrdF9zaXplLCBjdnBfaGFuZGxlKTsKKwljdnBfZW5hYmxlX2NtZC5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnBfZW5hYmxlX2NtZC5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOworCWN2cF9lbmFibGVfY21kLnRva2VuID0gMDsKKwljdnBfZW5hYmxlX2NtZC5vcGNvZGUgPSBWU1NfSVZPQ1BST0NfQ01EX0VOQUJMRTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF9lbmFibGVfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSVZPQ1BST0NfQ01EX0VOQUJMRVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJCSh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fY2FsX25ldHdvcmtfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCB2c3NfaW12bV9jbWRfc2V0X2NhbF9uZXR3b3JrX3QgbXZtX3NldF9jYWxfbmV0d29yazsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfbXZtOworCXUxNiBtdm1faGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKworCWlmICghYXByX212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisKKwltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKG12bV9zZXRfY2FsX25ldHdvcmspIC0gQVBSX0hEUl9TSVpFKTsKKwltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOworCW12bV9zZXRfY2FsX25ldHdvcmsuaGRyLnRva2VuID0gMDsKKwltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci5vcGNvZGUgPSBWU1NfSU1WTV9DTURfU0VUX0NBTF9ORVRXT1JLOworCW12bV9zZXRfY2FsX25ldHdvcmsubmV0d29ya19pZCA9IFZTU19JQ09NTU9OX0NBTF9ORVRXT1JLX0lEX05PTkU7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc2V0X2NhbF9uZXR3b3JrKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9ORVRXT1JLXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKKwkJCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX25ldGlkX3RpbWluZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX212bTsKKwl1MTYgbXZtX2hhbmRsZTsKKwlzdHJ1Y3QgbXZtX3NldF9uZXR3b3JrX2NtZCBtdm1fc2V0X25ldHdvcms7CisJc3RydWN0IG12bV9zZXRfdm9pY2VfdGltaW5nX2NtZCBtdm1fc2V0X3ZvaWNlX3RpbWluZzsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07CisKKwlpZiAoIWFwcl9tdm0pIHsKKwkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOworCisJcmV0ID0gdm9pY2VfY29uZmlnX2N2c192b2NvZGVyKHYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIGNvbmZpZ3VyaW5nIENWUyB2b2MiLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKwkvKiBTZXQgbmV0d29yayBJRC4gKi8KKwlwcl9kZWJ1ZygiU2V0dGluZyBuZXR3b3JrIElEICV4XG4iLCBjb21tb24ubXZzX2luZm8ubmV0d29ya190eXBlKTsKKworCW12bV9zZXRfbmV0d29yay5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQlBUFJfUEtUX1ZFUik7CisJbXZtX3NldF9uZXR3b3JrLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihtdm1fc2V0X25ldHdvcmspIC0gQVBSX0hEUl9TSVpFKTsKKwltdm1fc2V0X25ldHdvcmsuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCW12bV9zZXRfbmV0d29yay5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwltdm1fc2V0X25ldHdvcmsuaGRyLnRva2VuID0gMDsKKwltdm1fc2V0X25ldHdvcmsuaGRyLm9wY29kZSA9IFZTU19JTVZNX0NNRF9TRVRfQ0FMX05FVFdPUks7CisJbXZtX3NldF9uZXR3b3JrLm5ldHdvcmsubmV0d29ya19pZCA9IGNvbW1vbi5tdnNfaW5mby5uZXR3b3JrX3R5cGU7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc2V0X25ldHdvcmspOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX05FVFdPUktcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIFNldCB2b2ljZSB0aW1pbmcuICovCisJIHByX2RlYnVnKCJTZXR0aW5nIHZvaWNlIHRpbWluZ1xuIik7CisKKwltdm1fc2V0X3ZvaWNlX3RpbWluZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQlBUFJfUEtUX1ZFUik7CisJbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJCXNpemVvZihtdm1fc2V0X3ZvaWNlX3RpbWluZykgLQorCQkJCQkJQVBSX0hEUl9TSVpFKTsKKwltdm1fc2V0X3ZvaWNlX3RpbWluZy5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7CisJbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLnRva2VuID0gMDsKKwltdm1fc2V0X3ZvaWNlX3RpbWluZy5oZHIub3Bjb2RlID0gVlNTX0lDT01NT05fQ01EX1NFVF9WT0lDRV9USU1JTkc7CisJbXZtX3NldF92b2ljZV90aW1pbmcudGltaW5nLm1vZGUgPSAwOworCW12bV9zZXRfdm9pY2VfdGltaW5nLnRpbWluZy5lbmNfb2Zmc2V0ID0gODAwMDsKKwltdm1fc2V0X3ZvaWNlX3RpbWluZy50aW1pbmcuZGVjX3JlcV9vZmZzZXQgPSAzMzAwOworCW12bV9zZXRfdm9pY2VfdGltaW5nLnRpbWluZy5kZWNfb2Zmc2V0ID0gODMwMDsKKworCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3NldF92b2ljZV90aW1pbmcpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX1RJTUlOR1xuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCQkJKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2F0dGFjaF92b2Nwcm9jX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXZtX2F0dGFjaF92b2Nwcm9jX2NtZCBtdm1fYV92b2Nwcm9jX2NtZDsKKwl2b2lkICphcHJfbXZtOworCXUxNiBtdm1faGFuZGxlLCBjdnBfaGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKworCWlmICghYXByX212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisJY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOworCisJLyogYXR0YWNoIHZvY3Byb2MgYW5kIHdhaXQgZm9yIHJlc3BvbnNlICovCisJbXZtX2Ffdm9jcHJvY19jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCW12bV9hX3ZvY3Byb2NfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKG12bV9hX3ZvY3Byb2NfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJcHJfZGVidWcoInNlbmQgbXZtX2Ffdm9jcHJvY19jbWQgcGt0IHNpemUgPSAlZFxuIiwKKwkJbXZtX2Ffdm9jcHJvY19jbWQuaGRyLnBrdF9zaXplKTsKKwltdm1fYV92b2Nwcm9jX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJbXZtX2Ffdm9jcHJvY19jbWQuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7CisJbXZtX2Ffdm9jcHJvY19jbWQuaGRyLnRva2VuID0gMDsKKwltdm1fYV92b2Nwcm9jX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lNVk1fQ01EX0FUVEFDSF9WT0NQUk9DOworCW12bV9hX3ZvY3Byb2NfY21kLm12bV9hdHRhY2hfY3ZwX2hhbmRsZS5oYW5kbGUgPSBjdnBfaGFuZGxlOworCisJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX2Ffdm9jcHJvY19jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZTU19JTVZNX0NNRF9BVFRBQ0hfVk9DUFJPQ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWw7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdm9jX3VwZGF0ZV9zZXNzaW9uX3BhcmFtcyhzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwkvKiByZXNldCBMQ0ggbW9kZSAqLworCXYtPmxjaF9tb2RlID0gMDsKKworCS8qIGNsZWFyIGRpc2FibGUgdG9wb2xvZ3kgc2V0dGluZyAqLworCXYtPmRpc2FibGVfdG9wb2xvZ3kgPSBmYWxzZTsKKworCS8qIGNsZWFyIG11dGUgc2V0dGluZyAqLworCXYtPmRldl9yeC5kZXZfbXV0ZSA9ICBjb21tb24uZGVmYXVsdF9tdXRlX3ZhbDsKKwl2LT5kZXZfdHguZGV2X211dGUgPSAgY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7CisJdi0+c3RyZWFtX3J4LnN0cmVhbV9tdXRlID0gY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7CisJdi0+c3RyZWFtX3R4LnN0cmVhbV9tdXRlID0gY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfZGVzdHJveV92b2Nwcm9jKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCBtdm1fZGV0YWNoX3ZvY3Byb2NfY21kIG12bV9kX3ZvY3Byb2NfY21kOworCXN0cnVjdCBhcHJfaGRyIGN2cF9kZXN0cm95X3Nlc3Npb25fY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9tdm0sICphcHJfY3ZwOworCXUxNiBtdm1faGFuZGxlLCBjdnBfaGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKwlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7CisKKwlpZiAoIWFwcl9tdm0gfHwgIWFwcl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX212bSBvciBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisJY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOworCisJLyogZGlzYWJsZSBzbG93dGFsayBpZiBzdF9lbmFibGUgaXMgc2V0ICovCisJaWYgKHYtPnN0X2VuYWJsZSkKKwkJdm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZCh2LCBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULCAwKTsKKworCS8qIERpc2FibGUgSEQgVm9pY2UgaWYgaGRfZW5hYmxlIGlzIHNldCAqLworCWlmICh2LT5oZF9lbmFibGUpCisJCXZvaWNlX3NlbmRfaGRfY21kKHYsIDApOworCisJLyogc3RvcCBwbGF5YmFjayBvciByZWNvcmRpbmcgKi8KKwl2LT5tdXNpY19pbmZvLmZvcmNlID0gMTsKKwl2b2ljZV9jdnNfc3RvcF9wbGF5YmFjayh2KTsKKwl2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7CisJLyogSWYgdm9pY2UgY2FsbCBpcyBhY3RpdmUgZHVyaW5nIFZvTFRFLCBTUlZDQyBoYXBwZW5zLgorCSAqIFN0YXJ0IHJlY29yZGluZyBvbiB2b2ljZSBzZXNzaW9uIGlmIHJlY29yZGluZyBzdGFydGVkIGR1cmluZyBWb0xURS4KKwkgKi8KKwlpZiAoaXNfdm9sdGVfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSAmJgorCSAgICAoKGNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS52b2Nfc3RhdGUgPT0gVk9DX1JVTikgfHwKKwkgICAgIChjb21tb24udm9pY2VbVk9DX1BBVEhfUEFTU0lWRV0udm9jX3N0YXRlID09IFZPQ19DSEFOR0UpKSkgeworCQlpZiAodi0+cmVjX2luZm8ucmVjX2VuYWJsZSkgeworCQkJdm9pY2VfY3ZzX3N0YXJ0X3JlY29yZCgKKwkJCQkmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1BBU1NJVkVdLAorCQkJCXYtPnJlY19pbmZvLnJlY19tb2RlKTsKKwkJCWNvbW1vbi5zcnZjY19yZWNfZmxhZyA9IHRydWU7CisKKwkJCXByX2RlYnVnKCIlczogc3dpdGNoIHJlY29yZGluZywgc3J2Y2NfcmVjX2ZsYWcgJWRcbiIsCisJCQkJIF9fZnVuY19fLCBjb21tb24uc3J2Y2NfcmVjX2ZsYWcpOworCQl9CisJfQorCisJLyogc2VuZCBzdG9wIHZvaWNlIGNtZCAqLworCXZvaWNlX3NlbmRfc3RvcF92b2ljZV9jbWQodik7CisKKwkvKiBzZW5kIHN0b3AgZHRtZiBkZXRlY3RvbiBjbWQgKi8KKwlpZiAodi0+ZHRtZl9yeF9kZXRlY3RfZW4pCisJCXZvaWNlX3NlbmRfZHRtZl9yeF9kZXRlY3Rpb25fY21kKHYsIDApOworCisJLyogZGV0YWNoIFZPQ1BST0MgYW5kIHdhaXQgZm9yIHJlc3BvbnNlIGZyb20gbXZtICovCisJbXZtX2Rfdm9jcHJvY19jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCW12bV9kX3ZvY3Byb2NfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKG12bV9kX3ZvY3Byb2NfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJcHJfZGVidWcoIm12bV9kX3ZvY3Byb2NfY21kICBwa3Qgc2l6ZSA9ICVkXG4iLAorCQltdm1fZF92b2Nwcm9jX2NtZC5oZHIucGt0X3NpemUpOworCW12bV9kX3ZvY3Byb2NfY21kLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwltdm1fZF92b2Nwcm9jX2NtZC5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwltdm1fZF92b2Nwcm9jX2NtZC5oZHIudG9rZW4gPSAwOworCW12bV9kX3ZvY3Byb2NfY21kLmhkci5vcGNvZGUgPSBWU1NfSU1WTV9DTURfREVUQUNIX1ZPQ1BST0M7CisJbXZtX2Rfdm9jcHJvY19jbWQubXZtX2RldGFjaF9jdnBfaGFuZGxlLmhhbmRsZSA9IGN2cF9oYW5kbGU7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fZF92b2Nwcm9jX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVlNTX0lNVk1fQ01EX0RFVEFDSF9WT0NQUk9DXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCisJCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfdm9sX2NhbF9jbWQodik7CisJdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl9jYWxfY21kKHYpOworCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQodik7CisJdm9pY2Vfc2VuZF9jdnNfZGVyZWdpc3Rlcl9jYWxfY21kKHYpOworCisJLyogZGVzdHJvcCBjdnAgc2Vzc2lvbiAqLworCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YoY3ZwX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwlwcl9kZWJ1ZygiY3ZwX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQgcGt0IHNpemUgPSAlZFxuIiwKKwkJY3ZwX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQucGt0X3NpemUpOworCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7CisJY3ZwX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQudG9rZW4gPSAwOworCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLm9wY29kZSA9IEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCisJCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKworCXJ0YWNfcmVtb3ZlX3ZvaWNlKHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpKTsKKwljdnBfaGFuZGxlID0gMDsKKwl2b2ljZV9zZXRfY3ZwX2hhbmRsZSh2LCBjdnBfaGFuZGxlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAorCQkJCQkJICAgIHVpbnQzMl90IG1lbV9oYW5kbGUpCit7CisJc3RydWN0IHZzc19pbWVtb3J5X2NtZF91bm1hcF90IG1lbV91bm1hcDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfbXZtOworCXUxNiBtdm1faGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKworCWlmICghYXByX212bSkgeworCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7CisKKwltZW1fdW5tYXAuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCW1lbV91bm1hcC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCXNpemVvZihtZW1fdW5tYXApIC0gQVBSX0hEUl9TSVpFKTsKKwltZW1fdW5tYXAuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCW1lbV91bm1hcC5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwltZW1fdW5tYXAuaGRyLnRva2VuID0gMDsKKwltZW1fdW5tYXAuaGRyLm9wY29kZSA9IFZTU19JTUVNT1JZX0NNRF9VTk1BUDsKKwltZW1fdW5tYXAubWVtX2hhbmRsZSA9IG1lbV9oYW5kbGU7CisKKwlwcl9kZWJ1ZygiJXM6IG1lbV9oYW5kbGU6IDB4JXhcbiIsIF9fZnVuY19fLCBtZW1fdW5tYXAubWVtX2hhbmRsZSk7CisKKwl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtZW1fdW5tYXApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigibWVtX3VubWFwIG9wWzB4JXhdcmV0WyVkXVxuIiwKKwkJCW1lbV91bm1hcC5oZHIub3Bjb2RlLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAorCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX3BhY2tldF9leGNoYW5nZV9jb25maWdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X29vYl9wYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3QKKwkJCQkJCSBwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZzOworCXUxNiBjdnNfaGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCisJaWYgKCFhcHJfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAorCQkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0Lmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdCkgLQorCQkJCQkgQVBSX0hEUl9TSVpFKTsKKwlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuaGRyLnRva2VuID0gMDsKKwlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5oZHIub3Bjb2RlID0KKwkJCSBWU1NfSVNUUkVBTV9DTURfU0VUX09PQl9QQUNLRVRfRVhDSEFOR0VfQ09ORklHOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0Lm1lbV9oYW5kbGUgPSB2LT5zaG1lbV9pbmZvLm1lbV9oYW5kbGU7CisJLyogZGVjIGJ1ZmZlciBhZGRyZXNzICovCisJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuZGVjX2J1Zl9hZGRyX2xzdyA9CisJCWxvd2VyXzMyX2JpdHModi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLnBoeXMpOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmRlY19idWZfYWRkcl9tc3cgPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLnBoeXMpOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmRlY19idWZfc2l6ZSA9IDQwOTY7CisJLyogZW5jIGJ1ZmZlciBhZGRyZXNzICovCisJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuZW5jX2J1Zl9hZGRyX2xzdyA9CisJCWxvd2VyXzMyX2JpdHModi0+c2htZW1faW5mby5zaF9idWYuYnVmWzFdLnBoeXMpOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfYWRkcl9tc3cgPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzFdLnBoeXMpOworCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfc2l6ZSA9IDQwOTY7CisKKwlwcl9kZWJ1ZygiJXM6IGRlYyBidWYgYWRkOiBsc3cgJTB4IG1zdyAlMHgsIHNpemUgJWQsIGVuYyBidWYgYWRkOiBsc3cgJTB4IG1zdyAlMHgsIHNpemUgJWRcbiIsCisJCV9fZnVuY19fLAorCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5kZWNfYnVmX2FkZHJfbHN3LAorCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5kZWNfYnVmX2FkZHJfbXN3LAorCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5kZWNfYnVmX3NpemUsCisJCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfYWRkcl9sc3csCisJCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfYWRkcl9tc3csCisJCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfc2l6ZSk7CisKKwl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2VuZCBwYWNrZXQgZXhjaGFuZ2UgY29uZmlnIGNtZCAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2N2c19kYXRhX2V4Y2hhbmdlX21vZGVfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX3QgZGF0YV9leGNoYW5nZV9wa3Q7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwlpZiAoIWFwcl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJZGF0YV9leGNoYW5nZV9wa3QuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkJQVBSX1BLVF9WRVIpOworCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGRhdGFfZXhjaGFuZ2VfcGt0KSAtIEFQUl9IRFJfU0laRSk7CisJZGF0YV9leGNoYW5nZV9wa3QuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci50b2tlbiA9IDA7CisJZGF0YV9leGNoYW5nZV9wa3QuaGRyLm9wY29kZSA9IFZTU19JU1RSRUFNX0NNRF9TRVRfUEFDS0VUX0VYQ0hBTkdFX01PREU7CisJZGF0YV9leGNoYW5nZV9wa3QubW9kZSA9IFZTU19JU1RSRUFNX1BBQ0tFVF9FWENIQU5HRV9NT0RFX09VVF9PRl9CQU5EOworCisJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmZGF0YV9leGNoYW5nZV9wa3QpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHNlbmQgZGF0YSBleGNoYW5nZSBtb2RlICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAorCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KQorCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX3N0cmVhbV9tdXRlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdWludDE2X3QgZGlyZWN0aW9uLAorCQkJCSAgICAgdWludDE2X3QgbXV0ZV9mbGFnLCB1aW50MzJfdCByYW1wX2R1cmF0aW9uKQoreworCXN0cnVjdCBjdnNfc2V0X211dGVfY21kIGN2c19tdXRlX2NtZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHNlbmQgbXV0ZS91bm11dGUgdG8gY3ZzICovCisJY3ZzX211dGVfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwljdnNfbXV0ZV9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJc2l6ZW9mKGN2c19tdXRlX2NtZCkgLSBBUFJfSERSX1NJWkUpOworCWN2c19tdXRlX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZzX211dGVfY21kLmhkci5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKwljdnNfbXV0ZV9jbWQuaGRyLnRva2VuID0gMDsKKwljdnNfbXV0ZV9jbWQuaGRyLm9wY29kZSA9IFZTU19JVk9MVU1FX0NNRF9NVVRFX1YyOworCWN2c19tdXRlX2NtZC5jdnNfc2V0X211dGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCWN2c19tdXRlX2NtZC5jdnNfc2V0X211dGUubXV0ZV9mbGFnID0gbXV0ZV9mbGFnOworCWN2c19tdXRlX2NtZC5jdnNfc2V0X211dGUucmFtcF9kdXJhdGlvbl9tcyA9IHJhbXBfZHVyYXRpb247CisKKwl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX211dGVfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIHN0cmVhbSBtdXRlXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX2RldmljZV9tdXRlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdWludDE2X3QgZGlyZWN0aW9uLAorCQkJCSAgICAgdWludDE2X3QgbXV0ZV9mbGFnLCB1aW50MzJfdCByYW1wX2R1cmF0aW9uKQoreworCXN0cnVjdCBjdnBfc2V0X211dGVfY21kIGN2cF9tdXRlX2NtZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCWN2cF9tdXRlX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCQlBUFJfUEtUX1ZFUik7CisJY3ZwX211dGVfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJCXNpemVvZihjdnBfbXV0ZV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwljdnBfbXV0ZV9jbWQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2cF9tdXRlX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisJY3ZwX211dGVfY21kLmhkci50b2tlbiA9IDA7CisJY3ZwX211dGVfY21kLmhkci5vcGNvZGUgPSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMjsKKwljdnBfbXV0ZV9jbWQuY3ZwX3NldF9tdXRlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKwljdnBfbXV0ZV9jbWQuY3ZwX3NldF9tdXRlLm11dGVfZmxhZyA9IG11dGVfZmxhZzsKKwljdnBfbXV0ZV9jbWQuY3ZwX3NldF9tdXRlLnJhbXBfZHVyYXRpb25fbXMgPSByYW1wX2R1cmF0aW9uOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZwLCAodWludDMyX3QgKikgJmN2cF9tdXRlX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyByeCBkZXZpY2UgY21kXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZW5kX3ZvbF9zdGVwX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlzdHJ1Y3QgY3ZwX3NldF9yeF92b2x1bWVfc3RlcF9jbWQgY3ZwX3ZvbF9zdGVwX2NtZDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZwOworCXUxNiBjdnBfaGFuZGxlOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKworCWlmICghYXByX2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisKKwkvKiBzZW5kIHZvbHVtZSBpbmRleCB0byBjdnAgKi8KKwljdnBfdm9sX3N0ZXBfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKKwkJCQkJCUFQUl9QS1RfVkVSKTsKKwljdnBfdm9sX3N0ZXBfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2cF92b2xfc3RlcF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwljdnBfdm9sX3N0ZXBfY21kLmhkci5zcmNfcG9ydCA9CisJCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKKwljdnBfdm9sX3N0ZXBfY21kLmhkci5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOworCWN2cF92b2xfc3RlcF9jbWQuaGRyLnRva2VuID0gMDsKKwljdnBfdm9sX3N0ZXBfY21kLmhkci5vcGNvZGUgPSBWU1NfSVZPTFVNRV9DTURfU0VUX1NURVA7CisJY3ZwX3ZvbF9zdGVwX2NtZC5jdnBfc2V0X3ZvbF9zdGVwLmRpcmVjdGlvbiA9IFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWDsKKwljdnBfdm9sX3N0ZXBfY21kLmN2cF9zZXRfdm9sX3N0ZXAudmFsdWUgPSB2LT5kZXZfcngudm9sdW1lX3N0ZXBfdmFsdWU7CisJY3ZwX3ZvbF9zdGVwX2NtZC5jdnBfc2V0X3ZvbF9zdGVwLnJhbXBfZHVyYXRpb25fbXMgPQorCQkJCQl2LT5kZXZfcngudm9sdW1lX3JhbXBfZHVyYXRpb25fbXM7CisJIHByX2RlYnVnKCIlcyBzdGVwX3ZhbHVlOiVkLCByYW1wX2R1cmF0aW9uX21zOiVkIiwKKwkJCV9fZnVuY19fLAorCQkJY3ZwX3ZvbF9zdGVwX2NtZC5jdnBfc2V0X3ZvbF9zdGVwLnZhbHVlLAorCQkJY3ZwX3ZvbF9zdGVwX2NtZC5jdnBfc2V0X3ZvbF9zdGVwLnJhbXBfZHVyYXRpb25fbXMpOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX3ZvbF9zdGVwX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgUlggVk9MIHN0ZXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0YXJ0X3JlY29yZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdWludDMyX3QgcmVjX21vZGUpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKworCXN0cnVjdCBjdnNfc3RhcnRfcmVjb3JkX2NtZCBjdnNfc3RhcnRfcmVjb3JkOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKKworCWlmICghYXByX2N2cykgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKworCWlmICghdi0+cmVjX2luZm8ucmVjb3JkaW5nKSB7CisJCWN2c19zdGFydF9yZWNvcmQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoCisJCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQlBUFJfUEtUX1ZFUik7CisJCWN2c19zdGFydF9yZWNvcmQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkgIHNpemVvZihjdnNfc3RhcnRfcmVjb3JkKSAtIEFQUl9IRFJfU0laRSk7CisJCWN2c19zdGFydF9yZWNvcmQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQljdnNfc3RhcnRfcmVjb3JkLmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCQljdnNfc3RhcnRfcmVjb3JkLmhkci50b2tlbiA9IDA7CisJCWN2c19zdGFydF9yZWNvcmQuaGRyLm9wY29kZSA9IFZTU19JUkVDT1JEX0NNRF9TVEFSVDsKKworCQljdnNfc3RhcnRfcmVjb3JkLnJlY19tb2RlLnBvcnRfaWQgPQorCQkJCQlWU1NfSVJFQ09SRF9QT1JUX0lEX0RFRkFVTFQ7CisJCWlmIChyZWNfbW9kZSA9PSBWT0NfUkVDX1VQTElOSykgeworCQkJY3ZzX3N0YXJ0X3JlY29yZC5yZWNfbW9kZS5yeF90YXBfcG9pbnQgPQorCQkJCQlWU1NfSVJFQ09SRF9UQVBfUE9JTlRfTk9ORTsKKwkJCWN2c19zdGFydF9yZWNvcmQucmVjX21vZGUudHhfdGFwX3BvaW50ID0KKwkJCQkJVlNTX0lSRUNPUkRfVEFQX1BPSU5UX1NUUkVBTV9FTkQ7CisJCX0gZWxzZSBpZiAocmVjX21vZGUgPT0gVk9DX1JFQ19ET1dOTElOSykgeworCQkJY3ZzX3N0YXJ0X3JlY29yZC5yZWNfbW9kZS5yeF90YXBfcG9pbnQgPQorCQkJCQlWU1NfSVJFQ09SRF9UQVBfUE9JTlRfU1RSRUFNX0VORDsKKwkJCWN2c19zdGFydF9yZWNvcmQucmVjX21vZGUudHhfdGFwX3BvaW50ID0KKwkJCQkJVlNTX0lSRUNPUkRfVEFQX1BPSU5UX05PTkU7CisJCX0gZWxzZSBpZiAocmVjX21vZGUgPT0gVk9DX1JFQ19CT1RIKSB7CisJCQljdnNfc3RhcnRfcmVjb3JkLnJlY19tb2RlLnJ4X3RhcF9wb2ludCA9CisJCQkJCVZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5EOworCQkJY3ZzX3N0YXJ0X3JlY29yZC5yZWNfbW9kZS50eF90YXBfcG9pbnQgPQorCQkJCQlWU1NfSVJFQ09SRF9UQVBfUE9JTlRfU1RSRUFNX0VORDsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgaW4tY2FsbCByZWNfbW9kZSAlZFxuIiwgX19mdW5jX18sCisJCQkJcmVjX21vZGUpOworCisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisKKwkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCQl2LT5hc3luY19lcnIgPSAwOworCisJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zdGFydF9yZWNvcmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTVEFSVF9SRUNPUkRcbiIsIF9fZnVuY19fLAorCQkJCXJldCk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisJCXYtPnJlY19pbmZvLnJlY29yZGluZyA9IDE7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBTdGFydCByZWNvcmQgYWxyZWFkeSBzZW50XG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9jdnNfc3RvcF9yZWNvcmQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKwlzdHJ1Y3QgYXByX2hkciBjdnNfc3RvcF9yZWNvcmQ7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCisJaWYgKCFhcHJfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJaWYgKHYtPnJlY19pbmZvLnJlY29yZGluZykgeworCQljdnNfc3RvcF9yZWNvcmQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQkgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwkJY3ZzX3N0b3BfcmVjb3JkLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkgIHNpemVvZihjdnNfc3RvcF9yZWNvcmQpIC0gQVBSX0hEUl9TSVpFKTsKKwkJY3ZzX3N0b3BfcmVjb3JkLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQljdnNfc3RvcF9yZWNvcmQuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKKwkJY3ZzX3N0b3BfcmVjb3JkLnRva2VuID0gMDsKKwkJY3ZzX3N0b3BfcmVjb3JkLm9wY29kZSA9IFZTU19JUkVDT1JEX0NNRF9TVE9QOworCisJCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwkJdi0+YXN5bmNfZXJyID0gMDsKKworCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfc3RvcF9yZWNvcmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTVE9QX1JFQ09SRFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBmYWlsOworCQl9CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAorCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisJCXYtPnJlY19pbmZvLnJlY29yZGluZyA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBTdG9wIHJlY29yZCBhbHJlYWR5IHNlbnRcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3N0YXJ0X3JlY29yZCh1aW50MzJfdCBwb3J0X2lkLCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJlY19tb2RlID0gMDsKKwl1MTYgY3ZzX2hhbmRsZTsKKwlpbnQgcmVjX3NldCA9IDA7CisJc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyIGl0cjsKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisKKwkvKiBjaGVjayBpZiBzZXNzaW9uX2lkIGlzIHZhbGlkICovCisJaWYgKCF2b2ljZV9pc192YWxpZF9zZXNzaW9uX2lkKHNlc3Npb25faWQpKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbiBpZDoldVxuIiwgX19mdW5jX18sCisJCSAgICAgICBzZXNzaW9uX2lkKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25faWQ6JXVcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCXdoaWxlICh2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbigmaXRyLCAmdikpIHsKKwkJaWYgKHYgPT0gTlVMTCkgeworCQkJcHJfZXJyKCIlczogdiBpcyBOVUxMLCBzZXNzaW9uaWQ6JXVcbiIsIF9fZnVuY19fLAorCQkJCXNlc3Npb25faWQpOworCisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQ6ICVkLCBzZXQ6ICVkLCB2OiAlcEtcbiIsCisJCQkgX19mdW5jX18sIHBvcnRfaWQsIHNldCwgdik7CisKKwkJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJCXJlY19tb2RlID0gdi0+cmVjX2luZm8ucmVjX21vZGU7CisJCXJlY19zZXQgPSBzZXQ7CisJCWlmIChzZXQpIHsKKwkJCWlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgIT0gMCkgJiYKKwkJCQkodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgIT0gMCkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IHJlYyBtb2RlIGFscmVhZHkgc2V0LlxuIiwKKwkJCQkJX19mdW5jX18pOworCisJCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHBvcnRfaWQgPT0gVk9JQ0VfUkVDT1JEX1RYKSB7CisJCQkJaWYgKCh2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9PSAwKQorCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9PSAwKSkgeworCQkJCQlyZWNfbW9kZSA9IFZPQ19SRUNfVVBMSU5LOworCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9IDE7CisJCQkJfSBlbHNlIGlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPT0gMCkKKwkJCQkJJiYgKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnICE9IDApKSB7CisJCQkJCXZvaWNlX2N2c19zdG9wX3JlY29yZCh2KTsKKwkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX0JPVEg7CisJCQkJCXYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBvcnRfaWQgPT0gVk9JQ0VfUkVDT1JEX1JYKSB7CisJCQkJaWYgKCh2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9PSAwKQorCQkJCQkmJiAodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgPT0gMCkpIHsKKwkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX0RPV05MSU5LOworCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9IDE7CisJCQkJfSBlbHNlIGlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgIT0gMCkKKwkJCQkJJiYgKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID09IDApKSB7CisJCQkJCXZvaWNlX2N2c19zdG9wX3JlY29yZCh2KTsKKwkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX0JPVEg7CisJCQkJCXYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID0gMTsKKwkJCQl9CisJCQl9CisJCQlyZWNfc2V0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPT0gMCkgJiYKKwkJCQkodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgPT0gMCkpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6IHJlYyBhbHJlYWR5IHN0b3BzLlxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwb3J0X2lkID09IFZPSUNFX1JFQ09SRF9UWCkgeworCQkJCWlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgIT0gMCkKKwkJCQkJJiYgKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID09IDApKSB7CisJCQkJCXYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID0gMDsKKwkJCQkJcmVjX3NldCA9IDA7CisJCQkJfSBlbHNlIGlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgIT0gMCkKKwkJCQkJJiYgKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnICE9IDApKSB7CisJCQkJCXZvaWNlX2N2c19zdG9wX3JlY29yZCh2KTsKKwkJCQkJdi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPSAwOworCQkJCQlyZWNfbW9kZSA9IFZPQ19SRUNfRE9XTkxJTks7CisJCQkJCXJlY19zZXQgPSAxOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocG9ydF9pZCA9PSBWT0lDRV9SRUNPUkRfUlgpIHsKKwkJCQlpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID09IDApCisJCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyAhPSAwKSkgeworCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9IDA7CisJCQkJCXJlY19zZXQgPSAwOworCQkJCX0gZWxzZSBpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnICE9IDApCisJCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyAhPSAwKSkgeworCQkJCQl2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7CisJCQkJCXYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID0gMDsKKwkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX1VQTElOSzsKKwkJCQkJcmVjX3NldCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJCXByX2RlYnVnKCIlczogbW9kZSA9JWQsIHNldCA9JWRcbiIsIF9fZnVuY19fLAorCQkJIHJlY19tb2RlLCByZWNfc2V0KTsKKwkJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJCWlmIChjdnNfaGFuZGxlICE9IDApIHsKKwkJCWlmIChyZWNfc2V0KQorCQkJCXJldCA9IHZvaWNlX2N2c19zdGFydF9yZWNvcmQodiwgcmVjX21vZGUpOworCQkJZWxzZQorCQkJCXJldCA9IHZvaWNlX2N2c19zdG9wX3JlY29yZCh2KTsKKwkJfQorCisJCS8qIER1cmluZyBTUlZDQywgcmVjb3JkaW5nIHdpbGwgc3dpdGNoIGZyb20gVm9MVEUgc2Vzc2lvbiB0bworCQkgKiB2b2ljZSBzZXNzaW9uLgorCQkgKiBUaGVuIHN0b3AgcmVjb3JkaW5nLCBuZWVkIHRvIHN0b3AgcmVjb3JkaW5nIG9uIHZvaWNlIHNlc3Npb24uCisJCSAqLworCQlpZiAoKCFyZWNfc2V0KSAmJiBjb21tb24uc3J2Y2NfcmVjX2ZsYWcpIHsKKwkJCXByX2RlYnVnKCIlcywgc3J2Y2NfcmVjX2ZsYWc6JWRcbiIsICBfX2Z1bmNfXywKKwkJCQkgY29tbW9uLnNydmNjX3JlY19mbGFnKTsKKworCQkJdm9pY2VfY3ZzX3N0b3BfcmVjb3JkKCZjb21tb24udm9pY2VbVk9DX1BBVEhfUEFTU0lWRV0pOworCQkJY29tbW9uLnNydmNjX3JlY19mbGFnID0gZmFsc2U7CisJCX0KKworCQkvKiBDYWNoZSB0aGUgdmFsdWUgKi8KKwkJdi0+cmVjX2luZm8ucmVjX2VuYWJsZSA9IHJlY19zZXQ7CisJCXYtPnJlY19pbmZvLnJlY19tb2RlID0gcmVjX21vZGU7CisKKwkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX2N2c19zdGFydF9wbGF5YmFjayhzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3ZzX3N0YXJ0X3BsYXliYWNrX2NtZCBjdnNfc3RhcnRfcGxheWJhY2s7CisJdm9pZCAqYXByX2N2czsKKwl1MTYgY3ZzX2hhbmRsZTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwlpZiAoIWFwcl9jdnMpIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisKKwlpZiAoIXYtPm11c2ljX2luZm8ucGxheWluZyAmJiB2LT5tdXNpY19pbmZvLmNvdW50KSB7CisJCWN2c19zdGFydF9wbGF5YmFjay5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRCgKKwkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCUFQUl9QS1RfVkVSKTsKKwkJY3ZzX3N0YXJ0X3BsYXliYWNrLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2c19zdGFydF9wbGF5YmFjaykgLSBBUFJfSERSX1NJWkUpOworCQljdnNfc3RhcnRfcGxheWJhY2suaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQljdnNfc3RhcnRfcGxheWJhY2suaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJCWN2c19zdGFydF9wbGF5YmFjay5oZHIudG9rZW4gPSAwOworCQljdnNfc3RhcnRfcGxheWJhY2suaGRyLm9wY29kZSA9IFZTU19JUExBWUJBQ0tfQ01EX1NUQVJUOworCQljdnNfc3RhcnRfcGxheWJhY2sucGxheWJhY2tfbW9kZS5wb3J0X2lkID0KKwkJCQkJCXYtPm11c2ljX2luZm8ucG9ydF9pZDsKKworCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCXYtPmFzeW5jX2VyciA9IDA7CisKKwkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3N0YXJ0X3BsYXliYWNrKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTVEFSVF9QTEFZQkFDS1xuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBmYWlsOworCQl9CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAorCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJdi0+bXVzaWNfaW5mby5wbGF5aW5nID0gMTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IFN0YXJ0IHBsYXliYWNrIGFscmVhZHkgc2VudFxuIiwgX19mdW5jX18pOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0b3BfcGxheWJhY2soc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJIGludCByZXQgPSAwOworCSBzdHJ1Y3QgYXByX2hkciBjdnNfc3RvcF9wbGF5YmFjazsKKwkgdm9pZCAqYXByX2N2czsKKwkgdTE2IGN2c19oYW5kbGU7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCisJaWYgKCFhcHJfY3ZzKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJaWYgKHYtPm11c2ljX2luZm8ucGxheWluZyAmJiAoKCF2LT5tdXNpY19pbmZvLmNvdW50KSB8fAorCQkJCQkJKHYtPm11c2ljX2luZm8uZm9yY2UpKSkgeworCQljdnNfc3RvcF9wbGF5YmFjay5oZHJfZmllbGQgPQorCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCQljdnNfc3RvcF9wbGF5YmFjay5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkJc2l6ZW9mKGN2c19zdG9wX3BsYXliYWNrKSAtIEFQUl9IRFJfU0laRSk7CisJCWN2c19zdG9wX3BsYXliYWNrLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQljdnNfc3RvcF9wbGF5YmFjay5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOworCQljdnNfc3RvcF9wbGF5YmFjay50b2tlbiA9IDA7CisKKwkJY3ZzX3N0b3BfcGxheWJhY2sub3Bjb2RlID0gVlNTX0lQTEFZQkFDS19DTURfU1RPUDsKKworCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCXYtPmFzeW5jX2VyciA9IDA7CisKKwkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3N0b3BfcGxheWJhY2spOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTVE9QX1BMQVlCQUNLXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKKwkJCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCQlpZiAoIXJldCkgeworCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQl2LT5hc3luY19lcnIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJdi0+bXVzaWNfaW5mby5wbGF5aW5nID0gMDsKKwkJdi0+bXVzaWNfaW5mby5mb3JjZSA9IDA7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBTdG9wIHBsYXliYWNrIGFscmVhZHkgc2VudFxuIiwgX19mdW5jX18pOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9jX2xjaF9vcHMoc3RydWN0IHZvaWNlX2RhdGEgKnYsIGVudW0gdm9pY2VfbGNoX21vZGUgbGNoX21vZGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKGxjaF9tb2RlKSB7CisJY2FzZSBWT0lDRV9MQ0hfU1RBUlQ6CisKKwkJcmV0ID0gdm9jX2VuZF92b2ljZV9jYWxsKHYtPnNlc3Npb25faWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6IHZvaWNlIGNhbGwgZW5kIGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBWT0lDRV9MQ0hfU1RPUDoKKworCQlyZXQgPSB2b2Nfc3RhcnRfdm9pY2VfY2FsbCh2LT5zZXNzaW9uX2lkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IHZvaWNlIGNhbGwgc3RhcnQgZmFpbGVkICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IEludmFsaWQgTENIIG1vZGU6ICVkXG4iLAorCQkJX19mdW5jX18sIHYtPmxjaF9tb2RlKTsKKwkJYnJlYWs7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3N0YXJ0X3BsYXliYWNrKHVpbnQzMl90IHNldCwgdWludDE2X3QgcG9ydF9pZCkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyIGl0cjsKKwl1MTYgY3ZzX2hhbmRsZTsKKworCXByX2RlYnVnKCIlcyBwb3J0X2lkID0gJSN4IHNldCA9ICVkIiwgX19mdW5jX18sIHBvcnRfaWQsIHNldCk7CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBBTExfU0VTU0lPTl9WU0lEKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICgodiAhPSBOVUxMKSAmJgorCQkgICAgKCgocG9ydF9pZCA9PSBWT0lDRV9QTEFZQkFDS19UWCkgJiYKKwkJICAgICAgIGlzX3N1YjFfdnNpZCh2LT5zZXNzaW9uX2lkKSkgfHwKKwkJICAgICAoKHBvcnRfaWQgPT0gVk9JQ0UyX1BMQVlCQUNLX1RYKSAmJgorCQkgICAgICAgaXNfc3ViMl92c2lkKHYtPnNlc3Npb25faWQpKSkpIHsKKworCQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJCQl2LT5tdXNpY19pbmZvLnBvcnRfaWQgPSBwb3J0X2lkOworCQkJdi0+bXVzaWNfaW5mby5wbGF5X2VuYWJsZSA9IHNldDsKKwkJCWlmIChzZXQpCisJCQkJdi0+bXVzaWNfaW5mby5jb3VudCsrOworCQkJZWxzZQorCQkJCXYtPm11c2ljX2luZm8uY291bnQtLTsKKwkJCXByX2RlYnVnKCIlczogbXVzaWNfaW5mbyBjb3VudD0lZFxuIiwgX19mdW5jX18sCisJCQkJIHYtPm11c2ljX2luZm8uY291bnQpOworCisJCQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7CisJCQlpZiAoY3ZzX2hhbmRsZSAhPSAwKSB7CisJCQkJaWYgKHNldCkKKwkJCQkJcmV0ID0gdm9pY2VfY3ZzX3N0YXJ0X3BsYXliYWNrKHYpOworCQkJCWVsc2UKKwkJCQkJcmV0ID0gdm9pY2VfY3ZzX3N0b3BfcGxheWJhY2sodik7CisJCQl9CisJCQltdXRleF91bmxvY2soJnYtPmxvY2spOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX2Rpc2FibGVfdG9wb2xvZ3kodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlzYWJsZSkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOworCWludCByZXQgPSAwOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnYtPmxvY2spOworCisJdi0+ZGlzYWJsZV90b3BvbG9neSA9IGRpc2FibGU7CisKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZXRfcGFja2V0X2V4Y2hhbmdlX21vZGVfYW5kX2NvbmZpZyh1aW50MzJfdCBzZXNzaW9uX2lkLAorCQkJCQkJIHVpbnQzMl90IG1vZGUpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHYtPnZvY19zdGF0ZSAhPSBWT0NfUlVOKQorCQlyZXQgPSB2b2ljZV9zZW5kX2N2c19kYXRhX2V4Y2hhbmdlX21vZGVfY21kKHYpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBFcnJvciB2b2ljZV9zZW5kX2RhdGFfZXhjaGFuZ2VfbW9kZV9jbWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHZvaWNlX3NlbmRfY3ZzX3BhY2tldF9leGNoYW5nZV9jb25maWdfY21kKHYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRXJyb3I6IHZvaWNlX3NlbmRfcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19jbWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiByZXQ7CitmYWlsOgorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgdm9jX3NldF90eF9tdXRlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGRpciwgdWludDMyX3QgbXV0ZSwKKwkJICAgIHVpbnQzMl90IHJhbXBfZHVyYXRpb24pCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICh2ICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJnYtPmxvY2spOworCQkJdi0+c3RyZWFtX3R4LnN0cmVhbV9tdXRlID0gbXV0ZTsKKwkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zID0KKwkJCQkJCQkJcmFtcF9kdXJhdGlvbjsKKwkJCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkgJiYKKwkJCQkodi0+bGNoX21vZGUgPT0gMCkpCisJCQkJcmV0ID0gdm9pY2Vfc2VuZF9zdHJlYW1fbXV0ZV9jbWQodiwKKwkJCQlWU1NfSVZPTFVNRV9ESVJFQ1RJT05fVFgsCisJCQkJdi0+c3RyZWFtX3R4LnN0cmVhbV9tdXRlLAorCQkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zKTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJc2Vzc2lvbl9pZCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2V0X2RldmljZV9tdXRlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGRpciwgdWludDMyX3QgbXV0ZSwKKwkJCXVpbnQzMl90IHJhbXBfZHVyYXRpb24pCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICh2ICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJnYtPmxvY2spOworCQkJaWYgKGRpciA9PSBWU1NfSVZPTFVNRV9ESVJFQ1RJT05fVFgpIHsKKwkJCQl2LT5kZXZfdHguZGV2X211dGUgPSBtdXRlOworCQkJCXYtPmRldl90eC5kZXZfbXV0ZV9yYW1wX2R1cmF0aW9uX21zID0KKwkJCQkJCQlyYW1wX2R1cmF0aW9uOworCQkJfSBlbHNlIHsKKwkJCQl2LT5kZXZfcnguZGV2X211dGUgPSBtdXRlOworCQkJCXYtPmRldl9yeC5kZXZfbXV0ZV9yYW1wX2R1cmF0aW9uX21zID0KKwkJCQkJCQlyYW1wX2R1cmF0aW9uOworCQkJfQorCisJCQlpZiAoKCh2LT52b2Nfc3RhdGUgPT0gVk9DX1JVTikgfHwKKwkJCQkodi0+dm9jX3N0YXRlID09IFZPQ19TVEFOREJZKSkgJiYKKwkJCQkodi0+bGNoX21vZGUgPT0gMCkpCisJCQkJcmV0ID0gdm9pY2Vfc2VuZF9kZXZpY2VfbXV0ZV9jbWQodiwKKwkJCQkJCQlkaXIsCisJCQkJCQkJbXV0ZSwKKwkJCQkJCQlyYW1wX2R1cmF0aW9uKTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJc2Vzc2lvbl9pZCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2NfZ2V0X3J4X2RldmljZV9tdXRlKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKworCXJldCA9IHYtPmRldl9yeC5kZXZfbXV0ZTsKKworCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3NldF90dHlfbW9kZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50OF90IHR0eV9tb2RlKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisKKwl2LT50dHlfbW9kZSA9IHR0eV9tb2RlOworCisJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3VpbnQ4X3Qgdm9jX2dldF90dHlfbW9kZSh1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisKKwlyZXQgPSB2LT50dHlfbW9kZTsKKworCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3NldF9wcF9lbmFibGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgbW9kdWxlX2lkLCB1aW50MzJfdCBlbmFibGUpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICh2ICE9IE5VTEwpIHsKKwkJCWlmICghKGlzX3ZvaWNlX2FwcF9pZCh2LT5zZXNzaW9uX2lkKSkpCisJCQkJY29udGludWU7CisKKwkJCW11dGV4X2xvY2soJnYtPmxvY2spOworCQkJaWYgKG1vZHVsZV9pZCA9PSBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NUKQorCQkJCXYtPnN0X2VuYWJsZSA9IGVuYWJsZTsKKworCQkJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0NfUlVOKSB7CisJCQkJaWYgKChtb2R1bGVfaWQgPT0gTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCkgJiYKKwkJCQkgICAgKCF2LT50dHlfbW9kZSkpCisJCQkJCXJldCA9IHZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwKKwkJCQkJCU1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QsCisJCQkJCQllbmFibGUpOworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkJCQkJc2Vzc2lvbl9pZCk7CisJCQlyZXQgPSAgLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHZvY19zZXRfaGRfZW5hYmxlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyIGl0cjsKKworCXZvaWNlX2l0cl9pbml0KCZpdHIsIHNlc3Npb25faWQpOworCXdoaWxlICh2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbigmaXRyLCAmdikpIHsKKwkJaWYgKHYgIT0gTlVMTCkgeworCQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJCQl2LT5oZF9lbmFibGUgPSBlbmFibGU7CisKKwkJCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9DX1JVTikKKwkJCQlyZXQgPSB2b2ljZV9zZW5kX2hkX2NtZCh2LCBlbmFibGUpOworCisJCQltdXRleF91bmxvY2soJnYtPmxvY2spOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHNlc3Npb25faWQpOworCQkJcmV0ID0gIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2NfZ2V0X3BwX2VuYWJsZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBtb2R1bGVfaWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKwlpZiAobW9kdWxlX2lkID09IE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QpCisJCXJldCA9IHYtPnN0X2VuYWJsZTsKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHZvY19zZXRfcnhfdm9sX3N0ZXAodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlyLCB1aW50MzJfdCB2b2xfc3RlcCwKKwkJCXVpbnQzMl90IHJhbXBfZHVyYXRpb24pCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7CisKKwlwcl9kZWJ1ZygiJXMgc2Vzc2lvbiBpZCA9ICUjeCB2b2wgPSAldSIsIF9fZnVuY19fLCBzZXNzaW9uX2lkLAorCQl2b2xfc3RlcCk7CisKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICh2ICE9IE5VTEwpIHsKKwkJCW11dGV4X2xvY2soJnYtPmxvY2spOworCQkJdi0+ZGV2X3J4LnZvbHVtZV9zdGVwX3ZhbHVlID0gdm9sX3N0ZXA7CisJCQl2LT5kZXZfcngudm9sdW1lX3JhbXBfZHVyYXRpb25fbXMgPSByYW1wX2R1cmF0aW9uOworCQkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSkKKwkJCQlyZXQgPSB2b2ljZV9zZW5kX3ZvbF9zdGVwX2NtZCh2KTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJc2Vzc2lvbl9pZCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2V0X2RldmljZV9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2RpciwKKwkJCSAgdWludDhfdCBub19vZl9jaGFubmVscywgdWludDMyX3QgcG9ydF9pZCkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByX2RlYnVnKCIlczogcGF0aF9kaXI9JWQgcG9ydF9pZD0leCwgY2hhbm5lbHM9JWRcbiIsCisJCSBfX2Z1bmNfXywgcGF0aF9kaXIsIHBvcnRfaWQsIG5vX29mX2NoYW5uZWxzKTsKKworCW11dGV4X2xvY2soJnYtPmxvY2spOworCWlmIChwYXRoX2RpciA9PSBSWF9QQVRIKSB7CisJCXYtPmRldl9yeC5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKKwkJdi0+ZGV2X3J4Lm5vX29mX2NoYW5uZWxzID0gbm9fb2ZfY2hhbm5lbHM7CisJfSBlbHNlIHsKKwkJdi0+ZGV2X3R4LnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOworCQl2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHMgPSBub19vZl9jaGFubmVsczsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm9jX3NldF9yb3V0ZV9mbGFnKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQ4X3QgcGF0aF9kaXIsIHVpbnQ4X3Qgc2V0KQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiBwYXRoX2Rpcj0lZCwgc2V0PSVkXG4iLCBfX2Z1bmNfXywgcGF0aF9kaXIsIHNldCk7CisKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKworCWlmIChwYXRoX2RpciA9PSBSWF9QQVRIKQorCQl2LT52b2Nfcm91dGVfc3RhdGUucnhfcm91dGVfZmxhZyA9IHNldDsKKwllbHNlCisJCXYtPnZvY19yb3V0ZV9zdGF0ZS50eF9yb3V0ZV9mbGFnID0gc2V0OworCisJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCit1aW50OF90IHZvY19nZXRfcm91dGVfZmxhZyh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50OF90IHBhdGhfZGlyKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisKKwlpZiAocGF0aF9kaXIgPT0gUlhfUEFUSCkKKwkJcmV0ID0gdi0+dm9jX3JvdXRlX3N0YXRlLnJ4X3JvdXRlX2ZsYWc7CisJZWxzZQorCQlyZXQgPSB2LT52b2Nfcm91dGVfc3RhdGUudHhfcm91dGVfZmxhZzsKKworCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX2VuZF92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKworCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9DX1JVTiB8fCB2LT52b2Nfc3RhdGUgPT0gVk9DX0VSUk9SIHx8CisJICAgIHYtPnZvY19zdGF0ZSA9PSBWT0NfQ0hBTkdFIHx8IHYtPnZvY19zdGF0ZSA9PSBWT0NfU1RBTkRCWSkgeworCisJCXByX2RlYnVnKCIlczogVk9DX1NUQVRFOiAlZFxuIiwgX19mdW5jX18sIHYtPnZvY19zdGF0ZSk7CisKKwkJcmV0ID0gdm9pY2VfZGVzdHJveV92b2Nwcm9jKHYpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2VycigiJXM6ICBkZXN0cm95IHZvaWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJCXZvY191cGRhdGVfc2Vzc2lvbl9wYXJhbXModik7CisKKwkJdm9pY2VfZGVzdHJveV9tdm1fY3ZzX3Nlc3Npb24odik7CisJCXYtPnZvY19zdGF0ZSA9IFZPQ19SRUxFQVNFOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEVycm9yOiBFbmQgdm9pY2UgY2FsbGVkIGluIHN0YXRlICVkXG4iLAorCQkJX19mdW5jX18sIHYtPnZvY19zdGF0ZSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc3RhbmRieV92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlzdHJ1Y3QgYXByX2hkciBtdm1fc3RhbmRieV92b2ljZV9jbWQ7CisJdm9pZCAqYXByX212bTsKKwl1MTYgbXZtX2hhbmRsZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXM6IHZvYyBzdGF0ZT0lZCIsIF9fZnVuY19fLCB2LT52b2Nfc3RhdGUpOworCisJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0NfUlVOKSB7CisJCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKKwkJaWYgKCFhcHJfbXZtKSB7CisJCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisJCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKKwkJbXZtX3N0YW5kYnlfdm9pY2VfY21kLmhkcl9maWVsZCA9CisJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOworCQltdm1fc3RhbmRieV92b2ljZV9jbWQucGt0X3NpemUgPQorCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCXNpemVvZihtdm1fc3RhbmRieV92b2ljZV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwkJcHJfZGVidWcoInNlbmQgbXZtX3N0YW5kYnlfdm9pY2VfY21kIHBrdCBzaXplID0gJWRcbiIsCisJCQkgbXZtX3N0YW5kYnlfdm9pY2VfY21kLnBrdF9zaXplKTsKKwkJbXZtX3N0YW5kYnlfdm9pY2VfY21kLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCQltdm1fc3RhbmRieV92b2ljZV9jbWQuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKKwkJbXZtX3N0YW5kYnlfdm9pY2VfY21kLnRva2VuID0gMDsKKwkJbXZtX3N0YW5kYnlfdm9pY2VfY21kLm9wY29kZSA9IFZTU19JTVZNX0NNRF9TVEFOREJZX1ZPSUNFOworCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLAorCQkJCSh1aW50MzJfdCAqKSZtdm1fc3RhbmRieV92b2ljZV9jbWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVlNTX0lNVk1fQ01EX1NUQU5EQllfVk9JQ0VcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQl2LT52b2Nfc3RhdGUgPSBWT0NfU1RBTkRCWTsKKwl9CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2NfZGlzYWJsZV9kZXZpY2UodWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOworCWludCByZXQgPSAwOworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoIiVzOiB2b2Mgc3RhdGU9JWRcbiIsIF9fZnVuY19fLCB2LT52b2Nfc3RhdGUpOworCisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0NfUlVOKSB7CisJCXJldCA9IHZvaWNlX3BhdXNlX3ZvaWNlX2NhbGwodik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBQYXVzZSBWb2ljZSBDYWxsIGZhaWxlZCBmb3Igc2Vzc2lvbiAweCV4LCBlcnIgJWQhXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB2LT5zZXNzaW9uX2lkLCByZXQpOworCQkJZ290byBkb25lOworCQl9CisJCXJ0YWNfcmVtb3ZlX3ZvaWNlKHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpKTsKKwkJdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKKwkJdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl9jYWxfY21kKHYpOworCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kKHYpOworCisJCXYtPnZvY19zdGF0ZSA9IFZPQ19DSEFOR0U7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBjYWxsZWQgaW4gdm9jIHN0YXRlPSVkLCBOb19PUFxuIiwKKwkJCSBfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2NfZW5hYmxlX2RldmljZSh1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHZvYyBzdGF0ZT0lZFxuIiwgX19mdW5jX18sIHYtPnZvY19zdGF0ZSk7CisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0NfQ0hBTkdFKSB7CisJCXJldCA9IHZvaWNlX3NlbmRfdHR5X21vZGVfY21kKHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogU2VuZGluZyBUVFkgbW9kZSBmYWlsZWQsIHJldD0lZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCS8qIE5vdCBhIGNyaXRpY2FsIGVycm9yLCBhbGxvdyB2b2ljZSBjYWxsIHRvIGNvbnRpbnVlICovCisJCX0KKworCQlpZiAodi0+dHR5X21vZGUpIHsKKwkJCS8qIGRpc2FibGUgc2xvd3RhbGsgKi8KKwkJCXZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwKKwkJCQkJCSAgICAgTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCwKKwkJCQkJCSAgICAgMCk7CisJCX0gZWxzZSB7CisJCQkvKiByZXN0b3JlIHNsb3d0YWxrICovCisJCQl2b2ljZV9zZW5kX3NldF9wcF9lbmFibGVfY21kKHYsCisJCQkJCQkgICAgIE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QsCisJCQkJCQkgICAgIHYtPnN0X2VuYWJsZSk7CisJCX0KKworCQlyZXQgPSB2b2ljZV9zZW5kX3NldF9kZXZpY2VfY21kKHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogU2V0IGRldmljZSBmYWlsZWQsIHJldD0lZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IHZvaWNlX3NlbmRfY3ZwX2RldmljZV9jaGFubmVsc19jbWQodik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiAgU2V0IGRldmljZSBjaGFubmVscyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJldCA9IHZvaWNlX3NlbmRfY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQodik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiAgU2V0IHRvcG9sb2d5IGNvbW1pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXZvaWNlX3NlbmRfY3ZwX3JlZ2lzdGVyX2Rldl9jZmdfY21kKHYpOworCQl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9jYWxfY21kKHYpOworCQl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKKworCQlydGFjX2FkZF92b2ljZSh2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KSwKKwkJCSAgICAgICB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KSwKKwkJCSAgICAgICB2LT5kZXZfcngucG9ydF9pZCwgdi0+ZGV2X3R4LnBvcnRfaWQsCisJCQkgICAgICAgdi0+ZGV2X3J4LmRldl9pZCwgdi0+ZGV2X3R4LmRldl9pZCwKKwkJCSAgICAgICB2LT5zZXNzaW9uX2lkKTsKKworCQlyZXQgPSB2b2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZCh2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiJXM6IEZhaWwgaW4gc2VuZGluZyBTVEFSVF9WT0lDRSwgcmV0PSVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByZXQpOworCQkJZ290byBkb25lOworCQl9CisJCXYtPnZvY19zdGF0ZSA9IFZPQ19SVU47CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIiVzOiBjYWxsZWQgaW4gdm9jIHN0YXRlPSVkLCBOb19PUFxuIiwKKwkJCSBfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2V0X2xjaCh1aW50MzJfdCBzZXNzaW9uX2lkLCBlbnVtIHZvaWNlX2xjaF9tb2RlIGxjaF9tb2RlKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJnYtPmxvY2spOworCWlmICh2LT5sY2hfbW9kZSA9PSBsY2hfbW9kZSkgeworCQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQgYWxyZWFkeSBpbiBMQ0ggbW9kZSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHNlc3Npb25faWQsIGxjaF9tb2RlKTsKKworCQltdXRleF91bmxvY2soJnYtPmxvY2spOworCQlnb3RvIGRvbmU7CisJfQorCisJdi0+bGNoX21vZGUgPSBsY2hfbW9kZTsKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCisJcmV0ID0gdm9jX2xjaF9vcHModiwgdi0+bGNoX21vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGxjaCBvcHMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX3Jlc3VtZV92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHZvaWNlX3NlbmRfc3RhcnRfdm9pY2VfY21kKHYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFNUQVJUX1ZPSUNFXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwl2LT52b2Nfc3RhdGUgPSBWT0NfUlVOOworCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHZvY19zdGFydF92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKworCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9DX0VSUk9SKSB7CisJCXByX2RlYnVnKCIlczogVk9DIGluIEVSUiBzdGF0ZVxuIiwgX19mdW5jX18pOworCisJCXZvaWNlX2Rlc3Ryb3lfbXZtX2N2c19zZXNzaW9uKHYpOworCQl2LT52b2Nfc3RhdGUgPSBWT0NfSU5JVDsKKwl9CisKKwlpZiAoKHYtPnZvY19zdGF0ZSA9PSBWT0NfSU5JVCkgfHwKKwkJKHYtPnZvY19zdGF0ZSA9PSBWT0NfUkVMRUFTRSkpIHsKKwkJcmV0ID0gdm9pY2VfYXByX3JlZ2lzdGVyKHNlc3Npb25faWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogIGFwciByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChpc19jdmRfdmVyc2lvbl9xdWVyaWVkKCkpIHsKKwkJCXByX2RlYnVnKCIlczogUmV0dXJuaW5nIHRoZSBjYWNoZWQgdmFsdWUgJXNcbiIsCisJCQkJIF9fZnVuY19fLCBjb21tb24uY3ZkX3ZlcnNpb24pOworCQl9IGVsc2UgeworCQkJcmV0ID0gdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHYpOworCQkJaWYgKHJldCA8IDApCisJCQkJcHJfZGVidWcoIiVzOiBFcnJvciByZXRyaWV2aW5nIENWRCB2ZXJzaW9uICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHJldCk7CisJCX0KKworCQlyZXQgPSB2b2ljZV9jcmVhdGVfbXZtX2N2c19zZXNzaW9uKHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJjcmVhdGUgbXZtIGFuZCBjdnMgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChpc192b2lwX3Nlc3Npb24oc2Vzc2lvbl9pZCkpIHsKKwkJCS8qIEFsbG9jYXRlIG9vYiBtZW0gaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkIGFuZAorCQkJICogbWVtb3J5IG1hcCB0aGUgb29iIG1lbW9yeSBibG9jay4KKwkJCSAqLworCQkJcmV0ID0gdm9pY2VfYWxsb2NfYW5kX21hcF9vb2JfbWVtKHYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiB2b2ljZV9hbGxvY19hbmRfbWFwX29vYl9tZW0oKSBmYWlsZWQsIHJldDolZFxuIiwKKwkJCQkgICAgICAgX19mdW5jX18sIHJldCk7CisKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisKKwkJCXJldCA9IHZvaWNlX3NldF9wYWNrZXRfZXhjaGFuZ2VfbW9kZV9hbmRfY29uZmlnKAorCQkJCXNlc3Npb25faWQsCisJCQkJVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfT1VUX09GX0JBTkQpOworCQkJaWYgKHJldCkgeworCQkJCXByX2VycigiJXM6IEVycjogZXhjaGFuZ2VfbW9kZV9hbmRfY29uZmlnICAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwkJcmV0ID0gdm9pY2Vfc2VuZF9kdWFsX2NvbnRyb2xfY21kKHYpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJFcnIgRHVhbCBjb21tYW5kIGZhaWxlZFxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmV0ID0gdm9pY2Vfc2V0dXBfdm9jcHJvYyh2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2Vycigic2V0dXAgdm9pY2UgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXJldCA9IHZvaWNlX3NlbmRfdm9sX3N0ZXBfY21kKHYpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2Vycigidm9pY2Ugdm9sdW1lIGZhaWxlZFxuIik7CisKKwkJcmV0ID0gdm9pY2Vfc2VuZF9zdHJlYW1fbXV0ZV9jbWQodiwKKwkJCQlWU1NfSVZPTFVNRV9ESVJFQ1RJT05fVFgsCisJCQkJdi0+c3RyZWFtX3R4LnN0cmVhbV9tdXRlLAorCQkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoInZvaWNlIG11dGUgZmFpbGVkXG4iKTsKKworCQlyZXQgPSB2b2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZCh2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2Vycigic3RhcnQgdm9pY2UgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXYtPnZvY19zdGF0ZSA9IFZPQ19SVU47CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogRXJyb3I6IFN0YXJ0IHZvaWNlIGNhbGxlZCBpbiBzdGF0ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCB2LT52b2Nfc3RhdGUpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CitmYWlsOgorCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHZvY19zZXRfZXh0X2VjX3JlZih1aW50MTZfdCBwb3J0X2lkLCBib29sIHN0YXRlKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlpZiAoc3RhdGUgPT0gdHJ1ZSkgeworCQlpZiAocG9ydF9pZCA9PSBBRkVfUE9SVF9JTlZBTElEKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQiLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBleGl0OworCQl9CisJCWNvbW1vbi5lY19wb3J0X2lkID0gcG9ydF9pZDsKKwkJY29tbW9uLmVjX3JlZl9leHQgPSB0cnVlOworCX0gZWxzZSB7CisJCWNvbW1vbi5lY19yZWZfZXh0ID0gZmFsc2U7CisJCWNvbW1vbi5lY19wb3J0X2lkID0gcG9ydF9pZDsKKwl9CitleGl0OgorCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHZvY19yZWdpc3Rlcl9tdnNfY2IodWxfY2JfZm4gdWxfY2IsCisJCQkgICBkbF9jYl9mbiBkbF9jYiwKKwkJCSAgIHZvaXBfc3NyX2NiIHNzcl9jYiwKKwkJCSAgIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwljb21tb24ubXZzX2luZm8udWxfY2IgPSB1bF9jYjsKKwljb21tb24ubXZzX2luZm8uZGxfY2IgPSBkbF9jYjsKKwljb21tb24ubXZzX2luZm8uc3NyX2NiID0gc3NyX2NiOworCWNvbW1vbi5tdnNfaW5mby5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Cit9CisKK3ZvaWQgdm9jX3JlZ2lzdGVyX2R0bWZfcnhfZGV0ZWN0aW9uX2NiKGR0bWZfcnhfZGV0X2NiX2ZuIGR0bWZfcnhfdWxfY2IsCisJCQkJICAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwljb21tb24uZHRtZl9pbmZvLmR0bWZfcnhfdWxfY2IgPSBkdG1mX3J4X3VsX2NiOworCWNvbW1vbi5kdG1mX2luZm8ucHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworfQorCit2b2lkIHZvY19jb25maWdfdm9jb2Rlcih1aW50MzJfdCBtZWRpYV90eXBlLAorCQkJdWludDMyX3QgcmF0ZSwKKwkJCXVpbnQzMl90IG5ldHdvcmtfdHlwZSwKKwkJCXVpbnQzMl90IGR0eF9tb2RlLAorCQkJdWludDMyX3QgZXZyY19taW5fcmF0ZSwKKwkJCXVpbnQzMl90IGV2cmNfbWF4X3JhdGUpCit7CisJY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGUgPSBtZWRpYV90eXBlOworCWNvbW1vbi5tdnNfaW5mby5yYXRlID0gcmF0ZTsKKwljb21tb24ubXZzX2luZm8ubmV0d29ya190eXBlID0gbmV0d29ya190eXBlOworCWNvbW1vbi5tdnNfaW5mby5kdHhfbW9kZSA9IGR0eF9tb2RlOworCWNvbW1vbi5tdnNfaW5mby5ldnJjX21pbl9yYXRlID0gZXZyY19taW5fcmF0ZTsKKwljb21tb24ubXZzX2luZm8uZXZyY19tYXhfcmF0ZSA9IGV2cmNfbWF4X3JhdGU7Cit9CisKK3N0YXRpYyBpbnQzMl90IHFkc3BfbXZtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCit7CisJdWludDMyX3QgKnB0ciA9IE5VTEw7CisJc3RydWN0IGNvbW1vbl9kYXRhICpjID0gTlVMTDsKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisJaW50IGkgPSAwOworCXN0cnVjdCB2c3NfaXZlcnNpb25fcnNwX2dldF90ICp2ZXJzaW9uX3JzcCA9IE5VTEw7CisKKwlpZiAoKGRhdGEgPT0gTlVMTCkgfHwgKHByaXYgPT0gTlVMTCkpIHsKKwkJcHJfZXJyKCIlczogZGF0YSBvciBwcml2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYyA9IHByaXY7CisKKwlwcl9kZWJ1ZygiJXM6IFBheWxvYWQgTGVuZ3RoID0gJWQsIG9wY29kZT0leFxuIiwgX19mdW5jX18sCisJCWRhdGEtPnBheWxvYWRfc2l6ZSwgZGF0YS0+b3Bjb2RlKTsKKworCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7CisJCXByX2RlYnVnKCIlczogUmVzZXQgZXZlbnQgcmVjZWl2ZWQgaW4gVm9pY2Ugc2VydmljZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJaWYgKGNvbW1vbi5tdnNfaW5mby5zc3JfY2IpIHsKKwkJCXByX2RlYnVnKCIlczogSW5mb3JtaW5nIHJlc2V0IGV2ZW50IHRvIFZvSVBcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWNvbW1vbi5tdnNfaW5mby5zc3JfY2IoZGF0YS0+b3Bjb2RlLAorCQkJCQljb21tb24ubXZzX2luZm8ucHJpdmF0ZV9kYXRhKTsKKwkJfQorCisJCWFwcl9yZXNldChjLT5hcHJfcTZfbXZtKTsKKwkJYy0+YXByX3E2X212bSA9IE5VTEw7CisKKwkJLyogY2xlYW4gdXAgbWVtb3J5IGhhbmRsZSAqLworCQljLT5jYWxfbWVtX2hhbmRsZSA9IDA7CisJCWMtPnJ0YWNfbWVtX2hhbmRsZSA9IDA7CisJCWNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKE1BWF9WT0lDRV9DQUxfVFlQRVMsCisJCQkJY29tbW9uLmNhbF9kYXRhKTsKKwkJcnRhY19jbGVhcl9tYXBwaW5nKFZPSUNFX1JUQUNfQ0FMKTsKKworCQkvKiBTdWItc3lzdGVtIHJlc3RhcnQgaXMgYXBwbGljYWJsZSB0byBhbGwgc2Vzc2lvbnMuICovCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKKwkJCWMtPnZvaWNlW2ldLm12bV9oYW5kbGUgPSAwOworCQkJYy0+dm9pY2VbaV0uc2htZW1faW5mby5tZW1faGFuZGxlID0gMDsKKwkJfQorCisJCS8qIEZyZWUgdGhlIElPTiBtZW1vcnkgYW5kIGNsZWFyIGhhbmRsZXMgZm9yIFNvdXJjZSBUcmFja2luZyAqLworCQlpZiAoaXNfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vbXJ5X2FsbG9jYXRlZCgpKSB7CisJCQltc21fYXVkaW9faW9uX2ZyZWUoCisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50LAorCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSk7CisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlID0gMDsKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQgPQorCQkJCQkJCQkJTlVMTDsKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgPQorCQkJCQkJCQkJTlVMTDsKKwkJfQorCQkvKiBjbGVhbiB1cCBzcnZjYyByZWMgZmxhZyAqLworCQljLT5zcnZjY19yZWNfZmxhZyA9IGZhbHNlOworCQl2b2Nfc2V0X2Vycm9yX3N0YXRlKGRhdGEtPnJlc2V0X3Byb2MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IHNlc3Npb25faWR4IDB4JXhcbiIsIF9fZnVuY19fLCBkYXRhLT5kZXN0X3BvcnQpOworCisJdiA9IHZvaWNlX2dldF9zZXNzaW9uX2J5X2lkeChkYXRhLT5kZXN0X3BvcnQpOworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgeworCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplKSB7CisJCQlwdHIgPSBkYXRhLT5wYXlsb2FkOworCisJCQlwcl9kZWJ1ZygiJXggJXhcbiIsIHB0clswXSwgcHRyWzFdKTsKKwkJCS8qIHBpbmcgbXZtIHNlcnZpY2UgQUNLICovCisJCQlzd2l0Y2ggKHB0clswXSkgeworCQkJY2FzZSBWU1NfSU1WTV9DTURfQ1JFQVRFX1BBU1NJVkVfQ09OVFJPTF9TRVNTSU9OOgorCQkJY2FzZSBWU1NfSU1WTV9DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OOgorCQkJCS8qIFBhc3NpdmUgc2Vzc2lvbiBpcyB1c2VkIGZvciBDUyBjYWxsCisJCQkJICogRnVsbCBzZXNzaW9uIGlzIHVzZWQgZm9yIFZvSVAgY2FsbC4KKwkJCQkgKi8KKwkJCQlwcl9kZWJ1ZygiJXM6IGNtZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwdHJbMF0pOworCQkJCWlmICghcHRyWzFdKSB7CisJCQkJCXByX2RlYnVnKCIlczogTVZNIGhhbmRsZSBpcyAlZFxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgZGF0YS0+c3JjX3BvcnQpOworCQkJCQl2b2ljZV9zZXRfbXZtX2hhbmRsZSh2LCBkYXRhLT5zcmNfcG9ydCk7CisJCQkJfSBlbHNlCisJCQkJCXByX2VycigiZ290IE5BQ0sgZm9yIHNlbmRpbmcgTVZNIGNyZWF0ZSBzZXNzaW9uXG4iKTsKKwkJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOworCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNTX0lNVk1fQ01EX1NUQVJUX1ZPSUNFOgorCQkJY2FzZSBWU1NfSU1WTV9DTURfQVRUQUNIX1ZPQ1BST0M6CisJCQljYXNlIFZTU19JTVZNX0NNRF9TVE9QX1ZPSUNFOgorCQkJY2FzZSBWU1NfSU1WTV9DTURfREVUQUNIX1ZPQ1BST0M6CisJCQljYXNlIFZTU19JU1RSRUFNX0NNRF9TRVRfVFRZX01PREU6CisJCQljYXNlIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOgorCQkJY2FzZSBWU1NfSU1WTV9DTURfQVRUQUNIX1NUUkVBTToKKwkJCWNhc2UgVlNTX0lNVk1fQ01EX0RFVEFDSF9TVFJFQU06CisJCQljYXNlIFZTU19JQ09NTU9OX0NNRF9TRVRfTkVUV09SSzoKKwkJCWNhc2UgVlNTX0lDT01NT05fQ01EX1NFVF9WT0lDRV9USU1JTkc6CisJCQljYXNlIFZTU19JTVZNX0NNRF9TRVRfUE9MSUNZX0RVQUxfQ09OVFJPTDoKKwkJCWNhc2UgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTkVUV09SSzoKKwkJCWNhc2UgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTUVESUFfVFlQRToKKwkJCWNhc2UgVlNTX0lNRU1PUllfQ01EX01BUF9QSFlTSUNBTDoKKwkJCWNhc2UgVlNTX0lNRU1PUllfQ01EX1VOTUFQOgorCQkJY2FzZSBWU1NfSU1WTV9DTURfUEFVU0VfVk9JQ0U6CisJCQljYXNlIFZTU19JTVZNX0NNRF9TVEFOREJZX1ZPSUNFOgorCQkJY2FzZSBWU1NfSUhEVk9JQ0VfQ01EX0VOQUJMRToKKwkJCWNhc2UgVlNTX0lIRFZPSUNFX0NNRF9ESVNBQkxFOgorCQkJCXByX2RlYnVnKCIlczogY21kID0gMHgleFxuIiwgX19mdW5jX18sIHB0clswXSk7CisJCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKKwkJCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTU19JVkVSU0lPTl9DTURfR0VUOgorCQkJCXByX2RlYnVnKCIlczogRXJyb3IgcmV0cmlldmluZyBDVkQgVmVyc2lvbiwgZXJyb3I6JWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgcHRyWzFdKTsKKworCQkJCXN0cmxjcHkoY29tbW9uLmN2ZF92ZXJzaW9uLCBDVkRfVkVSU0lPTl8wXzAsCisJCQkJCXNpemVvZihjb21tb24uY3ZkX3ZlcnNpb24pKTsKKwkJCQlwcl9kZWJ1ZygiJXM6IEZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlLCBDVkQgVmVyc2lvbiA9ICVzXG4iLAorCQkJCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7CisKKwkJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOworCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZGVidWcoIiVzOiBub3QgbWF0Y2ggY21kID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHB0clswXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSU1FTU9SWV9SU1BfTUFQKSB7CisJCXByX2RlYnVnKCIlcywgUmV2ZCBWU1NfSU1FTU9SWV9SU1BfTUFQIHJlc3BvbnNlXG4iLCBfX2Z1bmNfXyk7CisKKwkJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSAmJiBkYXRhLT50b2tlbiA9PSBWT0lQX01FTV9NQVBfVE9LRU4pIHsKKwkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7CisJCQlpZiAocHRyWzBdKSB7CisJCQkJdi0+c2htZW1faW5mby5tZW1faGFuZGxlID0gcHRyWzBdOworCQkJCXByX2RlYnVnKCIlczogc2hhcmVkIG1lbV9oYW5kbGU6IDB4WyV4XVxuIiwKKwkJCQkJIF9fZnVuY19fLCB2LT5zaG1lbV9pbmZvLm1lbV9oYW5kbGUpOworCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGF0YS0+cGF5bG9hZF9zaXplICYmCisJCQkgICBkYXRhLT50b2tlbiA9PSBWT0NfQ0FMX01FTV9NQVBfVE9LRU4pIHsKKwkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7CisJCQlpZiAocHRyWzBdKSB7CisJCQkJYy0+Y2FsX21lbV9oYW5kbGUgPSBwdHJbMF07CisKKwkJCQlwcl9kZWJ1ZygiJXM6IGNhbCBtZW0gaGFuZGxlIDB4JXhcbiIsCisJCQkJCSBfX2Z1bmNfXywgYy0+Y2FsX21lbV9oYW5kbGUpOworCisJCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKKwkJCX0KKwkJfSBlbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgJiYKKwkJCSAgIGRhdGEtPnRva2VuID09IFZPQ19WT0lDRV9IT1NUX1BDTV9NQVBfVE9LRU4pIHsKKwkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7CisJCQlpZiAocHRyWzBdKSB7CisJCQkJY29tbW9uLnZvaWNlX2hvc3RfcGNtX21lbV9oYW5kbGUgPSBwdHJbMF07CisKKwkJCQlwcl9kZWJ1ZygiJXM6IHZocGNtIG1lbSBoYW5kbGUgMHgleFxuIiwKKwkJCQkJIF9fZnVuY19fLAorCQkJCQkgY29tbW9uLnZvaWNlX2hvc3RfcGNtX21lbV9oYW5kbGUpOworCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGF0YS0+cGF5bG9hZF9zaXplICYmCisJCQkJZGF0YS0+dG9rZW4gPT0gVk9DX1JUQUNfTUVNX01BUF9UT0tFTikgeworCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKKwkJCWlmIChwdHJbMF0pIHsKKwkJCQljLT5ydGFjX21lbV9oYW5kbGUgPSBwdHJbMF07CisKKwkJCQlwcl9kZWJ1ZygiJXM6IGNhbCBtZW0gaGFuZGxlIDB4JXhcbiIsCisJCQkJCSBfX2Z1bmNfXywgYy0+cnRhY19tZW1faGFuZGxlKTsKKworCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGF0YS0+cGF5bG9hZF9zaXplICYmCisJCQkgICBkYXRhLT50b2tlbiA9PSBWT0NfU09VUkNFX1RSQUNLSU5HX01FTV9NQVBfVE9LRU4pIHsKKwkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7CisJCQlpZiAocHRyWzBdKSB7CisJCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSA9CisJCQkJCQkJCQlwdHJbMF07CisKKwkJCQlwcl9kZWJ1ZygiJXM6IFNvdXJjZSBUcmFja2luZyBzaGFyZWQgbWVtIGhhbmRsZSAweCV4XG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJICAgY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSk7CisKKwkJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCQkJd2FrZV91cCgmdi0+bXZtX3dhaXQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCIlczogVW5rbm93biBtZW0gbWFwIHRva2VuICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBkYXRhLT50b2tlbik7CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSVZFUlNJT05fUlNQX0dFVCkgeworCQlwcl9kZWJ1ZygiJXM6IFJlY2VpdmVkIFZTU19JVkVSU0lPTl9SU1BfR0VUXG4iLCBfX2Z1bmNfXyk7CisKKwkJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSkgeworCQkJdmVyc2lvbl9yc3AgPQorCQkJCShzdHJ1Y3QgdnNzX2l2ZXJzaW9uX3JzcF9nZXRfdCAqKWRhdGEtPnBheWxvYWQ7CisJCQltZW1jcHkoY29tbW9uLmN2ZF92ZXJzaW9uLCB2ZXJzaW9uX3JzcC0+dmVyc2lvbiwKKwkJCSAgICAgICBDVkRfVkVSU0lPTl9TVFJJTkdfTUFYX1NJWkUpOworCQkJcHJfZGVidWcoIiVzOiBDVkQgVmVyc2lvbiA9ICVzXG4iLAorCQkJCSBfX2Z1bmNfXywgY29tbW9uLmN2ZF92ZXJzaW9uKTsKKworCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJd2FrZV91cCgmdi0+bXZtX3dhaXQpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50MzJfdCBxZHNwX2N2c19jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXVpbnQzMl90ICpwdHIgPSBOVUxMOworCXN0cnVjdCBjb21tb25fZGF0YSAqYyA9IE5VTEw7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCBpID0gMDsKKworCWlmICgoZGF0YSA9PSBOVUxMKSB8fCAocHJpdiA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBkYXRhIG9yIHByaXYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljID0gcHJpdjsKKworCXByX2RlYnVnKCIlczogc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgZGF0YS0+ZGVzdF9wb3J0KTsKKwlwcl9kZWJ1ZygiJXM6IFBheWxvYWQgTGVuZ3RoID0gJWQsIG9wY29kZT0leFxuIiwgX19mdW5jX18sCisJCWRhdGEtPnBheWxvYWRfc2l6ZSwgZGF0YS0+b3Bjb2RlKTsKKworCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7CisJCXByX2RlYnVnKCIlczogUmVzZXQgZXZlbnQgcmVjZWl2ZWQgaW4gVm9pY2Ugc2VydmljZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJYXByX3Jlc2V0KGMtPmFwcl9xNl9jdnMpOworCQljLT5hcHJfcTZfY3ZzID0gTlVMTDsKKworCQkvKiBTdWItc3lzdGVtIHJlc3RhcnQgaXMgYXBwbGljYWJsZSB0byBhbGwgc2Vzc2lvbnMuICovCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspCisJCQljLT52b2ljZVtpXS5jdnNfaGFuZGxlID0gMDsKKworCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhNQVhfVk9JQ0VfQ0FMX1RZUEVTLAorCQkJCWNvbW1vbi5jYWxfZGF0YSk7CisKKwkJLyogRnJlZSB0aGUgSU9OIG1lbW9yeSBhbmQgY2xlYXIgaGFuZGxlcyBmb3IgU291cmNlIFRyYWNraW5nICovCisJCWlmIChpc19zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9tcnlfYWxsb2NhdGVkKCkpIHsKKwkJCW1zbV9hdWRpb19pb25fZnJlZSgKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQsCisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlKTsKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLm1lbV9oYW5kbGUgPSAwOworCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCA9CisJCQkJCQkJCQlOVUxMOworCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSA9CisJCQkJCQkJCQlOVUxMOworCQl9CisJCXZvY19zZXRfZXJyb3Jfc3RhdGUoZGF0YS0+cmVzZXRfcHJvYyk7CisJCXJldHVybiAwOworCX0KKworCXYgPSB2b2ljZV9nZXRfc2Vzc2lvbl9ieV9pZHgoZGF0YS0+ZGVzdF9wb3J0KTsKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkYXRhLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKKwkJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSkgeworCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKKworCQkJcHJfZGVidWcoIiV4ICV4XG4iLCBwdHJbMF0sIHB0clsxXSk7CisJCQlpZiAocHRyWzFdICE9IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBjbWQgPSAweCV4IHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKKwkJCQkJX19mdW5jX18sIHB0clswXSwgcHRyWzFdKTsKKwkJCX0KKwkJCS8qcmVzcG9uc2UgZnJvbSAgQ1ZTICovCisJCQlzd2l0Y2ggKHB0clswXSkgeworCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfQ1JFQVRFX1BBU1NJVkVfQ09OVFJPTF9TRVNTSU9OOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OOgorCQkJCWlmICghcHRyWzFdKSB7CisJCQkJCXByX2RlYnVnKCIlczogQ1ZTIGhhbmRsZSBpcyAlZFxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgZGF0YS0+c3JjX3BvcnQpOworCQkJCQl2b2ljZV9zZXRfY3ZzX2hhbmRsZSh2LCBkYXRhLT5zcmNfcG9ydCk7CisJCQkJfSBlbHNlCisJCQkJCXByX2VycigiZ290IE5BQ0sgZm9yIHNlbmRpbmcgQ1ZTIGNyZWF0ZSBzZXNzaW9uXG4iKTsKKwkJCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOworCQkJCXdha2VfdXAoJnYtPmN2c193YWl0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNTX0lWT0xVTUVfQ01EX01VVEVfVjI6CisJCQljYXNlIFZTU19JU1RSRUFNX0NNRF9TRVRfTUVESUFfVFlQRToKKwkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX1ZPQ19BTVJfU0VUX0VOQ19SQVRFOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfVk9DX0FNUldCX1NFVF9FTkNfUkFURToKKwkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX1NFVF9FTkNfRFRYX01PREU6CisJCQljYXNlIFZTU19JU1RSRUFNX0NNRF9DRE1BX1NFVF9FTkNfTUlOTUFYX1JBVEU6CisJCQljYXNlIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQV9WMjoKKwkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX0RFUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQToKKwkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX1JFR0lTVEVSX1NUQVRJQ19DQUxJQlJBVElPTl9EQVRBOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfREVSRUdJU1RFUl9TVEFUSUNfQ0FMSUJSQVRJT05fREFUQToKKwkJCWNhc2UgVlNTX0lDT01NT05fQ01EX01BUF9NRU1PUlk6CisJCQljYXNlIFZTU19JQ09NTU9OX0NNRF9VTk1BUF9NRU1PUlk6CisJCQljYXNlIFZTU19JQ09NTU9OX0NNRF9TRVRfVUlfUFJPUEVSVFk6CisJCQljYXNlIFZTU19JUExBWUJBQ0tfQ01EX1NUQVJUOgorCQkJY2FzZSBWU1NfSVBMQVlCQUNLX0NNRF9TVE9QOgorCQkJY2FzZSBWU1NfSVJFQ09SRF9DTURfU1RBUlQ6CisJCQljYXNlIFZTU19JUkVDT1JEX0NNRF9TVE9QOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfU0VUX1BBQ0tFVF9FWENIQU5HRV9NT0RFOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfU0VUX09PQl9QQUNLRVRfRVhDSEFOR0VfQ09ORklHOgorCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfU0VUX1JYX0RUTUZfREVURUNUSU9OOgorCQkJCXByX2RlYnVnKCIlczogY21kID0gMHgleFxuIiwgX19mdW5jX18sIHB0clswXSk7CisJCQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKKwkJCQl3YWtlX3VwKCZ2LT5jdnNfd2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZPSUNFX0NNRF9TRVRfUEFSQU06CisJCQkJcHJfZGVidWcoIiVzOiBWT0lDRV9DTURfU0VUX1BBUkFNXG4iLCBfX2Z1bmNfXyk7CisJCQkJcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKFJUQUNfQ1ZTLCBwdHIsCisJCQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVk9JQ0VfQ01EX0dFVF9QQVJBTToKKwkJCQlwcl9kZWJ1ZygiJXM6IFZPSUNFX0NNRF9HRVRfUEFSQU1cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQkvKiBTaG91bGQgb25seSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYW4gQVBSICovCisJCQkJLyogZXJyb3Igb3IgbWFsZm9ybWVkIEFQUiBwYWNrZXQuIE90aGVyd2lzZSAqLworCQkJCS8qIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgKi8KKwkJCQkvKiBWT0lDRV9FVlRfR0VUX1BBUkFNX0FDSyAqLworCQkJCWlmIChwdHJbMV0gIT0gMCkgeworCQkJCQlwcl9lcnIoIiVzOiBDVlAgZ2V0IHBhcmFtIGVycm9yID0gJWQsIHJlc3VtaW5nXG4iLAorCQkJCQkJX19mdW5jX18sIHB0clsxXSk7CisJCQkJCXJ0YWNfbWFrZV92b2ljZV9jYWxsYmFjayhSVEFDX0NWUCwKKwkJCQkJCWRhdGEtPnBheWxvYWQsCisJCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZGVidWcoIiVzOiBjbWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgcHRyWzBdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09CisJCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfRU5DX0JVRkZFUl9SRUFEWSkgeworCQlpbnQgcmV0ID0gMDsKKwkJdTE2IGN2c19oYW5kbGU7CisJCXVpbnQzMl90ICpjdnNfdm9jX3BrdDsKKwkJc3RydWN0IGN2c19lbmNfYnVmZmVyX2NvbnN1bWVkX2NtZCBzZW5kX2VuY19idWZfY29uc3VtZWRfY21kOworCQl2b2lkICphcHJfY3ZzOworCisJCXByX2RlYnVnKCJFbmNvZGVyIGJ1ZmZlciBpcyByZWFkeVxuIik7CisKKwkJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOworCQlpZiAoIWFwcl9jdnMpIHsKKwkJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOworCisJCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLmhkcl9maWVsZCA9CisJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCUFQUl9QS1RfVkVSKTsKKwkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIucGt0X3NpemUgPQorCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCXNpemVvZihzZW5kX2VuY19idWZfY29uc3VtZWRfY21kKSAtIEFQUl9IRFJfU0laRSk7CisKKwkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7CisJCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLnRva2VuID0gMDsKKwkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIub3Bjb2RlID0KKwkJCVZTU19JU1RSRUFNX0VWVF9PT0JfTk9USUZZX0VOQ19CVUZGRVJfQ09OU1VNRUQ7CisKKwkJY3ZzX3ZvY19wa3QgPSB2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMV0uZGF0YTsKKwkJaWYgKGN2c192b2NfcGt0ICE9IE5VTEwgJiYgIGNvbW1vbi5tdnNfaW5mby51bF9jYiAhPSBOVUxMKSB7CisJCQkvKiBjdnNfdm9jX3BrdFswXSBjb250YWlucyB0eCB0aW1lc3RhbXAgKi8KKwkJCWNvbW1vbi5tdnNfaW5mby51bF9jYigodWludDhfdCAqKSZjdnNfdm9jX3BrdFszXSwKKwkJCQkJICAgICAgY3ZzX3ZvY19wa3RbMl0sCisJCQkJCSAgICAgIGN2c192b2NfcGt0WzBdLAorCQkJCQkgICAgICBjb21tb24ubXZzX2luZm8ucHJpdmF0ZV9kYXRhKTsKKwkJfSBlbHNlCisJCQlwcl9lcnIoIiVzOiBjdnNfdm9jX3BrdCBvciB1bF9jYiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsCisJCQkodWludDMyX3QgKikgJnNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyIHNlbmQgRU5DX0JVRl9DT05TVU1FRF9OT1RJRlkgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSVNUUkVBTV9FVlRfU0VORF9FTkNfQlVGRkVSKSB7CisJCXByX2RlYnVnKCJSZWNkIFZTU19JU1RSRUFNX0VWVF9TRU5EX0VOQ19CVUZGRVJcbiIpOworCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09CisJCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfREVDX0JVRkZFUl9SRVFVRVNUKSB7CisJCWludCByZXQgPSAwOworCQl1MTYgY3ZzX2hhbmRsZTsKKwkJdWludDMyX3QgKmN2c192b2NfcGt0OworCQlzdHJ1Y3QgY3ZzX2RlY19idWZmZXJfcmVhZHlfY21kIHNlbmRfZGVjX2J1ZjsKKwkJdm9pZCAqYXByX2N2czsKKworCQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7CisKKwkJaWYgKCFhcHJfY3ZzKSB7CisJCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKKworCQlzZW5kX2RlY19idWYuaGRyLmhkcl9maWVsZCA9CisJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCUFQUl9QS1RfVkVSKTsKKworCQlzZW5kX2RlY19idWYuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQkJc2l6ZW9mKHNlbmRfZGVjX2J1ZikgLSBBUFJfSERSX1NJWkUpOworCisJCXNlbmRfZGVjX2J1Zi5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJCXNlbmRfZGVjX2J1Zi5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKKwkJc2VuZF9kZWNfYnVmLmhkci50b2tlbiA9IDA7CisJCXNlbmRfZGVjX2J1Zi5oZHIub3Bjb2RlID0KKwkJCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfREVDX0JVRkZFUl9SRUFEWTsKKworCQljdnNfdm9jX3BrdCA9ICh1aW50MzJfdCAqKSh2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0uZGF0YSk7CisJCWlmIChjdnNfdm9jX3BrdCAhPSBOVUxMICYmIGNvbW1vbi5tdnNfaW5mby5kbF9jYiAhPSBOVUxMKSB7CisJCQkvKiBTZXQgdGltZXN0YW1wIHRvIDAgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwkJCWN2c192b2NfcGt0WzBdID0gMDsKKwkJCS8qIFNldCBtZWRpYV90eXBlIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJCQljdnNfdm9jX3BrdFsxXSA9IGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlOworCQkJY29tbW9uLm12c19pbmZvLmRsX2NiKAorCQkJCQkgICAgICAodWludDhfdCAqKSZjdnNfdm9jX3BrdFsyXSwKKwkJCQkJICAgICAgY29tbW9uLm12c19pbmZvLnByaXZhdGVfZGF0YSk7CisJCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZzZW5kX2RlY19idWYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcl9lcnIoIiVzOiBFcnIgc2VuZCBERUNfQlVGX1JFQURZX05PVElGSSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZGVidWcoIiVzOiB2b2NfcGt0IG9yIGRsX2NiIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU1RSRUFNX0VWVF9SRVFVRVNUX0RFQ19CVUZGRVIpIHsKKwkJcHJfZGVidWcoIlJlY2QgVlNTX0lTVFJFQU1fRVZUX1JFUVVFU1RfREVDX0JVRkZFUlxuIik7CisJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUikgeworCQlwcl9kZWJ1ZygiU2VuZCBkZWMgYnVmIHJlc3BcbiIpOworCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9SU1BfQUNDRVBURUQpIHsKKwkJcHRyID0gZGF0YS0+cGF5bG9hZDsKKwkJaWYgKHB0clswXSkKKwkJCXByX2RlYnVnKCIlczogQVBSX1JTUF9BQ0NFUFRFRCBmb3IgMHgleDpcbiIsCisJCQkJIF9fZnVuY19fLCBwdHJbMF0pOworCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU1RSRUFNX0VWVF9OT1RfUkVBRFkpIHsKKwkJcHJfZGVidWcoIlJlY2QgVlNTX0lTVFJFQU1fRVZUX05PVF9SRUFEWVxuIik7CisJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lTVFJFQU1fRVZUX1JFQURZKSB7CisJCXByX2RlYnVnKCJSZWNkIFZTU19JU1RSRUFNX0VWVF9SRUFEWVxuIik7CisJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gIFZPSUNFX0VWVF9HRVRfUEFSQU1fQUNLKSB7CisJCXByX2RlYnVnKCIlczogVk9JQ0VfRVZUX0dFVF9QQVJBTV9BQ0tcbiIsIF9fZnVuY19fKTsKKwkJcHRyID0gZGF0YS0+cGF5bG9hZDsKKwkJaWYgKHB0clswXSAhPSAwKSB7CisJCQlwcl9lcnIoIiVzOiBWT0lDRV9FVlRfR0VUX1BBUkFNX0FDSyByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHB0clswXSk7CisJCX0KKwkJcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKFJUQUNfQ1ZTLCBkYXRhLT5wYXlsb2FkLAorCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOworCX0gIGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSVNUUkVBTV9FVlRfUlhfRFRNRl9ERVRFQ1RFRCkgeworCQlzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgKmR0bWZfcnhfZGV0ZWN0ZWQ7CisJCXVpbnQzMl90ICp2b2NfcGt0ID0gZGF0YS0+cGF5bG9hZDsKKwkJdWludDMyX3QgcGt0X2xlbiA9IGRhdGEtPnBheWxvYWRfc2l6ZTsKKworCQlpZiAoKHZvY19wa3QgIT0gTlVMTCkgJiYKKwkJICAgIChwa3RfbGVuID09CisJCQlzaXplb2Yoc3RydWN0IHZzc19pc3RyZWFtX2V2dF9yeF9kdG1mX2RldGVjdGVkKSkpIHsKKworCQkJZHRtZl9yeF9kZXRlY3RlZCA9CisJCQkoc3RydWN0IHZzc19pc3RyZWFtX2V2dF9yeF9kdG1mX2RldGVjdGVkICopIHZvY19wa3Q7CisJCQlwcl9kZWJ1ZygiUlhfRFRNRl9ERVRFQ1RFRCBsb3dfZnJlcT0lZCBoaWdoX2ZyZXE9JWRcbiIsCisJCQkJIGR0bWZfcnhfZGV0ZWN0ZWQtPmxvd19mcmVxLAorCQkJCSBkdG1mX3J4X2RldGVjdGVkLT5oaWdoX2ZyZXEpOworCQkJaWYgKGMtPmR0bWZfaW5mby5kdG1mX3J4X3VsX2NiKQorCQkJCWMtPmR0bWZfaW5mby5kdG1mX3J4X3VsX2NiKCh1aW50OF90ICopdm9jX3BrdCwKKwkJCQkJdm9jX2dldF9zZXNzaW9uX25hbWUodi0+c2Vzc2lvbl9pZCksCisJCQkJCWMtPmR0bWZfaW5mby5wcml2YXRlX2RhdGEpOworCQl9IGVsc2UgeworCQkJcHJfZXJyKCJJbnZhbGlkIHBhY2tldFxuIik7CisJCX0KKwl9ICBlbHNlCisJCXByX2RlYnVnKCJVbmtub3duIG9wY29kZSAweCV4XG4iLCBkYXRhLT5vcGNvZGUpOworCitmYWlsOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50MzJfdCBxZHNwX2N2cF9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQoreworCXVpbnQzMl90ICpwdHIgPSBOVUxMOworCXN0cnVjdCBjb21tb25fZGF0YSAqYyA9IE5VTEw7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOworCWludCBpID0gMDsKKworCWlmICgoZGF0YSA9PSBOVUxMKSB8fCAocHJpdiA9PSBOVUxMKSkgeworCQlwcl9lcnIoIiVzOiBkYXRhIG9yIHByaXYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljID0gcHJpdjsKKworCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7CisJCXByX2RlYnVnKCIlczogUmVzZXQgZXZlbnQgcmVjZWl2ZWQgaW4gVm9pY2Ugc2VydmljZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJYXByX3Jlc2V0KGMtPmFwcl9xNl9jdnApOworCQljLT5hcHJfcTZfY3ZwID0gTlVMTDsKKwkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoTUFYX1ZPSUNFX0NBTF9UWVBFUywKKwkJCQljb21tb24uY2FsX2RhdGEpOworCisJCS8qIFN1Yi1zeXN0ZW0gcmVzdGFydCBpcyBhcHBsaWNhYmxlIHRvIGFsbCBzZXNzaW9ucy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykKKwkJCWMtPnZvaWNlW2ldLmN2cF9oYW5kbGUgPSAwOworCisJCS8qCisJCSAqIEZyZWUgdGhlIElPTiBtZW1vcnkgYW5kIGNsZWFyIGhhbmRsZXMgZm9yCisJCSAqIFNvdXJjZSBUcmFja2luZworCQkgKi8KKwkJaWYgKGlzX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb21yeV9hbGxvY2F0ZWQoKSkgeworCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAorCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCwKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUpOworCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSA9IDA7CisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50ID0KKwkJCQkJCQkJCU5VTEw7CisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlID0KKwkJCQkJCQkJCU5VTEw7CisJCX0KKwkJdm9jX3NldF9lcnJvcl9zdGF0ZShkYXRhLT5yZXNldF9wcm9jKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdiA9IHZvaWNlX2dldF9zZXNzaW9uX2J5X2lkeChkYXRhLT5kZXN0X3BvcnQpOworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgeworCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplKSB7CisJCQlwdHIgPSBkYXRhLT5wYXlsb2FkOworCisJCQlwcl9kZWJ1ZygiJXggJXhcbiIsIHB0clswXSwgcHRyWzFdKTsKKwkJCWlmIChwdHJbMV0gIT0gMCkgeworCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4XG4iLAorCQkJCQlfX2Z1bmNfXywgcHRyWzBdLCBwdHJbMV0pOworCQkJfQorCQkJc3dpdGNoIChwdHJbMF0pIHsKKwkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjI6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfQ1JFQVRFX0ZVTExfQ09OVFJPTF9TRVNTSU9OX1YzOgorCQkJLypyZXNwb25zZSBmcm9tICBDVlAgKi8KKwkJCQlwcl9kZWJ1ZygiJXM6IGNtZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwdHJbMF0pOworCQkJCWlmICghcHRyWzFdKSB7CisJCQkJCXZvaWNlX3NldF9jdnBfaGFuZGxlKHYsIGRhdGEtPnNyY19wb3J0KTsKKwkJCQkJcHJfZGVidWcoInN0YXR1czogJWQsIGN2cGhkbD0lZFxuIiwKKwkJCQkJCSBwdHJbMV0sIGRhdGEtPnNyY19wb3J0KTsKKwkJCQl9IGVsc2UKKwkJCQkJcHJfZXJyKCJnb3QgTkFDSyBmcm9tIENWUCBjcmVhdGUgc2Vzc2lvbiByZXNwb25zZVxuIik7CisJCQkJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKKwkJCQl3YWtlX3VwKCZ2LT5jdnBfd2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfU0VUX0RFVklDRV9WMjoKKwkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9TRVRfREVWSUNFX1YzOgorCQkJY2FzZSBWU1NfSVZPTFVNRV9DTURfU0VUX1NURVA6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfRU5BQkxFOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RJU0FCTEU6CisJCQljYXNlIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX1ZPTF9DQUxJQlJBVElPTl9EQVRBOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEE6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQV9WMjoKKwkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEE6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfRFlOQU1JQ19DQUxJQlJBVElPTl9EQVRBOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfRFlOQU1JQ19DQUxJQlJBVElPTl9EQVRBOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX1NUQVRJQ19DQUxJQlJBVElPTl9EQVRBOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfREVWSUNFX0NPTkZJRzoKKwkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0RFVklDRV9DT05GSUc6CisJCQljYXNlIFZTU19JQ09NTU9OX0NNRF9NQVBfTUVNT1JZOgorCQkJY2FzZSBWU1NfSUNPTU1PTl9DTURfVU5NQVBfTUVNT1JZOgorCQkJY2FzZSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMjoKKwkJCWNhc2UgVlNTX0lWUENNX0NNRF9TVEFSVF9WMjoKKwkJCWNhc2UgVlNTX0lWUENNX0NNRF9TVE9QOgorCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX1NFVF9ERVZfQ0hBTk5FTFM6CisJCQljYXNlIFZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfQ09NTUlUOgorCQkJCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07CisJCQkJd2FrZV91cCgmdi0+Y3ZwX3dhaXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1NfSVZQQ01fRVZUX1BVU0hfQlVGRkVSX1YyOgorCQkJCWJyZWFrOworCQkJY2FzZSBWT0lDRV9DTURfU0VUX1BBUkFNOgorCQkJCXByX2RlYnVnKCIlczogVk9JQ0VfQ01EX1NFVF9QQVJBTVxuIiwgX19mdW5jX18pOworCQkJCXJ0YWNfbWFrZV92b2ljZV9jYWxsYmFjayhSVEFDX0NWUCwgcHRyLAorCQkJCQkJCWRhdGEtPnBheWxvYWRfc2l6ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZPSUNFX0NNRF9HRVRfUEFSQU06CisJCQkJcHJfZGVidWcoIiVzOiBWT0lDRV9DTURfR0VUX1BBUkFNXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJLyogU2hvdWxkIG9ubHkgY29tZSBoZXJlIGlmIHRoZXJlIGlzIGFuIEFQUiAqLworCQkJCS8qIGVycm9yIG9yIG1hbGZvcm1lZCBBUFIgcGFja2V0LiBPdGhlcndpc2UgKi8KKwkJCQkvKiByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIGFzICovCisJCQkJLyogVk9JQ0VfRVZUX0dFVF9QQVJBTV9BQ0sgKi8KKwkJCQlpZiAocHRyWzFdICE9IDApIHsKKwkJCQkJcHJfZXJyKCIlczogQ1ZQIGdldCBwYXJhbSBlcnJvciA9ICVkLCByZXN1bWluZ1xuIiwKKwkJCQkJCV9fZnVuY19fLCBwdHJbMV0pOworCQkJCQlydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2soUlRBQ19DVlAsCisJCQkJCQlkYXRhLT5wYXlsb2FkLAorCQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFZTU19JU09VTkRGT0NVU19DTURfU0VUX1NFQ1RPUlM6CisJCQkJaWYgKCFwdHJbMV0pCisJCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPQorCQkJCQkJCQkJdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPQorCQkJCQkJCQkJZmFsc2U7CisJCQkJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOworCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKKwkJCQl3YWtlX3VwKCZ2LT5jdnBfd2FpdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTU19JU09VTkRGT0NVU19DTURfR0VUX1NFQ1RPUlM6CisJCQkJLyoKKwkJCQkgKiBTaG91bGQgb25seSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKwkJCQkgKiByZXNwb25zZSByZWNlaXZlZCBmcm9tIEFEU1AuIE90aGVyd2lzZQorCQkJCSAqIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMKKwkJCQkgKiBWU1NfSVNPVU5ERk9DVVNfUlNQX0dFVF9TRUNUT1JTCisJCQkJICovCisJCQkJcHJfZXJyKCIlczogVlNTX0lTT1VOREZPQ1VTX0NNRF9HRVRfU0VDVE9SUyBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPSBmYWxzZTsKKwkJCQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOworCQkJCXdha2VfdXAoJnYtPmN2cF93YWl0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNTX0lTT1VSQ0VUUkFDS19DTURfR0VUX0FDVElWSVRZOgorCQkJCWlmICghcHRyWzFdKSB7CisJCQkJCS8qIFJlYWQgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkgKi8KKwkJCQkJbWVtY3B5KCZjb21tb24uc291cmNlVHJhY2tpbmdSZXNwb25zZSwKKwkJCQkJICAgICAgIGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLgorCQkJCQkJCXNoX21lbV9ibG9jay5kYXRhLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkgdnNzX2lzb3VyY2V0cmFja19hY3Rpdml0eV9kYXRhX3QpKTsKKwkJCQkJY29tbW9uLmlzX3NvdXJjZV90cmFja2luZ19yZXNwX3N1Y2Nlc3MgPQorCQkJCQkJCQkJdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQljb21tb24uaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzcyA9CisJCQkJCQkJCQlmYWxzZTsKKwkJCQkJcHJfZXJyKCIlczogRXJyb3IgcmVjZWl2ZWQgZm9yIHNvdXJjZSB0cmFja2luZyBwYXJhbXNcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJfQorCQkJCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07CisJCQkJd2FrZV91cCgmdi0+Y3ZwX3dhaXQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcl9kZWJ1ZygiJXM6IG5vdCBtYXRjaCBjbWQgPSAweCV4XG4iLAorCQkJCQkgIF9fZnVuY19fLCBwdHJbMF0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gIFZPSUNFX0VWVF9HRVRfUEFSQU1fQUNLKSB7CisJCXByX2RlYnVnKCIlczogVk9JQ0VfRVZUX0dFVF9QQVJBTV9BQ0tcbiIsIF9fZnVuY19fKTsKKwkJcHRyID0gZGF0YS0+cGF5bG9hZDsKKwkJaWYgKHB0clswXSAhPSAwKSB7CisJCQlwcl9lcnIoIiVzOiBWT0lDRV9FVlRfR0VUX1BBUkFNX0FDSyByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sIHB0clswXSk7CisJCX0KKwkJcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKFJUQUNfQ1ZQLCBkYXRhLT5wYXlsb2FkLAorCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKKwl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSVZQQ01fRVZUX05PVElGWV9WMikgeworCQlpZiAoKGRhdGEtPnBheWxvYWQgIT0gTlVMTCkgJiYgZGF0YS0+cGF5bG9hZF9zaXplID09CisJCSAgICBzaXplb2Yoc3RydWN0IHZzc19pdnBjbV9ldnRfbm90aWZ5X3YyX3QpICYmCisJCSAgICBjb21tb24uaG9zdHBjbV9pbmZvLmhvc3RwY21fZXZ0X2NiICE9IE5VTEwpIHsKKwkJCWNvbW1vbi5ob3N0cGNtX2luZm8uaG9zdHBjbV9ldnRfY2IoZGF0YS0+cGF5bG9hZCwKKwkJCQkJdm9jX2dldF9zZXNzaW9uX25hbWUodi0+c2Vzc2lvbl9pZCksCisJCQkJCWNvbW1vbi5ob3N0cGNtX2luZm8ucHJpdmF0ZV9kYXRhKTsKKwkJfQorCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU09VTkRGT0NVU19SU1BfR0VUX1NFQ1RPUlMpIHsKKwkJaWYgKGRhdGEtPnBheWxvYWQgJiYgKGRhdGEtPnBheWxvYWRfc2l6ZSA9PQorCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaXNvdW5kZm9jdXNfcnNwX2dldF9zZWN0b3JzX3QpKSkgeworCQkJY29tbW9uLmlzX3NvdW5kX2ZvY3VzX3Jlc3Bfc3VjY2VzcyA9IHRydWU7CisJCQltZW1jcHkoJmNvbW1vbi5zb3VuZEZvY3VzUmVzcG9uc2UsCisJCQkgICAgICAgKHN0cnVjdCB2c3NfaXNvdW5kZm9jdXNfcnNwX2dldF9zZWN0b3JzX3QgKikKKwkJCSAgICAgICBkYXRhLT5wYXlsb2FkLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QKKwkJCQkJIHZzc19pc291bmRmb2N1c19yc3BfZ2V0X3NlY3RvcnNfdCkpOworCQl9IGVsc2UgeworCQkJY29tbW9uLmlzX3NvdW5kX2ZvY3VzX3Jlc3Bfc3VjY2VzcyA9IGZhbHNlOworCQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIHBheWxvYWQgcmVjZWl2ZWQgZnJvbSBDVkRcbiIsCisJCQkJIF9fZnVuY19fKTsKKwkJfQorCQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7CisJCXdha2VfdXAoJnYtPmN2cF93YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfZnJlZV9vb2Jfc2hhcmVkX21lbSh2b2lkKQoreworCWludCByYyA9IDA7CisJaW50IGNudCA9IDA7CisJaW50IGJ1ZmNudCA9IE5VTV9PRl9CVUZGRVJTOworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oCisJCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQpOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9mcmVlKHYtPnNobWVtX2luZm8uc2hfYnVmLmNsaWVudCwKKwkJCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5oYW5kbGUpOworCXYtPnNobWVtX2luZm8uc2hfYnVmLmNsaWVudCA9IE5VTEw7CisJdi0+c2htZW1faW5mby5zaF9idWYuaGFuZGxlID0gTlVMTDsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yOiVkIGZyZWVpbmcgbWVtb3J5XG4iLCBfX2Z1bmNfXywgcmMpOworCisJCWdvdG8gZG9uZTsKKwl9CisKKworCXdoaWxlIChjbnQgPCBidWZjbnQpIHsKKwkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmW2NudF0uZGF0YSA9ICBOVUxMOworCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbY250XS5waHlzID0gIDA7CisJCWNudCsrOworCX0KKworCXYtPnNobWVtX2luZm8uc2hfYnVmLmNsaWVudCA9IE5VTEw7CisJdi0+c2htZW1faW5mby5zaF9idWYuaGFuZGxlID0gTlVMTDsKKworZG9uZToKKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZvaWNlX2FsbG9jX29vYl9zaGFyZWRfbWVtKHZvaWQpCit7CisJaW50IGNudCA9IDA7CisJaW50IHJjID0gMDsKKwlzaXplX3QgbGVuOworCXZvaWQgKm1lbV9hZGRyOworCWRtYV9hZGRyX3QgcGh5czsKKwlpbnQgYnVmc3ogPSBCVUZGRVJfQkxPQ0tfU0laRTsKKwlpbnQgYnVmY250ID0gTlVNX09GX0JVRkZFUlM7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbigKKwkJCQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCk7CisKKwltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ2b2lwX2NsaWVudCIsICYodi0+c2htZW1faW5mby5zaF9idWYuY2xpZW50KSwKKwkJCSYodi0+c2htZW1faW5mby5zaF9idWYuaGFuZGxlKSwKKwkJCWJ1ZnN6KmJ1ZmNudCwKKwkJCSZwaHlzLCAmbGVuLAorCQkJJm1lbV9hZGRyKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoY250IDwgYnVmY250KSB7CisJCXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZltjbnRdLmRhdGEgPSAgbWVtX2FkZHIgICsgKGNudCAqIGJ1ZnN6KTsKKwkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmW2NudF0ucGh5cyA9ICBwaHlzICsgKGNudCAqIGJ1ZnN6KTsKKwkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmW2NudF0uc2l6ZSA9IGJ1ZnN6OworCQljbnQrKzsKKwl9CisKKwlwcl9kZWJ1ZygiJXMgYnVmWzBdLmRhdGE6WyVwS10sIGJ1ZlswXS5waHlzOlslcEtdLCAmYnVmWzBdLnBoeXM6WyVwS10sXG4iLAorCQkgX19mdW5jX18sCisJCSh2b2lkICopdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLmRhdGEsCisJCSZ2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0ucGh5cywKKwkJKHZvaWQgKikmdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLnBoeXMpOworCXByX2RlYnVnKCIlczogYnVmWzFdLmRhdGE6WyVwS10sIGJ1ZlsxXS5waHlzWyVwS10sICZidWZbMV0ucGh5c1slcEtdXG4iLAorCQlfX2Z1bmNfXywKKwkJKHZvaWQgKil2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMV0uZGF0YSwKKwkJJnYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlsxXS5waHlzLAorCQkodm9pZCAqKSZ2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMV0ucGh5cyk7CisKKwltZW1zZXQoKHZvaWQgKil2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0uZGF0YSwgMCwgKGJ1ZnN6ICogYnVmY250KSk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2b2ljZV9hbGxvY19vb2JfbWVtX3RhYmxlKHZvaWQpCit7CisJaW50IHJjID0gMDsKKwlzaXplX3QgbGVuOworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oCisJCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQpOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygidm9pcF9jbGllbnQiLCAmKHYtPnNobWVtX2luZm8ubWVtdGJsLmNsaWVudCksCisJCQkJJih2LT5zaG1lbV9pbmZvLm1lbXRibC5oYW5kbGUpLAorCQkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCksCisJCQkJJnYtPnNobWVtX2luZm8ubWVtdGJsLnBoeXMsCisJCQkJJmxlbiwKKwkJCQkmKHYtPnNobWVtX2luZm8ubWVtdGJsLmRhdGEpKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwl2LT5zaG1lbV9pbmZvLm1lbXRibC5zaXplID0gc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KTsKKwlwcl9kZWJ1ZygiJXMgZGF0YVslcEtdcGh5c1slcEtdWyVwS11cbiIsIF9fZnVuY19fLAorCQkgKHZvaWQgKil2LT5zaG1lbV9pbmZvLm1lbXRibC5kYXRhLAorCQkgJnYtPnNobWVtX2luZm8ubWVtdGJsLnBoeXMsCisJCSAodm9pZCAqKSZ2LT5zaG1lbV9pbmZvLm1lbXRibC5waHlzKTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgdm9jX3NlbmRfY3ZwX3N0YXJ0X3ZvY3BjbSh1aW50MzJfdCBzZXNzaW9uX2lkLAorCQkJICAgICAgc3RydWN0IHZzc19pdnBjbV90YXBfcG9pbnQgKnZwY21fdHAsCisJCQkgICAgICB1aW50MzJfdCBub19vZl90cCkKK3sKKwlzdHJ1Y3QgY3ZwX3N0YXJ0X2NtZCBjdnBfc3RhcnRfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnA7CisJdTE2IGN2cF9oYW5kbGU7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKwlpbnQgaSA9IDA7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKworCWlmICghYXByX2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisKKwkvKiBGaWxsIHRoZSBoZWFkZXIgKi8KKwljdnBfc3RhcnRfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJY3ZwX3N0YXJ0X2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQlzaXplb2Yoc3RydWN0IHZzc19pdnBjbV90YXBfcG9pbnQpICogbm9fb2ZfdHApICsKKwkJc2l6ZW9mKGN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQubnVtX3RhcF9wb2ludHMpICsKKwkJc2l6ZW9mKGN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQubWVtX2hhbmRsZSk7CisJY3ZwX3N0YXJ0X2NtZC5oZHIuc3JjX3BvcnQgPSB2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2cF9zdGFydF9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7CisJY3ZwX3N0YXJ0X2NtZC5oZHIudG9rZW4gPSAwOworCWN2cF9zdGFydF9jbWQuaGRyLm9wY29kZSA9IFZTU19JVlBDTV9DTURfU1RBUlRfVjI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbm9fb2ZfdHA7IGkrKykgeworCQljdnBfc3RhcnRfY21kLnZwY21fc3RhcnRfY21kLnRhcF9wb2ludHNbaV0udGFwX3BvaW50ID0KKwkJCQkJCQl2cGNtX3RwW2ldLnRhcF9wb2ludDsKKwkJY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC50YXBfcG9pbnRzW2ldLmRpcmVjdGlvbiA9CisJCQkJCQkJdnBjbV90cFtpXS5kaXJlY3Rpb247CisJCWN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQudGFwX3BvaW50c1tpXS5zYW1wbGluZ19yYXRlID0KKwkJCQkJCSAgICB2cGNtX3RwW2ldLnNhbXBsaW5nX3JhdGU7CisJCWN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQudGFwX3BvaW50c1tpXS5kdXJhdGlvbiA9IDA7CisJfQorCisJY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC5tZW1faGFuZGxlID0KKwkJCQljb21tb24udm9pY2VfaG9zdF9wY21fbWVtX2hhbmRsZTsKKwljdnBfc3RhcnRfY21kLnZwY21fc3RhcnRfY21kLm51bV90YXBfcG9pbnRzID0gbm9fb2ZfdHA7CisKKwl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7CisJdi0+YXN5bmNfZXJyID0gMDsKKwlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc3RhcnRfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBGYWlsOiBzZW5kaW5nIHZvY3BjbSBtYXAgbWVtb3J5LFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCSh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2LT5hc3luY19lcnIgPiAwKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCisJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAorCQkJCXYtPmFzeW5jX2VycikpOworCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCXYtPmFzeW5jX2Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworaW50IHZvY19zZW5kX2N2cF9zdG9wX3ZvY3BjbSh1aW50MzJfdCBzZXNzaW9uX2lkKQoreworCXN0cnVjdCBjdnBfY29tbWFuZCB2cGNtX3N0b3BfY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnA7CisJdTE2IGN2cF9oYW5kbGU7CisJc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOworCisJaWYgKCFhcHJfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKworCS8qIGZpbGwgaW4gdGhlIGhlYWRlciAqLworCXZwY21fc3RvcF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwl2cGNtX3N0b3BfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCQkgc2l6ZW9mKHZwY21fc3RvcF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwl2cGNtX3N0b3BfY21kLmhkci5zcmNfcG9ydCA9IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJdnBjbV9zdG9wX2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKKwl2cGNtX3N0b3BfY21kLmhkci50b2tlbiA9IDA7CisJdnBjbV9zdG9wX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lWUENNX0NNRF9TVE9QOworCisJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOworCXYtPmFzeW5jX2VyciA9IDA7CisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmdnBjbV9zdG9wX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGYWlsOiBzZW5kaW5nIHZvY3BjbSBzdG9wLFxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2VuZF9jdnBfbWFwX3ZvY3BjbV9tZW1vcnkodWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCQkgICBzdHJ1Y3QgbWVtX21hcF90YWJsZSAqdHBfbWVtX3RhYmxlLAorCQkJCSAgIHBoeXNfYWRkcl90IHBhZGRyLCB1aW50MzJfdCBidWZzaXplKQoreworCXJldHVybiAgdm9pY2VfbWFwX21lbW9yeV9waHlzaWNhbF9jbWQodm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCksCisJCQkJCSAgICAgIHRwX21lbV90YWJsZSwKKwkJCQkJICAgICAgKGRtYV9hZGRyX3QpIHBhZGRyLCBidWZzaXplLAorCQkJCQkgICAgICBWT0NfVk9JQ0VfSE9TVF9QQ01fTUFQX1RPS0VOKTsKK30KKworaW50IHZvY19zZW5kX2N2cF91bm1hcF92b2NwY21fbWVtb3J5KHVpbnQzMl90IHNlc3Npb25faWQpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSAgdm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCgKKwkJCQl2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKSwKKwkJCQljb21tb24udm9pY2VfaG9zdF9wY21fbWVtX2hhbmRsZSk7CisKKwlpZiAocmV0ID09IDApCisJCWNvbW1vbi52b2ljZV9ob3N0X3BjbV9tZW1faGFuZGxlID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2VuZF9jdnBfdm9jcGNtX3B1c2hfYnVmX2V2dCh1aW50MzJfdCBzZXNzaW9uX2lkLAorCQkJc3RydWN0IHZzc19pdnBjbV9ldnRfcHVzaF9idWZmZXJfdjJfdCAqcHVzaF9idWZmX2V2dCkKK3sKKwlzdHJ1Y3QgY3ZwX3B1c2hfYnVmX2NtZCB2cGNtX3B1c2hfYnVmX2NtZDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZwOworCXUxNiBjdnBfaGFuZGxlOworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKKworCWlmICghYXByX2N2cCkgeworCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltZW1zZXQoJnZwY21fcHVzaF9idWZfY21kLCAwLCBzaXplb2YodnBjbV9wdXNoX2J1Zl9jbWQpKTsKKwljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7CisKKwkvKiBmaWxsIGluIHRoZSBoZWFkZXIgKi8KKwl2cGNtX3B1c2hfYnVmX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7CisJdnBjbV9wdXNoX2J1Zl9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKKwkJCQlzaXplb2YodnBjbV9wdXNoX2J1Zl9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKKwl2cGNtX3B1c2hfYnVmX2NtZC5oZHIuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJdnBjbV9wdXNoX2J1Zl9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7CisJdnBjbV9wdXNoX2J1Zl9jbWQuaGRyLnRva2VuID0gMDsKKwl2cGNtX3B1c2hfYnVmX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lWUENNX0VWVF9QVVNIX0JVRkZFUl9WMjsKKworCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLnRhcF9wb2ludCA9CisJCQkJCXB1c2hfYnVmZl9ldnQtPnRhcF9wb2ludDsKKwl2cGNtX3B1c2hfYnVmX2NtZC52cGNtX2V2dF9wdXNoX2J1ZmZlci5wdXNoX2J1Zl9tYXNrID0KKwkJCQkJcHVzaF9idWZmX2V2dC0+cHVzaF9idWZfbWFzazsKKwl2cGNtX3B1c2hfYnVmX2NtZC52cGNtX2V2dF9wdXNoX2J1ZmZlci5vdXRfYnVmX21lbV9hZGRyZXNzID0KKwkJCQkJcHVzaF9idWZmX2V2dC0+b3V0X2J1Zl9tZW1fYWRkcmVzczsKKwl2cGNtX3B1c2hfYnVmX2NtZC52cGNtX2V2dF9wdXNoX2J1ZmZlci5pbl9idWZfbWVtX2FkZHJlc3MgPQorCQkJCQlwdXNoX2J1ZmZfZXZ0LT5pbl9idWZfbWVtX2FkZHJlc3M7CisJdnBjbV9wdXNoX2J1Zl9jbWQudnBjbV9ldnRfcHVzaF9idWZmZXIub3V0X2J1Zl9tZW1fc2l6ZSA9CisJCQkJCXB1c2hfYnVmZl9ldnQtPm91dF9idWZfbWVtX3NpemU7CisJdnBjbV9wdXNoX2J1Zl9jbWQudnBjbV9ldnRfcHVzaF9idWZmZXIuaW5fYnVmX21lbV9zaXplID0KKwkJCQkJcHVzaF9idWZmX2V2dC0+aW5fYnVmX21lbV9zaXplOworCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLnNhbXBsaW5nX3JhdGUgPQorCQkJCQlwdXNoX2J1ZmZfZXZ0LT5zYW1wbGluZ19yYXRlOworCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLm51bV9pbl9jaGFubmVscyA9CisJCQkJCXB1c2hfYnVmZl9ldnQtPm51bV9pbl9jaGFubmVsczsKKworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJnZwY21fcHVzaF9idWZfY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZhaWw6IHNlbmRpbmcgdm9jcGNtIG1hcCBtZW1vcnksXG4iKTsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHZvY19yZWdpc3Rlcl9ocGNtX2V2dF9jYihob3N0cGNtX2NiX2ZuIGhvc3RwY21fY2IsCisJCQkgICAgICB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJY29tbW9uLmhvc3RwY21faW5mby5ob3N0cGNtX2V2dF9jYiA9IGhvc3RwY21fY2I7CisJY29tbW9uLmhvc3RwY21faW5mby5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Cit9CisKK3ZvaWQgdm9jX2RlcmVnaXN0ZXJfaHBjbV9ldnRfY2Iodm9pZCkKK3sKKwljb21tb24uaG9zdHBjbV9pbmZvLmhvc3RwY21fZXZ0X2NiID0gTlVMTDsKKwljb21tb24uaG9zdHBjbV9pbmZvLnByaXZhdGVfZGF0YSA9IE5VTEw7Cit9CisKK2ludCB2b2NfZ2V0X2N2ZF92ZXJzaW9uKGNoYXIgKmN2ZF92ZXJzaW9uKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oVk9JQ0VfU0VTU0lPTl9WU0lEKTsKKworCisJaWYgKHYgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBWT0lDRV9TRVNTSU9OX1ZTSUQpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaXNfY3ZkX3ZlcnNpb25fcXVlcmllZCgpKSB7CisJCXByX2RlYnVnKCIlczogUmV0dXJuaW5nIHRoZSBjYWNoZWQgdmFsdWUgJXNcbiIsCisJCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7CisKKwkJZ290byBkb25lOworCX0KKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIEFQUiAqLworCXJldCA9IHZvaWNlX2Fwcl9yZWdpc3RlcihWT0lDRV9TRVNTSU9OX1ZTSUQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGFwciByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJcmV0ID0gdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IHZvaWNlX3NlbmRfbXZtX2N2ZF92ZXJzaW9uX2NtZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IDA7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnYtPmxvY2spOworCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKworZG9uZToKKwlpZiAoY3ZkX3ZlcnNpb24pCisJCW1lbWNweShjdmRfdmVyc2lvbiwgY29tbW9uLmN2ZF92ZXJzaW9uLAorCQkgICAgICAgQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfYWxsb2NfY2FsX21lbV9tYXBfdGFibGUodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgbGVuOworCisJcmV0ID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygidm9jX2NhbCIsCisJCQkJJihjb21tb24uY2FsX21lbV9tYXBfdGFibGUuY2xpZW50KSwKKwkJCQkmKGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5oYW5kbGUpLAorCQkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCksCisJCQkJJmNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5waHlzLAorCQkJCSZsZW4sCisJCQkJJihjb21tb24uY2FsX21lbV9tYXBfdGFibGUuZGF0YSkpOworCWlmICgocmV0IDwgMCkgJiYgKHJldCAhPSAtRVBST0JFX0RFRkVSKSkgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBJT04gYWxsb2MgZmFpbGVkLCByYyA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljb21tb24uY2FsX21lbV9tYXBfdGFibGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCk7CisJcHJfZGVidWcoIiVzOiBkYXRhICVwSyBwaHlzICVwS1xuIiwgX19mdW5jX18sCisJCSBjb21tb24uY2FsX21lbV9tYXBfdGFibGUuZGF0YSwKKwkJICZjb21tb24uY2FsX21lbV9tYXBfdGFibGUucGh5cyk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9hbGxvY19ydGFjX21lbV9tYXBfdGFibGUodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgbGVuOworCisJcmV0ID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygidm9jX3J0YWNfY2FsIiwKKwkJCSYoY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5jbGllbnQpLAorCQkJJihjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmhhbmRsZSksCisJCQlzaXplb2Yoc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX3QpLAorCQkJJmNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUucGh5cywKKwkJCSZsZW4sCisJCQkmKGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuZGF0YSkpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQsIHJjID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCWNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCk7CisJcHJfZGVidWcoIiVzOiBkYXRhICVwSyBwaHlzICVwS1xuIiwgX19mdW5jX18sCisJCSBjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmRhdGEsCisJCSAmY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5waHlzKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX2FsbG9jX2FuZF9tYXBfb29iX21lbShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpc192b2lwX21lbW9yeV9hbGxvY2F0ZWQoKSkgeworCQlyZXQgPSB2b2NfYWxsb2Nfdm9pcF9zaGFyZWRfbWVtb3J5KCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHZvaXAgb29iIG1lbW9yeSAlZFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgcmV0KTsKKworCQkJZ290byBkb25lOworCQl9CisJfQorCisJcmV0ID0gdm9pY2VfbWFwX21lbW9yeV9waHlzaWNhbF9jbWQodiwKKwkJCSZ2LT5zaG1lbV9pbmZvLm1lbXRibCwKKwkJCXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlswXS5waHlzLAorCQkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLnNpemUgKiBOVU1fT0ZfQlVGRkVSUywKKwkJCVZPSVBfTUVNX01BUF9UT0tFTik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBtdm1fbWFwX21lbW9yeV9waHkgZmFpbGVkICVkXG4iLAorCQkJICAgX19mdW5jX18sIHJldCk7CisKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCit1aW50MzJfdCB2b2ljZV9nZXRfdG9wb2xvZ3kodWludDMyX3QgdG9wb2xvZ3lfaWR4KQoreworCXVpbnQzMl90IHRvcG9sb2d5ID0gVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX1JYX0RFRkFVTFQ7CisJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOworCisJLyogaW5pdGlhbGl6ZSBhcyBkZWZhdWx0IHRvcG9sb2d5ICovCisJaWYgKHRvcG9sb2d5X2lkeCA9PSBDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTCkgeworCQl0b3BvbG9neSA9IFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9SWF9ERUZBVUxUOworCX0gZWxzZSBpZiAodG9wb2xvZ3lfaWR4ID09IENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMKSB7CisJCXRvcG9sb2d5ID0gVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX1RYX1NNX0VDTlM7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogY2FsIGluZGV4ICV4IGlzIGludmFsaWQhXG4iLAorCQkJX19mdW5jX18sIHRvcG9sb2d5X2lkeCk7CisKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb21tb24uY2FsX2RhdGFbdG9wb2xvZ3lfaWR4XSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGNhbCB0eXBlIGlzIE5VTEwgZm9yIGNhbCBpbmRleCAleFxuIiwKKwkJCV9fZnVuY19fLCB0b3BvbG9neV9pZHgpOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZjb21tb24uY2FsX2RhdGFbdG9wb2xvZ3lfaWR4XS0+bG9jayk7CisJY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKKwkJY29tbW9uLmNhbF9kYXRhW3RvcG9sb2d5X2lkeF0pOworCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbF9ibG9jayBub3QgZm91bmQgZm9yIGNhbCBpbmRleCAleFxuIiwKKwkJCV9fZnVuY19fLCB0b3BvbG9neV9pZHgpOworCisJCWdvdG8gdW5sb2NrOworCX0KKworCXRvcG9sb2d5ID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX3RvcCAqKQorCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+dG9wb2xvZ3k7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbdG9wb2xvZ3lfaWR4XS0+bG9jayk7Citkb25lOgorCXByX2RlYnVnKCIlczogVXNpbmcgdG9wb2xvZ3kgJWRcbiIsIF9fZnVuY19fLCB0b3BvbG9neSk7CisKKwlyZXR1cm4gdG9wb2xvZ3k7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNhbF90eXBlKSB7CisJY2FzZSBDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlyZXQgPSBDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTF9UWVBFOgorCQlyZXQgPSBDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DUFJPQ19TVEFUSUNfQ0FMX1RZUEU6CisJCXJldCA9IENWUF9WT0NQUk9DX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DUFJPQ19EWU5BTUlDX0NBTF9UWVBFOgorCQlyZXQgPSBDVlBfVk9DVk9MX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEU6CisJCXJldCA9IENWU19WT0NTVFJNX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlBfVk9DREVWX0NGR19DQUxfVFlQRToKKwkJcmV0ID0gQ1ZQX1ZPQ0RFVl9DRkdfQ0FMOworCQlicmVhazsKKwljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DT0xfQ0FMX1RZUEU6CisJCXJldCA9IENWUF9WT0NQUk9DX0NPTF9DQUw7CisJCWJyZWFrOworCWNhc2UgQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DT0xfQ0FMX1RZUEU6CisJCXJldCA9IENWUF9WT0NWT0xfQ09MX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBDVlNfVk9DU1RSTV9TVEFUSUNfQ09MX0NBTF9UWVBFOgorCQlyZXQgPSBDVlNfVk9DU1RSTV9DT0xfQ0FMOworCQlicmVhazsKKwljYXNlIFZPSUNFX1JUQUNfSU5GT19DQUxfVFlQRToKKwkJcmV0ID0gVk9JQ0VfUlRBQ19JTkZPX0NBTDsKKwkJYnJlYWs7CisJY2FzZSBWT0lDRV9SVEFDX0FQUl9DQUxfVFlQRToKKwkJcmV0ID0gVk9JQ0VfUlRBQ19BUFJfQ0FMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9wcmVwYXJlX3ZvbHVtZV9ib29zdChpbnQzMl90IGNhbF90eXBlLAorCQkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCXJldHVybiB2b2NfZGVyZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSgpOworfQorCitzdGF0aWMgaW50IHZvaWNlX2VuYWJsZV92b2x1bWVfYm9vc3QoaW50MzJfdCBjYWxfdHlwZSwKKwkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQoreworCXJldHVybiB2b2NfcmVnaXN0ZXJfdm9jcHJvY192b2xfdGFibGUoKTsKK30KKworc3RhdGljIGludCB2b2ljZV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKKwkJCSAgIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNhbF9pbmRleDsKKwlpbnQgY2FsX3ZlcnNpb247CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWNhbF92ZXJzaW9uID0gY2FsX3V0aWxzX2dldF9jYWxfdHlwZV92ZXJzaW9uKGRhdGEpOworCWNvbW1vbi5pc19wZXJfdm9jb2Rlcl9jYWxfZW5hYmxlZCA9CisJCQkhIShjYWxfdmVyc2lvbiAmIFBFUl9WT0NPREVSX0NBTF9CSVRfTUFTSyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCisJCWNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBDYWxfdXRpbHNfYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm9pY2VfZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKKwkJCSAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfZGVhbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAorCQljb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogQ2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9zZXRfY2FsKGludDMyX3QgY2FsX3R5cGUsCisJCQkgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2FsX2luZGV4OworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOworCWlmIChjYWxfaW5kZXggPCAwKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKKwkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCisJCWNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBDYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKKwkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2b2ljZV9kZWxldGVfY2FsX2RhdGEodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWNhbF91dGlsc19kZXN0cm95X2NhbF90eXBlcyhNQVhfVk9JQ0VfQ0FMX1RZUEVTLCBjb21tb24uY2FsX2RhdGEpOworfQorCitzdGF0aWMgaW50IHZvaWNlX2luaXRfY2FsX2RhdGEodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FsX3R5cGVfaW5mbyBjYWxfdHlwZV9pbmZvW10gPSB7CisJCXt7Q1ZQX1ZPQ19SWF9UT1BPTE9HWV9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsIHZvaWNlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0NWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMX1RZUEUsCisJCXtOVUxMLCBOVUxMLCBOVUxMLCB2b2ljZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tDVlBfVk9DUFJPQ19TVEFUSUNfQ0FMX1RZUEUsCisJCXt2b2ljZV9hbGxvY19jYWwsIHZvaWNlX2RlYWxsb2NfY2FsLCBOVUxMLAorCQl2b2ljZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAorCQl7TlVMTCwgdm9pY2VfdW5tYXBfY2FsX21lbW9yeSwKKwkJY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCisKKwkJe3tDVlBfVk9DUFJPQ19EWU5BTUlDX0NBTF9UWVBFLAorCQl7dm9pY2VfYWxsb2NfY2FsLCB2b2ljZV9kZWFsbG9jX2NhbCwKKwkJdm9pY2VfcHJlcGFyZV92b2x1bWVfYm9vc3QsCisJCXZvaWNlX3NldF9jYWwsIE5VTEwsCisJCXZvaWNlX2VuYWJsZV92b2x1bWVfYm9vc3R9IH0sCisJCXtOVUxMLCB2b2ljZV91bm1hcF9jYWxfbWVtb3J5LAorCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0NWUF9WT0NERVZfQ0ZHX0NBTF9UWVBFLAorCQl7dm9pY2VfYWxsb2NfY2FsLCB2b2ljZV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIHZvaWNlX3VubWFwX2NhbF9tZW1vcnksCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7Q1ZQX1ZPQ1BST0NfU1RBVElDX0NPTF9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsIHZvaWNlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e0NWUF9WT0NQUk9DX0RZTkFNSUNfQ09MX0NBTF9UWVBFLAorCQl7TlVMTCwgTlVMTCwgTlVMTCwgdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7Q1ZTX1ZPQ1NUUk1fU1RBVElDX0NBTF9UWVBFLAorCQl7dm9pY2VfYWxsb2NfY2FsLCB2b2ljZV9kZWFsbG9jX2NhbCwgTlVMTCwKKwkJdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIHZvaWNlX3VubWFwX2NhbF9tZW1vcnksCisJCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCisJCXt7Q1ZTX1ZPQ1NUUk1fU1RBVElDX0NPTF9DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsIHZvaWNlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e1ZPSUNFX1JUQUNfSU5GT19DQUxfVFlQRSwKKwkJe05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IH0sCisJCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKKworCQl7e1ZPSUNFX1JUQUNfQVBSX0NBTF9UWVBFLAorCQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gfSwKKwkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAorCX07CisKKwlyZXQgPSBjYWxfdXRpbHNfY3JlYXRlX2NhbF90eXBlcyhNQVhfVk9JQ0VfQ0FMX1RZUEVTLCBjb21tb24uY2FsX2RhdGEsCisJCWNhbF90eXBlX2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBjcmVhdGUgY2FsIHR5cGUhXG4iLAorCQkJX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiByZXQ7CitlcnI6CisJdm9pY2VfZGVsZXRlX2NhbF9kYXRhKCk7CisJbWVtc2V0KCZjb21tb24sIDAsIHNpemVvZihzdHJ1Y3QgY29tbW9uX2RhdGEpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfc2V0X3NvdW5kX2ZvY3VzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKKwkJCQkgc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhKQoreworCXN0cnVjdCBjdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZF90IGN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnA7CisJdTE2IGN2cF9oYW5kbGU7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodiA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOworCisJaWYgKCFhcHJfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKworCS8qIHNlbmQgU291bmQgRm9jdXMgUGFyYW1zIHRvIGN2cCAqLworCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmhkci5oZHJfZmllbGQgPQorCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKKwljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJc2l6ZW9mKGN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyLnNyY19wb3J0ID0KKwkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOworCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmhkci5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOworCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmhkci50b2tlbiA9IDA7CisJY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyLm9wY29kZSA9CisJCQkJCSBWU1NfSVNPVU5ERk9DVVNfQ01EX1NFVF9TRUNUT1JTOworCisJbWVtc2V0KCYoY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbSksIDB4RkYsCisJCXNpemVvZihzdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX2NtZF9zZXRfc2VjdG9yc190KSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9TRUNUT1JTOyBpKyspIHsKKwkJY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbS4KKwkJCXN0YXJ0X2FuZ2xlc1tpXSA9IHNvdW5kRm9jdXNEYXRhLnN0YXJ0X2FuZ2xlW2ldOworCQljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5jdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtLgorCQkJZW5hYmxlc1tpXSA9IHNvdW5kRm9jdXNEYXRhLmVuYWJsZVtpXTsKKwkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKKwkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLnN0YXJ0X2FuZ2xlW2ldKTsKKwkJcHJfZGVidWcoIiVzOiBlbmFibGVbJWRdID0gJWRcbiIsCisJCQkgIF9fZnVuY19fLCBpLCBzb3VuZEZvY3VzRGF0YS5lbmFibGVbaV0pOworCX0KKwljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5jdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtLmdhaW5fc3RlcCA9CisJCQkJCXNvdW5kRm9jdXNEYXRhLmdhaW5fc3RlcDsKKwlwcl9kZWJ1ZygiJXM6IGdhaW5fc3RlcCA9ICVkXG4iLCBfX2Z1bmNfXywgc291bmRGb2N1c0RhdGEuZ2Fpbl9zdGVwKTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCisJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSZjdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCIlczogRXJyb3IgaW4gc2VuZGluZyBBUFIgY29tbWFuZFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAorCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmV0KSB7CisJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAodi0+YXN5bmNfZXJyID4gMCkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAorCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKKwkJCQl2LT5hc3luY19lcnIpKTsKKwkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQl2LT5hc3luY19lcnIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBzZXR0aW5nIHNvdW5kIGZvY3VzIHBhcmFtc1xuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJfQorCitkb25lOgorCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2b2Nfc2V0X3NvdW5kX2ZvY3VzKHN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YSkKK3sKKwlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyIGl0cjsKKworCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJdm9pY2VfaXRyX2luaXQoJml0ciwgQUxMX1NFU1NJT05fVlNJRCk7CisJd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgeworCQlpZiAodiAhPSBOVUxMKSB7CisJCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKwkJCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkgJiYKKwkJCQkodi0+bGNoX21vZGUgIT0gVk9JQ0VfTENIX1NUQVJUKSAmJgorCQkJCSF2LT5kaXNhYmxlX3RvcG9sb2d5KQorCQkJCXJldCA9IHZvaWNlX3NlbmRfc2V0X3NvdW5kX2ZvY3VzX2NtZCh2LAorCQkJCQkJCXNvdW5kRm9jdXNEYXRhKTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25cbiIsIF9fZnVuY19fKTsKKworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfZ2V0X3NvdW5kX2ZvY3VzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKKwkJCQlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gKnNvdW5kRm9jdXNEYXRhKQoreworCXN0cnVjdCBhcHJfaGRyIGN2cF9nZXRfc291bmRfZm9jdXNfcGFyYW1fY21kOworCWludCByZXQgPSAwOworCXZvaWQgKmFwcl9jdnA7CisJdTE2IGN2cF9oYW5kbGU7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXYpIHsKKwkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7CisKKwlpZiAoIWFwcl9jdnApIHsKKwkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKKworCS8qIHNlbmQgQVBSIGNvbW1hbmQgdG8gcmV0cmlldmUgU291bmQgRm9jdXMgUGFyYW1zICovCisJY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyX2ZpZWxkID0KKwkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAorCQkJCQkgICAgICBBUFJfUEtUX1ZFUik7CisJY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJc2l6ZW9mKGN2cF9nZXRfc291bmRfZm9jdXNfcGFyYW1fY21kKSAtIEFQUl9IRFJfU0laRSk7CisJY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuc3JjX3BvcnQgPQorCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKKwljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC50b2tlbiA9IDA7CisJY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQub3Bjb2RlID0gVlNTX0lTT1VOREZPQ1VTX0NNRF9HRVRfU0VDVE9SUzsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikmY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yIGluIHNlbmRpbmcgQVBSIGNvbW1hbmRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb21tb24uaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7CisJCQlzb3VuZEZvY3VzRGF0YS0+c3RhcnRfYW5nbGVbaV0gPQorCQkJCWNvbW1vbi5zb3VuZEZvY3VzUmVzcG9uc2Uuc3RhcnRfYW5nbGVzW2ldOworCQkJc291bmRGb2N1c0RhdGEtPmVuYWJsZVtpXSA9CisJCQkJY29tbW9uLnNvdW5kRm9jdXNSZXNwb25zZS5lbmFibGVzW2ldOworCQkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBpLCBzb3VuZEZvY3VzRGF0YS0+c3RhcnRfYW5nbGVbaV0pOworCQkJcHJfZGVidWcoIiVzOiBlbmFibGVbJWRdID0gJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgaSwgc291bmRGb2N1c0RhdGEtPmVuYWJsZVtpXSk7CisJCX0KKwkJc291bmRGb2N1c0RhdGEtPmdhaW5fc3RlcCA9IGNvbW1vbi5zb3VuZEZvY3VzUmVzcG9uc2UuZ2Fpbl9zdGVwOworCQlwcl9kZWJ1ZygiJXM6IGdhaW5fc3RlcCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgc291bmRGb2N1c0RhdGEtPmdhaW5fc3RlcCk7CisKKwkJY29tbW9uLmlzX3NvdW5kX2ZvY3VzX3Jlc3Bfc3VjY2VzcyA9IGZhbHNlOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IEludmFsaWQgcGF5bG9hZCByZWNlaXZlZCBmcm9tIENWRFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJfQorZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX2dldF9zb3VuZF9mb2N1cyhzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gKnNvdW5kRm9jdXNEYXRhKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOworCisJcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKwl2b2ljZV9pdHJfaW5pdCgmaXRyLCBBTExfU0VTU0lPTl9WU0lEKTsKKwl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7CisJCWlmICh2KSB7CisJCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKKwkJCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkgJiYKKwkJCQkodi0+bGNoX21vZGUgIT0gVk9JQ0VfTENIX1NUQVJUKSAmJgorCQkJCSF2LT5kaXNhYmxlX3RvcG9sb2d5KQorCQkJCXJldCA9IHZvaWNlX3NlbmRfZ2V0X3NvdW5kX2ZvY3VzX2NtZCh2LAorCQkJCQkJCXNvdW5kRm9jdXNEYXRhKTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25cbiIsIF9fZnVuY19fKTsKKworCQkJcmV0ID0gIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJcHJfZGVidWcoIiVzOiBFeGl0LCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc19zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9tcnlfYWxsb2NhdGVkKHZvaWQpCit7CisJYm9vbCByZXQ7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCAhPSBOVUxMICYmCisJICAgIGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgIT0gTlVMTCkKKwkJcmV0ID0gdHJ1ZTsKKwllbHNlCisJCXJldCA9IGZhbHNlOworCisJcHJfZGVidWcoIiVzOiBFeGl0XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX2FsbG9jX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJzb3VyY2VfdHJhY2tpbmdfc2hfbWVtX2Jsb2NrIiwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50KSwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlKSwKKwkJQlVGRkVSX0JMT0NLX1NJWkUsCisJCSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnBoeXMpLAorCQkoc2l6ZV90ICopJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suc2l6ZSksCisJCSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmRhdGEpKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBhdWRpbyBJT04gYWxsb2MgZmFpbGVkIGZvciBzaF9tZW0gYmxvY2ssIHJldCA9ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwltZW1zZXQoKHZvaWQgKikoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmRhdGEpLCAwLAorCQkgICBjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suc2l6ZSk7CisKKwlwcl9kZWJ1ZygiJXM6IHNoX21lbV9ibG9jazogcGh5czpbJXBLXSwgZGF0YTpbMHglcEtdLCBzaXplOlslemRdXG4iLAorCQkgX19mdW5jX18sCisJCSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnBoeXMpLAorCQkodm9pZCAqKShjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suZGF0YSksCisJCShzaXplX3QpKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5zaXplKSk7CisKKwlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJzb3VyY2VfdHJhY2tpbmdfc2hfbWVtX3RhYmxlIiwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuY2xpZW50KSwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuaGFuZGxlKSwKKwkJc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KSwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUucGh5cyksCisJCShzaXplX3QgKikmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5zaXplKSwKKwkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuZGF0YSkpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQgZm9yIHNoX21lbSB0YWJsZSwgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSBtc21fYXVkaW9faW9uX2ZyZWUoCisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50LAorCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSk7CisJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQgPSBOVUxMOworCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlID0gTlVMTDsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiBFcnJvcjolZCBmcmVlaW5nIG1lbW9yeVxuIiwgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwltZW1zZXQoKHZvaWQgKikoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX3RhYmxlLmRhdGEpLCAwLAorCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuc2l6ZSk7CisKKwlwcl9kZWJ1ZygiJXMgc2hfbWVtX3RhYmxlOiBwaHlzOlslcEtdLCBkYXRhOlsweCVwS10sIHNpemU6WyV6ZF0sXG4iLAorCQkgX19mdW5jX18sCisJCSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX3RhYmxlLnBoeXMpLAorCQkodm9pZCAqKShjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuZGF0YSksCisJCShzaXplX3QpKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5zaXplKSk7CisKK2RvbmU6CisJcHJfZGVidWcoIiVzOiBFeGl0LCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2b2ljZV9hbGxvY19hbmRfbWFwX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KAorCQkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKnYpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSB2b2ljZV9hbGxvY19zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9yeSgpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gdm9pY2VfbWFwX21lbW9yeV9waHlzaWNhbF9jbWQodiwKKwkJCSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX3RhYmxlKSwKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5waHlzLAorCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnNpemUsCisJCQlWT0NfU09VUkNFX1RSQUNLSU5HX01FTV9NQVBfVE9LRU4pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogbWVtb3J5IG1hcHBpbmcgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3VubWFwX2FuZF9mcmVlX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KAorCQkJCQkJCXN0cnVjdCB2b2ljZV9kYXRhICp2KQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLm1lbV9oYW5kbGUgIT0gMCkgeworCQlyZXQgPSB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKHYsCisJCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBNZW1vcnlfdW5tYXAgZmFpbGVkIGVyciAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHJldCk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQgPT0gTlVMTCkgfHwKKwkgICAgKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgPT0gTlVMTCkpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG1zbV9hdWRpb19pb25fZnJlZSgKKwkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQsCisJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBFcnJvcjolZCBmcmVlaW5nIG1lbW9yeVxuIiwgX19mdW5jX18sIHJldCk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlID0gMDsKKwljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50ID0gTlVMTDsKKwljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlID0gTlVMTDsKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZvaWNlX3NlbmRfZ2V0X3NvdXJjZV90cmFja2luZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCisJCQlzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpCit7CisJc3RydWN0IGN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtX2NtZF90IHN0X2NtZDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICphcHJfY3ZwOworCXUxNiBjdnBfaGFuZGxlOworCWludCBpOworCisJcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKCF2KSB7CisJCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOworCisJaWYgKCFhcHJfY3ZwKSB7CisJCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOworCisJaWYgKCFpc19zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9tcnlfYWxsb2NhdGVkKCkpIHsKKwkJcmV0ID0gdm9pY2VfYWxsb2NfYW5kX21hcF9zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9yeSh2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogRmFpbCBpbiBhbGxvY2F0aW5nL21hcHBpbmcgc2hhcmVkIG1lbW9yeVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisJc3RfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQkJCQkgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCisJCQkJCSAgICAgQVBSX1BLVF9WRVIpOworCXN0X2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQkJCQkgICBzaXplb2Yoc3RfY21kKSAtIEFQUl9IRFJfU0laRSk7CisJc3RfY21kLmhkci5zcmNfcG9ydCA9IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7CisJc3RfY21kLmhkci5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOworCXN0X2NtZC5oZHIudG9rZW4gPSAwOworCXN0X2NtZC5oZHIub3Bjb2RlID0gVlNTX0lTT1VSQ0VUUkFDS19DTURfR0VUX0FDVElWSVRZOworCisJc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9oYW5kbGUJPQorCQkJCSBjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlOworCXN0X2NtZC5jdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbS5tZW1fYWRkcmVzc19sc3cgPQorCQlsb3dlcl8zMl9iaXRzKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5waHlzKTsKKwlzdF9jbWQuY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW0ubWVtX2FkZHJlc3NfbXN3ID0KKwkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uCisJCQkJCXNoX21lbV9ibG9jay5waHlzKTsKKwlzdF9jbWQuY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW0ubWVtX3NpemUgPQorCQkodWludDMyX3QpY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnNpemU7CisJcHJfZGVidWcoIiVzOiBtZW1faGFuZGxlPTB4JXgsIG1lbV9hZGRyZXNzX2xzdz0weCV4LCBtc3c9MHgleCwgbWVtX3NpemU9JWRcbiIsCisJCSBfX2Z1bmNfXywKKwkJIHN0X2NtZC5jdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbS5tZW1faGFuZGxlLAorCQkgc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9hZGRyZXNzX2xzdywKKwkJIHN0X2NtZC5jdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbS5tZW1fYWRkcmVzc19tc3csCisJCSAodWludDMyX3Qpc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9zaXplKTsKKworCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKKwl2LT5hc3luY19lcnIgPSAwOworCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLAorCQkJICAgKHVpbnQzMl90ICopICZzdF9jbWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiJXM6IEVycm9yIGluIHNlbmRpbmcgQVBSIGNvbW1hbmRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKKwkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJldCkgeworCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKKwkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCisJCQkJdi0+YXN5bmNfZXJyKSk7CisJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJdi0+YXN5bmNfZXJyKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb21tb24uaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzcykgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFQ1RPUlM7IGkrKykgeworCQkJc291cmNlVHJhY2tpbmdEYXRhLT52YWRbaV0gPQorCQkJCWNvbW1vbi5zb3VyY2VUcmFja2luZ1Jlc3BvbnNlLnZvaWNlX2FjdGl2ZVtpXTsKKwkJCXByX2RlYnVnKCIlczogdmFkWyVkXSA9ICVkXG4iLAorCQkJCSAgX19mdW5jX18sIGksIHNvdXJjZVRyYWNraW5nRGF0YS0+dmFkW2ldKTsKKwkJfQorCQlzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9zcGVlY2ggPQorCQkJCWNvbW1vbi5zb3VyY2VUcmFja2luZ1Jlc3BvbnNlLnRhbGtlcl9kb2E7CisJCXByX2RlYnVnKCIlczogZG9hX3NwZWVjaCA9ICVkXG4iLAorCQkJICBfX2Z1bmNfXywgc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffc3BlZWNoKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05PSVNFX1NPVVJDRV9JTkRJQ0FUT1JTOyBpKyspIHsKKwkJCXNvdXJjZVRyYWNraW5nRGF0YS0+ZG9hX25vaXNlW2ldID0KKwkJCSBjb21tb24uc291cmNlVHJhY2tpbmdSZXNwb25zZS5pbnRlcmZlcmVyX2RvYVtpXTsKKwkJCXByX2RlYnVnKCIlczogZG9hX25vaXNlWyVkXSA9ICVkXG4iLAorCQkJIF9fZnVuY19fLCBpLCBzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9ub2lzZVtpXSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QT0xBUl9BQ1RJVklUWV9JTkRJQ0FUT1JTOyBpKyspIHsKKwkJCXNvdXJjZVRyYWNraW5nRGF0YS0+cG9sYXJfYWN0aXZpdHlbaV0gPQorCQkJIGNvbW1vbi5zb3VyY2VUcmFja2luZ1Jlc3BvbnNlLnNvdW5kX3N0cmVuZ3RoW2ldOworCQkJcHJfZGVidWcoIiVzOiBwb2xhcl9hY3Rpdml0eVslZF0gPSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgaSwgc291cmNlVHJhY2tpbmdEYXRhLT5wb2xhcl9hY3Rpdml0eVtpXSk7CisJCX0KKwkJY29tbW9uLmlzX3NvdXJjZV90cmFja2luZ19yZXNwX3N1Y2Nlc3MgPSBmYWxzZTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIiVzOiBFcnJvciByZXNwb25zZSByZWNlaXZlZCBmcm9tIENWRFxuIiwgX19mdW5jX18pOworCisJCXJldCA9IC1FSU5WQUw7CisJfQorZG9uZToKKwlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm9jX2dldF9zb3VyY2VfdHJhY2tpbmcoc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSAqc291cmNlVHJhY2tpbmdEYXRhKQoreworCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOworCisJcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKKworCXZvaWNlX2l0cl9pbml0KCZpdHIsIEFMTF9TRVNTSU9OX1ZTSUQpOworCXdoaWxlICh2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbigmaXRyLCAmdikpIHsKKwkJaWYgKHYgIT0gTlVMTCkgeworCQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7CisJCQlpZiAoaXNfdm9jX3N0YXRlX2FjdGl2ZSh2LT52b2Nfc3RhdGUpICYmCisJCQkJKHYtPmxjaF9tb2RlICE9IFZPSUNFX0xDSF9TVEFSVCkgJiYKKwkJCQkhdi0+ZGlzYWJsZV90b3BvbG9neSkKKwkJCQlyZXQgPSB2b2ljZV9zZW5kX2dldF9zb3VyY2VfdHJhY2tpbmdfY21kKHYsCisJCQkJCQkJc291cmNlVHJhY2tpbmdEYXRhKTsKKwkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25cbiIsIF9fZnVuY19fKTsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7CisJcHJfZGVidWcoIiVzOiBFeGl0LCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGlzX3ZvY19pbml0aWFsaXplZCh2b2lkKQoreworCXJldHVybiBtb2R1bGVfaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZvaWNlX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAwLCBpID0gMDsKKworCW1lbXNldCgmY29tbW9uLCAwLCBzaXplb2Yoc3RydWN0IGNvbW1vbl9kYXRhKSk7CisKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZSAqLworCWNvbW1vbi5kZWZhdWx0X211dGVfdmFsID0gMDsgIC8qIGRlZmF1bHQgaXMgdW4tbXV0ZSAqLworCWNvbW1vbi5kZWZhdWx0X3NhbXBsZV92YWwgPSA4MDAwOworCWNvbW1vbi5kZWZhdWx0X3ZvbF9zdGVwX3ZhbCA9IDA7CisJY29tbW9uLmRlZmF1bHRfdm9sX3JhbXBfZHVyYXRpb25fbXMgPSBERUZBVUxUX1ZPTFVNRV9SQU1QX0RVUkFUSU9OOworCWNvbW1vbi5kZWZhdWx0X211dGVfcmFtcF9kdXJhdGlvbl9tcyA9IERFRkFVTFRfTVVURV9SQU1QX0RVUkFUSU9OOworCWNvbW1vbi5lY19yZWZfZXh0ID0gZmFsc2U7CisJLyogSW5pdGlhbGl6ZSBNVlMgaW5mby4gKi8KKwljb21tb24ubXZzX2luZm8ubmV0d29ya190eXBlID0gVlNTX05FVFdPUktfSURfREVGQVVMVDsKKworCS8qIEluaXRpYWxpemUgaXMgbG93IG1lbW9yeSBmbGFnICovCisJY29tbW9uLmlzX2Rlc3Ryb3lfY3ZkID0gZmFsc2U7CisKKwkvKiBJbml0aWFsaXplIENWRCB2ZXJzaW9uICovCisJc3RybGNweShjb21tb24uY3ZkX3ZlcnNpb24sIENWRF9WRVJTSU9OX0RFRkFVTFQsCisJCXNpemVvZihjb21tb24uY3ZkX3ZlcnNpb24pKTsKKwkvKiBJbml0aWFsaXplIFBlci1Wb2NvZGVyIENhbGlicmF0aW9uIGZsYWcgKi8KKwljb21tb24uaXNfcGVyX3ZvY29kZXJfY2FsX2VuYWJsZWQgPSBmYWxzZTsKKworCW11dGV4X2luaXQoJmNvbW1vbi5jb21tb25fbG9jayk7CisKKwkvKiBJbml0aWFsaXplIHNlc3Npb24gaWQgd2l0aCB2c2lkICovCisJaW5pdF9zZXNzaW9uX2lkKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZPQ19TRVNTSU9OUzsgaSsrKSB7CisKKwkJLyogaW5pdGlhbGl6ZSBkZXZfcnggYW5kIGRldl90eCAqLworCQljb21tb24udm9pY2VbaV0uZGV2X3J4LmRldl9tdXRlID0gIGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOworCQljb21tb24udm9pY2VbaV0uZGV2X3R4LmRldl9tdXRlID0gIGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOworCQljb21tb24udm9pY2VbaV0uZGV2X3J4LnZvbHVtZV9zdGVwX3ZhbHVlID0KKwkJCQkJY29tbW9uLmRlZmF1bHRfdm9sX3N0ZXBfdmFsOworCQljb21tb24udm9pY2VbaV0uZGV2X3J4LnZvbHVtZV9yYW1wX2R1cmF0aW9uX21zID0KKwkJCQkJY29tbW9uLmRlZmF1bHRfdm9sX3JhbXBfZHVyYXRpb25fbXM7CisJCWNvbW1vbi52b2ljZVtpXS5kZXZfcnguZGV2X211dGVfcmFtcF9kdXJhdGlvbl9tcyA9CisJCQkJCWNvbW1vbi5kZWZhdWx0X211dGVfcmFtcF9kdXJhdGlvbl9tczsKKwkJY29tbW9uLnZvaWNlW2ldLmRldl90eC5kZXZfbXV0ZV9yYW1wX2R1cmF0aW9uX21zID0KKwkJCQkJY29tbW9uLmRlZmF1bHRfbXV0ZV9yYW1wX2R1cmF0aW9uX21zOworCQljb21tb24udm9pY2VbaV0uc3RyZWFtX3J4LnN0cmVhbV9tdXRlID0gY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7CisJCWNvbW1vbi52b2ljZVtpXS5zdHJlYW1fdHguc3RyZWFtX211dGUgPSBjb21tb24uZGVmYXVsdF9tdXRlX3ZhbDsKKworCQljb21tb24udm9pY2VbaV0uZGV2X3R4LnBvcnRfaWQgPSAweDEwMEI7CisJCWNvbW1vbi52b2ljZVtpXS5kZXZfcngucG9ydF9pZCA9IDB4MTAwQTsKKwkJY29tbW9uLnZvaWNlW2ldLmRldl90eC5kZXZfaWQgPSAwOworCQljb21tb24udm9pY2VbaV0uZGV2X3J4LmRldl9pZCA9IDA7CisJCWNvbW1vbi52b2ljZVtpXS5kZXZfcngubm9fb2ZfY2hhbm5lbHMgPSAwOworCQljb21tb24udm9pY2VbaV0uZGV2X3R4Lm5vX29mX2NoYW5uZWxzID0gMDsKKwkJY29tbW9uLnZvaWNlW2ldLnNpZGV0b25lX2dhaW4gPSAweDUxMjsKKwkJY29tbW9uLnZvaWNlW2ldLmR0bWZfcnhfZGV0ZWN0X2VuID0gMDsKKwkJY29tbW9uLnZvaWNlW2ldLmxjaF9tb2RlID0gMDsKKwkJY29tbW9uLnZvaWNlW2ldLmRpc2FibGVfdG9wb2xvZ3kgPSBmYWxzZTsKKworCQljb21tb24udm9pY2VbaV0udm9jX3N0YXRlID0gVk9DX0lOSVQ7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY29tbW9uLnZvaWNlW2ldLm12bV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY29tbW9uLnZvaWNlW2ldLmN2c193YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY29tbW9uLnZvaWNlW2ldLmN2cF93YWl0KTsKKworCQltdXRleF9pbml0KCZjb21tb24udm9pY2VbaV0ubG9jayk7CisJfQorCisJaWYgKHZvaWNlX2luaXRfY2FsX2RhdGEoKSkKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGluaXQgY2FsIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocmMgPT0gMCkKKwkJbW9kdWxlX2luaXRpYWxpemVkID0gdHJ1ZTsKKworCXByX2RlYnVnKCIlczogcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitkZXZpY2VfaW5pdGNhbGwodm9pY2VfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2b2ljZV9leGl0KHZvaWQpCit7CisJdm9pY2VfZGVsZXRlX2NhbF9kYXRhKCk7CisJZnJlZV9jYWxfbWFwX3RhYmxlKCk7Cit9CisKK19fZXhpdGNhbGwodm9pY2VfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5oIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2dm9pY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU4NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2dm9pY2UuaApAQCAtMCwwICsxLDE3ODQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fUURTUDZWT0lDRV9IX18KKyNkZWZpbmUgX19RRFNQNlZPSUNFX0hfXworCisjaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3J0YWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8c291bmQvdm9pY2VfcGFyYW1zLmg+CisKKyNkZWZpbmUgTUFYX1ZPQ19QS1RfU0laRSA2NDIKKyNkZWZpbmUgU0VTU0lPTl9OQU1FX0xFTiAyMAorI2RlZmluZSBOVU1fT0ZfTUVNT1JZX0JMT0NLUyAxCisjZGVmaW5lIE5VTV9PRl9CVUZGRVJTIDIKKy8qCisgKiBCVUZGRVIgQkxPQ0sgU0laRSBiYXNlZCBvbgorICogdGhlIHN1cHBvcnRlZCBwYWdlIHNpemUKKyAqLworI2RlZmluZSBCVUZGRVJfQkxPQ0tfU0laRSAgICAgICA0MDk2CisKKyNkZWZpbmUgTUFYX0NPTF9JTkZPX1NJWkUJMzI0CisKKyNkZWZpbmUgVk9DX1JFQ19VUExJTksJCTB4MDAKKyNkZWZpbmUgVk9DX1JFQ19ET1dOTElOSwkweDAxCisjZGVmaW5lIFZPQ19SRUNfQk9USAkJMHgwMgorCisjZGVmaW5lIFZTU19JVkVSU0lPTl9DTURfR0VUICAgICAgICAgICAgICAgICAweDAwMDExMzc4CisjZGVmaW5lIFZTU19JVkVSU0lPTl9SU1BfR0VUICAgICAgICAgICAgICAgICAweDAwMDExMzc5CisjZGVmaW5lIENWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRSAgICAgICAgICAzMQorI2RlZmluZSBDVkRfVkVSU0lPTl9ERUZBVUxUICAgICAgICAgICAgICAgICAgIiIKKyNkZWZpbmUgQ1ZEX1ZFUlNJT05fMF8wICAgICAgICAgICAgICAgICAgICAgICIwLjAiCisjZGVmaW5lIENWRF9WRVJTSU9OXzJfMSAgICAgICAgICAgICAgICAgICAgICAiMi4xIgorI2RlZmluZSBDVkRfVkVSU0lPTl8yXzIgICAgICAgICAgICAgICAgICAgICAgIjIuMiIKKyNkZWZpbmUgQ1ZEX1ZFUlNJT05fMl8zICAgICAgICAgICAgICAgICAgICAgICIyLjMiCisKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX0RFRkFVTFQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzBfMCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMSAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX0xBU1QgICAgICAgICAgICAgICAgIENWRF9JTlRfVkVSU0lPTl8yXzMKKyNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX01BWCAgICAgICAgICAgICAgICAgIChDVkRfSU5UX1ZFUlNJT05fTEFTVCArIDEpCisKK3N0cnVjdCBjdmRfdmVyc2lvbl90YWJsZSB7CisJY2hhciBjdmRfdmVyW0NWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRV07CisJaW50IGN2ZF92ZXJfaW50OworfTsKKworaW50IHZvY19nZXRfY3ZkX3ZlcnNpb24oY2hhciAqY3ZkX3ZlcnNpb24pOworCisvKiBQYXlsb2FkIHN0cnVjdHVyZSBmb3IgdGhlIFZTU19JVkVSU0lPTl9SU1BfR0VUIGNvbW1hbmQgcmVzcG9uc2UgKi8KK3N0cnVjdCB2c3NfaXZlcnNpb25fcnNwX2dldF90IHsKKwljaGFyIHZlcnNpb25bQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFXTsKKwkvKiBOVUxMLXRlcm1pbmF0ZWQgdmVyc2lvbiBzdHJpbmcgKi8KK307CisKK2VudW0geworCUNWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMID0gMCwKKwlDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTCwKKwlDVlBfVk9DUFJPQ19DQUwsCisJQ1ZQX1ZPQ1ZPTF9DQUwsCisJQ1ZQX1ZPQ0RFVl9DRkdfQ0FMLAorCUNWUF9WT0NQUk9DX0NPTF9DQUwsCisJQ1ZQX1ZPQ1ZPTF9DT0xfQ0FMLAorCUNWU19WT0NTVFJNX0NBTCwKKwlDVlNfVk9DU1RSTV9DT0xfQ0FMLAorCVZPSUNFX1JUQUNfSU5GT19DQUwsCisJVk9JQ0VfUlRBQ19BUFJfQ0FMLAorCU1BWF9WT0lDRV9DQUxfVFlQRVMKK307CisKK3N0cnVjdCB2b2ljZV9oZWFkZXIgeworCXVpbnQzMl90IGlkOworCXVpbnQzMl90IGRhdGFfbGVuOworfTsKKworc3RydWN0IHZvaWNlX2luaXQgeworCXN0cnVjdCB2b2ljZV9oZWFkZXIgaGRyOworCXZvaWQgKmNiX2hhbmRsZTsKK307CisKKy8qIFN0cmVhbSBpbmZvcm1hdGlvbiBwYXlsb2FkIHN0cnVjdHVyZSAqLworc3RydWN0IHN0cmVhbV9kYXRhIHsKKwl1aW50MzJfdCBzdHJlYW1fbXV0ZTsKKwl1aW50MzJfdCBzdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zOworfTsKKworLyogRGV2aWNlIGluZm9ybWF0aW9uIHBheWxvYWQgc3RydWN0dXJlICovCitzdHJ1Y3QgZGV2aWNlX2RhdGEgeworCXVpbnQzMl90IGRldl9tdXRlOworCXVpbnQzMl90IHNhbXBsZTsKKwl1aW50MzJfdCBlbmFibGVkOworCXVpbnQzMl90IGRldl9pZDsKKwl1aW50MzJfdCBwb3J0X2lkOworCXVpbnQzMl90IHZvbHVtZV9zdGVwX3ZhbHVlOworCXVpbnQzMl90IHZvbHVtZV9yYW1wX2R1cmF0aW9uX21zOworCXVpbnQzMl90IGRldl9tdXRlX3JhbXBfZHVyYXRpb25fbXM7CisJdWludDMyX3Qgbm9fb2ZfY2hhbm5lbHM7Cit9OworCitzdHJ1Y3Qgdm9pY2VfZGV2X3JvdXRlX3N0YXRlIHsKKwl1MTYgcnhfcm91dGVfZmxhZzsKKwl1MTYgdHhfcm91dGVfZmxhZzsKK307CisKK3N0cnVjdCB2b2ljZV9yZWNfcm91dGVfc3RhdGUgeworCXUxNiB1bF9mbGFnOworCXUxNiBkbF9mbGFnOworfTsKKworZW51bSB7CisJVk9DX0lOSVQgPSAwLAorCVZPQ19SVU4sCisJVk9DX0NIQU5HRSwKKwlWT0NfUkVMRUFTRSwKKwlWT0NfRVJST1IsCisJVk9DX1NUQU5EQlksCit9OworCitzdHJ1Y3QgbWVtX2J1ZmZlciB7CisJZG1hX2FkZHJfdAkJcGh5czsKKwl2b2lkCQkJKmRhdGE7CisJdWludDMyX3QJCXNpemU7IC8qIHNpemUgb2YgYnVmZmVyICovCit9OworCitzdHJ1Y3Qgc2hhcmVfbWVtX2J1ZiB7CisJc3RydWN0IGlvbl9oYW5kbGUJKmhhbmRsZTsKKwlzdHJ1Y3QgaW9uX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBtZW1fYnVmZmVyCWJ1ZltOVU1fT0ZfQlVGRkVSU107Cit9OworCitzdHJ1Y3QgbWVtX21hcF90YWJsZSB7CisJZG1hX2FkZHJfdAkJcGh5czsKKwl2b2lkCQkJKmRhdGE7CisJc2l6ZV90CQkJc2l6ZTsgLyogc2l6ZSBvZiBidWZmZXIgKi8KKwlzdHJ1Y3QgaW9uX2hhbmRsZQkqaGFuZGxlOworCXN0cnVjdCBpb25fY2xpZW50CSpjbGllbnQ7Cit9OworCisvKiBDb21tb24gKi8KKyNkZWZpbmUgVlNTX0lDT01NT05fQ01EX1NFVF9VSV9QUk9QRVJUWSAweDAwMDExMTAzCisvKiBTZXQgYSBVSSBwcm9wZXJ0eSAqLworI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfTUFQX01FTU9SWSAgIDB4MDAwMTEwMjUKKyNkZWZpbmUgVlNTX0lDT01NT05fQ01EX1VOTUFQX01FTU9SWSAweDAwMDExMDI2CisvKiBHZW5lcmFsIHNoYXJlZCBtZW1vcnk7IGJ5dGUtYWNjZXNzaWJsZSwgNCBrQi1hbGlnbmVkLiAqLworI2RlZmluZSBWU1NfSUNPTU1PTl9NQVBfTUVNT1JZX1NITUVNOF80S19QT09MICAzCisKK3N0cnVjdCB2c3NfaWNvbW1vbl9jbWRfbWFwX21lbW9yeV90IHsKKwl1aW50MzJfdCBwaHlzX2FkZHI7CisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBhIG1lbW9yeSByZWdpb247IG11c3QgYmUgYXQgbGVhc3QKKwkgKiAgNCBrQiBhbGlnbmVkLgorCSAqLworCisJdWludDMyX3QgbWVtX3NpemU7CisJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWdpb247IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDMyLiAqLworCisJdWludDE2X3QgbWVtX3Bvb2xfaWQ7CisJLyogVHlwZSBvZiBtZW1vcnkgYmVpbmcgcHJvdmlkZWQuIFRoZSBtZW1vcnkgSUQgaW1wbGljaXRseSBkZWZpbmVzCisJICogIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG1lbW9yeS4gVGhlIGNoYXJhY3RlcmlzdGljcyBtaWdodCBpbmNsdWRlCisJICogIGFsaWdubWVudCB0eXBlLCBwZXJtaXNzaW9ucywgZXRjLgorCSAqIE1lbW9yeSBwb29sIElELiBQb3NzaWJsZSB2YWx1ZXM6CisJICogMyAtLSBWU1NfSUNPTU1PTl9NRU1fVFlQRV9TSE1FTThfNEtfUE9PTC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaWNvbW1vbl9jbWRfdW5tYXBfbWVtb3J5X3QgeworCXVpbnQzMl90IHBoeXNfYWRkcjsKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGEgbWVtb3J5IHJlZ2lvbjsgbXVzdCBiZSBhdCBsZWFzdAorCSAqICA0IGtCIGFsaWduZWQuCisJICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX21hcF9tZW1vcnlfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pY29tbW9uX2NtZF9tYXBfbWVtb3J5X3QgdnNzX21hcF9tZW07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX3VubWFwX21lbW9yeV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2ljb21tb25fY21kX3VubWFwX21lbW9yeV90IHZzc191bm1hcF9tZW07Cit9IF9fcGFja2VkOworCisvKiBUTyBNVk0gY29tbWFuZHMgKi8KKyNkZWZpbmUgVlNTX0lNVk1fQ01EX0NSRUFURV9QQVNTSVZFX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMEZGCisvKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLworCisjZGVmaW5lIFZTU19JTVZNX0NNRF9TRVRfUE9MSUNZX0RVQUxfQ09OVFJPTAkweDAwMDExMzI3CisvKgorICogVlNTX0lNVk1fQ01EX1NFVF9QT0xJQ1lfRFVBTF9DT05UUk9MCisgKiBEZXNjcmlwdGlvbjogVGhpcyBjb21tYW5kIGlzIHJlcXVpcmVkIHRvIGxldCBNVk0ga25vdworICogd2hvIGlzIGluIGNvbnRyb2wgb2Ygc2Vzc2lvbi4KKyAqIFBheWxvYWQ6IERlZmluZWQgYnkgdnNzX2ltdm1fY21kX3NldF9wb2xpY3lfZHVhbF9jb250cm9sX3QuCisgKiBSZXN1bHQ6IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLgorICovCisKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX0NSRUFURV9GVUxMX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMEZFCisvKiBDcmVhdGUgYSBuZXcgZnVsbCBjb250cm9sIE1WTSBzZXNzaW9uLiAqLworCisjZGVmaW5lIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OCQkweDAwMDEwMDNDCisvKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLworCisjZGVmaW5lIFZTU19JTVZNX0NNRF9BVFRBQ0hfU1RSRUFNCQkJMHgwMDAxMTIzQworLyogQXR0YWNoIGEgc3RyZWFtIHRvIHRoZSBNVk0uICovCisKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX0RFVEFDSF9TVFJFQU0JCQkweDAwMDExMjNECisvKiBEZXRhY2ggYSBzdHJlYW0gZnJvbSB0aGUgTVZNLiAqLworCisjZGVmaW5lIFZTU19JTVZNX0NNRF9BVFRBQ0hfVk9DUFJPQwkJICAgICAgIDB4MDAwMTEyM0UKKy8qIEF0dGFjaCBhIHZvY3Byb2MgdG8gdGhlIE1WTS4gVGhlIE1WTSB3aWxsIHN5bW1ldHJpY2FsbHkgY29ubmVjdCB0aGlzIHZvY3Byb2MKKyAqIHRvIGFsbCB0aGUgc3RyZWFtcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gaXQuCisgKi8KKworI2RlZmluZSBWU1NfSU1WTV9DTURfREVUQUNIX1ZPQ1BST0MJCQkweDAwMDExMjNGCisvKiBEZXRhY2ggYSB2b2Nwcm9jIGZyb20gdGhlIE1WTS4gVGhlIE1WTSB3aWxsIHN5bW1ldHJpY2FsbHkgZGlzY29ubmVjdCB0aGlzCisgKiB2b2Nwcm9jIGZyb20gYWxsIHRoZSBzdHJlYW1zIHRvIHdoaWNoIGl0IGlzIGN1cnJlbnRseSBhdHRhY2hlZC4KKyAqLworCisjZGVmaW5lIFZTU19JTVZNX0NNRF9TVEFSVF9WT0lDRQkJCTB4MDAwMTExOTAKKy8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCisKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX1NUQU5EQllfVk9JQ0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTExOTEKKy8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCisKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX1NUT1BfVk9JQ0UJCQkJMHgwMDAxMTE5MgorLyoqPCBObyBwYXlsb2FkLiBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KKworI2RlZmluZSBWU1NfSU1WTV9DTURfUEFVU0VfVk9JQ0UJCQkweDAwMDExMzdECisvKiBObyBwYXlsb2FkLiBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KKworI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfQVRUQUNIX1ZPQ1BST0MJCQkweDAwMDExMEY4CisvKio8IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLworCisjZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9ERVRBQ0hfVk9DUFJPQwkJCTB4MDAwMTEwRjkKKy8qKjwgV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCisKKworI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfU0VUX1RUWV9NT0RFCQkJMHgwMDAxMTE5NgorLyoqPCBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KKworI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfU0VUX05FVFdPUksJCQkweDAwMDExMTlDCisvKiBTZXQgdGhlIG5ldHdvcmsgdHlwZS4gKi8KKworI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfU0VUX1ZPSUNFX1RJTUlORwkJMHgwMDAxMTFFMAorLyogU2V0IHRoZSB2b2ljZSB0aW1pbmcgcGFyYW1ldGVycy4gKi8KKworI2RlZmluZSBWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMCQkJMHgwMDAxMTMzNAorI2RlZmluZSBWU1NfSU1FTU9SWV9SU1BfTUFQCQkJCTB4MDAwMTEzMzYKKyNkZWZpbmUgVlNTX0lNRU1PUllfQ01EX1VOTUFQCQkJCTB4MDAwMTEzMzcKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTkVUV09SSwkJCTB4MDAwMTEzN0EKKyNkZWZpbmUgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTUVESUFfVFlQRQkJMHgwMDAxMTM3QgorI2RlZmluZSBWU1NfSUhEVk9JQ0VfQ01EX0VOQUJMRQkJCQkweDAwMDEzMEEyCisjZGVmaW5lIFZTU19JSERWT0lDRV9DTURfRElTQUJMRQkJCTB4MDAwMTMwQTMKKworZW51bSBtc21fYXVkaW9fdm9jX3JhdGUgeworCQlWT0NfMF9SQVRFLCAvKiBCbGFuayBmcmFtZSAqLworCQlWT0NfOF9SQVRFLCAvKiAxLzggcmF0ZSAgICAqLworCQlWT0NfNF9SQVRFLCAvKiAxLzQgcmF0ZSAgICAqLworCQlWT0NfMl9SQVRFLCAvKiAxLzIgcmF0ZSAgICAqLworCQlWT0NfMV9SQVRFLCAgLyogRnVsbCByYXRlICAgKi8KKwkJVk9DXzhfUkFURV9OQyAgLyogTm9uY3JpdGljYWwgMS84IHJhdGUgICAqLworfTsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfdHR5X21vZGVfdCB7CisJdWludDMyX3QgbW9kZTsKKwkvKio8CisJICogVFRZIG1vZGUuCisJICoKKwkgKiAwIDogVFRZIGRpc2FibGVkCisJICogMSA6IEhDTworCSAqIDIgOiBWQ08KKwkgKiAzIDogRlVMTAorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9hdHRhY2hfdm9jcHJvY190IHsKKwl1aW50MTZfdCBoYW5kbGU7CisJLyoqPCBIYW5kbGUgb2Ygdm9jcHJvYyBiZWluZyBhdHRhY2hlZC4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXN0cmVhbV9jbWRfZGV0YWNoX3ZvY3Byb2NfdCB7CisJdWludDE2X3QgaGFuZGxlOworCS8qKjwgSGFuZGxlIG9mIHZvY3Byb2MgYmVpbmcgZGV0YWNoZWQuICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2ltdm1fY21kX2F0dGFjaF9zdHJlYW1fdCB7CisJdWludDE2X3QgaGFuZGxlOworCS8qIFRoZSBzdHJlYW0gaGFuZGxlIHRvIGF0dGFjaC4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW12bV9jbWRfZGV0YWNoX3N0cmVhbV90IHsKKwl1aW50MTZfdCBoYW5kbGU7CisJLyogVGhlIHN0cmVhbSBoYW5kbGUgdG8gZGV0YWNoLiAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pY29tbW9uX2NtZF9zZXRfbmV0d29ya190IHsKKwl1aW50MzJfdCBuZXR3b3JrX2lkOworCS8qIE5ldHdvcmsgSUQuIChSZWZlciB0byBWU1NfTkVUV09SS19JRF9YWFgpLiAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pY29tbW9uX2NtZF9zZXRfdm9pY2VfdGltaW5nX3QgeworCXVpbnQxNl90IG1vZGU7CisJLyoKKwkgKiBUaGUgdm9jb2RlciBmcmFtZSBzeW5jaHJvbml6YXRpb24gbW9kZS4KKwkgKgorCSAqIDAgOiBObyBmcmFtZSBzeW5jLgorCSAqIDEgOiBIYXJkIFZGUiAoMjBtcyBWb2NvZGVyIEZyYW1lIFJlZmVyZW5jZSBpbnRlcnJ1cHQpLgorCSAqLworCXVpbnQxNl90IGVuY19vZmZzZXQ7CisJLyoKKwkgKiBUaGUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyBmcm9tIHRoZSBWRlIgdG8gZGVsaXZlciBhIFR4IHZvY29kZXIKKwkgKiBwYWNrZXQuIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGxlc3MgdGhhbiAyMDAwMHVzLgorCSAqLworCXVpbnQxNl90IGRlY19yZXFfb2Zmc2V0OworCS8qCisJICogVGhlIG9mZnNldCBpbiBtaWNyb3NlY29uZHMgZnJvbSB0aGUgVkZSIHRvIHJlcXVlc3QgZm9yIGFuIFJ4IHZvY29kZXIKKwkgKiBwYWNrZXQuIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGxlc3MgdGhhbiAyMDAwMHVzLgorCSAqLworCXVpbnQxNl90IGRlY19vZmZzZXQ7CisJLyoKKwkgKiBUaGUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyBmcm9tIHRoZSBWRlIgdG8gaW5kaWNhdGUgdGhlIGRlYWRsaW5lIHRvCisJICogcmVjZWl2ZSBhbiBSeCB2b2NvZGVyIHBhY2tldC4gVGhlIG9mZnNldCBzaG91bGQgYmUgbGVzcyB0aGFuIDIwMDAwdXMuCisJICogUnggdm9jb2RlciBwYWNrZXRzIHJlY2VpdmVkIGFmdGVyIHRoaXMgZGVhZGxpbmUgYXJlIG5vdCBndWFyYW50ZWVkIHRvCisJICogYmUgcHJvY2Vzc2VkLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pbXZtX2NtZF9jcmVhdGVfY29udHJvbF9zZXNzaW9uX3QgeworCWNoYXIgbmFtZVtTRVNTSU9OX05BTUVfTEVOXTsKKwkvKgorCSAqIEEgdmFyaWFibGUtc2l6ZWQgc3RyZWFtIG5hbWUuCisJICoKKwkgKiBUaGUgc3RyZWFtIG5hbWUgc2l6ZSBpcyB0aGUgcGF5bG9hZCBzaXplIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBvdGhlcgorCSAqIGZpZWxkcy4KKwkgKi8KK30gX19wYWNrZWQ7CisKKworc3RydWN0IHZzc19pbXZtX2NtZF9zZXRfcG9saWN5X2R1YWxfY29udHJvbF90IHsKKwlib29sIGVuYWJsZV9mbGFnOworCS8qIFNldCB0byBUUlVFIHRvIGVuYWJsZSBtb2RlbSBzdGF0ZSBtYWNoaW5lIGNvbnRyb2wgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtdm1fYXR0YWNoX3ZvY3Byb2NfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9hdHRhY2hfdm9jcHJvY190IG12bV9hdHRhY2hfY3ZwX2hhbmRsZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtdm1fZGV0YWNoX3ZvY3Byb2NfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9kZXRhY2hfdm9jcHJvY190IG12bV9kZXRhY2hfY3ZwX2hhbmRsZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtdm1fY3JlYXRlX2N0bF9zZXNzaW9uX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaW12bV9jbWRfY3JlYXRlX2NvbnRyb2xfc2Vzc2lvbl90IG12bV9zZXNzaW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IG12bV9tb2RlbV9kdWFsX2NvbnRyb2xfc2Vzc2lvbl9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9wb2xpY3lfZHVhbF9jb250cm9sX3Qgdm9pY2VfY3RsOworfSBfX3BhY2tlZDsKKworc3RydWN0IG12bV9zZXRfdHR5X21vZGVfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfdHR5X21vZGVfdCB0dHlfbW9kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtdm1fYXR0YWNoX3N0cmVhbV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2ltdm1fY21kX2F0dGFjaF9zdHJlYW1fdCBhdHRhY2hfc3RyZWFtOworfSBfX3BhY2tlZDsKKworc3RydWN0IG12bV9kZXRhY2hfc3RyZWFtX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaW12bV9jbWRfZGV0YWNoX3N0cmVhbV90IGRldGFjaF9zdHJlYW07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbXZtX3NldF9uZXR3b3JrX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X25ldHdvcmtfdCBuZXR3b3JrOworfSBfX3BhY2tlZDsKKworc3RydWN0IG12bV9zZXRfdm9pY2VfdGltaW5nX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3ZvaWNlX3RpbWluZ190IHRpbWluZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtdm1fc2V0X2hkX2VuYWJsZV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV9kZXNjcmlwdG9yX3QgeworCXVpbnQzMl90IG1lbV9hZGRyZXNzX2xzdzsKKwl1aW50MzJfdCBtZW1fYWRkcmVzc19tc3c7CisJLyoKKwkgKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRhYmxlLiBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQKKwkgKiB0byBMQ00oIGNhY2hlX2xpbmVfc2l6ZSwgcGFnZV9hbGlnbiwgbWF4X2RhdGFfd2lkdGggKSwgd2hlcmUgdGhlCisJICogYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGluICNWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMLCBhbmQKKwkgKiBMQ00gPSBMZWFzdCBDb21tb24gTXVsdGlwbGUuIFRoZSB0YWJsZSBhdCB0aGUgYWRkcmVzcyBtdXN0IGhhdmUKKwkgKiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSAjdnNzX2ltZW1vcnlfdGFibGVfdC4KKwkgKi8KKwl1aW50MzJfdCBtZW1fc2l6ZTsKKwkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB0YWJsZS4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW1lbW9yeV9ibG9ja190IHsKKwl1aW50NjRfdCBtZW1fYWRkcmVzczsKKwkvKgorCSAqIEJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJsb2NrLiBUaGUgYWRkcmVzcyBpcyB2aXJ0dWFsIGZvciB2aXJ0dWFsCisJICogbWVtb3J5IGFuZCBwaHlzaWNhbCBmb3IgcGh5c2ljYWwgbWVtb3J5LiBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQKKwkgKiB0byBMQ00oIGNhY2hlX2xpbmVfc2l6ZSwgcGFnZV9hbGlnbiwgbWF4X2RhdGFfd2lkdGggKSwgd2hlcmUgdGhlCisJICogYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGluIFZTU19JTUVNT1JZX0NNRF9NQVBfVklSVFVBTCBvcgorCSAqIFZTU19JTUVNT1JZX0NNRF9NQVBfUEhZU0lDQUwsIGFuZCBMQ00gPSBMZWFzdCBDb21tb24gTXVsdGlwbGUuCisJICovCisJdWludDMyX3QgbWVtX3NpemU7CisJLyoKKwkgKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgYmxvY2suIFRoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YKKwkgKiBwYWdlX2FsaWduLCB3aGVyZSBwYWdlX2FsaWduIGlzIHNwZWNpZmllZCBpbgorCSAqIFZTU19JTUVNT1JZX0NNRF9NQVBfVklSVFVBTCBvciAjVlNTX0lNRU1PUllfQ01EX01BUF9QSFlTSUNBTC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90IHsKKwlzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfZGVzY3JpcHRvcl90IG5leHRfdGFibGVfZGVzY3JpcHRvcjsKKwkvKgorCSAqIFNwZWNpZmllcyB0aGUgbmV4dCB0YWJsZS4gSWYgdGhlcmUgaXMgbm8gbmV4dCB0YWJsZSwKKwkgKiBzZXQgdGhlIHNpemUgb2YgdGhlIHRhYmxlIHRvIDAgYW5kIHRoZSB0YWJsZSBhZGRyZXNzIGlzIGlnbm9yZWQuCisJICovCisJc3RydWN0IHZzc19pbWVtb3J5X2Jsb2NrX3QgYmxvY2tzW05VTV9PRl9NRU1PUllfQkxPQ0tTXTsKKwkvKiBTcGVjaWZpZXMgb25lIG9yZSBtb3JlIG1lbW9yeSBibG9ja3MuICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2ltZW1vcnlfY21kX21hcF9waHlzaWNhbF90IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX2Rlc2NyaXB0b3JfdCB0YWJsZV9kZXNjcmlwdG9yOworCWJvb2wgaXNfY2FjaGVkOworCS8qCisJICogSW5kaWNhdGVzIGNhY2hlZCBvciB1bmNhY2hlZCBtZW1vcnkuIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogVFJVRSAtIENhY2hlZC4KKwkgKi8KKwl1aW50MTZfdCBjYWNoZV9saW5lX3NpemU7CisJLyogQ2FjaGUgbGluZSBzaXplIGluIGJ5dGVzLiBTdXBwb3J0ZWQgdmFsdWVzOiAxMjggKi8KKwl1aW50MzJfdCBhY2Nlc3NfbWFzazsKKwkvKgorCSAqIENWRCdzIGFjY2VzcyBwZXJtaXNzaW9uIHRvIHRoZSBtZW1vcnkgd2hpbGUgaXQgaXMgbWFwcGVkLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6CisJICogYml0IDAgLSBJZiBzZXQsIHRoZSBtZW1vcnkgaXMgcmVhZGFibGUuCisJICogYml0IDEgLSBJZiBzZXQsIHRoZSBtZW1vcnkgaXMgd3JpdGFibGUuCisJICovCisJdWludDMyX3QgcGFnZV9hbGlnbjsKKwkvKiBQYWdlIGZyYW1lIGFsaWdubWVudCBpbiBieXRlcy4gU3VwcG9ydGVkIHZhbHVlczogNDA5NiAqLworCXVpbnQ4X3QgbWluX2RhdGFfd2lkdGg7CisJLyoKKwkgKiBNaW5pbXVtIG5hdGl2ZSBkYXRhIHR5cGUgd2lkdGggaW4gYml0cyB0aGF0IGNhbiBiZSBhY2Nlc3NlZC4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzOiA4CisJICovCisJdWludDhfdCBtYXhfZGF0YV93aWR0aDsKKwkvKgorCSAqIE1heGltdW0gbmF0aXZlIGRhdGEgdHlwZSB3aWR0aCBpbiBiaXRzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDY0CisJICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9jYWxfbmV0d29ya190IHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJdWludDMyX3QgbmV0d29ya19pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW12bV9jbWRfc2V0X2NhbF9tZWRpYV90eXBlX3QgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBtZWRpYV9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaW1lbW9yeV9jbWRfdW5tYXBfdCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXVpbnQzMl90IG1lbV9oYW5kbGU7Cit9IF9fcGFja2VkOworCisvKiBUTyBDVlMgY29tbWFuZHMgKi8KKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0NSRUFURV9QQVNTSVZFX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMTQwCisvKio8IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLworCisjZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT04JMHgwMDAxMTBGNworLyogQ3JlYXRlIGEgbmV3IGZ1bGwgY29udHJvbCBzdHJlYW0gc2Vzc2lvbi4gKi8KKworI2RlZmluZSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTgkJMHgwMDAxMDAzQworCisvKgorICogVGhpcyBjb21tYW5kIGNoYW5nZXMgdGhlIG11dGUgc2V0dGluZy4gVGhlIG5ldyBtdXRlIHNldHRpbmcgd2lsbAorICogYmUgYXBwbGllZCBvdmVyIHRoZSBzcGVjaWZpZWQgcmFtcCBkdXJhdGlvbi4KKyAqLworI2RlZmluZSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMgkJCQkweDAwMDExMzhCCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1JFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEFfVjIgICAgMHgwMDAxMTM2OQorCisjZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEEgICAgIDB4MDAwMTEyN0EKKworI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAgIDB4MDAwMTMwN0QKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAweDAwMDEzMDdFCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9NRURJQV9UWVBFCQkJMHgwMDAxMTE4NgorLyogU2V0IG1lZGlhIHR5cGUgb24gdGhlIHN0cmVhbS4gKi8KKworI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfU0VORF9FTkNfQlVGRkVSCQkJMHgwMDAxMTAxNQorLyogRXZlbnQgc2VudCBieSB0aGUgc3RyZWFtIHRvIGl0cyBjbGllbnQgdG8gcHJvdmlkZSBhbiBlbmNvZGVkIHBhY2tldC4gKi8KKworI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfUkVRVUVTVF9ERUNfQlVGRkVSCQkweDAwMDExMDE3CisvKiBFdmVudCBzZW50IGJ5IHRoZSBzdHJlYW0gdG8gaXRzIGNsaWVudCByZXF1ZXN0aW5nIGZvciBhIGRlY29kZXIgcGFja2V0LgorICogVGhlIGNsaWVudCBzaG91bGQgcmVzcG9uZCB3aXRoIGEgVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUiBldmVudC4KKyAqLworCisjZGVmaW5lIFZTU19JU1RSRUFNX0VWVF9PT0JfTk9USUZZX0RFQ19CVUZGRVJfUkVRVUVTVAkweDAwMDExMzZFCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUgkJCTB4MDAwMTEwMTYKKy8qIEV2ZW50IHNlbnQgYnkgdGhlIGNsaWVudCB0byB0aGUgc3RyZWFtIGluIHJlc3BvbnNlIHRvIGEKKyAqIFZTU19JU1RSRUFNX0VWVF9SRVFVRVNUX0RFQ19CVUZGRVIgZXZlbnQsIHByb3ZpZGluZyBhIGRlY29kZXIgcGFja2V0LgorICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1ZPQ19BTVJfU0VUX0VOQ19SQVRFCQkweDAwMDExMTNFCisvKiBTZXQgQU1SIGVuY29kZXIgcmF0ZS4gKi8KKworI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfVk9DX0FNUldCX1NFVF9FTkNfUkFURQkJMHgwMDAxMTEzRgorLyogU2V0IEFNUi1XQiBlbmNvZGVyIHJhdGUuICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0NETUFfU0VUX0VOQ19NSU5NQVhfUkFURQkweDAwMDExMDE5CisvKiBTZXQgZW5jb2RlciBtaW5pbXVtIGFuZCBtYXhpbXVtIHJhdGUuICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9FTkNfRFRYX01PREUJCTB4MDAwMTEwMUQKKy8qIFNldCBlbmNvZGVyIERUWCBtb2RlLiAqLworCisjZGVmaW5lIE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QJCQkweDAwMDEwRUUzCisjZGVmaW5lIFZPSUNFX1BBUkFNX01PRF9FTkFCTEUJCQkJMHgwMDAxMEUwMAorI2RlZmluZSBNT0RfRU5BQkxFX1BBUkFNX0xFTgkJCQk0CisKKyNkZWZpbmUgVlNTX0lQTEFZQkFDS19DTURfU1RBUlQJCQkJMHgwMDAxMTJCRAorLyogU3RhcnQgaW4tY2FsbCBtdXNpYyBkZWxpdmVyeSBvbiB0aGUgVHggdm9pY2UgcGF0aC4gKi8KKworI2RlZmluZSBWU1NfSVBMQVlCQUNLX0NNRF9TVE9QCQkJCTB4MDAwMTEyMzkKKy8qIFN0b3AgdGhlIGluLWNhbGwgbXVzaWMgZGVsaXZlcnkgb24gdGhlIFR4IHZvaWNlIHBhdGguICovCisKKyNkZWZpbmUgVlNTX0lQTEFZQkFDS19QT1JUX0lEX0RFRkFVTFQJCQkweDAwMDBGRkZGCisvKiBEZWZhdWx0IEFGRSBwb3J0IElELiAqLworCisjZGVmaW5lIFZTU19JUExBWUJBQ0tfUE9SVF9JRF9WT0lDRQkJCTB4MDAwMDgwMDUKKy8qIEFGRSBwb3J0IElEIGZvciBWT0lDRSAxLiAqLworCisjZGVmaW5lIFZTU19JUExBWUJBQ0tfUE9SVF9JRF9WT0lDRTIJCQkweDAwMDA4MDAyCisvKiBBRkUgcG9ydCBJRCBmb3IgVk9JQ0UgMi4gKi8KKworI2RlZmluZSBWU1NfSVJFQ09SRF9DTURfU1RBUlQJCQkJMHgwMDAxMTJCRQorLyogU3RhcnQgaW4tY2FsbCBjb252ZXJzYXRpb24gcmVjb3JkaW5nLiAqLworI2RlZmluZSBWU1NfSVJFQ09SRF9DTURfU1RPUAkJCQkweDAwMDExMjM3CisvKiBTdG9wIGluLWNhbGwgY29udmVyc2F0aW9uIHJlY29yZGluZy4gKi8KKworI2RlZmluZSBWU1NfSVJFQ09SRF9QT1JUX0lEX0RFRkFVTFQJCQkweDAwMDBGRkZGCisvKiBEZWZhdWx0IEFGRSBwb3J0IElELiAqLworCisjZGVmaW5lIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9OT05FCQkJMHgwMDAxMEY3OAorLyogSW5kaWNhdGVzIG5vIHRhcHBpbmcgZm9yIHNwZWNpZmllZCBwYXRoLiAqLworCisjZGVmaW5lIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5ECQkweDAwMDEwRjc5CisvKiBJbmRpY2F0ZXMgdGhhdCBzcGVjaWZpZWQgcGF0aCBzaG91bGQgYmUgdGFwcGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KKworI2RlZmluZSBWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX1NURVJFTwkJCTB4MDAwMTBGN0EKKy8qIFNlbGVjdCBUeCBvbiBsZWZ0IGNoYW5uZWwgYW5kIFJ4IG9uIHJpZ2h0IGNoYW5uZWwuICovCisKKyNkZWZpbmUgVlNTX0lSRUNPUkRfTU9ERV9UWF9SWF9NSVhJTkcJCQkweDAwMDEwRjdCCisvKiBTZWxlY3QgbWl4ZWQgVHggYW5kIFJ4IHBhdGhzLiAqLworCisjZGVmaW5lIFZTU19JU1RSRUFNX0VWVF9OT1RfUkVBRFkJCQkweDAwMDExMEZECisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1JFQURZCQkJCTB4MDAwMTEwRkMKKworI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfT09CX05PVElGWV9ERUNfQlVGRkVSX1JFQURZCTB4MDAwMTEzNkYKKy8qbm90aWZ5IGRzcCB0aGF0IGRlY29kZXIgYnVmZmVyIGlzIHJlYWR5Ki8KKworI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfT09CX05PVElGWV9FTkNfQlVGRkVSX1JFQURZCTB4MDAwMTEzNkMKKy8qZHNwIG5vdGlmeWluZyBjbGllbnQgdGhhdCBlbmNvZGVyIGJ1ZmZlciBpcyByZWFkeSovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfRU5DX0JVRkZFUl9DT05TVU1FRAkweDAwMDExMzZECisvKm5vdGlmeSBkc3AgdGhhdCBlbmNvZGVyIGJ1ZmZlciBpcyBjb25zdW1lZCovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9PT0JfUEFDS0VUX0VYQ0hBTkdFX0NPTkZJRwkweDAwMDExMzZCCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfSU5CQU5ECTAKKy8qIEluLWJhbmQgcGFja2V0IGV4Y2hhbmdlIG1vZGUuICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfT1VUX09GX0JBTkQJMQorLyogT3V0LW9mLWJhbmQgcGFja2V0IGV4Y2hhbmdlIG1vZGUuICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9QQUNLRVRfRVhDSEFOR0VfTU9ERQkweDAwMDExMzZBCisKK3N0cnVjdCB2c3NfaXBsYXliYWNrX2NtZF9zdGFydF90IHsKKwl1aW50MTZfdCBwb3J0X2lkOworCS8qCisJICogQUZFIFBvcnQgSUQgZnJvbSB3aGljaCB0aGUgYXVkaW8gc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgorCSAqIFRvIHVzZSB0aGUgZGVmYXVsdCBBRkUgcHNldWRvIHBvcnQgKDB4ODAwNSksIHNldCB0aGlzIHZhbHVlIHRvCisJICogI1ZTU19JUExBWUJBQ0tfUE9SVF9JRF9ERUZBVUxULgorCSAqLworfSAgX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXJlY29yZF9jbWRfc3RhcnRfdCB7CisJdWludDMyX3QgcnhfdGFwX3BvaW50OworCS8qIFRhcCBwb2ludCB0byB1c2Ugb24gdGhlIFJ4IHBhdGguIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgorCSAqIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9OT05FIDogRG8gbm90IHJlY29yZCBSeCBwYXRoLgorCSAqIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5EIDogUnggdGFwIHBvaW50IGlzIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGUgc3RyZWFtLgorCSAqLworCXVpbnQzMl90IHR4X3RhcF9wb2ludDsKKwkvKiBUYXAgcG9pbnQgdG8gdXNlIG9uIHRoZSBUeCBwYXRoLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKKwkgKiBWU1NfSVJFQ09SRF9UQVBfUE9JTlRfTk9ORSA6IERvIG5vdCByZWNvcmQgdHggcGF0aC4KKwkgKiBWU1NfSVJFQ09SRF9UQVBfUE9JTlRfU1RSRUFNX0VORCA6IFR4IHRhcCBwb2ludCBpcyBhdCB0aGUgZW5kIG9mCisJICogdGhlIHN0cmVhbS4KKwkgKi8KKwl1aW50MTZfdCBwb3J0X2lkOworCS8qIEFGRSBQb3J0IElEIHRvIHdoaWNoIHRoZSBjb252ZXJzYXRpb24gcmVjb3JkaW5nIHN0cmVhbSBuZWVkcyB0byBiZQorCSAqIHNlbnQuIFNldCB0aGlzIHRvICNWU1NfSVJFQ09SRF9QT1JUX0lEX0RFRkFVTFQgdG8gdXNlIGRlZmF1bHQgQUZFCisJICogcHNldWRvIHBvcnRzICgweDgwMDMgZm9yIFJ4IGFuZCAweDgwMDQgZm9yIFR4KS4KKwkgKi8KKwl1aW50MzJfdCBtb2RlOworCS8qIFJlY29yZGluZyBNb2RlLiBUaGUgbW9kZSBwYXJhbWV0ZXIgdmFsdWUgaXMgaWdub3JlZCBpZiB0aGUgcG9ydF9pZAorCSAqIGlzIHNldCB0byAjVlNTX0lSRUNPUkRfUE9SVF9JRF9ERUZBVUxULgorCSAqIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgorCSAqICNWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX1NURVJFTworCSAqICNWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX01JWElORworCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jcmVhdGVfcGFzc2l2ZV9jb250cm9sX3Nlc3Npb25fdCB7CisJY2hhciBuYW1lW1NFU1NJT05fTkFNRV9MRU5dOworCS8qKjwKKwkgKiBBIHZhcmlhYmxlLXNpemVkIHN0cmVhbSBuYW1lLgorCSAqCisJICogVGhlIHN0cmVhbSBuYW1lIHNpemUgaXMgdGhlIHBheWxvYWQgc2l6ZSBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgb3RoZXIKKwkgKiBmaWVsZHMuCisJICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIFZTU19JVk9MVU1FX0RJUkVDVElPTl9UWAkwCisjZGVmaW5lIFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWAkxCisKKyNkZWZpbmUgVlNTX0lWT0xVTUVfTVVURV9PRkYJCTAKKyNkZWZpbmUgVlNTX0lWT0xVTUVfTVVURV9PTgkJMQorCisjZGVmaW5lIERFRkFVTFRfTVVURV9SQU1QX0RVUkFUSU9OCTUwMAorI2RlZmluZSBERUZBVUxUX1ZPTFVNRV9SQU1QX0RVUkFUSU9OCTIwCisjZGVmaW5lIE1BWF9SQU1QX0RVUkFUSU9OCQk1MDAwCisKK3N0cnVjdCB2c3NfaXZvbHVtZV9jbWRfbXV0ZV92Ml90IHsKKwl1aW50MTZfdCBkaXJlY3Rpb247CisJLyoKKwkgKiBUaGUgZGlyZWN0aW9uIGZpZWxkIHNldHMgdGhlIGRpcmVjdGlvbiB0byBhcHBseSB0aGUgbXV0ZSBjb21tYW5kLgorCSAqIFRoZSBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIFZTU19JVk9MVU1FX0RJUkVDVElPTl9UWAorCSAqIFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWAorCSAqLworCXVpbnQxNl90IG11dGVfZmxhZzsKKwkvKgorCSAqIFR1cm4gbXV0ZSBvbiBvciBvZmYuIFRoZSBTdXBwb3J0ZWQgdmFsdWVzOgorCSAqIFZTU19JVk9MVU1FX01VVEVfT0ZGCisJICogVlNTX0lWT0xVTUVfTVVURV9PTgorCSAqLworCXVpbnQxNl90IHJhbXBfZHVyYXRpb25fbXM7CisJLyoKKwkgKiBNdXRlIGNoYW5nZSByYW1wIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkgKiBUaGUgU3VwcG9ydGVkIHZhbHVlczogMCB0byA1MDAwLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jcmVhdGVfZnVsbF9jb250cm9sX3Nlc3Npb25fdCB7CisJdWludDE2X3QgZGlyZWN0aW9uOworCS8qCisJICogU3RyZWFtIGRpcmVjdGlvbi4KKwkgKgorCSAqIDAgOiBUWCBvbmx5CisJICogMSA6IFJYIG9ubHkKKwkgKiAyIDogVFggYW5kIFJYCisJICogMyA6IFRYIGFuZCBSWCBsb29wYmFjaworCSAqLworCXVpbnQzMl90IGVuY19tZWRpYV90eXBlOworCS8qIFR4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLworCXVpbnQzMl90IGRlY19tZWRpYV90eXBlOworCS8qIFJ4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLworCXVpbnQzMl90IG5ldHdvcmtfaWQ7CisJLyogTmV0d29yayBJRC4gKFJlZmVyIHRvIFZTU19ORVRXT1JLX0lEX1hYWCkuICovCisJY2hhciBuYW1lW1NFU1NJT05fTkFNRV9MRU5dOworCS8qCisJICogQSB2YXJpYWJsZS1zaXplZCBzdHJlYW0gbmFtZS4KKwkgKgorCSAqIFRoZSBzdHJlYW0gbmFtZSBzaXplIGlzIHRoZSBwYXlsb2FkIHNpemUgbWludXMgdGhlIHNpemUgb2YgdGhlIG90aGVyCisJICogZmllbGRzLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfbWVkaWFfdHlwZV90IHsKKwl1aW50MzJfdCByeF9tZWRpYV9pZDsKKwkvKiBTZXQgdGhlIFJ4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLworCXVpbnQzMl90IHR4X21lZGlhX2lkOworCS8qIFNldCB0aGUgVHggdm9jb2RlciB0eXBlLiAoUmVmZXIgdG8gVlNTX01FRElBX0lEX1hYWCkuICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3NlbmRfZW5jX2J1ZmZlcl90IHsKKwl1aW50MzJfdCBtZWRpYV9pZDsKKyAgICAgIC8qIE1lZGlhIElEIG9mIHRoZSBwYWNrZXQuICovCisJdWludDhfdCBwYWNrZXRfZGF0YVtNQVhfVk9DX1BLVF9TSVpFXTsKKyAgICAgIC8qIFBhY2tldCBkYXRhIGJ1ZmZlci4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXN0cmVhbV9ldnRfc2VuZF9kZWNfYnVmZmVyX3QgeworCXVpbnQzMl90IG1lZGlhX2lkOworICAgICAgLyogTWVkaWEgSUQgb2YgdGhlIHBhY2tldC4gKi8KKwl1aW50OF90IHBhY2tldF9kYXRhW01BWF9WT0NfUEtUX1NJWkVdOworICAgICAgLyogUGFja2V0IGRhdGEuICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJfc2V0X2VuY19yYXRlX3QgeworCXVpbnQzMl90IG1vZGU7CisJLyogU2V0IHRoZSBBTVIgZW5jb2RlciByYXRlLgorCSAqCisJICogMHgwMDAwMDAwMCA6IDQuNzUga2JwcworCSAqIDB4MDAwMDAwMDEgOiA1LjE1IGticHMKKwkgKiAweDAwMDAwMDAyIDogNS45MCBrYnBzCisJICogMHgwMDAwMDAwMyA6IDYuNzAga2JwcworCSAqIDB4MDAwMDAwMDQgOiA3LjQwIGticHMKKwkgKiAweDAwMDAwMDA1IDogNy45NSBrYnBzCisJICogMHgwMDAwMDAwNiA6IDEwLjIga2JwcworCSAqIDB4MDAwMDAwMDcgOiAxMi4yIGticHMKKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXN0cmVhbV9jbWRfdm9jX2FtcndiX3NldF9lbmNfcmF0ZV90IHsKKwl1aW50MzJfdCBtb2RlOworCS8qIFNldCB0aGUgQU1SLVdCIGVuY29kZXIgcmF0ZS4KKwkgKgorCSAqIDB4MDAwMDAwMDAgOiAgNi42MCBrYnBzCisJICogMHgwMDAwMDAwMSA6ICA4Ljg1IGticHMKKwkgKiAweDAwMDAwMDAyIDogMTIuNjUga2JwcworCSAqIDB4MDAwMDAwMDMgOiAxNC4yNSBrYnBzCisJICogMHgwMDAwMDAwNCA6IDE1Ljg1IGticHMKKwkgKiAweDAwMDAwMDA1IDogMTguMjUga2JwcworCSAqIDB4MDAwMDAwMDYgOiAxOS44NSBrYnBzCisJICogMHgwMDAwMDAwNyA6IDIzLjA1IGticHMKKwkgKiAweDAwMDAwMDA4IDogMjMuODUga2JwcworCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jZG1hX3NldF9lbmNfbWlubWF4X3JhdGVfdCB7CisJdWludDE2X3QgbWluX3JhdGU7CisJLyogU2V0IHRoZSBsb3dlciBib3VuZCBlbmNvZGVyIHJhdGUuCisJICoKKwkgKiAweDAwMDAgOiBCbGFuayBmcmFtZQorCSAqIDB4MDAwMSA6IEVpZ2h0aCByYXRlCisJICogMHgwMDAyIDogUXVhcnRlciByYXRlCisJICogMHgwMDAzIDogSGFsZiByYXRlCisJICogMHgwMDA0IDogRnVsbCByYXRlCisJICovCisJdWludDE2X3QgbWF4X3JhdGU7CisJLyogU2V0IHRoZSB1cHBlciBib3VuZCBlbmNvZGVyIHJhdGUuCisJICoKKwkgKiAweDAwMDAgOiBCbGFuayBmcmFtZQorCSAqIDB4MDAwMSA6IEVpZ2h0aCByYXRlCisJICogMHgwMDAyIDogUXVhcnRlciByYXRlCisJICogMHgwMDAzIDogSGFsZiByYXRlCisJICogMHgwMDA0IDogRnVsbCByYXRlCisJICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9lbmNfZHR4X21vZGVfdCB7CisJdWludDMyX3QgZW5hYmxlOworCS8qIFRvZ2dsZSBEVFggb24gb3Igb2ZmLgorCSAqCisJICogMCA6IERpc2FibGVzIERUWAorCSAqIDEgOiBFbmFibGVzIERUWAorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pc3RyZWFtX2NtZF9yZWdpc3Rlcl9jYWxpYnJhdGlvbl9kYXRhX3YyX3QgeworCXVpbnQzMl90IGNhbF9tZW1faGFuZGxlOworCS8qIEhhbmRsZSB0byB0aGUgc2hhcmVkIG1lbW9yeSB0aGF0IGhvbGRzIHRoZSBjYWxpYnJhdGlvbiBkYXRhLiAqLworCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7CisJdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKKwkvKiBMb2NhdGlvbiBvZiBjYWxpYnJhdGlvbiBkYXRhLiAqLworCXVpbnQzMl90IGNhbF9tZW1fc2l6ZTsKKwkvKiBTaXplIG9mIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGluIGJ5dGVzLiAqLworCXVpbnQ4X3QgY29sdW1uX2luZm9bTUFYX0NPTF9JTkZPX1NJWkVdOworCS8qCisJICogQ29sdW1uIGluZm8gY29udGFpbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCB0aGUgYXJyYXkgb2YgY29sdW1ucworCSAqIGluIHRoZSBjYWxpYnJhdGlvbiB0YWJsZS4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb2x1bW5zIGFyZSBwcm92aWRlZAorCSAqIGhlcmUgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBleGlzdCBpbiB0aGUgY2FsaWJyYXRpb24KKwkgKiB0YWJsZSBwcm92aWRlZC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3VpX3Byb3BlcnR5X2VuYWJsZV90IHsKKwl1aW50MzJfdCBtb2R1bGVfaWQ7CisJLyogVW5pcXVlIElEIG9mIHRoZSBtb2R1bGUuICovCisJdWludDMyX3QgcGFyYW1faWQ7CisJLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCisJdWludDE2X3QgcGFyYW1fc2l6ZTsKKwkvKiBTaXplIG9mIHRoZSBwYXJhbWV0ZXIgaW4gYnl0ZXM6IE1PRF9FTkFCTEVfUEFSQU1fTEVOICovCisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJLyogUmVzZXJ2ZWQ7IHNldCB0byAwLiAqLworCXVpbnQxNl90IGVuYWJsZTsKKwl1aW50MTZfdCByZXNlcnZlZF9maWVsZDsKKwkvKiBSZXNlcnZlZCwgc2V0IHRvIDAuICovCit9OworCisvKgorICogRXZlbnQgc2VudCBieSB0aGUgc3RyZWFtIHRvIHRoZSBjbGllbnQgdGhhdCBlbmFibGVzIFJ4IERUTUYKKyAqIGRldGVjdGlvbiB3aGVuZXZlciBEVE1GIGlzIGRldGVjdGVkIGluIHRoZSBSeCBwYXRoLgorICoKKyAqIFRoZSBEVE1GIGRldGVjdGlvbiBmZWF0dXJlIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGV0ZWN0IERUTUYKKyAqIGZyZXF1ZW5jaWVzIGFzIGxpc3RlZCBpbiB0aGUgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWRfdAorICogc3RydWN0dXJlLgorICovCisKKyNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1JYX0RUTUZfREVURUNURUQgMHgwMDAxMTAxQQorCitzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9yeF9kdG1mX2RldGVjdGlvbiB7CisJLyoKKwkgKiBFbmFibGVzL2Rpc2FibGVzIFJ4IERUTUYgZGV0ZWN0aW9uCisJICoKKwkgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisJICogMCAtIGRpc2FibGUKKwkgKiAxIC0gZW5hYmxlCisJICoKKwkgKi8KKwl1aW50MzJfdCBlbmFibGU7Cit9OworCisjZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9TRVRfUlhfRFRNRl9ERVRFQ1RJT04gMHgwMDAxMTAyNworCitzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgeworCXVpbnQxNl90IGxvd19mcmVxOworCS8qCisJICogRGV0ZWN0ZWQgbG93IGZyZXF1ZW5jeS4gUG9zc2libGUgdmFsdWVzOgorCSAqIDY5NyBIegorCSAqIDc3MCBIegorCSAqIDg1MiBIegorCSAqIDk0MSBIegorCSAqLworCXVpbnQxNl90IGhpZ2hfZnJlcTsKKwkvKgorCSAqIERldGVjdGVkIGhpZ2ggZnJlcXVlbmN5LiBQb3NzaWJsZSB2YWx1ZXM6CisJICogMTIwOSBIegorCSAqIDEzMzYgSHoKKwkgKiAxNDc3IEh6CisJICogMTYzMyBIegorCSAqLworfTsKKworc3RydWN0IGN2c19zZXRfcnhfZHRtZl9kZXRlY3Rpb25fY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfcnhfZHRtZl9kZXRlY3Rpb24gY3ZzX2R0bWZfZGV0OworfSBfX3BhY2tlZDsKKworCitzdHJ1Y3QgY3ZzX2NyZWF0ZV9wYXNzaXZlX2N0bF9zZXNzaW9uX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfY3JlYXRlX3Bhc3NpdmVfY29udHJvbF9zZXNzaW9uX3QgY3ZzX3Nlc3Npb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZzX2NyZWF0ZV9mdWxsX2N0bF9zZXNzaW9uX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfY3JlYXRlX2Z1bGxfY29udHJvbF9zZXNzaW9uX3QgY3ZzX3Nlc3Npb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZzX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfc2V0X211dGVfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pdm9sdW1lX2NtZF9tdXRlX3YyX3QgY3ZzX3NldF9tdXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2c19zZXRfbWVkaWFfdHlwZV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9tZWRpYV90eXBlX3QgbWVkaWFfdHlwZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfc2VuZF9kZWNfYnVmX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXN0cmVhbV9ldnRfc2VuZF9kZWNfYnVmZmVyX3QgZGVjX2J1ZjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfc2V0X2Ftcl9lbmNfcmF0ZV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJfc2V0X2VuY19yYXRlX3QgYW1yX3JhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZzX3NldF9hbXJ3Yl9lbmNfcmF0ZV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJ3Yl9zZXRfZW5jX3JhdGVfdCBhbXJ3Yl9yYXRlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2c19zZXRfY2RtYV9lbmNfbWlubWF4X3JhdGVfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jZG1hX3NldF9lbmNfbWlubWF4X3JhdGVfdCBjZG1hX3JhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZzX3NldF9lbmNfZHR4X21vZGVfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfZW5jX2R0eF9tb2RlX3QgZHR4X21vZGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZzX3JlZ2lzdGVyX2NhbF9kYXRhX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfcmVnaXN0ZXJfY2FsaWJyYXRpb25fZGF0YV92Ml90IGN2c19jYWxfZGF0YTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfZGVyZWdpc3Rlcl9jYWxfZGF0YV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfc2V0X3BwX2VuYWJsZV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2ljb21tb25fY21kX3NldF91aV9wcm9wZXJ0eV9lbmFibGVfdCB2c3Nfc2V0X3BwOworfSBfX3BhY2tlZDsKK3N0cnVjdCBjdnNfc3RhcnRfcmVjb3JkX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXJlY29yZF9jbWRfc3RhcnRfdCByZWNfbW9kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfc3RhcnRfcGxheWJhY2tfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pcGxheWJhY2tfY21kX3N0YXJ0X3QgcGxheWJhY2tfbW9kZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfZGVjX2J1ZmZlcl9yZWFkeV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnNfZW5jX2J1ZmZlcl9jb25zdW1lZF9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X29vYl9wYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3QgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBtZW1faGFuZGxlOworCXVpbnQzMl90IGVuY19idWZfYWRkcl9sc3c7CisJdWludDMyX3QgZW5jX2J1Zl9hZGRyX21zdzsKKwl1aW50MzJfdCBlbmNfYnVmX3NpemU7CisJdWludDMyX3QgZGVjX2J1Zl9hZGRyX2xzdzsKKwl1aW50MzJfdCBkZWNfYnVmX2FkZHJfbXN3OworCXVpbnQzMl90IGRlY19idWZfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX3QgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwl1aW50MzJfdCBtb2RlOworfSBfX3BhY2tlZDsKKworLyogVE8gQ1ZQIGNvbW1hbmRzICovCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT04JMHgwMDAxMDBDMworLyoqPCBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KKworI2RlZmluZSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTgkJMHgwMDAxMDAzQworCisjZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfU0VUX0RFVklDRV9WMgkJCTB4MDAwMTEyQzYKKworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1NFVF9ERVZJQ0VfVjMJCQkweDAwMDEzMTZBCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9UT1BPTE9HWV9TRVRfREVWX0NIQU5ORUxTCTB4MDAwMTMxOTkKKworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX0NPTU1JVAkJMHgwMDAxMzE5OAorCisjZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfU0VUX1ZQM19EQVRBCQkJMHgwMDAxMTBFQgorCisjZGVmaW5lIFZTU19JVk9MVU1FX0NNRF9TRVRfU1RFUAkJCTB4MDAwMTEyQzIKKworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0VOQUJMRQkJCQkweDAwMDEwMEM2CisvKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLworCisjZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfRElTQUJMRQkJCTB4MDAwMTEwRTEKKy8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCisKKy8qCisgKiBSZWdpc3RlcnMgdGhlIG1lbW9yeSB0aGF0IGNvbnRhaW5zIGRldmljZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEgd2l0aAorICogdGhlIHZvY3Byb2MuIFRoZSBjbGllbnQgbXVzdCByZWdpc3RlciBkZXZpY2UgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlCisgKiB2b2Nwcm9jIHRoYXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgZGV2aWNlIGJlaW5nIHNldCBvbiB0aGUgdm9jcHJvYy4KKyAqLworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RFVklDRV9DT05GSUcJCTB4MDAwMTEzNzEKKworLyoKKyAqIERlcmVnaXN0ZXJzIHRoZSBtZW1vcnkgdGhhdCBob2xkcyBkZXZpY2UgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlCisgIHZvY3Byb2MuCisqLworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfREVWSUNFX0NPTkZJRwkweDAwMDExMzcyCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyCTB4MDAwMTEzNzMKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTI3NgorCisjZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTM3NAorI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTM3NQorCisjZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAgMHgwMDAxMzA3OQorI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgIDB4MDAwMTMwN0EKKworI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQSAgICAgIDB4MDAwMTMwN0IKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQSAgICAweDAwMDEzMDdDCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX05PTkUJCQkweDAwMDEwRjcwCisjZGVmaW5lIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9UWF9TTV9FQ05TCQkweDAwMDEwRjcxCisjZGVmaW5lIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9UWF9ETV9GTFVFTkNFCQkweDAwMDEwRjcyCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX1JYX0RFRkFVTFQJCTB4MDAwMTBGNzcKKworLyogTmV3dHdvcmsgSURzICovCisjZGVmaW5lIFZTU19JQ09NTU9OX0NBTF9ORVRXT1JLX0lEX05PTkUJCTB4MDAwMTEzNUUKKworLyogU2VsZWN0IGludGVybmFsIG1peGluZyBtb2RlLiAqLworI2RlZmluZSBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0lOVF9NSVhJTkcJMHgwMDAxMEY3QworCisvKiBTZWxlY3QgZXh0ZXJuYWwgbWl4aW5nIG1vZGUuICovCisjZGVmaW5lIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfRVhUX01JWElORwkweDAwMDEwRjdECisKKy8qIERlZmF1bHQgQUZFIHBvcnQgSUQuIEFwcGxpY2FibGUgdG8gVHggYW5kIFJ4LiAqLworI2RlZmluZSBWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FCQkweEZGRkYKKworI2RlZmluZSBWU1NfTkVUV09SS19JRF9ERUZBVUxUCQkweDAwMDEwMDM3CisKKy8qIFZvaWNlIG92ZXIgSW50ZXJuZXQgUHJvdG9jb2wgKFZvSVApIG5ldHdvcmsgSUQuIENvbW1vbiBmb3IgYWxsIGJhbmRzLiovCisjZGVmaW5lIFZTU19ORVRXT1JLX0lEX1ZPSVAJCTB4MDAwMTEzNjIKKworLyogTWVkaWEgdHlwZXMgKi8KKyNkZWZpbmUgVlNTX01FRElBX0lEX0VWUkNfTU9ERU0JCTB4MDAwMTBGQzIKKy8qIDgwLVZGNjkwLTQ3IENETUEgZW5oYW5jZWQgdmFyaWFibGUgcmF0ZSB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KKyNkZWZpbmUgVlNTX01FRElBX0lEX0FNUl9OQl9NT0RFTQkweDAwMDEwRkM2CisvKiA4MC1WRjY5MC00NyBVTVRTIEFNUi1OQiB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KKyNkZWZpbmUgVlNTX01FRElBX0lEX0FNUl9XQl9NT0RFTQkweDAwMDEwRkM3CisvKiA4MC1WRjY5MC00NyBVTVRTIEFNUi1XQiB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KKworI2RlZmluZSBWU1NfTUVESUFfSURfUENNXzhfS0haCQkweDAwMDEwRkNCCisjZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fMTZfS0haCQkweDAwMDEwRkNDCisjZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fMzJfS0haCQkweDAwMDEwRkQ5CisjZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fNDhfS0haCQkweDAwMDEwRkQ2CisKKy8qIExpbmVhciBQQ00gKDE2LWJpdCwgbGl0dGxlLWVuZGlhbikuICovCisjZGVmaW5lIFZTU19NRURJQV9JRF9HNzExX0FMQVcJCTB4MDAwMTBGQ0QKKy8qIEcuNzExIGEtbGF3IChjb250YWlucyB0d28gMTBtcyB2b2NvZGVyIGZyYW1lcykuICovCisjZGVmaW5lIFZTU19NRURJQV9JRF9HNzExX01VTEFXCQkweDAwMDEwRkNFCisvKiBHLjcxMSBtdS1sYXcgKGNvbnRhaW5zIHR3byAxMG1zIHZvY29kZXIgZnJhbWVzKS4gKi8KKyNkZWZpbmUgVlNTX01FRElBX0lEX0c3MjkJCTB4MDAwMTBGRDAKKy8qIEcuNzI5QUIgKGNvbnRhaW5zIHR3byAxMG1zIHZvY29kZXIgZnJhbWVzLiAqLworI2RlZmluZSBWU1NfTUVESUFfSURfNEdWX05CX01PREVNCTB4MDAwMTBGQzMKKy8qQ0RNQSBFVlJDLUIgdm9jb2RlciBtb2RlbSBmb3JtYXQgKi8KKyNkZWZpbmUgVlNTX01FRElBX0lEXzRHVl9XQl9NT0RFTQkweDAwMDEwRkM0CisvKkNETUEgRVZSQy1XQiB2b2NvZGVyIG1vZGVtIGZvcm1hdCAqLworI2RlZmluZSBWU1NfTUVESUFfSURfNEdWX05XX01PREVNCTB4MDAwMTBGQzUKKy8qQ0RNQSBFVlJDLU5XIHZvY29kZXIgbW9kZW0gZm9ybWF0ICovCisKKyNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjIJMHgwMDAxMTJCRgorI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0NSRUFURV9GVUxMX0NPTlRST0xfU0VTU0lPTl9WMwkweDAwMDEzMTY5CisKKyNkZWZpbmUgVlNTX05VTV9ERVZfQ0hBTk5FTFNfMSAxCisjZGVmaW5lIFZTU19OVU1fREVWX0NIQU5ORUxTXzIgMgorI2RlZmluZSBWU1NfTlVNX0RFVl9DSEFOTkVMU18zIDMKKyNkZWZpbmUgVlNTX05VTV9ERVZfQ0hBTk5FTFNfNCA0CisKK3N0cnVjdCB2c3NfaXZvY3Byb2NfY21kX2NyZWF0ZV9mdWxsX2NvbnRyb2xfc2Vzc2lvbl92Ml90IHsKKwl1aW50MTZfdCBkaXJlY3Rpb247CisJLyoKKwkgKiBWb2Nwcm9jIGRpcmVjdGlvbi4gVGhlIHN1cHBvcnRlZCB2YWx1ZXM6CisJICogVlNTX0lWT0NQUk9DX0RJUkVDVElPTl9SWAorCSAqIFZTU19JVk9DUFJPQ19ESVJFQ1RJT05fVFgKKwkgKiBWU1NfSVZPQ1BST0NfRElSRUNUSU9OX1JYX1RYCisJICovCisJdWludDE2X3QgdHhfcG9ydF9pZDsKKwkvKgorCSAqIFR4IGRldmljZSBwb3J0IElEIHRvIHdoaWNoIHRoZSB2b2Nwcm9jIGNvbm5lY3RzLiBJZiBhIHBvcnQgSUQgaXMKKwkgKiBub3QgYmVpbmcgc3VwcGxpZWQsIHNldCB0aGlzIHRvICNWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FLgorCSAqLworCXVpbnQzMl90IHR4X3RvcG9sb2d5X2lkOworCS8qCisJICogVHggcGF0aCB0b3BvbG9neSBJRC4gSWYgYSB0b3BvbG9neSBJRCBpcyBub3QgYmVpbmcgc3VwcGxpZWQsIHNldAorCSAqIHRoaXMgdG8gI1ZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FLgorCSAqLworCXVpbnQxNl90IHJ4X3BvcnRfaWQ7CisJLyoKKwkgKiBSeCBkZXZpY2UgcG9ydCBJRCB0byB3aGljaCB0aGUgdm9jcHJvYyBjb25uZWN0cy4gSWYgYSBwb3J0IElEIGlzCisJICogbm90IGJlaW5nIHN1cHBsaWVkLCBzZXQgdGhpcyB0byAjVlNTX0lWT0NQUk9DX1BPUlRfSURfTk9ORS4KKwkgKi8KKwl1aW50MzJfdCByeF90b3BvbG9neV9pZDsKKwkvKgorCSAqIFJ4IHBhdGggdG9wb2xvZ3kgSUQuIElmIGEgdG9wb2xvZ3kgSUQgaXMgbm90IGJlaW5nIHN1cHBsaWVkLCBzZXQKKwkgKiB0aGlzIHRvICNWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfTk9ORS4KKwkgKi8KKwl1aW50MzJfdCBwcm9maWxlX2lkOworCS8qIFZvaWNlIGNhbGlicmF0aW9uIHByb2ZpbGUgSUQuICovCisJdWludDMyX3Qgdm9jcHJvY19tb2RlOworCS8qCisJICogVm9jcHJvYyBtb2RlLiBUaGUgc3VwcG9ydGVkIHZhbHVlczoKKwkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0lOVF9NSVhJTkcKKwkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkcKKwkgKi8KKwl1aW50MTZfdCBlY19yZWZfcG9ydF9pZDsKKwkvKgorCSAqIFBvcnQgSUQgdG8gd2hpY2ggdGhlIHZvY3Byb2MgY29ubmVjdHMgZm9yIHJlY2VpdmluZyBlY2hvCisJICogY2FuY2VsbGF0aW9uIHJlZmVyZW5jZSBzaWduYWwuIElmIGEgcG9ydCBJRCBpcyBub3QgYmVpbmcgc3VwcGxpZWQsCisJICogc2V0IHRoaXMgdG8gI1ZTU19JVk9DUFJPQ19QT1JUX0lEX05PTkUuIFRoaXMgcGFyYW1ldGVyIHZhbHVlIGlzCisJICogaWdub3JlZCB3aGVuIHRoZSB2b2Nwcm9jX21vZGUgcGFyYW1ldGVyIGlzIHNldCB0bworCSAqIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORy4KKwkgKi8KKwljaGFyIG5hbWVbU0VTU0lPTl9OQU1FX0xFTl07CisJLyoKKwkgKiBTZXNzaW9uIG5hbWUgc3RyaW5nIHVzZWQgdG8gaWRlbnRpZnkgYSBzZXNzaW9uIHRoYXQgY2FuIGJlIHNoYXJlZAorCSAqIHdpdGggcGFzc2l2ZSBjb250cm9sbGVycyAob3B0aW9uYWwpLiBUaGUgc3RyaW5nIHNpemUsIGluY2x1ZGluZyB0aGUKKwkgKiBOVUxMIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgaXMgbGltaXRlZCB0byAzMSBjaGFyYWN0ZXJzLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X3ZvbHVtZV9pbmRleF90IHsKKwl1aW50MTZfdCB2b2xfaW5kZXg7CisJLyoKKwkgKiBWb2x1bWUgaW5kZXggdXRpbGl6ZWQgYnkgdGhlIHZvY3Byb2MgdG8gaW5kZXggaW50byB0aGUgdm9sdW1lIHRhYmxlCisJICogcHJvdmlkZWQgaW4gVlNTX0lWT0NQUk9DX0NNRF9DQUNIRV9WT0xVTUVfQ0FMSUJSQVRJT05fVEFCTEUgYW5kIHNldAorCSAqIHZvbHVtZSBvbiB0aGUgVkRTUC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXZvbHVtZV9jbWRfc2V0X3N0ZXBfdCB7CisJdWludDE2X3QgZGlyZWN0aW9uOworCS8qCisJICogVGhlIGRpcmVjdGlvbiBmaWVsZCBzZXRzIHRoZSBkaXJlY3Rpb24gdG8gYXBwbHkgdGhlIHZvbHVtZSBjb21tYW5kLgorCSAqIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgorCSAqICNWU1NfSVZPTFVNRV9ESVJFQ1RJT05fUlgKKwkgKi8KKwl1aW50MzJfdCB2YWx1ZTsKKwkvKgorCSAqIFZvbHVtZSBzdGVwIHVzZWQgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBsaW5lYXIgdm9sdW1lIGFuZAorCSAqIHRoZSBiZXN0IG1hdGNoIGluZGV4IGluIHRoZSByZWdpc3RlcmVkIHZvbHVtZSBjYWxpYnJhdGlvbiB0YWJsZS4KKwkgKi8KKwl1aW50MTZfdCByYW1wX2R1cmF0aW9uX21zOworCS8qCisJICogVm9sdW1lIGNoYW5nZSByYW1wIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKwkgKiBUaGUgc3VwcG9ydGVkIHZhbHVlczogMCB0byA1MDAwLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X2RldmljZV92Ml90IHsKKwl1aW50MTZfdCB0eF9wb3J0X2lkOworCS8qCisJICogVFggZGV2aWNlIHBvcnQgSUQgd2hpY2ggdm9jcHJvYyB3aWxsIGNvbm5lY3QgdG8uCisJICogVlNTX0lWT0NQUk9DX1BPUlRfSURfTk9ORSBtZWFucyB2b2Nwcm9jIHdpbGwgbm90IGNvbm5lY3QgdG8gYW55IHBvcnQuCisJICovCisJdWludDMyX3QgdHhfdG9wb2xvZ3lfaWQ7CisJLyoKKwkgKiBUWCBsZWcgdG9wb2xvZ3kgSUQuCisJICogVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX05PTkUgbWVhbnMgdm9jcHJvYyBkb2VzIG5vdCBjb250YWluIGFueQorCSAqIHByZS9wb3N0LXByb2Nlc3NpbmcgYmxvY2tzIGFuZCBpcyBwYXNzLXRocm91Z2guCisJICovCisJdWludDE2X3QgcnhfcG9ydF9pZDsKKwkvKgorCSAqIFJYIGRldmljZSBwb3J0IElEIHdoaWNoIHZvY3Byb2Mgd2lsbCBjb25uZWN0IHRvLgorCSAqIFZTU19JVk9DUFJPQ19QT1JUX0lEX05PTkUgbWVhbnMgdm9jcHJvYyB3aWxsIG5vdCBjb25uZWN0IHRvIGFueSBwb3J0LgorCSAqLworCXVpbnQzMl90IHJ4X3RvcG9sb2d5X2lkOworCS8qCisJICogUlggbGVnIHRvcG9sb2d5IElELgorCSAqIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FIG1lYW5zIHZvY3Byb2MgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiBwcmUvcG9zdC1wcm9jZXNzaW5nIGJsb2NrcyBhbmQgaXMgcGFzcy10aHJvdWdoLgorCSAqLworCXVpbnQzMl90IHZvY3Byb2NfbW9kZTsKKwkvKiBWb2Nwcm9jIG1vZGUuIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgorCSAqIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORyAtIDB4MDAwMTBGN0MKKwkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkcgLSAweDAwMDEwRjdECisJICovCisJdWludDE2X3QgZWNfcmVmX3BvcnRfaWQ7CisJLyogUG9ydCBJRCB0byB3aGljaCB0aGUgdm9jcHJvYyBjb25uZWN0cyBmb3IgcmVjZWl2aW5nCisJICogZWNobworCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pdm9jcHJvY19jbWRfcmVnaXN0ZXJfZGV2aWNlX2NvbmZpZ190IHsKKwl1aW50MzJfdCBtZW1faGFuZGxlOworCS8qCisJICogSGFuZGxlIHRvIHRoZSBzaGFyZWQgbWVtb3J5IHRoYXQgaG9sZHMgdGhlIHBlci1uZXR3b3JrIGNhbGlicmF0aW9uCisJICogZGF0YS4KKwkgKi8KKwl1aW50MzJfdCBtZW1fYWRkcmVzc19sc3c7CisJdWludDMyX3QgbWVtX2FkZHJlc3NfbXN3OworCS8qIExvY2F0aW9uIG9mIGNhbGlicmF0aW9uIGRhdGEuICovCisJdWludDMyX3QgbWVtX3NpemU7CisJLyogU2l6ZSBvZiB0aGUgY2FsaWJyYXRpb24gZGF0YSBpbiBieXRlcy4gKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX2NhbGlicmF0aW9uX2RhdGFfdjJfdCB7CisJdWludDMyX3QgY2FsX21lbV9oYW5kbGU7CisJLyoKKwkgKiBIYW5kbGUgdG8gdGhlIHNoYXJlZCBtZW1vcnkgdGhhdCBob2xkcyB0aGUgcGVyLW5ldHdvcmsgY2FsaWJyYXRpb24KKwkgKiBkYXRhLgorCSAqLworCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7CisJdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKKwkvKiBMb2NhdGlvbiBvZiBjYWxpYnJhdGlvbiBkYXRhLiAqLworCXVpbnQzMl90IGNhbF9tZW1fc2l6ZTsKKwkvKiBTaXplIG9mIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGluIGJ5dGVzLiAqLworCXVpbnQ4X3QgY29sdW1uX2luZm9bTUFYX0NPTF9JTkZPX1NJWkVdOworCS8qCisJICogQ29sdW1uIGluZm8gY29udGFpbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCB0aGUgYXJyYXkgb2YgY29sdW1ucworCSAqIGluIHRoZSBjYWxpYnJhdGlvbiB0YWJsZS4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb2x1bW5zIGFyZSBwcm92aWRlZAorCSAqIGhlcmUgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBleGlzdCBpbiB0aGUgY2FsaWJyYXRpb24KKwkgKiB0YWJsZSBwcm92aWRlZC4KKwkgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX3ZvbHVtZV9jYWxfZGF0YV90IHsKKwl1aW50MzJfdCBjYWxfbWVtX2hhbmRsZTsKKwkvKgorCSAqIEhhbmRsZSB0byB0aGUgc2hhcmVkIG1lbW9yeSB0aGF0IGhvbGRzIHRoZSB2b2x1bWUgY2FsaWJyYXRpb24KKwkgKiBkYXRhLgorCSAqLworCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7CisJdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKKwkvKiBMb2NhdGlvbiBvZiB2b2x1bWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KKwl1aW50MzJfdCBjYWxfbWVtX3NpemU7CisJLyogU2l6ZSBvZiB0aGUgdm9sdW1lIGNhbGlicmF0aW9uIGRhdGEgaW4gYnl0ZXMuICovCisJdWludDhfdCBjb2x1bW5faW5mb1tNQVhfQ09MX0lORk9fU0laRV07CisJLyoKKwkgKiBDb2x1bW4gaW5mbyBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZSBhcnJheSBvZiBjb2x1bW5zCisJICogaW4gdGhlIGNhbGlicmF0aW9uIHRhYmxlLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbHVtbnMgYXJlIHByb3ZpZGVkCisJICogaGVyZSBtdXN0IG1hdGNoIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGV4aXN0IGluIHRoZSBjYWxpYnJhdGlvbgorCSAqIHRhYmxlIHByb3ZpZGVkLgorCSAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IHZzc19pdm9jcHJvY19jbWRfdG9wb2xvZ3lfc2V0X2Rldl9jaGFubmVsc190IHsKKwl1aW50MTZfdCB0eF9udW1fY2hhbm5lbHM7CisJLyoKKwkgKiBOdW1iZXIgb2YgTWljcy4KKwkgKiBTdXBwb3J0ZWQgdmFsdWVzCisJICogMSAgVlNTX05VTV9ERVZfQ0hBTk5FTFNfMQorCSAqIDIgIFZTU19OVU1fREVWX0NIQU5ORUxTXzIKKwkgKiAzICBWU1NfTlVNX0RFVl9DSEFOTkVMU18zCisJICogNCAgVlNTX05VTV9ERVZfQ0hBTk5FTFNfNAorCSAqLworCXVpbnQxNl90IHJ4X251bV9jaGFubmVsczsKKwkvKgorCSAqIE51bWJlciBvZiBzcGVha2VyIGNoYW5uZWxzLgorCSAqIFN1cHBvcnRlZCB2YWx1ZXMKKwkgKiAxIFZTU19OVU1fREVWX0NIQU5ORUxTXzEKKwkgKi8KK30gX19wYWNrZWQ7CisKKy8qIFN0YXJ0cyBhIHZvY29kZXIgUENNIHNlc3Npb24gKi8KKyNkZWZpbmUgVlNTX0lWUENNX0NNRF9TVEFSVF9WMgkweDAwMDExMzM5CisKKy8qIERlZmF1bHQgdGFwIHBvaW50IGxvY2F0aW9uIG9uIHRoZSBUWCBwYXRoLiAqLworI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX1RYX0RFRkFVTFQJMHgwMDAxMTI4OQorCisvKiBEZWZhdWx0IHRhcCBwb2ludCBsb2NhdGlvbiBvbiB0aGUgUlggcGF0aC4gKi8KKyNkZWZpbmUgVlNTX0lWUENNX1RBUF9QT0lOVF9SWF9ERUZBVUxUCTB4MDAwMTEyOEEKKworLyogSW5kaWNhdGVzIHRhcCBwb2ludCBkaXJlY3Rpb24gaXMgb3V0cHV0LiAqLworI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVQJMAorCisvKiBJbmRpY2F0ZXMgdGFwIHBvaW50IGRpcmVjdGlvbiBpcyBpbnB1dC4gKi8KKyNkZWZpbmUgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfSU4JMQorCisvKiBJbmRpY2F0ZXMgdGFwIHBvaW50IGRpcmVjdGlvbiBpcyBvdXRwdXQgYW5kIGlucHV0LiAqLworI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVRfSU4JMgorCisKKyNkZWZpbmUgVlNTX0lWUENNX1NBTVBMSU5HX1JBVEVfQVVUTwkwCisKKy8qIEluZGljYXRlcyA4IEtIeiB2b2NvZGVyIFBDTSBzYW1wbGluZyByYXRlLiAqLworI2RlZmluZSBWU1NfSVZQQ01fU0FNUExJTkdfUkFURV84Swk4MDAwCisKKy8qIEluZGljYXRlcyAxNiBLSHogdm9jb2RlciBQQ00gc2FtcGxpbmcgcmF0ZS4gKi8KKyNkZWZpbmUgVlNTX0lWUENNX1NBTVBMSU5HX1JBVEVfMTZLCTE2MDAwCisKKy8qIFJYIGFuZCBUWCAqLworI2RlZmluZSBNQVhfVEFQX1BPSU5UU19TVVBQT1JURUQJMgorCitzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCB7CisJdWludDMyX3QgdGFwX3BvaW50OworCXVpbnQxNl90IGRpcmVjdGlvbjsKKwl1aW50MTZfdCBzYW1wbGluZ19yYXRlOworCXVpbnQxNl90IGR1cmF0aW9uOworfSBfX3BhY2tlZDsKKworCitzdHJ1Y3QgdnNzX2l2cGNtX2NtZF9zdGFydF92Ml90IHsKKwl1aW50MzJfdCBtZW1faGFuZGxlOworCXVpbnQzMl90IG51bV90YXBfcG9pbnRzOworCXN0cnVjdCB2c3NfaXZwY21fdGFwX3BvaW50IHRhcF9wb2ludHNbTUFYX1RBUF9QT0lOVFNfU1VQUE9SVEVEXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgVlNTX0lWUENNX0VWVF9QVVNIX0JVRkZFUl9WMgkweDAwMDExMzNBCisKKy8qIFB1c2ggYnVmZmVyIGV2ZW50IG1hc2sgaW5kaWNhdGluZyBvdXRwdXQgYnVmZmVyIGlzIGZpbGxlZC4gKi8KKyNkZWZpbmUgVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUiAxCisKKy8qIFB1c2ggYnVmZmVyIGV2ZW50IG1hc2sgaW5kaWNhdGluZyBpbnB1dCBidWZmZXIgaXMgY29uc3VtZWQuICovCisjZGVmaW5lIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX0lOUFVUX0JVRkZFUiAyCisKKworc3RydWN0IHZzc19pdnBjbV9ldnRfcHVzaF9idWZmZXJfdjJfdCB7CisJdWludDMyX3QgdGFwX3BvaW50OworCXVpbnQzMl90IHB1c2hfYnVmX21hc2s7CisJdWludDY0X3Qgb3V0X2J1Zl9tZW1fYWRkcmVzczsKKwl1aW50MTZfdCBvdXRfYnVmX21lbV9zaXplOworCXVpbnQ2NF90IGluX2J1Zl9tZW1fYWRkcmVzczsKKwl1aW50MTZfdCBpbl9idWZfbWVtX3NpemU7CisJdWludDE2X3Qgc2FtcGxpbmdfcmF0ZTsKKwl1aW50MTZfdCBudW1faW5fY2hhbm5lbHM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFZTU19JVlBDTV9FVlRfTk9USUZZX1YyIDB4MDAwMTEzM0IKKworLyogTm90aWZ5IGV2ZW50IG1hc2sgaW5kaWNhdGVzIG91dHB1dCBidWZmZXIgaXMgZmlsbGVkLiAqLworI2RlZmluZSBWU1NfSVZQQ01fTk9USUZZX01BU0tfT1VUUFVUX0JVRkZFUiAxCisKKy8qIE5vdGlmeSBldmVudCBtYXNrIGluZGljYXRlcyBpbnB1dCBidWZmZXIgaXMgY29uc3VtZWQuICovCisjZGVmaW5lIFZTU19JVlBDTV9OT1RJRllfTUFTS19JTlBVVF9CVUZGRVIgMgorCisvKiBOb3RpZnkgZXZlbnQgbWFzayBpbmRpY2F0ZXMgYSB0aW1ldGljayAqLworI2RlZmluZSBWU1NfSVZQQ01fTk9USUZZX01BU0tfVElNRVRJQ0sgNAorCisvKiBOb3RpZnkgZXZlbnQgbWFzayBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgaW4gb3V0cHV0IGJ1ZmZlciBvcGVyYXRpb24gKi8KKyNkZWZpbmUgVlNTX0lWUENNX05PVElGWV9NQVNLX09VVFBVVF9FUlJPUiA4CisKKy8qIE5vdGlmeSBldmVudCBtYXNrIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCBpbiBpbnB1dCBidWZmZXIgb3BlcmF0aW9uICovCisjZGVmaW5lIFZTU19JVlBDTV9OT1RJRllfTUFTS19JTlBVVF9FUlJPUiAxNgorCisKK3N0cnVjdCB2c3NfaXZwY21fZXZ0X25vdGlmeV92Ml90IHsKKwl1aW50MzJfdCB0YXBfcG9pbnQ7CisJdWludDMyX3Qgbm90aWZ5X21hc2s7CisJdWludDY0X3Qgb3V0X2J1ZmZfYWRkcjsKKwl1aW50NjRfdCBpbl9idWZmX2FkZHI7CisJdWludDE2X3QgZmlsbGVkX291dF9zaXplOworCXVpbnQxNl90IHJlcXVlc3RfYnVmX3NpemU7CisJdWludDE2X3Qgc2FtcGxpbmdfcmF0ZTsKKwl1aW50MTZfdCBudW1fb3V0X2NoYW5uZWxzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9zdGFydF9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2l2cGNtX2NtZF9zdGFydF92Ml90IHZwY21fc3RhcnRfY21kOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9wdXNoX2J1Zl9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9wdXNoX2J1ZmZlcl92Ml90IHZwY21fZXZ0X3B1c2hfYnVmZmVyOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBWU1NfSVZQQ01fQ01EX1NUT1AgMHgwMDAxMTAwQgorCitzdHJ1Y3QgY3ZwX2NyZWF0ZV9mdWxsX2N0bF9zZXNzaW9uX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX2NyZWF0ZV9mdWxsX2NvbnRyb2xfc2Vzc2lvbl92Ml90IGN2cF9zZXNzaW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9jb21tYW5kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZwX3NldF9kZXZpY2VfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X2RldmljZV92Ml90IGN2cF9zZXRfZGV2aWNlX3YyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9zZXRfZGV2X2NoYW5uZWxzX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3RvcG9sb2d5X3NldF9kZXZfY2hhbm5lbHNfdCBjdnBfc2V0X2NoYW5uZWxzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9zZXRfdnAzX2RhdGFfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZwX3NldF9yeF92b2x1bWVfaW5kZXhfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X3ZvbHVtZV9pbmRleF90IGN2cF9zZXRfdm9sX2lkeDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnBfc2V0X3J4X3ZvbHVtZV9zdGVwX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXZvbHVtZV9jbWRfc2V0X3N0ZXBfdCBjdnBfc2V0X3ZvbF9zdGVwOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9yZWdpc3Rlcl9kZXZfY2ZnX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX2RldmljZV9jb25maWdfdCBjdnBfZGV2X2NmZ19kYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZwX3JlZ2lzdGVyX2NhbF9kYXRhX2NtZCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX2NhbGlicmF0aW9uX2RhdGFfdjJfdCBjdnBfY2FsX2RhdGE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZwX2RlcmVnaXN0ZXJfY2FsX2RhdGFfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY3ZwX3JlZ2lzdGVyX3ZvbF9jYWxfZGF0YV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2l2b2Nwcm9jX2NtZF9yZWdpc3Rlcl92b2x1bWVfY2FsX2RhdGFfdCBjdnBfdm9sX2NhbF9kYXRhOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfZGF0YV9jbWQgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnBfc2V0X211dGVfY21kIHsKKwlzdHJ1Y3QgYXByX2hkciBoZHI7CisJc3RydWN0IHZzc19pdm9sdW1lX2NtZF9tdXRlX3YyX3QgY3ZwX3NldF9tdXRlOworfSBfX3BhY2tlZDsKKworLyogQ0IgZm9yIHVwLWxpbmsgcGFja2V0cy4gKi8KK3R5cGVkZWYgdm9pZCAoKnVsX2NiX2ZuKSh1aW50OF90ICp2b2NfcGt0LAorCQkJIHVpbnQzMl90IHBrdF9sZW4sCisJCQkgdWludDMyX3QgdGltZXN0YW1wLAorCQkJIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKKy8qIENCIGZvciBkb3duLWxpbmsgcGFja2V0cy4gKi8KK3R5cGVkZWYgdm9pZCAoKmRsX2NiX2ZuKSh1aW50OF90ICp2b2NfcGt0LAorCQkJIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKKy8qIENCIGZvciBEVE1GIFJYIERldGVjdGlvbiAqLwordHlwZWRlZiB2b2lkICgqZHRtZl9yeF9kZXRfY2JfZm4pKHVpbnQ4X3QgKnBrdCwKKwkJCQkgIGNoYXIgKnNlc3Npb24sCisJCQkJICB2b2lkICpwcml2YXRlX2RhdGEpOworCit0eXBlZGVmIHZvaWQgKCp2b2lwX3Nzcl9jYikgKHVpbnQzMl90IG9wY29kZSwKKwkJCQl2b2lkICpwcml2YXRlX2RhdGEpOworCit0eXBlZGVmIHZvaWQgKCpob3N0cGNtX2NiX2ZuKSh1aW50OF90ICpkYXRhLAorCQkJICAgY2hhciAqc2Vzc2lvbiwKKwkJCSAgIHZvaWQgKnByaXZhdGVfZGF0YSk7CisKK3N0cnVjdCBtdnNfZHJpdmVyX2luZm8geworCXVpbnQzMl90IG1lZGlhX3R5cGU7CisJdWludDMyX3QgcmF0ZTsKKwl1aW50MzJfdCBuZXR3b3JrX3R5cGU7CisJdWludDMyX3QgZHR4X21vZGU7CisJdWxfY2JfZm4gdWxfY2I7CisJZGxfY2JfZm4gZGxfY2I7CisJdm9pcF9zc3JfY2Igc3NyX2NiOworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBldnJjX21pbl9yYXRlOworCXVpbnQzMl90IGV2cmNfbWF4X3JhdGU7Cit9OworCitzdHJ1Y3QgZHRtZl9kcml2ZXJfaW5mbyB7CisJZHRtZl9yeF9kZXRfY2JfZm4gZHRtZl9yeF91bF9jYjsKKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9OworCitzdHJ1Y3QgaG9zdHBjbV9kcml2ZXJfaW5mbyB7CisJaG9zdHBjbV9jYl9mbiBob3N0cGNtX2V2dF9jYjsKKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9OworCitzdHJ1Y3QgaW5jYWxsX3JlY19pbmZvIHsKKwl1aW50MzJfdCByZWNfZW5hYmxlOworCXVpbnQzMl90IHJlY19tb2RlOworCXVpbnQzMl90IHJlY29yZGluZzsKK307CisKK3N0cnVjdCBpbmNhbGxfbXVzaWNfaW5mbyB7CisJdWludDMyX3QgcGxheV9lbmFibGU7CisJdWludDMyX3QgcGxheWluZzsKKwlpbnQgY291bnQ7CisJaW50IGZvcmNlOworCXVpbnQxNl90IHBvcnRfaWQ7Cit9OworCitzdHJ1Y3Qgc2hhcmVfbWVtb3J5X2luZm8geworCXUzMgkJCW1lbV9oYW5kbGU7CisJc3RydWN0IHNoYXJlX21lbV9idWYJc2hfYnVmOworCXN0cnVjdCBtZW1fbWFwX3RhYmxlCW1lbXRibDsKK307CisKKyNkZWZpbmUgVlNTX0lTT1VOREZPQ1VTX0NNRF9TRVRfU0VDVE9SUyAgICAgMHgwMDAxMzEzMworI2RlZmluZSBWU1NfSVNPVU5ERk9DVVNfQ01EX0dFVF9TRUNUT1JTICAgICAweDAwMDEzMTM0CisjZGVmaW5lIFZTU19JU09VTkRGT0NVU19SU1BfR0VUX1NFQ1RPUlMgICAgIDB4MDAwMTMxMzUKKyNkZWZpbmUgVlNTX0lTT1VSQ0VUUkFDS19DTURfR0VUX0FDVElWSVRZICAgMHgwMDAxMzEzNgorCitzdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX2NtZF9zZXRfc2VjdG9yc190IHsKKwl1aW50MTZfdCBzdGFydF9hbmdsZXNbOF07CisJdWludDhfdCBlbmFibGVzWzhdOworCXVpbnQxNl90IGdhaW5fc3RlcDsKK30gX19wYWNrZWQ7CisKKy8qIFBheWxvYWQgb2YgdGhlIFZTU19JU09VTkRGT0NVU19SU1BfR0VUX1NFQ1RPUlMgcmVzcG9uc2UgKi8KK3N0cnVjdCB2c3NfaXNvdW5kZm9jdXNfcnNwX2dldF9zZWN0b3JzX3QgeworCXVpbnQxNl90IHN0YXJ0X2FuZ2xlc1s4XTsKKwl1aW50OF90IGVuYWJsZXNbOF07CisJdWludDE2X3QgZ2Fpbl9zdGVwOworfSBfX3BhY2tlZDsKKworc3RydWN0IGN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kX3QgeworCXN0cnVjdCBhcHJfaGRyIGhkcjsKKwlzdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX2NtZF9zZXRfc2VjdG9yc190IGN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW07Cit9IF9fcGFja2VkOworCisvKiBQYXlsb2FkIHN0cnVjdHVyZSBmb3IgdGhlIFZTU19JU09VUkNFVFJBQ0tfQ01EX0dFVF9BQ1RJVklUWSBjb21tYW5kICovCitzdHJ1Y3QgdnNzX2lzb3VyY2V0cmFja19jbWRfZ2V0X2FjdGl2aXR5X3QgeworCXVpbnQzMl90IG1lbV9oYW5kbGU7CisJdWludDMyX3QgbWVtX2FkZHJlc3NfbHN3OworCXVpbnQzMl90IG1lbV9hZGRyZXNzX21zdzsKKwl1aW50MzJfdCBtZW1fc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbV9jbWRfdCB7CisJc3RydWN0IGFwcl9oZHIgaGRyOworCXN0cnVjdCB2c3NfaXNvdXJjZXRyYWNrX2NtZF9nZXRfYWN0aXZpdHlfdAorCQkJY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW07Cit9IF9fcGFja2VkOworCisvKiBTdHJ1Y3R1cmUgZm9yIHRoZSBzb3VuZCBhY3Rpdml0eSBkYXRhICovCitzdHJ1Y3QgdnNzX2lzb3VyY2V0cmFja19hY3Rpdml0eV9kYXRhX3QgeworCXVpbnQ4X3Qgdm9pY2VfYWN0aXZlWzhdOworCXVpbnQxNl90IHRhbGtlcl9kb2E7CisJdWludDE2X3QgaW50ZXJmZXJlcl9kb2FbM107CisJdWludDhfdCBzb3VuZF9zdHJlbmd0aFszNjBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNoYXJlZF9tZW1faW5mbyB7CisJdWludDMyX3QgbWVtX2hhbmRsZTsKKwlzdHJ1Y3QgbWVtX21hcF90YWJsZSBzaF9tZW1fYmxvY2s7CisJc3RydWN0IG1lbV9tYXBfdGFibGUgc2hfbWVtX3RhYmxlOworfTsKKworc3RydWN0IHZvaWNlX2RhdGEgeworCWludCB2b2Nfc3RhdGU7LypJTklULCBDSEFOR0UsIFJFTEVBU0UsIFJVTiAqLworCisJLyogU2hhcmVkIG1lbSB0byBzdG9yZSBkZWNvZGVyIGFuZCBlbmNvZGVyIHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc2hhcmVfbWVtb3J5X2luZm8Jc2htZW1faW5mbzsKKworCXdhaXRfcXVldWVfaGVhZF90IG12bV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGN2c193YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGN2cF93YWl0OworCisJLyogQ2FjaGUgdGhlIHZhbHVlcyByZWxhdGVkIHRvIFJ4IGFuZCBUeCBkZXZpY2VzICovCisJc3RydWN0IGRldmljZV9kYXRhIGRldl9yeDsKKwlzdHJ1Y3QgZGV2aWNlX2RhdGEgZGV2X3R4OworCisJLyogQ2FjaGUgdGhlIHZhbHVlcyByZWxhdGVkIHRvIFJ4IGFuZCBUeCBzdHJlYW1zICovCisJc3RydWN0IHN0cmVhbV9kYXRhIHN0cmVhbV9yeDsKKwlzdHJ1Y3Qgc3RyZWFtX2RhdGEgc3RyZWFtX3R4OworCisJdTMyIG12bV9zdGF0ZTsKKwl1MzIgY3ZzX3N0YXRlOworCXUzMiBjdnBfc3RhdGU7CisKKwl1MzIgYXN5bmNfZXJyOworCisJLyogSGFuZGxlIHRvIE1WTSBpbiB0aGUgUTYgKi8KKwl1MTYgbXZtX2hhbmRsZTsKKwkvKiBIYW5kbGUgdG8gQ1ZTIGluIHRoZSBRNiAqLworCXUxNiBjdnNfaGFuZGxlOworCS8qIEhhbmRsZSB0byBDVlAgaW4gdGhlIFE2ICovCisJdTE2IGN2cF9oYW5kbGU7CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCWJvb2wgZGlzYWJsZV90b3BvbG9neTsKKworCXVpbnQxNl90IHNpZGV0b25lX2dhaW47CisJdWludDhfdCB0dHlfbW9kZTsKKwkvKiBzbG93dGFsayBlbmFibGUgdmFsdWUgKi8KKwl1aW50MzJfdCBzdF9lbmFibGU7CisJdWludDMyX3QgaGRfZW5hYmxlOworCXVpbnQzMl90IGR0bWZfcnhfZGV0ZWN0X2VuOworCS8qIExvY2FsIENhbGwgSG9sZCBtb2RlICovCisJdWludDhfdCBsY2hfbW9kZTsKKworCXN0cnVjdCB2b2ljZV9kZXZfcm91dGVfc3RhdGUgdm9jX3JvdXRlX3N0YXRlOworCisJdTMyIHNlc3Npb25faWQ7CisKKwlzdHJ1Y3QgaW5jYWxsX3JlY19pbmZvIHJlY19pbmZvOworCisJc3RydWN0IGluY2FsbF9tdXNpY19pbmZvIG11c2ljX2luZm87CisKKwlzdHJ1Y3Qgdm9pY2VfcmVjX3JvdXRlX3N0YXRlIHJlY19yb3V0ZV9zdGF0ZTsKK307CisKK3N0cnVjdCBjYWxfbWVtIHsKKwlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOworCXVpbnQzMl90IHBoeTsKKwl2b2lkICpidWY7Cit9OworCisjZGVmaW5lIE1BWF9WT0NfU0VTU0lPTlMgOAorCitzdHJ1Y3QgY29tbW9uX2RhdGEgeworCS8qIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGFyZSBmb3IgYWxsIGRldmljZXMgKi8KKwl1aW50MzJfdCBkZWZhdWx0X211dGVfdmFsOworCXVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3ZhbDsKKwl1aW50MzJfdCBkZWZhdWx0X3ZvbF9zdGVwX3ZhbDsKKwl1aW50MzJfdCBkZWZhdWx0X3ZvbF9yYW1wX2R1cmF0aW9uX21zOworCXVpbnQzMl90IGRlZmF1bHRfbXV0ZV9yYW1wX2R1cmF0aW9uX21zOworCWJvb2wgZWNfcmVmX2V4dDsKKwl1aW50MTZfdCBlY19wb3J0X2lkOworCisJLyogQVBSIHRvIE1WTSBpbiB0aGUgUTYgKi8KKwl2b2lkICphcHJfcTZfbXZtOworCS8qIEFQUiB0byBDVlMgaW4gdGhlIFE2ICovCisJdm9pZCAqYXByX3E2X2N2czsKKwkvKiBBUFIgdG8gQ1ZQIGluIHRoZSBRNiAqLworCXZvaWQgKmFwcl9xNl9jdnA7CisKKwlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbTUFYX1ZPSUNFX0NBTF9UWVBFU107CisKKwlzdHJ1Y3QgbWVtX21hcF90YWJsZSBjYWxfbWVtX21hcF90YWJsZTsKKwl1aW50MzJfdCBjYWxfbWVtX2hhbmRsZTsKKworCXN0cnVjdCBtZW1fbWFwX3RhYmxlIHJ0YWNfbWVtX21hcF90YWJsZTsKKwl1aW50MzJfdCBydGFjX21lbV9oYW5kbGU7CisKKwl1aW50MzJfdCB2b2ljZV9ob3N0X3BjbV9tZW1faGFuZGxlOworCisJc3RydWN0IGNhbF9tZW0gY3ZwX2NhbDsKKwlzdHJ1Y3QgY2FsX21lbSBjdnNfY2FsOworCisJc3RydWN0IG11dGV4IGNvbW1vbl9sb2NrOworCisJc3RydWN0IG12c19kcml2ZXJfaW5mbyBtdnNfaW5mbzsKKworCXN0cnVjdCBkdG1mX2RyaXZlcl9pbmZvIGR0bWZfaW5mbzsKKworCXN0cnVjdCBob3N0cGNtX2RyaXZlcl9pbmZvIGhvc3RwY21faW5mbzsKKworCXN0cnVjdCB2b2ljZV9kYXRhIHZvaWNlW01BWF9WT0NfU0VTU0lPTlNdOworCisJYm9vbCBzcnZjY19yZWNfZmxhZzsKKwlib29sIGlzX2Rlc3Ryb3lfY3ZkOworCWNoYXIgY3ZkX3ZlcnNpb25bQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFXTsKKwlib29sIGlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkOworCWJvb2wgaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzOworCWJvb2wgaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzczsKKwlzdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX3JzcF9nZXRfc2VjdG9yc190IHNvdW5kRm9jdXNSZXNwb25zZTsKKwlzdHJ1Y3Qgc2hhcmVkX21lbV9pbmZvIHNvdXJjZV90cmFja2luZ19zaF9tZW07CisJc3RydWN0IHZzc19pc291cmNldHJhY2tfYWN0aXZpdHlfZGF0YV90IHNvdXJjZVRyYWNraW5nUmVzcG9uc2U7Cit9OworCitzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgeworCWludCBjdXJfaWR4OworCWludCBzZXNzaW9uX2lkeDsKK307CisKK3ZvaWQgdm9jX3JlZ2lzdGVyX212c19jYih1bF9jYl9mbiB1bF9jYiwKKwkJCWRsX2NiX2ZuIGRsX2NiLAorCQkJdm9pcF9zc3JfY2Igc3NyX2NiLAorCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKwordm9pZCB2b2NfcmVnaXN0ZXJfZHRtZl9yeF9kZXRlY3Rpb25fY2IoZHRtZl9yeF9kZXRfY2JfZm4gZHRtZl9yeF91bF9jYiwKKwkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKKwordm9pZCB2b2NfY29uZmlnX3ZvY29kZXIodWludDMyX3QgbWVkaWFfdHlwZSwKKwkJCXVpbnQzMl90IHJhdGUsCisJCQl1aW50MzJfdCBuZXR3b3JrX3R5cGUsCisJCQl1aW50MzJfdCBkdHhfbW9kZSwKKwkJCXVpbnQzMl90IGV2cmNfbWluX3JhdGUsCisJCQl1aW50MzJfdCBldnJjX21heF9yYXRlKTsKKworZW51bSB7CisJREVWX1JYID0gMCwKKwlERVZfVFgsCit9OworCitlbnVtIHsKKwlSWF9QQVRIID0gMCwKKwlUWF9QQVRILAorfTsKKworCisjZGVmaW5lIFZPQ19QQVRIX1BBU1NJVkUgMAorI2RlZmluZSBWT0NfUEFUSF9GVUxMIDEKKyNkZWZpbmUgVk9DX1BBVEhfVk9MVEVfUEFTU0lWRSAyCisjZGVmaW5lIFZPQ19QQVRIX1ZPSUNFMl9QQVNTSVZFIDMKKyNkZWZpbmUgVk9DX1BBVEhfUUNIQVRfUEFTU0lWRSA0CisjZGVmaW5lIFZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFIDUKKyNkZWZpbmUgVk9DX1BBVEhfVk9JQ0VNTU9ERTFfUEFTU0lWRSA2CisjZGVmaW5lIFZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkUgNworCisjZGVmaW5lIE1BWF9TRVNTSU9OX05BTUVfTEVOIDMyCisjZGVmaW5lIFZPSUNFX1NFU1NJT05fTkFNRSAgICJWb2ljZSBzZXNzaW9uIgorI2RlZmluZSBWT0lQX1NFU1NJT05fTkFNRSAgICAiVm9JUCBzZXNzaW9uIgorI2RlZmluZSBWT0xURV9TRVNTSU9OX05BTUUgICAiVm9MVEUgc2Vzc2lvbiIKKyNkZWZpbmUgVk9JQ0UyX1NFU1NJT05fTkFNRSAgIlZvaWNlMiBzZXNzaW9uIgorI2RlZmluZSBRQ0hBVF9TRVNTSU9OX05BTUUgICAiUUNIQVQgc2Vzc2lvbiIKKyNkZWZpbmUgVk9XTEFOX1NFU1NJT05fTkFNRSAgIlZvV0xBTiBzZXNzaW9uIgorI2RlZmluZSBWT0lDRU1NT0RFMV9OQU1FICAgICAiVm9pY2VNTW9kZTEiCisjZGVmaW5lIFZPSUNFTU1PREUyX05BTUUgICAgICJWb2ljZU1Nb2RlMiIKKworI2RlZmluZSBWT0lDRTJfU0VTU0lPTl9WU0lEX1NUUiAgICAgICIxMERDMTAwMCIKKyNkZWZpbmUgUUNIQVRfU0VTU0lPTl9WU0lEX1NUUiAgICAgICAiMTA4MDMwMDAiCisjZGVmaW5lIFZPV0xBTl9TRVNTSU9OX1ZTSURfU1RSICAgICAgIjEwMDAyMDAwIgorI2RlZmluZSBWT0lDRU1NT0RFMV9WU0lEX1NUUiAgICAgICAgICIxMUMwNTAwMCIKKyNkZWZpbmUgVk9JQ0VNTU9ERTJfVlNJRF9TVFIgICAgICAgICAiMTFEQzUwMDAiCisjZGVmaW5lIFZPSUNFX1NFU1NJT05fVlNJRCAgICAgICAgICAgMHgxMEMwMTAwMAorI2RlZmluZSBWT0lDRTJfU0VTU0lPTl9WU0lEICAgICAgICAgIDB4MTBEQzEwMDAKKyNkZWZpbmUgVk9MVEVfU0VTU0lPTl9WU0lEICAgICAgICAgICAweDEwQzAyMDAwCisjZGVmaW5lIFZPSVBfU0VTU0lPTl9WU0lEICAgICAgICAgICAgMHgxMDAwNDAwMAorI2RlZmluZSBRQ0hBVF9TRVNTSU9OX1ZTSUQgICAgICAgICAgIDB4MTA4MDMwMDAKKyNkZWZpbmUgVk9XTEFOX1NFU1NJT05fVlNJRCAgICAgICAgICAweDEwMDAyMDAwCisjZGVmaW5lIFZPSUNFTU1PREUxX1ZTSUQgICAgICAgICAgICAgMHgxMUMwNTAwMAorI2RlZmluZSBWT0lDRU1NT0RFMl9WU0lEICAgICAgICAgICAgIDB4MTFEQzUwMDAKKyNkZWZpbmUgQUxMX1NFU1NJT05fVlNJRCAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIFZTSURfTUFYICAgICAgICAgICAgICAgICAgICAgQUxMX1NFU1NJT05fVlNJRAorCisvKiBjYWxsZWQgIGJ5IGFsc2EgZHJpdmVyICovCitpbnQgdm9jX3NldF9wcF9lbmFibGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgbW9kdWxlX2lkLAorCQkgICAgICB1aW50MzJfdCBlbmFibGUpOworaW50IHZvY19nZXRfcHBfZW5hYmxlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IG1vZHVsZV9pZCk7CitpbnQgdm9jX3NldF9oZF9lbmFibGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZW5hYmxlKTsKK3VpbnQ4X3Qgdm9jX2dldF90dHlfbW9kZSh1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2ludCB2b2Nfc2V0X3R0eV9tb2RlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQ4X3QgdHR5X21vZGUpOworaW50IHZvY19zdGFydF92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpOworaW50IHZvY19lbmRfdm9pY2VfY2FsbCh1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2ludCB2b2Nfc3RhbmRieV92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpOworaW50IHZvY19yZXN1bWVfdm9pY2VfY2FsbCh1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2ludCB2b2Nfc2V0X2xjaCh1aW50MzJfdCBzZXNzaW9uX2lkLCBlbnVtIHZvaWNlX2xjaF9tb2RlIGxjaF9tb2RlKTsKK2ludCB2b2Nfc2V0X3J4X3ZvbF9zdGVwKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGRpciwgdWludDMyX3Qgdm9sX3N0ZXAsCisJCQl1aW50MzJfdCByYW1wX2R1cmF0aW9uKTsKK2ludCB2b2Nfc2V0X3R4X211dGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlyLCB1aW50MzJfdCBtdXRlLAorCQkgICAgdWludDMyX3QgcmFtcF9kdXJhdGlvbik7CitpbnQgdm9jX3NldF9kZXZpY2VfbXV0ZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBkaXIsIHVpbnQzMl90IG11dGUsCisJCQl1aW50MzJfdCByYW1wX2R1cmF0aW9uKTsKK2ludCB2b2NfZ2V0X3J4X2RldmljZV9tdXRlKHVpbnQzMl90IHNlc3Npb25faWQpOworaW50IHZvY19zZXRfcm91dGVfZmxhZyh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50OF90IHBhdGhfZGlyLCB1aW50OF90IHNldCk7Cit1aW50OF90IHZvY19nZXRfcm91dGVfZmxhZyh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50OF90IHBhdGhfZGlyKTsKK2ludCB2b2NfZW5hYmxlX2R0bWZfcnhfZGV0ZWN0aW9uKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGVuYWJsZSk7Cit2b2lkIHZvY19kaXNhYmxlX2R0bWZfZGV0X29uX2FjdGl2ZV9zZXNzaW9ucyh2b2lkKTsKK2ludCB2b2NfYWxsb2NfY2FsX3NoYXJlZF9tZW1vcnkodm9pZCk7CitpbnQgdm9jX2FsbG9jX3ZvaXBfc2hhcmVkX21lbW9yeSh2b2lkKTsKK2ludCBpc192b2NfaW5pdGlhbGl6ZWQodm9pZCk7CitpbnQgdm9jX3JlZ2lzdGVyX3ZvY3Byb2Nfdm9sX3RhYmxlKHZvaWQpOworaW50IHZvY19kZXJlZ2lzdGVyX3ZvY3Byb2Nfdm9sX3RhYmxlKHZvaWQpOworaW50IHZvY19zZW5kX2N2cF9tYXBfdm9jcGNtX21lbW9yeSh1aW50MzJfdCBzZXNzaW9uX2lkLAorCQkJCSAgIHN0cnVjdCBtZW1fbWFwX3RhYmxlICp0cF9tZW1fdGFibGUsCisJCQkJICAgcGh5c19hZGRyX3QgcGFkZHIsIHVpbnQzMl90IGJ1ZnNpemUpOworaW50IHZvY19zZW5kX2N2cF91bm1hcF92b2NwY21fbWVtb3J5KHVpbnQzMl90IHNlc3Npb25faWQpOworaW50IHZvY19zZW5kX2N2cF9zdGFydF92b2NwY20odWludDMyX3Qgc2Vzc2lvbl9pZCwKKwkJCSAgICAgIHN0cnVjdCB2c3NfaXZwY21fdGFwX3BvaW50ICp2cGNtX3RwLAorCQkJICAgICAgdWludDMyX3Qgbm9fb2ZfdHApOworaW50IHZvY19zZW5kX2N2cF92b2NwY21fcHVzaF9idWZfZXZ0KHVpbnQzMl90IHNlc3Npb25faWQsCisJCQlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9wdXNoX2J1ZmZlcl92Ml90ICpwdXNoX2J1ZmZfZXZ0KTsKK2ludCB2b2Nfc2VuZF9jdnBfc3RvcF92b2NwY20odWludDMyX3Qgc2Vzc2lvbl9pZCk7Cit2b2lkIHZvY19yZWdpc3Rlcl9ocGNtX2V2dF9jYihob3N0cGNtX2NiX2ZuIGhvc3RwY21fY2IsCisJCQkgICAgICB2b2lkICpwcml2YXRlX2RhdGEpOwordm9pZCB2b2NfZGVyZWdpc3Rlcl9ocGNtX2V2dF9jYih2b2lkKTsKKworaW50IHZvY19tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKK2ludCB2b2NfdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpOworCit1aW50MzJfdCB2b2NfZ2V0X3Nlc3Npb25faWQoY2hhciAqbmFtZSk7CisKK2ludCB2b2Nfc3RhcnRfcGxheWJhY2sodWludDMyX3Qgc2V0LCB1aW50MTZfdCBwb3J0X2lkKTsKK2ludCB2b2Nfc3RhcnRfcmVjb3JkKHVpbnQzMl90IHBvcnRfaWQsIHVpbnQzMl90IHNldCwgdWludDMyX3Qgc2Vzc2lvbl9pZCk7CitpbnQgdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCk7CitpbnQgdm9jX3NldF9leHRfZWNfcmVmKHVpbnQxNl90IHBvcnRfaWQsIGJvb2wgc3RhdGUpOworaW50IHZvY191cGRhdGVfYW1yX3ZvY29kZXJfcmF0ZSh1aW50MzJfdCBzZXNzaW9uX2lkKTsKK2ludCB2b2NfZGlzYWJsZV9kZXZpY2UodWludDMyX3Qgc2Vzc2lvbl9pZCk7CitpbnQgdm9jX2VuYWJsZV9kZXZpY2UodWludDMyX3Qgc2Vzc2lvbl9pZCk7Cit2b2lkIHZvY19zZXRfZGVzdHJveV9jdmRfZmxhZyhib29sIGlzX2Rlc3Ryb3lfY3ZkKTsKK2ludCB2b2NfZGlzYWJsZV90b3BvbG9neSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBkaXNhYmxlKTsKK2ludCB2b2Nfc2V0X2RldmljZV9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2RpciwKKwkJCSAgdWludDhfdCBub19vZl9jaGFubmVscywgdWludDMyX3QgZGV2X3BvcnRfaWQpOwordWludDMyX3Qgdm9pY2VfZ2V0X3RvcG9sb2d5KHVpbnQzMl90IHRvcG9sb2d5X2lkeCk7CitpbnQgdm9jX3NldF9zb3VuZF9mb2N1cyhzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRfZm9jdXNfcGFyYW0pOworaW50IHZvY19nZXRfc291bmRfZm9jdXMoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSk7CitpbnQgdm9jX2dldF9zb3VyY2VfdHJhY2tpbmcoc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSAqc291cmNlVHJhY2tpbmdEYXRhKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL3J0YWMuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9ydGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzOTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9ydGFjLmMKQEAgLTAsMCArMSwxOTA0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3J0YWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgorI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+CisjaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KKyNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KKyNpbmNsdWRlICJxNnZvaWNlLmgiCisjaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCisjaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KKworCisvKiBNYXggc2l6ZSBvZiBwYXlsb2FkIChidWYgc2l6ZSAtIGFwciBoZWFkZXIpICovCisjZGVmaW5lIE1BWF9QQVlMT0FEX1NJWkUJCTQwNzYKKyNkZWZpbmUgUlRBQ19NQVhfQUNUSVZFX1ZPSUNFX0NPTUJPUwkyCisjZGVmaW5lIFJUQUNfTUFYX0FDVElWRV9QT1BQCQk4CisjZGVmaW5lIFJUQUNfQlVGX1NJWkUJCQkxNjM4NDAKKworI2RlZmluZSBUSU1FT1VUX01TCTEwMDAKKworc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEJcnRhY19jYWxbTUFYX1JUQUNfQkxPQ0tTXSA9IHsKKy8qIEFETV9SVEFDX0NBTCAqLworCXt7UlRBQ19CVUZfU0laRSwgMCwgMCwgMH0sIHswLCAwLCAwfSB9LAorLyogQVNNX1JUQUNfQ0FMICovCisJe3tSVEFDX0JVRl9TSVpFLCAwLCAwLCAwfSwgezAsIDAsIDB9IH0sCisvKiBWT0lDRV9SVEFDX0NBTCAqLworCXt7UlRBQ19CVUZfU0laRSwgMCwgMCwgMH0sIHswLCAwLCAwfSB9LAorLyogQUZFX1JUQUNfQ0FMICovCisJe3tSVEFDX0JVRl9TSVpFLCAwLCAwLCAwfSwgezAsIDAsIDB9IH0KK307CisKK3N0cnVjdCBydGFjX2NvbW1vbl9kYXRhIHsKKwlhdG9taWNfdAkJCXVzYWdlX2NvdW50OworCWF0b21pY190CQkJYXByX2Vycl9jb2RlOworfTsKKworc3RhdGljIHN0cnVjdCBydGFjX2NvbW1vbl9kYXRhCQlydGFjX2NvbW1vbjsKKworLyogQVBSIGRhdGEgKi8KK3N0cnVjdCBydGFjX2Fwcl9kYXRhIHsKKwl2b2lkCQkJKmFwcl9oYW5kbGU7CisJYXRvbWljX3QJCWNtZF9zdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAljbWRfd2FpdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnRhY19hcHJfZGF0YSBydGFjX2FkbV9hcHJfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgcnRhY19hcHJfZGF0YSBydGFjX2FzbV9hcHJfZGF0YVtBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCArIDFdOworc3RhdGljIHN0cnVjdCBydGFjX2Fwcl9kYXRhCXJ0YWNfYWZlX2Fwcl9kYXRhOworc3RhdGljIHN0cnVjdCBydGFjX2Fwcl9kYXRhCXJ0YWNfdm9pY2VfYXByX2RhdGFbUlRBQ19WT0lDRV9NT0RFU107CisKKy8qIEFETSBpbmZvICYgQVBSICovCitzdGF0aWMgc3RydWN0IHJ0YWNfYWRtCQlydGFjX2FkbV9kYXRhOworc3RhdGljIHUzMgkJCSpydGFjX2FkbV9idWZmZXI7CisKKworLyogQVNNIEFQUiAqLworc3RhdGljIHUzMgkJCSpydGFjX2FzbV9idWZmZXI7CisKK3N0YXRpYyB1MzIJCQkqcnRhY19hZmVfYnVmZmVyOworCisvKiBWb2ljZSBpbmZvICYgQVBSICovCitzdHJ1Y3QgcnRhY192b2ljZV9kYXRhX3QgeworCXVpbnQzMl90CXR4X3RvcG9sb2d5X2lkOworCXVpbnQzMl90CXJ4X3RvcG9sb2d5X2lkOworCXVpbnQzMl90CXR4X2FmZV90b3BvbG9neTsKKwl1aW50MzJfdAlyeF9hZmVfdG9wb2xvZ3k7CisJdWludDMyX3QJdHhfYWZlX3BvcnQ7CisJdWludDMyX3QJcnhfYWZlX3BvcnQ7CisJdWludDE2X3QJY3ZzX2hhbmRsZTsKKwl1aW50MTZfdAljdnBfaGFuZGxlOworCXVpbnQzMl90CXR4X2FjZGJfaWQ7CisJdWludDMyX3QJcnhfYWNkYl9pZDsKK307CisKK3N0cnVjdCBydGFjX3ZvaWNlIHsKKwl1aW50MzJfdAkJCW51bV9vZl92b2ljZV9jb21ib3M7CisJc3RydWN0IHJ0YWNfdm9pY2VfZGF0YV90CXZvaWNlW1JUQUNfTUFYX0FDVElWRV9WT0lDRV9DT01CT1NdOworfTsKKworc3RydWN0IHJ0YWNfYWZlX3VzZXJfZGF0YSB7CisJdWludDMyX3QJYnVmX3NpemU7CisJdWludDMyX3QJY21kX3NpemU7CisJdWludDMyX3QJcG9ydF9pZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBydGFjX2FmZV9zZXQgeworCQkJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgY21kOworCQkJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgZGF0YTsKKwkJfSBydGFjX2FmZV9zZXQ7CisJCXN0cnVjdCBydGFjX2FmZV9nZXQgeworCQkJc3RydWN0IGFmZV9wb3J0X2NtZF9nZXRfcGFyYW1fdjIgY21kOworCQkJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgZGF0YTsKKwkJfSBydGFjX2FmZV9nZXQ7CisJfTsKK30gIF9fcGFja2VkOworCitzdGF0aWMgc3RydWN0IHJ0YWNfdm9pY2UJcnRhY192b2ljZV9kYXRhOworc3RhdGljIHUzMgkJCSpydGFjX3ZvaWNlX2J1ZmZlcjsKK3N0YXRpYyB1MzIJCQl2b2ljZV9zZXNzaW9uX2lkW1JUQUNfTUFYX0FDVElWRV9WT0lDRV9DT01CT1NdOworCisKK3N0cnVjdCBtdXRleAkJCXJ0YWNfYWRtX211dGV4Oworc3RydWN0IG11dGV4CQkJcnRhY19hZG1fYXByX211dGV4Oworc3RydWN0IG11dGV4CQkJcnRhY19hc21fYXByX211dGV4Oworc3RydWN0IG11dGV4CQkJcnRhY192b2ljZV9tdXRleDsKK3N0cnVjdCBtdXRleAkJCXJ0YWNfdm9pY2VfYXByX211dGV4Oworc3RydWN0IG11dGV4CQkJcnRhY19hZmVfYXByX211dGV4OworCitpbnQgcnRhY19jbGVhcl9tYXBwaW5nKHVpbnQzMl90IGNhbF90eXBlKQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX3R5cGUgPj0gTUFYX1JUQUNfQkxPQ0tTKSB7CisJCXByX2RlYnVnKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID0gMDsKK2RvbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHJ0YWNfYWxsb2NhdGVfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzaXplX3QgbGVuOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2FsX3R5cGUgPj0gTUFYX1JUQUNfQkxPQ0tTKSB7CisJCXByX2VycigiJXM6IGNhbF90eXBlICVkIGlzIGludmFsaWQhXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlKTsKKwkJcmVzdWx0ID0gIC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAocnRhY19jYWxbY2FsX3R5cGVdLmNhbF9kYXRhLnBhZGRyICE9IDApIHsKKwkJcHJfZXJyKCIlczogbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkISBjYWxfdHlwZSAlZCwgcGFkZHIgMHglcEtcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2FsX3R5cGUsICZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIpOworCQlyZXN1bHQgPSAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJydGFjX2NsaWVudCIsCisJCSZydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEuaW9uX2NsaWVudCwKKwkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5pb25faGFuZGxlLAorCQlydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEubWFwX3NpemUsCisJCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIsCisJCSZsZW4sCisJCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEua3ZhZGRyKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBJT04gY3JlYXRlIGNsaWVudCBmb3IgUlRBQyBmYWlsZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IGNhbF90eXBlICVkLCBwYWRkciAweCVwSywga3ZhZGRyIDB4JXBLLCBtYXBfc2l6ZSAweCV4XG4iLAorCQlfX2Z1bmNfXywgY2FsX3R5cGUsCisJCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIsCisJCXJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5rdmFkZHIsCisJCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfc2l6ZSk7Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBydGFjX2ZyZWVfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJCXJlc3VsdCA9ICAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5pb25fY2xpZW50ID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSAlZCBub3QgYWxsb2NhdGVkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBtc21fYXVkaW9faW9uX2ZyZWUocnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9jbGllbnQsCisJCQkJcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9oYW5kbGUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IElPTiBmcmVlIGZvciBSVEFDIGZhaWxlZCEgY2FsX3R5cGUgJWQsIHBhZGRyIDB4JXBLXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlLCAmcnRhY19jYWxbY2FsX3R5cGVdLmNhbF9kYXRhLnBhZGRyKTsKKwkJZ290byBkb25lOworCX0KKworCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID0gMDsKKwlydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEuaW9uX2NsaWVudCA9IE5VTEw7CisJcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9oYW5kbGUgPSBOVUxMOworCXJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5zaXplID0gMDsKKwlydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEua3ZhZGRyID0gMDsKKwlydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIgPSAwOworZG9uZToKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcnRhY19tYXBfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJCXJlc3VsdCA9ICAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlICE9IDApIHsKKwkJcHJfZXJyKCIlczogYWxyZWFkeSBtYXBwZWQgY2FsX3R5cGUgJWRcbiIsCisJCQlfX2Z1bmNfXywgY2FsX3R5cGUpOworCQlyZXN1bHQgPSAgLUVQRVJNOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5wYWRkciA9PSAwKSB7CisJCXByX2VycigiJXM6IHBoeXNpY2FsIGFkZHJlc3MgaXMgTlVMTCBjYWxfdHlwZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBjYWxfdHlwZSk7CisJCXJlc3VsdCA9ICAtRVBFUk07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKGNhbF90eXBlKSB7CisJY2FzZSBBRE1fUlRBQ19DQUw6CisJCXJlc3VsdCA9IGFkbV9tYXBfcnRhY19ibG9jaygmcnRhY19jYWxbY2FsX3R5cGVdKTsKKwkJYnJlYWs7CisJY2FzZSBBU01fUlRBQ19DQUw6CisJCXJlc3VsdCA9IHE2YXNtX21hcF9ydGFjX2Jsb2NrKCZydGFjX2NhbFtjYWxfdHlwZV0pOworCQlicmVhazsKKwljYXNlIFZPSUNFX1JUQUNfQ0FMOgorCQlyZXN1bHQgPSB2b2NfbWFwX3J0YWNfYmxvY2soJnJ0YWNfY2FsW2NhbF90eXBlXSk7CisJCWJyZWFrOworCWNhc2UgQUZFX1JUQUNfQ0FMOgorCQlyZXN1bHQgPSBhZmVfbWFwX3J0YWNfYmxvY2soJnJ0YWNfY2FsW2NhbF90eXBlXSk7CisJCWJyZWFrOworCX0KKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBtYXAgUlRBQyBmYWlsZWQhIGNhbF90eXBlICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlKTsKKwkJZ290byBkb25lOworCX0KK2RvbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHJ0YWNfdW5tYXBfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgeworCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJCXJlc3VsdCA9ICAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID09IDApIHsKKwkJcHJfZGVidWcoIiVzOiBub3RoaW5nIHRvIHVubWFwIGNhbF90eXBlICVkXG4iLAorCQkJX19mdW5jX18sIGNhbF90eXBlKTsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY2FsX3R5cGUpIHsKKwljYXNlIEFETV9SVEFDX0NBTDoKKwkJcmVzdWx0ID0gYWRtX3VubWFwX3J0YWNfYmxvY2soCisJCQkmcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLm1hcF9oYW5kbGUpOworCQlicmVhazsKKwljYXNlIEFTTV9SVEFDX0NBTDoKKwkJcmVzdWx0ID0gcTZhc21fdW5tYXBfcnRhY19ibG9jaygKKwkJCSZydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEubWFwX2hhbmRsZSk7CisJCWJyZWFrOworCWNhc2UgVk9JQ0VfUlRBQ19DQUw6CisJCXJlc3VsdCA9IHZvY191bm1hcF9ydGFjX2Jsb2NrKAorCQkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlKTsKKwkJYnJlYWs7CisJY2FzZSBBRkVfUlRBQ19DQUw6CisJCXJlc3VsdCA9IGFmZV91bm1hcF9ydGFjX2Jsb2NrKAorCQkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlKTsKKwkJYnJlYWs7CisJfQorCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IHVubWFwIFJUQUMgZmFpbGVkISBjYWxfdHlwZSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7CisJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcnRhY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhdG9taWNfaW5jKCZydGFjX2NvbW1vbi51c2FnZV9jb3VudCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBydGFjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDIgPSAwOworCWludCBpOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlhdG9taWNfZGVjKCZydGFjX2NvbW1vbi51c2FnZV9jb3VudCk7CisJcHJfZGVidWcoIiVzOiByZWYgY291bnQgJWQhXG4iLCBfX2Z1bmNfXywKKwkJYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLnVzYWdlX2NvdW50KSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLnVzYWdlX2NvdW50KSA+IDApCisJCWdvdG8gZG9uZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUlRBQ19CTE9DS1M7IGkrKykgeworCQlyZXN1bHQyID0gcnRhY191bm1hcF9jYWxfYnVmZmVyKGkpOworCQlpZiAocmVzdWx0MiA8IDApIHsKKwkJCXByX2VycigiJXM6IHVubWFwIGJ1ZmZlciBmYWlsZWQhIGVycm9yICVkIVxuIiwKKwkJCQlfX2Z1bmNfXywgcmVzdWx0Mik7CisJCQlyZXN1bHQgPSByZXN1bHQyOworCQl9CisKKwkJcmVzdWx0MiA9IHJ0YWNfZnJlZV9jYWxfYnVmZmVyKGkpOworCQlpZiAocmVzdWx0MiA8IDApIHsKKwkJCXByX2VycigiJXM6IGZyZWUgYnVmZmVyIGZhaWxlZCEgZXJyb3IgJWQhXG4iLAorCQkJCV9fZnVuY19fLCByZXN1bHQyKTsKKwkJCXJlc3VsdCA9IHJlc3VsdDI7CisJCX0KKwl9Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogQURNIEluZm8gKi8KK3ZvaWQgYWRkX3BvcHAodTMyIGRldl9pZHgsIHUzMiBwb3J0X2lkLCB1MzIgcG9wcF9pZCkKK3sKKwl1MzIgaSA9IDA7CisKKwlmb3IgKDsgaSA8IHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwOyBpKyspCisJCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwW2ldLnBvcHAgPT0gcG9wcF9pZCkKKwkJCWdvdG8gZG9uZTsKKworCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCA9PQorCQkJUlRBQ19NQVhfQUNUSVZFX1BPUFApIHsKKwkJcHJfZXJyKCIlcywgTWF4IFBPUFAhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ubnVtX29mX3BvcHBdLnBvcHAgPSBwb3BwX2lkOworCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLnBvcHBbCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwXS5wb3BwX3RvcG9sb2d5ID0KKwkJcTZhc21fZ2V0X2FzbV90b3BvbG9neShwb3BwX2lkKTsKKwlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwWworCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCsrXS5hcHBfdHlwZSA9CisJCXE2YXNtX2dldF9hc21fYXBwX3R5cGUocG9wcF9pZCk7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcHBfaWQgPSAlZCwgcG9wcCB0b3BvbG9neSA9IDB4JXgsIHBvcHAgYXBwIHR5cGUgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKKwkJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwIC0gMV0ucG9wcCwKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ubnVtX29mX3BvcHAgLSAxXS5wb3BwX3RvcG9sb2d5LAorCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwWworCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCAtIDFdLmFwcF90eXBlKTsKK2RvbmU6CisJcmV0dXJuOworfQorCit2b2lkIHJ0YWNfYWRkX2FkbV9kZXZpY2UodTMyIHBvcnRfaWQsIHUzMiBjb3BwX2lkLCB1MzIgcGF0aF9pZCwgdTMyIHBvcHBfaWQsCisJCQkgdTMyIGFwcF90eXBlLCB1MzIgYWNkYl9pZCkKK3sKKwl1MzIgaSA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IG51bSBydGFjIGRldmljZXMgJWQgcG9ydF9pZCA9ICVkLCBjb3BwX2lkID0gJWRcbiIsCisJCV9fZnVuY19fLCBydGFjX2FkbV9kYXRhLm51bV9vZl9kZXYsIHBvcnRfaWQsIGNvcHBfaWQpOworCisJbXV0ZXhfbG9jaygmcnRhY19hZG1fbXV0ZXgpOworCWlmIChydGFjX2FkbV9kYXRhLm51bV9vZl9kZXYgPT0gUlRBQ19NQVhfQUNUSVZFX0RFVklDRVMpIHsKKwkJcHJfZXJyKCIlcywgQ2FuJ3QgYWRkIGFueW1vcmUgUlRBQyBkZXZpY2VzIVxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQ2hlY2sgaWYgZGV2aWNlIGFscmVhZHkgYWRkZWQgKi8KKwlpZiAocnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2ICE9IDApIHsKKwkJZm9yICg7IGkgPCBydGFjX2FkbV9kYXRhLm51bV9vZl9kZXY7IGkrKykgeworCQkJaWYgKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV9wb3J0ID09IHBvcnRfaWQgJiYKKwkJCSAgICBydGFjX2FkbV9kYXRhLmRldmljZVtpXS5jb3BwID09IGNvcHBfaWQpIHsKKwkJCQlhZGRfcG9wcChpLCBwb3J0X2lkLCBwb3BwX2lkKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlpZiAocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHAgPT0KKwkJCQkJCVJUQUNfTUFYX0FDVElWRV9QT1BQKSB7CisJCQkJcHJfZXJyKCIlcywgTWF4IFBPUFAhXG4iLCBfX2Z1bmNfXyk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJfQorCisJLyogQWRkIGRldmljZSAqLworCXJ0YWNfYWRtX2RhdGEubnVtX29mX2RldisrOworCisJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0udG9wb2xvZ3lfaWQgPQorCQlhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2Zyb21fY29wcF9pZChwb3J0X2lkLCBjb3BwX2lkKTsKKwlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hZmVfdG9wb2xvZ3kgPQorCQlhZmVfZ2V0X3RvcG9sb2d5KHBvcnRfaWQpOworCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV9wb3J0ID0gcG9ydF9pZDsKKwlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5jb3BwID0gY29wcF9pZDsKKwlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hcHBfdHlwZSA9IGFwcF90eXBlOworCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFjZGJfZGV2X2lkID0gYWNkYl9pZDsKKwlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5wb3BwWworCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcF0ucG9wcCA9IHBvcHBfaWQ7CisJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFsKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHBdLnBvcHBfdG9wb2xvZ3kgPQorCQlxNmFzbV9nZXRfYXNtX3RvcG9sb2d5KHBvcHBfaWQpOworCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLm51bV9vZl9wb3BwKytdLmFwcF90eXBlID0KKwkJcTZhc21fZ2V0X2FzbV9hcHBfdHlwZShwb3BwX2lkKTsKKworCXByX2RlYnVnKCIlczogdG9wb2xvZ3kgPSAweCV4LCBhZmVfdG9wb2xvZ3kgPSAweCV4LCBwb3J0X2lkID0gJWQsIGNvcHBfaWQgPSAlZCwgYXBwIGlkID0gMHgleCwgYWNkYiBpZCA9ICVkLCBwb3BwX2lkID0gJWQsIHBvcHAgdG9wb2xvZ3kgPSAweCV4LCBwb3BwIGFwcCB0eXBlID0gMHgleFxuIiwKKwkJX19mdW5jX18sCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnRvcG9sb2d5X2lkLAorCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hZmVfdG9wb2xvZ3ksCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV9wb3J0LAorCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5jb3BwLAorCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hcHBfdHlwZSwKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWNkYl9kZXZfaWQsCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbCisJCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcCAtIDFdLnBvcHAsCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbCisJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLm51bV9vZl9wb3BwIC0gMV0ucG9wcF90b3BvbG9neSwKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFsKKwkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHAgLSAxXS5hcHBfdHlwZSk7Citkb25lOgorCW11dGV4X3VubG9jaygmcnRhY19hZG1fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBzaGlmdF9hZG1fZGV2aWNlcyh1MzIgZGV2X2lkeCkKK3sKKwlmb3IgKDsgZGV2X2lkeCA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgZGV2X2lkeCsrKSB7CisJCW1lbWNweSgmcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0sCisJCQkmcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeCArIDFdLAorCQkJc2l6ZW9mKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdKSk7CisJCW1lbXNldCgmcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeCArIDFdLCAwLAorCQkJICAgc2l6ZW9mKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaGlmdF9wb3BwKHUzMiBjb3BwX2lkeCwgdTMyIHBvcHBfaWR4KQoreworCWZvciAoOyBwb3BwX2lkeCA8IHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2NvcHBfaWR4XS5udW1fb2ZfcG9wcDsKKwkJCQkJCQlwb3BwX2lkeCsrKSB7CisJCW1lbWNweSgmcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLnBvcHBbcG9wcF9pZHhdLnBvcHAsCisJCQkmcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLnBvcHBbcG9wcF9pZHggKyAxXS4KKwkJCXBvcHAsIHNpemVvZih1aW50MzJfdCkpOworCQltZW1jcHkoJnJ0YWNfYWRtX2RhdGEuZGV2aWNlW2NvcHBfaWR4XS5wb3BwW3BvcHBfaWR4XS4KKwkJCXBvcHBfdG9wb2xvZ3ksCisJCQkmcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLnBvcHBbcG9wcF9pZHggKyAxXS4KKwkJCXBvcHBfdG9wb2xvZ3ksCisJCQlzaXplb2YodWludDMyX3QpKTsKKwkJbWVtc2V0KCZydGFjX2FkbV9kYXRhLmRldmljZVtjb3BwX2lkeF0ucG9wcFtwb3BwX2lkeCArIDFdLgorCQkJcG9wcCwgMCwgc2l6ZW9mKHVpbnQzMl90KSk7CisJCW1lbXNldCgmcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLnBvcHBbcG9wcF9pZHggKyAxXS4KKwkJCXBvcHBfdG9wb2xvZ3ksIDAsIHNpemVvZih1aW50MzJfdCkpOworCX0KK30KKwordm9pZCBydGFjX3JlbW92ZV9hZG1fZGV2aWNlKHUzMiBwb3J0X2lkLCB1MzIgY29wcF9pZCkKK3sKKwlzMzIgaTsKKworCXByX2RlYnVnKCIlczogbnVtIHJ0YWMgZGV2aWNlcyAlZCBwb3J0X2lkID0gJWQsIGNvcHBfaWQgPSAlZFxuIiwKKwkJX19mdW5jX18sIHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldiwgcG9ydF9pZCwgY29wcF9pZCk7CisKKwltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7CisJLyogbG9vayBmb3IgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7CisJCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hZmVfcG9ydCA9PSBwb3J0X2lkICYmCisJCSAgICBydGFjX2FkbV9kYXRhLmRldmljZVtpXS5jb3BwID09IGNvcHBfaWQpIHsKKwkJCW1lbXNldCgmcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0sIDAsCisJCQkJICAgc2l6ZW9mKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldKSk7CisJCQlydGFjX2FkbV9kYXRhLm51bV9vZl9kZXYtLTsKKworCQkJaWYgKHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldiA+PSAxKSB7CisJCQkJc2hpZnRfYWRtX2RldmljZXMoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnJ0YWNfYWRtX211dGV4KTsKK30KKwordm9pZCBydGFjX3JlbW92ZV9wb3BwX2Zyb21fYWRtX2RldmljZXModTMyIHBvcHBfaWQpCit7CisJczMyIGksIGo7CisKKwlwcl9kZWJ1ZygiJXM6IHBvcHBfaWQgPSAlZFxuIiwgX19mdW5jX18sIHBvcHBfaWQpOworCisJbXV0ZXhfbG9jaygmcnRhY19hZG1fbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBydGFjX2FkbV9kYXRhLm51bV9vZl9kZXY7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHA7IGorKykgeworCQkJaWYgKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbal0ucG9wcCA9PQorCQkJCQkJCQlwb3BwX2lkKSB7CisJCQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFtqXS5wb3BwID0gMDsKKwkJCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5wb3BwW2pdLgorCQkJCQlwb3BwX3RvcG9sb2d5ID0gMDsKKwkJCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcC0tOworCQkJCXNoaWZ0X3BvcHAoaSwgaik7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9tdXRleCk7Cit9CisKKworLyogVm9pY2UgSW5mbyAqLworc3RhdGljIHZvaWQgc2V0X3J0YWNfdm9pY2VfZGF0YShpbnQgaWR4LCB1MzIgY3ZzX2hhbmRsZSwgdTMyIGN2cF9oYW5kbGUsCisJCQkJCXUzMiByeF9hZmVfcG9ydCwgdTMyIHR4X2FmZV9wb3J0LAorCQkJCQl1MzIgcnhfYWNkYl9pZCwgdTMyIHR4X2FjZGJfaWQsCisJCQkJCXUzMiBzZXNzaW9uX2lkKQoreworCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnR4X3RvcG9sb2d5X2lkID0KKwkJdm9pY2VfZ2V0X3RvcG9sb2d5KENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMKTsKKwlydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS5yeF90b3BvbG9neV9pZCA9CisJCXZvaWNlX2dldF90b3BvbG9neShDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTCk7CisJcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0udHhfYWZlX3RvcG9sb2d5ID0KKwkJYWZlX2dldF90b3BvbG9neSh0eF9hZmVfcG9ydCk7CisJcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0ucnhfYWZlX3RvcG9sb2d5ID0KKwkJYWZlX2dldF90b3BvbG9neShyeF9hZmVfcG9ydCk7CisJcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0udHhfYWZlX3BvcnQgPSB0eF9hZmVfcG9ydDsKKwlydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS5yeF9hZmVfcG9ydCA9IHJ4X2FmZV9wb3J0OworCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnR4X2FjZGJfaWQgPSB0eF9hY2RiX2lkOworCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnJ4X2FjZGJfaWQgPSByeF9hY2RiX2lkOworCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLmN2c19oYW5kbGUgPSBjdnNfaGFuZGxlOworCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLmN2cF9oYW5kbGUgPSBjdnBfaGFuZGxlOworCXByX2RlYnVnKCIlc1xuJXM6ICV4XG4lczogJWQgJXM6ICVkXG4lczogJWQgJXM6ICVkXG4gJXM6ICVkXG4gJXM6ICVkXG4lczogJWQgJXM6ICVkXG4lcyIsCisJCSAiPC0tLS0gVm9pY2UgRGF0YSBJbmZvIC0tLS0+IiwgIlNlc3Npb24gaWQiLCBzZXNzaW9uX2lkLAorCQkgImN2c19oYW5kbGUiLCBjdnNfaGFuZGxlLCAiY3ZwX2hhbmRsZSIsIGN2cF9oYW5kbGUsCisJCSAicnhfYWZlX3RvcG9sb2d5IiwgcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0ucnhfYWZlX3RvcG9sb2d5LAorCQkgInR4X2FmZV90b3BvbG9neSIsIHJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnR4X2FmZV90b3BvbG9neSwKKwkJICJyeF9hZmVfcG9ydCIsIHJ4X2FmZV9wb3J0LCAidHhfYWZlX3BvcnQiLCB0eF9hZmVfcG9ydCwKKwkJICJyeF9hY2RiX2lkIiwgcnhfYWNkYl9pZCwgInR4X2FjZGJfaWQiLCB0eF9hY2RiX2lkLAorCQkgIjwtLS0tLS0tLS0tLUVuZC0tLS0tLS0tLS0tPiIpOworCisJLyogU3RvcmUgc2Vzc2lvbiBJRCBmb3Igdm9pY2UgUlRBQyAqLworCXZvaWNlX3Nlc3Npb25faWRbaWR4XSA9IHNlc3Npb25faWQ7Cit9CisKK3ZvaWQgcnRhY19hZGRfdm9pY2UodTMyIGN2c19oYW5kbGUsIHUzMiBjdnBfaGFuZGxlLCB1MzIgcnhfYWZlX3BvcnQsCisJCQl1MzIgdHhfYWZlX3BvcnQsIHUzMiByeF9hY2RiX2lkLCB1MzIgdHhfYWNkYl9pZCwKKwkJCXUzMiBzZXNzaW9uX2lkKQoreworCXUzMiBpID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCW11dGV4X2xvY2soJnJ0YWNfdm9pY2VfbXV0ZXgpOworCisJaWYgKHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zID09CisJCQlSVEFDX01BWF9BQ1RJVkVfVk9JQ0VfQ09NQk9TKSB7CisJCXByX2VycigiJXMsIENhbid0IGFkZCBhbnltb3JlIFJUQUMgZGV2aWNlcyFcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIENoZWNrIGlmIGRldmljZSBhbHJlYWR5IGFkZGVkICovCisJaWYgKHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zICE9IDApIHsKKwkJZm9yICg7IGkgPCBydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvczsgaSsrKSB7CisJCQlpZiAocnRhY192b2ljZV9kYXRhLnZvaWNlW2ldLmN2c19oYW5kbGUgPT0KKwkJCQkJCQljdnNfaGFuZGxlKSB7CisJCQkJc2V0X3J0YWNfdm9pY2VfZGF0YShpLCBjdnNfaGFuZGxlLCBjdnBfaGFuZGxlLAorCQkJCQlyeF9hZmVfcG9ydCwgdHhfYWZlX3BvcnQsIHJ4X2FjZGJfaWQsCisJCQkJCXR4X2FjZGJfaWQsIHNlc3Npb25faWQpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFkZCBkZXZpY2UgKi8KKwlydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvcysrOworCXNldF9ydGFjX3ZvaWNlX2RhdGEoaSwgY3ZzX2hhbmRsZSwgY3ZwX2hhbmRsZSwKKwkJCQlyeF9hZmVfcG9ydCwgdHhfYWZlX3BvcnQsCisJCQkJcnhfYWNkYl9pZCwgdHhfYWNkYl9pZCwKKwkJCQlzZXNzaW9uX2lkKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZydGFjX3ZvaWNlX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgc2hpZnRfdm9pY2VfZGV2aWNlcyh1MzIgaWR4KQoreworCWZvciAoOyBpZHggPCBydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvcyAtIDE7IGlkeCsrKSB7CisJCW1lbWNweSgmcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0sCisJCQkmcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeCArIDFdLAorCQkJc2l6ZW9mKHJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdKSk7CisJCXZvaWNlX3Nlc3Npb25faWRbaWR4XSA9IHZvaWNlX3Nlc3Npb25faWRbaWR4ICsgMV07CisJfQorfQorCit2b2lkIHJ0YWNfcmVtb3ZlX3ZvaWNlKHUzMiBjdnNfaGFuZGxlKQoreworCXUzMiBpID0gMDsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmcnRhY192b2ljZV9tdXRleCk7CisJLyogbG9vayBmb3IgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zOyBpKyspIHsKKwkJaWYgKHJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpXS5jdnNfaGFuZGxlID09IGN2c19oYW5kbGUpIHsKKwkJCXNoaWZ0X3ZvaWNlX2RldmljZXMoaSk7CisJCQlydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvcy0tOworCQkJbWVtc2V0KCZydGFjX3ZvaWNlX2RhdGEudm9pY2VbCisJCQkJcnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3NdLCAwLAorCQkJCXNpemVvZihydGFjX3ZvaWNlX2RhdGEudm9pY2UKKwkJCQlbcnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3NdKSk7CisJCQl2b2ljZV9zZXNzaW9uX2lkW3J0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zXQorCQkJCT0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmcnRhY192b2ljZV9tdXRleCk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X3ZvaWNlX3Nlc3Npb25faWRfY3ZzKHUzMiBjdnNfaGFuZGxlKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zOyBpKyspIHsKKwkJaWYgKHJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpXS5jdnNfaGFuZGxlID09IGN2c19oYW5kbGUpCisJCQlyZXR1cm4gdm9pY2Vfc2Vzc2lvbl9pZFtpXTsKKwl9CisKKwlwcl9lcnIoIiVzOiBObyB2b2ljZSBpbmRleCBmb3IgQ1ZTIGhhbmRsZSAlZCBmb3VuZCByZXR1cm5pbmcgMFxuIiwKKwkgICAgICAgX19mdW5jX18sIGN2c19oYW5kbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdldF92b2ljZV9zZXNzaW9uX2lkX2N2cCh1MzIgY3ZwX2hhbmRsZSkKK3sKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvczsgaSsrKSB7CisJCWlmIChydGFjX3ZvaWNlX2RhdGEudm9pY2VbaV0uY3ZwX2hhbmRsZSA9PSBjdnBfaGFuZGxlKQorCQkJcmV0dXJuIHZvaWNlX3Nlc3Npb25faWRbaV07CisJfQorCisJcHJfZXJyKCIlczogTm8gdm9pY2UgaW5kZXggZm9yIENWUCBoYW5kbGUgJWQgZm91bmQgcmV0dXJuaW5nIDBcbiIsCisJICAgICAgIF9fZnVuY19fLCBjdnBfaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdm9pY2VfaW5kZXgodTMyIG1vZGUsIHUzMiBoYW5kbGUpCit7CisJaWYgKG1vZGUgPT0gUlRBQ19DVlApCisJCXJldHVybiB2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKAorCQkJZ2V0X3ZvaWNlX3Nlc3Npb25faWRfY3ZwKGhhbmRsZSkpOworCWlmIChtb2RlID09IFJUQUNfQ1ZTKQorCQlyZXR1cm4gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbigKKwkJCWdldF92b2ljZV9zZXNzaW9uX2lkX2N2cyhoYW5kbGUpKTsKKworCXByX2VycigiJXM6IEludmFsaWQgbW9kZSAlZCwgcmV0dXJuaW5nIDBcbiIsCisJICAgICAgIF9fZnVuY19fLCBtb2RlKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBBRE0gQVBSICovCit2b2lkIHJ0YWNfc2V0X2FkbV9oYW5kbGUodm9pZCAqaGFuZGxlKQoreworCXByX2RlYnVnKCIlczogaGFuZGxlID0gJXBLXG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKKworCW11dGV4X2xvY2soJnJ0YWNfYWRtX2Fwcl9tdXRleCk7CisJcnRhY19hZG1fYXByX2RhdGEuYXByX2hhbmRsZSA9IGhhbmRsZTsKKwltdXRleF91bmxvY2soJnJ0YWNfYWRtX2Fwcl9tdXRleCk7Cit9CisKK2Jvb2wgcnRhY19tYWtlX2FkbV9jYWxsYmFjayh1aW50MzJfdCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSkKK3sKKwlwcl9kZWJ1ZygiJXM6Y21kX3N0YXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkJYXRvbWljX3JlYWQoJnJ0YWNfYWRtX2Fwcl9kYXRhLmNtZF9zdGF0ZSkpOworCWlmIChhdG9taWNfcmVhZCgmcnRhY19hZG1fYXByX2RhdGEuY21kX3N0YXRlKSAhPSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAocGF5bG9hZF9zaXplID09IHNpemVvZih1aW50MzJfdCkpCisJCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFswXSk7CisJZWxzZSBpZiAocGF5bG9hZF9zaXplID09ICgyKnNpemVvZih1aW50MzJfdCkpKQorCQlhdG9taWNfc2V0KCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUsIHBheWxvYWRbMV0pOworCisJYXRvbWljX3NldCgmcnRhY19hZG1fYXByX2RhdGEuY21kX3N0YXRlLCAwKTsKKwl3YWtlX3VwKCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfd2FpdCk7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBzZW5kX2FkbV9hcHIodm9pZCAqYnVmLCB1MzIgb3Bjb2RlKQoreworCXMzMglyZXN1bHQ7CisJdTMyCXVzZXJfYnVmX3NpemUgPSAwOworCXUzMglieXRlc19yZXR1cm5lZCA9IDA7CisJdTMyCWNvcHBfaWQ7CisJdTMyCXBheWxvYWRfc2l6ZTsKKwl1MzIJZGF0YV9zaXplID0gMDsKKwlpbnQJY29wcF9pZHg7CisJaW50CXBvcnRfaWR4OworCXN0cnVjdCBhcHJfaGRyCWFkbV9wYXJhbXM7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChydGFjX2NhbFtBRE1fUlRBQ19DQUxdLm1hcF9kYXRhLmlvbl9oYW5kbGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBydGFjX2FsbG9jYXRlX2NhbF9idWZmZXIoQURNX1JUQUNfQ0FMKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXByX2VycigiJXM6IGFsbG9jYXRlIGJ1ZmZlciBmYWlsZWQhIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAocnRhY19jYWxbQURNX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfaGFuZGxlID09IDApIHsKKwkJcmVzdWx0ID0gcnRhY19tYXBfY2FsX2J1ZmZlcihBRE1fUlRBQ19DQUwpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJcHJfZXJyKCIlczogbWFwIGJ1ZmZlciBmYWlsZWQhIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfYnVmX3NpemUsICh2b2lkICopYnVmLAorCQkJCQkJc2l6ZW9mKHVzZXJfYnVmX3NpemUpKSkgeworCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWQhIGJ1ZiA9IDB4JXBLXG4iLAorCQkgICAgICAgX19mdW5jX18sIGJ1Zik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHVzZXJfYnVmX3NpemUgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1ZmZlciBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgdXNlcl9idWZfc2l6ZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBheWxvYWRfc2l6ZSwgYnVmICsgc2l6ZW9mKHUzMiksIHNpemVvZih1MzIpKSkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIHNpemUgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmY29wcF9pZCwgYnVmICsgMiAqIHNpemVvZih1MzIpLCBzaXplb2YodTMyKSkpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcG9ydCBpZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGFkbV9nZXRfaW5kZXhlc19mcm9tX2NvcHBfaWQoY29wcF9pZCwgJmNvcHBfaWR4LCAmcG9ydF9pZHgpICE9IDApIHsKKwkJcHJfZXJyKCIlczogQ29wcCBJZC0lZCBpcyBub3QgYWN0aXZlXG4iLCBfX2Z1bmNfXywgY29wcF9pZCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdXRleF9sb2NrKCZydGFjX2FkbV9hcHJfbXV0ZXgpOworCWlmIChydGFjX2FkbV9hcHJfZGF0YS5hcHJfaGFuZGxlID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAob3Bjb2RlID09IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNSkgeworCQkvKiBzZXQgcGF5bG9hZCBzaXplIHRvIGluLWJhbmQgcGF5bG9hZCAqLworCQkvKiBzZXQgZGF0YSBzaXplIHRvIGFjdHVhbCBvdXQgb2YgYmFuZCBwYXlsb2FkIHNpemUgKi8KKwkJZGF0YV9zaXplID0gcGF5bG9hZF9zaXplIC0gNCAqIHNpemVvZih1MzIpOworCQlpZiAoZGF0YV9zaXplID4gcnRhY19jYWxbQURNX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfc2l6ZSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBkYXRhIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGF0YV9zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlwYXlsb2FkX3NpemUgPSA0ICogc2l6ZW9mKHUzMik7CisKKwkJLyogQ29weSBidWZmZXIgdG8gb3V0LW9mLWJhbmQgcGF5bG9hZCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikKKwkJCQlydGFjX2NhbFtBRE1fUlRBQ19DQUxdLmNhbF9kYXRhLmt2YWRkciwKKwkJCQlidWYgKyA3ICogc2l6ZW9mKHUzMiksIGRhdGFfc2l6ZSkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogc2V0IHBheWxvYWQgc2l6ZSBpbiBwYWNrZXQgKi8KKwkJcnRhY19hZG1fYnVmZmVyWzhdID0gZGF0YV9zaXplOworCX0gZWxzZSB7CisJCWlmIChwYXlsb2FkX3NpemUgPiBNQVhfUEFZTE9BRF9TSVpFKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogQ29weSBidWZmZXIgdG8gaW4tYmFuZCBwYXlsb2FkICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihydGFjX2FkbV9idWZmZXIgKworCQkJCXNpemVvZihhZG1fcGFyYW1zKS9zaXplb2YodTMyKSwKKwkJCQlidWYgKyAzICogc2l6ZW9mKHUzMiksIHBheWxvYWRfc2l6ZSkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKiBQYWNrIGhlYWRlciAqLworCWFkbV9wYXJhbXMuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKKwkJQVBSX0hEUl9MRU4oMjApLCBBUFJfUEtUX1ZFUik7CisJYWRtX3BhcmFtcy5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCisJCXBheWxvYWRfc2l6ZSk7CisJYWRtX3BhcmFtcy5zcmNfc3ZjID0gQVBSX1NWQ19BRE07CisJYWRtX3BhcmFtcy5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOworCWFkbV9wYXJhbXMuc3JjX3BvcnQgPSBjb3BwX2lkOworCWFkbV9wYXJhbXMuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKKwlhZG1fcGFyYW1zLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFkbV9wYXJhbXMuZGVzdF9wb3J0ID0gY29wcF9pZDsKKwlhZG1fcGFyYW1zLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKKwlhZG1fcGFyYW1zLm9wY29kZSA9IG9wY29kZTsKKworCS8qIGZpbGwgZm9yIG91dC1vZi1iYW5kICovCisJcnRhY19hZG1fYnVmZmVyWzVdID0KKwkJbG93ZXJfMzJfYml0cyhydGFjX2NhbFtBRE1fUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKwlydGFjX2FkbV9idWZmZXJbNl0gPQorCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKKwkJCQlydGFjX2NhbFtBRE1fUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKwlydGFjX2FkbV9idWZmZXJbN10gPSBydGFjX2NhbFtBRE1fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGU7CisKKwltZW1jcHkocnRhY19hZG1fYnVmZmVyLCAmYWRtX3BhcmFtcywgc2l6ZW9mKGFkbV9wYXJhbXMpKTsKKwlhdG9taWNfc2V0KCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfc3RhdGUsIDEpOworCisJcHJfZGVidWcoIiVzOiBTZW5kaW5nIFJUQUMgY29tbWFuZCBpb2N0bCAweCV4LCBwYWRkciAweCVwS1xuIiwKKwkJX19mdW5jX18sIG9wY29kZSwKKwkJJnJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOworCisJcmVzdWx0ID0gYXByX3NlbmRfcGt0KHJ0YWNfYWRtX2Fwcl9kYXRhLmFwcl9oYW5kbGUsCisJCQkJCSh1aW50MzJfdCAqKXJ0YWNfYWRtX2J1ZmZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgY29wcCA9ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZCk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocnRhY19hZG1fYXByX2RhdGEuY21kX3dhaXQsCisJCShhdG9taWNfcmVhZCgmcnRhY19hZG1fYXByX2RhdGEuY21kX3N0YXRlKSA9PSAwKSwKKwkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyB0aW1lZCBvdXQgY29wcCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCWNvcHBfaWQpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKSB7CisJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvciBjb2RlID0gWyVzXSwgb3Bjb2RlID0gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cihhdG9taWNfcmVhZCgKKwkJCSZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKSwKKwkJCW9wY29kZSk7CisJCXJlc3VsdCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCisJCQkJCWF0b21pY19yZWFkKAorCQkJCQkmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChvcGNvZGUgPT0gQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1KSB7CisJCWJ5dGVzX3JldHVybmVkID0gKCh1MzIgKilydGFjX2NhbFtBRE1fUlRBQ19DQUxdLmNhbF9kYXRhLgorCQkJa3ZhZGRyKVsyXSArIDMgKiBzaXplb2YodTMyKTsKKworCQlpZiAoYnl0ZXNfcmV0dXJuZWQgPiB1c2VyX2J1Zl9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiBVc2VyIGJ1ZiBub3QgYmlnIGVub3VnaCwgc2l6ZSA9IDB4JXgsIHJldHVybmVkIHNpemUgPSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCB1c2VyX2J1Zl9zaXplLCBieXRlc19yZXR1cm5lZCk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKHZvaWQgKikKKwkJCQlydGFjX2NhbFtBRE1fUlRBQ19DQUxdLmNhbF9kYXRhLmt2YWRkciwKKwkJCQlieXRlc19yZXR1cm5lZCkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IGJ1ZmZlciB0byB1c2VyLHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYnl0ZXNfcmV0dXJuZWQpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJYnl0ZXNfcmV0dXJuZWQgPSBkYXRhX3NpemU7CisJfQorCW11dGV4X3VubG9jaygmcnRhY19hZG1fYXByX211dGV4KTsKK2RvbmU6CisJcmV0dXJuIGJ5dGVzX3JldHVybmVkOworZXJyOgorCW11dGV4X3VubG9jaygmcnRhY19hZG1fYXByX211dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEFTTSBBUFIgKi8KK3ZvaWQgcnRhY19zZXRfYXNtX2hhbmRsZSh1MzIgc2Vzc2lvbl9pZCwgdm9pZCAqaGFuZGxlKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmcnRhY19hc21fYXByX211dGV4KTsKKwlydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5hcHJfaGFuZGxlID0gaGFuZGxlOworCW11dGV4X3VubG9jaygmcnRhY19hc21fYXByX211dGV4KTsKK30KKworYm9vbCBydGFjX21ha2VfYXNtX2NhbGxiYWNrKHUzMiBzZXNzaW9uX2lkLCB1aW50MzJfdCAqcGF5bG9hZCwKKwl1MzIgcGF5bG9hZF9zaXplKQoreworCWlmIChhdG9taWNfcmVhZCgmcnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uY21kX3N0YXRlKSAhPSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAocGF5bG9hZF9zaXplID09IHNpemVvZih1aW50MzJfdCkpCisJCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFswXSk7CisJZWxzZSBpZiAocGF5bG9hZF9zaXplID09ICgyKnNpemVvZih1aW50MzJfdCkpKQorCQlhdG9taWNfc2V0KCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUsIHBheWxvYWRbMV0pOworCisJYXRvbWljX3NldCgmcnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uY21kX3N0YXRlLCAwKTsKKwl3YWtlX3VwKCZydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfd2FpdCk7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBzZW5kX3J0YWNfYXNtX2Fwcih2b2lkICpidWYsIHUzMiBvcGNvZGUpCit7CisJczMyIHJlc3VsdDsKKwl1MzIgdXNlcl9idWZfc2l6ZSA9IDA7CisJdTMyIGJ5dGVzX3JldHVybmVkID0gMDsKKwl1MzIgc2Vzc2lvbl9pZCA9IDA7CisJdTMyIHBheWxvYWRfc2l6ZTsKKwl1MzIgZGF0YV9zaXplID0gMDsKKwlzdHJ1Y3QgYXByX2hkciBhc21fcGFyYW1zOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAocnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5tYXBfZGF0YS5pb25faGFuZGxlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gcnRhY19hbGxvY2F0ZV9jYWxfYnVmZmVyKEFTTV9SVEFDX0NBTCk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBhbGxvY2F0ZSBidWZmZXIgZmFpbGVkISIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKHJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZSA9PSAwKSB7CisJCXJlc3VsdCA9IHJ0YWNfbWFwX2NhbF9idWZmZXIoQVNNX1JUQUNfQ0FMKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXByX2VycigiJXM6IG1hcCBidWZmZXIgZmFpbGVkISIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2J1Zl9zaXplLCAodm9pZCAqKWJ1ZiwKKwkJCQkJCXNpemVvZih1c2VyX2J1Zl9zaXplKSkpIHsKKwkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkISBidWYgPSAweCVwS1xuIiwKKwkJICAgICAgIF9fZnVuY19fLCBidWYpOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh1c2VyX2J1Zl9zaXplIDw9IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBidWZmZXIgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHVzZXJfYnVmX3NpemUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXlsb2FkX3NpemUsIGJ1ZiArIHNpemVvZih1MzIpLCBzaXplb2YodTMyKSkpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBzaXplIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNlc3Npb25faWQsIGJ1ZiArIDIgKiBzaXplb2YodTMyKSwgc2l6ZW9mKHUzMikpKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHNlc3Npb24gaWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoc2Vzc2lvbl9pZCA+PSAoQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQgKyAxKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIFNlc3Npb24gPSAlZFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOworCQlnb3RvIGRvbmU7CisJfQorCisJbXV0ZXhfbG9jaygmcnRhY19hc21fYXByX211dGV4KTsKKwlpZiAocnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uYXByX2hhbmRsZSA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IEFQUiBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKG9wY29kZSA9PSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyKSB7CisJCS8qIHNldCBwYXlsb2FkIHNpemUgdG8gaW4tYmFuZCBwYXlsb2FkICovCisJCS8qIHNldCBkYXRhIHNpemUgdG8gYWN0dWFsIG91dCBvZiBiYW5kIHBheWxvYWQgc2l6ZSAqLworCQlkYXRhX3NpemUgPSBwYXlsb2FkX3NpemUgLSA0ICogc2l6ZW9mKHUzMik7CisJCWlmIChkYXRhX3NpemUgPiBydGFjX2NhbFtBU01fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRhdGEgc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBkYXRhX3NpemUpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCXBheWxvYWRfc2l6ZSA9IDQgKiBzaXplb2YodTMyKTsKKworCQkvKiBDb3B5IGJ1ZmZlciB0byBvdXQtb2YtYmFuZCBwYXlsb2FkICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKQorCQkJCXJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAorCQkJCWJ1ZiArIDcgKiBzaXplb2YodTMyKSwgZGF0YV9zaXplKSkgeworCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBzZXQgcGF5bG9hZCBzaXplIGluIHBhY2tldCAqLworCQlydGFjX2FzbV9idWZmZXJbOF0gPSBkYXRhX3NpemU7CisKKwl9IGVsc2UgeworCQlpZiAocGF5bG9hZF9zaXplID4gTUFYX1BBWUxPQURfU0laRSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGF5bG9hZF9zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIENvcHkgYnVmZmVyIHRvIGluLWJhbmQgcGF5bG9hZCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIocnRhY19hc21fYnVmZmVyICsKKwkJCQlzaXplb2YoYXNtX3BhcmFtcykvc2l6ZW9mKHUzMiksCisJCQkJYnVmICsgMyAqIHNpemVvZih1MzIpLCBwYXlsb2FkX3NpemUpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogUGFjayBoZWFkZXIgKi8KKwlhc21fcGFyYW1zLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCUFQUl9IRFJfTEVOKDIwKSwgQVBSX1BLVF9WRVIpOworCWFzbV9wYXJhbXMucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQlwYXlsb2FkX3NpemUpOworCWFzbV9wYXJhbXMuc3JjX3N2YyA9IHE2YXNtX2dldF9hcHJfc2VydmljZV9pZChzZXNzaW9uX2lkKTsKKwlhc21fcGFyYW1zLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7CisJYXNtX3BhcmFtcy5zcmNfcG9ydCA9IChzZXNzaW9uX2lkIDw8IDgpIHwgMHgwMDAxOworCWFzbV9wYXJhbXMuZGVzdF9zdmMgPSBBUFJfU1ZDX0FTTTsKKwlhc21fcGFyYW1zLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOworCWFzbV9wYXJhbXMuZGVzdF9wb3J0ID0gKHNlc3Npb25faWQgPDwgOCkgfCAweDAwMDE7CisJYXNtX3BhcmFtcy50b2tlbiA9IHNlc3Npb25faWQ7CisJYXNtX3BhcmFtcy5vcGNvZGUgPSBvcGNvZGU7CisKKwkvKiBmaWxsIGZvciBvdXQtb2YtYmFuZCAqLworCXJ0YWNfYXNtX2J1ZmZlcls1XSA9CisJCWxvd2VyXzMyX2JpdHMocnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7CisJcnRhY19hc21fYnVmZmVyWzZdID0KKwkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJcnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7CisJcnRhY19hc21fYnVmZmVyWzddID0gcnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfaGFuZGxlOworCisJbWVtY3B5KHJ0YWNfYXNtX2J1ZmZlciwgJmFzbV9wYXJhbXMsIHNpemVvZihhc21fcGFyYW1zKSk7CisJYXRvbWljX3NldCgmcnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uY21kX3N0YXRlLCAxKTsKKworCXByX2RlYnVnKCIlczogU2VuZGluZyBSVEFDIGNvbW1hbmQgaW9jdGwgMHgleCwgcGFkZHIgMHglcEtcbiIsCisJCV9fZnVuY19fLCBvcGNvZGUsCisJCSZydGFjX2NhbFtBU01fUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKworCXJlc3VsdCA9IGFwcl9zZW5kX3BrdChydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5hcHJfaGFuZGxlLAorCQkJCSh1aW50MzJfdCAqKXJ0YWNfYXNtX2J1ZmZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgc2Vzc2lvbiA9ICVkXG4iLAorCQkJX19mdW5jX18sIHNlc3Npb25faWQpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uY21kX3dhaXQsCisJCShhdG9taWNfcmVhZCgmcnRhY19hc21fYXByX2RhdGFbc2Vzc2lvbl9pZF0uY21kX3N0YXRlKSA9PSAwKSwKKwkJNSAqIEhaKTsKKwlpZiAoIXJlc3VsdCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBzZXNzaW9uID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yIGNvZGUgPSBbJXNdLCBvcGNvZGUgPSAweCV4XG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAorCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpLAorCQkJb3Bjb2RlKTsKKwkJcmVzdWx0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJYXRvbWljX3JlYWQoCisJCQkJCSZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKG9wY29kZSA9PSBBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TX1YyKSB7CisJCWJ5dGVzX3JldHVybmVkID0gKCh1MzIgKilydGFjX2NhbFtBU01fUlRBQ19DQUxdLmNhbF9kYXRhLgorCQkJa3ZhZGRyKVsyXSArIDMgKiBzaXplb2YodTMyKTsKKworCQlpZiAoYnl0ZXNfcmV0dXJuZWQgPiB1c2VyX2J1Zl9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiBVc2VyIGJ1ZiBub3QgYmlnIGVub3VnaCwgc2l6ZSA9IDB4JXgsIHJldHVybmVkIHNpemUgPSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCB1c2VyX2J1Zl9zaXplLCBieXRlc19yZXR1cm5lZCk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKHZvaWQgKikKKwkJCQlydGFjX2NhbFtBU01fUlRBQ19DQUxdLmNhbF9kYXRhLmt2YWRkciwKKwkJCQlieXRlc19yZXR1cm5lZCkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IGJ1ZmZlciB0byB1c2VyLHNpemUgPSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGJ5dGVzX3JldHVybmVkKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWJ5dGVzX3JldHVybmVkID0gZGF0YV9zaXplOworCX0KKwltdXRleF91bmxvY2soJnJ0YWNfYXNtX2Fwcl9tdXRleCk7Citkb25lOgorCXJldHVybiBieXRlc19yZXR1cm5lZDsKK2VycjoKKwltdXRleF91bmxvY2soJnJ0YWNfYXNtX2Fwcl9tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogQUZFIEFQUiAqLwordm9pZCBydGFjX3NldF9hZmVfaGFuZGxlKHZvaWQgKmhhbmRsZSkKK3sKKwltdXRleF9sb2NrKCZydGFjX2FmZV9hcHJfbXV0ZXgpOworCXJ0YWNfYWZlX2Fwcl9kYXRhLmFwcl9oYW5kbGUgPSBoYW5kbGU7CisJbXV0ZXhfdW5sb2NrKCZydGFjX2FmZV9hcHJfbXV0ZXgpOworfQorCitib29sIHJ0YWNfbWFrZV9hZmVfY2FsbGJhY2sodWludDMyX3QgKnBheWxvYWQsIHVpbnQzMl90IHBheWxvYWRfc2l6ZSkKK3sKKwlwcl9kZWJ1ZygiJXM6Y21kX3N0YXRlID0gJWRcbiIsIF9fZnVuY19fLAorCQkJYXRvbWljX3JlYWQoJnJ0YWNfYWZlX2Fwcl9kYXRhLmNtZF9zdGF0ZSkpOworCWlmIChhdG9taWNfcmVhZCgmcnRhY19hZmVfYXByX2RhdGEuY21kX3N0YXRlKSAhPSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAocGF5bG9hZF9zaXplID09IHNpemVvZih1aW50MzJfdCkpCisJCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFswXSk7CisJZWxzZSBpZiAocGF5bG9hZF9zaXplID09ICgyKnNpemVvZih1aW50MzJfdCkpKQorCQlhdG9taWNfc2V0KCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUsIHBheWxvYWRbMV0pOworCisJYXRvbWljX3NldCgmcnRhY19hZmVfYXByX2RhdGEuY21kX3N0YXRlLCAwKTsKKwl3YWtlX3VwKCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfd2FpdCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9hZmVfYXByX2hkcihzdHJ1Y3QgYXByX2hkciAqYXByX2hkciwgdWludDMyX3QgcG9ydCwKKwkJCSB1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IGFwcl9tc2dfc2l6ZSkKK3sKKwlpZiAoYXByX2hkciA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgQVBSIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFwcl9oZHItPmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCisJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKKwlhcHJfaGRyLT5wa3Rfc2l6ZSA9IGFwcl9tc2dfc2l6ZTsKKwlhcHJfaGRyLT5zcmNfc3ZjID0gQVBSX1NWQ19BRkU7CisJYXByX2hkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwlhcHJfaGRyLT5zcmNfcG9ydCA9IDA7CisJYXByX2hkci0+ZGVzdF9zdmMgPSBBUFJfU1ZDX0FGRTsKKwlhcHJfaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKKwlhcHJfaGRyLT5kZXN0X3BvcnQgPSAwOworCWFwcl9oZHItPnRva2VuID0gcG9ydDsKKwlhcHJfaGRyLT5vcGNvZGUgPSBvcGNvZGU7CisKKwlyZXR1cm4gMDsKKworfQorc3RhdGljIGludCBzZW5kX3J0YWNfYWZlX2Fwcih2b2lkICpidWYsIHVpbnQzMl90IG9wY29kZSkKK3sKKwlpbnQzMl90IHJlc3VsdDsKKwl1aW50MzJfdCBieXRlc19yZXR1cm5lZCA9IDA7CisJdWludDMyX3QgcG9ydF9pbmRleCA9IDA7CisJdWludDMyX3QgYXByX21zZ19zaXplID0gMDsKKwlzdHJ1Y3QgcnRhY19hZmVfdXNlcl9kYXRhIHVzZXJfYWZlX2J1ZjsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0ubWFwX2RhdGEuaW9uX2hhbmRsZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IHJ0YWNfYWxsb2NhdGVfY2FsX2J1ZmZlcihBRkVfUlRBQ19DQUwpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJcHJfZXJyKCIlczogYWxsb2NhdGUgYnVmZmVyIGZhaWxlZCEgcmV0ID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHJlc3VsdCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAocnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfaGFuZGxlID09IDApIHsKKwkJcmVzdWx0ID0gcnRhY19tYXBfY2FsX2J1ZmZlcihBRkVfUlRBQ19DQUwpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJcHJfZXJyKCIlczogbWFwIGJ1ZmZlciBmYWlsZWQhIHJldCA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXN1bHQpOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2FmZV9idWYsICh2b2lkICopYnVmLAorCQlzaXplb2Yoc3RydWN0IHJ0YWNfYWZlX3VzZXJfZGF0YSkpKSB7CisJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZCEgYnVmID0gMHglcEtcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYnVmKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICh1c2VyX2FmZV9idWYuYnVmX3NpemUgPD0gMCkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1ZmZlciBzaXplID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgdXNlcl9hZmVfYnVmLmJ1Zl9zaXplKTsKKwkJZ290byBkb25lOworCX0KKworCXBvcnRfaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHVzZXJfYWZlX2J1Zi5wb3J0X2lkKTsKKwlpZiAocG9ydF9pbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgQUZFIHBvcnQgPSAweCV4XG4iLAorCQkgICAgICAgX19mdW5jX18sIHVzZXJfYWZlX2J1Zi5wb3J0X2lkKTsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJnJ0YWNfYWZlX2Fwcl9tdXRleCk7CisJaWYgKHJ0YWNfYWZlX2Fwcl9kYXRhLmFwcl9oYW5kbGUgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzOiBBUFIgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlpZiAob3Bjb2RlID09IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIpIHsKKwkJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgKmFmZV9zZXRfYXByX21zZzsKKworCQkvKiBzZXQgZGF0YSBzaXplIHRvIGFjdHVhbCBvdXQgb2YgYmFuZCBwYXlsb2FkIHNpemUgKi8KKwkJaWYgKHVzZXJfYWZlX2J1Zi5ydGFjX2FmZV9zZXQuY21kLnBheWxvYWRfc2l6ZSA+CisJCQlydGFjX2NhbFtBRkVfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRhdGEgc2l6ZSA9ICVkXG4iLAorCQkJCSAgIF9fZnVuY19fLAorCQkJCSAgIHVzZXJfYWZlX2J1Zi5ydGFjX2FmZV9zZXQuY21kLnBheWxvYWRfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBDb3B5IGJ1ZmZlciB0byBvdXQtb2YtYmFuZCBwYXlsb2FkICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKQorCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAorCQkJCWJ1ZitvZmZzZXRvZihzdHJ1Y3QgcnRhY19hZmVfdXNlcl9kYXRhLAorCQkJCXJ0YWNfYWZlX3NldC5kYXRhKSwKKwkJCQl1c2VyX2FmZV9idWYucnRhY19hZmVfc2V0LmNtZC5wYXlsb2FkX3NpemUpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogQ29weSBBRkUgQVBSIE1lc3NhZ2UgKi8KKwkJYWZlX3NldF9hcHJfbXNnID0gKHN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyICopCisJCQkJKCh1OCAqKXJ0YWNfYWZlX2J1ZmZlciArCisJCQkJc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKQorCQkJCWFmZV9zZXRfYXByX21zZywKKwkJCQlidWYgKyBvZmZzZXRvZihzdHJ1Y3QgcnRhY19hZmVfdXNlcl9kYXRhLAorCQkJCXJ0YWNfYWZlX3NldC5jbWQpLAorCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJYWZlX3NldF9hcHJfbXNnLT5wYXlsb2FkX2FkZHJlc3NfbHN3ID0KKwkJCWxvd2VyXzMyX2JpdHMocnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7CisJCWFmZV9zZXRfYXByX21zZy0+cGF5bG9hZF9hZGRyZXNzX21zdyA9CisJCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOworCQlhZmVfc2V0X2Fwcl9tc2ctPm1lbV9tYXBfaGFuZGxlID0KKwkJCQlydGFjX2NhbFtBRkVfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGU7CisKKwkJYXByX21zZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyKTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyICphZmVfZ2V0X2Fwcl9tc2c7CisKKwkJaWYgKHVzZXJfYWZlX2J1Zi5jbWRfc2l6ZSA+IE1BWF9QQVlMT0FEX1NJWkUpIHsKKwkJCXByX2VycigiJXM6IEludmFsaWQgcGF5bG9hZCBzaXplID0gJWRcbiIsCisJCQkJX19mdW5jX18sIHVzZXJfYWZlX2J1Zi5jbWRfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBDb3B5IGJ1ZmZlciB0byBpbi1iYW5kIHBheWxvYWQgKi8KKwkJYWZlX2dldF9hcHJfbXNnID0gKHN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyICopCisJCQkJCSgodTggKikgcnRhY19hZmVfYnVmZmVyICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWFmZV9nZXRfYXByX21zZywKKwkJCQlidWYrb2Zmc2V0b2Yoc3RydWN0IHJ0YWNfYWZlX3VzZXJfZGF0YSwKKwkJCQlydGFjX2FmZV9nZXQuY21kKSwKKwkJCXNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfY21kX2dldF9wYXJhbV92MikpKSB7CisJCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQkJX19mdW5jX18pOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJYWZlX2dldF9hcHJfbXNnLT5wYXlsb2FkX2FkZHJlc3NfbHN3ID0KKwkJCWxvd2VyXzMyX2JpdHMocnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7CisJCWFmZV9nZXRfYXByX21zZy0+cGF5bG9hZF9hZGRyZXNzX21zdyA9CisJCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCisJCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOworCQlhZmVfZ2V0X2Fwcl9tc2ctPm1lbV9tYXBfaGFuZGxlID0KKwkJCQlydGFjX2NhbFtBRkVfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGU7CisJCWFmZV9nZXRfYXByX21zZy0+cGF5bG9hZF9zaXplIC09IHNpemVvZihzdHJ1Y3QgYXByX2hkcik7CisJCWFwcl9tc2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKworCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfY21kX2dldF9wYXJhbV92Mik7CisJfQorCisJZmlsbF9hZmVfYXByX2hkcigoc3RydWN0IGFwcl9oZHIgKikgcnRhY19hZmVfYnVmZmVyLAorCQkJcG9ydF9pbmRleCwgb3Bjb2RlLCBhcHJfbXNnX3NpemUpOworCisJYXRvbWljX3NldCgmcnRhY19hZmVfYXByX2RhdGEuY21kX3N0YXRlLCAxKTsKKworCXByX2RlYnVnKCIlczogU2VuZGluZyBSVEFDIGNvbW1hbmQgaW9jdGwgMHgleCwgcGFkZHIgMHglcEtcbiIsCisJCV9fZnVuY19fLCBvcGNvZGUsCisJCSZydGFjX2NhbFtBRkVfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKworCXJlc3VsdCA9IGFwcl9zZW5kX3BrdChydGFjX2FmZV9hcHJfZGF0YS5hcHJfaGFuZGxlLAorCQkJCQkodWludDMyX3QgKilydGFjX2FmZV9idWZmZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByX2VycigiJXM6IFNldCBwYXJhbXMgZmFpbGVkIHBvcnQgPSAweCV4LCByZXQgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCB1c2VyX2FmZV9idWYucG9ydF9pZCwgcmVzdWx0KTsKKwkJZ290byBlcnI7CisJfQorCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLworCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChydGFjX2FmZV9hcHJfZGF0YS5jbWRfd2FpdCwKKwkJKGF0b21pY19yZWFkKCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfc3RhdGUpID09IDApLAorCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKKwlpZiAoIXJlc3VsdCkgeworCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleCwgcmV0ID0gJWRcbiIsCisJCQlfX2Z1bmNfXywgdXNlcl9hZmVfYnVmLnBvcnRfaWQsIHJlc3VsdCk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpIHsKKwkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yIGNvZGUgPSBbJXNdLCBvcGNvZGUgPSAweCV4XG4iLAorCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAorCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpLAorCQkJb3Bjb2RlKTsKKwkJcmVzdWx0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKKwkJCQkJYXRvbWljX3JlYWQoCisJCQkJCSZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKG9wY29kZSA9PSBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyKSB7CisJCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICpnZXRfcmVzcDsKKworCQlnZXRfcmVzcCA9IChzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAqKQorCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyOworCisJCWJ5dGVzX3JldHVybmVkID0gZ2V0X3Jlc3AtPnBhcmFtX3NpemUgKworCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92Mik7CisKKwkJaWYgKGJ5dGVzX3JldHVybmVkID4gdXNlcl9hZmVfYnVmLmJ1Zl9zaXplKSB7CisJCQlwcl9lcnIoIiVzOiB1c2VyIHNpemUgPSAweCV4LCByZXR1cm5lZCBzaXplID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgdXNlcl9hZmVfYnVmLmJ1Zl9zaXplLAorCQkJCWJ5dGVzX3JldHVybmVkKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAodm9pZCAqKQorCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAorCQkJCWJ5dGVzX3JldHVybmVkKSkgeworCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgYnVmZmVyIHRvIHVzZXIsc2l6ZSA9ICVkXG4iLAorCQkJCV9fZnVuY19fLCBieXRlc19yZXR1cm5lZCk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlieXRlc19yZXR1cm5lZCA9IHVzZXJfYWZlX2J1Zi5ydGFjX2FmZV9zZXQuY21kLnBheWxvYWRfc2l6ZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZydGFjX2FmZV9hcHJfbXV0ZXgpOworZG9uZToKKwlyZXR1cm4gYnl0ZXNfcmV0dXJuZWQ7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZydGFjX2FmZV9hcHJfbXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFZvaWNlIEFQUiAqLwordm9pZCBydGFjX3NldF92b2ljZV9oYW5kbGUodTMyIG1vZGUsIHZvaWQgKmhhbmRsZSkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnJ0YWNfdm9pY2VfYXByX211dGV4KTsKKwlydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmFwcl9oYW5kbGUgPSBoYW5kbGU7CisJbXV0ZXhfdW5sb2NrKCZydGFjX3ZvaWNlX2Fwcl9tdXRleCk7Cit9CisKK2Jvb2wgcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKHUzMiBtb2RlLCB1aW50MzJfdCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSkKK3sKKwlpZiAoKGF0b21pY19yZWFkKCZydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF9zdGF0ZSkgIT0gMSkgfHwKKwkJKG1vZGUgPj0gUlRBQ19WT0lDRV9NT0RFUykpCisJCXJldHVybiBmYWxzZTsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCWlmIChwYXlsb2FkX3NpemUgPT0gc2l6ZW9mKHVpbnQzMl90KSkKKwkJYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCBwYXlsb2FkWzBdKTsKKwllbHNlIGlmIChwYXlsb2FkX3NpemUgPT0gKDIqc2l6ZW9mKHVpbnQzMl90KSkpCisJCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFsxXSk7CisKKwlhdG9taWNfc2V0KCZydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF9zdGF0ZSwgMCk7CisJd2FrZV91cCgmcnRhY192b2ljZV9hcHJfZGF0YVttb2RlXS5jbWRfd2FpdCk7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBzZW5kX3ZvaWNlX2Fwcih1MzIgbW9kZSwgdm9pZCAqYnVmLCB1MzIgb3Bjb2RlKQoreworCXMzMiByZXN1bHQ7CisJdTMyIHVzZXJfYnVmX3NpemUgPSAwOworCXUzMiBieXRlc19yZXR1cm5lZCA9IDA7CisJdTMyIHBheWxvYWRfc2l6ZTsKKwl1MzIgZGVzdF9wb3J0OworCXUzMiBkYXRhX3NpemUgPSAwOworCXN0cnVjdCBhcHJfaGRyIHZvaWNlX3BhcmFtczsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5tYXBfZGF0YS5pb25faGFuZGxlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gcnRhY19hbGxvY2F0ZV9jYWxfYnVmZmVyKFZPSUNFX1JUQUNfQ0FMKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXByX2VycigiJXM6IGFsbG9jYXRlIGJ1ZmZlciBmYWlsZWQhIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAocnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGUgPT0gMCkgeworCQlyZXN1bHQgPSBydGFjX21hcF9jYWxfYnVmZmVyKFZPSUNFX1JUQUNfQ0FMKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXByX2VycigiJXM6IG1hcCBidWZmZXIgZmFpbGVkISIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2J1Zl9zaXplLCAodm9pZCAqKWJ1ZiwKKwkJCQkJCXNpemVvZih1c2VyX2J1Zl9zaXplKSkpIHsKKwkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkISBidWYgPSAweCVwS1xuIiwKKwkJICAgICAgIF9fZnVuY19fLCBidWYpOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh1c2VyX2J1Zl9zaXplIDw9IDApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBidWZmZXIgc2l6ZSA9ICVkXG4iLAorCQkJX19mdW5jX18sIHVzZXJfYnVmX3NpemUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXlsb2FkX3NpemUsIGJ1ZiArIHNpemVvZih1MzIpLCBzaXplb2YodTMyKSkpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBzaXplIGZyb20gdXNlciBidWZmZXJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRlc3RfcG9ydCwgYnVmICsgMiAqIHNpemVvZih1MzIpLCBzaXplb2YodTMyKSkpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcG9ydCBpZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChtb2RlICE9IFJUQUNfQ1ZQKSAmJiAobW9kZSAhPSBSVEFDX0NWUykpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBNb2RlIGZvciBBUFIsIG1vZGUgPSAlZFxuIiwKKwkJCV9fZnVuY19fLCBtb2RlKTsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJnJ0YWNfdm9pY2VfYXByX211dGV4KTsKKwlpZiAocnRhY192b2ljZV9hcHJfZGF0YVttb2RlXS5hcHJfaGFuZGxlID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQVBSIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAob3Bjb2RlID09IFZPSUNFX0NNRF9TRVRfUEFSQU0pIHsKKwkJLyogc2V0IHBheWxvYWQgc2l6ZSB0byBpbi1iYW5kIHBheWxvYWQgKi8KKwkJLyogc2V0IGRhdGEgc2l6ZSB0byBhY3R1YWwgb3V0IG9mIGJhbmQgcGF5bG9hZCBzaXplICovCisJCWRhdGFfc2l6ZSA9IHBheWxvYWRfc2l6ZSAtIDQgKiBzaXplb2YodTMyKTsKKwkJaWYgKGRhdGFfc2l6ZSA+IHJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfc2l6ZSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBkYXRhIHNpemUgPSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgZGF0YV9zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlwYXlsb2FkX3NpemUgPSA0ICogc2l6ZW9mKHUzMik7CisKKwkJLyogQ29weSBidWZmZXIgdG8gb3V0LW9mLWJhbmQgcGF5bG9hZCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikKKwkJCQlydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAorCQkJCWJ1ZiArIDcgKiBzaXplb2YodTMyKSwgZGF0YV9zaXplKSkgeworCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiBzZXQgcGF5bG9hZCBzaXplIGluIHBhY2tldCAqLworCQlydGFjX3ZvaWNlX2J1ZmZlcls4XSA9IGRhdGFfc2l6ZTsKKwl9IGVsc2UgeworCQlpZiAocGF5bG9hZF9zaXplID4gTUFYX1BBWUxPQURfU0laRSkgeworCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHBheWxvYWRfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBDb3B5IGJ1ZmZlciB0byBpbi1iYW5kIHBheWxvYWQgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJ0YWNfdm9pY2VfYnVmZmVyICsKKwkJCQlzaXplb2Yodm9pY2VfcGFyYW1zKS9zaXplb2YodTMyKSwKKwkJCQlidWYgKyAzICogc2l6ZW9mKHUzMiksIHBheWxvYWRfc2l6ZSkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwkvKiBQYWNrIGhlYWRlciAqLworCXZvaWNlX3BhcmFtcy5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAorCQlBUFJfSERSX0xFTigyMCksIEFQUl9QS1RfVkVSKTsKKwl2b2ljZV9wYXJhbXMucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAorCQlwYXlsb2FkX3NpemUpOworCXZvaWNlX3BhcmFtcy5zcmNfc3ZjID0gMDsKKwl2b2ljZV9wYXJhbXMuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKKwl2b2ljZV9wYXJhbXMuc3JjX3BvcnQgPSBnZXRfdm9pY2VfaW5kZXgobW9kZSwgZGVzdF9wb3J0KTsKKwl2b2ljZV9wYXJhbXMuZGVzdF9zdmMgPSAwOworCXZvaWNlX3BhcmFtcy5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fTU9ERU07CisJdm9pY2VfcGFyYW1zLmRlc3RfcG9ydCA9ICh1MTYpZGVzdF9wb3J0OworCXZvaWNlX3BhcmFtcy50b2tlbiA9IDA7CisJdm9pY2VfcGFyYW1zLm9wY29kZSA9IG9wY29kZTsKKworCS8qIGZpbGwgZm9yIG91dC1vZi1iYW5kICovCisJcnRhY192b2ljZV9idWZmZXJbNV0gPSBydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZTsKKwlydGFjX3ZvaWNlX2J1ZmZlcls2XSA9CisJCWxvd2VyXzMyX2JpdHMocnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKwlydGFjX3ZvaWNlX2J1ZmZlcls3XSA9CisJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAorCQkJCXJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7CisKKwltZW1jcHkocnRhY192b2ljZV9idWZmZXIsICZ2b2ljZV9wYXJhbXMsIHNpemVvZih2b2ljZV9wYXJhbXMpKTsKKwlhdG9taWNfc2V0KCZydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF9zdGF0ZSwgMSk7CisKKwlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgUlRBQyBjb21tYW5kIGlvY3RsIDB4JXgsIHBhZGRyIDB4JXBLXG4iLAorCQlfX2Z1bmNfXywgb3Bjb2RlLAorCQkmcnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKKworCXJlc3VsdCA9IGFwcl9zZW5kX3BrdChydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmFwcl9oYW5kbGUsCisJCQkJCSh1aW50MzJfdCAqKXJ0YWNfdm9pY2VfYnVmZmVyKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcl9lcnIoIiVzOiBhcHJfc2VuZF9wa3QgZmFpbGVkIG9wY29kZSA9ICV4XG4iLAorCQkJX19mdW5jX18sIG9wY29kZSk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocnRhY192b2ljZV9hcHJfZGF0YVttb2RlXS5jbWRfd2FpdCwKKwkJKGF0b21pY19yZWFkKCZydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF9zdGF0ZSkgPT0gMCksCisJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOworCWlmICghcmVzdWx0KSB7CisJCXByX2VycigiJXM6IGFwcl9zZW5kX3BrdCB0aW1lZCBvdXQgb3Bjb2RlID0gJXhcbiIsCisJCQlfX2Z1bmNfXywgb3Bjb2RlKTsKKwkJZ290byBlcnI7CisJfQorCWlmIChhdG9taWNfcmVhZCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSkgeworCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3IgY29kZSA9IFslc10sIG9wY29kZSA9IDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoYXRvbWljX3JlYWQoCisJCQkmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSksCisJCQlvcGNvZGUpOworCQlyZXN1bHQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAorCQkJCQlhdG9taWNfcmVhZCgKKwkJCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAob3Bjb2RlID09IFZPSUNFX0NNRF9HRVRfUEFSQU0pIHsKKwkJYnl0ZXNfcmV0dXJuZWQgPSAoKHUzMiAqKXJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5jYWxfZGF0YS4KKwkJCWt2YWRkcilbMl0gKyAzICogc2l6ZW9mKHUzMik7CisKKwkJaWYgKGJ5dGVzX3JldHVybmVkID4gdXNlcl9idWZfc2l6ZSkgeworCQkJcHJfZXJyKCIlczogVXNlciBidWYgbm90IGJpZyBlbm91Z2gsIHNpemUgPSAweCV4LCByZXR1cm5lZCBzaXplID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgdXNlcl9idWZfc2l6ZSwgYnl0ZXNfcmV0dXJuZWQpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICh2b2lkICopCisJCQkJcnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLmNhbF9kYXRhLmt2YWRkciwKKwkJCQlieXRlc19yZXR1cm5lZCkpIHsKKwkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IGJ1ZmZlciB0byB1c2VyLCBzaXplID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBieXRlc19yZXR1cm5lZCk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlieXRlc19yZXR1cm5lZCA9IGRhdGFfc2l6ZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZydGFjX3ZvaWNlX2Fwcl9tdXRleCk7Citkb25lOgorCXJldHVybiBieXRlc19yZXR1cm5lZDsKK2VycjoKKwltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfYXByX211dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGdldF9ydGFjX2FkbV9kYXRhKHN0cnVjdCBydGFjX2FkbSAqYWRtX2RhdGEpCit7CisJbXV0ZXhfbG9jaygmcnRhY19hZG1fbXV0ZXgpOworCW1lbWNweShhZG1fZGF0YSwgJnJ0YWNfYWRtX2RhdGEsIHNpemVvZihzdHJ1Y3QgcnRhY19hZG0pKTsKKwltdXRleF91bmxvY2soJnJ0YWNfYWRtX211dGV4KTsKK30KKworCitzdGF0aWMgbG9uZyBydGFjX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZiwKKwkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKCFhcmcpIHsKKwkJcHJfZXJyKCIlczogTm8gZGF0YSBzZW50IHRvIGRyaXZlciFcbiIsIF9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19HRVRfUlRBQ19BRE1fSU5GTzogeworCQltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZydGFjX2FkbV9kYXRhLAorCQkJCQkJc2l6ZW9mKHJ0YWNfYWRtX2RhdGEpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZCBmb3IgQVVESU9fR0VUX1JUQUNfQURNX0lORk9cbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCW11dGV4X3VubG9jaygmcnRhY19hZG1fbXV0ZXgpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmVzdWx0ID0gc2l6ZW9mKHJ0YWNfYWRtX2RhdGEpOworCQltdXRleF91bmxvY2soJnJ0YWNfYWRtX211dGV4KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQVVESU9fR0VUX1JUQUNfVk9JQ0VfSU5GTzogeworCQltdXRleF9sb2NrKCZydGFjX3ZvaWNlX211dGV4KTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnJ0YWNfdm9pY2VfZGF0YSwKKwkJCQkJCXNpemVvZihydGFjX3ZvaWNlX2RhdGEpKSkgeworCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZCBmb3IgQVVESU9fR0VUX1JUQUNfVk9JQ0VfSU5GT1xuIiwKKwkJCQkJX19mdW5jX18pOworCQkJbXV0ZXhfdW5sb2NrKCZydGFjX3ZvaWNlX211dGV4KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJlc3VsdCA9IHNpemVvZihydGFjX3ZvaWNlX2RhdGEpOworCQltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfbXV0ZXgpOworCQlicmVhazsKKwl9CisKKwljYXNlIEFVRElPX0dFVF9SVEFDX0FETV9DQUw6CisJCXJlc3VsdCA9IHNlbmRfYWRtX2Fwcigodm9pZCAqKWFyZywgQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1KTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19TRVRfUlRBQ19BRE1fQ0FMOgorCQlyZXN1bHQgPSBzZW5kX2FkbV9hcHIoKHZvaWQgKilhcmcsIEFETV9DTURfU0VUX1BQX1BBUkFNU19WNSk7CisJCWJyZWFrOworCWNhc2UgQVVESU9fR0VUX1JUQUNfQVNNX0NBTDoKKwkJcmVzdWx0ID0gc2VuZF9ydGFjX2FzbV9hcHIoKHZvaWQgKilhcmcsCisJCQlBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TX1YyKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJT19TRVRfUlRBQ19BU01fQ0FMOgorCQlyZXN1bHQgPSBzZW5kX3J0YWNfYXNtX2Fwcigodm9pZCAqKWFyZywKKwkJCUFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjIpOworCQlicmVhazsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0NWU19DQUw6CisJCXJlc3VsdCA9IHNlbmRfdm9pY2VfYXByKFJUQUNfQ1ZTLCAodm9pZCAqKWFyZywKKwkJCVZPSUNFX0NNRF9HRVRfUEFSQU0pOworCQlicmVhazsKKwljYXNlIEFVRElPX1NFVF9SVEFDX0NWU19DQUw6CisJCXJlc3VsdCA9IHNlbmRfdm9pY2VfYXByKFJUQUNfQ1ZTLCAodm9pZCAqKWFyZywKKwkJCVZPSUNFX0NNRF9TRVRfUEFSQU0pOworCQlicmVhazsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0NWUF9DQUw6CisJCXJlc3VsdCA9IHNlbmRfdm9pY2VfYXByKFJUQUNfQ1ZQLCAodm9pZCAqKWFyZywKKwkJCVZPSUNFX0NNRF9HRVRfUEFSQU0pOworCQlicmVhazsKKwljYXNlIEFVRElPX1NFVF9SVEFDX0NWUF9DQUw6CisJCXJlc3VsdCA9IHNlbmRfdm9pY2VfYXByKFJUQUNfQ1ZQLCAodm9pZCAqKWFyZywKKwkJCVZPSUNFX0NNRF9TRVRfUEFSQU0pOworCQlicmVhazsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0FGRV9DQUw6CisJCXJlc3VsdCA9IHNlbmRfcnRhY19hZmVfYXByKCh2b2lkICopYXJnLAorCQkJQUZFX1BPUlRfQ01EX0dFVF9QQVJBTV9WMik7CisJCWJyZWFrOworCWNhc2UgQVVESU9fU0VUX1JUQUNfQUZFX0NBTDoKKwkJcmVzdWx0ID0gc2VuZF9ydGFjX2FmZV9hcHIoKHZvaWQgKilhcmcsCisJCQlBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogSW52YWxpZCBJT0NUTCwgY29tbWFuZCA9ICVkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjbWQpOworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KK2RvbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGxvbmcgcnRhY19pb2N0bChzdHJ1Y3QgZmlsZSAqZiwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIWFyZykgeworCQlwcl9lcnIoIiVzOiBObyBkYXRhIHNlbnQgdG8gZHJpdmVyIVxuIiwgX19mdW5jX18pOworCQlyZXN1bHQgPSAtRUZBVUxUOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IHJ0YWNfaW9jdGxfc2hhcmVkKGYsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2RlZmluZSBBVURJT19HRVRfUlRBQ19BRE1fSU5GT18zMiAgIF9JT1IoQ0FMX0lPQ1RMX01BR0lDLCAyMDcsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFVRElPX0dFVF9SVEFDX1ZPSUNFX0lORk9fMzIgX0lPUihDQUxfSU9DVExfTUFHSUMsIDIwOCwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQURNX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIwOSwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQURNX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxMCwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQVNNX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxMSwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQVNNX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxMiwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQ1ZTX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxMywgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQ1ZTX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxNCwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQ1ZQX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxNSwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQ1ZQX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxNiwgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQUZFX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxNywgY29tcGF0X3VwdHJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQUZFX0NBTF8zMiBfSU9XUihDQUxfSU9DVExfTUFHSUMsIDIxOCwgY29tcGF0X3VwdHJfdCkKKworc3RhdGljIGxvbmcgcnRhY19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKCFhcmcpIHsKKwkJcHJfZXJyKCIlczogTm8gZGF0YSBzZW50IHRvIGRyaXZlciFcbiIsIF9fZnVuY19fKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVURJT19HRVRfUlRBQ19BRE1fSU5GT18zMjoKKwkJY21kID0gQVVESU9fR0VUX1JUQUNfQURNX0lORk87CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX0dFVF9SVEFDX1ZPSUNFX0lORk9fMzI6CisJCWNtZCA9IEFVRElPX0dFVF9SVEFDX1ZPSUNFX0lORk87CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0FGRV9DQUxfMzI6CisJCWNtZCA9IEFVRElPX0dFVF9SVEFDX0FGRV9DQUw7CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX1NFVF9SVEFDX0FGRV9DQUxfMzI6CisJCWNtZCA9IEFVRElPX1NFVF9SVEFDX0FGRV9DQUw7CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0FETV9DQUxfMzI6CisJCWNtZCA9IEFVRElPX0dFVF9SVEFDX0FETV9DQUw7CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX1NFVF9SVEFDX0FETV9DQUxfMzI6CisJCWNtZCA9IEFVRElPX1NFVF9SVEFDX0FETV9DQUw7CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX0dFVF9SVEFDX0FTTV9DQUxfMzI6CisJCWNtZCA9IEFVRElPX0dFVF9SVEFDX0FTTV9DQUw7CisJCWdvdG8gcHJvY2VzczsKKwljYXNlIEFVRElPX1NFVF9SVEFDX0FTTV9DQUxfMzI6CisJCWNtZCA9ICBBVURJT19TRVRfUlRBQ19BU01fQ0FMOworCQlnb3RvIHByb2Nlc3M7CisJY2FzZSBBVURJT19HRVRfUlRBQ19DVlNfQ0FMXzMyOgorCQljbWQgPSBBVURJT19HRVRfUlRBQ19DVlNfQ0FMOworCQlnb3RvIHByb2Nlc3M7CisJY2FzZSBBVURJT19TRVRfUlRBQ19DVlNfQ0FMXzMyOgorCQljbWQgPSBBVURJT19TRVRfUlRBQ19DVlNfQ0FMOworCQlnb3RvIHByb2Nlc3M7CisJY2FzZSBBVURJT19HRVRfUlRBQ19DVlBfQ0FMXzMyOgorCQljbWQgPSAgQVVESU9fR0VUX1JUQUNfQ1ZQX0NBTDsKKwkJZ290byBwcm9jZXNzOworCWNhc2UgQVVESU9fU0VUX1JUQUNfQ1ZQX0NBTF8zMjoKKwkJY21kID0gQVVESU9fU0VUX1JUQUNfQ1ZQX0NBTDsKK3Byb2Nlc3M6CisJCXJlc3VsdCA9IHJ0YWNfaW9jdGxfc2hhcmVkKGYsIGNtZCwgY29tcGF0X3B0cihhcmcpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBJT0NUTCwgY29tbWFuZCA9ICVkIVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjbWQpOworCQlicmVhazsKKwl9Citkb25lOgorCXJldHVybiByZXN1bHQ7Cit9CisjZWxzZQorI2RlZmluZSBydGFjX2NvbXBhdF9pb2N0bCBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRhY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcnRhY19vcGVuLAorCS5yZWxlYXNlID0gcnRhY19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHJ0YWNfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IHJ0YWNfY29tcGF0X2lvY3RsLAorfTsKKworc3RydWN0IG1pc2NkZXZpY2UgcnRhY19taXNjID0geworCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQk9ICJtc21fcnRhYyIsCisJLmZvcHMJPSAmcnRhY19mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnRhY19pbml0KHZvaWQpCit7CisJaW50IGkgPSAwOworCisJLyogRHJpdmVyICovCisJYXRvbWljX3NldCgmcnRhY19jb21tb24udXNhZ2VfY291bnQsIDApOworCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgMCk7CisKKwkvKiBBRE0gKi8KKwltZW1zZXQoJnJ0YWNfYWRtX2RhdGEsIDAsIHNpemVvZihydGFjX2FkbV9kYXRhKSk7CisJcnRhY19hZG1fYXByX2RhdGEuYXByX2hhbmRsZSA9IE5VTEw7CisJYXRvbWljX3NldCgmcnRhY19hZG1fYXByX2RhdGEuY21kX3N0YXRlLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfd2FpdCk7CisJbXV0ZXhfaW5pdCgmcnRhY19hZG1fbXV0ZXgpOworCW11dGV4X2luaXQoJnJ0YWNfYWRtX2Fwcl9tdXRleCk7CisKKwlydGFjX2FkbV9idWZmZXIgPSBremFsbG9jKAorCQlydGFjX2NhbFtBRE1fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRhY19hZG1fYnVmZmVyID09IE5VTEwpCisJCWdvdG8gbm9tZW07CisKKwkvKiBBU00gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQrMTsgaSsrKSB7CisJCXJ0YWNfYXNtX2Fwcl9kYXRhW2ldLmFwcl9oYW5kbGUgPSBOVUxMOworCQlhdG9taWNfc2V0KCZydGFjX2FzbV9hcHJfZGF0YVtpXS5jbWRfc3RhdGUsIDApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGFjX2FzbV9hcHJfZGF0YVtpXS5jbWRfd2FpdCk7CisJfQorCW11dGV4X2luaXQoJnJ0YWNfYXNtX2Fwcl9tdXRleCk7CisKKwlydGFjX2FzbV9idWZmZXIgPSBremFsbG9jKAorCQlydGFjX2NhbFtBU01fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRhY19hc21fYnVmZmVyID09IE5VTEwpIHsKKwkJa3pmcmVlKHJ0YWNfYWRtX2J1ZmZlcik7CisJCWdvdG8gbm9tZW07CisJfQorCisJLyogQUZFICovCisJcnRhY19hZmVfYXByX2RhdGEuYXByX2hhbmRsZSA9IE5VTEw7CisJYXRvbWljX3NldCgmcnRhY19hZmVfYXByX2RhdGEuY21kX3N0YXRlLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfd2FpdCk7CisJbXV0ZXhfaW5pdCgmcnRhY19hZmVfYXByX211dGV4KTsKKworCXJ0YWNfYWZlX2J1ZmZlciA9IGt6YWxsb2MoCisJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChydGFjX2FmZV9idWZmZXIgPT0gTlVMTCkgeworCQlremZyZWUocnRhY19hZG1fYnVmZmVyKTsKKwkJa3pmcmVlKHJ0YWNfYXNtX2J1ZmZlcik7CisJCWdvdG8gbm9tZW07CisJfQorCisJLyogVm9pY2UgKi8KKwltZW1zZXQoJnJ0YWNfdm9pY2VfZGF0YSwgMCwgc2l6ZW9mKHJ0YWNfdm9pY2VfZGF0YSkpOworCWZvciAoaSA9IDA7IGkgPCBSVEFDX1ZPSUNFX01PREVTOyBpKyspIHsKKwkJcnRhY192b2ljZV9hcHJfZGF0YVtpXS5hcHJfaGFuZGxlID0gTlVMTDsKKwkJYXRvbWljX3NldCgmcnRhY192b2ljZV9hcHJfZGF0YVtpXS5jbWRfc3RhdGUsIDApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGFjX3ZvaWNlX2Fwcl9kYXRhW2ldLmNtZF93YWl0KTsKKwl9CisJbXV0ZXhfaW5pdCgmcnRhY192b2ljZV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcnRhY192b2ljZV9hcHJfbXV0ZXgpOworCisJcnRhY192b2ljZV9idWZmZXIgPSBremFsbG9jKAorCQlydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChydGFjX3ZvaWNlX2J1ZmZlciA9PSBOVUxMKSB7CisJCWt6ZnJlZShydGFjX2FkbV9idWZmZXIpOworCQlremZyZWUocnRhY19hc21fYnVmZmVyKTsKKwkJa3pmcmVlKHJ0YWNfYWZlX2J1ZmZlcik7CisJCWdvdG8gbm9tZW07CisJfQorCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnJ0YWNfbWlzYyk7Citub21lbToKKwlyZXR1cm4gLUVOT01FTTsKK30KKworbW9kdWxlX2luaXQocnRhY19pbml0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgUURTUDZ2MiBSZWFsLVRpbWUgQXVkaW8gQ2FsaWJyYXRpb24gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==